lim 0.30.3 → 0.31.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 (117) hide show
  1. package/dist/base-command.d.ts +3 -0
  2. package/dist/base-command.d.ts.map +1 -1
  3. package/dist/base-command.js +10 -0
  4. package/dist/base-command.js.map +1 -1
  5. package/dist/commands/android/app-logs.d.ts +17 -0
  6. package/dist/commands/android/app-logs.d.ts.map +1 -0
  7. package/dist/commands/android/app-logs.js +35 -0
  8. package/dist/commands/android/app-logs.js.map +1 -0
  9. package/dist/commands/android/create.d.ts +4 -0
  10. package/dist/commands/android/create.d.ts.map +1 -1
  11. package/dist/commands/android/create.js +45 -0
  12. package/dist/commands/android/create.js.map +1 -1
  13. package/dist/commands/android/events.d.ts +17 -0
  14. package/dist/commands/android/events.d.ts.map +1 -0
  15. package/dist/commands/android/events.js +35 -0
  16. package/dist/commands/android/events.js.map +1 -0
  17. package/dist/commands/android/record.d.ts +2 -0
  18. package/dist/commands/android/record.d.ts.map +1 -1
  19. package/dist/commands/android/record.js +27 -3
  20. package/dist/commands/android/record.js.map +1 -1
  21. package/dist/commands/android/recordings.d.ts +17 -0
  22. package/dist/commands/android/recordings.d.ts.map +1 -0
  23. package/dist/commands/android/recordings.js +35 -0
  24. package/dist/commands/android/recordings.js.map +1 -0
  25. package/dist/commands/android/tunnel/index.d.ts +29 -0
  26. package/dist/commands/android/tunnel/index.d.ts.map +1 -0
  27. package/dist/commands/android/tunnel/index.js +170 -0
  28. package/dist/commands/android/tunnel/index.js.map +1 -0
  29. package/dist/commands/android/tunnel/index.test.d.ts +2 -0
  30. package/dist/commands/android/tunnel/index.test.d.ts.map +1 -0
  31. package/dist/commands/android/tunnel/index.test.js +66 -0
  32. package/dist/commands/android/tunnel/index.test.js.map +1 -0
  33. package/dist/commands/android/tunnel/status.d.ts +17 -0
  34. package/dist/commands/android/tunnel/status.d.ts.map +1 -0
  35. package/dist/commands/android/tunnel/status.js +61 -0
  36. package/dist/commands/android/tunnel/status.js.map +1 -0
  37. package/dist/commands/android/tunnel/stop.d.ts +17 -0
  38. package/dist/commands/android/tunnel/stop.d.ts.map +1 -0
  39. package/dist/commands/android/tunnel/stop.js +50 -0
  40. package/dist/commands/android/tunnel/stop.js.map +1 -0
  41. package/dist/commands/ios/app-logs.d.ts +17 -0
  42. package/dist/commands/ios/app-logs.d.ts.map +1 -0
  43. package/dist/commands/ios/app-logs.js +35 -0
  44. package/dist/commands/ios/app-logs.js.map +1 -0
  45. package/dist/commands/ios/create.d.ts +4 -0
  46. package/dist/commands/ios/create.d.ts.map +1 -1
  47. package/dist/commands/ios/create.js +45 -0
  48. package/dist/commands/ios/create.js.map +1 -1
  49. package/dist/commands/ios/events.d.ts +17 -0
  50. package/dist/commands/ios/events.d.ts.map +1 -0
  51. package/dist/commands/ios/events.js +35 -0
  52. package/dist/commands/ios/events.js.map +1 -0
  53. package/dist/commands/ios/launch-app.js +1 -1
  54. package/dist/commands/ios/launch-app.js.map +1 -1
  55. package/dist/commands/ios/record.d.ts +2 -0
  56. package/dist/commands/ios/record.d.ts.map +1 -1
  57. package/dist/commands/ios/record.js +27 -3
  58. package/dist/commands/ios/record.js.map +1 -1
  59. package/dist/commands/ios/recordings.d.ts +17 -0
  60. package/dist/commands/ios/recordings.d.ts.map +1 -0
  61. package/dist/commands/ios/recordings.js +35 -0
  62. package/dist/commands/ios/recordings.js.map +1 -0
  63. package/dist/commands/ios/tunnel/index.d.ts +3 -9
  64. package/dist/commands/ios/tunnel/index.d.ts.map +1 -1
  65. package/dist/commands/ios/tunnel/index.js +33 -239
  66. package/dist/commands/ios/tunnel/index.js.map +1 -1
  67. package/dist/commands/ios/tunnel/status.d.ts.map +1 -1
  68. package/dist/commands/ios/tunnel/status.js +17 -41
  69. package/dist/commands/ios/tunnel/status.js.map +1 -1
  70. package/dist/commands/ios/tunnel/stop.d.ts +0 -4
  71. package/dist/commands/ios/tunnel/stop.d.ts.map +1 -1
  72. package/dist/commands/ios/tunnel/stop.js +13 -111
  73. package/dist/commands/ios/tunnel/stop.js.map +1 -1
  74. package/dist/lib/duration.d.ts +5 -0
  75. package/dist/lib/duration.d.ts.map +1 -1
  76. package/dist/lib/duration.js +21 -0
  77. package/dist/lib/duration.js.map +1 -1
  78. package/dist/lib/session-artifacts.d.ts +11 -0
  79. package/dist/lib/session-artifacts.d.ts.map +1 -0
  80. package/dist/lib/session-artifacts.js +30 -0
  81. package/dist/lib/session-artifacts.js.map +1 -0
  82. package/dist/lib/session-captures.d.ts +41 -0
  83. package/dist/lib/session-captures.d.ts.map +1 -0
  84. package/dist/lib/session-captures.js +55 -0
  85. package/dist/lib/session-captures.js.map +1 -0
  86. package/dist/lib/tunnel-command.d.ts +98 -0
  87. package/dist/lib/tunnel-command.d.ts.map +1 -0
  88. package/dist/lib/tunnel-command.js +542 -0
  89. package/dist/lib/tunnel-command.js.map +1 -0
  90. package/dist/lib/tunnel-command.test.d.ts +2 -0
  91. package/dist/lib/tunnel-command.test.d.ts.map +1 -0
  92. package/dist/lib/tunnel-command.test.js +91 -0
  93. package/dist/lib/tunnel-command.test.js.map +1 -0
  94. package/dist/lib/tunnel-har.d.ts +14 -0
  95. package/dist/lib/tunnel-har.d.ts.map +1 -0
  96. package/dist/lib/tunnel-har.js +150 -0
  97. package/dist/lib/tunnel-har.js.map +1 -0
  98. package/dist/lib/tunnel-har.test.d.ts +2 -0
  99. package/dist/lib/tunnel-har.test.d.ts.map +1 -0
  100. package/dist/lib/tunnel-har.test.js +164 -0
  101. package/dist/lib/tunnel-har.test.js.map +1 -0
  102. package/dist/lib/tunnel-process.d.ts +98 -0
  103. package/dist/lib/tunnel-process.d.ts.map +1 -0
  104. package/dist/lib/{ios-tunnel-process.js → tunnel-process.js} +87 -97
  105. package/dist/lib/tunnel-process.js.map +1 -0
  106. package/dist/lib/tunnel-process.test.d.ts +2 -0
  107. package/dist/lib/tunnel-process.test.d.ts.map +1 -0
  108. package/dist/lib/tunnel-process.test.js +428 -0
  109. package/dist/lib/tunnel-process.test.js.map +1 -0
  110. package/package.json +2 -2
  111. package/dist/lib/ios-tunnel-process.d.ts +0 -70
  112. package/dist/lib/ios-tunnel-process.d.ts.map +0 -1
  113. package/dist/lib/ios-tunnel-process.js.map +0 -1
  114. package/dist/lib/ios-tunnel-process.test.d.ts +0 -2
  115. package/dist/lib/ios-tunnel-process.test.d.ts.map +0 -1
  116. package/dist/lib/ios-tunnel-process.test.js +0 -339
  117. package/dist/lib/ios-tunnel-process.test.js.map +0 -1
