lim 0.30.3 → 0.31.1

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 (123) hide show
  1. package/dist/base-command.d.ts +9 -0
  2. package/dist/base-command.d.ts.map +1 -1
  3. package/dist/base-command.js +68 -14
  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/sync.d.ts.map +1 -1
  26. package/dist/commands/android/sync.js +3 -3
  27. package/dist/commands/android/sync.js.map +1 -1
  28. package/dist/commands/android/tunnel/index.d.ts +29 -0
  29. package/dist/commands/android/tunnel/index.d.ts.map +1 -0
  30. package/dist/commands/android/tunnel/index.js +170 -0
  31. package/dist/commands/android/tunnel/index.js.map +1 -0
  32. package/dist/commands/android/tunnel/index.test.d.ts +2 -0
  33. package/dist/commands/android/tunnel/index.test.d.ts.map +1 -0
  34. package/dist/commands/android/tunnel/index.test.js +66 -0
  35. package/dist/commands/android/tunnel/index.test.js.map +1 -0
  36. package/dist/commands/android/tunnel/status.d.ts +17 -0
  37. package/dist/commands/android/tunnel/status.d.ts.map +1 -0
  38. package/dist/commands/android/tunnel/status.js +61 -0
  39. package/dist/commands/android/tunnel/status.js.map +1 -0
  40. package/dist/commands/android/tunnel/stop.d.ts +17 -0
  41. package/dist/commands/android/tunnel/stop.d.ts.map +1 -0
  42. package/dist/commands/android/tunnel/stop.js +50 -0
  43. package/dist/commands/android/tunnel/stop.js.map +1 -0
  44. package/dist/commands/ios/app-logs.d.ts +17 -0
  45. package/dist/commands/ios/app-logs.d.ts.map +1 -0
  46. package/dist/commands/ios/app-logs.js +35 -0
  47. package/dist/commands/ios/app-logs.js.map +1 -0
  48. package/dist/commands/ios/create.d.ts +4 -0
  49. package/dist/commands/ios/create.d.ts.map +1 -1
  50. package/dist/commands/ios/create.js +45 -0
  51. package/dist/commands/ios/create.js.map +1 -1
  52. package/dist/commands/ios/events.d.ts +17 -0
  53. package/dist/commands/ios/events.d.ts.map +1 -0
  54. package/dist/commands/ios/events.js +35 -0
  55. package/dist/commands/ios/events.js.map +1 -0
  56. package/dist/commands/ios/launch-app.js +1 -1
  57. package/dist/commands/ios/launch-app.js.map +1 -1
  58. package/dist/commands/ios/record.d.ts +2 -0
  59. package/dist/commands/ios/record.d.ts.map +1 -1
  60. package/dist/commands/ios/record.js +27 -3
  61. package/dist/commands/ios/record.js.map +1 -1
  62. package/dist/commands/ios/recordings.d.ts +17 -0
  63. package/dist/commands/ios/recordings.d.ts.map +1 -0
  64. package/dist/commands/ios/recordings.js +35 -0
  65. package/dist/commands/ios/recordings.js.map +1 -0
  66. package/dist/commands/ios/sync.d.ts.map +1 -1
  67. package/dist/commands/ios/sync.js +3 -3
  68. package/dist/commands/ios/sync.js.map +1 -1
  69. package/dist/commands/ios/tunnel/index.d.ts +3 -9
  70. package/dist/commands/ios/tunnel/index.d.ts.map +1 -1
  71. package/dist/commands/ios/tunnel/index.js +33 -239
  72. package/dist/commands/ios/tunnel/index.js.map +1 -1
  73. package/dist/commands/ios/tunnel/status.d.ts.map +1 -1
  74. package/dist/commands/ios/tunnel/status.js +17 -41
  75. package/dist/commands/ios/tunnel/status.js.map +1 -1
  76. package/dist/commands/ios/tunnel/stop.d.ts +0 -4
  77. package/dist/commands/ios/tunnel/stop.d.ts.map +1 -1
  78. package/dist/commands/ios/tunnel/stop.js +13 -111
  79. package/dist/commands/ios/tunnel/stop.js.map +1 -1
  80. package/dist/lib/duration.d.ts +5 -0
  81. package/dist/lib/duration.d.ts.map +1 -1
  82. package/dist/lib/duration.js +21 -0
  83. package/dist/lib/duration.js.map +1 -1
  84. package/dist/lib/session-artifacts.d.ts +11 -0
  85. package/dist/lib/session-artifacts.d.ts.map +1 -0
  86. package/dist/lib/session-artifacts.js +30 -0
  87. package/dist/lib/session-artifacts.js.map +1 -0
  88. package/dist/lib/session-captures.d.ts +41 -0
  89. package/dist/lib/session-captures.d.ts.map +1 -0
  90. package/dist/lib/session-captures.js +55 -0
  91. package/dist/lib/session-captures.js.map +1 -0
  92. package/dist/lib/tunnel-command.d.ts +98 -0
  93. package/dist/lib/tunnel-command.d.ts.map +1 -0
  94. package/dist/lib/tunnel-command.js +542 -0
  95. package/dist/lib/tunnel-command.js.map +1 -0
  96. package/dist/lib/tunnel-command.test.d.ts +2 -0
  97. package/dist/lib/tunnel-command.test.d.ts.map +1 -0
  98. package/dist/lib/tunnel-command.test.js +91 -0
  99. package/dist/lib/tunnel-command.test.js.map +1 -0
  100. package/dist/lib/tunnel-har.d.ts +14 -0
  101. package/dist/lib/tunnel-har.d.ts.map +1 -0
  102. package/dist/lib/tunnel-har.js +150 -0
  103. package/dist/lib/tunnel-har.js.map +1 -0
  104. package/dist/lib/tunnel-har.test.d.ts +2 -0
  105. package/dist/lib/tunnel-har.test.d.ts.map +1 -0
  106. package/dist/lib/tunnel-har.test.js +164 -0
  107. package/dist/lib/tunnel-har.test.js.map +1 -0
  108. package/dist/lib/tunnel-process.d.ts +98 -0
  109. package/dist/lib/tunnel-process.d.ts.map +1 -0
  110. package/dist/lib/{ios-tunnel-process.js → tunnel-process.js} +87 -97
  111. package/dist/lib/tunnel-process.js.map +1 -0
  112. package/dist/lib/tunnel-process.test.d.ts +2 -0
  113. package/dist/lib/tunnel-process.test.d.ts.map +1 -0
  114. package/dist/lib/tunnel-process.test.js +428 -0
  115. package/dist/lib/tunnel-process.test.js.map +1 -0
  116. package/package.json +2 -2
  117. package/dist/lib/ios-tunnel-process.d.ts +0 -70
  118. package/dist/lib/ios-tunnel-process.d.ts.map +0 -1
  119. package/dist/lib/ios-tunnel-process.js.map +0 -1
  120. package/dist/lib/ios-tunnel-process.test.d.ts +0 -2
  121. package/dist/lib/ios-tunnel-process.test.d.ts.map +0 -1
  122. package/dist/lib/ios-tunnel-process.test.js +0 -339
  123. package/dist/lib/ios-tunnel-process.test.js.map +0 -1
