Various updates.

This commit is contained in:
Julien Fontanet 2013-07-09 10:55:18 +02:00
parent 09d71aff49
commit a51d7663c6
6 changed files with 55 additions and 37 deletions

View File

@ -15,9 +15,11 @@
"dependencies": { "dependencies": {
"extendable": ">=0.0.3", "extendable": ">=0.0.3",
"hashy": ">=0.1.0", "hashy": ">=0.1.0",
"q": ">=0.9.6",
"socket.io": ">=0.9.16",
"underscore": ">=1.4.4", "underscore": ">=1.4.4",
"xmlrpc": ">=1.1.0", "validator": ">=1.2.1",
"q": ">=0.9.6" "xmlrpc": ">=1.1.0"
}, },
"devDependencies": {}, "devDependencies": {},
"optionalDependencies": {}, "optionalDependencies": {},

View File

@ -18,7 +18,7 @@ function Collection(items)
} }
require('util').inherits(Collection, require('events').EventEmitter); require('util').inherits(Collection, require('events').EventEmitter);
Collection.prototype.model = require('model'); Collection.prototype.model = require('./model');
/** /**
* Adds new items to this collection. * Adds new items to this collection.

View File

@ -1,28 +1,31 @@
var _ = require('underscore'); var _ = require('underscore');
var Q = require('q');
var Session = require('./session'); var Session = require('./session');
//-------------------------------------- //--------------------------------------
var xo = require('./xo')(); var xo = require('./xo')();
var Api = require('./api')(xo); var Api = require('./api');
var api = new Api(xo); var api = new Api(xo);
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
function json_api_call(session, transport, message) function json_api_call(session, message)
{ {
/* jshint newcap:false */
var req = { var req = {
'id': null, 'id': null,
}; };
function send_error(error) function format_error(error)
{ {
transport(JSON.stringify({ return JSON.stringify({
'jsonrpc': '2.0', 'jsonrpc': '2.0',
'error': error, 'error': error,
'id': req.id, 'id': req.id,
})); });
} }
try try
@ -33,8 +36,9 @@ function json_api_call(session, transport, message)
{ {
if (e instanceof SyntaxError) if (e instanceof SyntaxError)
{ {
send_error(Api.err.INVALID_JSON); return Q(format_error(Api.err.INVALID_JSON));
} }
return Q(format_error(Api.err.SERVER_ERROR));
} }
/* jshint laxbreak: true */ /* jshint laxbreak: true */
@ -42,11 +46,10 @@ function json_api_call(session, transport, message)
|| (undefined === req.id) || (undefined === req.id)
|| ('2.0' !== req.jsonrpc)) || ('2.0' !== req.jsonrpc))
{ {
send_error(Api.err.INVALID_REQUEST); return Q(format_error(Api.err.INVALID_REQUEST));
return;
} }
api.exec( return api.exec(
session, session,
{ {
'method': req.method, 'method': req.method,
@ -54,32 +57,31 @@ function json_api_call(session, transport, message)
} }
).then( ).then(
function (result) { function (result) {
transport(JSON.stringify({ return JSON.stringify({
'jsonrpc': '2.0', 'jsonrpc': '2.0',
'result': result, 'result': result,
'id': req.id, 'id': req.id,
})); });
}, },
send_error format_error
).done(); );
} }
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
// JSON-RPC over WebSocket. // JSON-RPC over WebSocket.
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
// @todo Port should be configurable.
require('socket.io').listen(8080).sockets.on('connection', function (socket) { require('socket.io').listen(8080).sockets.on('connection', function (socket) {
var transport = function (message) { var session = new Session(xo);
socket.send(message);
};
var session = new Session();
session.once('close', function () { session.once('close', function () {
socket.disconnect(); socket.disconnect();
}); });
socket.on('message', function (message) { socket.on('message', function (request) {
json_api_call(session, transport, message); json_api_call(session, request).then(function (response) {
socket.send(response);
}).done();
}); });
// @todo Ugly inter dependency. // @todo Ugly inter dependency.
@ -93,10 +95,6 @@ require('socket.io').listen(8080).sockets.on('connection', function (socket) {
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
require('net').createServer(function (socket) { require('net').createServer(function (socket) {
var transport = function (message) {
socket.write(message); // @todo Handle long messages.
};
var session = new Session(xo); var session = new Session(xo);
session.on('close', function () { session.on('close', function () {
socket.end(); // @todo Check it is enough. socket.end(); // @todo Check it is enough.
@ -116,7 +114,16 @@ require('net').createServer(function (socket) {
return; return;
} }
length = +buffer.toString('ascii', 0, i); // @todo Handle NaN. length = +buffer.toString('ascii', 0, i);
// If the length is NaN, we cannot do anything except
// closing the connection.
if (length !== length)
{
session.close();
return;
}
buffer = buffer.slice(i + 1); buffer = buffer.slice(i + 1);
} }
@ -126,7 +133,12 @@ require('net').createServer(function (socket) {
return; return;
} }
json_api_call(session, transport, buffer.slice(0, length).toString()); json_api_call(
session,
buffer.slice(0, length).toString()
).then(function (response) {
socket.write(response); // @todo Handle long messages.
}).done();
// @todo Check it frees the memory. // @todo Check it frees the memory.
buffer = buffer.slice(length); buffer = buffer.slice(length);
@ -136,4 +148,4 @@ require('net').createServer(function (socket) {
socket.once('close', function () { socket.once('close', function () {
session.close(); session.close();
}); });
}).listen('<path>'); // @todo }).listen(__dirname +'/../socket'); // @todo Should be configurable.

View File

@ -64,7 +64,11 @@ Model.prototype.set = function (properties, value) {
properties[property] = value; properties[property] = value;
} }
_.extend(this.properties, properties); var model = this;
_.each(properties, function (value, key) {
//model.properties =
});
}; };
/** /**

View File

@ -38,10 +38,10 @@ module.exports = Model.extend({
}, },
'close': function () { 'close': function () {
if (!this.closed) // This function can be called multiple times but will only
{ // emit an event once.
this.closed = true; this.close = function () {};
this.emit('close');
} this.emit('close');
}, },
}); });

View File

@ -9,7 +9,7 @@ var Model = require('./model');
var check = function () { var check = function () {
var errors; var errors;
var validator = new require('validator').Validator(); var validator = new (require('validator').Validator)();
validator.error = function (err) { validator.error = function (err) {
(errors || (errors = [])).push(err); (errors || (errors = [])).push(err);
return this; return this;