@lhremote/core 0.6.0 → 0.8.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/README.md +39 -0
- package/dist/cdp/client.d.ts +5 -1
- package/dist/cdp/client.d.ts.map +1 -1
- package/dist/cdp/client.js +11 -3
- package/dist/cdp/client.js.map +1 -1
- package/dist/data/index.d.ts +1 -0
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/index.js +1 -0
- package/dist/data/index.js.map +1 -1
- package/dist/data/linkedin-reference.d.ts +44 -0
- package/dist/data/linkedin-reference.d.ts.map +1 -0
- package/dist/data/linkedin-reference.js +316 -0
- package/dist/data/linkedin-reference.js.map +1 -0
- package/dist/data/linkedin-reference.test.d.ts +2 -0
- package/dist/data/linkedin-reference.test.d.ts.map +1 -0
- package/dist/data/linkedin-reference.test.js +124 -0
- package/dist/data/linkedin-reference.test.js.map +1 -0
- package/dist/db/index.d.ts +1 -1
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +1 -1
- package/dist/db/index.js.map +1 -1
- package/dist/db/repositories/action-budget.d.ts +29 -0
- package/dist/db/repositories/action-budget.d.ts.map +1 -0
- package/dist/db/repositories/action-budget.js +100 -0
- package/dist/db/repositories/action-budget.js.map +1 -0
- package/dist/db/repositories/action-budget.test.d.ts +2 -0
- package/dist/db/repositories/action-budget.test.d.ts.map +1 -0
- package/dist/db/repositories/action-budget.test.js +181 -0
- package/dist/db/repositories/action-budget.test.js.map +1 -0
- package/dist/db/repositories/campaign-hard-delete.integration.test.d.ts +2 -0
- package/dist/db/repositories/campaign-hard-delete.integration.test.d.ts.map +1 -0
- package/dist/db/repositories/campaign-hard-delete.integration.test.js +78 -0
- package/dist/db/repositories/campaign-hard-delete.integration.test.js.map +1 -0
- package/dist/db/repositories/campaign.d.ts +14 -0
- package/dist/db/repositories/campaign.d.ts.map +1 -1
- package/dist/db/repositories/campaign.js +125 -0
- package/dist/db/repositories/campaign.js.map +1 -1
- package/dist/db/repositories/index.d.ts +1 -0
- package/dist/db/repositories/index.d.ts.map +1 -1
- package/dist/db/repositories/index.js +1 -0
- package/dist/db/repositories/index.js.map +1 -1
- package/dist/index.d.ts +6 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +28 -6
- package/dist/index.js.map +1 -1
- package/dist/linkedin/__tests__/dom-automation.integration.test.d.ts +2 -0
- package/dist/linkedin/__tests__/dom-automation.integration.test.d.ts.map +1 -0
- package/dist/linkedin/__tests__/dom-automation.integration.test.js +160 -0
- package/dist/linkedin/__tests__/dom-automation.integration.test.js.map +1 -0
- package/dist/linkedin/__tests__/selectors.integration.test.d.ts +2 -0
- package/dist/linkedin/__tests__/selectors.integration.test.d.ts.map +1 -0
- package/dist/linkedin/__tests__/selectors.integration.test.js +258 -0
- package/dist/linkedin/__tests__/selectors.integration.test.js.map +1 -0
- package/dist/linkedin/dom-automation.d.ts +67 -0
- package/dist/linkedin/dom-automation.d.ts.map +1 -0
- package/dist/linkedin/dom-automation.js +139 -0
- package/dist/linkedin/dom-automation.js.map +1 -0
- package/dist/linkedin/index.d.ts +3 -0
- package/dist/linkedin/index.d.ts.map +1 -0
- package/dist/linkedin/index.js +5 -0
- package/dist/linkedin/index.js.map +1 -0
- package/dist/linkedin/selectors.d.ts +67 -0
- package/dist/linkedin/selectors.d.ts.map +1 -0
- package/dist/linkedin/selectors.js +74 -0
- package/dist/linkedin/selectors.js.map +1 -0
- package/dist/operations/build-linkedin-url.d.ts +39 -0
- package/dist/operations/build-linkedin-url.d.ts.map +1 -0
- package/dist/operations/build-linkedin-url.js +72 -0
- package/dist/operations/build-linkedin-url.js.map +1 -0
- package/dist/operations/campaign-delete.d.ts +6 -2
- package/dist/operations/campaign-delete.d.ts.map +1 -1
- package/dist/operations/campaign-delete.js +9 -2
- package/dist/operations/campaign-delete.js.map +1 -1
- package/dist/operations/campaign-delete.test.js +41 -1
- package/dist/operations/campaign-delete.test.js.map +1 -1
- package/dist/operations/campaign-erase.d.ts +19 -0
- package/dist/operations/campaign-erase.d.ts.map +1 -0
- package/dist/operations/campaign-erase.js +22 -0
- package/dist/operations/campaign-erase.js.map +1 -0
- package/dist/operations/campaign-erase.test.d.ts +2 -0
- package/dist/operations/campaign-erase.test.d.ts.map +1 -0
- package/dist/operations/campaign-erase.test.js +101 -0
- package/dist/operations/campaign-erase.test.js.map +1 -0
- package/dist/operations/comment-on-post.d.ts +34 -0
- package/dist/operations/comment-on-post.d.ts.map +1 -0
- package/dist/operations/comment-on-post.js +108 -0
- package/dist/operations/comment-on-post.js.map +1 -0
- package/dist/operations/comment-on-post.test.d.ts +2 -0
- package/dist/operations/comment-on-post.test.d.ts.map +1 -0
- package/dist/operations/comment-on-post.test.js +240 -0
- package/dist/operations/comment-on-post.test.js.map +1 -0
- package/dist/operations/dismiss-errors.d.ts +22 -0
- package/dist/operations/dismiss-errors.d.ts.map +1 -0
- package/dist/operations/dismiss-errors.js +55 -0
- package/dist/operations/dismiss-errors.js.map +1 -0
- package/dist/operations/dismiss-errors.test.d.ts +2 -0
- package/dist/operations/dismiss-errors.test.d.ts.map +1 -0
- package/dist/operations/dismiss-errors.test.js +136 -0
- package/dist/operations/dismiss-errors.test.js.map +1 -0
- package/dist/operations/endorse-skills.d.ts +10 -0
- package/dist/operations/endorse-skills.d.ts.map +1 -0
- package/dist/operations/endorse-skills.js +12 -0
- package/dist/operations/endorse-skills.js.map +1 -0
- package/dist/operations/enrich-profile.d.ts +18 -0
- package/dist/operations/enrich-profile.d.ts.map +1 -0
- package/dist/operations/enrich-profile.js +15 -0
- package/dist/operations/enrich-profile.js.map +1 -0
- package/dist/operations/ephemeral-action.d.ts +22 -0
- package/dist/operations/ephemeral-action.d.ts.map +1 -0
- package/dist/operations/ephemeral-action.js +31 -0
- package/dist/operations/ephemeral-action.js.map +1 -0
- package/dist/operations/follow-person.d.ts +9 -0
- package/dist/operations/follow-person.d.ts.map +1 -0
- package/dist/operations/follow-person.js +11 -0
- package/dist/operations/follow-person.js.map +1 -0
- package/dist/operations/get-action-budget.d.ts +6 -0
- package/dist/operations/get-action-budget.d.ts.map +1 -0
- package/dist/operations/get-action-budget.js +22 -0
- package/dist/operations/get-action-budget.js.map +1 -0
- package/dist/operations/get-action-budget.test.d.ts +2 -0
- package/dist/operations/get-action-budget.test.d.ts.map +1 -0
- package/dist/operations/get-action-budget.test.js +79 -0
- package/dist/operations/get-action-budget.test.js.map +1 -0
- package/dist/operations/get-errors.d.ts +9 -3
- package/dist/operations/get-errors.d.ts.map +1 -1
- package/dist/operations/get-errors.js +41 -4
- package/dist/operations/get-errors.js.map +1 -1
- package/dist/operations/get-errors.test.js +108 -42
- package/dist/operations/get-errors.test.js.map +1 -1
- package/dist/operations/get-feed.d.ts +33 -0
- package/dist/operations/get-feed.d.ts.map +1 -0
- package/dist/operations/get-feed.js +220 -0
- package/dist/operations/get-feed.js.map +1 -0
- package/dist/operations/get-feed.test.d.ts +2 -0
- package/dist/operations/get-feed.test.d.ts.map +1 -0
- package/dist/operations/get-feed.test.js +276 -0
- package/dist/operations/get-feed.test.js.map +1 -0
- package/dist/operations/get-post-engagers.d.ts +40 -0
- package/dist/operations/get-post-engagers.d.ts.map +1 -0
- package/dist/operations/get-post-engagers.js +128 -0
- package/dist/operations/get-post-engagers.js.map +1 -0
- package/dist/operations/get-post-engagers.test.d.ts +2 -0
- package/dist/operations/get-post-engagers.test.d.ts.map +1 -0
- package/dist/operations/get-post-engagers.test.js +19 -0
- package/dist/operations/get-post-engagers.test.js.map +1 -0
- package/dist/operations/get-post-stats.d.ts +38 -0
- package/dist/operations/get-post-stats.d.ts.map +1 -0
- package/dist/operations/get-post-stats.js +100 -0
- package/dist/operations/get-post-stats.js.map +1 -0
- package/dist/operations/get-post-stats.test.d.ts +2 -0
- package/dist/operations/get-post-stats.test.d.ts.map +1 -0
- package/dist/operations/get-post-stats.test.js +34 -0
- package/dist/operations/get-post-stats.test.js.map +1 -0
- package/dist/operations/get-post.d.ts +183 -0
- package/dist/operations/get-post.d.ts.map +1 -0
- package/dist/operations/get-post.js +270 -0
- package/dist/operations/get-post.js.map +1 -0
- package/dist/operations/get-post.test.d.ts +2 -0
- package/dist/operations/get-post.test.d.ts.map +1 -0
- package/dist/operations/get-post.test.js +449 -0
- package/dist/operations/get-post.test.js.map +1 -0
- package/dist/operations/get-profile-activity.d.ts +129 -0
- package/dist/operations/get-profile-activity.d.ts.map +1 -0
- package/dist/operations/get-profile-activity.js +181 -0
- package/dist/operations/get-profile-activity.js.map +1 -0
- package/dist/operations/get-profile-activity.test.d.ts +2 -0
- package/dist/operations/get-profile-activity.test.d.ts.map +1 -0
- package/dist/operations/get-profile-activity.test.js +205 -0
- package/dist/operations/get-profile-activity.test.js.map +1 -0
- package/dist/operations/get-throttle-status.d.ts +6 -0
- package/dist/operations/get-throttle-status.d.ts.map +1 -0
- package/dist/operations/get-throttle-status.js +30 -0
- package/dist/operations/get-throttle-status.js.map +1 -0
- package/dist/operations/get-throttle-status.test.d.ts +2 -0
- package/dist/operations/get-throttle-status.test.d.ts.map +1 -0
- package/dist/operations/get-throttle-status.test.js +62 -0
- package/dist/operations/get-throttle-status.test.js.map +1 -0
- package/dist/operations/index.d.ts +24 -0
- package/dist/operations/index.d.ts.map +1 -1
- package/dist/operations/index.js +35 -0
- package/dist/operations/index.js.map +1 -1
- package/dist/operations/like-person-posts.d.ts +14 -0
- package/dist/operations/like-person-posts.d.ts.map +1 -0
- package/dist/operations/like-person-posts.js +28 -0
- package/dist/operations/like-person-posts.js.map +1 -0
- package/dist/operations/message-person.d.ts +11 -0
- package/dist/operations/message-person.d.ts.map +1 -0
- package/dist/operations/message-person.js +19 -0
- package/dist/operations/message-person.js.map +1 -0
- package/dist/operations/react-to-post.d.ts +38 -0
- package/dist/operations/react-to-post.d.ts.map +1 -0
- package/dist/operations/react-to-post.js +82 -0
- package/dist/operations/react-to-post.js.map +1 -0
- package/dist/operations/react-to-post.test.d.ts +2 -0
- package/dist/operations/react-to-post.test.d.ts.map +1 -0
- package/dist/operations/react-to-post.test.js +154 -0
- package/dist/operations/react-to-post.test.js.map +1 -0
- package/dist/operations/remove-connection.d.ts +6 -0
- package/dist/operations/remove-connection.d.ts.map +1 -0
- package/dist/operations/remove-connection.js +7 -0
- package/dist/operations/remove-connection.js.map +1 -0
- package/dist/operations/resolve-linkedin-entity.d.ts +33 -0
- package/dist/operations/resolve-linkedin-entity.d.ts.map +1 -0
- package/dist/operations/resolve-linkedin-entity.js +198 -0
- package/dist/operations/resolve-linkedin-entity.js.map +1 -0
- package/dist/operations/search-posts.d.ts +143 -0
- package/dist/operations/search-posts.d.ts.map +1 -0
- package/dist/operations/search-posts.js +220 -0
- package/dist/operations/search-posts.js.map +1 -0
- package/dist/operations/search-posts.test.d.ts +2 -0
- package/dist/operations/search-posts.test.d.ts.map +1 -0
- package/dist/operations/search-posts.test.js +261 -0
- package/dist/operations/search-posts.test.js.map +1 -0
- package/dist/operations/send-inmail.d.ts +11 -0
- package/dist/operations/send-inmail.d.ts.map +1 -0
- package/dist/operations/send-inmail.js +19 -0
- package/dist/operations/send-inmail.js.map +1 -0
- package/dist/operations/send-invite.d.ts +9 -0
- package/dist/operations/send-invite.d.ts.map +1 -0
- package/dist/operations/send-invite.js +14 -0
- package/dist/operations/send-invite.js.map +1 -0
- package/dist/operations/visit-profile.d.ts +14 -0
- package/dist/operations/visit-profile.d.ts.map +1 -0
- package/dist/operations/visit-profile.js +49 -0
- package/dist/operations/visit-profile.js.map +1 -0
- package/dist/operations/visit-profile.test.d.ts +2 -0
- package/dist/operations/visit-profile.test.d.ts.map +1 -0
- package/dist/operations/visit-profile.test.js +193 -0
- package/dist/operations/visit-profile.test.js.map +1 -0
- package/dist/services/app.d.ts.map +1 -1
- package/dist/services/app.js +37 -12
- package/dist/services/app.js.map +1 -1
- package/dist/services/app.test.js +57 -0
- package/dist/services/app.test.js.map +1 -1
- package/dist/services/boolean-expression.d.ts +29 -0
- package/dist/services/boolean-expression.d.ts.map +1 -0
- package/dist/services/boolean-expression.js +79 -0
- package/dist/services/boolean-expression.js.map +1 -0
- package/dist/services/boolean-expression.test.d.ts +2 -0
- package/dist/services/boolean-expression.test.d.ts.map +1 -0
- package/dist/services/boolean-expression.test.js +64 -0
- package/dist/services/boolean-expression.test.js.map +1 -0
- package/dist/services/campaign.d.ts +10 -0
- package/dist/services/campaign.d.ts.map +1 -1
- package/dist/services/campaign.js +16 -0
- package/dist/services/campaign.js.map +1 -1
- package/dist/services/collection.d.ts +5 -2
- package/dist/services/collection.d.ts.map +1 -1
- package/dist/services/collection.js +33 -5
- package/dist/services/collection.js.map +1 -1
- package/dist/services/collection.test.js +64 -6
- package/dist/services/collection.test.js.map +1 -1
- package/dist/services/ephemeral-campaign.d.ts +64 -0
- package/dist/services/ephemeral-campaign.d.ts.map +1 -0
- package/dist/services/ephemeral-campaign.js +210 -0
- package/dist/services/ephemeral-campaign.js.map +1 -0
- package/dist/services/ephemeral-campaign.test.d.ts +2 -0
- package/dist/services/ephemeral-campaign.test.d.ts.map +1 -0
- package/dist/services/ephemeral-campaign.test.js +333 -0
- package/dist/services/ephemeral-campaign.test.js.map +1 -0
- package/dist/services/errors.d.ts +21 -0
- package/dist/services/errors.d.ts.map +1 -1
- package/dist/services/errors.js +35 -0
- package/dist/services/errors.js.map +1 -1
- package/dist/services/index.d.ts +7 -1
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +7 -1
- package/dist/services/index.js.map +1 -1
- package/dist/services/instance-context.d.ts.map +1 -1
- package/dist/services/instance-context.js +9 -1
- package/dist/services/instance-context.js.map +1 -1
- package/dist/services/instance-context.test.js +77 -1
- package/dist/services/instance-context.test.js.map +1 -1
- package/dist/services/instance.d.ts +43 -0
- package/dist/services/instance.d.ts.map +1 -1
- package/dist/services/instance.js +151 -0
- package/dist/services/instance.js.map +1 -1
- package/dist/services/instance.test.js +101 -0
- package/dist/services/instance.test.js.map +1 -1
- package/dist/services/launcher.d.ts +23 -0
- package/dist/services/launcher.d.ts.map +1 -1
- package/dist/services/launcher.js +81 -11
- package/dist/services/launcher.js.map +1 -1
- package/dist/services/launcher.test.js +109 -42
- package/dist/services/launcher.test.js.map +1 -1
- package/dist/services/sn-url-builder.d.ts +21 -0
- package/dist/services/sn-url-builder.d.ts.map +1 -0
- package/dist/services/sn-url-builder.js +132 -0
- package/dist/services/sn-url-builder.js.map +1 -0
- package/dist/services/sn-url-builder.test.d.ts +2 -0
- package/dist/services/sn-url-builder.test.d.ts.map +1 -0
- package/dist/services/sn-url-builder.test.js +130 -0
- package/dist/services/sn-url-builder.test.js.map +1 -0
- package/dist/services/url-builder.d.ts +12 -0
- package/dist/services/url-builder.d.ts.map +1 -0
- package/dist/services/url-builder.js +100 -0
- package/dist/services/url-builder.js.map +1 -0
- package/dist/services/url-builder.test.d.ts +2 -0
- package/dist/services/url-builder.test.d.ts.map +1 -0
- package/dist/services/url-builder.test.js +79 -0
- package/dist/services/url-builder.test.js.map +1 -0
- package/dist/services/url-templates.d.ts +41 -0
- package/dist/services/url-templates.d.ts.map +1 -0
- package/dist/services/url-templates.js +118 -0
- package/dist/services/url-templates.js.map +1 -0
- package/dist/services/url-templates.test.d.ts +2 -0
- package/dist/services/url-templates.test.d.ts.map +1 -0
- package/dist/services/url-templates.test.js +159 -0
- package/dist/services/url-templates.test.js.map +1 -0
- package/dist/types/action-budget.d.ts +52 -0
- package/dist/types/action-budget.d.ts.map +1 -0
- package/dist/types/action-budget.js +4 -0
- package/dist/types/action-budget.js.map +1 -0
- package/dist/types/campaign.d.ts +24 -0
- package/dist/types/campaign.d.ts.map +1 -1
- package/dist/types/feed.d.ts +32 -0
- package/dist/types/feed.d.ts.map +1 -0
- package/dist/types/feed.js +4 -0
- package/dist/types/feed.js.map +1 -0
- package/dist/types/index.d.ts +8 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/linkedin-url.d.ts +109 -0
- package/dist/types/linkedin-url.d.ts.map +1 -0
- package/dist/types/linkedin-url.js +4 -0
- package/dist/types/linkedin-url.js.map +1 -0
- package/dist/types/post-analytics.d.ts +40 -0
- package/dist/types/post-analytics.d.ts.map +1 -0
- package/dist/types/post-analytics.js +4 -0
- package/dist/types/post-analytics.js.map +1 -0
- package/dist/types/post.d.ts +43 -0
- package/dist/types/post.d.ts.map +1 -0
- package/dist/types/post.js +4 -0
- package/dist/types/post.js.map +1 -0
- package/dist/types/search-posts.d.ts +22 -0
- package/dist/types/search-posts.d.ts.map +1 -0
- package/dist/types/search-posts.js +4 -0
- package/dist/types/search-posts.js.map +1 -0
- package/dist/types/ui-health.d.ts +16 -0
- package/dist/types/ui-health.d.ts.map +1 -1
- package/dist/voyager/index.d.ts +2 -0
- package/dist/voyager/index.d.ts.map +1 -0
- package/dist/voyager/index.js +4 -0
- package/dist/voyager/index.js.map +1 -0
- package/dist/voyager/interceptor.d.ts +100 -0
- package/dist/voyager/interceptor.d.ts.map +1 -0
- package/dist/voyager/interceptor.integration.test.d.ts +2 -0
- package/dist/voyager/interceptor.integration.test.d.ts.map +1 -0
- package/dist/voyager/interceptor.integration.test.js +89 -0
- package/dist/voyager/interceptor.integration.test.js.map +1 -0
- package/dist/voyager/interceptor.js +235 -0
- package/dist/voyager/interceptor.js.map +1 -0
- package/dist/voyager/interceptor.test.d.ts +2 -0
- package/dist/voyager/interceptor.test.d.ts.map +1 -0
- package/dist/voyager/interceptor.test.js +372 -0
- package/dist/voyager/interceptor.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
|
+
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
|
+
import { DEFAULT_CDP_PORT } from "../constants.js";
|
|
4
|
+
import { CDPClient } from "../cdp/client.js";
|
|
5
|
+
import { discoverTargets } from "../cdp/discovery.js";
|
|
6
|
+
/**
|
|
7
|
+
* Public typeahead endpoint (no auth required).
|
|
8
|
+
*
|
|
9
|
+
* Works for COMPANY and GEO entity types.
|
|
10
|
+
*/
|
|
11
|
+
const PUBLIC_TYPEAHEAD_URL = "https://www.linkedin.com/jobs-guest/api/typeaheadHits";
|
|
12
|
+
/**
|
|
13
|
+
* Map our entity types to public typeahead's `typeaheadType` param.
|
|
14
|
+
*/
|
|
15
|
+
const PUBLIC_TYPEAHEAD_TYPE = {
|
|
16
|
+
COMPANY: "COMPANY",
|
|
17
|
+
GEO: "GEO",
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Map our entity types to Voyager's `type` param.
|
|
21
|
+
*/
|
|
22
|
+
const VOYAGER_TYPE = {
|
|
23
|
+
COMPANY: "COMPANY",
|
|
24
|
+
GEO: "GEO",
|
|
25
|
+
SCHOOL: "SCHOOL",
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Try the public typeahead endpoint first.
|
|
29
|
+
*
|
|
30
|
+
* @returns Matches, or `undefined` if the public endpoint is not
|
|
31
|
+
* available for this entity type or the request fails.
|
|
32
|
+
*/
|
|
33
|
+
async function tryPublicTypeahead(query, entityType) {
|
|
34
|
+
const typeaheadType = PUBLIC_TYPEAHEAD_TYPE[entityType];
|
|
35
|
+
if (typeaheadType === undefined)
|
|
36
|
+
return undefined;
|
|
37
|
+
const url = new URL(PUBLIC_TYPEAHEAD_URL);
|
|
38
|
+
url.searchParams.set("typeaheadType", typeaheadType);
|
|
39
|
+
url.searchParams.set("query", query);
|
|
40
|
+
try {
|
|
41
|
+
const response = await fetch(url.toString(), {
|
|
42
|
+
headers: { Accept: "application/json" },
|
|
43
|
+
});
|
|
44
|
+
if (!response.ok)
|
|
45
|
+
return undefined;
|
|
46
|
+
const data = (await response.json());
|
|
47
|
+
return parsePublicTypeaheadResponse(data, entityType);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Parse the public typeahead response into normalised matches.
|
|
55
|
+
*/
|
|
56
|
+
function parsePublicTypeaheadResponse(data, entityType) {
|
|
57
|
+
if (!data.elements)
|
|
58
|
+
return [];
|
|
59
|
+
return data.elements
|
|
60
|
+
.filter((el) => el.hitInfo?.id !== undefined)
|
|
61
|
+
.map((el) => ({
|
|
62
|
+
id: el.hitInfo.id,
|
|
63
|
+
name: el.hitInfo?.displayName ??
|
|
64
|
+
el.hitInfo?.companyName ??
|
|
65
|
+
el.hitInfo?.locationName ??
|
|
66
|
+
"",
|
|
67
|
+
type: entityType,
|
|
68
|
+
}))
|
|
69
|
+
.slice(0, 10);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Try the Voyager typeahead endpoint via CDP.
|
|
73
|
+
*
|
|
74
|
+
* Connects to the LinkedIn webview in LinkedHelper and executes
|
|
75
|
+
* the Voyager request from within the page context (which has
|
|
76
|
+
* the LinkedIn session cookies).
|
|
77
|
+
*/
|
|
78
|
+
async function tryVoyagerTypeahead(query, entityType, cdpPort, cdpHost, allowRemote) {
|
|
79
|
+
// Enforce loopback guard before making any network requests
|
|
80
|
+
if (!allowRemote && cdpHost !== "127.0.0.1" && cdpHost !== "localhost") {
|
|
81
|
+
throw new Error(`Non-loopback CDP host "${cdpHost}" requires --allow-remote. ` +
|
|
82
|
+
"This is a security measure to prevent remote code execution.");
|
|
83
|
+
}
|
|
84
|
+
// Find the LinkedIn page target
|
|
85
|
+
const targets = await discoverTargets(cdpPort, cdpHost);
|
|
86
|
+
const linkedInTarget = targets.find((t) => t.type === "page" && t.url?.includes("linkedin.com"));
|
|
87
|
+
if (!linkedInTarget) {
|
|
88
|
+
throw new Error("No LinkedIn page found in LinkedHelper. " +
|
|
89
|
+
"Ensure LinkedHelper is running with an active LinkedIn session.");
|
|
90
|
+
}
|
|
91
|
+
const client = new CDPClient(cdpPort, {
|
|
92
|
+
host: cdpHost,
|
|
93
|
+
allowRemote,
|
|
94
|
+
});
|
|
95
|
+
await client.connect(linkedInTarget.id);
|
|
96
|
+
try {
|
|
97
|
+
// Execute the Voyager typeahead request from within the LinkedIn page
|
|
98
|
+
// context where session cookies are already available.
|
|
99
|
+
const voyagerType = VOYAGER_TYPE[entityType];
|
|
100
|
+
const result = await client.evaluate(`(async () => {
|
|
101
|
+
const params = new URLSearchParams({
|
|
102
|
+
type: ${JSON.stringify(voyagerType)},
|
|
103
|
+
keywords: ${JSON.stringify(query)},
|
|
104
|
+
q: "type",
|
|
105
|
+
origin: "OTHER",
|
|
106
|
+
});
|
|
107
|
+
const url = "https://www.linkedin.com/voyager/api/typeahead/hitsV2?" + params;
|
|
108
|
+
|
|
109
|
+
// Extract CSRF token from cookies. The JSESSIONID value is
|
|
110
|
+
// typically stored as "ajax:<token>" (with quotes); strip quotes
|
|
111
|
+
// and use as-is for the Csrf-Token header.
|
|
112
|
+
const jsessionid = document.cookie
|
|
113
|
+
.split(";")
|
|
114
|
+
.map(c => c.trim())
|
|
115
|
+
.find(c => c.startsWith("JSESSIONID="));
|
|
116
|
+
let csrfToken = jsessionid
|
|
117
|
+
? jsessionid.substring(jsessionid.indexOf("=") + 1).replace(/"/g, "")
|
|
118
|
+
: "";
|
|
119
|
+
// Ensure "ajax:" prefix is present exactly once
|
|
120
|
+
if (!csrfToken.startsWith("ajax:")) {
|
|
121
|
+
csrfToken = "ajax:" + csrfToken;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const response = await fetch(url, {
|
|
125
|
+
headers: {
|
|
126
|
+
"Csrf-Token": csrfToken,
|
|
127
|
+
"X-RestLi-Protocol-Version": "2.0.0",
|
|
128
|
+
},
|
|
129
|
+
credentials: "include",
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
if (!response.ok) {
|
|
133
|
+
return { error: "HTTP " + response.status + ": " + response.statusText };
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const data = await response.json();
|
|
137
|
+
return { data };
|
|
138
|
+
})()`, true);
|
|
139
|
+
if (result.error) {
|
|
140
|
+
throw new Error(`Voyager typeahead request failed: ${result.error}`);
|
|
141
|
+
}
|
|
142
|
+
return parseVoyagerResponse(result.data, entityType);
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
client.disconnect();
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Parse the Voyager typeahead response into normalised matches.
|
|
150
|
+
*/
|
|
151
|
+
function parseVoyagerResponse(data, entityType) {
|
|
152
|
+
if (!data?.elements)
|
|
153
|
+
return [];
|
|
154
|
+
return data.elements
|
|
155
|
+
.filter((el) => el.targetUrn !== undefined || el.trackingUrn !== undefined)
|
|
156
|
+
.map((el) => {
|
|
157
|
+
// Extract numeric ID from URN (e.g., "urn:li:organization:1441" → "1441")
|
|
158
|
+
const urn = el.targetUrn ?? el.trackingUrn ?? "";
|
|
159
|
+
const id = urn.split(":").pop() ?? urn;
|
|
160
|
+
return {
|
|
161
|
+
id,
|
|
162
|
+
name: el.title?.text ?? "",
|
|
163
|
+
type: entityType,
|
|
164
|
+
};
|
|
165
|
+
})
|
|
166
|
+
.slice(0, 10);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Resolve human-readable names (company names, locations, schools) to
|
|
170
|
+
* LinkedIn entity IDs via typeahead endpoints.
|
|
171
|
+
*
|
|
172
|
+
* Two-strategy approach:
|
|
173
|
+
* 1. **Public typeahead** (primary for COMPANY/GEO) — no auth required
|
|
174
|
+
* 2. **Voyager typeahead** (fallback, primary for SCHOOL) — requires CDP
|
|
175
|
+
*
|
|
176
|
+
* @param input - Resolution parameters
|
|
177
|
+
* @returns Resolved matches with strategy used
|
|
178
|
+
*/
|
|
179
|
+
export async function resolveLinkedInEntity(input) {
|
|
180
|
+
const cdpPort = input.cdpPort ?? DEFAULT_CDP_PORT;
|
|
181
|
+
const cdpHost = input.cdpHost ?? "127.0.0.1";
|
|
182
|
+
const allowRemote = input.allowRemote ?? false;
|
|
183
|
+
// For SCHOOL, public endpoint doesn't support it — go straight to Voyager
|
|
184
|
+
if (input.entityType === "SCHOOL") {
|
|
185
|
+
const matches = await tryVoyagerTypeahead(input.query, input.entityType, cdpPort, cdpHost, allowRemote);
|
|
186
|
+
return { matches, strategy: "voyager" };
|
|
187
|
+
}
|
|
188
|
+
// Try public endpoint first — only fall back to Voyager if the request
|
|
189
|
+
// itself failed (undefined), not when it succeeded with zero matches.
|
|
190
|
+
const publicMatches = await tryPublicTypeahead(input.query, input.entityType);
|
|
191
|
+
if (publicMatches !== undefined) {
|
|
192
|
+
return { matches: publicMatches, strategy: "public" };
|
|
193
|
+
}
|
|
194
|
+
// Public endpoint failed — fallback to Voyager
|
|
195
|
+
const voyagerMatches = await tryVoyagerTypeahead(input.query, input.entityType, cdpPort, cdpHost, allowRemote);
|
|
196
|
+
return { matches: voyagerMatches, strategy: "voyager" };
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=resolve-linkedin-entity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-linkedin-entity.js","sourceRoot":"","sources":["../../src/operations/resolve-linkedin-entity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import type { SearchPostResult } from "../types/search-posts.js";
|
|
2
|
+
import type { ConnectionOptions } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Input for the search-posts operation.
|
|
5
|
+
*/
|
|
6
|
+
export interface SearchPostsInput extends ConnectionOptions {
|
|
7
|
+
/** Search query (keywords or hashtag, e.g. `"AI agents"` or `"#AIAgents"`). */
|
|
8
|
+
readonly query: string;
|
|
9
|
+
/** Number of results per page (default: 10). */
|
|
10
|
+
readonly count?: number | undefined;
|
|
11
|
+
/** Pagination offset (default: 0). */
|
|
12
|
+
readonly start?: number | undefined;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Output from the search-posts operation.
|
|
16
|
+
*/
|
|
17
|
+
export interface SearchPostsOutput {
|
|
18
|
+
/** The search query that was executed. */
|
|
19
|
+
readonly query: string;
|
|
20
|
+
/** List of matching posts. */
|
|
21
|
+
readonly posts: SearchPostResult[];
|
|
22
|
+
/** Pagination metadata. */
|
|
23
|
+
readonly paging: {
|
|
24
|
+
readonly start: number;
|
|
25
|
+
readonly count: number;
|
|
26
|
+
readonly total: number;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/** Top-level search clusters response. */
|
|
30
|
+
interface VoyagerSearchResponse {
|
|
31
|
+
data?: {
|
|
32
|
+
elements?: VoyagerSearchCluster[];
|
|
33
|
+
paging?: VoyagerPaging;
|
|
34
|
+
};
|
|
35
|
+
elements?: VoyagerSearchCluster[];
|
|
36
|
+
paging?: VoyagerPaging;
|
|
37
|
+
included?: VoyagerIncludedEntity[];
|
|
38
|
+
}
|
|
39
|
+
interface VoyagerSearchCluster {
|
|
40
|
+
items?: VoyagerSearchItem[];
|
|
41
|
+
}
|
|
42
|
+
interface VoyagerSearchItem {
|
|
43
|
+
item?: {
|
|
44
|
+
entityResult?: VoyagerEntityResult;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
interface VoyagerEntityResult {
|
|
48
|
+
/** URN of the search result entity (e.g. `urn:li:activity:...`). */
|
|
49
|
+
entityUrn?: string;
|
|
50
|
+
/** Reference to the underlying update entity in `included`. */
|
|
51
|
+
"*entity"?: string;
|
|
52
|
+
title?: VoyagerTextWrapper;
|
|
53
|
+
primarySubtitle?: VoyagerTextWrapper;
|
|
54
|
+
summary?: VoyagerTextWrapper;
|
|
55
|
+
insightsResolutionResults?: VoyagerInsight[];
|
|
56
|
+
socialProofText?: string;
|
|
57
|
+
secondarySubtitle?: VoyagerTextWrapper;
|
|
58
|
+
}
|
|
59
|
+
interface VoyagerTextWrapper {
|
|
60
|
+
text?: string;
|
|
61
|
+
}
|
|
62
|
+
interface VoyagerInsight {
|
|
63
|
+
simpleInsight?: {
|
|
64
|
+
title?: VoyagerTextWrapper;
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
interface VoyagerIncludedEntity {
|
|
68
|
+
$type?: string;
|
|
69
|
+
entityUrn?: string;
|
|
70
|
+
/** Reference to the actor profile. */
|
|
71
|
+
"*actor"?: string;
|
|
72
|
+
actor?: VoyagerActor;
|
|
73
|
+
commentary?: VoyagerTextWrapper;
|
|
74
|
+
socialDetail?: VoyagerSocialDetail | string;
|
|
75
|
+
numLikes?: number;
|
|
76
|
+
numComments?: number;
|
|
77
|
+
firstName?: string;
|
|
78
|
+
lastName?: string;
|
|
79
|
+
publicIdentifier?: string;
|
|
80
|
+
headline?: VoyagerTextWrapper | string;
|
|
81
|
+
occupation?: string;
|
|
82
|
+
}
|
|
83
|
+
interface VoyagerActor {
|
|
84
|
+
name?: VoyagerTextWrapper;
|
|
85
|
+
description?: VoyagerTextWrapper;
|
|
86
|
+
navigationUrl?: string;
|
|
87
|
+
}
|
|
88
|
+
interface VoyagerSocialDetail {
|
|
89
|
+
totalSocialActivityCounts?: {
|
|
90
|
+
numLikes?: number;
|
|
91
|
+
numComments?: number;
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
interface VoyagerPaging {
|
|
95
|
+
start?: number;
|
|
96
|
+
count?: number;
|
|
97
|
+
total?: number;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Extract a LinkedIn public identifier from a navigation URL.
|
|
101
|
+
*
|
|
102
|
+
* Handles patterns like:
|
|
103
|
+
* - `https://www.linkedin.com/in/johndoe`
|
|
104
|
+
* - `https://www.linkedin.com/in/johndoe?miniProfileUrn=...`
|
|
105
|
+
*/
|
|
106
|
+
export declare function extractPublicId(url: string | undefined): string | null;
|
|
107
|
+
/**
|
|
108
|
+
* Extract the activity URN from the entity URN.
|
|
109
|
+
*
|
|
110
|
+
* The search API may return URNs in several formats:
|
|
111
|
+
* - `urn:li:fs_updateV2:(urn:li:activity:1234,...)` → extract `urn:li:activity:1234`
|
|
112
|
+
* - `urn:li:activity:1234` → use directly
|
|
113
|
+
* - `urn:li:ugcPost:1234` → use directly
|
|
114
|
+
*/
|
|
115
|
+
export declare function extractActivityUrn(urn: string | undefined): string | null;
|
|
116
|
+
/**
|
|
117
|
+
* Parse the Voyager content search response into normalised search results.
|
|
118
|
+
*
|
|
119
|
+
* LinkedIn's search API returns results in a "clusters" structure with
|
|
120
|
+
* entities referenced via URN in the `included` array. This parser
|
|
121
|
+
* handles both inline and reference-based entity resolution.
|
|
122
|
+
*/
|
|
123
|
+
export declare function parseSearchResponse(raw: VoyagerSearchResponse): {
|
|
124
|
+
posts: SearchPostResult[];
|
|
125
|
+
paging: {
|
|
126
|
+
start: number;
|
|
127
|
+
count: number;
|
|
128
|
+
total: number;
|
|
129
|
+
};
|
|
130
|
+
};
|
|
131
|
+
/**
|
|
132
|
+
* Search LinkedIn for posts matching a keyword query.
|
|
133
|
+
*
|
|
134
|
+
* Connects to the LinkedIn webview in LinkedHelper and calls the
|
|
135
|
+
* Voyager search API with content-type filtering to find posts.
|
|
136
|
+
* Supports keyword search, hashtag search, and cursor-based pagination.
|
|
137
|
+
*
|
|
138
|
+
* @param input - Search query, pagination parameters, and CDP connection options.
|
|
139
|
+
* @returns List of matching posts with pagination metadata.
|
|
140
|
+
*/
|
|
141
|
+
export declare function searchPosts(input: SearchPostsInput): Promise<SearchPostsOutput>;
|
|
142
|
+
export {};
|
|
143
|
+
//# sourceMappingURL=search-posts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-posts.d.ts","sourceRoot":"","sources":["../../src/operations/search-posts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
|
+
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
|
+
import { CDPClient } from "../cdp/client.js";
|
|
4
|
+
import { discoverTargets } from "../cdp/discovery.js";
|
|
5
|
+
import { VoyagerInterceptor } from "../voyager/interceptor.js";
|
|
6
|
+
import { DEFAULT_CDP_PORT } from "../constants.js";
|
|
7
|
+
/**
|
|
8
|
+
* Extract a LinkedIn public identifier from a navigation URL.
|
|
9
|
+
*
|
|
10
|
+
* Handles patterns like:
|
|
11
|
+
* - `https://www.linkedin.com/in/johndoe`
|
|
12
|
+
* - `https://www.linkedin.com/in/johndoe?miniProfileUrn=...`
|
|
13
|
+
*/
|
|
14
|
+
export function extractPublicId(url) {
|
|
15
|
+
if (!url)
|
|
16
|
+
return null;
|
|
17
|
+
const match = /linkedin\.com\/in\/([^/?]+)/.exec(url);
|
|
18
|
+
return match?.[1] ?? null;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Resolve a headline value that may be a string or an object with a `text` field.
|
|
22
|
+
*/
|
|
23
|
+
function resolveTextOrWrapper(value) {
|
|
24
|
+
if (value === undefined || value === null)
|
|
25
|
+
return null;
|
|
26
|
+
if (typeof value === "string")
|
|
27
|
+
return value;
|
|
28
|
+
return value.text ?? null;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Extract the activity URN from the entity URN.
|
|
32
|
+
*
|
|
33
|
+
* The search API may return URNs in several formats:
|
|
34
|
+
* - `urn:li:fs_updateV2:(urn:li:activity:1234,...)` → extract `urn:li:activity:1234`
|
|
35
|
+
* - `urn:li:activity:1234` → use directly
|
|
36
|
+
* - `urn:li:ugcPost:1234` → use directly
|
|
37
|
+
*/
|
|
38
|
+
export function extractActivityUrn(urn) {
|
|
39
|
+
if (!urn)
|
|
40
|
+
return null;
|
|
41
|
+
// Extract nested activity URN from fs_updateV2 wrapper
|
|
42
|
+
// e.g. urn:li:fs_updateV2:(urn:li:activity:123,FEED_DETAIL)
|
|
43
|
+
const nestedMatch = /\((urn:li:(?:activity|ugcPost):\d+)[,)]/.exec(urn);
|
|
44
|
+
if (nestedMatch?.[1])
|
|
45
|
+
return nestedMatch[1];
|
|
46
|
+
// Direct activity/ugcPost URN
|
|
47
|
+
if (/^urn:li:(?:activity|ugcPost):\d+$/.test(urn))
|
|
48
|
+
return urn;
|
|
49
|
+
return urn;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Parse the Voyager content search response into normalised search results.
|
|
53
|
+
*
|
|
54
|
+
* LinkedIn's search API returns results in a "clusters" structure with
|
|
55
|
+
* entities referenced via URN in the `included` array. This parser
|
|
56
|
+
* handles both inline and reference-based entity resolution.
|
|
57
|
+
*/
|
|
58
|
+
export function parseSearchResponse(raw) {
|
|
59
|
+
const clusters = raw.data?.elements ?? raw.elements ?? [];
|
|
60
|
+
const paging = raw.data?.paging ?? raw.paging;
|
|
61
|
+
const included = raw.included ?? [];
|
|
62
|
+
// Build lookup maps for included entities by URN
|
|
63
|
+
const entitiesByUrn = new Map();
|
|
64
|
+
for (const entity of included) {
|
|
65
|
+
if (entity.entityUrn) {
|
|
66
|
+
entitiesByUrn.set(entity.entityUrn, entity);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
const posts = [];
|
|
70
|
+
for (const cluster of clusters) {
|
|
71
|
+
for (const searchItem of cluster.items ?? []) {
|
|
72
|
+
const entityResult = searchItem.item?.entityResult;
|
|
73
|
+
if (!entityResult)
|
|
74
|
+
continue;
|
|
75
|
+
const postUrn = extractActivityUrn(entityResult.entityUrn);
|
|
76
|
+
if (!postUrn)
|
|
77
|
+
continue;
|
|
78
|
+
// Try to find the update entity in included
|
|
79
|
+
const entityRef = entityResult["*entity"] ?? entityResult.entityUrn;
|
|
80
|
+
const updateEntity = entityRef
|
|
81
|
+
? entitiesByUrn.get(entityRef)
|
|
82
|
+
: undefined;
|
|
83
|
+
// Extract post text from entity result summary or update commentary
|
|
84
|
+
const text = entityResult.summary?.text ??
|
|
85
|
+
updateEntity?.commentary?.text ??
|
|
86
|
+
null;
|
|
87
|
+
// Extract author info from entity result or included actor
|
|
88
|
+
let authorFirstName = null;
|
|
89
|
+
let authorLastName = null;
|
|
90
|
+
let authorPublicId = null;
|
|
91
|
+
let authorHeadline = null;
|
|
92
|
+
// Try entity result title (author name in search results)
|
|
93
|
+
const authorName = entityResult.title?.text ?? null;
|
|
94
|
+
if (authorName) {
|
|
95
|
+
const nameParts = authorName.split(" ");
|
|
96
|
+
authorFirstName = nameParts[0] ?? null;
|
|
97
|
+
authorLastName = nameParts.slice(1).join(" ") || null;
|
|
98
|
+
}
|
|
99
|
+
authorHeadline =
|
|
100
|
+
entityResult.primarySubtitle?.text ?? null;
|
|
101
|
+
// Try to resolve from included actor profile
|
|
102
|
+
if (updateEntity?.["*actor"]) {
|
|
103
|
+
const actorProfile = entitiesByUrn.get(updateEntity["*actor"]);
|
|
104
|
+
if (actorProfile) {
|
|
105
|
+
if (!authorFirstName) {
|
|
106
|
+
authorFirstName = actorProfile.firstName ?? null;
|
|
107
|
+
}
|
|
108
|
+
if (!authorLastName) {
|
|
109
|
+
authorLastName = actorProfile.lastName ?? null;
|
|
110
|
+
}
|
|
111
|
+
if (!authorPublicId) {
|
|
112
|
+
authorPublicId = actorProfile.publicIdentifier ?? null;
|
|
113
|
+
}
|
|
114
|
+
if (!authorHeadline) {
|
|
115
|
+
authorHeadline = resolveTextOrWrapper(actorProfile.headline) ??
|
|
116
|
+
actorProfile.occupation ?? null;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Try to extract publicId from actor navigation URL
|
|
121
|
+
if (!authorPublicId && updateEntity?.actor?.navigationUrl) {
|
|
122
|
+
authorPublicId = extractPublicId(updateEntity.actor.navigationUrl);
|
|
123
|
+
}
|
|
124
|
+
// Extract engagement counts
|
|
125
|
+
let reactionCount = 0;
|
|
126
|
+
let commentCount = 0;
|
|
127
|
+
if (updateEntity?.socialDetail && typeof updateEntity.socialDetail === "object") {
|
|
128
|
+
reactionCount =
|
|
129
|
+
updateEntity.socialDetail.totalSocialActivityCounts?.numLikes ?? 0;
|
|
130
|
+
commentCount =
|
|
131
|
+
updateEntity.socialDetail.totalSocialActivityCounts?.numComments ?? 0;
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
reactionCount = updateEntity?.numLikes ?? 0;
|
|
135
|
+
commentCount = updateEntity?.numComments ?? 0;
|
|
136
|
+
}
|
|
137
|
+
posts.push({
|
|
138
|
+
postUrn,
|
|
139
|
+
text,
|
|
140
|
+
authorFirstName,
|
|
141
|
+
authorLastName,
|
|
142
|
+
authorPublicId,
|
|
143
|
+
authorHeadline,
|
|
144
|
+
reactionCount,
|
|
145
|
+
commentCount,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
posts,
|
|
151
|
+
paging: {
|
|
152
|
+
start: paging?.start ?? 0,
|
|
153
|
+
count: paging?.count ?? posts.length,
|
|
154
|
+
total: paging?.total ?? posts.length,
|
|
155
|
+
},
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Search LinkedIn for posts matching a keyword query.
|
|
160
|
+
*
|
|
161
|
+
* Connects to the LinkedIn webview in LinkedHelper and calls the
|
|
162
|
+
* Voyager search API with content-type filtering to find posts.
|
|
163
|
+
* Supports keyword search, hashtag search, and cursor-based pagination.
|
|
164
|
+
*
|
|
165
|
+
* @param input - Search query, pagination parameters, and CDP connection options.
|
|
166
|
+
* @returns List of matching posts with pagination metadata.
|
|
167
|
+
*/
|
|
168
|
+
export async function searchPosts(input) {
|
|
169
|
+
const cdpPort = input.cdpPort ?? DEFAULT_CDP_PORT;
|
|
170
|
+
const cdpHost = input.cdpHost ?? "127.0.0.1";
|
|
171
|
+
const allowRemote = input.allowRemote ?? false;
|
|
172
|
+
const count = input.count ?? 10;
|
|
173
|
+
const start = input.start ?? 0;
|
|
174
|
+
if (!input.query.trim()) {
|
|
175
|
+
throw new Error("Search query must not be empty");
|
|
176
|
+
}
|
|
177
|
+
// Enforce loopback guard
|
|
178
|
+
if (!allowRemote && cdpHost !== "127.0.0.1" && cdpHost !== "localhost") {
|
|
179
|
+
throw new Error(`Non-loopback CDP host "${cdpHost}" requires --allow-remote. ` +
|
|
180
|
+
"This is a security measure to prevent remote code execution.");
|
|
181
|
+
}
|
|
182
|
+
const targets = await discoverTargets(cdpPort, cdpHost);
|
|
183
|
+
const linkedInTarget = targets.find((t) => t.type === "page" && t.url?.includes("linkedin.com"));
|
|
184
|
+
if (!linkedInTarget) {
|
|
185
|
+
throw new Error("No LinkedIn page found in LinkedHelper. " +
|
|
186
|
+
"Ensure LinkedHelper is running with an active LinkedIn session.");
|
|
187
|
+
}
|
|
188
|
+
const client = new CDPClient(cdpPort, { host: cdpHost, allowRemote });
|
|
189
|
+
await client.connect(linkedInTarget.id);
|
|
190
|
+
try {
|
|
191
|
+
const voyager = new VoyagerInterceptor(client);
|
|
192
|
+
const encodedQuery = encodeURIComponent(input.query);
|
|
193
|
+
const encodedFilters = encodeURIComponent("List(resultType->CONTENT)");
|
|
194
|
+
const path = `/voyager/api/search/dash/clusters` +
|
|
195
|
+
`?q=all` +
|
|
196
|
+
`&keywords=${encodedQuery}` +
|
|
197
|
+
`&filters=${encodedFilters}` +
|
|
198
|
+
`&origin=GLOBAL_SEARCH_HEADER` +
|
|
199
|
+
`&start=${String(start)}` +
|
|
200
|
+
`&count=${String(count)}`;
|
|
201
|
+
const response = await voyager.fetch(path);
|
|
202
|
+
if (response.status !== 200) {
|
|
203
|
+
throw new Error(`Voyager API returned HTTP ${String(response.status)} for post search`);
|
|
204
|
+
}
|
|
205
|
+
const body = response.body;
|
|
206
|
+
if (body === null || typeof body !== "object") {
|
|
207
|
+
throw new Error("Voyager API returned an unexpected response format for post search");
|
|
208
|
+
}
|
|
209
|
+
const parsed = parseSearchResponse(body);
|
|
210
|
+
return {
|
|
211
|
+
query: input.query,
|
|
212
|
+
posts: parsed.posts,
|
|
213
|
+
paging: parsed.paging,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
finally {
|
|
217
|
+
client.disconnect();
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=search-posts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-posts.js","sourceRoot":"","sources":["../../src/operations/search-posts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-posts.test.d.ts","sourceRoot":"","sources":["../../src/operations/search-posts.test.ts"],"names":[],"mappings":""}
|