lim 0.29.0 → 0.29.2

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 (57) hide show
  1. package/README.md +9 -4
  2. package/dist/commands/android/adb-shell.d.ts +19 -0
  3. package/dist/commands/android/adb-shell.d.ts.map +1 -0
  4. package/dist/commands/android/adb-shell.js +68 -0
  5. package/dist/commands/android/adb-shell.js.map +1 -0
  6. package/dist/commands/android/camera.d.ts +22 -0
  7. package/dist/commands/android/camera.d.ts.map +1 -0
  8. package/dist/commands/android/camera.js +83 -0
  9. package/dist/commands/android/camera.js.map +1 -0
  10. package/dist/commands/android/create.d.ts +2 -0
  11. package/dist/commands/android/create.d.ts.map +1 -1
  12. package/dist/commands/android/create.js +29 -6
  13. package/dist/commands/android/create.js.map +1 -1
  14. package/dist/commands/android/pull-file.d.ts +21 -0
  15. package/dist/commands/android/pull-file.d.ts.map +1 -0
  16. package/dist/commands/android/pull-file.js +67 -0
  17. package/dist/commands/android/pull-file.js.map +1 -0
  18. package/dist/commands/android/push-file.d.ts +21 -0
  19. package/dist/commands/android/push-file.d.ts.map +1 -0
  20. package/dist/commands/android/push-file.js +64 -0
  21. package/dist/commands/android/push-file.js.map +1 -0
  22. package/dist/commands/ios/create.d.ts +1 -0
  23. package/dist/commands/ios/create.d.ts.map +1 -1
  24. package/dist/commands/ios/create.js +20 -5
  25. package/dist/commands/ios/create.js.map +1 -1
  26. package/dist/commands/ios/tunnel/index.d.ts +29 -0
  27. package/dist/commands/ios/tunnel/index.d.ts.map +1 -0
  28. package/dist/commands/ios/tunnel/index.js +302 -0
  29. package/dist/commands/ios/tunnel/index.js.map +1 -0
  30. package/dist/commands/ios/tunnel/status.d.ts +17 -0
  31. package/dist/commands/ios/tunnel/status.d.ts.map +1 -0
  32. package/dist/commands/ios/tunnel/status.js +79 -0
  33. package/dist/commands/ios/tunnel/status.js.map +1 -0
  34. package/dist/commands/ios/tunnel/stop.d.ts +21 -0
  35. package/dist/commands/ios/tunnel/stop.d.ts.map +1 -0
  36. package/dist/commands/ios/tunnel/stop.js +148 -0
  37. package/dist/commands/ios/tunnel/stop.js.map +1 -0
  38. package/dist/commands/xcode/build.d.ts +2 -0
  39. package/dist/commands/xcode/build.d.ts.map +1 -1
  40. package/dist/commands/xcode/build.js +47 -2
  41. package/dist/commands/xcode/build.js.map +1 -1
  42. package/dist/commands/xcode/run.d.ts.map +1 -1
  43. package/dist/commands/xcode/run.js +10 -18
  44. package/dist/commands/xcode/run.js.map +1 -1
  45. package/dist/lib/env-entries.d.ts +9 -0
  46. package/dist/lib/env-entries.d.ts.map +1 -0
  47. package/dist/lib/env-entries.js +26 -0
  48. package/dist/lib/env-entries.js.map +1 -0
  49. package/dist/lib/ios-tunnel-process.d.ts +70 -0
  50. package/dist/lib/ios-tunnel-process.d.ts.map +1 -0
  51. package/dist/lib/ios-tunnel-process.js +502 -0
  52. package/dist/lib/ios-tunnel-process.js.map +1 -0
  53. package/dist/lib/ios-tunnel-process.test.d.ts +2 -0
  54. package/dist/lib/ios-tunnel-process.test.d.ts.map +1 -0
  55. package/dist/lib/ios-tunnel-process.test.js +339 -0
  56. package/dist/lib/ios-tunnel-process.test.js.map +1 -0
  57. package/package.json +3 -3
