@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.
Files changed (486) hide show
  1. package/README.md +4 -2
  2. package/assets/open-connector/catalog/apps/allratestoday.json +174 -0
  3. package/assets/open-connector/catalog/apps/slackbot.json +20 -1
  4. package/assets/open-connector/catalog/apps-index.json +1 -1
  5. package/package.json +1 -1
  6. package/src/connection-error.d.ts +7 -0
  7. package/src/connection-error.js +10 -0
  8. package/src/connection-service.d.ts +2 -50
  9. package/src/connection-service.js +6 -130
  10. package/src/connection-store.d.ts +41 -0
  11. package/src/connection-store.js +1 -0
  12. package/src/core/guarded-fetch.d.ts +3 -0
  13. package/src/core/guarded-fetch.js +8 -1
  14. package/src/core/provider-network-policy.d.ts +15 -0
  15. package/src/core/provider-network-policy.js +11 -0
  16. package/src/core/request.d.ts +18 -14
  17. package/src/core/request.js +11 -35
  18. package/src/credential-resolver.d.ts +24 -0
  19. package/src/credential-resolver.js +131 -0
  20. package/src/mcp.js +1 -1
  21. package/src/oauth/oauth-client-config-service.d.ts +1 -1
  22. package/src/oauth/oauth-client-config-service.js +14 -2
  23. package/src/oauth/oauth-credential-refresh-service.js +1 -1
  24. package/src/oauth/oauth-flow-service.d.ts +9 -1
  25. package/src/oauth/oauth-flow-service.js +11 -1
  26. package/src/providers/abuseipdb/executors.js +3 -4
  27. package/src/providers/action-contracts.generated.d.ts +1 -0
  28. package/src/providers/addressfinder/executors.js +2 -3
  29. package/src/providers/aeroleads/executors.js +3 -3
  30. package/src/providers/affinity/runtime.js +6 -7
  31. package/src/providers/aftership/executors.js +2 -2
  32. package/src/providers/agent_mail/runtime.js +2 -2
  33. package/src/providers/agentql/runtime.js +2 -2
  34. package/src/providers/agenty/runtime.js +5 -6
  35. package/src/providers/agiled/runtime.d.ts +0 -1
  36. package/src/providers/agiled/runtime.js +2 -3
  37. package/src/providers/agility/runtime.js +2 -3
  38. package/src/providers/ahrefs/runtime.js +3 -3
  39. package/src/providers/aifinmarket/runtime.js +6 -7
  40. package/src/providers/airtable/executors.js +3 -3
  41. package/src/providers/alchemy/runtime.js +2 -2
  42. package/src/providers/algolia/runtime.js +3 -3
  43. package/src/providers/aliyun_oss/executors.js +7 -7
  44. package/src/providers/allratestoday/executors.d.ts +3 -0
  45. package/src/providers/allratestoday/executors.js +18 -0
  46. package/src/providers/allratestoday/runtime.d.ts +17 -0
  47. package/src/providers/allratestoday/runtime.js +104 -0
  48. package/src/providers/alpaca/runtime.js +2 -3
  49. package/src/providers/alpha_vantage/runtime.js +2 -2
  50. package/src/providers/alt_text_ai/runtime.js +2 -2
  51. package/src/providers/altiria/executors.js +3 -3
  52. package/src/providers/amap/runtime.js +3 -3
  53. package/src/providers/ambee/runtime.js +2 -2
  54. package/src/providers/ambivo/executors.js +3 -3
  55. package/src/providers/amilia/runtime.js +1 -1
  56. package/src/providers/amplemarket/runtime.js +2 -2
  57. package/src/providers/amplitude/runtime.js +3 -3
  58. package/src/providers/anysearch/runtime.js +4 -4
  59. package/src/providers/apaleo/runtime.js +2 -2
  60. package/src/providers/api_sports/executors.js +3 -4
  61. package/src/providers/apiverve/executors.js +2 -3
  62. package/src/providers/apollo/executors.js +2 -3
  63. package/src/providers/appcircle/runtime.js +5 -5
  64. package/src/providers/appdrag/executors.js +2 -3
  65. package/src/providers/arcgis_online/executors.js +2 -2
  66. package/src/providers/auth0_management/runtime.js +2 -3
  67. package/src/providers/autoblogger/executors.js +3 -3
  68. package/src/providers/baidu_maps/runtime.js +3 -3
  69. package/src/providers/baidu_netdisk/runtime-mcp.js +3 -4
  70. package/src/providers/bark/executors.js +5 -5
  71. package/src/providers/bitrise/runtime.js +3 -3
  72. package/src/providers/bouncer/executors.js +3 -4
  73. package/src/providers/browse_ai/runtime.js +3 -4
  74. package/src/providers/browserstack/executors.js +6 -7
  75. package/src/providers/buildkite/runtime.js +3 -3
  76. package/src/providers/bunnycdn/runtime.js +3 -3
  77. package/src/providers/businessmap/runtime.js +6 -7
  78. package/src/providers/buttondown/runtime.js +2 -2
  79. package/src/providers/byteforms/runtime.js +2 -2
  80. package/src/providers/calendly/runtime.js +2 -2
  81. package/src/providers/captainbi/runtime.js +6 -6
  82. package/src/providers/castingwords/runtime.js +1 -1
  83. package/src/providers/chatpdf/runtime.js +4 -4
  84. package/src/providers/check/executors.js +3 -4
  85. package/src/providers/checkly/executors.js +3 -4
  86. package/src/providers/chengxin/runtime.js +3 -3
  87. package/src/providers/cincopa/executors.js +3 -4
  88. package/src/providers/circle/executors.js +3 -4
  89. package/src/providers/clearout/executors.js +1 -2
  90. package/src/providers/clickhelp/runtime.js +5 -5
  91. package/src/providers/clickhouse/runtime.js +4 -4
  92. package/src/providers/clinicalkey/runtime.js +3 -3
  93. package/src/providers/clinicaltrials_gov/runtime.js +4 -5
  94. package/src/providers/clockify/runtime.js +4 -4
  95. package/src/providers/close/runtime.js +3 -3
  96. package/src/providers/cloudconvert/runtime.js +8 -9
  97. package/src/providers/cloudflare_dns/runtime.js +2 -2
  98. package/src/providers/cloudflare_email_routing/runtime.js +2 -2
  99. package/src/providers/cloudflare_r2/runtime.js +5 -5
  100. package/src/providers/cloudflare_worker/runtime.js +10 -10
  101. package/src/providers/cloudinary/runtime.js +4 -4
  102. package/src/providers/cloudlayer/runtime.js +5 -5
  103. package/src/providers/codacy/runtime.js +2 -2
  104. package/src/providers/codemagic/runtime.js +2 -2
  105. package/src/providers/confluence/executors.js +4 -4
  106. package/src/providers/confluence/runtime.d.ts +0 -1
  107. package/src/providers/confluence/runtime.js +6 -7
  108. package/src/providers/contactout/runtime.js +5 -5
  109. package/src/providers/contentful/runtime.js +2 -2
  110. package/src/providers/contentstack_content_delivery/runtime.js +1 -1
  111. package/src/providers/cronly/runtime.js +2 -2
  112. package/src/providers/crossref/runtime.js +3 -3
  113. package/src/providers/cutt_ly/runtime.js +3 -3
  114. package/src/providers/cyberimpact/runtime.js +3 -3
  115. package/src/providers/dachser/executors.js +2 -2
  116. package/src/providers/dailybot/runtime.js +1 -1
  117. package/src/providers/databox/runtime.js +2 -2
  118. package/src/providers/databricks/runtime.js +2 -2
  119. package/src/providers/datacite/runtime.js +1 -1
  120. package/src/providers/datadog/executors.js +3 -4
  121. package/src/providers/datascope/runtime.js +2 -2
  122. package/src/providers/daytona/executors.js +3 -3
  123. package/src/providers/deepgram/runtime.js +2 -2
  124. package/src/providers/deepl/runtime.js +4 -4
  125. package/src/providers/detrack/executors.js +5 -5
  126. package/src/providers/deutschlandgpt/runtime.js +2 -2
  127. package/src/providers/dialmycalls/runtime.js +4 -4
  128. package/src/providers/diffbot/executors.js +4 -4
  129. package/src/providers/digistore24/executors.js +3 -3
  130. package/src/providers/dingtalk_bot/executors.js +1 -1
  131. package/src/providers/discourse/executors.d.ts +0 -1
  132. package/src/providers/discourse/executors.js +6 -7
  133. package/src/providers/docugenerate/runtime.js +3 -3
  134. package/src/providers/doppler/runtime.shared.js +3 -3
  135. package/src/providers/doppler_marketing_automation/runtime.js +4 -4
  136. package/src/providers/dovetail/runtime.js +2 -2
  137. package/src/providers/dropcontact/runtime.js +3 -3
  138. package/src/providers/dub/executors.js +6 -6
  139. package/src/providers/dumplingai/runtime.js +2 -2
  140. package/src/providers/elevenlabs/executors.js +4 -4
  141. package/src/providers/elevenreader/runtime.js +1 -1
  142. package/src/providers/emailoctopus/runtime.js +4 -4
  143. package/src/providers/embase/runtime.js +3 -3
  144. package/src/providers/emelia/executors.js +2 -2
  145. package/src/providers/enigma/executors.js +3 -3
  146. package/src/providers/eodhd_apis/executors.js +2 -2
  147. package/src/providers/eventzilla/runtime.js +3 -4
  148. package/src/providers/evervault/runtime.js +1 -1
  149. package/src/providers/excalidraw_mcp/runtime.js +3 -4
  150. package/src/providers/excel/runtime.js +6 -6
  151. package/src/providers/expofp/runtime.js +2 -2
  152. package/src/providers/faktoora/runtime.js +5 -5
  153. package/src/providers/fast_note_sync/runtime.js +2 -2
  154. package/src/providers/feathery/executors.js +2 -3
  155. package/src/providers/feishu_app_bot/executors.js +2 -3
  156. package/src/providers/feishu_custom_bot/executors.js +2 -3
  157. package/src/providers/ffhub/executors.js +2 -3
  158. package/src/providers/fidel_api/executors.js +2 -3
  159. package/src/providers/files_com/executors.js +2 -3
  160. package/src/providers/fireberry/runtime.d.ts +0 -1
  161. package/src/providers/fireberry/runtime.js +3 -4
  162. package/src/providers/firehydrant/executors.js +2 -3
  163. package/src/providers/float/executors.js +2 -3
  164. package/src/providers/flomo/executors.js +5 -6
  165. package/src/providers/flowiseai/executors.js +2 -3
  166. package/src/providers/fluxguard/executors.js +2 -3
  167. package/src/providers/folk/executors.js +2 -3
  168. package/src/providers/football_data/executors.js +2 -3
  169. package/src/providers/forem/executors.js +2 -3
  170. package/src/providers/formbricks/executors.js +2 -3
  171. package/src/providers/formsite/executors.js +3 -4
  172. package/src/providers/formspree/executors.js +2 -2
  173. package/src/providers/freshdesk/executors.js +3 -4
  174. package/src/providers/freshservice/executors.js +3 -4
  175. package/src/providers/freshteam/runtime.js +3 -4
  176. package/src/providers/full_contact/executors.js +3 -3
  177. package/src/providers/fusion-api/runtime.js +2 -3
  178. package/src/providers/gagelist/executors.js +3 -3
  179. package/src/providers/gainsight_nxt/executors.js +2 -2
  180. package/src/providers/gamma/executors.js +4 -3
  181. package/src/providers/gangtise/runtime.js +3 -4
  182. package/src/providers/gatherup/runtime.js +1 -1
  183. package/src/providers/geckoboard/executors.js +2 -3
  184. package/src/providers/gemini/runtime.d.ts +0 -1
  185. package/src/providers/gemini/runtime.js +5 -6
  186. package/src/providers/genpage/runtime.js +2 -2
  187. package/src/providers/geokeo/executors.js +4 -4
  188. package/src/providers/getnote/runtime.js +2 -3
  189. package/src/providers/github/runtime-shared.js +2 -2
  190. package/src/providers/glyphic/runtime.js +3 -4
  191. package/src/providers/gmail/executors.js +125 -27
  192. package/src/providers/gong/runtime.js +6 -7
  193. package/src/providers/googlecalendar/runtime-shared.js +3 -4
  194. package/src/providers/googledrive/runtime-request.js +2 -3
  195. package/src/providers/googlesheets/runtime-shared.js +3 -4
  196. package/src/providers/gorgias/runtime.js +4 -4
  197. package/src/providers/gotify/executors.js +7 -8
  198. package/src/providers/greenhouse/executors.js +3 -3
  199. package/src/providers/gumloop/executors.js +2 -3
  200. package/src/providers/gumroad/executors.js +2 -3
  201. package/src/providers/habitica/executors.js +2 -3
  202. package/src/providers/hackerrank_work/executors.js +2 -3
  203. package/src/providers/harvest/executors.js +3 -4
  204. package/src/providers/haveibeenpwned/executors.js +2 -3
  205. package/src/providers/headout/executors.js +3 -4
  206. package/src/providers/healthchecks_io/executors.js +2 -3
  207. package/src/providers/helium10/runtime.js +4 -5
  208. package/src/providers/helpdesk/runtime.js +4 -4
  209. package/src/providers/home_assistant/runtime-ws.js +9 -10
  210. package/src/providers/hotjar/executors.js +4 -4
  211. package/src/providers/httpsms/runtime.js +3 -4
  212. package/src/providers/hub_planner/executors.js +3 -3
  213. package/src/providers/hubspot/runtime.js +3 -4
  214. package/src/providers/humaans/runtime.js +3 -3
  215. package/src/providers/hunter/runtime.js +3 -3
  216. package/src/providers/icypeas/executors.js +3 -4
  217. package/src/providers/ima/runtime.js +7 -7
  218. package/src/providers/infolobby/runtime.js +6 -6
  219. package/src/providers/instabot/runtime.js +6 -6
  220. package/src/providers/instatus/runtime.js +4 -4
  221. package/src/providers/intuiface/executors.js +3 -3
  222. package/src/providers/iplocate/runtime.js +4 -5
  223. package/src/providers/ipregistry/executors.js +2 -2
  224. package/src/providers/jiminny/runtime.js +4 -4
  225. package/src/providers/jin10/executors.js +4 -5
  226. package/src/providers/jira/executors.js +4 -4
  227. package/src/providers/kaleido/runtime.js +2 -2
  228. package/src/providers/kandji/runtime.js +2 -2
  229. package/src/providers/keygen/executors.js +4 -4
  230. package/src/providers/keyword/runtime.js +2 -2
  231. package/src/providers/kie_ai/executors.js +1 -1
  232. package/src/providers/kintone/runtime.js +1 -1
  233. package/src/providers/kit/runtime.js +2 -2
  234. package/src/providers/klangio/runtime.js +4 -4
  235. package/src/providers/klaviyo/executors.js +1 -1
  236. package/src/providers/klazify/executors.js +3 -3
  237. package/src/providers/klipfolio/runtime.js +3 -3
  238. package/src/providers/knack/executors.js +1 -1
  239. package/src/providers/kommo/runtime.js +2 -2
  240. package/src/providers/kontent_ai/executors.js +3 -4
  241. package/src/providers/l2s/executors.js +3 -4
  242. package/src/providers/latchshot/executors.js +2 -2
  243. package/src/providers/leadboxer/runtime.js +4 -4
  244. package/src/providers/leadiq/runtime.js +4 -4
  245. package/src/providers/linguapop/runtime.js +1 -1
  246. package/src/providers/lingvanex_translation_api/runtime.js +5 -6
  247. package/src/providers/lingxing_mcp/runtime.js +3 -4
  248. package/src/providers/linkup/runtime.js +5 -6
  249. package/src/providers/liveagent/executors.js +6 -6
  250. package/src/providers/loops/executors.js +2 -2
  251. package/src/providers/loyjoy/runtime.js +2 -2
  252. package/src/providers/loyverse/executors.js +4 -4
  253. package/src/providers/lusha/runtime.js +3 -3
  254. package/src/providers/mailbluster/runtime.js +3 -4
  255. package/src/providers/mailcoach/runtime.js +4 -4
  256. package/src/providers/mailgenius/executors.js +3 -4
  257. package/src/providers/mailjet/runtime.js +3 -3
  258. package/src/providers/mails_so/runtime.js +1 -1
  259. package/src/providers/mailsoftly/runtime.js +5 -5
  260. package/src/providers/mailtrap/runtime.js +4 -5
  261. package/src/providers/manus/runtime.js +3 -3
  262. package/src/providers/mautic/runtime.js +3 -3
  263. package/src/providers/megaventory/runtime.js +3 -3
  264. package/src/providers/memberstack/runtime.js +2 -2
  265. package/src/providers/mendeley/executors.js +2 -3
  266. package/src/providers/mindbody/runtime.js +3 -3
  267. package/src/providers/minerstat/executors.js +3 -3
  268. package/src/providers/mintlify/runtime.js +3 -3
  269. package/src/providers/missive/executors.js +3 -5
  270. package/src/providers/mixpanel/executors.js +3 -3
  271. package/src/providers/mobile_text_alerts/runtime.js +3 -3
  272. package/src/providers/mocean/executors.js +3 -3
  273. package/src/providers/moco/executors.js +5 -5
  274. package/src/providers/moesif/runtime.js +4 -4
  275. package/src/providers/monday/runtime-common.js +3 -3
  276. package/src/providers/monica_crm/runtime.js +4 -4
  277. package/src/providers/moorcheh/runtime.js +3 -3
  278. package/src/providers/more_trees/runtime.d.ts +0 -1
  279. package/src/providers/more_trees/runtime.js +7 -8
  280. package/src/providers/moxie/runtime.js +2 -2
  281. package/src/providers/msg91/runtime.js +4 -4
  282. package/src/providers/mx/runtime.js +1 -1
  283. package/src/providers/needle/runtime.js +3 -4
  284. package/src/providers/netlify/runtime.js +2 -3
  285. package/src/providers/niftyimages/executors.js +2 -2
  286. package/src/providers/northbeam/runtime.js +1 -1
  287. package/src/providers/nozbe_teams/executors.js +4 -4
  288. package/src/providers/npm/runtime.js +4 -4
  289. package/src/providers/nusii_proposals/runtime.js +2 -2
  290. package/src/providers/ocr_web_service/executors.js +4 -4
  291. package/src/providers/octopus_deploy/executors.js +3 -3
  292. package/src/providers/oksign/runtime.js +3 -4
  293. package/src/providers/one_drive/executors.js +6 -6
  294. package/src/providers/one_password_events/runtime.js +1 -1
  295. package/src/providers/onfleet/runtime.js +3 -3
  296. package/src/providers/onlyoffice_docspace/runtime.js +4 -4
  297. package/src/providers/oomnitza/runtime.js +3 -4
  298. package/src/providers/otter_ai/executors.js +2 -2
  299. package/src/providers/oura/runtime.js +1 -1
  300. package/src/providers/paddle/executors.js +3 -3
  301. package/src/providers/pagerduty/runtime.js +2 -2
  302. package/src/providers/paradym/runtime.js +4 -4
  303. package/src/providers/parallel/runtime.js +3 -3
  304. package/src/providers/partner_stack_partner/runtime.js +1 -1
  305. package/src/providers/payrexx/runtime.js +5 -6
  306. package/src/providers/permit_io/runtime.js +2 -2
  307. package/src/providers/pinboard/executors.js +5 -6
  308. package/src/providers/pinpoint/runtime.js +2 -2
  309. package/src/providers/placid/runtime.js +3 -3
  310. package/src/providers/plain/runtime.js +5 -5
  311. package/src/providers/planetscale/runtime.js +2 -2
  312. package/src/providers/planhat/executors.js +6 -6
  313. package/src/providers/plausible_analytics/runtime.js +3 -3
  314. package/src/providers/posthog/runtime.js +3 -3
  315. package/src/providers/predis_ai/executors.js +3 -3
  316. package/src/providers/printavo/runtime.js +2 -2
  317. package/src/providers/prospeo/runtime.js +2 -3
  318. package/src/providers/provider-runtime.d.ts +13 -1
  319. package/src/providers/provider-runtime.js +25 -10
  320. package/src/providers/push_by_techulus/executors.js +3 -4
  321. package/src/providers/pushover/runtime.js +4 -5
  322. package/src/providers/pushsafer/runtime.js +4 -5
  323. package/src/providers/pylon/runtime.js +2 -2
  324. package/src/providers/qase/runtime.js +3 -3
  325. package/src/providers/qdrant/runtime.js +1 -1
  326. package/src/providers/qichacha/runtime.js +2 -2
  327. package/src/providers/qingflow/runtime.js +2 -2
  328. package/src/providers/quickchart/runtime.js +2 -2
  329. package/src/providers/quintadb/runtime.js +2 -2
  330. package/src/providers/quo/runtime.js +2 -2
  331. package/src/providers/rawg/runtime.js +4 -4
  332. package/src/providers/razorpay/runtime.js +4 -5
  333. package/src/providers/readme/runtime.js +6 -6
  334. package/src/providers/referralhero/runtime.js +3 -3
  335. package/src/providers/registry.generated.js +1 -0
  336. package/src/providers/render/executors.js +3 -3
  337. package/src/providers/respond_io/executors.js +3 -3
  338. package/src/providers/reversecontact/runtime.js +3 -3
  339. package/src/providers/ritekit/executors.js +2 -2
  340. package/src/providers/riveter/executors.js +2 -3
  341. package/src/providers/rocket_chat/executors.js +3 -4
  342. package/src/providers/rocket_reach/executors.js +3 -4
  343. package/src/providers/saucelabs/runtime.js +4 -4
  344. package/src/providers/scopus/runtime.js +3 -3
  345. package/src/providers/scrape_do/executors.js +2 -2
  346. package/src/providers/scraperapi/runtime.js +4 -4
  347. package/src/providers/scrapfly/executors.js +2 -2
  348. package/src/providers/scrapingant/executors.js +6 -7
  349. package/src/providers/scrapingbee/executors.js +3 -3
  350. package/src/providers/scrapingdog/executors.js +1 -1
  351. package/src/providers/screenshot_fyi/executors.js +3 -4
  352. package/src/providers/screenshotbase/runtime.js +3 -3
  353. package/src/providers/search_api/runtime.js +2 -2
  354. package/src/providers/securitytrails/executors.js +2 -2
  355. package/src/providers/semantic_scholar/executors.js +2 -2
  356. package/src/providers/sendbird/executors.js +2 -2
  357. package/src/providers/sendfox/executors.js +3 -3
  358. package/src/providers/sendgrid/executors.js +5 -5
  359. package/src/providers/sendmator/runtime.js +3 -4
  360. package/src/providers/seqera/runtime.js +3 -4
  361. package/src/providers/serveravatar/executors.js +3 -3
  362. package/src/providers/sheetdb/runtime.js +2 -2
  363. package/src/providers/short_menu/runtime.js +3 -3
  364. package/src/providers/shortcut/runtime.js +3 -3
  365. package/src/providers/shortpixel/runtime.js +2 -2
  366. package/src/providers/shotstack/runtime.js +4 -4
  367. package/src/providers/signpath/runtime.js +2 -2
  368. package/src/providers/signwell/runtime.js +5 -6
  369. package/src/providers/similarweb_digitalrank_api/runtime.js +3 -3
  370. package/src/providers/simla/runtime.js +5 -5
  371. package/src/providers/simplybook_me/executors.js +6 -6
  372. package/src/providers/sitespeakai/runtime.js +3 -3
  373. package/src/providers/slickdeals/runtime.js +2 -3
  374. package/src/providers/smartsuite/runtime.js +3 -3
  375. package/src/providers/sonarcloud/runtime.js +5 -5
  376. package/src/providers/sorftime/runtime.js +8 -8
  377. package/src/providers/spider/runtime.js +2 -2
  378. package/src/providers/splunk_http_event_collector/runtime.js +7 -8
  379. package/src/providers/sportsdata/runtime.js +4 -4
  380. package/src/providers/spyfu/runtime.js +4 -5
  381. package/src/providers/square/runtime.js +4 -4
  382. package/src/providers/stannp/runtime.js +2 -2
  383. package/src/providers/stripe/executors.js +2 -2
  384. package/src/providers/supermemory/runtime.js +3 -3
  385. package/src/providers/survey_monkey/runtime.js +3 -3
  386. package/src/providers/taiga/runtime.js +4 -4
  387. package/src/providers/talenox/executors.js +4 -4
  388. package/src/providers/tally/runtime.js +3 -3
  389. package/src/providers/tavily/runtime.js +3 -4
  390. package/src/providers/teamcamp/executors.js +2 -2
  391. package/src/providers/teamtailor/executors.js +2 -2
  392. package/src/providers/telegram/executors.js +6 -7
  393. package/src/providers/teltel/executors.js +2 -2
  394. package/src/providers/templated/executors.js +3 -3
  395. package/src/providers/tencent_docs/runtime.js +4 -4
  396. package/src/providers/tencent_maps/runtime.js +3 -3
  397. package/src/providers/textcortex/runtime.js +3 -3
  398. package/src/providers/the_cat_api/runtime.js +3 -3
  399. package/src/providers/the_colony/runtime.js +3 -3
  400. package/src/providers/the_odds_api/runtime.js +3 -4
  401. package/src/providers/the_official_board/runtime.js +4 -4
  402. package/src/providers/thehive/runtime.js +1 -1
  403. package/src/providers/tikhub/endpoint-catalog.js +2 -3
  404. package/src/providers/tiktok_business/runtime.js +2 -2
  405. package/src/providers/timecamp/runtime.js +2 -2
  406. package/src/providers/timelink/runtime.js +2 -2
  407. package/src/providers/totp/runtime.js +4 -5
  408. package/src/providers/trawlingweb/runtime.js +2 -2
  409. package/src/providers/trilium/runtime.js +2 -2
  410. package/src/providers/triple_whale/runtime.js +3 -3
  411. package/src/providers/truvera/runtime.js +2 -2
  412. package/src/providers/tuskr/runtime.js +2 -2
  413. package/src/providers/typebot/runtime.js +2 -2
  414. package/src/providers/typeform/runtime.js +2 -2
  415. package/src/providers/uptimerobot/executors.js +3 -4
  416. package/src/providers/v2ex/runtime.js +8 -9
  417. package/src/providers/valyu/runtime.js +3 -3
  418. package/src/providers/vapi/runtime.js +4 -4
  419. package/src/providers/vectorshift/runtime.js +3 -3
  420. package/src/providers/venafitlsprotectcloud/runtime.js +2 -3
  421. package/src/providers/venafitlsprotectdatacenter/runtime.js +2 -3
  422. package/src/providers/vida/runtime.js +4 -4
  423. package/src/providers/vonage/runtime.js +3 -3
  424. package/src/providers/walmart_marketplace/runtime.js +5 -5
  425. package/src/providers/weatherapi/executors.js +3 -4
  426. package/src/providers/web_of_science/runtime.js +4 -4
  427. package/src/providers/web_of_science_expanded/runtime.js +9 -9
  428. package/src/providers/webex/runtime.js +3 -3
  429. package/src/providers/webinarjam/runtime.js +4 -4
  430. package/src/providers/webscraping_ai/runtime.js +3 -3
  431. package/src/providers/webvizio/runtime.js +3 -4
  432. package/src/providers/wecom_bot/smart-runtime.js +4 -5
  433. package/src/providers/wecom_mcp/runtime.js +3 -4
  434. package/src/providers/wejam_ai/runtime.js +3 -3
  435. package/src/providers/wolfram_alpha_api/runtime.js +3 -3
  436. package/src/providers/woocommerce/runtime.js +1 -1
  437. package/src/providers/woodpecker_co/executors.js +3 -4
  438. package/src/providers/woot/runtime.js +6 -6
  439. package/src/providers/workable/runtime.js +3 -3
  440. package/src/providers/workday/runtime.js +4 -4
  441. package/src/providers/workiom/runtime.js +2 -2
  442. package/src/providers/workiz/runtime.js +2 -2
  443. package/src/providers/workpath/executors.js +3 -4
  444. package/src/providers/worksnaps/executors.js +2 -2
  445. package/src/providers/y_gy/runtime.js +2 -2
  446. package/src/providers/zenscrape/runtime.js +3 -3
  447. package/src/providers/zep/runtime.js +4 -4
  448. package/src/providers/zeplin/runtime.js +2 -2
  449. package/src/providers/zhihu/executors.js +6 -6
  450. package/src/providers/zylvie/runtime.js +4 -4
  451. package/src/saas/saas-cleanup-service.d.ts +2 -0
  452. package/src/saas/saas-cleanup-service.js +2 -1
  453. package/src/saas/saas-execution-service.d.ts +1 -1
  454. package/src/server/actions/action-runner.js +1 -1
  455. package/src/server/api/auth.js +3 -0
  456. package/src/server/api/connection-routes.js +1 -1
  457. package/src/server/api/console-catalog-routes.js +1 -1
  458. package/src/server/api/console-oauth-routes.d.ts +3 -1
  459. package/src/server/api/console-oauth-routes.js +22 -9
  460. package/src/server/api/oauth-completion-page.d.ts +57 -0
  461. package/src/server/api/oauth-completion-page.js +135 -10
  462. package/src/server/api/openapi.d.ts +5 -0
  463. package/src/server/api/openapi.js +62 -2
  464. package/src/server/api/runtime-api.d.ts +2 -1
  465. package/src/server/api/runtime-app-routes.js +1 -1
  466. package/src/server/api/runtime-execution-routes.js +2 -1
  467. package/src/server/connect-app.d.ts +4 -0
  468. package/src/server/connect-app.js +14 -1
  469. package/src/server/connect-server.d.ts +6 -0
  470. package/src/server/connect-server.js +114 -4
  471. package/src/server/connector-runtime.d.ts +6 -8
  472. package/src/server/connector-runtime.js +8 -28
  473. package/src/server/proxy/proxy-runner.js +1 -1
  474. package/src/server/slack-event-verification.d.ts +37 -0
  475. package/src/server/slack-event-verification.js +91 -0
  476. package/src/server/storage/connection-request-store.d.ts +1 -1
  477. package/src/server/storage/connection-store.d.ts +1 -1
  478. package/src/server/storage/postgres/runtime-store.d.ts +1 -1
  479. package/src/server/storage/runtime-database.d.ts +1 -1
  480. package/src/server/storage/saas-project-store.d.ts +1 -1
  481. package/src/triggers/maintenance.d.ts +2 -0
  482. package/src/triggers/maintenance.js +2 -1
  483. package/src/triggers/sources/slack-signature.d.ts +10 -0
  484. package/src/triggers/sources/slack-signature.js +13 -0
  485. package/src/triggers/sources/slack.js +9 -11
  486. 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?: ConnectorNetworkOptions;
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
- try {
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-service.js";
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-service.ts";
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-service.ts";
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-service.ts";
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-service.ts";
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-service.ts";
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 { verifySourceHmac } from "./signature.js";
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
- if (!/^\d{10}$/.test(timestamp) ||
51
- Math.abs(now - Number(timestamp) * 1000) > 300_000 ||
52
- !/^v0=[0-9a-f]{64}$/.test(signature))
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-service.js";
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";