commit 59412361e16d5cfb1bd56c34cfb602091157b1cc Author: AJ ONeal Date: Fri Apr 28 11:29:30 2017 -0600 initial commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..3e0eb21 --- /dev/null +++ b/README.md @@ -0,0 +1,32 @@ +# StreamPair + +[![NPM version](https://badge.fury.io/js/socket-pair.svg)](http://badge.fury.io/js/socket-pair) + +A pair of coupled sockets. + +Similar to `stream-pair`, but with sockets with real fds. A workaround for . + +## Usage + +```javascript +var socketPair = require('socket-pair'); + +socketPair.create(function (pair) { + var a = pair.client; + var b = pair.connection; + + a.write('123'); + b.on('data', function (chunk) { + console.log(chunk.toString('utf8')); + }); + + socketPair.closeAll(); +}); +``` + +## API + +``` +socketPair.create(cb) // creates or reuses a socket server +socketPair.closeAll() // closes the server and all sockets +``` diff --git a/lib/socket-pair.js b/lib/socket-pair.js new file mode 100644 index 0000000..8f61d3e --- /dev/null +++ b/lib/socket-pair.js @@ -0,0 +1,51 @@ +'use strict'; + +var server; +var listening = false; +var sock; + +function createServer(prefix) { + var os = require('os'); + var net = require('net'); + var path = require('path'); + var sockname = (prefix || 'node-socket-pair') + '.' + require('crypto').randomBytes(16).toString('hex') + '.sock'; + + if (/win/.test(os.platform())) { + sock = path.join('\\\\?\\pipe', process.cwd(), sockname); + } + else { + sock = path.join(os.tmpdir(), sockname); + } + + server = net.createServer(); +} + +exports.create = function create(cb, prefix) { + var net = require('net'); + var writer; + + // This server listens on a Unix socket or Windows pipe at 'sock' + if (!server) { + createServer(prefix); + } + if (!listening) { + server.listen(sock, function () { + writer = net.connect(sock); + listening = true; + }); + } + + server.once('connection', function each(reader) { + cb({ reader: reader, writer: writer }); + }); + + if (listening) { + writer = net.connect(sock); + } +}; + +exports.closeAll = function () { + if (server) { + server.close(); + } +}; diff --git a/package.json b/package.json new file mode 100644 index 0000000..6287067 --- /dev/null +++ b/package.json @@ -0,0 +1,27 @@ +{ + "name": "socket-pair", + "version": "1.0.0", + "description": "Similar to stream-pair, but with sockets with real fds. A workaround for https://github.com/nodejs/node/issues/12716", + "main": "lib/socket-pair.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git@git.daplie.com:Daplie/socket-pair.git" + }, + "keywords": [ + "tls", + "socket", + "socketpair", + "streampair", + "pair", + "stream", + "duplex", + "reader", + "coupled", + "writer" + ], + "author": "AJ ONeal (https://coolaj86.com)", + "license": "MIT OR Apache-2.0" +}