UNPKG

@n1k1t/mock-server

Version:

Powerful util to setup mocks over HTTP APIs

79 lines 2.98 kB
"use strict"; 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