better-supabase 0.7.0 → 0.8.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 +6 -2
- package/dist/{access-sql-B0dF-SoF.js → access-sql-CrSbK1q-.js} +1 -1
- package/dist/{adapter-B-tL8hqg.js → adapter-CN45ibbV.js} +663 -157
- package/dist/{agents-CVHGd7It.d.ts → agents-BY_LQXtQ.d.ts} +4 -4
- package/dist/{ai-cache-CBWs1W0k.js → ai-cache-Dfgk8nBT.js} +2 -1
- package/dist/{ai-cache-DaDu_G5L.d.ts → ai-cache-DrUMMgp6.d.ts} +4 -4
- package/dist/{ai-chat-B24UI962.js → ai-chat-CVLRWbtS.js} +4 -3
- package/dist/{ai-chat-7amvXjmQ.d.ts → ai-chat-DXkMy74O.d.ts} +5 -5
- package/dist/{ai-files-CSPNswUY.js → ai-files-CioLu5du.js} +5 -4
- package/dist/ai-message-DfaP8sis.js +14 -0
- package/dist/ai-sdk/agents/index.d.ts +4 -4
- package/dist/ai-sdk/batches/index.d.ts +4 -4
- package/dist/ai-sdk/batches/index.js +4 -4
- 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 +8 -20
- package/dist/ai-sdk/embeddings/index.d.ts +2 -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 +37 -9
- package/dist/ai-sdk/index.js +3 -2
- package/dist/ai-sdk/mcp/index.d.ts +43 -6
- package/dist/ai-sdk/mcp/index.js +36 -7
- package/dist/ai-sdk/memory/index.d.ts +2 -2
- package/dist/ai-sdk/memory/index.js +1 -1
- package/dist/ai-sdk/workflow/index.d.ts +6 -6
- package/dist/ai-sdk/workflow/index.js +13 -24
- package/dist/{ai-tasks-Cd1HMFvB.d.ts → ai-tasks-BRQ6iQLc.d.ts} +4 -4
- package/dist/{announcements-ZRGnScWI.d.ts → announcements-Bouy0Ski.d.ts} +3 -3
- package/dist/{announcements-CiyOs-xP.js → announcements-p_BFofiR.js} +1 -1
- package/dist/api-Dnf2q-Ht.d.ts +370 -0
- package/dist/api-DtHFC037.js +676 -0
- package/dist/{api-keys-CIjghYjV.d.ts → api-keys-C8BlF3L2.d.ts} +4 -4
- package/dist/arazzo/index.d.ts +255 -0
- package/dist/arazzo/index.js +622 -0
- package/dist/{assistant-DwdpDH1q.d.ts → assistant-DBlFDZsi.d.ts} +5 -5
- package/dist/astro/index.d.ts +7 -7
- package/dist/astro/index.js +7 -7
- package/dist/asyncapi/index.d.ts +103 -0
- package/dist/asyncapi/index.js +569 -0
- package/dist/authorizer-ayxUDXXP.js +126 -0
- package/dist/authorizer-eiOjo-3l.d.ts +73 -0
- package/dist/better-result/index.d.ts +118 -0
- package/dist/better-result/index.js +64 -0
- package/dist/{bind-l4kAvYSv.js → bind-ButSzrHe.js} +1 -1
- package/dist/{bind-Bu_ZNa3W.d.ts → bind-CQ5mPyX1.d.ts} +3 -3
- package/dist/{block-events-CrT8r7Fe.js → block-events-DTxU5tfr.js} +18 -3
- package/dist/{block-fields-GFkxl4dP.js → block-fields-CroxUuF2.js} +3 -3
- package/dist/{block-fields-SJ6fEf3o.d.ts → block-fields-D1pfrcIY.d.ts} +2 -2
- package/dist/{block-helpers-CKtbFcRv.d.ts → block-helpers-C0Xj8War.d.ts} +2 -2
- package/dist/{block-helpers-DWHxHsEQ.js → block-helpers-Cy3pB96I.js} +41 -9
- package/dist/{block-hooks-BmjMyXTa.js → block-hooks-BPNMIlLl.js} +3 -3
- package/dist/{block-hooks-plbZ0AbJ.d.ts → block-hooks-DaOVC7SC.d.ts} +3 -3
- package/dist/{block-transport-BLr-ZgLc.js → block-transport-bAKh-dGc.js} +28 -2
- package/dist/{block-transport-DvaoPuZ9.d.ts → block-transport-inD4fFq-.d.ts} +24 -2
- package/dist/blocks/agents/index.d.ts +3 -3
- package/dist/blocks/agents/index.js +5 -4
- package/dist/blocks/ai-cache/index.d.ts +3 -3
- package/dist/blocks/ai-cache/index.js +3 -3
- package/dist/blocks/ai-chat/index.d.ts +9 -4
- package/dist/blocks/ai-chat/index.js +5 -5
- package/dist/blocks/ai-chat/react/index.d.ts +3 -3
- package/dist/blocks/ai-chat/react/index.js +5 -5
- package/dist/blocks/ai-files/index.d.ts +3 -3
- package/dist/blocks/ai-files/index.js +3 -3
- package/dist/blocks/ai-providers/index.d.ts +3 -3
- package/dist/blocks/ai-providers/index.js +8 -7
- package/dist/blocks/ai-tasks/index.d.ts +3 -3
- package/dist/blocks/ai-tasks/index.js +7 -6
- package/dist/blocks/announcements/index.d.ts +3 -3
- package/dist/blocks/announcements/index.js +3 -3
- package/dist/blocks/announcements/react/index.d.ts +3 -3
- package/dist/blocks/announcements/react/index.js +3 -3
- package/dist/blocks/api-keys/index.d.ts +5 -5
- package/dist/blocks/api-keys/index.js +8 -8
- package/dist/blocks/attachments/index.d.ts +12 -8
- package/dist/blocks/attachments/index.js +22 -13
- package/dist/blocks/audit/index.d.ts +21 -10
- package/dist/blocks/audit/index.js +30 -11
- package/dist/blocks/billing/index.d.ts +11 -9
- package/dist/blocks/billing/index.js +15 -15
- package/dist/blocks/comments/index.d.ts +8 -8
- package/dist/blocks/comments/index.js +8 -7
- package/dist/blocks/connectors/index.d.ts +3 -3
- package/dist/blocks/connectors/index.js +7 -6
- package/dist/blocks/data-lifecycle/index.d.ts +12 -8
- package/dist/blocks/data-lifecycle/index.js +13 -8
- package/dist/blocks/entitlements/index.d.ts +3 -3
- package/dist/blocks/entitlements/index.js +1 -1
- package/dist/blocks/flags/index.d.ts +4 -4
- package/dist/blocks/flags/index.js +4 -3
- package/dist/blocks/inbox/index.d.ts +3 -3
- package/dist/blocks/inbox/index.js +4 -5
- package/dist/blocks/inbox/react/index.d.ts +1 -1
- package/dist/blocks/inbox/react/index.js +1 -1
- package/dist/blocks/inbox/react/server.d.ts +1 -1
- package/dist/blocks/index.d.ts +10 -10
- package/dist/blocks/index.js +6 -6
- package/dist/blocks/jobs/index.d.ts +48 -32
- package/dist/blocks/jobs/index.js +44 -287
- package/dist/blocks/knowledge/index.d.ts +3 -3
- package/dist/blocks/knowledge/index.js +3 -3
- package/dist/blocks/memory/index.d.ts +4 -4
- package/dist/blocks/memory/index.js +7 -6
- package/dist/blocks/notifications/index.d.ts +11 -9
- package/dist/blocks/notifications/index.js +20 -25
- package/dist/blocks/notifications/react/index.d.ts +1 -1
- package/dist/blocks/notifications/react/index.js +1 -1
- package/dist/blocks/onboarding/index.d.ts +3 -3
- package/dist/blocks/onboarding/index.js +3 -3
- package/dist/blocks/onboarding/react/index.d.ts +2 -2
- package/dist/blocks/onboarding/react/index.js +2 -2
- package/dist/blocks/onboarding/react/server.d.ts +1 -1
- package/dist/blocks/organizations/index.d.ts +9 -9
- package/dist/blocks/organizations/index.js +11 -18
- package/dist/blocks/outbox/index.d.ts +2 -2
- package/dist/blocks/outbox/index.js +16 -25
- package/dist/blocks/profiles/index.d.ts +7 -7
- package/dist/blocks/profiles/index.js +7 -6
- package/dist/blocks/push/index.d.ts +4 -4
- package/dist/blocks/push/index.js +3 -3
- package/dist/blocks/settings/index.d.ts +4 -4
- package/dist/blocks/settings/index.js +7 -6
- package/dist/blocks/sso/index.d.ts +5 -5
- package/dist/blocks/sso/index.js +6 -5
- package/dist/blocks/usage/index.d.ts +3 -3
- package/dist/blocks/usage/index.js +5 -4
- package/dist/blocks/waitlist/index.d.ts +5 -5
- package/dist/blocks/waitlist/index.js +5 -4
- package/dist/blocks/webhooks/index.d.ts +22 -13
- package/dist/blocks/webhooks/index.js +41 -70
- package/dist/blocks/workflow-builder/index.d.ts +4 -4
- package/dist/blocks/workflow-builder/index.js +3 -3
- package/dist/blocks/workflow-builder/react/index.d.ts +4 -4
- package/dist/blocks/workflow-builder/react/index.js +4 -4
- package/dist/blocks/workflows/index.d.ts +3 -3
- package/dist/blocks/workflows/index.js +3 -3
- package/dist/blocks/workflows/react/index.d.ts +3 -3
- package/dist/blocks/workflows/react/index.js +3 -3
- package/dist/build-hPwk3_X5.js +1296 -0
- package/dist/{build-BXIzE6Xv.js → build-meLuYGri.js} +3 -3
- package/dist/casing-DdFWEtqr.js +16 -0
- package/dist/chat-sdk/index.d.ts +6 -6
- package/dist/chat-sdk/index.js +5 -4
- package/dist/chat-sdk/react/index.d.ts +1 -1
- package/dist/chat-sdk/react/server.d.ts +1 -1
- package/dist/{claims-DDBQT6BK.js → claims-0KZVT804.js} +1 -1
- package/dist/cli/add-1dc5wM5k.js +69 -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 +4 -4
- package/dist/cli/cache-CIfA-jBV.js +483 -0
- package/dist/cli/{codemod-Bl_tQpHn.js → codemod-JVlTQQG2.js} +4 -4
- package/dist/cli/{command-CK14fP91.js → command-DV-StG1x.js} +5 -0
- package/dist/cli/{config-DU7EJImt.js → config-C2Pz2_4A.js} +7 -4
- package/dist/cli/config-DpbF8ML3.js +2 -0
- package/dist/cli/{config-NiPxAmUF.js → config-M-WzL9O2.js} +116 -18
- package/dist/cli/{db-DOBPt660.js → db-BkcfOlyB.js} +2 -1
- package/dist/cli/{diff-SjkO5rNr.js → diff-D1jGdb3Y.js} +1 -1
- package/dist/cli/{doctor-CVdnLahA.js → doctor-VcDtuusV.js} +317 -222
- package/dist/cli/emit-BHHfwUoT.js +1136 -0
- package/dist/cli/{env-qXgyMV6r.js → env-B--LMhEe.js} +13 -10
- package/dist/cli/env-vzBG90Um.js +2 -0
- package/dist/cli/{env-CJLbUVPB.js → env-zHJtMIBo.js} +11 -3
- package/dist/cli/{errors-4v4DTtda.js → errors-CqTLXe2M.js} +18 -2
- package/dist/cli/{fastest-levenshtein-CFN-lNDv.js → fastest-levenshtein-CF7BCi9l.js} +1 -1
- package/dist/cli/files-BVupXPIC.js +34 -0
- package/dist/cli/gen-DmVj3u4L.js +322 -0
- package/dist/cli/{init-Cr6arjXU.js → glue-C1UE8gQN.js} +16 -313
- package/dist/cli/index.d.ts +59 -31
- package/dist/cli/index.js +8 -6
- package/dist/cli/init-CVZ3s5kl.js +258 -0
- package/dist/cli/{introspect-Bzuv1HHj.js → introspect-BToGNfm-.js} +14 -14
- package/dist/cli/{io-DI1mTdSA.js → io-CFzJVJ68.js} +5 -1
- package/dist/cli/{keys-BGCnnb-s.js → keys-CJhtIxJ3.js} +4 -4
- package/dist/cli/metadata-DSRKCaf-.js +133 -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/{openapi-BlRJ18s3.js → openapi-DWa4Ir1q.js} +8 -14
- package/dist/cli/prompts-BdeVmVpg.js +2 -0
- package/dist/cli/{prompts-BNcNfAve.js → prompts-DZJB1nTw.js} +6 -6
- package/dist/cli/{rolldown-runtime-BPOCksWG.js → rolldown-runtime-CMFfr-1z.js} +3 -1
- package/dist/cli/run-DA6_lg3w.js +389 -0
- package/dist/cli/run-DuN1MX-7.js +705 -0
- package/dist/cli/scaffold-5DenHSxF.js +292 -0
- package/dist/cli/scaffold-CwQUMFRb.js +2 -0
- package/dist/cli/{seed-DQzqT7LP.js → seed-CzBmrGON.js} +14 -18
- package/dist/cli/seed-DOmit9Hq.js +2 -0
- package/dist/cli/{skills-QQs4q68J.js → skills-CnO8QFS7.js} +7 -6
- package/dist/cli/snapshot-Bstk6ulj.js +287 -0
- package/dist/cli/source-args-BYfq6imV.js +31 -0
- package/dist/cli/spec-CzosTYm3.js +7438 -0
- package/dist/cli/spec-T_0Bcyw7.js +2 -0
- package/dist/cli/{sql-B8csQPyn.js → sql-BKOOQAX3.js} +240 -218
- package/dist/cli/sql-DJrNDxQm.js +3 -0
- package/dist/cli/{style-C0NFdJRL.js → style-CB3vxgh0.js} +3 -3
- package/dist/cli/typegen-Demi5-VQ.js +486 -0
- package/dist/cli/validate-Ca13ktgz.js +7522 -0
- package/dist/cli/{version-Bp4fyubI.js → version-B4k0aUxS.js} +1 -1
- package/dist/client/index.d.ts +4 -3
- package/dist/client/index.js +60 -3
- package/dist/client/native/index.d.ts +3 -3
- package/dist/client/native/index.js +3 -3
- package/dist/{client-CI0Z2zWX.js → client-wxeTQFtB.js} +36 -3
- package/dist/{clone-BfgmLU90.js → clone-dN9XOL1K.js} +9 -1
- package/dist/{cloud-event-BnmD5fb9.js → cloud-event-CTh9Sr5w.js} +16 -2
- package/dist/{cloud-event-C1JCc1bH.d.ts → cloud-event-Dune0KI7.d.ts} +16 -2
- package/dist/{compiler-DY_wkj4R.d.ts → compiler-V1qvcST1.d.ts} +2 -2
- package/dist/{compose-BIBNgAnq.js → compose-BHej1acw.js} +3 -3
- package/dist/{composite-CpHLEo-G.d.ts → composite-CWAJTRBF.d.ts} +6 -6
- package/dist/{composite-C6I8ZyaF.js → composite-zTe0TCqj.js} +4 -4
- package/dist/config/index.d.ts +3 -4
- package/dist/config/index.js +4 -4
- package/dist/config-DlKvtt95.js +540 -0
- package/dist/{connector-Dv8kK0MO.d.ts → connector-CySQEFcW.d.ts} +1 -1
- package/dist/{connectors-CrpknU0P.d.ts → connectors--PGhmiu0.d.ts} +4 -4
- package/dist/{context-BCrWe7ow.d.ts → context-DsV2SueA.d.ts} +11 -2
- package/dist/context-nPDvQ-Zl.js +41 -0
- package/dist/credentials/index.d.ts +5 -5
- package/dist/credentials/index.js +9 -17
- package/dist/{cron-DVPUg5k3.js → cron-D25Ukpxy.js} +1 -1
- package/dist/cron-route-D2AN9SA1.js +24 -0
- package/dist/{csv-DCK-PT1n.js → csv-BZnHA1Py.js} +1 -1
- package/dist/{define-B-TVjC25.js → define-CFQcvM20.js} +263 -229
- package/dist/{define-CJJkkr1-.d.ts → define-DmcfoNXB.d.ts} +136 -111
- package/dist/edge/index.d.ts +66 -13
- package/dist/edge/index.js +65 -39
- package/dist/elysia/index.d.ts +1 -1
- package/dist/elysia/index.js +1 -1
- package/dist/{embeddings-C9KGQnXt.d.ts → embeddings-B4vhS-dY.d.ts} +1 -1
- package/dist/{ended-XjeGQ5XW.d.ts → ended-CcvcRqEd.d.ts} +7 -1
- package/dist/{entitlements-DRl6ZJUm.js → entitlements-BYFf0Cdh.js} +2 -2
- package/dist/{entitlements-BKSVGtrG.d.ts → entitlements-Ds8qoYZ-.d.ts} +1 -1
- package/dist/env/index.d.ts +1 -1
- package/dist/env/index.js +9 -2
- package/dist/{errors-B11Duf73.js → errors-2M6CKMP4.js} +5 -0
- package/dist/{errors-DLjJHPLK.js → errors-rZ7VIqp6.js} +2 -2
- package/dist/{escape-like-ImTK0ps_.d.ts → escape-like-DDWoHzh_.d.ts} +1 -1
- package/dist/eve/index.d.ts +5 -5
- package/dist/eve/index.js +5 -11
- package/dist/{eve-gT2Fpjut.d.ts → eve-CoAIcCkq.d.ts} +2 -2
- package/dist/events/index.d.ts +4 -4
- package/dist/events/index.js +7 -2
- package/dist/{events-DWDhx77e.d.ts → events-D1BOCll8.d.ts} +6 -4
- package/dist/{executor-Bq28caBo.js → executor-B-fD7DLt.js} +52 -35
- package/dist/executor-B_Hfobee.js +162 -0
- package/dist/{executor-BVBFM86G.d.ts → executor-CpxLPCiz.d.ts} +1 -1
- package/dist/{executor-CaWigTyR.d.ts → executor-DfEtf0cq.d.ts} +43 -27
- package/dist/{executor-DvsBbNBS.d.ts → executor-Drzu3dBK.d.ts} +2 -2
- package/dist/{executor-DbvExCFC.d.ts → executor-ngjKL_Pe.d.ts} +2 -2
- package/dist/expo/index.d.ts +4 -4
- package/dist/expo/index.js +6 -6
- 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-BFOa7WhB.d.ts → field-errors-DIe9XYWL.d.ts} +17 -7
- package/dist/{field-errors-VF1yb8yI.js → field-errors-DZVRWRkf.js} +1 -1
- package/dist/format-DTXdu8ya.d.ts +70 -0
- package/dist/{framework-KIPvRQJU.d.ts → framework-148t1m3C.d.ts} +5 -5
- package/dist/{framework-BDCpJI7o.js → framework-3ey3QmrO.js} +2 -2
- package/dist/function-contract-BcZenXMO.d.ts +8 -0
- package/dist/{gateway-C1ssRHnf.d.ts → gateway-S9vicgeo.d.ts} +4 -4
- package/dist/{guards-BnzDvFrz.js → guards-6F2bCtQR.js} +3 -1
- package/dist/h3/index.d.ts +1 -1
- package/dist/h3/index.js +1 -1
- package/dist/h3/v1/index.d.ts +1 -1
- package/dist/h3/v1/index.js +1 -1
- package/dist/{message-CaKlqdsX.js → history-GH1HJWQV.js} +65 -13
- package/dist/hmac-DCud0myt.js +22 -0
- package/dist/hono/index.d.ts +19 -14
- package/dist/hono/index.js +21 -16
- package/dist/{hooks-1BTCJsiw.js → hooks-Bhza9Hnr.js} +68 -100
- package/dist/http-sbmBe5d2.js +25 -0
- package/dist/{inbox-i7E1ppo6.d.ts → inbox-Cd1KCEBL.d.ts} +3 -3
- package/dist/index-B72Rvv_j.d.ts +89 -0
- package/dist/{index-DunNRdnT.d.ts → index-BCHR4Ucl.d.ts} +4 -4
- package/dist/{index-CLg87OBW.d.ts → index-BUK7jUzR.d.ts} +6 -0
- package/dist/{config-D44Y7PAv.d.ts → index-Ba1SI-uO.d.ts} +625 -278
- package/dist/{index-D48jVS-N.d.ts → index-BfxOaOYs.d.ts} +4 -5
- package/dist/{index-ClmjK_o-.d.ts → index-CicIyqOe.d.ts} +4 -4
- package/dist/{index-ACiNPN4Z.d.ts → index-D69h4QqD.d.ts} +1 -1
- package/dist/index-DG2SUXDQ.d.ts +58 -0
- package/dist/{index-Bepi-Hgg.d.ts → index-DoNVLHOU.d.ts} +3 -3
- package/dist/{index-CdZKQF98.d.ts → index-R274XFlg.d.ts} +1 -1
- package/dist/{index-CewnYSpv.d.ts → index-_4R4b01v.d.ts} +8 -18
- package/dist/index.d.ts +89 -14
- package/dist/index.js +12 -11
- package/dist/{json-schema-CvER4kgT.js → json-schema-CT4tvrkA.js} +148 -102
- package/dist/{kit-Fm-Fv7q5.js → kit-BhHr9T9v.js} +36 -10
- package/dist/{kit-CkNzZUqv.d.ts → kit-W99LCPBS.d.ts} +13 -7
- package/dist/{knowledge-BXBbT0Tr.d.ts → knowledge-CAReFpRA.d.ts} +5 -5
- package/dist/{knowledge-CDmiMLew.js → knowledge-DnHtb64A.js} +4 -3
- package/dist/list/index.d.ts +1 -2
- package/dist/{list-query-BRt-zDF7.d.ts → list-query-D3JQeEL7.d.ts} +4 -4
- package/dist/mcp/index.d.ts +49 -19
- package/dist/mcp/index.js +158 -94
- package/dist/mcp/sdk/index.d.ts +38 -6
- package/dist/mcp/sdk/index.js +88 -6
- package/dist/{message-CfDoR0Y6.d.ts → message-B0fNJgq8.d.ts} +1 -2
- package/dist/{messages-B9-5887d.js → messages-CJoHHCWT.js} +4 -205
- package/dist/{mfa-Daak8ukG.d.ts → mfa-SZc9YYyb.d.ts} +1 -1
- package/dist/model-OgBxvk3N.d.ts +300 -0
- package/dist/model-messages-Cxw_Up4f.js +206 -0
- package/dist/model-messages-D4GZllOD.d.ts +34 -0
- package/dist/modules-DksjZyMW.js +77 -0
- package/dist/nestjs/index.d.ts +2 -2
- package/dist/nestjs/index.js +1 -1
- package/dist/next/index.d.ts +105 -55
- package/dist/next/index.js +204 -170
- package/dist/node/index.d.ts +2 -2
- package/dist/node/index.js +1 -1
- package/dist/{onboarding-BZGHYJks.d.ts → onboarding-LZvlK1P4.d.ts} +3 -3
- package/dist/openapi/index.d.ts +4 -2
- package/dist/openapi/index.js +21 -343
- package/dist/optional-peer-D1pi-skw.js +24 -0
- package/dist/orpc/index.d.ts +8 -8
- package/dist/orpc/index.js +21 -20
- package/dist/otel/index.d.ts +3 -3
- package/dist/otel/index.js +7 -7
- package/dist/{outbox-Cq7pPYvl.d.ts → outbox-DZfAvfzC.d.ts} +6 -6
- package/dist/overlay/index.d.ts +233 -0
- package/dist/overlay/index.js +554 -0
- package/dist/{plugin-FGY8UhYm.d.ts → plugin-CPK2HsbY.d.ts} +42 -3
- 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 +1 -1
- package/dist/plugins/soft-delete/index.d.ts +3 -3
- package/dist/plugins/soft-delete/index.js +9 -2
- package/dist/plugins/tenant/index.d.ts +7 -2
- package/dist/plugins/tenant/index.js +16 -2
- 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-CAu2nLrL.d.ts → pool-gkhbGp2E.d.ts} +2 -2
- package/dist/postgres/index.d.ts +4 -4
- package/dist/postgres/index.js +2 -1
- package/dist/{postgrest-BLVdEnfe.d.ts → postgrest-BUqLag2Q.d.ts} +1 -1
- package/dist/powersync/index.d.ts +5 -5
- package/dist/powersync/index.js +4 -4
- package/dist/powersync/react/index.d.ts +3 -3
- package/dist/powersync/react/index.js +1 -1
- package/dist/{problem-BreOl8b8.js → problem-CJvFeGu7.js} +13 -2
- package/dist/{problem-DD8LZFjc.d.ts → problem-TvGdxO1t.d.ts} +7 -1
- package/dist/{provider-Di3sRutW.js → provider-DxRTex4x.js} +1 -1
- package/dist/{provider-D-UEMvSD.d.ts → provider-ib9wzUDz.d.ts} +2 -2
- package/dist/query/index.d.ts +2 -2
- package/dist/query/index.js +1 -1
- package/dist/{query-BQ-NaZon.js → query-Ctz-qKRx.js} +1 -1
- package/dist/rate-limit-Bw7HgmFj.js +260 -0
- package/dist/react/index.d.ts +9 -9
- package/dist/react/index.js +4 -4
- 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 +3 -3
- package/dist/react/session.d.ts +2 -2
- package/dist/{react-F80mF4-t.js → react-Bmpo59D7.js} +4 -4
- package/dist/react-router/index.d.ts +6 -6
- package/dist/react-router/index.js +9 -11
- package/dist/{read-set-DuKWC9Mj.js → read-set-DAeWhqPf.js} +2 -2
- package/dist/realtime/index.d.ts +3 -3
- package/dist/realtime/index.js +30 -36
- package/dist/{refusal-DhSU2Vvr.d.ts → refusal-CFI8-5nf.d.ts} +4 -1
- package/dist/{refusal-CeJWxmkH.js → refusal-K78A1Vmq.js} +5 -5
- package/dist/{resolve-tJZY3FEa.js → resolve-Bvgf3ut_.js} +131 -42
- package/dist/{resolve-ChTYeTEl.d.ts → resolve-MxXVWyhd.d.ts} +12 -8
- package/dist/resource--vTrBe6I.d.ts +103 -0
- package/dist/resource-BqNqlYg9.js +91 -0
- package/dist/resource-DA811u_4.js +463 -0
- package/dist/resource-execute-rbKvuCsY.d.ts +12 -0
- package/dist/resource-schemas-BJ518zFH.js +79 -0
- package/dist/resource-types-CqB6GWGT.d.ts +141 -0
- package/dist/resources-BVYPnuLo.js +56 -0
- package/dist/resources-DZSk8tXJ.d.ts +7 -0
- package/dist/{respond-DprrgyXX.d.ts → respond-Cw-zanCm.d.ts} +3 -3
- package/dist/{respond-BUgsXNgk.js → respond-volM3ByS.js} +4 -4
- package/dist/{result-D7y2fT87.d.ts → result-BchM1XZn.d.ts} +7 -1
- package/dist/{result-DzUbqgdW.js → result-DEqHCMKP.js} +1 -1
- package/dist/server/index.d.ts +81 -19
- package/dist/server/index.js +16 -14
- package/dist/{server-ZSJ9rCcV.d.ts → server-types-CrAmZ8jv.d.ts} +110 -36
- package/dist/{shared-CxWmcyqB.js → shared-DHjhfRdV.js} +2 -15
- package/dist/shared-DTneRoxi.js +14 -0
- package/dist/{sign-in-Cb1mwv6X.js → sign-in-D_yoP0PF.js} +1 -1
- package/dist/signatures-BRS_p3WD.d.ts +34 -0
- package/dist/signatures-DsWv_bYR.js +103 -0
- package/dist/{signers-4y62_VIi.d.ts → signers-cpdmZYrv.d.ts} +1 -1
- package/dist/solid/index.d.ts +9 -18
- package/dist/solid/index.js +2 -2
- package/dist/solid-start/index.d.ts +6 -6
- package/dist/solid-start/index.js +7 -7
- package/dist/spec/index.d.ts +134 -0
- package/dist/spec/index.js +353 -0
- package/dist/{spec-pins-C89s6DyW.d.ts → spec-pins-CwzDY25w.d.ts} +18 -1
- package/dist/{spec-pins--j6mTok4.js → spec-pins-DsLfUH7l.js} +14 -1
- package/dist/sql/index.d.ts +145 -119
- package/dist/sql/index.js +19921 -19798
- package/dist/{executor-De1Of3m3.js → sql-CwuqaQ4Y.js} +34 -169
- package/dist/ssr/index.d.ts +4 -4
- package/dist/ssr/index.js +3 -2
- package/dist/{standard-BK0cqJ7y.js → standard-DkzZUneg.js} +2 -2
- package/dist/{standard-CYsm7xpT.d.ts → standard-lmkbOtPB.d.ts} +1 -1
- package/dist/{stats-D_AD9GGu.js → stats-DhU78Ctf.js} +8 -4
- package/dist/storage/index.d.ts +4 -6
- package/dist/storage/index.js +16 -17
- package/dist/{bucket-Cl46E3jS.d.ts → storage-api-CB7Zl1Ci.d.ts} +243 -8
- package/dist/{store-CGjgWu5n.d.ts → store-DsIYEBnv.d.ts} +1 -1
- package/dist/streams/index.d.ts +4 -4
- package/dist/streams/index.js +5 -4
- package/dist/streams/redis/index.d.ts +1 -1
- package/dist/streams/redis/index.js +5 -11
- package/dist/{stripe-BMj5LtsT.js → stripe-v-Y2lmop.js} +2 -8
- package/dist/supabase-mcp-C6tMoEjn.d.ts +43 -0
- package/dist/supabase-mcp-Cpn5A4i-.js +28 -0
- package/dist/{support-DWwzVf-O.js → support-D1pFFouF.js} +71 -35
- package/dist/{support-view-CVOJJLpc.d.ts → support-view-scqMgtOo.d.ts} +1 -1
- package/dist/svelte/index.d.ts +8 -17
- package/dist/svelte/index.js +2 -2
- package/dist/sveltekit/index.d.ts +7 -7
- package/dist/sveltekit/index.js +10 -12
- package/dist/table-schema-htM_SbCW.js +286 -0
- package/dist/{tags-Cx-LnIQP.d.ts → tags-BO9LjtWG.d.ts} +1 -1
- package/dist/tanstack-db/index.d.ts +2 -2
- package/dist/tanstack-db/supabase/index.d.ts +52 -0
- package/dist/tanstack-db/supabase/index.js +97 -0
- package/dist/tanstack-start/index.d.ts +6 -6
- package/dist/tanstack-start/index.js +8 -12
- package/dist/{tee-CoEppCER.js → tee-Cb98Vn3b.js} +1 -1
- package/dist/{template--jDkl3UP.js → template-lPVh-EwW.js} +11 -2
- package/dist/{temporal-required-BVvW7SYJ.js → temporal-required-BtynQtM-.js} +1 -1
- package/dist/{tenant-BxNFk9bx.d.ts → tenant-CM368LXb.d.ts} +2 -2
- package/dist/testing/index.d.ts +249 -118
- package/dist/testing/index.js +1418 -870
- package/dist/ttl-cache-XzZ-Q2eX.js +29 -0
- package/dist/types-BRTSpOIh.js +5 -0
- package/dist/{types-C05bxW-W.d.ts → types-Bb_4-vdW.d.ts} +4 -4
- package/dist/{types-AYOvcyep.d.ts → types-CD6yCDx3.d.ts} +5 -5
- package/dist/{types-6rocye-y.d.ts → types-CbOUc5IH.d.ts} +4 -4
- package/dist/{types-6BdhkmZe.d.ts → types-CoE5Zwy4.d.ts} +8 -0
- package/dist/{types-DGs5L0VN.d.ts → types-DSJ3-m9X.d.ts} +4 -4
- package/dist/{queue-CLJurhdy.d.ts → types-D__3EN0q.d.ts} +17 -19
- package/dist/{usage-CrvrL2vw.d.ts → usage-D0NNUFfr.d.ts} +3 -3
- package/dist/{vault-wlbBhqm7.d.ts → vault-BpmApxxW.d.ts} +3 -3
- package/dist/vercel-connect/index.d.ts +1 -1
- package/dist/vercel-connect/index.js +5 -11
- package/dist/{verify-DPuWngD4.d.ts → verify-C91Wyp40.d.ts} +5 -35
- package/dist/verify-CJbYfADA.js +124 -0
- package/dist/{version--AolB5ej.js → version-Cq8gfDbd.js} +1 -1
- package/dist/{view-BeFcRV6G.js → view-D5ryq3gz.js} +1 -1
- package/dist/{view-CF7ihnkg.d.ts → view-TpXEUcVN.d.ts} +3 -3
- package/dist/vue/index.d.ts +9 -18
- package/dist/vue/index.js +2 -2
- package/dist/{watch-Xuxrvxq-.js → watch-BcvtAHOd.js} +2 -2
- package/dist/{watch-DI34G86j.d.ts → watch-COzRWvVN.d.ts} +23 -9
- package/dist/{wire-DtZQ4sdE.js → wire-Df3EWkG8.js} +2 -2
- package/dist/{workflow-builder-DJ1oHn8g.js → workflow-builder-CHqHpAVt.js} +6 -5
- package/dist/workflow-sdk/builder/index.d.ts +3 -3
- package/dist/workflow-sdk/index.d.ts +1 -1
- package/dist/workflow-sdk/world/index.d.ts +23 -17
- package/dist/workflow-sdk/world/index.js +59 -76
- package/dist/{workflow-sdk-B3yLD6Br.d.ts → workflow-sdk-DTZyrvNo.d.ts} +3 -3
- package/dist/{workflow-sdk-world-D-prir6O.js → workflow-sdk-world-CMV1ahFW.js} +528 -526
- package/dist/{workflows-B0j9WKPu.d.ts → workflows-CcpCBfIe.d.ts} +3 -3
- package/dist/{workflows-wu1WWBn7.js → workflows-IvxzG2cl.js} +5 -4
- package/package.json +54 -3
- package/schemas/config-v1.json +243 -0
- package/schemas/doctor-report-v1.json +4 -1
- package/schemas/spec-manifest-v1.json +95 -0
- package/skills/better-supabase/SKILL.md +8 -4
- package/skills/better-supabase/references/troubleshooting.md +20 -20
- package/skills/better-supabase-api/references/expo.md +6 -3
- package/skills/better-supabase-api/references/powersync.md +2 -1
- package/skills/better-supabase-auth/SKILL.md +8 -4
- package/dist/cli/config-B9HkL8nF.js +0 -2
- package/dist/cli/gen-AIf4MREI.js +0 -3100
- package/dist/cli/gen-DSrahEdX.js +0 -2
- package/dist/cli/prompts-BTYQGunc.js +0 -2
- package/dist/cli/run-BO052mki.js +0 -361
- package/dist/config-Dn7F5k9A.js +0 -202
- package/dist/history-BZih6SFP.js +0 -64
- package/dist/index-BkWT_uBO.d.ts +0 -51
- package/dist/index-Bxih3l0u.d.ts +0 -81
- package/dist/index-CaxrMD1A.d.ts +0 -1
- package/dist/index-DQh4VCc9.d.ts +0 -98
- package/dist/keys-4MnkWTTh.js +0 -35
- package/dist/messages-DYP0sUTe.d.ts +0 -59
- package/dist/modules-dxrVK3ID.js +0 -228
- package/dist/path-Cv__-OTj.d.ts +0 -17
- package/dist/resource-BsvzCMlX.js +0 -212
- package/dist/resource-IPS5xi9q.d.ts +0 -74
- package/dist/template-CwO38Do8.d.ts +0 -6
- package/dist/verify-DL41hbvY.js +0 -232
- package/dist/cli/{read-sets-CETOSFx4.js → read-sets-DjJrm8Wj.js} +1 -1
|
@@ -1,16 +1,18 @@
|
|
|
1
|
-
import { c as mapDbError, n as dbError, o as isDbError, r as dbErrorOf } from "./errors-
|
|
2
|
-
import { t as temporal } from "./temporal-required-
|
|
3
|
-
import { a as ok, r as err, t as AsyncResult } from "./result-
|
|
4
|
-
import {
|
|
5
|
-
import { a as
|
|
1
|
+
import { c as mapDbError, n as dbError, o as isDbError, r as dbErrorOf } from "./errors-2M6CKMP4.js";
|
|
2
|
+
import { t as temporal } from "./temporal-required-BtynQtM-.js";
|
|
3
|
+
import { a as ok, r as err, s as toDbError, t as AsyncResult } from "./result-DEqHCMKP.js";
|
|
4
|
+
import { n as isRecord } from "./guards-6F2bCtQR.js";
|
|
5
|
+
import { a as postgrestExecutor, n as StatsRecorder } from "./stats-DhU78Ctf.js";
|
|
6
|
+
import { o as problemResponse } from "./problem-CJvFeGu7.js";
|
|
6
7
|
import { loadEnv } from "./env/index.js";
|
|
7
8
|
import { a as actorOf, i as userContext, n as impersonatorClaim, t as actClaim } from "./impersonation-DcqaTBHx.js";
|
|
8
|
-
import { t as fromPgError } from "./executor-
|
|
9
|
-
import {
|
|
9
|
+
import { t as fromPgError } from "./executor-B_Hfobee.js";
|
|
10
|
+
import { i as forwardBlockEvents, t as DEFAULT_TYPE_PREFIX } from "./cloud-event-CTh9Sr5w.js";
|
|
10
11
|
import { a as replicaState, i as primaryCookieWrite, o as routedExecutor, r as pinnedUntil, s as withPrimaryPin } from "./replicas-CwrYp5Zj.js";
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
12
|
+
import { t as authContext } from "./context-nPDvQ-Zl.js";
|
|
13
|
+
import { d as parseCookies, m as sessionCookieName, n as prefetchJwks, p as serializeCookie, r as resolveAuth, s as AUTH_CACHE_HEADERS, u as clearSessionAtScopes } from "./resolve-Bvgf3ut_.js";
|
|
14
|
+
import { t as credentialProviderOf } from "./provider-DxRTex4x.js";
|
|
15
|
+
import { a as respond, n as defaultPrefetchJwks, r as guard, t as defaultExpose } from "./respond-volM3ByS.js";
|
|
14
16
|
import { createClient } from "@supabase/supabase-js";
|
|
15
17
|
import { defineMiddleware, getEnv, pipeline, seedContext } from "@supabase/middleware";
|
|
16
18
|
import { PostgrestClient } from "@supabase/postgrest-js";
|
|
@@ -203,6 +205,11 @@ function suspendAccount(service, sql, userId, options) {
|
|
|
203
205
|
if (suspended) {
|
|
204
206
|
const refused = await ban(client, userId, options.duration ?? FOREVER);
|
|
205
207
|
if (refused) return err(refused);
|
|
208
|
+
if (options.endSessions !== true) return ok({
|
|
209
|
+
userId,
|
|
210
|
+
suspended,
|
|
211
|
+
ended: 0
|
|
212
|
+
});
|
|
206
213
|
}
|
|
207
214
|
let ended;
|
|
208
215
|
try {
|
|
@@ -246,7 +253,7 @@ function serverAudit(betterSupabase, sink) {
|
|
|
246
253
|
specversion: "1.0",
|
|
247
254
|
id: crypto.randomUUID(),
|
|
248
255
|
source: SERVER_EVENT_SOURCE,
|
|
249
|
-
type:
|
|
256
|
+
type: `${DEFAULT_TYPE_PREFIX}.${type}`,
|
|
250
257
|
subject: `users/${userId}`,
|
|
251
258
|
time: (/* @__PURE__ */ new Date()).toISOString(),
|
|
252
259
|
datacontenttype: "application/json",
|
|
@@ -263,6 +270,149 @@ function serverAudit(betterSupabase, sink) {
|
|
|
263
270
|
} };
|
|
264
271
|
}
|
|
265
272
|
//#endregion
|
|
273
|
+
//#region src/server/clients.ts
|
|
274
|
+
const STATELESS = {
|
|
275
|
+
persistSession: false,
|
|
276
|
+
autoRefreshToken: false,
|
|
277
|
+
detectSessionInUrl: false
|
|
278
|
+
};
|
|
279
|
+
/** The Supabase and PostgREST clients of one server: shared service and anon clients, per-request user clients. */
|
|
280
|
+
function createClients(input) {
|
|
281
|
+
const { options, env, definitionExecutor, lite, createClient } = input;
|
|
282
|
+
let adminClient;
|
|
283
|
+
let anonClient;
|
|
284
|
+
const secretKey = () => {
|
|
285
|
+
const key = env().secretKey;
|
|
286
|
+
if (!key) throw new TypeError("admin() needs SUPABASE_SECRET_KEY; it is not set");
|
|
287
|
+
return key;
|
|
288
|
+
};
|
|
289
|
+
const customFetch = options.fetch ? { fetch: options.fetch } : void 0;
|
|
290
|
+
const urlLengthLimit = options.db?.urlLengthLimit ?? definitionExecutor.urlLengthLimit;
|
|
291
|
+
const db = {
|
|
292
|
+
...options.db?.timeout === void 0 ? {} : { timeout: options.db.timeout },
|
|
293
|
+
...options.db?.retry === void 0 ? {} : { retry: options.db.retry },
|
|
294
|
+
...urlLengthLimit === void 0 ? {} : { urlLengthLimit }
|
|
295
|
+
};
|
|
296
|
+
const dbOptions = Object.keys(db).length > 0 ? { db } : {};
|
|
297
|
+
const sharedGlobal = {
|
|
298
|
+
...customFetch ? { global: customFetch } : {},
|
|
299
|
+
...dbOptions
|
|
300
|
+
};
|
|
301
|
+
/** postgrest-js options a bare `PostgrestClient` takes; `timeout` is the executor's. */
|
|
302
|
+
const restOptions = {
|
|
303
|
+
...db.retry === void 0 ? {} : { retry: db.retry },
|
|
304
|
+
...urlLengthLimit === void 0 ? {} : { urlLengthLimit }
|
|
305
|
+
};
|
|
306
|
+
const rpcUnavailable = lite?.rpcUnavailable;
|
|
307
|
+
const executorOptions = {
|
|
308
|
+
...definitionExecutor,
|
|
309
|
+
...urlLengthLimit === void 0 ? {} : { urlLengthLimit },
|
|
310
|
+
...db.timeout === void 0 ? {} : { timeout: db.timeout },
|
|
311
|
+
...db.retry === void 0 ? {} : { retry: db.retry },
|
|
312
|
+
...rpcUnavailable === void 0 ? {} : { rpcUnavailable }
|
|
313
|
+
};
|
|
314
|
+
/** Set when `db` options or the backend need an executor built with them. */
|
|
315
|
+
const tunedExecutor = options.db !== void 0 || rpcUnavailable !== void 0;
|
|
316
|
+
const serviceClient = () => {
|
|
317
|
+
adminClient ??= createClient(env().url, secretKey(), {
|
|
318
|
+
auth: STATELESS,
|
|
319
|
+
...sharedGlobal
|
|
320
|
+
});
|
|
321
|
+
return adminClient;
|
|
322
|
+
};
|
|
323
|
+
const readUrl = () => options.readUrl === false ? void 0 : options.readUrl?.replace(/\/+$/, "") ?? env().readUrl;
|
|
324
|
+
const apiKeyClient = () => {
|
|
325
|
+
throw new TypeError("ctx.supabase and ctx.db.$client are not available for an API key: ctx.db and ctx.sql run over direct Postgres with the key's claims");
|
|
326
|
+
};
|
|
327
|
+
/** Clients for the primary share the service and anon clients; others don't. */
|
|
328
|
+
const supabaseAt = (url, auth, headers = {}) => {
|
|
329
|
+
const custom = Object.keys(headers).length > 0;
|
|
330
|
+
const global = custom ? {
|
|
331
|
+
global: {
|
|
332
|
+
headers,
|
|
333
|
+
...customFetch
|
|
334
|
+
},
|
|
335
|
+
...dbOptions
|
|
336
|
+
} : sharedGlobal;
|
|
337
|
+
const shared = !custom && url === env().url;
|
|
338
|
+
switch (auth.kind) {
|
|
339
|
+
case "user": return createClient(url, env().publishableKey, {
|
|
340
|
+
accessToken: () => Promise.resolve(auth.token),
|
|
341
|
+
...global
|
|
342
|
+
});
|
|
343
|
+
case "service": return shared ? serviceClient() : createClient(url, secretKey(), {
|
|
344
|
+
auth: STATELESS,
|
|
345
|
+
...global
|
|
346
|
+
});
|
|
347
|
+
case "anon":
|
|
348
|
+
case "invalid":
|
|
349
|
+
if (!shared) return createClient(url, env().publishableKey, {
|
|
350
|
+
auth: STATELESS,
|
|
351
|
+
...global
|
|
352
|
+
});
|
|
353
|
+
anonClient ??= createClient(url, env().publishableKey, {
|
|
354
|
+
auth: STATELESS,
|
|
355
|
+
...sharedGlobal
|
|
356
|
+
});
|
|
357
|
+
return anonClient;
|
|
358
|
+
case "apiKey": return apiKeyClient();
|
|
359
|
+
default: return auth;
|
|
360
|
+
}
|
|
361
|
+
};
|
|
362
|
+
const supabaseFor = (auth, headers = {}) => supabaseAt(env().url, auth, headers);
|
|
363
|
+
const restUrls = /* @__PURE__ */ new Map();
|
|
364
|
+
const restUrl = (url) => {
|
|
365
|
+
let rest = restUrls.get(url);
|
|
366
|
+
if (rest === void 0) {
|
|
367
|
+
rest = new URL("rest/v1", url.endsWith("/") ? url : `${url}/`).href;
|
|
368
|
+
restUrls.set(url, rest);
|
|
369
|
+
}
|
|
370
|
+
return rest;
|
|
371
|
+
};
|
|
372
|
+
/**
|
|
373
|
+
* The client queries run on. Requests need only PostgREST, so they skip
|
|
374
|
+
* building Realtime, Storage and Auth clients per request; the shared
|
|
375
|
+
* service and anon clients for the primary are built once anyway.
|
|
376
|
+
*/
|
|
377
|
+
const restAt = (url, auth, headers = {}) => {
|
|
378
|
+
let key;
|
|
379
|
+
let bearer;
|
|
380
|
+
switch (auth.kind) {
|
|
381
|
+
case "user":
|
|
382
|
+
key = env().publishableKey;
|
|
383
|
+
bearer = auth.token;
|
|
384
|
+
break;
|
|
385
|
+
case "service":
|
|
386
|
+
case "anon":
|
|
387
|
+
case "invalid":
|
|
388
|
+
if (Object.keys(headers).length === 0 && url === env().url) return supabaseAt(url, auth, headers);
|
|
389
|
+
key = auth.kind === "service" ? secretKey() : env().publishableKey;
|
|
390
|
+
bearer = key;
|
|
391
|
+
break;
|
|
392
|
+
case "apiKey": return apiKeyClient();
|
|
393
|
+
default: return auth;
|
|
394
|
+
}
|
|
395
|
+
return new PostgrestClient(restUrl(url), {
|
|
396
|
+
headers: {
|
|
397
|
+
...headers,
|
|
398
|
+
apikey: key,
|
|
399
|
+
Authorization: `Bearer ${bearer}`
|
|
400
|
+
},
|
|
401
|
+
...customFetch,
|
|
402
|
+
...restOptions
|
|
403
|
+
});
|
|
404
|
+
};
|
|
405
|
+
return {
|
|
406
|
+
executorOptions,
|
|
407
|
+
tunedExecutor,
|
|
408
|
+
serviceClient,
|
|
409
|
+
readUrl,
|
|
410
|
+
apiKeyClient,
|
|
411
|
+
supabaseFor,
|
|
412
|
+
restAt
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
//#endregion
|
|
266
416
|
//#region src/server/entries/core.ts
|
|
267
417
|
const cores = /* @__PURE__ */ new WeakMap();
|
|
268
418
|
/** Records the core behind `server`, so `serverCore` finds it on copies too. */
|
|
@@ -451,6 +601,58 @@ function withTenant(core) {
|
|
|
451
601
|
})();
|
|
452
602
|
}
|
|
453
603
|
//#endregion
|
|
604
|
+
//#region src/server/lite.ts
|
|
605
|
+
/** Lite's default driver, the one `lite init` scaffolds. */
|
|
606
|
+
const DEFAULT_LITE_DRIVER = "sqlite-postgres";
|
|
607
|
+
/** Whether the driver stores data in SQLite, where Lite has no database functions. */
|
|
608
|
+
function isSqliteDriver(driver) {
|
|
609
|
+
switch (driver) {
|
|
610
|
+
case "sqlite-postgres":
|
|
611
|
+
case "sqlite": return true;
|
|
612
|
+
case "pglite":
|
|
613
|
+
case "postgres": return false;
|
|
614
|
+
default: return driver;
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
function liteRpcUnavailable(driver) {
|
|
618
|
+
return `rpc() is not available on Supabase Lite with the ${driver} driver. Set [db] driver = "pglite" or "postgres" in supabase/config.toml, or call an HTTP endpoint instead.`;
|
|
619
|
+
}
|
|
620
|
+
/** What `backend: "lite"` changes in `createServer`; `undefined` for Supabase. */
|
|
621
|
+
function liteBackend(options, env) {
|
|
622
|
+
if (options.backend !== "lite") return void 0;
|
|
623
|
+
const driver = options.liteDriver ?? DEFAULT_LITE_DRIVER;
|
|
624
|
+
if (options.postgres && driver !== "postgres") throw new TypeError(`Supabase Lite with the ${driver} driver has no Postgres connection for ctx.sql. Remove the postgres option, or run Lite with [db] driver = "postgres".`);
|
|
625
|
+
return {
|
|
626
|
+
auth() {
|
|
627
|
+
if (options.auth?.jwtSecret !== void 0) return options.auth;
|
|
628
|
+
const jwtSecret = env().jwtSecret;
|
|
629
|
+
if (jwtSecret === void 0) throw new TypeError("backend: \"lite\" needs SUPABASE_JWT_SECRET, the auth.jwt_secret Supabase Lite signs user tokens with");
|
|
630
|
+
return {
|
|
631
|
+
...options.auth,
|
|
632
|
+
jwtSecret
|
|
633
|
+
};
|
|
634
|
+
},
|
|
635
|
+
rpcUnavailable: isSqliteDriver(driver) ? liteRpcUnavailable(driver) : void 0
|
|
636
|
+
};
|
|
637
|
+
}
|
|
638
|
+
//#endregion
|
|
639
|
+
//#region src/server/refusing-executor.ts
|
|
640
|
+
/**
|
|
641
|
+
* An executor for credentials that did not verify: every query, function
|
|
642
|
+
* call and batch answers `error`, so a handler that skips the route guard
|
|
643
|
+
* gets a 401 `Result` and never queries as anon.
|
|
644
|
+
*/
|
|
645
|
+
function refusingExecutor(error) {
|
|
646
|
+
const refuse = () => err(error);
|
|
647
|
+
return {
|
|
648
|
+
name: "refused",
|
|
649
|
+
functionSources: true,
|
|
650
|
+
execute: () => Promise.resolve(refuse()),
|
|
651
|
+
rpc: () => Promise.resolve(refuse()),
|
|
652
|
+
batch: (ops) => Promise.resolve(ops.map(() => refuse()))
|
|
653
|
+
};
|
|
654
|
+
}
|
|
655
|
+
//#endregion
|
|
454
656
|
//#region src/server/request-ids.ts
|
|
455
657
|
const REQUEST_ID_PATTERN = /^[A-Za-z0-9._:;,@/+=-]{1,128}$/;
|
|
456
658
|
function requestIdOrUndefined(value) {
|
|
@@ -502,6 +704,10 @@ function requestIdPolicy(options = {}) {
|
|
|
502
704
|
};
|
|
503
705
|
}
|
|
504
706
|
//#endregion
|
|
707
|
+
//#region src/server/server-types.ts
|
|
708
|
+
/** The header `current_tenant_id()` reads over the Data API. */
|
|
709
|
+
const TENANT_HEADER = "x-bs-tenant";
|
|
710
|
+
//#endregion
|
|
505
711
|
//#region src/auth/support-cookie.ts
|
|
506
712
|
/** The cookie that carries the support session id. */
|
|
507
713
|
const SUPPORT_COOKIE = "bs-support";
|
|
@@ -553,21 +759,415 @@ const supportOff = {
|
|
|
553
759
|
revoke: notConfigured,
|
|
554
760
|
current: () => Promise.resolve(void 0),
|
|
555
761
|
list: notConfigured,
|
|
762
|
+
expire: notConfigured,
|
|
763
|
+
expireRoute: () => () => Promise.resolve(problemResponse(dbError("unexpected", NOT_CONFIGURED))),
|
|
556
764
|
sessionIdOf: () => void 0,
|
|
557
765
|
clearCookie: () => clearSupportCookie()
|
|
558
766
|
};
|
|
559
767
|
//#endregion
|
|
768
|
+
//#region src/server/support-storage.ts
|
|
769
|
+
const VISIBLE_OBJECT = "select exists (select 1 from storage.objects o where o.bucket_id = $1 and o.name = $2) as visible";
|
|
770
|
+
const VISIBLE_OBJECTS = `select n.path from unnest($2::text[]) as n(path)
|
|
771
|
+
where exists (select 1 from storage.objects o where o.bucket_id = $1 and o.name = n.path)`;
|
|
772
|
+
const OBJECT_INFO = "select to_jsonb(o) as object from storage.objects o where o.bucket_id = $1 and o.name = $2";
|
|
773
|
+
const SEARCH = `select s.name, s.id::text as id, s.updated_at, s.created_at, s.last_accessed_at, s.metadata
|
|
774
|
+
from storage.search($1::text, $2::text, $3::int, $4::int, $5::int, $6::text, $7::text, $8::text) s`;
|
|
775
|
+
const SEARCH_V2 = `select s.key, s.name, s.id::text as id, s.updated_at, s.created_at, s.last_accessed_at, s.metadata
|
|
776
|
+
from storage.search_v2($1::text, $2::text, $3::int, $4::int, $5::text, $6::text, $7::text, $8::text) s`;
|
|
777
|
+
const HIDDEN_URL = "Either the object does not exist or you do not have access to it";
|
|
778
|
+
const LIST_SORT_COLUMNS = /* @__PURE__ */ new Set([
|
|
779
|
+
"name",
|
|
780
|
+
"updated_at",
|
|
781
|
+
"created_at",
|
|
782
|
+
"last_accessed_at"
|
|
783
|
+
]);
|
|
784
|
+
const LIST_V2_SORT_COLUMNS = /* @__PURE__ */ new Set([
|
|
785
|
+
"name",
|
|
786
|
+
"updated_at",
|
|
787
|
+
"created_at"
|
|
788
|
+
]);
|
|
789
|
+
const FLAT_SORT_COLUMNS = /* @__PURE__ */ new Set(["updated_at", "created_at"]);
|
|
790
|
+
const SORT_ORDERS = /* @__PURE__ */ new Set(["asc", "desc"]);
|
|
791
|
+
const CURSOR_PARTS = {
|
|
792
|
+
l: "startAfter",
|
|
793
|
+
o: "sortOrder",
|
|
794
|
+
c: "sortColumn",
|
|
795
|
+
a: "sortColumnAfter"
|
|
796
|
+
};
|
|
797
|
+
const isCursorKey = (key) => Object.hasOwn(CURSOR_PARTS, key);
|
|
798
|
+
/** The path storage-js sends for an upload: no leading or trailing `/`, and no empty folders. */
|
|
799
|
+
function normalizePath(path) {
|
|
800
|
+
return path.replaceAll(/^\/|\/$/g, "").replaceAll(/\/+/g, "/");
|
|
801
|
+
}
|
|
802
|
+
/** `undefined` for an empty string, which storage-api treats as absent. */
|
|
803
|
+
const filled = (value) => value === "" ? void 0 : value;
|
|
804
|
+
/** `LIKE` escaping as storage-api applies it. */
|
|
805
|
+
function escapeLike(text) {
|
|
806
|
+
return text.replaceAll("\\", "\\\\").replaceAll(/([%_])/g, "\\$1");
|
|
807
|
+
}
|
|
808
|
+
function iso(value) {
|
|
809
|
+
if (value instanceof Date) return value.toISOString();
|
|
810
|
+
if (typeof value !== "string") return value;
|
|
811
|
+
const time = Date.parse(value);
|
|
812
|
+
return Number.isNaN(time) ? value : new Date(time).toISOString();
|
|
813
|
+
}
|
|
814
|
+
/** storage-api's continuation token: `key:value` lines, base64 encoded. */
|
|
815
|
+
function encodeCursor(cursor) {
|
|
816
|
+
const text = Object.entries(CURSOR_PARTS).flatMap(([key, part]) => cursor[part] ? [`${key}:${cursor[part]}`] : []).join("\n");
|
|
817
|
+
let binary = "";
|
|
818
|
+
for (const byte of new TextEncoder().encode(text)) binary += String.fromCodePoint(byte);
|
|
819
|
+
return btoa(binary);
|
|
820
|
+
}
|
|
821
|
+
function decodeCursor(token) {
|
|
822
|
+
let text;
|
|
823
|
+
try {
|
|
824
|
+
text = new TextDecoder().decode(Uint8Array.from(atob(token), (char) => char.codePointAt(0) ?? 0));
|
|
825
|
+
} catch {
|
|
826
|
+
return;
|
|
827
|
+
}
|
|
828
|
+
const cursor = {
|
|
829
|
+
startAfter: "",
|
|
830
|
+
sortOrder: "asc"
|
|
831
|
+
};
|
|
832
|
+
for (const part of text.split("\n")) {
|
|
833
|
+
const match = /^(\S):(.*)/.exec(part);
|
|
834
|
+
const key = match?.[1];
|
|
835
|
+
if (!key || !isCursorKey(key)) return void 0;
|
|
836
|
+
cursor[CURSOR_PARTS[key]] = match[2] ?? "";
|
|
837
|
+
}
|
|
838
|
+
return cursor;
|
|
839
|
+
}
|
|
840
|
+
const apiError = (status, message, code) => ({
|
|
841
|
+
name: "StorageApiError",
|
|
842
|
+
message,
|
|
843
|
+
status,
|
|
844
|
+
statusCode: String(status),
|
|
845
|
+
code
|
|
846
|
+
});
|
|
847
|
+
const failed = (error) => ({
|
|
848
|
+
data: null,
|
|
849
|
+
error
|
|
850
|
+
});
|
|
851
|
+
/** Storage answers a hidden object like a missing one: HTTP 400 with `statusCode` 404. */
|
|
852
|
+
const NOT_FOUND = {
|
|
853
|
+
name: "StorageApiError",
|
|
854
|
+
message: "Object not found",
|
|
855
|
+
status: 400,
|
|
856
|
+
statusCode: "404",
|
|
857
|
+
code: "NoSuchKey"
|
|
858
|
+
};
|
|
859
|
+
const invalid = (message) => apiError(400, message, "InvalidRequest");
|
|
860
|
+
/** A database failure as a Storage `error` that `fromStorageError` passes through unchanged. */
|
|
861
|
+
function sqlFailure(cause) {
|
|
862
|
+
const raw = fromPgError(cause);
|
|
863
|
+
return {
|
|
864
|
+
name: "DbError",
|
|
865
|
+
...raw ? mapDbError(raw) : toDbError(cause)
|
|
866
|
+
};
|
|
867
|
+
}
|
|
868
|
+
async function settled(run) {
|
|
869
|
+
try {
|
|
870
|
+
return await run();
|
|
871
|
+
} catch (cause) {
|
|
872
|
+
return failed(sqlFailure(cause));
|
|
873
|
+
}
|
|
874
|
+
}
|
|
875
|
+
function listProblem(options) {
|
|
876
|
+
const { limit, offset, sortBy } = options;
|
|
877
|
+
if (limit !== void 0 && (!Number.isInteger(limit) || limit < 1)) return "body/limit must be an integer of at least 1";
|
|
878
|
+
if (offset !== void 0 && (!Number.isInteger(offset) || offset < 0)) return "body/offset must be an integer of at least 0";
|
|
879
|
+
if (sortBy?.column !== void 0 && !LIST_SORT_COLUMNS.has(sortBy.column)) return "body/sortBy/column must be name, updated_at, created_at or last_accessed_at";
|
|
880
|
+
if (sortBy?.order !== void 0 && !SORT_ORDERS.has(sortBy.order)) return "body/sortBy/order must be asc or desc";
|
|
881
|
+
}
|
|
882
|
+
function listV2Problem(options) {
|
|
883
|
+
const { limit, sortBy } = options;
|
|
884
|
+
if (limit !== void 0 && (!Number.isInteger(limit) || limit < 1)) return "body/limit must be an integer of at least 1";
|
|
885
|
+
if (sortBy !== void 0 && !LIST_V2_SORT_COLUMNS.has(sortBy.column)) return "body/sortBy/column must be name, updated_at or created_at";
|
|
886
|
+
if (sortBy?.order !== void 0 && !SORT_ORDERS.has(sortBy.order)) return "body/sortBy/order must be asc or desc";
|
|
887
|
+
}
|
|
888
|
+
/** The query storage-api runs for a `list-v2` page without a delimiter. */
|
|
889
|
+
function flatPage(bucket, prefix, maxKeys, cursor, column, order) {
|
|
890
|
+
const values = [bucket, maxKeys];
|
|
891
|
+
const conditions = ["bucket_id = $1"];
|
|
892
|
+
const sortColumn = column && FLAT_SORT_COLUMNS.has(column) ? column : void 0;
|
|
893
|
+
const sortOrder = order && SORT_ORDERS.has(order) ? order : "asc";
|
|
894
|
+
const operator = sortOrder === "asc" ? ">" : "<";
|
|
895
|
+
const param = () => `$${String(values.length)}`;
|
|
896
|
+
if (prefix) {
|
|
897
|
+
values.push(`${escapeLike(prefix)}%`);
|
|
898
|
+
conditions.push(`name like ${param()}`);
|
|
899
|
+
}
|
|
900
|
+
const startAfter = cursor?.startAfter;
|
|
901
|
+
if (startAfter && sortColumn && cursor.sortColumnAfter) {
|
|
902
|
+
values.push(cursor.sortColumnAfter);
|
|
903
|
+
const afterParam = param();
|
|
904
|
+
values.push(startAfter);
|
|
905
|
+
conditions.push(`row(date_trunc('milliseconds', ${sortColumn}), name collate "C") ${operator} row(coalesce(nullif(${afterParam}, '')::timestamptz, 'epoch'::timestamptz), ${param()})`);
|
|
906
|
+
} else if (startAfter) {
|
|
907
|
+
values.push(startAfter);
|
|
908
|
+
conditions.push(`name collate "C" ${operator} ${param()}`);
|
|
909
|
+
}
|
|
910
|
+
return {
|
|
911
|
+
text: `select id::text as id, name, metadata, updated_at, created_at, last_accessed_at
|
|
912
|
+
from storage.objects
|
|
913
|
+
where ${conditions.join(" and ")}
|
|
914
|
+
order by ${sortColumn ? `${sortColumn} ${sortOrder}, ` : ""}name collate "C" ${sortOrder}
|
|
915
|
+
limit $2::int`,
|
|
916
|
+
values
|
|
917
|
+
};
|
|
918
|
+
}
|
|
919
|
+
/** Groups the entries below the next delimiter into folders, as storage-api does. */
|
|
920
|
+
function delimited(entries, prefix) {
|
|
921
|
+
const grouped = [];
|
|
922
|
+
let previous = "";
|
|
923
|
+
for (const entry of entries) {
|
|
924
|
+
const name = String(entry["name"]);
|
|
925
|
+
const index = name.replace(prefix, "").indexOf("/");
|
|
926
|
+
if (index < 0) {
|
|
927
|
+
grouped.push(entry);
|
|
928
|
+
continue;
|
|
929
|
+
}
|
|
930
|
+
const folder = name.slice(0, prefix.length + index + 1);
|
|
931
|
+
if (folder === previous) continue;
|
|
932
|
+
previous = folder;
|
|
933
|
+
grouped.push({
|
|
934
|
+
id: null,
|
|
935
|
+
name: folder
|
|
936
|
+
});
|
|
937
|
+
}
|
|
938
|
+
return grouped;
|
|
939
|
+
}
|
|
940
|
+
const text = (value) => typeof value === "string" ? value : void 0;
|
|
941
|
+
const metadataOf = (value) => isRecord(value) ? value : null;
|
|
942
|
+
function listEntryOf(row) {
|
|
943
|
+
return {
|
|
944
|
+
name: String(row["name"]),
|
|
945
|
+
id: text(row["id"]) ?? null,
|
|
946
|
+
updated_at: text(iso(row["updated_at"])) ?? null,
|
|
947
|
+
created_at: text(iso(row["created_at"])) ?? null,
|
|
948
|
+
last_accessed_at: text(iso(row["last_accessed_at"])) ?? null,
|
|
949
|
+
metadata: metadataOf(row["metadata"])
|
|
950
|
+
};
|
|
951
|
+
}
|
|
952
|
+
function folderOf(row) {
|
|
953
|
+
const name = String(row["name"]);
|
|
954
|
+
const key = text(row["key"]);
|
|
955
|
+
return {
|
|
956
|
+
name: name.endsWith("/") ? name : `${name}/`,
|
|
957
|
+
...key === void 0 ? {} : { key }
|
|
958
|
+
};
|
|
959
|
+
}
|
|
960
|
+
function objectOf(row) {
|
|
961
|
+
const key = text(row["key"]);
|
|
962
|
+
const lastAccessed = text(iso(row["last_accessed_at"]));
|
|
963
|
+
return {
|
|
964
|
+
name: String(row["name"]),
|
|
965
|
+
...key === void 0 ? {} : { key },
|
|
966
|
+
id: text(row["id"]) ?? "",
|
|
967
|
+
updated_at: text(iso(row["updated_at"])) ?? "",
|
|
968
|
+
created_at: text(iso(row["created_at"])) ?? "",
|
|
969
|
+
...lastAccessed === void 0 ? {} : { last_accessed_at: lastAccessed },
|
|
970
|
+
metadata: metadataOf(row["metadata"])
|
|
971
|
+
};
|
|
972
|
+
}
|
|
973
|
+
function infoOf(row) {
|
|
974
|
+
const metadata = isRecord(row["metadata"]) ? row["metadata"] : {};
|
|
975
|
+
const size = metadata["size"];
|
|
976
|
+
const contentType = text(metadata["mimetype"]);
|
|
977
|
+
const cacheControl = text(metadata["cacheControl"]);
|
|
978
|
+
const etag = text(metadata["eTag"]);
|
|
979
|
+
const lastModified = text(iso(row["updated_at"]));
|
|
980
|
+
const userMetadata = row["user_metadata"];
|
|
981
|
+
const archivedAt = row["archived_at"];
|
|
982
|
+
const deleteMarker = row["is_delete_marker"];
|
|
983
|
+
const versioned = row["is_versioned"];
|
|
984
|
+
return {
|
|
985
|
+
id: text(row["id"]) ?? "",
|
|
986
|
+
name: text(row["name"]) ?? "",
|
|
987
|
+
version: text(row["version"]) ?? "",
|
|
988
|
+
bucketId: text(row["bucket_id"]) ?? "",
|
|
989
|
+
createdAt: text(iso(row["created_at"])) ?? "",
|
|
990
|
+
...typeof size === "number" ? { size } : {},
|
|
991
|
+
...contentType === void 0 ? {} : { contentType },
|
|
992
|
+
...cacheControl === void 0 ? {} : { cacheControl },
|
|
993
|
+
...etag === void 0 ? {} : { etag },
|
|
994
|
+
...lastModified === void 0 ? {} : { lastModified },
|
|
995
|
+
...isRecord(userMetadata) ? { metadata: userMetadata } : {},
|
|
996
|
+
...archivedAt === void 0 ? {} : { archivedAt: text(iso(archivedAt)) ?? null },
|
|
997
|
+
...typeof deleteMarker === "boolean" ? { isDeleteMarker: deleteMarker } : {},
|
|
998
|
+
...typeof versioned === "boolean" ? { isVersioned: versioned } : {}
|
|
999
|
+
};
|
|
1000
|
+
}
|
|
1001
|
+
/**
|
|
1002
|
+
* Storage for a support session, with the same `from(bucket)` file API as
|
|
1003
|
+
* `supabase.storage`, so `bucket.connect()` and the blocks take it.
|
|
1004
|
+
*
|
|
1005
|
+
* Storage policies read `auth.uid()` from the request's token, and there is
|
|
1006
|
+
* no token for the target, so reads go through Postgres as the target.
|
|
1007
|
+
* `exists`, `info`, `list` and `listV2` run entirely there: the listings
|
|
1008
|
+
* call the invoker-rights `storage.search` functions storage-api calls, so
|
|
1009
|
+
* RLS filters each page as it would for the target's own request.
|
|
1010
|
+
* `download` and the signed URLs first check there that the target may see
|
|
1011
|
+
* the object, then the service client serves it. A hidden object answers
|
|
1012
|
+
* like a missing one. `getPublicUrl` is built without a check, as it is
|
|
1013
|
+
* built without a request.
|
|
1014
|
+
*
|
|
1015
|
+
* Writes resolve to a `403` error: `SUPPORT_READ_ONLY` in a read-only
|
|
1016
|
+
* session and `SUPPORT_STORAGE_WRITES` in a writable one. The service client
|
|
1017
|
+
* would store the object with no owner, and Storage never sees the session's
|
|
1018
|
+
* `act` claim, so the write could be neither attributed to the target nor
|
|
1019
|
+
* audited as the admin's.
|
|
1020
|
+
*/
|
|
1021
|
+
function supportStorage(options) {
|
|
1022
|
+
const refusal = options.readOnly ?? true ? apiError(403, "The support session is read-only", "SUPPORT_READ_ONLY") : apiError(403, "Storage writes are not available in a support session", "SUPPORT_STORAGE_WRITES");
|
|
1023
|
+
const refuse = () => Promise.resolve(failed(refusal));
|
|
1024
|
+
const rows = (query, values) => options.sql.queryRaw(query, values);
|
|
1025
|
+
return { from(bucket) {
|
|
1026
|
+
const admin = () => options.admin.from(bucket);
|
|
1027
|
+
const visible = async (path) => {
|
|
1028
|
+
const [row] = await rows(VISIBLE_OBJECT, [bucket, path]);
|
|
1029
|
+
return row?.["visible"] === true;
|
|
1030
|
+
};
|
|
1031
|
+
const checked = (path, read) => settled(async () => {
|
|
1032
|
+
const name = normalizePath(path);
|
|
1033
|
+
if (!await visible(name)) return failed(NOT_FOUND);
|
|
1034
|
+
return read(name);
|
|
1035
|
+
});
|
|
1036
|
+
const list = (path, listOptions = {}) => settled(async () => {
|
|
1037
|
+
const problem = listProblem(listOptions);
|
|
1038
|
+
if (problem) return failed(invalid(problem));
|
|
1039
|
+
let prefix = path ?? "";
|
|
1040
|
+
if (prefix.length > 0 && !prefix.endsWith("/")) prefix = `${prefix}/`;
|
|
1041
|
+
const column = listOptions.sortBy?.column ?? "name";
|
|
1042
|
+
const escape = column !== "name";
|
|
1043
|
+
const safePrefix = escape ? escapeLike(prefix) : prefix;
|
|
1044
|
+
const search = listOptions.search ?? "";
|
|
1045
|
+
const safeSearch = escape ? escapeLike(search) : search;
|
|
1046
|
+
return {
|
|
1047
|
+
data: (await rows(SEARCH, [
|
|
1048
|
+
safePrefix,
|
|
1049
|
+
bucket,
|
|
1050
|
+
listOptions.limit ?? 100,
|
|
1051
|
+
(safePrefix + safeSearch).split("/").length,
|
|
1052
|
+
listOptions.offset ?? 0,
|
|
1053
|
+
safeSearch,
|
|
1054
|
+
column,
|
|
1055
|
+
listOptions.sortBy?.order ?? "asc"
|
|
1056
|
+
])).map(listEntryOf),
|
|
1057
|
+
error: null
|
|
1058
|
+
};
|
|
1059
|
+
});
|
|
1060
|
+
const listV2 = (listOptions = {}) => settled(async () => {
|
|
1061
|
+
const problem = listV2Problem(listOptions);
|
|
1062
|
+
if (problem) return failed(invalid(problem));
|
|
1063
|
+
const limit = Math.min(listOptions.limit ?? 1e3, 1e3);
|
|
1064
|
+
const prefix = listOptions.prefix ?? "";
|
|
1065
|
+
const cursor = listOptions.cursor ? decodeCursor(listOptions.cursor) : void 0;
|
|
1066
|
+
if (listOptions.cursor && !cursor) return failed(apiError(400, "Invalid continuation token", "InvalidParameter"));
|
|
1067
|
+
const sortOrder = filled(cursor?.sortOrder) ?? listOptions.sortBy?.order;
|
|
1068
|
+
const sortColumn = filled(cursor?.sortColumn) ?? listOptions.sortBy?.column;
|
|
1069
|
+
let found;
|
|
1070
|
+
if (listOptions.with_delimiter) found = await rows(SEARCH_V2, [
|
|
1071
|
+
prefix,
|
|
1072
|
+
bucket,
|
|
1073
|
+
limit + 1,
|
|
1074
|
+
prefix ? prefix.split("/").length : 1,
|
|
1075
|
+
cursor?.startAfter ?? "",
|
|
1076
|
+
sortOrder ?? "asc",
|
|
1077
|
+
sortColumn ?? "name",
|
|
1078
|
+
filled(cursor?.sortColumnAfter) ?? null
|
|
1079
|
+
]);
|
|
1080
|
+
else {
|
|
1081
|
+
const page = flatPage(bucket, listOptions.prefix, limit + 1, cursor, sortColumn, sortOrder);
|
|
1082
|
+
found = await rows(page.text, page.values);
|
|
1083
|
+
}
|
|
1084
|
+
const entries = listOptions.with_delimiter ? delimited(found, prefix) : found;
|
|
1085
|
+
const hasNext = entries.length > limit;
|
|
1086
|
+
const count = hasNext ? limit : entries.length;
|
|
1087
|
+
const folders = [];
|
|
1088
|
+
const objects = [];
|
|
1089
|
+
for (const entry of entries.slice(0, count)) if (entry["id"] === null || entry["id"] === void 0) folders.push(folderOf(entry));
|
|
1090
|
+
else objects.push(objectOf(entry));
|
|
1091
|
+
const last = entries[count - 1];
|
|
1092
|
+
const after = last && sortColumn && sortColumn !== "name" ? iso(last[sortColumn]) : void 0;
|
|
1093
|
+
const nextCursor = hasNext && last ? encodeCursor({
|
|
1094
|
+
startAfter: String(last["name"]),
|
|
1095
|
+
...sortOrder ? { sortOrder } : {},
|
|
1096
|
+
...sortColumn ? { sortColumn } : {},
|
|
1097
|
+
...typeof after === "string" ? { sortColumnAfter: new Date(after).toISOString() } : {}
|
|
1098
|
+
}) : void 0;
|
|
1099
|
+
return {
|
|
1100
|
+
data: {
|
|
1101
|
+
hasNext,
|
|
1102
|
+
...nextCursor === void 0 ? {} : { nextCursor },
|
|
1103
|
+
folders,
|
|
1104
|
+
objects
|
|
1105
|
+
},
|
|
1106
|
+
error: null
|
|
1107
|
+
};
|
|
1108
|
+
});
|
|
1109
|
+
return {
|
|
1110
|
+
exists: (path) => settled(async () => ({
|
|
1111
|
+
data: await visible(normalizePath(path)),
|
|
1112
|
+
error: null
|
|
1113
|
+
})).then((reply) => reply.error === null ? reply : {
|
|
1114
|
+
data: false,
|
|
1115
|
+
error: reply.error
|
|
1116
|
+
}),
|
|
1117
|
+
info: (path, infoOptions) => settled(async () => {
|
|
1118
|
+
const versionId = infoOptions?.versionId;
|
|
1119
|
+
const name = normalizePath(path);
|
|
1120
|
+
const [row] = await rows(versionId === void 0 ? OBJECT_INFO : `${OBJECT_INFO} and o.version = $3`, versionId === void 0 ? [bucket, name] : [
|
|
1121
|
+
bucket,
|
|
1122
|
+
name,
|
|
1123
|
+
versionId
|
|
1124
|
+
]);
|
|
1125
|
+
const object = row?.["object"];
|
|
1126
|
+
return isRecord(object) ? {
|
|
1127
|
+
data: infoOf(object),
|
|
1128
|
+
error: null
|
|
1129
|
+
} : failed(NOT_FOUND);
|
|
1130
|
+
}),
|
|
1131
|
+
download: (path, downloadOptions, parameters) => checked(path, (name) => admin().download(name, downloadOptions, parameters)),
|
|
1132
|
+
createSignedUrl: (path, expiresIn, urlOptions) => checked(path, (name) => admin().createSignedUrl(name, expiresIn, urlOptions)),
|
|
1133
|
+
createSignedUrls: (paths, expiresIn, urlOptions) => settled(async () => {
|
|
1134
|
+
const names = paths.map(normalizePath);
|
|
1135
|
+
const seen = new Set((await rows(VISIBLE_OBJECTS, [bucket, names])).map((row) => String(row["path"])));
|
|
1136
|
+
const shown = [...new Set(names.filter((name) => seen.has(name)))];
|
|
1137
|
+
const signed = /* @__PURE__ */ new Map();
|
|
1138
|
+
if (shown.length > 0) {
|
|
1139
|
+
const reply = await admin().createSignedUrls(shown, expiresIn, urlOptions);
|
|
1140
|
+
if (reply.error) return failed(reply.error);
|
|
1141
|
+
for (const entry of reply.data) if (entry.path !== null) signed.set(entry.path, entry);
|
|
1142
|
+
}
|
|
1143
|
+
return {
|
|
1144
|
+
data: names.map((name) => signed.get(name) ?? {
|
|
1145
|
+
error: HIDDEN_URL,
|
|
1146
|
+
path: name,
|
|
1147
|
+
signedUrl: null
|
|
1148
|
+
}),
|
|
1149
|
+
error: null
|
|
1150
|
+
};
|
|
1151
|
+
}),
|
|
1152
|
+
getPublicUrl: (path, urlOptions) => admin().getPublicUrl(path, urlOptions),
|
|
1153
|
+
list,
|
|
1154
|
+
listV2,
|
|
1155
|
+
upload: refuse,
|
|
1156
|
+
update: refuse,
|
|
1157
|
+
createSignedUploadUrl: refuse,
|
|
1158
|
+
uploadToSignedUrl: refuse,
|
|
1159
|
+
remove: refuse,
|
|
1160
|
+
copy: refuse,
|
|
1161
|
+
move: refuse,
|
|
1162
|
+
purgeCache: refuse
|
|
1163
|
+
};
|
|
1164
|
+
} };
|
|
1165
|
+
}
|
|
1166
|
+
//#endregion
|
|
560
1167
|
//#region src/server/server.ts
|
|
561
|
-
/** The header `current_tenant_id()` reads over the Data API. */
|
|
562
|
-
const TENANT_HEADER = "x-bs-tenant";
|
|
563
1168
|
/** The environment as `getEnv` resolves it, one variable at a time. */
|
|
564
1169
|
const RUNTIME_ENV = new Proxy({}, { get: (_target, key) => typeof key === "string" ? getEnv(key) : void 0 });
|
|
565
1170
|
const needsPostgres = (method) => dbError("invalid_request", `${method} needs createServer(betterSupabase, { postgres: createPostgres() })`);
|
|
566
|
-
const STATELESS = {
|
|
567
|
-
persistSession: false,
|
|
568
|
-
autoRefreshToken: false,
|
|
569
|
-
detectSessionInUrl: false
|
|
570
|
-
};
|
|
571
1171
|
/**
|
|
572
1172
|
* A framework adapter's server: `server` plus the adapter's own methods,
|
|
573
1173
|
* without reading the lazy `env` getter. `extra` can't replace a
|
|
@@ -581,13 +1181,6 @@ function extendServer(server, extra) {
|
|
|
581
1181
|
shareCore(server, extended);
|
|
582
1182
|
return extended;
|
|
583
1183
|
}
|
|
584
|
-
/** `{ ...base, ...extra }` that keeps lazy getters lazy. */
|
|
585
|
-
function withExtra(base, extra) {
|
|
586
|
-
return Object.defineProperties({}, {
|
|
587
|
-
...Object.getOwnPropertyDescriptors(base),
|
|
588
|
-
...Object.getOwnPropertyDescriptors(extra)
|
|
589
|
-
});
|
|
590
|
-
}
|
|
591
1184
|
/**
|
|
592
1185
|
* Server-side entry point for APIs, jobs, MCP servers and framework
|
|
593
1186
|
* adapters. Holds the secrets; `betterSupabase` stays isomorphic.
|
|
@@ -596,134 +1189,20 @@ function createServer(betterSupabase, options = {}) {
|
|
|
596
1189
|
const credentials = options.credentials === void 0 ? {} : { credentials: credentialProviderOf(options.credentials) };
|
|
597
1190
|
let loaded;
|
|
598
1191
|
const env = () => loaded ??= options.env ?? loadEnv(RUNTIME_ENV);
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
if ((options.prefetchJwks ?? defaultPrefetchJwks()) && options.auth?.jwks === void 0) try {
|
|
1192
|
+
const lite = liteBackend(options, env);
|
|
1193
|
+
if (lite === void 0 && (options.prefetchJwks ?? defaultPrefetchJwks()) && options.auth?.jwks === void 0) try {
|
|
602
1194
|
prefetchJwks({
|
|
603
1195
|
...options.auth,
|
|
604
1196
|
env: env()
|
|
605
1197
|
});
|
|
606
1198
|
} catch {}
|
|
607
|
-
const
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
const urlLengthLimit = options.db?.urlLengthLimit ?? definitionExecutor.urlLengthLimit;
|
|
615
|
-
const db = {
|
|
616
|
-
...options.db?.timeout === void 0 ? {} : { timeout: options.db.timeout },
|
|
617
|
-
...options.db?.retry === void 0 ? {} : { retry: options.db.retry },
|
|
618
|
-
...urlLengthLimit === void 0 ? {} : { urlLengthLimit }
|
|
619
|
-
};
|
|
620
|
-
const dbOptions = Object.keys(db).length > 0 ? { db } : {};
|
|
621
|
-
const sharedGlobal = {
|
|
622
|
-
...customFetch ? { global: customFetch } : {},
|
|
623
|
-
...dbOptions
|
|
624
|
-
};
|
|
625
|
-
/** postgrest-js options a bare `PostgrestClient` takes; `timeout` is the executor's. */
|
|
626
|
-
const restOptions = {
|
|
627
|
-
...db.retry === void 0 ? {} : { retry: db.retry },
|
|
628
|
-
...urlLengthLimit === void 0 ? {} : { urlLengthLimit }
|
|
629
|
-
};
|
|
630
|
-
const executorOptions = {
|
|
631
|
-
...definitionExecutor,
|
|
632
|
-
...urlLengthLimit === void 0 ? {} : { urlLengthLimit },
|
|
633
|
-
...db.timeout === void 0 ? {} : { timeout: db.timeout },
|
|
634
|
-
...db.retry === void 0 ? {} : { retry: db.retry }
|
|
635
|
-
};
|
|
636
|
-
/** Set when `db` options need an executor built with them. */
|
|
637
|
-
const tunedExecutor = options.db !== void 0;
|
|
638
|
-
const serviceClient = () => {
|
|
639
|
-
adminClient ??= createClient(env().url, secretKey(), {
|
|
640
|
-
auth: STATELESS,
|
|
641
|
-
...sharedGlobal
|
|
642
|
-
});
|
|
643
|
-
return adminClient;
|
|
644
|
-
};
|
|
645
|
-
const readUrl = () => options.readUrl === false ? void 0 : options.readUrl?.replace(/\/+$/, "") ?? env().readUrl;
|
|
646
|
-
const apiKeyClient = () => {
|
|
647
|
-
throw new TypeError("ctx.supabase and ctx.db.$client are not available for an API key: ctx.db and ctx.sql run over direct Postgres with the key's claims");
|
|
648
|
-
};
|
|
649
|
-
/** Clients for the primary share the service and anon clients; others don't. */
|
|
650
|
-
const supabaseAt = (url, auth, headers = {}) => {
|
|
651
|
-
const custom = Object.keys(headers).length > 0;
|
|
652
|
-
const global = custom ? {
|
|
653
|
-
global: {
|
|
654
|
-
headers,
|
|
655
|
-
...customFetch
|
|
656
|
-
},
|
|
657
|
-
...dbOptions
|
|
658
|
-
} : sharedGlobal;
|
|
659
|
-
const shared = !custom && url === env().url;
|
|
660
|
-
switch (auth.kind) {
|
|
661
|
-
case "user": return createClient(url, env().publishableKey, {
|
|
662
|
-
accessToken: () => Promise.resolve(auth.token),
|
|
663
|
-
...global
|
|
664
|
-
});
|
|
665
|
-
case "service": return shared ? serviceClient() : createClient(url, secretKey(), {
|
|
666
|
-
auth: STATELESS,
|
|
667
|
-
...global
|
|
668
|
-
});
|
|
669
|
-
case "anon":
|
|
670
|
-
case "invalid":
|
|
671
|
-
if (!shared) return createClient(url, env().publishableKey, {
|
|
672
|
-
auth: STATELESS,
|
|
673
|
-
...global
|
|
674
|
-
});
|
|
675
|
-
anonClient ??= createClient(url, env().publishableKey, {
|
|
676
|
-
auth: STATELESS,
|
|
677
|
-
...sharedGlobal
|
|
678
|
-
});
|
|
679
|
-
return anonClient;
|
|
680
|
-
case "apiKey": return apiKeyClient();
|
|
681
|
-
default: return auth;
|
|
682
|
-
}
|
|
683
|
-
};
|
|
684
|
-
const supabaseFor = (auth, headers = {}) => supabaseAt(env().url, auth, headers);
|
|
685
|
-
const restUrls = /* @__PURE__ */ new Map();
|
|
686
|
-
const restUrl = (url) => {
|
|
687
|
-
let rest = restUrls.get(url);
|
|
688
|
-
if (rest === void 0) {
|
|
689
|
-
rest = new URL("rest/v1", url.endsWith("/") ? url : `${url}/`).href;
|
|
690
|
-
restUrls.set(url, rest);
|
|
691
|
-
}
|
|
692
|
-
return rest;
|
|
693
|
-
};
|
|
694
|
-
/**
|
|
695
|
-
* The client queries run on. Requests need only PostgREST, so they skip
|
|
696
|
-
* building Realtime, Storage and Auth clients per request; the shared
|
|
697
|
-
* service and anon clients for the primary are built once anyway.
|
|
698
|
-
*/
|
|
699
|
-
const restAt = (url, auth, headers = {}) => {
|
|
700
|
-
let key;
|
|
701
|
-
let bearer;
|
|
702
|
-
switch (auth.kind) {
|
|
703
|
-
case "user":
|
|
704
|
-
key = env().publishableKey;
|
|
705
|
-
bearer = auth.token;
|
|
706
|
-
break;
|
|
707
|
-
case "service":
|
|
708
|
-
case "anon":
|
|
709
|
-
case "invalid":
|
|
710
|
-
if (Object.keys(headers).length === 0 && url === env().url) return supabaseAt(url, auth, headers);
|
|
711
|
-
key = auth.kind === "service" ? secretKey() : env().publishableKey;
|
|
712
|
-
bearer = key;
|
|
713
|
-
break;
|
|
714
|
-
case "apiKey": return apiKeyClient();
|
|
715
|
-
default: return auth;
|
|
716
|
-
}
|
|
717
|
-
return new PostgrestClient(restUrl(url), {
|
|
718
|
-
headers: {
|
|
719
|
-
...headers,
|
|
720
|
-
apikey: key,
|
|
721
|
-
Authorization: `Bearer ${bearer}`
|
|
722
|
-
},
|
|
723
|
-
...customFetch,
|
|
724
|
-
...restOptions
|
|
725
|
-
});
|
|
726
|
-
};
|
|
1199
|
+
const { executorOptions, tunedExecutor, serviceClient, readUrl, apiKeyClient, supabaseFor, restAt } = createClients({
|
|
1200
|
+
options,
|
|
1201
|
+
env,
|
|
1202
|
+
definitionExecutor: betterSupabase.executorOptions(),
|
|
1203
|
+
lite,
|
|
1204
|
+
createClient
|
|
1205
|
+
});
|
|
727
1206
|
/** `$client` stays the full Supabase client, built when first read. */
|
|
728
1207
|
const withLazyClient = (db, client) => Object.defineProperty(db, "$client", {
|
|
729
1208
|
get: client,
|
|
@@ -736,12 +1215,15 @@ function createServer(betterSupabase, options = {}) {
|
|
|
736
1215
|
const db = betterSupabase.connect(rest, {
|
|
737
1216
|
...authContext(auth),
|
|
738
1217
|
...context
|
|
739
|
-
}, tunedExecutor ? { executor: postgrestExecutor(rest, executorOptions) } : {});
|
|
1218
|
+
}, auth.kind === "invalid" ? { executor: refusingExecutor(auth.error) } : tunedExecutor ? { executor: postgrestExecutor(rest, executorOptions) } : {});
|
|
740
1219
|
return withLazyClient(db, () => supabase ??= supabaseFor(auth));
|
|
741
1220
|
};
|
|
742
|
-
const sqlFor = (claims, context, stats, session) => {
|
|
1221
|
+
const sqlFor = (claims, context, stats, session, storage) => {
|
|
743
1222
|
if (!options.postgres) throw new TypeError("Direct Postgres access needs createServer(betterSupabase, { postgres: createPostgres() })");
|
|
744
|
-
return betterSupabase.connect(session ? options.postgres.executorFor(claims, session) : options.postgres.executorFor(claims), context,
|
|
1223
|
+
return betterSupabase.connect(session ? options.postgres.executorFor(claims, session) : options.postgres.executorFor(claims), context, {
|
|
1224
|
+
...stats ? { stats } : {},
|
|
1225
|
+
...storage ? { storage } : {}
|
|
1226
|
+
});
|
|
745
1227
|
};
|
|
746
1228
|
/** `ServerOptions.tenant` outside `context()`, where it can't be awaited. */
|
|
747
1229
|
const syncTenant = (request, auth) => {
|
|
@@ -753,7 +1235,7 @@ function createServer(betterSupabase, options = {}) {
|
|
|
753
1235
|
const idPolicy = requestIdPolicy(options.requestIds);
|
|
754
1236
|
if (options.support && !options.postgres) throw new TypeError("Support sessions need createServer(betterSupabase, { postgres: createPostgres(), support })");
|
|
755
1237
|
const audit = serverAudit(betterSupabase, options.audit);
|
|
756
|
-
const support = options.support ? options.support.create(betterSupabase.events, options.auth?.claims ?? betterSupabase.claimsSchema) : supportOff;
|
|
1238
|
+
const support = options.support ? options.support.create(betterSupabase.events, options.auth?.claims ?? betterSupabase.claimsSchema, betterSupabase.temporal) : supportOff;
|
|
757
1239
|
/**
|
|
758
1240
|
* The target's context in a support session. Queries run over direct
|
|
759
1241
|
* Postgres with the target's claims plus `act`, read-only unless the
|
|
@@ -796,17 +1278,32 @@ function createServer(betterSupabase, options = {}) {
|
|
|
796
1278
|
};
|
|
797
1279
|
let db;
|
|
798
1280
|
let sql;
|
|
1281
|
+
let storage;
|
|
1282
|
+
const targetStorage = () => {
|
|
1283
|
+
const postgres = options.postgres;
|
|
1284
|
+
if (!postgres) throw new TypeError("Support sessions need createServer(betterSupabase, { postgres: createPostgres(), support })");
|
|
1285
|
+
let asTarget;
|
|
1286
|
+
storage ??= supportStorage({
|
|
1287
|
+
admin: { from: (bucket) => serviceClient().storage.from(bucket) },
|
|
1288
|
+
sql: { queryRaw: (text, params) => (asTarget ??= postgres.asUser(sqlClaims, sessionOptions)).queryRaw(text, params) },
|
|
1289
|
+
readOnly: session.readOnly
|
|
1290
|
+
});
|
|
1291
|
+
return storage;
|
|
1292
|
+
};
|
|
799
1293
|
return {
|
|
800
1294
|
...credentials,
|
|
801
1295
|
...ids,
|
|
802
1296
|
auth,
|
|
803
1297
|
resolution,
|
|
804
1298
|
support: active,
|
|
1299
|
+
get storage() {
|
|
1300
|
+
return targetStorage();
|
|
1301
|
+
},
|
|
805
1302
|
get supabase() {
|
|
806
1303
|
return unavailable();
|
|
807
1304
|
},
|
|
808
1305
|
get db() {
|
|
809
|
-
db ??= Object.defineProperty(sqlFor(sqlClaims, context, recorder, sessionOptions), "$client", {
|
|
1306
|
+
db ??= Object.defineProperty(sqlFor(sqlClaims, context, recorder, sessionOptions, targetStorage()), "$client", {
|
|
810
1307
|
get: unavailable,
|
|
811
1308
|
enumerable: true,
|
|
812
1309
|
configurable: true
|
|
@@ -814,7 +1311,7 @@ function createServer(betterSupabase, options = {}) {
|
|
|
814
1311
|
return db;
|
|
815
1312
|
},
|
|
816
1313
|
get sql() {
|
|
817
|
-
sql ??= sqlFor(sqlClaims, context, recorder, sessionOptions);
|
|
1314
|
+
sql ??= sqlFor(sqlClaims, context, recorder, sessionOptions, targetStorage());
|
|
818
1315
|
return sql;
|
|
819
1316
|
},
|
|
820
1317
|
replica: void 0,
|
|
@@ -910,7 +1407,7 @@ function createServer(betterSupabase, options = {}) {
|
|
|
910
1407
|
const rest = (sharesClient ? void 0 : supabase) ?? restAt(env().url, auth, headers);
|
|
911
1408
|
const connected = betterSupabase.connect(rest, context, {
|
|
912
1409
|
stats: recorder,
|
|
913
|
-
...url && replica ? { executor: routedExecutor(postgrestExecutor(rest, executorOptions), postgrestExecutor(restAt(url, auth, headers), executorOptions), replica) } : tunedExecutor ? { executor: postgrestExecutor(rest, executorOptions) } : {}
|
|
1410
|
+
...auth.kind === "invalid" ? { executor: refusingExecutor(auth.error) } : url && replica ? { executor: routedExecutor(postgrestExecutor(rest, executorOptions), postgrestExecutor(restAt(url, auth, headers), executorOptions), replica) } : tunedExecutor ? { executor: postgrestExecutor(rest, executorOptions) } : {}
|
|
914
1411
|
});
|
|
915
1412
|
db = withLazyClient(connected, client);
|
|
916
1413
|
return db;
|
|
@@ -938,7 +1435,7 @@ function createServer(betterSupabase, options = {}) {
|
|
|
938
1435
|
const userMetadata = betterSupabase.userMetadataSchema;
|
|
939
1436
|
const resolution = await resolveAuth(request, {
|
|
940
1437
|
logger: betterSupabase.events.logger,
|
|
941
|
-
...options.auth,
|
|
1438
|
+
...lite ? lite.auth() : options.auth,
|
|
942
1439
|
...claims ? { claims } : {},
|
|
943
1440
|
...userMetadata ? { userMetadata } : {},
|
|
944
1441
|
env: env(),
|
|
@@ -975,6 +1472,7 @@ function createServer(betterSupabase, options = {}) {
|
|
|
975
1472
|
return env();
|
|
976
1473
|
},
|
|
977
1474
|
events: betterSupabase.events,
|
|
1475
|
+
authorizer: options.authorizer,
|
|
978
1476
|
resolve,
|
|
979
1477
|
supabaseFor,
|
|
980
1478
|
dbFor,
|
|
@@ -1122,6 +1620,14 @@ function createServer(betterSupabase, options = {}) {
|
|
|
1122
1620
|
function flushEvents(server, waitUntil) {
|
|
1123
1621
|
if (waitUntil && server.events.pending) waitUntil(server.events.settled());
|
|
1124
1622
|
}
|
|
1623
|
+
/** Runs `run`, then hands pending event sink sends to `waitUntil` even when it throws. */
|
|
1624
|
+
async function withFlush(server, waitUntil, run) {
|
|
1625
|
+
try {
|
|
1626
|
+
return await run();
|
|
1627
|
+
} finally {
|
|
1628
|
+
flushEvents(server, waitUntil);
|
|
1629
|
+
}
|
|
1630
|
+
}
|
|
1125
1631
|
/** The 500 for an error a handler threw; the message only when `expose` is set. */
|
|
1126
1632
|
function unexpectedResponse(cause, options) {
|
|
1127
1633
|
return problemResponse(dbError("unexpected", options.expose && cause instanceof Error ? cause.message : "Internal server error"), options);
|
|
@@ -1182,4 +1688,4 @@ async function resolveToken(server, token) {
|
|
|
1182
1688
|
return auth;
|
|
1183
1689
|
}
|
|
1184
1690
|
//#endregion
|
|
1185
|
-
export {
|
|
1691
|
+
export { withServerContext as C, lastSignIns as D, endSessions as E, suspendAccount as O, shouldRefresh as S, SERVER_EVENT_SOURCE as T, withSupport as _, unexpectedResponse as a, refreshFor as b, extendServer as c, clearSupportCookie as d, supportCookie as f, withTenant as g, TENANT_HEADER as h, resolveToken as i, deleteAccount as k, supportStorage as l, supportCookieValue as m, flushEvents as n, withFlush as o, supportCookieMaxAge as p, handle as r, createServer as s, bearerRequest as t, SUPPORT_COOKIE as u, withSession as v, serverCore as w, shouldCheckSession as x, isPrefetch as y };
|