@oomol-lab/open-connector 1.9.2 → 1.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -2
- package/assets/open-connector/catalog/apps/allratestoday.json +174 -0
- package/assets/open-connector/catalog/apps/slackbot.json +20 -1
- package/assets/open-connector/catalog/apps-index.json +1 -1
- package/package.json +1 -1
- package/src/connection-error.d.ts +7 -0
- package/src/connection-error.js +10 -0
- package/src/connection-service.d.ts +2 -50
- package/src/connection-service.js +6 -130
- package/src/connection-store.d.ts +41 -0
- package/src/connection-store.js +1 -0
- package/src/core/guarded-fetch.d.ts +3 -0
- package/src/core/guarded-fetch.js +8 -1
- package/src/core/provider-network-policy.d.ts +15 -0
- package/src/core/provider-network-policy.js +11 -0
- package/src/core/request.d.ts +18 -14
- package/src/core/request.js +11 -35
- package/src/credential-resolver.d.ts +24 -0
- package/src/credential-resolver.js +131 -0
- package/src/mcp.js +1 -1
- package/src/oauth/oauth-client-config-service.d.ts +1 -1
- package/src/oauth/oauth-client-config-service.js +14 -2
- package/src/oauth/oauth-credential-refresh-service.js +1 -1
- package/src/oauth/oauth-flow-service.d.ts +9 -1
- package/src/oauth/oauth-flow-service.js +11 -1
- package/src/providers/abuseipdb/executors.js +3 -4
- package/src/providers/action-contracts.generated.d.ts +1 -0
- package/src/providers/addressfinder/executors.js +2 -3
- package/src/providers/aeroleads/executors.js +3 -3
- package/src/providers/affinity/runtime.js +6 -7
- package/src/providers/aftership/executors.js +2 -2
- package/src/providers/agent_mail/runtime.js +2 -2
- package/src/providers/agentql/runtime.js +2 -2
- package/src/providers/agenty/runtime.js +5 -6
- package/src/providers/agiled/runtime.d.ts +0 -1
- package/src/providers/agiled/runtime.js +2 -3
- package/src/providers/agility/runtime.js +2 -3
- package/src/providers/ahrefs/runtime.js +3 -3
- package/src/providers/aifinmarket/runtime.js +6 -7
- package/src/providers/airtable/executors.js +3 -3
- package/src/providers/alchemy/runtime.js +2 -2
- package/src/providers/algolia/runtime.js +3 -3
- package/src/providers/aliyun_oss/executors.js +7 -7
- package/src/providers/allratestoday/executors.d.ts +3 -0
- package/src/providers/allratestoday/executors.js +18 -0
- package/src/providers/allratestoday/runtime.d.ts +17 -0
- package/src/providers/allratestoday/runtime.js +104 -0
- package/src/providers/alpaca/runtime.js +2 -3
- package/src/providers/alpha_vantage/runtime.js +2 -2
- package/src/providers/alt_text_ai/runtime.js +2 -2
- package/src/providers/altiria/executors.js +3 -3
- package/src/providers/amap/runtime.js +3 -3
- package/src/providers/ambee/runtime.js +2 -2
- package/src/providers/ambivo/executors.js +3 -3
- package/src/providers/amilia/runtime.js +1 -1
- package/src/providers/amplemarket/runtime.js +2 -2
- package/src/providers/amplitude/runtime.js +3 -3
- package/src/providers/anysearch/runtime.js +4 -4
- package/src/providers/apaleo/runtime.js +2 -2
- package/src/providers/api_sports/executors.js +3 -4
- package/src/providers/apiverve/executors.js +2 -3
- package/src/providers/apollo/executors.js +2 -3
- package/src/providers/appcircle/runtime.js +5 -5
- package/src/providers/appdrag/executors.js +2 -3
- package/src/providers/arcgis_online/executors.js +2 -2
- package/src/providers/auth0_management/runtime.js +2 -3
- package/src/providers/autoblogger/executors.js +3 -3
- package/src/providers/baidu_maps/runtime.js +3 -3
- package/src/providers/baidu_netdisk/runtime-mcp.js +3 -4
- package/src/providers/bark/executors.js +5 -5
- package/src/providers/bitrise/runtime.js +3 -3
- package/src/providers/bouncer/executors.js +3 -4
- package/src/providers/browse_ai/runtime.js +3 -4
- package/src/providers/browserstack/executors.js +6 -7
- package/src/providers/buildkite/runtime.js +3 -3
- package/src/providers/bunnycdn/runtime.js +3 -3
- package/src/providers/businessmap/runtime.js +6 -7
- package/src/providers/buttondown/runtime.js +2 -2
- package/src/providers/byteforms/runtime.js +2 -2
- package/src/providers/calendly/runtime.js +2 -2
- package/src/providers/captainbi/runtime.js +6 -6
- package/src/providers/castingwords/runtime.js +1 -1
- package/src/providers/chatpdf/runtime.js +4 -4
- package/src/providers/check/executors.js +3 -4
- package/src/providers/checkly/executors.js +3 -4
- package/src/providers/chengxin/runtime.js +3 -3
- package/src/providers/cincopa/executors.js +3 -4
- package/src/providers/circle/executors.js +3 -4
- package/src/providers/clearout/executors.js +1 -2
- package/src/providers/clickhelp/runtime.js +5 -5
- package/src/providers/clickhouse/runtime.js +4 -4
- package/src/providers/clinicalkey/runtime.js +3 -3
- package/src/providers/clinicaltrials_gov/runtime.js +4 -5
- package/src/providers/clockify/runtime.js +4 -4
- package/src/providers/close/runtime.js +3 -3
- package/src/providers/cloudconvert/runtime.js +8 -9
- package/src/providers/cloudflare_dns/runtime.js +2 -2
- package/src/providers/cloudflare_email_routing/runtime.js +2 -2
- package/src/providers/cloudflare_r2/runtime.js +5 -5
- package/src/providers/cloudflare_worker/runtime.js +10 -10
- package/src/providers/cloudinary/runtime.js +4 -4
- package/src/providers/cloudlayer/runtime.js +5 -5
- package/src/providers/codacy/runtime.js +2 -2
- package/src/providers/codemagic/runtime.js +2 -2
- package/src/providers/confluence/executors.js +4 -4
- package/src/providers/confluence/runtime.d.ts +0 -1
- package/src/providers/confluence/runtime.js +6 -7
- package/src/providers/contactout/runtime.js +5 -5
- package/src/providers/contentful/runtime.js +2 -2
- package/src/providers/contentstack_content_delivery/runtime.js +1 -1
- package/src/providers/cronly/runtime.js +2 -2
- package/src/providers/crossref/runtime.js +3 -3
- package/src/providers/cutt_ly/runtime.js +3 -3
- package/src/providers/cyberimpact/runtime.js +3 -3
- package/src/providers/dachser/executors.js +2 -2
- package/src/providers/dailybot/runtime.js +1 -1
- package/src/providers/databox/runtime.js +2 -2
- package/src/providers/databricks/runtime.js +2 -2
- package/src/providers/datacite/runtime.js +1 -1
- package/src/providers/datadog/executors.js +3 -4
- package/src/providers/datascope/runtime.js +2 -2
- package/src/providers/daytona/executors.js +3 -3
- package/src/providers/deepgram/runtime.js +2 -2
- package/src/providers/deepl/runtime.js +4 -4
- package/src/providers/detrack/executors.js +5 -5
- package/src/providers/deutschlandgpt/runtime.js +2 -2
- package/src/providers/dialmycalls/runtime.js +4 -4
- package/src/providers/diffbot/executors.js +4 -4
- package/src/providers/digistore24/executors.js +3 -3
- package/src/providers/dingtalk_bot/executors.js +1 -1
- package/src/providers/discourse/executors.d.ts +0 -1
- package/src/providers/discourse/executors.js +6 -7
- package/src/providers/docugenerate/runtime.js +3 -3
- package/src/providers/doppler/runtime.shared.js +3 -3
- package/src/providers/doppler_marketing_automation/runtime.js +4 -4
- package/src/providers/dovetail/runtime.js +2 -2
- package/src/providers/dropcontact/runtime.js +3 -3
- package/src/providers/dub/executors.js +6 -6
- package/src/providers/dumplingai/runtime.js +2 -2
- package/src/providers/elevenlabs/executors.js +4 -4
- package/src/providers/elevenreader/runtime.js +1 -1
- package/src/providers/emailoctopus/runtime.js +4 -4
- package/src/providers/embase/runtime.js +3 -3
- package/src/providers/emelia/executors.js +2 -2
- package/src/providers/enigma/executors.js +3 -3
- package/src/providers/eodhd_apis/executors.js +2 -2
- package/src/providers/eventzilla/runtime.js +3 -4
- package/src/providers/evervault/runtime.js +1 -1
- package/src/providers/excalidraw_mcp/runtime.js +3 -4
- package/src/providers/excel/runtime.js +6 -6
- package/src/providers/expofp/runtime.js +2 -2
- package/src/providers/faktoora/runtime.js +5 -5
- package/src/providers/fast_note_sync/runtime.js +2 -2
- package/src/providers/feathery/executors.js +2 -3
- package/src/providers/feishu_app_bot/executors.js +2 -3
- package/src/providers/feishu_custom_bot/executors.js +2 -3
- package/src/providers/ffhub/executors.js +2 -3
- package/src/providers/fidel_api/executors.js +2 -3
- package/src/providers/files_com/executors.js +2 -3
- package/src/providers/fireberry/runtime.d.ts +0 -1
- package/src/providers/fireberry/runtime.js +3 -4
- package/src/providers/firehydrant/executors.js +2 -3
- package/src/providers/float/executors.js +2 -3
- package/src/providers/flomo/executors.js +5 -6
- package/src/providers/flowiseai/executors.js +2 -3
- package/src/providers/fluxguard/executors.js +2 -3
- package/src/providers/folk/executors.js +2 -3
- package/src/providers/football_data/executors.js +2 -3
- package/src/providers/forem/executors.js +2 -3
- package/src/providers/formbricks/executors.js +2 -3
- package/src/providers/formsite/executors.js +3 -4
- package/src/providers/formspree/executors.js +2 -2
- package/src/providers/freshdesk/executors.js +3 -4
- package/src/providers/freshservice/executors.js +3 -4
- package/src/providers/freshteam/runtime.js +3 -4
- package/src/providers/full_contact/executors.js +3 -3
- package/src/providers/fusion-api/runtime.js +2 -3
- package/src/providers/gagelist/executors.js +3 -3
- package/src/providers/gainsight_nxt/executors.js +2 -2
- package/src/providers/gamma/executors.js +4 -3
- package/src/providers/gangtise/runtime.js +3 -4
- package/src/providers/gatherup/runtime.js +1 -1
- package/src/providers/geckoboard/executors.js +2 -3
- package/src/providers/gemini/runtime.d.ts +0 -1
- package/src/providers/gemini/runtime.js +5 -6
- package/src/providers/genpage/runtime.js +2 -2
- package/src/providers/geokeo/executors.js +4 -4
- package/src/providers/getnote/runtime.js +2 -3
- package/src/providers/github/runtime-shared.js +2 -2
- package/src/providers/glyphic/runtime.js +3 -4
- package/src/providers/gmail/executors.js +125 -27
- package/src/providers/gong/runtime.js +6 -7
- package/src/providers/googlecalendar/runtime-shared.js +3 -4
- package/src/providers/googledrive/runtime-request.js +2 -3
- package/src/providers/googlesheets/runtime-shared.js +3 -4
- package/src/providers/gorgias/runtime.js +4 -4
- package/src/providers/gotify/executors.js +7 -8
- package/src/providers/greenhouse/executors.js +3 -3
- package/src/providers/gumloop/executors.js +2 -3
- package/src/providers/gumroad/executors.js +2 -3
- package/src/providers/habitica/executors.js +2 -3
- package/src/providers/hackerrank_work/executors.js +2 -3
- package/src/providers/harvest/executors.js +3 -4
- package/src/providers/haveibeenpwned/executors.js +2 -3
- package/src/providers/headout/executors.js +3 -4
- package/src/providers/healthchecks_io/executors.js +2 -3
- package/src/providers/helium10/runtime.js +4 -5
- package/src/providers/helpdesk/runtime.js +4 -4
- package/src/providers/home_assistant/runtime-ws.js +9 -10
- package/src/providers/hotjar/executors.js +4 -4
- package/src/providers/httpsms/runtime.js +3 -4
- package/src/providers/hub_planner/executors.js +3 -3
- package/src/providers/hubspot/runtime.js +3 -4
- package/src/providers/humaans/runtime.js +3 -3
- package/src/providers/hunter/runtime.js +3 -3
- package/src/providers/icypeas/executors.js +3 -4
- package/src/providers/ima/runtime.js +7 -7
- package/src/providers/infolobby/runtime.js +6 -6
- package/src/providers/instabot/runtime.js +6 -6
- package/src/providers/instatus/runtime.js +4 -4
- package/src/providers/intuiface/executors.js +3 -3
- package/src/providers/iplocate/runtime.js +4 -5
- package/src/providers/ipregistry/executors.js +2 -2
- package/src/providers/jiminny/runtime.js +4 -4
- package/src/providers/jin10/executors.js +4 -5
- package/src/providers/jira/executors.js +4 -4
- package/src/providers/kaleido/runtime.js +2 -2
- package/src/providers/kandji/runtime.js +2 -2
- package/src/providers/keygen/executors.js +4 -4
- package/src/providers/keyword/runtime.js +2 -2
- package/src/providers/kie_ai/executors.js +1 -1
- package/src/providers/kintone/runtime.js +1 -1
- package/src/providers/kit/runtime.js +2 -2
- package/src/providers/klangio/runtime.js +4 -4
- package/src/providers/klaviyo/executors.js +1 -1
- package/src/providers/klazify/executors.js +3 -3
- package/src/providers/klipfolio/runtime.js +3 -3
- package/src/providers/knack/executors.js +1 -1
- package/src/providers/kommo/runtime.js +2 -2
- package/src/providers/kontent_ai/executors.js +3 -4
- package/src/providers/l2s/executors.js +3 -4
- package/src/providers/latchshot/executors.js +2 -2
- package/src/providers/leadboxer/runtime.js +4 -4
- package/src/providers/leadiq/runtime.js +4 -4
- package/src/providers/linguapop/runtime.js +1 -1
- package/src/providers/lingvanex_translation_api/runtime.js +5 -6
- package/src/providers/lingxing_mcp/runtime.js +3 -4
- package/src/providers/linkup/runtime.js +5 -6
- package/src/providers/liveagent/executors.js +6 -6
- package/src/providers/loops/executors.js +2 -2
- package/src/providers/loyjoy/runtime.js +2 -2
- package/src/providers/loyverse/executors.js +4 -4
- package/src/providers/lusha/runtime.js +3 -3
- package/src/providers/mailbluster/runtime.js +3 -4
- package/src/providers/mailcoach/runtime.js +4 -4
- package/src/providers/mailgenius/executors.js +3 -4
- package/src/providers/mailjet/runtime.js +3 -3
- package/src/providers/mails_so/runtime.js +1 -1
- package/src/providers/mailsoftly/runtime.js +5 -5
- package/src/providers/mailtrap/runtime.js +4 -5
- package/src/providers/manus/runtime.js +3 -3
- package/src/providers/mautic/runtime.js +3 -3
- package/src/providers/megaventory/runtime.js +3 -3
- package/src/providers/memberstack/runtime.js +2 -2
- package/src/providers/mendeley/executors.js +2 -3
- package/src/providers/mindbody/runtime.js +3 -3
- package/src/providers/minerstat/executors.js +3 -3
- package/src/providers/mintlify/runtime.js +3 -3
- package/src/providers/missive/executors.js +3 -5
- package/src/providers/mixpanel/executors.js +3 -3
- package/src/providers/mobile_text_alerts/runtime.js +3 -3
- package/src/providers/mocean/executors.js +3 -3
- package/src/providers/moco/executors.js +5 -5
- package/src/providers/moesif/runtime.js +4 -4
- package/src/providers/monday/runtime-common.js +3 -3
- package/src/providers/monica_crm/runtime.js +4 -4
- package/src/providers/moorcheh/runtime.js +3 -3
- package/src/providers/more_trees/runtime.d.ts +0 -1
- package/src/providers/more_trees/runtime.js +7 -8
- package/src/providers/moxie/runtime.js +2 -2
- package/src/providers/msg91/runtime.js +4 -4
- package/src/providers/mx/runtime.js +1 -1
- package/src/providers/needle/runtime.js +3 -4
- package/src/providers/netlify/runtime.js +2 -3
- package/src/providers/niftyimages/executors.js +2 -2
- package/src/providers/northbeam/runtime.js +1 -1
- package/src/providers/nozbe_teams/executors.js +4 -4
- package/src/providers/npm/runtime.js +4 -4
- package/src/providers/nusii_proposals/runtime.js +2 -2
- package/src/providers/ocr_web_service/executors.js +4 -4
- package/src/providers/octopus_deploy/executors.js +3 -3
- package/src/providers/oksign/runtime.js +3 -4
- package/src/providers/one_drive/executors.js +6 -6
- package/src/providers/one_password_events/runtime.js +1 -1
- package/src/providers/onfleet/runtime.js +3 -3
- package/src/providers/onlyoffice_docspace/runtime.js +4 -4
- package/src/providers/oomnitza/runtime.js +3 -4
- package/src/providers/otter_ai/executors.js +2 -2
- package/src/providers/oura/runtime.js +1 -1
- package/src/providers/paddle/executors.js +3 -3
- package/src/providers/pagerduty/runtime.js +2 -2
- package/src/providers/paradym/runtime.js +4 -4
- package/src/providers/parallel/runtime.js +3 -3
- package/src/providers/partner_stack_partner/runtime.js +1 -1
- package/src/providers/payrexx/runtime.js +5 -6
- package/src/providers/permit_io/runtime.js +2 -2
- package/src/providers/pinboard/executors.js +5 -6
- package/src/providers/pinpoint/runtime.js +2 -2
- package/src/providers/placid/runtime.js +3 -3
- package/src/providers/plain/runtime.js +5 -5
- package/src/providers/planetscale/runtime.js +2 -2
- package/src/providers/planhat/executors.js +6 -6
- package/src/providers/plausible_analytics/runtime.js +3 -3
- package/src/providers/posthog/runtime.js +3 -3
- package/src/providers/predis_ai/executors.js +3 -3
- package/src/providers/printavo/runtime.js +2 -2
- package/src/providers/prospeo/runtime.js +2 -3
- package/src/providers/provider-runtime.d.ts +13 -1
- package/src/providers/provider-runtime.js +25 -10
- package/src/providers/push_by_techulus/executors.js +3 -4
- package/src/providers/pushover/runtime.js +4 -5
- package/src/providers/pushsafer/runtime.js +4 -5
- package/src/providers/pylon/runtime.js +2 -2
- package/src/providers/qase/runtime.js +3 -3
- package/src/providers/qdrant/runtime.js +1 -1
- package/src/providers/qichacha/runtime.js +2 -2
- package/src/providers/qingflow/runtime.js +2 -2
- package/src/providers/quickchart/runtime.js +2 -2
- package/src/providers/quintadb/runtime.js +2 -2
- package/src/providers/quo/runtime.js +2 -2
- package/src/providers/rawg/runtime.js +4 -4
- package/src/providers/razorpay/runtime.js +4 -5
- package/src/providers/readme/runtime.js +6 -6
- package/src/providers/referralhero/runtime.js +3 -3
- package/src/providers/registry.generated.js +1 -0
- package/src/providers/render/executors.js +3 -3
- package/src/providers/respond_io/executors.js +3 -3
- package/src/providers/reversecontact/runtime.js +3 -3
- package/src/providers/ritekit/executors.js +2 -2
- package/src/providers/riveter/executors.js +2 -3
- package/src/providers/rocket_chat/executors.js +3 -4
- package/src/providers/rocket_reach/executors.js +3 -4
- package/src/providers/saucelabs/runtime.js +4 -4
- package/src/providers/scopus/runtime.js +3 -3
- package/src/providers/scrape_do/executors.js +2 -2
- package/src/providers/scraperapi/runtime.js +4 -4
- package/src/providers/scrapfly/executors.js +2 -2
- package/src/providers/scrapingant/executors.js +6 -7
- package/src/providers/scrapingbee/executors.js +3 -3
- package/src/providers/scrapingdog/executors.js +1 -1
- package/src/providers/screenshot_fyi/executors.js +3 -4
- package/src/providers/screenshotbase/runtime.js +3 -3
- package/src/providers/search_api/runtime.js +2 -2
- package/src/providers/securitytrails/executors.js +2 -2
- package/src/providers/semantic_scholar/executors.js +2 -2
- package/src/providers/sendbird/executors.js +2 -2
- package/src/providers/sendfox/executors.js +3 -3
- package/src/providers/sendgrid/executors.js +5 -5
- package/src/providers/sendmator/runtime.js +3 -4
- package/src/providers/seqera/runtime.js +3 -4
- package/src/providers/serveravatar/executors.js +3 -3
- package/src/providers/sheetdb/runtime.js +2 -2
- package/src/providers/short_menu/runtime.js +3 -3
- package/src/providers/shortcut/runtime.js +3 -3
- package/src/providers/shortpixel/runtime.js +2 -2
- package/src/providers/shotstack/runtime.js +4 -4
- package/src/providers/signpath/runtime.js +2 -2
- package/src/providers/signwell/runtime.js +5 -6
- package/src/providers/similarweb_digitalrank_api/runtime.js +3 -3
- package/src/providers/simla/runtime.js +5 -5
- package/src/providers/simplybook_me/executors.js +6 -6
- package/src/providers/sitespeakai/runtime.js +3 -3
- package/src/providers/slickdeals/runtime.js +2 -3
- package/src/providers/smartsuite/runtime.js +3 -3
- package/src/providers/sonarcloud/runtime.js +5 -5
- package/src/providers/sorftime/runtime.js +8 -8
- package/src/providers/spider/runtime.js +2 -2
- package/src/providers/splunk_http_event_collector/runtime.js +7 -8
- package/src/providers/sportsdata/runtime.js +4 -4
- package/src/providers/spyfu/runtime.js +4 -5
- package/src/providers/square/runtime.js +4 -4
- package/src/providers/stannp/runtime.js +2 -2
- package/src/providers/stripe/executors.js +2 -2
- package/src/providers/supermemory/runtime.js +3 -3
- package/src/providers/survey_monkey/runtime.js +3 -3
- package/src/providers/taiga/runtime.js +4 -4
- package/src/providers/talenox/executors.js +4 -4
- package/src/providers/tally/runtime.js +3 -3
- package/src/providers/tavily/runtime.js +3 -4
- package/src/providers/teamcamp/executors.js +2 -2
- package/src/providers/teamtailor/executors.js +2 -2
- package/src/providers/telegram/executors.js +6 -7
- package/src/providers/teltel/executors.js +2 -2
- package/src/providers/templated/executors.js +3 -3
- package/src/providers/tencent_docs/runtime.js +4 -4
- package/src/providers/tencent_maps/runtime.js +3 -3
- package/src/providers/textcortex/runtime.js +3 -3
- package/src/providers/the_cat_api/runtime.js +3 -3
- package/src/providers/the_colony/runtime.js +3 -3
- package/src/providers/the_odds_api/runtime.js +3 -4
- package/src/providers/the_official_board/runtime.js +4 -4
- package/src/providers/thehive/runtime.js +1 -1
- package/src/providers/tikhub/endpoint-catalog.js +2 -3
- package/src/providers/tiktok_business/runtime.js +2 -2
- package/src/providers/timecamp/runtime.js +2 -2
- package/src/providers/timelink/runtime.js +2 -2
- package/src/providers/totp/runtime.js +4 -5
- package/src/providers/trawlingweb/runtime.js +2 -2
- package/src/providers/trilium/runtime.js +2 -2
- package/src/providers/triple_whale/runtime.js +3 -3
- package/src/providers/truvera/runtime.js +2 -2
- package/src/providers/tuskr/runtime.js +2 -2
- package/src/providers/typebot/runtime.js +2 -2
- package/src/providers/typeform/runtime.js +2 -2
- package/src/providers/uptimerobot/executors.js +3 -4
- package/src/providers/v2ex/runtime.js +8 -9
- package/src/providers/valyu/runtime.js +3 -3
- package/src/providers/vapi/runtime.js +4 -4
- package/src/providers/vectorshift/runtime.js +3 -3
- package/src/providers/venafitlsprotectcloud/runtime.js +2 -3
- package/src/providers/venafitlsprotectdatacenter/runtime.js +2 -3
- package/src/providers/vida/runtime.js +4 -4
- package/src/providers/vonage/runtime.js +3 -3
- package/src/providers/walmart_marketplace/runtime.js +5 -5
- package/src/providers/weatherapi/executors.js +3 -4
- package/src/providers/web_of_science/runtime.js +4 -4
- package/src/providers/web_of_science_expanded/runtime.js +9 -9
- package/src/providers/webex/runtime.js +3 -3
- package/src/providers/webinarjam/runtime.js +4 -4
- package/src/providers/webscraping_ai/runtime.js +3 -3
- package/src/providers/webvizio/runtime.js +3 -4
- package/src/providers/wecom_bot/smart-runtime.js +4 -5
- package/src/providers/wecom_mcp/runtime.js +3 -4
- package/src/providers/wejam_ai/runtime.js +3 -3
- package/src/providers/wolfram_alpha_api/runtime.js +3 -3
- package/src/providers/woocommerce/runtime.js +1 -1
- package/src/providers/woodpecker_co/executors.js +3 -4
- package/src/providers/woot/runtime.js +6 -6
- package/src/providers/workable/runtime.js +3 -3
- package/src/providers/workday/runtime.js +4 -4
- package/src/providers/workiom/runtime.js +2 -2
- package/src/providers/workiz/runtime.js +2 -2
- package/src/providers/workpath/executors.js +3 -4
- package/src/providers/worksnaps/executors.js +2 -2
- package/src/providers/y_gy/runtime.js +2 -2
- package/src/providers/zenscrape/runtime.js +3 -3
- package/src/providers/zep/runtime.js +4 -4
- package/src/providers/zeplin/runtime.js +2 -2
- package/src/providers/zhihu/executors.js +6 -6
- package/src/providers/zylvie/runtime.js +4 -4
- package/src/saas/saas-cleanup-service.d.ts +2 -0
- package/src/saas/saas-cleanup-service.js +2 -1
- package/src/saas/saas-execution-service.d.ts +1 -1
- package/src/server/actions/action-runner.js +1 -1
- package/src/server/api/auth.js +3 -0
- package/src/server/api/connection-routes.js +1 -1
- package/src/server/api/console-catalog-routes.js +1 -1
- package/src/server/api/console-oauth-routes.d.ts +3 -1
- package/src/server/api/console-oauth-routes.js +22 -9
- package/src/server/api/oauth-completion-page.d.ts +57 -0
- package/src/server/api/oauth-completion-page.js +135 -10
- package/src/server/api/openapi.d.ts +5 -0
- package/src/server/api/openapi.js +62 -2
- package/src/server/api/runtime-api.d.ts +2 -1
- package/src/server/api/runtime-app-routes.js +1 -1
- package/src/server/api/runtime-execution-routes.js +2 -1
- package/src/server/connect-app.d.ts +4 -0
- package/src/server/connect-app.js +14 -1
- package/src/server/connect-server.d.ts +6 -0
- package/src/server/connect-server.js +114 -4
- package/src/server/connector-runtime.d.ts +6 -8
- package/src/server/connector-runtime.js +8 -28
- package/src/server/proxy/proxy-runner.js +1 -1
- package/src/server/slack-event-verification.d.ts +37 -0
- package/src/server/slack-event-verification.js +91 -0
- package/src/server/storage/connection-request-store.d.ts +1 -1
- package/src/server/storage/connection-store.d.ts +1 -1
- package/src/server/storage/postgres/runtime-store.d.ts +1 -1
- package/src/server/storage/runtime-database.d.ts +1 -1
- package/src/server/storage/saas-project-store.d.ts +1 -1
- package/src/triggers/maintenance.d.ts +2 -0
- package/src/triggers/maintenance.js +2 -1
- package/src/triggers/sources/slack-signature.d.ts +10 -0
- package/src/triggers/sources/slack-signature.js +13 -0
- package/src/triggers/sources/slack.js +9 -11
- package/src/triggers/trigger-runner.js +1 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ActionPolicyConfig } from "../core/action-policy.ts";
|
|
2
2
|
import type { ProviderHttpDispatchOptions } from "../core/provider-http-dispatch.ts";
|
|
3
|
+
import type { ProviderNetworkPolicy } from "../core/provider-network-policy.ts";
|
|
3
4
|
import type { RuntimeLogger } from "../core/types.ts";
|
|
4
5
|
import type { RuntimeJwtConfig } from "./api/runtime-jwt.ts";
|
|
5
6
|
import type { S3TransitClientOptions } from "./files/s3-transit-files.ts";
|
|
@@ -20,13 +21,6 @@ export interface ConnectorPostgresOptions {
|
|
|
20
21
|
/** Time allowed to establish one connection. */
|
|
21
22
|
connectionTimeoutMs?: number;
|
|
22
23
|
}
|
|
23
|
-
/** Provider egress policy. It is process-wide, which is why one runtime may be active per process. */
|
|
24
|
-
export interface ConnectorNetworkOptions {
|
|
25
|
-
/** Let self-hosted providers reach instance hosts on private networks; loopback, link-local and cloud metadata stay blocked. */
|
|
26
|
-
allowPrivateNetwork?: boolean;
|
|
27
|
-
/** Hosts exempt from resolved-address validation, for domains a corporate VPN resolves to placeholder addresses. */
|
|
28
|
-
trustedHosts?: readonly string[];
|
|
29
|
-
}
|
|
30
24
|
export interface ConnectorS3Options extends S3TransitClientOptions {
|
|
31
25
|
bucket: string;
|
|
32
26
|
}
|
|
@@ -53,10 +47,12 @@ export interface ConnectorRuntimeOptions {
|
|
|
53
47
|
adminToken?: string;
|
|
54
48
|
/** Static bearer token for the /v1 and /mcp execution API. JWT verification and console-issued tokens are the alternatives. */
|
|
55
49
|
runtimeToken?: string;
|
|
50
|
+
/** Dedicated bearer token for inbound provider event verification. Kept separate from the admin token. */
|
|
51
|
+
eventVerifyToken?: string;
|
|
56
52
|
/** Verify /v1 bearer tokens as JWTs against a JWKS endpoint. */
|
|
57
53
|
jwt?: RuntimeJwtConfig;
|
|
58
54
|
postgres?: ConnectorPostgresOptions;
|
|
59
|
-
network?:
|
|
55
|
+
network?: ProviderNetworkPolicy;
|
|
60
56
|
/** Opt-in admission and result feedback for every provider HTTP transport attempt. */
|
|
61
57
|
providerHttpDispatch?: ProviderHttpDispatchOptions;
|
|
62
58
|
/** Allow or block actions, proxies and Triggers by name. */
|
|
@@ -78,6 +74,8 @@ export interface ConnectorRuntimeOptions {
|
|
|
78
74
|
apiReference?: boolean;
|
|
79
75
|
/** Seconds the OAuth completion page waits before closing its window. Defaults to 5; `0` closes it as soon as it loads. */
|
|
80
76
|
oauthCloseDelaySeconds?: number;
|
|
77
|
+
/** Exact origins a provider-refusal callback page may post its result to. Never `*`. */
|
|
78
|
+
oauthResultOrigins?: string[];
|
|
81
79
|
}
|
|
82
80
|
/** Standard web requests are the host boundary; credentials, databases and framework objects stay private. */
|
|
83
81
|
export interface ConnectorRuntime {
|
|
@@ -2,10 +2,9 @@ import { mkdir } from "node:fs/promises";
|
|
|
2
2
|
import { join, resolve } from "node:path";
|
|
3
3
|
import { loadCatalog } from "../catalog-store.js";
|
|
4
4
|
import { ActionPolicyService } from "../core/action-policy.js";
|
|
5
|
-
import { setEgressTrustedHosts, setPrivateNetworkAccessAllowed } from "../core/request.js";
|
|
6
5
|
import { ProviderLoader } from "../providers/provider-loader.js";
|
|
7
6
|
import { executorModules } from "../providers/registry.generated.js";
|
|
8
|
-
import { DEFAULT_OAUTH_CLOSE_DELAY_SECONDS } from "./api/oauth-completion-page.js";
|
|
7
|
+
import { DEFAULT_OAUTH_CLOSE_DELAY_SECONDS, normalizeOAuthResultOrigins } from "./api/oauth-completion-page.js";
|
|
9
8
|
import { createRuntimeJwtVerifier } from "./api/runtime-jwt.js";
|
|
10
9
|
import { createConnectApp } from "./connect-app.js";
|
|
11
10
|
import { getConnectorAssetDirectory } from "./connector-assets.js";
|
|
@@ -15,22 +14,9 @@ import { createSecretCodec } from "./secrets/secret-codec.js";
|
|
|
15
14
|
import { createDirectoryMigrationSource } from "./storage/migration-source.js";
|
|
16
15
|
import { createNodeRuntimeDatabase } from "./storage/node-runtime-database.js";
|
|
17
16
|
import { DEFAULT_RUN_LIMIT } from "./storage/runtime-store.js";
|
|
18
|
-
let runtimeActive = false;
|
|
19
17
|
export { getConnectorAssetDirectory } from "./connector-assets.js";
|
|
20
18
|
/** Create a headless runtime without opening a listener or installing process signal handlers. */
|
|
21
19
|
export async function createConnectorRuntime(options) {
|
|
22
|
-
if (runtimeActive)
|
|
23
|
-
throw new Error("Only one Open Connector runtime may be active per process. Close it before creating another.");
|
|
24
|
-
runtimeActive = true;
|
|
25
|
-
try {
|
|
26
|
-
return await openRuntime(options);
|
|
27
|
-
}
|
|
28
|
-
catch (error) {
|
|
29
|
-
releaseRuntime();
|
|
30
|
-
throw error;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
async function openRuntime(options) {
|
|
34
20
|
const publicUrl = new URL(options.publicOrigin);
|
|
35
21
|
if (!["http:", "https:"].includes(publicUrl.protocol) ||
|
|
36
22
|
publicUrl.username ||
|
|
@@ -52,14 +38,15 @@ async function openRuntime(options) {
|
|
|
52
38
|
const oauthCloseDelaySeconds = options.oauthCloseDelaySeconds ?? DEFAULT_OAUTH_CLOSE_DELAY_SECONDS;
|
|
53
39
|
if (!Number.isInteger(oauthCloseDelaySeconds) || oauthCloseDelaySeconds < 0)
|
|
54
40
|
throw new Error("oauthCloseDelaySeconds must be a non-negative integer of seconds.");
|
|
41
|
+
// The same rules as `OOMOL_CONNECT_OAUTH_RESULT_ORIGINS`: a host passing the option directly must not be able
|
|
42
|
+
// to make the refusal page post OAuth state to `*` or to a value that is not an origin.
|
|
43
|
+
const oauthResultOrigins = normalizeOAuthResultOrigins(options.oauthResultOrigins ?? []);
|
|
55
44
|
const assetDirectory = getConnectorAssetDirectory();
|
|
56
45
|
const assets = options.assets ?? {
|
|
57
46
|
catalogDir: join(assetDirectory, "catalog/apps"),
|
|
58
47
|
catalogIndexFile: join(assetDirectory, "catalog/apps-index.json"),
|
|
59
48
|
migrationDirectory: join(assetDirectory, "migrations"),
|
|
60
49
|
};
|
|
61
|
-
setPrivateNetworkAccessAllowed(options.network?.allowPrivateNetwork ?? false);
|
|
62
|
-
setEgressTrustedHosts(options.network?.trustedHosts ?? []);
|
|
63
50
|
const secretCodec = createSecretCodec(options.encryptionKey);
|
|
64
51
|
const verifyRuntimeJwt = await createRuntimeJwtVerifier(options.jwt ?? {});
|
|
65
52
|
const lazySchemas = options.lazySchemas ?? true;
|
|
@@ -110,6 +97,7 @@ async function openRuntime(options) {
|
|
|
110
97
|
await cleanupStagedTransitFiles(tempDir, ttlSeconds * 1000);
|
|
111
98
|
const { app, runtimeAuthConfigured, saasCleanup, triggerMaintenance } = await createConnectApp({
|
|
112
99
|
catalog,
|
|
100
|
+
network: options.network,
|
|
113
101
|
providerLoader: new ProviderLoader(executorModules),
|
|
114
102
|
providerHttpDispatch: options.providerHttpDispatch,
|
|
115
103
|
runtimeDatabase: database,
|
|
@@ -120,12 +108,14 @@ async function openRuntime(options) {
|
|
|
120
108
|
secretCodec,
|
|
121
109
|
adminToken: options.adminToken,
|
|
122
110
|
runtimeToken: options.runtimeToken,
|
|
111
|
+
eventVerifyToken: options.eventVerifyToken,
|
|
123
112
|
verifyRuntimeJwt,
|
|
124
113
|
actionPolicy: new ActionPolicyService(options.actionPolicy),
|
|
125
114
|
allowedCustomOAuth: options.allowedCustomOAuth,
|
|
126
115
|
logger: options.logger,
|
|
127
116
|
serveDocumentation: options.apiReference ?? false,
|
|
128
117
|
oauthCloseDelaySeconds,
|
|
118
|
+
oauthResultOrigins,
|
|
129
119
|
});
|
|
130
120
|
saasCleanup.start();
|
|
131
121
|
triggerMaintenance.start();
|
|
@@ -156,12 +146,7 @@ async function openRuntime(options) {
|
|
|
156
146
|
await database.close();
|
|
157
147
|
}
|
|
158
148
|
finally {
|
|
159
|
-
|
|
160
|
-
closeFiles();
|
|
161
|
-
}
|
|
162
|
-
finally {
|
|
163
|
-
releaseRuntime();
|
|
164
|
-
}
|
|
149
|
+
closeFiles();
|
|
165
150
|
}
|
|
166
151
|
});
|
|
167
152
|
}
|
|
@@ -179,8 +164,3 @@ async function openRuntime(options) {
|
|
|
179
164
|
throw error;
|
|
180
165
|
}
|
|
181
166
|
}
|
|
182
|
-
function releaseRuntime() {
|
|
183
|
-
setPrivateNetworkAccessAllowed(false);
|
|
184
|
-
setEgressTrustedHosts([]);
|
|
185
|
-
runtimeActive = false;
|
|
186
|
-
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ConnectionError } from "../../connection-
|
|
1
|
+
import { ConnectionError } from "../../connection-error.js";
|
|
2
2
|
import { optionalInteger, optionalRecord, requiredRecord, requiredString } from "../../core/cast.js";
|
|
3
3
|
import { withProviderHttpDispatch } from "../../core/provider-http-dispatch.js";
|
|
4
4
|
import { ProviderDispatchRequestError, toProviderExecutionError, withProviderHttpDispatchResult, } from "../../providers/provider-runtime.js";
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export interface SlackEventVerificationInput {
|
|
2
|
+
/** Value of the X-Slack-Request-Timestamp header. */
|
|
3
|
+
timestamp: string;
|
|
4
|
+
/** Value of the X-Slack-Signature header. */
|
|
5
|
+
signature: string;
|
|
6
|
+
/** Raw request body bytes; they must not be re-serialized. */
|
|
7
|
+
rawBody: Uint8Array;
|
|
8
|
+
/** App ID of the Slack application configured in this runtime. */
|
|
9
|
+
configuredAppId: string;
|
|
10
|
+
/** Signing secret of the Slack application configured in this runtime. */
|
|
11
|
+
signingSecret: string;
|
|
12
|
+
/** Request Content-Type. Form-urlencoded Slack interactions are verified without parsing. */
|
|
13
|
+
contentType?: string;
|
|
14
|
+
/** Current time in milliseconds; injectable for tests. */
|
|
15
|
+
now?: number;
|
|
16
|
+
}
|
|
17
|
+
export type SlackEventVerificationResult = {
|
|
18
|
+
valid: true;
|
|
19
|
+
appId: string;
|
|
20
|
+
challenge: string | null;
|
|
21
|
+
} | {
|
|
22
|
+
valid: false;
|
|
23
|
+
reason: "signature" | "timestamp" | "payload" | "app" | "body_too_large";
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Reads a request body without buffering more than the Slack event limit.
|
|
27
|
+
*
|
|
28
|
+
* Returns undefined when the request exceeds the limit. The actual stream size is
|
|
29
|
+
* enforced even when Content-Length is absent or understated.
|
|
30
|
+
*/
|
|
31
|
+
export declare function readSlackEventRequestBody(request: Request): Promise<Uint8Array | undefined>;
|
|
32
|
+
/**
|
|
33
|
+
* Verifies the signature, timestamp window, and App ID of an inbound Slack request.
|
|
34
|
+
*
|
|
35
|
+
* Verification only: this function does not persist, deduplicate, or schedule events.
|
|
36
|
+
*/
|
|
37
|
+
export declare function verifySlackEventRequest(input: SlackEventVerificationInput): Promise<SlackEventVerificationResult>;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { verifySlackSignature } from "../triggers/sources/slack-signature.js";
|
|
2
|
+
/** Maximum request body size, consistent with existing event sources. */
|
|
3
|
+
const slackEventMaximumBodyBytes = 64 * 1024;
|
|
4
|
+
/**
|
|
5
|
+
* Reads a request body without buffering more than the Slack event limit.
|
|
6
|
+
*
|
|
7
|
+
* Returns undefined when the request exceeds the limit. The actual stream size is
|
|
8
|
+
* enforced even when Content-Length is absent or understated.
|
|
9
|
+
*/
|
|
10
|
+
export async function readSlackEventRequestBody(request) {
|
|
11
|
+
const declaredLength = request.headers.get("content-length");
|
|
12
|
+
if (declaredLength && /^\d+$/.test(declaredLength) && Number(declaredLength) > slackEventMaximumBodyBytes) {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
if (!request.body)
|
|
16
|
+
return new Uint8Array();
|
|
17
|
+
const reader = request.body.getReader();
|
|
18
|
+
const chunks = [];
|
|
19
|
+
let totalBytes = 0;
|
|
20
|
+
try {
|
|
21
|
+
while (true) {
|
|
22
|
+
const { done, value } = await reader.read();
|
|
23
|
+
if (done)
|
|
24
|
+
break;
|
|
25
|
+
if (!value)
|
|
26
|
+
continue;
|
|
27
|
+
totalBytes += value.byteLength;
|
|
28
|
+
if (totalBytes > slackEventMaximumBodyBytes) {
|
|
29
|
+
await reader.cancel().catch(() => undefined);
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
chunks.push(value);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
reader.releaseLock();
|
|
37
|
+
}
|
|
38
|
+
const body = new Uint8Array(totalBytes);
|
|
39
|
+
let offset = 0;
|
|
40
|
+
for (const chunk of chunks) {
|
|
41
|
+
body.set(chunk, offset);
|
|
42
|
+
offset += chunk.byteLength;
|
|
43
|
+
}
|
|
44
|
+
return body;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Verifies the signature, timestamp window, and App ID of an inbound Slack request.
|
|
48
|
+
*
|
|
49
|
+
* Verification only: this function does not persist, deduplicate, or schedule events.
|
|
50
|
+
*/
|
|
51
|
+
export async function verifySlackEventRequest(input) {
|
|
52
|
+
const now = input.now ?? Date.now();
|
|
53
|
+
if (input.rawBody.byteLength > slackEventMaximumBodyBytes) {
|
|
54
|
+
return { valid: false, reason: "body_too_large" };
|
|
55
|
+
}
|
|
56
|
+
const reason = await verifySlackSignature({ ...input, now });
|
|
57
|
+
if (reason)
|
|
58
|
+
return { valid: false, reason };
|
|
59
|
+
// Slack interaction callbacks are form-urlencoded and do not contain api_app_id.
|
|
60
|
+
// The app-scoped signing secret already proves which application sent the request.
|
|
61
|
+
if (contentType(input.contentType) === "application/x-www-form-urlencoded") {
|
|
62
|
+
return { valid: true, appId: input.configuredAppId, challenge: null };
|
|
63
|
+
}
|
|
64
|
+
// Only parse the body after its signature is trusted.
|
|
65
|
+
let payload;
|
|
66
|
+
try {
|
|
67
|
+
payload = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(input.rawBody));
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return { valid: false, reason: "payload" };
|
|
71
|
+
}
|
|
72
|
+
if (payload === null || typeof payload !== "object" || Array.isArray(payload)) {
|
|
73
|
+
return { valid: false, reason: "payload" };
|
|
74
|
+
}
|
|
75
|
+
const record = payload;
|
|
76
|
+
const isChallenge = record.type === "url_verification";
|
|
77
|
+
if (!isChallenge && record.type !== "event_callback")
|
|
78
|
+
return { valid: false, reason: "payload" };
|
|
79
|
+
if ((!isChallenge || record.api_app_id !== undefined) && record.api_app_id !== input.configuredAppId)
|
|
80
|
+
return { valid: false, reason: "app" };
|
|
81
|
+
if (isChallenge && (typeof record.challenge !== "string" || !record.challenge || record.challenge.length > 1024))
|
|
82
|
+
return { valid: false, reason: "payload" };
|
|
83
|
+
return {
|
|
84
|
+
valid: true,
|
|
85
|
+
appId: input.configuredAppId,
|
|
86
|
+
challenge: isChallenge ? record.challenge : null,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
function contentType(value) {
|
|
90
|
+
return value?.split(";", 1)[0]?.trim().toLowerCase() ?? "";
|
|
91
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { StoredConnection, StoredSaasConnection } from "../../connection-
|
|
1
|
+
import type { StoredConnection, StoredSaasConnection } from "../../connection-store.ts";
|
|
2
2
|
import type { ResolvedCredential } from "../../core/types.ts";
|
|
3
3
|
import type { OAuthAuthorizationState } from "../../oauth/oauth-flow-service.ts";
|
|
4
4
|
import type { ISecretCodec } from "../secrets/secret-codec-core.ts";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { IConnectionStore, StoredConnection, StoredLocalConnection } from "../../connection-
|
|
1
|
+
import type { IConnectionStore, StoredConnection, StoredLocalConnection } from "../../connection-store.ts";
|
|
2
2
|
import type { ResolvedCredential } from "../../core/types.ts";
|
|
3
3
|
import type { ISecretCodec } from "../secrets/secret-codec-core.ts";
|
|
4
4
|
import type { RequestTransaction } from "./connection-request-store.ts";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { IConnectionStore } from "../../../connection-
|
|
1
|
+
import type { IConnectionStore } from "../../../connection-store.ts";
|
|
2
2
|
import type { RuntimeLogger } from "../../../core/types.ts";
|
|
3
3
|
import type { IMarketplaceStore } from "../../../marketplace/marketplace-service.ts";
|
|
4
4
|
import type { IOAuthClientConfigStore } from "../../../oauth/oauth-client-config-service.ts";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { IConnectionStore } from "../../connection-
|
|
1
|
+
import type { IConnectionStore } from "../../connection-store.ts";
|
|
2
2
|
import type { IMarketplaceStore } from "../../marketplace/marketplace-service.ts";
|
|
3
3
|
import type { IOAuthClientConfigStore } from "../../oauth/oauth-client-config-service.ts";
|
|
4
4
|
import type { IOAuthStateStore } from "../../oauth/oauth-flow-service.ts";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { StoredSaasConnection } from "../../connection-
|
|
1
|
+
import type { StoredSaasConnection } from "../../connection-store.ts";
|
|
2
2
|
import type { ISecretCodec } from "../secrets/secret-codec-core.ts";
|
|
3
3
|
import type { RequestStatement, RequestTransaction } from "./connection-request-store.ts";
|
|
4
4
|
import type { RuntimeRow } from "./runtime-sql.ts";
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ActionPolicyService } from "../core/action-policy.ts";
|
|
2
|
+
import type { ProviderNetworkPolicy } from "../core/provider-network-policy.ts";
|
|
2
3
|
import type { RuntimeLogger } from "../core/types.ts";
|
|
3
4
|
import type { IRuntimePolicyStore } from "../server/storage/runtime-policy-store.ts";
|
|
4
5
|
import type { IRuntimeTokenStore } from "../server/storage/runtime-token-service.ts";
|
|
@@ -16,6 +17,7 @@ export interface TriggerSubscriptionSummary {
|
|
|
16
17
|
reconcileAt: number;
|
|
17
18
|
}
|
|
18
19
|
interface TriggerMaintenanceOptions {
|
|
20
|
+
network?: ProviderNetworkPolicy;
|
|
19
21
|
store: TriggerStore;
|
|
20
22
|
runner: TriggerRunner;
|
|
21
23
|
tokens: IRuntimeTokenStore;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { withProviderNetworkPolicy } from "../core/provider-network-policy.js";
|
|
1
2
|
import { HttpRequestError } from "../server/api/http-utils.js";
|
|
2
3
|
import { withSubscription } from "./subscriptions.js";
|
|
3
4
|
export class TriggerMaintenance {
|
|
@@ -49,7 +50,7 @@ export class TriggerMaintenance {
|
|
|
49
50
|
run() {
|
|
50
51
|
if (this.shutdown.signal.aborted)
|
|
51
52
|
return Promise.resolve();
|
|
52
|
-
this.pending ??= this.runBatch()
|
|
53
|
+
this.pending ??= withProviderNetworkPolicy(this.options.network ?? {}, () => this.runBatch())
|
|
53
54
|
.catch(() => {
|
|
54
55
|
this.options.logger?.warn({ errorCode: "trigger_cleanup_failed" }, "Trigger cleanup batch failed; pending work is retained");
|
|
55
56
|
})
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
interface SlackSignatureInput {
|
|
2
|
+
timestamp: string;
|
|
3
|
+
signature: string;
|
|
4
|
+
rawBody: Uint8Array;
|
|
5
|
+
signingSecret: string;
|
|
6
|
+
now: number;
|
|
7
|
+
}
|
|
8
|
+
/** Verify Slack's timestamp and signature over the original request bytes. */
|
|
9
|
+
export declare function verifySlackSignature(input: SlackSignatureInput): Promise<"timestamp" | "signature" | undefined>;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { verifySourceHmac } from "./signature.js";
|
|
2
|
+
/** Verify Slack's timestamp and signature over the original request bytes. */
|
|
3
|
+
export async function verifySlackSignature(input) {
|
|
4
|
+
if (!/^\d{10}$/.test(input.timestamp) || Math.abs(input.now - Number(input.timestamp) * 1000) > 300_000)
|
|
5
|
+
return "timestamp";
|
|
6
|
+
if (!/^v0=[0-9a-f]{64}$/.test(input.signature) || !input.signingSecret)
|
|
7
|
+
return "signature";
|
|
8
|
+
const prefix = new TextEncoder().encode(`v0:${input.timestamp}:`);
|
|
9
|
+
const signed = new Uint8Array(prefix.length + input.rawBody.byteLength);
|
|
10
|
+
signed.set(prefix);
|
|
11
|
+
signed.set(input.rawBody, prefix.length);
|
|
12
|
+
return (await verifySourceHmac(signed, input.signature.slice(3), input.signingSecret)) ? undefined : "signature";
|
|
13
|
+
}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { isJsonObject } from "../common/json.js";
|
|
2
2
|
import { SourceIdentityError } from "./definition.js";
|
|
3
|
-
import {
|
|
3
|
+
import { verifySlackSignature } from "./slack-signature.js";
|
|
4
4
|
const events = new Set(["app_mention", "message.im"]);
|
|
5
|
-
const encoder = new TextEncoder();
|
|
6
5
|
export const slackApplication = {
|
|
7
6
|
kind: "slack",
|
|
8
7
|
applicationIngress: true,
|
|
@@ -47,16 +46,15 @@ export const slackApplication = {
|
|
|
47
46
|
async receive(source, bytes, headers, now) {
|
|
48
47
|
const timestamp = headers.get("x-slack-request-timestamp") ?? "";
|
|
49
48
|
const signature = headers.get("x-slack-signature") ?? "";
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
49
|
+
const failure = await verifySlackSignature({
|
|
50
|
+
timestamp,
|
|
51
|
+
signature,
|
|
52
|
+
rawBody: bytes,
|
|
53
|
+
signingSecret: String(source.secrets.signingSecret),
|
|
54
|
+
now,
|
|
55
|
+
});
|
|
56
|
+
if (failure)
|
|
53
57
|
throw new TypeError("Invalid Slack signature or timestamp.");
|
|
54
|
-
const prefix = encoder.encode(`v0:${timestamp}:`);
|
|
55
|
-
const body = new Uint8Array(prefix.length + bytes.length);
|
|
56
|
-
body.set(prefix);
|
|
57
|
-
body.set(bytes, prefix.length);
|
|
58
|
-
if (!(await verifySourceHmac(body, signature.slice(3), String(source.secrets.signingSecret))))
|
|
59
|
-
throw new TypeError("Invalid Slack signature.");
|
|
60
58
|
const payload = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
|
|
61
59
|
if (!isJsonObject(payload))
|
|
62
60
|
throw new TypeError("Invalid Slack envelope.");
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ConnectionError } from "../connection-
|
|
1
|
+
import { ConnectionError } from "../connection-error.js";
|
|
2
2
|
import { optionalInteger, optionalRecord } from "../core/cast.js";
|
|
3
3
|
import { withProviderHttpDispatch } from "../core/provider-http-dispatch.js";
|
|
4
4
|
import { readOAuthClientConfigMetadata } from "../oauth/oauth-client-config-service.js";
|