@blockcast/mmt-fec 0.3.0 → 0.4.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.
Files changed (74) hide show
  1. package/README.md +4 -4
  2. package/dist/block-processor.d.ts +19 -20
  3. package/dist/block-processor.d.ts.map +1 -1
  4. package/dist/block-processor.js +27 -93
  5. package/dist/block-processor.js.map +1 -1
  6. package/dist/fec-block-mapper.d.ts +16 -72
  7. package/dist/fec-block-mapper.d.ts.map +1 -1
  8. package/dist/fec-block-mapper.js +17 -96
  9. package/dist/fec-block-mapper.js.map +1 -1
  10. package/dist/index.d.ts +3 -3
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +3 -3
  13. package/dist/index.js.map +1 -1
  14. package/dist/oti.d.ts +17 -8
  15. package/dist/oti.d.ts.map +1 -1
  16. package/dist/oti.js +9 -1
  17. package/dist/oti.js.map +1 -1
  18. package/dist/repair-group.d.ts +86 -0
  19. package/dist/repair-group.d.ts.map +1 -1
  20. package/dist/repair-group.js +135 -0
  21. package/dist/repair-group.js.map +1 -1
  22. package/package.json +5 -6
  23. package/src/block-processor.ts +31 -110
  24. package/src/fec-block-mapper.ts +23 -108
  25. package/src/index.ts +6 -1
  26. package/src/oti.ts +20 -9
  27. package/src/repair-group.ts +176 -0
  28. package/test-vectors/repair-epoch.json +119 -0
  29. package/node_modules/@blockcast/mmt-alta-parse/README.md +0 -181
  30. package/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
  31. package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +0 -57
  32. package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +0 -1
  33. package/node_modules/@blockcast/mmt-alta-parse/dist/index.js +0 -115
  34. package/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +0 -1
  35. package/node_modules/@blockcast/mmt-alta-parse/package.json +0 -50
  36. package/node_modules/@blockcast/mmt-alta-parse/src/index.ts +0 -136
  37. package/node_modules/@blockcast/mmt-base/README.md +0 -134
  38. package/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
  39. package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts +0 -55
  40. package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.d.ts.map +0 -1
  41. package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js +0 -128
  42. package/node_modules/@blockcast/mmt-base/dist/fec-block-profile.js.map +0 -1
  43. package/node_modules/@blockcast/mmt-base/dist/index.d.ts +0 -7
  44. package/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +0 -1
  45. package/node_modules/@blockcast/mmt-base/dist/index.js +0 -7
  46. package/node_modules/@blockcast/mmt-base/dist/index.js.map +0 -1
  47. package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +0 -292
  48. package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +0 -1
  49. package/node_modules/@blockcast/mmt-base/dist/mmtp.js +0 -612
  50. package/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +0 -1
  51. package/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts +0 -18
  52. package/node_modules/@blockcast/mmt-base/dist/net-constants.d.ts.map +0 -1
  53. package/node_modules/@blockcast/mmt-base/dist/net-constants.js +0 -18
  54. package/node_modules/@blockcast/mmt-base/dist/net-constants.js.map +0 -1
  55. package/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts +0 -47
  56. package/node_modules/@blockcast/mmt-base/dist/ntp-short.d.ts.map +0 -1
  57. package/node_modules/@blockcast/mmt-base/dist/ntp-short.js +0 -54
  58. package/node_modules/@blockcast/mmt-base/dist/ntp-short.js.map +0 -1
  59. package/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts +0 -57
  60. package/node_modules/@blockcast/mmt-base/dist/serial-number.d.ts.map +0 -1
  61. package/node_modules/@blockcast/mmt-base/dist/serial-number.js +0 -98
  62. package/node_modules/@blockcast/mmt-base/dist/serial-number.js.map +0 -1
  63. package/node_modules/@blockcast/mmt-base/dist/signalling.d.ts +0 -312
  64. package/node_modules/@blockcast/mmt-base/dist/signalling.d.ts.map +0 -1
  65. package/node_modules/@blockcast/mmt-base/dist/signalling.js +0 -637
  66. package/node_modules/@blockcast/mmt-base/dist/signalling.js.map +0 -1
  67. package/node_modules/@blockcast/mmt-base/package.json +0 -49
  68. package/node_modules/@blockcast/mmt-base/src/fec-block-profile.ts +0 -145
  69. package/node_modules/@blockcast/mmt-base/src/index.ts +0 -6
  70. package/node_modules/@blockcast/mmt-base/src/mmtp.ts +0 -892
  71. package/node_modules/@blockcast/mmt-base/src/net-constants.ts +0 -17
  72. package/node_modules/@blockcast/mmt-base/src/ntp-short.ts +0 -67
  73. package/node_modules/@blockcast/mmt-base/src/serial-number.ts +0 -107
  74. package/node_modules/@blockcast/mmt-base/src/signalling.ts +0 -862
@@ -8,17 +8,10 @@
8
8
  * It deliberately does NOT map MoQ media groups to FEC blocks. A recovered
9
9
  * packet's media group is read from its own MMTP/MPU header
10
10
  * ({@link recoveredPacketMediaGroup}), never from SBN arithmetic, and a source
11
- * symbol's block comes from the wire:
12
- *
13
- * - `k-padded-v1`: `SBN = floor(SS_ID / K)`, `ESI = SS_ID mod K`
14
- * ({@link FecBlockMapper.fromSsId}).
15
- * - `iso-ssbg1-v1`: a block is the SS_ID range `[SS_Start, SS_Start +
16
- * SSB_length)` its Repair FEC Payload ID states (ISO/IEC 23008-1 C.5.3), so
17
- * SS_ID alone locates nothing and `fromSsId` throws.
18
- *
19
- * Object FEC (draft-ramadan-moq-fec §9.1) is the one exception: there each MoQ
20
- * group IS its own FEC block, so {@link ObjectBlockMapper} keeps its identity
21
- * `derive`.
11
+ * symbol's block comes from the wire: under `iso-ssbg1-v1` a block is the SS_ID
12
+ * range `[SS_Start, SS_Start + SSB_length)` its Repair FEC Payload ID states
13
+ * (ISO/IEC 23008-1 C.5.3), so SS_ID alone locates nothing and `fromSsId`
14
+ * throws for every stream with an FEC instance.
22
15
  */
