Flesh out WebSocket support

This commit is contained in:
Tony Garnock-Jones 2018-11-04 23:00:32 +00:00
parent 0fe8f1bcd7
commit 33c8f70ab6
2 changed files with 47 additions and 40 deletions

View File

@ -83,15 +83,15 @@ function _server(host, port, httpsOptions) {
} }
} }
during Observe(WebSocket(_, server, $path, _)) { during Observe(WebSocket(_, server, $pathPattern, _)) {
path = encodePath(path); const path = encodePath(pathPattern);
on start { on start {
if (!(path in wsHandlerMap)) wsHandlerMap[path] = 0; if (!(path in wsHandlerMap)) wsHandlerMap[path] = {_count: 0, _path: pathPattern};
wsHandlerMap[path]++; wsHandlerMap[path]._count++;
} }
on stop { on stop {
wsHandlerMap[path]--; wsHandlerMap[path]._count--;
if (wsHandlerMap[path] === 0) delete wsHandlerMap[path]; if (wsHandlerMap[path]._count === 0) delete wsHandlerMap[path];
} }
} }
@ -178,45 +178,47 @@ function _server(host, port, httpsOptions) {
function checkWSConnection(info, callback) { function checkWSConnection(info, callback) {
let url = parseUrl(info.req.url, true); let url = parseUrl(info.req.url, true);
let pieces = reqUrlPieces(url); let pieces = reqUrlPieces(url);
let handlerCount = mapLookup(wsHandlerMap, pieces); if (!mapLookup(wsHandlerMap, pieces)) {
if (!handlerCount) {
callback(false, 404, "Not found", {}); callback(false, 404, "Not found", {});
} else { } else {
callback(true); callback(true);
} }
} }
wss.on('connection', (ws, req) => { wss.on('connection', Dataspace.wrapExternal((ws, req) => {
let url = parseUrl(info.req.url, true); let url = parseUrl(req.url, true);
let pieces = reqUrlPieces(url); let pieces = reqUrlPieces(url);
// react { let { _path: pathPattern } = mapLookup(wsHandlerMap, pieces);
// let id = nextId++;
// assert WebSocket(id, server, pieces, url.query);
// stop on retracted Observe(Request(_, server, method, pathPattern, _, _)) { react {
// res.writeHead(500, "Internal server error", {}); const facet = Dataspace.currentFacet();
// res.end(); let id = nextId++;
// } assert WebSocket(id, server, pieces, url.query);
// stop on asserted Response(
// id, $code, $message, $headers, $detail) on stop ws.close();
// {
// res.writeHead(code, message, headers.toJS()); ws.on('close', Dataspace.wrapExternal(() => {
// if (detail === null) { facet.stop();
// react { }));
// stop on retracted Response(id, code, message, headers, detail) {
// res.end(); on asserted Observe(RequestData(id, _)) {
// } ws.on('message', Dataspace.wrapExternal((message) => {
// on message ResponseData(id, $chunk) { ^ RequestData(id, message);
// res.write(chunk); }));
// } }
// }
// } else { on message ResponseData(id, $message) {
// res.end(detail); ws.send(message);
// } }
// }
// } stop on retracted Observe(WebSocket(_, server, pathPattern, _));
}); stop on retracted Observe(WebSocket(id, server, pieces, _));
}
}));
on start s.listen(port, host); on start s.listen(port, host);
on stop s.close(); on stop {
wss.close();
s.close();
}
} }

View File

@ -35,7 +35,12 @@ spawn named 'greetingServer' {
} }
spawn named 'websocketEchoServer' { spawn named 'websocketEchoServer' {
// during Http.WebSocket($id, server, ['echo'], _) { during Http.WebSocket($id, server, ['echo'], _) {
on message Http.RequestData(id, $message) {
// } console.log('got', id, message);
^ Http.ResponseData(id, message);
}
stop on message Http.RequestData(id, "quit");
}
} }