@nsshunt/stssocketioutils 2.0.32 → 2.0.34

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.
package/dist/node.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"node.mjs","sources":["../src/socketIoServer.ts"],"sourcesContent":["/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\nimport { ISTSLogger, JSONObject, Sleep } from '@nsshunt/stsutils'\n\nimport { Server, Namespace, Socket, ServerOptions } from \"socket.io\";\n\nimport { STSDefaultClientToServerEvents, STSDefaultServerToClientEvents, STSServerSocket, \n InterServerEvents } from './commonTypes'\n\n//import { createClient, RedisClientType } from 'redis';\nimport { Redis } from 'ioredis';\n\nimport { createAdapter as clusterCreateAdapter } from '@socket.io/cluster-adapter'\nimport { createAdapter } from \"@socket.io/redis-streams-adapter\";\n\nimport { TinyEmitter } from 'tiny-emitter';\n\nexport interface ISocketIoServerOpitons {\n listenPort?: number\n ioRedisMessageProcessorUrl?: string\n wssCustomPath?: string\n serverClusterMode?: boolean\n}\n \nexport abstract class SocketIoServer<ClientToServerEvents extends STSDefaultClientToServerEvents, ServerToClientEvents extends STSDefaultServerToClientEvents> extends TinyEmitter {\n protected namespace?: string\n protected socketionamespace?: Namespace<STSDefaultClientToServerEvents, STSDefaultServerToClientEvents, InterServerEvents>\n //protected socketionamespace?: Namespace<ClientToServerEvents, ServerToClientEvents, InterServerEvents>\n protected logger?: ISTSLogger\n protected io?: Server<ClientToServerEvents, ServerToClientEvents>;\n //#redisClient: RedisClientType | Redis | null = null;\n protected redisClient?: Redis;\n protected listenPort?: number;\n protected socketIoCustomPath?: string;\n protected ioRedisMessageProcessorUrl?: string;\n protected serverClusterMode?: boolean;\n protected rooms?: string[];\n protected serverName: string\n protected draining: boolean = false;\n protected attached: boolean = false;\n\n constructor(serverName: string) { // IProcessBase\n super();\n this.serverName = serverName;\n }\n\n protected abstract SocketDisconnect(socket: Socket<ClientToServerEvents, ServerToClientEvents>, reason: string): void;\n\n protected abstract SocketDisconnecting(socket: Socket<ClientToServerEvents, ServerToClientEvents>, reason: string): void;\n\n protected abstract SocketError(socket: Socket<ClientToServerEvents, ServerToClientEvents>, error: Error): void;\n\n protected abstract SocketConnect(socket: Socket<ClientToServerEvents, ServerToClientEvents>): void;\n\n protected abstract SetupSocketEvents(socket: Socket<ClientToServerEvents, ServerToClientEvents>): void;\n\n protected get logPrefix(): string {\n if (this.namespace) {\n return `SocketIoServer[${this.serverName}:${this.namespace}]: `;\n } else {\n return `SocketIoServer[${this.serverName}:<No Namespace>]: `;\n }\n }\n\n protected LogErrorMessage(message: any) {\n if (this.logger) {\n this.logger.error(`${this.logPrefix}${message}`);\n }\n }\n\n protected LogDebugMessage(message: any) {\n if (this.logger) {\n this.logger.debug(`${this.logPrefix}${message}`);\n }\n }\n\n protected LogInfoMessage(message: any) {\n if (this.logger) {\n this.logger.info(`${this.logPrefix}${message}`);\n }\n }\n\n protected LogWarnMessage(message: any) {\n if (this.logger) {\n this.logger.warn(`${this.logPrefix}${message}`);\n }\n }\n\n protected LogSillyMessage(message: any) {\n if (this.logger) {\n this.logger.silly(`${this.logPrefix}${message}`);\n }\n }\n\n protected LogVerboseMessage(message: any) {\n if (this.logger) {\n this.logger.verbose(`${this.logPrefix}${message}`);\n }\n }\n\n protected LogHttpMessage(message: any) {\n if (this.logger) {\n this.logger.http(`${this.logPrefix}${message}`);\n }\n }\n\n // https://socket.io/docs/v4/middlewares/\n // https://socket.io/docs/v4/server-socket-instance/#sockethandshake\n // https://socket.io/docs/v4/server-socket-instance/#socket-middlewares\n // Use this middleward to check every incomming connection\n protected SetupConnectionMiddleware = () => { };\n\n // Use this middleware to check every packet being received\n protected SetupMessageMiddleware = (socket: STSServerSocket) => { };\n\n /*\n protected GetConfig = (socketIoServeroptions: ISocketIoServerOpitons): Partial<ServerOptions> => {\n //this.#redisClient = createClient({url: this.#options.ioRedisMessageProcessorUrl});\n //await this.#redisClient.connect();\n this.LogDebugMessage(`GetConfig() transports: [ [websocket] ]`);\n const options: Partial<ServerOptions> = {\n transports: [ \"websocket\" ], // or [ \"websocket\", \"polling\" ] (to use long-poolling. Note that the order matters)\n }\n\n if (socketIoServeroptions.ioRedisMessageProcessorUrl && socketIoServeroptions.ioRedisMessageProcessorUrl !== '') {\n this.redisClient = new Redis(socketIoServeroptions.ioRedisMessageProcessorUrl);\n this.LogDebugMessage(`GetConfig() createAdapter(redis): redis url: [${socketIoServeroptions.ioRedisMessageProcessorUrl}]`);\n options.adapter = createAdapter(this.redisClient) as any;\n } else if (socketIoServeroptions.serverClusterMode && socketIoServeroptions.serverClusterMode === true) {\n this.LogDebugMessage(`GetConfig() createAdapter(cluster)`);\n options.adapter = clusterCreateAdapter() as any;\n }\n\n if (socketIoServeroptions.wssCustomPath && socketIoServeroptions.wssCustomPath.localeCompare('') !== 0) {\n this.LogDebugMessage(`GetConfig() wssCustomPath: [${socketIoServeroptions.wssCustomPath}]`);\n options.path = socketIoServeroptions.wssCustomPath;\n }\n\n return options;\n }\n */\n\n protected SetEngineEvents = () => {\n if (this.io) {\n this.io.engine.on(\"connection_error\", (err) => {\n this.LogWarnMessage(`SetEngineEvents(): connection_error`); // the request object\n this.LogWarnMessage(err.req); // the request object\n this.LogWarnMessage(err.code); // the error code, for example 1\n this.LogWarnMessage(err.message); // the error message, for example \"Session ID unknown\"\n this.LogWarnMessage(err.context); // some additional error context\n });\n }\n }\n\n WithLogger = (logger: ISTSLogger) => {\n this.logger = logger;\n return this;\n }\n\n WithListenPort = (listenPort: number) => {\n this.listenPort = listenPort;\n return this;\n }\n\n WithSocketIoCustomPath = (socketIoCustomPath: string) => {\n this.socketIoCustomPath = socketIoCustomPath;\n return this;\n }\n\n WithIoRedisMessageProcessorUrl = (ioRedisMessageProcessorUrl: string) => {\n this.ioRedisMessageProcessorUrl = ioRedisMessageProcessorUrl;\n return this;\n }\n\n WithClusterMode = (serverClusterMode: boolean) => {\n this.serverClusterMode = serverClusterMode;\n return this;\n }\n\n WithRooms = (rooms: string[]) => {\n this.rooms = rooms;\n return this;\n }\n\n WithNamespace = (namespace: string) => {\n this.namespace = namespace;\n return this;\n }\n\n AttachSocketIoServer = async (server: Server): Promise<SocketIoServer<ClientToServerEvents, ServerToClientEvents>> => {\n if (!this.io) {\n this.LogInfoMessage(`AttachServer(): io = server`);\n this.io = server;\n\n this.LogInfoMessage(`AttachServer(): attached = true`);\n this.attached = true;\n\n this.LogInfoMessage(`AttachServer(): SetupNamespace()`);\n this.SetupNamespace();\n } else {\n const errorMessage = (this.attached === true ? `AttachServer(): Server already exists (from AttachServer())` : `AttachServer(): Server already exists (from StartServer())`);\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n return this;\n }\n\n StartSocketIoServer = async (): Promise<SocketIoServer<ClientToServerEvents, ServerToClientEvents>> => {\n //this.#io = require(\"socket.io\")(this.#httpServer, options);\n if (!this.namespace) {\n const errorMessage = `StartServer(): Error: [namespace not specified]`;\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n\n if (!this.io) {\n if (!this.listenPort) {\n const errorMessage = `StartServer(): Error: [listenPort not specified]`;\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n\n this.LogDebugMessage(`StartServer(): draining = false`);\n this.draining = false;\n\n this.LogDebugMessage(`StartServer(): transports: [ [websocket] ]`);\n const options: Partial<ServerOptions> = {\n transports: [ \"websocket\" ], // or [ \"websocket\", \"polling\" ] (to use long-poolling. Note that the order matters)\n }\n\n if (this.ioRedisMessageProcessorUrl && this.ioRedisMessageProcessorUrl !== '') {\n this.redisClient = new Redis(this.ioRedisMessageProcessorUrl);\n this.LogDebugMessage(`StartServer(): createAdapter(redis): redis url: [${this.ioRedisMessageProcessorUrl}]`);\n options.adapter = createAdapter(this.redisClient) as any;\n } else if (this.serverClusterMode && this.serverClusterMode === true) {\n this.LogDebugMessage(`StartServer(): createAdapter(cluster)`);\n options.adapter = clusterCreateAdapter() as any;\n }\n\n if (this.socketIoCustomPath && this.socketIoCustomPath.localeCompare('') !== 0) {\n this.LogDebugMessage(`StartServer(): socketIoCustomPath: [${this.socketIoCustomPath}]`);\n options.path = this.socketIoCustomPath;\n }\n\n this.LogDebugMessage(`StartServer(): new Server(): listenPort: [${this.listenPort}]`);\n this.io = new Server(this.listenPort, options);\n\n this.LogDebugMessage(`StartServer(): SetEngineEvents()`);\n this.SetEngineEvents();\n\n this.LogDebugMessage(`StartServer(): Sleeping ...`);\n await Sleep(500);\n this.LogDebugMessage(`StartServer(): Done Sleeping`);\n\n this.LogInfoMessage(`AttachServer(): attached = false`);\n this.attached = false;\n\n this.LogInfoMessage(`StartServer(): SetupNamespace()`);\n this.SetupNamespace();\n\n } else {\n const errorMessage = (this.attached === true ? `StartServer(): Server already exists (from AttachServer())` : `StartServer(): Server already exists (from StartServer())`);\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n return this;\n }\n\n DetachSockerIoServer = async (): Promise<void> => {\n if (this.io) {\n if (this.attached === true) {\n this.LogInfoMessage(`DetachServer(): StopNamespace()`);\n await this.StopNamespace();\n this.io = undefined;\n this.LogInfoMessage(`DetachServer(): attached = false`);\n this.attached = false;\n } else {\n const errorMessage = `DetachServer(): Error: [Server has not been attached. Use StopServer() to stop the socker.io server.]`;\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n } else {\n const errorMessage = `DetachServer(): Error: [no server exists to DetachServer()]`;\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n }\n\n StopSocketIoServer = async () => {\n if (this.io) {\n if (this.attached === false) {\n // We are now draining connections\n this.LogInfoMessage(`StopServer(): draining = true`);\n this.draining = true;\n\n this.LogInfoMessage(`StopServer(): StopNamespace()`);\n await this.StopNamespace();\n\n this.LogInfoMessage(`StopServer(): io.of('/').adapter.close()`);\n await this.io.of('/').adapter.close();\n\n if (this.redisClient) {\n this.LogInfoMessage(`StopServer(): redisClient.disconnect()`);\n await this.redisClient.disconnect();\n this.LogInfoMessage(`StopServer(): redisClient.disconnect() (Sleeping...)`);\n await Sleep(50);\n this.LogInfoMessage(`StopServer(): redisClient.disconnect() (Done Sleeping)`);\n }\n\n // boot all current connections\n this.LogInfoMessage(`StopServer(): io.disconnectSockets()`);\n this.io.disconnectSockets();\n\n // Stop any future connections, close this server (does not close the underlying http(s) server if io server via that method\n this.LogInfoMessage(`StopServer(): io.close()`);\n this.io.close();\n\n this.LogInfoMessage(`StopServer(): io = undefined`);\n this.io = undefined;\n } else {\n const errorMessage = `StopServer(): Cannot stop an attached server. The server created must handle stop/disconnections. Use StopNamespace() instead.`;\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n } else {\n const errorMessage = `StopServer(): Error: [no server exists to StopServer()]`;\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n }\n\n LeaveRoom = (socket: STSServerSocket, room: string): void => {\n this.LogDebugMessage(`LeaveRoom(): Leaving room [${room}]`);\n socket.leave(room);\n };\n\n JoinRoom = (socket: STSServerSocket, room: string): void => {\n this.LogDebugMessage(`JoinRoom(): Socket joining room [${room}], ID: [${socket.id}]`);\n socket.join(room);\n };\n\n protected StopNamespace = async() => {\n this.LogInfoMessage(`StopServer(): CloseNamespaceAdaptors()`);\n await this.CloseNamespaceAdaptors();\n\n this.LogInfoMessage(`StopServer(): DisconnectNamespaceSockets()`);\n this.DisconnectNamespaceSockets();\n }\n\n protected SetupStandardEvents = (socket: STSServerSocket): void => {\n socket.on('disconnect', (reason: string) => {\n this.LogDebugMessage(`SetupStandardEvents(): socket disconnect, ID: [${socket.id}], reason: [${reason}]`);\n this.SocketDisconnect(socket, reason);\n });\n\n socket.on('disconnecting', (reason: string) => {\n this.LogDebugMessage(`SetupStandardEvents(): socket disconnecting, ID: [${socket.id}], reason: [${reason}]`);\n this.SocketDisconnecting(socket, reason);\n });\n\n socket.on('error', (error: Error) => {\n this.LogDebugMessage(`SetupStandardEvents(): socket error, ID: [${socket.id}], Error: [${error}]`);\n this.SocketError(socket, error);\n });\n\n socket.on(\"__STSdisconnect\", (reason: string) => {\n this.LogDebugMessage(`SetupStandardEvents(): __STSdisconnect: socket disconnect, ID: [${socket.id}], reason: [${reason}]`);\n });\n\n socket.on(\"__STSdisconnecting\", (reason, callBackResult) => {\n this.LogDebugMessage(`SetupStandardEvents(): __STSdisconnecting: socket disconnecting, ID: [${socket.id}], reason: [${reason}]`);\n callBackResult(\"__STSdisconnecting accepted by server.\");\n });\n\n socket.on('__STSjoinRoom', (rooms: string[]): void => { //@@ names\n rooms.forEach((room) => {\n this.LogDebugMessage(`SetupStandardEvents(): __STSjoinRoom: room: [${room}], socket: [${socket.id}]`);\n this.JoinRoom(socket, room)\n });\n });\n\n socket.on('__STSleaveRoom', (rooms: string[]): void => { //@@ names\n rooms.forEach((room) => {\n this.LogDebugMessage(`SetupStandardEvents(): __STSleaveRoom: room: [${room}], socket: [${socket.id}]`);\n this.LeaveRoom(socket, room);\n });\n });\n\n socket.on('__STSsendToRoom', (rooms: string[], payload: { command: string, payload: JSONObject }): void => {\n rooms.forEach((room) => {\n if (this.socketionamespace) {\n this.LogDebugMessage(`SetupStandardEvents(): socket.on: __STSsendToRoom: Sending to room [${room}], ID: [${socket.id}], Command: [${payload.command}]`);\n this.socketionamespace.to(room).emit(payload.command as any, payload);\n }\n });\n });\n\n socket.on('__STSsendToRoomWithCallback', (room: string, timeout: number, payload: { command: string, payload: JSONObject }, cb: (data: JSONObject) => void): void => {\n if (this.socketionamespace) {\n this.LogDebugMessage(`SetupStandardEvents(): socket.on: __STSsendToRoomWithCallback: Sending to room [${room}], ID: [${socket.id}], timeout: [${timeout}], Command: [${payload.command}]`);\n this.socketionamespace.to(room).timeout(timeout).emit(payload.command as any, payload, (err: Error, dataResponse: JSONObject[]) => {\n if (err) {\n console.error(err);\n const errorResponse = {\n error: true, \n errorName: err.name, \n errorMessage: err.message,\n //errorCause: err.cause,\n //errorStack: err.stack\n };\n this.LogErrorMessage(`SetupStandardEvents(): __STSsendToRoomWithCallback broadcast (error): [${JSON.stringify(errorResponse)}]`)\n cb(errorResponse);\n } else {\n this.LogDebugMessage(`SetupStandardEvents(): __STSsendToRoomWithCallback broadcast: [${JSON.stringify(dataResponse)}]`)\n cb(dataResponse);\n }\n });\n }\n });\n\n socket.on('__STSsendToRoomsWithCallback', (rooms: string[], timeout: number, payload: { command: string, payload: JSONObject }, cb: (data: JSONObject) => void): void => {\n const responses: any[] = [ ];\n\n const timeoutForComplete = setTimeout(() => {\n // for this timeout case, sent back the error response and the responses we have received so far ...\n responses.push({\n room: '',\n responses: {\n error: true,\n errorName: 'timeout',\n errorMessage: `__STSsendToRoomsWithCallback timeout: [${timeout}] before all responses received`\n }\n });\n cb(responses);\n }, timeout).unref();\n\n rooms.forEach((room) => {\n if (this.socketionamespace) {\n this.LogDebugMessage(`SetupStandardEvents(): socket.on: __STSsendToRoomsWithCallback: Sending to room [${room}], ID: [${socket.id}], timeout: [${timeout}], Command: [${payload.command}]`);\n this.socketionamespace.to(room).timeout(timeout).emit(payload.command as any, payload, (err: Error, dataResponse: JSONObject[]) => {\n if (err) {\n console.error(err);\n const errorResponse = {\n error: true, \n errorName: err.name, \n errorMessage: err.message,\n //errorCause: err.cause,\n //errorStack: err.stack\n };\n this.LogErrorMessage(`SetupStandardEvents(): __STSsendToRoomWithCallback broadcast (error): [${JSON.stringify(errorResponse)}]`)\n responses.push({\n room,\n responses: errorResponse\n });\n } else {\n this.LogDebugMessage(`SetupStandardEvents(): __STSsendToRoomWithCallback broadcast: [${JSON.stringify(dataResponse)}]`)\n responses.push({\n room,\n responses: dataResponse\n });\n }\n if (responses.length === rooms.length) {\n clearTimeout(timeoutForComplete);\n this.LogDebugMessage(`SetupStandardEvents(): socket.on: __STSsendToRoomsWithCallback: All complete, Responses Count: [${responses.length}] Invoke call back(responses)`);\n cb(responses);\n }\n });\n }\n });\n });\n }\n\n protected ConnectionDrainingConnectionMiddleware = (): void => {\n if (this.socketionamespace) {\n this.socketionamespace.use((socket, next) => {\n if (this.draining === true) {\n next(new Error(`ConnectionDrainingConnectionMiddleware(): Error: [server connections draining (from a server disconnect)]`));\n } else {\n next();\n }\n });\n }\n }\n \n protected SetupNamespace = (): SocketIoServer<ClientToServerEvents, ServerToClientEvents> => {\n // Create STS Command Centre Client namespace\n if (this.io) {\n this.LogDebugMessage(`SetupNamespace(): socketionamespace = io.of('/${this.namespace}/'`);\n this.socketionamespace = this.io.of(`/${this.namespace}/`);\n\n this.LogDebugMessage(`SetupNamespace(): ConnectionDrainingConnectionMiddleware()`);\n this.ConnectionDrainingConnectionMiddleware();\n\n this.LogDebugMessage(`SetupNamespace(): SetupConnectionMiddleware()`);\n this.SetupConnectionMiddleware();\n\n this.socketionamespace.on(\"connection\", socket => {\n this.LogDebugMessage(`SetupNamespace(): Socket connected, ID: [${socket.id}]`);\n this.LogDebugMessage(`SetupNamespace(): Authentication Handshake (auth): [${JSON.stringify(socket.handshake.auth)}]`);\n this.LogDebugMessage(`SetupNamespace(): Authentication Handshake (host): [${JSON.stringify(socket.handshake.headers.host)}]`);\n this.LogDebugMessage(`SetupNamespace(): Authentication Handshake (url): [${JSON.stringify(socket.handshake.url)}]`);\n this.LogDebugMessage(`SetupNamespace(): Authentication Handshake: [${JSON.stringify(socket.handshake)}]`);\n\n this.LogDebugMessage(`SetupNamespace(): SetupMessageMiddleware(): Socket: [${socket.id}]`);\n this.SetupMessageMiddleware(socket);\n\n if (this.rooms && this.rooms.length > 0) {\n this.rooms.map((room) => {\n this.LogDebugMessage(`SetupNamespace(): Joining Room: [${room}], Socket: [${socket.id}]`);\n this.JoinRoom(socket, room);\n });\n }\n\n this.LogDebugMessage(`SetupNamespace(): SetupStandardEvents: Socket: [${socket.id}]`);\n this.SetupStandardEvents(socket);\n\n setTimeout(() => {\n this.LogDebugMessage(`SetupNamespace(): SocketConnectCallBack(): Socket: [${socket.id}]`);\n this.SocketConnect(socket);\n }, 0);\n\n this.LogDebugMessage(`SetupNamespace(): SocketEventsCallBack(): Socket: [${socket.id}]`);\n this.SetupSocketEvents(socket);\n });\n } else {\n const errorMessage = `SetupNamespace(): Error: [No server attached]`;\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n\n return this;\n }\n\n protected CloseNamespaceAdaptors = async (): Promise<void> => {\n if (this.socketionamespace) {\n this.LogDebugMessage(`CloseNamespaceAdaptors(): this.socketionamespace.adapter.close()`);\n await this.socketionamespace.adapter.close();\n }\n }\n\n protected DisconnectNamespaceSockets = (): void => {\n if (this.socketionamespace) {\n this.LogDebugMessage(`DisconnectNamespaceSockets(): this.socketionamespace.disconnectSockets()`);\n this.socketionamespace.disconnectSockets();\n this.socketionamespace = undefined;\n }\n }\n}\n"],"names":["TinyEmitter","clusterCreateAdapter"],"mappings":"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"}
1
+ {"version":3,"file":"node.mjs","names":[],"sources":["../src/socketIoServer.ts"],"sourcesContent":["/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\nimport { ISTSLogger, JSONObject, Sleep } from '@nsshunt/stsutils'\n\nimport { Server, Namespace, Socket, ServerOptions } from \"socket.io\";\n\nimport { STSDefaultClientToServerEvents, STSDefaultServerToClientEvents, STSServerSocket, \n InterServerEvents } from './commonTypes'\n\n//import { createClient, RedisClientType } from 'redis';\nimport { Redis } from 'ioredis';\n\nimport { createAdapter as clusterCreateAdapter } from '@socket.io/cluster-adapter'\nimport { createAdapter } from \"@socket.io/redis-streams-adapter\";\n\nimport { TinyEmitter } from 'tiny-emitter';\n\nexport interface ISocketIoServerOpitons {\n listenPort?: number\n ioRedisMessageProcessorUrl?: string\n wssCustomPath?: string\n serverClusterMode?: boolean\n}\n \nexport abstract class SocketIoServer<ClientToServerEvents extends STSDefaultClientToServerEvents, ServerToClientEvents extends STSDefaultServerToClientEvents> extends TinyEmitter {\n protected namespace?: string\n protected socketionamespace?: Namespace<STSDefaultClientToServerEvents, STSDefaultServerToClientEvents, InterServerEvents>\n //protected socketionamespace?: Namespace<ClientToServerEvents, ServerToClientEvents, InterServerEvents>\n protected logger?: ISTSLogger\n protected io?: Server<ClientToServerEvents, ServerToClientEvents>;\n //#redisClient: RedisClientType | Redis | null = null;\n protected redisClient?: Redis;\n protected listenPort?: number;\n protected socketIoCustomPath?: string;\n protected ioRedisMessageProcessorUrl?: string;\n protected serverClusterMode?: boolean;\n protected rooms?: string[];\n protected serverName: string\n protected draining: boolean = false;\n protected attached: boolean = false;\n\n constructor(serverName: string) { // IProcessBase\n super();\n this.serverName = serverName;\n }\n\n protected abstract SocketDisconnect(socket: Socket<ClientToServerEvents, ServerToClientEvents>, reason: string): void;\n\n protected abstract SocketDisconnecting(socket: Socket<ClientToServerEvents, ServerToClientEvents>, reason: string): void;\n\n protected abstract SocketError(socket: Socket<ClientToServerEvents, ServerToClientEvents>, error: Error): void;\n\n protected abstract SocketConnect(socket: Socket<ClientToServerEvents, ServerToClientEvents>): void;\n\n protected abstract SetupSocketEvents(socket: Socket<ClientToServerEvents, ServerToClientEvents>): void;\n\n protected get logPrefix(): string {\n if (this.namespace) {\n return `SocketIoServer[${this.serverName}:${this.namespace}]: `;\n } else {\n return `SocketIoServer[${this.serverName}:<No Namespace>]: `;\n }\n }\n\n protected LogErrorMessage(message: any) {\n if (this.logger) {\n this.logger.error(`${this.logPrefix}${message}`);\n }\n }\n\n protected LogDebugMessage(message: any) {\n if (this.logger) {\n this.logger.debug(`${this.logPrefix}${message}`);\n }\n }\n\n protected LogInfoMessage(message: any) {\n if (this.logger) {\n this.logger.info(`${this.logPrefix}${message}`);\n }\n }\n\n protected LogWarnMessage(message: any) {\n if (this.logger) {\n this.logger.warn(`${this.logPrefix}${message}`);\n }\n }\n\n protected LogSillyMessage(message: any) {\n if (this.logger) {\n this.logger.silly(`${this.logPrefix}${message}`);\n }\n }\n\n protected LogVerboseMessage(message: any) {\n if (this.logger) {\n this.logger.verbose(`${this.logPrefix}${message}`);\n }\n }\n\n protected LogHttpMessage(message: any) {\n if (this.logger) {\n this.logger.http(`${this.logPrefix}${message}`);\n }\n }\n\n // https://socket.io/docs/v4/middlewares/\n // https://socket.io/docs/v4/server-socket-instance/#sockethandshake\n // https://socket.io/docs/v4/server-socket-instance/#socket-middlewares\n // Use this middleward to check every incomming connection\n protected SetupConnectionMiddleware = () => { };\n\n // Use this middleware to check every packet being received\n protected SetupMessageMiddleware = (socket: STSServerSocket) => { };\n\n /*\n protected GetConfig = (socketIoServeroptions: ISocketIoServerOpitons): Partial<ServerOptions> => {\n //this.#redisClient = createClient({url: this.#options.ioRedisMessageProcessorUrl});\n //await this.#redisClient.connect();\n this.LogDebugMessage(`GetConfig() transports: [ [websocket] ]`);\n const options: Partial<ServerOptions> = {\n transports: [ \"websocket\" ], // or [ \"websocket\", \"polling\" ] (to use long-poolling. Note that the order matters)\n }\n\n if (socketIoServeroptions.ioRedisMessageProcessorUrl && socketIoServeroptions.ioRedisMessageProcessorUrl !== '') {\n this.redisClient = new Redis(socketIoServeroptions.ioRedisMessageProcessorUrl);\n this.LogDebugMessage(`GetConfig() createAdapter(redis): redis url: [${socketIoServeroptions.ioRedisMessageProcessorUrl}]`);\n options.adapter = createAdapter(this.redisClient) as any;\n } else if (socketIoServeroptions.serverClusterMode && socketIoServeroptions.serverClusterMode === true) {\n this.LogDebugMessage(`GetConfig() createAdapter(cluster)`);\n options.adapter = clusterCreateAdapter() as any;\n }\n\n if (socketIoServeroptions.wssCustomPath && socketIoServeroptions.wssCustomPath.localeCompare('') !== 0) {\n this.LogDebugMessage(`GetConfig() wssCustomPath: [${socketIoServeroptions.wssCustomPath}]`);\n options.path = socketIoServeroptions.wssCustomPath;\n }\n\n return options;\n }\n */\n\n protected SetEngineEvents = () => {\n if (this.io) {\n this.io.engine.on(\"connection_error\", (err) => {\n this.LogWarnMessage(`SetEngineEvents(): connection_error`); // the request object\n this.LogWarnMessage(err.req); // the request object\n this.LogWarnMessage(err.code); // the error code, for example 1\n this.LogWarnMessage(err.message); // the error message, for example \"Session ID unknown\"\n this.LogWarnMessage(err.context); // some additional error context\n });\n }\n }\n\n WithLogger = (logger: ISTSLogger) => {\n this.logger = logger;\n return this;\n }\n\n WithListenPort = (listenPort: number) => {\n this.listenPort = listenPort;\n return this;\n }\n\n WithSocketIoCustomPath = (socketIoCustomPath: string) => {\n this.socketIoCustomPath = socketIoCustomPath;\n return this;\n }\n\n WithIoRedisMessageProcessorUrl = (ioRedisMessageProcessorUrl: string) => {\n this.ioRedisMessageProcessorUrl = ioRedisMessageProcessorUrl;\n return this;\n }\n\n WithClusterMode = (serverClusterMode: boolean) => {\n this.serverClusterMode = serverClusterMode;\n return this;\n }\n\n WithRooms = (rooms: string[]) => {\n this.rooms = rooms;\n return this;\n }\n\n WithNamespace = (namespace: string) => {\n this.namespace = namespace;\n return this;\n }\n\n AttachSocketIoServer = async (server: Server): Promise<SocketIoServer<ClientToServerEvents, ServerToClientEvents>> => {\n if (!this.io) {\n this.LogInfoMessage(`AttachServer(): io = server`);\n this.io = server;\n\n this.LogInfoMessage(`AttachServer(): attached = true`);\n this.attached = true;\n\n this.LogInfoMessage(`AttachServer(): SetupNamespace()`);\n this.SetupNamespace();\n } else {\n const errorMessage = (this.attached === true ? `AttachServer(): Server already exists (from AttachServer())` : `AttachServer(): Server already exists (from StartServer())`);\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n return this;\n }\n\n StartSocketIoServer = async (): Promise<SocketIoServer<ClientToServerEvents, ServerToClientEvents>> => {\n //this.#io = require(\"socket.io\")(this.#httpServer, options);\n if (!this.namespace) {\n const errorMessage = `StartServer(): Error: [namespace not specified]`;\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n\n if (!this.io) {\n if (!this.listenPort) {\n const errorMessage = `StartServer(): Error: [listenPort not specified]`;\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n\n this.LogDebugMessage(`StartServer(): draining = false`);\n this.draining = false;\n\n this.LogDebugMessage(`StartServer(): transports: [ [websocket] ]`);\n const options: Partial<ServerOptions> = {\n transports: [ \"websocket\" ], // or [ \"websocket\", \"polling\" ] (to use long-poolling. Note that the order matters)\n }\n\n if (this.ioRedisMessageProcessorUrl && this.ioRedisMessageProcessorUrl !== '') {\n this.redisClient = new Redis(this.ioRedisMessageProcessorUrl);\n this.LogDebugMessage(`StartServer(): createAdapter(redis): redis url: [${this.ioRedisMessageProcessorUrl}]`);\n options.adapter = createAdapter(this.redisClient) as any;\n } else if (this.serverClusterMode && this.serverClusterMode === true) {\n this.LogDebugMessage(`StartServer(): createAdapter(cluster)`);\n options.adapter = clusterCreateAdapter() as any;\n }\n\n if (this.socketIoCustomPath && this.socketIoCustomPath.localeCompare('') !== 0) {\n this.LogDebugMessage(`StartServer(): socketIoCustomPath: [${this.socketIoCustomPath}]`);\n options.path = this.socketIoCustomPath;\n }\n\n this.LogDebugMessage(`StartServer(): new Server(): listenPort: [${this.listenPort}]`);\n this.io = new Server(this.listenPort, options);\n\n this.LogDebugMessage(`StartServer(): SetEngineEvents()`);\n this.SetEngineEvents();\n\n this.LogDebugMessage(`StartServer(): Sleeping ...`);\n await Sleep(500);\n this.LogDebugMessage(`StartServer(): Done Sleeping`);\n\n this.LogInfoMessage(`AttachServer(): attached = false`);\n this.attached = false;\n\n this.LogInfoMessage(`StartServer(): SetupNamespace()`);\n this.SetupNamespace();\n\n } else {\n const errorMessage = (this.attached === true ? `StartServer(): Server already exists (from AttachServer())` : `StartServer(): Server already exists (from StartServer())`);\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n return this;\n }\n\n DetachSockerIoServer = async (): Promise<void> => {\n if (this.io) {\n if (this.attached === true) {\n this.LogInfoMessage(`DetachServer(): StopNamespace()`);\n await this.StopNamespace();\n this.io = undefined;\n this.LogInfoMessage(`DetachServer(): attached = false`);\n this.attached = false;\n } else {\n const errorMessage = `DetachServer(): Error: [Server has not been attached. Use StopServer() to stop the socker.io server.]`;\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n } else {\n const errorMessage = `DetachServer(): Error: [no server exists to DetachServer()]`;\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n }\n\n StopSocketIoServer = async () => {\n if (this.io) {\n if (this.attached === false) {\n // We are now draining connections\n this.LogInfoMessage(`StopServer(): draining = true`);\n this.draining = true;\n\n this.LogInfoMessage(`StopServer(): StopNamespace()`);\n await this.StopNamespace();\n\n this.LogInfoMessage(`StopServer(): io.of('/').adapter.close()`);\n await this.io.of('/').adapter.close();\n\n if (this.redisClient) {\n this.LogInfoMessage(`StopServer(): redisClient.disconnect()`);\n await this.redisClient.disconnect();\n this.LogInfoMessage(`StopServer(): redisClient.disconnect() (Sleeping...)`);\n await Sleep(50);\n this.LogInfoMessage(`StopServer(): redisClient.disconnect() (Done Sleeping)`);\n }\n\n // boot all current connections\n this.LogInfoMessage(`StopServer(): io.disconnectSockets()`);\n this.io.disconnectSockets();\n\n // Stop any future connections, close this server (does not close the underlying http(s) server if io server via that method\n this.LogInfoMessage(`StopServer(): io.close()`);\n this.io.close();\n\n this.LogInfoMessage(`StopServer(): io = undefined`);\n this.io = undefined;\n } else {\n const errorMessage = `StopServer(): Cannot stop an attached server. The server created must handle stop/disconnections. Use StopNamespace() instead.`;\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n } else {\n const errorMessage = `StopServer(): Error: [no server exists to StopServer()]`;\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n }\n\n LeaveRoom = (socket: STSServerSocket, room: string): void => {\n this.LogDebugMessage(`LeaveRoom(): Leaving room [${room}]`);\n socket.leave(room);\n };\n\n JoinRoom = (socket: STSServerSocket, room: string): void => {\n this.LogDebugMessage(`JoinRoom(): Socket joining room [${room}], ID: [${socket.id}]`);\n socket.join(room);\n };\n\n protected StopNamespace = async() => {\n this.LogInfoMessage(`StopServer(): CloseNamespaceAdaptors()`);\n await this.CloseNamespaceAdaptors();\n\n this.LogInfoMessage(`StopServer(): DisconnectNamespaceSockets()`);\n this.DisconnectNamespaceSockets();\n }\n\n protected SetupStandardEvents = (socket: STSServerSocket): void => {\n socket.on('disconnect', (reason: string) => {\n this.LogDebugMessage(`SetupStandardEvents(): socket disconnect, ID: [${socket.id}], reason: [${reason}]`);\n this.SocketDisconnect(socket, reason);\n });\n\n socket.on('disconnecting', (reason: string) => {\n this.LogDebugMessage(`SetupStandardEvents(): socket disconnecting, ID: [${socket.id}], reason: [${reason}]`);\n this.SocketDisconnecting(socket, reason);\n });\n\n socket.on('error', (error: Error) => {\n this.LogDebugMessage(`SetupStandardEvents(): socket error, ID: [${socket.id}], Error: [${error}]`);\n this.SocketError(socket, error);\n });\n\n socket.on(\"__STSdisconnect\", (reason: string) => {\n this.LogDebugMessage(`SetupStandardEvents(): __STSdisconnect: socket disconnect, ID: [${socket.id}], reason: [${reason}]`);\n });\n\n socket.on(\"__STSdisconnecting\", (reason, callBackResult) => {\n this.LogDebugMessage(`SetupStandardEvents(): __STSdisconnecting: socket disconnecting, ID: [${socket.id}], reason: [${reason}]`);\n callBackResult(\"__STSdisconnecting accepted by server.\");\n });\n\n socket.on('__STSjoinRoom', (rooms: string[]): void => { //@@ names\n rooms.forEach((room) => {\n this.LogDebugMessage(`SetupStandardEvents(): __STSjoinRoom: room: [${room}], socket: [${socket.id}]`);\n this.JoinRoom(socket, room)\n });\n });\n\n socket.on('__STSleaveRoom', (rooms: string[]): void => { //@@ names\n rooms.forEach((room) => {\n this.LogDebugMessage(`SetupStandardEvents(): __STSleaveRoom: room: [${room}], socket: [${socket.id}]`);\n this.LeaveRoom(socket, room);\n });\n });\n\n socket.on('__STSsendToRoom', (rooms: string[], payload: { command: string, payload: JSONObject }): void => {\n rooms.forEach((room) => {\n if (this.socketionamespace) {\n this.LogDebugMessage(`SetupStandardEvents(): socket.on: __STSsendToRoom: Sending to room [${room}], ID: [${socket.id}], Command: [${payload.command}]`);\n this.socketionamespace.to(room).emit(payload.command as any, payload);\n }\n });\n });\n\n socket.on('__STSsendToRoomWithCallback', (room: string, timeout: number, payload: { command: string, payload: JSONObject }, cb: (data: JSONObject) => void): void => {\n if (this.socketionamespace) {\n this.LogDebugMessage(`SetupStandardEvents(): socket.on: __STSsendToRoomWithCallback: Sending to room [${room}], ID: [${socket.id}], timeout: [${timeout}], Command: [${payload.command}]`);\n this.socketionamespace.to(room).timeout(timeout).emit(payload.command as any, payload, (err: Error, dataResponse: JSONObject[]) => {\n if (err) {\n console.error(err);\n const errorResponse = {\n error: true, \n errorName: err.name, \n errorMessage: err.message,\n //errorCause: err.cause,\n //errorStack: err.stack\n };\n this.LogErrorMessage(`SetupStandardEvents(): __STSsendToRoomWithCallback broadcast (error): [${JSON.stringify(errorResponse)}]`)\n cb(errorResponse);\n } else {\n this.LogDebugMessage(`SetupStandardEvents(): __STSsendToRoomWithCallback broadcast: [${JSON.stringify(dataResponse)}]`)\n cb(dataResponse);\n }\n });\n }\n });\n\n socket.on('__STSsendToRoomsWithCallback', (rooms: string[], timeout: number, payload: { command: string, payload: JSONObject }, cb: (data: JSONObject) => void): void => {\n const responses: any[] = [ ];\n\n const timeoutForComplete = setTimeout(() => {\n // for this timeout case, sent back the error response and the responses we have received so far ...\n responses.push({\n room: '',\n responses: {\n error: true,\n errorName: 'timeout',\n errorMessage: `__STSsendToRoomsWithCallback timeout: [${timeout}] before all responses received`\n }\n });\n cb(responses);\n }, timeout).unref();\n\n rooms.forEach((room) => {\n if (this.socketionamespace) {\n this.LogDebugMessage(`SetupStandardEvents(): socket.on: __STSsendToRoomsWithCallback: Sending to room [${room}], ID: [${socket.id}], timeout: [${timeout}], Command: [${payload.command}]`);\n this.socketionamespace.to(room).timeout(timeout).emit(payload.command as any, payload, (err: Error, dataResponse: JSONObject[]) => {\n if (err) {\n console.error(err);\n const errorResponse = {\n error: true, \n errorName: err.name, \n errorMessage: err.message,\n //errorCause: err.cause,\n //errorStack: err.stack\n };\n this.LogErrorMessage(`SetupStandardEvents(): __STSsendToRoomWithCallback broadcast (error): [${JSON.stringify(errorResponse)}]`)\n responses.push({\n room,\n responses: errorResponse\n });\n } else {\n this.LogDebugMessage(`SetupStandardEvents(): __STSsendToRoomWithCallback broadcast: [${JSON.stringify(dataResponse)}]`)\n responses.push({\n room,\n responses: dataResponse\n });\n }\n if (responses.length === rooms.length) {\n clearTimeout(timeoutForComplete);\n this.LogDebugMessage(`SetupStandardEvents(): socket.on: __STSsendToRoomsWithCallback: All complete, Responses Count: [${responses.length}] Invoke call back(responses)`);\n cb(responses);\n }\n });\n }\n });\n });\n }\n\n protected ConnectionDrainingConnectionMiddleware = (): void => {\n if (this.socketionamespace) {\n this.socketionamespace.use((socket, next) => {\n if (this.draining === true) {\n next(new Error(`ConnectionDrainingConnectionMiddleware(): Error: [server connections draining (from a server disconnect)]`));\n } else {\n next();\n }\n });\n }\n }\n \n protected SetupNamespace = (): SocketIoServer<ClientToServerEvents, ServerToClientEvents> => {\n // Create STS Command Centre Client namespace\n if (this.io) {\n this.LogDebugMessage(`SetupNamespace(): socketionamespace = io.of('/${this.namespace}/'`);\n this.socketionamespace = this.io.of(`/${this.namespace}/`);\n\n this.LogDebugMessage(`SetupNamespace(): ConnectionDrainingConnectionMiddleware()`);\n this.ConnectionDrainingConnectionMiddleware();\n\n this.LogDebugMessage(`SetupNamespace(): SetupConnectionMiddleware()`);\n this.SetupConnectionMiddleware();\n\n this.socketionamespace.on(\"connection\", socket => {\n this.LogDebugMessage(`SetupNamespace(): Socket connected, ID: [${socket.id}]`);\n this.LogDebugMessage(`SetupNamespace(): Authentication Handshake (auth): [${JSON.stringify(socket.handshake.auth)}]`);\n this.LogDebugMessage(`SetupNamespace(): Authentication Handshake (host): [${JSON.stringify(socket.handshake.headers.host)}]`);\n this.LogDebugMessage(`SetupNamespace(): Authentication Handshake (url): [${JSON.stringify(socket.handshake.url)}]`);\n this.LogDebugMessage(`SetupNamespace(): Authentication Handshake: [${JSON.stringify(socket.handshake)}]`);\n\n this.LogDebugMessage(`SetupNamespace(): SetupMessageMiddleware(): Socket: [${socket.id}]`);\n this.SetupMessageMiddleware(socket);\n\n if (this.rooms && this.rooms.length > 0) {\n this.rooms.map((room) => {\n this.LogDebugMessage(`SetupNamespace(): Joining Room: [${room}], Socket: [${socket.id}]`);\n this.JoinRoom(socket, room);\n });\n }\n\n this.LogDebugMessage(`SetupNamespace(): SetupStandardEvents: Socket: [${socket.id}]`);\n this.SetupStandardEvents(socket);\n\n setTimeout(() => {\n this.LogDebugMessage(`SetupNamespace(): SocketConnectCallBack(): Socket: [${socket.id}]`);\n this.SocketConnect(socket);\n }, 0);\n\n this.LogDebugMessage(`SetupNamespace(): SocketEventsCallBack(): Socket: [${socket.id}]`);\n this.SetupSocketEvents(socket);\n });\n } else {\n const errorMessage = `SetupNamespace(): Error: [No server attached]`;\n this.LogErrorMessage(errorMessage);\n throw new Error(errorMessage);\n }\n\n return this;\n }\n\n protected CloseNamespaceAdaptors = async (): Promise<void> => {\n if (this.socketionamespace) {\n this.LogDebugMessage(`CloseNamespaceAdaptors(): this.socketionamespace.adapter.close()`);\n await this.socketionamespace.adapter.close();\n }\n }\n\n protected DisconnectNamespaceSockets = (): void => {\n if (this.socketionamespace) {\n this.LogDebugMessage(`DisconnectNamespaceSockets(): this.socketionamespace.disconnectSockets()`);\n this.socketionamespace.disconnectSockets();\n this.socketionamespace = undefined;\n }\n }\n}\n"],"mappings":";;;;;;;;AAuBA,IAAsB,iBAAtB,cAAuK,oBAAA,YAAY;CAC/K;CACA;CAEA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,WAA8B;CAC9B,WAA8B;CAE9B,YAAY,YAAoB;AAC5B,SAAO;AACP,OAAK,aAAa;;CAatB,IAAc,YAAoB;AAC9B,MAAI,KAAK,UACL,QAAO,kBAAkB,KAAK,WAAW,GAAG,KAAK,UAAU;MAE3D,QAAO,kBAAkB,KAAK,WAAW;;CAIjD,gBAA0B,SAAc;AACpC,MAAI,KAAK,OACL,MAAK,OAAO,MAAM,GAAG,KAAK,YAAY,UAAU;;CAIxD,gBAA0B,SAAc;AACpC,MAAI,KAAK,OACL,MAAK,OAAO,MAAM,GAAG,KAAK,YAAY,UAAU;;CAIxD,eAAyB,SAAc;AACnC,MAAI,KAAK,OACL,MAAK,OAAO,KAAK,GAAG,KAAK,YAAY,UAAU;;CAIvD,eAAyB,SAAc;AACnC,MAAI,KAAK,OACL,MAAK,OAAO,KAAK,GAAG,KAAK,YAAY,UAAU;;CAIvD,gBAA0B,SAAc;AACpC,MAAI,KAAK,OACL,MAAK,OAAO,MAAM,GAAG,KAAK,YAAY,UAAU;;CAIxD,kBAA4B,SAAc;AACtC,MAAI,KAAK,OACL,MAAK,OAAO,QAAQ,GAAG,KAAK,YAAY,UAAU;;CAI1D,eAAyB,SAAc;AACnC,MAAI,KAAK,OACL,MAAK,OAAO,KAAK,GAAG,KAAK,YAAY,UAAU;;CAQvD,kCAA4C;CAG5C,0BAAoC,WAA4B;CA6BhE,wBAAkC;AAC9B,MAAI,KAAK,GACL,MAAK,GAAG,OAAO,GAAG,qBAAqB,QAAQ;AAC3C,QAAK,eAAe,sCAAsC;AAC1D,QAAK,eAAe,IAAI,IAAI;AAC5B,QAAK,eAAe,IAAI,KAAK;AAC7B,QAAK,eAAe,IAAI,QAAQ;AAChC,QAAK,eAAe,IAAI,QAAQ;IAClC;;CAIV,cAAc,WAAuB;AACjC,OAAK,SAAS;AACd,SAAO;;CAGX,kBAAkB,eAAuB;AACrC,OAAK,aAAa;AAClB,SAAO;;CAGX,0BAA0B,uBAA+B;AACrD,OAAK,qBAAqB;AAC1B,SAAO;;CAGX,kCAAkC,+BAAuC;AACrE,OAAK,6BAA6B;AAClC,SAAO;;CAGX,mBAAmB,sBAA+B;AAC9C,OAAK,oBAAoB;AACzB,SAAO;;CAGX,aAAa,UAAoB;AAC7B,OAAK,QAAQ;AACb,SAAO;;CAGX,iBAAiB,cAAsB;AACnC,OAAK,YAAY;AACjB,SAAO;;CAGX,uBAAuB,OAAO,WAAwF;AAClH,MAAI,CAAC,KAAK,IAAI;AACV,QAAK,eAAe,8BAA8B;AAClD,QAAK,KAAK;AAEV,QAAK,eAAe,kCAAkC;AACtD,QAAK,WAAW;AAEhB,QAAK,eAAe,mCAAmC;AACvD,QAAK,gBAAgB;SAClB;GACH,MAAM,eAAgB,KAAK,aAAa,OAAO,gEAAgE;AAC/G,QAAK,gBAAgB,aAAa;AAClC,SAAM,IAAI,MAAM,aAAa;;AAEjC,SAAO;;CAGX,sBAAsB,YAAiF;AAEnG,MAAI,CAAC,KAAK,WAAW;GACjB,MAAM,eAAe;AACrB,QAAK,gBAAgB,aAAa;AAClC,SAAM,IAAI,MAAM,aAAa;;AAGjC,MAAI,CAAC,KAAK,IAAI;AACV,OAAI,CAAC,KAAK,YAAY;IAClB,MAAM,eAAe;AACrB,SAAK,gBAAgB,aAAa;AAClC,UAAM,IAAI,MAAM,aAAa;;AAGjC,QAAK,gBAAgB,kCAAkC;AACvD,QAAK,WAAW;AAEhB,QAAK,gBAAgB,6CAA6C;GAClE,MAAM,UAAkC,EACpC,YAAY,CAAE,YAAa,EAC9B;AAED,OAAI,KAAK,8BAA8B,KAAK,+BAA+B,IAAI;AAC3E,SAAK,cAAc,IAAI,MAAM,KAAK,2BAA2B;AAC7D,SAAK,gBAAgB,oDAAoD,KAAK,2BAA2B,GAAG;AAC5G,YAAQ,UAAU,gBAAc,KAAK,YAAY;cAC1C,KAAK,qBAAqB,KAAK,sBAAsB,MAAM;AAClE,SAAK,gBAAgB,wCAAwC;AAC7D,YAAQ,UAAU,eAAsB;;AAG5C,OAAI,KAAK,sBAAsB,KAAK,mBAAmB,cAAc,GAAG,KAAK,GAAG;AAC5E,SAAK,gBAAgB,uCAAuC,KAAK,mBAAmB,GAAG;AACvF,YAAQ,OAAO,KAAK;;AAGxB,QAAK,gBAAgB,6CAA6C,KAAK,WAAW,GAAG;AACrF,QAAK,KAAK,IAAI,OAAO,KAAK,YAAY,QAAQ;AAE9C,QAAK,gBAAgB,mCAAmC;AACxD,QAAK,iBAAiB;AAEtB,QAAK,gBAAgB,8BAA8B;AACnD,SAAM,MAAM,IAAI;AAChB,QAAK,gBAAgB,+BAA+B;AAEpD,QAAK,eAAe,mCAAmC;AACvD,QAAK,WAAW;AAEhB,QAAK,eAAe,kCAAkC;AACtD,QAAK,gBAAgB;SAElB;GACH,MAAM,eAAgB,KAAK,aAAa,OAAO,+DAA+D;AAC9G,QAAK,gBAAgB,aAAa;AAClC,SAAM,IAAI,MAAM,aAAa;;AAEjC,SAAO;;CAGX,uBAAuB,YAA2B;AAC9C,MAAI,KAAK,GACL,KAAI,KAAK,aAAa,MAAM;AACxB,QAAK,eAAe,kCAAkC;AACtD,SAAM,KAAK,eAAe;AAC1B,QAAK,KAAK,KAAA;AACV,QAAK,eAAe,mCAAmC;AACvD,QAAK,WAAW;SACb;GACH,MAAM,eAAe;AACrB,QAAK,gBAAgB,aAAa;AAClC,SAAM,IAAI,MAAM,aAAa;;OAE9B;GACH,MAAM,eAAe;AACrB,QAAK,gBAAgB,aAAa;AAClC,SAAM,IAAI,MAAM,aAAa;;;CAIrC,qBAAqB,YAAY;AAC7B,MAAI,KAAK,GACL,KAAI,KAAK,aAAa,OAAO;AAEzB,QAAK,eAAe,gCAAgC;AACpD,QAAK,WAAW;AAEhB,QAAK,eAAe,gCAAgC;AACpD,SAAM,KAAK,eAAe;AAE1B,QAAK,eAAe,2CAA2C;AAC/D,SAAM,KAAK,GAAG,GAAG,IAAI,CAAC,QAAQ,OAAO;AAErC,OAAI,KAAK,aAAa;AAClB,SAAK,eAAe,yCAAyC;AAC7D,UAAM,KAAK,YAAY,YAAY;AACnC,SAAK,eAAe,uDAAuD;AAC3E,UAAM,MAAM,GAAG;AACf,SAAK,eAAe,yDAAyD;;AAIjF,QAAK,eAAe,uCAAuC;AAC3D,QAAK,GAAG,mBAAmB;AAG3B,QAAK,eAAe,2BAA2B;AAC/C,QAAK,GAAG,OAAO;AAEf,QAAK,eAAe,+BAA+B;AACnD,QAAK,KAAK,KAAA;SACP;GACH,MAAM,eAAe;AACrB,QAAK,gBAAgB,aAAa;AAClC,SAAM,IAAI,MAAM,aAAa;;OAE9B;GACH,MAAM,eAAe;AACrB,QAAK,gBAAgB,aAAa;AAClC,SAAM,IAAI,MAAM,aAAa;;;CAIrC,aAAa,QAAyB,SAAuB;AACzD,OAAK,gBAAgB,8BAA8B,KAAK,GAAG;AAC3D,SAAO,MAAM,KAAK;;CAGtB,YAAY,QAAyB,SAAuB;AACxD,OAAK,gBAAgB,oCAAoC,KAAK,UAAU,OAAO,GAAG,GAAG;AACrF,SAAO,KAAK,KAAK;;CAGrB,gBAA0B,YAAW;AACjC,OAAK,eAAe,yCAAyC;AAC7D,QAAM,KAAK,wBAAwB;AAEnC,OAAK,eAAe,6CAA6C;AACjE,OAAK,4BAA4B;;CAGrC,uBAAiC,WAAkC;AAC/D,SAAO,GAAG,eAAe,WAAmB;AACxC,QAAK,gBAAgB,kDAAkD,OAAO,GAAG,cAAc,OAAO,GAAG;AACzG,QAAK,iBAAiB,QAAQ,OAAO;IACvC;AAEF,SAAO,GAAG,kBAAkB,WAAmB;AAC3C,QAAK,gBAAgB,qDAAqD,OAAO,GAAG,cAAc,OAAO,GAAG;AAC5G,QAAK,oBAAoB,QAAQ,OAAO;IAC1C;AAEF,SAAO,GAAG,UAAU,UAAiB;AACjC,QAAK,gBAAgB,6CAA6C,OAAO,GAAG,aAAa,MAAM,GAAG;AAClG,QAAK,YAAY,QAAQ,MAAM;IACjC;AAEF,SAAO,GAAG,oBAAoB,WAAmB;AAC7C,QAAK,gBAAgB,mEAAmE,OAAO,GAAG,cAAc,OAAO,GAAG;IAC5H;AAEF,SAAO,GAAG,uBAAuB,QAAQ,mBAAmB;AACxD,QAAK,gBAAgB,yEAAyE,OAAO,GAAG,cAAc,OAAO,GAAG;AAChI,kBAAe,yCAAyC;IAC1D;AAEF,SAAO,GAAG,kBAAkB,UAA0B;AAClD,SAAM,SAAS,SAAS;AACpB,SAAK,gBAAgB,gDAAgD,KAAK,cAAc,OAAO,GAAG,GAAG;AACrG,SAAK,SAAS,QAAQ,KAAK;KAC7B;IACJ;AAEF,SAAO,GAAG,mBAAmB,UAA0B;AACnD,SAAM,SAAS,SAAS;AACpB,SAAK,gBAAgB,iDAAiD,KAAK,cAAc,OAAO,GAAG,GAAG;AACtG,SAAK,UAAU,QAAQ,KAAK;KAC9B;IACJ;AAEF,SAAO,GAAG,oBAAoB,OAAiB,YAA4D;AACvG,SAAM,SAAS,SAAS;AACpB,QAAI,KAAK,mBAAmB;AACxB,UAAK,gBAAgB,uEAAuE,KAAK,UAAU,OAAO,GAAG,eAAe,QAAQ,QAAQ,GAAG;AACvJ,UAAK,kBAAkB,GAAG,KAAK,CAAC,KAAK,QAAQ,SAAgB,QAAQ;;KAE3E;IACJ;AAEF,SAAO,GAAG,gCAAgC,MAAc,SAAiB,SAAmD,OAAyC;AACjK,OAAI,KAAK,mBAAmB;AACxB,SAAK,gBAAgB,mFAAmF,KAAK,UAAU,OAAO,GAAG,eAAe,QAAQ,eAAe,QAAQ,QAAQ,GAAG;AAC1L,SAAK,kBAAkB,GAAG,KAAK,CAAC,QAAQ,QAAQ,CAAC,KAAK,QAAQ,SAAgB,UAAU,KAAY,iBAA+B;AAC/H,SAAI,KAAK;AACL,cAAQ,MAAM,IAAI;MAClB,MAAM,gBAAgB;OAClB,OAAO;OACP,WAAW,IAAI;OACf,cAAc,IAAI;OAGrB;AACD,WAAK,gBAAgB,0EAA0E,KAAK,UAAU,cAAc,CAAC,GAAG;AAChI,SAAG,cAAc;YACd;AACH,WAAK,gBAAgB,kEAAkE,KAAK,UAAU,aAAa,CAAC,GAAG;AACvH,SAAG,aAAa;;MAEtB;;IAER;AAEF,SAAO,GAAG,iCAAiC,OAAiB,SAAiB,SAAmD,OAAyC;GACrK,MAAM,YAAmB,EAAG;GAE5B,MAAM,qBAAqB,iBAAiB;AAExC,cAAU,KAAK;KACX,MAAM;KACN,WAAW;MACP,OAAO;MACP,WAAW;MACX,cAAc,0CAA0C,QAAQ;MACnE;KACJ,CAAC;AACF,OAAG,UAAU;MACd,QAAQ,CAAC,OAAO;AAEnB,SAAM,SAAS,SAAS;AACpB,QAAI,KAAK,mBAAmB;AACxB,UAAK,gBAAgB,oFAAoF,KAAK,UAAU,OAAO,GAAG,eAAe,QAAQ,eAAe,QAAQ,QAAQ,GAAG;AAC3L,UAAK,kBAAkB,GAAG,KAAK,CAAC,QAAQ,QAAQ,CAAC,KAAK,QAAQ,SAAgB,UAAU,KAAY,iBAA+B;AAC/H,UAAI,KAAK;AACL,eAAQ,MAAM,IAAI;OAClB,MAAM,gBAAgB;QAClB,OAAO;QACP,WAAW,IAAI;QACf,cAAc,IAAI;QAGrB;AACD,YAAK,gBAAgB,0EAA0E,KAAK,UAAU,cAAc,CAAC,GAAG;AAChI,iBAAU,KAAK;QACX;QACA,WAAW;QACd,CAAC;aACC;AACH,YAAK,gBAAgB,kEAAkE,KAAK,UAAU,aAAa,CAAC,GAAG;AACvH,iBAAU,KAAK;QACX;QACA,WAAW;QACd,CAAC;;AAEN,UAAI,UAAU,WAAW,MAAM,QAAQ;AACnC,oBAAa,mBAAmB;AAChC,YAAK,gBAAgB,mGAAmG,UAAU,OAAO,+BAA+B;AACxK,UAAG,UAAU;;OAEnB;;KAER;IACJ;;CAGN,+CAA+D;AAC3D,MAAI,KAAK,kBACL,MAAK,kBAAkB,KAAK,QAAQ,SAAS;AACzC,OAAI,KAAK,aAAa,KAClB,sBAAK,IAAI,MAAM,4GAA4G,CAAC;OAE5H,OAAM;IAEZ;;CAIV,uBAA6F;AAEzF,MAAI,KAAK,IAAI;AACT,QAAK,gBAAgB,iDAAiD,KAAK,UAAU,IAAI;AACzF,QAAK,oBAAoB,KAAK,GAAG,GAAG,IAAI,KAAK,UAAU,GAAG;AAE1D,QAAK,gBAAgB,6DAA6D;AAClF,QAAK,wCAAwC;AAE7C,QAAK,gBAAgB,gDAAgD;AACrE,QAAK,2BAA2B;AAEhC,QAAK,kBAAkB,GAAG,eAAc,WAAU;AAC9C,SAAK,gBAAgB,4CAA4C,OAAO,GAAG,GAAG;AAC9E,SAAK,gBAAgB,uDAAuD,KAAK,UAAU,OAAO,UAAU,KAAK,CAAC,GAAG;AACrH,SAAK,gBAAgB,uDAAuD,KAAK,UAAU,OAAO,UAAU,QAAQ,KAAK,CAAC,GAAG;AAC7H,SAAK,gBAAgB,sDAAsD,KAAK,UAAU,OAAO,UAAU,IAAI,CAAC,GAAG;AACnH,SAAK,gBAAgB,gDAAgD,KAAK,UAAU,OAAO,UAAU,CAAC,GAAG;AAEzG,SAAK,gBAAgB,wDAAwD,OAAO,GAAG,GAAG;AAC1F,SAAK,uBAAuB,OAAO;AAEnC,QAAI,KAAK,SAAS,KAAK,MAAM,SAAS,EAClC,MAAK,MAAM,KAAK,SAAS;AACrB,UAAK,gBAAgB,oCAAoC,KAAK,cAAc,OAAO,GAAG,GAAG;AACzF,UAAK,SAAS,QAAQ,KAAK;MAC7B;AAGN,SAAK,gBAAgB,mDAAmD,OAAO,GAAG,GAAG;AACrF,SAAK,oBAAoB,OAAO;AAEhC,qBAAiB;AACb,UAAK,gBAAgB,uDAAuD,OAAO,GAAG,GAAG;AACzF,UAAK,cAAc,OAAO;OAC3B,EAAE;AAEL,SAAK,gBAAgB,sDAAsD,OAAO,GAAG,GAAG;AACxF,SAAK,kBAAkB,OAAO;KAChC;SACC;GACH,MAAM,eAAe;AACrB,QAAK,gBAAgB,aAAa;AAClC,SAAM,IAAI,MAAM,aAAa;;AAGjC,SAAO;;CAGX,yBAAmC,YAA2B;AAC1D,MAAI,KAAK,mBAAmB;AACxB,QAAK,gBAAgB,mEAAmE;AACxF,SAAM,KAAK,kBAAkB,QAAQ,OAAO;;;CAIpD,mCAAmD;AAC/C,MAAI,KAAK,mBAAmB;AACxB,QAAK,gBAAgB,2EAA2E;AAChG,QAAK,kBAAkB,mBAAmB;AAC1C,QAAK,oBAAoB,KAAA"}
@@ -0,0 +1,87 @@
1
+ //#region \0rolldown/runtime.js
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __commonJSMin = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
11
+ key = keys[i];
12
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
13
+ get: ((k) => from[k]).bind(null, key),
14
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
15
+ });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
20
+ value: mod,
21
+ enumerable: true
22
+ }) : target, mod));
23
+ //#endregion
24
+ //#region node_modules/tiny-emitter/index.js
25
+ var require_tiny_emitter = /* @__PURE__ */ __commonJSMin(((exports, module) => {
26
+ function E() {}
27
+ E.prototype = {
28
+ on: function(name, callback, ctx) {
29
+ var e = this.e || (this.e = {});
30
+ (e[name] || (e[name] = [])).push({
31
+ fn: callback,
32
+ ctx
33
+ });
34
+ return this;
35
+ },
36
+ once: function(name, callback, ctx) {
37
+ var self = this;
38
+ function listener() {
39
+ self.off(name, listener);
40
+ callback.apply(ctx, arguments);
41
+ }
42
+ listener._ = callback;
43
+ return this.on(name, listener, ctx);
44
+ },
45
+ emit: function(name) {
46
+ var data = [].slice.call(arguments, 1);
47
+ var evtArr = ((this.e || (this.e = {}))[name] || []).slice();
48
+ var i = 0;
49
+ var len = evtArr.length;
50
+ for (; i < len; i++) evtArr[i].fn.apply(evtArr[i].ctx, data);
51
+ return this;
52
+ },
53
+ off: function(name, callback) {
54
+ var e = this.e || (this.e = {});
55
+ var evts = e[name];
56
+ var liveEvents = [];
57
+ if (evts && callback) {
58
+ for (var i = 0, len = evts.length; i < len; i++) if (evts[i].fn !== callback && evts[i].fn._ !== callback) liveEvents.push(evts[i]);
59
+ }
60
+ liveEvents.length ? e[name] = liveEvents : delete e[name];
61
+ return this;
62
+ }
63
+ };
64
+ module.exports = E;
65
+ module.exports.TinyEmitter = E;
66
+ }));
67
+ //#endregion
68
+ Object.defineProperty(exports, "__commonJSMin", {
69
+ enumerable: true,
70
+ get: function() {
71
+ return __commonJSMin;
72
+ }
73
+ });
74
+ Object.defineProperty(exports, "__toESM", {
75
+ enumerable: true,
76
+ get: function() {
77
+ return __toESM;
78
+ }
79
+ });
80
+ Object.defineProperty(exports, "require_tiny_emitter", {
81
+ enumerable: true,
82
+ get: function() {
83
+ return require_tiny_emitter;
84
+ }
85
+ });
86
+
87
+ //# sourceMappingURL=tiny-emitter-CL5wv3N6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tiny-emitter-CL5wv3N6.js","names":[],"sources":["../node_modules/tiny-emitter/index.js"],"sourcesContent":["function E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n"],"x_google_ignoreList":[0],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;CAAA,SAAS,IAAK;AAKd,GAAE,YAAY;EACZ,IAAI,SAAU,MAAM,UAAU,KAAK;GACjC,IAAI,IAAI,KAAK,MAAM,KAAK,IAAI,EAAE;AAE9B,IAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,KAAK;IAC/B,IAAI;IACC;IACN,CAAC;AAEF,UAAO;;EAGT,MAAM,SAAU,MAAM,UAAU,KAAK;GACnC,IAAI,OAAO;GACX,SAAS,WAAY;AACnB,SAAK,IAAI,MAAM,SAAS;AACxB,aAAS,MAAM,KAAK,UAAU;;AAGhC,YAAS,IAAI;AACb,UAAO,KAAK,GAAG,MAAM,UAAU,IAAI;;EAGrC,MAAM,SAAU,MAAM;GACpB,IAAI,OAAO,EAAE,CAAC,MAAM,KAAK,WAAW,EAAE;GACtC,IAAI,WAAW,KAAK,MAAM,KAAK,IAAI,EAAE,GAAG,SAAS,EAAE,EAAE,OAAO;GAC5D,IAAI,IAAI;GACR,IAAI,MAAM,OAAO;AAEjB,UAAQ,IAAI,KAAK,IACf,QAAO,GAAG,GAAG,MAAM,OAAO,GAAG,KAAK,KAAK;AAGzC,UAAO;;EAGT,KAAK,SAAU,MAAM,UAAU;GAC7B,IAAI,IAAI,KAAK,MAAM,KAAK,IAAI,EAAE;GAC9B,IAAI,OAAO,EAAE;GACb,IAAI,aAAa,EAAE;AAEnB,OAAI,QAAQ;SACL,IAAI,IAAI,GAAG,MAAM,KAAK,QAAQ,IAAI,KAAK,IAC1C,KAAI,KAAK,GAAG,OAAO,YAAY,KAAK,GAAG,GAAG,MAAM,SAC9C,YAAW,KAAK,KAAK,GAAG;;AAQ7B,cAAW,SACR,EAAE,QAAQ,aACV,OAAO,EAAE;AAEb,UAAO;;EAEV;AAED,QAAO,UAAU;AACjB,QAAO,QAAQ,cAAc"}
@@ -0,0 +1,70 @@
1
+ //#region \0rolldown/runtime.js
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __commonJSMin = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
11
+ key = keys[i];
12
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
13
+ get: ((k) => from[k]).bind(null, key),
14
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
15
+ });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
20
+ value: mod,
21
+ enumerable: true
22
+ }) : target, mod));
23
+ //#endregion
24
+ //#region node_modules/tiny-emitter/index.js
25
+ var require_tiny_emitter = /* @__PURE__ */ __commonJSMin(((exports, module) => {
26
+ function E() {}
27
+ E.prototype = {
28
+ on: function(name, callback, ctx) {
29
+ var e = this.e || (this.e = {});
30
+ (e[name] || (e[name] = [])).push({
31
+ fn: callback,
32
+ ctx
33
+ });
34
+ return this;
35
+ },
36
+ once: function(name, callback, ctx) {
37
+ var self = this;
38
+ function listener() {
39
+ self.off(name, listener);
40
+ callback.apply(ctx, arguments);
41
+ }
42
+ listener._ = callback;
43
+ return this.on(name, listener, ctx);
44
+ },
45
+ emit: function(name) {
46
+ var data = [].slice.call(arguments, 1);
47
+ var evtArr = ((this.e || (this.e = {}))[name] || []).slice();
48
+ var i = 0;
49
+ var len = evtArr.length;
50
+ for (; i < len; i++) evtArr[i].fn.apply(evtArr[i].ctx, data);
51
+ return this;
52
+ },
53
+ off: function(name, callback) {
54
+ var e = this.e || (this.e = {});
55
+ var evts = e[name];
56
+ var liveEvents = [];
57
+ if (evts && callback) {
58
+ for (var i = 0, len = evts.length; i < len; i++) if (evts[i].fn !== callback && evts[i].fn._ !== callback) liveEvents.push(evts[i]);
59
+ }
60
+ liveEvents.length ? e[name] = liveEvents : delete e[name];
61
+ return this;
62
+ }
63
+ };
64
+ module.exports = E;
65
+ module.exports.TinyEmitter = E;
66
+ }));
67
+ //#endregion
68
+ export { __commonJSMin as n, __toESM as r, require_tiny_emitter as t };
69
+
70
+ //# sourceMappingURL=tiny-emitter-GH7XS7wi.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tiny-emitter-GH7XS7wi.mjs","names":[],"sources":["../node_modules/tiny-emitter/index.js"],"sourcesContent":["function E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n"],"x_google_ignoreList":[0],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;CAAA,SAAS,IAAK;AAKd,GAAE,YAAY;EACZ,IAAI,SAAU,MAAM,UAAU,KAAK;GACjC,IAAI,IAAI,KAAK,MAAM,KAAK,IAAI,EAAE;AAE9B,IAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,KAAK;IAC/B,IAAI;IACC;IACN,CAAC;AAEF,UAAO;;EAGT,MAAM,SAAU,MAAM,UAAU,KAAK;GACnC,IAAI,OAAO;GACX,SAAS,WAAY;AACnB,SAAK,IAAI,MAAM,SAAS;AACxB,aAAS,MAAM,KAAK,UAAU;;AAGhC,YAAS,IAAI;AACb,UAAO,KAAK,GAAG,MAAM,UAAU,IAAI;;EAGrC,MAAM,SAAU,MAAM;GACpB,IAAI,OAAO,EAAE,CAAC,MAAM,KAAK,WAAW,EAAE;GACtC,IAAI,WAAW,KAAK,MAAM,KAAK,IAAI,EAAE,GAAG,SAAS,EAAE,EAAE,OAAO;GAC5D,IAAI,IAAI;GACR,IAAI,MAAM,OAAO;AAEjB,UAAQ,IAAI,KAAK,IACf,QAAO,GAAG,GAAG,MAAM,OAAO,GAAG,KAAK,KAAK;AAGzC,UAAO;;EAGT,KAAK,SAAU,MAAM,UAAU;GAC7B,IAAI,IAAI,KAAK,MAAM,KAAK,IAAI,EAAE;GAC9B,IAAI,OAAO,EAAE;GACb,IAAI,aAAa,EAAE;AAEnB,OAAI,QAAQ;SACL,IAAI,IAAI,GAAG,MAAM,KAAK,QAAQ,IAAI,KAAK,IAC1C,KAAI,KAAK,GAAG,OAAO,YAAY,KAAK,GAAG,GAAG,MAAM,SAC9C,YAAW,KAAK,KAAK,GAAG;;AAQ7B,cAAW,SACR,EAAE,QAAQ,aACV,OAAO,EAAE;AAEb,UAAO;;EAEV;AAED,QAAO,UAAU;AACjB,QAAO,QAAQ,cAAc"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nsshunt/stssocketioutils",
3
- "version": "2.0.32",
3
+ "version": "2.0.34",
4
4
  "description": "STS Socket.IO Utils",
