@bridgething/updater 0.8.0 → 0.9.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 (48) hide show
  1. package/README.md +17 -76
  2. package/dist/cli.js +73 -196
  3. package/dist/cli.js.map +1 -1
  4. package/package.json +5 -30
  5. package/dist/ack-window.d.ts +0 -38
  6. package/dist/ack-window.d.ts.map +0 -1
  7. package/dist/ack-window.js +0 -89
  8. package/dist/ack-window.js.map +0 -1
  9. package/dist/driver.d.ts +0 -57
  10. package/dist/driver.d.ts.map +0 -1
  11. package/dist/driver.js +0 -245
  12. package/dist/driver.js.map +0 -1
  13. package/dist/fragments.d.ts +0 -29
  14. package/dist/fragments.d.ts.map +0 -1
  15. package/dist/fragments.js +0 -45
  16. package/dist/fragments.js.map +0 -1
  17. package/dist/gateway-device.d.ts +0 -3
  18. package/dist/gateway-device.d.ts.map +0 -1
  19. package/dist/gateway-device.js +0 -2
  20. package/dist/gateway-device.js.map +0 -1
  21. package/dist/index.d.ts +0 -12
  22. package/dist/index.d.ts.map +0 -1
  23. package/dist/index.js +0 -6
  24. package/dist/index.js.map +0 -1
  25. package/dist/manifest.d.ts +0 -75
  26. package/dist/manifest.d.ts.map +0 -1
  27. package/dist/manifest.js +0 -69
  28. package/dist/manifest.js.map +0 -1
  29. package/dist/node.d.ts +0 -3
  30. package/dist/node.d.ts.map +0 -1
  31. package/dist/node.js +0 -15
  32. package/dist/node.js.map +0 -1
  33. package/dist/range-serve.d.ts +0 -5
  34. package/dist/range-serve.d.ts.map +0 -1
  35. package/dist/range-serve.js +0 -59
  36. package/dist/range-serve.js.map +0 -1
  37. package/dist/source.d.ts +0 -10
  38. package/dist/source.d.ts.map +0 -1
  39. package/dist/source.js +0 -52
  40. package/dist/source.js.map +0 -1
  41. package/dist/web-serial.d.ts +0 -2
  42. package/dist/web-serial.d.ts.map +0 -1
  43. package/dist/web-serial.js +0 -2
  44. package/dist/web-serial.js.map +0 -1
  45. package/dist/websocket.d.ts +0 -2
  46. package/dist/websocket.d.ts.map +0 -1
  47. package/dist/websocket.js +0 -2
  48. package/dist/websocket.js.map +0 -1
