lim 0.29.1 → 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 (34) hide show
  1. package/README.md +8 -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/create.d.ts +1 -0
  7. package/dist/commands/android/create.d.ts.map +1 -1
  8. package/dist/commands/android/create.js +7 -0
  9. package/dist/commands/android/create.js.map +1 -1
  10. package/dist/commands/android/pull-file.d.ts +21 -0
  11. package/dist/commands/android/pull-file.d.ts.map +1 -0
  12. package/dist/commands/android/pull-file.js +67 -0
  13. package/dist/commands/android/pull-file.js.map +1 -0
  14. package/dist/commands/ios/tunnel/index.d.ts +29 -0
  15. package/dist/commands/ios/tunnel/index.d.ts.map +1 -0
  16. package/dist/commands/ios/tunnel/index.js +302 -0
  17. package/dist/commands/ios/tunnel/index.js.map +1 -0
  18. package/dist/commands/ios/tunnel/status.d.ts +17 -0
  19. package/dist/commands/ios/tunnel/status.d.ts.map +1 -0
  20. package/dist/commands/ios/tunnel/status.js +79 -0
  21. package/dist/commands/ios/tunnel/status.js.map +1 -0
  22. package/dist/commands/ios/tunnel/stop.d.ts +21 -0
  23. package/dist/commands/ios/tunnel/stop.d.ts.map +1 -0
  24. package/dist/commands/ios/tunnel/stop.js +148 -0
  25. package/dist/commands/ios/tunnel/stop.js.map +1 -0
  26. package/dist/lib/ios-tunnel-process.d.ts +70 -0
  27. package/dist/lib/ios-tunnel-process.d.ts.map +1 -0
  28. package/dist/lib/ios-tunnel-process.js +502 -0
  29. package/dist/lib/ios-tunnel-process.js.map +1 -0
  30. package/dist/lib/ios-tunnel-process.test.d.ts +2 -0
  31. package/dist/lib/ios-tunnel-process.test.d.ts.map +1 -0
  32. package/dist/lib/ios-tunnel-process.test.js +339 -0
  33. package/dist/lib/ios-tunnel-process.test.js.map +1 -0
  34. package/package.json +3 -3
package/README.md CHANGED
@@ -368,6 +368,9 @@ lim android create
368
368
  # With apps pre-installed
369
369
  lim android create --install ./my-app.apk --install ./another.apk
370
370
 
371
+ # With a specific Android OS version
372
+ lim android create --os-version 15
373
+
371
374
  # Create without opening an ADB tunnel
372
375
  lim android create --no-connect
373
376
 
@@ -377,10 +380,11 @@ lim android create --region us-west --display-name "CI Test" --label env=ci --rm
377
380
 
378
381
  **Android-specific flags:**
379
382
 
380
- | Flag | Description |
381
- | ------------------- | ----------------------------------------------- |
382
- | `--[no-]connect` | Start an ADB tunnel immediately (default: true) |
383
- | `--adb-path <path>` | Path to `adb` binary (default: `adb`) |
383
+ | Flag | Description |
384
+ | ------------------------ | ----------------------------------------------- |
385
+ | `--os-version <version>` | Android OS major version (14 or 15) |
386
+ | `--[no-]connect` | Start an ADB tunnel immediately (default: true) |
387
+ | `--adb-path <path>` | Path to `adb` binary (default: `adb`) |
384
388
 
385
389
  `lim android create` always prints a Console URL such as `https://console.limrun.com/stream/android_...` that you can open in the browser for live viewing. For automation, `--no-connect` is usually the safest default.
386
390
 
