@lhremote/core 0.10.0 → 0.12.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/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/linkedin/dom-automation-mentions.test.d.ts +2 -0
- package/dist/linkedin/dom-automation-mentions.test.d.ts.map +1 -0
- package/dist/linkedin/dom-automation-mentions.test.js +165 -0
- package/dist/linkedin/dom-automation-mentions.test.js.map +1 -0
- package/dist/linkedin/dom-automation.d.ts +30 -0
- package/dist/linkedin/dom-automation.d.ts.map +1 -1
- package/dist/linkedin/dom-automation.js +147 -0
- package/dist/linkedin/dom-automation.js.map +1 -1
- package/dist/linkedin/index.d.ts +2 -2
- package/dist/linkedin/index.d.ts.map +1 -1
- package/dist/linkedin/index.js +2 -2
- package/dist/linkedin/index.js.map +1 -1
- package/dist/linkedin/selectors.d.ts +27 -0
- package/dist/linkedin/selectors.d.ts.map +1 -1
- package/dist/linkedin/selectors.js +29 -0
- package/dist/linkedin/selectors.js.map +1 -1
- package/dist/operations/comment-on-post.d.ts +17 -0
- package/dist/operations/comment-on-post.d.ts.map +1 -1
- package/dist/operations/comment-on-post.js +48 -9
- package/dist/operations/comment-on-post.js.map +1 -1
- package/dist/operations/comment-on-post.test.js +93 -1
- package/dist/operations/comment-on-post.test.js.map +1 -1
- package/dist/operations/get-post.d.ts.map +1 -1
- package/dist/operations/get-post.js +5 -1
- package/dist/operations/get-post.js.map +1 -1
- package/dist/operations/get-post.test.js +10 -9
- package/dist/operations/get-post.test.js.map +1 -1
- package/dist/operations/react-to-post.d.ts.map +1 -1
- package/dist/operations/react-to-post.js +19 -7
- package/dist/operations/react-to-post.js.map +1 -1
- package/dist/operations/react-to-post.test.js +15 -1
- package/dist/operations/react-to-post.test.js.map +1 -1
- package/dist/services/account-resolution.d.ts +1 -1
- package/dist/services/account-resolution.d.ts.map +1 -1
- package/dist/services/account-resolution.js +13 -9
- package/dist/services/account-resolution.js.map +1 -1
- package/dist/services/account-resolution.test.js +68 -1
- package/dist/services/account-resolution.test.js.map +1 -1
- package/dist/services/index.d.ts +1 -1
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +1 -1
- package/dist/services/index.js.map +1 -1
- package/dist/services/instance-lifecycle.d.ts +9 -0
- package/dist/services/instance-lifecycle.d.ts.map +1 -1
- package/dist/services/instance-lifecycle.js +58 -1
- package/dist/services/instance-lifecycle.js.map +1 -1
- package/dist/services/instance-lifecycle.test.js +111 -2
- package/dist/services/instance-lifecycle.test.js.map +1 -1
- package/dist/testing/e2e-helpers.d.ts +9 -0
- package/dist/testing/e2e-helpers.d.ts.map +1 -1
- package/dist/testing/e2e-helpers.js +14 -0
- package/dist/testing/e2e-helpers.js.map +1 -1
- package/dist/testing/index.d.ts +1 -1
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +1 -1
- package/dist/testing/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import { resolveInstancePort } from "../cdp/index.js";
|
|
4
4
|
import { CDPClient } from "../cdp/client.js";
|
|
5
5
|
import { discoverTargets } from "../cdp/discovery.js";
|
|
6
|
-
import { humanizedClick, humanizedHover, waitForElement } from "../linkedin/dom-automation.js";
|
|
6
|
+
import { humanizedClick, humanizedHover, retryInteraction, waitForDOMStable, waitForElement } from "../linkedin/dom-automation.js";
|
|
7
7
|
import { REACTION_CELEBRATE, REACTION_FUNNY, REACTION_INSIGHTFUL, REACTION_LIKE, REACTION_LOVE, REACTION_SUPPORT, REACTION_TRIGGER, } from "../linkedin/selectors.js";
|
|
8
8
|
import { gaussianDelay } from "../utils/delay.js";
|
|
9
9
|
/** Map from reaction type to its selector in the reactions popup. */
|
|
@@ -118,14 +118,26 @@ export async function reactToPost(input) {
|
|
|
118
118
|
if (currentReaction !== null) {
|
|
119
119
|
// Reacted with a different type — click trigger to unreact first
|
|
120
120
|
await humanizedClick(client, REACTION_TRIGGER, mouse);
|
|
121
|
-
|
|
121
|
+
// Wait for DOM to settle after unreacting — the trigger element
|
|
122
|
+
// gets replaced and its aria-label changes, so hovering too early
|
|
123
|
+
// can target a stale position or miss the new element entirely.
|
|
124
|
+
await waitForDOMStable(client, 300);
|
|
122
125
|
}
|
|
123
|
-
// Hover
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
//
|
|
126
|
+
// Hover the trigger to expand the reactions popup, then wait for
|
|
127
|
+
// the requested reaction button. Wrapped in retryInteraction
|
|
128
|
+
// because the popup may not appear on the first hover attempt
|
|
129
|
+
// (Ember post page can be sluggish).
|
|
130
|
+
//
|
|
131
|
+
// IMPORTANT: waitForElement is called WITHOUT the mouse parameter
|
|
132
|
+
// to disable idle cursor drift during the poll loop. Drift moves
|
|
133
|
+
// the cursor off the trigger, which collapses the hover popup
|
|
134
|
+
// before the reaction button can appear.
|
|
127
135
|
const reactionSelector = REACTION_SELECTORS[reactionType];
|
|
128
|
-
await
|
|
136
|
+
await retryInteraction(async () => {
|
|
137
|
+
await humanizedHover(client, REACTION_TRIGGER, mouse);
|
|
138
|
+
await gaussianDelay(2_000, 300, 1_500, 3_000);
|
|
139
|
+
await waitForElement(client, reactionSelector, { timeout: 10_000 });
|
|
140
|
+
}, 3);
|
|
129
141
|
await humanizedClick(client, reactionSelector, mouse);
|
|
130
142
|
// Let the UI settle
|
|
131
143
|
await gaussianDelay(550, 75, 400, 700);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-to-post.js","sourceRoot":"","sources":["../../src/operations/react-to-post.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"react-to-post.js","sourceRoot":"","sources":["../../src/operations/react-to-post.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,10 +9,12 @@ vi.mock("../cdp/discovery.js", () => ({
|
|
|
9
9
|
}));
|
|
10
10
|
vi.mock("../linkedin/dom-automation.js", () => ({
|
|
11
11
|
waitForElement: vi.fn(),
|
|
12
|
+
waitForDOMStable: vi.fn().mockResolvedValue(undefined),
|
|
12
13
|
hover: vi.fn(),
|
|
13
14
|
click: vi.fn(),
|
|
14
15
|
humanizedHover: vi.fn(),
|
|
15
16
|
humanizedClick: vi.fn(),
|
|
17
|
+
retryInteraction: vi.fn().mockImplementation((fn) => fn()),
|
|
16
18
|
}));
|
|
17
19
|
vi.mock("../utils/delay.js", () => ({
|
|
18
20
|
delay: vi.fn().mockResolvedValue(undefined),
|
|
@@ -20,7 +22,7 @@ vi.mock("../utils/delay.js", () => ({
|
|
|
20
22
|
}));
|
|
21
23
|
import { CDPClient } from "../cdp/client.js";
|
|
22
24
|
import { discoverTargets } from "../cdp/discovery.js";
|
|
23
|
-
import { waitForElement, humanizedHover, humanizedClick } from "../linkedin/dom-automation.js";
|
|
25
|
+
import { waitForElement, humanizedHover, humanizedClick, retryInteraction } from "../linkedin/dom-automation.js";
|
|
24
26
|
import { reactToPost, REACTION_TYPES } from "./react-to-post.js";
|
|
25
27
|
const mockClient = {
|
|
26
28
|
connect: vi.fn().mockResolvedValue(undefined),
|
|
@@ -162,6 +164,18 @@ describe("reactToPost", () => {
|
|
|
162
164
|
});
|
|
163
165
|
expect(humanizedHover).toHaveBeenCalledWith(mockClient, 'button[aria-label^="Reaction button state"], button.react-button__trigger', undefined);
|
|
164
166
|
});
|
|
167
|
+
it("wraps popup wait in retryInteraction without mouse to prevent drift", async () => {
|
|
168
|
+
setupMocks();
|
|
169
|
+
await reactToPost({
|
|
170
|
+
postUrl: "https://www.linkedin.com/feed/update/urn:li:activity:123/",
|
|
171
|
+
reactionType: "insightful",
|
|
172
|
+
cdpPort: 9222,
|
|
173
|
+
});
|
|
174
|
+
// retryInteraction should be called to wrap the hover+wait sequence
|
|
175
|
+
expect(retryInteraction).toHaveBeenCalledWith(expect.any(Function), 3);
|
|
176
|
+
// waitForElement should be called with timeout 10_000 and WITHOUT mouse
|
|
177
|
+
expect(waitForElement).toHaveBeenCalledWith(mockClient, 'button[aria-label="Insightful"], button[aria-label="React Insightful"]', { timeout: 10_000 });
|
|
178
|
+
});
|
|
165
179
|
it("clicks the correct reaction selector for each type", async () => {
|
|
166
180
|
setupMocks();
|
|
167
181
|
await reactToPost({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-to-post.test.js","sourceRoot":"","sources":["../../src/operations/react-to-post.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,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC;IACjC,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;CACnB,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAC,CAAC;IACpC,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE;CACzB,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,+BAA+B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9C,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE;IACvB,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;IACd,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;IACd,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE;IACvB,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"react-to-post.test.js","sourceRoot":"","sources":["../../src/operations/react-to-post.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ import { ServiceError } from "./errors.js";
|
|
|
5
5
|
*/
|
|
6
6
|
export declare class AccountResolutionError extends ServiceError {
|
|
7
7
|
readonly reason: "no-accounts" | "multiple-accounts";
|
|
8
|
-
constructor(reason: "no-accounts" | "multiple-accounts");
|
|
8
|
+
constructor(reason: "no-accounts" | "multiple-accounts", accountIds?: number[]);
|
|
9
9
|
}
|
|
10
10
|
/**
|
|
11
11
|
* Connect to the LinkedHelper launcher, resolve the single account,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account-resolution.d.ts","sourceRoot":"","sources":["../../src/services/account-resolution.ts"],"names":[],"mappings":"AAMA,OAAO,
|
|
1
|
+
{"version":3,"file":"account-resolution.d.ts","sourceRoot":"","sources":["../../src/services/account-resolution.ts"],"names":[],"mappings":"AAMA,OAAO,EAEL,YAAY,EAEb,MAAM,aAAa,CAAC;AAGrB;;;GAGG;AACH,qBAAa,sBAAuB,SAAQ,YAAY;IACtD,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,mBAAmB,CAAC;gBAEzC,MAAM,EAAE,aAAa,GAAG,mBAAmB,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE;CAW/E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,cAAc,CAClC,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GACrE,OAAO,CAAC,MAAM,CAAC,CAiCjB"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
3
|
import { resolveLauncherPort } from "../cdp/index.js";
|
|
4
4
|
import { discoverAllDatabases } from "../db/index.js";
|
|
5
|
-
import { LinkedHelperNotRunningError,
|
|
5
|
+
import { LinkedHelperNotRunningError, ServiceError, WrongPortError, } from "./errors.js";
|
|
6
6
|
import { LauncherService } from "./launcher.js";
|
|
7
7
|
/**
|
|
8
8
|
* Thrown when account resolution fails because no accounts exist,
|
|
@@ -10,10 +10,12 @@ import { LauncherService } from "./launcher.js";
|
|
|
10
10
|
*/
|
|
11
11
|
export class AccountResolutionError extends ServiceError {
|
|
12
12
|
reason;
|
|
13
|
-
constructor(reason) {
|
|
13
|
+
constructor(reason, accountIds) {
|
|
14
14
|
const message = reason === "no-accounts"
|
|
15
15
|
? "No accounts found."
|
|
16
|
-
:
|
|
16
|
+
: accountIds && accountIds.length > 0
|
|
17
|
+
? `Multiple accounts found (${accountIds.join(", ")}). Specify accountId to select one.`
|
|
18
|
+
: "Multiple accounts found. Cannot determine which instance to use.";
|
|
17
19
|
super(message);
|
|
18
20
|
this.name = "AccountResolutionError";
|
|
19
21
|
this.reason = reason;
|
|
@@ -41,12 +43,14 @@ export async function resolveAccount(cdpPort, options) {
|
|
|
41
43
|
port = await resolveLauncherPort(cdpPort, options?.host);
|
|
42
44
|
}
|
|
43
45
|
catch (error) {
|
|
44
|
-
// When cdpPort was omitted and
|
|
45
|
-
//
|
|
46
|
-
//
|
|
46
|
+
// When cdpPort was omitted and no LinkedHelper process exists,
|
|
47
|
+
// fall back to database-based resolution (the "offline" scenario).
|
|
48
|
+
// LinkedHelperUnreachableError is NOT caught here: it means a
|
|
49
|
+
// process exists but CDP failed transiently — propagating it
|
|
50
|
+
// surfaces the real problem instead of masking it behind a
|
|
51
|
+
// misleading "multiple accounts" error from stale databases.
|
|
47
52
|
if (cdpPort === undefined &&
|
|
48
|
-
|
|
49
|
-
error instanceof LinkedHelperNotRunningError)) {
|
|
53
|
+
error instanceof LinkedHelperNotRunningError) {
|
|
50
54
|
return resolveAccountFromDatabases();
|
|
51
55
|
}
|
|
52
56
|
throw error;
|
|
@@ -94,7 +98,7 @@ function resolveAccountFromDatabases() {
|
|
|
94
98
|
throw new AccountResolutionError("no-accounts");
|
|
95
99
|
}
|
|
96
100
|
if (databases.size > 1) {
|
|
97
|
-
throw new AccountResolutionError("multiple-accounts");
|
|
101
|
+
throw new AccountResolutionError("multiple-accounts", [...databases.keys()]);
|
|
98
102
|
}
|
|
99
103
|
// databases.size === 1 is guaranteed by the guards above
|
|
100
104
|
const accountId = databases.keys().next().value;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account-resolution.js","sourceRoot":"","sources":["../../src/services/account-resolution.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEtD,OAAO,EACL,2BAA2B,EAC3B,
|
|
1
|
+
{"version":3,"file":"account-resolution.js","sourceRoot":"","sources":["../../src/services/account-resolution.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,22 @@
|
|
|
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
|
+
vi.mock("../cdp/index.js", () => ({
|
|
5
|
+
resolveLauncherPort: vi.fn(),
|
|
6
|
+
}));
|
|
7
|
+
vi.mock("../db/index.js", () => ({
|
|
8
|
+
discoverAllDatabases: vi.fn(),
|
|
9
|
+
}));
|
|
4
10
|
vi.mock("./launcher.js", () => ({
|
|
5
11
|
LauncherService: vi.fn(),
|
|
6
12
|
}));
|
|
7
|
-
import {
|
|
13
|
+
import { resolveLauncherPort } from "../cdp/index.js";
|
|
14
|
+
import { discoverAllDatabases } from "../db/index.js";
|
|
15
|
+
import { LinkedHelperNotRunningError, LinkedHelperUnreachableError, WrongPortError, } from "./errors.js";
|
|
8
16
|
import { LauncherService } from "./launcher.js";
|
|
9
17
|
import { AccountResolutionError, resolveAccount } from "./account-resolution.js";
|
|
18
|
+
const mockedResolveLauncherPort = vi.mocked(resolveLauncherPort);
|
|
19
|
+
const mockedDiscoverAllDatabases = vi.mocked(discoverAllDatabases);
|
|
10
20
|
const mockedLauncherService = vi.mocked(LauncherService);
|
|
11
21
|
function mockLauncher(overrides = {}) {
|
|
12
22
|
const disconnect = vi.fn();
|
|
@@ -23,10 +33,17 @@ function mockLauncher(overrides = {}) {
|
|
|
23
33
|
describe("resolveAccount", () => {
|
|
24
34
|
beforeEach(() => {
|
|
25
35
|
vi.clearAllMocks();
|
|
36
|
+
mockedResolveLauncherPort.mockResolvedValue(9222);
|
|
37
|
+
mockedDiscoverAllDatabases.mockReturnValue(new Map());
|
|
26
38
|
});
|
|
27
39
|
afterEach(() => {
|
|
28
40
|
vi.restoreAllMocks();
|
|
29
41
|
});
|
|
42
|
+
it("returns explicit accountId without contacting the launcher", async () => {
|
|
43
|
+
const id = await resolveAccount(9222, { accountId: 77 });
|
|
44
|
+
expect(id).toBe(77);
|
|
45
|
+
expect(mockedLauncherService).not.toHaveBeenCalled();
|
|
46
|
+
});
|
|
30
47
|
it("returns the account ID when exactly one account exists", async () => {
|
|
31
48
|
mockLauncher({
|
|
32
49
|
listAccounts: vi.fn().mockResolvedValue([
|
|
@@ -87,5 +104,55 @@ describe("resolveAccount", () => {
|
|
|
87
104
|
await expect(resolveAccount(9222)).rejects.toThrow(LinkedHelperNotRunningError);
|
|
88
105
|
expect(disconnect).toHaveBeenCalledOnce();
|
|
89
106
|
});
|
|
107
|
+
describe("database fallback", () => {
|
|
108
|
+
it("falls back to databases when launcher is not running and cdpPort is omitted", async () => {
|
|
109
|
+
mockedResolveLauncherPort.mockRejectedValue(new LinkedHelperNotRunningError());
|
|
110
|
+
mockedDiscoverAllDatabases.mockReturnValue(new Map([[42, "/path/to/lh.db"]]));
|
|
111
|
+
const id = await resolveAccount();
|
|
112
|
+
expect(id).toBe(42);
|
|
113
|
+
expect(mockedLauncherService).not.toHaveBeenCalled();
|
|
114
|
+
});
|
|
115
|
+
it("does NOT fall back to databases on LinkedHelperUnreachableError", async () => {
|
|
116
|
+
mockedResolveLauncherPort.mockRejectedValue(new LinkedHelperUnreachableError([]));
|
|
117
|
+
await expect(resolveAccount()).rejects.toThrow(LinkedHelperUnreachableError);
|
|
118
|
+
expect(mockedDiscoverAllDatabases).not.toHaveBeenCalled();
|
|
119
|
+
});
|
|
120
|
+
it("propagates LinkedHelperNotRunningError when cdpPort is explicit", async () => {
|
|
121
|
+
mockLauncher({
|
|
122
|
+
connect: vi.fn().mockRejectedValue(new LinkedHelperNotRunningError(9222)),
|
|
123
|
+
});
|
|
124
|
+
await expect(resolveAccount(9222)).rejects.toThrow(LinkedHelperNotRunningError);
|
|
125
|
+
expect(mockedDiscoverAllDatabases).not.toHaveBeenCalled();
|
|
126
|
+
});
|
|
127
|
+
it("falls back to databases on WrongPortError", async () => {
|
|
128
|
+
mockLauncher({
|
|
129
|
+
connect: vi.fn().mockRejectedValue(new WrongPortError(9222)),
|
|
130
|
+
});
|
|
131
|
+
mockedDiscoverAllDatabases.mockReturnValue(new Map([[99, "/path/to/lh.db"]]));
|
|
132
|
+
const id = await resolveAccount(9222);
|
|
133
|
+
expect(id).toBe(99);
|
|
134
|
+
});
|
|
135
|
+
it("throws no-accounts when database fallback finds no databases", async () => {
|
|
136
|
+
mockedResolveLauncherPort.mockRejectedValue(new LinkedHelperNotRunningError());
|
|
137
|
+
mockedDiscoverAllDatabases.mockReturnValue(new Map());
|
|
138
|
+
await expect(resolveAccount()).rejects.toThrow(AccountResolutionError);
|
|
139
|
+
await expect(resolveAccount()).rejects.toMatchObject({
|
|
140
|
+
reason: "no-accounts",
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
it("throws multiple-accounts with IDs when database fallback finds multiple", async () => {
|
|
144
|
+
mockedResolveLauncherPort.mockRejectedValue(new LinkedHelperNotRunningError());
|
|
145
|
+
mockedDiscoverAllDatabases.mockReturnValue(new Map([
|
|
146
|
+
[10996, "/path/10996/lh.db"],
|
|
147
|
+
[363386, "/path/363386/lh.db"],
|
|
148
|
+
[999999, "/path/999999/lh.db"],
|
|
149
|
+
]));
|
|
150
|
+
await expect(resolveAccount()).rejects.toThrow(AccountResolutionError);
|
|
151
|
+
await expect(resolveAccount()).rejects.toMatchObject({
|
|
152
|
+
reason: "multiple-accounts",
|
|
153
|
+
message: expect.stringContaining("10996"),
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
});
|
|
90
157
|
});
|
|
91
158
|
//# sourceMappingURL=account-resolution.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account-resolution.test.js","sourceRoot":"","sources":["../../src/services/account-resolution.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,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9B,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE;CACzB,CAAC,CAAC,CAAC;AAEJ,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"account-resolution.test.js","sourceRoot":"","sources":["../../src/services/account-resolution.test.ts"],"names":[],"mappings":"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"}
|
package/dist/services/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { AppService, type AppServiceOptions } from "./app.js";
|
|
2
2
|
export { InstanceService, type ActionResult, type HealthChecker } from "./instance.js";
|
|
3
|
-
export { startInstanceWithRecovery, waitForInstancePort, waitForInstanceShutdown, type StartInstanceOutcome, } from "./instance-lifecycle.js";
|
|
3
|
+
export { startInstanceWithRecovery, waitForInstancePort, waitForInstanceShutdown, waitForInstanceTargets, type StartInstanceOutcome, } from "./instance-lifecycle.js";
|
|
4
4
|
export { LauncherService } from "./launcher.js";
|
|
5
5
|
export { checkStatus, type AccountInstanceStatus, type DatabaseStatus, type LauncherStatus, type StatusReport, } from "./status.js";
|
|
6
6
|
export { CampaignService } from "./campaign.js";
|
|
@@ -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,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,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,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,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACvG,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EACL,qBAAqB,EACrB,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,2BAA2B,EAC3B,4BAA4B,EAC5B,+BAA+B,EAC/B,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,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,sBAAsB,EACtB,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,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,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,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACvG,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EACL,qBAAqB,EACrB,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,2BAA2B,EAC3B,4BAA4B,EAC5B,+BAA+B,EAC/B,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,cAAc,GACf,MAAM,aAAa,CAAC"}
|
package/dist/services/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
3
|
export { AppService } from "./app.js";
|
|
4
4
|
export { InstanceService } from "./instance.js";
|
|
5
|
-
export { startInstanceWithRecovery, waitForInstancePort, waitForInstanceShutdown, } from "./instance-lifecycle.js";
|
|
5
|
+
export { startInstanceWithRecovery, waitForInstancePort, waitForInstanceShutdown, waitForInstanceTargets, } from "./instance-lifecycle.js";
|
|
6
6
|
export { LauncherService } from "./launcher.js";
|
|
7
7
|
export { checkStatus, } from "./status.js";
|
|
8
8
|
export { CampaignService } from "./campaign.js";
|
|
@@ -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,EAAyC,MAAM,eAAe,CAAC;AACvF,OAAO,EACL,yBAAyB,EACzB,mBAAmB,EACnB,uBAAuB,
|
|
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,EACvB,sBAAsB,GAEvB,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,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EACL,sBAAsB,EACtB,cAAc,GACf,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,YAAY,EACZ,oBAAoB,GAGrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACvG,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EACL,qBAAqB,EACrB,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,2BAA2B,EAC3B,4BAA4B,EAC5B,+BAA+B,EAC/B,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,cAAc,GACf,MAAM,aAAa,CAAC"}
|
|
@@ -35,4 +35,13 @@ export declare function waitForInstancePort(launcherPort: number): Promise<numbe
|
|
|
35
35
|
* before starting a new instance.
|
|
36
36
|
*/
|
|
37
37
|
export declare function waitForInstanceShutdown(launcherPort: number): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Poll until both CDP targets (LinkedIn webview and instance UI) are
|
|
40
|
+
* discoverable on the given port, or timeout.
|
|
41
|
+
*
|
|
42
|
+
* The CDP port may respond to `/json/list` before the instance has
|
|
43
|
+
* created both targets. This function bridges the gap between
|
|
44
|
+
* "process is alive" and "instance is fully initialized".
|
|
45
|
+
*/
|
|
46
|
+
export declare function waitForInstanceTargets(port: number): Promise<boolean>;
|
|
38
47
|
//# sourceMappingURL=instance-lifecycle.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instance-lifecycle.d.ts","sourceRoot":"","sources":["../../src/services/instance-lifecycle.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"instance-lifecycle.d.ts","sourceRoot":"","sources":["../../src/services/instance-lifecycle.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AA+BrD;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAC5B;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,MAAM,EAAE,iBAAiB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC3C;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,CAAC;AAE1B;;;;;;;GAOG;AACH,wBAAsB,yBAAyB,CAC7C,QAAQ,EAAE,eAAe,EACzB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,oBAAoB,CAAC,CA2C/B;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAYxB;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAUf;AAED;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,OAAO,CAAC,CAqBlB"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
2
|
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
|
-
import { discoverInstancePort } from "../cdp/index.js";
|
|
3
|
+
import { CDPConnectionError, discoverInstancePort, discoverTargets } from "../cdp/index.js";
|
|
4
4
|
import { delay } from "../utils/delay.js";
|
|
5
5
|
import { StartInstanceError } from "./errors.js";
|
|
6
6
|
import { InstanceService } from "./instance.js";
|
|
@@ -15,6 +15,16 @@ const PORT_DISCOVERY_TIMEOUT = 45_000;
|
|
|
15
15
|
const PORT_SHUTDOWN_TIMEOUT = 15_000;
|
|
16
16
|
/** Interval between port discovery attempts (ms). */
|
|
17
17
|
const PORT_DISCOVERY_INTERVAL = 1_000;
|
|
18
|
+
/**
|
|
19
|
+
* Maximum time to wait for both CDP targets (LinkedIn webview + UI) to appear (ms).
|
|
20
|
+
*
|
|
21
|
+
* After the CDP port is available, the instance still needs time to create
|
|
22
|
+
* both the LinkedIn webview and the UI target. This timeout mirrors
|
|
23
|
+
* {@link InstanceService.connect}'s `CONNECT_TIMEOUT`.
|
|
24
|
+
*/
|
|
25
|
+
const TARGET_DISCOVERY_TIMEOUT = 30_000;
|
|
26
|
+
/** Interval between target discovery attempts (ms). */
|
|
27
|
+
const TARGET_DISCOVERY_INTERVAL = 1_000;
|
|
18
28
|
/** Delay after crash recovery stop before retrying start (ms). */
|
|
19
29
|
const CRASH_RECOVERY_DELAY = 2_000;
|
|
20
30
|
/**
|
|
@@ -34,6 +44,11 @@ export async function startInstanceWithRecovery(launcher, accountId, launcherPor
|
|
|
34
44
|
error.message.includes("already running")) {
|
|
35
45
|
const existingPort = await discoverInstancePort(launcherPort);
|
|
36
46
|
if (existingPort !== null) {
|
|
47
|
+
const targetsReady = await waitForInstanceTargets(existingPort);
|
|
48
|
+
if (!targetsReady) {
|
|
49
|
+
await checkForStartupPopups(existingPort, accountId);
|
|
50
|
+
return { status: "timeout" };
|
|
51
|
+
}
|
|
37
52
|
await checkForStartupPopups(existingPort, accountId);
|
|
38
53
|
return { status: "already_running", port: existingPort };
|
|
39
54
|
}
|
|
@@ -50,6 +65,13 @@ export async function startInstanceWithRecovery(launcher, accountId, launcherPor
|
|
|
50
65
|
if (port === null) {
|
|
51
66
|
return { status: "timeout" };
|
|
52
67
|
}
|
|
68
|
+
const targetsReady = await waitForInstanceTargets(port);
|
|
69
|
+
if (!targetsReady) {
|
|
70
|
+
// Check for popups before returning a generic timeout — an error popup
|
|
71
|
+
// is more actionable than "failed to initialize within timeout".
|
|
72
|
+
await checkForStartupPopups(port, accountId);
|
|
73
|
+
return { status: "timeout" };
|
|
74
|
+
}
|
|
53
75
|
await checkForStartupPopups(port, accountId);
|
|
54
76
|
return { status: "started", port };
|
|
55
77
|
}
|
|
@@ -87,6 +109,41 @@ export async function waitForInstanceShutdown(launcherPort) {
|
|
|
87
109
|
await delay(PORT_DISCOVERY_INTERVAL);
|
|
88
110
|
}
|
|
89
111
|
}
|
|
112
|
+
/**
|
|
113
|
+
* Poll until both CDP targets (LinkedIn webview and instance UI) are
|
|
114
|
+
* discoverable on the given port, or timeout.
|
|
115
|
+
*
|
|
116
|
+
* The CDP port may respond to `/json/list` before the instance has
|
|
117
|
+
* created both targets. This function bridges the gap between
|
|
118
|
+
* "process is alive" and "instance is fully initialized".
|
|
119
|
+
*/
|
|
120
|
+
export async function waitForInstanceTargets(port) {
|
|
121
|
+
const deadline = Date.now() + TARGET_DISCOVERY_TIMEOUT;
|
|
122
|
+
while (Date.now() < deadline) {
|
|
123
|
+
try {
|
|
124
|
+
const targets = await discoverTargets(port);
|
|
125
|
+
const hasLinkedIn = targets.some(isLinkedInTarget);
|
|
126
|
+
const hasUI = targets.some(isUiTarget);
|
|
127
|
+
if (hasLinkedIn && hasUI) {
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
if (!(error instanceof CDPConnectionError)) {
|
|
133
|
+
throw error;
|
|
134
|
+
}
|
|
135
|
+
// CDP endpoint not ready yet — retry
|
|
136
|
+
}
|
|
137
|
+
await delay(TARGET_DISCOVERY_INTERVAL);
|
|
138
|
+
}
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
function isLinkedInTarget(target) {
|
|
142
|
+
return target.type === "page" && target.url.includes("linkedin.com");
|
|
143
|
+
}
|
|
144
|
+
function isUiTarget(target) {
|
|
145
|
+
return target.type === "page" && target.url.includes("index.html");
|
|
146
|
+
}
|
|
90
147
|
/**
|
|
91
148
|
* Connect to the instance UI and check for error popups.
|
|
92
149
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instance-lifecycle.js","sourceRoot":"","sources":["../../src/services/instance-lifecycle.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"instance-lifecycle.js","sourceRoot":"","sources":["../../src/services/instance-lifecycle.ts"],"names":[],"mappings":"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"}
|