@limrun/api 0.39.7 → 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.
Files changed (69) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/exec-client.d.mts +5 -0
  3. package/exec-client.d.mts.map +1 -1
  4. package/exec-client.d.ts +5 -0
  5. package/exec-client.d.ts.map +1 -1
  6. package/exec-client.js.map +1 -1
  7. package/exec-client.mjs.map +1 -1
  8. package/index.d.mts +1 -1
  9. package/index.d.mts.map +1 -1
  10. package/index.d.ts +1 -1
  11. package/index.d.ts.map +1 -1
  12. package/index.js.map +1 -1
  13. package/index.mjs.map +1 -1
  14. package/instance-client.d.mts +3 -3
  15. package/instance-client.d.mts.map +1 -1
  16. package/instance-client.d.ts +3 -3
  17. package/instance-client.d.ts.map +1 -1
  18. package/instance-client.js +2 -64
  19. package/instance-client.js.map +1 -1
  20. package/instance-client.mjs +1 -63
  21. package/instance-client.mjs.map +1 -1
  22. package/internal/android-basis-cache.d.mts +29 -0
  23. package/internal/android-basis-cache.d.mts.map +1 -0
  24. package/internal/android-basis-cache.d.ts +29 -0
  25. package/internal/android-basis-cache.d.ts.map +1 -0
  26. package/internal/android-basis-cache.js +122 -0
  27. package/internal/android-basis-cache.js.map +1 -0
  28. package/internal/android-basis-cache.mjs +118 -0
  29. package/internal/android-basis-cache.mjs.map +1 -0
  30. package/internal/seed-reconstruct.d.mts +39 -0
  31. package/internal/seed-reconstruct.d.mts.map +1 -0
  32. package/internal/seed-reconstruct.d.ts +39 -0
  33. package/internal/seed-reconstruct.d.ts.map +1 -0
  34. package/internal/seed-reconstruct.js +413 -0
  35. package/internal/seed-reconstruct.js.map +1 -0
  36. package/internal/seed-reconstruct.mjs +405 -0
  37. package/internal/seed-reconstruct.mjs.map +1 -0
  38. package/package.json +1 -1
  39. package/resources/index.d.mts +1 -1
  40. package/resources/index.d.mts.map +1 -1
  41. package/resources/index.d.ts +1 -1
  42. package/resources/index.d.ts.map +1 -1
  43. package/resources/index.js.map +1 -1
  44. package/resources/index.mjs.map +1 -1
  45. package/resources/ios-instances.d.mts +6 -0
  46. package/resources/ios-instances.d.mts.map +1 -1
  47. package/resources/ios-instances.d.ts +6 -0
  48. package/resources/ios-instances.d.ts.map +1 -1
  49. package/resources/xcode-instances-helpers.d.mts +29 -0
  50. package/resources/xcode-instances-helpers.d.mts.map +1 -1
  51. package/resources/xcode-instances-helpers.d.ts +29 -0
  52. package/resources/xcode-instances-helpers.d.ts.map +1 -1
  53. package/resources/xcode-instances-helpers.js +1 -0
  54. package/resources/xcode-instances-helpers.js.map +1 -1
  55. package/resources/xcode-instances-helpers.mjs +1 -0
  56. package/resources/xcode-instances-helpers.mjs.map +1 -1
  57. package/src/exec-client.ts +5 -0
  58. package/src/index.ts +1 -0
  59. package/src/instance-client.ts +4 -94
  60. package/src/internal/android-basis-cache.ts +153 -0
  61. package/src/internal/seed-reconstruct.ts +533 -0
  62. package/src/resources/index.ts +1 -0
  63. package/src/resources/ios-instances.ts +7 -0
  64. package/src/resources/xcode-instances-helpers.ts +31 -0
  65. package/src/version.ts +1 -1
  66. package/version.d.mts +1 -1
  67. package/version.d.ts +1 -1
  68. package/version.js +1 -1
  69. package/version.mjs +1 -1
