@robelest/convex-auth 0.0.4-preview.18 → 0.0.4-preview.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -3
- package/dist/authorization/index.d.ts +46 -0
- package/dist/authorization/index.d.ts.map +1 -1
- package/dist/authorization/index.js +46 -0
- package/dist/authorization/index.js.map +1 -1
- package/dist/bin.cjs +21 -13
- package/dist/client/core/types.d.ts +20 -0
- package/dist/client/core/types.d.ts.map +1 -0
- package/dist/client/index.d.ts +2 -16
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +67 -565
- package/dist/client/index.js.map +1 -1
- package/dist/component/_generated/api.d.ts +40 -12
- package/dist/component/_generated/api.d.ts.map +1 -1
- package/dist/component/_generated/api.js.map +1 -1
- package/dist/component/_generated/component.d.ts +1306 -1344
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/client/core/types.d.ts +2 -0
- package/dist/component/client/index.d.ts +2 -2
- package/dist/component/model.d.ts +80 -80
- package/dist/component/model.d.ts.map +1 -1
- package/dist/component/model.js +5 -1
- package/dist/component/model.js.map +1 -1
- package/dist/component/providers/credentials.d.ts +3 -2
- package/dist/component/providers/credentials.d.ts.map +1 -1
- package/dist/component/providers/email.d.ts +30 -0
- package/dist/component/providers/email.d.ts.map +1 -1
- package/dist/component/providers/phone.d.ts +28 -0
- package/dist/component/providers/phone.d.ts.map +1 -1
- package/dist/component/public/enterprise/audit.d.ts +73 -0
- package/dist/component/public/enterprise/audit.d.ts.map +1 -0
- package/dist/component/public/enterprise/audit.js +108 -0
- package/dist/component/public/enterprise/audit.js.map +1 -0
- package/dist/component/public/enterprise/core.d.ts +176 -0
- package/dist/component/public/enterprise/core.d.ts.map +1 -0
- package/dist/component/public/enterprise/core.js +292 -0
- package/dist/component/public/enterprise/core.js.map +1 -0
- package/dist/component/public/enterprise/domains.d.ts +174 -0
- package/dist/component/public/enterprise/domains.d.ts.map +1 -0
- package/dist/component/public/enterprise/domains.js +271 -0
- package/dist/component/public/enterprise/domains.js.map +1 -0
- package/dist/component/public/enterprise/scim.d.ts +245 -0
- package/dist/component/public/enterprise/scim.d.ts.map +1 -0
- package/dist/component/public/enterprise/scim.js +344 -0
- package/dist/component/public/enterprise/scim.js.map +1 -0
- package/dist/component/public/enterprise/secrets.d.ts +78 -0
- package/dist/component/public/enterprise/secrets.d.ts.map +1 -0
- package/dist/component/public/enterprise/secrets.js +118 -0
- package/dist/component/public/enterprise/secrets.js.map +1 -0
- package/dist/component/public/enterprise/webhooks.d.ts +211 -0
- package/dist/component/public/enterprise/webhooks.d.ts.map +1 -0
- package/dist/component/public/enterprise/webhooks.js +300 -0
- package/dist/component/public/enterprise/webhooks.js.map +1 -0
- package/dist/component/public/factors/devices.d.ts +157 -0
- package/dist/component/public/factors/devices.d.ts.map +1 -0
- package/dist/component/public/factors/devices.js +216 -0
- package/dist/component/public/factors/devices.js.map +1 -0
- package/dist/component/public/factors/passkeys.d.ts +175 -0
- package/dist/component/public/factors/passkeys.d.ts.map +1 -0
- package/dist/component/public/factors/passkeys.js +238 -0
- package/dist/component/public/factors/passkeys.js.map +1 -0
- package/dist/component/public/factors/totp.d.ts +189 -0
- package/dist/component/public/factors/totp.d.ts.map +1 -0
- package/dist/component/public/factors/totp.js +254 -0
- package/dist/component/public/factors/totp.js.map +1 -0
- package/dist/component/public/groups/core.d.ts +137 -0
- package/dist/component/public/groups/core.d.ts.map +1 -0
- package/dist/component/public/groups/core.js +321 -0
- package/dist/component/public/groups/core.js.map +1 -0
- package/dist/component/public/groups/invites.d.ts +217 -0
- package/dist/component/public/groups/invites.d.ts.map +1 -0
- package/dist/component/public/groups/invites.js +457 -0
- package/dist/component/public/groups/invites.js.map +1 -0
- package/dist/component/public/groups/members.d.ts +204 -0
- package/dist/component/public/groups/members.d.ts.map +1 -0
- package/dist/component/public/groups/members.js +355 -0
- package/dist/component/public/groups/members.js.map +1 -0
- package/dist/component/public/identity/accounts.d.ts +147 -0
- package/dist/component/public/identity/accounts.d.ts.map +1 -0
- package/dist/component/public/identity/accounts.js +200 -0
- package/dist/component/public/identity/accounts.js.map +1 -0
- package/dist/component/public/identity/codes.d.ts +104 -0
- package/dist/component/public/identity/codes.d.ts.map +1 -0
- package/dist/component/public/identity/codes.js +140 -0
- package/dist/component/public/identity/codes.js.map +1 -0
- package/dist/component/public/identity/sessions.d.ts +128 -0
- package/dist/component/public/identity/sessions.d.ts.map +1 -0
- package/dist/component/public/identity/sessions.js +192 -0
- package/dist/component/public/identity/sessions.js.map +1 -0
- package/dist/component/public/identity/tokens.d.ts +169 -0
- package/dist/component/public/identity/tokens.d.ts.map +1 -0
- package/dist/component/public/identity/tokens.js +227 -0
- package/dist/component/public/identity/tokens.js.map +1 -0
- package/dist/component/public/identity/users.d.ts +212 -0
- package/dist/component/public/identity/users.d.ts.map +1 -0
- package/dist/component/public/identity/users.js +311 -0
- package/dist/component/public/identity/users.js.map +1 -0
- package/dist/component/public/identity/verifiers.d.ts +116 -0
- package/dist/component/public/identity/verifiers.d.ts.map +1 -0
- package/dist/component/public/identity/verifiers.js +154 -0
- package/dist/component/public/identity/verifiers.js.map +1 -0
- package/dist/component/public/security/keys.d.ts +209 -0
- package/dist/component/public/security/keys.d.ts.map +1 -0
- package/dist/component/public/security/keys.js +319 -0
- package/dist/component/public/security/keys.js.map +1 -0
- package/dist/component/public/security/limits.d.ts +114 -0
- package/dist/component/public/security/limits.d.ts.map +1 -0
- package/dist/component/public/security/limits.js +169 -0
- package/dist/component/public/security/limits.js.map +1 -0
- package/dist/component/public.d.ts +22 -7
- package/dist/component/public.js +21 -6
- package/dist/component/schema.d.ts +288 -288
- package/dist/component/server/auth.d.ts +212 -25
- package/dist/component/server/auth.d.ts.map +1 -1
- package/dist/component/server/auth.js +68 -4
- package/dist/component/server/auth.js.map +1 -1
- package/dist/component/server/authError.js +34 -0
- package/dist/component/server/authError.js.map +1 -0
- package/dist/component/server/{providers.js → config.js} +2 -2
- package/dist/component/server/config.js.map +1 -0
- package/dist/component/server/{domains/core.js → core.js} +107 -88
- package/dist/component/server/core.js.map +1 -0
- package/dist/component/server/{provider.js → crypto.js} +3 -3
- package/dist/component/server/crypto.js.map +1 -0
- package/dist/component/server/device.js +1 -1
- package/dist/component/server/device.js.map +1 -1
- package/dist/component/server/enterprise/config.js +46 -0
- package/dist/component/server/enterprise/config.js.map +1 -0
- package/dist/component/server/{domains/sso.js → enterprise/domain.js} +6 -5
- package/dist/component/server/enterprise/domain.js.map +1 -0
- package/dist/component/server/enterprise/http.js +766 -0
- package/dist/component/server/enterprise/http.js.map +1 -0
- package/dist/component/server/enterprise/oidc.js +248 -0
- package/dist/component/server/enterprise/oidc.js.map +1 -0
- package/dist/component/server/enterprise/policy.js +85 -0
- package/dist/component/server/enterprise/policy.js.map +1 -0
- package/dist/component/server/enterprise/saml.js +338 -0
- package/dist/component/server/enterprise/saml.js.map +1 -0
- package/dist/component/server/enterprise/scim.js +97 -0
- package/dist/component/server/enterprise/scim.js.map +1 -0
- package/dist/component/server/enterprise/shared.js +51 -0
- package/dist/component/server/enterprise/shared.js.map +1 -0
- package/dist/component/server/errors.js.map +1 -1
- package/dist/component/server/http.js +2 -1
- package/dist/component/server/http.js.map +1 -1
- package/dist/component/server/identity.js +1 -1
- package/dist/component/server/identity.js.map +1 -1
- package/dist/component/server/{ratelimit.js → limits.js} +3 -3
- package/dist/component/server/limits.js.map +1 -0
- package/dist/component/server/mutations/account.js +3 -3
- package/dist/component/server/mutations/account.js.map +1 -1
- package/dist/component/server/mutations/code.js +2 -2
- package/dist/component/server/mutations/code.js.map +1 -1
- package/dist/component/server/mutations/invalidate.js +1 -1
- package/dist/component/server/mutations/invalidate.js.map +1 -1
- package/dist/component/server/mutations/oauth.js +5 -3
- package/dist/component/server/mutations/oauth.js.map +1 -1
- package/dist/component/server/mutations/refresh.js +1 -1
- package/dist/component/server/mutations/refresh.js.map +1 -1
- package/dist/component/server/mutations/register.js +3 -3
- package/dist/component/server/mutations/register.js.map +1 -1
- package/dist/component/server/mutations/retrieve.js +4 -4
- package/dist/component/server/mutations/retrieve.js.map +1 -1
- package/dist/component/server/mutations/signature.js +2 -2
- package/dist/component/server/mutations/signature.js.map +1 -1
- package/dist/component/server/mutations/signin.js +1 -1
- package/dist/component/server/mutations/signin.js.map +1 -1
- package/dist/component/server/mutations/signout.js +1 -1
- package/dist/component/server/mutations/signout.js.map +1 -1
- package/dist/component/server/mutations/store/refs.js +15 -0
- package/dist/component/server/mutations/store/refs.js.map +1 -0
- package/dist/component/server/mutations/store.js +80 -10
- package/dist/component/server/mutations/store.js.map +1 -1
- package/dist/component/server/mutations/verifier.js +1 -1
- package/dist/component/server/mutations/verifier.js.map +1 -1
- package/dist/component/server/mutations/verify.js +4 -3
- package/dist/component/server/mutations/verify.js.map +1 -1
- package/dist/component/server/oauth.js +1 -1
- package/dist/component/server/oauth.js.map +1 -1
- package/dist/component/server/passkey.js +2 -1
- package/dist/component/server/passkey.js.map +1 -1
- package/dist/component/server/redirects.js +1 -1
- package/dist/component/server/redirects.js.map +1 -1
- package/dist/component/server/refresh.js +1 -1
- package/dist/component/server/refresh.js.map +1 -1
- package/dist/component/server/{factory.d.ts → runtime.d.ts} +2 -2
- package/dist/component/server/runtime.d.ts.map +1 -0
- package/dist/component/server/runtime.js +413 -0
- package/dist/component/server/runtime.js.map +1 -0
- package/dist/component/server/signin.js +2 -1
- package/dist/component/server/signin.js.map +1 -1
- package/dist/component/server/totp.js +2 -1
- package/dist/component/server/totp.js.map +1 -1
- package/dist/component/server/types.d.ts +225 -41
- package/dist/component/server/types.d.ts.map +1 -1
- package/dist/component/server/types.js.map +1 -1
- package/dist/component/server/users.js +1 -1
- package/dist/component/server/users.js.map +1 -1
- package/dist/component/server/utils.js +1 -1
- package/dist/component/server/utils.js.map +1 -1
- package/dist/core/types.d.ts +369 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/factors/device.js +105 -0
- package/dist/factors/device.js.map +1 -0
- package/dist/factors/passkey.js +181 -0
- package/dist/factors/passkey.js.map +1 -0
- package/dist/factors/totp.js +122 -0
- package/dist/factors/totp.js.map +1 -0
- package/dist/providers/credentials.d.ts +5 -2
- package/dist/providers/credentials.d.ts.map +1 -1
- package/dist/providers/credentials.js +2 -0
- package/dist/providers/credentials.js.map +1 -1
- package/dist/providers/email.d.ts +30 -0
- package/dist/providers/email.d.ts.map +1 -1
- package/dist/providers/email.js +24 -0
- package/dist/providers/email.js.map +1 -1
- package/dist/providers/phone.d.ts +28 -0
- package/dist/providers/phone.d.ts.map +1 -1
- package/dist/providers/phone.js +22 -0
- package/dist/providers/phone.js.map +1 -1
- package/dist/runtime/browser.js +68 -0
- package/dist/runtime/browser.js.map +1 -0
- package/dist/runtime/invite.js +51 -0
- package/dist/runtime/invite.js.map +1 -0
- package/dist/runtime/proxy.js +70 -0
- package/dist/runtime/proxy.js.map +1 -0
- package/dist/runtime/storage.js +37 -0
- package/dist/runtime/storage.js.map +1 -0
- package/dist/server/auth.d.ts +218 -28
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +68 -4
- package/dist/server/auth.js.map +1 -1
- package/dist/server/{fx.d.ts → authError.d.ts} +25 -15
- package/dist/server/authError.d.ts.map +1 -0
- package/dist/server/authError.js +34 -0
- package/dist/server/authError.js.map +1 -0
- package/dist/server/{providers.js → config.js} +2 -2
- package/dist/server/config.js.map +1 -0
- package/dist/server/core.d.ts +1436 -0
- package/dist/server/core.d.ts.map +1 -0
- package/dist/server/{domains/core.js → core.js} +107 -88
- package/dist/server/core.js.map +1 -0
- package/dist/server/{provider.d.ts → crypto.d.ts} +2 -2
- package/dist/server/crypto.d.ts.map +1 -0
- package/dist/server/{provider.js → crypto.js} +3 -3
- package/dist/{component/server/provider.js.map → server/crypto.js.map} +1 -1
- package/dist/server/device.js +1 -1
- package/dist/server/device.js.map +1 -1
- package/dist/server/enterprise/config.js +46 -0
- package/dist/server/enterprise/config.js.map +1 -0
- package/dist/server/{domains/sso.d.ts → enterprise/domain.d.ts} +4 -4
- package/dist/server/enterprise/domain.d.ts.map +1 -0
- package/dist/server/{domains/sso.js → enterprise/domain.js} +6 -5
- package/dist/server/enterprise/domain.js.map +1 -0
- package/dist/server/enterprise/http.d.ts +26 -0
- package/dist/server/enterprise/http.d.ts.map +1 -0
- package/dist/server/enterprise/http.js +766 -0
- package/dist/server/enterprise/http.js.map +1 -0
- package/dist/server/enterprise/oidc.js +248 -0
- package/dist/server/enterprise/oidc.js.map +1 -0
- package/dist/server/enterprise/policy.js +85 -0
- package/dist/server/enterprise/policy.js.map +1 -0
- package/dist/server/enterprise/saml.d.ts +1 -0
- package/dist/server/enterprise/saml.js +338 -0
- package/dist/server/enterprise/saml.js.map +1 -0
- package/dist/server/enterprise/scim.d.ts +1 -0
- package/dist/server/enterprise/scim.js +97 -0
- package/dist/server/enterprise/scim.js.map +1 -0
- package/dist/server/enterprise/shared.d.ts +5 -0
- package/dist/server/enterprise/shared.d.ts.map +1 -0
- package/dist/server/enterprise/shared.js +51 -0
- package/dist/server/enterprise/shared.js.map +1 -0
- package/dist/server/enterprise/validators.d.ts +1 -0
- package/dist/server/{enterpriseValidators.js → enterprise/validators.js} +2 -2
- package/dist/server/enterprise/validators.js.map +1 -0
- package/dist/server/errors.d.ts +2 -0
- package/dist/server/errors.d.ts.map +1 -1
- package/dist/server/errors.js +2 -0
- package/dist/server/errors.js.map +1 -1
- package/dist/server/http.d.ts +2 -2
- package/dist/server/http.d.ts.map +1 -1
- package/dist/server/http.js +2 -1
- package/dist/server/http.js.map +1 -1
- package/dist/server/identity.js +1 -1
- package/dist/server/identity.js.map +1 -1
- package/dist/server/index.d.ts +4 -705
- package/dist/server/index.js +4 -1367
- package/dist/server/limits.d.ts +1 -0
- package/dist/server/{ratelimit.js → limits.js} +3 -3
- package/dist/server/limits.js.map +1 -0
- package/dist/server/mounts.d.ts +647 -0
- package/dist/server/mounts.d.ts.map +1 -0
- package/dist/server/mounts.js +643 -0
- package/dist/server/mounts.js.map +1 -0
- package/dist/server/mutations/account.d.ts +8 -8
- package/dist/server/mutations/account.js +3 -3
- package/dist/server/mutations/account.js.map +1 -1
- package/dist/server/mutations/code.d.ts +13 -13
- package/dist/server/mutations/code.js +2 -2
- package/dist/server/mutations/code.js.map +1 -1
- package/dist/server/mutations/index.d.ts +8 -312
- package/dist/server/mutations/index.js +14 -84
- package/dist/server/mutations/invalidate.d.ts +5 -5
- package/dist/server/mutations/invalidate.d.ts.map +1 -1
- package/dist/server/mutations/invalidate.js +1 -1
- package/dist/server/mutations/invalidate.js.map +1 -1
- package/dist/server/mutations/oauth.d.ts +9 -9
- package/dist/server/mutations/oauth.d.ts.map +1 -1
- package/dist/server/mutations/oauth.js +5 -3
- package/dist/server/mutations/oauth.js.map +1 -1
- package/dist/server/mutations/refresh.d.ts +4 -4
- package/dist/server/mutations/refresh.js +1 -1
- package/dist/server/mutations/refresh.js.map +1 -1
- package/dist/server/mutations/register.d.ts +10 -10
- package/dist/server/mutations/register.d.ts.map +1 -1
- package/dist/server/mutations/register.js +3 -3
- package/dist/server/mutations/register.js.map +1 -1
- package/dist/server/mutations/retrieve.d.ts +8 -10
- package/dist/server/mutations/retrieve.d.ts.map +1 -1
- package/dist/server/mutations/retrieve.js +5 -7
- package/dist/server/mutations/retrieve.js.map +1 -1
- package/dist/server/mutations/signature.d.ts +6 -6
- package/dist/server/mutations/signature.d.ts.map +1 -1
- package/dist/server/mutations/signature.js +2 -2
- package/dist/server/mutations/signature.js.map +1 -1
- package/dist/server/mutations/signin.d.ts +1 -1
- package/dist/server/mutations/signin.js +1 -1
- package/dist/server/mutations/signin.js.map +1 -1
- package/dist/server/mutations/signout.d.ts +1 -1
- package/dist/server/mutations/signout.js +1 -1
- package/dist/server/mutations/signout.js.map +1 -1
- package/dist/server/mutations/store/refs.d.ts +12 -0
- package/dist/server/mutations/store/refs.d.ts.map +1 -0
- package/dist/server/mutations/store/refs.js +15 -0
- package/dist/server/mutations/store/refs.js.map +1 -0
- package/dist/server/mutations/store.d.ts +303 -9
- package/dist/server/mutations/store.d.ts.map +1 -1
- package/dist/server/mutations/store.js +80 -10
- package/dist/server/mutations/store.js.map +1 -1
- package/dist/server/mutations/verifier.d.ts +1 -1
- package/dist/server/mutations/verifier.js +1 -1
- package/dist/server/mutations/verifier.js.map +1 -1
- package/dist/server/mutations/verify.d.ts +8 -8
- package/dist/server/mutations/verify.d.ts.map +1 -1
- package/dist/server/mutations/verify.js +4 -3
- package/dist/server/mutations/verify.js.map +1 -1
- package/dist/server/oauth.js +1 -1
- package/dist/server/oauth.js.map +1 -1
- package/dist/server/passkey.d.ts +2 -2
- package/dist/server/passkey.d.ts.map +1 -1
- package/dist/server/passkey.js +3 -2
- package/dist/server/passkey.js.map +1 -1
- package/dist/server/redirects.js +1 -1
- package/dist/server/redirects.js.map +1 -1
- package/dist/server/refresh.js +1 -1
- package/dist/server/refresh.js.map +1 -1
- package/dist/server/{factory.d.ts → runtime.d.ts} +16 -16
- package/dist/server/runtime.d.ts.map +1 -0
- package/dist/server/runtime.js +413 -0
- package/dist/server/runtime.js.map +1 -0
- package/dist/server/signin.js +3 -2
- package/dist/server/signin.js.map +1 -1
- package/dist/server/ssr.d.ts +226 -0
- package/dist/server/ssr.d.ts.map +1 -0
- package/dist/server/ssr.js +786 -0
- package/dist/server/ssr.js.map +1 -0
- package/dist/server/totp.js +2 -1
- package/dist/server/totp.js.map +1 -1
- package/dist/server/types.d.ts +242 -42
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/types.js +12 -1
- package/dist/server/types.js.map +1 -1
- package/dist/server/users.js +1 -1
- package/dist/server/users.js.map +1 -1
- package/dist/server/utils.js +1 -1
- package/dist/server/utils.js.map +1 -1
- package/package.json +3 -4
- package/src/authorization/index.ts +46 -0
- package/src/cli/index.ts +38 -20
- package/src/client/core/types.ts +437 -0
- package/src/client/factors/device.ts +160 -0
- package/src/client/factors/passkey.ts +282 -0
- package/src/client/factors/totp.ts +150 -0
- package/src/client/index.ts +133 -1267
- package/src/client/runtime/browser.ts +112 -0
- package/src/client/runtime/invite.ts +65 -0
- package/src/client/runtime/proxy.ts +111 -0
- package/src/client/runtime/storage.ts +79 -0
- package/src/component/_generated/api.ts +40 -12
- package/src/component/_generated/component.ts +1772 -1798
- package/src/component/model.ts +6 -0
- package/src/component/public/enterprise/audit.ts +120 -0
- package/src/component/public/enterprise/core.ts +354 -0
- package/src/component/public/enterprise/domains.ts +323 -0
- package/src/component/public/enterprise/scim.ts +396 -0
- package/src/component/public/enterprise/secrets.ts +132 -0
- package/src/component/public/enterprise/webhooks.ts +306 -0
- package/src/component/public/factors/devices.ts +223 -0
- package/src/component/public/factors/passkeys.ts +242 -0
- package/src/component/public/factors/totp.ts +258 -0
- package/src/component/public/groups/core.ts +481 -0
- package/src/component/public/groups/invites.ts +602 -0
- package/src/component/public/groups/members.ts +409 -0
- package/src/component/public/identity/accounts.ts +206 -0
- package/src/component/public/identity/codes.ts +148 -0
- package/src/component/public/identity/sessions.ts +209 -0
- package/src/component/public/identity/tokens.ts +250 -0
- package/src/component/public/identity/users.ts +354 -0
- package/src/component/public/identity/verifiers.ts +157 -0
- package/src/component/public/security/keys.ts +365 -0
- package/src/component/public/security/limits.ts +173 -0
- package/src/component/public.ts +27 -5
- package/src/providers/credentials.ts +4 -5
- package/src/providers/email.ts +30 -0
- package/src/providers/phone.ts +28 -0
- package/src/server/auth.ts +282 -28
- package/src/server/authError.ts +44 -0
- package/src/server/core.ts +2095 -0
- package/src/server/{provider.ts → crypto.ts} +1 -1
- package/src/server/device.ts +1 -1
- package/src/server/enterprise/config.ts +51 -0
- package/src/server/{domains/sso.ts → enterprise/domain.ts} +4 -2
- package/src/server/enterprise/http.ts +1324 -0
- package/src/server/enterprise/oidc.ts +500 -0
- package/src/server/enterprise/policy.ts +128 -0
- package/src/server/enterprise/saml.ts +578 -0
- package/src/server/enterprise/scim.ts +135 -0
- package/src/server/enterprise/shared.ts +134 -0
- package/src/server/errors.ts +2 -0
- package/src/server/http.ts +3 -1
- package/src/server/identity.ts +1 -1
- package/src/server/index.ts +32 -2605
- package/src/server/{ratelimit.ts → limits.ts} +1 -1
- package/src/server/mounts.ts +948 -0
- package/src/server/mutations/account.ts +4 -4
- package/src/server/mutations/code.ts +3 -3
- package/src/server/mutations/index.ts +8 -148
- package/src/server/mutations/invalidate.ts +2 -2
- package/src/server/mutations/oauth.ts +8 -6
- package/src/server/mutations/refresh.ts +3 -3
- package/src/server/mutations/register.ts +3 -3
- package/src/server/mutations/retrieve.ts +4 -8
- package/src/server/mutations/signature.ts +3 -3
- package/src/server/mutations/signin.ts +2 -2
- package/src/server/mutations/signout.ts +2 -2
- package/src/server/mutations/store/refs.ts +10 -0
- package/src/server/mutations/store.ts +137 -9
- package/src/server/mutations/verifier.ts +2 -2
- package/src/server/mutations/verify.ts +5 -5
- package/src/server/oauth.ts +1 -1
- package/src/server/passkey.ts +3 -4
- package/src/server/redirects.ts +1 -1
- package/src/server/refresh.ts +1 -1
- package/src/server/runtime.ts +880 -0
- package/src/server/signin.ts +3 -1
- package/src/server/ssr.ts +1764 -0
- package/src/server/totp.ts +3 -1
- package/src/server/types.ts +254 -43
- package/src/server/users.ts +1 -1
- package/src/server/utils.ts +1 -1
- package/src/test.ts +25 -0
- package/dist/component/public/enterprise.d.ts +0 -54
- package/dist/component/public/enterprise.d.ts.map +0 -1
- package/dist/component/public/enterprise.js +0 -515
- package/dist/component/public/enterprise.js.map +0 -1
- package/dist/component/public/factors.d.ts +0 -52
- package/dist/component/public/factors.d.ts.map +0 -1
- package/dist/component/public/factors.js +0 -285
- package/dist/component/public/factors.js.map +0 -1
- package/dist/component/public/groups.d.ts +0 -124
- package/dist/component/public/groups.d.ts.map +0 -1
- package/dist/component/public/groups.js +0 -680
- package/dist/component/public/groups.js.map +0 -1
- package/dist/component/public/identity.d.ts +0 -93
- package/dist/component/public/identity.d.ts.map +0 -1
- package/dist/component/public/identity.js +0 -426
- package/dist/component/public/identity.js.map +0 -1
- package/dist/component/public/keys.d.ts +0 -41
- package/dist/component/public/keys.d.ts.map +0 -1
- package/dist/component/public/keys.js +0 -157
- package/dist/component/public/keys.js.map +0 -1
- package/dist/component/public/shared.d.ts +0 -26
- package/dist/component/public/shared.d.ts.map +0 -1
- package/dist/component/public/shared.js +0 -32
- package/dist/component/public/shared.js.map +0 -1
- package/dist/component/server/domains/core.js.map +0 -1
- package/dist/component/server/domains/sso.js.map +0 -1
- package/dist/component/server/factory.d.ts.map +0 -1
- package/dist/component/server/factory.js +0 -1134
- package/dist/component/server/factory.js.map +0 -1
- package/dist/component/server/fx.js +0 -66
- package/dist/component/server/fx.js.map +0 -1
- package/dist/component/server/mutations/index.js +0 -85
- package/dist/component/server/mutations/index.js.map +0 -1
- package/dist/component/server/providers.js.map +0 -1
- package/dist/component/server/ratelimit.js.map +0 -1
- package/dist/component/server/sso.js +0 -830
- package/dist/component/server/sso.js.map +0 -1
- package/dist/server/domains/core.d.ts +0 -449
- package/dist/server/domains/core.d.ts.map +0 -1
- package/dist/server/domains/core.js.map +0 -1
- package/dist/server/domains/sso.d.ts.map +0 -1
- package/dist/server/domains/sso.js.map +0 -1
- package/dist/server/enterpriseValidators.js.map +0 -1
- package/dist/server/factory.d.ts.map +0 -1
- package/dist/server/factory.js +0 -1134
- package/dist/server/factory.js.map +0 -1
- package/dist/server/fx.d.ts.map +0 -1
- package/dist/server/fx.js +0 -66
- package/dist/server/fx.js.map +0 -1
- package/dist/server/index.d.ts.map +0 -1
- package/dist/server/index.js.map +0 -1
- package/dist/server/mutations/index.d.ts.map +0 -1
- package/dist/server/mutations/index.js.map +0 -1
- package/dist/server/provider.d.ts.map +0 -1
- package/dist/server/provider.js.map +0 -1
- package/dist/server/providers.js.map +0 -1
- package/dist/server/ratelimit.js.map +0 -1
- package/dist/server/sso.js +0 -830
- package/dist/server/sso.js.map +0 -1
- package/dist/server/version.d.ts +0 -5
- package/dist/server/version.d.ts.map +0 -1
- package/dist/server/version.js +0 -6
- package/dist/server/version.js.map +0 -1
- package/src/component/public/enterprise.ts +0 -753
- package/src/component/public/factors.ts +0 -333
- package/src/component/public/groups.ts +0 -1066
- package/src/component/public/identity.ts +0 -569
- package/src/component/public/keys.ts +0 -209
- package/src/component/public/shared.ts +0 -119
- package/src/server/domains/core.ts +0 -1096
- package/src/server/factory.ts +0 -2181
- package/src/server/fx.ts +0 -152
- package/src/server/sso.ts +0 -1516
- package/src/server/version.ts +0 -2
- /package/dist/server/{enterpriseValidators.d.ts → config.d.ts} +0 -0
- /package/dist/server/{providers.d.ts → enterprise/config.d.ts} +0 -0
- /package/dist/server/{ratelimit.d.ts → enterprise/oidc.d.ts} +0 -0
- /package/dist/server/{sso.d.ts → enterprise/policy.d.ts} +0 -0
- /package/src/server/{providers.ts → config.ts} +0 -0
- /package/src/server/{enterpriseValidators.ts → enterprise/validators.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"passkey.js","names":[],"sources":["../../src/client/factors/passkey.ts"],"sourcesContent":["import { Fx } from \"@robelest/fx\";\n\nimport { base64urlDecode, base64urlEncode } from \"../runtime/browser\";\nimport type {\n AuthSession,\n ConvexTransport,\n PasskeyClient,\n SignInActionResult,\n SignInResult,\n} from \"../core/types\";\n\ntype PasskeyDeps = {\n proxy: string | undefined;\n convex: ConvexTransport;\n requireApiRefs: () => { signIn: any };\n proxyFetch: (body: Record<string, unknown>) => Promise<any>;\n setTokenAndMaybeWait: (\n args:\n | {\n shouldStore: true;\n tokens: AuthSession | null;\n waitForHandshake: boolean;\n context: { provider?: string; flow: string };\n }\n | {\n shouldStore: false;\n tokens: { token: string } | null;\n waitForHandshake: boolean;\n context: { provider?: string; flow: string };\n },\n ) => Promise<boolean>;\n};\n\n/** @internal */\nexport function createPasskeyClient(deps: PasskeyDeps): PasskeyClient {\n const { proxy, convex, requireApiRefs, proxyFetch, setTokenAndMaybeWait } =\n deps;\n\n const handleSignedInResult = async (\n result: SignInActionResult,\n flow: string,\n ): Promise<SignInResult> => {\n return Fx.run(\n Fx.match(result, result.kind, {\n signedIn: (signedInResult) =>\n Fx.from({\n ok: async () => {\n const signingIn = await setTokenAndMaybeWait(\n proxy\n ? {\n shouldStore: false as const,\n tokens:\n signedInResult.tokens === null\n ? null\n : { token: signedInResult.tokens.token },\n waitForHandshake: true,\n context: { provider: \"passkey\", flow },\n }\n : {\n shouldStore: true as const,\n tokens: signedInResult.tokens,\n waitForHandshake: true,\n context: { provider: \"passkey\", flow },\n },\n );\n return signingIn\n ? ({ kind: \"signedIn\" as const } as SignInResult)\n : ({ kind: \"started\" as const } as SignInResult);\n },\n err: (e) => e as never,\n }),\n redirect: () => Fx.succeed({ kind: \"started\" as const }),\n started: () => Fx.succeed({ kind: \"started\" as const }),\n passkeyOptions: () => Fx.succeed({ kind: \"started\" as const }),\n totpRequired: () => Fx.succeed({ kind: \"started\" as const }),\n totpSetup: () => Fx.succeed({ kind: \"started\" as const }),\n deviceCode: () => Fx.succeed({ kind: \"started\" as const }),\n }),\n );\n };\n\n return {\n isSupported: (): boolean => {\n return (\n typeof window !== \"undefined\" &&\n typeof window.PublicKeyCredential !== \"undefined\"\n );\n },\n\n isAutofillSupported: async (): Promise<boolean> => {\n if (typeof window === \"undefined\") return false;\n if (typeof window.PublicKeyCredential === \"undefined\") return false;\n if (\n typeof (window.PublicKeyCredential as any)\n .isConditionalMediationAvailable !== \"function\"\n ) {\n return false;\n }\n return (\n window.PublicKeyCredential as any\n ).isConditionalMediationAvailable();\n },\n\n register: async (opts?: {\n name?: string;\n email?: string;\n userName?: string;\n userDisplayName?: string;\n }): Promise<SignInResult> => {\n const phase1Params = {\n flow: \"registerOptions\",\n email: opts?.email,\n userName: opts?.userName,\n userDisplayName: opts?.userDisplayName,\n };\n\n let phase1Result: SignInActionResult;\n if (proxy) {\n phase1Result = (await proxyFetch({\n action: \"auth:signIn\",\n args: { provider: \"passkey\", params: phase1Params },\n })) as SignInActionResult;\n } else {\n phase1Result = (await convex.action(requireApiRefs().signIn, {\n provider: \"passkey\",\n params: phase1Params,\n })) as SignInActionResult;\n }\n\n if (phase1Result.kind !== \"passkeyOptions\") {\n throw new Error(\"Server did not return passkey registration options\");\n }\n\n const options = phase1Result.options;\n const createOptions: CredentialCreationOptions = {\n publicKey: {\n rp: options.rp,\n user: {\n id: base64urlDecode(options.user.id).buffer as ArrayBuffer,\n name: options.user.name,\n displayName: options.user.displayName,\n },\n challenge: base64urlDecode(options.challenge).buffer as ArrayBuffer,\n pubKeyCredParams: options.pubKeyCredParams,\n timeout: options.timeout,\n attestation: options.attestation,\n authenticatorSelection: options.authenticatorSelection,\n excludeCredentials: (options.excludeCredentials ?? []).map(\n (cred: any) => ({\n type: cred.type ?? \"public-key\",\n id: base64urlDecode(cred.id).buffer as ArrayBuffer,\n transports: cred.transports,\n }),\n ),\n },\n };\n\n const credential = (await navigator.credentials.create(\n createOptions,\n )) as PublicKeyCredential | null;\n if (!credential) {\n throw new Error(\"Passkey registration was cancelled\");\n }\n\n const response = credential.response as AuthenticatorAttestationResponse;\n const transports =\n typeof response.getTransports === \"function\"\n ? response.getTransports()\n : undefined;\n\n const phase2Params = {\n flow: \"registerVerify\",\n clientDataJSON: base64urlEncode(response.clientDataJSON),\n attestationObject: base64urlEncode(response.attestationObject),\n transports,\n passkeyName: opts?.name,\n email: opts?.email,\n };\n\n let phase2Result: SignInActionResult;\n if (proxy) {\n phase2Result = (await proxyFetch({\n action: \"auth:signIn\",\n args: {\n provider: \"passkey\",\n params: phase2Params,\n verifier: phase1Result.verifier,\n },\n })) as SignInActionResult;\n } else {\n phase2Result = (await convex.action(requireApiRefs().signIn, {\n provider: \"passkey\",\n params: phase2Params,\n verifier: phase1Result.verifier,\n })) as SignInActionResult;\n }\n\n return handleSignedInResult(phase2Result, \"registerVerify\");\n },\n\n authenticate: async (opts?: {\n email?: string;\n autofill?: boolean;\n }): Promise<SignInResult> => {\n const phase1Params = {\n flow: \"authOptions\",\n email: opts?.email,\n };\n\n let phase1Result: SignInActionResult;\n if (proxy) {\n phase1Result = (await proxyFetch({\n action: \"auth:signIn\",\n args: { provider: \"passkey\", params: phase1Params },\n })) as SignInActionResult;\n } else {\n phase1Result = (await convex.action(requireApiRefs().signIn, {\n provider: \"passkey\",\n params: phase1Params,\n })) as SignInActionResult;\n }\n\n if (phase1Result.kind !== \"passkeyOptions\") {\n throw new Error(\"Server did not return passkey authentication options\");\n }\n\n const options = phase1Result.options;\n const getOptions: CredentialRequestOptions = {\n publicKey: {\n challenge: base64urlDecode(options.challenge).buffer as ArrayBuffer,\n timeout: options.timeout,\n rpId: options.rpId,\n userVerification: options.userVerification,\n allowCredentials: (options.allowCredentials ?? []).map(\n (cred: any) => ({\n type: cred.type ?? \"public-key\",\n id: base64urlDecode(cred.id).buffer as ArrayBuffer,\n transports: cred.transports,\n }),\n ),\n },\n ...(opts?.autofill ? { mediation: \"conditional\" as any } : {}),\n };\n\n const credential = (await navigator.credentials.get(\n getOptions,\n )) as PublicKeyCredential | null;\n if (!credential) {\n throw new Error(\"Passkey authentication was cancelled\");\n }\n\n const response = credential.response as AuthenticatorAssertionResponse;\n const phase2Params = {\n flow: \"authVerify\",\n credentialId: base64urlEncode(credential.rawId),\n clientDataJSON: base64urlEncode(response.clientDataJSON),\n authenticatorData: base64urlEncode(response.authenticatorData),\n signature: base64urlEncode(response.signature),\n };\n\n let phase2Result: SignInActionResult;\n if (proxy) {\n phase2Result = (await proxyFetch({\n action: \"auth:signIn\",\n args: {\n provider: \"passkey\",\n params: phase2Params,\n verifier: phase1Result.verifier,\n },\n })) as SignInActionResult;\n } else {\n phase2Result = (await convex.action(requireApiRefs().signIn, {\n provider: \"passkey\",\n params: phase2Params,\n verifier: phase1Result.verifier,\n })) as SignInActionResult;\n }\n\n return handleSignedInResult(phase2Result, \"authVerify\");\n },\n };\n}\n"],"mappings":";;;;;AAkCA,SAAgB,oBAAoB,MAAkC;CACpE,MAAM,EAAE,OAAO,QAAQ,gBAAgB,YAAY,yBACjD;CAEF,MAAM,uBAAuB,OAC3B,QACA,SAC0B;AAC1B,SAAO,GAAG,IACR,GAAG,MAAM,QAAQ,OAAO,MAAM;GAC5B,WAAW,mBACT,GAAG,KAAK;IACN,IAAI,YAAY;AAmBd,YAlBkB,MAAM,qBACtB,QACI;MACE,aAAa;MACb,QACE,eAAe,WAAW,OACtB,OACA,EAAE,OAAO,eAAe,OAAO,OAAO;MAC5C,kBAAkB;MAClB,SAAS;OAAE,UAAU;OAAW;OAAM;MACvC,GACD;MACE,aAAa;MACb,QAAQ,eAAe;MACvB,kBAAkB;MAClB,SAAS;OAAE,UAAU;OAAW;OAAM;MACvC,CACN,GAEI,EAAE,MAAM,YAAqB,GAC7B,EAAE,MAAM,WAAoB;;IAEnC,MAAM,MAAM;IACb,CAAC;GACJ,gBAAgB,GAAG,QAAQ,EAAE,MAAM,WAAoB,CAAC;GACxD,eAAe,GAAG,QAAQ,EAAE,MAAM,WAAoB,CAAC;GACvD,sBAAsB,GAAG,QAAQ,EAAE,MAAM,WAAoB,CAAC;GAC9D,oBAAoB,GAAG,QAAQ,EAAE,MAAM,WAAoB,CAAC;GAC5D,iBAAiB,GAAG,QAAQ,EAAE,MAAM,WAAoB,CAAC;GACzD,kBAAkB,GAAG,QAAQ,EAAE,MAAM,WAAoB,CAAC;GAC3D,CAAC,CACH;;AAGH,QAAO;EACL,mBAA4B;AAC1B,UACE,OAAO,WAAW,eAClB,OAAO,OAAO,wBAAwB;;EAI1C,qBAAqB,YAA8B;AACjD,OAAI,OAAO,WAAW,YAAa,QAAO;AAC1C,OAAI,OAAO,OAAO,wBAAwB,YAAa,QAAO;AAC9D,OACE,OAAQ,OAAO,oBACZ,oCAAoC,WAEvC,QAAO;AAET,UACE,OAAO,oBACP,iCAAiC;;EAGrC,UAAU,OAAO,SAKY;GAC3B,MAAM,eAAe;IACnB,MAAM;IACN,OAAO,MAAM;IACb,UAAU,MAAM;IAChB,iBAAiB,MAAM;IACxB;GAED,IAAI;AACJ,OAAI,MACF,gBAAgB,MAAM,WAAW;IAC/B,QAAQ;IACR,MAAM;KAAE,UAAU;KAAW,QAAQ;KAAc;IACpD,CAAC;OAEF,gBAAgB,MAAM,OAAO,OAAO,gBAAgB,CAAC,QAAQ;IAC3D,UAAU;IACV,QAAQ;IACT,CAAC;AAGJ,OAAI,aAAa,SAAS,iBACxB,OAAM,IAAI,MAAM,qDAAqD;GAGvE,MAAM,UAAU,aAAa;GAC7B,MAAM,gBAA2C,EAC/C,WAAW;IACT,IAAI,QAAQ;IACZ,MAAM;KACJ,IAAI,gBAAgB,QAAQ,KAAK,GAAG,CAAC;KACrC,MAAM,QAAQ,KAAK;KACnB,aAAa,QAAQ,KAAK;KAC3B;IACD,WAAW,gBAAgB,QAAQ,UAAU,CAAC;IAC9C,kBAAkB,QAAQ;IAC1B,SAAS,QAAQ;IACjB,aAAa,QAAQ;IACrB,wBAAwB,QAAQ;IAChC,qBAAqB,QAAQ,sBAAsB,EAAE,EAAE,KACpD,UAAe;KACd,MAAM,KAAK,QAAQ;KACnB,IAAI,gBAAgB,KAAK,GAAG,CAAC;KAC7B,YAAY,KAAK;KAClB,EACF;IACF,EACF;GAED,MAAM,aAAc,MAAM,UAAU,YAAY,OAC9C,cACD;AACD,OAAI,CAAC,WACH,OAAM,IAAI,MAAM,qCAAqC;GAGvD,MAAM,WAAW,WAAW;GAC5B,MAAM,aACJ,OAAO,SAAS,kBAAkB,aAC9B,SAAS,eAAe,GACxB;GAEN,MAAM,eAAe;IACnB,MAAM;IACN,gBAAgB,gBAAgB,SAAS,eAAe;IACxD,mBAAmB,gBAAgB,SAAS,kBAAkB;IAC9D;IACA,aAAa,MAAM;IACnB,OAAO,MAAM;IACd;GAED,IAAI;AACJ,OAAI,MACF,gBAAgB,MAAM,WAAW;IAC/B,QAAQ;IACR,MAAM;KACJ,UAAU;KACV,QAAQ;KACR,UAAU,aAAa;KACxB;IACF,CAAC;OAEF,gBAAgB,MAAM,OAAO,OAAO,gBAAgB,CAAC,QAAQ;IAC3D,UAAU;IACV,QAAQ;IACR,UAAU,aAAa;IACxB,CAAC;AAGJ,UAAO,qBAAqB,cAAc,iBAAiB;;EAG7D,cAAc,OAAO,SAGQ;GAC3B,MAAM,eAAe;IACnB,MAAM;IACN,OAAO,MAAM;IACd;GAED,IAAI;AACJ,OAAI,MACF,gBAAgB,MAAM,WAAW;IAC/B,QAAQ;IACR,MAAM;KAAE,UAAU;KAAW,QAAQ;KAAc;IACpD,CAAC;OAEF,gBAAgB,MAAM,OAAO,OAAO,gBAAgB,CAAC,QAAQ;IAC3D,UAAU;IACV,QAAQ;IACT,CAAC;AAGJ,OAAI,aAAa,SAAS,iBACxB,OAAM,IAAI,MAAM,uDAAuD;GAGzE,MAAM,UAAU,aAAa;GAC7B,MAAM,aAAuC;IAC3C,WAAW;KACT,WAAW,gBAAgB,QAAQ,UAAU,CAAC;KAC9C,SAAS,QAAQ;KACjB,MAAM,QAAQ;KACd,kBAAkB,QAAQ;KAC1B,mBAAmB,QAAQ,oBAAoB,EAAE,EAAE,KAChD,UAAe;MACd,MAAM,KAAK,QAAQ;MACnB,IAAI,gBAAgB,KAAK,GAAG,CAAC;MAC7B,YAAY,KAAK;MAClB,EACF;KACF;IACD,GAAI,MAAM,WAAW,EAAE,WAAW,eAAsB,GAAG,EAAE;IAC9D;GAED,MAAM,aAAc,MAAM,UAAU,YAAY,IAC9C,WACD;AACD,OAAI,CAAC,WACH,OAAM,IAAI,MAAM,uCAAuC;GAGzD,MAAM,WAAW,WAAW;GAC5B,MAAM,eAAe;IACnB,MAAM;IACN,cAAc,gBAAgB,WAAW,MAAM;IAC/C,gBAAgB,gBAAgB,SAAS,eAAe;IACxD,mBAAmB,gBAAgB,SAAS,kBAAkB;IAC9D,WAAW,gBAAgB,SAAS,UAAU;IAC/C;GAED,IAAI;AACJ,OAAI,MACF,gBAAgB,MAAM,WAAW;IAC/B,QAAQ;IACR,MAAM;KACJ,UAAU;KACV,QAAQ;KACR,UAAU,aAAa;KACxB;IACF,CAAC;OAEF,gBAAgB,MAAM,OAAO,OAAO,gBAAgB,CAAC,QAAQ;IAC3D,UAAU;IACV,QAAQ;IACR,UAAU,aAAa;IACxB,CAAC;AAGJ,UAAO,qBAAqB,cAAc,aAAa;;EAE1D"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
//#region src/client/factors/totp.ts
|
|
2
|
+
/** @internal */
|
|
3
|
+
function createTotpClient(deps) {
|
|
4
|
+
const { proxy, convex, requireApiRefs, proxyFetch, setTokenAndMaybeWait } = deps;
|
|
5
|
+
return {
|
|
6
|
+
setup: async (opts) => {
|
|
7
|
+
const params = { flow: "setup" };
|
|
8
|
+
if (opts?.name) params.name = opts.name;
|
|
9
|
+
if (opts?.accountName) params.accountName = opts.accountName;
|
|
10
|
+
if (proxy) {
|
|
11
|
+
const result$1 = await proxyFetch({
|
|
12
|
+
action: "auth:signIn",
|
|
13
|
+
args: {
|
|
14
|
+
provider: "totp",
|
|
15
|
+
params
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
return {
|
|
19
|
+
uri: result$1.totpSetup.uri,
|
|
20
|
+
secret: result$1.totpSetup.secret,
|
|
21
|
+
verifier: result$1.verifier,
|
|
22
|
+
totpId: result$1.totpSetup.totpId
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
const result = await convex.action(requireApiRefs().signIn, {
|
|
26
|
+
provider: "totp",
|
|
27
|
+
params
|
|
28
|
+
});
|
|
29
|
+
return {
|
|
30
|
+
uri: result.totpSetup.uri,
|
|
31
|
+
secret: result.totpSetup.secret,
|
|
32
|
+
verifier: result.verifier,
|
|
33
|
+
totpId: result.totpSetup.totpId
|
|
34
|
+
};
|
|
35
|
+
},
|
|
36
|
+
confirm: async (opts) => {
|
|
37
|
+
const params = {
|
|
38
|
+
flow: "confirm",
|
|
39
|
+
code: opts.code,
|
|
40
|
+
totpId: opts.totpId
|
|
41
|
+
};
|
|
42
|
+
if (proxy) {
|
|
43
|
+
const result$1 = await proxyFetch({
|
|
44
|
+
action: "auth:signIn",
|
|
45
|
+
args: {
|
|
46
|
+
provider: "totp",
|
|
47
|
+
params,
|
|
48
|
+
verifier: opts.verifier
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
if (result$1.tokens) await setTokenAndMaybeWait({
|
|
52
|
+
shouldStore: false,
|
|
53
|
+
tokens: result$1.tokens === null ? null : { token: result$1.tokens.token },
|
|
54
|
+
waitForHandshake: true,
|
|
55
|
+
context: {
|
|
56
|
+
provider: "totp",
|
|
57
|
+
flow: "confirm"
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const result = await convex.action(requireApiRefs().signIn, {
|
|
63
|
+
provider: "totp",
|
|
64
|
+
params,
|
|
65
|
+
verifier: opts.verifier
|
|
66
|
+
});
|
|
67
|
+
if (result.tokens) await setTokenAndMaybeWait({
|
|
68
|
+
shouldStore: true,
|
|
69
|
+
tokens: result.tokens ?? null,
|
|
70
|
+
waitForHandshake: true,
|
|
71
|
+
context: {
|
|
72
|
+
provider: "totp",
|
|
73
|
+
flow: "confirm"
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
},
|
|
77
|
+
verify: async (opts) => {
|
|
78
|
+
const params = {
|
|
79
|
+
flow: "verify",
|
|
80
|
+
code: opts.code
|
|
81
|
+
};
|
|
82
|
+
if (proxy) {
|
|
83
|
+
const result$1 = await proxyFetch({
|
|
84
|
+
action: "auth:signIn",
|
|
85
|
+
args: {
|
|
86
|
+
provider: "totp",
|
|
87
|
+
params,
|
|
88
|
+
verifier: opts.verifier
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
if (result$1.tokens) await setTokenAndMaybeWait({
|
|
92
|
+
shouldStore: false,
|
|
93
|
+
tokens: result$1.tokens === null ? null : { token: result$1.tokens.token },
|
|
94
|
+
waitForHandshake: true,
|
|
95
|
+
context: {
|
|
96
|
+
provider: "totp",
|
|
97
|
+
flow: "verify"
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const result = await convex.action(requireApiRefs().signIn, {
|
|
103
|
+
provider: "totp",
|
|
104
|
+
params,
|
|
105
|
+
verifier: opts.verifier
|
|
106
|
+
});
|
|
107
|
+
if (result.tokens) await setTokenAndMaybeWait({
|
|
108
|
+
shouldStore: true,
|
|
109
|
+
tokens: result.tokens ?? null,
|
|
110
|
+
waitForHandshake: true,
|
|
111
|
+
context: {
|
|
112
|
+
provider: "totp",
|
|
113
|
+
flow: "verify"
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
//#endregion
|
|
121
|
+
export { createTotpClient };
|
|
122
|
+
//# sourceMappingURL=totp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"totp.js","names":["result"],"sources":["../../src/client/factors/totp.ts"],"sourcesContent":["import type { AuthSession, ConvexTransport, TotpClient } from \"../core/types\";\n\ntype TotpDeps = {\n proxy: string | undefined;\n convex: ConvexTransport;\n requireApiRefs: () => { signIn: any };\n proxyFetch: (body: Record<string, unknown>) => Promise<any>;\n setTokenAndMaybeWait: (\n args:\n | {\n shouldStore: true;\n tokens: AuthSession | null;\n waitForHandshake: boolean;\n context: { provider?: string; flow: string };\n }\n | {\n shouldStore: false;\n tokens: { token: string } | null;\n waitForHandshake: boolean;\n context: { provider?: string; flow: string };\n },\n ) => Promise<boolean>;\n};\n\n/** @internal */\nexport function createTotpClient(deps: TotpDeps): TotpClient {\n const { proxy, convex, requireApiRefs, proxyFetch, setTokenAndMaybeWait } =\n deps;\n\n return {\n setup: async (opts?: {\n name?: string;\n accountName?: string;\n }): Promise<{\n uri: string;\n secret: string;\n verifier: string;\n totpId: string;\n }> => {\n const params: Record<string, any> = { flow: \"setup\" };\n if (opts?.name) params.name = opts.name;\n if (opts?.accountName) params.accountName = opts.accountName;\n\n if (proxy) {\n const result = await proxyFetch({\n action: \"auth:signIn\",\n args: { provider: \"totp\", params },\n });\n return {\n uri: result.totpSetup.uri,\n secret: result.totpSetup.secret,\n verifier: result.verifier,\n totpId: result.totpSetup.totpId,\n };\n }\n\n const result = await convex.action(requireApiRefs().signIn, {\n provider: \"totp\",\n params,\n });\n return {\n uri: result.totpSetup.uri,\n secret: result.totpSetup.secret,\n verifier: result.verifier,\n totpId: result.totpSetup.totpId,\n };\n },\n\n confirm: async (opts: {\n code: string;\n verifier: string;\n totpId: string;\n }): Promise<void> => {\n const params: Record<string, any> = {\n flow: \"confirm\",\n code: opts.code,\n totpId: opts.totpId,\n };\n\n if (proxy) {\n const result = await proxyFetch({\n action: \"auth:signIn\",\n args: { provider: \"totp\", params, verifier: opts.verifier },\n });\n if (result.tokens) {\n await setTokenAndMaybeWait({\n shouldStore: false,\n tokens:\n result.tokens === null ? null : { token: result.tokens.token },\n waitForHandshake: true,\n context: { provider: \"totp\", flow: \"confirm\" },\n });\n }\n return;\n }\n\n const result = await convex.action(requireApiRefs().signIn, {\n provider: \"totp\",\n params,\n verifier: opts.verifier,\n });\n if (result.tokens) {\n await setTokenAndMaybeWait({\n shouldStore: true,\n tokens: (result.tokens as AuthSession | null) ?? null,\n waitForHandshake: true,\n context: { provider: \"totp\", flow: \"confirm\" },\n });\n }\n },\n\n verify: async (opts: { code: string; verifier: string }): Promise<void> => {\n const params: Record<string, any> = {\n flow: \"verify\",\n code: opts.code,\n };\n\n if (proxy) {\n const result = await proxyFetch({\n action: \"auth:signIn\",\n args: { provider: \"totp\", params, verifier: opts.verifier },\n });\n if (result.tokens) {\n await setTokenAndMaybeWait({\n shouldStore: false,\n tokens:\n result.tokens === null ? null : { token: result.tokens.token },\n waitForHandshake: true,\n context: { provider: \"totp\", flow: \"verify\" },\n });\n }\n return;\n }\n\n const result = await convex.action(requireApiRefs().signIn, {\n provider: \"totp\",\n params,\n verifier: opts.verifier,\n });\n if (result.tokens) {\n await setTokenAndMaybeWait({\n shouldStore: true,\n tokens: (result.tokens as AuthSession | null) ?? null,\n waitForHandshake: true,\n context: { provider: \"totp\", flow: \"verify\" },\n });\n }\n },\n };\n}\n"],"mappings":";;AAyBA,SAAgB,iBAAiB,MAA4B;CAC3D,MAAM,EAAE,OAAO,QAAQ,gBAAgB,YAAY,yBACjD;AAEF,QAAO;EACL,OAAO,OAAO,SAQR;GACJ,MAAM,SAA8B,EAAE,MAAM,SAAS;AACrD,OAAI,MAAM,KAAM,QAAO,OAAO,KAAK;AACnC,OAAI,MAAM,YAAa,QAAO,cAAc,KAAK;AAEjD,OAAI,OAAO;IACT,MAAMA,WAAS,MAAM,WAAW;KAC9B,QAAQ;KACR,MAAM;MAAE,UAAU;MAAQ;MAAQ;KACnC,CAAC;AACF,WAAO;KACL,KAAKA,SAAO,UAAU;KACtB,QAAQA,SAAO,UAAU;KACzB,UAAUA,SAAO;KACjB,QAAQA,SAAO,UAAU;KAC1B;;GAGH,MAAM,SAAS,MAAM,OAAO,OAAO,gBAAgB,CAAC,QAAQ;IAC1D,UAAU;IACV;IACD,CAAC;AACF,UAAO;IACL,KAAK,OAAO,UAAU;IACtB,QAAQ,OAAO,UAAU;IACzB,UAAU,OAAO;IACjB,QAAQ,OAAO,UAAU;IAC1B;;EAGH,SAAS,OAAO,SAIK;GACnB,MAAM,SAA8B;IAClC,MAAM;IACN,MAAM,KAAK;IACX,QAAQ,KAAK;IACd;AAED,OAAI,OAAO;IACT,MAAMA,WAAS,MAAM,WAAW;KAC9B,QAAQ;KACR,MAAM;MAAE,UAAU;MAAQ;MAAQ,UAAU,KAAK;MAAU;KAC5D,CAAC;AACF,QAAIA,SAAO,OACT,OAAM,qBAAqB;KACzB,aAAa;KACb,QACEA,SAAO,WAAW,OAAO,OAAO,EAAE,OAAOA,SAAO,OAAO,OAAO;KAChE,kBAAkB;KAClB,SAAS;MAAE,UAAU;MAAQ,MAAM;MAAW;KAC/C,CAAC;AAEJ;;GAGF,MAAM,SAAS,MAAM,OAAO,OAAO,gBAAgB,CAAC,QAAQ;IAC1D,UAAU;IACV;IACA,UAAU,KAAK;IAChB,CAAC;AACF,OAAI,OAAO,OACT,OAAM,qBAAqB;IACzB,aAAa;IACb,QAAS,OAAO,UAAiC;IACjD,kBAAkB;IAClB,SAAS;KAAE,UAAU;KAAQ,MAAM;KAAW;IAC/C,CAAC;;EAIN,QAAQ,OAAO,SAA4D;GACzE,MAAM,SAA8B;IAClC,MAAM;IACN,MAAM,KAAK;IACZ;AAED,OAAI,OAAO;IACT,MAAMA,WAAS,MAAM,WAAW;KAC9B,QAAQ;KACR,MAAM;MAAE,UAAU;MAAQ;MAAQ,UAAU,KAAK;MAAU;KAC5D,CAAC;AACF,QAAIA,SAAO,OACT,OAAM,qBAAqB;KACzB,aAAa;KACb,QACEA,SAAO,WAAW,OAAO,OAAO,EAAE,OAAOA,SAAO,OAAO,OAAO;KAChE,kBAAkB;KAClB,SAAS;MAAE,UAAU;MAAQ,MAAM;MAAU;KAC9C,CAAC;AAEJ;;GAGF,MAAM,SAAS,MAAM,OAAO,OAAO,gBAAgB,CAAC,QAAQ;IAC1D,UAAU;IACV;IACA,UAAU,KAAK;IAChB,CAAC;AACF,OAAI,OAAO,OACT,OAAM,qBAAqB;IACzB,aAAa;IACb,QAAS,OAAO,UAAiC;IACjD,kBAAkB;IAClB,SAAS;KAAE,UAAU;KAAQ,MAAM;KAAU;IAC9C,CAAC;;EAGP"}
|
|
@@ -5,6 +5,8 @@ import { GenericId, Value } from "convex/values";
|
|
|
5
5
|
//#region src/providers/credentials.d.ts
|
|
6
6
|
/**
|
|
7
7
|
* Configuration for the Credentials provider.
|
|
8
|
+
*
|
|
9
|
+
* @typeParam DataModel - The Convex data model.
|
|
8
10
|
*/
|
|
9
11
|
interface CredentialsConfig<DataModel extends GenericDataModel = GenericDataModel> {
|
|
10
12
|
/** Uniquely identifies the provider. Defaults to `"credentials"`. */
|
|
@@ -37,6 +39,8 @@ interface CredentialsConfig<DataModel extends GenericDataModel = GenericDataMode
|
|
|
37
39
|
* This is the escape hatch for fully custom auth logic. For email/password
|
|
38
40
|
* flows, use the `Password` class instead.
|
|
39
41
|
*
|
|
42
|
+
* @typeParam DataModel - The Convex data model.
|
|
43
|
+
*
|
|
40
44
|
* @example
|
|
41
45
|
* ```ts
|
|
42
46
|
* import { Credentials } from "@robelest/convex-auth/providers";
|
|
@@ -55,7 +59,6 @@ declare class Credentials<DataModel extends GenericDataModel = GenericDataModel>
|
|
|
55
59
|
readonly config: CredentialsConfig<DataModel>;
|
|
56
60
|
constructor(config: CredentialsConfig<DataModel>);
|
|
57
61
|
}
|
|
58
|
-
type CredentialsUserConfig<DataModel extends GenericDataModel = GenericDataModel> = CredentialsConfig<DataModel>;
|
|
59
62
|
//#endregion
|
|
60
|
-
export { Credentials, CredentialsConfig
|
|
63
|
+
export { Credentials, CredentialsConfig };
|
|
61
64
|
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.d.ts","names":[],"sources":["../../src/providers/credentials.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","names":[],"sources":["../../src/providers/credentials.ts"],"mappings":";;;;;;;;;;UA8BiB,iBAAA,mBACG,gBAAA,GAAmB,gBAAA;EAAnB;EAGlB,EAAA;EAAA;;;;;EAMA,SAAA,GACE,WAAA,EAAa,OAAA,CAAQ,MAAA,SAAe,KAAA,gBACpC,GAAA,EAAK,8BAAA,CAA+B,SAAA,MACjC,OAAA;IACH,MAAA,EAAQ,SAAA;IACR,SAAA,GAAY,SAAA;EAAA;EAFT;;;EAOL,MAAA;IACE,UAAA,GAAa,MAAA,aAAmB,OAAA;IAChC,YAAA,GAAe,MAAA,UAAgB,IAAA,aAAiB,OAAA;EAAA;EADnC;;;;EAOf,cAAA,IAAkB,kBAAA;AAAA;;;;;AAuBpB;;;;;;;;;;;;;;;;cAAa,WAAA,mBACO,gBAAA,GAAmB,gBAAA;EAAA,SAE5B,EAAA;EAAA,SACA,IAAA;EAAA,SACA,MAAA,EAAQ,iBAAA,CAAkB,SAAA;cAEvB,MAAA,EAAQ,iBAAA,CAAkB,SAAA;AAAA"}
|
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
* This is the escape hatch for fully custom auth logic. For email/password
|
|
6
6
|
* flows, use the `Password` class instead.
|
|
7
7
|
*
|
|
8
|
+
* @typeParam DataModel - The Convex data model.
|
|
9
|
+
*
|
|
8
10
|
* @example
|
|
9
11
|
* ```ts
|
|
10
12
|
* import { Credentials } from "@robelest/convex-auth/providers";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","names":[],"sources":["../../src/providers/credentials.ts"],"sourcesContent":["/**\n * Credentials provider for custom authentication flows.\n *\n * ```ts\n * import { Credentials } from \"@robelest/convex-auth/providers\";\n *\n * new Credentials({\n * authorize: async (credentials, ctx) => {\n * // Your custom logic here...\n * },\n * })\n * ```\n *\n * @module\n */\n\nimport { GenericDataModel } from \"convex/server\";\nimport { GenericId, Value } from \"convex/values\";\n\nimport type {\n AuthProviderConfig,\n ConvexCredentialsConfig,\n GenericActionCtxWithAuthConfig,\n} from \"../server/types\";\n\n/**\n * Configuration for the Credentials provider.\n */\nexport interface CredentialsConfig<\n DataModel extends GenericDataModel = GenericDataModel,\n> {\n /** Uniquely identifies the provider. Defaults to `\"credentials\"`. */\n id?: string;\n /**\n * Handle credentials received from the client-side `signIn` call.\n *\n * @returns A user ID for successful login, or `null` to reject.\n */\n authorize: (\n credentials: Partial<Record<string, Value | undefined>>,\n ctx: GenericActionCtxWithAuthConfig<DataModel>,\n ) => Promise<{\n userId: GenericId<\"User\">;\n sessionId?: GenericId<\"Session\">;\n } | null>;\n /**\n * Provide hashing and verification functions for account secrets.\n */\n crypto?: {\n hashSecret: (secret: string) => Promise<string>;\n verifySecret: (secret: string, hash: string) => Promise<boolean>;\n };\n /**\n * Extra providers used internally (e.g. email verification in password flow).\n * Not exposed to clients.\n */\n extraProviders?: (AuthProviderConfig | undefined)[];\n}\n\n/**\n * Credentials provider for custom authentication flows.\n *\n * This is the escape hatch for fully custom auth logic. For email/password\n * flows, use the `Password` class instead.\n *\n * @example\n * ```ts\n * import { Credentials } from \"@robelest/convex-auth/providers\";\n *\n * new Credentials({\n * authorize: async (credentials, ctx) => {\n * const user = await validateUser(credentials);\n * return user ? { userId: user._id } : null;\n * },\n * })\n * ```\n */\nexport class Credentials<\n DataModel extends GenericDataModel = GenericDataModel,\n> {\n readonly id: string;\n readonly type = \"credentials\" as const;\n readonly config: CredentialsConfig<DataModel>;\n\n constructor(config: CredentialsConfig<DataModel>) {\n this.id = config.id ?? \"credentials\";\n this.config = config;\n }\n\n /** @internal Convert to the internal materialized config shape. */\n _toMaterialized(): ConvexCredentialsConfig {\n return {\n ...this.config,\n id: this.id,\n type: \"credentials\",\n } as ConvexCredentialsConfig;\n }\n}\n
|
|
1
|
+
{"version":3,"file":"credentials.js","names":[],"sources":["../../src/providers/credentials.ts"],"sourcesContent":["/**\n * Credentials provider for custom authentication flows.\n *\n * ```ts\n * import { Credentials } from \"@robelest/convex-auth/providers\";\n *\n * new Credentials({\n * authorize: async (credentials, ctx) => {\n * // Your custom logic here...\n * },\n * })\n * ```\n *\n * @module\n */\n\nimport { GenericDataModel } from \"convex/server\";\nimport { GenericId, Value } from \"convex/values\";\n\nimport type {\n AuthProviderConfig,\n ConvexCredentialsConfig,\n GenericActionCtxWithAuthConfig,\n} from \"../server/types\";\n\n/**\n * Configuration for the Credentials provider.\n *\n * @typeParam DataModel - The Convex data model.\n */\nexport interface CredentialsConfig<\n DataModel extends GenericDataModel = GenericDataModel,\n> {\n /** Uniquely identifies the provider. Defaults to `\"credentials\"`. */\n id?: string;\n /**\n * Handle credentials received from the client-side `signIn` call.\n *\n * @returns A user ID for successful login, or `null` to reject.\n */\n authorize: (\n credentials: Partial<Record<string, Value | undefined>>,\n ctx: GenericActionCtxWithAuthConfig<DataModel>,\n ) => Promise<{\n userId: GenericId<\"User\">;\n sessionId?: GenericId<\"Session\">;\n } | null>;\n /**\n * Provide hashing and verification functions for account secrets.\n */\n crypto?: {\n hashSecret: (secret: string) => Promise<string>;\n verifySecret: (secret: string, hash: string) => Promise<boolean>;\n };\n /**\n * Extra providers used internally (e.g. email verification in password flow).\n * Not exposed to clients.\n */\n extraProviders?: (AuthProviderConfig | undefined)[];\n}\n\n/**\n * Credentials provider for custom authentication flows.\n *\n * This is the escape hatch for fully custom auth logic. For email/password\n * flows, use the `Password` class instead.\n *\n * @typeParam DataModel - The Convex data model.\n *\n * @example\n * ```ts\n * import { Credentials } from \"@robelest/convex-auth/providers\";\n *\n * new Credentials({\n * authorize: async (credentials, ctx) => {\n * const user = await validateUser(credentials);\n * return user ? { userId: user._id } : null;\n * },\n * })\n * ```\n */\nexport class Credentials<\n DataModel extends GenericDataModel = GenericDataModel,\n> {\n readonly id: string;\n readonly type = \"credentials\" as const;\n readonly config: CredentialsConfig<DataModel>;\n\n constructor(config: CredentialsConfig<DataModel>) {\n this.id = config.id ?? \"credentials\";\n this.config = config;\n }\n\n /** @internal Convert to the internal materialized config shape. */\n _toMaterialized(): ConvexCredentialsConfig {\n return {\n ...this.config,\n id: this.id,\n type: \"credentials\",\n } as ConvexCredentialsConfig;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAiFA,IAAa,cAAb,MAEE;CACA,AAAS;CACT,AAAS,OAAO;CAChB,AAAS;CAET,YAAY,QAAsC;AAChD,OAAK,KAAK,OAAO,MAAM;AACvB,OAAK,SAAS;;;CAIhB,kBAA2C;AACzC,SAAO;GACL,GAAG,KAAK;GACR,IAAI,KAAK;GACT,MAAM;GACP"}
|
|
@@ -4,6 +4,12 @@
|
|
|
4
4
|
*
|
|
5
5
|
* @module
|
|
6
6
|
*/
|
|
7
|
+
/**
|
|
8
|
+
* User-facing configuration for the {@link Email} provider.
|
|
9
|
+
*
|
|
10
|
+
* Use this to wire your email delivery service into Convex Auth's magic-link
|
|
11
|
+
* or OTP flow.
|
|
12
|
+
*/
|
|
7
13
|
interface EmailProviderConfig {
|
|
8
14
|
/** Sender address (e.g. "My App <noreply@example.com>"). */
|
|
9
15
|
from: string;
|
|
@@ -21,10 +27,34 @@ interface EmailProviderConfig {
|
|
|
21
27
|
/** Token expiration in seconds. Defaults to 86400 (24 hours). */
|
|
22
28
|
maxAge?: number;
|
|
23
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* Email provider for magic-link or one-time-code sign-in.
|
|
32
|
+
*
|
|
33
|
+
* Sends verification emails through your `send()` implementation and converts
|
|
34
|
+
* the result into Convex Auth's internal email-provider runtime shape.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```ts
|
|
38
|
+
* import { Email } from "@robelest/convex-auth/providers";
|
|
39
|
+
*
|
|
40
|
+
* const email = new Email({
|
|
41
|
+
* from: "My App <noreply@example.com>",
|
|
42
|
+
* send: async (_ctx, { to, subject, html }) => {
|
|
43
|
+
* await resend.emails.send({ from: "noreply@example.com", to, subject, html });
|
|
44
|
+
* },
|
|
45
|
+
* });
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
24
48
|
declare class Email {
|
|
25
49
|
readonly config: EmailProviderConfig;
|
|
26
50
|
readonly id: string;
|
|
27
51
|
readonly type: "email";
|
|
52
|
+
/**
|
|
53
|
+
* Create an email provider instance.
|
|
54
|
+
*
|
|
55
|
+
* @param config - Email transport and provider settings.
|
|
56
|
+
* @throws {Error} When `config.from` is empty or whitespace-only.
|
|
57
|
+
*/
|
|
28
58
|
constructor(config: EmailProviderConfig);
|
|
29
59
|
}
|
|
30
60
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.d.ts","names":[],"sources":["../../src/providers/email.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"email.d.ts","names":[],"sources":["../../src/providers/email.ts"],"mappings":";;AAeA;;;;;;;;;;UAAiB,mBAAA;EAMb;EAJF,IAAA;EAOA;EALA,IAAA,GACE,GAAA,OACA,IAAA;IAAQ,IAAA;IAAc,EAAA;IAAY,OAAA;IAAiB,IAAA;EAAA,MAChD,OAAA;EA2BW;EAzBhB,yBAAA,SAAkC,OAAA;EAmCqB;EAjCvD,EAAA;EAiCoC;EA/BpC,MAAA;AAAA;;;;;;;;;;;;;;;;;;;cAqBW,KAAA;EAAA,SAUiB,MAAA,EAAQ,mBAAA;EAAA,SAT3B,EAAA;EAAA,SACA,IAAA;;;;;;;cAQmB,MAAA,EAAQ,mBAAA;AAAA"}
|
package/dist/providers/email.js
CHANGED
|
@@ -6,9 +6,33 @@ import { defaultMagicLinkEmail } from "../server/templates.js";
|
|
|
6
6
|
*
|
|
7
7
|
* @module
|
|
8
8
|
*/
|
|
9
|
+
/**
|
|
10
|
+
* Email provider for magic-link or one-time-code sign-in.
|
|
11
|
+
*
|
|
12
|
+
* Sends verification emails through your `send()` implementation and converts
|
|
13
|
+
* the result into Convex Auth's internal email-provider runtime shape.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* import { Email } from "@robelest/convex-auth/providers";
|
|
18
|
+
*
|
|
19
|
+
* const email = new Email({
|
|
20
|
+
* from: "My App <noreply@example.com>",
|
|
21
|
+
* send: async (_ctx, { to, subject, html }) => {
|
|
22
|
+
* await resend.emails.send({ from: "noreply@example.com", to, subject, html });
|
|
23
|
+
* },
|
|
24
|
+
* });
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
9
27
|
var Email = class {
|
|
10
28
|
id;
|
|
11
29
|
type = "email";
|
|
30
|
+
/**
|
|
31
|
+
* Create an email provider instance.
|
|
32
|
+
*
|
|
33
|
+
* @param config - Email transport and provider settings.
|
|
34
|
+
* @throws {Error} When `config.from` is empty or whitespace-only.
|
|
35
|
+
*/
|
|
12
36
|
constructor(config) {
|
|
13
37
|
this.config = config;
|
|
14
38
|
if (config.from.trim().length === 0) throw new Error("Email provider requires a non-empty `from` address (for example, `\"My App <noreply@example.com>\"`).");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.js","names":[],"sources":["../../src/providers/email.ts"],"sourcesContent":["/**\n * Email (magic link / OTP) authentication provider.\n *\n * @module\n */\n\nimport { defaultMagicLinkEmail } from \"../server/templates\";\nimport type { EmailConfig } from \"../server/types\";\n\nexport interface EmailProviderConfig {\n /** Sender address (e.g. \"My App <noreply@example.com>\"). */\n from: string;\n /** Send the verification email. Receives the Convex action context. */\n send: (\n ctx: any,\n opts: { from: string; to: string; subject: string; html: string },\n ) => Promise<void>;\n /** Override to generate a custom verification token. */\n generateVerificationToken?: () => Promise<string>;\n /** Provider ID override. Defaults to \"email\". */\n id?: string;\n /** Token expiration in seconds. Defaults to 86400 (24 hours). */\n maxAge?: number;\n}\n\nexport class Email {\n readonly id: string;\n readonly type = \"email\" as const;\n\n constructor(public readonly config: EmailProviderConfig) {\n const from = config.from.trim();\n if (from.length === 0) {\n throw new Error(\n \"Email provider requires a non-empty `from` address \" +\n '(for example, `\"My App <noreply@example.com>\"`).',\n );\n }\n this.id = config.id ?? \"email\";\n }\n\n /** @internal */\n _toMaterialized(): EmailConfig {\n const from = this.config.from.trim();\n const { send } = this.config;\n const { generateVerificationToken } = this.config;\n return {\n id: this.id,\n type: \"email\",\n name: \"Email\",\n from,\n maxAge: this.config.maxAge ?? 60 * 60 * 24,\n authorize: undefined,\n sendVerificationRequest: async ({ identifier, url }, ctx) => {\n if (!ctx) {\n throw new Error(\"Email provider requires a Convex action context.\");\n }\n const { host } = new URL(url);\n await send(ctx, {\n from,\n to: identifier,\n subject: `Sign in to ${host}`,\n html: defaultMagicLinkEmail(url, host),\n });\n },\n generateVerificationToken,\n options: { from } as any,\n };\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"email.js","names":[],"sources":["../../src/providers/email.ts"],"sourcesContent":["/**\n * Email (magic link / OTP) authentication provider.\n *\n * @module\n */\n\nimport { defaultMagicLinkEmail } from \"../server/templates\";\nimport type { EmailConfig } from \"../server/types\";\n\n/**\n * User-facing configuration for the {@link Email} provider.\n *\n * Use this to wire your email delivery service into Convex Auth's magic-link\n * or OTP flow.\n */\nexport interface EmailProviderConfig {\n /** Sender address (e.g. \"My App <noreply@example.com>\"). */\n from: string;\n /** Send the verification email. Receives the Convex action context. */\n send: (\n ctx: any,\n opts: { from: string; to: string; subject: string; html: string },\n ) => Promise<void>;\n /** Override to generate a custom verification token. */\n generateVerificationToken?: () => Promise<string>;\n /** Provider ID override. Defaults to \"email\". */\n id?: string;\n /** Token expiration in seconds. Defaults to 86400 (24 hours). */\n maxAge?: number;\n}\n\n/**\n * Email provider for magic-link or one-time-code sign-in.\n *\n * Sends verification emails through your `send()` implementation and converts\n * the result into Convex Auth's internal email-provider runtime shape.\n *\n * @example\n * ```ts\n * import { Email } from \"@robelest/convex-auth/providers\";\n *\n * const email = new Email({\n * from: \"My App <noreply@example.com>\",\n * send: async (_ctx, { to, subject, html }) => {\n * await resend.emails.send({ from: \"noreply@example.com\", to, subject, html });\n * },\n * });\n * ```\n */\nexport class Email {\n readonly id: string;\n readonly type = \"email\" as const;\n\n /**\n * Create an email provider instance.\n *\n * @param config - Email transport and provider settings.\n * @throws {Error} When `config.from` is empty or whitespace-only.\n */\n constructor(public readonly config: EmailProviderConfig) {\n const from = config.from.trim();\n if (from.length === 0) {\n throw new Error(\n \"Email provider requires a non-empty `from` address \" +\n '(for example, `\"My App <noreply@example.com>\"`).',\n );\n }\n this.id = config.id ?? \"email\";\n }\n\n /** @internal */\n _toMaterialized(): EmailConfig {\n const from = this.config.from.trim();\n const { send } = this.config;\n const { generateVerificationToken } = this.config;\n return {\n id: this.id,\n type: \"email\",\n name: \"Email\",\n from,\n maxAge: this.config.maxAge ?? 60 * 60 * 24,\n authorize: undefined,\n sendVerificationRequest: async ({ identifier, url }, ctx) => {\n if (!ctx) {\n throw new Error(\"Email provider requires a Convex action context.\");\n }\n const { host } = new URL(url);\n await send(ctx, {\n from,\n to: identifier,\n subject: `Sign in to ${host}`,\n html: defaultMagicLinkEmail(url, host),\n });\n },\n generateVerificationToken,\n options: { from } as any,\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAiDA,IAAa,QAAb,MAAmB;CACjB,AAAS;CACT,AAAS,OAAO;;;;;;;CAQhB,YAAY,AAAgB,QAA6B;EAA7B;AAE1B,MADa,OAAO,KAAK,MAAM,CACtB,WAAW,EAClB,OAAM,IAAI,MACR,wGAED;AAEH,OAAK,KAAK,OAAO,MAAM;;;CAIzB,kBAA+B;EAC7B,MAAM,OAAO,KAAK,OAAO,KAAK,MAAM;EACpC,MAAM,EAAE,SAAS,KAAK;EACtB,MAAM,EAAE,8BAA8B,KAAK;AAC3C,SAAO;GACL,IAAI,KAAK;GACT,MAAM;GACN,MAAM;GACN;GACA,QAAQ,KAAK,OAAO,UAAU,OAAU;GACxC,WAAW;GACX,yBAAyB,OAAO,EAAE,YAAY,OAAO,QAAQ;AAC3D,QAAI,CAAC,IACH,OAAM,IAAI,MAAM,mDAAmD;IAErE,MAAM,EAAE,SAAS,IAAI,IAAI,IAAI;AAC7B,UAAM,KAAK,KAAK;KACd;KACA,IAAI;KACJ,SAAS,cAAc;KACvB,MAAM,sBAAsB,KAAK,KAAK;KACvC,CAAC;;GAEJ;GACA,SAAS,EAAE,MAAM;GAClB"}
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { PhoneConfig } from "../server/types.js";
|
|
2
2
|
|
|
3
3
|
//#region src/providers/phone.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* User-facing configuration for the {@link Phone} provider.
|
|
6
|
+
*
|
|
7
|
+
* Use this to send SMS or other phone-based verification messages during
|
|
8
|
+
* sign-in.
|
|
9
|
+
*/
|
|
4
10
|
interface PhoneProviderConfig {
|
|
5
11
|
/** Send the verification code to the user's phone. */
|
|
6
12
|
send: PhoneConfig["sendVerificationRequest"];
|
|
@@ -9,10 +15,32 @@ interface PhoneProviderConfig {
|
|
|
9
15
|
/** Token expiration in seconds. Defaults to 1200 (20 minutes). */
|
|
10
16
|
maxAge?: number;
|
|
11
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Phone provider for SMS or phone-number verification flows.
|
|
20
|
+
*
|
|
21
|
+
* Wraps your `send()` implementation and materializes the runtime behavior
|
|
22
|
+
* Convex Auth needs for short-code or magic-link-style phone verification.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* import { Phone } from "@robelest/convex-auth/providers";
|
|
27
|
+
*
|
|
28
|
+
* const phone = new Phone({
|
|
29
|
+
* send: async ({ identifier, token }) => {
|
|
30
|
+
* await sms.send({ to: identifier, body: `Your sign-in code is ${token}` });
|
|
31
|
+
* },
|
|
32
|
+
* });
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
12
35
|
declare class Phone {
|
|
13
36
|
readonly config: PhoneProviderConfig;
|
|
14
37
|
readonly id: string;
|
|
15
38
|
readonly type: "phone";
|
|
39
|
+
/**
|
|
40
|
+
* Create a phone provider instance.
|
|
41
|
+
*
|
|
42
|
+
* @param config - Phone delivery and provider settings.
|
|
43
|
+
*/
|
|
16
44
|
constructor(config: PhoneProviderConfig);
|
|
17
45
|
}
|
|
18
46
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"phone.d.ts","names":[],"sources":["../../src/providers/phone.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"phone.d.ts","names":[],"sources":["../../src/providers/phone.ts"],"mappings":";;;;;;;;;UAgBiB,mBAAA;EA0BJ;EAxBX,IAAA,EAAM,WAAA;;EAEN,EAAA;EA+B4B;EA7B5B,MAAA;AAAA;;;;;;;;;;;;;;;;;;cAoBW,KAAA;EAAA,SASiB,MAAA,EAAQ,mBAAA;EAAA,SAR3B,EAAA;EAAA,SACA,IAAA;;;;;;cAOmB,MAAA,EAAQ,mBAAA;AAAA"}
|
package/dist/providers/phone.js
CHANGED
|
@@ -6,9 +6,31 @@ import { Fx } from "@robelest/fx";
|
|
|
6
6
|
*
|
|
7
7
|
* @module
|
|
8
8
|
*/
|
|
9
|
+
/**
|
|
10
|
+
* Phone provider for SMS or phone-number verification flows.
|
|
11
|
+
*
|
|
12
|
+
* Wraps your `send()` implementation and materializes the runtime behavior
|
|
13
|
+
* Convex Auth needs for short-code or magic-link-style phone verification.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* import { Phone } from "@robelest/convex-auth/providers";
|
|
18
|
+
*
|
|
19
|
+
* const phone = new Phone({
|
|
20
|
+
* send: async ({ identifier, token }) => {
|
|
21
|
+
* await sms.send({ to: identifier, body: `Your sign-in code is ${token}` });
|
|
22
|
+
* },
|
|
23
|
+
* });
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
9
26
|
var Phone = class {
|
|
10
27
|
id;
|
|
11
28
|
type = "phone";
|
|
29
|
+
/**
|
|
30
|
+
* Create a phone provider instance.
|
|
31
|
+
*
|
|
32
|
+
* @param config - Phone delivery and provider settings.
|
|
33
|
+
*/
|
|
12
34
|
constructor(config) {
|
|
13
35
|
this.config = config;
|
|
14
36
|
this.id = config.id ?? "phone";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"phone.js","names":[],"sources":["../../src/providers/phone.ts"],"sourcesContent":["/**\n * Phone / SMS authentication provider.\n *\n * @module\n */\n\nimport { Fx } from \"@robelest/fx\";\n\nimport type { PhoneConfig } from \"../server/types\";\n\nexport interface PhoneProviderConfig {\n /** Send the verification code to the user's phone. */\n send: PhoneConfig[\"sendVerificationRequest\"];\n /** Provider ID override. Defaults to \"phone\". */\n id?: string;\n /** Token expiration in seconds. Defaults to 1200 (20 minutes). */\n maxAge?: number;\n}\n\nexport class Phone {\n readonly id: string;\n readonly type = \"phone\" as const;\n\n constructor(public readonly config: PhoneProviderConfig) {\n this.id = config.id ?? \"phone\";\n }\n\n /** @internal */\n _toMaterialized(): PhoneConfig {\n return {\n id: this.id,\n type: \"phone\",\n maxAge: this.config.maxAge ?? 60 * 20,\n authorize: async (params, account) => {\n const dispatch =\n typeof params.phone !== \"string\"\n ? ({ tag: \"missingPhone\" } as const)\n : account.providerAccountId !== params.phone\n ? ({ tag: \"mismatch\" } as const)\n : ({ tag: \"ok\" } as const);\n\n return await Fx.run(\n Fx.match(dispatch, dispatch.tag, {\n missingPhone: () =>\n Fx.fatal(\n new Error(\n \"Token verification requires a `phone` in params of `signIn`.\",\n ),\n ),\n mismatch: () =>\n Fx.fatal(\n new Error(\n \"Short verification code requires a matching `phone` \" +\n \"in params of `signIn`.\",\n ),\n ),\n ok: () => Fx.succeed(undefined),\n }),\n );\n },\n sendVerificationRequest: this.config.send,\n options: {} as any,\n };\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"phone.js","names":[],"sources":["../../src/providers/phone.ts"],"sourcesContent":["/**\n * Phone / SMS authentication provider.\n *\n * @module\n */\n\nimport { Fx } from \"@robelest/fx\";\n\nimport type { PhoneConfig } from \"../server/types\";\n\n/**\n * User-facing configuration for the {@link Phone} provider.\n *\n * Use this to send SMS or other phone-based verification messages during\n * sign-in.\n */\nexport interface PhoneProviderConfig {\n /** Send the verification code to the user's phone. */\n send: PhoneConfig[\"sendVerificationRequest\"];\n /** Provider ID override. Defaults to \"phone\". */\n id?: string;\n /** Token expiration in seconds. Defaults to 1200 (20 minutes). */\n maxAge?: number;\n}\n\n/**\n * Phone provider for SMS or phone-number verification flows.\n *\n * Wraps your `send()` implementation and materializes the runtime behavior\n * Convex Auth needs for short-code or magic-link-style phone verification.\n *\n * @example\n * ```ts\n * import { Phone } from \"@robelest/convex-auth/providers\";\n *\n * const phone = new Phone({\n * send: async ({ identifier, token }) => {\n * await sms.send({ to: identifier, body: `Your sign-in code is ${token}` });\n * },\n * });\n * ```\n */\nexport class Phone {\n readonly id: string;\n readonly type = \"phone\" as const;\n\n /**\n * Create a phone provider instance.\n *\n * @param config - Phone delivery and provider settings.\n */\n constructor(public readonly config: PhoneProviderConfig) {\n this.id = config.id ?? \"phone\";\n }\n\n /** @internal */\n _toMaterialized(): PhoneConfig {\n return {\n id: this.id,\n type: \"phone\",\n maxAge: this.config.maxAge ?? 60 * 20,\n authorize: async (params, account) => {\n const dispatch =\n typeof params.phone !== \"string\"\n ? ({ tag: \"missingPhone\" } as const)\n : account.providerAccountId !== params.phone\n ? ({ tag: \"mismatch\" } as const)\n : ({ tag: \"ok\" } as const);\n\n return await Fx.run(\n Fx.match(dispatch, dispatch.tag, {\n missingPhone: () =>\n Fx.fatal(\n new Error(\n \"Token verification requires a `phone` in params of `signIn`.\",\n ),\n ),\n mismatch: () =>\n Fx.fatal(\n new Error(\n \"Short verification code requires a matching `phone` \" +\n \"in params of `signIn`.\",\n ),\n ),\n ok: () => Fx.succeed(undefined),\n }),\n );\n },\n sendVerificationRequest: this.config.send,\n options: {} as any,\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AA0CA,IAAa,QAAb,MAAmB;CACjB,AAAS;CACT,AAAS,OAAO;;;;;;CAOhB,YAAY,AAAgB,QAA6B;EAA7B;AAC1B,OAAK,KAAK,OAAO,MAAM;;;CAIzB,kBAA+B;AAC7B,SAAO;GACL,IAAI,KAAK;GACT,MAAM;GACN,QAAQ,KAAK,OAAO,UAAU;GAC9B,WAAW,OAAO,QAAQ,YAAY;IACpC,MAAM,WACJ,OAAO,OAAO,UAAU,WACnB,EAAE,KAAK,gBAAgB,GACxB,QAAQ,sBAAsB,OAAO,QAClC,EAAE,KAAK,YAAY,GACnB,EAAE,KAAK,MAAM;AAEtB,WAAO,MAAM,GAAG,IACd,GAAG,MAAM,UAAU,SAAS,KAAK;KAC/B,oBACE,GAAG,sBACD,IAAI,MACF,+DACD,CACF;KACH,gBACE,GAAG,sBACD,IAAI,MACF,6EAED,CACF;KACH,UAAU,GAAG,QAAQ,OAAU;KAChC,CAAC,CACH;;GAEH,yBAAyB,KAAK,OAAO;GACrC,SAAS,EAAE;GACZ"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { Fx } from "@robelest/fx";
|
|
2
|
+
|
|
3
|
+
//#region src/client/runtime/browser.ts
|
|
4
|
+
/** @internal */
|
|
5
|
+
function base64urlEncode(buffer) {
|
|
6
|
+
const bytes = new Uint8Array(buffer);
|
|
7
|
+
let binary = "";
|
|
8
|
+
for (let i = 0; i < bytes.byteLength; i++) binary += String.fromCharCode(bytes[i]);
|
|
9
|
+
return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
10
|
+
}
|
|
11
|
+
/** @internal */
|
|
12
|
+
function base64urlDecode(str) {
|
|
13
|
+
const padded = str.replace(/-/g, "+").replace(/_/g, "/");
|
|
14
|
+
const binary = atob(padded);
|
|
15
|
+
const bytes = new Uint8Array(binary.length);
|
|
16
|
+
for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);
|
|
17
|
+
return bytes;
|
|
18
|
+
}
|
|
19
|
+
/** @internal */
|
|
20
|
+
async function browserMutex(key, callback) {
|
|
21
|
+
const lockManager = globalThis?.navigator?.locks;
|
|
22
|
+
return lockManager !== void 0 ? await lockManager.request(key, callback) : await manualMutex(key, callback);
|
|
23
|
+
}
|
|
24
|
+
/** @internal */
|
|
25
|
+
function getStorageListenerRegistry() {
|
|
26
|
+
const globalAny = globalThis;
|
|
27
|
+
if (globalAny.__convexAuthStorageListeners === void 0) globalAny.__convexAuthStorageListeners = {};
|
|
28
|
+
return globalAny.__convexAuthStorageListeners;
|
|
29
|
+
}
|
|
30
|
+
function getManualMutexTails() {
|
|
31
|
+
const globalAny = globalThis;
|
|
32
|
+
if (globalAny.__convexAuthMutexTails === void 0) globalAny.__convexAuthMutexTails = {};
|
|
33
|
+
return globalAny.__convexAuthMutexTails;
|
|
34
|
+
}
|
|
35
|
+
async function manualMutex(key, callback) {
|
|
36
|
+
const mutexTails = getManualMutexTails();
|
|
37
|
+
const previousTail = mutexTails[key] ?? Promise.resolve();
|
|
38
|
+
let releaseCurrent;
|
|
39
|
+
const currentTail = new Promise((resolve) => {
|
|
40
|
+
releaseCurrent = resolve;
|
|
41
|
+
});
|
|
42
|
+
mutexTails[key] = previousTail.then(() => currentTail, () => currentTail);
|
|
43
|
+
await Fx.run(Fx.from({
|
|
44
|
+
ok: () => previousTail,
|
|
45
|
+
err: () => void 0
|
|
46
|
+
}).pipe(Fx.recover(() => Fx.succeed(void 0))));
|
|
47
|
+
let result;
|
|
48
|
+
let threw = false;
|
|
49
|
+
let thrownError;
|
|
50
|
+
await Fx.run(Fx.from({
|
|
51
|
+
ok: async () => {
|
|
52
|
+
result = await callback();
|
|
53
|
+
},
|
|
54
|
+
err: (e) => e
|
|
55
|
+
}).pipe(Fx.recover((e) => {
|
|
56
|
+
threw = true;
|
|
57
|
+
thrownError = e;
|
|
58
|
+
return Fx.succeed(void 0);
|
|
59
|
+
})));
|
|
60
|
+
releaseCurrent?.();
|
|
61
|
+
if (mutexTails[key] === currentTail) delete mutexTails[key];
|
|
62
|
+
if (threw) throw thrownError;
|
|
63
|
+
return result;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
//#endregion
|
|
67
|
+
export { base64urlDecode, base64urlEncode, browserMutex, getStorageListenerRegistry };
|
|
68
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","names":[],"sources":["../../src/client/runtime/browser.ts"],"sourcesContent":["import { Fx } from \"@robelest/fx\";\n\n/** @internal */\nexport function base64urlEncode(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer);\n let binary = \"\";\n for (let i = 0; i < bytes.byteLength; i++) {\n binary += String.fromCharCode(bytes[i]!);\n }\n return btoa(binary)\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=+$/, \"\");\n}\n\n/** @internal */\nexport function base64urlDecode(str: string): Uint8Array {\n const padded = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const binary = atob(padded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\n/** @internal */\nexport async function browserMutex<T>(\n key: string,\n callback: () => Promise<T>,\n): Promise<T> {\n const lockManager = (globalThis as any)?.navigator?.locks;\n return lockManager !== undefined\n ? await lockManager.request(key, callback)\n : await manualMutex(key, callback);\n}\n\n/** @internal */\nexport function getStorageListenerRegistry(): Record<\n string,\n (event: StorageEvent) => void\n> {\n const globalAny = globalThis as any;\n if (globalAny.__convexAuthStorageListeners === undefined) {\n globalAny.__convexAuthStorageListeners = {} as Record<\n string,\n (event: StorageEvent) => void\n >;\n }\n return globalAny.__convexAuthStorageListeners as Record<\n string,\n (event: StorageEvent) => void\n >;\n}\n\nfunction getManualMutexTails(): Record<string, Promise<void>> {\n const globalAny = globalThis as any;\n if (globalAny.__convexAuthMutexTails === undefined) {\n globalAny.__convexAuthMutexTails = {} as Record<string, Promise<void>>;\n }\n return globalAny.__convexAuthMutexTails as Record<string, Promise<void>>;\n}\n\nasync function manualMutex<T>(\n key: string,\n callback: () => Promise<T>,\n): Promise<T> {\n const mutexTails = getManualMutexTails();\n const previousTail = mutexTails[key] ?? Promise.resolve();\n\n let releaseCurrent: (() => void) | undefined;\n const currentTail = new Promise<void>((resolve) => {\n releaseCurrent = resolve;\n });\n\n mutexTails[key] = previousTail.then(\n () => currentTail,\n () => currentTail,\n );\n\n await Fx.run(\n Fx.from({\n ok: () => previousTail,\n err: () => undefined,\n }).pipe(Fx.recover(() => Fx.succeed(undefined))),\n );\n let result: T;\n let threw = false;\n let thrownError: unknown;\n await Fx.run(\n Fx.from({\n ok: async () => {\n result = await callback();\n },\n err: (e) => e,\n }).pipe(\n Fx.recover((e) => {\n threw = true;\n thrownError = e;\n return Fx.succeed(undefined);\n }),\n ),\n );\n releaseCurrent?.();\n if (mutexTails[key] === currentTail) {\n delete mutexTails[key];\n }\n if (threw) {\n throw thrownError;\n }\n return result!;\n}\n"],"mappings":";;;;AAGA,SAAgB,gBAAgB,QAA6B;CAC3D,MAAM,QAAQ,IAAI,WAAW,OAAO;CACpC,IAAI,SAAS;AACb,MAAK,IAAI,IAAI,GAAG,IAAI,MAAM,YAAY,IACpC,WAAU,OAAO,aAAa,MAAM,GAAI;AAE1C,QAAO,KAAK,OAAO,CAChB,QAAQ,OAAO,IAAI,CACnB,QAAQ,OAAO,IAAI,CACnB,QAAQ,OAAO,GAAG;;;AAIvB,SAAgB,gBAAgB,KAAyB;CACvD,MAAM,SAAS,IAAI,QAAQ,MAAM,IAAI,CAAC,QAAQ,MAAM,IAAI;CACxD,MAAM,SAAS,KAAK,OAAO;CAC3B,MAAM,QAAQ,IAAI,WAAW,OAAO,OAAO;AAC3C,MAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,IACjC,OAAM,KAAK,OAAO,WAAW,EAAE;AAEjC,QAAO;;;AAIT,eAAsB,aACpB,KACA,UACY;CACZ,MAAM,cAAe,YAAoB,WAAW;AACpD,QAAO,gBAAgB,SACnB,MAAM,YAAY,QAAQ,KAAK,SAAS,GACxC,MAAM,YAAY,KAAK,SAAS;;;AAItC,SAAgB,6BAGd;CACA,MAAM,YAAY;AAClB,KAAI,UAAU,iCAAiC,OAC7C,WAAU,+BAA+B,EAAE;AAK7C,QAAO,UAAU;;AAMnB,SAAS,sBAAqD;CAC5D,MAAM,YAAY;AAClB,KAAI,UAAU,2BAA2B,OACvC,WAAU,yBAAyB,EAAE;AAEvC,QAAO,UAAU;;AAGnB,eAAe,YACb,KACA,UACY;CACZ,MAAM,aAAa,qBAAqB;CACxC,MAAM,eAAe,WAAW,QAAQ,QAAQ,SAAS;CAEzD,IAAI;CACJ,MAAM,cAAc,IAAI,SAAe,YAAY;AACjD,mBAAiB;GACjB;AAEF,YAAW,OAAO,aAAa,WACvB,mBACA,YACP;AAED,OAAM,GAAG,IACP,GAAG,KAAK;EACN,UAAU;EACV,WAAW;EACZ,CAAC,CAAC,KAAK,GAAG,cAAc,GAAG,QAAQ,OAAU,CAAC,CAAC,CACjD;CACD,IAAI;CACJ,IAAI,QAAQ;CACZ,IAAI;AACJ,OAAM,GAAG,IACP,GAAG,KAAK;EACN,IAAI,YAAY;AACd,YAAS,MAAM,UAAU;;EAE3B,MAAM,MAAM;EACb,CAAC,CAAC,KACD,GAAG,SAAS,MAAM;AAChB,UAAQ;AACR,gBAAc;AACd,SAAO,GAAG,QAAQ,OAAU;GAC5B,CACH,CACF;AACD,mBAAkB;AAClB,KAAI,WAAW,SAAS,YACtB,QAAO,WAAW;AAEpB,KAAI,MACF,OAAM;AAER,QAAO"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
//#region src/client/runtime/invite.ts
|
|
2
|
+
/** @internal */
|
|
3
|
+
function createInviteManager(args) {
|
|
4
|
+
const { param, storageGet, storageSet, storageRemove, cleanUrlParams, tokenKey, emailKey } = args;
|
|
5
|
+
let pendingInvite = null;
|
|
6
|
+
const urlInviteToken = param("invite");
|
|
7
|
+
if (urlInviteToken) pendingInvite = {
|
|
8
|
+
token: urlInviteToken,
|
|
9
|
+
email: param("email")
|
|
10
|
+
};
|
|
11
|
+
else (async () => {
|
|
12
|
+
const storedToken = await storageGet(tokenKey);
|
|
13
|
+
if (storedToken && !pendingInvite) {
|
|
14
|
+
pendingInvite = {
|
|
15
|
+
token: storedToken,
|
|
16
|
+
email: await storageGet(emailKey) ?? null
|
|
17
|
+
};
|
|
18
|
+
storageRemove(tokenKey);
|
|
19
|
+
storageRemove(emailKey);
|
|
20
|
+
}
|
|
21
|
+
})();
|
|
22
|
+
return {
|
|
23
|
+
getPendingInvite() {
|
|
24
|
+
return pendingInvite;
|
|
25
|
+
},
|
|
26
|
+
async persistInvite() {
|
|
27
|
+
if (!pendingInvite) return;
|
|
28
|
+
await storageSet(tokenKey, pendingInvite.token);
|
|
29
|
+
if (pendingInvite.email) await storageSet(emailKey, pendingInvite.email);
|
|
30
|
+
},
|
|
31
|
+
async acceptInvite() {
|
|
32
|
+
if (!pendingInvite) return {
|
|
33
|
+
ok: false,
|
|
34
|
+
message: "No pending invite"
|
|
35
|
+
};
|
|
36
|
+
const { token } = pendingInvite;
|
|
37
|
+
pendingInvite = null;
|
|
38
|
+
storageRemove(tokenKey);
|
|
39
|
+
storageRemove(emailKey);
|
|
40
|
+
cleanUrlParams(["invite", "email"]);
|
|
41
|
+
return {
|
|
42
|
+
ok: true,
|
|
43
|
+
token
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
//#endregion
|
|
50
|
+
export { createInviteManager };
|
|
51
|
+
//# sourceMappingURL=invite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invite.js","names":[],"sources":["../../src/client/runtime/invite.ts"],"sourcesContent":["/** @internal */\nexport function createInviteManager(args: {\n param: (name: string) => string | null;\n storageGet: (name: string) => Promise<string | null>;\n storageSet: (name: string, value: string) => Promise<void>;\n storageRemove: (name: string) => Promise<void>;\n cleanUrlParams: (params: string[]) => void;\n tokenKey: string;\n emailKey: string;\n}) {\n const {\n param,\n storageGet,\n storageSet,\n storageRemove,\n cleanUrlParams,\n tokenKey,\n emailKey,\n } = args;\n\n let pendingInvite: { token: string; email: string | null } | null = null;\n\n const urlInviteToken = param(\"invite\");\n if (urlInviteToken) {\n pendingInvite = { token: urlInviteToken, email: param(\"email\") };\n } else {\n void (async () => {\n const storedToken = await storageGet(tokenKey);\n if (storedToken && !pendingInvite) {\n pendingInvite = {\n token: storedToken,\n email: (await storageGet(emailKey)) ?? null,\n };\n void storageRemove(tokenKey);\n void storageRemove(emailKey);\n }\n })();\n }\n\n return {\n getPendingInvite() {\n return pendingInvite;\n },\n async persistInvite() {\n if (!pendingInvite) return;\n await storageSet(tokenKey, pendingInvite.token);\n if (pendingInvite.email) {\n await storageSet(emailKey, pendingInvite.email);\n }\n },\n async acceptInvite(): Promise<{\n ok: boolean;\n token?: string;\n message?: string;\n }> {\n if (!pendingInvite) return { ok: false, message: \"No pending invite\" };\n const { token } = pendingInvite;\n pendingInvite = null;\n void storageRemove(tokenKey);\n void storageRemove(emailKey);\n cleanUrlParams([\"invite\", \"email\"]);\n return { ok: true, token };\n },\n };\n}\n"],"mappings":";;AACA,SAAgB,oBAAoB,MAQjC;CACD,MAAM,EACJ,OACA,YACA,YACA,eACA,gBACA,UACA,aACE;CAEJ,IAAI,gBAAgE;CAEpE,MAAM,iBAAiB,MAAM,SAAS;AACtC,KAAI,eACF,iBAAgB;EAAE,OAAO;EAAgB,OAAO,MAAM,QAAQ;EAAE;KAEhE,EAAM,YAAY;EAChB,MAAM,cAAc,MAAM,WAAW,SAAS;AAC9C,MAAI,eAAe,CAAC,eAAe;AACjC,mBAAgB;IACd,OAAO;IACP,OAAQ,MAAM,WAAW,SAAS,IAAK;IACxC;AACD,GAAK,cAAc,SAAS;AAC5B,GAAK,cAAc,SAAS;;KAE5B;AAGN,QAAO;EACL,mBAAmB;AACjB,UAAO;;EAET,MAAM,gBAAgB;AACpB,OAAI,CAAC,cAAe;AACpB,SAAM,WAAW,UAAU,cAAc,MAAM;AAC/C,OAAI,cAAc,MAChB,OAAM,WAAW,UAAU,cAAc,MAAM;;EAGnD,MAAM,eAIH;AACD,OAAI,CAAC,cAAe,QAAO;IAAE,IAAI;IAAO,SAAS;IAAqB;GACtE,MAAM,EAAE,UAAU;AAClB,mBAAgB;AAChB,GAAK,cAAc,SAAS;AAC5B,GAAK,cAAc,SAAS;AAC5B,kBAAe,CAAC,UAAU,QAAQ,CAAC;AACnC,UAAO;IAAE,IAAI;IAAM;IAAO;;EAE7B"}
|