UNPKG

@nexica/nestjs-trpc

Version:
117 lines 5.04 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var ExpressDriver_1; Object.defineProperty(exports, "__esModule", { value: true }); exports.ExpressDriver = void 0; const common_1 = require("@nestjs/common"); const trpcExpress = require("@trpc/server/adapters/express"); const ws_1 = require("@trpc/server/adapters/ws"); const ws_2 = require("ws"); let ExpressDriver = ExpressDriver_1 = class ExpressDriver { constructor() { Object.defineProperty(this, "logger", { enumerable: true, configurable: true, writable: true, value: new common_1.Logger(ExpressDriver_1.name) }); Object.defineProperty(this, "wssHandler", { enumerable: true, configurable: true, writable: true, value: null }); } start(options, app, appRouter, contextInstance) { var _a; try { const basePath = (_a = options.basePath) !== null && _a !== void 0 ? _a : '/trpc'; this.logger.log(`Mounting tRPC at path: ${basePath}`); const middleware = trpcExpress.createExpressMiddleware(Object.assign({ router: appRouter }, (options.context != null && contextInstance != null ? { createContext: (opts) => contextInstance.create(opts), } : {}))); app.use(basePath, middleware); this.setupWebSocketHandler(options, appRouter, contextInstance); this.logger.log('tRPC Express middleware installed successfully'); return true; } catch (error) { this.logger.error('Failed to initialize tRPC Express middleware:', error); return false; } } setupWebSocketHandler(options, appRouter, contextInstance) { const websocketOptions = options.websocket; if (!websocketOptions || websocketOptions.enabled === false) { this.logger.log('WebSocket subscriptions disabled - skipping WebSocket setup'); return; } try { let wss; if (websocketOptions.wss) { wss = websocketOptions.wss; this.logger.log('Using provided WebSocket server for subscriptions'); } else if (websocketOptions.port) { wss = new ws_2.WebSocketServer({ port: websocketOptions.port, path: websocketOptions.path || '/trpc', }); this.logger.log(`Created WebSocket server on port ${websocketOptions.port}`); } else { this.logger.warn('No WebSocket server configuration provided - subscriptions will not work'); return; } this.wssHandler = (0, ws_1.applyWSSHandler)(Object.assign({ wss, router: appRouter }, (options.context != null && contextInstance != null ? { createContext: (opts) => { return contextInstance.create(opts); }, } : {}))); this.logger.log('WebSocket handler applied successfully - subscriptions are now supported'); wss.on('connection', (ws) => { this.logger.debug('New WebSocket connection established'); ws.on('close', () => { this.logger.debug('WebSocket connection closed'); }); ws.on('error', (error) => { this.logger.error('WebSocket error:', error); }); }); wss.on('error', (error) => { this.logger.error('WebSocket server error:', error); }); } catch (error) { this.logger.error('Failed to setup WebSocket handler:', error); } } getWebSocketHandler() { return this.wssHandler; } shutdown() { if (this.wssHandler) { try { this.wssHandler.broadcastReconnectNotification(); this.logger.log('WebSocket handler shutdown completed'); } catch (error) { this.logger.error('Error during WebSocket handler shutdown:', error); } } } }; exports.ExpressDriver = ExpressDriver; exports.ExpressDriver = ExpressDriver = ExpressDriver_1 = __decorate([ (0, common_1.Injectable)() ], ExpressDriver); //# sourceMappingURL=express.driver.js.map