@@ -5,8 +5,9 @@ export default class IosTunnel extends BaseCommand {
5
5
  static examples: string[];
6
6
  static flags: {
7
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>;
8
+ selector: import("@oclif/core/lib/interfaces").OptionFlag<string[], import("@oclif/core/lib/interfaces").CustomOptions>;
9
9
  detach: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
10
+ verbose: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
10
11
  serve: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
11
12
  'tunnel-owner': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
12
13
  'api-key': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
@@ -17,13 +18,6 @@ export default class IosTunnel extends BaseCommand {
17
18
  daemon: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
18
19
  };
19
20
  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;
21
+ private tunnelContext;
28
22
  }
29
23
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/ios/tunnel/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAapD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW;IAChD,MAAM,CAAC,OAAO,SAA6D;IAC3E,MAAM,CAAC,WAAW,SAC+I;IACjK,MAAM,CAAC,QAAQ,WAKb;IAEF,MAAM,CAAC,KAAK;;;;;;;;;;;;;MA+BV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IA0C1B,OAAO,CAAC,aAAa;CAqBtB"}
@@ -1,15 +1,10 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const child_process_1 = require("child_process");
7
- const fs_1 = __importDefault(require("fs"));
8
3
  const core_1 = require("@oclif/core");
9
- const api_1 = require("@limrun/api");
10
4
  const base_command_1 = require("../../../base-command");
11
5
  const instance_client_factory_1 = require("../../../lib/instance-client-factory");
12
- const ios_tunnel_process_1 = require("../../../lib/ios-tunnel-process");
6
+ const tunnel_command_1 = require("../../../lib/tunnel-command");
7
+ const tunnel_process_1 = require("../../../lib/tunnel-process");
13
8
  class IosTunnel extends base_command_1.BaseCommand {
14
9
  async run() {
15
10
  const { flags } = await this.parse(IosTunnel);
@@ -17,259 +12,54 @@ class IosTunnel extends base_command_1.BaseCommand {
17
12
  if (flags.detach && flags.serve) {
18
13
  this.error('--detach cannot be combined with internal --serve mode.');
19
14
  }
20
- const routes = flags.route.map(ios_tunnel_process_1.parseTunnelRoute);
15
+ const selectors = (0, tunnel_process_1.parseTunnelSelectors)(flags.selector, { allowDomains: false });
21
16
  if (flags.serve) {
22
17
  const owner = flags['tunnel-owner'];
23
18
  if (!owner)
24
19
  this.error('--serve requires --tunnel-owner.');
25
20
  await this.withAuth(async () => {
26
21
  const resolvedInstance = this.resolveIosInstance(flags.id);
27
- await this.serveDetached(resolvedInstance.id, owner, routes);
22
+ await (0, tunnel_command_1.serveTunnelDetached)(this.tunnelContext(resolvedInstance.id, selectors, flags.verbose ? 'debug' : 'info'), owner);
28
23
  });
29
24
  return;
30
25
  }
31
26
  await this.withAuth(async () => {
32
27
  const resolvedInstance = this.resolveIosInstance(flags.id);
33
28
  if (flags.detach) {
34
- await this.startDetached(resolvedInstance.id, routes, flags['api-key']);
29
+ await (0, tunnel_command_1.startTunnelDetached)({
30
+ ...this.tunnelContext(resolvedInstance.id, selectors, 'info', flags['api-key']),
31
+ verbose: flags.verbose,
32
+ });
35
33
  }
36
34
  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.`);
35
+ await (0, tunnel_command_1.runTunnelForeground)(this.tunnelContext(resolvedInstance.id, selectors, flags.verbose ? 'debug'
36
+ : this.shouldSuppressInfo() ? 'none'
37
+ : 'info'));
203
38
  }
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
39
  });
236
40
  }
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 = {
41
+ tunnelContext(instanceId, selectors, logLevel, apiKey) {
42
+ return {
43
+ product: 'ios',
248
44
  instanceId,
249
- tunnelId,
250
- state: 'ready',
251
- detached,
252
- ...processInfo,
45
+ selectors,
46
+ apiKey,
47
+ reconnect: false,
48
+ inspect: false,
49
+ connect: async () => {
50
+ const resolvedInstance = this.resolveIosInstance(instanceId);
51
+ const { client, disconnect } = await (0, instance_client_factory_1.getIosInstanceClient)(this.client, resolvedInstance);
52
+ return (0, tunnel_command_1.tunnelClientFacade)(client, disconnect, logLevel);
53
+ },
54
+ io: this.tunnelCommandIO(),
253
55
  };
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
56
  }
267
57
  }
268
58
  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.';
59
+ IosTunnel.description = 'Start one transparent destination tunnel with exact localhost:port or literal IP:port selectors. Use --detach to keep it running after this command returns.';
270
60
  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',
61
+ '<%= config.bin %> ios tunnel --selector localhost:3000 --id <instance-ID>',
62
+ '<%= config.bin %> ios tunnel --selector 10.20.30.40:443 --selector 10.20.30.41:8081 --detach',
273
63
  '<%= config.bin %> ios tunnel status --id <instance-ID>',
274
64
  '<%= config.bin %> ios tunnel stop --id <instance-ID>',
275
65
  ];
@@ -278,8 +68,8 @@ IosTunnel.flags = {
278
68
  id: core_1.Flags.string({
279
69
  description: 'iOS instance ID to target. Defaults to the last created iOS instance, but --id is recommended for scripts and agents.',
280
70
  }),
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.',
71
+ selector: core_1.Flags.string({
72
+ description: 'Exact client-side TCP destination as localhost:port, IPv4:port, or [IPv6]:port. Repeat for more selectors.',
283
73
  multiple: true,
284
74
  required: true,
285
75
  }),
@@ -287,6 +77,10 @@ IosTunnel.flags = {
287
77
  description: 'Run in a detached background process and return after READY.',
288
78
  default: false,
289
79
  }),
80
+ verbose: core_1.Flags.boolean({
81
+ description: 'Log every forwarded connection and dial failure. With --detach, the lines go to the tunnel log file (see tunnel status).',
82
+ default: false,
83
+ }),
290
84
  serve: core_1.Flags.boolean({
291
85
  description: 'Internal: own the detached tunnel transport.',
292
86
  default: false,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/ios/tunnel/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/ios/tunnel/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../../src/commands/ios/tunnel/status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AASpD,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,WAAW;IACtD,MAAM,CAAC,OAAO,SAAwC;IACtD,MAAM,CAAC,WAAW,SACoF;IACtG,MAAM,CAAC,QAAQ,WAGb;IAEF,MAAM,CAAC,KAAK;;;;;;;;MAYV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAsD3B"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../../src/commands/ios/tunnel/status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAIpD,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,WAAW;IACtD,MAAM,CAAC,OAAO,SAAwC;IACtD,MAAM,CAAC,WAAW,SACoF;IACtG,MAAM,CAAC,QAAQ,WAGb;IAEF,MAAM,CAAC,KAAK;;;;;;;;MAYV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA2B3B"}
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const core_1 = require("@oclif/core");
4
4
  const base_command_1 = require("../../../base-command");
5
5
  const instance_client_factory_1 = require("../../../lib/instance-client-factory");
6
- const ios_tunnel_process_1 = require("../../../lib/ios-tunnel-process");
6
+ const tunnel_command_1 = require("../../../lib/tunnel-command");
7
7
  class IosTunnelStatus extends base_command_1.BaseCommand {
8
8
  async run() {
9
9
  const { flags } = await this.parse(IosTunnelStatus);
@@ -13,47 +13,23 @@ class IosTunnelStatus extends base_command_1.BaseCommand {
13
13
  }
14
14
  await this.withAuth(async () => {
15
15
  const resolvedInstance = this.resolveIosInstance(flags.id);
16
- const { client, disconnect } = await (0, instance_client_factory_1.getIosInstanceClient)(this.client, resolvedInstance);
17
- try {
18
- const status = await client.getTunnelStatus();
19
- const owners = (0, ios_tunnel_process_1.listTunnelProcesses)(resolvedInstance.id).map((state) => ({
20
- owner: state.owner,
21
- pid: state.pid,
22
- status: state.status,
23
- tunnelId: state.tunnelId,
24
- logPath: state.logPath,
25
- process: (0, ios_tunnel_process_1.tunnelOwnerProcessIdentity)(state),
26
- }));
27
- if (this.isJsonEnabled()) {
28
- this.outputJson({
29
- instanceId: resolvedInstance.id,
30
- ...status,
31
- localOwners: owners,
32
- });
33
- return;
34
- }
35
- if (status.active) {
36
- this.output(`Tunnel ${status.active.tunnelId}: ${status.active.state}`);
37
- for (const route of status.active.routes) {
38
- this.output(`Route: ${(0, ios_tunnel_process_1.formatTunnelRoute)(route)}`);
16
+ await (0, tunnel_command_1.runTunnelStatus)({
17
+ instanceId: resolvedInstance.id,
18
+ connect: async () => {
19
+ const { client, disconnect } = await (0, instance_client_factory_1.getIosInstanceClient)(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
+ for (const selector of active.selectors) {
29
+ io.output(`Selector: ${selector.value}`);
39
30
  }
40
- }
41
- else {
42
- this.output('No active destination tunnel.');
43
- }
44
- if (status.lastFailure) {
45
- this.output(`Last failure: ${status.lastFailure.tunnelId} (${status.lastFailure.code})`);
46
- }
47
- if (status.lastDialFailure) {
48
- this.output((0, ios_tunnel_process_1.formatTunnelDialFailure)(status.lastDialFailure));
49
- }
50
- for (const owner of owners) {
51
- this.output(`Local owner: PID ${owner.pid} (${owner.process}, ${owner.status})${owner.logPath ? `, logs: ${owner.logPath}` : ''}`);
52
- }
53
- }
54
- finally {
55
- disconnect();
56
- }
31
+ },
32
+ });
57
33
  });
58
34
  }
59
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../../src/commands/ios/tunnel/status.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../../src/commands/ios/tunnel/status.ts"],"names":[],"mappings":";;AAAA,sCAAoC;AACpC,wDAAoD;AACpD,kFAA4E;AAC5E,gEAA8D;AAE9D,MAAqB,eAAgB,SAAQ,0BAAW;IAuBtD,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACpD,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACpE,CAAC;QACD,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;YAC7B,MAAM,gBAAgB,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC3D,MAAM,IAAA,gCAAe,EAAC;gBACpB,UAAU,EAAE,gBAAgB,CAAC,EAAE;gBAC/B,OAAO,EAAE,KAAK,IAAI,EAAE;oBAClB,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,IAAA,8CAAoB,EAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;oBACzF,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;gBAC1B,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE;oBAC3B,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;wBACxC,EAAE,CAAC,MAAM,CAAC,aAAa,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;oBAC3C,CAAC;gBACH,CAAC;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;;AAhDM,uBAAO,GAAG,oCAAoC,CAAC;AAC/C,2BAAW,GAChB,mGAAmG,CAAC;AAC/F,wBAAQ,GAAG;IAChB,wDAAwD;IACxD,+DAA+D;CAChE,CAAC;AAEK,qBAAK,GAAG;IACb,GAAG,0BAAW,CAAC,SAAS;IACxB,MAAM,EAAE,YAAK,CAAC,OAAO,CAAC;QACpB,WAAW,EACT,8FAA8F;QAChG,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,IAAI;KACb,CAAC;IACF,EAAE,EAAE,YAAK,CAAC,MAAM,CAAC;QACf,WAAW,EAAE,sEAAsE;KACpF,CAAC;CACH,CAAC;kBArBiB,eAAe"}
@@ -13,9 +13,5 @@ export default class IosTunnelStop extends BaseCommand {
13
13
  daemon: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
14
14
  };
15
15
  run(): Promise<void>;
16
- private stopRemoteTunnel;
17
- private stopLocalOwners;
18
- private signalOwnerAndRefreshIdentity;
19
- private waitForPIDExit;
20
16
  }
21
17
  //# sourceMappingURL=stop.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../../../src/commands/ios/tunnel/stop.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAmBpD,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,WAAW;IACpD,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;YAkCZ,gBAAgB;YAoBhB,eAAe;YAuDf,6BAA6B;YAW7B,cAAc;CAK7B"}
1
+ {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../../../src/commands/ios/tunnel/stop.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAIpD,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,WAAW;IACpD,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"}
@@ -1,10 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const core_1 = require("@oclif/core");
4
- const api_1 = require("@limrun/api");
5
4
  const base_command_1 = require("../../../base-command");
6
5
  const instance_client_factory_1 = require("../../../lib/instance-client-factory");
7
- const ios_tunnel_process_1 = require("../../../lib/ios-tunnel-process");
6
+ const tunnel_command_1 = require("../../../lib/tunnel-command");
8
7
  class IosTunnelStop extends base_command_1.BaseCommand {
9
8
  async run() {
10
9
  const { flags } = await this.parse(IosTunnelStop);
@@ -14,117 +13,20 @@ class IosTunnelStop extends base_command_1.BaseCommand {
14
13
  }
15
14
  await this.withAuth(async () => {
16
15
  const resolvedInstance = this.resolveIosInstance(flags.id);
17
- const ownerSnapshot = (0, ios_tunnel_process_1.listTunnelProcesses)(resolvedInstance.id);
18
- const remote = await this.stopRemoteTunnel(resolvedInstance);
19
- const expectedTunnelId = remote.outcome === 'none' ? undefined : remote.tunnelId;
20
- const owners = (0, ios_tunnel_process_1.selectTunnelOwnersForStop)(ownerSnapshot, expectedTunnelId);
21
- const local = await this.stopLocalOwners(resolvedInstance.id, owners, remote);
22
- if (this.isJsonEnabled()) {
23
- this.outputJson({
24
- instanceId: resolvedInstance.id,
25
- ...(remote.outcome === 'none' ? {} : { tunnelId: remote.tunnelId }),
26
- outcome: remote.outcome,
27
- localProcessesStopped: local.processesStopped,
28
- localRecordsCleaned: local.recordsCleaned,
29
- });
30
- }
31
- else if (remote.outcome === 'stopped') {
32
- this.output(`Stopped destination tunnel ${remote.tunnelId}.`);
33
- }
34
- else if (remote.outcome === 'gone') {
35
- this.output(`Destination tunnel ${remote.tunnelId} was already gone.`);
36
- }
37
- else if (local.processesStopped > 0 || local.recordsCleaned > 0) {
38
- this.output('Cleaned local destination tunnel ownership.');
39
- }
40
- else {
41
- this.output('No active destination tunnel.');
42
- }
16
+ await (0, tunnel_command_1.runTunnelStop)({
17
+ instanceId: resolvedInstance.id,
18
+ connect: async () => {
19
+ const { client, disconnect } = await (0, instance_client_factory_1.getIosInstanceClient)(this.client, resolvedInstance);
20
+ return {
21
+ getTunnelStatus: () => client.getTunnelStatus(),
22
+ stopTunnel: (tunnelId) => client.stopTunnel(tunnelId),
23
+ disconnect,
24
+ };
25
+ },
26
+ io: this.tunnelCommandIO(),
27
+ });
43
28
  });
44
29
  }
45
- async stopRemoteTunnel(resolvedInstance) {
46
- const { client, disconnect } = await (0, instance_client_factory_1.getIosInstanceClient)(this.client, resolvedInstance);
47
- try {
48
- const status = await client.getTunnelStatus();
49
- if (!status.active)
50
- return { outcome: 'none' };
51
- const tunnelId = status.active.tunnelId;
52
- try {
53
- await client.stopTunnel(tunnelId);
54
- }
55
- catch (error) {
56
- if ((0, ios_tunnel_process_1.stopTunnelErrorIsNotFound)(error)) {
57
- return { outcome: 'gone', tunnelId };
58
- }
59
- throw error;
60
- }
61
- return { outcome: 'stopped', tunnelId };
62
- }
63
- finally {
64
- disconnect();
65
- }
66
- }
67
- async stopLocalOwners(instanceId, owners, remote) {
68
- const expectedTunnelId = remote.outcome === 'none' ? undefined : remote.tunnelId;
69
- let processesStopped = 0;
70
- let recordsCleaned = 0;
71
- const retainedOwners = [];
72
- for (const snapshot of owners) {
73
- let state = (0, ios_tunnel_process_1.loadTunnelProcess)(instanceId, snapshot.owner) ?? snapshot;
74
- let identity = (0, ios_tunnel_process_1.tunnelOwnerProcessIdentity)(state);
75
- const wasRunning = identity === 'match';
76
- if (identity === 'match' && remote.outcome === 'stopped') {
77
- await this.waitForPIDExit(state.pid, 50);
78
- }
79
- state = (0, ios_tunnel_process_1.loadTunnelProcess)(instanceId, state.owner) ?? state;
80
- identity = (0, ios_tunnel_process_1.tunnelOwnerProcessIdentity)(state);
81
- if (!(0, ios_tunnel_process_1.tunnelOwnerRemainsSelectedForStop)(snapshot, state, expectedTunnelId)) {
82
- if (identity === 'missing' || identity === 'mismatch') {
83
- if ((0, ios_tunnel_process_1.clearTunnelProcess)(instanceId, state.owner)) {
84
- recordsCleaned++;
85
- }
86
- else {
87
- retainedOwners.push(state);
88
- }
89
- }
90
- continue;
91
- }
92
- if (identity === 'match') {
93
- identity = await this.signalOwnerAndRefreshIdentity(state, 'SIGTERM', 20);
94
- }
95
- if (identity === 'match') {
96
- identity = await this.signalOwnerAndRefreshIdentity(state, 'SIGKILL', 20);
97
- }
98
- if (identity === 'match' || identity === 'unknown') {
99
- retainedOwners.push(state);
100
- continue;
101
- }
102
- if (!(0, ios_tunnel_process_1.clearTunnelProcess)(instanceId, state.owner)) {
103
- retainedOwners.push(state);
104
- continue;
105
- }
106
- recordsCleaned++;
107
- if (wasRunning)
108
- processesStopped++;
109
- }
110
- if (retainedOwners.length > 0) {
111
- this.error(`Could not verify that ${retainedOwners.length} local tunnel process(es) exited. ` +
112
- `Ownership records were retained: ${retainedOwners.map((state) => state.logPath).join(', ')}`);
113
- }
114
- return { processesStopped, recordsCleaned };
115
- }
116
- async signalOwnerAndRefreshIdentity(state, signal, attempts) {
117
- const result = (0, ios_tunnel_process_1.signalTunnelOwner)(state, signal);
118
- if (result !== 'signaled')
119
- return result;
120
- await this.waitForPIDExit(state.pid, attempts);
121
- return (0, ios_tunnel_process_1.tunnelOwnerProcessIdentity)(state);
122
- }
123
- async waitForPIDExit(pid, attempts) {
124
- for (let attempt = 0; attempt < attempts && (0, ios_tunnel_process_1.isProcessAlive)(pid); attempt++) {
125
- await (0, api_1.defaultSleep)(100);
126
- }
127
- }
128
30
  }
129
31
  IosTunnelStop.summary = 'Stop the active destination tunnel';
130
32
  IosTunnelStop.description = 'Stop the instance-authoritative tunnel by its current ID, then gracefully stop and, if necessary, force-stop verified local detached owners.';