@@ -0,0 +1,413 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.weakRollingChecksum = weakRollingChecksum;
4
+ exports.fetchSeedSignature = fetchSeedSignature;
5
+ exports.findSeedBlockMatches = findSeedBlockMatches;
6
+ exports.missingSeedRanges = missingSeedRanges;
7
+ exports.reconstructSeedFromLocalFiles = reconstructSeedFromLocalFiles;
8
+ const tslib_1 = require("./tslib.js");
9
+ const crypto_1 = tslib_1.__importDefault(require("crypto"));
10
+ const fs_1 = tslib_1.__importDefault(require("fs"));
11
+ const path_1 = tslib_1.__importDefault(require("path"));
12
+ const stream_1 = require("stream");
13
+ const proxy_transport_1 = require("./proxy-transport.js");
14
+ const SIGNATURE_VERSION = 1;
15
+ const STRONG_HASH_HEX_LENGTH = 32;
16
+ const SCAN_CHUNK_SIZE = 1024 * 1024;
17
+ const MAX_ALIGNED_MISS_BYTES = 32 * 1024 * 1024;
18
+ const SHA256_PATTERN = /^[0-9a-f]{64}$/i;
19
+ const STRONG_HASH_PATTERN = /^[0-9a-f]{32}$/i;
20
+ function strongHash(buffer) {
21
+ return crypto_1.default.createHash('sha256').update(buffer).digest('hex').slice(0, STRONG_HASH_HEX_LENGTH);
22
+ }
23
+ function blockSpan(signature, index) {
24
+ const offset = index * signature.blockSize;
25
+ return {
26
+ offset,
27
+ length: Math.min(signature.blockSize, signature.fileSize - offset),
28
+ };
29
+ }
30
+ async function sha256FileHex(filePath) {
31
+ return await new Promise((resolve, reject) => {
32
+ const hash = crypto_1.default.createHash('sha256');
33
+ const stream = fs_1.default.createReadStream(filePath);
34
+ stream.on('data', (chunk) => hash.update(chunk));
35
+ stream.on('error', reject);
36
+ stream.on('end', () => resolve(hash.digest('hex')));
37
+ });
38
+ }
39
+ function weakRollingChecksum(buffer) {
40
+ let a = 0;
41
+ let b = 0;
42
+ for (let i = 0; i < buffer.byteLength; i++) {
43
+ const value = buffer[i];
44
+ a = (a + value) & 0xffff;
45
+ b = (b + (buffer.byteLength - i) * value) & 0xffff;
46
+ }
47
+ return b * 0x10000 + a;
48
+ }
49
+ function validateSignature(value, expectedSha256) {
50
+ if (!value || typeof value !== 'object') {
51
+ throw new Error('Invalid seed signature: expected an object');
52
+ }
53
+ const candidate = value;
54
+ if (candidate.version !== SIGNATURE_VERSION) {
55
+ throw new Error(`Unsupported seed signature version: ${String(candidate.version)}`);
56
+ }
57
+ if (!Number.isSafeInteger(candidate.blockSize) || candidate.blockSize <= 0) {
58
+ throw new Error('Invalid seed signature blockSize');
59
+ }
60
+ if (!Number.isSafeInteger(candidate.fileSize) || candidate.fileSize < 0) {
61
+ throw new Error('Invalid seed signature fileSize');
62
+ }
63
+ if (typeof candidate.sha256 !== 'string' ||
64
+ !SHA256_PATTERN.test(candidate.sha256) ||
65
+ candidate.sha256.toLowerCase() !== expectedSha256.toLowerCase()) {
66
+ throw new Error('Seed signature sha256 does not match the requested seed');
67
+ }
68
+ if (!Array.isArray(candidate.blocks)) {
69
+ throw new Error('Invalid seed signature blocks');
70
+ }
71
+ const expectedBlocks = Math.ceil(candidate.fileSize / candidate.blockSize);
72
+ if (candidate.blocks.length !== expectedBlocks) {
73
+ throw new Error(`Invalid seed signature block count: got ${candidate.blocks.length}, expected ${expectedBlocks}`);
74
+ }
75
+ const blocks = candidate.blocks.map((block, index) => {
76
+ if (!block ||
77
+ !Number.isInteger(block.w) ||
78
+ block.w < 0 ||
79
+ block.w > 0xffffffff ||
80
+ typeof block.s !== 'string' ||
81
+ !STRONG_HASH_PATTERN.test(block.s)) {
82
+ throw new Error(`Invalid seed signature block at index ${index}`);
83
+ }
84
+ return { w: block.w, s: block.s.toLowerCase() };
85
+ });
86
+ return {
87
+ version: candidate.version,
88
+ blockSize: candidate.blockSize,
89
+ fileSize: candidate.fileSize,
90
+ sha256: candidate.sha256.toLowerCase(),
91
+ blocks,
92
+ };
93
+ }
94
+ async function fetchSeedSignature(signatureUrl, token, expectedSha256) {
95
+ const response = await proxy_transport_1.nodeProxyTransport.fetch(signatureUrl, {
96
+ method: 'GET',
97
+ headers: { Authorization: `Bearer ${token}` },
98
+ });
99
+ if (!response.ok) {
100
+ const body = await response.text();
101
+ throw new Error(`Seed signature download failed: ${response.status} ${body}`);
102
+ }
103
+ return validateSignature(await response.json(), expectedSha256);
104
+ }
105
+ async function readExactly(handle, buffer, length, position) {
106
+ let offset = 0;
107
+ while (offset < length) {
108
+ const { bytesRead } = await handle.read(buffer, offset, length - offset, position + offset);
109
+ if (bytesRead <= 0) {
110
+ throw new Error(`Unexpected EOF at offset ${position + offset}`);
111
+ }
112
+ offset += bytesRead;
113
+ }
114
+ }
115
+ async function scanSourceForFullBlocks(source, candidatesByWeak, signature, matches, unmatched) {
116
+ const blockLength = signature.blockSize;
117
+ const handle = await fs_1.default.promises.open(source.path, 'r');
118
+ try {
119
+ if (source.size < blockLength || unmatched.size === 0) {
120
+ return;
121
+ }
122
+ const ring = Buffer.allocUnsafe(blockLength);
123
+ await readExactly(handle, ring, blockLength, 0);
124
+ let a = 0;
125
+ let b = 0;
126
+ for (let i = 0; i < blockLength; i++) {
127
+ const value = ring[i];
128
+ a = (a + value) & 0xffff;
129
+ b = (b + (blockLength - i) * value) & 0xffff;
130
+ }
131
+ let ringPosition = 0;
132
+ let sourceOffset = 0;
133
+ let candidateBuffer;
134
+ const confirmCandidate = async (candidateIndexes) => {
135
+ candidateBuffer ?? (candidateBuffer = Buffer.allocUnsafe(blockLength));
136
+ await readExactly(handle, candidateBuffer, blockLength, sourceOffset);
137
+ const strong = strongHash(candidateBuffer);
138
+ for (const index of candidateIndexes) {
139
+ if (unmatched.has(index) && signature.blocks[index].s === strong) {
140
+ matches.set(index, { sourcePath: source.path, sourceOffset });
141
+ unmatched.delete(index);
142
+ }
143
+ }
144
+ };
145
+ let candidateIndexes = candidatesByWeak.get(b * 0x10000 + a);
146
+ if (candidateIndexes?.some((index) => unmatched.has(index))) {
147
+ await confirmCandidate(candidateIndexes);
148
+ }
149
+ const incoming = Buffer.allocUnsafe(SCAN_CHUNK_SIZE);
150
+ let readPosition = blockLength;
151
+ while (readPosition < source.size && unmatched.size > 0) {
152
+ const requested = Math.min(incoming.byteLength, source.size - readPosition);
153
+ const { bytesRead } = await handle.read(incoming, 0, requested, readPosition);
154
+ if (bytesRead <= 0) {
155
+ break;
156
+ }
157
+ for (let i = 0; i < bytesRead && unmatched.size > 0; i++) {
158
+ const outgoingValue = ring[ringPosition];
159
+ const incomingValue = incoming[i];
160
+ ring[ringPosition] = incomingValue;
161
+ ringPosition++;
162
+ if (ringPosition === blockLength) {
163
+ ringPosition = 0;
164
+ }
165
+ a = (a - outgoingValue + incomingValue) & 0xffff;
166
+ b = (b - ((blockLength * outgoingValue) & 0xffff) + a) & 0xffff;
167
+ sourceOffset++;
168
+ candidateIndexes = candidatesByWeak.get(b * 0x10000 + a);
169
+ if (candidateIndexes?.some((index) => unmatched.has(index))) {
170
+ await confirmCandidate(candidateIndexes);
171
+ }
172
+ }
173
+ readPosition += bytesRead;
174
+ }
175
+ }
176
+ finally {
177
+ await handle.close();
178
+ }
179
+ }
180
+ async function existingSourceFiles(sourcePaths) {
181
+ const sources = [];
182
+ for (const sourcePath of sourcePaths) {
183
+ const stat = await fs_1.default.promises.stat(sourcePath).catch(() => undefined);
184
+ if (stat?.isFile()) {
185
+ sources.push({ path: sourcePath, size: stat.size });
186
+ }
187
+ }
188
+ return sources;
189
+ }
190
+ async function matchAlignedBlocks(sources, signature, matches) {
191
+ for (const source of sources) {
192
+ const handle = await fs_1.default.promises.open(source.path, 'r');
193
+ const block = Buffer.allocUnsafe(signature.blockSize);
194
+ try {
195
+ for (let index = 0; index < signature.blocks.length; index++) {
196
+ if (matches.has(index)) {
197
+ continue;
198
+ }
199
+ const span = blockSpan(signature, index);
200
+ if (span.offset + span.length > source.size) {
201
+ continue;
202
+ }
203
+ await readExactly(handle, block, span.length, span.offset);
204
+ if (strongHash(block.subarray(0, span.length)) === signature.blocks[index].s) {
205
+ matches.set(index, { sourcePath: source.path, sourceOffset: span.offset });
206
+ }
207
+ }
208
+ }
209
+ finally {
210
+ await handle.close();
211
+ }
212
+ }
213
+ }
214
+ async function matchTrailingPartialBlock(sources, signature, matches) {
215
+ if (signature.fileSize === 0 || signature.fileSize % signature.blockSize === 0) {
216
+ return;
217
+ }
218
+ const index = signature.blocks.length - 1;
219
+ if (matches.has(index)) {
220
+ return;
221
+ }
222
+ const span = blockSpan(signature, index);
223
+ const expectedStrongHash = signature.blocks[index].s;
224
+ const block = Buffer.allocUnsafe(span.length);
225
+ for (const source of sources) {
226
+ if (source.size < span.length) {
227
+ continue;
228
+ }
229
+ const sourceOffset = source.size - span.length;
230
+ if (sourceOffset === span.offset) {
231
+ continue; // The aligned pass already checked this offset.
232
+ }
233
+ const handle = await fs_1.default.promises.open(source.path, 'r');
234
+ try {
235
+ await readExactly(handle, block, span.length, sourceOffset);
236
+ if (strongHash(block) === expectedStrongHash) {
237
+ matches.set(index, { sourcePath: source.path, sourceOffset });
238
+ return;
239
+ }
240
+ }
241
+ finally {
242
+ await handle.close();
243
+ }
244
+ }
245
+ }
246
+ function shouldSkipRollingScan(signature, matches) {
247
+ let missingBytes = 0;
248
+ for (let index = 0; index < signature.blocks.length; index++) {
249
+ if (!matches.has(index)) {
250
+ missingBytes += blockSpan(signature, index).length;
251
+ }
252
+ }
253
+ const matchRatio = signature.blocks.length === 0 ? 1 : matches.size / signature.blocks.length;
254
+ return matchRatio >= 0.8 && missingBytes <= MAX_ALIGNED_MISS_BYTES;
255
+ }
256
+ async function matchShiftedFullBlocks(sources, signature, matches) {
257
+ const fullBlockCount = Math.floor(signature.fileSize / signature.blockSize);
258
+ const unmatched = new Set();
259
+ const candidatesByWeak = new Map();
260
+ for (let index = 0; index < fullBlockCount; index++) {
261
+ if (matches.has(index)) {
262
+ continue;
263
+ }
264
+ unmatched.add(index);
265
+ const weak = signature.blocks[index].w;
266
+ const candidates = candidatesByWeak.get(weak) ?? [];
267
+ candidates.push(index);
268
+ candidatesByWeak.set(weak, candidates);
269
+ }
270
+ for (const source of sources) {
271
+ if (unmatched.size === 0) {
272
+ return;
273
+ }
274
+ await scanSourceForFullBlocks(source, candidatesByWeak, signature, matches, unmatched);
275
+ }
276
+ }
277
+ async function findSeedBlockMatches(sourcePaths, signature) {
278
+ const sources = await existingSourceFiles(sourcePaths);
279
+ const matches = new Map();
280
+ await matchAlignedBlocks(sources, signature, matches);
281
+ await matchTrailingPartialBlock(sources, signature, matches);
282
+ if (!shouldSkipRollingScan(signature, matches)) {
283
+ await matchShiftedFullBlocks(sources, signature, matches);
284
+ }
285
+ return matches;
286
+ }
287
+ function missingSeedRanges(signature, matches) {
288
+ const ranges = [];
289
+ let startBlock;
290
+ for (let index = 0; index <= signature.blocks.length; index++) {
291
+ const missing = index < signature.blocks.length && !matches.has(index);
292
+ if (missing && startBlock === undefined) {
293
+ startBlock = index;
294
+ }
295
+ else if (!missing && startBlock !== undefined) {
296
+ const first = blockSpan(signature, startBlock);
297
+ const last = blockSpan(signature, index - 1);
298
+ ranges.push({
299
+ start: first.offset,
300
+ end: last.offset + last.length - 1,
301
+ });
302
+ startBlock = undefined;
303
+ }
304
+ }
305
+ return ranges;
306
+ }
307
+ async function copyMatchedBlocks(output, signature, matches) {
308
+ const sourceHandles = new Map();
309
+ try {
310
+ for (const [index, match] of matches) {
311
+ let source = sourceHandles.get(match.sourcePath);
312
+ if (!source) {
313
+ source = await fs_1.default.promises.open(match.sourcePath, 'r');
314
+ sourceHandles.set(match.sourcePath, source);
315
+ }
316
+ const span = blockSpan(signature, index);
317
+ const block = Buffer.allocUnsafe(span.length);
318
+ await readExactly(source, block, span.length, match.sourceOffset);
319
+ await writeExactly(output, block, span.offset);
320
+ }
321
+ }
322
+ finally {
323
+ await Promise.all([...sourceHandles.values()].map((handle) => handle.close()));
324
+ }
325
+ }
326
+ async function writeExactly(handle, buffer, position) {
327
+ let offset = 0;
328
+ while (offset < buffer.byteLength) {
329
+ const { bytesWritten } = await handle.write(buffer, offset, buffer.byteLength - offset, position + offset);
330
+ if (bytesWritten <= 0) {
331
+ throw new Error(`Unable to write reconstructed seed at offset ${position + offset}`);
332
+ }
333
+ offset += bytesWritten;
334
+ }
335
+ }
336
+ async function downloadRange(seedUrl, token, range, fileSize, output, reportBytes) {
337
+ const response = await proxy_transport_1.nodeProxyTransport.fetch(seedUrl, {
338
+ method: 'GET',
339
+ headers: {
340
+ Authorization: `Bearer ${token}`,
341
+ Range: `bytes=${range.start}-${range.end}`,
342
+ },
343
+ });
344
+ if (response.status !== 206 || !response.body) {
345
+ const body = await response.text();
346
+ throw new Error(`Seed range download failed: ${response.status} ${body}`);
347
+ }
348
+ const expectedContentRange = `bytes ${range.start}-${range.end}/${fileSize}`;
349
+ if (response.headers.get('content-range') !== expectedContentRange) {
350
+ throw new Error(`Invalid Content-Range for seed: ${response.headers.get('content-range') ?? '<missing>'}`);
351
+ }
352
+ const expectedLength = range.end - range.start + 1;
353
+ let received = 0;
354
+ const source = stream_1.Readable.fromWeb(response.body);
355
+ for await (const value of source) {
356
+ const chunk = Buffer.isBuffer(value) ? value : Buffer.from(value);
357
+ if (received + chunk.byteLength > expectedLength) {
358
+ throw new Error('Seed range response exceeded the requested length');
359
+ }
360
+ await writeExactly(output, chunk, range.start + received);
361
+ received += chunk.byteLength;
362
+ reportBytes(chunk.byteLength);
363
+ }
364
+ if (received !== expectedLength) {
365
+ throw new Error(`Seed range response was truncated: got ${received}, expected ${expectedLength}`);
366
+ }
367
+ }
368
+ async function reconstructSeedFromLocalFiles(options) {
369
+ const expectedSha256 = options.expectedSha256.toLowerCase();
370
+ const signature = await fetchSeedSignature(options.signatureUrl, options.token, expectedSha256);
371
+ const uniqueSources = [...new Set(options.sourcePaths.map((sourcePath) => path_1.default.resolve(sourcePath)))];
372
+ const matches = await findSeedBlockMatches(uniqueSources, signature);
373
+ const ranges = missingSeedRanges(signature, matches);
374
+ const totalDownloadBytes = ranges.reduce((total, range) => total + range.end - range.start + 1, 0);
375
+ let downloadedBytes = 0;
376
+ options.onProgress?.(0, totalDownloadBytes);
377
+ await fs_1.default.promises.mkdir(path_1.default.dirname(options.outputPath), { recursive: true });
378
+ const temporaryPath = `${options.outputPath}.reconstruct-${process.pid}-${crypto_1.default
379
+ .randomBytes(6)
380
+ .toString('hex')}`;
381
+ const output = await fs_1.default.promises.open(temporaryPath, 'wx');
382
+ let outputClosed = false;
383
+ let installed = false;
384
+ try {
385
+ await output.truncate(signature.fileSize);
386
+ await copyMatchedBlocks(output, signature, matches);
387
+ for (const range of ranges) {
388
+ await downloadRange(options.seedUrl, options.token, range, signature.fileSize, output, (bytes) => {
389
+ downloadedBytes += bytes;
390
+ options.onProgress?.(downloadedBytes, totalDownloadBytes);
391
+ });
392
+ }
393
+ await output.close();
394
+ outputClosed = true;
395
+ const actualSha256 = await sha256FileHex(temporaryPath);
396
+ if (actualSha256 !== expectedSha256) {
397
+ throw new Error(`Reconstructed seed SHA-256 mismatch: got ${actualSha256}, expected ${expectedSha256}`);
398
+ }
399
+ await fs_1.default.promises.rm(options.outputPath, { force: true });
400
+ await fs_1.default.promises.rename(temporaryPath, options.outputPath);
401
+ installed = true;
402
+ }
403
+ finally {
404
+ if (!outputClosed) {
405
+ await output.close().catch(() => undefined);
406
+ }
407
+ if (!installed) {
408
+ await fs_1.default.promises.rm(temporaryPath, { force: true });
409
+ }
410
+ }
411
+ return { downloadedBytes, totalDownloadBytes, matchedBlocks: matches.size };
412
+ }
413
+ //# sourceMappingURL=seed-reconstruct.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed-reconstruct.js","sourceRoot":"","sources":["../src/internal/seed-reconstruct.ts"],"names":[],"mappings":"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"}