69 lines
1.4 KiB
JavaScript
69 lines
1.4 KiB
JavaScript
'use strict';
|
|
|
|
var server;
|
|
var listening = false;
|
|
var sock;
|
|
|
|
function createServer(cb, 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();
|
|
function onServerError(err) {
|
|
cb(err);
|
|
}
|
|
server.once('error', onServerError);
|
|
server.once('listening', function () {
|
|
listening = true;
|
|
server.removeListener('error', onServerError);
|
|
});
|
|
}
|
|
|
|
exports.create = function create(cb, prefix) {
|
|
var net = require('net');
|
|
var client = new net.Socket();
|
|
|
|
function createConnection() {
|
|
function onClientError(err) {
|
|
cb(err);
|
|
}
|
|
client.connect(sock, function () {
|
|
client.removeListener('error', onClientError);
|
|
});
|
|
client.once('error', onClientError);
|
|
}
|
|
|
|
// This server listens on a Unix socket or Windows pipe at 'sock'
|
|
if (!server) {
|
|
createServer(cb, prefix);
|
|
}
|
|
|
|
server.once('connection', function onEach(connection) {
|
|
cb(null, connection);
|
|
});
|
|
|
|
if (!listening) {
|
|
server.listen(sock, createConnection);
|
|
}
|
|
else {
|
|
createConnection();
|
|
}
|
|
|
|
return client;
|
|
};
|
|
|
|
exports.closeAll = function () {
|
|
if (server) {
|
|
server.close();
|
|
}
|
|
};
|