@brightchain/brightchain-api-lib 0.0.1
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/brightchain-api-lib/README.md +101 -0
- package/package.json +53 -0
- package/src/index.d.ts +88 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.js +101 -0
- package/src/index.js.map +1 -0
- package/src/lib/__tests__/fixtures/mock-backend-brightchain-member.d.ts +71 -0
- package/src/lib/__tests__/fixtures/mock-backend-brightchain-member.d.ts.map +1 -0
- package/src/lib/__tests__/fixtures/mock-backend-brightchain-member.js +119 -0
- package/src/lib/__tests__/fixtures/mock-backend-brightchain-member.js.map +1 -0
- package/src/lib/__tests__/fixtures/mocked-model.d.ts +90 -0
- package/src/lib/__tests__/fixtures/mocked-model.d.ts.map +1 -0
- package/src/lib/__tests__/fixtures/mocked-model.js +101 -0
- package/src/lib/__tests__/fixtures/mocked-model.js.map +1 -0
- package/src/lib/__tests__/helpers/application.mock.d.ts +5 -0
- package/src/lib/__tests__/helpers/application.mock.d.ts.map +1 -0
- package/src/lib/__tests__/helpers/application.mock.js +52 -0
- package/src/lib/__tests__/helpers/application.mock.js.map +1 -0
- package/src/lib/__tests__/helpers/model-mocks.mock.d.ts +43 -0
- package/src/lib/__tests__/helpers/model-mocks.mock.d.ts.map +1 -0
- package/src/lib/__tests__/helpers/model-mocks.mock.js +67 -0
- package/src/lib/__tests__/helpers/model-mocks.mock.js.map +1 -0
- package/src/lib/appConstants.d.ts +87 -0
- package/src/lib/appConstants.d.ts.map +1 -0
- package/src/lib/appConstants.js +25 -0
- package/src/lib/appConstants.js.map +1 -0
- package/src/lib/application-base.d.ts +39 -0
- package/src/lib/application-base.d.ts.map +1 -0
- package/src/lib/application-base.js +84 -0
- package/src/lib/application-base.js.map +1 -0
- package/src/lib/application.d.ts +14 -0
- package/src/lib/application.d.ts.map +1 -0
- package/src/lib/application.js +105 -0
- package/src/lib/application.js.map +1 -0
- package/src/lib/availability/availabilityMetrics.d.ts +241 -0
- package/src/lib/availability/availabilityMetrics.d.ts.map +1 -0
- package/src/lib/availability/availabilityMetrics.js +425 -0
- package/src/lib/availability/availabilityMetrics.js.map +1 -0
- package/src/lib/availability/availabilityService.d.ts +250 -0
- package/src/lib/availability/availabilityService.d.ts.map +1 -0
- package/src/lib/availability/availabilityService.js +593 -0
- package/src/lib/availability/availabilityService.js.map +1 -0
- package/src/lib/availability/blockRegistry.d.ts +141 -0
- package/src/lib/availability/blockRegistry.d.ts.map +1 -0
- package/src/lib/availability/blockRegistry.js +257 -0
- package/src/lib/availability/blockRegistry.js.map +1 -0
- package/src/lib/availability/configValidation.d.ts +72 -0
- package/src/lib/availability/configValidation.d.ts.map +1 -0
- package/src/lib/availability/configValidation.js +261 -0
- package/src/lib/availability/configValidation.js.map +1 -0
- package/src/lib/availability/discoveryProtocol.d.ts +160 -0
- package/src/lib/availability/discoveryProtocol.d.ts.map +1 -0
- package/src/lib/availability/discoveryProtocol.js +304 -0
- package/src/lib/availability/discoveryProtocol.js.map +1 -0
- package/src/lib/availability/gossipService.d.ts +158 -0
- package/src/lib/availability/gossipService.d.ts.map +1 -0
- package/src/lib/availability/gossipService.js +271 -0
- package/src/lib/availability/gossipService.js.map +1 -0
- package/src/lib/availability/heartbeatMonitor.d.ts +204 -0
- package/src/lib/availability/heartbeatMonitor.d.ts.map +1 -0
- package/src/lib/availability/heartbeatMonitor.js +375 -0
- package/src/lib/availability/heartbeatMonitor.js.map +1 -0
- package/src/lib/availability/index.d.ts +15 -0
- package/src/lib/availability/index.d.ts.map +1 -0
- package/src/lib/availability/index.js +18 -0
- package/src/lib/availability/index.js.map +1 -0
- package/src/lib/availability/reconciliationService.d.ts +237 -0
- package/src/lib/availability/reconciliationService.d.ts.map +1 -0
- package/src/lib/availability/reconciliationService.js +513 -0
- package/src/lib/availability/reconciliationService.js.map +1 -0
- package/src/lib/blocks/handle.d.ts +45 -0
- package/src/lib/blocks/handle.d.ts.map +1 -0
- package/src/lib/blocks/handle.js +221 -0
- package/src/lib/blocks/handle.js.map +1 -0
- package/src/lib/constants.d.ts +50 -0
- package/src/lib/constants.d.ts.map +1 -0
- package/src/lib/constants.js +58 -0
- package/src/lib/constants.js.map +1 -0
- package/src/lib/controllers/base.d.ts +50 -0
- package/src/lib/controllers/base.d.ts.map +1 -0
- package/src/lib/controllers/base.js +235 -0
- package/src/lib/controllers/base.js.map +1 -0
- package/src/lib/controllers/user.d.ts +9 -0
- package/src/lib/controllers/user.d.ts.map +1 -0
- package/src/lib/controllers/user.js +21 -0
- package/src/lib/controllers/user.js.map +1 -0
- package/src/lib/datastore/block-document-store-factory.d.ts +19 -0
- package/src/lib/datastore/block-document-store-factory.d.ts.map +1 -0
- package/src/lib/datastore/block-document-store-factory.js +29 -0
- package/src/lib/datastore/block-document-store-factory.js.map +1 -0
- package/src/lib/datastore/block-document-store.d.ts +185 -0
- package/src/lib/datastore/block-document-store.d.ts.map +1 -0
- package/src/lib/datastore/block-document-store.js +590 -0
- package/src/lib/datastore/block-document-store.js.map +1 -0
- package/src/lib/datastore/document-model-adapter.d.ts +48 -0
- package/src/lib/datastore/document-model-adapter.d.ts.map +1 -0
- package/src/lib/datastore/document-model-adapter.js +178 -0
- package/src/lib/datastore/document-model-adapter.js.map +1 -0
- package/src/lib/datastore/document-store.d.ts +64 -0
- package/src/lib/datastore/document-store.d.ts.map +1 -0
- package/src/lib/datastore/document-store.js +3 -0
- package/src/lib/datastore/document-store.js.map +1 -0
- package/src/lib/datastore/memory-document-store.d.ts +6 -0
- package/src/lib/datastore/memory-document-store.d.ts.map +1 -0
- package/src/lib/datastore/memory-document-store.js +196 -0
- package/src/lib/datastore/memory-document-store.js.map +1 -0
- package/src/lib/documents/base.d.ts +5 -0
- package/src/lib/documents/base.d.ts.map +1 -0
- package/src/lib/documents/base.js +3 -0
- package/src/lib/documents/base.js.map +1 -0
- package/src/lib/documents/email-token.d.ts +8 -0
- package/src/lib/documents/email-token.d.ts.map +1 -0
- package/src/lib/documents/email-token.js +3 -0
- package/src/lib/documents/email-token.js.map +1 -0
- package/src/lib/documents/index.d.ts +7 -0
- package/src/lib/documents/index.d.ts.map +1 -0
- package/src/lib/documents/index.js +3 -0
- package/src/lib/documents/index.js.map +1 -0
- package/src/lib/documents/mnemonic.d.ts +8 -0
- package/src/lib/documents/mnemonic.d.ts.map +1 -0
- package/src/lib/documents/mnemonic.js +3 -0
- package/src/lib/documents/mnemonic.js.map +1 -0
- package/src/lib/documents/role.d.ts +8 -0
- package/src/lib/documents/role.d.ts.map +1 -0
- package/src/lib/documents/role.js +3 -0
- package/src/lib/documents/role.js.map +1 -0
- package/src/lib/documents/used-direct-login-token.d.ts +5 -0
- package/src/lib/documents/used-direct-login-token.d.ts.map +1 -0
- package/src/lib/documents/used-direct-login-token.js +3 -0
- package/src/lib/documents/used-direct-login-token.js.map +1 -0
- package/src/lib/documents/user-role.d.ts +8 -0
- package/src/lib/documents/user-role.d.ts.map +1 -0
- package/src/lib/documents/user-role.js +3 -0
- package/src/lib/documents/user-role.js.map +1 -0
- package/src/lib/documents/user.d.ts +13 -0
- package/src/lib/documents/user.d.ts.map +1 -0
- package/src/lib/documents/user.js +3 -0
- package/src/lib/documents/user.js.map +1 -0
- package/src/lib/enumerations/model-name.d.ts +30 -0
- package/src/lib/enumerations/model-name.d.ts.map +1 -0
- package/src/lib/enumerations/model-name.js +34 -0
- package/src/lib/enumerations/model-name.js.map +1 -0
- package/src/lib/enumerations/schema-collection.d.ts +30 -0
- package/src/lib/enumerations/schema-collection.d.ts.map +1 -0
- package/src/lib/enumerations/schema-collection.js +34 -0
- package/src/lib/enumerations/schema-collection.js.map +1 -0
- package/src/lib/enumerations/symmetric-error-type.d.ts +5 -0
- package/src/lib/enumerations/symmetric-error-type.d.ts.map +1 -0
- package/src/lib/enumerations/symmetric-error-type.js +9 -0
- package/src/lib/enumerations/symmetric-error-type.js.map +1 -0
- package/src/lib/environment.d.ts +23 -0
- package/src/lib/environment.d.ts.map +1 -0
- package/src/lib/environment.js +75 -0
- package/src/lib/environment.js.map +1 -0
- package/src/lib/errors/admin-role-not-found.d.ts +6 -0
- package/src/lib/errors/admin-role-not-found.d.ts.map +1 -0
- package/src/lib/errors/admin-role-not-found.js +14 -0
- package/src/lib/errors/admin-role-not-found.js.map +1 -0
- package/src/lib/errors/email-already-verified.d.ts +5 -0
- package/src/lib/errors/email-already-verified.d.ts.map +1 -0
- package/src/lib/errors/email-already-verified.js +11 -0
- package/src/lib/errors/email-already-verified.js.map +1 -0
- package/src/lib/errors/email-token-failed-to-send.d.ts +7 -0
- package/src/lib/errors/email-token-failed-to-send.d.ts.map +1 -0
- package/src/lib/errors/email-token-failed-to-send.js +14 -0
- package/src/lib/errors/email-token-failed-to-send.js.map +1 -0
- package/src/lib/errors/express-validation.d.ts +7 -0
- package/src/lib/errors/express-validation.d.ts.map +1 -0
- package/src/lib/errors/express-validation.js +14 -0
- package/src/lib/errors/express-validation.js.map +1 -0
- package/src/lib/errors/invalid-backup-code-version.d.ts +5 -0
- package/src/lib/errors/invalid-backup-code-version.d.ts.map +1 -0
- package/src/lib/errors/invalid-backup-code-version.js +12 -0
- package/src/lib/errors/invalid-backup-code-version.js.map +1 -0
- package/src/lib/errors/invalid-challenge-response.d.ts +5 -0
- package/src/lib/errors/invalid-challenge-response.d.ts.map +1 -0
- package/src/lib/errors/invalid-challenge-response.js +14 -0
- package/src/lib/errors/invalid-challenge-response.js.map +1 -0
- package/src/lib/errors/invalid-expired-token.d.ts +5 -0
- package/src/lib/errors/invalid-expired-token.d.ts.map +1 -0
- package/src/lib/errors/invalid-expired-token.js +13 -0
- package/src/lib/errors/invalid-expired-token.js.map +1 -0
- package/src/lib/errors/invalid-jwt-token.d.ts +5 -0
- package/src/lib/errors/invalid-jwt-token.d.ts.map +1 -0
- package/src/lib/errors/invalid-jwt-token.js +12 -0
- package/src/lib/errors/invalid-jwt-token.js.map +1 -0
- package/src/lib/errors/last-admin-error.d.ts +7 -0
- package/src/lib/errors/last-admin-error.d.ts.map +1 -0
- package/src/lib/errors/last-admin-error.js +16 -0
- package/src/lib/errors/last-admin-error.js.map +1 -0
- package/src/lib/errors/login-challenge-expired.d.ts +5 -0
- package/src/lib/errors/login-challenge-expired.d.ts.map +1 -0
- package/src/lib/errors/login-challenge-expired.js +14 -0
- package/src/lib/errors/login-challenge-expired.js.map +1 -0
- package/src/lib/errors/member-role-not-found.d.ts +7 -0
- package/src/lib/errors/member-role-not-found.d.ts.map +1 -0
- package/src/lib/errors/member-role-not-found.js +14 -0
- package/src/lib/errors/member-role-not-found.js.map +1 -0
- package/src/lib/errors/missing-validated-data.d.ts +8 -0
- package/src/lib/errors/missing-validated-data.d.ts.map +1 -0
- package/src/lib/errors/missing-validated-data.js +32 -0
- package/src/lib/errors/missing-validated-data.js.map +1 -0
- package/src/lib/errors/mnemonic-or-password-required.d.ts +5 -0
- package/src/lib/errors/mnemonic-or-password-required.d.ts.map +1 -0
- package/src/lib/errors/mnemonic-or-password-required.js +14 -0
- package/src/lib/errors/mnemonic-or-password-required.js.map +1 -0
- package/src/lib/errors/restricted.d.ts +5 -0
- package/src/lib/errors/restricted.d.ts.map +1 -0
- package/src/lib/errors/restricted.js +15 -0
- package/src/lib/errors/restricted.js.map +1 -0
- package/src/lib/errors/symmetric.d.ts +9 -0
- package/src/lib/errors/symmetric.d.ts.map +1 -0
- package/src/lib/errors/symmetric.js +24 -0
- package/src/lib/errors/symmetric.js.map +1 -0
- package/src/lib/errors/token-expired.d.ts +5 -0
- package/src/lib/errors/token-expired.d.ts.map +1 -0
- package/src/lib/errors/token-expired.js +12 -0
- package/src/lib/errors/token-expired.js.map +1 -0
- package/src/lib/errors/token-not-found.d.ts +8 -0
- package/src/lib/errors/token-not-found.d.ts.map +1 -0
- package/src/lib/errors/token-not-found.js +19 -0
- package/src/lib/errors/token-not-found.js.map +1 -0
- package/src/lib/errors/translatable-error-local.d.ts +7 -0
- package/src/lib/errors/translatable-error-local.d.ts.map +1 -0
- package/src/lib/errors/translatable-error-local.js +17 -0
- package/src/lib/errors/translatable-error-local.js.map +1 -0
- package/src/lib/errors/typed-error-local.d.ts +10 -0
- package/src/lib/errors/typed-error-local.d.ts.map +1 -0
- package/src/lib/errors/typed-error-local.js +24 -0
- package/src/lib/errors/typed-error-local.js.map +1 -0
- package/src/lib/factories/blockStoreFactory.d.ts +14 -0
- package/src/lib/factories/blockStoreFactory.d.ts.map +1 -0
- package/src/lib/factories/blockStoreFactory.js +18 -0
- package/src/lib/factories/blockStoreFactory.js.map +1 -0
- package/src/lib/interfaces/api-constants.d.ts +51 -0
- package/src/lib/interfaces/api-constants.d.ts.map +1 -0
- package/src/lib/interfaces/api-constants.js +13 -0
- package/src/lib/interfaces/api-constants.js.map +1 -0
- package/src/lib/interfaces/api-express-validation-error-response.d.ts +7 -0
- package/src/lib/interfaces/api-express-validation-error-response.d.ts.map +1 -0
- package/src/lib/interfaces/api-express-validation-error-response.js +3 -0
- package/src/lib/interfaces/api-express-validation-error-response.js.map +1 -0
- package/src/lib/interfaces/api-mongo-validation-error-response.d.ts +6 -0
- package/src/lib/interfaces/api-mongo-validation-error-response.d.ts.map +1 -0
- package/src/lib/interfaces/api-mongo-validation-error-response.js +3 -0
- package/src/lib/interfaces/api-mongo-validation-error-response.js.map +1 -0
- package/src/lib/interfaces/application.d.ts +10 -0
- package/src/lib/interfaces/application.d.ts.map +1 -0
- package/src/lib/interfaces/application.js +3 -0
- package/src/lib/interfaces/application.js.map +1 -0
- package/src/lib/interfaces/authenticated-cipher.d.ts +10 -0
- package/src/lib/interfaces/authenticated-cipher.d.ts.map +1 -0
- package/src/lib/interfaces/authenticated-cipher.js +3 -0
- package/src/lib/interfaces/authenticated-cipher.js.map +1 -0
- package/src/lib/interfaces/authenticated-decipher.d.ts +9 -0
- package/src/lib/interfaces/authenticated-decipher.d.ts.map +1 -0
- package/src/lib/interfaces/authenticated-decipher.js +3 -0
- package/src/lib/interfaces/authenticated-decipher.js.map +1 -0
- package/src/lib/interfaces/backend-objects/email-token.d.ts +4 -0
- package/src/lib/interfaces/backend-objects/email-token.d.ts.map +1 -0
- package/src/lib/interfaces/backend-objects/email-token.js +3 -0
- package/src/lib/interfaces/backend-objects/email-token.js.map +1 -0
- package/src/lib/interfaces/backend-objects/request-user.d.ts +5 -0
- package/src/lib/interfaces/backend-objects/request-user.d.ts.map +1 -0
- package/src/lib/interfaces/backend-objects/request-user.js +3 -0
- package/src/lib/interfaces/backend-objects/request-user.js.map +1 -0
- package/src/lib/interfaces/backend-objects/role.d.ts +4 -0
- package/src/lib/interfaces/backend-objects/role.d.ts.map +1 -0
- package/src/lib/interfaces/backend-objects/role.js +3 -0
- package/src/lib/interfaces/backend-objects/role.js.map +1 -0
- package/src/lib/interfaces/backend-objects/user.d.ts +5 -0
- package/src/lib/interfaces/backend-objects/user.d.ts.map +1 -0
- package/src/lib/interfaces/backend-objects/user.js +3 -0
- package/src/lib/interfaces/backend-objects/user.js.map +1 -0
- package/src/lib/interfaces/bases/mnemonic.d.ts +4 -0
- package/src/lib/interfaces/bases/mnemonic.d.ts.map +1 -0
- package/src/lib/interfaces/bases/mnemonic.js +3 -0
- package/src/lib/interfaces/bases/mnemonic.js.map +1 -0
- package/src/lib/interfaces/bases/role.d.ts +4 -0
- package/src/lib/interfaces/bases/role.d.ts.map +1 -0
- package/src/lib/interfaces/bases/role.js +3 -0
- package/src/lib/interfaces/bases/role.js.map +1 -0
- package/src/lib/interfaces/bases/user-role.d.ts +4 -0
- package/src/lib/interfaces/bases/user-role.d.ts.map +1 -0
- package/src/lib/interfaces/bases/user-role.js +3 -0
- package/src/lib/interfaces/bases/user-role.js.map +1 -0
- package/src/lib/interfaces/bases/user.d.ts +5 -0
- package/src/lib/interfaces/bases/user.d.ts.map +1 -0
- package/src/lib/interfaces/bases/user.js +3 -0
- package/src/lib/interfaces/bases/user.js.map +1 -0
- package/src/lib/interfaces/checksum-config.d.ts +5 -0
- package/src/lib/interfaces/checksum-config.d.ts.map +1 -0
- package/src/lib/interfaces/checksum-config.js +3 -0
- package/src/lib/interfaces/checksum-config.js.map +1 -0
- package/src/lib/interfaces/discriminator-collections.d.ts +5 -0
- package/src/lib/interfaces/discriminator-collections.d.ts.map +1 -0
- package/src/lib/interfaces/discriminator-collections.js +3 -0
- package/src/lib/interfaces/discriminator-collections.js.map +1 -0
- package/src/lib/interfaces/ecies-consts.d.ts +88 -0
- package/src/lib/interfaces/ecies-consts.d.ts.map +1 -0
- package/src/lib/interfaces/ecies-consts.js +3 -0
- package/src/lib/interfaces/ecies-consts.js.map +1 -0
- package/src/lib/interfaces/environment-aws.d.ts +7 -0
- package/src/lib/interfaces/environment-aws.d.ts.map +1 -0
- package/src/lib/interfaces/environment-aws.js +3 -0
- package/src/lib/interfaces/environment-aws.js.map +1 -0
- package/src/lib/interfaces/environment-mongo.d.ts +76 -0
- package/src/lib/interfaces/environment-mongo.d.ts.map +1 -0
- package/src/lib/interfaces/environment-mongo.js +3 -0
- package/src/lib/interfaces/environment-mongo.js.map +1 -0
- package/src/lib/interfaces/environment.d.ts +28 -0
- package/src/lib/interfaces/environment.d.ts.map +1 -0
- package/src/lib/interfaces/environment.js +3 -0
- package/src/lib/interfaces/environment.js.map +1 -0
- package/src/lib/interfaces/jwt-sign-response.d.ts +12 -0
- package/src/lib/interfaces/jwt-sign-response.d.ts.map +1 -0
- package/src/lib/interfaces/jwt-sign-response.js +3 -0
- package/src/lib/interfaces/jwt-sign-response.js.map +1 -0
- package/src/lib/interfaces/member/member-with-mnemonic.d.ts +6 -0
- package/src/lib/interfaces/member/member-with-mnemonic.d.ts.map +1 -0
- package/src/lib/interfaces/member/member-with-mnemonic.js +3 -0
- package/src/lib/interfaces/member/member-with-mnemonic.js.map +1 -0
- package/src/lib/interfaces/member/operational.d.ts +36 -0
- package/src/lib/interfaces/member/operational.d.ts.map +1 -0
- package/src/lib/interfaces/member/operational.js +3 -0
- package/src/lib/interfaces/member/operational.js.map +1 -0
- package/src/lib/interfaces/mongo-errors.d.ts +9 -0
- package/src/lib/interfaces/mongo-errors.d.ts.map +1 -0
- package/src/lib/interfaces/mongo-errors.js +3 -0
- package/src/lib/interfaces/mongo-errors.js.map +1 -0
- package/src/lib/interfaces/multi-encrypted-message.d.ts +8 -0
- package/src/lib/interfaces/multi-encrypted-message.d.ts.map +1 -0
- package/src/lib/interfaces/multi-encrypted-message.js +3 -0
- package/src/lib/interfaces/multi-encrypted-message.js.map +1 -0
- package/src/lib/interfaces/multi-encrypted-parsed-header.d.ts +24 -0
- package/src/lib/interfaces/multi-encrypted-parsed-header.d.ts.map +1 -0
- package/src/lib/interfaces/multi-encrypted-parsed-header.js +3 -0
- package/src/lib/interfaces/multi-encrypted-parsed-header.js.map +1 -0
- package/src/lib/interfaces/pbkdf2-result.d.ts +6 -0
- package/src/lib/interfaces/pbkdf2-result.d.ts.map +1 -0
- package/src/lib/interfaces/pbkdf2-result.js +3 -0
- package/src/lib/interfaces/pbkdf2-result.js.map +1 -0
- package/src/lib/interfaces/request-user.d.ts +51 -0
- package/src/lib/interfaces/request-user.d.ts.map +1 -0
- package/src/lib/interfaces/request-user.js +3 -0
- package/src/lib/interfaces/request-user.js.map +1 -0
- package/src/lib/interfaces/responses/api-backup-codes-response.d.ts +11 -0
- package/src/lib/interfaces/responses/api-backup-codes-response.d.ts.map +1 -0
- package/src/lib/interfaces/responses/api-backup-codes-response.js +3 -0
- package/src/lib/interfaces/responses/api-backup-codes-response.js.map +1 -0
- package/src/lib/interfaces/responses/api-challenge-response.d.ts +11 -0
- package/src/lib/interfaces/responses/api-challenge-response.d.ts.map +1 -0
- package/src/lib/interfaces/responses/api-challenge-response.js +3 -0
- package/src/lib/interfaces/responses/api-challenge-response.js.map +1 -0
- package/src/lib/interfaces/responses/api-code-count-response.d.ts +11 -0
- package/src/lib/interfaces/responses/api-code-count-response.d.ts.map +1 -0
- package/src/lib/interfaces/responses/api-code-count-response.js +3 -0
- package/src/lib/interfaces/responses/api-code-count-response.js.map +1 -0
- package/src/lib/interfaces/responses/api-login-response.d.ts +20 -0
- package/src/lib/interfaces/responses/api-login-response.d.ts.map +1 -0
- package/src/lib/interfaces/responses/api-login-response.js +3 -0
- package/src/lib/interfaces/responses/api-login-response.js.map +1 -0
- package/src/lib/interfaces/responses/api-mnemonic-response.d.ts +11 -0
- package/src/lib/interfaces/responses/api-mnemonic-response.d.ts.map +1 -0
- package/src/lib/interfaces/responses/api-mnemonic-response.js +3 -0
- package/src/lib/interfaces/responses/api-mnemonic-response.js.map +1 -0
- package/src/lib/interfaces/responses/api-registration-response.d.ts +16 -0
- package/src/lib/interfaces/responses/api-registration-response.d.ts.map +1 -0
- package/src/lib/interfaces/responses/api-registration-response.js +3 -0
- package/src/lib/interfaces/responses/api-registration-response.js.map +1 -0
- package/src/lib/interfaces/responses/api-request-user-response.d.ts +12 -0
- package/src/lib/interfaces/responses/api-request-user-response.d.ts.map +1 -0
- package/src/lib/interfaces/responses/api-request-user-response.js +3 -0
- package/src/lib/interfaces/responses/api-request-user-response.js.map +1 -0
- package/src/lib/interfaces/responses/index.d.ts +9 -0
- package/src/lib/interfaces/responses/index.d.ts.map +1 -0
- package/src/lib/interfaces/responses/index.js +11 -0
- package/src/lib/interfaces/responses/index.js.map +1 -0
- package/src/lib/interfaces/schema.d.ts +28 -0
- package/src/lib/interfaces/schema.d.ts.map +1 -0
- package/src/lib/interfaces/schema.js +3 -0
- package/src/lib/interfaces/schema.js.map +1 -0
- package/src/lib/interfaces/server-init-result.d.ts +34 -0
- package/src/lib/interfaces/server-init-result.d.ts.map +1 -0
- package/src/lib/interfaces/server-init-result.js +3 -0
- package/src/lib/interfaces/server-init-result.js.map +1 -0
- package/src/lib/interfaces/single-encrypted-parsed-header.d.ts +35 -0
- package/src/lib/interfaces/single-encrypted-parsed-header.d.ts.map +1 -0
- package/src/lib/interfaces/single-encrypted-parsed-header.js +3 -0
- package/src/lib/interfaces/single-encrypted-parsed-header.js.map +1 -0
- package/src/lib/interfaces/status-code-response.d.ts +7 -0
- package/src/lib/interfaces/status-code-response.d.ts.map +1 -0
- package/src/lib/interfaces/status-code-response.js +3 -0
- package/src/lib/interfaces/status-code-response.js.map +1 -0
- package/src/lib/interfaces/symmetric-encryption-results.d.ts +5 -0
- package/src/lib/interfaces/symmetric-encryption-results.d.ts.map +1 -0
- package/src/lib/interfaces/symmetric-encryption-results.js +3 -0
- package/src/lib/interfaces/symmetric-encryption-results.js.map +1 -0
- package/src/lib/interfaces/token-user.d.ts +9 -0
- package/src/lib/interfaces/token-user.d.ts.map +1 -0
- package/src/lib/interfaces/token-user.js +3 -0
- package/src/lib/interfaces/token-user.js.map +1 -0
- package/src/lib/interfaces/wallet-seed.d.ts +7 -0
- package/src/lib/interfaces/wallet-seed.d.ts.map +1 -0
- package/src/lib/interfaces/wallet-seed.js +3 -0
- package/src/lib/interfaces/wallet-seed.js.map +1 -0
- package/src/lib/middlewares/cleanup-crypto.d.ts +7 -0
- package/src/lib/middlewares/cleanup-crypto.d.ts.map +1 -0
- package/src/lib/middlewares/cleanup-crypto.js +32 -0
- package/src/lib/middlewares/cleanup-crypto.js.map +1 -0
- package/src/lib/middlewares/index.d.ts +3 -0
- package/src/lib/middlewares/index.d.ts.map +1 -0
- package/src/lib/middlewares/index.js +10 -0
- package/src/lib/middlewares/index.js.map +1 -0
- package/src/lib/middlewares.d.ts +19 -0
- package/src/lib/middlewares.d.ts.map +1 -0
- package/src/lib/middlewares.js +95 -0
- package/src/lib/middlewares.js.map +1 -0
- package/src/lib/models/email-token.d.ts +47 -0
- package/src/lib/models/email-token.d.ts.map +1 -0
- package/src/lib/models/email-token.js +11 -0
- package/src/lib/models/email-token.js.map +1 -0
- package/src/lib/models/mnemonic.d.ts +26 -0
- package/src/lib/models/mnemonic.d.ts.map +1 -0
- package/src/lib/models/mnemonic.js +11 -0
- package/src/lib/models/mnemonic.js.map +1 -0
- package/src/lib/models/role.d.ts +23 -0
- package/src/lib/models/role.d.ts.map +1 -0
- package/src/lib/models/role.js +8 -0
- package/src/lib/models/role.js.map +1 -0
- package/src/lib/models/used-direct-login-token.d.ts +29 -0
- package/src/lib/models/used-direct-login-token.d.ts.map +1 -0
- package/src/lib/models/used-direct-login-token.js +11 -0
- package/src/lib/models/used-direct-login-token.js.map +1 -0
- package/src/lib/models/user-role.d.ts +59 -0
- package/src/lib/models/user-role.d.ts.map +1 -0
- package/src/lib/models/user-role.js +11 -0
- package/src/lib/models/user-role.js.map +1 -0
- package/src/lib/models/user.d.ts +132 -0
- package/src/lib/models/user.d.ts.map +1 -0
- package/src/lib/models/user.js +8 -0
- package/src/lib/models/user.js.map +1 -0
- package/src/lib/routers/api.d.ts +21 -0
- package/src/lib/routers/api.d.ts.map +1 -0
- package/src/lib/routers/api.js +41 -0
- package/src/lib/routers/api.js.map +1 -0
- package/src/lib/routers/app.d.ts +22 -0
- package/src/lib/routers/app.d.ts.map +1 -0
- package/src/lib/routers/app.js +131 -0
- package/src/lib/routers/app.js.map +1 -0
- package/src/lib/routers/base.d.ts +8 -0
- package/src/lib/routers/base.d.ts.map +1 -0
- package/src/lib/routers/base.js +12 -0
- package/src/lib/routers/base.js.map +1 -0
- package/src/lib/routers/messageRouter.d.ts +4 -0
- package/src/lib/routers/messageRouter.d.ts.map +1 -0
- package/src/lib/routers/messageRouter.js +81 -0
- package/src/lib/routers/messageRouter.js.map +1 -0
- package/src/lib/schemas/email-token.d.ts +44 -0
- package/src/lib/schemas/email-token.d.ts.map +1 -0
- package/src/lib/schemas/email-token.js +29 -0
- package/src/lib/schemas/email-token.js.map +1 -0
- package/src/lib/schemas/mnemonic.d.ts +22 -0
- package/src/lib/schemas/mnemonic.d.ts.map +1 -0
- package/src/lib/schemas/mnemonic.js +21 -0
- package/src/lib/schemas/mnemonic.js.map +1 -0
- package/src/lib/schemas/role.d.ts +21 -0
- package/src/lib/schemas/role.d.ts.map +1 -0
- package/src/lib/schemas/role.js +36 -0
- package/src/lib/schemas/role.js.map +1 -0
- package/src/lib/schemas/schema.d.ts +3 -0
- package/src/lib/schemas/schema.d.ts.map +1 -0
- package/src/lib/schemas/schema.js +74 -0
- package/src/lib/schemas/schema.js.map +1 -0
- package/src/lib/schemas/used-direct-login-token.d.ts +25 -0
- package/src/lib/schemas/used-direct-login-token.d.ts.map +1 -0
- package/src/lib/schemas/used-direct-login-token.js +14 -0
- package/src/lib/schemas/used-direct-login-token.js.map +1 -0
- package/src/lib/schemas/user-role.d.ts +55 -0
- package/src/lib/schemas/user-role.d.ts.map +1 -0
- package/src/lib/schemas/user-role.js +22 -0
- package/src/lib/schemas/user-role.js.map +1 -0
- package/src/lib/schemas/user.d.ts +129 -0
- package/src/lib/schemas/user.d.ts.map +1 -0
- package/src/lib/schemas/user.js +84 -0
- package/src/lib/schemas/user.js.map +1 -0
- package/src/lib/services/diskQuorumService.d.ts +55 -0
- package/src/lib/services/diskQuorumService.d.ts.map +1 -0
- package/src/lib/services/diskQuorumService.js +247 -0
- package/src/lib/services/diskQuorumService.js.map +1 -0
- package/src/lib/services/email.d.ts +27 -0
- package/src/lib/services/email.d.ts.map +1 -0
- package/src/lib/services/email.js +81 -0
- package/src/lib/services/email.js.map +1 -0
- package/src/lib/services/eventNotificationSystem.d.ts +46 -0
- package/src/lib/services/eventNotificationSystem.d.ts.map +1 -0
- package/src/lib/services/eventNotificationSystem.js +83 -0
- package/src/lib/services/eventNotificationSystem.js.map +1 -0
- package/src/lib/services/fec.d.ts +87 -0
- package/src/lib/services/fec.d.ts.map +1 -0
- package/src/lib/services/fec.js +256 -0
- package/src/lib/services/fec.js.map +1 -0
- package/src/lib/services/fecServiceFactory.d.ts +89 -0
- package/src/lib/services/fecServiceFactory.d.ts.map +1 -0
- package/src/lib/services/fecServiceFactory.js +154 -0
- package/src/lib/services/fecServiceFactory.js.map +1 -0
- package/src/lib/services/fecUsageExample.d.ts +33 -0
- package/src/lib/services/fecUsageExample.d.ts.map +1 -0
- package/src/lib/services/fecUsageExample.js +79 -0
- package/src/lib/services/fecUsageExample.js.map +1 -0
- package/src/lib/services/keyWrapping.d.ts +61 -0
- package/src/lib/services/keyWrapping.d.ts.map +1 -0
- package/src/lib/services/keyWrapping.js +297 -0
- package/src/lib/services/keyWrapping.js.map +1 -0
- package/src/lib/services/messageEventsWebSocketHandler.d.ts +15 -0
- package/src/lib/services/messageEventsWebSocketHandler.d.ts.map +1 -0
- package/src/lib/services/messageEventsWebSocketHandler.js +59 -0
- package/src/lib/services/messageEventsWebSocketHandler.js.map +1 -0
- package/src/lib/services/messagePassingService.d.ts +31 -0
- package/src/lib/services/messagePassingService.d.ts.map +1 -0
- package/src/lib/services/messagePassingService.js +88 -0
- package/src/lib/services/messagePassingService.js.map +1 -0
- package/src/lib/services/nativeRsFecService.d.ts +79 -0
- package/src/lib/services/nativeRsFecService.d.ts.map +1 -0
- package/src/lib/services/nativeRsFecService.js +295 -0
- package/src/lib/services/nativeRsFecService.js.map +1 -0
- package/src/lib/services/pbkdf2.d.ts +6 -0
- package/src/lib/services/pbkdf2.d.ts.map +1 -0
- package/src/lib/services/pbkdf2.js +31 -0
- package/src/lib/services/pbkdf2.js.map +1 -0
- package/src/lib/services/user.d.ts +10 -0
- package/src/lib/services/user.d.ts.map +1 -0
- package/src/lib/services/user.js +11 -0
- package/src/lib/services/user.js.map +1 -0
- package/src/lib/services/webSocketMessageServer.d.ts +53 -0
- package/src/lib/services/webSocketMessageServer.d.ts.map +1 -0
- package/src/lib/services/webSocketMessageServer.js +159 -0
- package/src/lib/services/webSocketMessageServer.js.map +1 -0
- package/src/lib/shared-types.d.ts +82 -0
- package/src/lib/shared-types.d.ts.map +1 -0
- package/src/lib/shared-types.js +6 -0
- package/src/lib/shared-types.js.map +1 -0
- package/src/lib/stores/availabilityAwareBlockStore.d.ts +287 -0
- package/src/lib/stores/availabilityAwareBlockStore.d.ts.map +1 -0
- package/src/lib/stores/availabilityAwareBlockStore.js +458 -0
- package/src/lib/stores/availabilityAwareBlockStore.js.map +1 -0
- package/src/lib/stores/diskBlockAsyncStore.d.ts +212 -0
- package/src/lib/stores/diskBlockAsyncStore.d.ts.map +1 -0
- package/src/lib/stores/diskBlockAsyncStore.js +803 -0
- package/src/lib/stores/diskBlockAsyncStore.js.map +1 -0
- package/src/lib/stores/diskBlockMetadataStore.d.ts +125 -0
- package/src/lib/stores/diskBlockMetadataStore.d.ts.map +1 -0
- package/src/lib/stores/diskBlockMetadataStore.js +347 -0
- package/src/lib/stores/diskBlockMetadataStore.js.map +1 -0
- package/src/lib/stores/diskBlockStore.d.ts +41 -0
- package/src/lib/stores/diskBlockStore.d.ts.map +1 -0
- package/src/lib/stores/diskBlockStore.js +87 -0
- package/src/lib/stores/diskBlockStore.js.map +1 -0
- package/src/lib/stores/diskBlockSyncStore.d.ts +12 -0
- package/src/lib/stores/diskBlockSyncStore.d.ts.map +1 -0
- package/src/lib/stores/diskBlockSyncStore.js +55 -0
- package/src/lib/stores/diskBlockSyncStore.js.map +1 -0
- package/src/lib/stores/diskCblStore.d.ts +30 -0
- package/src/lib/stores/diskCblStore.d.ts.map +1 -0
- package/src/lib/stores/diskCblStore.js +139 -0
- package/src/lib/stores/diskCblStore.js.map +1 -0
- package/src/lib/stores/diskMessageMetadataStore.d.ts +17 -0
- package/src/lib/stores/diskMessageMetadataStore.d.ts.map +1 -0
- package/src/lib/stores/diskMessageMetadataStore.js +214 -0
- package/src/lib/stores/diskMessageMetadataStore.js.map +1 -0
- package/src/lib/transforms/checksumTransform.d.ts +8 -0
- package/src/lib/transforms/checksumTransform.d.ts.map +1 -0
- package/src/lib/transforms/checksumTransform.js +22 -0
- package/src/lib/transforms/checksumTransform.js.map +1 -0
- package/src/lib/transforms/memoryWritableStream.d.ts +8 -0
- package/src/lib/transforms/memoryWritableStream.d.ts.map +1 -0
- package/src/lib/transforms/memoryWritableStream.js +20 -0
- package/src/lib/transforms/memoryWritableStream.js.map +1 -0
- package/src/lib/transforms/xorMultipleTransform.d.ts +12 -0
- package/src/lib/transforms/xorMultipleTransform.d.ts.map +1 -0
- package/src/lib/transforms/xorMultipleTransform.js +52 -0
- package/src/lib/transforms/xorMultipleTransform.js.map +1 -0
- package/src/lib/utils/type-converters.d.ts +10 -0
- package/src/lib/utils/type-converters.d.ts.map +1 -0
- package/src/lib/utils/type-converters.js +42 -0
- package/src/lib/utils/type-converters.js.map +1 -0
|
@@ -0,0 +1,803 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DiskBlockAsyncStore = void 0;
|
|
4
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
5
|
+
const brightchain_lib_1 = require("@brightchain/brightchain-lib");
|
|
6
|
+
const fs_1 = require("fs");
|
|
7
|
+
const promises_1 = require("fs/promises");
|
|
8
|
+
const path_1 = require("path");
|
|
9
|
+
const stream_1 = require("stream");
|
|
10
|
+
const checksumTransform_1 = require("../transforms/checksumTransform");
|
|
11
|
+
const memoryWritableStream_1 = require("../transforms/memoryWritableStream");
|
|
12
|
+
const xorMultipleTransform_1 = require("../transforms/xorMultipleTransform");
|
|
13
|
+
const diskBlockMetadataStore_1 = require("./diskBlockMetadataStore");
|
|
14
|
+
const diskBlockStore_1 = require("./diskBlockStore");
|
|
15
|
+
/**
|
|
16
|
+
* Parity block file extension pattern: {blockId}.p{index}
|
|
17
|
+
*/
|
|
18
|
+
const PARITY_FILE_EXTENSION_PREFIX = '.p';
|
|
19
|
+
/**
|
|
20
|
+
* DiskBlockAsyncStore provides asynchronous operations for storing and retrieving blocks from disk.
|
|
21
|
+
* It supports raw block storage and XOR operations with stream-based data handling.
|
|
22
|
+
* Blocks are stored as raw data without metadata - their meaning is derived from CBLs.
|
|
23
|
+
*
|
|
24
|
+
* This implementation supports:
|
|
25
|
+
* - Core block operations (store, retrieve, delete)
|
|
26
|
+
* - Metadata management for tracking block lifecycle and access patterns
|
|
27
|
+
* - FEC (Forward Error Correction) operations using Reed-Solomon encoding
|
|
28
|
+
* - Replication tracking for distributed storage
|
|
29
|
+
*/
|
|
30
|
+
class DiskBlockAsyncStore extends diskBlockStore_1.DiskBlockStore {
|
|
31
|
+
constructor(config) {
|
|
32
|
+
super(config);
|
|
33
|
+
/**
|
|
34
|
+
* Optional FEC service for parity generation and recovery.
|
|
35
|
+
* If not provided, FEC operations will return errors or no-ops.
|
|
36
|
+
*/
|
|
37
|
+
this.fecService = null;
|
|
38
|
+
this.metadataStore = new diskBlockMetadataStore_1.DiskBlockMetadataStore(config.storePath, config.blockSize);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Set the FEC service for parity generation and recovery.
|
|
42
|
+
* @param fecService - The FEC service to use
|
|
43
|
+
*/
|
|
44
|
+
setFecService(fecService) {
|
|
45
|
+
this.fecService = fecService;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get the FEC service if available.
|
|
49
|
+
* @returns The FEC service or null if not available
|
|
50
|
+
*/
|
|
51
|
+
getFecService() {
|
|
52
|
+
return this.fecService;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get the metadata store.
|
|
56
|
+
* @returns The metadata store
|
|
57
|
+
*/
|
|
58
|
+
getMetadataStore() {
|
|
59
|
+
return this.metadataStore;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Convert a key to hex string format.
|
|
63
|
+
* @param key - The key as Checksum or string
|
|
64
|
+
* @returns The key as hex string
|
|
65
|
+
*/
|
|
66
|
+
keyToHex(key) {
|
|
67
|
+
return typeof key === 'string' ? key : key.toHex();
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Convert a hex string to Checksum.
|
|
71
|
+
* @param hex - The hex string
|
|
72
|
+
* @returns The Checksum
|
|
73
|
+
*/
|
|
74
|
+
hexToChecksum(hex) {
|
|
75
|
+
return brightchain_lib_1.Checksum.fromHex(hex);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get the file path for a parity block.
|
|
79
|
+
* Parity files are stored alongside block files with .p{index} extension.
|
|
80
|
+
* @param blockId - The data block's checksum
|
|
81
|
+
* @param parityIndex - The parity block index (0-based)
|
|
82
|
+
* @returns The parity file path
|
|
83
|
+
*/
|
|
84
|
+
parityPath(blockId, parityIndex) {
|
|
85
|
+
return this.blockPath(blockId) + PARITY_FILE_EXTENSION_PREFIX + parityIndex;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Check if a block exists
|
|
89
|
+
*/
|
|
90
|
+
async has(key) {
|
|
91
|
+
const keyChecksum = typeof key === 'string' ? brightchain_lib_1.Checksum.fromHex(key) : key;
|
|
92
|
+
const blockPath = this.blockPath(keyChecksum);
|
|
93
|
+
return (0, fs_1.existsSync)(blockPath);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get a handle to a block
|
|
97
|
+
*/
|
|
98
|
+
get(key) {
|
|
99
|
+
const keyChecksum = typeof key === 'string' ? brightchain_lib_1.Checksum.fromHex(key) : key;
|
|
100
|
+
const blockPath = this.blockPath(keyChecksum);
|
|
101
|
+
// Read the block data synchronously to create the handle
|
|
102
|
+
// This matches the synchronous signature expected by IBlockStore.get
|
|
103
|
+
if (!(0, fs_1.existsSync)(blockPath)) {
|
|
104
|
+
throw new brightchain_lib_1.StoreError(brightchain_lib_1.StoreErrorType.KeyNotFound, undefined, {
|
|
105
|
+
KEY: keyChecksum.toHex(),
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
const data = (0, fs_1.readFileSync)(blockPath);
|
|
109
|
+
return (0, brightchain_lib_1.createBlockHandle)(brightchain_lib_1.RawDataBlock, this._blockSize, data, keyChecksum, true, // canRead
|
|
110
|
+
true);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Get a block's data
|
|
114
|
+
*/
|
|
115
|
+
async getData(key) {
|
|
116
|
+
const keyHex = this.keyToHex(key);
|
|
117
|
+
const blockPath = this.blockPath(key);
|
|
118
|
+
if (!(0, fs_1.existsSync)(blockPath)) {
|
|
119
|
+
throw new brightchain_lib_1.StoreError(brightchain_lib_1.StoreErrorType.KeyNotFound, undefined, {
|
|
120
|
+
KEY: keyHex,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
let data;
|
|
124
|
+
try {
|
|
125
|
+
data = await (0, promises_1.readFile)(blockPath);
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
throw new brightchain_lib_1.StoreError(brightchain_lib_1.StoreErrorType.KeyNotFound, undefined, {
|
|
129
|
+
KEY: keyHex,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
if (data.length > this._blockSize) {
|
|
133
|
+
throw new brightchain_lib_1.StoreError(brightchain_lib_1.StoreErrorType.BlockFileSizeMismatch);
|
|
134
|
+
}
|
|
135
|
+
// Use file creation time as block creation time
|
|
136
|
+
const stats = await (0, promises_1.stat)(blockPath);
|
|
137
|
+
const dateCreated = stats.birthtime;
|
|
138
|
+
// Record access in metadata
|
|
139
|
+
if (this.metadataStore.has(keyHex)) {
|
|
140
|
+
await this.metadataStore.recordAccess(keyHex);
|
|
141
|
+
}
|
|
142
|
+
return new brightchain_lib_1.RawDataBlock(this._blockSize, data, dateCreated, key, brightchain_lib_1.BlockType.RawData, brightchain_lib_1.BlockDataType.EphemeralStructuredData, // Use EphemeralStructuredData as default
|
|
143
|
+
true, // canRead
|
|
144
|
+
true);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Delete a block's data (and associated parity blocks and metadata)
|
|
148
|
+
* @param key - The block's checksum
|
|
149
|
+
*/
|
|
150
|
+
async deleteData(key) {
|
|
151
|
+
const keyHex = this.keyToHex(key);
|
|
152
|
+
const blockPath = this.blockPath(key);
|
|
153
|
+
if (!(0, fs_1.existsSync)(blockPath)) {
|
|
154
|
+
throw new brightchain_lib_1.StoreError(brightchain_lib_1.StoreErrorType.KeyNotFound);
|
|
155
|
+
}
|
|
156
|
+
// Get metadata to find parity blocks
|
|
157
|
+
const metadata = await this.metadataStore.get(keyHex);
|
|
158
|
+
// Delete parity blocks first
|
|
159
|
+
if (metadata && metadata.parityBlockIds.length > 0) {
|
|
160
|
+
for (let i = 0; i < metadata.parityBlockIds.length; i++) {
|
|
161
|
+
const parityFilePath = this.parityPath(key, i);
|
|
162
|
+
if ((0, fs_1.existsSync)(parityFilePath)) {
|
|
163
|
+
try {
|
|
164
|
+
await (0, promises_1.unlink)(parityFilePath);
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
// Ignore errors deleting parity files
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Delete the block data
|
|
173
|
+
try {
|
|
174
|
+
await (0, promises_1.unlink)(blockPath);
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
throw new brightchain_lib_1.StoreError(brightchain_lib_1.StoreErrorType.BlockDeletionFailed, undefined, {
|
|
178
|
+
ERROR: error instanceof Error ? error.message : String(error),
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
// Delete metadata (if exists)
|
|
182
|
+
if (this.metadataStore.has(keyHex)) {
|
|
183
|
+
try {
|
|
184
|
+
await this.metadataStore.delete(keyHex);
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
// Ignore errors deleting metadata
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Store a block's data with optional durability settings
|
|
193
|
+
*/
|
|
194
|
+
async setData(block, options) {
|
|
195
|
+
if (block.blockSize !== this._blockSize) {
|
|
196
|
+
throw new brightchain_lib_1.StoreError(brightchain_lib_1.StoreErrorType.BlockSizeMismatch);
|
|
197
|
+
}
|
|
198
|
+
const keyHex = this.keyToHex(block.idChecksum);
|
|
199
|
+
const blockPath = this.blockPath(block.idChecksum);
|
|
200
|
+
if ((0, fs_1.existsSync)(blockPath)) {
|
|
201
|
+
throw new brightchain_lib_1.StoreError(brightchain_lib_1.StoreErrorType.BlockPathAlreadyExists);
|
|
202
|
+
}
|
|
203
|
+
try {
|
|
204
|
+
block.validate();
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
throw new brightchain_lib_1.StoreError(brightchain_lib_1.StoreErrorType.BlockValidationFailed);
|
|
208
|
+
}
|
|
209
|
+
// Ensure block directory exists before writing
|
|
210
|
+
this.ensureBlockPath(block.idChecksum);
|
|
211
|
+
try {
|
|
212
|
+
await (0, promises_1.writeFile)(blockPath, Buffer.from(block.data));
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
throw new brightchain_lib_1.StoreError(brightchain_lib_1.StoreErrorType.BlockDirectoryCreationFailed, undefined, {
|
|
216
|
+
ERROR: error instanceof Error ? error.message : String(error),
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
// Create metadata for the block
|
|
220
|
+
const metadata = (0, brightchain_lib_1.createDefaultBlockMetadata)(keyHex, block.data.length, keyHex, options);
|
|
221
|
+
await this.metadataStore.create(metadata);
|
|
222
|
+
// Generate parity blocks based on durability level
|
|
223
|
+
const durabilityLevel = options?.durabilityLevel ?? brightchain_lib_1.DurabilityLevel.Standard;
|
|
224
|
+
const parityCount = (0, brightchain_lib_1.getParityCountForDurability)(durabilityLevel);
|
|
225
|
+
if (parityCount > 0 && this.fecService) {
|
|
226
|
+
try {
|
|
227
|
+
await this.generateParityBlocks(block.idChecksum, parityCount);
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
// If parity generation fails, we still keep the block but log the issue
|
|
231
|
+
// The block will have no parity protection
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* XOR multiple blocks together
|
|
237
|
+
*/
|
|
238
|
+
async xor(blocks, destBlockMetadata) {
|
|
239
|
+
if (!blocks.length) {
|
|
240
|
+
throw new brightchain_lib_1.StoreError(brightchain_lib_1.StoreErrorType.NoBlocksProvided);
|
|
241
|
+
}
|
|
242
|
+
return new Promise((resolve, reject) => {
|
|
243
|
+
// Create read streams from the full block data
|
|
244
|
+
const readStreams = blocks.map((block) => {
|
|
245
|
+
const data = block.fullData; // Use fullData to get padded content
|
|
246
|
+
const stream = new stream_1.Readable();
|
|
247
|
+
stream.push(Buffer.from(data));
|
|
248
|
+
stream.push(null);
|
|
249
|
+
return stream;
|
|
250
|
+
});
|
|
251
|
+
const xorStream = new xorMultipleTransform_1.XorMultipleTransformStream(readStreams);
|
|
252
|
+
const checksumStream = new checksumTransform_1.ChecksumTransform();
|
|
253
|
+
const writeStream = new memoryWritableStream_1.MemoryWritableStream();
|
|
254
|
+
// Set up pipeline
|
|
255
|
+
xorStream.pipe(checksumStream).pipe(writeStream);
|
|
256
|
+
// Handle stream ends
|
|
257
|
+
this.handleReadStreamEnds(readStreams, xorStream);
|
|
258
|
+
// Handle checksum calculation
|
|
259
|
+
checksumStream.on('checksum', (checksumBuffer) => {
|
|
260
|
+
try {
|
|
261
|
+
const block = new brightchain_lib_1.RawDataBlock(this._blockSize, writeStream.data, new Date(destBlockMetadata.dateCreated), checksumBuffer, brightchain_lib_1.BlockType.RawData, destBlockMetadata.dataType, // Use the metadata's dataType
|
|
262
|
+
true, // canRead
|
|
263
|
+
true);
|
|
264
|
+
resolve(block);
|
|
265
|
+
}
|
|
266
|
+
catch (error) {
|
|
267
|
+
reject(error);
|
|
268
|
+
}
|
|
269
|
+
finally {
|
|
270
|
+
this.cleanupStreams([
|
|
271
|
+
...readStreams,
|
|
272
|
+
xorStream,
|
|
273
|
+
checksumStream,
|
|
274
|
+
writeStream,
|
|
275
|
+
]);
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
// Handle errors
|
|
279
|
+
const handleError = (error) => {
|
|
280
|
+
this.cleanupStreams([
|
|
281
|
+
...readStreams,
|
|
282
|
+
xorStream,
|
|
283
|
+
checksumStream,
|
|
284
|
+
writeStream,
|
|
285
|
+
]);
|
|
286
|
+
reject(error);
|
|
287
|
+
};
|
|
288
|
+
readStreams.forEach((stream) => stream.on('error', handleError));
|
|
289
|
+
xorStream.on('error', handleError);
|
|
290
|
+
checksumStream.on('error', handleError);
|
|
291
|
+
writeStream.on('error', handleError);
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Handle read stream ends
|
|
296
|
+
*/
|
|
297
|
+
handleReadStreamEnds(readStreams, xorStream) {
|
|
298
|
+
let endedStreams = 0;
|
|
299
|
+
readStreams.forEach((readStream) => {
|
|
300
|
+
readStream.on('end', () => {
|
|
301
|
+
if (++endedStreams === readStreams.length) {
|
|
302
|
+
xorStream.end();
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Clean up streams
|
|
309
|
+
*/
|
|
310
|
+
cleanupStreams(streams) {
|
|
311
|
+
streams.forEach((stream) => {
|
|
312
|
+
try {
|
|
313
|
+
stream.destroy();
|
|
314
|
+
}
|
|
315
|
+
catch {
|
|
316
|
+
// Ignore errors during cleanup
|
|
317
|
+
}
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Get random block checksums from the store
|
|
322
|
+
* @param count - Maximum number of blocks to return
|
|
323
|
+
* @returns Array of random block checksums
|
|
324
|
+
*/
|
|
325
|
+
async getRandomBlocks(count) {
|
|
326
|
+
const blockSizeString = (0, brightchain_lib_1.blockSizeToSizeString)(this._blockSize);
|
|
327
|
+
const basePath = (0, path_1.join)(this._storePath, blockSizeString);
|
|
328
|
+
if (!(0, fs_1.existsSync)(basePath)) {
|
|
329
|
+
return [];
|
|
330
|
+
}
|
|
331
|
+
const blocks = [];
|
|
332
|
+
const firstLevelDirs = await (0, promises_1.readdir)(basePath);
|
|
333
|
+
// Randomly select first level directories until we have enough blocks
|
|
334
|
+
while (blocks.length < count && firstLevelDirs.length > 0) {
|
|
335
|
+
// Pick a random first level directory
|
|
336
|
+
const randomFirstIndex = Math.floor(Math.random() * firstLevelDirs.length);
|
|
337
|
+
const firstDir = firstLevelDirs[randomFirstIndex];
|
|
338
|
+
const firstLevelPath = (0, path_1.join)(basePath, firstDir);
|
|
339
|
+
if (!(0, fs_1.existsSync)(firstLevelPath)) {
|
|
340
|
+
// Remove invalid directory and continue
|
|
341
|
+
firstLevelDirs.splice(randomFirstIndex, 1);
|
|
342
|
+
continue;
|
|
343
|
+
}
|
|
344
|
+
// Get second level directories
|
|
345
|
+
const secondLevelDirs = await (0, promises_1.readdir)(firstLevelPath);
|
|
346
|
+
if (secondLevelDirs.length === 0) {
|
|
347
|
+
// Remove empty directory and continue
|
|
348
|
+
firstLevelDirs.splice(randomFirstIndex, 1);
|
|
349
|
+
continue;
|
|
350
|
+
}
|
|
351
|
+
// Pick a random second level directory
|
|
352
|
+
const randomSecondIndex = Math.floor(Math.random() * secondLevelDirs.length);
|
|
353
|
+
const secondDir = secondLevelDirs[randomSecondIndex];
|
|
354
|
+
const secondLevelPath = (0, path_1.join)(firstLevelPath, secondDir);
|
|
355
|
+
if (!(0, fs_1.existsSync)(secondLevelPath)) {
|
|
356
|
+
continue;
|
|
357
|
+
}
|
|
358
|
+
// Get block files (exclude metadata and parity files)
|
|
359
|
+
const blockFiles = (await (0, promises_1.readdir)(secondLevelPath)).filter((file) => !file.endsWith('.m.json') &&
|
|
360
|
+
!file.includes(PARITY_FILE_EXTENSION_PREFIX));
|
|
361
|
+
if (blockFiles.length === 0) {
|
|
362
|
+
continue;
|
|
363
|
+
}
|
|
364
|
+
// Pick a random block
|
|
365
|
+
const randomBlockIndex = Math.floor(Math.random() * blockFiles.length);
|
|
366
|
+
const blockFile = blockFiles[randomBlockIndex];
|
|
367
|
+
blocks.push(brightchain_lib_1.Checksum.fromHex(blockFile));
|
|
368
|
+
// Remove used directory if we still need more blocks
|
|
369
|
+
if (blocks.length < count) {
|
|
370
|
+
firstLevelDirs.splice(randomFirstIndex, 1);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
return blocks;
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Store raw data with a key (convenience method)
|
|
377
|
+
* Creates a RawDataBlock and stores it
|
|
378
|
+
*/
|
|
379
|
+
async put(key, data, options) {
|
|
380
|
+
const keyChecksum = typeof key === 'string' ? brightchain_lib_1.Checksum.fromHex(key) : key;
|
|
381
|
+
const block = new brightchain_lib_1.RawDataBlock(this._blockSize, data, new Date(), keyChecksum);
|
|
382
|
+
await this.setData(block, options);
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Delete a block (convenience method, alias for deleteData)
|
|
386
|
+
*/
|
|
387
|
+
async delete(key) {
|
|
388
|
+
const keyChecksum = typeof key === 'string' ? brightchain_lib_1.Checksum.fromHex(key) : key;
|
|
389
|
+
await this.deleteData(keyChecksum);
|
|
390
|
+
}
|
|
391
|
+
// === Metadata Operations ===
|
|
392
|
+
/**
|
|
393
|
+
* Get metadata for a block
|
|
394
|
+
* @param key - The block's checksum or ID
|
|
395
|
+
* @returns The block's metadata, or null if not found
|
|
396
|
+
*/
|
|
397
|
+
async getMetadata(key) {
|
|
398
|
+
const keyHex = this.keyToHex(key);
|
|
399
|
+
return this.metadataStore.get(keyHex);
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Update metadata for a block
|
|
403
|
+
* @param key - The block's checksum or ID
|
|
404
|
+
* @param updates - Partial metadata updates to apply
|
|
405
|
+
*/
|
|
406
|
+
async updateMetadata(key, updates) {
|
|
407
|
+
const keyHex = this.keyToHex(key);
|
|
408
|
+
if (!this.metadataStore.has(keyHex)) {
|
|
409
|
+
throw new brightchain_lib_1.StoreError(brightchain_lib_1.StoreErrorType.KeyNotFound, undefined, {
|
|
410
|
+
KEY: keyHex,
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
await this.metadataStore.update(keyHex, updates);
|
|
414
|
+
}
|
|
415
|
+
// === FEC/Durability Operations ===
|
|
416
|
+
/**
|
|
417
|
+
* Generate parity blocks for a data block using Reed-Solomon encoding.
|
|
418
|
+
* Parity blocks are stored as separate files: {blockId}.p0, {blockId}.p1, etc.
|
|
419
|
+
* @param key - The data block's checksum
|
|
420
|
+
* @param parityCount - Number of parity blocks to generate
|
|
421
|
+
* @returns Array of parity block checksums (as synthetic IDs)
|
|
422
|
+
* @throws FecError if FEC service is not available or encoding fails
|
|
423
|
+
*/
|
|
424
|
+
async generateParityBlocks(key, parityCount) {
|
|
425
|
+
const keyHex = this.keyToHex(key);
|
|
426
|
+
const keyChecksum = typeof key === 'string' ? brightchain_lib_1.Checksum.fromHex(key) : key;
|
|
427
|
+
// Check if FEC service is available
|
|
428
|
+
if (!this.fecService) {
|
|
429
|
+
throw new brightchain_lib_1.FecError(brightchain_lib_1.FecErrorType.FecEncodingFailed, undefined, {
|
|
430
|
+
ERROR: 'FEC service is not available',
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
// Check if block exists
|
|
434
|
+
const blockPath = this.blockPath(keyChecksum);
|
|
435
|
+
if (!(0, fs_1.existsSync)(blockPath)) {
|
|
436
|
+
throw new brightchain_lib_1.StoreError(brightchain_lib_1.StoreErrorType.KeyNotFound, undefined, {
|
|
437
|
+
KEY: keyHex,
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
// Check if FEC service is available in the environment
|
|
441
|
+
const isAvailable = await this.fecService.isAvailable();
|
|
442
|
+
if (!isAvailable) {
|
|
443
|
+
throw new brightchain_lib_1.FecError(brightchain_lib_1.FecErrorType.FecEncodingFailed, undefined, {
|
|
444
|
+
ERROR: 'FEC service is not available in this environment',
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
// Read block data
|
|
448
|
+
const blockData = await (0, promises_1.readFile)(blockPath);
|
|
449
|
+
// Generate parity data
|
|
450
|
+
const parityData = await this.fecService.createParityData(blockData, parityCount);
|
|
451
|
+
// Store parity blocks as separate files
|
|
452
|
+
const parityBlockIds = [];
|
|
453
|
+
for (let i = 0; i < parityData.length; i++) {
|
|
454
|
+
const parityFilePath = this.parityPath(keyChecksum, i);
|
|
455
|
+
await (0, promises_1.writeFile)(parityFilePath, Buffer.from(parityData[i].data));
|
|
456
|
+
parityBlockIds.push(`${keyHex}.p${i}`);
|
|
457
|
+
}
|
|
458
|
+
// Update metadata with parity block IDs
|
|
459
|
+
if (this.metadataStore.has(keyHex)) {
|
|
460
|
+
await this.metadataStore.update(keyHex, { parityBlockIds });
|
|
461
|
+
}
|
|
462
|
+
// Return parity block IDs as Checksum (using hex encoding for synthetic IDs)
|
|
463
|
+
return parityBlockIds.map((id) => {
|
|
464
|
+
// For parity block IDs, we create a checksum from the hex-encoded ID string
|
|
465
|
+
// This is a synthetic ID, not a real checksum of data
|
|
466
|
+
const paddedHex = id.padEnd(64, '0').slice(0, 64);
|
|
467
|
+
return brightchain_lib_1.Checksum.fromHex(paddedHex);
|
|
468
|
+
});
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* Get parity block checksums for a data block.
|
|
472
|
+
* @param key - The data block's checksum or ID
|
|
473
|
+
* @returns Array of parity block checksums
|
|
474
|
+
*/
|
|
475
|
+
async getParityBlocks(key) {
|
|
476
|
+
const keyHex = this.keyToHex(key);
|
|
477
|
+
// Get metadata to find parity block IDs
|
|
478
|
+
const metadata = await this.metadataStore.get(keyHex);
|
|
479
|
+
if (!metadata) {
|
|
480
|
+
return [];
|
|
481
|
+
}
|
|
482
|
+
// Return parity block IDs as Checksum
|
|
483
|
+
// Pad to 128 hex characters (64 bytes) for SHA3-512
|
|
484
|
+
return metadata.parityBlockIds.map((id) => {
|
|
485
|
+
const paddedHex = id.padEnd(128, '0').slice(0, 128);
|
|
486
|
+
return brightchain_lib_1.Checksum.fromHex(paddedHex);
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
/**
|
|
490
|
+
* Load parity data from disk for a block.
|
|
491
|
+
* @param key - The data block's checksum
|
|
492
|
+
* @returns Array of parity data objects
|
|
493
|
+
*/
|
|
494
|
+
async loadParityData(key) {
|
|
495
|
+
const keyHex = this.keyToHex(key);
|
|
496
|
+
const metadata = await this.metadataStore.get(keyHex);
|
|
497
|
+
if (!metadata || metadata.parityBlockIds.length === 0) {
|
|
498
|
+
return [];
|
|
499
|
+
}
|
|
500
|
+
const parityData = [];
|
|
501
|
+
for (let i = 0; i < metadata.parityBlockIds.length; i++) {
|
|
502
|
+
const parityFilePath = this.parityPath(key, i);
|
|
503
|
+
if ((0, fs_1.existsSync)(parityFilePath)) {
|
|
504
|
+
const data = await (0, promises_1.readFile)(parityFilePath);
|
|
505
|
+
parityData.push({ data, index: i });
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
return parityData;
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Attempt to recover a corrupted or missing block using parity data.
|
|
512
|
+
* @param key - The block's checksum or ID
|
|
513
|
+
* @returns Recovery result with the recovered block or error
|
|
514
|
+
*/
|
|
515
|
+
async recoverBlock(key) {
|
|
516
|
+
const keyHex = this.keyToHex(key);
|
|
517
|
+
const keyChecksum = typeof key === 'string' ? brightchain_lib_1.Checksum.fromHex(key) : key;
|
|
518
|
+
// Check if FEC service is available
|
|
519
|
+
if (!this.fecService) {
|
|
520
|
+
return {
|
|
521
|
+
success: false,
|
|
522
|
+
error: 'FEC service is not available',
|
|
523
|
+
};
|
|
524
|
+
}
|
|
525
|
+
// Check if FEC service is available in the environment
|
|
526
|
+
const isAvailable = await this.fecService.isAvailable();
|
|
527
|
+
if (!isAvailable) {
|
|
528
|
+
return {
|
|
529
|
+
success: false,
|
|
530
|
+
error: 'FEC service is not available in this environment',
|
|
531
|
+
};
|
|
532
|
+
}
|
|
533
|
+
// Get parity data from disk
|
|
534
|
+
const parityData = await this.loadParityData(keyChecksum);
|
|
535
|
+
if (parityData.length === 0) {
|
|
536
|
+
return {
|
|
537
|
+
success: false,
|
|
538
|
+
error: 'No parity data available for recovery',
|
|
539
|
+
};
|
|
540
|
+
}
|
|
541
|
+
// Get metadata for original size
|
|
542
|
+
const metadata = await this.metadataStore.get(keyHex);
|
|
543
|
+
if (!metadata) {
|
|
544
|
+
return {
|
|
545
|
+
success: false,
|
|
546
|
+
error: 'Block metadata not found',
|
|
547
|
+
};
|
|
548
|
+
}
|
|
549
|
+
try {
|
|
550
|
+
// Get corrupted data if block still exists
|
|
551
|
+
const blockPath = this.blockPath(keyChecksum);
|
|
552
|
+
let corruptedData = null;
|
|
553
|
+
if ((0, fs_1.existsSync)(blockPath)) {
|
|
554
|
+
corruptedData = await (0, promises_1.readFile)(blockPath);
|
|
555
|
+
}
|
|
556
|
+
// Attempt recovery
|
|
557
|
+
const result = await this.fecService.recoverFileData(corruptedData, parityData, metadata.size);
|
|
558
|
+
if (result.recovered) {
|
|
559
|
+
// Create a new block with recovered data
|
|
560
|
+
const recoveredBlock = new brightchain_lib_1.RawDataBlock(this._blockSize, new Uint8Array(result.data));
|
|
561
|
+
// Update the stored block on disk
|
|
562
|
+
await (0, promises_1.writeFile)(blockPath, Buffer.from(result.data));
|
|
563
|
+
return {
|
|
564
|
+
success: true,
|
|
565
|
+
recoveredBlock,
|
|
566
|
+
};
|
|
567
|
+
}
|
|
568
|
+
return {
|
|
569
|
+
success: false,
|
|
570
|
+
error: 'Recovery failed - insufficient parity data',
|
|
571
|
+
};
|
|
572
|
+
}
|
|
573
|
+
catch (error) {
|
|
574
|
+
return {
|
|
575
|
+
success: false,
|
|
576
|
+
error: error instanceof Error ? error.message : 'Unknown recovery error',
|
|
577
|
+
};
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
/**
|
|
581
|
+
* Verify block integrity against its parity data.
|
|
582
|
+
* @param key - The block's checksum or ID
|
|
583
|
+
* @returns True if the block data matches its parity data
|
|
584
|
+
*/
|
|
585
|
+
async verifyBlockIntegrity(key) {
|
|
586
|
+
const _keyHex = this.keyToHex(key);
|
|
587
|
+
const keyChecksum = typeof key === 'string' ? brightchain_lib_1.Checksum.fromHex(key) : key;
|
|
588
|
+
// Check if FEC service is available
|
|
589
|
+
if (!this.fecService) {
|
|
590
|
+
// Without FEC service, we can only verify the block exists
|
|
591
|
+
return this.has(key);
|
|
592
|
+
}
|
|
593
|
+
// Check if FEC service is available in the environment
|
|
594
|
+
const isAvailable = await this.fecService.isAvailable();
|
|
595
|
+
if (!isAvailable) {
|
|
596
|
+
// Without FEC service, we can only verify the block exists
|
|
597
|
+
return this.has(key);
|
|
598
|
+
}
|
|
599
|
+
// Check if block exists
|
|
600
|
+
const blockPath = this.blockPath(keyChecksum);
|
|
601
|
+
if (!(0, fs_1.existsSync)(blockPath)) {
|
|
602
|
+
return false;
|
|
603
|
+
}
|
|
604
|
+
// Get parity data from disk
|
|
605
|
+
const parityData = await this.loadParityData(keyChecksum);
|
|
606
|
+
if (parityData.length === 0) {
|
|
607
|
+
// No parity data - can only verify block exists
|
|
608
|
+
return true;
|
|
609
|
+
}
|
|
610
|
+
try {
|
|
611
|
+
const blockData = await (0, promises_1.readFile)(blockPath);
|
|
612
|
+
return await this.fecService.verifyFileIntegrity(blockData, parityData);
|
|
613
|
+
}
|
|
614
|
+
catch {
|
|
615
|
+
return false;
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
// === Replication Operations ===
|
|
619
|
+
/**
|
|
620
|
+
* Get blocks that are pending replication (status = Pending).
|
|
621
|
+
* @returns Array of block checksums pending replication
|
|
622
|
+
*/
|
|
623
|
+
async getBlocksPendingReplication() {
|
|
624
|
+
const pendingBlocks = await this.metadataStore.findByReplicationStatus(brightchain_lib_1.ReplicationStatus.Pending);
|
|
625
|
+
return pendingBlocks
|
|
626
|
+
.filter((meta) => meta.targetReplicationFactor > 0)
|
|
627
|
+
.map((meta) => this.hexToChecksum(meta.blockId));
|
|
628
|
+
}
|
|
629
|
+
/**
|
|
630
|
+
* Get blocks that are under-replicated (status = UnderReplicated).
|
|
631
|
+
* @returns Array of block checksums that need additional replicas
|
|
632
|
+
*/
|
|
633
|
+
async getUnderReplicatedBlocks() {
|
|
634
|
+
const underReplicatedBlocks = await this.metadataStore.findByReplicationStatus(brightchain_lib_1.ReplicationStatus.UnderReplicated);
|
|
635
|
+
return underReplicatedBlocks.map((meta) => this.hexToChecksum(meta.blockId));
|
|
636
|
+
}
|
|
637
|
+
/**
|
|
638
|
+
* Record that a block has been replicated to a node.
|
|
639
|
+
* @param key - The block's checksum or ID
|
|
640
|
+
* @param nodeId - The ID of the node that now holds a replica
|
|
641
|
+
*/
|
|
642
|
+
async recordReplication(key, nodeId) {
|
|
643
|
+
const keyHex = this.keyToHex(key);
|
|
644
|
+
const metadata = await this.metadataStore.get(keyHex);
|
|
645
|
+
if (!metadata) {
|
|
646
|
+
throw new brightchain_lib_1.StoreError(brightchain_lib_1.StoreErrorType.KeyNotFound, undefined, {
|
|
647
|
+
KEY: keyHex,
|
|
648
|
+
});
|
|
649
|
+
}
|
|
650
|
+
// Add node to replica list if not already present
|
|
651
|
+
const replicaNodeIds = [...metadata.replicaNodeIds];
|
|
652
|
+
if (!replicaNodeIds.includes(nodeId)) {
|
|
653
|
+
replicaNodeIds.push(nodeId);
|
|
654
|
+
}
|
|
655
|
+
// Update replication status based on target factor
|
|
656
|
+
let replicationStatus = metadata.replicationStatus;
|
|
657
|
+
if (replicaNodeIds.length >= metadata.targetReplicationFactor) {
|
|
658
|
+
replicationStatus = brightchain_lib_1.ReplicationStatus.Replicated;
|
|
659
|
+
}
|
|
660
|
+
else if (replicaNodeIds.length > 0) {
|
|
661
|
+
replicationStatus = brightchain_lib_1.ReplicationStatus.UnderReplicated;
|
|
662
|
+
}
|
|
663
|
+
await this.metadataStore.update(keyHex, {
|
|
664
|
+
replicaNodeIds,
|
|
665
|
+
replicationStatus,
|
|
666
|
+
});
|
|
667
|
+
}
|
|
668
|
+
/**
|
|
669
|
+
* Record that a replica node is no longer available.
|
|
670
|
+
* @param key - The block's checksum or ID
|
|
671
|
+
* @param nodeId - The ID of the node that lost the replica
|
|
672
|
+
*/
|
|
673
|
+
async recordReplicaLoss(key, nodeId) {
|
|
674
|
+
const keyHex = this.keyToHex(key);
|
|
675
|
+
const metadata = await this.metadataStore.get(keyHex);
|
|
676
|
+
if (!metadata) {
|
|
677
|
+
throw new brightchain_lib_1.StoreError(brightchain_lib_1.StoreErrorType.KeyNotFound, undefined, {
|
|
678
|
+
KEY: keyHex,
|
|
679
|
+
});
|
|
680
|
+
}
|
|
681
|
+
// Remove node from replica list
|
|
682
|
+
const replicaNodeIds = metadata.replicaNodeIds.filter((id) => id !== nodeId);
|
|
683
|
+
// Update replication status based on remaining replicas
|
|
684
|
+
let replicationStatus = metadata.replicationStatus;
|
|
685
|
+
if (metadata.targetReplicationFactor > 0) {
|
|
686
|
+
if (replicaNodeIds.length >= metadata.targetReplicationFactor) {
|
|
687
|
+
replicationStatus = brightchain_lib_1.ReplicationStatus.Replicated;
|
|
688
|
+
}
|
|
689
|
+
else if (replicaNodeIds.length > 0) {
|
|
690
|
+
replicationStatus = brightchain_lib_1.ReplicationStatus.UnderReplicated;
|
|
691
|
+
}
|
|
692
|
+
else {
|
|
693
|
+
replicationStatus = brightchain_lib_1.ReplicationStatus.Pending;
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
await this.metadataStore.update(keyHex, {
|
|
697
|
+
replicaNodeIds,
|
|
698
|
+
replicationStatus,
|
|
699
|
+
});
|
|
700
|
+
}
|
|
701
|
+
// === Block Expiration and Cleanup ===
|
|
702
|
+
/**
|
|
703
|
+
* Find all blocks that have expired (expiresAt is in the past).
|
|
704
|
+
* @returns Array of metadata for expired blocks
|
|
705
|
+
*/
|
|
706
|
+
async findExpired() {
|
|
707
|
+
return this.metadataStore.findExpired();
|
|
708
|
+
}
|
|
709
|
+
/**
|
|
710
|
+
* Clean up expired blocks.
|
|
711
|
+
* This method identifies expired blocks and deletes them along with their
|
|
712
|
+
* parity blocks and metadata.
|
|
713
|
+
*
|
|
714
|
+
* @param cblChecker - Optional function to check if a block is referenced by a CBL.
|
|
715
|
+
* If provided, blocks referenced by active CBLs will not be deleted.
|
|
716
|
+
* @returns Object containing deleted block IDs and any errors encountered
|
|
717
|
+
*/
|
|
718
|
+
async cleanupExpiredBlocks(cblChecker) {
|
|
719
|
+
const expiredBlocks = await this.findExpired();
|
|
720
|
+
const deletedBlockIds = [];
|
|
721
|
+
const errors = [];
|
|
722
|
+
for (const metadata of expiredBlocks) {
|
|
723
|
+
try {
|
|
724
|
+
// Check if block is referenced by a CBL
|
|
725
|
+
if (cblChecker) {
|
|
726
|
+
const isReferenced = await cblChecker(metadata.blockId);
|
|
727
|
+
if (isReferenced) {
|
|
728
|
+
// Skip deletion - block is still referenced
|
|
729
|
+
continue;
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
// Delete the block (this also deletes parity blocks and metadata)
|
|
733
|
+
const keyBuffer = this.hexToChecksum(metadata.blockId);
|
|
734
|
+
await this.deleteData(keyBuffer);
|
|
735
|
+
deletedBlockIds.push(metadata.blockId);
|
|
736
|
+
}
|
|
737
|
+
catch (error) {
|
|
738
|
+
errors.push({
|
|
739
|
+
blockId: metadata.blockId,
|
|
740
|
+
error: error instanceof Error ? error.message : String(error),
|
|
741
|
+
});
|
|
742
|
+
}
|
|
743
|
+
}
|
|
744
|
+
return { deletedBlockIds, errors };
|
|
745
|
+
}
|
|
746
|
+
// === XOR Brightening Operations ===
|
|
747
|
+
/**
|
|
748
|
+
* Brighten a block by XORing it with random blocks from the store.
|
|
749
|
+
* This is used to implement Owner-Free storage patterns where the
|
|
750
|
+
* original data cannot be reconstructed without all the random blocks.
|
|
751
|
+
*
|
|
752
|
+
* @param key - The source block's checksum or ID
|
|
753
|
+
* @param randomBlockCount - Number of random blocks to XOR with
|
|
754
|
+
* @returns Result containing the brightened block ID and the random block IDs used
|
|
755
|
+
* @throws StoreError if the source block is not found or insufficient random blocks are available
|
|
756
|
+
*/
|
|
757
|
+
async brightenBlock(key, randomBlockCount) {
|
|
758
|
+
const keyHex = this.keyToHex(key);
|
|
759
|
+
const keyChecksum = typeof key === 'string' ? brightchain_lib_1.Checksum.fromHex(key) : key;
|
|
760
|
+
// Verify source block exists
|
|
761
|
+
const blockPath = this.blockPath(keyChecksum);
|
|
762
|
+
if (!(0, fs_1.existsSync)(blockPath)) {
|
|
763
|
+
throw new brightchain_lib_1.StoreError(brightchain_lib_1.StoreErrorType.KeyNotFound, undefined, {
|
|
764
|
+
KEY: keyHex,
|
|
765
|
+
});
|
|
766
|
+
}
|
|
767
|
+
// Get random blocks for XOR operation
|
|
768
|
+
const randomBlockChecksums = await this.getRandomBlocks(randomBlockCount);
|
|
769
|
+
// Check if we have enough random blocks
|
|
770
|
+
if (randomBlockChecksums.length < randomBlockCount) {
|
|
771
|
+
throw new brightchain_lib_1.StoreError(brightchain_lib_1.StoreErrorType.InsufficientRandomBlocks, undefined, {
|
|
772
|
+
REQUESTED: randomBlockCount.toString(),
|
|
773
|
+
AVAILABLE: randomBlockChecksums.length.toString(),
|
|
774
|
+
});
|
|
775
|
+
}
|
|
776
|
+
// Get the source block handle
|
|
777
|
+
const sourceBlockHandle = this.get(keyChecksum);
|
|
778
|
+
// Get handles for all random blocks
|
|
779
|
+
const randomBlockHandles = randomBlockChecksums.map((checksum) => this.get(checksum));
|
|
780
|
+
// Combine source block with random blocks for XOR operation
|
|
781
|
+
const allBlockHandles = [sourceBlockHandle, ...randomBlockHandles];
|
|
782
|
+
// Create metadata for the brightened block
|
|
783
|
+
const destBlockMetadata = new brightchain_lib_1.BlockMetadata(this._blockSize, brightchain_lib_1.BlockType.RawData, brightchain_lib_1.BlockDataType.EphemeralStructuredData, this._blockSize, // lengthWithoutPadding - use full block size for XOR result
|
|
784
|
+
new Date());
|
|
785
|
+
// Perform XOR operation using the existing xor method
|
|
786
|
+
const brightenedBlock = await this.xor(allBlockHandles, destBlockMetadata);
|
|
787
|
+
const brightenedBlockId = brightenedBlock.idChecksum.toHex();
|
|
788
|
+
// Store the brightened block if it doesn't already exist
|
|
789
|
+
const brightenedBlockExists = await this.has(brightenedBlockId);
|
|
790
|
+
if (!brightenedBlockExists) {
|
|
791
|
+
await this.setData(brightenedBlock);
|
|
792
|
+
}
|
|
793
|
+
// Get the random block IDs as hex strings
|
|
794
|
+
const randomBlockIds = randomBlockChecksums.map((checksum) => checksum.toHex());
|
|
795
|
+
return {
|
|
796
|
+
brightenedBlockId,
|
|
797
|
+
randomBlockIds,
|
|
798
|
+
originalBlockId: keyHex,
|
|
799
|
+
};
|
|
800
|
+
}
|
|
801
|
+
}
|
|
802
|
+
exports.DiskBlockAsyncStore = DiskBlockAsyncStore;
|
|
803
|
+
//# sourceMappingURL=diskBlockAsyncStore.js.map
|