@@ -0,0 +1,339 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const child_process_1 = require("child_process");
7
+ const crypto_1 = __importDefault(require("crypto"));
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const os_1 = __importDefault(require("os"));
10
+ const path_1 = __importDefault(require("path"));
11
+ const ios_tunnel_process_1 = require("./ios-tunnel-process");
12
+ const INSTANCE_ID = 'ios_test_123';
13
+ const OWNER_1 = '1'.repeat(32);
14
+ const OWNER_2 = '2'.repeat(32);
15
+ const OWNER_3 = '3'.repeat(32);
16
+ describe('iOS tunnel process state', () => {
17
+ let root;
18
+ beforeEach(() => {
19
+ root = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'lim-ios-tunnel-'));
20
+ });
21
+ afterEach(() => {
22
+ fs_1.default.rmSync(root, { recursive: true, force: true });
23
+ });
24
+ test.each([
25
+ ['LOCALHOST:3000', { host: 'localhost', port: 3000 }],
26
+ ['10.20.30.40:8000', { host: '10.20.30.40', port: 8000 }],
27
+ ['[2001:db8::1]:8443', { host: '2001:db8::1', port: 8443 }],
28
+ ['[::ffff:192.0.2.1]:9443', { host: '192.0.2.1', port: 9443 }],
29
+ ])('parses route %s', (input, expected) => {
30
+ expect((0, ios_tunnel_process_1.parseTunnelRoute)(input)).toEqual(expected);
31
+ });
32
+ test.each([
33
+ 'localhost.:8000',
34
+ ':8000',
35
+ '10.20.30.40:0',
36
+ '10.20.30.40:53',
37
+ '10.20.30.40:65536',
38
+ '2001:db8::1:443',
39
+ '[::192.0.2.1]:443',
40
+ '[::2]:443',
41
+ ])('rejects malformed route %s', (input) => {
42
+ expect(() => (0, ios_tunnel_process_1.parseTunnelRoute)(input)).toThrow();
43
+ });
44
+ test('builds a child command with an exact owner and IPv6 route', () => {
45
+ const owner = (0, ios_tunnel_process_1.newTunnelOwner)();
46
+ expect((0, ios_tunnel_process_1.buildTunnelServeArgs)({
47
+ scriptPath: '/lim/run.js',
48
+ instanceId: INSTANCE_ID,
49
+ owner,
50
+ routes: [
51
+ { host: '10.20.30.40', port: 8000 },
52
+ { host: '2001:db8::1', port: 8443 },
53
+ ],
54
+ })).toEqual([
55
+ '/lim/run.js',
56
+ 'ios',
57
+ 'tunnel',
58
+ '--serve',
59
+ '--no-create',
60
+ '--id',
61
+ INSTANCE_ID,
62
+ `--tunnel-owner=${owner}`,
63
+ '--route',
64
+ '10.20.30.40:8000',
65
+ '--route',
66
+ '[2001:db8::1]:8443',
67
+ ]);
68
+ });
69
+ test('formats dial failures with every correlation ID', () => {
70
+ expect((0, ios_tunnel_process_1.formatTunnelDialFailure)({
71
+ tunnelId: 'tunnel-1',
72
+ connectionId: 7,
73
+ routeId: 'route-3',
74
+ reason: 'dns_not_found',
75
+ osCode: 'ENOTFOUND',
76
+ })).toBe('Last dial failure: tunnel tunnel-1, connection 7, route-3 (dns_not_found, ENOTFOUND)');
77
+ });
78
+ test('forwards an explicit API key only through the child environment', () => {
79
+ expect((0, ios_tunnel_process_1.tunnelChildEnvironment)('secret', { PATH: '/bin', LIM_API_KEY: 'old' })).toEqual({
80
+ PATH: '/bin',
81
+ LIM_API_KEY: 'secret',
82
+ });
83
+ });
84
+ test('accepts READY written exactly at the parent deadline', async () => {
85
+ let now = 0;
86
+ let reads = 0;
87
+ const ready = makeReadyState();
88
+ await expect((0, ios_tunnel_process_1.waitForTunnelProcessReady)({
89
+ load: () => {
90
+ reads += 1;
91
+ if (reads === 1)
92
+ return makeState({ pid: 123 });
93
+ return ready;
94
+ },
95
+ isAlive: () => true,
96
+ sleep: async (milliseconds) => {
97
+ now += milliseconds;
98
+ },
99
+ now: () => now,
100
+ timeoutMs: 100,
101
+ pollMs: 100,
102
+ })).resolves.toEqual({ outcome: 'ready', state: ready });
103
+ });
104
+ test('does not accept stale READY from an exited child', async () => {
105
+ const ready = makeReadyState();
106
+ await expect((0, ios_tunnel_process_1.waitForTunnelProcessReady)({
107
+ load: () => ready,
108
+ isAlive: () => false,
109
+ sleep: async () => { },
110
+ })).resolves.toEqual({ outcome: 'exited' });
111
+ });
112
+ test('does not mistake a reused PID for the spawned child', () => {
113
+ expect((0, ios_tunnel_process_1.isSpawnedTunnelProcessAlive)({ exitCode: 0, signalCode: null }, process.pid)).toBe(false);
114
+ expect((0, ios_tunnel_process_1.isSpawnedTunnelProcessAlive)({ exitCode: null, signalCode: null }, process.pid)).toBe(true);
115
+ });
116
+ test('selects only owners correlated with the fetched server tunnel ID', () => {
117
+ const oldOwner = makeReadyState({
118
+ owner: OWNER_1,
119
+ tunnelId: 'old-tunnel',
120
+ });
121
+ const replacement = makeReadyState({
122
+ owner: OWNER_2,
123
+ tunnelId: 'replacement',
124
+ });
125
+ const starting = makeState({ owner: OWNER_3, pid: 456 });
126
+ expect((0, ios_tunnel_process_1.selectTunnelOwnersForStop)([oldOwner, replacement, starting], 'old-tunnel')).toEqual([
127
+ oldOwner,
128
+ starting,
129
+ ]);
130
+ expect((0, ios_tunnel_process_1.selectTunnelOwnersForStop)([oldOwner, replacement, starting], undefined)).toEqual([
131
+ oldOwner,
132
+ replacement,
133
+ starting,
134
+ ]);
135
+ });
136
+ test('keeps a selected starting owner targeted if it becomes ready during stop', () => {
137
+ const starting = makeState({ owner: OWNER_1, pid: 456 });
138
+ const replacement = makeReadyState({
139
+ owner: OWNER_1,
140
+ pid: 456,
141
+ tunnelId: 'replacement',
142
+ });
143
+ expect((0, ios_tunnel_process_1.tunnelOwnerRemainsSelectedForStop)(starting, replacement, 'old-tunnel')).toBe(true);
144
+ expect((0, ios_tunnel_process_1.tunnelOwnerRemainsSelectedForStop)(makeReadyState({ owner: OWNER_1, tunnelId: 'old-tunnel' }), replacement, 'old-tunnel')).toBe(false);
145
+ });
146
+ test('observes a disconnect that happened before subscription', () => {
147
+ const unsubscribe = jest.fn();
148
+ const onDisconnect = jest.fn();
149
+ const dispose = (0, ios_tunnel_process_1.subscribeTunnelDisconnect)({
150
+ getConnectionState: () => 'disconnected',
151
+ onConnectionStateChange: () => unsubscribe,
152
+ }, onDisconnect);
153
+ expect(onDisconnect).toHaveBeenCalledTimes(1);
154
+ expect(unsubscribe).toHaveBeenCalledTimes(1);
155
+ dispose();
156
+ });
157
+ test('classifies only the stable stop 404 error as already gone', () => {
158
+ expect((0, ios_tunnel_process_1.stopTunnelErrorIsNotFound)(new Error('stopTunnel failed: 404 missing'))).toBe(true);
159
+ expect((0, ios_tunnel_process_1.stopTunnelErrorIsNotFound)(new Error('stopTunnel failed: 500 broken'))).toBe(false);
160
+ });
161
+ test('keeps each owner state isolated through update and clear', () => {
162
+ const state = makeState({ owner: OWNER_1, pid: process.pid, status: 'starting' });
163
+ expect((0, ios_tunnel_process_1.claimTunnelProcess)(state, root)).toBe(true);
164
+ expect((0, ios_tunnel_process_1.claimTunnelProcess)(makeState({ owner: OWNER_2 }), root)).toBe(true);
165
+ expect((0, ios_tunnel_process_1.listTunnelProcesses)(INSTANCE_ID, root)).toHaveLength(2);
166
+ const ready = makeState({
167
+ owner: OWNER_1,
168
+ pid: process.pid,
169
+ status: 'ready',
170
+ tunnelId: 'tunnel-1',
171
+ });
172
+ (0, ios_tunnel_process_1.updateTunnelProcess)(ready, OWNER_1, root);
173
+ expect((0, ios_tunnel_process_1.loadTunnelProcess)(INSTANCE_ID, OWNER_1, root)).toEqual(ready);
174
+ expect(() => (0, ios_tunnel_process_1.updateTunnelProcess)(ready, OWNER_2, root)).toThrow('Tunnel process ownership changed during startup');
175
+ expect((0, ios_tunnel_process_1.clearTunnelProcess)(INSTANCE_ID, OWNER_2, root)).toBe(true);
176
+ expect((0, ios_tunnel_process_1.loadTunnelProcess)(INSTANCE_ID, OWNER_1, root)).toEqual(ready);
177
+ expect((0, ios_tunnel_process_1.clearTunnelProcess)(INSTANCE_ID, OWNER_1, root)).toBe(true);
178
+ expect((0, ios_tunnel_process_1.listTunnelProcesses)(INSTANCE_ID, root)).toEqual([]);
179
+ });
180
+ test('keeps expired ownership visible for process cleanup', () => {
181
+ const now = Date.now();
182
+ const abandoned = makeState({
183
+ owner: OWNER_1,
184
+ pid: process.pid,
185
+ status: 'starting',
186
+ startedAt: new Date(now - 30000).toISOString(),
187
+ });
188
+ expect((0, ios_tunnel_process_1.claimTunnelProcess)(abandoned, root)).toBe(true);
189
+ expect((0, ios_tunnel_process_1.loadTunnelProcess)(abandoned.instanceId, OWNER_1, root)).toEqual(abandoned);
190
+ expect((0, ios_tunnel_process_1.tunnelProcessStartingLeaseExpired)(abandoned, now)).toBe(true);
191
+ expect((0, ios_tunnel_process_1.tunnelProcessStartingLeaseExpired)({ ...abandoned, startedAt: new Date(now - 29999).toISOString() }, now)).toBe(false);
192
+ const replacement = makeState({ owner: OWNER_2, pid: 0, status: 'starting' });
193
+ expect((0, ios_tunnel_process_1.claimTunnelProcess)(replacement, root)).toBe(true);
194
+ expect((0, ios_tunnel_process_1.listTunnelProcesses)(INSTANCE_ID, root)
195
+ .map((state) => state.owner)
196
+ .sort()).toEqual([OWNER_1, OWNER_2]);
197
+ });
198
+ test('does not overwrite the same owner claim', () => {
199
+ expect((0, ios_tunnel_process_1.claimTunnelProcess)(makeState({ owner: OWNER_1, pid: 0 }), root)).toBe(true);
200
+ expect((0, ios_tunnel_process_1.claimTunnelProcess)(makeState({ owner: OWNER_1, pid: 0 }), root)).toBe(false);
201
+ });
202
+ test('cannot update or reclaim an owner after cleanup starts', () => {
203
+ const starting = makeState({ owner: OWNER_1, pid: 0 });
204
+ expect((0, ios_tunnel_process_1.claimTunnelProcess)(starting, root)).toBe(true);
205
+ expect((0, ios_tunnel_process_1.clearTunnelProcess)(INSTANCE_ID, OWNER_1, root)).toBe(true);
206
+ expect((0, ios_tunnel_process_1.clearTunnelProcess)(INSTANCE_ID, OWNER_1, root)).toBe(true);
207
+ expect(() => (0, ios_tunnel_process_1.updateTunnelProcess)(makeReadyState({ owner: OWNER_1, pid: 123 }), OWNER_1, root)).toThrow('Tunnel process ownership changed during startup');
208
+ expect((0, ios_tunnel_process_1.claimTunnelProcess)(starting, root)).toBe(false);
209
+ expect((0, ios_tunnel_process_1.loadTunnelProcess)(INSTANCE_ID, OWNER_1, root)).toBeUndefined();
210
+ });
211
+ test('verifies process identity before treating a PID as the owner', async () => {
212
+ const owner = crypto_1.default.randomBytes(16).toString('hex');
213
+ const child = (0, child_process_1.spawn)(process.execPath, ['-e', 'setInterval(() => {}, 1000)', '--', `--tunnel-owner=${owner}`], { stdio: 'ignore' });
214
+ const pid = child.pid;
215
+ if (!pid)
216
+ throw new Error('child process did not start');
217
+ const state = makeState({ owner, pid, status: 'starting' });
218
+ try {
219
+ expect((0, ios_tunnel_process_1.claimTunnelProcess)(state, root)).toBe(true);
220
+ await waitFor(() => (0, ios_tunnel_process_1.tunnelOwnerProcessIdentity)(state) === 'match');
221
+ expect((0, ios_tunnel_process_1.tunnelOwnerProcessIdentity)({ ...state, owner: OWNER_1 })).toBe('mismatch');
222
+ expect((0, ios_tunnel_process_1.signalTunnelOwner)({ ...state, owner: OWNER_1 }, 'SIGTERM')).toBe('mismatch');
223
+ expect((0, ios_tunnel_process_1.clearTunnelProcess)(state.instanceId, owner, root)).toBe(false);
224
+ const exited = new Promise((resolve) => child.once('exit', () => resolve()));
225
+ expect((0, ios_tunnel_process_1.signalTunnelOwner)(state, 'SIGKILL')).toBe('signaled');
226
+ await exited;
227
+ }
228
+ finally {
229
+ if (child.exitCode === null && child.signalCode === null) {
230
+ const exited = new Promise((resolve) => child.once('exit', () => resolve()));
231
+ child.kill('SIGKILL');
232
+ await exited;
233
+ }
234
+ }
235
+ expect((0, ios_tunnel_process_1.clearTunnelProcess)(state.instanceId, owner, root)).toBe(true);
236
+ });
237
+ test.each([
238
+ { startedAt: new Date(Date.now() + 120000).toISOString() },
239
+ { startedAt: 123 },
240
+ { startedAt: new Date().toUTCString() },
241
+ { logPath: '/tmp/attacker.log' },
242
+ { tunnelId: 'premature' },
243
+ { status: 'ready', pid: 0 },
244
+ { routes: [{ host: '*.example.com', port: 443 }] },
245
+ { routes: [{ host: 'LOCALHOST', port: 3000 }] },
246
+ { routes: [{ host: '10.20.30.40', port: 53 }] },
247
+ { routes: [{ host: '::2', port: 443 }] },
248
+ {
249
+ routes: [
250
+ { host: 'localhost', port: 3000 },
251
+ { host: 'localhost', port: 3000 },
252
+ ],
253
+ },
254
+ ])('rejects malformed persisted state %#', (overrides) => {
255
+ const state = overrides.status === 'ready' ? makeReadyState(overrides) : makeState(overrides);
256
+ const paths = (0, ios_tunnel_process_1.tunnelProcessPaths)(state.instanceId, state.owner, root);
257
+ fs_1.default.mkdirSync(paths.directory, { recursive: true });
258
+ fs_1.default.writeFileSync(paths.state, JSON.stringify(state));
259
+ expect((0, ios_tunnel_process_1.loadTunnelProcess)(state.instanceId, state.owner, root)).toBeUndefined();
260
+ });
261
+ test('uses a bounded hashed path and reads the log tail', () => {
262
+ const paths = (0, ios_tunnel_process_1.tunnelProcessPaths)('ios_region_secret-customer-id', OWNER_1, root);
263
+ expect(paths.directory).not.toContain('secret-customer-id');
264
+ fs_1.default.mkdirSync(paths.directory, { recursive: true });
265
+ fs_1.default.writeFileSync(paths.log, `${'x'.repeat(128 * 1024)}\none\ntwo\nthree\n`);
266
+ expect((0, ios_tunnel_process_1.readTunnelLogTail)(paths.log, 2, 64 * 1024)).toBe('two\nthree');
267
+ });
268
+ test('rotates an oversized retained log', () => {
269
+ const paths = (0, ios_tunnel_process_1.tunnelProcessPaths)(INSTANCE_ID, OWNER_1, root);
270
+ fs_1.default.mkdirSync(paths.directory, { recursive: true });
271
+ fs_1.default.writeFileSync(paths.log, 'old log');
272
+ fs_1.default.closeSync((0, ios_tunnel_process_1.prepareTunnelLog)(paths.log, 1));
273
+ expect(fs_1.default.readFileSync(`${paths.log}.1`, 'utf8')).toBe('g');
274
+ expect(fs_1.default.readFileSync(paths.log, 'utf8')).toBe('');
275
+ });
276
+ test('caps a log while its append descriptor remains open', () => {
277
+ const paths = (0, ios_tunnel_process_1.tunnelProcessPaths)(INSTANCE_ID, OWNER_1, root);
278
+ const descriptor = (0, ios_tunnel_process_1.prepareTunnelLog)(paths.log, 1024);
279
+ fs_1.default.writeSync(descriptor, 'old log');
280
+ expect((0, ios_tunnel_process_1.capTunnelLog)(paths.log, 4)).toBe(true);
281
+ fs_1.default.writeSync(descriptor, 'new');
282
+ fs_1.default.closeSync(descriptor);
283
+ expect(fs_1.default.readFileSync(`${paths.log}.1`, 'utf8')).toBe(' log');
284
+ expect(fs_1.default.readFileSync(paths.log, 'utf8')).toBe('new');
285
+ });
286
+ test('retains only the newest completed tunnel logs', () => {
287
+ const retiredOwners = [OWNER_1, OWNER_2, OWNER_3];
288
+ for (const [index, owner] of retiredOwners.entries()) {
289
+ const paths = (0, ios_tunnel_process_1.tunnelProcessPaths)(INSTANCE_ID, owner, root);
290
+ fs_1.default.mkdirSync(paths.directory, { recursive: true });
291
+ fs_1.default.writeFileSync(paths.log, owner);
292
+ const modified = new Date(Date.now() + (index + 1) * 1000);
293
+ fs_1.default.utimesSync(paths.log, modified, modified);
294
+ }
295
+ const oldestPaths = (0, ios_tunnel_process_1.tunnelProcessPaths)(INSTANCE_ID, OWNER_1, root);
296
+ fs_1.default.writeFileSync(`${oldestPaths.log}.1`, 'rotated');
297
+ const activeOwner = '4'.repeat(32);
298
+ const active = makeState({ owner: activeOwner, pid: process.pid });
299
+ expect((0, ios_tunnel_process_1.claimTunnelProcess)(active, root)).toBe(true);
300
+ fs_1.default.writeFileSync((0, ios_tunnel_process_1.tunnelProcessPaths)(INSTANCE_ID, activeOwner, root).log, 'active');
301
+ (0, ios_tunnel_process_1.pruneTunnelLogs)(INSTANCE_ID, root, 2);
302
+ const directory = (0, ios_tunnel_process_1.tunnelProcessPaths)(INSTANCE_ID, OWNER_1, root).directory;
303
+ expect(fs_1.default
304
+ .readdirSync(directory)
305
+ .filter((entry) => entry.endsWith('.log'))
306
+ .sort()).toEqual([`${OWNER_2}.log`, `${OWNER_3}.log`, `${activeOwner}.log`].sort());
307
+ expect(fs_1.default.existsSync(`${oldestPaths.log}.1`)).toBe(false);
308
+ });
309
+ function makeReadyState(overrides = {}) {
310
+ return makeState({
311
+ pid: 123,
312
+ status: 'ready',
313
+ tunnelId: 'tunnel-1',
314
+ ...overrides,
315
+ });
316
+ }
317
+ function makeState(overrides) {
318
+ const owner = overrides.owner ?? OWNER_1;
319
+ return {
320
+ owner,
321
+ pid: 0,
322
+ instanceId: INSTANCE_ID,
323
+ status: 'starting',
324
+ routes: [{ host: '10.20.30.40', port: 8000 }],
325
+ startedAt: new Date().toISOString(),
326
+ logPath: (0, ios_tunnel_process_1.tunnelProcessPaths)(INSTANCE_ID, owner, root).log,
327
+ ...overrides,
328
+ };
329
+ }
330
+ async function waitFor(predicate) {
331
+ const deadline = Date.now() + 3000;
332
+ while (!predicate()) {
333
+ if (Date.now() >= deadline)
334
+ throw new Error('waitFor timed out');
335
+ await new Promise((resolve) => setTimeout(resolve, 10));
336
+ }
337
+ }
338
+ });
339
+ //# sourceMappingURL=ios-tunnel-process.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ios-tunnel-process.test.js","sourceRoot":"","sources":["../../src/lib/ios-tunnel-process.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lim",
3
- "version": "0.29.0",
3
+ "version": "0.29.2",
4
4
  "description": "Use remote XCode, Gradle, iOS Simulator, Android Emulator and more to build and test apps from Linux, Windows or macOS.",
