node-datachannel
Version:
WebRTC For Node.js and Electron. libdatachannel node bindings.
186 lines (183 loc) • 6.96 kB
JavaScript
import { InvalidStateError } from './Exception.mjs';
var __defProp = Object.defineProperty;
var __typeError = (msg) => {
throw TypeError(msg);
};
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
var _dataChannel, _readyState, _bufferedAmountLowThreshold, _binaryType, _maxPacketLifeTime, _maxRetransmits, _negotiated, _ordered, _closeRequested;
class RTCDataChannel extends EventTarget {
constructor(dataChannel, opts = {}) {
super();
__privateAdd(this, _dataChannel);
__privateAdd(this, _readyState);
__privateAdd(this, _bufferedAmountLowThreshold);
__privateAdd(this, _binaryType);
__privateAdd(this, _maxPacketLifeTime);
__privateAdd(this, _maxRetransmits);
__privateAdd(this, _negotiated);
__privateAdd(this, _ordered);
__privateAdd(this, _closeRequested, false);
// events
__publicField(this, "onbufferedamountlow");
__publicField(this, "onclose");
__publicField(this, "onclosing");
__publicField(this, "onerror");
__publicField(this, "onmessage");
__publicField(this, "onopen");
__privateSet(this, _dataChannel, dataChannel);
__privateSet(this, _binaryType, "blob");
__privateSet(this, _readyState, __privateGet(this, _dataChannel).isOpen() ? "open" : "connecting");
__privateSet(this, _bufferedAmountLowThreshold, 0);
__privateSet(this, _maxPacketLifeTime, opts.maxPacketLifeTime || null);
__privateSet(this, _maxRetransmits, opts.maxRetransmits || null);
__privateSet(this, _negotiated, opts.negotiated || false);
__privateSet(this, _ordered, opts.ordered || true);
__privateGet(this, _dataChannel).onOpen(() => {
__privateSet(this, _readyState, "open");
this.dispatchEvent(new Event("open", {}));
});
__privateGet(this, _dataChannel).onClosed(() => {
if (!__privateGet(this, _closeRequested)) {
__privateSet(this, _readyState, "closing");
this.dispatchEvent(new Event("closing"));
}
setImmediate(() => {
__privateSet(this, _readyState, "closed");
this.dispatchEvent(new Event("close"));
});
});
__privateGet(this, _dataChannel).onError((msg) => {
this.dispatchEvent(
new globalThis.RTCErrorEvent("error", {
error: new RTCError(
{
errorDetail: "data-channel-failure"
},
msg
)
})
);
});
__privateGet(this, _dataChannel).onBufferedAmountLow(() => {
this.dispatchEvent(new Event("bufferedamountlow"));
});
__privateGet(this, _dataChannel).onMessage((data) => {
if (ArrayBuffer.isView(data)) {
if (this.binaryType == "arraybuffer")
data = data.buffer;
else
data = Buffer.from(data.buffer);
}
this.dispatchEvent(new MessageEvent("message", { data }));
});
this.addEventListener("message", (e) => {
if (this.onmessage) this.onmessage(e);
});
this.addEventListener("bufferedamountlow", (e) => {
if (this.onbufferedamountlow) this.onbufferedamountlow(e);
});
this.addEventListener("error", (e) => {
if (this.onerror) this.onerror(e);
});
this.addEventListener("close", (e) => {
if (this.onclose) this.onclose(e);
});
this.addEventListener("closing", (e) => {
if (this.onclosing) this.onclosing(e);
});
this.addEventListener("open", (e) => {
if (this.onopen) this.onopen(e);
});
}
set binaryType(type) {
if (type !== "blob" && type !== "arraybuffer") {
throw new DOMException(
"Failed to set the 'binaryType' property on 'RTCDataChannel': Unknown binary type : " + type,
"TypeMismatchError"
);
}
__privateSet(this, _binaryType, type);
}
get binaryType() {
return __privateGet(this, _binaryType);
}
get bufferedAmount() {
return __privateGet(this, _dataChannel).bufferedAmount();
}
get bufferedAmountLowThreshold() {
return __privateGet(this, _bufferedAmountLowThreshold);
}
set bufferedAmountLowThreshold(value) {
const number = Number(value) || 0;
__privateSet(this, _bufferedAmountLowThreshold, number);
__privateGet(this, _dataChannel).setBufferedAmountLowThreshold(number);
}
get id() {
return __privateGet(this, _dataChannel).getId();
}
get label() {
return __privateGet(this, _dataChannel).getLabel();
}
get maxPacketLifeTime() {
return __privateGet(this, _maxPacketLifeTime);
}
get maxRetransmits() {
return __privateGet(this, _maxRetransmits);
}
get negotiated() {
return __privateGet(this, _negotiated);
}
get ordered() {
return __privateGet(this, _ordered);
}
get protocol() {
return __privateGet(this, _dataChannel).getProtocol();
}
get readyState() {
return __privateGet(this, _readyState);
}
send(data) {
if (__privateGet(this, _readyState) !== "open") {
throw new InvalidStateError(
"Failed to execute 'send' on 'RTCDataChannel': RTCDataChannel.readyState is not 'open'"
);
}
if (typeof data === "string") {
__privateGet(this, _dataChannel).sendMessage(data);
} else if (data instanceof Blob) {
data.arrayBuffer().then((ab) => {
if (process?.versions?.bun) {
__privateGet(this, _dataChannel).sendMessageBinary(Buffer.from(ab));
} else {
__privateGet(this, _dataChannel).sendMessageBinary(new Uint8Array(ab));
}
});
} else {
if (process?.versions?.bun) {
__privateGet(this, _dataChannel).sendMessageBinary(Buffer.from(data));
} else {
__privateGet(this, _dataChannel).sendMessageBinary(new Uint8Array(data));
}
}
}
close() {
__privateSet(this, _closeRequested, true);
__privateGet(this, _dataChannel).close();
}
}
_dataChannel = new WeakMap();
_readyState = new WeakMap();
_bufferedAmountLowThreshold = new WeakMap();
_binaryType = new WeakMap();
_maxPacketLifeTime = new WeakMap();
_maxRetransmits = new WeakMap();
_negotiated = new WeakMap();
_ordered = new WeakMap();
_closeRequested = new WeakMap();
export { RTCDataChannel as default };
//# sourceMappingURL=RTCDataChannel.mjs.map