{"version":3,"file":"index.cjs","sources":["../src/constants.ts","../src/index.ts"],"sourcesContent":["const STATES = {\n\t0: \"CONNECTING\",\n\t1: \"OPEN\",\n\t2: \"CLOSING\",\n\t3: \"CLOSED\",\n} as const;\n\nconst BINARY_TYPES = {\n\tblob: \"blob\",\n\tarraybuffer: \"arraybuffer\",\n} as const;\n\nexport { BINARY_TYPES, STATES };\n","import { BINARY_TYPES, STATES } from \"./constants\";\n\ninterface WebSocketClientOptions {\n\tshouldReconnect?: boolean;\n\treconnectRetryTimeout?: number;\n\treconnectRetryMaxNumber?: number;\n\tparsedMessage?: boolean;\n\tdebug?: boolean;\n}\n\ntype EventHandler = (event: Event) => void;\ntype MessageHandler = (message: any, event: MessageEvent) => void;\ntype CloseHandler = (event: CloseEvent) => void;\ntype ErrorHandler = (event: Event) => void;\n\ninterface IWebSocketClient {\n\turl: string;\n\tprotocols?: string | string[];\n\toptions: Required<WebSocketClientOptions>;\n\n\twebSocket?: WebSocket;\n\tshouldClose: boolean;\n\tshouldRestart: boolean;\n\tretryNumber: number;\n\n\tonOpen?: EventHandler;\n\tonMessage?: MessageHandler;\n\tonClose?: CloseHandler;\n\tonError?: ErrorHandler;\n}\n\nclass WebSocketClient implements IWebSocketClient {\n\turl: string;\n\tprotocols?: string | string[];\n\toptions: Required<WebSocketClientOptions> = {\n\t\tshouldReconnect: true,\n\t\treconnectRetryTimeout: 1000,\n\t\tparsedMessage: true,\n\t\treconnectRetryMaxNumber: 10,\n\t\tdebug: false,\n\t};\n\n\twebSocket?: WebSocket;\n\tshouldClose: boolean = false;\n\tshouldRestart: boolean = false;\n\tretryNumber: number = 0;\n\n\tonOpen?: EventHandler;\n\tonMessage?: MessageHandler;\n\tonClose?: CloseHandler;\n\tonError?: ErrorHandler;\n\n\tconstructor(url: string, protocols?: string | string[], options?: WebSocketClientOptions) {\n\t\tthis.url = url;\n\t\tif (protocols !== undefined) {\n\t\t\tthis.protocols = protocols;\n\t\t}\n\t\tthis.options = { ...this.options, ...(options ?? {}) };\n\t}\n\n\t// INIT\n\taddOnOpenHandler = (onOpen?: EventHandler) => {\n\t\tif (onOpen !== undefined) {\n\t\t\tthis.onOpen = onOpen;\n\t\t}\n\t};\n\n\taddOnMessageHandler = (onMessage?: MessageHandler) => {\n\t\tif (onMessage !== undefined) {\n\t\t\tthis.onMessage = onMessage;\n\t\t}\n\t};\n\n\taddOnCloseHandler = (onClose?: CloseHandler) => {\n\t\tif (onClose !== undefined) {\n\t\t\tthis.onClose = onClose;\n\t\t}\n\t};\n\n\taddOnErrorHandler = (onError?: ErrorHandler) => {\n\t\tif (onError !== undefined) {\n\t\t\tthis.onError = onError;\n\t\t}\n\t};\n\n\t// HELPERS\n\tgetCurrentState() {\n\t\tlet state = null;\n\t\tif (this.webSocket) {\n\t\t\tstate = STATES[this.webSocket.readyState];\n\t\t}\n\t\treturn state;\n\t}\n\n\tgetBinaryType() {\n\t\tlet binaryType = null;\n\t\tif (this.webSocket) {\n\t\t\tbinaryType = BINARY_TYPES[this.webSocket.binaryType];\n\t\t}\n\t\treturn binaryType;\n\t}\n\n\tgetBufferedAmount() {\n\t\tlet bufferedAmount = null;\n\t\tif (this.webSocket) {\n\t\t\tbufferedAmount = this.webSocket.bufferedAmount;\n\t\t}\n\t\treturn bufferedAmount;\n\t}\n\n\tgetExtensions() {\n\t\tlet extensions = null;\n\t\tif (this.webSocket) {\n\t\t\textensions = this.webSocket.extensions;\n\t\t}\n\t\treturn extensions;\n\t}\n\n\tgetProtocol() {\n\t\tlet protocol = null;\n\t\tif (this.webSocket) {\n\t\t\tprotocol = this.webSocket.protocol;\n\t\t}\n\t\treturn protocol;\n\t}\n\n\tgetUrl() {\n\t\tlet url = null;\n\t\tif (this.webSocket) {\n\t\t\turl = this.webSocket.url;\n\t\t}\n\t\treturn url;\n\t}\n\n\tprivate debug(idn: string, message: string, data: any) {\n\t\tif (this.options.debug) {\n\t\t\tconsole.log(`[${idn}] ${message}`, data);\n\t\t}\n\t}\n\n\t// LIFE CYCLE\n\n\tconnect() {\n\t\tthis.shouldClose = false;\n\t\tif (this.protocols) {\n\t\t\tthis.webSocket = new WebSocket(this.url, this.protocols);\n\t\t} else {\n\t\t\tthis.webSocket = new WebSocket(this.url);\n\t\t}\n\n\t\tthis.webSocket.onopen = (event) => this.onOpenHandler(event);\n\t\tthis.webSocket.onmessage = (event) => this.onMessageHandler(event);\n\t\tthis.webSocket.onclose = (event) => this.onCloseHandler(event);\n\t\tthis.webSocket.onerror = (event) => this.onErrorHandler(event);\n\t}\n\n\tprivate onOpenHandler(event: Event) {\n\t\tthis.debug(\"socket-client\", \"onOpen\", event);\n\t\tthis.retryNumber = 0;\n\t\tif (this.onOpen) {\n\t\t\tthis.onOpen(event);\n\t\t}\n\t}\n\n\tprivate onMessageHandler(event: MessageEvent) {\n\t\tthis.debug(\"socket-client\", \"onMessage\", event);\n\n\t\tif (this.onMessage) {\n\t\t\tlet message = event.data;\n\t\t\tif (this.options.parsedMessage) {\n\t\t\t\ttry {\n\t\t\t\t\tmessage = JSON.parse(message);\n\t\t\t\t} catch (_e) {}\n\t\t\t}\n\n\t\t\tthis.onMessage(message, event);\n\t\t}\n\t}\n\n\tprivate onCloseHandler = (event: CloseEvent) => {\n\t\tthis.debug(\"socket-client\", \"onClose\", event);\n\n\t\tif (this.onClose) {\n\t\t\tthis.onClose(event);\n\t\t}\n\n\t\tif (this.shouldRestart) {\n\t\t\tthis.connect();\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.shouldClose) {\n\t\t\tthis.reconnect();\n\t\t\treturn;\n\t\t}\n\t};\n\n\tprivate onErrorHandler(event: Event) {\n\t\tthis.debug(\"socket-client\", \"onError\", event);\n\n\t\tif (this.onError) {\n\t\t\tthis.onError(event);\n\t\t}\n\t\tthis.close(true);\n\t}\n\n\tsend(data: any) {\n\t\tif (this.webSocket) {\n\t\t\tlet stringifiedData = null;\n\t\t\ttry {\n\t\t\t\tstringifiedData = JSON.stringify(data);\n\t\t\t} catch (_e) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tthis.webSocket.send(stringifiedData);\n\t\t\t\treturn true;\n\t\t\t} catch {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\trestart() {\n\t\tthis.shouldRestart = true;\n\t\tthis.close();\n\t}\n\n\treconnect() {\n\t\tconst { reconnectRetryMaxNumber: maxNumber, reconnectRetryTimeout, shouldReconnect } = this.options;\n\t\tif (shouldReconnect && reconnectRetryTimeout) {\n\t\t\tif (maxNumber && this.retryNumber >= maxNumber) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.retryNumber++;\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.connect();\n\t\t\t}, reconnectRetryTimeout);\n\t\t}\n\t}\n\n\tclose(reconnect?: boolean) {\n\t\tif (this.webSocket) {\n\t\t\tthis.shouldClose = !reconnect;\n\t\t\tthis.webSocket.close();\n\t\t}\n\t}\n}\n\nexport default WebSocketClient;\n"],"names":["STATES","BINARY_TYPES","WebSocketClient","url","protocols","options","onOpen","onMessage","onClose","onError","event","state","binaryType","bufferedAmount","extensions","protocol","idn","message","data","stringifiedData","maxNumber","reconnectRetryTimeout","shouldReconnect","reconnect"],"mappings":"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"}