@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.mjs ADDED
@@ -0,0 +1,515 @@
1
+ import { WebSocket } from 'ws';
2
+ import fs from 'fs';
3
+ import { EventEmitter } from 'events';
4
+ /**
5
+ * Handle for a running simctl command execution.
6
+ *
7
+ * This class extends EventEmitter and provides streaming access to command output.
8
+ * Methods starting with underscore (_) are internal and should not be called directly.
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * const execution = client.simctl(['boot', 'device-id']);
13
+ *
14
+ * // Listen to raw output
15
+ * execution.on('stdout', (data) => console.log(data.toString()));
16
+ *
17
+ * // Or listen line-by-line (more convenient for most use cases)
18
+ * execution.on('line-stdout', (line) => console.log('Output:', line));
19
+ * execution.on('line-stderr', (line) => console.error('Error:', line));
20
+ *
21
+ * execution.on('exit', (code) => console.log('Exit code:', code));
22
+ * ```
23
+ */
24
+ export class SimctlExecution extends EventEmitter {
25
+ get isRunning() {
26
+ return !this.completed;
27
+ }
28
+ constructor(stopCallback) {
29
+ super();
30
+ this.stdoutChunks = [];
31
+ this.stderrChunks = [];
32
+ this.stdoutLineBuffer = '';
33
+ this.stderrLineBuffer = '';
34
+ this.exitCodeValue = null;
35
+ this.completed = false;
36
+ this.waitPromise = null;
37
+ this.stopCallback = null;
38
+ this.stopCallback = stopCallback;
39
+ }
40
+ /**
41
+ * Register an event listener for stdout, stderr, line-stdout, line-stderr, exit, or error events.
42
+ * @param event The event name
43
+ * @param listener The callback function for this event
44
+ */
45
+ on(event, listener) {
46
+ return super.on(event, listener);
47
+ }
48
+ /**
49
+ * Register a one-time event listener that will be removed after firing once.
50
+ * @param event The event name
51
+ * @param listener The callback function for this event
52
+ */
53
+ once(event, listener) {
54
+ return super.once(event, listener);
55
+ }
56
+ /**
57
+ * Remove an event listener.
58
+ * @param event The event name
59
+ * @param listener The callback function to remove
60
+ */
61
+ off(event, listener) {
62
+ return super.off(event, listener);
63
+ }
64
+ /**
65
+ * Wait for the command to complete and get the full result.
66
+ * This accumulates all stdout/stderr chunks in memory.
67
+ * @returns Promise that resolves with exit code and complete output
68
+ */
69
+ wait() {
70
+ if (this.waitPromise) {
71
+ return this.waitPromise;
72
+ }
73
+ this.waitPromise = new Promise((resolve, reject) => {
74
+ if (this.completed) {
75
+ resolve({
76
+ code: this.exitCodeValue,
77
+ stdout: Buffer.concat(this.stdoutChunks),
78
+ stderr: Buffer.concat(this.stderrChunks),
79
+ });
80
+ return;
81
+ }
82
+ this.once('exit', (code) => {
83
+ resolve({
84
+ code,
85
+ stdout: Buffer.concat(this.stdoutChunks),
86
+ stderr: Buffer.concat(this.stderrChunks),
87
+ });
88
+ });
89
+ this.once('error', (error) => {
90
+ reject(error);
91
+ });
92
+ });
93
+ return this.waitPromise;
94
+ }
95
+ /**
96
+ * Stop the running simctl command (if supported by server).
97
+ * This cleans up the execution tracking.
98
+ */
99
+ stop() {
100
+ if (this.stopCallback) {
101
+ this.stopCallback();
102
+ }
103
+ }
104
+ /** @internal - Handle stdout data from server */
105
+ _handleStdout(data) {
106
+ this.stdoutChunks.push(data);
107
+ this.emit('stdout', data);
108
+ // Process line-by-line
109
+ this.stdoutLineBuffer += data.toString('utf-8');
110
+ const lines = this.stdoutLineBuffer.split('\n');
111
+ // Keep the last incomplete line in the buffer
112
+ this.stdoutLineBuffer = lines.pop() || '';
113
+ // Emit complete lines
114
+ for (const line of lines) {
115
+ this.emit('line-stdout', line);
116
+ }
117
+ }
118
+ /** @internal - Handle stderr data from server */
119
+ _handleStderr(data) {
120
+ this.stderrChunks.push(data);
121
+ this.emit('stderr', data);
122
+ // Process line-by-line
123
+ this.stderrLineBuffer += data.toString('utf-8');
124
+ const lines = this.stderrLineBuffer.split('\n');
125
+ // Keep the last incomplete line in the buffer
126
+ this.stderrLineBuffer = lines.pop() || '';
127
+ // Emit complete lines
128
+ for (const line of lines) {
129
+ this.emit('line-stderr', line);
130
+ }
131
+ }
132
+ /** @internal - Handle exit code from server */
133
+ _handleExit(code) {
134
+ // Emit any remaining partial lines before exit
135
+ if (this.stdoutLineBuffer) {
136
+ this.emit('line-stdout', this.stdoutLineBuffer);
137
+ this.stdoutLineBuffer = '';
138
+ }
139
+ if (this.stderrLineBuffer) {
140
+ this.emit('line-stderr', this.stderrLineBuffer);
141
+ this.stderrLineBuffer = '';
142
+ }
143
+ this.exitCodeValue = code;
144
+ this.completed = true;
145
+ this.emit('exit', code);
146
+ }
147
+ /** @internal - Handle errors from server or connection */
148
+ _handleError(error) {
149
+ this.completed = true;
150
+ this.emit('error', error);
151
+ }
152
+ }
153
+ /**
154
+ * Creates a client for interacting with a Limrun iOS instance
155
+ * @param options Configuration options including webrtcUrl, token and log level
156
+ * @returns An InstanceClient for controlling the instance
157
+ */
158
+ export async function createInstanceClient(options) {
159
+ const endpointWebSocketUrl = `${options.apiUrl}/endpointWebSocket?token=${options.token}`;
160
+ const logLevel = options.logLevel ?? 'info';
161
+ const maxReconnectAttempts = options.maxReconnectAttempts ?? 6;
162
+ const reconnectDelay = options.reconnectDelay ?? 1000;
163
+ const maxReconnectDelay = options.maxReconnectDelay ?? 30000;
164
+ let ws = undefined;
165
+ let connectionState = 'connecting';
166
+ let reconnectAttempts = 0;
167
+ let reconnectTimeout;
168
+ let intentionalDisconnect = false;
169
+ const screenshotRequests = new Map();
170
+ const simctlExecutions = new Map();
171
+ const stateChangeCallbacks = new Set();
172
+ // Logger functions
173
+ const logger = {
174
+ debug: (...args) => {
175
+ if (logLevel === 'debug')
176
+ console.log(...args);
177
+ },
178
+ info: (...args) => {
179
+ if (logLevel === 'info' || logLevel === 'debug')
180
+ console.log(...args);
181
+ },
182
+ warn: (...args) => {
183
+ if (logLevel === 'warn' || logLevel === 'info' || logLevel === 'debug')
184
+ console.warn(...args);
185
+ },
186
+ error: (...args) => {
187
+ if (logLevel !== 'none')
188
+ console.error(...args);
189
+ },
190
+ };
191
+ const updateConnectionState = (newState) => {
192
+ if (connectionState !== newState) {
193
+ connectionState = newState;
194
+ logger.debug(`Connection state changed to: ${newState}`);
195
+ stateChangeCallbacks.forEach((callback) => {
196
+ try {
197
+ callback(newState);
198
+ }
199
+ catch (err) {
200
+ logger.error('Error in connection state callback:', err);
201
+ }
202
+ });
203
+ }
204
+ };
205
+ const failPendingRequests = (reason) => {
206
+ screenshotRequests.forEach((request) => request.rejecter(new Error(reason)));
207
+ screenshotRequests.clear();
208
+ simctlExecutions.forEach((execution) => execution._handleError(new Error(reason)));
209
+ simctlExecutions.clear();
210
+ };
211
+ const cleanup = () => {
212
+ if (reconnectTimeout) {
213
+ clearTimeout(reconnectTimeout);
214
+ reconnectTimeout = undefined;
215
+ }
216
+ if (pingInterval) {
217
+ clearInterval(pingInterval);
218
+ pingInterval = undefined;
219
+ }
220
+ if (ws) {
221
+ ws.removeAllListeners();
222
+ if (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING) {
223
+ ws.close();
224
+ }
225
+ ws = undefined;
226
+ }
227
+ };
228
+ let pingInterval;
229
+ return new Promise((resolveConnection, rejectConnection) => {
230
+ let hasResolved = false;
231
+ // Reconnection logic with exponential backoff
232
+ const scheduleReconnect = () => {
233
+ if (intentionalDisconnect) {
234
+ logger.debug('Skipping reconnection (intentional disconnect)');
235
+ return;
236
+ }
237
+ if (reconnectAttempts >= maxReconnectAttempts) {
238
+ logger.error(`Max reconnection attempts (${maxReconnectAttempts}) reached. Giving up.`);
239
+ updateConnectionState('disconnected');
240
+ return;
241
+ }
242
+ const currentDelay = Math.min(reconnectDelay * Math.pow(2, reconnectAttempts), maxReconnectDelay);
243
+ reconnectAttempts++;
244
+ logger.debug(`Scheduling reconnection attempt ${reconnectAttempts} in ${currentDelay}ms...`);
245
+ updateConnectionState('reconnecting');
246
+ reconnectTimeout = setTimeout(() => {
247
+ logger.debug(`Attempting to reconnect (attempt ${reconnectAttempts})...`);
248
+ setupWebSocket();
249
+ }, currentDelay);
250
+ };
251
+ const setupWebSocket = () => {
252
+ cleanup();
253
+ updateConnectionState('connecting');
254
+ ws = new WebSocket(endpointWebSocketUrl);
255
+ ws.on('message', (data) => {
256
+ let message;
257
+ try {
258
+ message = JSON.parse(data.toString());
259
+ }
260
+ catch (e) {
261
+ logger.error({ data, error: e }, 'Failed to parse JSON message');
262
+ return;
263
+ }
264
+ switch (message.type) {
265
+ case 'screenshot': {
266
+ if (!('dataUri' in message) || typeof message.dataUri !== 'string' || !('id' in message)) {
267
+ logger.warn('Received invalid screenshot message:', message);
268
+ break;
269
+ }
270
+ const screenshotMessage = message;
271
+ const request = screenshotRequests.get(screenshotMessage.id);
272
+ if (!request) {
273
+ logger.warn(`Received screenshot data for unknown or already handled session: ${screenshotMessage.id}`);
274
+ break;
275
+ }
276
+ logger.debug(`Received screenshot data URI for session ${screenshotMessage.id}.`);
277
+ request.resolver({ dataUri: screenshotMessage.dataUri });
278
+ screenshotRequests.delete(screenshotMessage.id);
279
+ break;
280
+ }
281
+ case 'screenshotError': {
282
+ if (!('message' in message) || !('id' in message)) {
283
+ logger.warn('Received invalid screenshot error message:', message);
284
+ break;
285
+ }
286
+ const errorMessage = message;
287
+ const request = screenshotRequests.get(errorMessage.id);
288
+ if (!request) {
289
+ logger.warn(`Received screenshot error for unknown or already handled session: ${errorMessage.id}`);
290
+ break;
291
+ }
292
+ logger.error(`Server reported an error capturing screenshot for session ${errorMessage.id}:`, errorMessage.message);
293
+ request.rejecter(new Error(errorMessage.message));
294
+ screenshotRequests.delete(errorMessage.id);
295
+ break;
296
+ }
297
+ case 'simctlStream': {
298
+ if (!('id' in message)) {
299
+ logger.warn('Received invalid simctl stream message:', message);
300
+ break;
301
+ }
302
+ const streamMessage = message;
303
+ const execution = simctlExecutions.get(streamMessage.id);
304
+ if (!execution) {
305
+ logger.warn(`Received simctl stream for unknown or already completed execution: ${streamMessage.id}`);
306
+ break;
307
+ }
308
+ // Handle stdout if present
309
+ if (streamMessage.stdout) {
310
+ try {
311
+ const stdoutBuffer = Buffer.from(streamMessage.stdout, 'base64');
312
+ execution._handleStdout(stdoutBuffer);
313
+ }
314
+ catch (err) {
315
+ logger.error('Failed to decode stdout data:', err);
316
+ }
317
+ }
318
+ // Handle stderr if present
319
+ if (streamMessage.stderr) {
320
+ try {
321
+ const stderrBuffer = Buffer.from(streamMessage.stderr, 'base64');
322
+ execution._handleStderr(stderrBuffer);
323
+ }
324
+ catch (err) {
325
+ logger.error('Failed to decode stderr data:', err);
326
+ }
327
+ }
328
+ // Handle exit code if present (final message)
329
+ if (streamMessage.exitCode !== undefined) {
330
+ logger.debug(`Simctl execution ${streamMessage.id} completed with exit code ${streamMessage.exitCode}`);
331
+ execution._handleExit(streamMessage.exitCode);
332
+ simctlExecutions.delete(streamMessage.id);
333
+ }
334
+ break;
335
+ }
336
+ case 'simctlError': {
337
+ if (!('message' in message) || !('id' in message)) {
338
+ logger.warn('Received invalid simctl error message:', message);
339
+ break;
340
+ }
341
+ const errorMessage = message;
342
+ const execution = simctlExecutions.get(errorMessage.id);
343
+ if (!execution) {
344
+ logger.warn(`Received simctl error for unknown or already handled execution: ${errorMessage.id}`);
345
+ break;
346
+ }
347
+ logger.error(`Server reported an error for simctl execution ${errorMessage.id}:`, errorMessage.message);
348
+ execution._handleError(new Error(errorMessage.message));
349
+ simctlExecutions.delete(errorMessage.id);
350
+ break;
351
+ }
352
+ default:
353
+ logger.warn('Received unexpected message type:', message);
354
+ break;
355
+ }
356
+ });
357
+ ws.on('error', (err) => {
358
+ logger.error('WebSocket error:', err.message);
359
+ if (!hasResolved && (ws?.readyState === WebSocket.CONNECTING || ws?.readyState === WebSocket.OPEN)) {
360
+ rejectConnection(err);
361
+ }
362
+ });
363
+ ws.on('close', () => {
364
+ if (pingInterval) {
365
+ clearInterval(pingInterval);
366
+ pingInterval = undefined;
367
+ }
368
+ const shouldReconnect = !intentionalDisconnect && connectionState !== 'disconnected';
369
+ updateConnectionState('disconnected');
370
+ logger.debug('Disconnected from server.');
371
+ failPendingRequests('Connection closed');
372
+ if (shouldReconnect) {
373
+ scheduleReconnect();
374
+ }
375
+ });
376
+ ws.on('open', () => {
377
+ logger.debug(`Connected to ${endpointWebSocketUrl}`);
378
+ reconnectAttempts = 0;
379
+ updateConnectionState('connected');
380
+ pingInterval = setInterval(() => {
381
+ if (ws && ws.readyState === WebSocket.OPEN) {
382
+ ws.ping();
383
+ }
384
+ }, 30000);
385
+ if (!hasResolved) {
386
+ hasResolved = true;
387
+ resolveConnection({
388
+ screenshot,
389
+ disconnect,
390
+ getConnectionState,
391
+ onConnectionStateChange,
392
+ simctl,
393
+ cp,
394
+ });
395
+ }
396
+ });
397
+ };
398
+ const screenshot = async () => {
399
+ if (!ws || ws.readyState !== WebSocket.OPEN) {
400
+ return Promise.reject(new Error('WebSocket is not connected or connection is not open.'));
401
+ }
402
+ const id = 'ts-client-' + Date.now();
403
+ const screenshotRequest = {
404
+ type: 'screenshot',
405
+ id,
406
+ };
407
+ return new Promise((resolve, reject) => {
408
+ logger.debug('Sending screenshot request:', screenshotRequest);
409
+ ws.send(JSON.stringify(screenshotRequest), (err) => {
410
+ if (err) {
411
+ logger.error('Failed to send screenshot request:', err);
412
+ reject(err);
413
+ }
414
+ });
415
+ const timeout = setTimeout(() => {
416
+ if (screenshotRequests.has(id)) {
417
+ logger.error(`Screenshot request timed out for session ${id}`);
418
+ screenshotRequests.get(id)?.rejecter(new Error('Screenshot request timed out'));
419
+ screenshotRequests.delete(id);
420
+ }
421
+ }, 30000);
422
+ screenshotRequests.set(id, {
423
+ resolver: (value) => {
424
+ clearTimeout(timeout);
425
+ resolve(value);
426
+ screenshotRequests.delete(id);
427
+ },
428
+ rejecter: (reason) => {
429
+ clearTimeout(timeout);
430
+ reject(reason);
431
+ screenshotRequests.delete(id);
432
+ },
433
+ });
434
+ });
435
+ };
436
+ const simctl = (args) => {
437
+ const id = 'ts-simctl-' + Date.now() + '-' + Math.random().toString(36).substring(7);
438
+ const cancelCallback = () => {
439
+ // Clean up execution tracking
440
+ simctlExecutions.delete(id);
441
+ logger.debug(`Simctl execution ${id} cancelled`);
442
+ };
443
+ const execution = new SimctlExecution(cancelCallback);
444
+ simctlExecutions.set(id, execution);
445
+ // Send request asynchronously
446
+ if (!ws || ws.readyState !== WebSocket.OPEN) {
447
+ // Defer error to next tick to allow caller to attach listeners
448
+ process.nextTick(() => {
449
+ execution._handleError(new Error('WebSocket is not connected or connection is not open.'));
450
+ simctlExecutions.delete(id);
451
+ });
452
+ return execution;
453
+ }
454
+ const simctlRequest = {
455
+ type: 'simctl',
456
+ id,
457
+ args,
458
+ };
459
+ logger.debug('Sending simctl request:', simctlRequest);
460
+ ws.send(JSON.stringify(simctlRequest), (err) => {
461
+ if (err) {
462
+ logger.error('Failed to send simctl request:', err);
463
+ execution._handleError(err);
464
+ simctlExecutions.delete(id);
465
+ }
466
+ });
467
+ return execution;
468
+ };
469
+ const cp = async (name, filePath) => {
470
+ const fileStream = fs.createReadStream(filePath);
471
+ const uploadUrl = `${options.apiUrl}/files?name=${encodeURIComponent(name)}`;
472
+ try {
473
+ const response = await fetch(uploadUrl, {
474
+ method: 'PUT',
475
+ headers: {
476
+ 'Content-Type': 'application/octet-stream',
477
+ 'Content-Length': fs.statSync(filePath).size.toString(),
478
+ Authorization: `Bearer ${options.token}`,
479
+ },
480
+ body: fileStream,
481
+ duplex: 'half',
482
+ });
483
+ if (!response.ok) {
484
+ const errorBody = await response.text();
485
+ logger.debug(`Upload failed: ${response.status} ${errorBody}`);
486
+ throw new Error(`Upload failed: ${response.status} ${errorBody}`);
487
+ }
488
+ const result = (await response.json());
489
+ return result.path;
490
+ }
491
+ catch (err) {
492
+ logger.debug(`Failed to upload file ${filePath}:`, err);
493
+ throw err;
494
+ }
495
+ };
496
+ const disconnect = () => {
497
+ intentionalDisconnect = true;
498
+ cleanup();
499
+ updateConnectionState('disconnected');
500
+ failPendingRequests('Intentional disconnect');
501
+ logger.debug('Intentionally disconnected from WebSocket.');
502
+ };
503
+ const getConnectionState = () => {
504
+ return connectionState;
505
+ };
506
+ const onConnectionStateChange = (callback) => {
507
+ stateChangeCallbacks.add(callback);
508
+ return () => {
509
+ stateChangeCallbacks.delete(callback);
510
+ };
511
+ };
512
+ setupWebSocket();
513
+ });
514
+ }
515
+ //# sourceMappingURL=ios-client.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ios-client.mjs","sourceRoot":"","sources":["src/ios-client.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@limrun/api",
3
- "version": "0.16.0",
3
+ "version": "0.17.0-rc.1",
4
4
  "description": "The official TypeScript library for the Limrun API",
5
5
  "author": "Limrun <contact@limrun.com>",
6
6
  "types": "./index.d.ts",
@@ -96,6 +96,16 @@
96
96
  "./instance-client.mjs": {
97
97
  "default": "./instance-client.mjs"
98
98
  },
99
+ "./ios-client": {
100
+ "import": "./ios-client.mjs",
101
+ "require": "./ios-client.js"
102
+ },
103
+ "./ios-client.js": {
104
+ "default": "./ios-client.js"
105
+ },
106
+ "./ios-client.mjs": {
107
+ "default": "./ios-client.mjs"
108
+ },
99
109
  "./pagination": {
100
110
  "import": "./pagination.mjs",
101
111
  "require": "./pagination.js"
package/src/index.ts CHANGED
@@ -7,6 +7,7 @@ export { APIPromise } from './core/api-promise';
7
7
  export { Limrun, type ClientOptions } from './client';
8
8
  export { PagePromise } from './core/pagination';
9
9
  export * from './instance-client';
10
+ export * as Ios from './ios-client';
10
11
  export {
11
12
  LimrunError,
12
13
  APIError,