08-27-周三_17-09-29
This commit is contained in:
33
node_modules/dnode/.travis.yml
generated
vendored
Normal file
33
node_modules/dnode/.travis.yml
generated
vendored
Normal file
@@ -0,0 +1,33 @@
|
||||
sudo: false
|
||||
|
||||
env:
|
||||
- CXX=g++-4.8
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- g++-4.8
|
||||
|
||||
language: node_js
|
||||
|
||||
node_js:
|
||||
- "0.12"
|
||||
- "0.10"
|
||||
- "0.8"
|
||||
- "iojs"
|
||||
- "4"
|
||||
|
||||
install:
|
||||
- PATH="`npm bin`:`npm bin -g`:$PATH"
|
||||
# Node 0.8 comes with a too obsolete npm
|
||||
- if [[ "`node --version`" =~ ^v0\.8\. ]]; then npm install -g npm@1.4.28 ; fi
|
||||
# Install dependencies and build
|
||||
- npm install
|
||||
|
||||
script:
|
||||
# Output useful info for debugging
|
||||
- node --version
|
||||
- npm --version
|
||||
# Run tests
|
||||
- npm test
|
4
node_modules/dnode/LICENSE
generated
vendored
Normal file
4
node_modules/dnode/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
Copyright 2010 James Halliday (mail@substack.net)
|
||||
|
||||
This project is free software released under the MIT license:
|
||||
http://www.opensource.org/licenses/mit-license.php
|
5
node_modules/dnode/browser.js
generated
vendored
Normal file
5
node_modules/dnode/browser.js
generated
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
var dnode = require('./lib/dnode');
|
||||
|
||||
module.exports = function (cons, opts) {
|
||||
return new dnode(cons, opts);
|
||||
};
|
24
node_modules/dnode/example/auth/client.js
generated
vendored
Normal file
24
node_modules/dnode/example/auth/client.js
generated
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
var dnode = require('dnode');
|
||||
|
||||
if (process.argv.length < 4) {
|
||||
return console.error('Usage: ./client.js user pass');
|
||||
}
|
||||
|
||||
var user = process.argv[2];
|
||||
var pass = process.argv[3];
|
||||
|
||||
var d = dnode.connect(7007);
|
||||
d.on('remote', function (remote) {
|
||||
remote.auth(user, pass, function (err, session) {
|
||||
if (err) {
|
||||
console.error(err);
|
||||
return d.end();
|
||||
}
|
||||
|
||||
session.quote(function (q) {
|
||||
console.log('And now for a quote by ' + q.who + ':\n');
|
||||
console.log(q.quote + '\n');
|
||||
d.end();
|
||||
});
|
||||
});
|
||||
});
|
18
node_modules/dnode/example/auth/quotes.json
generated
vendored
Normal file
18
node_modules/dnode/example/auth/quotes.json
generated
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
[
|
||||
{
|
||||
"quote" : "Beauty is a consequential thing, a product of solving problems correctly.",
|
||||
"who" : "Joseph Eshrick"
|
||||
},
|
||||
{
|
||||
"quote" : "If you wish to make an apple pie from scratch, you must first invent the universe.",
|
||||
"who" : "Carl Sagan"
|
||||
},
|
||||
{
|
||||
"quote" : "If you're not allowed to implement new ideas, you stop having them.",
|
||||
"who" : "Paul Graham"
|
||||
},
|
||||
{
|
||||
"quote" : "For a successful technology, reality must take precedence over public relations, for nature cannot be fooled.",
|
||||
"who" : "Richard Feynman"
|
||||
}
|
||||
]
|
29
node_modules/dnode/example/auth/server.js
generated
vendored
Normal file
29
node_modules/dnode/example/auth/server.js
generated
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
var dnode = require('dnode');
|
||||
var fs = require('fs');
|
||||
var net = require('net');
|
||||
|
||||
var secretQuotes = require('./quotes.json');
|
||||
function randomQuote (cb) {
|
||||
var ix = Math.floor(Math.random() * secretQuotes.length);
|
||||
cb(secretQuotes[ix]);
|
||||
}
|
||||
|
||||
var server = net.createServer(function (stream) {
|
||||
var d = dnode({ auth : auth });
|
||||
d.pipe(stream).pipe(d);
|
||||
|
||||
function auth (user, pass, cb) {
|
||||
if (typeof cb !== 'function') return;
|
||||
|
||||
if (user === 'moo' && pass === 'hax') {
|
||||
console.log('signed in: ' + user);
|
||||
d.on('end', function () {
|
||||
console.log('disconnected: ' + user);
|
||||
});
|
||||
|
||||
cb(null, { quote : randomQuote });
|
||||
}
|
||||
else cb('ACCESS DENIED')
|
||||
}
|
||||
});
|
||||
server.listen(7007);
|
2
node_modules/dnode/example/shoe/Makefile
generated
vendored
Normal file
2
node_modules/dnode/example/shoe/Makefile
generated
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
all:
|
||||
node_modules/.bin/browserify client.js -o static/bundle.js
|
16
node_modules/dnode/example/shoe/client.js
generated
vendored
Normal file
16
node_modules/dnode/example/shoe/client.js
generated
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
var domready = require('domready');
|
||||
var shoe = require('shoe');
|
||||
var dnode = require('../../');
|
||||
|
||||
domready(function () {
|
||||
var result = document.getElementById('result');
|
||||
var stream = shoe('/dnode');
|
||||
|
||||
var d = dnode();
|
||||
d.on('remote', function (remote) {
|
||||
remote.transform('beep', function (s) {
|
||||
result.textContent = 'beep => ' + s;
|
||||
});
|
||||
});
|
||||
d.pipe(stream).pipe(d);
|
||||
});
|
11
node_modules/dnode/example/shoe/package.json
generated
vendored
Normal file
11
node_modules/dnode/example/shoe/package.json
generated
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"name" : "dnode-shoe-example",
|
||||
"version" : "0.0.0",
|
||||
"dependencies" : {
|
||||
"shoe" : "~0.0.0",
|
||||
"ecstatic" : "~0.1.6",
|
||||
"domready" : "~0.2.11",
|
||||
"browserify" : "~1.12.3"
|
||||
},
|
||||
"private" : true
|
||||
}
|
18
node_modules/dnode/example/shoe/server.js
generated
vendored
Normal file
18
node_modules/dnode/example/shoe/server.js
generated
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
var http = require('http');
|
||||
var shoe = require('shoe');
|
||||
var ecstatic = require('ecstatic')(__dirname + '/static');
|
||||
var dnode = require('../../');
|
||||
|
||||
var server = http.createServer(ecstatic);
|
||||
server.listen(9999);
|
||||
|
||||
var sock = shoe(function (stream) {
|
||||
var d = dnode({
|
||||
transform : function (s, cb) {
|
||||
var res = s.replace(/[aeiou]{2,}/, 'oo').toUpperCase();
|
||||
cb(res);
|
||||
}
|
||||
});
|
||||
d.pipe(stream).pipe(d);
|
||||
});
|
||||
sock.install(server, '/dnode');
|
2
node_modules/dnode/example/shoe/static/index.html
generated
vendored
Normal file
2
node_modules/dnode/example/shoe/static/index.html
generated
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
<script src="/bundle.js"></script>
|
||||
<div id="result"></div>
|
8
node_modules/dnode/example/simple/client.js
generated
vendored
Normal file
8
node_modules/dnode/example/simple/client.js
generated
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
var dnode = require('../../');
|
||||
|
||||
dnode.connect(7070, function (remote, conn) {
|
||||
remote.zing(33, function (n) {
|
||||
console.log('n=' + n);
|
||||
conn.end();
|
||||
});
|
||||
});
|
6
node_modules/dnode/example/simple/server.js
generated
vendored
Normal file
6
node_modules/dnode/example/simple/server.js
generated
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
var dnode = require('../../');
|
||||
|
||||
var server = dnode(function (remote, conn) {
|
||||
this.zing = function (n, cb) { cb(n * 100) };
|
||||
});
|
||||
server.listen(7070);
|
13
node_modules/dnode/example/stream/connect.js
generated
vendored
Normal file
13
node_modules/dnode/example/stream/connect.js
generated
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
var dnode = require('../../');
|
||||
var net = require('net');
|
||||
|
||||
var d = dnode();
|
||||
d.on('remote', function (remote) {
|
||||
remote.transform('beep', function (s) {
|
||||
console.log('beep => ' + s);
|
||||
d.end();
|
||||
});
|
||||
});
|
||||
|
||||
var c = net.connect(5004);
|
||||
c.pipe(d).pipe(c);
|
13
node_modules/dnode/example/stream/listen.js
generated
vendored
Normal file
13
node_modules/dnode/example/stream/listen.js
generated
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
var dnode = require('../../');
|
||||
var net = require('net');
|
||||
|
||||
var server = net.createServer(function (c) {
|
||||
var d = dnode({
|
||||
transform : function (s, cb) {
|
||||
cb(s.replace(/[aeiou]{2,}/, 'oo').toUpperCase())
|
||||
}
|
||||
});
|
||||
c.pipe(d).pipe(c);
|
||||
});
|
||||
|
||||
server.listen(5004);
|
137
node_modules/dnode/index.js
generated
vendored
Normal file
137
node_modules/dnode/index.js
generated
vendored
Normal file
@@ -0,0 +1,137 @@
|
||||
var dnode = require('./lib/dnode');
|
||||
var parseArgs = require('./lib/parse_args');
|
||||
var net = require('net');
|
||||
var util = require('util');
|
||||
var weak
|
||||
|
||||
exports = module.exports = function (cons, opts) {
|
||||
return new D(cons, opts);
|
||||
};
|
||||
|
||||
exports.connect = function () {
|
||||
var d = new D();
|
||||
return d.connect.apply(d, arguments);
|
||||
};
|
||||
|
||||
exports.listen = function () {
|
||||
var d = new D();
|
||||
return d.listen.apply(d, arguments);
|
||||
};
|
||||
|
||||
util.inherits(D, dnode);
|
||||
function D (cons, opts) {
|
||||
var self = this;
|
||||
if (!opts) opts = {};
|
||||
|
||||
if (opts.weak !== false && !opts.proto) {
|
||||
if (!weak) {
|
||||
weak = require("weak")
|
||||
}
|
||||
|
||||
opts.proto = {};
|
||||
opts.proto.wrap = function (cb, id) {
|
||||
var proto = this;
|
||||
return weak(cb, function () {
|
||||
proto.cull(id);
|
||||
});
|
||||
};
|
||||
opts.proto.unwrap = function (ref, id) {
|
||||
var cb = weak.get(ref);
|
||||
return cb || function () {};
|
||||
};
|
||||
}
|
||||
return dnode.call(self, cons, opts);
|
||||
}
|
||||
|
||||
D.prototype.connect = function () {
|
||||
var self = this;
|
||||
var params = parseArgs(arguments);
|
||||
|
||||
var stream;
|
||||
if (params.path) {
|
||||
stream = net.connect(params.path);
|
||||
}
|
||||
else if (params.port) {
|
||||
stream = net.connect(params.port, params.host);
|
||||
}
|
||||
else {
|
||||
throw new Error('no port or unix path given');
|
||||
}
|
||||
|
||||
if (params.block) self.on('remote', params.block);
|
||||
|
||||
stream.on('error', function (err) {
|
||||
if (err && err.code === 'EPIPE') return; // eat EPIPEs
|
||||
self.emit('error', err);
|
||||
});
|
||||
|
||||
self.id = randomId();
|
||||
self.stream = stream;
|
||||
stream.pipe(self);
|
||||
self.pipe(stream);
|
||||
|
||||
return self;
|
||||
};
|
||||
|
||||
dnode.prototype.listen = function () {
|
||||
var self = this;
|
||||
|
||||
// just copy over the opts and cons, the rest will need to be re-created
|
||||
var cons = self.cons, opts = self.opts;
|
||||
self.cons = function () {};
|
||||
self.end();
|
||||
|
||||
var params = parseArgs(arguments);
|
||||
|
||||
var server = net.createServer(function (stream) {
|
||||
var d = new dnode(cons, opts);
|
||||
do { d.id = randomId() }
|
||||
while (server.sessions[d.id]);
|
||||
|
||||
server.sessions[d.id] = d;
|
||||
d.on('end', function () {
|
||||
delete server.sessions[d.id];
|
||||
});
|
||||
|
||||
d.on('local', function (ref) {
|
||||
server.emit('local', ref, d);
|
||||
});
|
||||
|
||||
d.on('remote', function (remote) {
|
||||
server.emit('remote', remote, d);
|
||||
});
|
||||
|
||||
stream.on('error', function (err) {
|
||||
if (err && err.code === 'EPIPE') return; // eat EPIPEs
|
||||
d.emit('error', err);
|
||||
});
|
||||
|
||||
d.stream = stream;
|
||||
stream.pipe(d);
|
||||
d.pipe(stream);
|
||||
});
|
||||
|
||||
server.sessions = {};
|
||||
|
||||
if (typeof params.port === 'number' && params.port >= 0) {
|
||||
server.listen(params.port, params.host);
|
||||
}
|
||||
else if (params.path) {
|
||||
server.listen(params.path);
|
||||
}
|
||||
else {
|
||||
throw new Error('no port or path provided');
|
||||
}
|
||||
|
||||
if (params.block) server.on('listening', params.block);
|
||||
|
||||
return server;
|
||||
};
|
||||
|
||||
function randomId () {
|
||||
var s = '';
|
||||
for (var i = 0; i < 4; i++) {
|
||||
s += Math.random().toString(16).slice(2);
|
||||
}
|
||||
return s;
|
||||
}
|
153
node_modules/dnode/lib/dnode.js
generated
vendored
Normal file
153
node_modules/dnode/lib/dnode.js
generated
vendored
Normal file
@@ -0,0 +1,153 @@
|
||||
var protocol = require('dnode-protocol');
|
||||
var Stream = require('stream');
|
||||
var json = typeof JSON === 'object' ? JSON : require('jsonify');
|
||||
|
||||
module.exports = dnode;
|
||||
dnode.prototype = {};
|
||||
(function () { // browsers etc
|
||||
for (var key in Stream.prototype) {
|
||||
dnode.prototype[key] = Stream.prototype[key];
|
||||
}
|
||||
})();
|
||||
|
||||
function dnode (cons, opts) {
|
||||
Stream.call(this);
|
||||
var self = this;
|
||||
|
||||
self.opts = opts || {};
|
||||
|
||||
self.cons = typeof cons === 'function'
|
||||
? cons
|
||||
: function () { return cons || {} }
|
||||
;
|
||||
|
||||
self.readable = true;
|
||||
self.writable = true;
|
||||
|
||||
process.nextTick(function () {
|
||||
if (self._ended) return;
|
||||
self.proto = self._createProto();
|
||||
self.proto.start();
|
||||
|
||||
if (!self._handleQueue) return;
|
||||
for (var i = 0; i < self._handleQueue.length; i++) {
|
||||
self.handle(self._handleQueue[i]);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
dnode.prototype._createProto = function () {
|
||||
var self = this;
|
||||
var proto = protocol(function (remote) {
|
||||
if (self._ended) return;
|
||||
|
||||
var ref = self.cons.call(this, remote, self);
|
||||
if (typeof ref !== 'object') ref = this;
|
||||
|
||||
self.emit('local', ref, self);
|
||||
|
||||
return ref;
|
||||
}, self.opts.proto);
|
||||
|
||||
proto.on('remote', function (remote) {
|
||||
self.emit('remote', remote, self);
|
||||
self.emit('ready'); // backwards compatability, deprecated
|
||||
});
|
||||
|
||||
proto.on('request', function (req) {
|
||||
if (!self.readable) return;
|
||||
|
||||
if (self.opts.emit === 'object') {
|
||||
self.emit('data', req);
|
||||
}
|
||||
else self.emit('data', json.stringify(req) + '\n');
|
||||
});
|
||||
|
||||
proto.on('fail', function (err) {
|
||||
// errors that the remote end was responsible for
|
||||
self.emit('fail', err);
|
||||
});
|
||||
|
||||
proto.on('error', function (err) {
|
||||
// errors that the local code was responsible for
|
||||
self.emit('error', err);
|
||||
});
|
||||
|
||||
return proto;
|
||||
};
|
||||
|
||||
dnode.prototype.write = function (buf) {
|
||||
if (this._ended) return;
|
||||
var self = this;
|
||||
var row;
|
||||
|
||||
if (buf && typeof buf === 'object'
|
||||
&& buf.constructor && buf.constructor.name === 'Buffer'
|
||||
&& buf.length
|
||||
&& typeof buf.slice === 'function') {
|
||||
// treat like a buffer
|
||||
if (!self._bufs) self._bufs = [];
|
||||
|
||||
// treat like a buffer
|
||||
for (var i = 0, j = 0; i < buf.length; i++) {
|
||||
if (buf[i] === 0x0a) {
|
||||
self._bufs.push(buf.slice(j, i));
|
||||
|
||||
var line = '';
|
||||
for (var k = 0; k < self._bufs.length; k++) {
|
||||
line += String(self._bufs[k]);
|
||||
}
|
||||
|
||||
try { row = json.parse(line) }
|
||||
catch (err) { return self.end() }
|
||||
|
||||
j = i + 1;
|
||||
|
||||
self.handle(row);
|
||||
self._bufs = [];
|
||||
}
|
||||
}
|
||||
|
||||
if (j < buf.length) self._bufs.push(buf.slice(j, buf.length));
|
||||
}
|
||||
else if (buf && typeof buf === 'object') {
|
||||
// .isBuffer() without the Buffer
|
||||
// Use self to pipe JSONStream.parse() streams.
|
||||
self.handle(buf);
|
||||
}
|
||||
else {
|
||||
if (typeof buf !== 'string') buf = String(buf);
|
||||
if (!self._line) self._line = '';
|
||||
|
||||
for (var i = 0; i < buf.length; i++) {
|
||||
if (buf.charCodeAt(i) === 0x0a) {
|
||||
try { row = json.parse(self._line) }
|
||||
catch (err) { return self.end() }
|
||||
|
||||
self._line = '';
|
||||
self.handle(row);
|
||||
}
|
||||
else self._line += buf.charAt(i)
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
dnode.prototype.handle = function (row) {
|
||||
if (!this.proto) {
|
||||
if (!this._handleQueue) this._handleQueue = [];
|
||||
this._handleQueue.push(row);
|
||||
}
|
||||
else this.proto.handle(row);
|
||||
};
|
||||
|
||||
dnode.prototype.end = function () {
|
||||
if (this._ended) return;
|
||||
this._ended = true;
|
||||
this.writable = false;
|
||||
this.readable = false;
|
||||
this.emit('end');
|
||||
};
|
||||
|
||||
dnode.prototype.destroy = function () {
|
||||
this.end();
|
||||
};
|
35
node_modules/dnode/lib/parse_args.js
generated
vendored
Normal file
35
node_modules/dnode/lib/parse_args.js
generated
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
module.exports = function (argv) {
|
||||
var params = {};
|
||||
for (var i = 0; i < argv.length; i++) {
|
||||
var arg = argv[i];
|
||||
|
||||
if (typeof arg === 'string') {
|
||||
if (arg.match(/^\d+$/)) {
|
||||
params.port = parseInt(arg, 10);
|
||||
}
|
||||
else if (arg.match('^/')) {
|
||||
params.path = arg;
|
||||
}
|
||||
else {
|
||||
params.host = arg;
|
||||
}
|
||||
}
|
||||
else if (typeof arg === 'number') {
|
||||
params.port = arg;
|
||||
}
|
||||
else if (typeof arg === 'function') {
|
||||
params.block = arg;
|
||||
}
|
||||
else if (typeof arg === 'object') {
|
||||
for (var key in arg) {
|
||||
if (key === 'port') {
|
||||
params[key] = parseInt(arg[key], 10)
|
||||
}
|
||||
else params[key] = arg[key]
|
||||
}
|
||||
}
|
||||
// ignore everything else
|
||||
};
|
||||
|
||||
return params;
|
||||
};
|
123
node_modules/dnode/package.json
generated
vendored
Normal file
123
node_modules/dnode/package.json
generated
vendored
Normal file
@@ -0,0 +1,123 @@
|
||||
{
|
||||
"_args": [
|
||||
[
|
||||
{
|
||||
"name": "dnode",
|
||||
"raw": "dnode@>=1.2.2",
|
||||
"rawSpec": ">=1.2.2",
|
||||
"scope": null,
|
||||
"spec": ">=1.2.2",
|
||||
"type": "range"
|
||||
},
|
||||
"/root/gitbook/node_modules/phantom"
|
||||
]
|
||||
],
|
||||
"_from": "dnode@>=1.2.2",
|
||||
"_id": "dnode@1.2.2",
|
||||
"_inCache": true,
|
||||
"_installable": true,
|
||||
"_location": "/dnode",
|
||||
"_nodeVersion": "0.12.7",
|
||||
"_npmUser": {
|
||||
"email": "seethroughtrees+npm@gmail.com",
|
||||
"name": "seethroughtrees"
|
||||
},
|
||||
"_npmVersion": "2.11.3",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"name": "dnode",
|
||||
"raw": "dnode@>=1.2.2",
|
||||
"rawSpec": ">=1.2.2",
|
||||
"scope": null,
|
||||
"spec": ">=1.2.2",
|
||||
"type": "range"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/phantom"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/dnode/-/dnode-1.2.2.tgz",
|
||||
"_shasum": "4ac3cfe26e292b3b39b8258ae7d94edc58132efa",
|
||||
"_shrinkwrap": null,
|
||||
"_spec": "dnode@>=1.2.2",
|
||||
"_where": "/root/gitbook/node_modules/phantom",
|
||||
"author": {
|
||||
"email": "mail@substack.net",
|
||||
"name": "James Halliday",
|
||||
"url": "http://substack.net"
|
||||
},
|
||||
"browserify": "browser.js",
|
||||
"bugs": {
|
||||
"url": "https://github.com/substack/dnode/issues"
|
||||
},
|
||||
"dependencies": {
|
||||
"dnode-protocol": "~0.2.2",
|
||||
"jsonify": "~0.0.0",
|
||||
"weak": "^1.0.0"
|
||||
},
|
||||
"description": "freestyle rpc",
|
||||
"devDependencies": {
|
||||
"tape": "~2.3.2"
|
||||
},
|
||||
"directories": {},
|
||||
"dist": {
|
||||
"integrity": "sha512-OGTysjAH1/hElDKfQb4nS5syzETTc9MWPv1BgAqeKEBpSb+1PBaOxs+n6Uh+Lm1Xh+dwyybDby6t/yP1VFbhag==",
|
||||
"shasum": "4ac3cfe26e292b3b39b8258ae7d94edc58132efa",
|
||||
"signatures": [
|
||||
{
|
||||
"keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA",
|
||||
"sig": "MEUCIG1dz8IkT2haAQfnmejvNy+JOhDgprORru2zTJDjIAlJAiEAnFniKP+2kd4sgqOejmWypaBZc6njlImJ3RuMc5dp9Iw="
|
||||
}
|
||||
],
|
||||
"tarball": "https://registry.npmjs.org/dnode/-/dnode-1.2.2.tgz"
|
||||
},
|
||||
"engine": {
|
||||
"node": ">=0.6.0"
|
||||
},
|
||||
"gitHead": "32e8a7e36f4603672b17fa4b0fbecc05c66022df",
|
||||
"homepage": "https://github.com/substack/dnode#readme",
|
||||
"keywords": [
|
||||
"rpc",
|
||||
"callbacks"
|
||||
],
|
||||
"main": "./index.js",
|
||||
"maintainers": [
|
||||
{
|
||||
"email": "substack@gmail.com",
|
||||
"name": "substack"
|
||||
},
|
||||
{
|
||||
"email": "seethroughtrees+npm@gmail.com",
|
||||
"name": "seethroughtrees"
|
||||
}
|
||||
],
|
||||
"name": "dnode",
|
||||
"optionalDependencies": {
|
||||
"weak": "^1.0.0"
|
||||
},
|
||||
"readme": "ERROR: No README data found!",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+ssh://git@github.com/substack/dnode.git"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "tape test/*.js test/server/*.js"
|
||||
},
|
||||
"testling": {
|
||||
"browsers": [
|
||||
"ie/6..latest",
|
||||
"chrome/10",
|
||||
"chrome/latest",
|
||||
"chrome/canary",
|
||||
"firefox/10",
|
||||
"firefox/latest",
|
||||
"firefox/nightly",
|
||||
"safari/latest",
|
||||
"opera/11.0..latest",
|
||||
"iphone/6",
|
||||
"ipad/6",
|
||||
"android-browser/latest"
|
||||
],
|
||||
"files": "test/*.js"
|
||||
},
|
||||
"version": "1.2.2"
|
||||
}
|
12
node_modules/dnode/perf/memory/client.js
generated
vendored
Normal file
12
node_modules/dnode/perf/memory/client.js
generated
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
var dnode = require('../../');
|
||||
var d = dnode();
|
||||
|
||||
var d = dnode.connect(7070);
|
||||
var ix = 0;
|
||||
d.on('remote', function fn (remote) {
|
||||
remote.zing(33, function () {
|
||||
ix++;
|
||||
if (ix % 100 === 0) console.log(ix);
|
||||
fn(remote);
|
||||
});
|
||||
});
|
16
node_modules/dnode/perf/memory/server.js
generated
vendored
Normal file
16
node_modules/dnode/perf/memory/server.js
generated
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
var dnode = require('../../');
|
||||
var net = require('net');
|
||||
|
||||
var server = net.createServer(function (stream) {
|
||||
var d = dnode(function (remote) {
|
||||
this.zing = function (n, cb) { cb(n * 100) };
|
||||
});
|
||||
d.pipe(stream).pipe(d);
|
||||
});
|
||||
server.listen(7070);
|
||||
|
||||
setInterval(function () {
|
||||
var mem = process.memoryUsage();
|
||||
var m = mem.heapTotal / 1024 / 1024;
|
||||
console.log(Math.round(m * 100) / 100 + ' MB');
|
||||
}, 1000);
|
293
node_modules/dnode/readme.markdown
generated
vendored
Normal file
293
node_modules/dnode/readme.markdown
generated
vendored
Normal file
@@ -0,0 +1,293 @@
|
||||
# dnode
|
||||
|
||||
dnode is an asynchronous rpc system for node.js that lets you
|
||||
call remote functions.
|
||||
|
||||
You can pass callbacks to remote functions, and the remote end can call
|
||||
the functions you passed in with callbacks of its own and so on.
|
||||
It's callbacks all the way down!
|
||||
|
||||
[](http://ci.testling.com/substack/dnode)
|
||||
|
||||
[](http://travis-ci.org/substack/dnode)
|
||||
|
||||

|
||||
|
||||
# example
|
||||
|
||||
## listen and connect
|
||||
|
||||
server:
|
||||
|
||||
``` js
|
||||
var dnode = require('dnode');
|
||||
var server = dnode({
|
||||
transform : function (s, cb) {
|
||||
cb(s.replace(/[aeiou]{2,}/, 'oo').toUpperCase())
|
||||
}
|
||||
});
|
||||
server.listen(5004);
|
||||
```
|
||||
|
||||
client:
|
||||
|
||||
``` js
|
||||
var dnode = require('dnode');
|
||||
|
||||
var d = dnode.connect(5004);
|
||||
d.on('remote', function (remote) {
|
||||
remote.transform('beep', function (s) {
|
||||
console.log('beep => ' + s);
|
||||
d.end();
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
output:
|
||||
|
||||
```
|
||||
$ node server.js &
|
||||
[1] 27574
|
||||
$ node client.js
|
||||
beep => BOOP
|
||||
```
|
||||
|
||||
## streaming
|
||||
|
||||
The `.connect()` and `.listen()` calls in the previous example are just
|
||||
convenience methods for piping to and from readable/writable streams.
|
||||
Here's the previous example with the streams set up explicitly:
|
||||
|
||||
server:
|
||||
|
||||
``` js
|
||||
var dnode = require('dnode');
|
||||
var net = require('net');
|
||||
|
||||
var server = net.createServer(function (c) {
|
||||
var d = dnode({
|
||||
transform : function (s, cb) {
|
||||
cb(s.replace(/[aeiou]{2,}/, 'oo').toUpperCase())
|
||||
}
|
||||
});
|
||||
c.pipe(d).pipe(c);
|
||||
});
|
||||
|
||||
server.listen(5004);
|
||||
```
|
||||
|
||||
client:
|
||||
|
||||
``` js
|
||||
var dnode = require('dnode');
|
||||
var net = require('net');
|
||||
|
||||
var d = dnode();
|
||||
d.on('remote', function (remote) {
|
||||
remote.transform('beep', function (s) {
|
||||
console.log('beep => ' + s);
|
||||
d.end();
|
||||
});
|
||||
});
|
||||
|
||||
var c = net.connect(5004);
|
||||
c.pipe(d).pipe(c);
|
||||
```
|
||||
|
||||
output:
|
||||
|
||||
```
|
||||
$ node server.js &
|
||||
[1] 27586
|
||||
$ node client.js
|
||||
beep => BOOP
|
||||
```
|
||||
|
||||
## dnode in the browser
|
||||
|
||||
Since dnode instances are just readable/writable streams, you can use them with
|
||||
any streaming transport, including in the browser!
|
||||
|
||||
This example uses the streaming interface provided by
|
||||
[shoe](https://github.com/substack/shoe), which is just a thin wrapper on top of
|
||||
[sockjs](http://sockjs.org/) that provides websockets with fallbacks.
|
||||
|
||||
First whip up a server:
|
||||
|
||||
``` js
|
||||
var http = require('http');
|
||||
var shoe = require('shoe');
|
||||
var ecstatic = require('ecstatic')(__dirname + '/static');
|
||||
var dnode = require('dnode');
|
||||
|
||||
var server = http.createServer(ecstatic);
|
||||
server.listen(9999);
|
||||
|
||||
var sock = shoe(function (stream) {
|
||||
var d = dnode({
|
||||
transform : function (s, cb) {
|
||||
var res = s.replace(/[aeiou]{2,}/, 'oo').toUpperCase();
|
||||
cb(res);
|
||||
}
|
||||
});
|
||||
d.pipe(stream).pipe(d);
|
||||
});
|
||||
sock.install(server, '/dnode');
|
||||
```
|
||||
|
||||
Then write some browser code:
|
||||
|
||||
``` js
|
||||
var domready = require('domready');
|
||||
var shoe = require('shoe');
|
||||
var dnode = require('dnode');
|
||||
|
||||
domready(function () {
|
||||
var result = document.getElementById('result');
|
||||
var stream = shoe('/dnode');
|
||||
|
||||
var d = dnode();
|
||||
d.on('remote', function (remote) {
|
||||
remote.transform('beep', function (s) {
|
||||
result.textContent = 'beep => ' + s;
|
||||
});
|
||||
});
|
||||
d.pipe(stream).pipe(d);
|
||||
});
|
||||
```
|
||||
|
||||
Install the dependencies for this example then compile the browser code with
|
||||
[browserify](https://github.com/substack/node-browserify):
|
||||
|
||||
```
|
||||
$ npm install dnode shoe domready ecstatic
|
||||
$ npm install -g browserify
|
||||
$ browserify client.js -o static/bundle.js
|
||||
```
|
||||
|
||||
Now drop a script tag into static/index.html:
|
||||
|
||||
``` html
|
||||
<script src="/bundle.js"></script>
|
||||
<div id="result"></div>
|
||||
```
|
||||
|
||||
and navigate to http://localhost:9999.
|
||||
You should see `beep => BOOP` on the page!
|
||||
|
||||
Check out the
|
||||
[complete shoe example](https://github.com/substack/dnode/tree/master/example/shoe).
|
||||
|
||||
# methods
|
||||
|
||||
``` js
|
||||
var dnode = require('dnode')
|
||||
```
|
||||
|
||||
## var d = dnode(cons, opts={})
|
||||
|
||||
Create a new readable/writable dnode stream object `d`.
|
||||
All the usual stream methods are at your disposal: pipe(), write(), end().
|
||||
|
||||
If `cons` is a function, it will be called `new cons(remote, d)` to create a new
|
||||
instance object. Otherwise its value will be used directly. When `cons` is
|
||||
called as a function, the `remote` ref will be an empty unpopulated object.
|
||||
|
||||
By default, dnode uses weakmaps to garbage collect unused callbacks
|
||||
automatically. This behavior prevents memory leaks in long-running connections.
|
||||
|
||||
You can turn weakmaps off by setting `opts.weak = false`.
|
||||
|
||||
## d.connect(...)
|
||||
|
||||
This method is a shortcut for setting up a pipe between `d` and a new
|
||||
`net.connect()` stream.
|
||||
|
||||
The host, port, and callback arguments supplied will be inferred by their
|
||||
types.
|
||||
|
||||
If you pass a callback in as an argument, it will be added as a listener to the
|
||||
`'remote'` event.
|
||||
|
||||
Returns the `d` object.
|
||||
|
||||
## dnode.connect(...)
|
||||
|
||||
Shortcut to create a connection without a constructor.
|
||||
|
||||
## d.listen(...)
|
||||
|
||||
This method is a shortcut for setting up a `net.createServer()` and piping
|
||||
network streams to and from new dnode streams.
|
||||
|
||||
The host, port, and callback parameters will be inferred from the types of the
|
||||
arguments.
|
||||
|
||||
Returns a net server object that will also emit `'local'` and `'remote'` events
|
||||
from the underlying dnode streams..
|
||||
|
||||
## dnode.listen(...)
|
||||
|
||||
Shortcut to create a listener without a constructor.
|
||||
|
||||
# events
|
||||
|
||||
## d.on('remote', cb)
|
||||
|
||||
This event fires with `cb(remote, d)` when the remote side of the connection
|
||||
has constructed its instance.
|
||||
|
||||
## d.on('local', cb)
|
||||
|
||||
This event fires right after the constructed instance has been created locally
|
||||
but before it gets sent to the remote end so you can modify the ref object.
|
||||
|
||||
This event fires with `cb(ref, d)` where `ref` is the local instance object.
|
||||
|
||||
## d.on('fail', cb)
|
||||
|
||||
This event fires when the remote end causes errors in the protocol layer.
|
||||
|
||||
These are non-fatal and can probably be ignored but you could also terminate the
|
||||
connection here.
|
||||
|
||||
## d.on('error', cb)
|
||||
|
||||
This event fires when local code causes errors in its callbacks.
|
||||
Not all errors can be caught here since some might be in async functions.
|
||||
|
||||
## d.on('end', cb)
|
||||
|
||||
This event fires when the input stream finishes.
|
||||
|
||||
# install
|
||||
|
||||
With [npm](http://npmjs.org) do:
|
||||
|
||||
```
|
||||
npm install dnode
|
||||
```
|
||||
|
||||
# protocol
|
||||
|
||||
dnode uses a newline-terminated JSON protocol
|
||||
[documented in the dnode-protocol project](https://github.com/substack/dnode-protocol/blob/master/doc/protocol.markdown#the-protocol).
|
||||
|
||||
# dnode in other languages
|
||||
|
||||
These libraries implement the dnode protocol too so you can make RPC calls
|
||||
between scripts written in different languages.
|
||||
|
||||
* [dnode-perl](http://github.com/substack/dnode-perl)
|
||||
* [dnode-ruby](http://github.com/substack/dnode-ruby)
|
||||
* [dnode-php](https://github.com/bergie/dnode-php)
|
||||
* [dnode-php-sync-client](https://github.com/erasys/dnode-php-sync-client)
|
||||
* [dnode-java](https://github.com/aslakhellesoy/dnode-java)
|
||||
|
||||
# shameless plug
|
||||
|
||||
Want to make sure your crazy javascript-heavy app still works in other
|
||||
browsers?
|
||||
Give [browserling](http://browserling.com) a spin!
|
||||
Browsers in your browser. Powered by dnode.
|
||||
|
13
node_modules/dnode/test/_id.js
generated
vendored
Normal file
13
node_modules/dnode/test/_id.js
generated
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
var dnode = require('../');
|
||||
var test = require('tape');
|
||||
|
||||
test('_id', function (t) {
|
||||
t.plan(1);
|
||||
|
||||
var server = dnode({ _id : 1337 });
|
||||
var client = dnode();
|
||||
client.on('remote', function (remote, conn) {
|
||||
t.equal(remote._id, 1337);
|
||||
});
|
||||
client.pipe(server).pipe(client);
|
||||
});
|
55
node_modules/dnode/test/args.js
generated
vendored
Normal file
55
node_modules/dnode/test/args.js
generated
vendored
Normal file
@@ -0,0 +1,55 @@
|
||||
var test = require('tape');
|
||||
|
||||
var parseArgs = require('../lib/parse_args');
|
||||
|
||||
function argv () { return arguments }
|
||||
|
||||
test('args', function (t) {
|
||||
t.deepEqual(
|
||||
parseArgs(argv('moo.com', 555)),
|
||||
{ host : 'moo.com', port : 555 }
|
||||
);
|
||||
|
||||
t.deepEqual(
|
||||
parseArgs(argv('7777')),
|
||||
{ port : 7777 }
|
||||
);
|
||||
|
||||
t.deepEqual(
|
||||
parseArgs(argv({
|
||||
host : 'moosy.moo.com',
|
||||
port : 5050
|
||||
})),
|
||||
{ host : 'moosy.moo.com', port : 5050 }
|
||||
);
|
||||
|
||||
t.deepEqual(
|
||||
parseArgs(argv('meow.cats.com', { port : '1234' })),
|
||||
{ host : 'meow.cats.com', port : 1234 }
|
||||
);
|
||||
|
||||
t.deepEqual(
|
||||
typeof parseArgs(argv('789')).port,
|
||||
'number'
|
||||
);
|
||||
|
||||
t.deepEqual(
|
||||
parseArgs(argv(
|
||||
{ host : 'woof.dogs.com' }, { port : 4050 }
|
||||
)),
|
||||
{ host : 'woof.dogs.com', port : 4050 }
|
||||
);
|
||||
|
||||
t.deepEqual(
|
||||
parseArgs(argv(
|
||||
undefined,
|
||||
{ host : 'woof.dogs.com' },
|
||||
undefined,
|
||||
{ port : 4050 },
|
||||
undefined
|
||||
)),
|
||||
{ host : 'woof.dogs.com', port : 4050 }
|
||||
);
|
||||
|
||||
t.end();
|
||||
});
|
30
node_modules/dnode/test/bidirectional.js
generated
vendored
Normal file
30
node_modules/dnode/test/bidirectional.js
generated
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
var dnode = require('../');
|
||||
var test = require('tape');
|
||||
|
||||
test('bidirectional', function (t) {
|
||||
t.plan(3);
|
||||
|
||||
var server = dnode(function (client) {
|
||||
this.timesX = function (n,f) {
|
||||
t.equal(n, 3, "timesX's n == 3");
|
||||
|
||||
client.x(function (x) {
|
||||
t.equal(x, 20, 'client.x == 20');
|
||||
f(n * x);
|
||||
});
|
||||
};
|
||||
});
|
||||
|
||||
var client = dnode({
|
||||
x : function (f) { f(20) }
|
||||
});
|
||||
client.on('remote', function (remote) {
|
||||
remote.timesX(3, function (res) {
|
||||
t.equal(res, 60, 'result of 20 * 3 == 60');
|
||||
client.end();
|
||||
server.end();
|
||||
});
|
||||
});
|
||||
|
||||
client.pipe(server).pipe(client);
|
||||
});
|
69
node_modules/dnode/test/broadcast.js
generated
vendored
Normal file
69
node_modules/dnode/test/broadcast.js
generated
vendored
Normal file
@@ -0,0 +1,69 @@
|
||||
var dnode = require('../');
|
||||
var EventEmitter = require('events').EventEmitter;
|
||||
var test = require('tape');
|
||||
|
||||
test('broadcast', function (t) {
|
||||
t.plan(3);
|
||||
|
||||
var em = new EventEmitter;
|
||||
var server = function () {
|
||||
return dnode(function (client, conn) {
|
||||
conn.on('ready', function () {
|
||||
em.on('message', client.message);
|
||||
});
|
||||
|
||||
conn.on('end', function () {
|
||||
em.removeListener('message', client.message);
|
||||
});
|
||||
|
||||
this.message = function (msg) {
|
||||
em.emit('message', client.name + ' says: ' + msg);
|
||||
};
|
||||
});
|
||||
};
|
||||
|
||||
var recv = { 0 : [], 1 : [], 2 : [] };
|
||||
|
||||
var client0 = dnode({
|
||||
name : '#0',
|
||||
message : function (msg) { recv[0].push(msg) }
|
||||
});
|
||||
client0.on('remote', function (remote) {
|
||||
setTimeout(function () {
|
||||
remote.message('hello!');
|
||||
}, 25);
|
||||
});
|
||||
client0.pipe(server()).pipe(client0);
|
||||
|
||||
var client1 = dnode({
|
||||
name : '#1',
|
||||
message : function (msg) { recv[1].push(msg) }
|
||||
});
|
||||
client1.on('remote', function (remote) {
|
||||
setTimeout(function () {
|
||||
remote.message('hey');
|
||||
}, 50);
|
||||
});
|
||||
client1.pipe(server()).pipe(client1);
|
||||
|
||||
var client2 = dnode({
|
||||
name : '#2',
|
||||
message : function (msg) { recv[2].push(msg) }
|
||||
});
|
||||
client2.on('remote', function (remote) {
|
||||
setTimeout(function () {
|
||||
remote.message('wowsy');
|
||||
}, 75);
|
||||
});
|
||||
client2.pipe(server()).pipe(client2);
|
||||
|
||||
setTimeout(function () {
|
||||
t.deepEqual(
|
||||
recv[0],
|
||||
[ '#0 says: hello!', '#1 says: hey', '#2 says: wowsy' ],
|
||||
"#0 didn't get the right messages"
|
||||
);
|
||||
t.deepEqual(recv[0], recv[1], "#1 didn't get the messages");
|
||||
t.deepEqual(recv[0], recv[2], "#2 didn't get the messages");
|
||||
}, 150);
|
||||
});
|
33
node_modules/dnode/test/circular.js
generated
vendored
Normal file
33
node_modules/dnode/test/circular.js
generated
vendored
Normal file
@@ -0,0 +1,33 @@
|
||||
var dnode = require('../');
|
||||
var test = require('tape');
|
||||
|
||||
test('circular refs', function (t) {
|
||||
t.plan(7);
|
||||
|
||||
var server = dnode({
|
||||
sendObj : function (ref, f) {
|
||||
t.equal(ref.a, 1);
|
||||
t.equal(ref.b, 2);
|
||||
t.deepEqual(ref.c, ref);
|
||||
|
||||
ref.d = ref.c;
|
||||
|
||||
f(ref);
|
||||
}
|
||||
});
|
||||
|
||||
var client = dnode();
|
||||
client.on('remote', function (remote) {
|
||||
var obj = { a : 1, b : 2 };
|
||||
obj.c = obj;
|
||||
|
||||
remote.sendObj(obj, function (ref) {
|
||||
t.equal(ref.a, 1);
|
||||
t.equal(ref.b, 2);
|
||||
t.deepEqual(ref.c, ref);
|
||||
t.deepEqual(ref.d, ref);
|
||||
});
|
||||
});
|
||||
|
||||
client.pipe(server).pipe(client);
|
||||
});
|
38
node_modules/dnode/test/double.js
generated
vendored
Normal file
38
node_modules/dnode/test/double.js
generated
vendored
Normal file
@@ -0,0 +1,38 @@
|
||||
var dnode = require('../');
|
||||
var test = require('tape');
|
||||
|
||||
test('double', function (t) {
|
||||
t.plan(4);
|
||||
var port = Math.floor(Math.random() * 40000 + 10000);
|
||||
|
||||
var server = dnode({
|
||||
z : function (f, g, h) {
|
||||
f(10, function (x) {
|
||||
g(10, function (y) {
|
||||
h(x,y)
|
||||
})
|
||||
})
|
||||
}
|
||||
});
|
||||
|
||||
var client = dnode();
|
||||
client.on('remote', function (remote) {
|
||||
remote.z(
|
||||
function (x,f) { f(x * 2) },
|
||||
function (x,f) { f(x / 2) },
|
||||
function (x,y) {
|
||||
t.equal(x, 20, 'double, not equal');
|
||||
t.equal(y, 5, 'double, not equal');
|
||||
}
|
||||
);
|
||||
|
||||
function plusTen(n,f) { f(n + 10) }
|
||||
|
||||
remote.z(plusTen, plusTen, function (x,y) {
|
||||
t.equal(x, 20, 'double, equal');
|
||||
t.equal(y, 20, 'double, equal');
|
||||
});
|
||||
});
|
||||
|
||||
client.pipe(server).pipe(client);
|
||||
});
|
61
node_modules/dnode/test/emit.js
generated
vendored
Normal file
61
node_modules/dnode/test/emit.js
generated
vendored
Normal file
@@ -0,0 +1,61 @@
|
||||
var test = require('tape');
|
||||
var EventEmitter = require('events').EventEmitter;
|
||||
var dnode = require('../');
|
||||
|
||||
test('emit events', function (t) {
|
||||
t.plan(1);
|
||||
|
||||
var subs = [];
|
||||
function publish (name) {
|
||||
var args = [].slice.call(arguments, 1);
|
||||
for (var i = 0; i < subs.length; i++) {
|
||||
subs[i].emit(name, args);
|
||||
}
|
||||
}
|
||||
|
||||
var server = function () {
|
||||
return dnode(function (remote, conn) {
|
||||
this.subscribe = function (emit) {
|
||||
subs.push({ emit : emit, id : conn.id });
|
||||
|
||||
conn.on('end', function () {
|
||||
for (var i = 0; i < subs.length; i++) {
|
||||
if (subs.id === conn.id) {
|
||||
subs.splice(i, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
});
|
||||
};
|
||||
|
||||
setTimeout(function () {
|
||||
var times = 0;
|
||||
var iv = setInterval(function () {
|
||||
if (++times === 5) {
|
||||
t.deepEqual(xs, ys);
|
||||
return clearInterval(iv);
|
||||
}
|
||||
else publish('data', Math.floor(Math.random() * 100));
|
||||
}, 20);
|
||||
}, 20);
|
||||
|
||||
var xs = [];
|
||||
var x = dnode();
|
||||
x.on('remote', function (remote) {
|
||||
var em = new EventEmitter;
|
||||
em.on('data', function (n) { xs.push(n) });
|
||||
remote.subscribe(function () { return em.emit.apply(em, arguments) });
|
||||
});
|
||||
x.pipe(server()).pipe(x);
|
||||
|
||||
var ys = [];
|
||||
var y = dnode();
|
||||
y.on('remote', function (remote) {
|
||||
var em = new EventEmitter;
|
||||
em.on('data', function (n) { ys.push(n) });
|
||||
remote.subscribe(function () { return em.emit.apply(em, arguments) });
|
||||
});
|
||||
y.pipe(server()).pipe(y);
|
||||
});
|
51
node_modules/dnode/test/middleware.js
generated
vendored
Normal file
51
node_modules/dnode/test/middleware.js
generated
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
var dnode = require('../');
|
||||
var test = require('tape');
|
||||
|
||||
test('middleware', function (t) {
|
||||
t.plan(5);
|
||||
|
||||
var tf = setTimeout(function () {
|
||||
t.fail('never finished');
|
||||
}, 1000);
|
||||
|
||||
var tr = setTimeout(function () {
|
||||
t.fail('never ready');
|
||||
}, 1000);
|
||||
|
||||
var tc = setTimeout(function () {
|
||||
t.fail('connection not ready');
|
||||
}, 1000);
|
||||
|
||||
var server = dnode(function (client, conn) {
|
||||
var self = this;
|
||||
t.ok(!conn.zing);
|
||||
t.ok(!client.moo);
|
||||
|
||||
conn.on('remote', function () {
|
||||
clearTimeout(tr);
|
||||
t.ok(conn.zing);
|
||||
t.ok(self.moo);
|
||||
});
|
||||
|
||||
this.baz = 42;
|
||||
});
|
||||
|
||||
server.on('local', function (client, conn) {
|
||||
conn.zing = true;
|
||||
});
|
||||
|
||||
server.on('local', function (client, conn) {
|
||||
client.moo = true;
|
||||
conn.on('remote', function () {
|
||||
clearTimeout(tc);
|
||||
});
|
||||
});
|
||||
|
||||
var client = dnode();
|
||||
client.on('remote', function (remote, conn) {
|
||||
clearTimeout(tf);
|
||||
t.ok(remote.baz);
|
||||
});
|
||||
|
||||
server.pipe(client).pipe(server);
|
||||
});
|
48
node_modules/dnode/test/nested.js
generated
vendored
Normal file
48
node_modules/dnode/test/nested.js
generated
vendored
Normal file
@@ -0,0 +1,48 @@
|
||||
var dnode = require('../');
|
||||
var test = require('tape');
|
||||
var EventEmitter = require('events').EventEmitter;
|
||||
|
||||
test('nested', function (t) {
|
||||
t.plan(4);
|
||||
|
||||
var server1 = function () {
|
||||
return dnode({
|
||||
timesTen : function (n,reply) { reply(n * 10) }
|
||||
});
|
||||
};
|
||||
|
||||
var server2 = function () {
|
||||
return dnode({
|
||||
timesTwenty : function (n,reply) { reply(n * 20) }
|
||||
});
|
||||
};
|
||||
|
||||
var moo = new EventEmitter;
|
||||
|
||||
var client1 = dnode();
|
||||
client1.on('remote', function (remote1, conn1) {
|
||||
var client2 = dnode();
|
||||
client2.on('remote', function (remote2, conn2) {
|
||||
moo.on('hi', function (x) {
|
||||
remote1.timesTen(x, function (res) {
|
||||
t.equal(res, 5000, 'emitted value times ten');
|
||||
remote2.timesTwenty(res, function (res2) {
|
||||
t.equal(res2, 100000, 'result times twenty');
|
||||
});
|
||||
});
|
||||
});
|
||||
remote2.timesTwenty(5, function (n) {
|
||||
t.equal(n, 100);
|
||||
remote1.timesTen(0.1, function (n) {
|
||||
t.equal(n, 1);
|
||||
});
|
||||
});
|
||||
});
|
||||
client2.pipe(server2()).pipe(client2);
|
||||
});
|
||||
client1.pipe(server1()).pipe(client1);
|
||||
|
||||
setTimeout(function() {
|
||||
moo.emit('hi', 500);
|
||||
}, 200);
|
||||
});
|
34
node_modules/dnode/test/null.js
generated
vendored
Normal file
34
node_modules/dnode/test/null.js
generated
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
var dnode = require('../');
|
||||
var test = require('tape');
|
||||
|
||||
test('null', function (t) {
|
||||
t.plan(5);
|
||||
|
||||
var server = dnode({
|
||||
empty : null,
|
||||
timesTen : function (n, reply) {
|
||||
t.equal(n, 50);
|
||||
reply(n * 10);
|
||||
},
|
||||
moo : function (reply) { reply(100) },
|
||||
sTimesTen : function (n, cb) {
|
||||
t.equal(n, 5);
|
||||
cb(n * 10, null);
|
||||
}
|
||||
});
|
||||
|
||||
var client = dnode();
|
||||
client.on('remote', function (remote) {
|
||||
remote.moo(function (x) {
|
||||
t.equal(x, 100, 'remote moo == 100');
|
||||
});
|
||||
remote.sTimesTen(5, function (m) {
|
||||
t.equal(m, 50, '5 * 10 == 50');
|
||||
remote.timesTen(m, function (n) {
|
||||
t.equal(n, 500, '50 * 10 == 500');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
server.pipe(client).pipe(server);
|
||||
});
|
29
node_modules/dnode/test/obj.js
generated
vendored
Normal file
29
node_modules/dnode/test/obj.js
generated
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
var dnode = require('../');
|
||||
var test = require('tape');
|
||||
|
||||
test('object ref tests', function (t) {
|
||||
t.plan(8);
|
||||
var obj = { a : 1, b : 2, f : function (n,g) { g(n * 20) } };
|
||||
|
||||
var server = dnode({
|
||||
getObject : function (f) { f(obj) }
|
||||
});
|
||||
|
||||
var client = dnode();
|
||||
client.on('remote', function (remote, conn) {
|
||||
remote.getObject(function (rObj) {
|
||||
t.equal(rObj.a, 1);
|
||||
t.equal(rObj.b, 2);
|
||||
t.equal(typeof rObj.f, 'function');
|
||||
rObj.a += 100; rObj.b += 100;
|
||||
t.equal(obj.a, 1);
|
||||
t.equal(obj.b, 2);
|
||||
t.notEqual(obj.f, rObj.g);
|
||||
t.equal(typeof obj.f, 'function');
|
||||
rObj.f(13, function (res) {
|
||||
t.equal(res, 260);
|
||||
});
|
||||
});
|
||||
});
|
||||
client.pipe(server).pipe(client);
|
||||
});
|
19
node_modules/dnode/test/refs.js
generated
vendored
Normal file
19
node_modules/dnode/test/refs.js
generated
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
var dnode = require('../');
|
||||
var test = require('tape');
|
||||
|
||||
test('refs', function (t) {
|
||||
t.plan(2);
|
||||
|
||||
var server = dnode({
|
||||
a : 1,
|
||||
b : 2
|
||||
});
|
||||
|
||||
var client = dnode();
|
||||
client.on('remote', function (remote) {
|
||||
t.equal(remote.a, 1);
|
||||
t.equal(remote.b, 2);
|
||||
});
|
||||
|
||||
client.pipe(server).pipe(client);
|
||||
});
|
34
node_modules/dnode/test/self-referential.js
generated
vendored
Normal file
34
node_modules/dnode/test/self-referential.js
generated
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
var dnode = require('../')
|
||||
var test = require('tape');
|
||||
|
||||
test('self-referential', function (t) {
|
||||
t.plan(7);
|
||||
|
||||
var server = dnode({
|
||||
timesTen : function (n,reply) {
|
||||
t.equal(n.number, 5);
|
||||
reply(n.number * 10);
|
||||
},
|
||||
print : function (n,reply) {
|
||||
t.strictEqual(n[0],1);
|
||||
t.strictEqual(n[1],2);
|
||||
t.strictEqual(n[2],3);
|
||||
t.strictEqual(n[3],n);
|
||||
reply(n);
|
||||
}
|
||||
});
|
||||
|
||||
var client = dnode();
|
||||
client.on('remote', function (remote) {
|
||||
var args = [1,2,3]
|
||||
args.push(args)
|
||||
|
||||
remote.print(args, function (m) {
|
||||
t.same(m.slice(0,3), args.slice(0,3));
|
||||
t.equal(m, m[3]);
|
||||
t.equal(args, args[3]);
|
||||
});
|
||||
});
|
||||
|
||||
client.pipe(server).pipe(client);
|
||||
});
|
40
node_modules/dnode/test/server/null.js
generated
vendored
Normal file
40
node_modules/dnode/test/server/null.js
generated
vendored
Normal file
@@ -0,0 +1,40 @@
|
||||
var dnode = require('../../');
|
||||
var test = require('tape');
|
||||
|
||||
test('null', function (t) {
|
||||
t.plan(7);
|
||||
var port = Math.floor(Math.random() * 40000 + 10000);
|
||||
|
||||
var server = dnode({
|
||||
empty : null,
|
||||
timesTen : function (n, reply) {
|
||||
t.equal(n, 50);
|
||||
reply(n * 10);
|
||||
},
|
||||
moo : function (reply) { reply(100) },
|
||||
sTimesTen : function (n, cb) {
|
||||
t.equal(n, 5);
|
||||
cb(n * 10, null);
|
||||
},
|
||||
}).listen(port.toString()); // test for stringified ports too why not
|
||||
|
||||
server.on('listening', function () {
|
||||
dnode.connect(port, function (remote, conn) {
|
||||
t.ok(conn.id);
|
||||
t.equal(conn.stream.remoteAddress, '127.0.0.1');
|
||||
|
||||
remote.moo(function (x) {
|
||||
t.equal(x, 100, 'remote moo == 100');
|
||||
});
|
||||
remote.sTimesTen(5, function (m) {
|
||||
t.equal(m, 50, '5 * 10 == 50');
|
||||
remote.timesTen(m, function (n) {
|
||||
t.equal(n, 500, '50 * 10 == 500');
|
||||
conn.end();
|
||||
server.close();
|
||||
t.end();
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
15
node_modules/dnode/test/server/port0.js
generated
vendored
Normal file
15
node_modules/dnode/test/server/port0.js
generated
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
var dnode = require('../../');
|
||||
var test = require('tape');
|
||||
|
||||
test('port0', function (t) {
|
||||
t.plan(2);
|
||||
var port = 0;
|
||||
|
||||
var server = dnode().listen(port);
|
||||
|
||||
server.on('listening', function () {
|
||||
t.ok(server.address().port !== port);
|
||||
t.ok(server.address().port > 0);
|
||||
server.close();
|
||||
});
|
||||
});
|
33
node_modules/dnode/test/server/stream.js
generated
vendored
Normal file
33
node_modules/dnode/test/server/stream.js
generated
vendored
Normal file
@@ -0,0 +1,33 @@
|
||||
var dnode = require('../../');
|
||||
var net = require('net');
|
||||
var test = require('tape');
|
||||
|
||||
test('stream', function (t) {
|
||||
t.plan(2);
|
||||
var port = Math.floor(Math.random() * 40000 + 10000);
|
||||
|
||||
var server = net.createServer(function (stream) {
|
||||
var d = dnode({
|
||||
meow : function f (g) { g('cats') }
|
||||
});
|
||||
d.on('remote', function (remote) {
|
||||
t.equal(remote.x, 5);
|
||||
});
|
||||
stream.pipe(d).pipe(stream);
|
||||
});
|
||||
server.listen(port);
|
||||
|
||||
server.on('listening', function () {
|
||||
var d = dnode({ x : 5 });
|
||||
d.on('remote', function (remote) {
|
||||
remote.meow(function (cats) {
|
||||
t.equal(cats, 'cats');
|
||||
server.close();
|
||||
d.end();
|
||||
});
|
||||
});
|
||||
|
||||
var stream = net.connect(port);
|
||||
d.pipe(stream).pipe(d);
|
||||
});
|
||||
});
|
35
node_modules/dnode/test/server/tcp.js
generated
vendored
Normal file
35
node_modules/dnode/test/server/tcp.js
generated
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
var dnode = require('../../')
|
||||
var test = require('tape');
|
||||
var util = require('util');
|
||||
|
||||
test('simple', function (t) {
|
||||
t.plan(3);
|
||||
var port = Math.floor(Math.random() * 40000 + 10000);
|
||||
|
||||
var server = dnode({
|
||||
timesTen : function (n,reply) {
|
||||
t.equal(n.number, 5);
|
||||
reply(n.number * 10);
|
||||
},
|
||||
print : function (n,reply) {
|
||||
reply(util.inspect(n));
|
||||
},
|
||||
}).listen(port);
|
||||
|
||||
server.on('listening', function () {
|
||||
dnode.connect(port, function (remote, conn) {
|
||||
t.equal(conn.stream.remoteAddress, '127.0.0.1');
|
||||
var args = {
|
||||
number : 5,
|
||||
func : function () {},
|
||||
};
|
||||
|
||||
remote.timesTen(args, function (m) {
|
||||
t.equal(m, 50, '5 * 10 == 50');
|
||||
conn.end();
|
||||
server.close();
|
||||
t.end();
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
26
node_modules/dnode/test/server/unicode.js
generated
vendored
Normal file
26
node_modules/dnode/test/server/unicode.js
generated
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
var dnode = require('../../');
|
||||
var test = require('tape');
|
||||
|
||||
test('unicode', function (t) {
|
||||
t.plan(2);
|
||||
var port = Math.floor(Math.random() * 40000 + 10000);
|
||||
|
||||
var server = dnode({
|
||||
unicodes : function (reply) {
|
||||
reply('☔☔☔☁☼☁❄');
|
||||
}
|
||||
}).listen(port);
|
||||
|
||||
server.on('listening', function () {
|
||||
dnode.connect(port, function (remote, conn) {
|
||||
t.equal(conn.stream.remoteAddress, '127.0.0.1');
|
||||
remote.unicodes(function (str) {
|
||||
t.equal(str, '☔☔☔☁☼☁❄', 'remote unicodes == ☔☔☔☁☼☁❄');
|
||||
|
||||
conn.end();
|
||||
server.close();
|
||||
t.end();
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
23
node_modules/dnode/test/server/unix.js
generated
vendored
Normal file
23
node_modules/dnode/test/server/unix.js
generated
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
var dnode = require('../../');
|
||||
var test = require('tape');
|
||||
|
||||
test('unix', function (t) {
|
||||
t.plan(1);
|
||||
|
||||
var sfile = '/tmp/unix_socket_' + Math.floor(
|
||||
Math.random() * Math.pow(2, 32)
|
||||
).toString(16);
|
||||
|
||||
var server = dnode({ f : function (cb) { cb(1337) } }).listen(sfile);
|
||||
|
||||
server.on('listening', function () {
|
||||
dnode.connect(sfile, function (remote, conn) {
|
||||
remote.f(function (x) {
|
||||
t.equal(x, 1337);
|
||||
server.close();
|
||||
conn.end();
|
||||
t.end();
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
38
node_modules/dnode/test/server/zero.js
generated
vendored
Normal file
38
node_modules/dnode/test/server/zero.js
generated
vendored
Normal file
@@ -0,0 +1,38 @@
|
||||
var dnode = require('../../');
|
||||
var test = require('tape');
|
||||
|
||||
test('listen on port 0', function (t) {
|
||||
t.plan(7);
|
||||
|
||||
var server = dnode({
|
||||
timesTen : function (n,reply) {
|
||||
t.equal(n, 50);
|
||||
reply(n * 10);
|
||||
},
|
||||
moo : function (reply) { reply(100) },
|
||||
sTimesTen : function (n, cb) {
|
||||
t.equal(n, 5);
|
||||
cb(n * 10);
|
||||
},
|
||||
}).listen(0);
|
||||
|
||||
server.on('listening', function () {
|
||||
dnode.connect(server.address().port, function (remote, conn) {
|
||||
t.ok(conn.id);
|
||||
t.equal(conn.stream.remoteAddress, '127.0.0.1');
|
||||
|
||||
remote.moo(function (x) {
|
||||
t.equal(x, 100, 'remote moo == 100');
|
||||
});
|
||||
remote.sTimesTen(5, function (m) {
|
||||
t.equal(m, 50, '5 * 10 == 50');
|
||||
remote.timesTen(m, function (n) {
|
||||
t.equal(n, 500, '50 * 10 == 500');
|
||||
conn.end();
|
||||
server.close();
|
||||
t.end();
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
39
node_modules/dnode/test/simple.js
generated
vendored
Normal file
39
node_modules/dnode/test/simple.js
generated
vendored
Normal file
@@ -0,0 +1,39 @@
|
||||
var dnode = require('../');
|
||||
var test = require('tape');
|
||||
|
||||
test('simple server and client', function (t) {
|
||||
t.plan(5);
|
||||
|
||||
var server = dnode({
|
||||
timesTen : function (n,reply) {
|
||||
t.equal(n, 50);
|
||||
reply(n * 10);
|
||||
},
|
||||
moo : function (reply) { reply(100) },
|
||||
sTimesTen : function (n, cb) {
|
||||
t.equal(n, 5);
|
||||
cb(n * 10);
|
||||
}
|
||||
});
|
||||
|
||||
var client = dnode();
|
||||
client.on('remote', function (remote) {
|
||||
remote.moo(function (x) {
|
||||
t.equal(x, 100, 'remote moo == 100');
|
||||
});
|
||||
remote.sTimesTen(5, function (m) {
|
||||
t.equal(m, 50, '5 * 10 == 50');
|
||||
remote.timesTen(m, function (n) {
|
||||
t.equal(n, 500, '50 * 10 == 500');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
server.on('end', function () {
|
||||
console.log('server END');
|
||||
});
|
||||
client.on('end', function () {
|
||||
console.log('client END');
|
||||
});
|
||||
server.pipe(client).pipe(server);
|
||||
});
|
22
node_modules/dnode/test/stream.js
generated
vendored
Normal file
22
node_modules/dnode/test/stream.js
generated
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
var dnode = require('../');
|
||||
var test = require('tape');
|
||||
|
||||
test('stream', function (t) {
|
||||
t.plan(2);
|
||||
|
||||
var server = dnode({
|
||||
meow : function f (g) { g('cats') }
|
||||
});
|
||||
server.on('remote', function (remote) {
|
||||
t.equal(remote.x, 5);
|
||||
});
|
||||
|
||||
var client = dnode({ x : 5 });
|
||||
client.on('remote', function (remote) {
|
||||
remote.meow(function (cats) {
|
||||
t.equal(cats, 'cats');
|
||||
});
|
||||
});
|
||||
|
||||
client.pipe(server).pipe(client);
|
||||
});
|
Reference in New Issue
Block a user