implement serverside RPC infrastructure
This commit is contained in:
parent
81027b4200
commit
612a00b484
@ -209,6 +209,21 @@ const handleMessage = function (ctx, user, msg) {
|
|||||||
let parsedMsg = {state: 1, channel: parsed[1]};
|
let parsedMsg = {state: 1, channel: parsed[1]};
|
||||||
sendMsg(ctx, user, [0, HISTORY_KEEPER_ID, 'MSG', user.id, JSON.stringify(parsedMsg)]);
|
sendMsg(ctx, user, [0, HISTORY_KEEPER_ID, 'MSG', user.id, JSON.stringify(parsedMsg)]);
|
||||||
});
|
});
|
||||||
|
} else if (ctx.rpc) {
|
||||||
|
/* RPC Calls... */
|
||||||
|
var rpc_call = parsed.slice(1);
|
||||||
|
|
||||||
|
// slice off the sequence number and pass in the rest of the message
|
||||||
|
ctx.rpc(rpc_call, function (err, output) {
|
||||||
|
if (err) {
|
||||||
|
console.error('[' + err + ']', output);
|
||||||
|
sendMsg(ctx, user, [seq, 'ACK']);
|
||||||
|
sendMsg(ctx, user, [0, HISTORY_KEEPER_ID, 'MSG', user.id, JSON.stringify([parsed[0], 'ERROR', err])]);
|
||||||
|
return
|
||||||
|
}
|
||||||
|
sendMsg(ctx, user, [seq, 'ACK']);
|
||||||
|
sendMsg(ctx, user, [0, HISTORY_KEEPER_ID, 'MSG', user.id, JSON.stringify([parsed[0]].concat(output))]);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -251,7 +266,7 @@ const handleMessage = function (ctx, user, msg) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let run = module.exports.run = function (storage, socketServer, config) {
|
let run = module.exports.run = function (storage, socketServer, config, rpc) {
|
||||||
/* Channel removal timeout defaults to 60000ms (one minute) */
|
/* Channel removal timeout defaults to 60000ms (one minute) */
|
||||||
config.channelRemovalTimeout =
|
config.channelRemovalTimeout =
|
||||||
typeof(config.channelRemovalTimeout) === 'number'?
|
typeof(config.channelRemovalTimeout) === 'number'?
|
||||||
@ -263,7 +278,8 @@ let run = module.exports.run = function (storage, socketServer, config) {
|
|||||||
channels: {},
|
channels: {},
|
||||||
timeouts: {},
|
timeouts: {},
|
||||||
store: storage,
|
store: storage,
|
||||||
config: config
|
config: config,
|
||||||
|
rpc: rpc,
|
||||||
};
|
};
|
||||||
setInterval(function () {
|
setInterval(function () {
|
||||||
Object.keys(ctx.users).forEach(function (userId) {
|
Object.keys(ctx.users).forEach(function (userId) {
|
||||||
|
|||||||
@ -130,6 +130,13 @@ module.exports = {
|
|||||||
*/
|
*/
|
||||||
openFileLimit: 2048,
|
openFileLimit: 2048,
|
||||||
|
|
||||||
|
/* Cryptpad's socket server can be extended to respond to RPC calls
|
||||||
|
* you can configure it to respond to custom RPC calls if you like.
|
||||||
|
* provide the path to your RPC module here, or `false` if you would
|
||||||
|
* like to disable the RPC interface completely
|
||||||
|
*/
|
||||||
|
rpc: './rpc.js',
|
||||||
|
|
||||||
/* it is recommended that you serve cryptpad over https
|
/* it is recommended that you serve cryptpad over https
|
||||||
* the filepaths below are used to configure your certificates
|
* the filepaths below are used to configure your certificates
|
||||||
*/
|
*/
|
||||||
|
|||||||
37
rpc.js
Normal file
37
rpc.js
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
/* Use Nacl for checking signatures of messages
|
||||||
|
|
||||||
|
*/
|
||||||
|
var Nacl = require("tweetnacl");
|
||||||
|
|
||||||
|
var RPC = module.exports;
|
||||||
|
|
||||||
|
var pin = function (ctx, cb) { };
|
||||||
|
var unpin = function (ctx, cb) { };
|
||||||
|
var getHash = function (ctx, cb) { };
|
||||||
|
var getTotalSize = function (ctx, cb) { };
|
||||||
|
var getFileSize = function (ctx, cb) { };
|
||||||
|
|
||||||
|
RPC.create = function (config, cb) {
|
||||||
|
// load pin-store...
|
||||||
|
|
||||||
|
console.log('loading rpc module...');
|
||||||
|
rpc = function (msg, respond) {
|
||||||
|
switch (msg[0]) {
|
||||||
|
case 'ECHO':
|
||||||
|
respond(void 0, msg);
|
||||||
|
break;
|
||||||
|
case 'PIN':
|
||||||
|
case 'UNPIN':
|
||||||
|
case 'GET_HASH':
|
||||||
|
case 'GET_TOTAL_SIZE':
|
||||||
|
case 'GET_FILE_SIZE':
|
||||||
|
|
||||||
|
default:
|
||||||
|
respond('UNSUPPORTED_RPC_CALL', msg);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
cb(void 0, rpc);
|
||||||
|
};
|
||||||
|
|
||||||
37
server.js
37
server.js
@ -117,13 +117,32 @@ httpServer.listen(config.httpPort,config.httpAddress,function(){
|
|||||||
|
|
||||||
var wsConfig = { server: httpServer };
|
var wsConfig = { server: httpServer };
|
||||||
|
|
||||||
if(!config.useExternalWebsocket) {
|
var createSocketServer = function (err, rpc) {
|
||||||
if (websocketPort !== config.httpPort) {
|
if(!config.useExternalWebsocket) {
|
||||||
console.log("setting up a new websocket server");
|
if (websocketPort !== config.httpPort) {
|
||||||
wsConfig = { port: websocketPort};
|
console.log("setting up a new websocket server");
|
||||||
|
wsConfig = { port: websocketPort};
|
||||||
|
}
|
||||||
|
var wsSrv = new WebSocketServer(wsConfig);
|
||||||
|
Storage.create(config, function (store) {
|
||||||
|
NetfluxSrv.run(store, wsSrv, config, rpc);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
var wsSrv = new WebSocketServer(wsConfig);
|
};
|
||||||
Storage.create(config, function (store) {
|
|
||||||
NetfluxSrv.run(store, wsSrv, config);
|
var loadRPC = function (cb) {
|
||||||
});
|
config.rpc = typeof(config.rpc) === 'undefined'? './rpc.js' : config.rpc;
|
||||||
}
|
|
||||||
|
if (typeof(config.rpc) === 'string') {
|
||||||
|
// load pin store...
|
||||||
|
var Rpc = require(config.rpc);
|
||||||
|
Rpc.create(config, function (e, rpc) {
|
||||||
|
if (e) { throw e; }
|
||||||
|
cb(void 0, rpc);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
cb();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
loadRPC(createSocketServer);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user