@limrun/api 0.18.2 → 0.19.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 (47) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/LICENSE +1 -1
  3. package/README.md +3 -1
  4. package/folder-sync-watcher.d.mts +17 -0
  5. package/folder-sync-watcher.d.mts.map +1 -0
  6. package/folder-sync-watcher.d.ts +17 -0
  7. package/folder-sync-watcher.d.ts.map +1 -0
  8. package/folder-sync-watcher.js +91 -0
  9. package/folder-sync-watcher.js.map +1 -0
  10. package/folder-sync-watcher.mjs +87 -0
  11. package/folder-sync-watcher.mjs.map +1 -0
  12. package/folder-sync.d.mts +23 -0
  13. package/folder-sync.d.mts.map +1 -0
  14. package/folder-sync.d.ts +23 -0
  15. package/folder-sync.d.ts.map +1 -0
  16. package/folder-sync.js +447 -0
  17. package/folder-sync.js.map +1 -0
  18. package/folder-sync.mjs +442 -0
  19. package/folder-sync.mjs.map +1 -0
  20. package/ios-client.d.mts +96 -0
  21. package/ios-client.d.mts.map +1 -1
  22. package/ios-client.d.ts +96 -0
  23. package/ios-client.d.ts.map +1 -1
  24. package/ios-client.js +89 -1
  25. package/ios-client.js.map +1 -1
  26. package/ios-client.mjs +89 -1
  27. package/ios-client.mjs.map +1 -1
  28. package/package.json +21 -1
  29. package/resources/android-instances.d.mts +2 -2
  30. package/resources/android-instances.d.ts +2 -2
  31. package/resources/assets.d.mts +9 -0
  32. package/resources/assets.d.mts.map +1 -1
  33. package/resources/assets.d.ts +9 -0
  34. package/resources/assets.d.ts.map +1 -1
  35. package/resources/ios-instances.d.mts +2 -2
  36. package/resources/ios-instances.d.ts +2 -2
  37. package/src/folder-sync-watcher.ts +99 -0
  38. package/src/folder-sync.ts +557 -0
  39. package/src/ios-client.ts +221 -4
  40. package/src/resources/android-instances.ts +2 -2
  41. package/src/resources/assets.ts +11 -0
  42. package/src/resources/ios-instances.ts +2 -2
  43. package/src/version.ts +1 -1
  44. package/version.d.mts +1 -1
  45. package/version.d.ts +1 -1
  46. package/version.js +1 -1
  47. package/version.mjs +1 -1
