@mertushka/node-datachannel
Version:
WebRTC For Node.js and Electron. libdatachannel node bindings.
1 lines • 15 kB
Source Map (JSON)
{"version":3,"file":"RTCDataChannel.mjs","sources":["../../../src/polyfill/RTCDataChannel.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport * as exceptions from './Exception';\nimport { DataChannel } from '../lib/index';\nimport { RTCErrorEvent } from './Events';\n\nexport default class RTCDataChannel extends EventTarget implements globalThis.RTCDataChannel {\n #dataChannel: DataChannel;\n #readyState: globalThis.RTCDataChannelState;\n #bufferedAmountLowThreshold: number;\n #binaryType: BinaryType;\n #maxPacketLifeTime: number | null;\n #maxRetransmits: number | null;\n #negotiated: boolean;\n #ordered: boolean;\n #id: number;\n #label: string;\n #protocol: string;\n\n #closeRequested = false;\n\n // events\n onbufferedamountlow: globalThis.RTCDataChannel['onbufferedamountlow'] = null;\n onclose: globalThis.RTCDataChannel['onclose'] = null;\n onclosing: globalThis.RTCDataChannel['onclosing'] = null;\n onerror: globalThis.RTCDataChannel['onerror'] = null;\n onmessage: globalThis.RTCDataChannel['onmessage'] = null;\n onopen: globalThis.RTCDataChannel['onopen'] = null;\n\n constructor(dataChannel: DataChannel, opts: globalThis.RTCDataChannelInit = {}) {\n super();\n\n this.#dataChannel = dataChannel;\n this.#binaryType = 'blob';\n this.#readyState = this.#dataChannel.isOpen() ? 'open' : 'connecting';\n this.#bufferedAmountLowThreshold = 0;\n this.#maxPacketLifeTime = opts.maxPacketLifeTime ?? null;\n this.#maxRetransmits = opts.maxRetransmits ?? null;\n this.#negotiated = opts.negotiated ?? false;\n this.#ordered = opts.ordered ?? true;\n this.#id = this.#dataChannel.getId();\n this.#label = this.#dataChannel.getLabel();\n this.#protocol = this.#dataChannel.getProtocol();\n\n // forward dataChannel events\n this.#dataChannel.onOpen(() => {\n this.#readyState = 'open';\n this.dispatchEvent(new Event('open', {}));\n });\n\n this.#dataChannel.onClosed(() => {\n if (this.#readyState === 'closed') return;\n\n if (!this.#closeRequested) {\n // if close was not requested, we emit 'closing' before 'close' to match the spec behavior\n this.#readyState = 'closing';\n this.dispatchEvent(new Event('closing'));\n }\n\n setImmediate(() => {\n if (this.#readyState !== 'closed') {\n this.#readyState = 'closed';\n this.dispatchEvent(new Event('close'));\n }\n });\n });\n\n this.#dataChannel.onError((msg) => {\n this.dispatchEvent(\n new RTCErrorEvent('error', {\n error: new RTCError(\n {\n errorDetail: 'data-channel-failure',\n },\n msg,\n ),\n }),\n );\n });\n\n this.#dataChannel.onBufferedAmountLow(() => {\n this.dispatchEvent(new Event('bufferedamountlow'));\n });\n\n this.#dataChannel.onMessage((data) => {\n if (ArrayBuffer.isView(data)) {\n data =\n this.binaryType === 'arraybuffer'\n ? (data.buffer as ArrayBuffer)\n : Buffer.from(data.buffer);\n }\n\n this.dispatchEvent(new MessageEvent('message', { data }));\n });\n\n // forward events to properties\n this.addEventListener('open', (e) => this.onopen?.(e));\n this.addEventListener('message', (e) => this.onmessage?.(e as MessageEvent));\n this.addEventListener('error', (e) => this.onerror?.(e as RTCErrorEvent));\n this.addEventListener('close', (e) => this.onclose?.(e));\n this.addEventListener('closing', (e) => this.onclosing?.(e));\n this.addEventListener('bufferedamountlow', (e) => this.onbufferedamountlow?.(e));\n }\n\n set binaryType(type) {\n if (type !== 'blob' && type !== 'arraybuffer') {\n throw new DOMException(\n \"Failed to set the 'binaryType' property on 'RTCDataChannel': Unknown binary type : \" +\n type,\n 'TypeMismatchError',\n );\n }\n this.#binaryType = type;\n }\n\n get binaryType(): BinaryType {\n return this.#binaryType;\n }\n\n get bufferedAmount(): number {\n return this.#dataChannel.bufferedAmount();\n }\n\n get bufferedAmountLowThreshold(): number {\n return this.#bufferedAmountLowThreshold;\n }\n\n set bufferedAmountLowThreshold(value) {\n const number = Number(value) || 0;\n this.#bufferedAmountLowThreshold = number;\n this.#dataChannel.setBufferedAmountLowThreshold(number);\n }\n\n get id(): number | null {\n return this.#id;\n }\n\n get label(): string {\n return this.#label;\n }\n\n get maxPacketLifeTime(): number | null {\n return this.#maxPacketLifeTime;\n }\n\n get maxRetransmits(): number | null {\n return this.#maxRetransmits;\n }\n\n get negotiated(): boolean {\n return this.#negotiated;\n }\n\n get ordered(): boolean {\n return this.#ordered;\n }\n\n get protocol(): string {\n return this.#protocol;\n }\n\n get readyState(): globalThis.RTCDataChannelState {\n return this.#readyState;\n }\n\n send(data: string | Blob | ArrayBuffer | ArrayBufferView): void {\n if (this.#readyState !== 'open') {\n if (process.env.DATACHANNEL_SEND_DEBUG === 'true') {\n console.error(\n new exceptions.InvalidStateError(\n \"Failed to execute 'send' on 'RTCDataChannel': RTCDataChannel.readyState is not 'open'\",\n ),\n );\n }\n return;\n }\n\n // Needs network error, type error implemented\n try {\n if (typeof data === 'string') {\n this.#dataChannel.sendMessage(data);\n } else if (data instanceof Blob) {\n data.arrayBuffer().then((ab) => {\n if (process?.versions?.bun) {\n this.#dataChannel.sendMessageBinary(Buffer.from(ab));\n } else {\n this.#dataChannel.sendMessageBinary(new Uint8Array(ab));\n }\n });\n } else if (data instanceof Uint8Array) {\n this.#dataChannel.sendMessageBinary(data);\n } else {\n if (process?.versions?.bun) {\n this.#dataChannel.sendMessageBinary(Buffer.from(data as ArrayBuffer));\n } else {\n this.#dataChannel.sendMessageBinary(new Uint8Array(data as ArrayBuffer));\n }\n }\n } catch (error) {\n //If error contains \"DataChannel is closed\" throw InvalidStateError\n if (error instanceof Error && error?.message?.includes('DataChannel is closed')) {\n // @ts-expect-error i-hate-ts\n if (this.#readyState !== 'closed') {\n this.#readyState = 'closed';\n this.dispatchEvent(new Event('close'));\n }\n if (process.env.DATACHANNEL_SEND_DEBUG === 'true') {\n console.error(\n new exceptions.InvalidStateError(\n \"Failed to execute 'send' on 'RTCDataChannel': RTCDataChannel is not 'open'\",\n ),\n );\n }\n } else {\n // Otherwise re-throw the error\n if (process.env.DATACHANNEL_SEND_DEBUG === 'true') {\n console.error(error);\n }\n }\n }\n }\n\n close(): void {\n if (this.#readyState === 'closing' || this.#readyState === 'closed') return;\n\n this.#closeRequested = true;\n this.#readyState = 'closing';\n\n setImmediate(() => {\n this.#dataChannel.close();\n });\n }\n\n _forceCloseAbruptly(): void {\n if (this.#readyState === 'closing' || this.#readyState === 'closed') return;\n this.#readyState = 'closed';\n }\n}\n"],"names":["exceptions.InvalidStateError"],"mappings":"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"}