lim 0.28.0 → 0.28.2
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 +2 -1
- package/dist/base-command.d.ts.map +1 -1
- package/dist/base-command.js +80 -4
- package/dist/base-command.js.map +1 -1
- package/dist/commands/android/connect.d.ts +1 -0
- package/dist/commands/android/connect.d.ts.map +1 -1
- package/dist/commands/android/delete.d.ts +1 -0
- package/dist/commands/android/delete.d.ts.map +1 -1
- package/dist/commands/android/element-tree.d.ts +1 -0
- package/dist/commands/android/element-tree.d.ts.map +1 -1
- package/dist/commands/android/element-tree.js +1 -1
- package/dist/commands/android/element-tree.js.map +1 -1
- package/dist/commands/android/find-element.d.ts +1 -0
- package/dist/commands/android/find-element.d.ts.map +1 -1
- package/dist/commands/android/find-element.js +1 -1
- package/dist/commands/android/find-element.js.map +1 -1
- package/dist/commands/android/get.d.ts +1 -0
- package/dist/commands/android/get.d.ts.map +1 -1
- package/dist/commands/android/install-app.d.ts +1 -0
- package/dist/commands/android/install-app.d.ts.map +1 -1
- package/dist/commands/android/install-app.js +1 -1
- package/dist/commands/android/install-app.js.map +1 -1
- package/dist/commands/android/list.d.ts +1 -0
- package/dist/commands/android/list.d.ts.map +1 -1
- package/dist/commands/android/open-url.d.ts +1 -0
- package/dist/commands/android/open-url.d.ts.map +1 -1
- package/dist/commands/android/open-url.js +1 -1
- package/dist/commands/android/open-url.js.map +1 -1
- package/dist/commands/android/play-on-microphone.d.ts +1 -0
- package/dist/commands/android/play-on-microphone.d.ts.map +1 -1
- package/dist/commands/android/press-key.d.ts +1 -0
- package/dist/commands/android/press-key.d.ts.map +1 -1
- package/dist/commands/android/press-key.js +1 -1
- package/dist/commands/android/press-key.js.map +1 -1
- package/dist/commands/android/record.d.ts +1 -0
- package/dist/commands/android/record.d.ts.map +1 -1
- package/dist/commands/android/record.js +2 -2
- package/dist/commands/android/record.js.map +1 -1
- package/dist/commands/android/screenshot.d.ts +1 -0
- package/dist/commands/android/screenshot.d.ts.map +1 -1
- package/dist/commands/android/screenshot.js +1 -1
- package/dist/commands/android/screenshot.js.map +1 -1
- package/dist/commands/android/scroll.d.ts +1 -0
- package/dist/commands/android/scroll.d.ts.map +1 -1
- package/dist/commands/android/scroll.js +1 -1
- package/dist/commands/android/scroll.js.map +1 -1
- package/dist/commands/android/set-instance.d.ts +19 -0
- package/dist/commands/android/set-instance.d.ts.map +1 -0
- package/dist/commands/android/set-instance.js +53 -0
- package/dist/commands/android/set-instance.js.map +1 -0
- package/dist/commands/android/set-wifi-bandwidth.d.ts +1 -0
- package/dist/commands/android/set-wifi-bandwidth.d.ts.map +1 -1
- package/dist/commands/android/set-wifi-bandwidth.js +1 -1
- package/dist/commands/android/set-wifi-bandwidth.js.map +1 -1
- package/dist/commands/android/sync.d.ts +1 -0
- package/dist/commands/android/sync.d.ts.map +1 -1
- package/dist/commands/android/tap-element.d.ts +1 -0
- package/dist/commands/android/tap-element.d.ts.map +1 -1
- package/dist/commands/android/tap-element.js +1 -1
- package/dist/commands/android/tap-element.js.map +1 -1
- package/dist/commands/android/tap.d.ts +1 -0
- package/dist/commands/android/tap.d.ts.map +1 -1
- package/dist/commands/android/tap.js +1 -1
- package/dist/commands/android/tap.js.map +1 -1
- package/dist/commands/android/type.d.ts +1 -0
- package/dist/commands/android/type.d.ts.map +1 -1
- package/dist/commands/android/type.js +1 -1
- package/dist/commands/android/type.js.map +1 -1
- package/dist/commands/asset/delete.d.ts +1 -0
- package/dist/commands/asset/delete.d.ts.map +1 -1
- package/dist/commands/asset/list.d.ts +1 -0
- package/dist/commands/asset/list.d.ts.map +1 -1
- package/dist/commands/asset/pull.d.ts +1 -0
- package/dist/commands/asset/pull.d.ts.map +1 -1
- package/dist/commands/asset/push.d.ts +1 -0
- package/dist/commands/asset/push.d.ts.map +1 -1
- package/dist/commands/gradle/build.d.ts +1 -0
- package/dist/commands/gradle/build.d.ts.map +1 -1
- package/dist/commands/gradle/create.d.ts +1 -0
- package/dist/commands/gradle/create.d.ts.map +1 -1
- package/dist/commands/gradle/delete.d.ts +1 -0
- package/dist/commands/gradle/delete.d.ts.map +1 -1
- package/dist/commands/gradle/get.d.ts +1 -0
- package/dist/commands/gradle/get.d.ts.map +1 -1
- package/dist/commands/gradle/list.d.ts +1 -0
- package/dist/commands/gradle/list.d.ts.map +1 -1
- package/dist/commands/gradle/set-instance.d.ts +18 -0
- package/dist/commands/gradle/set-instance.d.ts.map +1 -0
- package/dist/commands/gradle/set-instance.js +47 -0
- package/dist/commands/gradle/set-instance.js.map +1 -0
- package/dist/commands/ios/app-log.d.ts +1 -0
- package/dist/commands/ios/app-log.d.ts.map +1 -1
- package/dist/commands/ios/app-log.js +1 -1
- package/dist/commands/ios/app-log.js.map +1 -1
- package/dist/commands/ios/camera.d.ts +1 -0
- package/dist/commands/ios/camera.d.ts.map +1 -1
- package/dist/commands/ios/create.d.ts +1 -0
- package/dist/commands/ios/create.d.ts.map +1 -1
- package/dist/commands/ios/delete-file.d.ts +1 -0
- package/dist/commands/ios/delete-file.d.ts.map +1 -1
- package/dist/commands/ios/delete.d.ts +1 -0
- package/dist/commands/ios/delete.d.ts.map +1 -1
- package/dist/commands/ios/element-tree.d.ts +1 -0
- package/dist/commands/ios/element-tree.d.ts.map +1 -1
- package/dist/commands/ios/element-tree.js +1 -1
- package/dist/commands/ios/element-tree.js.map +1 -1
- package/dist/commands/ios/get.d.ts +1 -0
- package/dist/commands/ios/get.d.ts.map +1 -1
- package/dist/commands/ios/info.d.ts +1 -0
- package/dist/commands/ios/info.d.ts.map +1 -1
- package/dist/commands/ios/info.js +1 -1
- package/dist/commands/ios/info.js.map +1 -1
- package/dist/commands/ios/install-app.d.ts +1 -0
- package/dist/commands/ios/install-app.d.ts.map +1 -1
- package/dist/commands/ios/install-app.js +1 -1
- package/dist/commands/ios/install-app.js.map +1 -1
- package/dist/commands/ios/keychain/generate-key.d.ts +1 -0
- package/dist/commands/ios/keychain/generate-key.d.ts.map +1 -1
- package/dist/commands/ios/keychain/restore.d.ts +1 -0
- package/dist/commands/ios/keychain/restore.d.ts.map +1 -1
- package/dist/commands/ios/keychain/save.d.ts +1 -0
- package/dist/commands/ios/keychain/save.d.ts.map +1 -1
- package/dist/commands/ios/launch-app.d.ts +1 -0
- package/dist/commands/ios/launch-app.d.ts.map +1 -1
- package/dist/commands/ios/launch-app.js +1 -1
- package/dist/commands/ios/launch-app.js.map +1 -1
- package/dist/commands/ios/list-apps.d.ts +1 -0
- package/dist/commands/ios/list-apps.d.ts.map +1 -1
- package/dist/commands/ios/list-apps.js +1 -1
- package/dist/commands/ios/list-apps.js.map +1 -1
- package/dist/commands/ios/list.d.ts +1 -0
- package/dist/commands/ios/list.d.ts.map +1 -1
- package/dist/commands/ios/lsof.d.ts +1 -0
- package/dist/commands/ios/lsof.d.ts.map +1 -1
- package/dist/commands/ios/maestro.d.ts +1 -0
- package/dist/commands/ios/maestro.d.ts.map +1 -1
- package/dist/commands/ios/open-url.d.ts +1 -0
- package/dist/commands/ios/open-url.d.ts.map +1 -1
- package/dist/commands/ios/open-url.js +1 -1
- package/dist/commands/ios/open-url.js.map +1 -1
- package/dist/commands/ios/perform.d.ts +1 -0
- package/dist/commands/ios/perform.d.ts.map +1 -1
- package/dist/commands/ios/perform.js +1 -1
- package/dist/commands/ios/perform.js.map +1 -1
- package/dist/commands/ios/play-on-microphone.d.ts +1 -0
- package/dist/commands/ios/play-on-microphone.d.ts.map +1 -1
- package/dist/commands/ios/press-key.d.ts +1 -0
- package/dist/commands/ios/press-key.d.ts.map +1 -1
- package/dist/commands/ios/press-key.js +1 -1
- package/dist/commands/ios/press-key.js.map +1 -1
- package/dist/commands/ios/pull-file.d.ts +1 -0
- package/dist/commands/ios/pull-file.d.ts.map +1 -1
- package/dist/commands/ios/push-file.d.ts +1 -0
- package/dist/commands/ios/push-file.d.ts.map +1 -1
- package/dist/commands/ios/record.d.ts +1 -0
- package/dist/commands/ios/record.d.ts.map +1 -1
- package/dist/commands/ios/record.js +2 -2
- package/dist/commands/ios/record.js.map +1 -1
- package/dist/commands/ios/reverse.d.ts +1 -0
- package/dist/commands/ios/reverse.d.ts.map +1 -1
- package/dist/commands/ios/screenshot.d.ts +1 -0
- package/dist/commands/ios/screenshot.d.ts.map +1 -1
- package/dist/commands/ios/screenshot.js +1 -1
- package/dist/commands/ios/screenshot.js.map +1 -1
- package/dist/commands/ios/scroll.d.ts +1 -0
- package/dist/commands/ios/scroll.d.ts.map +1 -1
- package/dist/commands/ios/scroll.js +1 -1
- package/dist/commands/ios/scroll.js.map +1 -1
- package/dist/commands/ios/set-instance.d.ts +18 -0
- package/dist/commands/ios/set-instance.d.ts.map +1 -0
- package/dist/commands/ios/set-instance.js +47 -0
- package/dist/commands/ios/set-instance.js.map +1 -0
- package/dist/commands/ios/set-text.d.ts +1 -0
- package/dist/commands/ios/set-text.d.ts.map +1 -1
- package/dist/commands/ios/set-text.js +1 -1
- package/dist/commands/ios/set-text.js.map +1 -1
- package/dist/commands/ios/simctl.d.ts +1 -0
- package/dist/commands/ios/simctl.d.ts.map +1 -1
- package/dist/commands/ios/stop-microphone-playback.d.ts +1 -0
- package/dist/commands/ios/stop-microphone-playback.d.ts.map +1 -1
- package/dist/commands/ios/swipe.d.ts +1 -0
- package/dist/commands/ios/swipe.d.ts.map +1 -1
- package/dist/commands/ios/swipe.js +1 -1
- package/dist/commands/ios/swipe.js.map +1 -1
- package/dist/commands/ios/sync.d.ts +1 -0
- package/dist/commands/ios/sync.d.ts.map +1 -1
- package/dist/commands/ios/syslog.d.ts +1 -0
- package/dist/commands/ios/syslog.d.ts.map +1 -1
- package/dist/commands/ios/tap-element.d.ts +1 -0
- package/dist/commands/ios/tap-element.d.ts.map +1 -1
- package/dist/commands/ios/tap-element.js +1 -1
- package/dist/commands/ios/tap-element.js.map +1 -1
- package/dist/commands/ios/tap.d.ts +1 -0
- package/dist/commands/ios/tap.d.ts.map +1 -1
- package/dist/commands/ios/tap.js +1 -1
- package/dist/commands/ios/tap.js.map +1 -1
- package/dist/commands/ios/terminate-app.d.ts +1 -0
- package/dist/commands/ios/terminate-app.d.ts.map +1 -1
- package/dist/commands/ios/terminate-app.js +1 -1
- package/dist/commands/ios/terminate-app.js.map +1 -1
- package/dist/commands/ios/toggle-keyboard.d.ts +1 -0
- package/dist/commands/ios/toggle-keyboard.d.ts.map +1 -1
- package/dist/commands/ios/toggle-keyboard.js +1 -1
- package/dist/commands/ios/toggle-keyboard.js.map +1 -1
- package/dist/commands/ios/type.d.ts +1 -0
- package/dist/commands/ios/type.d.ts.map +1 -1
- package/dist/commands/ios/type.js +1 -1
- package/dist/commands/ios/type.js.map +1 -1
- package/dist/commands/ios/xcodebuild.d.ts +1 -0
- package/dist/commands/ios/xcodebuild.d.ts.map +1 -1
- package/dist/commands/ios/xcrun.d.ts +1 -0
- package/dist/commands/ios/xcrun.d.ts.map +1 -1
- package/dist/commands/login.d.ts +1 -0
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/logout.d.ts +1 -0
- package/dist/commands/logout.d.ts.map +1 -1
- package/dist/commands/session/start.d.ts +1 -0
- package/dist/commands/session/start.d.ts.map +1 -1
- package/dist/commands/session/start.js +1 -34
- package/dist/commands/session/start.js.map +1 -1
- package/dist/commands/session/status.d.ts +1 -0
- package/dist/commands/session/status.d.ts.map +1 -1
- package/dist/commands/session/stop.d.ts +1 -0
- package/dist/commands/session/stop.d.ts.map +1 -1
- package/dist/commands/xcode/attach-simulator.d.ts +1 -0
- package/dist/commands/xcode/attach-simulator.d.ts.map +1 -1
- package/dist/commands/xcode/build.d.ts +1 -0
- package/dist/commands/xcode/build.d.ts.map +1 -1
- package/dist/commands/xcode/create.d.ts +1 -0
- package/dist/commands/xcode/create.d.ts.map +1 -1
- package/dist/commands/xcode/delete.d.ts +1 -0
- package/dist/commands/xcode/delete.d.ts.map +1 -1
- package/dist/commands/xcode/get.d.ts +1 -0
- package/dist/commands/xcode/get.d.ts.map +1 -1
- package/dist/commands/xcode/list.d.ts +1 -0
- package/dist/commands/xcode/list.d.ts.map +1 -1
- package/dist/commands/xcode/rbe/upload.d.ts +1 -0
- package/dist/commands/xcode/rbe/upload.d.ts.map +1 -1
- package/dist/commands/xcode/run.d.ts +1 -0
- package/dist/commands/xcode/run.d.ts.map +1 -1
- package/dist/commands/xcode/set-instance.d.ts +18 -0
- package/dist/commands/xcode/set-instance.d.ts.map +1 -0
- package/dist/commands/xcode/set-instance.js +47 -0
- package/dist/commands/xcode/set-instance.js.map +1 -0
- package/dist/commands/xcode/sync.d.ts +1 -0
- package/dist/commands/xcode/sync.d.ts.map +1 -1
- package/dist/lib/config.d.ts +6 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +24 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/daemon.d.ts +12 -0
- package/dist/lib/daemon.d.ts.map +1 -1
- package/dist/lib/daemon.js +141 -23
- package/dist/lib/daemon.js.map +1 -1
- package/dist/lib/instance-client-factory.d.ts +15 -2
- package/dist/lib/instance-client-factory.d.ts.map +1 -1
- package/dist/lib/instance-client-factory.js +40 -4
- package/dist/lib/instance-client-factory.js.map +1 -1
- package/dist/lib/instance-client-factory.test.d.ts +2 -0
- package/dist/lib/instance-client-factory.test.d.ts.map +1 -0
- package/dist/lib/instance-client-factory.test.js +78 -0
- package/dist/lib/instance-client-factory.test.js.map +1 -0
- package/dist/lib/set-instance.d.ts +41 -0
- package/dist/lib/set-instance.d.ts.map +1 -0
- package/dist/lib/set-instance.js +103 -0
- package/dist/lib/set-instance.js.map +1 -0
- package/dist/lib/set-instance.test.d.ts +2 -0
- package/dist/lib/set-instance.test.d.ts.map +1 -0
- package/dist/lib/set-instance.test.js +118 -0
- package/dist/lib/set-instance.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const instance_client_factory_1 = require("./instance-client-factory");
|
|
4
|
+
const daemon_client_1 = require("./daemon-client");
|
|
5
|
+
jest.mock('./daemon-client', () => ({
|
|
6
|
+
isSessionActive: jest.fn(),
|
|
7
|
+
sendCommand: jest.fn(),
|
|
8
|
+
}));
|
|
9
|
+
const isSessionActiveMock = daemon_client_1.isSessionActive;
|
|
10
|
+
const IOS_TARGET = {
|
|
11
|
+
id: 'ios_euna_01m02anjqredzr42pcn8s8jx90',
|
|
12
|
+
type: 'ios',
|
|
13
|
+
apiUrl: 'https://region.limrun.com/v1/ios_x/api',
|
|
14
|
+
token: 'lim_st_token',
|
|
15
|
+
};
|
|
16
|
+
const ANDROID_TARGET = {
|
|
17
|
+
id: 'android_euna_01m02anjqredzr42pcn8s8jx90',
|
|
18
|
+
type: 'android',
|
|
19
|
+
apiUrl: 'https://region.limrun.com/v1/android_x/api',
|
|
20
|
+
token: 'lim_st_token',
|
|
21
|
+
adbWebSocketUrl: 'wss://region.limrun.com/v1/android_x/adb',
|
|
22
|
+
};
|
|
23
|
+
describe('ensureDaemonSession', () => {
|
|
24
|
+
let spawnFn;
|
|
25
|
+
let stderr;
|
|
26
|
+
beforeEach(() => {
|
|
27
|
+
isSessionActiveMock.mockReset();
|
|
28
|
+
isSessionActiveMock.mockReturnValue(false);
|
|
29
|
+
spawnFn = jest.fn().mockResolvedValue(undefined);
|
|
30
|
+
stderr = jest.spyOn(console, 'error').mockImplementation(() => { });
|
|
31
|
+
(0, instance_client_factory_1.setSessionAutoStart)({ enabled: true, silent: false });
|
|
32
|
+
});
|
|
33
|
+
afterEach(() => {
|
|
34
|
+
stderr.mockRestore();
|
|
35
|
+
(0, instance_client_factory_1.setSessionAutoStart)({ enabled: true, silent: false });
|
|
36
|
+
});
|
|
37
|
+
it('uses the existing session without spawning', async () => {
|
|
38
|
+
isSessionActiveMock.mockReturnValue(true);
|
|
39
|
+
await expect((0, instance_client_factory_1.ensureDaemonSession)(IOS_TARGET, spawnFn)).resolves.toBe(true);
|
|
40
|
+
expect(spawnFn).not.toHaveBeenCalled();
|
|
41
|
+
});
|
|
42
|
+
it('does not spawn when auto-start is disabled', async () => {
|
|
43
|
+
(0, instance_client_factory_1.setSessionAutoStart)({ enabled: false });
|
|
44
|
+
await expect((0, instance_client_factory_1.ensureDaemonSession)(IOS_TARGET, spawnFn)).resolves.toBe(false);
|
|
45
|
+
expect(spawnFn).not.toHaveBeenCalled();
|
|
46
|
+
});
|
|
47
|
+
it('does not spawn when credentials are not known yet', async () => {
|
|
48
|
+
const idOnly = { id: IOS_TARGET.id, type: 'ios' };
|
|
49
|
+
await expect((0, instance_client_factory_1.ensureDaemonSession)(idOnly, spawnFn)).resolves.toBe(false);
|
|
50
|
+
expect(spawnFn).not.toHaveBeenCalled();
|
|
51
|
+
});
|
|
52
|
+
it('spawns with the target credentials and announces on stderr', async () => {
|
|
53
|
+
await expect((0, instance_client_factory_1.ensureDaemonSession)(IOS_TARGET, spawnFn)).resolves.toBe(true);
|
|
54
|
+
expect(spawnFn).toHaveBeenCalledWith({
|
|
55
|
+
instanceId: IOS_TARGET.id,
|
|
56
|
+
instanceType: 'ios',
|
|
57
|
+
apiUrl: IOS_TARGET.apiUrl,
|
|
58
|
+
adbUrl: undefined,
|
|
59
|
+
token: IOS_TARGET.token,
|
|
60
|
+
});
|
|
61
|
+
expect(stderr).toHaveBeenCalledWith(`WebSocket daemon started for ${IOS_TARGET.id}.`);
|
|
62
|
+
});
|
|
63
|
+
it('passes the adb url for android targets', async () => {
|
|
64
|
+
await expect((0, instance_client_factory_1.ensureDaemonSession)(ANDROID_TARGET, spawnFn)).resolves.toBe(true);
|
|
65
|
+
expect(spawnFn).toHaveBeenCalledWith(expect.objectContaining({ instanceType: 'android', adbUrl: ANDROID_TARGET.adbWebSocketUrl }));
|
|
66
|
+
});
|
|
67
|
+
it('stays quiet when silent', async () => {
|
|
68
|
+
(0, instance_client_factory_1.setSessionAutoStart)({ enabled: true, silent: true });
|
|
69
|
+
await expect((0, instance_client_factory_1.ensureDaemonSession)(IOS_TARGET, spawnFn)).resolves.toBe(true);
|
|
70
|
+
expect(stderr).not.toHaveBeenCalled();
|
|
71
|
+
});
|
|
72
|
+
it('falls back to direct connection when the spawn fails', async () => {
|
|
73
|
+
spawnFn.mockRejectedValue(new Error('boom'));
|
|
74
|
+
await expect((0, instance_client_factory_1.ensureDaemonSession)(IOS_TARGET, spawnFn)).resolves.toBe(false);
|
|
75
|
+
expect(stderr).toHaveBeenCalledWith(`Could not start WebSocket daemon for ${IOS_TARGET.id} (boom); connecting directly.`);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
//# sourceMappingURL=instance-client-factory.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instance-client-factory.test.js","sourceRoot":"","sources":["../../src/lib/instance-client-factory.test.ts"],"names":[],"mappings":";;AAAA,uEAAqF;AACrF,mDAAkD;AAGlD,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC;IAClC,eAAe,EAAE,IAAI,CAAC,EAAE,EAAE;IAC1B,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE;CACvB,CAAC,CAAC,CAAC;AAEJ,MAAM,mBAAmB,GAAG,+BAA4B,CAAC;AAEzD,MAAM,UAAU,GAAoB;IAClC,EAAE,EAAE,qCAAqC;IACzC,IAAI,EAAE,KAAK;IACX,MAAM,EAAE,wCAAwC;IAChD,KAAK,EAAE,cAAc;CACtB,CAAC;AAEF,MAAM,cAAc,GAAwB;IAC1C,EAAE,EAAE,yCAAyC;IAC7C,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,4CAA4C;IACpD,KAAK,EAAE,cAAc;IACrB,eAAe,EAAE,0CAA0C;CAC5D,CAAC;AAEF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,IAAI,OAAkB,CAAC;IACvB,IAAI,MAAwB,CAAC;IAE7B,UAAU,CAAC,GAAG,EAAE;QACd,mBAAmB,CAAC,SAAS,EAAE,CAAC;QAChC,mBAAmB,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAC3C,OAAO,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACnE,IAAA,6CAAmB,EAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,WAAW,EAAE,CAAC;QACrB,IAAA,6CAAmB,EAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,mBAAmB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,MAAM,CAAC,IAAA,6CAAmB,EAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3E,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,IAAA,6CAAmB,EAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACxC,MAAM,MAAM,CAAC,IAAA,6CAAmB,EAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5E,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,MAAM,GAAoB,EAAE,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QACnE,MAAM,MAAM,CAAC,IAAA,6CAAmB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxE,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,MAAM,CAAC,IAAA,6CAAmB,EAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3E,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC;YACnC,UAAU,EAAE,UAAU,CAAC,EAAE;YACzB,YAAY,EAAE,KAAK;YACnB,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,MAAM,EAAE,SAAS;YACjB,KAAK,EAAE,UAAU,CAAC,KAAK;SACxB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,gCAAgC,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,MAAM,CAAC,IAAA,6CAAmB,EAAC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/E,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAClC,MAAM,CAAC,gBAAgB,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,CAAC,eAAe,EAAE,CAAC,CAC7F,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QACvC,IAAA,6CAAmB,EAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,MAAM,MAAM,CAAC,IAAA,6CAAmB,EAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3E,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,OAAO,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7C,MAAM,MAAM,CAAC,IAAA,6CAAmB,EAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5E,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CACjC,wCAAwC,UAAU,CAAC,EAAE,+BAA+B,CACrF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { type LastAndroidInstance, type LastGradleInstance, type LastIosInstance, type LastXcodeInstance } from './config';
|
|
2
|
+
import { type InstanceType } from './instance-client-factory';
|
|
3
|
+
export type ManualInstanceRecord = LastAndroidInstance | LastIosInstance | LastXcodeInstance | LastGradleInstance;
|
|
4
|
+
/**
|
|
5
|
+
* The instance id named by a signed token's scopes, if any. Signed tokens are
|
|
6
|
+
* JWTs whose payload carries scopes shaped <resource>:<instance-tid>:<action>,
|
|
7
|
+
* so the token itself tells which instance it opens. Decoded without
|
|
8
|
+
* verification: the id is local bookkeeping, the router does the real check.
|
|
9
|
+
* Legacy opaque tokens and wildcard scopes yield undefined.
|
|
10
|
+
*/
|
|
11
|
+
export declare function instanceIdFromToken(token: string, type: InstanceType): string | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* A deterministic local handle for an instance whose token names no id (legacy
|
|
14
|
+
* opaque tokens, wildcard scopes). Hashing the apiUrl keeps re-runs idempotent:
|
|
15
|
+
* the same instance maps to the same record and daemon session. The type
|
|
16
|
+
* prefix keeps prefix-based dispatch (detectInstanceType) working.
|
|
17
|
+
*/
|
|
18
|
+
export declare function syntheticInstanceId(type: InstanceType, apiUrl: string): string;
|
|
19
|
+
export interface ManualInstanceInput {
|
|
20
|
+
type: InstanceType;
|
|
21
|
+
apiUrl: string;
|
|
22
|
+
token: string;
|
|
23
|
+
adbWebSocketUrl?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* A last-instance record built from just apiUrl + token, the minimum needed
|
|
27
|
+
* for direct instance control without a management API key.
|
|
28
|
+
*/
|
|
29
|
+
export declare function buildManualInstanceRecord(input: ManualInstanceInput): ManualInstanceRecord;
|
|
30
|
+
/**
|
|
31
|
+
* The ambient target pinned by LIM_<TYPE>_INSTANCE_URL + LIM_<TYPE>_INSTANCE_TOKEN,
|
|
32
|
+
* or null when either is missing. Built in memory and never persisted, so the
|
|
33
|
+
* environment fully defines the target per process — a parent hands a sandboxed
|
|
34
|
+
* agent two env vars and every command just works, no set-instance needed.
|
|
35
|
+
*/
|
|
36
|
+
export declare function envInstanceTarget(type: 'ios'): LastIosInstance | null;
|
|
37
|
+
export declare function envInstanceTarget(type: 'android'): LastAndroidInstance | null;
|
|
38
|
+
export declare function envInstanceTarget(type: 'xcode'): LastXcodeInstance | null;
|
|
39
|
+
export declare function envInstanceTarget(type: 'gradle'): LastGradleInstance | null;
|
|
40
|
+
export declare function envInstanceTarget(type: InstanceType): ManualInstanceRecord | null;
|
|
41
|
+
//# sourceMappingURL=set-instance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-instance.d.ts","sourceRoot":"","sources":["../../src/lib/set-instance.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACvB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE9D,MAAM,MAAM,oBAAoB,GAC5B,mBAAmB,GACnB,eAAe,GACf,iBAAiB,GACjB,kBAAkB,CAAC;AAavB;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,CAsBzF;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAG9E;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,mBAAmB,GAAG,oBAAoB,CAkB1F;AAMD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,KAAK,GAAG,eAAe,GAAG,IAAI,CAAC;AACvE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,GAAG,mBAAmB,GAAG,IAAI,CAAC;AAC/E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,iBAAiB,GAAG,IAAI,CAAC;AAC3E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,kBAAkB,GAAG,IAAI,CAAC;AAC7E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG,oBAAoB,GAAG,IAAI,CAAC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.instanceIdFromToken = instanceIdFromToken;
|
|
7
|
+
exports.syntheticInstanceId = syntheticInstanceId;
|
|
8
|
+
exports.buildManualInstanceRecord = buildManualInstanceRecord;
|
|
9
|
+
exports.envInstanceTarget = envInstanceTarget;
|
|
10
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
11
|
+
const SIGNED_TOKEN_PREFIX = 'lim_st_';
|
|
12
|
+
// TID prefixes an instance of each type can carry. Xcode instances appear
|
|
13
|
+
// both standalone (xcode_) and as sandboxes nested in iOS instances (sandbox_).
|
|
14
|
+
const ID_PREFIXES = {
|
|
15
|
+
ios: ['ios'],
|
|
16
|
+
android: ['android'],
|
|
17
|
+
xcode: ['xcode', 'sandbox'],
|
|
18
|
+
gradle: ['gradle'],
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* The instance id named by a signed token's scopes, if any. Signed tokens are
|
|
22
|
+
* JWTs whose payload carries scopes shaped <resource>:<instance-tid>:<action>,
|
|
23
|
+
* so the token itself tells which instance it opens. Decoded without
|
|
24
|
+
* verification: the id is local bookkeeping, the router does the real check.
|
|
25
|
+
* Legacy opaque tokens and wildcard scopes yield undefined.
|
|
26
|
+
*/
|
|
27
|
+
function instanceIdFromToken(token, type) {
|
|
28
|
+
if (!token.startsWith(SIGNED_TOKEN_PREFIX))
|
|
29
|
+
return undefined;
|
|
30
|
+
const parts = token.slice(SIGNED_TOKEN_PREFIX.length).split('.');
|
|
31
|
+
if (parts.length !== 3)
|
|
32
|
+
return undefined;
|
|
33
|
+
let payload;
|
|
34
|
+
try {
|
|
35
|
+
payload = JSON.parse(Buffer.from(parts[1], 'base64url').toString('utf-8'));
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
if (typeof payload !== 'object' || payload === null)
|
|
41
|
+
return undefined;
|
|
42
|
+
const scopes = payload.scopes;
|
|
43
|
+
if (!Array.isArray(scopes))
|
|
44
|
+
return undefined;
|
|
45
|
+
for (const raw of scopes) {
|
|
46
|
+
if (typeof raw !== 'string')
|
|
47
|
+
continue;
|
|
48
|
+
const segments = raw.split(':');
|
|
49
|
+
if (segments.length !== 3)
|
|
50
|
+
continue;
|
|
51
|
+
const [resource, id] = segments;
|
|
52
|
+
if (resource !== type || !id || id === '*')
|
|
53
|
+
continue;
|
|
54
|
+
if (ID_PREFIXES[type].some((prefix) => id.startsWith(`${prefix}_`)))
|
|
55
|
+
return id;
|
|
56
|
+
}
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* A deterministic local handle for an instance whose token names no id (legacy
|
|
61
|
+
* opaque tokens, wildcard scopes). Hashing the apiUrl keeps re-runs idempotent:
|
|
62
|
+
* the same instance maps to the same record and daemon session. The type
|
|
63
|
+
* prefix keeps prefix-based dispatch (detectInstanceType) working.
|
|
64
|
+
*/
|
|
65
|
+
function syntheticInstanceId(type, apiUrl) {
|
|
66
|
+
const hash = crypto_1.default.createHash('sha1').update(apiUrl).digest('hex').slice(0, 12);
|
|
67
|
+
return `${type}_local_${hash}`;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* A last-instance record built from just apiUrl + token, the minimum needed
|
|
71
|
+
* for direct instance control without a management API key.
|
|
72
|
+
*/
|
|
73
|
+
function buildManualInstanceRecord(input) {
|
|
74
|
+
const id = instanceIdFromToken(input.token, input.type) ?? syntheticInstanceId(input.type, input.apiUrl);
|
|
75
|
+
switch (input.type) {
|
|
76
|
+
case 'android':
|
|
77
|
+
return {
|
|
78
|
+
id,
|
|
79
|
+
type: 'android',
|
|
80
|
+
apiUrl: input.apiUrl,
|
|
81
|
+
token: input.token,
|
|
82
|
+
...(input.adbWebSocketUrl ? { adbWebSocketUrl: input.adbWebSocketUrl } : {}),
|
|
83
|
+
};
|
|
84
|
+
case 'ios':
|
|
85
|
+
return { id, type: 'ios', apiUrl: input.apiUrl, token: input.token };
|
|
86
|
+
case 'xcode':
|
|
87
|
+
return { id, type: 'xcode', apiUrl: input.apiUrl, token: input.token };
|
|
88
|
+
case 'gradle':
|
|
89
|
+
return { id, type: 'gradle', apiUrl: input.apiUrl, token: input.token };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function envVarName(type, suffix) {
|
|
93
|
+
return `LIM_${type.toUpperCase()}_INSTANCE_${suffix}`;
|
|
94
|
+
}
|
|
95
|
+
function envInstanceTarget(type) {
|
|
96
|
+
const apiUrl = process.env[envVarName(type, 'URL')]?.trim();
|
|
97
|
+
const token = process.env[envVarName(type, 'TOKEN')]?.trim();
|
|
98
|
+
if (!apiUrl || !token)
|
|
99
|
+
return null;
|
|
100
|
+
const adbWebSocketUrl = type === 'android' ? process.env[envVarName(type, 'ADB_URL')]?.trim() : undefined;
|
|
101
|
+
return buildManualInstanceRecord({ type, apiUrl, token, ...(adbWebSocketUrl ? { adbWebSocketUrl } : {}) });
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=set-instance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-instance.js","sourceRoot":"","sources":["../../src/lib/set-instance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-instance.test.d.ts","sourceRoot":"","sources":["../../src/lib/set-instance.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const set_instance_1 = require("./set-instance");
|
|
4
|
+
function signedToken(scopes) {
|
|
5
|
+
const header = Buffer.from(JSON.stringify({ alg: 'EdDSA', typ: 'JWT' })).toString('base64url');
|
|
6
|
+
const payload = Buffer.from(JSON.stringify({ iss: 'limrun', sub: 'org_01abc', scopes })).toString('base64url');
|
|
7
|
+
return `lim_st_${header}.${payload}.c2lnbmF0dXJl`;
|
|
8
|
+
}
|
|
9
|
+
const IOS_TID = 'ios_euna_01m02anjqredzr42pcn8s8jx90';
|
|
10
|
+
const SANDBOX_TID = 'sandbox_euna_01m02anjqredzr42pcn8s8jx90';
|
|
11
|
+
describe('instanceIdFromToken', () => {
|
|
12
|
+
it('extracts the instance id from a matching scope', () => {
|
|
13
|
+
expect((0, set_instance_1.instanceIdFromToken)(signedToken([`ios:${IOS_TID}:all`]), 'ios')).toBe(IOS_TID);
|
|
14
|
+
});
|
|
15
|
+
it('picks the scope whose resource matches the topic among several', () => {
|
|
16
|
+
const token = signedToken(['android:android_euna_01abc:all', `ios:${IOS_TID}:all`]);
|
|
17
|
+
expect((0, set_instance_1.instanceIdFromToken)(token, 'ios')).toBe(IOS_TID);
|
|
18
|
+
expect((0, set_instance_1.instanceIdFromToken)(token, 'android')).toBe('android_euna_01abc');
|
|
19
|
+
});
|
|
20
|
+
it('maps sandbox tids to the xcode topic', () => {
|
|
21
|
+
expect((0, set_instance_1.instanceIdFromToken)(signedToken([`xcode:${SANDBOX_TID}:all`]), 'xcode')).toBe(SANDBOX_TID);
|
|
22
|
+
});
|
|
23
|
+
it('yields nothing for wildcard scopes', () => {
|
|
24
|
+
expect((0, set_instance_1.instanceIdFromToken)(signedToken(['ios:*:all']), 'ios')).toBeUndefined();
|
|
25
|
+
});
|
|
26
|
+
it('yields nothing for legacy opaque tokens', () => {
|
|
27
|
+
expect((0, set_instance_1.instanceIdFromToken)('random-opaque-token', 'ios')).toBeUndefined();
|
|
28
|
+
});
|
|
29
|
+
it('yields nothing for a scope whose id prefix contradicts its resource', () => {
|
|
30
|
+
expect((0, set_instance_1.instanceIdFromToken)(signedToken([`ios:${SANDBOX_TID}:all`]), 'ios')).toBeUndefined();
|
|
31
|
+
});
|
|
32
|
+
it('survives malformed payloads', () => {
|
|
33
|
+
expect((0, set_instance_1.instanceIdFromToken)('lim_st_not.a.jwt', 'ios')).toBeUndefined();
|
|
34
|
+
expect((0, set_instance_1.instanceIdFromToken)(signedToken('not-an-array'), 'ios')).toBeUndefined();
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
describe('syntheticInstanceId', () => {
|
|
38
|
+
it('is deterministic per apiUrl and carries the type prefix', () => {
|
|
39
|
+
const a = (0, set_instance_1.syntheticInstanceId)('ios', 'https://region.limrun.com/v1/x/api');
|
|
40
|
+
expect(a).toBe((0, set_instance_1.syntheticInstanceId)('ios', 'https://region.limrun.com/v1/x/api'));
|
|
41
|
+
expect(a).toMatch(/^ios_local_[0-9a-f]{12}$/);
|
|
42
|
+
expect((0, set_instance_1.syntheticInstanceId)('ios', 'https://other.limrun.com/v1/y/api')).not.toBe(a);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
describe('buildManualInstanceRecord', () => {
|
|
46
|
+
it('uses the token id when the token names one', () => {
|
|
47
|
+
const record = (0, set_instance_1.buildManualInstanceRecord)({
|
|
48
|
+
type: 'ios',
|
|
49
|
+
apiUrl: 'https://region.limrun.com/v1/x/api',
|
|
50
|
+
token: signedToken([`ios:${IOS_TID}:all`]),
|
|
51
|
+
});
|
|
52
|
+
expect(record).toEqual({
|
|
53
|
+
id: IOS_TID,
|
|
54
|
+
type: 'ios',
|
|
55
|
+
apiUrl: 'https://region.limrun.com/v1/x/api',
|
|
56
|
+
token: signedToken([`ios:${IOS_TID}:all`]),
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
it('falls back to a synthetic handle for legacy tokens', () => {
|
|
60
|
+
const record = (0, set_instance_1.buildManualInstanceRecord)({
|
|
61
|
+
type: 'gradle',
|
|
62
|
+
apiUrl: 'https://region.limrun.com/v1/x/api',
|
|
63
|
+
token: 'opaque',
|
|
64
|
+
});
|
|
65
|
+
expect(record.id).toMatch(/^gradle_local_[0-9a-f]{12}$/);
|
|
66
|
+
expect(record.type).toBe('gradle');
|
|
67
|
+
});
|
|
68
|
+
it('keeps the ADB websocket URL on android records', () => {
|
|
69
|
+
const record = (0, set_instance_1.buildManualInstanceRecord)({
|
|
70
|
+
type: 'android',
|
|
71
|
+
apiUrl: 'https://region.limrun.com/v1/x/api',
|
|
72
|
+
token: 'opaque',
|
|
73
|
+
adbWebSocketUrl: 'wss://region.limrun.com/adb',
|
|
74
|
+
});
|
|
75
|
+
expect(record).toMatchObject({ type: 'android', adbWebSocketUrl: 'wss://region.limrun.com/adb' });
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
describe('envInstanceTarget', () => {
|
|
79
|
+
const VARS = [
|
|
80
|
+
'LIM_IOS_INSTANCE_URL',
|
|
81
|
+
'LIM_IOS_INSTANCE_TOKEN',
|
|
82
|
+
'LIM_ANDROID_INSTANCE_URL',
|
|
83
|
+
'LIM_ANDROID_INSTANCE_TOKEN',
|
|
84
|
+
'LIM_ANDROID_INSTANCE_ADB_URL',
|
|
85
|
+
];
|
|
86
|
+
const saved = {};
|
|
87
|
+
beforeEach(() => {
|
|
88
|
+
for (const name of VARS) {
|
|
89
|
+
saved[name] = process.env[name];
|
|
90
|
+
delete process.env[name];
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
afterEach(() => {
|
|
94
|
+
for (const name of VARS) {
|
|
95
|
+
if (saved[name] === undefined)
|
|
96
|
+
delete process.env[name];
|
|
97
|
+
else
|
|
98
|
+
process.env[name] = saved[name];
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
it('returns null unless both URL and token are set', () => {
|
|
102
|
+
expect((0, set_instance_1.envInstanceTarget)('ios')).toBeNull();
|
|
103
|
+
process.env['LIM_IOS_INSTANCE_URL'] = 'https://region.limrun.com/v1/x/api';
|
|
104
|
+
expect((0, set_instance_1.envInstanceTarget)('ios')).toBeNull();
|
|
105
|
+
process.env['LIM_IOS_INSTANCE_TOKEN'] = signedToken([`ios:${IOS_TID}:all`]);
|
|
106
|
+
expect((0, set_instance_1.envInstanceTarget)('ios')).toMatchObject({ id: IOS_TID, type: 'ios' });
|
|
107
|
+
});
|
|
108
|
+
it('includes the ADB URL for android when set', () => {
|
|
109
|
+
process.env['LIM_ANDROID_INSTANCE_URL'] = 'https://region.limrun.com/v1/x/api';
|
|
110
|
+
process.env['LIM_ANDROID_INSTANCE_TOKEN'] = 'opaque';
|
|
111
|
+
process.env['LIM_ANDROID_INSTANCE_ADB_URL'] = 'wss://region.limrun.com/adb';
|
|
112
|
+
expect((0, set_instance_1.envInstanceTarget)('android')).toMatchObject({
|
|
113
|
+
type: 'android',
|
|
114
|
+
adbWebSocketUrl: 'wss://region.limrun.com/adb',
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
//# sourceMappingURL=set-instance.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-instance.test.js","sourceRoot":"","sources":["../../src/lib/set-instance.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED