permdock 0.3.1 → 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/{openapi-schema--ARjyfQr.js → 2020-C9VN-x8c.js} +5 -132
- package/dist/a2a/index.d.ts +8 -6
- package/dist/a2a/index.js +21 -31
- 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 -23
- package/dist/ai-sdk/index.js +38 -21
- package/dist/app-data-MuyzVqX8.js +60 -0
- 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/{approvers-DT4AVyIg.js → approvers-CqPOLD-o.js} +1 -1
- package/dist/arazzo-B6lebmiQ.js +36 -0
- package/dist/{arazzo-BAgw9ap6.js → arazzo-BWhNF-k0.js} +24 -17
- 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 +228 -75
- 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 +11 -23
- package/dist/better-supabase/index.d.ts +438 -86
- package/dist/better-supabase/index.js +1027 -184
- package/dist/bind--9EFVYWF.d.ts +38 -0
- package/dist/{bind-CuzGytRf.js → bind-CZzhx-Vj.js} +22 -10
- package/dist/body-CH5of8Ne.js +10 -0
- package/dist/body-text-QcXok_SI.js +52 -0
- package/dist/build-instance-BMnAudHn.js +52 -0
- package/dist/{canonical-json-DemiK4Vp.js → canonical-json-BC8_nMTw.js} +6 -6
- package/dist/{capability-2kYTMWDv.d.ts → capability-BSslw1QV.d.ts} +44 -25
- package/dist/{capability-4qPdO9gk.js → capability-N1K9IpqS.js} +69 -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-BECMPrwc.js +100 -0
- package/dist/catalog-DjhMYYCq.js +1 -0
- package/dist/catalog-R_A__RsH.js +52 -0
- package/dist/{catalog-doc-DdGm82XT.js → catalog-doc-C9wjsfNY.js} +54 -25
- 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 +26 -30
- package/dist/clerk/index.d.ts +9 -8
- package/dist/clerk/index.js +15 -45
- package/dist/cli/bin.js +36 -17
- package/dist/cli/index.d.ts +20 -6
- package/dist/cli/index.js +164 -4
- package/dist/cloud/index.d.ts +102 -63
- package/dist/cloud/index.js +240 -347
- package/dist/cloud-CIoHNevm.js +87 -0
- package/dist/codemod-Bmj9dWMH.js +37 -0
- package/dist/codemod-Cxvvc70T.js +2084 -0
- package/dist/{collect-DSTE3ml9.js → collect-CrZJJnEF.js} +79 -17
- package/dist/collect-DloHbDVa.js +55 -0
- package/dist/collect-FlXJlhus.js +1 -0
- package/dist/command-L8EstFNm.js +6 -0
- package/dist/{compact-y6vfu2_f.js → compact-CAf557ZB.js} +11 -1
- package/dist/compile/index.d.ts +1 -1
- package/dist/compile/index.js +1 -2
- package/dist/{compile-Ba4blROR.js → compile-CMqMx_IN.js} +13 -9
- package/dist/{compile-BkRyBDBw.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-BJiM-xAm.js → config-bs_kZeYq.js} +15 -10
- package/dist/{config-report-CdCgbRnV.js → config-report-DUgj62Ai.js} +17 -8
- package/dist/{connection-CU8MQxRi.js → connection-DjhIJSs2.js} +8 -6
- package/dist/constants-DcJABbLW.js +20 -0
- package/dist/{context-Bcy85rGi.js → context-bbFHR-0D.js} +16 -5
- package/dist/convex/index.d.ts +11 -10
- package/dist/convex/index.js +18 -18
- 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-DnrmLnLW.js +323 -0
- package/dist/{credential-8P81ff4u.js → credential-DM2um3ha.js} +153 -32
- package/dist/credentials-DPyHmYz5.js +74 -0
- package/dist/deciding-columns-Sq12mEA6.js +123 -0
- package/dist/delegation-DaXVdDhM.js +286 -0
- package/dist/delegation-input-FTxMK3ji.js +19 -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-D8jDHgsl.d.ts +19 -0
- package/dist/{describe-DMYiCjJV.d.ts → describe-BZUsixiL.d.ts} +11 -2
- package/dist/{describe-B_gVZEVi.js → describe-BybMRY7A.js} +10 -5
- package/dist/device-BARQ8eYG.js +193 -0
- package/dist/diff-CxZo9pTq.js +37 -0
- package/dist/{diff-2VaeChzX.js → diff-DCePiN6M.js} +61 -55
- package/dist/doctor-CxiwSfqH.js +44 -0
- package/dist/doctor-DFjUxf2f.js +2361 -0
- package/dist/drizzle/index.d.ts +5 -3
- package/dist/drizzle/index.js +6 -14
- package/dist/elysia/index.d.ts +16 -13
- package/dist/elysia/index.js +14 -13
- package/dist/env-DJZrPjRi.js +8 -0
- package/dist/errors-BDUwg2qC.js +27 -0
- package/dist/{errors-Cz5zn0mW.js → errors-BKy0EfhN.js} +6 -10
- package/dist/errors-BWXBMaKK.d.ts +11 -0
- package/dist/{errors-DPdqI50v.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-tz6D9A2G.js → evaluations-DZ2CbV5k.js} +181 -32
- package/dist/eve/index.d.ts +12 -16
- package/dist/eve/index.js +23 -29
- 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 +14 -12
- package/dist/fastify/index.d.ts +26 -13
- package/dist/fastify/index.js +17 -36
- 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/{files-DWUN9PzI.js → files-D_JIzUrP.js} +12 -3
- package/dist/{fixtures-ht28Cplr.js → fixtures-B7XrLeY7.js} +12 -12
- package/dist/flags-C3DktBDY.js +86 -0
- package/dist/{from-snapshot-CTLijvdm.js → from-snapshot-D2lZt4Dd.js} +78 -65
- package/dist/{generate-CH7ThJ14.js → generate-CNU1pIOo.js} +1 -3
- package/dist/grantee-Cn1HyUsI.js +254 -0
- package/dist/grantee-conditions-CcXf8hMM.js +271 -0
- package/dist/grantee-match-DHArqY82.js +142 -0
- 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-H_KARDVC.js → helpers-DTcZOzhF.js} +47 -39
- package/dist/hono/index.d.ts +12 -9
- package/dist/hono/index.js +14 -13
- package/dist/{hosted-DJQw46hn.js → hosted-BZIAYvon.js} +64 -15
- package/dist/hosted-DBDX0M-P.d.ts +78 -0
- package/dist/{http-SO7qGttf.js → http-BBoKefeS.js} +35 -2
- package/dist/{http-DPuDaChb.d.ts → http-B_LphE5Y.d.ts} +1 -2
- package/dist/http-DXJ37RDA.js +46 -0
- package/dist/{http-BIhmLfCc.js → http-ujKm0JXE.js} +3 -26
- package/dist/{openapi-import-cmwetbzw.js → import-CNV7I2Dw.js} +30 -26
- package/dist/{rls-import-4lLW_pbb.js → import-DMmOG27O.js} +271 -128
- 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-DOVf7RJv.d.ts +900 -0
- package/dist/{index-C8z4RjQV.d.ts → index-SGdIQyzc.d.ts} +34 -16
- package/dist/index.d.ts +20 -14
- package/dist/index.js +33 -23
- package/dist/init-DeMYsnYJ.js +96 -0
- package/dist/init-GG6Jh8HD.js +95 -0
- package/dist/{instance-options-jARdwfPN.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-BsAflUGW.js → json-schema-B-vAwlde.js} +46 -9
- package/dist/json-schema-CN_iLFH2.d.ts +40 -0
- package/dist/jwt/index.d.ts +18 -11
- package/dist/jwt/index.js +166 -145
- package/dist/{kernel-_RRHmnMY.js → kernel-5JatXyND.js} +120 -43
- package/dist/kysely/index.d.ts +5 -3
- package/dist/kysely/index.js +6 -14
- package/dist/{live-options-H2eG8dfJ.js → live-options-BaAFCIiu.js} +16 -3
- package/dist/load-BxEtwlBS.js +1 -0
- package/dist/{load-DhWEB9P1.js → load-DFS_ry0W.js} +31 -7
- 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-Z4QZOiFF.js → map-claims-D3oRmTk0.js} +19 -25
- package/dist/{map-error-pgUWNNtG.js → map-error-TCAdw-eW.js} +5 -5
- package/dist/{markers-B0hYLvMD.js → markers-C6joDI3o.js} +8 -3
- package/dist/mcp/index.d.ts +36 -9
- package/dist/mcp/index.js +476 -448
- package/dist/{rls-migrate-CN4TlJTO.js → migrate-BShP7Vf4.js} +119 -20
- package/dist/nest/index.d.ts +12 -9
- package/dist/nest/index.js +20 -20
- package/dist/next/index.d.ts +40 -20
- package/dist/next/index.js +37 -39
- 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-BFp-PZZA.js +126 -0
- package/dist/openai/index.d.ts +9 -16
- package/dist/openai/index.js +18 -25
- package/dist/openapi/index.d.ts +3 -3
- package/dist/openapi/index.js +1 -1
- package/dist/{openapi-BqRBvAng.js → openapi-B7HZ0f-r.js} +9 -12
- package/dist/{openapi-CqqEbHsL.js → openapi-DTaEmTSW.js} +23 -26
- 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 +23 -20
- package/dist/otel/index.d.ts +3 -2
- package/dist/otel/index.js +53 -27
- package/dist/output-Dyw8fyPF.js +88 -0
- package/dist/output-files-B3IZJksC.js +1 -0
- package/dist/output-files-DhRBBE4n.js +138 -0
- package/dist/{rls-fields-CZOMlwHl.js → ownership-BatFgAA4.js} +2393 -2349
- package/dist/{package-root-zGkxO3oN.js → package-root-Dk_ETdkp.js} +4 -3
- package/dist/{parse-BuyjxhZV.js → parse-Cxq0WxrA.js} +3 -3
- package/dist/{parse-local-manifest-BrMozJCo.js → parse-local-manifest-CVSs6J9I.js} +2 -4
- package/dist/{parse-local-manifest-JLnaBH0S.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 +47 -29
- 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-Br4jSNVi.js +385 -0
- package/dist/permissions-B-wCP5ZC.js +30 -0
- package/dist/{permissions-RJrovw98.js → permissions-CZKiUfFM.js} +4 -3
- package/dist/{permissions-CDgvKG5L.d.ts → permissions-oEWfl-kl.d.ts} +1 -2
- package/dist/policies-CO1oOymN.js +295 -0
- package/dist/{policy-D2W7uv19.d.ts → policy-Czo4n3Hs.d.ts} +2 -2
- package/dist/policy-DLZJ5gAp.js +399 -0
- package/dist/policy-from-catalog-DzhEc3Y9.js +450 -0
- package/dist/policy-module-CTlwMvLI.js +89 -0
- package/dist/{policy-IB6yxpC3.d.ts → policy-types-DzwivBgR.d.ts} +939 -1057
- 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-Dv1_aWF7.js → powersync-bYUDLOAO.js} +30 -32
- 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 +6 -12
- package/dist/{problem-B43ztKIm.js → problem-CTviyH5L.js} +18 -27
- package/dist/{problem-details-DX075l9V.d.ts → problem-details-DXlt-vks.d.ts} +1 -1
- package/dist/{problem-details-_AMOYz-w.js → problem-details-cn5X30gZ.js} +45 -42
- package/dist/problem-types-CJ2325SZ.js +5 -0
- package/dist/{prompt-CXYhLfsS.js → prompt-DfZLJLIn.js} +2 -2
- package/dist/protected-DEPHc2xV.d.ts +38 -0
- package/dist/{protected-utU-SLuy.js → protected-DfjY5mLA.js} +37 -8
- package/dist/{provider-CSQd7m92.js → provider-CC-u3bYP.js} +23 -10
- package/dist/{provider-DZY281jO.d.ts → provider-DMVt6yYn.d.ts} +1 -1
- package/dist/{provider-store-Cfbvo4DE.js → provider-store-B5Yrkhzr.js} +6 -3
- 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 -63
- package/dist/react-native/index.js +45 -27
- package/dist/{refs-KYb4ntaz.js → refs-K6eWUJ0H.js} +1 -1
- package/dist/relation-walk-3OyDBF0S.js +186 -0
- package/dist/relations-BnCWnJGI.js +163 -0
- package/dist/renames-CGj7YwcQ.js +175 -0
- package/dist/{replay-CYyiLiwO.d.ts → replay-D7iKcLFe.d.ts} +1 -1
- package/dist/{replay-BsOyTrdV.js → replay-Du1tJjG7.js} +2 -1
- package/dist/request-context-BTRTG7OT.js +71 -0
- package/dist/request-context-C2_1lchh.d.ts +5 -0
- 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-D_jw0BFx.js +243 -0
- package/dist/retire-CALjIQ7e.js +240 -0
- package/dist/{revocations-Cy06JNx2.d.ts → revocations-R07lFBnX.d.ts} +2 -0
- package/dist/rls-BA8an5Ap.js +336 -0
- package/dist/{rls-DiinlRML.js → rls-j6t43t7n.js} +1066 -1068
- package/dist/role-builder-CXbis5-X.js +623 -0
- package/dist/{rpc-DL9Sqvb1.js → rpc-aPyNi6tA.js} +18 -8
- 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-CB8gQFvS.js → runtime-D3VTAiCA.js} +1 -1
- package/dist/{saas-DhpJjnBA.js → saas-FO-Q8oj0.js} +18 -15
- package/dist/scan-BOI5tJ-6.js +29 -0
- package/dist/{schema-D3MnDMxa.js → schema-B4v0Qrac.js} +106 -10
- 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-BFGBBAqR.js → scim-ClHtpyV3.js} +213 -87
- package/dist/{scopes-CVdPrWN-.js → scopes-CUPSjo9q.js} +20 -7
- package/dist/server/index.d.ts +13 -134
- package/dist/server/index.js +13 -10
- package/dist/server-DqCT4CgZ.js +453 -0
- package/dist/{create-B1d519XK.d.ts → server-types-BLd4MnBX.d.ts} +89 -70
- package/dist/{sha256-BO0swRXL.js → sha256-D9ihqmvd.js} +8 -1
- package/dist/shared-CD11nBbC.js +304 -0
- package/dist/{shared-DRu8VFVM.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-Biq5uup3.js → skills-B6lVdD_W.js} +16 -8
- package/dist/skills-CTYwkl44.js +51 -0
- package/dist/snapshot-CXUWfsNy.js +269 -0
- package/dist/{snapshot-cache-D6jLelln.js → snapshot-cache-DZHQ0KF6.js} +11 -5
- package/dist/{snapshot-cache-B-LxUahj.d.ts → snapshot-cache-DqK9eDmM.d.ts} +7 -5
- package/dist/solid/index.d.ts +24 -25
- package/dist/solid/index.js +41 -11
- package/dist/solid-start/index.d.ts +52 -0
- package/dist/solid-start/index.js +49 -0
- package/dist/{sources-BdOYLw9j.d.ts → sources-BV9j0DeZ.d.ts} +11 -13
- package/dist/{sources-4p0-4xQm.js → sources-vs5dGOsS.js} +147 -142
- package/dist/sql-B5T1IL83.js +55 -0
- package/dist/src-DLfUWFAI.js +1851 -0
- package/dist/ssf/index.d.ts +4 -4
- package/dist/ssf/index.js +440 -106
- 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-DMAWwAJV.js → store-4u_hxjWa.js} +42 -55
- package/dist/{store-options-ByhZq1jV.js → store-options-BqEakYRa.js} +38 -24
- package/dist/{stores-BT2pSCub.js → stores-BbsD4fAR.js} +7 -3
- package/dist/stores-ClZUgeoP.d.ts +30 -0
- package/dist/{stream-D1RXubw2.d.ts → stream-7-xmnf3U.d.ts} +2 -2
- package/dist/{stream-DDpvynSB.js → stream-CvdUS9V1.js} +10 -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/{subject-settings-BwBmCdTR.js → subject-settings-CkEwrw3W.js} +23 -5
- package/dist/supabase/index.d.ts +23 -106
- package/dist/supabase/index.js +5 -4
- package/dist/supabase/middleware.d.ts +13 -6
- package/dist/supabase/middleware.js +16 -11
- package/dist/supabase-9pqI57pW.js +92 -0
- package/dist/{supabase-C0qESOa-.js → supabase-Dxlp8A94.js} +124 -247
- package/dist/supabase-hook-CXcGpHqq.js +1 -0
- package/dist/{supabase-hook-ntETYCQu.js → supabase-hook-DdDQhMlw.js} +1659 -819
- package/dist/{supautils-u8jXTGrt.js → supautils-B6HYL9eL.js} +2 -2
- package/dist/support-session-C6xJQYut.js +158 -0
- package/dist/svelte/Protected.svelte +11 -4
- package/dist/svelte/index.d.ts +7 -7
- package/dist/svelte/index.js +26 -12
- package/dist/svelte/runtime.d.ts +10 -3
- package/dist/svelte/runtime.js +4 -3
- package/dist/svelte/source.d.ts +7 -7
- package/dist/svelte/source.js +5 -5
- 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/{validity-uOp8UpYn.js → tenancy-DN2QAx9z.js} +6 -42
- package/dist/terminal/index.d.ts +11 -9
- package/dist/terminal/index.js +36 -316
- package/dist/testing/index.d.ts +391 -106
- package/dist/testing/index.js +4574 -1286
- 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-CIWxJOCh.js → token-BLZcjQgt.js} +15 -6
- package/dist/tool-refusal-CMLN5xhn.js +41 -0
- package/dist/trpc/index.d.ts +12 -9
- package/dist/trpc/index.js +18 -17
- package/dist/{types-DbjRN55U.d.ts → types-5Ut_pbKy.d.ts} +141 -13
- package/dist/types-BNORmDM8.d.ts +172 -0
- package/dist/types-BjV-fqcA.d.ts +57 -0
- package/dist/{types-QCuYJh4q.d.ts → types-BqAKcRNW.d.ts} +2 -1
- package/dist/types-C8-KNsFf.d.ts +107 -0
- package/dist/{types-aqOHTHcp.d.ts → types-CCpc2Dcv.d.ts} +77 -17
- package/dist/{types-Dnemwd77.d.ts → types-CZTnPFzM.d.ts} +50 -11
- package/dist/{types-C97IskBw.d.ts → types-CdlxsYQh.d.ts} +23 -11
- package/dist/{types-DxiCGmmd.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-fbZ7JEXr.d.ts +89 -0
- package/dist/types-tIgIeIKJ.d.ts +66 -0
- 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-ItS7nLcl.js → usage-T5mXq98v.js} +56 -13
- package/dist/{validation-error-Ba264OaJ.d.ts → validation-error-Bg5Tpluk.d.ts} +1 -1
- package/dist/{validation-error-CnjZ4t92.js → validation-error-ZfUHbKvf.js} +1 -1
- package/dist/validity-CZ7-y0Cj.js +79 -0
- package/dist/{verifier-BxBo6I44.js → verifier-DHuh-okk.js} +68 -21
- package/dist/verify-DbCL9bnB.js +1770 -0
- package/dist/{version-BvacVTZR.js → version-CEbQ5UeM.js} +4 -3
- package/dist/version-DXkYUISx.js +1 -0
- package/dist/{views-Soe7bGSC.js → views-DTIIO-oQ.js} +41 -2
- package/dist/{permissions-DttnqqxC.d.ts → vocabulary-D6lPdb4Z.d.ts} +120 -29
- package/dist/vue/index.d.ts +25 -21
- package/dist/vue/index.js +25 -9
- 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-DVBJ9cBq.js → watch-CszoTJMq.js} +47 -8
- package/dist/webmcp/index.d.ts +2 -2
- package/dist/webmcp/index.js +13 -37
- 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-Bd1Tejur.d.ts +15 -0
- package/dist/wrap-gX61EtpB.js +27 -0
- package/package.json +140 -41
- 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 +129 -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 +19 -10
- package/skills/permdock-data/SKILL.md +6 -6
- package/skills/permdock-data/references/queries-and-rls.md +13 -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 +6 -4
- package/skills/permdock-wire/SKILL.md +18 -12
- package/skills/permdock-wire/references/adapters.md +146 -50
- package/skills/permdock-wire/references/policy-options.md +15 -6
- package/skills/permdock-wire/references/presets-and-recipes.md +58 -0
- package/dist/approvals-DbYAuNkG.js +0 -224
- package/dist/arazzo-C9chp3ST.js +0 -54
- package/dist/bind-C_ob3LKa.d.ts +0 -25
- package/dist/catalog-CRW5Mx_B.js +0 -2
- package/dist/catalog-CYj-mX2O.js +0 -48
- package/dist/catalog-DWF5cYqB.js +0 -55
- package/dist/cloud-CfwZ39Rl.js +0 -50
- package/dist/cloud-DWLXO2af.js +0 -118
- package/dist/collect-CHB22Sx4.js +0 -83
- package/dist/collect-DSWOk19R.js +0 -2
- package/dist/commands-BeaGNj_o.js +0 -97
- package/dist/config-ir40y8m0.js +0 -36
- package/dist/create-CMwIl-w2.js +0 -253
- package/dist/delegation-D8pUEuce.js +0 -103
- package/dist/diff-C9RDjjhs.js +0 -48
- package/dist/doctor-Djh6JDEk.js +0 -53
- package/dist/doctor-DvH0IQff.js +0 -1194
- package/dist/doctor-collect-CjdO0wQX.js +0 -665
- package/dist/duration-xK2jGFVc.js +0 -25
- package/dist/errors-CWfoNg9N.js +0 -47
- package/dist/errors-DRnGZHzF.js +0 -30
- package/dist/evaluation-items-CfCCejQd.js +0 -40
- package/dist/expiry-BoBJ8Tvc.js +0 -7
- package/dist/fields-BMl1RxoX.js +0 -26
- package/dist/grantee-Cv5Sogfv.js +0 -602
- 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-0nNqHspG.d.ts +0 -6
- package/dist/index-BNc7Wer_.d.ts +0 -483
- package/dist/index-C7Tw7MaW.d.ts +0 -201
- package/dist/instance-options-Dhhcnm3y.js +0 -22
- package/dist/load-DwJUafYN.js +0 -2
- package/dist/manifest-iaoBXHKc.js +0 -783
- package/dist/map-AcxK9o_D.js +0 -147
- package/dist/may-use-DndQ5tQ-.js +0 -77
- package/dist/openapi-CQTsgKoB.js +0 -164
- package/dist/permdock-CbgvLnuo.js +0 -3479
- package/dist/permissions-DVoF6dMt.js +0 -662
- package/dist/policy-xyWg7QdR.js +0 -1122
- package/dist/powersync-CrBX8hY6.js +0 -2
- package/dist/powersync-DE19b9dT.js +0 -62
- package/dist/protected-BdnIEFkY.d.ts +0 -27
- package/dist/protected-xAr24FEC.d.ts +0 -40
- package/dist/relations-cjOL01hZ.js +0 -505
- package/dist/rls-P-BeBx0n.js +0 -238
- package/dist/rls-graph-CHwx0V8q.js +0 -435
- package/dist/rls-ownership-DcYlZ09B.js +0 -843
- package/dist/rls-shared-Cewd_-zI.js +0 -495
- package/dist/rls-verify-CMv9H3wV.js +0 -746
- package/dist/run-BWc9qqvE.js +0 -174
- package/dist/server-DlZ28Oz5.js +0 -268
- package/dist/sink-B1fZzIMf.d.ts +0 -104
- package/dist/sink-Bd9PSyfq.js +0 -141
- package/dist/skills-C5CbhhpG.js +0 -56
- package/dist/snapshot-Enxd0n-s.js +0 -975
- package/dist/sql-xdg5f4Fi.js +0 -27
- package/dist/src-BDwEZWrZ.js +0 -568
- package/dist/store-jOBYpiXC.d.ts +0 -36
- package/dist/stores-C0IMQrGI.d.ts +0 -52
- package/dist/subject-C6dLxqHU.js +0 -24
- package/dist/supabase-config-Bj3iDH2I.js +0 -472
- package/dist/supabase-hook-gd3s8bxB.js +0 -2
- package/dist/supabase-s4o9s1O1.js +0 -83
- package/dist/thenable-okc2xDsj.js +0 -10
- package/dist/types-BnIEz1sU.d.ts +0 -48
- package/dist/types-Bvc4oWT6.d.ts +0 -9
- package/dist/types-CKNSyIf_.d.ts +0 -52
- package/dist/types-Cq_H8N_X.d.ts +0 -197
- package/dist/usage-B0YuTQRO.js +0 -42
- package/dist/usage-DorAJiU_.js +0 -2
- package/dist/vocabulary-DA8a8zif.d.ts +0 -56
- package/dist/watch-BwxLTYMZ.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,66 +1,10 @@
|
|
|
1
|
-
import { t as compact } from "../compact-
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { t as
|
|
1
|
+
import { r as isRecord, t as compact } from "../compact-CAf557ZB.js";
|
|
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
|
-
//#region src/ssf/wire.ts
|
|
7
|
-
const SET_TYP = "secevent+jwt";
|
|
8
|
-
const LOGOUT_TYP = "logout+jwt";
|
|
9
|
-
function jsonResponse(status, body) {
|
|
10
|
-
return new Response(JSON.stringify(body), {
|
|
11
|
-
status,
|
|
12
|
-
headers: { "content-type": "application/json" }
|
|
13
|
-
});
|
|
14
|
-
}
|
|
15
|
-
function rfc8935(status, err, description) {
|
|
16
|
-
return jsonResponse(status, {
|
|
17
|
-
err,
|
|
18
|
-
description
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
function errForCause(cause) {
|
|
22
|
-
switch (cause) {
|
|
23
|
-
case "invalid-signature":
|
|
24
|
-
case "unknown-kid":
|
|
25
|
-
case "alg-not-allowed":
|
|
26
|
-
case "alg-none": return "invalid_key";
|
|
27
|
-
case "wrong-issuer": return "invalid_issuer";
|
|
28
|
-
case "wrong-audience": return "invalid_audience";
|
|
29
|
-
case "expired":
|
|
30
|
-
case "not-yet-valid":
|
|
31
|
-
case "wrong-token-type":
|
|
32
|
-
case "malformed":
|
|
33
|
-
case "encrypted-token":
|
|
34
|
-
case "dpop-proof-invalid":
|
|
35
|
-
case "mtls-binding-mismatch":
|
|
36
|
-
case "sender-constraint-required":
|
|
37
|
-
case "token-in-query":
|
|
38
|
-
case "invalid-claims":
|
|
39
|
-
case "invalid-chain":
|
|
40
|
-
case "jwks-unavailable":
|
|
41
|
-
case "discovery-unavailable":
|
|
42
|
-
case "discovery-mismatch": return "invalid_request";
|
|
43
|
-
default: return cause;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
function isRecord(value) {
|
|
47
|
-
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
48
|
-
}
|
|
49
|
-
function contentType(request) {
|
|
50
|
-
return (request.headers.get("content-type") ?? "").split(";", 1)[0]?.trim().toLowerCase() ?? "";
|
|
51
|
-
}
|
|
52
|
-
function parseEvery(every) {
|
|
53
|
-
if (typeof every === "number") {
|
|
54
|
-
if (!Number.isFinite(every) || every <= 0) throw new TypeError("PermDock: poll every must be a positive interval.");
|
|
55
|
-
return every;
|
|
56
|
-
}
|
|
57
|
-
const match = /^(\d+)(ms|s|m)$/u.exec(every);
|
|
58
|
-
if (match?.[2] === void 0) throw new TypeError(`PermDock: invalid poll interval '${every}'.`);
|
|
59
|
-
const unit = match[2];
|
|
60
|
-
const scale = unit === "ms" ? 1 : unit === "s" ? 1e3 : 6e4;
|
|
61
|
-
return Number(match[1]) * scale;
|
|
62
|
-
}
|
|
63
|
-
//#endregion
|
|
64
8
|
//#region src/ssf/claims.ts
|
|
65
9
|
function asSubject(mapped, session, issuer) {
|
|
66
10
|
if (typeof mapped === "string") return compact({
|
|
@@ -104,18 +48,39 @@ function subjectSession(subject) {
|
|
|
104
48
|
//#endregion
|
|
105
49
|
//#region src/ssf/events.ts
|
|
106
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";
|
|
107
53
|
const CAEP_PREFIX = "https://schemas.openid.net/secevent/caep/event-type/";
|
|
108
|
-
const
|
|
54
|
+
const RISC_PREFIX = "https://schemas.openid.net/secevent/risc/event-type/";
|
|
55
|
+
const CAEP_NAMES = [
|
|
109
56
|
"session-revoked",
|
|
110
57
|
"credential-change",
|
|
111
58
|
"assurance-level-change",
|
|
112
59
|
"token-claims-change",
|
|
113
|
-
"device-compliance-change"
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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);
|
|
119
84
|
}
|
|
120
85
|
//#endregion
|
|
121
86
|
//#region src/ssf/poll.ts
|
|
@@ -180,18 +145,84 @@ async function pollOnce(input) {
|
|
|
180
145
|
return processed;
|
|
181
146
|
}
|
|
182
147
|
//#endregion
|
|
148
|
+
//#region src/ssf/wire.ts
|
|
149
|
+
const SET_TYP = "secevent+jwt";
|
|
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
|
+
};
|
|
158
|
+
function jsonResponse(status, body) {
|
|
159
|
+
return new Response(JSON.stringify(body), {
|
|
160
|
+
status,
|
|
161
|
+
headers: { "content-type": "application/json" }
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
function rfc8935(status, err, description) {
|
|
165
|
+
return jsonResponse(status, {
|
|
166
|
+
err,
|
|
167
|
+
description
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
function errForCause(cause) {
|
|
171
|
+
switch (cause) {
|
|
172
|
+
case "invalid-signature":
|
|
173
|
+
case "unknown-kid":
|
|
174
|
+
case "alg-not-allowed":
|
|
175
|
+
case "alg-none": return "invalid_key";
|
|
176
|
+
case "wrong-issuer": return "invalid_issuer";
|
|
177
|
+
case "wrong-audience": return "invalid_audience";
|
|
178
|
+
case "expired":
|
|
179
|
+
case "not-yet-valid":
|
|
180
|
+
case "wrong-token-type":
|
|
181
|
+
case "malformed":
|
|
182
|
+
case "encrypted-token":
|
|
183
|
+
case "dpop-proof-invalid":
|
|
184
|
+
case "mtls-binding-mismatch":
|
|
185
|
+
case "sender-constraint-required":
|
|
186
|
+
case "token-in-query":
|
|
187
|
+
case "invalid-claims":
|
|
188
|
+
case "invalid-chain":
|
|
189
|
+
case "jwks-unavailable":
|
|
190
|
+
case "discovery-unavailable":
|
|
191
|
+
case "discovery-mismatch": return "invalid_request";
|
|
192
|
+
default: return cause;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
function contentType(request) {
|
|
196
|
+
return (request.headers.get("content-type") ?? "").split(";", 1)[0]?.trim().toLowerCase() ?? "";
|
|
197
|
+
}
|
|
198
|
+
function parseEvery(every) {
|
|
199
|
+
if (typeof every === "number") {
|
|
200
|
+
if (!Number.isFinite(every) || every <= 0) throw new TypeError("PermDock: poll every must be a positive interval.");
|
|
201
|
+
return every;
|
|
202
|
+
}
|
|
203
|
+
const match = /^(\d+)(ms|s|m)$/u.exec(every);
|
|
204
|
+
if (match?.[2] === void 0) throw new TypeError(`PermDock: invalid poll interval '${every}'.`);
|
|
205
|
+
const unit = match[2];
|
|
206
|
+
const scale = unit === "ms" ? 1 : unit === "s" ? 1e3 : 6e4;
|
|
207
|
+
return Number(match[1]) * scale;
|
|
208
|
+
}
|
|
209
|
+
//#endregion
|
|
183
210
|
//#region src/ssf/receiver.ts
|
|
211
|
+
/** Seconds a SET without `exp` stays acceptable after its `iat`. */
|
|
212
|
+
const DEFAULT_SET_MAX_AGE = 86400;
|
|
184
213
|
const CHANGED_EVENTS = /* @__PURE__ */ new Set([
|
|
185
214
|
"credential-change",
|
|
186
215
|
"assurance-level-change",
|
|
187
216
|
"token-claims-change"
|
|
188
217
|
]);
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
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;
|
|
195
226
|
}
|
|
196
227
|
function replayKey(issuer, jti, event) {
|
|
197
228
|
return JSON.stringify(event === void 0 ? [issuer ?? null, jti] : [
|
|
@@ -231,6 +262,12 @@ function createReceiver(config) {
|
|
|
231
262
|
description: "missing iat",
|
|
232
263
|
cause: "invalid-claims"
|
|
233
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
|
+
};
|
|
234
271
|
return result;
|
|
235
272
|
}
|
|
236
273
|
async function resolveSubject(setSubject, session, issuer) {
|
|
@@ -259,21 +296,23 @@ function createReceiver(config) {
|
|
|
259
296
|
async function publishRevocation(input) {
|
|
260
297
|
const feed = config.revocations;
|
|
261
298
|
if (feed === void 0) return;
|
|
262
|
-
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;
|
|
263
301
|
if (kind === void 0) return;
|
|
264
302
|
try {
|
|
265
303
|
await feed.revoke(compact({
|
|
266
304
|
principal: input.subject.id,
|
|
267
|
-
session: kind === "session-revoked" ? input.subject.session : void 0,
|
|
305
|
+
session: kind === "session-revoked" && !account ? input.subject.session : void 0,
|
|
268
306
|
kind
|
|
269
307
|
}));
|
|
270
308
|
} catch {}
|
|
271
309
|
}
|
|
272
310
|
async function cancelSessionApprovals(input) {
|
|
273
|
-
|
|
311
|
+
const account = revokesAccount(input.type);
|
|
312
|
+
if (config.approvals === void 0 || input.type !== "session-revoked" && !account) return;
|
|
274
313
|
const count = await cancelApprovals(config.approvals, compact({
|
|
275
314
|
principalId: input.subject.id,
|
|
276
|
-
session: input.subject.session
|
|
315
|
+
session: account ? void 0 : input.subject.session
|
|
277
316
|
}), {
|
|
278
317
|
by: "ssf",
|
|
279
318
|
note: input.jti
|
|
@@ -286,7 +325,7 @@ function createReceiver(config) {
|
|
|
286
325
|
});
|
|
287
326
|
}
|
|
288
327
|
async function dispatch(type, input) {
|
|
289
|
-
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;
|
|
290
329
|
const wildcard = config.onEvent["*"];
|
|
291
330
|
const handler = named ?? wildcard;
|
|
292
331
|
if (handler === void 0) {
|
|
@@ -304,11 +343,7 @@ function createReceiver(config) {
|
|
|
304
343
|
try {
|
|
305
344
|
await handler(input);
|
|
306
345
|
} catch {
|
|
307
|
-
return
|
|
308
|
-
ok: false,
|
|
309
|
-
err: "invalid_request",
|
|
310
|
-
description: "handler failed"
|
|
311
|
-
};
|
|
346
|
+
return HANDLER_FAILED;
|
|
312
347
|
}
|
|
313
348
|
emit({
|
|
314
349
|
type,
|
|
@@ -320,6 +355,25 @@ function createReceiver(config) {
|
|
|
320
355
|
await cancelSessionApprovals(input);
|
|
321
356
|
return { ok: true };
|
|
322
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
|
+
}
|
|
323
377
|
async function dispatchEvents(entries, run) {
|
|
324
378
|
const [head, ...tail] = entries;
|
|
325
379
|
if (head === void 0) return { ok: true };
|
|
@@ -328,8 +382,14 @@ function createReceiver(config) {
|
|
|
328
382
|
const eventKey = replayKey(issuer, jti, uri);
|
|
329
383
|
if (run.perEvent && await config.replay.seen(eventKey)) return dispatchEvents(tail, run);
|
|
330
384
|
const payload = isRecord(raw) ? raw : {};
|
|
331
|
-
|
|
332
|
-
|
|
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) {
|
|
333
393
|
emit({
|
|
334
394
|
type,
|
|
335
395
|
transmitter: issuer,
|
|
@@ -383,7 +443,7 @@ function createReceiver(config) {
|
|
|
383
443
|
cause: "invalid-claims"
|
|
384
444
|
};
|
|
385
445
|
const key = replayKey(issuer, jti);
|
|
386
|
-
const expiresAt = replayExpiresAt(verified.claims, config.clockTolerance);
|
|
446
|
+
const expiresAt = replayExpiresAt(verified.claims, config.clockTolerance, config.maxTokenAge);
|
|
387
447
|
if (!await claimDelivery(key, expiresAt)) {
|
|
388
448
|
emit({
|
|
389
449
|
type: "replay",
|
|
@@ -394,11 +454,7 @@ function createReceiver(config) {
|
|
|
394
454
|
return { ok: true };
|
|
395
455
|
}
|
|
396
456
|
const entries = Object.entries(events);
|
|
397
|
-
let dispatched =
|
|
398
|
-
ok: false,
|
|
399
|
-
err: "invalid_request",
|
|
400
|
-
description: "handler failed"
|
|
401
|
-
};
|
|
457
|
+
let dispatched = HANDLER_FAILED;
|
|
402
458
|
try {
|
|
403
459
|
dispatched = await dispatchEvents(entries, {
|
|
404
460
|
issuer,
|
|
@@ -450,7 +506,7 @@ function createReceiver(config) {
|
|
|
450
506
|
const jti = verified.claims["jti"];
|
|
451
507
|
const issuer = typeof verified.claims.iss === "string" ? verified.claims.iss : void 0;
|
|
452
508
|
const key = replayKey(issuer, jti);
|
|
453
|
-
const expiresAt = replayExpiresAt(verified.claims, config.clockTolerance);
|
|
509
|
+
const expiresAt = replayExpiresAt(verified.claims, config.clockTolerance, config.maxTokenAge);
|
|
454
510
|
if (!await claimDelivery(key, expiresAt)) {
|
|
455
511
|
emit({
|
|
456
512
|
type: "replay",
|
|
@@ -460,11 +516,7 @@ function createReceiver(config) {
|
|
|
460
516
|
});
|
|
461
517
|
return { ok: true };
|
|
462
518
|
}
|
|
463
|
-
let dispatched =
|
|
464
|
-
ok: false,
|
|
465
|
-
err: "invalid_request",
|
|
466
|
-
description: "handler failed"
|
|
467
|
-
};
|
|
519
|
+
let dispatched = HANDLER_FAILED;
|
|
468
520
|
try {
|
|
469
521
|
dispatched = await dispatchLogout(verified.claims, {
|
|
470
522
|
issuer,
|
|
@@ -508,20 +560,28 @@ function createReceiver(config) {
|
|
|
508
560
|
}
|
|
509
561
|
return {
|
|
510
562
|
async push(request) {
|
|
511
|
-
if (request.method !== "POST") return
|
|
563
|
+
if (request.method !== "POST") return new Response(null, {
|
|
564
|
+
status: 405,
|
|
565
|
+
headers: { allow: "POST" }
|
|
566
|
+
});
|
|
512
567
|
if (contentType(request) !== "application/secevent+jwt") return rfc8935(400, "invalid_request", "application/secevent+jwt required");
|
|
513
|
-
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();
|
|
514
571
|
if (token.length === 0) return rfc8935(400, "invalid_request", "empty body");
|
|
515
572
|
const result = await ingestSet(token);
|
|
516
|
-
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);
|
|
517
574
|
return new Response(null, { status: 202 });
|
|
518
575
|
},
|
|
519
576
|
async logout(request) {
|
|
520
577
|
if (request.method !== "POST") return jsonResponse(400, { error: "invalid_request" });
|
|
521
578
|
if (contentType(request) !== "application/x-www-form-urlencoded") return jsonResponse(400, { error: "invalid_request" });
|
|
522
|
-
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");
|
|
523
582
|
if (token === null || token.length === 0) return jsonResponse(400, { error: "invalid_request" });
|
|
524
|
-
|
|
583
|
+
const result = await ingestLogout(token);
|
|
584
|
+
if (!result.ok) return result.retry === true ? new Response(null, { status: 500 }) : jsonResponse(400, { error: "invalid_request" });
|
|
525
585
|
return new Response(null, { status: 200 });
|
|
526
586
|
},
|
|
527
587
|
poll(options) {
|
|
@@ -589,8 +649,282 @@ function createPermDock(policy, options) {
|
|
|
589
649
|
replay: options.replay ?? memoryReplayStore(),
|
|
590
650
|
approvals: options.approvals,
|
|
591
651
|
revocations: options.revocations,
|
|
592
|
-
clockTolerance: options.clockTolerance
|
|
652
|
+
clockTolerance: options.clockTolerance,
|
|
653
|
+
maxTokenAge: options.maxTokenAge
|
|
593
654
|
})) };
|
|
594
655
|
}
|
|
595
656
|
//#endregion
|
|
596
|
-
|
|
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 };
|