@rlanz/socket 0.0.1-2 → 0.0.1-3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -9,7 +9,7 @@ import "../chunk-GKAD2UOA.js";
|
|
|
9
9
|
// providers/socket_provider.ts
|
|
10
10
|
import { ServerResponse } from "http";
|
|
11
11
|
function isMiddlewareClass(middleware) {
|
|
12
|
-
return typeof middleware === "function" && "handle" in middleware.prototype;
|
|
12
|
+
return typeof middleware === "function" && middleware.prototype !== void 0 && "handle" in middleware.prototype;
|
|
13
13
|
}
|
|
14
14
|
var SocketProvider = class {
|
|
15
15
|
constructor(app) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../providers/socket_provider.ts"],"sourcesContent":["import type { ApplicationService } from '@adonisjs/core/types'\nimport type { HttpContext, Server as AdonisServer } from '@adonisjs/core/http'\nimport type { Logger } from '@adonisjs/logger'\nimport type { MiddlewareAsClass } from '@adonisjs/core/types/http'\nimport { ServerResponse } from 'node:http'\nimport { SocketService } from '../src/socket_service.js'\nimport { ChannelRouter } from '../src/channel_router.js'\nimport { PresenceManager } from '../src/presence_manager.js'\nimport type { SocketConfig, SocketHttpMiddleware } from '../src/types.js'\n\nfunction isMiddlewareClass(middleware: SocketHttpMiddleware): middleware is MiddlewareAsClass {\n return typeof middleware === 'function'
|
|
1
|
+
{"version":3,"sources":["../../providers/socket_provider.ts"],"sourcesContent":["import type { ApplicationService } from '@adonisjs/core/types'\nimport type { HttpContext, Server as AdonisServer } from '@adonisjs/core/http'\nimport type { Logger } from '@adonisjs/logger'\nimport type { MiddlewareAsClass } from '@adonisjs/core/types/http'\nimport { ServerResponse } from 'node:http'\nimport { SocketService } from '../src/socket_service.js'\nimport { ChannelRouter } from '../src/channel_router.js'\nimport { PresenceManager } from '../src/presence_manager.js'\nimport type { SocketConfig, SocketHttpMiddleware } from '../src/types.js'\n\nfunction isMiddlewareClass(middleware: SocketHttpMiddleware): middleware is MiddlewareAsClass {\n return (\n typeof middleware === 'function' &&\n middleware.prototype !== undefined &&\n 'handle' in middleware.prototype\n )\n}\n\ndeclare module '@adonisjs/core/types' {\n interface ContainerBindings {\n 'socket': SocketService\n 'socket.router': ChannelRouter\n 'socket.presence': PresenceManager\n }\n}\n\nexport default class SocketProvider {\n constructor(protected app: ApplicationService) {}\n\n /**\n * Registers the bindings in the container.\n */\n register(): void {\n this.app.container.singleton('socket.router', () => {\n return new ChannelRouter()\n })\n\n this.app.container.singleton('socket.presence', () => {\n return new PresenceManager()\n })\n\n this.app.container.singleton('socket', () => {\n return new SocketService()\n })\n }\n\n /**\n * Boots the provider.\n */\n async boot(): Promise<void> {\n const router = await this.app.container.make('socket.router')\n\n // Discover and register channel classes.\n await this.#registerChannels(router)\n }\n\n /**\n * Called when the app is ready and the HTTP server is running.\n */\n async ready(): Promise<void> {\n const socket = await this.app.container.make('socket')\n const router = await this.app.container.make('socket.router')\n const presence = await this.app.container.make('socket.presence')\n const logger = await this.#resolveLogger()\n const config = this.app.config.get<SocketConfig>('socket', {})\n\n socket.setPresenceManager(presence)\n\n logger.info('router has %d channels registered', router.size)\n\n const server = await this.app.container.make('server')\n const httpServer = server.getNodeServer()\n\n if (!httpServer) {\n const error = new Error('HTTP server not available.')\n socket.markFailed(error)\n logger.warn('HTTP server not available; socket server was not started')\n return\n }\n\n try {\n await socket.boot(httpServer, this.#withHttpContextFactory(config, server), router, logger)\n logger.info('server started')\n } catch (error) {\n socket.markFailed(error)\n throw error\n }\n }\n\n /**\n * Performs a clean shutdown.\n */\n async shutdown(): Promise<void> {\n const socket = await this.app.container.make('socket')\n await socket.close()\n }\n\n /**\n * Resolves the AdonisJS logger and creates a child logger for the socket context.\n */\n async #resolveLogger(): Promise<Logger> {\n const logger = await this.app.container.make('logger')\n return logger.child({ module: 'socket' })\n }\n\n /**\n * Creates an AdonisJS HTTP context for WebSocket upgrade requests.\n */\n #withHttpContextFactory(config: SocketConfig, server: AdonisServer): SocketConfig {\n const middleware = config.websocket?.middleware ?? []\n\n if (!config.websocket?.authenticate && middleware.length === 0) {\n return config\n }\n\n const createContext = config.websocket?.createContext\n\n return {\n ...config,\n websocket: {\n ...config.websocket,\n createContextOnUpgrade: middleware.length > 0,\n createContext: async (request) => {\n if (createContext) {\n const httpContext = await createContext(request)\n await this.#runUpgradeMiddleware(server, middleware, httpContext)\n return httpContext\n }\n\n const response = new ServerResponse(request)\n const adonisRequest = server.createRequest(request, response)\n const adonisResponse = server.createResponse(request, response)\n\n const httpContext = server.createHttpContext(\n adonisRequest,\n adonisResponse,\n this.app.container.createResolver()\n )\n\n await this.#runUpgradeMiddleware(server, middleware, httpContext)\n\n return httpContext\n },\n },\n }\n }\n\n /**\n * Runs middleware attached to WebSocket upgrade requests.\n */\n async #runUpgradeMiddleware(\n server: AdonisServer,\n middleware: NonNullable<NonNullable<SocketConfig['websocket']>['middleware']>,\n httpContext: unknown\n ): Promise<void> {\n if (middleware.length === 0) {\n return\n }\n\n const ctx = httpContext as HttpContext\n const middlewareClasses = await Promise.all(\n middleware.map(async (one) => {\n if (isMiddlewareClass(one)) {\n return one\n }\n\n const moduleExports = await one()\n return moduleExports.default\n })\n )\n\n await server\n .pipeline(middlewareClasses as MiddlewareAsClass[])\n .errorHandler((error) => {\n throw error\n })\n .finalHandler(async () => {})\n .run(ctx)\n }\n\n /**\n * Scans and registers channel classes.\n */\n async #registerChannels(router: ChannelRouter): Promise<void> {\n const logger = await this.#resolveLogger()\n const { glob } = await import('node:fs/promises')\n const { resolve } = await import('node:path')\n\n const config = this.app.config.get<SocketConfig>('socket', {})\n const patterns = config.channels?.patterns ?? ['app/channels/**/*_channel.{ts,js}']\n\n for (const channelPattern of patterns) {\n const pattern = this.app.makePath(channelPattern)\n\n for await (const file of glob(pattern)) {\n try {\n const absolutePath = resolve(file)\n const module = await import(`file://${absolutePath}`)\n const channelClass = module.default\n\n if (channelClass?.pattern) {\n router.register(channelClass)\n logger.info('registered channel: %s', channelClass.pattern)\n }\n } catch (error) {\n logger.warn('failed to load channel from %s: %s', file, error)\n }\n }\n }\n\n logger.info('total channels registered: %d', router.size)\n }\n}\n"],"mappings":";;;;;;;;;AAIA,SAAS,sBAAsB;AAM/B,SAAS,kBAAkB,YAAmE;AAC5F,SACE,OAAO,eAAe,cACtB,WAAW,cAAc,UACzB,YAAY,WAAW;AAE3B;AAUA,IAAqB,iBAArB,MAAoC;AAAA,EAClC,YAAsB,KAAyB;AAAzB;AAAA,EAA0B;AAAA;AAAA;AAAA;AAAA,EAKhD,WAAiB;AACf,SAAK,IAAI,UAAU,UAAU,iBAAiB,MAAM;AAClD,aAAO,IAAI,cAAc;AAAA,IAC3B,CAAC;AAED,SAAK,IAAI,UAAU,UAAU,mBAAmB,MAAM;AACpD,aAAO,IAAI,gBAAgB;AAAA,IAC7B,CAAC;AAED,SAAK,IAAI,UAAU,UAAU,UAAU,MAAM;AAC3C,aAAO,IAAI,cAAc;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAsB;AAC1B,UAAM,SAAS,MAAM,KAAK,IAAI,UAAU,KAAK,eAAe;AAG5D,UAAM,KAAK,kBAAkB,MAAM;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAuB;AAC3B,UAAM,SAAS,MAAM,KAAK,IAAI,UAAU,KAAK,QAAQ;AACrD,UAAM,SAAS,MAAM,KAAK,IAAI,UAAU,KAAK,eAAe;AAC5D,UAAM,WAAW,MAAM,KAAK,IAAI,UAAU,KAAK,iBAAiB;AAChE,UAAM,SAAS,MAAM,KAAK,eAAe;AACzC,UAAM,SAAS,KAAK,IAAI,OAAO,IAAkB,UAAU,CAAC,CAAC;AAE7D,WAAO,mBAAmB,QAAQ;AAElC,WAAO,KAAK,qCAAqC,OAAO,IAAI;AAE5D,UAAM,SAAS,MAAM,KAAK,IAAI,UAAU,KAAK,QAAQ;AACrD,UAAM,aAAa,OAAO,cAAc;AAExC,QAAI,CAAC,YAAY;AACf,YAAM,QAAQ,IAAI,MAAM,4BAA4B;AACpD,aAAO,WAAW,KAAK;AACvB,aAAO,KAAK,0DAA0D;AACtE;AAAA,IACF;AAEA,QAAI;AACF,YAAM,OAAO,KAAK,YAAY,KAAK,wBAAwB,QAAQ,MAAM,GAAG,QAAQ,MAAM;AAC1F,aAAO,KAAK,gBAAgB;AAAA,IAC9B,SAAS,OAAO;AACd,aAAO,WAAW,KAAK;AACvB,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAA0B;AAC9B,UAAM,SAAS,MAAM,KAAK,IAAI,UAAU,KAAK,QAAQ;AACrD,UAAM,OAAO,MAAM;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAkC;AACtC,UAAM,SAAS,MAAM,KAAK,IAAI,UAAU,KAAK,QAAQ;AACrD,WAAO,OAAO,MAAM,EAAE,QAAQ,SAAS,CAAC;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAwB,QAAsB,QAAoC;AAChF,UAAM,aAAa,OAAO,WAAW,cAAc,CAAC;AAEpD,QAAI,CAAC,OAAO,WAAW,gBAAgB,WAAW,WAAW,GAAG;AAC9D,aAAO;AAAA,IACT;AAEA,UAAM,gBAAgB,OAAO,WAAW;AAExC,WAAO;AAAA,MACL,GAAG;AAAA,MACH,WAAW;AAAA,QACT,GAAG,OAAO;AAAA,QACV,wBAAwB,WAAW,SAAS;AAAA,QAC5C,eAAe,OAAO,YAAY;AAChC,cAAI,eAAe;AACjB,kBAAMA,eAAc,MAAM,cAAc,OAAO;AAC/C,kBAAM,KAAK,sBAAsB,QAAQ,YAAYA,YAAW;AAChE,mBAAOA;AAAA,UACT;AAEA,gBAAM,WAAW,IAAI,eAAe,OAAO;AAC3C,gBAAM,gBAAgB,OAAO,cAAc,SAAS,QAAQ;AAC5D,gBAAM,iBAAiB,OAAO,eAAe,SAAS,QAAQ;AAE9D,gBAAM,cAAc,OAAO;AAAA,YACzB;AAAA,YACA;AAAA,YACA,KAAK,IAAI,UAAU,eAAe;AAAA,UACpC;AAEA,gBAAM,KAAK,sBAAsB,QAAQ,YAAY,WAAW;AAEhE,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBACJ,QACA,YACA,aACe;AACf,QAAI,WAAW,WAAW,GAAG;AAC3B;AAAA,IACF;AAEA,UAAM,MAAM;AACZ,UAAM,oBAAoB,MAAM,QAAQ;AAAA,MACtC,WAAW,IAAI,OAAO,QAAQ;AAC5B,YAAI,kBAAkB,GAAG,GAAG;AAC1B,iBAAO;AAAA,QACT;AAEA,cAAM,gBAAgB,MAAM,IAAI;AAChC,eAAO,cAAc;AAAA,MACvB,CAAC;AAAA,IACH;AAEA,UAAM,OACH,SAAS,iBAAwC,EACjD,aAAa,CAAC,UAAU;AACvB,YAAM;AAAA,IACR,CAAC,EACA,aAAa,YAAY;AAAA,IAAC,CAAC,EAC3B,IAAI,GAAG;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,QAAsC;AAC5D,UAAM,SAAS,MAAM,KAAK,eAAe;AACzC,UAAM,EAAE,KAAK,IAAI,MAAM,OAAO,aAAkB;AAChD,UAAM,EAAE,QAAQ,IAAI,MAAM,OAAO,MAAW;AAE5C,UAAM,SAAS,KAAK,IAAI,OAAO,IAAkB,UAAU,CAAC,CAAC;AAC7D,UAAM,WAAW,OAAO,UAAU,YAAY,CAAC,mCAAmC;AAElF,eAAW,kBAAkB,UAAU;AACrC,YAAM,UAAU,KAAK,IAAI,SAAS,cAAc;AAEhD,uBAAiB,QAAQ,KAAK,OAAO,GAAG;AACtC,YAAI;AACF,gBAAM,eAAe,QAAQ,IAAI;AACjC,gBAAM,SAAS,MAAM,OAAO,UAAU,YAAY;AAClD,gBAAM,eAAe,OAAO;AAE5B,cAAI,cAAc,SAAS;AACzB,mBAAO,SAAS,YAAY;AAC5B,mBAAO,KAAK,0BAA0B,aAAa,OAAO;AAAA,UAC5D;AAAA,QACF,SAAS,OAAO;AACd,iBAAO,KAAK,sCAAsC,MAAM,KAAK;AAAA,QAC/D;AAAA,MACF;AAAA,IACF;AAEA,WAAO,KAAK,iCAAiC,OAAO,IAAI;AAAA,EAC1D;AACF;","names":["httpContext"]}
|