diff --git a/js/rpc/rpc.js b/js/rpc/rpc.js new file mode 100644 index 0000000..f4f690b --- /dev/null +++ b/js/rpc/rpc.js @@ -0,0 +1,66 @@ +var udprpc = Require('rpc/udp_rpc'); +var version = "1.1.3" + +function rpc(proto,port,arrayOfNamedFunctions,options) { + options=options||{} + switch (proto.toUpperCase()) { + case 'UDP': + return new udprpc(options.dgramType||'udp4',port, + arrayOfNamedFunctions,options); + + } +} + +var clientCache=[]; +// server +function getreq (url, requestCallback, options) { + var proto = url.match(/^([a-zA-Z]+):/), + port = url.match(/([0-9]+)$/); + proto=(proto&&proto[1])||'udp'; + port=(port&&port[1]); + if (!port) throw Error('getreq: invalid port'); + var myport = rpc(proto,port,[ + function request(source, data, callback) { + callback(requestCallback(data,source)) + } + ],options) + return myport; +} +// client +function trans (url,data,replyCallback,options) { + var proto = url.match(/^([a-zA-Z]+):/), + destination = url.replace(/^([a-zA-Z]+):\/\//,''), + port = url.match(/([0-9]+)$/); + proto=(proto&&proto[1])||'udp'; + port=(port&&port[1]); + if (!port) throw Error('getreq: invalid port'); + if (clientCache[url]) { + if (clientCache[url].state!='listening') { + clientCache[url].queue.push([destination,data,replyCallback]); + } else + clientCache[url].request(destination,data,replyCallback||function(){}); + clientCache[url].timestamp=Date.now(); + } else { + var myport = clientCache[url] = rpc(proto,0,[ + function request(source, data, callback) {} + ],options); + clientCache[url].timestamp=Date.now(); + clientCache[url].queue=[]; + clientCache[url].queue.push([destination,data,replyCallback]); + myport.on('init',function () { + while (clientCache[url].queue.length) { + var next = clientCache[url].queue.shift(); + myport.request(next[0],next[1],next[2]||function(){}); + } + }); + + } +} + +module.exports = { + clientCache : clientCache, + rpc : rpc, + getreq : getreq, + trans : trans, + version : version +}