@blockcast/fec-worker 0.3.0-main.7d476d482371 → 0.3.0-main.81e28ca1c5f5
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 +9 -16
- package/dist/fec-worker-client.d.ts +2 -13
- package/dist/fec-worker-client.d.ts.map +1 -1
- package/dist/fec-worker-client.js +6 -35
- package/dist/fec-worker-client.js.map +1 -1
- package/dist/fec-worker-types.d.ts +2 -60
- package/dist/fec-worker-types.d.ts.map +1 -1
- package/dist/fec-worker-types.js +2 -2
- package/dist/fec-worker.js +0 -69
- package/dist/fec-worker.js.map +2 -2
- package/package.json +4 -7
- package/src/fec-worker-client.ts +4 -37
- package/src/fec-worker-types.ts +2 -60
- package/src/fec-worker.ts +3 -299
package/README.md
CHANGED
|
@@ -23,8 +23,7 @@ const client = new FecWorkerClient(workerUrl)
|
|
|
23
23
|
|
|
24
24
|
client.onFrame((data, meta) => {
|
|
25
25
|
// data is an ArrayBuffer transferred from the worker (zero-copy).
|
|
26
|
-
// meta tells you whether this frame was recovered via FEC
|
|
27
|
-
// configured) whether its source-packet trailer verified.
|
|
26
|
+
// meta tells you whether this frame was recovered via FEC.
|
|
28
27
|
decoder.decode(data) // hand off to WebCodecs / MSE
|
|
29
28
|
})
|
|
30
29
|
client.onSnapshot((stats) => fecPanel.render(stats))
|
|
@@ -46,7 +45,6 @@ const config: FecTrackConfig = {
|
|
|
46
45
|
interleaveMs: 1000, // 30 frames @ 30 fps
|
|
47
46
|
deliveryWindowMs: 2000, // computeFecDeliveryWindowMs(...) from the catalog
|
|
48
47
|
fecMode: "subframe",
|
|
49
|
-
altaEnabled: false,
|
|
50
48
|
relayBlockSigEnabled: false,
|
|
51
49
|
}
|
|
52
50
|
client.configure(config, mmtWasmModule)
|
|
@@ -98,7 +96,7 @@ This is the **Worker-per-track FEC pipeline** architectural decision tracked in
|
|
|
98
96
|
|
|
99
97
|
Buffers cross the boundary via the `Transferable` list. After `postMessage`, the sender's `ArrayBuffer` is detached — touching it throws. This is the contract that makes zero-copy safe: there is no aliased view that could be mutated mid-decode.
|
|
100
98
|
|
|
101
|
-
`WebAssembly.Module` is structured-cloneable (not transferable) and is *cloned* (cheap — the underlying compiled module is shared across realms).
|
|
99
|
+
`WebAssembly.Module` is structured-cloneable (not transferable) and is *cloned* (cheap — the underlying compiled module is shared across realms).
|
|
102
100
|
|
|
103
101
|
Errors that escape the worker's `try/catch` (in either the sync command path or the async configure path) are emitted as `{type: "error", message}` events rather than thrown — the main thread surfaces them through `onError`.
|
|
104
102
|
|
|
@@ -110,8 +108,8 @@ All messages are typed as discriminated unions in `fec-worker-types.ts`. Both th
|
|
|
110
108
|
|
|
111
109
|
| `type` | Payload | Transferred |
|
|
112
110
|
|--------|---------|-------------|
|
|
113
|
-
| `configure` | `config: FecTrackConfig`, `wasmModule: WebAssembly.Module
|
|
114
|
-
| `feedSource` | `ssId: number`, `data: ArrayBuffer`, `ts: number
|
|
111
|
+
| `configure` | `config: FecTrackConfig`, `wasmModule: WebAssembly.Module` | none — WASM modules are structured-cloned |
|
|
112
|
+
| `feedSource` | `ssId: number`, `data: ArrayBuffer`, `ts: number` | `data` |
|
|
115
113
|
| `feedRepair` | `ssStart: number`, `ssbLength: number`, `rsId: number`, `data: ArrayBuffer`, `ts: number` | `data` |
|
|
116
114
|
| `relayBlockSig` | `sbn: number`, `sig: ArrayBuffer`, `hash: ArrayBuffer` | `sig`, `hash` |
|
|
117
115
|
| `cleanup` | `sbns: number[]` (all timed-out blocks covered by this coalesced barrier) | none |
|
|
@@ -135,7 +133,7 @@ All messages are typed as discriminated unions in `fec-worker-types.ts`. Both th
|
|
|
135
133
|
|
|
136
134
|
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).
|
|
137
135
|
|
|
138
|
-
`FrameMeta` carries `recovered: boolean` (this frame came out of the FEC decode, not the direct path), `sbn: number`, and
|
|
136
|
+
`FrameMeta` carries `recovered: boolean` (this frame came out of the FEC decode, not the direct path), `sbn: number`, and for recovered frames `esi` / `ssbLength`. Source provenance is verified upstream at router admission by `@blockcast/mmt-manifest-verify`, not in the Worker.
|
|
139
137
|
|
|
140
138
|
## Lifecycle
|
|
141
139
|
|
|
@@ -143,13 +141,10 @@ The Worker posts `blockUpdate` only to a client that sent `subscribeBlockUpdates
|
|
|
143
141
|
new FecWorkerClient(url)
|
|
144
142
|
│ worker spawned with { type: "module" }
|
|
145
143
|
▼
|
|
146
|
-
client.configure(config, wasmModule
|
|
144
|
+
client.configure(config, wasmModule)
|
|
147
145
|
│ worker initSyncs WASM, instantiates MmtFecDecoder(interleaveDepth, blockProfile),
|
|
148
146
|
│ refuses a decoder whose get_block_profile() differs,
|
|
149
147
|
│ immediately configures exact catalog K/T (no decoder defaults),
|
|
150
|
-
│ bounds the deferred-auth queue to ceil(interleaveDepth × 1.5) entries,
|
|
151
|
-
│ uses a local auth TTL: ceil(K × interleaveMs × 1.5) for positive spans,
|
|
152
|
-
│ or ceil(deliveryWindowMs × 1.5) for zero (neither is a FEC deadline),
|
|
153
148
|
│ rejects invalid geometry or negative spans; zero keeps in-band FEC,
|
|
154
149
|
│ starts the 200 ms snapshot timer, emits initial snapshot
|
|
155
150
|
▼
|
|
@@ -168,8 +163,8 @@ client.cleanup(sbn) ◄── per-block inactivity
|
|
|
168
163
|
│ any block still in "collecting" at eviction time is counted as failed
|
|
169
164
|
▼
|
|
170
165
|
client.dispose()
|
|
171
|
-
sends {type:"dispose"}, terminates worker. WASM decoder
|
|
172
|
-
|
|
166
|
+
sends {type:"dispose"}, terminates worker. The WASM decoder is
|
|
167
|
+
explicitly free()'d before terminate so its linear
|
|
173
168
|
memory is released (FinalizationRegistry would not run between
|
|
174
169
|
dispose and terminate). Idempotent.
|
|
175
170
|
```
|
|
@@ -196,9 +191,8 @@ The `snapshot` event delivers a `FecTrackStats` every 200 ms (catalog-derived; n
|
|
|
196
191
|
| `blocks` | Up to `max(D × 3, 24)` recent `FecBlockSnapshot`s for live visualization |
|
|
197
192
|
| `interleaveWindowBlocks` | `D` from config |
|
|
198
193
|
|
|
199
|
-
The three `sourceDropped*` counters split by cause
|
|
194
|
+
The three `sourceDropped*` counters split by cause so a dashboard can tell the failure modes apart. They are tested in a fixed order, each returning early — `Retired` → `Terminal` → `Duplicate` — so a symbol counts once, under the **first** cause that matches: a symbol that is both past retention and a repeat counts only as `Retired`, and `Terminal` absorbs every post-settle duplicate. A block that settles at K-1 source symbols (BLO-35597 defect 2) is explained by a late symbol past retention (`Retired`), a symbol for a block that had already settled — complete, recovered **or failed** (`Terminal`), or a repeated SS_ID (`Duplicate`). `Retired` and `Terminal` narrow the cause; they do not attribute it. `Duplicate` does: it cannot fire once a block settles — the `Terminal` check returns first, and `markBlockTerminal` retires the block's accepted-ESI set anyway — so a non-zero `Duplicate` is positive evidence that a repeated SS_ID reached the worker while the block was **still collecting** — a duplicate packet on the wire (an ESI is the SS_ID's serial distance from SS_Start, so no derivation can collide). It attributes the **timing**, not the origin. A symbol lost in transit never reaches the worker and increments nothing, so **all three reading zero is not evidence of a publisher defect** — wire loss produces an identical shape. Separate those with `FecBlockSnapshot.ssbLength`: below `k` is a genuinely short authored block, equal to `k` with fewer accepted is loss-or-late, undefined (no repair symbol yet) leaves both open. All three are cumulative across decoder epochs, so they stay comparable against the `sourceSymbols` denominator; only a reset zeroes them.
|
|
200
195
|
|
|
201
|
-
When ALTA is enabled, the snapshot also carries the four-state verification accounting — `altaVerified` (crypto passed), `altaFailed` (tamper-confirmed), `altaPending` (unverifiable, e.g. missing trailer / late-joiner anchor gap), `altaError` (verifier threw — infrastructure flake, not tamper) — plus `altaInitFailed` (true if the ALTA WASM didn't initialize), `altaPendingEvictedCap` / `altaPendingEvictedTtl` (deferred-queue eviction reasons), and a bounded `altaFailedDetails[]` ring with the last ≤16 tamper events. The four-way split exists so ops alerting can distinguish a network problem (`altaPending` rising) from an attack (`altaFailed` rising) from a runtime bug (`altaError` rising).
|
|
202
196
|
|
|
203
197
|
`FecTrackStats` is also the shape consumed downstream by `@blockcast/mmt-container`'s `CmcdProducer` and the diagnostics `fec-panel` — keep it stable when you extend it.
|
|
204
198
|
|
|
@@ -206,7 +200,6 @@ When ALTA is enabled, the snapshot also carries the four-state verification acco
|
|
|
206
200
|
|
|
207
201
|
- **`@blockcast/mmt-fec`** — the wrapped library. Container-agnostic RaptorQ decoder + block manager + reorder buffer. Lives on the main thread when you don't need a Worker; this package is the off-thread variant of the same decoder.
|
|
208
202
|
- **`@blockcast/mmt-container`** — the consumer that wires this Worker into the data path. `FecManager` instantiates one `FecWorkerClient` per track, routes MMTP source/repair payloads in, and pumps recovered frames into the MFU reassembler / fmp4 segmenter.
|
|
209
|
-
- **`@blockcast/mmt-alta-parse`** — ALTA trailer extraction. Used inside the Worker to parse the `[0xF0A1][len][auth]` trailer off recovered source symbols (publisher-stripped trailers don't appear on direct-source packets, which carry the trailer in band).
|
|
210
203
|
|
|
211
204
|
## Testing
|
|
212
205
|
|
|
@@ -20,25 +20,14 @@ export declare class FecWorkerClient {
|
|
|
20
20
|
* `interleaveMs: 0` is a valid no-span catalog value; in that mode the
|
|
21
21
|
* caller supplies a positive receiver-local `deliveryWindowMs`.
|
|
22
22
|
* wasmModule is transferred (not neutered — WebAssembly.Module is shareable).
|
|
23
|
-
* altaPublicKey is PKCS#8 SPKI DER bytes (self-describing — algorithm detected from OID).
|
|
24
|
-
* Transferred (detached from sender).
|
|
25
|
-
* altaWasmModule is structured-cloneable (NOT transferable — do not add to transfer list).
|
|
26
23
|
*/
|
|
27
|
-
configure(config: FecTrackConfig, wasmModule: WebAssembly.Module
|
|
24
|
+
configure(config: FecTrackConfig, wasmModule: WebAssembly.Module): void;
|
|
28
25
|
/**
|
|
29
26
|
* Feed a source symbol to the Worker. data ArrayBuffer is transferred (zero-copy).
|
|
30
27
|
* Caller must not access data after this call — it is transferred with the
|
|
31
28
|
* task's symbol batch, before any later command of this client.
|
|
32
|
-
*
|
|
33
|
-
* Optional `alta` carries the detached ALTA authenticator bytes and the
|
|
34
|
-
* byte offset in `data` where the signed payload ends. The auth buffer is
|
|
35
|
-
* transferred zero-copy alongside `data`. Use {@link getMmtpAltaTrailer}
|
|
36
|
-
* upstream (mmtp-router) to extract it from the wire packet.
|
|
37
29
|
*/
|
|
38
|
-
feedSource(ssId: number, data: ArrayBuffer, ts: number
|
|
39
|
-
auth: ArrayBuffer;
|
|
40
|
-
payloadEnd: number;
|
|
41
|
-
}): void;
|
|
30
|
+
feedSource(ssId: number, data: ArrayBuffer, ts: number): void;
|
|
42
31
|
/**
|
|
43
32
|
* Feed a repair symbol to the Worker. data ArrayBuffer is transferred (zero-copy).
|
|
44
33
|
* Caller must not access data after this call — it is detached.
|
|
@@ -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,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
|
|
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;;;;;OAKG;IACH,SAAS,CACR,MAAM,EAAE,cAAc,EACtB,UAAU,EAAE,WAAW,CAAC,MAAM,GAC5B,IAAI;IAaP;;;;OAIG;IACH,UAAU,CACT,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,WAAW,EACjB,EAAE,EAAE,MAAM,GACR,IAAI;IAKP;;;;;;;;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;IAoCP;;OAEG;IACH,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI;IASrE;;;;;;OAMG;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"}
|
|
@@ -57,11 +57,8 @@ export class FecWorkerClient {
|
|
|
57
57
|
* `interleaveMs: 0` is a valid no-span catalog value; in that mode the
|
|
58
58
|
* caller supplies a positive receiver-local `deliveryWindowMs`.
|
|
59
59
|
* wasmModule is transferred (not neutered — WebAssembly.Module is shareable).
|
|
60
|
-
* altaPublicKey is PKCS#8 SPKI DER bytes (self-describing — algorithm detected from OID).
|
|
61
|
-
* Transferred (detached from sender).
|
|
62
|
-
* altaWasmModule is structured-cloneable (NOT transferable — do not add to transfer list).
|
|
63
60
|
*/
|
|
64
|
-
configure(config, wasmModule
|
|
61
|
+
configure(config, wasmModule) {
|
|
65
62
|
if (this.#disposed)
|
|
66
63
|
throw new Error("[FecWorkerClient] disposed");
|
|
67
64
|
this.#flushSymbols();
|
|
@@ -69,44 +66,20 @@ export class FecWorkerClient {
|
|
|
69
66
|
type: "configure",
|
|
70
67
|
config,
|
|
71
68
|
wasmModule,
|
|
72
|
-
altaPublicKey,
|
|
73
|
-
altaWasmModule,
|
|
74
69
|
};
|
|
75
70
|
// WebAssembly.Module is structured-cloneable, NOT transferable.
|
|
76
71
|
// Pass it in the message body (Chrome clones it automatically).
|
|
77
|
-
|
|
78
|
-
const transferList = [];
|
|
79
|
-
if (altaPublicKey)
|
|
80
|
-
transferList.push(altaPublicKey);
|
|
81
|
-
// altaWasmModule is structured-cloneable — NOT added to transferList
|
|
82
|
-
this.#worker.postMessage(cmd, transferList);
|
|
72
|
+
this.#worker.postMessage(cmd);
|
|
83
73
|
}
|
|
84
74
|
/**
|
|
85
75
|
* Feed a source symbol to the Worker. data ArrayBuffer is transferred (zero-copy).
|
|
86
76
|
* Caller must not access data after this call — it is transferred with the
|
|
87
77
|
* task's symbol batch, before any later command of this client.
|
|
88
|
-
*
|
|
89
|
-
* Optional `alta` carries the detached ALTA authenticator bytes and the
|
|
90
|
-
* byte offset in `data` where the signed payload ends. The auth buffer is
|
|
91
|
-
* transferred zero-copy alongside `data`. Use {@link getMmtpAltaTrailer}
|
|
92
|
-
* upstream (mmtp-router) to extract it from the wire packet.
|
|
93
78
|
*/
|
|
94
|
-
feedSource(ssId, data, ts
|
|
79
|
+
feedSource(ssId, data, ts) {
|
|
95
80
|
if (this.#disposed)
|
|
96
81
|
throw new Error("[FecWorkerClient] feedSource on a disposed client");
|
|
97
|
-
|
|
98
|
-
this.#queueSymbol({
|
|
99
|
-
type: "feedSource",
|
|
100
|
-
ssId,
|
|
101
|
-
data,
|
|
102
|
-
ts,
|
|
103
|
-
altaAuth: alta.auth,
|
|
104
|
-
altaPayloadEnd: alta.payloadEnd,
|
|
105
|
-
}, data, alta.auth);
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
108
|
-
this.#queueSymbol({ type: "feedSource", ssId, data, ts }, data);
|
|
109
|
-
}
|
|
82
|
+
this.#queueSymbol({ type: "feedSource", ssId, data, ts }, data);
|
|
110
83
|
}
|
|
111
84
|
/**
|
|
112
85
|
* Feed a repair symbol to the Worker. data ArrayBuffer is transferred (zero-copy).
|
|
@@ -122,15 +95,13 @@ export class FecWorkerClient {
|
|
|
122
95
|
throw new Error("[FecWorkerClient] feedRepair on a disposed client");
|
|
123
96
|
this.#queueSymbol({ type: "feedRepair", ssStart, ssbLength, rsId, data, ts }, data);
|
|
124
97
|
}
|
|
125
|
-
#queueSymbol(symbol, data
|
|
98
|
+
#queueSymbol(symbol, data) {
|
|
126
99
|
if (!this.#batchSymbols) {
|
|
127
|
-
this.#worker.postMessage(symbol,
|
|
100
|
+
this.#worker.postMessage(symbol, [data]);
|
|
128
101
|
return;
|
|
129
102
|
}
|
|
130
103
|
this.#pendingSymbols.push(symbol);
|
|
131
104
|
this.#pendingTransfer.push(data);
|
|
132
|
-
if (auth)
|
|
133
|
-
this.#pendingTransfer.push(auth);
|
|
134
105
|
if (this.#flushQueued)
|
|
135
106
|
return;
|
|
136
107
|
this.#flushQueued = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fec-worker-client.js","sourceRoot":"","sources":["../src/fec-worker-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAaH,MAAM,OAAO,eAAe;IAClB,OAAO,CAAS;IACzB,QAAQ,GAA0D,IAAI,CAAC;IACvE,WAAW,GAA4C,IAAI,CAAC;IAC5D,cAAc,GAA+C,IAAI,CAAC;IAClE,kBAAkB,GAAmC,IAAI,CAAC;IAC1D,QAAQ,GAAkE,IAAI,CAAC;IAC/E,gBAAgB,GAAuB,IAAI,CAAC;IAC5C,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,cAAc,GAAG,CAAC,CAAC;IACnB,YAAY,GAAG,KAAK,CAAC;IACrB,SAAS,GAAG,KAAK,CAAC;IAClB,uEAAuE;IACvE,4EAA4E;IAC5E,0EAA0E;IAC1E,2EAA2E;IAC3E,eAAe,GAAuB,EAAE,CAAC;IACzC,gBAAgB,GAAmB,EAAE,CAAC;IACtC,YAAY,GAAG,KAAK,CAAC;IACrB,yEAAyE;IACzE,aAAa,GAAG,KAAK,CAAC;IACtB,wEAAwE;IACxE,sEAAsE;IACtE,qCAAqC;IACrC,sBAAsB,GAAG,KAAK,CAAC;IAC/B,uBAAuB,GAAG,KAAK,CAAC;IAEhC;;;OAGG;IACH,YAAY,WAAyB;QACpC,IAAI,WAAW,YAAY,GAAG,EAAE,CAAC;YAChC,IAAI,CAAC,OAAO,GAAG,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,CAAC,CAA+B,EAAE,EAAE,CAC5D,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,EAAE;YAC5B,IAAI,CAAC,QAAQ,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;QACzD,CAAC,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,cAAc,GAAG,CAAC,CAAC,EAAE,EAAE;YACnC,IAAI,CAAC,QAAQ,EAAE,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;QAChE,CAAC,CAAC;IACH,CAAC;IAED
|
|
1
|
+
{"version":3,"file":"fec-worker-client.js","sourceRoot":"","sources":["../src/fec-worker-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* @blockcast/fec-worker — Shared Type Definitions
|
|
3
3
|
*
|
|
4
4
|
* Defines the Worker message protocol (commands/events), FecTrackStats shape
|
|
5
|
-
* consumed by fec-panel (Phase 5) and CmcdProducer (Phase 6), and
|
|
6
|
-
*
|
|
5
|
+
* consumed by fec-panel (Phase 5) and CmcdProducer (Phase 6), and the relay
|
|
6
|
+
* block signature stub.
|
|
7
7
|
*
|
|
8
8
|
* Types here are importable from both main thread and Worker contexts.
|
|
9
9
|
*/
|
|
@@ -70,8 +70,6 @@ export interface FecTrackConfig {
|
|
|
70
70
|
fecMode: "subframe" | "object";
|
|
71
71
|
/** MoQ repair track name (optional) */
|
|
72
72
|
repairTrack?: string;
|
|
73
|
-
/** Whether ALTA publisher auth is enabled (AUTH-01) */
|
|
74
|
-
altaEnabled: boolean;
|
|
75
73
|
/** Whether relay block signature verification is enabled (AUTH-01) */
|
|
76
74
|
relayBlockSigEnabled: boolean;
|
|
77
75
|
}
|
|
@@ -105,8 +103,6 @@ export interface FecBlockSnapshot {
|
|
|
105
103
|
* `config.interleaveMs > 0`, and a local retention timestamp otherwise.
|
|
106
104
|
*/
|
|
107
105
|
deadlineTs: number;
|
|
108
|
-
/** Count of source symbols with valid ALTA signature (AUTH-02) */
|
|
109
|
-
altaVerified: number;
|
|
110
106
|
/** Relay block signature validity: true/false after verification, null if not yet verified (AUTH-02) */
|
|
111
107
|
relayBlockSigValid: boolean | null;
|
|
112
108
|
}
|
|
@@ -126,38 +122,6 @@ export interface FecTrackStats {
|
|
|
126
122
|
blocksFailed: number;
|
|
127
123
|
/** Recovery success rate 0-100 */
|
|
128
124
|
recoveryRate: number;
|
|
129
|
-
/** Packets with valid publisher ALTA signature */
|
|
130
|
-
altaVerified: number;
|
|
131
|
-
/** Packets with MAC / signature / hash-chain mismatch (tamper-confirmed) */
|
|
132
|
-
altaFailed: number;
|
|
133
|
-
/** Packets that couldn't be verified due to missing trailer / not-ready verifier /
|
|
134
|
-
* late-joiner bootstrap gap. Neither tamper nor error — just unverifiable. */
|
|
135
|
-
altaPending: number;
|
|
136
|
-
/** Deferred-queue entries evicted by cap (queue full). Separate counter so
|
|
137
|
-
* cap misconfiguration is distinguishable from natural bootstrap-gap noise. */
|
|
138
|
-
altaPendingEvictedCap: number;
|
|
139
|
-
/** Deferred-queue entries evicted by TTL (retry window expired). */
|
|
140
|
-
altaPendingEvictedTtl: number;
|
|
141
|
-
/** verifyDetached / parse threw an exception (WASM trap, OOM, unmarshal panic).
|
|
142
|
-
* Not counted as altaFailed because the cause isn't crypto — helps ops
|
|
143
|
-
* distinguish infrastructure flake from tamper. */
|
|
144
|
-
altaError: number;
|
|
145
|
-
/** True if ALTA was enabled at configure time but the verifier WASM init
|
|
146
|
-
* failed. Ops alerting should treat this as "ALTA disabled due to error",
|
|
147
|
-
* distinct from "ALTA disabled by config" (altaEnabled flag not present). */
|
|
148
|
-
altaInitFailed: boolean;
|
|
149
|
-
/** Diagnostic: last ≤16 altaFailed events with full context (seq, error
|
|
150
|
-
* string from the verifier, auth+payload lengths, and which code path
|
|
151
|
-
* raised the failure). Bounded so it can't blow memory. Intended for
|
|
152
|
-
* investigation — not a stable API; consumers should treat it as
|
|
153
|
-
* opt-in and defensive (may be undefined). */
|
|
154
|
-
altaFailedDetails?: Array<{
|
|
155
|
-
seq: number;
|
|
156
|
-
error: string;
|
|
157
|
-
authLen: number;
|
|
158
|
-
payloadLen: number;
|
|
159
|
-
path: string;
|
|
160
|
-
}>;
|
|
161
125
|
/** Blocks with valid relay signature */
|
|
162
126
|
relayBlocksVerified: number;
|
|
163
127
|
/** Blocks with invalid relay signature */
|
|
@@ -241,8 +205,6 @@ export type FecWorkerErrorCode = "recovered-symbol-size-unconfigured" | "recover
|
|
|
241
205
|
| "recovered-block-unplaced" | "reset-failed" | "unknown-command" | "command-failed" | "worker-runtime" | "worker-message";
|
|
242
206
|
/** Per-frame metadata emitted with frame events from Worker. */
|
|
243
207
|
export interface FrameMeta {
|
|
244
|
-
/** ALTA verification result: true/false after check, null when ALTA not configured (AUTH-04) */
|
|
245
|
-
altaVerified: boolean | null;
|
|
246
208
|
/** Whether this frame was recovered via FEC (not received directly) */
|
|
247
209
|
recovered: boolean;
|
|
248
210
|
/** Block key this frame belongs to: the block's SS_Start */
|
|
@@ -264,14 +226,6 @@ export type FecWorkerCommand = {
|
|
|
264
226
|
type: "configure";
|
|
265
227
|
config: FecTrackConfig;
|
|
266
228
|
wasmModule: WebAssembly.Module;
|
|
267
|
-
/**
|
|
268
|
-
* ALTA public key as PKCS#8 SubjectPublicKeyInfo DER bytes (self-describing).
|
|
269
|
-
* Algorithm (Ed25519 or ECDSA P-256) is auto-detected from the SPKI OID.
|
|
270
|
-
* Ed25519 SPKI is 44 bytes; P-256 uncompressed is 91 bytes.
|
|
271
|
-
*/
|
|
272
|
-
altaPublicKey?: ArrayBuffer;
|
|
273
|
-
/** Pre-compiled ALTA WASM module. Structured-cloneable (NOT transferable) — do not add to transfer list. */
|
|
274
|
-
altaWasmModule?: WebAssembly.Module;
|
|
275
229
|
} | {
|
|
276
230
|
type: "feedSource";
|
|
277
231
|
/** Flat 32-bit Source Symbol ID from the MMTP Source FEC Payload ID
|
|
@@ -283,18 +237,6 @@ export type FecWorkerCommand = {
|
|
|
283
237
|
* most T-2 bytes). */
|
|
284
238
|
data: ArrayBuffer;
|
|
285
239
|
ts: number;
|
|
286
|
-
/** Optional ALTA authenticator bytes (detached mode — 08-07 MMTP
|
|
287
|
-
* trailer). Present when the source packet carried a
|
|
288
|
-
* `[0xF0A1][len][auth]` trailer and ALTA is enabled at the worker.
|
|
289
|
-
* When omitted, the worker skips verification and the packet
|
|
290
|
-
* counts as `altaPending`. */
|
|
291
|
-
altaAuth?: ArrayBuffer;
|
|
292
|
-
/** Byte offset within `data` where the signed MMTP payload ends
|
|
293
|
-
* (== where the trailer began on the wire). Required when
|
|
294
|
-
* `altaAuth` is present. Worker constructs
|
|
295
|
-
* `payload = new Uint8Array(data, 0, altaPayloadEnd)` for
|
|
296
|
-
* `verifyDetached(altaAuth, payload)`. */
|
|
297
|
-
altaPayloadEnd?: number;
|
|
298
240
|
} | {
|
|
299
241
|
type: "feedRepair";
|
|
300
242
|
/** SS_Start: SS_ID of the first source symbol in the block, from the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fec-worker-types.d.ts","sourceRoot":"","sources":["../src/fec-worker-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;;;;;;;;;GAUG;AACH,MAAM,MAAM,eAAe,GAAG,cAAc,CAAC;AAE7C,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,4EAA4E;IAC5E,YAAY,EAAE,eAAe,CAAC;IAC9B,wFAAwF;IACxF,CAAC,EAAE,MAAM,CAAC;IACV,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;;gEAM4D;IAC5D,eAAe,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,gBAAgB,EAAE,MAAM,CAAC;IACzB,wBAAwB;IACxB,OAAO,EAAE,UAAU,GAAG,QAAQ,CAAC;IAC/B,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,
|
|
1
|
+
{"version":3,"file":"fec-worker-types.d.ts","sourceRoot":"","sources":["../src/fec-worker-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;;;;;;;;;GAUG;AACH,MAAM,MAAM,eAAe,GAAG,cAAc,CAAC;AAE7C,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,4EAA4E;IAC5E,YAAY,EAAE,eAAe,CAAC;IAC9B,wFAAwF;IACxF,CAAC,EAAE,MAAM,CAAC;IACV,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;;gEAM4D;IAC5D,eAAe,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,gBAAgB,EAAE,MAAM,CAAC;IACzB,wBAAwB;IACxB,OAAO,EAAE,UAAU,GAAG,QAAQ,CAAC;IAC/B,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,sEAAsE;IACtE,oBAAoB,EAAE,OAAO,CAAC;CAC9B;AAID,iEAAiE;AACjE,MAAM,WAAW,gBAAgB;IAChC,uCAAuC;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,0BAA0B;IAC1B,KAAK,EAAE,YAAY,GAAG,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC1D,wCAAwC;IACxC,cAAc,EAAE,MAAM,CAAC;IACvB,wCAAwC;IACxC,cAAc,EAAE,MAAM,CAAC;IACvB,yFAAyF;IACzF,CAAC,EAAE,MAAM,CAAC;IACV;;;8CAG0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,YAAY,EAAE,MAAM,CAAC;IACrB,yEAAyE;IACzE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,wGAAwG;IACxG,kBAAkB,EAAE,OAAO,GAAG,IAAI,CAAC;CACnC;AAID,kFAAkF;AAClF,MAAM,WAAW,aAAa;IAC7B,0BAA0B;IAC1B,MAAM,EAAE,cAAc,CAAC;IAEvB,oCAAoC;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,+CAA+C;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,+BAA+B;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,yCAAyC;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,kCAAkC;IAClC,YAAY,EAAE,MAAM,CAAC;IAErB,wCAAwC;IACxC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,0CAA0C;IAC1C,iBAAiB,EAAE,MAAM,CAAC;IAE1B,iEAAiE;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB,6BAA6B;IAC7B,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,6CAA6C;IAC7C,sBAAsB,EAAE,MAAM,CAAC;IAE/B,oCAAoC;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,qFAAqF;IACrF,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,kFAAkF;IAClF,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;;;;;;;OAUG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC;;;;;;;OAOG;IACH,qBAAqB,EAAE,MAAM,CAAC;IAC9B,6FAA6F;IAC7F,OAAO,CAAC,EAAE;QACT,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;QACvB,eAAe,EAAE,MAAM,CAAC;QACxB,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,EAAE,MAAM,CAAC;KACtB,CAAC;CACF;AAED,qFAAqF;AACrF,MAAM,MAAM,kBAAkB,GAC3B,oCAAoC,GACpC,2BAA2B,GAC3B,qCAAqC,GACrC,6BAA6B,GAC7B,4BAA4B;AAC9B,uGAAuG;GACrG,sBAAsB;AACxB,2GAA2G;GACzG,gCAAgC;AAClC,uHAAuH;GACrH,0BAA0B,GAC1B,cAAc,GACd,iBAAiB,GACjB,gBAAgB,GAChB,gBAAgB,GAChB,gBAAgB,CAAC;AAIpB,gEAAgE;AAChE,MAAM,WAAW,SAAS;IACzB,uEAAuE;IACvE,SAAS,EAAE,OAAO,CAAC;IACnB,4DAA4D;IAC5D,GAAG,EAAE,MAAM,CAAC;IACZ;;;0BAGsB;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAID,2EAA2E;AAC3E,MAAM,MAAM,gBAAgB,GACzB;IACA,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,cAAc,CAAC;IACvB,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC;CAC9B,GACD;IACA,IAAI,EAAE,YAAY,CAAC;IACnB;;;+BAG2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb;2BACuB;IACvB,IAAI,EAAE,WAAW,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;CACV,GACD;IACA,IAAI,EAAE,YAAY,CAAC;IACnB;;qBAEiB;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB;oCACgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;CACV,GACD;IACA;;;;;;OAMG;IACH,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,gBAAgB,EAAE,CAAC;CAC3B,GACD;IACA,IAAI,EAAE,eAAe,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,WAAW,CAAC;IACjB,IAAI,EAAE,WAAW,CAAC;CACjB,GACD;IACA,IAAI,EAAE,SAAS,CAAC;IAChB;mCAC+B;IAC/B,IAAI,EAAE,MAAM,EAAE,CAAC;CACd,GACD;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE;AACnB;;;;;GAKG;GACD;IAAE,IAAI,EAAE,uBAAuB,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAEvB,kDAAkD;AAClD,MAAM,MAAM,gBAAgB,GAAG,OAAO,CACrC,gBAAgB,EAChB;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAC/C,CAAC;AAIF,4EAA4E;AAC5E,MAAM,MAAM,cAAc,GACvB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,aAAa,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,gBAAgB,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE;AAC3B;;;;;GAKG;GACD;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,wBAAwB,EAAE,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAEjE,uEAAuE;AACvE,MAAM,MAAM,wBAAwB,GAAG,aAAa,GAAG,uBAAuB,CAAC"}
|
package/dist/fec-worker-types.js
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* @blockcast/fec-worker — Shared Type Definitions
|
|
3
3
|
*
|
|
4
4
|
* Defines the Worker message protocol (commands/events), FecTrackStats shape
|
|
5
|
-
* consumed by fec-panel (Phase 5) and CmcdProducer (Phase 6), and
|
|
6
|
-
*
|
|
5
|
+
* consumed by fec-panel (Phase 5) and CmcdProducer (Phase 6), and the relay
|
|
6
|
+
* block signature stub.
|
|
7
7
|
*
|
|
8
8
|
* Types here are importable from both main thread and Worker contexts.
|
|
9
9
|
*/
|
package/dist/fec-worker.js
CHANGED
|
@@ -33,8 +33,6 @@ function isoBlocksBehind(a, b, kMax) {
|
|
|
33
33
|
// src/fec-worker.ts
|
|
34
34
|
var wasmDecoder = null;
|
|
35
35
|
var config = null;
|
|
36
|
-
var altaEnabled = false;
|
|
37
|
-
var altaVerifier = null;
|
|
38
36
|
var snapshotTimer = null;
|
|
39
37
|
var blockUpdatesSubscribed = false;
|
|
40
38
|
var blocks = /* @__PURE__ */ new Map();
|
|
@@ -53,14 +51,6 @@ var repairSymbols = 0;
|
|
|
53
51
|
var blocksComplete = 0;
|
|
54
52
|
var blocksRecovered = 0;
|
|
55
53
|
var blocksFailed = 0;
|
|
56
|
-
var altaVerified = 0;
|
|
57
|
-
var altaFailed = 0;
|
|
58
|
-
var altaFailedDetails = [];
|
|
59
|
-
var altaPending = 0;
|
|
60
|
-
var altaPendingEvictedCap = 0;
|
|
61
|
-
var altaPendingEvictedTtl = 0;
|
|
62
|
-
var altaError = 0;
|
|
63
|
-
var altaInitFailed = false;
|
|
64
54
|
var relayBlocksVerified = 0;
|
|
65
55
|
var relayBlocksFailed = 0;
|
|
66
56
|
var liveSbn = 0;
|
|
@@ -71,9 +61,6 @@ var sourceDroppedTerminal = 0;
|
|
|
71
61
|
var sourceDroppedDuplicate = 0;
|
|
72
62
|
var sourceUnplacedRetired = 0;
|
|
73
63
|
var recoveryTimes = [];
|
|
74
|
-
var pendingVerify = /* @__PURE__ */ new Map();
|
|
75
|
-
var pendingVerifyCap = 0;
|
|
76
|
-
var pendingVerifyTtlMs = 0;
|
|
77
64
|
function emit(event, transfer) {
|
|
78
65
|
self.postMessage(event, transfer ?? []);
|
|
79
66
|
}
|
|
@@ -92,7 +79,6 @@ function clearBlockTracking() {
|
|
|
92
79
|
acceptedSourceEsis.clear();
|
|
93
80
|
acceptedRepairEsis.clear();
|
|
94
81
|
unplacedSources.clear();
|
|
95
|
-
pendingVerify.clear();
|
|
96
82
|
recoveryTimes.length = 0;
|
|
97
83
|
liveSbn = 0;
|
|
98
84
|
liveSbnKnown = false;
|
|
@@ -174,7 +160,6 @@ function getOrCreateBlock(sbn, isoSsbLength) {
|
|
|
174
160
|
// A positive interleaveMs makes this the catalog completion deadline;
|
|
175
161
|
// zero makes deliveryWindowMs a receiver-local cleanup bound.
|
|
176
162
|
deadlineTs: now + config.deliveryWindowMs,
|
|
177
|
-
altaVerified: 0,
|
|
178
163
|
relayBlockSigValid: null
|
|
179
164
|
};
|
|
180
165
|
if (isoSsbLength !== void 0) block.ssbLength = isoSsbLength;
|
|
@@ -209,15 +194,6 @@ function buildStatsSnapshot() {
|
|
|
209
194
|
recoveryRate: blocksComplete + blocksRecovered > 0 ? Math.round(
|
|
210
195
|
blocksRecovered / (blocksRecovered + blocksFailed) * 100
|
|
211
196
|
) || 0 : 0,
|
|
212
|
-
altaVerified,
|
|
213
|
-
altaFailed,
|
|
214
|
-
altaPending,
|
|
215
|
-
altaPendingEvictedCap,
|
|
216
|
-
altaPendingEvictedTtl,
|
|
217
|
-
altaError,
|
|
218
|
-
altaInitFailed,
|
|
219
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
220
|
-
altaFailedDetails: altaFailedDetails.slice(),
|
|
221
197
|
relayBlocksVerified,
|
|
222
198
|
relayBlocksFailed,
|
|
223
199
|
liveSbn,
|
|
@@ -272,11 +248,8 @@ function emitRecoveredSymbols(sbn, recoveredBlock, block) {
|
|
|
272
248
|
});
|
|
273
249
|
continue;
|
|
274
250
|
}
|
|
275
|
-
const recoveredAltaVerified = null;
|
|
276
|
-
if (altaEnabled) altaPending++;
|
|
277
251
|
const buf = toOwnedArrayBuffer(symbol);
|
|
278
252
|
const meta = {
|
|
279
|
-
altaVerified: recoveredAltaVerified,
|
|
280
253
|
recovered: true,
|
|
281
254
|
sbn,
|
|
282
255
|
esi: i,
|
|
@@ -389,7 +362,6 @@ function feedIsoSource(cmd, view, decoder, cfg) {
|
|
|
389
362
|
advanceMediaHorizon(cmd.ssId);
|
|
390
363
|
unplacedSources.set(cmd.ssId, performance.now());
|
|
391
364
|
sourceSymbols++;
|
|
392
|
-
if (altaEnabled) altaPending++;
|
|
393
365
|
if (result2 && result2.byteLength > 0) {
|
|
394
366
|
emit({
|
|
395
367
|
type: "error",
|
|
@@ -420,7 +392,6 @@ function feedIsoSource(cmd, view, decoder, cfg) {
|
|
|
420
392
|
block.sourceReceived++;
|
|
421
393
|
block.lastSymbolTs = performance.now();
|
|
422
394
|
sourceSymbols++;
|
|
423
|
-
if (altaEnabled) altaPending++;
|
|
424
395
|
settleSourceArrival(key, block, result);
|
|
425
396
|
}
|
|
426
397
|
function findOverlappingIsoBlock(ssStart, ssbLength) {
|
|
@@ -530,29 +501,6 @@ async function handleConfigure(cmd) {
|
|
|
530
501
|
verifyDecoderProfile(decoder, blockProfile);
|
|
531
502
|
wasmDecoder = decoder;
|
|
532
503
|
config = cmd.config;
|
|
533
|
-
altaEnabled = !!cmd.altaPublicKey;
|
|
534
|
-
pendingVerifyCap = Math.ceil(config.interleaveDepth * 1.5);
|
|
535
|
-
const verifyWindowMs = config.interleaveMs > 0 ? config.interleaveMs * config.k : config.deliveryWindowMs;
|
|
536
|
-
pendingVerifyTtlMs = Math.ceil(verifyWindowMs * 1.5);
|
|
537
|
-
altaVerifier = null;
|
|
538
|
-
altaInitFailed = false;
|
|
539
|
-
if (cmd.altaPublicKey && cmd.altaWasmModule) {
|
|
540
|
-
try {
|
|
541
|
-
const altaGlueUrl = "/wasm/alta/alta_rs.js";
|
|
542
|
-
const altaGlue = await import(
|
|
543
|
-
/* webpackIgnore: true */
|
|
544
|
-
altaGlueUrl
|
|
545
|
-
);
|
|
546
|
-
altaGlue.initSync({ module: cmd.altaWasmModule });
|
|
547
|
-
const keyBytes = new Uint8Array(cmd.altaPublicKey);
|
|
548
|
-
altaVerifier = new altaGlue.JsAltaVerifier(keyBytes);
|
|
549
|
-
} catch (e) {
|
|
550
|
-
console.warn("[FecWorker] ALTA WASM init failed, verification disabled:", e);
|
|
551
|
-
altaVerifier = null;
|
|
552
|
-
altaEnabled = false;
|
|
553
|
-
altaInitFailed = true;
|
|
554
|
-
}
|
|
555
|
-
}
|
|
556
504
|
wasmDecoder.configure_params(config.k, config.symbolSize);
|
|
557
505
|
emit({ type: "capabilities", commands: ["feedSymbols", "subscribeBlockUpdates"] });
|
|
558
506
|
startSnapshotTimer();
|
|
@@ -640,20 +588,10 @@ function handleDispose() {
|
|
|
640
588
|
clearInterval(snapshotTimer);
|
|
641
589
|
snapshotTimer = null;
|
|
642
590
|
}
|
|
643
|
-
if (altaVerifier) {
|
|
644
|
-
try {
|
|
645
|
-
altaVerifier.free();
|
|
646
|
-
} catch (_e) {
|
|
647
|
-
}
|
|
648
|
-
altaVerifier = null;
|
|
649
|
-
}
|
|
650
591
|
if (wasmDecoder) {
|
|
651
592
|
wasmDecoder.free();
|
|
652
593
|
wasmDecoder = null;
|
|
653
594
|
}
|
|
654
|
-
pendingVerify.clear();
|
|
655
|
-
pendingVerifyCap = 0;
|
|
656
|
-
pendingVerifyTtlMs = 0;
|
|
657
595
|
config = null;
|
|
658
596
|
clearBlockTracking();
|
|
659
597
|
}
|
|
@@ -675,13 +613,6 @@ function handleReset() {
|
|
|
675
613
|
blocksComplete = 0;
|
|
676
614
|
blocksRecovered = 0;
|
|
677
615
|
blocksFailed = 0;
|
|
678
|
-
altaVerified = 0;
|
|
679
|
-
altaFailed = 0;
|
|
680
|
-
altaFailedDetails.length = 0;
|
|
681
|
-
altaPending = 0;
|
|
682
|
-
altaPendingEvictedCap = 0;
|
|
683
|
-
altaPendingEvictedTtl = 0;
|
|
684
|
-
altaError = 0;
|
|
685
616
|
relayBlocksVerified = 0;
|
|
686
617
|
relayBlocksFailed = 0;
|
|
687
618
|
repairSymbolSizeMismatch = 0;
|