@@ -0,0 +1,19 @@
1
+ import { BaseCommand } from '../../base-command';
2
+ export default class AndroidAdbShell extends BaseCommand {
3
+ static summary: string;
4
+ static description: string;
5
+ static strict: boolean;
6
+ static examples: string[];
7
+ static flags: {
8
+ id: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
9
+ timeout: import("@oclif/core/lib/interfaces").OptionFlag<number, import("@oclif/core/lib/interfaces").CustomOptions>;
10
+ 'api-key': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
11
+ json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
12
+ quiet: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
13
+ create: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
14
+ workspace: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
15
+ daemon: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
16
+ };
17
+ run(): Promise<void>;
18
+ }
19
+ //# sourceMappingURL=adb-shell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adb-shell.d.ts","sourceRoot":"","sources":["../../../src/commands/android/adb-shell.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,WAAW;IACtD,MAAM,CAAC,OAAO,SAAwE;IACtF,MAAM,CAAC,WAAW,SAKwD;IAG1E,MAAM,CAAC,MAAM,UAAS;IAEtB,MAAM,CAAC,QAAQ,WAIb;IAEF,MAAM,CAAC,KAAK;;;;;;;;;MASV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAoC3B"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@oclif/core");
4
+ const base_command_1 = require("../../base-command");
5
+ const instance_client_factory_1 = require("../../lib/instance-client-factory");
6
+ class AndroidAdbShell extends base_command_1.BaseCommand {
7
+ async run() {
8
+ const { argv, flags } = await this.parse(AndroidAdbShell);
9
+ this.setParsedFlags(flags);
10
+ const tokens = argv;
11
+ if (tokens.length === 0) {
12
+ this.error('Provide a command after `--`, e.g. `android adb-shell -- pm list packages -3`.');
13
+ }
14
+ const [command, ...args] = tokens;
15
+ await this.withAuth(async () => {
16
+ const resolvedInstance = this.resolveAndroidInstance(flags.id);
17
+ const { client, disconnect } = await (0, instance_client_factory_1.getAndroidInstanceClient)(this.client, resolvedInstance);
18
+ try {
19
+ const result = await client.adbShell(command, args, { timeoutMs: flags.timeout });
20
+ if (flags.json) {
21
+ this.outputJson(result);
22
+ }
23
+ else {
24
+ if (result.stdout) {
25
+ process.stdout.write(result.stdout);
26
+ }
27
+ if (result.stderr) {
28
+ process.stderr.write(result.stderr);
29
+ }
30
+ if (result.truncated) {
31
+ process.stderr.write('\n[output truncated]\n');
32
+ }
33
+ }
34
+ if (result.exitCode !== 0) {
35
+ this.exit(result.exitCode);
36
+ }
37
+ }
38
+ finally {
39
+ disconnect();
40
+ }
41
+ });
42
+ }
43
+ }
44
+ AndroidAdbShell.summary = 'Run a shell command on a running Android instance (like adb shell)';
45
+ AndroidAdbShell.description = 'Run a command on the Android instance without needing adb installed locally. ' +
46
+ 'The command runs with the same permissions the adb shell user has, and its stdout, stderr, ' +
47
+ 'and exit code are returned. Pass the command and its arguments after `--`; each argument is ' +
48
+ 'sent as a separate, quoted token. To use shell features like pipes, invoke a shell explicitly ' +
49
+ '(e.g. `-- sh -c "..."`). The CLI exits with the command\'s exit code.';
50
+ // Everything after `--` is captured verbatim as the command and its args.
51
+ AndroidAdbShell.strict = false;
52
+ AndroidAdbShell.examples = [
53
+ '<%= config.bin %> android adb-shell -- pm list packages -3',
54
+ '<%= config.bin %> android adb-shell -- getprop ro.build.version.sdk',
55
+ '<%= config.bin %> android adb-shell --id <instance-ID> -- sh -c "dumpsys battery | grep level"',
56
+ ];
57
+ AndroidAdbShell.flags = {
58
+ ...base_command_1.BaseCommand.baseFlags,
59
+ id: core_1.Flags.string({
60
+ description: 'Android instance ID to target. Defaults to the last created Android instance.',
61
+ }),
62
+ timeout: core_1.Flags.integer({
63
+ description: 'Command timeout in milliseconds.',
64
+ default: 30000,
65
+ }),
66
+ };
67
+ exports.default = AndroidAdbShell;
68
+ //# sourceMappingURL=adb-shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adb-shell.js","sourceRoot":"","sources":["../../../src/commands/android/adb-shell.ts"],"names":[],"mappings":";;AAAA,sCAAoC;AACpC,qDAAiD;AACjD,+EAA6E;AAE7E,MAAqB,eAAgB,SAAQ,0BAAW;IA6BtD,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC1D,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAE3B,MAAM,MAAM,GAAG,IAAgB,CAAC;QAChC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,gFAAgF,CAAC,CAAC;QAC/F,CAAC;QACD,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,MAAM,CAAC;QAElC,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;YAC7B,MAAM,gBAAgB,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC/D,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,IAAA,kDAAwB,EAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;YAC7F,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAClF,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;oBACf,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBAC1B,CAAC;qBAAM,CAAC;oBACN,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;wBAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBACtC,CAAC;oBACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;wBAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBACtC,CAAC;oBACD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;wBACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;oBACjD,CAAC;gBACH,CAAC;gBACD,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;oBAC1B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,UAAU,EAAE,CAAC;YACf,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;;AA/DM,uBAAO,GAAG,oEAAoE,CAAC;AAC/E,2BAAW,GAChB,+EAA+E;IAC/E,6FAA6F;IAC7F,8FAA8F;IAC9F,gGAAgG;IAChG,uEAAuE,CAAC;AAE1E,0EAA0E;AACnE,sBAAM,GAAG,KAAK,CAAC;AAEf,wBAAQ,GAAG;IAChB,4DAA4D;IAC5D,qEAAqE;IACrE,gGAAgG;CACjG,CAAC;AAEK,qBAAK,GAAG;IACb,GAAG,0BAAW,CAAC,SAAS;IACxB,EAAE,EAAE,YAAK,CAAC,MAAM,CAAC;QACf,WAAW,EAAE,+EAA+E;KAC7F,CAAC;IACF,OAAO,EAAE,YAAK,CAAC,OAAO,CAAC;QACrB,WAAW,EAAE,kCAAkC;QAC/C,OAAO,EAAE,KAAK;KACf,CAAC;CACH,CAAC;kBA3BiB,eAAe"}
@@ -11,6 +11,7 @@ export default class AndroidCreate extends BaseCommand {
11
11
  'display-name': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
12
12
  region: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
13
13
  jurisdiction: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
14
+ 'os-version': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
14
15
  'hard-timeout': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
15
16
  'inactivity-timeout': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
16
17
  label: import("@oclif/core/lib/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
@@ -1 +1 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/android/create.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAMjD,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,WAAW;IACpD,MAAM,CAAC,OAAO,SAAmC;IACjD,MAAM,CAAC,WAAW,SAC+J;IAEjL,MAAM,CAAC,QAAQ,WAOb;IAEF,MAAM,CAAC,KAAK;;;;;;;;;;;;;;;;;;;;;;MAmEV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAqK3B"}
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/android/create.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAMjD,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,WAAW;IACpD,MAAM,CAAC,OAAO,SAAmC;IACjD,MAAM,CAAC,WAAW,SAC+J;IAEjL,MAAM,CAAC,QAAQ,WAQb;IAEF,MAAM,CAAC,KAAK;;;;;;;;;;;;;;;;;;;;;;;MAsEV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAwK3B"}
@@ -96,6 +96,9 @@ class AndroidCreate extends base_command_1.BaseCommand {
96
96
  params.spec.region = flags.region;
97
97
  if (flags.jurisdiction)
98
98
  params.spec.jurisdiction = flags.jurisdiction;
99
+ if (flags['os-version']) {
100
+ params.spec.clues = [{ kind: 'OSVersion', osVersion: flags['os-version'] }];
101
+ }
99
102
  if (flags['hard-timeout'])
100
103
  params.spec.hardTimeout = flags['hard-timeout'];
101
104
  if (flags['inactivity-timeout'])
@@ -208,6 +211,7 @@ AndroidCreate.examples = [
208
211
  '<%= config.bin %> android create',
209
212
  '<%= config.bin %> android create --rm --install ./app.apk',
210
213
  '<%= config.bin %> android create --install-url https://example.t3.storage.dev/app.apk?...',
214
+ '<%= config.bin %> android create --os-version 15',
211
215
  '<%= config.bin %> android create --jurisdiction us --label env=dev',
212
216
  '<%= config.bin %> android create --no-connect',
213
217
  '<%= config.bin %> android create --daemon=false',
@@ -242,6 +246,9 @@ AndroidCreate.flags = {
242
246
  description: 'Jurisdiction the instance must be created in. Unlike --region, this is a hard constraint: creation fails when no region in the jurisdiction has capacity.',
243
247
  options: ['us', 'eu', 'as'],
244
248
  }),
249
+ 'os-version': core_1.Flags.string({
250
+ description: 'Android OS major version to create (14 or 15)',
251
+ }),
245
252
  'hard-timeout': core_1.Flags.string({ description: 'Hard timeout (e.g. 1m, 10m, 3h). Default: no timeout' }),
246
253
  'inactivity-timeout': core_1.Flags.string({
247
254
  description: 'Inactivity timeout (e.g. 1m, 10m, 3h). Default is in organization settings.',
@@ -1 +1 @@
1
- {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/android/create.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/android/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { BaseCommand } from '../../base-command';
2
+ export default class AndroidPullFile extends BaseCommand {
3
+ static summary: string;
4
+ static description: string;
5
+ static examples: string[];
6
+ static args: {
7
+ path: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
8
+ destination: import("@oclif/core/lib/interfaces").Arg<string | undefined, Record<string, unknown>>;
9
+ };
10
+ static flags: {
11
+ id: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
12
+ 'api-key': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
13
+ json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
14
+ quiet: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
15
+ create: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
16
+ workspace: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
17
+ daemon: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
18
+ };
19
+ run(): Promise<void>;
20
+ }
21
+ //# sourceMappingURL=pull-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull-file.d.ts","sourceRoot":"","sources":["../../../src/commands/android/pull-file.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,WAAW;IACtD,MAAM,CAAC,OAAO,SAAiD;IAC/D,MAAM,CAAC,WAAW,SAGqD;IAEvE,MAAM,CAAC,QAAQ,WAIb;IAEF,MAAM,CAAC,IAAI;;;MAWT;IAEF,MAAM,CAAC,KAAK;;;;;;;;MAKV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA2B3B"}
@@ -0,0 +1,67 @@
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 fs_1 = __importDefault(require("fs"));
7
+ const path_1 = __importDefault(require("path"));
8
+ const core_1 = require("@oclif/core");
9
+ const base_command_1 = require("../../base-command");
10
+ const instance_client_factory_1 = require("../../lib/instance-client-factory");
11
+ class AndroidPullFile extends base_command_1.BaseCommand {
12
+ async run() {
13
+ const { args, flags } = await this.parse(AndroidPullFile);
14
+ this.setParsedFlags(flags);
15
+ await this.withAuth(async () => {
16
+ let localPath = path_1.default.resolve(args.destination ?? path_1.default.posix.basename(args.path));
17
+ // adb pull semantics: an existing directory destination (e.g. `.`)
18
+ // receives the file under its remote basename.
19
+ if (fs_1.default.existsSync(localPath) && fs_1.default.statSync(localPath).isDirectory()) {
20
+ localPath = path_1.default.join(localPath, path_1.default.posix.basename(args.path));
21
+ }
22
+ const resolvedInstance = this.resolveAndroidInstance(flags.id);
23
+ const { client, disconnect } = await (0, instance_client_factory_1.getAndroidInstanceClient)(this.client, resolvedInstance);
24
+ try {
25
+ // Streamed to disk by the SDK, so large files never sit in memory.
26
+ await client.pullFile(args.path, localPath);
27
+ if (flags.json) {
28
+ this.outputJson({ localPath, bytes: fs_1.default.statSync(localPath).size });
29
+ }
30
+ else {
31
+ this.output(localPath);
32
+ }
33
+ }
34
+ finally {
35
+ disconnect();
36
+ }
37
+ });
38
+ }
39
+ }
40
+ AndroidPullFile.summary = 'Pull a file from a running Android instance';
41
+ AndroidPullFile.description = 'Download a file from the Android instance without an ADB connection and save it locally. ' +
42
+ 'This behaves like `adb pull`: the read happens with the same permissions the ADB shell user has, ' +
43
+ 'so protected locations are rejected just as they would be for adb.';
44
+ AndroidPullFile.examples = [
45
+ '<%= config.bin %> android pull-file /sdcard/Download/photo.jpeg',
46
+ '<%= config.bin %> android pull-file /data/local/tmp/log.txt ./device-log.txt',
47
+ '<%= config.bin %> android pull-file /sdcard/Download/photo.jpeg ./photo.jpeg --id <instance-ID>',
48
+ ];
49
+ AndroidPullFile.args = {
50
+ path: core_1.Args.string({
51
+ description: 'Absolute path of the file on the instance, like the adb pull source.',
52
+ required: true,
53
+ }),
54
+ destination: core_1.Args.string({
55
+ description: 'Local path to save the file to. An existing directory saves the remote filename inside it, ' +
56
+ 'like adb pull. Defaults to the remote filename in the current directory.',
57
+ required: false,
58
+ }),
59
+ };
60
+ AndroidPullFile.flags = {
61
+ ...base_command_1.BaseCommand.baseFlags,
62
+ id: core_1.Flags.string({
63
+ description: 'Android instance ID to target. Defaults to the last created Android instance.',
64
+ }),
65
+ };
66
+ exports.default = AndroidPullFile;
67
+ //# sourceMappingURL=pull-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull-file.js","sourceRoot":"","sources":["../../../src/commands/android/pull-file.ts"],"names":[],"mappings":";;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,sCAA0C;AAC1C,qDAAiD;AACjD,+EAA6E;AAE7E,MAAqB,eAAgB,SAAQ,0BAAW;IAiCtD,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC1D,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAE3B,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;YAC7B,IAAI,SAAS,GAAG,cAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,IAAI,cAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACjF,mEAAmE;YACnE,+CAA+C;YAC/C,IAAI,YAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,YAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;gBACrE,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACnE,CAAC;YAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC/D,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,IAAA,kDAAwB,EAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;YAC7F,IAAI,CAAC;gBACH,mEAAmE;gBACnE,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;gBAC5C,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;oBACf,IAAI,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,YAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBACrE,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,UAAU,EAAE,CAAC;YACf,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;;AA1DM,uBAAO,GAAG,6CAA6C,CAAC;AACxD,2BAAW,GAChB,2FAA2F;IAC3F,mGAAmG;IACnG,oEAAoE,CAAC;AAEhE,wBAAQ,GAAG;IAChB,iEAAiE;IACjE,8EAA8E;IAC9E,iGAAiG;CAClG,CAAC;AAEK,oBAAI,GAAG;IACZ,IAAI,EAAE,WAAI,CAAC,MAAM,CAAC;QAChB,WAAW,EAAE,sEAAsE;QACnF,QAAQ,EAAE,IAAI;KACf,CAAC;IACF,WAAW,EAAE,WAAI,CAAC,MAAM,CAAC;QACvB,WAAW,EACT,6FAA6F;YAC7F,0EAA0E;QAC5E,QAAQ,EAAE,KAAK;KAChB,CAAC;CACH,CAAC;AAEK,qBAAK,GAAG;IACb,GAAG,0BAAW,CAAC,SAAS;IACxB,EAAE,EAAE,YAAK,CAAC,MAAM,CAAC;QACf,WAAW,EAAE,+EAA+E;KAC7F,CAAC;CACH,CAAC;kBA/BiB,eAAe"}
@@ -0,0 +1,29 @@
1
+ import { BaseCommand } from '../../../base-command';
2
+ export default class IosTunnel extends BaseCommand {
3
+ static summary: string;
4
+ static description: string;
5
+ static examples: string[];
6
+ static flags: {
7
+ id: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
8
+ route: import("@oclif/core/lib/interfaces").OptionFlag<string[], import("@oclif/core/lib/interfaces").CustomOptions>;
9
+ detach: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
10
+ serve: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
11
+ 'tunnel-owner': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
12
+ 'api-key': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
13
+ json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
14
+ quiet: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
15
+ create: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
16
+ workspace: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
17
+ daemon: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
18
+ };
19
+ run(): Promise<void>;
20
+ private runForeground;
21
+ private serveDetached;
22
+ private startDetached;
23
+ private assertNoActiveTunnel;
24
+ private clearDeadOwners;
25
+ private awaitTunnel;
26
+ private waitForProcessExit;
27
+ private printReady;
28
+ }
29
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/ios/tunnel/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAyBpD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW;IAChD,MAAM,CAAC,OAAO,SAA6D;IAC3E,MAAM,CAAC,WAAW,SAC4I;IAC9J,MAAM,CAAC,QAAQ,WAKb;IAEF,MAAM,CAAC,KAAK;;;;;;;;;;;;MA0BV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;YA4BZ,aAAa;YAiBb,aAAa;YAuCb,aAAa;YA0Gb,oBAAoB;IAgBlC,OAAO,CAAC,eAAe;YAkBT,WAAW;YA8BX,kBAAkB;IAchC,OAAO,CAAC,UAAU;CAyBnB"}
@@ -0,0 +1,302 @@
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 fs_1 = __importDefault(require("fs"));
8
+ const core_1 = require("@oclif/core");
9
+ const api_1 = require("@limrun/api");
10
+ const base_command_1 = require("../../../base-command");
11
+ const instance_client_factory_1 = require("../../../lib/instance-client-factory");
12
+ const ios_tunnel_process_1 = require("../../../lib/ios-tunnel-process");
13
+ class IosTunnel extends base_command_1.BaseCommand {
14
+ async run() {
15
+ const { flags } = await this.parse(IosTunnel);
16
+ this.setParsedFlags(flags);
17
+ if (flags.detach && flags.serve) {
18
+ this.error('--detach cannot be combined with internal --serve mode.');
19
+ }
20
+ const routes = flags.route.map(ios_tunnel_process_1.parseTunnelRoute);
21
+ if (flags.serve) {
22
+ const owner = flags['tunnel-owner'];
23
+ if (!owner)
24
+ this.error('--serve requires --tunnel-owner.');
25
+ await this.withAuth(async () => {
26
+ const resolvedInstance = this.resolveIosInstance(flags.id);
27
+ await this.serveDetached(resolvedInstance.id, owner, routes);
28
+ });
29
+ return;
30
+ }
31
+ await this.withAuth(async () => {
32
+ const resolvedInstance = this.resolveIosInstance(flags.id);
33
+ if (flags.detach) {
34
+ await this.startDetached(resolvedInstance.id, routes, flags['api-key']);
35
+ }
36
+ else {
37
+ await this.runForeground(resolvedInstance.id, routes);
38
+ }
39
+ });
40
+ }
41
+ async runForeground(instanceId, routes) {
42
+ const resolvedInstance = this.resolveIosInstance(instanceId);
43
+ const { client, disconnect } = await (0, instance_client_factory_1.getIosInstanceClient)(this.client, resolvedInstance);
44
+ let tunnel;
45
+ try {
46
+ tunnel = await client.startTunnel({
47
+ routes,
48
+ logLevel: this.shouldSuppressInfo() ? 'none' : 'info',
49
+ });
50
+ this.printReady(instanceId, tunnel.tunnelId, false);
51
+ await this.awaitTunnel(tunnel, false);
52
+ }
53
+ finally {
54
+ tunnel?.close();
55
+ disconnect();
56
+ }
57
+ }
58
+ async serveDetached(instanceId, owner, routes) {
59
+ const ownershipDeadline = Date.now() + 2000;
60
+ let starting = (0, ios_tunnel_process_1.loadTunnelProcess)(instanceId, owner);
61
+ while (starting?.pid !== process.pid && Date.now() < ownershipDeadline) {
62
+ await (0, api_1.defaultSleep)(25);
63
+ starting = (0, ios_tunnel_process_1.loadTunnelProcess)(instanceId, owner);
64
+ }
65
+ if (!starting || starting.pid !== process.pid) {
66
+ this.error('Detached tunnel ownership handshake failed.');
67
+ }
68
+ const resolvedInstance = this.resolveIosInstance(instanceId);
69
+ const { client, disconnect } = await (0, instance_client_factory_1.getIosInstanceClient)(this.client, resolvedInstance);
70
+ let tunnel;
71
+ const capLogs = setInterval(() => (0, ios_tunnel_process_1.capTunnelLog)(starting.logPath), 30000);
72
+ try {
73
+ tunnel = await client.startTunnel({ routes, logLevel: 'info' });
74
+ (0, ios_tunnel_process_1.updateTunnelProcess)({
75
+ ...starting,
76
+ status: 'ready',
77
+ tunnelId: tunnel.tunnelId,
78
+ }, owner);
79
+ await this.awaitTunnel(tunnel, true);
80
+ }
81
+ finally {
82
+ clearInterval(capLogs);
83
+ (0, ios_tunnel_process_1.capTunnelLog)(starting.logPath);
84
+ tunnel?.close();
85
+ disconnect();
86
+ (0, ios_tunnel_process_1.clearTunnelProcess)(instanceId, owner);
87
+ }
88
+ }
89
+ async startDetached(instanceId, routes, apiKey) {
90
+ await this.assertNoActiveTunnel(instanceId);
91
+ this.clearDeadOwners(instanceId);
92
+ const liveOwner = (0, ios_tunnel_process_1.listTunnelProcesses)(instanceId).find((state) => {
93
+ if (state.status === 'starting' && !(0, ios_tunnel_process_1.tunnelProcessStartingLeaseExpired)(state)) {
94
+ return true;
95
+ }
96
+ const identity = (0, ios_tunnel_process_1.tunnelOwnerProcessIdentity)(state);
97
+ return identity === 'match' || identity === 'unknown';
98
+ });
99
+ if (liveOwner) {
100
+ this.error(`A local tunnel process is already ${liveOwner.status} for ${instanceId} (PID ${liveOwner.pid}). ` +
101
+ `Run \`lim ios tunnel status --id ${instanceId}\` or stop it first.`);
102
+ }
103
+ const owner = (0, ios_tunnel_process_1.newTunnelOwner)();
104
+ const paths = (0, ios_tunnel_process_1.tunnelProcessPaths)(instanceId, owner);
105
+ const starting = {
106
+ owner,
107
+ pid: 0,
108
+ instanceId,
109
+ status: 'starting',
110
+ routes,
111
+ startedAt: new Date().toISOString(),
112
+ logPath: paths.log,
113
+ };
114
+ if (!(0, ios_tunnel_process_1.claimTunnelProcess)(starting)) {
115
+ this.error('Failed to claim detached tunnel process state.');
116
+ }
117
+ const scriptPath = process.argv[1];
118
+ if (!scriptPath) {
119
+ (0, ios_tunnel_process_1.clearTunnelProcess)(instanceId, owner);
120
+ this.error('Cannot locate the lim CLI entrypoint for detached startup.');
121
+ }
122
+ const logDescriptor = (0, ios_tunnel_process_1.prepareTunnelLog)(paths.log);
123
+ let child;
124
+ try {
125
+ child = (0, child_process_1.spawn)(process.execPath, (0, ios_tunnel_process_1.buildTunnelServeArgs)({
126
+ scriptPath,
127
+ instanceId,
128
+ owner,
129
+ routes,
130
+ }), {
131
+ detached: true,
132
+ windowsHide: true,
133
+ stdio: ['ignore', logDescriptor, logDescriptor],
134
+ env: (0, ios_tunnel_process_1.tunnelChildEnvironment)(apiKey),
135
+ });
136
+ }
137
+ catch (error) {
138
+ fs_1.default.closeSync(logDescriptor);
139
+ (0, ios_tunnel_process_1.clearTunnelProcess)(instanceId, owner);
140
+ throw error;
141
+ }
142
+ fs_1.default.closeSync(logDescriptor);
143
+ child.unref();
144
+ const pid = child.pid;
145
+ if (!pid) {
146
+ (0, ios_tunnel_process_1.clearTunnelProcess)(instanceId, owner);
147
+ this.error('Failed to spawn the detached tunnel process.');
148
+ }
149
+ (0, ios_tunnel_process_1.updateTunnelProcess)({ ...starting, pid }, owner);
150
+ const readiness = await (0, ios_tunnel_process_1.waitForTunnelProcessReady)({
151
+ load: () => (0, ios_tunnel_process_1.loadTunnelProcess)(instanceId, owner),
152
+ isAlive: () => (0, ios_tunnel_process_1.isSpawnedTunnelProcessAlive)(child, pid),
153
+ sleep: api_1.defaultSleep,
154
+ });
155
+ if (readiness.outcome === 'ready') {
156
+ const state = readiness.state;
157
+ this.printReady(instanceId, state.tunnelId, true, { pid, logPath: paths.log });
158
+ return;
159
+ }
160
+ if (readiness.outcome === 'exited') {
161
+ (0, ios_tunnel_process_1.clearTunnelProcess)(instanceId, owner);
162
+ this.error(`Detached tunnel exited during startup.\n${(0, ios_tunnel_process_1.readTunnelLogTail)(paths.log)}\nLogs: ${paths.log}`);
163
+ }
164
+ child.kill('SIGTERM');
165
+ let exited = await this.waitForProcessExit(child, pid, 20);
166
+ if (!exited) {
167
+ child.kill('SIGKILL');
168
+ exited = await this.waitForProcessExit(child, pid, 20);
169
+ }
170
+ if (exited) {
171
+ (0, ios_tunnel_process_1.clearTunnelProcess)(instanceId, owner);
172
+ }
173
+ const retainedOwnership = exited ? '' : ` and PID ${pid} did not exit; its ownership record was retained`;
174
+ this.error(`Detached tunnel did not become ready within 30s${retainedOwnership}.\n` +
175
+ `${(0, ios_tunnel_process_1.readTunnelLogTail)(paths.log)}\nLogs: ${paths.log}`);
176
+ }
177
+ async assertNoActiveTunnel(instanceId) {
178
+ const resolvedInstance = this.resolveIosInstance(instanceId);
179
+ const { client, disconnect } = await (0, instance_client_factory_1.getIosInstanceClient)(this.client, resolvedInstance);
180
+ try {
181
+ const status = await client.getTunnelStatus();
182
+ if (status.active) {
183
+ this.error(`Tunnel ${status.active.tunnelId} is already ${status.active.state}. ` +
184
+ `Run \`lim ios tunnel status --id ${instanceId}\` or stop it first.`);
185
+ }
186
+ }
187
+ finally {
188
+ disconnect();
189
+ }
190
+ }
191
+ clearDeadOwners(instanceId) {
192
+ for (const state of (0, ios_tunnel_process_1.listTunnelProcesses)(instanceId)) {
193
+ const identity = (0, ios_tunnel_process_1.tunnelOwnerProcessIdentity)(state);
194
+ if (identity === 'unknown') {
195
+ this.error(`Cannot verify local tunnel owner PID ${state.pid}; ownership state was retained at ${state.logPath}.`);
196
+ }
197
+ if (identity === 'match')
198
+ continue;
199
+ if (state.status === 'starting' && !(0, ios_tunnel_process_1.tunnelProcessStartingLeaseExpired)(state))
200
+ continue;
201
+ if (!(0, ios_tunnel_process_1.clearTunnelProcess)(instanceId, state.owner)) {
202
+ this.error(`Cannot clean local tunnel owner PID ${state.pid}; stop it before starting another tunnel.`);
203
+ }
204
+ }
205
+ }
206
+ async awaitTunnel(tunnel, remoteStopIsClean) {
207
+ await new Promise((resolve, reject) => {
208
+ const keepAlive = setInterval(() => { }, 1 << 30);
209
+ let stopping = false;
210
+ let unsubscribe = () => { };
211
+ const cleanup = () => {
212
+ clearInterval(keepAlive);
213
+ unsubscribe();
214
+ process.off('SIGINT', shutdown);
215
+ process.off('SIGTERM', shutdown);
216
+ };
217
+ const shutdown = () => {
218
+ stopping = true;
219
+ cleanup();
220
+ resolve();
221
+ };
222
+ process.once('SIGINT', shutdown);
223
+ process.once('SIGTERM', shutdown);
224
+ unsubscribe = (0, ios_tunnel_process_1.subscribeTunnelDisconnect)(tunnel, () => {
225
+ if (stopping)
226
+ return;
227
+ cleanup();
228
+ if (remoteStopIsClean) {
229
+ resolve();
230
+ }
231
+ else {
232
+ reject(new Error('Destination tunnel disconnected unexpectedly'));
233
+ }
234
+ });
235
+ });
236
+ }
237
+ async waitForProcessExit(child, pid, attempts) {
238
+ for (let attempt = 0; attempt < attempts; attempt++) {
239
+ if (child.exitCode !== null || child.signalCode !== null || !(0, ios_tunnel_process_1.isProcessAlive)(pid)) {
240
+ return true;
241
+ }
242
+ await (0, api_1.defaultSleep)(100);
243
+ }
244
+ return !(0, ios_tunnel_process_1.isProcessAlive)(pid);
245
+ }
246
+ printReady(instanceId, tunnelId, detached, processInfo) {
247
+ const ready = {
248
+ instanceId,
249
+ tunnelId,
250
+ state: 'ready',
251
+ detached,
252
+ ...processInfo,
253
+ };
254
+ if (this.isJsonEnabled()) {
255
+ this.outputJson(ready);
256
+ return;
257
+ }
258
+ this.output(`Tunnel ID: ${ready.tunnelId}`);
259
+ if (detached) {
260
+ this.output(`Logs: ${processInfo?.logPath}`);
261
+ this.output(`Stop: lim ios tunnel stop --id ${instanceId}`);
262
+ }
263
+ else {
264
+ this.info('Tunnel started. Press Ctrl+C to stop.');
265
+ }
266
+ }
267
+ }
268
+ IosTunnel.summary = 'Expose declared local TCP destinations to the simulator';
269
+ IosTunnel.description = 'Start one transparent destination tunnel with exact localhost:port or literal IP:port routes. Use --detach to keep it running after this command returns.';
270
+ IosTunnel.examples = [
271
+ '<%= config.bin %> ios tunnel --route localhost:3000 --id <instance-ID>',
272
+ '<%= config.bin %> ios tunnel --route 10.20.30.40:443 --route 10.20.30.41:8081 --detach',
273
+ '<%= config.bin %> ios tunnel status --id <instance-ID>',
274
+ '<%= config.bin %> ios tunnel stop --id <instance-ID>',
275
+ ];
276
+ IosTunnel.flags = {
277
+ ...base_command_1.BaseCommand.baseFlags,
278
+ id: core_1.Flags.string({
279
+ description: 'iOS instance ID to target. Defaults to the last created iOS instance, but --id is recommended for scripts and agents.',
280
+ }),
281
+ route: core_1.Flags.string({
282
+ description: 'Exact client-side TCP destination as localhost:port, IPv4:port, or [IPv6]:port. Repeat for more routes.',
283
+ multiple: true,
284
+ required: true,
285
+ }),
286
+ detach: core_1.Flags.boolean({
287
+ description: 'Run in a detached background process and return after READY.',
288
+ default: false,
289
+ }),
290
+ serve: core_1.Flags.boolean({
291
+ description: 'Internal: own the detached tunnel transport.',
292
+ default: false,
293
+ hidden: true,
294
+ }),
295
+ 'tunnel-owner': core_1.Flags.string({
296
+ description: 'Internal: detached process ownership token.',
297
+ hidden: true,
298
+ dependsOn: ['serve'],
299
+ }),
300
+ };
301
+ exports.default = IosTunnel;
302
+ //# sourceMappingURL=index.js.map