5
5
  "type": "commonjs",
6
6
  "main": "./dist/index.cjs",
@@ -48,24 +48,24 @@
48
48
  },
49
49
  "homepage": "https://github.com/nsshunt/stssocketioutils#readme",
50
50
  "devDependencies": {
51
- "@nsshunt/stsconfig": "^1.27.54",
51
+ "@nsshunt/stsconfig": "^1.27.55",
52
52
  "@types/detect-node": "^2.0.2",
53
- "@typescript-eslint/eslint-plugin": "^8.57.0",
54
- "@typescript-eslint/parser": "^8.57.0",
53
+ "@typescript-eslint/eslint-plugin": "^8.58.0",
54
+ "@typescript-eslint/parser": "^8.58.0",
55
55
  "eslint": "^9.39.2",
56
56
  "globals": "^17.4.0",
57
- "testcontainers": "^11.12.0",
57
+ "testcontainers": "^11.13.0",
58
58
  "typescript": "^5.9.3",
59
- "vite": "^7.3.1",
60
- "vitest": "^4.0.18"
59
+ "vite": "^8.0.3",
60
+ "vitest": "^4.1.2"
61
61
  },
62
62
  "dependencies": {
63
- "@nsshunt/stsutils": "^1.19.90",
63
+ "@nsshunt/stsutils": "^1.19.91",
64
64
  "@socket.io/cluster-adapter": "^0.3.0",
65
65
  "@socket.io/redis-streams-adapter": "^0.2.3",
66
66
  "chalk": "^4.1.2",
67
67
  "detect-node": "^2.1.0",
68
- "ioredis": "^5.10.0",
68
+ "ioredis": "^5.10.1",
69
69
  "socket.io": "^4.8.3",
70
70
  "socket.io-adapter": "^2.5.6",
71
71
  "socket.io-client": "^4.8.3",
@@ -1 +1 @@
1
- {"version":3,"file":"socketIoClient.d.ts","sourceRoot":"","sources":["../src/socketIoClient.ts"],"names":[],"mappings":"AACA,OAAO,EAAqC,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAK5E,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAE7D,OAAO,EAAE,8BAA8B,EAAE,8BAA8B,EAAE,MAAM,eAAe,CAAA;AAE9F,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,8BAAsB,cAAc,CAAC,oBAAoB,SAAS,8BAA8B,EAAE,oBAAoB,SAAS,8BAA8B,CAAE,SAAQ,WAAW;;gBAUlK,IAAI,EAAE,MAAM;IAKxB,SAAS,KAAK,SAAS,IAAI,MAAM,CAEhC;IAGD,SAAS,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI;IAK7C,SAAS,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI;IAK7C,SAAS,CAAC,iBAAiB,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI;IAI/C,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED,IAAI,YAAY,IAAI,aAAa,GAAG,SAAS,CAE5C;IAED,IAAI,MAAM,IAAI,UAAU,GAAG,SAAS,CAEnC;IAED,IAAI,OAAO,IAAI,MAAM,GAAG,SAAS,CAEhC;IAED,IAAI,SAAS,IAAI,MAAM,GAAG,SAAS,CAElC;IAED,IAAI,kBAAkB,IAAI,MAAM,GAAG,SAAS,CAE3C;IAED,IAAI,MAAM,IAAI,MAAM,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,GAAG,SAAS,CAE3E;IAED,WAAW,CAAC,OAAO,EAAE,MAAM;IAK3B,aAAa,CAAC,SAAS,EAAE,MAAM;IAK/B,sBAAsB,CAAC,kBAAkB,EAAE,MAAM;IAKjD,UAAU,CAAC,MAAM,EAAE,UAAU;IAK7B,gBAAgB,CAAC,YAAY,EAAE,aAAa;IAK5C,oBAAoB,CAAC,gBAAgB,EAAE,MAAM;IAK7C,WAAW;IAWX,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,GAAG,IAAI;IAElG,SAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,GAAG,IAAI;IAEtG,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAEzD,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIzD,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAEzC,SAAS,CAAC,oBAAoB,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAElD,SAAS,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAEhD,SAAS,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAkKnD"}
1
+ {"version":3,"file":"socketIoClient.d.ts","sourceRoot":"","sources":["../src/socketIoClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqC,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAK5E,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAE7D,OAAO,EAAE,8BAA8B,EAAE,8BAA8B,EAAE,MAAM,eAAe,CAAA;AAE9F,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,8BAAsB,cAAc,CAAC,oBAAoB,SAAS,8BAA8B,EAAE,oBAAoB,SAAS,8BAA8B,CAAE,SAAQ,WAAW;;gBAUlK,IAAI,EAAE,MAAM;IAKxB,SAAS,KAAK,SAAS,IAAI,MAAM,CAEhC;IAGD,SAAS,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI;IAK7C,SAAS,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI;IAK7C,SAAS,CAAC,iBAAiB,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI;IAI/C,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED,IAAI,YAAY,IAAI,aAAa,GAAG,SAAS,CAE5C;IAED,IAAI,MAAM,IAAI,UAAU,GAAG,SAAS,CAEnC;IAED,IAAI,OAAO,IAAI,MAAM,GAAG,SAAS,CAEhC;IAED,IAAI,SAAS,IAAI,MAAM,GAAG,SAAS,CAElC;IAED,IAAI,kBAAkB,IAAI,MAAM,GAAG,SAAS,CAE3C;IAED,IAAI,MAAM,IAAI,MAAM,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,GAAG,SAAS,CAE3E;IAED,WAAW,CAAC,OAAO,EAAE,MAAM;IAK3B,aAAa,CAAC,SAAS,EAAE,MAAM;IAK/B,sBAAsB,CAAC,kBAAkB,EAAE,MAAM;IAKjD,UAAU,CAAC,MAAM,EAAE,UAAU;IAK7B,gBAAgB,CAAC,YAAY,EAAE,aAAa;IAK5C,oBAAoB,CAAC,gBAAgB,EAAE,MAAM;IAK7C,WAAW;IAWX,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,GAAG,IAAI;IAElG,SAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,GAAG,IAAI;IAEtG,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAEzD,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIzD,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAEzC,SAAS,CAAC,oBAAoB,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAElD,SAAS,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAEhD,SAAS,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAmKnD"}
@@ -1,57 +0,0 @@
1
- "use strict";
2
- var tinyEmitter = { exports: {} };
3
- var hasRequiredTinyEmitter;
4
- function requireTinyEmitter() {
5
- if (hasRequiredTinyEmitter) return tinyEmitter.exports;
6
- hasRequiredTinyEmitter = 1;
7
- function E() {
8
- }
9
- E.prototype = {
10
- on: function(name, callback, ctx) {
11
- var e = this.e || (this.e = {});
12
- (e[name] || (e[name] = [])).push({
13
- fn: callback,
14
- ctx
15
- });
16
- return this;
17
- },
18
- once: function(name, callback, ctx) {
19
- var self = this;
20
- function listener() {
21
- self.off(name, listener);
22
- callback.apply(ctx, arguments);
23
- }
24
- listener._ = callback;
25
- return this.on(name, listener, ctx);
26
- },
27
- emit: function(name) {
28
- var data = [].slice.call(arguments, 1);
29
- var evtArr = ((this.e || (this.e = {}))[name] || []).slice();
30
- var i = 0;
31
- var len = evtArr.length;
32
- for (i; i < len; i++) {
33
- evtArr[i].fn.apply(evtArr[i].ctx, data);
34
- }
35
- return this;
36
- },
37
- off: function(name, callback) {
38
- var e = this.e || (this.e = {});
39
- var evts = e[name];
40
- var liveEvents = [];
41
- if (evts && callback) {
42
- for (var i = 0, len = evts.length; i < len; i++) {
43
- if (evts[i].fn !== callback && evts[i].fn._ !== callback)
44
- liveEvents.push(evts[i]);
45
- }
46
- }
47
- liveEvents.length ? e[name] = liveEvents : delete e[name];
48
- return this;
49
- }
50
- };
51
- tinyEmitter.exports = E;
52
- tinyEmitter.exports.TinyEmitter = E;
53
- return tinyEmitter.exports;
54
- }
55
- var tinyEmitterExports = requireTinyEmitter();
56
- exports.tinyEmitterExports = tinyEmitterExports;
57
- //# sourceMappingURL=index-CbgYj2D4.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-CbgYj2D4.js","sources":["../node_modules/tiny-emitter/index.js"],"sourcesContent":["function E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n"],"names":["tinyEmitterModule"],"mappings":";;;;;;AAAA,WAAS,IAAK;AAAA,EAGd;AAEA,IAAE,YAAY;AAAA,IACZ,IAAI,SAAU,MAAM,UAAU,KAAK;AACjC,UAAI,IAAI,KAAK,MAAM,KAAK,IAAI,CAAA;AAE5B,OAAC,EAAE,IAAI,MAAM,EAAE,IAAI,IAAI,CAAA,IAAK,KAAK;AAAA,QAC/B,IAAI;AAAA,QACJ;AAAA,MACN,CAAK;AAED,aAAO;AAAA,IACX;AAAA,IAEE,MAAM,SAAU,MAAM,UAAU,KAAK;AACnC,UAAI,OAAO;AACX,eAAS,WAAY;AACnB,aAAK,IAAI,MAAM,QAAQ;AACvB,iBAAS,MAAM,KAAK,SAAS;AAAA,MACnC;AAEI,eAAS,IAAI;AACb,aAAO,KAAK,GAAG,MAAM,UAAU,GAAG;AAAA,IACtC;AAAA,IAEE,MAAM,SAAU,MAAM;AACpB,UAAI,OAAO,CAAA,EAAG,MAAM,KAAK,WAAW,CAAC;AACrC,UAAI,WAAW,KAAK,MAAM,KAAK,IAAI,CAAA,IAAK,IAAI,KAAK,CAAA,GAAI,MAAK;AAC1D,UAAI,IAAI;AACR,UAAI,MAAM,OAAO;AAEjB,WAAK,GAAG,IAAI,KAAK,KAAK;AACpB,eAAO,CAAC,EAAE,GAAG,MAAM,OAAO,CAAC,EAAE,KAAK,IAAI;AAAA,MAC5C;AAEI,aAAO;AAAA,IACX;AAAA,IAEE,KAAK,SAAU,MAAM,UAAU;AAC7B,UAAI,IAAI,KAAK,MAAM,KAAK,IAAI,CAAA;AAC5B,UAAI,OAAO,EAAE,IAAI;AACjB,UAAI,aAAa,CAAA;AAEjB,UAAI,QAAQ,UAAU;AACpB,iBAAS,IAAI,GAAG,MAAM,KAAK,QAAQ,IAAI,KAAK,KAAK;AAC/C,cAAI,KAAK,CAAC,EAAE,OAAO,YAAY,KAAK,CAAC,EAAE,GAAG,MAAM;AAC9C,uBAAW,KAAK,KAAK,CAAC,CAAC;AAAA,QACjC;AAAA,MACA;AAMI,MAAC,WAAW,SACR,EAAE,IAAI,IAAI,aACV,OAAO,EAAE,IAAI;AAEjB,aAAO;AAAA,IACX;AAAA;AAGAA,cAAA,UAAiB;AACjBA,cAAA,QAAA,cAA6B;;;;;","x_google_ignoreList":[0]}
@@ -1,58 +0,0 @@
1
- var tinyEmitter = { exports: {} };
2
- var hasRequiredTinyEmitter;
3
- function requireTinyEmitter() {
4
- if (hasRequiredTinyEmitter) return tinyEmitter.exports;
5
- hasRequiredTinyEmitter = 1;
6
- function E() {
7
- }
8
- E.prototype = {
9
- on: function(name, callback, ctx) {
10
- var e = this.e || (this.e = {});
11
- (e[name] || (e[name] = [])).push({
12
- fn: callback,
13
- ctx
14
- });
15
- return this;
16
- },
17
- once: function(name, callback, ctx) {
18
- var self = this;
19
- function listener() {
20
- self.off(name, listener);
21
- callback.apply(ctx, arguments);
22
- }
23
- listener._ = callback;
24
- return this.on(name, listener, ctx);
25
- },
26
- emit: function(name) {
27
- var data = [].slice.call(arguments, 1);
28
- var evtArr = ((this.e || (this.e = {}))[name] || []).slice();
29
- var i = 0;
30
- var len = evtArr.length;
31
- for (i; i < len; i++) {
32
- evtArr[i].fn.apply(evtArr[i].ctx, data);
33
- }
34
- return this;
35
- },
36
- off: function(name, callback) {
37
- var e = this.e || (this.e = {});
38
- var evts = e[name];
39
- var liveEvents = [];
40
- if (evts && callback) {
41
- for (var i = 0, len = evts.length; i < len; i++) {
42
- if (evts[i].fn !== callback && evts[i].fn._ !== callback)
43
- liveEvents.push(evts[i]);
44
- }
45
- }
46
- liveEvents.length ? e[name] = liveEvents : delete e[name];
47
- return this;
48
- }
49
- };
50
- tinyEmitter.exports = E;
51
- tinyEmitter.exports.TinyEmitter = E;
52
- return tinyEmitter.exports;
53
- }
54
- var tinyEmitterExports = requireTinyEmitter();
55
- export {
56
- tinyEmitterExports as t
57
- };
58
- //# sourceMappingURL=index-snr1zbog.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-snr1zbog.mjs","sources":["../node_modules/tiny-emitter/index.js"],"sourcesContent":["function E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n"],"names":["tinyEmitterModule"],"mappings":";;;;;AAAA,WAAS,IAAK;AAAA,EAGd;AAEA,IAAE,YAAY;AAAA,IACZ,IAAI,SAAU,MAAM,UAAU,KAAK;AACjC,UAAI,IAAI,KAAK,MAAM,KAAK,IAAI,CAAA;AAE5B,OAAC,EAAE,IAAI,MAAM,EAAE,IAAI,IAAI,CAAA,IAAK,KAAK;AAAA,QAC/B,IAAI;AAAA,QACJ;AAAA,MACN,CAAK;AAED,aAAO;AAAA,IACX;AAAA,IAEE,MAAM,SAAU,MAAM,UAAU,KAAK;AACnC,UAAI,OAAO;AACX,eAAS,WAAY;AACnB,aAAK,IAAI,MAAM,QAAQ;AACvB,iBAAS,MAAM,KAAK,SAAS;AAAA,MACnC;AAEI,eAAS,IAAI;AACb,aAAO,KAAK,GAAG,MAAM,UAAU,GAAG;AAAA,IACtC;AAAA,IAEE,MAAM,SAAU,MAAM;AACpB,UAAI,OAAO,CAAA,EAAG,MAAM,KAAK,WAAW,CAAC;AACrC,UAAI,WAAW,KAAK,MAAM,KAAK,IAAI,CAAA,IAAK,IAAI,KAAK,CAAA,GAAI,MAAK;AAC1D,UAAI,IAAI;AACR,UAAI,MAAM,OAAO;AAEjB,WAAK,GAAG,IAAI,KAAK,KAAK;AACpB,eAAO,CAAC,EAAE,GAAG,MAAM,OAAO,CAAC,EAAE,KAAK,IAAI;AAAA,MAC5C;AAEI,aAAO;AAAA,IACX;AAAA,IAEE,KAAK,SAAU,MAAM,UAAU;AAC7B,UAAI,IAAI,KAAK,MAAM,KAAK,IAAI,CAAA;AAC5B,UAAI,OAAO,EAAE,IAAI;AACjB,UAAI,aAAa,CAAA;AAEjB,UAAI,QAAQ,UAAU;AACpB,iBAAS,IAAI,GAAG,MAAM,KAAK,QAAQ,IAAI,KAAK,KAAK;AAC/C,cAAI,KAAK,CAAC,EAAE,OAAO,YAAY,KAAK,CAAC,EAAE,GAAG,MAAM;AAC9C,uBAAW,KAAK,KAAK,CAAC,CAAC;AAAA,QACjC;AAAA,MACA;AAMI,MAAC,WAAW,SACR,EAAE,IAAI,IAAI,aACV,OAAO,EAAE,IAAI;AAEjB,aAAO;AAAA,IACX;AAAA;AAGAA,cAAA,UAAiB;AACjBA,cAAA,QAAA,cAA6B;;;;","x_google_ignoreList":[0]}