werift 0.24.3 → 0.25.0-alpha.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 +116 -113
- package/lib/common/src/event.js +2 -1
- package/lib/common/src/event.js.map +1 -1
- package/lib/common/src/transport.d.ts +22 -2
- package/lib/common/src/transport.js +84 -26
- package/lib/common/src/transport.js.map +1 -1
- package/lib/ice/src/exceptions.d.ts +9 -0
- package/lib/ice/src/exceptions.js +23 -1
- package/lib/ice/src/exceptions.js.map +1 -1
- package/lib/ice/src/ice.d.ts +40 -0
- package/lib/ice/src/ice.js +194 -28
- package/lib/ice/src/ice.js.map +1 -1
- package/lib/ice/src/iceBase.d.ts +26 -0
- package/lib/ice/src/iceBase.js.map +1 -1
- package/lib/ice/src/stun/const.d.ts +7 -0
- package/lib/ice/src/stun/const.js +8 -0
- package/lib/ice/src/stun/const.js.map +1 -1
- package/lib/ice/src/stun/protocol.js +1 -4
- package/lib/ice/src/stun/protocol.js.map +1 -1
- package/lib/ice/src/stun/tcpProtocol.d.ts +7 -1
- package/lib/ice/src/stun/tcpProtocol.js +65 -14
- package/lib/ice/src/stun/tcpProtocol.js.map +1 -1
- package/lib/ice/src/stun/transaction.d.ts +12 -1
- package/lib/ice/src/stun/transaction.js +37 -4
- package/lib/ice/src/stun/transaction.js.map +1 -1
- package/lib/ice/src/turn/protocol.d.ts +79 -22
- package/lib/ice/src/turn/protocol.js +282 -78
- package/lib/ice/src/turn/protocol.js.map +1 -1
- package/lib/ice/src/types/model.d.ts +8 -0
- package/lib/ice/src/types/model.js.map +1 -1
- package/lib/index.mjs +5646 -3451
- package/lib/nonstandard/index.mjs +287 -1004
- package/lib/polyfill/dom.mjs +23794 -0
- package/lib/polyfill/index.mjs +23794 -0
- package/lib/rtp/src/extra/container/mp4/container.js +12 -4
- package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
- package/lib/rtp/src/extra/processor/mp4.js +8 -3
- package/lib/rtp/src/extra/processor/mp4.js.map +1 -1
- package/lib/rtp/src/extra/processor/mp4Callback.js +3 -1
- package/lib/rtp/src/extra/processor/mp4Callback.js.map +1 -1
- package/lib/sctp/src/chunk.d.ts +5 -0
- package/lib/sctp/src/chunk.js +16 -11
- package/lib/sctp/src/chunk.js.map +1 -1
- package/lib/sctp/src/index.d.ts +3 -1
- package/lib/sctp/src/index.js +10 -1
- package/lib/sctp/src/index.js.map +1 -1
- package/lib/sctp/src/sctp.d.ts +12 -3
- package/lib/sctp/src/sctp.js +51 -18
- package/lib/sctp/src/sctp.js.map +1 -1
- package/lib/webrtc/src/const.js +2 -0
- package/lib/webrtc/src/const.js.map +1 -1
- package/lib/webrtc/src/errors.d.ts +9 -1
- package/lib/webrtc/src/errors.js +19 -0
- package/lib/webrtc/src/errors.js.map +1 -1
- package/lib/webrtc/src/media/codec.d.ts +5 -0
- package/lib/webrtc/src/media/codec.js +21 -0
- package/lib/webrtc/src/media/codec.js.map +1 -1
- package/lib/webrtc/src/media/codecCompatibility.d.ts +23 -0
- package/lib/webrtc/src/media/codecCompatibility.js +138 -0
- package/lib/webrtc/src/media/codecCompatibility.js.map +1 -0
- package/lib/webrtc/src/media/index.d.ts +1 -0
- package/lib/webrtc/src/media/index.js +1 -0
- package/lib/webrtc/src/media/index.js.map +1 -1
- package/lib/webrtc/src/media/router.d.ts +2 -0
- package/lib/webrtc/src/media/router.js +23 -3
- package/lib/webrtc/src/media/router.js.map +1 -1
- package/lib/webrtc/src/media/rtpReceiver.d.ts +12 -0
- package/lib/webrtc/src/media/rtpReceiver.js +35 -0
- package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
- package/lib/webrtc/src/media/rtpSender.d.ts +65 -4
- package/lib/webrtc/src/media/rtpSender.js +264 -35
- package/lib/webrtc/src/media/rtpSender.js.map +1 -1
- package/lib/webrtc/src/media/rtpTransceiver.d.ts +42 -0
- package/lib/webrtc/src/media/rtpTransceiver.js +157 -4
- package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
- package/lib/webrtc/src/media/track.d.ts +29 -1
- package/lib/webrtc/src/media/track.js +164 -5
- package/lib/webrtc/src/media/track.js.map +1 -1
- package/lib/webrtc/src/nonstandard/index.d.ts +0 -1
- package/lib/webrtc/src/nonstandard/index.js +0 -1
- package/lib/webrtc/src/nonstandard/index.js.map +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +2 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
- package/lib/webrtc/src/nonstandard/userMedia.d.ts +1 -2
- package/lib/webrtc/src/nonstandard/userMedia.js +30 -14
- package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -1
- package/lib/webrtc/src/peerConnection.d.ts +127 -5
- package/lib/webrtc/src/peerConnection.js +629 -143
- package/lib/webrtc/src/peerConnection.js.map +1 -1
- package/lib/webrtc/src/polyfill/api.d.ts +14 -0
- package/lib/webrtc/src/polyfill/api.js +23 -0
- package/lib/webrtc/src/polyfill/api.js.map +1 -0
- package/lib/webrtc/src/polyfill/browserIdentity.d.ts +11 -0
- package/lib/webrtc/src/polyfill/browserIdentity.js +59 -0
- package/lib/webrtc/src/polyfill/browserIdentity.js.map +1 -0
- package/lib/webrtc/src/polyfill/dom.d.ts +11 -0
- package/lib/webrtc/src/polyfill/dom.js +18 -0
- package/lib/webrtc/src/polyfill/dom.js.map +1 -0
- package/lib/webrtc/src/polyfill/existingMediaDevices.d.ts +2 -0
- package/lib/webrtc/src/polyfill/existingMediaDevices.js +22 -0
- package/lib/webrtc/src/polyfill/existingMediaDevices.js.map +1 -0
- package/lib/webrtc/src/polyfill/globals.d.ts +28 -0
- package/lib/webrtc/src/polyfill/globals.js +3 -0
- package/lib/webrtc/src/polyfill/globals.js.map +1 -0
- package/lib/webrtc/src/polyfill/index.d.ts +2 -0
- package/lib/webrtc/src/polyfill/index.js +19 -0
- package/lib/webrtc/src/polyfill/index.js.map +1 -0
- package/lib/webrtc/src/polyfill/install.d.ts +13 -0
- package/lib/webrtc/src/polyfill/install.js +266 -0
- package/lib/webrtc/src/polyfill/install.js.map +1 -0
- package/lib/webrtc/src/polyfill/mediaDevices.d.ts +38 -0
- package/lib/webrtc/src/polyfill/mediaDevices.js +228 -0
- package/lib/webrtc/src/polyfill/mediaDevices.js.map +1 -0
- package/lib/webrtc/src/polyfill/mediaRegister.d.ts +51 -0
- package/lib/webrtc/src/polyfill/mediaRegister.js +14 -0
- package/lib/webrtc/src/polyfill/mediaRegister.js.map +1 -0
- package/lib/webrtc/src/polyfill/peerConnectionConfig.d.ts +3 -0
- package/lib/webrtc/src/polyfill/peerConnectionConfig.js +52 -0
- package/lib/webrtc/src/polyfill/peerConnectionConfig.js.map +1 -0
- package/lib/webrtc/src/polyfill/registers/callback.d.ts +16 -0
- package/lib/webrtc/src/polyfill/registers/callback.js +57 -0
- package/lib/webrtc/src/polyfill/registers/callback.js.map +1 -0
- package/lib/webrtc/src/polyfill/registers/empty.d.ts +2 -0
- package/lib/webrtc/src/polyfill/registers/empty.js +28 -0
- package/lib/webrtc/src/polyfill/registers/empty.js.map +1 -0
- package/lib/webrtc/src/polyfill/registers/mp4Webm.d.ts +36 -0
- package/lib/webrtc/src/polyfill/registers/mp4Webm.js +242 -0
- package/lib/webrtc/src/polyfill/registers/mp4Webm.js.map +1 -0
- package/lib/webrtc/src/polyfill/registers/rtpRtcp.d.ts +17 -0
- package/lib/webrtc/src/polyfill/registers/rtpRtcp.js +143 -0
- package/lib/webrtc/src/polyfill/registers/rtpRtcp.js.map +1 -0
- package/lib/webrtc/src/polyfill/rtcSessionDescription.d.ts +18 -0
- package/lib/webrtc/src/polyfill/rtcSessionDescription.js +36 -0
- package/lib/webrtc/src/polyfill/rtcSessionDescription.js.map +1 -0
- package/lib/webrtc/src/polyfill/rtpCodec.d.ts +17 -0
- package/lib/webrtc/src/polyfill/rtpCodec.js +93 -0
- package/lib/webrtc/src/polyfill/rtpCodec.js.map +1 -0
- package/lib/webrtc/src/polyfill/selectSettings.d.ts +31 -0
- package/lib/webrtc/src/polyfill/selectSettings.js +156 -0
- package/lib/webrtc/src/polyfill/selectSettings.js.map +1 -0
- package/lib/webrtc/src/polyfill/sourceIo.d.ts +21 -0
- package/lib/webrtc/src/polyfill/sourceIo.js +298 -0
- package/lib/webrtc/src/polyfill/sourceIo.js.map +1 -0
- package/lib/webrtc/src/polyfill/trackStop.d.ts +4 -0
- package/lib/webrtc/src/polyfill/trackStop.js +16 -0
- package/lib/webrtc/src/polyfill/trackStop.js.map +1 -0
- package/lib/webrtc/src/sctpManager.d.ts +2 -1
- package/lib/webrtc/src/sctpManager.js +5 -2
- package/lib/webrtc/src/sctpManager.js.map +1 -1
- package/lib/webrtc/src/sdp.d.ts +1 -1
- package/lib/webrtc/src/sdp.js +5 -6
- package/lib/webrtc/src/sdp.js.map +1 -1
- package/lib/webrtc/src/sdpManager.d.ts +38 -1
- package/lib/webrtc/src/sdpManager.js +236 -30
- package/lib/webrtc/src/sdpManager.js.map +1 -1
- package/lib/webrtc/src/secureTransportManager.d.ts +43 -12
- package/lib/webrtc/src/secureTransportManager.js +123 -47
- package/lib/webrtc/src/secureTransportManager.js.map +1 -1
- package/lib/webrtc/src/transceiverManager.d.ts +91 -6
- package/lib/webrtc/src/transceiverManager.js +477 -62
- package/lib/webrtc/src/transceiverManager.js.map +1 -1
- package/lib/webrtc/src/transport/ice.d.ts +8 -0
- package/lib/webrtc/src/transport/ice.js +17 -1
- package/lib/webrtc/src/transport/ice.js.map +1 -1
- package/lib/webrtc/src/transport/sctp.d.ts +3 -2
- package/lib/webrtc/src/transport/sctp.js +8 -2
- package/lib/webrtc/src/transport/sctp.js.map +1 -1
- package/package.json +14 -3
|
@@ -10,7 +10,7 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
|
|
|
10
10
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
11
11
|
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
12
12
|
};
|
|
13
|
-
var _Mp4Container_instances, _Mp4Container_audioFrame, _Mp4Container_audioMeta, _Mp4Container_audioSource, _Mp4Container_currentFragment, _Mp4Container_ftyp, _Mp4Container_initializationEmitted, _Mp4Container_lastAudioDuration, _Mp4Container_lastMoof, _Mp4Container_lastMoofTimestamp, _Mp4Container_lastVideoDuration, _Mp4Container_moov, _Mp4Container_onDataOperation, _Mp4Container_operation, _Mp4Container_output, _Mp4Container_startPromise, _Mp4Container_stopPromise, _Mp4Container_stopped, _Mp4Container_videoFrame, _Mp4Container_videoMeta, _Mp4Container_videoSource, _Mp4Container_init, _Mp4Container_enqueue, _Mp4Container_drainFrameBuffer, _Mp4Container_ensureOutputStarted, _Mp4Container_emitInitializationSegment, _Mp4Container_emitData, _Mp4Container_flushOnData, _Mp4Container_enqueueOperation, _Mp4Container_defaultKind, _Mp4Container_flushPendingFrame, _Mp4Container_processFrame, _Mp4Container_writePacket, _Mp4Container_rememberFragmentPacket;
|
|
13
|
+
var _Mp4Container_instances, _Mp4Container_audioFrame, _Mp4Container_audioMeta, _Mp4Container_audioSource, _Mp4Container_currentFragment, _Mp4Container_ftyp, _Mp4Container_initializationEmitted, _Mp4Container_lastAudioDuration, _Mp4Container_lastMoof, _Mp4Container_lastMoofTimestamp, _Mp4Container_lastVideoDuration, _Mp4Container_moov, _Mp4Container_onDataOperation, _Mp4Container_operation, _Mp4Container_output, _Mp4Container_startPromise, _Mp4Container_stopPromise, _Mp4Container_stopped, _Mp4Container_timestampOrigin, _Mp4Container_videoFrame, _Mp4Container_videoMeta, _Mp4Container_videoSource, _Mp4Container_init, _Mp4Container_enqueue, _Mp4Container_drainFrameBuffer, _Mp4Container_ensureOutputStarted, _Mp4Container_emitInitializationSegment, _Mp4Container_emitData, _Mp4Container_flushOnData, _Mp4Container_enqueueOperation, _Mp4Container_defaultKind, _Mp4Container_flushPendingFrame, _Mp4Container_processFrame, _Mp4Container_writePacket, _Mp4Container_rememberFragmentPacket;
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
exports.mp4SupportedCodecs = exports.Mp4Container = void 0;
|
|
16
16
|
const mediabunny_1 = require("mediabunny");
|
|
@@ -41,6 +41,8 @@ class Mp4Container {
|
|
|
41
41
|
_Mp4Container_startPromise.set(this, void 0);
|
|
42
42
|
_Mp4Container_stopPromise.set(this, void 0);
|
|
43
43
|
_Mp4Container_stopped.set(this, false);
|
|
44
|
+
// EncodedChunk timestamps may be negative; EncodedPacket requires >= 0.
|
|
45
|
+
_Mp4Container_timestampOrigin.set(this, {});
|
|
44
46
|
_Mp4Container_videoFrame.set(this, void 0);
|
|
45
47
|
_Mp4Container_videoMeta.set(this, void 0);
|
|
46
48
|
_Mp4Container_videoSource.set(this, void 0);
|
|
@@ -112,7 +114,7 @@ class Mp4Container {
|
|
|
112
114
|
}
|
|
113
115
|
}
|
|
114
116
|
exports.Mp4Container = Mp4Container;
|
|
115
|
-
_Mp4Container_audioFrame = new WeakMap(), _Mp4Container_audioMeta = new WeakMap(), _Mp4Container_audioSource = new WeakMap(), _Mp4Container_currentFragment = new WeakMap(), _Mp4Container_ftyp = new WeakMap(), _Mp4Container_initializationEmitted = new WeakMap(), _Mp4Container_lastAudioDuration = new WeakMap(), _Mp4Container_lastMoof = new WeakMap(), _Mp4Container_lastMoofTimestamp = new WeakMap(), _Mp4Container_lastVideoDuration = new WeakMap(), _Mp4Container_moov = new WeakMap(), _Mp4Container_onDataOperation = new WeakMap(), _Mp4Container_operation = new WeakMap(), _Mp4Container_output = new WeakMap(), _Mp4Container_startPromise = new WeakMap(), _Mp4Container_stopPromise = new WeakMap(), _Mp4Container_stopped = new WeakMap(), _Mp4Container_videoFrame = new WeakMap(), _Mp4Container_videoMeta = new WeakMap(), _Mp4Container_videoSource = new WeakMap(), _Mp4Container_instances = new WeakSet(), _Mp4Container_init = function _Mp4Container_init(frame) {
|
|
117
|
+
_Mp4Container_audioFrame = new WeakMap(), _Mp4Container_audioMeta = new WeakMap(), _Mp4Container_audioSource = new WeakMap(), _Mp4Container_currentFragment = new WeakMap(), _Mp4Container_ftyp = new WeakMap(), _Mp4Container_initializationEmitted = new WeakMap(), _Mp4Container_lastAudioDuration = new WeakMap(), _Mp4Container_lastMoof = new WeakMap(), _Mp4Container_lastMoofTimestamp = new WeakMap(), _Mp4Container_lastVideoDuration = new WeakMap(), _Mp4Container_moov = new WeakMap(), _Mp4Container_onDataOperation = new WeakMap(), _Mp4Container_operation = new WeakMap(), _Mp4Container_output = new WeakMap(), _Mp4Container_startPromise = new WeakMap(), _Mp4Container_stopPromise = new WeakMap(), _Mp4Container_stopped = new WeakMap(), _Mp4Container_timestampOrigin = new WeakMap(), _Mp4Container_videoFrame = new WeakMap(), _Mp4Container_videoMeta = new WeakMap(), _Mp4Container_videoSource = new WeakMap(), _Mp4Container_instances = new WeakSet(), _Mp4Container_init = function _Mp4Container_init(frame) {
|
|
116
118
|
if (frame.track === "audio") {
|
|
117
119
|
if (isVideoConfig(frame)) {
|
|
118
120
|
throw new Error("audio track requires an audio decoder config");
|
|
@@ -298,7 +300,13 @@ _Mp4Container_audioFrame = new WeakMap(), _Mp4Container_audioMeta = new WeakMap(
|
|
|
298
300
|
}, _Mp4Container_writePacket = async function _Mp4Container_writePacket(frame, duration) {
|
|
299
301
|
const data = new Uint8Array(frame.byteLength);
|
|
300
302
|
frame.copyTo(data.buffer);
|
|
301
|
-
|
|
303
|
+
// Shift only a negative timeline so the first sample is 0. A positive
|
|
304
|
+
// first timestamp keeps origin 0 and is left unchanged.
|
|
305
|
+
if (__classPrivateFieldGet(this, _Mp4Container_timestampOrigin, "f")[frame.track] == undefined) {
|
|
306
|
+
__classPrivateFieldGet(this, _Mp4Container_timestampOrigin, "f")[frame.track] = Math.min(0, frame.timestamp);
|
|
307
|
+
}
|
|
308
|
+
const timestamp = Math.max(0, frame.timestamp - __classPrivateFieldGet(this, _Mp4Container_timestampOrigin, "f")[frame.track]);
|
|
309
|
+
const packet = new mediabunny_1.EncodedPacket(data, frame.type, timestamp / 1000000, duration / 1000000);
|
|
302
310
|
if (frame.track === "audio") {
|
|
303
311
|
if (!__classPrivateFieldGet(this, _Mp4Container_audioSource, "f") || !__classPrivateFieldGet(this, _Mp4Container_audioMeta, "f")) {
|
|
304
312
|
throw new Error("audio track missing");
|
|
@@ -311,7 +319,7 @@ _Mp4Container_audioFrame = new WeakMap(), _Mp4Container_audioMeta = new WeakMap(
|
|
|
311
319
|
}
|
|
312
320
|
await __classPrivateFieldGet(this, _Mp4Container_videoSource, "f").add(packet, __classPrivateFieldGet(this, _Mp4Container_videoMeta, "f"));
|
|
313
321
|
}
|
|
314
|
-
__classPrivateFieldGet(this, _Mp4Container_instances, "m", _Mp4Container_rememberFragmentPacket).call(this, frame.track, frame.type,
|
|
322
|
+
__classPrivateFieldGet(this, _Mp4Container_instances, "m", _Mp4Container_rememberFragmentPacket).call(this, frame.track, frame.type, timestamp, duration);
|
|
315
323
|
}, _Mp4Container_rememberFragmentPacket = function _Mp4Container_rememberFragmentPacket(kind, type, timestamp, duration) {
|
|
316
324
|
const end = timestamp + duration;
|
|
317
325
|
if (!__classPrivateFieldGet(this, _Mp4Container_currentFragment, "f")) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../../../../../../rtp/src/extra/container/mp4/container.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n EncodedAudioPacketSource,\n EncodedPacket,\n EncodedVideoPacketSource,\n Mp4OutputFormat,\n NullTarget,\n Output,\n} from \"mediabunny\";\nimport { Event } from \"../../../imports/common\";\n\ntype DecoderConfig = AudioDecoderConfig | VideoDecoderConfig;\ntype EncodedChunk = EncodedAudioChunk | EncodedVideoChunk;\ntype TrackKind = \"audio\" | \"video\";\n\ninterface AudioChunkMetadata {\n decoderConfig: {\n codec: \"opus\";\n description?: Uint8Array;\n numberOfChannels: number;\n sampleRate: number;\n };\n}\n\ninterface VideoChunkMetadata {\n decoderConfig: {\n codec: string;\n codedHeight: number;\n codedWidth: number;\n description?: Uint8Array;\n displayAspectHeight?: number;\n displayAspectWidth?: number;\n };\n}\n\ninterface FragmentMeta {\n duration: number;\n kind: TrackKind;\n timestamp: number;\n type: DataType;\n}\n\nexport type DataType = \"init\" | \"delta\" | \"key\";\n\nexport interface Mp4Data {\n type: DataType;\n timestamp: number;\n duration: number;\n data: Uint8Array;\n kind: \"audio\" | \"video\";\n}\n\nexport class Mp4Container {\n #audioFrame?: (EncodedChunk & { track: TrackKind }) | undefined;\n #audioMeta?: AudioChunkMetadata;\n #audioSource?: EncodedAudioPacketSource;\n #currentFragment?: FragmentMeta;\n #ftyp?: Uint8Array;\n #initializationEmitted = false;\n #lastAudioDuration = 0;\n #lastMoof?: Uint8Array;\n #lastMoofTimestamp = 0;\n #lastVideoDuration = 0;\n #moov?: Uint8Array;\n #onDataOperation = Promise.resolve();\n #operation = Promise.resolve();\n #output?: Output<Mp4OutputFormat, NullTarget> | undefined;\n #startPromise?: Promise<void>;\n #stopPromise?: Promise<void>;\n #stopped = false;\n #videoFrame?: (EncodedChunk & { track: TrackKind }) | undefined;\n #videoMeta?: VideoChunkMetadata;\n #videoSource?: EncodedVideoPacketSource;\n audioTrack?: number;\n frameBuffer: (EncodedChunk & {\n track: TrackKind;\n })[] = [];\n onData = new Event<[Mp4Data | { eol: true }]>();\n videoTrack?: number;\n\n constructor(\n private props: {\n track: { audio: boolean; video: boolean };\n },\n ) {}\n\n get tracksReady() {\n let ready = true;\n if (this.props.track.audio && !this.audioTrack) {\n ready = false;\n }\n if (this.props.track.video && !this.videoTrack) {\n ready = false;\n }\n return ready;\n }\n\n write(\n frame: (DecoderConfig | EncodedChunk) & {\n track: TrackKind;\n },\n ) {\n if (isDecoderConfig(frame)) {\n return this.#init(frame);\n } else {\n return this.#enqueue(frame);\n }\n }\n\n #init(\n frame: DecoderConfig & {\n track: TrackKind;\n },\n ) {\n if (frame.track === \"audio\") {\n if (isVideoConfig(frame)) {\n throw new Error(\"audio track requires an audio decoder config\");\n }\n if (frame.codec !== \"opus\") {\n throw new Error(`unsupported codec: ${frame.codec}`);\n }\n this.#audioMeta = {\n decoderConfig: {\n codec: \"opus\",\n description:\n frame.description != undefined\n ? new Uint8Array(frame.description)\n : undefined,\n numberOfChannels: frame.numberOfChannels,\n sampleRate: frame.sampleRate,\n },\n };\n this.audioTrack = 1;\n } else {\n if (!isVideoConfig(frame)) {\n throw new Error(\"video track requires a video decoder config\");\n }\n if (!frame.codec.startsWith(\"avc1\")) {\n throw new Error(`unsupported codec: ${frame.codec}`);\n }\n if (frame.codedWidth == undefined || frame.codedHeight == undefined) {\n throw new Error(\"missing coded video dimensions\");\n }\n this.#videoMeta = {\n decoderConfig: {\n codec: frame.codec,\n codedHeight: frame.codedHeight,\n codedWidth: frame.codedWidth,\n description:\n frame.description != undefined\n ? new Uint8Array(frame.description)\n : undefined,\n displayAspectHeight: frame.displayAspectHeight,\n displayAspectWidth: frame.displayAspectWidth,\n },\n };\n this.videoTrack = this.props.track.audio ? 2 : 1;\n }\n\n if (!this.tracksReady) {\n return;\n }\n\n void this.#enqueueOperation(async () => {\n await this.#ensureOutputStarted();\n await this.#drainFrameBuffer();\n });\n }\n\n #enqueue(\n frame: EncodedChunk & {\n track: TrackKind;\n },\n ) {\n this.frameBuffer.push(frame);\n if (!this.tracksReady) {\n return;\n }\n void this.#enqueueOperation(async () => {\n await this.#ensureOutputStarted();\n await this.#drainFrameBuffer();\n });\n }\n\n stop() {\n if (this.#stopPromise) {\n return this.#stopPromise;\n }\n\n this.#stopped = true;\n this.#stopPromise = this.#enqueueOperation(async () => {\n if (!this.tracksReady) {\n this.frameBuffer = [];\n return;\n }\n\n await this.#ensureOutputStarted();\n await this.#drainFrameBuffer();\n await this.#flushPendingFrame(\"audio\");\n await this.#flushPendingFrame(\"video\");\n\n this.#audioSource?.close();\n this.#videoSource?.close();\n if (this.#output) {\n await this.#output.finalize();\n }\n await this.#flushOnData();\n });\n return this.#stopPromise;\n }\n\n async #drainFrameBuffer() {\n const frames = this.frameBuffer;\n this.frameBuffer = [];\n\n for (const frame of frames) {\n await this.#processFrame(frame);\n }\n }\n\n async #ensureOutputStarted() {\n if (this.#startPromise) {\n await this.#startPromise;\n return;\n }\n if (!this.tracksReady) {\n return;\n }\n\n const output = new Output({\n format: new Mp4OutputFormat({\n fastStart: \"fragmented\",\n minimumFragmentDuration: 0,\n onFtyp: (data) => {\n this.#ftyp = copyBytes(data);\n },\n onMdat: (data) => {\n if (!this.#lastMoof) {\n throw new Error(\"moof missing before mdat\");\n }\n\n const fragment = this.#currentFragment;\n const timestamp = fragment\n ? fragment.timestamp\n : Math.round(this.#lastMoofTimestamp * 1_000_000);\n const duration = fragment?.duration ?? 0;\n const kind = fragment?.kind ?? this.#defaultKind();\n const type = fragment?.type ?? \"key\";\n const segment = concatBytes(this.#lastMoof, data);\n\n this.#currentFragment = undefined;\n this.#lastMoof = undefined;\n\n void this.#emitData({\n type,\n timestamp,\n duration,\n data: segment,\n kind,\n });\n },\n onMoof: (data, _position, timestamp) => {\n this.#lastMoof = copyBytes(data);\n this.#lastMoofTimestamp = timestamp;\n },\n onMoov: (data) => {\n this.#moov = copyBytes(data);\n this.#emitInitializationSegment();\n },\n }),\n target: new NullTarget(),\n });\n\n if (this.#audioMeta) {\n this.#audioSource = new EncodedAudioPacketSource(\"opus\");\n output.addAudioTrack(this.#audioSource);\n }\n if (this.#videoMeta) {\n this.#videoSource = new EncodedVideoPacketSource(\"avc\");\n output.addVideoTrack(this.#videoSource);\n }\n\n this.#output = output;\n this.#startPromise = output.start();\n await this.#startPromise;\n }\n\n #emitInitializationSegment() {\n if (this.#initializationEmitted || !this.#ftyp || !this.#moov) {\n return;\n }\n\n this.#initializationEmitted = true;\n void this.#emitData({\n type: \"init\",\n timestamp: 0,\n duration: 0,\n data: concatBytes(this.#ftyp, this.#moov),\n kind: this.#defaultKind(),\n });\n }\n\n #emitData(data: Mp4Data | { eol: true }) {\n const next = this.#onDataOperation.then(() => this.onData.execute(data));\n this.#onDataOperation = next;\n return next;\n }\n\n async #flushOnData() {\n await this.#onDataOperation;\n }\n\n #enqueueOperation(operation: () => Promise<void>) {\n const next = this.#operation.then(operation);\n this.#operation = next;\n return next;\n }\n\n #defaultKind(): TrackKind {\n return this.props.track.video ? \"video\" : \"audio\";\n }\n\n async #flushPendingFrame(track: TrackKind) {\n const buffered = track === \"audio\" ? this.#audioFrame : this.#videoFrame;\n if (!buffered) {\n return;\n }\n\n const duration =\n track === \"audio\" ? this.#lastAudioDuration : this.#lastVideoDuration;\n await this.#writePacket(buffered, duration);\n\n if (track === \"audio\") {\n this.#audioFrame = undefined;\n } else {\n this.#videoFrame = undefined;\n }\n }\n\n async #processFrame(\n frame: EncodedChunk & {\n track: TrackKind;\n },\n ) {\n const buffered =\n frame.track === \"audio\" ? this.#audioFrame : this.#videoFrame;\n if (!buffered) {\n if (frame.track === \"audio\") {\n this.#audioFrame = frame;\n } else {\n this.#videoFrame = frame;\n }\n return;\n }\n\n const duration = Math.max(frame.timestamp - buffered.timestamp, 0);\n await this.#writePacket(buffered, duration);\n\n if (frame.track === \"audio\") {\n this.#audioFrame = frame;\n this.#lastAudioDuration = duration;\n } else {\n this.#videoFrame = frame;\n this.#lastVideoDuration = duration;\n }\n }\n\n async #writePacket(\n frame: EncodedChunk & {\n track: TrackKind;\n },\n duration: number,\n ) {\n const data = new Uint8Array(frame.byteLength);\n frame.copyTo(data.buffer);\n\n const packet = new EncodedPacket(\n data,\n frame.type,\n frame.timestamp / 1_000_000,\n duration / 1_000_000,\n );\n\n if (frame.track === \"audio\") {\n if (!this.#audioSource || !this.#audioMeta) {\n throw new Error(\"audio track missing\");\n }\n\n await this.#audioSource.add(packet, this.#audioMeta);\n } else {\n if (!this.#videoSource || !this.#videoMeta) {\n throw new Error(\"video track missing\");\n }\n\n await this.#videoSource.add(packet, this.#videoMeta);\n }\n\n this.#rememberFragmentPacket(\n frame.track,\n frame.type,\n frame.timestamp,\n duration,\n );\n }\n\n #rememberFragmentPacket(\n kind: TrackKind,\n type: EncodedChunk[\"type\"],\n timestamp: number,\n duration: number,\n ) {\n const end = timestamp + duration;\n if (!this.#currentFragment) {\n this.#currentFragment = {\n kind,\n type,\n timestamp,\n duration,\n };\n return;\n }\n\n if (kind === \"video\" && type === \"key\") {\n this.#currentFragment.type = \"key\";\n }\n\n const fragmentEnd = Math.max(\n this.#currentFragment.timestamp + this.#currentFragment.duration,\n end,\n );\n this.#currentFragment.duration =\n fragmentEnd - this.#currentFragment.timestamp;\n }\n}\n\nfunction isDecoderConfig(\n frame: DecoderConfig | EncodedChunk,\n): frame is DecoderConfig {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return (frame as DecoderConfig).codec !== undefined;\n}\n\nfunction isVideoConfig(frame: DecoderConfig): frame is VideoDecoderConfig {\n return (frame as VideoDecoderConfig).codedWidth !== undefined;\n}\n\nexport interface AudioDecoderConfig {\n codec: string;\n description?: ArrayBuffer | undefined;\n numberOfChannels: number;\n sampleRate: number;\n}\n\nexport interface VideoDecoderConfig {\n codec: string;\n codedHeight?: number | undefined;\n codedWidth?: number | undefined;\n description?: ArrayBuffer | undefined;\n displayAspectHeight?: number | undefined;\n displayAspectWidth?: number | undefined;\n optimizeForLatency?: boolean | undefined;\n}\n\ninterface EncodedAudioChunk {\n readonly byteLength: number;\n readonly duration: number | null;\n readonly timestamp: number;\n readonly type: EncodedAudioChunkType;\n copyTo(destination: ArrayBuffer): void;\n}\n\ntype EncodedAudioChunkType = \"delta\" | \"key\";\n\ninterface EncodedVideoChunk {\n readonly byteLength: number;\n readonly duration: number | null;\n readonly timestamp: number;\n readonly type: EncodedVideoChunkType;\n copyTo(destination: ArrayBuffer): void;\n}\n\ntype EncodedVideoChunkType = \"delta\" | \"key\";\n\nexport const mp4SupportedCodecs = [\"avc1\", \"opus\"] as const;\nexport type Mp4SupportedCodec = (typeof mp4SupportedCodecs)[number];\n\nfunction concatBytes(...parts: Uint8Array[]) {\n const size = parts.reduce((sum, part) => sum + part.byteLength, 0);\n const combined = new Uint8Array(size);\n let offset = 0;\n\n for (const part of parts) {\n combined.set(part, offset);\n offset += part.byteLength;\n }\n\n return combined;\n}\n\nfunction copyBytes(data: Uint8Array) {\n return new Uint8Array(data);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../../../../../../rtp/src/extra/container/mp4/container.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n EncodedAudioPacketSource,\n EncodedPacket,\n EncodedVideoPacketSource,\n Mp4OutputFormat,\n NullTarget,\n Output,\n} from \"mediabunny\";\nimport { Event } from \"../../../imports/common\";\n\ntype DecoderConfig = AudioDecoderConfig | VideoDecoderConfig;\ntype EncodedChunk = EncodedAudioChunk | EncodedVideoChunk;\ntype TrackKind = \"audio\" | \"video\";\n\ninterface AudioChunkMetadata {\n decoderConfig: {\n codec: \"opus\";\n description?: Uint8Array;\n numberOfChannels: number;\n sampleRate: number;\n };\n}\n\ninterface VideoChunkMetadata {\n decoderConfig: {\n codec: string;\n codedHeight: number;\n codedWidth: number;\n description?: Uint8Array;\n displayAspectHeight?: number;\n displayAspectWidth?: number;\n };\n}\n\ninterface FragmentMeta {\n duration: number;\n kind: TrackKind;\n timestamp: number;\n type: DataType;\n}\n\nexport type DataType = \"init\" | \"delta\" | \"key\";\n\nexport interface Mp4Data {\n type: DataType;\n timestamp: number;\n duration: number;\n data: Uint8Array;\n kind: \"audio\" | \"video\";\n}\n\nexport class Mp4Container {\n #audioFrame?: (EncodedChunk & { track: TrackKind }) | undefined;\n #audioMeta?: AudioChunkMetadata;\n #audioSource?: EncodedAudioPacketSource;\n #currentFragment?: FragmentMeta;\n #ftyp?: Uint8Array;\n #initializationEmitted = false;\n #lastAudioDuration = 0;\n #lastMoof?: Uint8Array;\n #lastMoofTimestamp = 0;\n #lastVideoDuration = 0;\n #moov?: Uint8Array;\n #onDataOperation = Promise.resolve();\n #operation = Promise.resolve();\n #output?: Output<Mp4OutputFormat, NullTarget> | undefined;\n #startPromise?: Promise<void>;\n #stopPromise?: Promise<void>;\n #stopped = false;\n // EncodedChunk timestamps may be negative; EncodedPacket requires >= 0.\n #timestampOrigin: Partial<Record<TrackKind, number>> = {};\n #videoFrame?: (EncodedChunk & { track: TrackKind }) | undefined;\n #videoMeta?: VideoChunkMetadata;\n #videoSource?: EncodedVideoPacketSource;\n audioTrack?: number;\n frameBuffer: (EncodedChunk & {\n track: TrackKind;\n })[] = [];\n onData = new Event<[Mp4Data | { eol: true }]>();\n videoTrack?: number;\n\n constructor(\n private props: {\n track: { audio: boolean; video: boolean };\n },\n ) {}\n\n get tracksReady() {\n let ready = true;\n if (this.props.track.audio && !this.audioTrack) {\n ready = false;\n }\n if (this.props.track.video && !this.videoTrack) {\n ready = false;\n }\n return ready;\n }\n\n write(\n frame: (DecoderConfig | EncodedChunk) & {\n track: TrackKind;\n },\n ) {\n if (isDecoderConfig(frame)) {\n return this.#init(frame);\n } else {\n return this.#enqueue(frame);\n }\n }\n\n #init(\n frame: DecoderConfig & {\n track: TrackKind;\n },\n ) {\n if (frame.track === \"audio\") {\n if (isVideoConfig(frame)) {\n throw new Error(\"audio track requires an audio decoder config\");\n }\n if (frame.codec !== \"opus\") {\n throw new Error(`unsupported codec: ${frame.codec}`);\n }\n this.#audioMeta = {\n decoderConfig: {\n codec: \"opus\",\n description:\n frame.description != undefined\n ? new Uint8Array(frame.description)\n : undefined,\n numberOfChannels: frame.numberOfChannels,\n sampleRate: frame.sampleRate,\n },\n };\n this.audioTrack = 1;\n } else {\n if (!isVideoConfig(frame)) {\n throw new Error(\"video track requires a video decoder config\");\n }\n if (!frame.codec.startsWith(\"avc1\")) {\n throw new Error(`unsupported codec: ${frame.codec}`);\n }\n if (frame.codedWidth == undefined || frame.codedHeight == undefined) {\n throw new Error(\"missing coded video dimensions\");\n }\n this.#videoMeta = {\n decoderConfig: {\n codec: frame.codec,\n codedHeight: frame.codedHeight,\n codedWidth: frame.codedWidth,\n description:\n frame.description != undefined\n ? new Uint8Array(frame.description)\n : undefined,\n displayAspectHeight: frame.displayAspectHeight,\n displayAspectWidth: frame.displayAspectWidth,\n },\n };\n this.videoTrack = this.props.track.audio ? 2 : 1;\n }\n\n if (!this.tracksReady) {\n return;\n }\n\n void this.#enqueueOperation(async () => {\n await this.#ensureOutputStarted();\n await this.#drainFrameBuffer();\n });\n }\n\n #enqueue(\n frame: EncodedChunk & {\n track: TrackKind;\n },\n ) {\n this.frameBuffer.push(frame);\n if (!this.tracksReady) {\n return;\n }\n void this.#enqueueOperation(async () => {\n await this.#ensureOutputStarted();\n await this.#drainFrameBuffer();\n });\n }\n\n stop() {\n if (this.#stopPromise) {\n return this.#stopPromise;\n }\n\n this.#stopped = true;\n this.#stopPromise = this.#enqueueOperation(async () => {\n if (!this.tracksReady) {\n this.frameBuffer = [];\n return;\n }\n\n await this.#ensureOutputStarted();\n await this.#drainFrameBuffer();\n await this.#flushPendingFrame(\"audio\");\n await this.#flushPendingFrame(\"video\");\n\n this.#audioSource?.close();\n this.#videoSource?.close();\n if (this.#output) {\n await this.#output.finalize();\n }\n await this.#flushOnData();\n });\n return this.#stopPromise;\n }\n\n async #drainFrameBuffer() {\n const frames = this.frameBuffer;\n this.frameBuffer = [];\n\n for (const frame of frames) {\n await this.#processFrame(frame);\n }\n }\n\n async #ensureOutputStarted() {\n if (this.#startPromise) {\n await this.#startPromise;\n return;\n }\n if (!this.tracksReady) {\n return;\n }\n\n const output = new Output({\n format: new Mp4OutputFormat({\n fastStart: \"fragmented\",\n minimumFragmentDuration: 0,\n onFtyp: (data) => {\n this.#ftyp = copyBytes(data);\n },\n onMdat: (data) => {\n if (!this.#lastMoof) {\n throw new Error(\"moof missing before mdat\");\n }\n\n const fragment = this.#currentFragment;\n const timestamp = fragment\n ? fragment.timestamp\n : Math.round(this.#lastMoofTimestamp * 1_000_000);\n const duration = fragment?.duration ?? 0;\n const kind = fragment?.kind ?? this.#defaultKind();\n const type = fragment?.type ?? \"key\";\n const segment = concatBytes(this.#lastMoof, data);\n\n this.#currentFragment = undefined;\n this.#lastMoof = undefined;\n\n void this.#emitData({\n type,\n timestamp,\n duration,\n data: segment,\n kind,\n });\n },\n onMoof: (data, _position, timestamp) => {\n this.#lastMoof = copyBytes(data);\n this.#lastMoofTimestamp = timestamp;\n },\n onMoov: (data) => {\n this.#moov = copyBytes(data);\n this.#emitInitializationSegment();\n },\n }),\n target: new NullTarget(),\n });\n\n if (this.#audioMeta) {\n this.#audioSource = new EncodedAudioPacketSource(\"opus\");\n output.addAudioTrack(this.#audioSource);\n }\n if (this.#videoMeta) {\n this.#videoSource = new EncodedVideoPacketSource(\"avc\");\n output.addVideoTrack(this.#videoSource);\n }\n\n this.#output = output;\n this.#startPromise = output.start();\n await this.#startPromise;\n }\n\n #emitInitializationSegment() {\n if (this.#initializationEmitted || !this.#ftyp || !this.#moov) {\n return;\n }\n\n this.#initializationEmitted = true;\n void this.#emitData({\n type: \"init\",\n timestamp: 0,\n duration: 0,\n data: concatBytes(this.#ftyp, this.#moov),\n kind: this.#defaultKind(),\n });\n }\n\n #emitData(data: Mp4Data | { eol: true }) {\n const next = this.#onDataOperation.then(() => this.onData.execute(data));\n this.#onDataOperation = next;\n return next;\n }\n\n async #flushOnData() {\n await this.#onDataOperation;\n }\n\n #enqueueOperation(operation: () => Promise<void>) {\n const next = this.#operation.then(operation);\n this.#operation = next;\n return next;\n }\n\n #defaultKind(): TrackKind {\n return this.props.track.video ? \"video\" : \"audio\";\n }\n\n async #flushPendingFrame(track: TrackKind) {\n const buffered = track === \"audio\" ? this.#audioFrame : this.#videoFrame;\n if (!buffered) {\n return;\n }\n\n const duration =\n track === \"audio\" ? this.#lastAudioDuration : this.#lastVideoDuration;\n await this.#writePacket(buffered, duration);\n\n if (track === \"audio\") {\n this.#audioFrame = undefined;\n } else {\n this.#videoFrame = undefined;\n }\n }\n\n async #processFrame(\n frame: EncodedChunk & {\n track: TrackKind;\n },\n ) {\n const buffered =\n frame.track === \"audio\" ? this.#audioFrame : this.#videoFrame;\n if (!buffered) {\n if (frame.track === \"audio\") {\n this.#audioFrame = frame;\n } else {\n this.#videoFrame = frame;\n }\n return;\n }\n\n const duration = Math.max(frame.timestamp - buffered.timestamp, 0);\n await this.#writePacket(buffered, duration);\n\n if (frame.track === \"audio\") {\n this.#audioFrame = frame;\n this.#lastAudioDuration = duration;\n } else {\n this.#videoFrame = frame;\n this.#lastVideoDuration = duration;\n }\n }\n\n async #writePacket(\n frame: EncodedChunk & {\n track: TrackKind;\n },\n duration: number,\n ) {\n const data = new Uint8Array(frame.byteLength);\n frame.copyTo(data.buffer);\n\n // Shift only a negative timeline so the first sample is 0. A positive\n // first timestamp keeps origin 0 and is left unchanged.\n if (this.#timestampOrigin[frame.track] == undefined) {\n this.#timestampOrigin[frame.track] = Math.min(0, frame.timestamp);\n }\n const timestamp = Math.max(\n 0,\n frame.timestamp - this.#timestampOrigin[frame.track]!,\n );\n const packet = new EncodedPacket(\n data,\n frame.type,\n timestamp / 1_000_000,\n duration / 1_000_000,\n );\n\n if (frame.track === \"audio\") {\n if (!this.#audioSource || !this.#audioMeta) {\n throw new Error(\"audio track missing\");\n }\n\n await this.#audioSource.add(packet, this.#audioMeta);\n } else {\n if (!this.#videoSource || !this.#videoMeta) {\n throw new Error(\"video track missing\");\n }\n\n await this.#videoSource.add(packet, this.#videoMeta);\n }\n\n this.#rememberFragmentPacket(frame.track, frame.type, timestamp, duration);\n }\n\n #rememberFragmentPacket(\n kind: TrackKind,\n type: EncodedChunk[\"type\"],\n timestamp: number,\n duration: number,\n ) {\n const end = timestamp + duration;\n if (!this.#currentFragment) {\n this.#currentFragment = {\n kind,\n type,\n timestamp,\n duration,\n };\n return;\n }\n\n if (kind === \"video\" && type === \"key\") {\n this.#currentFragment.type = \"key\";\n }\n\n const fragmentEnd = Math.max(\n this.#currentFragment.timestamp + this.#currentFragment.duration,\n end,\n );\n this.#currentFragment.duration =\n fragmentEnd - this.#currentFragment.timestamp;\n }\n}\n\nfunction isDecoderConfig(\n frame: DecoderConfig | EncodedChunk,\n): frame is DecoderConfig {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return (frame as DecoderConfig).codec !== undefined;\n}\n\nfunction isVideoConfig(frame: DecoderConfig): frame is VideoDecoderConfig {\n return (frame as VideoDecoderConfig).codedWidth !== undefined;\n}\n\nexport interface AudioDecoderConfig {\n codec: string;\n description?: ArrayBuffer | undefined;\n numberOfChannels: number;\n sampleRate: number;\n}\n\nexport interface VideoDecoderConfig {\n codec: string;\n codedHeight?: number | undefined;\n codedWidth?: number | undefined;\n description?: ArrayBuffer | undefined;\n displayAspectHeight?: number | undefined;\n displayAspectWidth?: number | undefined;\n optimizeForLatency?: boolean | undefined;\n}\n\ninterface EncodedAudioChunk {\n readonly byteLength: number;\n readonly duration: number | null;\n readonly timestamp: number;\n readonly type: EncodedAudioChunkType;\n copyTo(destination: ArrayBuffer): void;\n}\n\ntype EncodedAudioChunkType = \"delta\" | \"key\";\n\ninterface EncodedVideoChunk {\n readonly byteLength: number;\n readonly duration: number | null;\n readonly timestamp: number;\n readonly type: EncodedVideoChunkType;\n copyTo(destination: ArrayBuffer): void;\n}\n\ntype EncodedVideoChunkType = \"delta\" | \"key\";\n\nexport const mp4SupportedCodecs = [\"avc1\", \"opus\"] as const;\nexport type Mp4SupportedCodec = (typeof mp4SupportedCodecs)[number];\n\nfunction concatBytes(...parts: Uint8Array[]) {\n const size = parts.reduce((sum, part) => sum + part.byteLength, 0);\n const combined = new Uint8Array(size);\n let offset = 0;\n\n for (const part of parts) {\n combined.set(part, offset);\n offset += part.byteLength;\n }\n\n return combined;\n}\n\nfunction copyBytes(data: Uint8Array) {\n return new Uint8Array(data);\n}\n"]}
|
|
@@ -73,7 +73,7 @@ class MP4Base {
|
|
|
73
73
|
this.videoStopped = true;
|
|
74
74
|
if (!this.tracks.some((track) => track.kind === "audio") ||
|
|
75
75
|
this.audioStopped) {
|
|
76
|
-
void this.stop();
|
|
76
|
+
void this.stop().catch(() => undefined);
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
79
|
return;
|
|
@@ -134,7 +134,7 @@ class MP4Base {
|
|
|
134
134
|
this.audioStopped = true;
|
|
135
135
|
if (!this.tracks.some((track) => track.kind === "video") ||
|
|
136
136
|
this.videoStopped) {
|
|
137
|
-
void this.stop();
|
|
137
|
+
void this.stop().catch(() => undefined);
|
|
138
138
|
}
|
|
139
139
|
}
|
|
140
140
|
return;
|
|
@@ -185,7 +185,12 @@ class MP4Base {
|
|
|
185
185
|
return;
|
|
186
186
|
}
|
|
187
187
|
this.stopped = true;
|
|
188
|
-
|
|
188
|
+
try {
|
|
189
|
+
await this.container.stop();
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
// Timestamp / muxer errors must not leak as unhandled rejections.
|
|
193
|
+
}
|
|
189
194
|
await this.output({ eol: true });
|
|
190
195
|
await this.onStopped.execute();
|
|
191
196
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mp4.js","sourceRoot":"","sources":["../../../../../../rtp/src/extra/processor/mp4.ts"],"names":[],"mappings":"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","sourcesContent":["import { Event } from \"../../imports/common\";\n\nimport { OpusRtpPayload } from \"../..\";\nimport {\n type DataType,\n Mp4Container,\n type Mp4SupportedCodec,\n annexb2avcSample,\n annexb2avcc,\n} from \"../container/mp4\";\nimport type { AVProcessor } from \"./interface\";\n\nexport type Mp4Input = {\n frame?: {\n data: Buffer;\n isKeyframe: boolean;\n /**ms */\n time: number;\n };\n eol?: boolean;\n};\n\nexport type Mp4Output =\n | {\n type: DataType;\n timestamp: number;\n duration: number;\n data: Uint8Array;\n eol?: false | undefined;\n kind: \"audio\" | \"video\";\n }\n | {\n eol: true;\n };\n\nexport interface MP4Option {\n /**ms */\n duration?: number;\n encryptionKey?: Buffer;\n strictTimestamp?: boolean;\n}\n\nexport class MP4Base implements AVProcessor<Mp4Input> {\n audioStopped = false;\n private internalStats = {};\n private container: Mp4Container;\n stopped = false;\n onStopped = new Event();\n videoStopped = false;\n\n constructor(\n public tracks: Track[],\n private output: (output: Mp4Output) => void | Promise<void>,\n private options: MP4Option = {},\n ) {\n this.container = new Mp4Container({\n track: {\n audio: !!this.tracks.find((t) => t.kind === \"audio\"),\n video: !!this.tracks.find((t) => t.kind === \"video\"),\n },\n });\n this.container.onData.subscribe(async (data) => {\n await this.output(data);\n });\n }\n\n toJSON(): Record<string, any> {\n return {\n ...this.internalStats,\n };\n }\n\n processVideoInput = ({ eol, frame }: Mp4Input) => {\n if (this.stopped) {\n return;\n }\n\n if (!frame) {\n if (eol) {\n this.videoStopped = true;\n if (\n !this.tracks.some((track) => track.kind === \"audio\") ||\n this.audioStopped\n ) {\n void this.stop();\n }\n }\n return;\n }\n\n const track = this.tracks.find((t) => t.kind === \"video\")!;\n\n this.videoStopped = false;\n if (!this.container.videoTrack) {\n if (frame.isKeyframe) {\n const avcc = annexb2avcc(frame.data);\n const sample = annexb2avcSample(frame.data);\n\n const [displayAspectWidth, displayAspectHeight] = computeRatio(\n track.width!,\n track.height!,\n );\n\n this.container.write({\n codec: avccToCodecString(avcc),\n codedWidth: track.width,\n codedHeight: track.height,\n description: toArrayBuffer(Buffer.from(avcc)),\n displayAspectWidth,\n displayAspectHeight,\n track: \"video\",\n });\n this.container.write({\n byteLength: sample.length,\n duration: null,\n timestamp: frame.time * 1000,\n type: \"key\",\n copyTo: (destination) => {\n new Uint8Array(destination).set(sample);\n },\n track: \"video\",\n });\n }\n } else {\n const sample = annexb2avcSample(frame.data);\n this.container.write({\n byteLength: sample.length,\n duration: null,\n timestamp: frame.time * 1000,\n type: frame.isKeyframe ? \"key\" : \"delta\",\n copyTo: (destination) => {\n new Uint8Array(destination).set(sample);\n },\n track: \"video\",\n });\n }\n };\n\n processAudioInput = ({ eol, frame }: Mp4Input) => {\n if (this.stopped) {\n return;\n }\n\n if (!frame) {\n if (eol) {\n this.audioStopped = true;\n if (\n !this.tracks.some((track) => track.kind === \"video\") ||\n this.videoStopped\n ) {\n void this.stop();\n }\n }\n return;\n }\n\n const track = this.tracks.find((t) => t.kind === \"audio\")!;\n\n this.audioStopped = false;\n if (!this.container.audioTrack) {\n this.container.write({\n codec: track.codec,\n description: toArrayBuffer(OpusRtpPayload.createCodecPrivate()),\n numberOfChannels: 2,\n sampleRate: track.clockRate,\n track: \"audio\",\n });\n } else {\n this.container.write({\n byteLength: frame.data.length,\n duration: null,\n timestamp: frame.time * 1000,\n type: \"key\",\n copyTo: (destination) => {\n new Uint8Array(destination).set(frame.data);\n },\n track: \"audio\",\n });\n }\n };\n\n protected start() {}\n\n async stop() {\n if (this.stopped) {\n return;\n }\n\n this.stopped = true;\n await this.container.stop();\n await this.output({ eol: true });\n await this.onStopped.execute();\n }\n}\n\nfunction computeRatio(a: number, b: number) {\n function gcd(x: number, y: number) {\n while (y !== 0) {\n const temp = y;\n y = x % y;\n x = temp;\n }\n return x;\n }\n\n const divisor = gcd(a, b);\n return [a / divisor, b / divisor];\n}\n\nexport interface Track {\n width?: number;\n height?: number;\n kind: \"audio\" | \"video\";\n codec: Mp4SupportedCodec;\n clockRate: number;\n trackNumber: number;\n}\n\nfunction avccToCodecString(avcc: Uint8Array) {\n if (avcc.byteLength < 4) {\n throw new Error(\"invalid avcc decoder configuration record\");\n }\n\n return `avc1.${toHex(avcc[1])}${toHex(avcc[2])}${toHex(avcc[3])}`;\n}\n\nfunction toHex(value: number) {\n return value.toString(16).padStart(2, \"0\");\n}\n\nfunction toArrayBuffer(buffer: Buffer) {\n return buffer.buffer.slice(\n buffer.byteOffset,\n buffer.byteOffset + buffer.byteLength,\n ) as ArrayBuffer;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"mp4.js","sourceRoot":"","sources":["../../../../../../rtp/src/extra/processor/mp4.ts"],"names":[],"mappings":"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","sourcesContent":["import { Event } from \"../../imports/common\";\n\nimport { OpusRtpPayload } from \"../..\";\nimport {\n type DataType,\n Mp4Container,\n type Mp4SupportedCodec,\n annexb2avcSample,\n annexb2avcc,\n} from \"../container/mp4\";\nimport type { AVProcessor } from \"./interface\";\n\nexport type Mp4Input = {\n frame?: {\n data: Buffer;\n isKeyframe: boolean;\n /**ms */\n time: number;\n };\n eol?: boolean;\n};\n\nexport type Mp4Output =\n | {\n type: DataType;\n timestamp: number;\n duration: number;\n data: Uint8Array;\n eol?: false | undefined;\n kind: \"audio\" | \"video\";\n }\n | {\n eol: true;\n };\n\nexport interface MP4Option {\n /**ms */\n duration?: number;\n encryptionKey?: Buffer;\n strictTimestamp?: boolean;\n}\n\nexport class MP4Base implements AVProcessor<Mp4Input> {\n audioStopped = false;\n private internalStats = {};\n private container: Mp4Container;\n stopped = false;\n onStopped = new Event();\n videoStopped = false;\n\n constructor(\n public tracks: Track[],\n private output: (output: Mp4Output) => void | Promise<void>,\n private options: MP4Option = {},\n ) {\n this.container = new Mp4Container({\n track: {\n audio: !!this.tracks.find((t) => t.kind === \"audio\"),\n video: !!this.tracks.find((t) => t.kind === \"video\"),\n },\n });\n this.container.onData.subscribe(async (data) => {\n await this.output(data);\n });\n }\n\n toJSON(): Record<string, any> {\n return {\n ...this.internalStats,\n };\n }\n\n processVideoInput = ({ eol, frame }: Mp4Input) => {\n if (this.stopped) {\n return;\n }\n\n if (!frame) {\n if (eol) {\n this.videoStopped = true;\n if (\n !this.tracks.some((track) => track.kind === \"audio\") ||\n this.audioStopped\n ) {\n void this.stop().catch(() => undefined);\n }\n }\n return;\n }\n\n const track = this.tracks.find((t) => t.kind === \"video\")!;\n\n this.videoStopped = false;\n if (!this.container.videoTrack) {\n if (frame.isKeyframe) {\n const avcc = annexb2avcc(frame.data);\n const sample = annexb2avcSample(frame.data);\n\n const [displayAspectWidth, displayAspectHeight] = computeRatio(\n track.width!,\n track.height!,\n );\n\n this.container.write({\n codec: avccToCodecString(avcc),\n codedWidth: track.width,\n codedHeight: track.height,\n description: toArrayBuffer(Buffer.from(avcc)),\n displayAspectWidth,\n displayAspectHeight,\n track: \"video\",\n });\n this.container.write({\n byteLength: sample.length,\n duration: null,\n timestamp: frame.time * 1000,\n type: \"key\",\n copyTo: (destination) => {\n new Uint8Array(destination).set(sample);\n },\n track: \"video\",\n });\n }\n } else {\n const sample = annexb2avcSample(frame.data);\n this.container.write({\n byteLength: sample.length,\n duration: null,\n timestamp: frame.time * 1000,\n type: frame.isKeyframe ? \"key\" : \"delta\",\n copyTo: (destination) => {\n new Uint8Array(destination).set(sample);\n },\n track: \"video\",\n });\n }\n };\n\n processAudioInput = ({ eol, frame }: Mp4Input) => {\n if (this.stopped) {\n return;\n }\n\n if (!frame) {\n if (eol) {\n this.audioStopped = true;\n if (\n !this.tracks.some((track) => track.kind === \"video\") ||\n this.videoStopped\n ) {\n void this.stop().catch(() => undefined);\n }\n }\n return;\n }\n\n const track = this.tracks.find((t) => t.kind === \"audio\")!;\n\n this.audioStopped = false;\n if (!this.container.audioTrack) {\n this.container.write({\n codec: track.codec,\n description: toArrayBuffer(OpusRtpPayload.createCodecPrivate()),\n numberOfChannels: 2,\n sampleRate: track.clockRate,\n track: \"audio\",\n });\n } else {\n this.container.write({\n byteLength: frame.data.length,\n duration: null,\n timestamp: frame.time * 1000,\n type: \"key\",\n copyTo: (destination) => {\n new Uint8Array(destination).set(frame.data);\n },\n track: \"audio\",\n });\n }\n };\n\n protected start() {}\n\n async stop() {\n if (this.stopped) {\n return;\n }\n\n this.stopped = true;\n try {\n await this.container.stop();\n } catch {\n // Timestamp / muxer errors must not leak as unhandled rejections.\n }\n await this.output({ eol: true });\n await this.onStopped.execute();\n }\n}\n\nfunction computeRatio(a: number, b: number) {\n function gcd(x: number, y: number) {\n while (y !== 0) {\n const temp = y;\n y = x % y;\n x = temp;\n }\n return x;\n }\n\n const divisor = gcd(a, b);\n return [a / divisor, b / divisor];\n}\n\nexport interface Track {\n width?: number;\n height?: number;\n kind: \"audio\" | \"video\";\n codec: Mp4SupportedCodec;\n clockRate: number;\n trackNumber: number;\n}\n\nfunction avccToCodecString(avcc: Uint8Array) {\n if (avcc.byteLength < 4) {\n throw new Error(\"invalid avcc decoder configuration record\");\n }\n\n return `avc1.${toHex(avcc[1])}${toHex(avcc[2])}${toHex(avcc[3])}`;\n}\n\nfunction toHex(value: number) {\n return value.toString(16).padStart(2, \"0\");\n}\n\nfunction toArrayBuffer(buffer: Buffer) {\n return buffer.buffer.slice(\n buffer.byteOffset,\n buffer.byteOffset + buffer.byteLength,\n ) as ArrayBuffer;\n}\n"]}
|
|
@@ -55,7 +55,9 @@ class MP4Callback extends mp4_1.MP4Base {
|
|
|
55
55
|
configurable: true,
|
|
56
56
|
writable: true,
|
|
57
57
|
value: () => {
|
|
58
|
-
void this.stop()
|
|
58
|
+
void this.stop()
|
|
59
|
+
.catch(() => undefined)
|
|
60
|
+
.finally(() => {
|
|
59
61
|
this.cb = undefined;
|
|
60
62
|
this.queue.cancel();
|
|
61
63
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mp4Callback.js","sourceRoot":"","sources":["../../../../../../rtp/src/extra/processor/mp4Callback.ts"],"names":[],"mappings":";;;;AAAA,0CAAyC;AAEzC,6BAAqC;AACrC,+BAMe;AAEf,MAAa,WAAY,SAAQ,aAAO;IAGtC,YAAY,MAAe,EAAE,UAAqB,EAAE;QAClD,KAAK,CACH,MAAM,EACN,KAAK,EAAE,MAAM,EAAE,EAAE;YACf,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;YACnB,IAAI,EAAE,EAAE,CAAC;gBACP,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC,EACD,OAAO,CACR,CAAC;QAZI;;;;;WAAyC;QACzC;;;;mBAAQ,IAAI,gBAAY,EAAE;WAAC;QAcnC;;;;mBAAO,CAAC,EAAuC,EAAE,EAAE;gBACjD,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,CAAC;WAAC;QAEF;;;;mBAAa,CAAC,KAAe,EAAE,EAAE;gBAC/B,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;WAAC;QACF;;;;mBAAa,CAAC,KAAe,EAAE,EAAE;gBAC/B,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;WAAC;QAEF;;;;mBAAU,GAAG,EAAE;gBACb,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;
|
|
1
|
+
{"version":3,"file":"mp4Callback.js","sourceRoot":"","sources":["../../../../../../rtp/src/extra/processor/mp4Callback.ts"],"names":[],"mappings":";;;;AAAA,0CAAyC;AAEzC,6BAAqC;AACrC,+BAMe;AAEf,MAAa,WAAY,SAAQ,aAAO;IAGtC,YAAY,MAAe,EAAE,UAAqB,EAAE;QAClD,KAAK,CACH,MAAM,EACN,KAAK,EAAE,MAAM,EAAE,EAAE;YACf,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;YACnB,IAAI,EAAE,EAAE,CAAC;gBACP,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC,EACD,OAAO,CACR,CAAC;QAZI;;;;;WAAyC;QACzC;;;;mBAAQ,IAAI,gBAAY,EAAE;WAAC;QAcnC;;;;mBAAO,CAAC,EAAuC,EAAE,EAAE;gBACjD,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,CAAC;WAAC;QAEF;;;;mBAAa,CAAC,KAAe,EAAE,EAAE;gBAC/B,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;WAAC;QACF;;;;mBAAa,CAAC,KAAe,EAAE,EAAE;gBAC/B,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;WAAC;QAEF;;;;mBAAU,GAAG,EAAE;gBACb,KAAK,IAAI,CAAC,IAAI,EAAE;qBACb,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;qBACtB,OAAO,CAAC,GAAG,EAAE;oBACZ,IAAI,CAAC,EAAE,GAAG,SAAS,CAAC;oBACpB,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBACtB,CAAC,CAAC,CAAC;YACP,CAAC;WAAC;IArBF,CAAC;;AAdH,kCAgDC;;AAXQ;;;;WAAmB,CAAC,IAAY,EAAE,EAAE;QACzC,MAAM,KAAK,GAAG,IAAI,gBAAY,EAAE,CAAC;QACjC,OAAO,KAAK,EAAE,KAAgB,EAAE,EAAE;YAChC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;gBAC1B,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;oBACpB,MAAM,IAAA,qBAAU,EAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBACrC,CAAC;qBAAM,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;gBACvB,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;IACJ,CAAC;EAVsB,CAUrB","sourcesContent":["import { appendFile } from \"fs/promises\";\n\nimport { PromiseQueue } from \"../..\";\nimport {\n MP4Base,\n type MP4Option,\n type Mp4Input,\n type Mp4Output,\n type Track,\n} from \"./mp4\";\n\nexport class MP4Callback extends MP4Base {\n private cb?: (input: Mp4Output) => Promise<void>;\n private queue = new PromiseQueue();\n constructor(tracks: Track[], options: MP4Option = {}) {\n super(\n tracks,\n async (output) => {\n const cb = this.cb;\n if (cb) {\n await this.queue.push(() => cb(output));\n }\n },\n options,\n );\n }\n\n pipe = (cb: (input: Mp4Output) => Promise<void>) => {\n this.cb = cb;\n this.start();\n };\n\n inputAudio = (input: Mp4Input) => {\n this.processAudioInput(input);\n };\n inputVideo = (input: Mp4Input) => {\n this.processVideoInput(input);\n };\n\n destroy = () => {\n void this.stop()\n .catch(() => undefined)\n .finally(() => {\n this.cb = undefined;\n this.queue.cancel();\n });\n };\n\n static saveToFileSystem = (path: string) => {\n const queue = new PromiseQueue();\n return async (value: Mp4Output) => {\n await queue.push(async () => {\n if (\"data\" in value) {\n await appendFile(path, value.data);\n } else if (value.eol) {\n }\n });\n };\n };\n}\n"]}
|
package/lib/sctp/src/chunk.d.ts
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
export declare const SCTP_PADDING_MULTIPLE = 4;
|
|
2
|
+
export declare const SCTP_COMMON_HEADER_SIZE = 12;
|
|
3
|
+
export declare const SCTP_CHUNK_HEADER_SIZE = 4;
|
|
4
|
+
export declare const SCTP_DATA_FIXED_HEADER_SIZE = 12;
|
|
5
|
+
export declare const SCTP_DATA_CHUNK_HEADER_SIZE: number;
|
|
1
6
|
export declare class Chunk {
|
|
2
7
|
flags: number;
|
|
3
8
|
private _body;
|
package/lib/sctp/src/chunk.js
CHANGED
|
@@ -26,11 +26,16 @@
|
|
|
26
26
|
// 192 to 254 - available
|
|
27
27
|
// 255 - reserved for IETF-defined Chunk Extensions
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.CHUNK_BY_TYPE = exports.ShutdownCompleteChunk = exports.ShutdownAckChunk = exports.ShutdownChunk = exports.SackChunk = exports.ReconfigChunk = exports.HeartbeatAckChunk = exports.HeartbeatChunk = exports.ErrorChunk = exports.AbortChunk = exports.BaseParamsChunk = exports.CookieAckChunk = exports.CookieEchoChunk = exports.DataChunk = exports.ForwardTsnChunk = exports.ReConfigChunk = exports.InitAckChunk = exports.InitChunk = exports.BaseInitChunk = exports.Chunk = void 0;
|
|
29
|
+
exports.CHUNK_BY_TYPE = exports.ShutdownCompleteChunk = exports.ShutdownAckChunk = exports.ShutdownChunk = exports.SackChunk = exports.ReconfigChunk = exports.HeartbeatAckChunk = exports.HeartbeatChunk = exports.ErrorChunk = exports.AbortChunk = exports.BaseParamsChunk = exports.CookieAckChunk = exports.CookieEchoChunk = exports.DataChunk = exports.ForwardTsnChunk = exports.ReConfigChunk = exports.InitAckChunk = exports.InitChunk = exports.BaseInitChunk = exports.Chunk = exports.SCTP_DATA_CHUNK_HEADER_SIZE = exports.SCTP_DATA_FIXED_HEADER_SIZE = exports.SCTP_CHUNK_HEADER_SIZE = exports.SCTP_COMMON_HEADER_SIZE = exports.SCTP_PADDING_MULTIPLE = void 0;
|
|
30
30
|
exports.decodeParams = decodeParams;
|
|
31
31
|
exports.parsePacket = parsePacket;
|
|
32
32
|
exports.serializePacket = serializePacket;
|
|
33
33
|
const common_1 = require("./imports/common");
|
|
34
|
+
exports.SCTP_PADDING_MULTIPLE = 4;
|
|
35
|
+
exports.SCTP_COMMON_HEADER_SIZE = 12;
|
|
36
|
+
exports.SCTP_CHUNK_HEADER_SIZE = 4;
|
|
37
|
+
exports.SCTP_DATA_FIXED_HEADER_SIZE = 12;
|
|
38
|
+
exports.SCTP_DATA_CHUNK_HEADER_SIZE = exports.SCTP_CHUNK_HEADER_SIZE + exports.SCTP_DATA_FIXED_HEADER_SIZE;
|
|
34
39
|
class Chunk {
|
|
35
40
|
get body() {
|
|
36
41
|
return this._body;
|
|
@@ -58,10 +63,10 @@ class Chunk {
|
|
|
58
63
|
get bytes() {
|
|
59
64
|
if (!this.body)
|
|
60
65
|
throw new Error();
|
|
61
|
-
const header = Buffer.alloc(
|
|
66
|
+
const header = Buffer.alloc(exports.SCTP_CHUNK_HEADER_SIZE);
|
|
62
67
|
header.writeUInt8(this.type, 0);
|
|
63
68
|
header.writeUInt8(this.flags, 1);
|
|
64
|
-
header.writeUInt16BE(this.body.length +
|
|
69
|
+
header.writeUInt16BE(this.body.length + exports.SCTP_CHUNK_HEADER_SIZE, 2);
|
|
65
70
|
const data = Buffer.concat([
|
|
66
71
|
header,
|
|
67
72
|
this.body,
|
|
@@ -349,8 +354,8 @@ class DataChunk extends Chunk {
|
|
|
349
354
|
}
|
|
350
355
|
}
|
|
351
356
|
get bytes() {
|
|
352
|
-
const length =
|
|
353
|
-
const header = Buffer.alloc(
|
|
357
|
+
const length = exports.SCTP_DATA_CHUNK_HEADER_SIZE + this.userData.length;
|
|
358
|
+
const header = Buffer.alloc(exports.SCTP_DATA_CHUNK_HEADER_SIZE);
|
|
354
359
|
header.writeUInt8(this.type, 0);
|
|
355
360
|
header.writeUInt8(this.flags, 1);
|
|
356
361
|
header.writeUInt16BE(length, 2);
|
|
@@ -695,8 +700,8 @@ exports.CHUNK_BY_TYPE = CHUNK_CLASSES.reduce((acc, cur) => {
|
|
|
695
700
|
return acc;
|
|
696
701
|
}, {});
|
|
697
702
|
function padL(l) {
|
|
698
|
-
const m = l %
|
|
699
|
-
return m ?
|
|
703
|
+
const m = l % exports.SCTP_PADDING_MULTIPLE;
|
|
704
|
+
return m ? exports.SCTP_PADDING_MULTIPLE - m : 0;
|
|
700
705
|
}
|
|
701
706
|
function encodeParams(params) {
|
|
702
707
|
let body = Buffer.from("");
|
|
@@ -723,7 +728,7 @@ function decodeParams(body) {
|
|
|
723
728
|
return params;
|
|
724
729
|
}
|
|
725
730
|
function parsePacket(data) {
|
|
726
|
-
if (data.length <
|
|
731
|
+
if (data.length < exports.SCTP_COMMON_HEADER_SIZE)
|
|
727
732
|
throw new Error("SCTP packet length is less than 12 bytes");
|
|
728
733
|
const sourcePort = data.readUInt16BE(0);
|
|
729
734
|
const destinationPort = data.readUInt16BE(2);
|
|
@@ -732,12 +737,12 @@ function parsePacket(data) {
|
|
|
732
737
|
const expect = (0, common_1.crc32c)(Buffer.concat([
|
|
733
738
|
data.slice(0, 8),
|
|
734
739
|
Buffer.from("\x00\x00\x00\x00"),
|
|
735
|
-
data.slice(
|
|
740
|
+
data.slice(exports.SCTP_COMMON_HEADER_SIZE),
|
|
736
741
|
]));
|
|
737
742
|
if (checkSum !== expect)
|
|
738
743
|
throw new Error("SCTP packet has invalid checksum");
|
|
739
744
|
const chunks = [];
|
|
740
|
-
let pos =
|
|
745
|
+
let pos = exports.SCTP_COMMON_HEADER_SIZE;
|
|
741
746
|
while (pos + 4 <= data.length) {
|
|
742
747
|
const chunkType = data.readUInt8(pos);
|
|
743
748
|
const chunkFlags = data.readUInt8(pos + 1);
|
|
@@ -755,7 +760,7 @@ function parsePacket(data) {
|
|
|
755
760
|
return [sourcePort, destinationPort, verificationTag, chunks];
|
|
756
761
|
}
|
|
757
762
|
function serializePacket(sourcePort, destinationPort, verificationTag, chunk) {
|
|
758
|
-
const header = Buffer.alloc(
|
|
763
|
+
const header = Buffer.alloc(exports.SCTP_COMMON_HEADER_SIZE - 4);
|
|
759
764
|
header.writeUInt16BE(sourcePort, 0);
|
|
760
765
|
header.writeUInt16BE(destinationPort, 2);
|
|
761
766
|
header.writeUInt32BE(verificationTag, 4);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk.js","sourceRoot":"","sources":["../../../../sctp/src/chunk.ts"],"names":[],"mappings":"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","sourcesContent":["// ID Value Chunk Type\n// ----- ----------\n// 0 - Payload Data (DATA)\n// 1 - Initiation (INIT)\n// 2 - Initiation Acknowledgement (INIT ACK)\n// 3 - Selective Acknowledgement (SACK)\n// 4 - Heartbeat Request (HEARTBEAT)\n// 5 - Heartbeat Acknowledgement (HEARTBEAT ACK)\n// 6 - Abort (ABORT)\n// 7 - Shutdown (SHUTDOWN)\n// 8 - Shutdown Acknowledgement (SHUTDOWN ACK)\n// 9 - Operation Error (ERROR)\n// 10 - State Cookie (COOKIE ECHO)\n// 11 - Cookie Acknowledgement (COOKIE ACK)\n// 12 - Reserved for Explicit Congestion Notification Echo\n// (ECNE)\n// 13 - Reserved for Congestion Window Reduced (CWR)\n// 14 - Shutdown Complete (SHUTDOWN COMPLETE)\n// 15 to 62 - available\n// 63 - reserved for IETF-defined Chunk Extensions\n// 64 to 126 - available\n// 127 - reserved for IETF-defined Chunk Extensions\n// 128 to 190 - available\n// 191 - reserved for IETF-defined Chunk Extensions\n// 192 to 254 - available\n// 255 - reserved for IETF-defined Chunk Extensions\n\nimport { crc32c } from \"./imports/common\";\n\nexport class Chunk {\n public get body(): Buffer | undefined {\n return this._body;\n }\n public set body(value: Buffer | undefined) {\n this._body = value;\n }\n static type = -1;\n\n constructor(\n public flags = 0,\n private _body: Buffer | undefined = Buffer.from(\"\"),\n ) {}\n\n get type() {\n return Chunk.type;\n }\n\n get bytes() {\n if (!this.body) throw new Error();\n\n const header = Buffer.alloc(4);\n header.writeUInt8(this.type, 0);\n header.writeUInt8(this.flags, 1);\n header.writeUInt16BE(this.body.length + 4, 2);\n\n const data = Buffer.concat([\n header,\n this.body,\n ...[...Array(padL(this.body.length))].map(() => Buffer.from(\"\\x00\")),\n ]);\n return data;\n }\n}\n\nexport class BaseInitChunk extends Chunk {\n initiateTag: number;\n advertisedRwnd: number;\n outboundStreams: number;\n inboundStreams: number;\n initialTsn: number;\n params: [number, Buffer][];\n\n constructor(\n public flags = 0,\n body?: Buffer,\n ) {\n super(flags, body);\n\n if (body) {\n this.initiateTag = body.readUInt32BE(0);\n this.advertisedRwnd = body.readUInt32BE(4);\n this.outboundStreams = body.readUInt16BE(8);\n this.inboundStreams = body.readUInt16BE(10);\n this.initialTsn = body.readUInt32BE(12);\n this.params = decodeParams(body.slice(16));\n } else {\n this.initiateTag = 0;\n this.advertisedRwnd = 0;\n this.outboundStreams = 0;\n this.inboundStreams = 0;\n this.initialTsn = 0;\n this.params = [];\n }\n }\n\n get body() {\n const body = Buffer.alloc(16);\n body.writeUInt32BE(this.initiateTag, 0);\n body.writeUInt32BE(this.advertisedRwnd, 4);\n body.writeUInt16BE(this.outboundStreams, 8);\n body.writeUInt16BE(this.inboundStreams, 10);\n body.writeUInt32BE(this.initialTsn, 12);\n return Buffer.concat([body, encodeParams(this.params)]);\n }\n}\n\nexport class InitChunk extends BaseInitChunk {\n static type = 1 as const;\n\n get type() {\n return InitChunk.type;\n }\n}\n\nexport class InitAckChunk extends BaseInitChunk {\n static type = 2 as const;\n\n get type() {\n return InitAckChunk.type;\n }\n}\n\nexport class ReConfigChunk extends BaseInitChunk {\n static type = 130 as const;\n\n get type() {\n return ReConfigChunk.type;\n }\n}\n\nexport class ForwardTsnChunk extends Chunk {\n static type = 192 as const;\n streams: [number, number][] = [];\n cumulativeTsn: number;\n\n constructor(\n public flags = 0,\n body: Buffer | undefined,\n ) {\n super(flags, body);\n\n if (body) {\n this.cumulativeTsn = body.readUInt32BE(0);\n let pos = 4;\n while (pos < body.length) {\n this.streams.push([body.readUInt16BE(pos), body.readUInt16BE(pos + 2)]);\n pos += 4;\n }\n } else {\n this.cumulativeTsn = 0;\n }\n }\n\n get type() {\n return ForwardTsnChunk.type;\n }\n\n set body(_: Buffer) {}\n\n get body() {\n const body = Buffer.alloc(4);\n body.writeUInt32BE(this.cumulativeTsn, 0);\n return Buffer.concat([\n body,\n ...this.streams.map(([id, seq]) => {\n const streamBuffer = Buffer.alloc(4);\n streamBuffer.writeUInt16BE(id, 0);\n streamBuffer.writeUInt16BE(seq, 2);\n return streamBuffer;\n }),\n ]);\n }\n}\n\nexport class DataChunk extends Chunk {\n static type = 0 as const;\n get type() {\n return DataChunk.type;\n }\n tsn: number = 0;\n streamId: number = 0;\n streamSeqNum: number = 0;\n protocol: number = 0;\n userData: Buffer = Buffer.from(\"\");\n abandoned: boolean = false;\n acked: boolean = false;\n misses: number = 0;\n retransmit: boolean = false;\n sentCount: number = 0;\n bookSize: number = 0;\n expiry?: number;\n maxRetransmits?: number;\n sentTime?: number;\n\n constructor(\n public flags = 0,\n body: Buffer | undefined,\n ) {\n super(flags, body);\n if (body) {\n this.tsn = body.readUInt32BE(0);\n this.streamId = body.readUInt16BE(4);\n this.streamSeqNum = body.readUInt16BE(6);\n this.protocol = body.readUInt32BE(8);\n this.userData = body.slice(12);\n }\n }\n\n get bytes() {\n const length = 16 + this.userData.length;\n const header = Buffer.alloc(16);\n header.writeUInt8(this.type, 0);\n header.writeUInt8(this.flags, 1);\n header.writeUInt16BE(length, 2);\n header.writeUInt32BE(this.tsn, 4);\n header.writeUInt16BE(this.streamId, 8);\n header.writeUInt16BE(this.streamSeqNum, 10);\n header.writeUInt32BE(this.protocol, 12);\n\n let data = Buffer.concat([header, this.userData]);\n if (length % 4) {\n data = Buffer.concat([\n data,\n ...[...Array(padL(length))].map(() => Buffer.from(\"\\x00\")),\n ]);\n }\n return data;\n }\n}\n\nexport class CookieEchoChunk extends Chunk {\n static type = 10 as const;\n\n get type() {\n return CookieEchoChunk.type;\n }\n}\n\nexport class CookieAckChunk extends Chunk {\n static type = 11 as const;\n\n get type() {\n return CookieAckChunk.type;\n }\n}\n\nexport class BaseParamsChunk extends Chunk {\n params: [number, Buffer][] = [];\n constructor(\n public flags = 0,\n body: Buffer | undefined = undefined,\n ) {\n super(flags, body);\n if (body) {\n this.params = decodeParams(body);\n }\n }\n\n get body() {\n return encodeParams(this.params);\n }\n}\n\nexport class AbortChunk extends BaseParamsChunk {\n static type = 6 as const;\n\n get type() {\n return AbortChunk.type;\n }\n}\n\nexport class ErrorChunk extends BaseParamsChunk {\n static type = 9 as const;\n static readonly CODE = {\n InvalidStreamIdentifier: 1,\n MissingMandatoryParameter: 2,\n StaleCookieError: 3,\n OutofResource: 4,\n UnresolvableAddress: 5,\n UnrecognizedChunkType: 6,\n InvalidMandatoryParameter: 7,\n UnrecognizedParameters: 8,\n NoUserData: 9,\n CookieReceivedWhileShuttingDown: 10,\n RestartofanAssociationwithNewAddresses: 11,\n UserInitiatedAbort: 12,\n ProtocolViolation: 13,\n } as const;\n\n get type() {\n return ErrorChunk.type;\n }\n\n get descriptions() {\n return this.params.map(([code, body]) => {\n const name = (Object.entries(ErrorChunk.CODE).find(\n ([, num]) => num === code,\n ) || [])[0];\n return { name, body };\n });\n }\n}\n\nexport class HeartbeatChunk extends BaseParamsChunk {\n static type = 4 as const;\n\n get type() {\n return HeartbeatChunk.type;\n }\n}\n\nexport class HeartbeatAckChunk extends BaseParamsChunk {\n static type = 5 as const;\n\n get type() {\n return HeartbeatAckChunk.type;\n }\n}\n\n// https://tools.ietf.org/html/rfc6525#section-3.1\n// chunkReconfig represents an SCTP Chunk used to reconfigure streams.\n//\n// 0 1 2 3\n// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | Type = 130 | Chunk Flags | Chunk Length |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// \\ \\\n// / Re-configuration Parameter /\n// \\ \\\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// \\ \\\n// / Re-configuration Parameter (optional) /\n// \\ \\\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\nexport class ReconfigChunk extends BaseParamsChunk {\n static type = 130 as const;\n\n get type() {\n return ReconfigChunk.type;\n }\n}\n\nexport class SackChunk extends Chunk {\n static type = 3;\n get type() {\n return SackChunk.type;\n }\n\n gaps: [number, number][] = [];\n duplicates: number[] = [];\n cumulativeTsn = 0;\n advertisedRwnd = 0;\n\n constructor(\n public flags = 0,\n body: Buffer | undefined,\n ) {\n super(flags, body);\n\n if (body) {\n this.cumulativeTsn = body.readUInt32BE(0);\n this.advertisedRwnd = body.readUInt32BE(4);\n const nbGaps = body.readUInt16BE(8);\n const nbDuplicates = body.readUInt16BE(10);\n\n let pos = 12;\n\n [...Array(nbGaps)].forEach(() => {\n this.gaps.push([body.readUInt16BE(pos), body.readUInt16BE(pos + 2)]);\n pos += 4;\n });\n\n [...Array(nbDuplicates)].forEach(() => {\n this.duplicates.push(body.readUInt32BE(pos));\n pos += 4;\n });\n }\n }\n\n get bytes() {\n const length = 16 + 4 * (this.gaps.length + this.duplicates.length);\n const header = Buffer.alloc(16);\n header.writeUInt8(this.type, 0);\n header.writeUInt8(this.flags, 1);\n header.writeUInt16BE(length, 2);\n header.writeUInt32BE(this.cumulativeTsn, 4);\n header.writeUInt32BE(this.advertisedRwnd, 8);\n header.writeUInt16BE(this.gaps.length, 12);\n header.writeUInt16BE(this.duplicates.length, 14);\n\n let data = Buffer.concat([\n header,\n ...this.gaps.map((gap) => {\n const gapBuffer = Buffer.alloc(4);\n gapBuffer.writeUInt16BE(gap[0], 0);\n gapBuffer.writeUInt16BE(gap[1], 2);\n return gapBuffer;\n }),\n ]);\n data = Buffer.concat([\n data,\n ...this.duplicates.map((tsn) => {\n const tsnBuffer = Buffer.alloc(4);\n tsnBuffer.writeUInt32BE(tsn, 0);\n return tsnBuffer;\n }),\n ]);\n return data;\n }\n}\n\nexport class ShutdownChunk extends Chunk {\n static type = 7;\n get type() {\n return ShutdownChunk.type;\n }\n\n cumulativeTsn = 0;\n\n constructor(\n public flags = 0,\n body: Buffer | undefined,\n ) {\n super(flags, body);\n\n if (body) {\n this.cumulativeTsn = body.readUInt32BE(0);\n }\n }\n\n get body() {\n const body = Buffer.alloc(4);\n body.writeUInt32BE(this.cumulativeTsn, 0);\n return body;\n }\n}\n\nexport class ShutdownAckChunk extends Chunk {\n static type = 8;\n get type() {\n return ShutdownAckChunk.type;\n }\n}\n\nexport class ShutdownCompleteChunk extends Chunk {\n static type = 14;\n get type() {\n return ShutdownCompleteChunk.type;\n }\n}\n\nconst CHUNK_CLASSES: (typeof Chunk)[] = [\n DataChunk,\n InitChunk,\n InitAckChunk,\n SackChunk,\n HeartbeatChunk,\n HeartbeatAckChunk,\n AbortChunk,\n ShutdownChunk,\n ShutdownAckChunk,\n ErrorChunk,\n CookieEchoChunk,\n CookieAckChunk,\n ShutdownCompleteChunk,\n ReconfigChunk,\n ForwardTsnChunk,\n];\n\nexport const CHUNK_BY_TYPE = CHUNK_CLASSES.reduce(\n (acc: { [key: string]: typeof Chunk }, cur) => {\n acc[cur.type] = cur;\n return acc;\n },\n {},\n);\n\nfunction padL(l: number) {\n const m = l % 4;\n return m ? 4 - m : 0;\n}\n\nfunction encodeParams(params: [number, Buffer][]) {\n let body = Buffer.from(\"\");\n let padding = Buffer.from(\"\");\n params.forEach(([type, value]) => {\n const length = value.length + 4;\n const paramHeader = Buffer.alloc(4);\n paramHeader.writeUInt16BE(type, 0);\n paramHeader.writeUInt16BE(length, 2);\n body = Buffer.concat([body, padding, paramHeader, value]);\n padding = Buffer.concat(\n [...Array(padL(length))].map(() => Buffer.from(\"\\x00\")),\n );\n });\n return body;\n}\n\nexport function decodeParams(body: Buffer): [number, Buffer][] {\n const params: [number, Buffer][] = [];\n let pos = 0;\n while (pos <= body.length - 4) {\n const type = body.readUInt16BE(pos);\n const length = body.readUInt16BE(pos + 2);\n params.push([type, body.slice(pos + 4, pos + length)]);\n pos += length + padL(length);\n }\n return params;\n}\n\nexport function parsePacket(data: Buffer): [number, number, number, Chunk[]] {\n if (data.length < 12)\n throw new Error(\"SCTP packet length is less than 12 bytes\");\n\n const sourcePort = data.readUInt16BE(0);\n const destinationPort = data.readUInt16BE(2);\n const verificationTag = data.readUInt32BE(4);\n\n const checkSum = data.readUInt32LE(8);\n\n const expect = crc32c(\n Buffer.concat([\n data.slice(0, 8),\n Buffer.from(\"\\x00\\x00\\x00\\x00\"),\n data.slice(12),\n ]),\n );\n\n if (checkSum !== expect) throw new Error(\"SCTP packet has invalid checksum\");\n\n const chunks: Chunk[] = [];\n let pos = 12;\n while (pos + 4 <= data.length) {\n const chunkType = data.readUInt8(pos);\n const chunkFlags = data.readUInt8(pos + 1);\n const chunkLength = data.readUInt16BE(pos + 2);\n const chunkBody = data.slice(pos + 4, pos + chunkLength);\n const ChunkClass = CHUNK_BY_TYPE[chunkType.toString()];\n if (ChunkClass) {\n chunks.push(new ChunkClass(chunkFlags, chunkBody));\n } else {\n throw new Error(\"unknown\");\n }\n pos += chunkLength + padL(chunkLength);\n }\n return [sourcePort, destinationPort, verificationTag, chunks];\n}\n\nexport function serializePacket(\n sourcePort: number,\n destinationPort: number,\n verificationTag: number,\n chunk: Chunk,\n) {\n const header = Buffer.alloc(8);\n header.writeUInt16BE(sourcePort, 0);\n header.writeUInt16BE(destinationPort, 2);\n header.writeUInt32BE(verificationTag, 4);\n\n const body = chunk.bytes;\n\n const checksum: number = crc32c(\n Buffer.concat([header, Buffer.from(\"\\x00\\x00\\x00\\x00\"), body]),\n );\n const checkSumBuf = Buffer.alloc(4);\n checkSumBuf.writeUInt32LE(checksum, 0);\n\n const packet = Buffer.concat([header, checkSumBuf, body]);\n\n return packet;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"chunk.js","sourceRoot":"","sources":["../../../../sctp/src/chunk.ts"],"names":[],"mappings":"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","sourcesContent":["// ID Value Chunk Type\n// ----- ----------\n// 0 - Payload Data (DATA)\n// 1 - Initiation (INIT)\n// 2 - Initiation Acknowledgement (INIT ACK)\n// 3 - Selective Acknowledgement (SACK)\n// 4 - Heartbeat Request (HEARTBEAT)\n// 5 - Heartbeat Acknowledgement (HEARTBEAT ACK)\n// 6 - Abort (ABORT)\n// 7 - Shutdown (SHUTDOWN)\n// 8 - Shutdown Acknowledgement (SHUTDOWN ACK)\n// 9 - Operation Error (ERROR)\n// 10 - State Cookie (COOKIE ECHO)\n// 11 - Cookie Acknowledgement (COOKIE ACK)\n// 12 - Reserved for Explicit Congestion Notification Echo\n// (ECNE)\n// 13 - Reserved for Congestion Window Reduced (CWR)\n// 14 - Shutdown Complete (SHUTDOWN COMPLETE)\n// 15 to 62 - available\n// 63 - reserved for IETF-defined Chunk Extensions\n// 64 to 126 - available\n// 127 - reserved for IETF-defined Chunk Extensions\n// 128 to 190 - available\n// 191 - reserved for IETF-defined Chunk Extensions\n// 192 to 254 - available\n// 255 - reserved for IETF-defined Chunk Extensions\n\nimport { crc32c } from \"./imports/common\";\n\nexport const SCTP_PADDING_MULTIPLE = 4;\nexport const SCTP_COMMON_HEADER_SIZE = 12;\nexport const SCTP_CHUNK_HEADER_SIZE = 4;\nexport const SCTP_DATA_FIXED_HEADER_SIZE = 12;\nexport const SCTP_DATA_CHUNK_HEADER_SIZE =\n SCTP_CHUNK_HEADER_SIZE + SCTP_DATA_FIXED_HEADER_SIZE;\n\nexport class Chunk {\n public get body(): Buffer | undefined {\n return this._body;\n }\n public set body(value: Buffer | undefined) {\n this._body = value;\n }\n static type = -1;\n\n constructor(\n public flags = 0,\n private _body: Buffer | undefined = Buffer.from(\"\"),\n ) {}\n\n get type() {\n return Chunk.type;\n }\n\n get bytes() {\n if (!this.body) throw new Error();\n\n const header = Buffer.alloc(SCTP_CHUNK_HEADER_SIZE);\n header.writeUInt8(this.type, 0);\n header.writeUInt8(this.flags, 1);\n header.writeUInt16BE(this.body.length + SCTP_CHUNK_HEADER_SIZE, 2);\n\n const data = Buffer.concat([\n header,\n this.body,\n ...[...Array(padL(this.body.length))].map(() => Buffer.from(\"\\x00\")),\n ]);\n return data;\n }\n}\n\nexport class BaseInitChunk extends Chunk {\n initiateTag: number;\n advertisedRwnd: number;\n outboundStreams: number;\n inboundStreams: number;\n initialTsn: number;\n params: [number, Buffer][];\n\n constructor(\n public flags = 0,\n body?: Buffer,\n ) {\n super(flags, body);\n\n if (body) {\n this.initiateTag = body.readUInt32BE(0);\n this.advertisedRwnd = body.readUInt32BE(4);\n this.outboundStreams = body.readUInt16BE(8);\n this.inboundStreams = body.readUInt16BE(10);\n this.initialTsn = body.readUInt32BE(12);\n this.params = decodeParams(body.slice(16));\n } else {\n this.initiateTag = 0;\n this.advertisedRwnd = 0;\n this.outboundStreams = 0;\n this.inboundStreams = 0;\n this.initialTsn = 0;\n this.params = [];\n }\n }\n\n get body() {\n const body = Buffer.alloc(16);\n body.writeUInt32BE(this.initiateTag, 0);\n body.writeUInt32BE(this.advertisedRwnd, 4);\n body.writeUInt16BE(this.outboundStreams, 8);\n body.writeUInt16BE(this.inboundStreams, 10);\n body.writeUInt32BE(this.initialTsn, 12);\n return Buffer.concat([body, encodeParams(this.params)]);\n }\n}\n\nexport class InitChunk extends BaseInitChunk {\n static type = 1 as const;\n\n get type() {\n return InitChunk.type;\n }\n}\n\nexport class InitAckChunk extends BaseInitChunk {\n static type = 2 as const;\n\n get type() {\n return InitAckChunk.type;\n }\n}\n\nexport class ReConfigChunk extends BaseInitChunk {\n static type = 130 as const;\n\n get type() {\n return ReConfigChunk.type;\n }\n}\n\nexport class ForwardTsnChunk extends Chunk {\n static type = 192 as const;\n streams: [number, number][] = [];\n cumulativeTsn: number;\n\n constructor(\n public flags = 0,\n body: Buffer | undefined,\n ) {\n super(flags, body);\n\n if (body) {\n this.cumulativeTsn = body.readUInt32BE(0);\n let pos = 4;\n while (pos < body.length) {\n this.streams.push([body.readUInt16BE(pos), body.readUInt16BE(pos + 2)]);\n pos += 4;\n }\n } else {\n this.cumulativeTsn = 0;\n }\n }\n\n get type() {\n return ForwardTsnChunk.type;\n }\n\n set body(_: Buffer) {}\n\n get body() {\n const body = Buffer.alloc(4);\n body.writeUInt32BE(this.cumulativeTsn, 0);\n return Buffer.concat([\n body,\n ...this.streams.map(([id, seq]) => {\n const streamBuffer = Buffer.alloc(4);\n streamBuffer.writeUInt16BE(id, 0);\n streamBuffer.writeUInt16BE(seq, 2);\n return streamBuffer;\n }),\n ]);\n }\n}\n\nexport class DataChunk extends Chunk {\n static type = 0 as const;\n get type() {\n return DataChunk.type;\n }\n tsn: number = 0;\n streamId: number = 0;\n streamSeqNum: number = 0;\n protocol: number = 0;\n userData: Buffer = Buffer.from(\"\");\n abandoned: boolean = false;\n acked: boolean = false;\n misses: number = 0;\n retransmit: boolean = false;\n sentCount: number = 0;\n bookSize: number = 0;\n expiry?: number;\n maxRetransmits?: number;\n sentTime?: number;\n\n constructor(\n public flags = 0,\n body: Buffer | undefined,\n ) {\n super(flags, body);\n if (body) {\n this.tsn = body.readUInt32BE(0);\n this.streamId = body.readUInt16BE(4);\n this.streamSeqNum = body.readUInt16BE(6);\n this.protocol = body.readUInt32BE(8);\n this.userData = body.slice(12);\n }\n }\n\n get bytes() {\n const length = SCTP_DATA_CHUNK_HEADER_SIZE + this.userData.length;\n const header = Buffer.alloc(SCTP_DATA_CHUNK_HEADER_SIZE);\n header.writeUInt8(this.type, 0);\n header.writeUInt8(this.flags, 1);\n header.writeUInt16BE(length, 2);\n header.writeUInt32BE(this.tsn, 4);\n header.writeUInt16BE(this.streamId, 8);\n header.writeUInt16BE(this.streamSeqNum, 10);\n header.writeUInt32BE(this.protocol, 12);\n\n let data = Buffer.concat([header, this.userData]);\n if (length % 4) {\n data = Buffer.concat([\n data,\n ...[...Array(padL(length))].map(() => Buffer.from(\"\\x00\")),\n ]);\n }\n return data;\n }\n}\n\nexport class CookieEchoChunk extends Chunk {\n static type = 10 as const;\n\n get type() {\n return CookieEchoChunk.type;\n }\n}\n\nexport class CookieAckChunk extends Chunk {\n static type = 11 as const;\n\n get type() {\n return CookieAckChunk.type;\n }\n}\n\nexport class BaseParamsChunk extends Chunk {\n params: [number, Buffer][] = [];\n constructor(\n public flags = 0,\n body: Buffer | undefined = undefined,\n ) {\n super(flags, body);\n if (body) {\n this.params = decodeParams(body);\n }\n }\n\n get body() {\n return encodeParams(this.params);\n }\n}\n\nexport class AbortChunk extends BaseParamsChunk {\n static type = 6 as const;\n\n get type() {\n return AbortChunk.type;\n }\n}\n\nexport class ErrorChunk extends BaseParamsChunk {\n static type = 9 as const;\n static readonly CODE = {\n InvalidStreamIdentifier: 1,\n MissingMandatoryParameter: 2,\n StaleCookieError: 3,\n OutofResource: 4,\n UnresolvableAddress: 5,\n UnrecognizedChunkType: 6,\n InvalidMandatoryParameter: 7,\n UnrecognizedParameters: 8,\n NoUserData: 9,\n CookieReceivedWhileShuttingDown: 10,\n RestartofanAssociationwithNewAddresses: 11,\n UserInitiatedAbort: 12,\n ProtocolViolation: 13,\n } as const;\n\n get type() {\n return ErrorChunk.type;\n }\n\n get descriptions() {\n return this.params.map(([code, body]) => {\n const name = (Object.entries(ErrorChunk.CODE).find(\n ([, num]) => num === code,\n ) || [])[0];\n return { name, body };\n });\n }\n}\n\nexport class HeartbeatChunk extends BaseParamsChunk {\n static type = 4 as const;\n\n get type() {\n return HeartbeatChunk.type;\n }\n}\n\nexport class HeartbeatAckChunk extends BaseParamsChunk {\n static type = 5 as const;\n\n get type() {\n return HeartbeatAckChunk.type;\n }\n}\n\n// https://tools.ietf.org/html/rfc6525#section-3.1\n// chunkReconfig represents an SCTP Chunk used to reconfigure streams.\n//\n// 0 1 2 3\n// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | Type = 130 | Chunk Flags | Chunk Length |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// \\ \\\n// / Re-configuration Parameter /\n// \\ \\\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// \\ \\\n// / Re-configuration Parameter (optional) /\n// \\ \\\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\nexport class ReconfigChunk extends BaseParamsChunk {\n static type = 130 as const;\n\n get type() {\n return ReconfigChunk.type;\n }\n}\n\nexport class SackChunk extends Chunk {\n static type = 3;\n get type() {\n return SackChunk.type;\n }\n\n gaps: [number, number][] = [];\n duplicates: number[] = [];\n cumulativeTsn = 0;\n advertisedRwnd = 0;\n\n constructor(\n public flags = 0,\n body: Buffer | undefined,\n ) {\n super(flags, body);\n\n if (body) {\n this.cumulativeTsn = body.readUInt32BE(0);\n this.advertisedRwnd = body.readUInt32BE(4);\n const nbGaps = body.readUInt16BE(8);\n const nbDuplicates = body.readUInt16BE(10);\n\n let pos = 12;\n\n [...Array(nbGaps)].forEach(() => {\n this.gaps.push([body.readUInt16BE(pos), body.readUInt16BE(pos + 2)]);\n pos += 4;\n });\n\n [...Array(nbDuplicates)].forEach(() => {\n this.duplicates.push(body.readUInt32BE(pos));\n pos += 4;\n });\n }\n }\n\n get bytes() {\n const length = 16 + 4 * (this.gaps.length + this.duplicates.length);\n const header = Buffer.alloc(16);\n header.writeUInt8(this.type, 0);\n header.writeUInt8(this.flags, 1);\n header.writeUInt16BE(length, 2);\n header.writeUInt32BE(this.cumulativeTsn, 4);\n header.writeUInt32BE(this.advertisedRwnd, 8);\n header.writeUInt16BE(this.gaps.length, 12);\n header.writeUInt16BE(this.duplicates.length, 14);\n\n let data = Buffer.concat([\n header,\n ...this.gaps.map((gap) => {\n const gapBuffer = Buffer.alloc(4);\n gapBuffer.writeUInt16BE(gap[0], 0);\n gapBuffer.writeUInt16BE(gap[1], 2);\n return gapBuffer;\n }),\n ]);\n data = Buffer.concat([\n data,\n ...this.duplicates.map((tsn) => {\n const tsnBuffer = Buffer.alloc(4);\n tsnBuffer.writeUInt32BE(tsn, 0);\n return tsnBuffer;\n }),\n ]);\n return data;\n }\n}\n\nexport class ShutdownChunk extends Chunk {\n static type = 7;\n get type() {\n return ShutdownChunk.type;\n }\n\n cumulativeTsn = 0;\n\n constructor(\n public flags = 0,\n body: Buffer | undefined,\n ) {\n super(flags, body);\n\n if (body) {\n this.cumulativeTsn = body.readUInt32BE(0);\n }\n }\n\n get body() {\n const body = Buffer.alloc(4);\n body.writeUInt32BE(this.cumulativeTsn, 0);\n return body;\n }\n}\n\nexport class ShutdownAckChunk extends Chunk {\n static type = 8;\n get type() {\n return ShutdownAckChunk.type;\n }\n}\n\nexport class ShutdownCompleteChunk extends Chunk {\n static type = 14;\n get type() {\n return ShutdownCompleteChunk.type;\n }\n}\n\nconst CHUNK_CLASSES: (typeof Chunk)[] = [\n DataChunk,\n InitChunk,\n InitAckChunk,\n SackChunk,\n HeartbeatChunk,\n HeartbeatAckChunk,\n AbortChunk,\n ShutdownChunk,\n ShutdownAckChunk,\n ErrorChunk,\n CookieEchoChunk,\n CookieAckChunk,\n ShutdownCompleteChunk,\n ReconfigChunk,\n ForwardTsnChunk,\n];\n\nexport const CHUNK_BY_TYPE = CHUNK_CLASSES.reduce(\n (acc: { [key: string]: typeof Chunk }, cur) => {\n acc[cur.type] = cur;\n return acc;\n },\n {},\n);\n\nfunction padL(l: number) {\n const m = l % SCTP_PADDING_MULTIPLE;\n return m ? SCTP_PADDING_MULTIPLE - m : 0;\n}\n\nfunction encodeParams(params: [number, Buffer][]) {\n let body = Buffer.from(\"\");\n let padding = Buffer.from(\"\");\n params.forEach(([type, value]) => {\n const length = value.length + 4;\n const paramHeader = Buffer.alloc(4);\n paramHeader.writeUInt16BE(type, 0);\n paramHeader.writeUInt16BE(length, 2);\n body = Buffer.concat([body, padding, paramHeader, value]);\n padding = Buffer.concat(\n [...Array(padL(length))].map(() => Buffer.from(\"\\x00\")),\n );\n });\n return body;\n}\n\nexport function decodeParams(body: Buffer): [number, Buffer][] {\n const params: [number, Buffer][] = [];\n let pos = 0;\n while (pos <= body.length - 4) {\n const type = body.readUInt16BE(pos);\n const length = body.readUInt16BE(pos + 2);\n params.push([type, body.slice(pos + 4, pos + length)]);\n pos += length + padL(length);\n }\n return params;\n}\n\nexport function parsePacket(data: Buffer): [number, number, number, Chunk[]] {\n if (data.length < SCTP_COMMON_HEADER_SIZE)\n throw new Error(\"SCTP packet length is less than 12 bytes\");\n\n const sourcePort = data.readUInt16BE(0);\n const destinationPort = data.readUInt16BE(2);\n const verificationTag = data.readUInt32BE(4);\n\n const checkSum = data.readUInt32LE(8);\n\n const expect = crc32c(\n Buffer.concat([\n data.slice(0, 8),\n Buffer.from(\"\\x00\\x00\\x00\\x00\"),\n data.slice(SCTP_COMMON_HEADER_SIZE),\n ]),\n );\n\n if (checkSum !== expect) throw new Error(\"SCTP packet has invalid checksum\");\n\n const chunks: Chunk[] = [];\n let pos = SCTP_COMMON_HEADER_SIZE;\n while (pos + 4 <= data.length) {\n const chunkType = data.readUInt8(pos);\n const chunkFlags = data.readUInt8(pos + 1);\n const chunkLength = data.readUInt16BE(pos + 2);\n const chunkBody = data.slice(pos + 4, pos + chunkLength);\n const ChunkClass = CHUNK_BY_TYPE[chunkType.toString()];\n if (ChunkClass) {\n chunks.push(new ChunkClass(chunkFlags, chunkBody));\n } else {\n throw new Error(\"unknown\");\n }\n pos += chunkLength + padL(chunkLength);\n }\n return [sourcePort, destinationPort, verificationTag, chunks];\n}\n\nexport function serializePacket(\n sourcePort: number,\n destinationPort: number,\n verificationTag: number,\n chunk: Chunk,\n) {\n const header = Buffer.alloc(SCTP_COMMON_HEADER_SIZE - 4);\n header.writeUInt16BE(sourcePort, 0);\n header.writeUInt16BE(destinationPort, 2);\n header.writeUInt32BE(verificationTag, 4);\n\n const body = chunk.bytes;\n\n const checksum: number = crc32c(\n Buffer.concat([header, Buffer.from(\"\\x00\\x00\\x00\\x00\"), body]),\n );\n const checkSumBuf = Buffer.alloc(4);\n checkSumBuf.writeUInt32LE(checksum, 0);\n\n const packet = Buffer.concat([header, checkSumBuf, body]);\n\n return packet;\n}\n"]}
|
package/lib/sctp/src/index.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export { SCTP_STATE, WEBRTC_PPID } from "./const";
|
|
2
|
-
export { SCTP } from "./sctp";
|
|
2
|
+
export { SCTP, DEFAULT_SCTP_MTU, maxPayloadSizeForMtu, validateSctpMtu, } from "./sctp";
|
|
3
|
+
export type { SCTPOptions } from "./sctp";
|
|
4
|
+
export { SCTP_COMMON_HEADER_SIZE, SCTP_CHUNK_HEADER_SIZE, SCTP_DATA_FIXED_HEADER_SIZE, SCTP_DATA_CHUNK_HEADER_SIZE, SCTP_PADDING_MULTIPLE, } from "./chunk";
|
|
3
5
|
export { createUdpTransport, UdpTransport } from "./transport";
|
|
4
6
|
export type { Transport } from "./transport";
|
package/lib/sctp/src/index.js
CHANGED
|
@@ -1,11 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.UdpTransport = exports.createUdpTransport = exports.SCTP = exports.WEBRTC_PPID = exports.SCTP_STATE = void 0;
|
|
3
|
+
exports.UdpTransport = exports.createUdpTransport = exports.SCTP_PADDING_MULTIPLE = exports.SCTP_DATA_CHUNK_HEADER_SIZE = exports.SCTP_DATA_FIXED_HEADER_SIZE = exports.SCTP_CHUNK_HEADER_SIZE = exports.SCTP_COMMON_HEADER_SIZE = exports.validateSctpMtu = exports.maxPayloadSizeForMtu = exports.DEFAULT_SCTP_MTU = exports.SCTP = exports.WEBRTC_PPID = exports.SCTP_STATE = void 0;
|
|
4
4
|
var const_1 = require("./const");
|
|
5
5
|
Object.defineProperty(exports, "SCTP_STATE", { enumerable: true, get: function () { return const_1.SCTP_STATE; } });
|
|
6
6
|
Object.defineProperty(exports, "WEBRTC_PPID", { enumerable: true, get: function () { return const_1.WEBRTC_PPID; } });
|
|
7
7
|
var sctp_1 = require("./sctp");
|
|
8
8
|
Object.defineProperty(exports, "SCTP", { enumerable: true, get: function () { return sctp_1.SCTP; } });
|
|
9
|
+
Object.defineProperty(exports, "DEFAULT_SCTP_MTU", { enumerable: true, get: function () { return sctp_1.DEFAULT_SCTP_MTU; } });
|
|
10
|
+
Object.defineProperty(exports, "maxPayloadSizeForMtu", { enumerable: true, get: function () { return sctp_1.maxPayloadSizeForMtu; } });
|
|
11
|
+
Object.defineProperty(exports, "validateSctpMtu", { enumerable: true, get: function () { return sctp_1.validateSctpMtu; } });
|
|
12
|
+
var chunk_1 = require("./chunk");
|
|
13
|
+
Object.defineProperty(exports, "SCTP_COMMON_HEADER_SIZE", { enumerable: true, get: function () { return chunk_1.SCTP_COMMON_HEADER_SIZE; } });
|
|
14
|
+
Object.defineProperty(exports, "SCTP_CHUNK_HEADER_SIZE", { enumerable: true, get: function () { return chunk_1.SCTP_CHUNK_HEADER_SIZE; } });
|
|
15
|
+
Object.defineProperty(exports, "SCTP_DATA_FIXED_HEADER_SIZE", { enumerable: true, get: function () { return chunk_1.SCTP_DATA_FIXED_HEADER_SIZE; } });
|
|
16
|
+
Object.defineProperty(exports, "SCTP_DATA_CHUNK_HEADER_SIZE", { enumerable: true, get: function () { return chunk_1.SCTP_DATA_CHUNK_HEADER_SIZE; } });
|
|
17
|
+
Object.defineProperty(exports, "SCTP_PADDING_MULTIPLE", { enumerable: true, get: function () { return chunk_1.SCTP_PADDING_MULTIPLE; } });
|
|
9
18
|
var transport_1 = require("./transport");
|
|
10
19
|
Object.defineProperty(exports, "createUdpTransport", { enumerable: true, get: function () { return transport_1.createUdpTransport; } });
|
|
11
20
|
Object.defineProperty(exports, "UdpTransport", { enumerable: true, get: function () { return transport_1.UdpTransport; } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../sctp/src/index.ts"],"names":[],"mappings":";;;AAAA,iCAAkD;AAAzC,mGAAA,UAAU,OAAA;AAAE,oGAAA,WAAW,OAAA;AAChC,+
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../sctp/src/index.ts"],"names":[],"mappings":";;;AAAA,iCAAkD;AAAzC,mGAAA,UAAU,OAAA;AAAE,oGAAA,WAAW,OAAA;AAChC,+BAKgB;AAJd,4FAAA,IAAI,OAAA;AACJ,wGAAA,gBAAgB,OAAA;AAChB,4GAAA,oBAAoB,OAAA;AACpB,uGAAA,eAAe,OAAA;AAGjB,iCAMiB;AALf,gHAAA,uBAAuB,OAAA;AACvB,+GAAA,sBAAsB,OAAA;AACtB,oHAAA,2BAA2B,OAAA;AAC3B,oHAAA,2BAA2B,OAAA;AAC3B,8GAAA,qBAAqB,OAAA;AAEvB,yCAA+D;AAAtD,+GAAA,kBAAkB,OAAA;AAAE,yGAAA,YAAY,OAAA","sourcesContent":["export { SCTP_STATE, WEBRTC_PPID } from \"./const\";\nexport {\n SCTP,\n DEFAULT_SCTP_MTU,\n maxPayloadSizeForMtu,\n validateSctpMtu,\n} from \"./sctp\";\nexport type { SCTPOptions } from \"./sctp\";\nexport {\n SCTP_COMMON_HEADER_SIZE,\n SCTP_CHUNK_HEADER_SIZE,\n SCTP_DATA_FIXED_HEADER_SIZE,\n SCTP_DATA_CHUNK_HEADER_SIZE,\n SCTP_PADDING_MULTIPLE,\n} from \"./chunk\";\nexport { createUdpTransport, UdpTransport } from \"./transport\";\nexport type { Transport } from \"./transport\";\n"]}
|