@tremho/jove-test
Version:
Test API Module for Jove Framework
92 lines (91 loc) • 3.22 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.WSServer = exports.setEndResolver = void 0;
// import http2 from "http2"
const ws_1 = require("ws");
const defaultPort = 51610;
let endResolver;
function setEndResolver(resolver) {
endResolver = resolver;
}
exports.setEndResolver = setEndResolver;
class WSServer {
listen(port = defaultPort) {
// console.log('Test server listening...')
return new Promise(resolve => {
let wss;
try {
wss = new ws_1.WebSocketServer({ port });
}
catch (e) {
console.error("CAUGHT SERVER LISTEN: ", e);
}
if (wss) {
wss.on('error', (e) => {
if (e.code === 'EADDRINUSE') {
console.warn('Only one Remote Test call per test suite is allowed');
return resolve(false);
}
console.error("WS SERVER ERROR", e);
resolve(false);
});
wss.on('connection', (ws) => {
// console.log('server see connection event')
this.ws = ws;
ws.on('message', (message) => {
const str = message.toString();
this.handleResponse(str);
});
ws.on('close', (code) => {
// console.log('Server sees a close event ', code)
this.responseResolver && this.responseResolver('');
});
// clear connection gate
resolve(true);
});
}
});
}
sendDirective(action) {
// console.log('server: sendDirective ', action)
return new Promise(resolve => {
const parts = action.split(' ');
this.responseResolver = resolve;
if (this.ws) {
this.ws.send(action);
}
else {
this.responseResolver('');
}
});
}
handleResponse(res) {
// console.log('received response ', res)
let n = res.indexOf(':');
let rcount = Number(res.substring(0, n));
res = res.substring(n + 1);
const parts = res.split('=');
const ract = (parts[0] || '').trim();
let ans = (parts[1] || '').trim();
if ((ans.charAt(0) === '{' && ans.charAt(ans.length - 1) === '}')
|| (ans.charAt(0) === '{' && ans.charAt(ans.length - 1) === '}')) {
// console.log("Converting JSON")
try {
ans = JSON.parse(ans);
}
catch (e) {
console.warn(e);
}
}
if (ract === 'end') {
// console.log('Server gets an end response', ans, !!this.ws, !!process)
if (this.ws)
this.ws.close(Number(ans));
if (endResolver)
endResolver(Number(ans));
}
// console.log('response to '+ract+' = "'+ans+'"')
this.responseResolver(ans);
}
}
exports.WSServer = WSServer;