Socket
Socket
Sign inDemoInstall

jayson

Package Overview
Dependencies
10
Maintainers
1
Versions
54
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 1.2.2 to 2.0.0

.jshintrc

13

examples/http_server_and_client/client.js

@@ -1,11 +0,10 @@

var jayson = require(__dirname + '/../../');
var jayson = require(__dirname + '/../..');
var client = jayson.client.http({ port: 3000, host: 'localhost' });
client.request('echo', ['Hello, world!'], function(err, reply) {
console.log(reply);
var client = jayson.client.http({
port: 3000
});
client.request('multiply', [5, 5], function(err, reply) {
console.log(reply);
client.request('multiply', [5, 5], function(err, error, result) {
if(err) throw err;
console.log(result); // 25
});

@@ -1,9 +0,6 @@

var jayson = require(__dirname + '/../../');
var jayson = require(__dirname + '/../..');
var server = jayson.server({
echo: function(msg, callback) {
callback(null, msg);
},
multiply: function(a, b, callback) {
callback(null, a * b);
multiply: function(args, callback) {
callback(null, args[0] * args[1]);
}

@@ -14,2 +11,2 @@ });

console.log('Server listening on http://localhost:3000');
})
});
var jayson = require(__dirname + '/../..');
var server = jayson.server({
add: function(a, b, callback) {
return callback(null, a + b);
}
});
var server = jayson.server();

@@ -19,7 +15,7 @@ // "http" will be an instance of require('http').Server

http.listen(80, function() {
console.log('Listening on *:80')
console.log('Listening on *:80');
});
https.listen(443, function() {
console.log('Listening on *:443')
console.log('Listening on *:443');
});
var jayson = require(__dirname + '/../..');
// create a client
var client = jayson.client.http({
port: 3000,
hostname: 'localhost'
port: 3000
});
// invoke "addCollect" with array
client.request('addCollect', [3, 5, 9, 11], function(err, response) {
// invoke "sumCollect" with array
client.request('sumCollect', [3, 5, 9, 11], function(err, response) {
if(err) throw err;

@@ -15,4 +13,4 @@ console.log(response.result); // 28

// invoke "addCollect" with object
client.request('addCollect', {a: 2, b: 3, c: 4}, function(err, response) {
// invoke "sumCollect" with object
client.request('sumCollect', {a: 2, b: 3, c: 4}, function(err, response) {
if(err) throw err;

@@ -22,4 +20,4 @@ console.log(response.result); // 9

// invoke "addDefault" with object missing some defined members
client.request('addDefault', {b: 10}, function(err, response) {
// invoke "sumDefault" with object missing some defined members
client.request('sumDefault', {b: 10}, function(err, response) {
if(err) throw err;

@@ -29,6 +27,11 @@ console.log(response.result); // 12

// invoke "acceptArray" with an Object
client.request('acceptArray', {a: 5, b: 2, c: 9}, function(err, response) {
// invoke "isArray" with an Object
client.request('isArray', {a: 5, b: 2, c: 9}, function(err, response) {
if(err) throw err;
console.log(response.result); // true
});
client.request('sum', [1, 2, 3], function(err, response) {
if(err) throw err;
console.log(response.result); // 6
});

@@ -6,4 +6,9 @@ var jayson = require(__dirname + '/../..');

// this function will be wrapped in jayson.Method with options given to the server
sum: function(args, done) {
done(null, sum(args));
},
// this method gets the raw params as first arg to handler
addCollect: new jayson.Method({
sumCollect: new jayson.Method({
handler: function(args, done) {

@@ -17,3 +22,3 @@ var total = sum(args);

// specifies some default values (alternate definition too)
addDefault: jayson.Method(function(args, done) {
sumDefault: jayson.Method(function(args, done) {
var total = sum(args);

@@ -27,3 +32,3 @@ done(null, total);

// this method returns true when it gets an array (which it always does)
acceptArray: new jayson.Method({
isArray: new jayson.Method({
handler: function(args, done) {

@@ -39,7 +44,11 @@ var result = _.isArray(args);

var server = jayson.server(methods);
var server = jayson.server(methods, {
// Given as options to jayson.Method when adding the method "sum"
collect: true,
params: Array
});
server.http().listen(3000);
// sums all enumerable properties in a list
// sums all numbers in an array
function sum(list) {

@@ -46,0 +55,0 @@ return _.reduce(list, function(sum, val) {

@@ -5,11 +5,9 @@ var jayson = require(__dirname + '/../..');

var client = jayson.client.http({
port: 3000,
hostname: 'localhost'
port: 3000
});
// invoke "add_2"
client.request('add_2', [3], function(err, error, response) {
client.request('add_2', [3], function(err, response) {
if(err) throw err;
console.log(response); // 5!
console.log(response.result); // 5!
});
var jayson = require(__dirname + '/../..');
var format = require('util').format;
var methods = {
add: function(a, b, callback) {
callback(null, a + b);
add: function(args, callback) {
callback(null, args[0] + args[1]);
}

@@ -11,3 +10,3 @@ };

var server = jayson.server(methods, {
router: function(method) {
router: function(method, params) {
// regular by-name routing first

@@ -17,3 +16,6 @@ if(typeof(this._methods[method]) === 'function') return this._methods[method];

var fn = server.getMethod('add').getHandler();
return jayson.Method(fn.bind(null, 2));
return new jayson.Method(function(args, done) {
args.unshift(2);
fn(args, done);
});
}

@@ -20,0 +22,0 @@ }

@@ -6,4 +6,4 @@ var jayson = require(__dirname + '/../..');

var server = jayson.server({
add: function(a, b, callback) {
callback(null, a + b);
add: function(args, callback) {
callback(null, args[0] + args[1]);
}

@@ -10,0 +10,0 @@ });

@@ -1,11 +0,10 @@

var jayson = require(__dirname + '/../../');
var jayson = require(__dirname + '/../..');
var client = jayson.client.http({
host: 'localhost',
port: 3000
});
client.request('add', {b: 1, a: 2}, function(err, error, response) {
client.request('add', {b: 1, a: 2}, function(err, response) {
if(err) throw err;
console.log(response); // 3!
console.log(response.result); // 3!
});

@@ -7,4 +7,6 @@ var jayson = require(__dirname + '/../..');

}
}, {
collect: false // don't collect params in a single argument
});
server.http().listen(3000);
var jayson = require(__dirname + '/../..');
var client = jayson.client.http({
host: 'localhost',
port: 3000

@@ -11,3 +10,3 @@ });

if(err) throw err;
// request was received successfully
console.log('ok'); // request was received successfully
});
var jayson = require(__dirname + '/../..');
var server = jayson.server({
ping: function(callback) {
// do something
ping: function(args, callback) {
// do something, do nothing
callback();

@@ -7,0 +7,0 @@ }

var jayson = require(__dirname + '/../..');
var client = jayson.client.http({
hostname: 'localhost',
port: 3000 // the port of the public server
port: 3000 // the port of the frontend server
});
client.request('add', [5, 9], function(err, error, result) {
client.request('add', [5, 9], function(err, response) {
if(err) throw err;
console.log(result); // 14!
console.log(response.result); // 14
});
var jayson = require(__dirname + '/../..');
var server = jayson.server({
add: function(a, b, callback) {
callback(null, a + b);
add: function(args, callback) {
callback(null, args[0] + args[1]);
}
});
// let the private server listen to localhost:3001
server.http().listen(3001, '127.0.0.1', function() {
console.log('Listening on 127.0.0.1:3001');
});
// let the backend listen to *:3001
server.http().listen(3001);

@@ -6,3 +6,2 @@ var jayson = require(__dirname + '/../..');

add: jayson.client.http({
hostname: 'localhost',
port: 3001

@@ -12,5 +11,3 @@ })

// let the server listen to *:3000
server.http().listen(3000, function() {
console.log('Listening on *:3000');
});
// let the frontend server listen to *:3000
server.http().listen(3000);
var jayson = require(__dirname + '/../..');
var shared = require('./shared');
// create a client with the shared reviver and replacer
var client = jayson.client.http({
port: 3000,
hostname: 'localhost',
reviver: shared.reviver,

@@ -13,10 +11,15 @@ replacer: shared.replacer

// create the object
var instance = new shared.Counter(2);
var params = {
counter: new shared.Counter(2)
};
// invoke "increment"
client.request('increment', [instance], function(err, error, result) {
client.request('increment', params, function(err, response) {
if(err) throw err;
console.log(result instanceof shared.Counter); // true
console.log(result.count); // 3!
console.log(instance === result); // false - it won't be the same object, naturally
var result = response.result;
console.log(
result instanceof shared.Counter, // true
result.count, // 3
params.counter === result // false - result is a new object
);
});

@@ -12,9 +12,8 @@ var jayson = require(__dirname + '/../..');

var server = jayson.server({
increment: function(counter, callback) {
counter.increment();
callback(null, counter);
increment: function(args, callback) {
args.counter.increment();
callback(null, args.counter);
}
}, options);
// let the server listen to for http connections on localhost:3000
server.http().listen(3000);

@@ -18,3 +18,3 @@ var Counter = exports.Counter = function(value) {

if(value && value.$class === 'counter') {
var obj = new Counter;
var obj = new Counter();
for(var prop in value.$props) obj[prop] = value.$props[prop];

@@ -21,0 +21,0 @@ return obj;

@@ -5,10 +5,9 @@ var jayson = require(__dirname + '/../..');

var client = jayson.client.http({
port: 3000,
hostname: 'localhost'
port: 3000
});
// invoke "add"
client.request('add', [1, 1], function(err, error, response) {
client.request('add', [1, 1], function(err, response) {
if(err) throw err;
console.log(response); // 2!
console.log(response.result); // 2
});

@@ -5,8 +5,7 @@ var jayson = require(__dirname + '/../..');

var server = jayson.server({
add: function(a, b, callback) {
callback(null, a + b);
add: function(args, callback) {
callback(null, args[0] + args[1]);
}
});
// Bind a http interface to the server and let it listen to localhost:3000
server.http().listen(3000);
var jayson = require(__dirname + '/../..');
var fs = require('fs')
var path = require('path')
var fs = require('fs');
var path = require('path');

@@ -21,5 +21,5 @@ // Read node's tls documentation for more information about these options:

// invoke "add"
client.request('add', [1, 1], function(err, error, response) {
client.request('add', [1, 1], function(err, response) {
if(err) throw err;
console.log(response); // 2!
console.log(response.result); // 2
});

@@ -17,4 +17,4 @@ var jayson = require(__dirname + '/../..');

var server = jayson.server({
add: function(a, b, callback) {
callback(null, a + b);
add: function(args, callback) {
callback(null, args[0] + args[1]);
}

@@ -21,0 +21,0 @@ });

var https = require('https');
var utils = require('../utils');
var HttpClient = require('./http');

@@ -4,0 +3,0 @@

@@ -11,6 +11,6 @@ var jayson = require(__dirname);

* @param {Function} [options.handler] - Same as separate handler
* @param {Boolean} [options.collect=false] - Params to the handler are collected in one object
* @param {Boolean} [options.collect=true] - Params to the handler are collected in one object
* @param {Array|Object} [options.params] - Defines params that the handler accepts
*/
var Method = module.exports = function(handler, options) {
var Method = function(handler, options) {

@@ -28,3 +28,3 @@ if(!(this instanceof Method)) {

var defaults = {
collect: false
collect: true
};

@@ -36,5 +36,6 @@

this.handler = handler || options.handler;
};
module.exports = Method;
/**

@@ -57,18 +58,13 @@ * @summary Returns the handler function associated with this method

/**
* @summary Executes this method in the context of a server
* @param {ServerHttp} server
* @param {Array|Object} params
* @param {Function} callback
* @summary Prepare parameters for the method handler
* @api private
*/
Method.prototype.execute = function(server, params, callback) {
Method.prototype._getHandlerParams = function(params) {
var options = this.options;
var handler = this.getHandler();
var options = this.options;
var callParams = null;
var objectParams = !_.isArray(params) && _.isObject(params) && params;
var arrayParams = _.isArray(params);
var isObjectParams = !_.isArray(params) && _.isObject(params) && params;
var isArrayParams = _.isArray(params);
if(options.collect) {
// collect parameters in one argument to handler

@@ -78,62 +74,62 @@

// handler should always be given an array
// handler always gets an array
case options.params === Array:
callParams = objectParams ? _.toArray(params) : params;
break;
return isArrayParams ? params : _.toArray(params);
// handler should always be given an object
// handler always gets an object
case options.params === Object:
callParams = arrayParams ? _.pick(params, _.keys(params)) : params;
break;
return isObjectParams ? params : _.toPlainObject(params);
// handler has a list of defined properties that should always be set
// handler gets a list of defined properties that should always be set
case _.isArray(options.params):
var undefinedParams = _.object(_.zip(options.params, _.range(options.params.length).map(_.constant(undefined))));
callParams = _.extend(undefinedParams, _.pick(params, _.keys(params)));
break;
return _.extend(undefinedParams, _.pick(params, _.keys(params)));
// handler has a map of defined properties and their default values
case _.isObject(options.params):
callParams = _.extend({}, options.params, _.pick(params, _.keys(params)));
break;
// handler gets a map of defined properties and their default values
case _.isPlainObject(options.params):
return _.extend({}, options.params, _.pick(params, _.keys(params)));
// give params as is
default:
callParams = params;
return params;
}
return handler.call(server, callParams, callback);
} else {
// let the arguments pass to the handler as given
// let parameters be sent as given to the handler
var args = [];
if(objectParams) {
if(isObjectParams) {
// named parameters passed, take all parameters for handler except last (the callback)
var parameters = _.initial(utils.getParameterNames(handler));
args = args.concat(parameters.map(function(name) {
return _.initial(utils.getParameterNames(handler)).map(function(name) {
return params[name];
}));
});
}
// regular parameters array passed
if(arrayParams) {
args = args.concat(params);
}
return params;
}
};
args = args.concat(callback);
/**
* @summary Executes this method in the context of a server
* @param {ServerHttp} server
* @param {Array|Object} requestParams
* @param {Function} callback
*/
Method.prototype.execute = function(server, requestParams, callback) {
var options = this.options;
var handler = this.getHandler();
var params = this._getHandlerParams(requestParams);
if (args.length != handler.length) {
return callback(server.error(jayson.Server.errors.INVALID_PARAMS));
} else {
return handler.apply(server, args);
}
if(options.collect) {
return handler.call(server, params, callback);
}
// compare without the callback
if(handler.length !== (params.length + 1)) {
callback(server.error(jayson.Server.errors.INVALID_PARAMS));
return;
}
return handler.apply(server, _.flatten([params, callback]));
};
var _ = require('lodash');
var JSONStream = require('JSONStream');
var JSONstringify = require('json-stringify-safe');

@@ -15,3 +16,5 @@ /** * @namespace */

* @param {String|Number|null} [id] Request ID can be a string, number, null for explicit notification or left out for automatic generation
* @param {Object} [options] Optional name => value pairs of settings
* @param {Object} [options]
* @param {Number} [options.version=2] - JSON-RPC version to use (1 or 2)
* @param {Function} [options.generator] - Function that is passed the request, and the options object and is expected to return a request ID
* @throws {TypeError} If any of the parameters are invalid

@@ -45,3 +48,3 @@ * @return {Object} A JSON-RPC 1.0 or 2.0 request

request.params = params;
}

@@ -56,3 +59,3 @@

}
return request;

@@ -103,3 +106,3 @@ };

*/
Utils.merge = function(){
Utils.merge = function() {
return _.extend.apply(null, arguments);

@@ -271,10 +274,12 @@ };

Utils.JSON.parse = function(str, options, callback) {
var reviver = null;
var obj = null;
options = options || {};
if(_.isFunction(options.reviver)) {
var reviver = options.reviver;
reviver = options.reviver;
}
try {
var obj = JSON.parse.apply(JSON, _.compact([str, reviver]));
obj = JSON.parse.apply(JSON, _.compact([str, reviver]));
} catch(err) {

@@ -294,10 +299,12 @@ return callback(err);

Utils.JSON.stringify = function(obj, options, callback) {
var replacer = null;
var str = null;
options = options || {};
if(_.isFunction(options.replacer)) {
var replacer = options.replacer;
replacer = options.replacer;
}
try {
var str = JSON.stringify.apply(JSON, _.compact([obj, replacer]));
str = JSONstringify.apply(JSON, _.compact([obj, replacer]));
} catch(err) {

@@ -440,3 +447,3 @@ return callback(err);

)
|| version === 2 && (
|| version === 2 && (
error

@@ -443,0 +450,0 @@ && typeof(error.code) === 'number'

{
"name": "jayson",
"version": "1.2.2",
"version": "2.0.0",
"description": "JSON-RPC 1.0/2.0 compliant server and client",

@@ -35,5 +35,2 @@ "license": "MIT",

"main": "index",
"engines": {
"node": ">= 0.4.0"
},
"contributors": [

@@ -63,3 +60,5 @@ "Tedde Lundgren <mail@tedeh.net> (http://tedeh.net)",

"eyes": "0.1.8",
"lodash": "3.6.0"
"json-stringify-safe": "5.0.1",
"lodash": "3.6.0",
"es6-promisify": "3.0.0"
},

@@ -69,7 +68,9 @@ "devDependencies": {

"connect": "2.15.0",
"es6-promise": "3.0.2",
"jshint": "2.9.1",
"mocha": "2.1.0",
"pass-stream": "0.1.3",
"should": "5.2.0",
"should": "8.2.1",
"uglify-js": "2.4.13"
}
}

@@ -18,3 +18,3 @@ # Jayson

- [Installation](#installation)
- [Changelog](#changelog-notable-milestones)
- [Changelog](#changelog-only-notable-milestones)
- [Requirements](#requirements)

@@ -40,2 +40,3 @@ - [Class Documentation](#class-documentation)

- [Named parameters](#named-parameters)
- [Promises](#promises)
- [Contributing](#contributing)

@@ -51,2 +52,3 @@

* CLI client
* Promises
* Fully tested to comply with the [official JSON-RPC 2.0 specification][jsonrpc-spec]

@@ -59,3 +61,3 @@ * Also supports [JSON-RPC 1.0][jsonrpc1-spec]

Server in [examples/simple_example/server.js](examples/simple_example/server.js):
Server example in [examples/simple_example/server.js](examples/simple_example/server.js):

@@ -67,12 +69,11 @@ ```javascript

var server = jayson.server({
add: function(a, b, callback) {
callback(null, a + b);
add: function(args, callback) {
callback(null, args[0] + args[1]);
}
});
// Bind a http interface to the server and let it listen to localhost:3000
server.http().listen(3000);
```
Client in [examples/simple_example/client.js](examples/simple_example/client.js) invoking `add` on the above server:
Client example in [examples/simple_example/client.js](examples/simple_example/client.js) invoking `add` on the above server:

@@ -84,10 +85,9 @@ ```javascript

var client = jayson.client.http({
port: 3000,
hostname: 'localhost'
port: 3000
});
// invoke "add"
client.request('add', [1, 1], function(err, error, response) {
client.request('add', [1, 1], function(err, response) {
if(err) throw err;
console.log(response); // 2!
console.log(response.result); // 2
});

@@ -100,5 +100,8 @@ ```

## Changelog (notable milestones)
## Changelog (only notable milestones)
- *1.2*
- *2.0.0*
- Added [support for promises](#promises)
- _Breaking_: `collect: true` is now the default option for a new `jayson.Server` and `jayson.Method`
- *1.2.0*
- Greatly improved [server method definition](#method-definition)

@@ -111,4 +114,2 @@ - *1.1.1*

Add support for a HTTPS client
- *1.0.10*
Bugfixes
- *1.0.9*

@@ -125,5 +126,4 @@ Add support for TCP servers and clients

- node.js v0.8.x
- node.js v0.10.x
- node.js v0.12.x
- node.js 0.10
- node.js 0.12
- iojs

@@ -140,7 +140,4 @@

- Change directory to the repository root
- Install the testing framework
([mocha](https://github.com/visionmedia/mocha) together with
[should](https://github.com/visionmedia/should.js)) by executing `npm install
--dev`
- Run the tests with `make test` or `npm test`
- Install the development packages by executing `npm install --dev`
- Run the tests with `make test`

@@ -155,14 +152,18 @@ ## Usage

* `Client` Base class for interfacing with a server.
* `Client.tcp` TCP interface
* `Client.tls` TLS interface
* `Client.http` HTTP interface
* `Client.https` HTTPS interface
| Name | Description |
| --------------- | --------------- |
| `Client` | Base class |
| `Client.tcp` | TCP interface |
| `Client.tls` | TLS interface |
| `Client.http` | HTTP interface |
| `Client.https` | HTTPS interface |
Every client supports these options:
* `reviver` -> Function to use as a JSON reviver
* `replacer` -> Function to use as a JSON replacer
* `generator` -> Function to generate request ids with. If omitted, Jayson will just generate a "random" number that is [RFC4122][rfc_4122_spec] compliant and looks similar to this: `3d4be346-b5bb-4e28-bc4a-0b721d4f9ef9`
* `version` -> Can be either `1` or `2` depending on which specification should be followed in communicating with the server. Defaults to `2` for [JSON-RPC 2.0][jsonrpc-spec]
| Option | Default | Type | Description |
|------------- |------------------------------------ |------------ |---------------------------------------------------------- |
| `reviver` | `undefined` | `Function` | `JSON.parse` reviver |
| `replacer` | `undefined` | `Function` | `JSON.stringify` replacer |
| `generator` | [RFC4122][rfc_4122_spec] generator | `Function` | Generates a `String` for request ID. |
| `version` | 2 | `Number` | JSON-RPC version to support (1 or 2) |

@@ -175,3 +176,5 @@ [rfc_4122_spec]: http://www.ietf.org/rfc/rfc4122.txt

* `encoding` -> String that determines the encoding to use and defaults to utf8
| Option | Default | Type | Description |
|------------ |--------- |---------- |-------------------------------- |
| `encoding` | `utf8` | `String` | Determines the encoding to use |

@@ -182,12 +185,13 @@ ###### Client.http Events

* `http request` Emitted when the client has just created a HTTP request. First argument is an instance of `http.ClientRequest`
* `http response` Emitted when the client has received an HTTP response. First argument is an instance of `http.IncomingMessage` and second argument an instance of `http.ClientRequest`.
* `http error` Emitted when the underlying stream emits `error`. First argument is the error.
* `http timeout` Emitter when the underlying stream emits `timeout`. When emitted, it will automatically cause the request to abort.
| Event | When | Arguments | Notes |
|----------------- |----------------------------------- |--------------------------------------------------------------------------- |------------------------------------------- |
| `http request` | Created an HTTP request | 1: Instance of `http.ClientRequest` | |
| `http response` | Received an HTTP response | 1. Instance of `http.IncomingMessage` 2. Instance of `http.ClientRequest` | |
| `http error` | Underlying stream emits `error` | 1. Error | |
| `http timeout` | Underlying stream emits `timeout` | | Automatically causes the request to abort |
It is possible to pass a string URL as the first argument. The URL will be run through [url.parse][nodejs_docs_url_parse]. Example:
```javascript
var jayson = require(__dirname + '/../..');
var jayson = require('jayson');
var client = jayson.client.http('http://localhost:3000');

@@ -221,3 +225,3 @@ // client.options is now the result of url.parse

Client in [examples/notifications/client.js](examples/notifications/client.js) doing a notification request:
Client example in [examples/notifications/client.js](examples/notifications/client.js) doing a notification request:

@@ -228,3 +232,2 @@ ```javascript

var client = jayson.client.http({
host: 'localhost',
port: 3000

@@ -236,7 +239,8 @@ });

if(err) throw err;
// request was received successfully
console.log('ok'); // request was received successfully
});
```
A server in [examples/notifications/server.js](examples/notifications/server.js):
Server example in [examples/notifications/server.js](examples/notifications/server.js):
```javascript

@@ -246,4 +250,4 @@ var jayson = require(__dirname + '/../..');

var server = jayson.server({
ping: function(callback) {
// do something
ping: function(args, callback) {
// do something, do nothing
callback();

@@ -265,13 +269,17 @@ }

A batch request is an array of individual requests that are sent to the server as one. Doing a batch request is very simple in Jayson and consists of constructing an `Array` of individual requests (created by not passing a callback to `Client.prototype.request`) that is then itself passed to `Client.prototype.request`.
A batch request is an array of individual requests that are sent to the server as one. Doing a batch request is very simple in Jayson and consists of constructing an array of individual requests (created by not passing a callback to `Client.prototype.request`) that is then itself passed to `Client.prototype.request`.
Client example in [examples/batch_request/client.js](examples/batch_request/client.js):
Combined server/client example in [examples/batch_request/index.js](examples/batch_request/index.js):
```javascript
var jayson = require(__dirname + '/../..');
var client = jayson.client.http({
host: 'localhost',
port: 3000
var server = jayson.server({
add: function(args, callback) {
callback(null, args[0] + args[1]);
}
});
var client = jayson.client(server);
var batch = [

@@ -283,33 +291,14 @@ client.request('does_not_exist', [10, 5]),

// callback takes two arguments (first type of callback)
client.request(batch, function(err, responses) {
client.request(batch, function(err, errors, successes) {
if(err) throw err;
// responses is an array of errors and successes together
console.log('responses', responses);
console.log('errors', errors); // array of requests that errored
console.log('successes', successes); // array of requests that succeeded
});
// callback takes three arguments (second type of callback)
client.request(batch, function(err, errors, successes) {
client.request(batch, function(err, responses) {
if(err) throw err;
// errors is an array of the requests that errored
console.log('errors', errors);
// successes is an array of requests that succeded
console.log('successes', successes);
console.log('responses', responses); // all responses together
});
```
Server example in [examples/batch_request/server.js](examples/batch_request/server.js):
```javascript
var jayson = require(__dirname + '/../..');
var server = jayson.server({
add: function(a, b, callback) {
callback(null, a + b);
}
});
server.http().listen(3000);
```
##### Notes

@@ -333,4 +322,6 @@

* `request` Emitted when a client is just about to dispatch a request. First argument is the request object.
* `response` Emitted when a client has just received a reponse. First argument is the request object, second argument is the response as received.
| Event | When | Arguments | Notes |
|------------ |----------------------------- |----------------------------------------------- |------- |
| `request` | About to dispatch a request | 1: Request object | |
| `response` | Received a response | 1: Request object 2: Response object received | |

@@ -345,8 +336,10 @@ ### Server

* `Server` - Base interface for a server that supports receiving JSON-RPC 2.0 requests.
* `Server.tcp` - TCP server that inherits from [net.Server][nodejs_doc_net_server].
* `Server.tls` - TLS server that inherits from [tls.Server][nodejs_doc_tls_server].
* `Server.http` - HTTP server that inherits from [http.Server][nodejs_doc_http_server].
* `Server.https` - HTTPS server that inherits from [https.Server][nodejs_doc_https_server].
* `Server.middleware` - Method that returns a [Connect][connect]/[Express][express] compatible middleware function.
| Name | Description |
|--------------------- |-------------------------------------------------------------------------------------------- |
| `Server` | Base interface for a server that supports receiving JSON-RPC requests |
| `Server.tcp` | TCP server that inherits from [net.Server][nodejs_doc_net_server] |
| `Server.tls` | TLS server that inherits from [tls.Server][nodejs_doc_tls_server] |
| `Server.http` | HTTP server that inherits from [http.Server][nodejs_doc_http_server] |
| `Server.https` | HTTPS server that inherits from [https.Server][nodejs_doc_https_server] |
| `Server.middleware` | Method that returns a [Connect][connect]/[Express][express] compatible middleware function |

@@ -360,10 +353,13 @@ [nodejs_doc_net_server]: http://nodejs.org/docs/latest/api/net.html#net_class_net_server

Every server supports these options:
Servers supports these options:
* `reviver` -> Function to use as a JSON reviver
* `replacer` -> Function to use as a JSON replacer
* `router` -> Function to find which method to use for a request. See the chapter on [method routing](#method-routing).
* `collect` -> Collect JSON-RPC parameters inside a single function argument. Default `false`. See [method definition](#method-definition)
* `params` -> Force collected JSON-RPC parameters to be `Object` or `Array`. Default `false`. See [method definition](#method-definition)
* `version` -> Can be either `1` or `2` depending on which specification clients are expected to follow. Defaults to `2` for [JSON-RPC 2.0][jsonrpc-spec]
| Option | Default | Type | Description |
|--------------------- |----------------- |--------------------- |----------------------------------------------------------- |
| `reviver` | `null` | `Function` | `JSON.parse` reviver |
| `replacer` | `null ` | `Function` | `JSON.stringify` replacer |
| `router` | `null ` | `Function` | Return the function for [method routing](#method-routing) |
| `collect` | `true` | `Boolean` | Passed to `methodConstructor` options |
| `params` | `undefined` | `Array|Object|null` | Passed to `methodConstructor` options |
| `methodConstructor` | `jayson.Method` | `Function` | Server functions are made an instance of this class |
| `version` | 2 | `Number` | JSON-RPC version to support (1 or 2) |

@@ -392,3 +388,5 @@ ##### Server.tcp

* `end` Defaults to `true`. If set to `false` will cause the middleware to `next()` instead of `res.end()` at the end of a request. `res.body` and the response header may or may not be set when the next middleware is called.
| Option | Default | Type | Description |
|-------- |--------- |----------- |------------------------------------------------------------------------------------------- |
| `end` | `true` | `Boolean` | If set to `false` causes the middleware to `next()` instead of `res.end()` when finished. |

@@ -403,4 +401,4 @@ Middleware example in [examples/middleware/server.js](examples/middleware/server.js):

var server = jayson.server({
add: function(a, b, callback) {
callback(null, a + b);
add: function(args, callback) {
callback(null, args[0] + args[1]);
}

@@ -414,3 +412,3 @@ });

app.listen(3000);
````
```

@@ -421,3 +419,3 @@ #### Using many server interfaces at the same time

Server in [examples/many_interfaces/server.js](examples/many_interfaces/server.js) that listens to both `http` and a `https` requests:
Server example in [examples/many_interfaces/server.js](examples/many_interfaces/server.js) that listens to both `http` and a `https` requests:

@@ -427,7 +425,3 @@ ```javascript

var server = jayson.server({
add: function(a, b, callback) {
return callback(null, a + b);
}
});
var server = jayson.server();

@@ -444,7 +438,7 @@ // "http" will be an instance of require('http').Server

http.listen(80, function() {
console.log('Listening on *:80')
console.log('Listening on *:80');
});
https.listen(443, function() {
console.log('Listening on *:443')
console.log('Listening on *:443');
});

@@ -457,3 +451,3 @@ ```

Public server in [examples/relay/server_public.js](examples/relay/server_public.js) listening on `*:3000`:
Frontend server example in [examples/relay/server_public.js](examples/relay/server_public.js) listening on `*:3000`:

@@ -466,3 +460,2 @@ ```javascript

add: jayson.client.http({
hostname: 'localhost',
port: 3001

@@ -472,9 +465,7 @@ })

// let the server listen to *:3000
server.http().listen(3000, function() {
console.log('Listening on *:3000');
});
// let the frontend server listen to *:3000
server.http().listen(3000);
```
Private server in [examples/relay/server_private.js](examples/relay/server_private.js) listening on localhost:3001:
Backend server example in [examples/relay/server_private.js](examples/relay/server_private.js) listening on `*:3001`:

@@ -485,11 +476,9 @@ ```javascript

var server = jayson.server({
add: function(a, b, callback) {
callback(null, a + b);
add: function(args, callback) {
callback(null, args[0] + args[1]);
}
});
// let the private server listen to localhost:3001
server.http().listen(3001, '127.0.0.1', function() {
console.log('Listening on 127.0.0.1:3001');
});
// let the backend listen to *:3001
server.http().listen(3001);
```

@@ -503,11 +492,10 @@

Server with custom routing logic in [examples/method_routing/server.js](examples/method_routing/server.js):
Server example with custom routing logic in [examples/method_routing/server.js](examples/method_routing/server.js):
```javascript
var jayson = require(__dirname + '/../..');
var format = require('util').format;
var methods = {
add: function(a, b, callback) {
callback(null, a + b);
add: function(args, callback) {
callback(null, args[0] + args[1]);
}

@@ -517,6 +505,12 @@ };

var server = jayson.server(methods, {
router: function(method) {
router: function(method, params) {
// regular by-name routing first
if(typeof(this._methods[method]) === 'function') return this._methods[method];
if(method === 'add_2') return this._methods.add.bind(this, 2);
if(method === 'add_2') {
var fn = server.getMethod('add').getHandler();
return new jayson.Method(function(args, done) {
args.unshift(2);
fn(args, done);
});
}
}

@@ -528,3 +522,3 @@ });

Client in [examples/method_routing/client.js](examples/method_routing/client.js) invoking `add_2` on the above server:
Client example in [examples/method_routing/client.js](examples/method_routing/client.js) invoking `add_2` on the above server:

@@ -536,18 +530,17 @@ ```javascript

var client = jayson.client.http({
port: 3000,
hostname: 'localhost'
port: 3000
});
// invoke "add_2"
client.request('add_2', [3], function(err, error, response) {
client.request('add_2', [3], function(err, response) {
if(err) throw err;
console.log(response); // 5!
console.log(response.result); // 5!
});
```
An example of nested routes where each property is separated by a dot (you do not need to use the router option for this):
Server example of nested routes where each property is separated by a dot (you do not need to use the router option for this):
```javascript
var _ = require('lodash');
var jayson = require(__dirname + '/../..');
var jayson = require('jayson');

@@ -561,4 +554,4 @@ var methods = {

math: {
add: function(a, b, callback) {
callback(null, a + b);
add: function(args, callback) {
callback(null, args[0] + args[1]);
}

@@ -580,3 +573,2 @@ }

}
```

@@ -592,6 +584,14 @@

You can also define server methods inside a wrapping object named `jayson.Method`. This allows additional options about the method to be specified. It is possible to define what kind of params it expects, default values for these params, and wheter or not all JSON-RPC params should be collected in a single argument to the function. Using this wrapper, it is for instance trivial to have your method accept a variable amount of arguments.
You can also define server methods inside a wrapping object named `jayson.Method`. This allows additional options about the method to be specified. Using this wrapper - explicitly or implicitly (via server options) - it is for instance trivial to have your method accept a variable amount of arguments.
Server example showcasing most features in [examples/method_definitions/server.js](examples/method_definitions/server.js):
The method class is available as the `Method` or `method` property of `require('jayson')`. It supports these options:
| Option | Default | Type | Description |
|----------- |-------------------------------- |--------------------- |------------------------------------------------------------------------ |
| `handler` | | `Function` | The actual function that will handle a JSON-RPC request to this method |
| `collect` | >= 2.0.0 `true` before `false` | `Boolean` | Collect JSON-RPC parameters in a single function argument |
| `params` | null | `Array|Object|null` | Force JSON-RPC parameters to be of a certain type |
Server example showcasing most features and options in [examples/method_definitions/server.js](examples/method_definitions/server.js):
```javascript

@@ -603,4 +603,9 @@ var jayson = require(__dirname + '/../..');

// this function will be wrapped in jayson.Method with options given to the server
sum: function(args, done) {
done(null, sum(args));
},
// this method gets the raw params as first arg to handler
addCollect: new jayson.Method({
sumCollect: new jayson.Method({
handler: function(args, done) {

@@ -614,3 +619,3 @@ var total = sum(args);

// specifies some default values (alternate definition too)
addDefault: jayson.Method(function(args, done) {
sumDefault: jayson.Method(function(args, done) {
var total = sum(args);

@@ -624,3 +629,3 @@ done(null, total);

// this method returns true when it gets an array (which it always does)
acceptArray: new jayson.Method({
isArray: new jayson.Method({
handler: function(args, done) {

@@ -636,7 +641,11 @@ var result = _.isArray(args);

var server = jayson.server(methods);
var server = jayson.server(methods, {
// Given as options to jayson.Method when adding the method "sum"
collect: true,
params: Array
});
server.http().listen(3000);
// sums all enumerable properties in a list
// sums all numbers in an array
function sum(list) {

@@ -654,10 +663,8 @@ return _.reduce(list, function(sum, val) {

// create a client
var client = jayson.client.http({
port: 3000,
hostname: 'localhost'
port: 3000
});
// invoke "addCollect" with array
client.request('addCollect', [3, 5, 9, 11], function(err, response) {
// invoke "sumCollect" with array
client.request('sumCollect', [3, 5, 9, 11], function(err, response) {
if(err) throw err;

@@ -667,4 +674,4 @@ console.log(response.result); // 28

// invoke "addCollect" with object
client.request('addCollect', {a: 2, b: 3, c: 4}, function(err, response) {
// invoke "sumCollect" with object
client.request('sumCollect', {a: 2, b: 3, c: 4}, function(err, response) {
if(err) throw err;

@@ -674,4 +681,4 @@ console.log(response.result); // 9

// invoke "addDefault" with object missing some defined members
client.request('addDefault', {b: 10}, function(err, response) {
// invoke "sumDefault" with object missing some defined members
client.request('sumDefault', {b: 10}, function(err, response) {
if(err) throw err;

@@ -681,7 +688,12 @@ console.log(response.result); // 12

// invoke "acceptArray" with an Object
client.request('acceptArray', {a: 5, b: 2, c: 9}, function(err, response) {
// invoke "isArray" with an Object
client.request('isArray', {a: 5, b: 2, c: 9}, function(err, response) {
if(err) throw err;
console.log(response.result); // true
});
client.request('sum', [1, 2, 3], function(err, response) {
if(err) throw err;
console.log(response.result); // 6
});
```

@@ -697,5 +709,7 @@

* `request` Emitted when the server receives an interpretable (non-batch) request. First argument is the request object.
* `response` Emitted when the server is returning a response. First argument is the request object, the second is the response object.
* `batch` Emitted when the server receives a batch request. First argument is an array of requests. Will emit `request` for each interpretable request in the batch.
| Event | When | Arguments | Notes |
|------------ |------------------------------------------ |-------------------------------------- |-------------------------------- |
| `request` | Interpretable non-batch request received | 1: Request object | |
| `response` | Returning a response | 1: Request object 2: Response object | |
| `batch` | Interpretable batch request received | 1. Array of requests | Emits `request` for every part |

@@ -707,7 +721,7 @@ #### Server Errors

```javascript
var jayson = require(__dirname + '/../..');
var jayson = require('jayson');
var server = jayson.server({
i_cant_find_anything: function(id, callback) {
var error = {code: 404, message: 'Cannot find ' + id};
i_cant_find_anything: function(args, callback) {
var error = {code: 404, message: 'Cannot find ' + args.id};
callback(error); // will return the error object as given

@@ -728,6 +742,6 @@ },

```javascript
var jayson = require(__dirname + '/../..');
var jayson = require('jayson');
var server = jayson.server({
invalid_params: function(id, callback) {
invalid_params: function(args, callback) {
var error = this.error(-32602); // returns an error with the default properties set

@@ -742,3 +756,3 @@ callback(error);

```javascript
var jayson = require(__dirname + '/../..');
var jayson = require('jayson');

@@ -781,3 +795,3 @@ var server = jayson.server({

if(value && value.$class === 'counter') {
var obj = new Counter;
var obj = new Counter();
for(var prop in value.$props) obj[prop] = value.$props[prop];

@@ -790,3 +804,3 @@ return obj;

Server in [examples/reviving_and_replacing/server.js](examples/reviving_and_replacing/server.js):
Server example in [examples/reviving_and_replacing/server.js](examples/reviving_and_replacing/server.js):

@@ -805,13 +819,12 @@ ```javascript

var server = jayson.server({
increment: function(counter, callback) {
counter.increment();
callback(null, counter);
increment: function(args, callback) {
args.counter.increment();
callback(null, args.counter);
}
}, options);
// let the server listen to for http connections on localhost:3000
server.http().listen(3000);
```
A client in [examples/reviving_and_replacing/client.js](examples/reviving_and_replacing/client.js) invoking "increment" on the server:
A client example in [examples/reviving_and_replacing/client.js](examples/reviving_and_replacing/client.js) invoking "increment" on the server:

@@ -822,6 +835,4 @@ ```javascript

// create a client with the shared reviver and replacer
var client = jayson.client.http({
port: 3000,
hostname: 'localhost',
reviver: shared.reviver,

@@ -832,10 +843,15 @@ replacer: shared.replacer

// create the object
var instance = new shared.Counter(2);
var params = {
counter: new shared.Counter(2)
}
// invoke "increment"
client.request('increment', [instance], function(err, error, result) {
client.request('increment', params, function(err, response) {
if(err) throw err;
console.log(result instanceof shared.Counter); // true
console.log(result.count); // 3!
console.log(instance === result); // false - it won't be the same object, naturally
var result = response.result;
console.log(
result instanceof shared.Counter, // true
result.count, // 3
params.counter === result // false - result is a new object
);
});

@@ -855,14 +871,12 @@ ```

```javascript
var jayson = require(__dirname + '/../../');
var jayson = require(__dirname + '/../..');
var client = jayson.client.http({
host: 'localhost',
port: 3000
});
client.request('add', {b: 1, a: 2}, function(err, error, response) {
client.request('add', {b: 1, a: 2}, function(err, response) {
if(err) throw err;
console.log(response); // 3!
console.log(response.result); // 3!
});
```

@@ -879,2 +893,4 @@

}
}, {
collect: false // don't collect params in a single argument
});

@@ -890,3 +906,53 @@

* It is assumed that the last argument to a server method is the callback and it will not be filled with something else
* Parsing a function signature and filling in arguments is generally *not recommended* and should be avoided
### Promises
[es6-promise]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
*Since version 2.0.0*
A separate tree that does limited usage of the [ES6 Promise][es6-promise] object is available. The internal API remains callback based, with the addition that promises may be used for two things:
* Returning a Promise when requesting a JSON-RPC method using a Client
* Returning a Promise inside of a Server method
To use the separate tree, do a `require('jayson/promise')` instead of `require('jayson')`.
Server example in [examples/promise/server.js](examples/promise/server.js) showing how to return a `Promise` in a server method:
```javascript
var jayson = require('../../promise');
var _ = require('lodash');
var server = jayson.server({
add: function(args) {
return new Promise(function(resolve, reject) {
var sum = _.reduce(args, function(sum, value) { return sum + value; }, 0);
resolve(sum);
});
}
});
server.http().listen(3000);
```
Client example in [examples/promise/client.js](examples/promise/client.js) showing how to do a request:
```javascript
var jayson = require('../../promise');
var client = jayson.client.http({
port: 3000
});
client.request('add', [1, 2, 3, 4, 5]).then(function(response) {
console.log(response.result); // 15!
});
```
#### Notes
* JSON-RPC errors will not result in rejection of the Promise. It is however possible that a future version will include a client setting to have JSON-RPC errors result in rejection.
### Contributing

@@ -896,1 +962,3 @@

requests on [Github](https://github.com/tedeh/jayson) is most welcome.
Please make sure to follow the style of the project, and lint your code with `make lint` before submitting a patch.

@@ -45,3 +45,3 @@ var should = require('should');

exec(args, function(err, stdout, stderr) {
if(err) throw err;
if(err) return done(err);

@@ -90,3 +90,3 @@ should.exist(stdout, stderr);

exec(args, function(err, stdout, stderr) {
if(err) throw err;
if(err) return done(err);
var json = JSON.parse(stdout);

@@ -135,3 +135,3 @@ stderr.should.equal('');

exec(args, function(err, stdout, stderr) {
if(err) throw err;
if(err) return done(err);
var json = JSON.parse(stdout);

@@ -138,0 +138,0 @@ stderr.should.equal('');

var should = require('should');
var jayson = require(__dirname + '/..');
var jayson = require(__dirname + '/../');
var support = require(__dirname + '/support');

@@ -32,3 +32,3 @@ var common = support.common;

var server = jayson.server(support.server.methods, support.server.options);
var server = jayson.Server(support.server.methods, support.server.options);
var client = jayson.client(server, support.server.options);

@@ -42,3 +42,3 @@

client.request('add', [11, 9], function(err, response) {
if(err) throw err;
if(err) return done(err);
should.not.exist(response.result);

@@ -53,3 +53,3 @@ response.should.containDeep({error: {code: -32600}}); // "Request Error"

client.request('add', [11, 12], function(err, response) {
if(err) throw err;
if(err) return done(err);
arguments.length.should.equal(2);

@@ -63,3 +63,3 @@ response.should.containDeep({result: 11 + 12});

client.request('add', [4, 3], function(err, error, result) {
if(err) throw err;
if(err) return done(err);
should(error).not.exist;

@@ -74,3 +74,3 @@ should(result).exist;

client.request('error', [], function(err, error, result) {
if(err) throw err;
if(err) return done(err);
should(error).exist;

@@ -91,3 +91,3 @@ error.should.have.property('code', -1000);

client._parseResponse(null, response, function(err, error, response) {
if(err) throw err;
if(err) return done(err);
should(error).equal(null);

@@ -105,3 +105,3 @@ should(response).equal(5);

client._parseResponse(null, response, function(err, error, response) {
if(err) throw err;
if(err) return done(err);
should(error).have.property('code', 10000);

@@ -121,3 +121,3 @@ should(response).equal(2);

client.request('add', [9, 2], function(err, response) {
if(err) throw err;
if(err) return done(err);
response.should.containDeep({

@@ -159,3 +159,3 @@ id: 0,

client.request('add', [5, 8], function(err) {
if(err) throw err;
if(err) return done(err);
hasFired.should.be.ok;

@@ -168,3 +168,3 @@ done();

client.request('add', [3, 4], null, function(err, response) {
if(err) throw err;
if(err) return done(err);
arguments.length.should.equal(0);

@@ -178,3 +178,3 @@ should.not.exist(response);

client.request('add', {a: 5, b: -2}, function(err, error, response) {
if(err) throw err;
if(err) return done(err);
should.not.exist(error);

@@ -197,3 +197,3 @@ response.should.equal(5 - 2);

client.request(batch, function(err, responses) {
if(err) throw err;
if(err) return done(err);

@@ -221,3 +221,3 @@ responses.should.be.instanceof(Array).and.have.length(3);

client.request(batch, function(err, responses) {
if(err) throw err;
if(err) return done(err);

@@ -247,3 +247,3 @@ responses.should.be.instanceof(Array).and.have.length(2);

client.request(batch, function(err, errors, successes) {
if(err) throw err;
if(err) return done(err);

@@ -273,3 +273,3 @@ errors.should.be.instanceof(Array).and.have.length(1);

client.request(batch, function(err, response) {
if(err) throw err;
if(err) return done(err);
should.not.exist(response);

@@ -276,0 +276,0 @@ done();

@@ -59,3 +59,3 @@ var should = require('should');

client.request('add', [10, 2], function(err, response) {
if(err) throw err;
if(err) return done(err);
hasFired.should.be.ok;

@@ -77,3 +77,3 @@ done();

client.request('add', [9, 4], function(err, response) {
if(err) throw err;
if(err) return done(err);
hasFired.should.be.ok;

@@ -80,0 +80,0 @@ done();

var should = require('should');
var fs = require('fs');
var jayson = require(__dirname + '/..');

@@ -10,8 +9,2 @@ var support = require('./support');

var serverOptions = {
ca: [fs.readFileSync('./test/fixtures/keys/ca1-cert.pem')],
key: fs.readFileSync('./test/fixtures/keys/agent1-key.pem'),
cert: fs.readFileSync('./test/fixtures/keys/agent1-cert.pem')
};
describe('Jayson.Https', function() {

@@ -28,3 +21,3 @@

it('should listen to a local port', function(done) {
server = jayson.server(support.methods, support.options).https(serverOptions);
server = jayson.server(support.methods, support.options).https(support.server.keys);
server.listen(3000, 'localhost', done);

@@ -42,3 +35,3 @@ });

var server = jayson.server(support.server.methods, support.server.options);
var server_https = server.https(serverOptions);
var server_https = server.https(support.server.keys);
var client = jayson.client.https({

@@ -49,3 +42,3 @@ reviver: support.server.options.reviver,

port: 3000,
ca: serverOptions.ca
ca: support.server.keys.ca
});

@@ -72,3 +65,3 @@

client.request('add', [9, 4], function(err, response) {
if(err) throw err;
if(err) return done(err);
hasFired.should.be.ok;

@@ -75,0 +68,0 @@ done();

@@ -21,2 +21,8 @@ var should = require('should');

it('should have some default options', function() {
method.options.should.containDeep({
collect: true
});
});
describe('getHandler and setHandler', function() {

@@ -71,3 +77,3 @@

method.execute(server, {a: 1, b: 2, c: 3}, function(err, sum) {
if(err) throw err;
if(err) return done(err);
sum.should.eql(1 + 2 + 3);

@@ -80,3 +86,3 @@ done();

method.execute(server, [1, 2, 3, 4], function(err, sum) {
if(err) throw err;
if(err) return done(err);
sum.should.eql(1 + 2 + 3 + 4);

@@ -113,3 +119,3 @@ done();

method.execute(server, {a: 1, b: 2, c: 3}, function(err, sum) {
if(err) throw err;
if(err) return done(err);
sum.should.eql(1 + 2 + 3);

@@ -122,3 +128,3 @@ done();

method.execute(server, [1, 2, 3, 4], function(err, sum) {
if(err) throw err;
if(err) return done(err);
sum.should.eql(1 + 2 + 3 + 4);

@@ -154,3 +160,3 @@ done();

method.execute(server, {a: 1}, function(err, sum) {
if(err) throw err;
if(err) return done(err);
sum.should.eql(1);

@@ -163,3 +169,3 @@ done();

method.execute(server, [1,2,3], function(err, sum) {
if(err) throw err;
if(err) return done(err);
sum.should.eql(0);

@@ -195,3 +201,3 @@ done();

method.execute(server, {a: 5}, function(err, sum) {
if(err) throw err;
if(err) return done(err);
sum.should.eql(5);

@@ -204,3 +210,3 @@ done();

method.execute(server, [1,2,3], function(err, sum) {
if(err) throw err;
if(err) return done(err);
sum.should.eql(0);

@@ -276,3 +282,3 @@ done();

method.execute(server, [1,2], function(err, sum) {
if(err) throw err;
if(err) return done(err);
sum.should.eql(1 + 2);

@@ -285,3 +291,3 @@ done();

method.execute(server, {a: 1, b: 2}, function(err, sum) {
if(err) throw err;
if(err) return done(err);
sum.should.eql(1 + 2);

@@ -288,0 +294,0 @@ done();

@@ -46,4 +46,4 @@ var should = require('should');

client.request('add', [3, 4], function(err, error, response) {
if(err) throw err;
if(error) throw error;
if(err) return done(err);
if(error) return done(error);
response.should.eql(3 + 4);

@@ -50,0 +50,0 @@ invocations.should.eql(1);

@@ -27,2 +27,8 @@ var should = require('should');

it('should have some default options', function() {
new Server().options.should.containDeep({
collect: true
});
});
it('should allow a method to be added and removed', function() {

@@ -36,2 +42,9 @@ server.method('subtract', function(a, b, callback) {

});
it('should pass options methodConstructor and make new methods an instanceof it', function() {
var ctor = function() {};
server.options.methodConstructor = ctor;
server.method('add', function(args, done) { done(); });
server.getMethod('add').should.be.instanceof(ctor);
});

@@ -120,11 +133,9 @@ it('should pass options collect and params as defaults to jayson.Method', function() {

beforeEach(function() {
server.options.router = function(method) {
server.options.router = function(method, params) {
if(typeof(this._methods[method]) === 'function') {
return this._methods[method];
}
if(method === 'add_2') {
var fn = server.getMethod('add').getHandler();
return fn.bind(null, 2);
return new jayson.Method(fn.bind(null, 2), {collect: false});
}

@@ -137,3 +148,3 @@ };

server.call(request, function(err, response) {
if(err) throw err;
if(err) return done(err);
response.should.have.property('result', 4);

@@ -224,3 +235,3 @@ done();

server.call(request, function(err) {
if(err) throw err;
if(err) return done(err);
fired.should.be.ok;

@@ -316,3 +327,3 @@ done();

server.call(request, function(err, response) {
if(err) throw err;
if(err) return done(err);
should(response).not.exist;

@@ -343,3 +354,3 @@ done();

server.call(request, function(err, response) {
if(err) throw err;
if(err) return done(err);
response.should.have.property('result', 3 + 9);

@@ -366,3 +377,3 @@ done();

server.call(request, function(err, response) {
if(err) throw err;
if(err) return done(err);
response.should.have.property('result');

@@ -380,3 +391,3 @@ done();

server.call(request, function(err, response) {
if(err) throw err;
if(err) return done(err);
response.should.containDeep({result: 2 + 9});

@@ -390,3 +401,3 @@ done();

server.call(request, function(err, response) {
if(err) throw err;
if(err) return done(err);
isNaN(response.result).should.be.ok;

@@ -404,3 +415,3 @@ done();

server.call(request, function(err, response) {
if(err) throw err;
if(err) return done(err);
should.not.exist(response);

@@ -414,3 +425,3 @@ done();

server.call(request, function(err, response) {
if(err) throw err;
if(err) return done(err);
should.not.exist(response);

@@ -429,3 +440,3 @@ done();

server.call(request, function(err, response) {
if(err) throw err;
if(err) return done(err);
var result = response.result;

@@ -476,3 +487,3 @@ result.should.be.an.instanceof(support.Counter);

server.call(requests, function(err, response) {
if(err) throw err;
if(err) return done(err);

@@ -495,3 +506,3 @@ response.should.be.instanceof(Array).and.have.length(3);

server.call(request, function(err, responses) {
if(err) throw err;
if(err) return done(err);
should(responses).not.exist;

@@ -512,3 +523,3 @@ done();

server.call(request, function(err, responses) {
if(err) throw err;
if(err) return done(err);

@@ -532,3 +543,3 @@ responses.should.be.instanceof(Array).and.have.length(2);

server.call(request, function(err, responses) {
if(err) throw err;
if(err) return done(err);
responses.should.be.instanceof(Array).and.have.length(2);

@@ -535,0 +546,0 @@ responses[0].should.have.property('result', 1 + 1);

@@ -51,3 +51,3 @@ var should = require('should');

client.request('error', [], function(err, error, result) {
should.not.exist(err);
if(err) return done(err);
should.not.exist(result);

@@ -80,3 +80,3 @@ should.exist(error);

client.request('add', [3, 4], null, function(err) {
if(err) throw err;
if(err) return done(err);
arguments.length.should.equal(0);

@@ -83,0 +83,0 @@ done();

var should = require('should');
var jayson = require(__dirname + '/../../');
var fs = require('fs');

@@ -10,2 +11,8 @@ exports.Counter = require(__dirname + '/counter');

exports.server.keys = {
ca: [fs.readFileSync(__dirname + '/../fixtures/keys/ca1-cert.pem')],
key: fs.readFileSync(__dirname + '/../fixtures/keys/agent1-key.pem'),
cert: fs.readFileSync(__dirname + '/../fixtures/keys/agent1-cert.pem')
};
/*

@@ -80,4 +87,6 @@ * Methods for the common test server

return value;
}
},
collect: false
};

@@ -64,3 +64,3 @@ var should = require('should');

it('should return the correct names when passed a odd-formatted function', function() {
var func = function (a, b , __b) {
var func = function (a, b , __b) {
func(2, 3, 55, 4);

@@ -124,3 +124,3 @@ return a + b;

parseBody(stream, {}, function(err, result) {
if(err) throw err;
if(err) return done(err);
obj.should.eql(result);

@@ -138,3 +138,3 @@ done();

parseBody(stream, {}, function(err, result) {
if(err) throw err;
if(err) return done(err);
arr.should.eql(result);

@@ -157,5 +157,23 @@ done();

});
});
describe('stringify', function(done) {
it('should not throw with circular JSON reference', function(done) {
var foo = {};
var bar = { foo: foo };
foo.bar = bar;
var fn = utils.JSON.stringify(bar, {}, function(err, str) {
should(err).not.exist;
done();
});
should(fn).not.throw();
});
});
});

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc