UNPKG

ngx-socket-io

Version:
1 lines 16.5 kB
{"version":3,"file":"ngx-socket-io.mjs","sources":["../../src/socket-io.service.ts","../../src/socket-io.module.ts","../../ngx-socket-io.ts"],"sourcesContent":["import { Observable } from 'rxjs';\nimport { share } from 'rxjs/operators';\n\nimport * as ioModule from 'socket.io-client';\nimport type { io, Socket } from 'socket.io-client';\nimport type {\n ReservedOrUserListener,\n ReservedOrUserEventNames,\n DefaultEventsMap,\n} from '@socket.io/component-emitter';\n\nexport type IoSocket = Socket;\n// This is not exported in the original, but let's export as helpers for those declaring disconnect handlers\nexport type DisconnectDescription =\n | Error\n | {\n description: string;\n context?: unknown;\n };\n\n// Not exported but needed to properly map ReservedEvents to their signatures\ninterface SocketReservedEvents {\n connect: () => void;\n connect_error: (err: Error) => void;\n disconnect: (\n reason: Socket.DisconnectReason,\n description?: DisconnectDescription\n ) => void;\n}\n\ntype EventNames = ReservedOrUserEventNames<\n SocketReservedEvents,\n DefaultEventsMap\n>;\ntype EventListener<Ev extends EventNames> = ReservedOrUserListener<\n SocketReservedEvents,\n DefaultEventsMap,\n Ev\n>;\ntype EventParameters<Ev extends EventNames> = Parameters<EventListener<Ev>>;\ntype EventPayload<Ev extends EventNames> =\n EventParameters<Ev> extends [] ? undefined : EventParameters<Ev>[0];\n\ntype IgnoredWrapperEvents = 'receiveBuffer' | 'sendBuffer';\n\ntype WrappedSocketIface<Wrapper> = {\n [K in Exclude<keyof IoSocket, IgnoredWrapperEvents>]: IoSocket[K] extends (\n ...args: any[]\n ) => IoSocket\n ? (...args: Parameters<IoSocket[K]>) => Wrapper // chainable methods on().off().emit()...\n : IoSocket[K] extends IoSocket\n ? Wrapper // ie: volatile is a getter\n : IoSocket[K];\n};\n\nimport { SocketIoConfig } from './config/socket-io.config';\n\nexport class WrappedSocket implements WrappedSocketIface<WrappedSocket> {\n private readonly subscribersCounter: Record<string, number> = {};\n private readonly eventObservables$: Record<string, Observable<any>> = {};\n private readonly namespaces: Record<string, WrappedSocket> = {};\n readonly ioSocket: IoSocket;\n private readonly emptyConfig: SocketIoConfig = {\n url: '',\n options: {},\n };\n\n constructor(private config: SocketIoConfig) {\n if (config === undefined) {\n config = this.emptyConfig;\n }\n const url: string = config.url;\n const options: any = config.options;\n const ioFunc = (\n (ioModule as any).default ? (ioModule as any).default : ioModule\n ) as typeof io;\n this.ioSocket = ioFunc(url, options);\n }\n\n get auth(): Socket['auth'] {\n return this.ioSocket.auth;\n }\n\n set auth(value: Socket['auth']) {\n this.ioSocket.auth = value;\n }\n\n /** readonly access to io manager */\n get io(): Socket['io'] {\n return this.ioSocket.io;\n }\n\n /** alias to connect */\n get open(): WrappedSocket['connect'] {\n return this.connect;\n }\n\n /** alias to disconnect */\n get close(): WrappedSocket['disconnect'] {\n return this.disconnect;\n }\n\n /**\n * Gets a WrappedSocket for the given namespace.\n *\n * @note if an existing socket exists for the given namespace, it will be reused.\n *\n * @param namespace the namespace to create a new socket based on the current config.\n * If empty or `/`, then the current instance is returned.\n * @returns a socket that is bound to the given namespace. If namespace is empty or `/`,\n * then `this` is returned, otherwise another instance is returned, creating\n * it if it's the first use of such namespace.\n */\n of(namespace: string): WrappedSocket {\n if (!namespace || namespace === '/') {\n return this;\n }\n const existing = this.namespaces[namespace];\n if (existing) {\n return existing;\n }\n const { url, ...rest } = this.config;\n const config = {\n url:\n !url.endsWith('/') && !namespace.startsWith('/')\n ? `${url}/${namespace}`\n : `${url}${namespace}`,\n ...rest,\n };\n const created = new WrappedSocket(config);\n this.namespaces[namespace] = created;\n return created;\n }\n\n on<Ev extends EventNames>(eventName: Ev, callback: EventListener<Ev>): this {\n this.ioSocket.on(eventName, callback);\n return this;\n }\n\n once<Ev extends EventNames>(\n eventName: Ev,\n callback: EventListener<Ev>\n ): this {\n this.ioSocket.once(eventName, callback);\n return this;\n }\n\n connect(): this {\n this.ioSocket.connect();\n return this;\n }\n\n disconnect(): this {\n this.ioSocket.disconnect();\n return this;\n }\n\n emit(_eventName: string, ..._args: any[]): this {\n this.ioSocket.emit.apply(this.ioSocket, arguments);\n return this;\n }\n\n send(..._args: any[]): this {\n this.ioSocket.send.apply(this.ioSocket, arguments);\n return this;\n }\n\n emitWithAck<T>(_eventName: string, ..._args: any[]): Promise<T> {\n return this.ioSocket.emitWithAck.apply(this.ioSocket, arguments);\n }\n\n removeListener<Ev extends EventNames>(\n _eventName?: Ev,\n _callback?: EventListener<Ev>\n ): this {\n this.ioSocket.removeListener.apply(this.ioSocket, arguments);\n return this;\n }\n\n removeAllListeners<Ev extends EventNames>(_eventName?: Ev): this {\n this.ioSocket.removeAllListeners.apply(this.ioSocket, arguments);\n return this;\n }\n\n fromEvent<T extends EventPayload<Ev>, Ev extends EventNames>(\n eventName: Ev\n ): Observable<T> {\n if (!this.subscribersCounter[eventName]) {\n this.subscribersCounter[eventName] = 0;\n }\n this.subscribersCounter[eventName]++;\n\n if (!this.eventObservables$[eventName]) {\n this.eventObservables$[eventName] = new Observable((observer: any) => {\n const listener = (data: T) => {\n observer.next(data);\n };\n this.ioSocket.on(eventName, listener as EventListener<Ev>);\n return () => {\n this.subscribersCounter[eventName]--;\n if (this.subscribersCounter[eventName] === 0) {\n this.ioSocket.removeListener(\n eventName,\n listener as EventListener<Ev>\n );\n delete this.eventObservables$[eventName];\n }\n };\n }).pipe(share());\n }\n return this.eventObservables$[eventName];\n }\n\n fromOneTimeEvent<T extends EventPayload<Ev>, Ev extends EventNames>(\n eventName: Ev\n ): Promise<T> {\n return new Promise<T>(resolve =>\n this.once(eventName, resolve as EventListener<Ev>)\n );\n }\n\n listeners<Ev extends EventNames>(eventName: Ev): EventListener<Ev>[] {\n return this.ioSocket.listeners(eventName);\n }\n\n hasListeners<Ev extends EventNames>(eventName: Ev): boolean {\n return this.ioSocket.hasListeners(eventName);\n }\n\n listenersAny(): ((...args: any[]) => void)[] {\n return this.ioSocket.listenersAny();\n }\n\n listenersAnyOutgoing(): ((...args: any[]) => void)[] {\n return this.ioSocket.listenersAnyOutgoing();\n }\n\n off<Ev extends EventNames>(\n eventName?: Ev,\n listener?: EventListener<Ev>\n ): this {\n this.ioSocket.off(eventName, listener);\n return this;\n }\n\n offAny(callback?: (event: string, ...args: any[]) => void): this {\n this.ioSocket.offAny(callback);\n return this;\n }\n\n offAnyOutgoing(callback?: (event: string, ...args: any[]) => void): this {\n this.ioSocket.offAnyOutgoing(callback);\n return this;\n }\n\n onAny(callback: (event: string, ...args: any[]) => void): this {\n this.ioSocket.onAny(callback);\n return this;\n }\n\n onAnyOutgoing(callback: (event: string, ...args: any[]) => void): this {\n this.ioSocket.onAnyOutgoing(callback);\n return this;\n }\n\n prependAny(callback: (event: string, ...args: any[]) => void): this {\n this.ioSocket.prependAny(callback);\n return this;\n }\n\n prependAnyOutgoing(\n callback: (event: string | symbol, ...args: any[]) => void\n ): this {\n this.ioSocket.prependAnyOutgoing(callback);\n return this;\n }\n\n timeout(value: number): this {\n this.ioSocket.timeout(value);\n return this;\n }\n\n get volatile(): this {\n // this getter has a side-effect of turning the socket instance true,\n // but it returns the actual instance, so we need to get the value to force the side effect\n const _ = this.ioSocket.volatile;\n return this;\n }\n\n get active(): Socket['active'] {\n return this.ioSocket.active;\n }\n\n get connected(): Socket['connected'] {\n return this.ioSocket.connected;\n }\n\n get disconnected(): Socket['disconnected'] {\n return this.ioSocket.disconnected;\n }\n\n get recovered(): Socket['recovered'] {\n return this.ioSocket.recovered;\n }\n\n get id(): Socket['id'] {\n return this.ioSocket.id;\n }\n\n compress(value: boolean): this {\n this.ioSocket.compress(value);\n return this;\n }\n}\n","import {\n NgModule,\n ModuleWithProviders,\n InjectionToken,\n makeEnvironmentProviders,\n EnvironmentProviders,\n} from '@angular/core';\nimport { SocketIoConfig } from './config/socket-io.config';\nimport { WrappedSocket } from './socket-io.service';\n\n/** Socket factory */\nexport function SocketFactory(config: SocketIoConfig) {\n return new WrappedSocket(config);\n}\n\nexport const SOCKET_CONFIG_TOKEN = new InjectionToken<SocketIoConfig>(\n '__SOCKET_IO_CONFIG__'\n);\n\n@NgModule({})\nexport class SocketIoModule {\n static forRoot(config: SocketIoConfig): ModuleWithProviders<SocketIoModule> {\n return {\n ngModule: SocketIoModule,\n providers: [\n { provide: SOCKET_CONFIG_TOKEN, useValue: config },\n {\n provide: WrappedSocket,\n useFactory: SocketFactory,\n deps: [SOCKET_CONFIG_TOKEN],\n },\n ],\n };\n }\n}\n\nexport const provideSocketIo = (\n config: SocketIoConfig\n): EnvironmentProviders => {\n return makeEnvironmentProviders([\n { provide: SOCKET_CONFIG_TOKEN, useValue: config },\n {\n provide: WrappedSocket,\n useFactory: () => SocketFactory,\n deps: [SOCKET_CONFIG_TOKEN],\n },\n ]);\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}