23
16
  import { PACKET_TYPE_MPU, parseFecBlockProfile, parseMMTPHeader, parseMPUHeader, } from "@blockcast/mmt-base";
24
17
  import { deriveFecInterleaveDepth } from "./oti.js";
@@ -50,7 +43,7 @@ const NO_FEC_INSTANCE = Symbol("no FEC instance");
50
43
  export class FecBlockMapper {
51
44
  /** Media units (GOPs/frames) per FEC block, recovered with positive round-half-up semantics. */
52
45
  d;
53
- /** K: source symbols per block (`k-padded-v1`) or the maximum SSB_length (`iso-ssbg1-v1`). */
46
+ /** K: the maximum SSB_length of a block (catalog `fec.sourceSymbols`). */
54
47
  k;
55
48
  /** Block time span (ms) — used as pacing threshold */
56
49
  interleaveDepthMs;
@@ -78,22 +71,15 @@ export class FecBlockMapper {
78
71
  this.d = deriveFecInterleaveDepth(config.interleaveDepthMs, config.gopDurationMs);
79
72
  }
80
73
  /**
81
- * The `k-padded-v1` locator: SS_ID → (SBN, ESI) with `SBN = floor(SS_ID / K)`
82
- * and `ESI = SS_ID mod K`, for MMTP over multicast UDP where the Source FEC
83
- * Payload ID carries SS_ID directly.
74
+ * SS_ID → (SBN, ESI). Only {@link NullBlockMapper} answers: a stream with an
75
+ * FEC instance is `iso-ssbg1-v1`, whose blocks are located by
76
+ * `(SS_Start, SSB_length)` range membership and never from SS_ID alone.
84
77
  *
85
- * @throws under `iso-ssbg1-v1`, where a block is located by
86
- * `(SS_Start, SSB_length)` range membership and never from SS_ID alone
78
+ * @throws for every stream with an FEC instance
87
79
  */
88
- fromSsId(ssId) {
89
- if (this.blockProfile !== 'k-padded-v1') {
90
- throw new Error(`fromSsId is the k-padded-v1 locator; a ${this.blockProfile ?? 'non-FEC'} stream locates a block by ` +
91
- '(SS_Start, SSB_length) range membership, never from SS_ID alone');
92
- }
93
- return {
94
- sbn: Math.floor(ssId / this.k),
95
- esi: ssId % this.k,
96
- };
80
+ fromSsId(_ssId) {
81
+ throw new Error(`fromSsId: a ${this.blockProfile ?? 'non-FEC'} stream locates a block by ` +
82
+ '(SS_Start, SSB_length) range membership, never from SS_ID alone');
97
83
  }
98
84
  /**
99
85
  * Pacing threshold: one full block duration = interleaveDepthMs.
@@ -143,72 +129,6 @@ export class NullBlockMapper extends FecBlockMapper {
143
129
  return 0;
144
130
  }
145
131
  }
146
- /**
147
- * Object-level FEC (§9.1): each MoQ group (frame) is its own FEC block.
148
- * K_actual = ceil(frame_bytes / symbolSize) — varies per block.
149
- *
150
- * SBN = group_id, ESI = object_id.
151
- * SS_ID = Group_ID * sourceSymbols + Object_ID (§9.1.2).
152
- *
153
- * That SS_ID is the K-stride numbering of `k-padded-v1`; `iso-ssbg1-v1`
154
- * numbers SS_IDs consecutively per source packet (ISO/IEC 23008-1 C.5.2), so
155
- * §9.1 object FEC is defined only under `k-padded-v1` and the constructor
156
- * refuses any other profile.
157
- *
158
- * The stride of that numbering is the catalog `sourceSymbols`, never a
159
- * block's own K: a short block (K_actual < sourceSymbols) still starts at
160
- * `Group_ID * sourceSymbols` (its repair's SS_Start) and leaves the rest of
161
- * its stride unused, which is exactly `k-padded-v1` with `SSB_length =
162
- * K_actual`. So the SS_ID locator is the inherited
163
- * {@link FecBlockMapper.fromSsId} over `k = sourceSymbols`, the exact inverse
164
- * of {@link ObjectBlockMapper.derive}; it needs no per-block K and infers
165
- * nothing.
166
- *
167
- * This mapper does NOT carry per-block K. Each block discovers its own K from:
168
- * 1. Clean reception: counting source objects per group
169
- * 2. Repair packets: SSB_length in the Repair FEC Payload ID (ISO 23008-1 C.5.3)
170
- *
171
- * Callers MUST pass per-block K to FecBlockManager.addSourcePacket/addRepairPacket.
172
- * Created once per stream, GC'd on stream close (Effect cleanup).
173
- */
174
- export class ObjectBlockMapper extends FecBlockMapper {
175
- /** Catalog sourceSymbols (max K) — used ONLY for SS_ID encoding (§9.1.2).
176
- * Actual per-block K varies: K_actual = ceil(frame_bytes / symbolSize). */
177
- sourceSymbolsMax;
178
- /**
179
- * @param gopDurationMs - GOP/frame duration (ms)
180
- * @param sourceSymbolsMax - Catalog `fec.sourceSymbols`
181
- * @param blockProfile - Catalog `fec.blockProfile`; must be `k-padded-v1`
182
- */
183
- constructor(gopDurationMs, sourceSymbolsMax, blockProfile) {
184
- if (sourceSymbolsMax <= 0)
185
- throw new Error('ObjectBlockMapper: sourceSymbolsMax must be > 0 (from catalog)');
186
- const profile = parseFecBlockProfile(blockProfile, 'ObjectBlockMapper fec.blockProfile');
187
- if (profile !== 'k-padded-v1') {
188
- throw new Error(`ObjectBlockMapper: §9.1 object FEC numbers SS_ID = Group_ID * K + Object_ID, the k-padded-v1 stride; ` +
189
- `it is not defined under ${profile}`);
190
- }
191
- // D=1, K=sourceSymbolsMax for SS_ID math only — actual block K varies
192
- super({ interleaveDepthMs: gopDurationMs, gopDurationMs, k: sourceSymbolsMax, blockProfile: profile });
193
- this.sourceSymbolsMax = sourceSymbolsMax;
194
- }
195
- /**
196
- * SBN = group_id, ESI = object_id. SS_ID per §9.1.2. Its inverse is the
197
- * inherited `fromSsId` (SBN = floor(SS_ID / sourceSymbols), ESI = SS_ID mod
198
- * sourceSymbols).
199
- */
200
- derive(groupId, objectId) {
201
- return {
202
- sbn: groupId,
203
- esi: objectId,
204
- ssId: groupId * this.sourceSymbolsMax + objectId,
205
- };
206
- }
207
- /** One frame of latency: each frame is its own block. */
208
- get pacingThresholdMs() {
209
- return this.gopDurationMs; // one frame latency
210
- }
211
- }
212
132
  /**
213
133
  * Create a FecBlockMapper from catalog FEC config + measured GOP duration.
214
134
  *
@@ -216,17 +136,18 @@ export class ObjectBlockMapper extends FecBlockMapper {
216
136
  * {@link NullBlockMapper}; `fec.blockProfile` is not read, since a stream
217
137
  * without FEC names none.
218
138
  * - Otherwise `fec.blockProfile` is required (validated with
219
- * `parseFecBlockProfile`, throwing when absent or unknown), and
220
- * `mode: 'object'` → {@link ObjectBlockMapper}, else {@link FecBlockMapper}.
139
+ * `parseFecBlockProfile`, throwing unless it is `iso-ssbg1-v1`) and the
140
+ * result is a {@link FecBlockMapper}. `mode: 'object'` (per-group object
141
+ * FEC, SS_ID = Group_ID * K + Object_ID) throws: that numbering is the
142
+ * retired `k-padded-v1` stride, which `iso-ssbg1-v1` does not define.
221
143
  */
222
144
  export function createMapper(fecConfig, gopDurationMs) {
223
145
  if (!fecConfig || !fecConfig.sourceSymbols) {
224
146
  return new NullBlockMapper(gopDurationMs);
225
147
  }
226
148
  const blockProfile = parseFecBlockProfile(fecConfig.blockProfile, 'fec.blockProfile');
227
- // extensions feature — see moqcast-draft docs/fec-extensions-material.md, not in public -00
228
149
  if (fecConfig.mode === 'object') {
229
- return new ObjectBlockMapper(gopDurationMs, fecConfig.sourceSymbols, blockProfile);
150
+ throw new Error(`createMapper: object FEC numbers SS_ID = Group_ID * K + Object_ID, which ${blockProfile} does not define`);
230
151
  }
231
152
  return new FecBlockMapper({
232
153
  interleaveDepthMs: fecConfig.interleaveDepthMs && fecConfig.interleaveDepthMs > 0
@@ -1 +1 @@
1
- {"version":3,"file":"fec-block-mapper.js","sourceRoot":"","sources":["../src/fec-block-mapper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fec-block-mapper.js","sourceRoot":"","sources":["../src/fec-block-mapper.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -17,12 +17,12 @@ export { ReorderBuffer, type ReorderBufferConfig, } from "./reorder-buffer.js";
17
17
  export { splitToSymbols, recoverFromSymbols, computeK, } from "./cmaf-symbols.js";
18
18
  export { splitFrameToSymbol, recoverFrameFromSymbol, } from "./loc-symbols.js";
19
19
  export { CmafFecRecovery, type CmafFecRecoveryConfig, type FecDecoder, } from "./cmaf-recovery.js";
20
- export { buildOTI, buildOTIFromCatalog, parseOTI, computeFecTimeout, deriveFecInterleaveDepth, catalogFecInterleaveMs, type FecInterleaveCatalog, parseRepairPacket, type OTIParams, fecBlockDeadlineMs, fecBlockBudgetMs, deriveFecRetentionBlocks, tryDeriveFecRetentionBlocks, MAX_FEC_RETENTION_BLOCKS, playbackLatencyMs, } from "./oti.js";
21
- export { FecBlockMapper, NullBlockMapper, ObjectBlockMapper, createMapper, recoveredPacketMediaGroup, type FecBlockConfig, type FecCoordinates, } from "./fec-block-mapper.js";
20
+ export { buildOTI, buildOTIFromCatalog, parseOTI, computeFecTimeout, deriveFecInterleaveDepth, catalogFecInterleaveMs, type FecInterleaveCatalog, parseRepairPacket, type OTIParams, fecBlockDeadlineMs, fecBlockBudgetMs, deriveFecRetentionBlocks, tryDeriveFecRetentionBlocks, MAX_FEC_RETENTION_BLOCKS, LOCAL_FEC_RETENTION_BLOCKS, LOCAL_FEC_TIMEOUT_MS, playbackLatencyMs, } from "./oti.js";
21
+ export { FecBlockMapper, NullBlockMapper, createMapper, recoveredPacketMediaGroup, type FecBlockConfig, type FecCoordinates, } from "./fec-block-mapper.js";
22
22
  /**
23
23
  * MoQ repair group ids for `iso-ssbg1-v1` blocks: the 62-bit
24
24
  * wrap-epoch-extended SS_Start, the repair FETCH range for a lost SS_ID, and
25
25
  * the check a received repair object's Group ID must pass.
26
26
  */
27
- export { extSsStart, extendSsId, repairFetchRange, repairGroupIdMatches, type RepairFetchAnchor, type RepairFetchRange, } from "./repair-group.js";
27
+ export { extSsStart, extendSsId, repairFetchRange, repairGroupIdMatches, RepairEpochReferences, type RepairEpochStats, type RepairFetchAnchor, type RepairFetchRange, type RepairGroupPlan, type RepairLargestOutcome, } from "./repair-group.js";
28
28
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACN,eAAe,EACf,SAAS,EACT,KAAK,QAAQ,EACb,KAAK,sBAAsB,EAC3B,KAAK,aAAa,GAClB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACN,eAAe,EACf,gBAAgB,EAChB,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,GAC5B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACN,aAAa,EACb,KAAK,mBAAmB,GACxB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACN,cAAc,EACd,kBAAkB,EAClB,QAAQ,GACR,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACN,kBAAkB,EAClB,sBAAsB,GACtB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACN,eAAe,EACf,KAAK,qBAAqB,EAC1B,KAAK,UAAU,GACf,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACN,QAAQ,EACR,mBAAmB,EACnB,QAAQ,EACR,iBAAiB,EACjB,wBAAwB,EACxB,sBAAsB,EACtB,KAAK,oBAAoB,EACzB,iBAAiB,EACjB,KAAK,SAAS,EACd,kBAAkB,EAClB,gBAAgB,EAChB,wBAAwB,EACxB,2BAA2B,EAC3B,wBAAwB,EACxB,iBAAiB,GACjB,MAAM,UAAU,CAAC;AAElB,OAAO,EACN,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,yBAAyB,EACzB,KAAK,cAAc,EACnB,KAAK,cAAc,GACnB,MAAM,uBAAuB,CAAC;AAE/B;;;;GAIG;AACH,OAAO,EACN,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,oBAAoB,EACpB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACrB,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACN,eAAe,EACf,SAAS,EACT,KAAK,QAAQ,EACb,KAAK,sBAAsB,EAC3B,KAAK,aAAa,GAClB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACN,eAAe,EACf,gBAAgB,EAChB,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,GAC5B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACN,aAAa,EACb,KAAK,mBAAmB,GACxB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACN,cAAc,EACd,kBAAkB,EAClB,QAAQ,GACR,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACN,kBAAkB,EAClB,sBAAsB,GACtB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACN,eAAe,EACf,KAAK,qBAAqB,EAC1B,KAAK,UAAU,GACf,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACN,QAAQ,EACR,mBAAmB,EACnB,QAAQ,EACR,iBAAiB,EACjB,wBAAwB,EACxB,sBAAsB,EACtB,KAAK,oBAAoB,EACzB,iBAAiB,EACjB,KAAK,SAAS,EACd,kBAAkB,EAClB,gBAAgB,EAChB,wBAAwB,EACxB,2BAA2B,EAC3B,wBAAwB,EACxB,0BAA0B,EAC1B,oBAAoB,EACpB,iBAAiB,GACjB,MAAM,UAAU,CAAC;AAElB,OAAO,EACN,cAAc,EACd,eAAe,EACf,YAAY,EACZ,yBAAyB,EACzB,KAAK,cAAc,EACnB,KAAK,cAAc,GACnB,MAAM,uBAAuB,CAAC;AAE/B;;;;GAIG;AACH,OAAO,EACN,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,EACrB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,oBAAoB,GACzB,MAAM,mBAAmB,CAAC"}
package/dist/index.js CHANGED
@@ -17,12 +17,12 @@ export { ReorderBuffer, } from "./reorder-buffer.js";
17
17
  export { splitToSymbols, recoverFromSymbols, computeK, } from "./cmaf-symbols.js";
18
18
  export { splitFrameToSymbol, recoverFrameFromSymbol, } from "./loc-symbols.js";
19
19
  export { CmafFecRecovery, } from "./cmaf-recovery.js";
20
- export { buildOTI, buildOTIFromCatalog, parseOTI, computeFecTimeout, deriveFecInterleaveDepth, catalogFecInterleaveMs, parseRepairPacket, fecBlockDeadlineMs, fecBlockBudgetMs, deriveFecRetentionBlocks, tryDeriveFecRetentionBlocks, MAX_FEC_RETENTION_BLOCKS, playbackLatencyMs, } from "./oti.js";
21
- export { FecBlockMapper, NullBlockMapper, ObjectBlockMapper, createMapper, recoveredPacketMediaGroup, } from "./fec-block-mapper.js";
20
+ export { buildOTI, buildOTIFromCatalog, parseOTI, computeFecTimeout, deriveFecInterleaveDepth, catalogFecInterleaveMs, parseRepairPacket, fecBlockDeadlineMs, fecBlockBudgetMs, deriveFecRetentionBlocks, tryDeriveFecRetentionBlocks, MAX_FEC_RETENTION_BLOCKS, LOCAL_FEC_RETENTION_BLOCKS, LOCAL_FEC_TIMEOUT_MS, playbackLatencyMs, } from "./oti.js";
21
+ export { FecBlockMapper, NullBlockMapper, createMapper, recoveredPacketMediaGroup, } from "./fec-block-mapper.js";
22
22
  /**
23
23
  * MoQ repair group ids for `iso-ssbg1-v1` blocks: the 62-bit
24
24
  * wrap-epoch-extended SS_Start, the repair FETCH range for a lost SS_ID, and
25
25
  * the check a received repair object's Group ID must pass.
26
26
  */
27
- export { extSsStart, extendSsId, repairFetchRange, repairGroupIdMatches, } from "./repair-group.js";
27
+ export { extSsStart, extendSsId, repairFetchRange, repairGroupIdMatches, RepairEpochReferences, } from "./repair-group.js";
28
28
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACN,eAAe,EACf,SAAS,GAIT,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACN,eAAe,EACf,gBAAgB,GAKhB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACN,aAAa,GAEb,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACN,cAAc,EACd,kBAAkB,EAClB,QAAQ,GACR,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACN,kBAAkB,EAClB,sBAAsB,GACtB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACN,eAAe,GAGf,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACN,QAAQ,EACR,mBAAmB,EACnB,QAAQ,EACR,iBAAiB,EACjB,wBAAwB,EACxB,sBAAsB,EAEtB,iBAAiB,EAEjB,kBAAkB,EAClB,gBAAgB,EAChB,wBAAwB,EACxB,2BAA2B,EAC3B,wBAAwB,EACxB,iBAAiB,GACjB,MAAM,UAAU,CAAC;AAElB,OAAO,EACN,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,yBAAyB,GAGzB,MAAM,uBAAuB,CAAC;AAE/B;;;;GAIG;AACH,OAAO,EACN,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,oBAAoB,GAGpB,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACN,eAAe,EACf,SAAS,GAIT,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACN,eAAe,EACf,gBAAgB,GAKhB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACN,aAAa,GAEb,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACN,cAAc,EACd,kBAAkB,EAClB,QAAQ,GACR,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACN,kBAAkB,EAClB,sBAAsB,GACtB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACN,eAAe,GAGf,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACN,QAAQ,EACR,mBAAmB,EACnB,QAAQ,EACR,iBAAiB,EACjB,wBAAwB,EACxB,sBAAsB,EAEtB,iBAAiB,EAEjB,kBAAkB,EAClB,gBAAgB,EAChB,wBAAwB,EACxB,2BAA2B,EAC3B,wBAAwB,EACxB,0BAA0B,EAC1B,oBAAoB,EACpB,iBAAiB,GACjB,MAAM,UAAU,CAAC;AAElB,OAAO,EACN,cAAc,EACd,eAAe,EACf,YAAY,EACZ,yBAAyB,GAGzB,MAAM,uBAAuB,CAAC;AAE/B;;;;GAIG;AACH,OAAO,EACN,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,GAMrB,MAAM,mBAAmB,CAAC"}
package/dist/oti.d.ts CHANGED
@@ -44,15 +44,16 @@ export declare function parseOTI(oti: Uint8Array): OTIParams & {
44
44
  * Resolve a catalog FEC block's span in milliseconds.
45
45
  *
46
46
  * The catalog carries exactly ONE interleave field: `interleaveDepthMs`, the
47
- * full FEC block span in MILLISECONDS (draft-ramadan-moq-fec §5.1). Receivers
48
- * derive D -- the MEDIA UNITS per block, not a block count -- with
49
- * `deriveFecInterleaveDepth`. Reading D as a block count is BLO-35597.
47
+ * full FEC block send span in MILLISECONDS (draft-ramadan-moq-fec §5.1).
48
+ * Block boundaries still come from the wire's SS_Start and SSB_length; this
49
+ * field never supplies a group count or replaces those coordinates.
50
50
  *
51
- * Absent, non-finite or non-positive → undefined; callers treat that as
52
- * unconfigured and error rather than guess. Finiteness is checked separately
53
- * from `> 0` because `Infinity` satisfies `> 0`: a JSON catalog cannot spell
54
- * `Infinity`, but any overflowing literal (`1e999`) parses to it, and it would
55
- * then reach `fecBlockBudgetMs` as an unbounded span. The legacy
51
+ * Absent → undefined. An explicit zero is returned as zero: it is the
52
+ * catalog's no-elapsed-deadline sentinel, not an invitation to infer a span.
53
+ * Positive values must be safe integer milliseconds. Finiteness is checked
54
+ * separately from the range because `Infinity` satisfies `> 0`: a JSON catalog
55
+ * cannot spell `Infinity`, but any overflowing literal (`1e999`) parses to it,
56
+ * and it would then reach `fecBlockBudgetMs` as an unbounded span. The legacy
56
57
  * `interleaveDepth` frame-count key and
57
58
  * the `interleaveMs` alias were removed in the BLO-14526 clean cut — producers
58
59
  * emit milliseconds only, and there is deliberately NO fallback read.
@@ -209,6 +210,14 @@ export declare function deriveFecRetentionBlocks(deliveryWindowMs: number, inter
209
210
  * anywhere else.
210
211
  */
211
212
  export declare const MAX_FEC_RETENTION_BLOCKS = 255;
213
+ /**
214
+ * Receiver-local block retention used when the catalog carries no elapsed-time
215
+ * FEC window. This is a memory/cleanup bound only; it is never derived from
216
+ * media rate and never treated as a catalog deadline.
217
+ */
218
+ export declare const LOCAL_FEC_RETENTION_BLOCKS = 2;
219
+ /** Receiver-local cleanup budget used when the catalog has no elapsed span. */
220
+ export declare const LOCAL_FEC_TIMEOUT_MS = 500;
212
221
  /**
213
222
  * `deriveFecRetentionBlocks` without the throw: the block count, or `undefined`
214
223
  * when the geometry cannot define one.
package/dist/oti.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"oti.d.ts","sourceRoot":"","sources":["../src/oti.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,SAAS;IACzB,2DAA2D;IAC3D,cAAc,EAAE,MAAM,CAAC;IACvB,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,UAAU,CAwBtD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,UAAU,CAWpE;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,UAAU,GAAG,SAAS,GAAG;IAAE,CAAC,EAAE,MAAM,CAAA;CAAE,CAYnE;AAwBD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,oBAAoB,GAAG;IAClC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,wBAAgB,sBAAsB,CACrC,GAAG,EAAE,oBAAoB,GAAG,SAAS,GACnC,MAAM,GAAG,SAAS,CAGpB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CACvC,iBAAiB,EAAE,MAAM,EACzB,mBAAmB,EAAE,MAAM,GACzB,MAAM,CAQR;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,iBAAiB,CAChC,iBAAiB,EAAE,MAAM,EACzB,YAAY,GAAE,MAAY,GACxB,MAAM,CAkBR;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IAC1C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;CAC3B,GAAG,MAAM,CAMT;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,iBAAiB,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAG,MAAM,CAkB9F;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AACH,wBAAgB,wBAAwB,CACvC,gBAAgB,EAAE,MAAM,EACxB,iBAAiB,EAAE,MAAM,GACvB,MAAM,CAmCR;AAED;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,MAAO,CAAC;AAE7C;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,CAC1C,gBAAgB,EAAE,MAAM,EACxB,iBAAiB,EAAE,MAAM,GACvB,MAAM,GAAG,SAAS,CAKpB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAYtG;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG;IACtD,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,UAAU,CAAC;CACzE,GAAG,IAAI,CASP"}
1
+ {"version":3,"file":"oti.d.ts","sourceRoot":"","sources":["../src/oti.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,SAAS;IACzB,2DAA2D;IAC3D,cAAc,EAAE,MAAM,CAAC;IACvB,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,UAAU,CAwBtD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,UAAU,CAWpE;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,UAAU,GAAG,SAAS,GAAG;IAAE,CAAC,EAAE,MAAM,CAAA;CAAE,CAYnE;AAwBD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,MAAM,oBAAoB,GAAG;IAClC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,wBAAgB,sBAAsB,CACrC,GAAG,EAAE,oBAAoB,GAAG,SAAS,GACnC,MAAM,GAAG,SAAS,CAGpB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CACvC,iBAAiB,EAAE,MAAM,EACzB,mBAAmB,EAAE,MAAM,GACzB,MAAM,CAQR;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,iBAAiB,CAChC,iBAAiB,EAAE,MAAM,EACzB,YAAY,GAAE,MAAY,GACxB,MAAM,CAkBR;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IAC1C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;CAC3B,GAAG,MAAM,CAMT;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,iBAAiB,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAG,MAAM,CAkB9F;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AACH,wBAAgB,wBAAwB,CACvC,gBAAgB,EAAE,MAAM,EACxB,iBAAiB,EAAE,MAAM,GACvB,MAAM,CAmCR;AAED;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,MAAO,CAAC;AAE7C;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAE5C,+EAA+E;AAC/E,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,CAC1C,gBAAgB,EAAE,MAAM,EACxB,iBAAiB,EAAE,MAAM,GACvB,MAAM,GAAG,SAAS,CAKpB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAYtG;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG;IACtD,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,UAAU,CAAC;CACzE,GAAG,IAAI,CASP"}
package/dist/oti.js CHANGED
@@ -93,7 +93,7 @@ function validateOTIFields(F, T, Z, N, Al) {
93
93
  }
94
94
  export function catalogFecInterleaveMs(fec) {
95
95
  const ms = fec?.interleaveDepthMs;
96
- return typeof ms === "number" && ms > 0 && Number.isFinite(ms) ? ms : undefined;
96
+ return typeof ms === "number" && Number.isSafeInteger(ms) && ms >= 0 ? ms : undefined;
97
97
  }
98
98
  /**
99
99
  * Derive the integer FEC interleave depth D from a catalog block span and the
@@ -314,6 +314,14 @@ export function deriveFecRetentionBlocks(deliveryWindowMs, interleaveDepthMs) {
314
314
  * anywhere else.
315
315
  */
316
316
  export const MAX_FEC_RETENTION_BLOCKS = 0xff;
317
+ /**
318
+ * Receiver-local block retention used when the catalog carries no elapsed-time
319
+ * FEC window. This is a memory/cleanup bound only; it is never derived from
320
+ * media rate and never treated as a catalog deadline.
321
+ */
322
+ export const LOCAL_FEC_RETENTION_BLOCKS = 2;
323
+ /** Receiver-local cleanup budget used when the catalog has no elapsed span. */
324
+ export const LOCAL_FEC_TIMEOUT_MS = 500;
317
325
  /**
318
326
  * `deriveFecRetentionBlocks` without the throw: the block count, or `undefined`
319
327
  * when the geometry cannot define one.
package/dist/oti.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"oti.js","sourceRoot":"","sources":["../src/oti.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"oti.js","sourceRoot":"","sources":["../src/oti.ts"],"names":[],"mappings":"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"}
@@ -79,4 +79,90 @@ export declare function repairFetchRange(lostSsId: number, kMax: number, anchor:
79
79
  * a 62-bit group id
80
80
  */
81
81
  export declare function repairGroupIdMatches(groupId: bigint, ssStart: number, reference?: bigint): boolean;
82
+ /**
83
+ * What a repair FETCH for one block names, or why none is sent: an
84
+ * `iso-ssbg1-v1` block's repair group is the one Group `ext(SS_Start)`
85
+ * (draft-ramadan-moq-fec §7.5).
86
+ *
87
+ * - `no-epoch`: no reference is established for the repair track on this
88
+ * session, so there is no range to request until one is (§7.5).
89
+ * - `epoch-unbounded`: SS_Start is exactly 2^31 from the reference, or
90
+ * extends outside [0, 2^62). The reference is dropped so the next one
91
+ * re-establishes it.
92
+ * - `stale-session`: the request names a session other than the bound one.
93
+ */
94
+ export type RepairGroupPlan = {
95
+ readonly group: bigint;
96
+ } | {
97
+ readonly reason: "no-epoch" | "epoch-unbounded" | "stale-session";
98
+ };
99
+ /** Outcome of reporting a repair track's Largest Location (§7.5 way 2). */
100
+ export type RepairLargestOutcome = "established" | "advanced" | "redundant" | "absent" | "stale-session";
101
+ /**
102
+ * Counted outcomes of {@link RepairEpochReferences}. A successful
103
+ * {@link RepairEpochReferences.repairGroup} and a same-session `bind` are not
104
+ * counted.
105
+ */
106
+ export interface RepairEpochStats {
107
+ establishedFromLargest: number;
108
+ advancedFromLargest: number;
109
+ largestAbsent: number;
110
+ largestRedundant: number;
111
+ establishedFromGroupId: number;
112
+ admitted: number;
113
+ discarded: number;
114
+ declinedNoEpoch: number;
115
+ epochUnbounded: number;
116
+ staleSession: number;
117
+ sessionResets: number;
118
+ streamResets: number;
119
+ }
120
+ /**
121
+ * The wrap-epoch reference `r` of each repair track, for one MoQ session
122
+ * (draft-ramadan-moq-fec §7.5). Shared by every native receiver adapter; the
123
+ * adapter owns its MoQ verbs and passes its session as an opaque object.
124
+ *
125
+ * - The adapter calls {@link bind} with the session it holds live, at the
126
+ * synchronous point it reads it. A different session drops every reference:
127
+ * the SS_IDs between a reconnection and the last reference cannot be bounded
128
+ * below 2^31. {@link clear} does the same for a stream or track reset.
129
+ * - Every other call names the session it acts for, and one naming a session
130
+ * other than the bound one changes nothing (`stale-session`). An async
131
+ * continuation that outlived its session therefore cannot install that
132
+ * session's reference, nor wipe the live session's.
133
+ * - `r` is established from a non-discarded repair object's Group ID (way 1,
134
+ * {@link admit}) or a Largest Location (way 2), and only ever advances to a
135
+ * newer Group, so it stays near the live edge for the life of the session.
136
+ * Epoch 0 (way 3) needs proof of observing the instance's first block, which
137
+ * nothing on the wire carries (SS_IDs start anywhere, C.5.2); it is not used.
138
+ */
139
+ export declare class RepairEpochReferences {
140
+ #private;
141
+ readonly stats: RepairEpochStats;
142
+ /** Make `session` the live one; a different session drops every reference. */
143
+ bind(session: object): void;
144
+ /** Drop every reference: the stream or track was reset. */
145
+ clear(): void;
146
+ /** `r` of `repairTrack` on `session`; undefined when none, or the session is not the bound one. */
147
+ reference(session: object, repairTrack: string): bigint | undefined;
148
+ /**
149
+ * §7.5 way 2: the Largest Location reported for `repairTrack`, whose Group
150
+ * is ext(SS_Start) of the newest repair block. Undefined means an empty
151
+ * track and establishes nothing.
152
+ *
153
+ * @throws RangeError when the Group is not a 62-bit MoQ group id
154
+ */
155
+ establishFromLargestLocation(session: object, repairTrack: string, largestGroup: bigint | undefined): RepairLargestOutcome;
156
+ /**
157
+ * Screen one repair object received over MoQ (§7.5): false means discard
158
+ * it, leaving every block's state unchanged. An admitted object's Group ID
159
+ * establishes `r` when none is held (way 1) and advances it when newer.
160
+ */
161
+ admit(session: object, repairTrack: string, groupId: bigint, ssStart: number): boolean;
162
+ /**
163
+ * The repair group of the `iso-ssbg1-v1` block starting at `ssStart`, the
164
+ * scheduler's `RepairFetchRequest.sbn`: the one Group ext(SS_Start).
165
+ */
166
+ repairGroup(session: object, repairTrack: string, ssStart: number): RepairGroupPlan;
167
+ }
82
168
  //# sourceMappingURL=repair-group.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"repair-group.d.ts","sourceRoot":"","sources":["../src/repair-group.ts"],"names":[],"mappings":"AAwDA;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAMrE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAmBlE;AAED,iEAAiE;AACjE,MAAM,WAAW,gBAAgB;IAChC,gCAAgC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,wDAAwD;IACxD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC1B;AAED,uEAAuE;AACvE,MAAM,MAAM,iBAAiB;AAC5B;;;iEAGiE;AAC/D;IAAE,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAA;CAAE;AACzC;0DAC0D;GACxD;IAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,gBAAgB,CAqB5G;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAWlG"}
1
+ {"version":3,"file":"repair-group.d.ts","sourceRoot":"","sources":["../src/repair-group.ts"],"names":[],"mappings":"AAwDA;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAMrE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAmBlE;AAED,iEAAiE;AACjE,MAAM,WAAW,gBAAgB;IAChC,gCAAgC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,wDAAwD;IACxD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC1B;AAED,uEAAuE;AACvE,MAAM,MAAM,iBAAiB;AAC5B;;;iEAGiE;AAC/D;IAAE,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAA;CAAE;AACzC;0DAC0D;GACxD;IAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,gBAAgB,CAqB5G;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAWlG;AAED;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,eAAe,GACxB;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,iBAAiB,GAAG,eAAe,CAAA;CAAE,CAAC;AAEzE,2EAA2E;AAC3E,MAAM,MAAM,oBAAoB,GAAG,aAAa,GAAG,UAAU,GAAG,WAAW,GAAG,QAAQ,GAAG,eAAe,CAAC;AAEzG;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAChC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,qBAAqB;;IACjC,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAa9B;IAIF,8EAA8E;IAC9E,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAS3B,2DAA2D;IAC3D,KAAK,IAAI,IAAI;IAKb,mGAAmG;IACnG,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAUnE;;;;;;OAMG;IACH,4BAA4B,CAC3B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GAAG,SAAS,GAC9B,oBAAoB;IAqBvB;;;;OAIG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAatF;;;OAGG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,eAAe;CAiBnF"}
@@ -167,4 +167,139 @@ export function repairGroupIdMatches(groupId, ssStart, reference) {
167
167
  return false;
168
168
  }
169
169
  }
170
+ /**
171
+ * The wrap-epoch reference `r` of each repair track, for one MoQ session
172
+ * (draft-ramadan-moq-fec §7.5). Shared by every native receiver adapter; the
173
+ * adapter owns its MoQ verbs and passes its session as an opaque object.
174
+ *
175
+ * - The adapter calls {@link bind} with the session it holds live, at the
176
+ * synchronous point it reads it. A different session drops every reference:
177
+ * the SS_IDs between a reconnection and the last reference cannot be bounded
178
+ * below 2^31. {@link clear} does the same for a stream or track reset.
179
+ * - Every other call names the session it acts for, and one naming a session
180
+ * other than the bound one changes nothing (`stale-session`). An async
181
+ * continuation that outlived its session therefore cannot install that
182
+ * session's reference, nor wipe the live session's.
183
+ * - `r` is established from a non-discarded repair object's Group ID (way 1,
184
+ * {@link admit}) or a Largest Location (way 2), and only ever advances to a
185
+ * newer Group, so it stays near the live edge for the life of the session.
186
+ * Epoch 0 (way 3) needs proof of observing the instance's first block, which
187
+ * nothing on the wire carries (SS_IDs start anywhere, C.5.2); it is not used.
188
+ */
189
+ export class RepairEpochReferences {
190
+ stats = {
191
+ establishedFromLargest: 0,
192
+ advancedFromLargest: 0,
193
+ largestAbsent: 0,
194
+ largestRedundant: 0,
195
+ establishedFromGroupId: 0,
196
+ admitted: 0,
197
+ discarded: 0,
198
+ declinedNoEpoch: 0,
199
+ epochUnbounded: 0,
200
+ staleSession: 0,
201
+ sessionResets: 0,
202
+ streamResets: 0,
203
+ };
204
+ #session;
205
+ #references = new Map();
206
+ /** Make `session` the live one; a different session drops every reference. */
207
+ bind(session) {
208
+ if (this.#session === session)
209
+ return;
210
+ if (this.#session !== undefined) {
211
+ this.#references.clear();
212
+ this.stats.sessionResets++;
213
+ }
214
+ this.#session = session;
215
+ }
216
+ /** Drop every reference: the stream or track was reset. */
217
+ clear() {
218
+ this.#references.clear();
219
+ this.stats.streamResets++;
220
+ }
221
+ /** `r` of `repairTrack` on `session`; undefined when none, or the session is not the bound one. */
222
+ reference(session, repairTrack) {
223
+ return session === this.#session ? this.#references.get(repairTrack) : undefined;
224
+ }
225
+ #live(session) {
226
+ if (session === this.#session)
227
+ return true;
228
+ this.stats.staleSession++;
229
+ return false;
230
+ }
231
+ /**
232
+ * §7.5 way 2: the Largest Location reported for `repairTrack`, whose Group
233
+ * is ext(SS_Start) of the newest repair block. Undefined means an empty
234
+ * track and establishes nothing.
235
+ *
236
+ * @throws RangeError when the Group is not a 62-bit MoQ group id
237
+ */
238
+ establishFromLargestLocation(session, repairTrack, largestGroup) {
239
+ if (largestGroup !== undefined)
240
+ assertGroupId(largestGroup, "Largest Location Group");
241
+ if (!this.#live(session))
242
+ return "stale-session";
243
+ if (largestGroup === undefined) {
244
+ this.stats.largestAbsent++;
245
+ return "absent";
246
+ }
247
+ const held = this.#references.get(repairTrack);
248
+ if (held !== undefined && largestGroup <= held) {
249
+ this.stats.largestRedundant++;
250
+ return "redundant";
251
+ }
252
+ this.#references.set(repairTrack, largestGroup);
253
+ if (held === undefined) {
254
+ this.stats.establishedFromLargest++;
255
+ return "established";
256
+ }
257
+ this.stats.advancedFromLargest++;
258
+ return "advanced";
259
+ }
260
+ /**
261
+ * Screen one repair object received over MoQ (§7.5): false means discard
262
+ * it, leaving every block's state unchanged. An admitted object's Group ID
263
+ * establishes `r` when none is held (way 1) and advances it when newer.
264
+ */
265
+ admit(session, repairTrack, groupId, ssStart) {
266
+ if (!this.#live(session))
267
+ return false;
268
+ const held = this.#references.get(repairTrack);
269
+ if (!repairGroupIdMatches(groupId, ssStart, held)) {
270
+ this.stats.discarded++;
271
+ return false;
272
+ }
273
+ this.stats.admitted++;
274
+ if (held === undefined)
275
+ this.stats.establishedFromGroupId++;
276
+ if (held === undefined || groupId > held)
277
+ this.#references.set(repairTrack, groupId);
278
+ return true;
279
+ }
280
+ /**
281
+ * The repair group of the `iso-ssbg1-v1` block starting at `ssStart`, the
282
+ * scheduler's `RepairFetchRequest.sbn`: the one Group ext(SS_Start).
283
+ */
284
+ repairGroup(session, repairTrack, ssStart) {
285
+ assertSsId(ssStart, "ssStart");
286
+ if (!this.#live(session))
287
+ return { reason: "stale-session" };
288
+ const reference = this.#references.get(repairTrack);
289
+ if (reference === undefined) {
290
+ this.stats.declinedNoEpoch++;
291
+ return { reason: "no-epoch" };
292
+ }
293
+ try {
294
+ return { group: extendSsId(reference, ssStart) };
295
+ }
296
+ catch (error) {
297
+ if (!(error instanceof RangeError))
298
+ throw error;
299
+ this.#references.delete(repairTrack);
300
+ this.stats.epochUnbounded++;
301
+ return { reason: "epoch-unbounded" };
302
+ }
303
+ }
304
+ }
170
305
  //# sourceMappingURL=repair-group.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"repair-group.js","sourceRoot":"","sources":["../src/repair-group.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"repair-group.js","sourceRoot":"","sources":["../src/repair-group.ts"],"names":[],"mappings":"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"}