werift 0.22.9 → 0.24.0
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 +46 -0
- package/lib/common/src/transport.d.ts +22 -9
- package/lib/common/src/transport.js +152 -25
- package/lib/common/src/transport.js.map +1 -1
- package/lib/dtls/src/flight/server/flight6.js +12 -2
- package/lib/dtls/src/flight/server/flight6.js.map +1 -1
- package/lib/dtls/src/server.js +6 -1
- package/lib/dtls/src/server.js.map +1 -1
- package/lib/dtls/src/socket.d.ts +1 -0
- package/lib/dtls/src/socket.js +3 -0
- package/lib/dtls/src/socket.js.map +1 -1
- package/lib/ice/src/candidate.d.ts +16 -1
- package/lib/ice/src/candidate.js +99 -15
- package/lib/ice/src/candidate.js.map +1 -1
- package/lib/ice/src/ice.d.ts +2 -0
- package/lib/ice/src/ice.js +171 -41
- package/lib/ice/src/ice.js.map +1 -1
- package/lib/ice/src/iceBase.d.ts +23 -2
- package/lib/ice/src/iceBase.js +63 -1
- package/lib/ice/src/iceBase.js.map +1 -1
- package/lib/ice/src/index.d.ts +2 -0
- package/lib/ice/src/index.js +2 -0
- package/lib/ice/src/index.js.map +1 -1
- package/lib/ice/src/stun/const.d.ts +1 -26
- package/lib/ice/src/stun/const.js +15 -54
- package/lib/ice/src/stun/const.js.map +1 -1
- package/lib/ice/src/stun/message.d.ts +1 -25
- package/lib/ice/src/stun/message.js +15 -149
- package/lib/ice/src/stun/message.js.map +1 -1
- package/lib/ice/src/stun/protocol.d.ts +1 -1
- package/lib/ice/src/stun/protocol.js +2 -2
- package/lib/ice/src/stun/protocol.js.map +1 -1
- package/lib/ice/src/stun/tcpFrame.d.ts +5 -0
- package/lib/ice/src/stun/tcpFrame.js +26 -0
- package/lib/ice/src/stun/tcpFrame.js.map +1 -0
- package/lib/ice/src/stun/tcpProtocol.d.ts +51 -0
- package/lib/ice/src/stun/tcpProtocol.js +326 -0
- package/lib/ice/src/stun/tcpProtocol.js.map +1 -0
- package/lib/ice/src/stun/transaction.d.ts +2 -1
- package/lib/ice/src/stun/transaction.js +9 -3
- package/lib/ice/src/stun/transaction.js.map +1 -1
- package/lib/ice/src/turn/frame.d.ts +1 -0
- package/lib/ice/src/turn/frame.js +18 -0
- package/lib/ice/src/turn/frame.js.map +1 -0
- package/lib/ice/src/turn/protocol.d.ts +9 -7
- package/lib/ice/src/turn/protocol.js +32 -44
- package/lib/ice/src/turn/protocol.js.map +1 -1
- package/lib/ice/src/types/model.d.ts +1 -1
- package/lib/ice/src/types/model.js.map +1 -1
- package/lib/{ice → ice-server}/src/stun/attributes.d.ts +12 -5
- package/lib/{ice → ice-server}/src/stun/attributes.js +60 -19
- package/lib/ice-server/src/stun/attributes.js.map +1 -0
- package/lib/ice-server/src/stun/const.d.ts +28 -0
- package/lib/ice-server/src/stun/const.js +88 -0
- package/lib/ice-server/src/stun/const.js.map +1 -0
- package/lib/ice-server/src/stun/message.d.ts +37 -0
- package/lib/ice-server/src/stun/message.js +190 -0
- package/lib/ice-server/src/stun/message.js.map +1 -0
- package/lib/ice-server/src/turn/auth.d.ts +1 -0
- package/lib/ice-server/src/turn/auth.js +10 -0
- package/lib/ice-server/src/turn/auth.js.map +1 -0
- package/lib/ice-server/src/turn/frame.d.ts +13 -0
- package/lib/ice-server/src/turn/frame.js +69 -0
- package/lib/ice-server/src/turn/frame.js.map +1 -0
- package/lib/index.mjs +3075 -883
- package/lib/nonstandard/index.mjs +1964 -447
- package/lib/rtp/src/extra/container/mp4/container.d.ts +9 -6
- package/lib/rtp/src/extra/container/mp4/container.js +258 -173
- package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
- package/lib/rtp/src/extra/container/mp4/h264.d.ts +1 -0
- package/lib/rtp/src/extra/container/mp4/h264.js +13 -0
- package/lib/rtp/src/extra/container/mp4/h264.js.map +1 -1
- package/lib/rtp/src/extra/processor/mp4.d.ts +11 -7
- package/lib/rtp/src/extra/processor/mp4.js +115 -60
- package/lib/rtp/src/extra/processor/mp4.js.map +1 -1
- package/lib/rtp/src/extra/processor/mp4Callback.d.ts +2 -3
- package/lib/rtp/src/extra/processor/mp4Callback.js +5 -3
- package/lib/rtp/src/extra/processor/mp4Callback.js.map +1 -1
- package/lib/rtp/src/index.d.ts +1 -0
- package/lib/rtp/src/index.js +1 -0
- package/lib/rtp/src/index.js.map +1 -1
- package/lib/rtp/src/srtp/cipher/ctr.d.ts +3 -3
- package/lib/rtp/src/srtp/cipher/ctr.js +25 -14
- package/lib/rtp/src/srtp/cipher/ctr.js.map +1 -1
- package/lib/rtp/src/srtp/cipher/gcm.d.ts +3 -3
- package/lib/rtp/src/srtp/cipher/gcm.js +57 -20
- package/lib/rtp/src/srtp/cipher/gcm.js.map +1 -1
- package/lib/rtp/src/srtp/cipher/index.d.ts +1 -1
- package/lib/rtp/src/srtp/cipher/index.js +1 -1
- package/lib/rtp/src/srtp/cipher/index.js.map +1 -1
- package/lib/rtp/src/srtp/context/srtp.d.ts +2 -1
- package/lib/rtp/src/srtp/context/srtp.js +22 -5
- package/lib/rtp/src/srtp/context/srtp.js.map +1 -1
- package/lib/rtp/src/srtp/error.d.ts +3 -0
- package/lib/rtp/src/srtp/error.js +11 -0
- package/lib/rtp/src/srtp/error.js.map +1 -0
- package/lib/rtp/src/srtp/packet.d.ts +5 -0
- package/lib/rtp/src/srtp/packet.js +48 -0
- package/lib/rtp/src/srtp/packet.js.map +1 -0
- package/lib/webrtc/src/dataChannel.d.ts +4 -2
- package/lib/webrtc/src/dataChannel.js +14 -4
- package/lib/webrtc/src/dataChannel.js.map +1 -1
- package/lib/webrtc/src/errors.d.ts +3 -0
- package/lib/webrtc/src/errors.js +11 -0
- package/lib/webrtc/src/errors.js.map +1 -0
- package/lib/webrtc/src/helper.d.ts +5 -1
- package/lib/webrtc/src/helper.js +33 -1
- package/lib/webrtc/src/helper.js.map +1 -1
- package/lib/webrtc/src/media/receiver/statistics.d.ts +4 -1
- package/lib/webrtc/src/media/receiver/statistics.js +22 -0
- package/lib/webrtc/src/media/receiver/statistics.js.map +1 -1
- package/lib/webrtc/src/media/rtpReceiver.d.ts +15 -2
- package/lib/webrtc/src/media/rtpReceiver.js +135 -20
- package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
- package/lib/webrtc/src/media/rtpSender.d.ts +32 -7
- package/lib/webrtc/src/media/rtpSender.js +177 -28
- package/lib/webrtc/src/media/rtpSender.js.map +1 -1
- package/lib/webrtc/src/media/rtpTransceiver.d.ts +13 -4
- package/lib/webrtc/src/media/rtpTransceiver.js +26 -5
- package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
- package/lib/webrtc/src/media/stats.d.ts +15 -1
- package/lib/webrtc/src/media/stats.js +55 -1
- package/lib/webrtc/src/media/stats.js.map +1 -1
- package/lib/webrtc/src/media/track.d.ts +2 -1
- package/lib/webrtc/src/media/track.js +7 -1
- package/lib/webrtc/src/media/track.js.map +1 -1
- package/lib/webrtc/src/nonstandard/dummyMedia.d.ts +19 -0
- package/lib/webrtc/src/nonstandard/dummyMedia.js +157 -0
- package/lib/webrtc/src/nonstandard/dummyMedia.js.map +1 -0
- package/lib/webrtc/src/nonstandard/navigator.d.ts +18 -8
- package/lib/webrtc/src/nonstandard/navigator.js +96 -32
- package/lib/webrtc/src/nonstandard/navigator.js.map +1 -1
- package/lib/webrtc/src/nonstandard/userMedia/packetizer.d.ts +16 -0
- package/lib/webrtc/src/nonstandard/userMedia/packetizer.js +360 -0
- package/lib/webrtc/src/nonstandard/userMedia/packetizer.js.map +1 -0
- package/lib/webrtc/src/nonstandard/userMedia.d.ts +71 -31
- package/lib/webrtc/src/nonstandard/userMedia.js +454 -108
- package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -1
- package/lib/webrtc/src/peerConnection.d.ts +185 -49
- package/lib/webrtc/src/peerConnection.js +477 -107
- package/lib/webrtc/src/peerConnection.js.map +1 -1
- package/lib/webrtc/src/sctpManager.d.ts +2 -2
- package/lib/webrtc/src/sctpManager.js +30 -9
- package/lib/webrtc/src/sctpManager.js.map +1 -1
- package/lib/webrtc/src/sdp.d.ts +10 -7
- package/lib/webrtc/src/sdp.js +39 -9
- package/lib/webrtc/src/sdp.js.map +1 -1
- package/lib/webrtc/src/sdpManager.d.ts +5 -4
- package/lib/webrtc/src/sdpManager.js +53 -31
- package/lib/webrtc/src/sdpManager.js.map +1 -1
- package/lib/webrtc/src/secureTransportManager.d.ts +13 -4
- package/lib/webrtc/src/secureTransportManager.js +101 -23
- package/lib/webrtc/src/secureTransportManager.js.map +1 -1
- package/lib/webrtc/src/transceiverManager.d.ts +5 -4
- package/lib/webrtc/src/transceiverManager.js +64 -64
- package/lib/webrtc/src/transceiverManager.js.map +1 -1
- package/lib/webrtc/src/transport/dtls.d.ts +16 -4
- package/lib/webrtc/src/transport/dtls.js +208 -35
- package/lib/webrtc/src/transport/dtls.js.map +1 -1
- package/lib/webrtc/src/transport/ice.d.ts +21 -3
- package/lib/webrtc/src/transport/ice.js +159 -30
- package/lib/webrtc/src/transport/ice.js.map +1 -1
- package/lib/webrtc/src/transport/sctp.d.ts +10 -3
- package/lib/webrtc/src/transport/sctp.js +44 -13
- package/lib/webrtc/src/transport/sctp.js.map +1 -1
- package/lib/webrtc/src/utils.d.ts +14 -4
- package/lib/webrtc/src/utils.js +138 -16
- package/lib/webrtc/src/utils.js.map +1 -1
- package/package.json +7 -4
- package/lib/ice/src/stun/attributes.js.map +0 -1
- package/lib/rtp/src/extra/container/mp4/mp4box.d.ts +0 -5
- package/lib/rtp/src/extra/container/mp4/mp4box.js +0 -32
- package/lib/rtp/src/extra/container/mp4/mp4box.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sctp.js","sourceRoot":"","sources":["../../../../src/transport/sctp.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"crypto\";\nimport { jspack } from \"@shinyoshiaki/jspack\";\n\nimport { Event, debug } from \"../imports/common\";\n\nimport { SCTP, SCTP_STATE, type Transport } from \"../../../sctp/src\";\nimport {\n DATA_CHANNEL_ACK,\n DATA_CHANNEL_OPEN,\n DATA_CHANNEL_RELIABLE,\n WEBRTC_BINARY,\n WEBRTC_BINARY_EMPTY,\n WEBRTC_DCEP,\n WEBRTC_STRING,\n WEBRTC_STRING_EMPTY,\n} from \"../const\";\nimport {\n type DCState,\n RTCDataChannel,\n RTCDataChannelParameters,\n} from \"../dataChannel\";\nimport type { RTCDtlsTransport } from \"./dtls\";\n\nconst log = debug(\"werift:packages/webrtc/src/transport/sctp.ts\");\n\nexport class RTCSctpTransport {\n dtlsTransport!: RTCDtlsTransport;\n sctp!: SCTP;\n\n readonly onDataChannel = new Event<[RTCDataChannel]>();\n readonly id = randomUUID().toString();\n\n mid?: string;\n mLineIndex?: number;\n bundled = false;\n dataChannels: { [key: number]: RTCDataChannel } = {};\n\n private dataChannelQueue: [RTCDataChannel, number, Buffer][] = [];\n private dataChannelId?: number;\n private eventDisposer: (() => void)[] = [];\n\n constructor(public port = 5000) {}\n\n setDtlsTransport(dtlsTransport: RTCDtlsTransport) {\n if (this.dtlsTransport && this.dtlsTransport.id === dtlsTransport.id) {\n return;\n }\n\n this.eventDisposer.forEach((dispose) => dispose());\n\n this.dtlsTransport = dtlsTransport;\n this.sctp = new SCTP(new BridgeDtls(this.dtlsTransport), this.port);\n\n this.eventDisposer = [\n ...[\n this.sctp.onReceive.subscribe(this.datachannelReceive),\n this.sctp.onReconfigStreams.subscribe((ids: number[]) => {\n ids.forEach((id) => {\n const dc = this.dataChannels[id];\n if (!dc) return;\n // todo fix\n dc.setReadyState(\"closing\");\n dc.setReadyState(\"closed\");\n delete this.dataChannels[id];\n });\n }),\n this.sctp.stateChanged.connected.subscribe(() => {\n Object.values(this.dataChannels).forEach((channel) => {\n if (channel.negotiated && channel.readyState !== \"open\") {\n channel.setReadyState(\"open\");\n }\n });\n this.dataChannelFlush();\n }),\n this.sctp.stateChanged.closed.subscribe(() => {\n Object.values(this.dataChannels).forEach((dc) => {\n dc.setReadyState(\"closed\");\n });\n this.dataChannels = {};\n }),\n this.dtlsTransport.onStateChange.subscribe((state) => {\n if (state === \"closed\") {\n this.sctp.setState(SCTP_STATE.CLOSED);\n }\n }),\n ].map((e) => e.unSubscribe),\n () => (this.sctp.onSackReceived = async () => {}),\n ];\n\n this.sctp.onSackReceived = async () => {\n await this.dataChannelFlush();\n };\n }\n\n private get isServer() {\n return this.dtlsTransport.iceTransport.role !== \"controlling\";\n }\n\n channelByLabel(label: string) {\n return Object.values(this.dataChannels).find((d) => d.label === label);\n }\n\n private datachannelReceive = async (\n streamId: number,\n ppId: number,\n data: Buffer,\n ) => {\n if (ppId === WEBRTC_DCEP && data.length > 0) {\n log(\"DCEP\", streamId, ppId, data);\n switch (data[0]) {\n case DATA_CHANNEL_OPEN:\n {\n if (data.length < 12) {\n log(\"DATA_CHANNEL_OPEN data.length not enough\");\n return;\n }\n\n if (!Object.keys(this.dataChannels).includes(streamId.toString())) {\n const [\n ,\n channelType,\n ,\n reliability,\n labelLength,\n protocolLength,\n ] = jspack.Unpack(\"!BBHLHH\", data);\n\n let pos = 12;\n const label = data.slice(pos, pos + labelLength).toString(\"utf8\");\n pos += labelLength;\n const protocol = data\n .slice(pos, pos + protocolLength)\n .toString(\"utf8\");\n\n log(\"DATA_CHANNEL_OPEN\", {\n channelType,\n reliability,\n streamId,\n label,\n protocol,\n });\n\n const maxRetransmits =\n (channelType & 0x03) === 1 ? reliability : undefined;\n const maxPacketLifeTime =\n (channelType & 0x03) === 2 ? reliability : undefined;\n\n // # register channel\n const parameters = new RTCDataChannelParameters({\n label,\n ordered: (channelType & 0x80) === 0,\n maxPacketLifeTime,\n maxRetransmits,\n protocol,\n id: streamId,\n });\n const channel = new RTCDataChannel(this, parameters, false);\n channel.isCreatedByRemote = true;\n this.dataChannels[streamId] = channel;\n\n this.onDataChannel.execute(channel);\n channel.setReadyState(\"open\");\n } else {\n log(\"datachannel already opened\", \"retransmit ack\");\n }\n\n const channel = this.dataChannels[streamId];\n this.dataChannelQueue.push([\n channel,\n WEBRTC_DCEP,\n Buffer.from(jspack.Pack(\"!B\", [DATA_CHANNEL_ACK])),\n ]);\n await this.dataChannelFlush();\n }\n break;\n case DATA_CHANNEL_ACK:\n {\n log(\"DATA_CHANNEL_ACK\", streamId, ppId);\n const channel = this.dataChannels[streamId];\n if (!channel) {\n throw new Error(\"channel not found\");\n }\n channel.setReadyState(\"open\");\n }\n break;\n }\n } else {\n const channel = this.dataChannels[streamId];\n if (channel) {\n const msg = (() => {\n switch (ppId) {\n case WEBRTC_STRING:\n return data.toString(\"utf8\");\n case WEBRTC_STRING_EMPTY:\n return \"\";\n case WEBRTC_BINARY:\n return data;\n case WEBRTC_BINARY_EMPTY:\n return Buffer.from([]);\n default:\n throw new Error();\n }\n })();\n\n // Update reception statistics\n channel.messagesReceived++;\n channel.bytesReceived += data.length;\n\n channel.onMessage.execute(msg);\n channel.emit(\"message\", { data: msg });\n if (channel.onmessage) {\n channel.onmessage({ data: msg });\n }\n }\n }\n };\n\n dataChannelAddNegotiated(channel: RTCDataChannel) {\n if (channel.id == undefined) {\n throw new Error();\n }\n if (this.dataChannels[channel.id]) {\n throw new Error();\n }\n\n this.dataChannels[channel.id] = channel;\n\n if (this.sctp.associationState === SCTP_STATE.ESTABLISHED) {\n channel.setReadyState(\"open\");\n }\n }\n\n dataChannelOpen(channel: RTCDataChannel) {\n if (channel.id) {\n if (this.dataChannels[channel.id])\n throw new Error(\n `Data channel with ID ${channel.id} already registered`,\n );\n this.dataChannels[channel.id] = channel;\n }\n\n let channelType = DATA_CHANNEL_RELIABLE;\n const priority = 0;\n let reliability = 0;\n\n if (!channel.ordered) {\n channelType = 0x80;\n }\n if (channel.maxRetransmits) {\n channelType = 1;\n reliability = channel.maxRetransmits;\n } else if (channel.maxPacketLifeTime) {\n channelType = 2;\n reliability = channel.maxPacketLifeTime;\n }\n\n // 5.1. DATA_CHANNEL_OPEN Message\n const data = jspack.Pack(\"!BBHLHH\", [\n DATA_CHANNEL_OPEN,\n channelType,\n priority,\n reliability,\n channel.label.length,\n channel.protocol.length,\n ]);\n const send = Buffer.concat([\n Buffer.from(data),\n Buffer.from(channel.label, \"utf8\"),\n Buffer.from(channel.protocol, \"utf8\"),\n ]);\n this.dataChannelQueue.push([channel, WEBRTC_DCEP, send]);\n this.dataChannelFlush();\n }\n\n private async dataChannelFlush() {\n // \"\"\"\n // Try to flush buffered data to the SCTP layer.\n\n // We wait until the association is established, as we need to know\n // whether we are a client or a server to correctly assign an odd/even ID\n // to the data channels.\n // \"\"\"\n\n if (this.sctp.associationState != SCTP_STATE.ESTABLISHED) return;\n\n while (this.dataChannelQueue.length > 0) {\n const [channel, protocol, userData] = this.dataChannelQueue.shift()!;\n\n let streamId = channel.id;\n if (streamId === undefined) {\n streamId = this.dataChannelId!;\n while (Object.keys(this.dataChannels).includes(streamId.toString())) {\n streamId += 2;\n }\n this.dataChannels[streamId] = channel;\n channel.setId(streamId);\n }\n\n if (protocol === WEBRTC_DCEP) {\n await this.sctp.send(streamId, protocol, userData, {\n ordered: true,\n });\n } else {\n const expiry = channel.maxPacketLifeTime\n ? Date.now() + channel.maxPacketLifeTime / 1000\n : undefined;\n\n await this.sctp.send(streamId, protocol, userData, {\n expiry,\n maxRetransmits: channel.maxRetransmits,\n ordered: channel.ordered,\n });\n channel.addBufferedAmount(-userData.length);\n }\n }\n // Resetting the queue to empty array mitigates this.\n this.dataChannelQueue = [];\n }\n\n datachannelSend = (channel: RTCDataChannel, data: Buffer | string) => {\n channel.addBufferedAmount(data.length);\n\n this.dataChannelQueue.push(\n typeof data === \"string\"\n ? [channel, WEBRTC_STRING, Buffer.from(data)]\n : [channel, WEBRTC_BINARY, data],\n );\n\n if (this.sctp.associationState !== SCTP_STATE.ESTABLISHED) {\n log(\"sctp not established\", this.sctp.associationState);\n }\n\n this.dataChannelFlush();\n };\n\n static getCapabilities() {\n return new RTCSctpCapabilities(65536);\n }\n\n setRemotePort(port: number) {\n this.sctp.setRemotePort(port);\n }\n\n async start(remotePort: number) {\n if (this.isServer) {\n this.dataChannelId = 0;\n } else {\n this.dataChannelId = 1;\n }\n this.sctp.isServer = this.isServer;\n\n await this.sctp.start(remotePort);\n }\n\n async stop() {\n this.dtlsTransport.dataReceiver = () => {};\n await this.sctp.stop();\n }\n\n dataChannelClose(channel: RTCDataChannel) {\n if (!([\"closing\", \"closed\"] as DCState[]).includes(channel.readyState)) {\n channel.setReadyState(\"closing\");\n\n if (this.sctp.associationState === SCTP_STATE.ESTABLISHED) {\n // Check if channel.id is already in reconfigQueue to prevent duplicates\n if (!this.sctp.reconfigQueue.includes(channel.id)) {\n this.sctp.reconfigQueue.push(channel.id);\n }\n if (this.sctp.reconfigQueue.length === 1) {\n this.sctp.transmitReconfigRequest();\n }\n } else {\n this.dataChannelQueue = this.dataChannelQueue.filter(\n (queueItem) => queueItem[0].id !== channel.id,\n );\n // Remove any pending reconfiguration requests for this channel\n this.sctp.reconfigQueue = this.sctp.reconfigQueue.filter(\n (streamId) => streamId !== channel.id,\n );\n if (channel.id) {\n delete this.dataChannels[channel.id];\n }\n channel.setReadyState(\"closed\");\n }\n }\n }\n}\n\nexport class RTCSctpCapabilities {\n constructor(public maxMessageSize: number) {}\n}\n\nclass BridgeDtls implements Transport {\n constructor(private dtls: RTCDtlsTransport) {}\n set onData(onData: (buf: Buffer) => void) {\n this.dtls.dataReceiver = onData;\n }\n readonly send = (data: Buffer) => {\n return this.dtls.sendData(data);\n };\n close() {}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sctp.js","sourceRoot":"","sources":["../../../../src/transport/sctp.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"crypto\";\nimport { jspack } from \"@shinyoshiaki/jspack\";\n\nimport { Event, debug } from \"../imports/common\";\n\nimport { SCTP, SCTP_STATE, type Transport } from \"../../../sctp/src\";\nimport {\n DATA_CHANNEL_ACK,\n DATA_CHANNEL_OPEN,\n DATA_CHANNEL_RELIABLE,\n WEBRTC_BINARY,\n WEBRTC_BINARY_EMPTY,\n WEBRTC_DCEP,\n WEBRTC_STRING,\n WEBRTC_STRING_EMPTY,\n} from \"../const\";\nimport {\n type DCState,\n RTCDataChannel,\n RTCDataChannelParameters,\n getDataChannelMessageSize,\n} from \"../dataChannel\";\nimport type { RTCDtlsTransport } from \"./dtls\";\n\nconst log = debug(\"werift:packages/webrtc/src/transport/sctp.ts\");\nexport const DEFAULT_MAX_MESSAGE_SIZE = 65536;\n\nexport class RTCSctpTransport {\n dtlsTransport!: RTCDtlsTransport;\n sctp!: SCTP;\n\n readonly onDataChannel = new Event<[RTCDataChannel]>();\n readonly id = randomUUID().toString();\n\n mid?: string;\n mLineIndex?: number;\n bundled = false;\n dataChannels: { [key: number]: RTCDataChannel } = {};\n remoteMaxMessageSize = DEFAULT_MAX_MESSAGE_SIZE;\n\n private dataChannelQueue: [RTCDataChannel, number, Buffer][] = [];\n private dataChannelId?: number;\n private eventDisposer: (() => void)[] = [];\n\n constructor(\n public port = 5000,\n public maxMessageSize = DEFAULT_MAX_MESSAGE_SIZE,\n ) {}\n\n get transport() {\n return this.dtlsTransport;\n }\n\n setDtlsTransport(dtlsTransport: RTCDtlsTransport) {\n if (this.dtlsTransport && this.dtlsTransport.id === dtlsTransport.id) {\n return;\n }\n\n this.eventDisposer.forEach((dispose) => dispose());\n\n this.dtlsTransport = dtlsTransport;\n this.sctp = new SCTP(new BridgeDtls(this.dtlsTransport), this.port);\n\n this.eventDisposer = [\n ...[\n this.sctp.onReceive.subscribe(this.datachannelReceive),\n this.sctp.onReconfigStreams.subscribe((ids: number[]) => {\n ids.forEach((id) => {\n const dc = this.dataChannels[id];\n if (!dc) return;\n // todo fix\n dc.setReadyState(\"closing\");\n dc.setReadyState(\"closed\");\n delete this.dataChannels[id];\n });\n }),\n this.sctp.stateChanged.connected.subscribe(() => {\n Object.values(this.dataChannels).forEach((channel) => {\n if (channel.negotiated && channel.readyState !== \"open\") {\n channel.setReadyState(\"open\");\n }\n });\n this.dataChannelFlush();\n }),\n this.sctp.stateChanged.closed.subscribe(() => {\n Object.values(this.dataChannels).forEach((dc) => {\n dc.setReadyState(\"closed\");\n });\n this.dataChannels = {};\n }),\n this.dtlsTransport.onStateChange.subscribe((state) => {\n if (state === \"closed\") {\n this.sctp.setState(SCTP_STATE.CLOSED);\n }\n }),\n ].map((e) => e.unSubscribe),\n () => (this.sctp.onSackReceived = async () => {}),\n ];\n\n this.sctp.onSackReceived = async () => {\n await this.dataChannelFlush();\n };\n }\n\n private get isServer() {\n return this.dtlsTransport.iceTransport.role !== \"controlling\";\n }\n\n channelByLabel(label: string) {\n return Object.values(this.dataChannels).find((d) => d.label === label);\n }\n\n private datachannelReceive = async (\n streamId: number,\n ppId: number,\n data: Buffer,\n ) => {\n if (ppId === WEBRTC_DCEP && data.length > 0) {\n log(\"DCEP\", streamId, ppId, data);\n switch (data[0]) {\n case DATA_CHANNEL_OPEN:\n {\n if (data.length < 12) {\n log(\"DATA_CHANNEL_OPEN data.length not enough\");\n return;\n }\n\n if (!Object.keys(this.dataChannels).includes(streamId.toString())) {\n const [\n ,\n channelType,\n ,\n reliability,\n labelLength,\n protocolLength,\n ] = jspack.Unpack(\"!BBHLHH\", data);\n\n let pos = 12;\n const label = data.slice(pos, pos + labelLength).toString(\"utf8\");\n pos += labelLength;\n const protocol = data\n .slice(pos, pos + protocolLength)\n .toString(\"utf8\");\n\n log(\"DATA_CHANNEL_OPEN\", {\n channelType,\n reliability,\n streamId,\n label,\n protocol,\n });\n\n const maxRetransmits =\n (channelType & 0x03) === 1 ? reliability : undefined;\n const maxPacketLifeTime =\n (channelType & 0x03) === 2 ? reliability : undefined;\n\n // # register channel\n const parameters = new RTCDataChannelParameters({\n label,\n ordered: (channelType & 0x80) === 0,\n maxPacketLifeTime,\n maxRetransmits,\n protocol,\n id: streamId,\n });\n const channel = new RTCDataChannel(this, parameters, false);\n channel.isCreatedByRemote = true;\n this.dataChannels[streamId] = channel;\n\n this.onDataChannel.execute(channel);\n channel.setReadyState(\"open\");\n } else {\n log(\"datachannel already opened\", \"retransmit ack\");\n }\n\n const channel = this.dataChannels[streamId];\n this.dataChannelQueue.push([\n channel,\n WEBRTC_DCEP,\n Buffer.from(jspack.Pack(\"!B\", [DATA_CHANNEL_ACK])),\n ]);\n await this.dataChannelFlush();\n }\n break;\n case DATA_CHANNEL_ACK:\n {\n log(\"DATA_CHANNEL_ACK\", streamId, ppId);\n const channel = this.dataChannels[streamId];\n if (!channel) {\n throw new Error(\"channel not found\");\n }\n channel.setReadyState(\"open\");\n }\n break;\n }\n } else {\n const channel = this.dataChannels[streamId];\n if (channel) {\n const msg = (() => {\n switch (ppId) {\n case WEBRTC_STRING:\n return data.toString(\"utf8\");\n case WEBRTC_STRING_EMPTY:\n return \"\";\n case WEBRTC_BINARY:\n return data;\n case WEBRTC_BINARY_EMPTY:\n return Buffer.from([]);\n default:\n throw new Error();\n }\n })();\n\n // Update reception statistics\n channel.messagesReceived++;\n channel.bytesReceived += data.length;\n\n channel.onMessage.execute(msg);\n channel.emit(\"message\", { data: msg });\n if (channel.onmessage) {\n channel.onmessage({ data: msg });\n }\n }\n }\n };\n\n dataChannelAddNegotiated(channel: RTCDataChannel) {\n if (channel.id == undefined) {\n throw new Error();\n }\n if (this.dataChannels[channel.id]) {\n throw new Error();\n }\n\n this.dataChannels[channel.id] = channel;\n\n if (this.sctp.associationState === SCTP_STATE.ESTABLISHED) {\n channel.setReadyState(\"open\");\n }\n }\n\n dataChannelOpen(channel: RTCDataChannel) {\n if (channel.id !== undefined) {\n if (this.dataChannels[channel.id])\n throw new Error(\n `Data channel with ID ${channel.id} already registered`,\n );\n this.dataChannels[channel.id] = channel;\n }\n\n let channelType = DATA_CHANNEL_RELIABLE;\n const priority = 0;\n let reliability = 0;\n\n if (!channel.ordered) {\n channelType = 0x80;\n }\n if (channel.maxRetransmits !== null) {\n channelType = 1;\n reliability = channel.maxRetransmits;\n } else if (channel.maxPacketLifeTime !== null) {\n channelType = 2;\n reliability = channel.maxPacketLifeTime;\n }\n\n // 5.1. DATA_CHANNEL_OPEN Message\n const data = jspack.Pack(\"!BBHLHH\", [\n DATA_CHANNEL_OPEN,\n channelType,\n priority,\n reliability,\n channel.label.length,\n channel.protocol.length,\n ]);\n const send = Buffer.concat([\n Buffer.from(data),\n Buffer.from(channel.label, \"utf8\"),\n Buffer.from(channel.protocol, \"utf8\"),\n ]);\n this.dataChannelQueue.push([channel, WEBRTC_DCEP, send]);\n this.dataChannelFlush();\n }\n\n private async dataChannelFlush() {\n // \"\"\"\n // Try to flush buffered data to the SCTP layer.\n\n // We wait until the association is established, as we need to know\n // whether we are a client or a server to correctly assign an odd/even ID\n // to the data channels.\n // \"\"\"\n\n if (this.sctp.associationState != SCTP_STATE.ESTABLISHED) return;\n\n while (this.dataChannelQueue.length > 0) {\n const [channel, protocol, userData] = this.dataChannelQueue.shift()!;\n\n let streamId = channel.id;\n if (streamId === undefined) {\n streamId = this.dataChannelId!;\n while (Object.keys(this.dataChannels).includes(streamId.toString())) {\n streamId += 2;\n }\n this.dataChannels[streamId] = channel;\n channel.setId(streamId);\n }\n\n if (protocol === WEBRTC_DCEP) {\n await this.sctp.send(streamId, protocol, userData, {\n ordered: true,\n });\n } else {\n const expiry =\n channel.maxPacketLifeTime !== null\n ? Date.now() + channel.maxPacketLifeTime / 1000\n : undefined;\n\n await this.sctp.send(streamId, protocol, userData, {\n expiry,\n maxRetransmits: channel.maxRetransmits ?? undefined,\n ordered: channel.ordered,\n });\n channel.addBufferedAmount(-userData.length);\n }\n }\n // Resetting the queue to empty array mitigates this.\n this.dataChannelQueue = [];\n }\n\n private assertSendableMessageSize(size: number) {\n if (this.remoteMaxMessageSize !== 0 && size > this.remoteMaxMessageSize) {\n throw new Error(\n `max-message-size exceeded: ${size} > ${this.remoteMaxMessageSize}`,\n );\n }\n }\n\n datachannelSend = (channel: RTCDataChannel, data: Buffer | string) => {\n const userData = Buffer.isBuffer(data) ? data : Buffer.from(data);\n const size = getDataChannelMessageSize(data);\n\n this.assertSendableMessageSize(size);\n channel.addBufferedAmount(size);\n\n this.dataChannelQueue.push(\n typeof data === \"string\"\n ? [channel, WEBRTC_STRING, userData]\n : [channel, WEBRTC_BINARY, userData],\n );\n\n if (this.sctp.associationState !== SCTP_STATE.ESTABLISHED) {\n log(\"sctp not established\", this.sctp.associationState);\n }\n\n this.dataChannelFlush();\n\n return size;\n };\n\n getCapabilities() {\n return RTCSctpTransport.getCapabilities(this.maxMessageSize);\n }\n\n static getCapabilities(maxMessageSize = DEFAULT_MAX_MESSAGE_SIZE) {\n return new RTCSctpCapabilities(maxMessageSize);\n }\n\n setRemoteMaxMessageSize(maxMessageSize?: number) {\n this.remoteMaxMessageSize = maxMessageSize ?? DEFAULT_MAX_MESSAGE_SIZE;\n }\n\n setRemotePort(port: number) {\n this.sctp.setRemotePort(port);\n }\n\n async start(remotePort: number) {\n if (this.isServer) {\n this.dataChannelId = 0;\n } else {\n this.dataChannelId = 1;\n }\n this.sctp.isServer = this.isServer;\n\n await this.sctp.start(remotePort);\n }\n\n async stop() {\n this.dtlsTransport.dataReceiver = () => {};\n await this.sctp.stop();\n }\n\n dataChannelClose(channel: RTCDataChannel) {\n if (!([\"closing\", \"closed\"] as DCState[]).includes(channel.readyState)) {\n channel.setReadyState(\"closing\");\n\n if (this.sctp.associationState === SCTP_STATE.ESTABLISHED) {\n // Check if channel.id is already in reconfigQueue to prevent duplicates\n if (!this.sctp.reconfigQueue.includes(channel.id)) {\n this.sctp.reconfigQueue.push(channel.id);\n }\n if (this.sctp.reconfigQueue.length === 1) {\n this.sctp.transmitReconfigRequest();\n }\n } else {\n this.dataChannelQueue = this.dataChannelQueue.filter(\n (queueItem) => queueItem[0].id !== channel.id,\n );\n // Remove any pending reconfiguration requests for this channel\n this.sctp.reconfigQueue = this.sctp.reconfigQueue.filter(\n (streamId) => streamId !== channel.id,\n );\n if (channel.id !== undefined) {\n delete this.dataChannels[channel.id];\n }\n channel.setReadyState(\"closed\");\n }\n }\n }\n}\n\nexport class RTCSctpCapabilities {\n constructor(public maxMessageSize: number) {}\n}\n\nclass BridgeDtls implements Transport {\n constructor(private dtls: RTCDtlsTransport) {}\n set onData(onData: (buf: Buffer) => void) {\n this.dtls.dataReceiver = onData;\n }\n readonly send = (data: Buffer) => {\n return this.dtls.sendData(data);\n };\n close() {}\n}\n"]}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
import { type Address } from "./imports/common";
|
|
1
2
|
import { type MediaDirection } from "./media/rtpTransceiver";
|
|
2
3
|
import { MediaStreamTrack } from "./media/track";
|
|
3
4
|
import type { RTCIceServer } from "./peerConnection";
|
|
4
5
|
export declare function fingerprint(file: Buffer, hashName: string): any;
|
|
6
|
+
export declare function normalizeFingerprintAlgorithm(algorithm: string): string;
|
|
7
|
+
export declare function normalizeFingerprintValue(value: string): string;
|
|
5
8
|
export declare function isDtls(buf: Buffer): boolean;
|
|
6
9
|
export declare function reverseSimulcastDirection(dir: "recv" | "send"): "send" | "recv";
|
|
7
10
|
export declare const andDirection: (a: MediaDirection, b: MediaDirection) => "inactive" | "sendonly" | "recvonly" | "sendrecv";
|
|
@@ -11,6 +14,7 @@ export declare const microTime: () => bigint;
|
|
|
11
14
|
export declare const timestampSeconds: () => number;
|
|
12
15
|
/**https://datatracker.ietf.org/doc/html/rfc3550#section-4 */
|
|
13
16
|
export declare const ntpTime: () => bigint;
|
|
17
|
+
export declare const ntpTimeToEpochMs: (ntp: bigint) => any;
|
|
14
18
|
/**
|
|
15
19
|
* https://datatracker.ietf.org/doc/html/rfc3550#section-4
|
|
16
20
|
* @param ntp
|
|
@@ -18,11 +22,17 @@ export declare const ntpTime: () => bigint;
|
|
|
18
22
|
*/
|
|
19
23
|
export declare const compactNtp: (ntp: bigint) => number;
|
|
20
24
|
export declare function parseIceServers(iceServers: RTCIceServer[]): {
|
|
21
|
-
stunServer
|
|
22
|
-
turnServer
|
|
23
|
-
turnUsername
|
|
24
|
-
turnPassword
|
|
25
|
+
stunServer?: Address;
|
|
26
|
+
turnServer?: Address;
|
|
27
|
+
turnUsername?: string;
|
|
28
|
+
turnPassword?: string;
|
|
29
|
+
turnTransport?: "udp" | "tcp" | "tls";
|
|
25
30
|
};
|
|
31
|
+
export declare function resolveTurnTransport({ configuredTurnTransport, forceTurnTCP, parsedTurnTransport, }: {
|
|
32
|
+
parsedTurnTransport?: "udp" | "tcp" | "tls";
|
|
33
|
+
configuredTurnTransport?: "udp" | "tcp" | "tls";
|
|
34
|
+
forceTurnTCP: boolean;
|
|
35
|
+
}): "tcp" | "tls" | "udp" | undefined;
|
|
26
36
|
/**
|
|
27
37
|
*
|
|
28
38
|
* @param signatureHash
|
package/lib/webrtc/src/utils.js
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.deepMerge = exports.MediaStreamTrackFactory = exports.createSelfSignedCertificate = exports.compactNtp = exports.ntpTime = exports.timestampSeconds = exports.microTime = exports.milliTime = exports.andDirection = void 0;
|
|
3
|
+
exports.deepMerge = exports.MediaStreamTrackFactory = exports.createSelfSignedCertificate = exports.compactNtp = exports.ntpTimeToEpochMs = exports.ntpTime = exports.timestampSeconds = exports.microTime = exports.milliTime = exports.andDirection = void 0;
|
|
4
4
|
exports.fingerprint = fingerprint;
|
|
5
|
+
exports.normalizeFingerprintAlgorithm = normalizeFingerprintAlgorithm;
|
|
6
|
+
exports.normalizeFingerprintValue = normalizeFingerprintValue;
|
|
5
7
|
exports.isDtls = isDtls;
|
|
6
8
|
exports.reverseSimulcastDirection = reverseSimulcastDirection;
|
|
7
9
|
exports.reverseDirection = reverseDirection;
|
|
8
10
|
exports.parseIceServers = parseIceServers;
|
|
11
|
+
exports.resolveTurnTransport = resolveTurnTransport;
|
|
9
12
|
/* eslint-disable prefer-const */
|
|
10
13
|
const crypto_1 = require("crypto");
|
|
11
14
|
const dgram_1 = require("dgram");
|
|
@@ -21,6 +24,24 @@ function fingerprint(file, hashName) {
|
|
|
21
24
|
const hash = (0, crypto_1.createHash)(hashName).update(file).digest("hex");
|
|
22
25
|
return colon(upper(hash));
|
|
23
26
|
}
|
|
27
|
+
const fingerprintHashAlgorithms = {
|
|
28
|
+
sha1: "sha1",
|
|
29
|
+
"sha-1": "sha1",
|
|
30
|
+
sha224: "sha224",
|
|
31
|
+
"sha-224": "sha224",
|
|
32
|
+
sha256: "sha256",
|
|
33
|
+
"sha-256": "sha256",
|
|
34
|
+
sha384: "sha384",
|
|
35
|
+
"sha-384": "sha384",
|
|
36
|
+
sha512: "sha512",
|
|
37
|
+
"sha-512": "sha512",
|
|
38
|
+
};
|
|
39
|
+
function normalizeFingerprintAlgorithm(algorithm) {
|
|
40
|
+
return fingerprintHashAlgorithms[algorithm.trim().toLowerCase()];
|
|
41
|
+
}
|
|
42
|
+
function normalizeFingerprintValue(value) {
|
|
43
|
+
return value.replace(/[^0-9a-f]/gi, "").toLowerCase();
|
|
44
|
+
}
|
|
24
45
|
function isDtls(buf) {
|
|
25
46
|
const firstByte = buf[0];
|
|
26
47
|
return firstByte > 19 && firstByte < 64;
|
|
@@ -56,6 +77,11 @@ const ntpTime = () => {
|
|
|
56
77
|
return buf.readBigUInt64BE();
|
|
57
78
|
};
|
|
58
79
|
exports.ntpTime = ntpTime;
|
|
80
|
+
const ntpTimeToEpochMs = (ntp) => {
|
|
81
|
+
const [seconds, milliseconds] = (0, common_1.bufferReader)((0, common_1.bufferWriter)([8], [ntp]), [4, 4]);
|
|
82
|
+
return seconds * 1000 + milliseconds + Date.UTC(1900, 0, 1);
|
|
83
|
+
};
|
|
84
|
+
exports.ntpTimeToEpochMs = ntpTimeToEpochMs;
|
|
59
85
|
/**
|
|
60
86
|
* https://datatracker.ietf.org/doc/html/rfc3550#section-4
|
|
61
87
|
* @param ntp
|
|
@@ -68,24 +94,120 @@ const compactNtp = (ntp) => {
|
|
|
68
94
|
};
|
|
69
95
|
exports.compactNtp = compactNtp;
|
|
70
96
|
function parseIceServers(iceServers) {
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
97
|
+
const options = {};
|
|
98
|
+
for (const iceServer of iceServers) {
|
|
99
|
+
const urls = Array.isArray(iceServer.urls)
|
|
100
|
+
? iceServer.urls
|
|
101
|
+
: [iceServer.urls];
|
|
102
|
+
for (const url of urls) {
|
|
103
|
+
const parsed = parseIceServerUrl(url);
|
|
104
|
+
if (!parsed) {
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (!options.stunServer && parsed.kind === "stun") {
|
|
108
|
+
options.stunServer = parsed.address;
|
|
109
|
+
}
|
|
110
|
+
if (!options.turnServer && parsed.kind === "turn") {
|
|
111
|
+
options.turnServer = parsed.address;
|
|
112
|
+
options.turnTransport = parsed.transport;
|
|
113
|
+
options.turnUsername = iceServer.username;
|
|
114
|
+
options.turnPassword = iceServer.credential;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
86
118
|
log("iceOptions", options);
|
|
87
119
|
return options;
|
|
88
120
|
}
|
|
121
|
+
function resolveTurnTransport({ configuredTurnTransport, forceTurnTCP, parsedTurnTransport, }) {
|
|
122
|
+
if (parsedTurnTransport) {
|
|
123
|
+
return parsedTurnTransport;
|
|
124
|
+
}
|
|
125
|
+
if (configuredTurnTransport) {
|
|
126
|
+
return configuredTurnTransport;
|
|
127
|
+
}
|
|
128
|
+
if (forceTurnTCP) {
|
|
129
|
+
return "tcp";
|
|
130
|
+
}
|
|
131
|
+
return undefined;
|
|
132
|
+
}
|
|
133
|
+
function parseIceServerUrl(url) {
|
|
134
|
+
const matched = /^(stun|stuns|turn|turns):(.+)$/i.exec(url.trim());
|
|
135
|
+
if (!matched) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const [, rawScheme, rawRest] = matched;
|
|
139
|
+
const scheme = rawScheme.toLowerCase();
|
|
140
|
+
const [authority] = rawRest.split("?", 1);
|
|
141
|
+
const [, query = ""] = rawRest.split("?");
|
|
142
|
+
const address = parseAddress(authority, defaultPort(scheme));
|
|
143
|
+
if (!address) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
if (scheme === "stun" || scheme === "stuns") {
|
|
147
|
+
return { kind: "stun", address };
|
|
148
|
+
}
|
|
149
|
+
const queryParams = new URLSearchParams(query);
|
|
150
|
+
const transportParam = queryParams.get("transport");
|
|
151
|
+
const transport = resolveParsedTurnTransport({
|
|
152
|
+
scheme,
|
|
153
|
+
transportParam,
|
|
154
|
+
});
|
|
155
|
+
if (transport === "invalid") {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
return {
|
|
159
|
+
kind: "turn",
|
|
160
|
+
address,
|
|
161
|
+
transport,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
function resolveParsedTurnTransport({ scheme, transportParam, }) {
|
|
165
|
+
if (transportParam == null) {
|
|
166
|
+
return scheme === "turns" ? "tls" : undefined;
|
|
167
|
+
}
|
|
168
|
+
if (transportParam === "udp") {
|
|
169
|
+
return scheme === "turns" ? "invalid" : "udp";
|
|
170
|
+
}
|
|
171
|
+
if (transportParam === "tcp") {
|
|
172
|
+
return scheme === "turns" ? "tls" : "tcp";
|
|
173
|
+
}
|
|
174
|
+
return "invalid";
|
|
175
|
+
}
|
|
176
|
+
function defaultPort(scheme) {
|
|
177
|
+
if (scheme === "stuns" || scheme === "turns") {
|
|
178
|
+
return 5349;
|
|
179
|
+
}
|
|
180
|
+
return 3478;
|
|
181
|
+
}
|
|
182
|
+
function parseAddress(value, fallbackPort) {
|
|
183
|
+
const authority = value.startsWith("//") ? value.slice(2) : value;
|
|
184
|
+
if (!authority) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
if (authority.startsWith("[")) {
|
|
188
|
+
const closingBracket = authority.indexOf("]");
|
|
189
|
+
if (closingBracket === -1) {
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
const host = authority.slice(1, closingBracket);
|
|
193
|
+
const port = parsePort(authority.slice(closingBracket + 1), fallbackPort);
|
|
194
|
+
return [host, port];
|
|
195
|
+
}
|
|
196
|
+
const firstColon = authority.indexOf(":");
|
|
197
|
+
const lastColon = authority.lastIndexOf(":");
|
|
198
|
+
if (firstColon !== -1 && firstColon === lastColon) {
|
|
199
|
+
return [
|
|
200
|
+
authority.slice(0, firstColon),
|
|
201
|
+
parsePort(authority.slice(firstColon + 1), fallbackPort),
|
|
202
|
+
];
|
|
203
|
+
}
|
|
204
|
+
return [authority, fallbackPort];
|
|
205
|
+
}
|
|
206
|
+
function parsePort(value, fallbackPort) {
|
|
207
|
+
const portString = value.startsWith(":") ? value.slice(1) : value;
|
|
208
|
+
const port = Number.parseInt(portString, 10);
|
|
209
|
+
return Number.isFinite(port) ? port : fallbackPort;
|
|
210
|
+
}
|
|
89
211
|
/**
|
|
90
212
|
*
|
|
91
213
|
* @param signatureHash
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable prefer-const */\nimport { createHash } from \"crypto\";\nimport { createSocket } from \"dgram\";\n\nimport { performance } from \"perf_hooks\";\n\nimport {\n type Address,\n bufferReader,\n bufferWriter,\n debug,\n randomPort,\n} from \"./imports/common\";\nimport { CipherContext } from \"./imports/dtls\";\n\nimport { Directions, type MediaDirection } from \"./media/rtpTransceiver\";\nimport { MediaStreamTrack } from \"./media/track\";\nimport type { RTCIceServer } from \"./peerConnection\";\n\nconst log = debug(\"werift:packages/webrtc/src/utils.ts\");\n\nexport function fingerprint(file: Buffer, hashName: string) {\n const upper = (s: string) => s.toUpperCase();\n const colon = (s: any) => s.match(/(.{2})/g).join(\":\");\n\n const hash = createHash(hashName).update(file).digest(\"hex\");\n\n return colon(upper(hash));\n}\n\nexport function isDtls(buf: Buffer) {\n const firstByte = buf[0];\n return firstByte > 19 && firstByte < 64;\n}\n\nexport function reverseSimulcastDirection(dir: \"recv\" | \"send\") {\n if (dir === \"recv\") return \"send\";\n return \"recv\";\n}\n\nexport const andDirection = (a: MediaDirection, b: MediaDirection) =>\n Directions[Directions.indexOf(a) & Directions.indexOf(b)];\n\nexport function reverseDirection(dir: MediaDirection): MediaDirection {\n if (dir === \"sendonly\") return \"recvonly\";\n if (dir === \"recvonly\") return \"sendonly\";\n return dir;\n}\n\nexport const milliTime = Date.now;\n\nconst startupTimestampInMicroseconds =\n BigInt(Date.now()) * 1000n - process.hrtime.bigint() / 1000n;\n\nexport const microTime = () => {\n return startupTimestampInMicroseconds + process.hrtime.bigint() / 1000n;\n};\n\nexport const timestampSeconds = () => Date.now() / 1000;\n\n/**https://datatracker.ietf.org/doc/html/rfc3550#section-4 */\nexport const ntpTime = () => {\n const now = performance.timeOrigin + performance.now() - Date.UTC(1900, 0, 1);\n\n const seconds = now / 1000;\n const [sec, msec] = seconds.toString().split(\".\").map(Number);\n\n const buf = bufferWriter([4, 4], [sec, msec]);\n\n return buf.readBigUInt64BE();\n};\n\n/**\n * https://datatracker.ietf.org/doc/html/rfc3550#section-4\n * @param ntp\n * @returns 32bit\n */\nexport const compactNtp = (ntp: bigint) => {\n const buf = bufferWriter([8], [ntp]);\n const [, sec, msec] = bufferReader(buf, [2, 2, 2, 2]);\n return bufferWriter([2, 2], [sec, msec]).readUInt32BE();\n};\n\nexport function parseIceServers(iceServers: RTCIceServer[]) {\n const url2Address = (url?: string) => {\n if (!url) return;\n const [address, port] = url.split(\":\");\n return [address, Number.parseInt(port)] as Address;\n };\n\n const stunServer = url2Address(\n iceServers.find(({ urls }) => urls.includes(\"stun:\"))?.urls.slice(5),\n );\n const turnServer = url2Address(\n iceServers.find(({ urls }) => urls.includes(\"turn:\"))?.urls.slice(5),\n );\n const { credential, username } =\n iceServers.find(({ urls }) => urls.includes(\"turn:\")) || {};\n\n const options = {\n stunServer,\n turnServer,\n turnUsername: username,\n turnPassword: credential,\n };\n log(\"iceOptions\", options);\n return options;\n}\n\n/**\n *\n * @param signatureHash\n * @param namedCurveAlgorithm necessary when use ecdsa\n */\nexport const createSelfSignedCertificate =\n CipherContext.createSelfSignedCertificateWithKey;\n\nexport class MediaStreamTrackFactory {\n static async rtpSource({\n port,\n kind,\n cb,\n }: {\n port?: number;\n kind: \"audio\" | \"video\";\n cb?: (buf: Buffer) => Buffer;\n }) {\n port ??= await randomPort();\n const track = new MediaStreamTrack({ kind });\n\n const udp = createSocket(\"udp4\");\n udp.bind(port);\n const onMessage = (msg: Buffer) => {\n if (cb) {\n msg = cb(msg);\n }\n track.writeRtp(msg);\n };\n udp.addListener(\"message\", onMessage);\n\n const dispose = () => {\n udp.removeListener(\"message\", onMessage);\n try {\n udp.close();\n } catch (error) {}\n };\n\n return [track, port, dispose] as const;\n }\n}\n\n/**\n * Merge two objects. If a property value in the source object is undefined or\n * when casted is equal to undefined (== undefined), then it will not overwrite\n * the value of the property in the destination object.\n */\nexport const deepMerge = <T>(dst: T, src: T) => {\n if (!dst || typeof dst !== \"object\") {\n if (src !== null && typeof src === \"object\") {\n return src;\n } else {\n return dst;\n }\n }\n\n if (!src || typeof src !== \"object\") {\n if (src == undefined) {\n return dst;\n }\n return src;\n }\n\n for (const key in src) {\n if (Object.prototype.hasOwnProperty.call(src, key)) {\n const sourceValue = src[key];\n\n if (sourceValue != undefined) {\n dst[key] = sourceValue;\n }\n }\n }\n return dst;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable prefer-const */\nimport { createHash } from \"crypto\";\nimport { createSocket } from \"dgram\";\n\nimport { performance } from \"perf_hooks\";\n\nimport {\n type Address,\n bufferReader,\n bufferWriter,\n debug,\n randomPort,\n} from \"./imports/common\";\nimport { CipherContext } from \"./imports/dtls\";\n\nimport { Directions, type MediaDirection } from \"./media/rtpTransceiver\";\nimport { MediaStreamTrack } from \"./media/track\";\nimport type { RTCIceServer } from \"./peerConnection\";\n\nconst log = debug(\"werift:packages/webrtc/src/utils.ts\");\n\nexport function fingerprint(file: Buffer, hashName: string) {\n const upper = (s: string) => s.toUpperCase();\n const colon = (s: any) => s.match(/(.{2})/g).join(\":\");\n\n const hash = createHash(hashName).update(file).digest(\"hex\");\n\n return colon(upper(hash));\n}\n\nconst fingerprintHashAlgorithms: Record<string, string> = {\n sha1: \"sha1\",\n \"sha-1\": \"sha1\",\n sha224: \"sha224\",\n \"sha-224\": \"sha224\",\n sha256: \"sha256\",\n \"sha-256\": \"sha256\",\n sha384: \"sha384\",\n \"sha-384\": \"sha384\",\n sha512: \"sha512\",\n \"sha-512\": \"sha512\",\n};\n\nexport function normalizeFingerprintAlgorithm(algorithm: string) {\n return fingerprintHashAlgorithms[algorithm.trim().toLowerCase()];\n}\n\nexport function normalizeFingerprintValue(value: string) {\n return value.replace(/[^0-9a-f]/gi, \"\").toLowerCase();\n}\n\nexport function isDtls(buf: Buffer) {\n const firstByte = buf[0];\n return firstByte > 19 && firstByte < 64;\n}\n\nexport function reverseSimulcastDirection(dir: \"recv\" | \"send\") {\n if (dir === \"recv\") return \"send\";\n return \"recv\";\n}\n\nexport const andDirection = (a: MediaDirection, b: MediaDirection) =>\n Directions[Directions.indexOf(a) & Directions.indexOf(b)];\n\nexport function reverseDirection(dir: MediaDirection): MediaDirection {\n if (dir === \"sendonly\") return \"recvonly\";\n if (dir === \"recvonly\") return \"sendonly\";\n return dir;\n}\n\nexport const milliTime = Date.now;\n\nconst startupTimestampInMicroseconds =\n BigInt(Date.now()) * 1000n - process.hrtime.bigint() / 1000n;\n\nexport const microTime = () => {\n return startupTimestampInMicroseconds + process.hrtime.bigint() / 1000n;\n};\n\nexport const timestampSeconds = () => Date.now() / 1000;\n\n/**https://datatracker.ietf.org/doc/html/rfc3550#section-4 */\nexport const ntpTime = () => {\n const now = performance.timeOrigin + performance.now() - Date.UTC(1900, 0, 1);\n\n const seconds = now / 1000;\n const [sec, msec] = seconds.toString().split(\".\").map(Number);\n\n const buf = bufferWriter([4, 4], [sec, msec]);\n\n return buf.readBigUInt64BE();\n};\n\nexport const ntpTimeToEpochMs = (ntp: bigint) => {\n const [seconds, milliseconds] = bufferReader(\n bufferWriter([8], [ntp]),\n [4, 4],\n );\n return seconds * 1000 + milliseconds + Date.UTC(1900, 0, 1);\n};\n\n/**\n * https://datatracker.ietf.org/doc/html/rfc3550#section-4\n * @param ntp\n * @returns 32bit\n */\nexport const compactNtp = (ntp: bigint) => {\n const buf = bufferWriter([8], [ntp]);\n const [, sec, msec] = bufferReader(buf, [2, 2, 2, 2]);\n return bufferWriter([2, 2], [sec, msec]).readUInt32BE();\n};\n\nexport function parseIceServers(iceServers: RTCIceServer[]) {\n const options: {\n stunServer?: Address;\n turnServer?: Address;\n turnUsername?: string;\n turnPassword?: string;\n turnTransport?: \"udp\" | \"tcp\" | \"tls\";\n } = {};\n\n for (const iceServer of iceServers) {\n const urls = Array.isArray(iceServer.urls)\n ? iceServer.urls\n : [iceServer.urls];\n for (const url of urls) {\n const parsed = parseIceServerUrl(url);\n if (!parsed) {\n continue;\n }\n\n if (!options.stunServer && parsed.kind === \"stun\") {\n options.stunServer = parsed.address;\n }\n\n if (!options.turnServer && parsed.kind === \"turn\") {\n options.turnServer = parsed.address;\n options.turnTransport = parsed.transport;\n options.turnUsername = iceServer.username;\n options.turnPassword = iceServer.credential;\n }\n }\n }\n\n log(\"iceOptions\", options);\n return options;\n}\n\nexport function resolveTurnTransport({\n configuredTurnTransport,\n forceTurnTCP,\n parsedTurnTransport,\n}: {\n parsedTurnTransport?: \"udp\" | \"tcp\" | \"tls\";\n configuredTurnTransport?: \"udp\" | \"tcp\" | \"tls\";\n forceTurnTCP: boolean;\n}) {\n if (parsedTurnTransport) {\n return parsedTurnTransport;\n }\n\n if (configuredTurnTransport) {\n return configuredTurnTransport;\n }\n\n if (forceTurnTCP) {\n return \"tcp\";\n }\n\n return undefined;\n}\n\nfunction parseIceServerUrl(url: string) {\n const matched = /^(stun|stuns|turn|turns):(.+)$/i.exec(url.trim());\n if (!matched) {\n return;\n }\n\n const [, rawScheme, rawRest] = matched;\n const scheme = rawScheme.toLowerCase() as \"stun\" | \"stuns\" | \"turn\" | \"turns\";\n const [authority] = rawRest.split(\"?\", 1);\n const [, query = \"\"] = rawRest.split(\"?\");\n const address = parseAddress(authority, defaultPort(scheme));\n if (!address) {\n return;\n }\n\n if (scheme === \"stun\" || scheme === \"stuns\") {\n return { kind: \"stun\" as const, address };\n }\n\n const queryParams = new URLSearchParams(query);\n const transportParam = queryParams.get(\"transport\");\n const transport = resolveParsedTurnTransport({\n scheme,\n transportParam,\n });\n if (transport === \"invalid\") {\n return;\n }\n\n return {\n kind: \"turn\" as const,\n address,\n transport,\n };\n}\n\nfunction resolveParsedTurnTransport({\n scheme,\n transportParam,\n}: {\n scheme: \"turn\" | \"turns\";\n transportParam: string | null;\n}): \"udp\" | \"tcp\" | \"tls\" | \"invalid\" | undefined {\n if (transportParam == null) {\n return scheme === \"turns\" ? \"tls\" : undefined;\n }\n\n if (transportParam === \"udp\") {\n return scheme === \"turns\" ? \"invalid\" : \"udp\";\n }\n\n if (transportParam === \"tcp\") {\n return scheme === \"turns\" ? \"tls\" : \"tcp\";\n }\n\n return \"invalid\";\n}\n\nfunction defaultPort(scheme: string) {\n if (scheme === \"stuns\" || scheme === \"turns\") {\n return 5349;\n }\n return 3478;\n}\n\nfunction parseAddress(\n value: string,\n fallbackPort: number,\n): Address | undefined {\n const authority = value.startsWith(\"//\") ? value.slice(2) : value;\n if (!authority) {\n return;\n }\n\n if (authority.startsWith(\"[\")) {\n const closingBracket = authority.indexOf(\"]\");\n if (closingBracket === -1) {\n return;\n }\n const host = authority.slice(1, closingBracket);\n const port = parsePort(authority.slice(closingBracket + 1), fallbackPort);\n return [host, port];\n }\n\n const firstColon = authority.indexOf(\":\");\n const lastColon = authority.lastIndexOf(\":\");\n if (firstColon !== -1 && firstColon === lastColon) {\n return [\n authority.slice(0, firstColon),\n parsePort(authority.slice(firstColon + 1), fallbackPort),\n ];\n }\n\n return [authority, fallbackPort];\n}\n\nfunction parsePort(value: string, fallbackPort: number) {\n const portString = value.startsWith(\":\") ? value.slice(1) : value;\n const port = Number.parseInt(portString, 10);\n return Number.isFinite(port) ? port : fallbackPort;\n}\n\n/**\n *\n * @param signatureHash\n * @param namedCurveAlgorithm necessary when use ecdsa\n */\nexport const createSelfSignedCertificate =\n CipherContext.createSelfSignedCertificateWithKey;\n\nexport class MediaStreamTrackFactory {\n static async rtpSource({\n port,\n kind,\n cb,\n }: {\n port?: number;\n kind: \"audio\" | \"video\";\n cb?: (buf: Buffer) => Buffer;\n }) {\n port ??= await randomPort();\n const track = new MediaStreamTrack({ kind });\n\n const udp = createSocket(\"udp4\");\n udp.bind(port);\n const onMessage = (msg: Buffer) => {\n if (cb) {\n msg = cb(msg);\n }\n track.writeRtp(msg);\n };\n udp.addListener(\"message\", onMessage);\n\n const dispose = () => {\n udp.removeListener(\"message\", onMessage);\n try {\n udp.close();\n } catch (error) {}\n };\n\n return [track, port, dispose] as const;\n }\n}\n\n/**\n * Merge two objects. If a property value in the source object is undefined or\n * when casted is equal to undefined (== undefined), then it will not overwrite\n * the value of the property in the destination object.\n */\nexport const deepMerge = <T>(dst: T, src: T) => {\n if (!dst || typeof dst !== \"object\") {\n if (src !== null && typeof src === \"object\") {\n return src;\n } else {\n return dst;\n }\n }\n\n if (!src || typeof src !== \"object\") {\n if (src == undefined) {\n return dst;\n }\n return src;\n }\n\n for (const key in src) {\n if (Object.prototype.hasOwnProperty.call(src, key)) {\n const sourceValue = src[key];\n\n if (sourceValue != undefined) {\n dst[key] = sourceValue;\n }\n }\n }\n return dst;\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "werift",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.24.0",
|
|
4
4
|
"description": "WebRTC Implementation for TypeScript (Node.js)",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"WebRTC",
|
|
@@ -45,7 +45,10 @@
|
|
|
45
45
|
"test": "vitest run ./tests",
|
|
46
46
|
"type": "tsc --noEmit --project ./tsconfig.json",
|
|
47
47
|
"unused": "organize-imports-cli src/**/*.ts",
|
|
48
|
-
"upgrade-interactive": "npx npm-check-updates -i"
|
|
48
|
+
"upgrade-interactive": "npx npm-check-updates -i",
|
|
49
|
+
"wpt:list": "tsx --tsconfig ./tsconfig.json tools/wpt-runner/list.ts",
|
|
50
|
+
"wpt": "tsx --tsconfig ./tsconfig.json tools/wpt-runner/run.ts",
|
|
51
|
+
"wpt:coverage": "tsx --tsconfig ./tsconfig.json tools/wpt-runner/coverage.ts"
|
|
49
52
|
},
|
|
50
53
|
"dependencies": {
|
|
51
54
|
"@fidm/x509": "^1.2.1",
|
|
@@ -60,7 +63,7 @@
|
|
|
60
63
|
"debug": "4.4.0",
|
|
61
64
|
"int64-buffer": "1.1.0",
|
|
62
65
|
"ip": "^2.0.1",
|
|
63
|
-
"
|
|
66
|
+
"mediabunny": "^1.45.2",
|
|
64
67
|
"multicast-dns": "^7.2.5",
|
|
65
68
|
"tweetnacl": "^1.0.3",
|
|
66
69
|
"werift-common": "*",
|
|
@@ -73,4 +76,4 @@
|
|
|
73
76
|
"node": ">=16"
|
|
74
77
|
},
|
|
75
78
|
"readme": "README.md"
|
|
76
|
-
}
|
|
79
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"attributes.js","sourceRoot":"","sources":["../../../../../ice/src/stun/attributes.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Int64 from \"int64-buffer\";\nimport nodeIp from \"ip\";\n\nimport type { Address } from \"../imports/common\";\nimport {\n type AttributeKeys,\n COOKIE,\n IPV4_PROTOCOL,\n IPV6_PROTOCOL,\n} from \"./const\";\n\nfunction packAddress(value: Address) {\n const [address] = value;\n\n const protocol = nodeIp.isV4Format(address) ? IPV4_PROTOCOL : IPV6_PROTOCOL;\n\n const buffer = Buffer.alloc(4);\n buffer.writeUInt8(0, 0);\n buffer.writeUInt8(protocol, 1);\n buffer.writeUInt16BE(value[1], 2);\n\n return Buffer.concat([buffer, nodeIp.toBuffer(address)]);\n}\n\nexport function unpackErrorCode(data: Buffer): [number, string] {\n if (data.length < 4) throw new Error(\"STUN error code is less than 4 bytes\");\n const codeHigh = data.readUInt8(2);\n const codeLow = data.readUInt8(3);\n const reason = data.slice(4).toString(\"utf8\");\n return [codeHigh * 100 + codeLow, reason];\n}\n\nfunction unpackAddress(data: Buffer): Address {\n if (data.length < 4)\n throw new Error(\"STUN address length is less than 4 bytes\");\n const protocol = data.readUInt8(1);\n const port = data.readUInt16BE(2);\n const address = data.slice(4);\n switch (protocol) {\n case IPV4_PROTOCOL:\n if (address.length != 4)\n throw new Error(`STUN address has invalid length for IPv4`);\n return [nodeIp.toString(address), port];\n case IPV6_PROTOCOL:\n if (address.length != 16)\n throw new Error(\"STUN address has invalid length for IPv6\");\n return [nodeIp.toString(address), port];\n default:\n throw new Error(\"STUN address has unknown protocol\");\n }\n}\n\nconst cookieBuffer = Buffer.alloc(6);\ncookieBuffer.writeUInt16BE(COOKIE >> 16, 0);\ncookieBuffer.writeUInt32BE(COOKIE, 2);\n\nfunction xorAddress(data: Buffer, transactionId: Buffer) {\n const xPad = [...cookieBuffer, ...transactionId];\n let xData = data.slice(0, 2);\n\n for (let i = 2; i < data.length; i++) {\n const num = data[i] ^ xPad[i - 2];\n const buf = Buffer.alloc(1);\n buf.writeUIntBE(num, 0, 1);\n xData = Buffer.concat([xData, buf]);\n }\n return xData;\n}\n\nexport function unpackXorAddress(data: Buffer, transactionId: Buffer): Address {\n return unpackAddress(xorAddress(data, transactionId));\n}\n\nexport function packErrorCode(value: [number, string]) {\n const buffer = Buffer.alloc(4);\n buffer.writeUInt16BE(0, 0);\n buffer.writeUInt8(Math.floor(value[0] / 100), 2);\n buffer.writeUInt8(value[0] % 100, 3);\n const encode = Buffer.from(value[1], \"utf8\");\n return Buffer.concat([buffer, encode]);\n}\n\nexport function packXorAddress(value: Address, transactionId: Buffer) {\n return xorAddress(packAddress(value), transactionId);\n}\n\nconst packUnsigned = (value: number) => {\n const buffer = Buffer.alloc(4);\n buffer.writeUInt32BE(value, 0);\n return buffer;\n};\n\nconst unpackUnsigned = (data: Buffer) => data.readUInt32BE(0);\n\nconst packUnsignedShort = (value: number) => {\n const buffer = Buffer.alloc(4);\n buffer.writeUInt16BE(value, 0);\n return buffer;\n};\n\nconst unpackUnsignedShort = (data: Buffer) => data.readUInt16BE(0);\n\nconst packUnsigned64 = (value: bigint) => {\n return new Int64.Int64BE(value.toString()).toBuffer();\n};\nconst unpackUnsigned64 = (data: Buffer) => {\n const int = new Int64.Int64BE(data);\n return BigInt(int.toString());\n};\n\nconst packString = (value: string) => Buffer.from(value, \"utf8\");\nconst unpackString = (data: Buffer) => data.toString(\"utf8\");\n\nconst packBytes = (value: Buffer) => value;\nconst unpackBytes = (data: Buffer) => data;\n\nconst packNone = (value: Buffer) => Buffer.from([]);\nconst unpackNone = (data: Buffer) => null;\n\nexport type ATTRIBUTE = [\n number,\n AttributeKey,\n (...args: any) => Buffer,\n (...args: any) => any,\n];\n\nconst ATTRIBUTES: ATTRIBUTE[] = [\n [0x0001, \"MAPPED-ADDRESS\", packAddress, unpackAddress],\n [0x0003, \"CHANGE-REQUEST\", packUnsigned, unpackUnsigned],\n [0x0004, \"SOURCE-ADDRESS\", packAddress, unpackAddress],\n [0x0005, \"CHANGED-ADDRESS\", packAddress, unpackAddress],\n [0x0006, \"USERNAME\", packString, unpackString],\n [0x0008, \"MESSAGE-INTEGRITY\", packBytes, unpackBytes],\n [0x0009, \"ERROR-CODE\", packErrorCode, unpackErrorCode],\n [0x000c, \"CHANNEL-NUMBER\", packUnsignedShort, unpackUnsignedShort],\n [0x000d, \"LIFETIME\", packUnsigned, unpackUnsigned],\n [0x0012, \"XOR-PEER-ADDRESS\", packXorAddress, unpackXorAddress],\n [0x0013, \"DATA\", packBytes, unpackBytes],\n [0x0014, \"REALM\", packString, unpackString],\n [0x0015, \"NONCE\", packBytes, unpackBytes],\n [0x0016, \"XOR-RELAYED-ADDRESS\", packXorAddress, unpackXorAddress],\n [0x0019, \"REQUESTED-TRANSPORT\", packUnsigned, unpackUnsigned],\n [0x0020, \"XOR-MAPPED-ADDRESS\", packXorAddress, unpackXorAddress],\n [0x0024, \"PRIORITY\", packUnsigned, unpackUnsigned],\n [0x0025, \"USE-CANDIDATE\", packNone, unpackNone],\n [0x8022, \"SOFTWARE\", packString, unpackString],\n [0x8028, \"FINGERPRINT\", packUnsigned, unpackUnsigned],\n [0x8029, \"ICE-CONTROLLED\", packUnsigned64, unpackUnsigned64],\n [0x802a, \"ICE-CONTROLLING\", packUnsigned64, unpackUnsigned64],\n [0x802b, \"RESPONSE-ORIGIN\", packAddress, unpackAddress],\n [0x802c, \"OTHER-ADDRESS\", packAddress, unpackAddress],\n];\n\nexport class AttributeRepository {\n constructor(protected attributes: AttributePair[] = []) {}\n\n getAttributes() {\n return this.attributes;\n }\n\n setAttribute(key: (typeof AttributeKeys)[number], value: any) {\n const exist = this.attributes.find((a) => a[0] === key);\n if (exist) {\n exist[1] = value;\n } else {\n this.attributes.push([key, value]);\n }\n return this;\n }\n\n getAttributeValue(key: AttributeKey) {\n const attribute = this.attributes.find((a) => a[0] === key);\n if (!attribute) {\n return undefined;\n }\n return attribute[1];\n }\n\n get attributesKeys(): (typeof AttributeKeys)[number][] {\n return this.attributes.map((a) => a[0]);\n }\n\n clear() {\n this.attributes = [];\n }\n}\n\nexport type AttributeKey = (typeof AttributeKeys)[number];\n\nexport type AttributePair = [AttributeKey, any];\n\nexport const ATTRIBUTES_BY_TYPE = ATTRIBUTES.reduce(\n (acc, cur) => {\n acc[cur[0]] = cur;\n return acc;\n },\n {} as { [key: string]: ATTRIBUTE },\n);\n\nexport const ATTRIBUTES_BY_NAME = ATTRIBUTES.reduce(\n (acc, cur) => {\n acc[cur[1]] = cur;\n return acc;\n },\n {} as { [key: string]: ATTRIBUTE },\n);\n"]}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
export type { MP4ArrayBuffer as ArrayBuffer, MP4AudioTrack as AudioTrack, MP4File as File, MP4Info as Info, Sample, SampleOptions, MP4Track as Track, TrackOptions, MP4VideoTrack as VideoTrack, } from "mp4box";
|
|
2
|
-
export { BoxParser, ISOFile, Log, createFile as New, DataStream as Stream, } from "mp4box";
|
|
3
|
-
import { type MP4AudioTrack, type MP4Track, type MP4VideoTrack } from "mp4box";
|
|
4
|
-
export declare function isAudioTrack(track: MP4Track): track is MP4AudioTrack;
|
|
5
|
-
export declare function isVideoTrack(track: MP4Track): track is MP4VideoTrack;
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Stream = exports.New = exports.Log = exports.ISOFile = exports.BoxParser = void 0;
|
|
4
|
-
exports.isAudioTrack = isAudioTrack;
|
|
5
|
-
exports.isVideoTrack = isVideoTrack;
|
|
6
|
-
var mp4box_1 = require("mp4box");
|
|
7
|
-
Object.defineProperty(exports, "BoxParser", { enumerable: true, get: function () { return mp4box_1.BoxParser; } });
|
|
8
|
-
Object.defineProperty(exports, "ISOFile", { enumerable: true, get: function () { return mp4box_1.ISOFile; } });
|
|
9
|
-
Object.defineProperty(exports, "Log", { enumerable: true, get: function () { return mp4box_1.Log; } });
|
|
10
|
-
Object.defineProperty(exports, "New", { enumerable: true, get: function () { return mp4box_1.createFile; } });
|
|
11
|
-
Object.defineProperty(exports, "Stream", { enumerable: true, get: function () { return mp4box_1.DataStream; } });
|
|
12
|
-
const mp4box_2 = require("mp4box");
|
|
13
|
-
function isAudioTrack(track) {
|
|
14
|
-
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
15
|
-
return track.audio !== undefined;
|
|
16
|
-
}
|
|
17
|
-
function isVideoTrack(track) {
|
|
18
|
-
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
19
|
-
return track.video !== undefined;
|
|
20
|
-
}
|
|
21
|
-
// TODO contribute to mp4box
|
|
22
|
-
mp4box_2.BoxParser.dOpsBox.prototype.write = function (stream) {
|
|
23
|
-
this.size = 11;
|
|
24
|
-
this.writeHeader(stream);
|
|
25
|
-
stream.writeUint8(0);
|
|
26
|
-
stream.writeUint8(this.OutputChannelCount);
|
|
27
|
-
stream.writeUint16(this.PreSkip);
|
|
28
|
-
stream.writeUint32(this.InputSampleRate);
|
|
29
|
-
stream.writeUint16(0);
|
|
30
|
-
stream.writeUint8(0);
|
|
31
|
-
};
|
|
32
|
-
//# sourceMappingURL=mp4box.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mp4box.js","sourceRoot":"","sources":["../../../../../../../rtp/src/extra/container/mp4/mp4box.ts"],"names":[],"mappings":";;;AA4BA,oCAGC;AAED,oCAGC;AAxBD,iCAMgB;AALd,mGAAA,SAAS,OAAA;AACT,iGAAA,OAAO,OAAA;AACP,6FAAA,GAAG,OAAA;AACH,6FAAA,UAAU,OAAO;AACjB,gGAAA,UAAU,OAAU;AAGtB,mCAMgB;AAEhB,SAAgB,YAAY,CAAC,KAAe;IAC1C,uEAAuE;IACvE,OAAQ,KAAuB,CAAC,KAAK,KAAK,SAAS,CAAC;AACtD,CAAC;AAED,SAAgB,YAAY,CAAC,KAAe;IAC1C,uEAAuE;IACvE,OAAQ,KAAuB,CAAC,KAAK,KAAK,SAAS,CAAC;AACtD,CAAC;AAED,4BAA4B;AAC5B,kBAAS,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,GAAG,UAAU,MAAkB;IAC9D,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;IACf,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAEzB,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACrB,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC3C,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACzC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACvB,CAAC,CAAC","sourcesContent":["// Rename some stuff so it's on brand.\nexport type {\n MP4ArrayBuffer as ArrayBuffer,\n MP4AudioTrack as AudioTrack,\n MP4File as File,\n MP4Info as Info,\n Sample,\n SampleOptions,\n MP4Track as Track,\n TrackOptions,\n MP4VideoTrack as VideoTrack,\n} from \"mp4box\";\nexport {\n BoxParser,\n ISOFile,\n Log,\n createFile as New,\n DataStream as Stream,\n} from \"mp4box\";\n\nimport {\n BoxParser,\n type DataStream,\n type MP4AudioTrack,\n type MP4Track,\n type MP4VideoTrack,\n} from \"mp4box\";\n\nexport function isAudioTrack(track: MP4Track): track is MP4AudioTrack {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return (track as MP4AudioTrack).audio !== undefined;\n}\n\nexport function isVideoTrack(track: MP4Track): track is MP4VideoTrack {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return (track as MP4VideoTrack).video !== undefined;\n}\n\n// TODO contribute to mp4box\nBoxParser.dOpsBox.prototype.write = function (stream: DataStream) {\n this.size = 11;\n this.writeHeader(stream);\n\n stream.writeUint8(0);\n stream.writeUint8(this.OutputChannelCount);\n stream.writeUint16(this.PreSkip);\n stream.writeUint32(this.InputSampleRate);\n stream.writeUint16(0);\n stream.writeUint8(0);\n};\n"]}
|