permdock 0.4.0 → 0.5.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 +37 -35
- package/dist/{schema-Bol6gqXA.js → 2020-C9VN-x8c.js} +5 -130
- package/dist/a2a/index.d.ts +6 -6
- package/dist/a2a/index.js +14 -17
- package/dist/{adapter-context-mlWsVGGg.js → adapter-context-CRhqyzCk.js} +1 -1
- package/dist/adoption-scan-B4R5fnMU.js +107 -0
- package/dist/agent/index.d.ts +3 -0
- package/dist/agent/index.js +1 -0
- package/dist/ai-sdk/index.d.ts +18 -35
- package/dist/ai-sdk/index.js +37 -23
- package/dist/{app-data-CV8pqqMi.js → app-data-MuyzVqX8.js} +2 -1
- package/dist/approval-header-CJACtHkv.js +23 -0
- package/dist/approval-prompt-Dg5LeAcT.js +62 -0
- package/dist/approval-prompt-Djo_PyZc.d.ts +57 -0
- package/dist/approvals/index.d.ts +5 -3
- package/dist/approvals/index.js +8 -5
- package/dist/approvals-DJ6Yd5z1.js +995 -0
- package/dist/arazzo-B6lebmiQ.js +36 -0
- package/dist/{arazzo-C4BcskbX.js → arazzo-BWhNF-k0.js} +20 -14
- package/dist/args-IIolxxKA.js +197 -0
- package/dist/astro/index.d.ts +43 -0
- package/dist/astro/index.js +27 -0
- package/dist/audience-Dg8XsRaO.js +55 -0
- package/dist/auth-DRLEizbL.js +178 -0
- package/dist/authzen/index.d.ts +26 -6
- package/dist/authzen/index.js +94 -79
- package/dist/automation-BMZPIVUM.d.ts +114 -0
- package/dist/automation-DVjOckjV.js +157 -0
- package/dist/better-auth/index.d.ts +8 -6
- package/dist/better-auth/index.js +9 -8
- package/dist/better-supabase/index.d.ts +357 -30
- package/dist/better-supabase/index.js +936 -194
- package/dist/{bind-BzqG8SMb.d.ts → bind--9EFVYWF.d.ts} +12 -10
- package/dist/{bind-kk-uyCwH.js → bind-CZzhx-Vj.js} +14 -10
- package/dist/body-CH5of8Ne.js +10 -0
- package/dist/body-text-QcXok_SI.js +52 -0
- package/dist/{build-instance-DIIV9DbC.js → build-instance-BMnAudHn.js} +4 -3
- package/dist/{canonical-json-CFKyFOke.js → canonical-json-BC8_nMTw.js} +5 -3
- package/dist/{capability-CksyCWDH.d.ts → capability-BSslw1QV.d.ts} +44 -25
- package/dist/{capability-txATtKV4.js → capability-N1K9IpqS.js} +68 -42
- package/dist/casbin-Cr7RLtA3.js +30 -0
- package/dist/casbin-Dyu2gnUD.js +234 -0
- package/dist/casl-64gpT-8x.js +24 -0
- package/dist/casl-DjEDhTCP.js +299 -0
- package/dist/catalog/index.d.ts +74 -2
- package/dist/catalog/index.js +51 -2
- package/dist/{catalog-tZUyOfOv.js → catalog-BECMPrwc.js} +51 -6
- package/dist/catalog-DjhMYYCq.js +1 -0
- package/dist/catalog-R_A__RsH.js +52 -0
- package/dist/{catalog-doc-DWtg0gGR.js → catalog-doc-C9wjsfNY.js} +45 -23
- package/dist/catalog-fingerprint-CCP0-yQS.js +153 -0
- package/dist/chat/index.d.ts +2 -0
- package/dist/chat/index.js +224 -0
- package/dist/chat-sdk/index.d.ts +87 -0
- package/dist/chat-sdk/index.js +197 -0
- package/dist/claims-map-7oQ3ue4X.js +13 -0
- package/dist/claims-map-Ca-QX8C6.d.ts +32 -0
- package/dist/claude-agent/index.d.ts +7 -14
- package/dist/claude-agent/index.js +24 -27
- package/dist/clerk/index.d.ts +9 -8
- package/dist/clerk/index.js +9 -14
- package/dist/cli/bin.js +36 -17
- package/dist/cli/index.d.ts +19 -5
- package/dist/cli/index.js +164 -4
- package/dist/cloud/index.d.ts +102 -63
- package/dist/cloud/index.js +239 -340
- package/dist/cloud-CIoHNevm.js +87 -0
- package/dist/codemod-Bmj9dWMH.js +37 -0
- package/dist/codemod-Cxvvc70T.js +2084 -0
- package/dist/{collect-2SrB7lfk.js → collect-CrZJJnEF.js} +75 -11
- package/dist/collect-DloHbDVa.js +55 -0
- package/dist/collect-FlXJlhus.js +1 -0
- package/dist/command-L8EstFNm.js +6 -0
- package/dist/compile/index.d.ts +1 -1
- package/dist/compile/index.js +1 -2
- package/dist/{compile-CcEu2ZQ1.js → compile-CMqMx_IN.js} +11 -8
- package/dist/{compile-CtTP7eur.d.ts → compile-Ckm2HqBZ.d.ts} +5 -3
- package/dist/completion-BqhRBJD8.js +143 -0
- package/dist/config-B46rm9sc.js +26 -0
- package/dist/{config-BIjREpyE.js → config-bs_kZeYq.js} +12 -7
- package/dist/{config-report--Xb9APJS.js → config-report-DUgj62Ai.js} +15 -5
- package/dist/{connection-DUsczpB5.js → connection-DjhIJSs2.js} +6 -5
- package/dist/{context-DieZVJXu.js → context-bbFHR-0D.js} +2 -2
- package/dist/convex/index.d.ts +11 -10
- package/dist/convex/index.js +6 -4
- package/dist/create-0VZ7Pdiu.d.ts +107 -0
- package/dist/create-BDS7wc3y.d.ts +138 -0
- package/dist/create-BFfm17UA.d.ts +110 -0
- package/dist/create-BWRSXgOF.js +403 -0
- package/dist/create-C3b4B5eF.js +130 -0
- package/dist/{create-BBO24vj6.js → create-DnrmLnLW.js} +31 -32
- package/dist/{credential-kue0qpbm.js → credential-DM2um3ha.js} +152 -31
- package/dist/credentials-DPyHmYz5.js +74 -0
- package/dist/delegation-DaXVdDhM.js +286 -0
- package/dist/delivery/index.d.ts +5 -0
- package/dist/delivery/index.js +5 -0
- package/dist/delivery-DCAgNyCn.js +499 -0
- package/dist/delivery-event-xX4obB8F.js +40 -0
- package/dist/{denied-text-DfRk15uw.d.ts → denied-text-D8jDHgsl.d.ts} +5 -5
- package/dist/{describe-C3ldA9os.d.ts → describe-BZUsixiL.d.ts} +2 -2
- package/dist/{describe-Cgkp7eP0.js → describe-BybMRY7A.js} +6 -2
- package/dist/device-BARQ8eYG.js +193 -0
- package/dist/diff-CxZo9pTq.js +37 -0
- package/dist/{diff-rpqoe7Ag.js → diff-DCePiN6M.js} +60 -54
- package/dist/doctor-CxiwSfqH.js +44 -0
- package/dist/{doctor-owlv6ddh.js → doctor-DFjUxf2f.js} +245 -50
- package/dist/drizzle/index.d.ts +5 -3
- package/dist/drizzle/index.js +2 -2
- package/dist/elysia/index.d.ts +16 -13
- package/dist/elysia/index.js +13 -12
- package/dist/env-DJZrPjRi.js +8 -0
- package/dist/errors-BDUwg2qC.js +27 -0
- package/dist/{errors-drnfxYtm.js → errors-BKy0EfhN.js} +5 -9
- package/dist/errors-BWXBMaKK.d.ts +11 -0
- package/dist/{errors-OD_4c__H.d.ts → errors-C2PXIv4c.d.ts} +2 -2
- package/dist/errors-CWTY6uih.js +143 -0
- package/dist/evaluate-_R8QkWaf.js +1732 -0
- package/dist/evaluations-16UqqQ6W.d.ts +32 -0
- package/dist/{evaluations-C9YJsv3H.js → evaluations-DZ2CbV5k.js} +145 -34
- package/dist/eve/index.d.ts +12 -16
- package/dist/eve/index.js +22 -28
- package/dist/event-time-CsegxXxB.js +23 -0
- package/dist/expiry-D4_YKRKD.js +52 -0
- package/dist/express/index.d.ts +13 -10
- package/dist/express/index.js +12 -11
- package/dist/fastify/index.d.ts +25 -22
- package/dist/fastify/index.js +13 -12
- package/dist/fetch-adapter-g0ypLkID.js +120 -0
- package/dist/fetch-adapter-qKJBuRqy.d.ts +31 -0
- package/dist/fields-D9tPVUUS.js +203 -0
- package/dist/files-C5ZI27eV.js +124 -0
- package/dist/{fixtures-h2eG2OZV.js → fixtures-B7XrLeY7.js} +8 -7
- package/dist/flags-C3DktBDY.js +86 -0
- package/dist/{from-snapshot-7REQZe0H.js → from-snapshot-D2lZt4Dd.js} +55 -52
- package/dist/{grantee-CXY-0C87.js → grantee-Cn1HyUsI.js} +3 -3
- package/dist/{grantee-conditions-MQs5NIuX.js → grantee-conditions-CcXf8hMM.js} +4 -3
- package/dist/{grantee-match-fxYp9Nmt.js → grantee-match-DHArqY82.js} +5 -4
- package/dist/h3/index.d.ts +37 -0
- package/dist/h3/index.js +35 -0
- package/dist/headers-BIjfMaoC.js +8 -0
- package/dist/headers-CIbDTUTK.d.ts +7 -0
- package/dist/{helpers-C9YmyBIa.js → helpers-DTcZOzhF.js} +45 -38
- package/dist/hono/index.d.ts +12 -9
- package/dist/hono/index.js +13 -12
- package/dist/hosted-BZIAYvon.js +315 -0
- package/dist/hosted-DBDX0M-P.d.ts +78 -0
- package/dist/{http-DPuDaChb.d.ts → http-B_LphE5Y.d.ts} +1 -2
- package/dist/http-DXJ37RDA.js +46 -0
- package/dist/{http-BEbdMZ05.js → http-ujKm0JXE.js} +1 -2
- package/dist/{import-UHk1N7vH.js → import-CNV7I2Dw.js} +25 -20
- package/dist/{import-BFIlhetD.js → import-DMmOG27O.js} +190 -53
- package/dist/index-BcHcPyIo.d.ts +110 -0
- package/dist/index-CaxrMD1A.d.ts +1 -0
- package/dist/index-Chrs5fQ-.d.ts +210 -0
- package/dist/index-CxGUswIC.d.ts +431 -0
- package/dist/index-D8EovfsP.d.ts +91 -0
- package/dist/{index-UdVQgq48.d.ts → index-DOVf7RJv.d.ts} +431 -81
- package/dist/{index-BwMe94Xq.d.ts → index-SGdIQyzc.d.ts} +34 -16
- package/dist/index.d.ts +19 -15
- package/dist/index.js +31 -21
- package/dist/init-DeMYsnYJ.js +96 -0
- package/dist/init-GG6Jh8HD.js +95 -0
- package/dist/{instance-options-plkrsAog.d.ts → instance-options-Omfd793B.d.ts} +2 -2
- package/dist/instance-snapshot-Cxq4ygFc.js +600 -0
- package/dist/instant-BluqDvyS.js +19 -0
- package/dist/internals-Dk8A8fX3.js +17 -0
- package/dist/{json-schema-DBkdUuCO.js → json-schema-B-vAwlde.js} +45 -6
- package/dist/json-schema-CN_iLFH2.d.ts +40 -0
- package/dist/jwt/index.d.ts +18 -11
- package/dist/jwt/index.js +156 -135
- package/dist/{kernel-CB3LrIJM.js → kernel-5JatXyND.js} +52 -24
- package/dist/kysely/index.d.ts +5 -3
- package/dist/kysely/index.js +2 -2
- package/dist/load-BxEtwlBS.js +1 -0
- package/dist/{load-C3_oTHyO.js → load-DFS_ry0W.js} +22 -6
- package/dist/{load-jose-BL6LH4bL.js → load-jose-DZ4dnjri.js} +1 -4
- package/dist/login-Dfe5RlYk.js +68 -0
- package/dist/login-imhuwvn3.js +254 -0
- package/dist/manifest-C8IzW3Do.js +42 -0
- package/dist/manifest-CtKR3GXL.js +370 -0
- package/dist/manifest-json-CAGzls-C.js +9 -0
- package/dist/{manifest-uDS9y5de.d.ts → manifest-mx5ghSFM.d.ts} +9 -2
- package/dist/manifest-schema-C0kK_8V0.js +399 -0
- package/dist/{map-claims-AVlBaJoa.js → map-claims-D3oRmTk0.js} +13 -10
- package/dist/{map-error-BE27PYkE.js → map-error-TCAdw-eW.js} +3 -3
- package/dist/{markers-CiwAOZtO.js → markers-C6joDI3o.js} +2 -1
- package/dist/mcp/index.d.ts +22 -12
- package/dist/mcp/index.js +57 -39
- package/dist/{migrate-BwlB5-Wk.js → migrate-BShP7Vf4.js} +53 -14
- package/dist/nest/index.d.ts +12 -9
- package/dist/nest/index.js +15 -14
- package/dist/next/index.d.ts +18 -21
- package/dist/next/index.js +13 -11
- package/dist/next/plugin.d.ts +1 -1
- package/dist/next/plugin.js +2 -2
- package/dist/node/index.d.ts +10 -10
- package/dist/node/index.js +7 -9
- package/dist/{ocsf-uYFXGVw2.js → ocsf-BFp-PZZA.js} +22 -11
- package/dist/openai/index.d.ts +9 -16
- package/dist/openai/index.js +17 -24
- package/dist/openapi/index.d.ts +3 -3
- package/dist/openapi/index.js +1 -1
- package/dist/{openapi-DBzHQbov.js → openapi-B7HZ0f-r.js} +8 -8
- package/dist/{openapi-BJdBmYDG.js → openapi-DTaEmTSW.js} +10 -9
- package/dist/openapi-ahr8rHu3.js +138 -0
- package/dist/operation-findings-DgATDpvh.js +36 -0
- package/dist/operations-CxybZErY.d.ts +59 -0
- package/dist/orpc/index.d.ts +13 -10
- package/dist/orpc/index.js +20 -15
- package/dist/otel/index.d.ts +3 -2
- package/dist/otel/index.js +30 -7
- package/dist/output-Dyw8fyPF.js +88 -0
- package/dist/output-files-B3IZJksC.js +1 -0
- package/dist/{output-files-CgIsvdSa.js → output-files-DhRBBE4n.js} +24 -26
- package/dist/{permission-keys-B26jeyUv.js → ownership-BatFgAA4.js} +1698 -869
- package/dist/{package-root-DtNnpmUd.js → package-root-Dk_ETdkp.js} +1 -1
- package/dist/{parse-CVFQHk6c.js → parse-Cxq0WxrA.js} +2 -2
- package/dist/{parse-local-manifest-C-q02Pal.js → parse-local-manifest-CVSs6J9I.js} +1 -1
- package/dist/{parse-local-manifest-DvYUR0QL.d.ts → parse-local-manifest-DgqtruPn.d.ts} +1 -1
- package/dist/parse-request-D_tUXG6M.js +26 -0
- package/dist/paths-DXSHAMIa.js +42 -0
- package/dist/pdp/index.d.ts +7 -3
- package/dist/pdp/index.js +45 -26
- package/dist/{peer-BOr_kJE1.js → peer-C8swJ2GH.js} +23 -4
- package/dist/peer-CRvC7Hg1.js +1 -0
- package/dist/permdock-B9JxkBwC.js +868 -0
- package/dist/permdock-D7eeLJER.d.ts +502 -0
- package/dist/{permission-registry-BsblpB-z.js → permission-registry-Br4jSNVi.js} +3 -3
- package/dist/permissions-B-wCP5ZC.js +30 -0
- package/dist/{permissions-CCJ6lmxB.js → permissions-CZKiUfFM.js} +4 -3
- package/dist/{permissions-COH-KRgT.d.ts → permissions-oEWfl-kl.d.ts} +1 -2
- package/dist/policies-CO1oOymN.js +295 -0
- package/dist/{policy-ur0BBK_e.d.ts → policy-Czo4n3Hs.d.ts} +2 -2
- package/dist/{hosted-CBHgkzDl.js → policy-DLZJ5gAp.js} +17 -273
- package/dist/policy-from-catalog-DzhEc3Y9.js +450 -0
- package/dist/policy-module-CTlwMvLI.js +89 -0
- package/dist/{policy-types-sp9P1iIV.d.ts → policy-types-DzwivBgR.d.ts} +434 -631
- package/dist/postgrest-CW0IqC-U.js +566 -0
- package/dist/postgrest-NUqZT-RB.d.ts +100 -0
- package/dist/powersync-BHfuehf3.js +62 -0
- package/dist/powersync-CbzkqL_M.js +1 -0
- package/dist/{powersync-cZe4kzhL.js → powersync-bYUDLOAO.js} +23 -24
- package/dist/preset/index.d.ts +146 -0
- package/dist/preset/index.js +1 -0
- package/dist/preset-DZdU0tne.js +1768 -0
- package/dist/principal-source-pHneukrx.js +103 -0
- package/dist/prisma/index.d.ts +6 -3
- package/dist/prisma/index.js +2 -2
- package/dist/{problem-CnWraVhC.js → problem-CTviyH5L.js} +13 -23
- package/dist/{problem-details-rIIo8B2C.d.ts → problem-details-DXlt-vks.d.ts} +1 -1
- package/dist/{problem-details-DECUnXAn.js → problem-details-cn5X30gZ.js} +43 -40
- package/dist/problem-types-CJ2325SZ.js +5 -0
- package/dist/{prompt-CXYhLfsS.js → prompt-DfZLJLIn.js} +2 -2
- package/dist/{protected-B3_P7xuw.d.ts → protected-DEPHc2xV.d.ts} +16 -8
- package/dist/{protected-BN7BUdY1.js → protected-DfjY5mLA.js} +21 -4
- package/dist/{provider-Bi-0HNL3.js → provider-CC-u3bYP.js} +2 -2
- package/dist/{provider-kwHC9CZD.d.ts → provider-DMVt6yYn.d.ts} +1 -1
- package/dist/{provider-store-Ctt-81Ni.js → provider-store-B5Yrkhzr.js} +2 -2
- package/dist/pull-BgIfno6w.js +256 -0
- package/dist/pull-ByOks_Tg.js +1 -0
- package/dist/push-CmFVBOeI.js +116 -0
- package/dist/pushed-policy-BImMTTIM.d.ts +57 -0
- package/dist/pushed-policy-DobP7AHI.js +238 -0
- package/dist/react/index.d.ts +8 -8
- package/dist/react/index.js +6 -6
- package/dist/react/provider-client.d.ts +1 -1
- package/dist/react/provider-client.js +1 -2
- package/dist/react-native/index.d.ts +24 -72
- package/dist/react-native/index.js +24 -22
- package/dist/{refs-f3imMjNW.js → refs-K6eWUJ0H.js} +1 -1
- package/dist/{relation-walk-BXnlLtg2.js → relation-walk-3OyDBF0S.js} +2 -2
- package/dist/{relations-CvmSpG67.js → relations-BnCWnJGI.js} +3 -3
- package/dist/renames-CGj7YwcQ.js +175 -0
- package/dist/{replay-COpmZUfx.d.ts → replay-D7iKcLFe.d.ts} +1 -1
- package/dist/{replay-BsOyTrdV.js → replay-Du1tJjG7.js} +2 -1
- package/dist/{request-context-BVM7aWNs.js → request-context-BTRTG7OT.js} +3 -3
- package/dist/request-schema-CMreVuFM.js +148 -0
- package/dist/resend/index.d.ts +126 -0
- package/dist/resend/index.js +379 -0
- package/dist/{resource-relations-D1Un3pcz.js → resource-relations-D_jw0BFx.js} +1 -1
- package/dist/{retire-BFcxL6un.js → retire-CALjIQ7e.js} +2 -2
- package/dist/{revocations-Cy06JNx2.d.ts → revocations-R07lFBnX.d.ts} +2 -0
- package/dist/rls-BA8an5Ap.js +336 -0
- package/dist/{rls-BEktUaqg.js → rls-j6t43t7n.js} +287 -689
- package/dist/{role-builder-B4GbKM-i.js → role-builder-CXbis5-X.js} +14 -207
- package/dist/{rpc-nYC3cR_u.js → rpc-aPyNi6tA.js} +7 -7
- package/dist/run-CNsApDpd.js +1 -0
- package/dist/run-DOfMtc9V.js +723 -0
- package/dist/run-ticket-BjhTOi6u.d.ts +124 -0
- package/dist/run-ticket-sxFI6LAk.js +337 -0
- package/dist/{runtime-D_tMXnsq.js → runtime-D3VTAiCA.js} +1 -1
- package/dist/{saas-DtaA4JuW.js → saas-FO-Q8oj0.js} +16 -14
- package/dist/scan-BOI5tJ-6.js +29 -0
- package/dist/{schema-DjQBcAP9.js → schema-B4v0Qrac.js} +102 -8
- package/dist/schema-yLuBWWsh.js +130 -0
- package/dist/scim/index.d.ts +2 -2
- package/dist/scim/index.js +1 -2
- package/dist/{scim-vFR1O5oG.js → scim-ClHtpyV3.js} +208 -76
- package/dist/{scopes-tvpa34ep.js → scopes-CUPSjo9q.js} +12 -7
- package/dist/server/index.d.ts +12 -143
- package/dist/server/index.js +12 -9
- package/dist/server-DqCT4CgZ.js +453 -0
- package/dist/{server-types-DdqBwZN_.d.ts → server-types-BLd4MnBX.d.ts} +51 -68
- package/dist/{sha256-BO0swRXL.js → sha256-D9ihqmvd.js} +8 -1
- package/dist/{shared-1uhI-e-b.js → shared-CD11nBbC.js} +18 -8
- package/dist/{shared-JhMeOsDF.js → shared-DvvFzYXe.js} +8 -9
- package/dist/signals-D3NcTKUS.js +32 -0
- package/dist/sink-BEZSlMS_.js +957 -0
- package/dist/sink-Bj_lDUDq.d.ts +225 -0
- package/dist/{skills-BZdRQkxs.js → skills-B6lVdD_W.js} +13 -6
- package/dist/skills-CTYwkl44.js +51 -0
- package/dist/snapshot-CXUWfsNy.js +269 -0
- package/dist/{snapshot-cache-Cod40D-X.js → snapshot-cache-DZHQ0KF6.js} +11 -5
- package/dist/{snapshot-cache-J5T7t_vD.d.ts → snapshot-cache-DqK9eDmM.d.ts} +7 -5
- package/dist/solid/index.d.ts +11 -12
- package/dist/solid/index.js +7 -7
- package/dist/solid-start/index.d.ts +52 -0
- package/dist/solid-start/index.js +49 -0
- package/dist/{sources-Dljy06zL.d.ts → sources-BV9j0DeZ.d.ts} +7 -13
- package/dist/{sources-B1-b-R0t.js → sources-vs5dGOsS.js} +125 -119
- package/dist/{sql-t8teWOfo.js → sql-B5T1IL83.js} +13 -1
- package/dist/src-DLfUWFAI.js +1851 -0
- package/dist/ssf/index.d.ts +4 -4
- package/dist/ssf/index.js +384 -47
- package/dist/standard-webhooks-6lg8v_is.d.ts +88 -0
- package/dist/standard-webhooks-DgFFD-Ga.js +228 -0
- package/dist/storage-C2bWdvJH.js +132 -0
- package/dist/{store-ILkLUj_o.js → store-4u_hxjWa.js} +40 -53
- package/dist/{store-options-CbUHDoSe.js → store-options-BqEakYRa.js} +26 -21
- package/dist/{stores-BHXdSbw9.js → stores-BbsD4fAR.js} +2 -2
- package/dist/{stores-Cxz_80g-.d.ts → stores-ClZUgeoP.d.ts} +7 -8
- package/dist/{stream-Dwsg6WwE.d.ts → stream-7-xmnf3U.d.ts} +2 -2
- package/dist/{stream-BMui98KK.js → stream-CvdUS9V1.js} +9 -2
- package/dist/style-DiKWnAvn.js +1 -0
- package/dist/{style-CTm1AXDT.js → style-Uao76wO7.js} +3 -2
- package/dist/subject-BGoM5o8B.js +17 -0
- package/dist/supabase/index.d.ts +23 -106
- package/dist/supabase/index.js +5 -4
- package/dist/supabase/middleware.d.ts +7 -6
- package/dist/supabase/middleware.js +13 -11
- package/dist/supabase-9pqI57pW.js +92 -0
- package/dist/{supabase-C1TWlnYt.js → supabase-Dxlp8A94.js} +98 -205
- package/dist/supabase-hook-CXcGpHqq.js +1 -0
- package/dist/{supabase-hook-Cva3ikXz.js → supabase-hook-DdDQhMlw.js} +951 -60
- package/dist/support-session-C6xJQYut.js +158 -0
- package/dist/svelte/Protected.svelte +4 -4
- package/dist/svelte/index.d.ts +7 -7
- package/dist/svelte/index.js +10 -10
- package/dist/svelte/runtime.d.ts +3 -3
- package/dist/svelte/runtime.js +3 -3
- package/dist/svelte/source.d.ts +7 -7
- package/dist/svelte/source.js +4 -4
- package/dist/sveltekit/index.d.ts +51 -0
- package/dist/sveltekit/index.js +27 -0
- package/dist/tanstack-start/index.d.ts +51 -0
- package/dist/tanstack-start/index.js +40 -0
- package/dist/target-Bw37TFNA.js +51 -0
- package/dist/{tenancy-DshjqY0n.js → tenancy-DN2QAx9z.js} +5 -5
- package/dist/terminal/index.d.ts +11 -9
- package/dist/terminal/index.js +23 -287
- package/dist/testing/index.d.ts +311 -38
- package/dist/testing/index.js +3475 -201
- package/dist/testing/saas/index.d.ts +9 -8
- package/dist/testing/saas/index.js +2 -2
- package/dist/testing/saas/permissions.d.ts +1 -1
- package/dist/testing/saas/permissions.js +1 -2
- package/dist/text-BMFRfBqc.js +8 -0
- package/dist/{text-diff-BdkkYSbi.js → text-diff-BQcUapOb.js} +1 -1
- package/dist/thenable-yD7SabqG.js +31 -0
- package/dist/time-DkWjdL98.js +71 -0
- package/dist/{token-Bx9qy30p.js → token-BLZcjQgt.js} +15 -6
- package/dist/{tool-refusal-CQ7OEia9.js → tool-refusal-CMLN5xhn.js} +2 -2
- package/dist/trpc/index.d.ts +12 -9
- package/dist/trpc/index.js +16 -14
- package/dist/{types-7rJVLWe5.d.ts → types-5Ut_pbKy.d.ts} +61 -11
- package/dist/{store-9KO4BlkB.d.ts → types-BNORmDM8.d.ts} +100 -75
- package/dist/types-BjV-fqcA.d.ts +57 -0
- package/dist/{types-CUcFZfpU.d.ts → types-BqAKcRNW.d.ts} +2 -1
- package/dist/types-C8-KNsFf.d.ts +107 -0
- package/dist/{types-Br9IXUBG.d.ts → types-CCpc2Dcv.d.ts} +77 -17
- package/dist/{types-DpWfQdSh.d.ts → types-CZTnPFzM.d.ts} +46 -11
- package/dist/{types-CqrjB9o6.d.ts → types-CdlxsYQh.d.ts} +23 -11
- package/dist/{types-CIlTojhq.d.ts → types-ClZaWzfb.d.ts} +9 -6
- package/dist/types-DX0LaKTb.d.ts +157 -0
- package/dist/types-DiQjupG2.d.ts +332 -0
- package/dist/types-DqzsnlSA.js +67 -0
- package/dist/types-_sHy8BQf.d.ts +65 -0
- package/dist/{types-ByUo56un.d.ts → types-fbZ7JEXr.d.ts} +23 -22
- package/dist/{types-DHrmBJLH.d.ts → types-tIgIeIKJ.d.ts} +7 -7
- package/dist/unplugin/index.d.ts +1 -1
- package/dist/unplugin/index.js +2 -2
- package/dist/usage-CHOtwL19.js +1 -0
- package/dist/usage-DHtE8j4E.js +32 -0
- package/dist/{usage-CG9nOYZw.js → usage-T5mXq98v.js} +54 -11
- package/dist/{validation-error-BSSw0l_8.d.ts → validation-error-Bg5Tpluk.d.ts} +1 -1
- package/dist/{validity-dVrUEPJt.js → validity-CZ7-y0Cj.js} +32 -15
- package/dist/{verifier-DMr_Zmb_.js → verifier-DHuh-okk.js} +18 -7
- package/dist/{verify-BztUB3GX.js → verify-DbCL9bnB.js} +645 -50
- package/dist/{version-BEogC-rB.js → version-CEbQ5UeM.js} +4 -3
- package/dist/version-DXkYUISx.js +1 -0
- package/dist/{views-CJsrBS1f.js → views-DTIIO-oQ.js} +22 -5
- package/dist/{permission-types-Dg39z9Kv.d.ts → vocabulary-D6lPdb4Z.d.ts} +65 -2
- package/dist/vue/index.d.ts +9 -10
- package/dist/vue/index.js +8 -8
- package/dist/waiter-BGUtGYoU.js +67 -0
- package/dist/waiter-CKy4MQSY.d.ts +36 -0
- package/dist/watch-Cb-NcaUw.js +1 -0
- package/dist/{watch-zeucB7eF.js → watch-CszoTJMq.js} +44 -5
- package/dist/webmcp/index.d.ts +2 -2
- package/dist/webmcp/index.js +3 -3
- package/dist/where-scope-Dv-WTP-w.js +306 -0
- package/dist/who-can-D0QoYbEb.js +364 -0
- package/dist/wire-delegation-Cv3W2eaM.js +36 -0
- package/dist/wire-denial-C7PaVYEM.js +27 -0
- package/dist/workflow/index.d.ts +5 -0
- package/dist/workflow/index.js +223 -0
- package/dist/workflow-sdk/index.d.ts +56 -0
- package/dist/workflow-sdk/index.js +78 -0
- package/dist/{wrap-Cr93qqdP.d.ts → wrap-Bd1Tejur.d.ts} +2 -1
- package/dist/{wrap-DWsU_5Bd.js → wrap-gX61EtpB.js} +7 -6
- package/package.json +136 -37
- package/schemas/access-event-v1.json +118 -0
- package/schemas/approval-request-v1.json +34 -1
- package/schemas/approval-signature-v1.json +94 -0
- package/schemas/automation-event-v1.json +113 -0
- package/schemas/capability-v1.json +84 -0
- package/schemas/catalog-event-v1.json +87 -0
- package/schemas/catalog-v1.json +123 -12
- package/schemas/cli-commands-v1.json +164 -0
- package/schemas/cli-result-v1.json +96 -0
- package/schemas/cloud-api-v1.json +5407 -0
- package/schemas/connector-v1.json +408 -0
- package/schemas/credential-event-v1.json +81 -0
- package/schemas/credential-v1.json +134 -0
- package/schemas/decision-event-v1.json +288 -0
- package/schemas/delivery-event-v1.json +117 -0
- package/schemas/directory-event-v1.json +85 -0
- package/schemas/evidence-export-v1.json +54 -0
- package/schemas/membership-event-v1.json +93 -0
- package/schemas/policy-v1.json +68 -0
- package/schemas/pushed-policy-v1.json +236 -0
- package/schemas/run-v1.json +162 -0
- package/schemas/snapshot-v1.json +138 -0
- package/schemas/supabase-claims-v1.json +4 -4
- package/schemas/supabase-manifest-v1.json +5 -1
- package/schemas/support-session-v1.json +111 -0
- package/skills/permdock/SKILL.md +16 -12
- package/skills/permdock-agents/SKILL.md +40 -23
- package/skills/permdock-agents/references/operations-automations-chat.md +221 -0
- package/skills/permdock-agents/references/runtimes.md +22 -18
- package/skills/permdock-approvals/SKILL.md +29 -13
- package/skills/permdock-approvals/references/delivery-and-waiters.md +172 -0
- package/skills/permdock-approvals/references/stores-and-resume.md +21 -7
- package/skills/permdock-audit/SKILL.md +3 -3
- package/skills/permdock-credentials/SKILL.md +5 -5
- package/skills/permdock-credentials/references/tokens-keys-links.md +14 -10
- package/skills/permdock-data/SKILL.md +6 -6
- package/skills/permdock-data/references/queries-and-rls.md +9 -8
- package/skills/permdock-data/references/relationships.md +3 -3
- package/skills/permdock-tenancy/SKILL.md +20 -7
- package/skills/permdock-tenancy/references/contacts-and-support-sessions.md +122 -0
- package/skills/permdock-tenancy/references/ownership-and-custom-roles.md +5 -4
- package/skills/permdock-wire/SKILL.md +17 -11
- package/skills/permdock-wire/references/adapters.md +139 -51
- package/skills/permdock-wire/references/policy-options.md +5 -5
- package/skills/permdock-wire/references/presets-and-recipes.md +58 -0
- package/dist/approvals-DZL76lKW.js +0 -240
- package/dist/arazzo-CD8d0WLb.js +0 -54
- package/dist/catalog-6yWAX6Ps.js +0 -2
- package/dist/catalog-WHG4kBq7.js +0 -48
- package/dist/cloud-C7bSDgX4.js +0 -50
- package/dist/cloud-PeBN3IEn.js +0 -118
- package/dist/collect-Bw2Jdq1q.js +0 -2
- package/dist/collect-CQx4hX4N.js +0 -83
- package/dist/commands-Cpip4ULx.js +0 -97
- package/dist/config-DLt6BvV7.js +0 -36
- package/dist/diff-Cnghh_Ip.js +0 -48
- package/dist/doctor-CuVJvhV_.js +0 -53
- package/dist/duration-xK2jGFVc.js +0 -25
- package/dist/errors-CWfoNg9N.js +0 -47
- package/dist/errors-DRnGZHzF.js +0 -30
- package/dist/expiry-BoBJ8Tvc.js +0 -7
- package/dist/fields-fwfXN01n.js +0 -1016
- package/dist/headers-BZSDieNT.js +0 -6
- package/dist/headers-Cf-zWvsO.d.ts +0 -6
- package/dist/ids-DC4V4CFu.js +0 -18
- package/dist/index-DgM7w96K.d.ts +0 -6
- package/dist/index-Dz7didpC.d.ts +0 -201
- package/dist/load-B_shHrmd.js +0 -2
- package/dist/manifest-BngWKryL.js +0 -770
- package/dist/may-use-BOn_dR_w.js +0 -78
- package/dist/openapi-DcQ1Kg40.js +0 -164
- package/dist/ownership-BgnbOJFT.js +0 -851
- package/dist/permdock-L26udHSk.js +0 -3646
- package/dist/powersync-BFSbSElQ.js +0 -62
- package/dist/powersync-DCDgZgfZ.js +0 -2
- package/dist/rls-55DQTuf5.js +0 -250
- package/dist/run-DMcNW_8T.js +0 -174
- package/dist/server-ZYEHtNHS.js +0 -268
- package/dist/sink-BTtmfPnE.js +0 -141
- package/dist/sink-CPN4zLfs.d.ts +0 -104
- package/dist/skills-Dle4ZoLF.js +0 -56
- package/dist/snapshot-Dc9CHPME.js +0 -1078
- package/dist/src-Bb7no-hS.js +0 -639
- package/dist/subject-C6dLxqHU.js +0 -24
- package/dist/supabase-Dbqr141s.js +0 -83
- package/dist/supabase-hook-BULg7Ut_.js +0 -2
- package/dist/thenable-QSmvt-vZ.js +0 -65
- package/dist/types-C0dee0Qf.d.ts +0 -197
- package/dist/types-DvupZE0w.d.ts +0 -9
- package/dist/usage-4G6t643F.js +0 -42
- package/dist/usage-iFLJ0-rr.js +0 -2
- package/dist/vocabulary-hhEFLFoL.d.ts +0 -65
- package/dist/watch-C8TpsAl4.js +0 -2
package/dist/ssf/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { C as
|
|
2
|
-
import { t as memoryReplayStore } from "../replay-
|
|
3
|
-
import { t as createPermDock } from "../index-
|
|
4
|
-
export { type CaepEventName, type PollHandle, type PollOptions, type PollResult, type ReplayStore, type SetSubject, type SsfAuditEvent, type SsfEventHandler, type SsfEventInput, type SsfEventListener, type SsfOnEvent, type SsfPermDock, type SsfPermDockOptions, type SsfReceiver, type SsfSubject, type
|
|
1
|
+
import { A as SsfSubject, C as SsfEventName, D as SsfReceiver, E as SsfPermDockOptions, M as SsfTransmitterConfiguration, N as SsfVerification, O as SsfStreamConfiguration, S as SsfEventListener, T as SsfPermDock, _ as SetSubject, a as PollHandle, b as SsfEventHandler, c as PushSetOptions, d as SetDelivery, f as SetDeliveryFailureCause, g as SetQueue, h as SetPollHandlerOptions, i as CaepReason, j as SsfSubjectResolver, k as SsfStreamStatus, l as ReplayStore, m as SetEvent, n as CaepEventName, o as PollOptions, p as SetError, r as CaepInitiatingEntity, s as PollResult, t as CaepCommon, u as RiscEventName, v as SignSetOptions, w as SsfOnEvent, x as SsfEventInput, y as SsfAuditEvent } from "../types-DiQjupG2.js";
|
|
2
|
+
import { t as memoryReplayStore } from "../replay-D7iKcLFe.js";
|
|
3
|
+
import { _ as setPollHandler, a as CaepTokenClaimsChange, c as RiscEvents, d as caepEvents, f as pushSet, g as memorySetQueue, h as streamVerificationEvent, i as CaepEvents, l as SSF_POLL_DELIVERY, m as signSet, n as CaepCredentialChange, o as RiscAccountDisabled, p as riscEvents, r as CaepDeviceComplianceChange, s as RiscCredentialCompromise, t as CaepAssuranceLevelChange, u as SSF_PUSH_DELIVERY, v as createPermDock } from "../index-D8EovfsP.js";
|
|
4
|
+
export { type CaepAssuranceLevelChange, type CaepCommon, type CaepCredentialChange, type CaepDeviceComplianceChange, type CaepEventName, type CaepEvents, type CaepInitiatingEntity, type CaepReason, type CaepTokenClaimsChange, type PollHandle, type PollOptions, type PollResult, type PushSetOptions, type ReplayStore, type RiscAccountDisabled, type RiscCredentialCompromise, type RiscEventName, type RiscEvents, SSF_POLL_DELIVERY, SSF_PUSH_DELIVERY, type SetDelivery, type SetDeliveryFailureCause, type SetError, type SetEvent, type SetPollHandlerOptions, type SetQueue, type SetSubject, type SignSetOptions, type SsfAuditEvent, type SsfEventHandler, type SsfEventInput, type SsfEventListener, type SsfEventName, type SsfOnEvent, type SsfPermDock, type SsfPermDockOptions, type SsfReceiver, type SsfStreamConfiguration, type SsfStreamStatus, type SsfSubject, type SsfSubjectResolver, type SsfTransmitterConfiguration, type SsfVerification, caepEvents, createPermDock, memoryReplayStore, memorySetQueue, pushSet, riscEvents, setPollHandler, signSet, streamVerificationEvent };
|
package/dist/ssf/index.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { r as isRecord, t as compact } from "../compact-CAf557ZB.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { t as
|
|
2
|
+
import { o as epochSeconds } from "../time-DkWjdL98.js";
|
|
3
|
+
import { n as readBodyText } from "../body-text-QcXok_SI.js";
|
|
4
|
+
import { t as cancelApprovals } from "../helpers-DTcZOzhF.js";
|
|
5
|
+
import { i as issuerFromDiscovery, t as joseTokenVerifier } from "../verifier-DHuh-okk.js";
|
|
6
|
+
import { t as memoryReplayStore } from "../replay-Du1tJjG7.js";
|
|
5
7
|
import { t as timeoutSignal } from "../timeout-D51niuQP.js";
|
|
6
8
|
//#region src/ssf/claims.ts
|
|
7
9
|
function asSubject(mapped, session, issuer) {
|
|
@@ -46,18 +48,39 @@ function subjectSession(subject) {
|
|
|
46
48
|
//#endregion
|
|
47
49
|
//#region src/ssf/events.ts
|
|
48
50
|
const BACKCHANNEL_LOGOUT_EVENT = "http://schemas.openid.net/event/backchannel-logout";
|
|
51
|
+
/** SSF 1.0 section 8.1.4.1. */
|
|
52
|
+
const VERIFICATION_EVENT = "https://schemas.openid.net/secevent/ssf/event-type/verification";
|
|
49
53
|
const CAEP_PREFIX = "https://schemas.openid.net/secevent/caep/event-type/";
|
|
50
|
-
const
|
|
54
|
+
const RISC_PREFIX = "https://schemas.openid.net/secevent/risc/event-type/";
|
|
55
|
+
const CAEP_NAMES = [
|
|
51
56
|
"session-revoked",
|
|
52
57
|
"credential-change",
|
|
53
58
|
"assurance-level-change",
|
|
54
59
|
"token-claims-change",
|
|
55
|
-
"device-compliance-change"
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
60
|
+
"device-compliance-change",
|
|
61
|
+
"session-established",
|
|
62
|
+
"session-presented",
|
|
63
|
+
"risk-level-change"
|
|
64
|
+
];
|
|
65
|
+
const RISC_NAMES = [
|
|
66
|
+
"account-disabled",
|
|
67
|
+
"account-purged",
|
|
68
|
+
"credential-compromise"
|
|
69
|
+
];
|
|
70
|
+
/** The CAEP or RISC name of an event URI PermDock knows, else `undefined`. */
|
|
71
|
+
function eventName(uri) {
|
|
72
|
+
if (uri.startsWith("https://schemas.openid.net/secevent/caep/event-type/")) {
|
|
73
|
+
const name = uri.slice(52);
|
|
74
|
+
return CAEP_NAMES.find((known) => known === name);
|
|
75
|
+
}
|
|
76
|
+
if (uri.startsWith("https://schemas.openid.net/secevent/risc/event-type/")) {
|
|
77
|
+
const name = uri.slice(52);
|
|
78
|
+
return RISC_NAMES.find((known) => known === name);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/** RISC events that end every session of the subject. */
|
|
82
|
+
function revokesAccount(name) {
|
|
83
|
+
return RISC_NAMES.some((known) => known === name);
|
|
61
84
|
}
|
|
62
85
|
//#endregion
|
|
63
86
|
//#region src/ssf/poll.ts
|
|
@@ -125,6 +148,13 @@ async function pollOnce(input) {
|
|
|
125
148
|
//#region src/ssf/wire.ts
|
|
126
149
|
const SET_TYP = "secevent+jwt";
|
|
127
150
|
const LOGOUT_TYP = "logout+jwt";
|
|
151
|
+
const SET_CONTENT = "application/secevent+jwt";
|
|
152
|
+
const HANDLER_FAILED = {
|
|
153
|
+
ok: false,
|
|
154
|
+
err: "invalid_request",
|
|
155
|
+
description: "handler failed",
|
|
156
|
+
retry: true
|
|
157
|
+
};
|
|
128
158
|
function jsonResponse(status, body) {
|
|
129
159
|
return new Response(JSON.stringify(body), {
|
|
130
160
|
status,
|
|
@@ -178,17 +208,21 @@ function parseEvery(every) {
|
|
|
178
208
|
}
|
|
179
209
|
//#endregion
|
|
180
210
|
//#region src/ssf/receiver.ts
|
|
211
|
+
/** Seconds a SET without `exp` stays acceptable after its `iat`. */
|
|
212
|
+
const DEFAULT_SET_MAX_AGE = 86400;
|
|
181
213
|
const CHANGED_EVENTS = /* @__PURE__ */ new Set([
|
|
182
214
|
"credential-change",
|
|
183
215
|
"assurance-level-change",
|
|
184
216
|
"token-claims-change"
|
|
185
217
|
]);
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
218
|
+
/**
|
|
219
|
+
* When the replay record of a SET may be dropped: its `exp`, or for a SET
|
|
220
|
+
* without one (RFC 8417 section 2.2) the end of its acceptance window, so
|
|
221
|
+
* the same `jti` cannot pass verification again once the record is gone.
|
|
222
|
+
*/
|
|
223
|
+
function replayExpiresAt(claims, clockTolerance = 0, maxTokenAge = DEFAULT_SET_MAX_AGE) {
|
|
224
|
+
if (typeof claims["exp"] === "number") return claims["exp"] + clockTolerance;
|
|
225
|
+
if (typeof claims["iat"] === "number") return claims["iat"] + maxTokenAge + clockTolerance;
|
|
192
226
|
}
|
|
193
227
|
function replayKey(issuer, jti, event) {
|
|
194
228
|
return JSON.stringify(event === void 0 ? [issuer ?? null, jti] : [
|
|
@@ -228,6 +262,12 @@ function createReceiver(config) {
|
|
|
228
262
|
description: "missing iat",
|
|
229
263
|
cause: "invalid-claims"
|
|
230
264
|
};
|
|
265
|
+
if (typeof result.claims.exp !== "number" && result.claims.iat + (config.maxTokenAge ?? 86400) + (config.clockTolerance ?? 0) <= epochSeconds()) return {
|
|
266
|
+
ok: false,
|
|
267
|
+
err: errForCause("expired"),
|
|
268
|
+
description: "expired",
|
|
269
|
+
cause: "expired"
|
|
270
|
+
};
|
|
231
271
|
return result;
|
|
232
272
|
}
|
|
233
273
|
async function resolveSubject(setSubject, session, issuer) {
|
|
@@ -256,21 +296,23 @@ function createReceiver(config) {
|
|
|
256
296
|
async function publishRevocation(input) {
|
|
257
297
|
const feed = config.revocations;
|
|
258
298
|
if (feed === void 0) return;
|
|
259
|
-
const
|
|
299
|
+
const account = revokesAccount(input.type);
|
|
300
|
+
const kind = input.type === "session-revoked" || account ? "session-revoked" : CHANGED_EVENTS.has(input.type) ? "changed" : void 0;
|
|
260
301
|
if (kind === void 0) return;
|
|
261
302
|
try {
|
|
262
303
|
await feed.revoke(compact({
|
|
263
304
|
principal: input.subject.id,
|
|
264
|
-
session: kind === "session-revoked" ? input.subject.session : void 0,
|
|
305
|
+
session: kind === "session-revoked" && !account ? input.subject.session : void 0,
|
|
265
306
|
kind
|
|
266
307
|
}));
|
|
267
308
|
} catch {}
|
|
268
309
|
}
|
|
269
310
|
async function cancelSessionApprovals(input) {
|
|
270
|
-
|
|
311
|
+
const account = revokesAccount(input.type);
|
|
312
|
+
if (config.approvals === void 0 || input.type !== "session-revoked" && !account) return;
|
|
271
313
|
const count = await cancelApprovals(config.approvals, compact({
|
|
272
314
|
principalId: input.subject.id,
|
|
273
|
-
session: input.subject.session
|
|
315
|
+
session: account ? void 0 : input.subject.session
|
|
274
316
|
}), {
|
|
275
317
|
by: "ssf",
|
|
276
318
|
note: input.jti
|
|
@@ -283,7 +325,7 @@ function createReceiver(config) {
|
|
|
283
325
|
});
|
|
284
326
|
}
|
|
285
327
|
async function dispatch(type, input) {
|
|
286
|
-
const named = Object.hasOwn(config.onEvent, type) ? config.onEvent[type] : void 0;
|
|
328
|
+
const named = Object.hasOwn(config.onEvent, type) && type !== "verification" ? config.onEvent[type] : void 0;
|
|
287
329
|
const wildcard = config.onEvent["*"];
|
|
288
330
|
const handler = named ?? wildcard;
|
|
289
331
|
if (handler === void 0) {
|
|
@@ -301,11 +343,7 @@ function createReceiver(config) {
|
|
|
301
343
|
try {
|
|
302
344
|
await handler(input);
|
|
303
345
|
} catch {
|
|
304
|
-
return
|
|
305
|
-
ok: false,
|
|
306
|
-
err: "invalid_request",
|
|
307
|
-
description: "handler failed"
|
|
308
|
-
};
|
|
346
|
+
return HANDLER_FAILED;
|
|
309
347
|
}
|
|
310
348
|
emit({
|
|
311
349
|
type,
|
|
@@ -317,6 +355,25 @@ function createReceiver(config) {
|
|
|
317
355
|
await cancelSessionApprovals(input);
|
|
318
356
|
return { ok: true };
|
|
319
357
|
}
|
|
358
|
+
async function verification(payload, issuer, jti) {
|
|
359
|
+
const state = typeof payload["state"] === "string" ? payload["state"] : void 0;
|
|
360
|
+
try {
|
|
361
|
+
await config.onEvent.verification?.(compact({
|
|
362
|
+
state,
|
|
363
|
+
jti,
|
|
364
|
+
issuer
|
|
365
|
+
}));
|
|
366
|
+
} catch {
|
|
367
|
+
return HANDLER_FAILED;
|
|
368
|
+
}
|
|
369
|
+
emit({
|
|
370
|
+
type: "verification",
|
|
371
|
+
transmitter: issuer,
|
|
372
|
+
jti,
|
|
373
|
+
state
|
|
374
|
+
});
|
|
375
|
+
return { ok: true };
|
|
376
|
+
}
|
|
320
377
|
async function dispatchEvents(entries, run) {
|
|
321
378
|
const [head, ...tail] = entries;
|
|
322
379
|
if (head === void 0) return { ok: true };
|
|
@@ -325,8 +382,14 @@ function createReceiver(config) {
|
|
|
325
382
|
const eventKey = replayKey(issuer, jti, uri);
|
|
326
383
|
if (run.perEvent && await config.replay.seen(eventKey)) return dispatchEvents(tail, run);
|
|
327
384
|
const payload = isRecord(raw) ? raw : {};
|
|
328
|
-
|
|
329
|
-
|
|
385
|
+
if (uri === "https://schemas.openid.net/secevent/ssf/event-type/verification") {
|
|
386
|
+
const result = await verification(payload, issuer, jti);
|
|
387
|
+
if (!result.ok) return result;
|
|
388
|
+
return dispatchEvents(tail, run);
|
|
389
|
+
}
|
|
390
|
+
const named = eventName(uri);
|
|
391
|
+
const type = named ?? uri;
|
|
392
|
+
if (named === void 0 && config.onEvent["*"] === void 0) {
|
|
330
393
|
emit({
|
|
331
394
|
type,
|
|
332
395
|
transmitter: issuer,
|
|
@@ -380,7 +443,7 @@ function createReceiver(config) {
|
|
|
380
443
|
cause: "invalid-claims"
|
|
381
444
|
};
|
|
382
445
|
const key = replayKey(issuer, jti);
|
|
383
|
-
const expiresAt = replayExpiresAt(verified.claims, config.clockTolerance);
|
|
446
|
+
const expiresAt = replayExpiresAt(verified.claims, config.clockTolerance, config.maxTokenAge);
|
|
384
447
|
if (!await claimDelivery(key, expiresAt)) {
|
|
385
448
|
emit({
|
|
386
449
|
type: "replay",
|
|
@@ -391,11 +454,7 @@ function createReceiver(config) {
|
|
|
391
454
|
return { ok: true };
|
|
392
455
|
}
|
|
393
456
|
const entries = Object.entries(events);
|
|
394
|
-
let dispatched =
|
|
395
|
-
ok: false,
|
|
396
|
-
err: "invalid_request",
|
|
397
|
-
description: "handler failed"
|
|
398
|
-
};
|
|
457
|
+
let dispatched = HANDLER_FAILED;
|
|
399
458
|
try {
|
|
400
459
|
dispatched = await dispatchEvents(entries, {
|
|
401
460
|
issuer,
|
|
@@ -447,7 +506,7 @@ function createReceiver(config) {
|
|
|
447
506
|
const jti = verified.claims["jti"];
|
|
448
507
|
const issuer = typeof verified.claims.iss === "string" ? verified.claims.iss : void 0;
|
|
449
508
|
const key = replayKey(issuer, jti);
|
|
450
|
-
const expiresAt = replayExpiresAt(verified.claims, config.clockTolerance);
|
|
509
|
+
const expiresAt = replayExpiresAt(verified.claims, config.clockTolerance, config.maxTokenAge);
|
|
451
510
|
if (!await claimDelivery(key, expiresAt)) {
|
|
452
511
|
emit({
|
|
453
512
|
type: "replay",
|
|
@@ -457,11 +516,7 @@ function createReceiver(config) {
|
|
|
457
516
|
});
|
|
458
517
|
return { ok: true };
|
|
459
518
|
}
|
|
460
|
-
let dispatched =
|
|
461
|
-
ok: false,
|
|
462
|
-
err: "invalid_request",
|
|
463
|
-
description: "handler failed"
|
|
464
|
-
};
|
|
519
|
+
let dispatched = HANDLER_FAILED;
|
|
465
520
|
try {
|
|
466
521
|
dispatched = await dispatchLogout(verified.claims, {
|
|
467
522
|
issuer,
|
|
@@ -505,20 +560,28 @@ function createReceiver(config) {
|
|
|
505
560
|
}
|
|
506
561
|
return {
|
|
507
562
|
async push(request) {
|
|
508
|
-
if (request.method !== "POST") return
|
|
563
|
+
if (request.method !== "POST") return new Response(null, {
|
|
564
|
+
status: 405,
|
|
565
|
+
headers: { allow: "POST" }
|
|
566
|
+
});
|
|
509
567
|
if (contentType(request) !== "application/secevent+jwt") return rfc8935(400, "invalid_request", "application/secevent+jwt required");
|
|
510
|
-
const
|
|
568
|
+
const read = await readBodyText(request);
|
|
569
|
+
if (!read.ok) return read.cause === "too-large" ? rfc8935(413, "invalid_request", "body is too large") : rfc8935(400, "invalid_request", "unreadable body");
|
|
570
|
+
const token = read.text.trim();
|
|
511
571
|
if (token.length === 0) return rfc8935(400, "invalid_request", "empty body");
|
|
512
572
|
const result = await ingestSet(token);
|
|
513
|
-
if (!result.ok) return rfc8935(400, result.err, result.description);
|
|
573
|
+
if (!result.ok) return result.retry === true ? new Response(null, { status: 500 }) : rfc8935(400, result.err, result.description);
|
|
514
574
|
return new Response(null, { status: 202 });
|
|
515
575
|
},
|
|
516
576
|
async logout(request) {
|
|
517
577
|
if (request.method !== "POST") return jsonResponse(400, { error: "invalid_request" });
|
|
518
578
|
if (contentType(request) !== "application/x-www-form-urlencoded") return jsonResponse(400, { error: "invalid_request" });
|
|
519
|
-
const
|
|
579
|
+
const read = await readBodyText(request);
|
|
580
|
+
if (!read.ok) return jsonResponse(read.cause === "too-large" ? 413 : 400, { error: "invalid_request" });
|
|
581
|
+
const token = new URLSearchParams(read.text).get("logout_token");
|
|
520
582
|
if (token === null || token.length === 0) return jsonResponse(400, { error: "invalid_request" });
|
|
521
|
-
|
|
583
|
+
const result = await ingestLogout(token);
|
|
584
|
+
if (!result.ok) return result.retry === true ? new Response(null, { status: 500 }) : jsonResponse(400, { error: "invalid_request" });
|
|
522
585
|
return new Response(null, { status: 200 });
|
|
523
586
|
},
|
|
524
587
|
poll(options) {
|
|
@@ -586,8 +649,282 @@ function createPermDock(policy, options) {
|
|
|
586
649
|
replay: options.replay ?? memoryReplayStore(),
|
|
587
650
|
approvals: options.approvals,
|
|
588
651
|
revocations: options.revocations,
|
|
589
|
-
clockTolerance: options.clockTolerance
|
|
652
|
+
clockTolerance: options.clockTolerance,
|
|
653
|
+
maxTokenAge: options.maxTokenAge
|
|
590
654
|
})) };
|
|
591
655
|
}
|
|
592
656
|
//#endregion
|
|
593
|
-
|
|
657
|
+
//#region src/ssf/set-queue.ts
|
|
658
|
+
/** The largest poll request body read: acknowledgements and errors for many SETs. */
|
|
659
|
+
const MAX_POLL_BYTES = 262144;
|
|
660
|
+
const DEFAULT_MAX_EVENTS = 100;
|
|
661
|
+
/**
|
|
662
|
+
* An in-process `SetQueue`: pending SETs per stream in insertion order. A
|
|
663
|
+
* process restart loses them; a deployment with more than one instance needs
|
|
664
|
+
* a shared queue.
|
|
665
|
+
*/
|
|
666
|
+
function memorySetQueue() {
|
|
667
|
+
const streams = /* @__PURE__ */ new Map();
|
|
668
|
+
const of = (stream) => {
|
|
669
|
+
let queue = streams.get(stream);
|
|
670
|
+
if (queue === void 0) {
|
|
671
|
+
queue = /* @__PURE__ */ new Map();
|
|
672
|
+
streams.set(stream, queue);
|
|
673
|
+
}
|
|
674
|
+
return queue;
|
|
675
|
+
};
|
|
676
|
+
return Object.freeze({
|
|
677
|
+
name: "memory",
|
|
678
|
+
enqueue(stream, jti, set) {
|
|
679
|
+
of(stream).set(jti, set);
|
|
680
|
+
},
|
|
681
|
+
pending(stream, max) {
|
|
682
|
+
return [...of(stream)].slice(0, Math.max(0, max)).map(([jti, set]) => ({
|
|
683
|
+
jti,
|
|
684
|
+
set
|
|
685
|
+
}));
|
|
686
|
+
},
|
|
687
|
+
ack(stream, jti) {
|
|
688
|
+
of(stream).delete(jti);
|
|
689
|
+
},
|
|
690
|
+
fail(stream, jti, _error) {
|
|
691
|
+
of(stream).delete(jti);
|
|
692
|
+
}
|
|
693
|
+
});
|
|
694
|
+
}
|
|
695
|
+
function setErrors(value) {
|
|
696
|
+
if (value === void 0) return [];
|
|
697
|
+
if (!isRecord(value)) return;
|
|
698
|
+
const out = [];
|
|
699
|
+
for (const [jti, entry] of Object.entries(value)) {
|
|
700
|
+
if (!isRecord(entry) || typeof entry["err"] !== "string" || typeof entry["description"] !== "string") return;
|
|
701
|
+
out.push([jti, {
|
|
702
|
+
err: entry["err"],
|
|
703
|
+
description: entry["description"]
|
|
704
|
+
}]);
|
|
705
|
+
}
|
|
706
|
+
return out;
|
|
707
|
+
}
|
|
708
|
+
function parsePollRequest(text) {
|
|
709
|
+
let parsed;
|
|
710
|
+
try {
|
|
711
|
+
parsed = text.trim() === "" ? {} : JSON.parse(text);
|
|
712
|
+
} catch {
|
|
713
|
+
return;
|
|
714
|
+
}
|
|
715
|
+
if (!isRecord(parsed)) return;
|
|
716
|
+
const { maxEvents, acks = [] } = parsed;
|
|
717
|
+
const setErrs = setErrors(parsed["setErrs"]);
|
|
718
|
+
if (maxEvents !== void 0 && !(Number.isSafeInteger(maxEvents) && Number(maxEvents) >= 0) || !Array.isArray(acks) || !acks.every((jti) => typeof jti === "string") || setErrs === void 0) return;
|
|
719
|
+
return {
|
|
720
|
+
...maxEvents === void 0 ? {} : { maxEvents: Number(maxEvents) },
|
|
721
|
+
acks: acks.map(String),
|
|
722
|
+
setErrs
|
|
723
|
+
};
|
|
724
|
+
}
|
|
725
|
+
/**
|
|
726
|
+
* The RFC 8936 poll endpoint over a `SetQueue`. It applies the request's
|
|
727
|
+
* `acks` and `setErrs`, then answers `{ sets, moreAvailable }` with up to
|
|
728
|
+
* `maxEvents` pending SETs. It answers at once whatever `returnImmediately`
|
|
729
|
+
* says, which RFC 8936 section 2.4 allows.
|
|
730
|
+
*/
|
|
731
|
+
function setPollHandler(options) {
|
|
732
|
+
const cap = options.maxEvents ?? DEFAULT_MAX_EVENTS;
|
|
733
|
+
return async (request) => {
|
|
734
|
+
if (request.method !== "POST") return new Response(null, {
|
|
735
|
+
status: 405,
|
|
736
|
+
headers: { allow: "POST" }
|
|
737
|
+
});
|
|
738
|
+
let stream;
|
|
739
|
+
try {
|
|
740
|
+
stream = await options.authorize(request);
|
|
741
|
+
} catch {
|
|
742
|
+
stream = null;
|
|
743
|
+
}
|
|
744
|
+
if (stream === null) return rfc8935(401, "authentication_failed", "poll not authorized");
|
|
745
|
+
const read = await readBodyText(request, MAX_POLL_BYTES);
|
|
746
|
+
const body = read.ok ? parsePollRequest(read.text) : void 0;
|
|
747
|
+
if (body === void 0) return rfc8935(400, "invalid_request", "malformed poll request");
|
|
748
|
+
const { queue } = options;
|
|
749
|
+
for (const jti of body.acks) await queue.ack(stream, jti);
|
|
750
|
+
for (const [jti, error] of body.setErrs) await queue.fail(stream, jti, error);
|
|
751
|
+
const max = Math.min(body.maxEvents ?? cap, cap);
|
|
752
|
+
if (max === 0) return jsonResponse(200, { sets: {} });
|
|
753
|
+
const pending = await queue.pending(stream, max + 1);
|
|
754
|
+
const sets = {};
|
|
755
|
+
for (const { jti, set } of pending.slice(0, max)) sets[jti] = set;
|
|
756
|
+
return jsonResponse(200, {
|
|
757
|
+
sets,
|
|
758
|
+
...pending.length > max ? { moreAvailable: true } : {}
|
|
759
|
+
});
|
|
760
|
+
};
|
|
761
|
+
}
|
|
762
|
+
//#endregion
|
|
763
|
+
//#region src/ssf/transmitter.ts
|
|
764
|
+
/** SSF 1.0 delivery method URN for RFC 8935 push. */
|
|
765
|
+
const SSF_PUSH_DELIVERY = "urn:ietf:rfc:8935";
|
|
766
|
+
/** SSF 1.0 delivery method URN for RFC 8936 poll. */
|
|
767
|
+
const SSF_POLL_DELIVERY = "urn:ietf:rfc:8936";
|
|
768
|
+
/** Milliseconds one push may take. */
|
|
769
|
+
const PUSH_TIMEOUT_MS = 3e4;
|
|
770
|
+
/** The largest error body `pushSet` reads. */
|
|
771
|
+
const MAX_ERROR_BYTES = 16384;
|
|
772
|
+
/**
|
|
773
|
+
* Signs one event as an RFC 8417 Security Event Token (`typ: secevent+jwt`):
|
|
774
|
+
* `sub_id` is the event's subject and `events` holds exactly one entry, as
|
|
775
|
+
* SSF 1.0 requires. `iss` is the signer's own.
|
|
776
|
+
*/
|
|
777
|
+
function signSet(event, signer, options) {
|
|
778
|
+
return signer.sign(compact({
|
|
779
|
+
sub_id: event.subject,
|
|
780
|
+
events: { [event.type]: event.payload },
|
|
781
|
+
txn: options.txn
|
|
782
|
+
}), compact({
|
|
783
|
+
typ: SET_TYP,
|
|
784
|
+
audience: options.audience,
|
|
785
|
+
jti: options.jti,
|
|
786
|
+
issuedAt: options.issuedAt
|
|
787
|
+
}));
|
|
788
|
+
}
|
|
789
|
+
const ERR_CAUSES = {
|
|
790
|
+
invalid_request: "invalid-request",
|
|
791
|
+
invalid_key: "invalid-key",
|
|
792
|
+
invalid_issuer: "invalid-issuer",
|
|
793
|
+
invalid_audience: "invalid-audience",
|
|
794
|
+
authentication_failed: "authentication-failed",
|
|
795
|
+
access_denied: "access-denied"
|
|
796
|
+
};
|
|
797
|
+
async function errorBody(response) {
|
|
798
|
+
const read = await readBodyText(response, MAX_ERROR_BYTES);
|
|
799
|
+
if (!read.ok) return {};
|
|
800
|
+
try {
|
|
801
|
+
const parsed = JSON.parse(read.text);
|
|
802
|
+
if (!isRecord(parsed)) return {};
|
|
803
|
+
return compact({
|
|
804
|
+
err: typeof parsed["err"] === "string" ? parsed["err"] : void 0,
|
|
805
|
+
description: typeof parsed["description"] === "string" ? parsed["description"] : void 0
|
|
806
|
+
});
|
|
807
|
+
} catch {
|
|
808
|
+
return {};
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
/**
|
|
812
|
+
* Pushes one SET to a receiver (RFC 8935). A `2xx` is delivery; a `400`
|
|
813
|
+
* maps the receiver's `err` to a cause; `401` and `403` are
|
|
814
|
+
* `authentication-failed` and `access-denied`; a network failure, a timeout,
|
|
815
|
+
* a `429` or a `5xx` is `unavailable` with `retry: true`. Never throws.
|
|
816
|
+
*/
|
|
817
|
+
async function pushSet(set, options) {
|
|
818
|
+
const fetchFn = options.fetch ?? globalThis.fetch;
|
|
819
|
+
let response;
|
|
820
|
+
try {
|
|
821
|
+
response = await fetchFn(options.endpoint, {
|
|
822
|
+
method: "POST",
|
|
823
|
+
headers: compact({
|
|
824
|
+
"content-type": SET_CONTENT,
|
|
825
|
+
accept: "application/json",
|
|
826
|
+
authorization: options.authorization
|
|
827
|
+
}),
|
|
828
|
+
body: set,
|
|
829
|
+
signal: timeoutSignal(PUSH_TIMEOUT_MS, options.signal)
|
|
830
|
+
});
|
|
831
|
+
} catch {
|
|
832
|
+
return {
|
|
833
|
+
ok: false,
|
|
834
|
+
cause: "unavailable",
|
|
835
|
+
retry: true
|
|
836
|
+
};
|
|
837
|
+
}
|
|
838
|
+
if (response.ok) {
|
|
839
|
+
await response.body?.cancel();
|
|
840
|
+
return { ok: true };
|
|
841
|
+
}
|
|
842
|
+
const { err, description } = await errorBody(response);
|
|
843
|
+
if (response.status === 429 || response.status >= 500) return compact({
|
|
844
|
+
ok: false,
|
|
845
|
+
cause: "unavailable",
|
|
846
|
+
description,
|
|
847
|
+
retry: true
|
|
848
|
+
});
|
|
849
|
+
const cause = (response.status === 401 ? "authentication-failed" : response.status === 403 ? "access-denied" : void 0) ?? (err !== void 0 && Object.hasOwn(ERR_CAUSES, err) ? ERR_CAUSES[err] : void 0) ?? "invalid-request";
|
|
850
|
+
return compact({
|
|
851
|
+
ok: false,
|
|
852
|
+
cause,
|
|
853
|
+
description,
|
|
854
|
+
retry: false
|
|
855
|
+
});
|
|
856
|
+
}
|
|
857
|
+
function reason(value) {
|
|
858
|
+
return typeof value === "string" ? { en: value } : value;
|
|
859
|
+
}
|
|
860
|
+
function caep(name, input, extra) {
|
|
861
|
+
return Object.freeze({
|
|
862
|
+
type: `${CAEP_PREFIX}${name}`,
|
|
863
|
+
subject: input.subject,
|
|
864
|
+
payload: Object.freeze(compact({
|
|
865
|
+
event_timestamp: input.eventTimestamp ?? epochSeconds(),
|
|
866
|
+
initiating_entity: input.initiatingEntity,
|
|
867
|
+
reason_admin: reason(input.reasonAdmin),
|
|
868
|
+
reason_user: reason(input.reasonUser),
|
|
869
|
+
...extra
|
|
870
|
+
}))
|
|
871
|
+
});
|
|
872
|
+
}
|
|
873
|
+
/** CAEP 1.0 event builders; each returns a `SetEvent` for `signSet`. */
|
|
874
|
+
const caepEvents = Object.freeze({
|
|
875
|
+
sessionRevoked: (input) => caep("session-revoked", input, {}),
|
|
876
|
+
credentialChange: (input) => caep("credential-change", input, compact({
|
|
877
|
+
credential_type: input.credentialType,
|
|
878
|
+
change_type: input.changeType,
|
|
879
|
+
friendly_name: input.friendlyName,
|
|
880
|
+
x509_issuer: input.x509Issuer,
|
|
881
|
+
x509_serial: input.x509Serial,
|
|
882
|
+
fido2_aaguid: input.fido2Aaguid
|
|
883
|
+
})),
|
|
884
|
+
tokenClaimsChange: (input) => caep("token-claims-change", input, { claims: input.claims }),
|
|
885
|
+
assuranceLevelChange: (input) => caep("assurance-level-change", input, compact({
|
|
886
|
+
namespace: input.namespace,
|
|
887
|
+
current_level: input.currentLevel,
|
|
888
|
+
previous_level: input.previousLevel,
|
|
889
|
+
change_direction: input.changeDirection
|
|
890
|
+
})),
|
|
891
|
+
deviceComplianceChange: (input) => caep("device-compliance-change", input, {
|
|
892
|
+
previous_status: input.previousStatus,
|
|
893
|
+
current_status: input.currentStatus
|
|
894
|
+
})
|
|
895
|
+
});
|
|
896
|
+
function risc(name, subject, payload) {
|
|
897
|
+
return Object.freeze({
|
|
898
|
+
type: `${RISC_PREFIX}${name}`,
|
|
899
|
+
subject,
|
|
900
|
+
payload: Object.freeze(payload)
|
|
901
|
+
});
|
|
902
|
+
}
|
|
903
|
+
/** RISC 1.0 event builders for the events PermDock's receiver treats as revoking every session. */
|
|
904
|
+
const riscEvents = Object.freeze({
|
|
905
|
+
accountDisabled: (input) => risc("account-disabled", input.subject, compact({ reason: input.reason })),
|
|
906
|
+
accountPurged: (input) => risc("account-purged", input.subject, {}),
|
|
907
|
+
credentialCompromise: (input) => risc("credential-compromise", input.subject, compact({
|
|
908
|
+
credential_type: input.credentialType,
|
|
909
|
+
event_timestamp: input.eventTimestamp ?? epochSeconds(),
|
|
910
|
+
initiating_entity: input.initiatingEntity,
|
|
911
|
+
reason_admin: reason(input.reasonAdmin),
|
|
912
|
+
reason_user: reason(input.reasonUser)
|
|
913
|
+
}))
|
|
914
|
+
});
|
|
915
|
+
/**
|
|
916
|
+
* The SSF 1.0 section 8.1.4 verification event for `stream`, echoing the
|
|
917
|
+
* receiver's `state`. Its subject is the stream, never a principal.
|
|
918
|
+
*/
|
|
919
|
+
function streamVerificationEvent(stream, state) {
|
|
920
|
+
return Object.freeze({
|
|
921
|
+
type: VERIFICATION_EVENT,
|
|
922
|
+
subject: Object.freeze({
|
|
923
|
+
format: "opaque",
|
|
924
|
+
id: stream
|
|
925
|
+
}),
|
|
926
|
+
payload: Object.freeze(compact({ state }))
|
|
927
|
+
});
|
|
928
|
+
}
|
|
929
|
+
//#endregion
|
|
930
|
+
export { SSF_POLL_DELIVERY, SSF_PUSH_DELIVERY, caepEvents, createPermDock, memoryReplayStore, memorySetQueue, pushSet, riscEvents, setPollHandler, signSet, streamVerificationEvent };
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { Rt as Instant, tr as JsonWebKeyLike } from "./policy-types-DzwivBgR.js";
|
|
2
|
+
import { l as ReplayStore } from "./types-DiQjupG2.js";
|
|
3
|
+
//#region src/server/standard-webhooks.d.ts
|
|
4
|
+
/** The three Standard Webhooks headers a delivery carries. */
|
|
5
|
+
type WebhookHeaders = {
|
|
6
|
+
readonly "webhook-id": string;
|
|
7
|
+
readonly "webhook-timestamp": string;
|
|
8
|
+
readonly "webhook-signature": string;
|
|
9
|
+
};
|
|
10
|
+
/** An OKP JWK; only `kty: "OKP"` with `crv: "Ed25519"` signs or verifies `v1a`. */
|
|
11
|
+
type WebhookJwk = JsonWebKeyLike & {
|
|
12
|
+
readonly kid?: string;
|
|
13
|
+
readonly crv?: string;
|
|
14
|
+
readonly x?: string;
|
|
15
|
+
readonly d?: string;
|
|
16
|
+
};
|
|
17
|
+
/** A Standard Webhooks signature version: `v1` HMAC-SHA256 or `v1a` Ed25519. */
|
|
18
|
+
type WebhookAlgorithm = "v1" | "v1a";
|
|
19
|
+
type WebhookSigningKey = {
|
|
20
|
+
readonly alg: "v1";
|
|
21
|
+
readonly secret: string;
|
|
22
|
+
} | {
|
|
23
|
+
readonly alg: "v1a";
|
|
24
|
+
readonly privateKey: WebhookJwk;
|
|
25
|
+
};
|
|
26
|
+
type WebhookSignerOptions = {
|
|
27
|
+
/** Every key signs each delivery, so a receiver can rotate between them. */
|
|
28
|
+
readonly keys: readonly WebhookSigningKey[];
|
|
29
|
+
};
|
|
30
|
+
type WebhookMessage = {
|
|
31
|
+
/** A unique message id, kept across retries of the same message. */
|
|
32
|
+
readonly id: string;
|
|
33
|
+
readonly body: string;
|
|
34
|
+
readonly now?: Instant;
|
|
35
|
+
};
|
|
36
|
+
type WebhookSigner = {
|
|
37
|
+
sign(message: WebhookMessage): Promise<WebhookHeaders>;
|
|
38
|
+
};
|
|
39
|
+
/** An Ed25519 public JWK set for `v1a`, or the URL that serves one. */
|
|
40
|
+
type WebhookJwks = {
|
|
41
|
+
readonly keys: readonly WebhookJwk[];
|
|
42
|
+
} | URL | string;
|
|
43
|
+
type WebhookVerifierOptions = {
|
|
44
|
+
/** `v1` secrets in `whsec_` form; more than one during a rotation. */
|
|
45
|
+
readonly secret?: string | readonly string[];
|
|
46
|
+
/** `v1a` public keys. */
|
|
47
|
+
readonly jwks?: WebhookJwks;
|
|
48
|
+
/** Records each `webhook-id` so a replayed delivery fails. */
|
|
49
|
+
readonly replay: ReplayStore;
|
|
50
|
+
/** Seconds a timestamp may differ from the clock. Defaults to 300. */
|
|
51
|
+
readonly tolerance?: number;
|
|
52
|
+
readonly now?: () => Instant;
|
|
53
|
+
/** Fetches a `jwks` URL. Defaults to the global `fetch`. */
|
|
54
|
+
readonly fetch?: typeof fetch;
|
|
55
|
+
};
|
|
56
|
+
type WebhookFailureCause = "missing-headers" | "malformed" | "timestamp-out-of-range" | "invalid-signature" | "keys-unavailable" | "replayed";
|
|
57
|
+
type WebhookInput = Request | {
|
|
58
|
+
readonly headers: Headers | Readonly<Record<string, string | undefined>>;
|
|
59
|
+
readonly body: string;
|
|
60
|
+
};
|
|
61
|
+
type VerifiedWebhookMessage = {
|
|
62
|
+
readonly ok: true;
|
|
63
|
+
readonly id: string;
|
|
64
|
+
/** The `webhook-timestamp` as an RFC 3339 instant. */
|
|
65
|
+
readonly timestamp: string;
|
|
66
|
+
readonly body: string;
|
|
67
|
+
} | {
|
|
68
|
+
readonly ok: false;
|
|
69
|
+
readonly cause: WebhookFailureCause;
|
|
70
|
+
};
|
|
71
|
+
type WebhookVerifier = {
|
|
72
|
+
/** Never throws; claims the `webhook-id` only after a signature verifies. */
|
|
73
|
+
verify(input: WebhookInput): Promise<VerifiedWebhookMessage>;
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Signs Standard Webhooks deliveries: `v1` HMAC-SHA256 with a `whsec_`
|
|
77
|
+
* secret, `v1a` Ed25519 with a private JWK. Throws on an invalid key or id,
|
|
78
|
+
* because both come from the sender's own configuration.
|
|
79
|
+
*/
|
|
80
|
+
declare function webhookSigner(options: WebhookSignerOptions): WebhookSigner;
|
|
81
|
+
/**
|
|
82
|
+
* Verifies Standard Webhooks deliveries signed `v1` with one of `secret` or
|
|
83
|
+
* `v1a` with a key from `jwks`, within `tolerance` seconds, and records each
|
|
84
|
+
* `webhook-id` in `replay`. Throws only on an invalid `secret`.
|
|
85
|
+
*/
|
|
86
|
+
declare function webhookVerifier(options: WebhookVerifierOptions): WebhookVerifier;
|
|
87
|
+
//#endregion
|
|
88
|
+
export { WebhookInput as a, WebhookMessage as c, WebhookSigningKey as d, WebhookVerifier as f, webhookVerifier as h, WebhookHeaders as i, WebhookSigner as l, webhookSigner as m, WebhookAlgorithm as n, WebhookJwk as o, WebhookVerifierOptions as p, WebhookFailureCause as r, WebhookJwks as s, VerifiedWebhookMessage as t, WebhookSignerOptions as u };
|