@_mustachio/openauth 0.9.2 → 0.11.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/dist/esm/adapters/d1/audit-log.js +15 -0
- package/dist/esm/adapters/d1/config-store.js +45 -0
- package/dist/esm/adapters/d1/index.js +12 -0
- package/dist/esm/adapters/d1/key-store.js +116 -0
- package/dist/esm/adapters/d1/method-store.js +52 -0
- package/dist/esm/adapters/d1/migrations.js +77 -0
- package/dist/esm/adapters/d1/session-store.js +134 -0
- package/dist/esm/adapters/d1/session.js +18 -0
- package/dist/esm/adapters/d1/token-store.js +140 -0
- package/dist/esm/adapters/durable-object/index.js +3 -0
- package/dist/esm/adapters/durable-object/session-store.js +139 -0
- package/dist/esm/adapters/durable-object/types.js +0 -0
- package/dist/esm/adapters/dynamo/audit-log.js +23 -0
- package/dist/esm/adapters/dynamo/client.js +0 -0
- package/dist/esm/adapters/dynamo/config-store.js +57 -0
- package/dist/esm/adapters/dynamo/index.js +10 -0
- package/dist/esm/adapters/dynamo/key-store.js +188 -0
- package/dist/esm/adapters/dynamo/method-store.js +72 -0
- package/dist/esm/adapters/dynamo/passkey-credential-store.js +83 -0
- package/dist/esm/adapters/dynamo/sdk.js +128 -0
- package/dist/esm/adapters/dynamo/session-store.js +173 -0
- package/dist/esm/adapters/dynamo/token-store.js +178 -0
- package/dist/esm/adapters/kms/in-memory-backing.js +28 -0
- package/dist/esm/adapters/kms/index.js +5 -0
- package/dist/esm/adapters/kms/key-store.js +129 -0
- package/dist/esm/adapters/kms/sdk.js +23 -0
- package/dist/esm/adapters/kms/types.js +0 -0
- package/dist/esm/adapters/kv/audit-log.js +21 -0
- package/dist/esm/adapters/kv/config-store.js +43 -0
- package/dist/esm/adapters/kv/index.js +5 -0
- package/dist/esm/adapters/kv/method-store.js +63 -0
- package/dist/esm/adapters/kv/types.js +0 -0
- package/dist/esm/adapters/memory/audit-log.js +16 -0
- package/dist/esm/adapters/memory/clock.js +5 -0
- package/dist/esm/adapters/memory/config-store.js +31 -0
- package/dist/esm/adapters/memory/index.js +10 -0
- package/dist/esm/adapters/memory/key-store.js +78 -0
- package/dist/esm/adapters/memory/method-store.js +43 -0
- package/dist/esm/adapters/memory/passkey-credential-store.js +53 -0
- package/dist/esm/adapters/memory/session-store.js +104 -0
- package/dist/esm/adapters/memory/token-store.js +104 -0
- package/dist/esm/adapters/postgres/audit-log.js +16 -0
- package/dist/esm/adapters/postgres/config-store.js +48 -0
- package/dist/esm/adapters/postgres/executor.js +21 -0
- package/dist/esm/adapters/postgres/index.js +13 -0
- package/dist/esm/adapters/postgres/key-store.js +191 -0
- package/dist/esm/adapters/postgres/method-store.js +61 -0
- package/dist/esm/adapters/postgres/migrations.js +111 -0
- package/dist/esm/adapters/postgres/passkey-credential-store.js +80 -0
- package/dist/esm/adapters/postgres/session-store.js +135 -0
- package/dist/esm/adapters/postgres/token-store.js +151 -0
- package/dist/esm/client.js +35 -12
- package/dist/esm/domain/audit.js +13 -0
- package/dist/esm/domain/authorize.js +217 -0
- package/dist/esm/domain/callback.js +176 -0
- package/dist/esm/domain/client-auth.js +61 -0
- package/dist/esm/domain/client-credentials.js +91 -0
- package/dist/esm/domain/crypto.js +97 -0
- package/dist/esm/domain/discovery.js +83 -0
- package/dist/esm/domain/dpop.js +122 -0
- package/dist/esm/domain/id-token.js +94 -0
- package/dist/esm/domain/introspect.js +55 -0
- package/dist/esm/domain/jwt.js +71 -0
- package/dist/esm/domain/logout.js +75 -0
- package/dist/esm/domain/method-cache.js +136 -0
- package/dist/esm/domain/method-dispatch.js +36 -0
- package/dist/esm/domain/method-route.js +111 -0
- package/dist/esm/domain/par.js +51 -0
- package/dist/esm/domain/pkce.js +16 -0
- package/dist/esm/domain/refresh.js +102 -0
- package/dist/esm/domain/register.js +74 -0
- package/dist/esm/domain/revoke.js +81 -0
- package/dist/esm/domain/state-envelope.js +80 -0
- package/dist/esm/domain/token-exchange.js +102 -0
- package/dist/esm/domain/token.js +246 -0
- package/dist/esm/domain/userinfo.js +62 -0
- package/dist/esm/http/context.js +7 -0
- package/dist/esm/http/cookies.js +98 -0
- package/dist/esm/http/errors.js +71 -0
- package/dist/esm/http/handlers/authorize.js +250 -0
- package/dist/esm/http/handlers/callback.js +53 -0
- package/dist/esm/http/handlers/end-session.js +64 -0
- package/dist/esm/http/handlers/metadata.js +37 -0
- package/dist/esm/http/handlers/method-route.js +87 -0
- package/dist/esm/http/handlers/par.js +53 -0
- package/dist/esm/http/handlers/register.js +46 -0
- package/dist/esm/http/handlers/revocation.js +98 -0
- package/dist/esm/http/handlers/token.js +197 -0
- package/dist/esm/http/handlers/userinfo.js +60 -0
- package/dist/esm/http/middleware/error.js +15 -0
- package/dist/esm/http/middleware/tenant.js +102 -0
- package/dist/esm/http/resolver.js +15 -0
- package/dist/esm/http/router.js +45 -0
- package/dist/esm/http/schemas/authorize.js +30 -0
- package/dist/esm/http/schemas/end-session.js +13 -0
- package/dist/esm/http/schemas/par.js +9 -0
- package/dist/esm/http/schemas/register.js +16 -0
- package/dist/esm/http/schemas/revocation.js +18 -0
- package/dist/esm/http/schemas/token.js +57 -0
- package/dist/esm/index.js +126 -9
- package/dist/esm/methods/code.js +221 -0
- package/dist/esm/methods/m2m.js +41 -0
- package/dist/esm/methods/oauth2-factory.js +84 -0
- package/dist/esm/methods/oauth2-generic.js +196 -0
- package/dist/esm/methods/oidc-generic.js +53 -0
- package/dist/esm/methods/passkey.js +275 -0
- package/dist/esm/methods/password-hash.js +79 -0
- package/dist/esm/methods/password.js +166 -0
- package/dist/esm/methods/providers/apple.js +29 -0
- package/dist/esm/methods/providers/cognito.js +37 -0
- package/dist/esm/methods/providers/discord.js +28 -0
- package/dist/esm/methods/providers/facebook.js +42 -0
- package/dist/esm/methods/providers/github.js +29 -0
- package/dist/esm/methods/providers/google.js +29 -0
- package/dist/esm/methods/providers/index.js +17 -0
- package/dist/esm/methods/providers/jumpcloud.js +27 -0
- package/dist/esm/methods/providers/keycloak.js +32 -0
- package/dist/esm/methods/providers/linkedin.js +28 -0
- package/dist/esm/methods/providers/microsoft.js +28 -0
- package/dist/esm/methods/providers/slack.js +30 -0
- package/dist/esm/methods/providers/spotify.js +28 -0
- package/dist/esm/methods/providers/twitch.js +28 -0
- package/dist/esm/methods/providers/x.js +28 -0
- package/dist/esm/methods/providers/yahoo.js +27 -0
- package/dist/esm/pkce.js +4 -16
- package/dist/esm/ports/audit-log.js +0 -0
- package/dist/esm/ports/config-store.js +0 -0
- package/dist/esm/ports/key-store.js +0 -0
- package/dist/esm/ports/method-store.js +0 -0
- package/dist/esm/ports/session-store.js +0 -0
- package/dist/esm/ports/token-store.js +0 -0
- package/dist/esm/types/authorization.js +0 -0
- package/dist/esm/types/error.js +70 -0
- package/dist/esm/types/flow.js +0 -0
- package/dist/esm/types/idp.js +0 -0
- package/dist/esm/types/method.js +0 -0
- package/dist/esm/types/picker.js +0 -0
- package/dist/esm/types/result.js +11 -0
- package/dist/esm/types/subject.js +0 -0
- package/dist/esm/types/tenant.js +5 -0
- package/dist/esm/types/token.js +0 -0
- package/dist/esm/ui/forms.js +253 -0
- package/dist/esm/ui/index.js +8 -0
- package/dist/esm/ui/picker.js +49 -0
- package/dist/types/adapters/d1/audit-log.d.ts +19 -0
- package/dist/types/adapters/d1/audit-log.d.ts.map +1 -0
- package/dist/types/adapters/d1/config-store.d.ts +20 -0
- package/dist/types/adapters/d1/config-store.d.ts.map +1 -0
- package/dist/types/adapters/d1/index.d.ts +35 -0
- package/dist/types/adapters/d1/index.d.ts.map +1 -0
- package/dist/types/adapters/d1/key-store.d.ts +17 -0
- package/dist/types/adapters/d1/key-store.d.ts.map +1 -0
- package/dist/types/adapters/d1/method-store.d.ts +21 -0
- package/dist/types/adapters/d1/method-store.d.ts.map +1 -0
- package/dist/types/adapters/d1/migrations.d.ts +18 -0
- package/dist/types/adapters/d1/migrations.d.ts.map +1 -0
- package/dist/types/adapters/d1/session-store.d.ts +20 -0
- package/dist/types/adapters/d1/session-store.d.ts.map +1 -0
- package/dist/types/adapters/d1/session.d.ts +18 -0
- package/dist/types/adapters/d1/session.d.ts.map +1 -0
- package/dist/types/adapters/d1/token-store.d.ts +29 -0
- package/dist/types/adapters/d1/token-store.d.ts.map +1 -0
- package/dist/types/adapters/d1/types.d.ts +43 -0
- package/dist/types/adapters/d1/types.d.ts.map +1 -0
- package/dist/types/adapters/durable-object/index.d.ts +17 -0
- package/dist/types/adapters/durable-object/index.d.ts.map +1 -0
- package/dist/types/adapters/durable-object/session-store.d.ts +21 -0
- package/dist/types/adapters/durable-object/session-store.d.ts.map +1 -0
- package/dist/types/adapters/durable-object/types.d.ts +23 -0
- package/dist/types/adapters/durable-object/types.d.ts.map +1 -0
- package/dist/types/adapters/dynamo/audit-log.d.ts +19 -0
- package/dist/types/adapters/dynamo/audit-log.d.ts.map +1 -0
- package/dist/types/adapters/dynamo/client.d.ts +111 -0
- package/dist/types/adapters/dynamo/client.d.ts.map +1 -0
- package/dist/types/adapters/dynamo/config-store.d.ts +21 -0
- package/dist/types/adapters/dynamo/config-store.d.ts.map +1 -0
- package/dist/types/adapters/dynamo/index.d.ts +60 -0
- package/dist/types/adapters/dynamo/index.d.ts.map +1 -0
- package/dist/types/adapters/dynamo/key-store.d.ts +23 -0
- package/dist/types/adapters/dynamo/key-store.d.ts.map +1 -0
- package/dist/types/adapters/dynamo/method-store.d.ts +20 -0
- package/dist/types/adapters/dynamo/method-store.d.ts.map +1 -0
- package/dist/types/adapters/dynamo/passkey-credential-store.d.ts +47 -0
- package/dist/types/adapters/dynamo/passkey-credential-store.d.ts.map +1 -0
- package/dist/types/adapters/dynamo/sdk.d.ts +23 -0
- package/dist/types/adapters/dynamo/sdk.d.ts.map +1 -0
- package/dist/types/adapters/dynamo/session-store.d.ts +20 -0
- package/dist/types/adapters/dynamo/session-store.d.ts.map +1 -0
- package/dist/types/adapters/dynamo/token-store.d.ts +29 -0
- package/dist/types/adapters/dynamo/token-store.d.ts.map +1 -0
- package/dist/types/adapters/kms/in-memory-backing.d.ts +9 -0
- package/dist/types/adapters/kms/in-memory-backing.d.ts.map +1 -0
- package/dist/types/adapters/kms/index.d.ts +35 -0
- package/dist/types/adapters/kms/index.d.ts.map +1 -0
- package/dist/types/adapters/kms/key-store.d.ts +20 -0
- package/dist/types/adapters/kms/key-store.d.ts.map +1 -0
- package/dist/types/adapters/kms/sdk.d.ts +16 -0
- package/dist/types/adapters/kms/sdk.d.ts.map +1 -0
- package/dist/types/adapters/kms/types.d.ts +58 -0
- package/dist/types/adapters/kms/types.d.ts.map +1 -0
- package/dist/types/adapters/kv/audit-log.d.ts +22 -0
- package/dist/types/adapters/kv/audit-log.d.ts.map +1 -0
- package/dist/types/adapters/kv/config-store.d.ts +25 -0
- package/dist/types/adapters/kv/config-store.d.ts.map +1 -0
- package/dist/types/adapters/kv/index.d.ts +21 -0
- package/dist/types/adapters/kv/index.d.ts.map +1 -0
- package/dist/types/adapters/kv/method-store.d.ts +23 -0
- package/dist/types/adapters/kv/method-store.d.ts.map +1 -0
- package/dist/types/adapters/kv/types.d.ts +28 -0
- package/dist/types/adapters/kv/types.d.ts.map +1 -0
- package/dist/types/adapters/memory/audit-log.d.ts +18 -0
- package/dist/types/adapters/memory/audit-log.d.ts.map +1 -0
- package/dist/types/adapters/memory/clock.d.ts +7 -0
- package/dist/types/adapters/memory/clock.d.ts.map +1 -0
- package/dist/types/adapters/memory/config-store.d.ts +19 -0
- package/dist/types/adapters/memory/config-store.d.ts.map +1 -0
- package/dist/types/adapters/memory/index.d.ts +15 -0
- package/dist/types/adapters/memory/index.d.ts.map +1 -0
- package/dist/types/adapters/memory/key-store.d.ts +17 -0
- package/dist/types/adapters/memory/key-store.d.ts.map +1 -0
- package/dist/types/adapters/memory/method-store.d.ts +26 -0
- package/dist/types/adapters/memory/method-store.d.ts.map +1 -0
- package/dist/types/adapters/memory/passkey-credential-store.d.ts +43 -0
- package/dist/types/adapters/memory/passkey-credential-store.d.ts.map +1 -0
- package/dist/types/adapters/memory/session-store.d.ts +21 -0
- package/dist/types/adapters/memory/session-store.d.ts.map +1 -0
- package/dist/types/adapters/memory/token-store.d.ts +29 -0
- package/dist/types/adapters/memory/token-store.d.ts.map +1 -0
- package/dist/types/adapters/postgres/audit-log.d.ts +18 -0
- package/dist/types/adapters/postgres/audit-log.d.ts.map +1 -0
- package/dist/types/adapters/postgres/config-store.d.ts +21 -0
- package/dist/types/adapters/postgres/config-store.d.ts.map +1 -0
- package/dist/types/adapters/postgres/executor.d.ts +48 -0
- package/dist/types/adapters/postgres/executor.d.ts.map +1 -0
- package/dist/types/adapters/postgres/index.d.ts +39 -0
- package/dist/types/adapters/postgres/index.d.ts.map +1 -0
- package/dist/types/adapters/postgres/key-store.d.ts +23 -0
- package/dist/types/adapters/postgres/key-store.d.ts.map +1 -0
- package/dist/types/adapters/postgres/method-store.d.ts +21 -0
- package/dist/types/adapters/postgres/method-store.d.ts.map +1 -0
- package/dist/types/adapters/postgres/migrations.d.ts +22 -0
- package/dist/types/adapters/postgres/migrations.d.ts.map +1 -0
- package/dist/types/adapters/postgres/passkey-credential-store.d.ts +48 -0
- package/dist/types/adapters/postgres/passkey-credential-store.d.ts.map +1 -0
- package/dist/types/adapters/postgres/session-store.d.ts +20 -0
- package/dist/types/adapters/postgres/session-store.d.ts.map +1 -0
- package/dist/types/adapters/postgres/token-store.d.ts +30 -0
- package/dist/types/adapters/postgres/token-store.d.ts.map +1 -0
- package/dist/types/client.d.ts +20 -1
- package/dist/types/client.d.ts.map +1 -1
- package/dist/types/domain/audit.d.ts +17 -0
- package/dist/types/domain/audit.d.ts.map +1 -0
- package/dist/types/domain/authorize.d.ts +125 -0
- package/dist/types/domain/authorize.d.ts.map +1 -0
- package/dist/types/domain/callback.d.ts +70 -0
- package/dist/types/domain/callback.d.ts.map +1 -0
- package/dist/types/domain/client-auth.d.ts +57 -0
- package/dist/types/domain/client-auth.d.ts.map +1 -0
- package/dist/types/domain/client-credentials.d.ts +54 -0
- package/dist/types/domain/client-credentials.d.ts.map +1 -0
- package/dist/types/domain/crypto.d.ts +53 -0
- package/dist/types/domain/crypto.d.ts.map +1 -0
- package/dist/types/domain/discovery.d.ts +81 -0
- package/dist/types/domain/discovery.d.ts.map +1 -0
- package/dist/types/domain/dpop.d.ts +61 -0
- package/dist/types/domain/dpop.d.ts.map +1 -0
- package/dist/types/domain/id-token.d.ts +83 -0
- package/dist/types/domain/id-token.d.ts.map +1 -0
- package/dist/types/domain/introspect.d.ts +79 -0
- package/dist/types/domain/introspect.d.ts.map +1 -0
- package/dist/types/domain/jwt.d.ts +74 -0
- package/dist/types/domain/jwt.d.ts.map +1 -0
- package/dist/types/domain/logout.d.ts +69 -0
- package/dist/types/domain/logout.d.ts.map +1 -0
- package/dist/types/domain/method-cache.d.ts +42 -0
- package/dist/types/domain/method-cache.d.ts.map +1 -0
- package/dist/types/domain/method-dispatch.d.ts +37 -0
- package/dist/types/domain/method-dispatch.d.ts.map +1 -0
- package/dist/types/domain/method-route.d.ts +77 -0
- package/dist/types/domain/method-route.d.ts.map +1 -0
- package/dist/types/domain/par.d.ts +62 -0
- package/dist/types/domain/par.d.ts.map +1 -0
- package/dist/types/domain/pkce.d.ts +15 -0
- package/dist/types/domain/pkce.d.ts.map +1 -0
- package/dist/types/domain/refresh.d.ts +52 -0
- package/dist/types/domain/refresh.d.ts.map +1 -0
- package/dist/types/domain/register.d.ts +33 -0
- package/dist/types/domain/register.d.ts.map +1 -0
- package/dist/types/domain/revoke.d.ts +61 -0
- package/dist/types/domain/revoke.d.ts.map +1 -0
- package/dist/types/domain/state-envelope.d.ts +30 -0
- package/dist/types/domain/state-envelope.d.ts.map +1 -0
- package/dist/types/domain/token-exchange.d.ts +69 -0
- package/dist/types/domain/token-exchange.d.ts.map +1 -0
- package/dist/types/domain/token.d.ts +140 -0
- package/dist/types/domain/token.d.ts.map +1 -0
- package/dist/types/domain/userinfo.d.ts +61 -0
- package/dist/types/domain/userinfo.d.ts.map +1 -0
- package/dist/types/http/context.d.ts +66 -0
- package/dist/types/http/context.d.ts.map +1 -0
- package/dist/types/http/cookies.d.ts +45 -0
- package/dist/types/http/cookies.d.ts.map +1 -0
- package/dist/types/http/errors.d.ts +36 -0
- package/dist/types/http/errors.d.ts.map +1 -0
- package/dist/types/http/handlers/authorize.d.ts +3 -0
- package/dist/types/http/handlers/authorize.d.ts.map +1 -0
- package/dist/types/http/handlers/callback.d.ts +3 -0
- package/dist/types/http/handlers/callback.d.ts.map +1 -0
- package/dist/types/http/handlers/end-session.d.ts +3 -0
- package/dist/types/http/handlers/end-session.d.ts.map +1 -0
- package/dist/types/http/handlers/metadata.d.ts +4 -0
- package/dist/types/http/handlers/metadata.d.ts.map +1 -0
- package/dist/types/http/handlers/method-route.d.ts +3 -0
- package/dist/types/http/handlers/method-route.d.ts.map +1 -0
- package/dist/types/http/handlers/par.d.ts +3 -0
- package/dist/types/http/handlers/par.d.ts.map +1 -0
- package/dist/types/http/handlers/register.d.ts +3 -0
- package/dist/types/http/handlers/register.d.ts.map +1 -0
- package/dist/types/http/handlers/revocation.d.ts +4 -0
- package/dist/types/http/handlers/revocation.d.ts.map +1 -0
- package/dist/types/http/handlers/token.d.ts +3 -0
- package/dist/types/http/handlers/token.d.ts.map +1 -0
- package/dist/types/http/handlers/userinfo.d.ts +3 -0
- package/dist/types/http/handlers/userinfo.d.ts.map +1 -0
- package/dist/types/http/middleware/error.d.ts +9 -0
- package/dist/types/http/middleware/error.d.ts.map +1 -0
- package/dist/types/http/middleware/tenant.d.ts +30 -0
- package/dist/types/http/middleware/tenant.d.ts.map +1 -0
- package/dist/types/http/resolver.d.ts +22 -0
- package/dist/types/http/resolver.d.ts.map +1 -0
- package/dist/types/http/router.d.ts +21 -0
- package/dist/types/http/router.d.ts.map +1 -0
- package/dist/types/http/schemas/authorize.d.ts +92 -0
- package/dist/types/http/schemas/authorize.d.ts.map +1 -0
- package/dist/types/http/schemas/end-session.d.ts +31 -0
- package/dist/types/http/schemas/end-session.d.ts.map +1 -0
- package/dist/types/http/schemas/par.d.ts +20 -0
- package/dist/types/http/schemas/par.d.ts.map +1 -0
- package/dist/types/http/schemas/register.d.ts +42 -0
- package/dist/types/http/schemas/register.d.ts.map +1 -0
- package/dist/types/http/schemas/revocation.d.ts +41 -0
- package/dist/types/http/schemas/revocation.d.ts.map +1 -0
- package/dist/types/http/schemas/token.d.ts +227 -0
- package/dist/types/http/schemas/token.d.ts.map +1 -0
- package/dist/types/index.d.ts +63 -13
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/methods/code.d.ts +96 -0
- package/dist/types/methods/code.d.ts.map +1 -0
- package/dist/types/methods/m2m.d.ts +41 -0
- package/dist/types/methods/m2m.d.ts.map +1 -0
- package/dist/types/methods/oauth2-factory.d.ts +133 -0
- package/dist/types/methods/oauth2-factory.d.ts.map +1 -0
- package/dist/types/methods/oauth2-generic.d.ts +75 -0
- package/dist/types/methods/oauth2-generic.d.ts.map +1 -0
- package/dist/types/methods/oidc-generic.d.ts +26 -0
- package/dist/types/methods/oidc-generic.d.ts.map +1 -0
- package/dist/types/methods/passkey.d.ts +106 -0
- package/dist/types/methods/passkey.d.ts.map +1 -0
- package/dist/types/methods/password-hash.d.ts +25 -0
- package/dist/types/methods/password-hash.d.ts.map +1 -0
- package/dist/types/methods/password.d.ts +70 -0
- package/dist/types/methods/password.d.ts.map +1 -0
- package/dist/types/methods/providers/apple.d.ts +29 -0
- package/dist/types/methods/providers/apple.d.ts.map +1 -0
- package/dist/types/methods/providers/cognito.d.ts +36 -0
- package/dist/types/methods/providers/cognito.d.ts.map +1 -0
- package/dist/types/methods/providers/discord.d.ts +22 -0
- package/dist/types/methods/providers/discord.d.ts.map +1 -0
- package/dist/types/methods/providers/facebook.d.ts +29 -0
- package/dist/types/methods/providers/facebook.d.ts.map +1 -0
- package/dist/types/methods/providers/github.d.ts +25 -0
- package/dist/types/methods/providers/github.d.ts.map +1 -0
- package/dist/types/methods/providers/google.d.ts +28 -0
- package/dist/types/methods/providers/google.d.ts.map +1 -0
- package/dist/types/methods/providers/index.d.ts +24 -0
- package/dist/types/methods/providers/index.d.ts.map +1 -0
- package/dist/types/methods/providers/jumpcloud.d.ts +22 -0
- package/dist/types/methods/providers/jumpcloud.d.ts.map +1 -0
- package/dist/types/methods/providers/keycloak.d.ts +30 -0
- package/dist/types/methods/providers/keycloak.d.ts.map +1 -0
- package/dist/types/methods/providers/linkedin.d.ts +22 -0
- package/dist/types/methods/providers/linkedin.d.ts.map +1 -0
- package/dist/types/methods/providers/microsoft.d.ts +30 -0
- package/dist/types/methods/providers/microsoft.d.ts.map +1 -0
- package/dist/types/methods/providers/slack.d.ts +25 -0
- package/dist/types/methods/providers/slack.d.ts.map +1 -0
- package/dist/types/methods/providers/spotify.d.ts +22 -0
- package/dist/types/methods/providers/spotify.d.ts.map +1 -0
- package/dist/types/methods/providers/twitch.d.ts +23 -0
- package/dist/types/methods/providers/twitch.d.ts.map +1 -0
- package/dist/types/methods/providers/x.d.ts +25 -0
- package/dist/types/methods/providers/x.d.ts.map +1 -0
- package/dist/types/methods/providers/yahoo.d.ts +22 -0
- package/dist/types/methods/providers/yahoo.d.ts.map +1 -0
- package/dist/types/pkce.d.ts +1 -2
- package/dist/types/pkce.d.ts.map +1 -1
- package/dist/types/ports/audit-log.d.ts +166 -0
- package/dist/types/ports/audit-log.d.ts.map +1 -0
- package/dist/types/ports/config-store.d.ts +32 -0
- package/dist/types/ports/config-store.d.ts.map +1 -0
- package/dist/types/ports/key-store.d.ts +98 -0
- package/dist/types/ports/key-store.d.ts.map +1 -0
- package/dist/types/ports/method-store.d.ts +29 -0
- package/dist/types/ports/method-store.d.ts.map +1 -0
- package/dist/types/ports/session-store.d.ts +109 -0
- package/dist/types/ports/session-store.d.ts.map +1 -0
- package/dist/types/ports/token-store.d.ts +105 -0
- package/dist/types/ports/token-store.d.ts.map +1 -0
- package/dist/types/types/authorization.d.ts +75 -0
- package/dist/types/types/authorization.d.ts.map +1 -0
- package/dist/types/types/error.d.ts +101 -0
- package/dist/types/types/error.d.ts.map +1 -0
- package/dist/types/types/flow.d.ts +97 -0
- package/dist/types/types/flow.d.ts.map +1 -0
- package/dist/types/types/idp.d.ts +324 -0
- package/dist/types/types/idp.d.ts.map +1 -0
- package/dist/types/types/method.d.ts +256 -0
- package/dist/types/types/method.d.ts.map +1 -0
- package/dist/types/types/picker.d.ts +31 -0
- package/dist/types/types/picker.d.ts.map +1 -0
- package/dist/types/types/result.d.ts +29 -0
- package/dist/types/types/result.d.ts.map +1 -0
- package/dist/types/types/subject.d.ts +47 -0
- package/dist/types/types/subject.d.ts.map +1 -0
- package/dist/types/types/tenant.d.ts +276 -0
- package/dist/types/types/tenant.d.ts.map +1 -0
- package/dist/types/types/token.d.ts +231 -0
- package/dist/types/types/token.d.ts.map +1 -0
- package/dist/types/ui/forms.d.ts +35 -0
- package/dist/types/ui/forms.d.ts.map +1 -0
- package/dist/types/ui/index.d.ts +14 -0
- package/dist/types/ui/index.d.ts.map +1 -0
- package/dist/types/ui/picker.d.ts +18 -0
- package/dist/types/ui/picker.d.ts.map +1 -0
- package/package.json +41 -6
- package/src/adapters/d1/audit-log.ts +32 -0
- package/src/adapters/d1/config-store.ts +67 -0
- package/src/adapters/d1/index.ts +41 -0
- package/src/adapters/d1/key-store.ts +218 -0
- package/src/adapters/d1/method-store.ts +103 -0
- package/src/adapters/d1/migrations.ts +89 -0
- package/src/adapters/d1/session-store.ts +230 -0
- package/src/adapters/d1/session.ts +38 -0
- package/src/adapters/d1/token-store.ts +251 -0
- package/src/adapters/d1/types.ts +53 -0
- package/src/adapters/durable-object/index.ts +23 -0
- package/src/adapters/durable-object/session-store.ts +227 -0
- package/src/adapters/durable-object/types.ts +25 -0
- package/src/adapters/dynamo/audit-log.ts +35 -0
- package/src/adapters/dynamo/client.ts +118 -0
- package/src/adapters/dynamo/config-store.ts +72 -0
- package/src/adapters/dynamo/index.ts +81 -0
- package/src/adapters/dynamo/key-store.ts +267 -0
- package/src/adapters/dynamo/method-store.ts +105 -0
- package/src/adapters/dynamo/passkey-credential-store.ts +132 -0
- package/src/adapters/dynamo/sdk.ts +189 -0
- package/src/adapters/dynamo/session-store.ts +229 -0
- package/src/adapters/dynamo/token-store.ts +248 -0
- package/src/adapters/kms/in-memory-backing.ts +36 -0
- package/src/adapters/kms/index.ts +39 -0
- package/src/adapters/kms/key-store.ts +176 -0
- package/src/adapters/kms/sdk.ts +39 -0
- package/src/adapters/kms/types.ts +61 -0
- package/src/adapters/kv/audit-log.ts +40 -0
- package/src/adapters/kv/config-store.ts +63 -0
- package/src/adapters/kv/index.ts +20 -0
- package/src/adapters/kv/method-store.ts +98 -0
- package/src/adapters/kv/types.ts +26 -0
- package/src/adapters/memory/audit-log.ts +28 -0
- package/src/adapters/memory/clock.ts +7 -0
- package/src/adapters/memory/config-store.ts +41 -0
- package/src/adapters/memory/index.ts +26 -0
- package/src/adapters/memory/key-store.ts +102 -0
- package/src/adapters/memory/method-store.ts +75 -0
- package/src/adapters/memory/passkey-credential-store.ts +97 -0
- package/src/adapters/memory/session-store.ts +171 -0
- package/src/adapters/memory/token-store.ts +181 -0
- package/src/adapters/postgres/audit-log.ts +34 -0
- package/src/adapters/postgres/config-store.ts +72 -0
- package/src/adapters/postgres/executor.ts +76 -0
- package/src/adapters/postgres/index.ts +60 -0
- package/src/adapters/postgres/key-store.ts +334 -0
- package/src/adapters/postgres/method-store.ts +104 -0
- package/src/adapters/postgres/migrations.ts +131 -0
- package/src/adapters/postgres/passkey-credential-store.ts +150 -0
- package/src/adapters/postgres/session-store.ts +216 -0
- package/src/adapters/postgres/token-store.ts +263 -0
- package/src/client.ts +82 -16
- package/src/domain/audit.ts +28 -0
- package/src/domain/authorize.ts +414 -0
- package/src/domain/callback.ts +268 -0
- package/src/domain/client-auth.ts +116 -0
- package/src/domain/client-credentials.ts +180 -0
- package/src/domain/crypto.ts +168 -0
- package/src/domain/discovery.ts +161 -0
- package/src/domain/dpop.ts +293 -0
- package/src/domain/id-token.ts +213 -0
- package/src/domain/introspect.ts +155 -0
- package/src/domain/jwt.ts +185 -0
- package/src/domain/logout.ts +180 -0
- package/src/domain/method-cache.ts +220 -0
- package/src/domain/method-dispatch.ts +95 -0
- package/src/domain/method-route.ts +213 -0
- package/src/domain/par.ts +141 -0
- package/src/domain/pkce.ts +37 -0
- package/src/domain/refresh.ts +210 -0
- package/src/domain/register.ts +168 -0
- package/src/domain/revoke.ts +161 -0
- package/src/domain/state-envelope.ts +142 -0
- package/src/domain/token-exchange.ts +243 -0
- package/src/domain/token.ts +483 -0
- package/src/domain/userinfo.ts +171 -0
- package/src/http/context.ts +90 -0
- package/src/http/cookies.ts +167 -0
- package/src/http/errors.ts +98 -0
- package/src/http/handlers/authorize.ts +362 -0
- package/src/http/handlers/callback.ts +77 -0
- package/src/http/handlers/end-session.ts +106 -0
- package/src/http/handlers/metadata.ts +49 -0
- package/src/http/handlers/method-route.ts +115 -0
- package/src/http/handlers/par.ts +84 -0
- package/src/http/handlers/register.ts +70 -0
- package/src/http/handlers/revocation.ts +151 -0
- package/src/http/handlers/token.ts +300 -0
- package/src/http/handlers/userinfo.ts +90 -0
- package/src/http/middleware/error.ts +26 -0
- package/src/http/middleware/tenant.ts +165 -0
- package/src/http/resolver.ts +34 -0
- package/src/http/router.ts +85 -0
- package/src/http/schemas/authorize.ts +85 -0
- package/src/http/schemas/end-session.ts +23 -0
- package/src/http/schemas/par.ts +23 -0
- package/src/http/schemas/register.ts +29 -0
- package/src/http/schemas/revocation.ts +23 -0
- package/src/http/schemas/token.ts +85 -0
- package/src/index.ts +283 -20
- package/src/methods/code.ts +359 -0
- package/src/methods/m2m.ts +82 -0
- package/src/methods/oauth2-factory.ts +151 -0
- package/src/methods/oauth2-generic.ts +360 -0
- package/src/methods/oidc-generic.ts +109 -0
- package/src/methods/passkey.ts +419 -0
- package/src/methods/password-hash.ts +134 -0
- package/src/methods/password.ts +298 -0
- package/src/methods/providers/apple.ts +42 -0
- package/src/methods/providers/cognito.ts +55 -0
- package/src/methods/providers/discord.ts +37 -0
- package/src/methods/providers/facebook.ts +54 -0
- package/src/methods/providers/github.ts +42 -0
- package/src/methods/providers/google.ts +43 -0
- package/src/methods/providers/index.ts +23 -0
- package/src/methods/providers/jumpcloud.ts +36 -0
- package/src/methods/providers/keycloak.ts +42 -0
- package/src/methods/providers/linkedin.ts +37 -0
- package/src/methods/providers/microsoft.ts +42 -0
- package/src/methods/providers/slack.ts +42 -0
- package/src/methods/providers/spotify.ts +37 -0
- package/src/methods/providers/twitch.ts +38 -0
- package/src/methods/providers/x.ts +40 -0
- package/src/methods/providers/yahoo.ts +36 -0
- package/src/pkce.ts +20 -21
- package/src/ports/CONSISTENCY.md +119 -0
- package/src/ports/audit-log.ts +177 -0
- package/src/ports/config-store.ts +34 -0
- package/src/ports/key-store.ts +106 -0
- package/src/ports/method-store.ts +41 -0
- package/src/ports/session-store.ts +131 -0
- package/src/ports/token-store.ts +116 -0
- package/src/types/authorization.ts +78 -0
- package/src/types/error.ts +146 -0
- package/src/types/flow.ts +99 -0
- package/src/types/idp.ts +365 -0
- package/src/types/method.ts +270 -0
- package/src/types/picker.ts +32 -0
- package/src/types/result.ts +23 -0
- package/src/types/subject.ts +50 -0
- package/src/types/tenant.ts +285 -0
- package/src/types/token.ts +236 -0
- package/src/ui/forms.ts +289 -0
- package/src/ui/index.ts +14 -0
- package/src/ui/picker.ts +63 -0
- package/dist/esm/issuer.js +0 -691
- package/dist/esm/jwt.js +0 -16
- package/dist/esm/keys.js +0 -113
- package/dist/esm/provider/apple.js +0 -28
- package/dist/esm/provider/arctic.js +0 -43
- package/dist/esm/provider/code.js +0 -58
- package/dist/esm/provider/cognito.js +0 -16
- package/dist/esm/provider/discord.js +0 -15
- package/dist/esm/provider/facebook.js +0 -24
- package/dist/esm/provider/github.js +0 -15
- package/dist/esm/provider/google.js +0 -25
- package/dist/esm/provider/index.js +0 -3
- package/dist/esm/provider/jumpcloud.js +0 -15
- package/dist/esm/provider/keycloak.js +0 -15
- package/dist/esm/provider/linkedin.js +0 -15
- package/dist/esm/provider/m2m.js +0 -16
- package/dist/esm/provider/microsoft.js +0 -24
- package/dist/esm/provider/oauth2.js +0 -119
- package/dist/esm/provider/oidc.js +0 -69
- package/dist/esm/provider/passkey.js +0 -315
- package/dist/esm/provider/password.js +0 -306
- package/dist/esm/provider/provider.js +0 -10
- package/dist/esm/provider/slack.js +0 -15
- package/dist/esm/provider/spotify.js +0 -15
- package/dist/esm/provider/twitch.js +0 -15
- package/dist/esm/provider/x.js +0 -16
- package/dist/esm/provider/yahoo.js +0 -15
- package/dist/esm/random.js +0 -27
- package/dist/esm/storage/aws.js +0 -39
- package/dist/esm/storage/cloudflare.js +0 -42
- package/dist/esm/storage/dynamo.js +0 -116
- package/dist/esm/storage/memory.js +0 -88
- package/dist/esm/storage/storage.js +0 -36
- package/dist/esm/subject.js +0 -7
- package/dist/esm/ui/base.js +0 -407
- package/dist/esm/ui/code.js +0 -151
- package/dist/esm/ui/form.js +0 -43
- package/dist/esm/ui/icon.js +0 -92
- package/dist/esm/ui/passkey.js +0 -329
- package/dist/esm/ui/password.js +0 -338
- package/dist/esm/ui/select.js +0 -187
- package/dist/esm/ui/theme.js +0 -115
- package/dist/esm/util.js +0 -54
- package/dist/types/issuer.d.ts +0 -607
- package/dist/types/issuer.d.ts.map +0 -1
- package/dist/types/jwt.d.ts +0 -6
- package/dist/types/jwt.d.ts.map +0 -1
- package/dist/types/keys.d.ts +0 -18
- package/dist/types/keys.d.ts.map +0 -1
- package/dist/types/provider/apple.d.ts +0 -108
- package/dist/types/provider/apple.d.ts.map +0 -1
- package/dist/types/provider/arctic.d.ts +0 -16
- package/dist/types/provider/arctic.d.ts.map +0 -1
- package/dist/types/provider/code.d.ts +0 -74
- package/dist/types/provider/code.d.ts.map +0 -1
- package/dist/types/provider/cognito.d.ts +0 -64
- package/dist/types/provider/cognito.d.ts.map +0 -1
- package/dist/types/provider/discord.d.ts +0 -38
- package/dist/types/provider/discord.d.ts.map +0 -1
- package/dist/types/provider/facebook.d.ts +0 -74
- package/dist/types/provider/facebook.d.ts.map +0 -1
- package/dist/types/provider/github.d.ts +0 -38
- package/dist/types/provider/github.d.ts.map +0 -1
- package/dist/types/provider/google.d.ts +0 -74
- package/dist/types/provider/google.d.ts.map +0 -1
- package/dist/types/provider/index.d.ts +0 -4
- package/dist/types/provider/index.d.ts.map +0 -1
- package/dist/types/provider/jumpcloud.d.ts +0 -38
- package/dist/types/provider/jumpcloud.d.ts.map +0 -1
- package/dist/types/provider/keycloak.d.ts +0 -67
- package/dist/types/provider/keycloak.d.ts.map +0 -1
- package/dist/types/provider/linkedin.d.ts +0 -6
- package/dist/types/provider/linkedin.d.ts.map +0 -1
- package/dist/types/provider/m2m.d.ts +0 -34
- package/dist/types/provider/m2m.d.ts.map +0 -1
- package/dist/types/provider/microsoft.d.ts +0 -89
- package/dist/types/provider/microsoft.d.ts.map +0 -1
- package/dist/types/provider/oauth2.d.ts +0 -133
- package/dist/types/provider/oauth2.d.ts.map +0 -1
- package/dist/types/provider/oidc.d.ts +0 -91
- package/dist/types/provider/oidc.d.ts.map +0 -1
- package/dist/types/provider/passkey.d.ts +0 -143
- package/dist/types/provider/passkey.d.ts.map +0 -1
- package/dist/types/provider/password.d.ts +0 -210
- package/dist/types/provider/password.d.ts.map +0 -1
- package/dist/types/provider/provider.d.ts +0 -29
- package/dist/types/provider/provider.d.ts.map +0 -1
- package/dist/types/provider/slack.d.ts +0 -59
- package/dist/types/provider/slack.d.ts.map +0 -1
- package/dist/types/provider/spotify.d.ts +0 -38
- package/dist/types/provider/spotify.d.ts.map +0 -1
- package/dist/types/provider/twitch.d.ts +0 -38
- package/dist/types/provider/twitch.d.ts.map +0 -1
- package/dist/types/provider/x.d.ts +0 -38
- package/dist/types/provider/x.d.ts.map +0 -1
- package/dist/types/provider/yahoo.d.ts +0 -38
- package/dist/types/provider/yahoo.d.ts.map +0 -1
- package/dist/types/random.d.ts +0 -3
- package/dist/types/random.d.ts.map +0 -1
- package/dist/types/storage/aws.d.ts +0 -4
- package/dist/types/storage/aws.d.ts.map +0 -1
- package/dist/types/storage/cloudflare.d.ts +0 -34
- package/dist/types/storage/cloudflare.d.ts.map +0 -1
- package/dist/types/storage/dynamo.d.ts +0 -65
- package/dist/types/storage/dynamo.d.ts.map +0 -1
- package/dist/types/storage/memory.d.ts +0 -49
- package/dist/types/storage/memory.d.ts.map +0 -1
- package/dist/types/storage/storage.d.ts +0 -15
- package/dist/types/storage/storage.d.ts.map +0 -1
- package/dist/types/subject.d.ts +0 -122
- package/dist/types/subject.d.ts.map +0 -1
- package/dist/types/ui/base.d.ts +0 -5
- package/dist/types/ui/base.d.ts.map +0 -1
- package/dist/types/ui/code.d.ts +0 -104
- package/dist/types/ui/code.d.ts.map +0 -1
- package/dist/types/ui/form.d.ts +0 -6
- package/dist/types/ui/form.d.ts.map +0 -1
- package/dist/types/ui/icon.d.ts +0 -6
- package/dist/types/ui/icon.d.ts.map +0 -1
- package/dist/types/ui/passkey.d.ts +0 -5
- package/dist/types/ui/passkey.d.ts.map +0 -1
- package/dist/types/ui/password.d.ts +0 -139
- package/dist/types/ui/password.d.ts.map +0 -1
- package/dist/types/ui/select.d.ts +0 -55
- package/dist/types/ui/select.d.ts.map +0 -1
- package/dist/types/ui/theme.d.ts +0 -207
- package/dist/types/ui/theme.d.ts.map +0 -1
- package/dist/types/util.d.ts +0 -8
- package/dist/types/util.d.ts.map +0 -1
- package/src/css.d.ts +0 -4
- package/src/issuer.ts +0 -1628
- package/src/jwt.ts +0 -17
- package/src/keys.ts +0 -139
- package/src/provider/apple.ts +0 -127
- package/src/provider/arctic.ts +0 -66
- package/src/provider/code.ts +0 -227
- package/src/provider/cognito.ts +0 -74
- package/src/provider/discord.ts +0 -45
- package/src/provider/facebook.ts +0 -84
- package/src/provider/github.ts +0 -45
- package/src/provider/google.ts +0 -85
- package/src/provider/index.ts +0 -3
- package/src/provider/jumpcloud.ts +0 -45
- package/src/provider/keycloak.ts +0 -75
- package/src/provider/linkedin.ts +0 -12
- package/src/provider/m2m.ts +0 -56
- package/src/provider/microsoft.ts +0 -100
- package/src/provider/oauth2.ts +0 -297
- package/src/provider/oidc.ts +0 -179
- package/src/provider/passkey.ts +0 -655
- package/src/provider/password.ts +0 -672
- package/src/provider/provider.ts +0 -33
- package/src/provider/slack.ts +0 -67
- package/src/provider/spotify.ts +0 -45
- package/src/provider/twitch.ts +0 -45
- package/src/provider/x.ts +0 -46
- package/src/provider/yahoo.ts +0 -45
- package/src/random.ts +0 -24
- package/src/storage/aws.ts +0 -59
- package/src/storage/cloudflare.ts +0 -77
- package/src/storage/dynamo.ts +0 -193
- package/src/storage/memory.ts +0 -135
- package/src/storage/storage.ts +0 -46
- package/src/subject.ts +0 -130
- package/src/ui/base.tsx +0 -118
- package/src/ui/code.tsx +0 -215
- package/src/ui/form.tsx +0 -40
- package/src/ui/icon.tsx +0 -95
- package/src/ui/passkey.tsx +0 -321
- package/src/ui/password.tsx +0 -405
- package/src/ui/select.tsx +0 -221
- package/src/ui/theme.ts +0 -319
- package/src/ui/ui.css +0 -252
- package/src/util.ts +0 -58
- /package/dist/esm/{css.d.js → adapters/d1/types.js} +0 -0
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* D1 `SessionStore`. Flow records + optional long-lived sessions.
|
|
3
|
+
*
|
|
4
|
+
* `consumeFlow` is `DELETE … RETURNING payload, expires_at` — atomic
|
|
5
|
+
* single-winner. `updateFlowMethodState` re-serializes the entire payload
|
|
6
|
+
* blob (SQLite has no `jsonb_set`); the read-then-write is wrapped inside
|
|
7
|
+
* the same `primarySession` so the bookmark advances atomically.
|
|
8
|
+
*/
|
|
9
|
+
import { authError } from "../../types/error"
|
|
10
|
+
import type { FlowRecord } from "../../types/flow"
|
|
11
|
+
import type { SessionRecord, SessionStore } from "../../ports/session-store"
|
|
12
|
+
import type { Result } from "../../types/result"
|
|
13
|
+
import { err, ok } from "../../types/result"
|
|
14
|
+
|
|
15
|
+
import { primarySession } from "./session"
|
|
16
|
+
import type { AnyD1Database } from "./types"
|
|
17
|
+
|
|
18
|
+
export type D1SessionStoreOptions = {
|
|
19
|
+
db: AnyD1Database
|
|
20
|
+
clock?: () => number
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export class D1SessionStore implements SessionStore {
|
|
24
|
+
#db: AnyD1Database
|
|
25
|
+
#clock: () => number
|
|
26
|
+
|
|
27
|
+
constructor(opts: D1SessionStoreOptions) {
|
|
28
|
+
this.#db = opts.db
|
|
29
|
+
this.#clock = opts.clock ?? (() => Date.now())
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
async saveFlow(
|
|
33
|
+
flowId: string,
|
|
34
|
+
payload: FlowRecord,
|
|
35
|
+
ttl: number,
|
|
36
|
+
): Promise<Result<void>> {
|
|
37
|
+
if (ttl <= 0) {
|
|
38
|
+
return err(
|
|
39
|
+
authError.internalError(`saveFlow: ttl must be positive, got ${ttl}`),
|
|
40
|
+
)
|
|
41
|
+
}
|
|
42
|
+
const expiresAt = this.#clock() + ttl
|
|
43
|
+
try {
|
|
44
|
+
await primarySession(this.#db)
|
|
45
|
+
.prepare(
|
|
46
|
+
`INSERT INTO openauth_flows (flow_id, payload, expires_at) VALUES (?1, ?2, ?3)`,
|
|
47
|
+
)
|
|
48
|
+
.bind(flowId, JSON.stringify(payload), expiresAt)
|
|
49
|
+
.run()
|
|
50
|
+
} catch (e) {
|
|
51
|
+
return err(authError.internalError("saveFlow: insert failed", e))
|
|
52
|
+
}
|
|
53
|
+
return ok(undefined)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async updateFlowMethodState(
|
|
57
|
+
flowId: string,
|
|
58
|
+
methodState: unknown,
|
|
59
|
+
): Promise<Result<void>> {
|
|
60
|
+
const now = this.#clock()
|
|
61
|
+
const session = primarySession(this.#db)
|
|
62
|
+
let row: { payload: string; expires_at: number } | null
|
|
63
|
+
try {
|
|
64
|
+
row = await session
|
|
65
|
+
.prepare(
|
|
66
|
+
`SELECT payload, expires_at FROM openauth_flows WHERE flow_id = ?1`,
|
|
67
|
+
)
|
|
68
|
+
.bind(flowId)
|
|
69
|
+
.first<{ payload: string; expires_at: number }>()
|
|
70
|
+
} catch (e) {
|
|
71
|
+
return err(
|
|
72
|
+
authError.internalError("updateFlowMethodState: read failed", e),
|
|
73
|
+
)
|
|
74
|
+
}
|
|
75
|
+
if (!row) {
|
|
76
|
+
return err(authError.unknownState(`flow "${flowId}" unknown`))
|
|
77
|
+
}
|
|
78
|
+
if (now >= Number(row.expires_at)) {
|
|
79
|
+
return err(authError.unknownState(`flow "${flowId}" expired`))
|
|
80
|
+
}
|
|
81
|
+
let parsed: FlowRecord
|
|
82
|
+
try {
|
|
83
|
+
parsed = JSON.parse(row.payload) as FlowRecord
|
|
84
|
+
} catch (e) {
|
|
85
|
+
return err(
|
|
86
|
+
authError.internalError("updateFlowMethodState: parse failed", e),
|
|
87
|
+
)
|
|
88
|
+
}
|
|
89
|
+
const next = { ...parsed, methodState }
|
|
90
|
+
try {
|
|
91
|
+
// Conditional write — only update if the row still exists AND has
|
|
92
|
+
// matching expiry. If a concurrent consume snuck in, the WHERE clause
|
|
93
|
+
// misses and we surface `unknown_state`.
|
|
94
|
+
const result = await session
|
|
95
|
+
.prepare(
|
|
96
|
+
`UPDATE openauth_flows SET payload = ?1
|
|
97
|
+
WHERE flow_id = ?2 AND expires_at > ?3
|
|
98
|
+
RETURNING 1 AS hit`,
|
|
99
|
+
)
|
|
100
|
+
.bind(JSON.stringify(next), flowId, now)
|
|
101
|
+
.first<{ hit: number }>()
|
|
102
|
+
if (!result) {
|
|
103
|
+
return err(
|
|
104
|
+
authError.unknownState(`flow "${flowId}" unknown or expired`),
|
|
105
|
+
)
|
|
106
|
+
}
|
|
107
|
+
} catch (e) {
|
|
108
|
+
return err(
|
|
109
|
+
authError.internalError("updateFlowMethodState: update failed", e),
|
|
110
|
+
)
|
|
111
|
+
}
|
|
112
|
+
return ok(undefined)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
async readFlow(flowId: string): Promise<Result<FlowRecord>> {
|
|
116
|
+
let row: { payload: string; expires_at: number } | null
|
|
117
|
+
try {
|
|
118
|
+
row = await primarySession(this.#db)
|
|
119
|
+
.prepare(
|
|
120
|
+
`SELECT payload, expires_at FROM openauth_flows WHERE flow_id = ?1`,
|
|
121
|
+
)
|
|
122
|
+
.bind(flowId)
|
|
123
|
+
.first<{ payload: string; expires_at: number }>()
|
|
124
|
+
} catch (e) {
|
|
125
|
+
return err(authError.internalError("readFlow: query failed", e))
|
|
126
|
+
}
|
|
127
|
+
if (!row) {
|
|
128
|
+
return err(authError.unknownState(`flow "${flowId}" unknown`))
|
|
129
|
+
}
|
|
130
|
+
if (this.#clock() >= Number(row.expires_at)) {
|
|
131
|
+
try {
|
|
132
|
+
await primarySession(this.#db)
|
|
133
|
+
.prepare(`DELETE FROM openauth_flows WHERE flow_id = ?1`)
|
|
134
|
+
.bind(flowId)
|
|
135
|
+
.run()
|
|
136
|
+
} catch {}
|
|
137
|
+
return err(authError.unknownState(`flow "${flowId}" expired`))
|
|
138
|
+
}
|
|
139
|
+
return ok(JSON.parse(row.payload) as FlowRecord)
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
async consumeFlow(flowId: string): Promise<Result<FlowRecord>> {
|
|
143
|
+
let row: { payload: string; expires_at: number } | null
|
|
144
|
+
try {
|
|
145
|
+
row = await primarySession(this.#db)
|
|
146
|
+
.prepare(
|
|
147
|
+
`DELETE FROM openauth_flows WHERE flow_id = ?1 RETURNING payload, expires_at`,
|
|
148
|
+
)
|
|
149
|
+
.bind(flowId)
|
|
150
|
+
.first<{ payload: string; expires_at: number }>()
|
|
151
|
+
} catch (e) {
|
|
152
|
+
return err(authError.internalError("consumeFlow: query failed", e))
|
|
153
|
+
}
|
|
154
|
+
if (!row) {
|
|
155
|
+
return err(
|
|
156
|
+
authError.unknownState(`flow "${flowId}" unknown or already consumed`),
|
|
157
|
+
)
|
|
158
|
+
}
|
|
159
|
+
if (this.#clock() >= Number(row.expires_at)) {
|
|
160
|
+
return err(authError.unknownState(`flow "${flowId}" expired`))
|
|
161
|
+
}
|
|
162
|
+
return ok(JSON.parse(row.payload) as FlowRecord)
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
async createSession(
|
|
166
|
+
sessionId: string,
|
|
167
|
+
payload: SessionRecord,
|
|
168
|
+
ttl: number,
|
|
169
|
+
): Promise<Result<void>> {
|
|
170
|
+
if (ttl <= 0) {
|
|
171
|
+
return err(
|
|
172
|
+
authError.internalError(
|
|
173
|
+
`createSession: ttl must be positive, got ${ttl}`,
|
|
174
|
+
),
|
|
175
|
+
)
|
|
176
|
+
}
|
|
177
|
+
const expiresAt = this.#clock() + ttl
|
|
178
|
+
try {
|
|
179
|
+
await primarySession(this.#db)
|
|
180
|
+
.prepare(
|
|
181
|
+
`INSERT INTO openauth_sessions (session_id, payload, expires_at) VALUES (?1, ?2, ?3)
|
|
182
|
+
ON CONFLICT(session_id) DO UPDATE SET payload = excluded.payload, expires_at = excluded.expires_at`,
|
|
183
|
+
)
|
|
184
|
+
.bind(sessionId, JSON.stringify(payload), expiresAt)
|
|
185
|
+
.run()
|
|
186
|
+
} catch (e) {
|
|
187
|
+
return err(authError.internalError("createSession: insert failed", e))
|
|
188
|
+
}
|
|
189
|
+
return ok(undefined)
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
async readSession(sessionId: string): Promise<Result<SessionRecord>> {
|
|
193
|
+
let row: { payload: string; expires_at: number } | null
|
|
194
|
+
try {
|
|
195
|
+
row = await primarySession(this.#db)
|
|
196
|
+
.prepare(
|
|
197
|
+
`SELECT payload, expires_at FROM openauth_sessions WHERE session_id = ?1`,
|
|
198
|
+
)
|
|
199
|
+
.bind(sessionId)
|
|
200
|
+
.first<{ payload: string; expires_at: number }>()
|
|
201
|
+
} catch (e) {
|
|
202
|
+
return err(authError.internalError("readSession: query failed", e))
|
|
203
|
+
}
|
|
204
|
+
if (!row) {
|
|
205
|
+
return err(authError.invalidRequest(`session "${sessionId}" unknown`))
|
|
206
|
+
}
|
|
207
|
+
if (this.#clock() >= Number(row.expires_at)) {
|
|
208
|
+
try {
|
|
209
|
+
await primarySession(this.#db)
|
|
210
|
+
.prepare(`DELETE FROM openauth_sessions WHERE session_id = ?1`)
|
|
211
|
+
.bind(sessionId)
|
|
212
|
+
.run()
|
|
213
|
+
} catch {}
|
|
214
|
+
return err(authError.invalidRequest(`session "${sessionId}" expired`))
|
|
215
|
+
}
|
|
216
|
+
return ok(JSON.parse(row.payload) as SessionRecord)
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
async revokeSession(sessionId: string): Promise<Result<void>> {
|
|
220
|
+
try {
|
|
221
|
+
await primarySession(this.#db)
|
|
222
|
+
.prepare(`DELETE FROM openauth_sessions WHERE session_id = ?1`)
|
|
223
|
+
.bind(sessionId)
|
|
224
|
+
.run()
|
|
225
|
+
} catch (e) {
|
|
226
|
+
return err(authError.internalError("revokeSession: delete failed", e))
|
|
227
|
+
}
|
|
228
|
+
return ok(undefined)
|
|
229
|
+
}
|
|
230
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sessions-API helper. Wraps a `D1Database` in a session pinned to the
|
|
3
|
+
* primary node for read-after-write consistency on security-critical paths.
|
|
4
|
+
*
|
|
5
|
+
* If the bundled `D1Database` lacks `withSession` (older runtime), the
|
|
6
|
+
* helper returns the plain `db` and the caller pays no Sessions-API cost
|
|
7
|
+
* (and gets eventual-consistency reads — documented in the adapter's
|
|
8
|
+
* top-level JSDoc).
|
|
9
|
+
*/
|
|
10
|
+
import type {
|
|
11
|
+
AnyD1Database,
|
|
12
|
+
D1DatabaseSession,
|
|
13
|
+
D1DatabaseWithSessions,
|
|
14
|
+
} from "./types"
|
|
15
|
+
|
|
16
|
+
export function isSessionsCapable(
|
|
17
|
+
db: AnyD1Database,
|
|
18
|
+
): db is D1DatabaseWithSessions {
|
|
19
|
+
return typeof (db as D1DatabaseWithSessions).withSession === "function"
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Open a Sessions-API session pinned to the primary node. All `prepare` calls
|
|
24
|
+
* inside the session see the latest writes; bookmarks may be threaded across
|
|
25
|
+
* requests by the caller if needed.
|
|
26
|
+
*/
|
|
27
|
+
export function primarySession(db: AnyD1Database): D1DatabaseSession {
|
|
28
|
+
if (isSessionsCapable(db)) {
|
|
29
|
+
return db.withSession("first-primary")
|
|
30
|
+
}
|
|
31
|
+
// Test shim / older runtime — fall back to the database itself, which
|
|
32
|
+
// exposes the same `prepare` / `batch` shape. `getBookmark` returns null.
|
|
33
|
+
return {
|
|
34
|
+
prepare: (q) => db.prepare(q),
|
|
35
|
+
batch: (s) => db.batch(s),
|
|
36
|
+
getBookmark: () => null,
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* D1 `TokenStore`. SQL-identical to the Postgres adapter except for SQLite
|
|
3
|
+
* dialect (`?N` binds, JSON-as-TEXT, BLOB) and the Sessions-API wrapping
|
|
4
|
+
* for read-after-write consistency.
|
|
5
|
+
*
|
|
6
|
+
* Every operation here is on the security-critical path and uses
|
|
7
|
+
* `primarySession(db)` so reads always see the latest write — per AD8 + the
|
|
8
|
+
* D1 read-replication caveat in `ports/CONSISTENCY.md`.
|
|
9
|
+
*/
|
|
10
|
+
import { AUTH_CODE_TTL_MS } from "../../domain/authorize"
|
|
11
|
+
import type { KeyStore } from "../../ports/key-store"
|
|
12
|
+
import type { TokenStore } from "../../ports/token-store"
|
|
13
|
+
import { authError } from "../../types/error"
|
|
14
|
+
import type { Result } from "../../types/result"
|
|
15
|
+
import { err, ok } from "../../types/result"
|
|
16
|
+
import type { TenantId } from "../../types/tenant"
|
|
17
|
+
import type { RefreshTokenPayload } from "../../types/token"
|
|
18
|
+
|
|
19
|
+
import { primarySession } from "./session"
|
|
20
|
+
import type { AnyD1Database } from "./types"
|
|
21
|
+
|
|
22
|
+
export type D1TokenStoreOptions = {
|
|
23
|
+
db: AnyD1Database
|
|
24
|
+
/**
|
|
25
|
+
* Optional — retained for API stability after M1 moved code-payload
|
|
26
|
+
* encryption to the domain layer. The adapter no longer touches it.
|
|
27
|
+
*/
|
|
28
|
+
keyStore?: KeyStore
|
|
29
|
+
clock?: () => number
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export class D1TokenStore implements TokenStore {
|
|
33
|
+
#db: AnyD1Database
|
|
34
|
+
#clock: () => number
|
|
35
|
+
|
|
36
|
+
constructor(opts: D1TokenStoreOptions) {
|
|
37
|
+
this.#db = opts.db
|
|
38
|
+
this.#clock = opts.clock ?? (() => Date.now())
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async saveCode(
|
|
42
|
+
code: string,
|
|
43
|
+
ciphertext: string,
|
|
44
|
+
ttl: number,
|
|
45
|
+
): Promise<Result<void>> {
|
|
46
|
+
if (ttl <= 0 || ttl > AUTH_CODE_TTL_MS) {
|
|
47
|
+
return err(
|
|
48
|
+
authError.internalError(
|
|
49
|
+
`saveCode: ttl ${ttl} outside (0, ${AUTH_CODE_TTL_MS}] (auth-code TTL is fixed at 60s by OAuth 2.1 BCP)`,
|
|
50
|
+
),
|
|
51
|
+
)
|
|
52
|
+
}
|
|
53
|
+
const expiresAt = this.#clock() + ttl
|
|
54
|
+
try {
|
|
55
|
+
await primarySession(this.#db)
|
|
56
|
+
.prepare(
|
|
57
|
+
`INSERT INTO openauth_codes (code, ciphertext, expires_at) VALUES (?1, ?2, ?3)`,
|
|
58
|
+
)
|
|
59
|
+
.bind(code, ciphertext, expiresAt)
|
|
60
|
+
.run()
|
|
61
|
+
} catch (e) {
|
|
62
|
+
return err(authError.internalError("saveCode: insert failed", e))
|
|
63
|
+
}
|
|
64
|
+
return ok(undefined)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
async consumeCode(code: string): Promise<Result<string>> {
|
|
68
|
+
let row: { ciphertext: string; expires_at: number } | null
|
|
69
|
+
try {
|
|
70
|
+
row = await primarySession(this.#db)
|
|
71
|
+
.prepare(
|
|
72
|
+
`DELETE FROM openauth_codes WHERE code = ?1 RETURNING ciphertext, expires_at`,
|
|
73
|
+
)
|
|
74
|
+
.bind(code)
|
|
75
|
+
.first<{ ciphertext: string; expires_at: number }>()
|
|
76
|
+
} catch (e) {
|
|
77
|
+
return err(authError.internalError("consumeCode: query failed", e))
|
|
78
|
+
}
|
|
79
|
+
if (!row) {
|
|
80
|
+
return err(
|
|
81
|
+
authError.invalidGrant("auth code unknown or already consumed"),
|
|
82
|
+
)
|
|
83
|
+
}
|
|
84
|
+
if (this.#clock() >= Number(row.expires_at)) {
|
|
85
|
+
return err(authError.invalidGrant("auth code expired"))
|
|
86
|
+
}
|
|
87
|
+
return ok(row.ciphertext)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async saveRefresh(
|
|
91
|
+
refresh: string,
|
|
92
|
+
payload: RefreshTokenPayload,
|
|
93
|
+
): Promise<Result<void>> {
|
|
94
|
+
try {
|
|
95
|
+
await primarySession(this.#db)
|
|
96
|
+
.prepare(
|
|
97
|
+
`INSERT INTO openauth_refresh_tokens
|
|
98
|
+
(token, tenant_id, client_id, subject_id, family, expires_at, payload)
|
|
99
|
+
VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)`,
|
|
100
|
+
)
|
|
101
|
+
.bind(
|
|
102
|
+
refresh,
|
|
103
|
+
payload.tenantId,
|
|
104
|
+
payload.clientId,
|
|
105
|
+
payload.subjectId,
|
|
106
|
+
payload.family,
|
|
107
|
+
payload.expiresAt,
|
|
108
|
+
JSON.stringify(payload),
|
|
109
|
+
)
|
|
110
|
+
.run()
|
|
111
|
+
} catch (e) {
|
|
112
|
+
return err(authError.internalError("saveRefresh: insert failed", e))
|
|
113
|
+
}
|
|
114
|
+
return ok(undefined)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
async consumeRefresh(
|
|
118
|
+
refresh: string,
|
|
119
|
+
options: { reuseWindowMs?: number } = {},
|
|
120
|
+
): Promise<Result<RefreshTokenPayload>> {
|
|
121
|
+
const reuseWindow = options.reuseWindowMs ?? 60_000
|
|
122
|
+
const now = this.#clock()
|
|
123
|
+
const session = primarySession(this.#db)
|
|
124
|
+
// Atomic claim — SQLite's UPDATE ... RETURNING is available from 3.35
|
|
125
|
+
// (D1 ships much newer). One row out means we won the race.
|
|
126
|
+
let claimed: { payload: string } | null
|
|
127
|
+
try {
|
|
128
|
+
claimed = await session
|
|
129
|
+
.prepare(
|
|
130
|
+
`UPDATE openauth_refresh_tokens
|
|
131
|
+
SET consumed_at = ?1
|
|
132
|
+
WHERE token = ?2
|
|
133
|
+
AND consumed_at IS NULL
|
|
134
|
+
AND expires_at > ?1
|
|
135
|
+
RETURNING payload`,
|
|
136
|
+
)
|
|
137
|
+
.bind(now, refresh)
|
|
138
|
+
.first<{ payload: string }>()
|
|
139
|
+
} catch (e) {
|
|
140
|
+
return err(authError.internalError("consumeRefresh: claim failed", e))
|
|
141
|
+
}
|
|
142
|
+
if (claimed) {
|
|
143
|
+
return ok(parseRefresh(claimed.payload))
|
|
144
|
+
}
|
|
145
|
+
// No claim — figure out why.
|
|
146
|
+
let existing: {
|
|
147
|
+
consumed_at: number | null
|
|
148
|
+
expires_at: number
|
|
149
|
+
payload: string
|
|
150
|
+
} | null
|
|
151
|
+
try {
|
|
152
|
+
existing = await session
|
|
153
|
+
.prepare(
|
|
154
|
+
`SELECT consumed_at, expires_at, payload
|
|
155
|
+
FROM openauth_refresh_tokens
|
|
156
|
+
WHERE token = ?1`,
|
|
157
|
+
)
|
|
158
|
+
.bind(refresh)
|
|
159
|
+
.first<{
|
|
160
|
+
consumed_at: number | null
|
|
161
|
+
expires_at: number
|
|
162
|
+
payload: string
|
|
163
|
+
}>()
|
|
164
|
+
} catch (e) {
|
|
165
|
+
return err(authError.internalError("consumeRefresh: lookup failed", e))
|
|
166
|
+
}
|
|
167
|
+
if (!existing) {
|
|
168
|
+
return err(authError.invalidGrant("refresh token unknown"))
|
|
169
|
+
}
|
|
170
|
+
if (existing.consumed_at !== null && existing.consumed_at !== undefined) {
|
|
171
|
+
const consumedAt = Number(existing.consumed_at)
|
|
172
|
+
const withinWindow = now - consumedAt <= reuseWindow
|
|
173
|
+
if (withinWindow) {
|
|
174
|
+
const payload = parseRefresh(existing.payload)
|
|
175
|
+
await this.revokeFamily(payload.family)
|
|
176
|
+
return err(
|
|
177
|
+
authError.invalidGrant(
|
|
178
|
+
`refresh token reuse detected (family=${payload.family})`,
|
|
179
|
+
{
|
|
180
|
+
family: payload.family,
|
|
181
|
+
tenantId: payload.tenantId,
|
|
182
|
+
subjectId: payload.subjectId,
|
|
183
|
+
},
|
|
184
|
+
),
|
|
185
|
+
)
|
|
186
|
+
}
|
|
187
|
+
return err(authError.invalidGrant("refresh token already consumed"))
|
|
188
|
+
}
|
|
189
|
+
if (now >= Number(existing.expires_at)) {
|
|
190
|
+
return err(authError.invalidGrant("refresh token expired"))
|
|
191
|
+
}
|
|
192
|
+
return err(authError.internalError("consumeRefresh: unexplained miss"))
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
async peekRefresh(refresh: string): Promise<Result<RefreshTokenPayload>> {
|
|
196
|
+
let row: { expires_at: number; payload: string } | null
|
|
197
|
+
try {
|
|
198
|
+
row = await primarySession(this.#db)
|
|
199
|
+
.prepare(
|
|
200
|
+
`SELECT expires_at, payload
|
|
201
|
+
FROM openauth_refresh_tokens
|
|
202
|
+
WHERE token = ?1`,
|
|
203
|
+
)
|
|
204
|
+
.bind(refresh)
|
|
205
|
+
.first<{ expires_at: number; payload: string }>()
|
|
206
|
+
} catch (e) {
|
|
207
|
+
return err(authError.internalError("peekRefresh: lookup failed", e))
|
|
208
|
+
}
|
|
209
|
+
if (!row) {
|
|
210
|
+
return err(authError.invalidGrant("refresh token unknown"))
|
|
211
|
+
}
|
|
212
|
+
if (this.#clock() >= Number(row.expires_at)) {
|
|
213
|
+
return err(authError.invalidGrant("refresh token expired"))
|
|
214
|
+
}
|
|
215
|
+
return ok(parseRefresh(row.payload))
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
async revokeFamily(family: string): Promise<Result<void>> {
|
|
219
|
+
try {
|
|
220
|
+
await primarySession(this.#db)
|
|
221
|
+
.prepare(`DELETE FROM openauth_refresh_tokens WHERE family = ?1`)
|
|
222
|
+
.bind(family)
|
|
223
|
+
.run()
|
|
224
|
+
} catch (e) {
|
|
225
|
+
return err(authError.internalError("revokeFamily: delete failed", e))
|
|
226
|
+
}
|
|
227
|
+
return ok(undefined)
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
async revokeBySubject(
|
|
231
|
+
tenantId: TenantId,
|
|
232
|
+
subjectId: string,
|
|
233
|
+
): Promise<Result<void>> {
|
|
234
|
+
try {
|
|
235
|
+
await primarySession(this.#db)
|
|
236
|
+
.prepare(
|
|
237
|
+
`DELETE FROM openauth_refresh_tokens WHERE tenant_id = ?1 AND subject_id = ?2`,
|
|
238
|
+
)
|
|
239
|
+
.bind(tenantId, subjectId)
|
|
240
|
+
.run()
|
|
241
|
+
} catch (e) {
|
|
242
|
+
return err(authError.internalError("revokeBySubject: delete failed", e))
|
|
243
|
+
}
|
|
244
|
+
return ok(undefined)
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
function parseRefresh(raw: string | RefreshTokenPayload): RefreshTokenPayload {
|
|
249
|
+
if (typeof raw === "string") return JSON.parse(raw) as RefreshTokenPayload
|
|
250
|
+
return raw
|
|
251
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* D1 type extensions.
|
|
3
|
+
*
|
|
4
|
+
* `@cloudflare/workers-types` < 2024-12 does not yet expose the D1 Sessions
|
|
5
|
+
* API on its `D1Database` class. We declare the augmentation locally and
|
|
6
|
+
* feature-detect at runtime: if `db.withSession` is a function the adapter
|
|
7
|
+
* uses it for read-after-write consistency on the security-critical paths;
|
|
8
|
+
* otherwise it falls back to plain `prepare`. This keeps the adapter
|
|
9
|
+
* type-safe today and forward-compatible when the workers-types release
|
|
10
|
+
* catches up.
|
|
11
|
+
*/
|
|
12
|
+
import type {
|
|
13
|
+
D1Database,
|
|
14
|
+
D1PreparedStatement,
|
|
15
|
+
D1Result,
|
|
16
|
+
} from "@cloudflare/workers-types"
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* D1 Sessions API constraints. Documented at
|
|
20
|
+
* <https://developers.cloudflare.com/d1/best-practices/read-replication/>.
|
|
21
|
+
* - `"first-primary"` — pin the session to the primary node. All reads see
|
|
22
|
+
* the latest write. Used for security-critical paths.
|
|
23
|
+
* - `"first-unconstrained"` — pin to whichever node responds first. Lower
|
|
24
|
+
* latency, eventual consistency. Used for JWKS / config reads.
|
|
25
|
+
*/
|
|
26
|
+
export type D1SessionConstraint = "first-primary" | "first-unconstrained"
|
|
27
|
+
|
|
28
|
+
/** A session bookmark — opaque token returned by `getBookmark()`. */
|
|
29
|
+
export type D1SessionBookmark = string
|
|
30
|
+
|
|
31
|
+
/** Minimal shape we use from `D1DatabaseSession`. */
|
|
32
|
+
export type D1DatabaseSession = {
|
|
33
|
+
prepare(query: string): D1PreparedStatement
|
|
34
|
+
batch<T = unknown>(statements: D1PreparedStatement[]): Promise<D1Result<T>[]>
|
|
35
|
+
getBookmark(): D1SessionBookmark | null
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* `D1Database` with the Sessions API. Use this type at the adapter boundary;
|
|
40
|
+
* the runtime feature-detects `withSession` so consumers can still pass a
|
|
41
|
+
* plain `D1Database` if Sessions is unavailable in their environment.
|
|
42
|
+
*/
|
|
43
|
+
export type D1DatabaseWithSessions = D1Database & {
|
|
44
|
+
withSession(
|
|
45
|
+
constraintOrBookmark?: D1SessionConstraint | D1SessionBookmark,
|
|
46
|
+
): D1DatabaseSession
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Either a real D1Database or our test shim. Feature detection happens at
|
|
51
|
+
* call time so the adapter still works against both.
|
|
52
|
+
*/
|
|
53
|
+
export type AnyD1Database = D1Database | D1DatabaseWithSessions
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare Durable Objects adapters.
|
|
3
|
+
*
|
|
4
|
+
* Durable Objects are an excellent fit for `SessionStore` (flow records)
|
|
5
|
+
* because every operation on a single DO instance is serialized — atomic
|
|
6
|
+
* delete-on-read comes for free with `storage.transaction`. Per
|
|
7
|
+
* `ports/CONSISTENCY.md`, DOs are also acceptable for `TokenStore` in
|
|
8
|
+
* deployments that don't run D1.
|
|
9
|
+
*
|
|
10
|
+
* The adapter is supplied a `DurableObjectStorage` directly (`this.ctx.storage`
|
|
11
|
+
* from inside a DO class). Users wire their own DO class around the adapter
|
|
12
|
+
* and forward RPC / fetch calls to the methods. See the JSDoc on
|
|
13
|
+
* `DurableObjectSessionStore` for the canonical wiring pattern.
|
|
14
|
+
*/
|
|
15
|
+
export {
|
|
16
|
+
DurableObjectSessionStore,
|
|
17
|
+
type DurableObjectSessionStoreOptions,
|
|
18
|
+
} from "./session-store"
|
|
19
|
+
|
|
20
|
+
export type {
|
|
21
|
+
DurableObjectStorageLike,
|
|
22
|
+
DurableObjectTransactionLike,
|
|
23
|
+
} from "./types"
|