@lhremote/core 0.2.1 → 0.2.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 (52) hide show
  1. package/dist/db/repositories/campaign.js +2 -2
  2. package/dist/db/repositories/campaign.js.map +1 -1
  3. package/dist/db/repositories/campaign.test.js +4 -4
  4. package/dist/db/repositories/campaign.test.js.map +1 -1
  5. package/dist/db/testing/create-fixture.js +1 -1
  6. package/dist/index.d.ts +3 -3
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +3 -1
  9. package/dist/index.js.map +1 -1
  10. package/dist/operations/get-errors.d.ts +21 -0
  11. package/dist/operations/get-errors.d.ts.map +1 -0
  12. package/dist/operations/get-errors.js +30 -0
  13. package/dist/operations/get-errors.js.map +1 -0
  14. package/dist/operations/get-errors.test.d.ts +2 -0
  15. package/dist/operations/get-errors.test.d.ts.map +1 -0
  16. package/dist/operations/get-errors.test.js +135 -0
  17. package/dist/operations/get-errors.test.js.map +1 -0
  18. package/dist/operations/index.d.ts +1 -0
  19. package/dist/operations/index.d.ts.map +1 -1
  20. package/dist/operations/index.js +2 -0
  21. package/dist/operations/index.js.map +1 -1
  22. package/dist/services/errors.d.ts +12 -0
  23. package/dist/services/errors.d.ts.map +1 -1
  24. package/dist/services/errors.js +27 -0
  25. package/dist/services/errors.js.map +1 -1
  26. package/dist/services/index.d.ts +2 -2
  27. package/dist/services/index.d.ts.map +1 -1
  28. package/dist/services/index.js +1 -1
  29. package/dist/services/index.js.map +1 -1
  30. package/dist/services/instance-context.d.ts +9 -0
  31. package/dist/services/instance-context.d.ts.map +1 -1
  32. package/dist/services/instance-context.js +27 -1
  33. package/dist/services/instance-context.js.map +1 -1
  34. package/dist/services/instance-context.test.js +22 -0
  35. package/dist/services/instance-context.test.js.map +1 -1
  36. package/dist/services/instance.d.ts +25 -17
  37. package/dist/services/instance.d.ts.map +1 -1
  38. package/dist/services/instance.js +48 -38
  39. package/dist/services/instance.js.map +1 -1
  40. package/dist/services/instance.test.js +33 -89
  41. package/dist/services/instance.test.js.map +1 -1
  42. package/dist/services/launcher.d.ts +24 -1
  43. package/dist/services/launcher.d.ts.map +1 -1
  44. package/dist/services/launcher.js +61 -0
  45. package/dist/services/launcher.js.map +1 -1
  46. package/dist/types/index.d.ts +1 -0
  47. package/dist/types/index.d.ts.map +1 -1
  48. package/dist/types/ui-health.d.ts +60 -0
  49. package/dist/types/ui-health.d.ts.map +1 -0
  50. package/dist/types/ui-health.js +4 -0
  51. package/dist/types/ui-health.js.map +1 -0
  52. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EACL,yBAAyB,EACzB,mBAAmB,EACnB,uBAAuB,EACvB,KAAK,oBAAoB,GAC1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EACL,WAAW,EACX,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,YAAY,GAClB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EACL,sBAAsB,EACtB,cAAc,GACf,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,KAAK,eAAe,EACpB,KAAK,uBAAuB,GAC7B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,2BAA2B,EAC3B,YAAY,EACZ,kBAAkB,EAClB,cAAc,GACf,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AACvF,OAAO,EACL,yBAAyB,EACzB,mBAAmB,EACnB,uBAAuB,EACvB,KAAK,oBAAoB,GAC1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EACL,WAAW,EACX,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,YAAY,GAClB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EACL,sBAAsB,EACtB,cAAc,GACf,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,KAAK,eAAe,EACpB,KAAK,uBAAuB,GAC7B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,2BAA2B,EAC3B,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,cAAc,GACf,MAAM,aAAa,CAAC"}
@@ -8,5 +8,5 @@ export { checkStatus, } from "./status.js";
8
8
  export { CampaignService } from "./campaign.js";
9
9
  export { AccountResolutionError, resolveAccount, } from "./account-resolution.js";
10
10
  export { withDatabase, withInstanceDatabase, } from "./instance-context.js";
