@hraness/ghostget 0.17.2
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/CHANGELOG.md +458 -0
- package/LICENSE +21 -0
- package/README.md +1359 -0
- package/bunfig.toml +2 -0
- package/dist/apple-photos-client.js +704 -0
- package/dist/beeper-client.js +4602 -0
- package/dist/client.js +1605 -0
- package/dist/index-26yq8q16.js +31 -0
- package/dist/index-9t13b4k7.js +508 -0
- package/dist/index-axwm9b3v.js +5 -0
- package/dist/index-gwk7rbyj.js +30 -0
- package/dist/index.js +701 -0
- package/dist/messaging.js +1130 -0
- package/dist/omni-client.js +1406 -0
- package/dist/whatsapp-client.js +355 -0
- package/docs/imessage-direct-provider.md +106 -0
- package/docs/rental-listings.md +94 -0
- package/package.json +600 -0
- package/skills/ghostget/SKILL.md +251 -0
- package/skills/ghostget/agents/openai.yaml +4 -0
- package/skills/ghostget/references/adapter-contract.md +181 -0
- package/skills/ghostget/references/apple-photos.md +115 -0
- package/skills/ghostget/references/article-drafts.md +235 -0
- package/skills/ghostget/references/code-owned-provider-scaffold.md +134 -0
- package/skills/ghostget/references/cross-posting-video.md +139 -0
- package/skills/ghostget/references/cross-posting.md +82 -0
- package/skills/ghostget/references/derivation.md +390 -0
- package/skills/ghostget/references/hraness-social-profile-stats.json +269 -0
- package/skills/ghostget/references/install.md +66 -0
- package/skills/ghostget/references/linkedin-adapter.md +442 -0
- package/skills/ghostget/references/messaging.md +168 -0
- package/skills/ghostget/references/meta-comet-contract.md +153 -0
- package/skills/ghostget/references/platform-patterns.md +122 -0
- package/skills/ghostget/references/provider-plugins.md +496 -0
- package/skills/ghostget/references/reddit-flair.md +78 -0
- package/skills/ghostget/references/safety-and-state.md +214 -0
- package/skills/ghostget/references/settlement-and-duplicate-cleanup.md +79 -0
- package/skills/ghostget/references/social-platform-routing.md +66 -0
- package/skills/ghostget/references/social-profile-stats.md +195 -0
- package/skills/ghostget/references/social-video-platform-routing.md +89 -0
- package/skills/ghostget/references/whatsapp-adapter.md +101 -0
- package/skills/ghostget/references/x-adapter.md +332 -0
- package/skills/ghostget/references/x-ai-disclosure.md +71 -0
- package/src/apple-photos-cli.ts +639 -0
- package/src/apple-photos-client-types.ts +168 -0
- package/src/apple-photos-client.ts +201 -0
- package/src/apple-photos-contact-evidence.ts +838 -0
- package/src/apple-photos-local-source.ts +1131 -0
- package/src/args.ts +2053 -0
- package/src/article-draft-document.ts +417 -0
- package/src/article-draft-embeds.ts +123 -0
- package/src/article-draft-images.ts +214 -0
- package/src/assets/adapter-template/wrench-adapter.json +40 -0
- package/src/assets/adapters/beeper/wrench-web-adapter.json +1500 -0
- package/src/assets/adapters/beeper/wrench-web-adapter.v1.0.0.json +129 -0
- package/src/assets/adapters/beeper/wrench-web-adapter.v1.1.0.json +207 -0
- package/src/assets/adapters/beeper/wrench-web-adapter.v2.0.0.json +1463 -0
- package/src/assets/adapters/beeper/wrench-web-adapter.v2.1.0.json +1463 -0
- package/src/assets/adapters/beeper/wrench-web-adapter.v2.2.0.json +1475 -0
- package/src/assets/adapters/beeper/wrench-web-adapter.v2.3.0.json +1488 -0
- package/src/assets/adapters/bluesky/wrench-web-adapter.json +684 -0
- package/src/assets/adapters/bluesky/wrench-web-adapter.v1.0.0.json +581 -0
- package/src/assets/adapters/bluesky/wrench-web-adapter.v1.1.0.json +581 -0
- package/src/assets/adapters/bluesky/wrench-web-adapter.v1.2.0.json +581 -0
- package/src/assets/adapters/bluesky/wrench-web-adapter.v1.3.0.json +615 -0
- package/src/assets/adapters/bluesky/wrench-web-adapter.v1.4.0.json +684 -0
- package/src/assets/adapters/bluesky/wrench-web-adapter.v1.5.0.json +684 -0
- package/src/assets/adapters/bluesky/wrench-web-adapter.v1.6.0.json +684 -0
- package/src/assets/adapters/clasificados/wrench-web-adapter.json +54 -0
- package/src/assets/adapters/facebook/wrench-web-adapter.json +750 -0
- package/src/assets/adapters/facebook/wrench-web-adapter.v1.0.0.json +706 -0
- package/src/assets/adapters/facebook/wrench-web-adapter.v1.1.0.json +703 -0
- package/src/assets/adapters/facebook/wrench-web-adapter.v1.2.0.json +750 -0
- package/src/assets/adapters/facebook-group/wrench-web-adapter.json +682 -0
- package/src/assets/adapters/facebook-group/wrench-web-adapter.v1.0.0.json +583 -0
- package/src/assets/adapters/facebook-group/wrench-web-adapter.v1.1.0.json +682 -0
- package/src/assets/adapters/facebook-marketplace/wrench-web-adapter.json +437 -0
- package/src/assets/adapters/facebook-marketplace/wrench-web-adapter.v1.0.0.json +383 -0
- package/src/assets/adapters/facebook-marketplace/wrench-web-adapter.v1.1.0.json +437 -0
- package/src/assets/adapters/facebook-marketplace/wrench-web-adapter.v1.1.1.json +437 -0
- package/src/assets/adapters/facebook-page/wrench-web-adapter.json +880 -0
- package/src/assets/adapters/facebook-page/wrench-web-adapter.v1.0.0.json +740 -0
- package/src/assets/adapters/facebook-page/wrench-web-adapter.v1.1.0.json +880 -0
- package/src/assets/adapters/github/wrench-web-adapter.json +69 -0
- package/src/assets/adapters/github/wrench-web-adapter.v1.0.0.json +42 -0
- package/src/assets/adapters/github/wrench-web-adapter.v1.1.0.json +69 -0
- package/src/assets/adapters/gmail/wrench-adapter.json +161 -0
- package/src/assets/adapters/gmail/wrench-adapter.v1.2.0.json +157 -0
- package/src/assets/adapters/hacker-news/wrench-web-adapter.json +315 -0
- package/src/assets/adapters/hacker-news/wrench-web-adapter.v1.0.0.json +315 -0
- package/src/assets/adapters/imessage/wrench-web-adapter.json +236 -0
- package/src/assets/adapters/instagram/wrench-web-adapter.json +719 -0
- package/src/assets/adapters/instagram/wrench-web-adapter.v1.0.0.json +627 -0
- package/src/assets/adapters/instagram/wrench-web-adapter.v1.1.0.json +609 -0
- package/src/assets/adapters/instagram/wrench-web-adapter.v1.2.0.json +640 -0
- package/src/assets/adapters/instagram/wrench-web-adapter.v1.3.0.json +671 -0
- package/src/assets/adapters/instagram/wrench-web-adapter.v1.4.0.json +710 -0
- package/src/assets/adapters/instagram/wrench-web-adapter.v1.5.0.json +710 -0
- package/src/assets/adapters/instagram/wrench-web-adapter.v1.6.0.json +719 -0
- package/src/assets/adapters/instagram/wrench-web-adapter.v1.7.0.json +719 -0
- package/src/assets/adapters/linkedin/wrench-adapter.json +442 -0
- package/src/assets/adapters/linkedin/wrench-adapter.v0.4.0.json +124 -0
- package/src/assets/adapters/linkedin/wrench-adapter.v1.0.0.json +411 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.json +914 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.0.0.json +604 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.1.0.json +604 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.10.0.json +809 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.11.0.json +809 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.12.0.json +820 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.13.0.json +819 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.14.0.json +819 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.15.0.json +819 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.16.0.json +874 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.17.0.json +874 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.18.0.json +874 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.19.0.json +874 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.2.0.json +731 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.3.0.json +768 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.4.0.json +808 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.5.0.json +808 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.6.0.json +808 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.7.0.json +825 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.8.0.json +792 -0
- package/src/assets/adapters/linkedin/wrench-web-adapter.v1.9.0.json +809 -0
- package/src/assets/adapters/reddit/wrench-web-adapter.json +855 -0
- package/src/assets/adapters/reddit/wrench-web-adapter.v1.0.0.json +577 -0
- package/src/assets/adapters/reddit/wrench-web-adapter.v1.1.0.json +604 -0
- package/src/assets/adapters/reddit/wrench-web-adapter.v1.10.0.json +712 -0
- package/src/assets/adapters/reddit/wrench-web-adapter.v1.11.0.json +712 -0
- package/src/assets/adapters/reddit/wrench-web-adapter.v1.12.0.json +712 -0
- package/src/assets/adapters/reddit/wrench-web-adapter.v1.2.0.json +653 -0
- package/src/assets/adapters/reddit/wrench-web-adapter.v1.3.0.json +712 -0
- package/src/assets/adapters/reddit/wrench-web-adapter.v1.4.0.json +713 -0
- package/src/assets/adapters/reddit/wrench-web-adapter.v1.5.0.json +712 -0
- package/src/assets/adapters/reddit/wrench-web-adapter.v1.6.0.json +713 -0
- package/src/assets/adapters/reddit/wrench-web-adapter.v1.7.0.json +713 -0
- package/src/assets/adapters/reddit/wrench-web-adapter.v1.8.0.json +713 -0
- package/src/assets/adapters/reddit/wrench-web-adapter.v1.9.0.json +713 -0
- package/src/assets/adapters/substack/wrench-web-adapter.json +936 -0
- package/src/assets/adapters/substack/wrench-web-adapter.v1.0.0.json +817 -0
- package/src/assets/adapters/substack/wrench-web-adapter.v1.1.0.json +812 -0
- package/src/assets/adapters/substack/wrench-web-adapter.v1.2.0.json +812 -0
- package/src/assets/adapters/substack/wrench-web-adapter.v1.3.0.json +902 -0
- package/src/assets/adapters/substack/wrench-web-adapter.v1.4.0.json +936 -0
- package/src/assets/adapters/substack/wrench-web-adapter.v1.5.0.json +936 -0
- package/src/assets/adapters/substack/wrench-web-adapter.v1.6.0.json +936 -0
- package/src/assets/adapters/threads/wrench-web-adapter.json +692 -0
- package/src/assets/adapters/threads/wrench-web-adapter.v1.0.0.json +629 -0
- package/src/assets/adapters/threads/wrench-web-adapter.v1.1.0.json +623 -0
- package/src/assets/adapters/threads/wrench-web-adapter.v1.2.0.json +622 -0
- package/src/assets/adapters/threads/wrench-web-adapter.v1.3.0.json +622 -0
- package/src/assets/adapters/threads/wrench-web-adapter.v1.4.0.json +622 -0
- package/src/assets/adapters/threads/wrench-web-adapter.v1.5.0.json +699 -0
- package/src/assets/adapters/threads/wrench-web-adapter.v1.6.0.json +693 -0
- package/src/assets/adapters/threads/wrench-web-adapter.v1.7.0.json +692 -0
- package/src/assets/adapters/tiktok/wrench-web-adapter.json +762 -0
- package/src/assets/adapters/tiktok/wrench-web-adapter.v1.0.0.json +681 -0
- package/src/assets/adapters/tiktok/wrench-web-adapter.v1.1.0.json +708 -0
- package/src/assets/adapters/tiktok/wrench-web-adapter.v1.2.0.json +762 -0
- package/src/assets/adapters/tiktok/wrench-web-adapter.v1.3.0.json +762 -0
- package/src/assets/adapters/twitch/wrench-web-adapter.json +42 -0
- package/src/assets/adapters/twitch/wrench-web-adapter.v1.0.0.json +42 -0
- package/src/assets/adapters/whatsapp/wrench-web-adapter.json +400 -0
- package/src/assets/adapters/whatsapp/wrench-web-adapter.v1.0.0.json +355 -0
- package/src/assets/adapters/whatsapp/wrench-web-adapter.v1.1.0.json +386 -0
- package/src/assets/adapters/whatsapp/wrench-web-adapter.v1.2.0.json +386 -0
- package/src/assets/adapters/whatsapp/wrench-web-adapter.v1.3.0.json +400 -0
- package/src/assets/adapters/x/wrench-adapter.json +749 -0
- package/src/assets/adapters/x/wrench-adapter.v1.0.0.json +700 -0
- package/src/assets/adapters/x/wrench-adapter.v1.1.0.json +707 -0
- package/src/assets/adapters/x/wrench-web-adapter.json +712 -0
- package/src/assets/adapters/x/wrench-web-adapter.v1.1.0.json +579 -0
- package/src/assets/adapters/x/wrench-web-adapter.v1.10.0.json +685 -0
- package/src/assets/adapters/x/wrench-web-adapter.v1.11.0.json +712 -0
- package/src/assets/adapters/x/wrench-web-adapter.v1.12.0.json +712 -0
- package/src/assets/adapters/x/wrench-web-adapter.v1.13.0.json +712 -0
- package/src/assets/adapters/x/wrench-web-adapter.v1.2.0.json +578 -0
- package/src/assets/adapters/x/wrench-web-adapter.v1.3.0.json +610 -0
- package/src/assets/adapters/x/wrench-web-adapter.v1.4.0.json +617 -0
- package/src/assets/adapters/x/wrench-web-adapter.v1.5.0.json +634 -0
- package/src/assets/adapters/x/wrench-web-adapter.v1.6.0.json +632 -0
- package/src/assets/adapters/x/wrench-web-adapter.v1.7.0.json +649 -0
- package/src/assets/adapters/x/wrench-web-adapter.v1.8.0.json +649 -0
- package/src/assets/adapters/x/wrench-web-adapter.v1.9.0.json +683 -0
- package/src/assets/adapters/youtube/wrench-web-adapter.json +561 -0
- package/src/assets/adapters/youtube/wrench-web-adapter.v1.0.0.json +465 -0
- package/src/assets/adapters/youtube/wrench-web-adapter.v1.1.0.json +519 -0
- package/src/assets/adapters/youtube/wrench-web-adapter.v1.2.0.json +561 -0
- package/src/assets/adapters/youtube/wrench-web-adapter.v1.3.0.json +561 -0
- package/src/assets/code-owned-provider-template/plugin.test.ts.template +54 -0
- package/src/assets/code-owned-provider-template/plugin.ts.template +102 -0
- package/src/assets/code-owned-provider-template/runtime.internal.test.ts.template +44 -0
- package/src/assets/code-owned-provider-template/runtime.ts.template +59 -0
- package/src/assets/code-owned-provider-template/wrench-adapter.json.template +33 -0
- package/src/assets/fonts/nebula-sans/LICENSE.txt +96 -0
- package/src/assets/fonts/nebula-sans/NebulaSans-Book.woff2 +0 -0
- package/src/assets/fonts/nebula-sans/PROVENANCE.md +14 -0
- package/src/assets.d.ts +4 -0
- package/src/auth.ts +1157 -0
- package/src/beeper-client-types.ts +169 -0
- package/src/beeper-client.ts +250 -0
- package/src/beeper-contact-interactions-cli.ts +180 -0
- package/src/beeper-contact-interactions.ts +1612 -0
- package/src/beeper-message-bundle-v1.ts +257 -0
- package/src/beeper-message-like-me-cli.ts +84 -0
- package/src/beeper-message-like-me-export.ts +2274 -0
- package/src/beeper-message-like-me-recovery.ts +931 -0
- package/src/beeper-message-like-me-source.ts +4034 -0
- package/src/browser-admission.ts +928 -0
- package/src/browser-snapshots.ts +260 -0
- package/src/browser.ts +3873 -0
- package/src/canonical-json.ts +60 -0
- package/src/catalog-cli.ts +638 -0
- package/src/cli.ts +208 -0
- package/src/client-types.ts +301 -0
- package/src/client.ts +2726 -0
- package/src/confirmed-write-failure.ts +44 -0
- package/src/confirmed-write-model.ts +72 -0
- package/src/confirmed-write-platform.ts +1055 -0
- package/src/confirmed-write-program.ts +224 -0
- package/src/confirmed-write-runtime.ts +16 -0
- package/src/cursor-token.ts +228 -0
- package/src/derivation-dnr-readiness.ts +367 -0
- package/src/derivation-file-chooser.ts +384 -0
- package/src/derivation-network-boundary.ts +835 -0
- package/src/derivation-network-guard.ts +782 -0
- package/src/derivation-network-proxy-helper.ts +440 -0
- package/src/derivation-network-proxy.ts +385 -0
- package/src/derive-command-helper.ts +693 -0
- package/src/derive-fixtures.ts +343 -0
- package/src/derive-review.ts +980 -0
- package/src/derive.ts +4754 -0
- package/src/fixtures/beeper-message-like-me-v1/accounts.ndjson +2 -0
- package/src/fixtures/beeper-message-like-me-v1/conversations.ndjson +1 -0
- package/src/fixtures/beeper-message-like-me-v1/manifest.json +1 -0
- package/src/fixtures/beeper-message-like-me-v1/messages.ndjson +2 -0
- package/src/fixtures/beeper-message-like-me-v1/participants.ndjson +3 -0
- package/src/fixtures/beeper-message-like-me-v1/reactions.ndjson +1 -0
- package/src/fixtures/beeper-message-like-me-v1/tombstones.ndjson +1 -0
- package/src/ghostget.ts +3672 -0
- package/src/gmail-capture.ts +1244 -0
- package/src/har-internal.ts +1242 -0
- package/src/har.ts +743 -0
- package/src/index.ts +218 -0
- package/src/invocation-read-platform.ts +55 -0
- package/src/invocation-read-program.ts +93 -0
- package/src/invocation-read-runtime.ts +11 -0
- package/src/linked-device-lifecycle-admission.ts +450 -0
- package/src/linked-device-lifecycle-journal.ts +1560 -0
- package/src/linked-device-lifecycle-runtime.ts +1602 -0
- package/src/local-cli-admission.ts +135 -0
- package/src/local-cli-contracts.ts +271 -0
- package/src/local-cli-execution.ts +98 -0
- package/src/local-cli-surface-contract.ts +1510 -0
- package/src/local-cli-tool-identity.ts +336 -0
- package/src/media/archive.ts +2325 -0
- package/src/media/args.ts +303 -0
- package/src/media/cli.ts +287 -0
- package/src/media/doctor.ts +475 -0
- package/src/media/ffmpeg.ts +1330 -0
- package/src/media/http-capture.ts +711 -0
- package/src/media/http-probe.ts +593 -0
- package/src/media/http.ts +387 -0
- package/src/media/index.ts +10 -0
- package/src/media/local-transcription.ts +613 -0
- package/src/media/lock.ts +321 -0
- package/src/media/manifest.ts +1712 -0
- package/src/media/metadata.ts +906 -0
- package/src/media/process.ts +723 -0
- package/src/media/revision.ts +166 -0
- package/src/media/runtime-closure.ts +1063 -0
- package/src/media/source-router.ts +187 -0
- package/src/media/transcriber-config.ts +1122 -0
- package/src/media/transcript-persistence-model.ts +15 -0
- package/src/media/transcript-persistence-platform.ts +89 -0
- package/src/media/transcript-persistence-program.ts +39 -0
- package/src/media/transcript-persistence-runtime.ts +24 -0
- package/src/media/transcript.ts +616 -0
- package/src/media/utf8-order.ts +30 -0
- package/src/media/whisper-cpp.ts +464 -0
- package/src/media/whisper-language.ts +58 -0
- package/src/media/yt-dlp.ts +439 -0
- package/src/message-like-me-agentic-messaging.ts +882 -0
- package/src/messaging-action-store.ts +793 -0
- package/src/messaging-runtime.ts +2136 -0
- package/src/messaging-store.ts +539 -0
- package/src/messaging-types.ts +1663 -0
- package/src/messaging.ts +334 -0
- package/src/model.ts +2671 -0
- package/src/oauth-google.ts +888 -0
- package/src/omni-client-types.ts +306 -0
- package/src/omni-client.ts +2225 -0
- package/src/omni-limits.ts +34 -0
- package/src/omni-model.ts +1614 -0
- package/src/omni-request.ts +379 -0
- package/src/omni-runtime.ts +1632 -0
- package/src/operation-deadline.ts +189 -0
- package/src/path-helper.ts +1656 -0
- package/src/pinned-https.ts +194 -0
- package/src/plan-assets.ts +832 -0
- package/src/platform-catalog.ts +1832 -0
- package/src/plugins/beeper-linked-device/plugin.ts +310 -0
- package/src/plugins/bluesky-web/plugin.ts +178 -0
- package/src/plugins/clasificados-web/plugin.ts +66 -0
- package/src/plugins/github-web/plugin.ts +80 -0
- package/src/plugins/gmail-official/plugin.ts +110 -0
- package/src/plugins/hacker-news-web/plugin.ts +52 -0
- package/src/plugins/imessage-direct/plugin.ts +195 -0
- package/src/plugins/imessage-direct/vendor/0001-fix-keep-AppleScript-send-payloads-out-of-child-argv.patch +1430 -0
- package/src/plugins/imessage-direct/vendor/0002-feat-rpc-add-exact-chat-lookup.patch +225 -0
- package/src/plugins/imessage-direct/vendor/provenance.json +80 -0
- package/src/plugins/linkedin-official/plugin.ts +84 -0
- package/src/plugins/linkedin-web/plugin.ts +412 -0
- package/src/plugins/meta-web/plugin.ts +317 -0
- package/src/plugins/reddit-web/flair.ts +492 -0
- package/src/plugins/reddit-web/plugin.ts +477 -0
- package/src/plugins/substack-web/plugin.ts +124 -0
- package/src/plugins/tiktok-web/plugin.ts +67 -0
- package/src/plugins/twitch-web/plugin.ts +54 -0
- package/src/plugins/whatsapp-linked-device/plugin.ts +105 -0
- package/src/plugins/x-official/plugin.ts +64 -0
- package/src/plugins/x-web/plugin.ts +488 -0
- package/src/plugins/youtube-web/plugin.ts +101 -0
- package/src/portable-run-recovery.ts +466 -0
- package/src/process-identity.ts +501 -0
- package/src/profile-clone-helper.ts +104 -0
- package/src/provider-catalog-views.ts +51 -0
- package/src/provider-context.ts +69 -0
- package/src/provider-contract-definitions-x.ts +45 -0
- package/src/provider-contract-definitions.ts +948 -0
- package/src/provider-contract-input-gmail.ts +176 -0
- package/src/provider-contract-input-linkedin.ts +77 -0
- package/src/provider-contract-input-x.ts +304 -0
- package/src/provider-contract-planning.ts +23 -0
- package/src/provider-contract-semantic-identity.ts +54 -0
- package/src/provider-contracts.ts +251 -0
- package/src/provider-http.ts +723 -0
- package/src/provider-plugin-auth.ts +36 -0
- package/src/provider-plugin-builtins.ts +229 -0
- package/src/provider-plugin-cleanup-barrier.ts +229 -0
- package/src/provider-plugin-cleanup-execution.ts +79 -0
- package/src/provider-plugin-cleanup-resource.ts +470 -0
- package/src/provider-plugin-contract-identity.ts +707 -0
- package/src/provider-plugin-host.ts +1972 -0
- package/src/provider-plugin-identifiers.ts +60 -0
- package/src/provider-plugin-invocation-lease.ts +889 -0
- package/src/provider-plugin-lifecycle-kernel.ts +566 -0
- package/src/provider-plugin-lifecycle.ts +1455 -0
- package/src/provider-plugin-module-analysis.ts +336 -0
- package/src/provider-plugin-package.ts +2530 -0
- package/src/provider-plugin-portable-authority.ts +106 -0
- package/src/provider-plugin-portable-catalog.ts +94 -0
- package/src/provider-plugin-portable-identity.ts +315 -0
- package/src/provider-plugin-portable-runtime.ts +2057 -0
- package/src/provider-plugin-protocol.ts +1625 -0
- package/src/provider-plugin-registry.ts +3342 -0
- package/src/provider-plugin-store.ts +2155 -0
- package/src/provider-plugin-test-fixture.ts +5 -0
- package/src/provider-plugin.ts +4907 -0
- package/src/provider-plugins.generated.ts +43 -0
- package/src/provider-plugins.ts +8 -0
- package/src/provider-subject.ts +41 -0
- package/src/provider.ts +315 -0
- package/src/providers/beeper-local-runtime.ts +5426 -0
- package/src/providers/beeper-local.ts +2739 -0
- package/src/providers/beeper-messaging.ts +462 -0
- package/src/providers/beeper-omni.ts +1159 -0
- package/src/providers/bluesky-web-runtime.ts +2895 -0
- package/src/providers/bluesky-web.ts +1614 -0
- package/src/providers/clasificados-web-runtime.ts +255 -0
- package/src/providers/clasificados-web.ts +503 -0
- package/src/providers/contact-projection.ts +301 -0
- package/src/providers/github-read-model.ts +94 -0
- package/src/providers/github-read-platform.ts +165 -0
- package/src/providers/github-read-program.ts +97 -0
- package/src/providers/github-web-runtime.ts +320 -0
- package/src/providers/github-web.ts +403 -0
- package/src/providers/gmail-api.ts +2834 -0
- package/src/providers/gmail-omni.ts +830 -0
- package/src/providers/gmail.ts +1130 -0
- package/src/providers/hacker-news-web-runtime.ts +220 -0
- package/src/providers/hacker-news-web.ts +809 -0
- package/src/providers/imessage-direct-install.ts +354 -0
- package/src/providers/imessage-direct-messaging.ts +532 -0
- package/src/providers/imessage-direct-omni.ts +400 -0
- package/src/providers/imessage-direct-runtime.ts +1498 -0
- package/src/providers/imessage-direct.ts +351 -0
- package/src/providers/instagram-video-foundations.ts +913 -0
- package/src/providers/instagram-web-profile-browser.ts +600 -0
- package/src/providers/iso-bmff.ts +338 -0
- package/src/providers/linkedin-company-platform.ts +42 -0
- package/src/providers/linkedin-company-program.ts +88 -0
- package/src/providers/linkedin-contact-failure.ts +84 -0
- package/src/providers/linkedin-contact-platform.ts +45 -0
- package/src/providers/linkedin-contact-program.ts +91 -0
- package/src/providers/linkedin-profile-activity-failure.ts +76 -0
- package/src/providers/linkedin-profile-activity-platform.ts +41 -0
- package/src/providers/linkedin-profile-activity-program.ts +67 -0
- package/src/providers/linkedin-read-failure.ts +52 -0
- package/src/providers/linkedin-self-platform.ts +53 -0
- package/src/providers/linkedin-self-program.ts +122 -0
- package/src/providers/linkedin-web-article-browser.ts +794 -0
- package/src/providers/linkedin-web-bootstrap.ts +146 -0
- package/src/providers/linkedin-web-contact.ts +830 -0
- package/src/providers/linkedin-web-feed-browser.ts +832 -0
- package/src/providers/linkedin-web-feed.ts +864 -0
- package/src/providers/linkedin-web-post-browser.ts +653 -0
- package/src/providers/linkedin-web-profile-browser.ts +683 -0
- package/src/providers/linkedin-web-runtime.ts +2388 -0
- package/src/providers/linkedin-web.ts +3305 -0
- package/src/providers/linkedin.ts +1885 -0
- package/src/providers/meta-bootstrap.ts +1043 -0
- package/src/providers/meta-facebook-group.ts +690 -0
- package/src/providers/meta-marketplace-relay.ts +747 -0
- package/src/providers/meta-omni.ts +373 -0
- package/src/providers/meta-relay-bundle.ts +1049 -0
- package/src/providers/meta-web-descriptors.ts +1740 -0
- package/src/providers/meta-web-runtime.ts +3388 -0
- package/src/providers/meta-web.ts +2931 -0
- package/src/providers/read-failure.ts +139 -0
- package/src/providers/reddit-omni.ts +462 -0
- package/src/providers/reddit-web-runtime.ts +1929 -0
- package/src/providers/reddit-web.ts +1611 -0
- package/src/providers/rental-listings.ts +460 -0
- package/src/providers/substack-omni.ts +406 -0
- package/src/providers/substack-video-mp4.ts +33 -0
- package/src/providers/substack-web-runtime.ts +2812 -0
- package/src/providers/substack-web.ts +1502 -0
- package/src/providers/tiktok-video-mp4.ts +33 -0
- package/src/providers/tiktok-web-runtime.ts +770 -0
- package/src/providers/tiktok-web.ts +2786 -0
- package/src/providers/twitch-web-runtime.ts +226 -0
- package/src/providers/twitch-web.ts +274 -0
- package/src/providers/whatsapp-account-identity.ts +55 -0
- package/src/providers/whatsapp-contact-projection-helper.ts +874 -0
- package/src/providers/whatsapp-contact-projection-protocol.ts +403 -0
- package/src/providers/whatsapp-interaction-projection-helper.ts +1452 -0
- package/src/providers/whatsapp-interaction-projection-protocol.ts +462 -0
- package/src/providers/whatsapp-message-export-projection-protocol.ts +532 -0
- package/src/providers/whatsapp-messaging.ts +132 -0
- package/src/providers/whatsapp-omni.ts +586 -0
- package/src/providers/whatsapp-web-runtime.ts +3108 -0
- package/src/providers/whatsapp-web.ts +1037 -0
- package/src/providers/x-image-provenance.ts +523 -0
- package/src/providers/x-made-with-ai.ts +106 -0
- package/src/providers/x-transaction-id.ts +413 -0
- package/src/providers/x-web-runtime.ts +3485 -0
- package/src/providers/x-web.ts +2332 -0
- package/src/providers/x.ts +1889 -0
- package/src/providers/youtube-web-runtime.ts +1400 -0
- package/src/providers/youtube-web.ts +1221 -0
- package/src/read-admission-runtime.ts +91 -0
- package/src/read-client.ts +521 -0
- package/src/read-effect-platform.ts +7 -0
- package/src/read-effect-runtime.ts +14 -0
- package/src/read-effect.ts +52 -0
- package/src/read-projection-admission.ts +866 -0
- package/src/read-projections.ts +3151 -0
- package/src/recovery.ts +1492 -0
- package/src/reviewed-template.ts +146 -0
- package/src/run-journal.ts +1272 -0
- package/src/runtime.ts +5116 -0
- package/src/scripts/generate-provider-plugin-catalog.ts +121 -0
- package/src/scripts/install-whatsapp-protocol.sh +232 -0
- package/src/scripts/recover-install-stages.ts +1491 -0
- package/src/scripts/resolve-state-home.ts +30 -0
- package/src/scripts/scaffold-web-provider.ts +973 -0
- package/src/scripts/sync-bundled-adapters.ts +695 -0
- package/src/session-secrets.ts +1183 -0
- package/src/state-helper.bunfig.toml +2 -0
- package/src/state-helper.ts +2914 -0
- package/src/storage.ts +3842 -0
- package/src/transport-policy.ts +2 -0
- package/src/usage.ts +182 -0
- package/src/version.ts +2 -0
- package/src/web-session-authentication-policy.ts +136 -0
- package/src/web-session-cleanup-admission.ts +2344 -0
- package/src/web-session-cleanup-join.ts +99 -0
- package/src/web-session-client.ts +996 -0
- package/src/web-session-contract-definitions.ts +820 -0
- package/src/web-session-contract-planning.ts +42 -0
- package/src/web-session-contracts.ts +228 -0
- package/src/web-session-cookies.ts +500 -0
- package/src/web-session-execution.ts +385 -0
- package/src/web-session-http.ts +373 -0
- package/src/web-session-read-errors.ts +19 -0
- package/src/web-session-read-runtime.ts +124 -0
- package/src/web-session-recovery.ts +818 -0
- package/src/web-session-sites.ts +58 -0
- package/src/web-session-template.ts +994 -0
- package/src/web-session.ts +93 -0
- package/src/whatsapp-client-binding.ts +21 -0
- package/src/whatsapp-client-types.ts +75 -0
- package/src/whatsapp-client.ts +395 -0
- package/src/whatsapp-export-coordinate.ts +17 -0
- package/src/whatsapp-message-bundle-v2.ts +195 -0
- package/src/whatsapp-message-like-me-cli.ts +195 -0
- package/src/whatsapp-message-like-me-export.ts +1072 -0
- package/src/whatsapp-message-like-me-source.ts +1012 -0
- package/tsconfig.json +67 -0
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
import { trackWebSessionCleanupBarrier, awaitWebSessionCleanupBarriers, type TrackedWebSessionCleanupBarrier } from "./web-session-cleanup-join";
|
|
2
|
+
import { types as nodeTypes } from "node:util";
|
|
3
|
+
|
|
4
|
+
import type { GhostgetAuth } from "./auth";
|
|
5
|
+
import type {
|
|
6
|
+
BrowserFileResolver,
|
|
7
|
+
} from "./browser";
|
|
8
|
+
import type {
|
|
9
|
+
GhostgetManifest,
|
|
10
|
+
OperationInput,
|
|
11
|
+
WebSessionRecipe,
|
|
12
|
+
} from "./model";
|
|
13
|
+
import type {
|
|
14
|
+
ProviderAcceptedMutationTarget,
|
|
15
|
+
ProviderBoundMutationTarget,
|
|
16
|
+
} from "./recovery";
|
|
17
|
+
import {
|
|
18
|
+
OperationDeadline,
|
|
19
|
+
type OperationDeadlineClock,
|
|
20
|
+
} from "./operation-deadline";
|
|
21
|
+
import type { WebSessionPluginOperationV1 } from "./provider-plugin";
|
|
22
|
+
import {
|
|
23
|
+
startProviderPluginCleanupTrackedOperation,
|
|
24
|
+
type ProviderPluginCleanupBarrierRegistrar,
|
|
25
|
+
type ProviderPluginCleanupResourcePublisher,
|
|
26
|
+
} from "./provider-plugin-cleanup-execution";
|
|
27
|
+
|
|
28
|
+
export {
|
|
29
|
+
startProviderPluginCleanupTrackedOperation,
|
|
30
|
+
type ProviderPluginCleanupBarrierRegistrar,
|
|
31
|
+
type ProviderPluginCleanupResourcePublisher,
|
|
32
|
+
} from "./provider-plugin-cleanup-execution";
|
|
33
|
+
|
|
34
|
+
const WEB_SESSION_OPERATION_LABEL = "authenticated web operation deadline";
|
|
35
|
+
export const WEB_SESSION_CLEANUP_JOIN_TIMEOUT_MS = 30_000;
|
|
36
|
+
|
|
37
|
+
export class WebSessionCleanupUnverifiedError extends Error {
|
|
38
|
+
constructor(cause?: unknown) {
|
|
39
|
+
super(
|
|
40
|
+
"provider resource cleanup could not be verified within its bounded join; retry is unsafe until ghostget doctor proves and completes exact resource recovery",
|
|
41
|
+
cause === undefined ? undefined : { cause },
|
|
42
|
+
);
|
|
43
|
+
this.name = "WebSessionCleanupUnverifiedError";
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export type ReadFailureProjection =
|
|
48
|
+
| {
|
|
49
|
+
readonly category: "target-unavailable";
|
|
50
|
+
readonly retryDisposition: "do-not-retry";
|
|
51
|
+
}
|
|
52
|
+
| {
|
|
53
|
+
readonly category: "auth-repair-required";
|
|
54
|
+
readonly retryDisposition: "repair-auth";
|
|
55
|
+
}
|
|
56
|
+
| {
|
|
57
|
+
readonly category:
|
|
58
|
+
| "account-mismatch"
|
|
59
|
+
| "contract-drift"
|
|
60
|
+
| "cleanup-required";
|
|
61
|
+
readonly retryDisposition: "do-not-retry";
|
|
62
|
+
}
|
|
63
|
+
| {
|
|
64
|
+
readonly category:
|
|
65
|
+
| "provider-throttled"
|
|
66
|
+
| "provider-temporary"
|
|
67
|
+
| "operation-timeout";
|
|
68
|
+
readonly retryDisposition: "retry-once-after-60s";
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const readFailureRetryDisposition = Object.freeze({
|
|
72
|
+
"target-unavailable": "do-not-retry",
|
|
73
|
+
"auth-repair-required": "repair-auth",
|
|
74
|
+
"account-mismatch": "do-not-retry",
|
|
75
|
+
"provider-throttled": "retry-once-after-60s",
|
|
76
|
+
"provider-temporary": "retry-once-after-60s",
|
|
77
|
+
"operation-timeout": "retry-once-after-60s",
|
|
78
|
+
"contract-drift": "do-not-retry",
|
|
79
|
+
"cleanup-required": "do-not-retry",
|
|
80
|
+
} as const satisfies Readonly<Record<
|
|
81
|
+
ReadFailureProjection["category"],
|
|
82
|
+
ReadFailureProjection["retryDisposition"]
|
|
83
|
+
>>);
|
|
84
|
+
|
|
85
|
+
export function readFailureProjection(
|
|
86
|
+
category: ReadFailureProjection["category"],
|
|
87
|
+
): ReadFailureProjection {
|
|
88
|
+
return Object.freeze({
|
|
89
|
+
category,
|
|
90
|
+
retryDisposition: readFailureRetryDisposition[category],
|
|
91
|
+
}) as ReadFailureProjection;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export function parseReadFailureProjection(
|
|
95
|
+
value: unknown,
|
|
96
|
+
): ReadFailureProjection {
|
|
97
|
+
if (
|
|
98
|
+
typeof value !== "object"
|
|
99
|
+
|| value === null
|
|
100
|
+
|| Array.isArray(value)
|
|
101
|
+
|| nodeTypes.isProxy(value)
|
|
102
|
+
) {
|
|
103
|
+
throw new Error("read failure projection must be a plain data object");
|
|
104
|
+
}
|
|
105
|
+
const prototype = Object.getPrototypeOf(value) as unknown;
|
|
106
|
+
if (prototype !== Object.prototype && prototype !== null) {
|
|
107
|
+
throw new Error("read failure projection must be a plain data object");
|
|
108
|
+
}
|
|
109
|
+
const descriptors = Object.getOwnPropertyDescriptors(value);
|
|
110
|
+
if (
|
|
111
|
+
Reflect.ownKeys(descriptors).some((key) => typeof key !== "string")
|
|
112
|
+
|| Object.keys(descriptors).sort().join(",") !== "category,retryDisposition"
|
|
113
|
+
) {
|
|
114
|
+
throw new Error("read failure projection is malformed");
|
|
115
|
+
}
|
|
116
|
+
const categoryDescriptor = descriptors.category;
|
|
117
|
+
const dispositionDescriptor = descriptors.retryDisposition;
|
|
118
|
+
if (
|
|
119
|
+
categoryDescriptor === undefined
|
|
120
|
+
|| dispositionDescriptor === undefined
|
|
121
|
+
|| !categoryDescriptor.enumerable
|
|
122
|
+
|| !dispositionDescriptor.enumerable
|
|
123
|
+
|| !("value" in categoryDescriptor)
|
|
124
|
+
|| !("value" in dispositionDescriptor)
|
|
125
|
+
) throw new Error("read failure projection is malformed");
|
|
126
|
+
const category = categoryDescriptor.value as unknown;
|
|
127
|
+
if (
|
|
128
|
+
typeof category !== "string"
|
|
129
|
+
|| !Object.hasOwn(readFailureRetryDisposition, category)
|
|
130
|
+
) throw new Error("read failure category is malformed");
|
|
131
|
+
const expected = readFailureRetryDisposition[
|
|
132
|
+
category as ReadFailureProjection["category"]
|
|
133
|
+
];
|
|
134
|
+
if (dispositionDescriptor.value !== expected) {
|
|
135
|
+
throw new Error("read failure retry disposition is inconsistent");
|
|
136
|
+
}
|
|
137
|
+
return readFailureProjection(category as ReadFailureProjection["category"]);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export type WebSessionExecution = {
|
|
141
|
+
readonly status: "succeeded" | "failed" | "partial" | "indeterminate";
|
|
142
|
+
readonly output: unknown;
|
|
143
|
+
readonly finalUrl: string | null;
|
|
144
|
+
/**
|
|
145
|
+
* A desired-state write was already satisfied by an independently bound
|
|
146
|
+
* preflight, so no provider dispatch was started.
|
|
147
|
+
*/
|
|
148
|
+
readonly noOp?: true;
|
|
149
|
+
readonly dispatchStarted: boolean;
|
|
150
|
+
readonly dispatch: {
|
|
151
|
+
readonly planned: number;
|
|
152
|
+
readonly started: number;
|
|
153
|
+
readonly verified: number;
|
|
154
|
+
};
|
|
155
|
+
readonly error?: string;
|
|
156
|
+
/** Stable redacted failure policy for an R1 result that failed pre-dispatch. */
|
|
157
|
+
readonly readFailure?: ReadFailureProjection;
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
export type WebSessionDispatchEvent = {
|
|
161
|
+
readonly id: string;
|
|
162
|
+
readonly index: number;
|
|
163
|
+
readonly progress: WebSessionExecution["dispatch"];
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
export type WebSessionProviderAcceptedMutationTargetEvent = {
|
|
167
|
+
readonly id: string;
|
|
168
|
+
readonly index: number;
|
|
169
|
+
readonly target: ProviderAcceptedMutationTarget;
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
export type WebSessionProviderBoundMutationTargetEvent = {
|
|
173
|
+
readonly id: string;
|
|
174
|
+
readonly index: number;
|
|
175
|
+
readonly target: ProviderBoundMutationTarget;
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
export type WebSessionOperationDeadline = Pick<
|
|
179
|
+
OperationDeadline,
|
|
180
|
+
"signal" | "remainingTimeMs" | "run" | "throwIfUnavailable"
|
|
181
|
+
>;
|
|
182
|
+
|
|
183
|
+
/** Compatibility names retained for existing browser-backed runtimes. */
|
|
184
|
+
export type WebSessionCleanupResourcePublisher =
|
|
185
|
+
ProviderPluginCleanupResourcePublisher;
|
|
186
|
+
export type WebSessionCleanupBarrierRegistrar =
|
|
187
|
+
ProviderPluginCleanupBarrierRegistrar;
|
|
188
|
+
|
|
189
|
+
/** Compatibility wrapper for existing browser-backed runtimes. */
|
|
190
|
+
export function startWebSessionCleanupTrackedOperation<T>(
|
|
191
|
+
register: WebSessionCleanupBarrierRegistrar | undefined,
|
|
192
|
+
start: (
|
|
193
|
+
publishCleanupResource: WebSessionCleanupResourcePublisher | undefined,
|
|
194
|
+
) => Promise<T>,
|
|
195
|
+
cleanupBoundary: (operation: Promise<T>) => Promise<void>,
|
|
196
|
+
): Promise<T> {
|
|
197
|
+
if (register === undefined) return start(undefined);
|
|
198
|
+
return startProviderPluginCleanupTrackedOperation(
|
|
199
|
+
register,
|
|
200
|
+
async (publishCleanupResource, cleanup) => {
|
|
201
|
+
const operation = start(publishCleanupResource);
|
|
202
|
+
try {
|
|
203
|
+
await cleanupBoundary(operation);
|
|
204
|
+
cleanup.verified();
|
|
205
|
+
} catch (error) {
|
|
206
|
+
cleanup.unsafe(error);
|
|
207
|
+
}
|
|
208
|
+
// Preserve the provider result only after cleanup proof has settled. This
|
|
209
|
+
// ordering prevents the generic controller's rejection fallback from
|
|
210
|
+
// racing an ordinary provider failure ahead of its verified cleanup.
|
|
211
|
+
return await operation;
|
|
212
|
+
},
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
export type WebSessionExecutionOptions = {
|
|
217
|
+
readonly fileResolver?: BrowserFileResolver;
|
|
218
|
+
readonly environment?: Readonly<Record<string, string | undefined>>;
|
|
219
|
+
readonly signal?: AbortSignal;
|
|
220
|
+
/** Kernel-owned total budget shared by runtime loading and every provider step. */
|
|
221
|
+
readonly operationDeadline?: WebSessionOperationDeadline;
|
|
222
|
+
/** Internal deterministic-clock seam for an operation that owns its deadline. */
|
|
223
|
+
readonly deadlineClock?: OperationDeadlineClock;
|
|
224
|
+
/**
|
|
225
|
+
* Kernel-owned post-abort join. Browser-backed runtimes register only their
|
|
226
|
+
* bounded teardown proof, never arbitrary provider work.
|
|
227
|
+
*/
|
|
228
|
+
readonly registerCleanupBarrier?: WebSessionCleanupBarrierRegistrar;
|
|
229
|
+
readonly beforeDispatch?: (event: WebSessionDispatchEvent) => Promise<void>;
|
|
230
|
+
/**
|
|
231
|
+
* Persist the exact provider-owned target immediately after a strict
|
|
232
|
+
* mutation response accepts the dispatch and before independent readback.
|
|
233
|
+
* Implementations must never call this for an inferred or scraped target.
|
|
234
|
+
*/
|
|
235
|
+
readonly afterProviderAcceptedMutationTarget?: (
|
|
236
|
+
event: WebSessionProviderAcceptedMutationTargetEvent,
|
|
237
|
+
) => Promise<void>;
|
|
238
|
+
/**
|
|
239
|
+
* Persist one exact provider-owned target after a strict pre-dispatch read.
|
|
240
|
+
* The runtime must call `beforeDispatch` first so dispatch start is durable,
|
|
241
|
+
* then await this callback before sending the mutation request. It must never
|
|
242
|
+
* retain a caller-inferred, scraped, or otherwise ambiguous target.
|
|
243
|
+
*/
|
|
244
|
+
readonly afterProviderBoundMutationTarget?: (
|
|
245
|
+
event: WebSessionProviderBoundMutationTargetEvent,
|
|
246
|
+
) => Promise<void>;
|
|
247
|
+
readonly afterDispatchVerified?: (event: WebSessionDispatchEvent) => Promise<void>;
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
export type WebSessionOperationExecutor = (
|
|
251
|
+
manifest: GhostgetManifest,
|
|
252
|
+
recipe: WebSessionRecipe,
|
|
253
|
+
input: OperationInput,
|
|
254
|
+
auth: GhostgetAuth,
|
|
255
|
+
options: WebSessionExecutionOptions,
|
|
256
|
+
) => Promise<WebSessionExecution>;
|
|
257
|
+
|
|
258
|
+
export type PublicWebSessionOperationExecutor = (
|
|
259
|
+
manifest: GhostgetManifest,
|
|
260
|
+
recipe: WebSessionRecipe,
|
|
261
|
+
input: OperationInput,
|
|
262
|
+
options: WebSessionExecutionOptions,
|
|
263
|
+
) => Promise<WebSessionExecution>;
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Bound the complete lazy web runtime hook, including module loading and any
|
|
267
|
+
* work that does not cooperate with cancellation.
|
|
268
|
+
*/
|
|
269
|
+
export async function runWebSessionOperationWithDeadline<T>(
|
|
270
|
+
recipe: Pick<WebSessionRecipe, "timeoutMs">,
|
|
271
|
+
options: WebSessionExecutionOptions,
|
|
272
|
+
execute: (boundedOptions: WebSessionExecutionOptions) => Promise<T>,
|
|
273
|
+
): Promise<T> {
|
|
274
|
+
const ownedDeadline = options.operationDeadline === undefined
|
|
275
|
+
? new OperationDeadline(recipe.timeoutMs, {
|
|
276
|
+
...(options.signal === undefined ? {} : { signal: options.signal }),
|
|
277
|
+
...(options.deadlineClock === undefined
|
|
278
|
+
? {}
|
|
279
|
+
: { clock: options.deadlineClock }),
|
|
280
|
+
})
|
|
281
|
+
: null;
|
|
282
|
+
const deadline = options.operationDeadline ?? ownedDeadline;
|
|
283
|
+
if (deadline === null) {
|
|
284
|
+
throw new Error("authenticated web operation deadline is unavailable");
|
|
285
|
+
}
|
|
286
|
+
const guardDispatch = (
|
|
287
|
+
callback: ((event: WebSessionDispatchEvent) => Promise<void>) | undefined,
|
|
288
|
+
): ((event: WebSessionDispatchEvent) => Promise<void>) | undefined =>
|
|
289
|
+
callback === undefined
|
|
290
|
+
? undefined
|
|
291
|
+
: (event) => deadline.run(
|
|
292
|
+
() => callback(event),
|
|
293
|
+
WEB_SESSION_OPERATION_LABEL,
|
|
294
|
+
);
|
|
295
|
+
const beforeDispatch = guardDispatch(options.beforeDispatch);
|
|
296
|
+
const afterProviderAcceptedMutationTarget =
|
|
297
|
+
options.afterProviderAcceptedMutationTarget === undefined
|
|
298
|
+
? undefined
|
|
299
|
+
: (event: WebSessionProviderAcceptedMutationTargetEvent) => deadline.run(
|
|
300
|
+
() => options.afterProviderAcceptedMutationTarget!(event),
|
|
301
|
+
WEB_SESSION_OPERATION_LABEL,
|
|
302
|
+
);
|
|
303
|
+
const afterProviderBoundMutationTarget =
|
|
304
|
+
options.afterProviderBoundMutationTarget === undefined
|
|
305
|
+
? undefined
|
|
306
|
+
: (event: WebSessionProviderBoundMutationTargetEvent) => deadline.run(
|
|
307
|
+
() => options.afterProviderBoundMutationTarget!(event),
|
|
308
|
+
WEB_SESSION_OPERATION_LABEL,
|
|
309
|
+
);
|
|
310
|
+
const afterDispatchVerified = guardDispatch(options.afterDispatchVerified);
|
|
311
|
+
const cleanupBarriers: TrackedWebSessionCleanupBarrier[] = [];
|
|
312
|
+
let acceptingCleanupBarriers = true;
|
|
313
|
+
const registerCleanupBarrier: WebSessionCleanupBarrierRegistrar = (barrier) => {
|
|
314
|
+
if (!acceptingCleanupBarriers) {
|
|
315
|
+
throw new Error("authenticated web cleanup registration is already closed");
|
|
316
|
+
}
|
|
317
|
+
const tracked = trackWebSessionCleanupBarrier(barrier);
|
|
318
|
+
try {
|
|
319
|
+
const registered =
|
|
320
|
+
options.registerCleanupBarrier?.(tracked.promise);
|
|
321
|
+
cleanupBarriers.push(tracked);
|
|
322
|
+
return typeof registered === "function" ? registered : undefined;
|
|
323
|
+
} catch (error) {
|
|
324
|
+
// Registration happens before its resource starts. If an outer registrar
|
|
325
|
+
// retained the promise before throwing, settle it safely so that scope
|
|
326
|
+
// does not wait forever for an operation that was never begun.
|
|
327
|
+
tracked.verified();
|
|
328
|
+
throw error;
|
|
329
|
+
}
|
|
330
|
+
};
|
|
331
|
+
const fileResolver = options.fileResolver === undefined
|
|
332
|
+
? undefined
|
|
333
|
+
: (files: Parameters<BrowserFileResolver>[0]) => deadline.run(
|
|
334
|
+
() => options.fileResolver!(files),
|
|
335
|
+
WEB_SESSION_OPERATION_LABEL,
|
|
336
|
+
);
|
|
337
|
+
const boundedOptions: WebSessionExecutionOptions = {
|
|
338
|
+
...(fileResolver === undefined ? {} : { fileResolver }),
|
|
339
|
+
...(options.environment === undefined ? {} : { environment: options.environment }),
|
|
340
|
+
signal: deadline.signal,
|
|
341
|
+
operationDeadline: deadline,
|
|
342
|
+
registerCleanupBarrier,
|
|
343
|
+
...(beforeDispatch === undefined ? {} : { beforeDispatch }),
|
|
344
|
+
...(afterProviderAcceptedMutationTarget === undefined
|
|
345
|
+
? {}
|
|
346
|
+
: { afterProviderAcceptedMutationTarget }),
|
|
347
|
+
...(afterProviderBoundMutationTarget === undefined
|
|
348
|
+
? {}
|
|
349
|
+
: { afterProviderBoundMutationTarget }),
|
|
350
|
+
...(afterDispatchVerified === undefined ? {} : { afterDispatchVerified }),
|
|
351
|
+
};
|
|
352
|
+
let outcome:
|
|
353
|
+
| { readonly status: "fulfilled"; readonly value: T }
|
|
354
|
+
| { readonly status: "rejected"; readonly reason: unknown };
|
|
355
|
+
try {
|
|
356
|
+
try {
|
|
357
|
+
outcome = {
|
|
358
|
+
status: "fulfilled",
|
|
359
|
+
value: await deadline.run(
|
|
360
|
+
() => execute(boundedOptions),
|
|
361
|
+
WEB_SESSION_OPERATION_LABEL,
|
|
362
|
+
),
|
|
363
|
+
};
|
|
364
|
+
} catch (reason) {
|
|
365
|
+
outcome = { status: "rejected", reason };
|
|
366
|
+
}
|
|
367
|
+
acceptingCleanupBarriers = false;
|
|
368
|
+
await awaitWebSessionCleanupBarriers(
|
|
369
|
+
cleanupBarriers,
|
|
370
|
+
options.deadlineClock,
|
|
371
|
+
);
|
|
372
|
+
if (outcome.status === "rejected") throw outcome.reason;
|
|
373
|
+
return outcome.value;
|
|
374
|
+
} finally {
|
|
375
|
+
ownedDeadline?.dispose();
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
export function requireValidWebSessionOperationInput(
|
|
380
|
+
operation: Pick<WebSessionPluginOperationV1, "validateInput">,
|
|
381
|
+
input: OperationInput,
|
|
382
|
+
): void {
|
|
383
|
+
const inputIssues = operation.validateInput(input);
|
|
384
|
+
if (inputIssues.length > 0) throw new Error(inputIssues.join("; "));
|
|
385
|
+
}
|