@limrun/api 0.16.0 → 0.17.0-rc.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/index.d.mts +1 -0
- package/index.d.mts.map +1 -1
- package/index.d.ts +1 -0
- package/index.d.ts.map +1 -1
- package/index.js +2 -1
- package/index.js.map +1 -1
- package/index.mjs +1 -0
- package/index.mjs.map +1 -1
- package/internal/tslib.js +4 -0
- package/ios-client.d.mts +207 -0
- package/ios-client.d.mts.map +1 -0
- package/ios-client.d.ts +207 -0
- package/ios-client.d.ts.map +1 -0
- package/ios-client.js +521 -0
- package/ios-client.js.map +1 -0
- package/ios-client.mjs +515 -0
- package/ios-client.mjs.map +1 -0
- package/package.json +11 -1
- package/src/index.ts +1 -0
- package/src/ios-client.ts +788 -0
- package/src/version.ts +1 -1
- package/version.d.mts +1 -1
- package/version.d.mts.map +1 -1
- package/version.d.ts +1 -1
- package/version.d.ts.map +1 -1
- package/version.js +1 -1
- package/version.js.map +1 -1
- package/version.mjs +1 -1
- package/version.mjs.map +1 -1
package/ios-client.js
ADDED
|
@@ -0,0 +1,521 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SimctlExecution = void 0;
|
|
4
|
+
exports.createInstanceClient = createInstanceClient;
|
|
5
|
+
const tslib_1 = require("./internal/tslib.js");
|
|
6
|
+
const ws_1 = require("ws");
|
|
7
|
+
const fs_1 = tslib_1.__importDefault(require("fs"));
|
|
8
|
+
const events_1 = require("events");
|
|
9
|
+
/**
|
|
10
|
+
* Handle for a running simctl command execution.
|
|
11
|
+
*
|
|
12
|
+
* This class extends EventEmitter and provides streaming access to command output.
|
|
13
|
+
* Methods starting with underscore (_) are internal and should not be called directly.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* const execution = client.simctl(['boot', 'device-id']);
|
|
18
|
+
*
|
|
19
|
+
* // Listen to raw output
|
|
20
|
+
* execution.on('stdout', (data) => console.log(data.toString()));
|
|
21
|
+
*
|
|
22
|
+
* // Or listen line-by-line (more convenient for most use cases)
|
|
23
|
+
* execution.on('line-stdout', (line) => console.log('Output:', line));
|
|
24
|
+
* execution.on('line-stderr', (line) => console.error('Error:', line));
|
|
25
|
+
*
|
|
26
|
+
* execution.on('exit', (code) => console.log('Exit code:', code));
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
class SimctlExecution extends events_1.EventEmitter {
|
|
30
|
+
get isRunning() {
|
|
31
|
+
return !this.completed;
|
|
32
|
+
}
|
|
33
|
+
constructor(stopCallback) {
|
|
34
|
+
super();
|
|
35
|
+
this.stdoutChunks = [];
|
|
36
|
+
this.stderrChunks = [];
|
|
37
|
+
this.stdoutLineBuffer = '';
|
|
38
|
+
this.stderrLineBuffer = '';
|
|
39
|
+
this.exitCodeValue = null;
|
|
40
|
+
this.completed = false;
|
|
41
|
+
this.waitPromise = null;
|
|
42
|
+
this.stopCallback = null;
|
|
43
|
+
this.stopCallback = stopCallback;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Register an event listener for stdout, stderr, line-stdout, line-stderr, exit, or error events.
|
|
47
|
+
* @param event The event name
|
|
48
|
+
* @param listener The callback function for this event
|
|
49
|
+
*/
|
|
50
|
+
on(event, listener) {
|
|
51
|
+
return super.on(event, listener);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Register a one-time event listener that will be removed after firing once.
|
|
55
|
+
* @param event The event name
|
|
56
|
+
* @param listener The callback function for this event
|
|
57
|
+
*/
|
|
58
|
+
once(event, listener) {
|
|
59
|
+
return super.once(event, listener);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Remove an event listener.
|
|
63
|
+
* @param event The event name
|
|
64
|
+
* @param listener The callback function to remove
|
|
65
|
+
*/
|
|
66
|
+
off(event, listener) {
|
|
67
|
+
return super.off(event, listener);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Wait for the command to complete and get the full result.
|
|
71
|
+
* This accumulates all stdout/stderr chunks in memory.
|
|
72
|
+
* @returns Promise that resolves with exit code and complete output
|
|
73
|
+
*/
|
|
74
|
+
wait() {
|
|
75
|
+
if (this.waitPromise) {
|
|
76
|
+
return this.waitPromise;
|
|
77
|
+
}
|
|
78
|
+
this.waitPromise = new Promise((resolve, reject) => {
|
|
79
|
+
if (this.completed) {
|
|
80
|
+
resolve({
|
|
81
|
+
code: this.exitCodeValue,
|
|
82
|
+
stdout: Buffer.concat(this.stdoutChunks),
|
|
83
|
+
stderr: Buffer.concat(this.stderrChunks),
|
|
84
|
+
});
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
this.once('exit', (code) => {
|
|
88
|
+
resolve({
|
|
89
|
+
code,
|
|
90
|
+
stdout: Buffer.concat(this.stdoutChunks),
|
|
91
|
+
stderr: Buffer.concat(this.stderrChunks),
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
this.once('error', (error) => {
|
|
95
|
+
reject(error);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
return this.waitPromise;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Stop the running simctl command (if supported by server).
|
|
102
|
+
* This cleans up the execution tracking.
|
|
103
|
+
*/
|
|
104
|
+
stop() {
|
|
105
|
+
if (this.stopCallback) {
|
|
106
|
+
this.stopCallback();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/** @internal - Handle stdout data from server */
|
|
110
|
+
_handleStdout(data) {
|
|
111
|
+
this.stdoutChunks.push(data);
|
|
112
|
+
this.emit('stdout', data);
|
|
113
|
+
// Process line-by-line
|
|
114
|
+
this.stdoutLineBuffer += data.toString('utf-8');
|
|
115
|
+
const lines = this.stdoutLineBuffer.split('\n');
|
|
116
|
+
// Keep the last incomplete line in the buffer
|
|
117
|
+
this.stdoutLineBuffer = lines.pop() || '';
|
|
118
|
+
// Emit complete lines
|
|
119
|
+
for (const line of lines) {
|
|
120
|
+
this.emit('line-stdout', line);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/** @internal - Handle stderr data from server */
|
|
124
|
+
_handleStderr(data) {
|
|
125
|
+
this.stderrChunks.push(data);
|
|
126
|
+
this.emit('stderr', data);
|
|
127
|
+
// Process line-by-line
|
|
128
|
+
this.stderrLineBuffer += data.toString('utf-8');
|
|
129
|
+
const lines = this.stderrLineBuffer.split('\n');
|
|
130
|
+
// Keep the last incomplete line in the buffer
|
|
131
|
+
this.stderrLineBuffer = lines.pop() || '';
|
|
132
|
+
// Emit complete lines
|
|
133
|
+
for (const line of lines) {
|
|
134
|
+
this.emit('line-stderr', line);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/** @internal - Handle exit code from server */
|
|
138
|
+
_handleExit(code) {
|
|
139
|
+
// Emit any remaining partial lines before exit
|
|
140
|
+
if (this.stdoutLineBuffer) {
|
|
141
|
+
this.emit('line-stdout', this.stdoutLineBuffer);
|
|
142
|
+
this.stdoutLineBuffer = '';
|
|
143
|
+
}
|
|
144
|
+
if (this.stderrLineBuffer) {
|
|
145
|
+
this.emit('line-stderr', this.stderrLineBuffer);
|
|
146
|
+
this.stderrLineBuffer = '';
|
|
147
|
+
}
|
|
148
|
+
this.exitCodeValue = code;
|
|
149
|
+
this.completed = true;
|
|
150
|
+
this.emit('exit', code);
|
|
151
|
+
}
|
|
152
|
+
/** @internal - Handle errors from server or connection */
|
|
153
|
+
_handleError(error) {
|
|
154
|
+
this.completed = true;
|
|
155
|
+
this.emit('error', error);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
exports.SimctlExecution = SimctlExecution;
|
|
159
|
+
/**
|
|
160
|
+
* Creates a client for interacting with a Limrun iOS instance
|
|
161
|
+
* @param options Configuration options including webrtcUrl, token and log level
|
|
162
|
+
* @returns An InstanceClient for controlling the instance
|
|
163
|
+
*/
|
|
164
|
+
async function createInstanceClient(options) {
|
|
165
|
+
const endpointWebSocketUrl = `${options.apiUrl}/endpointWebSocket?token=${options.token}`;
|
|
166
|
+
const logLevel = options.logLevel ?? 'info';
|
|
167
|
+
const maxReconnectAttempts = options.maxReconnectAttempts ?? 6;
|
|
168
|
+
const reconnectDelay = options.reconnectDelay ?? 1000;
|
|
169
|
+
const maxReconnectDelay = options.maxReconnectDelay ?? 30000;
|
|
170
|
+
let ws = undefined;
|
|
171
|
+
let connectionState = 'connecting';
|
|
172
|
+
let reconnectAttempts = 0;
|
|
173
|
+
let reconnectTimeout;
|
|
174
|
+
let intentionalDisconnect = false;
|
|
175
|
+
const screenshotRequests = new Map();
|
|
176
|
+
const simctlExecutions = new Map();
|
|
177
|
+
const stateChangeCallbacks = new Set();
|
|
178
|
+
// Logger functions
|
|
179
|
+
const logger = {
|
|
180
|
+
debug: (...args) => {
|
|
181
|
+
if (logLevel === 'debug')
|
|
182
|
+
console.log(...args);
|
|
183
|
+
},
|
|
184
|
+
info: (...args) => {
|
|
185
|
+
if (logLevel === 'info' || logLevel === 'debug')
|
|
186
|
+
console.log(...args);
|
|
187
|
+
},
|
|
188
|
+
warn: (...args) => {
|
|
189
|
+
if (logLevel === 'warn' || logLevel === 'info' || logLevel === 'debug')
|
|
190
|
+
console.warn(...args);
|
|
191
|
+
},
|
|
192
|
+
error: (...args) => {
|
|
193
|
+
if (logLevel !== 'none')
|
|
194
|
+
console.error(...args);
|
|
195
|
+
},
|
|
196
|
+
};
|
|
197
|
+
const updateConnectionState = (newState) => {
|
|
198
|
+
if (connectionState !== newState) {
|
|
199
|
+
connectionState = newState;
|
|
200
|
+
logger.debug(`Connection state changed to: ${newState}`);
|
|
201
|
+
stateChangeCallbacks.forEach((callback) => {
|
|
202
|
+
try {
|
|
203
|
+
callback(newState);
|
|
204
|
+
}
|
|
205
|
+
catch (err) {
|
|
206
|
+
logger.error('Error in connection state callback:', err);
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
const failPendingRequests = (reason) => {
|
|
212
|
+
screenshotRequests.forEach((request) => request.rejecter(new Error(reason)));
|
|
213
|
+
screenshotRequests.clear();
|
|
214
|
+
simctlExecutions.forEach((execution) => execution._handleError(new Error(reason)));
|
|
215
|
+
simctlExecutions.clear();
|
|
216
|
+
};
|
|
217
|
+
const cleanup = () => {
|
|
218
|
+
if (reconnectTimeout) {
|
|
219
|
+
clearTimeout(reconnectTimeout);
|
|
220
|
+
reconnectTimeout = undefined;
|
|
221
|
+
}
|
|
222
|
+
if (pingInterval) {
|
|
223
|
+
clearInterval(pingInterval);
|
|
224
|
+
pingInterval = undefined;
|
|
225
|
+
}
|
|
226
|
+
if (ws) {
|
|
227
|
+
ws.removeAllListeners();
|
|
228
|
+
if (ws.readyState === ws_1.WebSocket.OPEN || ws.readyState === ws_1.WebSocket.CONNECTING) {
|
|
229
|
+
ws.close();
|
|
230
|
+
}
|
|
231
|
+
ws = undefined;
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
let pingInterval;
|
|
235
|
+
return new Promise((resolveConnection, rejectConnection) => {
|
|
236
|
+
let hasResolved = false;
|
|
237
|
+
// Reconnection logic with exponential backoff
|
|
238
|
+
const scheduleReconnect = () => {
|
|
239
|
+
if (intentionalDisconnect) {
|
|
240
|
+
logger.debug('Skipping reconnection (intentional disconnect)');
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
if (reconnectAttempts >= maxReconnectAttempts) {
|
|
244
|
+
logger.error(`Max reconnection attempts (${maxReconnectAttempts}) reached. Giving up.`);
|
|
245
|
+
updateConnectionState('disconnected');
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
const currentDelay = Math.min(reconnectDelay * Math.pow(2, reconnectAttempts), maxReconnectDelay);
|
|
249
|
+
reconnectAttempts++;
|
|
250
|
+
logger.debug(`Scheduling reconnection attempt ${reconnectAttempts} in ${currentDelay}ms...`);
|
|
251
|
+
updateConnectionState('reconnecting');
|
|
252
|
+
reconnectTimeout = setTimeout(() => {
|
|
253
|
+
logger.debug(`Attempting to reconnect (attempt ${reconnectAttempts})...`);
|
|
254
|
+
setupWebSocket();
|
|
255
|
+
}, currentDelay);
|
|
256
|
+
};
|
|
257
|
+
const setupWebSocket = () => {
|
|
258
|
+
cleanup();
|
|
259
|
+
updateConnectionState('connecting');
|
|
260
|
+
ws = new ws_1.WebSocket(endpointWebSocketUrl);
|
|
261
|
+
ws.on('message', (data) => {
|
|
262
|
+
let message;
|
|
263
|
+
try {
|
|
264
|
+
message = JSON.parse(data.toString());
|
|
265
|
+
}
|
|
266
|
+
catch (e) {
|
|
267
|
+
logger.error({ data, error: e }, 'Failed to parse JSON message');
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
switch (message.type) {
|
|
271
|
+
case 'screenshot': {
|
|
272
|
+
if (!('dataUri' in message) || typeof message.dataUri !== 'string' || !('id' in message)) {
|
|
273
|
+
logger.warn('Received invalid screenshot message:', message);
|
|
274
|
+
break;
|
|
275
|
+
}
|
|
276
|
+
const screenshotMessage = message;
|
|
277
|
+
const request = screenshotRequests.get(screenshotMessage.id);
|
|
278
|
+
if (!request) {
|
|
279
|
+
logger.warn(`Received screenshot data for unknown or already handled session: ${screenshotMessage.id}`);
|
|
280
|
+
break;
|
|
281
|
+
}
|
|
282
|
+
logger.debug(`Received screenshot data URI for session ${screenshotMessage.id}.`);
|
|
283
|
+
request.resolver({ dataUri: screenshotMessage.dataUri });
|
|
284
|
+
screenshotRequests.delete(screenshotMessage.id);
|
|
285
|
+
break;
|
|
286
|
+
}
|
|
287
|
+
case 'screenshotError': {
|
|
288
|
+
if (!('message' in message) || !('id' in message)) {
|
|
289
|
+
logger.warn('Received invalid screenshot error message:', message);
|
|
290
|
+
break;
|
|
291
|
+
}
|
|
292
|
+
const errorMessage = message;
|
|
293
|
+
const request = screenshotRequests.get(errorMessage.id);
|
|
294
|
+
if (!request) {
|
|
295
|
+
logger.warn(`Received screenshot error for unknown or already handled session: ${errorMessage.id}`);
|
|
296
|
+
break;
|
|
297
|
+
}
|
|
298
|
+
logger.error(`Server reported an error capturing screenshot for session ${errorMessage.id}:`, errorMessage.message);
|
|
299
|
+
request.rejecter(new Error(errorMessage.message));
|
|
300
|
+
screenshotRequests.delete(errorMessage.id);
|
|
301
|
+
break;
|
|
302
|
+
}
|
|
303
|
+
case 'simctlStream': {
|
|
304
|
+
if (!('id' in message)) {
|
|
305
|
+
logger.warn('Received invalid simctl stream message:', message);
|
|
306
|
+
break;
|
|
307
|
+
}
|
|
308
|
+
const streamMessage = message;
|
|
309
|
+
const execution = simctlExecutions.get(streamMessage.id);
|
|
310
|
+
if (!execution) {
|
|
311
|
+
logger.warn(`Received simctl stream for unknown or already completed execution: ${streamMessage.id}`);
|
|
312
|
+
break;
|
|
313
|
+
}
|
|
314
|
+
// Handle stdout if present
|
|
315
|
+
if (streamMessage.stdout) {
|
|
316
|
+
try {
|
|
317
|
+
const stdoutBuffer = Buffer.from(streamMessage.stdout, 'base64');
|
|
318
|
+
execution._handleStdout(stdoutBuffer);
|
|
319
|
+
}
|
|
320
|
+
catch (err) {
|
|
321
|
+
logger.error('Failed to decode stdout data:', err);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
// Handle stderr if present
|
|
325
|
+
if (streamMessage.stderr) {
|
|
326
|
+
try {
|
|
327
|
+
const stderrBuffer = Buffer.from(streamMessage.stderr, 'base64');
|
|
328
|
+
execution._handleStderr(stderrBuffer);
|
|
329
|
+
}
|
|
330
|
+
catch (err) {
|
|
331
|
+
logger.error('Failed to decode stderr data:', err);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
// Handle exit code if present (final message)
|
|
335
|
+
if (streamMessage.exitCode !== undefined) {
|
|
336
|
+
logger.debug(`Simctl execution ${streamMessage.id} completed with exit code ${streamMessage.exitCode}`);
|
|
337
|
+
execution._handleExit(streamMessage.exitCode);
|
|
338
|
+
simctlExecutions.delete(streamMessage.id);
|
|
339
|
+
}
|
|
340
|
+
break;
|
|
341
|
+
}
|
|
342
|
+
case 'simctlError': {
|
|
343
|
+
if (!('message' in message) || !('id' in message)) {
|
|
344
|
+
logger.warn('Received invalid simctl error message:', message);
|
|
345
|
+
break;
|
|
346
|
+
}
|
|
347
|
+
const errorMessage = message;
|
|
348
|
+
const execution = simctlExecutions.get(errorMessage.id);
|
|
349
|
+
if (!execution) {
|
|
350
|
+
logger.warn(`Received simctl error for unknown or already handled execution: ${errorMessage.id}`);
|
|
351
|
+
break;
|
|
352
|
+
}
|
|
353
|
+
logger.error(`Server reported an error for simctl execution ${errorMessage.id}:`, errorMessage.message);
|
|
354
|
+
execution._handleError(new Error(errorMessage.message));
|
|
355
|
+
simctlExecutions.delete(errorMessage.id);
|
|
356
|
+
break;
|
|
357
|
+
}
|
|
358
|
+
default:
|
|
359
|
+
logger.warn('Received unexpected message type:', message);
|
|
360
|
+
break;
|
|
361
|
+
}
|
|
362
|
+
});
|
|
363
|
+
ws.on('error', (err) => {
|
|
364
|
+
logger.error('WebSocket error:', err.message);
|
|
365
|
+
if (!hasResolved && (ws?.readyState === ws_1.WebSocket.CONNECTING || ws?.readyState === ws_1.WebSocket.OPEN)) {
|
|
366
|
+
rejectConnection(err);
|
|
367
|
+
}
|
|
368
|
+
});
|
|
369
|
+
ws.on('close', () => {
|
|
370
|
+
if (pingInterval) {
|
|
371
|
+
clearInterval(pingInterval);
|
|
372
|
+
pingInterval = undefined;
|
|
373
|
+
}
|
|
374
|
+
const shouldReconnect = !intentionalDisconnect && connectionState !== 'disconnected';
|
|
375
|
+
updateConnectionState('disconnected');
|
|
376
|
+
logger.debug('Disconnected from server.');
|
|
377
|
+
failPendingRequests('Connection closed');
|
|
378
|
+
if (shouldReconnect) {
|
|
379
|
+
scheduleReconnect();
|
|
380
|
+
}
|
|
381
|
+
});
|
|
382
|
+
ws.on('open', () => {
|
|
383
|
+
logger.debug(`Connected to ${endpointWebSocketUrl}`);
|
|
384
|
+
reconnectAttempts = 0;
|
|
385
|
+
updateConnectionState('connected');
|
|
386
|
+
pingInterval = setInterval(() => {
|
|
387
|
+
if (ws && ws.readyState === ws_1.WebSocket.OPEN) {
|
|
388
|
+
ws.ping();
|
|
389
|
+
}
|
|
390
|
+
}, 30000);
|
|
391
|
+
if (!hasResolved) {
|
|
392
|
+
hasResolved = true;
|
|
393
|
+
resolveConnection({
|
|
394
|
+
screenshot,
|
|
395
|
+
disconnect,
|
|
396
|
+
getConnectionState,
|
|
397
|
+
onConnectionStateChange,
|
|
398
|
+
simctl,
|
|
399
|
+
cp,
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
});
|
|
403
|
+
};
|
|
404
|
+
const screenshot = async () => {
|
|
405
|
+
if (!ws || ws.readyState !== ws_1.WebSocket.OPEN) {
|
|
406
|
+
return Promise.reject(new Error('WebSocket is not connected or connection is not open.'));
|
|
407
|
+
}
|
|
408
|
+
const id = 'ts-client-' + Date.now();
|
|
409
|
+
const screenshotRequest = {
|
|
410
|
+
type: 'screenshot',
|
|
411
|
+
id,
|
|
412
|
+
};
|
|
413
|
+
return new Promise((resolve, reject) => {
|
|
414
|
+
logger.debug('Sending screenshot request:', screenshotRequest);
|
|
415
|
+
ws.send(JSON.stringify(screenshotRequest), (err) => {
|
|
416
|
+
if (err) {
|
|
417
|
+
logger.error('Failed to send screenshot request:', err);
|
|
418
|
+
reject(err);
|
|
419
|
+
}
|
|
420
|
+
});
|
|
421
|
+
const timeout = setTimeout(() => {
|
|
422
|
+
if (screenshotRequests.has(id)) {
|
|
423
|
+
logger.error(`Screenshot request timed out for session ${id}`);
|
|
424
|
+
screenshotRequests.get(id)?.rejecter(new Error('Screenshot request timed out'));
|
|
425
|
+
screenshotRequests.delete(id);
|
|
426
|
+
}
|
|
427
|
+
}, 30000);
|
|
428
|
+
screenshotRequests.set(id, {
|
|
429
|
+
resolver: (value) => {
|
|
430
|
+
clearTimeout(timeout);
|
|
431
|
+
resolve(value);
|
|
432
|
+
screenshotRequests.delete(id);
|
|
433
|
+
},
|
|
434
|
+
rejecter: (reason) => {
|
|
435
|
+
clearTimeout(timeout);
|
|
436
|
+
reject(reason);
|
|
437
|
+
screenshotRequests.delete(id);
|
|
438
|
+
},
|
|
439
|
+
});
|
|
440
|
+
});
|
|
441
|
+
};
|
|
442
|
+
const simctl = (args) => {
|
|
443
|
+
const id = 'ts-simctl-' + Date.now() + '-' + Math.random().toString(36).substring(7);
|
|
444
|
+
const cancelCallback = () => {
|
|
445
|
+
// Clean up execution tracking
|
|
446
|
+
simctlExecutions.delete(id);
|
|
447
|
+
logger.debug(`Simctl execution ${id} cancelled`);
|
|
448
|
+
};
|
|
449
|
+
const execution = new SimctlExecution(cancelCallback);
|
|
450
|
+
simctlExecutions.set(id, execution);
|
|
451
|
+
// Send request asynchronously
|
|
452
|
+
if (!ws || ws.readyState !== ws_1.WebSocket.OPEN) {
|
|
453
|
+
// Defer error to next tick to allow caller to attach listeners
|
|
454
|
+
process.nextTick(() => {
|
|
455
|
+
execution._handleError(new Error('WebSocket is not connected or connection is not open.'));
|
|
456
|
+
simctlExecutions.delete(id);
|
|
457
|
+
});
|
|
458
|
+
return execution;
|
|
459
|
+
}
|
|
460
|
+
const simctlRequest = {
|
|
461
|
+
type: 'simctl',
|
|
462
|
+
id,
|
|
463
|
+
args,
|
|
464
|
+
};
|
|
465
|
+
logger.debug('Sending simctl request:', simctlRequest);
|
|
466
|
+
ws.send(JSON.stringify(simctlRequest), (err) => {
|
|
467
|
+
if (err) {
|
|
468
|
+
logger.error('Failed to send simctl request:', err);
|
|
469
|
+
execution._handleError(err);
|
|
470
|
+
simctlExecutions.delete(id);
|
|
471
|
+
}
|
|
472
|
+
});
|
|
473
|
+
return execution;
|
|
474
|
+
};
|
|
475
|
+
const cp = async (name, filePath) => {
|
|
476
|
+
const fileStream = fs_1.default.createReadStream(filePath);
|
|
477
|
+
const uploadUrl = `${options.apiUrl}/files?name=${encodeURIComponent(name)}`;
|
|
478
|
+
try {
|
|
479
|
+
const response = await fetch(uploadUrl, {
|
|
480
|
+
method: 'PUT',
|
|
481
|
+
headers: {
|
|
482
|
+
'Content-Type': 'application/octet-stream',
|
|
483
|
+
'Content-Length': fs_1.default.statSync(filePath).size.toString(),
|
|
484
|
+
Authorization: `Bearer ${options.token}`,
|
|
485
|
+
},
|
|
486
|
+
body: fileStream,
|
|
487
|
+
duplex: 'half',
|
|
488
|
+
});
|
|
489
|
+
if (!response.ok) {
|
|
490
|
+
const errorBody = await response.text();
|
|
491
|
+
logger.debug(`Upload failed: ${response.status} ${errorBody}`);
|
|
492
|
+
throw new Error(`Upload failed: ${response.status} ${errorBody}`);
|
|
493
|
+
}
|
|
494
|
+
const result = (await response.json());
|
|
495
|
+
return result.path;
|
|
496
|
+
}
|
|
497
|
+
catch (err) {
|
|
498
|
+
logger.debug(`Failed to upload file ${filePath}:`, err);
|
|
499
|
+
throw err;
|
|
500
|
+
}
|
|
501
|
+
};
|
|
502
|
+
const disconnect = () => {
|
|
503
|
+
intentionalDisconnect = true;
|
|
504
|
+
cleanup();
|
|
505
|
+
updateConnectionState('disconnected');
|
|
506
|
+
failPendingRequests('Intentional disconnect');
|
|
507
|
+
logger.debug('Intentionally disconnected from WebSocket.');
|
|
508
|
+
};
|
|
509
|
+
const getConnectionState = () => {
|
|
510
|
+
return connectionState;
|
|
511
|
+
};
|
|
512
|
+
const onConnectionStateChange = (callback) => {
|
|
513
|
+
stateChangeCallbacks.add(callback);
|
|
514
|
+
return () => {
|
|
515
|
+
stateChangeCallbacks.delete(callback);
|
|
516
|
+
};
|
|
517
|
+
};
|
|
518
|
+
setupWebSocket();
|
|
519
|
+
});
|
|
520
|
+
}
|
|
521
|
+
//# sourceMappingURL=ios-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ios-client.js","sourceRoot":"","sources":["src/ios-client.ts"],"names":[],"mappings":";;;AAwWA,oDA2aC;;AAnxBD,2BAAqC;AACrC,oDAAoB;AACpB,mCAAsC;AAuLtC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAa,eAAgB,SAAQ,qBAAY;IAU/C,IAAW,SAAS;QAClB,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;IACzB,CAAC;IAED,YAAY,YAAwB;QAClC,KAAK,EAAE,CAAC;QAdF,iBAAY,GAAa,EAAE,CAAC;QAC5B,iBAAY,GAAa,EAAE,CAAC;QAC5B,qBAAgB,GAAG,EAAE,CAAC;QACtB,qBAAgB,GAAG,EAAE,CAAC;QACtB,kBAAa,GAAkB,IAAI,CAAC;QACpC,cAAS,GAAG,KAAK,CAAC;QAClB,gBAAW,GAAqE,IAAI,CAAC;QACrF,iBAAY,GAAwB,IAAI,CAAC;QAQ/C,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAED;;;;OAIG;IACM,EAAE,CAAwC,KAAQ,EAAE,QAAkC;QAC7F,OAAO,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,QAAe,CAAC,CAAC;IAC1C,CAAC;IAED;;;;OAIG;IACM,IAAI,CAAwC,KAAQ,EAAE,QAAkC;QAC/F,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,QAAe,CAAC,CAAC;IAC5C,CAAC;IAED;;;;OAIG;IACM,GAAG,CAAwC,KAAQ,EAAE,QAAkC;QAC9F,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,QAAe,CAAC,CAAC;IAC3C,CAAC;IAED;;;;OAIG;IACH,IAAI;QACF,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,WAAW,CAAC;QAC1B,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACjD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,OAAO,CAAC;oBACN,IAAI,EAAE,IAAI,CAAC,aAAc;oBACzB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;oBACxC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;iBACzC,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBACzB,OAAO,CAAC;oBACN,IAAI;oBACJ,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;oBACxC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;iBACzC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC3B,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,IAAI;QACF,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC;IACH,CAAC;IAED,iDAAiD;IACjD,aAAa,CAAC,IAAY;QACxB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAE1B,uBAAuB;QACvB,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChD,8CAA8C;QAC9C,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QAE1C,sBAAsB;QACtB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,iDAAiD;IACjD,aAAa,CAAC,IAAY;QACxB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAE1B,uBAAuB;QACvB,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChD,8CAA8C;QAC9C,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QAE1C,sBAAsB;QACtB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,WAAW,CAAC,IAAY;QACtB,+CAA+C;QAC/C,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAChD,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;QAC7B,CAAC;QACD,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAChD,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;QAC7B,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,0DAA0D;IAC1D,YAAY,CAAC,KAAY;QACvB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC5B,CAAC;CACF;AApJD,0CAoJC;AAED;;;;GAIG;AACI,KAAK,UAAU,oBAAoB,CAAC,OAA8B;IACvE,MAAM,oBAAoB,GAAG,GAAG,OAAO,CAAC,MAAM,4BAA4B,OAAO,CAAC,KAAK,EAAE,CAAC;IAC1F,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC;IAC5C,MAAM,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,IAAI,CAAC,CAAC;IAC/D,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC;IACtD,MAAM,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,KAAK,CAAC;IAE7D,IAAI,EAAE,GAA0B,SAAS,CAAC;IAC1C,IAAI,eAAe,GAAoB,YAAY,CAAC;IACpD,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,IAAI,gBAA4C,CAAC;IACjD,IAAI,qBAAqB,GAAG,KAAK,CAAC;IAElC,MAAM,kBAAkB,GAMpB,IAAI,GAAG,EAAE,CAAC;IAEd,MAAM,gBAAgB,GAAiC,IAAI,GAAG,EAAE,CAAC;IAEjE,MAAM,oBAAoB,GAAiC,IAAI,GAAG,EAAE,CAAC;IAErE,mBAAmB;IACnB,MAAM,MAAM,GAAG;QACb,KAAK,EAAE,CAAC,GAAG,IAAW,EAAE,EAAE;YACxB,IAAI,QAAQ,KAAK,OAAO;gBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;QACjD,CAAC;QACD,IAAI,EAAE,CAAC,GAAG,IAAW,EAAE,EAAE;YACvB,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,OAAO;gBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,EAAE,CAAC,GAAG,IAAW,EAAE,EAAE;YACvB,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,OAAO;gBAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAChG,CAAC;QACD,KAAK,EAAE,CAAC,GAAG,IAAW,EAAE,EAAE;YACxB,IAAI,QAAQ,KAAK,MAAM;gBAAE,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;QAClD,CAAC;KACF,CAAC;IAEF,MAAM,qBAAqB,GAAG,CAAC,QAAyB,EAAQ,EAAE;QAChE,IAAI,eAAe,KAAK,QAAQ,EAAE,CAAC;YACjC,eAAe,GAAG,QAAQ,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,gCAAgC,QAAQ,EAAE,CAAC,CAAC;YACzD,oBAAoB,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;gBACxC,IAAI,CAAC;oBACH,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACrB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,KAAK,CAAC,qCAAqC,EAAE,GAAG,CAAC,CAAC;gBAC3D,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,mBAAmB,GAAG,CAAC,MAAc,EAAQ,EAAE;QACnD,kBAAkB,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7E,kBAAkB,CAAC,KAAK,EAAE,CAAC;QAE3B,gBAAgB,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACnF,gBAAgB,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,GAAS,EAAE;QACzB,IAAI,gBAAgB,EAAE,CAAC;YACrB,YAAY,CAAC,gBAAgB,CAAC,CAAC;YAC/B,gBAAgB,GAAG,SAAS,CAAC;QAC/B,CAAC;QACD,IAAI,YAAY,EAAE,CAAC;YACjB,aAAa,CAAC,YAAY,CAAC,CAAC;YAC5B,YAAY,GAAG,SAAS,CAAC;QAC3B,CAAC;QACD,IAAI,EAAE,EAAE,CAAC;YACP,EAAE,CAAC,kBAAkB,EAAE,CAAC;YACxB,IAAI,EAAE,CAAC,UAAU,KAAK,cAAS,CAAC,IAAI,IAAI,EAAE,CAAC,UAAU,KAAK,cAAS,CAAC,UAAU,EAAE,CAAC;gBAC/E,EAAE,CAAC,KAAK,EAAE,CAAC;YACb,CAAC;YACD,EAAE,GAAG,SAAS,CAAC;QACjB,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,YAAwC,CAAC;IAE7C,OAAO,IAAI,OAAO,CAAiB,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,EAAE;QACzE,IAAI,WAAW,GAAG,KAAK,CAAC;QAExB,8CAA8C;QAC9C,MAAM,iBAAiB,GAAG,GAAS,EAAE;YACnC,IAAI,qBAAqB,EAAE,CAAC;gBAC1B,MAAM,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;gBAC/D,OAAO;YACT,CAAC;YAED,IAAI,iBAAiB,IAAI,oBAAoB,EAAE,CAAC;gBAC9C,MAAM,CAAC,KAAK,CAAC,8BAA8B,oBAAoB,uBAAuB,CAAC,CAAC;gBACxF,qBAAqB,CAAC,cAAc,CAAC,CAAC;gBACtC,OAAO;YACT,CAAC;YAED,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAiB,CAAC,EAAE,iBAAiB,CAAC,CAAC;YAElG,iBAAiB,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,mCAAmC,iBAAiB,OAAO,YAAY,OAAO,CAAC,CAAC;YAC7F,qBAAqB,CAAC,cAAc,CAAC,CAAC;YAEtC,gBAAgB,GAAG,UAAU,CAAC,GAAG,EAAE;gBACjC,MAAM,CAAC,KAAK,CAAC,oCAAoC,iBAAiB,MAAM,CAAC,CAAC;gBAC1E,cAAc,EAAE,CAAC;YACnB,CAAC,EAAE,YAAY,CAAC,CAAC;QACnB,CAAC,CAAC;QAEF,MAAM,cAAc,GAAG,GAAS,EAAE;YAChC,OAAO,EAAE,CAAC;YACV,qBAAqB,CAAC,YAAY,CAAC,CAAC;YAEpC,EAAE,GAAG,IAAI,cAAS,CAAC,oBAAoB,CAAC,CAAC;YAEzC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAU,EAAE,EAAE;gBAC9B,IAAI,OAAsB,CAAC;gBAC3B,IAAI,CAAC;oBACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACxC,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,8BAA8B,CAAC,CAAC;oBACjE,OAAO;gBACT,CAAC;gBAED,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;oBACrB,KAAK,YAAY,CAAC,CAAC,CAAC;wBAClB,IAAI,CAAC,CAAC,SAAS,IAAI,OAAO,CAAC,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,EAAE,CAAC;4BACzF,MAAM,CAAC,IAAI,CAAC,sCAAsC,EAAE,OAAO,CAAC,CAAC;4BAC7D,MAAM;wBACR,CAAC;wBAED,MAAM,iBAAiB,GAAG,OAA6B,CAAC;wBACxD,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;wBAE7D,IAAI,CAAC,OAAO,EAAE,CAAC;4BACb,MAAM,CAAC,IAAI,CACT,oEAAoE,iBAAiB,CAAC,EAAE,EAAE,CAC3F,CAAC;4BACF,MAAM;wBACR,CAAC;wBAED,MAAM,CAAC,KAAK,CAAC,4CAA4C,iBAAiB,CAAC,EAAE,GAAG,CAAC,CAAC;wBAClF,OAAO,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,iBAAiB,CAAC,OAAO,EAAE,CAAC,CAAC;wBACzD,kBAAkB,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;wBAChD,MAAM;oBACR,CAAC;oBACD,KAAK,iBAAiB,CAAC,CAAC,CAAC;wBACvB,IAAI,CAAC,CAAC,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,EAAE,CAAC;4BAClD,MAAM,CAAC,IAAI,CAAC,4CAA4C,EAAE,OAAO,CAAC,CAAC;4BACnE,MAAM;wBACR,CAAC;wBAED,MAAM,YAAY,GAAG,OAAkC,CAAC;wBACxD,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;wBAExD,IAAI,CAAC,OAAO,EAAE,CAAC;4BACb,MAAM,CAAC,IAAI,CACT,qEAAqE,YAAY,CAAC,EAAE,EAAE,CACvF,CAAC;4BACF,MAAM;wBACR,CAAC;wBAED,MAAM,CAAC,KAAK,CACV,6DAA6D,YAAY,CAAC,EAAE,GAAG,EAC/E,YAAY,CAAC,OAAO,CACrB,CAAC;wBACF,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;wBAClD,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;wBAC3C,MAAM;oBACR,CAAC;oBACD,KAAK,cAAc,CAAC,CAAC,CAAC;wBACpB,IAAI,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,EAAE,CAAC;4BACvB,MAAM,CAAC,IAAI,CAAC,yCAAyC,EAAE,OAAO,CAAC,CAAC;4BAChE,MAAM;wBACR,CAAC;wBAED,MAAM,aAAa,GAAG,OAA+B,CAAC;wBACtD,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;wBAEzD,IAAI,CAAC,SAAS,EAAE,CAAC;4BACf,MAAM,CAAC,IAAI,CACT,sEAAsE,aAAa,CAAC,EAAE,EAAE,CACzF,CAAC;4BACF,MAAM;wBACR,CAAC;wBAED,2BAA2B;wBAC3B,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;4BACzB,IAAI,CAAC;gCACH,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;gCACjE,SAAS,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;4BACxC,CAAC;4BAAC,OAAO,GAAG,EAAE,CAAC;gCACb,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;4BACrD,CAAC;wBACH,CAAC;wBAED,2BAA2B;wBAC3B,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;4BACzB,IAAI,CAAC;gCACH,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;gCACjE,SAAS,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;4BACxC,CAAC;4BAAC,OAAO,GAAG,EAAE,CAAC;gCACb,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;4BACrD,CAAC;wBACH,CAAC;wBAED,8CAA8C;wBAC9C,IAAI,aAAa,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;4BACzC,MAAM,CAAC,KAAK,CACV,oBAAoB,aAAa,CAAC,EAAE,6BAA6B,aAAa,CAAC,QAAQ,EAAE,CAC1F,CAAC;4BACF,SAAS,CAAC,WAAW,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;4BAC9C,gBAAgB,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;wBAC5C,CAAC;wBACD,MAAM;oBACR,CAAC;oBACD,KAAK,aAAa,CAAC,CAAC,CAAC;wBACnB,IAAI,CAAC,CAAC,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,EAAE,CAAC;4BAClD,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE,OAAO,CAAC,CAAC;4BAC/D,MAAM;wBACR,CAAC;wBAED,MAAM,YAAY,GAAG,OAA8B,CAAC;wBACpD,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;wBAExD,IAAI,CAAC,SAAS,EAAE,CAAC;4BACf,MAAM,CAAC,IAAI,CACT,mEAAmE,YAAY,CAAC,EAAE,EAAE,CACrF,CAAC;4BACF,MAAM;wBACR,CAAC;wBAED,MAAM,CAAC,KAAK,CACV,iDAAiD,YAAY,CAAC,EAAE,GAAG,EACnE,YAAY,CAAC,OAAO,CACrB,CAAC;wBACF,SAAS,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;wBACxD,gBAAgB,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;wBACzC,MAAM;oBACR,CAAC;oBACD;wBACE,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE,OAAO,CAAC,CAAC;wBAC1D,MAAM;gBACV,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;gBAC5B,MAAM,CAAC,KAAK,CAAC,kBAAkB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC9C,IAAI,CAAC,WAAW,IAAI,CAAC,EAAE,EAAE,UAAU,KAAK,cAAS,CAAC,UAAU,IAAI,EAAE,EAAE,UAAU,KAAK,cAAS,CAAC,IAAI,CAAC,EAAE,CAAC;oBACnG,gBAAgB,CAAC,GAAG,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBAClB,IAAI,YAAY,EAAE,CAAC;oBACjB,aAAa,CAAC,YAAY,CAAC,CAAC;oBAC5B,YAAY,GAAG,SAAS,CAAC;gBAC3B,CAAC;gBAED,MAAM,eAAe,GAAG,CAAC,qBAAqB,IAAI,eAAe,KAAK,cAAc,CAAC;gBACrF,qBAAqB,CAAC,cAAc,CAAC,CAAC;gBAEtC,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;gBAE1C,mBAAmB,CAAC,mBAAmB,CAAC,CAAC;gBAEzC,IAAI,eAAe,EAAE,CAAC;oBACpB,iBAAiB,EAAE,CAAC;gBACtB,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;gBACjB,MAAM,CAAC,KAAK,CAAC,gBAAgB,oBAAoB,EAAE,CAAC,CAAC;gBACrD,iBAAiB,GAAG,CAAC,CAAC;gBACtB,qBAAqB,CAAC,WAAW,CAAC,CAAC;gBAEnC,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;oBAC9B,IAAI,EAAE,IAAI,EAAE,CAAC,UAAU,KAAK,cAAS,CAAC,IAAI,EAAE,CAAC;wBAC1C,EAAU,CAAC,IAAI,EAAE,CAAC;oBACrB,CAAC;gBACH,CAAC,EAAE,KAAM,CAAC,CAAC;gBAEX,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,WAAW,GAAG,IAAI,CAAC;oBACnB,iBAAiB,CAAC;wBAChB,UAAU;wBACV,UAAU;wBACV,kBAAkB;wBAClB,uBAAuB;wBACvB,MAAM;wBACN,EAAE;qBACH,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG,KAAK,IAA6B,EAAE;YACrD,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,UAAU,KAAK,cAAS,CAAC,IAAI,EAAE,CAAC;gBAC5C,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC,CAAC;YAC5F,CAAC;YAED,MAAM,EAAE,GAAG,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACrC,MAAM,iBAAiB,GAAsB;gBAC3C,IAAI,EAAE,YAAY;gBAClB,EAAE;aACH,CAAC;YAEF,OAAO,IAAI,OAAO,CAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrD,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE,iBAAiB,CAAC,CAAC;gBAC/D,EAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,EAAE,CAAC,GAAW,EAAE,EAAE;oBAC1D,IAAI,GAAG,EAAE,CAAC;wBACR,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE,GAAG,CAAC,CAAC;wBACxD,MAAM,CAAC,GAAG,CAAC,CAAC;oBACd,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC9B,IAAI,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;wBAC/B,MAAM,CAAC,KAAK,CAAC,4CAA4C,EAAE,EAAE,CAAC,CAAC;wBAC/D,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;wBAChF,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBAChC,CAAC;gBACH,CAAC,EAAE,KAAK,CAAC,CAAC;gBACV,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE;oBACzB,QAAQ,EAAE,CAAC,KAAmD,EAAE,EAAE;wBAChE,YAAY,CAAC,OAAO,CAAC,CAAC;wBACtB,OAAO,CAAC,KAAK,CAAC,CAAC;wBACf,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBAChC,CAAC;oBACD,QAAQ,EAAE,CAAC,MAAY,EAAE,EAAE;wBACzB,YAAY,CAAC,OAAO,CAAC,CAAC;wBACtB,MAAM,CAAC,MAAM,CAAC,CAAC;wBACf,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBAChC,CAAC;iBACF,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,CAAC,IAAc,EAAmB,EAAE;YACjD,MAAM,EAAE,GAAG,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAErF,MAAM,cAAc,GAAG,GAAG,EAAE;gBAC1B,8BAA8B;gBAC9B,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC5B,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,YAAY,CAAC,CAAC;YACnD,CAAC,CAAC;YAEF,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC,cAAc,CAAC,CAAC;YACtD,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;YAEpC,8BAA8B;YAC9B,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,UAAU,KAAK,cAAS,CAAC,IAAI,EAAE,CAAC;gBAC5C,+DAA+D;gBAC/D,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE;oBACpB,SAAS,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC,CAAC;oBAC3F,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC9B,CAAC,CAAC,CAAC;gBACH,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,MAAM,aAAa,GAAkB;gBACnC,IAAI,EAAE,QAAQ;gBACd,EAAE;gBACF,IAAI;aACL,CAAC;YAEF,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,aAAa,CAAC,CAAC;YACvD,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,CAAC,GAAW,EAAE,EAAE;gBACrD,IAAI,GAAG,EAAE,CAAC;oBACR,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;oBACpD,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;oBAC5B,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC;QAEF,MAAM,EAAE,GAAG,KAAK,EAAE,IAAY,EAAE,QAAgB,EAAmB,EAAE;YACnE,MAAM,UAAU,GAAG,YAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YACjD,MAAM,SAAS,GAAG,GAAG,OAAO,CAAC,MAAM,eAAe,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7E,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;oBACtC,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE;wBACP,cAAc,EAAE,0BAA0B;wBAC1C,gBAAgB,EAAE,YAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE;wBACvD,aAAa,EAAE,UAAU,OAAO,CAAC,KAAK,EAAE;qBACzC;oBACD,IAAI,EAAE,UAAU;oBAChB,MAAM,EAAE,MAAM;iBACf,CAAC,CAAC;gBACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;oBACxC,MAAM,CAAC,KAAK,CAAC,kBAAkB,QAAQ,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC;oBAC/D,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC;gBACpE,CAAC;gBACD,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAqB,CAAC;gBAC3D,OAAO,MAAM,CAAC,IAAI,CAAC;YACrB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CAAC,yBAAyB,QAAQ,GAAG,EAAE,GAAG,CAAC,CAAC;gBACxD,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG,GAAS,EAAE;YAC5B,qBAAqB,GAAG,IAAI,CAAC;YAC7B,OAAO,EAAE,CAAC;YACV,qBAAqB,CAAC,cAAc,CAAC,CAAC;YACtC,mBAAmB,CAAC,wBAAwB,CAAC,CAAC;YAC9C,MAAM,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC7D,CAAC,CAAC;QAEF,MAAM,kBAAkB,GAAG,GAAoB,EAAE;YAC/C,OAAO,eAAe,CAAC;QACzB,CAAC,CAAC;QAEF,MAAM,uBAAuB,GAAG,CAAC,QAAiC,EAAgB,EAAE;YAClF,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACnC,OAAO,GAAG,EAAE;gBACV,oBAAoB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACxC,CAAC,CAAC;QACJ,CAAC,CAAC;QACF,cAAc,EAAE,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC"}
|