@lhremote/core 0.8.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/cdp/app-discovery.d.ts +57 -0
- package/dist/cdp/app-discovery.d.ts.map +1 -1
- package/dist/cdp/app-discovery.js +90 -7
- package/dist/cdp/app-discovery.js.map +1 -1
- package/dist/cdp/app-discovery.test.js +180 -9
- package/dist/cdp/app-discovery.test.js.map +1 -1
- package/dist/cdp/client.d.ts +8 -1
- package/dist/cdp/client.d.ts.map +1 -1
- package/dist/cdp/client.js +8 -1
- package/dist/cdp/client.js.map +1 -1
- package/dist/cdp/discovery.d.ts.map +1 -1
- package/dist/cdp/discovery.js +5 -1
- package/dist/cdp/discovery.js.map +1 -1
- package/dist/cdp/discovery.test.js +7 -0
- package/dist/cdp/discovery.test.js.map +1 -1
- package/dist/cdp/index.d.ts +1 -1
- package/dist/cdp/index.d.ts.map +1 -1
- package/dist/cdp/index.js +1 -1
- package/dist/cdp/index.js.map +1 -1
- package/dist/cdp/instance-discovery.d.ts.map +1 -1
- package/dist/cdp/instance-discovery.js +25 -10
- package/dist/cdp/instance-discovery.js.map +1 -1
- package/dist/cdp/instance-discovery.test.js +17 -0
- package/dist/cdp/instance-discovery.test.js.map +1 -1
- package/dist/cdp/testing/launch-chromium.d.ts +1 -1
- package/dist/cdp/testing/launch-chromium.js +2 -2
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +3 -0
- package/dist/db/client.js.map +1 -1
- 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.integration.test.js +6 -4
- package/dist/db/repositories/collection-list.integration.test.js.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 +6 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/dist/linkedin/dom-automation-retry.test.d.ts +2 -0
- package/dist/linkedin/dom-automation-retry.test.d.ts.map +1 -0
- package/dist/linkedin/dom-automation-retry.test.js +51 -0
- package/dist/linkedin/dom-automation-retry.test.js.map +1 -0
- package/dist/linkedin/dom-automation.d.ts +166 -6
- package/dist/linkedin/dom-automation.d.ts.map +1 -1
- package/dist/linkedin/dom-automation.js +496 -21
- package/dist/linkedin/dom-automation.js.map +1 -1
- package/dist/linkedin/humanized-mouse.d.ts +69 -0
- package/dist/linkedin/humanized-mouse.d.ts.map +1 -0
- package/dist/linkedin/humanized-mouse.js +109 -0
- package/dist/linkedin/humanized-mouse.js.map +1 -0
- package/dist/linkedin/index.d.ts +3 -2
- package/dist/linkedin/index.d.ts.map +1 -1
- package/dist/linkedin/index.js +3 -2
- 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/add-people-to-collection.d.ts +1 -1
- package/dist/operations/add-people-to-collection.d.ts.map +1 -1
- package/dist/operations/add-people-to-collection.js +3 -6
- package/dist/operations/add-people-to-collection.js.map +1 -1
- package/dist/operations/build-linkedin-url.test.d.ts +2 -0
- package/dist/operations/build-linkedin-url.test.d.ts.map +1 -0
- package/dist/operations/build-linkedin-url.test.js +158 -0
- package/dist/operations/build-linkedin-url.test.js.map +1 -0
- package/dist/operations/campaign-add-action.d.ts +1 -1
- package/dist/operations/campaign-add-action.d.ts.map +1 -1
- package/dist/operations/campaign-add-action.js +3 -6
- package/dist/operations/campaign-add-action.js.map +1 -1
- package/dist/operations/campaign-create.d.ts +1 -1
- package/dist/operations/campaign-create.d.ts.map +1 -1
- package/dist/operations/campaign-create.js +3 -6
- package/dist/operations/campaign-create.js.map +1 -1
- package/dist/operations/campaign-delete.d.ts +1 -1
- package/dist/operations/campaign-delete.d.ts.map +1 -1
- package/dist/operations/campaign-delete.js +3 -6
- package/dist/operations/campaign-delete.js.map +1 -1
- package/dist/operations/campaign-erase.d.ts +1 -1
- package/dist/operations/campaign-erase.d.ts.map +1 -1
- package/dist/operations/campaign-erase.js +3 -6
- package/dist/operations/campaign-erase.js.map +1 -1
- package/dist/operations/campaign-exclude-add.d.ts +1 -1
- package/dist/operations/campaign-exclude-add.d.ts.map +1 -1
- package/dist/operations/campaign-exclude-add.js +3 -6
- package/dist/operations/campaign-exclude-add.js.map +1 -1
- package/dist/operations/campaign-exclude-list.d.ts +1 -1
- package/dist/operations/campaign-exclude-list.d.ts.map +1 -1
- package/dist/operations/campaign-exclude-list.js +3 -6
- package/dist/operations/campaign-exclude-list.js.map +1 -1
- package/dist/operations/campaign-exclude-remove.d.ts +1 -1
- package/dist/operations/campaign-exclude-remove.d.ts.map +1 -1
- package/dist/operations/campaign-exclude-remove.js +3 -6
- package/dist/operations/campaign-exclude-remove.js.map +1 -1
- package/dist/operations/campaign-export.d.ts +1 -1
- package/dist/operations/campaign-export.d.ts.map +1 -1
- package/dist/operations/campaign-export.js +3 -6
- package/dist/operations/campaign-export.js.map +1 -1
- package/dist/operations/campaign-get.d.ts +1 -1
- package/dist/operations/campaign-get.d.ts.map +1 -1
- package/dist/operations/campaign-get.js +3 -6
- package/dist/operations/campaign-get.js.map +1 -1
- package/dist/operations/campaign-list-people.d.ts +1 -1
- package/dist/operations/campaign-list-people.d.ts.map +1 -1
- package/dist/operations/campaign-list-people.js +3 -6
- package/dist/operations/campaign-list-people.js.map +1 -1
- package/dist/operations/campaign-list.d.ts +1 -1
- package/dist/operations/campaign-list.d.ts.map +1 -1
- package/dist/operations/campaign-list.js +3 -6
- package/dist/operations/campaign-list.js.map +1 -1
- package/dist/operations/campaign-move-next.d.ts +1 -1
- package/dist/operations/campaign-move-next.d.ts.map +1 -1
- package/dist/operations/campaign-move-next.js +3 -6
- package/dist/operations/campaign-move-next.js.map +1 -1
- package/dist/operations/campaign-remove-action.d.ts +1 -1
- package/dist/operations/campaign-remove-action.d.ts.map +1 -1
- package/dist/operations/campaign-remove-action.js +3 -6
- package/dist/operations/campaign-remove-action.js.map +1 -1
- package/dist/operations/campaign-remove-people.d.ts +1 -1
- package/dist/operations/campaign-remove-people.d.ts.map +1 -1
- package/dist/operations/campaign-remove-people.js +3 -6
- package/dist/operations/campaign-remove-people.js.map +1 -1
- package/dist/operations/campaign-reorder-actions.d.ts +1 -1
- package/dist/operations/campaign-reorder-actions.d.ts.map +1 -1
- package/dist/operations/campaign-reorder-actions.js +3 -6
- package/dist/operations/campaign-reorder-actions.js.map +1 -1
- package/dist/operations/campaign-retry.d.ts +1 -1
- package/dist/operations/campaign-retry.d.ts.map +1 -1
- package/dist/operations/campaign-retry.js +3 -6
- package/dist/operations/campaign-retry.js.map +1 -1
- package/dist/operations/campaign-start.d.ts +1 -1
- package/dist/operations/campaign-start.d.ts.map +1 -1
- package/dist/operations/campaign-start.js +3 -6
- package/dist/operations/campaign-start.js.map +1 -1
- package/dist/operations/campaign-statistics.d.ts +1 -1
- package/dist/operations/campaign-statistics.d.ts.map +1 -1
- package/dist/operations/campaign-statistics.js +3 -6
- package/dist/operations/campaign-statistics.js.map +1 -1
- package/dist/operations/campaign-status.d.ts +1 -1
- package/dist/operations/campaign-status.d.ts.map +1 -1
- package/dist/operations/campaign-status.js +3 -6
- package/dist/operations/campaign-status.js.map +1 -1
- package/dist/operations/campaign-stop.d.ts +1 -1
- package/dist/operations/campaign-stop.d.ts.map +1 -1
- package/dist/operations/campaign-stop.js +3 -6
- package/dist/operations/campaign-stop.js.map +1 -1
- package/dist/operations/campaign-update-action.d.ts +1 -1
- package/dist/operations/campaign-update-action.d.ts.map +1 -1
- package/dist/operations/campaign-update-action.js +3 -6
- package/dist/operations/campaign-update-action.js.map +1 -1
- package/dist/operations/campaign-update.d.ts +1 -1
- package/dist/operations/campaign-update.d.ts.map +1 -1
- package/dist/operations/campaign-update.js +3 -6
- package/dist/operations/campaign-update.js.map +1 -1
- package/dist/operations/check-replies.d.ts +3 -1
- package/dist/operations/check-replies.d.ts.map +1 -1
- package/dist/operations/check-replies.js +124 -17
- package/dist/operations/check-replies.js.map +1 -1
- package/dist/operations/check-replies.test.js +152 -17
- package/dist/operations/check-replies.test.js.map +1 -1
- package/dist/operations/collect-people.d.ts +1 -1
- package/dist/operations/collect-people.d.ts.map +1 -1
- package/dist/operations/collect-people.js +18 -12
- 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/comment-on-post.d.ts +4 -1
- package/dist/operations/comment-on-post.d.ts.map +1 -1
- package/dist/operations/comment-on-post.js +15 -19
- package/dist/operations/comment-on-post.js.map +1 -1
- package/dist/operations/comment-on-post.test.js +8 -6
- package/dist/operations/comment-on-post.test.js.map +1 -1
- package/dist/operations/create-collection.d.ts +1 -1
- package/dist/operations/create-collection.d.ts.map +1 -1
- package/dist/operations/create-collection.js +5 -7
- 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/delete-collection.d.ts +1 -1
- package/dist/operations/delete-collection.d.ts.map +1 -1
- package/dist/operations/delete-collection.js +3 -6
- package/dist/operations/delete-collection.js.map +1 -1
- package/dist/operations/dismiss-errors.d.ts +11 -5
- package/dist/operations/dismiss-errors.d.ts.map +1 -1
- package/dist/operations/dismiss-errors.js +68 -34
- package/dist/operations/dismiss-errors.js.map +1 -1
- package/dist/operations/dismiss-errors.test.js +129 -8
- package/dist/operations/dismiss-errors.test.js.map +1 -1
- package/dist/operations/endorse-skills.test.d.ts +2 -0
- package/dist/operations/endorse-skills.test.d.ts.map +1 -0
- package/dist/operations/endorse-skills.test.js +70 -0
- package/dist/operations/endorse-skills.test.js.map +1 -0
- package/dist/operations/enrich-profile.test.d.ts +2 -0
- package/dist/operations/enrich-profile.test.d.ts.map +1 -0
- package/dist/operations/enrich-profile.test.js +73 -0
- package/dist/operations/enrich-profile.test.js.map +1 -0
- package/dist/operations/ephemeral-action.d.ts +2 -1
- package/dist/operations/ephemeral-action.d.ts.map +1 -1
- package/dist/operations/ephemeral-action.js +5 -7
- package/dist/operations/ephemeral-action.js.map +1 -1
- package/dist/operations/ephemeral-action.test.d.ts +2 -0
- package/dist/operations/ephemeral-action.test.d.ts.map +1 -0
- package/dist/operations/ephemeral-action.test.js +159 -0
- package/dist/operations/ephemeral-action.test.js.map +1 -0
- package/dist/operations/follow-person.test.d.ts +2 -0
- package/dist/operations/follow-person.test.d.ts.map +1 -0
- package/dist/operations/follow-person.test.js +57 -0
- package/dist/operations/follow-person.test.js.map +1 -0
- package/dist/operations/get-action-budget.d.ts +1 -1
- package/dist/operations/get-action-budget.d.ts.map +1 -1
- package/dist/operations/get-action-budget.js +3 -6
- package/dist/operations/get-action-budget.js.map +1 -1
- package/dist/operations/get-errors.d.ts +5 -1
- package/dist/operations/get-errors.d.ts.map +1 -1
- package/dist/operations/get-errors.js +55 -33
- package/dist/operations/get-errors.js.map +1 -1
- package/dist/operations/get-errors.test.js +54 -55
- package/dist/operations/get-errors.test.js.map +1 -1
- package/dist/operations/get-feed.d.ts +83 -4
- package/dist/operations/get-feed.d.ts.map +1 -1
- package/dist/operations/get-feed.js +400 -153
- package/dist/operations/get-feed.js.map +1 -1
- package/dist/operations/get-feed.test.js +416 -190
- package/dist/operations/get-feed.test.js.map +1 -1
- package/dist/operations/get-post-engagers.d.ts +6 -3
- package/dist/operations/get-post-engagers.d.ts.map +1 -1
- package/dist/operations/get-post-engagers.js +278 -78
- package/dist/operations/get-post-engagers.js.map +1 -1
- package/dist/operations/get-post-engagers.test.js +292 -14
- package/dist/operations/get-post-engagers.test.js.map +1 -1
- package/dist/operations/get-post-stats.d.ts +8 -3
- package/dist/operations/get-post-stats.d.ts.map +1 -1
- package/dist/operations/get-post-stats.js +101 -37
- package/dist/operations/get-post-stats.js.map +1 -1
- package/dist/operations/get-post-stats.test.js +137 -2
- package/dist/operations/get-post-stats.test.js.map +1 -1
- package/dist/operations/get-post.d.ts +9 -150
- package/dist/operations/get-post.d.ts.map +1 -1
- package/dist/operations/get-post.js +356 -210
- package/dist/operations/get-post.js.map +1 -1
- package/dist/operations/get-post.test.js +210 -387
- package/dist/operations/get-post.test.js.map +1 -1
- package/dist/operations/get-profile-activity.d.ts +13 -92
- package/dist/operations/get-profile-activity.d.ts.map +1 -1
- package/dist/operations/get-profile-activity.js +305 -105
- package/dist/operations/get-profile-activity.js.map +1 -1
- package/dist/operations/get-profile-activity.test.js +277 -158
- package/dist/operations/get-profile-activity.test.js.map +1 -1
- package/dist/operations/get-throttle-status.d.ts +1 -1
- package/dist/operations/get-throttle-status.d.ts.map +1 -1
- package/dist/operations/get-throttle-status.js +4 -10
- package/dist/operations/get-throttle-status.js.map +1 -1
- package/dist/operations/import-people-from-collection.d.ts +1 -1
- package/dist/operations/import-people-from-collection.d.ts.map +1 -1
- package/dist/operations/import-people-from-collection.js +3 -6
- package/dist/operations/import-people-from-collection.js.map +1 -1
- package/dist/operations/import-people-from-urls.d.ts +1 -1
- package/dist/operations/import-people-from-urls.d.ts.map +1 -1
- package/dist/operations/import-people-from-urls.js +3 -6
- package/dist/operations/import-people-from-urls.js.map +1 -1
- package/dist/operations/index.d.ts +2 -2
- package/dist/operations/index.d.ts.map +1 -1
- package/dist/operations/index.js +2 -1
- package/dist/operations/index.js.map +1 -1
- package/dist/operations/like-person-posts.test.d.ts +2 -0
- package/dist/operations/like-person-posts.test.d.ts.map +1 -0
- package/dist/operations/like-person-posts.test.js +103 -0
- package/dist/operations/like-person-posts.test.js.map +1 -0
- package/dist/operations/list-collections.d.ts +1 -1
- package/dist/operations/list-collections.d.ts.map +1 -1
- package/dist/operations/list-collections.js +3 -6
- package/dist/operations/list-collections.js.map +1 -1
- package/dist/operations/message-person.test.d.ts +2 -0
- package/dist/operations/message-person.test.d.ts.map +1 -0
- package/dist/operations/message-person.test.js +108 -0
- package/dist/operations/message-person.test.js.map +1 -0
- package/dist/operations/navigate-away.d.ts +14 -0
- package/dist/operations/navigate-away.d.ts.map +1 -0
- package/dist/operations/navigate-away.js +24 -0
- package/dist/operations/navigate-away.js.map +1 -0
- package/dist/operations/navigate-away.test.d.ts +2 -0
- package/dist/operations/navigate-away.test.d.ts.map +1 -0
- package/dist/operations/navigate-away.test.js +51 -0
- package/dist/operations/navigate-away.test.js.map +1 -0
- package/dist/operations/query-messages.d.ts +1 -1
- package/dist/operations/query-messages.d.ts.map +1 -1
- package/dist/operations/query-messages.js +3 -6
- package/dist/operations/query-messages.js.map +1 -1
- package/dist/operations/react-to-post.d.ts +16 -4
- package/dist/operations/react-to-post.d.ts.map +1 -1
- package/dist/operations/react-to-post.js +86 -24
- package/dist/operations/react-to-post.js.map +1 -1
- package/dist/operations/react-to-post.test.js +55 -5
- package/dist/operations/react-to-post.test.js.map +1 -1
- package/dist/operations/remove-connection.test.d.ts +2 -0
- package/dist/operations/remove-connection.test.d.ts.map +1 -0
- package/dist/operations/remove-connection.test.js +45 -0
- package/dist/operations/remove-connection.test.js.map +1 -0
- package/dist/operations/remove-people-from-collection.d.ts +1 -1
- package/dist/operations/remove-people-from-collection.d.ts.map +1 -1
- package/dist/operations/remove-people-from-collection.js +3 -6
- package/dist/operations/remove-people-from-collection.js.map +1 -1
- package/dist/operations/resolve-linkedin-entity.d.ts.map +1 -1
- package/dist/operations/resolve-linkedin-entity.js +2 -2
- package/dist/operations/resolve-linkedin-entity.js.map +1 -1
- package/dist/operations/resolve-linkedin-entity.test.d.ts +2 -0
- package/dist/operations/resolve-linkedin-entity.test.d.ts.map +1 -0
- package/dist/operations/resolve-linkedin-entity.test.js +343 -0
- package/dist/operations/resolve-linkedin-entity.test.js.map +1 -0
- package/dist/operations/scrape-messaging-history.d.ts +2 -1
- package/dist/operations/scrape-messaging-history.d.ts.map +1 -1
- package/dist/operations/scrape-messaging-history.js +113 -18
- package/dist/operations/scrape-messaging-history.js.map +1 -1
- package/dist/operations/scrape-messaging-history.test.js +109 -12
- package/dist/operations/scrape-messaging-history.test.js.map +1 -1
- package/dist/operations/search-posts.d.ts +20 -112
- package/dist/operations/search-posts.d.ts.map +1 -1
- package/dist/operations/search-posts.js +369 -170
- package/dist/operations/search-posts.js.map +1 -1
- package/dist/operations/search-posts.test.js +273 -234
- package/dist/operations/search-posts.test.js.map +1 -1
- package/dist/operations/send-inmail.test.d.ts +2 -0
- package/dist/operations/send-inmail.test.d.ts.map +1 -0
- package/dist/operations/send-inmail.test.js +108 -0
- package/dist/operations/send-inmail.test.js.map +1 -0
- package/dist/operations/send-invite.test.d.ts +2 -0
- package/dist/operations/send-invite.test.d.ts.map +1 -0
- package/dist/operations/send-invite.test.js +59 -0
- package/dist/operations/send-invite.test.js.map +1 -0
- package/dist/operations/types.d.ts +27 -1
- package/dist/operations/types.d.ts.map +1 -1
- package/dist/operations/types.js +14 -1
- package/dist/operations/types.js.map +1 -1
- package/dist/operations/visit-profile.d.ts +1 -1
- package/dist/operations/visit-profile.d.ts.map +1 -1
- package/dist/operations/visit-profile.js +3 -6
- package/dist/operations/visit-profile.js.map +1 -1
- package/dist/services/account-resolution.d.ts +10 -4
- package/dist/services/account-resolution.d.ts.map +1 -1
- package/dist/services/account-resolution.js +63 -5
- package/dist/services/account-resolution.js.map +1 -1
- package/dist/services/app.d.ts +6 -2
- package/dist/services/app.d.ts.map +1 -1
- package/dist/services/app.js +18 -6
- package/dist/services/app.js.map +1 -1
- package/dist/services/app.test.js +41 -7
- package/dist/services/app.test.js.map +1 -1
- package/dist/services/campaign.d.ts +40 -4
- package/dist/services/campaign.d.ts.map +1 -1
- package/dist/services/campaign.js +176 -10
- 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/errors.d.ts +2 -1
- package/dist/services/errors.d.ts.map +1 -1
- package/dist/services/errors.js +6 -3
- package/dist/services/errors.js.map +1 -1
- package/dist/services/index.d.ts +1 -2
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +1 -2
- package/dist/services/index.js.map +1 -1
- package/dist/services/instance-context.d.ts +5 -1
- package/dist/services/instance-context.d.ts.map +1 -1
- package/dist/services/instance-context.js +87 -28
- package/dist/services/instance-context.js.map +1 -1
- package/dist/services/instance-context.test.js +5 -1
- package/dist/services/instance-context.test.js.map +1 -1
- package/dist/services/instance-lifecycle.d.ts.map +1 -1
- package/dist/services/instance-lifecycle.js +32 -1
- package/dist/services/instance-lifecycle.js.map +1 -1
- package/dist/services/instance-lifecycle.test.js +52 -1
- package/dist/services/instance-lifecycle.test.js.map +1 -1
- package/dist/services/instance.d.ts +37 -9
- package/dist/services/instance.d.ts.map +1 -1
- package/dist/services/instance.js +100 -25
- package/dist/services/instance.js.map +1 -1
- package/dist/services/instance.test.js +157 -0
- package/dist/services/instance.test.js.map +1 -1
- package/dist/services/launcher.d.ts +47 -3
- package/dist/services/launcher.d.ts.map +1 -1
- package/dist/services/launcher.js +205 -33
- package/dist/services/launcher.js.map +1 -1
- package/dist/services/launcher.test.js +133 -6
- package/dist/services/launcher.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/services/status.d.ts +6 -2
- package/dist/services/status.d.ts.map +1 -1
- package/dist/services/status.js +67 -34
- package/dist/services/status.js.map +1 -1
- package/dist/services/status.test.js +9 -2
- package/dist/services/status.test.js.map +1 -1
- package/dist/testing/e2e-helpers.d.ts +47 -1
- package/dist/testing/e2e-helpers.d.ts.map +1 -1
- package/dist/testing/e2e-helpers.js +244 -7
- 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/account.d.ts +1 -1
- package/dist/types/campaign.d.ts +1 -1
- package/dist/types/campaign.d.ts.map +1 -1
- package/dist/types/feed.d.ts +1 -3
- package/dist/types/feed.d.ts.map +1 -1
- package/dist/types/index.d.ts +0 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/cdp-port.d.ts.map +1 -1
- package/dist/utils/cdp-port.js +3 -1
- package/dist/utils/cdp-port.js.map +1 -1
- package/dist/utils/cdp-port.test.js +1 -1
- package/dist/utils/cdp-port.test.js.map +1 -1
- package/dist/utils/delay.d.ts +79 -0
- package/dist/utils/delay.d.ts.map +1 -1
- package/dist/utils/delay.js +118 -0
- package/dist/utils/delay.js.map +1 -1
- package/dist/utils/delay.test.js +111 -1
- package/dist/utils/delay.test.js.map +1 -1
- package/dist/utils/index.d.ts +2 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/session-pacer.d.ts +27 -0
- package/dist/utils/session-pacer.d.ts.map +1 -0
- package/dist/utils/session-pacer.js +55 -0
- package/dist/utils/session-pacer.js.map +1 -0
- package/dist/utils/session-pacer.test.d.ts +2 -0
- package/dist/utils/session-pacer.test.d.ts.map +1 -0
- package/dist/utils/session-pacer.test.js +111 -0
- package/dist/utils/session-pacer.test.js.map +1 -0
- package/package.json +1 -1
- package/dist/linkedin/__tests__/selectors.integration.test.d.ts +0 -2
- package/dist/linkedin/__tests__/selectors.integration.test.d.ts.map +0 -1
- package/dist/linkedin/__tests__/selectors.integration.test.js +0 -258
- package/dist/linkedin/__tests__/selectors.integration.test.js.map +0 -1
- package/dist/types/search-posts.d.ts +0 -22
- package/dist/types/search-posts.d.ts.map +0 -1
- package/dist/types/search-posts.js +0 -4
- package/dist/types/search-posts.js.map +0 -1
- package/dist/voyager/index.d.ts +0 -2
- package/dist/voyager/index.d.ts.map +0 -1
- package/dist/voyager/index.js +0 -4
- package/dist/voyager/index.js.map +0 -1
- package/dist/voyager/interceptor.d.ts +0 -100
- package/dist/voyager/interceptor.d.ts.map +0 -1
- package/dist/voyager/interceptor.integration.test.d.ts +0 -2
- package/dist/voyager/interceptor.integration.test.d.ts.map +0 -1
- package/dist/voyager/interceptor.integration.test.js +0 -89
- package/dist/voyager/interceptor.integration.test.js.map +0 -1
- package/dist/voyager/interceptor.js +0 -235
- package/dist/voyager/interceptor.js.map +0 -1
- package/dist/voyager/interceptor.test.d.ts +0 -2
- package/dist/voyager/interceptor.test.d.ts.map +0 -1
- package/dist/voyager/interceptor.test.js +0 -372
- package/dist/voyager/interceptor.test.js.map +0 -1
|
@@ -1,35 +1,162 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
2
|
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
3
|
import { CDPEvaluationError, CDPTimeoutError } from "../cdp/errors.js";
|
|
4
|
-
import { delay } from "../utils/delay.js";
|
|
4
|
+
import { delay, gaussianBetween, gaussianDelay, randomBetween } from "../utils/delay.js";
|
|
5
5
|
/** Default timeout for DOM operations (ms). */
|
|
6
6
|
const DEFAULT_TIMEOUT = 30_000;
|
|
7
7
|
/** Default polling interval for waitForElement (ms). */
|
|
8
8
|
const DEFAULT_POLL_INTERVAL = 100;
|
|
9
|
-
/**
|
|
10
|
-
const
|
|
11
|
-
/**
|
|
12
|
-
|
|
9
|
+
/** Probability of a micro-hesitation between keystrokes. */
|
|
10
|
+
const MICRO_HESITATION_PROBABILITY = 0.05;
|
|
11
|
+
/**
|
|
12
|
+
* Map a character to its physical key code and Windows virtual key code.
|
|
13
|
+
*
|
|
14
|
+
* Covers ASCII letters, digits, common punctuation, and special keys
|
|
15
|
+
* (space, enter, tab, backspace, escape). Returns `undefined` for
|
|
16
|
+
* unmapped characters — the event still fires, just without enrichment.
|
|
17
|
+
*/
|
|
18
|
+
function getKeyCodeInfo(char) {
|
|
19
|
+
// Letters a-z / A-Z
|
|
20
|
+
const lower = char.toLowerCase();
|
|
21
|
+
if (lower >= "a" && lower <= "z") {
|
|
22
|
+
const vk = 65 + lower.charCodeAt(0) - "a".charCodeAt(0);
|
|
23
|
+
return { code: `Key${lower.toUpperCase()}`, windowsVirtualKeyCode: vk };
|
|
24
|
+
}
|
|
25
|
+
// Digits 0-9
|
|
26
|
+
if (char >= "0" && char <= "9") {
|
|
27
|
+
const vk = 48 + char.charCodeAt(0) - "0".charCodeAt(0);
|
|
28
|
+
return { code: `Digit${char}`, windowsVirtualKeyCode: vk };
|
|
29
|
+
}
|
|
30
|
+
// Special keys and punctuation
|
|
31
|
+
const special = {
|
|
32
|
+
" ": { code: "Space", windowsVirtualKeyCode: 32 },
|
|
33
|
+
"\n": { code: "Enter", windowsVirtualKeyCode: 13 },
|
|
34
|
+
"\r": { code: "Enter", windowsVirtualKeyCode: 13 },
|
|
35
|
+
"\t": { code: "Tab", windowsVirtualKeyCode: 9 },
|
|
36
|
+
"-": { code: "Minus", windowsVirtualKeyCode: 189 },
|
|
37
|
+
"=": { code: "Equal", windowsVirtualKeyCode: 187 },
|
|
38
|
+
"[": { code: "BracketLeft", windowsVirtualKeyCode: 219 },
|
|
39
|
+
"]": { code: "BracketRight", windowsVirtualKeyCode: 221 },
|
|
40
|
+
"\\": { code: "Backslash", windowsVirtualKeyCode: 220 },
|
|
41
|
+
";": { code: "Semicolon", windowsVirtualKeyCode: 186 },
|
|
42
|
+
"'": { code: "Quote", windowsVirtualKeyCode: 222 },
|
|
43
|
+
",": { code: "Comma", windowsVirtualKeyCode: 188 },
|
|
44
|
+
".": { code: "Period", windowsVirtualKeyCode: 190 },
|
|
45
|
+
"/": { code: "Slash", windowsVirtualKeyCode: 191 },
|
|
46
|
+
"`": { code: "Backquote", windowsVirtualKeyCode: 192 },
|
|
47
|
+
};
|
|
48
|
+
return special[char];
|
|
49
|
+
}
|
|
13
50
|
/**
|
|
14
51
|
* Poll the DOM until an element matching the selector appears.
|
|
15
52
|
*
|
|
53
|
+
* When a {@link HumanizedMouse} is provided, tiny idle mouse movements
|
|
54
|
+
* (1–5 px) are dispatched on ~20% of poll cycles once the wait exceeds
|
|
55
|
+
* 500 ms. This prevents the cursor from remaining perfectly still
|
|
56
|
+
* during long element waits — a detectable automation fingerprint.
|
|
57
|
+
*
|
|
16
58
|
* @param client - Connected CDP client targeting the page.
|
|
17
59
|
* @param selector - CSS selector to query.
|
|
18
60
|
* @param options - Timeout and polling interval.
|
|
61
|
+
* @param mouse - Optional humanized mouse (enables idle drift).
|
|
19
62
|
* @throws {CDPTimeoutError} If the element does not appear within the timeout.
|
|
20
63
|
*/
|
|
21
|
-
export async function waitForElement(client, selector, options) {
|
|
64
|
+
export async function waitForElement(client, selector, options, mouse) {
|
|
22
65
|
const timeout = options?.timeout ?? DEFAULT_TIMEOUT;
|
|
23
66
|
const pollInterval = options?.pollInterval ?? DEFAULT_POLL_INTERVAL;
|
|
24
67
|
const deadline = Date.now() + timeout;
|
|
68
|
+
const startTime = Date.now();
|
|
69
|
+
// Last known cursor position for idle drift (lazy-initialised)
|
|
70
|
+
let driftX = -1;
|
|
71
|
+
let driftY = -1;
|
|
72
|
+
let viewportW = 0;
|
|
73
|
+
let viewportH = 0;
|
|
25
74
|
while (Date.now() < deadline) {
|
|
26
75
|
const found = await client.evaluate(`document.querySelector(${JSON.stringify(selector)}) !== null`);
|
|
27
76
|
if (found)
|
|
28
77
|
return;
|
|
78
|
+
// Idle mouse drift: after 500 ms of waiting, 20% of poll cycles
|
|
79
|
+
// move the cursor by 1–5 px to avoid a perfectly still cursor.
|
|
80
|
+
// Uses mouse.move() to keep VirtualMouse position in sync.
|
|
81
|
+
if (mouse?.isAvailable && Date.now() - startTime > 500 && Math.random() < 0.2) {
|
|
82
|
+
if (driftX < 0) {
|
|
83
|
+
try {
|
|
84
|
+
const pos = await mouse.position();
|
|
85
|
+
driftX = pos.x;
|
|
86
|
+
driftY = pos.y;
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// Ignored — fall through to viewport center default
|
|
90
|
+
}
|
|
91
|
+
const size = await client.evaluate(`({ w: window.innerWidth, h: window.innerHeight })`);
|
|
92
|
+
viewportW = size.w;
|
|
93
|
+
viewportH = size.h;
|
|
94
|
+
if (driftX < 0) {
|
|
95
|
+
driftX = Math.round(viewportW / 2);
|
|
96
|
+
driftY = Math.round(viewportH / 2);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Guaranteed non-zero magnitude (1–5 px), random direction
|
|
100
|
+
const magX = Math.round(randomBetween(1, 5));
|
|
101
|
+
const magY = Math.round(randomBetween(1, 5));
|
|
102
|
+
const offsetX = (Math.random() < 0.5 ? -1 : 1) * magX;
|
|
103
|
+
const offsetY = (Math.random() < 0.5 ? -1 : 1) * magY;
|
|
104
|
+
// Clamp to viewport bounds
|
|
105
|
+
driftX = Math.max(0, Math.min(viewportW - 1, driftX + offsetX));
|
|
106
|
+
driftY = Math.max(0, Math.min(viewportH - 1, driftY + offsetY));
|
|
107
|
+
await mouse.move(driftX, driftY);
|
|
108
|
+
}
|
|
29
109
|
await delay(pollInterval);
|
|
30
110
|
}
|
|
31
111
|
throw new CDPTimeoutError(`Timed out waiting for element "${selector}" after ${timeout.toString()}ms`);
|
|
32
112
|
}
|
|
113
|
+
/**
|
|
114
|
+
* Wait until the DOM stops mutating for `quietMs` milliseconds.
|
|
115
|
+
*
|
|
116
|
+
* Installs a `MutationObserver` via `Runtime.evaluate` that tracks
|
|
117
|
+
* the timestamp of the last mutation. Polls until no mutations have
|
|
118
|
+
* occurred for the configured quiet period, then adds a "visual
|
|
119
|
+
* scanning" Gaussian delay to simulate a human pausing to read.
|
|
120
|
+
*
|
|
121
|
+
* @param client - Connected CDP client targeting the page.
|
|
122
|
+
* @param quietMs - Milliseconds of mutation silence required (default: 500).
|
|
123
|
+
*/
|
|
124
|
+
export async function waitForDOMStable(client, quietMs = 500) {
|
|
125
|
+
// Install a MutationObserver that stamps window.__lhLastMutation on every DOM change
|
|
126
|
+
await client.evaluate(`(() => {
|
|
127
|
+
window.__lhLastMutation = Date.now();
|
|
128
|
+
const observer = new MutationObserver(() => {
|
|
129
|
+
window.__lhLastMutation = Date.now();
|
|
130
|
+
});
|
|
131
|
+
observer.observe(document.body, {
|
|
132
|
+
childList: true,
|
|
133
|
+
subtree: true,
|
|
134
|
+
attributes: true,
|
|
135
|
+
characterData: true,
|
|
136
|
+
});
|
|
137
|
+
window.__lhDOMObserver = observer;
|
|
138
|
+
})()`);
|
|
139
|
+
// Poll until the DOM has been quiet for quietMs
|
|
140
|
+
const pollInterval = 100;
|
|
141
|
+
const maxWait = 30_000;
|
|
142
|
+
const deadline = Date.now() + maxWait;
|
|
143
|
+
while (Date.now() < deadline) {
|
|
144
|
+
const elapsed = await client.evaluate(`Date.now() - (window.__lhLastMutation || 0)`);
|
|
145
|
+
if (elapsed >= quietMs)
|
|
146
|
+
break;
|
|
147
|
+
await delay(pollInterval);
|
|
148
|
+
}
|
|
149
|
+
// Disconnect the observer
|
|
150
|
+
await client.evaluate(`(() => {
|
|
151
|
+
if (window.__lhDOMObserver) {
|
|
152
|
+
window.__lhDOMObserver.disconnect();
|
|
153
|
+
delete window.__lhDOMObserver;
|
|
154
|
+
delete window.__lhLastMutation;
|
|
155
|
+
}
|
|
156
|
+
})()`);
|
|
157
|
+
// Simulate "visual scanning" — a human pausing to read the page
|
|
158
|
+
await gaussianDelay(1_200, 400, 600, 2_500);
|
|
159
|
+
}
|
|
33
160
|
/**
|
|
34
161
|
* Scroll the page until the target element is visible in the viewport.
|
|
35
162
|
*
|
|
@@ -52,26 +179,33 @@ export async function scrollTo(client, selector) {
|
|
|
52
179
|
}
|
|
53
180
|
}
|
|
54
181
|
/**
|
|
55
|
-
* Trigger a hover on an element
|
|
182
|
+
* Trigger a hover on an element via CDP `Input.dispatchMouseEvent`.
|
|
56
183
|
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
184
|
+
* Computes the element's center coordinates and dispatches a single
|
|
185
|
+
* `mouseMoved` event through the CDP Input domain. This is required
|
|
186
|
+
* to reveal hover-dependent UI such as the LinkedIn reactions popup,
|
|
187
|
+
* which does not respond to synthetic JS `mouseenter`/`mouseover`.
|
|
59
188
|
*
|
|
60
189
|
* @param client - Connected CDP client targeting the page.
|
|
61
190
|
* @param selector - CSS selector for the element to hover.
|
|
62
191
|
* @throws {CDPEvaluationError} If the element is not found.
|
|
63
192
|
*/
|
|
64
193
|
export async function hover(client, selector) {
|
|
65
|
-
const
|
|
194
|
+
const center = await client.evaluate(`(() => {
|
|
66
195
|
const el = document.querySelector(${JSON.stringify(selector)});
|
|
67
|
-
if (!el) return
|
|
68
|
-
el.
|
|
69
|
-
el.
|
|
70
|
-
return
|
|
196
|
+
if (!el) return null;
|
|
197
|
+
el.scrollIntoView({ block: "center", behavior: "instant" });
|
|
198
|
+
const r = el.getBoundingClientRect();
|
|
199
|
+
return { x: Math.round(r.x + r.width / 2), y: Math.round(r.y + r.height / 2) };
|
|
71
200
|
})()`);
|
|
72
|
-
if (!
|
|
201
|
+
if (!center) {
|
|
73
202
|
throw new CDPEvaluationError(`Element "${selector}" not found for hover`);
|
|
74
203
|
}
|
|
204
|
+
await client.send("Input.dispatchMouseEvent", {
|
|
205
|
+
type: "mouseMoved",
|
|
206
|
+
x: center.x,
|
|
207
|
+
y: center.y,
|
|
208
|
+
});
|
|
75
209
|
}
|
|
76
210
|
/**
|
|
77
211
|
* Click an element via its JavaScript `.click()` method.
|
|
@@ -98,8 +232,14 @@ export async function click(client, selector) {
|
|
|
98
232
|
* Type text into a focused element character-by-character.
|
|
99
233
|
*
|
|
100
234
|
* The element is focused first, then each character is dispatched via
|
|
101
|
-
* CDP `Input.dispatchKeyEvent` with
|
|
102
|
-
*
|
|
235
|
+
* CDP `Input.dispatchKeyEvent` with character-context-aware Gaussian
|
|
236
|
+
* delays to approximate human typing cadence:
|
|
237
|
+
*
|
|
238
|
+
* - **Intra-word** (letters, digits): ~65 ms mean — fast, rhythmic typing
|
|
239
|
+
* - **Word boundary** (space): ~180 ms mean — natural pause between words
|
|
240
|
+
* - **Sentence boundary** (space after `.!?`): ~350 ms mean — thinking pause
|
|
241
|
+
* - **Paragraph boundary** (newline): ~700 ms mean — composing the next thought
|
|
242
|
+
* - **Micro-hesitation** (5% per character): ~300 ms extra — brief mid-word thinking
|
|
103
243
|
*
|
|
104
244
|
* @param client - Connected CDP client targeting the page.
|
|
105
245
|
* @param selector - CSS selector for the input element.
|
|
@@ -118,22 +258,357 @@ export async function typeText(client, selector, text, method = "type") {
|
|
|
118
258
|
throw new CDPEvaluationError(`Element "${selector}" not found for typeText`);
|
|
119
259
|
}
|
|
120
260
|
switch (method) {
|
|
121
|
-
case "type":
|
|
261
|
+
case "type": {
|
|
262
|
+
let previousChar = "";
|
|
122
263
|
for (const char of text) {
|
|
264
|
+
const kc = getKeyCodeInfo(char);
|
|
123
265
|
await client.send("Input.dispatchKeyEvent", {
|
|
124
266
|
type: "keyDown",
|
|
125
267
|
key: char,
|
|
126
268
|
text: char,
|
|
269
|
+
...(kc && { code: kc.code, windowsVirtualKeyCode: kc.windowsVirtualKeyCode }),
|
|
127
270
|
});
|
|
128
271
|
await client.send("Input.dispatchKeyEvent", {
|
|
129
272
|
type: "keyUp",
|
|
130
273
|
key: char,
|
|
274
|
+
...(kc && { code: kc.code, windowsVirtualKeyCode: kc.windowsVirtualKeyCode }),
|
|
131
275
|
});
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
276
|
+
// Character-aware delay
|
|
277
|
+
if (char === "\n") {
|
|
278
|
+
await gaussianDelay(700, 300, 300, 1_500);
|
|
279
|
+
}
|
|
280
|
+
else if (char === " " && /[.!?]/.test(previousChar)) {
|
|
281
|
+
await gaussianDelay(350, 120, 150, 800);
|
|
282
|
+
}
|
|
283
|
+
else if (char === " ") {
|
|
284
|
+
await gaussianDelay(180, 50, 100, 350);
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
await gaussianDelay(65, 20, 30, 120);
|
|
288
|
+
}
|
|
289
|
+
// Micro-hesitation (5%)
|
|
290
|
+
if (Math.random() < MICRO_HESITATION_PROBABILITY) {
|
|
291
|
+
await gaussianDelay(300, 100, 150, 600);
|
|
292
|
+
}
|
|
293
|
+
previousChar = char;
|
|
135
294
|
}
|
|
136
295
|
break;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Get the bounding rect of a DOM element selected by CSS selector.
|
|
301
|
+
*
|
|
302
|
+
* @returns `null` if the element is not found.
|
|
303
|
+
*/
|
|
304
|
+
export async function getElementBounds(client, selector) {
|
|
305
|
+
return client.evaluate(`(() => {
|
|
306
|
+
const el = document.querySelector(${JSON.stringify(selector)});
|
|
307
|
+
if (!el) return null;
|
|
308
|
+
const r = el.getBoundingClientRect();
|
|
309
|
+
return { top: r.top, bottom: r.bottom, height: r.height };
|
|
310
|
+
})()`);
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Get the bounding rect of the Nth element matching a CSS selector.
|
|
314
|
+
*
|
|
315
|
+
* Equivalent to `document.querySelectorAll(baseSelector)[index]`.
|
|
316
|
+
*
|
|
317
|
+
* @returns `null` if no element exists at the given index.
|
|
318
|
+
*/
|
|
319
|
+
export async function getElementBoundsByIndex(client, baseSelector, index) {
|
|
320
|
+
return client.evaluate(`(() => {
|
|
321
|
+
const els = document.querySelectorAll(${JSON.stringify(baseSelector)});
|
|
322
|
+
const el = els[${String(index)}];
|
|
323
|
+
if (!el) return null;
|
|
324
|
+
const r = el.getBoundingClientRect();
|
|
325
|
+
return { top: r.top, bottom: r.bottom, height: r.height };
|
|
326
|
+
})()`);
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Get the viewport height (`window.innerHeight`).
|
|
330
|
+
*/
|
|
331
|
+
export async function getViewportHeight(client) {
|
|
332
|
+
return client.evaluate(`window.innerHeight`);
|
|
333
|
+
}
|
|
334
|
+
// ---------------------------------------------------------------------------
|
|
335
|
+
// Humanized scroll-to-element
|
|
336
|
+
// ---------------------------------------------------------------------------
|
|
337
|
+
/**
|
|
338
|
+
* Internal: incremental scroll loop that centers an element in the viewport.
|
|
339
|
+
*
|
|
340
|
+
* @returns `true` if the element was centered within `maxIterations`.
|
|
341
|
+
*/
|
|
342
|
+
async function scrollToElementLoop(client, getBounds, mouse) {
|
|
343
|
+
const viewportHeight = await getViewportHeight(client);
|
|
344
|
+
const maxIterations = 10;
|
|
345
|
+
const tolerance = viewportHeight / 4;
|
|
346
|
+
for (let i = 0; i < maxIterations; i++) {
|
|
347
|
+
const bounds = await getBounds();
|
|
348
|
+
if (!bounds)
|
|
349
|
+
return false;
|
|
350
|
+
const elementCenter = bounds.top + bounds.height / 2;
|
|
351
|
+
const viewportCenter = viewportHeight / 2;
|
|
352
|
+
if (Math.abs(elementCenter - viewportCenter) <= tolerance) {
|
|
353
|
+
return true;
|
|
354
|
+
}
|
|
355
|
+
const deltaY = elementCenter - viewportCenter;
|
|
356
|
+
await humanizedScrollY(client, deltaY, 300, 400, mouse);
|
|
357
|
+
await gaussianDelay(300, 50, 200, 400);
|
|
358
|
+
}
|
|
359
|
+
return false;
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Scroll the page until the target element is centered in the viewport,
|
|
363
|
+
* using incremental humanized mouse-wheel strokes.
|
|
364
|
+
*
|
|
365
|
+
* When a {@link HumanizedMouse} is available, the cursor scrolls the page
|
|
366
|
+
* in small increments until the element's bounding rect is in the viewport
|
|
367
|
+
* center zone. Falls back to instant `scrollIntoView` otherwise.
|
|
368
|
+
*
|
|
369
|
+
* @param client - Connected CDP client targeting the page.
|
|
370
|
+
* @param selector - CSS selector for the element to scroll to.
|
|
371
|
+
* @param mouse - Optional humanized mouse instance.
|
|
372
|
+
*/
|
|
373
|
+
export async function humanizedScrollTo(client, selector, mouse) {
|
|
374
|
+
if (mouse?.isAvailable) {
|
|
375
|
+
const success = await scrollToElementLoop(client, () => getElementBounds(client, selector), mouse);
|
|
376
|
+
if (success)
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
await scrollTo(client, selector);
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Scroll the page until the Nth element matching a selector is centered,
|
|
383
|
+
* using incremental humanized mouse-wheel strokes.
|
|
384
|
+
*
|
|
385
|
+
* Falls back to instant `scrollIntoView` when humanized mouse is unavailable.
|
|
386
|
+
*
|
|
387
|
+
* @param client - Connected CDP client targeting the page.
|
|
388
|
+
* @param baseSelector - CSS selector matching multiple elements.
|
|
389
|
+
* @param index - Zero-based index into the matched elements.
|
|
390
|
+
* @param mouse - Optional humanized mouse instance.
|
|
391
|
+
*/
|
|
392
|
+
export async function humanizedScrollToByIndex(client, baseSelector, index, mouse) {
|
|
393
|
+
if (mouse?.isAvailable) {
|
|
394
|
+
const success = await scrollToElementLoop(client, () => getElementBoundsByIndex(client, baseSelector, index), mouse);
|
|
395
|
+
if (success)
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
// Fallback to instant scrollIntoView
|
|
399
|
+
await client.evaluate(`(() => {
|
|
400
|
+
const els = document.querySelectorAll(${JSON.stringify(baseSelector)});
|
|
401
|
+
const el = els[${String(index)}];
|
|
402
|
+
if (el) el.scrollIntoView({ behavior: "instant", block: "center" });
|
|
403
|
+
})()`);
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Get a jittered viewport-relative point near the center of a DOM element.
|
|
407
|
+
*
|
|
408
|
+
* A Gaussian offset is applied so the click target varies naturally within
|
|
409
|
+
* the element bounds, removing the dead-center automation fingerprint.
|
|
410
|
+
*
|
|
411
|
+
* @returns `null` if the element is not found.
|
|
412
|
+
*/
|
|
413
|
+
export async function getElementCenter(client, selector) {
|
|
414
|
+
const rect = await client.evaluate(`(() => {
|
|
415
|
+
const el = document.querySelector(${JSON.stringify(selector)});
|
|
416
|
+
if (!el) return null;
|
|
417
|
+
const r = el.getBoundingClientRect();
|
|
418
|
+
return { x: r.x, y: r.y, width: r.width, height: r.height };
|
|
419
|
+
})()`);
|
|
420
|
+
if (!rect)
|
|
421
|
+
return null;
|
|
422
|
+
const cx = rect.x + rect.width / 2;
|
|
423
|
+
const cy = rect.y + rect.height / 2;
|
|
424
|
+
const jx = cx + gaussianBetween(0, rect.width * 0.15, -rect.width * 0.4, rect.width * 0.4);
|
|
425
|
+
const jy = cy + gaussianBetween(0, rect.height * 0.15, -rect.height * 0.4, rect.height * 0.4);
|
|
426
|
+
const roundedJx = Math.round(jx);
|
|
427
|
+
const roundedJy = Math.round(jy);
|
|
428
|
+
const maxX = rect.width >= 1 ? rect.x + rect.width - 1 : rect.x;
|
|
429
|
+
const maxY = rect.height >= 1 ? rect.y + rect.height - 1 : rect.y;
|
|
430
|
+
return {
|
|
431
|
+
x: Math.max(rect.x, Math.min(maxX, roundedJx)),
|
|
432
|
+
y: Math.max(rect.y, Math.min(maxY, roundedJy)),
|
|
433
|
+
};
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
436
|
+
* Scroll the element toward the viewport center if it sits in the outer
|
|
437
|
+
* 20% of the visible area. This mimics a human scrolling a bit to see
|
|
438
|
+
* the target more comfortably before clicking.
|
|
439
|
+
*
|
|
440
|
+
* @internal
|
|
441
|
+
*/
|
|
442
|
+
async function viewportComfortZone(client, selector, mouse) {
|
|
443
|
+
const viewportHeight = await getViewportHeight(client);
|
|
444
|
+
// Use the raw bounding-rect center (not the jittered getElementCenter)
|
|
445
|
+
// so the comfort-zone check is deterministic and not affected by jitter.
|
|
446
|
+
const rect = await client.evaluate(`(() => {
|
|
447
|
+
const el = document.querySelector(${JSON.stringify(selector)});
|
|
448
|
+
if (!el) return null;
|
|
449
|
+
const r = el.getBoundingClientRect();
|
|
450
|
+
return { x: r.x, y: r.y, width: r.width, height: r.height };
|
|
451
|
+
})()`);
|
|
452
|
+
if (!rect)
|
|
453
|
+
return;
|
|
454
|
+
const centerX = rect.x + rect.width / 2;
|
|
455
|
+
const centerY = rect.y + rect.height / 2;
|
|
456
|
+
if (centerY < viewportHeight * 0.2 || centerY > viewportHeight * 0.8) {
|
|
457
|
+
const deltaY = centerY - viewportHeight / 2;
|
|
458
|
+
await humanizedScrollY(client, deltaY * 0.5, centerX, centerY, mouse);
|
|
459
|
+
await gaussianDelay(300, 100, 150, 600);
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* Click an element with humanized mouse movement when available.
|
|
464
|
+
*
|
|
465
|
+
* When a {@link HumanizedMouse} is provided and available, the cursor
|
|
466
|
+
* follows a Bezier path to the element center before clicking. The
|
|
467
|
+
* VirtualMouse dispatches `mousePressed` / `mouseReleased` via CDP.
|
|
468
|
+
*
|
|
469
|
+
* **Pre-focus hover** (60% probability, HumanizedMouse only): before
|
|
470
|
+
* clicking, the cursor first moves to a point 20–50 px from the target,
|
|
471
|
+
* pauses briefly to simulate visual scanning, then proceeds to the
|
|
472
|
+
* target — a two-phase approach that mimics how a human visually locates
|
|
473
|
+
* a button before moving to click it.
|
|
474
|
+
*
|
|
475
|
+
* **Viewport comfort zone**: if the target sits in the outer 20% of the
|
|
476
|
+
* viewport, a small scroll brings it more central before interacting.
|
|
477
|
+
*
|
|
478
|
+
* Falls back to the standard JS `.click()` when humanized mouse is
|
|
479
|
+
* unavailable (or the element cannot be located by bounding rect).
|
|
480
|
+
*
|
|
481
|
+
* @param client - Connected CDP client targeting the LinkedIn page.
|
|
482
|
+
* @param selector - CSS selector for the element to click.
|
|
483
|
+
* @param mouse - Optional humanized mouse instance.
|
|
484
|
+
*/
|
|
485
|
+
export async function humanizedClick(client, selector, mouse) {
|
|
486
|
+
// Viewport comfort zone: scroll element toward center if near edges
|
|
487
|
+
await viewportComfortZone(client, selector, mouse);
|
|
488
|
+
await gaussianDelay(25, 12, 0, 50); // Pre-click approach hesitation
|
|
489
|
+
if (mouse?.isAvailable) {
|
|
490
|
+
const center = await getElementCenter(client, selector);
|
|
491
|
+
if (center) {
|
|
492
|
+
// Pre-focus hover: 60% of the time, approach via a nearby point first
|
|
493
|
+
if (Math.random() < 0.6) {
|
|
494
|
+
const angle = Math.random() * 2 * Math.PI;
|
|
495
|
+
const radius = randomBetween(20, 50);
|
|
496
|
+
const nearX = Math.round(center.x + Math.cos(angle) * radius);
|
|
497
|
+
const nearY = Math.round(center.y + Math.sin(angle) * radius);
|
|
498
|
+
await mouse.move(nearX, nearY);
|
|
499
|
+
await gaussianDelay(180, 60, 80, 400); // Visual scanning pause
|
|
500
|
+
}
|
|
501
|
+
await mouse.click(center.x, center.y);
|
|
502
|
+
await gaussianDelay(100, 25, 50, 150); // Post-click visual confirmation
|
|
503
|
+
return;
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
// Fallback: simulate mouse movement path before JS click
|
|
507
|
+
const center = await getElementCenter(client, selector);
|
|
508
|
+
if (center) {
|
|
509
|
+
const viewportSize = await client.evaluate(`({ w: window.innerWidth, h: window.innerHeight })`);
|
|
510
|
+
// Random starting position within the viewport
|
|
511
|
+
const startX = Math.round(Math.random() * viewportSize.w);
|
|
512
|
+
const startY = Math.round(Math.random() * viewportSize.h);
|
|
513
|
+
const steps = Math.round(gaussianBetween(4, 0.7, 3, 5));
|
|
514
|
+
for (let i = 1; i <= steps; i++) {
|
|
515
|
+
const t = i / steps;
|
|
516
|
+
const baseX = startX + (center.x - startX) * t;
|
|
517
|
+
const baseY = startY + (center.y - startY) * t;
|
|
518
|
+
// Add random offset to intermediate points, not the final point
|
|
519
|
+
const offsetX = i < steps ? Math.round(gaussianBetween(0, 10, -20, 20)) : 0;
|
|
520
|
+
const offsetY = i < steps ? Math.round(gaussianBetween(0, 10, -20, 20)) : 0;
|
|
521
|
+
await client.send("Input.dispatchMouseEvent", {
|
|
522
|
+
type: "mouseMoved",
|
|
523
|
+
x: Math.round(baseX) + offsetX,
|
|
524
|
+
y: Math.round(baseY) + offsetY,
|
|
525
|
+
});
|
|
526
|
+
await gaussianDelay(25, 10, 10, 50);
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
await click(client, selector);
|
|
530
|
+
await gaussianDelay(100, 25, 50, 150); // Post-click visual confirmation
|
|
531
|
+
}
|
|
532
|
+
/**
|
|
533
|
+
* Hover over an element with humanized mouse movement when available.
|
|
534
|
+
*
|
|
535
|
+
* When a {@link HumanizedMouse} is provided, the cursor physically
|
|
536
|
+
* moves to the element center via Bézier-path movement with jitter,
|
|
537
|
+
* which is more realistic than a single CDP `mouseMoved` event.
|
|
538
|
+
*
|
|
539
|
+
* Falls back to {@link hover} (single CDP `Input.dispatchMouseEvent`)
|
|
540
|
+
* when unavailable.
|
|
541
|
+
*
|
|
542
|
+
* @param client - Connected CDP client targeting the LinkedIn page.
|
|
543
|
+
* @param selector - CSS selector for the element to hover.
|
|
544
|
+
* @param mouse - Optional humanized mouse instance.
|
|
545
|
+
*/
|
|
546
|
+
export async function humanizedHover(client, selector, mouse) {
|
|
547
|
+
await gaussianDelay(25, 12, 0, 50); // Pre-hover approach hesitation
|
|
548
|
+
if (mouse?.isAvailable) {
|
|
549
|
+
const center = await getElementCenter(client, selector);
|
|
550
|
+
if (center) {
|
|
551
|
+
await mouse.move(center.x, center.y);
|
|
552
|
+
return;
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
// Fallback to CDP hover
|
|
556
|
+
await hover(client, selector);
|
|
557
|
+
}
|
|
558
|
+
/**
|
|
559
|
+
* Scroll the page vertically with humanized mouse-wheel strokes.
|
|
560
|
+
*
|
|
561
|
+
* When a {@link HumanizedMouse} is provided, scrolling is emulated as
|
|
562
|
+
* incremental wheel strokes (150 px / 25 ms) at the given position,
|
|
563
|
+
* matching the behavior of a physical mouse wheel.
|
|
564
|
+
*
|
|
565
|
+
* Falls back to a single CDP `mouseWheel` event when unavailable.
|
|
566
|
+
*
|
|
567
|
+
* @param client - Connected CDP client targeting the LinkedIn page.
|
|
568
|
+
* @param deltaY - Pixels to scroll (positive = down).
|
|
569
|
+
* @param x - Viewport X coordinate for the scroll position.
|
|
570
|
+
* @param y - Viewport Y coordinate for the scroll position.
|
|
571
|
+
* @param mouse - Optional humanized mouse instance.
|
|
572
|
+
*/
|
|
573
|
+
export async function humanizedScrollY(client, deltaY, x, y, mouse) {
|
|
574
|
+
if (mouse?.isAvailable) {
|
|
575
|
+
await mouse.scrollY(deltaY, x, y);
|
|
576
|
+
return;
|
|
577
|
+
}
|
|
578
|
+
// Fallback to a single CDP scroll event
|
|
579
|
+
await client.send("Input.dispatchMouseEvent", {
|
|
580
|
+
type: "mouseWheel",
|
|
581
|
+
x,
|
|
582
|
+
y,
|
|
583
|
+
deltaX: 0,
|
|
584
|
+
deltaY,
|
|
585
|
+
});
|
|
586
|
+
}
|
|
587
|
+
/**
|
|
588
|
+
* Retry an interaction function with escalating Gaussian-distributed
|
|
589
|
+
* delays between attempts.
|
|
590
|
+
*
|
|
591
|
+
* Wraps critical interaction sequences (click after scroll, hover after
|
|
592
|
+
* navigate) where elements may vanish due to React re-renders. Each
|
|
593
|
+
* retry waits progressively longer — `800 * (attempt + 1)` ms mean —
|
|
594
|
+
* giving the page time to stabilise.
|
|
595
|
+
*
|
|
596
|
+
* @param fn - The async interaction to attempt.
|
|
597
|
+
* @param maxAttempts - Maximum number of attempts (default: 2).
|
|
598
|
+
* @returns The result of the first successful attempt.
|
|
599
|
+
*/
|
|
600
|
+
export async function retryInteraction(fn, maxAttempts = 2) {
|
|
601
|
+
for (let i = 0; i < maxAttempts; i++) {
|
|
602
|
+
try {
|
|
603
|
+
return await fn();
|
|
604
|
+
}
|
|
605
|
+
catch (e) {
|
|
606
|
+
if (i === maxAttempts - 1)
|
|
607
|
+
throw e;
|
|
608
|
+
await gaussianDelay(800 * (i + 1), 300, 400, 2_000);
|
|
609
|
+
}
|
|
137
610
|
}
|
|
611
|
+
// Unreachable — the loop always returns or throws
|
|
612
|
+
throw new Error("unreachable");
|
|
138
613
|
}
|
|
139
614
|
//# sourceMappingURL=dom-automation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dom-automation.js","sourceRoot":"","sources":["../../src/linkedin/dom-automation.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dom-automation.js","sourceRoot":"","sources":["../../src/linkedin/dom-automation.ts"],"names":[],"mappings":"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"}
|