better-supabase 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +299 -41
- package/dist/access-sql-B0dF-SoF.js +181 -0
- package/dist/actor-CQTlc1Hh.d.ts +43 -0
- package/dist/adapter-Bc1o3zyy.js +1106 -0
- package/dist/agents-CVHGd7It.d.ts +94 -0
- package/dist/ai-cache-CBWs1W0k.js +80 -0
- package/dist/ai-cache-DaDu_G5L.d.ts +64 -0
- package/dist/ai-chat-7amvXjmQ.d.ts +590 -0
- package/dist/ai-chat-B24UI962.js +743 -0
- package/dist/ai-files-CSPNswUY.js +319 -0
- package/dist/ai-sdk/agents/index.d.ts +74 -0
- package/dist/ai-sdk/agents/index.js +159 -0
- package/dist/ai-sdk/batches/index.d.ts +74 -0
- package/dist/ai-sdk/batches/index.js +180 -0
- package/dist/ai-sdk/cache/index.d.ts +38 -0
- package/dist/ai-sdk/cache/index.js +127 -0
- package/dist/ai-sdk/chat/index.d.ts +2 -0
- package/dist/ai-sdk/chat/index.js +246 -0
- package/dist/ai-sdk/embeddings/index.d.ts +3 -0
- package/dist/ai-sdk/embeddings/index.js +2 -0
- package/dist/ai-sdk/files/index.d.ts +61 -0
- package/dist/ai-sdk/files/index.js +111 -0
- package/dist/ai-sdk/index.d.ts +145 -0
- package/dist/ai-sdk/index.js +174 -0
- package/dist/ai-sdk/mcp/index.d.ts +102 -0
- package/dist/ai-sdk/mcp/index.js +362 -0
- package/dist/ai-sdk/memory/index.d.ts +67 -0
- package/dist/ai-sdk/memory/index.js +175 -0
- package/dist/ai-sdk/react/index.d.ts +2 -0
- package/dist/ai-sdk/react/index.js +3 -0
- package/dist/ai-sdk/react/server.d.ts +6 -0
- package/dist/ai-sdk/react/server.js +7 -0
- package/dist/ai-sdk/workflow/index.d.ts +249 -0
- package/dist/ai-sdk/workflow/index.js +575 -0
- package/dist/ai-sdk/workflow/react/index.d.ts +20 -0
- package/dist/ai-sdk/workflow/react/index.js +66 -0
- package/dist/ai-sdk/workflow/react/server.d.ts +10 -0
- package/dist/ai-sdk/workflow/react/server.js +12 -0
- package/dist/ai-tasks-Cd1HMFvB.d.ts +131 -0
- package/dist/announcements-CiyOs-xP.js +107 -0
- package/dist/announcements-ZRGnScWI.d.ts +72 -0
- package/dist/api-keys-rCGtKaZA.d.ts +156 -0
- package/dist/assistant-DwdpDH1q.d.ts +147 -0
- package/dist/astro/index.d.ts +86 -0
- package/dist/astro/index.js +93 -0
- package/dist/attributes-5dYul0u0.js +13 -0
- package/dist/auth-link-BjFPqwLz.d.ts +97 -0
- package/dist/auth-link-DrDX9KOT.js +114 -0
- package/dist/authorization-BFCqamMs.d.ts +172 -0
- package/dist/before-route-CnR0C0Jr.js +30 -0
- package/dist/bind-Bu_ZNa3W.d.ts +62 -0
- package/dist/bind-l4kAvYSv.js +97 -0
- package/dist/block-events-CrT8r7Fe.js +76 -0
- package/dist/block-fields-GFkxl4dP.js +49 -0
- package/dist/block-fields-SJ6fEf3o.d.ts +31 -0
- package/dist/block-helpers-CKtbFcRv.d.ts +37 -0
- package/dist/block-helpers-DWHxHsEQ.js +190 -0
- package/dist/block-hooks-BmjMyXTa.js +114 -0
- package/dist/block-hooks-plbZ0AbJ.d.ts +107 -0
- package/dist/{kit-transport-DJlHQUBU.js → block-transport-BLr-ZgLc.js} +11 -7
- package/dist/block-transport-DvaoPuZ9.d.ts +48 -0
- package/dist/blocks/agents/index.d.ts +3 -0
- package/dist/blocks/agents/index.js +123 -0
- package/dist/blocks/ai-cache/index.d.ts +3 -0
- package/dist/blocks/ai-cache/index.js +3 -0
- package/dist/blocks/ai-chat/index.d.ts +31 -0
- package/dist/blocks/ai-chat/index.js +5 -0
- package/dist/blocks/ai-chat/react/index.d.ts +77 -0
- package/dist/blocks/ai-chat/react/index.js +387 -0
- package/dist/blocks/ai-chat/react/server.d.ts +16 -0
- package/dist/blocks/ai-chat/react/server.js +14 -0
- package/dist/blocks/ai-files/index.d.ts +14 -0
- package/dist/blocks/ai-files/index.js +3 -0
- package/dist/blocks/ai-providers/index.d.ts +7 -0
- package/dist/blocks/ai-providers/index.js +211 -0
- package/dist/blocks/ai-tasks/index.d.ts +3 -0
- package/dist/blocks/ai-tasks/index.js +203 -0
- package/dist/blocks/announcements/index.d.ts +3 -0
- package/dist/blocks/announcements/index.js +3 -0
- package/dist/blocks/announcements/react/index.d.ts +31 -0
- package/dist/blocks/announcements/react/index.js +86 -0
- package/dist/blocks/announcements/react/server.d.ts +6 -0
- package/dist/blocks/announcements/react/server.js +7 -0
- package/dist/blocks/api-keys/index.d.ts +35 -0
- package/dist/blocks/api-keys/index.js +334 -0
- package/dist/blocks/attachments/index.d.ts +210 -0
- package/dist/blocks/attachments/index.js +222 -0
- package/dist/blocks/audit/index.d.ts +366 -0
- package/dist/blocks/audit/index.js +714 -0
- package/dist/blocks/billing/index.d.ts +265 -0
- package/dist/blocks/billing/index.js +400 -0
- package/dist/blocks/comments/index.d.ts +200 -0
- package/dist/blocks/comments/index.js +207 -0
- package/dist/blocks/connectors/index.d.ts +3 -0
- package/dist/blocks/connectors/index.js +164 -0
- package/dist/blocks/data-lifecycle/index.d.ts +251 -0
- package/dist/blocks/data-lifecycle/index.js +353 -0
- package/dist/blocks/entitlements/index.d.ts +14 -0
- package/dist/blocks/entitlements/index.js +25 -0
- package/dist/blocks/flags/index.d.ts +226 -0
- package/dist/blocks/flags/index.js +282 -0
- package/dist/blocks/inbox/index.d.ts +6 -0
- package/dist/blocks/inbox/index.js +499 -0
- package/dist/blocks/inbox/react/index.d.ts +2 -0
- package/dist/blocks/inbox/react/index.js +225 -0
- package/dist/blocks/inbox/react/server.d.ts +10 -0
- package/dist/blocks/inbox/react/server.js +12 -0
- package/dist/blocks/index.d.ts +65 -0
- package/dist/blocks/index.js +77 -0
- package/dist/blocks/jobs/index.d.ts +297 -0
- package/dist/blocks/jobs/index.js +1051 -0
- package/dist/blocks/knowledge/index.d.ts +3 -0
- package/dist/blocks/knowledge/index.js +3 -0
- package/dist/blocks/memory/index.d.ts +8 -0
- package/dist/blocks/memory/index.js +289 -0
- package/dist/blocks/notifications/index.d.ts +297 -0
- package/dist/blocks/notifications/index.js +425 -0
- package/dist/blocks/notifications/react/index.d.ts +44 -0
- package/dist/blocks/notifications/react/index.js +67 -0
- package/dist/blocks/notifications/react/server.d.ts +6 -0
- package/dist/blocks/notifications/react/server.js +7 -0
- package/dist/blocks/onboarding/index.d.ts +3 -0
- package/dist/blocks/onboarding/index.js +64 -0
- package/dist/blocks/onboarding/react/index.d.ts +28 -0
- package/dist/blocks/onboarding/react/index.js +78 -0
- package/dist/blocks/onboarding/react/server.d.ts +7 -0
- package/dist/blocks/onboarding/react/server.js +7 -0
- package/dist/blocks/organizations/index.d.ts +241 -0
- package/dist/blocks/organizations/index.js +400 -0
- package/dist/blocks/outbox/index.d.ts +3 -0
- package/dist/blocks/outbox/index.js +266 -0
- package/dist/blocks/profiles/index.d.ts +40 -0
- package/dist/blocks/profiles/index.js +28 -0
- package/dist/blocks/push/index.d.ts +185 -0
- package/dist/blocks/push/index.js +258 -0
- package/dist/blocks/settings/index.d.ts +89 -0
- package/dist/blocks/settings/index.js +104 -0
- package/dist/blocks/sso/index.d.ts +198 -0
- package/dist/blocks/sso/index.js +1297 -0
- package/dist/blocks/usage/index.d.ts +4 -0
- package/dist/blocks/usage/index.js +233 -0
- package/dist/blocks/waitlist/index.d.ts +117 -0
- package/dist/blocks/waitlist/index.js +132 -0
- package/dist/blocks/webhooks/index.d.ts +304 -0
- package/dist/{webhooks → blocks/webhooks}/index.js +468 -148
- package/dist/blocks/workflow-builder/index.d.ts +21 -0
- package/dist/blocks/workflow-builder/index.js +5 -0
- package/dist/blocks/workflow-builder/react/index.d.ts +47 -0
- package/dist/blocks/workflow-builder/react/index.js +119 -0
- package/dist/blocks/workflow-builder/react/server.d.ts +8 -0
- package/dist/blocks/workflow-builder/react/server.js +11 -0
- package/dist/blocks/workflows/index.d.ts +3 -0
- package/dist/blocks/workflows/index.js +3 -0
- package/dist/blocks/workflows/react/index.d.ts +47 -0
- package/dist/blocks/workflows/react/index.js +137 -0
- package/dist/blocks/workflows/react/server.d.ts +8 -0
- package/dist/blocks/workflows/react/server.js +11 -0
- package/dist/{index-SaTsEfGP.d.ts → bucket-Cl46E3jS.d.ts} +134 -91
- package/dist/{simplify-_0oUKqCd.js → build-BXIzE6Xv.js} +222 -124
- package/dist/{channel-FQW-CnGR.d.ts → channel-_2Mx1Oyu.d.ts} +2 -2
- package/dist/channels-CkgQ_X60.js +114 -0
- package/dist/chat-sdk/index.d.ts +303 -0
- package/dist/chat-sdk/index.js +733 -0
- package/dist/chat-sdk/react/index.d.ts +2 -0
- package/dist/chat-sdk/react/index.js +3 -0
- package/dist/chat-sdk/react/server.d.ts +3 -0
- package/dist/chat-sdk/react/server.js +2 -0
- package/dist/claims-DDBQT6BK.js +61 -0
- package/dist/{claims-BAf6c7is.js → claims-PqzCxaTD.js} +39 -2
- package/dist/cli/bin.js +1 -1
- package/dist/cli/{codemod-DqV7612m.js → codemod-Bl_tQpHn.js} +105 -2
- package/dist/cli/config-B9HkL8nF.js +2 -0
- package/dist/cli/config-DU7EJImt.js +49 -0
- package/dist/cli/config-NiPxAmUF.js +1077 -0
- package/dist/cli/{dist-xn4wlboc.js → dist-DRAVaE6w.js} +111 -1
- package/dist/cli/{doctor-L7Z8mYTx.js → doctor-B4JOm_ox.js} +992 -316
- package/dist/cli/{env-DmKv_G4A.js → env-CJLbUVPB.js} +1 -1
- package/dist/cli/{env-jIFUADLY.js → env-qXgyMV6r.js} +2 -2
- package/dist/cli/fresh-import-BeYf9I3x.js +40 -0
- package/dist/cli/gen-BGLb_zou.js +3100 -0
- package/dist/cli/gen-DAH8FM2W.js +2 -0
- package/dist/cli/index.d.ts +44 -5
- package/dist/cli/index.js +7 -7
- package/dist/cli/{init-Saf5-R9T.js → init-BIIwclPg.js} +242 -27
- package/dist/cli/{introspect--H7oGmcd.js → introspect-DNUTuNvb.js} +5 -5
- package/dist/cli/{io-k41_z-jT.js → io-DI1mTdSA.js} +12 -3
- package/dist/cli/{keys-ByKHnvP9.js → keys-BGCnnb-s.js} +8 -6
- package/dist/cli/{ohash-D7bG_EOb.js → ohash-BjQY1cBb.js} +1 -1
- package/dist/cli/{openapi-Cp5Fyta-.js → openapi-BlRJ18s3.js} +2 -2
- package/dist/cli/{project-B_GeXyHh.js → project-DZRaBaY7.js} +11 -6
- package/dist/cli/read-sets-CETOSFx4.js +223 -0
- package/dist/cli/{run-BKR2W_79.js → run-DNWxHynX.js} +33 -23
- package/dist/cli/{seed-CUlqWh-8.js → seed-DQzqT7LP.js} +8 -6
- package/dist/cli/{skills-LJJIhLFR.js → skills-QQs4q68J.js} +3 -2
- package/dist/cli/sql-D0GUtUPp.js +536 -0
- package/dist/cli/{config-CPVpXP5I.js → supabase-toml-B-bIukQF.js} +72 -942
- package/dist/cli/typegen-version-DeFbtzYI.js +8 -0
- package/dist/cli/{version-BDJuO0UR.js → version-hr88OZG0.js} +1 -1
- package/dist/client/index.d.ts +3 -2
- package/dist/client/index.js +11 -71
- package/dist/client/native/index.d.ts +228 -0
- package/dist/client/native/index.js +361 -0
- package/dist/client-CI0Z2zWX.js +277 -0
- package/dist/cloud-event-BnmD5fb9.js +46 -0
- package/dist/cloud-event-C1JCc1bH.d.ts +50 -0
- package/dist/{compiler-BXH_aZ7N.d.ts → compiler-DY_wkj4R.d.ts} +2 -2
- package/dist/compose-BIBNgAnq.js +53 -0
- package/dist/composite-Bt1YK3Ke.d.ts +146 -0
- package/dist/composite-DhE66P5u.js +130 -0
- package/dist/config/index.d.ts +6 -4
- package/dist/config/index.js +5 -5
- package/dist/{config-T_ejwyd3.d.ts → config-D44Y7PAv.d.ts} +406 -205
- package/dist/{config-DreERlKo.js → config-Dn7F5k9A.js} +62 -14
- package/dist/connector-Dv8kK0MO.d.ts +107 -0
- package/dist/connectors-hkLCwyEz.d.ts +120 -0
- package/dist/context-BCrWe7ow.d.ts +237 -0
- package/dist/credentials/index.d.ts +31 -0
- package/dist/credentials/index.js +168 -0
- package/dist/cron-DVPUg5k3.js +145 -0
- package/dist/csv-CPAzEmB6.js +25 -0
- package/dist/db-exception-CnWcYPxL.js +15 -0
- package/dist/{define-cNKzqwL_.js → define-B-TVjC25.js} +784 -227
- package/dist/{define-Bp_BZa5h.d.ts → define-CJJkkr1-.d.ts} +353 -61
- package/dist/edge/index.d.ts +69 -11
- package/dist/edge/index.js +191 -75
- package/dist/elysia/index.d.ts +59 -0
- package/dist/elysia/index.js +62 -0
- package/dist/embeddings-4ZvFzjsU.js +127 -0
- package/dist/embeddings-C9KGQnXt.d.ts +68 -0
- package/dist/{refresh-BTrQ_ZTp.d.ts → ended-jLfvw8h-.d.ts} +20 -2
- package/dist/{entitlements-DUxU4oHe.d.ts → entitlements-DHrY2UDZ.d.ts} +16 -7
- package/dist/entitlements-DRl6ZJUm.js +24 -0
- package/dist/envelope-DqnYGRw7.js +47 -0
- package/dist/{errors-DtwXa6b8.js → errors-B11Duf73.js} +82 -13
- package/dist/errors-DLjJHPLK.js +44 -0
- package/dist/escape-like-DHfx6jRr.js +7 -0
- package/dist/escape-like-ImTK0ps_.d.ts +15 -0
- package/dist/eve/index.d.ts +220 -0
- package/dist/eve/index.js +504 -0
- package/dist/eve-gT2Fpjut.d.ts +151 -0
- package/dist/events/index.d.ts +4 -3
- package/dist/events/index.js +9 -50
- package/dist/events-DWDhx77e.d.ts +549 -0
- package/dist/executor-Bq28caBo.js +718 -0
- package/dist/executor-C-R4pucm.js +83 -0
- package/dist/executor-CaWigTyR.d.ts +148 -0
- package/dist/executor-D14tGopJ.d.ts +36 -0
- package/dist/{executor-Cghdstwu.d.ts → executor-DbvExCFC.d.ts} +7 -1
- package/dist/{sql-Coh6n4cC.js → executor-De1Of3m3.js} +210 -11
- package/dist/executor-DvsBbNBS.d.ts +261 -0
- package/dist/expo/index.d.ts +79 -0
- package/dist/expo/index.js +129 -0
- package/dist/expo-sqlite/index.d.ts +58 -0
- package/dist/expo-sqlite/index.js +104 -0
- package/dist/field-errors-BFOa7WhB.d.ts +99 -0
- package/dist/field-errors-VF1yb8yI.js +13 -0
- package/dist/framework-CONDyPYx.js +51 -0
- package/dist/framework-DuVb4Xa8.d.ts +25 -0
- package/dist/gateway-C1ssRHnf.d.ts +130 -0
- package/dist/graph-BGyLLFLX.js +265 -0
- package/dist/h3/index.d.ts +59 -0
- package/dist/h3/index.js +55 -0
- package/dist/h3/v1/index.d.ts +63 -0
- package/dist/h3/v1/index.js +49 -0
- package/dist/history-BZih6SFP.js +64 -0
- package/dist/hono/index.d.ts +56 -7
- package/dist/hono/index.js +97 -45
- package/dist/{react-C_s7kiNz.js → hooks-1BTCJsiw.js} +104 -133
- package/dist/http-Cv4T29xh.js +40 -0
- package/dist/http-DdYadv-o.js +126 -0
- package/dist/image-url-pIVlO6R1.js +41 -0
- package/dist/impersonation-DcqaTBHx.js +148 -0
- package/dist/inbox-i7E1ppo6.d.ts +384 -0
- package/dist/index-ACiNPN4Z.d.ts +74 -0
- package/dist/{index-DgILJRXj.d.ts → index-Bepi-Hgg.d.ts} +91 -28
- package/dist/index-BkWT_uBO.d.ts +51 -0
- package/dist/index-BpFYMsi0.d.ts +53 -0
- package/dist/{index-C7f8cOBM.d.ts → index-Bxih3l0u.d.ts} +2 -2
- package/dist/index-CaxrMD1A.d.ts +1 -0
- package/dist/index-ClmjK_o-.d.ts +55 -0
- package/dist/index-CtuakVRc.d.ts +267 -0
- package/dist/index-D48jVS-N.d.ts +246 -0
- package/dist/index-DDrYaUcq.d.ts +138 -0
- package/dist/index-DQh4VCc9.d.ts +98 -0
- package/dist/{live-D9W2M5aO.d.ts → index-DunNRdnT.d.ts} +136 -38
- package/dist/index.d.ts +65 -18
- package/dist/index.js +42 -14
- package/dist/invalidate-BBqhpxyB.d.ts +19 -0
- package/dist/json-CEnpTHlZ.js +16 -0
- package/dist/json-schema-CvER4kgT.js +502 -0
- package/dist/keys-4MnkWTTh.js +35 -0
- package/dist/kit-B5tid-q5.d.ts +60 -0
- package/dist/kit-Fm-Fv7q5.js +78 -0
- package/dist/knowledge-BXBbT0Tr.d.ts +176 -0
- package/dist/knowledge-CDmiMLew.js +255 -0
- package/dist/lint/index.d.ts +1 -1
- package/dist/lint/index.js +37 -0
- package/dist/list/index.d.ts +3 -2
- package/dist/list/index.js +1 -444
- package/dist/{index-fag8VJZ2.d.ts → list-query-BRt-zDF7.d.ts} +20 -12
- package/dist/list-query-gl808ac1.js +459 -0
- package/dist/{live-CdJBOc4f.js → live-CTAZQkwl.js} +99 -14
- package/dist/logger-DWVYUmwi.d.ts +18 -0
- package/dist/mcp/index.d.ts +38 -11
- package/dist/mcp/index.js +82 -46
- package/dist/mcp/sdk/index.d.ts +105 -0
- package/dist/mcp/sdk/index.js +126 -0
- package/dist/message-CaKlqdsX.js +219 -0
- package/dist/message-CfDoR0Y6.d.ts +94 -0
- package/dist/messages-B9-5887d.js +715 -0
- package/dist/messages-DYP0sUTe.d.ts +59 -0
- package/dist/{mfa-CusDgPaD.d.ts → mfa-Daak8ukG.d.ts} +8 -2
- package/dist/modules-DpPwzC7E.d.ts +192 -0
- package/dist/modules-dxrVK3ID.js +228 -0
- package/dist/nestjs/index.d.ts +68 -0
- package/dist/nestjs/index.js +164 -0
- package/dist/next/client/index.d.ts +35 -0
- package/dist/next/client/index.js +36 -0
- package/dist/next/image/index.js +3 -24
- package/dist/next/index.d.ts +150 -51
- package/dist/next/index.js +261 -107
- package/dist/node/index.d.ts +4 -0
- package/dist/node/index.js +210 -0
- package/dist/node-headers-AO06VhqH.d.ts +24 -0
- package/dist/node-headers-C71zNQHe.js +55 -0
- package/dist/nuxt/index.d.ts +60 -0
- package/dist/nuxt/index.js +64 -0
- package/dist/onboarding-BZGHYJks.d.ts +62 -0
- package/dist/openapi/index.d.ts +1 -1
- package/dist/openapi/index.js +3 -3
- package/dist/orpc/index.d.ts +70 -11
- package/dist/orpc/index.js +73 -24
- package/dist/otel/index.d.ts +7 -7
- package/dist/otel/index.js +87 -57
- package/dist/outbox-Cq7pPYvl.d.ts +161 -0
- package/dist/{plugin-o144f322.d.ts → plugin-FGY8UhYm.d.ts} +30 -10
- package/dist/plugin-tfXW1-qO.js +45 -0
- package/dist/plugins/actor/index.d.ts +2 -2
- package/dist/plugins/actor/index.js +3 -3
- package/dist/plugins/rules/index.d.ts +11 -4
- package/dist/plugins/rules/index.js +40 -13
- package/dist/plugins/soft-delete/index.d.ts +5 -4
- package/dist/plugins/soft-delete/index.js +10 -5
- package/dist/plugins/tenant/index.d.ts +2 -2
- package/dist/plugins/tenant/index.js +18 -11
- package/dist/plugins/timestamps/index.d.ts +5 -3
- package/dist/plugins/timestamps/index.js +6 -4
- package/dist/plugins/validation/index.d.ts +2 -2
- package/dist/plugins/validation/index.js +10 -6
- package/dist/{pool-C9voM4Kw.d.ts → pool-CAu2nLrL.d.ts} +2 -2
- package/dist/postgres/index.d.ts +4 -4
- package/dist/postgres/index.js +1 -2
- package/dist/{postgrest-CruYKAvV.d.ts → postgrest-BLVdEnfe.d.ts} +13 -3
- package/dist/powersync/index.d.ts +43 -0
- package/dist/powersync/index.js +199 -0
- package/dist/powersync/react/index.d.ts +87 -0
- package/dist/powersync/react/index.js +108 -0
- package/dist/{problem-BW1KhzSG.js → problem-BreOl8b8.js} +14 -3
- package/dist/{problem-Blxe8S31.d.ts → problem-DD8LZFjc.d.ts} +21 -3
- package/dist/provider-BH5UWZJ6.d.ts +113 -0
- package/dist/provider-Di3sRutW.js +57 -0
- package/dist/query/index.d.ts +4 -2
- package/dist/query/index.js +4 -3
- package/dist/{query-CCbo44lG.js → query-BQ-NaZon.js} +141 -24
- package/dist/{queue-BYUCjr59.d.ts → queue-CLJurhdy.d.ts} +258 -83
- package/dist/react/index.d.ts +11 -7
- package/dist/react/index.js +7 -3
- package/dist/react/native/index.d.ts +116 -0
- package/dist/react/native/index.js +130 -0
- package/dist/react/server.d.ts +28 -10
- package/dist/react/server.js +22 -5
- package/dist/react/session.d.ts +2 -2
- package/dist/react-4ZqkP8da.js +79 -0
- package/dist/react-F80mF4-t.js +409 -0
- package/dist/react-router/index.d.ts +83 -0
- package/dist/react-router/index.js +89 -0
- package/dist/react-topic-seAWjL3_.js +38 -0
- package/dist/{read-set-DQFt1N_Y.js → read-set-DuKWC9Mj.js} +67 -25
- package/dist/realtime/index.d.ts +4 -5
- package/dist/realtime/index.js +144 -82
- package/dist/refusal-CeJWxmkH.js +61 -0
- package/dist/refusal-D1rgbzNq.d.ts +15 -0
- package/dist/replicas-CwrYp5Zj.js +94 -0
- package/dist/{view-Bq64ki8-.js → resolve-D_IcnvFd.js} +239 -289
- package/dist/{resolve-C15TJq77.d.ts → resolve-KW8nCeL6.d.ts} +29 -45
- package/dist/{resource-CRxxwkQq.js → resource-BsvzCMlX.js} +4 -4
- package/dist/{resource-D8iqWMr-.d.ts → resource-D6Uc7Sk7.d.ts} +5 -5
- package/dist/respond-BUgsXNgk.js +91 -0
- package/dist/respond-DoBijysA.d.ts +93 -0
- package/dist/result-D7y2fT87.d.ts +282 -0
- package/dist/{result-BKiliPY7.js → result-DzUbqgdW.js} +27 -2
- package/dist/run-state-CPo-1X2B.d.ts +12 -0
- package/dist/run-state-CgBKzYMW.js +13 -0
- package/dist/search-CUWCRYKL.js +9 -0
- package/dist/server/index.d.ts +143 -21
- package/dist/server/index.js +46 -14
- package/dist/{respond-D2OQl62-.d.ts → server-CeVeeXwz.d.ts} +225 -80
- package/dist/session-ChiXDZdZ.d.ts +72 -0
- package/dist/shared-CBxosKK3.js +75 -0
- package/dist/{shared-D1dRUrAg.js → shared-CxWmcyqB.js} +2 -1
- package/dist/shared-DDSjEGDR.d.ts +11 -0
- package/dist/sign-in-BCV5S2WZ.d.ts +49 -0
- package/dist/sign-in-Cb1mwv6X.js +86 -0
- package/dist/{signers-Cc6r98SW.d.ts → signers-4y62_VIi.d.ts} +13 -9
- package/dist/simplify-DDO0j0LI.js +83 -0
- package/dist/solid/index.d.ts +131 -0
- package/dist/solid/index.js +344 -0
- package/dist/solid-start/index.d.ts +75 -0
- package/dist/solid-start/index.js +58 -0
- package/dist/{spec-pins-C3oc-Tdp.js → spec-pins--j6mTok4.js} +8 -1
- package/dist/{spec-pins-CqorWDnO.d.ts → spec-pins-C89s6DyW.d.ts} +7 -0
- package/dist/sql/index.d.ts +330 -194
- package/dist/sql/index.js +34901 -6489
- package/dist/ssr/index.d.ts +6 -5
- package/dist/ssr/index.js +3 -3
- package/dist/{standard-D7r6dMUu.js → standard-BK0cqJ7y.js} +4 -3
- package/dist/{standard-J4YgMOLm.d.ts → standard-CYsm7xpT.d.ts} +1 -1
- package/dist/stats-D_AD9GGu.js +1123 -0
- package/dist/storage/index.d.ts +5 -5
- package/dist/storage/index.js +1027 -368
- package/dist/store-BdH5ruDx.js +66 -0
- package/dist/store-CGjgWu5n.d.ts +68 -0
- package/dist/streams/index.d.ts +76 -0
- package/dist/streams/index.js +77 -0
- package/dist/streams/redis/index.d.ts +52 -0
- package/dist/streams/redis/index.js +185 -0
- package/dist/stripe-BMj5LtsT.js +38 -0
- package/dist/stripe-D04h-QBT.d.ts +136 -0
- package/dist/{support-Dk6vdmEw.js → support-BivNqSpK.js} +35 -12
- package/dist/{support-view-Da5peKFg.d.ts → support-view-33Oi07TT.d.ts} +1 -1
- package/dist/svelte/index.d.ts +114 -0
- package/dist/svelte/index.js +344 -0
- package/dist/sveltekit/index.d.ts +116 -0
- package/dist/sveltekit/index.js +106 -0
- package/dist/tags-B99_U9Pp.js +39 -0
- package/dist/tags-Cx-LnIQP.d.ts +30 -0
- package/dist/tanstack-db/index.d.ts +71 -0
- package/dist/tanstack-db/index.js +72 -0
- package/dist/tanstack-start/index.d.ts +75 -0
- package/dist/tanstack-start/index.js +95 -0
- package/dist/tee-CoEppCER.js +101 -0
- package/dist/{template-TxrGI5jR.js → template--jDkl3UP.js} +34 -13
- package/dist/template-CwO38Do8.d.ts +6 -0
- package/dist/temporal-BJGitm-h.js +79 -0
- package/dist/{temporal-required-CAt4Dc9Z.js → temporal-required-BVvW7SYJ.js} +3 -2
- package/dist/tenant-I1TEZ_BX.js +27 -0
- package/dist/tenant-icPeuUBN.d.ts +17 -0
- package/dist/testing/index.d.ts +343 -37
- package/dist/testing/index.js +1186 -79
- package/dist/timing-CyTQPubY.js +92 -0
- package/dist/ttl-Hr34gRu8.js +12 -0
- package/dist/{types-Dnf_wRDz.d.ts → types-6BdhkmZe.d.ts} +111 -45
- package/dist/types-BI-0Sl2v.d.ts +359 -0
- package/dist/types-C05bxW-W.d.ts +220 -0
- package/dist/types-DGs5L0VN.d.ts +192 -0
- package/dist/types-TaiEeBGA.d.ts +156 -0
- package/dist/usage-CrvrL2vw.d.ts +177 -0
- package/dist/user-change-XzvgafU4.js +130 -0
- package/dist/vault-CSO7ss5C.d.ts +50 -0
- package/dist/vercel-connect/index.d.ts +47 -0
- package/dist/vercel-connect/index.js +119 -0
- package/dist/{verify-Ce49ETPz.js → verify-DL41hbvY.js} +85 -13
- package/dist/verify-DPuWngD4.d.ts +172 -0
- package/dist/{version-DM_Roffb.js → version-Bvv6aLjZ.js} +1 -1
- package/dist/view-BeFcRV6G.js +99 -0
- package/dist/{view-BEf0diC5.d.ts → view-DbxLNu8L.d.ts} +35 -32
- package/dist/vue/index.d.ts +141 -0
- package/dist/vue/index.js +362 -0
- package/dist/watch-DI34G86j.d.ts +60 -0
- package/dist/watch-Xuxrvxq-.js +122 -0
- package/dist/{wire-D2dT86vi.js → wire-DtZQ4sdE.js} +15 -5
- package/dist/workflow-builder-DJ1oHn8g.js +398 -0
- package/dist/workflow-sdk/builder/index.d.ts +85 -0
- package/dist/workflow-sdk/builder/index.js +250 -0
- package/dist/workflow-sdk/index.d.ts +14 -0
- package/dist/workflow-sdk/index.js +3 -0
- package/dist/workflow-sdk/world/index.d.ts +107 -0
- package/dist/workflow-sdk/world/index.js +702 -0
- package/dist/workflow-sdk-B3yLD6Br.d.ts +98 -0
- package/dist/workflow-sdk-C2WJ_G2O.js +173 -0
- package/dist/workflow-sdk-world-D-prir6O.js +1397 -0
- package/dist/workflows-B0j9WKPu.d.ts +185 -0
- package/dist/workflows-wu1WWBn7.js +216 -0
- package/package.json +470 -29
- package/schemas/ai-message-v1.json +258 -0
- package/schemas/config-v1.json +1074 -140
- package/schemas/doctor-report-v1.json +21 -1
- package/schemas/snapshot-v2.json +8 -0
- package/skills/better-supabase/SKILL.md +41 -12
- package/skills/better-supabase/references/frontend.md +96 -0
- package/skills/better-supabase/references/plugins.md +10 -6
- package/skills/better-supabase/references/troubleshooting.md +2 -1
- package/skills/better-supabase-api/SKILL.md +76 -22
- package/skills/better-supabase-api/references/adapters.md +207 -0
- package/skills/better-supabase-api/references/ai.md +125 -0
- package/skills/better-supabase-api/references/expo.md +65 -0
- package/skills/better-supabase-api/references/powersync.md +35 -0
- package/skills/better-supabase-api/references/streams-credentials.md +105 -0
- package/skills/better-supabase-auth/SKILL.md +62 -18
- package/skills/better-supabase-auth/references/authorization-providers.md +51 -0
- package/skills/better-supabase-testing/SKILL.md +3 -1
- package/dist/cli/config-dtoekM0v.js +0 -2
- package/dist/cli/gen-BJc9vdyu.js +0 -2
- package/dist/cli/gen-C2osRcr5.js +0 -2204
- package/dist/cli/read-sets-BfMQcKy8.js +0 -289
- package/dist/cli/sql-DzPbfngx.js +0 -348
- package/dist/entitlements-CTEBm7IB.js +0 -20
- package/dist/events-aIO7vsIk.d.ts +0 -230
- package/dist/executor-BunPOO-k.d.ts +0 -402
- package/dist/executor-XycESQPH.js +0 -94
- package/dist/impersonation-VfaGc4Q_.js +0 -41
- package/dist/index-BGdgBPdf.d.ts +0 -161
- package/dist/index-DOESKG27.d.ts +0 -100
- package/dist/index-DmXSxbLi.d.ts +0 -62
- package/dist/index-Dxn2a5cw.d.ts +0 -50
- package/dist/jobs/index.d.ts +0 -226
- package/dist/jobs/index.js +0 -1007
- package/dist/json-schema-m1fiwKgN.js +0 -208
- package/dist/kit-events-CTFDfSwb.js +0 -60
- package/dist/kit-transport-B82k1djG.d.ts +0 -33
- package/dist/kits-CGLLrNPd.js +0 -157
- package/dist/notifications/index.d.ts +0 -162
- package/dist/notifications/index.js +0 -264
- package/dist/orgs/index.d.ts +0 -132
- package/dist/orgs/index.js +0 -245
- package/dist/permdock-sql-C2Inc6Xc.d.ts +0 -29
- package/dist/permdock-sql-DgOfeixi.js +0 -51
- package/dist/plugin-DwARMuQp.js +0 -59
- package/dist/server-Csx2sRjg.js +0 -655
- package/dist/stats-Bqob3WqT.js +0 -592
- package/dist/support-DT-OhSxD.d.ts +0 -88
- package/dist/template-mbvlysOo.d.ts +0 -6
- package/dist/temporal-CVlIV2DZ.js +0 -40
- package/dist/user-change-CHFEUro1.js +0 -49
- package/dist/webhooks/index.d.ts +0 -285
- package/skills/better-supabase-auth/references/permdock.md +0 -100
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
//#region src/streams/store.ts
|
|
2
|
+
/** A reader that fetches pages and waits for a wake-up or `pollMs` between empty ones. */
|
|
3
|
+
function pollingRead(options) {
|
|
4
|
+
let next = options.from;
|
|
5
|
+
let woken = false;
|
|
6
|
+
let resolveWait;
|
|
7
|
+
const wake = () => {
|
|
8
|
+
woken = true;
|
|
9
|
+
resolveWait?.();
|
|
10
|
+
};
|
|
11
|
+
let unsubscribe;
|
|
12
|
+
const stop = () => {
|
|
13
|
+
unsubscribe?.();
|
|
14
|
+
unsubscribe = void 0;
|
|
15
|
+
options.signal?.removeEventListener("abort", wake);
|
|
16
|
+
};
|
|
17
|
+
const wait = () => new Promise((resolve) => {
|
|
18
|
+
if (woken || options.signal?.aborted) {
|
|
19
|
+
resolve();
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const timer = setTimeout(done, options.pollMs);
|
|
23
|
+
function done() {
|
|
24
|
+
clearTimeout(timer);
|
|
25
|
+
resolveWait = void 0;
|
|
26
|
+
resolve();
|
|
27
|
+
}
|
|
28
|
+
resolveWait = done;
|
|
29
|
+
});
|
|
30
|
+
return new ReadableStream({
|
|
31
|
+
start() {
|
|
32
|
+
options.signal?.addEventListener("abort", wake, { once: true });
|
|
33
|
+
unsubscribe = options.subscribe?.(wake);
|
|
34
|
+
},
|
|
35
|
+
async pull(controller) {
|
|
36
|
+
for (;;) {
|
|
37
|
+
if (options.signal?.aborted) {
|
|
38
|
+
stop();
|
|
39
|
+
controller.close();
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
woken = false;
|
|
43
|
+
const page = await options.fetch(next);
|
|
44
|
+
if (!page.ok) {
|
|
45
|
+
stop();
|
|
46
|
+
controller.error(page.error);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
for (const chunk of page.data.chunks) controller.enqueue(chunk);
|
|
50
|
+
next = page.data.next;
|
|
51
|
+
if (page.data.done) {
|
|
52
|
+
stop();
|
|
53
|
+
controller.close();
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (page.data.chunks.length > 0) return;
|
|
57
|
+
await wait();
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
cancel() {
|
|
61
|
+
stop();
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
//#endregion
|
|
66
|
+
export { pollingRead as t };
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { t as AsyncResult } from "./result-D7y2fT87.js";
|
|
2
|
+
//#region src/streams/store.d.ts
|
|
3
|
+
/** How a stream is opened. */
|
|
4
|
+
interface StreamOpenOptions {
|
|
5
|
+
/** The user who may read the stream and cancel it. */
|
|
6
|
+
readonly owner?: string;
|
|
7
|
+
readonly tenant?: string;
|
|
8
|
+
/** What the stream carries, such as `chat` or `workflow`. Defaults to `default`. */
|
|
9
|
+
readonly kind?: string;
|
|
10
|
+
/** Seconds the stream lives, or a Postgres interval such as `"2 hours"`. Defaults to one day. */
|
|
11
|
+
readonly ttl?: number | string;
|
|
12
|
+
}
|
|
13
|
+
interface StreamAppendResult {
|
|
14
|
+
/** The index the next chunk gets. */
|
|
15
|
+
readonly next: number;
|
|
16
|
+
/** Someone asked the writer to stop. */
|
|
17
|
+
readonly cancelled: boolean;
|
|
18
|
+
}
|
|
19
|
+
interface StreamStatus {
|
|
20
|
+
/** The number of chunks stored. */
|
|
21
|
+
readonly next: number;
|
|
22
|
+
readonly closed: boolean;
|
|
23
|
+
readonly cancelled: boolean;
|
|
24
|
+
}
|
|
25
|
+
interface StreamReadOptions {
|
|
26
|
+
/** Ends the stream early. */
|
|
27
|
+
readonly signal?: AbortSignal;
|
|
28
|
+
}
|
|
29
|
+
interface StreamPurgeOptions {
|
|
30
|
+
/** How long a closed stream is kept: seconds or an interval. Defaults to one day. */
|
|
31
|
+
readonly olderThan?: number | string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Durable, resumable output: one writer appends ordered text chunks and any
|
|
35
|
+
* number of readers read from a chunk index, live or after a reconnect.
|
|
36
|
+
* Chunks keep the index they were appended at, so a reader that counted `n`
|
|
37
|
+
* chunks resumes with `read(id, n)`.
|
|
38
|
+
*/
|
|
39
|
+
interface StreamStore {
|
|
40
|
+
readonly apiVersion: 1;
|
|
41
|
+
readonly name: string;
|
|
42
|
+
/** Creates the stream; `true` when it was new, `false` when it existed. */
|
|
43
|
+
open(id: string, options?: StreamOpenOptions): AsyncResult<boolean>;
|
|
44
|
+
/**
|
|
45
|
+
* Stores `chunks` at `fromIdx`, `fromIdx + 1`, ... Indexes already stored
|
|
46
|
+
* are skipped, so a retried batch is harmless. Fails with the hint
|
|
47
|
+
* `STREAM_NOT_FOUND`, `STREAM_CLOSED` or `STREAM_GAP` (`fromIdx` past the
|
|
48
|
+
* end).
|
|
49
|
+
*/
|
|
50
|
+
append(id: string, fromIdx: number, chunks: readonly string[]): AsyncResult<StreamAppendResult>;
|
|
51
|
+
/**
|
|
52
|
+
* The chunks from `fromIdx` on, waiting for new ones until the stream is
|
|
53
|
+
* closed. A stream that doesn't exist (or that the caller can't read) ends
|
|
54
|
+
* at once. A read error errors the stream with the `DbError`.
|
|
55
|
+
*/
|
|
56
|
+
read(id: string, fromIdx?: number, options?: StreamReadOptions): ReadableStream<string>;
|
|
57
|
+
/** The stream's state, or `undefined` when it doesn't exist. */
|
|
58
|
+
status(id: string): AsyncResult<StreamStatus | undefined>;
|
|
59
|
+
isCancelled(id: string): AsyncResult<boolean>;
|
|
60
|
+
/** Marks the stream finished; `false` when it was closed already or doesn't exist. */
|
|
61
|
+
close(id: string): AsyncResult<boolean>;
|
|
62
|
+
/** Asks the writer to stop; it learns on its next append. */
|
|
63
|
+
cancel(id: string): AsyncResult<boolean>;
|
|
64
|
+
/** Deletes expired streams and closed ones past `olderThan`; resolves with the count. */
|
|
65
|
+
purge(options?: StreamPurgeOptions): AsyncResult<number>;
|
|
66
|
+
}
|
|
67
|
+
//#endregion
|
|
68
|
+
export { StreamStatus as a, StreamReadOptions as i, StreamOpenOptions as n, StreamStore as o, StreamPurgeOptions as r, StreamAppendResult as t };
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { t as AsyncResult, w as ErrorMapper } from "../result-D7y2fT87.js";
|
|
2
|
+
import { i as sqlTransport, r as rpcTransport, t as BlockTransport } from "../block-transport-DvaoPuZ9.js";
|
|
3
|
+
import { a as StreamStatus, i as StreamReadOptions, n as StreamOpenOptions, o as StreamStore, r as StreamPurgeOptions, t as StreamAppendResult } from "../store-CGjgWu5n.js";
|
|
4
|
+
import { SupabaseClient } from "@supabase/supabase-js";
|
|
5
|
+
//#region src/streams/postgres.d.ts
|
|
6
|
+
interface PostgresStreamStoreOptions {
|
|
7
|
+
/** `sqlTransport(postgres.asService())` for the writer; the owner's transport for reads. */
|
|
8
|
+
readonly transport: BlockTransport;
|
|
9
|
+
/** The schema of the `streams` module. Defaults to `better_supabase`. */
|
|
10
|
+
readonly schema?: string;
|
|
11
|
+
readonly mappers?: readonly ErrorMapper[];
|
|
12
|
+
/**
|
|
13
|
+
* `realtime` (the default) pings the stream's private topic after each
|
|
14
|
+
* batch; `poll` skips the ping for apps near the Realtime message quota,
|
|
15
|
+
* and readers poll instead.
|
|
16
|
+
*/
|
|
17
|
+
readonly wake?: "realtime" | "poll";
|
|
18
|
+
/** A Supabase client a reader joins the topic with, to wake up on the ping. */
|
|
19
|
+
readonly realtime?: Pick<SupabaseClient, "channel" | "removeChannel">;
|
|
20
|
+
/** `sql.modules.streams.options.topic`. Defaults to `stream`. */
|
|
21
|
+
readonly topic?: string;
|
|
22
|
+
/** Milliseconds between reads of an idle stream: 250 by default, 2000 with `realtime`. */
|
|
23
|
+
readonly pollMs?: number;
|
|
24
|
+
/** Chunks per read. Defaults to 1000. */
|
|
25
|
+
readonly batch?: number;
|
|
26
|
+
}
|
|
27
|
+
/** A `StreamStore` on the `streams` SQL module. */
|
|
28
|
+
export declare function postgresStreamStore(options: PostgresStreamStoreOptions): StreamStore;
|
|
29
|
+
//#endregion
|
|
30
|
+
//#region src/streams/tee.d.ts
|
|
31
|
+
interface TeeToStoreOptions extends StreamOpenOptions {
|
|
32
|
+
/** Milliseconds a chunk may wait before its batch is written. Defaults to 100. */
|
|
33
|
+
readonly flushMs?: number;
|
|
34
|
+
/** Bytes that trigger a write before `flushMs`. Defaults to 4096. */
|
|
35
|
+
readonly flushBytes?: number;
|
|
36
|
+
/**
|
|
37
|
+
* Called once when the store reports the stream cancelled. Abort the
|
|
38
|
+
* generation here, e.g. the `AbortController` passed to `streamText`.
|
|
39
|
+
*/
|
|
40
|
+
readonly onCancel?: () => void;
|
|
41
|
+
}
|
|
42
|
+
interface TeedStream {
|
|
43
|
+
/** The source, for the live response. */
|
|
44
|
+
readonly stream: ReadableStream<string>;
|
|
45
|
+
/**
|
|
46
|
+
* Settles once every chunk is stored and the stream is closed, with the
|
|
47
|
+
* number of chunks. It keeps going after the live client disconnects, so
|
|
48
|
+
* hand it to `waitUntil` or `after`.
|
|
49
|
+
*/
|
|
50
|
+
readonly persisted: AsyncResult<number>;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Copies `source` into `store` under `id` while passing it through. Chunks
|
|
54
|
+
* are written in batches, each at its own index, so a reader that counted
|
|
55
|
+
* `n` chunks of the live stream resumes with `read(id, n)`.
|
|
56
|
+
*/
|
|
57
|
+
export declare function teeToStore(store: StreamStore, id: string, source: ReadableStream<string>, options?: TeeToStoreOptions): TeedStream;
|
|
58
|
+
/**
|
|
59
|
+
* Stores `source` under `id` without a live copy, for a stream the caller
|
|
60
|
+
* already sends elsewhere (the second branch of its own `tee()`). Settles
|
|
61
|
+
* like `teeToStore`'s `persisted`.
|
|
62
|
+
*/
|
|
63
|
+
export declare function writeToStore(store: StreamStore, id: string, source: ReadableStream<string>, options?: TeeToStoreOptions): AsyncResult<number>;
|
|
64
|
+
interface ResumeFromStoreOptions {
|
|
65
|
+
/** The number of chunks the client already has. Defaults to 0. */
|
|
66
|
+
readonly fromIdx?: number;
|
|
67
|
+
readonly signal?: AbortSignal;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* The rest of stream `id` from `fromIdx`, or `undefined` when there is
|
|
71
|
+
* nothing to resume: no such stream, or a closed one the client has read to
|
|
72
|
+
* the end. A route answers `undefined` with 204.
|
|
73
|
+
*/
|
|
74
|
+
export declare function resumeFromStore(store: StreamStore, id: string, options?: ResumeFromStoreOptions): AsyncResult<ReadableStream<string> | undefined>;
|
|
75
|
+
//#endregion
|
|
76
|
+
export { type BlockTransport, type PostgresStreamStoreOptions, type ResumeFromStoreOptions, type StreamAppendResult, type StreamOpenOptions, type StreamPurgeOptions, type StreamReadOptions, type StreamStatus, type StreamStore, type TeeToStoreOptions, type TeedStream, rpcTransport, sqlTransport };
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { n as rpcTransport, r as sqlTransport } from "../block-transport-BLr-ZgLc.js";
|
|
2
|
+
import { D as stringsOf, d as isRecord, i as blockCall, w as seconds, y as recordOf } from "../block-helpers-DWHxHsEQ.js";
|
|
3
|
+
import { n as teeToStore, r as writeToStore, t as resumeFromStore } from "../tee-CoEppCER.js";
|
|
4
|
+
import { t as pollingRead } from "../store-BdH5ruDx.js";
|
|
5
|
+
//#region src/streams/postgres.ts
|
|
6
|
+
function statusOf(value) {
|
|
7
|
+
if (!isRecord(value)) return void 0;
|
|
8
|
+
return {
|
|
9
|
+
next: Number(value["next"] ?? 0),
|
|
10
|
+
closed: value["closed"] === true,
|
|
11
|
+
cancelled: value["cancelled"] === true
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/** A `StreamStore` on the `streams` SQL module. */
|
|
15
|
+
function postgresStreamStore(options) {
|
|
16
|
+
const call = blockCall(options.transport, options.schema ?? "better_supabase", options.mappers);
|
|
17
|
+
const wake = (options.wake ?? "realtime") === "realtime";
|
|
18
|
+
const topic = options.topic ?? "stream";
|
|
19
|
+
const realtime = wake ? options.realtime : void 0;
|
|
20
|
+
const pollMs = options.pollMs ?? (realtime ? 2e3 : 250);
|
|
21
|
+
const batch = options.batch ?? 1e3;
|
|
22
|
+
const subscribe = realtime ? (id) => (onWake) => {
|
|
23
|
+
const channel = realtime.channel(`${topic}:${id}`, { config: { private: true } }).on("broadcast", { event: "*" }, onWake).subscribe();
|
|
24
|
+
return () => {
|
|
25
|
+
realtime.removeChannel(channel);
|
|
26
|
+
};
|
|
27
|
+
} : void 0;
|
|
28
|
+
const status = (id) => call("stream_status", { stream_id: id }, statusOf);
|
|
29
|
+
return {
|
|
30
|
+
apiVersion: 1,
|
|
31
|
+
name: "postgres",
|
|
32
|
+
open: (id, open = {}) => call("stream_open", {
|
|
33
|
+
stream_id: id,
|
|
34
|
+
owner: open.owner,
|
|
35
|
+
tenant: open.tenant,
|
|
36
|
+
kind: open.kind,
|
|
37
|
+
ttl: open.ttl === void 0 ? void 0 : seconds(open.ttl),
|
|
38
|
+
wake
|
|
39
|
+
}, (value) => value === true),
|
|
40
|
+
append: (id, fromIdx, chunks) => call("stream_append", {
|
|
41
|
+
stream_id: id,
|
|
42
|
+
from_idx: fromIdx,
|
|
43
|
+
chunks: [...chunks]
|
|
44
|
+
}, (value) => {
|
|
45
|
+
const row = recordOf(value, "stream_append");
|
|
46
|
+
return {
|
|
47
|
+
next: Number(row["next"]),
|
|
48
|
+
cancelled: row["cancelled"] === true
|
|
49
|
+
};
|
|
50
|
+
}),
|
|
51
|
+
read: (id, fromIdx = 0, read = {}) => pollingRead({
|
|
52
|
+
from: fromIdx,
|
|
53
|
+
pollMs,
|
|
54
|
+
signal: read.signal,
|
|
55
|
+
...subscribe ? { subscribe: subscribe(id) } : {},
|
|
56
|
+
fetch: (from) => call("stream_read", {
|
|
57
|
+
stream_id: id,
|
|
58
|
+
from_idx: from,
|
|
59
|
+
max: batch
|
|
60
|
+
}, (value) => {
|
|
61
|
+
const row = recordOf(value, "stream_read");
|
|
62
|
+
return {
|
|
63
|
+
chunks: stringsOf(row["chunks"]),
|
|
64
|
+
next: Number(row["next"]),
|
|
65
|
+
done: row["done"] === true
|
|
66
|
+
};
|
|
67
|
+
})
|
|
68
|
+
}),
|
|
69
|
+
status,
|
|
70
|
+
isCancelled: (id) => status(id).map((state) => state?.cancelled === true),
|
|
71
|
+
close: (id) => call("stream_close", { stream_id: id }, (value) => value === true),
|
|
72
|
+
cancel: (id) => call("stream_cancel", { stream_id: id }, (value) => value === true),
|
|
73
|
+
purge: (purge = {}) => call("purge_streams", { older_than: purge.olderThan === void 0 ? void 0 : seconds(purge.olderThan) }, Number)
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
//#endregion
|
|
77
|
+
export { postgresStreamStore, resumeFromStore, rpcTransport, sqlTransport, teeToStore, writeToStore };
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { o as StreamStore } from "../../store-CGjgWu5n.js";
|
|
2
|
+
//#region src/streams/redis/redis.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* The commands the store sends, as node-redis 5 and 6 (`createClient()`)
|
|
5
|
+
* name them. Any client with these methods works.
|
|
6
|
+
*/
|
|
7
|
+
interface RedisStreamClient {
|
|
8
|
+
hSetNX(key: string, field: string, value: string): Promise<unknown>;
|
|
9
|
+
hSet(key: string, field: string, value: string): Promise<unknown>;
|
|
10
|
+
hGetAll(key: string): Promise<unknown>;
|
|
11
|
+
rPush(key: string, elements: string[]): Promise<unknown>;
|
|
12
|
+
lRange(key: string, start: number, stop: number): Promise<unknown>;
|
|
13
|
+
lLen(key: string): Promise<unknown>;
|
|
14
|
+
expire(key: string, seconds: number): Promise<unknown>;
|
|
15
|
+
publish(channel: string, message: string): Promise<unknown>;
|
|
16
|
+
}
|
|
17
|
+
/** A client in subscriber mode, such as `client.duplicate()` after `connect()`. */
|
|
18
|
+
interface RedisStreamSubscriber {
|
|
19
|
+
subscribe(channel: string, listener: (message: string) => void): Promise<unknown>;
|
|
20
|
+
unsubscribe(channel: string, listener: (message: string) => void): Promise<unknown>;
|
|
21
|
+
}
|
|
22
|
+
interface RedisStreamSharedOptions {
|
|
23
|
+
/** Key and channel prefix. Defaults to `bs:stream`. */
|
|
24
|
+
readonly keyPrefix?: string;
|
|
25
|
+
/** How long a stream opened without a `ttl` lives. Defaults to `'1 day'`. */
|
|
26
|
+
readonly ttl?: number | string;
|
|
27
|
+
/** Milliseconds between reads of an idle stream: 250 by default, 2000 with `subscriber`. */
|
|
28
|
+
readonly pollMs?: number;
|
|
29
|
+
/** Chunks per read. Defaults to 1000. */
|
|
30
|
+
readonly batch?: number;
|
|
31
|
+
}
|
|
32
|
+
type RedisStreamStoreOptions = RedisStreamSharedOptions & ({
|
|
33
|
+
readonly client: RedisStreamClient;
|
|
34
|
+
/** Wakes readers on each batch; without it they poll. */
|
|
35
|
+
readonly subscriber?: RedisStreamSubscriber;
|
|
36
|
+
} | {
|
|
37
|
+
/**
|
|
38
|
+
* Connects with `redis` (node-redis, an optional peer) on first use,
|
|
39
|
+
* with a duplicate connection that wakes readers.
|
|
40
|
+
*/
|
|
41
|
+
readonly url: string;
|
|
42
|
+
});
|
|
43
|
+
/**
|
|
44
|
+
* A `StreamStore` on Redis, for apps that keep live output out of Postgres.
|
|
45
|
+
* Chunks live in a list and the state in a hash, both expiring after the
|
|
46
|
+
* stream's `ttl`, so `purge` has nothing to do and resolves with 0. Redis
|
|
47
|
+
* has no row-level security: check that the caller owns the stream before
|
|
48
|
+
* `read` or `cancel`.
|
|
49
|
+
*/
|
|
50
|
+
export declare function redisStreamStore(options: RedisStreamStoreOptions, load?: () => Promise<unknown>): StreamStore;
|
|
51
|
+
//#endregion
|
|
52
|
+
export type { RedisStreamClient, RedisStreamStoreOptions, RedisStreamSubscriber };
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { n as dbError } from "../../errors-B11Duf73.js";
|
|
2
|
+
import { a as ok, r as err, t as AsyncResult } from "../../result-DzUbqgdW.js";
|
|
3
|
+
import { d as isRecord } from "../../block-helpers-DWHxHsEQ.js";
|
|
4
|
+
import { t as pollingRead } from "../../store-BdH5ruDx.js";
|
|
5
|
+
//#region src/streams/redis/redis.ts
|
|
6
|
+
const isNodeRedis = (value) => isRecord(value) && typeof value["createClient"] === "function";
|
|
7
|
+
/**
|
|
8
|
+
* Loads `redis` on first use. The specifier is a variable so bundlers leave
|
|
9
|
+
* the optional peer out of apps that pass their own client.
|
|
10
|
+
*/
|
|
11
|
+
async function loadRedis() {
|
|
12
|
+
const specifier = "redis";
|
|
13
|
+
try {
|
|
14
|
+
return await import(specifier);
|
|
15
|
+
} catch {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
async function connectUrl(url, load) {
|
|
20
|
+
const module = await load();
|
|
21
|
+
if (!isNodeRedis(module)) throw new TypeError("redisStreamStore({ url }) needs the redis package: pnpm add redis, or pass a connected client");
|
|
22
|
+
const client = module.createClient({ url });
|
|
23
|
+
const subscriber = client.duplicate();
|
|
24
|
+
await Promise.all([client.connect(), subscriber.connect()]);
|
|
25
|
+
return {
|
|
26
|
+
client,
|
|
27
|
+
subscriber
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
const DAY = 86400;
|
|
31
|
+
const UNITS = {
|
|
32
|
+
second: 1,
|
|
33
|
+
minute: 60,
|
|
34
|
+
hour: 3600,
|
|
35
|
+
day: DAY
|
|
36
|
+
};
|
|
37
|
+
const INTERVAL = /^(\d+)\s*(second|minute|hour|day)s?$/;
|
|
38
|
+
function ttlSeconds(value) {
|
|
39
|
+
if (typeof value === "number") return value > 0 ? Math.ceil(value) : void 0;
|
|
40
|
+
const match = INTERVAL.exec(value.trim());
|
|
41
|
+
const unit = match?.[2] === void 0 ? void 0 : UNITS[match[2]];
|
|
42
|
+
return match && unit ? Number(match[1]) * unit : void 0;
|
|
43
|
+
}
|
|
44
|
+
const text = (value) => typeof value === "string" ? value : void 0;
|
|
45
|
+
/**
|
|
46
|
+
* A `StreamStore` on Redis, for apps that keep live output out of Postgres.
|
|
47
|
+
* Chunks live in a list and the state in a hash, both expiring after the
|
|
48
|
+
* stream's `ttl`, so `purge` has nothing to do and resolves with 0. Redis
|
|
49
|
+
* has no row-level security: check that the caller owns the stream before
|
|
50
|
+
* `read` or `cancel`.
|
|
51
|
+
*/
|
|
52
|
+
function redisStreamStore(options, load = loadRedis) {
|
|
53
|
+
let connected = "client" in options ? Promise.resolve({
|
|
54
|
+
client: options.client,
|
|
55
|
+
subscriber: options.subscriber
|
|
56
|
+
}) : void 0;
|
|
57
|
+
const connection = () => {
|
|
58
|
+
if (connected) return connected;
|
|
59
|
+
if (!("url" in options)) throw new TypeError("redisStreamStore needs a client or a url");
|
|
60
|
+
const pending = connectUrl(options.url, load);
|
|
61
|
+
connected = pending;
|
|
62
|
+
pending.catch(() => {
|
|
63
|
+
connected = void 0;
|
|
64
|
+
});
|
|
65
|
+
return pending;
|
|
66
|
+
};
|
|
67
|
+
const redis = async () => (await connection()).client;
|
|
68
|
+
const prefix = options.keyPrefix ?? "bs:stream";
|
|
69
|
+
const defaultTtl = ttlSeconds(options.ttl ?? DAY);
|
|
70
|
+
const wakes = "url" in options || options.subscriber !== void 0;
|
|
71
|
+
const pollMs = options.pollMs ?? (wakes ? 2e3 : 250);
|
|
72
|
+
const batch = options.batch ?? 1e3;
|
|
73
|
+
const meta = (id) => `${prefix}:${id}:meta`;
|
|
74
|
+
const list = (id) => `${prefix}:${id}:chunks`;
|
|
75
|
+
const channel = (id) => `${prefix}:${id}`;
|
|
76
|
+
const state = async (id) => {
|
|
77
|
+
const value = await (await redis()).hGetAll(meta(id));
|
|
78
|
+
if (!isRecord(value) || text(value["created"]) === void 0) return void 0;
|
|
79
|
+
const fields = {};
|
|
80
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
81
|
+
const field = text(entry);
|
|
82
|
+
if (field !== void 0) fields[key] = field;
|
|
83
|
+
}
|
|
84
|
+
return fields;
|
|
85
|
+
};
|
|
86
|
+
const length = async (id) => Number(await (await redis()).lLen(list(id)));
|
|
87
|
+
const missing = (id) => dbError("not_found", `stream ${id} does not exist`, { hint: "STREAM_NOT_FOUND" });
|
|
88
|
+
const attempt = (run) => AsyncResult.from(async () => ok(await run()));
|
|
89
|
+
const status = (id) => attempt(async () => {
|
|
90
|
+
const fields = await state(id);
|
|
91
|
+
if (!fields) return;
|
|
92
|
+
return {
|
|
93
|
+
next: await length(id),
|
|
94
|
+
closed: fields["closed"] !== void 0,
|
|
95
|
+
cancelled: fields["cancelled"] !== void 0
|
|
96
|
+
};
|
|
97
|
+
});
|
|
98
|
+
const mark = (id, field) => attempt(async () => {
|
|
99
|
+
const fields = await state(id);
|
|
100
|
+
if (!fields || fields[field] !== void 0) return false;
|
|
101
|
+
if (field === "cancelled" && fields["closed"] !== void 0) return false;
|
|
102
|
+
const client = await redis();
|
|
103
|
+
await client.hSet(meta(id), field, (/* @__PURE__ */ new Date()).toISOString());
|
|
104
|
+
await client.publish(channel(id), field === "closed" ? "close" : "cancel");
|
|
105
|
+
if (field === "cancelled") await client.publish(`${channel(id)}:cancel`, "cancel");
|
|
106
|
+
return true;
|
|
107
|
+
});
|
|
108
|
+
return {
|
|
109
|
+
apiVersion: 1,
|
|
110
|
+
name: "redis",
|
|
111
|
+
open: (id, open = {}) => {
|
|
112
|
+
const ttl = open.ttl === void 0 ? defaultTtl : ttlSeconds(open.ttl);
|
|
113
|
+
if (ttl === void 0) return AsyncResult.err(dbError("invalid_input", `ttl must be seconds or "<n> seconds|minutes|hours|days"`));
|
|
114
|
+
return attempt(async () => {
|
|
115
|
+
const client = await redis();
|
|
116
|
+
const created = await client.hSetNX(meta(id), "created", (/* @__PURE__ */ new Date()).toISOString());
|
|
117
|
+
if (created !== true && Number(created) !== 1) return false;
|
|
118
|
+
await client.hSet(meta(id), "kind", open.kind ?? "default");
|
|
119
|
+
if (open.owner !== void 0) await client.hSet(meta(id), "owner", open.owner);
|
|
120
|
+
if (open.tenant !== void 0) await client.hSet(meta(id), "tenant", open.tenant);
|
|
121
|
+
await client.hSet(meta(id), "ttl", String(ttl));
|
|
122
|
+
await client.expire(meta(id), ttl);
|
|
123
|
+
return true;
|
|
124
|
+
});
|
|
125
|
+
},
|
|
126
|
+
append: (id, fromIdx, chunks) => AsyncResult.from(async () => {
|
|
127
|
+
const fields = await state(id);
|
|
128
|
+
if (!fields) return err(missing(id));
|
|
129
|
+
if (fields["closed"] !== void 0) return err(dbError("raised", `stream ${id} is closed`, { hint: "STREAM_CLOSED" }));
|
|
130
|
+
const stored = await length(id);
|
|
131
|
+
if (fromIdx < 0 || fromIdx > stored) return err(dbError("raised", `stream ${id} is at chunk ${String(stored)}, not ${String(fromIdx)}`, { hint: "STREAM_GAP" }));
|
|
132
|
+
const fresh = chunks.slice(stored - fromIdx);
|
|
133
|
+
if (fresh.length > 0) {
|
|
134
|
+
const client = await redis();
|
|
135
|
+
await client.rPush(list(id), [...fresh]);
|
|
136
|
+
await client.expire(list(id), Number(fields["ttl"] ?? DAY));
|
|
137
|
+
await client.publish(channel(id), "append");
|
|
138
|
+
}
|
|
139
|
+
return ok({
|
|
140
|
+
next: Math.max(stored, fromIdx + chunks.length),
|
|
141
|
+
cancelled: fields["cancelled"] !== void 0
|
|
142
|
+
});
|
|
143
|
+
}),
|
|
144
|
+
read: (id, fromIdx = 0, read = {}) => pollingRead({
|
|
145
|
+
from: fromIdx,
|
|
146
|
+
pollMs,
|
|
147
|
+
signal: read.signal,
|
|
148
|
+
...wakes ? { subscribe: (wake) => {
|
|
149
|
+
const listener = () => {
|
|
150
|
+
wake();
|
|
151
|
+
};
|
|
152
|
+
const joined = connection().then(async ({ subscriber }) => {
|
|
153
|
+
await subscriber?.subscribe(channel(id), listener);
|
|
154
|
+
return subscriber;
|
|
155
|
+
});
|
|
156
|
+
return () => {
|
|
157
|
+
joined.then((subscriber) => subscriber?.unsubscribe(channel(id), listener)).catch(() => {});
|
|
158
|
+
};
|
|
159
|
+
} } : {},
|
|
160
|
+
fetch: (from) => attempt(async () => {
|
|
161
|
+
const fields = await state(id);
|
|
162
|
+
if (!fields) return {
|
|
163
|
+
chunks: [],
|
|
164
|
+
next: from,
|
|
165
|
+
done: true
|
|
166
|
+
};
|
|
167
|
+
const value = await (await redis()).lRange(list(id), from, from + batch - 1);
|
|
168
|
+
const chunks = Array.isArray(value) ? value.map(String) : [];
|
|
169
|
+
const next = from + chunks.length;
|
|
170
|
+
return {
|
|
171
|
+
chunks,
|
|
172
|
+
next,
|
|
173
|
+
done: fields["closed"] !== void 0 && next >= await length(id)
|
|
174
|
+
};
|
|
175
|
+
})
|
|
176
|
+
}),
|
|
177
|
+
status,
|
|
178
|
+
isCancelled: (id) => status(id).map((value) => value?.cancelled === true),
|
|
179
|
+
close: (id) => mark(id, "closed"),
|
|
180
|
+
cancel: (id) => mark(id, "cancelled"),
|
|
181
|
+
purge: () => AsyncResult.ok(0)
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
//#endregion
|
|
185
|
+
export { redisStreamStore };
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
//#region src/blocks/stripe.ts
|
|
2
|
+
const isModule = (value) => typeof value === "object" && value !== null && "default" in value && typeof value.default === "function" && "createFetchHttpClient" in value.default;
|
|
3
|
+
/**
|
|
4
|
+
* Loads `stripe` on first use. The specifier is a variable so bundlers leave
|
|
5
|
+
* the optional peer out of apps that pass their own client; a missing
|
|
6
|
+
* install returns `undefined` and the caller explains how to add it.
|
|
7
|
+
*/
|
|
8
|
+
async function loadStripeModule() {
|
|
9
|
+
const specifier = "stripe";
|
|
10
|
+
try {
|
|
11
|
+
return await import(specifier);
|
|
12
|
+
} catch {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* The client `source` names: itself, or one created with Stripe's fetch HTTP
|
|
18
|
+
* client so it runs on every WinterTC runtime.
|
|
19
|
+
*/
|
|
20
|
+
async function stripeClient(source, load = loadStripeModule) {
|
|
21
|
+
if (typeof source === "function") return source();
|
|
22
|
+
if (!("secretKey" in source)) return source;
|
|
23
|
+
const loaded = await load();
|
|
24
|
+
if (!isModule(loaded)) throw new TypeError("The billing and usage blocks need the stripe package: pnpm add stripe, or pass a Stripe client as `stripe`");
|
|
25
|
+
const Stripe = loaded.default;
|
|
26
|
+
return new Stripe(source.secretKey, {
|
|
27
|
+
httpClient: Stripe.createFetchHttpClient(),
|
|
28
|
+
...source.apiVersion === void 0 ? {} : { apiVersion: source.apiVersion }
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
/** Resolves the client once, on first use; a function source runs on every use. */
|
|
32
|
+
function lazyStripe(source) {
|
|
33
|
+
if (typeof source === "function") return async () => source();
|
|
34
|
+
let client;
|
|
35
|
+
return () => client ??= stripeClient(source);
|
|
36
|
+
}
|
|
37
|
+
//#endregion
|
|
38
|
+
export { lazyStripe as t };
|