@limrun/api 0.39.8 → 0.40.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.40.0 (2026-07-13)
4
+
5
+ Full Changelog: [v0.39.8...v0.40.0](https://github.com/limrun-inc/typescript-sdk/compare/v0.39.8...v0.40.0)
6
+
7
+ ### Features
8
+
9
+ * **api:** ios add forceBundleId ([a6c22a0](https://github.com/limrun-inc/typescript-sdk/commit/a6c22a056b093ffb9316ba2326d7134ae4f8cb0f))
10
+
11
+
12
+ ### Bug Fixes
13
+
14
+ * **ci:** bump @arethetypeswrong/cli to ^0.18.0 and run CI workflows on Node 24 ([722c87f](https://github.com/limrun-inc/typescript-sdk/commit/722c87febac166192ee4bf376e09bed33802898b))
15
+
3
16
  ## 0.39.8 (2026-07-11)
4
17
 
5
18
  Full Changelog: [v0.39.7...v0.39.8](https://github.com/limrun-inc/typescript-sdk/compare/v0.39.7...v0.39.8)
@@ -109,9 +109,9 @@ export type InstanceClient = {
109
109
  launchMode?: 'ForegroundIfRunning' | 'RelaunchIfRunning';
110
110
  basisCacheDir?: string;
111
111
  /**
112
- * Called while the basis seed is downloaded from the instance. Fires once with
113
- * `(0, expectedSizeBytes)` before the download starts (expectedSizeBytes is 0 when
114
- * unknown), then repeatedly as bytes arrive.
112
+ * Called while missing basis-seed ranges are downloaded from the instance. Fires
113
+ * once with `(0, requiredDownloadBytes)` before transfer, then repeatedly as bytes
114
+ * arrive. A full-download fallback restarts progress with the complete seed size.
115
115
  */
116
116
  onBasisDownloadProgress?: (downloadedBytes: number, totalBytes: number) => void;
117
117
  /** Called after every successful sync, including watch-triggered re-syncs. */
@@ -109,9 +109,9 @@ export type InstanceClient = {
109
109
  launchMode?: 'ForegroundIfRunning' | 'RelaunchIfRunning';
110
110
  basisCacheDir?: string;
111
111
  /**
112
- * Called while the basis seed is downloaded from the instance. Fires once with
113
- * `(0, expectedSizeBytes)` before the download starts (expectedSizeBytes is 0 when
114
- * unknown), then repeatedly as bytes arrive.
112
+ * Called while missing basis-seed ranges are downloaded from the instance. Fires
113
+ * once with `(0, requiredDownloadBytes)` before transfer, then repeatedly as bytes
114
+ * arrive. A full-download fallback restarts progress with the complete seed size.
115
115
  */
116
116
  onBasisDownloadProgress?: (downloadedBytes: number, totalBytes: number) => void;
117
117
  /** Called after every successful sync, including watch-triggered re-syncs. */
@@ -11,7 +11,6 @@ export type AndroidSyncState = {
11
11
  seeds?: Array<{
12
12
  sha256?: string;
13
13
  size?: number;
14
- name?: string;
15
14
  mtime?: number;
16
15
  }>;
17
16
  };
@@ -1 +1 @@
1
- {"version":3,"file":"android-basis-cache.d.mts","sourceRoot":"","sources":["../src/internal/android-basis-cache.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,CAAC,EAAE,KAAK,CAAC;QACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACjF,CAAC,CAAC;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClF,CAAC;AAEF,KAAK,OAAO,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;AAgCjF;;;;;;;;GAQG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,OAAO,EACZ,uBAAuB,CAAC,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,GAC9E,OAAO,CAAC,IAAI,CAAC,CAmEf"}
1
+ {"version":3,"file":"android-basis-cache.d.mts","sourceRoot":"","sources":["../src/internal/android-basis-cache.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,CAAC,EAAE,KAAK,CAAC;QACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACjF,CAAC,CAAC;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnE,CAAC;AAEF,KAAK,OAAO,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;AAgCjF;;;;;;;;GAQG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,OAAO,EACZ,uBAAuB,CAAC,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,GAC9E,OAAO,CAAC,IAAI,CAAC,CAwFf"}
@@ -11,7 +11,6 @@ export type AndroidSyncState = {
11
11
  seeds?: Array<{
12
12
  sha256?: string;
13
13
  size?: number;
14
- name?: string;
15
14
  mtime?: number;
16
15
  }>;
17
16
  };
@@ -1 +1 @@
1
- {"version":3,"file":"android-basis-cache.d.ts","sourceRoot":"","sources":["../src/internal/android-basis-cache.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,CAAC,EAAE,KAAK,CAAC;QACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACjF,CAAC,CAAC;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClF,CAAC;AAEF,KAAK,OAAO,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;AAgCjF;;;;;;;;GAQG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,OAAO,EACZ,uBAAuB,CAAC,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,GAC9E,OAAO,CAAC,IAAI,CAAC,CAmEf"}
1
+ {"version":3,"file":"android-basis-cache.d.ts","sourceRoot":"","sources":["../src/internal/android-basis-cache.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,CAAC,EAAE,KAAK,CAAC;QACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACjF,CAAC,CAAC;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnE,CAAC;AAEF,KAAK,OAAO,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;AAgCjF;;;;;;;;GAQG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,OAAO,EACZ,uBAAuB,CAAC,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,GAC9E,OAAO,CAAC,IAAI,CAAC,CAwFf"}
@@ -7,6 +7,7 @@ const fs_1 = tslib_1.__importDefault(require("fs"));
7
7
  const path_1 = tslib_1.__importDefault(require("path"));
8
8
  const download_file_1 = require("./download-file.js");
9
9
  const proxy_transport_1 = require("./proxy-transport.js");
10
+ const seed_reconstruct_1 = require("./seed-reconstruct.js");
10
11
  function buildSyncStateUrl(apiUrl) {
11
12
  return `${apiUrl}/sync/state`;
12
13
  }
@@ -69,16 +70,16 @@ async function bootstrapAndroidBasisCache(apkPath, basisCacheDir, apiUrl, token,
69
70
  for (const seed of seeds) {
70
71
  serverShas.add(seed.sha256.toLowerCase());
71
72
  }
73
+ let staleBasisPath;
72
74
  if (fs_1.default.existsSync(basisPath)) {
73
75
  const basisSha = (await sha256FileHex(basisPath)).toLowerCase();
74
76
  if (serverShas.has(basisSha)) {
75
77
  return;
76
78
  }
77
- // A delta against a basis this instance doesn't have only earns a needFull
78
- // round trip and then a full upload (e.g. a warm cache pointed at a fresh
79
- // instance), so drop the stale basis and re-seed below.
79
+ // Keep the stale basis temporarily: even though the instance cannot use it
80
+ // directly, many of its blocks may be reusable while reconstructing a seed.
80
81
  log('debug', `local basis ${basisSha} unknown to instance; re-seeding basis cache`);
81
- await fs_1.default.promises.rm(basisPath, { force: true });
82
+ staleBasisPath = basisPath;
82
83
  }
83
84
  const localSha = (await sha256FileHex(apkPath)).toLowerCase();
84
85
  if (serverShas.has(localSha)) {
@@ -91,12 +92,31 @@ async function bootstrapAndroidBasisCache(apkPath, basisCacheDir, apiUrl, token,
91
92
  }
92
93
  const seed = seeds[0];
93
94
  if (!seed) {
95
+ if (staleBasisPath) {
96
+ await fs_1.default.promises.rm(staleBasisPath, { force: true });
97
+ }
94
98
  return;
95
99
  }
96
- // Announce the download before any bytes flow so consumers can react to the
97
- // expected size even during connection setup / time-to-first-byte.
98
- onBasisDownloadProgress?.(0, seed.size ?? 0);
99
- await (0, download_file_1.downloadFileToLocalPath)(buildSyncSeedUrl(apiUrl, seed.sha256), token, basisPath, onBasisDownloadProgress);
100
- log('debug', `seeded Android basis cache from instance seed: ${seed.sha256}`);
100
+ const seedUrl = buildSyncSeedUrl(apiUrl, seed.sha256);
101
+ try {
102
+ const result = await (0, seed_reconstruct_1.reconstructSeedFromLocalFiles)({
103
+ signatureUrl: `${seedUrl}.sig`,
104
+ seedUrl,
105
+ token,
106
+ sourcePaths: staleBasisPath ? [apkPath, staleBasisPath] : [apkPath],
107
+ outputPath: basisPath,
108
+ expectedSha256: seed.sha256,
109
+ ...(onBasisDownloadProgress ? { onProgress: onBasisDownloadProgress } : {}),
110
+ });
111
+ log('debug', `reconstructed Android basis seed ${seed.sha256}: matched=${result.matchedBlocks} downloaded=${result.downloadedBytes}`);
112
+ }
113
+ catch (err) {
114
+ log('debug', `basis seed reconstruction unavailable; downloading full seed: ${err instanceof Error ? err.message : String(err)}`);
115
+ // A failed reconstruction never replaces basisPath, so it is safe to
116
+ // truncate the stale basis in place for the full-download fallback.
117
+ onBasisDownloadProgress?.(0, seed.size ?? 0);
118
+ await (0, download_file_1.downloadFileToLocalPath)(seedUrl, token, basisPath, onBasisDownloadProgress);
119
+ log('debug', `seeded Android basis cache from full instance seed: ${seed.sha256}`);
120
+ }
101
121
  }
102
122
  //# sourceMappingURL=android-basis-cache.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"android-basis-cache.js","sourceRoot":"","sources":["../src/internal/android-basis-cache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"android-basis-cache.js","sourceRoot":"","sources":["../src/internal/android-basis-cache.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ import fs from 'fs';
3
3
  import path from 'path';
4
4
  import { downloadFileToLocalPath } from "./download-file.mjs";
5
5
  import { nodeProxyTransport } from "./proxy-transport.mjs";
6
+ import { reconstructSeedFromLocalFiles } from "./seed-reconstruct.mjs";
6
7
  function buildSyncStateUrl(apiUrl) {
7
8
  return `${apiUrl}/sync/state`;
8
9
  }
@@ -65,16 +66,16 @@ export async function bootstrapAndroidBasisCache(apkPath, basisCacheDir, apiUrl,
65
66
  for (const seed of seeds) {
66
67
  serverShas.add(seed.sha256.toLowerCase());
67
68
  }
69
+ let staleBasisPath;
68
70
  if (fs.existsSync(basisPath)) {
69
71
  const basisSha = (await sha256FileHex(basisPath)).toLowerCase();
70
72
  if (serverShas.has(basisSha)) {
71
73
  return;
72
74
  }
73
- // A delta against a basis this instance doesn't have only earns a needFull
74
- // round trip and then a full upload (e.g. a warm cache pointed at a fresh
75
- // instance), so drop the stale basis and re-seed below.
75
+ // Keep the stale basis temporarily: even though the instance cannot use it
76
+ // directly, many of its blocks may be reusable while reconstructing a seed.
76
77
  log('debug', `local basis ${basisSha} unknown to instance; re-seeding basis cache`);
77
- await fs.promises.rm(basisPath, { force: true });
78
+ staleBasisPath = basisPath;
78
79
  }
79
80
  const localSha = (await sha256FileHex(apkPath)).toLowerCase();
80
81
  if (serverShas.has(localSha)) {
@@ -87,12 +88,31 @@ export async function bootstrapAndroidBasisCache(apkPath, basisCacheDir, apiUrl,
87
88
  }
88
89
  const seed = seeds[0];
89
90
  if (!seed) {
91
+ if (staleBasisPath) {
92
+ await fs.promises.rm(staleBasisPath, { force: true });
93
+ }
90
94
  return;
91
95
  }
92
- // Announce the download before any bytes flow so consumers can react to the
93
- // expected size even during connection setup / time-to-first-byte.
94
- onBasisDownloadProgress?.(0, seed.size ?? 0);
95
- await downloadFileToLocalPath(buildSyncSeedUrl(apiUrl, seed.sha256), token, basisPath, onBasisDownloadProgress);
96
- log('debug', `seeded Android basis cache from instance seed: ${seed.sha256}`);
96
+ const seedUrl = buildSyncSeedUrl(apiUrl, seed.sha256);
97
+ try {
98
+ const result = await reconstructSeedFromLocalFiles({
99
+ signatureUrl: `${seedUrl}.sig`,
100
+ seedUrl,
101
+ token,
102
+ sourcePaths: staleBasisPath ? [apkPath, staleBasisPath] : [apkPath],
103
+ outputPath: basisPath,
104
+ expectedSha256: seed.sha256,
105
+ ...(onBasisDownloadProgress ? { onProgress: onBasisDownloadProgress } : {}),
106
+ });
107
+ log('debug', `reconstructed Android basis seed ${seed.sha256}: matched=${result.matchedBlocks} downloaded=${result.downloadedBytes}`);
108
+ }
109
+ catch (err) {
110
+ log('debug', `basis seed reconstruction unavailable; downloading full seed: ${err instanceof Error ? err.message : String(err)}`);
111
+ // A failed reconstruction never replaces basisPath, so it is safe to
112
+ // truncate the stale basis in place for the full-download fallback.
113
+ onBasisDownloadProgress?.(0, seed.size ?? 0);
114
+ await downloadFileToLocalPath(seedUrl, token, basisPath, onBasisDownloadProgress);
115
+ log('debug', `seeded Android basis cache from full instance seed: ${seed.sha256}`);
116
+ }
97
117
  }
98
118
  //# sourceMappingURL=android-basis-cache.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"android-basis-cache.mjs","sourceRoot":"","sources":["../src/internal/android-basis-cache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"android-basis-cache.mjs","sourceRoot":"","sources":["../src/internal/android-basis-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ export type SeedSignatureBlock = {
2
+ w: number;
3
+ s: string;
4
+ };
5
+ export type SeedSignature = {
6
+ version: number;
7
+ blockSize: number;
8
+ fileSize: number;
9
+ sha256: string;
10
+ blocks: SeedSignatureBlock[];
11
+ };
12
+ export type SeedBlockMatch = {
13
+ sourcePath: string;
14
+ sourceOffset: number;
15
+ };
16
+ export type SeedByteRange = {
17
+ start: number;
18
+ end: number;
19
+ };
20
+ type ReconstructSeedOptions = {
21
+ signatureUrl: string;
22
+ seedUrl: string;
23
+ token: string;
24
+ sourcePaths: string[];
25
+ outputPath: string;
26
+ expectedSha256: string;
27
+ onProgress?: (downloadedBytes: number, totalBytes: number) => void;
28
+ };
29
+ export declare function weakRollingChecksum(buffer: Uint8Array): number;
30
+ export declare function fetchSeedSignature(signatureUrl: string, token: string, expectedSha256: string): Promise<SeedSignature>;
31
+ export declare function findSeedBlockMatches(sourcePaths: string[], signature: SeedSignature): Promise<Map<number, SeedBlockMatch>>;
32
+ export declare function missingSeedRanges(signature: SeedSignature, matches: ReadonlyMap<number, SeedBlockMatch>): SeedByteRange[];
33
+ export declare function reconstructSeedFromLocalFiles(options: ReconstructSeedOptions): Promise<{
34
+ downloadedBytes: number;
35
+ totalDownloadBytes: number;
36
+ matchedBlocks: number;
37
+ }>;
38
+ export {};
39
+ //# sourceMappingURL=seed-reconstruct.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed-reconstruct.d.mts","sourceRoot":"","sources":["../src/internal/seed-reconstruct.ts"],"names":[],"mappings":"AAcA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,kBAAkB,EAAE,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAYF,KAAK,sBAAsB,GAAG;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;CACpE,CAAC;AAwBF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAS9D;AAsDD,wBAAsB,kBAAkB,CACtC,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,aAAa,CAAC,CAUxB;AA+MD,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EAAE,EACrB,SAAS,EAAE,aAAa,GACvB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAStC;AAED,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,GAC3C,aAAa,EAAE,CAkBjB;AAoFD,wBAAsB,6BAA6B,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC;IAC5F,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC,CA8CD"}
@@ -0,0 +1,39 @@
1
+ export type SeedSignatureBlock = {
2
+ w: number;
3
+ s: string;
4
+ };
5
+ export type SeedSignature = {
6
+ version: number;
7
+ blockSize: number;
8
+ fileSize: number;
9
+ sha256: string;
10
+ blocks: SeedSignatureBlock[];
11
+ };
12
+ export type SeedBlockMatch = {
13
+ sourcePath: string;
14
+ sourceOffset: number;
15
+ };
16
+ export type SeedByteRange = {
17
+ start: number;
18
+ end: number;
19
+ };
20
+ type ReconstructSeedOptions = {
21
+ signatureUrl: string;
22
+ seedUrl: string;
23
+ token: string;
24
+ sourcePaths: string[];
25
+ outputPath: string;
26
+ expectedSha256: string;
27
+ onProgress?: (downloadedBytes: number, totalBytes: number) => void;
28
+ };
29
+ export declare function weakRollingChecksum(buffer: Uint8Array): number;
30
+ export declare function fetchSeedSignature(signatureUrl: string, token: string, expectedSha256: string): Promise<SeedSignature>;
31
+ export declare function findSeedBlockMatches(sourcePaths: string[], signature: SeedSignature): Promise<Map<number, SeedBlockMatch>>;
32
+ export declare function missingSeedRanges(signature: SeedSignature, matches: ReadonlyMap<number, SeedBlockMatch>): SeedByteRange[];
33
+ export declare function reconstructSeedFromLocalFiles(options: ReconstructSeedOptions): Promise<{
34
+ downloadedBytes: number;
35
+ totalDownloadBytes: number;
36
+ matchedBlocks: number;
37
+ }>;
38
+ export {};
39
+ //# sourceMappingURL=seed-reconstruct.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed-reconstruct.d.ts","sourceRoot":"","sources":["../src/internal/seed-reconstruct.ts"],"names":[],"mappings":"AAcA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,kBAAkB,EAAE,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAYF,KAAK,sBAAsB,GAAG;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;CACpE,CAAC;AAwBF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAS9D;AAsDD,wBAAsB,kBAAkB,CACtC,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,aAAa,CAAC,CAUxB;AA+MD,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EAAE,EACrB,SAAS,EAAE,aAAa,GACvB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAStC;AAED,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,GAC3C,aAAa,EAAE,CAkBjB;AAoFD,wBAAsB,6BAA6B,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC;IAC5F,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC,CA8CD"}