Various updates.
This commit is contained in:
parent
09d71aff49
commit
a51d7663c6
|
@ -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": {},
|
||||||
|
|
|
@ -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.
|
||||||
|
|
66
src/main.js
66
src/main.js
|
@ -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.
|
||||||
|
|
|
@ -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 =
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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');
|
||||||
}
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue