lim 0.29.1 → 0.29.3

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 (40) 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/launch-app.d.ts.map +1 -1
  15. package/dist/commands/ios/launch-app.js +2 -2
  16. package/dist/commands/ios/launch-app.js.map +1 -1
  17. package/dist/commands/ios/tunnel/index.d.ts +29 -0
  18. package/dist/commands/ios/tunnel/index.d.ts.map +1 -0
  19. package/dist/commands/ios/tunnel/index.js +302 -0
  20. package/dist/commands/ios/tunnel/index.js.map +1 -0
  21. package/dist/commands/ios/tunnel/status.d.ts +17 -0
  22. package/dist/commands/ios/tunnel/status.d.ts.map +1 -0
  23. package/dist/commands/ios/tunnel/status.js +79 -0
  24. package/dist/commands/ios/tunnel/status.js.map +1 -0
  25. package/dist/commands/ios/tunnel/stop.d.ts +21 -0
  26. package/dist/commands/ios/tunnel/stop.d.ts.map +1 -0
  27. package/dist/commands/ios/tunnel/stop.js +148 -0
  28. package/dist/commands/ios/tunnel/stop.js.map +1 -0
  29. package/dist/commands/xcode/build.d.ts.map +1 -1
  30. package/dist/commands/xcode/build.js +6 -4
  31. package/dist/commands/xcode/build.js.map +1 -1
  32. package/dist/lib/ios-tunnel-process.d.ts +70 -0
  33. package/dist/lib/ios-tunnel-process.d.ts.map +1 -0
  34. package/dist/lib/ios-tunnel-process.js +502 -0
  35. package/dist/lib/ios-tunnel-process.js.map +1 -0
  36. package/dist/lib/ios-tunnel-process.test.d.ts +2 -0
  37. package/dist/lib/ios-tunnel-process.test.d.ts.map +1 -0
  38. package/dist/lib/ios-tunnel-process.test.js +339 -0
  39. package/dist/lib/ios-tunnel-process.test.js.map +1 -0
  40. package/package.json +3 -3
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/ios/tunnel/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { BaseCommand } from '../../../base-command';
2
+ export default class IosTunnelStatus 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/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"}
@@ -0,0 +1,79 @@
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 ios_tunnel_process_1 = require("../../../lib/ios-tunnel-process");
7
+ class IosTunnelStatus extends base_command_1.BaseCommand {
8
+ async run() {
9
+ const { flags } = await this.parse(IosTunnelStatus);
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.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)}`);
39
+ }
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
+ }
57
+ });
58
+ }
59
+ }
60
+ IosTunnelStatus.summary = 'Show the active destination tunnel';
61
+ IosTunnelStatus.description = 'Query the instance-authoritative tunnel state, most recent failure, and any local detached owner.';
62
+ IosTunnelStatus.examples = [
63
+ '<%= config.bin %> ios tunnel status --id <instance-ID>',
64
+ '<%= config.bin %> ios tunnel status --id <instance-ID> --json',
65
+ ];
66
+ IosTunnelStatus.flags = {
67
+ ...base_command_1.BaseCommand.baseFlags,
68
+ create: core_1.Flags.boolean({
69
+ description: 'Create a replacement instance if the target is gone. Disabled by default for status queries.',
70
+ default: false,
71
+ allowNo: true,
72
+ hidden: true,
73
+ }),
74
+ id: core_1.Flags.string({
75
+ description: 'iOS instance ID to query. Defaults to the last created iOS instance.',
76
+ }),
77
+ };
78
+ exports.default = IosTunnelStatus;
79
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../../src/commands/ios/tunnel/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { BaseCommand } from '../../../base-command';
2
+ export default class IosTunnelStop 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
+ private stopRemoteTunnel;
17
+ private stopLocalOwners;
18
+ private signalOwnerAndRefreshIdentity;
19
+ private waitForPIDExit;
20
+ }
21
+ //# sourceMappingURL=stop.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@oclif/core");
4
+ const api_1 = require("@limrun/api");
5
+ const base_command_1 = require("../../../base-command");
6
+ const instance_client_factory_1 = require("../../../lib/instance-client-factory");
7
+ const ios_tunnel_process_1 = require("../../../lib/ios-tunnel-process");
8
+ class IosTunnelStop extends base_command_1.BaseCommand {
9
+ async run() {
10
+ const { flags } = await this.parse(IosTunnelStop);
11
+ this.setParsedFlags(flags);
12
+ if (flags.create) {
13
+ this.error('Tunnel stop cannot create a replacement instance.');
14
+ }
15
+ await this.withAuth(async () => {
16
+ 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
+ }
43
+ });
44
+ }
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
+ }
129
+ IosTunnelStop.summary = 'Stop the active destination tunnel';
130
+ IosTunnelStop.description = 'Stop the instance-authoritative tunnel by its current ID, then gracefully stop and, if necessary, force-stop verified local detached owners.';
131
+ IosTunnelStop.examples = [
132
+ '<%= config.bin %> ios tunnel stop --id <instance-ID>',
133
+ '<%= config.bin %> ios tunnel stop --id <instance-ID> --json',
134
+ ];
135
+ IosTunnelStop.flags = {
136
+ ...base_command_1.BaseCommand.baseFlags,
137
+ create: core_1.Flags.boolean({
138
+ description: 'Create a replacement instance if the target is gone. Disabled by default for stop.',
139
+ default: false,
140
+ allowNo: true,
141
+ hidden: true,
142
+ }),
143
+ id: core_1.Flags.string({
144
+ description: 'iOS instance ID to stop. Defaults to the last created iOS instance.',
145
+ }),
146
+ };
147
+ exports.default = IosTunnelStop;
148
+ //# sourceMappingURL=stop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../../src/commands/ios/tunnel/stop.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/commands/xcode/build.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAwCjD,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,WAAW;IACjD,MAAM,CAAC,OAAO,SAAwC;IACtD,MAAM,CAAC,WAAW,SACgS;IAElT,MAAM,CAAC,QAAQ,WA4Bb;IAEF,MAAM,CAAC,IAAI;;MAKT;IAEF,MAAM,CAAC,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAyKV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;YAsSZ,mBAAmB;YAgBnB,wBAAwB;YAexB,cAAc;YAQd,oBAAoB;YAapB,yBAAyB;YAazB,yBAAyB;CAwBxC"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/commands/xcode/build.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAwCjD,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,WAAW;IACjD,MAAM,CAAC,OAAO,SAAwC;IACtD,MAAM,CAAC,WAAW,SACgS;IAElT,MAAM,CAAC,QAAQ,WA4Bb;IAEF,MAAM,CAAC,IAAI;;MAKT;IAEF,MAAM,CAAC,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAyKV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;YA0SZ,mBAAmB;YAgBnB,wBAAwB;YAexB,cAAc;YAQd,oBAAoB;YAapB,yBAAyB;YAazB,yBAAyB;CAwBxC"}
@@ -133,10 +133,12 @@ class XcodeBuild extends base_command_1.BaseCommand {
133
133
  }
134
134
  const cloudSigning = await this.buildCloudSigningOptions(flags);
135
135
  if (cloudSigning) {
136
- if (flags.sdk && flags.sdk !== 'iphoneos') {
137
- this.error('Cloud signing requires --sdk iphoneos.');
136
+ if (flags.sdk && !DEVICE_SDKS.has(flags.sdk)) {
137
+ this.error('Cloud signing is only supported for device SDK builds. Use --sdk iphoneos or --sdk watchos.');
138
+ }
139
+ if (!flags.sdk) {
140
+ settings.sdk = 'iphoneos';
138
141
  }
139
- settings.sdk = 'iphoneos';
140
142
  options.cloudSigning = cloudSigning;
141
143
  }
142
144
  if (!flags['upload-to-appstore'] &&
@@ -490,7 +492,7 @@ XcodeBuild.flags = {
490
492
  multipleNonGreedy: true,
491
493
  }),
492
494
  'signing-method': core_1.Flags.string({
493
- description: 'Use Apple cloud signing during archive export. Distribution methods require the ASC key to have access to cloud-managed distribution certificates.',
495
+ description: 'Use Apple cloud signing during archive export. Supports device SDK builds (--sdk iphoneos or --sdk watchos). Distribution methods require the ASC key to have access to cloud-managed distribution certificates.',
494
496
  options: ['app-store-connect', 'release-testing', 'debugging'],
495
497
  }),
496
498
  'team-id': core_1.Flags.string({