UNPKG

@tsclean/core

Version:

Plugin for API Rest Full development, based on Clean Architecture, IoC and Dependency Injection.

80 lines 14.4 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.SocketModule = void 0; const helpers_1 = require("../helpers"); const iterare_1 = __importDefault(require("iterare")); const ws_context_creator_1 = require("./context/ws-context-creator"); const ws_proxy_1 = require("./context/ws-proxy"); const exception_filters_context_1 = require("./context/exception-filters-context"); const handler_context_creator_1 = require("./handler/handler-context-creator"); const handler_consumer_1 = require("./handler/handler-consumer"); const access_1 = require("../access"); const interceptors_1 = require("../interceptors"); const sockets_container_1 = require("./sockets-container"); const web_sockets_controller_1 = require("./web-sockets-controller"); const socket_server_provider_1 = require("./socket-server-provider"); class SocketModule { constructor() { this.socketsContainer = new sockets_container_1.SocketsContainer(); } register(container, applicationConfig, graphInspector, appOptions, httpServer) { this.applicationConfig = applicationConfig; this.appOptions = appOptions; this.httpServer = httpServer; const contextCreator = this.getContextCreator(container); const serverProvider = new socket_server_provider_1.SocketServerProvider(this.socketsContainer, applicationConfig); this.webSocketsController = new web_sockets_controller_1.WebSocketsController(serverProvider, applicationConfig, contextCreator, graphInspector, this.appOptions); const modules = container.getModules(); modules.forEach(({ providers }, moduleName) => this.connectAllGateways(providers, moduleName)); } connectAllGateways(providers, moduleName) { (0, iterare_1.default)(providers.values()) .filter(wrapper => wrapper && !wrapper.isNotMetatype) .forEach(wrapper => this.connectGatewayToServer(wrapper, moduleName)); } connectGatewayToServer(wrapper, moduleName) { const { instance, metaType } = wrapper; const metadataKeys = Reflect.getMetadataKeys(metaType); if (!metadataKeys.includes(helpers_1.GATEWAY_METADATA)) { return; } if (!this.isAdapterInitialized) { this.initializeAdapter(); } this.webSocketsController.connectGatewayToServer(instance, metaType, moduleName, wrapper.id); } async close() { if (!this.applicationConfig) { return; } const adapter = this.applicationConfig.getIoAdapter(); if (!adapter) { return; } const servers = this.socketsContainer.getAll(); await Promise.all((0, iterare_1.default)(servers.values()) .filter(({ server }) => server) .map(async ({ server }) => adapter.close(server))); await (adapter === null || adapter === void 0 ? void 0 : adapter.dispose()); this.socketsContainer.clear(); } initializeAdapter() { const adapter = this.applicationConfig.getIoAdapter(); if (adapter) { this.isAdapterInitialized = true; return; } const { IoAdapter } = (0, helpers_1.loadAdapter)('socket.io', 'WebSockets', () => require('../server/io-adapter')); const ioAdapter = new IoAdapter(this.httpServer); this.applicationConfig.setIoAdapter(ioAdapter); this.isAdapterInitialized = true; } getContextCreator(container) { return new ws_context_creator_1.WsContextCreator(new ws_proxy_1.WsProxy(), new exception_filters_context_1.ExceptionFiltersContext(container), new handler_context_creator_1.HandlerContextCreator(container), new handler_consumer_1.HandlerConsumer(), new access_1.AccessResourceContextCreator(container), new access_1.AccessResourceConsumer(), new interceptors_1.InterceptorsContextCreator(container), new interceptors_1.InterceptorsConsumer()); } } exports.SocketModule = SocketModule; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ja2V0LW1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93ZWJzb2NrZXRzL3NvY2tldC1tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBT0Esd0NBQTBEO0FBQzFELHNEQUE2QjtBQUc3QixxRUFBK0Q7QUFDL0QsaURBQTRDO0FBQzVDLG1GQUE2RTtBQUM3RSwrRUFBeUU7QUFDekUsaUVBQTREO0FBQzVELHNDQUFnRjtBQUNoRixrREFBa0Y7QUFDbEYsMkRBQXNEO0FBRXRELHFFQUErRDtBQUMvRCxxRUFBK0Q7QUFFL0QsTUFBYSxZQUFZO0lBQXpCO1FBSW1CLHFCQUFnQixHQUFHLElBQUksb0NBQWdCLEVBQUUsQ0FBQTtJQWlINUQsQ0FBQztJQTFHUSxRQUFRLENBQ2IsU0FBdUIsRUFDdkIsaUJBQW9DLEVBQ3BDLGNBQThCLEVBQzlCLFVBQXVCLEVBQ3ZCLFVBQXdCO1FBRXhCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQTtRQUMxQyxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQTtRQUM1QixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQTtRQUU1QixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDeEQsTUFBTSxjQUFjLEdBQUcsSUFBSSw2Q0FBb0IsQ0FDN0MsSUFBSSxDQUFDLGdCQUFnQixFQUNyQixpQkFBaUIsQ0FDbEIsQ0FBQTtRQUNELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLDZDQUFvQixDQUNsRCxjQUFjLEVBQ2QsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCxjQUFjLEVBQ2QsSUFBSSxDQUFDLFVBQVUsQ0FDaEIsQ0FBQTtRQUNELE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUN0QyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxVQUFr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QUFFLFNBQXVCO1FBQ2hELE9BQU8sSUFBSSxxQ0FBZ0IsQ0FDekIsSUFBSSxrQkFBTyxFQUFFLEVBQ2IsSUFBSSxtREFBdUIsQ0FBQyxTQUFTLENBQUMsRUFDdEMsSUFBSSwrQ0FBcUIsQ0FBQyxTQUFTLENBQUMsRUFDcEMsSUFBSSxrQ0FBZSxFQUFFLEVBQ3JCLElBQUkscUNBQTRCLENBQUMsU0FBUyxDQUFDLEVBQzNDLElBQUksK0JBQXNCLEVBQUUsRUFDNUIsSUFBSSx5Q0FBMEIsQ0FBQyxTQUFTLENBQUMsRUFDekMsSUFBSSxtQ0FBb0IsRUFBRSxDQUMzQixDQUFBO0lBQ0gsQ0FBQztDQUNGO0FBckhELG9DQXFIQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwcGxpY2F0aW9uQ29uZmlnIH0gZnJvbSAnLi4vYXBwJ1xuaW1wb3J0IHtcbiAgQXBwbGljYXRpb25Db250ZXh0T3B0aW9uc0ludGVyZmFjZSxcbiAgQ2xlYW5HYXRld2F5LFxuICBJbmplY3Rpb25Ub2tlblxufSBmcm9tICcuLi9jb250cmFjdHMnXG5pbXBvcnQgeyBDb250YWluZXJJb0MsIEluc3RhbmNlV3JhcHBlciB9IGZyb20gJy4uL2NvcmUnXG5pbXBvcnQgeyBHQVRFV0FZX01FVEFEQVRBLCBsb2FkQWRhcHRlciB9IGZyb20gJy4uL2hlbHBlcnMnXG5pbXBvcnQgaXRlcmF0ZSBmcm9tICdpdGVyYXJlJ1xuaW1wb3J0IHsgSW5qZWN0YWJsZVR5cGUgfSBmcm9tICcuLi90eXBlcydcbmltcG9ydCB7IEFic3RyYWN0V3NBZGFwdGVyIH0gZnJvbSAnLi9hZGFwdGVycy93cy1hZGFwdGVyJ1xuaW1wb3J0IHsgV3NDb250ZXh0Q3JlYXRvciB9IGZyb20gJy4vY29udGV4dC93cy1jb250ZXh0LWNyZWF0b3InXG5pbXBvcnQgeyBXc1Byb3h5IH0gZnJvbSAnLi9jb250ZXh0L3dzLXByb3h5J1xuaW1wb3J0IHsgRXhjZXB0aW9uRmlsdGVyc0NvbnRleHQgfSBmcm9tICcuL2NvbnRleHQvZXhjZXB0aW9uLWZpbHRlcnMtY29udGV4dCdcbmltcG9ydCB7IEhhbmRsZXJDb250ZXh0Q3JlYXRvciB9IGZyb20gJy4vaGFuZGxlci9oYW5kbGVyLWNvbnRleHQtY3JlYXRvcidcbmltcG9ydCB7IEhhbmRsZXJDb25zdW1lciB9IGZyb20gJy4vaGFuZGxlci9oYW5kbGVyLWNvbnN1bWVyJ1xuaW1wb3J0IHsgQWNjZXNzUmVzb3VyY2VDb25zdW1lciwgQWNjZXNzUmVzb3VyY2VDb250ZXh0Q3JlYXRvciB9IGZyb20gJy4uL2FjY2VzcydcbmltcG9ydCB7IEludGVyY2VwdG9yc0NvbnN1bWVyLCBJbnRlcmNlcHRvcnNDb250ZXh0Q3JlYXRvciB9IGZyb20gJy4uL2ludGVyY2VwdG9ycydcbmltcG9ydCB7IFNvY2tldHNDb250YWluZXIgfSBmcm9tICcuL3NvY2tldHMtY29udGFpbmVyJ1xuaW1wb3J0IHsgR3JhcGhJbnNwZWN0b3IgfSBmcm9tICcuLi9pbnNwZWN0b3IvZ3JhcGgtaW5zcGVjdG9yJ1xuaW1wb3J0IHsgV2ViU29ja2V0c0NvbnRyb2xsZXIgfSBmcm9tICcuL3dlYi1zb2NrZXRzLWNvbnRyb2xsZXInXG5pbXBvcnQgeyBTb2NrZXRTZXJ2ZXJQcm92aWRlciB9IGZyb20gJy4vc29ja2V0LXNlcnZlci1wcm92aWRlcidcblxuZXhwb3J0IGNsYXNzIFNvY2tldE1vZHVsZTxcbiAgVEh0dHBTZXJ2ZXIgPSBhbnksXG4gIFRBcHBPcHRpb25zIGV4dGVuZHMgQXBwbGljYXRpb25Db250ZXh0T3B0aW9uc0ludGVyZmFjZSA9IEFwcGxpY2F0aW9uQ29udGV4dE9wdGlvbnNJbnRlcmZhY2Vcbj4ge1xuICBwcml2YXRlIHJlYWRvbmx5IHNvY2tldHNDb250YWluZXIgPSBuZXcgU29ja2V0c0NvbnRhaW5lcigpXG4gIHByaXZhdGUgYXBwbGljYXRpb25Db25maWc6IEFwcGxpY2F0aW9uQ29uZmlnXG4gIHByaXZhdGUgd2ViU29ja2V0c0NvbnRyb2xsZXI6IFdlYlNvY2tldHNDb250cm9sbGVyXG4gIHByaXZhdGUgaXNBZGFwdGVySW5pdGlhbGl6ZWQ6IGJvb2xlYW5cbiAgcHJpdmF0ZSBodHRwU2VydmVyOiBUSHR0cFNlcnZlciB8IHVuZGVmaW5lZFxuICBwcml2YXRlIGFwcE9wdGlvbnM6IFRBcHBPcHRpb25zXG5cbiAgcHVibGljIHJlZ2lzdGVyIChcbiAgICBjb250YWluZXI6IENvbnRhaW5lcklvQyxcbiAgICBhcHBsaWNhdGlvbkNvbmZpZzogQXBwbGljYXRpb25Db25maWcsXG4gICAgZ3JhcGhJbnNwZWN0b3I6IEdyYXBoSW5zcGVjdG9yLFxuICAgIGFwcE9wdGlvbnM6IFRBcHBPcHRpb25zLFxuICAgIGh0dHBTZXJ2ZXI/OiBUSHR0cFNlcnZlclxuICApIHtcbiAgICB0aGlzLmFwcGxpY2F0aW9uQ29uZmlnID0gYXBwbGljYXRpb25Db25maWdcbiAgICB0aGlzLmFwcE9wdGlvbnMgPSBhcHBPcHRpb25zXG4gICAgdGhpcy5odHRwU2VydmVyID0gaHR0cFNlcnZlclxuXG4gICAgY29uc3QgY29udGV4dENyZWF0b3IgPSB0aGlzLmdldENvbnRleHRDcmVhdG9yKGNvbnRhaW5lcilcbiAgICBjb25zdCBzZXJ2ZXJQcm92aWRlciA9IG5ldyBTb2NrZXRTZXJ2ZXJQcm92aWRlcihcbiAgICAgIHRoaXMuc29ja2V0c0NvbnRhaW5lcixcbiAgICAgIGFwcGxpY2F0aW9uQ29uZmlnXG4gICAgKVxuICAgIHRoaXMud2ViU29ja2V0c0NvbnRyb2xsZXIgPSBuZXcgV2ViU29ja2V0c0NvbnRyb2xsZXIoXG4gICAgICBzZXJ2ZXJQcm92aWRlcixcbiAgICAgIGFwcGxpY2F0aW9uQ29uZmlnLFxuICAgICAgY29udGV4dENyZWF0b3IsXG4gICAgICBncmFwaEluc3BlY3RvcixcbiAgICAgIHRoaXMuYXBwT3B0aW9uc1xuICAgIClcbiAgICBjb25zdCBtb2R1bGVzID0gY29udGFpbmVyLmdldE1vZHVsZXMoKVxuICAgIG1vZHVsZXMuZm9yRWFjaCgoeyBwcm92aWRlcnMgfSwgbW9kdWxlTmFtZTogc3RyaW5nKSA9PlxuICAgICAgdGhpcy5jb25uZWN0QWxsR2F0ZXdheXMocHJvdmlkZXJzLCBtb2R1bGVOYW1lKVxuICAgIClcbiAgfVxuXG4gIHB1YmxpYyBjb25uZWN0QWxsR2F0ZXdheXMgKFxuICAgIHByb3ZpZGVyczogTWFwPEluamVjdGlvblRva2VuLCBJbnN0YW5jZVdyYXBwZXI8SW5qZWN0YWJsZVR5cGU+PixcbiAgICBtb2R1bGVOYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgaXRlcmF0ZShwcm92aWRlcnMudmFsdWVzKCkpXG4gICAgICAuZmlsdGVyKHdyYXBwZXIgPT4gd3JhcHBlciAmJiAhd3JhcHBlci5pc05vdE1ldGF0eXBlKVxuICAgICAgLmZvckVhY2god3JhcHBlciA9PiB0aGlzLmNvbm5lY3RHYXRld2F5VG9TZXJ2ZXIod3JhcHBlciwgbW9kdWxlTmFtZSkpXG4gIH1cblxuICBwdWJsaWMgY29ubmVjdEdhdGV3YXlUb1NlcnZlciAoXG4gICAgd3JhcHBlcjogSW5zdGFuY2VXcmFwcGVyPEluamVjdGFibGVUeXBlPixcbiAgICBtb2R1bGVOYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgY29uc3QgeyBpbnN0YW5jZSwgbWV0YVR5cGUgfSA9IHdyYXBwZXJcbiAgICBjb25zdCBtZXRhZGF0YUtleXMgPSBSZWZsZWN0LmdldE1ldGFkYXRhS2V5cyhtZXRhVHlwZSlcbiAgICBpZiAoIW1ldGFkYXRhS2V5cy5pbmNsdWRlcyhHQVRFV0FZX01FVEFEQVRBKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICghdGhpcy5pc0FkYXB0ZXJJbml0aWFsaXplZCkge1xuICAgICAgdGhpcy5pbml0aWFsaXplQWRhcHRlcigpXG4gICAgfVxuICAgIHRoaXMud2ViU29ja2V0c0NvbnRyb2xsZXIuY29ubmVjdEdhdGV3YXlUb1NlcnZlcihcbiAgICAgIGluc3RhbmNlIGFzIENsZWFuR2F0ZXdheSxcbiAgICAgIG1ldGFUeXBlLFxuICAgICAgbW9kdWxlTmFtZSxcbiAgICAgIHdyYXBwZXIuaWRcbiAgICApXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2xvc2UgKCk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCF0aGlzLmFwcGxpY2F0aW9uQ29uZmlnKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgYWRhcHRlciA9IHRoaXMuYXBwbGljYXRpb25Db25maWcuZ2V0SW9BZGFwdGVyKClcbiAgICBpZiAoIWFkYXB0ZXIpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBzZXJ2ZXJzID0gdGhpcy5zb2NrZXRzQ29udGFpbmVyLmdldEFsbCgpXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBpdGVyYXRlKHNlcnZlcnMudmFsdWVzKCkpXG4gICAgICAgIC5maWx0ZXIoKHsgc2VydmVyIH0pID0+IHNlcnZlcilcbiAgICAgICAgLm1hcChhc3luYyAoeyBzZXJ2ZXIgfSkgPT4gYWRhcHRlci5jbG9zZShzZXJ2ZXIpKVxuICAgIClcbiAgICBhd2FpdCAoYWRhcHRlciBhcyBBYnN0cmFjdFdzQWRhcHRlcik/LmRpc3Bvc2UoKVxuXG4gICAgdGhpcy5zb2NrZXRzQ29udGFpbmVyLmNsZWFyKClcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUFkYXB0ZXIgKCkge1xuICAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLmFwcGxpY2F0aW9uQ29uZmlnLmdldElvQWRhcHRlcigpXG4gICAgaWYgKGFkYXB0ZXIpIHtcbiAgICAgIHRoaXMuaXNBZGFwdGVySW5pdGlhbGl6ZWQgPSB0cnVlXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgeyBJb0FkYXB0ZXIgfSA9IGxvYWRBZGFwdGVyKFxuICAgICAgJ3NvY2tldC5pbycsXG4gICAgICAnV2ViU29ja2V0cycsXG4gICAgICAoKSA9PiByZXF1aXJlKCcuLi9zZXJ2ZXIvaW8tYWRhcHRlcicpXG4gICAgKVxuICAgIGNvbnN0IGlvQWRhcHRlciA9IG5ldyBJb0FkYXB0ZXIodGhpcy5odHRwU2VydmVyKVxuICAgIHRoaXMuYXBwbGljYXRpb25Db25maWcuc2V0SW9BZGFwdGVyKGlvQWRhcHRlcilcblxuICAgIHRoaXMuaXNBZGFwdGVySW5pdGlhbGl6ZWQgPSB0cnVlXG4gIH1cblxuICBwcml2YXRlIGdldENvbnRleHRDcmVhdG9yIChjb250YWluZXI6IENvbnRhaW5lcklvQyk6IFdzQ29udGV4dENyZWF0b3Ige1xuICAgIHJldHVybiBuZXcgV3NDb250ZXh0Q3JlYXRvcihcbiAgICAgIG5ldyBXc1Byb3h5KCksXG4gICAgICBuZXcgRXhjZXB0aW9uRmlsdGVyc0NvbnRleHQoY29udGFpbmVyKSxcbiAgICAgIG5ldyBIYW5kbGVyQ29udGV4dENyZWF0b3IoY29udGFpbmVyKSxcbiAgICAgIG5ldyBIYW5kbGVyQ29uc3VtZXIoKSxcbiAgICAgIG5ldyBBY2Nlc3NSZXNvdXJjZUNvbnRleHRDcmVhdG9yKGNvbnRhaW5lciksXG4gICAgICBuZXcgQWNjZXNzUmVzb3VyY2VDb25zdW1lcigpLFxuICAgICAgbmV3IEludGVyY2VwdG9yc0NvbnRleHRDcmVhdG9yKGNvbnRhaW5lciksXG4gICAgICBuZXcgSW50ZXJjZXB0b3JzQ29uc3VtZXIoKVxuICAgIClcbiAgfVxufVxuIl19