@portaidentity/server 1.7.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/CHANGELOG.md +11 -0
- package/LICENSE +21 -0
- package/README.md +33 -0
- package/dist/applications/cache.d.ts +64 -0
- package/dist/applications/cache.d.ts.map +1 -0
- package/dist/applications/cache.js +161 -0
- package/dist/applications/cache.js.map +1 -0
- package/dist/applications/errors.d.ts +25 -0
- package/dist/applications/errors.d.ts.map +1 -0
- package/dist/applications/errors.js +31 -0
- package/dist/applications/errors.js.map +1 -0
- package/dist/applications/index.d.ts +17 -0
- package/dist/applications/index.d.ts.map +1 -0
- package/dist/applications/index.js +19 -0
- package/dist/applications/index.js.map +1 -0
- package/dist/applications/repository.d.ts +184 -0
- package/dist/applications/repository.d.ts.map +1 -0
- package/dist/applications/repository.js +367 -0
- package/dist/applications/repository.js.map +1 -0
- package/dist/applications/service.d.ts +160 -0
- package/dist/applications/service.d.ts.map +1 -0
- package/dist/applications/service.js +388 -0
- package/dist/applications/service.js.map +1 -0
- package/dist/applications/slugs.d.ts +61 -0
- package/dist/applications/slugs.d.ts.map +1 -0
- package/dist/applications/slugs.js +115 -0
- package/dist/applications/slugs.js.map +1 -0
- package/dist/applications/types.d.ts +129 -0
- package/dist/applications/types.d.ts.map +1 -0
- package/dist/applications/types.js +62 -0
- package/dist/applications/types.js.map +1 -0
- package/dist/auth/csrf.d.ts +71 -0
- package/dist/auth/csrf.d.ts.map +1 -0
- package/dist/auth/csrf.js +112 -0
- package/dist/auth/csrf.js.map +1 -0
- package/dist/auth/email-renderer.d.ts +37 -0
- package/dist/auth/email-renderer.d.ts.map +1 -0
- package/dist/auth/email-renderer.js +116 -0
- package/dist/auth/email-renderer.js.map +1 -0
- package/dist/auth/email-service.d.ts +154 -0
- package/dist/auth/email-service.d.ts.map +1 -0
- package/dist/auth/email-service.js +415 -0
- package/dist/auth/email-service.js.map +1 -0
- package/dist/auth/email-transport.d.ts +65 -0
- package/dist/auth/email-transport.d.ts.map +1 -0
- package/dist/auth/email-transport.js +82 -0
- package/dist/auth/email-transport.js.map +1 -0
- package/dist/auth/i18n.d.ts +81 -0
- package/dist/auth/i18n.d.ts.map +1 -0
- package/dist/auth/i18n.js +395 -0
- package/dist/auth/i18n.js.map +1 -0
- package/dist/auth/index.d.ts +28 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +31 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/interaction-authority.d.ts +39 -0
- package/dist/auth/interaction-authority.d.ts.map +1 -0
- package/dist/auth/interaction-authority.js +30 -0
- package/dist/auth/interaction-authority.js.map +1 -0
- package/dist/auth/magic-link-session.d.ts +81 -0
- package/dist/auth/magic-link-session.d.ts.map +1 -0
- package/dist/auth/magic-link-session.js +183 -0
- package/dist/auth/magic-link-session.js.map +1 -0
- package/dist/auth/rate-limiter.d.ts +143 -0
- package/dist/auth/rate-limiter.d.ts.map +1 -0
- package/dist/auth/rate-limiter.js +220 -0
- package/dist/auth/rate-limiter.js.map +1 -0
- package/dist/auth/recovery-crypto.d.ts +34 -0
- package/dist/auth/recovery-crypto.d.ts.map +1 -0
- package/dist/auth/recovery-crypto.js +103 -0
- package/dist/auth/recovery-crypto.js.map +1 -0
- package/dist/auth/recovery-job-processor.d.ts +24 -0
- package/dist/auth/recovery-job-processor.d.ts.map +1 -0
- package/dist/auth/recovery-job-processor.js +123 -0
- package/dist/auth/recovery-job-processor.js.map +1 -0
- package/dist/auth/recovery-job-repository.d.ts +219 -0
- package/dist/auth/recovery-job-repository.d.ts.map +1 -0
- package/dist/auth/recovery-job-repository.js +340 -0
- package/dist/auth/recovery-job-repository.js.map +1 -0
- package/dist/auth/recovery-service.d.ts +27 -0
- package/dist/auth/recovery-service.d.ts.map +1 -0
- package/dist/auth/recovery-service.js +53 -0
- package/dist/auth/recovery-service.js.map +1 -0
- package/dist/auth/recovery-worker.d.ts +158 -0
- package/dist/auth/recovery-worker.d.ts.map +1 -0
- package/dist/auth/recovery-worker.js +306 -0
- package/dist/auth/recovery-worker.js.map +1 -0
- package/dist/auth/template-engine.d.ts +134 -0
- package/dist/auth/template-engine.d.ts.map +1 -0
- package/dist/auth/template-engine.js +225 -0
- package/dist/auth/template-engine.js.map +1 -0
- package/dist/auth/token-repository.d.ts +238 -0
- package/dist/auth/token-repository.d.ts.map +1 -0
- package/dist/auth/token-repository.js +475 -0
- package/dist/auth/token-repository.js.map +1 -0
- package/dist/auth/tokens.d.ts +45 -0
- package/dist/auth/tokens.d.ts.map +1 -0
- package/dist/auth/tokens.js +51 -0
- package/dist/auth/tokens.js.map +1 -0
- package/dist/cli/bootstrap.d.ts +55 -0
- package/dist/cli/bootstrap.d.ts.map +1 -0
- package/dist/cli/bootstrap.js +90 -0
- package/dist/cli/bootstrap.js.map +1 -0
- package/dist/cli/commands/health.d.ts +20 -0
- package/dist/cli/commands/health.d.ts.map +1 -0
- package/dist/cli/commands/health.js +80 -0
- package/dist/cli/commands/health.js.map +1 -0
- package/dist/cli/commands/init.d.ts +48 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +349 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/migrate.d.ts +19 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -0
- package/dist/cli/commands/migrate.js +88 -0
- package/dist/cli/commands/migrate.js.map +1 -0
- package/dist/cli/commands/seed.d.ts +19 -0
- package/dist/cli/commands/seed.d.ts.map +1 -0
- package/dist/cli/commands/seed.js +71 -0
- package/dist/cli/commands/seed.js.map +1 -0
- package/dist/cli/commands/user-2fa.d.ts +29 -0
- package/dist/cli/commands/user-2fa.d.ts.map +1 -0
- package/dist/cli/commands/user-2fa.js +113 -0
- package/dist/cli/commands/user-2fa.js.map +1 -0
- package/dist/cli/error-handler.d.ts +31 -0
- package/dist/cli/error-handler.d.ts.map +1 -0
- package/dist/cli/error-handler.js +65 -0
- package/dist/cli/error-handler.js.map +1 -0
- package/dist/cli/index.d.ts +48 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +99 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/output.d.ts +94 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +124 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/prompt.d.ts +48 -0
- package/dist/cli/prompt.d.ts.map +1 -0
- package/dist/cli/prompt.js +96 -0
- package/dist/cli/prompt.js.map +1 -0
- package/dist/clients/cache.d.ts +63 -0
- package/dist/clients/cache.d.ts.map +1 -0
- package/dist/clients/cache.js +160 -0
- package/dist/clients/cache.js.map +1 -0
- package/dist/clients/crypto.d.ts +69 -0
- package/dist/clients/crypto.d.ts.map +1 -0
- package/dist/clients/crypto.js +83 -0
- package/dist/clients/crypto.js.map +1 -0
- package/dist/clients/errors.d.ts +27 -0
- package/dist/clients/errors.d.ts.map +1 -0
- package/dist/clients/errors.js +33 -0
- package/dist/clients/errors.js.map +1 -0
- package/dist/clients/index.d.ts +19 -0
- package/dist/clients/index.d.ts.map +1 -0
- package/dist/clients/index.js +23 -0
- package/dist/clients/index.js.map +1 -0
- package/dist/clients/repository.d.ts +161 -0
- package/dist/clients/repository.d.ts.map +1 -0
- package/dist/clients/repository.js +318 -0
- package/dist/clients/repository.js.map +1 -0
- package/dist/clients/resolve-login-methods.d.ts +74 -0
- package/dist/clients/resolve-login-methods.d.ts.map +1 -0
- package/dist/clients/resolve-login-methods.js +68 -0
- package/dist/clients/resolve-login-methods.js.map +1 -0
- package/dist/clients/secret-repository.d.ts +109 -0
- package/dist/clients/secret-repository.d.ts.map +1 -0
- package/dist/clients/secret-repository.js +166 -0
- package/dist/clients/secret-repository.js.map +1 -0
- package/dist/clients/secret-service.d.ts +87 -0
- package/dist/clients/secret-service.d.ts.map +1 -0
- package/dist/clients/secret-service.js +204 -0
- package/dist/clients/secret-service.js.map +1 -0
- package/dist/clients/service.d.ts +158 -0
- package/dist/clients/service.d.ts.map +1 -0
- package/dist/clients/service.js +523 -0
- package/dist/clients/service.js.map +1 -0
- package/dist/clients/types.d.ts +214 -0
- package/dist/clients/types.d.ts.map +1 -0
- package/dist/clients/types.js +77 -0
- package/dist/clients/types.js.map +1 -0
- package/dist/clients/validators.d.ts +87 -0
- package/dist/clients/validators.d.ts.map +1 -0
- package/dist/clients/validators.js +164 -0
- package/dist/clients/validators.js.map +1 -0
- package/dist/config/index.d.ts +23 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +52 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/schema.d.ts +35 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +167 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/custom-claims/cache.d.ts +48 -0
- package/dist/custom-claims/cache.d.ts.map +1 -0
- package/dist/custom-claims/cache.js +122 -0
- package/dist/custom-claims/cache.js.map +1 -0
- package/dist/custom-claims/errors.d.ts +25 -0
- package/dist/custom-claims/errors.d.ts.map +1 -0
- package/dist/custom-claims/errors.js +31 -0
- package/dist/custom-claims/errors.js.map +1 -0
- package/dist/custom-claims/index.d.ts +14 -0
- package/dist/custom-claims/index.d.ts.map +1 -0
- package/dist/custom-claims/index.js +17 -0
- package/dist/custom-claims/index.js.map +1 -0
- package/dist/custom-claims/repository.d.ts +147 -0
- package/dist/custom-claims/repository.d.ts.map +1 -0
- package/dist/custom-claims/repository.js +338 -0
- package/dist/custom-claims/repository.js.map +1 -0
- package/dist/custom-claims/service.d.ts +129 -0
- package/dist/custom-claims/service.d.ts.map +1 -0
- package/dist/custom-claims/service.js +296 -0
- package/dist/custom-claims/service.js.map +1 -0
- package/dist/custom-claims/types.d.ts +132 -0
- package/dist/custom-claims/types.d.ts.map +1 -0
- package/dist/custom-claims/types.js +61 -0
- package/dist/custom-claims/types.js.map +1 -0
- package/dist/custom-claims/validators.d.ts +61 -0
- package/dist/custom-claims/validators.d.ts.map +1 -0
- package/dist/custom-claims/validators.js +136 -0
- package/dist/custom-claims/validators.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/admin-permissions.d.ts +147 -0
- package/dist/lib/admin-permissions.d.ts.map +1 -0
- package/dist/lib/admin-permissions.js +261 -0
- package/dist/lib/admin-permissions.js.map +1 -0
- package/dist/lib/audit-log.d.ts +45 -0
- package/dist/lib/audit-log.d.ts.map +1 -0
- package/dist/lib/audit-log.js +79 -0
- package/dist/lib/audit-log.js.map +1 -0
- package/dist/lib/branding-assets.d.ts +47 -0
- package/dist/lib/branding-assets.d.ts.map +1 -0
- package/dist/lib/branding-assets.js +93 -0
- package/dist/lib/branding-assets.js.map +1 -0
- package/dist/lib/bulk-operations.d.ts +54 -0
- package/dist/lib/bulk-operations.d.ts.map +1 -0
- package/dist/lib/bulk-operations.js +201 -0
- package/dist/lib/bulk-operations.js.map +1 -0
- package/dist/lib/cursor.d.ts +110 -0
- package/dist/lib/cursor.d.ts.map +1 -0
- package/dist/lib/cursor.js +115 -0
- package/dist/lib/cursor.js.map +1 -0
- package/dist/lib/data-export.d.ts +67 -0
- package/dist/lib/data-export.d.ts.map +1 -0
- package/dist/lib/data-export.js +272 -0
- package/dist/lib/data-export.js.map +1 -0
- package/dist/lib/data-import-plan.d.ts +50 -0
- package/dist/lib/data-import-plan.d.ts.map +1 -0
- package/dist/lib/data-import-plan.js +235 -0
- package/dist/lib/data-import-plan.js.map +1 -0
- package/dist/lib/data-import.d.ts +276 -0
- package/dist/lib/data-import.d.ts.map +1 -0
- package/dist/lib/data-import.js +1694 -0
- package/dist/lib/data-import.js.map +1 -0
- package/dist/lib/database.d.ts +22 -0
- package/dist/lib/database.d.ts.map +1 -0
- package/dist/lib/database.js +103 -0
- package/dist/lib/database.js.map +1 -0
- package/dist/lib/entity-history.d.ts +52 -0
- package/dist/lib/entity-history.d.ts.map +1 -0
- package/dist/lib/entity-history.js +121 -0
- package/dist/lib/entity-history.js.map +1 -0
- package/dist/lib/etag.d.ts +92 -0
- package/dist/lib/etag.d.ts.map +1 -0
- package/dist/lib/etag.js +155 -0
- package/dist/lib/etag.js.map +1 -0
- package/dist/lib/image-validator.d.ts +44 -0
- package/dist/lib/image-validator.d.ts.map +1 -0
- package/dist/lib/image-validator.js +204 -0
- package/dist/lib/image-validator.js.map +1 -0
- package/dist/lib/logger.d.ts +15 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +84 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/migrator.d.ts +14 -0
- package/dist/lib/migrator.d.ts.map +1 -0
- package/dist/lib/migrator.js +34 -0
- package/dist/lib/migrator.js.map +1 -0
- package/dist/lib/redis.d.ts +5 -0
- package/dist/lib/redis.d.ts.map +1 -0
- package/dist/lib/redis.js +29 -0
- package/dist/lib/redis.js.map +1 -0
- package/dist/lib/runtime-paths.d.ts +38 -0
- package/dist/lib/runtime-paths.d.ts.map +1 -0
- package/dist/lib/runtime-paths.js +50 -0
- package/dist/lib/runtime-paths.js.map +1 -0
- package/dist/lib/session-tracking.d.ts +81 -0
- package/dist/lib/session-tracking.d.ts.map +1 -0
- package/dist/lib/session-tracking.js +145 -0
- package/dist/lib/session-tracking.js.map +1 -0
- package/dist/lib/signing-key-crypto.d.ts +53 -0
- package/dist/lib/signing-key-crypto.d.ts.map +1 -0
- package/dist/lib/signing-key-crypto.js +108 -0
- package/dist/lib/signing-key-crypto.js.map +1 -0
- package/dist/lib/signing-keys.d.ts +141 -0
- package/dist/lib/signing-keys.d.ts.map +1 -0
- package/dist/lib/signing-keys.js +206 -0
- package/dist/lib/signing-keys.js.map +1 -0
- package/dist/lib/stats.d.ts +83 -0
- package/dist/lib/stats.d.ts.map +1 -0
- package/dist/lib/stats.js +187 -0
- package/dist/lib/stats.js.map +1 -0
- package/dist/lib/super-admin-protection.d.ts +69 -0
- package/dist/lib/super-admin-protection.d.ts.map +1 -0
- package/dist/lib/super-admin-protection.js +102 -0
- package/dist/lib/super-admin-protection.js.map +1 -0
- package/dist/lib/system-config.d.ts +79 -0
- package/dist/lib/system-config.d.ts.map +1 -0
- package/dist/lib/system-config.js +159 -0
- package/dist/lib/system-config.js.map +1 -0
- package/dist/middleware/admin-auth.d.ts +100 -0
- package/dist/middleware/admin-auth.d.ts.map +1 -0
- package/dist/middleware/admin-auth.js +241 -0
- package/dist/middleware/admin-auth.js.map +1 -0
- package/dist/middleware/admin-cors.d.ts +41 -0
- package/dist/middleware/admin-cors.d.ts.map +1 -0
- package/dist/middleware/admin-cors.js +83 -0
- package/dist/middleware/admin-cors.js.map +1 -0
- package/dist/middleware/admin-mutation-audit.d.ts +9 -0
- package/dist/middleware/admin-mutation-audit.d.ts.map +1 -0
- package/dist/middleware/admin-mutation-audit.js +76 -0
- package/dist/middleware/admin-mutation-audit.js.map +1 -0
- package/dist/middleware/admin-rate-limiter.d.ts +56 -0
- package/dist/middleware/admin-rate-limiter.d.ts.map +1 -0
- package/dist/middleware/admin-rate-limiter.js +97 -0
- package/dist/middleware/admin-rate-limiter.js.map +1 -0
- package/dist/middleware/client-secret-hash.d.ts +34 -0
- package/dist/middleware/client-secret-hash.d.ts.map +1 -0
- package/dist/middleware/client-secret-hash.js +74 -0
- package/dist/middleware/client-secret-hash.js.map +1 -0
- package/dist/middleware/error-handler.d.ts +3 -0
- package/dist/middleware/error-handler.d.ts.map +1 -0
- package/dist/middleware/error-handler.js +93 -0
- package/dist/middleware/error-handler.js.map +1 -0
- package/dist/middleware/health.d.ts +3 -0
- package/dist/middleware/health.d.ts.map +1 -0
- package/dist/middleware/health.js +35 -0
- package/dist/middleware/health.js.map +1 -0
- package/dist/middleware/metrics.d.ts +40 -0
- package/dist/middleware/metrics.d.ts.map +1 -0
- package/dist/middleware/metrics.js +75 -0
- package/dist/middleware/metrics.js.map +1 -0
- package/dist/middleware/oidc-client-tenant.d.ts +37 -0
- package/dist/middleware/oidc-client-tenant.d.ts.map +1 -0
- package/dist/middleware/oidc-client-tenant.js +156 -0
- package/dist/middleware/oidc-client-tenant.js.map +1 -0
- package/dist/middleware/oidc-cors.d.ts +33 -0
- package/dist/middleware/oidc-cors.d.ts.map +1 -0
- package/dist/middleware/oidc-cors.js +68 -0
- package/dist/middleware/oidc-cors.js.map +1 -0
- package/dist/middleware/oidc-preflight-cors.d.ts +54 -0
- package/dist/middleware/oidc-preflight-cors.d.ts.map +1 -0
- package/dist/middleware/oidc-preflight-cors.js +267 -0
- package/dist/middleware/oidc-preflight-cors.js.map +1 -0
- package/dist/middleware/prompt-login-reset.d.ts +103 -0
- package/dist/middleware/prompt-login-reset.d.ts.map +1 -0
- package/dist/middleware/prompt-login-reset.js +204 -0
- package/dist/middleware/prompt-login-reset.js.map +1 -0
- package/dist/middleware/ready.d.ts +23 -0
- package/dist/middleware/ready.d.ts.map +1 -0
- package/dist/middleware/ready.js +60 -0
- package/dist/middleware/ready.js.map +1 -0
- package/dist/middleware/request-logger.d.ts +27 -0
- package/dist/middleware/request-logger.d.ts.map +1 -0
- package/dist/middleware/request-logger.js +46 -0
- package/dist/middleware/request-logger.js.map +1 -0
- package/dist/middleware/require-permission.d.ts +28 -0
- package/dist/middleware/require-permission.d.ts.map +1 -0
- package/dist/middleware/require-permission.js +63 -0
- package/dist/middleware/require-permission.js.map +1 -0
- package/dist/middleware/require-user-organization.d.ts +18 -0
- package/dist/middleware/require-user-organization.d.ts.map +1 -0
- package/dist/middleware/require-user-organization.js +53 -0
- package/dist/middleware/require-user-organization.js.map +1 -0
- package/dist/middleware/root-page.d.ts +62 -0
- package/dist/middleware/root-page.d.ts.map +1 -0
- package/dist/middleware/root-page.js +134 -0
- package/dist/middleware/root-page.js.map +1 -0
- package/dist/middleware/security-headers.d.ts +98 -0
- package/dist/middleware/security-headers.d.ts.map +1 -0
- package/dist/middleware/security-headers.js +159 -0
- package/dist/middleware/security-headers.js.map +1 -0
- package/dist/middleware/tenant-resolver.d.ts +37 -0
- package/dist/middleware/tenant-resolver.d.ts.map +1 -0
- package/dist/middleware/tenant-resolver.js +71 -0
- package/dist/middleware/tenant-resolver.js.map +1 -0
- package/dist/middleware/token-rate-limiter.d.ts +89 -0
- package/dist/middleware/token-rate-limiter.d.ts.map +1 -0
- package/dist/middleware/token-rate-limiter.js +189 -0
- package/dist/middleware/token-rate-limiter.js.map +1 -0
- package/dist/oidc/account-finder.d.ts +52 -0
- package/dist/oidc/account-finder.d.ts.map +1 -0
- package/dist/oidc/account-finder.js +134 -0
- package/dist/oidc/account-finder.js.map +1 -0
- package/dist/oidc/adapter-factory.d.ts +90 -0
- package/dist/oidc/adapter-factory.d.ts.map +1 -0
- package/dist/oidc/adapter-factory.js +165 -0
- package/dist/oidc/adapter-factory.js.map +1 -0
- package/dist/oidc/configuration.d.ts +155 -0
- package/dist/oidc/configuration.d.ts.map +1 -0
- package/dist/oidc/configuration.js +531 -0
- package/dist/oidc/configuration.js.map +1 -0
- package/dist/oidc/postgres-adapter.d.ts +159 -0
- package/dist/oidc/postgres-adapter.d.ts.map +1 -0
- package/dist/oidc/postgres-adapter.js +222 -0
- package/dist/oidc/postgres-adapter.js.map +1 -0
- package/dist/oidc/protocol-security-observer.d.ts +38 -0
- package/dist/oidc/protocol-security-observer.d.ts.map +1 -0
- package/dist/oidc/protocol-security-observer.js +93 -0
- package/dist/oidc/protocol-security-observer.js.map +1 -0
- package/dist/oidc/provider.d.ts +37 -0
- package/dist/oidc/provider.d.ts.map +1 -0
- package/dist/oidc/provider.js +71 -0
- package/dist/oidc/provider.js.map +1 -0
- package/dist/oidc/redis-adapter.d.ts +140 -0
- package/dist/oidc/redis-adapter.d.ts.map +1 -0
- package/dist/oidc/redis-adapter.js +344 -0
- package/dist/oidc/redis-adapter.js.map +1 -0
- package/dist/organizations/cache.d.ts +60 -0
- package/dist/organizations/cache.d.ts.map +1 -0
- package/dist/organizations/cache.js +157 -0
- package/dist/organizations/cache.js.map +1 -0
- package/dist/organizations/errors.d.ts +25 -0
- package/dist/organizations/errors.d.ts.map +1 -0
- package/dist/organizations/errors.js +31 -0
- package/dist/organizations/errors.js.map +1 -0
- package/dist/organizations/index.d.ts +15 -0
- package/dist/organizations/index.d.ts.map +1 -0
- package/dist/organizations/index.js +15 -0
- package/dist/organizations/index.js.map +1 -0
- package/dist/organizations/repository.d.ts +183 -0
- package/dist/organizations/repository.d.ts.map +1 -0
- package/dist/organizations/repository.js +354 -0
- package/dist/organizations/repository.js.map +1 -0
- package/dist/organizations/service.d.ts +168 -0
- package/dist/organizations/service.d.ts.map +1 -0
- package/dist/organizations/service.js +511 -0
- package/dist/organizations/service.js.map +1 -0
- package/dist/organizations/slugs.d.ts +57 -0
- package/dist/organizations/slugs.d.ts.map +1 -0
- package/dist/organizations/slugs.js +130 -0
- package/dist/organizations/slugs.js.map +1 -0
- package/dist/organizations/types.d.ts +146 -0
- package/dist/organizations/types.d.ts.map +1 -0
- package/dist/organizations/types.js +49 -0
- package/dist/organizations/types.js.map +1 -0
- package/dist/rbac/cache.d.ts +110 -0
- package/dist/rbac/cache.d.ts.map +1 -0
- package/dist/rbac/cache.js +271 -0
- package/dist/rbac/cache.js.map +1 -0
- package/dist/rbac/errors.d.ts +34 -0
- package/dist/rbac/errors.d.ts.map +1 -0
- package/dist/rbac/errors.js +43 -0
- package/dist/rbac/errors.js.map +1 -0
- package/dist/rbac/index.d.ts +17 -0
- package/dist/rbac/index.d.ts.map +1 -0
- package/dist/rbac/index.js +21 -0
- package/dist/rbac/index.js.map +1 -0
- package/dist/rbac/mapping-repository.d.ts +121 -0
- package/dist/rbac/mapping-repository.d.ts.map +1 -0
- package/dist/rbac/mapping-repository.js +224 -0
- package/dist/rbac/mapping-repository.js.map +1 -0
- package/dist/rbac/permission-repository.d.ts +100 -0
- package/dist/rbac/permission-repository.d.ts.map +1 -0
- package/dist/rbac/permission-repository.js +190 -0
- package/dist/rbac/permission-repository.js.map +1 -0
- package/dist/rbac/permission-service.d.ts +85 -0
- package/dist/rbac/permission-service.d.ts.map +1 -0
- package/dist/rbac/permission-service.js +179 -0
- package/dist/rbac/permission-service.js.map +1 -0
- package/dist/rbac/role-repository.d.ts +104 -0
- package/dist/rbac/role-repository.d.ts.map +1 -0
- package/dist/rbac/role-repository.js +202 -0
- package/dist/rbac/role-repository.js.map +1 -0
- package/dist/rbac/role-service.d.ts +111 -0
- package/dist/rbac/role-service.d.ts.map +1 -0
- package/dist/rbac/role-service.js +256 -0
- package/dist/rbac/role-service.js.map +1 -0
- package/dist/rbac/slugs.d.ts +116 -0
- package/dist/rbac/slugs.d.ts.map +1 -0
- package/dist/rbac/slugs.js +178 -0
- package/dist/rbac/slugs.js.map +1 -0
- package/dist/rbac/types.d.ts +187 -0
- package/dist/rbac/types.d.ts.map +1 -0
- package/dist/rbac/types.js +75 -0
- package/dist/rbac/types.js.map +1 -0
- package/dist/rbac/user-role-service.d.ts +101 -0
- package/dist/rbac/user-role-service.d.ts.map +1 -0
- package/dist/rbac/user-role-service.js +166 -0
- package/dist/rbac/user-role-service.js.map +1 -0
- package/dist/routes/applications.d.ts +40 -0
- package/dist/routes/applications.d.ts.map +1 -0
- package/dist/routes/applications.js +284 -0
- package/dist/routes/applications.js.map +1 -0
- package/dist/routes/audit.d.ts +31 -0
- package/dist/routes/audit.d.ts.map +1 -0
- package/dist/routes/audit.js +140 -0
- package/dist/routes/audit.js.map +1 -0
- package/dist/routes/branding.d.ts +17 -0
- package/dist/routes/branding.d.ts.map +1 -0
- package/dist/routes/branding.js +104 -0
- package/dist/routes/branding.js.map +1 -0
- package/dist/routes/bulk.d.ts +37 -0
- package/dist/routes/bulk.d.ts.map +1 -0
- package/dist/routes/bulk.js +94 -0
- package/dist/routes/bulk.js.map +1 -0
- package/dist/routes/clients.d.ts +44 -0
- package/dist/routes/clients.d.ts.map +1 -0
- package/dist/routes/clients.js +353 -0
- package/dist/routes/clients.js.map +1 -0
- package/dist/routes/config.d.ts +35 -0
- package/dist/routes/config.d.ts.map +1 -0
- package/dist/routes/config.js +115 -0
- package/dist/routes/config.js.map +1 -0
- package/dist/routes/custom-claims.d.ts +38 -0
- package/dist/routes/custom-claims.d.ts.map +1 -0
- package/dist/routes/custom-claims.js +208 -0
- package/dist/routes/custom-claims.js.map +1 -0
- package/dist/routes/exports.d.ts +21 -0
- package/dist/routes/exports.d.ts.map +1 -0
- package/dist/routes/exports.js +98 -0
- package/dist/routes/exports.js.map +1 -0
- package/dist/routes/imports.d.ts +18 -0
- package/dist/routes/imports.d.ts.map +1 -0
- package/dist/routes/imports.js +72 -0
- package/dist/routes/imports.js.map +1 -0
- package/dist/routes/interactions.d.ts +111 -0
- package/dist/routes/interactions.d.ts.map +1 -0
- package/dist/routes/interactions.js +1074 -0
- package/dist/routes/interactions.js.map +1 -0
- package/dist/routes/invitation.d.ts +31 -0
- package/dist/routes/invitation.d.ts.map +1 -0
- package/dist/routes/invitation.js +342 -0
- package/dist/routes/invitation.js.map +1 -0
- package/dist/routes/keys.d.ts +28 -0
- package/dist/routes/keys.d.ts.map +1 -0
- package/dist/routes/keys.js +91 -0
- package/dist/routes/keys.js.map +1 -0
- package/dist/routes/magic-link.d.ts +43 -0
- package/dist/routes/magic-link.d.ts.map +1 -0
- package/dist/routes/magic-link.js +264 -0
- package/dist/routes/magic-link.js.map +1 -0
- package/dist/routes/organizations.d.ts +38 -0
- package/dist/routes/organizations.d.ts.map +1 -0
- package/dist/routes/organizations.js +347 -0
- package/dist/routes/organizations.js.map +1 -0
- package/dist/routes/password-reset.d.ts +65 -0
- package/dist/routes/password-reset.d.ts.map +1 -0
- package/dist/routes/password-reset.js +493 -0
- package/dist/routes/password-reset.js.map +1 -0
- package/dist/routes/permissions.d.ts +33 -0
- package/dist/routes/permissions.d.ts.map +1 -0
- package/dist/routes/permissions.js +166 -0
- package/dist/routes/permissions.js.map +1 -0
- package/dist/routes/roles.d.ts +37 -0
- package/dist/routes/roles.d.ts.map +1 -0
- package/dist/routes/roles.js +222 -0
- package/dist/routes/roles.js.map +1 -0
- package/dist/routes/sessions.d.ts +37 -0
- package/dist/routes/sessions.d.ts.map +1 -0
- package/dist/routes/sessions.js +121 -0
- package/dist/routes/sessions.js.map +1 -0
- package/dist/routes/stats.d.ts +28 -0
- package/dist/routes/stats.d.ts.map +1 -0
- package/dist/routes/stats.js +65 -0
- package/dist/routes/stats.js.map +1 -0
- package/dist/routes/two-factor-admin.d.ts +54 -0
- package/dist/routes/two-factor-admin.d.ts.map +1 -0
- package/dist/routes/two-factor-admin.js +344 -0
- package/dist/routes/two-factor-admin.js.map +1 -0
- package/dist/routes/two-factor.d.ts +31 -0
- package/dist/routes/two-factor.d.ts.map +1 -0
- package/dist/routes/two-factor.js +595 -0
- package/dist/routes/two-factor.js.map +1 -0
- package/dist/routes/user-roles.d.ts +33 -0
- package/dist/routes/user-roles.d.ts.map +1 -0
- package/dist/routes/user-roles.js +129 -0
- package/dist/routes/user-roles.js.map +1 -0
- package/dist/routes/users.d.ts +61 -0
- package/dist/routes/users.d.ts.map +1 -0
- package/dist/routes/users.js +868 -0
- package/dist/routes/users.js.map +1 -0
- package/dist/security/decision-context.d.ts +52 -0
- package/dist/security/decision-context.d.ts.map +1 -0
- package/dist/security/decision-context.js +150 -0
- package/dist/security/decision-context.js.map +1 -0
- package/dist/security/decision-event.d.ts +128 -0
- package/dist/security/decision-event.d.ts.map +1 -0
- package/dist/security/decision-event.js +225 -0
- package/dist/security/decision-event.js.map +1 -0
- package/dist/security/transport-decision.d.ts +6 -0
- package/dist/security/transport-decision.d.ts.map +1 -0
- package/dist/security/transport-decision.js +37 -0
- package/dist/security/transport-decision.js.map +1 -0
- package/dist/server.d.ts +50 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +491 -0
- package/dist/server.js.map +1 -0
- package/dist/two-factor/cache.d.ts +47 -0
- package/dist/two-factor/cache.d.ts.map +1 -0
- package/dist/two-factor/cache.js +122 -0
- package/dist/two-factor/cache.js.map +1 -0
- package/dist/two-factor/crypto.d.ts +41 -0
- package/dist/two-factor/crypto.d.ts.map +1 -0
- package/dist/two-factor/crypto.js +94 -0
- package/dist/two-factor/crypto.js.map +1 -0
- package/dist/two-factor/errors.d.ts +82 -0
- package/dist/two-factor/errors.d.ts.map +1 -0
- package/dist/two-factor/errors.js +112 -0
- package/dist/two-factor/errors.js.map +1 -0
- package/dist/two-factor/index.d.ts +18 -0
- package/dist/two-factor/index.d.ts.map +1 -0
- package/dist/two-factor/index.js +25 -0
- package/dist/two-factor/index.js.map +1 -0
- package/dist/two-factor/otp.d.ts +43 -0
- package/dist/two-factor/otp.d.ts.map +1 -0
- package/dist/two-factor/otp.js +57 -0
- package/dist/two-factor/otp.js.map +1 -0
- package/dist/two-factor/recovery.d.ts +45 -0
- package/dist/two-factor/recovery.d.ts.map +1 -0
- package/dist/two-factor/recovery.js +104 -0
- package/dist/two-factor/recovery.js.map +1 -0
- package/dist/two-factor/repository.d.ts +156 -0
- package/dist/two-factor/repository.d.ts.map +1 -0
- package/dist/two-factor/repository.js +251 -0
- package/dist/two-factor/repository.js.map +1 -0
- package/dist/two-factor/service.d.ts +232 -0
- package/dist/two-factor/service.d.ts.map +1 -0
- package/dist/two-factor/service.js +599 -0
- package/dist/two-factor/service.js.map +1 -0
- package/dist/two-factor/totp.d.ts +57 -0
- package/dist/two-factor/totp.d.ts.map +1 -0
- package/dist/two-factor/totp.js +96 -0
- package/dist/two-factor/totp.js.map +1 -0
- package/dist/two-factor/types.d.ts +152 -0
- package/dist/two-factor/types.d.ts.map +1 -0
- package/dist/two-factor/types.js +64 -0
- package/dist/two-factor/types.js.map +1 -0
- package/dist/users/cache.d.ts +49 -0
- package/dist/users/cache.d.ts.map +1 -0
- package/dist/users/cache.js +140 -0
- package/dist/users/cache.js.map +1 -0
- package/dist/users/claims.d.ts +67 -0
- package/dist/users/claims.d.ts.map +1 -0
- package/dist/users/claims.js +104 -0
- package/dist/users/claims.js.map +1 -0
- package/dist/users/errors.d.ts +25 -0
- package/dist/users/errors.d.ts.map +1 -0
- package/dist/users/errors.js +31 -0
- package/dist/users/errors.js.map +1 -0
- package/dist/users/gdpr.d.ts +110 -0
- package/dist/users/gdpr.d.ts.map +1 -0
- package/dist/users/gdpr.js +211 -0
- package/dist/users/gdpr.js.map +1 -0
- package/dist/users/index.d.ts +20 -0
- package/dist/users/index.d.ts.map +1 -0
- package/dist/users/index.js +19 -0
- package/dist/users/index.js.map +1 -0
- package/dist/users/password.d.ts +85 -0
- package/dist/users/password.d.ts.map +1 -0
- package/dist/users/password.js +138 -0
- package/dist/users/password.js.map +1 -0
- package/dist/users/repository.d.ts +263 -0
- package/dist/users/repository.d.ts.map +1 -0
- package/dist/users/repository.js +499 -0
- package/dist/users/repository.js.map +1 -0
- package/dist/users/service.d.ts +299 -0
- package/dist/users/service.d.ts.map +1 -0
- package/dist/users/service.js +698 -0
- package/dist/users/service.js.map +1 -0
- package/dist/users/types.d.ts +220 -0
- package/dist/users/types.d.ts.map +1 -0
- package/dist/users/types.js +77 -0
- package/dist/users/types.js.map +1 -0
- package/locales/default/en/common.json +10 -0
- package/locales/default/en/consent.json +13 -0
- package/locales/default/en/emails.json +17 -0
- package/locales/default/en/errors.json +21 -0
- package/locales/default/en/forgot-password.json +11 -0
- package/locales/default/en/invitation.json +18 -0
- package/locales/default/en/login.json +17 -0
- package/locales/default/en/logout.json +9 -0
- package/locales/default/en/magic-link.json +12 -0
- package/locales/default/en/reset-password.json +16 -0
- package/locales/default/en/two-factor.json +29 -0
- package/migrations/.gitkeep +0 -0
- package/migrations/001_extensions.sql +22 -0
- package/migrations/002_organizations.sql +43 -0
- package/migrations/003_applications.sql +50 -0
- package/migrations/004_clients.sql +74 -0
- package/migrations/005_users.sql +119 -0
- package/migrations/006_roles_permissions.sql +80 -0
- package/migrations/007_custom_claims.sql +55 -0
- package/migrations/008_config.sql +51 -0
- package/migrations/009_audit_log.sql +31 -0
- package/migrations/010_oidc_adapter.sql +34 -0
- package/migrations/011_seed.sql +53 -0
- package/migrations/012_two_factor.sql +88 -0
- package/migrations/013_client_secret_sha256.sql +22 -0
- package/migrations/014_login_methods.sql +34 -0
- package/migrations/015_signing_key_encryption.sql +20 -0
- package/migrations/016_failed_login_count.sql +27 -0
- package/migrations/017_audit_retention.sql +11 -0
- package/migrations/018_admin_api_enhancements.sql +78 -0
- package/migrations/019_invitation_details.sql +27 -0
- package/migrations/020_two_factor_admin_permission.sql +108 -0
- package/migrations/021_auth_recovery_jobs.sql +74 -0
- package/migrations/022_recovery_artifact_ownership.sql +25 -0
- package/migrations/023_magic_link_authority.sql +39 -0
- package/package.json +106 -0
- package/templates/default/emails/invitation.hbs +39 -0
- package/templates/default/emails/invitation.txt.hbs +18 -0
- package/templates/default/emails/magic-link.hbs +30 -0
- package/templates/default/emails/magic-link.txt.hbs +11 -0
- package/templates/default/emails/otp-code.hbs +31 -0
- package/templates/default/emails/otp-code.txt.hbs +15 -0
- package/templates/default/emails/password-changed.hbs +24 -0
- package/templates/default/emails/password-changed.txt.hbs +7 -0
- package/templates/default/emails/password-reset.hbs +30 -0
- package/templates/default/emails/password-reset.txt.hbs +11 -0
- package/templates/default/emails/welcome.hbs +25 -0
- package/templates/default/emails/welcome.txt.hbs +9 -0
- package/templates/default/layouts/main.hbs +49 -0
- package/templates/default/pages/accept-invite.hbs +25 -0
- package/templates/default/pages/consent.hbs +27 -0
- package/templates/default/pages/error.hbs +15 -0
- package/templates/default/pages/forgot-password.hbs +21 -0
- package/templates/default/pages/invite-expired.hbs +6 -0
- package/templates/default/pages/invite-success.hbs +9 -0
- package/templates/default/pages/login.hbs +108 -0
- package/templates/default/pages/logout-success.hbs +5 -0
- package/templates/default/pages/logout.hbs +24 -0
- package/templates/default/pages/magic-link-sent.hbs +10 -0
- package/templates/default/pages/magic-link-success.hbs +17 -0
- package/templates/default/pages/reset-password.hbs +20 -0
- package/templates/default/pages/reset-success.hbs +9 -0
- package/templates/default/pages/two-factor-setup.hbs +65 -0
- package/templates/default/pages/two-factor-verify.hbs +77 -0
- package/templates/default/partials/flash-messages.hbs +10 -0
- package/templates/default/partials/footer.hbs +4 -0
- package/templates/default/partials/header.hbs +8 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Redis adapter for node-oidc-provider.
|
|
3
|
+
*
|
|
4
|
+
* Stores short-lived, high-throughput OIDC artifacts (Session, Interaction,
|
|
5
|
+
* AuthorizationCode, ReplayDetection, ClientCredentials, PushedAuthorizationRequest)
|
|
6
|
+
* in Redis with automatic expiry via TTL.
|
|
7
|
+
*
|
|
8
|
+
* Key patterns:
|
|
9
|
+
* oidc:{type}:{id} — Primary key (stores JSON payload)
|
|
10
|
+
* oidc:{type}:uid:{uid} — UID index → primary ID (sessions)
|
|
11
|
+
* oidc:{type}:user_code:{uc} — User code index → primary ID (device flow)
|
|
12
|
+
* oidc:{type}:grant:{grantId} — Grant set of primary IDs (for revocation)
|
|
13
|
+
*/
|
|
14
|
+
import type { AdapterPayload } from './postgres-adapter.js';
|
|
15
|
+
/**
|
|
16
|
+
* Redis adapter implementing the node-oidc-provider storage interface.
|
|
17
|
+
*
|
|
18
|
+
* Each instance is created per-model (e.g., new RedisAdapter('Session')).
|
|
19
|
+
* All keys are namespaced under `oidc:{modelName}:` to avoid collisions
|
|
20
|
+
* with other Redis data.
|
|
21
|
+
*/
|
|
22
|
+
export declare class RedisAdapter {
|
|
23
|
+
/** Model name — used in Redis key prefixes (e.g., 'Session', 'Interaction') */
|
|
24
|
+
protected name: string;
|
|
25
|
+
constructor(name: string);
|
|
26
|
+
/**
|
|
27
|
+
* Build the primary Redis key for an artifact.
|
|
28
|
+
* @param id - Artifact ID
|
|
29
|
+
* @returns Redis key like 'oidc:Session:abc123'
|
|
30
|
+
*/
|
|
31
|
+
protected key(id: string): string;
|
|
32
|
+
/**
|
|
33
|
+
* Build the UID index key.
|
|
34
|
+
* @param uid - Unique identifier
|
|
35
|
+
* @returns Redis key like 'oidc:Session:uid:def456'
|
|
36
|
+
*/
|
|
37
|
+
protected uidKey(uid: string): string;
|
|
38
|
+
/**
|
|
39
|
+
* Build the user code index key.
|
|
40
|
+
* @param userCode - User-facing device code
|
|
41
|
+
* @returns Redis key like 'oidc:DeviceCode:user_code:XYZ'
|
|
42
|
+
*/
|
|
43
|
+
protected userCodeKey(userCode: string): string;
|
|
44
|
+
/**
|
|
45
|
+
* Build the grant set key.
|
|
46
|
+
* @param grantId - Grant identifier
|
|
47
|
+
* @returns Redis key like 'oidc:Session:grant:grant789'
|
|
48
|
+
*/
|
|
49
|
+
protected grantKey(grantId: string): string;
|
|
50
|
+
/**
|
|
51
|
+
* Store an artifact in Redis with TTL.
|
|
52
|
+
*
|
|
53
|
+
* Sets the main key with the full payload as JSON. Also creates index keys
|
|
54
|
+
* for uid, userCode, and grantId if present in the payload, enabling
|
|
55
|
+
* efficient lookups by those fields.
|
|
56
|
+
*
|
|
57
|
+
* @param id - Artifact ID
|
|
58
|
+
* @param payload - Full OIDC artifact payload
|
|
59
|
+
* @param expiresIn - TTL in seconds
|
|
60
|
+
*/
|
|
61
|
+
upsert(id: string, payload: AdapterPayload, expiresIn: number): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Find an artifact by its ID.
|
|
64
|
+
*
|
|
65
|
+
* Returns undefined if the key doesn't exist (expired via TTL or never stored).
|
|
66
|
+
*
|
|
67
|
+
* @param id - Artifact ID
|
|
68
|
+
* @returns The artifact payload, or undefined if not found
|
|
69
|
+
*/
|
|
70
|
+
find(id: string): Promise<AdapterPayload | undefined>;
|
|
71
|
+
/**
|
|
72
|
+
* Find an artifact by user code (device flow).
|
|
73
|
+
*
|
|
74
|
+
* Looks up the user code index key to get the primary artifact ID,
|
|
75
|
+
* then retrieves the full payload from the main key.
|
|
76
|
+
*
|
|
77
|
+
* @param userCode - The user-facing device code
|
|
78
|
+
* @returns The artifact payload, or undefined if not found
|
|
79
|
+
*/
|
|
80
|
+
findByUserCode(userCode: string): Promise<AdapterPayload | undefined>;
|
|
81
|
+
/**
|
|
82
|
+
* Find an artifact by UID (sessions).
|
|
83
|
+
*
|
|
84
|
+
* Looks up the UID index key to get the primary artifact ID,
|
|
85
|
+
* then retrieves the full payload from the main key.
|
|
86
|
+
*
|
|
87
|
+
* @param uid - The unique identifier
|
|
88
|
+
* @returns The artifact payload, or undefined if not found
|
|
89
|
+
*/
|
|
90
|
+
findByUid(uid: string): Promise<AdapterPayload | undefined>;
|
|
91
|
+
/**
|
|
92
|
+
* Mark an artifact as consumed.
|
|
93
|
+
*
|
|
94
|
+
* Reads the current payload, adds a `consumed` timestamp (epoch seconds),
|
|
95
|
+
* and writes it back with the remaining TTL preserved. This is used for
|
|
96
|
+
* authorization code replay detection.
|
|
97
|
+
*
|
|
98
|
+
* @param id - Artifact ID to mark as consumed
|
|
99
|
+
*/
|
|
100
|
+
consume(id: string): Promise<void>;
|
|
101
|
+
/**
|
|
102
|
+
* Delete an artifact and its associated index keys.
|
|
103
|
+
*
|
|
104
|
+
* Reads the payload first to identify any index keys that need cleanup,
|
|
105
|
+
* then deletes all keys in a single pipeline operation.
|
|
106
|
+
*
|
|
107
|
+
* @param id - Artifact ID to delete
|
|
108
|
+
*/
|
|
109
|
+
destroy(id: string): Promise<void>;
|
|
110
|
+
/**
|
|
111
|
+
* Revoke all artifacts associated with a grant.
|
|
112
|
+
*
|
|
113
|
+
* Reads the grant set to find all artifact IDs, then deletes each
|
|
114
|
+
* artifact (including its index keys) and finally the grant set itself.
|
|
115
|
+
* Uses best-effort deletion — logs warnings for individual failures
|
|
116
|
+
* but continues with remaining keys.
|
|
117
|
+
*
|
|
118
|
+
* @param grantId - Grant ID whose artifacts should be revoked
|
|
119
|
+
*/
|
|
120
|
+
revokeByGrantId(grantId: string): Promise<void>;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Clean up Redis grant sets and their member keys for the given grant_ids.
|
|
124
|
+
*
|
|
125
|
+
* When a session is destroyed during explicit logout, the PostgreSQL cascade
|
|
126
|
+
* (revokeGrantsByIds) handles the critical data cleanup. This function provides
|
|
127
|
+
* best-effort cleanup of the corresponding Redis keys — grant set keys and
|
|
128
|
+
* the individual artifact keys they reference.
|
|
129
|
+
*
|
|
130
|
+
* This is NOT critical for correctness: Redis keys have TTLs and will expire
|
|
131
|
+
* on their own. However, cleaning them up immediately prevents stale keys from
|
|
132
|
+
* being used during the window between logout and TTL expiry.
|
|
133
|
+
*
|
|
134
|
+
* Errors are logged but never propagated — the logout flow must not fail
|
|
135
|
+
* because of a Redis cleanup issue.
|
|
136
|
+
*
|
|
137
|
+
* @param grantIds - Array of grant IDs whose Redis keys should be cleaned up
|
|
138
|
+
*/
|
|
139
|
+
export declare function cleanupRedisGrants(grantIds: string[]): Promise<void>;
|
|
140
|
+
//# sourceMappingURL=redis-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-adapter.d.ts","sourceRoot":"","sources":["../../src/oidc/redis-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D;;;;;;GAMG;AACH,qBAAa,YAAY;IACvB,+EAA+E;IAC/E,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC;IAEvB,YAAY,IAAI,EAAE,MAAM,EAEvB;IAED;;;;OAIG;IACH,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEhC;IAED;;;;OAIG;IACH,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEpC;IAED;;;;OAIG;IACH,SAAS,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE9C;IAED;;;;OAIG;IACH,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE1C;IAED;;;;;;;;;;OAUG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6DlF;IAED;;;;;;;OAOG;IACG,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAY1D;IAED;;;;;;;;OAQG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAO1E;IAED;;;;;;;;OAQG;IACG,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAOhE;IAED;;;;;;;;OAQG;IACG,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBvC;IAED;;;;;;;OAOG;IACG,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BvC;IAED;;;;;;;;;OASG;IACG,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBpD;CACF;AAoBD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+B1E"}
|
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Redis adapter for node-oidc-provider.
|
|
3
|
+
*
|
|
4
|
+
* Stores short-lived, high-throughput OIDC artifacts (Session, Interaction,
|
|
5
|
+
* AuthorizationCode, ReplayDetection, ClientCredentials, PushedAuthorizationRequest)
|
|
6
|
+
* in Redis with automatic expiry via TTL.
|
|
7
|
+
*
|
|
8
|
+
* Key patterns:
|
|
9
|
+
* oidc:{type}:{id} — Primary key (stores JSON payload)
|
|
10
|
+
* oidc:{type}:uid:{uid} — UID index → primary ID (sessions)
|
|
11
|
+
* oidc:{type}:user_code:{uc} — User code index → primary ID (device flow)
|
|
12
|
+
* oidc:{type}:grant:{grantId} — Grant set of primary IDs (for revocation)
|
|
13
|
+
*/
|
|
14
|
+
import { getRedis } from '../lib/redis.js';
|
|
15
|
+
import { logger } from '../lib/logger.js';
|
|
16
|
+
import { upsertSession, revokeSession } from '../lib/session-tracking.js';
|
|
17
|
+
/**
|
|
18
|
+
* Redis adapter implementing the node-oidc-provider storage interface.
|
|
19
|
+
*
|
|
20
|
+
* Each instance is created per-model (e.g., new RedisAdapter('Session')).
|
|
21
|
+
* All keys are namespaced under `oidc:{modelName}:` to avoid collisions
|
|
22
|
+
* with other Redis data.
|
|
23
|
+
*/
|
|
24
|
+
export class RedisAdapter {
|
|
25
|
+
/** Model name — used in Redis key prefixes (e.g., 'Session', 'Interaction') */
|
|
26
|
+
name;
|
|
27
|
+
constructor(name) {
|
|
28
|
+
this.name = name;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Build the primary Redis key for an artifact.
|
|
32
|
+
* @param id - Artifact ID
|
|
33
|
+
* @returns Redis key like 'oidc:Session:abc123'
|
|
34
|
+
*/
|
|
35
|
+
key(id) {
|
|
36
|
+
return `oidc:${this.name}:${id}`;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Build the UID index key.
|
|
40
|
+
* @param uid - Unique identifier
|
|
41
|
+
* @returns Redis key like 'oidc:Session:uid:def456'
|
|
42
|
+
*/
|
|
43
|
+
uidKey(uid) {
|
|
44
|
+
return `oidc:${this.name}:uid:${uid}`;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Build the user code index key.
|
|
48
|
+
* @param userCode - User-facing device code
|
|
49
|
+
* @returns Redis key like 'oidc:DeviceCode:user_code:XYZ'
|
|
50
|
+
*/
|
|
51
|
+
userCodeKey(userCode) {
|
|
52
|
+
return `oidc:${this.name}:user_code:${userCode}`;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Build the grant set key.
|
|
56
|
+
* @param grantId - Grant identifier
|
|
57
|
+
* @returns Redis key like 'oidc:Session:grant:grant789'
|
|
58
|
+
*/
|
|
59
|
+
grantKey(grantId) {
|
|
60
|
+
return `oidc:${this.name}:grant:${grantId}`;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Store an artifact in Redis with TTL.
|
|
64
|
+
*
|
|
65
|
+
* Sets the main key with the full payload as JSON. Also creates index keys
|
|
66
|
+
* for uid, userCode, and grantId if present in the payload, enabling
|
|
67
|
+
* efficient lookups by those fields.
|
|
68
|
+
*
|
|
69
|
+
* @param id - Artifact ID
|
|
70
|
+
* @param payload - Full OIDC artifact payload
|
|
71
|
+
* @param expiresIn - TTL in seconds
|
|
72
|
+
*/
|
|
73
|
+
async upsert(id, payload, expiresIn) {
|
|
74
|
+
const redis = getRedis();
|
|
75
|
+
const mainKey = this.key(id);
|
|
76
|
+
// Use pipeline for atomic multi-key operations
|
|
77
|
+
const pipeline = redis.pipeline();
|
|
78
|
+
// Store the full payload with TTL
|
|
79
|
+
if (expiresIn) {
|
|
80
|
+
pipeline.set(mainKey, JSON.stringify(payload), 'EX', expiresIn);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
pipeline.set(mainKey, JSON.stringify(payload));
|
|
84
|
+
}
|
|
85
|
+
// Create UID index key if present (used by findByUid for session lookups)
|
|
86
|
+
if (payload.uid) {
|
|
87
|
+
const uidIdx = this.uidKey(payload.uid);
|
|
88
|
+
if (expiresIn) {
|
|
89
|
+
pipeline.set(uidIdx, id, 'EX', expiresIn);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
pipeline.set(uidIdx, id);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Create user code index key if present (used by findByUserCode for device flow)
|
|
96
|
+
if (payload.userCode) {
|
|
97
|
+
const ucIdx = this.userCodeKey(payload.userCode);
|
|
98
|
+
if (expiresIn) {
|
|
99
|
+
pipeline.set(ucIdx, id, 'EX', expiresIn);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
pipeline.set(ucIdx, id);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Track artifact in grant set if grant_id present (used by revokeByGrantId)
|
|
106
|
+
if (payload.grantId) {
|
|
107
|
+
const grantSetKey = this.grantKey(payload.grantId);
|
|
108
|
+
pipeline.sadd(grantSetKey, id);
|
|
109
|
+
if (expiresIn) {
|
|
110
|
+
pipeline.expire(grantSetKey, expiresIn);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
await pipeline.exec();
|
|
114
|
+
// Fire-and-forget: mirror session data to PostgreSQL for admin listing.
|
|
115
|
+
// Only Session model needs tracking — other models (Interaction, AuthorizationCode, etc.)
|
|
116
|
+
// are short-lived artifacts that don't need admin visibility.
|
|
117
|
+
if (this.name === 'Session') {
|
|
118
|
+
const expiresAt = new Date(Date.now() + expiresIn * 1000);
|
|
119
|
+
upsertSession({
|
|
120
|
+
sessionId: id,
|
|
121
|
+
userId: payload.accountId,
|
|
122
|
+
organizationId: payload.orgId,
|
|
123
|
+
grantId: payload.grantId,
|
|
124
|
+
expiresAt,
|
|
125
|
+
}).catch(() => {
|
|
126
|
+
// Intentionally swallowed — tracking must never break the OIDC flow.
|
|
127
|
+
// upsertSession already logs warnings internally.
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Find an artifact by its ID.
|
|
133
|
+
*
|
|
134
|
+
* Returns undefined if the key doesn't exist (expired via TTL or never stored).
|
|
135
|
+
*
|
|
136
|
+
* @param id - Artifact ID
|
|
137
|
+
* @returns The artifact payload, or undefined if not found
|
|
138
|
+
*/
|
|
139
|
+
async find(id) {
|
|
140
|
+
const redis = getRedis();
|
|
141
|
+
const data = await redis.get(this.key(id));
|
|
142
|
+
if (!data)
|
|
143
|
+
return undefined;
|
|
144
|
+
try {
|
|
145
|
+
return JSON.parse(data);
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
logger.warn({ key: this.key(id), error }, 'Invalid JSON in Redis OIDC payload');
|
|
149
|
+
return undefined;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Find an artifact by user code (device flow).
|
|
154
|
+
*
|
|
155
|
+
* Looks up the user code index key to get the primary artifact ID,
|
|
156
|
+
* then retrieves the full payload from the main key.
|
|
157
|
+
*
|
|
158
|
+
* @param userCode - The user-facing device code
|
|
159
|
+
* @returns The artifact payload, or undefined if not found
|
|
160
|
+
*/
|
|
161
|
+
async findByUserCode(userCode) {
|
|
162
|
+
const redis = getRedis();
|
|
163
|
+
const id = await redis.get(this.userCodeKey(userCode));
|
|
164
|
+
if (!id)
|
|
165
|
+
return undefined;
|
|
166
|
+
return this.find(id);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Find an artifact by UID (sessions).
|
|
170
|
+
*
|
|
171
|
+
* Looks up the UID index key to get the primary artifact ID,
|
|
172
|
+
* then retrieves the full payload from the main key.
|
|
173
|
+
*
|
|
174
|
+
* @param uid - The unique identifier
|
|
175
|
+
* @returns The artifact payload, or undefined if not found
|
|
176
|
+
*/
|
|
177
|
+
async findByUid(uid) {
|
|
178
|
+
const redis = getRedis();
|
|
179
|
+
const id = await redis.get(this.uidKey(uid));
|
|
180
|
+
if (!id)
|
|
181
|
+
return undefined;
|
|
182
|
+
return this.find(id);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Mark an artifact as consumed.
|
|
186
|
+
*
|
|
187
|
+
* Reads the current payload, adds a `consumed` timestamp (epoch seconds),
|
|
188
|
+
* and writes it back with the remaining TTL preserved. This is used for
|
|
189
|
+
* authorization code replay detection.
|
|
190
|
+
*
|
|
191
|
+
* @param id - Artifact ID to mark as consumed
|
|
192
|
+
*/
|
|
193
|
+
async consume(id) {
|
|
194
|
+
const redis = getRedis();
|
|
195
|
+
const mainKey = this.key(id);
|
|
196
|
+
const data = await redis.get(mainKey);
|
|
197
|
+
if (!data)
|
|
198
|
+
return;
|
|
199
|
+
try {
|
|
200
|
+
const payload = JSON.parse(data);
|
|
201
|
+
payload.consumed = Math.floor(Date.now() / 1000);
|
|
202
|
+
// Preserve the remaining TTL when updating the payload
|
|
203
|
+
const ttl = await redis.ttl(mainKey);
|
|
204
|
+
if (ttl > 0) {
|
|
205
|
+
await redis.set(mainKey, JSON.stringify(payload), 'EX', ttl);
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
// No TTL set (or key is expiring imminently) — just update
|
|
209
|
+
await redis.set(mainKey, JSON.stringify(payload));
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
logger.warn({ key: mainKey, error }, 'Failed to consume OIDC artifact in Redis');
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Delete an artifact and its associated index keys.
|
|
218
|
+
*
|
|
219
|
+
* Reads the payload first to identify any index keys that need cleanup,
|
|
220
|
+
* then deletes all keys in a single pipeline operation.
|
|
221
|
+
*
|
|
222
|
+
* @param id - Artifact ID to delete
|
|
223
|
+
*/
|
|
224
|
+
async destroy(id) {
|
|
225
|
+
const redis = getRedis();
|
|
226
|
+
const mainKey = this.key(id);
|
|
227
|
+
// Read payload to find associated index keys
|
|
228
|
+
const data = await redis.get(mainKey);
|
|
229
|
+
const keysToDelete = [mainKey];
|
|
230
|
+
if (data) {
|
|
231
|
+
try {
|
|
232
|
+
const payload = JSON.parse(data);
|
|
233
|
+
// Clean up index keys if they exist
|
|
234
|
+
if (payload.uid)
|
|
235
|
+
keysToDelete.push(this.uidKey(payload.uid));
|
|
236
|
+
if (payload.userCode)
|
|
237
|
+
keysToDelete.push(this.userCodeKey(payload.userCode));
|
|
238
|
+
}
|
|
239
|
+
catch {
|
|
240
|
+
// If JSON parse fails, just delete the main key
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
await redis.del(...keysToDelete);
|
|
244
|
+
// Fire-and-forget: mark session as revoked in PostgreSQL tracking table.
|
|
245
|
+
// Only Session model needs tracking — other model destroys don't need admin visibility.
|
|
246
|
+
if (this.name === 'Session') {
|
|
247
|
+
revokeSession(id).catch(() => {
|
|
248
|
+
// Intentionally swallowed — tracking must never break the OIDC flow.
|
|
249
|
+
// revokeSession already logs warnings internally.
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Revoke all artifacts associated with a grant.
|
|
255
|
+
*
|
|
256
|
+
* Reads the grant set to find all artifact IDs, then deletes each
|
|
257
|
+
* artifact (including its index keys) and finally the grant set itself.
|
|
258
|
+
* Uses best-effort deletion — logs warnings for individual failures
|
|
259
|
+
* but continues with remaining keys.
|
|
260
|
+
*
|
|
261
|
+
* @param grantId - Grant ID whose artifacts should be revoked
|
|
262
|
+
*/
|
|
263
|
+
async revokeByGrantId(grantId) {
|
|
264
|
+
const redis = getRedis();
|
|
265
|
+
const grantSetKey = this.grantKey(grantId);
|
|
266
|
+
// Get all artifact IDs in this grant
|
|
267
|
+
const members = await redis.smembers(grantSetKey);
|
|
268
|
+
if (members.length === 0) {
|
|
269
|
+
// No artifacts to revoke — clean up the empty set key just in case
|
|
270
|
+
await redis.del(grantSetKey);
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
// Delete each artifact (destroy handles index key cleanup)
|
|
274
|
+
const deletePromises = members.map((id) => this.destroy(id));
|
|
275
|
+
await Promise.all(deletePromises);
|
|
276
|
+
// Delete the grant set itself
|
|
277
|
+
await redis.del(grantSetKey);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
// ---------------------------------------------------------------------------
|
|
281
|
+
// Standalone helpers for session lifecycle management
|
|
282
|
+
// ---------------------------------------------------------------------------
|
|
283
|
+
/**
|
|
284
|
+
* Models stored in Redis — used by cleanupRedisGrants to iterate grant sets.
|
|
285
|
+
* Must match the REDIS_MODELS set in adapter-factory.ts. Defined here as an
|
|
286
|
+
* array (not imported) to avoid circular dependencies between adapter files.
|
|
287
|
+
*/
|
|
288
|
+
const REDIS_MODEL_NAMES = [
|
|
289
|
+
'Session',
|
|
290
|
+
'Interaction',
|
|
291
|
+
'AuthorizationCode',
|
|
292
|
+
'ReplayDetection',
|
|
293
|
+
'ClientCredentials',
|
|
294
|
+
'PushedAuthorizationRequest',
|
|
295
|
+
];
|
|
296
|
+
/**
|
|
297
|
+
* Clean up Redis grant sets and their member keys for the given grant_ids.
|
|
298
|
+
*
|
|
299
|
+
* When a session is destroyed during explicit logout, the PostgreSQL cascade
|
|
300
|
+
* (revokeGrantsByIds) handles the critical data cleanup. This function provides
|
|
301
|
+
* best-effort cleanup of the corresponding Redis keys — grant set keys and
|
|
302
|
+
* the individual artifact keys they reference.
|
|
303
|
+
*
|
|
304
|
+
* This is NOT critical for correctness: Redis keys have TTLs and will expire
|
|
305
|
+
* on their own. However, cleaning them up immediately prevents stale keys from
|
|
306
|
+
* being used during the window between logout and TTL expiry.
|
|
307
|
+
*
|
|
308
|
+
* Errors are logged but never propagated — the logout flow must not fail
|
|
309
|
+
* because of a Redis cleanup issue.
|
|
310
|
+
*
|
|
311
|
+
* @param grantIds - Array of grant IDs whose Redis keys should be cleaned up
|
|
312
|
+
*/
|
|
313
|
+
export async function cleanupRedisGrants(grantIds) {
|
|
314
|
+
if (grantIds.length === 0)
|
|
315
|
+
return;
|
|
316
|
+
try {
|
|
317
|
+
const redis = getRedis();
|
|
318
|
+
const keysToDelete = [];
|
|
319
|
+
// For each model type × grant ID, look up the grant set and collect
|
|
320
|
+
// both the set key and all member keys for deletion.
|
|
321
|
+
for (const model of REDIS_MODEL_NAMES) {
|
|
322
|
+
for (const grantId of grantIds) {
|
|
323
|
+
const grantKey = `oidc:${model}:grant:${grantId}`;
|
|
324
|
+
// Get all artifact IDs in this grant set
|
|
325
|
+
const members = await redis.smembers(grantKey);
|
|
326
|
+
// Queue the grant set key itself for deletion
|
|
327
|
+
keysToDelete.push(grantKey);
|
|
328
|
+
// Queue each member's primary key for deletion
|
|
329
|
+
for (const memberId of members) {
|
|
330
|
+
keysToDelete.push(`oidc:${model}:${memberId}`);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
// Batch delete all collected keys in one DEL command
|
|
335
|
+
if (keysToDelete.length > 0) {
|
|
336
|
+
await redis.del(...keysToDelete);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
catch (err) {
|
|
340
|
+
// Best-effort — Redis keys have TTLs and will expire naturally
|
|
341
|
+
logger.warn({ err, grantIds }, 'Failed to clean up Redis grant keys (keys will expire via TTL)');
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
//# sourceMappingURL=redis-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-adapter.js","sourceRoot":"","sources":["../../src/oidc/redis-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Organization cache — Redis-backed fast lookup layer.
|
|
3
|
+
*
|
|
4
|
+
* Provides get/set/invalidate operations for Organization objects
|
|
5
|
+
* stored in Redis. Each organization is cached under two keys:
|
|
6
|
+
* - `org:slug:{slug}` — for tenant resolver lookups by URL path
|
|
7
|
+
* - `org:id:{id}` — for service layer lookups by UUID
|
|
8
|
+
*
|
|
9
|
+
* Both keys store the same JSON-serialized Organization object
|
|
10
|
+
* with a 5-minute TTL. Date fields (createdAt, updatedAt) are
|
|
11
|
+
* serialized as ISO 8601 strings and deserialized back to Date
|
|
12
|
+
* objects on read.
|
|
13
|
+
*
|
|
14
|
+
* All Redis errors are caught and logged — cache failures never
|
|
15
|
+
* propagate to callers. The system gracefully degrades to direct
|
|
16
|
+
* database lookups when Redis is unavailable.
|
|
17
|
+
*/
|
|
18
|
+
import type { Organization } from './types.js';
|
|
19
|
+
/**
|
|
20
|
+
* Get an organization from cache by slug.
|
|
21
|
+
*
|
|
22
|
+
* Returns null on cache miss, invalid JSON, or Redis error.
|
|
23
|
+
* Callers should fall back to the database on null.
|
|
24
|
+
*
|
|
25
|
+
* @param slug - Organization slug
|
|
26
|
+
* @returns Cached organization or null
|
|
27
|
+
*/
|
|
28
|
+
export declare function getCachedOrganizationBySlug(slug: string): Promise<Organization | null>;
|
|
29
|
+
/**
|
|
30
|
+
* Get an organization from cache by ID.
|
|
31
|
+
*
|
|
32
|
+
* Returns null on cache miss, invalid JSON, or Redis error.
|
|
33
|
+
* Callers should fall back to the database on null.
|
|
34
|
+
*
|
|
35
|
+
* @param id - Organization UUID
|
|
36
|
+
* @returns Cached organization or null
|
|
37
|
+
*/
|
|
38
|
+
export declare function getCachedOrganizationById(id: string): Promise<Organization | null>;
|
|
39
|
+
/**
|
|
40
|
+
* Store an organization in cache under both slug and ID keys.
|
|
41
|
+
*
|
|
42
|
+
* Both keys get the same TTL so they expire together.
|
|
43
|
+
* Date fields are serialized to ISO 8601 strings automatically
|
|
44
|
+
* by JSON.stringify().
|
|
45
|
+
*
|
|
46
|
+
* @param org - Organization to cache
|
|
47
|
+
*/
|
|
48
|
+
export declare function cacheOrganization(org: Organization): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Invalidate all cache entries for an organization.
|
|
51
|
+
*
|
|
52
|
+
* Deletes both the slug-keyed and ID-keyed cache entries.
|
|
53
|
+
* Should be called after any write operation (create, update,
|
|
54
|
+
* status change) to ensure stale data is not served.
|
|
55
|
+
*
|
|
56
|
+
* @param slug - Organization slug
|
|
57
|
+
* @param id - Organization UUID
|
|
58
|
+
*/
|
|
59
|
+
export declare function invalidateOrganizationCache(slug: string, id: string): Promise<void>;
|
|
60
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/organizations/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAmB/C;;;;;;;;GAQG;AACH,wBAAsB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAW5F;AAED;;;;;;;;GAQG;AACH,wBAAsB,yBAAyB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAWxF;AAMD;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAcxE;AAMD;;;;;;;;;GASG;AACH,wBAAsB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAazF"}
|