11
- export { ActionExecutionError, AppLaunchError, AppNotFoundError, CampaignExecutionError, CampaignTimeoutError, ExtractionTimeoutError, InstanceNotRunningError, InvalidProfileUrlError, LinkedHelperNotRunningError, ServiceError, StartInstanceError, WrongPortError, } from "./errors.js";
11
+ export { ActionExecutionError, AppLaunchError, AppNotFoundError, CampaignExecutionError, CampaignTimeoutError, ExtractionTimeoutError, InstanceNotRunningError, InvalidProfileUrlError, LinkedHelperNotRunningError, ServiceError, StartInstanceError, UIBlockedError, WrongPortError, } from "./errors.js";
12
12
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EAAE,UAAU,EAA0B,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAqB,MAAM,eAAe,CAAC;AACnE,OAAO,EACL,yBAAyB,EACzB,mBAAmB,EACnB,uBAAuB,GAExB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EACL,WAAW,GAKZ,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EACL,sBAAsB,EACtB,cAAc,GACf,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,YAAY,EACZ,oBAAoB,GAGrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,2BAA2B,EAC3B,YAAY,EACZ,kBAAkB,EAClB,cAAc,GACf,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EAAE,UAAU,EAA0B,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAyC,MAAM,eAAe,CAAC;AACvF,OAAO,EACL,yBAAyB,EACzB,mBAAmB,EACnB,uBAAuB,GAExB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EACL,WAAW,GAKZ,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EACL,sBAAsB,EACtB,cAAc,GACf,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,YAAY,EACZ,oBAAoB,GAGrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,2BAA2B,EAC3B,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,cAAc,GACf,MAAM,aAAa,CAAC"}
@@ -28,10 +28,19 @@ export declare function withDatabase<T>(accountId: number, callback: (ctx: Datab
28
28
  *
29
29
  * All resources are cleaned up automatically when the callback finishes.
30
30
  *
31
+ * A launcher connection is opened alongside the instance so that
32
+ * post-evaluation UI health checks can detect blocking dialogs and
33
+ * popups. If the launcher connection fails the operation proceeds
34
+ * without health checking.
35
+ *
31
36
  * @throws {InstanceNotRunningError} if no instance port can be discovered.
32
37
  */
33
38
  export declare function withInstanceDatabase<T>(cdpPort: number, accountId: number, callback: (ctx: InstanceDatabaseContext) => T | Promise<T>, options?: {
34
39
  instanceTimeout?: number;
35
40
  db?: DatabaseClientOptions;
41
+ launcher?: {
42
+ host?: string;
43
+ allowRemote?: boolean;
44
+ };
36
45
  }): Promise<T>;
37
46
  //# sourceMappingURL=instance-context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"instance-context.d.ts","sourceRoot":"","sources":["../../src/services/instance-context.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAoB,MAAM,gBAAgB,CAAC;AAE9F,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGhD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;CAC7B;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAClC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAClD,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,CAAC,CAAC,CAQZ;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CAAC,CAAC,EAC1C,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,CAAC,GAAG,EAAE,uBAAuB,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAC1D,OAAO,CAAC,EAAE;IACR,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,EAAE,CAAC,EAAE,qBAAqB,CAAC;CAC5B,GACA,OAAO,CAAC,CAAC,CAAC,CAuBZ"}
1
+ {"version":3,"file":"instance-context.d.ts","sourceRoot":"","sources":["../../src/services/instance-context.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAoB,MAAM,gBAAgB,CAAC;AAE9F,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAIhD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;CAC7B;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAClC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAClD,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,CAAC,CAAC,CAQZ;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,oBAAoB,CAAC,CAAC,EAC1C,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,CAAC,GAAG,EAAE,uBAAuB,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAC1D,OAAO,CAAC,EAAE;IACR,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,EAAE,CAAC,EAAE,qBAAqB,CAAC;IAC3B,QAAQ,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACrD,GACA,OAAO,CAAC,CAAC,CAAC,CA4CZ"}
@@ -3,7 +3,8 @@
3
3
  import { DatabaseClient, discoverDatabase } from "../db/index.js";
4
4
  import { discoverInstancePort } from "../cdp/index.js";
5
5
  import { InstanceService } from "./instance.js";
6
- import { InstanceNotRunningError } from "./errors.js";
6
+ import { LauncherService } from "./launcher.js";
7
+ import { InstanceNotRunningError, UIBlockedError } from "./errors.js";
7
8
  /**
8
9
  * Open the account's database inside a managed scope.
9
10
  *
@@ -26,6 +27,11 @@ export async function withDatabase(accountId, callback, options) {
26
27
  *
27
28
  * All resources are cleaned up automatically when the callback finishes.
28
29
  *
30
+ * A launcher connection is opened alongside the instance so that
31
+ * post-evaluation UI health checks can detect blocking dialogs and
32
+ * popups. If the launcher connection fails the operation proceeds
33
+ * without health checking.
34
+ *
29
35
  * @throws {InstanceNotRunningError} if no instance port can be discovered.
30
36
  */
31
37
  export async function withInstanceDatabase(cdpPort, accountId, callback, options) {
@@ -34,15 +40,35 @@ export async function withInstanceDatabase(cdpPort, accountId, callback, options
34
40
  throw new InstanceNotRunningError("No LinkedHelper instance is running. Use start-instance first.");
35
41
  }
36
42
  const instance = new InstanceService(instancePort, options?.instanceTimeout != null ? { timeout: options.instanceTimeout } : undefined);
43
+ let launcher = null;
37
44
  let db = null;
38
45
  try {
39
46
  await instance.connect();
47
+ // Open a launcher connection for health checking.
48
+ try {
49
+ launcher = new LauncherService(cdpPort, options?.launcher);
50
+ await launcher.connect();
51
+ const connectedLauncher = launcher;
52
+ instance.setHealthChecker(async () => {
53
+ const health = await connectedLauncher.checkUIHealth(accountId);
54
+ if (!health.healthy) {
55
+ throw new UIBlockedError(health);
56
+ }
57
+ });
58
+ }
59
+ catch {
60
+ // Launcher connection failed — proceed without health checking.
61
+ launcher?.disconnect();
62
+ launcher = null;
63
+ }
40
64
  const dbPath = discoverDatabase(accountId);
41
65
  db = new DatabaseClient(dbPath, options?.db);
42
66
  return await callback({ accountId, instance, db });
43
67
  }
44
68
  finally {
69
+ instance.setHealthChecker(null);
45
70
  instance.disconnect();
71
+ launcher?.disconnect();
46
72
  db?.close();
47
73
  }
48
74
  }
@@ -1 +1 @@
1
- {"version":3,"file":"instance-context.js","sourceRoot":"","sources":["../../src/services/instance-context.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EAAE,cAAc,EAA8B,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC9F,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAmBtD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,SAAiB,EACjB,QAAkD,EAClD,OAA+B;IAE/B,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,EAAE,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;IAC3C,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAe,EACf,SAAiB,EACjB,QAA0D,EAC1D,OAGC;IAED,MAAM,YAAY,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACzD,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QAC1B,MAAM,IAAI,uBAAuB,CAC/B,gEAAgE,CACjE,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,eAAe,CAClC,YAAY,EACZ,OAAO,EAAE,eAAe,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,SAAS,CACpF,CAAC;IACF,IAAI,EAAE,GAA0B,IAAI,CAAC;IAErC,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC3C,EAAE,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QAC7C,OAAO,MAAM,QAAQ,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;IACrD,CAAC;YAAS,CAAC;QACT,QAAQ,CAAC,UAAU,EAAE,CAAC;QACtB,EAAE,EAAE,KAAK,EAAE,CAAC;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"instance-context.js","sourceRoot":"","sources":["../../src/services/instance-context.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EAAE,cAAc,EAA8B,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC9F,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAmBtE;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,SAAiB,EACjB,QAAkD,EAClD,OAA+B;IAE/B,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,EAAE,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;IAC3C,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAe,EACf,SAAiB,EACjB,QAA0D,EAC1D,OAIC;IAED,MAAM,YAAY,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACzD,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QAC1B,MAAM,IAAI,uBAAuB,CAC/B,gEAAgE,CACjE,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,eAAe,CAClC,YAAY,EACZ,OAAO,EAAE,eAAe,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,SAAS,CACpF,CAAC;IACF,IAAI,QAAQ,GAA2B,IAAI,CAAC;IAC5C,IAAI,EAAE,GAA0B,IAAI,CAAC;IAErC,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;QAEzB,kDAAkD;QAClD,IAAI,CAAC;YACH,QAAQ,GAAG,IAAI,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YAC3D,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;YACzB,MAAM,iBAAiB,GAAG,QAAQ,CAAC;YACnC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,IAAI,EAAE;gBACnC,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;gBAChE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACpB,MAAM,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,gEAAgE;YAChE,QAAQ,EAAE,UAAU,EAAE,CAAC;YACvB,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC3C,EAAE,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QAC7C,OAAO,MAAM,QAAQ,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;IACrD,CAAC;YAAS,CAAC;QACT,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAChC,QAAQ,CAAC,UAAU,EAAE,CAAC;QACtB,QAAQ,EAAE,UAAU,EAAE,CAAC;QACvB,EAAE,EAAE,KAAK,EAAE,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -11,15 +11,20 @@ vi.mock("../db/index.js", () => ({
11
11
  vi.mock("./instance.js", () => ({
12
12
  InstanceService: vi.fn(),
13
13
  }));
14
+ vi.mock("./launcher.js", () => ({
15
+ LauncherService: vi.fn(),
16
+ }));
14
17
  import { discoverInstancePort } from "../cdp/index.js";
15
18
  import { DatabaseClient, discoverDatabase } from "../db/index.js";
16
19
  import { InstanceService } from "./instance.js";
20
+ import { LauncherService } from "./launcher.js";
17
21
  import { InstanceNotRunningError } from "./errors.js";
18
22
  import { withDatabase, withInstanceDatabase } from "./instance-context.js";
19
23
  const mockedDiscoverInstancePort = vi.mocked(discoverInstancePort);
20
24
  const mockedDiscoverDatabase = vi.mocked(discoverDatabase);
21
25
  const mockedDatabaseClient = vi.mocked(DatabaseClient);
22
26
  const mockedInstanceService = vi.mocked(InstanceService);
27
+ const mockedLauncherService = vi.mocked(LauncherService);
23
28
  function createMockDb(overrides = {}) {
24
29
  const db = {
25
30
  close: vi.fn(),
@@ -34,6 +39,7 @@ function createMockInstance(overrides = {}) {
34
39
  const instance = {
35
40
  connect: vi.fn().mockResolvedValue(undefined),
36
41
  disconnect: vi.fn(),
42
+ setHealthChecker: vi.fn(),
37
43
  ...overrides,
38
44
  };
39
45
  mockedInstanceService.mockImplementation(function () {
@@ -41,6 +47,21 @@ function createMockInstance(overrides = {}) {
41
47
  });
42
48
  return instance;
43
49
  }
50
+ function createMockLauncher() {
51
+ const launcher = {
52
+ connect: vi.fn().mockResolvedValue(undefined),
53
+ disconnect: vi.fn(),
54
+ checkUIHealth: vi.fn().mockResolvedValue({
55
+ healthy: true,
56
+ issues: [],
57
+ popup: null,
58
+ }),
59
+ };
60
+ mockedLauncherService.mockImplementation(function () {
61
+ return launcher;
62
+ });
63
+ return launcher;
64
+ }
44
65
  describe("withDatabase", () => {
45
66
  beforeEach(() => {
46
67
  vi.clearAllMocks();
@@ -101,6 +122,7 @@ describe("withDatabase", () => {
101
122
  describe("withInstanceDatabase", () => {
102
123
  beforeEach(() => {
103
124
  vi.clearAllMocks();
125
+ createMockLauncher();
104
126
  });
105
127
  afterEach(() => {
106
128
  vi.restoreAllMocks();
@@ -1 +1 @@
1
- {"version":3,"file":"instance-context.test.js","sourceRoot":"","sources":["../../src/services/instance-context.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"instance-context.test.js","sourceRoot":"","sources":["../../src/services/instance-context.test.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAEzE,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC;IAChC,oBAAoB,EAAE,EAAE,CAAC,EAAE,EAAE;CAC9B,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/B,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE;IACvB,gBAAgB,EAAE,EAAE,CAAC,EAAE,EAAE;CAC1B,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9B,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE;CACzB,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9B,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE;CACzB,CAAC,CAAC,CAAC;AAEJ,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE3E,MAAM,0BAA0B,GAAG,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;AACnE,MAAM,sBAAsB,GAAG,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAC3D,MAAM,oBAAoB,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;AACvD,MAAM,qBAAqB,GAAG,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;AACzD,MAAM,qBAAqB,GAAG,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;AAEzD,SAAS,YAAY,CAAC,YAAqC,EAAE;IAC3D,MAAM,EAAE,GAAG;QACT,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;QACd,GAAG,SAAS;KACgB,CAAC;IAC/B,oBAAoB,CAAC,kBAAkB,CAAC;QACtC,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,kBAAkB,CAAC,YAAsC,EAAE;IAClE,MAAM,QAAQ,GAAG;QACf,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAC7C,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;QACnB,gBAAgB,EAAE,EAAE,CAAC,EAAE,EAAE;QACzB,GAAG,SAAS;KACiB,CAAC;IAChC,qBAAqB,CAAC,kBAAkB,CAAC;QACvC,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,kBAAkB;IACzB,MAAM,QAAQ,GAAG;QACf,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAC7C,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;QACnB,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YACvC,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,IAAI;SACZ,CAAC;KAC2B,CAAC;IAChC,qBAAqB,CAAC,kBAAkB,CAAC;QACvC,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,sBAAsB,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;QAEzD,IAAI,WAAoB,CAAC;QACzB,MAAM,YAAY,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE;YAC7B,WAAW,GAAG,GAAG,CAAC;QACpB,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,YAAY,EAAE,CAAC;QACf,sBAAsB,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;QAEzD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;QAErD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,YAAY,EAAE,CAAC;QACf,sBAAsB,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;QAEzD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,EAAE,EAAE,KAAK,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAExE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,sBAAsB,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;QAEzD,MAAM,YAAY,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAExC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,oBAAoB,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,sBAAsB,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;QAEzD,MAAM,MAAM,CACV,YAAY,CAAC,EAAE,EAAE,GAAG,EAAE;YACpB,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpC,CAAC,CAAC,CACH,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAEpC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,oBAAoB,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,YAAY,EAAE,CAAC;QACf,sBAAsB,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;QAEzD,MAAM,YAAY,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QAE7D,MAAM,CAAC,oBAAoB,CAAC,CAAC,oBAAoB,CAAC,gBAAgB,EAAE;YAClE,QAAQ,EAAE,KAAK;SAChB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,YAAY,EAAE,CAAC;QACf,sBAAsB,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;QAEzD,MAAM,YAAY,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAExC,MAAM,CAAC,sBAAsB,CAAC,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,kBAAkB,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,YAAY,GAAG,kBAAkB,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,0BAA0B,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACpD,sBAAsB,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;QAEzD,IAAI,WAAoB,CAAC;QACzB,MAAM,oBAAoB,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE;YAC3C,WAAW,GAAG,GAAG,CAAC;QACpB,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,0BAA0B,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC9D,MAAM,CAAC,qBAAqB,CAAC,CAAC,oBAAoB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACrE,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,oBAAoB,EAAE,CAAC;QACpD,MAAM,CAAC,sBAAsB,CAAC,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;QACxD,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC;YAC1B,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE,YAAY;YACtB,EAAE,EAAE,MAAM;SACX,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,kBAAkB,EAAE,CAAC;QACrB,YAAY,EAAE,CAAC;QACf,0BAA0B,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACpD,sBAAsB,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;QAEzD,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;QAEnE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,YAAY,GAAG,kBAAkB,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,0BAA0B,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACpD,sBAAsB,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;QAEzD,MAAM,oBAAoB,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAEtD,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,oBAAoB,EAAE,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,oBAAoB,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,YAAY,GAAG,kBAAkB,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,0BAA0B,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACpD,sBAAsB,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;QAEzD,MAAM,MAAM,CACV,oBAAoB,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE;YAClC,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpC,CAAC,CAAC,CACH,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAEpC,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,oBAAoB,EAAE,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,oBAAoB,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,YAAY,GAAG,kBAAkB,CAAC;YACtC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;YAC/D,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;SACpB,CAAC,CAAC;QACH,0BAA0B,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAEpD,MAAM,MAAM,CACV,oBAAoB,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAChD,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAEpC,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,oBAAoB,EAAE,CAAC;QACvD,6DAA6D;QAC7D,MAAM,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,0BAA0B,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEnD,MAAM,MAAM,CACV,oBAAoB,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAChD,CAAC,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,kBAAkB,EAAE,CAAC;QACrB,YAAY,EAAE,CAAC;QACf,0BAA0B,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACpD,sBAAsB,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;QAEzD,MAAM,oBAAoB,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE;YACpD,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC;QAEH,MAAM,CAAC,qBAAqB,CAAC,CAAC,oBAAoB,CAAC,KAAK,EAAE;YACxD,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,kBAAkB,EAAE,CAAC;QACrB,YAAY,EAAE,CAAC;QACf,0BAA0B,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACpD,sBAAsB,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;QAEzD,MAAM,oBAAoB,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE;YACpD,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;SACxB,CAAC,CAAC;QAEH,MAAM,CAAC,oBAAoB,CAAC,CAAC,oBAAoB,CAAC,gBAAgB,EAAE;YAClE,QAAQ,EAAE,KAAK;SAChB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,kBAAkB,EAAE,CAAC;QACrB,YAAY,EAAE,CAAC;QACf,0BAA0B,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACpD,sBAAsB,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;QAEzD,MAAM,oBAAoB,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAEtD,MAAM,CAAC,qBAAqB,CAAC,CAAC,oBAAoB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -9,6 +9,12 @@ export interface ActionResult {
9
9
  /** Error message if the action failed. */
10
10
  error?: string;
11
11
  }
12
+ /**
13
+ * A callback that checks UI health after a CDP evaluation.
14
+ *
15
+ * Should throw {@link UIBlockedError} if the UI is in a blocked state.
16
+ */
17
+ export type HealthChecker = () => Promise<void>;
12
18
  /**
13
19
  * Controls a running LinkedHelper instance via CDP.
14
20
  *
@@ -17,7 +23,7 @@ export interface ActionResult {
17
23
  * - **Instance UI**: The Electron page hosting the LinkedHelper UI
18
24
  *
19
25
  * This service connects to both targets and provides methods for
20
- * profile navigation and data extraction.
26
+ * data extraction and action execution.
21
27
  */
22
28
  export declare class InstanceService {
23
29
  private readonly port;
@@ -26,11 +32,21 @@ export declare class InstanceService {
26
32
  private readonly allowRemote;
27
33
  private linkedInClient;
28
34
  private uiClient;
35
+ private healthChecker;
29
36
  constructor(port: number, options?: {
30
37
  host?: string;
31
38
  timeout?: number;
32
39
  allowRemote?: boolean;
33
40
  });
41
+ /**
42
+ * Set a post-evaluation health check callback.
43
+ *
44
+ * When set, every {@link evaluateUI} and {@link executeAction} call
45
+ * will invoke the checker after the CDP evaluation completes.
46
+ * On {@link CDPTimeoutError}, the checker is also invoked to diagnose
47
+ * the cause of the timeout.
48
+ */
49
+ setHealthChecker(checker: HealthChecker | null): void;
34
50
  /**
35
51
  * Connect to both instance CDP targets (LinkedIn page and UI).
36
52
  *
@@ -44,14 +60,6 @@ export declare class InstanceService {
44
60
  * Disconnect from both targets.
45
61
  */
46
62
  disconnect(): void;
47
- /**
48
- * Navigate the LinkedIn webview to a profile URL.
49
- *
50
- * Enables the Page domain, navigates, and waits for the load event.
51
- *
52
- * @throws {InvalidProfileUrlError} if the URL is not a valid LinkedIn profile path.
53
- */
54
- navigateToProfile(url: string): Promise<void>;
55
63
  /**
56
64
  * Execute a LinkedHelper action via the instance UI.
57
65
  *
@@ -64,13 +72,6 @@ export declare class InstanceService {
64
72
  * @param config Action configuration object (default: `{}`).
65
73
  */
66
74
  executeAction(actionName: string, config?: Record<string, unknown>): Promise<ActionResult>;
67
- /**
68
- * Trigger the SaveCurrentProfile action via the instance UI.
69
- *
70
- * This tells LinkedHelper to extract data from the currently
71
- * displayed LinkedIn profile and save it to the database.
72
- */
73
- triggerExtraction(): Promise<void>;
74
75
  /**
75
76
  * Evaluate a JavaScript expression in the LinkedHelper UI context.
76
77
  *
@@ -84,7 +85,14 @@ export declare class InstanceService {
84
85
  evaluateUI<T = unknown>(expression: string, awaitPromise?: boolean): Promise<T>;
85
86
  /** Whether both clients are currently connected. */
86
87
  get isConnected(): boolean;
87
- private ensureLinkedInClient;
88
88
  private ensureUiClient;
89
+ /**
90
+ * Run the health checker if one is configured.
91
+ *
92
+ * Non-UIBlockedError failures (e.g. launcher connection lost) are
93
+ * silently ignored so that health check infrastructure issues do
94
+ * not mask the original operation result.
95
+ */
96
+ private runHealthCheck;
89
97
  }
90
98
  //# sourceMappingURL=instance.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"instance.d.ts","sourceRoot":"","sources":["../../src/services/instance.ts"],"names":[],"mappings":"AASA;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,iDAAiD;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAQD;;;;;;;;;GASG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAU;IACtC,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,QAAQ,CAA0B;gBAE9B,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE;IAO9F;;;;;;;OAOG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA+C9B;;OAEG;IACH,UAAU,IAAI,IAAI;IAOlB;;;;;;OAMG;IACG,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUnD;;;;;;;;;;OAUG;IACG,aAAa,CACjB,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACnC,OAAO,CAAC,YAAY,CAAC;IAoBxB;;;;;OAKG;IACG,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxC;;;;;;;;;OASG;IACG,UAAU,CAAC,CAAC,GAAG,OAAO,EAC1B,UAAU,EAAE,MAAM,EAClB,YAAY,UAAO,GAClB,OAAO,CAAC,CAAC,CAAC;IAKb,oDAAoD;IACpD,IAAI,WAAW,IAAI,OAAO,CAOzB;IAED,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,cAAc;CAMvB"}
1
+ {"version":3,"file":"instance.d.ts","sourceRoot":"","sources":["../../src/services/instance.ts"],"names":[],"mappings":"AASA;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,iDAAiD;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAQD;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAEhD;;;;;;;;;GASG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAU;IACtC,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,aAAa,CAA8B;gBAEvC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE;IAO9F;;;;;;;OAOG;IACH,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI;IAIrD;;;;;;;OAOG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA+C9B;;OAEG;IACH,UAAU,IAAI,IAAI;IAOlB;;;;;;;;;;OAUG;IACG,aAAa,CACjB,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACnC,OAAO,CAAC,YAAY,CAAC;IAwBxB;;;;;;;;;OASG;IACG,UAAU,CAAC,CAAC,GAAG,OAAO,EAC1B,UAAU,EAAE,MAAM,EAClB,YAAY,UAAO,GAClB,OAAO,CAAC,CAAC,CAAC;IAcb,oDAAoD;IACpD,IAAI,WAAW,IAAI,OAAO,CAOzB;IAED,OAAO,CAAC,cAAc;IAOtB;;;;;;OAMG;YACW,cAAc;CAS7B"}
@@ -1,9 +1,9 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-only
2
2
  // Copyright (C) 2026 Oleksii PELYKH
3
- import { CDPClient, discoverTargets } from "../cdp/index.js";
3
+ import { CDPClient, CDPTimeoutError, discoverTargets } from "../cdp/index.js";
4
4
  import { delay } from "../utils/delay.js";
5
5
  import { errorMessage } from "../utils/error-message.js";
6
- import { ActionExecutionError, InstanceNotRunningError, InvalidProfileUrlError, ServiceError } from "./errors.js";
6
+ import { ActionExecutionError, InstanceNotRunningError, ServiceError, UIBlockedError } from "./errors.js";
7
7
  /** Maximum time to wait for both CDP targets to appear (ms). */
8
8
  const CONNECT_TIMEOUT = 30_000;
9
9
  /** Interval between target discovery polls (ms). */
@@ -16,7 +16,7 @@ const CONNECT_POLL_INTERVAL = 1_000;
16
16
  * - **Instance UI**: The Electron page hosting the LinkedHelper UI
17
17
  *
18
18
  * This service connects to both targets and provides methods for
19
- * profile navigation and data extraction.
19
+ * data extraction and action execution.
20
20
  */
21
21
  export class InstanceService {
22
22
  port;
@@ -25,12 +25,24 @@ export class InstanceService {
25
25
  allowRemote;
26
26
  linkedInClient = null;
27
27
  uiClient = null;
28
+ healthChecker = null;
28
29
  constructor(port, options) {
29
30
  this.port = port;
30
31
  this.host = options?.host ?? "127.0.0.1";
31
32
  this.timeout = options?.timeout;
32
33
  this.allowRemote = options?.allowRemote ?? false;
33
34
  }
35
+ /**
36
+ * Set a post-evaluation health check callback.
37
+ *
38
+ * When set, every {@link evaluateUI} and {@link executeAction} call
39
+ * will invoke the checker after the CDP evaluation completes.
40
+ * On {@link CDPTimeoutError}, the checker is also invoked to diagnose
41
+ * the cause of the timeout.
42
+ */
43
+ setHealthChecker(checker) {
44
+ this.healthChecker = checker;
45
+ }
34
46
  /**
35
47
  * Connect to both instance CDP targets (LinkedIn page and UI).
36
48
  *
@@ -80,20 +92,6 @@ export class InstanceService {
80
92
  this.uiClient?.disconnect();
81
93
  this.uiClient = null;
82
94
  }
83
- /**
84
- * Navigate the LinkedIn webview to a profile URL.
85
- *
86
- * Enables the Page domain, navigates, and waits for the load event.
87
- *
88
- * @throws {InvalidProfileUrlError} if the URL is not a valid LinkedIn profile path.
89
- */
90
- async navigateToProfile(url) {
91
- assertLinkedInProfileUrl(url);
92
- const client = this.ensureLinkedInClient();
93
- await client.send("Page.enable");
94
- await client.navigate(url);
95
- await client.waitForEvent("Page.loadEventFired");
96
- }
97
95
  /**
98
96
  * Execute a LinkedHelper action via the instance UI.
99
97
  *
@@ -115,20 +113,15 @@ export class InstanceService {
115
113
  })()`, true);
116
114
  }
117
115
  catch (error) {
116
+ if (error instanceof CDPTimeoutError) {
117
+ await this.runHealthCheck();
118
+ }
118
119
  const message = errorMessage(error);
119
120
  throw new ActionExecutionError(actionName, `Action '${actionName}' failed: ${message}`, { cause: error });
120
121
  }
122
+ await this.runHealthCheck();
121
123
  return { success: true, actionType: actionName };
122
124
  }
123
- /**
124
- * Trigger the SaveCurrentProfile action via the instance UI.
125
- *
126
- * This tells LinkedHelper to extract data from the currently
127
- * displayed LinkedIn profile and save it to the database.
128
- */
129
- async triggerExtraction() {
130
- await this.executeAction("SaveCurrentProfile");
131
- }
132
125
  /**
133
126
  * Evaluate a JavaScript expression in the LinkedHelper UI context.
134
127
  *
@@ -141,7 +134,17 @@ export class InstanceService {
141
134
  */
142
135
  async evaluateUI(expression, awaitPromise = true) {
143
136
  const client = this.ensureUiClient();
144
- return client.evaluate(expression, awaitPromise);
137
+ try {
138
+ const result = await client.evaluate(expression, awaitPromise);
139
+ await this.runHealthCheck();
140
+ return result;
141
+ }
142
+ catch (error) {
143
+ if (error instanceof CDPTimeoutError) {
144
+ await this.runHealthCheck();
145
+ }
146
+ throw error;
147
+ }
145
148
  }
146
149
  /** Whether both clients are currently connected. */
147
150
  get isConnected() {
@@ -150,23 +153,30 @@ export class InstanceService {
150
153
  this.uiClient !== null &&
151
154
  this.uiClient.isConnected);
152
155
  }
153
- ensureLinkedInClient() {
154
- if (!this.linkedInClient) {
155
- throw new ServiceError("InstanceService is not connected (LinkedIn target)");
156
- }
157
- return this.linkedInClient;
158
- }
159
156
  ensureUiClient() {
160
157
  if (!this.uiClient) {
161
158
  throw new ServiceError("InstanceService is not connected (UI target)");
162
159
  }
163
160
  return this.uiClient;
164
161
  }
165
- }
166
- const LINKEDIN_PROFILE_URL_RE = /^https:\/\/www\.linkedin\.com\/in\/[^/]+\/?$/;
167
- function assertLinkedInProfileUrl(url) {
168
- if (!LINKEDIN_PROFILE_URL_RE.test(url)) {
169
- throw new InvalidProfileUrlError(url);
162
+ /**
163
+ * Run the health checker if one is configured.
164
+ *
165
+ * Non-UIBlockedError failures (e.g. launcher connection lost) are
166
+ * silently ignored so that health check infrastructure issues do
167
+ * not mask the original operation result.
168
+ */
169
+ async runHealthCheck() {
170
+ if (!this.healthChecker)
171
+ return;
172
+ try {
173
+ await this.healthChecker();
174
+ }
175
+ catch (error) {
176
+ if (error instanceof UIBlockedError)
177
+ throw error;
178
+ // Health check infrastructure failure — do not mask the original result.
179
+ }
170
180
  }
171
181
  }
172
182
  function isLinkedInTarget(target) {
@@ -1 +1 @@
1
- {"version":3,"file":"instance.js","sourceRoot":"","sources":["../../src/services/instance.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE7D,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAclH,gEAAgE;AAChE,MAAM,eAAe,GAAG,MAAM,CAAC;AAE/B,oDAAoD;AACpD,MAAM,qBAAqB,GAAG,KAAK,CAAC;AAEpC;;;;;;;;;GASG;AACH,MAAM,OAAO,eAAe;IACT,IAAI,CAAS;IACb,IAAI,CAAS;IACb,OAAO,CAAqB;IAC5B,WAAW,CAAU;IAC9B,cAAc,GAAqB,IAAI,CAAC;IACxC,QAAQ,GAAqB,IAAI,CAAC;IAE1C,YAAY,IAAY,EAAE,OAAoE;QAC5F,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,WAAW,CAAC;QACzC,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,CAAC;QAChC,IAAI,CAAC,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,KAAK,CAAC;IACnD,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,OAAO;QACX,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,CAAC;QAE9C,IAAI,OAAO,GAAgB,EAAE,CAAC;QAC9B,IAAI,cAAqC,CAAC;QAC1C,IAAI,QAA+B,CAAC;QAEpC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;YAC7B,OAAO,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAEtD,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAChD,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAEpC,IAAI,cAAc,IAAI,QAAQ,EAAE,CAAC;gBAC/B,MAAM;YACR,CAAC;YAED,MAAM,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACrC,CAAC;QAED,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,IAAI,uBAAuB,CAC/B,2CAA2C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,0BAA0B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC/G,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,uBAAuB,CAC/B,sCAAsC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,0BAA0B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC1G,CAAC;QACJ,CAAC;QAED,MAAM,aAAa,GAAG;YACpB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;YAC5D,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC;QAEF,MAAM,QAAQ,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACzD,MAAM,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAE1C,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACnD,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAE9B,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,UAAU;QACR,IAAI,CAAC,cAAc,EAAE,UAAU,EAAE,CAAC;QAClC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,iBAAiB,CAAC,GAAW;QACjC,wBAAwB,CAAC,GAAG,CAAC,CAAC;QAE9B,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAE3C,MAAM,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACjC,MAAM,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC3B,MAAM,MAAM,CAAC,YAAY,CAAC,qBAAqB,CAAC,CAAC;IACnD,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,aAAa,CACjB,UAAkB,EAClB,SAAkC,EAAE;QAEpC,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAErC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,QAAQ,CACnB;;;uDAG+C,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;WACjG,EACH,IAAI,CACL,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YACpC,MAAM,IAAI,oBAAoB,CAAC,UAAU,EAAE,WAAW,UAAU,aAAa,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5G,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;IACnD,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,iBAAiB;QACrB,MAAM,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;IACjD,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,UAAU,CACd,UAAkB,EAClB,YAAY,GAAG,IAAI;QAEnB,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACrC,OAAO,MAAM,CAAC,QAAQ,CAAI,UAAU,EAAE,YAAY,CAAC,CAAC;IACtD,CAAC;IAED,oDAAoD;IACpD,IAAI,WAAW;QACb,OAAO,CACL,IAAI,CAAC,cAAc,KAAK,IAAI;YAC5B,IAAI,CAAC,cAAc,CAAC,WAAW;YAC/B,IAAI,CAAC,QAAQ,KAAK,IAAI;YACtB,IAAI,CAAC,QAAQ,CAAC,WAAW,CAC1B,CAAC;IACJ,CAAC;IAEO,oBAAoB;QAC1B,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,MAAM,IAAI,YAAY,CAAC,oDAAoD,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAEO,cAAc;QACpB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,IAAI,YAAY,CAAC,8CAA8C,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CACF;AAED,MAAM,uBAAuB,GAAG,8CAA8C,CAAC;AAE/E,SAAS,wBAAwB,CAAC,GAAW;IAC3C,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,sBAAsB,CAAC,GAAG,CAAC,CAAC;IACxC,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAiB;IACzC,OAAO,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,UAAU,CAAC,MAAiB;IACnC,OAAO,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;AACrE,CAAC"}
1
+ {"version":3,"file":"instance.js","sourceRoot":"","sources":["../../src/services/instance.ts"],"names":[],"mappings":"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"}
@@ -1,40 +1,44 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-only
2
2
  // Copyright (C) 2026 Oleksii PELYKH
3
3
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
4
- import { ActionExecutionError, InvalidProfileUrlError, ServiceError } from "./errors.js";
4
+ import { ActionExecutionError, ServiceError } from "./errors.js";
5
5
  import { InstanceService } from "./instance.js";
6
6
  /** All created client mocks, in creation order. */
7
7
  let clientInstances = [];
8
8
  /** Lookup by target ID after connect() is called. */
9
9
  let clientsByTargetId = new Map();
10
- vi.mock("../cdp/index.js", () => ({
11
- CDPClient: vi.fn().mockImplementation(function () {
12
- const mocks = {
13
- connect: vi.fn().mockImplementation(async (targetId) => {
14
- if (targetId) {
15
- clientsByTargetId.set(targetId, mocks);
16
- }
17
- }),
18
- disconnect: vi.fn(),
19
- send: vi.fn().mockResolvedValue(undefined),
20
- navigate: vi.fn().mockResolvedValue({ frameId: "F1" }),
21
- evaluate: vi.fn().mockResolvedValue(undefined),
22
- waitForEvent: vi.fn().mockResolvedValue(undefined),
23
- isConnected: vi.fn().mockReturnValue(true),
24
- };
25
- clientInstances.push(mocks);
26
- this.connect = mocks.connect;
27
- this.disconnect = mocks.disconnect;
28
- this.send = mocks.send;
29
- this.navigate = mocks.navigate;
30
- this.evaluate = mocks.evaluate;
31
- this.waitForEvent = mocks.waitForEvent;
32
- Object.defineProperty(this, "isConnected", {
33
- get: mocks.isConnected,
34
- });
35
- }),
36
- discoverTargets: vi.fn(),
37
- }));
10
+ vi.mock("../cdp/index.js", async (importOriginal) => {
11
+ const actual = await importOriginal();
12
+ return {
13
+ ...actual,
14
+ CDPClient: vi.fn().mockImplementation(function () {
15
+ const mocks = {
16
+ connect: vi.fn().mockImplementation(async (targetId) => {
17
+ if (targetId) {
18
+ clientsByTargetId.set(targetId, mocks);
19
+ }
20
+ }),
21
+ disconnect: vi.fn(),
22
+ send: vi.fn().mockResolvedValue(undefined),
23
+ navigate: vi.fn().mockResolvedValue({ frameId: "F1" }),
24
+ evaluate: vi.fn().mockResolvedValue(undefined),
25
+ waitForEvent: vi.fn().mockResolvedValue(undefined),
26
+ isConnected: vi.fn().mockReturnValue(true),
27
+ };
28
+ clientInstances.push(mocks);
29
+ this.connect = mocks.connect;
30
+ this.disconnect = mocks.disconnect;
31
+ this.send = mocks.send;
32
+ this.navigate = mocks.navigate;
33
+ this.evaluate = mocks.evaluate;
34
+ this.waitForEvent = mocks.waitForEvent;
35
+ Object.defineProperty(this, "isConnected", {
36
+ get: mocks.isConnected,
37
+ });
38
+ }),
39
+ discoverTargets: vi.fn(),
40
+ };
41
+ });
38
42
  import { discoverTargets } from "../cdp/index.js";
39
43
  const mockedDiscoverTargets = vi.mocked(discoverTargets);
40
44
  function makeTarget(overrides) {
@@ -143,54 +147,6 @@ describe("InstanceService", () => {
143
147
  expect(() => service.disconnect()).not.toThrow();
144
148
  });
145
149
  });
146
- describe("navigateToProfile", () => {
147
- it("calls Page.enable, navigate, and waitForEvent on the LinkedIn client", async () => {
148
- mockedDiscoverTargets.mockResolvedValue([LINKEDIN_TARGET, UI_TARGET]);
149
- await service.connect();
150
- await service.navigateToProfile("https://www.linkedin.com/in/test-user");
151
- const liClient = getClientMocks("LI1");
152
- const uiClient = getClientMocks("UI1");
153
- // LinkedIn client should have received navigation calls
154
- expect(liClient.send).toHaveBeenCalledWith("Page.enable");
155
- expect(liClient.navigate).toHaveBeenCalledWith("https://www.linkedin.com/in/test-user");
156
- expect(liClient.waitForEvent).toHaveBeenCalledWith("Page.loadEventFired");
157
- // UI client should NOT have received any navigation calls
158
- expect(uiClient.send).not.toHaveBeenCalled();
159
- expect(uiClient.navigate).not.toHaveBeenCalled();
160
- expect(uiClient.waitForEvent).not.toHaveBeenCalled();
161
- });
162
- it("accepts a profile URL with trailing slash", async () => {
163
- mockedDiscoverTargets.mockResolvedValue([LINKEDIN_TARGET, UI_TARGET]);
164
- await service.connect();
165
- await service.navigateToProfile("https://www.linkedin.com/in/test-user/");
166
- const liClient = getClientMocks("LI1");
167
- expect(liClient.navigate).toHaveBeenCalledWith("https://www.linkedin.com/in/test-user/");
168
- });
169
- it("rejects file:// URLs", async () => {
170
- await expect(service.navigateToProfile("file:///etc/passwd")).rejects.toThrow(InvalidProfileUrlError);
171
- });
172
- it("rejects javascript: URLs", async () => {
173
- await expect(service.navigateToProfile("javascript:alert(1)")).rejects.toThrow(InvalidProfileUrlError);
174
- });
175
- it("rejects non-LinkedIn URLs", async () => {
176
- await expect(service.navigateToProfile("https://evil.com/in/someone")).rejects.toThrow(InvalidProfileUrlError);
177
- });
178
- it("rejects LinkedIn URLs that are not profile paths", async () => {
179
- await expect(service.navigateToProfile("https://www.linkedin.com/feed/")).rejects.toThrow(InvalidProfileUrlError);
180
- });
181
- it("rejects http:// LinkedIn profile URLs", async () => {
182
- await expect(service.navigateToProfile("http://www.linkedin.com/in/test")).rejects.toThrow(InvalidProfileUrlError);
183
- });
184
- it("rejects profile URL with extra path segments", async () => {
185
- await expect(service.navigateToProfile("https://www.linkedin.com/in/test/detail/contact-info/")).rejects.toThrow(InvalidProfileUrlError);
186
- });
187
- it("includes the invalid URL in the error message", async () => {
188
- await expect(service.navigateToProfile("https://evil.com")).rejects.toThrow(/https:\/\/evil\.com/);
189
- });
190
- it("throws ServiceError when not connected", async () => {
191
- await expect(service.navigateToProfile("https://www.linkedin.com/in/test")).rejects.toThrow(ServiceError);
192
- });
193
- });
194
150
  describe("executeAction", () => {
195
151
  it("evaluates the given action on the UI client only", async () => {
196
152
  mockedDiscoverTargets.mockResolvedValue([LINKEDIN_TARGET, UI_TARGET]);
@@ -275,17 +231,5 @@ describe("InstanceService", () => {
275
231
  await expect(service.evaluateUI("bad")).rejects.toThrow("CDP failure");
276
232
  });
277
233
  });
278
- describe("triggerExtraction", () => {
279
- it("delegates to executeAction with SaveCurrentProfile", async () => {
280
- mockedDiscoverTargets.mockResolvedValue([LINKEDIN_TARGET, UI_TARGET]);
281
- await service.connect();
282
- await service.triggerExtraction();
283
- const uiClient = getClientMocks("UI1");
284
- expect(uiClient.evaluate).toHaveBeenCalledWith(expect.stringContaining("SaveCurrentProfile"), true);
285
- });
286
- it("throws ServiceError when not connected", async () => {
287
- await expect(service.triggerExtraction()).rejects.toThrow(ServiceError);
288
- });
289
- });
290
234
  });
291
235
  //# sourceMappingURL=instance.test.js.map