package/folder-sync.js ADDED
@@ -0,0 +1,447 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.syncApp = syncApp;
4
+ exports.syncFolder = syncFolder;
5
+ const tslib_1 = require("./internal/tslib.js");
6
+ const fs_1 = tslib_1.__importDefault(require("fs"));
7
+ const path_1 = tslib_1.__importDefault(require("path"));
8
+ const os_1 = tslib_1.__importDefault(require("os"));
9
+ const crypto_1 = tslib_1.__importDefault(require("crypto"));
10
+ const child_process_1 = require("child_process");
11
+ const folder_sync_watcher_1 = require("./folder-sync-watcher.js");
12
+ const stream_1 = require("stream");
13
+ const zlib = tslib_1.__importStar(require("zlib"));
14
+ const noopLogger = (_level, _msg) => {
15
+ // Intentionally empty: callers (e.g. ios-client.ts) should provide their own logger
16
+ // to control verbosity and integrate with the SDK's logging setup.
17
+ };
18
+ function nowMs() {
19
+ return Date.now();
20
+ }
21
+ function fmtMs(ms) {
22
+ if (ms < 1000)
23
+ return `${ms.toFixed(0)}ms`;
24
+ return `${(ms / 1000).toFixed(2)}s`;
25
+ }
26
+ function fmtBytes(bytes) {
27
+ if (bytes < 1024)
28
+ return `${bytes}B`;
29
+ const kib = bytes / 1024;
30
+ if (kib < 1024)
31
+ return `${kib.toFixed(1)}KiB`;
32
+ const mib = kib / 1024;
33
+ if (mib < 1024)
34
+ return `${mib.toFixed(1)}MiB`;
35
+ const gib = mib / 1024;
36
+ return `${gib.toFixed(2)}GiB`;
37
+ }
38
+ function genId(prefix) {
39
+ return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2)}`;
40
+ }
41
+ function isENOENT(err) {
42
+ const e = err;
43
+ return e?.code === 'ENOENT' || e?.cause?.code === 'ENOENT';
44
+ }
45
+ function concurrencyLimit() {
46
+ // min(4, max(1, cpuCount-1))
47
+ const cpu = os_1.default.cpus()?.length ?? 1;
48
+ return Math.min(4, Math.max(1, cpu - 1));
49
+ }
50
+ async function mapLimit(items, limit, fn) {
51
+ const results = new Array(items.length);
52
+ let idx = 0;
53
+ const workers = new Array(Math.min(limit, items.length)).fill(0).map(async () => {
54
+ while (true) {
55
+ const my = idx++;
56
+ if (my >= items.length)
57
+ return;
58
+ const item = items[my];
59
+ results[my] = await fn(item);
60
+ }
61
+ });
62
+ await Promise.all(workers);
63
+ return results;
64
+ }
65
+ function folderSyncHttpUrl(apiUrl) {
66
+ return `${apiUrl}/folder-sync`;
67
+ }
68
+ function u32be(n) {
69
+ const b = Buffer.allocUnsafe(4);
70
+ b.writeUInt32BE(n >>> 0, 0);
71
+ return b;
72
+ }
73
+ async function httpFolderSyncBatch(opts, meta, payloadFiles, compression) {
74
+ const url = folderSyncHttpUrl(opts.apiUrl);
75
+ const headers = {
76
+ // OpenAPI route expects application/octet-stream.
77
+ 'Content-Type': 'application/octet-stream',
78
+ Authorization: `Bearer ${opts.token}`,
79
+ };
80
+ const metaBytes = Buffer.from(JSON.stringify(meta), 'utf-8');
81
+ const head = Buffer.concat([u32be(metaBytes.length), metaBytes]);
82
+ async function* gen() {
83
+ yield head;
84
+ for (const p of payloadFiles) {
85
+ const fd = await fs_1.default.promises.open(p.filePath, 'r');
86
+ try {
87
+ const st = await fd.stat();
88
+ let offset = 0;
89
+ while (offset < st.size) {
90
+ const len = Math.min(256 * 1024, st.size - offset);
91
+ const buf = Buffer.allocUnsafe(len);
92
+ const { bytesRead } = await fd.read(buf, 0, len, offset);
93
+ if (bytesRead <= 0)
94
+ break;
95
+ offset += bytesRead;
96
+ yield buf.subarray(0, bytesRead);
97
+ }
98
+ }
99
+ finally {
100
+ await fd.close();
101
+ }
102
+ }
103
+ }
104
+ const sourceStream = stream_1.Readable.from(gen());
105
+ let bodyStream;
106
+ if (compression === 'zstd') {
107
+ const createZstd = zlib.createZstdCompress;
108
+ if (!createZstd) {
109
+ throw new Error('zstd compression not available in this Node.js version');
110
+ }
111
+ bodyStream = sourceStream.pipe(createZstd({ level: 3 }));
112
+ headers['Content-Encoding'] = 'zstd';
113
+ }
114
+ else if (compression === 'gzip') {
115
+ const createGzip = zlib.createGzip;
116
+ if (!createGzip) {
117
+ throw new Error('gzip compression not available in this Node.js version');
118
+ }
119
+ bodyStream = sourceStream.pipe(createGzip({ level: 6 }));
120
+ headers['Content-Encoding'] = 'gzip';
121
+ }
122
+ else {
123
+ bodyStream = sourceStream;
124
+ }
125
+ const controller = new AbortController();
126
+ let streamError;
127
+ const onStreamError = (err) => {
128
+ streamError = err;
129
+ controller.abort();
130
+ };
131
+ sourceStream.on('error', onStreamError);
132
+ bodyStream.on('error', onStreamError);
133
+ const res = await fetch(url, {
134
+ method: 'POST',
135
+ headers,
136
+ body: bodyStream,
137
+ duplex: 'half',
138
+ signal: controller.signal,
139
+ }).catch((err) => {
140
+ if (streamError) {
141
+ throw streamError;
142
+ }
143
+ throw err;
144
+ });
145
+ const text = await res.text();
146
+ if (!res.ok) {
147
+ throw new Error(`folder-sync http failed: ${res.status} ${text}`);
148
+ }
149
+ return JSON.parse(text);
150
+ }
151
+ async function sha256FileHex(filePath) {
152
+ return await new Promise((resolve, reject) => {
153
+ const hash = crypto_1.default.createHash('sha256');
154
+ const stream = fs_1.default.createReadStream(filePath);
155
+ stream.on('data', (chunk) => hash.update(chunk));
156
+ stream.on('error', reject);
157
+ stream.on('end', () => resolve(hash.digest('hex')));
158
+ });
159
+ }
160
+ async function walkFiles(root) {
161
+ const out = [];
162
+ const stack = [root];
163
+ const rootResolved = path_1.default.resolve(root);
164
+ while (stack.length) {
165
+ const dir = stack.pop();
166
+ const entries = await fs_1.default.promises.readdir(dir, { withFileTypes: true });
167
+ for (const ent of entries) {
168
+ if (ent.name === '.DS_Store')
169
+ continue;
170
+ const abs = path_1.default.join(dir, ent.name);
171
+ if (ent.isDirectory()) {
172
+ stack.push(abs);
173
+ continue;
174
+ }
175
+ if (!ent.isFile())
176
+ continue;
177
+ const st = await fs_1.default.promises.stat(abs);
178
+ const rel = path_1.default.relative(rootResolved, abs).split(path_1.default.sep).join('/');
179
+ const sha256 = await sha256FileHex(abs);
180
+ // Preserve POSIX permission bits (including +x). Mask out file-type bits.
181
+ const mode = st.mode & 0o7777;
182
+ out.push({ path: rel, size: st.size, sha256, absPath: abs, mode });
183
+ }
184
+ }
185
+ out.sort((a, b) => a.path.localeCompare(b.path));
186
+ return out;
187
+ }
188
+ let xdelta3Ready = null;
189
+ async function ensureXdelta3() {
190
+ if (!xdelta3Ready) {
191
+ xdelta3Ready = new Promise((resolve, reject) => {
192
+ const p = (0, child_process_1.spawn)('xdelta3', ['-V']);
193
+ p.on('error', reject);
194
+ p.on('exit', (code) => {
195
+ if (code === 0)
196
+ resolve();
197
+ else
198
+ reject(new Error(`xdelta3 not available (exit=${code})`));
199
+ });
200
+ });
201
+ }
202
+ return await xdelta3Ready;
203
+ }
204
+ async function runXdelta3Encode(basis, target, outPatch) {
205
+ await new Promise((resolve, reject) => {
206
+ const p = (0, child_process_1.spawn)('xdelta3', ['-e', '-s', basis, target, outPatch], {
207
+ stdio: ['ignore', 'ignore', 'pipe'],
208
+ });
209
+ let stderr = '';
210
+ p.stderr.on('data', (d) => (stderr += d.toString()));
211
+ p.on('error', reject);
212
+ p.on('exit', (code) => {
213
+ if (code === 0)
214
+ resolve();
215
+ else
216
+ reject(new Error(`xdelta3 encode failed (exit=${code}): ${stderr.trim()}`));
217
+ });
218
+ });
219
+ }
220
+ function localBasisCacheRoot(opts, localFolderPath) {
221
+ const hostKey = opts.apiUrl.replace(/[:/]+/g, '_');
222
+ const resolved = path_1.default.resolve(localFolderPath);
223
+ const base = path_1.default.basename(resolved);
224
+ const hash = crypto_1.default.createHash('sha1').update(resolved).digest('hex').slice(0, 8);
225
+ // Include folder identity to avoid collisions between different roots.
226
+ return path_1.default.join(os_1.default.homedir(), '.cache', 'limulator', 'folder-sync', hostKey, opts.udid, `${base}-${hash}`);
227
+ }
228
+ async function cachePut(cacheRoot, relPath, srcFile) {
229
+ const dst = path_1.default.join(cacheRoot, relPath.split('/').join(path_1.default.sep));
230
+ await fs_1.default.promises.mkdir(path_1.default.dirname(dst), { recursive: true });
231
+ await fs_1.default.promises.copyFile(srcFile, dst);
232
+ }
233
+ function cacheGet(cacheRoot, relPath) {
234
+ return path_1.default.join(cacheRoot, relPath.split('/').join(path_1.default.sep));
235
+ }
236
+ async function syncApp(localFolderPath, opts) {
237
+ if (!opts.watch) {
238
+ return await syncFolderOnce(localFolderPath, opts);
239
+ }
240
+ // Initial sync, then watch for changes and re-run sync in the background.
241
+ const first = await syncFolderOnce(localFolderPath, opts, 'startup');
242
+ let inFlight = false;
243
+ let queued = false;
244
+ const run = async (reason) => {
245
+ if (inFlight) {
246
+ queued = true;
247
+ return;
248
+ }
249
+ inFlight = true;
250
+ try {
251
+ await syncFolderOnce(localFolderPath, opts, reason);
252
+ }
253
+ finally {
254
+ inFlight = false;
255
+ if (queued) {
256
+ queued = false;
257
+ void run('queued-changes');
258
+ }
259
+ }
260
+ };
261
+ const watcherLog = (level, msg) => {
262
+ (opts.log ?? noopLogger)(level, `syncApp: ${msg}`);
263
+ };
264
+ const watcher = await (0, folder_sync_watcher_1.watchFolderTree)({
265
+ rootPath: localFolderPath,
266
+ log: watcherLog,
267
+ onChange: (reason) => {
268
+ void run(reason);
269
+ },
270
+ });
271
+ return {
272
+ ...first,
273
+ stopWatching: () => {
274
+ watcher.close();
275
+ },
276
+ };
277
+ }
278
+ // Back-compat alias (older callers)
279
+ async function syncFolder(localFolderPath, opts) {
280
+ return await syncApp(localFolderPath, opts);
281
+ }
282
+ async function syncFolderOnce(localFolderPath, opts, reason, attempt = 0) {
283
+ const totalStart = nowMs();
284
+ const log = opts.log ?? noopLogger;
285
+ const slog = (level, msg) => log(level, `syncApp: ${msg}`);
286
+ const maxPatchBytes = opts.maxPatchBytes ?? 4 * 1024 * 1024;
287
+ const tEnsureStart = nowMs();
288
+ await ensureXdelta3();
289
+ const tEnsureMs = nowMs() - tEnsureStart;
290
+ const tWalkStart = nowMs();
291
+ const files = await walkFiles(localFolderPath);
292
+ const tWalkMs = nowMs() - tWalkStart;
293
+ const fileMap = new Map(files.map((f) => [f.path, f]));
294
+ const syncId = genId('sync');
295
+ const rootName = path_1.default.basename(path_1.default.resolve(localFolderPath));
296
+ const preferredCompression = zlib.createZstdCompress ? 'zstd' : 'gzip';
297
+ const cacheRoot = localBasisCacheRoot(opts, localFolderPath);
298
+ await fs_1.default.promises.mkdir(cacheRoot, { recursive: true });
299
+ // Track how many bytes we actually transmit to the server (single HTTP request).
300
+ let bytesSentFull = 0;
301
+ let bytesSentDelta = 0;
302
+ let httpSendMsTotal = 0;
303
+ let deltaEncodeMsTotal = 0;
304
+ // Build payload list by comparing against local basis cache (single-flight/watch assumes server matches cache).
305
+ const encodeLimit = concurrencyLimit();
306
+ const changed = [];
307
+ for (const f of files) {
308
+ const basisPath = cacheGet(cacheRoot, f.path);
309
+ if (!fs_1.default.existsSync(basisPath)) {
310
+ changed.push(f);
311
+ continue;
312
+ }
313
+ const basisSha = await sha256FileHex(basisPath);
314
+ if (basisSha !== f.sha256.toLowerCase()) {
315
+ changed.push(f);
316
+ }
317
+ }
318
+ const encodedPayloads = await mapLimit(changed, encodeLimit, async (f) => {
319
+ const basisPath = cacheGet(cacheRoot, f.path);
320
+ if (fs_1.default.existsSync(basisPath)) {
321
+ const basisSha = await sha256FileHex(basisPath);
322
+ const tmpDir = await fs_1.default.promises.mkdtemp(path_1.default.join(os_1.default.tmpdir(), 'limulator-xdelta3-'));
323
+ const patchPath = path_1.default.join(tmpDir, 'patch.xdelta3');
324
+ const encodeStart = nowMs();
325
+ await runXdelta3Encode(basisPath, f.absPath, patchPath);
326
+ const encodeMs = nowMs() - encodeStart;
327
+ deltaEncodeMsTotal += encodeMs;
328
+ const st = await fs_1.default.promises.stat(patchPath);
329
+ if (st.size <= maxPatchBytes) {
330
+ slog('debug', `delta(file): ${path_1.default.posix.basename(f.path)} patchSize=${st.size} encode=${fmtMs(encodeMs)}`);
331
+ bytesSentDelta += st.size;
332
+ return {
333
+ payload: {
334
+ kind: 'delta',
335
+ path: f.path,
336
+ basisSha256: basisSha.toLowerCase(),
337
+ targetSha256: f.sha256.toLowerCase(),
338
+ length: st.size,
339
+ },
340
+ filePath: patchPath,
341
+ cleanupDir: tmpDir,
342
+ };
343
+ }
344
+ // Patch too big, fall back to full
345
+ try {
346
+ await fs_1.default.promises.rm(tmpDir, { recursive: true, force: true });
347
+ }
348
+ catch {
349
+ // ignore
350
+ }
351
+ }
352
+ slog('debug', `full(file): ${f.path} size=${f.size}`);
353
+ bytesSentFull += f.size;
354
+ return {
355
+ payload: { kind: 'full', path: f.path, targetSha256: f.sha256.toLowerCase(), length: f.size },
356
+ filePath: f.absPath,
357
+ };
358
+ });
359
+ const meta = {
360
+ id: syncId,
361
+ rootName,
362
+ install: opts.install ?? true,
363
+ ...(opts.launchMode ? { launchMode: opts.launchMode } : {}),
364
+ files: files.map((f) => ({ path: f.path, size: f.size, sha256: f.sha256.toLowerCase(), mode: f.mode })),
365
+ payloads: encodedPayloads.map((p) => p.payload),
366
+ };
367
+ const hasDelta = encodedPayloads.some((p) => p.payload.kind === 'delta');
368
+ const compression = hasDelta ? 'identity' : preferredCompression;
369
+ slog('info', `sync started files=${files.length}${reason ? ` reason=${reason}` : ''} compression=${compression}`);
370
+ const sendStart = nowMs();
371
+ let resp;
372
+ try {
373
+ resp = await httpFolderSyncBatch(opts, meta, encodedPayloads.map((p) => ({ filePath: p.filePath })), compression);
374
+ }
375
+ catch (err) {
376
+ if (attempt < 1 && isENOENT(err)) {
377
+ slog('warn', `sync retrying after missing file during upload (ENOENT)`);
378
+ return await syncFolderOnce(localFolderPath, opts, reason, attempt + 1);
379
+ }
380
+ throw err;
381
+ }
382
+ httpSendMsTotal += nowMs() - sendStart;
383
+ // Retry once if server needs full for some paths (basis mismatch).
384
+ if (!resp.ok && resp.needFull && resp.needFull.length > 0) {
385
+ const need = new Set(resp.needFull);
386
+ const retryPayloads = [];
387
+ for (const p of need) {
388
+ const entry = fileMap.get(p);
389
+ if (!entry)
390
+ continue;
391
+ retryPayloads.push({
392
+ payload: {
393
+ kind: 'full',
394
+ path: entry.path,
395
+ targetSha256: entry.sha256.toLowerCase(),
396
+ length: entry.size,
397
+ },
398
+ filePath: entry.absPath,
399
+ });
400
+ }
401
+ if (retryPayloads.length > 0) {
402
+ slog('warn', `server requested full for ${retryPayloads.length} files; retrying once`);
403
+ const retryMeta = {
404
+ ...meta,
405
+ id: genId('sync'),
406
+ payloads: retryPayloads.map((p) => p.payload),
407
+ };
408
+ const retryStart = nowMs();
409
+ resp = await httpFolderSyncBatch(opts, retryMeta, retryPayloads.map((p) => ({ filePath: p.filePath })), preferredCompression);
410
+ httpSendMsTotal += nowMs() - retryStart;
411
+ }
412
+ }
413
+ // Cleanup patch temp dirs
414
+ await Promise.all(encodedPayloads.map(async (p) => {
415
+ if (!p.cleanupDir)
416
+ return;
417
+ try {
418
+ await fs_1.default.promises.rm(p.cleanupDir, { recursive: true, force: true });
419
+ }
420
+ catch {
421
+ // ignore
422
+ }
423
+ }));
424
+ // Sync work includes: local hashing + planning + transfers (but excludes finalize/install wait).
425
+ const syncWorkMs = nowMs() - totalStart;
426
+ if (!resp.ok) {
427
+ throw new Error(resp.error ?? 'sync failed');
428
+ }
429
+ const tookMs = nowMs() - totalStart;
430
+ const totalBytes = bytesSentFull + bytesSentDelta;
431
+ slog('info', `sync finished files=${files.length} sent=${fmtBytes(totalBytes)} syncWork=${fmtMs(syncWorkMs)} total=${fmtMs(tookMs)}`);
432
+ slog('debug', `sync bytes full=${fmtBytes(bytesSentFull)} delta=${fmtBytes(bytesSentDelta)}`);
433
+ slog('debug', `timing ensureXdelta3=${fmtMs(tEnsureMs)} walk=${fmtMs(tWalkMs)} httpSend=${fmtMs(httpSendMsTotal)} deltaEncode=${fmtMs(deltaEncodeMsTotal)}`);
434
+ const out = {};
435
+ if (resp.installedAppPath) {
436
+ out.installedAppPath = resp.installedAppPath;
437
+ }
438
+ if (resp.bundleId) {
439
+ out.installedBundleId = resp.bundleId;
440
+ }
441
+ // Update local cache optimistically: after a successful sync, cache reflects current local tree.
442
+ for (const f of files) {
443
+ await cachePut(cacheRoot, f.path, f.absPath);
444
+ }
445
+ return out;
446
+ }
447
+ //# sourceMappingURL=folder-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folder-sync.js","sourceRoot":"","sources":["src/folder-sync.ts"],"names":[],"mappings":"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"}