Skip to content
This repository

Implements the dnode protocol abstractly in node.js

branch: master

Fetching latest commit…

Octocat-spinner-32-eaf2f5

Cannot retrieve the latest commit at this time

Octocat-spinner-32 doc spun off protocol docs into a separate file
Octocat-spinner-32 example
Octocat-spinner-32 lib forgot is_enum
Octocat-spinner-32 test
Octocat-spinner-32 .travis.yml
Octocat-spinner-32 LICENSE
Octocat-spinner-32 index.js swap cull refs around
Octocat-spinner-32 package.json
Octocat-spinner-32 readme.markdown
readme.markdown

dnode-protocol

This module implements the dnode protocol in a reusable form that is presently used for both the server-side and browser-side dnode code.

browser support

build status

Read about the protocol itself here.

example

var proto = require('dnode-protocol');

var s = proto({
    x : function (f, g) {
        setTimeout(function () { f(5) }, 200);
        setTimeout(function () { g(6) }, 400);
    },
    y : 555
});
var c = proto();

s.on('request', c.handle.bind(c));
c.on('request', s.handle.bind(s));

c.on('remote', function (remote) {
    function f (x) { console.log('f(' + x + ')') }
    function g (x) { console.log('g(' + x + ')') }
    remote.x(f, g);
});

s.start();
c.start();

f(5)
g(6)

methods

var protocol = require('dnode-protocol')

var proto = protocol(cons, opts={})

Create a new protocol object with a constructor cons and an optional callback wrapper wrap.

cons should be a function, in which case it will be used to create an instance by new cons(remote, proto) where remote is an empty reference to the remote object before being populated and proto is the protocol instance.

If you return an object in cons the return value will be used (new does that part).

If you pass in a non-function as cons, its value will be used as the instance directly.

You can optionally specify opts.wrap and opts.unwrap to wrap and unwrap remote values for implementing weakmaps or marking callbacks.

The return value of opts.wrap(cb, id) will be stored in proto.callbacks.remote[id] and opts.unwrap(ref, id) will be called with the ref obtained from wrap() previously to turn ref back into a cb.

proto.handle(req)

Handle a request object emitted by the request event, calling the method the request mentions with the provided arguments.

proto.request(method, args)

Emit a request event for the method id method and the raw arguments args. The args will be scrubbed for callbacks and emitted in normal form suitable for passing to JSON.stringify().

proto.start()

Begin the methods exchange. All listeners should be bound before this function is called.

proto.cull(id)

Instruct the opposing connection to drop all references to the callback specified by id.

events

proto.on('request', function (req) { ... })

Emitted when a request is ready to be sent.

The request should be serialized and passed to the opposing connection's .handle().

proto.on('remote', function (remote) { ... })

Emitted when the remote reference has been populated.

proto.on('fail', function (err) { ... })

Emitted when there is a non-fatal failed request.

proto.on('error', function (err) { ... })

Emitted when there is a fatal exception one of the local callbacks.

install

With npm do:

npm install dnode-protocol

license

MIT

Something went wrong with that request. Please try again.