@sevtech/client-websocket 1.0.0 → 1.0.2

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.
@@ -201,8 +201,8 @@ class WebSocketOptions {
201
201
  return message;
202
202
  }
203
203
  return typeof message === 'string'
204
- ? JSON.stringify(message)
205
- : message;
204
+ ? message
205
+ : JSON.stringify(message);
206
206
  }
207
207
  deserialize(message) {
208
208
  if (this._options?.deserialize instanceof Function) {
@@ -280,7 +280,7 @@ class SocketMessageEvent extends Event {
280
280
  /* Событие превышения лимита переподключение WebSocket-соединения */
281
281
  class SocketPermanentCloseEvent extends Event {
282
282
  constructor() {
283
- super("permanentClose" /* EventName.PermanentClose */);
283
+ super("close:permanent" /* EventName.PermanentClose */);
284
284
  }
285
285
  }
286
286
 
@@ -1 +1 @@
1
- {"version":3,"file":"sevtech-client-websocket.mjs","sources":["../../../projects/client-websocket/src/lib/helpers.ts","../../../projects/client-websocket/src/lib/base-socket.ts","../../../projects/client-websocket/src/lib/websocket-options.ts","../../../projects/client-websocket/src/lib/events.ts","../../../projects/client-websocket/src/lib/websocket.ts","../../../projects/client-websocket/src/public-api.ts","../../../projects/client-websocket/src/sevtech-client-websocket.ts"],"sourcesContent":["import { ProtocolsProvider, Message, UrlProvider } from './types';\n\nexport function selectNextProtocols(provider: ProtocolsProvider | null): Promise<string | string[] | null> {\n if (!provider) {\n return Promise.resolve(null);\n }\n\n if (typeof provider === 'string' || Array.isArray(provider)) {\n return Promise.resolve(provider);\n }\n\n if (typeof provider === 'function') {\n const protocols = provider();\n\n if (protocols instanceof Promise) {\n return protocols;\n }\n\n return selectNextProtocols(protocols);\n }\n\n throw Error('Invalid protocols');\n}\n\nexport function selectNextUrl(provider: UrlProvider): Promise<string> {\n if (typeof provider === 'string') {\n return Promise.resolve(provider);\n }\n\n if (typeof provider === 'function') {\n const url = provider();\n\n if (url instanceof Promise) {\n return url;\n }\n\n return selectNextUrl(url);\n }\n\n throw Error('Invalid URL');\n}\n\nexport function calcBytesSize(messages: Message[]): number {\n return messages.reduce((acc, message) => {\n switch (true) {\n case typeof message === 'string':\n return acc + message.length;\n case message instanceof Blob:\n return acc + message.size;\n default:\n return acc + message.byteLength;\n }\n }, 0);\n}\n\nexport function isWebSocket(data: unknown): data is WebSocket {\n return data instanceof WebSocket;\n}\n\nexport function isAbortController(data: unknown): data is AbortController {\n return data instanceof AbortController\n}\n","import { Message } from './types';\nimport { EventsMap } from './events';\nimport { calcBytesSize, isWebSocket } from './helpers';\n\nexport abstract class BaseSocket<Send = Message, Receive = Message> extends EventTarget {\n /* Соединение ещё не установлено */\n static get CONNECTING(): typeof WebSocket.CONNECTING {\n return WebSocket.CONNECTING;\n }\n\n /* Соединение открыто и готово к обмену данными */\n static get OPEN(): typeof WebSocket.OPEN {\n return WebSocket.OPEN;\n }\n\n /* Соединение в процессе закрытия */\n static get CLOSING(): typeof WebSocket.CLOSING {\n return WebSocket.CLOSING;\n }\n\n /* Соединение закрыто или не может быть открыто */\n static get CLOSED(): typeof WebSocket.CLOSED {\n return WebSocket.CLOSED;\n }\n\n protected abstract _websocket?: WebSocket;\n protected abstract _messageQueue: Message[];\n\n protected _binaryType: BinaryType = 'blob';\n\n abstract readyState: number;\n\n /* Соединение ещё не установлено */\n get CONNECTING(): typeof BaseSocket.CONNECTING {\n return BaseSocket.CONNECTING;\n }\n\n /* Соединение открыто и готово к обмену данными */\n get OPEN(): typeof BaseSocket.OPEN {\n return BaseSocket.OPEN;\n }\n\n /* Соединение в процессе закрытия */\n get CLOSING(): typeof BaseSocket.CLOSING {\n return BaseSocket.CLOSING;\n }\n\n /* Соединение закрыто или не может быть открыто */\n get CLOSED(): typeof BaseSocket.CLOSED {\n return BaseSocket.CLOSED;\n }\n\n /* Тип бинарных данных (blob или arraybuffer) */\n set binaryType(type: BinaryType) {\n this._binaryType = type;\n\n if (isWebSocket(this._websocket)) {\n this._websocket.binaryType = type;\n }\n }\n\n /* Тип бинарных данных (blob или arraybuffer) */\n get binaryType(): BinaryType {\n return isWebSocket(this._websocket) ? this._websocket.binaryType : this._binaryType;\n }\n\n /* URL соединения */\n get url(): string {\n return isWebSocket(this._websocket) ? this._websocket.url : '';\n }\n\n /* Согласованные расширения */\n get extensions(): string {\n return isWebSocket(this._websocket) ? this._websocket.extensions : '';\n }\n\n /* Выбранный подпротокол соединения */\n get protocol(): string {\n return isWebSocket(this._websocket) ? this._websocket.protocol : '';\n }\n\n /* Объём данных в очереди отправки */\n get bufferedAmount(): number {\n return calcBytesSize(this._messageQueue) + (\n isWebSocket(this._websocket)\n ? this._websocket.bufferedAmount\n : 0\n );\n }\n\n abstract send(data: Send): void;\n abstract close(code?: number, reason?: string): void;\n abstract reconnect(code?: number, reason?: string): void;\n\n override addEventListener<K extends keyof EventsMap>(\n type: `${K & string}`,\n listener: (event: EventsMap<Receive>[K]) => void,\n options?: boolean | AddEventListenerOptions\n ): void;\n override addEventListener(\n type: string,\n listener: (event: unknown) => void,\n options?: boolean | AddEventListenerOptions): void\n override addEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions): void {\n super.addEventListener(type, listener, options);\n };\n\n override removeEventListener<K extends keyof EventsMap>(\n type: `${K & string}`,\n listener: (event: EventsMap<Receive>[K]) => void,\n options?: boolean | EventListenerOptions\n ): void;\n override removeEventListener(\n type: string,\n listener: (event: unknown) => void,\n options?: boolean | AddEventListenerOptions\n ): void\n override removeEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | EventListenerOptions\n ): void {\n super.removeEventListener(type, listener, options);\n }\n}\n","import { Options, ProtocolsProvider, Message } from './types';\n\nconst PONG_MESSAGE = 'pong';\nconst PING_MESSAGE = 'ping';\n\nconst OPTIONS = {\n debug: false,\n pingPong: false,\n minUptime: 5000,\n pongTimeout: 5000,\n pingInterval: 1000,\n startClosed: false,\n connectionTimeout: 4000,\n skipPongMessage: false,\n maxReconnectionDelay: 10_000,\n reconnectionDelayGrowFactor: 1.3,\n maxRetries: Number.POSITIVE_INFINITY,\n maxEnqueuedMessages: Number.POSITIVE_INFINITY,\n minReconnectionDelay: 1000 + Math.random() * 4000,\n} as const satisfies Options;\n\ntype RequiredOptions = Required<Pick<Options, keyof typeof OPTIONS>>;\n\nexport class WebSocketOptions<Send = Message, Receive = Message> implements Options<Send, Receive> {\n private readonly _options?: Options<Send, Receive>;\n\n get debug(): boolean {\n return this.getOption('debug');\n }\n\n get pingPong(): boolean {\n return this.getOption('pingPong');\n }\n\n get minUptime(): number {\n return this.getOption('minUptime');\n }\n\n get maxRetries(): number {\n return this.getOption('maxRetries');\n }\n\n get pongTimeout(): number {\n return this.getOption('pongTimeout');\n }\n\n get startClosed(): boolean {\n return this.getOption('startClosed');\n }\n\n get pingInterval(): number {\n return this.getOption('pingInterval');\n }\n\n get skipPongMessage(): boolean {\n return this.getOption('skipPongMessage');\n }\n\n get connectionTimeout(): number {\n return this.getOption('connectionTimeout');\n }\n\n get maxEnqueuedMessages(): number {\n return this.getOption('maxEnqueuedMessages');\n }\n\n get minReconnectionDelay(): number {\n return this.getOption('minReconnectionDelay');\n }\n\n get maxReconnectionDelay(): number {\n return this.getOption('maxReconnectionDelay');\n }\n\n get reconnectionDelayGrowFactor(): number {\n return this.getOption('minReconnectionDelay');\n }\n\n get pingMessage(): Message {\n if (this._options?.pingMessage instanceof Function) {\n return this._options.pingMessage()\n }\n\n return this._options?.pingMessage ?? PING_MESSAGE;\n }\n\n get protocols(): ProtocolsProvider | null {\n return this._options?.protocols ?? null;\n };\n\n constructor(options?: Options<Send, Receive>) {\n if (options) {\n this._options = options;\n }\n }\n\n serialize(message: Send): Message {\n if (this._options?.serialize instanceof Function) {\n return this._options.serialize(message);\n }\n\n if (isBufferedData(message)) {\n return message;\n }\n\n return typeof message === 'string'\n ? JSON.stringify(message)\n : message as string;\n }\n\n deserialize(message: Message): Receive | null {\n if (this._options?.deserialize instanceof Function) {\n return this._options.deserialize(message);\n }\n\n return message as Receive;\n }\n\n isPongMessage(message: Receive | null): boolean {\n if (!this.pingPong) {\n return false;\n }\n\n if (this._options?.isPongMessage instanceof Function) {\n return this._options.isPongMessage(message);\n }\n\n return message === PONG_MESSAGE;\n }\n\n logger(message: string, ...args: unknown[]): void {\n if (!this.debug) {\n return;\n }\n\n if (this._options?.logger instanceof Function) {\n this._options.logger(message, ...args);\n }\n\n const label = ['%c[WS]:', 'color: #0094FF', message];\n\n if (args.length === 0) {\n return console.info(...label);\n }\n\n console.groupCollapsed(...label);\n console.info(...args)\n console.groupEnd();\n }\n\n private getOption<K extends keyof RequiredOptions>(key: K): RequiredOptions[K] {\n return (this._options?.[key] ?? OPTIONS[key]) as RequiredOptions[K];\n }\n}\n\nfunction isBufferedData(value: unknown): value is ArrayBuffer | Blob | ArrayBufferView {\n return value instanceof ArrayBuffer || value instanceof Blob || (ArrayBuffer.isView(value) && value !== null);\n}\n","import { EventName } from './types';\n\nexport interface EventsMap<T = unknown> {\n [EventName.Open]: SocketOpenEvent;\n [EventName.Error]: SocketErrorEvent;\n [EventName.Close]: SocketCloseEvent;\n [EventName.Message]: SocketMessageEvent<T>;\n [EventName.PermanentClose]: SocketPermanentCloseEvent;\n}\n\n/* Событие успешного установления WebSocket-соединения */\nexport class SocketOpenEvent extends Event {\n constructor() {\n super(EventName.Open);\n }\n}\n\n/* Событие закрытия WebSocket-соединения */\nexport class SocketCloseEvent extends CloseEvent {\n constructor(code: number, reason?: string) {\n super(EventName.Close, {\n code,\n reason,\n wasClean: true\n });\n }\n}\n\n/* Событие ошибки в WebSocket-соединении */\nexport class SocketErrorEvent extends Event {\n readonly error?: Error;\n readonly message?: string;\n\n constructor(error?: Error) {\n super(EventName.Error);\n this.error = error;\n this.message = error?.message ?? '[UNKNOWN ERROR]';\n }\n}\n\n/* Событие получения сообщения в WebSocket-соединении */\nexport class SocketMessageEvent<T> extends Event implements MessageEventInit {\n readonly message: T;\n readonly lastEventId?: string\n readonly origin?: string\n readonly ports?: MessagePort[]\n readonly source?: MessageEventSource | null\n\n constructor(message: T, options?: MessageEventInit) {\n super(EventName.Message);\n\n this.message = message;\n this.ports = options?.ports;\n this.source = options?.source\n this.origin = options?.origin;\n this.lastEventId = options?.lastEventId;\n }\n}\n\n/* Событие превышения лимита переподключение WebSocket-соединения */\nexport class SocketPermanentCloseEvent extends Event {\n constructor() {\n super(EventName.PermanentClose);\n }\n}\n","import { BaseSocket } from './base-socket';\nimport { WebSocketOptions } from './websocket-options';\nimport { ErrorCode, ErrorReason, Options, Message, UrlProvider } from './types';\nimport { isAbortController, isWebSocket, selectNextProtocols, selectNextUrl } from './helpers';\nimport { SocketCloseEvent, SocketErrorEvent, SocketMessageEvent, SocketOpenEvent, SocketPermanentCloseEvent } from './events';\n\nexport class SocketClient<Send = Message, Receive = Message> extends BaseSocket<Send, Receive> {\n private readonly _url: UrlProvider;\n private readonly _options: WebSocketOptions<Send, Receive>;\n\n private _abortController?: AbortController;\n private _uptimeTimeoutId: ReturnType<typeof setTimeout> | undefined;\n private _connectTimeoutId: ReturnType<typeof setTimeout> | undefined;\n private _pongTimeoutId: ReturnType<typeof setTimeout> | undefined;\n private _pingIntervalId: ReturnType<typeof setInterval> | undefined;\n\n private _reconnectCount = 0;\n private _connectLock = false;\n private _closeCalled = false;\n private _shouldReconnect = true;\n\n protected _websocket?: WebSocket;\n protected _messageQueue: Message[] = [];\n\n /* Количество попыток переподключения */\n get retryCount(): number {\n return Math.max(this._reconnectCount, 0);\n }\n\n /* Флаг автоматического переподключения */\n get shouldReconnect(): boolean {\n return this._shouldReconnect;\n }\n\n /* Состояние подключения */\n get readyState(): number {\n if (isWebSocket(this._websocket)) {\n return this._websocket.readyState;\n }\n\n return this._options.startClosed\n ? SocketClient.CLOSED\n : SocketClient.CONNECTING;\n }\n\n private get _nextDelay(): number {\n if (this._reconnectCount <= 0) {\n return 0;\n }\n\n return Math.min(\n Math.pow(\n this._options.minReconnectionDelay * this._options.reconnectionDelayGrowFactor,\n this._reconnectCount - 1\n ),\n this._options.maxReconnectionDelay);\n }\n\n constructor(url: UrlProvider, options?: Options<Send, Receive>) {\n super();\n this._url = url;\n this._options = new WebSocketOptions<Send, Receive>(options);\n\n if (this._options.startClosed) {\n this._shouldReconnect = false;\n }\n\n this._connect();\n }\n\n /* Метод закрывает соединение и отключает автоматическое переподключение */\n close(code = 1000, reason?: string): void {\n this._closeCalled = true;\n this._shouldReconnect = false;\n this._clearTimeouts();\n\n if (!isWebSocket(this._websocket)) {\n return this._options.logger('Cannot close WebSocket. No instance');\n }\n\n if (this._websocket.readyState === this.CLOSED) {\n return this._options.logger('Close. WebSocket already closed');\n }\n\n this._websocket.close(code, reason);\n }\n\n /* Метод принудительно переподключает WebSocket и сбрасывает счетчик переподключений */\n reconnect(code = 1000, reason?: string): void {\n this._shouldReconnect = true;\n this._closeCalled = false;\n this._reconnectCount = 0;\n\n if (!isWebSocket(this._websocket) || this._websocket.readyState === this.CLOSED) {\n return this._connect();\n }\n\n this._disconnect(code, reason);\n this._connect();\n }\n\n /* Метод отправляет сообщение. При невозможности отправки добавляет его в очередь */\n send(data: Send): void {\n this._options.logger('Send message', data);\n\n try {\n const serialized = this._options.serialize(data);\n\n if (isWebSocket(this._websocket) && this._websocket.readyState === this.OPEN) {\n return this._websocket.send(serialized);\n }\n\n if (this._messageQueue.length < this._options.maxEnqueuedMessages) {\n this._options.logger('Enqueue message', data);\n this._messageQueue.push(serialized);\n }\n } catch (error) {\n if (error instanceof Error) {\n this.dispatchEvent(new SocketErrorEvent(error));\n }\n }\n }\n\n private _connect(): void {\n if (this._connectLock || !this._shouldReconnect) {\n return;\n }\n\n this._connectLock = true;\n\n if (this._reconnectCount >= this._options.maxRetries) {\n return this._maxRetriesHandler();\n }\n\n this._reconnectCount += 1;\n this._options.logger('Connection', { reconnectCount: this._reconnectCount });\n this._removeListeners();\n\n this._waitConnection()\n .then(() => Promise.all([\n selectNextUrl(this._url),\n selectNextProtocols(this._options.protocols)\n ]))\n .then(([url, protocols]) =>\n this._connectionHandler(url, protocols)\n )\n .catch((error: Error) => {\n this._connectLock = false;\n this._errorHandler(new SocketErrorEvent(Error(error.message)));\n });\n }\n\n private _disconnect(code = 1000, reason?: string): void {\n this._clearTimeouts();\n\n if (!isWebSocket(this._websocket)) {\n return;\n }\n\n this._removeListeners();\n\n try {\n if (this._websocket.readyState === this.OPEN || this._websocket.readyState === this.CONNECTING) {\n this._websocket.close(code, reason);\n }\n\n this._closeHandler(new SocketCloseEvent(code, reason));\n } catch {}\n }\n\n private _connectionHandler(url: string, protocols: string | string[] | null): void {\n if (this._closeCalled) {\n this._connectLock = false;\n return;\n }\n\n this._options.logger('Connect', { url, protocols });\n this._websocket = new WebSocket(url, protocols ?? undefined);\n\n this._websocket.binaryType = this._binaryType;\n this._connectLock = false;\n this._setupListeners();\n\n this._connectTimeoutId = setTimeout(\n () => this._handleConnectionTimeout(),\n this._options.connectionTimeout\n );\n }\n\n private _handleConnectionTimeout(): void {\n this._options.logger('Connection timeout');\n this._errorHandler(new SocketErrorEvent(\n Error(ErrorReason.ConnectionTimeout)\n ));\n }\n\n private _waitConnection(): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, this._nextDelay);\n });\n }\n\n private _openHandler(event: Event): void {\n this._options.logger('🚀 Open event', event);\n clearTimeout(this._connectTimeoutId);\n\n this._uptimeTimeoutId = setTimeout(\n () => this._clearReconnectionCount(),\n this._options.minUptime\n );\n\n if (!isWebSocket(this._websocket)) {\n throw new Error('WebSocket not supported');\n }\n\n this._websocket.binaryType = this._binaryType;\n\n this._sendQueue();\n\n if (this._options.pingPong) {\n this._startPing();\n }\n\n this.dispatchEvent(new SocketOpenEvent());\n }\n\n private _closeHandler(event: SocketCloseEvent): void {\n this._options.logger('❌ Close event', event);\n this._clearTimeouts();\n\n if (this._shouldReconnect) {\n this._connect();\n }\n\n this.dispatchEvent(new SocketCloseEvent(event.code, event.reason));\n }\n\n private _errorHandler(event: SocketErrorEvent): void {\n this._options.logger('🚨 Error event', event);\n let disconnectCode: number | undefined;\n\n if (ErrorReason.PongTimeout === event.message || ErrorReason.ConnectionTimeout === event.message) {\n disconnectCode = ErrorCode.Timeout;\n }\n\n this._disconnect(disconnectCode, event.message);\n\n this.dispatchEvent(new SocketErrorEvent(event.error));\n this._connect();\n }\n\n private _messageHandler(event: MessageEventInit<Message>): void {\n try {\n const deserialized = this._options.deserialize(event.data!);\n\n if (this._options.isPongMessage(deserialized)) {\n this._clearPongTimeout();\n\n if (this._options.skipPongMessage) {\n return;\n }\n }\n\n this._options.logger('✉️ Message event', { message: deserialized });\n this.dispatchEvent(new SocketMessageEvent(deserialized, event));\n } catch (error) {\n if (error instanceof Error) {\n this.dispatchEvent(new SocketErrorEvent(error));\n }\n }\n }\n\n private _sendQueue(): void {\n if (!isWebSocket(this._websocket) || this._messageQueue.length === 0) {\n return;\n }\n\n this._options.logger('Send queue messages', {\n messages: this._messageQueue,\n });\n\n for (const message of this._messageQueue) {\n this._websocket.send(message)\n }\n\n this._messageQueue = [];\n }\n\n private _startPing(): void {\n const message = this._options.pingMessage;\n\n if (isWebSocket(this._websocket) && this._websocket?.readyState === this.OPEN) {\n this._websocket.send(message);\n }\n this._options.logger('Start ping', { message });\n this._pingIntervalId = setInterval(() => {\n if (!isWebSocket(this._websocket)) {\n return;\n }\n\n this._websocket.send(message);\n\n if (this._pongTimeoutId) {\n return;\n }\n\n this._pongTimeoutId = setTimeout(\n () => {\n this._options.logger('Pong timeout');\n this._errorHandler(new SocketErrorEvent(\n Error(ErrorReason.PongTimeout)\n ));\n },\n this._options.pongTimeout,\n );\n }, this._options.pingInterval);\n }\n\n private _maxRetriesHandler(): void {\n this._options.logger('🚫 Max retries reached' , {\n maxRetries: this._options.maxRetries,\n reconnectCount: this._reconnectCount,\n });\n\n this.dispatchEvent(new SocketPermanentCloseEvent());\n }\n\n private _clearReconnectionCount(): void {\n this._options.logger('Clear reconnection count');\n if (!this._pongTimeoutId) {\n this._reconnectCount = 0;\n }\n }\n\n private _removeListeners(): void {\n if (!isAbortController(this._abortController)) {\n return;\n }\n\n this._options.logger('Remove native listeners');\n this._abortController.abort();\n }\n\n private _setupListeners(): void {\n if (!isWebSocket(this._websocket)) { return; }\n\n this._options.logger('Setup native listeners');\n\n this._abortController = new AbortController();\n\n const options: AddEventListenerOptions = {\n signal: this._abortController.signal,\n };\n\n this._websocket.addEventListener('open', this._openHandler.bind(this), options);\n this._websocket.addEventListener('close', this._closeHandler.bind(this), options);\n this._websocket.addEventListener('error', this._errorHandler.bind(this), options);\n this._websocket.addEventListener('message', this._messageHandler.bind(this), options);\n }\n\n private _clearTimeouts(): void {\n clearTimeout(this._connectTimeoutId);\n clearTimeout(this._uptimeTimeoutId);\n this._clearPongTimeout();\n this._clearPingInterval();\n }\n\n private _clearPongTimeout(): void {\n clearTimeout(this._pongTimeoutId);\n this._pongTimeoutId = undefined;\n }\n\n private _clearPingInterval(): void {\n clearInterval(this._pingIntervalId);\n this._pingIntervalId = undefined;\n }\n}\n","/*\n * Public API Surface of client-websocket\n */\n\nexport { SocketClient } from './lib/websocket';\n\nexport {\n SocketErrorEvent,\n SocketMessageEvent,\n SocketOpenEvent,\n SocketPermanentCloseEvent,\n SocketCloseEvent,\n} from './lib/events';\n\nexport type {\n Message as SocketMessage,\n Options as SocketOptions,\n UrlProvider as SocketUrlProvider,\n ProtocolsProvider as SocketProtocolsProvider,\n} from './lib/types';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sevtech-client-websocket.mjs","sources":["../../../projects/client-websocket/src/lib/helpers.ts","../../../projects/client-websocket/src/lib/base-socket.ts","../../../projects/client-websocket/src/lib/websocket-options.ts","../../../projects/client-websocket/src/lib/events.ts","../../../projects/client-websocket/src/lib/websocket.ts","../../../projects/client-websocket/src/public-api.ts","../../../projects/client-websocket/src/sevtech-client-websocket.ts"],"sourcesContent":["import { ProtocolsProvider, Message, UrlProvider } from './types';\r\n\r\nexport function selectNextProtocols(provider: ProtocolsProvider | null): Promise<string | string[] | null> {\r\n if (!provider) {\r\n return Promise.resolve(null);\r\n }\r\n\r\n if (typeof provider === 'string' || Array.isArray(provider)) {\r\n return Promise.resolve(provider);\r\n }\r\n\r\n if (typeof provider === 'function') {\r\n const protocols = provider();\r\n\r\n if (protocols instanceof Promise) {\r\n return protocols;\r\n }\r\n\r\n return selectNextProtocols(protocols);\r\n }\r\n\r\n throw Error('Invalid protocols');\r\n}\r\n\r\nexport function selectNextUrl(provider: UrlProvider): Promise<string> {\r\n if (typeof provider === 'string') {\r\n return Promise.resolve(provider);\r\n }\r\n\r\n if (typeof provider === 'function') {\r\n const url = provider();\r\n\r\n if (url instanceof Promise) {\r\n return url;\r\n }\r\n\r\n return selectNextUrl(url);\r\n }\r\n\r\n throw Error('Invalid URL');\r\n}\r\n\r\nexport function calcBytesSize(messages: Message[]): number {\r\n return messages.reduce((acc, message) => {\r\n switch (true) {\r\n case typeof message === 'string':\r\n return acc + message.length;\r\n case message instanceof Blob:\r\n return acc + message.size;\r\n default:\r\n return acc + message.byteLength;\r\n }\r\n }, 0);\r\n}\r\n\r\nexport function isWebSocket(data: unknown): data is WebSocket {\r\n return data instanceof WebSocket;\r\n}\r\n\r\nexport function isAbortController(data: unknown): data is AbortController {\r\n return data instanceof AbortController\r\n}\r\n","import { Message } from './types';\r\nimport { EventsMap } from './events';\r\nimport { calcBytesSize, isWebSocket } from './helpers';\r\n\r\nexport abstract class BaseSocket<Send = Message, Receive = Message> extends EventTarget {\r\n /* Соединение ещё не установлено */\r\n static get CONNECTING(): typeof WebSocket.CONNECTING {\r\n return WebSocket.CONNECTING;\r\n }\r\n\r\n /* Соединение открыто и готово к обмену данными */\r\n static get OPEN(): typeof WebSocket.OPEN {\r\n return WebSocket.OPEN;\r\n }\r\n\r\n /* Соединение в процессе закрытия */\r\n static get CLOSING(): typeof WebSocket.CLOSING {\r\n return WebSocket.CLOSING;\r\n }\r\n\r\n /* Соединение закрыто или не может быть открыто */\r\n static get CLOSED(): typeof WebSocket.CLOSED {\r\n return WebSocket.CLOSED;\r\n }\r\n\r\n protected abstract _websocket?: WebSocket;\r\n protected abstract _messageQueue: Message[];\r\n\r\n protected _binaryType: BinaryType = 'blob';\r\n\r\n abstract readyState: number;\r\n\r\n /* Соединение ещё не установлено */\r\n get CONNECTING(): typeof BaseSocket.CONNECTING {\r\n return BaseSocket.CONNECTING;\r\n }\r\n\r\n /* Соединение открыто и готово к обмену данными */\r\n get OPEN(): typeof BaseSocket.OPEN {\r\n return BaseSocket.OPEN;\r\n }\r\n\r\n /* Соединение в процессе закрытия */\r\n get CLOSING(): typeof BaseSocket.CLOSING {\r\n return BaseSocket.CLOSING;\r\n }\r\n\r\n /* Соединение закрыто или не может быть открыто */\r\n get CLOSED(): typeof BaseSocket.CLOSED {\r\n return BaseSocket.CLOSED;\r\n }\r\n\r\n /* Тип бинарных данных (blob или arraybuffer) */\r\n set binaryType(type: BinaryType) {\r\n this._binaryType = type;\r\n\r\n if (isWebSocket(this._websocket)) {\r\n this._websocket.binaryType = type;\r\n }\r\n }\r\n\r\n /* Тип бинарных данных (blob или arraybuffer) */\r\n get binaryType(): BinaryType {\r\n return isWebSocket(this._websocket) ? this._websocket.binaryType : this._binaryType;\r\n }\r\n\r\n /* URL соединения */\r\n get url(): string {\r\n return isWebSocket(this._websocket) ? this._websocket.url : '';\r\n }\r\n\r\n /* Согласованные расширения */\r\n get extensions(): string {\r\n return isWebSocket(this._websocket) ? this._websocket.extensions : '';\r\n }\r\n\r\n /* Выбранный подпротокол соединения */\r\n get protocol(): string {\r\n return isWebSocket(this._websocket) ? this._websocket.protocol : '';\r\n }\r\n\r\n /* Объём данных в очереди отправки */\r\n get bufferedAmount(): number {\r\n return calcBytesSize(this._messageQueue) + (\r\n isWebSocket(this._websocket)\r\n ? this._websocket.bufferedAmount\r\n : 0\r\n );\r\n }\r\n\r\n abstract send(data: Send): void;\r\n abstract close(code?: number, reason?: string): void;\r\n abstract reconnect(code?: number, reason?: string): void;\r\n\r\n override addEventListener<K extends keyof EventsMap>(\r\n type: `${K & string}`,\r\n listener: (event: EventsMap<Receive>[K]) => void,\r\n options?: boolean | AddEventListenerOptions\r\n ): void;\r\n override addEventListener(\r\n type: string,\r\n listener: (event: unknown) => void,\r\n options?: boolean | AddEventListenerOptions): void\r\n override addEventListener(\r\n type: string,\r\n listener: EventListenerOrEventListenerObject,\r\n options?: boolean | AddEventListenerOptions): void {\r\n super.addEventListener(type, listener, options);\r\n };\r\n\r\n override removeEventListener<K extends keyof EventsMap>(\r\n type: `${K & string}`,\r\n listener: (event: EventsMap<Receive>[K]) => void,\r\n options?: boolean | EventListenerOptions\r\n ): void;\r\n override removeEventListener(\r\n type: string,\r\n listener: (event: unknown) => void,\r\n options?: boolean | AddEventListenerOptions\r\n ): void\r\n override removeEventListener(\r\n type: string,\r\n listener: EventListenerOrEventListenerObject,\r\n options?: boolean | EventListenerOptions\r\n ): void {\r\n super.removeEventListener(type, listener, options);\r\n }\r\n}\r\n","import { Options, ProtocolsProvider, Message } from './types';\r\n\r\nconst PONG_MESSAGE = 'pong';\r\nconst PING_MESSAGE = 'ping';\r\n\r\nconst OPTIONS = {\r\n debug: false,\r\n pingPong: false,\r\n minUptime: 5000,\r\n pongTimeout: 5000,\r\n pingInterval: 1000,\r\n startClosed: false,\r\n connectionTimeout: 4000,\r\n skipPongMessage: false,\r\n maxReconnectionDelay: 10_000,\r\n reconnectionDelayGrowFactor: 1.3,\r\n maxRetries: Number.POSITIVE_INFINITY,\r\n maxEnqueuedMessages: Number.POSITIVE_INFINITY,\r\n minReconnectionDelay: 1000 + Math.random() * 4000,\r\n} as const satisfies Options;\r\n\r\ntype RequiredOptions = Required<Pick<Options, keyof typeof OPTIONS>>;\r\n\r\nexport class WebSocketOptions<Send = Message, Receive = Message> implements Options<Send, Receive> {\r\n private readonly _options?: Options<Send, Receive>;\r\n\r\n get debug(): boolean {\r\n return this.getOption('debug');\r\n }\r\n\r\n get pingPong(): boolean {\r\n return this.getOption('pingPong');\r\n }\r\n\r\n get minUptime(): number {\r\n return this.getOption('minUptime');\r\n }\r\n\r\n get maxRetries(): number {\r\n return this.getOption('maxRetries');\r\n }\r\n\r\n get pongTimeout(): number {\r\n return this.getOption('pongTimeout');\r\n }\r\n\r\n get startClosed(): boolean {\r\n return this.getOption('startClosed');\r\n }\r\n\r\n get pingInterval(): number {\r\n return this.getOption('pingInterval');\r\n }\r\n\r\n get skipPongMessage(): boolean {\r\n return this.getOption('skipPongMessage');\r\n }\r\n\r\n get connectionTimeout(): number {\r\n return this.getOption('connectionTimeout');\r\n }\r\n\r\n get maxEnqueuedMessages(): number {\r\n return this.getOption('maxEnqueuedMessages');\r\n }\r\n\r\n get minReconnectionDelay(): number {\r\n return this.getOption('minReconnectionDelay');\r\n }\r\n\r\n get maxReconnectionDelay(): number {\r\n return this.getOption('maxReconnectionDelay');\r\n }\r\n\r\n get reconnectionDelayGrowFactor(): number {\r\n return this.getOption('minReconnectionDelay');\r\n }\r\n\r\n get pingMessage(): Message {\r\n if (this._options?.pingMessage instanceof Function) {\r\n return this._options.pingMessage()\r\n }\r\n\r\n return this._options?.pingMessage ?? PING_MESSAGE;\r\n }\r\n\r\n get protocols(): ProtocolsProvider | null {\r\n return this._options?.protocols ?? null;\r\n };\r\n\r\n constructor(options?: Options<Send, Receive>) {\r\n if (options) {\r\n this._options = options;\r\n }\r\n }\r\n\r\n serialize(message: Send): Message {\r\n if (this._options?.serialize instanceof Function) {\r\n return this._options.serialize(message);\r\n }\r\n\r\n if (isBufferedData(message)) {\r\n return message;\r\n }\r\n\r\n return typeof message === 'string'\r\n ? message\r\n : JSON.stringify(message);\r\n }\r\n\r\n deserialize(message: Message): Receive | null {\r\n if (this._options?.deserialize instanceof Function) {\r\n return this._options.deserialize(message);\r\n }\r\n\r\n return message as Receive;\r\n }\r\n\r\n isPongMessage(message: Receive | null): boolean {\r\n if (!this.pingPong) {\r\n return false;\r\n }\r\n\r\n if (this._options?.isPongMessage instanceof Function) {\r\n return this._options.isPongMessage(message);\r\n }\r\n\r\n return message === PONG_MESSAGE;\r\n }\r\n\r\n logger(message: string, ...args: unknown[]): void {\r\n if (!this.debug) {\r\n return;\r\n }\r\n\r\n if (this._options?.logger instanceof Function) {\r\n this._options.logger(message, ...args);\r\n }\r\n\r\n const label = ['%c[WS]:', 'color: #0094FF', message];\r\n\r\n if (args.length === 0) {\r\n return console.info(...label);\r\n }\r\n\r\n console.groupCollapsed(...label);\r\n console.info(...args)\r\n console.groupEnd();\r\n }\r\n\r\n private getOption<K extends keyof RequiredOptions>(key: K): RequiredOptions[K] {\r\n return (this._options?.[key] ?? OPTIONS[key]) as RequiredOptions[K];\r\n }\r\n}\r\n\r\nfunction isBufferedData(value: unknown): value is ArrayBuffer | Blob | ArrayBufferView {\r\n return value instanceof ArrayBuffer || value instanceof Blob || (ArrayBuffer.isView(value) && value !== null);\r\n}\r\n","import { EventName } from './types';\r\n\r\nexport interface EventsMap<T = unknown> {\r\n [EventName.Open]: SocketOpenEvent;\r\n [EventName.Error]: SocketErrorEvent;\r\n [EventName.Close]: SocketCloseEvent;\r\n [EventName.Message]: SocketMessageEvent<T>;\r\n [EventName.PermanentClose]: SocketPermanentCloseEvent;\r\n}\r\n\r\n/* Событие успешного установления WebSocket-соединения */\r\nexport class SocketOpenEvent extends Event {\r\n constructor() {\r\n super(EventName.Open);\r\n }\r\n}\r\n\r\n/* Событие закрытия WebSocket-соединения */\r\nexport class SocketCloseEvent extends CloseEvent {\r\n constructor(code: number, reason?: string) {\r\n super(EventName.Close, {\r\n code,\r\n reason,\r\n wasClean: true\r\n });\r\n }\r\n}\r\n\r\n/* Событие ошибки в WebSocket-соединении */\r\nexport class SocketErrorEvent extends Event {\r\n readonly error?: Error;\r\n readonly message?: string;\r\n\r\n constructor(error?: Error) {\r\n super(EventName.Error);\r\n this.error = error;\r\n this.message = error?.message ?? '[UNKNOWN ERROR]';\r\n }\r\n}\r\n\r\n/* Событие получения сообщения в WebSocket-соединении */\r\nexport class SocketMessageEvent<T> extends Event implements MessageEventInit {\r\n readonly message: T;\r\n readonly lastEventId?: string\r\n readonly origin?: string\r\n readonly ports?: MessagePort[]\r\n readonly source?: MessageEventSource | null\r\n\r\n constructor(message: T, options?: MessageEventInit) {\r\n super(EventName.Message);\r\n\r\n this.message = message;\r\n this.ports = options?.ports;\r\n this.source = options?.source\r\n this.origin = options?.origin;\r\n this.lastEventId = options?.lastEventId;\r\n }\r\n}\r\n\r\n/* Событие превышения лимита переподключение WebSocket-соединения */\r\nexport class SocketPermanentCloseEvent extends Event {\r\n constructor() {\r\n super(EventName.PermanentClose);\r\n }\r\n}\r\n","import { BaseSocket } from './base-socket';\r\nimport { WebSocketOptions } from './websocket-options';\r\nimport { ErrorCode, ErrorReason, Options, Message, UrlProvider } from './types';\r\nimport { isAbortController, isWebSocket, selectNextProtocols, selectNextUrl } from './helpers';\r\nimport { SocketCloseEvent, SocketErrorEvent, SocketMessageEvent, SocketOpenEvent, SocketPermanentCloseEvent } from './events';\r\n\r\nexport class SocketClient<Send = Message, Receive = Message> extends BaseSocket<Send, Receive> {\r\n private readonly _url: UrlProvider;\r\n private readonly _options: WebSocketOptions<Send, Receive>;\r\n\r\n private _abortController?: AbortController;\r\n private _uptimeTimeoutId: ReturnType<typeof setTimeout> | undefined;\r\n private _connectTimeoutId: ReturnType<typeof setTimeout> | undefined;\r\n private _pongTimeoutId: ReturnType<typeof setTimeout> | undefined;\r\n private _pingIntervalId: ReturnType<typeof setInterval> | undefined;\r\n\r\n private _reconnectCount = 0;\r\n private _connectLock = false;\r\n private _closeCalled = false;\r\n private _shouldReconnect = true;\r\n\r\n protected _websocket?: WebSocket;\r\n protected _messageQueue: Message[] = [];\r\n\r\n /* Количество попыток переподключения */\r\n get retryCount(): number {\r\n return Math.max(this._reconnectCount, 0);\r\n }\r\n\r\n /* Флаг автоматического переподключения */\r\n get shouldReconnect(): boolean {\r\n return this._shouldReconnect;\r\n }\r\n\r\n /* Состояние подключения */\r\n get readyState(): number {\r\n if (isWebSocket(this._websocket)) {\r\n return this._websocket.readyState;\r\n }\r\n\r\n return this._options.startClosed\r\n ? SocketClient.CLOSED\r\n : SocketClient.CONNECTING;\r\n }\r\n\r\n private get _nextDelay(): number {\r\n if (this._reconnectCount <= 0) {\r\n return 0;\r\n }\r\n\r\n return Math.min(\r\n Math.pow(\r\n this._options.minReconnectionDelay * this._options.reconnectionDelayGrowFactor,\r\n this._reconnectCount - 1\r\n ),\r\n this._options.maxReconnectionDelay);\r\n }\r\n\r\n constructor(url: UrlProvider, options?: Options<Send, Receive>) {\r\n super();\r\n this._url = url;\r\n this._options = new WebSocketOptions<Send, Receive>(options);\r\n\r\n if (this._options.startClosed) {\r\n this._shouldReconnect = false;\r\n }\r\n\r\n this._connect();\r\n }\r\n\r\n /* Метод закрывает соединение и отключает автоматическое переподключение */\r\n close(code = 1000, reason?: string): void {\r\n this._closeCalled = true;\r\n this._shouldReconnect = false;\r\n this._clearTimeouts();\r\n\r\n if (!isWebSocket(this._websocket)) {\r\n return this._options.logger('Cannot close WebSocket. No instance');\r\n }\r\n\r\n if (this._websocket.readyState === this.CLOSED) {\r\n return this._options.logger('Close. WebSocket already closed');\r\n }\r\n\r\n this._websocket.close(code, reason);\r\n }\r\n\r\n /* Метод принудительно переподключает WebSocket и сбрасывает счетчик переподключений */\r\n reconnect(code = 1000, reason?: string): void {\r\n this._shouldReconnect = true;\r\n this._closeCalled = false;\r\n this._reconnectCount = 0;\r\n\r\n if (!isWebSocket(this._websocket) || this._websocket.readyState === this.CLOSED) {\r\n return this._connect();\r\n }\r\n\r\n this._disconnect(code, reason);\r\n this._connect();\r\n }\r\n\r\n /* Метод отправляет сообщение. При невозможности отправки добавляет его в очередь */\r\n send(data: Send): void {\r\n this._options.logger('Send message', data);\r\n\r\n try {\r\n const serialized = this._options.serialize(data);\r\n\r\n if (isWebSocket(this._websocket) && this._websocket.readyState === this.OPEN) {\r\n return this._websocket.send(serialized);\r\n }\r\n\r\n if (this._messageQueue.length < this._options.maxEnqueuedMessages) {\r\n this._options.logger('Enqueue message', data);\r\n this._messageQueue.push(serialized);\r\n }\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n this.dispatchEvent(new SocketErrorEvent(error));\r\n }\r\n }\r\n }\r\n\r\n private _connect(): void {\r\n if (this._connectLock || !this._shouldReconnect) {\r\n return;\r\n }\r\n\r\n this._connectLock = true;\r\n\r\n if (this._reconnectCount >= this._options.maxRetries) {\r\n return this._maxRetriesHandler();\r\n }\r\n\r\n this._reconnectCount += 1;\r\n this._options.logger('Connection', { reconnectCount: this._reconnectCount });\r\n this._removeListeners();\r\n\r\n this._waitConnection()\r\n .then(() => Promise.all([\r\n selectNextUrl(this._url),\r\n selectNextProtocols(this._options.protocols)\r\n ]))\r\n .then(([url, protocols]) =>\r\n this._connectionHandler(url, protocols)\r\n )\r\n .catch((error: Error) => {\r\n this._connectLock = false;\r\n this._errorHandler(new SocketErrorEvent(Error(error.message)));\r\n });\r\n }\r\n\r\n private _disconnect(code = 1000, reason?: string): void {\r\n this._clearTimeouts();\r\n\r\n if (!isWebSocket(this._websocket)) {\r\n return;\r\n }\r\n\r\n this._removeListeners();\r\n\r\n try {\r\n if (this._websocket.readyState === this.OPEN || this._websocket.readyState === this.CONNECTING) {\r\n this._websocket.close(code, reason);\r\n }\r\n\r\n this._closeHandler(new SocketCloseEvent(code, reason));\r\n } catch {}\r\n }\r\n\r\n private _connectionHandler(url: string, protocols: string | string[] | null): void {\r\n if (this._closeCalled) {\r\n this._connectLock = false;\r\n return;\r\n }\r\n\r\n this._options.logger('Connect', { url, protocols });\r\n this._websocket = new WebSocket(url, protocols ?? undefined);\r\n\r\n this._websocket.binaryType = this._binaryType;\r\n this._connectLock = false;\r\n this._setupListeners();\r\n\r\n this._connectTimeoutId = setTimeout(\r\n () => this._handleConnectionTimeout(),\r\n this._options.connectionTimeout\r\n );\r\n }\r\n\r\n private _handleConnectionTimeout(): void {\r\n this._options.logger('Connection timeout');\r\n this._errorHandler(new SocketErrorEvent(\r\n Error(ErrorReason.ConnectionTimeout)\r\n ));\r\n }\r\n\r\n private _waitConnection(): Promise<void> {\r\n return new Promise((resolve) => {\r\n setTimeout(resolve, this._nextDelay);\r\n });\r\n }\r\n\r\n private _openHandler(event: Event): void {\r\n this._options.logger('🚀 Open event', event);\r\n clearTimeout(this._connectTimeoutId);\r\n\r\n this._uptimeTimeoutId = setTimeout(\r\n () => this._clearReconnectionCount(),\r\n this._options.minUptime\r\n );\r\n\r\n if (!isWebSocket(this._websocket)) {\r\n throw new Error('WebSocket not supported');\r\n }\r\n\r\n this._websocket.binaryType = this._binaryType;\r\n\r\n this._sendQueue();\r\n\r\n if (this._options.pingPong) {\r\n this._startPing();\r\n }\r\n\r\n this.dispatchEvent(new SocketOpenEvent());\r\n }\r\n\r\n private _closeHandler(event: SocketCloseEvent): void {\r\n this._options.logger('❌ Close event', event);\r\n this._clearTimeouts();\r\n\r\n if (this._shouldReconnect) {\r\n this._connect();\r\n }\r\n\r\n this.dispatchEvent(new SocketCloseEvent(event.code, event.reason));\r\n }\r\n\r\n private _errorHandler(event: SocketErrorEvent): void {\r\n this._options.logger('🚨 Error event', event);\r\n let disconnectCode: number | undefined;\r\n\r\n if (ErrorReason.PongTimeout === event.message || ErrorReason.ConnectionTimeout === event.message) {\r\n disconnectCode = ErrorCode.Timeout;\r\n }\r\n\r\n this._disconnect(disconnectCode, event.message);\r\n\r\n this.dispatchEvent(new SocketErrorEvent(event.error));\r\n this._connect();\r\n }\r\n\r\n private _messageHandler(event: MessageEventInit<Message>): void {\r\n try {\r\n const deserialized = this._options.deserialize(event.data!);\r\n\r\n if (this._options.isPongMessage(deserialized)) {\r\n this._clearPongTimeout();\r\n\r\n if (this._options.skipPongMessage) {\r\n return;\r\n }\r\n }\r\n\r\n this._options.logger('✉️ Message event', { message: deserialized });\r\n this.dispatchEvent(new SocketMessageEvent(deserialized, event));\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n this.dispatchEvent(new SocketErrorEvent(error));\r\n }\r\n }\r\n }\r\n\r\n private _sendQueue(): void {\r\n if (!isWebSocket(this._websocket) || this._messageQueue.length === 0) {\r\n return;\r\n }\r\n\r\n this._options.logger('Send queue messages', {\r\n messages: this._messageQueue,\r\n });\r\n\r\n for (const message of this._messageQueue) {\r\n this._websocket.send(message)\r\n }\r\n\r\n this._messageQueue = [];\r\n }\r\n\r\n private _startPing(): void {\r\n const message = this._options.pingMessage;\r\n\r\n if (isWebSocket(this._websocket) && this._websocket?.readyState === this.OPEN) {\r\n this._websocket.send(message);\r\n }\r\n this._options.logger('Start ping', { message });\r\n this._pingIntervalId = setInterval(() => {\r\n if (!isWebSocket(this._websocket)) {\r\n return;\r\n }\r\n\r\n this._websocket.send(message);\r\n\r\n if (this._pongTimeoutId) {\r\n return;\r\n }\r\n\r\n this._pongTimeoutId = setTimeout(\r\n () => {\r\n this._options.logger('Pong timeout');\r\n this._errorHandler(new SocketErrorEvent(\r\n Error(ErrorReason.PongTimeout)\r\n ));\r\n },\r\n this._options.pongTimeout,\r\n );\r\n }, this._options.pingInterval);\r\n }\r\n\r\n private _maxRetriesHandler(): void {\r\n this._options.logger('🚫 Max retries reached' , {\r\n maxRetries: this._options.maxRetries,\r\n reconnectCount: this._reconnectCount,\r\n });\r\n\r\n this.dispatchEvent(new SocketPermanentCloseEvent());\r\n }\r\n\r\n private _clearReconnectionCount(): void {\r\n this._options.logger('Clear reconnection count');\r\n if (!this._pongTimeoutId) {\r\n this._reconnectCount = 0;\r\n }\r\n }\r\n\r\n private _removeListeners(): void {\r\n if (!isAbortController(this._abortController)) {\r\n return;\r\n }\r\n\r\n this._options.logger('Remove native listeners');\r\n this._abortController.abort();\r\n }\r\n\r\n private _setupListeners(): void {\r\n if (!isWebSocket(this._websocket)) { return; }\r\n\r\n this._options.logger('Setup native listeners');\r\n\r\n this._abortController = new AbortController();\r\n\r\n const options: AddEventListenerOptions = {\r\n signal: this._abortController.signal,\r\n };\r\n\r\n this._websocket.addEventListener('open', this._openHandler.bind(this), options);\r\n this._websocket.addEventListener('close', this._closeHandler.bind(this), options);\r\n this._websocket.addEventListener('error', this._errorHandler.bind(this), options);\r\n this._websocket.addEventListener('message', this._messageHandler.bind(this), options);\r\n }\r\n\r\n private _clearTimeouts(): void {\r\n clearTimeout(this._connectTimeoutId);\r\n clearTimeout(this._uptimeTimeoutId);\r\n this._clearPongTimeout();\r\n this._clearPingInterval();\r\n }\r\n\r\n private _clearPongTimeout(): void {\r\n clearTimeout(this._pongTimeoutId);\r\n this._pongTimeoutId = undefined;\r\n }\r\n\r\n private _clearPingInterval(): void {\r\n clearInterval(this._pingIntervalId);\r\n this._pingIntervalId = undefined;\r\n }\r\n}\r\n","/*\r\n * Public API Surface of client-websocket\r\n */\r\n\r\nexport { SocketClient } from './lib/websocket';\r\n\r\nexport {\r\n SocketErrorEvent,\r\n SocketMessageEvent,\r\n SocketOpenEvent,\r\n SocketPermanentCloseEvent,\r\n SocketCloseEvent,\r\n} from './lib/events';\r\n\r\nexport type {\r\n Message as SocketMessage,\r\n Options as SocketOptions,\r\n UrlProvider as SocketUrlProvider,\r\n ProtocolsProvider as SocketProtocolsProvider,\r\n} from './lib/types';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"AAEM,SAAU,mBAAmB,CAAC,QAAkC,EAAA;IACpE,IAAI,CAAC,QAAQ,EAAE;AACb,QAAA,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;IAC9B;AAEA,IAAA,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;AAC3D,QAAA,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;IAClC;AAEA,IAAA,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE;AAClC,QAAA,MAAM,SAAS,GAAG,QAAQ,EAAE;AAE5B,QAAA,IAAI,SAAS,YAAY,OAAO,EAAE;AAChC,YAAA,OAAO,SAAS;QAClB;AAEA,QAAA,OAAO,mBAAmB,CAAC,SAAS,CAAC;IACvC;AAEA,IAAA,MAAM,KAAK,CAAC,mBAAmB,CAAC;AAClC;AAEM,SAAU,aAAa,CAAC,QAAqB,EAAA;AACjD,IAAA,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;AAChC,QAAA,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;IAClC;AAEA,IAAA,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE;AAClC,QAAA,MAAM,GAAG,GAAG,QAAQ,EAAE;AAEtB,QAAA,IAAI,GAAG,YAAY,OAAO,EAAE;AAC1B,YAAA,OAAO,GAAG;QACZ;AAEA,QAAA,OAAO,aAAa,CAAC,GAAG,CAAC;IAC3B;AAEA,IAAA,MAAM,KAAK,CAAC,aAAa,CAAC;AAC5B;AAEM,SAAU,aAAa,CAAC,QAAmB,EAAA;IAC/C,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,OAAO,KAAI;QACtC,QAAQ,IAAI;YACV,KAAK,OAAO,OAAO,KAAK,QAAQ;AAC9B,gBAAA,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM;YAC7B,KAAK,OAAO,YAAY,IAAI;AAC1B,gBAAA,OAAO,GAAG,GAAG,OAAO,CAAC,IAAI;AAC3B,YAAA;AACE,gBAAA,OAAO,GAAG,GAAG,OAAO,CAAC,UAAU;;IAErC,CAAC,EAAE,CAAC,CAAC;AACP;AAEM,SAAU,WAAW,CAAC,IAAa,EAAA;IACvC,OAAO,IAAI,YAAY,SAAS;AAClC;AAEM,SAAU,iBAAiB,CAAC,IAAa,EAAA;IAC7C,OAAO,IAAI,YAAY,eAAe;AACxC;;ACzDM,MAAgB,UAA8C,SAAQ,WAAW,CAAA;AAAvF,IAAA,WAAA,GAAA;;QAwBY,IAAA,CAAA,WAAW,GAAe,MAAM;IAmG5C;;AAzHE,IAAA,WAAW,UAAU,GAAA;QACnB,OAAO,SAAS,CAAC,UAAU;IAC7B;;AAGA,IAAA,WAAW,IAAI,GAAA;QACb,OAAO,SAAS,CAAC,IAAI;IACvB;;AAGA,IAAA,WAAW,OAAO,GAAA;QAChB,OAAO,SAAS,CAAC,OAAO;IAC1B;;AAGA,IAAA,WAAW,MAAM,GAAA;QACf,OAAO,SAAS,CAAC,MAAM;IACzB;;AAUA,IAAA,IAAI,UAAU,GAAA;QACZ,OAAO,UAAU,CAAC,UAAU;IAC9B;;AAGA,IAAA,IAAI,IAAI,GAAA;QACN,OAAO,UAAU,CAAC,IAAI;IACxB;;AAGA,IAAA,IAAI,OAAO,GAAA;QACT,OAAO,UAAU,CAAC,OAAO;IAC3B;;AAGA,IAAA,IAAI,MAAM,GAAA;QACR,OAAO,UAAU,CAAC,MAAM;IAC1B;;IAGA,IAAI,UAAU,CAAC,IAAgB,EAAA;AAC7B,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AAEvB,QAAA,IAAI,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;AAChC,YAAA,IAAI,CAAC,UAAU,CAAC,UAAU,GAAG,IAAI;QACnC;IACF;;AAGA,IAAA,IAAI,UAAU,GAAA;QACZ,OAAO,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW;IACrF;;AAGA,IAAA,IAAI,GAAG,GAAA;AACL,QAAA,OAAO,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,EAAE;IAChE;;AAGA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,GAAG,EAAE;IACvE;;AAGA,IAAA,IAAI,QAAQ,GAAA;AACV,QAAA,OAAO,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,GAAG,EAAE;IACrE;;AAGA,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,OAAO,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,IACtC,WAAW,CAAC,IAAI,CAAC,UAAU;AACzB,cAAE,IAAI,CAAC,UAAU,CAAC;cAChB,CAAC,CACN;IACH;AAeS,IAAA,gBAAgB,CACvB,IAAY,EACZ,QAA4C,EAC5C,OAA2C,EAAA;QAC3C,KAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC;IACjD;;AAYS,IAAA,mBAAmB,CAC1B,IAAY,EACZ,QAA4C,EAC5C,OAAwC,EAAA;QAExC,KAAK,CAAC,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC;IACpD;AACD;;AC7HD,MAAM,YAAY,GAAG,MAAM;AAC3B,MAAM,YAAY,GAAG,MAAM;AAE3B,MAAM,OAAO,GAAG;AACd,IAAA,KAAK,EAAE,KAAK;AACZ,IAAA,QAAQ,EAAE,KAAK;AACf,IAAA,SAAS,EAAE,IAAI;AACf,IAAA,WAAW,EAAE,IAAI;AACjB,IAAA,YAAY,EAAE,IAAI;AAClB,IAAA,WAAW,EAAE,KAAK;AAClB,IAAA,iBAAiB,EAAE,IAAI;AACvB,IAAA,eAAe,EAAE,KAAK;AACtB,IAAA,oBAAoB,EAAE,MAAM;AAC5B,IAAA,2BAA2B,EAAE,GAAG;IAChC,UAAU,EAAE,MAAM,CAAC,iBAAiB;IACpC,mBAAmB,EAAE,MAAM,CAAC,iBAAiB;IAC7C,oBAAoB,EAAE,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI;CACvB;MAIf,gBAAgB,CAAA;AAG3B,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;IAChC;AAEA,IAAA,IAAI,QAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;IACnC;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;IACpC;AAEA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;IACrC;AAEA,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC;IACtC;AAEA,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC;IACtC;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;IACvC;AAEA,IAAA,IAAI,eAAe,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC;IAC1C;AAEA,IAAA,IAAI,iBAAiB,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC;IAC5C;AAEA,IAAA,IAAI,mBAAmB,GAAA;AACrB,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC;IAC9C;AAEA,IAAA,IAAI,oBAAoB,GAAA;AACtB,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC;IAC/C;AAEA,IAAA,IAAI,oBAAoB,GAAA;AACtB,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC;IAC/C;AAEA,IAAA,IAAI,2BAA2B,GAAA;AAC7B,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC;IAC/C;AAEA,IAAA,IAAI,WAAW,GAAA;QACb,IAAI,IAAI,CAAC,QAAQ,EAAE,WAAW,YAAY,QAAQ,EAAE;AAClD,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE;QACpC;AAEA,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,WAAW,IAAI,YAAY;IACnD;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,SAAS,IAAI,IAAI;IACzC;;AAEA,IAAA,WAAA,CAAY,OAAgC,EAAA;QAC1C,IAAI,OAAO,EAAE;AACX,YAAA,IAAI,CAAC,QAAQ,GAAG,OAAO;QACzB;IACF;AAEA,IAAA,SAAS,CAAC,OAAa,EAAA;QACrB,IAAI,IAAI,CAAC,QAAQ,EAAE,SAAS,YAAY,QAAQ,EAAE;YAChD,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC;QACzC;AAEA,QAAA,IAAI,cAAc,CAAC,OAAO,CAAC,EAAE;AAC3B,YAAA,OAAO,OAAO;QAChB;QAEA,OAAO,OAAO,OAAO,KAAK;AACxB,cAAE;AACF,cAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;IAC7B;AAEA,IAAA,WAAW,CAAC,OAAgB,EAAA;QAC1B,IAAI,IAAI,CAAC,QAAQ,EAAE,WAAW,YAAY,QAAQ,EAAE;YAClD,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC;QAC3C;AAEA,QAAA,OAAO,OAAkB;IAC3B;AAEA,IAAA,aAAa,CAAC,OAAuB,EAAA;AACnC,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAClB,YAAA,OAAO,KAAK;QACd;QAEA,IAAI,IAAI,CAAC,QAAQ,EAAE,aAAa,YAAY,QAAQ,EAAE;YACpD,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;QAC7C;QAEA,OAAO,OAAO,KAAK,YAAY;IACjC;AAEA,IAAA,MAAM,CAAC,OAAe,EAAE,GAAG,IAAe,EAAA;AACxC,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACf;QACF;QAEA,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM,YAAY,QAAQ,EAAE;YAC7C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC;QACxC;QAEA,MAAM,KAAK,GAAG,CAAC,SAAS,EAAE,gBAAgB,EAAE,OAAO,CAAC;AAEpD,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AACrB,YAAA,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAC/B;AAEA,QAAA,OAAO,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC;AAChC,QAAA,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QACrB,OAAO,CAAC,QAAQ,EAAE;IACpB;AAEQ,IAAA,SAAS,CAAkC,GAAM,EAAA;AACvD,QAAA,QAAQ,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC;IAC9C;AACD;AAED,SAAS,cAAc,CAAC,KAAc,EAAA;IACpC,OAAO,KAAK,YAAY,WAAW,IAAI,KAAK,YAAY,IAAI,KAAK,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC;AAC/G;;ACnJA;AACM,MAAO,eAAgB,SAAQ,KAAK,CAAA;AACxC,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,6BAAgB;IACvB;AACD;AAED;AACM,MAAO,gBAAiB,SAAQ,UAAU,CAAA;IAC9C,WAAA,CAAY,IAAY,EAAE,MAAe,EAAA;AACvC,QAAA,KAAK,CAAA,OAAA,wBAAkB;YACrB,IAAI;YACJ,MAAM;AACN,YAAA,QAAQ,EAAE;AACX,SAAA,CAAC;IACJ;AACD;AAED;AACM,MAAO,gBAAiB,SAAQ,KAAK,CAAA;AAIzC,IAAA,WAAA,CAAY,KAAa,EAAA;AACvB,QAAA,KAAK,+BAAiB;AACtB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;QAClB,IAAI,CAAC,OAAO,GAAG,KAAK,EAAE,OAAO,IAAI,iBAAiB;IACpD;AACD;AAED;AACM,MAAO,kBAAsB,SAAQ,KAAK,CAAA;IAO9C,WAAA,CAAY,OAAU,EAAE,OAA0B,EAAA;AAChD,QAAA,KAAK,mCAAmB;AAExB,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO;AACtB,QAAA,IAAI,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK;AAC3B,QAAA,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,MAAM;AAC7B,QAAA,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,MAAM;AAC7B,QAAA,IAAI,CAAC,WAAW,GAAG,OAAO,EAAE,WAAW;IACzC;AACD;AAED;AACM,MAAO,yBAA0B,SAAQ,KAAK,CAAA;AAClD,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,kDAA0B;IACjC;AACD;;AC1DK,MAAO,YAAgD,SAAQ,UAAyB,CAAA;;AAmB5F,IAAA,IAAI,UAAU,GAAA;QACZ,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;IAC1C;;AAGA,IAAA,IAAI,eAAe,GAAA;QACjB,OAAO,IAAI,CAAC,gBAAgB;IAC9B;;AAGA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,IAAI,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;AAChC,YAAA,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU;QACnC;AAEA,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC;cACjB,YAAY,CAAC;AACf,cAAE,YAAY,CAAC,UAAU;IAC7B;AAEA,IAAA,IAAY,UAAU,GAAA;AACpB,QAAA,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,EAAE;AAC7B,YAAA,OAAO,CAAC;QACV;AAEA,QAAA,OAAO,IAAI,CAAC,GAAG,CACb,IAAI,CAAC,GAAG,CACN,IAAI,CAAC,QAAQ,CAAC,oBAAoB,GAAG,IAAI,CAAC,QAAQ,CAAC,2BAA2B,EAC9E,IAAI,CAAC,eAAe,GAAG,CAAC,CACzB,EACD,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC;IACvC;IAEA,WAAA,CAAY,GAAgB,EAAE,OAAgC,EAAA;AAC5D,QAAA,KAAK,EAAE;QA3CD,IAAA,CAAA,eAAe,GAAG,CAAC;QACnB,IAAA,CAAA,YAAY,GAAG,KAAK;QACpB,IAAA,CAAA,YAAY,GAAG,KAAK;QACpB,IAAA,CAAA,gBAAgB,GAAG,IAAI;QAGrB,IAAA,CAAA,aAAa,GAAc,EAAE;AAsCrC,QAAA,IAAI,CAAC,IAAI,GAAG,GAAG;QACf,IAAI,CAAC,QAAQ,GAAG,IAAI,gBAAgB,CAAgB,OAAO,CAAC;AAE5D,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE;AAC7B,YAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK;QAC/B;QAEA,IAAI,CAAC,QAAQ,EAAE;IACjB;;AAGA,IAAA,KAAK,CAAC,IAAI,GAAG,IAAI,EAAE,MAAe,EAAA;AAChC,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,QAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK;QAC7B,IAAI,CAAC,cAAc,EAAE;QAErB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YACjC,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,qCAAqC,CAAC;QACpE;QAEA,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,KAAK,IAAI,CAAC,MAAM,EAAE;YAC9C,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,iCAAiC,CAAC;QAChE;QAEA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC;IACrC;;AAGA,IAAA,SAAS,CAAC,IAAI,GAAG,IAAI,EAAE,MAAe,EAAA;AACpC,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AACzB,QAAA,IAAI,CAAC,eAAe,GAAG,CAAC;AAExB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,KAAK,IAAI,CAAC,MAAM,EAAE;AAC/E,YAAA,OAAO,IAAI,CAAC,QAAQ,EAAE;QACxB;AAEA,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC;QAC9B,IAAI,CAAC,QAAQ,EAAE;IACjB;;AAGA,IAAA,IAAI,CAAC,IAAU,EAAA;QACb,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC;AAE1C,QAAA,IAAI;YACF,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC;AAEhD,YAAA,IAAI,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,KAAK,IAAI,CAAC,IAAI,EAAE;gBAC5E,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;YACzC;AAEA,YAAA,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,mBAAmB,EAAE;gBACjE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,iBAAiB,EAAE,IAAI,CAAC;AAC7C,gBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC;YACrC;QACF;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,KAAK,YAAY,KAAK,EAAE;gBAC1B,IAAI,CAAC,aAAa,CAAC,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACjD;QACF;IACF;IAEQ,QAAQ,GAAA;QACd,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAC/C;QACF;AAEA,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;QAExB,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;AACpD,YAAA,OAAO,IAAI,CAAC,kBAAkB,EAAE;QAClC;AAEA,QAAA,IAAI,CAAC,eAAe,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5E,IAAI,CAAC,gBAAgB,EAAE;QAEvB,IAAI,CAAC,eAAe;AACjB,aAAA,IAAI,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC;AACtB,YAAA,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;AACxB,YAAA,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS;AAC5C,SAAA,CAAC;AACD,aAAA,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,KACrB,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,SAAS,CAAC;AAExC,aAAA,KAAK,CAAC,CAAC,KAAY,KAAI;AACtB,YAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AACzB,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAChE,QAAA,CAAC,CAAC;IACN;AAEQ,IAAA,WAAW,CAAC,IAAI,GAAG,IAAI,EAAE,MAAe,EAAA;QAC9C,IAAI,CAAC,cAAc,EAAE;QAErB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YACjC;QACF;QAEA,IAAI,CAAC,gBAAgB,EAAE;AAEvB,QAAA,IAAI;YACF,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,KAAK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU,EAAE;gBAC9F,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC;YACrC;YAEA,IAAI,CAAC,aAAa,CAAC,IAAI,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACxD;QAAE,MAAM,EAAC;IACX;IAEQ,kBAAkB,CAAC,GAAW,EAAE,SAAmC,EAAA;AACzE,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,IAAI,CAAC,YAAY,GAAG,KAAK;YACzB;QACF;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;AACnD,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,SAAS,CAAC,GAAG,EAAE,SAAS,IAAI,SAAS,CAAC;QAE5D,IAAI,CAAC,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW;AAC7C,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;QACzB,IAAI,CAAC,eAAe,EAAE;AAEtB,QAAA,IAAI,CAAC,iBAAiB,GAAG,UAAU,CACjC,MAAM,IAAI,CAAC,wBAAwB,EAAE,EACrC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAChC;IACH;IAEQ,wBAAwB,GAAA;AAC9B,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,oBAAoB,CAAC;QAC1C,IAAI,CAAC,aAAa,CAAC,IAAI,gBAAgB,CACrC,KAAK,CAAA,sBAAA,qCAA+B,CACrC,CAAC;IACJ;IAEQ,eAAe,GAAA;AACrB,QAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;AAC7B,YAAA,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC;AACtC,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,YAAY,CAAC,KAAY,EAAA;QAC/B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC;AAC5C,QAAA,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC;AAEpC,QAAA,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAChC,MAAM,IAAI,CAAC,uBAAuB,EAAE,EACpC,IAAI,CAAC,QAAQ,CAAC,SAAS,CACxB;QAED,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;AACjC,YAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC;QAC5C;QAEA,IAAI,CAAC,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW;QAE7C,IAAI,CAAC,UAAU,EAAE;AAEjB,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;YAC1B,IAAI,CAAC,UAAU,EAAE;QACnB;AAEA,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,eAAe,EAAE,CAAC;IAC3C;AAEQ,IAAA,aAAa,CAAC,KAAuB,EAAA;QAC3C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC;QAC5C,IAAI,CAAC,cAAc,EAAE;AAErB,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACzB,IAAI,CAAC,QAAQ,EAAE;QACjB;AAEA,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACpE;AAEQ,IAAA,aAAa,CAAC,KAAuB,EAAA;QAC3C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,EAAE,KAAK,CAAC;AAC7C,QAAA,IAAI,cAAkC;QAEtC,IAAI,gBAAA,mCAA4B,KAAK,CAAC,OAAO,IAAI,+DAAkC,KAAK,CAAC,OAAO,EAAE;AAChG,YAAA,cAAc;QAChB;QAEA,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC;QAE/C,IAAI,CAAC,aAAa,CAAC,IAAI,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrD,IAAI,CAAC,QAAQ,EAAE;IACjB;AAEQ,IAAA,eAAe,CAAC,KAAgC,EAAA;AACtD,QAAA,IAAI;AACF,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,IAAK,CAAC;YAE3D,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE;gBAC7C,IAAI,CAAC,iBAAiB,EAAE;AAExB,gBAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE;oBACjC;gBACF;YACF;AAEA,YAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,kBAAkB,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;YACnE,IAAI,CAAC,aAAa,CAAC,IAAI,kBAAkB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QACjE;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,KAAK,YAAY,KAAK,EAAE;gBAC1B,IAAI,CAAC,aAAa,CAAC,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACjD;QACF;IACF;IAEQ,UAAU,GAAA;AAChB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;YACpE;QACF;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,qBAAqB,EAAE;YAC1C,QAAQ,EAAE,IAAI,CAAC,aAAa;AAC7B,SAAA,CAAC;AAEF,QAAA,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,aAAa,EAAE;AACxC,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;QAC/B;AAEA,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE;IACzB;IAEQ,UAAU,GAAA;AAChB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW;AAEzC,QAAA,IAAI,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC,IAAI,EAAE;AAC7E,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;QAC/B;QACA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,CAAC;AAC/C,QAAA,IAAI,CAAC,eAAe,GAAG,WAAW,CAAC,MAAK;YACtC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;gBACjC;YACF;AAEA,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;AAE7B,YAAA,IAAI,IAAI,CAAC,cAAc,EAAE;gBACvB;YACF;AAEA,YAAA,IAAI,CAAC,cAAc,GAAG,UAAU,CAC9B,MAAK;AACH,gBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC;gBACpC,IAAI,CAAC,aAAa,CAAC,IAAI,gBAAgB,CACrC,KAAK,CAAA,gBAAA,+BAAyB,CAC/B,CAAC;AACJ,YAAA,CAAC,EACD,IAAI,CAAC,QAAQ,CAAC,WAAW,CAC1B;AACH,QAAA,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;IAChC;IAEQ,kBAAkB,GAAA;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,wBAAwB,EAAG;AAC9C,YAAA,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU;YACpC,cAAc,EAAE,IAAI,CAAC,eAAe;AACrC,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,yBAAyB,EAAE,CAAC;IACrD;IAEQ,uBAAuB,GAAA;AAC7B,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,0BAA0B,CAAC;AAChD,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AACxB,YAAA,IAAI,CAAC,eAAe,GAAG,CAAC;QAC1B;IACF;IAEQ,gBAAgB,GAAA;QACtB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE;YAC7C;QACF;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,yBAAyB,CAAC;AAC/C,QAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE;IAC/B;IAEQ,eAAe,GAAA;QACrB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YAAE;QAAQ;AAE7C,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,wBAAwB,CAAC;AAE9C,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,eAAe,EAAE;AAE7C,QAAA,MAAM,OAAO,GAA4B;AACvC,YAAA,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM;SACrC;AAED,QAAA,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;AAC/E,QAAA,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;AACjF,QAAA,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;AACjF,QAAA,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACvF;IAEQ,cAAc,GAAA;AACpB,QAAA,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC;AACpC,QAAA,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC;QACnC,IAAI,CAAC,iBAAiB,EAAE;QACxB,IAAI,CAAC,kBAAkB,EAAE;IAC3B;IAEQ,iBAAiB,GAAA;AACvB,QAAA,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC;AACjC,QAAA,IAAI,CAAC,cAAc,GAAG,SAAS;IACjC;IAEQ,kBAAkB,GAAA;AACxB,QAAA,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC;AACnC,QAAA,IAAI,CAAC,eAAe,GAAG,SAAS;IAClC;AACD;;ACxXD;;AAEG;;ACFH;;AAEG;;;;"}
package/index.d.ts CHANGED
@@ -1,5 +1,136 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- /// <amd-module name="@sevtech/client-websocket" />
5
- export * from './public-api';
1
+ declare const enum EventName {
2
+ Open = "open",
3
+ Error = "error",
4
+ Close = "close",
5
+ Message = "message",
6
+ PermanentClose = "close:permanent"
7
+ }
8
+ type WSUrl = `${'ws' | 'wss'}://${string}` & string;
9
+ type UrlProvider = WSUrl | (() => WSUrl) | (() => Promise<WSUrl>);
10
+ type ProtocolsProvider = null | string | string[] | (() => string | string[] | null) | (() => Promise<string | string[] | null>);
11
+ type BufferedMessage = ArrayBuffer | Blob | ArrayBufferView;
12
+ type Message = string | BufferedMessage;
13
+ interface Options<Send = Message, Receive = Message> {
14
+ debug?: boolean;
15
+ pingPong?: boolean;
16
+ startClosed?: boolean;
17
+ minUptime?: number;
18
+ pongTimeout?: number;
19
+ pingInterval?: number;
20
+ connectionTimeout?: number;
21
+ maxRetries?: number;
22
+ minReconnectionDelay?: number;
23
+ maxReconnectionDelay?: number;
24
+ reconnectionDelayGrowFactor?: number;
25
+ maxEnqueuedMessages?: number;
26
+ skipPongMessage?: boolean;
27
+ protocols?: ProtocolsProvider;
28
+ logger?: (message: string, ...args: unknown[]) => void;
29
+ serialize?: (value: Send) => Message;
30
+ deserialize?: (message: Message) => Receive | null;
31
+ isPongMessage?: (message: Receive | null) => boolean;
32
+ pingMessage?: (() => Message) | Message;
33
+ }
34
+
35
+ interface EventsMap<T = unknown> {
36
+ [EventName.Open]: SocketOpenEvent;
37
+ [EventName.Error]: SocketErrorEvent;
38
+ [EventName.Close]: SocketCloseEvent;
39
+ [EventName.Message]: SocketMessageEvent<T>;
40
+ [EventName.PermanentClose]: SocketPermanentCloseEvent;
41
+ }
42
+ declare class SocketOpenEvent extends Event {
43
+ constructor();
44
+ }
45
+ declare class SocketCloseEvent extends CloseEvent {
46
+ constructor(code: number, reason?: string);
47
+ }
48
+ declare class SocketErrorEvent extends Event {
49
+ readonly error?: Error;
50
+ readonly message?: string;
51
+ constructor(error?: Error);
52
+ }
53
+ declare class SocketMessageEvent<T> extends Event implements MessageEventInit {
54
+ readonly message: T;
55
+ readonly lastEventId?: string;
56
+ readonly origin?: string;
57
+ readonly ports?: MessagePort[];
58
+ readonly source?: MessageEventSource | null;
59
+ constructor(message: T, options?: MessageEventInit);
60
+ }
61
+ declare class SocketPermanentCloseEvent extends Event {
62
+ constructor();
63
+ }
64
+
65
+ declare abstract class BaseSocket<Send = Message, Receive = Message> extends EventTarget {
66
+ static get CONNECTING(): typeof WebSocket.CONNECTING;
67
+ static get OPEN(): typeof WebSocket.OPEN;
68
+ static get CLOSING(): typeof WebSocket.CLOSING;
69
+ static get CLOSED(): typeof WebSocket.CLOSED;
70
+ protected abstract _websocket?: WebSocket;
71
+ protected abstract _messageQueue: Message[];
72
+ protected _binaryType: BinaryType;
73
+ abstract readyState: number;
74
+ get CONNECTING(): typeof BaseSocket.CONNECTING;
75
+ get OPEN(): typeof BaseSocket.OPEN;
76
+ get CLOSING(): typeof BaseSocket.CLOSING;
77
+ get CLOSED(): typeof BaseSocket.CLOSED;
78
+ set binaryType(type: BinaryType);
79
+ get binaryType(): BinaryType;
80
+ get url(): string;
81
+ get extensions(): string;
82
+ get protocol(): string;
83
+ get bufferedAmount(): number;
84
+ abstract send(data: Send): void;
85
+ abstract close(code?: number, reason?: string): void;
86
+ abstract reconnect(code?: number, reason?: string): void;
87
+ addEventListener<K extends keyof EventsMap>(type: `${K & string}`, listener: (event: EventsMap<Receive>[K]) => void, options?: boolean | AddEventListenerOptions): void;
88
+ addEventListener(type: string, listener: (event: unknown) => void, options?: boolean | AddEventListenerOptions): void;
89
+ removeEventListener<K extends keyof EventsMap>(type: `${K & string}`, listener: (event: EventsMap<Receive>[K]) => void, options?: boolean | EventListenerOptions): void;
90
+ removeEventListener(type: string, listener: (event: unknown) => void, options?: boolean | AddEventListenerOptions): void;
91
+ }
92
+
93
+ declare class SocketClient<Send = Message, Receive = Message> extends BaseSocket<Send, Receive> {
94
+ private readonly _url;
95
+ private readonly _options;
96
+ private _abortController?;
97
+ private _uptimeTimeoutId;
98
+ private _connectTimeoutId;
99
+ private _pongTimeoutId;
100
+ private _pingIntervalId;
101
+ private _reconnectCount;
102
+ private _connectLock;
103
+ private _closeCalled;
104
+ private _shouldReconnect;
105
+ protected _websocket?: WebSocket;
106
+ protected _messageQueue: Message[];
107
+ get retryCount(): number;
108
+ get shouldReconnect(): boolean;
109
+ get readyState(): number;
110
+ private get _nextDelay();
111
+ constructor(url: UrlProvider, options?: Options<Send, Receive>);
112
+ close(code?: number, reason?: string): void;
113
+ reconnect(code?: number, reason?: string): void;
114
+ send(data: Send): void;
115
+ private _connect;
116
+ private _disconnect;
117
+ private _connectionHandler;
118
+ private _handleConnectionTimeout;
119
+ private _waitConnection;
120
+ private _openHandler;
121
+ private _closeHandler;
122
+ private _errorHandler;
123
+ private _messageHandler;
124
+ private _sendQueue;
125
+ private _startPing;
126
+ private _maxRetriesHandler;
127
+ private _clearReconnectionCount;
128
+ private _removeListeners;
129
+ private _setupListeners;
130
+ private _clearTimeouts;
131
+ private _clearPongTimeout;
132
+ private _clearPingInterval;
133
+ }
134
+
135
+ export { SocketClient, SocketCloseEvent, SocketErrorEvent, SocketMessageEvent, SocketOpenEvent, SocketPermanentCloseEvent };
136
+ export type { Message as SocketMessage, Options as SocketOptions, ProtocolsProvider as SocketProtocolsProvider, UrlProvider as SocketUrlProvider };
package/package.json CHANGED
@@ -1,10 +1,14 @@
1
1
  {
2
2
  "name": "@sevtech/client-websocket",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "dependencies": {
5
5
  "tslib": "^2.3.0"
6
6
  },
7
7
  "sideEffects": false,
8
+ "publishConfig": {
9
+ "access": "public"
10
+ },
11
+ "license": "MIT",
8
12
  "module": "fesm2022/sevtech-client-websocket.mjs",
9
13
  "typings": "index.d.ts",
10
14
  "exports": {
@@ -16,4 +20,4 @@
16
20
  "default": "./fesm2022/sevtech-client-websocket.mjs"
17
21
  }
18
22
  }
19
- }
23
+ }
package/README.md DELETED
File without changes
@@ -1,29 +0,0 @@
1
- import { Message } from './types';
2
- import { EventsMap } from './events';
3
- export declare abstract class BaseSocket<Send = Message, Receive = Message> extends EventTarget {
4
- static get CONNECTING(): typeof WebSocket.CONNECTING;
5
- static get OPEN(): typeof WebSocket.OPEN;
6
- static get CLOSING(): typeof WebSocket.CLOSING;
7
- static get CLOSED(): typeof WebSocket.CLOSED;
8
- protected abstract _websocket?: WebSocket;
9
- protected abstract _messageQueue: Message[];
10
- protected _binaryType: BinaryType;
11
- abstract readyState: number;
12
- get CONNECTING(): typeof BaseSocket.CONNECTING;
13
- get OPEN(): typeof BaseSocket.OPEN;
14
- get CLOSING(): typeof BaseSocket.CLOSING;
15
- get CLOSED(): typeof BaseSocket.CLOSED;
16
- set binaryType(type: BinaryType);
17
- get binaryType(): BinaryType;
18
- get url(): string;
19
- get extensions(): string;
20
- get protocol(): string;
21
- get bufferedAmount(): number;
22
- abstract send(data: Send): void;
23
- abstract close(code?: number, reason?: string): void;
24
- abstract reconnect(code?: number, reason?: string): void;
25
- addEventListener<K extends keyof EventsMap>(type: `${K & string}`, listener: (event: EventsMap<Receive>[K]) => void, options?: boolean | AddEventListenerOptions): void;
26
- addEventListener(type: string, listener: (event: unknown) => void, options?: boolean | AddEventListenerOptions): void;
27
- removeEventListener<K extends keyof EventsMap>(type: `${K & string}`, listener: (event: EventsMap<Receive>[K]) => void, options?: boolean | EventListenerOptions): void;
28
- removeEventListener(type: string, listener: (event: unknown) => void, options?: boolean | AddEventListenerOptions): void;
29
- }
package/lib/events.d.ts DELETED
@@ -1,30 +0,0 @@
1
- import { EventName } from './types';
2
- export interface EventsMap<T = unknown> {
3
- [EventName.Open]: SocketOpenEvent;
4
- [EventName.Error]: SocketErrorEvent;
5
- [EventName.Close]: SocketCloseEvent;
6
- [EventName.Message]: SocketMessageEvent<T>;
7
- [EventName.PermanentClose]: SocketPermanentCloseEvent;
8
- }
9
- export declare class SocketOpenEvent extends Event {
10
- constructor();
11
- }
12
- export declare class SocketCloseEvent extends CloseEvent {
13
- constructor(code: number, reason?: string);
14
- }
15
- export declare class SocketErrorEvent extends Event {
16
- readonly error?: Error;
17
- readonly message?: string;
18
- constructor(error?: Error);
19
- }
20
- export declare class SocketMessageEvent<T> extends Event implements MessageEventInit {
21
- readonly message: T;
22
- readonly lastEventId?: string;
23
- readonly origin?: string;
24
- readonly ports?: MessagePort[];
25
- readonly source?: MessageEventSource | null;
26
- constructor(message: T, options?: MessageEventInit);
27
- }
28
- export declare class SocketPermanentCloseEvent extends Event {
29
- constructor();
30
- }
package/lib/helpers.d.ts DELETED
@@ -1,6 +0,0 @@
1
- import { ProtocolsProvider, Message, UrlProvider } from './types';
2
- export declare function selectNextProtocols(provider: ProtocolsProvider | null): Promise<string | string[] | null>;
3
- export declare function selectNextUrl(provider: UrlProvider): Promise<string>;
4
- export declare function calcBytesSize(messages: Message[]): number;
5
- export declare function isWebSocket(data: unknown): data is WebSocket;
6
- export declare function isAbortController(data: unknown): data is AbortController;
package/lib/types.d.ts DELETED
@@ -1,41 +0,0 @@
1
- export declare const enum EventName {
2
- Open = "open",
3
- Error = "error",
4
- Close = "close",
5
- Message = "message",
6
- PermanentClose = "permanentClose"
7
- }
8
- export declare const enum ErrorCode {
9
- Timeout = 3008
10
- }
11
- export declare const enum ErrorReason {
12
- PongTimeout = "[PONG TIMEOUT]",
13
- ConnectionTimeout = "[CONNECTION TIMEOUT]"
14
- }
15
- type WSUrl = `${'ws' | 'wss'}:/*${string}` & string;
16
- export type UrlProvider = WSUrl | (() => WSUrl) | (() => Promise<WSUrl>);
17
- export type ProtocolsProvider = null | string | string[] | (() => string | string[] | null) | (() => Promise<string | string[] | null>);
18
- export type BufferedMessage = ArrayBuffer | Blob | ArrayBufferView;
19
- export type Message = string | BufferedMessage;
20
- export interface Options<Send = Message, Receive = Message> {
21
- debug?: boolean;
22
- pingPong?: boolean;
23
- startClosed?: boolean;
24
- minUptime?: number;
25
- pongTimeout?: number;
26
- pingInterval?: number;
27
- connectionTimeout?: number;
28
- maxRetries?: number;
29
- minReconnectionDelay?: number;
30
- maxReconnectionDelay?: number;
31
- reconnectionDelayGrowFactor?: number;
32
- maxEnqueuedMessages?: number;
33
- skipPongMessage?: boolean;
34
- protocols?: ProtocolsProvider;
35
- logger?: (message: string, ...args: unknown[]) => void;
36
- serialize?: (value: Send) => Message;
37
- deserialize?: (message: Message) => Receive | null;
38
- isPongMessage?: (message: Receive | null) => boolean;
39
- pingMessage?: (() => Message) | Message;
40
- }
41
- export {};
@@ -1,25 +0,0 @@
1
- import { Options, ProtocolsProvider, Message } from './types';
2
- export declare class WebSocketOptions<Send = Message, Receive = Message> implements Options<Send, Receive> {
3
- private readonly _options?;
4
- get debug(): boolean;
5
- get pingPong(): boolean;
6
- get minUptime(): number;
7
- get maxRetries(): number;
8
- get pongTimeout(): number;
9
- get startClosed(): boolean;
10
- get pingInterval(): number;
11
- get skipPongMessage(): boolean;
12
- get connectionTimeout(): number;
13
- get maxEnqueuedMessages(): number;
14
- get minReconnectionDelay(): number;
15
- get maxReconnectionDelay(): number;
16
- get reconnectionDelayGrowFactor(): number;
17
- get pingMessage(): Message;
18
- get protocols(): ProtocolsProvider | null;
19
- constructor(options?: Options<Send, Receive>);
20
- serialize(message: Send): Message;
21
- deserialize(message: Message): Receive | null;
22
- isPongMessage(message: Receive | null): boolean;
23
- logger(message: string, ...args: unknown[]): void;
24
- private getOption;
25
- }
@@ -1,43 +0,0 @@
1
- import { BaseSocket } from './base-socket';
2
- import { Options, Message, UrlProvider } from './types';
3
- export declare class SocketClient<Send = Message, Receive = Message> extends BaseSocket<Send, Receive> {
4
- private readonly _url;
5
- private readonly _options;
6
- private _abortController?;
7
- private _uptimeTimeoutId;
8
- private _connectTimeoutId;
9
- private _pongTimeoutId;
10
- private _pingIntervalId;
11
- private _reconnectCount;
12
- private _connectLock;
13
- private _closeCalled;
14
- private _shouldReconnect;
15
- protected _websocket?: WebSocket;
16
- protected _messageQueue: Message[];
17
- get retryCount(): number;
18
- get shouldReconnect(): boolean;
19
- get readyState(): number;
20
- private get _nextDelay();
21
- constructor(url: UrlProvider, options?: Options<Send, Receive>);
22
- close(code?: number, reason?: string): void;
23
- reconnect(code?: number, reason?: string): void;
24
- send(data: Send): void;
25
- private _connect;
26
- private _disconnect;
27
- private _connectionHandler;
28
- private _handleConnectionTimeout;
29
- private _waitConnection;
30
- private _openHandler;
31
- private _closeHandler;
32
- private _errorHandler;
33
- private _messageHandler;
34
- private _sendQueue;
35
- private _startPing;
36
- private _maxRetriesHandler;
37
- private _clearReconnectionCount;
38
- private _removeListeners;
39
- private _setupListeners;
40
- private _clearTimeouts;
41
- private _clearPongTimeout;
42
- private _clearPingInterval;
43
- }
package/public-api.d.ts DELETED
@@ -1,3 +0,0 @@
1
- export { SocketClient } from './lib/websocket';
2
- export { SocketErrorEvent, SocketMessageEvent, SocketOpenEvent, SocketPermanentCloseEvent, SocketCloseEvent, } from './lib/events';
3
- export type { Message as SocketMessage, Options as SocketOptions, UrlProvider as SocketUrlProvider, ProtocolsProvider as SocketProtocolsProvider, } from './lib/types';