better-supabase 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +299 -41
- package/dist/access-sql-B0dF-SoF.js +181 -0
- package/dist/actor-CQTlc1Hh.d.ts +43 -0
- package/dist/adapter-Bc1o3zyy.js +1106 -0
- package/dist/agents-CVHGd7It.d.ts +94 -0
- package/dist/ai-cache-CBWs1W0k.js +80 -0
- package/dist/ai-cache-DaDu_G5L.d.ts +64 -0
- package/dist/ai-chat-7amvXjmQ.d.ts +590 -0
- package/dist/ai-chat-B24UI962.js +743 -0
- package/dist/ai-files-CSPNswUY.js +319 -0
- package/dist/ai-sdk/agents/index.d.ts +74 -0
- package/dist/ai-sdk/agents/index.js +159 -0
- package/dist/ai-sdk/batches/index.d.ts +74 -0
- package/dist/ai-sdk/batches/index.js +180 -0
- package/dist/ai-sdk/cache/index.d.ts +38 -0
- package/dist/ai-sdk/cache/index.js +127 -0
- package/dist/ai-sdk/chat/index.d.ts +2 -0
- package/dist/ai-sdk/chat/index.js +246 -0
- package/dist/ai-sdk/embeddings/index.d.ts +3 -0
- package/dist/ai-sdk/embeddings/index.js +2 -0
- package/dist/ai-sdk/files/index.d.ts +61 -0
- package/dist/ai-sdk/files/index.js +111 -0
- package/dist/ai-sdk/index.d.ts +145 -0
- package/dist/ai-sdk/index.js +174 -0
- package/dist/ai-sdk/mcp/index.d.ts +102 -0
- package/dist/ai-sdk/mcp/index.js +362 -0
- package/dist/ai-sdk/memory/index.d.ts +67 -0
- package/dist/ai-sdk/memory/index.js +175 -0
- package/dist/ai-sdk/react/index.d.ts +2 -0
- package/dist/ai-sdk/react/index.js +3 -0
- package/dist/ai-sdk/react/server.d.ts +6 -0
- package/dist/ai-sdk/react/server.js +7 -0
- package/dist/ai-sdk/workflow/index.d.ts +249 -0
- package/dist/ai-sdk/workflow/index.js +575 -0
- package/dist/ai-sdk/workflow/react/index.d.ts +20 -0
- package/dist/ai-sdk/workflow/react/index.js +66 -0
- package/dist/ai-sdk/workflow/react/server.d.ts +10 -0
- package/dist/ai-sdk/workflow/react/server.js +12 -0
- package/dist/ai-tasks-Cd1HMFvB.d.ts +131 -0
- package/dist/announcements-CiyOs-xP.js +107 -0
- package/dist/announcements-ZRGnScWI.d.ts +72 -0
- package/dist/api-keys-rCGtKaZA.d.ts +156 -0
- package/dist/assistant-DwdpDH1q.d.ts +147 -0
- package/dist/astro/index.d.ts +86 -0
- package/dist/astro/index.js +93 -0
- package/dist/attributes-5dYul0u0.js +13 -0
- package/dist/auth-link-BjFPqwLz.d.ts +97 -0
- package/dist/auth-link-DrDX9KOT.js +114 -0
- package/dist/authorization-BFCqamMs.d.ts +172 -0
- package/dist/before-route-CnR0C0Jr.js +30 -0
- package/dist/bind-Bu_ZNa3W.d.ts +62 -0
- package/dist/bind-l4kAvYSv.js +97 -0
- package/dist/block-events-CrT8r7Fe.js +76 -0
- package/dist/block-fields-GFkxl4dP.js +49 -0
- package/dist/block-fields-SJ6fEf3o.d.ts +31 -0
- package/dist/block-helpers-CKtbFcRv.d.ts +37 -0
- package/dist/block-helpers-DWHxHsEQ.js +190 -0
- package/dist/block-hooks-BmjMyXTa.js +114 -0
- package/dist/block-hooks-plbZ0AbJ.d.ts +107 -0
- package/dist/{kit-transport-DJlHQUBU.js → block-transport-BLr-ZgLc.js} +11 -7
- package/dist/block-transport-DvaoPuZ9.d.ts +48 -0
- package/dist/blocks/agents/index.d.ts +3 -0
- package/dist/blocks/agents/index.js +123 -0
- package/dist/blocks/ai-cache/index.d.ts +3 -0
- package/dist/blocks/ai-cache/index.js +3 -0
- package/dist/blocks/ai-chat/index.d.ts +31 -0
- package/dist/blocks/ai-chat/index.js +5 -0
- package/dist/blocks/ai-chat/react/index.d.ts +77 -0
- package/dist/blocks/ai-chat/react/index.js +387 -0
- package/dist/blocks/ai-chat/react/server.d.ts +16 -0
- package/dist/blocks/ai-chat/react/server.js +14 -0
- package/dist/blocks/ai-files/index.d.ts +14 -0
- package/dist/blocks/ai-files/index.js +3 -0
- package/dist/blocks/ai-providers/index.d.ts +7 -0
- package/dist/blocks/ai-providers/index.js +211 -0
- package/dist/blocks/ai-tasks/index.d.ts +3 -0
- package/dist/blocks/ai-tasks/index.js +203 -0
- package/dist/blocks/announcements/index.d.ts +3 -0
- package/dist/blocks/announcements/index.js +3 -0
- package/dist/blocks/announcements/react/index.d.ts +31 -0
- package/dist/blocks/announcements/react/index.js +86 -0
- package/dist/blocks/announcements/react/server.d.ts +6 -0
- package/dist/blocks/announcements/react/server.js +7 -0
- package/dist/blocks/api-keys/index.d.ts +35 -0
- package/dist/blocks/api-keys/index.js +334 -0
- package/dist/blocks/attachments/index.d.ts +210 -0
- package/dist/blocks/attachments/index.js +222 -0
- package/dist/blocks/audit/index.d.ts +366 -0
- package/dist/blocks/audit/index.js +714 -0
- package/dist/blocks/billing/index.d.ts +265 -0
- package/dist/blocks/billing/index.js +400 -0
- package/dist/blocks/comments/index.d.ts +200 -0
- package/dist/blocks/comments/index.js +207 -0
- package/dist/blocks/connectors/index.d.ts +3 -0
- package/dist/blocks/connectors/index.js +164 -0
- package/dist/blocks/data-lifecycle/index.d.ts +251 -0
- package/dist/blocks/data-lifecycle/index.js +353 -0
- package/dist/blocks/entitlements/index.d.ts +14 -0
- package/dist/blocks/entitlements/index.js +25 -0
- package/dist/blocks/flags/index.d.ts +226 -0
- package/dist/blocks/flags/index.js +282 -0
- package/dist/blocks/inbox/index.d.ts +6 -0
- package/dist/blocks/inbox/index.js +499 -0
- package/dist/blocks/inbox/react/index.d.ts +2 -0
- package/dist/blocks/inbox/react/index.js +225 -0
- package/dist/blocks/inbox/react/server.d.ts +10 -0
- package/dist/blocks/inbox/react/server.js +12 -0
- package/dist/blocks/index.d.ts +65 -0
- package/dist/blocks/index.js +77 -0
- package/dist/blocks/jobs/index.d.ts +297 -0
- package/dist/blocks/jobs/index.js +1051 -0
- package/dist/blocks/knowledge/index.d.ts +3 -0
- package/dist/blocks/knowledge/index.js +3 -0
- package/dist/blocks/memory/index.d.ts +8 -0
- package/dist/blocks/memory/index.js +289 -0
- package/dist/blocks/notifications/index.d.ts +297 -0
- package/dist/blocks/notifications/index.js +425 -0
- package/dist/blocks/notifications/react/index.d.ts +44 -0
- package/dist/blocks/notifications/react/index.js +67 -0
- package/dist/blocks/notifications/react/server.d.ts +6 -0
- package/dist/blocks/notifications/react/server.js +7 -0
- package/dist/blocks/onboarding/index.d.ts +3 -0
- package/dist/blocks/onboarding/index.js +64 -0
- package/dist/blocks/onboarding/react/index.d.ts +28 -0
- package/dist/blocks/onboarding/react/index.js +78 -0
- package/dist/blocks/onboarding/react/server.d.ts +7 -0
- package/dist/blocks/onboarding/react/server.js +7 -0
- package/dist/blocks/organizations/index.d.ts +241 -0
- package/dist/blocks/organizations/index.js +400 -0
- package/dist/blocks/outbox/index.d.ts +3 -0
- package/dist/blocks/outbox/index.js +266 -0
- package/dist/blocks/profiles/index.d.ts +40 -0
- package/dist/blocks/profiles/index.js +28 -0
- package/dist/blocks/push/index.d.ts +185 -0
- package/dist/blocks/push/index.js +258 -0
- package/dist/blocks/settings/index.d.ts +89 -0
- package/dist/blocks/settings/index.js +104 -0
- package/dist/blocks/sso/index.d.ts +198 -0
- package/dist/blocks/sso/index.js +1297 -0
- package/dist/blocks/usage/index.d.ts +4 -0
- package/dist/blocks/usage/index.js +233 -0
- package/dist/blocks/waitlist/index.d.ts +117 -0
- package/dist/blocks/waitlist/index.js +132 -0
- package/dist/blocks/webhooks/index.d.ts +304 -0
- package/dist/{webhooks → blocks/webhooks}/index.js +468 -148
- package/dist/blocks/workflow-builder/index.d.ts +21 -0
- package/dist/blocks/workflow-builder/index.js +5 -0
- package/dist/blocks/workflow-builder/react/index.d.ts +47 -0
- package/dist/blocks/workflow-builder/react/index.js +119 -0
- package/dist/blocks/workflow-builder/react/server.d.ts +8 -0
- package/dist/blocks/workflow-builder/react/server.js +11 -0
- package/dist/blocks/workflows/index.d.ts +3 -0
- package/dist/blocks/workflows/index.js +3 -0
- package/dist/blocks/workflows/react/index.d.ts +47 -0
- package/dist/blocks/workflows/react/index.js +137 -0
- package/dist/blocks/workflows/react/server.d.ts +8 -0
- package/dist/blocks/workflows/react/server.js +11 -0
- package/dist/{index-SaTsEfGP.d.ts → bucket-Cl46E3jS.d.ts} +134 -91
- package/dist/{simplify-_0oUKqCd.js → build-BXIzE6Xv.js} +222 -124
- package/dist/{channel-FQW-CnGR.d.ts → channel-_2Mx1Oyu.d.ts} +2 -2
- package/dist/channels-CkgQ_X60.js +114 -0
- package/dist/chat-sdk/index.d.ts +303 -0
- package/dist/chat-sdk/index.js +733 -0
- package/dist/chat-sdk/react/index.d.ts +2 -0
- package/dist/chat-sdk/react/index.js +3 -0
- package/dist/chat-sdk/react/server.d.ts +3 -0
- package/dist/chat-sdk/react/server.js +2 -0
- package/dist/claims-DDBQT6BK.js +61 -0
- package/dist/{claims-BAf6c7is.js → claims-PqzCxaTD.js} +39 -2
- package/dist/cli/bin.js +1 -1
- package/dist/cli/{codemod-DqV7612m.js → codemod-Bl_tQpHn.js} +105 -2
- package/dist/cli/config-B9HkL8nF.js +2 -0
- package/dist/cli/config-DU7EJImt.js +49 -0
- package/dist/cli/config-NiPxAmUF.js +1077 -0
- package/dist/cli/{dist-xn4wlboc.js → dist-DRAVaE6w.js} +111 -1
- package/dist/cli/{doctor-L7Z8mYTx.js → doctor-B4JOm_ox.js} +992 -316
- package/dist/cli/{env-DmKv_G4A.js → env-CJLbUVPB.js} +1 -1
- package/dist/cli/{env-jIFUADLY.js → env-qXgyMV6r.js} +2 -2
- package/dist/cli/fresh-import-BeYf9I3x.js +40 -0
- package/dist/cli/gen-BGLb_zou.js +3100 -0
- package/dist/cli/gen-DAH8FM2W.js +2 -0
- package/dist/cli/index.d.ts +44 -5
- package/dist/cli/index.js +7 -7
- package/dist/cli/{init-Saf5-R9T.js → init-BIIwclPg.js} +242 -27
- package/dist/cli/{introspect--H7oGmcd.js → introspect-DNUTuNvb.js} +5 -5
- package/dist/cli/{io-k41_z-jT.js → io-DI1mTdSA.js} +12 -3
- package/dist/cli/{keys-ByKHnvP9.js → keys-BGCnnb-s.js} +8 -6
- package/dist/cli/{ohash-D7bG_EOb.js → ohash-BjQY1cBb.js} +1 -1
- package/dist/cli/{openapi-Cp5Fyta-.js → openapi-BlRJ18s3.js} +2 -2
- package/dist/cli/{project-B_GeXyHh.js → project-DZRaBaY7.js} +11 -6
- package/dist/cli/read-sets-CETOSFx4.js +223 -0
- package/dist/cli/{run-BKR2W_79.js → run-DNWxHynX.js} +33 -23
- package/dist/cli/{seed-CUlqWh-8.js → seed-DQzqT7LP.js} +8 -6
- package/dist/cli/{skills-LJJIhLFR.js → skills-QQs4q68J.js} +3 -2
- package/dist/cli/sql-D0GUtUPp.js +536 -0
- package/dist/cli/{config-CPVpXP5I.js → supabase-toml-B-bIukQF.js} +72 -942
- package/dist/cli/typegen-version-DeFbtzYI.js +8 -0
- package/dist/cli/{version-BDJuO0UR.js → version-hr88OZG0.js} +1 -1
- package/dist/client/index.d.ts +3 -2
- package/dist/client/index.js +11 -71
- package/dist/client/native/index.d.ts +228 -0
- package/dist/client/native/index.js +361 -0
- package/dist/client-CI0Z2zWX.js +277 -0
- package/dist/cloud-event-BnmD5fb9.js +46 -0
- package/dist/cloud-event-C1JCc1bH.d.ts +50 -0
- package/dist/{compiler-BXH_aZ7N.d.ts → compiler-DY_wkj4R.d.ts} +2 -2
- package/dist/compose-BIBNgAnq.js +53 -0
- package/dist/composite-Bt1YK3Ke.d.ts +146 -0
- package/dist/composite-DhE66P5u.js +130 -0
- package/dist/config/index.d.ts +6 -4
- package/dist/config/index.js +5 -5
- package/dist/{config-T_ejwyd3.d.ts → config-D44Y7PAv.d.ts} +406 -205
- package/dist/{config-DreERlKo.js → config-Dn7F5k9A.js} +62 -14
- package/dist/connector-Dv8kK0MO.d.ts +107 -0
- package/dist/connectors-hkLCwyEz.d.ts +120 -0
- package/dist/context-BCrWe7ow.d.ts +237 -0
- package/dist/credentials/index.d.ts +31 -0
- package/dist/credentials/index.js +168 -0
- package/dist/cron-DVPUg5k3.js +145 -0
- package/dist/csv-CPAzEmB6.js +25 -0
- package/dist/db-exception-CnWcYPxL.js +15 -0
- package/dist/{define-cNKzqwL_.js → define-B-TVjC25.js} +784 -227
- package/dist/{define-Bp_BZa5h.d.ts → define-CJJkkr1-.d.ts} +353 -61
- package/dist/edge/index.d.ts +69 -11
- package/dist/edge/index.js +191 -75
- package/dist/elysia/index.d.ts +59 -0
- package/dist/elysia/index.js +62 -0
- package/dist/embeddings-4ZvFzjsU.js +127 -0
- package/dist/embeddings-C9KGQnXt.d.ts +68 -0
- package/dist/{refresh-BTrQ_ZTp.d.ts → ended-jLfvw8h-.d.ts} +20 -2
- package/dist/{entitlements-DUxU4oHe.d.ts → entitlements-DHrY2UDZ.d.ts} +16 -7
- package/dist/entitlements-DRl6ZJUm.js +24 -0
- package/dist/envelope-DqnYGRw7.js +47 -0
- package/dist/{errors-DtwXa6b8.js → errors-B11Duf73.js} +82 -13
- package/dist/errors-DLjJHPLK.js +44 -0
- package/dist/escape-like-DHfx6jRr.js +7 -0
- package/dist/escape-like-ImTK0ps_.d.ts +15 -0
- package/dist/eve/index.d.ts +220 -0
- package/dist/eve/index.js +504 -0
- package/dist/eve-gT2Fpjut.d.ts +151 -0
- package/dist/events/index.d.ts +4 -3
- package/dist/events/index.js +9 -50
- package/dist/events-DWDhx77e.d.ts +549 -0
- package/dist/executor-Bq28caBo.js +718 -0
- package/dist/executor-C-R4pucm.js +83 -0
- package/dist/executor-CaWigTyR.d.ts +148 -0
- package/dist/executor-D14tGopJ.d.ts +36 -0
- package/dist/{executor-Cghdstwu.d.ts → executor-DbvExCFC.d.ts} +7 -1
- package/dist/{sql-Coh6n4cC.js → executor-De1Of3m3.js} +210 -11
- package/dist/executor-DvsBbNBS.d.ts +261 -0
- package/dist/expo/index.d.ts +79 -0
- package/dist/expo/index.js +129 -0
- package/dist/expo-sqlite/index.d.ts +58 -0
- package/dist/expo-sqlite/index.js +104 -0
- package/dist/field-errors-BFOa7WhB.d.ts +99 -0
- package/dist/field-errors-VF1yb8yI.js +13 -0
- package/dist/framework-CONDyPYx.js +51 -0
- package/dist/framework-DuVb4Xa8.d.ts +25 -0
- package/dist/gateway-C1ssRHnf.d.ts +130 -0
- package/dist/graph-BGyLLFLX.js +265 -0
- package/dist/h3/index.d.ts +59 -0
- package/dist/h3/index.js +55 -0
- package/dist/h3/v1/index.d.ts +63 -0
- package/dist/h3/v1/index.js +49 -0
- package/dist/history-BZih6SFP.js +64 -0
- package/dist/hono/index.d.ts +56 -7
- package/dist/hono/index.js +97 -45
- package/dist/{react-C_s7kiNz.js → hooks-1BTCJsiw.js} +104 -133
- package/dist/http-Cv4T29xh.js +40 -0
- package/dist/http-DdYadv-o.js +126 -0
- package/dist/image-url-pIVlO6R1.js +41 -0
- package/dist/impersonation-DcqaTBHx.js +148 -0
- package/dist/inbox-i7E1ppo6.d.ts +384 -0
- package/dist/index-ACiNPN4Z.d.ts +74 -0
- package/dist/{index-DgILJRXj.d.ts → index-Bepi-Hgg.d.ts} +91 -28
- package/dist/index-BkWT_uBO.d.ts +51 -0
- package/dist/index-BpFYMsi0.d.ts +53 -0
- package/dist/{index-C7f8cOBM.d.ts → index-Bxih3l0u.d.ts} +2 -2
- package/dist/index-CaxrMD1A.d.ts +1 -0
- package/dist/index-ClmjK_o-.d.ts +55 -0
- package/dist/index-CtuakVRc.d.ts +267 -0
- package/dist/index-D48jVS-N.d.ts +246 -0
- package/dist/index-DDrYaUcq.d.ts +138 -0
- package/dist/index-DQh4VCc9.d.ts +98 -0
- package/dist/{live-D9W2M5aO.d.ts → index-DunNRdnT.d.ts} +136 -38
- package/dist/index.d.ts +65 -18
- package/dist/index.js +42 -14
- package/dist/invalidate-BBqhpxyB.d.ts +19 -0
- package/dist/json-CEnpTHlZ.js +16 -0
- package/dist/json-schema-CvER4kgT.js +502 -0
- package/dist/keys-4MnkWTTh.js +35 -0
- package/dist/kit-B5tid-q5.d.ts +60 -0
- package/dist/kit-Fm-Fv7q5.js +78 -0
- package/dist/knowledge-BXBbT0Tr.d.ts +176 -0
- package/dist/knowledge-CDmiMLew.js +255 -0
- package/dist/lint/index.d.ts +1 -1
- package/dist/lint/index.js +37 -0
- package/dist/list/index.d.ts +3 -2
- package/dist/list/index.js +1 -444
- package/dist/{index-fag8VJZ2.d.ts → list-query-BRt-zDF7.d.ts} +20 -12
- package/dist/list-query-gl808ac1.js +459 -0
- package/dist/{live-CdJBOc4f.js → live-CTAZQkwl.js} +99 -14
- package/dist/logger-DWVYUmwi.d.ts +18 -0
- package/dist/mcp/index.d.ts +38 -11
- package/dist/mcp/index.js +82 -46
- package/dist/mcp/sdk/index.d.ts +105 -0
- package/dist/mcp/sdk/index.js +126 -0
- package/dist/message-CaKlqdsX.js +219 -0
- package/dist/message-CfDoR0Y6.d.ts +94 -0
- package/dist/messages-B9-5887d.js +715 -0
- package/dist/messages-DYP0sUTe.d.ts +59 -0
- package/dist/{mfa-CusDgPaD.d.ts → mfa-Daak8ukG.d.ts} +8 -2
- package/dist/modules-DpPwzC7E.d.ts +192 -0
- package/dist/modules-dxrVK3ID.js +228 -0
- package/dist/nestjs/index.d.ts +68 -0
- package/dist/nestjs/index.js +164 -0
- package/dist/next/client/index.d.ts +35 -0
- package/dist/next/client/index.js +36 -0
- package/dist/next/image/index.js +3 -24
- package/dist/next/index.d.ts +150 -51
- package/dist/next/index.js +261 -107
- package/dist/node/index.d.ts +4 -0
- package/dist/node/index.js +210 -0
- package/dist/node-headers-AO06VhqH.d.ts +24 -0
- package/dist/node-headers-C71zNQHe.js +55 -0
- package/dist/nuxt/index.d.ts +60 -0
- package/dist/nuxt/index.js +64 -0
- package/dist/onboarding-BZGHYJks.d.ts +62 -0
- package/dist/openapi/index.d.ts +1 -1
- package/dist/openapi/index.js +3 -3
- package/dist/orpc/index.d.ts +70 -11
- package/dist/orpc/index.js +73 -24
- package/dist/otel/index.d.ts +7 -7
- package/dist/otel/index.js +87 -57
- package/dist/outbox-Cq7pPYvl.d.ts +161 -0
- package/dist/{plugin-o144f322.d.ts → plugin-FGY8UhYm.d.ts} +30 -10
- package/dist/plugin-tfXW1-qO.js +45 -0
- package/dist/plugins/actor/index.d.ts +2 -2
- package/dist/plugins/actor/index.js +3 -3
- package/dist/plugins/rules/index.d.ts +11 -4
- package/dist/plugins/rules/index.js +40 -13
- package/dist/plugins/soft-delete/index.d.ts +5 -4
- package/dist/plugins/soft-delete/index.js +10 -5
- package/dist/plugins/tenant/index.d.ts +2 -2
- package/dist/plugins/tenant/index.js +18 -11
- package/dist/plugins/timestamps/index.d.ts +5 -3
- package/dist/plugins/timestamps/index.js +6 -4
- package/dist/plugins/validation/index.d.ts +2 -2
- package/dist/plugins/validation/index.js +10 -6
- package/dist/{pool-C9voM4Kw.d.ts → pool-CAu2nLrL.d.ts} +2 -2
- package/dist/postgres/index.d.ts +4 -4
- package/dist/postgres/index.js +1 -2
- package/dist/{postgrest-CruYKAvV.d.ts → postgrest-BLVdEnfe.d.ts} +13 -3
- package/dist/powersync/index.d.ts +43 -0
- package/dist/powersync/index.js +199 -0
- package/dist/powersync/react/index.d.ts +87 -0
- package/dist/powersync/react/index.js +108 -0
- package/dist/{problem-BW1KhzSG.js → problem-BreOl8b8.js} +14 -3
- package/dist/{problem-Blxe8S31.d.ts → problem-DD8LZFjc.d.ts} +21 -3
- package/dist/provider-BH5UWZJ6.d.ts +113 -0
- package/dist/provider-Di3sRutW.js +57 -0
- package/dist/query/index.d.ts +4 -2
- package/dist/query/index.js +4 -3
- package/dist/{query-CCbo44lG.js → query-BQ-NaZon.js} +141 -24
- package/dist/{queue-BYUCjr59.d.ts → queue-CLJurhdy.d.ts} +258 -83
- package/dist/react/index.d.ts +11 -7
- package/dist/react/index.js +7 -3
- package/dist/react/native/index.d.ts +116 -0
- package/dist/react/native/index.js +130 -0
- package/dist/react/server.d.ts +28 -10
- package/dist/react/server.js +22 -5
- package/dist/react/session.d.ts +2 -2
- package/dist/react-4ZqkP8da.js +79 -0
- package/dist/react-F80mF4-t.js +409 -0
- package/dist/react-router/index.d.ts +83 -0
- package/dist/react-router/index.js +89 -0
- package/dist/react-topic-seAWjL3_.js +38 -0
- package/dist/{read-set-DQFt1N_Y.js → read-set-DuKWC9Mj.js} +67 -25
- package/dist/realtime/index.d.ts +4 -5
- package/dist/realtime/index.js +144 -82
- package/dist/refusal-CeJWxmkH.js +61 -0
- package/dist/refusal-D1rgbzNq.d.ts +15 -0
- package/dist/replicas-CwrYp5Zj.js +94 -0
- package/dist/{view-Bq64ki8-.js → resolve-D_IcnvFd.js} +239 -289
- package/dist/{resolve-C15TJq77.d.ts → resolve-KW8nCeL6.d.ts} +29 -45
- package/dist/{resource-CRxxwkQq.js → resource-BsvzCMlX.js} +4 -4
- package/dist/{resource-D8iqWMr-.d.ts → resource-D6Uc7Sk7.d.ts} +5 -5
- package/dist/respond-BUgsXNgk.js +91 -0
- package/dist/respond-DoBijysA.d.ts +93 -0
- package/dist/result-D7y2fT87.d.ts +282 -0
- package/dist/{result-BKiliPY7.js → result-DzUbqgdW.js} +27 -2
- package/dist/run-state-CPo-1X2B.d.ts +12 -0
- package/dist/run-state-CgBKzYMW.js +13 -0
- package/dist/search-CUWCRYKL.js +9 -0
- package/dist/server/index.d.ts +143 -21
- package/dist/server/index.js +46 -14
- package/dist/{respond-D2OQl62-.d.ts → server-CeVeeXwz.d.ts} +225 -80
- package/dist/session-ChiXDZdZ.d.ts +72 -0
- package/dist/shared-CBxosKK3.js +75 -0
- package/dist/{shared-D1dRUrAg.js → shared-CxWmcyqB.js} +2 -1
- package/dist/shared-DDSjEGDR.d.ts +11 -0
- package/dist/sign-in-BCV5S2WZ.d.ts +49 -0
- package/dist/sign-in-Cb1mwv6X.js +86 -0
- package/dist/{signers-Cc6r98SW.d.ts → signers-4y62_VIi.d.ts} +13 -9
- package/dist/simplify-DDO0j0LI.js +83 -0
- package/dist/solid/index.d.ts +131 -0
- package/dist/solid/index.js +344 -0
- package/dist/solid-start/index.d.ts +75 -0
- package/dist/solid-start/index.js +58 -0
- package/dist/{spec-pins-C3oc-Tdp.js → spec-pins--j6mTok4.js} +8 -1
- package/dist/{spec-pins-CqorWDnO.d.ts → spec-pins-C89s6DyW.d.ts} +7 -0
- package/dist/sql/index.d.ts +330 -194
- package/dist/sql/index.js +34901 -6489
- package/dist/ssr/index.d.ts +6 -5
- package/dist/ssr/index.js +3 -3
- package/dist/{standard-D7r6dMUu.js → standard-BK0cqJ7y.js} +4 -3
- package/dist/{standard-J4YgMOLm.d.ts → standard-CYsm7xpT.d.ts} +1 -1
- package/dist/stats-D_AD9GGu.js +1123 -0
- package/dist/storage/index.d.ts +5 -5
- package/dist/storage/index.js +1027 -368
- package/dist/store-BdH5ruDx.js +66 -0
- package/dist/store-CGjgWu5n.d.ts +68 -0
- package/dist/streams/index.d.ts +76 -0
- package/dist/streams/index.js +77 -0
- package/dist/streams/redis/index.d.ts +52 -0
- package/dist/streams/redis/index.js +185 -0
- package/dist/stripe-BMj5LtsT.js +38 -0
- package/dist/stripe-D04h-QBT.d.ts +136 -0
- package/dist/{support-Dk6vdmEw.js → support-BivNqSpK.js} +35 -12
- package/dist/{support-view-Da5peKFg.d.ts → support-view-33Oi07TT.d.ts} +1 -1
- package/dist/svelte/index.d.ts +114 -0
- package/dist/svelte/index.js +344 -0
- package/dist/sveltekit/index.d.ts +116 -0
- package/dist/sveltekit/index.js +106 -0
- package/dist/tags-B99_U9Pp.js +39 -0
- package/dist/tags-Cx-LnIQP.d.ts +30 -0
- package/dist/tanstack-db/index.d.ts +71 -0
- package/dist/tanstack-db/index.js +72 -0
- package/dist/tanstack-start/index.d.ts +75 -0
- package/dist/tanstack-start/index.js +95 -0
- package/dist/tee-CoEppCER.js +101 -0
- package/dist/{template-TxrGI5jR.js → template--jDkl3UP.js} +34 -13
- package/dist/template-CwO38Do8.d.ts +6 -0
- package/dist/temporal-BJGitm-h.js +79 -0
- package/dist/{temporal-required-CAt4Dc9Z.js → temporal-required-BVvW7SYJ.js} +3 -2
- package/dist/tenant-I1TEZ_BX.js +27 -0
- package/dist/tenant-icPeuUBN.d.ts +17 -0
- package/dist/testing/index.d.ts +343 -37
- package/dist/testing/index.js +1186 -79
- package/dist/timing-CyTQPubY.js +92 -0
- package/dist/ttl-Hr34gRu8.js +12 -0
- package/dist/{types-Dnf_wRDz.d.ts → types-6BdhkmZe.d.ts} +111 -45
- package/dist/types-BI-0Sl2v.d.ts +359 -0
- package/dist/types-C05bxW-W.d.ts +220 -0
- package/dist/types-DGs5L0VN.d.ts +192 -0
- package/dist/types-TaiEeBGA.d.ts +156 -0
- package/dist/usage-CrvrL2vw.d.ts +177 -0
- package/dist/user-change-XzvgafU4.js +130 -0
- package/dist/vault-CSO7ss5C.d.ts +50 -0
- package/dist/vercel-connect/index.d.ts +47 -0
- package/dist/vercel-connect/index.js +119 -0
- package/dist/{verify-Ce49ETPz.js → verify-DL41hbvY.js} +85 -13
- package/dist/verify-DPuWngD4.d.ts +172 -0
- package/dist/{version-DM_Roffb.js → version-Bvv6aLjZ.js} +1 -1
- package/dist/view-BeFcRV6G.js +99 -0
- package/dist/{view-BEf0diC5.d.ts → view-DbxLNu8L.d.ts} +35 -32
- package/dist/vue/index.d.ts +141 -0
- package/dist/vue/index.js +362 -0
- package/dist/watch-DI34G86j.d.ts +60 -0
- package/dist/watch-Xuxrvxq-.js +122 -0
- package/dist/{wire-D2dT86vi.js → wire-DtZQ4sdE.js} +15 -5
- package/dist/workflow-builder-DJ1oHn8g.js +398 -0
- package/dist/workflow-sdk/builder/index.d.ts +85 -0
- package/dist/workflow-sdk/builder/index.js +250 -0
- package/dist/workflow-sdk/index.d.ts +14 -0
- package/dist/workflow-sdk/index.js +3 -0
- package/dist/workflow-sdk/world/index.d.ts +107 -0
- package/dist/workflow-sdk/world/index.js +702 -0
- package/dist/workflow-sdk-B3yLD6Br.d.ts +98 -0
- package/dist/workflow-sdk-C2WJ_G2O.js +173 -0
- package/dist/workflow-sdk-world-D-prir6O.js +1397 -0
- package/dist/workflows-B0j9WKPu.d.ts +185 -0
- package/dist/workflows-wu1WWBn7.js +216 -0
- package/package.json +470 -29
- package/schemas/ai-message-v1.json +258 -0
- package/schemas/config-v1.json +1074 -140
- package/schemas/doctor-report-v1.json +21 -1
- package/schemas/snapshot-v2.json +8 -0
- package/skills/better-supabase/SKILL.md +41 -12
- package/skills/better-supabase/references/frontend.md +96 -0
- package/skills/better-supabase/references/plugins.md +10 -6
- package/skills/better-supabase/references/troubleshooting.md +2 -1
- package/skills/better-supabase-api/SKILL.md +76 -22
- package/skills/better-supabase-api/references/adapters.md +207 -0
- package/skills/better-supabase-api/references/ai.md +125 -0
- package/skills/better-supabase-api/references/expo.md +65 -0
- package/skills/better-supabase-api/references/powersync.md +35 -0
- package/skills/better-supabase-api/references/streams-credentials.md +105 -0
- package/skills/better-supabase-auth/SKILL.md +62 -18
- package/skills/better-supabase-auth/references/authorization-providers.md +51 -0
- package/skills/better-supabase-testing/SKILL.md +3 -1
- package/dist/cli/config-dtoekM0v.js +0 -2
- package/dist/cli/gen-BJc9vdyu.js +0 -2
- package/dist/cli/gen-C2osRcr5.js +0 -2204
- package/dist/cli/read-sets-BfMQcKy8.js +0 -289
- package/dist/cli/sql-DzPbfngx.js +0 -348
- package/dist/entitlements-CTEBm7IB.js +0 -20
- package/dist/events-aIO7vsIk.d.ts +0 -230
- package/dist/executor-BunPOO-k.d.ts +0 -402
- package/dist/executor-XycESQPH.js +0 -94
- package/dist/impersonation-VfaGc4Q_.js +0 -41
- package/dist/index-BGdgBPdf.d.ts +0 -161
- package/dist/index-DOESKG27.d.ts +0 -100
- package/dist/index-DmXSxbLi.d.ts +0 -62
- package/dist/index-Dxn2a5cw.d.ts +0 -50
- package/dist/jobs/index.d.ts +0 -226
- package/dist/jobs/index.js +0 -1007
- package/dist/json-schema-m1fiwKgN.js +0 -208
- package/dist/kit-events-CTFDfSwb.js +0 -60
- package/dist/kit-transport-B82k1djG.d.ts +0 -33
- package/dist/kits-CGLLrNPd.js +0 -157
- package/dist/notifications/index.d.ts +0 -162
- package/dist/notifications/index.js +0 -264
- package/dist/orgs/index.d.ts +0 -132
- package/dist/orgs/index.js +0 -245
- package/dist/permdock-sql-C2Inc6Xc.d.ts +0 -29
- package/dist/permdock-sql-DgOfeixi.js +0 -51
- package/dist/plugin-DwARMuQp.js +0 -59
- package/dist/server-Csx2sRjg.js +0 -655
- package/dist/stats-Bqob3WqT.js +0 -592
- package/dist/support-DT-OhSxD.d.ts +0 -88
- package/dist/template-mbvlysOo.d.ts +0 -6
- package/dist/temporal-CVlIV2DZ.js +0 -40
- package/dist/user-change-CHFEUro1.js +0 -49
- package/dist/webhooks/index.d.ts +0 -285
- package/skills/better-supabase-auth/references/permdock.md +0 -100
|
@@ -1,12 +1,448 @@
|
|
|
1
|
-
import { c as mapDbError, n as dbError } from "
|
|
2
|
-
import { t as temporal } from "
|
|
3
|
-
import {
|
|
4
|
-
import { i as toBase64 } from "
|
|
5
|
-
import { a as problemResponse } from "
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { n as rpcTransport, r as sqlTransport, t as rawError } from "
|
|
9
|
-
|
|
1
|
+
import { c as mapDbError, n as dbError } from "../../errors-B11Duf73.js";
|
|
2
|
+
import { t as temporal } from "../../temporal-required-BVvW7SYJ.js";
|
|
3
|
+
import { a as ok, r as err, s as toDbError, t as AsyncResult } from "../../result-DzUbqgdW.js";
|
|
4
|
+
import { i as toBase64 } from "../../base64-D2gsioCY.js";
|
|
5
|
+
import { a as problemResponse } from "../../problem-BreOl8b8.js";
|
|
6
|
+
import { t as fromPgError } from "../../executor-De1Of3m3.js";
|
|
7
|
+
import { i as emitBlockEvent } from "../../block-events-CrT8r7Fe.js";
|
|
8
|
+
import { n as rpcTransport, r as sqlTransport, t as rawError } from "../../block-transport-BLr-ZgLc.js";
|
|
9
|
+
import { c as errorText, d as isRecord, h as optionalText, k as toInstant, n as applyTemporal, v as readBodyCapped } from "../../block-helpers-DWHxHsEQ.js";
|
|
10
|
+
import { a as signStripeWebhook, c as timingSafeEqual, d as verifyWebhook, i as isDatabaseWebhook, l as verifySharedSecret, n as databaseChange, o as signWebhook, r as hookError, s as stripeInboxVerify, t as authHook, u as verifyStripeWebhook } from "../../verify-DL41hbvY.js";
|
|
11
|
+
//#region src/blocks/webhooks/incoming.ts
|
|
12
|
+
/** The header that carries an endpoint's id on stored deliveries. */
|
|
13
|
+
const INCOMING_ENDPOINT_HEADER = "x-bs-endpoint-id";
|
|
14
|
+
const IDENT = /^[a-z_][a-z0-9_]*$/;
|
|
15
|
+
const VERIFY_MODES = [
|
|
16
|
+
"none",
|
|
17
|
+
"standard-webhooks",
|
|
18
|
+
"hmac-sha256",
|
|
19
|
+
"shared-secret"
|
|
20
|
+
];
|
|
21
|
+
function verifyOf(value) {
|
|
22
|
+
const mode = VERIFY_MODES.find((entry) => entry === value);
|
|
23
|
+
if (mode === void 0) throw new TypeError(`Unknown verification mode ${String(value)}`);
|
|
24
|
+
return mode;
|
|
25
|
+
}
|
|
26
|
+
const encoder$1 = /* @__PURE__ */ new TextEncoder();
|
|
27
|
+
async function hmacHex(secret, body) {
|
|
28
|
+
const key = await crypto.subtle.importKey("raw", encoder$1.encode(secret), {
|
|
29
|
+
name: "HMAC",
|
|
30
|
+
hash: "SHA-256"
|
|
31
|
+
}, false, ["sign"]);
|
|
32
|
+
const mac = new Uint8Array(await crypto.subtle.sign("HMAC", key, encoder$1.encode(body)));
|
|
33
|
+
return Array.from(mac, (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
34
|
+
}
|
|
35
|
+
function asDbError(cause) {
|
|
36
|
+
const raw = fromPgError(cause);
|
|
37
|
+
return raw ? mapDbError(raw) : toDbError(cause);
|
|
38
|
+
}
|
|
39
|
+
const attempt = (fn) => AsyncResult.from(async () => {
|
|
40
|
+
try {
|
|
41
|
+
return ok(await fn());
|
|
42
|
+
} catch (cause) {
|
|
43
|
+
return err(asDbError(cause));
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
/**
|
|
47
|
+
* Tenant-owned trigger URLs over the `webhooks-in` SQL module: create
|
|
48
|
+
* endpoints, then route `/hooks/<token>` to `receive`. Deliveries land in
|
|
49
|
+
* the webhook inbox (`createWebhookInbox`), where a worker processes them.
|
|
50
|
+
*/
|
|
51
|
+
function createIncomingWebhooks(sql, options = {}) {
|
|
52
|
+
applyTemporal(options);
|
|
53
|
+
const schema = options.schema ?? "better_supabase";
|
|
54
|
+
if (!IDENT.test(schema)) throw new TypeError(`createIncomingWebhooks: "${schema}" is not a schema name`);
|
|
55
|
+
const source = options.source ?? "webhook-in";
|
|
56
|
+
const fn = (name) => `"${schema}"."${name}"`;
|
|
57
|
+
const value = async (text, params) => {
|
|
58
|
+
const [row] = await sql.queryRaw(text, params);
|
|
59
|
+
return row.value;
|
|
60
|
+
};
|
|
61
|
+
return {
|
|
62
|
+
async receive(request, token) {
|
|
63
|
+
const instance = new URL(request.url).pathname;
|
|
64
|
+
if (request.method !== "POST") return new Response(null, {
|
|
65
|
+
status: 405,
|
|
66
|
+
headers: { allow: "POST" }
|
|
67
|
+
});
|
|
68
|
+
const problem = (error, endpoint) => (endpoint === void 0 ? Promise.resolve() : sql.queryRaw(`select ${fn("record_incoming_webhook")}($1, $2)`, [endpoint, error.status]).then(() => void 0)).then(() => problemResponse(error, {
|
|
69
|
+
instance,
|
|
70
|
+
format: options.problem
|
|
71
|
+
}));
|
|
72
|
+
try {
|
|
73
|
+
const [endpoint] = await sql.queryRaw(`select * from ${fn("incoming_webhook_by_token")}($1)`, [token]);
|
|
74
|
+
if (!endpoint?.enabled) return await problem(dbError("not_found", "No such webhook endpoint"));
|
|
75
|
+
const body = await readBodyCapped(request, endpoint.max_body_bytes);
|
|
76
|
+
if (body === void 0) return await problem({
|
|
77
|
+
...dbError("invalid_input", "The body is too large", { code: "WEBHOOK_TOO_LARGE" }),
|
|
78
|
+
status: 413
|
|
79
|
+
}, endpoint.id);
|
|
80
|
+
if (options.rateLimit) {
|
|
81
|
+
const [hit] = await sql.queryRaw("select * from better_supabase.hit_rate_limit($1, $2, $3, $4::interval)", [
|
|
82
|
+
`${source}:endpoint`,
|
|
83
|
+
endpoint.id,
|
|
84
|
+
options.rateLimit.max,
|
|
85
|
+
typeof options.rateLimit.period === "number" ? `${String(options.rateLimit.period)} seconds` : options.rateLimit.period
|
|
86
|
+
]);
|
|
87
|
+
if (hit && !hit.allowed) return await problem(dbError("rate_limited", "Too many deliveries", { retryAfter: Math.max(1, hit.retry_after) }), endpoint.id);
|
|
88
|
+
}
|
|
89
|
+
let messageId = request.headers.get("webhook-id") ?? request.headers.get("svix-id") ?? crypto.randomUUID();
|
|
90
|
+
if (endpoint.verify === "standard-webhooks") {
|
|
91
|
+
let verified = await verifyWebhook({
|
|
92
|
+
headers: request.headers,
|
|
93
|
+
body
|
|
94
|
+
}, endpoint.secret ?? "");
|
|
95
|
+
if (!verified.ok && endpoint.previous_secret) {
|
|
96
|
+
const previous = await verifyWebhook({
|
|
97
|
+
headers: request.headers,
|
|
98
|
+
body
|
|
99
|
+
}, endpoint.previous_secret);
|
|
100
|
+
if (previous.ok) verified = previous;
|
|
101
|
+
}
|
|
102
|
+
if (!verified.ok) return await problem(verified.error, endpoint.id);
|
|
103
|
+
messageId = verified.data.id;
|
|
104
|
+
} else if (endpoint.verify === "shared-secret") {
|
|
105
|
+
const given = request.headers.get(endpoint.signature_header ?? "x-webhook-secret") ?? "";
|
|
106
|
+
const matches = endpoint.secret !== null && timingSafeEqual(given, endpoint.secret) || endpoint.previous_secret !== null && endpoint.previous_secret !== void 0 && timingSafeEqual(given, endpoint.previous_secret);
|
|
107
|
+
if (given === "" || !matches) return await problem(dbError("unauthorized", "Invalid webhook secret", { code: "WEBHOOK_INVALID_SIGNATURE" }), endpoint.id);
|
|
108
|
+
} else if (endpoint.verify === "hmac-sha256") {
|
|
109
|
+
const signature = (request.headers.get(endpoint.signature_header ?? "x-signature") ?? "").replace(/^sha256=/, "");
|
|
110
|
+
let expected = await hmacHex(endpoint.secret ?? "", body);
|
|
111
|
+
if (!timingSafeEqual(signature, expected) && endpoint.previous_secret) {
|
|
112
|
+
const previous = await hmacHex(endpoint.previous_secret, body);
|
|
113
|
+
if (timingSafeEqual(signature, previous)) expected = previous;
|
|
114
|
+
}
|
|
115
|
+
if (!timingSafeEqual(signature, expected)) return await problem(dbError("unauthorized", "Invalid webhook signature", { code: "WEBHOOK_INVALID_SIGNATURE" }), endpoint.id);
|
|
116
|
+
messageId = `hmac:${expected}`;
|
|
117
|
+
}
|
|
118
|
+
let payload = body;
|
|
119
|
+
try {
|
|
120
|
+
payload = body === "" ? {} : JSON.parse(body);
|
|
121
|
+
} catch {
|
|
122
|
+
payload = { body };
|
|
123
|
+
}
|
|
124
|
+
const secretHeader = endpoint.verify === "shared-secret" ? (endpoint.signature_header ?? "x-webhook-secret").toLowerCase() : void 0;
|
|
125
|
+
const kept = (options.keepHeaders ?? []).flatMap((name) => {
|
|
126
|
+
if (name.toLowerCase() === secretHeader) return [];
|
|
127
|
+
const header = request.headers.get(name);
|
|
128
|
+
return header === null ? [] : [[name.toLowerCase(), header]];
|
|
129
|
+
});
|
|
130
|
+
const headers = Object.fromEntries([...kept, [INCOMING_ENDPOINT_HEADER, endpoint.id]]);
|
|
131
|
+
const [stored] = await sql.queryRaw("select * from better_supabase.receive_webhook($1, $2, $3, $4, $5, $6)", [
|
|
132
|
+
source,
|
|
133
|
+
`${endpoint.id}:${messageId}`,
|
|
134
|
+
typeof payload === "object" && payload !== null && "type" in payload && typeof payload.type === "string" ? payload.type : null,
|
|
135
|
+
JSON.stringify(payload),
|
|
136
|
+
JSON.stringify(headers),
|
|
137
|
+
endpoint.tenant
|
|
138
|
+
]);
|
|
139
|
+
const status = stored?.duplicate ? 200 : 202;
|
|
140
|
+
await sql.queryRaw(`select ${fn("record_incoming_webhook")}($1, $2)`, [endpoint.id, status]);
|
|
141
|
+
return Response.json({
|
|
142
|
+
id: Number(stored?.id),
|
|
143
|
+
duplicate: stored?.duplicate ?? false
|
|
144
|
+
}, { status });
|
|
145
|
+
} catch (cause) {
|
|
146
|
+
return problemResponse(asDbError(cause), {
|
|
147
|
+
instance,
|
|
148
|
+
format: options.problem
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
create: (input) => attempt(async () => {
|
|
153
|
+
const created = await value(`select ${fn("create_incoming_webhook")}($1, $2, $3, $4, $5, $6, $7) as value`, [
|
|
154
|
+
input.tenant,
|
|
155
|
+
input.name,
|
|
156
|
+
input.verify ?? "none",
|
|
157
|
+
JSON.stringify(input.metadata ?? {}),
|
|
158
|
+
input.signatureHeader ?? null,
|
|
159
|
+
input.subject?.type ?? null,
|
|
160
|
+
input.subject?.id ?? null
|
|
161
|
+
]);
|
|
162
|
+
const { subjectType, subjectId, ...rest } = created;
|
|
163
|
+
return {
|
|
164
|
+
...rest,
|
|
165
|
+
tenant: String(created.tenant),
|
|
166
|
+
subject: subjectType && subjectId ? {
|
|
167
|
+
type: subjectType,
|
|
168
|
+
id: subjectId
|
|
169
|
+
} : null
|
|
170
|
+
};
|
|
171
|
+
}),
|
|
172
|
+
list: (tenant, subject) => attempt(async () => {
|
|
173
|
+
return (await value(`select ${fn("list_incoming_webhooks")}($1, $2, $3) as value`, [
|
|
174
|
+
tenant,
|
|
175
|
+
subject?.type ?? null,
|
|
176
|
+
subject?.id ?? null
|
|
177
|
+
])).map((row) => ({
|
|
178
|
+
id: String(row["id"]),
|
|
179
|
+
tenant: String(row["tenant"]),
|
|
180
|
+
name: String(row["name"]),
|
|
181
|
+
verify: row["verify"],
|
|
182
|
+
signatureHeader: optionalText(row["signature_header"]) ?? null,
|
|
183
|
+
enabled: row["enabled"] === true,
|
|
184
|
+
maxBodyBytes: Number(row["max_body_bytes"]),
|
|
185
|
+
receiveCount: Number(row["receive_count"]),
|
|
186
|
+
lastReceivedAt: optionalText(row["last_received_at"]) ?? null,
|
|
187
|
+
lastStatus: row["last_status"] === null ? null : Number(row["last_status"]),
|
|
188
|
+
metadata: isRecord(row["metadata"]) ? row["metadata"] : {},
|
|
189
|
+
subject: typeof row["subject_type"] === "string" && typeof row["subject_id"] === "string" ? {
|
|
190
|
+
type: row["subject_type"],
|
|
191
|
+
id: row["subject_id"]
|
|
192
|
+
} : null,
|
|
193
|
+
createdBy: optionalText(row["created_by"]) ?? null,
|
|
194
|
+
createdAt: String(row["created_at"])
|
|
195
|
+
}));
|
|
196
|
+
}),
|
|
197
|
+
rotate: (id, rotateOptions = {}) => attempt(async () => {
|
|
198
|
+
const rotated = await value(`select ${fn("rotate_incoming_webhook")}($1, $2) as value`, [id, rotateOptions.rotateSecret ?? false]);
|
|
199
|
+
return {
|
|
200
|
+
token: rotated.token,
|
|
201
|
+
secret: rotated.secret
|
|
202
|
+
};
|
|
203
|
+
}),
|
|
204
|
+
rotateSecret: (id, rotateOptions = {}) => attempt(async () => {
|
|
205
|
+
const rotated = await value(`select ${fn("rotate_incoming_webhook_secret")}($1, $2::interval) as value`, [id, rotateOptions.grace === void 0 ? null : String(rotateOptions.grace)]);
|
|
206
|
+
const expires = optionalText(rotated["previousSecretExpiresAt"]);
|
|
207
|
+
return {
|
|
208
|
+
secret: String(rotated["secret"]),
|
|
209
|
+
previousSecretExpiresAt: expires === void 0 ? null : toInstant(expires)
|
|
210
|
+
};
|
|
211
|
+
}),
|
|
212
|
+
update: (id, input) => attempt(async () => {
|
|
213
|
+
const updated = await value(`select ${fn("update_incoming_webhook")}($1, $2, $3, $4, $5) as value`, [
|
|
214
|
+
id,
|
|
215
|
+
input.name ?? null,
|
|
216
|
+
input.metadata === void 0 ? null : JSON.stringify(input.metadata),
|
|
217
|
+
input.verify ?? null,
|
|
218
|
+
input.signatureHeader ?? null
|
|
219
|
+
]);
|
|
220
|
+
return {
|
|
221
|
+
id: String(updated["id"]),
|
|
222
|
+
tenant: String(updated["tenant"]),
|
|
223
|
+
name: String(updated["name"]),
|
|
224
|
+
verify: verifyOf(updated["verify"]),
|
|
225
|
+
secret: optionalText(updated["secret"]) ?? null,
|
|
226
|
+
signatureHeader: optionalText(updated["signatureHeader"]) ?? null,
|
|
227
|
+
metadata: isRecord(updated["metadata"]) ? updated["metadata"] : {}
|
|
228
|
+
};
|
|
229
|
+
}),
|
|
230
|
+
setEnabled: (id, enabled) => attempt(() => value(`select ${fn("set_incoming_webhook_enabled")}($1, $2) as value`, [id, enabled])),
|
|
231
|
+
remove: (id) => attempt(() => value(`select ${fn("delete_incoming_webhook")}($1) as value`, [id]))
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
//#endregion
|
|
235
|
+
//#region src/blocks/webhooks/url-policy.ts
|
|
236
|
+
const PRIVATE_V4 = [
|
|
237
|
+
[0, 8],
|
|
238
|
+
[167772160, 8],
|
|
239
|
+
[1681915904, 10],
|
|
240
|
+
[2130706432, 8],
|
|
241
|
+
[2851995648, 16],
|
|
242
|
+
[2886729728, 12],
|
|
243
|
+
[3221225472, 24],
|
|
244
|
+
[3221225984, 24],
|
|
245
|
+
[3232235520, 16],
|
|
246
|
+
[3323068416, 15],
|
|
247
|
+
[3325256704, 24],
|
|
248
|
+
[3405803776, 24],
|
|
249
|
+
[3758096384, 4],
|
|
250
|
+
[4026531840, 4]
|
|
251
|
+
];
|
|
252
|
+
function v4(address) {
|
|
253
|
+
const parts = address.split(".");
|
|
254
|
+
if (parts.length !== 4) return void 0;
|
|
255
|
+
let value = 0;
|
|
256
|
+
for (const part of parts) {
|
|
257
|
+
if (!/^\d{1,3}$/.test(part)) return void 0;
|
|
258
|
+
const octet = Number(part);
|
|
259
|
+
if (octet > 255) return void 0;
|
|
260
|
+
value = value * 256 + octet;
|
|
261
|
+
}
|
|
262
|
+
return value;
|
|
263
|
+
}
|
|
264
|
+
const publicV4 = (value) => !PRIVATE_V4.some(([base, bits]) => Math.floor(value / 2 ** (32 - bits)) === Math.floor(base / 2 ** (32 - bits)));
|
|
265
|
+
function v6(address) {
|
|
266
|
+
let text = address.toLowerCase();
|
|
267
|
+
const zone = text.indexOf("%");
|
|
268
|
+
if (zone !== -1) text = text.slice(0, zone);
|
|
269
|
+
if (text.includes(".")) {
|
|
270
|
+
const colon = text.lastIndexOf(":");
|
|
271
|
+
const embedded = v4(text.slice(colon + 1));
|
|
272
|
+
if (embedded === void 0) return void 0;
|
|
273
|
+
const high = Math.floor(embedded / 65536).toString(16);
|
|
274
|
+
const low = (embedded % 65536).toString(16);
|
|
275
|
+
text = `${text.slice(0, colon + 1)}${high}:${low}`;
|
|
276
|
+
}
|
|
277
|
+
const halves = text.split("::");
|
|
278
|
+
if (halves.length > 2) return void 0;
|
|
279
|
+
const groups = (part) => part === "" ? [] : part.split(":");
|
|
280
|
+
const head = groups(halves[0]);
|
|
281
|
+
const rest = halves.length === 2 ? groups(halves[1]) : [];
|
|
282
|
+
if (![...head, ...rest].every((group) => /^[0-9a-f]{1,4}$/.test(group))) return void 0;
|
|
283
|
+
const known = head.length + rest.length;
|
|
284
|
+
if (halves.length === 1 ? known !== 8 : known > 7) return void 0;
|
|
285
|
+
return [
|
|
286
|
+
...head,
|
|
287
|
+
...Array.from({ length: 8 - known }, () => "0"),
|
|
288
|
+
...rest
|
|
289
|
+
].map((group) => Number.parseInt(group, 16));
|
|
290
|
+
}
|
|
291
|
+
function publicV6(groups) {
|
|
292
|
+
const [first = 0] = groups;
|
|
293
|
+
const zeros = (from, to) => groups.slice(from, to).every((group) => group === 0);
|
|
294
|
+
const embedded = groups[6] * 65536 + groups[7];
|
|
295
|
+
if (zeros(0, 8)) return false;
|
|
296
|
+
if (zeros(0, 7) && groups[7] === 1) return false;
|
|
297
|
+
if (zeros(0, 5) && groups[5] === 65535) return publicV4(embedded);
|
|
298
|
+
if (first === 100 && groups[1] === 65435 && zeros(2, 6)) return publicV4(embedded);
|
|
299
|
+
if (zeros(0, 6)) return false;
|
|
300
|
+
if (first === 100 && groups[1] === 65435 && groups[2] === 1) return false;
|
|
301
|
+
if (first === 8194) return publicV4(groups[1] * 65536 + groups[2]);
|
|
302
|
+
if (first === 8193 && groups[1] === 0) return false;
|
|
303
|
+
if ((first & 65024) === 64512) return false;
|
|
304
|
+
if ((first & 65472) === 65152) return false;
|
|
305
|
+
if ((first & 65472) === 65216) return false;
|
|
306
|
+
if ((first & 65280) === 65280) return false;
|
|
307
|
+
if (first === 8193 && groups[1] === 3512) return false;
|
|
308
|
+
if (first === 256 && zeros(1, 4)) return false;
|
|
309
|
+
return true;
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Whether an IP address is reachable on the public internet: not loopback,
|
|
313
|
+
* private, link-local (cloud metadata), carrier-grade NAT, multicast or
|
|
314
|
+
* reserved. Returns `false` for anything that isn't an IP address.
|
|
315
|
+
*/
|
|
316
|
+
function isPublicAddress(address) {
|
|
317
|
+
const ipv4 = v4(address);
|
|
318
|
+
if (ipv4 !== void 0) return publicV4(ipv4);
|
|
319
|
+
const ipv6 = v6(address.replaceAll(/^\[|\]$/g, ""));
|
|
320
|
+
return ipv6 !== void 0 && publicV6(ipv6);
|
|
321
|
+
}
|
|
322
|
+
const isAddress = (host) => v4(host) !== void 0 || v6(host) !== void 0;
|
|
323
|
+
const LOCAL_HOST = /(^|\.)(localhost|local|internal|home\.arpa)$/;
|
|
324
|
+
/** `node:dns` without importing it, so this entry stays runtime-neutral. */
|
|
325
|
+
function builtinResolver() {
|
|
326
|
+
const dns = globalThis.process?.getBuiltinModule?.("node:dns");
|
|
327
|
+
if (typeof dns !== "object" || dns === null || !("promises" in dns)) return void 0;
|
|
328
|
+
const { promises } = dns;
|
|
329
|
+
return async (hostname) => (await promises.lookup(hostname, {
|
|
330
|
+
all: true,
|
|
331
|
+
verbatim: true
|
|
332
|
+
})).map((entry) => entry.address);
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* The default `allowUrl`: HTTPS only, no credentials in the URL, no local
|
|
336
|
+
* host names, and every address the host resolves to must be public. The
|
|
337
|
+
* delivery transport calls it again for each redirect.
|
|
338
|
+
*
|
|
339
|
+
* DNS can change between this check and the connection. Route webhooks
|
|
340
|
+
* through an egress proxy when that matters.
|
|
341
|
+
*/
|
|
342
|
+
function publicUrl(options = {}) {
|
|
343
|
+
const resolve = options.resolve === false ? void 0 : options.resolve ?? builtinResolver();
|
|
344
|
+
if (options.resolve === void 0 && !resolve) throw new TypeError("publicUrl() needs a resolve option on runtimes without node:dns, or resolve: false to skip the DNS check");
|
|
345
|
+
const trusted = new Set(options.allowHosts?.map((host) => host.toLowerCase()));
|
|
346
|
+
return async (url) => {
|
|
347
|
+
const host = url.hostname.toLowerCase().replaceAll(/^\[|\]$/g, "");
|
|
348
|
+
if (trusted.has(host)) return true;
|
|
349
|
+
if (url.protocol !== "https:" && !(options.allowHttp && url.protocol === "http:")) return false;
|
|
350
|
+
if (url.username || url.password) return false;
|
|
351
|
+
if (isAddress(host)) return isPublicAddress(host);
|
|
352
|
+
if (LOCAL_HOST.test(host) || !host.includes(".")) return false;
|
|
353
|
+
if (!resolve) return true;
|
|
354
|
+
const addresses = await resolve(host);
|
|
355
|
+
return addresses.length > 0 && addresses.every(isPublicAddress);
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
//#endregion
|
|
359
|
+
//#region src/blocks/webhooks/safe-fetch.ts
|
|
360
|
+
/** A request `safeFetch` refused: a URL outside the policy or too many redirects. */
|
|
361
|
+
var UnsafeUrlError = class extends Error {
|
|
362
|
+
name = "UnsafeUrlError";
|
|
363
|
+
};
|
|
364
|
+
var UrlCheckError = class extends Error {
|
|
365
|
+
name = "UrlCheckError";
|
|
366
|
+
};
|
|
367
|
+
const REDIRECTS$1 = /* @__PURE__ */ new Set([
|
|
368
|
+
301,
|
|
369
|
+
302,
|
|
370
|
+
303,
|
|
371
|
+
307,
|
|
372
|
+
308
|
|
373
|
+
]);
|
|
374
|
+
/**
|
|
375
|
+
* Whether a redirect keeps the method and body, as fetch does: 307 and 308
|
|
376
|
+
* always, 301 and 302 except for POST, 303 only for HEAD.
|
|
377
|
+
*/
|
|
378
|
+
const keepsMethod = (status, method) => status === 307 || status === 308 || (status === 301 || status === 302) && method !== "POST" || status === 303 && method === "HEAD";
|
|
379
|
+
/** Headers a redirect to another origin drops, as fetch does. */
|
|
380
|
+
const CREDENTIALS = [
|
|
381
|
+
"authorization",
|
|
382
|
+
"cookie",
|
|
383
|
+
"proxy-authorization"
|
|
384
|
+
];
|
|
385
|
+
/**
|
|
386
|
+
* A `fetch` for URLs that users or tenants supply (link previews, imports,
|
|
387
|
+
* avatars by URL, callback URLs): it refuses private, loopback and
|
|
388
|
+
* link-local addresses, non-HTTPS URLs and credentials in the URL, checks
|
|
389
|
+
* every redirect against the same policy before following it, and stops
|
|
390
|
+
* after `timeoutMs`. It throws `UnsafeUrlError` for a refused URL and
|
|
391
|
+
* `UrlCheckError` when the check itself failed (a DNS lookup error). A redirect
|
|
392
|
+
* to another origin drops the credential headers and `sensitiveHeaders`.
|
|
393
|
+
*
|
|
394
|
+
* DNS can change between the check and the connection; route the requests
|
|
395
|
+
* through an egress proxy when that matters.
|
|
396
|
+
*/
|
|
397
|
+
function createSafeFetch(options = {}) {
|
|
398
|
+
const send = options.fetch ?? globalThis.fetch;
|
|
399
|
+
const allowUrl = options.allowUrl ?? publicUrl(options);
|
|
400
|
+
const maxRedirects = options.maxRedirects ?? 3;
|
|
401
|
+
const timeoutMs = options.timeoutMs ?? 1e4;
|
|
402
|
+
const sensitive = [...CREDENTIALS, ...options.sensitiveHeaders ?? []];
|
|
403
|
+
const check = async (url) => {
|
|
404
|
+
let ok;
|
|
405
|
+
try {
|
|
406
|
+
ok = await allowUrl(url);
|
|
407
|
+
} catch (error) {
|
|
408
|
+
throw new UrlCheckError(`Could not check URL: ${url.host}`, { cause: error });
|
|
409
|
+
}
|
|
410
|
+
if (!ok) throw new UnsafeUrlError(`URL is not allowed: ${url.host}`);
|
|
411
|
+
};
|
|
412
|
+
return async (input, init) => {
|
|
413
|
+
await check(new URL(input instanceof Request ? input.url : String(input)));
|
|
414
|
+
const request = new Request(input, init);
|
|
415
|
+
const timeout = AbortSignal.timeout(timeoutMs);
|
|
416
|
+
const signal = AbortSignal.any([request.signal, timeout]);
|
|
417
|
+
let url = new URL(request.url);
|
|
418
|
+
let method = request.method;
|
|
419
|
+
const headers = new Headers(request.headers);
|
|
420
|
+
let body = method === "GET" || method === "HEAD" ? void 0 : await request.arrayBuffer();
|
|
421
|
+
for (let hop = 0;; hop++) {
|
|
422
|
+
if (hop > 0) await check(url);
|
|
423
|
+
const response = await send(url, {
|
|
424
|
+
method,
|
|
425
|
+
headers,
|
|
426
|
+
...body === void 0 ? {} : { body },
|
|
427
|
+
redirect: "manual",
|
|
428
|
+
signal
|
|
429
|
+
});
|
|
430
|
+
if (!REDIRECTS$1.has(response.status)) return response;
|
|
431
|
+
await response.body?.cancel();
|
|
432
|
+
const location = response.headers.get("location");
|
|
433
|
+
if (!location || hop >= maxRedirects) throw new UnsafeUrlError(location ? `More than ${String(maxRedirects)} redirects` : `Redirect ${String(response.status)} without a location`);
|
|
434
|
+
if (!keepsMethod(response.status, method)) {
|
|
435
|
+
method = "GET";
|
|
436
|
+
body = void 0;
|
|
437
|
+
}
|
|
438
|
+
const next = new URL(location, url);
|
|
439
|
+
if (next.origin !== url.origin) for (const name of sensitive) headers.delete(name);
|
|
440
|
+
url = next;
|
|
441
|
+
}
|
|
442
|
+
};
|
|
443
|
+
}
|
|
444
|
+
//#endregion
|
|
445
|
+
//#region src/blocks/webhooks/http.ts
|
|
10
446
|
/** A delivery that must not be retried, e.g. a URL `allowUrl` rejected. */
|
|
11
447
|
var WebhookPolicyError = class extends Error {
|
|
12
448
|
name = "WebhookPolicyError";
|
|
@@ -47,11 +483,15 @@ async function readCapped(response, limit) {
|
|
|
47
483
|
await reader.cancel().catch(() => void 0);
|
|
48
484
|
}
|
|
49
485
|
}
|
|
486
|
+
/**
|
|
487
|
+
* A check that threw (a DNS lookup that timed out) is not a refusal: it
|
|
488
|
+
* throws `UrlCheckError`, which the delivery retries.
|
|
489
|
+
*/
|
|
50
490
|
async function allowed(allowUrl, url) {
|
|
51
491
|
try {
|
|
52
492
|
return await allowUrl(url);
|
|
53
|
-
} catch {
|
|
54
|
-
|
|
493
|
+
} catch (cause) {
|
|
494
|
+
throw new UrlCheckError(`Could not check endpoint URL: ${url.host}`, { cause });
|
|
55
495
|
}
|
|
56
496
|
}
|
|
57
497
|
/** Sends webhooks with `fetch`, following redirects only to allowed URLs. */
|
|
@@ -94,8 +534,8 @@ function fetchTransport(options = {}) {
|
|
|
94
534
|
};
|
|
95
535
|
}
|
|
96
536
|
//#endregion
|
|
97
|
-
//#region src/webhooks/secrets.ts
|
|
98
|
-
/** The
|
|
537
|
+
//#region src/blocks/webhooks/secrets.ts
|
|
538
|
+
/** The module's `webhook_secrets` and `rotate_webhook_secret` functions. */
|
|
99
539
|
function sqlSecretStore(transport, options = {}) {
|
|
100
540
|
const schema = options.schema ?? "better_supabase";
|
|
101
541
|
return {
|
|
@@ -115,7 +555,7 @@ function sqlSecretStore(transport, options = {}) {
|
|
|
115
555
|
};
|
|
116
556
|
}
|
|
117
557
|
//#endregion
|
|
118
|
-
//#region src/webhooks/signers.ts
|
|
558
|
+
//#region src/blocks/webhooks/signers.ts
|
|
119
559
|
function needSecrets(secrets) {
|
|
120
560
|
if (secrets.length === 0) throw new TypeError("The endpoint has no signing secret");
|
|
121
561
|
}
|
|
@@ -186,133 +626,7 @@ function hmacSigner(options) {
|
|
|
186
626
|
};
|
|
187
627
|
}
|
|
188
628
|
//#endregion
|
|
189
|
-
//#region src/webhooks/
|
|
190
|
-
const PRIVATE_V4 = [
|
|
191
|
-
[0, 8],
|
|
192
|
-
[167772160, 8],
|
|
193
|
-
[1681915904, 10],
|
|
194
|
-
[2130706432, 8],
|
|
195
|
-
[2851995648, 16],
|
|
196
|
-
[2886729728, 12],
|
|
197
|
-
[3221225472, 24],
|
|
198
|
-
[3221225984, 24],
|
|
199
|
-
[3232235520, 16],
|
|
200
|
-
[3323068416, 15],
|
|
201
|
-
[3325256704, 24],
|
|
202
|
-
[3405803776, 24],
|
|
203
|
-
[3758096384, 4],
|
|
204
|
-
[4026531840, 4]
|
|
205
|
-
];
|
|
206
|
-
function v4(address) {
|
|
207
|
-
const parts = address.split(".");
|
|
208
|
-
if (parts.length !== 4) return void 0;
|
|
209
|
-
let value = 0;
|
|
210
|
-
for (const part of parts) {
|
|
211
|
-
if (!/^\d{1,3}$/.test(part)) return void 0;
|
|
212
|
-
const octet = Number(part);
|
|
213
|
-
if (octet > 255) return void 0;
|
|
214
|
-
value = value * 256 + octet;
|
|
215
|
-
}
|
|
216
|
-
return value;
|
|
217
|
-
}
|
|
218
|
-
const publicV4 = (value) => !PRIVATE_V4.some(([base, bits]) => Math.floor(value / 2 ** (32 - bits)) === Math.floor(base / 2 ** (32 - bits)));
|
|
219
|
-
function v6(address) {
|
|
220
|
-
let text = address.toLowerCase();
|
|
221
|
-
const zone = text.indexOf("%");
|
|
222
|
-
if (zone !== -1) text = text.slice(0, zone);
|
|
223
|
-
if (text.includes(".")) {
|
|
224
|
-
const colon = text.lastIndexOf(":");
|
|
225
|
-
const embedded = v4(text.slice(colon + 1));
|
|
226
|
-
if (embedded === void 0) return void 0;
|
|
227
|
-
const high = Math.floor(embedded / 65536).toString(16);
|
|
228
|
-
const low = (embedded % 65536).toString(16);
|
|
229
|
-
text = `${text.slice(0, colon + 1)}${high}:${low}`;
|
|
230
|
-
}
|
|
231
|
-
const halves = text.split("::");
|
|
232
|
-
if (halves.length > 2) return void 0;
|
|
233
|
-
const groups = (part) => part === "" ? [] : part.split(":");
|
|
234
|
-
const head = groups(halves[0]);
|
|
235
|
-
const rest = halves.length === 2 ? groups(halves[1]) : [];
|
|
236
|
-
if (![...head, ...rest].every((group) => /^[0-9a-f]{1,4}$/.test(group))) return void 0;
|
|
237
|
-
const known = head.length + rest.length;
|
|
238
|
-
if (halves.length === 1 ? known !== 8 : known > 7) return void 0;
|
|
239
|
-
return [
|
|
240
|
-
...head,
|
|
241
|
-
...Array.from({ length: 8 - known }, () => "0"),
|
|
242
|
-
...rest
|
|
243
|
-
].map((group) => Number.parseInt(group, 16));
|
|
244
|
-
}
|
|
245
|
-
function publicV6(groups) {
|
|
246
|
-
const [first = 0] = groups;
|
|
247
|
-
const zeros = (from, to) => groups.slice(from, to).every((group) => group === 0);
|
|
248
|
-
const embedded = groups[6] * 65536 + groups[7];
|
|
249
|
-
if (zeros(0, 8)) return false;
|
|
250
|
-
if (zeros(0, 7) && groups[7] === 1) return false;
|
|
251
|
-
if (zeros(0, 5) && groups[5] === 65535) return publicV4(embedded);
|
|
252
|
-
if (first === 100 && groups[1] === 65435 && zeros(2, 6)) return publicV4(embedded);
|
|
253
|
-
if (zeros(0, 6)) return false;
|
|
254
|
-
if (first === 100 && groups[1] === 65435 && groups[2] === 1) return false;
|
|
255
|
-
if (first === 8194) return publicV4(groups[1] * 65536 + groups[2]);
|
|
256
|
-
if (first === 8193 && groups[1] === 0) return false;
|
|
257
|
-
if ((first & 65024) === 64512) return false;
|
|
258
|
-
if ((first & 65472) === 65152) return false;
|
|
259
|
-
if ((first & 65472) === 65216) return false;
|
|
260
|
-
if ((first & 65280) === 65280) return false;
|
|
261
|
-
if (first === 8193 && groups[1] === 3512) return false;
|
|
262
|
-
if (first === 256 && zeros(1, 4)) return false;
|
|
263
|
-
return true;
|
|
264
|
-
}
|
|
265
|
-
/**
|
|
266
|
-
* Whether an IP address is reachable on the public internet: not loopback,
|
|
267
|
-
* private, link-local (cloud metadata), carrier-grade NAT, multicast or
|
|
268
|
-
* reserved. Returns `false` for anything that isn't an IP address.
|
|
269
|
-
*/
|
|
270
|
-
function isPublicAddress(address) {
|
|
271
|
-
const ipv4 = v4(address);
|
|
272
|
-
if (ipv4 !== void 0) return publicV4(ipv4);
|
|
273
|
-
const ipv6 = v6(address.replaceAll(/^\[|\]$/g, ""));
|
|
274
|
-
return ipv6 !== void 0 && publicV6(ipv6);
|
|
275
|
-
}
|
|
276
|
-
const isAddress = (host) => v4(host) !== void 0 || v6(host) !== void 0;
|
|
277
|
-
const LOCAL_HOST = /(^|\.)(localhost|local|internal|home\.arpa)$/;
|
|
278
|
-
/** `node:dns` without importing it, so this entry stays runtime-neutral. */
|
|
279
|
-
function builtinResolver() {
|
|
280
|
-
const dns = globalThis.process?.getBuiltinModule?.("node:dns");
|
|
281
|
-
if (typeof dns !== "object" || dns === null || !("promises" in dns)) return void 0;
|
|
282
|
-
const { promises } = dns;
|
|
283
|
-
return async (hostname) => (await promises.lookup(hostname, {
|
|
284
|
-
all: true,
|
|
285
|
-
verbatim: true
|
|
286
|
-
})).map((entry) => entry.address);
|
|
287
|
-
}
|
|
288
|
-
/**
|
|
289
|
-
* The default `allowUrl`: HTTPS only, no credentials in the URL, no local
|
|
290
|
-
* host names, and every address the host resolves to must be public. The
|
|
291
|
-
* delivery transport calls it again for each redirect.
|
|
292
|
-
*
|
|
293
|
-
* DNS can change between this check and the connection. Route webhooks
|
|
294
|
-
* through an egress proxy when that matters.
|
|
295
|
-
*/
|
|
296
|
-
function publicUrl(options = {}) {
|
|
297
|
-
const resolve = options.resolve === false ? void 0 : options.resolve ?? builtinResolver();
|
|
298
|
-
if (options.resolve === void 0 && !resolve) throw new TypeError("publicUrl() needs a resolve option on runtimes without node:dns, or resolve: false to skip the DNS check");
|
|
299
|
-
const trusted = new Set(options.allowHosts?.map((host) => host.toLowerCase()));
|
|
300
|
-
return async (url) => {
|
|
301
|
-
const host = url.hostname.toLowerCase().replaceAll(/^\[|\]$/g, "");
|
|
302
|
-
if (trusted.has(host)) return true;
|
|
303
|
-
if (url.protocol !== "https:" && !(options.allowHttp && url.protocol === "http:")) return false;
|
|
304
|
-
if (url.username || url.password) return false;
|
|
305
|
-
if (isAddress(host)) return isPublicAddress(host);
|
|
306
|
-
if (LOCAL_HOST.test(host) || !host.includes(".")) return false;
|
|
307
|
-
if (!resolve) return true;
|
|
308
|
-
const addresses = await resolve(host);
|
|
309
|
-
return addresses.length > 0 && addresses.every(isPublicAddress);
|
|
310
|
-
};
|
|
311
|
-
}
|
|
312
|
-
//#endregion
|
|
313
|
-
//#region src/webhooks/outgoing.ts
|
|
314
|
-
const DEFAULT_SCHEMA = "better_supabase";
|
|
315
|
-
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
629
|
+
//#region src/blocks/webhooks/outgoing.ts
|
|
316
630
|
const textOf = (value) => value === null || value === void 0 ? null : String(value);
|
|
317
631
|
function toDelivery(row) {
|
|
318
632
|
return {
|
|
@@ -339,11 +653,11 @@ const SCHEDULE = [
|
|
|
339
653
|
const defaultBackoff = (attempt) => Math.round(Math.random() * SCHEDULE[Math.min(Math.max(attempt, 1), SCHEDULE.length) - 1]);
|
|
340
654
|
const MAX_RETRY_AFTER = 86400;
|
|
341
655
|
const defaultRetryable = (status) => status === 408 || status === 429 || status >= 500;
|
|
342
|
-
const errorText = (cause) => cause instanceof Error ? cause.message : String(cause);
|
|
343
656
|
function createWebhooks(options) {
|
|
657
|
+
applyTemporal(options);
|
|
344
658
|
const { transport } = options;
|
|
345
|
-
const schema = options.schema ??
|
|
346
|
-
const mappers = options.
|
|
659
|
+
const schema = options.schema ?? "better_supabase";
|
|
660
|
+
const mappers = options.mappers ?? [];
|
|
347
661
|
const store = options.secrets ?? sqlSecretStore(transport, { schema });
|
|
348
662
|
const signer = options.signer ?? standardWebhooks();
|
|
349
663
|
const maxAttempts = options.retry?.maxAttempts ?? 8;
|
|
@@ -365,7 +679,7 @@ function createWebhooks(options) {
|
|
|
365
679
|
}
|
|
366
680
|
function emit(type, delivery, extra = {}) {
|
|
367
681
|
if (!options.events) return;
|
|
368
|
-
|
|
682
|
+
emitBlockEvent(options.events, type, {
|
|
369
683
|
endpointId: delivery.endpointId,
|
|
370
684
|
deliveryId: delivery.id,
|
|
371
685
|
eventType: delivery.type,
|
|
@@ -556,7 +870,10 @@ function createWebhooks(options) {
|
|
|
556
870
|
status: 405,
|
|
557
871
|
headers: { allow: "GET, POST" }
|
|
558
872
|
});
|
|
559
|
-
if (!verifySharedSecret(request, secret)) return problemResponse(dbError("unauthorized", "The deliver route needs its bearer secret"), {
|
|
873
|
+
if (!verifySharedSecret(request, secret)) return problemResponse(dbError("unauthorized", "The deliver route needs its bearer secret"), {
|
|
874
|
+
instance,
|
|
875
|
+
format: routeOptions.problem
|
|
876
|
+
});
|
|
560
877
|
try {
|
|
561
878
|
return Response.json(await deliver({
|
|
562
879
|
budgetMs: 5e4,
|
|
@@ -564,7 +881,10 @@ function createWebhooks(options) {
|
|
|
564
881
|
}));
|
|
565
882
|
} catch (cause) {
|
|
566
883
|
routeOptions.onError?.(cause);
|
|
567
|
-
return problemResponse(toDbError(cause), {
|
|
884
|
+
return problemResponse(toDbError(cause), {
|
|
885
|
+
instance,
|
|
886
|
+
format: routeOptions.problem
|
|
887
|
+
});
|
|
568
888
|
}
|
|
569
889
|
};
|
|
570
890
|
},
|
|
@@ -585,4 +905,4 @@ function createWebhooks(options) {
|
|
|
585
905
|
};
|
|
586
906
|
}
|
|
587
907
|
//#endregion
|
|
588
|
-
export { WebhookPolicyError, authHook, createWebhooks, databaseChange, fetchTransport, hmacSigner, hookError, isDatabaseWebhook, isPublicAddress, publicUrl, rpcTransport, signWebhook, sqlSecretStore, sqlTransport, standardWebhooks, timingSafeEqual, verifySharedSecret, verifyWebhook };
|
|
908
|
+
export { INCOMING_ENDPOINT_HEADER, UnsafeUrlError, UrlCheckError, WebhookPolicyError, authHook, createIncomingWebhooks, createSafeFetch, createWebhooks, databaseChange, fetchTransport, hmacSigner, hookError, isDatabaseWebhook, isPublicAddress, publicUrl, rpcTransport, signStripeWebhook, signWebhook, sqlSecretStore, sqlTransport, standardWebhooks, stripeInboxVerify, timingSafeEqual, verifySharedSecret, verifyStripeWebhook, verifyWebhook };
|