@blockcast/mmt-container 0.1.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.
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @mmt/container - MMTP/LOC Container Parsing
3
+ *
4
+ * Shared container parsing library for MMT over MoQ and SSM.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+ export { type MMTPHeader, type MPUHeader, type MMTPPacket, MMTP_HEADER_SIZE, MPU_HEADER_SIZE, MFU_DU_HEADER_SIZE, parseMMTPHeader, unwrapMMTP, parseMPUHeader, extractNALUnit, extractTimestamp, isFecRepairPacket, hasFecPayloadId, } from './mmtp.js';
9
+ export { type MFUFragment, type ReassembledMFU, type ReassemblerStats, type MFUReassemblerOptions, MFUReassembler, createFragment, processMMTPWithReassembly, } from './mfu-reassembler.js';
10
+ export { LOCHeaderExtensionId, FEC_PAYLOAD_ID_MAX, fecPack, fecUnpack, FecPayloadId, } from './loc.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,UAAU,EACf,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,UAAU,EACV,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,GAChB,MAAM,WAAW,CAAA;AAGlB,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,cAAc,EACd,cAAc,EACd,yBAAyB,GAC1B,MAAM,sBAAsB,CAAA;AAG7B,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,OAAO,EACP,SAAS,EACT,YAAY,GACb,MAAM,UAAU,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @mmt/container - MMTP/LOC Container Parsing
3
+ *
4
+ * Shared container parsing library for MMT over MoQ and SSM.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+ // MMTP Parser
9
+ export { MMTP_HEADER_SIZE, MPU_HEADER_SIZE, MFU_DU_HEADER_SIZE, parseMMTPHeader, unwrapMMTP, parseMPUHeader, extractNALUnit, extractTimestamp, isFecRepairPacket, hasFecPayloadId, } from './mmtp.js';
10
+ // MFU Reassembler
11
+ export { MFUReassembler, createFragment, processMMTPWithReassembly, } from './mfu-reassembler.js';
12
+ // LOC FEC Extensions
13
+ export { LOCHeaderExtensionId, FEC_PAYLOAD_ID_MAX, fecPack, fecUnpack, FecPayloadId, } from './loc.js';
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc;AACd,OAAO,EAIL,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,UAAU,EACV,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,GAChB,MAAM,WAAW,CAAA;AAElB,kBAAkB;AAClB,OAAO,EAKL,cAAc,EACd,cAAc,EACd,yBAAyB,GAC1B,MAAM,sBAAsB,CAAA;AAE7B,qBAAqB;AACrB,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,OAAO,EACP,SAAS,EACT,YAAY,GACb,MAAM,UAAU,CAAA"}
package/dist/loc.d.ts ADDED
@@ -0,0 +1,100 @@
1
+ /**
2
+ * @mmt/container - LOC FEC Extensions
3
+ *
4
+ * FEC Payload ID helpers for LOC (Low Overhead Container) format
5
+ * Per draft-ramadan-moq-mmt Section 7.3
6
+ *
7
+ * The FEC Payload ID encodes Source Block Number (SBN) and
8
+ * Encoding Symbol ID (ESI) as a 48-bit value: (SBN << 24) | ESI
9
+ *
10
+ * @packageDocumentation
11
+ */
12
+ /**
13
+ * LOC Header Extension IDs
14
+ */
15
+ export declare enum LOCHeaderExtensionId {
16
+ CaptureTimestamp = 2,
17
+ VideoFrameMarking = 4,
18
+ AudioLevel = 6,
19
+ VideoConfig = 13,
20
+ /** FEC Payload ID extension (draft-ramadan-moq-mmt Section 7.3) */
21
+ FecPayloadId = 16
22
+ }
23
+ /** Maximum value for SBN and ESI (24 bits each) */
24
+ export declare const FEC_PAYLOAD_ID_MAX = 16777215;
25
+ /**
26
+ * Pack Source Block Number (SBN) and Encoding Symbol ID (ESI) into a 48-bit value.
27
+ *
28
+ * Per draft-ramadan-moq-mmt Section 7.3, the FEC Payload ID is encoded as:
29
+ * `(SBN << 24) | ESI` where both SBN and ESI are 24 bits.
30
+ *
31
+ * @param sbn - Source Block Number (24 bits, 0-16777215)
32
+ * @param esi - Encoding Symbol ID (24 bits, 0-16777215)
33
+ * @returns Packed 48-bit value as bigint
34
+ *
35
+ * @example
36
+ * ```ts
37
+ * import { fecPack } from '@mmt/container/loc'
38
+ * const packed = fecPack(100, 5) // 419430405n
39
+ * ```
40
+ */
41
+ export declare function fecPack(sbn: number, esi: number): bigint;
42
+ /**
43
+ * Unpack a 48-bit FEC Payload ID into Source Block Number and Encoding Symbol ID.
44
+ *
45
+ * Per draft-ramadan-moq-mmt Section 7.3, extracts:
46
+ * - SBN from upper 24 bits
47
+ * - ESI from lower 24 bits
48
+ *
49
+ * @param packed - Packed 48-bit FEC Payload ID value
50
+ * @returns Tuple of [sbn, esi] both as numbers
51
+ *
52
+ * @example
53
+ * ```ts
54
+ * import { fecPack, fecUnpack } from '@mmt/container/loc'
55
+ * const packed = fecPack(100, 5)
56
+ * const [sbn, esi] = fecUnpack(packed) // [100, 5]
57
+ * ```
58
+ */
59
+ export declare function fecUnpack(packed: bigint): [sbn: number, esi: number];
60
+ /**
61
+ * FEC Payload ID for LOC extension headers
62
+ *
63
+ * Encodes Source Block Number (SBN) and Encoding Symbol ID (ESI)
64
+ * for FEC recovery with LOC container format.
65
+ *
66
+ * @example
67
+ * ```ts
68
+ * import { FecPayloadId } from '@mmt/container/loc'
69
+ *
70
+ * // Create from SBN/ESI
71
+ * const fecId = new FecPayloadId(100, 5)
72
+ *
73
+ * // Get packed value for extension header
74
+ * const packed = fecId.packed // 419430405n
75
+ *
76
+ * // Create from packed value
77
+ * const fecId2 = FecPayloadId.fromPacked(packed)
78
+ * ```
79
+ */
80
+ export declare class FecPayloadId {
81
+ /** Source Block Number (24 bits, 0-16777215) */
82
+ readonly sbn: number;
83
+ /** Encoding Symbol ID (24 bits, 0-16777215) */
84
+ readonly esi: number;
85
+ static readonly TYPE = LOCHeaderExtensionId.FecPayloadId;
86
+ constructor(
87
+ /** Source Block Number (24 bits, 0-16777215) */
88
+ sbn: number,
89
+ /** Encoding Symbol ID (24 bits, 0-16777215) */
90
+ esi: number);
91
+ /** Get packed 48-bit value */
92
+ get packed(): bigint;
93
+ /** Create from packed 48-bit value */
94
+ static fromPacked(packed: bigint): FecPayloadId;
95
+ /** Check if value is within valid 24-bit range */
96
+ static isValidSbn(sbn: number): boolean;
97
+ /** Check if value is within valid 24-bit range */
98
+ static isValidEsi(esi: number): boolean;
99
+ }
100
+ //# sourceMappingURL=loc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loc.d.ts","sourceRoot":"","sources":["../src/loc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;GAEG;AACH,oBAAY,oBAAoB;IAC9B,gBAAgB,IAAI;IACpB,iBAAiB,IAAI;IACrB,UAAU,IAAI;IACd,WAAW,KAAK;IAChB,mEAAmE;IACnE,YAAY,KAAO;CACpB;AAED,mDAAmD;AACnD,eAAO,MAAM,kBAAkB,WAAW,CAAA;AAE1C;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAIpE;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,YAAY;IAIrB,gDAAgD;aAChC,GAAG,EAAE,MAAM;IAC3B,+CAA+C;aAC/B,GAAG,EAAE,MAAM;IAN7B,MAAM,CAAC,QAAQ,CAAC,IAAI,qCAAoC;;IAGtD,gDAAgD;IAChC,GAAG,EAAE,MAAM;IAC3B,+CAA+C;IAC/B,GAAG,EAAE,MAAM;IAU7B,8BAA8B;IAC9B,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,sCAAsC;IACtC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY;IAK/C,kDAAkD;IAClD,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIvC,kDAAkD;IAClD,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;CAGxC"}
package/dist/loc.js ADDED
@@ -0,0 +1,198 @@
1
+ /**
2
+ * @mmt/container - LOC FEC Extensions
3
+ *
4
+ * FEC Payload ID helpers for LOC (Low Overhead Container) format
5
+ * Per draft-ramadan-moq-mmt Section 7.3
6
+ *
7
+ * The FEC Payload ID encodes Source Block Number (SBN) and
8
+ * Encoding Symbol ID (ESI) as a 48-bit value: (SBN << 24) | ESI
9
+ *
10
+ * @packageDocumentation
11
+ */
12
+ /**
13
+ * LOC Header Extension IDs
14
+ */
15
+ export var LOCHeaderExtensionId;
16
+ (function (LOCHeaderExtensionId) {
17
+ LOCHeaderExtensionId[LOCHeaderExtensionId["CaptureTimestamp"] = 2] = "CaptureTimestamp";
18
+ LOCHeaderExtensionId[LOCHeaderExtensionId["VideoFrameMarking"] = 4] = "VideoFrameMarking";
19
+ LOCHeaderExtensionId[LOCHeaderExtensionId["AudioLevel"] = 6] = "AudioLevel";
20
+ LOCHeaderExtensionId[LOCHeaderExtensionId["VideoConfig"] = 13] = "VideoConfig";
21
+ /** FEC Payload ID extension (draft-ramadan-moq-mmt Section 7.3) */
22
+ LOCHeaderExtensionId[LOCHeaderExtensionId["FecPayloadId"] = 16] = "FecPayloadId";
23
+ })(LOCHeaderExtensionId || (LOCHeaderExtensionId = {}));
24
+ /** Maximum value for SBN and ESI (24 bits each) */
25
+ export const FEC_PAYLOAD_ID_MAX = 0xffffff;
26
+ /**
27
+ * Pack Source Block Number (SBN) and Encoding Symbol ID (ESI) into a 48-bit value.
28
+ *
29
+ * Per draft-ramadan-moq-mmt Section 7.3, the FEC Payload ID is encoded as:
30
+ * `(SBN << 24) | ESI` where both SBN and ESI are 24 bits.
31
+ *
32
+ * @param sbn - Source Block Number (24 bits, 0-16777215)
33
+ * @param esi - Encoding Symbol ID (24 bits, 0-16777215)
34
+ * @returns Packed 48-bit value as bigint
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * import { fecPack } from '@mmt/container/loc'
39
+ * const packed = fecPack(100, 5) // 419430405n
40
+ * ```
41
+ */
42
+ export function fecPack(sbn, esi) {
43
+ return (BigInt(sbn & 0xffffff) << 24n) | BigInt(esi & 0xffffff);
44
+ }
45
+ /**
46
+ * Unpack a 48-bit FEC Payload ID into Source Block Number and Encoding Symbol ID.
47
+ *
48
+ * Per draft-ramadan-moq-mmt Section 7.3, extracts:
49
+ * - SBN from upper 24 bits
50
+ * - ESI from lower 24 bits
51
+ *
52
+ * @param packed - Packed 48-bit FEC Payload ID value
53
+ * @returns Tuple of [sbn, esi] both as numbers
54
+ *
55
+ * @example
56
+ * ```ts
57
+ * import { fecPack, fecUnpack } from '@mmt/container/loc'
58
+ * const packed = fecPack(100, 5)
59
+ * const [sbn, esi] = fecUnpack(packed) // [100, 5]
60
+ * ```
61
+ */
62
+ export function fecUnpack(packed) {
63
+ const sbn = Number((packed >> 24n) & 0xffffffn);
64
+ const esi = Number(packed & 0xffffffn);
65
+ return [sbn, esi];
66
+ }
67
+ /**
68
+ * FEC Payload ID for LOC extension headers
69
+ *
70
+ * Encodes Source Block Number (SBN) and Encoding Symbol ID (ESI)
71
+ * for FEC recovery with LOC container format.
72
+ *
73
+ * @example
74
+ * ```ts
75
+ * import { FecPayloadId } from '@mmt/container/loc'
76
+ *
77
+ * // Create from SBN/ESI
78
+ * const fecId = new FecPayloadId(100, 5)
79
+ *
80
+ * // Get packed value for extension header
81
+ * const packed = fecId.packed // 419430405n
82
+ *
83
+ * // Create from packed value
84
+ * const fecId2 = FecPayloadId.fromPacked(packed)
85
+ * ```
86
+ */
87
+ export class FecPayloadId {
88
+ constructor(
89
+ /** Source Block Number (24 bits, 0-16777215) */
90
+ sbn,
91
+ /** Encoding Symbol ID (24 bits, 0-16777215) */
92
+ esi) {
93
+ this.sbn = sbn;
94
+ this.esi = esi;
95
+ if (sbn < 0 || sbn > 0xffffff) {
96
+ throw new Error('SBN must be 0-16777215 (24 bits)');
97
+ }
98
+ if (esi < 0 || esi > 0xffffff) {
99
+ throw new Error('ESI must be 0-16777215 (24 bits)');
100
+ }
101
+ }
102
+ /** Get packed 48-bit value */
103
+ get packed() {
104
+ return fecPack(this.sbn, this.esi);
105
+ }
106
+ /** Create from packed 48-bit value */
107
+ static fromPacked(packed) {
108
+ const [sbn, esi] = fecUnpack(packed);
109
+ return new FecPayloadId(sbn, esi);
110
+ }
111
+ /** Check if value is within valid 24-bit range */
112
+ static isValidSbn(sbn) {
113
+ return sbn >= 0 && sbn <= 0xffffff;
114
+ }
115
+ /** Check if value is within valid 24-bit range */
116
+ static isValidEsi(esi) {
117
+ return esi >= 0 && esi <= 0xffffff;
118
+ }
119
+ }
120
+ FecPayloadId.TYPE = LOCHeaderExtensionId.FecPayloadId;
121
+ // =============================================================================
122
+ // Inline Tests (vitest)
123
+ // =============================================================================
124
+ if (import.meta.vitest) {
125
+ const { describe, test, expect } = import.meta.vitest;
126
+ describe('FEC Helpers', () => {
127
+ test('fecPack/fecUnpack roundtrip', () => {
128
+ const sbn = 12345;
129
+ const esi = 67890;
130
+ const packed = fecPack(sbn, esi);
131
+ const [unpackedSbn, unpackedEsi] = fecUnpack(packed);
132
+ expect(unpackedSbn).toBe(sbn);
133
+ expect(unpackedEsi).toBe(esi);
134
+ });
135
+ test('fecPack/fecUnpack max values', () => {
136
+ const sbn = FEC_PAYLOAD_ID_MAX;
137
+ const esi = FEC_PAYLOAD_ID_MAX;
138
+ const packed = fecPack(sbn, esi);
139
+ const [unpackedSbn, unpackedEsi] = fecUnpack(packed);
140
+ expect(unpackedSbn).toBe(sbn);
141
+ expect(unpackedEsi).toBe(esi);
142
+ });
143
+ test('fecPack/fecUnpack zero', () => {
144
+ const packed = fecPack(0, 0);
145
+ expect(packed).toBe(0n);
146
+ const [sbn, esi] = fecUnpack(0n);
147
+ expect(sbn).toBe(0);
148
+ expect(esi).toBe(0);
149
+ });
150
+ test('fecPack truncates overflow', () => {
151
+ const sbn = 0x1ffffff; // 25 bits
152
+ const esi = 0x1ffffff; // 25 bits
153
+ const packed = fecPack(sbn, esi);
154
+ const [unpackedSbn, unpackedEsi] = fecUnpack(packed);
155
+ expect(unpackedSbn).toBe(FEC_PAYLOAD_ID_MAX);
156
+ expect(unpackedEsi).toBe(FEC_PAYLOAD_ID_MAX);
157
+ });
158
+ });
159
+ describe('FecPayloadId', () => {
160
+ test('should create and roundtrip', () => {
161
+ const sbn = 12345;
162
+ const esi = 67890;
163
+ const fecId = new FecPayloadId(sbn, esi);
164
+ expect(fecId.sbn).toBe(sbn);
165
+ expect(fecId.esi).toBe(esi);
166
+ const fecId2 = FecPayloadId.fromPacked(fecId.packed);
167
+ expect(fecId2.sbn).toBe(sbn);
168
+ expect(fecId2.esi).toBe(esi);
169
+ });
170
+ test('should handle max 24-bit values', () => {
171
+ const sbn = 0xffffff;
172
+ const esi = 0xffffff;
173
+ const fecId = new FecPayloadId(sbn, esi);
174
+ const fecId2 = FecPayloadId.fromPacked(fecId.packed);
175
+ expect(fecId2.sbn).toBe(sbn);
176
+ expect(fecId2.esi).toBe(esi);
177
+ });
178
+ test('should reject invalid SBN', () => {
179
+ expect(() => new FecPayloadId(-1, 0)).toThrow();
180
+ expect(() => new FecPayloadId(0x1000000, 0)).toThrow();
181
+ });
182
+ test('should reject invalid ESI', () => {
183
+ expect(() => new FecPayloadId(0, -1)).toThrow();
184
+ expect(() => new FecPayloadId(0, 0x1000000)).toThrow();
185
+ });
186
+ test('isValidSbn/isValidEsi', () => {
187
+ expect(FecPayloadId.isValidSbn(0)).toBe(true);
188
+ expect(FecPayloadId.isValidSbn(0xffffff)).toBe(true);
189
+ expect(FecPayloadId.isValidSbn(-1)).toBe(false);
190
+ expect(FecPayloadId.isValidSbn(0x1000000)).toBe(false);
191
+ expect(FecPayloadId.isValidEsi(0)).toBe(true);
192
+ expect(FecPayloadId.isValidEsi(0xffffff)).toBe(true);
193
+ expect(FecPayloadId.isValidEsi(-1)).toBe(false);
194
+ expect(FecPayloadId.isValidEsi(0x1000000)).toBe(false);
195
+ });
196
+ });
197
+ }
198
+ //# sourceMappingURL=loc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loc.js","sourceRoot":"","sources":["../src/loc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * @mmt/container - MFU Fragment Reassembler
3
+ *
4
+ * Handles out-of-order delivery of fragmented MFUs (Media Fragment Units)
5
+ * according to ISO/IEC 23008-1:2023 Section 9.2.3.3
6
+ *
7
+ * Fragmentation Indicator (FI) values:
8
+ * - 0: Complete MFU (single packet, no fragmentation)
9
+ * - 1: First fragment
10
+ * - 2: Middle fragment
11
+ * - 3: Last fragment
12
+ *
13
+ * @packageDocumentation
14
+ */
15
+ /**
16
+ * MFU Fragment for reassembly
17
+ */
18
+ export interface MFUFragment {
19
+ fragmentationIndicator: number;
20
+ mpuSequenceNumber: number;
21
+ fragmentCounter: number;
22
+ data: Uint8Array;
23
+ timestamp: bigint;
24
+ receivedAt: number;
25
+ /** Random Access Point flag from MMTP header - indicates keyframe */
26
+ rapFlag: boolean;
27
+ }
28
+ /**
29
+ * Reassembled MFU result
30
+ */
31
+ export interface ReassembledMFU {
32
+ mpuSequenceNumber: number;
33
+ data: Uint8Array;
34
+ timestamp: bigint;
35
+ fragmentCount: number;
36
+ /** Random Access Point flag - indicates keyframe (from first fragment) */
37
+ rapFlag: boolean;
38
+ }
39
+ /**
40
+ * Reassembler statistics
41
+ */
42
+ export interface ReassemblerStats {
43
+ totalFragments: number;
44
+ reassembledMFUs: number;
45
+ timedOutMFUs: number;
46
+ outOfOrderFragments: number;
47
+ }
48
+ export interface MFUReassemblerOptions {
49
+ /** Timeout in milliseconds for incomplete MFUs (default: 1000) */
50
+ timeoutMs?: number;
51
+ /** Maximum buffered MFUs before eviction (default: 100) */
52
+ maxBuffered?: number;
53
+ }
54
+ /**
55
+ * MFU Reassembler for out-of-order fragment delivery
56
+ * Based on ISO/IEC 23008-1:2023 Section 9.2.3.3
57
+ */
58
+ export declare class MFUReassembler {
59
+ #private;
60
+ /** Statistics for debugging */
61
+ readonly stats: ReassemblerStats;
62
+ constructor(options?: MFUReassemblerOptions);
63
+ /**
64
+ * Add a fragment and return reassembled MFU if complete
65
+ */
66
+ addFragment(fragment: MFUFragment): ReassembledMFU | null;
67
+ /**
68
+ * Flush all buffered fragments
69
+ */
70
+ flush(): void;
71
+ /**
72
+ * Get number of pending MFUs
73
+ */
74
+ get pendingCount(): number;
75
+ /**
76
+ * Get current buffer status
77
+ */
78
+ getStatus(): {
79
+ bufferedMFUs: number;
80
+ pendingFragments: number;
81
+ stats: ReassemblerStats;
82
+ };
83
+ }
84
+ /**
85
+ * Create MFU fragment from MMTP packet for reassembly
86
+ */
87
+ export declare function createFragment(mmtpPacket: Uint8Array): MFUFragment;
88
+ /**
89
+ * Process MMTP packet with fragment reassembly
90
+ */
91
+ export declare function processMMTPWithReassembly(mmtpPacket: Uint8Array, reassembler: MFUReassembler): ReassembledMFU | null;
92
+ //# sourceMappingURL=mfu-reassembler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mfu-reassembler.d.ts","sourceRoot":"","sources":["../src/mfu-reassembler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAWH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,sBAAsB,EAAE,MAAM,CAAA;IAC9B,iBAAiB,EAAE,MAAM,CAAA;IACzB,eAAe,EAAE,MAAM,CAAA;IACvB,IAAI,EAAE,UAAU,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,qEAAqE;IACrE,OAAO,EAAE,OAAO,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,iBAAiB,EAAE,MAAM,CAAA;IACzB,IAAI,EAAE,UAAU,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,0EAA0E;IAC1E,OAAO,EAAE,OAAO,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;IACvB,YAAY,EAAE,MAAM,CAAA;IACpB,mBAAmB,EAAE,MAAM,CAAA;CAC5B;AAED,MAAM,WAAW,qBAAqB;IACpC,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;GAGG;AACH,qBAAa,cAAc;;IAMzB,+BAA+B;IAC/B,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAK/B;gBAEW,OAAO,CAAC,EAAE,qBAAqB;IAK3C;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,WAAW,GAAG,cAAc,GAAG,IAAI;IAqIzD;;OAEG;IACH,KAAK,IAAI,IAAI;IAQb;;OAEG;IACH,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED;;OAEG;IACH,SAAS,IAAI;QACX,YAAY,EAAE,MAAM,CAAA;QACpB,gBAAgB,EAAE,MAAM,CAAA;QACxB,KAAK,EAAE,gBAAgB,CAAA;KACxB;CAYF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,UAAU,GAAG,WAAW,CAwBlE;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,cAAc,GAC1B,cAAc,GAAG,IAAI,CAQvB"}