{"_id":"@11ways/socket.io-stream","_rev":"1-dbbeaa5418dc268515aa3148f02ecf7d","name":"@11ways/socket.io-stream","dist-tags":{"latest":"0.9.2"},"versions":{"0.9.2":{"name":"@11ways/socket.io-stream","version":"0.9.2","description":"stream for socket.io","author":{"name":"Naoyuki Kanezawa","email":"naoyuki.kanezawa@gmail.com"},"contributors":[{"name":"Naoyuki Kanezawa","email":"naoyuki.kanezawa@gmail.com"},{"name":"Aaron O'Mullan","email":"aaron.omullan@friendco.de"},{"name":"Jelle De Loecker","email":"jelle@elevenways.be"}],"keywords":["stream","socket.io","binary","file","upload","download"],"repository":{"type":"git","url":"git://github.com/11ways/socket.io-stream.git"},"scripts":{"prepublish":"make build","test":"make test"},"dependencies":{"component-bind":"~1.0.0","debug":"~4.3.2"},"devDependencies":{"blob":"0.0.4","browserify":"~13.1.0","expect.js":"~0.3.1","mocha":"~9.0.3","socket.io":"~4.1.3","socket.io-client":"~4.1.3","zuul":"~3.12.0","zuul-ngrok":"~4.0.0"},"gitHead":"3e8ae1caac6dfd97e0bca3dc9265c18420aad0f1","bugs":{"url":"https://github.com/11ways/socket.io-stream/issues"},"homepage":"https://github.com/11ways/socket.io-stream#readme","_id":"@11ways/socket.io-stream@0.9.2","_nodeVersion":"12.18.2","_npmVersion":"6.14.5","dist":{"integrity":"sha512-NaYVnxFlN2/DHTvFSVEqwbLlCGaizCqKO5rYOmDKfZgoeDcS4veK027dwZevGWLcDz9tZfLRgdvPXU95FnIh2Q==","shasum":"ff30adb50239312ac57ba9455f897b017ece1163","tarball":"https://registry.npmjs.org/@11ways/socket.io-stream/-/socket.io-stream-0.9.2.tgz","fileCount":13,"unpackedSize":245496,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhEjh4CRA9TVsSAnZWagAA3KUP+wfIWFxK1zzl5HkfQCIE\n1as9epZ+GrT2Ipi4wv8sBvi+5vNkjcCBHAYE3WSFkyqjr5pQFiDOv1YQwNVO\nOhaQ9DJ8x2B9NegOjy1xHi70Dxa4xMkGSJtMHwBbVLURD6GORCGGPWCfDBWO\nEd0FSaSR2W56rSmla5sLXKHbW3TXt680rmFnCekMvhv4Ir7tDVcvkGzu5+fD\naWceaBUVukmyHkjwS3gHS8W4PnwLu/MhmqcuGRq+XjHSnK5j5LMjJoc48N11\nKiW/3Kt8Hq40BtKUANeICtAJEkVwquc083Z5n1RyQen7yggUWVoQ9gceZ1TH\nlYpyYZ5z9I6fhiXp3GLb/YSigWZyVhF6um137c0V7+KyxeeyxCdg5PptncEH\nWDgZh1uzWNP0YL3LKHym19fRfopqld379nS5jahy75N2wyyA6M9K1VJWViOr\ntf5ZdzFy0q7tLTT+I5dU1XecrzhBfWyiNuYUWTTk0gEVU/IPB3DKroZI2K0t\nyuqMMMrKzbp+YBegNdqAeZ5NlYN/kETZwbbE8/CoQCAr/+4cQlW3HdOzhg7I\nccNAZqiFgsyyfIxirITkhYgznEkumaqWQTo/kXmliVzAfqOyi4cykM/VD+FF\nFgBg1+PKu9y0+BI/TYSoHmixvdtAoWYQjd46Q7+uPDvhwMRl9fBCc/mZmSDI\nWoEf\r\n=F0Nz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCwUkpft0gqpi/yjMplobeUdNZstny0VIeDJsRKX+f07QIhAJioG0XriUMFEgeTCS1R3+ccIW6SPhteK9JCcEeuVqpA"}]},"_npmUser":{"name":"skerit","email":"jelle@kipdola.be"},"directories":{},"maintainers":[{"name":"skerit","email":"jelle@kipdola.be"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/socket.io-stream_0.9.2_1628584056023_0.4130446985635483"},"_hasShrinkwrap":false}},"time":{"created":"2021-08-10T08:27:35.952Z","0.9.2":"2021-08-10T08:27:36.182Z","modified":"2022-04-04T10:30:53.541Z"},"maintainers":[{"name":"skerit","email":"jelle@kipdola.be"}],"description":"stream for socket.io","homepage":"https://github.com/11ways/socket.io-stream#readme","keywords":["stream","socket.io","binary","file","upload","download"],"repository":{"type":"git","url":"git://github.com/11ways/socket.io-stream.git"},"contributors":[{"name":"Naoyuki Kanezawa","email":"naoyuki.kanezawa@gmail.com"},{"name":"Aaron O'Mullan","email":"aaron.omullan@friendco.de"},{"name":"Jelle De Loecker","email":"jelle@elevenways.be"}],"author":{"name":"Naoyuki Kanezawa","email":"naoyuki.kanezawa@gmail.com"},"bugs":{"url":"https://github.com/11ways/socket.io-stream/issues"},"readme":"# Socket.IO stream\n\nThis is the module for bidirectional binary data transfer with Stream API through [Socket.IO](https://github.com/socketio/socket.io).\n\nThis is a fork of nkzawa/socket.io-stream, mainly just to upgrade the aging dependencies. WIP.\n\n## Installation\n\n    npm install @11ways/socket.io-stream\n\n## Usage\n\nIf you are not familiar with Stream API, be sure to check out [the docs](http://nodejs.org/api/stream.html).\nI also recommend checking out the awesome [Stream Handbook](https://github.com/substack/stream-handbook).\n\nFor streaming between server and client, you will send stream instances first.\nTo receive streams, you just wrap `socket` with `socket.io-stream`, then listen any events as usual.\n\nServer:\n\n```js\nvar io = require('socket.io').listen(80);\nvar ss = require('@11ways/socket.io-stream');\nvar path = require('path');\n\nio.of('/user').on('connection', function(socket) {\n  ss(socket).on('profile-image', function(stream, data) {\n    var filename = path.basename(data.name);\n    stream.pipe(fs.createWriteStream(filename));\n  });\n});\n```\n\n`createStream()` returns a new stream which can be sent by `emit()`.\n\nClient:\n\n```js\nvar io = require('socket.io-client');\nvar ss = require('@11ways/socket.io-stream');\n\nvar socket = io.connect('http://example.com/user');\nvar stream = ss.createStream();\nvar filename = 'profile.jpg';\n\nss(socket).emit('profile-image', stream, {name: filename});\nfs.createReadStream(filename).pipe(stream);\n```\n\nYou can stream data from a client to server, and vice versa.\n\n```js\n// send data\nss(socket).on('file', function(stream) {\n  fs.createReadStream('/path/to/file').pipe(stream);\n});\n\n// receive data\nss(socket).emit('file', stream);\nstream.pipe(fs.createWriteStream('file.txt'));\n```\n\n### Browser\n\nThis module can be used on the browser. To do so, just copy a file to a public directory.\n\n    $ cp node_modules/socket.io-stream/socket.io-stream.js somewhere/public/\n\nYou can also use [browserify](http://github.com/substack/node-browserify) to create your own bundle.\n\n    $ npm install browserify -g\n    $ cd node_modules/socket.io-stream\n    $ browserify index.js -s ss > socket.io-stream.js\n\n```html\n<input id=\"file\" type=\"file\" />\n\n<script src=\"/socket.io/socket.io.js\"></script>\n<script src=\"/js/socket.io-stream.js\"></script>\n<script src=\"/js/jquery.js\"></script>\n<script>\n$(function() {\n  var socket = io.connect('/foo');\n\n  $('#file').change(function(e) {\n    var file = e.target.files[0];\n    var stream = ss.createStream();\n\n    // upload a file to the server.\n    ss(socket).emit('file', stream, {size: file.size});\n    ss.createBlobReadStream(file).pipe(stream);\n  });\n});\n</script>\n```\n\n#### Upload progress\n\nYou can track upload progress like the following:\n\n```js\nvar blobStream = ss.createBlobReadStream(file);\nvar size = 0;\n\nblobStream.on('data', function(chunk) {\n  size += chunk.length;\n  console.log(Math.floor(size / file.size * 100) + '%');\n  // -> e.g. '42%'\n});\n\nblobStream.pipe(stream);\n```\n\n### Socket.IO v0.9 support\n\nYou have to set `forceBase64` option `true` when using the library with socket.io v0.9.x.\n\n```js\nss.forceBase64 = true;\n```\n\n\n## Documentation\n\n### ss(sio)\n\n- sio `socket.io Socket` A socket of Socket.IO, both for client and server\n- return `Socket`\n\nLook up an existing `Socket` instance based on `sio` (a socket of Socket.IO), or create one if it doesn't exist.\n\n### socket.emit(event, [arg1], [arg2], [...])\n\n- event `String` The event name\n\nEmit an `event` with variable number of arguments including at least a stream.\n\n```js\nss(socket).emit('myevent', stream, {name: 'thefilename'}, function() { ... });\n\n// send some streams at a time.\nss(socket).emit('multiple-streams', stream1, stream2);\n\n// as members of array or object.\nss(socket).emit('flexible', [stream1, { foo: stream2 }]);\n\n// get streams through the ack callback\nss(socket).emit('ack', function(stream1, stream2) { ... });\n```\n\n### socket.on(event, listener)\n\n- event `String` The event name\n- listener `Function` The event handler function\n\nAdd a `listener` for `event`. `listener` will take stream(s) with any data as arguments.\n\n```js\nss(socket).on('myevent', function(stream, data, callback) { ... });\n\n// access stream options\nss(socket).on('foo', function(stream) {\n  if (stream.options && stream.options.highWaterMark > 1024) {\n    console.error('Too big highWaterMark.');\n    return;\n  }\n});\n```\n\n### ss.createStream([options])\n\n- options `Object`\n    - highWaterMark `Number`\n    - encoding `String`\n    - decodeStrings `Boolean`\n    - objectMode `Boolean`\n    - allowHalfOpen `Boolean` if `true`, then the stream won't automatically close when the other endpoint ends. Default to `false`.\n- return `Duplex Stream`\n\nCreate a new duplex stream. See [the docs](http://nodejs.org/api/stream.html) for the details of stream and `options`.\n\n```js\nvar stream = ss.createStream();\n\n// with options\nvar stream = ss.createStream({\n  highWaterMark: 1024,\n  objectMode: true,\n  allowHalfOpen: true\n});\n```\n\n### ss.createBlobReadStream(blob, [options])\n\n- options `Object`\n    - highWaterMark `Number`\n    - encoding `String`\n    - objectMode `Boolean`\n- return `Readable Stream`\n\nCreate a new readable stream for [Blob](https://developer.mozilla.org/en-US/docs/Web/API/Blob) and [File](https://developer.mozilla.org/en-US/docs/Web/API/File) on browser. See [the docs](http://nodejs.org/api/stream.html) for the details of stream and `options`.\n\n```js\nvar stream = ss.createBlobReadStream(new Blob([1, 2, 3]));\n```\n\n### ss.Buffer\n\n[Node Buffer](https://nodejs.org/api/buffer.html) class to use on browser, which is exposed for convenience. On Node environment, you should just use normal `Buffer`.\n\n```js\nvar stream = ss.createStream();\nstream.write(new ss.Buffer([0, 1, 2]));\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}