@blockcast/fec-worker 0.1.0-main.fc44423f1ff9 → 0.1.0-main.ffdace838275
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 +10 -6
- package/dist/fec-worker-client.d.ts +10 -6
- package/dist/fec-worker-client.d.ts.map +1 -1
- package/dist/fec-worker-client.js +90 -25
- package/dist/fec-worker-client.js.map +1 -1
- package/dist/fec-worker-types.d.ts +52 -13
- package/dist/fec-worker-types.d.ts.map +1 -1
- package/dist/fec-worker.js +62 -44
- package/dist/fec-worker.js.map +2 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/fec-worker-client.ts +97 -26
- package/src/fec-worker-types.ts +50 -9
- package/src/fec-worker.ts +99 -67
- package/src/index.ts +2 -0
package/README.md
CHANGED
|
@@ -114,11 +114,12 @@ All messages are typed as discriminated unions in `fec-worker-types.ts`. Both th
|
|
|
114
114
|
| `feedRepair` | `ssStart: number`, `ssbLength: number`, `rsId: number`, `data: ArrayBuffer`, `ts: number` | `data` |
|
|
115
115
|
| `relayBlockSig` | `sbn: number`, `sig: ArrayBuffer`, `hash: ArrayBuffer` | `sig`, `hash` |
|
|
116
116
|
| `cleanup` | `sbns: number[]` (all timed-out blocks covered by this coalesced barrier) | none |
|
|
117
|
+
| `subscribeBlockUpdates` | — (send only after `capabilities` lists it) | none |
|
|
117
118
|
| `dispose` | — | none |
|
|
118
119
|
|
|
119
120
|
`feedSource` carries the **flat 32-bit Source Symbol ID** from the MMTP Source FEC Payload ID (ISO 23008-1 §C.5.2). The WASM decoder derives `SBN = floor(ssId / K)` and `ESI = ssId % K` internally — do not pre-compute these.
|
|
120
121
|
|
|
121
|
-
`feedRepair` carries the wire-level Repair FEC Payload ID fields directly (ISO 23008-1 §C.5.3): `ssStart` is the SS_ID of the first source symbol in the block, `ssbLength`
|
|
122
|
+
`feedRepair` carries the wire-level Repair FEC Payload ID fields directly (ISO 23008-1 §C.5.3): `ssStart` is the SS_ID of the first source symbol in the block (`SBN * configured K`), `ssbLength` is the authored source-symbol count in `1..configured K`, and `rsId` is the repair index within the block. The decoder's block geometry and repair ESI use the configured K; K is never inferred from repair traffic.
|
|
122
123
|
|
|
123
124
|
### Outbound — `FecWorkerEvent` (worker → main)
|
|
124
125
|
|
|
@@ -126,11 +127,13 @@ All messages are typed as discriminated unions in `fec-worker-types.ts`. Both th
|
|
|
126
127
|
|--------|---------|------------------|
|
|
127
128
|
| `frame` | `data: ArrayBuffer`, `meta: FrameMeta` | `data` |
|
|
128
129
|
| `snapshot` | `stats: FecTrackStats` | none (structured clone) |
|
|
129
|
-
| `
|
|
130
|
-
| `
|
|
130
|
+
| `capabilities` | `commands: FecWorkerOptionalCommand[]` (after `configure`) | none |
|
|
131
|
+
| `blockUpdate` | `block: FecBlockSnapshot` (only after `subscribeBlockUpdates`) | none |
|
|
131
132
|
| `cleanupComplete` | `sbns: number[]` | none |
|
|
132
133
|
| `error` | `message: string` | none |
|
|
133
134
|
|
|
135
|
+
The Worker posts `blockUpdate` only to a client that sent `subscribeBlockUpdates`: each one is a structured clone and a page-thread task, and the snapshot already counts every transition. `FecWorkerClient` subscribes when `onBlockUpdate` is registered and the Worker has announced the command. A Worker that predates the command posts `blockUpdate` unasked and is never sent it (BLO-36599).
|
|
136
|
+
|
|
134
137
|
`FrameMeta` carries `recovered: boolean` (this frame came out of the FEC decode, not the direct path), `sbn: number`, and `altaVerified: boolean | null` (signature outcome, or `null` when ALTA is not configured / verification is pending).
|
|
135
138
|
|
|
136
139
|
## Lifecycle
|
|
@@ -140,7 +143,7 @@ new FecWorkerClient(url)
|
|
|
140
143
|
│ worker spawned with { type: "module" }
|
|
141
144
|
▼
|
|
142
145
|
client.configure(config, wasmModule [, altaPublicKey, altaWasmModule])
|
|
143
|
-
│ worker initSyncs WASM, instantiates MmtFecDecoder(interleaveDepth
|
|
146
|
+
│ worker initSyncs WASM, instantiates MmtFecDecoder(interleaveDepth),
|
|
144
147
|
│ immediately configures exact catalog K/T (no decoder defaults),
|
|
145
148
|
│ derives pendingVerifyCap = ceil(D × 1.5) and TTL = ceil(K × interleaveMs × 1.5)
|
|
146
149
|
│ from catalog values, throws if any of K / D / interleaveMs ≤ 0,
|
|
@@ -154,7 +157,9 @@ client.feedSource(...) / feedRepair(...) ◄── steady state
|
|
|
154
157
|
client.cleanup(sbn) ◄── per-block inactivity deadline
|
|
155
158
|
│ coalesces queued SBNs behind one worker queue-drain barrier
|
|
156
159
|
│ evicts blocks relative to max(sbns) − D × 3
|
|
157
|
-
│
|
|
160
|
+
│ retires exactly those SBNs via WASM cleanup_blocks_detailed(); a lost
|
|
161
|
+
│ block is never answered with a synthesised frame (sinks hold the last
|
|
162
|
+
│ good frame, per @blockcast/mmt-container conceal-timeline)
|
|
158
163
|
│ acknowledges every SBN in {type:"cleanupComplete", sbns}
|
|
159
164
|
│ any block still in "collecting" at eviction time is counted as failed
|
|
160
165
|
▼
|
|
@@ -179,7 +184,6 @@ The `snapshot` event delivers a `FecTrackStats` every 200 ms (catalog-derived; n
|
|
|
179
184
|
| `blocksComplete` | Block had all K source symbols without needing repair |
|
|
180
185
|
| `blocksRecovered` | Block was recovered using ≥1 repair symbol |
|
|
181
186
|
| `blocksFailed` | Block aged out before reaching K |
|
|
182
|
-
| `greenFillFrames` | Frames substituted with green-fill on unrecoverable loss |
|
|
183
187
|
| `recoveryRate` | `recovered / (recovered + failed)`, 0–100 |
|
|
184
188
|
| `avgRecoveryMs`, `maxRecoveryMs` | Rolling decode latency (capped at 1000 samples) |
|
|
185
189
|
| `liveSbn` | Highest source-block number observed |
|
|
@@ -25,7 +25,8 @@ export declare class FecWorkerClient {
|
|
|
25
25
|
configure(config: FecTrackConfig, wasmModule: WebAssembly.Module, altaPublicKey?: ArrayBuffer, altaWasmModule?: WebAssembly.Module): void;
|
|
26
26
|
/**
|
|
27
27
|
* Feed a source symbol to the Worker. data ArrayBuffer is transferred (zero-copy).
|
|
28
|
-
* Caller must not access data after this call — it is
|
|
28
|
+
* Caller must not access data after this call — it is transferred with the
|
|
29
|
+
* task's symbol batch, before any later command of this client.
|
|
29
30
|
*
|
|
30
31
|
* Optional `alta` carries the detached ALTA authenticator bytes and the
|
|
31
32
|
* byte offset in `data` where the signed payload ends. The auth buffer is
|
|
@@ -41,8 +42,8 @@ export declare class FecWorkerClient {
|
|
|
41
42
|
* Caller must not access data after this call — it is detached.
|
|
42
43
|
*
|
|
43
44
|
* Carries the wire-level Repair FEC Payload ID fields (ISO 23008-1 §C.5.3):
|
|
44
|
-
* - ssStart: SS_ID of first source symbol in the block (= SBN *
|
|
45
|
-
* - ssbLength:
|
|
45
|
+
* - ssStart: SS_ID of first source symbol in the block (= SBN * configured K)
|
|
46
|
+
* - ssbLength: authored source-symbol count (1..configured K)
|
|
46
47
|
* - rsId: repair symbol index within the block
|
|
47
48
|
*/
|
|
48
49
|
feedRepair(ssStart: number, ssbLength: number, rsId: number, data: ArrayBuffer, ts: number): void;
|
|
@@ -63,10 +64,13 @@ export declare class FecWorkerClient {
|
|
|
63
64
|
onFrame(cb: (data: ArrayBuffer, meta: FrameMeta) => void): void;
|
|
64
65
|
/** Register callback for periodic stats snapshots (FEC-04). */
|
|
65
66
|
onSnapshot(cb: (stats: FecTrackStats) => void): void;
|
|
66
|
-
/**
|
|
67
|
+
/**
|
|
68
|
+
* Register callback for individual block state changes. The Worker posts
|
|
69
|
+
* them only once asked, so registering subscribes (after the Worker
|
|
70
|
+
* announces `subscribeBlockUpdates`). An older Worker that does not
|
|
71
|
+
* announce it posts them unasked.
|
|
72
|
+
*/
|
|
67
73
|
onBlockUpdate(cb: (block: FecBlockSnapshot) => void): void;
|
|
68
|
-
/** Register callback for green-fill frames. */
|
|
69
|
-
onGreenFill(cb: (sbn: number, data: ArrayBuffer) => void): void;
|
|
70
74
|
/** Register callback fired after the Worker drains all commands queued before cleanup. */
|
|
71
75
|
onCleanupComplete(cb: (sbn: number) => void): void;
|
|
72
76
|
/** Register callback for Worker errors. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fec-worker-client.d.ts","sourceRoot":"","sources":["../src/fec-worker-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"fec-worker-client.d.ts","sourceRoot":"","sources":["../src/fec-worker-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAIX,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,SAAS,EACT,kBAAkB,EAClB,MAAM,uBAAuB,CAAC;AAE/B,qBAAa,eAAe;;IA2B3B;;;OAGG;gBACS,WAAW,EAAE,MAAM,GAAG,GAAG;IAgBrC;;;;;;OAMG;IACH,SAAS,CACR,MAAM,EAAE,cAAc,EACtB,UAAU,EAAE,WAAW,CAAC,MAAM,EAC9B,aAAa,CAAC,EAAE,WAAW,EAC3B,cAAc,CAAC,EAAE,WAAW,CAAC,MAAM,GACjC,IAAI;IAmBP;;;;;;;;;OASG;IACH,UAAU,CACT,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,WAAW,EACjB,EAAE,EAAE,MAAM,EACV,IAAI,CAAC,EAAE;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAC9C,IAAI;IAoBP;;;;;;;;OAQG;IACH,UAAU,CACT,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,WAAW,EACjB,EAAE,EAAE,MAAM,GACR,IAAI;IAqCP;;OAEG;IACH,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI;IASrE;;;;;OAKG;IACH,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAgBjC,8EAA8E;IAC9E,KAAK,IAAI,IAAI;IAoBb,+DAA+D;IAC/D,OAAO,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,KAAK,IAAI,GAAG,IAAI;IAI/D,+DAA+D;IAC/D,UAAU,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,GAAG,IAAI;IAIpD;;;;;OAKG;IACH,aAAa,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,GAAG,IAAI;IAkB1D,0FAA0F;IAC1F,iBAAiB,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAIlD,2CAA2C;IAC3C,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,KAAK,IAAI,GAAG,IAAI;IAIvE;;;;;OAKG;IACH,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;;OAGG;IACH,OAAO,IAAI,IAAI;CA6Df"}
|
|
@@ -12,7 +12,6 @@ export class FecWorkerClient {
|
|
|
12
12
|
#onFrame = null;
|
|
13
13
|
#onSnapshot = null;
|
|
14
14
|
#onBlockUpdate = null;
|
|
15
|
-
#onGreenFill = null;
|
|
16
15
|
#onCleanupComplete = null;
|
|
17
16
|
#onError = null;
|
|
18
17
|
#cleanupInFlight = null;
|
|
@@ -20,6 +19,20 @@ export class FecWorkerClient {
|
|
|
20
19
|
#pendingResets = 0;
|
|
21
20
|
#resetFailed = false;
|
|
22
21
|
#disposed = false;
|
|
22
|
+
// Symbols fed during the current task, sent as one feedSymbols message
|
|
23
|
+
// when the task's microtasks run (BLO-36599). A packet stream delivers many
|
|
24
|
+
// symbols per task, and each postMessage is a structured-clone round trip
|
|
25
|
+
// on the page thread; the batch boundary is the task, not a size or timer.
|
|
26
|
+
#pendingSymbols = [];
|
|
27
|
+
#pendingTransfer = [];
|
|
28
|
+
#flushQueued = false;
|
|
29
|
+
// Batching starts only once the Worker announced it accepts feedSymbols.
|
|
30
|
+
#batchSymbols = false;
|
|
31
|
+
// The Worker posts blockUpdate events only to a client that subscribed,
|
|
32
|
+
// which this client does once a callback is registered and the Worker
|
|
33
|
+
// announced the command (BLO-36599).
|
|
34
|
+
#blockUpdatesAnnounced = false;
|
|
35
|
+
#blockUpdatesSubscribed = false;
|
|
23
36
|
/**
|
|
24
37
|
* Create a FecWorkerClient.
|
|
25
38
|
* @param workerOrUrl - Either a Worker instance (for testing) or a URL to create one
|
|
@@ -49,6 +62,7 @@ export class FecWorkerClient {
|
|
|
49
62
|
configure(config, wasmModule, altaPublicKey, altaWasmModule) {
|
|
50
63
|
if (this.#disposed)
|
|
51
64
|
throw new Error("[FecWorkerClient] disposed");
|
|
65
|
+
this.#flushSymbols();
|
|
52
66
|
const cmd = {
|
|
53
67
|
type: "configure",
|
|
54
68
|
config,
|
|
@@ -67,7 +81,8 @@ export class FecWorkerClient {
|
|
|
67
81
|
}
|
|
68
82
|
/**
|
|
69
83
|
* Feed a source symbol to the Worker. data ArrayBuffer is transferred (zero-copy).
|
|
70
|
-
* Caller must not access data after this call — it is
|
|
84
|
+
* Caller must not access data after this call — it is transferred with the
|
|
85
|
+
* task's symbol batch, before any later command of this client.
|
|
71
86
|
*
|
|
72
87
|
* Optional `alta` carries the detached ALTA authenticator bytes and the
|
|
73
88
|
* byte offset in `data` where the signed payload ends. The auth buffer is
|
|
@@ -77,39 +92,63 @@ export class FecWorkerClient {
|
|
|
77
92
|
feedSource(ssId, data, ts, alta) {
|
|
78
93
|
if (this.#disposed)
|
|
79
94
|
throw new Error("[FecWorkerClient] feedSource on a disposed client");
|
|
80
|
-
|
|
81
|
-
|
|
95
|
+
if (alta) {
|
|
96
|
+
this.#queueSymbol({
|
|
82
97
|
type: "feedSource",
|
|
83
98
|
ssId,
|
|
84
99
|
data,
|
|
85
100
|
ts,
|
|
86
101
|
altaAuth: alta.auth,
|
|
87
102
|
altaPayloadEnd: alta.payloadEnd,
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
103
|
+
}, data, alta.auth);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
this.#queueSymbol({ type: "feedSource", ssId, data, ts }, data);
|
|
107
|
+
}
|
|
92
108
|
}
|
|
93
109
|
/**
|
|
94
110
|
* Feed a repair symbol to the Worker. data ArrayBuffer is transferred (zero-copy).
|
|
95
111
|
* Caller must not access data after this call — it is detached.
|
|
96
112
|
*
|
|
97
113
|
* Carries the wire-level Repair FEC Payload ID fields (ISO 23008-1 §C.5.3):
|
|
98
|
-
* - ssStart: SS_ID of first source symbol in the block (= SBN *
|
|
99
|
-
* - ssbLength:
|
|
114
|
+
* - ssStart: SS_ID of first source symbol in the block (= SBN * configured K)
|
|
115
|
+
* - ssbLength: authored source-symbol count (1..configured K)
|
|
100
116
|
* - rsId: repair symbol index within the block
|
|
101
117
|
*/
|
|
102
118
|
feedRepair(ssStart, ssbLength, rsId, data, ts) {
|
|
103
119
|
if (this.#disposed)
|
|
104
120
|
throw new Error("[FecWorkerClient] feedRepair on a disposed client");
|
|
105
|
-
this.#
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
121
|
+
this.#queueSymbol({ type: "feedRepair", ssStart, ssbLength, rsId, data, ts }, data);
|
|
122
|
+
}
|
|
123
|
+
#queueSymbol(symbol, data, auth) {
|
|
124
|
+
if (!this.#batchSymbols) {
|
|
125
|
+
this.#worker.postMessage(symbol, auth ? [data, auth] : [data]);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
this.#pendingSymbols.push(symbol);
|
|
129
|
+
this.#pendingTransfer.push(data);
|
|
130
|
+
if (auth)
|
|
131
|
+
this.#pendingTransfer.push(auth);
|
|
132
|
+
if (this.#flushQueued)
|
|
133
|
+
return;
|
|
134
|
+
this.#flushQueued = true;
|
|
135
|
+
queueMicrotask(() => {
|
|
136
|
+
this.#flushQueued = false;
|
|
137
|
+
this.#flushSymbols();
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Send the symbols fed so far. Every other command calls this first, so a
|
|
142
|
+
* cleanup barrier, reset or signature still follows all earlier symbols.
|
|
143
|
+
*/
|
|
144
|
+
#flushSymbols() {
|
|
145
|
+
if (this.#pendingSymbols.length === 0 || this.#disposed)
|
|
146
|
+
return;
|
|
147
|
+
const symbols = this.#pendingSymbols;
|
|
148
|
+
const transfer = this.#pendingTransfer;
|
|
149
|
+
this.#pendingSymbols = [];
|
|
150
|
+
this.#pendingTransfer = [];
|
|
151
|
+
this.#worker.postMessage({ type: "feedSymbols", symbols }, transfer);
|
|
113
152
|
}
|
|
114
153
|
/**
|
|
115
154
|
* Submit relay block signature for verification. sig and hash are transferred.
|
|
@@ -117,6 +156,7 @@ export class FecWorkerClient {
|
|
|
117
156
|
relayBlockSig(sbn, sig, hash) {
|
|
118
157
|
if (this.#disposed)
|
|
119
158
|
throw new Error("[FecWorkerClient] relayBlockSig on a disposed client");
|
|
159
|
+
this.#flushSymbols();
|
|
120
160
|
this.#worker.postMessage({ type: "relayBlockSig", sbn, sig, hash }, [sig, hash]);
|
|
121
161
|
}
|
|
122
162
|
/**
|
|
@@ -143,12 +183,16 @@ export class FecWorkerClient {
|
|
|
143
183
|
reset() {
|
|
144
184
|
if (this.#disposed)
|
|
145
185
|
throw new Error("[FecWorkerClient] reset on a disposed client");
|
|
186
|
+
this.#flushSymbols();
|
|
146
187
|
this.#pendingResets++;
|
|
147
188
|
this.#cleanupInFlight = null;
|
|
148
189
|
this.#queuedCleanupSbns.clear();
|
|
149
190
|
this.#worker.postMessage({ type: "reset" });
|
|
150
191
|
}
|
|
151
192
|
#postCleanup(sbns) {
|
|
193
|
+
// The cleanup is a queue-drain barrier: every symbol fed before it is
|
|
194
|
+
// posted must reach the Worker first.
|
|
195
|
+
this.#flushSymbols();
|
|
152
196
|
this.#cleanupInFlight = sbns;
|
|
153
197
|
const orderedSbns = [...sbns].sort((a, b) => a - b);
|
|
154
198
|
this.#worker.postMessage({ type: "cleanup", sbns: orderedSbns });
|
|
@@ -161,13 +205,24 @@ export class FecWorkerClient {
|
|
|
161
205
|
onSnapshot(cb) {
|
|
162
206
|
this.#onSnapshot = cb;
|
|
163
207
|
}
|
|
164
|
-
/**
|
|
208
|
+
/**
|
|
209
|
+
* Register callback for individual block state changes. The Worker posts
|
|
210
|
+
* them only once asked, so registering subscribes (after the Worker
|
|
211
|
+
* announces `subscribeBlockUpdates`). An older Worker that does not
|
|
212
|
+
* announce it posts them unasked.
|
|
213
|
+
*/
|
|
165
214
|
onBlockUpdate(cb) {
|
|
166
215
|
this.#onBlockUpdate = cb;
|
|
216
|
+
this.#subscribeBlockUpdates();
|
|
167
217
|
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
218
|
+
#subscribeBlockUpdates() {
|
|
219
|
+
if (this.#disposed ||
|
|
220
|
+
this.#blockUpdatesSubscribed ||
|
|
221
|
+
!this.#blockUpdatesAnnounced ||
|
|
222
|
+
!this.#onBlockUpdate)
|
|
223
|
+
return;
|
|
224
|
+
this.#blockUpdatesSubscribed = true;
|
|
225
|
+
this.#worker.postMessage({ type: "subscribeBlockUpdates" });
|
|
171
226
|
}
|
|
172
227
|
/** Register callback fired after the Worker drains all commands queued before cleanup. */
|
|
173
228
|
onCleanupComplete(cb) {
|
|
@@ -194,12 +249,25 @@ export class FecWorkerClient {
|
|
|
194
249
|
if (this.#disposed)
|
|
195
250
|
return;
|
|
196
251
|
this.#disposed = true;
|
|
252
|
+
// A terminated Worker decodes nothing; symbols still batched are dropped.
|
|
253
|
+
this.#pendingSymbols = [];
|
|
254
|
+
this.#pendingTransfer = [];
|
|
197
255
|
this.#cleanupInFlight = null;
|
|
198
256
|
this.#queuedCleanupSbns.clear();
|
|
199
257
|
this.#worker.postMessage({ type: "dispose" });
|
|
200
258
|
this.#worker.terminate();
|
|
201
259
|
}
|
|
202
260
|
#handleEvent(event) {
|
|
261
|
+
if (event.type === "capabilities") {
|
|
262
|
+
if (Array.isArray(event.commands) && event.commands.includes("feedSymbols")) {
|
|
263
|
+
this.#batchSymbols = true;
|
|
264
|
+
}
|
|
265
|
+
if (Array.isArray(event.commands) && event.commands.includes("subscribeBlockUpdates")) {
|
|
266
|
+
this.#blockUpdatesAnnounced = true;
|
|
267
|
+
this.#subscribeBlockUpdates();
|
|
268
|
+
}
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
203
271
|
if (event.type === "resetComplete") {
|
|
204
272
|
this.#pendingResets = Math.max(0, this.#pendingResets - 1);
|
|
205
273
|
this.#resetFailed = false;
|
|
@@ -228,9 +296,6 @@ export class FecWorkerClient {
|
|
|
228
296
|
case "blockUpdate":
|
|
229
297
|
this.#onBlockUpdate?.(event.block);
|
|
230
298
|
break;
|
|
231
|
-
case "greenFill":
|
|
232
|
-
this.#onGreenFill?.(event.sbn, event.data);
|
|
233
|
-
break;
|
|
234
299
|
case "cleanupComplete":
|
|
235
300
|
for (const sbn of event.sbns) {
|
|
236
301
|
this.#onCleanupComplete?.(sbn);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fec-worker-client.js","sourceRoot":"","sources":["../src/fec-worker-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"fec-worker-client.js","sourceRoot":"","sources":["../src/fec-worker-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -52,13 +52,15 @@ export interface FecBlockSnapshot {
|
|
|
52
52
|
/** Source block number */
|
|
53
53
|
sbn: number;
|
|
54
54
|
/** Current block state */
|
|
55
|
-
state: "collecting" | "complete" | "recovered" | "failed"
|
|
55
|
+
state: "collecting" | "complete" | "recovered" | "failed";
|
|
56
56
|
/** Number of source symbols received */
|
|
57
57
|
sourceReceived: number;
|
|
58
58
|
/** Number of repair symbols received */
|
|
59
59
|
repairReceived: number;
|
|
60
|
-
/**
|
|
60
|
+
/** Configured source-block geometry (K) */
|
|
61
61
|
k: number;
|
|
62
|
+
/** Authored source symbols (SSB_length) once a repair symbol declared it */
|
|
63
|
+
ssbLength?: number;
|
|
62
64
|
/** Expected repair symbols (P) */
|
|
63
65
|
repairCount: number;
|
|
64
66
|
/** Timestamp of first symbol arrival (ms) */
|
|
@@ -88,8 +90,6 @@ export interface FecTrackStats {
|
|
|
88
90
|
blocksRecovered: number;
|
|
89
91
|
/** Blocks that failed (unrecoverable) */
|
|
90
92
|
blocksFailed: number;
|
|
91
|
-
/** Frames replaced with green-fill */
|
|
92
|
-
greenFillFrames: number;
|
|
93
93
|
/** Recovery success rate 0-100 */
|
|
94
94
|
recoveryRate: number;
|
|
95
95
|
/** Packets with valid publisher ALTA signature */
|
|
@@ -152,7 +152,7 @@ export interface FecTrackStats {
|
|
|
152
152
|
};
|
|
153
153
|
}
|
|
154
154
|
/** Stable identities for Worker failures whose message text contains live values. */
|
|
155
|
-
export type FecWorkerErrorCode = "recovered-symbol-size-unconfigured" | "recovered-block-too-short" | "repair-symbol-size-mismatch" | "reset-failed" | "unknown-command" | "command-failed" | "worker-runtime" | "worker-message";
|
|
155
|
+
export type FecWorkerErrorCode = "recovered-symbol-size-unconfigured" | "recovered-block-too-short" | "recovered-symbol-ssb-length-invalid" | "repair-symbol-size-mismatch" | "repair-ssb-length-conflict" | "reset-failed" | "unknown-command" | "command-failed" | "worker-runtime" | "worker-message";
|
|
156
156
|
/** Per-frame metadata emitted with frame events from Worker. */
|
|
157
157
|
export interface FrameMeta {
|
|
158
158
|
/** ALTA verification result: true/false after check, null when ALTA not configured (AUTH-04) */
|
|
@@ -161,8 +161,14 @@ export interface FrameMeta {
|
|
|
161
161
|
recovered: boolean;
|
|
162
162
|
/** Source block number this frame belongs to */
|
|
163
163
|
sbn: number;
|
|
164
|
-
/** Encoding Symbol ID within the recovered source block (0..
|
|
164
|
+
/** Encoding Symbol ID within the recovered source block (0..ssbLength-1). */
|
|
165
165
|
esi?: number;
|
|
166
|
+
/**
|
|
167
|
+
* Authored source-symbol count of the recovered block (the repair
|
|
168
|
+
* symbols' SSB_length, 1..K). Recovered frames are ESI 0..ssbLength-1;
|
|
169
|
+
* ESIs ssbLength..K-1 are encoder zero padding and are never emitted.
|
|
170
|
+
*/
|
|
171
|
+
ssbLength?: number;
|
|
166
172
|
}
|
|
167
173
|
/** Discriminated union of all commands sent from main thread to Worker. */
|
|
168
174
|
export type FecWorkerCommand = {
|
|
@@ -200,16 +206,26 @@ export type FecWorkerCommand = {
|
|
|
200
206
|
} | {
|
|
201
207
|
type: "feedRepair";
|
|
202
208
|
/** SS_Start: SS_ID of the first source symbol in the block
|
|
203
|
-
* (= SBN *
|
|
209
|
+
* (= SBN * configured K), from the MMTP Repair FEC Payload ID
|
|
204
210
|
* (ISO 23008-1 §C.5.3). */
|
|
205
211
|
ssStart: number;
|
|
206
|
-
/**
|
|
212
|
+
/** Authored source-symbol count for this block; 1..configured K. */
|
|
207
213
|
ssbLength: number;
|
|
208
214
|
/** RS_ID: repair symbol index within the block; WASM maps to
|
|
209
|
-
* repair ESI =
|
|
215
|
+
* repair ESI = configured K + RS_ID. */
|
|
210
216
|
rsId: number;
|
|
211
217
|
data: ArrayBuffer;
|
|
212
218
|
ts: number;
|
|
219
|
+
} | {
|
|
220
|
+
/**
|
|
221
|
+
* Every source and repair symbol the page fed in one task, in feed
|
|
222
|
+
* order, sharing one transfer list. The client sends symbols this
|
|
223
|
+
* way instead of one message per symbol (BLO-36599); the Worker
|
|
224
|
+
* handles each record exactly like the single-symbol command of the
|
|
225
|
+
* same `type`, and a record that fails does not stop the others.
|
|
226
|
+
*/
|
|
227
|
+
type: "feedSymbols";
|
|
228
|
+
symbols: FecSymbolCommand[];
|
|
213
229
|
} | {
|
|
214
230
|
type: "relayBlockSig";
|
|
215
231
|
sbn: number;
|
|
@@ -221,9 +237,24 @@ export type FecWorkerCommand = {
|
|
|
221
237
|
sbns: number[];
|
|
222
238
|
} | {
|
|
223
239
|
type: "reset";
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Ask the Worker to post a blockUpdate on every block transition. Without
|
|
243
|
+
* it the Worker posts none: each one is a structured clone and a task on
|
|
244
|
+
* the page thread, and the player does not consume them (BLO-36599).
|
|
245
|
+
* Sent only to a Worker that announced it in `capabilities`.
|
|
246
|
+
*/
|
|
247
|
+
| {
|
|
248
|
+
type: "subscribeBlockUpdates";
|
|
224
249
|
} | {
|
|
225
250
|
type: "dispose";
|
|
226
251
|
};
|
|
252
|
+
/** One symbol record of a `feedSymbols` batch. */
|
|
253
|
+
export type FecSymbolCommand = Extract<FecWorkerCommand, {
|
|
254
|
+
type: "feedSource";
|
|
255
|
+
} | {
|
|
256
|
+
type: "feedRepair";
|
|
257
|
+
}>;
|
|
227
258
|
/** Discriminated union of all events emitted from Worker to main thread. */
|
|
228
259
|
export type FecWorkerEvent = {
|
|
229
260
|
type: "frame";
|
|
@@ -235,18 +266,26 @@ export type FecWorkerEvent = {
|
|
|
235
266
|
} | {
|
|
236
267
|
type: "blockUpdate";
|
|
237
268
|
block: FecBlockSnapshot;
|
|
238
|
-
} | {
|
|
239
|
-
type: "greenFill";
|
|
240
|
-
sbn: number;
|
|
241
|
-
data: ArrayBuffer;
|
|
242
269
|
} | {
|
|
243
270
|
type: "cleanupComplete";
|
|
244
271
|
sbns: number[];
|
|
245
272
|
} | {
|
|
246
273
|
type: "resetComplete";
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Optional commands this Worker accepts, posted once it is configured.
|
|
277
|
+
* The client uses `feedSymbols` only after the Worker names it, so a page
|
|
278
|
+
* that meets an older cached Worker bundle keeps sending one command per
|
|
279
|
+
* symbol instead of a batch that Worker would reject (BLO-36599).
|
|
280
|
+
*/
|
|
281
|
+
| {
|
|
282
|
+
type: "capabilities";
|
|
283
|
+
commands: FecWorkerOptionalCommand[];
|
|
247
284
|
} | {
|
|
248
285
|
type: "error";
|
|
249
286
|
message: string;
|
|
250
287
|
code?: FecWorkerErrorCode;
|
|
251
288
|
};
|
|
289
|
+
/** Commands a client may send only after the Worker announced them. */
|
|
290
|
+
export type FecWorkerOptionalCommand = "feedSymbols" | "subscribeBlockUpdates";
|
|
252
291
|
//# sourceMappingURL=fec-worker-types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fec-worker-types.d.ts","sourceRoot":"","sources":["../src/fec-worker-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,mFAAmF;AACnF,MAAM,WAAW,cAAc;IAC9B,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,uBAAuB;IACvB,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC;IAC7B,2CAA2C;IAC3C,UAAU,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,CAAC,EAAE,MAAM,CAAC;IACV,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,eAAe,EAAE,MAAM,CAAC;IACxB,6DAA6D;IAC7D,YAAY,EAAE,MAAM,CAAC;IACrB,8EAA8E;IAC9E,gBAAgB,EAAE,MAAM,CAAC;IACzB,wBAAwB;IACxB,OAAO,EAAE,UAAU,GAAG,QAAQ,CAAC;IAC/B,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,uDAAuD;IACvD,WAAW,EAAE,OAAO,CAAC;IACrB,sEAAsE;IACtE,oBAAoB,EAAE,OAAO,CAAC;CAC9B;AAID,iEAAiE;AACjE,MAAM,WAAW,gBAAgB;IAChC,0BAA0B;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,0BAA0B;IAC1B,KAAK,EAAE,YAAY,GAAG,UAAU,GAAG,WAAW,GAAG,QAAQ,
|
|
1
|
+
{"version":3,"file":"fec-worker-types.d.ts","sourceRoot":"","sources":["../src/fec-worker-types.ts"],"names":[],"mappings":"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"}
|