@appsurify-testmap/rrweb-plugin-canvas-webrtc-record 2.1.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Readme.md +74 -0
- package/dist/index.d.cts +50 -0
- package/dist/index.d.ts +50 -0
- package/dist/rrweb-plugin-canvas-webrtc-record.cjs +1154 -0
- package/dist/rrweb-plugin-canvas-webrtc-record.cjs.map +1 -0
- package/dist/rrweb-plugin-canvas-webrtc-record.js +1154 -0
- package/dist/rrweb-plugin-canvas-webrtc-record.js.map +1 -0
- package/dist/rrweb-plugin-canvas-webrtc-record.umd.cjs +1184 -0
- package/dist/rrweb-plugin-canvas-webrtc-record.umd.cjs.map +7 -0
- package/dist/rrweb-plugin-canvas-webrtc-record.umd.min.cjs +32 -0
- package/dist/rrweb-plugin-canvas-webrtc-record.umd.min.cjs.map +7 -0
- package/package.json +54 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rrweb-plugin-canvas-webrtc-record.js","sources":["../../../../node_modules/simple-peer-light/index.js","../src/index.ts"],"sourcesContent":["/*! simple-peer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */\nconst MAX_BUFFERED_AMOUNT = 64 * 1024\nconst ICECOMPLETE_TIMEOUT = 5 * 1000\nconst CHANNEL_CLOSING_TIMEOUT = 5 * 1000\n\nfunction randombytes (size) {\n const array = new Uint8Array(size)\n for (let i = 0; i < size; i++) {\n array[i] = (Math.random() * 256) | 0\n }\n return array\n}\n\nfunction getBrowserRTC () {\n if (typeof globalThis === 'undefined') return null\n const wrtc = {\n RTCPeerConnection:\n globalThis.RTCPeerConnection ||\n globalThis.mozRTCPeerConnection ||\n globalThis.webkitRTCPeerConnection,\n RTCSessionDescription:\n globalThis.RTCSessionDescription ||\n globalThis.mozRTCSessionDescription ||\n globalThis.webkitRTCSessionDescription,\n RTCIceCandidate:\n globalThis.RTCIceCandidate ||\n globalThis.mozRTCIceCandidate ||\n globalThis.webkitRTCIceCandidate\n }\n if (!wrtc.RTCPeerConnection) return null\n return wrtc\n}\n\nfunction errCode (err, code) {\n Object.defineProperty(err, 'code', {\n value: code,\n enumerable: true,\n configurable: true\n })\n return err\n}\n\n// HACK: Filter trickle lines when trickle is disabled #354\nfunction filterTrickle (sdp) {\n return sdp.replace(/a=ice-options:trickle\\s\\n/g, '')\n}\n\nfunction warn (message) {\n console.warn(message)\n}\n\n/**\n * WebRTC peer connection.\n * @param {Object} opts\n */\nclass Peer {\n constructor (opts = {}) {\n this._map = new Map() // for event emitter\n\n this._id = randombytes(4).toString('hex').slice(0, 7)\n this._doDebug = opts.debug\n this._debug('new peer %o', opts)\n\n this.channelName = opts.initiator\n ? opts.channelName || randombytes(20).toString('hex')\n : null\n\n this.initiator = opts.initiator || false\n this.channelConfig = opts.channelConfig || Peer.channelConfig\n this.channelNegotiated = this.channelConfig.negotiated\n this.config = Object.assign({}, Peer.config, opts.config)\n this.offerOptions = opts.offerOptions || {}\n this.answerOptions = opts.answerOptions || {}\n this.sdpTransform = opts.sdpTransform || (sdp => sdp)\n this.streams = opts.streams || (opts.stream ? [opts.stream] : []) // support old \"stream\" option\n this.trickle = opts.trickle !== undefined ? opts.trickle : true\n this.allowHalfTrickle =\n opts.allowHalfTrickle !== undefined ? opts.allowHalfTrickle : false\n this.iceCompleteTimeout = opts.iceCompleteTimeout || ICECOMPLETE_TIMEOUT\n\n this.destroyed = false\n this.destroying = false\n this._connected = false\n\n this.remoteAddress = undefined\n this.remoteFamily = undefined\n this.remotePort = undefined\n this.localAddress = undefined\n this.localFamily = undefined\n this.localPort = undefined\n\n this._wrtc =\n opts.wrtc && typeof opts.wrtc === 'object' ? opts.wrtc : getBrowserRTC()\n\n if (!this._wrtc) {\n if (typeof window === 'undefined') {\n throw errCode(\n new Error(\n 'No WebRTC support: Specify `opts.wrtc` option in this environment'\n ),\n 'ERR_WEBRTC_SUPPORT'\n )\n } else {\n throw errCode(\n new Error('No WebRTC support: Not a supported browser'),\n 'ERR_WEBRTC_SUPPORT'\n )\n }\n }\n\n this._pcReady = false\n this._channelReady = false\n this._iceComplete = false // ice candidate trickle done (got null candidate)\n this._iceCompleteTimer = null // send an offer/answer anyway after some timeout\n this._channel = null\n this._pendingCandidates = []\n\n this._isNegotiating = false // is this peer waiting for negotiation to complete?\n this._firstNegotiation = true\n this._batchedNegotiation = false // batch synchronous negotiations\n this._queuedNegotiation = false // is there a queued negotiation request?\n this._sendersAwaitingStable = []\n this._senderMap = new Map()\n this._closingInterval = null\n\n this._remoteTracks = []\n this._remoteStreams = []\n\n this._chunk = null\n this._cb = null\n this._interval = null\n\n try {\n this._pc = new this._wrtc.RTCPeerConnection(this.config)\n } catch (err) {\n this.destroy(errCode(err, 'ERR_PC_CONSTRUCTOR'))\n return\n }\n\n // We prefer feature detection whenever possible, but sometimes that's not\n // possible for certain implementations.\n this._isReactNativeWebrtc = typeof this._pc._peerConnectionId === 'number'\n\n this._pc.oniceconnectionstatechange = () => {\n this._onIceStateChange()\n }\n this._pc.onicegatheringstatechange = () => {\n this._onIceStateChange()\n }\n this._pc.onconnectionstatechange = () => {\n this._onConnectionStateChange()\n }\n this._pc.onsignalingstatechange = () => {\n this._onSignalingStateChange()\n }\n this._pc.onicecandidate = event => {\n this._onIceCandidate(event)\n }\n\n // HACK: Fix for odd Firefox behavior, see: https://github.com/feross/simple-peer/pull/783\n if (typeof this._pc.peerIdentity === 'object') {\n this._pc.peerIdentity.catch(err => {\n this.destroy(errCode(err, 'ERR_PC_PEER_IDENTITY'))\n })\n }\n\n // Other spec events, unused by this implementation:\n // - onconnectionstatechange\n // - onicecandidateerror\n // - onfingerprintfailure\n // - onnegotiationneeded\n\n if (this.initiator || this.channelNegotiated) {\n this._setupData({\n channel: this._pc.createDataChannel(\n this.channelName,\n this.channelConfig\n )\n })\n } else {\n this._pc.ondatachannel = event => {\n this._setupData(event)\n }\n }\n\n if (this.streams) {\n this.streams.forEach(stream => {\n this.addStream(stream)\n })\n }\n this._pc.ontrack = event => {\n this._onTrack(event)\n }\n\n this._debug('initial negotiation')\n this._needsNegotiation()\n }\n\n get bufferSize () {\n return (this._channel && this._channel.bufferedAmount) || 0\n }\n\n // HACK: it's possible channel.readyState is \"closing\" before peer.destroy() fires\n // https://bugs.chromium.org/p/chromium/issues/detail?id=882743\n get connected () {\n return this._connected && this._channel.readyState === 'open'\n }\n\n address () {\n return {\n port: this.localPort,\n family: this.localFamily,\n address: this.localAddress\n }\n }\n\n signal (data) {\n if (this.destroying) return\n if (this.destroyed) throw errCode(new Error('cannot signal after peer is destroyed'), 'ERR_DESTROYED')\n if (typeof data === 'string') {\n try {\n data = JSON.parse(data)\n } catch (err) {\n data = {}\n }\n }\n this._debug('signal()')\n\n if (data.renegotiate && this.initiator) {\n this._debug('got request to renegotiate')\n this._needsNegotiation()\n }\n if (data.transceiverRequest && this.initiator) {\n this._debug('got request for transceiver')\n this.addTransceiver(\n data.transceiverRequest.kind,\n data.transceiverRequest.init\n )\n }\n if (data.candidate) {\n if (this._pc.remoteDescription && this._pc.remoteDescription.type) {\n this._addIceCandidate(data.candidate)\n } else {\n this._pendingCandidates.push(data.candidate)\n }\n }\n if (data.sdp) {\n this._pc\n .setRemoteDescription(new this._wrtc.RTCSessionDescription(data))\n .then(() => {\n if (this.destroyed) return\n\n this._pendingCandidates.forEach(candidate => {\n this._addIceCandidate(candidate)\n })\n this._pendingCandidates = []\n\n if (this._pc.remoteDescription.type === 'offer') this._createAnswer()\n })\n .catch(err => {\n this.destroy(errCode(err, 'ERR_SET_REMOTE_DESCRIPTION'))\n })\n }\n if (\n !data.sdp &&\n !data.candidate &&\n !data.renegotiate &&\n !data.transceiverRequest\n ) {\n this.destroy(\n errCode(\n new Error('signal() called with invalid signal data'),\n 'ERR_SIGNALING'\n )\n )\n }\n }\n\n _addIceCandidate (candidate) {\n const iceCandidateObj = new this._wrtc.RTCIceCandidate(candidate)\n this._pc.addIceCandidate(iceCandidateObj).catch(err => {\n if (\n !iceCandidateObj.address ||\n iceCandidateObj.address.endsWith('.local')\n ) {\n warn('Ignoring unsupported ICE candidate.')\n } else {\n this.destroy(errCode(err, 'ERR_ADD_ICE_CANDIDATE'))\n }\n })\n }\n\n /**\n * Send text/binary data to the remote peer.\n * @param {ArrayBufferView|ArrayBuffer|string|Blob} chunk\n */\n send (chunk) {\n if (this.destroying) return\n if (this.destroyed) throw errCode(new Error('cannot send after peer is destroyed'), 'ERR_DESTROYED')\n this._channel.send(chunk)\n }\n\n /**\n * Add a Transceiver to the connection.\n * @param {String} kind\n * @param {Object} init\n */\n addTransceiver (kind, init) {\n if (this.destroying) return\n if (this.destroyed) throw errCode(new Error('cannot addTransceiver after peer is destroyed'), 'ERR_DESTROYED')\n this._debug('addTransceiver()')\n\n if (this.initiator) {\n try {\n this._pc.addTransceiver(kind, init)\n this._needsNegotiation()\n } catch (err) {\n this.destroy(errCode(err, 'ERR_ADD_TRANSCEIVER'))\n }\n } else {\n this.emit('signal', {\n // request initiator to renegotiate\n type: 'transceiverRequest',\n transceiverRequest: { kind, init }\n })\n }\n }\n\n /**\n * Add a MediaStream to the connection.\n * @param {MediaStream} stream\n */\n addStream (stream) {\n if (this.destroying) return\n if (this.destroyed) throw errCode(new Error('cannot addStream after peer is destroyed'), 'ERR_DESTROYED')\n this._debug('addStream()')\n\n stream.getTracks().forEach(track => {\n this.addTrack(track, stream)\n })\n }\n\n /**\n * Add a MediaStreamTrack to the connection.\n * @param {MediaStreamTrack} track\n * @param {MediaStream} stream\n */\n addTrack (track, stream) {\n if (this.destroying) return\n if (this.destroyed) throw errCode(new Error('cannot addTrack after peer is destroyed'), 'ERR_DESTROYED')\n this._debug('addTrack()')\n\n const submap = this._senderMap.get(track) || new Map() // nested Maps map [track, stream] to sender\n let sender = submap.get(stream)\n if (!sender) {\n sender = this._pc.addTrack(track, stream)\n submap.set(stream, sender)\n this._senderMap.set(track, submap)\n this._needsNegotiation()\n } else if (sender.removed) {\n throw errCode(\n new Error(\n 'Track has been removed. You should enable/disable tracks that you want to re-add.'\n ),\n 'ERR_SENDER_REMOVED'\n )\n } else {\n throw errCode(\n new Error('Track has already been added to that stream.'),\n 'ERR_SENDER_ALREADY_ADDED'\n )\n }\n }\n\n /**\n * Replace a MediaStreamTrack by another in the connection.\n * @param {MediaStreamTrack} oldTrack\n * @param {MediaStreamTrack} newTrack\n * @param {MediaStream} stream\n */\n replaceTrack (oldTrack, newTrack, stream) {\n if (this.destroying) return\n if (this.destroyed) throw errCode(new Error('cannot replaceTrack after peer is destroyed'), 'ERR_DESTROYED')\n this._debug('replaceTrack()')\n\n const submap = this._senderMap.get(oldTrack)\n const sender = submap ? submap.get(stream) : null\n if (!sender) {\n throw errCode(\n new Error('Cannot replace track that was never added.'),\n 'ERR_TRACK_NOT_ADDED'\n )\n }\n if (newTrack) this._senderMap.set(newTrack, submap)\n\n if (sender.replaceTrack != null) {\n sender.replaceTrack(newTrack)\n } else {\n this.destroy(\n errCode(\n new Error('replaceTrack is not supported in this browser'),\n 'ERR_UNSUPPORTED_REPLACETRACK'\n )\n )\n }\n }\n\n /**\n * Remove a MediaStreamTrack from the connection.\n * @param {MediaStreamTrack} track\n * @param {MediaStream} stream\n */\n removeTrack (track, stream) {\n if (this.destroying) return\n if (this.destroyed) throw errCode(new Error('cannot removeTrack after peer is destroyed'), 'ERR_DESTROYED')\n this._debug('removeSender()')\n\n const submap = this._senderMap.get(track)\n const sender = submap ? submap.get(stream) : null\n if (!sender) {\n throw errCode(\n new Error('Cannot remove track that was never added.'),\n 'ERR_TRACK_NOT_ADDED'\n )\n }\n try {\n sender.removed = true\n this._pc.removeTrack(sender)\n } catch (err) {\n if (err.name === 'NS_ERROR_UNEXPECTED') {\n this._sendersAwaitingStable.push(sender) // HACK: Firefox must wait until (signalingState === stable) https://bugzilla.mozilla.org/show_bug.cgi?id=1133874\n } else {\n this.destroy(errCode(err, 'ERR_REMOVE_TRACK'))\n }\n }\n this._needsNegotiation()\n }\n\n /**\n * Remove a MediaStream from the connection.\n * @param {MediaStream} stream\n */\n removeStream (stream) {\n if (this.destroying) return\n if (this.destroyed) throw errCode(new Error('cannot removeStream after peer is destroyed'), 'ERR_DESTROYED')\n this._debug('removeSenders()')\n\n stream.getTracks().forEach(track => {\n this.removeTrack(track, stream)\n })\n }\n\n _needsNegotiation () {\n this._debug('_needsNegotiation')\n if (this._batchedNegotiation) return // batch synchronous renegotiations\n this._batchedNegotiation = true\n queueMicrotask(() => {\n this._batchedNegotiation = false\n if (this.initiator || !this._firstNegotiation) {\n this._debug('starting batched negotiation')\n this.negotiate()\n } else {\n this._debug('non-initiator initial negotiation request discarded')\n }\n this._firstNegotiation = false\n })\n }\n\n negotiate () {\n if (this.destroying) return\n if (this.destroyed) throw errCode(new Error('cannot negotiate after peer is destroyed'), 'ERR_DESTROYED')\n\n if (this.initiator) {\n if (this._isNegotiating) {\n this._queuedNegotiation = true\n this._debug('already negotiating, queueing')\n } else {\n this._debug('start negotiation')\n setTimeout(() => {\n // HACK: Chrome crashes if we immediately call createOffer\n this._createOffer()\n }, 0)\n }\n } else {\n if (this._isNegotiating) {\n this._queuedNegotiation = true\n this._debug('already negotiating, queueing')\n } else {\n this._debug('requesting negotiation from initiator')\n this.emit('signal', {\n // request initiator to renegotiate\n type: 'renegotiate',\n renegotiate: true\n })\n }\n }\n this._isNegotiating = true\n }\n\n destroy (err) {\n if (this.destroyed || this.destroying) return\n this.destroying = true\n\n this._debug('destroying (error: %s)', err && (err.message || err))\n\n queueMicrotask(() => {\n // allow events concurrent with the call to _destroy() to fire (see #692)\n this.destroyed = true\n this.destroying = false\n\n this._debug('destroy (error: %s)', err && (err.message || err))\n\n this._connected = false\n this._pcReady = false\n this._channelReady = false\n this._remoteTracks = null\n this._remoteStreams = null\n this._senderMap = null\n\n clearInterval(this._closingInterval)\n this._closingInterval = null\n\n clearInterval(this._interval)\n this._interval = null\n this._chunk = null\n this._cb = null\n\n if (this._channel) {\n try {\n this._channel.close()\n } catch (err) {}\n\n // allow events concurrent with destruction to be handled\n this._channel.onmessage = null\n this._channel.onopen = null\n this._channel.onclose = null\n this._channel.onerror = null\n }\n if (this._pc) {\n try {\n this._pc.close()\n } catch (err) {}\n\n // allow events concurrent with destruction to be handled\n this._pc.oniceconnectionstatechange = null\n this._pc.onicegatheringstatechange = null\n this._pc.onsignalingstatechange = null\n this._pc.onicecandidate = null\n this._pc.ontrack = null\n this._pc.ondatachannel = null\n }\n this._pc = null\n this._channel = null\n\n if (err) this.emit('error', err)\n this.emit('close')\n })\n }\n\n _setupData (event) {\n if (!event.channel) {\n // In some situations `pc.createDataChannel()` returns `undefined` (in wrtc),\n // which is invalid behavior. Handle it gracefully.\n // See: https://github.com/feross/simple-peer/issues/163\n return this.destroy(\n errCode(\n new Error('Data channel event is missing `channel` property'),\n 'ERR_DATA_CHANNEL'\n )\n )\n }\n\n this._channel = event.channel\n this._channel.binaryType = 'arraybuffer'\n\n if (typeof this._channel.bufferedAmountLowThreshold === 'number') {\n this._channel.bufferedAmountLowThreshold = MAX_BUFFERED_AMOUNT\n }\n\n this.channelName = this._channel.label\n\n this._channel.onmessage = event => {\n this._onChannelMessage(event)\n }\n this._channel.onbufferedamountlow = () => {\n this._onChannelBufferedAmountLow()\n }\n this._channel.onopen = () => {\n this._onChannelOpen()\n }\n this._channel.onclose = () => {\n this._onChannelClose()\n }\n this._channel.onerror = err => {\n this.destroy(errCode(err, 'ERR_DATA_CHANNEL'))\n }\n\n // HACK: Chrome will sometimes get stuck in readyState \"closing\", let's check for this condition\n // https://bugs.chromium.org/p/chromium/issues/detail?id=882743\n let isClosing = false\n this._closingInterval = setInterval(() => {\n // No \"onclosing\" event\n if (this._channel && this._channel.readyState === 'closing') {\n if (isClosing) this._onChannelClose() // closing timed out: equivalent to onclose firing\n isClosing = true\n } else {\n isClosing = false\n }\n }, CHANNEL_CLOSING_TIMEOUT)\n }\n\n _startIceCompleteTimeout () {\n if (this.destroyed) return\n if (this._iceCompleteTimer) return\n this._debug('started iceComplete timeout')\n this._iceCompleteTimer = setTimeout(() => {\n if (!this._iceComplete) {\n this._iceComplete = true\n this._debug('iceComplete timeout completed')\n this.emit('iceTimeout')\n this.emit('_iceComplete')\n }\n }, this.iceCompleteTimeout)\n }\n\n _createOffer () {\n if (this.destroyed) return\n\n this._pc\n .createOffer(this.offerOptions)\n .then(offer => {\n if (this.destroyed) return\n if (!this.trickle && !this.allowHalfTrickle) { offer.sdp = filterTrickle(offer.sdp) }\n offer.sdp = this.sdpTransform(offer.sdp)\n\n const sendOffer = () => {\n if (this.destroyed) return\n const signal = this._pc.localDescription || offer\n this._debug('signal')\n this.emit('signal', {\n type: signal.type,\n sdp: signal.sdp\n })\n }\n\n const onSuccess = () => {\n this._debug('createOffer success')\n if (this.destroyed) return\n if (this.trickle || this._iceComplete) sendOffer()\n else this.once('_iceComplete', sendOffer) // wait for candidates\n }\n\n const onError = err => {\n this.destroy(errCode(err, 'ERR_SET_LOCAL_DESCRIPTION'))\n }\n\n this._pc.setLocalDescription(offer).then(onSuccess).catch(onError)\n })\n .catch(err => {\n this.destroy(errCode(err, 'ERR_CREATE_OFFER'))\n })\n }\n\n _requestMissingTransceivers () {\n if (this._pc.getTransceivers) {\n this._pc.getTransceivers().forEach(transceiver => {\n if (\n !transceiver.mid &&\n transceiver.sender.track &&\n !transceiver.requested\n ) {\n transceiver.requested = true // HACK: Safari returns negotiated transceivers with a null mid\n this.addTransceiver(transceiver.sender.track.kind)\n }\n })\n }\n }\n\n _createAnswer () {\n if (this.destroyed) return\n\n this._pc\n .createAnswer(this.answerOptions)\n .then(answer => {\n if (this.destroyed) return\n if (!this.trickle && !this.allowHalfTrickle) { answer.sdp = filterTrickle(answer.sdp) }\n answer.sdp = this.sdpTransform(answer.sdp)\n\n const sendAnswer = () => {\n if (this.destroyed) return\n const signal = this._pc.localDescription || answer\n this._debug('signal')\n this.emit('signal', {\n type: signal.type,\n sdp: signal.sdp\n })\n if (!this.initiator) this._requestMissingTransceivers()\n }\n\n const onSuccess = () => {\n if (this.destroyed) return\n if (this.trickle || this._iceComplete) sendAnswer()\n else this.once('_iceComplete', sendAnswer)\n }\n\n const onError = err => {\n this.destroy(errCode(err, 'ERR_SET_LOCAL_DESCRIPTION'))\n }\n\n this._pc.setLocalDescription(answer).then(onSuccess).catch(onError)\n })\n .catch(err => {\n this.destroy(errCode(err, 'ERR_CREATE_ANSWER'))\n })\n }\n\n _onConnectionStateChange () {\n if (this.destroyed) return\n if (this._pc.connectionState === 'failed') {\n this.destroy(\n errCode(new Error('Connection failed.'), 'ERR_CONNECTION_FAILURE')\n )\n }\n }\n\n _onIceStateChange () {\n if (this.destroyed) return\n const iceConnectionState = this._pc.iceConnectionState\n const iceGatheringState = this._pc.iceGatheringState\n\n this._debug(\n 'iceStateChange (connection: %s) (gathering: %s)',\n iceConnectionState,\n iceGatheringState\n )\n this.emit('iceStateChange', iceConnectionState, iceGatheringState)\n\n if (\n iceConnectionState === 'connected' ||\n iceConnectionState === 'completed'\n ) {\n this._pcReady = true\n this._maybeReady()\n }\n if (iceConnectionState === 'failed') {\n this.destroy(\n errCode(\n new Error('Ice connection failed.'),\n 'ERR_ICE_CONNECTION_FAILURE'\n )\n )\n }\n if (iceConnectionState === 'closed') {\n this.destroy(\n errCode(\n new Error('Ice connection closed.'),\n 'ERR_ICE_CONNECTION_CLOSED'\n )\n )\n }\n }\n\n getStats (cb) {\n // statreports can come with a value array instead of properties\n const flattenValues = report => {\n if (Object.prototype.toString.call(report.values) === '[object Array]') {\n report.values.forEach(value => {\n Object.assign(report, value)\n })\n }\n return report\n }\n\n // Promise-based getStats() (standard)\n if (this._pc.getStats.length === 0 || this._isReactNativeWebrtc) {\n this._pc.getStats().then(\n res => {\n const reports = []\n res.forEach(report => {\n reports.push(flattenValues(report))\n })\n cb(null, reports)\n },\n err => cb(err)\n )\n\n // Single-parameter callback-based getStats() (non-standard)\n } else if (this._pc.getStats.length > 0) {\n this._pc.getStats(\n res => {\n // If we destroy connection in `connect` callback this code might happen to run when actual connection is already closed\n if (this.destroyed) return\n\n const reports = []\n res.result().forEach(result => {\n const report = {}\n result.names().forEach(name => {\n report[name] = result.stat(name)\n })\n report.id = result.id\n report.type = result.type\n report.timestamp = result.timestamp\n reports.push(flattenValues(report))\n })\n cb(null, reports)\n },\n err => cb(err)\n )\n\n // Unknown browser, skip getStats() since it's anyone's guess which style of\n // getStats() they implement.\n } else {\n cb(null, [])\n }\n }\n\n _maybeReady () {\n this._debug(\n 'maybeReady pc %s channel %s',\n this._pcReady,\n this._channelReady\n )\n if (\n this._connected ||\n this._connecting ||\n !this._pcReady ||\n !this._channelReady\n ) { return }\n\n this._connecting = true\n\n // HACK: We can't rely on order here, for details see https://github.com/js-platform/node-webrtc/issues/339\n const findCandidatePair = () => {\n if (this.destroyed) return\n\n this.getStats((err, items) => {\n if (this.destroyed) return\n\n // Treat getStats error as non-fatal. It's not essential.\n if (err) items = []\n\n const remoteCandidates = {}\n const localCandidates = {}\n const candidatePairs = {}\n let foundSelectedCandidatePair = false\n\n items.forEach(item => {\n // TODO: Once all browsers support the hyphenated stats report types, remove\n // the non-hypenated ones\n if (\n item.type === 'remotecandidate' ||\n item.type === 'remote-candidate'\n ) {\n remoteCandidates[item.id] = item\n }\n if (\n item.type === 'localcandidate' ||\n item.type === 'local-candidate'\n ) {\n localCandidates[item.id] = item\n }\n if (item.type === 'candidatepair' || item.type === 'candidate-pair') {\n candidatePairs[item.id] = item\n }\n })\n\n const setSelectedCandidatePair = selectedCandidatePair => {\n foundSelectedCandidatePair = true\n\n let local = localCandidates[selectedCandidatePair.localCandidateId]\n\n if (local && (local.ip || local.address)) {\n // Spec\n this.localAddress = local.ip || local.address\n this.localPort = Number(local.port)\n } else if (local && local.ipAddress) {\n // Firefox\n this.localAddress = local.ipAddress\n this.localPort = Number(local.portNumber)\n } else if (\n typeof selectedCandidatePair.googLocalAddress === 'string'\n ) {\n // TODO: remove this once Chrome 58 is released\n local = selectedCandidatePair.googLocalAddress.split(':')\n this.localAddress = local[0]\n this.localPort = Number(local[1])\n }\n if (this.localAddress) {\n this.localFamily = this.localAddress.includes(':')\n ? 'IPv6'\n : 'IPv4'\n }\n\n let remote =\n remoteCandidates[selectedCandidatePair.remoteCandidateId]\n\n if (remote && (remote.ip || remote.address)) {\n // Spec\n this.remoteAddress = remote.ip || remote.address\n this.remotePort = Number(remote.port)\n } else if (remote && remote.ipAddress) {\n // Firefox\n this.remoteAddress = remote.ipAddress\n this.remotePort = Number(remote.portNumber)\n } else if (\n typeof selectedCandidatePair.googRemoteAddress === 'string'\n ) {\n // TODO: remove this once Chrome 58 is released\n remote = selectedCandidatePair.googRemoteAddress.split(':')\n this.remoteAddress = remote[0]\n this.remotePort = Number(remote[1])\n }\n if (this.remoteAddress) {\n this.remoteFamily = this.remoteAddress.includes(':')\n ? 'IPv6'\n : 'IPv4'\n }\n\n this._debug(\n 'connect local: %s:%s remote: %s:%s',\n this.localAddress,\n this.localPort,\n this.remoteAddress,\n this.remotePort\n )\n }\n\n items.forEach(item => {\n // Spec-compliant\n if (item.type === 'transport' && item.selectedCandidatePairId) {\n setSelectedCandidatePair(\n candidatePairs[item.selectedCandidatePairId]\n )\n }\n\n // Old implementations\n if (\n (item.type === 'googCandidatePair' &&\n item.googActiveConnection === 'true') ||\n ((item.type === 'candidatepair' ||\n item.type === 'candidate-pair') &&\n item.selected)\n ) {\n setSelectedCandidatePair(item)\n }\n })\n\n // Ignore candidate pair selection in browsers like Safari 11 that do not have any local or remote candidates\n // But wait until at least 1 candidate pair is available\n if (\n !foundSelectedCandidatePair &&\n (!Object.keys(candidatePairs).length ||\n Object.keys(localCandidates).length)\n ) {\n setTimeout(findCandidatePair, 100)\n return\n } else {\n this._connecting = false\n this._connected = true\n }\n\n if (this._chunk) {\n try {\n this.send(this._chunk)\n } catch (err) {\n return this.destroy(errCode(err, 'ERR_DATA_CHANNEL'))\n }\n this._chunk = null\n this._debug('sent chunk from \"write before connect\"')\n\n const cb = this._cb\n this._cb = null\n cb(null)\n }\n\n // If `bufferedAmountLowThreshold` and 'onbufferedamountlow' are unsupported,\n // fallback to using setInterval to implement backpressure.\n if (typeof this._channel.bufferedAmountLowThreshold !== 'number') {\n this._interval = setInterval(() => this._onInterval(), 150)\n if (this._interval.unref) this._interval.unref()\n }\n\n this._debug('connect')\n this.emit('connect')\n })\n }\n findCandidatePair()\n }\n\n _onInterval () {\n if (\n !this._cb ||\n !this._channel ||\n this._channel.bufferedAmount > MAX_BUFFERED_AMOUNT\n ) {\n return\n }\n this._onChannelBufferedAmountLow()\n }\n\n _onSignalingStateChange () {\n if (this.destroyed) return\n\n if (this._pc.signalingState === 'stable') {\n this._isNegotiating = false\n\n // HACK: Firefox doesn't yet support removing tracks when signalingState !== 'stable'\n this._debug('flushing sender queue', this._sendersAwaitingStable)\n this._sendersAwaitingStable.forEach(sender => {\n this._pc.removeTrack(sender)\n this._queuedNegotiation = true\n })\n this._sendersAwaitingStable = []\n\n if (this._queuedNegotiation) {\n this._debug('flushing negotiation queue')\n this._queuedNegotiation = false\n this._needsNegotiation() // negotiate again\n } else {\n this._debug('negotiated')\n this.emit('negotiated')\n }\n }\n\n this._debug('signalingStateChange %s', this._pc.signalingState)\n this.emit('signalingStateChange', this._pc.signalingState)\n }\n\n _onIceCandidate (event) {\n if (this.destroyed) return\n if (event.candidate && this.trickle) {\n this.emit('signal', {\n type: 'candidate',\n candidate: {\n candidate: event.candidate.candidate,\n sdpMLineIndex: event.candidate.sdpMLineIndex,\n sdpMid: event.candidate.sdpMid\n }\n })\n } else if (!event.candidate && !this._iceComplete) {\n this._iceComplete = true\n this.emit('_iceComplete')\n }\n // as soon as we've received one valid candidate start timeout\n if (event.candidate) {\n this._startIceCompleteTimeout()\n }\n }\n\n _onChannelMessage (event) {\n if (this.destroyed) return\n let data = event.data\n if (data instanceof ArrayBuffer) data = new Uint8Array(data)\n this.emit('data', data)\n }\n\n _onChannelBufferedAmountLow () {\n if (this.destroyed || !this._cb) return\n this._debug(\n 'ending backpressure: bufferedAmount %d',\n this._channel.bufferedAmount\n )\n const cb = this._cb\n this._cb = null\n cb(null)\n }\n\n _onChannelOpen () {\n if (this._connected || this.destroyed) return\n this._debug('on channel open')\n this._channelReady = true\n this._maybeReady()\n }\n\n _onChannelClose () {\n if (this.destroyed) return\n this._debug('on channel close')\n this.destroy()\n }\n\n _onTrack (event) {\n if (this.destroyed) return\n\n event.streams.forEach(eventStream => {\n this._debug('on track')\n this.emit('track', event.track, eventStream)\n\n this._remoteTracks.push({\n track: event.track,\n stream: eventStream\n })\n\n if (\n this._remoteStreams.some(remoteStream => {\n return remoteStream.id === eventStream.id\n })\n ) { return } // Only fire one 'stream' event, even though there may be multiple tracks per stream\n\n this._remoteStreams.push(eventStream)\n queueMicrotask(() => {\n this._debug('on stream')\n this.emit('stream', eventStream) // ensure all tracks have been added\n })\n })\n }\n\n _debug (...args) {\n if (!this._doDebug) return\n args[0] = '[' + this._id + '] ' + args[0]\n console.log(...args)\n }\n\n // event emitter\n on (key, listener) {\n const map = this._map\n if (!map.has(key)) map.set(key, new Set())\n map.get(key).add(listener)\n }\n\n off (key, listener) {\n const map = this._map\n const listeners = map.get(key)\n if (!listeners) return\n listeners.delete(listener)\n if (listeners.size === 0) map.delete(key)\n }\n\n once (key, listener) {\n const listener_ = (...args) => {\n this.off(key, listener_)\n listener(...args)\n }\n this.on(key, listener_)\n }\n\n emit (key, ...args) {\n const map = this._map\n if (!map.has(key)) return\n for (const listener of map.get(key)) {\n try {\n listener(...args)\n } catch (err) {\n console.error(err)\n }\n }\n }\n}\n\nPeer.WEBRTC_SUPPORT = !!getBrowserRTC()\n\n/**\n * Expose peer and data channel config for overriding all Peer\n * instances. Otherwise, just set opts.config or opts.channelConfig\n * when constructing a Peer.\n */\nPeer.config = {\n iceServers: [\n {\n urls: [\n 'stun:stun.l.google.com:19302',\n 'stun:global.stun.twilio.com:3478'\n ]\n }\n ],\n sdpSemantics: 'unified-plan'\n}\n\nPeer.channelConfig = {}\n\n// module.exports = Peer\nexport default Peer\n","import SimplePeer from 'simple-peer-light';\nimport type {\n RecordPlugin,\n ICrossOriginIframeMirror,\n IMirror,\n} from '@appsurify-testmap/rrweb-types';\nimport type { WebRTCDataChannel } from './types';\n\nexport const PLUGIN_NAME = 'rrweb/canvas-webrtc@1';\n\nexport type CrossOriginIframeMessageEventContent = {\n type: 'rrweb-canvas-webrtc';\n data:\n | {\n type: 'signal';\n signal: RTCSessionDescriptionInit;\n }\n | {\n type: 'who-has-canvas';\n rootId: number;\n id: number;\n }\n | {\n type: 'i-have-canvas';\n rootId: number;\n };\n};\n\nexport class RRWebPluginCanvasWebRTCRecord {\n private peer: SimplePeer.Instance | null = null;\n private mirror: IMirror<Node> | undefined;\n private crossOriginIframeMirror: ICrossOriginIframeMirror | undefined;\n private streamMap: Map<number, MediaStream> = new Map();\n private incomingStreams = new Set<MediaStream>();\n private outgoingStreams = new Set<MediaStream>();\n private streamNodeMap = new Map<string, number>();\n private canvasWindowMap = new Map<number, WindowProxy>();\n private windowPeerMap = new WeakMap<WindowProxy, SimplePeer.Instance>();\n private peerWindowMap = new WeakMap<SimplePeer.Instance, WindowProxy>();\n private signalSendCallback: (msg: RTCSessionDescriptionInit) => void;\n\n constructor({\n signalSendCallback,\n peer,\n }: {\n signalSendCallback: RRWebPluginCanvasWebRTCRecord['signalSendCallback'];\n peer?: SimplePeer.Instance;\n }) {\n this.signalSendCallback = signalSendCallback;\n window.addEventListener('message', (event: MessageEvent) =>\n this.windowPostMessageHandler(event),\n );\n if (peer) this.peer = peer;\n }\n public initPlugin(): RecordPlugin {\n return {\n name: PLUGIN_NAME,\n getMirror: ({ nodeMirror, crossOriginIframeMirror }) => {\n this.mirror = nodeMirror;\n this.crossOriginIframeMirror = crossOriginIframeMirror;\n },\n options: {},\n };\n }\n\n public signalReceive(signal: RTCSessionDescriptionInit) {\n if (!this.peer) this.setupPeer();\n this.peer?.signal(signal);\n }\n\n public signalReceiveFromCrossOriginIframe(\n signal: RTCSessionDescriptionInit,\n source: WindowProxy,\n ) {\n const peer = this.setupPeer(source);\n peer.signal(signal);\n }\n\n private startStream(id: number, stream: MediaStream) {\n if (!this.peer) this.setupPeer();\n\n const data: WebRTCDataChannel = {\n nodeId: id,\n streamId: stream.id,\n };\n this.peer?.send(JSON.stringify(data));\n if (!this.outgoingStreams.has(stream)) this.peer?.addStream(stream);\n this.outgoingStreams.add(stream);\n }\n\n public setupPeer(source?: WindowProxy): SimplePeer.Instance {\n let peer: SimplePeer.Instance;\n\n if (!source) {\n if (this.peer) return this.peer;\n\n peer = this.peer = new SimplePeer({\n initiator: true,\n // trickle: false, // only create one WebRTC offer per session\n });\n } else {\n const peerFromMap = this.windowPeerMap.get(source);\n\n if (peerFromMap) return peerFromMap;\n\n peer = new SimplePeer({\n initiator: false,\n // trickle: false, // only create one WebRTC offer per session\n });\n this.windowPeerMap.set(source, peer);\n this.peerWindowMap.set(peer, source);\n }\n\n const resetPeer = (source?: WindowProxy) => {\n if (!source) return (this.peer = null);\n\n this.windowPeerMap.delete(source);\n this.peerWindowMap.delete(peer);\n };\n\n peer.on('error', (err: Error) => {\n resetPeer(source);\n console.log('error', err);\n });\n\n peer.on('close', () => {\n resetPeer(source);\n console.log('closing');\n });\n\n peer.on('signal', (data: RTCSessionDescriptionInit) => {\n if (this.inRootFrame()) {\n if (peer === this.peer) {\n // connected to replayer\n this.signalSendCallback(data);\n } else {\n // connected to cross-origin iframe\n this.peerWindowMap.get(peer)?.postMessage(\n {\n type: 'rrweb-canvas-webrtc',\n data: {\n type: 'signal',\n signal: data,\n },\n } as CrossOriginIframeMessageEventContent,\n '*',\n );\n }\n } else {\n // connected to root frame\n window.top?.postMessage(\n {\n type: 'rrweb-canvas-webrtc',\n data: {\n type: 'signal',\n signal: data,\n },\n } as CrossOriginIframeMessageEventContent,\n '*',\n );\n }\n });\n\n peer.on('connect', () => {\n // connected to cross-origin iframe, no need to do anything\n if (this.inRootFrame() && peer !== this.peer) return;\n\n // cross origin frame connected to root frame\n // or root frame connected to replayer\n // send all streams to peer\n for (const [id, stream] of this.streamMap) {\n this.startStream(id, stream);\n }\n });\n\n if (!this.inRootFrame()) return peer;\n\n peer.on('data', (data: SimplePeer.SimplePeerData) => {\n try {\n const json = JSON.parse(data as string) as WebRTCDataChannel;\n this.streamNodeMap.set(json.streamId, json.nodeId);\n } catch (error) {\n console.error('Could not parse data', error);\n }\n this.flushStreams();\n });\n\n peer.on('stream', (stream: MediaStream) => {\n this.incomingStreams.add(stream);\n this.flushStreams();\n });\n\n return peer;\n }\n\n public setupStream(id: number, rootId?: number): boolean | MediaStream {\n if (id === -1 || !this.mirror) return false;\n let stream: MediaStream | undefined = this.streamMap.get(rootId || id);\n if (stream) return stream;\n\n const el = this.mirror.getNode(id) as HTMLCanvasElement | null;\n\n if (!el || !('captureStream' in el))\n // we don't have it, lets check our iframes\n return this.setupStreamInCrossOriginIframe(id, rootId || id);\n\n if (!this.inRootFrame()) {\n window.top?.postMessage(\n {\n type: 'rrweb-canvas-webrtc',\n data: {\n type: 'i-have-canvas',\n rootId: rootId || id,\n },\n } as CrossOriginIframeMessageEventContent,\n '*',\n );\n }\n\n stream = el.captureStream();\n this.streamMap.set(rootId || id, stream);\n this.setupPeer();\n\n return stream;\n }\n\n private flushStreams() {\n this.incomingStreams.forEach((stream) => {\n const nodeId = this.streamNodeMap.get(stream.id);\n if (!nodeId) return;\n // got remote video stream, now let's send it to the replayer\n this.startStream(nodeId, stream);\n });\n }\n\n private inRootFrame(): boolean {\n return Boolean(window.top && window.top === window);\n }\n\n public setupStreamInCrossOriginIframe(id: number, rootId: number): boolean {\n let found = false;\n\n document.querySelectorAll('iframe').forEach((iframe) => {\n if (found) return;\n if (!this.crossOriginIframeMirror) return;\n\n const remoteId = this.crossOriginIframeMirror.getRemoteId(iframe, id);\n if (remoteId === -1) return;\n\n found = true;\n iframe.contentWindow?.postMessage(\n {\n type: 'rrweb-canvas-webrtc',\n data: {\n type: 'who-has-canvas',\n id: remoteId,\n rootId,\n },\n } as CrossOriginIframeMessageEventContent,\n '*',\n );\n });\n return found;\n }\n\n private isCrossOriginIframeMessageEventContent(\n event: MessageEvent<unknown>,\n ): event is MessageEvent<CrossOriginIframeMessageEventContent> {\n return Boolean(\n event.data &&\n typeof event.data === 'object' &&\n 'type' in event.data &&\n 'data' in event.data &&\n (event.data as CrossOriginIframeMessageEventContent).type ===\n 'rrweb-canvas-webrtc' &&\n (event.data as CrossOriginIframeMessageEventContent).data,\n );\n }\n\n /**\n * All messages being sent to the (root or sub) frame are received through `windowPostMessageHandler`.\n * @param event - The message event\n */\n private windowPostMessageHandler(\n event: MessageEvent<CrossOriginIframeMessageEventContent> | MessageEvent,\n ) {\n if (!this.isCrossOriginIframeMessageEventContent(event)) return;\n\n const { type } = event.data.data;\n if (type === 'who-has-canvas') {\n const { id, rootId } = event.data.data;\n this.setupStream(id, rootId);\n } else if (type === 'signal') {\n const { signal } = event.data.data;\n const { source } = event;\n if (!source || !('self' in source)) return;\n if (this.inRootFrame()) {\n this.signalReceiveFromCrossOriginIframe(signal, source);\n } else {\n this.signalReceive(signal);\n }\n } else if (type === 'i-have-canvas') {\n const { rootId } = event.data.data;\n const { source } = event;\n if (!source || !('self' in source)) return;\n this.canvasWindowMap.set(rootId, source);\n }\n }\n}\n"],"names":["err","event","SimplePeer","source"],"mappings":"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","x_google_ignoreList":[0]}
|