@n1k1t/mock-server
Version:
Powerful util to setup mocks over HTTP APIs
79 lines • 2.98 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.WsTransport = exports.buildWsListener = void 0;
const models_1 = require("../../models");
const context_1 = require("./context");
const meta_1 = require("../../../meta");
const executor_1 = require("./executor");
const logger_1 = require("../../../logger");
const logger = logger_1.Logger.build('Server.Transports.Ws');
const signals = {
close: Symbol('close'),
break: Symbol('break'),
};
const handle = async (event, socket, request, match, data) => {
const context = await match.transport
.compileContext(match.provider, socket, request, event, data)
.catch((error) => logger.error(`Got error while [ws:${event}] context compilation`, error?.stack ?? error));
if (!context) {
return signals.close;
}
if (!context.hasStatuses(['registered', 'handling'])) {
return signals.break;
}
const expectation = await meta_1.metaStorage
.wrap(context.meta, () => match.transport.executor.match(context))
.catch((error) => logger.error(`Got error while [ws:${event}] expectation matching`, error?.stack ?? error));
if (!context.hasStatuses(['registered', 'handling'])) {
return signals.break;
}
if (!expectation) {
return null;
}
await meta_1.metaStorage
.wrap(context.meta, () => match.transport.executor.exec(context.handle(), { expectation }))
.catch((error) => logger.error(`Got error while [ws:${event}] execution`, error?.stack ?? error));
return signals.close;
};
const buildWsListener = (router) => async (socket, request) => {
if (request.url?.startsWith('/socket.io')) {
return socket.terminate();
}
const matches = [];
for (const match of router.match('ws', request.url ?? '')) {
matches.push(match);
const signal = await handle('connection', socket, request, match);
if (signal === signals.close) {
return socket.close();
}
if (signal === signals.break) {
break;
}
}
if (!matches.length || socket.readyState !== socket.OPEN) {
return socket.close();
}
socket.on('message', async (data) => {
for (const match of matches) {
const signal = await handle('message', socket, request, match, data);
if (signal === signals.close) {
return socket.close();
}
if (signal === signals.break) {
break;
}
}
});
};
exports.buildWsListener = buildWsListener;
class WsTransport extends models_1.Transport {
constructor() {
super(...arguments);
this.executor = new executor_1.WsExecutor();
}
compileContext(provider, socket, request, event, message) {
return context_1.WsRequestContext.build(provider, socket, request, event, message);
}
}
exports.WsTransport = WsTransport;
//# sourceMappingURL=index.js.map