@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/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":"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"}