diff --git a/browser.js b/browser.js index 2408dcb..712fbb8 100644 --- a/browser.js +++ b/browser.js @@ -7,7 +7,28 @@ TODO more sophisticated reloading, pass in a package and a semver range... **/ -module.exports = function (stream, _version) { +module.exports = function (handler) { + return function (stream) { + var args = [].slice.call(arguments) + header(stream).writeHead() + stream.on('header', function (meta) { + + if(!version) + version = meta.version + if(meta.version !== version) { + stream.emit('reload', meta.version, version) + stream.end() + + return window.location.reload(true) + } + + handler.apply(this, args) + }) + } + +} + +var wrap = function (stream, _version) { version = _version || version stream = header(stream) stream.on('header', function (meta) { diff --git a/examples/client.js b/examples/client.js index b9d478f..0c8793d 100644 --- a/examples/client.js +++ b/examples/client.js @@ -11,16 +11,14 @@ function log(data) { } var r = -reconnect(function (stream) { - reloader(stream) - .on('reload', function () { - log('RELOAD') - }) +reconnect(reloader(function (stream) { + console.log('STREAM', stream) + setInterval(function () { stream.write('ping:'+Date.now()) }, 1000) stream.on('data', log) -}).connect('/shoe') +})).connect('/shoe') document.body.appendChild(r.widget()) diff --git a/examples/server.js b/examples/server.js index 8ea2ba2..cffb74d 100644 --- a/examples/server.js +++ b/examples/server.js @@ -9,13 +9,12 @@ var pingpong = require('ping-pong') var PORT = 3000 -shoe(function (stream) { +shoe(reloader(function (stream) { console.log('connection') //add a header, that will tell the client to restart... - reloader(stream) // stream.pipe(pingpong()).pipe(stream) stream.pipe(stream) -}).install( +})).install( http.createServer( ecstatic(join(__dirname, 'static')) ).listen(PORT, function () { diff --git a/examples/static/bundle.js b/examples/static/bundle.js index a94fb8d..eee066a 100644 --- a/examples/static/bundle.js +++ b/examples/static/bundle.js @@ -258,16 +258,16 @@ require.define("/examples/node_modules/reconnect/node_modules/h/index.js",Functi require.define("/package.json",Function(['require','module','exports','__dirname','__filename','process'],"module.exports = {\"browserify\":\"./browser.js\"}\n//@ sourceURL=/package.json" )); -require.define("/browser.js",Function(['require','module','exports','__dirname','__filename','process'],"\nvar header = require('header-stream')\n\nvar version\n/**\nTODO\nmore sophisticated reloading, \npass in a package and a semver range...\n**/\nmodule.exports = function (stream, _version) {\n version = _version || version\n stream = header(stream)\n stream.on('header', function (meta) {\n //is it same version as last time?\n if(!version)\n version = meta.version\n if(meta.version !== version) {\n stream.emit('reload', meta.version, version)\n if('function' == typeof stream) stream.destroy()\n\n window.location = window.location //MAGIC\n }\n })\n return stream\n}\n\n//@ sourceURL=/browser.js" +require.define("/browser.js",Function(['require','module','exports','__dirname','__filename','process'],"\nvar header = require('header-stream')\n\nvar version\n/**\nTODO\nmore sophisticated reloading, \npass in a package and a semver range...\n**/\nmodule.exports = function (handler) {\n return function (stream) {\n var args = [].slice.call(arguments)\n header(stream).writeHead()\n stream.on('header', function (meta) {\n\n if(!version)\n version = meta.version\n if(meta.version !== version) {\n stream.emit('reload', meta.version, version)\n stream.end()\n\n return window.location.reload(true)\n }\n\n handler.apply(this, args)\n })\n }\n\n}\n\nvar wrap = function (stream, _version) {\n version = _version || version\n stream = header(stream)\n stream.on('header', function (meta) {\n //is it same version as last time?\n if(!version)\n version = meta.version\n if(meta.version !== version) {\n stream.emit('reload', meta.version, version)\n stream.end()\n\n window.location.reload(true)\n }\n })\n return stream\n}\n\n//@ sourceURL=/browser.js" )); require.define("/node_modules/header-stream/package.json",Function(['require','module','exports','__dirname','__filename','process'],"module.exports = {}\n//@ sourceURL=/node_modules/header-stream/package.json" )); -require.define("/node_modules/header-stream/index.js",Function(['require','module','exports','__dirname','__filename','process'],"\n//the first line is header, in JSON format, with no whitespace.\n\nfunction merge (a, b) {\n for (var k in b)\n a[k] = a[k] || b[k]\n}\n\nmodule.exports = \nfunction header (stream) {\n\n var emit = stream.emit\n var write = stream.write\n var soFar = ''\n\n stream.emit = function (event, data) {\n if(event !== 'data')\n return emit.apply(stream, arguments)\n\n soFar += data\n var m\n if(!(m = /\\n/.exec(soFar))) return\n var meta = JSON.parse(soFar.substring(0, m.index))\n //+ 1 to get past the newline\n soFar = soFar.substring(m.index + 1)\n stream.emit = emit\n stream.meta = meta\n stream.emit('header', meta)\n //check that the stream is still readable,\n //it may have been ended during the 'header'\n //event.\n if('' !== soFar && stream.readable)\n stream.emit('data', soFar)\n }\n\n var meta = {}\n stream.setHeader = function (key, val) {\n if('string' === typeof key)\n meta[key] = val\n else\n merge(meta, key)\n return stream\n }\n\n stream.write = function (data) {\n stream.write = write\n stream.write(JSON.stringify(meta)+'\\n')\n return stream.write(data)\n }\n\n return stream\n}\n\n//@ sourceURL=/node_modules/header-stream/index.js" +require.define("/node_modules/header-stream/index.js",Function(['require','module','exports','__dirname','__filename','process'],"\n//the first line is header, in JSON format, with no whitespace.\n\nfunction merge (a, b) {\n for (var k in b)\n a[k] = a[k] || b[k]\n}\n\nmodule.exports = \nfunction header (stream) {\n\n var emit = stream.emit\n var write = stream.write\n var soFar = ''\n\n stream.emit = function (event, data) {\n if(event !== 'data')\n return emit.apply(stream, arguments)\n\n soFar += data\n var m\n if(!(m = /\\n/.exec(soFar))) return\n var meta = JSON.parse(soFar.substring(0, m.index))\n //+ 1 to get past the newline\n soFar = soFar.substring(m.index + 1)\n stream.emit = emit\n stream.meta = meta\n stream.emit('header', meta)\n //check that the stream is still readable,\n //it may have been ended during the 'header'\n //event.\n if('' !== soFar && stream.readable)\n stream.emit('data', soFar)\n }\n\n var meta = {}\n\n stream.setHeader = function (key, val) {\n if('string' === typeof key)\n meta[key] = val\n else\n merge(meta, key)\n return stream\n }\n\n stream.writeHead = function (_meta) {\n if(_meta) merge(meta, _meta)\n stream.write = write\n stream.write(JSON.stringify(meta)+'\\n') \n }\n\n stream.write = function (data) {\n stream.writeHead()\n return stream.write(data)\n }\n\n return stream\n}\n\n//@ sourceURL=/node_modules/header-stream/index.js" )); -require.define("/examples/client.js",Function(['require','module','exports','__dirname','__filename','process'],"\n\nvar reconnect = require('reconnect')\nvar reloader = require('../browser')\n\nfunction log(data) {\n console.log(data)\n var e = document.createElement('pre')\n e.innerText = data\n document.body.appendChild(e)\n}\n\nvar r = \nreconnect(function (stream) {\n reloader(stream)\n .on('reload', function () {\n log('RELOAD')\n })\n setInterval(function () {\n stream.write('ping:'+Date.now())\n }, 1000)\n\n stream.on('data', log)\n}).connect('/shoe')\n\ndocument.body.appendChild(r.widget())\n\n//@ sourceURL=/examples/client.js" +require.define("/examples/client.js",Function(['require','module','exports','__dirname','__filename','process'],"\n\nvar reconnect = require('reconnect')\nvar reloader = require('../browser')\n\nfunction log(data) {\n console.log(data)\n var e = document.createElement('pre')\n e.innerText = data\n document.body.appendChild(e)\n}\n\nvar r = \nreconnect(reloader(function (stream) {\n console.log('STREAM', stream)\n\n setInterval(function () {\n stream.write('ping:'+Date.now())\n }, 1000)\n\n stream.on('data', log)\n})).connect('/shoe')\n\ndocument.body.appendChild(r.widget())\n\n//@ sourceURL=/examples/client.js" )); require("/examples/client.js"); })(); diff --git a/index.js b/index.js index 0f2e5a6..5b4c0f0 100644 --- a/index.js +++ b/index.js @@ -3,10 +3,15 @@ var header = require('header-stream') //server side... var version = Date.now() -module.exports = function (stream, _version) { - version = _version || version - stream = header(stream) - stream.setHeader('version', version) - //maybe expand this to have more options, like setting a range... - return stream + + +module.exports = function (handler, _version) { + return function (stream) { + + version = _version || version + stream = header(stream) + stream.writeHead({version: version}) + //maybe expand this to have more options, like setting a range... + handler.apply(this, arguments) + } }