🏡 index : quine-global/webdriverio.git

/**
 * A WebSocket implementation that wraps the browser native WebSocket
 * interface and exposes a similar interface to the Node.js WebSocket
 */
export class BrowserSocket {
    #callbacks = new Set<Callback>()
    #ws: WebSocket

    constructor (wsUrl: string, _opts: unknown) {
        this.#ws = new globalThis.WebSocket(wsUrl)
        this.#ws.onmessage = this.handleMessage.bind(this)
    }

    handleMessage (event: MessageEvent) {
        for (const callback of this.#callbacks) {
            callback(event.data)
        }
    }

    send (data: string) {
        this.#ws.send(data)
    }

    on (event: string, callback: Callback) {
        if (event === 'open') {
            this.#ws.onopen = callback
        } else if (event === 'close') {
            this.#ws.onclose = callback
        } else if (event === 'error') {
            this.#ws.onerror = callback
        } else {
            this.#callbacks.add(callback)
        }

        return this
    }

    off (_event: string, callback: Callback) {
        this.#callbacks.delete(callback)
        return this
    }

    close () {
        this.#ws.close()
    }
}

type Callback = (data: unknown, reason?: unknown) => void