@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 +13 -0
- package/instance-client.d.mts +3 -3
- package/instance-client.d.ts +3 -3
- package/internal/android-basis-cache.d.mts +0 -1
- package/internal/android-basis-cache.d.mts.map +1 -1
- package/internal/android-basis-cache.d.ts +0 -1
- package/internal/android-basis-cache.d.ts.map +1 -1
- package/internal/android-basis-cache.js +29 -9
- package/internal/android-basis-cache.js.map +1 -1
- package/internal/android-basis-cache.mjs +29 -9
- package/internal/android-basis-cache.mjs.map +1 -1
- package/internal/seed-reconstruct.d.mts +39 -0
- package/internal/seed-reconstruct.d.mts.map +1 -0
- package/internal/seed-reconstruct.d.ts +39 -0
- package/internal/seed-reconstruct.d.ts.map +1 -0
- package/internal/seed-reconstruct.js +413 -0
- package/internal/seed-reconstruct.js.map +1 -0
- package/internal/seed-reconstruct.mjs +405 -0
- package/internal/seed-reconstruct.mjs.map +1 -0
- package/package.json +1 -1
- package/resources/ios-instances.d.mts +6 -0
- package/resources/ios-instances.d.mts.map +1 -1
- package/resources/ios-instances.d.ts +6 -0
- package/resources/ios-instances.d.ts.map +1 -1
- package/src/instance-client.ts +3 -3
- package/src/internal/android-basis-cache.ts +38 -16
- package/src/internal/seed-reconstruct.ts +533 -0
- package/src/resources/ios-instances.ts +7 -0
- package/src/version.ts +1 -1
- package/version.d.mts +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/version.mjs +1 -1
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)
|
package/instance-client.d.mts
CHANGED
|
@@ -109,9 +109,9 @@ export type InstanceClient = {
|
|
|
109
109
|
launchMode?: 'ForegroundIfRunning' | 'RelaunchIfRunning';
|
|
110
110
|
basisCacheDir?: string;
|
|
111
111
|
/**
|
|
112
|
-
* Called while
|
|
113
|
-
* `(0,
|
|
114
|
-
*
|
|
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. */
|
package/instance-client.d.ts
CHANGED
|
@@ -109,9 +109,9 @@ export type InstanceClient = {
|
|
|
109
109
|
launchMode?: 'ForegroundIfRunning' | 'RelaunchIfRunning';
|
|
110
110
|
basisCacheDir?: string;
|
|
111
111
|
/**
|
|
112
|
-
* Called while
|
|
113
|
-
* `(0,
|
|
114
|
-
*
|
|
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. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"android-basis-cache.d.mts","sourceRoot":"","sources":["../src/internal/android-basis-cache.ts"],"names":[],"mappings":"
|
|
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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"android-basis-cache.d.ts","sourceRoot":"","sources":["../src/internal/android-basis-cache.ts"],"names":[],"mappings":"
|
|
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
|
-
//
|
|
78
|
-
//
|
|
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
|
-
|
|
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
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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":";;
|
|
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
|
-
//
|
|
74
|
-
//
|
|
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
|
-
|
|
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
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,uBAAuB,EAAE,4BAAwB;AAC1D,OAAO,EAAE,kBAAkB,EAAE,8BAA0B;
|
|
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"}
|