@lhremote/core 0.0.0 → 0.1.0
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/LICENSE +661 -0
- package/dist/cdp/client.d.ts +100 -0
- package/dist/cdp/client.d.ts.map +1 -0
- package/dist/cdp/client.integration.test.d.ts +2 -0
- package/dist/cdp/client.integration.test.d.ts.map +1 -0
- package/dist/cdp/client.integration.test.js +70 -0
- package/dist/cdp/client.integration.test.js.map +1 -0
- package/dist/cdp/client.js +286 -0
- package/dist/cdp/client.js.map +1 -0
- package/dist/cdp/client.test.d.ts +2 -0
- package/dist/cdp/client.test.d.ts.map +1 -0
- package/dist/cdp/client.test.js +269 -0
- package/dist/cdp/client.test.js.map +1 -0
- package/dist/cdp/discovery.d.ts +14 -0
- package/dist/cdp/discovery.d.ts.map +1 -0
- package/dist/cdp/discovery.integration.test.d.ts +2 -0
- package/dist/cdp/discovery.integration.test.d.ts.map +1 -0
- package/dist/cdp/discovery.integration.test.js +25 -0
- package/dist/cdp/discovery.integration.test.js.map +1 -0
- package/dist/cdp/discovery.js +31 -0
- package/dist/cdp/discovery.js.map +1 -0
- package/dist/cdp/discovery.test.d.ts +2 -0
- package/dist/cdp/discovery.test.d.ts.map +1 -0
- package/dist/cdp/discovery.test.js +54 -0
- package/dist/cdp/discovery.test.js.map +1 -0
- package/dist/cdp/errors.d.ts +28 -0
- package/dist/cdp/errors.d.ts.map +1 -0
- package/dist/cdp/errors.js +40 -0
- package/dist/cdp/errors.js.map +1 -0
- package/dist/cdp/errors.test.d.ts +2 -0
- package/dist/cdp/errors.test.d.ts.map +1 -0
- package/dist/cdp/errors.test.js +35 -0
- package/dist/cdp/errors.test.js.map +1 -0
- package/dist/cdp/index.d.ts +5 -0
- package/dist/cdp/index.d.ts.map +1 -0
- package/dist/cdp/index.js +5 -0
- package/dist/cdp/index.js.map +1 -0
- package/dist/cdp/instance-discovery.d.ts +30 -0
- package/dist/cdp/instance-discovery.d.ts.map +1 -0
- package/dist/cdp/instance-discovery.integration.test.d.ts +2 -0
- package/dist/cdp/instance-discovery.integration.test.d.ts.map +1 -0
- package/dist/cdp/instance-discovery.integration.test.js +34 -0
- package/dist/cdp/instance-discovery.integration.test.js.map +1 -0
- package/dist/cdp/instance-discovery.js +130 -0
- package/dist/cdp/instance-discovery.js.map +1 -0
- package/dist/cdp/instance-discovery.test.d.ts +2 -0
- package/dist/cdp/instance-discovery.test.d.ts.map +1 -0
- package/dist/cdp/instance-discovery.test.js +110 -0
- package/dist/cdp/instance-discovery.test.js.map +1 -0
- package/dist/cdp/testing/launch-chromium.d.ts +24 -0
- package/dist/cdp/testing/launch-chromium.d.ts.map +1 -0
- package/dist/cdp/testing/launch-chromium.js +90 -0
- package/dist/cdp/testing/launch-chromium.js.map +1 -0
- package/dist/db/client.d.ts +13 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.integration.test.d.ts +2 -0
- package/dist/db/client.integration.test.d.ts.map +1 -0
- package/dist/db/client.integration.test.js +59 -0
- package/dist/db/client.integration.test.js.map +1 -0
- package/dist/db/client.js +17 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/client.test.d.ts +2 -0
- package/dist/db/client.test.d.ts.map +1 -0
- package/dist/db/client.test.js +46 -0
- package/dist/db/client.test.js.map +1 -0
- package/dist/db/discovery.d.ts +14 -0
- package/dist/db/discovery.d.ts.map +1 -0
- package/dist/db/discovery.integration.test.d.ts +2 -0
- package/dist/db/discovery.integration.test.d.ts.map +1 -0
- package/dist/db/discovery.integration.test.js +99 -0
- package/dist/db/discovery.integration.test.js.map +1 -0
- package/dist/db/discovery.js +74 -0
- package/dist/db/discovery.js.map +1 -0
- package/dist/db/discovery.test.d.ts +2 -0
- package/dist/db/discovery.test.d.ts.map +1 -0
- package/dist/db/discovery.test.js +123 -0
- package/dist/db/discovery.test.js.map +1 -0
- package/dist/db/errors.d.ts +21 -0
- package/dist/db/errors.d.ts.map +1 -0
- package/dist/db/errors.js +33 -0
- package/dist/db/errors.js.map +1 -0
- package/dist/db/errors.test.d.ts +2 -0
- package/dist/db/errors.test.d.ts.map +1 -0
- package/dist/db/errors.test.js +32 -0
- package/dist/db/errors.test.js.map +1 -0
- package/dist/db/index.d.ts +5 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +5 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/repositories/index.d.ts +2 -0
- package/dist/db/repositories/index.d.ts.map +1 -0
- package/dist/db/repositories/index.js +2 -0
- package/dist/db/repositories/index.js.map +1 -0
- package/dist/db/repositories/profile.d.ts +32 -0
- package/dist/db/repositories/profile.d.ts.map +1 -0
- package/dist/db/repositories/profile.integration.test.d.ts +2 -0
- package/dist/db/repositories/profile.integration.test.d.ts.map +1 -0
- package/dist/db/repositories/profile.integration.test.js +119 -0
- package/dist/db/repositories/profile.integration.test.js.map +1 -0
- package/dist/db/repositories/profile.js +126 -0
- package/dist/db/repositories/profile.js.map +1 -0
- package/dist/db/repositories/profile.test.d.ts +2 -0
- package/dist/db/repositories/profile.test.d.ts.map +1 -0
- package/dist/db/repositories/profile.test.js +126 -0
- package/dist/db/repositories/profile.test.js.map +1 -0
- package/dist/db/testing/create-fixture.d.ts +8 -0
- package/dist/db/testing/create-fixture.d.ts.map +1 -0
- package/dist/db/testing/create-fixture.js +286 -0
- package/dist/db/testing/create-fixture.js.map +1 -0
- package/dist/db/testing/open-fixture.d.ts +14 -0
- package/dist/db/testing/open-fixture.d.ts.map +1 -0
- package/dist/db/testing/open-fixture.js +21 -0
- package/dist/db/testing/open-fixture.js.map +1 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/services/app.d.ts +62 -0
- package/dist/services/app.d.ts.map +1 -0
- package/dist/services/app.js +198 -0
- package/dist/services/app.js.map +1 -0
- package/dist/services/app.test.d.ts +2 -0
- package/dist/services/app.test.d.ts.map +1 -0
- package/dist/services/app.test.js +265 -0
- package/dist/services/app.test.js.map +1 -0
- package/dist/services/errors.d.ts +45 -0
- package/dist/services/errors.d.ts.map +1 -0
- package/dist/services/errors.js +66 -0
- package/dist/services/errors.js.map +1 -0
- package/dist/services/errors.test.d.ts +2 -0
- package/dist/services/errors.test.d.ts.map +1 -0
- package/dist/services/errors.test.js +71 -0
- package/dist/services/errors.test.js.map +1 -0
- package/dist/services/index.d.ts +8 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +8 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/instance-lifecycle.d.ts +38 -0
- package/dist/services/instance-lifecycle.d.ts.map +1 -0
- package/dist/services/instance-lifecycle.js +87 -0
- package/dist/services/instance-lifecycle.js.map +1 -0
- package/dist/services/instance-lifecycle.test.d.ts +2 -0
- package/dist/services/instance-lifecycle.test.d.ts.map +1 -0
- package/dist/services/instance-lifecycle.test.js +152 -0
- package/dist/services/instance-lifecycle.test.js.map +1 -0
- package/dist/services/instance.d.ts +50 -0
- package/dist/services/instance.d.ts.map +1 -0
- package/dist/services/instance.js +121 -0
- package/dist/services/instance.js.map +1 -0
- package/dist/services/instance.test.d.ts +2 -0
- package/dist/services/instance.test.d.ts.map +1 -0
- package/dist/services/instance.test.js +181 -0
- package/dist/services/instance.test.js.map +1 -0
- package/dist/services/launcher.d.ts +51 -0
- package/dist/services/launcher.d.ts.map +1 -0
- package/dist/services/launcher.js +147 -0
- package/dist/services/launcher.js.map +1 -0
- package/dist/services/launcher.test.d.ts +2 -0
- package/dist/services/launcher.test.d.ts.map +1 -0
- package/dist/services/launcher.test.js +126 -0
- package/dist/services/launcher.test.js.map +1 -0
- package/dist/services/profile.d.ts +44 -0
- package/dist/services/profile.d.ts.map +1 -0
- package/dist/services/profile.js +83 -0
- package/dist/services/profile.js.map +1 -0
- package/dist/services/profile.test.d.ts +2 -0
- package/dist/services/profile.test.d.ts.map +1 -0
- package/dist/services/profile.test.js +145 -0
- package/dist/services/profile.test.js.map +1 -0
- package/dist/services/status.d.ts +33 -0
- package/dist/services/status.d.ts.map +1 -0
- package/dist/services/status.js +76 -0
- package/dist/services/status.js.map +1 -0
- package/dist/services/status.test.d.ts +2 -0
- package/dist/services/status.test.d.ts.map +1 -0
- package/dist/services/status.test.js +207 -0
- package/dist/services/status.test.js.map +1 -0
- package/dist/testing/e2e-helpers.d.ts +41 -0
- package/dist/testing/e2e-helpers.d.ts.map +1 -0
- package/dist/testing/e2e-helpers.js +111 -0
- package/dist/testing/e2e-helpers.js.map +1 -0
- package/dist/types/account.d.ts +13 -0
- package/dist/types/account.d.ts.map +1 -0
- package/dist/types/account.js +2 -0
- package/dist/types/account.js.map +1 -0
- package/dist/types/account.test.d.ts +2 -0
- package/dist/types/account.test.d.ts.map +1 -0
- package/dist/types/account.test.js +24 -0
- package/dist/types/account.test.js.map +1 -0
- package/dist/types/cdp.d.ts +18 -0
- package/dist/types/cdp.d.ts.map +1 -0
- package/dist/types/cdp.js +2 -0
- package/dist/types/cdp.js.map +1 -0
- package/dist/types/cdp.test.d.ts +2 -0
- package/dist/types/cdp.test.d.ts.map +1 -0
- package/dist/types/cdp.test.js +28 -0
- package/dist/types/cdp.test.js.map +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/instance.d.ts +36 -0
- package/dist/types/instance.d.ts.map +1 -0
- package/dist/types/instance.js +8 -0
- package/dist/types/instance.js.map +1 -0
- package/dist/types/instance.test.d.ts +2 -0
- package/dist/types/instance.test.d.ts.map +1 -0
- package/dist/types/instance.test.js +57 -0
- package/dist/types/instance.test.js.map +1 -0
- package/dist/types/profile.d.ts +50 -0
- package/dist/types/profile.d.ts.map +1 -0
- package/dist/types/profile.js +8 -0
- package/dist/types/profile.js.map +1 -0
- package/dist/types/profile.test.d.ts +2 -0
- package/dist/types/profile.test.d.ts.map +1 -0
- package/dist/types/profile.test.js +103 -0
- package/dist/types/profile.test.js.map +1 -0
- package/package.json +20 -8
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { discoverInstancePort } from "../cdp/index.js";
|
|
2
|
+
import { DatabaseClient, discoverAllDatabases } from "../db/index.js";
|
|
3
|
+
import { LauncherService } from "./launcher.js";
|
|
4
|
+
/**
|
|
5
|
+
* Perform a health check across LinkedHelper components.
|
|
6
|
+
*
|
|
7
|
+
* The function is intentionally fault-tolerant: individual component
|
|
8
|
+
* failures are reported in the result rather than thrown as exceptions.
|
|
9
|
+
*
|
|
10
|
+
* @param cdpPort - The CDP port of the LinkedHelper launcher (default 9222).
|
|
11
|
+
*/
|
|
12
|
+
export async function checkStatus(cdpPort = 9222) {
|
|
13
|
+
const launcher = { reachable: false, port: cdpPort };
|
|
14
|
+
const instances = [];
|
|
15
|
+
const databases = [];
|
|
16
|
+
// 1. Probe launcher
|
|
17
|
+
const launcherService = new LauncherService(cdpPort);
|
|
18
|
+
try {
|
|
19
|
+
await launcherService.connect();
|
|
20
|
+
launcher.reachable = true;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
// Launcher not reachable — skip instance discovery but still check databases
|
|
24
|
+
}
|
|
25
|
+
// 2. List accounts and discover instance CDP ports (only if launcher is reachable)
|
|
26
|
+
if (launcher.reachable) {
|
|
27
|
+
try {
|
|
28
|
+
const accounts = await launcherService.listAccounts();
|
|
29
|
+
const instancePort = await discoverInstancePort(cdpPort);
|
|
30
|
+
for (const account of accounts) {
|
|
31
|
+
// discoverInstancePort finds a single child-process port but cannot
|
|
32
|
+
// determine which account owns it. Assign the port only when there
|
|
33
|
+
// is exactly one account (the common case); otherwise report null.
|
|
34
|
+
instances.push({
|
|
35
|
+
accountId: account.id,
|
|
36
|
+
accountName: account.name,
|
|
37
|
+
cdpPort: accounts.length === 1 ? instancePort : null,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// Failed to query accounts — report empty
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
launcherService.disconnect();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// 3. Check databases
|
|
49
|
+
try {
|
|
50
|
+
const dbMap = discoverAllDatabases();
|
|
51
|
+
for (const [accountId, dbPath] of dbMap) {
|
|
52
|
+
let profileCount = 0;
|
|
53
|
+
try {
|
|
54
|
+
const client = new DatabaseClient(dbPath);
|
|
55
|
+
try {
|
|
56
|
+
const row = client.db
|
|
57
|
+
.prepare("SELECT COUNT(*) AS cnt FROM people")
|
|
58
|
+
.get();
|
|
59
|
+
profileCount = row?.cnt ?? 0;
|
|
60
|
+
}
|
|
61
|
+
finally {
|
|
62
|
+
client.close();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Database unreadable — report count as 0
|
|
67
|
+
}
|
|
68
|
+
databases.push({ accountId, path: dbPath, profileCount });
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// Failed to discover databases — report empty
|
|
73
|
+
}
|
|
74
|
+
return { launcher, instances, databases };
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/services/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AA6BhD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAO,GAAG,IAAI;IAC9C,MAAM,QAAQ,GAAmB,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACrE,MAAM,SAAS,GAA4B,EAAE,CAAC;IAC9C,MAAM,SAAS,GAAqB,EAAE,CAAC;IAEvC,oBAAoB;IACpB,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;IACrD,IAAI,CAAC;QACH,MAAM,eAAe,CAAC,OAAO,EAAE,CAAC;QAChC,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,6EAA6E;IAC/E,CAAC;IAED,mFAAmF;IACnF,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,YAAY,EAAE,CAAC;YACtD,MAAM,YAAY,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAC;YAEzD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,oEAAoE;gBACpE,oEAAoE;gBACpE,mEAAmE;gBACnE,SAAS,CAAC,IAAI,CAAC;oBACb,SAAS,EAAE,OAAO,CAAC,EAAE;oBACrB,WAAW,EAAE,OAAO,CAAC,IAAI;oBACzB,OAAO,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI;iBACrD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0CAA0C;QAC5C,CAAC;gBAAS,CAAC;YACT,eAAe,CAAC,UAAU,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,oBAAoB,EAAE,CAAC;QACrC,KAAK,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACxC,IAAI,YAAY,GAAG,CAAC,CAAC;YACrB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;gBAC1C,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,MAAM,CAAC,EAAE;yBAClB,OAAO,CAAC,oCAAoC,CAAC;yBAC7C,GAAG,EAAiC,CAAC;oBACxC,YAAY,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;gBAC/B,CAAC;wBAAS,CAAC;oBACT,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,0CAA0C;YAC5C,CAAC;YACD,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,8CAA8C;IAChD,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.test.d.ts","sourceRoot":"","sources":["../../src/services/status.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
vi.mock("../cdp/index.js", () => ({
|
|
3
|
+
discoverInstancePort: vi.fn(),
|
|
4
|
+
}));
|
|
5
|
+
vi.mock("../db/index.js", () => ({
|
|
6
|
+
DatabaseClient: vi.fn(),
|
|
7
|
+
discoverAllDatabases: vi.fn(),
|
|
8
|
+
}));
|
|
9
|
+
vi.mock("./launcher.js", () => ({
|
|
10
|
+
LauncherService: vi.fn(),
|
|
11
|
+
}));
|
|
12
|
+
import { discoverInstancePort } from "../cdp/index.js";
|
|
13
|
+
import { DatabaseClient, discoverAllDatabases } from "../db/index.js";
|
|
14
|
+
import { LauncherService } from "./launcher.js";
|
|
15
|
+
import { checkStatus } from "./status.js";
|
|
16
|
+
const mockedLauncherService = vi.mocked(LauncherService);
|
|
17
|
+
const mockedDiscoverInstancePort = vi.mocked(discoverInstancePort);
|
|
18
|
+
const mockedDiscoverAllDatabases = vi.mocked(discoverAllDatabases);
|
|
19
|
+
const mockedDatabaseClient = vi.mocked(DatabaseClient);
|
|
20
|
+
function mockLauncher(overrides = {}) {
|
|
21
|
+
const disconnect = vi.fn();
|
|
22
|
+
mockedLauncherService.mockImplementation(function () {
|
|
23
|
+
return {
|
|
24
|
+
connect: vi.fn().mockResolvedValue(undefined),
|
|
25
|
+
disconnect,
|
|
26
|
+
listAccounts: vi.fn().mockResolvedValue([]),
|
|
27
|
+
...overrides,
|
|
28
|
+
};
|
|
29
|
+
});
|
|
30
|
+
return { disconnect };
|
|
31
|
+
}
|
|
32
|
+
describe("checkStatus", () => {
|
|
33
|
+
beforeEach(() => {
|
|
34
|
+
vi.clearAllMocks();
|
|
35
|
+
});
|
|
36
|
+
afterEach(() => {
|
|
37
|
+
vi.restoreAllMocks();
|
|
38
|
+
});
|
|
39
|
+
it("reports launcher as not reachable when connect fails", async () => {
|
|
40
|
+
mockedLauncherService.mockImplementation(function () {
|
|
41
|
+
return {
|
|
42
|
+
connect: vi.fn().mockRejectedValue(new Error("connection refused")),
|
|
43
|
+
disconnect: vi.fn(),
|
|
44
|
+
};
|
|
45
|
+
});
|
|
46
|
+
mockedDiscoverAllDatabases.mockReturnValue(new Map());
|
|
47
|
+
const report = await checkStatus(9222);
|
|
48
|
+
expect(report.launcher).toEqual({ reachable: false, port: 9222 });
|
|
49
|
+
expect(report.instances).toEqual([]);
|
|
50
|
+
expect(report.databases).toEqual([]);
|
|
51
|
+
});
|
|
52
|
+
it("still discovers databases when launcher is not reachable", async () => {
|
|
53
|
+
mockedLauncherService.mockImplementation(function () {
|
|
54
|
+
return {
|
|
55
|
+
connect: vi.fn().mockRejectedValue(new Error("connection refused")),
|
|
56
|
+
disconnect: vi.fn(),
|
|
57
|
+
};
|
|
58
|
+
});
|
|
59
|
+
const dbMap = new Map();
|
|
60
|
+
dbMap.set(1, "/path/to/db.db");
|
|
61
|
+
mockedDiscoverAllDatabases.mockReturnValue(dbMap);
|
|
62
|
+
const mockClose = vi.fn();
|
|
63
|
+
const mockPrepare = vi.fn().mockReturnValue({
|
|
64
|
+
get: vi.fn().mockReturnValue({ cnt: 10 }),
|
|
65
|
+
});
|
|
66
|
+
mockedDatabaseClient.mockImplementation(function () {
|
|
67
|
+
return { db: { prepare: mockPrepare }, close: mockClose };
|
|
68
|
+
});
|
|
69
|
+
const report = await checkStatus(9222);
|
|
70
|
+
expect(report.launcher.reachable).toBe(false);
|
|
71
|
+
expect(report.instances).toEqual([]);
|
|
72
|
+
expect(report.databases).toEqual([
|
|
73
|
+
{ accountId: 1, path: "/path/to/db.db", profileCount: 10 },
|
|
74
|
+
]);
|
|
75
|
+
expect(mockedDiscoverAllDatabases).toHaveBeenCalledOnce();
|
|
76
|
+
});
|
|
77
|
+
it("reports launcher as reachable when connect succeeds", async () => {
|
|
78
|
+
mockLauncher();
|
|
79
|
+
mockedDiscoverInstancePort.mockResolvedValue(null);
|
|
80
|
+
mockedDiscoverAllDatabases.mockReturnValue(new Map());
|
|
81
|
+
const report = await checkStatus(9222);
|
|
82
|
+
expect(report.launcher).toEqual({ reachable: true, port: 9222 });
|
|
83
|
+
});
|
|
84
|
+
it("uses provided cdpPort", async () => {
|
|
85
|
+
mockLauncher();
|
|
86
|
+
mockedDiscoverInstancePort.mockResolvedValue(null);
|
|
87
|
+
mockedDiscoverAllDatabases.mockReturnValue(new Map());
|
|
88
|
+
const report = await checkStatus(4567);
|
|
89
|
+
expect(report.launcher.port).toBe(4567);
|
|
90
|
+
expect(mockedLauncherService).toHaveBeenCalledWith(4567);
|
|
91
|
+
});
|
|
92
|
+
it("defaults cdpPort to 9222", async () => {
|
|
93
|
+
mockLauncher();
|
|
94
|
+
mockedDiscoverInstancePort.mockResolvedValue(null);
|
|
95
|
+
mockedDiscoverAllDatabases.mockReturnValue(new Map());
|
|
96
|
+
const report = await checkStatus();
|
|
97
|
+
expect(report.launcher.port).toBe(9222);
|
|
98
|
+
});
|
|
99
|
+
it("reports single account with instance port", async () => {
|
|
100
|
+
mockLauncher({
|
|
101
|
+
listAccounts: vi.fn().mockResolvedValue([
|
|
102
|
+
{ id: 1, liId: 100, name: "Alice" },
|
|
103
|
+
]),
|
|
104
|
+
});
|
|
105
|
+
mockedDiscoverInstancePort.mockResolvedValue(54321);
|
|
106
|
+
mockedDiscoverAllDatabases.mockReturnValue(new Map());
|
|
107
|
+
const report = await checkStatus(9222);
|
|
108
|
+
expect(report.instances).toEqual([
|
|
109
|
+
{ accountId: 1, accountName: "Alice", cdpPort: 54321 },
|
|
110
|
+
]);
|
|
111
|
+
});
|
|
112
|
+
it("reports null cdpPort for all accounts when multiple accounts exist", async () => {
|
|
113
|
+
mockLauncher({
|
|
114
|
+
listAccounts: vi.fn().mockResolvedValue([
|
|
115
|
+
{ id: 1, liId: 100, name: "Alice" },
|
|
116
|
+
{ id: 2, liId: 200, name: "Bob" },
|
|
117
|
+
]),
|
|
118
|
+
});
|
|
119
|
+
mockedDiscoverInstancePort.mockResolvedValue(54321);
|
|
120
|
+
mockedDiscoverAllDatabases.mockReturnValue(new Map());
|
|
121
|
+
const report = await checkStatus(9222);
|
|
122
|
+
expect(report.instances).toEqual([
|
|
123
|
+
{ accountId: 1, accountName: "Alice", cdpPort: null },
|
|
124
|
+
{ accountId: 2, accountName: "Bob", cdpPort: null },
|
|
125
|
+
]);
|
|
126
|
+
});
|
|
127
|
+
it("reports null cdpPort when no instance is running", async () => {
|
|
128
|
+
mockLauncher({
|
|
129
|
+
listAccounts: vi.fn().mockResolvedValue([
|
|
130
|
+
{ id: 1, liId: 100, name: "Alice" },
|
|
131
|
+
]),
|
|
132
|
+
});
|
|
133
|
+
mockedDiscoverInstancePort.mockResolvedValue(null);
|
|
134
|
+
mockedDiscoverAllDatabases.mockReturnValue(new Map());
|
|
135
|
+
const report = await checkStatus(9222);
|
|
136
|
+
expect(report.instances[0]?.cdpPort).toBeNull();
|
|
137
|
+
});
|
|
138
|
+
it("reports empty instances when listAccounts fails", async () => {
|
|
139
|
+
mockLauncher({
|
|
140
|
+
listAccounts: vi.fn().mockRejectedValue(new Error("eval error")),
|
|
141
|
+
});
|
|
142
|
+
mockedDiscoverAllDatabases.mockReturnValue(new Map());
|
|
143
|
+
const report = await checkStatus(9222);
|
|
144
|
+
expect(report.instances).toEqual([]);
|
|
145
|
+
expect(report.launcher.reachable).toBe(true);
|
|
146
|
+
});
|
|
147
|
+
it("reports databases with profile counts", async () => {
|
|
148
|
+
mockLauncher();
|
|
149
|
+
mockedDiscoverInstancePort.mockResolvedValue(null);
|
|
150
|
+
const dbMap = new Map();
|
|
151
|
+
dbMap.set(1, "/path/to/db1.db");
|
|
152
|
+
dbMap.set(2, "/path/to/db2.db");
|
|
153
|
+
mockedDiscoverAllDatabases.mockReturnValue(dbMap);
|
|
154
|
+
const mockClose = vi.fn();
|
|
155
|
+
const mockPrepare = vi.fn().mockReturnValue({
|
|
156
|
+
get: vi.fn().mockReturnValue({ cnt: 42 }),
|
|
157
|
+
});
|
|
158
|
+
mockedDatabaseClient.mockImplementation(function () {
|
|
159
|
+
return { db: { prepare: mockPrepare }, close: mockClose };
|
|
160
|
+
});
|
|
161
|
+
const report = await checkStatus(9222);
|
|
162
|
+
expect(report.databases).toEqual([
|
|
163
|
+
{ accountId: 1, path: "/path/to/db1.db", profileCount: 42 },
|
|
164
|
+
{ accountId: 2, path: "/path/to/db2.db", profileCount: 42 },
|
|
165
|
+
]);
|
|
166
|
+
expect(mockClose).toHaveBeenCalledTimes(2);
|
|
167
|
+
});
|
|
168
|
+
it("reports profileCount 0 when database is unreadable", async () => {
|
|
169
|
+
mockLauncher();
|
|
170
|
+
mockedDiscoverInstancePort.mockResolvedValue(null);
|
|
171
|
+
const dbMap = new Map();
|
|
172
|
+
dbMap.set(1, "/path/to/db.db");
|
|
173
|
+
mockedDiscoverAllDatabases.mockReturnValue(dbMap);
|
|
174
|
+
mockedDatabaseClient.mockImplementation(function () {
|
|
175
|
+
throw new Error("SQLITE_CANTOPEN");
|
|
176
|
+
});
|
|
177
|
+
const report = await checkStatus(9222);
|
|
178
|
+
expect(report.databases).toEqual([
|
|
179
|
+
{ accountId: 1, path: "/path/to/db.db", profileCount: 0 },
|
|
180
|
+
]);
|
|
181
|
+
});
|
|
182
|
+
it("reports empty databases when discovery fails", async () => {
|
|
183
|
+
mockLauncher();
|
|
184
|
+
mockedDiscoverInstancePort.mockResolvedValue(null);
|
|
185
|
+
mockedDiscoverAllDatabases.mockImplementation(() => {
|
|
186
|
+
throw new Error("no such directory");
|
|
187
|
+
});
|
|
188
|
+
const report = await checkStatus(9222);
|
|
189
|
+
expect(report.databases).toEqual([]);
|
|
190
|
+
});
|
|
191
|
+
it("disconnects launcher after querying accounts", async () => {
|
|
192
|
+
const { disconnect } = mockLauncher();
|
|
193
|
+
mockedDiscoverInstancePort.mockResolvedValue(null);
|
|
194
|
+
mockedDiscoverAllDatabases.mockReturnValue(new Map());
|
|
195
|
+
await checkStatus(9222);
|
|
196
|
+
expect(disconnect).toHaveBeenCalledOnce();
|
|
197
|
+
});
|
|
198
|
+
it("disconnects launcher even when listAccounts fails", async () => {
|
|
199
|
+
const { disconnect } = mockLauncher({
|
|
200
|
+
listAccounts: vi.fn().mockRejectedValue(new Error("eval error")),
|
|
201
|
+
});
|
|
202
|
+
mockedDiscoverAllDatabases.mockReturnValue(new Map());
|
|
203
|
+
await checkStatus(9222);
|
|
204
|
+
expect(disconnect).toHaveBeenCalledOnce();
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
//# sourceMappingURL=status.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.test.js","sourceRoot":"","sources":["../../src/services/status.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { describe } from "vitest";
|
|
2
|
+
import { AppService, type AppServiceOptions } from "../services/app.js";
|
|
3
|
+
/**
|
|
4
|
+
* Wrapper around `describe.skipIf` that skips the suite when
|
|
5
|
+
* the LinkedHelper binary is not installed.
|
|
6
|
+
*/
|
|
7
|
+
export declare function describeE2E(name: string, fn: () => void): ReturnType<typeof describe>;
|
|
8
|
+
export interface LaunchedApp {
|
|
9
|
+
app: AppService;
|
|
10
|
+
port: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Launch LinkedHelper and wait for the launcher to become fully ready.
|
|
14
|
+
*
|
|
15
|
+
* Readiness is verified in two phases:
|
|
16
|
+
* 1. The CDP HTTP endpoint (`/json/list`) returns at least one target.
|
|
17
|
+
* 2. A full `LauncherService` connection succeeds and can query accounts,
|
|
18
|
+
* confirming the Electron renderer, `@electron/remote`, and the
|
|
19
|
+
* electron-store are all operational.
|
|
20
|
+
*
|
|
21
|
+
* @param options.timeout Maximum ms to wait for full readiness (default 30 000).
|
|
22
|
+
*/
|
|
23
|
+
export declare function launchApp(options?: {
|
|
24
|
+
timeout?: number;
|
|
25
|
+
appOptions?: AppServiceOptions;
|
|
26
|
+
}): Promise<LaunchedApp>;
|
|
27
|
+
/**
|
|
28
|
+
* Quit LinkedHelper, swallowing errors for cleanup use.
|
|
29
|
+
*/
|
|
30
|
+
export declare function quitApp(app: AppService): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Retry an async operation with configurable attempts and delay.
|
|
33
|
+
*
|
|
34
|
+
* Useful in E2E tests where CDP endpoints may be transiently
|
|
35
|
+
* unavailable during the LinkedHelper app lifecycle.
|
|
36
|
+
*/
|
|
37
|
+
export declare function retryAsync<T>(fn: () => Promise<T>, options?: {
|
|
38
|
+
retries?: number;
|
|
39
|
+
delay?: number;
|
|
40
|
+
}): Promise<T>;
|
|
41
|
+
//# sourceMappingURL=e2e-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"e2e-helpers.d.ts","sourceRoot":"","sources":["../../src/testing/e2e-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAiBxE;;;GAGG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,IAAI,GACb,UAAU,CAAC,OAAO,QAAQ,CAAC,CAE7B;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,UAAU,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,SAAS,CAAC,OAAO,CAAC,EAAE;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAChC,GAAG,OAAO,CAAC,WAAW,CAAC,CA4CvB;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAM5D;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,CAAC,EAChC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7C,OAAO,CAAC,CAAC,CAAC,CAiBZ"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { describe } from "vitest";
|
|
2
|
+
import { AppService } from "../services/app.js";
|
|
3
|
+
import { AppNotFoundError } from "../services/errors.js";
|
|
4
|
+
import { discoverTargets } from "../cdp/discovery.js";
|
|
5
|
+
import { LauncherService } from "../services/launcher.js";
|
|
6
|
+
const linkedHelperAvailable = (() => {
|
|
7
|
+
try {
|
|
8
|
+
AppService.findBinary();
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
if (error instanceof AppNotFoundError) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
throw error;
|
|
16
|
+
}
|
|
17
|
+
})();
|
|
18
|
+
/**
|
|
19
|
+
* Wrapper around `describe.skipIf` that skips the suite when
|
|
20
|
+
* the LinkedHelper binary is not installed.
|
|
21
|
+
*/
|
|
22
|
+
export function describeE2E(name, fn) {
|
|
23
|
+
return describe.skipIf(!linkedHelperAvailable)(`${name} (e2e)`, fn);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Launch LinkedHelper and wait for the launcher to become fully ready.
|
|
27
|
+
*
|
|
28
|
+
* Readiness is verified in two phases:
|
|
29
|
+
* 1. The CDP HTTP endpoint (`/json/list`) returns at least one target.
|
|
30
|
+
* 2. A full `LauncherService` connection succeeds and can query accounts,
|
|
31
|
+
* confirming the Electron renderer, `@electron/remote`, and the
|
|
32
|
+
* electron-store are all operational.
|
|
33
|
+
*
|
|
34
|
+
* @param options.timeout Maximum ms to wait for full readiness (default 30 000).
|
|
35
|
+
*/
|
|
36
|
+
export async function launchApp(options) {
|
|
37
|
+
const timeout = options?.timeout ?? 30_000;
|
|
38
|
+
const app = new AppService(undefined, options?.appOptions);
|
|
39
|
+
await app.launch();
|
|
40
|
+
const port = app.cdpPort;
|
|
41
|
+
const deadline = Date.now() + timeout;
|
|
42
|
+
// Phase 1: Wait for CDP HTTP endpoint to expose targets
|
|
43
|
+
while (Date.now() < deadline) {
|
|
44
|
+
try {
|
|
45
|
+
const targets = await discoverTargets(port);
|
|
46
|
+
if (targets.length > 0)
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// Not ready yet
|
|
51
|
+
}
|
|
52
|
+
await new Promise((r) => setTimeout(r, 250));
|
|
53
|
+
}
|
|
54
|
+
// Phase 2: Wait for full launcher readiness (WebSocket + renderer loaded)
|
|
55
|
+
while (Date.now() < deadline) {
|
|
56
|
+
const launcher = new LauncherService(port);
|
|
57
|
+
try {
|
|
58
|
+
await launcher.connect();
|
|
59
|
+
await launcher.listAccounts();
|
|
60
|
+
launcher.disconnect();
|
|
61
|
+
return { app, port };
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
launcher.disconnect();
|
|
65
|
+
}
|
|
66
|
+
await new Promise((r) => setTimeout(r, 500));
|
|
67
|
+
}
|
|
68
|
+
// Clean up on timeout
|
|
69
|
+
try {
|
|
70
|
+
await app.quit();
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// ignore
|
|
74
|
+
}
|
|
75
|
+
throw new Error(`LinkedHelper launcher did not become fully ready on port ${String(port)} within ${String(timeout)}ms`);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Quit LinkedHelper, swallowing errors for cleanup use.
|
|
79
|
+
*/
|
|
80
|
+
export async function quitApp(app) {
|
|
81
|
+
try {
|
|
82
|
+
await app.quit();
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// Swallow errors during cleanup
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Retry an async operation with configurable attempts and delay.
|
|
90
|
+
*
|
|
91
|
+
* Useful in E2E tests where CDP endpoints may be transiently
|
|
92
|
+
* unavailable during the LinkedHelper app lifecycle.
|
|
93
|
+
*/
|
|
94
|
+
export async function retryAsync(fn, options) {
|
|
95
|
+
const retries = options?.retries ?? 3;
|
|
96
|
+
const delay = options?.delay ?? 500;
|
|
97
|
+
let lastError;
|
|
98
|
+
for (let i = 0; i <= retries; i++) {
|
|
99
|
+
try {
|
|
100
|
+
return await fn();
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
lastError = error;
|
|
104
|
+
if (i < retries) {
|
|
105
|
+
await new Promise((r) => setTimeout(r, delay));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
throw lastError;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=e2e-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"e2e-helpers.js","sourceRoot":"","sources":["../../src/testing/e2e-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A LinkedHelper account as stored in the Electron store.
|
|
3
|
+
*
|
|
4
|
+
* Each account corresponds to a LinkedIn identity managed by
|
|
5
|
+
* LinkedHelper and has its own database partition.
|
|
6
|
+
*/
|
|
7
|
+
export interface Account {
|
|
8
|
+
id: number;
|
|
9
|
+
liId: number;
|
|
10
|
+
name: string;
|
|
11
|
+
email?: string | undefined;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=account.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../src/types/account.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account.js","sourceRoot":"","sources":["../../src/types/account.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account.test.d.ts","sourceRoot":"","sources":["../../src/types/account.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
describe("Account type", () => {
|
|
3
|
+
it("should allow constructing a full Account", () => {
|
|
4
|
+
const account = {
|
|
5
|
+
id: 1,
|
|
6
|
+
liId: 363386,
|
|
7
|
+
name: "Test Account",
|
|
8
|
+
email: "test@example.com",
|
|
9
|
+
};
|
|
10
|
+
expect(account.id).toBe(1);
|
|
11
|
+
expect(account.liId).toBe(363386);
|
|
12
|
+
expect(account.name).toBe("Test Account");
|
|
13
|
+
expect(account.email).toBe("test@example.com");
|
|
14
|
+
});
|
|
15
|
+
it("should allow Account without optional email", () => {
|
|
16
|
+
const account = {
|
|
17
|
+
id: 2,
|
|
18
|
+
liId: 100000,
|
|
19
|
+
name: "No Email",
|
|
20
|
+
};
|
|
21
|
+
expect(account.email).toBeUndefined();
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
//# sourceMappingURL=account.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account.test.js","sourceRoot":"","sources":["../../src/types/account.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAG9C,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,OAAO,GAAY;YACvB,EAAE,EAAE,CAAC;YACL,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,kBAAkB;SAC1B,CAAC;QAEF,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,OAAO,GAAY;YACvB,EAAE,EAAE,CAAC;YACL,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,UAAU;SACjB,CAAC;QAEF,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Entry returned by Chrome's HTTP `/json/list` debugging endpoint.
|
|
3
|
+
*
|
|
4
|
+
* This is NOT part of the CDP protocol itself — it's Chrome's proprietary
|
|
5
|
+
* HTTP interface for target discovery. For protocol-level types
|
|
6
|
+
* (Runtime, Page, Target, etc.) use `devtools-protocol` directly.
|
|
7
|
+
*/
|
|
8
|
+
export interface CdpTarget {
|
|
9
|
+
description: string;
|
|
10
|
+
devtoolsFrontendUrl: string;
|
|
11
|
+
id: string;
|
|
12
|
+
title: string;
|
|
13
|
+
type: string;
|
|
14
|
+
url: string;
|
|
15
|
+
/** Missing when another debugger client is already attached. */
|
|
16
|
+
webSocketDebuggerUrl?: string | undefined;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=cdp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdp.d.ts","sourceRoot":"","sources":["../../src/types/cdp.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,gEAAgE;IAChE,oBAAoB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdp.js","sourceRoot":"","sources":["../../src/types/cdp.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdp.test.d.ts","sourceRoot":"","sources":["../../src/types/cdp.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
describe("CDP types", () => {
|
|
3
|
+
it("should allow constructing a CdpTarget with webSocketDebuggerUrl", () => {
|
|
4
|
+
const target = {
|
|
5
|
+
description: "",
|
|
6
|
+
devtoolsFrontendUrl: "/devtools/inspector.html?ws=localhost:9222/devtools/page/ABC123",
|
|
7
|
+
id: "ABC123",
|
|
8
|
+
type: "page",
|
|
9
|
+
title: "LinkedHelper",
|
|
10
|
+
url: "chrome-extension://abc/index.html",
|
|
11
|
+
webSocketDebuggerUrl: "ws://localhost:9222/devtools/page/ABC123",
|
|
12
|
+
};
|
|
13
|
+
expect(target.type).toBe("page");
|
|
14
|
+
expect(target.webSocketDebuggerUrl).toContain("ws://");
|
|
15
|
+
});
|
|
16
|
+
it("should allow CdpTarget without webSocketDebuggerUrl (another client attached)", () => {
|
|
17
|
+
const target = {
|
|
18
|
+
description: "",
|
|
19
|
+
devtoolsFrontendUrl: "/devtools/inspector.html?ws=localhost:9222/devtools/page/DEF456",
|
|
20
|
+
id: "DEF456",
|
|
21
|
+
type: "page",
|
|
22
|
+
title: "LinkedHelper",
|
|
23
|
+
url: "chrome-extension://abc/index.html",
|
|
24
|
+
};
|
|
25
|
+
expect(target.webSocketDebuggerUrl).toBeUndefined();
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
//# sourceMappingURL=cdp.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdp.test.js","sourceRoot":"","sources":["../../src/types/cdp.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAG9C,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,MAAM,GAAc;YACxB,WAAW,EAAE,EAAE;YACf,mBAAmB,EAAE,iEAAiE;YACtF,EAAE,EAAE,QAAQ;YACZ,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,cAAc;YACrB,GAAG,EAAE,mCAAmC;YACxC,oBAAoB,EAAE,0CAA0C;SACjE,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+EAA+E,EAAE,GAAG,EAAE;QACvF,MAAM,MAAM,GAAc;YACxB,WAAW,EAAE,EAAE;YACf,mBAAmB,EAAE,iEAAiE;YACtF,EAAE,EAAE,QAAQ;YACZ,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,cAAc;YACrB,GAAG,EAAE,mCAAmC;SACzC,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,aAAa,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type { CurrentPosition, Education, ExternalId, ExternalIdTypeGroup, MiniProfile, Position, Profile, Skill, } from "./profile.js";
|
|
2
|
+
export type { InstanceInfo, InstanceStatus, StartInstanceParams, StartInstanceResult, } from "./instance.js";
|
|
3
|
+
export type { Account } from "./account.js";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,eAAe,EACf,SAAS,EACT,UAAU,EACV,mBAAmB,EACnB,WAAW,EACX,QAAQ,EACR,OAAO,EACP,KAAK,GACN,MAAM,cAAc,CAAC;AAEtB,YAAY,EACV,YAAY,EACZ,cAAc,EACd,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAEvB,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
|