@@ -0,0 +1,35 @@
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 session_artifacts_1 = require("../../lib/session-artifacts");
6
+ class AndroidRecordings extends base_command_1.BaseCommand {
7
+ async run() {
8
+ const { flags } = await this.parse(AndroidRecordings);
9
+ this.setParsedFlags(flags);
10
+ await this.withAuth(async () => {
11
+ const id = this.resolveAndroidInstance(flags.id).id;
12
+ const artifacts = await this.client.androidInstances.listRecordings(id);
13
+ if (flags.json) {
14
+ this.outputJson(artifacts);
15
+ return;
16
+ }
17
+ const { headers, rows } = (0, session_artifacts_1.sessionArtifactTable)(artifacts);
18
+ this.outputTable(headers, rows);
19
+ });
20
+ }
21
+ }
22
+ AndroidRecordings.summary = 'List persisted session recordings of an Android instance';
23
+ AndroidRecordings.description = 'List video recordings persisted with the persist option (e.g. `lim android create --record`). Each entry carries a short-lived download URL in `--json` output. Recordings outlive the instance until their TTL expires.';
24
+ AndroidRecordings.examples = [
25
+ '<%= config.bin %> android recordings',
26
+ '<%= config.bin %> android recordings --id <instance-ID> --json',
27
+ ];
28
+ AndroidRecordings.flags = {
29
+ ...base_command_1.BaseCommand.baseFlags,
30
+ id: core_1.Flags.string({
31
+ description: 'Android instance ID to list. Defaults to the last created Android instance.',
32
+ }),
33
+ };
34
+ exports.default = AndroidRecordings;
35
+ //# sourceMappingURL=recordings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recordings.js","sourceRoot":"","sources":["../../../src/commands/android/recordings.ts"],"names":[],"mappings":";;AAAA,sCAAoC;AACpC,qDAAiD;AACjD,mEAAmE;AAEnE,MAAqB,iBAAkB,SAAQ,0BAAW;IAgBxD,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACtD,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAE3B,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;YAC7B,MAAM,EAAE,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACpD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YACxE,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACf,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;gBAC3B,OAAO;YACT,CAAC;YACD,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAA,wCAAoB,EAAC,SAAS,CAAC,CAAC;YAC1D,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;;AA7BM,yBAAO,GAAG,0DAA0D,CAAC;AACrE,6BAAW,GAChB,0NAA0N,CAAC;AACtN,0BAAQ,GAAG;IAChB,sCAAsC;IACtC,gEAAgE;CACjE,CAAC;AAEK,uBAAK,GAAG;IACb,GAAG,0BAAW,CAAC,SAAS;IACxB,EAAE,EAAE,YAAK,CAAC,MAAM,CAAC;QACf,WAAW,EAAE,6EAA6E;KAC3F,CAAC;CACH,CAAC;kBAdiB,iBAAiB"}
@@ -0,0 +1,29 @@
1
+ import { BaseCommand } from '../../../base-command';
2
+ export declare function validateAndroidTunnelInspectionFlags(inspect: boolean, harPath?: string, persist?: boolean, ttlSeconds?: number): void;
3
+ export default class AndroidTunnel extends BaseCommand {
4
+ static summary: string;
5
+ static description: string;
6
+ static examples: string[];
7
+ static flags: {
8
+ id: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
9
+ selector: import("@oclif/core/lib/interfaces").OptionFlag<string[], import("@oclif/core/lib/interfaces").CustomOptions>;
10
+ detach: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
11
+ verbose: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
12
+ inspect: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
13
+ har: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
14
+ persist: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
15
+ ttl: import("@oclif/core/lib/interfaces").OptionFlag<number | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
16
+ 'har-body-limit': import("@oclif/core/lib/interfaces").OptionFlag<number, import("@oclif/core/lib/interfaces").CustomOptions>;
17
+ serve: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
18
+ 'tunnel-owner': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
19
+ 'api-key': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
20
+ json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
21
+ quiet: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
22
+ create: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
23
+ workspace: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
24
+ daemon: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
25
+ };
26
+ run(): Promise<void>;
27
+ private tunnelContext;
28
+ }
29
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/android/tunnel/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAgBpD,wBAAgB,oCAAoC,CAClD,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,UAAQ,EACf,UAAU,CAAC,EAAE,MAAM,GAClB,IAAI,CAON;AAED,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,WAAW;IACpD,MAAM,CAAC,OAAO,SAAiE;IAC/E,MAAM,CAAC,WAAW,SAOsE;IACxF,MAAM,CAAC,QAAQ,WAMb;IAEF,MAAM,CAAC,KAAK;;;;;;;;;;;;;;;;;;MAwDV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAwE1B,OAAO,CAAC,aAAa;CA+BtB"}
@@ -0,0 +1,170 @@
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
+ exports.validateAndroidTunnelInspectionFlags = validateAndroidTunnelInspectionFlags;
7
+ const core_1 = require("@oclif/core");
8
+ const path_1 = __importDefault(require("path"));
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 tunnel_command_1 = require("../../../lib/tunnel-command");
13
+ const tunnel_process_1 = require("../../../lib/tunnel-process");
14
+ /** Bind listeners on the instance run unprivileged; system ports are refused. */
15
+ const ANDROID_MIN_ROUTE_PORT = 1024;
16
+ function validateAndroidTunnelInspectionFlags(inspect, harPath, persist = false, ttlSeconds) {
17
+ if (harPath && !inspect) {
18
+ throw new Error('--har cannot be combined with --no-inspect.');
19
+ }
20
+ if (ttlSeconds !== undefined && !persist) {
21
+ throw new Error('--ttl is only valid with --persist.');
22
+ }
23
+ }
24
+ class AndroidTunnel extends base_command_1.BaseCommand {
25
+ async run() {
26
+ const { flags } = await this.parse(AndroidTunnel);
27
+ this.setParsedFlags(flags);
28
+ if (flags.detach && flags.serve) {
29
+ this.error('--detach cannot be combined with internal --serve mode.');
30
+ }
31
+ try {
32
+ validateAndroidTunnelInspectionFlags(flags.inspect || flags.persist, flags.har, flags.persist, flags.ttl);
33
+ }
34
+ catch (error) {
35
+ this.error(error instanceof Error ? error.message : String(error));
36
+ }
37
+ const selectors = (0, tunnel_process_1.parseTunnelSelectors)(flags.selector, { minPort: ANDROID_MIN_ROUTE_PORT });
38
+ if (flags.serve) {
39
+ const owner = flags['tunnel-owner'];
40
+ if (!owner)
41
+ this.error('--serve requires --tunnel-owner.');
42
+ await this.withAuth(async () => {
43
+ const resolvedInstance = this.resolveAndroidInstance(flags.id);
44
+ await (0, tunnel_command_1.serveTunnelDetached)(this.tunnelContext(resolvedInstance.id, selectors, flags.verbose ? 'debug' : 'info', undefined, {
45
+ inspect: flags.inspect || flags.persist,
46
+ persist: flags.persist,
47
+ ...(flags.ttl === undefined ? {} : { ttlSeconds: flags.ttl }),
48
+ ...(flags.har ? { harPath: path_1.default.resolve(flags.har) } : {}),
49
+ harBodyLimit: flags['har-body-limit'],
50
+ }), owner);
51
+ });
52
+ return;
53
+ }
54
+ await this.withAuth(async () => {
55
+ const resolvedInstance = this.resolveAndroidInstance(flags.id);
56
+ if (flags.detach) {
57
+ await (0, tunnel_command_1.startTunnelDetached)({
58
+ ...this.tunnelContext(resolvedInstance.id, selectors, 'info', flags['api-key'], {
59
+ inspect: flags.inspect || flags.persist,
60
+ persist: flags.persist,
61
+ ...(flags.ttl === undefined ? {} : { ttlSeconds: flags.ttl }),
62
+ ...(flags.har ? { harPath: path_1.default.resolve(flags.har) } : {}),
63
+ harBodyLimit: flags['har-body-limit'],
64
+ }),
65
+ verbose: flags.verbose,
66
+ });
67
+ }
68
+ else {
69
+ await (0, tunnel_command_1.runTunnelForeground)(this.tunnelContext(resolvedInstance.id, selectors, flags.verbose ? 'debug'
70
+ : this.shouldSuppressInfo() ? 'none'
71
+ : 'info', undefined, {
72
+ inspect: flags.inspect || flags.persist,
73
+ persist: flags.persist,
74
+ ...(flags.ttl === undefined ? {} : { ttlSeconds: flags.ttl }),
75
+ ...(flags.har ? { harPath: path_1.default.resolve(flags.har) } : {}),
76
+ harBodyLimit: flags['har-body-limit'],
77
+ }));
78
+ }
79
+ });
80
+ }
81
+ tunnelContext(instanceId, selectors, logLevel, apiKey, inspection = {
82
+ inspect: true,
83
+ harBodyLimit: api_1.DESTINATION_TUNNEL_DEFAULT_MAX_BODY_BYTES,
84
+ }) {
85
+ return {
86
+ product: 'android',
87
+ instanceId,
88
+ selectors,
89
+ apiKey,
90
+ reconnect: true,
91
+ ...inspection,
92
+ connect: async () => {
93
+ const resolvedInstance = this.resolveAndroidInstance(instanceId);
94
+ const { client, disconnect } = await (0, instance_client_factory_1.getAndroidInstanceClient)(this.client, resolvedInstance);
95
+ return (0, tunnel_command_1.tunnelClientFacade)(client, disconnect, logLevel);
96
+ },
97
+ io: this.tunnelCommandIO(),
98
+ };
99
+ }
100
+ }
101
+ AndroidTunnel.summary = 'Send selected Android TCP destinations through this machine';
102
+ AndroidTunnel.description = 'Start one transparent destination tunnel. Exact --selector destinations (localhost:port or IP:port) ' +
103
+ 'become listeners on the instance, also reachable as 10.0.2.2:<port> following the emulator ' +
104
+ 'convention. Domain selectors are intercepted transparently on the instance and ' +
105
+ 'dialed from this machine. Use --detach to keep the tunnel running after this command returns. ' +
106
+ 'Start the tunnel before launching your app: connections opened earlier keep their original ' +
107
+ 'route until they close. ' +
108
+ 'Note: apps that resolve DNS themselves over HTTPS (DoH) bypass domain interception.';
109
+ AndroidTunnel.examples = [
110
+ '<%= config.bin %> android tunnel --selector localhost:8080 --id <instance-ID>',
111
+ '<%= config.bin %> android tunnel --selector "*.corp.example" --detach',
112
+ '<%= config.bin %> android tunnel --selector "*.api.example" --persist --ttl 604800',
113
+ '<%= config.bin %> android tunnel status --id <instance-ID>',
114
+ '<%= config.bin %> android tunnel stop --id <instance-ID>',
115
+ ];
116
+ AndroidTunnel.flags = {
117
+ ...base_command_1.BaseCommand.baseFlags,
118
+ id: core_1.Flags.string({
119
+ description: 'Android instance ID to target. Defaults to the last created Android instance, but --id is recommended for scripts and agents.',
120
+ }),
121
+ selector: core_1.Flags.string({
122
+ description: 'Destination: localhost:port, IPv4:port, [IPv6]:port (port >= 1024), exact domain, or wildcard domain. Repeat for more selectors.',
123
+ multiple: true,
124
+ required: true,
125
+ }),
126
+ detach: core_1.Flags.boolean({
127
+ description: 'Run in a detached background process and return after READY.',
128
+ default: false,
129
+ }),
130
+ verbose: core_1.Flags.boolean({
131
+ description: 'Log every forwarded connection and dial failure. With --detach, the lines go to the tunnel log file (see tunnel status).',
132
+ default: false,
133
+ }),
134
+ inspect: core_1.Flags.boolean({
135
+ description: 'Print one HTTP summary per completed request. Use --no-inspect to disable Android inspection.',
136
+ default: true,
137
+ allowNo: true,
138
+ }),
139
+ har: core_1.Flags.string({
140
+ description: 'Capture inspected HTTP traffic as HAR 1.2 at this path.',
141
+ }),
142
+ persist: core_1.Flags.boolean({
143
+ description: 'Persist a body-inclusive network log as a session artifact.',
144
+ default: false,
145
+ }),
146
+ ttl: core_1.Flags.integer({
147
+ description: 'Persisted network-log lifetime in seconds (default 259200; maximum 2592000).',
148
+ min: 1,
149
+ max: api_1.DESTINATION_TUNNEL_MAX_TTL_SECONDS,
150
+ dependsOn: ['persist'],
151
+ }),
152
+ 'har-body-limit': core_1.Flags.integer({
153
+ description: 'Maximum captured bytes per request or response body.',
154
+ default: api_1.DESTINATION_TUNNEL_DEFAULT_MAX_BODY_BYTES,
155
+ min: 1,
156
+ max: api_1.DESTINATION_TUNNEL_MAX_BODY_BYTES,
157
+ }),
158
+ serve: core_1.Flags.boolean({
159
+ description: 'Internal: own the detached tunnel transport.',
160
+ default: false,
161
+ hidden: true,
162
+ }),
163
+ 'tunnel-owner': core_1.Flags.string({
164
+ description: 'Internal: detached process ownership token.',
165
+ hidden: true,
166
+ dependsOn: ['serve'],
167
+ }),
168
+ };
169
+ exports.default = AndroidTunnel;
170
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/android/tunnel/index.ts"],"names":[],"mappings":";;;;;AAwBA,oFAYC;AApCD,sCAAoC;AACpC,gDAAwB;AACxB,qCAKqB;AACrB,wDAAoD;AACpD,kFAAgF;AAChF,gEAQqC;AACrC,gEAAmE;AAEnE,iFAAiF;AACjF,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAEpC,SAAgB,oCAAoC,CAClD,OAAgB,EAChB,OAAgB,EAChB,OAAO,GAAG,KAAK,EACf,UAAmB;IAEnB,IAAI,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,UAAU,KAAK,SAAS,IAAI,CAAC,OAAO,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED,MAAqB,aAAc,SAAQ,0BAAW;IA4EpD,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAClD,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChC,IAAI,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,CAAC;YACH,oCAAoC,CAClC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,EAC9B,KAAK,CAAC,GAAG,EACT,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,GAAG,CACV,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,SAAS,GAAG,IAAA,qCAAoB,EAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC;QAE5F,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC;YACpC,IAAI,CAAC,KAAK;gBAAE,IAAI,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;YAC3D,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;gBAC7B,MAAM,gBAAgB,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC/D,MAAM,IAAA,oCAAmB,EACvB,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE;oBAC9F,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO;oBACvC,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;oBAC7D,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,cAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC1D,YAAY,EAAE,KAAK,CAAC,gBAAgB,CAAC;iBACtC,CAAC,EACF,KAAK,CACN,CAAC;YACJ,CAAC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;YAC7B,MAAM,gBAAgB,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC/D,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,MAAM,IAAA,oCAAmB,EAAC;oBACxB,GAAG,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE;wBAC9E,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO;wBACvC,OAAO,EAAE,KAAK,CAAC,OAAO;wBACtB,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;wBAC7D,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,cAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC1D,YAAY,EAAE,KAAK,CAAC,gBAAgB,CAAC;qBACtC,CAAC;oBACF,OAAO,EAAE,KAAK,CAAC,OAAO;iBACvB,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAA,oCAAmB,EACvB,IAAI,CAAC,aAAa,CAChB,gBAAgB,CAAC,EAAE,EACnB,SAAS,EACT,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;oBACvB,CAAC,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,MAAM;wBACpC,CAAC,CAAC,MAAM,EACR,SAAS,EACT;oBACE,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO;oBACvC,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;oBAC7D,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,cAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC1D,YAAY,EAAE,KAAK,CAAC,gBAAgB,CAAC;iBACtC,CACF,CACF,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,aAAa,CACnB,UAAkB,EAClB,SAAqC,EACrC,QAAwB,EACxB,MAAe,EACf,aAMI;QACF,OAAO,EAAE,IAAI;QACb,YAAY,EAAE,+CAAyC;KACxD;QAED,OAAO;YACL,OAAO,EAAE,SAAS;YAClB,UAAU;YACV,SAAS;YACT,MAAM;YACN,SAAS,EAAE,IAAI;YACf,GAAG,UAAU;YACb,OAAO,EAAE,KAAK,IAAiC,EAAE;gBAC/C,MAAM,gBAAgB,GAAG,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC;gBACjE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,IAAA,kDAAwB,EAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;gBAC7F,OAAO,IAAA,mCAAkB,EAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;YAC1D,CAAC;YACD,EAAE,EAAE,IAAI,CAAC,eAAe,EAAE;SAC3B,CAAC;IACJ,CAAC;;AAjLM,qBAAO,GAAG,6DAA6D,CAAC;AACxE,yBAAW,GAChB,sGAAsG;IACtG,6FAA6F;IAC7F,iFAAiF;IACjF,gGAAgG;IAChG,6FAA6F;IAC7F,0BAA0B;IAC1B,qFAAqF,CAAC;AACjF,sBAAQ,GAAG;IAChB,+EAA+E;IAC/E,uEAAuE;IACvE,oFAAoF;IACpF,4DAA4D;IAC5D,0DAA0D;CAC3D,CAAC;AAEK,mBAAK,GAAG;IACb,GAAG,0BAAW,CAAC,SAAS;IACxB,EAAE,EAAE,YAAK,CAAC,MAAM,CAAC;QACf,WAAW,EACT,+HAA+H;KAClI,CAAC;IACF,QAAQ,EAAE,YAAK,CAAC,MAAM,CAAC;QACrB,WAAW,EACT,kIAAkI;QACpI,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,IAAI;KACf,CAAC;IACF,MAAM,EAAE,YAAK,CAAC,OAAO,CAAC;QACpB,WAAW,EAAE,8DAA8D;QAC3E,OAAO,EAAE,KAAK;KACf,CAAC;IACF,OAAO,EAAE,YAAK,CAAC,OAAO,CAAC;QACrB,WAAW,EACT,0HAA0H;QAC5H,OAAO,EAAE,KAAK;KACf,CAAC;IACF,OAAO,EAAE,YAAK,CAAC,OAAO,CAAC;QACrB,WAAW,EACT,+FAA+F;QACjG,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,IAAI;KACd,CAAC;IACF,GAAG,EAAE,YAAK,CAAC,MAAM,CAAC;QAChB,WAAW,EAAE,yDAAyD;KACvE,CAAC;IACF,OAAO,EAAE,YAAK,CAAC,OAAO,CAAC;QACrB,WAAW,EAAE,6DAA6D;QAC1E,OAAO,EAAE,KAAK;KACf,CAAC;IACF,GAAG,EAAE,YAAK,CAAC,OAAO,CAAC;QACjB,WAAW,EAAE,8EAA8E;QAC3F,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,wCAAkC;QACvC,SAAS,EAAE,CAAC,SAAS,CAAC;KACvB,CAAC;IACF,gBAAgB,EAAE,YAAK,CAAC,OAAO,CAAC;QAC9B,WAAW,EAAE,sDAAsD;QACnE,OAAO,EAAE,+CAAyC;QAClD,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,uCAAiC;KACvC,CAAC;IACF,KAAK,EAAE,YAAK,CAAC,OAAO,CAAC;QACnB,WAAW,EAAE,8CAA8C;QAC3D,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,IAAI;KACb,CAAC;IACF,cAAc,EAAE,YAAK,CAAC,MAAM,CAAC;QAC3B,WAAW,EAAE,6CAA6C;QAC1D,MAAM,EAAE,IAAI;QACZ,SAAS,EAAE,CAAC,OAAO,CAAC;KACrB,CAAC;CACH,CAAC;kBA1EiB,aAAa"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../../../src/commands/android/tunnel/index.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const api_1 = require("@limrun/api");
40
+ const tunnel_1 = __importDefault(require("../../ios/tunnel"));
41
+ const _1 = __importStar(require("."));
42
+ describe('Android tunnel inspection flags', () => {
43
+ test('enables inspection and the 10 MiB HAR limit by default', () => {
44
+ expect(_1.default.flags.inspect.default).toBe(true);
45
+ expect(_1.default.flags.inspect.allowNo).toBe(true);
46
+ expect(_1.default.flags['har-body-limit'].default).toBe(api_1.DESTINATION_TUNNEL_DEFAULT_MAX_BODY_BYTES);
47
+ expect(_1.default.flags['har-body-limit'].max).toBe(api_1.DESTINATION_TUNNEL_MAX_BODY_BYTES);
48
+ });
49
+ test('rejects HAR capture when inspection is disabled', () => {
50
+ expect(() => (0, _1.validateAndroidTunnelInspectionFlags)(false, 'traffic.har')).toThrow('--har cannot be combined with --no-inspect.');
51
+ expect(() => (0, _1.validateAndroidTunnelInspectionFlags)(true, 'traffic.har')).not.toThrow();
52
+ });
53
+ test('requires persistence when a TTL is specified', () => {
54
+ expect(() => (0, _1.validateAndroidTunnelInspectionFlags)(true, undefined, false, 3600)).toThrow('--ttl is only valid with --persist.');
55
+ expect(() => (0, _1.validateAndroidTunnelInspectionFlags)(false, undefined, true, 3600)).not.toThrow();
56
+ expect(_1.default.flags.persist.default).toBe(false);
57
+ });
58
+ test('does not expose inspection or HAR flags on iOS', () => {
59
+ expect('inspect' in tunnel_1.default.flags).toBe(false);
60
+ expect('har' in tunnel_1.default.flags).toBe(false);
61
+ expect('har-body-limit' in tunnel_1.default.flags).toBe(false);
62
+ expect('persist' in tunnel_1.default.flags).toBe(false);
63
+ expect('ttl' in tunnel_1.default.flags).toBe(false);
64
+ });
65
+ });
66
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../../src/commands/android/tunnel/index.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAA2G;AAC3G,8DAAyC;AACzC,sCAAwE;AAExE,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,IAAI,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAClE,MAAM,CAAC,UAAa,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,CAAC,UAAa,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,CAAC,UAAa,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,+CAAyC,CAAC,CAAC;QACtG,MAAM,CAAE,UAAa,CAAC,KAAK,CAAC,gBAAgB,CAAgC,CAAC,GAAG,CAAC,CAAC,IAAI,CACpF,uCAAiC,CAClC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,uCAAoC,EAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,OAAO,CAC9E,6CAA6C,CAC9C,CAAC;QACF,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,uCAAoC,EAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACxF,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,uCAAoC,EAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CACtF,qCAAqC,CACtC,CAAC;QACF,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,uCAAoC,EAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAC/F,MAAM,CAAC,UAAa,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gDAAgD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,SAAS,IAAI,gBAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,IAAI,gBAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,CAAC,gBAAgB,IAAI,gBAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxD,MAAM,CAAC,SAAS,IAAI,gBAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,IAAI,gBAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { BaseCommand } from '../../../base-command';
2
+ export default class AndroidTunnelStatus extends BaseCommand {
3
+ static summary: string;
4
+ static description: string;
5
+ static examples: string[];
6
+ static flags: {
7
+ create: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
8
+ id: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
9
+ 'api-key': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
10
+ json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
11
+ quiet: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
12
+ workspace: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
13
+ daemon: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
14
+ };
15
+ run(): Promise<void>;
16
+ }
17
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../../src/commands/android/tunnel/status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAIpD,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,WAAW;IAC1D,MAAM,CAAC,OAAO,SAAwC;IACtD,MAAM,CAAC,WAAW,SAC+G;IACjI,MAAM,CAAC,QAAQ,WAGb;IAEF,MAAM,CAAC,KAAK;;;;;;;;MAYV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAqC3B"}
@@ -0,0 +1,61 @@
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
+ const tunnel_command_1 = require("../../../lib/tunnel-command");
7
+ class AndroidTunnelStatus extends base_command_1.BaseCommand {
8
+ async run() {
9
+ const { flags } = await this.parse(AndroidTunnelStatus);
10
+ this.setParsedFlags(flags);
11
+ if (flags.create) {
12
+ this.error('Tunnel status cannot create a replacement instance.');
13
+ }
14
+ await this.withAuth(async () => {
15
+ const resolvedInstance = this.resolveAndroidInstance(flags.id);
16
+ await (0, tunnel_command_1.runTunnelStatus)({
17
+ instanceId: resolvedInstance.id,
18
+ connect: async () => {
19
+ const { client, disconnect } = await (0, instance_client_factory_1.getAndroidInstanceClient)(this.client, resolvedInstance);
20
+ return {
21
+ getTunnelStatus: () => client.getTunnelStatus(),
22
+ stopTunnel: (tunnelId) => client.stopTunnel(tunnelId),
23
+ disconnect,
24
+ };
25
+ },
26
+ io: this.tunnelCommandIO(),
27
+ renderActive: (active, io) => {
28
+ const inspection = active.inspection;
29
+ io.output(`Inspection: ${inspection.enabled ? 'enabled' : 'disabled'}, bodies ${inspection.captureBodies ? 'enabled' : 'disabled'}, persistence ${inspection.persist ? `enabled (${inspection.ttlSeconds}s)` : 'disabled'}`);
30
+ for (const selector of active.selectors) {
31
+ io.output(`Selector: ${selector.value}`);
32
+ for (const bind of selector.binds ?? []) {
33
+ const detail = bind.osCode ? `${bind.status}, ${bind.osCode}` : bind.status;
34
+ io.output(`Bind ${selector.id} ${bind.address}: ${detail}`);
35
+ }
36
+ }
37
+ },
38
+ });
39
+ });
40
+ }
41
+ }
42
+ AndroidTunnelStatus.summary = 'Show the active destination tunnel';
43
+ AndroidTunnelStatus.description = 'Query the instance-authoritative tunnel state, per-selector bind results, most recent failure, and any local detached owner.';
44
+ AndroidTunnelStatus.examples = [
45
+ '<%= config.bin %> android tunnel status --id <instance-ID>',
46
+ '<%= config.bin %> android tunnel status --id <instance-ID> --json',
47
+ ];
48
+ AndroidTunnelStatus.flags = {
49
+ ...base_command_1.BaseCommand.baseFlags,
50
+ create: core_1.Flags.boolean({
51
+ description: 'Create a replacement instance if the target is gone. Disabled by default for status queries.',
52
+ default: false,
53
+ allowNo: true,
54
+ hidden: true,
55
+ }),
56
+ id: core_1.Flags.string({
57
+ description: 'Android instance ID to query. Defaults to the last created Android instance.',
58
+ }),
59
+ };
60
+ exports.default = AndroidTunnelStatus;
61
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../../src/commands/android/tunnel/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { BaseCommand } from '../../../base-command';
2
+ export default class AndroidTunnelStop extends BaseCommand {
3
+ static summary: string;
4
+ static description: string;
5
+ static examples: string[];
6
+ static flags: {
7
+ create: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
8
+ id: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
9
+ 'api-key': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
10
+ json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
11
+ quiet: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
12
+ workspace: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
13
+ daemon: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
14
+ };
15
+ run(): Promise<void>;
16
+ }
17
+ //# sourceMappingURL=stop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../../../src/commands/android/tunnel/stop.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAIpD,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,WAAW;IACxD,MAAM,CAAC,OAAO,SAAwC;IACtD,MAAM,CAAC,WAAW,SAC+H;IACjJ,MAAM,CAAC,QAAQ,WAGb;IAEF,MAAM,CAAC,KAAK;;;;;;;;MAWV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAsB3B"}
@@ -0,0 +1,50 @@
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
+ const tunnel_command_1 = require("../../../lib/tunnel-command");
7
+ class AndroidTunnelStop extends base_command_1.BaseCommand {
8
+ async run() {
9
+ const { flags } = await this.parse(AndroidTunnelStop);
10
+ this.setParsedFlags(flags);
11
+ if (flags.create) {
12
+ this.error('Tunnel stop cannot create a replacement instance.');
13
+ }
14
+ await this.withAuth(async () => {
15
+ const resolvedInstance = this.resolveAndroidInstance(flags.id);
16
+ await (0, tunnel_command_1.runTunnelStop)({
17
+ instanceId: resolvedInstance.id,
18
+ connect: async () => {
19
+ const { client, disconnect } = await (0, instance_client_factory_1.getAndroidInstanceClient)(this.client, resolvedInstance);
20
+ return {
21
+ getTunnelStatus: () => client.getTunnelStatus(),
22
+ stopTunnel: (tunnelId) => client.stopTunnel(tunnelId),
23
+ disconnect,
24
+ };
25
+ },
26
+ io: this.tunnelCommandIO(),
27
+ });
28
+ });
29
+ }
30
+ }
31
+ AndroidTunnelStop.summary = 'Stop the active destination tunnel';
32
+ AndroidTunnelStop.description = 'Stop the instance-authoritative tunnel by its current ID, then gracefully stop and, if necessary, force-stop verified local detached owners.';
33
+ AndroidTunnelStop.examples = [
34
+ '<%= config.bin %> android tunnel stop --id <instance-ID>',
35
+ '<%= config.bin %> android tunnel stop --id <instance-ID> --json',
36
+ ];
37
+ AndroidTunnelStop.flags = {
38
+ ...base_command_1.BaseCommand.baseFlags,
39
+ create: core_1.Flags.boolean({
40
+ description: 'Create a replacement instance if the target is gone. Disabled by default for stop.',
41
+ default: false,
42
+ allowNo: true,
43
+ hidden: true,
44
+ }),
45
+ id: core_1.Flags.string({
46
+ description: 'Android instance ID to stop. Defaults to the last created Android instance.',
47
+ }),
48
+ };
49
+ exports.default = AndroidTunnelStop;
50
+ //# sourceMappingURL=stop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../../src/commands/android/tunnel/stop.ts"],"names":[],"mappings":";;AAAA,sCAAoC;AACpC,wDAAoD;AACpD,kFAAgF;AAChF,gEAA4D;AAE5D,MAAqB,iBAAkB,SAAQ,0BAAW;IAsBxD,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACtD,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;YAC7B,MAAM,gBAAgB,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC/D,MAAM,IAAA,8BAAa,EAAC;gBAClB,UAAU,EAAE,gBAAgB,CAAC,EAAE;gBAC/B,OAAO,EAAE,KAAK,IAAI,EAAE;oBAClB,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,IAAA,kDAAwB,EAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;oBAC7F,OAAO;wBACL,eAAe,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,eAAe,EAAE;wBAC/C,UAAU,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;wBAC7D,UAAU;qBACX,CAAC;gBACJ,CAAC;gBACD,EAAE,EAAE,IAAI,CAAC,eAAe,EAAE;aAC3B,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;;AA1CM,yBAAO,GAAG,oCAAoC,CAAC;AAC/C,6BAAW,GAChB,8IAA8I,CAAC;AAC1I,0BAAQ,GAAG;IAChB,0DAA0D;IAC1D,iEAAiE;CAClE,CAAC;AAEK,uBAAK,GAAG;IACb,GAAG,0BAAW,CAAC,SAAS;IACxB,MAAM,EAAE,YAAK,CAAC,OAAO,CAAC;QACpB,WAAW,EAAE,oFAAoF;QACjG,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,IAAI;KACb,CAAC;IACF,EAAE,EAAE,YAAK,CAAC,MAAM,CAAC;QACf,WAAW,EAAE,6EAA6E;KAC3F,CAAC;CACH,CAAC;kBApBiB,iBAAiB"}
@@ -0,0 +1,17 @@
1
+ import { BaseCommand } from '../../base-command';
2
+ export default class IosAppLogs 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
+ 'api-key': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
9
+ json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
10
+ quiet: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
11
+ create: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
12
+ workspace: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
13
+ daemon: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
14
+ };
15
+ run(): Promise<void>;
16
+ }
17
+ //# sourceMappingURL=app-logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-logs.d.ts","sourceRoot":"","sources":["../../../src/commands/ios/app-logs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,WAAW;IACjD,MAAM,CAAC,OAAO,SAAwD;IACtE,MAAM,CAAC,WAAW,SACkP;IACpQ,MAAM,CAAC,QAAQ,WAGb;IAEF,MAAM,CAAC,KAAK;;;;;;;;MAKV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAe3B"}
@@ -0,0 +1,35 @@
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 session_artifacts_1 = require("../../lib/session-artifacts");
6
+ class IosAppLogs extends base_command_1.BaseCommand {
7
+ async run() {
8
+ const { flags } = await this.parse(IosAppLogs);
9
+ this.setParsedFlags(flags);
10
+ await this.withAuth(async () => {
11
+ const id = this.resolveIosInstance(flags.id).id;
12
+ const artifacts = await this.client.iosInstances.listAppLogs(id);
13
+ if (flags.json) {
14
+ this.outputJson(artifacts);
15
+ return;
16
+ }
17
+ const { headers, rows } = (0, session_artifacts_1.sessionArtifactTable)(artifacts);
18
+ this.outputTable(headers, rows);
19
+ });
20
+ }
21
+ }
22
+ IosAppLogs.summary = 'List persisted app log captures of an iOS instance';
23
+ IosAppLogs.description = 'List app log captures persisted with the persist option (e.g. `lim ios create --app-logs <bundleId>`). Each entry is a timestamped JSONL file with a short-lived download URL in `--json` output. For live tailing of a running instance use `lim ios app-log`.';
24
+ IosAppLogs.examples = [
25
+ '<%= config.bin %> ios app-logs',
26
+ '<%= config.bin %> ios app-logs --id <instance-ID> --json',
27
+ ];
28
+ IosAppLogs.flags = {
29
+ ...base_command_1.BaseCommand.baseFlags,
30
+ id: core_1.Flags.string({
31
+ description: 'iOS instance ID to list. Defaults to the last created iOS instance.',
32
+ }),
33
+ };
34
+ exports.default = IosAppLogs;
35
+ //# sourceMappingURL=app-logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-logs.js","sourceRoot":"","sources":["../../../src/commands/ios/app-logs.ts"],"names":[],"mappings":";;AAAA,sCAAoC;AACpC,qDAAiD;AACjD,mEAAmE;AAEnE,MAAqB,UAAW,SAAQ,0BAAW;IAgBjD,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAE3B,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;YAC7B,MAAM,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAChD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YACjE,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACf,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;gBAC3B,OAAO;YACT,CAAC;YACD,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAA,wCAAoB,EAAC,SAAS,CAAC,CAAC;YAC1D,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;;AA7BM,kBAAO,GAAG,oDAAoD,CAAC;AAC/D,sBAAW,GAChB,iQAAiQ,CAAC;AAC7P,mBAAQ,GAAG;IAChB,gCAAgC;IAChC,0DAA0D;CAC3D,CAAC;AAEK,gBAAK,GAAG;IACb,GAAG,0BAAW,CAAC,SAAS;IACxB,EAAE,EAAE,YAAK,CAAC,MAAM,CAAC;QACf,WAAW,EAAE,qEAAqE;KACnF,CAAC;CACH,CAAC;kBAdiB,UAAU"}
@@ -28,6 +28,10 @@ export default class IosCreate extends BaseCommand {
28
28
  xcode: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
29
29
  attach: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
30
30
  open: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
31
+ record: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
32
+ 'app-logs': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
33
+ events: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
34
+ 'persist-ttl': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
31
35
  'api-key': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
32
36
  json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
33
37
  quiet: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/ios/create.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAUjD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW;IAChD,MAAM,CAAC,OAAO,SAA+B;IAC7C,MAAM,CAAC,WAAW,SAC4K;IAE9L,MAAM,CAAC,QAAQ,WAUb;IAEF,MAAM,CAAC,IAAI;;MAKT;IAEF,MAAM,CAAC,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAqFV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA4P3B"}
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/ios/create.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAYjD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW;IAChD,MAAM,CAAC,OAAO,SAA+B;IAC7C,MAAM,CAAC,WAAW,SAC4K;IAE9L,MAAM,CAAC,QAAQ,WAWb;IAEF,MAAM,CAAC,IAAI;;MAKT;IAEF,MAAM,CAAC,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAwGV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAsR3B"}