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.
- package/dist/base-command.d.ts +9 -0
- package/dist/base-command.d.ts.map +1 -1
- package/dist/base-command.js +68 -14
- package/dist/base-command.js.map +1 -1
- package/dist/commands/android/app-logs.d.ts +17 -0
- package/dist/commands/android/app-logs.d.ts.map +1 -0
- package/dist/commands/android/app-logs.js +35 -0
- package/dist/commands/android/app-logs.js.map +1 -0
- package/dist/commands/android/create.d.ts +4 -0
- package/dist/commands/android/create.d.ts.map +1 -1
- package/dist/commands/android/create.js +45 -0
- package/dist/commands/android/create.js.map +1 -1
- package/dist/commands/android/events.d.ts +17 -0
- package/dist/commands/android/events.d.ts.map +1 -0
- package/dist/commands/android/events.js +35 -0
- package/dist/commands/android/events.js.map +1 -0
- package/dist/commands/android/record.d.ts +2 -0
- package/dist/commands/android/record.d.ts.map +1 -1
- package/dist/commands/android/record.js +27 -3
- package/dist/commands/android/record.js.map +1 -1
- package/dist/commands/android/recordings.d.ts +17 -0
- package/dist/commands/android/recordings.d.ts.map +1 -0
- package/dist/commands/android/recordings.js +35 -0
- package/dist/commands/android/recordings.js.map +1 -0
- package/dist/commands/android/sync.d.ts.map +1 -1
- package/dist/commands/android/sync.js +3 -3
- package/dist/commands/android/sync.js.map +1 -1
- package/dist/commands/android/tunnel/index.d.ts +29 -0
- package/dist/commands/android/tunnel/index.d.ts.map +1 -0
- package/dist/commands/android/tunnel/index.js +170 -0
- package/dist/commands/android/tunnel/index.js.map +1 -0
- package/dist/commands/android/tunnel/index.test.d.ts +2 -0
- package/dist/commands/android/tunnel/index.test.d.ts.map +1 -0
- package/dist/commands/android/tunnel/index.test.js +66 -0
- package/dist/commands/android/tunnel/index.test.js.map +1 -0
- package/dist/commands/android/tunnel/status.d.ts +17 -0
- package/dist/commands/android/tunnel/status.d.ts.map +1 -0
- package/dist/commands/android/tunnel/status.js +61 -0
- package/dist/commands/android/tunnel/status.js.map +1 -0
- package/dist/commands/android/tunnel/stop.d.ts +17 -0
- package/dist/commands/android/tunnel/stop.d.ts.map +1 -0
- package/dist/commands/android/tunnel/stop.js +50 -0
- package/dist/commands/android/tunnel/stop.js.map +1 -0
- package/dist/commands/ios/app-logs.d.ts +17 -0
- package/dist/commands/ios/app-logs.d.ts.map +1 -0
- package/dist/commands/ios/app-logs.js +35 -0
- package/dist/commands/ios/app-logs.js.map +1 -0
- package/dist/commands/ios/create.d.ts +4 -0
- package/dist/commands/ios/create.d.ts.map +1 -1
- package/dist/commands/ios/create.js +45 -0
- package/dist/commands/ios/create.js.map +1 -1
- package/dist/commands/ios/events.d.ts +17 -0
- package/dist/commands/ios/events.d.ts.map +1 -0
- package/dist/commands/ios/events.js +35 -0
- package/dist/commands/ios/events.js.map +1 -0
- package/dist/commands/ios/launch-app.js +1 -1
- package/dist/commands/ios/launch-app.js.map +1 -1
- package/dist/commands/ios/record.d.ts +2 -0
- package/dist/commands/ios/record.d.ts.map +1 -1
- package/dist/commands/ios/record.js +27 -3
- package/dist/commands/ios/record.js.map +1 -1
- package/dist/commands/ios/recordings.d.ts +17 -0
- package/dist/commands/ios/recordings.d.ts.map +1 -0
- package/dist/commands/ios/recordings.js +35 -0
- package/dist/commands/ios/recordings.js.map +1 -0
- package/dist/commands/ios/sync.d.ts.map +1 -1
- package/dist/commands/ios/sync.js +3 -3
- package/dist/commands/ios/sync.js.map +1 -1
- package/dist/commands/ios/tunnel/index.d.ts +3 -9
- package/dist/commands/ios/tunnel/index.d.ts.map +1 -1
- package/dist/commands/ios/tunnel/index.js +33 -239
- package/dist/commands/ios/tunnel/index.js.map +1 -1
- package/dist/commands/ios/tunnel/status.d.ts.map +1 -1
- package/dist/commands/ios/tunnel/status.js +17 -41
- package/dist/commands/ios/tunnel/status.js.map +1 -1
- package/dist/commands/ios/tunnel/stop.d.ts +0 -4
- package/dist/commands/ios/tunnel/stop.d.ts.map +1 -1
- package/dist/commands/ios/tunnel/stop.js +13 -111
- package/dist/commands/ios/tunnel/stop.js.map +1 -1
- package/dist/lib/duration.d.ts +5 -0
- package/dist/lib/duration.d.ts.map +1 -1
- package/dist/lib/duration.js +21 -0
- package/dist/lib/duration.js.map +1 -1
- package/dist/lib/session-artifacts.d.ts +11 -0
- package/dist/lib/session-artifacts.d.ts.map +1 -0
- package/dist/lib/session-artifacts.js +30 -0
- package/dist/lib/session-artifacts.js.map +1 -0
- package/dist/lib/session-captures.d.ts +41 -0
- package/dist/lib/session-captures.d.ts.map +1 -0
- package/dist/lib/session-captures.js +55 -0
- package/dist/lib/session-captures.js.map +1 -0
- package/dist/lib/tunnel-command.d.ts +98 -0
- package/dist/lib/tunnel-command.d.ts.map +1 -0
- package/dist/lib/tunnel-command.js +542 -0
- package/dist/lib/tunnel-command.js.map +1 -0
- package/dist/lib/tunnel-command.test.d.ts +2 -0
- package/dist/lib/tunnel-command.test.d.ts.map +1 -0
- package/dist/lib/tunnel-command.test.js +91 -0
- package/dist/lib/tunnel-command.test.js.map +1 -0
- package/dist/lib/tunnel-har.d.ts +14 -0
- package/dist/lib/tunnel-har.d.ts.map +1 -0
- package/dist/lib/tunnel-har.js +150 -0
- package/dist/lib/tunnel-har.js.map +1 -0
- package/dist/lib/tunnel-har.test.d.ts +2 -0
- package/dist/lib/tunnel-har.test.d.ts.map +1 -0
- package/dist/lib/tunnel-har.test.js +164 -0
- package/dist/lib/tunnel-har.test.js.map +1 -0
- package/dist/lib/tunnel-process.d.ts +98 -0
- package/dist/lib/tunnel-process.d.ts.map +1 -0
- package/dist/lib/{ios-tunnel-process.js → tunnel-process.js} +87 -97
- package/dist/lib/tunnel-process.js.map +1 -0
- package/dist/lib/tunnel-process.test.d.ts +2 -0
- package/dist/lib/tunnel-process.test.d.ts.map +1 -0
- package/dist/lib/tunnel-process.test.js +428 -0
- package/dist/lib/tunnel-process.test.js.map +1 -0
- package/package.json +2 -2
- package/dist/lib/ios-tunnel-process.d.ts +0 -70
- package/dist/lib/ios-tunnel-process.d.ts.map +0 -1
- package/dist/lib/ios-tunnel-process.js.map +0 -1
- package/dist/lib/ios-tunnel-process.test.d.ts +0 -2
- package/dist/lib/ios-tunnel-process.test.d.ts.map +0 -1
- package/dist/lib/ios-tunnel-process.test.js +0 -339
- 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
|
-
|
|
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
|
|
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":"
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
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.
|
|
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
|
-
|
|
238
|
-
|
|
239
|
-
|
|
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
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
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
|
|
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 --
|
|
272
|
-
'<%= config.bin %> ios tunnel --
|
|
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
|
-
|
|
282
|
-
description: 'Exact client-side TCP destination as localhost:port, IPv4:port, or [IPv6]:port. Repeat for more
|
|
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;
|
|
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
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
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":";;AAAA,sCAAoC;AACpC,wDAAoD;AACpD,kFAA4E;AAC5E,
|
|
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":"
|
|
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
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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.';
|