5
5
  "bin": {
6
6
  "lim": "./bin/run.js"
@@ -25,7 +25,7 @@
25
25
  "test": "jest"
26
26
  },
27
27
  "dependencies": {
28
- "@limrun/api": "^0.46.14",
28
+ "@limrun/api": "^0.48.0",
29
29
  "@oclif/core": "^4",
30
30
  "cli-progress": "^3.12.0",
31
31
  "cli-table3": "^0.6.5",
@@ -66,7 +66,7 @@
66
66
  "description": "Build Android projects on cloud gradle sandboxes"
67
67
  },
68
68
  "ios": {
69
- "description": "Execute any task on remote iOS Simulators: create, list, get, delete, attach-xcode, info, list-apps, launch-app, terminate-app, app-log, syslog, sync, screenshot, tap, tap-element, element-tree, type, press-key, toggle-keyboard, scroll, open-url, install-app, keychain, record, camera, microphone, perform, ls, push-file, pull-file, delete-file, simctl, cp, xcrun, xcodebuild, lsof, reverse"
69
+ "description": "Execute any task on remote iOS Simulators: create, list, get, delete, attach-xcode, info, list-apps, launch-app, terminate-app, app-log, syslog, sync, screenshot, tap, tap-element, element-tree, type, press-key, toggle-keyboard, scroll, open-url, install-app, keychain, record, camera, microphone, perform, ls, push-file, pull-file, delete-file, simctl, cp, xcrun, xcodebuild, lsof, reverse, tunnel"
70
70
  },
71
71
  "session": {
72
72
  "description": "Manage persistent background sessions for device interaction: start, status, stop. Sessions are used to execute commands on remote devices without the need to reconnect to the device after each command."