Skip to content
Snippets Groups Projects
Commit 0b76aafe authored by Nicolas Pope's avatar Nicolas Pope
Browse files

Add some comments about webservice

parent 074f9f7f
No related branches found
No related tags found
No related merge requests found
Pipeline #13093 passed
......@@ -11,31 +11,55 @@ let peer_uris = {};
let uri_data = {};
/**
* A client stream request object. Each source maintains a list of clients who
* are wanting frames from that source. Clients can only request N frames at a
* time, after that if no new request is received then the client is removed.
*
* @param {Peer} peer Peer websocket wrapper
* @param {number} N Number of frames requested
* @param {number} rate Bitrate index requested
* @param {string} dest URI destination
*/
function RGBDClient(peer, N, rate, dest) {
this.peer = peer;
this.txmax = N*16;
this.txmax = N*16; // 16 is for 16 blocks per frame... this will change in the near future
this.rate = rate;
this.dest = dest;
this.txcount = 0;
}
/**
* Actually send a frame over network to the client.
*/
RGBDClient.prototype.push = function(uri, frame, ttime, chunk, rgb, depth) {
this.peer.send(uri, frame, ttime, chunk, rgb, depth);
this.txcount++;
}
/**
* A video stream. Each peer provides a list of these streams. Each stream can
* receive frames from the source and forward those frames to any clients.
* Therefore each of these stream objects maintains a list of clients and
* loops over them whenever a new frame is received.
*
* @param {string} uri Address of the stream
* @param {Peer} peer Origin of the stream
*/
function RGBDStream(uri, peer) {
this.uri = uri;
this.peer = peer;
this.title = "";
this.rgb = null;
this.depth = null;
this.rgb = null; // TODO: No longer works as an image
this.depth = null; // TODO: No longer works as an image
this.pose = null;
this.clients = [];
this.rxcount = 10;
this.rxmax = 10;
// Add RPC handler to receive frames from the source
peer.bind(uri, (frame, ttime, chunk, rgb, depth) => {
// Forward frames to all clients
this.pushFrames(frame, ttime, chunk, rgb, depth);
this.rxcount++;
if (this.rxcount >= this.rxmax && this.clients.length > 0) {
......@@ -176,6 +200,7 @@ app.ws('/', (ws, req) => {
checkStreams(p);
});
// Used to sync clocks
p.bind("__ping__", () => {
return Date.now();
});
......@@ -198,6 +223,7 @@ app.ws('/', (ws, req) => {
}
});
// Requests camera calibration information
p.proxy("source_details", (cb, uri, chan) => {
let peer = uri_data[uri].peer;
if (peer) {
......@@ -205,6 +231,7 @@ app.ws('/', (ws, req) => {
}
});
// Get the current position of a camera
p.proxy("get_pose", (cb, uri) => {
//console.log("SET POSE");
let peer = uri_data[uri].peer;
......@@ -213,6 +240,7 @@ app.ws('/', (ws, req) => {
}
});
// Change the position of a camera
p.bind("set_pose", (uri, vec) => {
let peer = uri_data[uri].peer;
if (peer) {
......@@ -221,6 +249,7 @@ app.ws('/', (ws, req) => {
}
});
// Request from frames from a source
p.bind("get_stream", (uri, N, rate, pid, dest) => {
let peer = uri_data[uri].peer;
if (peer) {
......@@ -229,6 +258,7 @@ app.ws('/', (ws, req) => {
}
});
// Register a new stream
p.bind("add_stream", (uri) => {
console.log("Adding stream: ", uri);
//uri_to_peer[streams[i]] = peer;
......
......@@ -6,6 +6,7 @@ const kConnecting = 1;
const kConnected = 2;
const kDisconnected = 3;
// Generate a unique id for this webservice
let my_uuid = new Uint8Array(16);
my_uuid[0] = 44;
my_uuid = Buffer.from(my_uuid);
......@@ -13,6 +14,10 @@ my_uuid = Buffer.from(my_uuid);
const kMagic = 0x0009340053640912;
const kVersion = 0;
/**
* Wrap a web socket with a MsgPack RCP protocol that works with our C++ version.
* @param {websocket} ws Websocket object
*/
function Peer(ws) {
this.sock = ws;
this.status = kConnecting;
......@@ -79,6 +84,9 @@ function Peer(ws) {
Peer.uuid = my_uuid;
/**
* @private
*/
Peer.prototype._dispatchNotification = function(name, args) {
if (this.bindings.hasOwnProperty(name)) {
//console.log("Notification for: ", name);
......@@ -88,6 +96,9 @@ Peer.prototype._dispatchNotification = function(name, args) {
}
}
/**
* @private
*/
Peer.prototype._dispatchCall = function(name, id, args) {
if (this.bindings.hasOwnProperty(name)) {
//console.log("Call for:", name, id);
......@@ -114,6 +125,9 @@ Peer.prototype._dispatchCall = function(name, id, args) {
}
}
/**
* @private
*/
Peer.prototype._dispatchResponse = function(id, res) {
if (this.callbacks.hasOwnProperty(id)) {
this.callbacks[id].call(this, res);
......@@ -123,6 +137,14 @@ Peer.prototype._dispatchResponse = function(id, res) {
}
}
/**
* Register an RPC handler that will be called from a remote machine. Remotely
* passed arguments are provided to the given function as normal arguments, and
* if the function returns a value, it will be returned over the network also.
*
* @param {string} name The name of the function
* @param {function} f A function or lambda to be callable remotely
*/
Peer.prototype.bind = function(name, f) {
if (this.bindings.hasOwnProperty(name)) {
//console.error("Duplicate bind to same procedure");
......@@ -132,6 +154,10 @@ Peer.prototype.bind = function(name, f) {
}
}
/**
* Allow an RPC call to pass through to another machine with minimal local
* processing.
*/
Peer.prototype.proxy = function(name, f) {
if (this.proxies.hasOwnProperty(name)) {
//console.error("Duplicate proxy to same procedure");
......@@ -141,6 +167,13 @@ Peer.prototype.proxy = function(name, f) {
}
}
/**
* Call a procedure on a remote machine.
*
* @param {string} name Name of the procedure
* @param {function} cb Callback to receive return value as argument
* @param {...} args Any number of arguments to also pass to remote procedure
*/
Peer.prototype.rpc = function(name, cb, ...args) {
let id = this.cbid++;
this.callbacks[id] = cb;
......@@ -160,6 +193,12 @@ Peer.prototype.sendB = function(name, args) {
}
}
/**
* Call a remote procedure but with no return value expected.
*
* @param {string} name Name of the procedure
* @param {...} args Any number of arguments to also pass to remote procedure
*/
Peer.prototype.send = function(name, ...args) {
try {
this.sock.send(encode([0, name, args]));
......@@ -173,6 +212,9 @@ Peer.prototype.close = function() {
this.status = kDisconnected;
}
/**
* @private
*/
Peer.prototype._notify = function(evt, ...args) {
if (this.events.hasOwnProperty(evt)) {
for (let i=0; i<this.events[evt].length; i++) {
......@@ -182,6 +224,13 @@ Peer.prototype._notify = function(evt, ...args) {
}
}
/**
* Register a callback for socket events. Events include: 'connect',
* 'disconnect' and 'error'.
*
* @param {string} evt Event name
* @param {function} f Callback on event
*/
Peer.prototype.on = function(evt, f) {
if (!this.events.hasOwnProperty(evt)) {
this.events[evt] = [];
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment