@livekit/react-native-webrtc
Version:
WebRTC for React Native
190 lines (186 loc) • 7.67 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var base64 = _interopRequireWildcard(require("base64-js"));
var _reactNative = require("react-native");
var _EventEmitter = require("./EventEmitter");
var _MessageEvent = _interopRequireDefault(require("./MessageEvent"));
var _RTCDataChannelEvent = _interopRequireDefault(require("./RTCDataChannelEvent"));
var _eventTargetShim = require("./vendor/event-target-shim");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
const {
WebRTCModule
} = _reactNative.NativeModules;
class RTCDataChannel extends _eventTargetShim.EventTarget {
// we only support 'arraybuffer'
constructor(info) {
super();
_defineProperty(this, "_peerConnectionId", void 0);
_defineProperty(this, "_reactTag", void 0);
_defineProperty(this, "_bufferedAmount", void 0);
_defineProperty(this, "_id", void 0);
_defineProperty(this, "_label", void 0);
_defineProperty(this, "_maxPacketLifeTime", void 0);
_defineProperty(this, "_maxRetransmits", void 0);
_defineProperty(this, "_negotiated", void 0);
_defineProperty(this, "_ordered", void 0);
_defineProperty(this, "_protocol", void 0);
_defineProperty(this, "_readyState", void 0);
_defineProperty(this, "binaryType", 'arraybuffer');
_defineProperty(this, "bufferedAmountLowThreshold", 0);
this._peerConnectionId = info.peerConnectionId;
this._reactTag = info.reactTag;
this._bufferedAmount = 0;
this._label = info.label;
this._id = info.id === -1 ? null : info.id; // null until negotiated.
this._ordered = Boolean(info.ordered);
this._maxPacketLifeTime = info.maxPacketLifeTime;
this._maxRetransmits = info.maxRetransmits;
this._protocol = info.protocol || '';
this._negotiated = Boolean(info.negotiated);
this._readyState = info.readyState;
this._registerEvents();
}
get onbufferedamountlow() {
return (0, _eventTargetShim.getEventAttributeValue)(this, 'bufferedamountlow');
}
set onbufferedamountlow(value) {
(0, _eventTargetShim.setEventAttributeValue)(this, 'bufferedamountlow', value);
}
get onclose() {
return (0, _eventTargetShim.getEventAttributeValue)(this, 'close');
}
set onclose(value) {
(0, _eventTargetShim.setEventAttributeValue)(this, 'close', value);
}
get onclosing() {
return (0, _eventTargetShim.getEventAttributeValue)(this, 'closing');
}
set onclosing(value) {
(0, _eventTargetShim.setEventAttributeValue)(this, 'closing', value);
}
get onerror() {
return (0, _eventTargetShim.getEventAttributeValue)(this, 'error');
}
set onerror(value) {
(0, _eventTargetShim.setEventAttributeValue)(this, 'error', value);
}
get onmessage() {
return (0, _eventTargetShim.getEventAttributeValue)(this, 'message');
}
set onmessage(value) {
(0, _eventTargetShim.setEventAttributeValue)(this, 'message', value);
}
get onopen() {
return (0, _eventTargetShim.getEventAttributeValue)(this, 'open');
}
set onopen(value) {
(0, _eventTargetShim.setEventAttributeValue)(this, 'open', value);
}
get bufferedAmount() {
return this._bufferedAmount;
}
get label() {
return this._label;
}
get id() {
return this._id;
}
get ordered() {
return this._ordered;
}
get maxPacketLifeTime() {
return this._maxPacketLifeTime;
}
get maxRetransmits() {
return this._maxRetransmits;
}
get protocol() {
return this._protocol;
}
get negotiated() {
return this._negotiated;
}
get readyState() {
return this._readyState;
}
send(data) {
if (typeof data === 'string') {
WebRTCModule.dataChannelSend(this._peerConnectionId, this._reactTag, data, 'text');
return;
}
// Safely convert the buffer object to an Uint8Array for base64-encoding
if (ArrayBuffer.isView(data)) {
data = new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
} else if (data instanceof ArrayBuffer) {
data = new Uint8Array(data);
} else {
throw new TypeError('Data must be either string, ArrayBuffer, or ArrayBufferView');
}
const base64data = base64.fromByteArray(data);
WebRTCModule.dataChannelSend(this._peerConnectionId, this._reactTag, base64data, 'binary');
}
close() {
if (this._readyState === 'closing' || this._readyState === 'closed') {
return;
}
WebRTCModule.dataChannelClose(this._peerConnectionId, this._reactTag);
}
_registerEvents() {
(0, _EventEmitter.addListener)(this, 'dataChannelStateChanged', ev => {
if (ev.reactTag !== this._reactTag) {
return;
}
this._readyState = ev.state;
if (this._id === null && ev.id !== -1) {
this._id = ev.id;
}
if (this._readyState === 'open') {
this.dispatchEvent(new _RTCDataChannelEvent.default('open', {
channel: this
}));
} else if (this._readyState === 'closing') {
this.dispatchEvent(new _RTCDataChannelEvent.default('closing', {
channel: this
}));
} else if (this._readyState === 'closed') {
this.dispatchEvent(new _RTCDataChannelEvent.default('close', {
channel: this
}));
// This DataChannel is done, clean up event handlers.
(0, _EventEmitter.removeListener)(this);
WebRTCModule.dataChannelDispose(this._peerConnectionId, this._reactTag);
}
});
(0, _EventEmitter.addListener)(this, 'dataChannelReceiveMessage', ev => {
if (ev.reactTag !== this._reactTag) {
return;
}
let data = ev.data;
if (ev.type === 'binary') {
data = base64.toByteArray(ev.data).buffer;
}
this.dispatchEvent(new _MessageEvent.default('message', {
data
}));
});
(0, _EventEmitter.addListener)(this, 'dataChannelDidChangeBufferedAmount', ev => {
if (ev.reactTag !== this._reactTag) {
return;
}
this._bufferedAmount = ev.bufferedAmount;
if (this._bufferedAmount < this.bufferedAmountLowThreshold) {
this.dispatchEvent(new _RTCDataChannelEvent.default('bufferedamountlow', {
channel: this
}));
}
});
}
}
exports.default = RTCDataChannel;
//# sourceMappingURL=RTCDataChannel.js.map