@limrun/api 0.28.6 → 0.28.7
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/CHANGELOG.md +4 -0
- package/http-proxy.d.mts +11 -0
- package/http-proxy.d.mts.map +1 -0
- package/http-proxy.d.ts +11 -0
- package/http-proxy.d.ts.map +1 -0
- package/http-proxy.js +66 -0
- package/http-proxy.js.map +1 -0
- package/http-proxy.mjs +62 -0
- package/http-proxy.mjs.map +1 -0
- 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 +3 -1
- package/index.js.map +1 -1
- package/index.mjs +1 -0
- package/index.mjs.map +1 -1
- package/ios-client.d.mts +18 -0
- package/ios-client.d.mts.map +1 -1
- package/ios-client.d.ts +18 -0
- package/ios-client.d.ts.map +1 -1
- package/ios-client.js +44 -2
- package/ios-client.js.map +1 -1
- package/ios-client.mjs +44 -2
- package/ios-client.mjs.map +1 -1
- package/ios-shim.d.mts +25 -0
- package/ios-shim.d.mts.map +1 -0
- package/ios-shim.d.ts +25 -0
- package/ios-shim.d.ts.map +1 -0
- package/ios-shim.js +352 -0
- package/ios-shim.js.map +1 -0
- package/ios-shim.mjs +346 -0
- package/ios-shim.mjs.map +1 -0
- package/package.json +21 -1
- package/src/http-proxy.ts +85 -0
- package/src/index.ts +1 -0
- package/src/ios-client.ts +71 -2
- package/src/ios-shim.ts +401 -0
- package/src/version.ts +1 -1
- package/version.d.mts +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/version.mjs +1 -1
package/ios-shim.js
ADDED
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.startXcrunShim = startXcrunShim;
|
|
4
|
+
exports.startXcrunShimServer = startXcrunShimServer;
|
|
5
|
+
exports.createXcrunShim = createXcrunShim;
|
|
6
|
+
const tslib_1 = require("./internal/tslib.js");
|
|
7
|
+
const fs_1 = tslib_1.__importDefault(require("fs"));
|
|
8
|
+
const http_1 = tslib_1.__importDefault(require("http"));
|
|
9
|
+
const os_1 = tslib_1.__importDefault(require("os"));
|
|
10
|
+
const path_1 = tslib_1.__importDefault(require("path"));
|
|
11
|
+
const FORWARDED_SIMCTL_COMMANDS = new Set([
|
|
12
|
+
'openurl',
|
|
13
|
+
'launch',
|
|
14
|
+
'terminate',
|
|
15
|
+
'uninstall',
|
|
16
|
+
'privacy',
|
|
17
|
+
'location',
|
|
18
|
+
'status_bar',
|
|
19
|
+
'spawn',
|
|
20
|
+
]);
|
|
21
|
+
async function startXcrunShim(client) {
|
|
22
|
+
const server = await startXcrunShimServer({ client, udid: client.deviceInfo.udid });
|
|
23
|
+
try {
|
|
24
|
+
const dir = await createXcrunShim({ shimUrl: server.url, udid: client.deviceInfo.udid });
|
|
25
|
+
return {
|
|
26
|
+
dir,
|
|
27
|
+
close: async () => {
|
|
28
|
+
await server.close();
|
|
29
|
+
fs_1.default.rmSync(dir, { recursive: true, force: true });
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
await server.close().catch(() => { });
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async function startXcrunShimServer({ client, udid, }) {
|
|
39
|
+
const server = http_1.default.createServer(async (req, res) => {
|
|
40
|
+
if (req.method !== 'POST' || req.url !== '/xcrun') {
|
|
41
|
+
sendJson(res, 404, { code: 127, stdout: '', stderr: 'not found' });
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
const body = (await readJson(req));
|
|
46
|
+
const args = body.args ?? [];
|
|
47
|
+
const result = await handleShimmedXcrun(client, udid, args);
|
|
48
|
+
sendJson(res, 200, result);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
sendJson(res, 200, {
|
|
52
|
+
code: 1,
|
|
53
|
+
stdout: '',
|
|
54
|
+
stderr: 'limrun xcrun shim failed to execute the requested command.',
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
await listen(server, 0);
|
|
59
|
+
const address = server.address();
|
|
60
|
+
if (!address || typeof address === 'string') {
|
|
61
|
+
throw new Error('Failed to start Limrun xcrun shim server.');
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
url: `http://127.0.0.1:${address.port}/xcrun`,
|
|
65
|
+
close: () => closeServer(server),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
async function createXcrunShim(options) {
|
|
69
|
+
const dir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'limrun-xcrun-shim-'));
|
|
70
|
+
const shimPath = path_1.default.join(dir, 'xcrun');
|
|
71
|
+
fs_1.default.writeFileSync(shimPath, xcrunShimSource(options), 'utf8');
|
|
72
|
+
fs_1.default.chmodSync(shimPath, 0o755);
|
|
73
|
+
return dir;
|
|
74
|
+
}
|
|
75
|
+
async function handleShimmedXcrun(client, udid, args) {
|
|
76
|
+
if (args[0] !== 'simctl') {
|
|
77
|
+
return { code: 127, stdout: '', stderr: `unsupported xcrun command: ${args.join(' ')}` };
|
|
78
|
+
}
|
|
79
|
+
const simctlArgs = args.slice(1);
|
|
80
|
+
const command = simctlArgs[0];
|
|
81
|
+
const target = simctlTarget(command, simctlArgs);
|
|
82
|
+
if (command === 'list') {
|
|
83
|
+
// Maestro's device picker expects the full CoreSimulator JSON shape. Limrun
|
|
84
|
+
// only has one remote simulator in this context, so we synthesize that entry.
|
|
85
|
+
return simctlList(client.deviceInfo.udid, simctlArgs);
|
|
86
|
+
}
|
|
87
|
+
if (!isLimrunTarget(target, udid)) {
|
|
88
|
+
return { code: 64, stdout: '', stderr: `unsupported non-Limrun simctl target '${target ?? ''}'.` };
|
|
89
|
+
}
|
|
90
|
+
if (command === 'listapps') {
|
|
91
|
+
const apps = await client.listApps();
|
|
92
|
+
return {
|
|
93
|
+
code: 0,
|
|
94
|
+
stdout: `${JSON.stringify(toSimctlListApps(apps))}\n`,
|
|
95
|
+
stderr: '',
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
if (command === 'install') {
|
|
99
|
+
const appPath = simctlArgs[2];
|
|
100
|
+
if (!appPath) {
|
|
101
|
+
return { code: 64, stdout: '', stderr: 'simctl install requires a local .app path.' };
|
|
102
|
+
}
|
|
103
|
+
await client.syncApp(appPath, { install: true, watch: false });
|
|
104
|
+
return { code: 0, stdout: '', stderr: '' };
|
|
105
|
+
}
|
|
106
|
+
const unsupported = unsupportedPathBearingCommand(command);
|
|
107
|
+
if (unsupported) {
|
|
108
|
+
return unsupported;
|
|
109
|
+
}
|
|
110
|
+
if (!command || !FORWARDED_SIMCTL_COMMANDS.has(command)) {
|
|
111
|
+
return { code: 64, stdout: '', stderr: `limrun xcrun shim does not support simctl ${command ?? ''}.` };
|
|
112
|
+
}
|
|
113
|
+
return await client.simctl(simctlArgs).wait();
|
|
114
|
+
}
|
|
115
|
+
function simctlList(udid, simctlArgs) {
|
|
116
|
+
if (!simctlArgs.includes('-j')) {
|
|
117
|
+
return { code: 64, stdout: '', stderr: 'limrun xcrun shim only supports `xcrun simctl list -j`.' };
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
code: 0,
|
|
121
|
+
stdout: `${JSON.stringify(toSimctlList(udid))}\n`,
|
|
122
|
+
stderr: '',
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
function unsupportedPathBearingCommand(command) {
|
|
126
|
+
// These commands either return local simulator filesystem paths or consume
|
|
127
|
+
// host-side media files. They need explicit staging/translation before they
|
|
128
|
+
// are safe to claim as supported.
|
|
129
|
+
if (command === 'get_app_container') {
|
|
130
|
+
return {
|
|
131
|
+
code: 64,
|
|
132
|
+
stdout: '',
|
|
133
|
+
stderr: 'limrun xcrun shim does not support get_app_container because upstream tools expect a local filesystem path.',
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
if (command === 'keychain') {
|
|
137
|
+
return { code: 64, stdout: '', stderr: 'limrun xcrun shim does not support simctl keychain in v1.' };
|
|
138
|
+
}
|
|
139
|
+
if (command === 'io') {
|
|
140
|
+
return {
|
|
141
|
+
code: 64,
|
|
142
|
+
stdout: '',
|
|
143
|
+
stderr: 'limrun xcrun shim does not support simctl io recordVideo in v1.',
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
if (command === 'push' || command === 'addmedia') {
|
|
147
|
+
return {
|
|
148
|
+
code: 64,
|
|
149
|
+
stdout: '',
|
|
150
|
+
stderr: `limrun xcrun shim does not support path-bearing simctl ${command} in v1.`,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
return undefined;
|
|
154
|
+
}
|
|
155
|
+
function isLimrunTarget(value, udid) {
|
|
156
|
+
return value === udid || value === 'booted';
|
|
157
|
+
}
|
|
158
|
+
function simctlTarget(command, simctlArgs) {
|
|
159
|
+
if (command === 'launch') {
|
|
160
|
+
return simctlArgs.slice(1).find((arg) => !arg.startsWith('-'));
|
|
161
|
+
}
|
|
162
|
+
return simctlArgs[1];
|
|
163
|
+
}
|
|
164
|
+
function toSimctlList(udid) {
|
|
165
|
+
const runtimeIdentifier = 'com.apple.CoreSimulator.SimRuntime.iOS-18-0';
|
|
166
|
+
const deviceTypeIdentifier = 'com.apple.CoreSimulator.SimDeviceType.iPhone-16-Pro';
|
|
167
|
+
return {
|
|
168
|
+
devices: {
|
|
169
|
+
[runtimeIdentifier]: [
|
|
170
|
+
{
|
|
171
|
+
availability: '(available)',
|
|
172
|
+
dataPath: `/tmp/limrun-sim/${udid}/data`,
|
|
173
|
+
logPath: `/tmp/limrun-sim/${udid}/logs`,
|
|
174
|
+
isAvailable: true,
|
|
175
|
+
name: process.env['LIMRUN_IOS_DEVICE_NAME'] || 'Limrun iPhone',
|
|
176
|
+
state: 'Booted',
|
|
177
|
+
udid,
|
|
178
|
+
deviceTypeIdentifier,
|
|
179
|
+
availabilityError: null,
|
|
180
|
+
},
|
|
181
|
+
],
|
|
182
|
+
},
|
|
183
|
+
devicetypes: [
|
|
184
|
+
{
|
|
185
|
+
bundlePath: '',
|
|
186
|
+
identifier: deviceTypeIdentifier,
|
|
187
|
+
maxRuntimeVersion: 999999,
|
|
188
|
+
maxRuntimeVersionString: null,
|
|
189
|
+
minRuntimeVersion: 0,
|
|
190
|
+
minRuntimeVersionString: null,
|
|
191
|
+
modelIdentifier: 'iPhone17,1',
|
|
192
|
+
name: 'iPhone 16 Pro',
|
|
193
|
+
productFamily: 'iPhone',
|
|
194
|
+
},
|
|
195
|
+
],
|
|
196
|
+
pairs: {},
|
|
197
|
+
runtimes: [
|
|
198
|
+
{
|
|
199
|
+
availability: '(available)',
|
|
200
|
+
bundlePath: '',
|
|
201
|
+
buildversion: '22A000',
|
|
202
|
+
identifier: runtimeIdentifier,
|
|
203
|
+
isInternal: false,
|
|
204
|
+
isAvailable: true,
|
|
205
|
+
name: process.env['LIMRUN_IOS_RUNTIME_NAME'] || 'iOS 18.0',
|
|
206
|
+
platform: 'iOS',
|
|
207
|
+
runtimeRoot: '',
|
|
208
|
+
supportedDeviceTypes: [],
|
|
209
|
+
version: '18.0',
|
|
210
|
+
},
|
|
211
|
+
],
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
function toSimctlListApps(apps) {
|
|
215
|
+
return Object.fromEntries(apps.map((app) => [
|
|
216
|
+
app.bundleId,
|
|
217
|
+
{
|
|
218
|
+
CFBundleIdentifier: app.bundleId,
|
|
219
|
+
...(app.name ? { CFBundleName: app.name } : {}),
|
|
220
|
+
},
|
|
221
|
+
]));
|
|
222
|
+
}
|
|
223
|
+
function xcrunShimSource(options) {
|
|
224
|
+
// Keep the executable tiny: it decides whether this is a Limrun-targeted
|
|
225
|
+
// simctl call, then asks the local shim server to perform the real work.
|
|
226
|
+
// Non-Limrun calls still delegate to the host xcrun.
|
|
227
|
+
const embeddedShimUrl = options ? JSON.stringify(options.shimUrl) : 'process.env.LIMRUN_XCRUN_SHIM_URL';
|
|
228
|
+
const embeddedUdid = options ? JSON.stringify(options.udid) : 'process.env.LIMRUN_IOS_UDID';
|
|
229
|
+
return `#!/usr/bin/env node
|
|
230
|
+
const http = require('node:http');
|
|
231
|
+
const { spawnSync } = require('node:child_process');
|
|
232
|
+
|
|
233
|
+
const args = process.argv.slice(2);
|
|
234
|
+
const realXcrun = process.env.LIMRUN_REAL_XCRUN || '/usr/bin/xcrun';
|
|
235
|
+
|
|
236
|
+
function delegate() {
|
|
237
|
+
const result = spawnSync(realXcrun, args, { stdio: 'inherit' });
|
|
238
|
+
if (result.error) {
|
|
239
|
+
process.stderr.write(String(result.error.message || result.error) + '\\n');
|
|
240
|
+
process.exit(127);
|
|
241
|
+
}
|
|
242
|
+
process.exit(result.status ?? 1);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
function fail(message) {
|
|
246
|
+
process.stderr.write('limrun xcrun shim: ' + message + '\\n');
|
|
247
|
+
process.exit(64);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
if (args[0] !== 'simctl') {
|
|
251
|
+
delegate();
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
const shimUrl = ${embeddedShimUrl};
|
|
255
|
+
const udid = ${embeddedUdid};
|
|
256
|
+
if (!shimUrl || !udid) {
|
|
257
|
+
fail('LIMRUN_XCRUN_SHIM_URL and LIMRUN_IOS_UDID are required.');
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
const simctlArgs = args.slice(1);
|
|
261
|
+
const command = simctlArgs[0];
|
|
262
|
+
function simctlTarget(command, simctlArgs) {
|
|
263
|
+
if (command === 'launch') {
|
|
264
|
+
return simctlArgs.slice(1).find((arg) => !arg.startsWith('-'));
|
|
265
|
+
}
|
|
266
|
+
return simctlArgs[1];
|
|
267
|
+
}
|
|
268
|
+
const target = simctlTarget(command, simctlArgs);
|
|
269
|
+
function isLimrunTarget(value) {
|
|
270
|
+
return value === udid || value === 'booted';
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
if (command !== 'list' && !isLimrunTarget(target)) {
|
|
274
|
+
delegate();
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
const parsed = new URL(shimUrl);
|
|
278
|
+
const body = JSON.stringify({ args });
|
|
279
|
+
const req = http.request(parsed, {
|
|
280
|
+
method: 'POST',
|
|
281
|
+
headers: {
|
|
282
|
+
'content-type': 'application/json',
|
|
283
|
+
'content-length': Buffer.byteLength(body),
|
|
284
|
+
},
|
|
285
|
+
}, (res) => {
|
|
286
|
+
const chunks = [];
|
|
287
|
+
res.on('data', (chunk) => chunks.push(chunk));
|
|
288
|
+
res.on('end', () => {
|
|
289
|
+
let payload;
|
|
290
|
+
try {
|
|
291
|
+
payload = JSON.parse(Buffer.concat(chunks).toString('utf8'));
|
|
292
|
+
} catch (error) {
|
|
293
|
+
process.stderr.write('limrun xcrun shim: invalid shim response\\n');
|
|
294
|
+
process.exit(1);
|
|
295
|
+
}
|
|
296
|
+
if (payload.stdout) process.stdout.write(payload.stdout);
|
|
297
|
+
if (payload.stderr) process.stderr.write(payload.stderr);
|
|
298
|
+
process.exit(typeof payload.code === 'number' ? payload.code : 1);
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
req.on('error', (error) => {
|
|
302
|
+
process.stderr.write('limrun xcrun shim: ' + error.message + '\\n');
|
|
303
|
+
process.exit(1);
|
|
304
|
+
});
|
|
305
|
+
req.end(body);
|
|
306
|
+
`;
|
|
307
|
+
}
|
|
308
|
+
function listen(server, port) {
|
|
309
|
+
return new Promise((resolve, reject) => {
|
|
310
|
+
server.once('error', reject);
|
|
311
|
+
server.listen(port, '127.0.0.1', () => {
|
|
312
|
+
server.off('error', reject);
|
|
313
|
+
resolve();
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
function closeServer(server) {
|
|
318
|
+
return new Promise((resolve, reject) => {
|
|
319
|
+
server.close((error) => {
|
|
320
|
+
if (error) {
|
|
321
|
+
reject(error);
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
resolve();
|
|
325
|
+
}
|
|
326
|
+
});
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
function readJson(req) {
|
|
330
|
+
return new Promise((resolve, reject) => {
|
|
331
|
+
const chunks = [];
|
|
332
|
+
req.on('data', (chunk) => chunks.push(Buffer.from(chunk)));
|
|
333
|
+
req.on('end', () => {
|
|
334
|
+
try {
|
|
335
|
+
resolve(JSON.parse(Buffer.concat(chunks).toString('utf8') || '{}'));
|
|
336
|
+
}
|
|
337
|
+
catch (error) {
|
|
338
|
+
reject(error);
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
req.on('error', reject);
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
function sendJson(res, statusCode, payload) {
|
|
345
|
+
const body = JSON.stringify(payload);
|
|
346
|
+
res.writeHead(statusCode, {
|
|
347
|
+
'content-type': 'application/json',
|
|
348
|
+
'content-length': Buffer.byteLength(body),
|
|
349
|
+
});
|
|
350
|
+
res.end(body);
|
|
351
|
+
}
|
|
352
|
+
//# sourceMappingURL=ios-shim.js.map
|
package/ios-shim.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ios-shim.js","sourceRoot":"","sources":["src/ios-shim.ts"],"names":[],"mappings":"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"}
|