@digitaldefiance/node-express-suite 1.0.23 → 1.0.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -0
- package/package.json +8 -7
- package/src/application-base.d.ts +112 -0
- package/src/application-base.d.ts.map +1 -0
- package/src/application-base.js +335 -0
- package/src/application-base.js.map +1 -0
- package/src/application.d.ts +20 -0
- package/src/application.d.ts.map +1 -0
- package/src/application.js +124 -0
- package/src/application.js.map +1 -0
- package/src/backup-code.d.ts +67 -0
- package/src/backup-code.d.ts.map +1 -0
- package/src/backup-code.js +238 -0
- package/src/backup-code.js.map +1 -0
- package/src/constants.d.ts +16 -0
- package/src/constants.d.ts.map +1 -0
- package/src/constants.js +54 -0
- package/src/constants.js.map +1 -0
- package/src/controllers/base.d.ts +63 -0
- package/src/controllers/base.d.ts.map +1 -0
- package/src/controllers/base.js +272 -0
- package/src/controllers/base.js.map +1 -0
- package/src/controllers/{index.ts → index.d.ts} +1 -0
- package/src/controllers/index.d.ts.map +1 -0
- package/src/controllers/index.js +6 -0
- package/src/controllers/index.js.map +1 -0
- package/src/controllers/user.d.ts +45 -0
- package/src/controllers/user.d.ts.map +1 -0
- package/src/controllers/user.js +748 -0
- package/src/controllers/user.js.map +1 -0
- package/src/decorators/base-controller.d.ts +14 -0
- package/src/decorators/base-controller.d.ts.map +1 -0
- package/src/decorators/base-controller.js +49 -0
- package/src/decorators/base-controller.js.map +1 -0
- package/src/decorators/controller.d.ts +32 -0
- package/src/decorators/controller.d.ts.map +1 -0
- package/src/decorators/controller.js +67 -0
- package/src/decorators/controller.js.map +1 -0
- package/src/decorators/{index.ts → index.d.ts} +1 -0
- package/src/decorators/index.d.ts.map +1 -0
- package/src/decorators/index.js +7 -0
- package/src/decorators/index.js.map +1 -0
- package/src/decorators/zod-validation.d.ts +5 -0
- package/src/decorators/zod-validation.d.ts.map +1 -0
- package/src/decorators/zod-validation.js +47 -0
- package/src/decorators/zod-validation.js.map +1 -0
- package/src/defaults.d.ts +7 -0
- package/src/defaults.d.ts.map +1 -0
- package/src/defaults.js +83 -0
- package/src/defaults.js.map +1 -0
- package/src/documents/base.d.ts +3 -0
- package/src/documents/base.d.ts.map +1 -0
- package/src/documents/base.js +3 -0
- package/src/documents/base.js.map +1 -0
- package/src/documents/email-token.d.ts +8 -0
- package/src/documents/email-token.d.ts.map +1 -0
- package/src/documents/email-token.js +3 -0
- package/src/documents/email-token.js.map +1 -0
- package/src/documents/{index.ts → index.d.ts} +1 -0
- package/src/documents/index.d.ts.map +1 -0
- package/src/documents/index.js +3 -0
- package/src/documents/index.js.map +1 -0
- package/src/documents/{mnemonic.ts → mnemonic.d.ts} +2 -5
- package/src/documents/mnemonic.d.ts.map +1 -0
- package/src/documents/mnemonic.js +3 -0
- package/src/documents/mnemonic.js.map +1 -0
- package/src/documents/{role.ts → role.d.ts} +2 -5
- package/src/documents/role.d.ts.map +1 -0
- package/src/documents/role.js +3 -0
- package/src/documents/role.js.map +1 -0
- package/src/documents/used-direct-login-token.d.ts +5 -0
- package/src/documents/used-direct-login-token.d.ts.map +1 -0
- package/src/documents/used-direct-login-token.js +3 -0
- package/src/documents/used-direct-login-token.js.map +1 -0
- package/src/documents/{user-role.ts → user-role.d.ts} +2 -5
- package/src/documents/user-role.d.ts.map +1 -0
- package/src/documents/user-role.js +3 -0
- package/src/documents/user-role.js.map +1 -0
- package/src/documents/{user.ts → user.d.ts} +2 -4
- package/src/documents/user.d.ts.map +1 -0
- package/src/documents/user.js +3 -0
- package/src/documents/user.js.map +1 -0
- package/src/enumerations/base-model-name.d.ts +38 -0
- package/src/enumerations/base-model-name.d.ts.map +1 -0
- package/src/enumerations/base-model-name.js +34 -0
- package/src/enumerations/base-model-name.js.map +1 -0
- package/src/enumerations/{index.ts → index.d.ts} +1 -0
- package/src/enumerations/index.d.ts.map +1 -0
- package/src/enumerations/index.js +8 -0
- package/src/enumerations/index.js.map +1 -0
- package/src/enumerations/length-encoding-type.d.ts +7 -0
- package/src/enumerations/length-encoding-type.d.ts.map +1 -0
- package/src/enumerations/length-encoding-type.js +11 -0
- package/src/enumerations/length-encoding-type.js.map +1 -0
- package/src/enumerations/schema-collection.d.ts +34 -0
- package/src/enumerations/schema-collection.d.ts.map +1 -0
- package/src/enumerations/schema-collection.js +38 -0
- package/src/enumerations/schema-collection.js.map +1 -0
- package/src/enumerations/symmetric-error-type.d.ts +5 -0
- package/src/enumerations/symmetric-error-type.d.ts.map +1 -0
- package/src/enumerations/symmetric-error-type.js +9 -0
- package/src/enumerations/symmetric-error-type.js.map +1 -0
- package/src/environment.d.ts +189 -0
- package/src/environment.d.ts.map +1 -0
- package/src/environment.js +620 -0
- package/src/environment.js.map +1 -0
- package/src/errors/express-validation.d.ts +9 -0
- package/src/errors/express-validation.d.ts.map +1 -0
- package/src/errors/express-validation.js +18 -0
- package/src/errors/express-validation.js.map +1 -0
- package/src/errors/{index.ts → index.d.ts} +1 -0
- package/src/errors/index.d.ts.map +1 -0
- package/src/errors/index.js +16 -0
- package/src/errors/index.js.map +1 -0
- package/src/errors/invalid-backup-code-version.d.ts +6 -0
- package/src/errors/invalid-backup-code-version.d.ts.map +1 -0
- package/src/errors/invalid-backup-code-version.js +15 -0
- package/src/errors/invalid-backup-code-version.js.map +1 -0
- package/src/errors/invalid-jwt-token.d.ts +5 -0
- package/src/errors/invalid-jwt-token.d.ts.map +1 -0
- package/src/errors/invalid-jwt-token.js +11 -0
- package/src/errors/invalid-jwt-token.js.map +1 -0
- package/src/errors/invalid-model.d.ts +6 -0
- package/src/errors/invalid-model.d.ts.map +1 -0
- package/src/errors/invalid-model.js +14 -0
- package/src/errors/invalid-model.js.map +1 -0
- package/src/errors/invalid-new-password.d.ts +5 -0
- package/src/errors/invalid-new-password.d.ts.map +1 -0
- package/src/errors/invalid-new-password.js +14 -0
- package/src/errors/invalid-new-password.js.map +1 -0
- package/src/errors/invalid-password.d.ts +5 -0
- package/src/errors/invalid-password.d.ts.map +1 -0
- package/src/errors/invalid-password.js +14 -0
- package/src/errors/invalid-password.js.map +1 -0
- package/src/errors/missing-validated-data.d.ts +7 -0
- package/src/errors/missing-validated-data.d.ts.map +1 -0
- package/src/errors/missing-validated-data.js +36 -0
- package/src/errors/missing-validated-data.js.map +1 -0
- package/src/errors/mnemonic-or-password-required.d.ts +5 -0
- package/src/errors/mnemonic-or-password-required.d.ts.map +1 -0
- package/src/errors/mnemonic-or-password-required.js +13 -0
- package/src/errors/mnemonic-or-password-required.js.map +1 -0
- package/src/errors/model-not-registered.d.ts +5 -0
- package/src/errors/model-not-registered.d.ts.map +1 -0
- package/src/errors/model-not-registered.js +12 -0
- package/src/errors/model-not-registered.js.map +1 -0
- package/src/errors/mongoose-validation.d.ts +11 -0
- package/src/errors/mongoose-validation.d.ts.map +1 -0
- package/src/errors/mongoose-validation.js +17 -0
- package/src/errors/mongoose-validation.js.map +1 -0
- package/src/errors/symmetric.d.ts +8 -0
- package/src/errors/symmetric.d.ts.map +1 -0
- package/src/errors/symmetric.js +23 -0
- package/src/errors/symmetric.js.map +1 -0
- package/src/errors/token-expired.d.ts +5 -0
- package/src/errors/token-expired.d.ts.map +1 -0
- package/src/errors/token-expired.js +11 -0
- package/src/errors/token-expired.js.map +1 -0
- package/src/get-language.d.ts +2 -0
- package/src/get-language.d.ts.map +1 -0
- package/src/get-language.js +30 -0
- package/src/get-language.js.map +1 -0
- package/src/get-timezone.d.ts +3 -0
- package/src/get-timezone.d.ts.map +1 -0
- package/src/get-timezone.js +31 -0
- package/src/get-timezone.js.map +1 -0
- package/src/{index.ts → index.d.ts} +1 -1
- package/src/index.d.ts.map +1 -0
- package/src/index.js +28 -0
- package/src/index.js.map +1 -0
- package/src/interfaces/{api-error-response.ts → api-error-response.d.ts} +2 -2
- package/src/interfaces/api-error-response.d.ts.map +1 -0
- package/src/interfaces/api-error-response.js +3 -0
- package/src/interfaces/api-error-response.js.map +1 -0
- package/src/interfaces/api-express-validation-error-response.d.ts +7 -0
- package/src/interfaces/api-express-validation-error-response.d.ts.map +1 -0
- package/src/interfaces/api-express-validation-error-response.js +3 -0
- package/src/interfaces/api-express-validation-error-response.js.map +1 -0
- package/src/interfaces/api-message-response.d.ts +4 -0
- package/src/interfaces/api-message-response.d.ts.map +1 -0
- package/src/interfaces/api-message-response.js +3 -0
- package/src/interfaces/api-message-response.js.map +1 -0
- package/src/interfaces/{api-mongo-validation-error-response.ts → api-mongo-validation-error-response.d.ts} +2 -2
- package/src/interfaces/api-mongo-validation-error-response.d.ts.map +1 -0
- package/src/interfaces/api-mongo-validation-error-response.js +3 -0
- package/src/interfaces/api-mongo-validation-error-response.js.map +1 -0
- package/src/interfaces/api-responses/{backup-codes-response.ts → backup-codes-response.d.ts} +2 -2
- package/src/interfaces/api-responses/backup-codes-response.d.ts.map +1 -0
- package/src/interfaces/api-responses/backup-codes-response.js +3 -0
- package/src/interfaces/api-responses/backup-codes-response.js.map +1 -0
- package/src/interfaces/api-responses/{challenge-response.ts → challenge-response.d.ts} +3 -3
- package/src/interfaces/api-responses/challenge-response.d.ts.map +1 -0
- package/src/interfaces/api-responses/challenge-response.js +3 -0
- package/src/interfaces/api-responses/challenge-response.js.map +1 -0
- package/src/interfaces/api-responses/{code-count-response.ts → code-count-response.d.ts} +2 -2
- package/src/interfaces/api-responses/code-count-response.d.ts.map +1 -0
- package/src/interfaces/api-responses/code-count-response.js +3 -0
- package/src/interfaces/api-responses/code-count-response.js.map +1 -0
- package/src/interfaces/api-responses/{index.ts → index.d.ts} +1 -0
- package/src/interfaces/api-responses/index.d.ts.map +1 -0
- package/src/interfaces/api-responses/index.js +11 -0
- package/src/interfaces/api-responses/index.js.map +1 -0
- package/src/interfaces/api-responses/{login-response.ts → login-response.d.ts} +4 -4
- package/src/interfaces/api-responses/login-response.d.ts.map +1 -0
- package/src/interfaces/api-responses/login-response.js +3 -0
- package/src/interfaces/api-responses/login-response.js.map +1 -0
- package/src/interfaces/api-responses/{mnemonic-response.ts → mnemonic-response.d.ts} +2 -2
- package/src/interfaces/api-responses/mnemonic-response.d.ts.map +1 -0
- package/src/interfaces/api-responses/mnemonic-response.js +3 -0
- package/src/interfaces/api-responses/mnemonic-response.js.map +1 -0
- package/src/interfaces/api-responses/{registration-response.ts → registration-response.d.ts} +3 -3
- package/src/interfaces/api-responses/registration-response.d.ts.map +1 -0
- package/src/interfaces/api-responses/registration-response.js +3 -0
- package/src/interfaces/api-responses/registration-response.js.map +1 -0
- package/src/interfaces/api-responses/{request-user-response.ts → request-user-response.d.ts} +2 -2
- package/src/interfaces/api-responses/request-user-response.d.ts.map +1 -0
- package/src/interfaces/api-responses/request-user-response.js +3 -0
- package/src/interfaces/api-responses/request-user-response.js.map +1 -0
- package/src/interfaces/{application.ts → application.d.ts} +7 -7
- package/src/interfaces/application.d.ts.map +1 -0
- package/src/interfaces/application.js +3 -0
- package/src/interfaces/application.js.map +1 -0
- package/src/interfaces/backend-objects/email-token.d.ts +4 -0
- package/src/interfaces/backend-objects/email-token.d.ts.map +1 -0
- package/src/interfaces/backend-objects/email-token.js +3 -0
- package/src/interfaces/backend-objects/email-token.js.map +1 -0
- package/src/interfaces/backend-objects/{index.ts → index.d.ts} +1 -0
- package/src/interfaces/backend-objects/index.d.ts.map +1 -0
- package/src/interfaces/backend-objects/index.js +8 -0
- package/src/interfaces/backend-objects/index.js.map +1 -0
- package/src/interfaces/backend-objects/{request-user.ts → request-user.d.ts} +2 -7
- package/src/interfaces/backend-objects/request-user.d.ts.map +1 -0
- package/src/interfaces/backend-objects/request-user.js +3 -0
- package/src/interfaces/backend-objects/request-user.js.map +1 -0
- package/src/interfaces/backend-objects/{role.ts → role.d.ts} +1 -1
- package/src/interfaces/backend-objects/role.d.ts.map +1 -0
- package/src/interfaces/backend-objects/role.js +3 -0
- package/src/interfaces/backend-objects/role.js.map +1 -0
- package/src/interfaces/backend-objects/user.d.ts +4 -0
- package/src/interfaces/backend-objects/user.d.ts.map +1 -0
- package/src/interfaces/backend-objects/user.js +3 -0
- package/src/interfaces/backend-objects/user.js.map +1 -0
- package/src/interfaces/checksum-config.d.ts +5 -0
- package/src/interfaces/checksum-config.d.ts.map +1 -0
- package/src/interfaces/checksum-config.js +3 -0
- package/src/interfaces/checksum-config.js.map +1 -0
- package/src/interfaces/checksum-consts.d.ts +11 -0
- package/src/interfaces/checksum-consts.d.ts.map +1 -0
- package/src/interfaces/checksum-consts.js +3 -0
- package/src/interfaces/checksum-consts.js.map +1 -0
- package/src/interfaces/{constants.ts → constants.d.ts} +5 -5
- package/src/interfaces/constants.d.ts.map +1 -0
- package/src/interfaces/constants.js +3 -0
- package/src/interfaces/constants.js.map +1 -0
- package/src/interfaces/create-user-basics.d.ts +18 -0
- package/src/interfaces/create-user-basics.d.ts.map +1 -0
- package/src/interfaces/create-user-basics.js +3 -0
- package/src/interfaces/create-user-basics.js.map +1 -0
- package/src/interfaces/csp-config.d.ts +14 -0
- package/src/interfaces/csp-config.d.ts.map +1 -0
- package/src/interfaces/csp-config.js +3 -0
- package/src/interfaces/csp-config.js.map +1 -0
- package/src/interfaces/deep-partial.d.ts +4 -0
- package/src/interfaces/deep-partial.d.ts.map +1 -0
- package/src/interfaces/deep-partial.js +3 -0
- package/src/interfaces/deep-partial.js.map +1 -0
- package/src/interfaces/{discriminator-collections.ts → discriminator-collections.d.ts} +3 -3
- package/src/interfaces/discriminator-collections.d.ts.map +1 -0
- package/src/interfaces/discriminator-collections.js +3 -0
- package/src/interfaces/discriminator-collections.js.map +1 -0
- package/src/interfaces/email-service.d.ts +4 -0
- package/src/interfaces/email-service.d.ts.map +1 -0
- package/src/interfaces/email-service.js +3 -0
- package/src/interfaces/email-service.js.map +1 -0
- package/src/interfaces/environment-mongo.d.ts +76 -0
- package/src/interfaces/environment-mongo.d.ts.map +1 -0
- package/src/interfaces/environment-mongo.js +3 -0
- package/src/interfaces/environment-mongo.js.map +1 -0
- package/src/interfaces/environment.d.ts +181 -0
- package/src/interfaces/environment.d.ts.map +1 -0
- package/src/interfaces/environment.js +3 -0
- package/src/interfaces/environment.js.map +1 -0
- package/src/interfaces/failable-result.d.ts +7 -0
- package/src/interfaces/failable-result.d.ts.map +1 -0
- package/src/interfaces/failable-result.js +3 -0
- package/src/interfaces/failable-result.js.map +1 -0
- package/src/interfaces/fec-consts.d.ts +5 -0
- package/src/interfaces/fec-consts.d.ts.map +1 -0
- package/src/interfaces/fec-consts.js +3 -0
- package/src/interfaces/fec-consts.js.map +1 -0
- package/src/interfaces/handleable-error-options.d.ts +7 -0
- package/src/interfaces/handleable-error-options.d.ts.map +1 -0
- package/src/interfaces/handleable-error-options.js +3 -0
- package/src/interfaces/handleable-error-options.js.map +1 -0
- package/src/interfaces/{index.ts → index.d.ts} +1 -0
- package/src/interfaces/index.d.ts.map +1 -0
- package/src/interfaces/index.js +33 -0
- package/src/interfaces/index.js.map +1 -0
- package/src/interfaces/jwt-consts.d.ts +11 -0
- package/src/interfaces/jwt-consts.d.ts.map +1 -0
- package/src/interfaces/jwt-consts.js +3 -0
- package/src/interfaces/jwt-consts.js.map +1 -0
- package/src/interfaces/jwt-sign-response.d.ts +11 -0
- package/src/interfaces/jwt-sign-response.d.ts.map +1 -0
- package/src/interfaces/jwt-sign-response.js +3 -0
- package/src/interfaces/jwt-sign-response.js.map +1 -0
- package/src/interfaces/mongo-errors.d.ts +5 -0
- package/src/interfaces/mongo-errors.d.ts.map +1 -0
- package/src/interfaces/mongo-errors.js +3 -0
- package/src/interfaces/mongo-errors.js.map +1 -0
- package/src/interfaces/request-user.d.ts +42 -0
- package/src/interfaces/request-user.d.ts.map +1 -0
- package/src/interfaces/request-user.js +3 -0
- package/src/interfaces/request-user.js.map +1 -0
- package/src/interfaces/required-string-keys.d.ts +22 -0
- package/src/interfaces/required-string-keys.d.ts.map +1 -0
- package/src/interfaces/required-string-keys.js +3 -0
- package/src/interfaces/required-string-keys.js.map +1 -0
- package/src/interfaces/schema.d.ts +29 -0
- package/src/interfaces/schema.d.ts.map +1 -0
- package/src/interfaces/schema.js +3 -0
- package/src/interfaces/schema.js.map +1 -0
- package/src/interfaces/server-init-result.d.ts +35 -0
- package/src/interfaces/server-init-result.d.ts.map +1 -0
- package/src/interfaces/server-init-result.js +3 -0
- package/src/interfaces/server-init-result.js.map +1 -0
- package/src/interfaces/status-code-response.d.ts +7 -0
- package/src/interfaces/status-code-response.d.ts.map +1 -0
- package/src/interfaces/status-code-response.js +3 -0
- package/src/interfaces/status-code-response.js.map +1 -0
- package/src/interfaces/symmetric-encryption-results.d.ts +3 -3
- package/src/interfaces/symmetric-encryption-results.d.ts.map +1 -1
- package/src/interfaces/symmetric-encryption-results.js.map +1 -1
- package/src/interfaces/{token-response.ts → token-response.d.ts} +2 -2
- package/src/interfaces/token-response.d.ts.map +1 -0
- package/src/interfaces/token-response.js +3 -0
- package/src/interfaces/token-response.js.map +1 -0
- package/src/middlewares/authenticate-crypto.d.ts +13 -0
- package/src/middlewares/authenticate-crypto.d.ts.map +1 -0
- package/src/middlewares/authenticate-crypto.js +146 -0
- package/src/middlewares/authenticate-crypto.js.map +1 -0
- package/src/middlewares/authenticate-token.d.ts +24 -0
- package/src/middlewares/authenticate-token.d.ts.map +1 -0
- package/src/middlewares/authenticate-token.js +102 -0
- package/src/middlewares/authenticate-token.js.map +1 -0
- package/src/middlewares/cleanup-crypto.d.ts +7 -0
- package/src/middlewares/cleanup-crypto.d.ts.map +1 -0
- package/src/middlewares/cleanup-crypto.js +32 -0
- package/src/middlewares/cleanup-crypto.js.map +1 -0
- package/src/middlewares/{index.ts → index.d.ts} +1 -0
- package/src/middlewares/index.d.ts.map +1 -0
- package/src/middlewares/index.js +8 -0
- package/src/middlewares/index.js.map +1 -0
- package/src/middlewares/set-global-context-language.d.ts +3 -0
- package/src/middlewares/set-global-context-language.d.ts.map +1 -0
- package/src/middlewares/set-global-context-language.js +14 -0
- package/src/middlewares/set-global-context-language.js.map +1 -0
- package/src/middlewares.d.ts +18 -0
- package/src/middlewares.d.ts.map +1 -0
- package/src/middlewares.js +74 -0
- package/src/middlewares.js.map +1 -0
- package/src/model-registry.d.ts +23 -0
- package/src/model-registry.d.ts.map +1 -0
- package/src/model-registry.js +47 -0
- package/src/model-registry.js.map +1 -0
- package/src/models/email-token.d.ts +11 -0
- package/src/models/email-token.d.ts.map +1 -0
- package/src/models/email-token.js +11 -0
- package/src/models/email-token.js.map +1 -0
- package/src/models/{index.ts → index.d.ts} +1 -0
- package/src/models/index.d.ts.map +1 -0
- package/src/models/index.js +10 -0
- package/src/models/index.js.map +1 -0
- package/src/models/mnemonic.d.ts +11 -0
- package/src/models/mnemonic.d.ts.map +1 -0
- package/src/models/mnemonic.js +11 -0
- package/src/models/mnemonic.js.map +1 -0
- package/src/models/role.d.ts +11 -0
- package/src/models/role.d.ts.map +1 -0
- package/src/models/role.js +11 -0
- package/src/models/role.js.map +1 -0
- package/src/models/used-direct-login-token.d.ts +11 -0
- package/src/models/used-direct-login-token.d.ts.map +1 -0
- package/src/models/used-direct-login-token.js +11 -0
- package/src/models/used-direct-login-token.js.map +1 -0
- package/src/models/user-role.d.ts +6 -0
- package/src/models/user-role.d.ts.map +1 -0
- package/src/models/user-role.js +10 -0
- package/src/models/user-role.js.map +1 -0
- package/src/models/user.d.ts +7 -0
- package/src/models/user.d.ts.map +1 -0
- package/src/models/user.js +11 -0
- package/src/models/user.js.map +1 -0
- package/src/registry/email-service-registry.d.ts +9 -0
- package/src/registry/email-service-registry.d.ts.map +1 -0
- package/src/registry/email-service-registry.js +18 -0
- package/src/registry/email-service-registry.js.map +1 -0
- package/src/registry/{index.ts → index.d.ts} +1 -0
- package/src/registry/index.d.ts.map +1 -0
- package/src/registry/index.js +6 -0
- package/src/registry/index.js.map +1 -0
- package/src/routers/api.d.ts +27 -0
- package/src/routers/api.d.ts.map +1 -0
- package/src/routers/api.js +52 -0
- package/src/routers/api.js.map +1 -0
- package/src/routers/app.d.ts +28 -0
- package/src/routers/app.d.ts.map +1 -0
- package/src/routers/app.js +186 -0
- package/src/routers/app.js.map +1 -0
- package/src/routers/base.d.ts +12 -0
- package/src/routers/base.d.ts.map +1 -0
- package/src/routers/base.js +14 -0
- package/src/routers/base.js.map +1 -0
- package/src/routers/{index.ts → index.d.ts} +1 -0
- package/src/routers/index.d.ts.map +1 -0
- package/src/routers/index.js +7 -0
- package/src/routers/index.js.map +1 -0
- package/src/schemas/email-token.d.ts +38 -0
- package/src/schemas/email-token.d.ts.map +1 -0
- package/src/schemas/email-token.js +54 -0
- package/src/schemas/email-token.js.map +1 -0
- package/src/schemas/{index.ts → index.d.ts} +2 -1
- package/src/schemas/index.d.ts.map +1 -0
- package/src/schemas/index.js +11 -0
- package/src/schemas/index.js.map +1 -0
- package/src/schemas/mnemonic.d.ts +20 -0
- package/src/schemas/mnemonic.d.ts.map +1 -0
- package/src/schemas/mnemonic.js +30 -0
- package/src/schemas/mnemonic.js.map +1 -0
- package/src/schemas/role.d.ts +32 -0
- package/src/schemas/role.d.ts.map +1 -0
- package/src/schemas/role.js +86 -0
- package/src/schemas/role.js.map +1 -0
- package/src/schemas/schema.d.ts +40 -0
- package/src/schemas/schema.d.ts.map +1 -0
- package/src/schemas/schema.js +62 -0
- package/src/schemas/schema.js.map +1 -0
- package/src/schemas/used-direct-login-token.d.ts +27 -0
- package/src/schemas/used-direct-login-token.d.ts.map +1 -0
- package/src/schemas/used-direct-login-token.js +23 -0
- package/src/schemas/used-direct-login-token.js.map +1 -0
- package/src/schemas/user-role.d.ts +29 -0
- package/src/schemas/user-role.d.ts.map +1 -0
- package/src/schemas/user-role.js +54 -0
- package/src/schemas/user-role.js.map +1 -0
- package/src/schemas/user.d.ts +21 -0
- package/src/schemas/user.d.ts.map +1 -0
- package/src/schemas/user.js +176 -0
- package/src/schemas/user.js.map +1 -0
- package/src/services/backup-code.d.ts +78 -0
- package/src/services/backup-code.d.ts.map +1 -0
- package/src/services/backup-code.js +184 -0
- package/src/services/backup-code.js.map +1 -0
- package/src/services/base.d.ts +13 -0
- package/src/services/base.d.ts.map +1 -0
- package/src/services/base.js +15 -0
- package/src/services/base.js.map +1 -0
- package/src/services/checksum.d.ts +67 -0
- package/src/services/checksum.d.ts.map +1 -0
- package/src/services/checksum.js +143 -0
- package/src/services/checksum.js.map +1 -0
- package/src/services/crc.d.ts +87 -0
- package/src/services/crc.d.ts.map +1 -0
- package/src/services/crc.js +198 -0
- package/src/services/crc.js.map +1 -0
- package/src/services/database-initialization.d.ts +105 -0
- package/src/services/database-initialization.d.ts.map +1 -0
- package/src/services/database-initialization.js +782 -0
- package/src/services/database-initialization.js.map +1 -0
- package/src/services/db-init-cache.d.ts +7 -13
- package/src/services/db-init-cache.d.ts.map +1 -0
- package/src/services/db-init-cache.js +3 -0
- package/src/services/db-init-cache.js.map +1 -0
- package/src/services/direct-login-token.d.ts +9 -0
- package/src/services/direct-login-token.d.ts.map +1 -0
- package/src/services/direct-login-token.js +41 -0
- package/src/services/direct-login-token.js.map +1 -0
- package/src/services/fec-usage-example.d.ts +38 -0
- package/src/services/fec-usage-example.d.ts.map +1 -0
- package/src/services/fec-usage-example.js +75 -0
- package/src/services/fec-usage-example.js.map +1 -0
- package/src/services/fec.d.ts +46 -0
- package/src/services/fec.d.ts.map +1 -0
- package/src/services/fec.js +192 -0
- package/src/services/fec.js.map +1 -0
- package/src/services/{index.ts → index.d.ts} +1 -0
- package/src/services/index.d.ts.map +1 -0
- package/src/services/index.js +22 -0
- package/src/services/index.js.map +1 -0
- package/src/services/jwt.d.ts +33 -0
- package/src/services/jwt.d.ts.map +1 -0
- package/src/services/jwt.js +91 -0
- package/src/services/jwt.js.map +1 -0
- package/src/services/key-wrapping.d.ts +60 -0
- package/src/services/key-wrapping.d.ts.map +1 -0
- package/src/services/key-wrapping.js +311 -0
- package/src/services/key-wrapping.js.map +1 -0
- package/src/services/mnemonic.d.ts +61 -0
- package/src/services/mnemonic.d.ts.map +1 -0
- package/src/services/mnemonic.js +115 -0
- package/src/services/mnemonic.js.map +1 -0
- package/src/services/request-user.d.ts +20 -0
- package/src/services/request-user.d.ts.map +1 -0
- package/src/services/request-user.js +50 -0
- package/src/services/request-user.js.map +1 -0
- package/src/services/role.d.ts +88 -0
- package/src/services/role.d.ts.map +1 -0
- package/src/services/role.js +263 -0
- package/src/services/role.js.map +1 -0
- package/src/services/symmetric.d.ts +42 -0
- package/src/services/symmetric.d.ts.map +1 -0
- package/src/services/symmetric.js +101 -0
- package/src/services/symmetric.js.map +1 -0
- package/src/services/system-user.d.ts +17 -0
- package/src/services/system-user.d.ts.map +1 -0
- package/src/services/system-user.js +46 -0
- package/src/services/system-user.js.map +1 -0
- package/src/services/user.d.ts +320 -0
- package/src/services/user.d.ts.map +1 -0
- package/src/services/user.js +1378 -0
- package/src/services/user.js.map +1 -0
- package/src/services/xor.d.ts +24 -0
- package/src/services/xor.d.ts.map +1 -0
- package/src/services/xor.js +37 -0
- package/src/services/xor.js.map +1 -0
- package/src/types.d.ts +66 -40
- package/src/types.d.ts.map +1 -0
- package/src/types.js +14 -0
- package/src/types.js.map +1 -0
- package/src/utils.d.ts +202 -0
- package/src/utils.d.ts.map +1 -0
- package/src/utils.js +784 -0
- package/src/utils.js.map +1 -0
- package/LICENSE +0 -21
- package/src/application-base.ts +0 -492
- package/src/application.ts +0 -254
- package/src/backup-code.ts +0 -336
- package/src/constants.ts +0 -69
- package/src/controllers/base.ts +0 -440
- package/src/controllers/user.ts +0 -1451
- package/src/decorators/base-controller.ts +0 -61
- package/src/decorators/controller.ts +0 -109
- package/src/decorators/zod-validation.ts +0 -57
- package/src/defaults.ts +0 -94
- package/src/documents/base.ts +0 -7
- package/src/documents/email-token.ts +0 -14
- package/src/documents/used-direct-login-token.ts +0 -7
- package/src/enumerations/base-model-name.ts +0 -41
- package/src/enumerations/length-encoding-type.ts +0 -6
- package/src/enumerations/schema-collection.ts +0 -33
- package/src/enumerations/symmetric-error-type.ts +0 -4
- package/src/environment.ts +0 -770
- package/src/errors/express-validation.ts +0 -21
- package/src/errors/invalid-backup-code-version.ts +0 -14
- package/src/errors/invalid-jwt-token.ts +0 -10
- package/src/errors/invalid-model.ts +0 -11
- package/src/errors/invalid-new-password.ts +0 -18
- package/src/errors/invalid-password.ts +0 -13
- package/src/errors/missing-validated-data.ts +0 -36
- package/src/errors/mnemonic-or-password-required.ts +0 -12
- package/src/errors/model-not-registered.ts +0 -11
- package/src/errors/mongoose-validation.ts +0 -34
- package/src/errors/symmetric.ts +0 -41
- package/src/errors/token-expired.ts +0 -10
- package/src/get-language.ts +0 -53
- package/src/get-timezone.ts +0 -45
- package/src/interfaces/api-express-validation-error-response.ts +0 -8
- package/src/interfaces/api-message-response.ts +0 -3
- package/src/interfaces/backend-objects/email-token.ts +0 -11
- package/src/interfaces/backend-objects/user.ts +0 -9
- package/src/interfaces/checksum-config.ts +0 -4
- package/src/interfaces/checksum-consts.ts +0 -13
- package/src/interfaces/create-user-basics.ts +0 -17
- package/src/interfaces/csp-config.ts +0 -35
- package/src/interfaces/deep-partial.ts +0 -3
- package/src/interfaces/email-service.ts +0 -8
- package/src/interfaces/environment-mongo.ts +0 -76
- package/src/interfaces/environment.ts +0 -181
- package/src/interfaces/failable-result.ts +0 -6
- package/src/interfaces/fec-consts.ts +0 -4
- package/src/interfaces/handleable-error-options.ts +0 -6
- package/src/interfaces/jwt-consts.ts +0 -23
- package/src/interfaces/jwt-sign-response.ts +0 -19
- package/src/interfaces/mongo-errors.ts +0 -5
- package/src/interfaces/request-user.ts +0 -50
- package/src/interfaces/required-string-keys.ts +0 -26
- package/src/interfaces/schema.ts +0 -31
- package/src/interfaces/server-init-result.ts +0 -37
- package/src/interfaces/status-code-response.ts +0 -7
- package/src/interfaces/symmetric-encryption-results.ts +0 -4
- package/src/middlewares/authenticate-crypto.ts +0 -243
- package/src/middlewares/authenticate-token.ts +0 -152
- package/src/middlewares/cleanup-crypto.ts +0 -40
- package/src/middlewares/set-global-context-language.ts +0 -24
- package/src/middlewares.ts +0 -120
- package/src/model-registry.ts +0 -75
- package/src/models/email-token.ts +0 -19
- package/src/models/mnemonic.ts +0 -19
- package/src/models/role.ts +0 -19
- package/src/models/used-direct-login-token.ts +0 -23
- package/src/models/user-role.ts +0 -17
- package/src/models/user.ts +0 -19
- package/src/registry/email-service-registry.ts +0 -24
- package/src/routers/api.ts +0 -151
- package/src/routers/app.ts +0 -258
- package/src/routers/base.ts +0 -17
- package/src/schemas/email-token.ts +0 -91
- package/src/schemas/mnemonic.ts +0 -37
- package/src/schemas/role.ts +0 -127
- package/src/schemas/schema.ts +0 -140
- package/src/schemas/used-direct-login-token.ts +0 -38
- package/src/schemas/user-role.ts +0 -75
- package/src/schemas/user.ts +0 -202
- package/src/services/backup-code.ts +0 -316
- package/src/services/base.ts +0 -33
- package/src/services/checksum.ts +0 -161
- package/src/services/crc.ts +0 -213
- package/src/services/database-initialization.ts +0 -1479
- package/src/services/direct-login-token.ts +0 -62
- package/src/services/fec-usage-example.ts +0 -102
- package/src/services/fec.ts +0 -296
- package/src/services/jwt.ts +0 -134
- package/src/services/key-wrapping.ts +0 -434
- package/src/services/mnemonic.ts +0 -167
- package/src/services/request-user.ts +0 -62
- package/src/services/role.ts +0 -396
- package/src/services/symmetric.ts +0 -139
- package/src/services/system-user.ts +0 -82
- package/src/services/user.ts +0 -2137
- package/src/services/xor.ts +0 -34
- package/src/types.ts +0 -128
- package/src/utils.ts +0 -1022
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
DirectTokenUsedError,
|
|
3
|
-
FailedToUseDirectTokenError,
|
|
4
|
-
IUsedDirectLoginTokenBase,
|
|
5
|
-
} from '@digitaldefiance/suite-core-lib';
|
|
6
|
-
import { ClientSession, Types } from 'mongoose';
|
|
7
|
-
import { IUsedDirectLoginTokenDocument } from '../documents/used-direct-login-token';
|
|
8
|
-
import { BaseModelName } from '../enumerations/base-model-name';
|
|
9
|
-
import { IApplication } from '../interfaces/application';
|
|
10
|
-
import { ModelRegistry } from '../model-registry';
|
|
11
|
-
import { withTransaction } from '../utils';
|
|
12
|
-
import { IBaseDocument } from '../documents';
|
|
13
|
-
import { Environment } from '../environment';
|
|
14
|
-
import { IConstants } from '../interfaces';
|
|
15
|
-
export abstract class DirectLoginTokenService {
|
|
16
|
-
public static async useToken(
|
|
17
|
-
app: IApplication<any, Types.ObjectId, IBaseDocument<any, Types.ObjectId>, Environment, IConstants>,
|
|
18
|
-
userId: Types.ObjectId,
|
|
19
|
-
token: string,
|
|
20
|
-
session?: ClientSession,
|
|
21
|
-
): Promise<void> {
|
|
22
|
-
return withTransaction(
|
|
23
|
-
app.db.connection,
|
|
24
|
-
app.environment.mongo.useTransactions,
|
|
25
|
-
session,
|
|
26
|
-
async (sess) => {
|
|
27
|
-
const UsedDirectLoginTokenModel = ModelRegistry.instance.get<
|
|
28
|
-
IUsedDirectLoginTokenBase<Types.ObjectId>,
|
|
29
|
-
IUsedDirectLoginTokenDocument
|
|
30
|
-
>(BaseModelName.UsedDirectLoginToken).model;
|
|
31
|
-
const tokenExists = await UsedDirectLoginTokenModel.exists({
|
|
32
|
-
userId,
|
|
33
|
-
token,
|
|
34
|
-
}).session(sess ?? null);
|
|
35
|
-
if (tokenExists) {
|
|
36
|
-
throw new DirectTokenUsedError();
|
|
37
|
-
}
|
|
38
|
-
try {
|
|
39
|
-
const newTokens = await UsedDirectLoginTokenModel.create(
|
|
40
|
-
[{ userId, token }],
|
|
41
|
-
{
|
|
42
|
-
session: sess,
|
|
43
|
-
},
|
|
44
|
-
);
|
|
45
|
-
if (newTokens.length !== 1) {
|
|
46
|
-
throw new FailedToUseDirectTokenError();
|
|
47
|
-
}
|
|
48
|
-
} catch (err) {
|
|
49
|
-
// re-throw FailedToUseDirectTokenError
|
|
50
|
-
if (err instanceof FailedToUseDirectTokenError) {
|
|
51
|
-
throw err;
|
|
52
|
-
}
|
|
53
|
-
// throw FailedToUseDirectTokenError on duplicate key error or other errors
|
|
54
|
-
throw new FailedToUseDirectTokenError();
|
|
55
|
-
}
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
timeoutMs: app.environment.mongo.transactionTimeout,
|
|
59
|
-
},
|
|
60
|
-
);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
import { FecService } from './fec';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Example usage of the adapted FEC service for filesystem/S3 objects
|
|
5
|
-
*/
|
|
6
|
-
export class FecUsageExample {
|
|
7
|
-
private fecService = new FecService();
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Example: Create parity data for a file and store it separately
|
|
11
|
-
*/
|
|
12
|
-
async createFileWithParity(fileData: Buffer, parityCount: number = 2) {
|
|
13
|
-
// Create parity data
|
|
14
|
-
const parityData = await this.fecService.createParityData(
|
|
15
|
-
fileData,
|
|
16
|
-
parityCount,
|
|
17
|
-
);
|
|
18
|
-
|
|
19
|
-
// In a real implementation, you would:
|
|
20
|
-
// 1. Store the original file (e.g., to S3 as "file.dat")
|
|
21
|
-
// 2. Store each parity data separately (e.g., "file.dat.parity.0", "file.dat.parity.1")
|
|
22
|
-
// 3. Store metadata about the original file size
|
|
23
|
-
|
|
24
|
-
return {
|
|
25
|
-
originalData: fileData,
|
|
26
|
-
parityData,
|
|
27
|
-
originalSize: fileData.length,
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Example: Recover a corrupted file using parity data
|
|
33
|
-
*/
|
|
34
|
-
async recoverCorruptedFile(
|
|
35
|
-
parityData: Array<{ data: Buffer; index: number }>,
|
|
36
|
-
originalSize: number,
|
|
37
|
-
) {
|
|
38
|
-
// Attempt recovery (pass null for corrupted data)
|
|
39
|
-
const result = await this.fecService.recoverFileData(
|
|
40
|
-
null, // corrupted data
|
|
41
|
-
parityData,
|
|
42
|
-
originalSize,
|
|
43
|
-
);
|
|
44
|
-
|
|
45
|
-
if (result.recovered) {
|
|
46
|
-
console.log('File successfully recovered!');
|
|
47
|
-
return result.data;
|
|
48
|
-
} else {
|
|
49
|
-
throw new Error('File recovery failed');
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Example: Verify file integrity using parity data
|
|
55
|
-
*/
|
|
56
|
-
async verifyFile(
|
|
57
|
-
fileData: Buffer,
|
|
58
|
-
parityData: Array<{ data: Buffer; index: number }>,
|
|
59
|
-
): Promise<boolean> {
|
|
60
|
-
return await this.fecService.verifyFileIntegrity(fileData, parityData);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Complete example workflow
|
|
65
|
-
*/
|
|
66
|
-
async demonstrateWorkflow() {
|
|
67
|
-
// Original file data
|
|
68
|
-
const originalFile = Buffer.from(
|
|
69
|
-
'This is important file data that needs protection!',
|
|
70
|
-
);
|
|
71
|
-
|
|
72
|
-
// Step 1: Create parity data
|
|
73
|
-
console.log('Creating parity data...');
|
|
74
|
-
const { parityData, originalSize } = await this.createFileWithParity(
|
|
75
|
-
originalFile,
|
|
76
|
-
2,
|
|
77
|
-
);
|
|
78
|
-
|
|
79
|
-
// Step 2: Verify integrity
|
|
80
|
-
console.log('Verifying file integrity...');
|
|
81
|
-
const isValid = await this.verifyFile(originalFile, parityData);
|
|
82
|
-
console.log('File integrity check:', isValid ? 'PASSED' : 'FAILED');
|
|
83
|
-
|
|
84
|
-
// Step 3: Simulate file corruption and recovery
|
|
85
|
-
console.log('Simulating file corruption and recovery...');
|
|
86
|
-
const recoveredFile = await this.recoverCorruptedFile(
|
|
87
|
-
parityData,
|
|
88
|
-
originalSize,
|
|
89
|
-
);
|
|
90
|
-
|
|
91
|
-
// Step 4: Verify recovery
|
|
92
|
-
const recoverySuccessful = originalFile.equals(recoveredFile);
|
|
93
|
-
console.log('Recovery successful:', recoverySuccessful ? 'YES' : 'NO');
|
|
94
|
-
|
|
95
|
-
return {
|
|
96
|
-
originalFile,
|
|
97
|
-
recoveredFile,
|
|
98
|
-
parityData,
|
|
99
|
-
recoverySuccessful,
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
}
|
package/src/services/fec.ts
DELETED
|
@@ -1,296 +0,0 @@
|
|
|
1
|
-
import { FecError, FecErrorType } from '@digitaldefiance/suite-core-lib';
|
|
2
|
-
import { ReedSolomonErasure } from '@subspace/reed-solomon-erasure.wasm';
|
|
3
|
-
import { FEC } from '../constants';
|
|
4
|
-
import { IFECConsts } from '../interfaces';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* FecService provides Forward Error Correction (FEC) functionality for filesystem/S3 objects.
|
|
8
|
-
* This service is used to:
|
|
9
|
-
* 1. Create parity data for file recovery
|
|
10
|
-
* 2. Recover corrupted files using parity data
|
|
11
|
-
* 3. Ensure data integrity across distributed storage
|
|
12
|
-
*
|
|
13
|
-
* This implementation uses Reed-Solomon erasure coding to:
|
|
14
|
-
* 1. Split file data into shards
|
|
15
|
-
* 2. Create parity shards
|
|
16
|
-
* 3. Recover lost shards using parity
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
export interface ParityData {
|
|
20
|
-
data: Buffer;
|
|
21
|
-
index: number;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export interface RecoveryResult {
|
|
25
|
-
data: Buffer;
|
|
26
|
-
recovered: boolean;
|
|
27
|
-
}
|
|
28
|
-
export class FecService {
|
|
29
|
-
/**
|
|
30
|
-
* Given a data buffer, encode it using Reed-Solomon erasure coding.
|
|
31
|
-
* This will produce a buffer of size (shardSize * (dataShards + parityShards)) or (shardSize * parityShards) if fecOnly is true.
|
|
32
|
-
*/
|
|
33
|
-
public async encode(
|
|
34
|
-
data: Buffer,
|
|
35
|
-
shardSize: number,
|
|
36
|
-
dataShards: number,
|
|
37
|
-
parityShards: number,
|
|
38
|
-
fecOnly: boolean,
|
|
39
|
-
fecConstants: IFECConsts = FEC,
|
|
40
|
-
): Promise<Buffer> {
|
|
41
|
-
// Validate parameters
|
|
42
|
-
if (!data || data.length === 0) {
|
|
43
|
-
throw new FecError(FecErrorType.DataRequired);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
if (data.length !== shardSize * dataShards) {
|
|
47
|
-
throw new FecError(FecErrorType.InvalidDataLength, undefined, {
|
|
48
|
-
LENGTH: data.length.toString(),
|
|
49
|
-
EXPECTED: (shardSize * dataShards).toString(),
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
if (shardSize > FEC.MAX_SHARD_SIZE) {
|
|
54
|
-
throw new FecError(FecErrorType.ShardSizeExceedsMaximum, undefined, {
|
|
55
|
-
SIZE: shardSize.toString(),
|
|
56
|
-
MAXIMUM: FEC.MAX_SHARD_SIZE.toString(),
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
if (dataShards <= 0 || parityShards <= 0) {
|
|
61
|
-
throw new FecError(FecErrorType.InvalidShardCounts);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
try {
|
|
65
|
-
const shards = new Uint8Array(shardSize * (dataShards + parityShards));
|
|
66
|
-
shards.set(data);
|
|
67
|
-
|
|
68
|
-
// Encoding
|
|
69
|
-
const reedSolomonErasure =
|
|
70
|
-
await ReedSolomonErasure.fromCurrentDirectory();
|
|
71
|
-
reedSolomonErasure.encode(shards, dataShards, parityShards);
|
|
72
|
-
|
|
73
|
-
return fecOnly
|
|
74
|
-
? Buffer.from(shards.subarray(shardSize * dataShards))
|
|
75
|
-
: Buffer.from(shards);
|
|
76
|
-
} catch (error) {
|
|
77
|
-
throw new FecError(FecErrorType.FecEncodingFailed, undefined, {
|
|
78
|
-
ERROR: error instanceof Error ? error.message : 'Unknown error',
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Given a data buffer, reconstruct/repair it using Reed-Solomon erasure coding.
|
|
85
|
-
* This will produce a buffer of size (shardSize * dataShards).
|
|
86
|
-
*/
|
|
87
|
-
public async decode(
|
|
88
|
-
data: Buffer,
|
|
89
|
-
shardSize: number,
|
|
90
|
-
dataShards: number,
|
|
91
|
-
parityShards: number,
|
|
92
|
-
shardsAvailable: boolean[],
|
|
93
|
-
): Promise<Buffer> {
|
|
94
|
-
// Validate parameters
|
|
95
|
-
if (!data || data.length === 0) {
|
|
96
|
-
throw new FecError(FecErrorType.DataRequired);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
if (data.length !== shardSize * (dataShards + parityShards)) {
|
|
100
|
-
throw new FecError(FecErrorType.InvalidDataLength, undefined, {
|
|
101
|
-
LENGTH: data.length.toString(),
|
|
102
|
-
EXPECTED: (shardSize * (dataShards + parityShards)).toString(),
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
if (
|
|
107
|
-
!shardsAvailable ||
|
|
108
|
-
shardsAvailable.length !== dataShards + parityShards
|
|
109
|
-
) {
|
|
110
|
-
throw new FecError(FecErrorType.InvalidShardsAvailableArray);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
const availableCount = shardsAvailable.filter((x) => x).length;
|
|
114
|
-
if (availableCount < dataShards) {
|
|
115
|
-
throw new FecError(FecErrorType.NotEnoughShardsAvailable, undefined, {
|
|
116
|
-
AVAILABLE: availableCount.toString(),
|
|
117
|
-
REQUIRED: dataShards.toString(),
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
try {
|
|
122
|
-
const reedSolomonErasure =
|
|
123
|
-
await ReedSolomonErasure.fromCurrentDirectory();
|
|
124
|
-
reedSolomonErasure.reconstruct(
|
|
125
|
-
data,
|
|
126
|
-
dataShards,
|
|
127
|
-
parityShards,
|
|
128
|
-
shardsAvailable,
|
|
129
|
-
);
|
|
130
|
-
return data.subarray(0, shardSize * dataShards);
|
|
131
|
-
} catch (error) {
|
|
132
|
-
throw new FecError(FecErrorType.FecDecodingFailed, undefined, {
|
|
133
|
-
ERROR: error instanceof Error ? error.message : 'Unknown error',
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* Create parity data for a file buffer.
|
|
140
|
-
*/
|
|
141
|
-
public async createParityData(
|
|
142
|
-
fileData: Buffer,
|
|
143
|
-
parityCount: number,
|
|
144
|
-
): Promise<ParityData[]> {
|
|
145
|
-
if (!fileData || fileData.length === 0) {
|
|
146
|
-
throw new FecError(FecErrorType.DataRequired);
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
if (parityCount <= 0) {
|
|
150
|
-
throw new FecError(FecErrorType.ParityDataCountMustBePositive);
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
const shardSize = Math.min(fileData.length, FEC.MAX_SHARD_SIZE);
|
|
154
|
-
const requiredShards = Math.ceil(fileData.length / shardSize);
|
|
155
|
-
|
|
156
|
-
try {
|
|
157
|
-
const resultParityData: Buffer[] = Array(parityCount)
|
|
158
|
-
.fill(null)
|
|
159
|
-
.map(() => Buffer.alloc(0));
|
|
160
|
-
|
|
161
|
-
// Process each chunk
|
|
162
|
-
for (let i = 0; i < requiredShards; i++) {
|
|
163
|
-
const start = i * shardSize;
|
|
164
|
-
const end = Math.min(start + shardSize, fileData.length);
|
|
165
|
-
const chunk = fileData.subarray(start, end);
|
|
166
|
-
|
|
167
|
-
// Pad chunk if necessary
|
|
168
|
-
const paddedChunk =
|
|
169
|
-
chunk.length < shardSize
|
|
170
|
-
? Buffer.concat([chunk, Buffer.alloc(shardSize - chunk.length)])
|
|
171
|
-
: chunk;
|
|
172
|
-
|
|
173
|
-
const chunkParity = await this.encode(
|
|
174
|
-
paddedChunk,
|
|
175
|
-
shardSize,
|
|
176
|
-
1,
|
|
177
|
-
parityCount,
|
|
178
|
-
true,
|
|
179
|
-
);
|
|
180
|
-
|
|
181
|
-
// Distribute parity data
|
|
182
|
-
for (let j = 0; j < parityCount; j++) {
|
|
183
|
-
const parityChunk = chunkParity.subarray(
|
|
184
|
-
j * shardSize,
|
|
185
|
-
(j + 1) * shardSize,
|
|
186
|
-
);
|
|
187
|
-
resultParityData[j] = Buffer.concat([
|
|
188
|
-
resultParityData[j],
|
|
189
|
-
parityChunk,
|
|
190
|
-
]);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
return resultParityData.map((data, index) => ({
|
|
195
|
-
data,
|
|
196
|
-
index,
|
|
197
|
-
}));
|
|
198
|
-
} catch (error) {
|
|
199
|
-
throw new FecError(FecErrorType.FecEncodingFailed, undefined, {
|
|
200
|
-
ERROR: error instanceof Error ? error.message : 'Unknown error',
|
|
201
|
-
});
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
/**
|
|
206
|
-
* Recover file data using parity data. Pass null for corrupted data.
|
|
207
|
-
*/
|
|
208
|
-
public async recoverFileData(
|
|
209
|
-
corruptedData: Buffer | null,
|
|
210
|
-
parityData: ParityData[],
|
|
211
|
-
originalSize: number,
|
|
212
|
-
): Promise<RecoveryResult> {
|
|
213
|
-
if (!parityData || parityData.length === 0) {
|
|
214
|
-
throw new FecError(FecErrorType.ParityDataRequired);
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
if (originalSize <= 0) {
|
|
218
|
-
throw new FecError(FecErrorType.InvalidDataLength);
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
try {
|
|
222
|
-
const shardSize = Math.min(originalSize, FEC.MAX_SHARD_SIZE);
|
|
223
|
-
const requiredShards = Math.ceil(originalSize / shardSize);
|
|
224
|
-
|
|
225
|
-
// Set up shard availability array (data shard unavailable, parity shards available)
|
|
226
|
-
const availableShards = [false, ...Array(parityData.length).fill(true)];
|
|
227
|
-
|
|
228
|
-
let recoveredData = Buffer.alloc(0);
|
|
229
|
-
|
|
230
|
-
// Recover each shard
|
|
231
|
-
for (let i = 0; i < requiredShards; i++) {
|
|
232
|
-
const start = i * shardSize;
|
|
233
|
-
const end = Math.min(start + shardSize, originalSize);
|
|
234
|
-
const chunkSize = end - start;
|
|
235
|
-
|
|
236
|
-
// Create placeholder for corrupted data shard
|
|
237
|
-
const corruptedShard = Buffer.alloc(shardSize);
|
|
238
|
-
|
|
239
|
-
// Combine corrupted and parity data for this shard
|
|
240
|
-
const shardData = Buffer.concat([
|
|
241
|
-
corruptedShard,
|
|
242
|
-
...parityData.map((parity) =>
|
|
243
|
-
parity.data.subarray(i * shardSize, (i + 1) * shardSize),
|
|
244
|
-
),
|
|
245
|
-
]);
|
|
246
|
-
|
|
247
|
-
// Recover this shard
|
|
248
|
-
const recoveredShard = await this.decode(
|
|
249
|
-
shardData,
|
|
250
|
-
shardSize,
|
|
251
|
-
1,
|
|
252
|
-
parityData.length,
|
|
253
|
-
availableShards,
|
|
254
|
-
);
|
|
255
|
-
|
|
256
|
-
// Only take the actual data length for the last shard
|
|
257
|
-
const actualShard =
|
|
258
|
-
i === requiredShards - 1
|
|
259
|
-
? recoveredShard.subarray(0, chunkSize)
|
|
260
|
-
: recoveredShard;
|
|
261
|
-
|
|
262
|
-
recoveredData = Buffer.concat([recoveredData, actualShard]);
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
return {
|
|
266
|
-
data: recoveredData,
|
|
267
|
-
recovered: true,
|
|
268
|
-
};
|
|
269
|
-
} catch (error) {
|
|
270
|
-
throw new FecError(FecErrorType.FecDecodingFailed, undefined, {
|
|
271
|
-
ERROR: error instanceof Error ? error.message : 'Unknown error',
|
|
272
|
-
});
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
/**
|
|
277
|
-
* Verify file integrity using parity data.
|
|
278
|
-
*/
|
|
279
|
-
public async verifyFileIntegrity(
|
|
280
|
-
fileData: Buffer,
|
|
281
|
-
parityData: ParityData[],
|
|
282
|
-
): Promise<boolean> {
|
|
283
|
-
try {
|
|
284
|
-
const regeneratedParity = await this.createParityData(
|
|
285
|
-
fileData,
|
|
286
|
-
parityData.length,
|
|
287
|
-
);
|
|
288
|
-
|
|
289
|
-
return parityData.every((original, index) =>
|
|
290
|
-
original.data.equals(regeneratedParity[index].data),
|
|
291
|
-
);
|
|
292
|
-
} catch {
|
|
293
|
-
return false;
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
}
|
package/src/services/jwt.ts
DELETED
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ITokenRole,
|
|
3
|
-
ITokenRoleDTO,
|
|
4
|
-
ITokenUser,
|
|
5
|
-
} from '@digitaldefiance/suite-core-lib';
|
|
6
|
-
import {
|
|
7
|
-
JsonWebTokenError,
|
|
8
|
-
JwtPayload,
|
|
9
|
-
TokenExpiredError as JwtTokenExpiredError,
|
|
10
|
-
sign,
|
|
11
|
-
verify,
|
|
12
|
-
VerifyOptions,
|
|
13
|
-
} from 'jsonwebtoken';
|
|
14
|
-
import { Types } from 'mongoose';
|
|
15
|
-
import { promisify } from 'util';
|
|
16
|
-
import { Constants as AppConstants } from '../constants';
|
|
17
|
-
import { IUserDocument } from '../documents/user';
|
|
18
|
-
import { InvalidJwtTokenError } from '../errors/invalid-jwt-token';
|
|
19
|
-
import { TokenExpiredError } from '../errors/token-expired';
|
|
20
|
-
import { IApplication } from '../interfaces/application';
|
|
21
|
-
import { IJwtSignResponse } from '../interfaces/jwt-sign-response';
|
|
22
|
-
import { BaseService } from './base';
|
|
23
|
-
import { RoleService } from './role';
|
|
24
|
-
import { IConstants } from '../interfaces';
|
|
25
|
-
import { Environment } from '../environment';
|
|
26
|
-
import { IBaseDocument } from '../documents';
|
|
27
|
-
|
|
28
|
-
const verifyAsync = promisify<
|
|
29
|
-
string,
|
|
30
|
-
string | Buffer,
|
|
31
|
-
VerifyOptions,
|
|
32
|
-
JwtPayload | string
|
|
33
|
-
>(verify);
|
|
34
|
-
|
|
35
|
-
export class JwtService<
|
|
36
|
-
I = Types.ObjectId,
|
|
37
|
-
D extends Date = Date,
|
|
38
|
-
TTokenRole extends ITokenRole<I, D> = ITokenRole<I, D>,
|
|
39
|
-
TTokenUser extends ITokenUser = ITokenUser,
|
|
40
|
-
TApplication extends IApplication<any, Types.ObjectId, IBaseDocument<any, Types.ObjectId>, Environment, IConstants> = IApplication<any, Types.ObjectId, IBaseDocument<any, Types.ObjectId>, Environment, IConstants>,
|
|
41
|
-
> extends BaseService {
|
|
42
|
-
private readonly roleService: RoleService<I, D, TTokenRole>;
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Constructor for the JWT service
|
|
46
|
-
* @param application The application object
|
|
47
|
-
*/
|
|
48
|
-
constructor(application: TApplication) {
|
|
49
|
-
super(application);
|
|
50
|
-
this.roleService = new RoleService<I, D, TTokenRole>(application);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Sign a JWT token for a user
|
|
55
|
-
* @param userDoc The user document to sign the token for
|
|
56
|
-
* @param jwtSecret The secret to sign the token with
|
|
57
|
-
* @param overrideLanguage Optional language to use for role translations
|
|
58
|
-
* @returns The signed token
|
|
59
|
-
*/
|
|
60
|
-
public async signToken(
|
|
61
|
-
userDoc: IUserDocument,
|
|
62
|
-
jwtSecret: string,
|
|
63
|
-
overrideLanguage?: string,
|
|
64
|
-
): Promise<IJwtSignResponse<I, D, TTokenRole>> {
|
|
65
|
-
// look for roles the user is a member of (the role contains the user id in the user's roles array)
|
|
66
|
-
const roles = await this.roleService.getUserRoles(userDoc._id);
|
|
67
|
-
const tokenRoles: Array<TTokenRole> = this.roleService.rolesToTokenRoles(
|
|
68
|
-
roles,
|
|
69
|
-
overrideLanguage,
|
|
70
|
-
);
|
|
71
|
-
const tokenRoleDTOs = tokenRoles.map((role) =>
|
|
72
|
-
RoleService.roleToRoleDTO<I, D>(role),
|
|
73
|
-
);
|
|
74
|
-
const roleTranslatedNames = tokenRoles.map((role) => role.translatedName);
|
|
75
|
-
const roleNames = tokenRoles.map((role) => role.name);
|
|
76
|
-
const tokenUser = {
|
|
77
|
-
userId: userDoc._id.toString(),
|
|
78
|
-
roles: tokenRoleDTOs,
|
|
79
|
-
} as TTokenUser;
|
|
80
|
-
// amazonq-ignore-next-line false positive
|
|
81
|
-
const token = sign(tokenUser, jwtSecret, {
|
|
82
|
-
algorithm: AppConstants.JWT.ALGORITHM,
|
|
83
|
-
allowInsecureKeySizes: false,
|
|
84
|
-
expiresIn: AppConstants.JWT.EXPIRATION_SEC,
|
|
85
|
-
});
|
|
86
|
-
return {
|
|
87
|
-
token,
|
|
88
|
-
tokenUser,
|
|
89
|
-
roleNames,
|
|
90
|
-
roleTranslatedNames,
|
|
91
|
-
roles: tokenRoles,
|
|
92
|
-
roleDTOs: tokenRoleDTOs,
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* Verify a JWT token and return the user data
|
|
98
|
-
* @param token The token to verify
|
|
99
|
-
* @returns The user data
|
|
100
|
-
* @throws InvalidTokenError
|
|
101
|
-
*/
|
|
102
|
-
public async verifyToken(token: string): Promise<TTokenUser | null> {
|
|
103
|
-
try {
|
|
104
|
-
const decoded = (await verifyAsync(
|
|
105
|
-
token,
|
|
106
|
-
this.application.environment.jwtSecret,
|
|
107
|
-
{
|
|
108
|
-
algorithms: [AppConstants.JWT.ALGORITHM],
|
|
109
|
-
},
|
|
110
|
-
)) as JwtPayload;
|
|
111
|
-
|
|
112
|
-
if (
|
|
113
|
-
typeof decoded === 'object' &&
|
|
114
|
-
decoded !== null &&
|
|
115
|
-
'userId' in decoded &&
|
|
116
|
-
'roles' in decoded
|
|
117
|
-
) {
|
|
118
|
-
return {
|
|
119
|
-
userId: decoded['userId'] as string,
|
|
120
|
-
roles: decoded['roles'] as ITokenRoleDTO[],
|
|
121
|
-
} as TTokenUser;
|
|
122
|
-
} else {
|
|
123
|
-
return null;
|
|
124
|
-
}
|
|
125
|
-
} catch (err) {
|
|
126
|
-
if (err instanceof JwtTokenExpiredError) {
|
|
127
|
-
throw new TokenExpiredError();
|
|
128
|
-
} else if (err instanceof JsonWebTokenError) {
|
|
129
|
-
throw err;
|
|
130
|
-
}
|
|
131
|
-
throw new InvalidJwtTokenError();
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
}
|