@bridgething/updater 0.7.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
package/README.md CHANGED
@@ -1,36 +1,31 @@
1
1
  # @bridgething/updater
2
2
 
3
- Transport-agnostic OTA updater for a [bridgething](https://github.com/JoeyEamigh/bridgething)
4
- Spotify Car Thing: a `bunx`/`npx` CLI that brings a device to the latest release
5
- on a channel, plus the library the CLI is built from.
3
+ CLI that brings a [bridgething](https://github.com/JoeyEamigh/bridgething) Spotify
4
+ Car Thing to a release on a channel.
6
5
 
7
6
  It updates the **device** (daemon binary and/or full image), not a webapp. To
8
7
  install or share a webapp, use [`@bridgething/client`](https://www.npmjs.com/package/@bridgething/client)
9
8
  and the `push`/`share` scripts a [`create-bridgething`](https://www.npmjs.com/package/create-bridgething)
10
9
  project ships.
11
10
 
12
- ## CLI
13
-
14
11
  ```sh
15
12
  bunx @bridgething/updater
16
13
  ```
17
14
 
18
- Connects to a Car Thing over the daemon's network gateway (the USB-gadget link
19
- by default), reads the discover manifest, resolves the target channel's `latest`
20
- composite version, downloads whatever artifacts are missing, and pushes the
21
- update. If the image half of the version changed it pushes a full image OTA,
22
- otherwise it pushes just the daemon binary. A `latest` release that is yanked or
23
- deprecated is refused.
24
-
25
- Options:
15
+ Connects to a Car Thing over the daemon's network gateway (the USB-gadget link by
16
+ default), reads the discover manifest, resolves the target channel's `latest`
17
+ composite version, and applies it. If the image half of the version changed it
18
+ pushes a full image OTA, otherwise it pushes just the daemon binary, preferring a
19
+ published delta over a full artifact. A release that is yanked or deprecated is
20
+ refused.
26
21
 
27
22
  | Flag | Default | Meaning |
28
23
  | --- | --- | --- |
29
24
  | `--root <url>` | `https://ota.bridgething.com` | Manifest + artifact root. |
30
- | `--channel <name>` | `stable` | Channel to track. |
25
+ | `--channel <name>` | the channel the device reports | Channel to track. |
31
26
  | `--host <ws-url>` | `ws://bridgething.local:8892/` | Daemon network gateway. |
32
- | `--cache-dir <path>` | OS tmpdir `/bridgething-updater` | Artifact download cache. |
33
- | `--daemon-only` | off | Skip the image OTA even if the image half changed. |
27
+ | `--cache-dir <path>` | a directory under the OS tmpdir | Artifact download cache. |
28
+ | `--version <ver>` | the channel's `latest` | Composite version to install. |
34
29
 
35
30
  Multiple devices on the network resolve to distinct mDNS names; point `--host` at
36
31
  the one you mean:
@@ -39,67 +34,13 @@ the one you mean:
39
34
  bunx @bridgething/updater --host ws://bridgething-<serial>.local:8892/
40
35
  ```
41
36
 
42
- ## Library
43
-
44
- The CLI is a thin driver over `OtaDriver`, which streams an artifact to the
45
- daemon with sender-side flow control and reports progress to a terminal state.
46
-
47
- ```ts
48
- import { BridgethingGateway } from '@bridgething/gateway';
49
- import { NetworkAdapter } from '@bridgething/adapter-network';
50
- import { OtaDriver } from '@bridgething/updater';
51
- import { fileArtifactSource } from '@bridgething/updater/node';
52
-
53
- const gateway = new BridgethingGateway(new NetworkAdapter());
54
- await gateway.start();
55
- // resolve a deviceId from a 'version' announce event, then:
56
-
57
- const driver = new OtaDriver(gateway, deviceId);
58
- try {
59
- const snapshot = await driver.pushDaemon(await fileArtifactSource('./bridgething'), s =>
60
- console.log(s.phase, 'percent' in s ? s.percent : ''),
61
- );
62
- if (snapshot.phase === 'failed') console.error(snapshot.reason);
63
- } finally {
64
- driver.close();
65
- }
66
- ```
67
-
68
- `OtaDriver` covers every OTA kind the daemon accepts:
69
-
70
- - `pushImage({ source, zcks, updateUrlBase })` - full image OTA. When the daemon
71
- requests delta ranges of the compressed asset, `zcks` (a map of asset name to
72
- source) serves them back over the same link; `serveAssetRanges` wires that up.
73
- - `pushDaemon(source)` - stage and activate a new daemon binary.
74
- - `pushBuiltinWebapp(source)` - stage and activate a built-in webapp.
75
- - `pushBandaidBatch(artifacts)` - stage several bandaid artifacts, then commit
76
- them together.
77
- - `installWebapp(source)` - install a third-party webapp bundle.
78
-
79
- ### Artifact sources
80
-
81
- An `ArtifactSource` is a random-access, sized byte source. The driver reads it in
82
- 64 KiB fragments and never buffers the whole file. Construct one from wherever
83
- the bytes live:
84
-
85
- - `fileArtifactSource(path)` from `@bridgething/updater/node` - a filesystem file.
86
- - `bytesArtifactSource(bytes)` - an in-memory `Uint8Array`.
87
- - `blobArtifactSource(blob)` - a browser `Blob` / `File`.
88
-
89
- ### Manifest helpers
90
-
91
- `@bridgething/updater/manifest` exposes the discover-manifest types and helpers
92
- the CLI uses: `fetchManifest`, `parseCompositeVersion`, `otaArtifactUrls`, and
93
- `builtinWebappUrl`.
94
-
95
- ### Adapters
96
-
97
- Re-exported for convenience so a consumer needs one import:
37
+ ## What it is built on
98
38
 
99
- - `@bridgething/updater/websocket` - `NetworkAdapter` (network gateway, any host
100
- that can open a WebSocket).
101
- - `@bridgething/updater/web-serial` - `WebSerialAdapter` (in-browser Bluetooth
102
- Classic over Web Serial).
39
+ Everything below the flags - the wire protocol, transfer pacing, delta selection,
40
+ artifact downloads, and the OTA state machine - runs in the Rust delivery core,
41
+ reached through [`@bridgething/core-node`](https://www.npmjs.com/package/@bridgething/core-node).
42
+ Drive updates from your own program by using that package directly. For the same
43
+ thing in a browser, use [`@bridgething/browser`](https://www.npmjs.com/package/@bridgething/browser).
103
44
 
104
45
  ## Posture
105
46
 
package/dist/cli.js CHANGED
@@ -1,33 +1,21 @@
1
1
  #!/usr/bin/env node
2
- import { mkdir, stat, writeFile } from 'node:fs/promises';
3
- import { tmpdir } from 'node:os';
4
- import { join } from 'node:path';
5
- import { BridgethingGateway } from '@bridgething/gateway';
6
- import { OtaDriver } from './driver.js';
7
- import { daemonPatchUrl, fetchManifest, imageVariantForChannel, otaArtifactUrls, parseCompositeVersion, } from './manifest.js';
8
- import { fileArtifactSource } from './node.js';
9
- import { NetworkAdapter } from './websocket.js';
2
+ import { DeliveryClient, parseCompositeVersion } from '@bridgething/core-node';
10
3
  const DEFAULT_ROOT = 'https://ota.bridgething.com';
11
4
  const DEFAULT_HOST = 'ws://bridgething.local:8892/';
12
- const CONNECT_TIMEOUT_MS = 15_000;
13
5
  function parseArgs(argv) {
14
- let root = DEFAULT_ROOT;
15
- let channel = null;
16
- let host = DEFAULT_HOST;
17
- let cacheDir = join(tmpdir(), 'bridgething-updater');
18
- let daemonOnly = false;
6
+ const args = { root: DEFAULT_ROOT, channel: null, host: DEFAULT_HOST, cacheDir: null, version: null };
19
7
  for (let i = 0; i < argv.length; i++) {
20
8
  const arg = argv[i];
21
9
  if (arg === '--root')
22
- root = requireValue(argv, ++i, arg);
10
+ args.root = requireValue(argv, ++i, arg);
23
11
  else if (arg === '--channel')
24
- channel = requireValue(argv, ++i, arg);
12
+ args.channel = requireValue(argv, ++i, arg);
25
13
  else if (arg === '--host')
26
- host = requireValue(argv, ++i, arg);
14
+ args.host = requireValue(argv, ++i, arg);
27
15
  else if (arg === '--cache-dir')
28
- cacheDir = requireValue(argv, ++i, arg);
29
- else if (arg === '--daemon-only')
30
- daemonOnly = true;
16
+ args.cacheDir = requireValue(argv, ++i, arg);
17
+ else if (arg === '--version')
18
+ args.version = requireValue(argv, ++i, arg);
31
19
  else if (arg === '--help' || arg === '-h') {
32
20
  printHelp();
33
21
  process.exit(0);
@@ -38,7 +26,8 @@ function parseArgs(argv) {
38
26
  process.exit(1);
39
27
  }
40
28
  }
41
- return { root: root.replace(/\/$/, ''), channel, host, cacheDir, daemonOnly };
29
+ args.root = args.root.replace(/\/$/, '');
30
+ return args;
42
31
  }
43
32
  function requireValue(argv, idx, flag) {
44
33
  const value = argv[idx];
@@ -51,198 +40,86 @@ function requireValue(argv, idx, flag) {
51
40
  function printHelp() {
52
41
  console.log(`Usage: bridgething-updater [options]
53
42
 
54
- Updates a Car Thing over its network gateway (USB-gadget by default) to the latest
55
- release on a channel, per the discover manifest.
43
+ Updates a Car Thing over its network gateway (USB-gadget by default) to a release
44
+ on a channel, per the discover manifest.
56
45
 
57
46
  Options:
58
- --root <url> Manifest root URL. Default ${DEFAULT_ROOT}.
47
+ --root <url> Manifest root URL. Default ${DEFAULT_ROOT}.
59
48
  --channel <name> Channel to track. Defaults to the channel the device reports.
60
49
  --host <ws-url> Daemon network gateway URL. Default ${DEFAULT_HOST}.
61
- --cache-dir <path> Artifact download cache. Default a bridgething-updater dir under the OS tmpdir.
62
- --daemon-only Skip the image OTA even if the manifest's image half changed.
50
+ --cache-dir <path> Artifact download cache. Defaults to a directory under the OS tmpdir.
51
+ --version <ver> Composite version to install. Defaults to the channel's latest.
63
52
  `);
64
53
  }
65
54
  async function main() {
66
55
  const args = parseArgs(process.argv.slice(2));
67
- await mkdir(args.cacheDir, { recursive: true });
68
56
  console.log(`connecting to ${args.host} ...`);
69
- const adapter = new NetworkAdapter({ discovery: args.host });
70
- const gateway = new BridgethingGateway(adapter);
71
- await gateway.start();
72
- const { deviceId, meta } = await waitForDevice(gateway);
73
- console.log(`connected: ${meta.modelName} (${deviceId}) - daemon ${meta.appVersion}, image ${meta.imageVersion} (${meta.imageVariant}/${meta.channel})`);
57
+ const client = await DeliveryClient.connect(args.host, {
58
+ appName: 'bridgething-updater',
59
+ cacheDir: args.cacheDir ?? undefined,
60
+ });
61
+ const meta = (await client.meta());
62
+ if (!meta)
63
+ fail('the device connected but never announced its version');
64
+ console.log(`connected: ${meta.modelName} (${client.deviceId()}) - daemon ${meta.appVersion}, image ${meta.imageVersion} (${meta.imageVariant}/${meta.channel})`);
74
65
  const channelName = args.channel ?? meta.channel;
75
66
  console.log(`fetching manifest from ${args.root} (channel ${channelName}) ...`);
76
- const manifest = await fetchManifest(args.root);
67
+ const manifest = (await client.discoverManifest(args.root));
77
68
  const channel = manifest.channels[channelName];
78
- if (!channel) {
79
- fail(`channel '${channelName}' not present in manifest`);
80
- }
81
- const composite = parseCompositeVersion(channel.latest);
82
- if (!composite) {
83
- fail(`channel.latest '${channel.latest}' is not a composite version`);
84
- }
85
- const release = manifest.releases[channel.latest];
69
+ if (!channel)
70
+ fail(`channel '${channelName}' is not in the manifest`);
71
+ const version = args.version ?? channel.latest;
72
+ const release = manifest.releases[version];
86
73
  if (release && (release.yanked !== null || release.deprecated)) {
87
- fail(`latest release ${channel.latest} is ${release.yanked !== null ? 'yanked' : 'deprecated'}; refusing to install`);
74
+ fail(`${version} is ${release.yanked !== null ? 'yanked' : 'deprecated'}; refusing to install`);
88
75
  }
89
- const urls = otaArtifactUrls({
90
- rootURL: args.root,
91
- channel: channelName,
92
- daemonVersion: composite.daemon,
93
- imageVersion: composite.image,
94
- imageVariant: imageVariantForChannel(channelName),
95
- });
96
- const driver = new OtaDriver(gateway, deviceId);
97
- let ok = true;
98
- try {
99
- if (!args.daemonOnly && meta.imageVersion !== composite.image) {
100
- ok = await runImagePush(driver, args, urls, `${channelName}-${composite.image}`);
101
- }
102
- else if (meta.appVersion !== composite.daemon) {
103
- ok = await runDaemonPush(driver, args, {
104
- fullUrl: urls.daemonBinary,
105
- zstUrl: urls.daemonBinaryZst,
106
- toVersion: composite.daemon,
107
- fromVersion: meta.appVersion,
108
- fromSha256: meta.daemonSha256 ?? null,
109
- channel: channelName,
110
- release,
111
- });
112
- }
113
- else {
114
- console.log('already up to date.');
115
- }
116
- }
117
- finally {
118
- driver.close();
76
+ const target = parseCompositeVersion(version);
77
+ if (!target)
78
+ fail(`'${version}' is not a composite version`);
79
+ if (meta.appVersion === target.daemon && meta.imageVersion === target.image) {
80
+ console.log('already up to date.');
81
+ process.exit(0);
119
82
  }
120
- await gateway.stop();
121
- process.exit(ok ? 0 : 1);
83
+ console.log(`applying ${version} ...`);
84
+ const watching = watch(client);
85
+ await client.applyVersion(channelName, version, args.root);
86
+ process.exit((await watching) ? 0 : 1);
122
87
  }
123
- async function runImagePush(driver, args, urls, tag) {
124
- console.log('downloading image artifacts ...');
125
- const swuPath = await downloadIfNeeded(urls.imageSwu, args.cacheDir, `image-${tag}.swu`);
126
- const zckPath = await downloadIfNeeded(urls.imageZck, args.cacheDir, `image-${tag}.zck`);
127
- const bootZckPath = await downloadIfNeeded(urls.imageBootZck, args.cacheDir, `image-${tag}-boot.zck`);
128
- const source = await fileArtifactSource(swuPath);
129
- const zcks = new Map([
130
- ['system.img.zck', await fileArtifactSource(zckPath)],
131
- ['boot.vfat.zck', await fileArtifactSource(bootZckPath)],
132
- ]);
133
- console.log('pushing image OTA ...');
134
- const snapshot = await driver.pushImage({ source, zcks, updateUrlBase: args.root, onProgress: logProgress });
135
- return reportOutcome(snapshot);
136
- }
137
- async function runDaemonPush(driver, args, opts) {
138
- const artifacts = opts.release?.artifacts;
139
- const patchDigest = artifacts?.daemon_patches?.[opts.fromVersion];
140
- const daemonDigest = artifacts?.daemon;
141
- const sourceMatches = !patchDigest?.source_sha256 || !opts.fromSha256 || patchDigest.source_sha256 === opts.fromSha256;
142
- if (patchDigest && !sourceMatches) {
143
- console.log(`skipping daemon delta: device binary ${opts.fromSha256?.slice(0, 12)} is not the published ` +
144
- `${opts.fromVersion} (${patchDigest.source_sha256?.slice(0, 12)}); full binary instead.`);
145
- }
146
- if (patchDigest && daemonDigest && sourceMatches) {
147
- console.log(`downloading daemon delta ${opts.fromVersion} -> ${opts.toVersion} ...`);
148
- const patchUrl = daemonPatchUrl({
149
- rootURL: args.root,
150
- channel: opts.channel,
151
- toVersion: opts.toVersion,
152
- fromVersion: opts.fromVersion,
153
- });
154
- const patchPath = await downloadIfNeeded(patchUrl, args.cacheDir, `daemon-${opts.toVersion}-from-${opts.fromVersion}.patch`);
155
- const patchSource = await fileArtifactSource(patchPath);
156
- console.log('pushing daemon delta OTA ...');
157
- const snapshot = await driver.pushDaemon(patchSource, logProgress, {
158
- algorithm: 'zstdPatchFrom',
159
- resultSha256: daemonDigest.sha256,
160
- resultSize: daemonDigest.size,
161
- sourceSha256: patchDigest.source_sha256 ?? null,
162
- });
163
- if (snapshot.phase !== 'failed')
164
- return reportOutcome(snapshot);
165
- console.log(`daemon delta failed (${snapshot.reason}); falling back to full binary ...`);
166
- }
167
- const zst = artifacts?.daemon_zst;
168
- if (zst && daemonDigest) {
169
- console.log(`downloading compressed daemon ${opts.toVersion} ...`);
170
- const zstPath = await downloadIfNeeded(opts.zstUrl, args.cacheDir, `daemon-${opts.toVersion}.zst`);
171
- const zstSource = await fileArtifactSource(zstPath);
172
- console.log('pushing compressed daemon OTA ...');
173
- const snapshot = await driver.pushDaemon(zstSource, logProgress, {
174
- algorithm: 'zstd',
175
- resultSha256: daemonDigest.sha256,
176
- resultSize: daemonDigest.size,
177
- sourceSha256: null,
178
- });
179
- if (snapshot.phase !== 'failed')
180
- return reportOutcome(snapshot);
181
- console.log(`compressed daemon push failed (${snapshot.reason}); falling back to the raw binary ...`);
182
- }
183
- console.log(`downloading daemon ${opts.toVersion} ...`);
184
- const path = await downloadIfNeeded(opts.fullUrl, args.cacheDir, `daemon-${opts.toVersion}`);
185
- const source = await fileArtifactSource(path);
186
- console.log('pushing daemon OTA ...');
187
- const snapshot = await driver.pushDaemon(source, logProgress);
188
- return reportOutcome(snapshot);
189
- }
190
- function logProgress(snapshot) {
191
- switch (snapshot.phase) {
192
- case 'streaming':
193
- console.log(` streaming: ${snapshot.percent}%`);
194
- break;
195
- case 'applying':
196
- console.log(` ${snapshot.otaPhase}: ${snapshot.percent}%`);
197
- break;
198
- case 'staged':
199
- console.log(' staged, activating ...');
200
- break;
201
- case 'completed':
202
- console.log(' completed.');
203
- break;
204
- case 'failed':
205
- console.error(` failed: ${snapshot.reason}`);
206
- break;
207
- }
208
- }
209
- function reportOutcome(snapshot) {
210
- if (snapshot.phase === 'failed') {
211
- console.error(`update failed: ${snapshot.reason}`);
212
- return false;
213
- }
214
- console.log('update finished.');
215
- return true;
216
- }
217
- async function waitForDevice(gateway) {
218
- return new Promise((resolve, reject) => {
219
- const timeout = setTimeout(() => {
220
- unsubscribe();
221
- reject(new Error(`no device announced itself within ${CONNECT_TIMEOUT_MS / 1000}s`));
222
- }, CONNECT_TIMEOUT_MS);
223
- const unsubscribe = gateway.on(event => {
224
- if (event.type !== 'message')
225
- return;
226
- if (event.message.data.type !== 'version')
227
- return;
228
- clearTimeout(timeout);
229
- unsubscribe();
230
- resolve({ deviceId: event.deviceId, meta: event.message.data.data });
231
- });
232
- });
88
+ function watch(client) {
89
+ return (async () => {
90
+ for (;;) {
91
+ const event = await client.nextEvent();
92
+ switch (event.kind) {
93
+ case 'planned':
94
+ console.log(` plan: ${(event.steps ?? []).map(step => step.label).join(' -> ')}`);
95
+ break;
96
+ case 'progress':
97
+ if (event.phase)
98
+ console.log(` ${describe(event.phase)}`);
99
+ break;
100
+ case 'updated':
101
+ console.log(`update finished: ${event.version ?? ''}`.trimEnd());
102
+ return true;
103
+ case 'failed':
104
+ console.error(`update failed: ${event.reason ?? 'no reason given'}`);
105
+ return false;
106
+ case 'lagged':
107
+ console.log(' (progress entries were dropped)');
108
+ break;
109
+ }
110
+ }
111
+ })();
233
112
  }
234
- async function downloadIfNeeded(url, cacheDir, filename) {
235
- const target = join(cacheDir, filename);
236
- const existing = await stat(target).catch(() => null);
237
- if (existing && existing.size > 0)
238
- return target;
239
- const response = await fetch(url);
240
- if (!response.ok || !response.body) {
241
- throw new Error(`download failed: HTTP ${response.status} for ${url}`);
242
- }
243
- const bytes = new Uint8Array(await response.arrayBuffer());
244
- await writeFile(target, bytes);
245
- return target;
113
+ function describe(phase) {
114
+ const head = [phase.kind, phase.asset].filter(Boolean).join(' ');
115
+ const done = phase.received ?? phase.sent;
116
+ if (done !== undefined && phase.total)
117
+ return `${head} ${Math.floor((done * 100) / phase.total)}%`;
118
+ if (phase.writePercent !== undefined)
119
+ return `${head} ${phase.writePercent}%`;
120
+ if (phase.reason)
121
+ return `${head}: ${phase.reason}`;
122
+ return head;
246
123
  }
247
124
  function fail(message) {
248
125
  console.error(message);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAoB,MAAM,wBAAwB,CAAC;AAgBjG,MAAM,YAAY,GAAG,6BAA6B,CAAC;AACnD,MAAM,YAAY,GAAG,8BAA8B,CAAC;AAEpD,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,IAAI,GAAS,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAE5G,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,QAAQ;YAAE,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;aAC1D,IAAI,GAAG,KAAK,WAAW;YAAE,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;aACrE,IAAI,GAAG,KAAK,QAAQ;YAAE,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;aAC/D,IAAI,GAAG,KAAK,aAAa;YAAE,IAAI,CAAC,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;aACxE,IAAI,GAAG,KAAK,WAAW;YAAE,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;aACrE,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAC1C,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;YAC1C,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACzC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,IAAc,EAAE,GAAW,EAAE,IAAY;IAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,mBAAmB,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;mDAMqC,YAAY;;4DAEH,YAAY;;;CAGvE,CAAC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9C,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE;QACrD,OAAO,EAAE,qBAAqB;QAC9B,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,SAAS;KACrC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAA2B,CAAC;IAC7D,IAAI,CAAC,IAAI;QAAE,IAAI,CAAC,sDAAsD,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CACT,cAAc,IAAI,CAAC,SAAS,KAAK,MAAM,CAAC,QAAQ,EAAE,cAAc,IAAI,CAAC,UAAU,WAAW,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,GAAG,CACrJ,CAAC;IAEF,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,CAAC,IAAI,aAAa,WAAW,OAAO,CAAC,CAAC;IAChF,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAqB,CAAC;IAChF,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC/C,IAAI,CAAC,OAAO;QAAE,IAAI,CAAC,YAAY,WAAW,0BAA0B,CAAC,CAAC;IAEtE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAC/C,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/D,IAAI,CAAC,GAAG,OAAO,OAAO,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,uBAAuB,CAAC,CAAC;IAClG,CAAC;IAED,MAAM,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,CAAC,MAAM;QAAE,IAAI,CAAC,IAAI,OAAO,8BAA8B,CAAC,CAAC;IAC7D,IAAI,IAAI,CAAC,UAAU,KAAK,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC;QAC5E,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,MAAM,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,KAAK,CAAC,MAAsB;IACnC,OAAO,CAAC,KAAK,IAAI,EAAE;QACjB,SAAS,CAAC;YACR,MAAM,KAAK,GAAgB,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;YACpD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;gBACnB,KAAK,SAAS;oBACZ,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBACnF,MAAM;gBACR,KAAK,UAAU;oBACb,IAAI,KAAK,CAAC,KAAK;wBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBAC3D,MAAM;gBACR,KAAK,SAAS;oBACZ,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;oBACjE,OAAO,IAAI,CAAC;gBACd,KAAK,QAAQ;oBACX,OAAO,CAAC,KAAK,CAAC,kBAAkB,KAAK,CAAC,MAAM,IAAI,iBAAiB,EAAE,CAAC,CAAC;oBACrE,OAAO,KAAK,CAAC;gBACf,KAAK,QAAQ;oBACX,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;oBACjD,MAAM;YACV,CAAC;QACH,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;AACP,CAAC;AAED,SAAS,QAAQ,CAAC,KAAwC;IACxD,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjE,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC;IAC1C,IAAI,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK;QAAE,OAAO,GAAG,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;IACnG,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS;QAAE,OAAO,GAAG,IAAI,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC;IAC9E,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,GAAG,IAAI,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;IACpD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,IAAI,CAAC,OAAe;IAC3B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;IACjB,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bridgething/updater",
3
- "version": "0.7.0",
4
- "description": "Transport-agnostic OTA updater for bridgething: library + bunx/npx CLI.",
3
+ "version": "0.9.0",
4
+ "description": "Update a Spotify Car Thing from the command line, over its network gateway.",
5
5
  "license": "MIT",
6
6
  "author": "Joey Eamigh <55670930+JoeyEamigh@users.noreply.github.com> (https://github.com/JoeyEamigh)",
7
7
  "homepage": "https://bridgething.com",
@@ -19,45 +19,20 @@
19
19
  "registry": "https://registry.npmjs.org/"
20
20
  },
21
21
  "type": "module",
22
- "types": "./dist/index.d.ts",
23
22
  "bin": {
24
23
  "bridgething-updater": "./dist/cli.js"
25
24
  },
26
- "exports": {
27
- ".": {
28
- "types": "./dist/index.d.ts",
29
- "default": "./dist/index.js"
30
- },
31
- "./manifest": {
32
- "types": "./dist/manifest.d.ts",
33
- "default": "./dist/manifest.js"
34
- },
35
- "./node": {
36
- "types": "./dist/node.d.ts",
37
- "default": "./dist/node.js"
38
- },
39
- "./websocket": {
40
- "types": "./dist/websocket.d.ts",
41
- "default": "./dist/websocket.js"
42
- },
43
- "./web-serial": {
44
- "types": "./dist/web-serial.d.ts",
45
- "default": "./dist/web-serial.js"
46
- }
47
- },
48
25
  "files": ["dist"],
49
26
  "scripts": {
50
27
  "prebuild": "rm -rf dist",
51
28
  "build": "tsc -p tsconfig.build.json && chmod +x dist/cli.js",
52
29
  "dev": "tsc -p tsconfig.build.json --watch",
53
30
  "typecheck": "tsc --noEmit",
54
- "lint": "eslint .",
55
- "test": "bun test"
31
+ "lint": "eslint ."
56
32
  },
57
33
  "dependencies": {
58
- "@bridgething/adapter-network": "0.7.0",
59
- "@bridgething/gateway": "0.7.0",
60
- "@bridgething/lib": "0.7.0"
34
+ "@bridgething/core-node": "0.9.0",
35
+ "@bridgething/lib": "0.9.0"
61
36
  },
62
37
  "peerDependencies": {
63
38
  "typescript": "^6.0.3"
@@ -1,38 +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
- export type AckWindowOptions = {
13
- windowBytes?: number;
14
- ackTimeoutMs?: number;
15
- };
16
- export declare class AckWindow {
17
- private acked;
18
- private waiters;
19
- private readonly windowBytes;
20
- private readonly ackTimeoutMs;
21
- constructor(baseline: number, options?: AckWindowOptions);
22
- note(received: number): void;
23
- get ackedBytes(): number;
24
- waitForRoom(offset: number): Promise<boolean>;
25
- private waitForProgress;
26
- }
27
- export declare class AckRegistry {
28
- private readonly windowOptions;
29
- private readonly windows;
30
- constructor(windowOptions?: AckWindowOptions);
31
- register(transferId: string, baseline: number): AckWindow;
32
- deregister(transferId: string): void;
33
- note(transferId: string, received: number): void;
34
- }
35
- export declare class TransferStalledError extends Error {
36
- constructor(offset: number, totalSize: number);
37
- }
38
- //# sourceMappingURL=ack-window.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ack-window.d.ts","sourceRoot":"","sources":["../src/ack-window.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB;IAM5D,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQ5B,IAAI,UAAU,IAAI,MAAM,CAEvB;IAEK,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASnD,OAAO,CAAC,eAAe;CAgBxB;AAED,qBAAa,WAAW;IAGV,OAAO,CAAC,QAAQ,CAAC,aAAa;IAF1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;gBAE3B,aAAa,GAAE,gBAAqB;IAEjE,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS;IAMzD,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIpC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;CAGjD;AAED,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;CAI9C"}