@lhremote/core 0.9.0 → 0.10.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/db/repositories/campaign-hard-delete.integration.test.js +4 -1
- package/dist/db/repositories/campaign-hard-delete.integration.test.js.map +1 -1
- package/dist/db/repositories/campaign.d.ts.map +1 -1
- package/dist/db/repositories/campaign.js +81 -33
- package/dist/db/repositories/campaign.js.map +1 -1
- package/dist/db/repositories/campaign.test.js +2 -2
- package/dist/db/repositories/collection-list.d.ts +11 -0
- package/dist/db/repositories/collection-list.d.ts.map +1 -1
- package/dist/db/repositories/collection-list.js +92 -2
- package/dist/db/repositories/collection-list.js.map +1 -1
- package/dist/db/testing/create-fixture.js +36 -2
- package/dist/db/testing/create-fixture.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/linkedin/dom-automation.d.ts +9 -6
- package/dist/linkedin/dom-automation.d.ts.map +1 -1
- package/dist/linkedin/dom-automation.js +20 -20
- package/dist/linkedin/dom-automation.js.map +1 -1
- package/dist/linkedin/index.d.ts +1 -1
- package/dist/linkedin/index.d.ts.map +1 -1
- package/dist/linkedin/index.js +1 -1
- package/dist/linkedin/index.js.map +1 -1
- package/dist/linkedin/selectors.d.ts +74 -48
- package/dist/linkedin/selectors.d.ts.map +1 -1
- package/dist/linkedin/selectors.js +64 -41
- package/dist/linkedin/selectors.js.map +1 -1
- package/dist/operations/check-replies.d.ts.map +1 -1
- package/dist/operations/check-replies.js +7 -15
- package/dist/operations/check-replies.js.map +1 -1
- package/dist/operations/check-replies.test.js +1 -26
- package/dist/operations/check-replies.test.js.map +1 -1
- package/dist/operations/collect-people.d.ts.map +1 -1
- package/dist/operations/collect-people.js +15 -6
- package/dist/operations/collect-people.js.map +1 -1
- package/dist/operations/collect-people.test.js +21 -5
- package/dist/operations/collect-people.test.js.map +1 -1
- package/dist/operations/create-collection.d.ts.map +1 -1
- package/dist/operations/create-collection.js +2 -1
- package/dist/operations/create-collection.js.map +1 -1
- package/dist/operations/create-collection.test.js +3 -1
- package/dist/operations/create-collection.test.js.map +1 -1
- package/dist/operations/dismiss-errors.d.ts +4 -1
- package/dist/operations/dismiss-errors.d.ts.map +1 -1
- package/dist/operations/dismiss-errors.js +16 -1
- package/dist/operations/dismiss-errors.js.map +1 -1
- package/dist/operations/dismiss-errors.test.js +76 -2
- package/dist/operations/dismiss-errors.test.js.map +1 -1
- package/dist/operations/ephemeral-action.d.ts +1 -0
- package/dist/operations/ephemeral-action.d.ts.map +1 -1
- package/dist/operations/ephemeral-action.js +2 -1
- package/dist/operations/ephemeral-action.js.map +1 -1
- package/dist/operations/ephemeral-action.test.js +20 -1
- package/dist/operations/ephemeral-action.test.js.map +1 -1
- package/dist/operations/react-to-post.d.ts +13 -4
- package/dist/operations/react-to-post.d.ts.map +1 -1
- package/dist/operations/react-to-post.js +74 -10
- package/dist/operations/react-to-post.js.map +1 -1
- package/dist/operations/react-to-post.test.js +49 -2
- package/dist/operations/react-to-post.test.js.map +1 -1
- package/dist/operations/scrape-messaging-history.d.ts.map +1 -1
- package/dist/operations/scrape-messaging-history.js +7 -15
- package/dist/operations/scrape-messaging-history.js.map +1 -1
- package/dist/operations/scrape-messaging-history.test.js +1 -26
- package/dist/operations/scrape-messaging-history.test.js.map +1 -1
- package/dist/operations/types.d.ts +3 -0
- package/dist/operations/types.d.ts.map +1 -1
- package/dist/operations/types.js +1 -0
- package/dist/operations/types.js.map +1 -1
- package/dist/services/account-resolution.d.ts +1 -0
- package/dist/services/account-resolution.d.ts.map +1 -1
- package/dist/services/account-resolution.js +3 -0
- package/dist/services/account-resolution.js.map +1 -1
- package/dist/services/campaign.d.ts +7 -3
- package/dist/services/campaign.d.ts.map +1 -1
- package/dist/services/campaign.js +73 -14
- package/dist/services/campaign.js.map +1 -1
- package/dist/services/campaign.test.js +53 -15
- package/dist/services/campaign.test.js.map +1 -1
- package/dist/services/collection.d.ts +16 -21
- package/dist/services/collection.d.ts.map +1 -1
- package/dist/services/collection.js +34 -47
- package/dist/services/collection.js.map +1 -1
- package/dist/services/collection.test.js +30 -91
- package/dist/services/collection.test.js.map +1 -1
- package/dist/services/ephemeral-campaign.d.ts +6 -0
- package/dist/services/ephemeral-campaign.d.ts.map +1 -1
- package/dist/services/ephemeral-campaign.js +54 -10
- package/dist/services/ephemeral-campaign.js.map +1 -1
- package/dist/services/ephemeral-campaign.test.js +23 -10
- package/dist/services/ephemeral-campaign.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.d.ts +18 -2
- package/dist/services/instance.d.ts.map +1 -1
- package/dist/services/instance.js +44 -8
- package/dist/services/instance.js.map +1 -1
- package/dist/services/instance.test.js +92 -0
- package/dist/services/instance.test.js.map +1 -1
- package/dist/services/source-type-registry.d.ts +8 -0
- package/dist/services/source-type-registry.d.ts.map +1 -1
- package/dist/services/source-type-registry.js +39 -0
- package/dist/services/source-type-registry.js.map +1 -1
- package/dist/services/source-type-registry.test.js +31 -1
- package/dist/services/source-type-registry.test.js.map +1 -1
- package/dist/testing/e2e-helpers.d.ts +24 -0
- package/dist/testing/e2e-helpers.d.ts.map +1 -1
- package/dist/testing/e2e-helpers.js +135 -3
- 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/dist/types/campaign.d.ts +1 -1
- package/dist/types/campaign.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
3
|
import { delay } from "../utils/delay.js";
|
|
4
4
|
import { errorMessage } from "../utils/error-message.js";
|
|
5
|
-
import { detectSourceType } from "./source-type-registry.js";
|
|
5
|
+
import { detectSourceType, toInternalSourceType } from "./source-type-registry.js";
|
|
6
6
|
import { CollectionBusyError, CollectionError } from "./errors.js";
|
|
7
7
|
/** Timeout for polling `canCollect` after navigation (ms). */
|
|
8
8
|
const CAN_COLLECT_TIMEOUT = 10_000;
|
|
@@ -27,8 +27,9 @@ export class CollectionService {
|
|
|
27
27
|
* Initiate people collection from a LinkedIn source URL.
|
|
28
28
|
*
|
|
29
29
|
* Validates that the source URL is a recognized LinkedIn page type,
|
|
30
|
-
* ensures the instance is idle,
|
|
31
|
-
*
|
|
30
|
+
* ensures the instance is idle, navigates to the URL, verifies the
|
|
31
|
+
* page is recognized, then drives the LinkedHelper state machine
|
|
32
|
+
* through its Redux saga to start collection.
|
|
32
33
|
*
|
|
33
34
|
* Returns immediately after initiating collection — the actual
|
|
34
35
|
* collection runs asynchronously in LinkedHelper. Poll the runner
|
|
@@ -41,7 +42,7 @@ export class CollectionService {
|
|
|
41
42
|
* or the CDP calls fail.
|
|
42
43
|
* @throws {CollectionBusyError} if the instance is not idle.
|
|
43
44
|
*/
|
|
44
|
-
async collect(sourceUrl,
|
|
45
|
+
async collect(sourceUrl, campaignId, actionId) {
|
|
45
46
|
const sourceType = detectSourceType(sourceUrl);
|
|
46
47
|
if (!sourceType) {
|
|
47
48
|
throw new CollectionError(`Unrecognized source URL: ${sourceUrl} — cannot determine LinkedIn page type`);
|
|
@@ -58,16 +59,7 @@ export class CollectionService {
|
|
|
58
59
|
}
|
|
59
60
|
await this.assertCanCollect(sourceType);
|
|
60
61
|
try {
|
|
61
|
-
await this.
|
|
62
|
-
}
|
|
63
|
-
catch (error) {
|
|
64
|
-
if (error instanceof CollectionError)
|
|
65
|
-
throw error;
|
|
66
|
-
const message = errorMessage(error);
|
|
67
|
-
throw new CollectionError(`Failed to prepare collection for ${sourceType}: ${message}`, { cause: error });
|
|
68
|
-
}
|
|
69
|
-
try {
|
|
70
|
-
await this.startCollecting(options);
|
|
62
|
+
await this.startCollecting(sourceType, campaignId, actionId);
|
|
71
63
|
}
|
|
72
64
|
catch (error) {
|
|
73
65
|
if (error instanceof CollectionError)
|
|
@@ -83,9 +75,10 @@ export class CollectionService {
|
|
|
83
75
|
* LinkedHelper browser is currently on a matching source page.
|
|
84
76
|
*/
|
|
85
77
|
async canCollect(sourceType) {
|
|
78
|
+
const internalType = toInternalSourceType(sourceType);
|
|
86
79
|
return this.instance.evaluateUI(`(async () => {
|
|
87
80
|
const mws = window.mainWindowService;
|
|
88
|
-
return await mws.call('canCollect', ${JSON.stringify(
|
|
81
|
+
return await mws.call('canCollect', ${JSON.stringify(internalType)});
|
|
89
82
|
})()`);
|
|
90
83
|
}
|
|
91
84
|
/**
|
|
@@ -131,43 +124,37 @@ export class CollectionService {
|
|
|
131
124
|
throw new CollectionError(`Cannot collect from ${sourceType} — the LinkedIn browser is not on a matching page (polled for ${String(elapsed)}ms)`);
|
|
132
125
|
}
|
|
133
126
|
/**
|
|
134
|
-
* Call `
|
|
135
|
-
*
|
|
127
|
+
* Call `collect` on the main process with the correct two-argument
|
|
128
|
+
* signature discovered from LinkedHelper's renderer source:
|
|
136
129
|
*
|
|
137
|
-
*
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
if (!result) {
|
|
148
|
-
throw new CollectionError(`prepareCollecting returned false for ${sourceType} — state machine did not transition`);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Call `collect` to start the actual collection process.
|
|
130
|
+
* ```
|
|
131
|
+
* mainWindowService.call("collect", sourceType, {
|
|
132
|
+
* campaignId, actionId, target, withoutScraping
|
|
133
|
+
* })
|
|
134
|
+
* ```
|
|
135
|
+
*
|
|
136
|
+
* The main process `collect` method expects the source type as the
|
|
137
|
+
* first argument and a config object as the second. The config must
|
|
138
|
+
* include `actionId` (the campaign action to collect into) and
|
|
139
|
+
* `target` (the collection target type).
|
|
153
140
|
*
|
|
154
141
|
* @throws {CollectionError} if the call returns `false`.
|
|
155
142
|
*/
|
|
156
|
-
async startCollecting(
|
|
157
|
-
const
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
143
|
+
async startCollecting(sourceType, campaignId, actionId) {
|
|
144
|
+
const internalType = toInternalSourceType(sourceType);
|
|
145
|
+
const config = {
|
|
146
|
+
campaignId,
|
|
147
|
+
actionId,
|
|
148
|
+
target: "target",
|
|
149
|
+
};
|
|
150
|
+
// Fire-and-forget: the collect IPC method blocks until collection
|
|
151
|
+
// finishes (which can take minutes). We start it without awaiting
|
|
152
|
+
// the result — callers poll getRunnerState() for progress.
|
|
153
|
+
await this.instance.evaluateUI(`(() => {
|
|
165
154
|
const mws = window.mainWindowService;
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
throw new CollectionError("collect returned false — state machine was not in collecting state");
|
|
170
|
-
}
|
|
155
|
+
mws.call('collect', ${JSON.stringify(internalType)}, ${JSON.stringify(config)});
|
|
156
|
+
return true;
|
|
157
|
+
})()`, false);
|
|
171
158
|
}
|
|
172
159
|
}
|
|
173
160
|
//# sourceMappingURL=collection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collection.js","sourceRoot":"","sources":["../../src/services/collection.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAIpC,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"collection.js","sourceRoot":"","sources":["../../src/services/collection.ts"],"names":[],"mappings":"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"}
|
|
@@ -32,71 +32,49 @@ describe("CollectionService", () => {
|
|
|
32
32
|
mockEvaluateUI
|
|
33
33
|
.mockResolvedValueOnce("idle") // getRunnerState
|
|
34
34
|
.mockResolvedValueOnce(true) // canCollect
|
|
35
|
-
.mockResolvedValueOnce(true) // prepareCollecting
|
|
36
35
|
.mockResolvedValueOnce(true); // collect
|
|
37
|
-
await service.collect(SEARCH_URL, 1);
|
|
36
|
+
await service.collect(SEARCH_URL, 1, 10);
|
|
38
37
|
// Navigation via LinkedIn webview
|
|
39
38
|
expect(mockNavigateLinkedIn).toHaveBeenCalledWith(SEARCH_URL);
|
|
40
|
-
expect(mockEvaluateUI).toHaveBeenCalledTimes(
|
|
39
|
+
expect(mockEvaluateUI).toHaveBeenCalledTimes(3);
|
|
41
40
|
// 1. Runner state check
|
|
42
41
|
const stateExpr = mockEvaluateUI.mock.calls[0]?.[0];
|
|
43
42
|
expect(stateExpr).toContain("mainWindowService.mainWindow.state");
|
|
44
|
-
// 2. canCollect
|
|
43
|
+
// 2. canCollect — uses internal kebab-case type
|
|
45
44
|
const canCollectExpr = mockEvaluateUI.mock.calls[1]?.[0];
|
|
46
45
|
expect(canCollectExpr).toContain("canCollect");
|
|
47
|
-
expect(canCollectExpr).toContain("
|
|
48
|
-
// 3.
|
|
49
|
-
const
|
|
50
|
-
expect(prepareExpr).toContain("prepareCollecting");
|
|
51
|
-
expect(prepareExpr).toContain("SearchPage");
|
|
52
|
-
expect(prepareExpr).toContain("AutoCollectPeople");
|
|
53
|
-
// 4. collect
|
|
54
|
-
const collectExpr = mockEvaluateUI.mock.calls[3]?.[0];
|
|
46
|
+
expect(canCollectExpr).toContain("search-page");
|
|
47
|
+
// 3. collect — uses internal kebab-case type as first arg, config as second
|
|
48
|
+
const collectExpr = mockEvaluateUI.mock.calls[2]?.[0];
|
|
55
49
|
expect(collectExpr).toContain("mws.call('collect'");
|
|
50
|
+
expect(collectExpr).toContain("search-page");
|
|
51
|
+
expect(collectExpr).toContain('"campaignId":1');
|
|
52
|
+
expect(collectExpr).toContain('"actionId":10');
|
|
56
53
|
});
|
|
57
|
-
it("passes
|
|
54
|
+
it("passes actionId and target in collect config", async () => {
|
|
58
55
|
mockEvaluateUI
|
|
59
56
|
.mockResolvedValueOnce("idle")
|
|
60
57
|
.mockResolvedValueOnce(true)
|
|
61
|
-
.mockResolvedValueOnce(true)
|
|
62
|
-
.mockResolvedValueOnce(true);
|
|
63
|
-
await service.collect(SEARCH_URL, 1, {
|
|
64
|
-
limit: 100,
|
|
65
|
-
maxPages: 5,
|
|
66
|
-
pageSize: 25,
|
|
67
|
-
});
|
|
68
|
-
const collectExpr = mockEvaluateUI.mock.calls[3]?.[0];
|
|
69
|
-
expect(collectExpr).toContain('"limit":100');
|
|
70
|
-
expect(collectExpr).toContain('"maxPages":5');
|
|
71
|
-
expect(collectExpr).toContain('"pageSize":25');
|
|
72
|
-
});
|
|
73
|
-
it("omits undefined options from collect call", async () => {
|
|
74
|
-
mockEvaluateUI
|
|
75
|
-
.mockResolvedValueOnce("idle")
|
|
76
|
-
.mockResolvedValueOnce(true)
|
|
77
|
-
.mockResolvedValueOnce(true)
|
|
78
58
|
.mockResolvedValueOnce(true);
|
|
79
|
-
await service.collect(SEARCH_URL, 1,
|
|
80
|
-
const collectExpr = mockEvaluateUI.mock.calls[
|
|
81
|
-
expect(collectExpr).toContain('"
|
|
82
|
-
expect(collectExpr).
|
|
83
|
-
expect(collectExpr).not.toContain("pageSize");
|
|
59
|
+
await service.collect(SEARCH_URL, 1, 10);
|
|
60
|
+
const collectExpr = mockEvaluateUI.mock.calls[2]?.[0];
|
|
61
|
+
expect(collectExpr).toContain('"actionId":10');
|
|
62
|
+
expect(collectExpr).toContain('"target":"target"');
|
|
84
63
|
});
|
|
85
64
|
it("detects OrganizationPeople source type from company URL", async () => {
|
|
86
65
|
mockEvaluateUI
|
|
87
66
|
.mockResolvedValueOnce("idle")
|
|
88
67
|
.mockResolvedValueOnce(true)
|
|
89
|
-
.mockResolvedValueOnce(true)
|
|
90
68
|
.mockResolvedValueOnce(true);
|
|
91
|
-
await service.collect(ORG_PEOPLE_URL, 1);
|
|
69
|
+
await service.collect(ORG_PEOPLE_URL, 1, 10);
|
|
92
70
|
const canCollectExpr = mockEvaluateUI.mock.calls[1]?.[0];
|
|
93
|
-
expect(canCollectExpr).toContain("
|
|
94
|
-
const
|
|
95
|
-
expect(
|
|
71
|
+
expect(canCollectExpr).toContain("organization-people");
|
|
72
|
+
const collectExpr = mockEvaluateUI.mock.calls[2]?.[0];
|
|
73
|
+
expect(collectExpr).toContain("organization-people");
|
|
96
74
|
});
|
|
97
75
|
it("throws CollectionError for unrecognized source URL", async () => {
|
|
98
76
|
const error = await service
|
|
99
|
-
.collect("https://www.linkedin.com/feed/", 1)
|
|
77
|
+
.collect("https://www.linkedin.com/feed/", 1, 10)
|
|
100
78
|
.catch((e) => e);
|
|
101
79
|
expect(error).toBeInstanceOf(CollectionError);
|
|
102
80
|
expect(error.message).toContain("Unrecognized source URL");
|
|
@@ -105,14 +83,14 @@ describe("CollectionService", () => {
|
|
|
105
83
|
});
|
|
106
84
|
it("throws CollectionBusyError when runner is not idle", async () => {
|
|
107
85
|
mockEvaluateUI.mockResolvedValueOnce("campaigns");
|
|
108
|
-
await expect(service.collect(SEARCH_URL, 1)).rejects.toThrow(CollectionBusyError);
|
|
86
|
+
await expect(service.collect(SEARCH_URL, 1, 10)).rejects.toThrow(CollectionBusyError);
|
|
109
87
|
// Only the runner state check should be made
|
|
110
88
|
expect(mockEvaluateUI).toHaveBeenCalledTimes(1);
|
|
111
89
|
});
|
|
112
90
|
it("includes runner state in CollectionBusyError", async () => {
|
|
113
91
|
mockEvaluateUI.mockResolvedValueOnce("campaigns");
|
|
114
92
|
try {
|
|
115
|
-
await service.collect(SEARCH_URL, 1);
|
|
93
|
+
await service.collect(SEARCH_URL, 1, 10);
|
|
116
94
|
expect.unreachable("should have thrown");
|
|
117
95
|
}
|
|
118
96
|
catch (error) {
|
|
@@ -133,28 +111,24 @@ describe("CollectionService", () => {
|
|
|
133
111
|
.mockResolvedValueOnce(false) // canCollect attempt 1
|
|
134
112
|
.mockResolvedValueOnce(false) // canCollect attempt 2
|
|
135
113
|
.mockResolvedValueOnce(true) // canCollect attempt 3 — success
|
|
136
|
-
.mockResolvedValueOnce(true) // prepareCollecting
|
|
137
114
|
.mockResolvedValueOnce(true); // collect
|
|
138
|
-
const promise = service.collect(SEARCH_URL, 1);
|
|
115
|
+
const promise = service.collect(SEARCH_URL, 1, 10);
|
|
139
116
|
await vi.advanceTimersByTimeAsync(2000);
|
|
140
117
|
await promise;
|
|
141
118
|
// canCollect was called 3 times before success
|
|
142
|
-
const canCollectCalls = mockEvaluateUI.mock.calls.filter((call) => call[0].includes("canCollect")
|
|
143
|
-
!call[0].includes("prepareCollecting"));
|
|
119
|
+
const canCollectCalls = mockEvaluateUI.mock.calls.filter((call) => call[0].includes("canCollect"));
|
|
144
120
|
expect(canCollectCalls).toHaveLength(3);
|
|
145
121
|
});
|
|
146
122
|
it("succeeds on first canCollect check without polling delay", async () => {
|
|
147
123
|
mockEvaluateUI
|
|
148
124
|
.mockResolvedValueOnce("idle") // getRunnerState
|
|
149
125
|
.mockResolvedValueOnce(true) // canCollect — immediate success
|
|
150
|
-
.mockResolvedValueOnce(true) // prepareCollecting
|
|
151
126
|
.mockResolvedValueOnce(true); // collect
|
|
152
|
-
const promise = service.collect(SEARCH_URL, 1);
|
|
127
|
+
const promise = service.collect(SEARCH_URL, 1, 10);
|
|
153
128
|
await vi.advanceTimersByTimeAsync(0);
|
|
154
129
|
await promise;
|
|
155
130
|
// Only 1 canCollect call — no polling needed
|
|
156
|
-
const canCollectCalls = mockEvaluateUI.mock.calls.filter((call) => call[0].includes("canCollect")
|
|
157
|
-
!call[0].includes("prepareCollecting"));
|
|
131
|
+
const canCollectCalls = mockEvaluateUI.mock.calls.filter((call) => call[0].includes("canCollect"));
|
|
158
132
|
expect(canCollectCalls).toHaveLength(1);
|
|
159
133
|
});
|
|
160
134
|
it("throws CollectionError after polling timeout with elapsed time", async () => {
|
|
@@ -162,7 +136,7 @@ describe("CollectionService", () => {
|
|
|
162
136
|
.mockResolvedValueOnce("idle") // getRunnerState
|
|
163
137
|
.mockResolvedValue(false); // canCollect always returns false
|
|
164
138
|
// Attach catch before advancing timers to avoid unhandled rejection
|
|
165
|
-
const errorPromise = service.collect(SEARCH_URL, 1).catch((e) => e);
|
|
139
|
+
const errorPromise = service.collect(SEARCH_URL, 1, 10).catch((e) => e);
|
|
166
140
|
await vi.advanceTimersByTimeAsync(11_000);
|
|
167
141
|
const error = await errorPromise;
|
|
168
142
|
expect(error).toBeInstanceOf(CollectionError);
|
|
@@ -175,67 +149,32 @@ describe("CollectionService", () => {
|
|
|
175
149
|
it("throws CollectionError when navigation fails", async () => {
|
|
176
150
|
mockEvaluateUI.mockResolvedValueOnce("idle"); // getRunnerState
|
|
177
151
|
mockNavigateLinkedIn.mockRejectedValueOnce(new Error("Page.navigate timeout"));
|
|
178
|
-
const error = await service.collect(SEARCH_URL, 1).catch((e) => e);
|
|
152
|
+
const error = await service.collect(SEARCH_URL, 1, 10).catch((e) => e);
|
|
179
153
|
expect(error).toBeInstanceOf(CollectionError);
|
|
180
154
|
expect(error.message).toContain("Failed to navigate to source URL");
|
|
181
155
|
expect(error.cause).toBeInstanceOf(Error);
|
|
182
156
|
// canCollect should not be called after navigation failure
|
|
183
157
|
expect(mockEvaluateUI).toHaveBeenCalledTimes(1);
|
|
184
158
|
});
|
|
185
|
-
it("throws CollectionError when prepareCollecting returns false", async () => {
|
|
186
|
-
mockEvaluateUI
|
|
187
|
-
.mockResolvedValueOnce("idle")
|
|
188
|
-
.mockResolvedValueOnce(true)
|
|
189
|
-
.mockResolvedValueOnce(false); // prepareCollecting returns false
|
|
190
|
-
await expect(service.collect(SEARCH_URL, 1)).rejects.toThrow(CollectionError);
|
|
191
|
-
});
|
|
192
|
-
it("throws CollectionError when collect returns false", async () => {
|
|
193
|
-
mockEvaluateUI
|
|
194
|
-
.mockResolvedValueOnce("idle")
|
|
195
|
-
.mockResolvedValueOnce(true)
|
|
196
|
-
.mockResolvedValueOnce(true)
|
|
197
|
-
.mockResolvedValueOnce(false); // collect returns false
|
|
198
|
-
await expect(service.collect(SEARCH_URL, 1)).rejects.toThrow(CollectionError);
|
|
199
|
-
});
|
|
200
|
-
it("wraps CDP errors in CollectionError for prepareCollecting", async () => {
|
|
201
|
-
mockEvaluateUI
|
|
202
|
-
.mockResolvedValueOnce("idle")
|
|
203
|
-
.mockResolvedValueOnce(true)
|
|
204
|
-
.mockRejectedValueOnce(new Error("CDP timeout"));
|
|
205
|
-
const error = await service.collect(SEARCH_URL, 1).catch((e) => e);
|
|
206
|
-
expect(error).toBeInstanceOf(CollectionError);
|
|
207
|
-
expect(error.message).toContain("Failed to prepare collection");
|
|
208
|
-
expect(error.cause).toBeInstanceOf(Error);
|
|
209
|
-
});
|
|
210
159
|
it("wraps CDP errors in CollectionError for collect", async () => {
|
|
211
160
|
mockEvaluateUI
|
|
212
161
|
.mockResolvedValueOnce("idle")
|
|
213
162
|
.mockResolvedValueOnce(true)
|
|
214
|
-
.mockResolvedValueOnce(true)
|
|
215
163
|
.mockRejectedValueOnce(new Error("CDP timeout"));
|
|
216
|
-
const error = await service.collect(SEARCH_URL, 1).catch((e) => e);
|
|
164
|
+
const error = await service.collect(SEARCH_URL, 1, 10).catch((e) => e);
|
|
217
165
|
expect(error).toBeInstanceOf(CollectionError);
|
|
218
166
|
expect(error.message).toContain("Failed to start collection");
|
|
219
167
|
expect(error.cause).toBeInstanceOf(Error);
|
|
220
168
|
});
|
|
221
|
-
it("does not wrap CollectionError from prepareCollecting", async () => {
|
|
222
|
-
mockEvaluateUI
|
|
223
|
-
.mockResolvedValueOnce("idle")
|
|
224
|
-
.mockResolvedValueOnce(true)
|
|
225
|
-
.mockResolvedValueOnce(false); // triggers CollectionError inside prepareCollecting
|
|
226
|
-
const error = await service.collect(SEARCH_URL, 1).catch((e) => e);
|
|
227
|
-
expect(error).toBeInstanceOf(CollectionError);
|
|
228
|
-
expect(error.message).toContain("prepareCollecting returned false");
|
|
229
|
-
});
|
|
230
169
|
});
|
|
231
170
|
describe("canCollect", () => {
|
|
232
|
-
it("calls canCollect IPC method via CDP", async () => {
|
|
171
|
+
it("calls canCollect IPC method via CDP with internal kebab-case type", async () => {
|
|
233
172
|
mockEvaluateUI.mockResolvedValueOnce(true);
|
|
234
173
|
const result = await service.canCollect("SearchPage");
|
|
235
174
|
expect(result).toBe(true);
|
|
236
175
|
const expr = mockEvaluateUI.mock.calls[0]?.[0];
|
|
237
176
|
expect(expr).toContain("canCollect");
|
|
238
|
-
expect(expr).toContain("
|
|
177
|
+
expect(expr).toContain("search-page");
|
|
239
178
|
});
|
|
240
179
|
it("returns false when LinkedHelper reports false", async () => {
|
|
241
180
|
mockEvaluateUI.mockResolvedValueOnce(false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collection.test.js","sourceRoot":"","sources":["../../src/services/collection.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"collection.test.js","sourceRoot":"","sources":["../../src/services/collection.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,7 @@ import type { InstanceService } from "./instance.js";
|
|
|
11
11
|
* if `keepCampaign: true`).
|
|
12
12
|
*/
|
|
13
13
|
export declare class EphemeralCampaignService {
|
|
14
|
+
private readonly instance;
|
|
14
15
|
private readonly campaignService;
|
|
15
16
|
private readonly profileRepo;
|
|
16
17
|
constructor(instance: InstanceService, db: DatabaseClient);
|
|
@@ -44,6 +45,11 @@ export declare class EphemeralCampaignService {
|
|
|
44
45
|
* Poll campaign status until the target person's action completes or times out.
|
|
45
46
|
*/
|
|
46
47
|
private pollForCompletion;
|
|
48
|
+
/**
|
|
49
|
+
* Run an async operation, automatically dismissing UI popups on
|
|
50
|
+
* {@link UIBlockedError} and retrying up to 3 times.
|
|
51
|
+
*/
|
|
52
|
+
private dismissAndRetry;
|
|
47
53
|
/**
|
|
48
54
|
* Stop and remove/archive an ephemeral campaign (best-effort).
|
|
49
55
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ephemeral-campaign.d.ts","sourceRoot":"","sources":["../../src/services/ephemeral-campaign.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,uBAAuB,EACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAarD;;;;;;;;GAQG;AACH,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoB;gBAEpC,QAAQ,EAAE,eAAe,EAAE,EAAE,EAAE,cAAc;
|
|
1
|
+
{"version":3,"file":"ephemeral-campaign.d.ts","sourceRoot":"","sources":["../../src/services/ephemeral-campaign.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,uBAAuB,EACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAarD;;;;;;;;GAQG;AACH,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoB;gBAEpC,QAAQ,EAAE,eAAe,EAAE,EAAE,EAAE,cAAc;IAMzD;;;;;;;;;;;;OAYG;IACG,OAAO,CACX,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,cAAc,CAAC,EAAE,cAAc,EAC/B,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,qBAAqB,CAAC;IA0EjC;;OAEG;IACH,OAAO,CAAC,aAAa;IAqCrB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAc9B;;OAEG;IACH,OAAO,CAAC,WAAW;IAUnB;;OAEG;YACW,iBAAiB;IA+C/B;;;OAGG;YACW,eAAe;IAgB7B;;OAEG;YACW,OAAO;IAUrB;;OAEG;YACW,QAAQ;IAQtB;;OAEG;YACW,WAAW;IAQzB;;OAEG;IACH,OAAO,CAAC,cAAc;CAOvB"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import { ProfileRepository } from "../db/index.js";
|
|
4
4
|
import { delay } from "../utils/delay.js";
|
|
5
5
|
import { CampaignService } from "./campaign.js";
|
|
6
|
-
import { CampaignExecutionError, CampaignTimeoutError } from "./errors.js";
|
|
6
|
+
import { CampaignExecutionError, CampaignTimeoutError, UIBlockedError } from "./errors.js";
|
|
7
7
|
/** Default timeout for ephemeral action execution (5 minutes). */
|
|
8
8
|
const DEFAULT_TIMEOUT = 300_000;
|
|
9
9
|
/** Default interval between status polls (2 seconds). */
|
|
@@ -20,9 +20,11 @@ const CAMPAIGN_NAME_PREFIX = "[ephemeral]";
|
|
|
20
20
|
* if `keepCampaign: true`).
|
|
21
21
|
*/
|
|
22
22
|
export class EphemeralCampaignService {
|
|
23
|
+
instance;
|
|
23
24
|
campaignService;
|
|
24
25
|
profileRepo;
|
|
25
26
|
constructor(instance, db) {
|
|
27
|
+
this.instance = instance;
|
|
26
28
|
this.campaignService = new CampaignService(instance, db);
|
|
27
29
|
this.profileRepo = new ProfileRepository(db);
|
|
28
30
|
}
|
|
@@ -58,23 +60,25 @@ export class EphemeralCampaignService {
|
|
|
58
60
|
},
|
|
59
61
|
],
|
|
60
62
|
});
|
|
63
|
+
// Step 3: Pause all other campaigns so the runner is free for us
|
|
64
|
+
const previouslyActive = await this.dismissAndRetry(() => this.campaignService.pauseAllExcept(campaign.id));
|
|
61
65
|
try {
|
|
62
|
-
// Step
|
|
63
|
-
const importResult = await this.campaignService.importPeopleFromUrls(campaign.id, [resolved.linkedInUrl]);
|
|
66
|
+
// Step 4: Import target person
|
|
67
|
+
const importResult = await this.dismissAndRetry(() => this.campaignService.importPeopleFromUrls(campaign.id, [resolved.linkedInUrl]));
|
|
64
68
|
if (importResult.successful === 0 && importResult.alreadyInQueue === 0 && importResult.alreadyProcessed === 0) {
|
|
65
69
|
throw new CampaignExecutionError(`Failed to import target into campaign: ${resolved.linkedInUrl}`, campaign.id);
|
|
66
70
|
}
|
|
67
71
|
// Resolve person ID if not yet known (URL-based target)
|
|
68
72
|
const personId = resolved.personId ?? this.resolvePersonIdFromUrl(resolved.linkedInUrl);
|
|
69
|
-
// Step
|
|
70
|
-
await this.campaignService.start(campaign.id, []);
|
|
71
|
-
// Step
|
|
73
|
+
// Step 5: Start campaign
|
|
74
|
+
await this.dismissAndRetry(() => this.campaignService.start(campaign.id, []));
|
|
75
|
+
// Step 6: Poll for completion
|
|
72
76
|
await this.pollForCompletion(campaign.id, timeout, pollInterval);
|
|
73
|
-
// Step
|
|
74
|
-
const runResult = await this.campaignService.getResults(campaign.id);
|
|
77
|
+
// Step 7: Get results
|
|
78
|
+
const runResult = await this.dismissAndRetry(() => this.campaignService.getResults(campaign.id));
|
|
75
79
|
const results = runResult.results;
|
|
76
80
|
const success = results.some((r) => r.result > 0);
|
|
77
|
-
// Step
|
|
81
|
+
// Step 8: Cleanup
|
|
78
82
|
await this.cleanup(campaign.id, keepCampaign);
|
|
79
83
|
return {
|
|
80
84
|
success,
|
|
@@ -87,6 +91,10 @@ export class EphemeralCampaignService {
|
|
|
87
91
|
await this.cleanup(campaign.id, keepCampaign);
|
|
88
92
|
throw error;
|
|
89
93
|
}
|
|
94
|
+
finally {
|
|
95
|
+
// Restore previously active campaigns
|
|
96
|
+
await this.campaignService.unpauseCampaigns(previouslyActive);
|
|
97
|
+
}
|
|
90
98
|
}
|
|
91
99
|
/**
|
|
92
100
|
* Resolve a target (person ID or URL) to a LinkedIn URL and optional person ID.
|
|
@@ -144,7 +152,23 @@ export class EphemeralCampaignService {
|
|
|
144
152
|
async pollForCompletion(campaignId, timeout, pollInterval) {
|
|
145
153
|
const deadline = Date.now() + timeout;
|
|
146
154
|
while (Date.now() < deadline) {
|
|
147
|
-
|
|
155
|
+
let status;
|
|
156
|
+
try {
|
|
157
|
+
status = await this.campaignService.getStatus(campaignId);
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
if (error instanceof UIBlockedError) {
|
|
161
|
+
// Action may have produced a popup (e.g. "no endorsable skills").
|
|
162
|
+
// Dismiss and continue polling — the campaign may still complete.
|
|
163
|
+
await this.instance.dismissInstancePopups().catch(() => { });
|
|
164
|
+
const remaining = deadline - Date.now();
|
|
165
|
+
if (remaining <= 0)
|
|
166
|
+
break;
|
|
167
|
+
await delay(Math.min(pollInterval, remaining));
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
throw error;
|
|
171
|
+
}
|
|
148
172
|
const counts = status.actionCounts[0];
|
|
149
173
|
// Action complete when at least one person is successful or failed
|
|
150
174
|
if (counts && (counts.successful > 0 || counts.failed > 0)) {
|
|
@@ -161,6 +185,26 @@ export class EphemeralCampaignService {
|
|
|
161
185
|
}
|
|
162
186
|
throw new CampaignTimeoutError(`Ephemeral action did not complete within ${String(timeout)}ms`, campaignId);
|
|
163
187
|
}
|
|
188
|
+
/**
|
|
189
|
+
* Run an async operation, automatically dismissing UI popups on
|
|
190
|
+
* {@link UIBlockedError} and retrying up to 3 times.
|
|
191
|
+
*/
|
|
192
|
+
async dismissAndRetry(fn) {
|
|
193
|
+
const maxAttempts = 3;
|
|
194
|
+
for (let attempt = 1;; attempt++) {
|
|
195
|
+
try {
|
|
196
|
+
return await fn();
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
if (error instanceof UIBlockedError && attempt < maxAttempts) {
|
|
200
|
+
await this.instance.dismissInstancePopups().catch(() => { });
|
|
201
|
+
await delay(1_000);
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
throw error;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
164
208
|
/**
|
|
165
209
|
* Stop and remove/archive an ephemeral campaign (best-effort).
|
|
166
210
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ephemeral-campaign.js","sourceRoot":"","sources":["../../src/services/ephemeral-campaign.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAQpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"ephemeral-campaign.js","sourceRoot":"","sources":["../../src/services/ephemeral-campaign.ts"],"names":[],"mappings":"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"}
|