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.
Files changed (271) hide show
  1. package/dist/base-command.d.ts +2 -1
  2. package/dist/base-command.d.ts.map +1 -1
  3. package/dist/base-command.js +80 -4
  4. package/dist/base-command.js.map +1 -1
  5. package/dist/commands/android/connect.d.ts +1 -0
  6. package/dist/commands/android/connect.d.ts.map +1 -1
  7. package/dist/commands/android/delete.d.ts +1 -0
  8. package/dist/commands/android/delete.d.ts.map +1 -1
  9. package/dist/commands/android/element-tree.d.ts +1 -0
  10. package/dist/commands/android/element-tree.d.ts.map +1 -1
  11. package/dist/commands/android/element-tree.js +1 -1
  12. package/dist/commands/android/element-tree.js.map +1 -1
  13. package/dist/commands/android/find-element.d.ts +1 -0
  14. package/dist/commands/android/find-element.d.ts.map +1 -1
  15. package/dist/commands/android/find-element.js +1 -1
  16. package/dist/commands/android/find-element.js.map +1 -1
  17. package/dist/commands/android/get.d.ts +1 -0
  18. package/dist/commands/android/get.d.ts.map +1 -1
  19. package/dist/commands/android/install-app.d.ts +1 -0
  20. package/dist/commands/android/install-app.d.ts.map +1 -1
  21. package/dist/commands/android/install-app.js +1 -1
  22. package/dist/commands/android/install-app.js.map +1 -1
  23. package/dist/commands/android/list.d.ts +1 -0
  24. package/dist/commands/android/list.d.ts.map +1 -1
  25. package/dist/commands/android/open-url.d.ts +1 -0
  26. package/dist/commands/android/open-url.d.ts.map +1 -1
  27. package/dist/commands/android/open-url.js +1 -1
  28. package/dist/commands/android/open-url.js.map +1 -1
  29. package/dist/commands/android/play-on-microphone.d.ts +1 -0
  30. package/dist/commands/android/play-on-microphone.d.ts.map +1 -1
  31. package/dist/commands/android/press-key.d.ts +1 -0
  32. package/dist/commands/android/press-key.d.ts.map +1 -1
  33. package/dist/commands/android/press-key.js +1 -1
  34. package/dist/commands/android/press-key.js.map +1 -1
  35. package/dist/commands/android/record.d.ts +1 -0
  36. package/dist/commands/android/record.d.ts.map +1 -1
  37. package/dist/commands/android/record.js +2 -2
  38. package/dist/commands/android/record.js.map +1 -1
  39. package/dist/commands/android/screenshot.d.ts +1 -0
  40. package/dist/commands/android/screenshot.d.ts.map +1 -1
  41. package/dist/commands/android/screenshot.js +1 -1
  42. package/dist/commands/android/screenshot.js.map +1 -1
  43. package/dist/commands/android/scroll.d.ts +1 -0
  44. package/dist/commands/android/scroll.d.ts.map +1 -1
  45. package/dist/commands/android/scroll.js +1 -1
  46. package/dist/commands/android/scroll.js.map +1 -1
  47. package/dist/commands/android/set-instance.d.ts +19 -0
  48. package/dist/commands/android/set-instance.d.ts.map +1 -0
  49. package/dist/commands/android/set-instance.js +53 -0
  50. package/dist/commands/android/set-instance.js.map +1 -0
  51. package/dist/commands/android/set-wifi-bandwidth.d.ts +1 -0
  52. package/dist/commands/android/set-wifi-bandwidth.d.ts.map +1 -1
  53. package/dist/commands/android/set-wifi-bandwidth.js +1 -1
  54. package/dist/commands/android/set-wifi-bandwidth.js.map +1 -1
  55. package/dist/commands/android/sync.d.ts +1 -0
  56. package/dist/commands/android/sync.d.ts.map +1 -1
  57. package/dist/commands/android/tap-element.d.ts +1 -0
  58. package/dist/commands/android/tap-element.d.ts.map +1 -1
  59. package/dist/commands/android/tap-element.js +1 -1
  60. package/dist/commands/android/tap-element.js.map +1 -1
  61. package/dist/commands/android/tap.d.ts +1 -0
  62. package/dist/commands/android/tap.d.ts.map +1 -1
  63. package/dist/commands/android/tap.js +1 -1
  64. package/dist/commands/android/tap.js.map +1 -1
  65. package/dist/commands/android/type.d.ts +1 -0
  66. package/dist/commands/android/type.d.ts.map +1 -1
  67. package/dist/commands/android/type.js +1 -1
  68. package/dist/commands/android/type.js.map +1 -1
  69. package/dist/commands/asset/delete.d.ts +1 -0
  70. package/dist/commands/asset/delete.d.ts.map +1 -1
  71. package/dist/commands/asset/list.d.ts +1 -0
  72. package/dist/commands/asset/list.d.ts.map +1 -1
  73. package/dist/commands/asset/pull.d.ts +1 -0
  74. package/dist/commands/asset/pull.d.ts.map +1 -1
  75. package/dist/commands/asset/push.d.ts +1 -0
  76. package/dist/commands/asset/push.d.ts.map +1 -1
  77. package/dist/commands/gradle/build.d.ts +1 -0
  78. package/dist/commands/gradle/build.d.ts.map +1 -1
  79. package/dist/commands/gradle/create.d.ts +1 -0
  80. package/dist/commands/gradle/create.d.ts.map +1 -1
  81. package/dist/commands/gradle/delete.d.ts +1 -0
  82. package/dist/commands/gradle/delete.d.ts.map +1 -1
  83. package/dist/commands/gradle/get.d.ts +1 -0
  84. package/dist/commands/gradle/get.d.ts.map +1 -1
  85. package/dist/commands/gradle/list.d.ts +1 -0
  86. package/dist/commands/gradle/list.d.ts.map +1 -1
  87. package/dist/commands/gradle/set-instance.d.ts +18 -0
  88. package/dist/commands/gradle/set-instance.d.ts.map +1 -0
  89. package/dist/commands/gradle/set-instance.js +47 -0
  90. package/dist/commands/gradle/set-instance.js.map +1 -0
  91. package/dist/commands/ios/app-log.d.ts +1 -0
  92. package/dist/commands/ios/app-log.d.ts.map +1 -1
  93. package/dist/commands/ios/app-log.js +1 -1
  94. package/dist/commands/ios/app-log.js.map +1 -1
  95. package/dist/commands/ios/camera.d.ts +1 -0
  96. package/dist/commands/ios/camera.d.ts.map +1 -1
  97. package/dist/commands/ios/create.d.ts +1 -0
  98. package/dist/commands/ios/create.d.ts.map +1 -1
  99. package/dist/commands/ios/delete-file.d.ts +1 -0
  100. package/dist/commands/ios/delete-file.d.ts.map +1 -1
  101. package/dist/commands/ios/delete.d.ts +1 -0
  102. package/dist/commands/ios/delete.d.ts.map +1 -1
  103. package/dist/commands/ios/element-tree.d.ts +1 -0
  104. package/dist/commands/ios/element-tree.d.ts.map +1 -1
  105. package/dist/commands/ios/element-tree.js +1 -1
  106. package/dist/commands/ios/element-tree.js.map +1 -1
  107. package/dist/commands/ios/get.d.ts +1 -0
  108. package/dist/commands/ios/get.d.ts.map +1 -1
  109. package/dist/commands/ios/info.d.ts +1 -0
  110. package/dist/commands/ios/info.d.ts.map +1 -1
  111. package/dist/commands/ios/info.js +1 -1
  112. package/dist/commands/ios/info.js.map +1 -1
  113. package/dist/commands/ios/install-app.d.ts +1 -0
  114. package/dist/commands/ios/install-app.d.ts.map +1 -1
  115. package/dist/commands/ios/install-app.js +1 -1
  116. package/dist/commands/ios/install-app.js.map +1 -1
  117. package/dist/commands/ios/keychain/generate-key.d.ts +1 -0
  118. package/dist/commands/ios/keychain/generate-key.d.ts.map +1 -1
  119. package/dist/commands/ios/keychain/restore.d.ts +1 -0
  120. package/dist/commands/ios/keychain/restore.d.ts.map +1 -1
  121. package/dist/commands/ios/keychain/save.d.ts +1 -0
  122. package/dist/commands/ios/keychain/save.d.ts.map +1 -1
  123. package/dist/commands/ios/launch-app.d.ts +1 -0
  124. package/dist/commands/ios/launch-app.d.ts.map +1 -1
  125. package/dist/commands/ios/launch-app.js +1 -1
  126. package/dist/commands/ios/launch-app.js.map +1 -1
  127. package/dist/commands/ios/list-apps.d.ts +1 -0
  128. package/dist/commands/ios/list-apps.d.ts.map +1 -1
  129. package/dist/commands/ios/list-apps.js +1 -1
  130. package/dist/commands/ios/list-apps.js.map +1 -1
  131. package/dist/commands/ios/list.d.ts +1 -0
  132. package/dist/commands/ios/list.d.ts.map +1 -1
  133. package/dist/commands/ios/lsof.d.ts +1 -0
  134. package/dist/commands/ios/lsof.d.ts.map +1 -1
  135. package/dist/commands/ios/maestro.d.ts +1 -0
  136. package/dist/commands/ios/maestro.d.ts.map +1 -1
  137. package/dist/commands/ios/open-url.d.ts +1 -0
  138. package/dist/commands/ios/open-url.d.ts.map +1 -1
  139. package/dist/commands/ios/open-url.js +1 -1
  140. package/dist/commands/ios/open-url.js.map +1 -1
  141. package/dist/commands/ios/perform.d.ts +1 -0
  142. package/dist/commands/ios/perform.d.ts.map +1 -1
  143. package/dist/commands/ios/perform.js +1 -1
  144. package/dist/commands/ios/perform.js.map +1 -1
  145. package/dist/commands/ios/play-on-microphone.d.ts +1 -0
  146. package/dist/commands/ios/play-on-microphone.d.ts.map +1 -1
  147. package/dist/commands/ios/press-key.d.ts +1 -0
  148. package/dist/commands/ios/press-key.d.ts.map +1 -1
  149. package/dist/commands/ios/press-key.js +1 -1
  150. package/dist/commands/ios/press-key.js.map +1 -1
  151. package/dist/commands/ios/pull-file.d.ts +1 -0
  152. package/dist/commands/ios/pull-file.d.ts.map +1 -1
  153. package/dist/commands/ios/push-file.d.ts +1 -0
  154. package/dist/commands/ios/push-file.d.ts.map +1 -1
  155. package/dist/commands/ios/record.d.ts +1 -0
  156. package/dist/commands/ios/record.d.ts.map +1 -1
  157. package/dist/commands/ios/record.js +2 -2
  158. package/dist/commands/ios/record.js.map +1 -1
  159. package/dist/commands/ios/reverse.d.ts +1 -0
  160. package/dist/commands/ios/reverse.d.ts.map +1 -1
  161. package/dist/commands/ios/screenshot.d.ts +1 -0
  162. package/dist/commands/ios/screenshot.d.ts.map +1 -1
  163. package/dist/commands/ios/screenshot.js +1 -1
  164. package/dist/commands/ios/screenshot.js.map +1 -1
  165. package/dist/commands/ios/scroll.d.ts +1 -0
  166. package/dist/commands/ios/scroll.d.ts.map +1 -1
  167. package/dist/commands/ios/scroll.js +1 -1
  168. package/dist/commands/ios/scroll.js.map +1 -1
  169. package/dist/commands/ios/set-instance.d.ts +18 -0
  170. package/dist/commands/ios/set-instance.d.ts.map +1 -0
  171. package/dist/commands/ios/set-instance.js +47 -0
  172. package/dist/commands/ios/set-instance.js.map +1 -0
  173. package/dist/commands/ios/set-text.d.ts +1 -0
  174. package/dist/commands/ios/set-text.d.ts.map +1 -1
  175. package/dist/commands/ios/set-text.js +1 -1
  176. package/dist/commands/ios/set-text.js.map +1 -1
  177. package/dist/commands/ios/simctl.d.ts +1 -0
  178. package/dist/commands/ios/simctl.d.ts.map +1 -1
  179. package/dist/commands/ios/stop-microphone-playback.d.ts +1 -0
  180. package/dist/commands/ios/stop-microphone-playback.d.ts.map +1 -1
  181. package/dist/commands/ios/swipe.d.ts +1 -0
  182. package/dist/commands/ios/swipe.d.ts.map +1 -1
  183. package/dist/commands/ios/swipe.js +1 -1
  184. package/dist/commands/ios/swipe.js.map +1 -1
  185. package/dist/commands/ios/sync.d.ts +1 -0
  186. package/dist/commands/ios/sync.d.ts.map +1 -1
  187. package/dist/commands/ios/syslog.d.ts +1 -0
  188. package/dist/commands/ios/syslog.d.ts.map +1 -1
  189. package/dist/commands/ios/tap-element.d.ts +1 -0
  190. package/dist/commands/ios/tap-element.d.ts.map +1 -1
  191. package/dist/commands/ios/tap-element.js +1 -1
  192. package/dist/commands/ios/tap-element.js.map +1 -1
  193. package/dist/commands/ios/tap.d.ts +1 -0
  194. package/dist/commands/ios/tap.d.ts.map +1 -1
  195. package/dist/commands/ios/tap.js +1 -1
  196. package/dist/commands/ios/tap.js.map +1 -1
  197. package/dist/commands/ios/terminate-app.d.ts +1 -0
  198. package/dist/commands/ios/terminate-app.d.ts.map +1 -1
  199. package/dist/commands/ios/terminate-app.js +1 -1
  200. package/dist/commands/ios/terminate-app.js.map +1 -1
  201. package/dist/commands/ios/toggle-keyboard.d.ts +1 -0
  202. package/dist/commands/ios/toggle-keyboard.d.ts.map +1 -1
  203. package/dist/commands/ios/toggle-keyboard.js +1 -1
  204. package/dist/commands/ios/toggle-keyboard.js.map +1 -1
  205. package/dist/commands/ios/type.d.ts +1 -0
  206. package/dist/commands/ios/type.d.ts.map +1 -1
  207. package/dist/commands/ios/type.js +1 -1
  208. package/dist/commands/ios/type.js.map +1 -1
  209. package/dist/commands/ios/xcodebuild.d.ts +1 -0
  210. package/dist/commands/ios/xcodebuild.d.ts.map +1 -1
  211. package/dist/commands/ios/xcrun.d.ts +1 -0
  212. package/dist/commands/ios/xcrun.d.ts.map +1 -1
  213. package/dist/commands/login.d.ts +1 -0
  214. package/dist/commands/login.d.ts.map +1 -1
  215. package/dist/commands/logout.d.ts +1 -0
  216. package/dist/commands/logout.d.ts.map +1 -1
  217. package/dist/commands/session/start.d.ts +1 -0
  218. package/dist/commands/session/start.d.ts.map +1 -1
  219. package/dist/commands/session/start.js +1 -34
  220. package/dist/commands/session/start.js.map +1 -1
  221. package/dist/commands/session/status.d.ts +1 -0
  222. package/dist/commands/session/status.d.ts.map +1 -1
  223. package/dist/commands/session/stop.d.ts +1 -0
  224. package/dist/commands/session/stop.d.ts.map +1 -1
  225. package/dist/commands/xcode/attach-simulator.d.ts +1 -0
  226. package/dist/commands/xcode/attach-simulator.d.ts.map +1 -1
  227. package/dist/commands/xcode/build.d.ts +1 -0
  228. package/dist/commands/xcode/build.d.ts.map +1 -1
  229. package/dist/commands/xcode/create.d.ts +1 -0
  230. package/dist/commands/xcode/create.d.ts.map +1 -1
  231. package/dist/commands/xcode/delete.d.ts +1 -0
  232. package/dist/commands/xcode/delete.d.ts.map +1 -1
  233. package/dist/commands/xcode/get.d.ts +1 -0
  234. package/dist/commands/xcode/get.d.ts.map +1 -1
  235. package/dist/commands/xcode/list.d.ts +1 -0
  236. package/dist/commands/xcode/list.d.ts.map +1 -1
  237. package/dist/commands/xcode/rbe/upload.d.ts +1 -0
  238. package/dist/commands/xcode/rbe/upload.d.ts.map +1 -1
  239. package/dist/commands/xcode/run.d.ts +1 -0
  240. package/dist/commands/xcode/run.d.ts.map +1 -1
  241. package/dist/commands/xcode/set-instance.d.ts +18 -0
  242. package/dist/commands/xcode/set-instance.d.ts.map +1 -0
  243. package/dist/commands/xcode/set-instance.js +47 -0
  244. package/dist/commands/xcode/set-instance.js.map +1 -0
  245. package/dist/commands/xcode/sync.d.ts +1 -0
  246. package/dist/commands/xcode/sync.d.ts.map +1 -1
  247. package/dist/lib/config.d.ts +6 -0
  248. package/dist/lib/config.d.ts.map +1 -1
  249. package/dist/lib/config.js +24 -0
  250. package/dist/lib/config.js.map +1 -1
  251. package/dist/lib/daemon.d.ts +12 -0
  252. package/dist/lib/daemon.d.ts.map +1 -1
  253. package/dist/lib/daemon.js +141 -23
  254. package/dist/lib/daemon.js.map +1 -1
  255. package/dist/lib/instance-client-factory.d.ts +15 -2
  256. package/dist/lib/instance-client-factory.d.ts.map +1 -1
  257. package/dist/lib/instance-client-factory.js +40 -4
  258. package/dist/lib/instance-client-factory.js.map +1 -1
  259. package/dist/lib/instance-client-factory.test.d.ts +2 -0
  260. package/dist/lib/instance-client-factory.test.d.ts.map +1 -0
  261. package/dist/lib/instance-client-factory.test.js +78 -0
  262. package/dist/lib/instance-client-factory.test.js.map +1 -0
  263. package/dist/lib/set-instance.d.ts +41 -0
  264. package/dist/lib/set-instance.d.ts.map +1 -0
  265. package/dist/lib/set-instance.js +103 -0
  266. package/dist/lib/set-instance.js.map +1 -0
  267. package/dist/lib/set-instance.test.d.ts +2 -0
  268. package/dist/lib/set-instance.test.d.ts.map +1 -0
  269. package/dist/lib/set-instance.test.js +118 -0
  270. package/dist/lib/set-instance.test.js.map +1 -0
  271. 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":"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"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=set-instance.test.d.ts.map
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lim",
3
- "version": "0.28.0",
3
+ "version": "0.28.2",
4
4
  "description": "Use remote XCode, Gradle, iOS Simulator, Android Emulator and more to build and test apps from Linux, Windows or macOS.",
5
5
  "bin": {
6
6
  "lim": "./bin/run.js"