@lhremote/core 0.0.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/README.md +124 -0
- package/dist/cdp/app-discovery.d.ts +22 -0
- package/dist/cdp/app-discovery.d.ts.map +1 -0
- package/dist/cdp/app-discovery.js +60 -0
- package/dist/cdp/app-discovery.js.map +1 -0
- package/dist/cdp/app-discovery.test.d.ts +2 -0
- package/dist/cdp/app-discovery.test.d.ts.map +1 -0
- package/dist/cdp/app-discovery.test.js +124 -0
- package/dist/cdp/app-discovery.test.js.map +1 -0
- package/dist/cdp/client.d.ts +114 -0
- package/dist/cdp/client.d.ts.map +1 -0
- package/dist/cdp/client.integration.test.d.ts +2 -0
- package/dist/cdp/client.integration.test.d.ts.map +1 -0
- package/dist/cdp/client.integration.test.js +77 -0
- package/dist/cdp/client.integration.test.js.map +1 -0
- package/dist/cdp/client.js +319 -0
- package/dist/cdp/client.js.map +1 -0
- package/dist/cdp/client.test.d.ts +2 -0
- package/dist/cdp/client.test.d.ts.map +1 -0
- package/dist/cdp/client.test.js +533 -0
- package/dist/cdp/client.test.js.map +1 -0
- package/dist/cdp/discovery.d.ts +14 -0
- package/dist/cdp/discovery.d.ts.map +1 -0
- package/dist/cdp/discovery.integration.test.d.ts +2 -0
- package/dist/cdp/discovery.integration.test.d.ts.map +1 -0
- package/dist/cdp/discovery.integration.test.js +27 -0
- package/dist/cdp/discovery.integration.test.js.map +1 -0
- package/dist/cdp/discovery.js +33 -0
- package/dist/cdp/discovery.js.map +1 -0
- package/dist/cdp/discovery.test.d.ts +2 -0
- package/dist/cdp/discovery.test.d.ts.map +1 -0
- package/dist/cdp/discovery.test.js +56 -0
- package/dist/cdp/discovery.test.js.map +1 -0
- package/dist/cdp/errors.d.ts +28 -0
- package/dist/cdp/errors.d.ts.map +1 -0
- package/dist/cdp/errors.js +42 -0
- package/dist/cdp/errors.js.map +1 -0
- package/dist/cdp/errors.test.d.ts +2 -0
- package/dist/cdp/errors.test.d.ts.map +1 -0
- package/dist/cdp/errors.test.js +37 -0
- package/dist/cdp/errors.test.js.map +1 -0
- package/dist/cdp/index.d.ts +6 -0
- package/dist/cdp/index.d.ts.map +1 -0
- package/dist/cdp/index.js +8 -0
- package/dist/cdp/index.js.map +1 -0
- package/dist/cdp/instance-discovery.d.ts +30 -0
- package/dist/cdp/instance-discovery.d.ts.map +1 -0
- package/dist/cdp/instance-discovery.integration.test.d.ts +2 -0
- package/dist/cdp/instance-discovery.integration.test.d.ts.map +1 -0
- package/dist/cdp/instance-discovery.integration.test.js +36 -0
- package/dist/cdp/instance-discovery.integration.test.js.map +1 -0
- package/dist/cdp/instance-discovery.js +118 -0
- package/dist/cdp/instance-discovery.js.map +1 -0
- package/dist/cdp/instance-discovery.test.d.ts +2 -0
- package/dist/cdp/instance-discovery.test.d.ts.map +1 -0
- package/dist/cdp/instance-discovery.test.js +112 -0
- package/dist/cdp/instance-discovery.test.js.map +1 -0
- package/dist/cdp/testing/launch-chromium.d.ts +24 -0
- package/dist/cdp/testing/launch-chromium.d.ts.map +1 -0
- package/dist/cdp/testing/launch-chromium.js +93 -0
- package/dist/cdp/testing/launch-chromium.js.map +1 -0
- package/dist/constants.d.ts +5 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +7 -0
- package/dist/constants.js.map +1 -0
- package/dist/data/action-types.d.ts +39 -0
- package/dist/data/action-types.d.ts.map +1 -0
- package/dist/data/action-types.js +497 -0
- package/dist/data/action-types.js.map +1 -0
- package/dist/data/action-types.test.d.ts +2 -0
- package/dist/data/action-types.test.d.ts.map +1 -0
- package/dist/data/action-types.test.js +544 -0
- package/dist/data/action-types.test.js.map +1 -0
- package/dist/data/index.d.ts +3 -0
- package/dist/data/index.d.ts.map +1 -0
- package/dist/data/index.js +4 -0
- package/dist/data/index.js.map +1 -0
- package/dist/db/client.d.ts +27 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.integration.test.d.ts +2 -0
- package/dist/db/client.integration.test.d.ts.map +1 -0
- package/dist/db/client.integration.test.js +63 -0
- package/dist/db/client.integration.test.js.map +1 -0
- package/dist/db/client.js +23 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/client.test.d.ts +2 -0
- package/dist/db/client.test.d.ts.map +1 -0
- package/dist/db/client.test.js +48 -0
- package/dist/db/client.test.js.map +1 -0
- package/dist/db/discovery.d.ts +14 -0
- package/dist/db/discovery.d.ts.map +1 -0
- package/dist/db/discovery.integration.test.d.ts +2 -0
- package/dist/db/discovery.integration.test.d.ts.map +1 -0
- package/dist/db/discovery.integration.test.js +101 -0
- package/dist/db/discovery.integration.test.js.map +1 -0
- package/dist/db/discovery.js +76 -0
- package/dist/db/discovery.js.map +1 -0
- package/dist/db/discovery.test.d.ts +2 -0
- package/dist/db/discovery.test.d.ts.map +1 -0
- package/dist/db/discovery.test.js +125 -0
- package/dist/db/discovery.test.js.map +1 -0
- package/dist/db/errors.d.ts +52 -0
- package/dist/db/errors.d.ts.map +1 -0
- package/dist/db/errors.js +82 -0
- package/dist/db/errors.js.map +1 -0
- package/dist/db/errors.test.d.ts +2 -0
- package/dist/db/errors.test.d.ts.map +1 -0
- package/dist/db/errors.test.js +34 -0
- package/dist/db/errors.test.js.map +1 -0
- package/dist/db/escape-like.d.ts +8 -0
- package/dist/db/escape-like.d.ts.map +1 -0
- package/dist/db/escape-like.js +12 -0
- package/dist/db/escape-like.js.map +1 -0
- package/dist/db/escape-like.test.d.ts +2 -0
- package/dist/db/escape-like.test.d.ts.map +1 -0
- package/dist/db/escape-like.test.js +25 -0
- package/dist/db/escape-like.test.js.map +1 -0
- package/dist/db/index.d.ts +5 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +7 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/repositories/campaign-exclude-list.d.ts +89 -0
- package/dist/db/repositories/campaign-exclude-list.d.ts.map +1 -0
- package/dist/db/repositories/campaign-exclude-list.js +204 -0
- package/dist/db/repositories/campaign-exclude-list.js.map +1 -0
- package/dist/db/repositories/campaign-exclude-list.test.d.ts +2 -0
- package/dist/db/repositories/campaign-exclude-list.test.d.ts.map +1 -0
- package/dist/db/repositories/campaign-exclude-list.test.js +132 -0
- package/dist/db/repositories/campaign-exclude-list.test.js.map +1 -0
- package/dist/db/repositories/campaign-statistics.d.ts +58 -0
- package/dist/db/repositories/campaign-statistics.d.ts.map +1 -0
- package/dist/db/repositories/campaign-statistics.js +278 -0
- package/dist/db/repositories/campaign-statistics.js.map +1 -0
- package/dist/db/repositories/campaign-statistics.test.d.ts +2 -0
- package/dist/db/repositories/campaign-statistics.test.d.ts.map +1 -0
- package/dist/db/repositories/campaign-statistics.test.js +266 -0
- package/dist/db/repositories/campaign-statistics.test.js.map +1 -0
- package/dist/db/repositories/campaign.d.ts +103 -0
- package/dist/db/repositories/campaign.d.ts.map +1 -0
- package/dist/db/repositories/campaign.js +388 -0
- package/dist/db/repositories/campaign.js.map +1 -0
- package/dist/db/repositories/campaign.test.d.ts +2 -0
- package/dist/db/repositories/campaign.test.d.ts.map +1 -0
- package/dist/db/repositories/campaign.test.js +392 -0
- package/dist/db/repositories/campaign.test.js.map +1 -0
- package/dist/db/repositories/index.d.ts +6 -0
- package/dist/db/repositories/index.d.ts.map +1 -0
- package/dist/db/repositories/index.js +8 -0
- package/dist/db/repositories/index.js.map +1 -0
- package/dist/db/repositories/message.d.ts +57 -0
- package/dist/db/repositories/message.d.ts.map +1 -0
- package/dist/db/repositories/message.integration.test.d.ts +2 -0
- package/dist/db/repositories/message.integration.test.d.ts.map +1 -0
- package/dist/db/repositories/message.integration.test.js +137 -0
- package/dist/db/repositories/message.integration.test.js.map +1 -0
- package/dist/db/repositories/message.js +308 -0
- package/dist/db/repositories/message.js.map +1 -0
- package/dist/db/repositories/message.test.d.ts +2 -0
- package/dist/db/repositories/message.test.d.ts.map +1 -0
- package/dist/db/repositories/message.test.js +179 -0
- package/dist/db/repositories/message.test.js.map +1 -0
- package/dist/db/repositories/profile.d.ts +42 -0
- package/dist/db/repositories/profile.d.ts.map +1 -0
- package/dist/db/repositories/profile.integration.test.d.ts +2 -0
- package/dist/db/repositories/profile.integration.test.d.ts.map +1 -0
- package/dist/db/repositories/profile.integration.test.js +222 -0
- package/dist/db/repositories/profile.integration.test.js.map +1 -0
- package/dist/db/repositories/profile.js +163 -0
- package/dist/db/repositories/profile.js.map +1 -0
- package/dist/db/repositories/profile.test.d.ts +2 -0
- package/dist/db/repositories/profile.test.d.ts.map +1 -0
- package/dist/db/repositories/profile.test.js +216 -0
- package/dist/db/repositories/profile.test.js.map +1 -0
- package/dist/db/testing/create-fixture.d.ts +2 -0
- package/dist/db/testing/create-fixture.d.ts.map +1 -0
- package/dist/db/testing/create-fixture.js +745 -0
- package/dist/db/testing/create-fixture.js.map +1 -0
- package/dist/db/testing/open-fixture.d.ts +15 -0
- package/dist/db/testing/open-fixture.d.ts.map +1 -0
- package/dist/db/testing/open-fixture.js +39 -0
- package/dist/db/testing/open-fixture.js.map +1 -0
- package/dist/formats/campaign-format.d.ts +31 -0
- package/dist/formats/campaign-format.d.ts.map +1 -0
- package/dist/formats/campaign-format.js +225 -0
- package/dist/formats/campaign-format.js.map +1 -0
- package/dist/formats/campaign-format.test.d.ts +2 -0
- package/dist/formats/campaign-format.test.d.ts.map +1 -0
- package/dist/formats/campaign-format.test.js +442 -0
- package/dist/formats/campaign-format.test.js.map +1 -0
- package/dist/formats/errors.d.ts +7 -0
- package/dist/formats/errors.d.ts.map +1 -0
- package/dist/formats/errors.js +12 -0
- package/dist/formats/errors.js.map +1 -0
- package/dist/formats/index.d.ts +3 -0
- package/dist/formats/index.d.ts.map +1 -0
- package/dist/formats/index.js +5 -0
- package/dist/formats/index.js.map +1 -0
- package/dist/index.d.ts +10 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -1
- package/dist/index.js.map +1 -1
- package/dist/operations/campaign-add-action.d.ts +14 -0
- package/dist/operations/campaign-add-action.d.ts.map +1 -0
- package/dist/operations/campaign-add-action.js +33 -0
- package/dist/operations/campaign-add-action.js.map +1 -0
- package/dist/operations/campaign-add-action.test.d.ts +2 -0
- package/dist/operations/campaign-add-action.test.d.ts.map +1 -0
- package/dist/operations/campaign-add-action.test.js +122 -0
- package/dist/operations/campaign-add-action.test.js.map +1 -0
- package/dist/operations/campaign-create.d.ts +17 -0
- package/dist/operations/campaign-create.d.ts.map +1 -0
- package/dist/operations/campaign-create.js +21 -0
- package/dist/operations/campaign-create.js.map +1 -0
- package/dist/operations/campaign-create.test.d.ts +2 -0
- package/dist/operations/campaign-create.test.d.ts.map +1 -0
- package/dist/operations/campaign-create.test.js +113 -0
- package/dist/operations/campaign-create.test.js.map +1 -0
- package/dist/operations/campaign-delete.d.ts +20 -0
- package/dist/operations/campaign-delete.d.ts.map +1 -0
- package/dist/operations/campaign-delete.js +22 -0
- package/dist/operations/campaign-delete.js.map +1 -0
- package/dist/operations/campaign-delete.test.d.ts +2 -0
- package/dist/operations/campaign-delete.test.d.ts.map +1 -0
- package/dist/operations/campaign-delete.test.js +92 -0
- package/dist/operations/campaign-delete.test.js.map +1 -0
- package/dist/operations/campaign-exclude-add.d.ts +16 -0
- package/dist/operations/campaign-exclude-add.d.ts.map +1 -0
- package/dist/operations/campaign-exclude-add.js +27 -0
- package/dist/operations/campaign-exclude-add.js.map +1 -0
- package/dist/operations/campaign-exclude-add.test.d.ts +2 -0
- package/dist/operations/campaign-exclude-add.test.d.ts.map +1 -0
- package/dist/operations/campaign-exclude-add.test.js +114 -0
- package/dist/operations/campaign-exclude-add.test.js.map +1 -0
- package/dist/operations/campaign-exclude-list.d.ts +14 -0
- package/dist/operations/campaign-exclude-list.d.ts.map +1 -0
- package/dist/operations/campaign-exclude-list.js +26 -0
- package/dist/operations/campaign-exclude-list.js.map +1 -0
- package/dist/operations/campaign-exclude-list.test.d.ts +2 -0
- package/dist/operations/campaign-exclude-list.test.d.ts.map +1 -0
- package/dist/operations/campaign-exclude-list.test.js +113 -0
- package/dist/operations/campaign-exclude-list.test.js.map +1 -0
- package/dist/operations/campaign-exclude-remove.d.ts +16 -0
- package/dist/operations/campaign-exclude-remove.d.ts.map +1 -0
- package/dist/operations/campaign-exclude-remove.js +27 -0
- package/dist/operations/campaign-exclude-remove.js.map +1 -0
- package/dist/operations/campaign-exclude-remove.test.d.ts +2 -0
- package/dist/operations/campaign-exclude-remove.test.d.ts.map +1 -0
- package/dist/operations/campaign-exclude-remove.test.js +114 -0
- package/dist/operations/campaign-exclude-remove.test.js.map +1 -0
- package/dist/operations/campaign-export.d.ts +12 -0
- package/dist/operations/campaign-export.d.ts.map +1 -0
- package/dist/operations/campaign-export.js +24 -0
- package/dist/operations/campaign-export.js.map +1 -0
- package/dist/operations/campaign-export.test.d.ts +2 -0
- package/dist/operations/campaign-export.test.d.ts.map +1 -0
- package/dist/operations/campaign-export.test.js +134 -0
- package/dist/operations/campaign-export.test.js.map +1 -0
- package/dist/operations/campaign-get.d.ts +19 -0
- package/dist/operations/campaign-get.d.ts.map +1 -0
- package/dist/operations/campaign-get.js +23 -0
- package/dist/operations/campaign-get.js.map +1 -0
- package/dist/operations/campaign-get.test.d.ts +2 -0
- package/dist/operations/campaign-get.test.d.ts.map +1 -0
- package/dist/operations/campaign-get.test.js +99 -0
- package/dist/operations/campaign-get.test.js.map +1 -0
- package/dist/operations/campaign-list.d.ts +20 -0
- package/dist/operations/campaign-list.d.ts.map +1 -0
- package/dist/operations/campaign-list.js +23 -0
- package/dist/operations/campaign-list.js.map +1 -0
- package/dist/operations/campaign-list.test.d.ts +2 -0
- package/dist/operations/campaign-list.test.d.ts.map +1 -0
- package/dist/operations/campaign-list.test.js +106 -0
- package/dist/operations/campaign-list.test.js.map +1 -0
- package/dist/operations/campaign-move-next.d.ts +15 -0
- package/dist/operations/campaign-move-next.d.ts.map +1 -0
- package/dist/operations/campaign-move-next.js +25 -0
- package/dist/operations/campaign-move-next.js.map +1 -0
- package/dist/operations/campaign-move-next.test.d.ts +2 -0
- package/dist/operations/campaign-move-next.test.d.ts.map +1 -0
- package/dist/operations/campaign-move-next.test.js +105 -0
- package/dist/operations/campaign-move-next.test.js.map +1 -0
- package/dist/operations/campaign-remove-action.d.ts +12 -0
- package/dist/operations/campaign-remove-action.d.ts.map +1 -0
- package/dist/operations/campaign-remove-action.js +23 -0
- package/dist/operations/campaign-remove-action.js.map +1 -0
- package/dist/operations/campaign-remove-action.test.d.ts +2 -0
- package/dist/operations/campaign-remove-action.test.d.ts.map +1 -0
- package/dist/operations/campaign-remove-action.test.js +95 -0
- package/dist/operations/campaign-remove-action.test.js.map +1 -0
- package/dist/operations/campaign-reorder-actions.d.ts +13 -0
- package/dist/operations/campaign-reorder-actions.d.ts.map +1 -0
- package/dist/operations/campaign-reorder-actions.js +19 -0
- package/dist/operations/campaign-reorder-actions.js.map +1 -0
- package/dist/operations/campaign-reorder-actions.test.d.ts +2 -0
- package/dist/operations/campaign-reorder-actions.test.d.ts.map +1 -0
- package/dist/operations/campaign-reorder-actions.test.js +103 -0
- package/dist/operations/campaign-reorder-actions.test.js.map +1 -0
- package/dist/operations/campaign-retry.d.ts +13 -0
- package/dist/operations/campaign-retry.d.ts.map +1 -0
- package/dist/operations/campaign-retry.js +24 -0
- package/dist/operations/campaign-retry.js.map +1 -0
- package/dist/operations/campaign-retry.test.d.ts +2 -0
- package/dist/operations/campaign-retry.test.d.ts.map +1 -0
- package/dist/operations/campaign-retry.test.js +100 -0
- package/dist/operations/campaign-retry.test.js.map +1 -0
- package/dist/operations/campaign-start.d.ts +13 -0
- package/dist/operations/campaign-start.d.ts.map +1 -0
- package/dist/operations/campaign-start.js +24 -0
- package/dist/operations/campaign-start.js.map +1 -0
- package/dist/operations/campaign-start.test.d.ts +2 -0
- package/dist/operations/campaign-start.test.d.ts.map +1 -0
- package/dist/operations/campaign-start.test.js +96 -0
- package/dist/operations/campaign-start.test.js.map +1 -0
- package/dist/operations/campaign-statistics.d.ts +10 -0
- package/dist/operations/campaign-statistics.d.ts.map +1 -0
- package/dist/operations/campaign-statistics.js +23 -0
- package/dist/operations/campaign-statistics.js.map +1 -0
- package/dist/operations/campaign-statistics.test.d.ts +2 -0
- package/dist/operations/campaign-statistics.test.d.ts.map +1 -0
- package/dist/operations/campaign-statistics.test.js +120 -0
- package/dist/operations/campaign-statistics.test.js.map +1 -0
- package/dist/operations/campaign-status.d.ts +26 -0
- package/dist/operations/campaign-status.d.ts.map +1 -0
- package/dist/operations/campaign-status.js +32 -0
- package/dist/operations/campaign-status.js.map +1 -0
- package/dist/operations/campaign-status.test.d.ts +2 -0
- package/dist/operations/campaign-status.test.d.ts.map +1 -0
- package/dist/operations/campaign-status.test.js +142 -0
- package/dist/operations/campaign-status.test.js.map +1 -0
- package/dist/operations/campaign-stop.d.ts +11 -0
- package/dist/operations/campaign-stop.d.ts.map +1 -0
- package/dist/operations/campaign-stop.js +23 -0
- package/dist/operations/campaign-stop.js.map +1 -0
- package/dist/operations/campaign-stop.test.d.ts +2 -0
- package/dist/operations/campaign-stop.test.d.ts.map +1 -0
- package/dist/operations/campaign-stop.test.js +92 -0
- package/dist/operations/campaign-stop.test.js.map +1 -0
- package/dist/operations/campaign-update.d.ts +18 -0
- package/dist/operations/campaign-update.d.ts.map +1 -0
- package/dist/operations/campaign-update.js +21 -0
- package/dist/operations/campaign-update.js.map +1 -0
- package/dist/operations/campaign-update.test.d.ts +2 -0
- package/dist/operations/campaign-update.test.d.ts.map +1 -0
- package/dist/operations/campaign-update.test.js +105 -0
- package/dist/operations/campaign-update.test.js.map +1 -0
- package/dist/operations/check-replies.d.ts +12 -0
- package/dist/operations/check-replies.d.ts.map +1 -0
- package/dist/operations/check-replies.js +26 -0
- package/dist/operations/check-replies.js.map +1 -0
- package/dist/operations/check-replies.test.d.ts +2 -0
- package/dist/operations/check-replies.test.d.ts.map +1 -0
- package/dist/operations/check-replies.test.js +118 -0
- package/dist/operations/check-replies.test.js.map +1 -0
- package/dist/operations/import-people-from-urls.d.ts +16 -0
- package/dist/operations/import-people-from-urls.d.ts.map +1 -0
- package/dist/operations/import-people-from-urls.js +27 -0
- package/dist/operations/import-people-from-urls.js.map +1 -0
- package/dist/operations/import-people-from-urls.test.d.ts +2 -0
- package/dist/operations/import-people-from-urls.test.d.ts.map +1 -0
- package/dist/operations/import-people-from-urls.test.js +118 -0
- package/dist/operations/import-people-from-urls.test.js.map +1 -0
- package/dist/operations/index.d.ts +24 -0
- package/dist/operations/index.d.ts.map +1 -0
- package/dist/operations/index.js +30 -0
- package/dist/operations/index.js.map +1 -0
- package/dist/operations/query-messages.d.ts +23 -0
- package/dist/operations/query-messages.d.ts.map +1 -0
- package/dist/operations/query-messages.js +33 -0
- package/dist/operations/query-messages.js.map +1 -0
- package/dist/operations/query-messages.test.d.ts +2 -0
- package/dist/operations/query-messages.test.d.ts.map +1 -0
- package/dist/operations/query-messages.test.js +134 -0
- package/dist/operations/query-messages.test.js.map +1 -0
- package/dist/operations/scrape-messaging-history.d.ts +10 -0
- package/dist/operations/scrape-messaging-history.d.ts.map +1 -0
- package/dist/operations/scrape-messaging-history.js +24 -0
- package/dist/operations/scrape-messaging-history.js.map +1 -0
- package/dist/operations/scrape-messaging-history.test.d.ts +2 -0
- package/dist/operations/scrape-messaging-history.test.d.ts.map +1 -0
- package/dist/operations/scrape-messaging-history.test.js +112 -0
- package/dist/operations/scrape-messaging-history.test.js.map +1 -0
- package/dist/operations/types.d.ts +10 -0
- package/dist/operations/types.d.ts.map +1 -0
- package/dist/operations/types.js +4 -0
- package/dist/operations/types.js.map +1 -0
- package/dist/services/account-resolution.d.ts +22 -0
- package/dist/services/account-resolution.d.ts.map +1 -0
- package/dist/services/account-resolution.js +45 -0
- package/dist/services/account-resolution.js.map +1 -0
- package/dist/services/account-resolution.test.d.ts +2 -0
- package/dist/services/account-resolution.test.d.ts.map +1 -0
- package/dist/services/account-resolution.test.js +91 -0
- package/dist/services/account-resolution.test.js.map +1 -0
- package/dist/services/app.d.ts +62 -0
- package/dist/services/app.d.ts.map +1 -0
- package/dist/services/app.js +200 -0
- package/dist/services/app.js.map +1 -0
- package/dist/services/app.test.d.ts +2 -0
- package/dist/services/app.test.d.ts.map +1 -0
- package/dist/services/app.test.js +267 -0
- package/dist/services/app.test.js.map +1 -0
- package/dist/services/campaign.d.ts +143 -0
- package/dist/services/campaign.d.ts.map +1 -0
- package/dist/services/campaign.js +409 -0
- package/dist/services/campaign.js.map +1 -0
- package/dist/services/campaign.test.d.ts +2 -0
- package/dist/services/campaign.test.d.ts.map +1 -0
- package/dist/services/campaign.test.js +481 -0
- package/dist/services/campaign.test.js.map +1 -0
- package/dist/services/errors.d.ts +83 -0
- package/dist/services/errors.d.ts.map +1 -0
- package/dist/services/errors.js +126 -0
- package/dist/services/errors.js.map +1 -0
- package/dist/services/errors.test.d.ts +2 -0
- package/dist/services/errors.test.d.ts.map +1 -0
- package/dist/services/errors.test.js +123 -0
- package/dist/services/errors.test.js.map +1 -0
- package/dist/services/index.d.ts +10 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +12 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/instance-context.d.ts +37 -0
- package/dist/services/instance-context.d.ts.map +1 -0
- package/dist/services/instance-context.js +49 -0
- package/dist/services/instance-context.js.map +1 -0
- package/dist/services/instance-context.test.d.ts +2 -0
- package/dist/services/instance-context.test.d.ts.map +1 -0
- package/dist/services/instance-context.test.js +203 -0
- package/dist/services/instance-context.test.js.map +1 -0
- package/dist/services/instance-lifecycle.d.ts +38 -0
- package/dist/services/instance-lifecycle.d.ts.map +1 -0
- package/dist/services/instance-lifecycle.js +87 -0
- package/dist/services/instance-lifecycle.js.map +1 -0
- package/dist/services/instance-lifecycle.test.d.ts +2 -0
- package/dist/services/instance-lifecycle.test.d.ts.map +1 -0
- package/dist/services/instance-lifecycle.test.js +158 -0
- package/dist/services/instance-lifecycle.test.js.map +1 -0
- package/dist/services/instance.d.ts +90 -0
- package/dist/services/instance.d.ts.map +1 -0
- package/dist/services/instance.js +178 -0
- package/dist/services/instance.js.map +1 -0
- package/dist/services/instance.test.d.ts +2 -0
- package/dist/services/instance.test.d.ts.map +1 -0
- package/dist/services/instance.test.js +291 -0
- package/dist/services/instance.test.js.map +1 -0
- package/dist/services/launcher.d.ts +54 -0
- package/dist/services/launcher.d.ts.map +1 -0
- package/dist/services/launcher.js +162 -0
- package/dist/services/launcher.js.map +1 -0
- package/dist/services/launcher.test.d.ts +2 -0
- package/dist/services/launcher.test.d.ts.map +1 -0
- package/dist/services/launcher.test.js +163 -0
- package/dist/services/launcher.test.js.map +1 -0
- package/dist/services/status.d.ts +37 -0
- package/dist/services/status.d.ts.map +1 -0
- package/dist/services/status.js +85 -0
- package/dist/services/status.js.map +1 -0
- package/dist/services/status.test.d.ts +2 -0
- package/dist/services/status.test.d.ts.map +1 -0
- package/dist/services/status.test.js +248 -0
- package/dist/services/status.test.js.map +1 -0
- package/dist/testing/e2e-helpers.d.ts +41 -0
- package/dist/testing/e2e-helpers.d.ts.map +1 -0
- package/dist/testing/e2e-helpers.js +114 -0
- package/dist/testing/e2e-helpers.js.map +1 -0
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +4 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/types/account.d.ts +13 -0
- package/dist/types/account.d.ts.map +1 -0
- package/dist/types/account.js +4 -0
- package/dist/types/account.js.map +1 -0
- package/dist/types/account.test.d.ts +2 -0
- package/dist/types/account.test.d.ts.map +1 -0
- package/dist/types/account.test.js +26 -0
- package/dist/types/account.test.js.map +1 -0
- package/dist/types/campaign.d.ts +267 -0
- package/dist/types/campaign.d.ts.map +1 -0
- package/dist/types/campaign.js +4 -0
- package/dist/types/campaign.js.map +1 -0
- package/dist/types/cdp.d.ts +18 -0
- package/dist/types/cdp.d.ts.map +1 -0
- package/dist/types/cdp.js +4 -0
- package/dist/types/cdp.js.map +1 -0
- package/dist/types/cdp.test.d.ts +2 -0
- package/dist/types/cdp.test.d.ts.map +1 -0
- package/dist/types/cdp.test.js +30 -0
- package/dist/types/cdp.test.js.map +1 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/instance.d.ts +36 -0
- package/dist/types/instance.d.ts.map +1 -0
- package/dist/types/instance.js +4 -0
- package/dist/types/instance.js.map +1 -0
- package/dist/types/instance.test.d.ts +2 -0
- package/dist/types/instance.test.d.ts.map +1 -0
- package/dist/types/instance.test.js +59 -0
- package/dist/types/instance.test.js.map +1 -0
- package/dist/types/messaging.d.ts +51 -0
- package/dist/types/messaging.d.ts.map +1 -0
- package/dist/types/messaging.js +4 -0
- package/dist/types/messaging.js.map +1 -0
- package/dist/types/profile.d.ts +81 -0
- package/dist/types/profile.d.ts.map +1 -0
- package/dist/types/profile.js +4 -0
- package/dist/types/profile.js.map +1 -0
- package/dist/types/profile.test.d.ts +2 -0
- package/dist/types/profile.test.d.ts.map +1 -0
- package/dist/types/profile.test.js +105 -0
- package/dist/types/profile.test.js.map +1 -0
- package/dist/utils/cdp-port.d.ts +5 -0
- package/dist/utils/cdp-port.d.ts.map +1 -0
- package/dist/utils/cdp-port.js +15 -0
- package/dist/utils/cdp-port.js.map +1 -0
- package/dist/utils/cdp-port.test.d.ts +2 -0
- package/dist/utils/cdp-port.test.d.ts.map +1 -0
- package/dist/utils/cdp-port.test.js +23 -0
- package/dist/utils/cdp-port.test.js.map +1 -0
- package/dist/utils/delay.d.ts +5 -0
- package/dist/utils/delay.d.ts.map +1 -0
- package/dist/utils/delay.js +9 -0
- package/dist/utils/delay.js.map +1 -0
- package/dist/utils/delay.test.d.ts +2 -0
- package/dist/utils/delay.test.d.ts.map +1 -0
- package/dist/utils/delay.test.js +17 -0
- package/dist/utils/delay.test.js.map +1 -0
- package/dist/utils/error-message.d.ts +5 -0
- package/dist/utils/error-message.d.ts.map +1 -0
- package/dist/utils/error-message.js +9 -0
- package/dist/utils/error-message.js.map +1 -0
- package/dist/utils/error-message.test.d.ts +2 -0
- package/dist/utils/error-message.test.d.ts.map +1 -0
- package/dist/utils/error-message.test.js +28 -0
- package/dist/utils/error-message.test.js.map +1 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +7 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/loopback.d.ts +10 -0
- package/dist/utils/loopback.d.ts.map +1 -0
- package/dist/utils/loopback.js +28 -0
- package/dist/utils/loopback.js.map +1 -0
- package/dist/utils/loopback.test.d.ts +2 -0
- package/dist/utils/loopback.test.d.ts.map +1 -0
- package/dist/utils/loopback.test.js +34 -0
- package/dist/utils/loopback.test.js.map +1 -0
- package/package.json +26 -9
package/README.md
CHANGED
|
@@ -2,12 +2,136 @@
|
|
|
2
2
|
|
|
3
3
|
Core library for [lhremote](https://github.com/alexey-pelykh/lhremote) — LinkedHelper automation toolkit.
|
|
4
4
|
|
|
5
|
+
This package provides services, data access, and CDP communication for controlling LinkedHelper. It is the foundation that both [`@lhremote/mcp`](../mcp) and [`@lhremote/cli`](../cli) build on.
|
|
6
|
+
|
|
5
7
|
## Installation
|
|
6
8
|
|
|
7
9
|
```bash
|
|
8
10
|
npm install @lhremote/core
|
|
9
11
|
```
|
|
10
12
|
|
|
13
|
+
## Key Exports
|
|
14
|
+
|
|
15
|
+
### Services
|
|
16
|
+
|
|
17
|
+
| Export | Description |
|
|
18
|
+
|--------|-------------|
|
|
19
|
+
| `AppService` | Detect, launch, and quit the LinkedHelper application |
|
|
20
|
+
| `InstanceService` | Start and stop LinkedHelper instances for individual accounts |
|
|
21
|
+
| `LauncherService` | Low-level launcher interaction via CDP |
|
|
22
|
+
| `CampaignService` | Create, configure, start, stop, and monitor campaigns |
|
|
23
|
+
| `resolveAccount` | Resolve the active account ID from a running instance |
|
|
24
|
+
| `checkStatus` | Check launcher, instance, and database health |
|
|
25
|
+
| `startInstanceWithRecovery` | Start an instance with automatic retry on failure |
|
|
26
|
+
| `waitForInstancePort` | Wait for an instance CDP port to become available |
|
|
27
|
+
| `waitForInstanceShutdown` | Wait for an instance to shut down |
|
|
28
|
+
| `withDatabase` / `withInstanceDatabase` | Scoped database access helpers |
|
|
29
|
+
|
|
30
|
+
### Data Access
|
|
31
|
+
|
|
32
|
+
| Export | Description |
|
|
33
|
+
|--------|-------------|
|
|
34
|
+
| `CampaignRepository` | Campaign CRUD and action-chain management |
|
|
35
|
+
| `ProfileRepository` | Profile lookups and search |
|
|
36
|
+
| `MessageRepository` | Messaging history queries |
|
|
37
|
+
| `DatabaseClient` | SQLite database connection management |
|
|
38
|
+
| `discoverDatabase` / `discoverAllDatabases` | Locate LinkedHelper database files on disk |
|
|
39
|
+
|
|
40
|
+
### Campaign Formats
|
|
41
|
+
|
|
42
|
+
| Export | Description |
|
|
43
|
+
|--------|-------------|
|
|
44
|
+
| `parseCampaignYaml` / `parseCampaignJson` | Parse campaign configuration |
|
|
45
|
+
| `serializeCampaignYaml` / `serializeCampaignJson` | Serialize campaign configuration |
|
|
46
|
+
| `CampaignFormatError` | Error thrown on invalid campaign format input |
|
|
47
|
+
|
|
48
|
+
### Action Catalog
|
|
49
|
+
|
|
50
|
+
| Export | Description |
|
|
51
|
+
|--------|-------------|
|
|
52
|
+
| `getActionTypeCatalog` | List all available action types with metadata |
|
|
53
|
+
| `getActionTypeInfo` | Get details for a specific action type |
|
|
54
|
+
|
|
55
|
+
### CDP
|
|
56
|
+
|
|
57
|
+
| Export | Description |
|
|
58
|
+
|--------|-------------|
|
|
59
|
+
| `findApp` | Detect running LinkedHelper instances via process inspection |
|
|
60
|
+
| `discoverInstancePort` | Find the CDP port for a running instance |
|
|
61
|
+
| `discoverTargets` | Discover CDP targets on a given port |
|
|
62
|
+
| `killInstanceProcesses` | Kill processes associated with a LinkedHelper instance |
|
|
63
|
+
|
|
64
|
+
### Operations
|
|
65
|
+
|
|
66
|
+
| Export | Description |
|
|
67
|
+
|--------|-------------|
|
|
68
|
+
| `campaignStatus` | Retrieve campaign status with statistics and action details |
|
|
69
|
+
|
|
70
|
+
### Constants & Utilities
|
|
71
|
+
|
|
72
|
+
| Export | Description |
|
|
73
|
+
|--------|-------------|
|
|
74
|
+
| `DEFAULT_CDP_PORT` | Default CDP port used by LinkedHelper |
|
|
75
|
+
| `delay` | Promise-based delay helper |
|
|
76
|
+
| `errorMessage` | Extract a human-readable message from an unknown error |
|
|
77
|
+
| `isCdpPort` | Check whether a value is a valid CDP port number |
|
|
78
|
+
| `isLoopbackAddress` | Check whether a string is a loopback IP address |
|
|
79
|
+
|
|
80
|
+
### Error Types
|
|
81
|
+
|
|
82
|
+
| Export | Description |
|
|
83
|
+
|--------|-------------|
|
|
84
|
+
| `ServiceError` | Base class for service-layer errors |
|
|
85
|
+
| `AccountResolutionError` | Failed to resolve the active account |
|
|
86
|
+
| `ActionExecutionError` | Action execution failed |
|
|
87
|
+
| `AppLaunchError` | LinkedHelper application failed to launch |
|
|
88
|
+
| `AppNotFoundError` | LinkedHelper application not found |
|
|
89
|
+
| `CampaignExecutionError` | Campaign execution failed |
|
|
90
|
+
| `CampaignTimeoutError` | Campaign operation timed out |
|
|
91
|
+
| `ExtractionTimeoutError` | Data extraction timed out |
|
|
92
|
+
| `InstanceNotRunningError` | Target instance is not running |
|
|
93
|
+
| `InvalidProfileUrlError` | Invalid LinkedIn profile URL |
|
|
94
|
+
| `LinkedHelperNotRunningError` | LinkedHelper is not running |
|
|
95
|
+
| `StartInstanceError` | Instance failed to start |
|
|
96
|
+
| `WrongPortError` | Connected to wrong port / unexpected endpoint |
|
|
97
|
+
| `CampaignNotFoundError` | Campaign not found in the database |
|
|
98
|
+
| `ActionNotFoundError` | Action not found in the database |
|
|
99
|
+
| `ChatNotFoundError` | Chat not found in the database |
|
|
100
|
+
| `DatabaseError` | General database error |
|
|
101
|
+
| `DatabaseNotFoundError` | Database file not found on disk |
|
|
102
|
+
| `ExcludeListNotFoundError` | Exclude list not found in the database |
|
|
103
|
+
| `NoNextActionError` | No next action available in the campaign |
|
|
104
|
+
| `ProfileNotFoundError` | Profile not found in the database |
|
|
105
|
+
| `CDPConnectionError` | CDP connection failed |
|
|
106
|
+
| `CDPError` | General CDP protocol error |
|
|
107
|
+
| `CDPEvaluationError` | CDP JavaScript evaluation failed |
|
|
108
|
+
| `CDPTimeoutError` | CDP operation timed out |
|
|
109
|
+
|
|
110
|
+
## Usage
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
import {
|
|
114
|
+
findApp,
|
|
115
|
+
resolveAccount,
|
|
116
|
+
CampaignService,
|
|
117
|
+
withInstanceDatabase,
|
|
118
|
+
} from "@lhremote/core";
|
|
119
|
+
|
|
120
|
+
// Detect LinkedHelper
|
|
121
|
+
const apps = await findApp();
|
|
122
|
+
const cdpPort = apps[0].cdpPort!;
|
|
123
|
+
|
|
124
|
+
// Resolve the active account
|
|
125
|
+
const accountId = await resolveAccount(cdpPort);
|
|
126
|
+
|
|
127
|
+
// Work with campaigns
|
|
128
|
+
await withInstanceDatabase(cdpPort, accountId, async ({ instance, db }) => {
|
|
129
|
+
const campaigns = new CampaignService(instance, db);
|
|
130
|
+
const list = await campaigns.list();
|
|
131
|
+
console.log(list);
|
|
132
|
+
});
|
|
133
|
+
```
|
|
134
|
+
|
|
11
135
|
## License
|
|
12
136
|
|
|
13
137
|
[AGPL-3.0-only](https://github.com/alexey-pelykh/lhremote/blob/main/LICENSE)
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Result of discovering a running LinkedHelper application process.
|
|
3
|
+
*/
|
|
4
|
+
export interface DiscoveredApp {
|
|
5
|
+
/** OS process ID. */
|
|
6
|
+
pid: number;
|
|
7
|
+
/** CDP port the process is listening on, or `null` if none detected. */
|
|
8
|
+
cdpPort: number | null;
|
|
9
|
+
/** Whether the CDP endpoint responded to a probe. */
|
|
10
|
+
connectable: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Scan the system for running LinkedHelper application processes.
|
|
14
|
+
*
|
|
15
|
+
* For each matching process, attempts to detect a CDP debugging port
|
|
16
|
+
* by inspecting its listening TCP ports and probing them with an HTTP
|
|
17
|
+
* request to the CDP `/json/list` endpoint.
|
|
18
|
+
*
|
|
19
|
+
* @returns An array of discovered LinkedHelper processes (may be empty).
|
|
20
|
+
*/
|
|
21
|
+
export declare function findApp(): Promise<DiscoveredApp[]>;
|
|
22
|
+
//# sourceMappingURL=app-discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-discovery.d.ts","sourceRoot":"","sources":["../../src/cdp/app-discovery.ts"],"names":[],"mappings":"AAYA;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,qBAAqB;IACrB,GAAG,EAAE,MAAM,CAAC;IAEZ,wEAAwE;IACxE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAEvB,qDAAqD;IACrD,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAOxD"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
|
+
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
|
+
import { pidToPorts } from "pid-port";
|
|
4
|
+
import psList from "ps-list";
|
|
5
|
+
import { isCdpPort } from "../utils/cdp-port.js";
|
|
6
|
+
/**
|
|
7
|
+
* Known LinkedHelper binary names across platforms.
|
|
8
|
+
*/
|
|
9
|
+
const BINARY_NAMES = ["linked-helper", "linked-helper.exe"];
|
|
10
|
+
/**
|
|
11
|
+
* Scan the system for running LinkedHelper application processes.
|
|
12
|
+
*
|
|
13
|
+
* For each matching process, attempts to detect a CDP debugging port
|
|
14
|
+
* by inspecting its listening TCP ports and probing them with an HTTP
|
|
15
|
+
* request to the CDP `/json/list` endpoint.
|
|
16
|
+
*
|
|
17
|
+
* @returns An array of discovered LinkedHelper processes (may be empty).
|
|
18
|
+
*/
|
|
19
|
+
export async function findApp() {
|
|
20
|
+
const processes = await listLinkedHelperProcesses();
|
|
21
|
+
if (processes.length === 0) {
|
|
22
|
+
return [];
|
|
23
|
+
}
|
|
24
|
+
return Promise.all(processes.map(probeProcess));
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* List PIDs of processes whose name matches a known LinkedHelper binary.
|
|
28
|
+
*/
|
|
29
|
+
async function listLinkedHelperProcesses() {
|
|
30
|
+
try {
|
|
31
|
+
const all = await psList();
|
|
32
|
+
return all
|
|
33
|
+
.filter((p) => BINARY_NAMES.includes(p.name))
|
|
34
|
+
.map((p) => p.pid);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Probe a single process for CDP connectivity.
|
|
42
|
+
*/
|
|
43
|
+
async function probeProcess(pid) {
|
|
44
|
+
let ports;
|
|
45
|
+
try {
|
|
46
|
+
ports = await pidToPorts(pid);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return { pid, cdpPort: null, connectable: false };
|
|
50
|
+
}
|
|
51
|
+
for (const port of ports) {
|
|
52
|
+
if (await isCdpPort(port)) {
|
|
53
|
+
return { pid, cdpPort: port, connectable: true };
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Process is running but no CDP port detected (or none responding)
|
|
57
|
+
const firstPort = [...ports][0] ?? null;
|
|
58
|
+
return { pid, cdpPort: firstPort, connectable: false };
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=app-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-discovery.js","sourceRoot":"","sources":["../../src/cdp/app-discovery.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,MAAM,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD;;GAEG;AACH,MAAM,YAAY,GAAG,CAAC,eAAe,EAAE,mBAAmB,CAAC,CAAC;AAgB5D;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO;IAC3B,MAAM,SAAS,GAAG,MAAM,yBAAyB,EAAE,CAAC;IACpD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,yBAAyB;IACtC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,EAAE,CAAC;QAC3B,OAAO,GAAG;aACP,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;aAC5C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,YAAY,CAAC,GAAW;IACrC,IAAI,KAAkB,CAAC;IACvB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IACpD,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,MAAM,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QACnD,CAAC;IACH,CAAC;IAED,mEAAmE;IACnE,MAAM,SAAS,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IACxC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-discovery.test.d.ts","sourceRoot":"","sources":["../../src/cdp/app-discovery.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
|
+
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
4
|
+
import { findApp } from "./app-discovery.js";
|
|
5
|
+
vi.mock("pid-port", () => ({
|
|
6
|
+
pidToPorts: vi.fn(),
|
|
7
|
+
}));
|
|
8
|
+
vi.mock("ps-list", () => ({
|
|
9
|
+
default: vi.fn(),
|
|
10
|
+
}));
|
|
11
|
+
import { pidToPorts } from "pid-port";
|
|
12
|
+
import psList from "ps-list";
|
|
13
|
+
describe("findApp", () => {
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
vi.spyOn(globalThis, "fetch").mockResolvedValue(new Response("[]", { status: 200 }));
|
|
16
|
+
});
|
|
17
|
+
afterEach(() => {
|
|
18
|
+
vi.restoreAllMocks();
|
|
19
|
+
});
|
|
20
|
+
it("should return empty array when no LinkedHelper process is running", async () => {
|
|
21
|
+
vi.mocked(psList).mockResolvedValue([
|
|
22
|
+
{ pid: 100, name: "chrome", ppid: 1 },
|
|
23
|
+
{ pid: 200, name: "node", ppid: 1 },
|
|
24
|
+
]);
|
|
25
|
+
const result = await findApp();
|
|
26
|
+
expect(result).toEqual([]);
|
|
27
|
+
});
|
|
28
|
+
it("should return empty array when psList throws", async () => {
|
|
29
|
+
vi.mocked(psList).mockRejectedValue(new Error("permission denied"));
|
|
30
|
+
const result = await findApp();
|
|
31
|
+
expect(result).toEqual([]);
|
|
32
|
+
});
|
|
33
|
+
it("should discover a linked-helper process with CDP port", async () => {
|
|
34
|
+
vi.mocked(psList).mockResolvedValue([
|
|
35
|
+
{ pid: 1000, name: "linked-helper", ppid: 1 },
|
|
36
|
+
]);
|
|
37
|
+
vi.mocked(pidToPorts).mockResolvedValue(new Set([9222]));
|
|
38
|
+
const result = await findApp();
|
|
39
|
+
expect(result).toEqual([
|
|
40
|
+
{ pid: 1000, cdpPort: 9222, connectable: true },
|
|
41
|
+
]);
|
|
42
|
+
});
|
|
43
|
+
it("should discover a linked-helper.exe process on Windows", async () => {
|
|
44
|
+
vi.mocked(psList).mockResolvedValue([
|
|
45
|
+
{ pid: 2000, name: "linked-helper.exe", ppid: 1 },
|
|
46
|
+
]);
|
|
47
|
+
vi.mocked(pidToPorts).mockResolvedValue(new Set([9333]));
|
|
48
|
+
const result = await findApp();
|
|
49
|
+
expect(result).toEqual([
|
|
50
|
+
{ pid: 2000, cdpPort: 9333, connectable: true },
|
|
51
|
+
]);
|
|
52
|
+
});
|
|
53
|
+
it("should discover multiple LinkedHelper processes", async () => {
|
|
54
|
+
vi.mocked(psList).mockResolvedValue([
|
|
55
|
+
{ pid: 1000, name: "linked-helper", ppid: 1 },
|
|
56
|
+
{ pid: 2000, name: "linked-helper", ppid: 1 },
|
|
57
|
+
]);
|
|
58
|
+
vi.mocked(pidToPorts)
|
|
59
|
+
.mockResolvedValueOnce(new Set([9222]))
|
|
60
|
+
.mockResolvedValueOnce(new Set([9333]));
|
|
61
|
+
const result = await findApp();
|
|
62
|
+
expect(result).toEqual([
|
|
63
|
+
{ pid: 1000, cdpPort: 9222, connectable: true },
|
|
64
|
+
{ pid: 2000, cdpPort: 9333, connectable: true },
|
|
65
|
+
]);
|
|
66
|
+
});
|
|
67
|
+
it("should return connectable false when CDP probe fails", async () => {
|
|
68
|
+
vi.mocked(psList).mockResolvedValue([
|
|
69
|
+
{ pid: 1000, name: "linked-helper", ppid: 1 },
|
|
70
|
+
]);
|
|
71
|
+
vi.mocked(pidToPorts).mockResolvedValue(new Set([9222]));
|
|
72
|
+
vi.mocked(globalThis.fetch).mockRejectedValue(new Error("ECONNREFUSED"));
|
|
73
|
+
const result = await findApp();
|
|
74
|
+
expect(result).toEqual([
|
|
75
|
+
{ pid: 1000, cdpPort: 9222, connectable: false },
|
|
76
|
+
]);
|
|
77
|
+
});
|
|
78
|
+
it("should return cdpPort null when pidToPorts throws", async () => {
|
|
79
|
+
vi.mocked(psList).mockResolvedValue([
|
|
80
|
+
{ pid: 1000, name: "linked-helper", ppid: 1 },
|
|
81
|
+
]);
|
|
82
|
+
vi.mocked(pidToPorts).mockRejectedValue(new Error("failed"));
|
|
83
|
+
const result = await findApp();
|
|
84
|
+
expect(result).toEqual([
|
|
85
|
+
{ pid: 1000, cdpPort: null, connectable: false },
|
|
86
|
+
]);
|
|
87
|
+
});
|
|
88
|
+
it("should return cdpPort null when process has no listening ports", async () => {
|
|
89
|
+
vi.mocked(psList).mockResolvedValue([
|
|
90
|
+
{ pid: 1000, name: "linked-helper", ppid: 1 },
|
|
91
|
+
]);
|
|
92
|
+
vi.mocked(pidToPorts).mockResolvedValue(new Set());
|
|
93
|
+
const result = await findApp();
|
|
94
|
+
expect(result).toEqual([
|
|
95
|
+
{ pid: 1000, cdpPort: null, connectable: false },
|
|
96
|
+
]);
|
|
97
|
+
});
|
|
98
|
+
it("should find CDP port among multiple listening ports", async () => {
|
|
99
|
+
vi.mocked(psList).mockResolvedValue([
|
|
100
|
+
{ pid: 1000, name: "linked-helper", ppid: 1 },
|
|
101
|
+
]);
|
|
102
|
+
vi.mocked(pidToPorts).mockResolvedValue(new Set([8080, 9222]));
|
|
103
|
+
vi.mocked(globalThis.fetch).mockImplementation(async (input) => {
|
|
104
|
+
const url = String(input);
|
|
105
|
+
if (url.includes(":8080/")) {
|
|
106
|
+
throw new Error("ECONNREFUSED");
|
|
107
|
+
}
|
|
108
|
+
return new Response("[]", { status: 200 });
|
|
109
|
+
});
|
|
110
|
+
const result = await findApp();
|
|
111
|
+
expect(result).toEqual([
|
|
112
|
+
{ pid: 1000, cdpPort: 9222, connectable: true },
|
|
113
|
+
]);
|
|
114
|
+
});
|
|
115
|
+
it("should not match processes with similar but different names", async () => {
|
|
116
|
+
vi.mocked(psList).mockResolvedValue([
|
|
117
|
+
{ pid: 100, name: "linked-helper-updater", ppid: 1 },
|
|
118
|
+
{ pid: 200, name: "my-linked-helper", ppid: 1 },
|
|
119
|
+
]);
|
|
120
|
+
const result = await findApp();
|
|
121
|
+
expect(result).toEqual([]);
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
//# sourceMappingURL=app-discovery.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-discovery.test.js","sourceRoot":"","sources":["../../src/cdp/app-discovery.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import type { Protocol } from "devtools-protocol";
|
|
2
|
+
type EventListener = (params: unknown) => void;
|
|
3
|
+
/**
|
|
4
|
+
* Chrome DevTools Protocol client.
|
|
5
|
+
*
|
|
6
|
+
* Communicates with a CDP-enabled process over WebSocket, providing:
|
|
7
|
+
* - Request/response correlation via incrementing message IDs
|
|
8
|
+
* - Event subscription
|
|
9
|
+
* - Convenience helpers for `Runtime.evaluate` and `Page.navigate`
|
|
10
|
+
* - Automatic reconnection with exponential backoff
|
|
11
|
+
*/
|
|
12
|
+
export declare class CDPClient {
|
|
13
|
+
private readonly port;
|
|
14
|
+
private readonly host;
|
|
15
|
+
private readonly timeout;
|
|
16
|
+
private ws;
|
|
17
|
+
private nextId;
|
|
18
|
+
private readonly pending;
|
|
19
|
+
private readonly listeners;
|
|
20
|
+
private connected;
|
|
21
|
+
private targetId;
|
|
22
|
+
private reconnecting;
|
|
23
|
+
constructor(port: number, options?: {
|
|
24
|
+
host?: string;
|
|
25
|
+
timeout?: number;
|
|
26
|
+
allowRemote?: boolean;
|
|
27
|
+
});
|
|
28
|
+
/**
|
|
29
|
+
* Open a WebSocket connection to a CDP target.
|
|
30
|
+
*
|
|
31
|
+
* @param targetId - Specific target ID to connect to. When omitted the
|
|
32
|
+
* first `page` target is used.
|
|
33
|
+
*/
|
|
34
|
+
connect(targetId?: string): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Close the connection. Pending requests are rejected.
|
|
37
|
+
*/
|
|
38
|
+
disconnect(): void;
|
|
39
|
+
/**
|
|
40
|
+
* Send a raw CDP method call and wait for the response.
|
|
41
|
+
*
|
|
42
|
+
* @param method - CDP method name, e.g. `"Runtime.evaluate"`.
|
|
43
|
+
* @param params - Method parameters.
|
|
44
|
+
* @returns The `result` field from the CDP response.
|
|
45
|
+
*/
|
|
46
|
+
send(method: string, params?: Record<string, unknown>): Promise<unknown>;
|
|
47
|
+
/**
|
|
48
|
+
* Evaluate a JavaScript expression via `Runtime.evaluate`.
|
|
49
|
+
*
|
|
50
|
+
* @param expression - JavaScript source to evaluate.
|
|
51
|
+
* @param awaitPromise - Whether to await a Promise result (default `false`).
|
|
52
|
+
* @returns The deserialized value from the remote context.
|
|
53
|
+
*/
|
|
54
|
+
evaluate<T = unknown>(expression: string, awaitPromise?: boolean): Promise<T>;
|
|
55
|
+
/**
|
|
56
|
+
* Navigate the target to the given URL via `Page.navigate`.
|
|
57
|
+
*
|
|
58
|
+
* Only `http:` and `https:` schemes are allowed. Other schemes such as
|
|
59
|
+
* `file:`, `javascript:`, or `data:` are rejected to prevent misuse.
|
|
60
|
+
*
|
|
61
|
+
* @throws {TypeError} If the URL uses an unsupported scheme.
|
|
62
|
+
*/
|
|
63
|
+
navigate(url: string): Promise<Protocol.Page.NavigateResponse>;
|
|
64
|
+
/**
|
|
65
|
+
* Subscribe to a CDP event.
|
|
66
|
+
*
|
|
67
|
+
* @param event - Event name, e.g. `"Page.loadEventFired"`.
|
|
68
|
+
* @param listener - Callback receiving the event parameters.
|
|
69
|
+
*/
|
|
70
|
+
on(event: string, listener: EventListener): void;
|
|
71
|
+
/**
|
|
72
|
+
* Remove a previously registered event listener.
|
|
73
|
+
*/
|
|
74
|
+
off(event: string, listener: EventListener): void;
|
|
75
|
+
/**
|
|
76
|
+
* Wait for a single occurrence of a CDP event.
|
|
77
|
+
*
|
|
78
|
+
* @param event - Event name.
|
|
79
|
+
* @param timeout - Maximum wait time in ms (default: client timeout).
|
|
80
|
+
*/
|
|
81
|
+
waitForEvent(event: string, timeout?: number): Promise<unknown>;
|
|
82
|
+
/** Whether the client currently has an open connection. */
|
|
83
|
+
get isConnected(): boolean;
|
|
84
|
+
/**
|
|
85
|
+
* Resolve a `ws://` URL for the given target ID, or the first page target.
|
|
86
|
+
*/
|
|
87
|
+
private resolveWebSocketUrl;
|
|
88
|
+
/**
|
|
89
|
+
* Open a WebSocket and wire up message handling.
|
|
90
|
+
*/
|
|
91
|
+
private openWebSocket;
|
|
92
|
+
/**
|
|
93
|
+
* Handle an incoming WebSocket message — either a method response or an event.
|
|
94
|
+
*/
|
|
95
|
+
private handleMessage;
|
|
96
|
+
/**
|
|
97
|
+
* Attempt to reconnect with exponential backoff.
|
|
98
|
+
*
|
|
99
|
+
* Called fire-and-forget from the WebSocket close handler. When all
|
|
100
|
+
* {@link MAX_RECONNECT_ATTEMPTS} are exhausted a `"reconnect-exhausted"`
|
|
101
|
+
* event is emitted so callers can react to permanent connection loss.
|
|
102
|
+
*/
|
|
103
|
+
private attemptReconnect;
|
|
104
|
+
/**
|
|
105
|
+
* Emit an event to registered listeners.
|
|
106
|
+
*/
|
|
107
|
+
private emitEvent;
|
|
108
|
+
/**
|
|
109
|
+
* Reject all pending requests (used on disconnect / close).
|
|
110
|
+
*/
|
|
111
|
+
private rejectAllPending;
|
|
112
|
+
}
|
|
113
|
+
export {};
|
|
114
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/cdp/client.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AA0BlD,KAAK,aAAa,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;AAE/C;;;;;;;;GAQG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAEjC,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;IAC7D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyC;IAEnE,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,YAAY,CAAS;gBAG3B,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE;IAsBtE;;;;;OAKG;IACG,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/C;;OAEG;IACH,UAAU,IAAI,IAAI;IAUlB;;;;;;OAMG;IACG,IAAI,CACR,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,OAAO,CAAC;IAoBnB;;;;;;OAMG;IACG,QAAQ,CAAC,CAAC,GAAG,OAAO,EACxB,UAAU,EAAE,MAAM,EAClB,YAAY,UAAQ,GACnB,OAAO,CAAC,CAAC,CAAC;IAqBb;;;;;;;OAOG;IACG,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC;IAWpE;;;;;OAKG;IACH,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAShD;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAIjD;;;;;OAKG;IACG,YAAY,CAChB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC;IAmBnB,2DAA2D;IAC3D,IAAI,WAAW,IAAI,OAAO,CAEzB;IAMD;;OAEG;YACW,mBAAmB;IA8BjC;;OAEG;IACH,OAAO,CAAC,aAAa;IA2CrB;;OAEG;IACH,OAAO,CAAC,aAAa;IA8BrB;;;;;;OAMG;YACW,gBAAgB;IAuB9B;;OAEG;IACH,OAAO,CAAC,SAAS;IASjB;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAOzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.integration.test.d.ts","sourceRoot":"","sources":["../../src/cdp/client.integration.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
|
+
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
|
+
import { afterAll, afterEach, beforeAll, describe, expect, it } from "vitest";
|
|
4
|
+
import { CDPClient } from "./client.js";
|
|
5
|
+
import { CDPEvaluationError } from "./errors.js";
|
|
6
|
+
import { launchChromium, } from "./testing/launch-chromium.js";
|
|
7
|
+
describe("CDPClient (integration)", () => {
|
|
8
|
+
let chromium;
|
|
9
|
+
let client;
|
|
10
|
+
beforeAll(async () => {
|
|
11
|
+
chromium = await launchChromium();
|
|
12
|
+
}, 30_000);
|
|
13
|
+
afterAll(async () => {
|
|
14
|
+
await chromium.close();
|
|
15
|
+
});
|
|
16
|
+
afterEach(() => {
|
|
17
|
+
client.disconnect();
|
|
18
|
+
});
|
|
19
|
+
describe("connect", () => {
|
|
20
|
+
it("should connect to a real Chromium page target", async () => {
|
|
21
|
+
client = new CDPClient(chromium.port);
|
|
22
|
+
await client.connect();
|
|
23
|
+
expect(client.isConnected).toBe(true);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
describe("evaluate", () => {
|
|
27
|
+
it("should evaluate a JavaScript expression", async () => {
|
|
28
|
+
client = new CDPClient(chromium.port);
|
|
29
|
+
await client.connect();
|
|
30
|
+
const result = await client.evaluate("2 + 2");
|
|
31
|
+
expect(result).toBe(4);
|
|
32
|
+
});
|
|
33
|
+
it("should evaluate expressions returning objects", async () => {
|
|
34
|
+
client = new CDPClient(chromium.port);
|
|
35
|
+
await client.connect();
|
|
36
|
+
const result = await client.evaluate("({ a: 1, b: 'hello' })");
|
|
37
|
+
expect(result).toEqual({ a: 1, b: "hello" });
|
|
38
|
+
});
|
|
39
|
+
it("should throw CDPEvaluationError on runtime exception", async () => {
|
|
40
|
+
client = new CDPClient(chromium.port);
|
|
41
|
+
await client.connect();
|
|
42
|
+
await expect(client.evaluate("throw new Error('test error')")).rejects.toThrow(CDPEvaluationError);
|
|
43
|
+
});
|
|
44
|
+
it("should await promise results when awaitPromise is true", async () => {
|
|
45
|
+
client = new CDPClient(chromium.port);
|
|
46
|
+
await client.connect();
|
|
47
|
+
const result = await client.evaluate("Promise.resolve(42)", true);
|
|
48
|
+
expect(result).toBe(42);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe("navigate", () => {
|
|
52
|
+
it("should navigate to an HTTP URL", async () => {
|
|
53
|
+
client = new CDPClient(chromium.port);
|
|
54
|
+
await client.connect();
|
|
55
|
+
const response = await client.navigate("http://example.com");
|
|
56
|
+
expect(response.frameId).toEqual(expect.any(String));
|
|
57
|
+
});
|
|
58
|
+
it("should reject non-HTTP schemes", async () => {
|
|
59
|
+
client = new CDPClient(chromium.port);
|
|
60
|
+
await client.connect();
|
|
61
|
+
await expect(client.navigate("data:text/html,<h1>Test</h1>")).rejects.toThrow(TypeError);
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
describe("events", () => {
|
|
65
|
+
it("should receive CDP events from the browser", async () => {
|
|
66
|
+
client = new CDPClient(chromium.port);
|
|
67
|
+
await client.connect();
|
|
68
|
+
// Enable Page domain to receive events
|
|
69
|
+
await client.send("Page.enable");
|
|
70
|
+
const eventPromise = client.waitForEvent("Page.loadEventFired", 10_000);
|
|
71
|
+
await client.navigate("http://example.com");
|
|
72
|
+
const params = (await eventPromise);
|
|
73
|
+
expect(params.timestamp).toEqual(expect.any(Number));
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=client.integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.integration.test.js","sourceRoot":"","sources":["../../src/cdp/client.integration.test.ts"],"names":[],"mappings":"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"}
|