@@ -1,89 +0,0 @@
1
- /**
2
- * Sender-side flow control, ported from `host-gateway`'s `AckWindow`/`AckRegistry`
3
- * (`crates/host-gateway/src/transfer.rs`): the daemon acks the byte offset it has durably
4
- * consumed, and the streamer holds no more than `OTA_WINDOW_BYTES` past that. Acks are absolute
5
- * file offsets, so the baseline seeds to the resume point.
6
- *
7
- * The Rust version uses an atomic + `Notify` with `notify_one` specifically to avoid a lost
8
- * wakeup between a waiter's recheck and its `await`. That race doesn't exist here: JS is
9
- * single-threaded, so a synchronous "check the ack, then register a listener" pair can't be
10
- * interleaved by another callback - there's no gap for a `note()` to land in.
11
- */
12
- const OTA_WINDOW_BYTES = 512 * 1024;
13
- const OTA_ACK_TIMEOUT_MS = 30_000;
14
- export class AckWindow {
15
- acked;
16
- waiters = [];
17
- windowBytes;
18
- ackTimeoutMs;
19
- constructor(baseline, options = {}) {
20
- this.acked = baseline;
21
- this.windowBytes = options.windowBytes ?? OTA_WINDOW_BYTES;
22
- this.ackTimeoutMs = options.ackTimeoutMs ?? OTA_ACK_TIMEOUT_MS;
23
- }
24
- note(received) {
25
- if (received <= this.acked)
26
- return;
27
- this.acked = received;
28
- const waiters = this.waiters;
29
- this.waiters = [];
30
- for (const waiter of waiters)
31
- waiter();
32
- }
33
- get ackedBytes() {
34
- return this.acked;
35
- }
36
- async waitForRoom(offset) {
37
- for (;;) {
38
- if (offset < this.acked + this.windowBytes)
39
- return true;
40
- const priorAcked = this.acked;
41
- const progressed = await this.waitForProgress();
42
- if (!progressed && this.acked <= priorAcked)
43
- return false;
44
- }
45
- }
46
- waitForProgress() {
47
- return new Promise(resolve => {
48
- const timer = setTimeout(() => settle(false), this.ackTimeoutMs);
49
- const onProgress = () => settle(true);
50
- let settled = false;
51
- const settle = (result) => {
52
- if (settled)
53
- return;
54
- settled = true;
55
- clearTimeout(timer);
56
- const idx = this.waiters.indexOf(onProgress);
57
- if (idx >= 0)
58
- this.waiters.splice(idx, 1);
59
- resolve(result);
60
- };
61
- this.waiters.push(onProgress);
62
- });
63
- }
64
- }
65
- export class AckRegistry {
66
- windowOptions;
67
- windows = new Map();
68
- constructor(windowOptions = {}) {
69
- this.windowOptions = windowOptions;
70
- }
71
- register(transferId, baseline) {
72
- const window = new AckWindow(baseline, this.windowOptions);
73
- this.windows.set(transferId, window);
74
- return window;
75
- }
76
- deregister(transferId) {
77
- this.windows.delete(transferId);
78
- }
79
- note(transferId, received) {
80
- this.windows.get(transferId)?.note(received);
81
- }
82
- }
83
- export class TransferStalledError extends Error {
84
- constructor(offset, totalSize) {
85
- super(`transfer stalled: no drain-ack progress at offset ${offset}/${totalSize}`);
86
- this.name = 'TransferStalledError';
87
- }
88
- }
89
- //# sourceMappingURL=ack-window.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ack-window.js","sourceRoot":"","sources":["../src/ack-window.ts"],"names":[],"mappings":"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"}
package/dist/driver.d.ts DELETED
@@ -1,57 +0,0 @@
1
- import type { BridgethingGateway, OtaKind, OtaPatch, OtaPhase, WebappInfo } from '@bridgething/gateway';
2
- import type { AckWindowOptions } from './ack-window.js';
3
- import type { ArtifactSource } from './source.js';
4
- export type OtaProgressSnapshot = {
5
- phase: 'streaming';
6
- percent: number;
7
- } | {
8
- phase: 'applying';
9
- otaPhase: OtaPhase;
10
- percent: number;
11
- } | {
12
- phase: 'staged';
13
- } | {
14
- phase: 'completed';
15
- } | {
16
- phase: 'failed';
17
- reason: string;
18
- };
19
- export type ProgressListener = (snapshot: OtaProgressSnapshot) => void;
20
- export type WebappInstallResult = {
21
- ok: true;
22
- info: WebappInfo;
23
- } | {
24
- ok: false;
25
- reason: string;
26
- };
27
- type BandaidArtifact = {
28
- kind: OtaKind;
29
- source: ArtifactSource;
30
- patch?: OtaPatch;
31
- };
32
- export declare class OtaDriver {
33
- private readonly device;
34
- private readonly registry;
35
- private readonly unsubscribeAck;
36
- private unsubscribeRangeServer;
37
- constructor(gateway: BridgethingGateway, deviceId: string, ackWindowOptions?: AckWindowOptions);
38
- serveAssetRanges(zcks: Map<string, ArtifactSource>): void;
39
- stopServingAssetRanges(): void;
40
- close(): void;
41
- pushImage(opts: {
42
- source: ArtifactSource;
43
- zcks?: Map<string, ArtifactSource>;
44
- updateUrlBase?: string;
45
- onProgress?: ProgressListener;
46
- }): Promise<OtaProgressSnapshot>;
47
- pushDaemon(source: ArtifactSource, onProgress?: ProgressListener, patch?: OtaPatch): Promise<OtaProgressSnapshot>;
48
- pushBuiltinWebapp(source: ArtifactSource, onProgress?: ProgressListener): Promise<OtaProgressSnapshot>;
49
- pushBandaidBatch(artifacts: BandaidArtifact[], onProgress?: ProgressListener): Promise<OtaProgressSnapshot>;
50
- installWebapp(source: ArtifactSource, provenance?: string): Promise<WebappInstallResult>;
51
- private applyBandaidBatch;
52
- private commitBandaid;
53
- private driveOta;
54
- private awaitTerminal;
55
- }
56
- export {};
57
- //# sourceMappingURL=driver.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../src/driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGxG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAKxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAMlD,MAAM,MAAM,mBAAmB,GAC3B;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC1D;IAAE,KAAK,EAAE,QAAQ,CAAA;CAAE,GACnB;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,GACtB;IAAE,KAAK,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC,MAAM,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,mBAAmB,KAAK,IAAI,CAAC;AAEvE,MAAM,MAAM,mBAAmB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjG,KAAK,eAAe,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,cAAc,CAAC;IAAC,KAAK,CAAC,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEnF,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAc;IACvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAa;IAC5C,OAAO,CAAC,sBAAsB,CAA6B;gBAE/C,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,EAAE,gBAAgB,GAAE,gBAAqB;IAMlG,gBAAgB,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,IAAI;IAKzD,sBAAsB,IAAI,IAAI;IAK9B,KAAK,IAAI,IAAI;IAKP,SAAS,CAAC,IAAI,EAAE;QACpB,MAAM,EAAE,cAAc,CAAC;QACvB,IAAI,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QACnC,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,UAAU,CAAC,EAAE,gBAAgB,CAAC;KAC/B,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAY1B,UAAU,CACd,MAAM,EAAE,cAAc,EACtB,UAAU,CAAC,EAAE,gBAAgB,EAC7B,KAAK,CAAC,EAAE,QAAQ,GACf,OAAO,CAAC,mBAAmB,CAAC;IAIzB,iBAAiB,CAAC,MAAM,EAAE,cAAc,EAAE,UAAU,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAItG,gBAAgB,CAAC,SAAS,EAAE,eAAe,EAAE,EAAE,UAAU,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAI3G,aAAa,CAAC,MAAM,EAAE,cAAc,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;YAuDhF,iBAAiB;YAoBjB,aAAa;YAWb,QAAQ;IAkEtB,OAAO,CAAC,aAAa;CAiDtB"}
package/dist/driver.js DELETED
@@ -1,245 +0,0 @@
1
- import { newUuid } from '@bridgething/lib/uuid';
2
- import { AckRegistry } from './ack-window.js';
3
- import { DEFAULT_FRAGMENT_BYTES, streamSourceFragments } from './fragments.js';
4
- import { serveOtaAssetRanges } from './range-serve.js';
5
- import { sha256Hex } from './source.js';
6
- const OTA_IDLE_DEADLINE_MS = 60_000;
7
- const OTA_IDLE_CHECK_INTERVAL_MS = 15_000;
8
- export class OtaDriver {
9
- device;
10
- registry;
11
- unsubscribeAck;
12
- unsubscribeRangeServer = null;
13
- constructor(gateway, deviceId, ackWindowOptions = {}) {
14
- this.device = gateway.device(deviceId);
15
- this.registry = new AckRegistry(ackWindowOptions);
16
- this.unsubscribeAck = this.device.transfer.onAck(ack => this.registry.note(ack.transferId, ack.received));
17
- }
18
- serveAssetRanges(zcks) {
19
- this.unsubscribeRangeServer?.();
20
- this.unsubscribeRangeServer = serveOtaAssetRanges(this.device, this.registry, zcks);
21
- }
22
- stopServingAssetRanges() {
23
- this.unsubscribeRangeServer?.();
24
- this.unsubscribeRangeServer = null;
25
- }
26
- close() {
27
- this.unsubscribeAck();
28
- this.stopServingAssetRanges();
29
- }
30
- async pushImage(opts) {
31
- if (opts.zcks)
32
- this.serveAssetRanges(opts.zcks);
33
- const { snapshot } = await this.driveOta({
34
- kind: 'image',
35
- source: opts.source,
36
- updateUrlBase: opts.updateUrlBase,
37
- mode: 'full',
38
- onProgress: opts.onProgress,
39
- });
40
- return snapshot;
41
- }
42
- async pushDaemon(source, onProgress, patch) {
43
- return this.applyBandaidBatch([{ kind: 'daemon', source, patch }], onProgress);
44
- }
45
- async pushBuiltinWebapp(source, onProgress) {
46
- return this.applyBandaidBatch([{ kind: 'builtinWebapp', source }], onProgress);
47
- }
48
- async pushBandaidBatch(artifacts, onProgress) {
49
- return this.applyBandaidBatch(artifacts, onProgress);
50
- }
51
- async installWebapp(source, provenance) {
52
- const totalSize = source.size;
53
- const sha256 = await sha256Hex(source);
54
- const transferId = newUuid();
55
- const beginResult = await this.device.system.otaBegin({
56
- kind: 'installedWebapp',
57
- updateId: sha256,
58
- updateUrlBase: null,
59
- transfer: { id: transferId, totalSize, sha256 },
60
- patch: null,
61
- provenance: provenance ?? null,
62
- });
63
- if (!beginResult.ok) {
64
- return { ok: false, reason: describeBeginFailure(beginResult) };
65
- }
66
- const resumeFromOffset = beginResult.response.resumeFromOffset;
67
- const outcome = new Promise(resolve => {
68
- let settled = false;
69
- const finish = (result) => {
70
- if (settled)
71
- return;
72
- settled = true;
73
- unsubInstalled();
74
- unsubError();
75
- resolve(result);
76
- };
77
- const unsubInstalled = this.device.webapp.onWebappInstalled(info => finish({ ok: true, info }));
78
- const unsubError = this.device.system.onOtaError(err => finish({ ok: false, reason: `[${err.code}] ${err.msg}` }));
79
- });
80
- const window = this.registry.register(transferId, resumeFromOffset);
81
- try {
82
- await streamSourceFragments({
83
- device: this.device,
84
- transferId,
85
- source,
86
- startOffset: resumeFromOffset,
87
- totalSize,
88
- chunkSize: DEFAULT_FRAGMENT_BYTES,
89
- priority: 'background',
90
- window,
91
- });
92
- }
93
- catch (err) {
94
- this.registry.deregister(transferId);
95
- return { ok: false, reason: `chunk stream failed: ${errorMessage(err)}` };
96
- }
97
- const result = await outcome;
98
- this.registry.deregister(transferId);
99
- return result;
100
- }
101
- async applyBandaidBatch(artifacts, onProgress) {
102
- const stagedIds = [];
103
- for (const artifact of artifacts) {
104
- const { snapshot, updateId } = await this.driveOta({
105
- kind: artifact.kind,
106
- source: artifact.source,
107
- updateUrlBase: undefined,
108
- mode: 'stage',
109
- patch: artifact.patch,
110
- onProgress,
111
- });
112
- if (snapshot.phase !== 'staged')
113
- return snapshot;
114
- stagedIds.push(updateId);
115
- }
116
- return this.commitBandaid(stagedIds, onProgress);
117
- }
118
- async commitBandaid(expected, onProgress) {
119
- const terminal = this.awaitTerminal('full', onProgress);
120
- try {
121
- await this.device.system.otaActivate({ expected });
122
- }
123
- catch (err) {
124
- terminal.cancel();
125
- return { phase: 'failed', reason: `OtaActivate send failed: ${errorMessage(err)}` };
126
- }
127
- return terminal.promise;
128
- }
129
- async driveOta(args) {
130
- const totalSize = args.source.size;
131
- const sha256 = await sha256Hex(args.source);
132
- const transferId = newUuid();
133
- const beginResult = await this.device.system.otaBegin({
134
- kind: args.kind,
135
- updateId: sha256,
136
- updateUrlBase: args.updateUrlBase ?? null,
137
- transfer: { id: transferId, totalSize, sha256 },
138
- patch: args.patch ?? null,
139
- provenance: null,
140
- });
141
- if (!beginResult.ok) {
142
- return { snapshot: { phase: 'failed', reason: describeBeginFailure(beginResult) }, updateId: sha256 };
143
- }
144
- const resumeFromOffset = beginResult.response.resumeFromOffset;
145
- args.onProgress?.({ phase: 'streaming', percent: percentOf(resumeFromOffset, totalSize) });
146
- const window = this.registry.register(transferId, resumeFromOffset);
147
- const terminal = this.awaitTerminal(args.mode, args.onProgress);
148
- const abort = new AbortController();
149
- const snapshot = await new Promise(resolve => {
150
- let settled = false;
151
- const finish = (s) => {
152
- if (settled)
153
- return;
154
- settled = true;
155
- resolve(s);
156
- };
157
- void terminal.promise.then(finish);
158
- void (async () => {
159
- try {
160
- await streamSourceFragments({
161
- device: this.device,
162
- transferId,
163
- source: args.source,
164
- startOffset: resumeFromOffset,
165
- totalSize,
166
- chunkSize: DEFAULT_FRAGMENT_BYTES,
167
- priority: 'background',
168
- window,
169
- signal: abort.signal,
170
- });
171
- }
172
- catch (err) {
173
- if (!abort.signal.aborted)
174
- finish({ phase: 'failed', reason: `chunk stream failed: ${errorMessage(err)}` });
175
- }
176
- })();
177
- });
178
- abort.abort();
179
- terminal.cancel();
180
- this.registry.deregister(transferId);
181
- if (snapshot.phase === 'failed') {
182
- await this.device.transfer.abandon({ transferId, reason: 'attempt ended' }).catch(() => { });
183
- }
184
- return { snapshot, updateId: sha256 };
185
- }
186
- awaitTerminal(mode, onProgress) {
187
- const success = mode === 'full' ? { phase: 'completed' } : { phase: 'staged' };
188
- let settle;
189
- const promise = new Promise(resolve => {
190
- settle = resolve;
191
- });
192
- let lastProgressAt = Date.now();
193
- let finished = false;
194
- const finish = (s) => {
195
- if (finished)
196
- return;
197
- finished = true;
198
- cleanup();
199
- settle(s);
200
- };
201
- const unsubProgress = this.device.system.onOtaProgress(ev => {
202
- lastProgressAt = Date.now();
203
- onProgress?.({ phase: 'applying', otaPhase: ev.phase, percent: ev.percent });
204
- const done = mode === 'full' ? ev.phase === 'reboot' : ev.phase === 'writing' && ev.percent >= 100;
205
- if (done)
206
- finish(success);
207
- });
208
- const unsubError = this.device.system.onOtaError(ev => finish({ phase: 'failed', reason: `[${ev.code}] ${ev.msg}` }));
209
- const idleTimer = setInterval(() => {
210
- if (Date.now() - lastProgressAt > OTA_IDLE_DEADLINE_MS) {
211
- finish({ phase: 'failed', reason: `ota stalled: no progress within ${OTA_IDLE_DEADLINE_MS / 1000}s` });
212
- }
213
- }, OTA_IDLE_CHECK_INTERVAL_MS);
214
- function cleanup() {
215
- unsubProgress();
216
- unsubError();
217
- clearInterval(idleTimer);
218
- }
219
- return {
220
- promise,
221
- cancel: () => {
222
- if (finished)
223
- return;
224
- finished = true;
225
- cleanup();
226
- },
227
- };
228
- }
229
- }
230
- function percentOf(n, d) {
231
- if (d === 0)
232
- return 100;
233
- return Math.min(100, Math.floor((n * 100) / d));
234
- }
235
- function describeBeginFailure(result) {
236
- if (result.kind === 'domain') {
237
- const err = result.error;
238
- return `daemon rejected OtaBegin: ${err.reason ?? 'unknown reason'}`;
239
- }
240
- return `OtaBegin protocol error: ${JSON.stringify(result.error)}`;
241
- }
242
- function errorMessage(err) {
243
- return err instanceof Error ? err.message : String(err);
244
- }
245
- //# sourceMappingURL=driver.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"driver.js","sourceRoot":"","sources":["../src/driver.ts"],"names":[],"mappings":"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"}
@@ -1,29 +0,0 @@
1
- import type { Priority, RangePart } from '@bridgething/lib';
2
- import type { AckWindow } from './ack-window.js';
3
- import type { GatewayDevice } from './gateway-device.js';
4
- import type { ArtifactSource } from './source.js';
5
- export declare const DEFAULT_FRAGMENT_BYTES: number;
6
- export type StreamSourceOptions = {
7
- device: GatewayDevice;
8
- transferId: string;
9
- source: ArtifactSource;
10
- startOffset: number;
11
- totalSize: number;
12
- chunkSize: number;
13
- priority: Priority;
14
- window: AckWindow;
15
- signal?: AbortSignal;
16
- };
17
- export declare function streamSourceFragments(opts: StreamSourceOptions): Promise<void>;
18
- export type StreamRangeOptions = {
19
- device: GatewayDevice;
20
- transferId: string;
21
- source: ArtifactSource;
22
- ranges: RangePart[];
23
- chunkSize: number;
24
- priority: Priority;
25
- window: AckWindow;
26
- signal?: AbortSignal;
27
- };
28
- export declare function streamRangeFragments(opts: StreamRangeOptions): Promise<void>;
29
- //# sourceMappingURL=fragments.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fragments.d.ts","sourceRoot":"","sources":["../src/fragments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,eAAO,MAAM,sBAAsB,QAAY,CAAC;AAEhD,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,cAAc,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBpF;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBlF"}
package/dist/fragments.js DELETED
@@ -1,45 +0,0 @@
1
- import { TransferStalledError } from './ack-window.js';
2
- export const DEFAULT_FRAGMENT_BYTES = 64 * 1024;
3
- export async function streamSourceFragments(opts) {
4
- let offset = opts.startOffset;
5
- while (offset < opts.totalSize) {
6
- if (opts.signal?.aborted)
7
- return;
8
- const ok = await opts.window.waitForRoom(offset);
9
- if (opts.signal?.aborted)
10
- return;
11
- if (!ok)
12
- throw new TransferStalledError(offset, opts.totalSize);
13
- const want = Math.min(opts.chunkSize, opts.totalSize - offset);
14
- const bytes = await opts.source.read(offset, want);
15
- if (bytes.byteLength === 0) {
16
- throw new Error(`unexpected EOF at offset ${offset}/${opts.totalSize}`);
17
- }
18
- await opts.device.transfer.fragment({ transferId: opts.transferId, offset, bytes }, { priority: opts.priority });
19
- offset += bytes.byteLength;
20
- }
21
- }
22
- export async function streamRangeFragments(opts) {
23
- let streamOffset = 0;
24
- for (const range of opts.ranges) {
25
- let produced = 0;
26
- while (produced < range.length) {
27
- if (opts.signal?.aborted)
28
- return;
29
- const ok = await opts.window.waitForRoom(streamOffset);
30
- if (opts.signal?.aborted)
31
- return;
32
- if (!ok)
33
- throw new TransferStalledError(streamOffset, streamOffset + (range.length - produced));
34
- const want = Math.min(opts.chunkSize, range.length - produced);
35
- const bytes = await opts.source.read(range.start + produced, want);
36
- if (bytes.byteLength === 0) {
37
- throw new Error(`unexpected EOF reading range at offset ${range.start + produced}`);
38
- }
39
- await opts.device.transfer.fragment({ transferId: opts.transferId, offset: streamOffset, bytes }, { priority: opts.priority });
40
- produced += bytes.byteLength;
41
- streamOffset += bytes.byteLength;
42
- }
43
- }
44
- }
45
- //# sourceMappingURL=fragments.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fragments.js","sourceRoot":"","sources":["../src/fragments.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import type { GatewaySurfaces } from '@bridgething/gateway';
2
- export type GatewayDevice = ReturnType<GatewaySurfaces['device']>;
3
- //# sourceMappingURL=gateway-device.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gateway-device.d.ts","sourceRoot":"","sources":["../src/gateway-device.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=gateway-device.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gateway-device.js","sourceRoot":"","sources":["../src/gateway-device.ts"],"names":[],"mappings":""}
package/dist/index.d.ts DELETED
@@ -1,12 +0,0 @@
1
- export type { OtaKind, OtaPhase } from '@bridgething/gateway';
2
- export { AckRegistry, AckWindow, TransferStalledError } from './ack-window.js';
3
- export type { AckWindowOptions } from './ack-window.js';
4
- export { OtaDriver } from './driver.js';
5
- export type { OtaProgressSnapshot, ProgressListener, WebappInstallResult } from './driver.js';
6
- export { DEFAULT_FRAGMENT_BYTES, streamRangeFragments, streamSourceFragments } from './fragments.js';
7
- export type { StreamRangeOptions, StreamSourceOptions } from './fragments.js';
8
- export type { GatewayDevice } from './gateway-device.js';
9
- export { serveOtaAssetRanges } from './range-serve.js';
10
- export { blobArtifactSource, bytesArtifactSource, sha256Hex } from './source.js';
11
- export type { ArtifactSource } from './source.js';
12
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC/E,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC9F,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACrG,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC9E,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACjF,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js DELETED
@@ -1,6 +0,0 @@
1
- export { AckRegistry, AckWindow, TransferStalledError } from './ack-window.js';
2
- export { OtaDriver } from './driver.js';
3
- export { DEFAULT_FRAGMENT_BYTES, streamRangeFragments, streamSourceFragments } from './fragments.js';
4
- export { serveOtaAssetRanges } from './range-serve.js';
5
- export { blobArtifactSource, bytesArtifactSource, sha256Hex } from './source.js';
6
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAE/E,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAGrG,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
@@ -1,75 +0,0 @@
1
- export type OtaManifestChannel = {
2
- name: string;
3
- stability: string;
4
- isDefault: boolean;
5
- latest: string;
6
- releases: string[];
7
- };
8
- export type ArtifactDigest = {
9
- size: number;
10
- sha256: string;
11
- };
12
- export type PatchDigest = ArtifactDigest & {
13
- source_sha256?: string;
14
- };
15
- export type ReleaseArtifacts = {
16
- daemon?: ArtifactDigest;
17
- daemon_zst?: ArtifactDigest;
18
- image_swu?: ArtifactDigest;
19
- image_zck?: ArtifactDigest;
20
- image_boot_zck?: ArtifactDigest;
21
- webapps?: Record<string, ArtifactDigest>;
22
- daemon_patches?: Record<string, PatchDigest>;
23
- };
24
- export type OtaManifestRelease = {
25
- version: string;
26
- channel: string;
27
- yanked: string | null;
28
- deprecated: boolean;
29
- builtinWebapps: Record<string, string>;
30
- artifacts?: ReleaseArtifacts;
31
- };
32
- export type OtaDiscoverManifest = {
33
- manifestVersion: number;
34
- updatedAt: string;
35
- channels: Record<string, OtaManifestChannel>;
36
- releases: Record<string, OtaManifestRelease>;
37
- };
38
- export declare class ManifestFetchError extends Error {
39
- readonly status?: number | undefined;
40
- constructor(message: string, status?: number | undefined);
41
- }
42
- export declare function fetchManifest(rootURL: string): Promise<OtaDiscoverManifest>;
43
- export type OtaCompositeVersion = {
44
- daemon: string;
45
- image: string;
46
- };
47
- export declare function parseCompositeVersion(raw: string): OtaCompositeVersion | null;
48
- export type OtaArtifactURLs = {
49
- daemonBinary: string;
50
- daemonBinaryZst: string;
51
- imageSwu: string;
52
- imageZck: string;
53
- imageBootZck: string;
54
- };
55
- export declare function imageVariantForChannel(channel: string): string;
56
- export declare function otaArtifactUrls(opts: {
57
- rootURL: string;
58
- channel: string;
59
- daemonVersion: string;
60
- imageVersion: string;
61
- imageVariant: string;
62
- }): OtaArtifactURLs;
63
- export declare function daemonPatchUrl(opts: {
64
- rootURL: string;
65
- channel: string;
66
- toVersion: string;
67
- fromVersion: string;
68
- }): string;
69
- export declare function builtinWebappUrl(opts: {
70
- rootURL: string;
71
- channel: string;
72
- name: string;
73
- version: string;
74
- }): string;
75
- //# sourceMappingURL=manifest.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"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"}