better-supabase 0.7.1 → 0.9.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 +146 -81
- package/bin/better-supabase.js +14 -2
- package/dist/access-sql-DUSSMaC3.js +201 -0
- package/dist/actor-BAhb-d1S.d.ts +104 -0
- package/dist/actor-KHDOKGb1.js +151 -0
- package/dist/adapter-CEjmtazZ.js +1984 -0
- package/dist/agents-BCNhIxVZ.d.ts +111 -0
- package/dist/ai-cache-Dps7aRu1.d.ts +70 -0
- package/dist/ai-cache-zeUL94pB.js +84 -0
- package/dist/ai-chat-3GBSlFR4.d.ts +608 -0
- package/dist/ai-files-D2_9YLjF.js +331 -0
- package/dist/ai-message-DfaP8sis.js +14 -0
- package/dist/ai-sdk/agents/index.d.ts +154 -10
- package/dist/ai-sdk/agents/index.js +172 -17
- package/dist/ai-sdk/batches/index.d.ts +4 -4
- package/dist/ai-sdk/batches/index.js +5 -5
- package/dist/ai-sdk/cache/index.d.ts +2 -2
- package/dist/ai-sdk/cache/index.js +2 -2
- package/dist/ai-sdk/chat/index.d.ts +1 -1
- package/dist/ai-sdk/chat/index.js +10 -21
- package/dist/ai-sdk/embeddings/index.d.ts +3 -3
- package/dist/ai-sdk/embeddings/index.js +1 -2
- package/dist/ai-sdk/files/index.d.ts +3 -3
- package/dist/ai-sdk/files/index.js +4 -4
- package/dist/ai-sdk/index.d.ts +38 -9
- package/dist/ai-sdk/index.js +5 -3
- package/dist/ai-sdk/mcp/index.d.ts +43 -6
- package/dist/ai-sdk/mcp/index.js +37 -8
- package/dist/ai-sdk/memory/index.d.ts +5 -2
- package/dist/ai-sdk/memory/index.js +2 -2
- package/dist/ai-sdk/react/index.js +1 -2
- package/dist/ai-sdk/workflow/index.d.ts +7 -6
- package/dist/ai-sdk/workflow/index.js +15 -26
- package/dist/ai-tasks-Ih5oHfyj.d.ts +157 -0
- package/dist/announcements-BHCzraR6.js +128 -0
- package/dist/api-CFjuYKFY.js +680 -0
- package/dist/api-TG3jE5aO.d.ts +411 -0
- package/dist/api-keys-BEQatEUW.js +318 -0
- package/dist/api-keys-BYoGCM9p.d.ts +205 -0
- package/dist/app-tables-BGl5_U2x.js +584 -0
- package/dist/approvals-a2KmioBh.d.ts +124 -0
- package/dist/arazzo/index.d.ts +255 -0
- package/dist/arazzo/index.js +622 -0
- package/dist/assistant-Bf2cA6RO.d.ts +148 -0
- package/dist/astro/index.d.ts +9 -8
- package/dist/astro/index.js +12 -9
- package/dist/asyncapi/index.d.ts +103 -0
- package/dist/asyncapi/index.js +569 -0
- package/dist/attachments-DAj2Yp95.js +264 -0
- package/dist/attributes-D4mA7WhI.js +38 -0
- package/dist/audit-log-BMMuGPdP.js +786 -0
- package/dist/auth-CdBKt0CS.js +20 -0
- package/dist/auth-reply-DUCwb8YO.js +31 -0
- package/dist/auth-reply-Dj124sbX.d.ts +11 -0
- package/dist/authorization-DpRfs6Wx.d.ts +1412 -0
- package/dist/authorization-hooks-DkmrnDX7.d.ts +214 -0
- package/dist/authorizer-DH7DjkL3.js +126 -0
- package/dist/authorizer-eiOjo-3l.d.ts +73 -0
- package/dist/base64-BmeCBgGo.js +42 -0
- package/dist/batch-limit-DKVQDz4o.js +5 -0
- package/dist/before-route-B98js9m_.js +30 -0
- package/dist/better-result/index.d.ts +118 -0
- package/dist/better-result/index.js +64 -0
- package/dist/bind-a7sUgvf4.d.ts +70 -0
- package/dist/block-env-CBd_SoL5.js +29 -0
- package/dist/block-env-Dxl7rsI0.d.ts +10 -0
- package/dist/block-events-DD9Q_NUz.js +96 -0
- package/dist/block-fields-5UA84ZUg.d.ts +55 -0
- package/dist/block-fields-ffD6Gxe4.js +139 -0
- package/dist/block-helpers-C86hPEjI.d.ts +37 -0
- package/dist/block-helpers-CfG_MvDR.js +264 -0
- package/dist/block-hooks-BLPWD3Jt.d.ts +107 -0
- package/dist/block-hooks-BsXncUlZ.js +114 -0
- package/dist/block-transport-DaGGXjIw.d.ts +70 -0
- package/dist/block-transport-G4t1umrR.js +85 -0
- package/dist/blocks/access-requests/index.d.ts +98 -0
- package/dist/blocks/access-requests/index.js +99 -0
- package/dist/blocks/agents/index.d.ts +21 -3
- package/dist/blocks/agents/index.js +65 -18
- package/dist/blocks/ai-cache/index.d.ts +8 -3
- package/dist/blocks/ai-cache/index.js +15 -3
- package/dist/blocks/ai-chat/index.d.ts +28 -4
- package/dist/blocks/ai-chat/index.js +31 -5
- package/dist/blocks/ai-chat/react/index.d.ts +12 -46
- package/dist/blocks/ai-chat/react/index.js +43 -335
- package/dist/blocks/ai-chat/solid/index.d.ts +34 -0
- package/dist/blocks/ai-chat/solid/index.js +41 -0
- package/dist/blocks/ai-chat/svelte/index.d.ts +34 -0
- package/dist/blocks/ai-chat/svelte/index.js +41 -0
- package/dist/blocks/ai-chat/vue/index.d.ts +34 -0
- package/dist/blocks/ai-chat/vue/index.js +41 -0
- package/dist/blocks/ai-files/index.d.ts +11 -4
- package/dist/blocks/ai-files/index.js +16 -3
- package/dist/blocks/ai-providers/index.d.ts +18 -3
- package/dist/blocks/ai-providers/index.js +41 -15
- package/dist/blocks/ai-tasks/index.d.ts +10 -3
- package/dist/blocks/ai-tasks/index.js +71 -21
- package/dist/blocks/announcements/index.d.ts +18 -3
- package/dist/blocks/announcements/index.js +27 -3
- package/dist/blocks/announcements/react/index.d.ts +4 -14
- package/dist/blocks/announcements/react/index.js +22 -70
- package/dist/blocks/announcements/solid/index.d.ts +13 -0
- package/dist/blocks/announcements/solid/index.js +14 -0
- package/dist/blocks/announcements/svelte/index.d.ts +13 -0
- package/dist/blocks/announcements/svelte/index.js +14 -0
- package/dist/blocks/announcements/vue/index.d.ts +13 -0
- package/dist/blocks/announcements/vue/index.js +14 -0
- package/dist/blocks/api-keys/index.d.ts +24 -7
- package/dist/blocks/api-keys/index.js +30 -295
- package/dist/blocks/api-keys/react/index.d.ts +29 -0
- package/dist/blocks/api-keys/react/index.js +43 -0
- package/dist/blocks/api-keys/react/server.d.ts +7 -0
- package/dist/blocks/api-keys/react/server.js +7 -0
- package/dist/blocks/api-keys/solid/index.d.ts +13 -0
- package/dist/blocks/api-keys/solid/index.js +14 -0
- package/dist/blocks/api-keys/svelte/index.d.ts +13 -0
- package/dist/blocks/api-keys/svelte/index.js +14 -0
- package/dist/blocks/api-keys/vue/index.d.ts +13 -0
- package/dist/blocks/api-keys/vue/index.js +14 -0
- package/dist/blocks/approvals/index.d.ts +22 -0
- package/dist/blocks/approvals/index.js +189 -0
- package/dist/blocks/attachments/index.d.ts +18 -223
- package/dist/blocks/attachments/index.js +26 -233
- package/dist/blocks/audit/index.d.ts +72 -354
- package/dist/blocks/audit/index.js +91 -695
- package/dist/blocks/audit/react/index.d.ts +26 -0
- package/dist/blocks/audit/react/index.js +44 -0
- package/dist/blocks/audit/react/server.d.ts +7 -0
- package/dist/blocks/audit/react/server.js +7 -0
- package/dist/blocks/audit/solid/index.d.ts +13 -0
- package/dist/blocks/audit/solid/index.js +14 -0
- package/dist/blocks/audit/svelte/index.d.ts +13 -0
- package/dist/blocks/audit/svelte/index.js +14 -0
- package/dist/blocks/audit/vue/index.d.ts +13 -0
- package/dist/blocks/audit/vue/index.js +14 -0
- package/dist/blocks/billing/index.d.ts +40 -13
- package/dist/blocks/billing/index.js +49 -18
- package/dist/blocks/billing/react/index.d.ts +34 -0
- package/dist/blocks/billing/react/index.js +36 -0
- package/dist/blocks/billing/react/server.d.ts +7 -0
- package/dist/blocks/billing/react/server.js +7 -0
- package/dist/blocks/billing/solid/index.d.ts +15 -0
- package/dist/blocks/billing/solid/index.js +14 -0
- package/dist/blocks/billing/svelte/index.d.ts +15 -0
- package/dist/blocks/billing/svelte/index.js +14 -0
- package/dist/blocks/billing/vue/index.d.ts +15 -0
- package/dist/blocks/billing/vue/index.js +14 -0
- package/dist/blocks/bookings/index.d.ts +36 -0
- package/dist/blocks/bookings/index.js +28 -0
- package/dist/blocks/bookings/react/index.d.ts +31 -0
- package/dist/blocks/bookings/react/index.js +59 -0
- package/dist/blocks/bookings/react/server.d.ts +6 -0
- package/dist/blocks/bookings/react/server.js +7 -0
- package/dist/blocks/bookings/solid/index.d.ts +13 -0
- package/dist/blocks/bookings/solid/index.js +14 -0
- package/dist/blocks/bookings/svelte/index.d.ts +13 -0
- package/dist/blocks/bookings/svelte/index.js +14 -0
- package/dist/blocks/bookings/vue/index.d.ts +13 -0
- package/dist/blocks/bookings/vue/index.js +14 -0
- package/dist/blocks/bulk/index.d.ts +142 -0
- package/dist/blocks/bulk/index.js +154 -0
- package/dist/blocks/calendar/index.d.ts +20 -0
- package/dist/blocks/calendar/index.js +33 -0
- package/dist/blocks/calendar/react/index.d.ts +26 -0
- package/dist/blocks/calendar/react/index.js +58 -0
- package/dist/blocks/calendar/react/server.d.ts +6 -0
- package/dist/blocks/calendar/react/server.js +7 -0
- package/dist/blocks/calendar/solid/index.d.ts +13 -0
- package/dist/blocks/calendar/solid/index.js +14 -0
- package/dist/blocks/calendar/svelte/index.d.ts +13 -0
- package/dist/blocks/calendar/svelte/index.js +14 -0
- package/dist/blocks/calendar/vue/index.d.ts +13 -0
- package/dist/blocks/calendar/vue/index.js +14 -0
- package/dist/blocks/catalog/index.d.ts +224 -0
- package/dist/blocks/catalog/index.js +292 -0
- package/dist/blocks/collections/index.d.ts +184 -0
- package/dist/blocks/collections/index.js +208 -0
- package/dist/blocks/comments/index.d.ts +19 -166
- package/dist/blocks/comments/index.js +26 -206
- package/dist/blocks/comments/react/index.d.ts +27 -0
- package/dist/blocks/comments/react/index.js +45 -0
- package/dist/blocks/comments/react/server.d.ts +7 -0
- package/dist/blocks/comments/react/server.js +7 -0
- package/dist/blocks/comments/solid/index.d.ts +13 -0
- package/dist/blocks/comments/solid/index.js +14 -0
- package/dist/blocks/comments/svelte/index.d.ts +13 -0
- package/dist/blocks/comments/svelte/index.js +14 -0
- package/dist/blocks/comments/vue/index.d.ts +13 -0
- package/dist/blocks/comments/vue/index.js +14 -0
- package/dist/blocks/connectors/index.d.ts +21 -3
- package/dist/blocks/connectors/index.js +54 -18
- package/dist/blocks/custom-fields/index.d.ts +62 -0
- package/dist/blocks/custom-fields/index.js +85 -0
- package/dist/blocks/data-lifecycle/index.d.ts +119 -10
- package/dist/blocks/data-lifecycle/index.js +103 -12
- package/dist/blocks/deals/index.d.ts +262 -0
- package/dist/blocks/deals/index.js +380 -0
- package/dist/blocks/documents/index.d.ts +17 -0
- package/dist/blocks/documents/index.js +118 -0
- package/dist/blocks/domains/index.d.ts +117 -0
- package/dist/blocks/domains/index.js +118 -0
- package/dist/blocks/drive/index.d.ts +296 -0
- package/dist/blocks/drive/index.js +483 -0
- package/dist/blocks/employees/index.d.ts +205 -0
- package/dist/blocks/employees/index.js +289 -0
- package/dist/blocks/engagements/index.d.ts +125 -0
- package/dist/blocks/engagements/index.js +143 -0
- package/dist/blocks/entitlements/index.d.ts +40 -4
- package/dist/blocks/entitlements/index.js +14 -24
- package/dist/blocks/entitlements/react/index.d.ts +24 -0
- package/dist/blocks/entitlements/react/index.js +35 -0
- package/dist/blocks/entitlements/react/server.d.ts +6 -0
- package/dist/blocks/entitlements/react/server.js +7 -0
- package/dist/blocks/entitlements/solid/index.d.ts +13 -0
- package/dist/blocks/entitlements/solid/index.js +14 -0
- package/dist/blocks/entitlements/svelte/index.d.ts +13 -0
- package/dist/blocks/entitlements/svelte/index.js +14 -0
- package/dist/blocks/entitlements/vue/index.d.ts +13 -0
- package/dist/blocks/entitlements/vue/index.js +14 -0
- package/dist/blocks/flags/index.d.ts +61 -187
- package/dist/blocks/flags/index.js +65 -252
- package/dist/blocks/forms/index.d.ts +302 -0
- package/dist/blocks/forms/index.js +341 -0
- package/dist/blocks/forms/react/index.d.ts +16 -0
- package/dist/blocks/forms/react/index.js +25 -0
- package/dist/blocks/forms/react/server.d.ts +6 -0
- package/dist/blocks/forms/react/server.js +7 -0
- package/dist/blocks/forms/solid/index.d.ts +13 -0
- package/dist/blocks/forms/solid/index.js +14 -0
- package/dist/blocks/forms/svelte/index.d.ts +13 -0
- package/dist/blocks/forms/svelte/index.js +14 -0
- package/dist/blocks/forms/vue/index.d.ts +13 -0
- package/dist/blocks/forms/vue/index.js +14 -0
- package/dist/blocks/hiring/index.d.ts +154 -0
- package/dist/blocks/hiring/index.js +180 -0
- package/dist/blocks/identities/index.d.ts +83 -0
- package/dist/blocks/identities/index.js +103 -0
- package/dist/blocks/imports/index.d.ts +91 -0
- package/dist/blocks/imports/index.js +123 -0
- package/dist/blocks/inbox/index.d.ts +22 -3
- package/dist/blocks/inbox/index.js +78 -6
- package/dist/blocks/inbox/react/index.d.ts +3 -2
- package/dist/blocks/inbox/react/index.js +55 -199
- package/dist/blocks/inbox/react/server.d.ts +2 -1
- package/dist/blocks/inbox/solid/index.d.ts +27 -0
- package/dist/blocks/inbox/solid/index.js +32 -0
- package/dist/blocks/inbox/svelte/index.d.ts +27 -0
- package/dist/blocks/inbox/svelte/index.js +32 -0
- package/dist/blocks/inbox/vue/index.d.ts +27 -0
- package/dist/blocks/inbox/vue/index.js +32 -0
- package/dist/blocks/index.d.ts +9 -64
- package/dist/blocks/index.js +193 -57
- package/dist/blocks/inventory/index.d.ts +181 -0
- package/dist/blocks/inventory/index.js +219 -0
- package/dist/blocks/invoices/index.d.ts +154 -0
- package/dist/blocks/invoices/index.js +216 -0
- package/dist/blocks/jobs/index.d.ts +188 -49
- package/dist/blocks/jobs/index.js +698 -527
- package/dist/blocks/knowledge/index.d.ts +10 -3
- package/dist/blocks/knowledge/index.js +17 -3
- package/dist/blocks/leave/index.d.ts +241 -0
- package/dist/blocks/leave/index.js +209 -0
- package/dist/blocks/memory/index.d.ts +9 -4
- package/dist/blocks/memory/index.js +49 -12
- package/dist/blocks/metrics/index.d.ts +174 -0
- package/dist/blocks/metrics/index.js +217 -0
- package/dist/blocks/mfa/index.d.ts +7 -0
- package/dist/blocks/mfa/index.js +12 -0
- package/dist/blocks/mfa/react/index.d.ts +30 -0
- package/dist/blocks/mfa/react/index.js +45 -0
- package/dist/blocks/mfa/react/server.d.ts +9 -0
- package/dist/blocks/mfa/react/server.js +12 -0
- package/dist/blocks/mfa/solid/index.d.ts +20 -0
- package/dist/blocks/mfa/solid/index.js +23 -0
- package/dist/blocks/mfa/svelte/index.d.ts +20 -0
- package/dist/blocks/mfa/svelte/index.js +23 -0
- package/dist/blocks/mfa/vue/index.d.ts +20 -0
- package/dist/blocks/mfa/vue/index.js +23 -0
- package/dist/blocks/notifications/index.d.ts +345 -26
- package/dist/blocks/notifications/index.js +744 -120
- package/dist/blocks/notifications/react/index.d.ts +7 -32
- package/dist/blocks/notifications/react/index.js +23 -49
- package/dist/blocks/notifications/react/server.d.ts +2 -1
- package/dist/blocks/notifications/solid/index.d.ts +13 -0
- package/dist/blocks/notifications/solid/index.js +14 -0
- package/dist/blocks/notifications/svelte/index.d.ts +13 -0
- package/dist/blocks/notifications/svelte/index.js +14 -0
- package/dist/blocks/notifications/vue/index.d.ts +13 -0
- package/dist/blocks/notifications/vue/index.js +14 -0
- package/dist/blocks/number-sequences/index.d.ts +39 -0
- package/dist/blocks/number-sequences/index.js +38 -0
- package/dist/blocks/oauth-server/index.d.ts +228 -0
- package/dist/blocks/oauth-server/index.js +309 -0
- package/dist/blocks/onboarding/index.d.ts +8 -3
- package/dist/blocks/onboarding/index.js +17 -63
- package/dist/blocks/onboarding/react/index.d.ts +3 -12
- package/dist/blocks/onboarding/react/index.js +18 -60
- package/dist/blocks/onboarding/react/server.d.ts +2 -2
- package/dist/blocks/onboarding/react/server.js +2 -2
- package/dist/blocks/onboarding/solid/index.d.ts +13 -0
- package/dist/blocks/onboarding/solid/index.js +14 -0
- package/dist/blocks/onboarding/svelte/index.d.ts +13 -0
- package/dist/blocks/onboarding/svelte/index.js +14 -0
- package/dist/blocks/onboarding/vue/index.d.ts +13 -0
- package/dist/blocks/onboarding/vue/index.js +14 -0
- package/dist/blocks/orders/index.d.ts +264 -0
- package/dist/blocks/orders/index.js +589 -0
- package/dist/blocks/organizations/index.d.ts +31 -238
- package/dist/blocks/organizations/index.js +49 -399
- package/dist/blocks/organizations/react/index.d.ts +108 -0
- package/dist/blocks/organizations/react/index.js +113 -0
- package/dist/blocks/organizations/react/server.d.ts +11 -0
- package/dist/blocks/organizations/react/server.js +15 -0
- package/dist/blocks/organizations/solid/index.d.ts +34 -0
- package/dist/blocks/organizations/solid/index.js +32 -0
- package/dist/blocks/organizations/svelte/index.d.ts +34 -0
- package/dist/blocks/organizations/svelte/index.js +32 -0
- package/dist/blocks/organizations/vue/index.d.ts +34 -0
- package/dist/blocks/organizations/vue/index.js +32 -0
- package/dist/blocks/outbox/index.d.ts +12 -3
- package/dist/blocks/outbox/index.js +97 -67
- package/dist/blocks/parties/index.d.ts +181 -0
- package/dist/blocks/parties/index.js +258 -0
- package/dist/blocks/pipelines/index.d.ts +189 -0
- package/dist/blocks/pipelines/index.js +204 -0
- package/dist/blocks/profiles/index.d.ts +14 -9
- package/dist/blocks/profiles/index.js +20 -6
- package/dist/blocks/promotions/index.d.ts +125 -0
- package/dist/blocks/promotions/index.js +123 -0
- package/dist/blocks/push/index.d.ts +48 -28
- package/dist/blocks/push/index.js +45 -16
- package/dist/blocks/quotes/index.d.ts +152 -0
- package/dist/blocks/quotes/index.js +209 -0
- package/dist/blocks/rank/index.d.ts +71 -0
- package/dist/blocks/rank/index.js +53 -0
- package/dist/blocks/reactions/index.d.ts +18 -0
- package/dist/blocks/reactions/index.js +26 -0
- package/dist/blocks/reactions/react/index.d.ts +23 -0
- package/dist/blocks/reactions/react/index.js +46 -0
- package/dist/blocks/reactions/react/server.d.ts +6 -0
- package/dist/blocks/reactions/react/server.js +7 -0
- package/dist/blocks/reactions/solid/index.d.ts +13 -0
- package/dist/blocks/reactions/solid/index.js +14 -0
- package/dist/blocks/reactions/svelte/index.d.ts +13 -0
- package/dist/blocks/reactions/svelte/index.js +14 -0
- package/dist/blocks/reactions/vue/index.d.ts +13 -0
- package/dist/blocks/reactions/vue/index.js +14 -0
- package/dist/blocks/relations/index.d.ts +180 -0
- package/dist/blocks/relations/index.js +254 -0
- package/dist/blocks/reminders/index.d.ts +177 -0
- package/dist/blocks/reminders/index.js +171 -0
- package/dist/blocks/reviews/index.d.ts +148 -0
- package/dist/blocks/reviews/index.js +139 -0
- package/dist/blocks/rules/index.d.ts +103 -0
- package/dist/blocks/rules/index.js +54 -0
- package/dist/blocks/rules/react/index.d.ts +34 -0
- package/dist/blocks/rules/react/index.js +55 -0
- package/dist/blocks/rules/react/server.d.ts +6 -0
- package/dist/blocks/rules/react/server.js +7 -0
- package/dist/blocks/rules/solid/index.d.ts +13 -0
- package/dist/blocks/rules/solid/index.js +14 -0
- package/dist/blocks/rules/svelte/index.d.ts +13 -0
- package/dist/blocks/rules/svelte/index.js +14 -0
- package/dist/blocks/rules/vue/index.d.ts +13 -0
- package/dist/blocks/rules/vue/index.js +14 -0
- package/dist/blocks/saved-views/index.d.ts +17 -0
- package/dist/blocks/saved-views/index.js +29 -0
- package/dist/blocks/saved-views/react/index.d.ts +34 -0
- package/dist/blocks/saved-views/react/index.js +57 -0
- package/dist/blocks/saved-views/react/server.d.ts +7 -0
- package/dist/blocks/saved-views/react/server.js +7 -0
- package/dist/blocks/saved-views/solid/index.d.ts +13 -0
- package/dist/blocks/saved-views/solid/index.js +14 -0
- package/dist/blocks/saved-views/svelte/index.d.ts +13 -0
- package/dist/blocks/saved-views/svelte/index.js +14 -0
- package/dist/blocks/saved-views/vue/index.d.ts +13 -0
- package/dist/blocks/saved-views/vue/index.js +14 -0
- package/dist/blocks/search/index.d.ts +31 -0
- package/dist/blocks/search/index.js +61 -0
- package/dist/blocks/search/react/index.d.ts +36 -0
- package/dist/blocks/search/react/index.js +49 -0
- package/dist/blocks/search/react/server.d.ts +7 -0
- package/dist/blocks/search/react/server.js +8 -0
- package/dist/blocks/search/solid/index.d.ts +13 -0
- package/dist/blocks/search/solid/index.js +14 -0
- package/dist/blocks/search/svelte/index.d.ts +13 -0
- package/dist/blocks/search/svelte/index.js +14 -0
- package/dist/blocks/search/vue/index.d.ts +13 -0
- package/dist/blocks/search/vue/index.js +14 -0
- package/dist/blocks/service-principals/index.d.ts +126 -0
- package/dist/blocks/service-principals/index.js +107 -0
- package/dist/blocks/sessions/index.d.ts +7 -0
- package/dist/blocks/sessions/index.js +14 -0
- package/dist/blocks/sessions/react/index.d.ts +31 -0
- package/dist/blocks/sessions/react/index.js +51 -0
- package/dist/blocks/sessions/react/server.d.ts +9 -0
- package/dist/blocks/sessions/react/server.js +11 -0
- package/dist/blocks/sessions/solid/index.d.ts +20 -0
- package/dist/blocks/sessions/solid/index.js +23 -0
- package/dist/blocks/sessions/svelte/index.d.ts +20 -0
- package/dist/blocks/sessions/svelte/index.js +23 -0
- package/dist/blocks/sessions/vue/index.d.ts +20 -0
- package/dist/blocks/sessions/vue/index.js +23 -0
- package/dist/blocks/settings/index.d.ts +20 -86
- package/dist/blocks/settings/index.js +28 -101
- package/dist/blocks/settings/react/index.d.ts +25 -0
- package/dist/blocks/settings/react/index.js +37 -0
- package/dist/blocks/settings/react/server.d.ts +7 -0
- package/dist/blocks/settings/react/server.js +7 -0
- package/dist/blocks/settings/solid/index.d.ts +13 -0
- package/dist/blocks/settings/solid/index.js +14 -0
- package/dist/blocks/settings/svelte/index.d.ts +13 -0
- package/dist/blocks/settings/svelte/index.js +14 -0
- package/dist/blocks/settings/vue/index.d.ts +13 -0
- package/dist/blocks/settings/vue/index.js +14 -0
- package/dist/blocks/share-links/index.d.ts +99 -0
- package/dist/blocks/share-links/index.js +99 -0
- package/dist/blocks/shared-signals/index.d.ts +395 -0
- package/dist/blocks/shared-signals/index.js +880 -0
- package/dist/blocks/signing-keys/index.d.ts +29 -0
- package/dist/blocks/signing-keys/index.js +161 -0
- package/dist/blocks/sla/index.d.ts +114 -0
- package/dist/blocks/sla/index.js +122 -0
- package/dist/blocks/sso/index.d.ts +169 -147
- package/dist/blocks/sso/index.js +259 -321
- package/dist/blocks/state-machine/index.d.ts +105 -0
- package/dist/blocks/state-machine/index.js +116 -0
- package/dist/blocks/tags/index.d.ts +20 -0
- package/dist/blocks/tags/index.js +28 -0
- package/dist/blocks/tags/react/index.d.ts +28 -0
- package/dist/blocks/tags/react/index.js +47 -0
- package/dist/blocks/tags/react/server.d.ts +7 -0
- package/dist/blocks/tags/react/server.js +7 -0
- package/dist/blocks/tags/solid/index.d.ts +13 -0
- package/dist/blocks/tags/solid/index.js +14 -0
- package/dist/blocks/tags/svelte/index.d.ts +13 -0
- package/dist/blocks/tags/svelte/index.js +14 -0
- package/dist/blocks/tags/vue/index.d.ts +13 -0
- package/dist/blocks/tags/vue/index.js +14 -0
- package/dist/blocks/targets/index.d.ts +82 -0
- package/dist/blocks/targets/index.js +73 -0
- package/dist/blocks/teams/index.d.ts +61 -0
- package/dist/blocks/teams/index.js +83 -0
- package/dist/blocks/templates/index.d.ts +362 -0
- package/dist/blocks/templates/index.js +483 -0
- package/dist/blocks/time-tracking/index.d.ts +250 -0
- package/dist/blocks/time-tracking/index.js +317 -0
- package/dist/blocks/trash/index.d.ts +78 -0
- package/dist/blocks/trash/index.js +79 -0
- package/dist/blocks/undo/index.d.ts +9 -0
- package/dist/blocks/undo/index.js +14 -0
- package/dist/blocks/undo/react/index.d.ts +17 -0
- package/dist/blocks/undo/react/index.js +24 -0
- package/dist/blocks/undo/react/server.d.ts +7 -0
- package/dist/blocks/undo/react/server.js +7 -0
- package/dist/blocks/undo/solid/index.d.ts +13 -0
- package/dist/blocks/undo/solid/index.js +14 -0
- package/dist/blocks/undo/svelte/index.d.ts +13 -0
- package/dist/blocks/undo/svelte/index.js +14 -0
- package/dist/blocks/undo/vue/index.d.ts +13 -0
- package/dist/blocks/undo/vue/index.js +14 -0
- package/dist/blocks/usage/index.d.ts +10 -4
- package/dist/blocks/usage/index.js +16 -232
- package/dist/blocks/usage/react/index.d.ts +23 -0
- package/dist/blocks/usage/react/index.js +38 -0
- package/dist/blocks/usage/react/server.d.ts +7 -0
- package/dist/blocks/usage/react/server.js +7 -0
- package/dist/blocks/usage/solid/index.d.ts +13 -0
- package/dist/blocks/usage/solid/index.js +14 -0
- package/dist/blocks/usage/svelte/index.d.ts +13 -0
- package/dist/blocks/usage/svelte/index.js +14 -0
- package/dist/blocks/usage/vue/index.d.ts +13 -0
- package/dist/blocks/usage/vue/index.js +14 -0
- package/dist/blocks/versions/index.d.ts +165 -0
- package/dist/blocks/versions/index.js +283 -0
- package/dist/blocks/waitlist/index.d.ts +57 -19
- package/dist/blocks/waitlist/index.js +47 -12
- package/dist/blocks/webhooks/index.d.ts +275 -134
- package/dist/blocks/webhooks/index.js +775 -231
- package/dist/blocks/work-items/index.d.ts +208 -0
- package/dist/blocks/work-items/index.js +305 -0
- package/dist/blocks/workflow-builder/index.d.ts +26 -6
- package/dist/blocks/workflow-builder/index.js +30 -5
- package/dist/blocks/workflow-builder/react/index.d.ts +4 -19
- package/dist/blocks/workflow-builder/react/index.js +45 -89
- package/dist/blocks/workflow-builder/solid/index.d.ts +20 -0
- package/dist/blocks/workflow-builder/solid/index.js +23 -0
- package/dist/blocks/workflow-builder/svelte/index.d.ts +20 -0
- package/dist/blocks/workflow-builder/svelte/index.js +23 -0
- package/dist/blocks/workflow-builder/vue/index.d.ts +20 -0
- package/dist/blocks/workflow-builder/vue/index.js +23 -0
- package/dist/blocks/workflows/index.d.ts +20 -3
- package/dist/blocks/workflows/index.js +27 -3
- package/dist/blocks/workflows/react/index.d.ts +5 -20
- package/dist/blocks/workflows/react/index.js +41 -113
- package/dist/blocks/workflows/solid/index.d.ts +20 -0
- package/dist/blocks/workflows/solid/index.js +23 -0
- package/dist/blocks/workflows/svelte/index.d.ts +20 -0
- package/dist/blocks/workflows/svelte/index.js +23 -0
- package/dist/blocks/workflows/vue/index.d.ts +20 -0
- package/dist/blocks/workflows/vue/index.js +23 -0
- package/dist/blocks-D2WQ63PI.js +84 -0
- package/dist/bookings-0XnhHNLM.js +181 -0
- package/dist/build-Cm0T5MVG.js +1815 -0
- package/dist/build-Cx08LOT7.js +689 -0
- package/dist/calendar-DcFrpSOy.js +801 -0
- package/dist/casing-DdFWEtqr.js +16 -0
- package/dist/channel-D-LHCY11.d.ts +78 -0
- package/dist/channels-C-GCoNLd.js +114 -0
- package/dist/chat-sdk/index.d.ts +131 -7
- package/dist/chat-sdk/index.js +155 -6
- package/dist/chat-sdk/react/index.d.ts +2 -1
- package/dist/chat-sdk/react/index.js +1 -2
- package/dist/chat-sdk/react/server.d.ts +2 -1
- package/dist/chat-sdk/react/server.js +1 -2
- package/dist/claims-0KZVT804.js +61 -0
- package/dist/cli/add-B0zoJUYX.js +651 -0
- package/dist/cli/add-Bd5M6uEZ.js +75 -0
- package/dist/cli/add-CT6p5psO.js +1 -0
- package/dist/cli/adopt-C9jl8z0h.js +1 -0
- package/dist/cli/adopt-CebmlHL-.js +393 -0
- package/dist/cli/agent-CCt_aXpJ.js +176 -0
- package/dist/cli/apply-Dxk8AUNU.js +302 -0
- package/dist/cli/arazzo-1.0-BalU61-_.js +532 -0
- package/dist/cli/arazzo-1.1-Bnfasbun.js +705 -0
- package/dist/cli/asyncapi-3.0.0-C78dBjR6.js +5593 -0
- package/dist/cli/asyncapi-3.1.0-g-7aIfV1.js +5833 -0
- package/dist/cli/bin.js +41 -21
- package/dist/cli/blocks-Bzz326nn.js +1 -0
- package/dist/cli/blocks-Dq25D80b.js +124 -0
- package/dist/cli/cache-Cx6qlRDR.js +502 -0
- package/dist/cli/catalog-Di15TkM2.js +187 -0
- package/dist/cli/codemod-woL4cVe0.js +985 -0
- package/dist/cli/command-CK9Cn8HV.js +836 -0
- package/dist/cli/completion-BO5UK6bG.js +1 -0
- package/dist/cli/completion-CWoDmFZr.js +205 -0
- package/dist/cli/completion-J3dqnNoW.js +30 -0
- package/dist/cli/config-C1d-mbUA.js +1 -0
- package/dist/cli/config-CLHpTk9Y.js +1421 -0
- package/dist/cli/config-MuKY9kUj.js +39 -0
- package/dist/cli/config-edit-Ct1lXe8a.js +603 -0
- package/dist/cli/db-DT1bGB02.js +78 -0
- package/dist/cli/design-edit-B-WsnhUF.js +175 -0
- package/dist/cli/detect-DYDUBLU4.js +84 -0
- package/dist/cli/dist-D_VbPAMR.js +129 -0
- package/dist/cli/dist-DuiMMRbJ.js +1112 -0
- package/dist/cli/doctor-SGw36h1D.js +3806 -0
- package/dist/cli/emit-ZAYeh4Yn.js +1042 -0
- package/dist/cli/env-CVXvJoLP.js +142 -0
- package/dist/cli/env-D3gZ-OHj.js +1 -0
- package/dist/cli/env-DJ4ZaJpe.js +1 -0
- package/dist/cli/env-DMw_MBe5.js +996 -0
- package/dist/cli/errors-Caiz_0so.js +98 -0
- package/dist/cli/fastest-levenshtein-dhRRvrM2.js +120 -0
- package/dist/cli/files-DDvAwTko.js +963 -0
- package/dist/cli/gen-B344S1Oy.js +304 -0
- package/dist/cli/guards-CUlDNYZs.js +8 -0
- package/dist/cli/index.d.ts +297 -140
- package/dist/cli/index.js +13 -8
- package/dist/cli/init-B1dL-RZL.js +393 -0
- package/dist/cli/introspect-BPcFi8ow.js +51 -0
- package/dist/cli/io-BiPX-_J1.js +37 -0
- package/dist/cli/jsonc-C8M0EhHB.js +1 -0
- package/dist/cli/keys-jsxCNJdz.js +106 -0
- package/dist/cli/metadata-CxBZo4KM.js +138 -0
- package/dist/cli/module-migration-YFFdWC5X.js +592 -0
- package/dist/cli/moved-D9OT_Uyy.js +152 -0
- package/dist/cli/names-D6LrQnOv.js +6 -0
- package/dist/cli/openapi-3.0-t7xwkuRH.js +928 -0
- package/dist/cli/openapi-3.1-CVze7tBS.js +870 -0
- package/dist/cli/openapi-3.2-CFoMYM01.js +1031 -0
- package/dist/cli/parse-DE59XyWt.js +170 -0
- package/dist/cli/preset-DmcC4nWE.js +129 -0
- package/dist/cli/prompts-Bvg_DBpe.js +1137 -0
- package/dist/cli/redact-PjNswZOs.js +35 -0
- package/dist/cli/rolldown-runtime-kJ_i4yPo.js +26 -0
- package/dist/cli/run-CM_2g6KQ.js +684 -0
- package/dist/cli/run-DaHfUUO9.js +1539 -0
- package/dist/cli/scaffold-CFdDq36-.js +898 -0
- package/dist/cli/scaffold-Dsjr7sOT.js +1 -0
- package/dist/cli/seed-DldDdXWO.js +113 -0
- package/dist/cli/seed-DtRFysBe.js +1 -0
- package/dist/cli/shell-Btv_4Yhe.js +10 -0
- package/dist/cli/skills-v34NDb2D.js +121 -0
- package/dist/cli/snapshot-DAxLi4hO.js +347 -0
- package/dist/cli/source-args-0I9zylYy.js +47 -0
- package/dist/cli/spec-CaaSOYZS.js +7501 -0
- package/dist/cli/spec-De0cfceR.js +1 -0
- package/dist/cli/sql-0I1EQ3JG.js +2 -0
- package/dist/cli/sql-DDLWwzh9.js +326 -0
- package/dist/cli/stack-status-CRanl-CN.js +456 -0
- package/dist/cli/style-2JfIPVMQ.js +29 -0
- package/dist/cli/supabase-toml-DjLgBYEo.js +1153 -0
- package/dist/cli/sync-DFx-6t5n.js +88 -0
- package/dist/cli/topics-GJuIDwlY.js +30 -0
- package/dist/cli/trace-VbdO6bcN.js +7 -0
- package/dist/cli/typegen--TfvOPLh.js +494 -0
- package/dist/cli/typegen-version-BNBPI4Eu.js +9 -0
- package/dist/cli/validate-BfWNKvxy.js +7522 -0
- package/dist/cli/version-DNRW4DAP.js +4 -0
- package/dist/cli/write-BS6F3Yvz.js +180 -0
- package/dist/client/index.d.ts +7 -3
- package/dist/client/index.js +207 -4
- package/dist/client/native/index.d.ts +71 -4
- package/dist/client/native/index.js +65 -6
- package/dist/client-01MAuqzW.js +137 -0
- package/dist/client-B7QVIrJS.d.ts +263 -0
- package/dist/client-B9CqzgPO.js +75 -0
- package/dist/client-BAcILZOf.d.ts +122 -0
- package/dist/client-BOT2KVIp.js +128 -0
- package/dist/client-BUGIS__1.js +1051 -0
- package/dist/client-BVZtq_rQ.d.ts +34 -0
- package/dist/client-BYaOGCOG.js +84 -0
- package/dist/client-BfgwocyT.js +155 -0
- package/dist/client-BpS8a6Fm.js +51 -0
- package/dist/client-BxnLb9bz.d.ts +58 -0
- package/dist/client-BzCv4kKE.js +65 -0
- package/dist/client-C-2ajnhM.js +89 -0
- package/dist/client-C5mUEb2n.js +55 -0
- package/dist/client-C9QrWrnt.js +209 -0
- package/dist/client-CFdMJ1h9.d.ts +277 -0
- package/dist/client-CHmjaI0j.d.ts +103 -0
- package/dist/client-CWs3X4g1.js +120 -0
- package/dist/client-Cdedx_lw.js +438 -0
- package/dist/client-CiGjS6us.js +169 -0
- package/dist/client-CilSKXNu.js +288 -0
- package/dist/client-ClZ0D-if.d.ts +162 -0
- package/dist/client-Cmensu7l.d.ts +419 -0
- package/dist/client-Co6BPmvr.d.ts +108 -0
- package/dist/client-CoVGPi0c.js +133 -0
- package/dist/client-CvITjt-9.js +310 -0
- package/dist/client-CzI4QpG3.d.ts +131 -0
- package/dist/client-D5CZ2a34.d.ts +455 -0
- package/dist/client-DAHsEOVV.d.ts +155 -0
- package/dist/client-DG7FwgZD.js +104 -0
- package/dist/client-DIrCmOXz.d.ts +157 -0
- package/dist/client-DNq8xYb-.js +52 -0
- package/dist/client-DdfSIZ3M.d.ts +107 -0
- package/dist/client-DjTRlN3a.d.ts +68 -0
- package/dist/client-Ezlbskjq.js +60 -0
- package/dist/client-LLmgiCwJ.d.ts +135 -0
- package/dist/client-Lx3mlvKO.d.ts +100 -0
- package/dist/client-PGRk3DGz.js +98 -0
- package/dist/client-Tc47rlSe.d.ts +350 -0
- package/dist/client-VvY0K3wr.d.ts +59 -0
- package/dist/client-WAdEBBrH.d.ts +65 -0
- package/dist/client-WHeWTNVL.d.ts +130 -0
- package/dist/client-WgrPIHH-.js +213 -0
- package/dist/client-ZTtSV3l8.js +40 -0
- package/dist/client-b2_GjzzD.js +438 -0
- package/dist/client-ckXfdy1k.js +38 -0
- package/dist/client-e-hFkLUf.d.ts +34 -0
- package/dist/client-hyP_nS5R.d.ts +218 -0
- package/dist/client-i8glKhxh.js +67 -0
- package/dist/client-iDLLvGR4.d.ts +52 -0
- package/dist/client-pxjbgOz6.js +376 -0
- package/dist/client-xkSCp9hN.d.ts +101 -0
- package/dist/client-ysNShuJZ.d.ts +39 -0
- package/dist/clone-dN9XOL1K.js +29 -0
- package/dist/cloud-event-5rCEzIgK.d.ts +64 -0
- package/dist/cloud-event-CTh9Sr5w.js +60 -0
- package/dist/codecs-Bm46sVxr.d.ts +215 -0
- package/dist/codecs-YAekuQ08.js +358 -0
- package/dist/codegen-DeoSt1mi.d.ts +1571 -0
- package/dist/comments-D7sbd0xG.js +230 -0
- package/dist/commerce/index.d.ts +211 -0
- package/dist/commerce/index.js +517 -0
- package/dist/compiler-BVxepAY0.d.ts +14 -0
- package/dist/compose-Djntdacs.js +53 -0
- package/dist/composite-M6zPs1Xm.js +130 -0
- package/dist/composite-djtGy6bz.d.ts +67 -0
- package/dist/config/index.d.ts +7 -6
- package/dist/config/index.js +7 -4
- package/dist/config-BA1K4OPk.js +557 -0
- package/dist/config-C4MozTD7.js +3892 -0
- package/dist/connector-Cp8CqssJ.d.ts +107 -0
- package/dist/connectors-CjD-R2ks.d.ts +141 -0
- package/dist/context-1sSWcd7_.d.ts +365 -0
- package/dist/context-B8_p3MXo.js +11 -0
- package/dist/context-BDDgjoxz.js +41 -0
- package/dist/context-C-bHOtoD.js +5 -0
- package/dist/context-D6ZMKc2L.js +19 -0
- package/dist/context-wDKxSl9x.js +9 -0
- package/dist/controller-D6NyNrlZ.js +79 -0
- package/dist/controller-D845qKh2.d.ts +46 -0
- package/dist/credentials/index.d.ts +15 -5
- package/dist/credentials/index.js +17 -17
- package/dist/cron-CUaKTjWC.js +145 -0
- package/dist/cron-route-CoL-By8Z.js +24 -0
- package/dist/csv-CVfXqaAu.js +89 -0
- package/dist/csv-D3eKxV1T.d.ts +28 -0
- package/dist/define-B2ln373W.js +1896 -0
- package/dist/define-DxHHbNEb.d.ts +1005 -0
- package/dist/define-block-B6Gjs57G.js +52 -0
- package/dist/define-block-CLZMEFeK.d.ts +256 -0
- package/dist/delegation-Dt8hMJWu.js +140 -0
- package/dist/delivery-B1mKaOen.js +30 -0
- package/dist/delivery-BeHgwS3k.d.ts +69 -0
- package/dist/documents-CWn2mtYf.d.ts +96 -0
- package/dist/edge/index.d.ts +68 -13
- package/dist/edge/index.js +75 -43
- package/dist/elysia/index.d.ts +1 -1
- package/dist/elysia/index.js +2 -2
- package/dist/email-BcmbIWOX.d.ts +42 -0
- package/dist/embeddings-C2S14foD.d.ts +78 -0
- package/dist/embeddings-CVeOoufZ.js +128 -0
- package/dist/ended-nIdGCHxk.d.ts +70 -0
- package/dist/entitlements-BvU5dLpW.js +45 -0
- package/dist/entitlements-CbzCKalR.d.ts +53 -0
- package/dist/env/index.d.ts +1 -1
- package/dist/env/index.js +12 -5
- package/dist/envelope-CHYk5MXU.js +90 -0
- package/dist/errors-8i6tSICm.js +301 -0
- package/dist/errors-PIpcoe4z.js +44 -0
- package/dist/escape-like-AUEPn-C5.d.ts +15 -0
- package/dist/eve/index.d.ts +5 -5
- package/dist/eve/index.js +11 -17
- package/dist/eve-DUF70Vgi.d.ts +151 -0
- package/dist/event-calendar-DJXXMJ3x.d.ts +217 -0
- package/dist/event-map-Dy2vKHai.js +19 -0
- package/dist/events/index.d.ts +4 -4
- package/dist/events/index.js +16 -8
- package/dist/events-CTreRrgP.d.ts +800 -0
- package/dist/events-xbpHkcK9.js +82 -0
- package/dist/executor-BBHgjUJu.d.ts +39 -0
- package/dist/executor-BINiCFNp.d.ts +95 -0
- package/dist/executor-BXSHYyW2.js +735 -0
- package/dist/executor-D1kYY5BA.js +206 -0
- package/dist/executor-D3K3tycZ.js +147 -0
- package/dist/executor-DKrZr3AC.d.ts +174 -0
- package/dist/executor-DoE-5iM8.d.ts +272 -0
- package/dist/expo/index.d.ts +4 -4
- package/dist/expo/index.js +7 -7
- package/dist/expo-sqlite/index.d.ts +3 -3
- package/dist/expo-sqlite/index.js +2 -2
- package/dist/extra-CGQ2_q3S.js +10 -0
- package/dist/field-errors-CWXN_h_E.d.ts +113 -0
- package/dist/field-errors-DZVRWRkf.js +13 -0
- package/dist/field-formats-Cif5gr7c.js +102 -0
- package/dist/field-formats-DCvOQlOy.d.ts +39 -0
- package/dist/filter-evaluate-C0ULNfS7.js +214 -0
- package/dist/filter-evaluate-CjcFq0RT.d.ts +34 -0
- package/dist/filter-query-B3lhckKX.js +518 -0
- package/dist/filter-query-BKmRYrTE.d.ts +121 -0
- package/dist/flags-D_D1jAHB.d.ts +230 -0
- package/dist/flags-XAOsdNAc.js +279 -0
- package/dist/flags-sdk/index.d.ts +143 -0
- package/dist/flags-sdk/index.js +175 -0
- package/dist/form-definition-sagoefQr.d.ts +95 -0
- package/dist/format-CNwSjXUU.d.ts +70 -0
- package/dist/framework-DG5Bv39u.d.ts +26 -0
- package/dist/framework-INbjMZX1.js +51 -0
- package/dist/function-contract-B4c0XuTU.d.ts +21 -0
- package/dist/function-contract-DmkBg19r.js +5 -0
- package/dist/gateway-Cup00l0w.d.ts +109 -0
- package/dist/gateway-options-ClvvfuuU.d.ts +29 -0
- package/dist/gateway-options-DcLcWL5_.js +27 -0
- package/dist/graph-Cs28bOlK.js +360 -0
- package/dist/groups-CxonH3u5.js +16 -0
- package/dist/guards-6F2bCtQR.js +12 -0
- package/dist/h3/index.d.ts +7 -3
- package/dist/h3/index.js +3 -3
- package/dist/h3/v1/index.d.ts +1 -1
- package/dist/h3/v1/index.js +2 -2
- package/dist/history-GH1HJWQV.js +271 -0
- package/dist/hmac-DCud0myt.js +22 -0
- package/dist/hono/index.d.ts +33 -14
- package/dist/hono/index.js +58 -25
- package/dist/http-BF-V0CUF.js +25 -0
- package/dist/impersonation-CDeCzZP6.js +62 -0
- package/dist/impersonation-D5chOkrO.d.ts +25 -0
- package/dist/inbox-3ql4phyr.d.ts +400 -0
- package/dist/index-BIi8i6BO.d.ts +97 -0
- package/dist/index-BkzNUPId.d.ts +131 -0
- package/dist/index-BlqrGvb3.d.ts +227 -0
- package/dist/index-Brhm22eL.d.ts +138 -0
- package/dist/index-Bvw9r94Q.d.ts +245 -0
- package/dist/index-CETRk4YO.d.ts +82 -0
- package/dist/index-CrZitvSC.d.ts +258 -0
- package/dist/index-DfVXx4Ia.d.ts +202 -0
- package/dist/index-DygICr8c.d.ts +206 -0
- package/dist/index-Ej8XQ9w9.d.ts +58 -0
- package/dist/index-jhqhynmh.d.ts +58 -0
- package/dist/index.d.ts +90 -15
- package/dist/index.js +16 -14
- package/dist/iso4217-A8ev-CNW.js +176 -0
- package/dist/json-schema-CpYINXG8.js +548 -0
- package/dist/jws-35a8VhFV.d.ts +60 -0
- package/dist/jws-milwSg7E.js +191 -0
- package/dist/kit-D5S7KNFe.d.ts +66 -0
- package/dist/kit-MUK34-ZG.js +104 -0
- package/dist/knowledge-BXQ2-V0a.d.ts +187 -0
- package/dist/knowledge-CJ_Mm3ic.js +272 -0
- package/dist/lint/index.js +9 -9
- package/dist/list/index.d.ts +4 -3
- package/dist/list/index.js +4 -2
- package/dist/list-query-CBXNfJt4.js +549 -0
- package/dist/list-query-PvP3pPGQ.d.ts +194 -0
- package/dist/live-DwDreq1n.js +239 -0
- package/dist/mcp/index.d.ts +67 -20
- package/dist/mcp/index.js +220 -135
- package/dist/mcp/sdk/index.d.ts +38 -6
- package/dist/mcp/sdk/index.js +89 -7
- package/dist/message-B0fNJgq8.d.ts +93 -0
- package/dist/messages-Cx4ttLJJ.js +493 -0
- package/dist/metric-definition-95HFoW1V.d.ts +70 -0
- package/dist/metric-definition-BjxVn4R5.js +117 -0
- package/dist/mfa-DtflCXEt.d.ts +30 -0
- package/dist/model-lUafmeBQ.d.ts +311 -0
- package/dist/model-messages-CTu-6kBu.js +206 -0
- package/dist/model-messages-D4GZllOD.d.ts +34 -0
- package/dist/money-95Rff2vT.js +185 -0
- package/dist/money-DFpWzQvk.d.ts +76 -0
- package/dist/money-codec-C_-K5ZUU.js +41 -0
- package/dist/nestjs/index.d.ts +2 -2
- package/dist/nestjs/index.js +2 -2
- package/dist/next/index.d.ts +115 -55
- package/dist/next/index.js +208 -173
- package/dist/node/index.d.ts +2 -2
- package/dist/node/index.js +3 -3
- package/dist/nuxt/index.d.ts +2 -2
- package/dist/nuxt/index.js +3 -2
- package/dist/onboarding-BZvLLPaY.js +68 -0
- package/dist/openapi/index.d.ts +4 -2
- package/dist/openapi/index.js +21 -343
- package/dist/operations-C9-UcReN.d.ts +6 -0
- package/dist/operations-CsIfMED7.js +29 -0
- package/dist/optional-peer-Dx8TaYXw.js +29 -0
- package/dist/options-B0FcEKtH.js +5 -0
- package/dist/options-B5BU2Yg7.js +11 -0
- package/dist/options-B5woz53h.js +5 -0
- package/dist/options-B7EJaOX-.js +5 -0
- package/dist/options-B9q8CROT.js +9 -0
- package/dist/options-BA6jV6py.js +10 -0
- package/dist/options-BAW2ZlZ8.js +8 -0
- package/dist/options-BMjcVuaI.js +82 -0
- package/dist/options-BOOEzor9.js +5 -0
- package/dist/options-BQ07tTYr.js +11 -0
- package/dist/options-BZsoPJGX.js +5 -0
- package/dist/options-BesyRBnM.js +16 -0
- package/dist/options-Bf96aVk5.js +10 -0
- package/dist/options-BlOPivzq.js +8 -0
- package/dist/options-Blg8lAkz.js +9 -0
- package/dist/options-Bn4cu0gt.js +5 -0
- package/dist/options-BnoJOwXK.js +8 -0
- package/dist/options-Bp7sgKvl.js +30 -0
- package/dist/options-BqO9GYig.js +311 -0
- package/dist/options-BxcFLL1G.js +8 -0
- package/dist/options-C1HR4UZd.js +13 -0
- package/dist/options-C239TLRF.js +14 -0
- package/dist/options-C2HesT4A.js +9 -0
- package/dist/options-C3EzJATk.js +10 -0
- package/dist/options-C3hZ1fbC.js +10 -0
- package/dist/options-C6rEL6U5.js +8 -0
- package/dist/options-CAzVf-1T.js +8 -0
- package/dist/options-CGKSUFUq.js +5 -0
- package/dist/options-CGjGE8xS.js +12 -0
- package/dist/options-CK5WiFwG.js +11 -0
- package/dist/options-CN7PHkhU.js +8 -0
- package/dist/options-CTZNpb2n.js +5 -0
- package/dist/options-CUqQ9pm7.js +9 -0
- package/dist/options-CVSWgZpY.js +8 -0
- package/dist/options-CXFz0xxS.js +8 -0
- package/dist/options-CZk_fbbg.js +9 -0
- package/dist/options-C_pb1Nd3.js +5 -0
- package/dist/options-CbSOj53r.d.ts +52 -0
- package/dist/options-ChD15QxJ.js +9 -0
- package/dist/options-CkScQRJR.js +12 -0
- package/dist/options-CljDnQt2.js +25 -0
- package/dist/options-CmraJhd9.js +5 -0
- package/dist/options-CoX6VKGb.js +8 -0
- package/dist/options-CrC78Tee.js +5 -0
- package/dist/options-Ctac2R0Q.js +11 -0
- package/dist/options-CyD7OObW.js +17 -0
- package/dist/options-D1blDihM.js +9 -0
- package/dist/options-D2Gd6VfS.js +8 -0
- package/dist/options-D2d1fFuw.js +11 -0
- package/dist/options-D40CQzji.js +8 -0
- package/dist/options-D7f2VKzj.js +25 -0
- package/dist/options-DARkpk2P.js +8 -0
- package/dist/options-DCduTMST.js +17 -0
- package/dist/options-DDzggjN7.js +8 -0
- package/dist/options-DMR68VAC.js +5 -0
- package/dist/options-DNKyN5uq.js +20 -0
- package/dist/options-DTDxFT6J.js +13 -0
- package/dist/options-DWpz3V3F.js +8 -0
- package/dist/options-DXqcJyOP.js +10 -0
- package/dist/options-DYBQ973I.js +8 -0
- package/dist/options-Dh4wu9Ks.js +15 -0
- package/dist/options-Dmg1Da9P.js +25 -0
- package/dist/options-DsUgamiy.js +5 -0
- package/dist/options-EsUh744F.js +13 -0
- package/dist/options-Fz6xqu-b.js +5 -0
- package/dist/options-HSv8R6h5.js +13 -0
- package/dist/options-I8zVkB_y.js +8 -0
- package/dist/options-MHhjOoWz.js +5 -0
- package/dist/options-MLxMkd5B.js +11 -0
- package/dist/options-OJ5zmgr8.js +10 -0
- package/dist/options-QKP9FFcK.js +8 -0
- package/dist/options-SViK_2x2.js +12 -0
- package/dist/options-XgfTctbI.js +5 -0
- package/dist/options-_9arpsX9.js +11 -0
- package/dist/options-eBPsk4WI.js +11 -0
- package/dist/options-kLKILdIu.js +10 -0
- package/dist/options-n22NK3PL.js +8 -0
- package/dist/options-oeAq4Ho5.js +12 -0
- package/dist/options-qU8vgxhO.js +18 -0
- package/dist/options-vXMBEWSH.js +5 -0
- package/dist/options-wFnK3qWl.js +9 -0
- package/dist/options-xVAy3UsV.js +9 -0
- package/dist/organizations-Cw7om8uk.js +398 -0
- package/dist/orpc/index.d.ts +26 -10
- package/dist/orpc/index.js +66 -44
- package/dist/otel/index.d.ts +3 -3
- package/dist/otel/index.js +42 -7
- package/dist/outbox-BTeqjbum.d.ts +181 -0
- package/dist/overlay/index.d.ts +233 -0
- package/dist/overlay/index.js +554 -0
- package/dist/payments-h45bswA-.js +16 -0
- package/dist/pg-error-BV_X8Isq.js +26 -0
- package/dist/plugin-CDLJRFFg.d.ts +190 -0
- package/dist/plugins/actor/index.d.ts +1 -1
- package/dist/plugins/actor/index.js +1 -1
- package/dist/plugins/rules/index.d.ts +2 -2
- package/dist/plugins/rules/index.js +2 -2
- package/dist/plugins/soft-delete/index.d.ts +3 -3
- package/dist/plugins/soft-delete/index.js +11 -4
- package/dist/plugins/tenant/index.d.ts +9 -3
- package/dist/plugins/tenant/index.js +17 -3
- package/dist/plugins/timestamps/index.d.ts +1 -1
- package/dist/plugins/timestamps/index.js +8 -1
- package/dist/plugins/validation/index.d.ts +2 -2
- package/dist/plugins/validation/index.js +4 -4
- package/dist/pool-CwOCsX9e.d.ts +114 -0
- package/dist/pool-errors-GMjlCN0d.js +27 -0
- package/dist/ports-Ca63W4cW.d.ts +285 -0
- package/dist/ports-DAdQyjZz.d.ts +86 -0
- package/dist/ports-DGK3KTDH.js +133 -0
- package/dist/postgres/index.d.ts +28 -6
- package/dist/postgres/index.js +54 -22
- package/dist/postgrest-Cw9Bs5gm.d.ts +53 -0
- package/dist/powersync/index.d.ts +5 -5
- package/dist/powersync/index.js +4 -4
- package/dist/powersync/react/index.d.ts +8 -3
- package/dist/powersync/react/index.js +11 -3
- package/dist/preset/index.d.ts +352 -0
- package/dist/preset/index.js +564 -0
- package/dist/problem-CEjyhV5T.d.ts +76 -0
- package/dist/problem-pIiL3WbE.js +159 -0
- package/dist/provider-9gBq9W6k.d.ts +113 -0
- package/dist/provider-DKh2xFZb.js +57 -0
- package/dist/push-token-D6REHMMw.js +16 -0
- package/dist/push-token-asrmi7-6.d.ts +24 -0
- package/dist/query/index.d.ts +2 -2
- package/dist/query/index.js +1 -1
- package/dist/query-Ctz-qKRx.js +303 -0
- package/dist/range-DwpWe8e7.js +7 -0
- package/dist/range-p5V4rBhZ.d.ts +8 -0
- package/dist/rank-keys-DcPMt_Jk.js +60 -0
- package/dist/rank-result-DS8IoLup.js +18 -0
- package/dist/rank-result-Dngpt2n5.d.ts +14 -0
- package/dist/rate-limit--QSiFA6D.js +325 -0
- package/dist/rate-limit-BtbddDnE.js +49 -0
- package/dist/rate-limit-C88MEAOm.d.ts +41 -0
- package/dist/ratelimit-headers-Bsxx0Tj2.js +62 -0
- package/dist/react/index.d.ts +9 -9
- package/dist/react/index.js +4 -5
- package/dist/react/native/index.d.ts +1 -1
- package/dist/react/native/index.js +2 -2
- package/dist/react/server.d.ts +10 -10
- package/dist/react/server.js +4 -4
- package/dist/react/session.d.ts +2 -2
- package/dist/react-CKXUkwPx.js +410 -0
- package/dist/react-controller-Xn-IU44p.js +40 -0
- package/dist/react-env-Cc7Vf6eb.js +13 -0
- package/dist/react-router/index.d.ts +6 -6
- package/dist/react-router/index.js +10 -12
- package/dist/read-set-GEb-i0On.js +314 -0
- package/dist/realtime/index.d.ts +8 -4
- package/dist/realtime/index.js +5 -333
- package/dist/realtime-status-D2dw1hOE.js +12 -0
- package/dist/realtime-status-DcsO00Gw.d.ts +8 -0
- package/dist/refusal-br4Ma9Cf.js +61 -0
- package/dist/refusal-oD3ISM9h.d.ts +18 -0
- package/dist/replicas-BvIL4_jL.js +94 -0
- package/dist/resolve-CAR9oaKW.js +869 -0
- package/dist/resolve-w9EpHzuM.d.ts +266 -0
- package/dist/resource-B4ka8dDH.d.ts +106 -0
- package/dist/resource-C8r5xGqY.js +463 -0
- package/dist/resource-DO4gbVi5.js +91 -0
- package/dist/resource-execute-D0yQ-8WR.d.ts +12 -0
- package/dist/resource-schemas-BJ518zFH.js +79 -0
- package/dist/resource-types-D2vEQVXI.d.ts +141 -0
- package/dist/resources-BklF-rjz.d.ts +7 -0
- package/dist/resources-BlZdLsWQ.js +64 -0
- package/dist/respond-C7I8kLK_.d.ts +93 -0
- package/dist/respond-DdhZ9Wbn.js +95 -0
- package/dist/result-BlgnMB0H.js +128 -0
- package/dist/result-Cj3yWhjH.d.ts +298 -0
- package/dist/rrule-zBh3CA1r.js +290 -0
- package/dist/rules-B0-3Iosu.js +261 -0
- package/dist/run-watch-CQRdpy-f.js +53 -0
- package/dist/sales-lines-BAk8In-Z.js +41 -0
- package/dist/sales-lines-C6gafAwg.d.ts +28 -0
- package/dist/sales-shared-DAAGwQwN.d.ts +8 -0
- package/dist/sales-shared-SblIgCgI.js +22 -0
- package/dist/scope-DgWjuXUw.js +90 -0
- package/dist/search-B6h03cAx.js +106 -0
- package/dist/search-BtoWY6n_.js +9 -0
- package/dist/server/index.d.ts +211 -43
- package/dist/server/index.js +296 -19
- package/dist/server-types-OohhIQb2.d.ts +737 -0
- package/dist/session-DiWHtYrO.d.ts +95 -0
- package/dist/settings-BXFn9zpS.js +90 -0
- package/dist/shared-BmMcMoW9.js +89 -0
- package/dist/shared-DbO3Dfms.js +14 -0
- package/dist/shared-as0EG51f.js +60 -0
- package/dist/sign-in-D0xN6E_l.js +360 -0
- package/dist/signatures-B41ApWXA.js +145 -0
- package/dist/signatures-BMdJ7neI.d.ts +43 -0
- package/dist/signers-CXt_wA9S.d.ts +385 -0
- package/dist/signing-keys-Bq9mMCTh.d.ts +90 -0
- package/dist/solid/index.d.ts +9 -18
- package/dist/solid/index.js +4 -9
- package/dist/solid-controller-DLsmrczT.js +33 -0
- package/dist/solid-controller-DqlvYFZa.d.ts +11 -0
- package/dist/solid-start/index.d.ts +8 -12
- package/dist/solid-start/index.js +10 -9
- package/dist/spec/index.d.ts +154 -0
- package/dist/spec/index.js +386 -0
- package/dist/spec-pins-Dqpml2dZ.d.ts +84 -0
- package/dist/spec-pins-S4PymRxp.js +60 -0
- package/dist/sql/index.d.ts +327 -140
- package/dist/sql/index.js +71245 -23282
- package/dist/sql-DJrXG-3Z.js +422 -0
- package/dist/sso-BDva_-4y.js +217 -0
- package/dist/sso-BN0LnMqE.d.ts +131 -0
- package/dist/ssr/index.d.ts +5 -6
- package/dist/ssr/index.js +4 -3
- package/dist/standard-B5fe2gnW.js +25 -0
- package/dist/standard-C3_AAF3g.d.ts +7 -0
- package/dist/stats-D6vkb89f.js +1128 -0
- package/dist/storage/index.d.ts +4 -6
- package/dist/storage/index.js +23 -20
- package/dist/storage-api-Cx-1iWBd.d.ts +582 -0
- package/dist/store-B5qYKsTh.d.ts +68 -0
- package/dist/streams/index.d.ts +5 -5
- package/dist/streams/index.js +6 -5
- package/dist/streams/redis/index.d.ts +1 -1
- package/dist/streams/redis/index.js +6 -12
- package/dist/stripe/index.d.ts +16 -0
- package/dist/stripe/index.js +14 -0
- package/dist/stripe-NVcNOhHy.d.ts +140 -0
- package/dist/stripe-XZrSmDTf.js +32 -0
- package/dist/subject-readers-DiePmaYP.js +46 -0
- package/dist/subject-readers-fxP5wu0s.d.ts +21 -0
- package/dist/subjects-z8VWA_lF.d.ts +69 -0
- package/dist/subscribers-Cq--DL1E.js +34 -0
- package/dist/supabase-mcp-C6tMoEjn.d.ts +43 -0
- package/dist/supabase-mcp-DomZ-amK.js +28 -0
- package/dist/support-BsKkvA92.js +522 -0
- package/dist/support-view-BbcZR7Io.d.ts +17 -0
- package/dist/svelte/index.d.ts +8 -17
- package/dist/svelte/index.js +3 -3
- package/dist/svelte-controller-CDAujo-_.js +50 -0
- package/dist/svelte-controller-DxxHEHxD.d.ts +10 -0
- package/dist/sveltekit/index.d.ts +11 -13
- package/dist/sveltekit/index.js +12 -14
- package/dist/table-schema-pQlER3jj.js +283 -0
- package/dist/tags-Dw8vKkcI.d.ts +30 -0
- package/dist/tags-PaG0Ns_9.js +84 -0
- package/dist/tanstack-db/index.d.ts +2 -2
- package/dist/tanstack-db/index.js +1 -1
- package/dist/tanstack-db/supabase/index.d.ts +51 -0
- package/dist/tanstack-db/supabase/index.js +268 -0
- package/dist/tanstack-start/index.d.ts +7 -7
- package/dist/tanstack-start/index.js +9 -13
- package/dist/tax-DDZUB_oc.d.ts +273 -0
- package/dist/tax-D_kSCdWU.js +140 -0
- package/dist/tee-Bsisfd7t.js +101 -0
- package/dist/template-DdgYjIZ5.js +123 -0
- package/dist/temporal-CB5Fpo5d.js +79 -0
- package/dist/temporal-required-DqRzr7i0.js +20 -0
- package/dist/tenant-B-fiItlJ.js +27 -0
- package/dist/tenant-DdmVhsff.d.ts +17 -0
- package/dist/tenant-naming-Bsj3Uvap.js +27 -0
- package/dist/testing/index.d.ts +459 -125
- package/dist/testing/index.js +2368 -720
- package/dist/timing-BMCWgpdZ.js +92 -0
- package/dist/topic-ByDz9edV.js +542 -0
- package/dist/topic-cMS7UtM1.d.ts +359 -0
- package/dist/ttl-cache-XzZ-Q2eX.js +29 -0
- package/dist/types-6oiy6rIa.d.ts +205 -0
- package/dist/types-BRTSpOIh.js +5 -0
- package/dist/types-CdP0z5tS.d.ts +564 -0
- package/dist/types-D0W4fnsc.d.ts +162 -0
- package/dist/types-R6syp1el.js +29 -0
- package/dist/types-YfwpIE-d.d.ts +357 -0
- package/dist/types-pNY_UpDs.d.ts +240 -0
- package/dist/types-vaoP9S9_.d.ts +635 -0
- package/dist/undo-CEGIRkPA.js +44 -0
- package/dist/undo-DGo0skyO.d.ts +43 -0
- package/dist/usage-CdlfuS3i.js +250 -0
- package/dist/usage-DM2rzczj.d.ts +202 -0
- package/dist/vault-tOkPLnMB.d.ts +50 -0
- package/dist/vercel-connect/index.d.ts +1 -1
- package/dist/vercel-connect/index.js +6 -12
- package/dist/verify-D63A2ALE.d.ts +142 -0
- package/dist/verify-EQcC3Khp.js +126 -0
- package/dist/version-D87ZteKy.js +4 -0
- package/dist/view-DZ63nqwt.js +105 -0
- package/dist/view-Dv0A949a.d.ts +90 -0
- package/dist/vue/index.d.ts +9 -18
- package/dist/vue/index.js +4 -17
- package/dist/vue-controller-C9tFzqAc.js +32 -0
- package/dist/vue-controller-HPfMTDa2.d.ts +11 -0
- package/dist/watch-DDuWYv0Y.d.ts +84 -0
- package/dist/watch-DT_B3CnJ.js +139 -0
- package/dist/watch-topic-EFpOIIDE.d.ts +28 -0
- package/dist/watch-topic-miuymrli.js +57 -0
- package/dist/wire-DEY0ajW9.js +45 -0
- package/dist/workflow-builder-OrglbXUh.js +681 -0
- package/dist/workflow-sdk/builder/index.d.ts +46 -15
- package/dist/workflow-sdk/builder/index.js +69 -21
- package/dist/workflow-sdk/index.d.ts +75 -2
- package/dist/workflow-sdk/index.js +83 -3
- package/dist/workflow-sdk/world/index.d.ts +51 -20
- package/dist/workflow-sdk/world/index.js +189 -128
- package/dist/workflow-sdk-BZ6qsRlY.js +243 -0
- package/dist/workflow-sdk-q8cLwW1K.d.ts +161 -0
- package/dist/workflow-sdk-world-DPMdBfzn.js +2103 -0
- package/dist/workflows-C-OvZpeg.js +282 -0
- package/dist/workflows-DFQeXDAI.d.ts +243 -0
- package/dist/yjs/index.d.ts +67 -0
- package/dist/yjs/index.js +212 -0
- package/package.json +837 -44
- package/schemas/cli-commands-v1.json +220 -0
- package/schemas/cli-result-v1.json +138 -0
- package/schemas/config-v1.json +4317 -653
- package/schemas/doctor-report-v1.json +27 -1
- package/schemas/snapshot-v2.json +271 -0
- package/schemas/spec-manifest-v1.json +95 -0
- package/skills/better-supabase/SKILL.md +19 -8
- package/skills/better-supabase/references/plugins.md +2 -2
- package/skills/better-supabase/references/troubleshooting.md +20 -20
- package/skills/better-supabase/references/ui-recipes.md +18652 -0
- package/skills/better-supabase-api/SKILL.md +14 -14
- package/skills/better-supabase-api/references/adapters.md +12 -2
- package/skills/better-supabase-api/references/ai.md +4 -4
- package/skills/better-supabase-api/references/expo.md +7 -4
- package/skills/better-supabase-api/references/powersync.md +2 -1
- package/skills/better-supabase-api/references/streams-credentials.md +8 -5
- package/skills/better-supabase-auth/SKILL.md +18 -11
- package/skills/better-supabase-auth/references/authorization-providers.md +5 -5
- package/skills/better-supabase-testing/SKILL.md +2 -2
- package/testing/act-cases.json +370 -0
- package/dist/access-sql-B0dF-SoF.js +0 -181
- package/dist/actor-CQTlc1Hh.d.ts +0 -43
- package/dist/adapter-iKgjHVPx.js +0 -1190
- package/dist/agents-CVHGd7It.d.ts +0 -94
- package/dist/ai-cache-CBWs1W0k.js +0 -80
- package/dist/ai-cache-DaDu_G5L.d.ts +0 -64
- package/dist/ai-chat-7amvXjmQ.d.ts +0 -590
- package/dist/ai-chat-B24UI962.js +0 -743
- package/dist/ai-files-CSPNswUY.js +0 -319
- package/dist/ai-tasks-Cd1HMFvB.d.ts +0 -131
- package/dist/announcements-CiyOs-xP.js +0 -107
- package/dist/announcements-ZRGnScWI.d.ts +0 -72
- package/dist/api-keys-CIjghYjV.d.ts +0 -156
- package/dist/assistant-DwdpDH1q.d.ts +0 -147
- package/dist/attributes-5dYul0u0.js +0 -13
- package/dist/authorization-BFCqamMs.d.ts +0 -172
- package/dist/base64-D2gsioCY.js +0 -42
- package/dist/before-route-CnR0C0Jr.js +0 -30
- package/dist/bind-Bu_ZNa3W.d.ts +0 -62
- package/dist/bind-l4kAvYSv.js +0 -97
- package/dist/block-events-CrT8r7Fe.js +0 -76
- package/dist/block-fields-GFkxl4dP.js +0 -49
- package/dist/block-fields-SJ6fEf3o.d.ts +0 -31
- package/dist/block-helpers-CKtbFcRv.d.ts +0 -37
- package/dist/block-helpers-DWHxHsEQ.js +0 -190
- package/dist/block-hooks-BmjMyXTa.js +0 -114
- package/dist/block-hooks-plbZ0AbJ.d.ts +0 -107
- package/dist/block-transport-BLr-ZgLc.js +0 -59
- package/dist/block-transport-DvaoPuZ9.d.ts +0 -48
- package/dist/bucket-Cl46E3jS.d.ts +0 -347
- package/dist/build-BXIzE6Xv.js +0 -689
- package/dist/channel-_2Mx1Oyu.d.ts +0 -70
- package/dist/channels-CkgQ_X60.js +0 -114
- package/dist/claims-DDBQT6BK.js +0 -61
- package/dist/cli/bin.d.ts +0 -1
- package/dist/cli/codemod-Bl_tQpHn.js +0 -491
- package/dist/cli/command-CK14fP91.js +0 -502
- package/dist/cli/config-B9HkL8nF.js +0 -2
- package/dist/cli/config-DU7EJImt.js +0 -49
- package/dist/cli/config-NiPxAmUF.js +0 -1077
- package/dist/cli/db-DOBPt660.js +0 -52
- package/dist/cli/diff-SjkO5rNr.js +0 -752
- package/dist/cli/dist-DBPdlPYK.js +0 -1112
- package/dist/cli/dist-DRAVaE6w.js +0 -842
- package/dist/cli/dist-DreZ24Sz.js +0 -129
- package/dist/cli/doctor-DJk0aeBi.js +0 -3591
- package/dist/cli/env-CJLbUVPB.js +0 -108
- package/dist/cli/env-qXgyMV6r.js +0 -511
- package/dist/cli/errors-4v4DTtda.js +0 -56
- package/dist/cli/fastest-levenshtein-CFN-lNDv.js +0 -120
- package/dist/cli/gen-CCMc39Dx.js +0 -3100
- package/dist/cli/gen-DRmzPI75.js +0 -2
- package/dist/cli/init-BHuEQrQK.js +0 -765
- package/dist/cli/introspect-DzR2nyQb.js +0 -81
- package/dist/cli/io-DI1mTdSA.js +0 -33
- package/dist/cli/jsonc-BUniUpOk.js +0 -2
- package/dist/cli/keys-BGCnnb-s.js +0 -85
- package/dist/cli/openapi-BlRJ18s3.js +0 -66
- package/dist/cli/project-DZRaBaY7.js +0 -75
- package/dist/cli/prompts-BNcNfAve.js +0 -1142
- package/dist/cli/prompts-BTYQGunc.js +0 -2
- package/dist/cli/read-sets-CETOSFx4.js +0 -223
- package/dist/cli/rolldown-runtime-BPOCksWG.js +0 -24
- package/dist/cli/run-BqDPh9UH.js +0 -361
- package/dist/cli/seed-DQzqT7LP.js +0 -100
- package/dist/cli/skills-QQs4q68J.js +0 -138
- package/dist/cli/sql-B8csQPyn.js +0 -495
- package/dist/cli/sql-layout-D6cphHT3.js +0 -69
- package/dist/cli/style-C0NFdJRL.js +0 -29
- package/dist/cli/supabase-toml-B-bIukQF.js +0 -1095
- package/dist/cli/typegen-version-DeFbtzYI.js +0 -8
- package/dist/cli/version-59gcepIG.js +0 -4
- package/dist/client-CI0Z2zWX.js +0 -277
- package/dist/clone-BfgmLU90.js +0 -21
- package/dist/cloud-event-BnmD5fb9.js +0 -46
- package/dist/cloud-event-C1JCc1bH.d.ts +0 -50
- package/dist/compiler-DY_wkj4R.d.ts +0 -14
- package/dist/compose-BIBNgAnq.js +0 -53
- package/dist/composite--yqry7uW.d.ts +0 -146
- package/dist/composite-DXVUibdi.js +0 -130
- package/dist/config-D44Y7PAv.d.ts +0 -984
- package/dist/config-Dn7F5k9A.js +0 -202
- package/dist/connector-Dv8kK0MO.d.ts +0 -107
- package/dist/connectors-CrpknU0P.d.ts +0 -120
- package/dist/context-BCrWe7ow.d.ts +0 -237
- package/dist/cron-DVPUg5k3.js +0 -145
- package/dist/csv-DCK-PT1n.js +0 -25
- package/dist/define-B-TVjC25.js +0 -1915
- package/dist/define-CJJkkr1-.d.ts +0 -980
- package/dist/embeddings-4ZvFzjsU.js +0 -127
- package/dist/embeddings-C9KGQnXt.d.ts +0 -68
- package/dist/ended-XjeGQ5XW.d.ts +0 -63
- package/dist/entitlements-BKSVGtrG.d.ts +0 -51
- package/dist/entitlements-DRl6ZJUm.js +0 -24
- package/dist/envelope-DqnYGRw7.js +0 -47
- package/dist/errors-B11Duf73.js +0 -266
- package/dist/errors-DLjJHPLK.js +0 -44
- package/dist/escape-like-ImTK0ps_.d.ts +0 -15
- package/dist/eve-gT2Fpjut.d.ts +0 -151
- package/dist/events-DWDhx77e.d.ts +0 -549
- package/dist/executor-BVBFM86G.d.ts +0 -36
- package/dist/executor-Bq28caBo.js +0 -718
- package/dist/executor-C-R4pucm.js +0 -83
- package/dist/executor-CaWigTyR.d.ts +0 -148
- package/dist/executor-DbvExCFC.d.ts +0 -30
- package/dist/executor-De1Of3m3.js +0 -523
- package/dist/executor-DvsBbNBS.d.ts +0 -261
- package/dist/field-errors-BFOa7WhB.d.ts +0 -99
- package/dist/field-errors-VF1yb8yI.js +0 -13
- package/dist/framework-BmzgK32X.d.ts +0 -25
- package/dist/framework-a7aRCIqv.js +0 -51
- package/dist/gateway-C1ssRHnf.d.ts +0 -130
- package/dist/graph-BGyLLFLX.js +0 -265
- package/dist/guards-BnzDvFrz.js +0 -10
- package/dist/history-BZih6SFP.js +0 -64
- package/dist/hooks-1BTCJsiw.js +0 -309
- package/dist/impersonation-DcqaTBHx.js +0 -148
- package/dist/inbox-i7E1ppo6.d.ts +0 -384
- package/dist/index-ACiNPN4Z.d.ts +0 -74
- package/dist/index-Bepi-Hgg.d.ts +0 -206
- package/dist/index-BkWT_uBO.d.ts +0 -51
- package/dist/index-Bxih3l0u.d.ts +0 -81
- package/dist/index-CLg87OBW.d.ts +0 -76
- package/dist/index-CaxrMD1A.d.ts +0 -1
- package/dist/index-CdZKQF98.d.ts +0 -138
- package/dist/index-CewnYSpv.d.ts +0 -267
- package/dist/index-ClmjK_o-.d.ts +0 -55
- package/dist/index-D48jVS-N.d.ts +0 -246
- package/dist/index-DQh4VCc9.d.ts +0 -98
- package/dist/index-DunNRdnT.d.ts +0 -300
- package/dist/json-schema-CvER4kgT.js +0 -502
- package/dist/keys-4MnkWTTh.js +0 -35
- package/dist/kit-CkNzZUqv.d.ts +0 -60
- package/dist/kit-Fm-Fv7q5.js +0 -78
- package/dist/knowledge-BXBbT0Tr.d.ts +0 -176
- package/dist/knowledge-CDmiMLew.js +0 -255
- package/dist/list-query-BRt-zDF7.d.ts +0 -164
- package/dist/list-query-gl808ac1.js +0 -459
- package/dist/live-CTAZQkwl.js +0 -257
- package/dist/message-CaKlqdsX.js +0 -219
- package/dist/message-CfDoR0Y6.d.ts +0 -94
- package/dist/messages-B9-5887d.js +0 -715
- package/dist/messages-DYP0sUTe.d.ts +0 -59
- package/dist/mfa-Daak8ukG.d.ts +0 -54
- package/dist/modules-DpPwzC7E.d.ts +0 -192
- package/dist/modules-dxrVK3ID.js +0 -228
- package/dist/onboarding-BZGHYJks.d.ts +0 -62
- package/dist/outbox-Cq7pPYvl.d.ts +0 -161
- package/dist/path-Cv__-OTj.d.ts +0 -17
- package/dist/plugin-FGY8UhYm.d.ts +0 -151
- package/dist/pool-CAu2nLrL.d.ts +0 -89
- package/dist/postgrest-BLVdEnfe.d.ts +0 -53
- package/dist/problem-BreOl8b8.js +0 -115
- package/dist/problem-DD8LZFjc.d.ts +0 -67
- package/dist/provider-D-UEMvSD.d.ts +0 -113
- package/dist/provider-Di3sRutW.js +0 -57
- package/dist/query-BQ-NaZon.js +0 -303
- package/dist/queue-CLJurhdy.d.ts +0 -427
- package/dist/react-F80mF4-t.js +0 -409
- package/dist/react-topic-seAWjL3_.js +0 -38
- package/dist/read-set-DuKWC9Mj.js +0 -314
- package/dist/refusal-CeJWxmkH.js +0 -61
- package/dist/refusal-DhSU2Vvr.d.ts +0 -15
- package/dist/replicas-CwrYp5Zj.js +0 -94
- package/dist/resolve-ChTYeTEl.d.ts +0 -169
- package/dist/resolve-tJZY3FEa.js +0 -697
- package/dist/resource-BsvzCMlX.js +0 -212
- package/dist/resource-IPS5xi9q.d.ts +0 -74
- package/dist/respond-BUgsXNgk.js +0 -91
- package/dist/respond-DprrgyXX.d.ts +0 -93
- package/dist/result-D7y2fT87.d.ts +0 -282
- package/dist/result-DzUbqgdW.js +0 -128
- package/dist/scope-CDHcS7dE.js +0 -90
- package/dist/search-CUWCRYKL.js +0 -9
- package/dist/server-Bh0EVSwU.d.ts +0 -558
- package/dist/session-ChiXDZdZ.d.ts +0 -72
- package/dist/shared-CBxosKK3.js +0 -75
- package/dist/shared-CxWmcyqB.js +0 -73
- package/dist/sign-in-Cb1mwv6X.js +0 -86
- package/dist/signers-4y62_VIi.d.ts +0 -166
- package/dist/spec-pins--j6mTok4.js +0 -27
- package/dist/spec-pins-C89s6DyW.d.ts +0 -27
- package/dist/standard-BK0cqJ7y.js +0 -25
- package/dist/standard-CYsm7xpT.d.ts +0 -7
- package/dist/stats-D_AD9GGu.js +0 -1123
- package/dist/store-CGjgWu5n.d.ts +0 -68
- package/dist/stripe-BMj5LtsT.js +0 -38
- package/dist/stripe-D04h-QBT.d.ts +0 -136
- package/dist/support-ig_K4PvS.js +0 -314
- package/dist/support-view-CVOJJLpc.d.ts +0 -17
- package/dist/tags-Cx-LnIQP.d.ts +0 -30
- package/dist/tee-CoEppCER.js +0 -101
- package/dist/template--jDkl3UP.js +0 -114
- package/dist/template-CwO38Do8.d.ts +0 -6
- package/dist/temporal-BJGitm-h.js +0 -79
- package/dist/temporal-required-BVvW7SYJ.js +0 -20
- package/dist/tenant-BxNFk9bx.d.ts +0 -17
- package/dist/tenant-I1TEZ_BX.js +0 -27
- package/dist/timing-CyTQPubY.js +0 -92
- package/dist/types-6BdhkmZe.d.ts +0 -340
- package/dist/types-6cYK9pbJ.js +0 -29
- package/dist/types-6rocye-y.d.ts +0 -156
- package/dist/types-AYOvcyep.d.ts +0 -359
- package/dist/types-C05bxW-W.d.ts +0 -220
- package/dist/types-DGs5L0VN.d.ts +0 -192
- package/dist/usage-CrvrL2vw.d.ts +0 -177
- package/dist/vault-wlbBhqm7.d.ts +0 -50
- package/dist/verify-DL41hbvY.js +0 -232
- package/dist/verify-DPuWngD4.d.ts +0 -172
- package/dist/version-C6OfRAIn.js +0 -4
- package/dist/view-BeFcRV6G.js +0 -99
- package/dist/view-CF7ihnkg.d.ts +0 -87
- package/dist/watch-DI34G86j.d.ts +0 -60
- package/dist/watch-Xuxrvxq-.js +0 -122
- package/dist/wire-DtZQ4sdE.js +0 -45
- package/dist/workflow-builder-DJ1oHn8g.js +0 -398
- package/dist/workflow-sdk-B3yLD6Br.d.ts +0 -98
- package/dist/workflow-sdk-C2WJ_G2O.js +0 -173
- package/dist/workflow-sdk-world-D-prir6O.js +0 -1397
- package/dist/workflows-B0j9WKPu.d.ts +0 -185
- package/dist/workflows-wu1WWBn7.js +0 -216
|
@@ -1,16 +1,23 @@
|
|
|
1
1
|
import { t as DbException } from "../../db-exception-CnWcYPxL.js";
|
|
2
|
-
import { n as dbError } from "../../errors-
|
|
3
|
-
import { s as nowInstant } from "../../temporal-
|
|
4
|
-
import { t as temporal } from "../../temporal-required-
|
|
5
|
-
import { a as ok, r as err, s as toDbError, t as AsyncResult } from "../../result-
|
|
2
|
+
import { n as dbError } from "../../errors-8i6tSICm.js";
|
|
3
|
+
import { s as nowInstant } from "../../temporal-CB5Fpo5d.js";
|
|
4
|
+
import { t as temporal } from "../../temporal-required-DqRzr7i0.js";
|
|
5
|
+
import { a as ok, r as err, s as toDbError, t as AsyncResult } from "../../result-BlgnMB0H.js";
|
|
6
|
+
import { n as isRecord } from "../../guards-6F2bCtQR.js";
|
|
6
7
|
import { n as allTenantsContext } from "../../plugin-tfXW1-qO.js";
|
|
7
|
-
import { n as validate } from "../../standard-
|
|
8
|
-
import {
|
|
8
|
+
import { n as validate } from "../../standard-B5fe2gnW.js";
|
|
9
|
+
import { o as problemResponse } from "../../problem-pIiL3WbE.js";
|
|
9
10
|
import { o as tenantFrom, s as tenantPathsFor } from "../../claims-PqzCxaTD.js";
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import { n as
|
|
11
|
+
import { t as cronRoute } from "../../cron-route-CoL-By8Z.js";
|
|
12
|
+
import { i as sqlTransport, r as rpcTransport, t as dbTransport } from "../../block-transport-G4t1umrR.js";
|
|
13
|
+
import { M as seconds, P as sleep, R as toInstant, f as errorText, g as leaseHeartbeat, j as run, n as applyTemporal, o as blockCall, s as budget, w as pageOf } from "../../block-helpers-CfG_MvDR.js";
|
|
14
|
+
import { n as periodSeconds } from "../../ratelimit-headers-Bsxx0Tj2.js";
|
|
15
|
+
import { n as nextCronRun, t as assertCron } from "../../cron-CUaKTjWC.js";
|
|
16
|
+
import { r as withBlockHooks } from "../../block-hooks-BsXncUlZ.js";
|
|
17
|
+
import { a as purgeWebhookInbox, i as createWebhookInbox, r as rateLimited, t as createRateLimit } from "../../rate-limit--QSiFA6D.js";
|
|
18
|
+
import { r as wrapPayload, t as unwrap } from "../../envelope-CHYk5MXU.js";
|
|
19
|
+
import { n as defineBlock } from "../../define-block-B6Gjs57G.js";
|
|
20
|
+
import { n as rateLimitSqlOptions, r as webhookInboxSqlOptions, t as jobsSqlOptions } from "../../options-OJ5zmgr8.js";
|
|
14
21
|
//#region src/blocks/jobs/dev.ts
|
|
15
22
|
function devDrainSecret(env, name = "CRON_SECRET") {
|
|
16
23
|
const current = env[name];
|
|
@@ -55,364 +62,6 @@ function devDrain(options) {
|
|
|
55
62
|
};
|
|
56
63
|
}
|
|
57
64
|
//#endregion
|
|
58
|
-
//#region src/blocks/jobs/jobs.ts
|
|
59
|
-
async function sha256(text) {
|
|
60
|
-
const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(text));
|
|
61
|
-
return Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
62
|
-
}
|
|
63
|
-
const AUTH_COOKIE = /^sb-.+-auth-token(?:\.\d+)?$/;
|
|
64
|
-
/** A hash of the credentials the request carries, or `''` without any. */
|
|
65
|
-
async function callerScope(request) {
|
|
66
|
-
const authorization = request.headers.get("authorization");
|
|
67
|
-
const cookies = (request.headers.get("cookie") ?? "").split(";").map((pair) => pair.trim()).filter((pair) => AUTH_COOKIE.test(pair.split("=", 1)[0] ?? "")).sort();
|
|
68
|
-
const credential = authorization ?? cookies.join(";");
|
|
69
|
-
return credential === "" ? "" : `caller:${await sha256(credential)}`;
|
|
70
|
-
}
|
|
71
|
-
/** HTTP idempotency keys (IETF `Idempotency-Key` header) over the `idempotency` SQL module. */
|
|
72
|
-
function createIdempotency(sql, options = {}) {
|
|
73
|
-
applyTemporal(options);
|
|
74
|
-
const headerName = options.header ?? "idempotency-key";
|
|
75
|
-
const format = options.problem;
|
|
76
|
-
const ttl = seconds(options.ttl ?? "24 hours");
|
|
77
|
-
const lock = seconds(options.lock ?? "1 minute");
|
|
78
|
-
const begin = (key, fingerprint, scope = "") => run(async () => {
|
|
79
|
-
const [row] = await sql.queryRaw("select * from better_supabase.begin_idempotent($1, $2, $3, $4::interval, $5::interval)", [
|
|
80
|
-
scope,
|
|
81
|
-
key,
|
|
82
|
-
fingerprint,
|
|
83
|
-
ttl,
|
|
84
|
-
lock
|
|
85
|
-
]);
|
|
86
|
-
return {
|
|
87
|
-
state: row.state,
|
|
88
|
-
status: row.status_code,
|
|
89
|
-
body: row.response,
|
|
90
|
-
holder: row.holder ?? void 0
|
|
91
|
-
};
|
|
92
|
-
});
|
|
93
|
-
const complete = (key, holder, status, body, scope = "") => run(async () => {
|
|
94
|
-
const [row] = await sql.queryRaw("select better_supabase.complete_idempotent($1, $2, $3, $4, $5) as done", [
|
|
95
|
-
scope,
|
|
96
|
-
key,
|
|
97
|
-
holder,
|
|
98
|
-
status,
|
|
99
|
-
JSON.stringify(body)
|
|
100
|
-
]);
|
|
101
|
-
return row?.done === true;
|
|
102
|
-
});
|
|
103
|
-
const release = (key, holder, scope = "") => run(async () => {
|
|
104
|
-
const [row] = await sql.queryRaw("select better_supabase.release_idempotent($1, $2, $3) as done", [
|
|
105
|
-
scope,
|
|
106
|
-
key,
|
|
107
|
-
holder
|
|
108
|
-
]);
|
|
109
|
-
return row?.done === true;
|
|
110
|
-
});
|
|
111
|
-
return {
|
|
112
|
-
begin,
|
|
113
|
-
complete,
|
|
114
|
-
release,
|
|
115
|
-
async handle(request, handler) {
|
|
116
|
-
const key = request.headers.get(headerName);
|
|
117
|
-
const instance = new URL(request.url).pathname;
|
|
118
|
-
if (!key) return options.required ? problemResponse(dbError("invalid_request", `The ${headerName} header is required`, { code: "IDEMPOTENCY_KEY_MISSING" }), {
|
|
119
|
-
instance,
|
|
120
|
-
format
|
|
121
|
-
}) : handler(request);
|
|
122
|
-
if (key.length > 255) return problemResponse(dbError("invalid_request", `The ${headerName} header is too long`, { code: "IDEMPOTENCY_KEY_INVALID" }), {
|
|
123
|
-
instance,
|
|
124
|
-
format
|
|
125
|
-
});
|
|
126
|
-
const scope = typeof options.scope === "function" ? options.scope(request) : options.scope ?? await callerScope(request);
|
|
127
|
-
const body = await request.clone().text();
|
|
128
|
-
const fingerprint = await sha256(`${request.method} ${instance}\n${body}`);
|
|
129
|
-
const started = await begin(key, fingerprint, scope);
|
|
130
|
-
if (!started.ok) return problemResponse(started.error, {
|
|
131
|
-
instance,
|
|
132
|
-
format
|
|
133
|
-
});
|
|
134
|
-
const { state, holder = "" } = started.data;
|
|
135
|
-
switch (state) {
|
|
136
|
-
case "replay": {
|
|
137
|
-
const stored = started.data.body;
|
|
138
|
-
return new Response(stored.body, {
|
|
139
|
-
status: started.data.status ?? 200,
|
|
140
|
-
headers: {
|
|
141
|
-
...stored.contentType ? { "content-type": stored.contentType } : {},
|
|
142
|
-
"idempotency-replayed": "true"
|
|
143
|
-
}
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
case "running": return problemResponse(dbError("conflict", "A request with this idempotency key is still running", { code: "IDEMPOTENCY_KEY_IN_USE" }), {
|
|
147
|
-
instance,
|
|
148
|
-
format,
|
|
149
|
-
headers: { "retry-after": "1" }
|
|
150
|
-
});
|
|
151
|
-
case "mismatch": return problemResponse(dbError("validation", "This idempotency key was used for a different request", {
|
|
152
|
-
code: "IDEMPOTENCY_KEY_REUSED",
|
|
153
|
-
issues: [{
|
|
154
|
-
message: "Use a new key for a new request",
|
|
155
|
-
path: [headerName]
|
|
156
|
-
}]
|
|
157
|
-
}), {
|
|
158
|
-
instance,
|
|
159
|
-
format
|
|
160
|
-
});
|
|
161
|
-
case "started": break;
|
|
162
|
-
default: throw new TypeError(`Unknown idempotency state ${String(state)}`);
|
|
163
|
-
}
|
|
164
|
-
let response;
|
|
165
|
-
try {
|
|
166
|
-
response = await handler(request);
|
|
167
|
-
} catch (cause) {
|
|
168
|
-
await release(key, holder, scope);
|
|
169
|
-
throw cause;
|
|
170
|
-
}
|
|
171
|
-
if (response.status >= 500) {
|
|
172
|
-
await release(key, holder, scope);
|
|
173
|
-
return response;
|
|
174
|
-
}
|
|
175
|
-
const stored = {
|
|
176
|
-
body: await response.clone().text(),
|
|
177
|
-
contentType: response.headers.get("content-type")
|
|
178
|
-
};
|
|
179
|
-
await complete(key, holder, response.status, stored, scope);
|
|
180
|
-
return response;
|
|
181
|
-
}
|
|
182
|
-
};
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* Runs `fn` while holding the lease on `key`, one holder at a time, and
|
|
186
|
-
* releases it afterwards, also when `fn` throws. `{ acquired: false }` while
|
|
187
|
-
* another holder has it. A lease that expires mid-run is taken by the next
|
|
188
|
-
* caller; call `lease.extend()` for long work.
|
|
189
|
-
*/
|
|
190
|
-
function withLease(sql, key, fn, options = {}) {
|
|
191
|
-
const scope = options.scope ?? "";
|
|
192
|
-
const ttl = options.seconds ?? 60;
|
|
193
|
-
return run(async () => {
|
|
194
|
-
const [row] = await sql.queryRaw("select better_supabase.acquire_lease($1, $2, $3) as holder", [
|
|
195
|
-
key,
|
|
196
|
-
ttl,
|
|
197
|
-
scope
|
|
198
|
-
]);
|
|
199
|
-
const holder = row?.holder;
|
|
200
|
-
if (!holder) return { acquired: false };
|
|
201
|
-
const lease = {
|
|
202
|
-
holder,
|
|
203
|
-
extend: (next = ttl) => run(async () => {
|
|
204
|
-
const [extended] = await sql.queryRaw("select better_supabase.extend_lease($1, $2, $3, $4) as done", [
|
|
205
|
-
key,
|
|
206
|
-
holder,
|
|
207
|
-
next,
|
|
208
|
-
scope
|
|
209
|
-
]);
|
|
210
|
-
return extended?.done === true;
|
|
211
|
-
})
|
|
212
|
-
};
|
|
213
|
-
try {
|
|
214
|
-
return {
|
|
215
|
-
acquired: true,
|
|
216
|
-
value: await fn(lease)
|
|
217
|
-
};
|
|
218
|
-
} finally {
|
|
219
|
-
await sql.queryRaw("select better_supabase.release_lease($1, $2, $3)", [
|
|
220
|
-
key,
|
|
221
|
-
holder,
|
|
222
|
-
scope
|
|
223
|
-
]);
|
|
224
|
-
}
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
function defaultType(payload) {
|
|
228
|
-
if (typeof payload !== "object" || payload === null) return null;
|
|
229
|
-
const type = payload.type;
|
|
230
|
-
return typeof type === "string" ? type : null;
|
|
231
|
-
}
|
|
232
|
-
/** Store-then-process webhooks: acknowledge fast, process with retries, never twice. */
|
|
233
|
-
function createWebhookInbox(sql, options) {
|
|
234
|
-
applyTemporal(options);
|
|
235
|
-
const worker = options.worker ?? workerId();
|
|
236
|
-
const format = options.problem;
|
|
237
|
-
const maxAttempts = options.maxAttempts ?? 8;
|
|
238
|
-
if (!Number.isInteger(maxAttempts) || maxAttempts < 1) throw new TypeError(`createWebhookInbox maxAttempts must be a positive integer, not ${String(maxAttempts)}`);
|
|
239
|
-
const maxBodyBytes = options.maxBodyBytes ?? 1048576;
|
|
240
|
-
if (!Number.isInteger(maxBodyBytes) || maxBodyBytes < 1) throw new TypeError(`createWebhookInbox maxBodyBytes must be a positive integer, not ${String(maxBodyBytes)}`);
|
|
241
|
-
const verified = async (request, body) => {
|
|
242
|
-
if (options.verify) return options.verify(request, body);
|
|
243
|
-
const result = await verifyWebhook({
|
|
244
|
-
headers: request.headers,
|
|
245
|
-
body
|
|
246
|
-
}, options.secrets ?? []);
|
|
247
|
-
return result.ok ? ok({
|
|
248
|
-
id: result.data.id,
|
|
249
|
-
payload: result.data.payload
|
|
250
|
-
}) : result;
|
|
251
|
-
};
|
|
252
|
-
const save = (event) => run(async () => {
|
|
253
|
-
const [row] = await sql.queryRaw("select * from better_supabase.receive_webhook($1, $2, $3, $4, $5, $6, $7)", [
|
|
254
|
-
options.source,
|
|
255
|
-
event.id,
|
|
256
|
-
event.type === void 0 ? (options.typeOf ?? defaultType)(event.payload) : event.type,
|
|
257
|
-
JSON.stringify(event.payload),
|
|
258
|
-
JSON.stringify(event.headers ?? {}),
|
|
259
|
-
(event.tenant === void 0 ? options.tenantOf?.(event.payload) : event.tenant) ?? null,
|
|
260
|
-
maxAttempts
|
|
261
|
-
]);
|
|
262
|
-
return {
|
|
263
|
-
id: Number(row.id),
|
|
264
|
-
duplicate: row.duplicate
|
|
265
|
-
};
|
|
266
|
-
});
|
|
267
|
-
return {
|
|
268
|
-
store: save,
|
|
269
|
-
list: (listOptions) => run(async () => {
|
|
270
|
-
return (await sql.queryRaw("select * from better_supabase.list_webhooks($1, $2, $3, $4)", [
|
|
271
|
-
listOptions.tenant,
|
|
272
|
-
options.source,
|
|
273
|
-
listOptions.status ?? null,
|
|
274
|
-
listOptions.limit ?? 100
|
|
275
|
-
])).map((row) => ({
|
|
276
|
-
id: Number(row.id),
|
|
277
|
-
messageId: row.message_id,
|
|
278
|
-
type: row.event_type,
|
|
279
|
-
status: row.status ?? "pending",
|
|
280
|
-
attempts: row.attempts,
|
|
281
|
-
maxAttempts: row.max_attempts ?? maxAttempts,
|
|
282
|
-
lastError: row.last_error ?? null,
|
|
283
|
-
tenant: row.tenant ?? null,
|
|
284
|
-
receivedAt: toInstant(row.received_at),
|
|
285
|
-
processedAt: row.processed_at === null || row.processed_at === void 0 ? null : toInstant(row.processed_at)
|
|
286
|
-
}));
|
|
287
|
-
}),
|
|
288
|
-
purge: (purgeOptions = {}) => run(async () => {
|
|
289
|
-
const [row] = await sql.queryRaw("select better_supabase.purge_webhooks($1::interval, $2, $3, $4) as purged", [
|
|
290
|
-
seconds(purgeOptions.olderThan ?? "30 days"),
|
|
291
|
-
purgeOptions.includeDead ?? false,
|
|
292
|
-
purgeOptions.batch ?? 1e4,
|
|
293
|
-
purgeOptions.tenant ?? null
|
|
294
|
-
]);
|
|
295
|
-
return row?.purged ?? 0;
|
|
296
|
-
}),
|
|
297
|
-
async receive(request) {
|
|
298
|
-
const instance = new URL(request.url).pathname;
|
|
299
|
-
if (request.method !== "POST") return new Response(null, {
|
|
300
|
-
status: 405,
|
|
301
|
-
headers: { allow: "POST" }
|
|
302
|
-
});
|
|
303
|
-
if (!options.verify && !options.secrets) throw new TypeError(`The inbox for "${options.source}" has no \`secrets\` or \`verify\`, so it only stores events through \`store\``);
|
|
304
|
-
const body = await readBodyCapped(request.clone(), maxBodyBytes);
|
|
305
|
-
if (body === void 0) return problemResponse({
|
|
306
|
-
...dbError("invalid_input", "The body is too large", { code: "WEBHOOK_TOO_LARGE" }),
|
|
307
|
-
status: 413
|
|
308
|
-
}, {
|
|
309
|
-
instance,
|
|
310
|
-
format
|
|
311
|
-
});
|
|
312
|
-
const message = await verified(request, body);
|
|
313
|
-
if (!message.ok) return problemResponse(message.error, {
|
|
314
|
-
instance,
|
|
315
|
-
format
|
|
316
|
-
});
|
|
317
|
-
const headers = Object.fromEntries((options.keepHeaders ?? []).flatMap((name) => {
|
|
318
|
-
const value = request.headers.get(name);
|
|
319
|
-
return value === null ? [] : [[name.toLowerCase(), value]];
|
|
320
|
-
}));
|
|
321
|
-
const stored = await save({
|
|
322
|
-
id: message.data.id,
|
|
323
|
-
payload: message.data.payload,
|
|
324
|
-
headers,
|
|
325
|
-
...message.data.tenant === void 0 ? {} : { tenant: message.data.tenant }
|
|
326
|
-
});
|
|
327
|
-
if (!stored.ok) return problemResponse(stored.error, {
|
|
328
|
-
instance,
|
|
329
|
-
format
|
|
330
|
-
});
|
|
331
|
-
return Response.json(stored.data, { status: stored.data.duplicate ? 200 : 202 });
|
|
332
|
-
},
|
|
333
|
-
async process(handler, processOptions = {}) {
|
|
334
|
-
let succeeded = 0;
|
|
335
|
-
let failed = 0;
|
|
336
|
-
const lease = seconds(processOptions.lease ?? 300);
|
|
337
|
-
const deadline = processOptions.budgetMs === void 0 ? void 0 : Date.now() + processOptions.budgetMs;
|
|
338
|
-
for (;;) {
|
|
339
|
-
if (deadline !== void 0 && Date.now() >= deadline) return {
|
|
340
|
-
succeeded,
|
|
341
|
-
failed
|
|
342
|
-
};
|
|
343
|
-
const rows = await sql.queryRaw("select * from better_supabase.claim_webhooks($1, $2, $3, $4::interval)", [
|
|
344
|
-
options.source,
|
|
345
|
-
worker,
|
|
346
|
-
processOptions.batch ?? 10,
|
|
347
|
-
lease
|
|
348
|
-
]);
|
|
349
|
-
if (rows.length === 0) return {
|
|
350
|
-
succeeded,
|
|
351
|
-
failed
|
|
352
|
-
};
|
|
353
|
-
for (const row of rows) {
|
|
354
|
-
const id = Number(row.id);
|
|
355
|
-
const attempt = row.attempts;
|
|
356
|
-
const extend = async () => {
|
|
357
|
-
const [held] = await sql.queryRaw("select better_supabase.extend_webhook($1, $2, $3, $4::interval) as lease", [
|
|
358
|
-
id,
|
|
359
|
-
worker,
|
|
360
|
-
attempt,
|
|
361
|
-
lease
|
|
362
|
-
]);
|
|
363
|
-
return held?.lease ?? void 0;
|
|
364
|
-
};
|
|
365
|
-
const leaseSeconds = await extend();
|
|
366
|
-
if (leaseSeconds === void 0) continue;
|
|
367
|
-
const message = {
|
|
368
|
-
id,
|
|
369
|
-
source: row.source,
|
|
370
|
-
messageId: row.message_id,
|
|
371
|
-
type: row.event_type,
|
|
372
|
-
payload: row.payload,
|
|
373
|
-
headers: row.headers,
|
|
374
|
-
attempts: row.attempts,
|
|
375
|
-
maxAttempts: row.max_attempts ?? maxAttempts,
|
|
376
|
-
receivedAt: toInstant(row.received_at),
|
|
377
|
-
tenant: row.tenant ?? null,
|
|
378
|
-
progress: row.checkpoint ?? {},
|
|
379
|
-
async checkpoint(fields) {
|
|
380
|
-
const [saved] = await sql.queryRaw("select better_supabase.checkpoint_webhook($1, $2, $3, $4) as saved", [
|
|
381
|
-
id,
|
|
382
|
-
worker,
|
|
383
|
-
JSON.stringify(fields),
|
|
384
|
-
attempt
|
|
385
|
-
]);
|
|
386
|
-
return saved?.saved ?? false;
|
|
387
|
-
}
|
|
388
|
-
};
|
|
389
|
-
const heartbeat = setInterval(() => void extend().catch(() => void 0), Math.max(1e3, leaseSeconds * 500));
|
|
390
|
-
try {
|
|
391
|
-
const outcome = await handler(message);
|
|
392
|
-
if (typeof outcome === "object" && outcome !== null && "ok" in outcome && outcome.ok === false) throw new Error(errorText(outcome.error ?? "The handler failed"));
|
|
393
|
-
const [done] = await sql.queryRaw("select better_supabase.complete_webhook($1, $2, $3) as done", [
|
|
394
|
-
message.id,
|
|
395
|
-
worker,
|
|
396
|
-
attempt
|
|
397
|
-
]);
|
|
398
|
-
if (done?.done !== false) succeeded += 1;
|
|
399
|
-
} catch (cause) {
|
|
400
|
-
await sql.queryRaw("select better_supabase.fail_webhook($1, $2, $3, null, $4)", [
|
|
401
|
-
message.id,
|
|
402
|
-
worker,
|
|
403
|
-
errorText(cause),
|
|
404
|
-
attempt
|
|
405
|
-
]);
|
|
406
|
-
failed += 1;
|
|
407
|
-
} finally {
|
|
408
|
-
clearInterval(heartbeat);
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
};
|
|
414
|
-
}
|
|
415
|
-
//#endregion
|
|
416
65
|
//#region src/blocks/jobs/backends.ts
|
|
417
66
|
const instantOrNull = (value) => value === null ? null : toInstant(value);
|
|
418
67
|
/** Schedule times are stored to the millisecond, the precision `Date` reads back. */
|
|
@@ -421,19 +70,75 @@ const millis = (instant) => instant.round({
|
|
|
421
70
|
roundingMode: "floor"
|
|
422
71
|
});
|
|
423
72
|
/** The first run of a schedule written without one, or undefined for a cron the drain can't read. */
|
|
424
|
-
function firstRun(row) {
|
|
73
|
+
function firstRun(row, now) {
|
|
425
74
|
try {
|
|
426
|
-
return millis(nextCronRun(row.schedule, row.timezone, row.first_after ? toInstant(row.first_after) :
|
|
75
|
+
return millis(nextCronRun(row.schedule, row.timezone, row.first_after ? toInstant(row.first_after) : now()));
|
|
427
76
|
} catch {
|
|
428
77
|
return;
|
|
429
78
|
}
|
|
430
79
|
}
|
|
431
80
|
/**
|
|
81
|
+
* The due schedules among claimed rows. A row written in SQL without a next
|
|
82
|
+
* run gets its first run here; one not due yet is moved to it with `advance`.
|
|
83
|
+
*/
|
|
84
|
+
async function dueOf(rows, now, advance) {
|
|
85
|
+
const due = [];
|
|
86
|
+
for (const row of rows) {
|
|
87
|
+
const schedule = {
|
|
88
|
+
name: row.job_name,
|
|
89
|
+
cron: row.schedule,
|
|
90
|
+
timeZone: row.timezone,
|
|
91
|
+
queue: row.queue,
|
|
92
|
+
payload: row.payload
|
|
93
|
+
};
|
|
94
|
+
if (row.next_run !== null) {
|
|
95
|
+
due.push({
|
|
96
|
+
...schedule,
|
|
97
|
+
nextRun: toInstant(row.next_run)
|
|
98
|
+
});
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
const first = firstRun(row, now);
|
|
102
|
+
if (first === void 0) continue;
|
|
103
|
+
if (temporal().Instant.compare(first, now()) <= 0) due.push({
|
|
104
|
+
...schedule,
|
|
105
|
+
nextRun: first
|
|
106
|
+
});
|
|
107
|
+
else await advance(row.job_name, first);
|
|
108
|
+
}
|
|
109
|
+
return due;
|
|
110
|
+
}
|
|
111
|
+
const scheduleInfo = (row) => ({
|
|
112
|
+
name: row.job_name,
|
|
113
|
+
cron: row.schedule,
|
|
114
|
+
timeZone: row.timezone,
|
|
115
|
+
queue: row.queue,
|
|
116
|
+
tenant: row.tenant,
|
|
117
|
+
nextRun: instantOrNull(row.next_run),
|
|
118
|
+
lastRun: instantOrNull(row.last_run),
|
|
119
|
+
leasedUntil: instantOrNull(row.locked_until),
|
|
120
|
+
createdAt: instantOrNull(row.created_at)
|
|
121
|
+
});
|
|
122
|
+
const statsOf = (row) => ({
|
|
123
|
+
ready: Number(row?.ready ?? 0),
|
|
124
|
+
inFlight: Number(row?.in_flight ?? 0),
|
|
125
|
+
delayed: Number(row?.delayed ?? 0),
|
|
126
|
+
dead: Number(row?.dead ?? 0),
|
|
127
|
+
oldestAgeSeconds: row?.oldest_age_seconds === null || row?.oldest_age_seconds === void 0 ? null : Number(row.oldest_age_seconds)
|
|
128
|
+
});
|
|
129
|
+
const onceOf = (row) => {
|
|
130
|
+
if (!row) throw new TypeError("enqueue_job_once returned no row");
|
|
131
|
+
return {
|
|
132
|
+
id: Number(row.id),
|
|
133
|
+
duplicate: row.duplicate
|
|
134
|
+
};
|
|
135
|
+
};
|
|
136
|
+
/**
|
|
432
137
|
* The `jobs` SQL module over a service SQL connection. The same
|
|
433
|
-
* functions back both `
|
|
434
|
-
* and both schedulers.
|
|
138
|
+
* functions back both `blocks.jobs.options.backend` values (pgmq and table)
|
|
139
|
+
* and both schedulers. `now` dates a schedule's first run.
|
|
435
140
|
*/
|
|
436
|
-
function sqlQueueBackend(sql) {
|
|
141
|
+
function sqlQueueBackend(sql, now = nowInstant) {
|
|
437
142
|
return {
|
|
438
143
|
apiVersion: 1,
|
|
439
144
|
name: "sql",
|
|
@@ -449,6 +154,16 @@ function sqlQueueBackend(sql) {
|
|
|
449
154
|
]);
|
|
450
155
|
return Number(row.id);
|
|
451
156
|
},
|
|
157
|
+
async sendOnce(queue, payload, delay, maxAttempts, dedupeKey) {
|
|
158
|
+
const [row] = await sql.queryRaw("select * from better_supabase.enqueue_job_once($1, $2, $3, $4, $5)", [
|
|
159
|
+
queue,
|
|
160
|
+
JSON.stringify(payload ?? {}),
|
|
161
|
+
dedupeKey,
|
|
162
|
+
delay,
|
|
163
|
+
maxAttempts
|
|
164
|
+
]);
|
|
165
|
+
return onceOf(row);
|
|
166
|
+
},
|
|
452
167
|
read: (queue, lease, batch) => sql.queryRaw("select * from better_supabase.claim_jobs($1, $2, $3)", [
|
|
453
168
|
queue,
|
|
454
169
|
lease,
|
|
@@ -487,13 +202,7 @@ function sqlQueueBackend(sql) {
|
|
|
487
202
|
},
|
|
488
203
|
async stats(queue) {
|
|
489
204
|
const [row] = await sql.queryRaw("select * from better_supabase.job_queue_stats($1)", [queue]);
|
|
490
|
-
return
|
|
491
|
-
ready: Number(row?.ready ?? 0),
|
|
492
|
-
inFlight: Number(row?.in_flight ?? 0),
|
|
493
|
-
delayed: Number(row?.delayed ?? 0),
|
|
494
|
-
dead: Number(row?.dead ?? 0),
|
|
495
|
-
oldestAgeSeconds: row?.oldest_age_seconds === null || row?.oldest_age_seconds === void 0 ? null : Number(row.oldest_age_seconds)
|
|
496
|
-
};
|
|
205
|
+
return statsOf(row);
|
|
497
206
|
},
|
|
498
207
|
listDead: (queue, limit, before) => sql.queryRaw("select * from better_supabase.list_dead_jobs($1, $2, $3)", [
|
|
499
208
|
queue,
|
|
@@ -508,6 +217,15 @@ function sqlQueueBackend(sql) {
|
|
|
508
217
|
]);
|
|
509
218
|
return row?.retried ?? 0;
|
|
510
219
|
},
|
|
220
|
+
async purge(queue, args) {
|
|
221
|
+
const named = Object.entries({
|
|
222
|
+
older_than: args.olderThan,
|
|
223
|
+
batch: args.batch,
|
|
224
|
+
dead_older_than: args.deadOlderThan
|
|
225
|
+
}).filter(([, value]) => value !== void 0);
|
|
226
|
+
const [row] = await sql.queryRaw(`select better_supabase.purge_job_archive(${["queue => $1", ...named.map(([name], index) => `${name} => $${String(index + 2)}`)].join(", ")}) as purged`, [queue, ...named.map(([, value]) => value)]);
|
|
227
|
+
return row?.purged ?? 0;
|
|
228
|
+
},
|
|
511
229
|
async schedule(name, cron, queue, payload, timeZone, nextRun, tenant) {
|
|
512
230
|
await sql.queryRaw("select better_supabase.schedule_job($1, $2, $3, $4, $5, $6, $7)", [
|
|
513
231
|
name,
|
|
@@ -520,17 +238,7 @@ function sqlQueueBackend(sql) {
|
|
|
520
238
|
]);
|
|
521
239
|
},
|
|
522
240
|
async listSchedules(filter) {
|
|
523
|
-
return (await sql.queryRaw("select * from better_supabase.list_schedules($1, $2)", [filter.prefix ?? null, filter.tenant ?? null])).map(
|
|
524
|
-
name: row.job_name,
|
|
525
|
-
cron: row.schedule,
|
|
526
|
-
timeZone: row.timezone,
|
|
527
|
-
queue: row.queue,
|
|
528
|
-
tenant: row.tenant,
|
|
529
|
-
nextRun: instantOrNull(row.next_run),
|
|
530
|
-
lastRun: instantOrNull(row.last_run),
|
|
531
|
-
leasedUntil: instantOrNull(row.locked_until),
|
|
532
|
-
createdAt: instantOrNull(row.created_at)
|
|
533
|
-
}));
|
|
241
|
+
return (await sql.queryRaw("select * from better_supabase.list_schedules($1, $2)", [filter.prefix ?? null, filter.tenant ?? null])).map(scheduleInfo);
|
|
534
242
|
},
|
|
535
243
|
async unscheduleTenant(tenant) {
|
|
536
244
|
const [row] = await sql.queryRaw("select better_supabase.unschedule_tenant($1) as removed", [tenant]);
|
|
@@ -541,32 +249,9 @@ function sqlQueueBackend(sql) {
|
|
|
541
249
|
return row?.done ?? false;
|
|
542
250
|
},
|
|
543
251
|
async dueSchedules(lease, batch) {
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
const schedule = {
|
|
548
|
-
name: row.job_name,
|
|
549
|
-
cron: row.schedule,
|
|
550
|
-
timeZone: row.timezone,
|
|
551
|
-
queue: row.queue,
|
|
552
|
-
payload: row.payload
|
|
553
|
-
};
|
|
554
|
-
if (row.next_run !== null) {
|
|
555
|
-
due.push({
|
|
556
|
-
...schedule,
|
|
557
|
-
nextRun: toInstant(row.next_run)
|
|
558
|
-
});
|
|
559
|
-
continue;
|
|
560
|
-
}
|
|
561
|
-
const first = firstRun(row);
|
|
562
|
-
if (first === void 0) continue;
|
|
563
|
-
if (temporal().Instant.compare(first, nowInstant()) <= 0) due.push({
|
|
564
|
-
...schedule,
|
|
565
|
-
nextRun: first
|
|
566
|
-
});
|
|
567
|
-
else await sql.queryRaw("select better_supabase.advance_schedule($1, null, $2)", [row.job_name, first.toString()]);
|
|
568
|
-
}
|
|
569
|
-
return due;
|
|
252
|
+
return dueOf(await sql.queryRaw("select * from better_supabase.claim_due_schedules($1, $2)", [lease, batch]), now, async (name, first) => {
|
|
253
|
+
await sql.queryRaw("select better_supabase.advance_schedule($1, null, $2)", [name, first.toString()]);
|
|
254
|
+
});
|
|
570
255
|
},
|
|
571
256
|
async advanceSchedule(name, ran, next) {
|
|
572
257
|
const [row] = await sql.queryRaw("select better_supabase.advance_schedule($1, $2, $3) as advanced", [
|
|
@@ -578,6 +263,142 @@ function sqlQueueBackend(sql) {
|
|
|
578
263
|
}
|
|
579
264
|
};
|
|
580
265
|
}
|
|
266
|
+
/** The named arguments of each `jobs` function, in call order. */
|
|
267
|
+
const PARAMS = {
|
|
268
|
+
enqueue_job: [
|
|
269
|
+
"queue",
|
|
270
|
+
"payload",
|
|
271
|
+
"delay",
|
|
272
|
+
"max_attempts",
|
|
273
|
+
"dedupe_key",
|
|
274
|
+
"dedupe_running"
|
|
275
|
+
],
|
|
276
|
+
enqueue_job_once: [
|
|
277
|
+
"queue",
|
|
278
|
+
"payload",
|
|
279
|
+
"dedupe_key",
|
|
280
|
+
"delay",
|
|
281
|
+
"max_attempts"
|
|
282
|
+
],
|
|
283
|
+
claim_jobs: [
|
|
284
|
+
"queue",
|
|
285
|
+
"lease",
|
|
286
|
+
"batch"
|
|
287
|
+
],
|
|
288
|
+
complete_job: [
|
|
289
|
+
"queue",
|
|
290
|
+
"job_id",
|
|
291
|
+
"attempt"
|
|
292
|
+
],
|
|
293
|
+
fail_job: [
|
|
294
|
+
"queue",
|
|
295
|
+
"job_id",
|
|
296
|
+
"attempt",
|
|
297
|
+
"error",
|
|
298
|
+
"retry_in"
|
|
299
|
+
],
|
|
300
|
+
extend_job_lease: [
|
|
301
|
+
"queue",
|
|
302
|
+
"job_id",
|
|
303
|
+
"attempt",
|
|
304
|
+
"lease"
|
|
305
|
+
],
|
|
306
|
+
replay_dead_job: ["queue", "job_id"],
|
|
307
|
+
job_queue_stats: ["queue"],
|
|
308
|
+
list_dead_jobs: [
|
|
309
|
+
"queue",
|
|
310
|
+
"max_rows",
|
|
311
|
+
"before_id"
|
|
312
|
+
],
|
|
313
|
+
retry_dead_jobs: [
|
|
314
|
+
"queue",
|
|
315
|
+
"ids",
|
|
316
|
+
"batch"
|
|
317
|
+
],
|
|
318
|
+
schedule_job: [
|
|
319
|
+
"job_name",
|
|
320
|
+
"schedule",
|
|
321
|
+
"queue",
|
|
322
|
+
"payload",
|
|
323
|
+
"timezone",
|
|
324
|
+
"next_run",
|
|
325
|
+
"tenant"
|
|
326
|
+
],
|
|
327
|
+
unschedule_job: ["job_name"],
|
|
328
|
+
list_schedules: ["name_prefix", "for_tenant"],
|
|
329
|
+
unschedule_tenant: ["tenant"],
|
|
330
|
+
claim_due_schedules: ["lease", "batch"],
|
|
331
|
+
advance_schedule: [
|
|
332
|
+
"job_name",
|
|
333
|
+
"ran",
|
|
334
|
+
"next_run"
|
|
335
|
+
],
|
|
336
|
+
purge_job_archive: [
|
|
337
|
+
"queue",
|
|
338
|
+
"older_than",
|
|
339
|
+
"batch",
|
|
340
|
+
"dead_older_than"
|
|
341
|
+
]
|
|
342
|
+
};
|
|
343
|
+
/**
|
|
344
|
+
* The rows a set-returning function answered with. PostgREST and `dbTransport`
|
|
345
|
+
* return an array; a single object is one row.
|
|
346
|
+
*/
|
|
347
|
+
function transportRows(fn, value) {
|
|
348
|
+
if (value === null || value === void 0) return [];
|
|
349
|
+
if (Array.isArray(value)) return value;
|
|
350
|
+
if (isRecord(value)) return [value];
|
|
351
|
+
throw new TypeError(`${fn} returned ${typeof value}, not rows: pass a SqlClient instead of sqlTransport for set-returning functions`);
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* The `jobs` SQL module over a `BlockTransport`, with named arguments: a
|
|
355
|
+
* service-role `rpcTransport(supabase, { schema: "api" })` reaches the
|
|
356
|
+
* wrappers `blocks.jobs.api` writes, so stats, dead letters, replays
|
|
357
|
+
* and schedules work without a direct Postgres connection. Over Postgres,
|
|
358
|
+
* pass the `SqlClient` to `createJobs` instead.
|
|
359
|
+
*/
|
|
360
|
+
function transportQueueBackend(transport, options = {}) {
|
|
361
|
+
const schema = options.schema ?? "better_supabase";
|
|
362
|
+
const now = options.now ?? nowInstant;
|
|
363
|
+
const call = (fn, ...args) => transport.call(schema, fn, Object.fromEntries(PARAMS[fn].flatMap((name, index) => index < args.length ? [[name, args[index]]] : [])));
|
|
364
|
+
const rows = async (fn, ...args) => transportRows(fn, await call(fn, ...args));
|
|
365
|
+
const bool = async (fn, ...args) => await call(fn, ...args) === true;
|
|
366
|
+
const count = async (fn, ...args) => Number(await call(fn, ...args) ?? 0);
|
|
367
|
+
const id = (value) => value === null || value === void 0 ? null : Number(value);
|
|
368
|
+
return {
|
|
369
|
+
apiVersion: 1,
|
|
370
|
+
name: "transport",
|
|
371
|
+
leases: true,
|
|
372
|
+
async send(queue, payload, delay, maxAttempts, dedupeKey, dedupe) {
|
|
373
|
+
const sent = id(await call("enqueue_job", queue, payload ?? {}, delay, maxAttempts, dedupeKey ?? null, dedupe !== "waiting"));
|
|
374
|
+
if (sent === null) throw new TypeError("enqueue_job returned no id");
|
|
375
|
+
return sent;
|
|
376
|
+
},
|
|
377
|
+
sendOnce: async (queue, payload, delay, maxAttempts, dedupeKey) => onceOf((await rows("enqueue_job_once", queue, payload ?? {}, dedupeKey, delay, maxAttempts))[0]),
|
|
378
|
+
read: (queue, lease, batch) => rows("claim_jobs", queue, lease, batch),
|
|
379
|
+
complete: (job) => bool("complete_job", job.queue, job.id, job.attempts),
|
|
380
|
+
async fail(job, error, retryIn) {
|
|
381
|
+
const status = await call("fail_job", job.queue, job.id, job.attempts, error, retryIn ?? null);
|
|
382
|
+
return status === "queued" || status === "dead" ? status : null;
|
|
383
|
+
},
|
|
384
|
+
extend: (job, lease) => bool("extend_job_lease", job.queue, job.id, job.attempts, lease),
|
|
385
|
+
replay: async (queue, jobId) => id(await call("replay_dead_job", queue, jobId)),
|
|
386
|
+
stats: async (queue) => statsOf((await rows("job_queue_stats", queue))[0]),
|
|
387
|
+
listDead: (queue, limit, before) => rows("list_dead_jobs", queue, limit, before ?? null),
|
|
388
|
+
retryDead: (queue, ids, limit) => count("retry_dead_jobs", queue, ids === void 0 ? null : [...ids], limit),
|
|
389
|
+
purge: (queue, args) => count("purge_job_archive", queue, args.olderThan, args.batch, args.deadOlderThan),
|
|
390
|
+
async schedule(name, cron, queue, payload, timeZone, nextRun, tenant) {
|
|
391
|
+
await call("schedule_job", name, cron, queue, payload ?? {}, timeZone, nextRun.toString(), tenant ?? null);
|
|
392
|
+
},
|
|
393
|
+
unschedule: (name) => bool("unschedule_job", name),
|
|
394
|
+
listSchedules: async (filter) => (await rows("list_schedules", filter.prefix ?? null, filter.tenant ?? null)).map(scheduleInfo),
|
|
395
|
+
unscheduleTenant: (tenant) => count("unschedule_tenant", tenant),
|
|
396
|
+
dueSchedules: async (lease, batch) => dueOf(await rows("claim_due_schedules", lease, batch), now, async (name, first) => {
|
|
397
|
+
await call("advance_schedule", name, null, first.toString());
|
|
398
|
+
}),
|
|
399
|
+
advanceSchedule: (name, ran, next) => bool("advance_schedule", name, ran.toString(), next.toString())
|
|
400
|
+
};
|
|
401
|
+
}
|
|
581
402
|
/** Throws for a feature the transport doesn't support. */
|
|
582
403
|
function sqlOnly(feature) {
|
|
583
404
|
throw new DbException(dbError("invalid_request", `${feature} needs a SQL connection; pgmq_public (PostgREST) does not support it`));
|
|
@@ -623,12 +444,12 @@ function pgmqPublicBackend(client) {
|
|
|
623
444
|
sleep_seconds: lease,
|
|
624
445
|
n: batch
|
|
625
446
|
});
|
|
626
|
-
const
|
|
627
|
-
|
|
447
|
+
const dead = (row) => row.read_ct > (row.message?.max_attempts ?? 5);
|
|
448
|
+
const live = rows.filter((row) => !dead(row));
|
|
449
|
+
await Promise.all(rows.filter(dead).map((row) => call("archive", {
|
|
628
450
|
queue_name: queue,
|
|
629
451
|
message_id: row.msg_id
|
|
630
|
-
});
|
|
631
|
-
else live.push(row);
|
|
452
|
+
})));
|
|
632
453
|
return live.map((row) => ({
|
|
633
454
|
id: row.msg_id,
|
|
634
455
|
attempts: row.read_ct,
|
|
@@ -649,9 +470,300 @@ function pgmqPublicBackend(client) {
|
|
|
649
470
|
};
|
|
650
471
|
}
|
|
651
472
|
//#endregion
|
|
473
|
+
//#region src/blocks/jobs/idempotency.ts
|
|
474
|
+
async function sha256(text) {
|
|
475
|
+
const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(text));
|
|
476
|
+
return Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
477
|
+
}
|
|
478
|
+
const AUTH_COOKIE = /^sb-.+-auth-token(?:\.\d+)?$/;
|
|
479
|
+
/** A hash of the credentials the request carries, or `''` without any. */
|
|
480
|
+
async function callerScope(request) {
|
|
481
|
+
const authorization = request.headers.get("authorization");
|
|
482
|
+
const cookies = (request.headers.get("cookie") ?? "").split(";").map((pair) => pair.trim()).filter((pair) => AUTH_COOKIE.test(pair.split("=", 1)[0] ?? "")).sort();
|
|
483
|
+
const credential = authorization ?? cookies.join(";");
|
|
484
|
+
return credential === "" ? "" : `caller:${await sha256(credential)}`;
|
|
485
|
+
}
|
|
486
|
+
function sqlCalls$1(sql) {
|
|
487
|
+
return {
|
|
488
|
+
begin: (scope, key, fingerprint, ttl, lock) => run(async () => {
|
|
489
|
+
const [row] = await sql.queryRaw("select * from better_supabase.begin_idempotent($1, $2, $3, $4::interval, $5::interval)", [
|
|
490
|
+
scope,
|
|
491
|
+
key,
|
|
492
|
+
fingerprint,
|
|
493
|
+
ttl,
|
|
494
|
+
lock
|
|
495
|
+
]);
|
|
496
|
+
return row;
|
|
497
|
+
}),
|
|
498
|
+
complete: (scope, key, holder, status, body) => run(async () => {
|
|
499
|
+
const [row] = await sql.queryRaw("select better_supabase.complete_idempotent($1, $2, $3, $4, $5) as done", [
|
|
500
|
+
scope,
|
|
501
|
+
key,
|
|
502
|
+
holder,
|
|
503
|
+
status,
|
|
504
|
+
JSON.stringify(body)
|
|
505
|
+
]);
|
|
506
|
+
return row?.done === true;
|
|
507
|
+
}),
|
|
508
|
+
extend: (scope, key, holder, lock) => run(async () => {
|
|
509
|
+
const [row] = await sql.queryRaw("select better_supabase.extend_idempotent($1, $2, $3, $4::interval) as done", [
|
|
510
|
+
scope,
|
|
511
|
+
key,
|
|
512
|
+
holder,
|
|
513
|
+
lock
|
|
514
|
+
]);
|
|
515
|
+
return row?.done === true;
|
|
516
|
+
}),
|
|
517
|
+
release: (scope, key, holder) => run(async () => {
|
|
518
|
+
const [row] = await sql.queryRaw("select better_supabase.release_idempotent($1, $2, $3) as done", [
|
|
519
|
+
scope,
|
|
520
|
+
key,
|
|
521
|
+
holder
|
|
522
|
+
]);
|
|
523
|
+
return row?.done === true;
|
|
524
|
+
}),
|
|
525
|
+
purge: () => run(async () => {
|
|
526
|
+
const [row] = await sql.queryRaw("select better_supabase.purge_idempotency_keys() as purged");
|
|
527
|
+
return row?.purged ?? 0;
|
|
528
|
+
})
|
|
529
|
+
};
|
|
530
|
+
}
|
|
531
|
+
function transportCalls$1(transport, schema, mappers) {
|
|
532
|
+
const call = blockCall(transport, schema, mappers);
|
|
533
|
+
return {
|
|
534
|
+
begin: (scope, key, fingerprint, ttl, lock) => call("begin_idempotent", {
|
|
535
|
+
scope,
|
|
536
|
+
key,
|
|
537
|
+
request_hash: fingerprint,
|
|
538
|
+
ttl,
|
|
539
|
+
lock
|
|
540
|
+
}, (value) => transportRows("begin_idempotent", value)[0]),
|
|
541
|
+
complete: (scope, key, holder, status, body) => call("complete_idempotent", {
|
|
542
|
+
scope,
|
|
543
|
+
key,
|
|
544
|
+
holder,
|
|
545
|
+
status_code: status,
|
|
546
|
+
response: body
|
|
547
|
+
}, (value) => value === true),
|
|
548
|
+
extend: (scope, key, holder, lock) => call("extend_idempotent", {
|
|
549
|
+
scope,
|
|
550
|
+
key,
|
|
551
|
+
holder,
|
|
552
|
+
lock
|
|
553
|
+
}, (value) => value === true),
|
|
554
|
+
release: (scope, key, holder) => call("release_idempotent", {
|
|
555
|
+
scope,
|
|
556
|
+
key,
|
|
557
|
+
holder
|
|
558
|
+
}, (value) => value === true),
|
|
559
|
+
purge: () => call("purge_idempotency_keys", {}, (value) => Number(value ?? 0))
|
|
560
|
+
};
|
|
561
|
+
}
|
|
562
|
+
/**
|
|
563
|
+
* HTTP idempotency keys (IETF `Idempotency-Key` header) over the
|
|
564
|
+
* `idempotency` SQL module: a service SQL connection, or a service-role
|
|
565
|
+
* `rpcTransport` over the wrappers `blocks.idempotency.api` writes.
|
|
566
|
+
*/
|
|
567
|
+
function createIdempotency(options) {
|
|
568
|
+
applyTemporal(options);
|
|
569
|
+
const headerName = options.header ?? "idempotency-key";
|
|
570
|
+
const format = options.problem;
|
|
571
|
+
const ttl = seconds(options.ttl ?? "24 hours");
|
|
572
|
+
const lock = seconds(options.lock ?? "1 minute");
|
|
573
|
+
const lockSeconds = periodSeconds(options.lock ?? 60) ?? 2;
|
|
574
|
+
const calls = options.transport === void 0 ? sqlCalls$1(options.sql) : transportCalls$1(options.transport, options.schema, options.mappers);
|
|
575
|
+
const hooked = withBlockHooks({
|
|
576
|
+
purge: () => calls.purge(),
|
|
577
|
+
purgeJob: () => async () => hooked.purge().orThrow(),
|
|
578
|
+
begin: (key, fingerprint, scope = "") => calls.begin(scope, key, fingerprint, ttl, lock).andThen((row) => row ? AsyncResult.ok({
|
|
579
|
+
state: row.state,
|
|
580
|
+
status: row.status_code,
|
|
581
|
+
body: row.response,
|
|
582
|
+
holder: row.holder ?? void 0
|
|
583
|
+
}) : AsyncResult.err(dbError("unexpected", "begin_idempotent returned no row"))),
|
|
584
|
+
extend: (key, holder, scope = "") => calls.extend(scope, key, holder, lock),
|
|
585
|
+
complete: (key, holder, status, body, scope = "") => calls.complete(scope, key, holder, status, body),
|
|
586
|
+
release: (key, holder, scope = "") => calls.release(scope, key, holder),
|
|
587
|
+
async handle(request, handler) {
|
|
588
|
+
const key = request.headers.get(headerName);
|
|
589
|
+
const url = new URL(request.url);
|
|
590
|
+
const instance = url.pathname;
|
|
591
|
+
if (!key) return options.required ? problemResponse(dbError("invalid_request", `The ${headerName} header is required`, { code: "IDEMPOTENCY_KEY_MISSING" }), {
|
|
592
|
+
instance,
|
|
593
|
+
format
|
|
594
|
+
}) : handler(request);
|
|
595
|
+
if (key.length > 255) return problemResponse(dbError("invalid_request", `The ${headerName} header is too long`, { code: "IDEMPOTENCY_KEY_INVALID" }), {
|
|
596
|
+
instance,
|
|
597
|
+
format
|
|
598
|
+
});
|
|
599
|
+
const scope = typeof options.scope === "function" ? options.scope(request) : options.scope ?? await callerScope(request);
|
|
600
|
+
const body = await request.clone().text();
|
|
601
|
+
const fingerprint = await sha256(`${request.method} ${instance}${url.search}\n${body}`);
|
|
602
|
+
const started = await hooked.begin(key, fingerprint, scope);
|
|
603
|
+
if (!started.ok) return problemResponse(started.error, {
|
|
604
|
+
instance,
|
|
605
|
+
format
|
|
606
|
+
});
|
|
607
|
+
const { state, holder = "" } = started.data;
|
|
608
|
+
switch (state) {
|
|
609
|
+
case "replay": {
|
|
610
|
+
const stored = started.data.body;
|
|
611
|
+
return new Response(stored.body, {
|
|
612
|
+
status: started.data.status ?? 200,
|
|
613
|
+
headers: {
|
|
614
|
+
...stored.contentType ? { "content-type": stored.contentType } : {},
|
|
615
|
+
"idempotency-replayed": "true"
|
|
616
|
+
}
|
|
617
|
+
});
|
|
618
|
+
}
|
|
619
|
+
case "running": return problemResponse(dbError("conflict", "A request with this idempotency key is still running", { code: "IDEMPOTENCY_KEY_IN_USE" }), {
|
|
620
|
+
instance,
|
|
621
|
+
format,
|
|
622
|
+
headers: { "retry-after": "1" }
|
|
623
|
+
});
|
|
624
|
+
case "mismatch": return problemResponse(dbError("validation", "This idempotency key was used for a different request", {
|
|
625
|
+
code: "IDEMPOTENCY_KEY_REUSED",
|
|
626
|
+
issues: [{
|
|
627
|
+
message: "Use a new key for a new request",
|
|
628
|
+
path: [headerName]
|
|
629
|
+
}]
|
|
630
|
+
}), {
|
|
631
|
+
instance,
|
|
632
|
+
format
|
|
633
|
+
});
|
|
634
|
+
case "started": break;
|
|
635
|
+
default: throw new TypeError(`Unknown idempotency state ${String(state)}`);
|
|
636
|
+
}
|
|
637
|
+
let renewing = true;
|
|
638
|
+
const stopHeartbeat = leaseHeartbeat(lockSeconds, () => {
|
|
639
|
+
if (!renewing) return;
|
|
640
|
+
hooked.extend(key, holder, scope).then((extended) => {
|
|
641
|
+
if (extended.ok && !extended.data) renewing = false;
|
|
642
|
+
});
|
|
643
|
+
});
|
|
644
|
+
try {
|
|
645
|
+
let response;
|
|
646
|
+
try {
|
|
647
|
+
response = await handler(request);
|
|
648
|
+
} catch (cause) {
|
|
649
|
+
await hooked.release(key, holder, scope);
|
|
650
|
+
throw cause;
|
|
651
|
+
}
|
|
652
|
+
if (response.status >= 500) {
|
|
653
|
+
await hooked.release(key, holder, scope);
|
|
654
|
+
return response;
|
|
655
|
+
}
|
|
656
|
+
const stored = {
|
|
657
|
+
body: await response.clone().text(),
|
|
658
|
+
contentType: response.headers.get("content-type")
|
|
659
|
+
};
|
|
660
|
+
const completed = await hooked.complete(key, holder, response.status, stored, scope);
|
|
661
|
+
if (!completed.ok || !completed.data) return problemResponse(completed.ok ? dbError("conflict", "The idempotency key's lock expired before the response was saved", { code: "IDEMPOTENCY_KEY_LOST" }) : completed.error, {
|
|
662
|
+
instance,
|
|
663
|
+
format,
|
|
664
|
+
headers: { "retry-after": "1" }
|
|
665
|
+
});
|
|
666
|
+
return response;
|
|
667
|
+
} finally {
|
|
668
|
+
stopHeartbeat();
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
}, options.hooks, {
|
|
672
|
+
block: "idempotency",
|
|
673
|
+
...options.logger ? { logger: options.logger } : {}
|
|
674
|
+
});
|
|
675
|
+
return hooked;
|
|
676
|
+
}
|
|
677
|
+
//#endregion
|
|
678
|
+
//#region src/blocks/jobs/lease.ts
|
|
679
|
+
function sqlCalls(sql) {
|
|
680
|
+
return {
|
|
681
|
+
async acquire(key, ttl, scope) {
|
|
682
|
+
const [row] = await sql.queryRaw("select better_supabase.acquire_lease($1, $2, $3) as holder", [
|
|
683
|
+
key,
|
|
684
|
+
ttl,
|
|
685
|
+
scope
|
|
686
|
+
]);
|
|
687
|
+
return row?.holder ?? null;
|
|
688
|
+
},
|
|
689
|
+
async extend(key, holder, ttl, scope) {
|
|
690
|
+
const [row] = await sql.queryRaw("select better_supabase.extend_lease($1, $2, $3, $4) as done", [
|
|
691
|
+
key,
|
|
692
|
+
holder,
|
|
693
|
+
ttl,
|
|
694
|
+
scope
|
|
695
|
+
]);
|
|
696
|
+
return row?.done === true;
|
|
697
|
+
},
|
|
698
|
+
async release(key, holder, scope) {
|
|
699
|
+
await sql.queryRaw("select better_supabase.release_lease($1, $2, $3)", [
|
|
700
|
+
key,
|
|
701
|
+
holder,
|
|
702
|
+
scope
|
|
703
|
+
]);
|
|
704
|
+
}
|
|
705
|
+
};
|
|
706
|
+
}
|
|
707
|
+
function transportCalls(transport, schema) {
|
|
708
|
+
return {
|
|
709
|
+
async acquire(key, ttl, scope) {
|
|
710
|
+
const holder = await transport.call(schema, "acquire_lease", {
|
|
711
|
+
key,
|
|
712
|
+
seconds: ttl,
|
|
713
|
+
scope
|
|
714
|
+
});
|
|
715
|
+
return typeof holder === "string" ? holder : null;
|
|
716
|
+
},
|
|
717
|
+
extend: async (key, holder, ttl, scope) => await transport.call(schema, "extend_lease", {
|
|
718
|
+
key,
|
|
719
|
+
holder,
|
|
720
|
+
seconds: ttl,
|
|
721
|
+
scope
|
|
722
|
+
}) === true,
|
|
723
|
+
async release(key, holder, scope) {
|
|
724
|
+
await transport.call(schema, "release_lease", {
|
|
725
|
+
key,
|
|
726
|
+
holder,
|
|
727
|
+
scope
|
|
728
|
+
});
|
|
729
|
+
}
|
|
730
|
+
};
|
|
731
|
+
}
|
|
732
|
+
/**
|
|
733
|
+
* Runs `fn` while holding the lease on `key`, one holder at a time, and
|
|
734
|
+
* releases it afterwards, also when `fn` throws. `{ acquired: false }` while
|
|
735
|
+
* another holder has it. A lease that expires mid-run is taken by the next
|
|
736
|
+
* caller; call `lease.extend()` for long work. Takes a service SQL
|
|
737
|
+
* connection, or a service-role `rpcTransport` over the wrappers
|
|
738
|
+
* `blocks.idempotency.api` writes.
|
|
739
|
+
*/
|
|
740
|
+
function withLease(source, key, fn, options = {}) {
|
|
741
|
+
const scope = options.scope ?? "";
|
|
742
|
+
const ttl = options.seconds ?? 60;
|
|
743
|
+
const calls = "call" in source ? transportCalls(source, options.schema ?? "better_supabase") : sqlCalls(source);
|
|
744
|
+
return run(async () => {
|
|
745
|
+
const holder = await calls.acquire(key, ttl, scope);
|
|
746
|
+
if (!holder) return { acquired: false };
|
|
747
|
+
const lease = {
|
|
748
|
+
holder,
|
|
749
|
+
extend: (next = ttl) => run(() => calls.extend(key, holder, next, scope))
|
|
750
|
+
};
|
|
751
|
+
try {
|
|
752
|
+
return {
|
|
753
|
+
acquired: true,
|
|
754
|
+
value: await fn(lease)
|
|
755
|
+
};
|
|
756
|
+
} finally {
|
|
757
|
+
await calls.release(key, holder, scope);
|
|
758
|
+
}
|
|
759
|
+
});
|
|
760
|
+
}
|
|
761
|
+
//#endregion
|
|
652
762
|
//#region src/blocks/jobs/queue.ts
|
|
653
763
|
/** Transient claim errors in a row a lane retries, with backoff, before the loop throws. */
|
|
654
764
|
const CLAIM_RETRIES = 3;
|
|
765
|
+
/** The abort reason of a job whose lease couldn't be extended. */
|
|
766
|
+
const LEASE_LOST = Symbol("lease lost");
|
|
655
767
|
const TRANSIENT = /* @__PURE__ */ new Set([
|
|
656
768
|
"network",
|
|
657
769
|
"timeout",
|
|
@@ -674,30 +786,48 @@ function toJob(queue, row) {
|
|
|
674
786
|
};
|
|
675
787
|
}
|
|
676
788
|
const QUEUE_NAME = /^[a-z_][a-z0-9_]{0,46}$/;
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
789
|
+
/**
|
|
790
|
+
* `transport` with every call made through `blockCall`, so a rejection is
|
|
791
|
+
* mapped to a `DbError` (with the app's `mappers` first), as in every block.
|
|
792
|
+
*/
|
|
793
|
+
function mappedTransport(transport, mappers) {
|
|
794
|
+
return { async call(schema, fn, args) {
|
|
795
|
+
const result = await blockCall(transport, schema, mappers)(fn, args, (value) => value);
|
|
796
|
+
if (!result.ok) throw new DbException(result.error);
|
|
797
|
+
return result.data;
|
|
798
|
+
} };
|
|
682
799
|
}
|
|
683
|
-
function backendOf(
|
|
684
|
-
if (
|
|
685
|
-
|
|
800
|
+
function backendOf(options, now) {
|
|
801
|
+
if (options.backend) return options.backend;
|
|
802
|
+
if (options.sql) return sqlQueueBackend(options.sql, now);
|
|
803
|
+
if (options.client && options.schema) return transportQueueBackend(mappedTransport(rpcTransport(options.client, { schema: options.schema }), options.mappers), {
|
|
804
|
+
now,
|
|
805
|
+
schema: options.schema
|
|
806
|
+
});
|
|
807
|
+
if (options.client) return pgmqPublicBackend(options.client);
|
|
808
|
+
if (options.transport) return transportQueueBackend(mappedTransport(options.transport, options.mappers), {
|
|
809
|
+
now,
|
|
810
|
+
...options.schema ? { schema: options.schema } : {}
|
|
811
|
+
});
|
|
812
|
+
throw new TypeError("createJobs needs a backend, sql, client or transport to store jobs");
|
|
686
813
|
}
|
|
687
814
|
const later = (a, b) => temporal().Instant.compare(a, b) >= 0 ? a : b;
|
|
688
815
|
/**
|
|
689
816
|
* Typed jobs on Supabase Queues (pgmq), over the `jobs` SQL module.
|
|
690
817
|
*
|
|
691
818
|
* Pass a service SQL connection (`postgres.admin`, `ctx.sql`) for the full
|
|
692
|
-
* feature set, a service-role
|
|
693
|
-
* `
|
|
694
|
-
*
|
|
695
|
-
*
|
|
819
|
+
* feature set, a service-role `rpcTransport` over the wrappers
|
|
820
|
+
* `blocks.jobs.api` writes for the same features over the Data API (or a
|
|
821
|
+
* service-role Supabase client with `schema` set to that schema), a
|
|
822
|
+
* service-role Supabase client to go through the `pgmq_public` RPCs, or any
|
|
823
|
+
* `QueueBackend`. Queue names are lowercase letters, digits and underscores.
|
|
696
824
|
*/
|
|
697
|
-
function createJobs(
|
|
825
|
+
function createJobs(options) {
|
|
698
826
|
applyTemporal(options);
|
|
827
|
+
const queues = options.queues ?? {};
|
|
828
|
+
const now = options.now ?? nowInstant;
|
|
699
829
|
for (const name of Object.keys(queues)) if (!QUEUE_NAME.test(name)) throw new TypeError(`Queue "${name}": pgmq queue names are lowercase letters, digits and underscores (at most 47)`);
|
|
700
|
-
const transport = backendOf(
|
|
830
|
+
const transport = backendOf(options, now);
|
|
701
831
|
const schemaOf = (queue) => {
|
|
702
832
|
const schema = queues[queue];
|
|
703
833
|
if (!schema) throw new TypeError(`Unknown queue "${queue}". Queues: ${Object.keys(queues).join(", ")}`);
|
|
@@ -712,12 +842,20 @@ function createJobs(source, queues, options = {}) {
|
|
|
712
842
|
/**
|
|
713
843
|
* Extends the lease of every job in `held` at half the lease, so jobs
|
|
714
844
|
* waiting their turn in a claimed batch don't expire before they run.
|
|
845
|
+
* A job whose lease can't be extended is aborted: another worker may
|
|
846
|
+
* already hold it.
|
|
715
847
|
*/
|
|
716
|
-
const heartbeat = (held, lease) => transport.leases ?
|
|
717
|
-
for (const job of held) run(() => transport.extend(job, lease))
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
848
|
+
const heartbeat = (held, lease) => transport.leases ? leaseHeartbeat(lease, () => {
|
|
849
|
+
for (const [job, controller] of held) run(() => transport.extend(job, lease)).then((extended) => {
|
|
850
|
+
if (!extended.ok || !extended.data) controller.abort(LEASE_LOST);
|
|
851
|
+
});
|
|
852
|
+
}) : void 0;
|
|
853
|
+
const leaseLost = (job, workOptions) => {
|
|
854
|
+
workOptions.onError?.(dbError("conflict", `The lease on job ${String(job.id)} in "${job.queue}" was lost, so another worker may run it`, { code: "JOB_LEASE_LOST" }), job);
|
|
855
|
+
return false;
|
|
856
|
+
};
|
|
857
|
+
const handle = async (job, handler, workOptions, controller = new AbortController()) => {
|
|
858
|
+
if (controller.signal.reason === LEASE_LOST) return leaseLost(job, workOptions);
|
|
721
859
|
try {
|
|
722
860
|
const payload = await validate(schemaOf(job.queue), job.payload, "payload");
|
|
723
861
|
if (!payload.ok) {
|
|
@@ -732,16 +870,22 @@ function createJobs(source, queues, options = {}) {
|
|
|
732
870
|
context
|
|
733
871
|
}, controller.signal);
|
|
734
872
|
if (typeof outcome === "object" && outcome !== null && "ok" in outcome && outcome.ok === false && "error" in outcome) throw outcome.error;
|
|
735
|
-
|
|
736
|
-
|
|
873
|
+
if (controller.signal.reason === LEASE_LOST) return leaseLost(job, workOptions);
|
|
874
|
+
const completed = await complete(job);
|
|
875
|
+
if (!completed.ok) {
|
|
876
|
+
workOptions.onError?.(completed.error, job);
|
|
877
|
+
return false;
|
|
878
|
+
}
|
|
879
|
+
return completed.data || leaseLost(job, workOptions);
|
|
737
880
|
} catch (cause) {
|
|
881
|
+
if (controller.signal.reason === LEASE_LOST) return leaseLost(job, workOptions);
|
|
738
882
|
controller.abort();
|
|
739
883
|
await fail(job, cause);
|
|
740
884
|
workOptions.onError?.(typeof cause === "object" && cause !== null && "kind" in cause ? cause : toDbError(cause), job);
|
|
741
885
|
return false;
|
|
742
886
|
}
|
|
743
887
|
};
|
|
744
|
-
const loop = async (queue, handler, workOptions, forever,
|
|
888
|
+
const loop = async (queue, handler, workOptions, forever, spent = budget(void 0)) => {
|
|
745
889
|
const concurrency = Math.max(1, workOptions.concurrency ?? 1);
|
|
746
890
|
const lease = workOptions.lease ?? 300;
|
|
747
891
|
const firstWait = workOptions.pollInterval ?? 1e3;
|
|
@@ -754,7 +898,7 @@ function createJobs(source, queues, options = {}) {
|
|
|
754
898
|
let wait = firstWait;
|
|
755
899
|
let misses = 0;
|
|
756
900
|
while (!signal.aborted) {
|
|
757
|
-
if (
|
|
901
|
+
if (spent.expired()) return;
|
|
758
902
|
const claimed = await claim(queue, {
|
|
759
903
|
...workOptions,
|
|
760
904
|
batch: workOptions.batch ?? 1
|
|
@@ -765,8 +909,7 @@ function createJobs(source, queues, options = {}) {
|
|
|
765
909
|
stop.abort();
|
|
766
910
|
throw new TypeError(claimed.error.message, { cause: claimed.error });
|
|
767
911
|
}
|
|
768
|
-
|
|
769
|
-
await sleep(Math.min(firstWait * 2 ** (misses - 1), left), signal);
|
|
912
|
+
await sleep(Math.min(firstWait * 2 ** (misses - 1), spent.remaining()), signal);
|
|
770
913
|
continue;
|
|
771
914
|
}
|
|
772
915
|
misses = 0;
|
|
@@ -777,16 +920,16 @@ function createJobs(source, queues, options = {}) {
|
|
|
777
920
|
continue;
|
|
778
921
|
}
|
|
779
922
|
wait = firstWait;
|
|
780
|
-
const held = new
|
|
781
|
-
const
|
|
923
|
+
const held = new Map(claimed.data.map((job) => [job, new AbortController()]));
|
|
924
|
+
const stopHeartbeat = heartbeat(held, lease);
|
|
782
925
|
try {
|
|
783
926
|
for (const job of claimed.data) {
|
|
784
|
-
if (await handle(job, handler, workOptions)) succeeded += 1;
|
|
927
|
+
if (await handle(job, handler, workOptions, held.get(job))) succeeded += 1;
|
|
785
928
|
else failed += 1;
|
|
786
929
|
held.delete(job);
|
|
787
930
|
}
|
|
788
931
|
} finally {
|
|
789
|
-
|
|
932
|
+
stopHeartbeat?.();
|
|
790
933
|
}
|
|
791
934
|
}
|
|
792
935
|
});
|
|
@@ -803,7 +946,7 @@ function createJobs(source, queues, options = {}) {
|
|
|
803
946
|
let ran = 0;
|
|
804
947
|
for (const schedule of due) {
|
|
805
948
|
await transport.send(schedule.queue, schedule.payload, 0, 5, `schedule:${schedule.name}:${schedule.nextRun.toString()}`);
|
|
806
|
-
const next = millis(nextCronRun(schedule.cron, schedule.timeZone, later(
|
|
949
|
+
const next = millis(nextCronRun(schedule.cron, schedule.timeZone, later(now(), schedule.nextRun)));
|
|
807
950
|
if (await transport.advanceSchedule(schedule.name, schedule.nextRun, next)) ran += 1;
|
|
808
951
|
}
|
|
809
952
|
return ran;
|
|
@@ -813,30 +956,77 @@ function createJobs(source, queues, options = {}) {
|
|
|
813
956
|
if (!valid.ok) return valid;
|
|
814
957
|
const timeZone = scheduleOptions.timeZone ?? "UTC";
|
|
815
958
|
try {
|
|
816
|
-
nextCronRun(cron, timeZone,
|
|
959
|
+
nextCronRun(cron, timeZone, now());
|
|
817
960
|
} catch (cause) {
|
|
818
961
|
return err(dbError("validation", errorText(cause), { issues: [{
|
|
819
962
|
message: errorText(cause),
|
|
820
963
|
path: [name, "cron"]
|
|
821
964
|
}] }));
|
|
822
965
|
}
|
|
966
|
+
const wrapped = wrapPayload(valid.data, scheduleOptions.context);
|
|
967
|
+
if (!wrapped.ok) return wrapped;
|
|
823
968
|
return ok({
|
|
824
969
|
name,
|
|
825
970
|
cron,
|
|
826
971
|
queue,
|
|
827
|
-
payload:
|
|
972
|
+
payload: wrapped.data,
|
|
828
973
|
timeZone,
|
|
829
974
|
tenant: scheduleOptions.tenant ?? (scheduleOptions.context ? tenantFrom(scheduleOptions.context, tenantPathsFor(void 0)) : void 0) ?? tenantDefault
|
|
830
975
|
});
|
|
831
976
|
};
|
|
832
|
-
const write = (prepared) => transport.schedule(prepared.name, prepared.cron, prepared.queue, prepared.payload, prepared.timeZone, millis(nextCronRun(prepared.cron, prepared.timeZone,
|
|
833
|
-
|
|
977
|
+
const write = (prepared) => transport.schedule(prepared.name, prepared.cron, prepared.queue, prepared.payload, prepared.timeZone, millis(nextCronRun(prepared.cron, prepared.timeZone, now())), prepared.tenant);
|
|
978
|
+
const purge = (purgeOptions = {}) => run(async () => {
|
|
979
|
+
if (!transport.purge) sqlOnly("purge");
|
|
980
|
+
const backendPurge = transport.purge.bind(transport);
|
|
981
|
+
const interval = (value) => value === void 0 ? void 0 : seconds(value);
|
|
982
|
+
return (await Promise.all((purgeOptions.queues ?? Object.keys(queues)).map((queue) => {
|
|
983
|
+
schemaOf(queue);
|
|
984
|
+
return backendPurge(queue, {
|
|
985
|
+
olderThan: interval(purgeOptions.olderThan),
|
|
986
|
+
deadOlderThan: interval(purgeOptions.deadOlderThan),
|
|
987
|
+
batch: purgeOptions.batch
|
|
988
|
+
});
|
|
989
|
+
}))).reduce((sum, count) => sum + count, 0);
|
|
990
|
+
});
|
|
991
|
+
const delayOf = (enqueueOptions) => {
|
|
992
|
+
const delay = enqueueOptions.delay;
|
|
993
|
+
if (delay !== void 0 && (!Number.isInteger(delay) || delay < 0)) return err(dbError("validation", "delay is a whole number of seconds", { issues: [{
|
|
994
|
+
message: "Expected a non-negative integer",
|
|
995
|
+
path: ["delay"]
|
|
996
|
+
}] }));
|
|
997
|
+
return ok(delay ?? (enqueueOptions.runAt ? Math.max(0, Math.ceil((enqueueOptions.runAt.epochMilliseconds - now().epochMilliseconds) / 1e3)) : 0));
|
|
998
|
+
};
|
|
999
|
+
/** The validated payload in its envelope, and the delay, for `enqueue` and `enqueueOnce`. */
|
|
1000
|
+
const prepareSend = async (queue, payload, enqueueOptions) => {
|
|
1001
|
+
const valid = await validate(schemaOf(queue), payload, "payload");
|
|
1002
|
+
if (!valid.ok) return valid;
|
|
1003
|
+
const delay = delayOf(enqueueOptions);
|
|
1004
|
+
if (!delay.ok) return delay;
|
|
1005
|
+
const message = wrapPayload(valid.data, enqueueOptions.context, { ...enqueueOptions.ticket === void 0 ? {} : { ticket: enqueueOptions.ticket } });
|
|
1006
|
+
if (!message.ok) return message;
|
|
1007
|
+
return ok({
|
|
1008
|
+
message: message.data,
|
|
1009
|
+
delay: delay.data
|
|
1010
|
+
});
|
|
1011
|
+
};
|
|
1012
|
+
return withBlockHooks({
|
|
834
1013
|
enqueue(queue, payload, enqueueOptions = {}) {
|
|
835
1014
|
return AsyncResult.from(async () => {
|
|
836
|
-
const
|
|
837
|
-
if (!
|
|
838
|
-
const
|
|
839
|
-
return run(() => transport.send(queue,
|
|
1015
|
+
const prepared = await prepareSend(queue, payload, enqueueOptions);
|
|
1016
|
+
if (!prepared.ok) return prepared;
|
|
1017
|
+
const { message, delay } = prepared.data;
|
|
1018
|
+
return run(() => transport.send(queue, message, delay, enqueueOptions.maxAttempts ?? 5, enqueueOptions.dedupeKey, enqueueOptions.dedupe));
|
|
1019
|
+
});
|
|
1020
|
+
},
|
|
1021
|
+
enqueueOnce(queue, payload, enqueueOptions) {
|
|
1022
|
+
return AsyncResult.from(async () => {
|
|
1023
|
+
const prepared = await prepareSend(queue, payload, enqueueOptions);
|
|
1024
|
+
if (!prepared.ok) return prepared;
|
|
1025
|
+
const { message, delay } = prepared.data;
|
|
1026
|
+
return run(() => {
|
|
1027
|
+
if (!transport.sendOnce) sqlOnly("enqueueOnce");
|
|
1028
|
+
return transport.sendOnce(queue, message, delay, enqueueOptions.maxAttempts ?? 5, enqueueOptions.dedupeKey);
|
|
1029
|
+
});
|
|
840
1030
|
});
|
|
841
1031
|
},
|
|
842
1032
|
claim,
|
|
@@ -876,6 +1066,8 @@ function createJobs(source, queues, options = {}) {
|
|
|
876
1066
|
schemaOf(queue);
|
|
877
1067
|
return transport.retryDead(queue, retryOptions.ids, retryOptions.limit ?? 1e3);
|
|
878
1068
|
}),
|
|
1069
|
+
purge,
|
|
1070
|
+
purgeJob: (purgeOptions) => async () => purge(purgeOptions).orThrow(),
|
|
879
1071
|
replay: (queue, id) => run(() => {
|
|
880
1072
|
if (!transport.replay) sqlOnly("replay");
|
|
881
1073
|
return transport.replay(queue, id);
|
|
@@ -929,23 +1121,16 @@ function createJobs(source, queues, options = {}) {
|
|
|
929
1121
|
return transport.unscheduleTenant(filter.tenant);
|
|
930
1122
|
}),
|
|
931
1123
|
runSchedules: (scheduleOptions = {}) => run(() => runSchedules(scheduleOptions)),
|
|
932
|
-
drain: (queue, handler, drainOptions = {}) => loop(queue, handler, drainOptions, false,
|
|
1124
|
+
drain: (queue, handler, drainOptions = {}) => loop(queue, handler, drainOptions, false, budget(drainOptions.budgetMs)),
|
|
933
1125
|
work: (queue, handler, workOptions = {}) => loop(queue, handler, workOptions, true),
|
|
934
1126
|
drainRoute(routeOptions) {
|
|
935
|
-
const secret = routeOptions.secret;
|
|
936
|
-
if (!secret) throw new TypeError("drainRoute needs a secret, such as process.env.CRON_SECRET");
|
|
937
1127
|
for (const queue of Object.keys(routeOptions.handlers)) schemaOf(queue);
|
|
938
|
-
return
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
if (!verifySharedSecret(request, secret)) return problemResponse(dbError("unauthorized", "The drain route needs its bearer secret"), {
|
|
945
|
-
instance,
|
|
946
|
-
format: routeOptions.problem
|
|
947
|
-
});
|
|
948
|
-
const deadline = Date.now() + (routeOptions.budgetMs ?? 5e4);
|
|
1128
|
+
return cronRoute({
|
|
1129
|
+
name: "drain",
|
|
1130
|
+
secret: routeOptions.secret,
|
|
1131
|
+
problem: routeOptions.problem
|
|
1132
|
+
}, async (request) => {
|
|
1133
|
+
const spent = budget(routeOptions.budgetMs ?? 5e4);
|
|
949
1134
|
const monitor = routeOptions.monitor;
|
|
950
1135
|
let errors = 0;
|
|
951
1136
|
const report = (cause) => {
|
|
@@ -973,9 +1158,9 @@ function createJobs(source, queues, options = {}) {
|
|
|
973
1158
|
const results = {};
|
|
974
1159
|
for (const [queue, handler] of Object.entries(routeOptions.handlers)) {
|
|
975
1160
|
if (handler === void 0) continue;
|
|
976
|
-
if (
|
|
1161
|
+
if (spent.expired()) break;
|
|
977
1162
|
try {
|
|
978
|
-
results[queue] = await loop(queue, handler, routeOptions, false,
|
|
1163
|
+
results[queue] = await loop(queue, handler, routeOptions, false, spent);
|
|
979
1164
|
} catch (cause) {
|
|
980
1165
|
report(cause);
|
|
981
1166
|
results[queue] = {
|
|
@@ -987,65 +1172,51 @@ function createJobs(source, queues, options = {}) {
|
|
|
987
1172
|
const result = {
|
|
988
1173
|
schedules: scheduled,
|
|
989
1174
|
queues: results,
|
|
990
|
-
budgetExhausted:
|
|
1175
|
+
budgetExhausted: spent.expired(),
|
|
991
1176
|
errors
|
|
992
1177
|
};
|
|
993
1178
|
if (monitor?.onFinish) await watch(() => monitor.onFinish?.(result, started));
|
|
994
1179
|
return Response.json(result);
|
|
995
|
-
};
|
|
1180
|
+
});
|
|
996
1181
|
}
|
|
997
|
-
}
|
|
1182
|
+
}, options.hooks, {
|
|
1183
|
+
block: "jobs",
|
|
1184
|
+
...options.logger ? { logger: options.logger } : {}
|
|
1185
|
+
});
|
|
998
1186
|
}
|
|
999
1187
|
//#endregion
|
|
1000
|
-
//#region src/blocks/jobs/
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
applyTemporal(options);
|
|
1010
|
-
const hit = isTransport(source) ? overTransport(blockCall(source, void 0, options.mappers)) : overSql(source);
|
|
1011
|
-
return { check: (scope, key, rule) => {
|
|
1012
|
-
if (rule !== void 0 && (!Number.isInteger(rule.max) || rule.max < 1)) return AsyncResult.err(dbError("invalid_input", "A rate limit's max must be a positive integer"));
|
|
1013
|
-
return hit(scope, key, rule?.max ?? null, rule === void 0 ? null : seconds(rule.period));
|
|
1014
|
-
} };
|
|
1015
|
-
}
|
|
1016
|
-
const overTransport = (call) => (scope, key, max, period) => call("check_rate_limit", {
|
|
1017
|
-
scope,
|
|
1018
|
-
key,
|
|
1019
|
-
max_requests: max ?? void 0,
|
|
1020
|
-
period: period ?? void 0
|
|
1021
|
-
}, (value) => {
|
|
1022
|
-
const row = isRecord(value) ? value : {};
|
|
1023
|
-
return {
|
|
1024
|
-
allowed: row["allowed"] === true,
|
|
1025
|
-
remaining: Number(row["remaining"] ?? 0),
|
|
1026
|
-
retryAfter: Number(row["retry_after"] ?? 0)
|
|
1027
|
-
};
|
|
1188
|
+
//#region src/blocks/jobs/manifest.ts
|
|
1189
|
+
/** The `jobs` block's manifest (ADR 0029). */
|
|
1190
|
+
const jobsBlock = defineBlock({
|
|
1191
|
+
name: "jobs",
|
|
1192
|
+
sql: ["jobs"],
|
|
1193
|
+
options: { jobs: jobsSqlOptions },
|
|
1194
|
+
create: createJobs,
|
|
1195
|
+
category: "automation",
|
|
1196
|
+
recipes: ["job-runs-table"]
|
|
1028
1197
|
});
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
}
|
|
1198
|
+
/** The `idempotency` block's manifest (ADR 0029). */
|
|
1199
|
+
const idempotencyBlock = defineBlock({
|
|
1200
|
+
name: "idempotency",
|
|
1201
|
+
sql: ["idempotency"],
|
|
1202
|
+
create: createIdempotency,
|
|
1203
|
+
category: "developer"
|
|
1204
|
+
});
|
|
1205
|
+
/** The `rate-limit` block's manifest (ADR 0029). */
|
|
1206
|
+
const rateLimitBlock = defineBlock({
|
|
1207
|
+
name: "rate-limit",
|
|
1208
|
+
sql: ["rate-limit"],
|
|
1209
|
+
options: { "rate-limit": rateLimitSqlOptions },
|
|
1210
|
+
create: createRateLimit,
|
|
1211
|
+
category: "developer"
|
|
1212
|
+
});
|
|
1213
|
+
/** The `webhook-inbox` block's manifest (ADR 0029). */
|
|
1214
|
+
const webhookInboxBlock = defineBlock({
|
|
1215
|
+
name: "webhook-inbox",
|
|
1216
|
+
sql: ["webhook-inbox"],
|
|
1217
|
+
options: { "webhook-inbox": webhookInboxSqlOptions },
|
|
1218
|
+
create: createWebhookInbox,
|
|
1219
|
+
category: "developer"
|
|
1041
1220
|
});
|
|
1042
|
-
/** A `problem+json` 429 with `Retry-After`, for a refused `check`. */
|
|
1043
|
-
function rateLimited(decision, options = {}) {
|
|
1044
|
-
const retryAfter = Math.max(1, Math.ceil(decision.retryAfter));
|
|
1045
|
-
return problemResponse(dbError("rate_limited", options.detail ?? `Too many requests. Retry after ${retryAfter} seconds.`, { retryAfter }), {
|
|
1046
|
-
...options.instance === void 0 ? {} : { instance: options.instance },
|
|
1047
|
-
format: options.problem
|
|
1048
|
-
});
|
|
1049
|
-
}
|
|
1050
1221
|
//#endregion
|
|
1051
|
-
export { assertCron, createIdempotency, createJobs, createRateLimit, createWebhookInbox, devDrain, devDrainSecret, nextCronRun, pgmqPublicBackend, rateLimited, sqlQueueBackend, withLease };
|
|
1222
|
+
export { assertCron, createIdempotency, createJobs, createRateLimit, createWebhookInbox, dbTransport, devDrain, devDrainSecret, idempotencyBlock, jobsBlock, nextCronRun, pgmqPublicBackend, purgeWebhookInbox, rateLimitBlock, rateLimited, rpcTransport, sqlQueueBackend, sqlTransport, transportQueueBackend, webhookInboxBlock, withLease };
|