@authup/server-core 1.0.0-beta.59 → 1.0.0-beta.60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/database/domains/client/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/client/entity.mjs +58 -30
- package/dist/adapters/database/domains/client/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/client-permission/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/client-permission/entity.mjs +48 -24
- package/dist/adapters/database/domains/client-permission/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/client-role/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/client-role/entity.mjs +37 -17
- package/dist/adapters/database/domains/client-role/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/client-scope/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/client-scope/entity.mjs +30 -14
- package/dist/adapters/database/domains/client-scope/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/consent/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/consent/entity.mjs +34 -18
- package/dist/adapters/database/domains/consent/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/event/entity.d.ts +1 -0
- package/dist/adapters/database/domains/event/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/event/entity.mjs +48 -23
- package/dist/adapters/database/domains/event/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/identity-provider/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/identity-provider/entity.mjs +43 -23
- package/dist/adapters/database/domains/identity-provider/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/identity-provider-account/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/identity-provider-account/entity.mjs +50 -22
- package/dist/adapters/database/domains/identity-provider-account/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/identity-provider-attribute/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/identity-provider-attribute/entity.mjs +14 -6
- package/dist/adapters/database/domains/identity-provider-attribute/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/identity-provider-attribute-mapping/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/identity-provider-attribute-mapping/entity.mjs +5 -1
- package/dist/adapters/database/domains/identity-provider-attribute-mapping/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/identity-provider-permission-mapping/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/identity-provider-permission-mapping/entity.mjs +18 -6
- package/dist/adapters/database/domains/identity-provider-permission-mapping/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/identity-provider-role-mapping/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/identity-provider-role-mapping/entity.mjs +34 -14
- package/dist/adapters/database/domains/identity-provider-role-mapping/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/key/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/key/entity.mjs +35 -19
- package/dist/adapters/database/domains/key/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/permission/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/permission/entity.mjs +35 -19
- package/dist/adapters/database/domains/permission/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/permission-policy/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/permission-policy/entity.mjs +37 -17
- package/dist/adapters/database/domains/permission-policy/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/policy/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/policy/entity.mjs +51 -27
- package/dist/adapters/database/domains/policy/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/policy-attribute/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/policy-attribute/entity.mjs +14 -6
- package/dist/adapters/database/domains/policy-attribute/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/realm/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/realm/entity.mjs +36 -20
- package/dist/adapters/database/domains/realm/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/role/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/role/entity.mjs +44 -24
- package/dist/adapters/database/domains/role/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/role-attribute/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/role-attribute/entity.mjs +30 -14
- package/dist/adapters/database/domains/role-attribute/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/role-permission/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/role-permission/entity.mjs +45 -21
- package/dist/adapters/database/domains/role-permission/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/scope/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/scope/entity.mjs +35 -19
- package/dist/adapters/database/domains/scope/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/session/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/session/entity.mjs +63 -31
- package/dist/adapters/database/domains/session/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/session-token/entity.d.ts +4 -1
- package/dist/adapters/database/domains/session-token/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/session-token/entity.mjs +40 -11
- package/dist/adapters/database/domains/session-token/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/trust-anchor/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/trust-anchor/entity.mjs +25 -13
- package/dist/adapters/database/domains/trust-anchor/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/user/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/user/entity.mjs +58 -34
- package/dist/adapters/database/domains/user/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/user-attribute/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/user-attribute/entity.mjs +27 -11
- package/dist/adapters/database/domains/user-attribute/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/user-authenticator/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/user-authenticator/entity.mjs +43 -23
- package/dist/adapters/database/domains/user-authenticator/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/user-permission/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/user-permission/entity.mjs +45 -21
- package/dist/adapters/database/domains/user-permission/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/user-role/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/user-role/entity.mjs +37 -17
- package/dist/adapters/database/domains/user-role/entity.mjs.map +1 -1
- package/dist/adapters/database/errors/driver.d.ts +9 -0
- package/dist/adapters/database/errors/driver.d.ts.map +1 -1
- package/dist/adapters/database/errors/driver.mjs +20 -1
- package/dist/adapters/database/errors/driver.mjs.map +1 -1
- package/dist/adapters/database/errors/index.mjs +2 -2
- package/dist/adapters/database/helpers/index.mjs +2 -2
- package/dist/adapters/database/helpers/is-supported.d.ts +7 -0
- package/dist/adapters/database/helpers/is-supported.d.ts.map +1 -1
- package/dist/adapters/database/helpers/is-supported.mjs +9 -1
- package/dist/adapters/database/helpers/is-supported.mjs.map +1 -1
- package/dist/adapters/database/index.mjs +3 -3
- package/dist/adapters/database/migrations/mysql/1785871780234-AlignSchemaWithEntityMetadata.d.ts +66 -0
- package/dist/adapters/database/migrations/mysql/1785871780234-AlignSchemaWithEntityMetadata.d.ts.map +1 -0
- package/dist/adapters/database/migrations/mysql/1785871780234-AlignSchemaWithEntityMetadata.mjs +181 -0
- package/dist/adapters/database/migrations/mysql/1785871780234-AlignSchemaWithEntityMetadata.mjs.map +1 -0
- package/dist/adapters/database/migrations/mysql/1786436332251-QueryIndexes.d.ts +44 -0
- package/dist/adapters/database/migrations/mysql/1786436332251-QueryIndexes.d.ts.map +1 -0
- package/dist/adapters/database/migrations/mysql/1786436332251-QueryIndexes.mjs +1294 -0
- package/dist/adapters/database/migrations/mysql/1786436332251-QueryIndexes.mjs.map +1 -0
- package/dist/adapters/database/migrations/postgres/1785871780234-AlignSchemaWithEntityMetadata.d.ts +43 -0
- package/dist/adapters/database/migrations/postgres/1785871780234-AlignSchemaWithEntityMetadata.d.ts.map +1 -0
- package/dist/adapters/database/migrations/postgres/1785871780234-AlignSchemaWithEntityMetadata.mjs +120 -0
- package/dist/adapters/database/migrations/postgres/1785871780234-AlignSchemaWithEntityMetadata.mjs.map +1 -0
- package/dist/adapters/database/migrations/postgres/1786436332251-QueryIndexes.d.ts +44 -0
- package/dist/adapters/database/migrations/postgres/1786436332251-QueryIndexes.d.ts.map +1 -0
- package/dist/adapters/database/migrations/postgres/1786436332251-QueryIndexes.mjs +987 -0
- package/dist/adapters/database/migrations/postgres/1786436332251-QueryIndexes.mjs.map +1 -0
- package/dist/adapters/http/controllers/entities/identity-provider/module.d.ts +14 -2
- package/dist/adapters/http/controllers/entities/identity-provider/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/identity-provider/module.mjs +85 -19
- package/dist/adapters/http/controllers/entities/identity-provider/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/entities/identity-provider/types.d.ts +4 -1
- package/dist/adapters/http/controllers/entities/identity-provider/types.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/identity-provider-account/index.d.ts.map +1 -0
- package/dist/adapters/http/controllers/entities/identity-provider-account/index.mjs +5 -0
- package/dist/adapters/http/controllers/entities/identity-provider-account/module.d.ts +15 -0
- package/dist/adapters/http/controllers/entities/identity-provider-account/module.d.ts.map +1 -0
- package/dist/adapters/http/controllers/entities/identity-provider-account/module.mjs +94 -0
- package/dist/adapters/http/controllers/entities/identity-provider-account/module.mjs.map +1 -0
- package/dist/adapters/http/controllers/entities/index.d.ts +2 -0
- package/dist/adapters/http/controllers/entities/index.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/index.mjs +5 -1
- package/dist/adapters/http/controllers/entities/session-token/index.d.ts +2 -0
- package/dist/adapters/http/controllers/entities/session-token/index.d.ts.map +1 -0
- package/dist/adapters/http/controllers/entities/session-token/index.mjs +5 -0
- package/dist/adapters/http/controllers/entities/session-token/module.d.ts +23 -0
- package/dist/adapters/http/controllers/entities/session-token/module.d.ts.map +1 -0
- package/dist/adapters/http/controllers/entities/session-token/module.mjs +112 -0
- package/dist/adapters/http/controllers/entities/session-token/module.mjs.map +1 -0
- package/dist/adapters/http/controllers/index.mjs +3 -1
- package/dist/adapters/http/controllers/workflows/authenticator-challenge/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/workflows/authenticator-challenge/module.mjs +1 -0
- package/dist/adapters/http/controllers/workflows/authenticator-challenge/module.mjs.map +1 -1
- package/dist/adapters/http/index.mjs +3 -1
- package/dist/adapters/http/middleware/built-in/error.d.ts.map +1 -1
- package/dist/adapters/http/middleware/built-in/error.mjs +4 -3
- package/dist/adapters/http/middleware/built-in/error.mjs.map +1 -1
- package/dist/adapters/http/request/event-context.d.ts.map +1 -1
- package/dist/adapters/http/request/event-context.mjs +2 -0
- package/dist/adapters/http/request/event-context.mjs.map +1 -1
- package/dist/app/index.mjs +2 -2
- package/dist/app/modules/database/index.mjs +2 -1
- package/dist/app/modules/database/repositories/identity-provider-account/index.d.ts +2 -0
- package/dist/app/modules/database/repositories/identity-provider-account/index.d.ts.map +1 -0
- package/dist/app/modules/database/repositories/identity-provider-account/index.mjs +5 -0
- package/dist/app/modules/database/repositories/identity-provider-account/repository.d.ts +18 -0
- package/dist/app/modules/database/repositories/identity-provider-account/repository.d.ts.map +1 -0
- package/dist/app/modules/database/repositories/identity-provider-account/repository.mjs +69 -0
- package/dist/app/modules/database/repositories/identity-provider-account/repository.mjs.map +1 -0
- package/dist/app/modules/database/repositories/index.d.ts +1 -0
- package/dist/app/modules/database/repositories/index.d.ts.map +1 -1
- package/dist/app/modules/database/repositories/index.mjs +3 -1
- package/dist/app/modules/database/repositories/key/repository.d.ts +23 -0
- package/dist/app/modules/database/repositories/key/repository.d.ts.map +1 -1
- package/dist/app/modules/database/repositories/key/repository.mjs +39 -3
- package/dist/app/modules/database/repositories/key/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/schema-validation.d.ts +14 -6
- package/dist/app/modules/database/repositories/schema-validation.d.ts.map +1 -1
- package/dist/app/modules/database/repositories/schema-validation.mjs +18 -6
- package/dist/app/modules/database/repositories/schema-validation.mjs.map +1 -1
- package/dist/app/modules/http/modules/controller.d.ts +3 -1
- package/dist/app/modules/http/modules/controller.d.ts.map +1 -1
- package/dist/app/modules/http/modules/controller.mjs +37 -1
- package/dist/app/modules/http/modules/controller.mjs.map +1 -1
- package/dist/app/modules/identity/index.mjs +1 -2
- package/dist/app/modules/identity/module.d.ts.map +1 -1
- package/dist/app/modules/identity/module.mjs +2 -2
- package/dist/app/modules/identity/module.mjs.map +1 -1
- package/dist/app/modules/identity/repositories/index.mjs +1 -2
- package/dist/app/modules/identity/repositories/provider/index.d.ts +0 -1
- package/dist/app/modules/identity/repositories/provider/index.d.ts.map +1 -1
- package/dist/app/modules/identity/repositories/provider/index.mjs +1 -3
- package/dist/app/modules/index.mjs +2 -2
- package/dist/app/modules/logger/module.d.ts.map +1 -1
- package/dist/app/modules/logger/module.mjs +1 -0
- package/dist/app/modules/logger/module.mjs.map +1 -1
- package/dist/app/modules/oauth2/repositories/session-token/repository.d.ts +25 -1
- package/dist/app/modules/oauth2/repositories/session-token/repository.d.ts.map +1 -1
- package/dist/app/modules/oauth2/repositories/session-token/repository.mjs +70 -1
- package/dist/app/modules/oauth2/repositories/session-token/repository.mjs.map +1 -1
- package/dist/app/modules/provisioning/module.d.ts.map +1 -1
- package/dist/app/modules/provisioning/module.mjs +3 -1
- package/dist/app/modules/provisioning/module.mjs.map +1 -1
- package/dist/app/modules/provisioning/sources/default/module.d.ts.map +1 -1
- package/dist/app/modules/provisioning/sources/default/module.mjs +1 -0
- package/dist/app/modules/provisioning/sources/default/module.mjs.map +1 -1
- package/dist/core/entities/client/schema.d.ts.map +1 -1
- package/dist/core/entities/client/schema.mjs +29 -10
- package/dist/core/entities/client/schema.mjs.map +1 -1
- package/dist/core/entities/client-permission/schema.d.ts.map +1 -1
- package/dist/core/entities/client-permission/schema.mjs +29 -6
- package/dist/core/entities/client-permission/schema.mjs.map +1 -1
- package/dist/core/entities/client-role/schema.d.ts.map +1 -1
- package/dist/core/entities/client-role/schema.mjs +27 -6
- package/dist/core/entities/client-role/schema.mjs.map +1 -1
- package/dist/core/entities/client-scope/schema.d.ts.map +1 -1
- package/dist/core/entities/client-scope/schema.mjs +19 -5
- package/dist/core/entities/client-scope/schema.mjs.map +1 -1
- package/dist/core/entities/consent/schema.d.ts.map +1 -1
- package/dist/core/entities/consent/schema.mjs +28 -6
- package/dist/core/entities/consent/schema.mjs.map +1 -1
- package/dist/core/entities/event/entity-event-handler.d.ts.map +1 -1
- package/dist/core/entities/event/entity-event-handler.mjs +2 -0
- package/dist/core/entities/event/entity-event-handler.mjs.map +1 -1
- package/dist/core/entities/event/sanitize.d.ts.map +1 -1
- package/dist/core/entities/event/sanitize.mjs +7 -4
- package/dist/core/entities/event/sanitize.mjs.map +1 -1
- package/dist/core/entities/event/schema.d.ts.map +1 -1
- package/dist/core/entities/event/schema.mjs +45 -16
- package/dist/core/entities/event/schema.mjs.map +1 -1
- package/dist/core/entities/event/service.d.ts.map +1 -1
- package/dist/core/entities/event/service.mjs +2 -0
- package/dist/core/entities/event/service.mjs.map +1 -1
- package/dist/core/entities/event/types.d.ts +2 -0
- package/dist/core/entities/event/types.d.ts.map +1 -1
- package/dist/core/entities/identity-provider/schema.d.ts.map +1 -1
- package/dist/core/entities/identity-provider/schema.mjs +29 -11
- package/dist/core/entities/identity-provider/schema.mjs.map +1 -1
- package/dist/core/entities/identity-provider-account/error.d.ts +7 -0
- package/dist/core/entities/identity-provider-account/error.d.ts.map +1 -0
- package/dist/core/entities/identity-provider-account/error.mjs +24 -0
- package/dist/core/entities/identity-provider-account/error.mjs.map +1 -0
- package/dist/core/entities/identity-provider-account/index.d.ts +5 -0
- package/dist/core/entities/identity-provider-account/index.d.ts.map +1 -0
- package/dist/core/entities/identity-provider-account/index.mjs +8 -0
- package/dist/core/entities/identity-provider-account/schema.d.ts +3 -0
- package/dist/core/entities/identity-provider-account/schema.d.ts.map +1 -0
- package/dist/core/entities/identity-provider-account/schema.mjs +52 -0
- package/dist/core/entities/identity-provider-account/schema.mjs.map +1 -0
- package/dist/core/entities/identity-provider-account/service.d.ts +24 -0
- package/dist/core/entities/identity-provider-account/service.d.ts.map +1 -0
- package/dist/core/entities/identity-provider-account/service.mjs +129 -0
- package/dist/core/entities/identity-provider-account/service.mjs.map +1 -0
- package/dist/core/entities/identity-provider-account/types.d.ts +69 -0
- package/dist/core/entities/identity-provider-account/types.d.ts.map +1 -0
- package/dist/core/entities/identity-provider-account/types.mjs +17 -0
- package/dist/core/entities/identity-provider-account/types.mjs.map +1 -0
- package/dist/core/entities/identity-provider-role-mapping/schema.d.ts.map +1 -1
- package/dist/core/entities/identity-provider-role-mapping/schema.mjs +27 -6
- package/dist/core/entities/identity-provider-role-mapping/schema.mjs.map +1 -1
- package/dist/core/entities/index.d.ts +2 -0
- package/dist/core/entities/index.d.ts.map +1 -1
- package/dist/core/entities/index.mjs +9 -1
- package/dist/core/entities/key/schema.d.ts.map +1 -1
- package/dist/core/entities/key/schema.mjs +39 -17
- package/dist/core/entities/key/schema.mjs.map +1 -1
- package/dist/core/entities/key/service.d.ts.map +1 -1
- package/dist/core/entities/key/service.mjs +1 -0
- package/dist/core/entities/key/service.mjs.map +1 -1
- package/dist/core/entities/permission/schema.d.ts.map +1 -1
- package/dist/core/entities/permission/schema.mjs +34 -13
- package/dist/core/entities/permission/schema.mjs.map +1 -1
- package/dist/core/entities/permission-policy/schema.d.ts.map +1 -1
- package/dist/core/entities/permission-policy/schema.mjs +27 -6
- package/dist/core/entities/permission-policy/schema.mjs.map +1 -1
- package/dist/core/entities/policy/schema.d.ts.map +1 -1
- package/dist/core/entities/policy/schema.mjs +31 -12
- package/dist/core/entities/policy/schema.mjs.map +1 -1
- package/dist/core/entities/realm/schema.d.ts.map +1 -1
- package/dist/core/entities/realm/schema.mjs +26 -12
- package/dist/core/entities/realm/schema.mjs.map +1 -1
- package/dist/core/entities/role/schema.d.ts.map +1 -1
- package/dist/core/entities/role/schema.mjs +36 -14
- package/dist/core/entities/role/schema.mjs.map +1 -1
- package/dist/core/entities/role-attribute/schema.d.ts.map +1 -1
- package/dist/core/entities/role-attribute/schema.mjs +28 -14
- package/dist/core/entities/role-attribute/schema.mjs.map +1 -1
- package/dist/core/entities/role-permission/schema.d.ts.map +1 -1
- package/dist/core/entities/role-permission/schema.mjs +29 -6
- package/dist/core/entities/role-permission/schema.mjs.map +1 -1
- package/dist/core/entities/scope/schema.d.ts.map +1 -1
- package/dist/core/entities/scope/schema.mjs +28 -12
- package/dist/core/entities/scope/schema.mjs.map +1 -1
- package/dist/core/entities/session/schema.d.ts.map +1 -1
- package/dist/core/entities/session/schema.mjs +41 -9
- package/dist/core/entities/session/schema.mjs.map +1 -1
- package/dist/core/entities/session-token/index.d.ts +4 -0
- package/dist/core/entities/session-token/index.d.ts.map +1 -0
- package/dist/core/entities/session-token/index.mjs +6 -0
- package/dist/core/entities/session-token/schema.d.ts +12 -0
- package/dist/core/entities/session-token/schema.d.ts.map +1 -0
- package/dist/core/entities/session-token/schema.mjs +66 -0
- package/dist/core/entities/session-token/schema.mjs.map +1 -0
- package/dist/core/entities/session-token/service.d.ts +70 -0
- package/dist/core/entities/session-token/service.d.ts.map +1 -0
- package/dist/core/entities/session-token/service.mjs +216 -0
- package/dist/core/entities/session-token/service.mjs.map +1 -0
- package/dist/core/entities/session-token/types.d.ts +37 -0
- package/dist/core/entities/session-token/types.d.ts.map +1 -0
- package/dist/core/entities/session-token/types.mjs +4 -0
- package/dist/core/entities/trust-anchor/schema.d.ts.map +1 -1
- package/dist/core/entities/trust-anchor/schema.mjs +27 -13
- package/dist/core/entities/trust-anchor/schema.mjs.map +1 -1
- package/dist/core/entities/trust-anchor/service.d.ts.map +1 -1
- package/dist/core/entities/trust-anchor/service.mjs +1 -0
- package/dist/core/entities/trust-anchor/service.mjs.map +1 -1
- package/dist/core/entities/user/schema.d.ts.map +1 -1
- package/dist/core/entities/user/schema.mjs +29 -12
- package/dist/core/entities/user/schema.mjs.map +1 -1
- package/dist/core/entities/user-attribute/schema.d.ts.map +1 -1
- package/dist/core/entities/user-attribute/schema.mjs +28 -14
- package/dist/core/entities/user-attribute/schema.mjs.map +1 -1
- package/dist/core/entities/user-authenticator/schema.d.ts.map +1 -1
- package/dist/core/entities/user-authenticator/schema.mjs +29 -12
- package/dist/core/entities/user-authenticator/schema.mjs.map +1 -1
- package/dist/core/entities/user-authenticator/service.d.ts +2 -1
- package/dist/core/entities/user-authenticator/service.d.ts.map +1 -1
- package/dist/core/entities/user-authenticator/service.mjs +5 -0
- package/dist/core/entities/user-authenticator/service.mjs.map +1 -1
- package/dist/core/entities/user-authenticator/types.d.ts +7 -1
- package/dist/core/entities/user-authenticator/types.d.ts.map +1 -1
- package/dist/core/entities/user-authenticator/types.mjs.map +1 -1
- package/dist/core/entities/user-permission/schema.d.ts.map +1 -1
- package/dist/core/entities/user-permission/schema.mjs +29 -6
- package/dist/core/entities/user-permission/schema.mjs.map +1 -1
- package/dist/core/entities/user-role/schema.d.ts.map +1 -1
- package/dist/core/entities/user-role/schema.mjs +27 -6
- package/dist/core/entities/user-role/schema.mjs.map +1 -1
- package/dist/core/identity/index.mjs +2 -1
- package/dist/core/identity/provider/account/error.d.ts +7 -0
- package/dist/core/identity/provider/account/error.d.ts.map +1 -0
- package/dist/core/identity/provider/account/error.mjs +24 -0
- package/dist/core/identity/provider/account/error.mjs.map +1 -0
- package/dist/core/identity/provider/account/index.d.ts +1 -0
- package/dist/core/identity/provider/account/index.d.ts.map +1 -1
- package/dist/core/identity/provider/account/index.mjs +2 -1
- package/dist/core/identity/provider/account/module.d.ts +2 -0
- package/dist/core/identity/provider/account/module.d.ts.map +1 -1
- package/dist/core/identity/provider/account/module.mjs +30 -0
- package/dist/core/identity/provider/account/module.mjs.map +1 -1
- package/dist/core/identity/provider/account/types.d.ts +12 -10
- package/dist/core/identity/provider/account/types.d.ts.map +1 -1
- package/dist/core/identity/provider/authentication/protocols/oauth2/module.d.ts +1 -0
- package/dist/core/identity/provider/authentication/protocols/oauth2/module.d.ts.map +1 -1
- package/dist/core/identity/provider/authentication/protocols/oauth2/module.mjs +5 -1
- package/dist/core/identity/provider/authentication/protocols/oauth2/module.mjs.map +1 -1
- package/dist/core/identity/provider/authentication/protocols/oauth2/types.d.ts +7 -0
- package/dist/core/identity/provider/authentication/protocols/oauth2/types.d.ts.map +1 -1
- package/dist/core/identity/provider/index.mjs +2 -1
- package/dist/core/index.mjs +10 -2
- package/dist/core/oauth2/authorization/module.d.ts.map +1 -1
- package/dist/core/oauth2/authorization/module.mjs +2 -0
- package/dist/core/oauth2/authorization/module.mjs.map +1 -1
- package/dist/core/oauth2/authorization/state/types.d.ts +11 -0
- package/dist/core/oauth2/authorization/state/types.d.ts.map +1 -1
- package/dist/core/oauth2/end-session/service.mjs +2 -2
- package/dist/core/oauth2/end-session/service.mjs.map +1 -1
- package/dist/core/oauth2/grant-types/authorize.d.ts.map +1 -1
- package/dist/core/oauth2/grant-types/authorize.mjs +1 -5
- package/dist/core/oauth2/grant-types/authorize.mjs.map +1 -1
- package/dist/core/oauth2/grant-types/password.mjs +2 -5
- package/dist/core/oauth2/grant-types/password.mjs.map +1 -1
- package/dist/core/oauth2/grant-types/refresh-token.d.ts.map +1 -1
- package/dist/core/oauth2/grant-types/refresh-token.mjs +37 -24
- package/dist/core/oauth2/grant-types/refresh-token.mjs.map +1 -1
- package/dist/core/oauth2/index.mjs +3 -1
- package/dist/core/oauth2/mfa-login/module.d.ts.map +1 -1
- package/dist/core/oauth2/mfa-login/module.mjs +4 -7
- package/dist/core/oauth2/mfa-login/module.mjs.map +1 -1
- package/dist/core/oauth2/session-token/error.d.ts +36 -0
- package/dist/core/oauth2/session-token/error.d.ts.map +1 -0
- package/dist/core/oauth2/session-token/error.mjs +49 -0
- package/dist/core/oauth2/session-token/error.mjs.map +1 -0
- package/dist/core/oauth2/session-token/index.d.ts +1 -0
- package/dist/core/oauth2/session-token/index.d.ts.map +1 -1
- package/dist/core/oauth2/session-token/index.mjs +2 -1
- package/dist/core/oauth2/session-token/types.d.ts +40 -0
- package/dist/core/oauth2/session-token/types.d.ts.map +1 -1
- package/dist/core/oauth2/token/issuer/access/module.d.ts.map +1 -1
- package/dist/core/oauth2/token/issuer/access/module.mjs +1 -0
- package/dist/core/oauth2/token/issuer/access/module.mjs.map +1 -1
- package/dist/core/oauth2/token/issuer/base.d.ts +1 -1
- package/dist/core/oauth2/token/issuer/base.d.ts.map +1 -1
- package/dist/core/oauth2/token/issuer/base.mjs.map +1 -1
- package/dist/core/oauth2/token/issuer/refresh/module.d.ts.map +1 -1
- package/dist/core/oauth2/token/issuer/refresh/module.mjs +1 -0
- package/dist/core/oauth2/token/issuer/refresh/module.mjs.map +1 -1
- package/dist/core/query/index.mjs +2 -2
- package/dist/core/query/module.d.ts +19 -9
- package/dist/core/query/module.d.ts.map +1 -1
- package/dist/core/query/module.mjs +22 -10
- package/dist/core/query/module.mjs.map +1 -1
- package/dist/index.mjs +6 -4
- package/dist/swagger.json +869 -140
- package/dist/utils/error.d.ts +20 -3
- package/dist/utils/error.d.ts.map +1 -1
- package/dist/utils/error.mjs +102 -5
- package/dist/utils/error.mjs.map +1 -1
- package/dist/utils/index.mjs +2 -2
- package/package.json +23 -21
- package/dist/app/modules/identity/repositories/provider/account/index.d.ts.map +0 -1
- package/dist/app/modules/identity/repositories/provider/account/index.mjs +0 -5
- package/dist/app/modules/identity/repositories/provider/account/module.d.ts +0 -10
- package/dist/app/modules/identity/repositories/provider/account/module.d.ts.map +0 -1
- package/dist/app/modules/identity/repositories/provider/account/module.mjs +0 -28
- package/dist/app/modules/identity/repositories/provider/account/module.mjs.map +0 -1
- /package/dist/{app/modules/identity/repositories/provider/account → adapters/http/controllers/entities/identity-provider-account}/index.d.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.mjs","names":["OAuth2GrantError","OAuth2SubKind","OAuth2TokenGrant","EventName","EventRefType","EventScope","IdentityType","ScopeName","SessionAuthMethod","deriveAmrAcr","buildOAuth2BearerTokenResponse","OAuth2MfaLoginService","sessionManager","ticketIssuer","accessTokenIssuer","refreshTokenIssuer","tokenRepository","eventService","metrics","ctx","issueTicket","input","options","user","clientId","undefined","expiresAt","buildExp","session","create","userAgent","ipAddress","realmId","sub","id","subKind","USER","mfaAt","authMethod","PASSWORD","Date","toISOString","token","payload","issue","client_id","session_id","user_agent","remote_address","sub_kind","realm_id","realm_name","realm","name","confirmation","cnf","exp","expiresIn","Math","floor","now","complete","ticket","refresh","amrAcr","jti","claimed","claimInactive","invalid","issuePayload","scope","GLOBAL","accessToken","accessTokenPayload","refreshToken","refreshTokenPayload","record","OAUTH2","LOGIN","refType","SESSION","refId","actorType","actorId","actorName","userName","requestIpAddress","requestUserAgent","data","grantType","sessionId","recordLogin"],"sources":["../../../../src/core/oauth2/mfa-login/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2TokenGrantResponse, OAuth2TokenPayload } from '@authup/specs';\nimport { OAuth2GrantError, OAuth2SubKind, OAuth2TokenGrant } from '@authup/specs';\nimport {\n EventName,\n EventRefType,\n EventScope,\n IdentityType,\n ScopeName,\n SessionAuthMethod,\n} from '@authup/core-kit';\nimport type { IEventService } from '../../entities/index.ts';\nimport type { IAuthFlowMetrics } from '../../metrics/index.ts';\nimport type { ISessionManager } from '../../authentication/index.ts';\nimport { deriveAmrAcr } from '../authorization/helpers.ts';\nimport { buildOAuth2BearerTokenResponse } from '../response/index.ts';\nimport type { IOAuth2TokenIssuer, IOAuth2TokenRepository } from '../token/index.ts';\nimport type {\n IOAuth2MfaLoginService,\n OAuth2MfaLoginCompleteInput,\n OAuth2MfaLoginServiceContext,\n OAuth2MfaLoginTicket,\n OAuth2MfaLoginTicketIssueInput,\n OAuth2MfaLoginTicketIssueOptions,\n} from './types.ts';\n\nexport class OAuth2MfaLoginService implements IOAuth2MfaLoginService {\n protected sessionManager : ISessionManager;\n\n protected ticketIssuer : IOAuth2TokenIssuer;\n\n protected accessTokenIssuer : IOAuth2TokenIssuer;\n\n protected refreshTokenIssuer : IOAuth2TokenIssuer;\n\n protected tokenRepository : IOAuth2TokenRepository;\n\n protected eventService? : IEventService;\n\n protected metrics? : IAuthFlowMetrics;\n\n constructor(ctx: OAuth2MfaLoginServiceContext) {\n this.sessionManager = ctx.sessionManager;\n this.ticketIssuer = ctx.ticketIssuer;\n this.accessTokenIssuer = ctx.accessTokenIssuer;\n this.refreshTokenIssuer = ctx.refreshTokenIssuer;\n this.tokenRepository = ctx.tokenRepository;\n this.eventService = ctx.eventService;\n this.metrics = ctx.metrics;\n }\n\n async issueTicket(\n input: OAuth2MfaLoginTicketIssueInput,\n options: OAuth2MfaLoginTicketIssueOptions = {},\n ) : Promise<OAuth2MfaLoginTicket> {\n const { user } = input;\n const clientId = input.clientId ?? undefined;\n\n // One expiration instant for BOTH artifacts — the pending session\n // lives exactly as long as the ticket (an abandoned login\n // self-expires and is swept with the regular session sweep;\n // completion extends it to the full lifetime). Computed once so\n // the two cannot drift.\n const expiresAt = this.ticketIssuer.buildExp();\n\n const session = await this.sessionManager.create({\n userAgent: options.userAgent,\n ipAddress: options.ipAddress,\n realmId: user.realmId,\n clientId,\n sub: user.id,\n subKind: IdentityType.USER,\n mfaAt: null,\n authMethod: SessionAuthMethod.PASSWORD,\n expiresAt: new Date(expiresAt * 1000).toISOString(),\n });\n\n // No scope, no role claims — the ticket is not a bearer; it only\n // unlocks the challenge routes (which opt in by kind).\n const [token, payload] = await this.ticketIssuer.issue({\n client_id: clientId,\n session_id: session.id,\n user_agent: session.userAgent,\n remote_address: session.ipAddress,\n sub: user.id,\n sub_kind: OAuth2SubKind.USER,\n realm_id: user.realmId,\n realm_name: user.realm?.name,\n ...(input.confirmation ? { cnf: input.confirmation } : {}),\n exp: expiresAt,\n });\n\n return {\n token,\n expiresIn: payload.exp ?\n payload.exp - Math.floor(Date.now() / 1000) :\n 0,\n };\n }\n\n async complete(input: OAuth2MfaLoginCompleteInput) : Promise<OAuth2TokenGrantResponse> {\n const { ticket } = input;\n\n // Extend the ticket-scoped pending session to the regular session\n // lifetime — the login is complete now.\n const session = await this.sessionManager.refresh(input.session);\n\n // mfaAt was stamped inside the verify unit of work, so the claims\n // advertise the completed factor (amr +otp, acr urn:authup:mfa).\n const amrAcr = deriveAmrAcr(session);\n\n // Single use: atomically claim the ticket BEFORE minting so two\n // concurrent completions (a mixed-kind user presenting two distinct\n // fresh factors) cannot both issue a token pair — `claimInactive` is a\n // set-if-absent write, so exactly one racer wins. The trade-off vs.\n // claiming after minting is that a mint failure burns the ticket — the\n // safer bias for a single-use login credential (the user re-authenticates).\n if (ticket.jti) {\n const claimed = await this.tokenRepository.claimInactive(ticket.jti, ticket.exp);\n if (!claimed) {\n throw OAuth2GrantError.invalid('mfa login ticket has already been used');\n }\n }\n\n const issuePayload : Partial<OAuth2TokenPayload> = {\n client_id: session.clientId ?? undefined,\n session_id: session.id,\n user_agent: session.userAgent,\n remote_address: session.ipAddress,\n scope: ScopeName.GLOBAL,\n sub: session.sub,\n sub_kind: OAuth2SubKind.USER,\n realm_id: session.realmId,\n realm_name: ticket.realm_name,\n ...(ticket.cnf ? { cnf: ticket.cnf } : {}),\n ...amrAcr,\n };\n\n const [accessToken, accessTokenPayload] = await this.accessTokenIssuer.issue(issuePayload);\n const [refreshToken, refreshTokenPayload] = await this.refreshTokenIssuer.issue(issuePayload);\n\n await this.eventService?.record({\n scope: EventScope.OAUTH2,\n name: EventName.LOGIN,\n refType: EventRefType.SESSION,\n refId: session.id,\n clientId: session.clientId ?? null,\n actorType: IdentityType.USER,\n actorId: session.sub,\n actorName: input.userName ?? null,\n realmId: session.realmId,\n requestIpAddress: session.ipAddress ?? null,\n requestUserAgent: session.userAgent ?? null,\n data: {\n grantType: OAuth2TokenGrant.PASSWORD,\n sessionId: session.id,\n },\n });\n this.metrics?.recordLogin('success');\n\n return buildOAuth2BearerTokenResponse({\n accessToken,\n accessTokenPayload,\n refreshToken,\n refreshTokenPayload,\n });\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"module.mjs","names":["OAuth2GrantError","OAuth2SubKind","OAuth2TokenGrant","EventName","EventRefType","EventScope","IdentityType","ScopeName","SessionAuthMethod","deriveAmrAcr","buildOAuth2BearerTokenResponse","OAuth2MfaLoginService","sessionManager","ticketIssuer","accessTokenIssuer","refreshTokenIssuer","tokenRepository","eventService","metrics","ctx","issueTicket","input","options","user","clientId","undefined","expiresAt","buildExp","session","create","userAgent","ipAddress","realmId","sub","id","subKind","USER","mfaAt","authMethod","PASSWORD","Date","toISOString","token","payload","issue","client_id","session_id","user_agent","remote_address","sub_kind","realm_id","realm_name","realm","name","confirmation","cnf","exp","expiresIn","Math","floor","now","complete","ticket","refresh","amrAcr","jti","claimed","claimInactive","invalid","issuePayload","scope","GLOBAL","accessToken","accessTokenPayload","refreshToken","refreshTokenPayload","record","OAUTH2","LOGIN","refType","SESSION","refId","sessionId","actorType","actorId","actorName","userName","requestIpAddress","requestUserAgent","data","grantType","recordLogin"],"sources":["../../../../src/core/oauth2/mfa-login/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2TokenGrantResponse, OAuth2TokenPayload } from '@authup/specs';\nimport { OAuth2GrantError, OAuth2SubKind, OAuth2TokenGrant } from '@authup/specs';\nimport {\n EventName,\n EventRefType,\n EventScope,\n IdentityType,\n ScopeName,\n SessionAuthMethod,\n} from '@authup/core-kit';\nimport type { IEventService } from '../../entities/index.ts';\nimport type { IAuthFlowMetrics } from '../../metrics/index.ts';\nimport type { ISessionManager } from '../../authentication/index.ts';\nimport { deriveAmrAcr } from '../authorization/helpers.ts';\nimport { buildOAuth2BearerTokenResponse } from '../response/index.ts';\nimport type { IOAuth2TokenIssuer, IOAuth2TokenRepository } from '../token/index.ts';\nimport type {\n IOAuth2MfaLoginService,\n OAuth2MfaLoginCompleteInput,\n OAuth2MfaLoginServiceContext,\n OAuth2MfaLoginTicket,\n OAuth2MfaLoginTicketIssueInput,\n OAuth2MfaLoginTicketIssueOptions,\n} from './types.ts';\n\nexport class OAuth2MfaLoginService implements IOAuth2MfaLoginService {\n protected sessionManager : ISessionManager;\n\n protected ticketIssuer : IOAuth2TokenIssuer;\n\n protected accessTokenIssuer : IOAuth2TokenIssuer;\n\n protected refreshTokenIssuer : IOAuth2TokenIssuer;\n\n protected tokenRepository : IOAuth2TokenRepository;\n\n protected eventService? : IEventService;\n\n protected metrics? : IAuthFlowMetrics;\n\n constructor(ctx: OAuth2MfaLoginServiceContext) {\n this.sessionManager = ctx.sessionManager;\n this.ticketIssuer = ctx.ticketIssuer;\n this.accessTokenIssuer = ctx.accessTokenIssuer;\n this.refreshTokenIssuer = ctx.refreshTokenIssuer;\n this.tokenRepository = ctx.tokenRepository;\n this.eventService = ctx.eventService;\n this.metrics = ctx.metrics;\n }\n\n async issueTicket(\n input: OAuth2MfaLoginTicketIssueInput,\n options: OAuth2MfaLoginTicketIssueOptions = {},\n ) : Promise<OAuth2MfaLoginTicket> {\n const { user } = input;\n const clientId = input.clientId ?? undefined;\n\n // One expiration instant for BOTH artifacts — the pending session\n // lives exactly as long as the ticket (an abandoned login\n // self-expires and is swept with the regular session sweep;\n // completion extends it to the full lifetime). Computed once so\n // the two cannot drift.\n const expiresAt = this.ticketIssuer.buildExp();\n\n const session = await this.sessionManager.create({\n userAgent: options.userAgent,\n ipAddress: options.ipAddress,\n realmId: user.realmId,\n // no `clientId`: a USER-subject session, and the column is the\n // client-SUBJECT foreign key. The application rides the ticket\n // and lands on the token rows at completion.\n sub: user.id,\n subKind: IdentityType.USER,\n mfaAt: null,\n authMethod: SessionAuthMethod.PASSWORD,\n expiresAt: new Date(expiresAt * 1000).toISOString(),\n });\n\n // No scope, no role claims — the ticket is not a bearer; it only\n // unlocks the challenge routes (which opt in by kind).\n const [token, payload] = await this.ticketIssuer.issue({\n client_id: clientId,\n session_id: session.id,\n user_agent: session.userAgent,\n remote_address: session.ipAddress,\n sub: user.id,\n sub_kind: OAuth2SubKind.USER,\n realm_id: user.realmId,\n realm_name: user.realm?.name,\n ...(input.confirmation ? { cnf: input.confirmation } : {}),\n exp: expiresAt,\n });\n\n return {\n token,\n expiresIn: payload.exp ?\n payload.exp - Math.floor(Date.now() / 1000) :\n 0,\n };\n }\n\n async complete(input: OAuth2MfaLoginCompleteInput) : Promise<OAuth2TokenGrantResponse> {\n const { ticket } = input;\n\n // Extend the ticket-scoped pending session to the regular session\n // lifetime — the login is complete now.\n const session = await this.sessionManager.refresh(input.session);\n\n // mfaAt was stamped inside the verify unit of work, so the claims\n // advertise the completed factor (amr +otp, acr urn:authup:mfa).\n const amrAcr = deriveAmrAcr(session);\n\n // Single use: atomically claim the ticket BEFORE minting so two\n // concurrent completions (a mixed-kind user presenting two distinct\n // fresh factors) cannot both issue a token pair — `claimInactive` is a\n // set-if-absent write, so exactly one racer wins. The trade-off vs.\n // claiming after minting is that a mint failure burns the ticket — the\n // safer bias for a single-use login credential (the user re-authenticates).\n if (ticket.jti) {\n const claimed = await this.tokenRepository.claimInactive(ticket.jti, ticket.exp);\n if (!claimed) {\n throw OAuth2GrantError.invalid('mfa login ticket has already been used');\n }\n }\n\n const issuePayload : Partial<OAuth2TokenPayload> = {\n client_id: ticket.client_id ?? undefined,\n session_id: session.id,\n user_agent: session.userAgent,\n remote_address: session.ipAddress,\n scope: ScopeName.GLOBAL,\n sub: session.sub,\n sub_kind: OAuth2SubKind.USER,\n realm_id: session.realmId,\n realm_name: ticket.realm_name,\n ...(ticket.cnf ? { cnf: ticket.cnf } : {}),\n ...amrAcr,\n };\n\n const [accessToken, accessTokenPayload] = await this.accessTokenIssuer.issue(issuePayload);\n const [refreshToken, refreshTokenPayload] = await this.refreshTokenIssuer.issue(issuePayload);\n\n await this.eventService?.record({\n scope: EventScope.OAUTH2,\n name: EventName.LOGIN,\n refType: EventRefType.SESSION,\n refId: session.id,\n clientId: ticket.client_id ?? null,\n sessionId: session.id,\n actorType: IdentityType.USER,\n actorId: session.sub,\n actorName: input.userName ?? null,\n realmId: session.realmId,\n requestIpAddress: session.ipAddress ?? null,\n requestUserAgent: session.userAgent ?? null,\n data: { grantType: OAuth2TokenGrant.PASSWORD },\n });\n this.metrics?.recordLogin('success');\n\n return buildOAuth2BearerTokenResponse({\n accessToken,\n accessTokenPayload,\n refreshToken,\n refreshTokenPayload,\n });\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { ValidationError } from '@authup/errors';
|
|
2
|
+
export declare const SESSION_TOKEN_RELATION_MISSING_ERROR_INSTANCE: unique symbol;
|
|
3
|
+
/**
|
|
4
|
+
* A row the token references no longer exists.
|
|
5
|
+
*
|
|
6
|
+
* Raised by the repository adapter when the inventory insert is rejected by a
|
|
7
|
+
* foreign key. Both parents can vanish between the caller resolving them and
|
|
8
|
+
* the write landing: the session (a concurrent refresh-token replay reaction,
|
|
9
|
+
* an explicit logout, an admin force-logout, the session sweeper) and the
|
|
10
|
+
* client the token is attributed to (an admin deleting the application).
|
|
11
|
+
*
|
|
12
|
+
* The error deliberately does NOT name which one. Only postgres reports the
|
|
13
|
+
* failing constraint as a field; mysql buries it in the message text and sqlite
|
|
14
|
+
* reports nothing but "FOREIGN KEY constraint failed", so a per-relation
|
|
15
|
+
* classification would be unimplementable on the dialect the test suite runs
|
|
16
|
+
* on. It also would not buy anything: both parents cascade onto
|
|
17
|
+
* `auth_session_tokens`, so either one going missing has already deleted the
|
|
18
|
+
* token rows, and the answer for the caller is the same.
|
|
19
|
+
*
|
|
20
|
+
* Transport-agnostic on purpose: the refresh grant re-raises it as
|
|
21
|
+
* `invalid_grant`, every other issuing path lets it settle as the 400 its code
|
|
22
|
+
* maps to.
|
|
23
|
+
*/
|
|
24
|
+
export declare class SessionTokenRelationMissingError extends ValidationError {
|
|
25
|
+
constructor();
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Deliberately marker-only, with no `code` fallback: `ENTITY_RELATION_INVALID`
|
|
29
|
+
* is the shared code for every invalid relation reference (`sanitizeError`
|
|
30
|
+
* assigns it to typeorm-extension's join-column lookup failures too), so
|
|
31
|
+
* matching on it would claim unrelated errors. The error never crosses a wire
|
|
32
|
+
* boundary before it is caught, so there is nothing for a rehydrated match to
|
|
33
|
+
* recover.
|
|
34
|
+
*/
|
|
35
|
+
export declare function isSessionTokenRelationMissingError(input: unknown): input is SessionTokenRelationMissingError;
|
|
36
|
+
//# sourceMappingURL=error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../../../src/core/oauth2/session-token/error.ts"],"names":[],"mappings":"AAOA,OAAO,EAEH,eAAe,EAGlB,MAAM,gBAAgB,CAAC;AAExB,eAAO,MAAM,6CAA6C,eAAqE,CAAC;AAEhI;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,gCAAiC,SAAQ,eAAe;;CAQpE;AAED;;;;;;;GAOG;AACH,wBAAgB,kCAAkC,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,gCAAgC,CAE5G"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import "node:path";
|
|
2
|
+
import "node:url";
|
|
3
|
+
import.meta.url;
|
|
4
|
+
import { ErrorCode, ValidationError, markInstanceof, matchesInstanceof } from "@authup/errors";
|
|
5
|
+
//#region src/core/oauth2/session-token/error.ts
|
|
6
|
+
const SESSION_TOKEN_RELATION_MISSING_ERROR_INSTANCE = Symbol.for("@authup/server-core/SessionTokenRelationMissingError");
|
|
7
|
+
/**
|
|
8
|
+
* A row the token references no longer exists.
|
|
9
|
+
*
|
|
10
|
+
* Raised by the repository adapter when the inventory insert is rejected by a
|
|
11
|
+
* foreign key. Both parents can vanish between the caller resolving them and
|
|
12
|
+
* the write landing: the session (a concurrent refresh-token replay reaction,
|
|
13
|
+
* an explicit logout, an admin force-logout, the session sweeper) and the
|
|
14
|
+
* client the token is attributed to (an admin deleting the application).
|
|
15
|
+
*
|
|
16
|
+
* The error deliberately does NOT name which one. Only postgres reports the
|
|
17
|
+
* failing constraint as a field; mysql buries it in the message text and sqlite
|
|
18
|
+
* reports nothing but "FOREIGN KEY constraint failed", so a per-relation
|
|
19
|
+
* classification would be unimplementable on the dialect the test suite runs
|
|
20
|
+
* on. It also would not buy anything: both parents cascade onto
|
|
21
|
+
* `auth_session_tokens`, so either one going missing has already deleted the
|
|
22
|
+
* token rows, and the answer for the caller is the same.
|
|
23
|
+
*
|
|
24
|
+
* Transport-agnostic on purpose: the refresh grant re-raises it as
|
|
25
|
+
* `invalid_grant`, every other issuing path lets it settle as the 400 its code
|
|
26
|
+
* maps to.
|
|
27
|
+
*/ var SessionTokenRelationMissingError = class extends ValidationError {
|
|
28
|
+
constructor() {
|
|
29
|
+
super({
|
|
30
|
+
code: ErrorCode.ENTITY_RELATION_INVALID,
|
|
31
|
+
message: "A row the token references no longer exists."
|
|
32
|
+
});
|
|
33
|
+
markInstanceof(this, SESSION_TOKEN_RELATION_MISSING_ERROR_INSTANCE);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Deliberately marker-only, with no `code` fallback: `ENTITY_RELATION_INVALID`
|
|
38
|
+
* is the shared code for every invalid relation reference (`sanitizeError`
|
|
39
|
+
* assigns it to typeorm-extension's join-column lookup failures too), so
|
|
40
|
+
* matching on it would claim unrelated errors. The error never crosses a wire
|
|
41
|
+
* boundary before it is caught, so there is nothing for a rehydrated match to
|
|
42
|
+
* recover.
|
|
43
|
+
*/ function isSessionTokenRelationMissingError(input) {
|
|
44
|
+
return matchesInstanceof(input, SESSION_TOKEN_RELATION_MISSING_ERROR_INSTANCE);
|
|
45
|
+
}
|
|
46
|
+
//#endregion
|
|
47
|
+
export { SESSION_TOKEN_RELATION_MISSING_ERROR_INSTANCE, SessionTokenRelationMissingError, isSessionTokenRelationMissingError };
|
|
48
|
+
|
|
49
|
+
//# sourceMappingURL=error.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.mjs","names":["ErrorCode","ValidationError","markInstanceof","matchesInstanceof","SESSION_TOKEN_RELATION_MISSING_ERROR_INSTANCE","Symbol","for","SessionTokenRelationMissingError","code","ENTITY_RELATION_INVALID","message","isSessionTokenRelationMissingError","input"],"sources":["../../../../src/core/oauth2/session-token/error.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n ErrorCode,\n ValidationError,\n markInstanceof,\n matchesInstanceof,\n} from '@authup/errors';\n\nexport const SESSION_TOKEN_RELATION_MISSING_ERROR_INSTANCE = Symbol.for('@authup/server-core/SessionTokenRelationMissingError');\n\n/**\n * A row the token references no longer exists.\n *\n * Raised by the repository adapter when the inventory insert is rejected by a\n * foreign key. Both parents can vanish between the caller resolving them and\n * the write landing: the session (a concurrent refresh-token replay reaction,\n * an explicit logout, an admin force-logout, the session sweeper) and the\n * client the token is attributed to (an admin deleting the application).\n *\n * The error deliberately does NOT name which one. Only postgres reports the\n * failing constraint as a field; mysql buries it in the message text and sqlite\n * reports nothing but \"FOREIGN KEY constraint failed\", so a per-relation\n * classification would be unimplementable on the dialect the test suite runs\n * on. It also would not buy anything: both parents cascade onto\n * `auth_session_tokens`, so either one going missing has already deleted the\n * token rows, and the answer for the caller is the same.\n *\n * Transport-agnostic on purpose: the refresh grant re-raises it as\n * `invalid_grant`, every other issuing path lets it settle as the 400 its code\n * maps to.\n */\nexport class SessionTokenRelationMissingError extends ValidationError {\n constructor() {\n super({\n code: ErrorCode.ENTITY_RELATION_INVALID,\n message: 'A row the token references no longer exists.',\n });\n markInstanceof(this, SESSION_TOKEN_RELATION_MISSING_ERROR_INSTANCE);\n }\n}\n\n/**\n * Deliberately marker-only, with no `code` fallback: `ENTITY_RELATION_INVALID`\n * is the shared code for every invalid relation reference (`sanitizeError`\n * assigns it to typeorm-extension's join-column lookup failures too), so\n * matching on it would claim unrelated errors. The error never crosses a wire\n * boundary before it is caught, so there is nothing for a rehydrated match to\n * recover.\n */\nexport function isSessionTokenRelationMissingError(input: unknown): input is SessionTokenRelationMissingError {\n return matchesInstanceof(input, SESSION_TOKEN_RELATION_MISSING_ERROR_INSTANCE);\n}\n"],"mappings":";;;;;AAcA,MAAaI,gDAAgDC,OAAOC,IAAI,sDAAA;;;;;;;;;;;;;;;;;;;;;GAuBxE,IAAaC,mCAAb,cAAsDN,gBAAAA;CAClD,cAAc;EACV,MAAM;GACFO,MAAMR,UAAUS;GAChBC,SAAS;EACb,CAAA;EACAR,eAAe,MAAME,6CAAAA;CACzB;AACJ;;;;;;;;GAUA,SAAgBO,mCAAmCC,OAAc;CAC7D,OAAOT,kBAAkBS,OAAOR,6CAAAA;AACpC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/oauth2/session-token/index.ts"],"names":[],"mappings":"AAOA,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/oauth2/session-token/index.ts"],"names":[],"mappings":"AAOA,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import "node:path";
|
|
2
2
|
import "node:url";
|
|
3
3
|
import.meta.url;
|
|
4
|
-
|
|
4
|
+
import { SESSION_TOKEN_RELATION_MISSING_ERROR_INSTANCE, SessionTokenRelationMissingError, isSessionTokenRelationMissingError } from "./error.mjs";
|
|
5
|
+
export { SESSION_TOKEN_RELATION_MISSING_ERROR_INSTANCE, SessionTokenRelationMissingError, isSessionTokenRelationMissingError };
|
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
import type { SessionToken, SessionTokenKind } from '@authup/core-kit';
|
|
2
|
+
import type { IQuery } from '@rapiq/core';
|
|
3
|
+
import type { EntityRepositoryFindManyResult } from '@authup/server-kit';
|
|
2
4
|
export type SessionTokenCreateInput = {
|
|
3
5
|
id: string;
|
|
4
6
|
sessionId: string;
|
|
7
|
+
/**
|
|
8
|
+
* The client the token is issued for. Optional: a mint site that knows no
|
|
9
|
+
* client (an MFA-login completion) persists null rather than guessing.
|
|
10
|
+
*/
|
|
11
|
+
clientId?: string | null;
|
|
5
12
|
kind: SessionTokenKind;
|
|
6
13
|
parentId?: string | null;
|
|
7
14
|
refreshTokenId?: string | null;
|
|
@@ -14,8 +21,41 @@ export type SessionTokenRef = {
|
|
|
14
21
|
expiresAt: string;
|
|
15
22
|
};
|
|
16
23
|
export interface ISessionTokenRepository {
|
|
24
|
+
/**
|
|
25
|
+
* Paginated inventory read.
|
|
26
|
+
*
|
|
27
|
+
* The `session` relation is joined unconditionally, because the caller's
|
|
28
|
+
* authorization resolves through it: the rows carry no realm or subject of
|
|
29
|
+
* their own. A `fields` projection must not be able to strip what the gate
|
|
30
|
+
* reads (the plan-039 discipline, through a relation instead of a column).
|
|
31
|
+
*/
|
|
32
|
+
findMany(query: IQuery): Promise<EntityRepositoryFindManyResult<SessionToken>>;
|
|
33
|
+
/**
|
|
34
|
+
* Load EVERY row matching a query, unbounded. A bulk revoke must reach
|
|
35
|
+
* every match, so the schema's pagination cap is deliberately not applied
|
|
36
|
+
* (same reasoning as `ISessionRepository.findAllByQuery`).
|
|
37
|
+
*/
|
|
38
|
+
findAllByQuery(query: IQuery): Promise<SessionToken[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Load one row by jti WITH its session joined.
|
|
41
|
+
*
|
|
42
|
+
* Separate from `findOneById` because authorization resolves through the
|
|
43
|
+
* session: ownership and realm both live there, and a row without it fails
|
|
44
|
+
* closed. Deliberately not expressed as a query, so the lookup cannot be
|
|
45
|
+
* weakened by a decode that silently drops the predicate.
|
|
46
|
+
*/
|
|
47
|
+
findOneWithSessionById(id: string): Promise<SessionToken | null>;
|
|
17
48
|
/**
|
|
18
49
|
* Persist a newly issued session-token row.
|
|
50
|
+
*
|
|
51
|
+
* Throws `SessionTokenRelationMissingError` when a row the token references
|
|
52
|
+
* is gone: `sessionId`, or the `clientId` it is attributed to. Both are
|
|
53
|
+
* resolved before the write, so a concurrent delete (a replay reaction, a
|
|
54
|
+
* logout, the sweeper, an application being removed) can land in between
|
|
55
|
+
* and the write is then rejected. Which of the two it was is deliberately
|
|
56
|
+
* not reported, since both cascade onto this table and so leave the token
|
|
57
|
+
* equally unusable. Callers that own an OAuth2 error vocabulary translate
|
|
58
|
+
* it; the rest let it settle as a plain validation failure.
|
|
19
59
|
*/
|
|
20
60
|
create(input: SessionTokenCreateInput): Promise<SessionToken>;
|
|
21
61
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/oauth2/session-token/types.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/oauth2/session-token/types.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AAEzE,MAAM,MAAM,uBAAuB,GAAG;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,gBAAgB,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,WAAW,uBAAuB;IACpC;;;;;;;OAOG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,8BAA8B,CAAC,YAAY,CAAC,CAAC,CAAC;IAE/E;;;;OAIG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAEvD;;;;;;;OAOG;IACH,sBAAsB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAEjE;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAE9D;;OAEG;IACH,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAEtD;;OAEG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAE5D;;;;;;;OAOG;IACH,mBAAmB,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE9D;;;;;;;OAOG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAErD;;;;;OAKG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAElD;;;;;;;OAOG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAE7E;;;;OAIG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAClD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../../../src/core/oauth2/token/issuer/access/module.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../../../src/core/oauth2/token/issuer/access/module.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EACR,kBAAkB,EAClB,wBAAwB,EACxB,yBAAyB,EAC5B,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAE3E,qBAAa,uBAAwB,SAAQ,qBAAsB,YAAW,kBAAkB;IAC5F,SAAS,CAAC,UAAU,EAAE,sBAAsB,CAAC;IAE7C,SAAS,CAAC,MAAM,EAAG,kBAAkB,CAAC;IAEtC,SAAS,CAAC,oBAAoB,CAAC,EAAE,qBAAqB,CAAC;IAEvD,SAAS,CAAC,sBAAsB,CAAC,EAAE,uBAAuB,CAAC;gBAGvD,UAAU,EAAE,sBAAsB,EAClC,MAAM,EAAE,kBAAkB,EAC1B,OAAO,GAAE,wBAA6B,EACtC,oBAAoB,CAAC,EAAE,qBAAqB,EAC5C,sBAAsB,CAAC,EAAE,uBAAuB;IAU9C,KAAK,CACP,KAAK,GAAE,kBAAuB,GAC9B,OAAO,CAAC,yBAAyB,CAAC;cAwCtB,iBAAiB,CAAC,KAAK,EAAE,kBAAkB,GAAI,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,cAAc,GAAG,eAAe,CAAC,CAAC;CA6BrI"}
|
|
@@ -31,6 +31,7 @@ var OAuth2AccessTokenIssuer = class extends OAuth2BaseTokenIssuer {
|
|
|
31
31
|
if (this.sessionTokenRepository && data.session_id && data.jti && typeof data.exp === "number") await this.sessionTokenRepository.create({
|
|
32
32
|
id: data.jti,
|
|
33
33
|
sessionId: data.session_id,
|
|
34
|
+
clientId: data.client_id ?? null,
|
|
34
35
|
kind: "access",
|
|
35
36
|
refreshTokenId: input.refresh_token_id ?? null,
|
|
36
37
|
ipAddress: data.remote_address ?? "",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.mjs","names":["OAuth2TokenKind","OAuth2BaseTokenIssuer","OAuth2AccessTokenIssuer","repository","signer","identityRoleProvider","sessionTokenRepository","options","issue","input","iss","buildIss","accessClaims","buildAccessClaims","data","insert","kind","ACCESS","exp","buildExp","token","sign","saveWithSignature","session_id","jti","create","id","sessionId","refreshTokenId","refresh_token_id","ipAddress","remote_address","userAgent","user_agent","expiresAt","Date","toISOString","sub","sub_kind","roles","getRolesFor","type","
|
|
1
|
+
{"version":3,"file":"module.mjs","names":["OAuth2TokenKind","OAuth2BaseTokenIssuer","OAuth2AccessTokenIssuer","repository","signer","identityRoleProvider","sessionTokenRepository","options","issue","input","iss","buildIss","accessClaims","buildAccessClaims","data","insert","kind","ACCESS","exp","buildExp","token","sign","saveWithSignature","session_id","jti","create","id","sessionId","clientId","client_id","refreshTokenId","refresh_token_id","ipAddress","remote_address","userAgent","user_agent","expiresAt","Date","toISOString","sub","sub_kind","roles","getRolesFor","type","realmId","realm_id","realmName","realm_name","realmRoles","globalRoles","role","push","name","realm_access","global_access"],"sources":["../../../../../../src/core/oauth2/token/issuer/access/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2TokenPayload } from '@authup/specs';\nimport { OAuth2TokenKind } from '@authup/specs';\nimport type { IOAuth2TokenSigner } from '../../signer/index.ts';\nimport type { IOAuth2TokenRepository } from '../../repository/index.ts';\nimport type { ISessionTokenRepository } from '../../../session-token/index.ts';\nimport { OAuth2BaseTokenIssuer } from '../base.ts';\nimport type {\n IOAuth2TokenIssuer,\n OAuth2TokenIssuerOptions,\n OAuth2TokenIssuerResponse,\n} from '../types.ts';\nimport type { IIdentityRoleProvider } from '../../../../identity/index.ts';\n\nexport class OAuth2AccessTokenIssuer extends OAuth2BaseTokenIssuer implements IOAuth2TokenIssuer {\n protected repository: IOAuth2TokenRepository;\n\n protected signer : IOAuth2TokenSigner;\n\n protected identityRoleProvider?: IIdentityRoleProvider;\n\n protected sessionTokenRepository?: ISessionTokenRepository;\n\n constructor(\n repository: IOAuth2TokenRepository,\n signer: IOAuth2TokenSigner,\n options: OAuth2TokenIssuerOptions = {},\n identityRoleProvider?: IIdentityRoleProvider,\n sessionTokenRepository?: ISessionTokenRepository,\n ) {\n super(options);\n\n this.repository = repository;\n this.signer = signer;\n this.identityRoleProvider = identityRoleProvider;\n this.sessionTokenRepository = sessionTokenRepository;\n }\n\n async issue(\n input: OAuth2TokenPayload = {},\n ) : Promise<OAuth2TokenIssuerResponse> {\n const iss = this.buildIss(input);\n\n const accessClaims = await this.buildAccessClaims(input);\n\n const data = await this.repository.insert({\n ...input,\n kind: OAuth2TokenKind.ACCESS,\n exp: this.buildExp(input),\n ...(iss ? { iss } : {}),\n ...accessClaims,\n });\n\n const token = await this.signer.sign(data);\n\n await this.repository.saveWithSignature(data, token);\n\n if (\n this.sessionTokenRepository &&\n data.session_id &&\n data.jti &&\n typeof data.exp === 'number'\n ) {\n await this.sessionTokenRepository.create({\n id: data.jti,\n sessionId: data.session_id,\n // Per-application attribution (plan 086). The same client the\n // payload was minted for, so the row needs no extra lookup.\n clientId: data.client_id ?? null,\n kind: 'access',\n refreshTokenId: input.refresh_token_id ?? null,\n ipAddress: data.remote_address ?? '',\n userAgent: data.user_agent ?? '',\n expiresAt: new Date(data.exp * 1000).toISOString(),\n });\n }\n\n return [token, data];\n }\n\n protected async buildAccessClaims(input: OAuth2TokenPayload) : Promise<Pick<OAuth2TokenPayload, 'realm_access' | 'global_access'>> {\n if (!this.identityRoleProvider || !input.sub || !input.sub_kind) {\n return {};\n }\n\n const roles = await this.identityRoleProvider.getRolesFor({\n type: input.sub_kind,\n id: input.sub,\n clientId: input.client_id,\n realmId: input.realm_id,\n realmName: input.realm_name,\n });\n\n const realmRoles: string[] = [];\n const globalRoles: string[] = [];\n\n for (const role of roles) {\n if (!role.realmId) {\n globalRoles.push(role.name);\n } else if (input.realm_id && role.realmId === input.realm_id) {\n realmRoles.push(role.name);\n }\n }\n\n return {\n realm_access: { roles: realmRoles },\n global_access: { roles: globalRoles },\n };\n }\n}\n"],"mappings":";;;;;;AAoBA,IAAaE,0BAAb,cAA6CD,sBAAAA;CAC/BE;CAEAC;CAEAC;CAEAC;CAEV,YACIH,YACAC,QACAG,UAAoC,CAAC,GACrCF,sBACAC,wBACF;EACE,MAAMC,OAAAA;EAEN,KAAKJ,aAAaA;EAClB,KAAKC,SAASA;EACd,KAAKC,uBAAuBA;EAC5B,KAAKC,yBAAyBA;CAClC;CAEA,MAAME,MACFC,QAA4B,CAAC,GACM;EACnC,MAAMC,MAAM,KAAKC,SAASF,KAAAA;EAE1B,MAAMG,eAAe,MAAM,KAAKC,kBAAkBJ,KAAAA;EAElD,MAAMK,OAAO,MAAM,KAAKX,WAAWY,OAAO;GACtC,GAAGN;GACHO,MAAMhB,gBAAgBiB;GACtBC,KAAK,KAAKC,SAASV,KAAAA;GACnB,GAAIC,MAAM,EAAEA,IAAI,IAAI,CAAC;GACrB,GAAGE;EACP,CAAA;EAEA,MAAMQ,QAAQ,MAAM,KAAKhB,OAAOiB,KAAKP,IAAAA;EAErC,MAAM,KAAKX,WAAWmB,kBAAkBR,MAAMM,KAAAA;EAE9C,IACI,KAAKd,0BACLQ,KAAKS,cACLT,KAAKU,OACL,OAAOV,KAAKI,QAAQ,UAEpB,MAAM,KAAKZ,uBAAuBmB,OAAO;GACrCC,IAAIZ,KAAKU;GACTG,WAAWb,KAAKS;GAGhBK,UAAUd,KAAKe,aAAa;GAC5Bb,MAAM;GACNc,gBAAgBrB,MAAMsB,oBAAoB;GAC1CC,WAAWlB,KAAKmB,kBAAkB;GAClCC,WAAWpB,KAAKqB,cAAc;GAC9BC,4BAAW,IAAIC,KAAKvB,KAAKI,MAAM,GAAA,EAAA,CAAMoB,YAAW;EACpD,CAAA;EAGJ,OAAO,CAAClB,OAAON,IAAK;CACxB;CAEA,MAAgBD,kBAAkBJ,OAAiG;EAC/H,IAAI,CAAC,KAAKJ,wBAAwB,CAACI,MAAM8B,OAAO,CAAC9B,MAAM+B,UACnD,OAAO,CAAC;EAGZ,MAAMC,QAAQ,MAAM,KAAKpC,qBAAqBqC,YAAY;GACtDC,MAAMlC,MAAM+B;GACZd,IAAIjB,MAAM8B;GACVX,UAAUnB,MAAMoB;GAChBe,SAASnC,MAAMoC;GACfC,WAAWrC,MAAMsC;EACrB,CAAA;EAEA,MAAMC,aAAuB,CAAA;EAC7B,MAAMC,cAAwB,CAAA;EAE9B,KAAK,MAAMC,QAAQT,OACf,IAAI,CAACS,KAAKN,SACNK,YAAYE,KAAKD,KAAKE,IAAI;OACvB,IAAI3C,MAAMoC,YAAYK,KAAKN,YAAYnC,MAAMoC,UAChDG,WAAWG,KAAKD,KAAKE,IAAI;EAIjC,OAAO;GACHC,cAAc,EAAEZ,OAAOO,WAAW;GAClCM,eAAe,EAAEb,OAAOQ,YAAY;EACxC;CACJ;AACJ"}
|
|
@@ -3,7 +3,7 @@ import type { IOAuth2TokenIssuer, OAuth2TokenIssuerOptions, OAuth2TokenIssuerRes
|
|
|
3
3
|
export declare abstract class OAuth2BaseTokenIssuer implements IOAuth2TokenIssuer {
|
|
4
4
|
protected options: OAuth2TokenIssuerOptions;
|
|
5
5
|
protected constructor(options?: OAuth2TokenIssuerOptions);
|
|
6
|
-
abstract issue(input: OAuth2TokenPayload
|
|
6
|
+
abstract issue(input: OAuth2TokenPayload): Promise<OAuth2TokenIssuerResponse>;
|
|
7
7
|
buildIss(input?: OAuth2TokenPayload): string | undefined;
|
|
8
8
|
/**
|
|
9
9
|
* Build utc expire time (in seconds).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../../src/core/oauth2/token/issuer/base.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../../src/core/oauth2/token/issuer/base.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EACR,kBAAkB,EAClB,wBAAwB,EACxB,yBAAyB,EAC5B,MAAM,YAAY,CAAC;AAEpB,8BAAsB,qBAAsB,YAAW,kBAAkB;IACrE,SAAS,CAAC,OAAO,EAAE,wBAAwB,CAAC;IAI5C,SAAS,aAAa,OAAO,CAAC,EAAE,wBAAwB;IAMxD,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAI7E,QAAQ,CAAC,KAAK,GAAE,kBAAuB,GAAI,MAAM,GAAG,SAAS;IAiB7D;;;;OAIG;IACH,QAAQ,CAAC,KAAK,GAAE,kBAAuB,GAAI,MAAM;CAYpD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.mjs","names":["OAuth2BaseTokenIssuer","options","buildIss","input","issuer","undefined","base","replace","realm_name","buildExp","exp","utc","Math","floor","Date","getTime","maxAge"],"sources":["../../../../../src/core/oauth2/token/issuer/base.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2TokenPayload } from '@authup/specs';\nimport type {
|
|
1
|
+
{"version":3,"file":"base.mjs","names":["OAuth2BaseTokenIssuer","options","buildIss","input","issuer","undefined","base","replace","realm_name","buildExp","exp","utc","Math","floor","Date","getTime","maxAge"],"sources":["../../../../../src/core/oauth2/token/issuer/base.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2TokenPayload } from '@authup/specs';\nimport type {\n IOAuth2TokenIssuer,\n OAuth2TokenIssuerOptions,\n OAuth2TokenIssuerResponse,\n} from './types.ts';\n\nexport abstract class OAuth2BaseTokenIssuer implements IOAuth2TokenIssuer {\n protected options: OAuth2TokenIssuerOptions;\n\n // ------------------------------------------------------------------\n\n protected constructor(options?: OAuth2TokenIssuerOptions) {\n this.options = options || {};\n }\n\n // ------------------------------------------------------------------\n\n abstract issue(input: OAuth2TokenPayload): Promise<OAuth2TokenIssuerResponse>;\n\n // ------------------------------------------------------------------\n\n buildIss(input: OAuth2TokenPayload = {}) : string | undefined {\n if (!this.options.issuer) {\n return undefined;\n }\n\n // Strip a trailing slash so a configured issuer like\n // `https://auth.example.com/` doesn't produce a malformed\n // `https://auth.example.com//realms/master`.\n const base = this.options.issuer.replace(/\\/+$/, '');\n\n if (input.realm_name) {\n return `${base}/realms/${input.realm_name}`;\n }\n\n return base;\n }\n\n /**\n * Build utc expire time (in seconds).\n *\n * @param input\n */\n buildExp(input: OAuth2TokenPayload = {}) : number {\n if (input.exp) {\n return input.exp;\n }\n\n const utc = Math.floor(new Date().getTime() / 1000);\n if (this.options.maxAge) {\n return utc + this.options.maxAge;\n }\n\n return utc + 3_600;\n }\n}\n"],"mappings":";;;;AAcA,IAAsBA,wBAAtB,MAAsBA;CACRC;CAIV,YAAsBA,SAAoC;EACtD,KAAKA,UAAUA,WAAW,CAAC;CAC/B;CAQAC,SAASC,QAA4B,CAAC,GAAwB;EAC1D,IAAI,CAAC,KAAKF,QAAQG,QACd;EAMJ,MAAME,OAAO,KAAKL,QAAQG,OAAOG,QAAQ,QAAQ,EAAA;EAEjD,IAAIJ,MAAMK,YACN,OAAO,GAAGF,KAAK,UAAUH,MAAMK;EAGnC,OAAOF;CACX;;;;;IAOAG,SAASN,QAA4B,CAAC,GAAY;EAC9C,IAAIA,MAAMO,KACN,OAAOP,MAAMO;EAGjB,MAAMC,MAAMC,KAAKC,uBAAM,IAAIC,KAAAA,EAAAA,CAAOC,QAAO,IAAK,GAAA;EAC9C,IAAI,KAAKd,QAAQe,QACb,OAAOL,MAAM,KAAKV,QAAQe;EAG9B,OAAOL,MAAM;CACjB;AACJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../../../src/core/oauth2/token/issuer/refresh/module.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../../../src/core/oauth2/token/issuer/refresh/module.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EACR,kBAAkB,EAClB,wBAAwB,EACxB,yBAAyB,EAC5B,MAAM,aAAa,CAAC;AAErB,qBAAa,wBAAyB,SAAQ,qBAAsB,YAAW,kBAAkB;IAC7F,SAAS,CAAC,UAAU,EAAE,sBAAsB,CAAC;IAE7C,SAAS,CAAC,MAAM,EAAG,kBAAkB,CAAC;IAEtC,SAAS,CAAC,sBAAsB,CAAC,EAAE,uBAAuB,CAAC;gBAGvD,UAAU,EAAE,sBAAsB,EAClC,MAAM,EAAE,kBAAkB,EAC1B,OAAO,GAAE,wBAA6B,EACtC,sBAAsB,CAAC,EAAE,uBAAuB;IAS9C,KAAK,CACP,KAAK,GAAE,kBAAuB,GAC9B,OAAO,CAAC,yBAAyB,CAAC;CAmCzC"}
|
|
@@ -27,6 +27,7 @@ var OAuth2RefreshTokenIssuer = class extends OAuth2BaseTokenIssuer {
|
|
|
27
27
|
if (this.sessionTokenRepository && data.session_id && data.jti && typeof data.exp === "number") await this.sessionTokenRepository.create({
|
|
28
28
|
id: data.jti,
|
|
29
29
|
sessionId: data.session_id,
|
|
30
|
+
clientId: data.client_id ?? null,
|
|
30
31
|
kind: "refresh",
|
|
31
32
|
parentId: input.parent_id ?? null,
|
|
32
33
|
ipAddress: data.remote_address ?? "",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.mjs","names":["OAuth2TokenKind","OAuth2BaseTokenIssuer","OAuth2RefreshTokenIssuer","repository","signer","sessionTokenRepository","options","issue","input","iss","buildIss","data","insert","kind","REFRESH","exp","buildExp","token","sign","saveWithSignature","session_id","jti","create","id","sessionId","parentId","parent_id","ipAddress","remote_address","userAgent","user_agent","expiresAt","Date","toISOString"],"sources":["../../../../../../src/core/oauth2/token/issuer/refresh/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2TokenPayload } from '@authup/specs';\nimport { OAuth2TokenKind } from '@authup/specs';\nimport type { IOAuth2TokenSigner } from '../../signer/index.ts';\nimport type { IOAuth2TokenRepository } from '../../repository/index.ts';\nimport type { ISessionTokenRepository } from '../../../session-token/index.ts';\nimport { OAuth2BaseTokenIssuer } from '../base.ts';\nimport type {
|
|
1
|
+
{"version":3,"file":"module.mjs","names":["OAuth2TokenKind","OAuth2BaseTokenIssuer","OAuth2RefreshTokenIssuer","repository","signer","sessionTokenRepository","options","issue","input","iss","buildIss","data","insert","kind","REFRESH","exp","buildExp","token","sign","saveWithSignature","session_id","jti","create","id","sessionId","clientId","client_id","parentId","parent_id","ipAddress","remote_address","userAgent","user_agent","expiresAt","Date","toISOString"],"sources":["../../../../../../src/core/oauth2/token/issuer/refresh/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2TokenPayload } from '@authup/specs';\nimport { OAuth2TokenKind } from '@authup/specs';\nimport type { IOAuth2TokenSigner } from '../../signer/index.ts';\nimport type { IOAuth2TokenRepository } from '../../repository/index.ts';\nimport type { ISessionTokenRepository } from '../../../session-token/index.ts';\nimport { OAuth2BaseTokenIssuer } from '../base.ts';\nimport type {\n IOAuth2TokenIssuer,\n OAuth2TokenIssuerOptions,\n OAuth2TokenIssuerResponse,\n} from '../types.ts';\n\nexport class OAuth2RefreshTokenIssuer extends OAuth2BaseTokenIssuer implements IOAuth2TokenIssuer {\n protected repository: IOAuth2TokenRepository;\n\n protected signer : IOAuth2TokenSigner;\n\n protected sessionTokenRepository?: ISessionTokenRepository;\n\n constructor(\n repository: IOAuth2TokenRepository,\n signer: IOAuth2TokenSigner,\n options: OAuth2TokenIssuerOptions = {},\n sessionTokenRepository?: ISessionTokenRepository,\n ) {\n super(options);\n\n this.repository = repository;\n this.signer = signer;\n this.sessionTokenRepository = sessionTokenRepository;\n }\n\n async issue(\n input: OAuth2TokenPayload = {},\n ) : Promise<OAuth2TokenIssuerResponse> {\n const iss = this.buildIss(input);\n\n const data = await this.repository.insert({\n ...input,\n kind: OAuth2TokenKind.REFRESH,\n exp: this.buildExp(input),\n ...(iss ? { iss } : {}),\n });\n\n const token = await this.signer.sign(data);\n\n await this.repository.saveWithSignature(data, token);\n\n if (\n this.sessionTokenRepository &&\n data.session_id && data.jti &&\n typeof data.exp === 'number'\n ) {\n await this.sessionTokenRepository.create({\n id: data.jti,\n sessionId: data.session_id,\n // Per-application attribution (plan 086). The same client the\n // payload was minted for, so the row needs no extra lookup.\n clientId: data.client_id ?? null,\n kind: 'refresh',\n parentId: input.parent_id ?? null,\n ipAddress: data.remote_address ?? '',\n userAgent: data.user_agent ?? '',\n expiresAt: new Date(data.exp * 1000).toISOString(),\n });\n }\n\n return [token, data];\n }\n}\n"],"mappings":";;;;;;AAmBA,IAAaE,2BAAb,cAA8CD,sBAAAA;CAChCE;CAEAC;CAEAC;CAEV,YACIF,YACAC,QACAE,UAAoC,CAAC,GACrCD,wBACF;EACE,MAAMC,OAAAA;EAEN,KAAKH,aAAaA;EAClB,KAAKC,SAASA;EACd,KAAKC,yBAAyBA;CAClC;CAEA,MAAME,MACFC,QAA4B,CAAC,GACM;EACnC,MAAMC,MAAM,KAAKC,SAASF,KAAAA;EAE1B,MAAMG,OAAO,MAAM,KAAKR,WAAWS,OAAO;GACtC,GAAGJ;GACHK,MAAMb,gBAAgBc;GACtBC,KAAK,KAAKC,SAASR,KAAAA;GACnB,GAAIC,MAAM,EAAEA,IAAI,IAAI,CAAC;EACzB,CAAA;EAEA,MAAMQ,QAAQ,MAAM,KAAKb,OAAOc,KAAKP,IAAAA;EAErC,MAAM,KAAKR,WAAWgB,kBAAkBR,MAAMM,KAAAA;EAE9C,IACI,KAAKZ,0BACLM,KAAKS,cAAcT,KAAKU,OACxB,OAAOV,KAAKI,QAAQ,UAEpB,MAAM,KAAKV,uBAAuBiB,OAAO;GACrCC,IAAIZ,KAAKU;GACTG,WAAWb,KAAKS;GAGhBK,UAAUd,KAAKe,aAAa;GAC5Bb,MAAM;GACNc,UAAUnB,MAAMoB,aAAa;GAC7BC,WAAWlB,KAAKmB,kBAAkB;GAClCC,WAAWpB,KAAKqB,cAAc;GAC9BC,4BAAW,IAAIC,KAAKvB,KAAKI,MAAM,GAAA,EAAA,CAAMoB,YAAW;EACpD,CAAA;EAGJ,OAAO,CAAClB,OAAON,IAAK;CACxB;AACJ"}
|
|
@@ -3,5 +3,5 @@ import "node:url";
|
|
|
3
3
|
import.meta.url;
|
|
4
4
|
import { RECORD_QUERY_PARAMETERS, describeQuerySchema } from "./describe.mjs";
|
|
5
5
|
import { createRelationsReadGate } from "./relations.mjs";
|
|
6
|
-
import { appendQueryConditions, decodeQuery, queryCodec, schemaRegistry } from "./module.mjs";
|
|
7
|
-
export { RECORD_QUERY_PARAMETERS, appendQueryConditions, createRelationsReadGate, decodeQuery, describeQuerySchema, queryCodec, schemaRegistry };
|
|
6
|
+
import { appendQueryConditions, decodeQuery, queryCodec, schemaRegistry, schemas } from "./module.mjs";
|
|
7
|
+
export { RECORD_QUERY_PARAMETERS, appendQueryConditions, createRelationsReadGate, decodeQuery, describeQuerySchema, queryCodec, schemaRegistry, schemas };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ICondition, IQuery, ObjectLiteral } from '@rapiq/core';
|
|
1
|
+
import type { ICondition, IQuery, ObjectLiteral, Schema } from '@rapiq/core';
|
|
2
2
|
import { Query, SchemaRegistry } from '@rapiq/core';
|
|
3
3
|
import type { DecodeQueryOptions } from './types.ts';
|
|
4
4
|
/**
|
|
@@ -17,6 +17,12 @@ import type { DecodeQueryOptions } from './types.ts';
|
|
|
17
17
|
* never auto-derived from entity metadata.
|
|
18
18
|
*/
|
|
19
19
|
export declare const schemaRegistry: SchemaRegistry<any>;
|
|
20
|
+
/**
|
|
21
|
+
* Every registered entity schema. Exported so the invariant guard can
|
|
22
|
+
* enumerate them: `SchemaRegistry` keeps its map protected and exposes
|
|
23
|
+
* no iterator (tada5hi/rapiq#904).
|
|
24
|
+
*/
|
|
25
|
+
export declare const schemas: Schema<any>[];
|
|
20
26
|
/**
|
|
21
27
|
* URL transport codec bound to the schema registry: decodes both the
|
|
22
28
|
* v2 expression dialect (stamped or detected) and legacy v1 bracket
|
|
@@ -41,20 +47,24 @@ export declare const queryCodec: import("@rapiq/codec-url").URLCodec;
|
|
|
41
47
|
export declare function decodeQuery<RECORD extends ObjectLiteral = ObjectLiteral>(input: unknown, options: DecodeQueryOptions<RECORD>): Promise<Query>;
|
|
42
48
|
/**
|
|
43
49
|
* Append server-derived conditions (a route realm, an owner scope, ...)
|
|
44
|
-
* onto a decoded query by AND-wrapping its filter tree.
|
|
45
|
-
* the
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
* schema allow-lists do not constrain them (server-derived context).
|
|
50
|
+
* onto a decoded query by AND-wrapping its filter tree. A client-sent
|
|
51
|
+
* condition on the same field intersects with the scope instead of
|
|
52
|
+
* replacing it, and compound client trees (`or(...)`) are preserved
|
|
53
|
+
* as-is. Same guarantee class as a mandatory `andWhere` at the
|
|
54
|
+
* repository — expressed once in the IR. Appended conditions do not
|
|
55
|
+
* pass through `decodeQuery`, so the schema allow-lists do not
|
|
56
|
+
* constrain them (server-derived context).
|
|
52
57
|
*
|
|
53
58
|
* Immutable: returns a new `Query` whose filters node is the
|
|
54
59
|
* AND-wrapped successor (`IFilters.and`); every other parameter node is
|
|
55
60
|
* carried over **by reference**, so the input query stays untouched and
|
|
56
61
|
* nothing is copied. The node enumeration mirrors rapiq's
|
|
57
62
|
* `QueryContext` — keep it in sync when the IR gains a parameter.
|
|
63
|
+
*
|
|
64
|
+
* Non-displaceability is structural since rapiq beta.19
|
|
65
|
+
* (tada5hi/rapiq#890): filter composition is conjunctive throughout, so
|
|
66
|
+
* no later composition step can drop a conjunct and the appended scope
|
|
67
|
+
* needs no marker to survive.
|
|
58
68
|
*/
|
|
59
69
|
export declare function appendQueryConditions(query: IQuery, ...conditions: ICondition[]): Query;
|
|
60
70
|
//# sourceMappingURL=module.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../src/core/query/module.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACR,UAAU,EACV,MAAM,EACN,aAAa,
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../src/core/query/module.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACR,UAAU,EACV,MAAM,EACN,aAAa,EACb,MAAM,EACT,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,KAAK,EAAE,cAAc,EAAY,MAAM,aAAa,CAAC;AA2B9D,OAAO,KAAK,EAAE,kBAAkB,EAAsB,MAAM,YAAY,CAAC;AAEzE;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,cAAc,qBAAuB,CAAC;AAEnD;;;;GAIG;AACH,eAAO,MAAM,OAAO,EAAG,MAAM,CAAC,GAAG,CAAC,EA2BjC,CAAC;AAMF;;;;GAIG;AACH,eAAO,MAAM,UAAU,qCAAiC,CAAC;AAEzD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,WAAW,CAAC,MAAM,SAAS,aAAa,GAAG,aAAa,EAC1E,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,kBAAkB,CAAC,MAAM,CAAC,GACnC,OAAO,CAAC,KAAK,CAAC,CAYjB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,UAAU,EAAE,GAAI,KAAK,CAQxF"}
|
|
@@ -8,6 +8,7 @@ import { clientScopeSchema } from "../entities/client-scope/schema.mjs";
|
|
|
8
8
|
import { consentSchema } from "../entities/consent/schema.mjs";
|
|
9
9
|
import { eventSchema } from "../entities/event/schema.mjs";
|
|
10
10
|
import { identityProviderSchema } from "../entities/identity-provider/schema.mjs";
|
|
11
|
+
import { identityProviderAccountSchema } from "../entities/identity-provider-account/schema.mjs";
|
|
11
12
|
import { identityProviderRoleMappingSchema } from "../entities/identity-provider-role-mapping/schema.mjs";
|
|
12
13
|
import { keySchema } from "../entities/key/schema.mjs";
|
|
13
14
|
import { permissionSchema } from "../entities/permission/schema.mjs";
|
|
@@ -19,6 +20,7 @@ import { roleAttributeSchema } from "../entities/role-attribute/schema.mjs";
|
|
|
19
20
|
import { rolePermissionSchema } from "../entities/role-permission/schema.mjs";
|
|
20
21
|
import { scopeSchema } from "../entities/scope/schema.mjs";
|
|
21
22
|
import { sessionSchema } from "../entities/session/schema.mjs";
|
|
23
|
+
import { sessionTokenSchema } from "../entities/session-token/schema.mjs";
|
|
22
24
|
import { trustAnchorSchema } from "../entities/trust-anchor/schema.mjs";
|
|
23
25
|
import { userSchema } from "../entities/user/schema.mjs";
|
|
24
26
|
import { userAttributeSchema } from "../entities/user-attribute/schema.mjs";
|
|
@@ -43,7 +45,11 @@ import { createURLCodec } from "@rapiq/codec-url";
|
|
|
43
45
|
* precedence), but the allow-lists themselves stay explicit and are
|
|
44
46
|
* never auto-derived from entity metadata.
|
|
45
47
|
*/ const schemaRegistry = new SchemaRegistry();
|
|
46
|
-
|
|
48
|
+
/**
|
|
49
|
+
* Every registered entity schema. Exported so the invariant guard can
|
|
50
|
+
* enumerate them: `SchemaRegistry` keeps its map protected and exposes
|
|
51
|
+
* no iterator (tada5hi/rapiq#904).
|
|
52
|
+
*/ const schemas = [
|
|
47
53
|
clientSchema,
|
|
48
54
|
clientPermissionSchema,
|
|
49
55
|
clientRoleSchema,
|
|
@@ -51,6 +57,7 @@ const schemas = [
|
|
|
51
57
|
consentSchema,
|
|
52
58
|
eventSchema,
|
|
53
59
|
identityProviderSchema,
|
|
60
|
+
identityProviderAccountSchema,
|
|
54
61
|
identityProviderRoleMappingSchema,
|
|
55
62
|
keySchema,
|
|
56
63
|
permissionSchema,
|
|
@@ -62,6 +69,7 @@ const schemas = [
|
|
|
62
69
|
rolePermissionSchema,
|
|
63
70
|
scopeSchema,
|
|
64
71
|
sessionSchema,
|
|
72
|
+
sessionTokenSchema,
|
|
65
73
|
trustAnchorSchema,
|
|
66
74
|
userSchema,
|
|
67
75
|
userAttributeSchema,
|
|
@@ -99,20 +107,24 @@ for (const schema of schemas) schemaRegistry.add(schema);
|
|
|
99
107
|
}
|
|
100
108
|
/**
|
|
101
109
|
* Append server-derived conditions (a route realm, an owner scope, ...)
|
|
102
|
-
* onto a decoded query by AND-wrapping its filter tree.
|
|
103
|
-
* the
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
*
|
|
107
|
-
*
|
|
108
|
-
*
|
|
109
|
-
* schema allow-lists do not constrain them (server-derived context).
|
|
110
|
+
* onto a decoded query by AND-wrapping its filter tree. A client-sent
|
|
111
|
+
* condition on the same field intersects with the scope instead of
|
|
112
|
+
* replacing it, and compound client trees (`or(...)`) are preserved
|
|
113
|
+
* as-is. Same guarantee class as a mandatory `andWhere` at the
|
|
114
|
+
* repository — expressed once in the IR. Appended conditions do not
|
|
115
|
+
* pass through `decodeQuery`, so the schema allow-lists do not
|
|
116
|
+
* constrain them (server-derived context).
|
|
110
117
|
*
|
|
111
118
|
* Immutable: returns a new `Query` whose filters node is the
|
|
112
119
|
* AND-wrapped successor (`IFilters.and`); every other parameter node is
|
|
113
120
|
* carried over **by reference**, so the input query stays untouched and
|
|
114
121
|
* nothing is copied. The node enumeration mirrors rapiq's
|
|
115
122
|
* `QueryContext` — keep it in sync when the IR gains a parameter.
|
|
123
|
+
*
|
|
124
|
+
* Non-displaceability is structural since rapiq beta.19
|
|
125
|
+
* (tada5hi/rapiq#890): filter composition is conjunctive throughout, so
|
|
126
|
+
* no later composition step can drop a conjunct and the appended scope
|
|
127
|
+
* needs no marker to survive.
|
|
116
128
|
*/ function appendQueryConditions(query, ...conditions) {
|
|
117
129
|
return new Query({
|
|
118
130
|
fields: query.fields,
|
|
@@ -123,6 +135,6 @@ for (const schema of schemas) schemaRegistry.add(schema);
|
|
|
123
135
|
});
|
|
124
136
|
}
|
|
125
137
|
//#endregion
|
|
126
|
-
export { appendQueryConditions, decodeQuery, queryCodec, schemaRegistry };
|
|
138
|
+
export { appendQueryConditions, decodeQuery, queryCodec, schemaRegistry, schemas };
|
|
127
139
|
|
|
128
140
|
//# sourceMappingURL=module.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.mjs","names":["createURLCodec","Query","SchemaRegistry","isObject","clientSchema","clientPermissionSchema","clientRoleSchema","clientScopeSchema","consentSchema","eventSchema","identityProviderSchema","identityProviderRoleMappingSchema","keySchema","permissionSchema","permissionPolicySchema","policySchema","realmSchema","roleSchema","roleAttributeSchema","rolePermissionSchema","scopeSchema","sessionSchema","trustAnchorSchema","userSchema","userAttributeSchema","userAuthenticatorSchema","userPermissionSchema","userRoleSchema","schemaRegistry","schemas","schema","add","queryCodec","decodeQuery","input","options","normalized","parsed","decodeAsync","parameters","context","actor","appendQueryConditions","query","conditions","fields","filters","and","relations","pagination","sorts"],"sources":["../../../src/core/query/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createURLCodec } from '@rapiq/codec-url';\nimport type {\n ICondition
|
|
1
|
+
{"version":3,"file":"module.mjs","names":["createURLCodec","Query","SchemaRegistry","isObject","clientSchema","clientPermissionSchema","clientRoleSchema","clientScopeSchema","consentSchema","eventSchema","identityProviderSchema","identityProviderAccountSchema","identityProviderRoleMappingSchema","keySchema","permissionSchema","permissionPolicySchema","policySchema","realmSchema","roleSchema","roleAttributeSchema","rolePermissionSchema","scopeSchema","sessionSchema","sessionTokenSchema","trustAnchorSchema","userSchema","userAttributeSchema","userAuthenticatorSchema","userPermissionSchema","userRoleSchema","schemaRegistry","schemas","schema","add","queryCodec","decodeQuery","input","options","normalized","parsed","decodeAsync","parameters","context","actor","appendQueryConditions","query","conditions","fields","filters","and","relations","pagination","sorts"],"sources":["../../../src/core/query/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createURLCodec } from '@rapiq/codec-url';\nimport type {\n ICondition,\n IQuery,\n ObjectLiteral,\n Schema,\n} from '@rapiq/core';\nimport { Query, SchemaRegistry, isObject } from '@rapiq/core';\nimport { clientSchema } from '../entities/client/schema.ts';\nimport { clientPermissionSchema } from '../entities/client-permission/schema.ts';\nimport { clientRoleSchema } from '../entities/client-role/schema.ts';\nimport { clientScopeSchema } from '../entities/client-scope/schema.ts';\nimport { consentSchema } from '../entities/consent/schema.ts';\nimport { eventSchema } from '../entities/event/schema.ts';\nimport { identityProviderSchema } from '../entities/identity-provider/schema.ts';\nimport { identityProviderAccountSchema } from '../entities/identity-provider-account/schema.ts';\nimport { identityProviderRoleMappingSchema } from '../entities/identity-provider-role-mapping/schema.ts';\nimport { keySchema } from '../entities/key/schema.ts';\nimport { permissionSchema } from '../entities/permission/schema.ts';\nimport { permissionPolicySchema } from '../entities/permission-policy/schema.ts';\nimport { policySchema } from '../entities/policy/schema.ts';\nimport { realmSchema } from '../entities/realm/schema.ts';\nimport { roleSchema } from '../entities/role/schema.ts';\nimport { roleAttributeSchema } from '../entities/role-attribute/schema.ts';\nimport { rolePermissionSchema } from '../entities/role-permission/schema.ts';\nimport { scopeSchema } from '../entities/scope/schema.ts';\nimport { sessionSchema } from '../entities/session/schema.ts';\nimport { sessionTokenSchema } from '../entities/session-token/schema.ts';\nimport { trustAnchorSchema } from '../entities/trust-anchor/schema.ts';\nimport { userSchema } from '../entities/user/schema.ts';\nimport { userAttributeSchema } from '../entities/user-attribute/schema.ts';\nimport { userAuthenticatorSchema } from '../entities/user-authenticator/schema.ts';\nimport { userPermissionSchema } from '../entities/user-permission/schema.ts';\nimport { userRoleSchema } from '../entities/user-role/schema.ts';\nimport type { DecodeQueryOptions, QueryDecodeContext } from './types.ts';\n\n/**\n * Registry of every entity schema — the server-side allow-list layer.\n * Relation traversal (e.g. a `realm.name` filter) resolves through the\n * `schemaMapping` of the owning schema into the related schema's own\n * allow-lists.\n *\n * The registry deliberately lives in core (persistence-agnostic): the\n * schemas are security policy over the domain types, and services\n * consume them to decode wire queries into the rapiq IR. A repository\n * layer MAY extend the registry with additional, storage-derived\n * schemas (e.g. `@rapiq/adapter-typeorm`'s `defineSchemaRegistryWithDataSource`\n * with the `registry` option — already-registered schemas take\n * precedence), but the allow-lists themselves stay explicit and are\n * never auto-derived from entity metadata.\n */\nexport const schemaRegistry = new SchemaRegistry();\n\n/**\n * Every registered entity schema. Exported so the invariant guard can\n * enumerate them: `SchemaRegistry` keeps its map protected and exposes\n * no iterator (tada5hi/rapiq#904).\n */\nexport const schemas : Schema<any>[] = [\n clientSchema,\n clientPermissionSchema,\n clientRoleSchema,\n clientScopeSchema,\n consentSchema,\n eventSchema,\n identityProviderSchema,\n identityProviderAccountSchema,\n identityProviderRoleMappingSchema,\n keySchema,\n permissionSchema,\n permissionPolicySchema,\n policySchema,\n realmSchema,\n roleSchema,\n roleAttributeSchema,\n rolePermissionSchema,\n scopeSchema,\n sessionSchema,\n sessionTokenSchema,\n trustAnchorSchema,\n userSchema,\n userAttributeSchema,\n userAuthenticatorSchema,\n userPermissionSchema,\n userRoleSchema,\n];\n\nfor (const schema of schemas) {\n schemaRegistry.add(schema);\n}\n\n/**\n * URL transport codec bound to the schema registry: decodes both the\n * v2 expression dialect (stamped or detected) and legacy v1 bracket\n * payloads, so pre-v2 clients keep working.\n */\nexport const queryCodec = createURLCodec(schemaRegistry);\n\n/**\n * Decode a raw wire query (routup `useRequestQuery` output or a raw\n * query string) against a registered schema into the rapiq IR. The\n * schema's allow-lists, defaults and pagination bounds are applied\n * here — downstream consumers (repository adapters) only execute the\n * returned query.\n *\n * Async because the schema validate hooks are: the relations read\n * gate (`createRelationsReadGate`) awaits the actor's permission\n * pre-gate per include, and rapiq refuses async validators on the\n * synchronous decode path. Pass the acting identity via\n * `options.actor` on every request-driven decode (authenticated or\n * anonymous — the HTTP adapter always builds one); a decode without\n * an actor is a system call and runs unrestricted.\n */\nexport async function decodeQuery<RECORD extends ObjectLiteral = ObjectLiteral>(\n input: unknown,\n options: DecodeQueryOptions<RECORD>,\n) : Promise<Query> {\n const normalized = isObject(input) || typeof input === 'string' ? input : {};\n\n const parsed = await queryCodec.decodeAsync(normalized, {\n // Schema<RECORD> is invariant; the codec's non-generic options\n // accept Schema<ObjectLiteral>, so collapse the variance here.\n schema: options.schema as Schema<any> | string,\n parameters: options.parameters,\n context: { actor: options.actor } satisfies QueryDecodeContext,\n });\n\n return parsed ?? new Query({});\n}\n\n/**\n * Append server-derived conditions (a route realm, an owner scope, ...)\n * onto a decoded query by AND-wrapping its filter tree. A client-sent\n * condition on the same field intersects with the scope instead of\n * replacing it, and compound client trees (`or(...)`) are preserved\n * as-is. Same guarantee class as a mandatory `andWhere` at the\n * repository — expressed once in the IR. Appended conditions do not\n * pass through `decodeQuery`, so the schema allow-lists do not\n * constrain them (server-derived context).\n *\n * Immutable: returns a new `Query` whose filters node is the\n * AND-wrapped successor (`IFilters.and`); every other parameter node is\n * carried over **by reference**, so the input query stays untouched and\n * nothing is copied. The node enumeration mirrors rapiq's\n * `QueryContext` — keep it in sync when the IR gains a parameter.\n *\n * Non-displaceability is structural since rapiq beta.19\n * (tada5hi/rapiq#890): filter composition is conjunctive throughout, so\n * no later composition step can drop a conjunct and the appended scope\n * needs no marker to survive.\n */\nexport function appendQueryConditions(query: IQuery, ...conditions: ICondition[]) : Query {\n return new Query({\n fields: query.fields,\n filters: query.filters.and(...conditions),\n relations: query.relations,\n pagination: query.pagination,\n sorts: query.sorts,\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DA,MAAa8B,iBAAiB,IAAI5B,eAAAA;;;;;GAOlC,MAAa6B,UAA0B;CACnC3B;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;AACH;AAED,KAAK,MAAMG,UAAUD,SACjBD,eAAeG,IAAID,MAAAA;;;;;GAQvB,MAAaE,aAAalC,eAAe8B,cAAAA;;;;;;;;;;;;;;;GAiBzC,eAAsBK,YAClBC,OACAC,SAAmC;CAEnC,MAAMC,aAAanC,SAASiC,KAAAA,KAAU,OAAOA,UAAU,WAAWA,QAAQ,CAAC;CAU3E,OAAOG,MARcL,WAAWM,YAAYF,YAAY;EAGpDN,QAAQK,QAAQL;EAChBS,YAAYJ,QAAQI;EACpBC,SAAS,EAAEC,OAAON,QAAQM,MAAM;CACpC,CAAA,KAEiB,IAAI1C,MAAM,CAAC,CAAA;AAChC;;;;;;;;;;;;;;;;;;;;;GAuBA,SAAgB2C,sBAAsBC,OAAe,GAAGC,YAAwB;CAC5E,OAAO,IAAI7C,MAAM;EACb8C,QAAQF,MAAME;EACdC,SAASH,MAAMG,QAAQC,IAAG,GAAIH,UAAAA;EAC9BI,WAAWL,MAAMK;EACjBC,YAAYN,MAAMM;EAClBC,OAAOP,MAAMO;CACjB,CAAA;AACJ"}
|