@brightchain/brightchain-lib 0.30.1 → 0.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -5
- package/package.json +4 -4
- package/src/browser.d.ts +7 -0
- package/src/browser.d.ts.map +1 -1
- package/src/browser.js +21 -1
- package/src/browser.js.map +1 -1
- package/src/lib/asset/assetAccount.d.ts +66 -0
- package/src/lib/asset/assetAccount.d.ts.map +1 -0
- package/src/lib/asset/assetAccount.js +192 -0
- package/src/lib/asset/assetAccount.js.map +1 -0
- package/src/lib/asset/formatAssetAmount.d.ts +30 -0
- package/src/lib/asset/formatAssetAmount.d.ts.map +1 -0
- package/src/lib/asset/formatAssetAmount.js +54 -0
- package/src/lib/asset/formatAssetAmount.js.map +1 -0
- package/src/lib/asset/index.d.ts +11 -0
- package/src/lib/asset/index.d.ts.map +1 -0
- package/src/lib/asset/index.js +14 -0
- package/src/lib/asset/index.js.map +1 -0
- package/src/lib/asset/jouleConstants.d.ts +21 -0
- package/src/lib/asset/jouleConstants.d.ts.map +1 -0
- package/src/lib/asset/jouleConstants.js +24 -0
- package/src/lib/asset/jouleConstants.js.map +1 -0
- package/src/lib/asset/microunits.d.ts +19 -0
- package/src/lib/asset/microunits.d.ts.map +1 -0
- package/src/lib/asset/microunits.js +36 -0
- package/src/lib/asset/microunits.js.map +1 -0
- package/src/lib/constants.d.ts +3 -1
- package/src/lib/constants.d.ts.map +1 -1
- package/src/lib/constants.js +23 -1
- package/src/lib/constants.js.map +1 -1
- package/src/lib/db/driverBackedHeadRegistry.d.ts +42 -0
- package/src/lib/db/driverBackedHeadRegistry.d.ts.map +1 -0
- package/src/lib/db/driverBackedHeadRegistry.js +146 -0
- package/src/lib/db/driverBackedHeadRegistry.js.map +1 -0
- package/src/lib/db/headRegistryGossipTransport.d.ts +74 -0
- package/src/lib/db/headRegistryGossipTransport.d.ts.map +1 -0
- package/src/lib/db/headRegistryGossipTransport.js +153 -0
- package/src/lib/db/headRegistryGossipTransport.js.map +1 -0
- package/src/lib/db/inMemoryHeadRegistry.d.ts +9 -0
- package/src/lib/db/inMemoryHeadRegistry.d.ts.map +1 -1
- package/src/lib/db/inMemoryHeadRegistry.js +48 -0
- package/src/lib/db/inMemoryHeadRegistry.js.map +1 -1
- package/src/lib/db/inMemoryHeadRegistryDriver.d.ts +13 -0
- package/src/lib/db/inMemoryHeadRegistryDriver.d.ts.map +1 -0
- package/src/lib/db/inMemoryHeadRegistryDriver.js +24 -0
- package/src/lib/db/inMemoryHeadRegistryDriver.js.map +1 -0
- package/src/lib/db/index.d.ts +3 -0
- package/src/lib/db/index.d.ts.map +1 -1
- package/src/lib/db/index.js +3 -0
- package/src/lib/db/index.js.map +1 -1
- package/src/lib/energyAccount.d.ts +15 -62
- package/src/lib/energyAccount.d.ts.map +1 -1
- package/src/lib/energyAccount.js +20 -118
- package/src/lib/energyAccount.js.map +1 -1
- package/src/lib/enumerations/brightChainStrings.d.ts +123 -0
- package/src/lib/enumerations/brightChainStrings.d.ts.map +1 -1
- package/src/lib/enumerations/brightChainStrings.js +130 -0
- package/src/lib/enumerations/brightChainStrings.js.map +1 -1
- package/src/lib/enumerations/difficultyTier.d.ts +20 -0
- package/src/lib/enumerations/difficultyTier.d.ts.map +1 -0
- package/src/lib/enumerations/difficultyTier.js +25 -0
- package/src/lib/enumerations/difficultyTier.js.map +1 -0
- package/src/lib/enumerations/index.d.ts +2 -1
- package/src/lib/enumerations/index.d.ts.map +1 -1
- package/src/lib/enumerations/index.js +3 -1
- package/src/lib/enumerations/index.js.map +1 -1
- package/src/lib/errors/asset/assetUnknownError.d.ts +12 -0
- package/src/lib/errors/asset/assetUnknownError.d.ts.map +1 -0
- package/src/lib/errors/asset/assetUnknownError.js +21 -0
- package/src/lib/errors/asset/assetUnknownError.js.map +1 -0
- package/src/lib/errors/asset/index.d.ts +13 -0
- package/src/lib/errors/asset/index.d.ts.map +1 -0
- package/src/lib/errors/asset/index.js +16 -0
- package/src/lib/errors/asset/index.js.map +1 -0
- package/src/lib/errors/asset/insufficientAvailableBalanceError.d.ts +13 -0
- package/src/lib/errors/asset/insufficientAvailableBalanceError.d.ts.map +1 -0
- package/src/lib/errors/asset/insufficientAvailableBalanceError.js +25 -0
- package/src/lib/errors/asset/insufficientAvailableBalanceError.js.map +1 -0
- package/src/lib/errors/asset/invalidAmountError.d.ts +11 -0
- package/src/lib/errors/asset/invalidAmountError.d.ts.map +1 -0
- package/src/lib/errors/asset/invalidAmountError.js +20 -0
- package/src/lib/errors/asset/invalidAmountError.js.map +1 -0
- package/src/lib/errors/asset/ledgerAlreadyAttachedError.d.ts +11 -0
- package/src/lib/errors/asset/ledgerAlreadyAttachedError.d.ts.map +1 -0
- package/src/lib/errors/asset/ledgerAlreadyAttachedError.js +19 -0
- package/src/lib/errors/asset/ledgerAlreadyAttachedError.js.map +1 -0
- package/src/lib/errors/asset/mixedAssetError.d.ts +12 -0
- package/src/lib/errors/asset/mixedAssetError.d.ts.map +1 -0
- package/src/lib/errors/asset/mixedAssetError.js +22 -0
- package/src/lib/errors/asset/mixedAssetError.js.map +1 -0
- package/src/lib/errors/asset/reservationExpiredError.d.ts +13 -0
- package/src/lib/errors/asset/reservationExpiredError.d.ts.map +1 -0
- package/src/lib/errors/asset/reservationExpiredError.js +24 -0
- package/src/lib/errors/asset/reservationExpiredError.js.map +1 -0
- package/src/lib/errors/asset/reservationNotFoundError.d.ts +11 -0
- package/src/lib/errors/asset/reservationNotFoundError.d.ts.map +1 -0
- package/src/lib/errors/asset/reservationNotFoundError.js +20 -0
- package/src/lib/errors/asset/reservationNotFoundError.js.map +1 -0
- package/src/lib/errors/encryptionErrors.d.ts.map +1 -1
- package/src/lib/errors/encryptionErrors.js.map +1 -1
- package/src/lib/errors/friendsServiceError.d.ts.map +1 -1
- package/src/lib/errors/friendsServiceError.js.map +1 -1
- package/src/lib/errors/index.d.ts +18 -0
- package/src/lib/errors/index.d.ts.map +1 -1
- package/src/lib/errors/index.js +21 -0
- package/src/lib/errors/index.js.map +1 -1
- package/src/lib/i18n/strings/englishUs.d.ts.map +1 -1
- package/src/lib/i18n/strings/englishUs.js +131 -1
- package/src/lib/i18n/strings/englishUs.js.map +1 -1
- package/src/lib/i18n/strings/french.d.ts.map +1 -1
- package/src/lib/i18n/strings/french.js +133 -3
- package/src/lib/i18n/strings/french.js.map +1 -1
- package/src/lib/i18n/strings/german.d.ts.map +1 -1
- package/src/lib/i18n/strings/german.js +131 -1
- package/src/lib/i18n/strings/german.js.map +1 -1
- package/src/lib/i18n/strings/japanese.d.ts.map +1 -1
- package/src/lib/i18n/strings/japanese.js +131 -1
- package/src/lib/i18n/strings/japanese.js.map +1 -1
- package/src/lib/i18n/strings/mandarin.d.ts.map +1 -1
- package/src/lib/i18n/strings/mandarin.js +131 -1
- package/src/lib/i18n/strings/mandarin.js.map +1 -1
- package/src/lib/i18n/strings/spanish.d.ts.map +1 -1
- package/src/lib/i18n/strings/spanish.js +131 -1
- package/src/lib/i18n/strings/spanish.js.map +1 -1
- package/src/lib/i18n/strings/ukrainian.d.ts.map +1 -1
- package/src/lib/i18n/strings/ukrainian.js +131 -1
- package/src/lib/i18n/strings/ukrainian.js.map +1 -1
- package/src/lib/index.d.ts +36 -1
- package/src/lib/index.d.ts.map +1 -1
- package/src/lib/index.js +48 -1
- package/src/lib/index.js.map +1 -1
- package/src/lib/interfaces/appSubsystemPlugin.d.ts +6 -1
- package/src/lib/interfaces/appSubsystemPlugin.d.ts.map +1 -1
- package/src/lib/interfaces/assetAccount.d.ts +91 -0
- package/src/lib/interfaces/assetAccount.d.ts.map +1 -0
- package/src/lib/interfaces/assetAccount.js +3 -0
- package/src/lib/interfaces/assetAccount.js.map +1 -0
- package/src/lib/interfaces/brightpass/vaultEntry.d.ts +38 -0
- package/src/lib/interfaces/brightpass/vaultEntry.d.ts.map +1 -1
- package/src/lib/interfaces/brightpass/vaultMetadata.d.ts +11 -0
- package/src/lib/interfaces/brightpass/vaultMetadata.d.ts.map +1 -1
- package/src/lib/interfaces/communication/chatStorageProvider.d.ts +1 -1
- package/src/lib/interfaces/communication/chatStorageProvider.d.ts.map +1 -1
- package/src/lib/interfaces/communication/index.d.ts +2 -0
- package/src/lib/interfaces/communication/index.d.ts.map +1 -1
- package/src/lib/interfaces/communication/index.js +2 -0
- package/src/lib/interfaces/communication/index.js.map +1 -1
- package/src/lib/interfaces/communication/server.d.ts +8 -0
- package/src/lib/interfaces/communication/server.d.ts.map +1 -1
- package/src/lib/interfaces/communication/serverIconConfig.d.ts +32 -0
- package/src/lib/interfaces/communication/serverIconConfig.d.ts.map +1 -0
- package/src/lib/interfaces/communication/serverIconConfig.js +35 -0
- package/src/lib/interfaces/communication/serverIconConfig.js.map +1 -0
- package/src/lib/interfaces/communication/serverIconRequest.d.ts +12 -0
- package/src/lib/interfaces/communication/serverIconRequest.d.ts.map +1 -0
- package/src/lib/interfaces/communication/serverIconRequest.js +3 -0
- package/src/lib/interfaces/communication/serverIconRequest.js.map +1 -0
- package/src/lib/interfaces/constants.d.ts +14 -0
- package/src/lib/interfaces/constants.d.ts.map +1 -1
- package/src/lib/interfaces/energyAccount.d.ts +13 -34
- package/src/lib/interfaces/energyAccount.d.ts.map +1 -1
- package/src/lib/interfaces/energyTransaction.d.ts +25 -6
- package/src/lib/interfaces/energyTransaction.d.ts.map +1 -1
- package/src/lib/interfaces/identity/brightChainIdentity.d.ts +29 -0
- package/src/lib/interfaces/identity/brightChainIdentity.d.ts.map +1 -0
- package/src/lib/interfaces/identity/brightChainIdentity.js +3 -0
- package/src/lib/interfaces/identity/brightChainIdentity.js.map +1 -0
- package/src/lib/interfaces/identity/index.d.ts +1 -0
- package/src/lib/interfaces/identity/index.d.ts.map +1 -1
- package/src/lib/interfaces/index.d.ts +5 -0
- package/src/lib/interfaces/index.d.ts.map +1 -1
- package/src/lib/interfaces/index.js +8 -0
- package/src/lib/interfaces/index.js.map +1 -1
- package/src/lib/interfaces/messaging/attachmentMetadata.d.ts +12 -0
- package/src/lib/interfaces/messaging/attachmentMetadata.d.ts.map +1 -1
- package/src/lib/interfaces/messaging/emailMetadata.d.ts +55 -0
- package/src/lib/interfaces/messaging/emailMetadata.d.ts.map +1 -1
- package/src/lib/interfaces/messaging/emailMetadata.js.map +1 -1
- package/src/lib/interfaces/pouw/challengeToken.d.ts +20 -0
- package/src/lib/interfaces/pouw/challengeToken.d.ts.map +1 -0
- package/src/lib/interfaces/pouw/challengeToken.js +3 -0
- package/src/lib/interfaces/pouw/challengeToken.js.map +1 -0
- package/src/lib/interfaces/pouw/index.d.ts +8 -0
- package/src/lib/interfaces/pouw/index.d.ts.map +1 -0
- package/src/lib/interfaces/pouw/index.js +12 -0
- package/src/lib/interfaces/pouw/index.js.map +1 -0
- package/src/lib/interfaces/pouw/pouwConfig.d.ts +91 -0
- package/src/lib/interfaces/pouw/pouwConfig.d.ts.map +1 -0
- package/src/lib/interfaces/pouw/pouwConfig.js +24 -0
- package/src/lib/interfaces/pouw/pouwConfig.js.map +1 -0
- package/src/lib/interfaces/pouw/pouwMetrics.d.ts +23 -0
- package/src/lib/interfaces/pouw/pouwMetrics.d.ts.map +1 -0
- package/src/lib/interfaces/pouw/pouwMetrics.js +3 -0
- package/src/lib/interfaces/pouw/pouwMetrics.js.map +1 -0
- package/src/lib/interfaces/pouw/workResult.d.ts +19 -0
- package/src/lib/interfaces/pouw/workResult.d.ts.map +1 -0
- package/src/lib/interfaces/pouw/workResult.js +3 -0
- package/src/lib/interfaces/pouw/workResult.js.map +1 -0
- package/src/lib/interfaces/pouw/workUnit.d.ts +48 -0
- package/src/lib/interfaces/pouw/workUnit.d.ts.map +1 -0
- package/src/lib/interfaces/pouw/workUnit.js +14 -0
- package/src/lib/interfaces/pouw/workUnit.js.map +1 -0
- package/src/lib/interfaces/responses/adminDashboardResponse.d.ts +7 -0
- package/src/lib/interfaces/responses/adminDashboardResponse.d.ts.map +1 -1
- package/src/lib/interfaces/responses/communicationResponses.d.ts +2 -0
- package/src/lib/interfaces/responses/communicationResponses.d.ts.map +1 -1
- package/src/lib/interfaces/responses/identityResponseData.d.ts +10 -0
- package/src/lib/interfaces/responses/identityResponseData.d.ts.map +1 -0
- package/src/lib/interfaces/responses/identityResponseData.js +3 -0
- package/src/lib/interfaces/responses/identityResponseData.js.map +1 -0
- package/src/lib/interfaces/responses/index.d.ts +1 -0
- package/src/lib/interfaces/responses/index.d.ts.map +1 -1
- package/src/lib/interfaces/staging/commitRequest.d.ts +28 -0
- package/src/lib/interfaces/staging/commitRequest.d.ts.map +1 -0
- package/src/lib/interfaces/staging/commitRequest.js +3 -0
- package/src/lib/interfaces/staging/commitRequest.js.map +1 -0
- package/src/lib/interfaces/staging/commitResponse.d.ts +17 -0
- package/src/lib/interfaces/staging/commitResponse.d.ts.map +1 -0
- package/src/lib/interfaces/staging/commitResponse.js +3 -0
- package/src/lib/interfaces/staging/commitResponse.js.map +1 -0
- package/src/lib/interfaces/staging/index.d.ts +7 -0
- package/src/lib/interfaces/staging/index.d.ts.map +1 -0
- package/src/lib/interfaces/staging/index.js +6 -0
- package/src/lib/interfaces/staging/index.js.map +1 -0
- package/src/lib/interfaces/staging/processingParams.d.ts +16 -0
- package/src/lib/interfaces/staging/processingParams.d.ts.map +1 -0
- package/src/lib/interfaces/staging/processingParams.js +3 -0
- package/src/lib/interfaces/staging/processingParams.js.map +1 -0
- package/src/lib/interfaces/staging/stagedFileRecord.d.ts +23 -0
- package/src/lib/interfaces/staging/stagedFileRecord.d.ts.map +1 -0
- package/src/lib/interfaces/staging/stagedFileRecord.js +3 -0
- package/src/lib/interfaces/staging/stagedFileRecord.js.map +1 -0
- package/src/lib/interfaces/staging/stagingConfig.d.ts +19 -0
- package/src/lib/interfaces/staging/stagingConfig.d.ts.map +1 -0
- package/src/lib/interfaces/staging/stagingConfig.js +11 -0
- package/src/lib/interfaces/staging/stagingConfig.js.map +1 -0
- package/src/lib/interfaces/staging/tempUploadResponse.d.ts +19 -0
- package/src/lib/interfaces/staging/tempUploadResponse.d.ts.map +1 -0
- package/src/lib/interfaces/staging/tempUploadResponse.js +3 -0
- package/src/lib/interfaces/staging/tempUploadResponse.js.map +1 -0
- package/src/lib/interfaces/storage/blockStore.d.ts +22 -4
- package/src/lib/interfaces/storage/blockStore.d.ts.map +1 -1
- package/src/lib/interfaces/storage/headRegistry.d.ts +38 -0
- package/src/lib/interfaces/storage/headRegistry.d.ts.map +1 -1
- package/src/lib/interfaces/storage/headRegistryDriver.d.ts +47 -0
- package/src/lib/interfaces/storage/headRegistryDriver.d.ts.map +1 -0
- package/src/lib/interfaces/storage/headRegistryDriver.js +15 -0
- package/src/lib/interfaces/storage/headRegistryDriver.js.map +1 -0
- package/src/lib/interfaces/storage/index.d.ts +1 -0
- package/src/lib/interfaces/storage/index.d.ts.map +1 -1
- package/src/lib/interfaces/storage/index.js.map +1 -1
- package/src/lib/joule/formatJoule.d.ts +44 -0
- package/src/lib/joule/formatJoule.d.ts.map +1 -0
- package/src/lib/joule/formatJoule.js +121 -0
- package/src/lib/joule/formatJoule.js.map +1 -0
- package/src/lib/joule/index.d.ts +10 -0
- package/src/lib/joule/index.d.ts.map +1 -0
- package/src/lib/joule/index.js +13 -0
- package/src/lib/joule/index.js.map +1 -0
- package/src/lib/joule/jouleConstants.d.ts +13 -0
- package/src/lib/joule/jouleConstants.d.ts.map +1 -0
- package/src/lib/joule/jouleConstants.js +18 -0
- package/src/lib/joule/jouleConstants.js.map +1 -0
- package/src/lib/joule/rateTable.d.ts +55 -0
- package/src/lib/joule/rateTable.d.ts.map +1 -0
- package/src/lib/joule/rateTable.js +58 -0
- package/src/lib/joule/rateTable.js.map +1 -0
- package/src/lib/joule/resourceClass.d.ts +18 -0
- package/src/lib/joule/resourceClass.d.ts.map +1 -0
- package/src/lib/joule/resourceClass.js +28 -0
- package/src/lib/joule/resourceClass.js.map +1 -0
- package/src/lib/operationCost.d.ts +12 -7
- package/src/lib/operationCost.d.ts.map +1 -1
- package/src/lib/operationCost.js +11 -4
- package/src/lib/operationCost.js.map +1 -1
- package/src/lib/pouw/computeWorkUnit.d.ts +41 -0
- package/src/lib/pouw/computeWorkUnit.d.ts.map +1 -0
- package/src/lib/pouw/computeWorkUnit.js +92 -0
- package/src/lib/pouw/computeWorkUnit.js.map +1 -0
- package/src/lib/pouw/index.d.ts +8 -0
- package/src/lib/pouw/index.d.ts.map +1 -0
- package/src/lib/pouw/index.js +12 -0
- package/src/lib/pouw/index.js.map +1 -0
- package/src/lib/serializers/index.d.ts +2 -0
- package/src/lib/serializers/index.d.ts.map +1 -0
- package/src/lib/serializers/index.js +10 -0
- package/src/lib/serializers/index.js.map +1 -0
- package/src/lib/serializers/workUnitSerializer.d.ts +39 -0
- package/src/lib/serializers/workUnitSerializer.d.ts.map +1 -0
- package/src/lib/serializers/workUnitSerializer.js +150 -0
- package/src/lib/serializers/workUnitSerializer.js.map +1 -0
- package/src/lib/services/communication/__tests__/mockChatStorageProvider.d.ts +1 -1
- package/src/lib/services/communication/__tests__/mockChatStorageProvider.d.ts.map +1 -1
- package/src/lib/services/communication/__tests__/mockChatStorageProvider.js +5 -3
- package/src/lib/services/communication/__tests__/mockChatStorageProvider.js.map +1 -1
- package/src/lib/services/communication/__tests__/mockStorageProvider.d.ts +6 -0
- package/src/lib/services/communication/__tests__/mockStorageProvider.d.ts.map +1 -0
- package/src/lib/services/communication/__tests__/mockStorageProvider.js +41 -0
- package/src/lib/services/communication/__tests__/mockStorageProvider.js.map +1 -0
- package/src/lib/services/communication/channelService.d.ts +1 -1
- package/src/lib/services/communication/channelService.d.ts.map +1 -1
- package/src/lib/services/communication/channelService.js +2 -2
- package/src/lib/services/communication/channelService.js.map +1 -1
- package/src/lib/services/communication/conversationService.d.ts +1 -1
- package/src/lib/services/communication/conversationService.d.ts.map +1 -1
- package/src/lib/services/communication/conversationService.js +2 -2
- package/src/lib/services/communication/conversationService.js.map +1 -1
- package/src/lib/services/communication/groupService.d.ts +1 -1
- package/src/lib/services/communication/groupService.d.ts.map +1 -1
- package/src/lib/services/communication/groupService.js +2 -2
- package/src/lib/services/communication/groupService.js.map +1 -1
- package/src/lib/services/communication/rehydrationHelpers.d.ts.map +1 -1
- package/src/lib/services/communication/rehydrationHelpers.js +1 -2
- package/src/lib/services/communication/rehydrationHelpers.js.map +1 -1
- package/src/lib/services/communication/serverService.d.ts +13 -115
- package/src/lib/services/communication/serverService.d.ts.map +1 -1
- package/src/lib/services/communication/serverService.js +91 -235
- package/src/lib/services/communication/serverService.js.map +1 -1
- package/src/lib/services/copyOnWrite.service.d.ts.map +1 -1
- package/src/lib/services/copyOnWrite.service.js +1 -2
- package/src/lib/services/copyOnWrite.service.js.map +1 -1
- package/src/lib/services/messaging/emailMessageService.d.ts +89 -0
- package/src/lib/services/messaging/emailMessageService.d.ts.map +1 -1
- package/src/lib/services/messaging/emailMessageService.js +207 -28
- package/src/lib/services/messaging/emailMessageService.js.map +1 -1
- package/src/lib/services/messaging/emailParser.d.ts.map +1 -1
- package/src/lib/services/messaging/emailParser.js +1 -0
- package/src/lib/services/messaging/emailParser.js.map +1 -1
- package/src/lib/stores/assetAccountStore.d.ts +102 -0
- package/src/lib/stores/assetAccountStore.d.ts.map +1 -0
- package/src/lib/stores/assetAccountStore.js +276 -0
- package/src/lib/stores/assetAccountStore.js.map +1 -0
- package/src/lib/stores/blockStoreAdapter.d.ts +2 -0
- package/src/lib/stores/blockStoreAdapter.d.ts.map +1 -1
- package/src/lib/stores/blockStoreAdapter.js +3 -0
- package/src/lib/stores/blockStoreAdapter.js.map +1 -1
- package/src/lib/stores/energyAccountStore.d.ts +22 -36
- package/src/lib/stores/energyAccountStore.d.ts.map +1 -1
- package/src/lib/stores/energyAccountStore.js +33 -63
- package/src/lib/stores/energyAccountStore.js.map +1 -1
- package/src/lib/stores/memoryBlockStore.d.ts +16 -1
- package/src/lib/stores/memoryBlockStore.d.ts.map +1 -1
- package/src/lib/stores/memoryBlockStore.js +42 -6
- package/src/lib/stores/memoryBlockStore.js.map +1 -1
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
* Requirements: 1.1-1.10
|
|
19
19
|
*/
|
|
20
20
|
import { MessageEncryptionScheme } from '../../enumerations/messaging/messageEncryptionScheme';
|
|
21
|
+
import { SpamClassification } from '../../enumerations/messaging/spamClassification';
|
|
21
22
|
import type { IGossipService } from '../../interfaces/availability/gossipService';
|
|
22
23
|
import type { IAttachmentMetadata } from '../../interfaces/messaging/attachmentMetadata';
|
|
23
24
|
import type { IMailbox } from '../../interfaces/messaging/emailAddress';
|
|
@@ -98,6 +99,18 @@ export interface IEmailServiceConfig {
|
|
|
98
99
|
* @see Requirement 3.2
|
|
99
100
|
*/
|
|
100
101
|
nodeId: string;
|
|
102
|
+
/**
|
|
103
|
+
* When `true`, all recipients (including those whose domain matches
|
|
104
|
+
* `canonicalDomain`) are treated as external and routed through the
|
|
105
|
+
* registered `ExternalEmailDispatcher` (e.g. SES / Postfix).
|
|
106
|
+
*
|
|
107
|
+
* Use this when the canonical domain is served by a real SMTP provider
|
|
108
|
+
* (such as AWS SES) rather than by BrightChain gossip delivery, so that
|
|
109
|
+
* same-domain users actually receive their email.
|
|
110
|
+
*
|
|
111
|
+
* @default false
|
|
112
|
+
*/
|
|
113
|
+
relayAllRecipientsExternally: boolean;
|
|
101
114
|
}
|
|
102
115
|
/**
|
|
103
116
|
* Default configuration values for EmailMessageService.
|
|
@@ -147,6 +160,18 @@ export interface IEmailInput {
|
|
|
147
160
|
htmlBody?: string;
|
|
148
161
|
/** Custom headers (X-* and other extension headers) */
|
|
149
162
|
customHeaders?: Map<string, string[]>;
|
|
163
|
+
/**
|
|
164
|
+
* Digital Burnbag vault container ID for email attachments.
|
|
165
|
+
* Pre-populated by InboundProcessor after creating a private vault.
|
|
166
|
+
* Stored in IEmailMetadata so the UI can construct per-attachment download links.
|
|
167
|
+
*/
|
|
168
|
+
vaultContainerId?: string;
|
|
169
|
+
/** Mail folder for this email (e.g. 'inbox', 'spam'). Defaults to 'inbox'. */
|
|
170
|
+
folder?: string;
|
|
171
|
+
/** Spam score from anti-spam engine (e.g. SpamAssassin). */
|
|
172
|
+
spamScore?: number;
|
|
173
|
+
/** Spam classification derived from score vs. configured thresholds. */
|
|
174
|
+
spamClassification?: SpamClassification;
|
|
150
175
|
/**
|
|
151
176
|
* Encryption scheme to use for this email.
|
|
152
177
|
* - NONE: No encryption (default)
|
|
@@ -245,6 +270,12 @@ export interface IAttachmentInput {
|
|
|
245
270
|
contentId?: string;
|
|
246
271
|
/** Whether this is an inline attachment (e.g., embedded image) */
|
|
247
272
|
inline?: boolean;
|
|
273
|
+
/**
|
|
274
|
+
* Digital Burnbag vault file ID for this attachment.
|
|
275
|
+
* Pre-populated by InboundProcessor after uploading to a private vault.
|
|
276
|
+
* Stored in the resulting IAttachmentMetadata for UI download links.
|
|
277
|
+
*/
|
|
278
|
+
vaultFileId?: string;
|
|
248
279
|
}
|
|
249
280
|
/**
|
|
250
281
|
* Result of sending an email.
|
|
@@ -315,6 +346,12 @@ export interface IInboxQuery {
|
|
|
315
346
|
subjectContains?: string;
|
|
316
347
|
/** Full-text search across subject and body */
|
|
317
348
|
searchText?: string;
|
|
349
|
+
/** Filter by folder (e.g. 'inbox', 'spam', 'sent'). */
|
|
350
|
+
folder?: string;
|
|
351
|
+
/** Filter by label/keyword tags. */
|
|
352
|
+
labels?: string[];
|
|
353
|
+
/** Filter by starred status. */
|
|
354
|
+
isStarred?: boolean;
|
|
318
355
|
/** Sort field */
|
|
319
356
|
sortBy?: 'date' | 'sender' | 'subject' | 'size';
|
|
320
357
|
/** Sort direction */
|
|
@@ -439,12 +476,43 @@ export interface IEmailMetadataStore {
|
|
|
439
476
|
* });
|
|
440
477
|
* ```
|
|
441
478
|
*/
|
|
479
|
+
/**
|
|
480
|
+
* Callback invoked once per `sendEmail` when external recipients are present.
|
|
481
|
+
* Implementations are responsible for relaying the message to a real
|
|
482
|
+
* outbound email transport (e.g. SES, Postfix). Local recipients (matching
|
|
483
|
+
* `canonicalDomain`) are filtered out by `EmailMessageService` before this
|
|
484
|
+
* callback fires.
|
|
485
|
+
*
|
|
486
|
+
* Recipients are exposed split by header field so the dispatcher can preserve
|
|
487
|
+
* RFC 5322 envelope semantics (To/CC are visible to all recipients; BCC is
|
|
488
|
+
* not). When no external recipients exist for a given field, that array is
|
|
489
|
+
* empty.
|
|
490
|
+
*/
|
|
491
|
+
export type ExternalEmailDispatcher = (input: {
|
|
492
|
+
messageId: string;
|
|
493
|
+
from: IMailbox;
|
|
494
|
+
externalTo: IMailbox[];
|
|
495
|
+
externalCc: IMailbox[];
|
|
496
|
+
externalBcc: IMailbox[];
|
|
497
|
+
subject: string;
|
|
498
|
+
textBody?: string;
|
|
499
|
+
htmlBody?: string;
|
|
500
|
+
}) => Promise<void> | void;
|
|
442
501
|
export declare class EmailMessageService {
|
|
443
502
|
private readonly messageCBLService;
|
|
444
503
|
private readonly metadataStore;
|
|
445
504
|
private readonly gossipService;
|
|
446
505
|
private readonly config;
|
|
506
|
+
private externalDispatcher?;
|
|
447
507
|
constructor(messageCBLService: MessageCBLService, metadataStore: IEmailMetadataStore, gossipService: IGossipService, config?: Partial<IEmailServiceConfig>);
|
|
508
|
+
/**
|
|
509
|
+
* Register a dispatcher that delivers messages destined for recipients
|
|
510
|
+
* outside the canonical domain to a real outbound email transport
|
|
511
|
+
* (e.g. SES, Postfix). The dispatcher is invoked once per `sendEmail`
|
|
512
|
+
* when at least one external recipient exists, with local recipients
|
|
513
|
+
* already filtered out.
|
|
514
|
+
*/
|
|
515
|
+
setExternalDispatcher(dispatcher: ExternalEmailDispatcher | undefined): void;
|
|
448
516
|
/**
|
|
449
517
|
* Sends an email message.
|
|
450
518
|
*
|
|
@@ -474,6 +542,20 @@ export declare class EmailMessageService {
|
|
|
474
542
|
* @see Requirement 15.4 - Auto-generate required headers
|
|
475
543
|
*/
|
|
476
544
|
sendEmail(email: IEmailInput): Promise<ISendEmailResult>;
|
|
545
|
+
/**
|
|
546
|
+
* Store an inbound email received from an external source.
|
|
547
|
+
*
|
|
548
|
+
* Identical to `sendEmail` up through metadata construction and storage,
|
|
549
|
+
* but deliberately skips the external-dispatch step so that inbound
|
|
550
|
+
* messages are never relayed back out through SES / Postfix.
|
|
551
|
+
*
|
|
552
|
+
* Use this from the InboundProcessor instead of `sendEmail()` to avoid
|
|
553
|
+
* creating a relay loop.
|
|
554
|
+
*
|
|
555
|
+
* @param email - Parsed inbound email input
|
|
556
|
+
* @returns Send result with messageId and brightchainMessageId
|
|
557
|
+
*/
|
|
558
|
+
receiveEmail(email: IEmailInput): Promise<ISendEmailResult>;
|
|
477
559
|
/**
|
|
478
560
|
* Retrieves email metadata by Message-ID.
|
|
479
561
|
*
|
|
@@ -628,6 +710,13 @@ export declare class EmailMessageService {
|
|
|
628
710
|
* @see Requirement 1.1 — detect external recipients
|
|
629
711
|
*/
|
|
630
712
|
private isExternalMailbox;
|
|
713
|
+
/**
|
|
714
|
+
* Collect all external recipients (To + CC + BCC) and hand them to the
|
|
715
|
+
* configured outbound dispatcher. Local recipients (matching
|
|
716
|
+
* `canonicalDomain`) are filtered out. Errors from the dispatcher are
|
|
717
|
+
* caught and logged so they cannot fail the BrightMail send pipeline.
|
|
718
|
+
*/
|
|
719
|
+
private dispatchExternalRecipients;
|
|
631
720
|
/**
|
|
632
721
|
* Partition an array of mailboxes into internal (canonical domain) and
|
|
633
722
|
* external (non-canonical domain) groups.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emailMessageService.d.ts","sourceRoot":"","sources":["../../../../../../brightchain-lib/src/lib/services/messaging/emailMessageService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAOH,OAAO,EAAE,uBAAuB,EAAE,MAAM,sDAAsD,CAAC;
|
|
1
|
+
{"version":3,"file":"emailMessageService.d.ts","sourceRoot":"","sources":["../../../../../../brightchain-lib/src/lib/services/messaging/emailMessageService.ts"],"names":[],"mappings":"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"}
|
|
@@ -47,46 +47,30 @@ exports.DEFAULT_EMAIL_SERVICE_CONFIG = {
|
|
|
47
47
|
maxRetryAttempts: 3,
|
|
48
48
|
deliveryTimeoutMs: 24 * 60 * 60 * 1000, // 24 hours
|
|
49
49
|
nodeId: 'localhost',
|
|
50
|
+
relayAllRecipientsExternally: false,
|
|
50
51
|
};
|
|
51
|
-
// ─── EmailMessageService Class ──────────────────────────────────────────────
|
|
52
|
-
/**
|
|
53
|
-
* Main service for email operations in the BrightChain messaging system.
|
|
54
|
-
*
|
|
55
|
-
* Coordinates parsing, validation, storage, and delivery of RFC 5322
|
|
56
|
-
* compliant email messages. This service acts as the primary entry point
|
|
57
|
-
* for all email-related operations.
|
|
58
|
-
*
|
|
59
|
-
* @see Design Document: EmailMessageService Class
|
|
60
|
-
* @see Requirements 1.1-1.10
|
|
61
|
-
*
|
|
62
|
-
* @example
|
|
63
|
-
* ```typescript
|
|
64
|
-
* const emailService = new EmailMessageService(
|
|
65
|
-
* messageCBLService,
|
|
66
|
-
* metadataStore,
|
|
67
|
-
* gossipService,
|
|
68
|
-
* config,
|
|
69
|
-
* );
|
|
70
|
-
*
|
|
71
|
-
* const result = await emailService.sendEmail({
|
|
72
|
-
* from: createMailbox('sender', 'example.com'),
|
|
73
|
-
* to: [createMailbox('recipient', 'example.com')],
|
|
74
|
-
* subject: 'Hello',
|
|
75
|
-
* textBody: 'Hello, World!',
|
|
76
|
-
* });
|
|
77
|
-
* ```
|
|
78
|
-
*/
|
|
79
52
|
class EmailMessageService {
|
|
80
53
|
messageCBLService;
|
|
81
54
|
metadataStore;
|
|
82
55
|
gossipService;
|
|
83
56
|
config;
|
|
57
|
+
externalDispatcher;
|
|
84
58
|
constructor(messageCBLService, metadataStore, gossipService, config) {
|
|
85
59
|
this.messageCBLService = messageCBLService;
|
|
86
60
|
this.metadataStore = metadataStore;
|
|
87
61
|
this.gossipService = gossipService;
|
|
88
62
|
this.config = { ...exports.DEFAULT_EMAIL_SERVICE_CONFIG, ...config };
|
|
89
63
|
}
|
|
64
|
+
/**
|
|
65
|
+
* Register a dispatcher that delivers messages destined for recipients
|
|
66
|
+
* outside the canonical domain to a real outbound email transport
|
|
67
|
+
* (e.g. SES, Postfix). The dispatcher is invoked once per `sendEmail`
|
|
68
|
+
* when at least one external recipient exists, with local recipients
|
|
69
|
+
* already filtered out.
|
|
70
|
+
*/
|
|
71
|
+
setExternalDispatcher(dispatcher) {
|
|
72
|
+
this.externalDispatcher = dispatcher;
|
|
73
|
+
}
|
|
90
74
|
// ─── Core Operations ────────────────────────────────────────────────
|
|
91
75
|
/**
|
|
92
76
|
* Sends an email message.
|
|
@@ -215,6 +199,8 @@ class EmailMessageService {
|
|
|
215
199
|
contentType,
|
|
216
200
|
customHeaders: email.customHeaders ?? new Map(),
|
|
217
201
|
parts: email.parts,
|
|
202
|
+
textBody: email.textBody,
|
|
203
|
+
htmlBody: email.htmlBody,
|
|
218
204
|
attachments: undefined,
|
|
219
205
|
deliveryReceipts: new Map(),
|
|
220
206
|
readReceipts: new Map(),
|
|
@@ -251,6 +237,16 @@ class EmailMessageService {
|
|
|
251
237
|
metadata.isSigned = result.encryptionMetadata.isSigned;
|
|
252
238
|
metadata.contentSignature = result.encryptionMetadata.signature;
|
|
253
239
|
metadata.signerPublicKey = result.encryptionMetadata.signerPublicKey;
|
|
240
|
+
// Store the encrypted bytes and clear plaintext for security
|
|
241
|
+
metadata.encryptedBody = result.encryptedContent;
|
|
242
|
+
metadata.textBody = undefined;
|
|
243
|
+
metadata.htmlBody = undefined;
|
|
244
|
+
if (metadata.parts) {
|
|
245
|
+
metadata.parts = metadata.parts.map((p) => ({
|
|
246
|
+
...p,
|
|
247
|
+
body: undefined,
|
|
248
|
+
}));
|
|
249
|
+
}
|
|
254
250
|
}
|
|
255
251
|
else if (email.encryptionScheme === messageEncryptionScheme_1.MessageEncryptionScheme.SHARED_KEY) {
|
|
256
252
|
// Symmetric encryption with shared key
|
|
@@ -260,6 +256,16 @@ class EmailMessageService {
|
|
|
260
256
|
const result = await encryptionService.encryptContentSymmetric(bodyContent, email.sharedKey);
|
|
261
257
|
metadata.encryptionIv = result.encryptionMetadata.iv;
|
|
262
258
|
metadata.encryptionAuthTag = result.encryptionMetadata.authTag;
|
|
259
|
+
// Store the encrypted bytes and clear plaintext for security
|
|
260
|
+
metadata.encryptedBody = result.encryptedContent;
|
|
261
|
+
metadata.textBody = undefined;
|
|
262
|
+
metadata.htmlBody = undefined;
|
|
263
|
+
if (metadata.parts) {
|
|
264
|
+
metadata.parts = metadata.parts.map((p) => ({
|
|
265
|
+
...p,
|
|
266
|
+
body: undefined,
|
|
267
|
+
}));
|
|
268
|
+
}
|
|
263
269
|
// Optionally sign
|
|
264
270
|
if (email.senderPrivateKey && email.senderPublicKey) {
|
|
265
271
|
const sig = await encryptionService.signContent(bodyContent, email.senderPrivateKey, email.senderPublicKey);
|
|
@@ -299,6 +305,16 @@ class EmailMessageService {
|
|
|
299
305
|
metadata.signerPublicKey =
|
|
300
306
|
result.encryptionMetadata.signerPublicKey;
|
|
301
307
|
}
|
|
308
|
+
// Store the encrypted bytes and clear plaintext for security
|
|
309
|
+
metadata.encryptedBody = result.encryptedContent;
|
|
310
|
+
metadata.textBody = undefined;
|
|
311
|
+
metadata.htmlBody = undefined;
|
|
312
|
+
if (metadata.parts) {
|
|
313
|
+
metadata.parts = metadata.parts.map((p) => ({
|
|
314
|
+
...p,
|
|
315
|
+
body: undefined,
|
|
316
|
+
}));
|
|
317
|
+
}
|
|
302
318
|
}
|
|
303
319
|
else if (!email.signMessage) {
|
|
304
320
|
// Fallback to legacy S/MIME stub if no real certs provided
|
|
@@ -317,6 +333,16 @@ class EmailMessageService {
|
|
|
317
333
|
metadata.contentSignature = result.encryptionMetadata.signature;
|
|
318
334
|
metadata.signerPublicKey =
|
|
319
335
|
result.encryptionMetadata.signerPublicKey;
|
|
336
|
+
// Store the encrypted bytes and clear plaintext for security
|
|
337
|
+
metadata.encryptedBody = result.encryptedContent;
|
|
338
|
+
metadata.textBody = undefined;
|
|
339
|
+
metadata.htmlBody = undefined;
|
|
340
|
+
if (metadata.parts) {
|
|
341
|
+
metadata.parts = metadata.parts.map((p) => ({
|
|
342
|
+
...p,
|
|
343
|
+
body: undefined,
|
|
344
|
+
}));
|
|
345
|
+
}
|
|
320
346
|
}
|
|
321
347
|
}
|
|
322
348
|
else if (email.encryptionScheme === messageEncryptionScheme_1.MessageEncryptionScheme.GPG) {
|
|
@@ -350,6 +376,16 @@ class EmailMessageService {
|
|
|
350
376
|
metadata.signerPublicKey =
|
|
351
377
|
result.encryptionMetadata.signerPublicKey;
|
|
352
378
|
}
|
|
379
|
+
// Store the encrypted bytes and clear plaintext for security
|
|
380
|
+
metadata.encryptedBody = result.encryptedContent;
|
|
381
|
+
metadata.textBody = undefined;
|
|
382
|
+
metadata.htmlBody = undefined;
|
|
383
|
+
if (metadata.parts) {
|
|
384
|
+
metadata.parts = metadata.parts.map((p) => ({
|
|
385
|
+
...p,
|
|
386
|
+
body: undefined,
|
|
387
|
+
}));
|
|
388
|
+
}
|
|
353
389
|
}
|
|
354
390
|
else {
|
|
355
391
|
throw new emailError_1.EmailError(emailErrorType_1.EmailErrorType.ENCRYPTION_FAILED, 'Recipient GPG public keys are required for GPG encryption');
|
|
@@ -451,6 +487,7 @@ class EmailMessageService {
|
|
|
451
487
|
catch (err) {
|
|
452
488
|
// Delivery errors are non-fatal - the email is stored, delivery can be retried
|
|
453
489
|
// Return success with empty delivery status
|
|
490
|
+
await this.dispatchExternalRecipients(email, messageId);
|
|
454
491
|
return {
|
|
455
492
|
messageId,
|
|
456
493
|
brightchainMessageId,
|
|
@@ -459,6 +496,9 @@ class EmailMessageService {
|
|
|
459
496
|
error: `Delivery initiation failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
460
497
|
};
|
|
461
498
|
}
|
|
499
|
+
// 5c. Hand off external recipients to the configured outbound transport
|
|
500
|
+
// (e.g. SES). Local recipients are filtered out by canonicalDomain.
|
|
501
|
+
await this.dispatchExternalRecipients(email, messageId);
|
|
462
502
|
// 6. Return result — gossip delivery is fire-and-forget; acks come later via gossip
|
|
463
503
|
return {
|
|
464
504
|
messageId,
|
|
@@ -467,6 +507,105 @@ class EmailMessageService {
|
|
|
467
507
|
success: true,
|
|
468
508
|
};
|
|
469
509
|
}
|
|
510
|
+
/**
|
|
511
|
+
* Store an inbound email received from an external source.
|
|
512
|
+
*
|
|
513
|
+
* Identical to `sendEmail` up through metadata construction and storage,
|
|
514
|
+
* but deliberately skips the external-dispatch step so that inbound
|
|
515
|
+
* messages are never relayed back out through SES / Postfix.
|
|
516
|
+
*
|
|
517
|
+
* Use this from the InboundProcessor instead of `sendEmail()` to avoid
|
|
518
|
+
* creating a relay loop.
|
|
519
|
+
*
|
|
520
|
+
* @param email - Parsed inbound email input
|
|
521
|
+
* @returns Send result with messageId and brightchainMessageId
|
|
522
|
+
*/
|
|
523
|
+
async receiveEmail(email) {
|
|
524
|
+
const messageId = email.messageId ?? this.generateMessageId();
|
|
525
|
+
const date = email.date ?? new Date();
|
|
526
|
+
const brightchainMessageId = this.generateMessageId();
|
|
527
|
+
const now = new Date();
|
|
528
|
+
const allRecipientAddresses = [
|
|
529
|
+
...(email.to ?? []).map((m) => m.address),
|
|
530
|
+
...(email.cc ?? []).map((m) => m.address),
|
|
531
|
+
...(email.bcc ?? []).map((m) => m.address),
|
|
532
|
+
];
|
|
533
|
+
const contentType = email.contentType ??
|
|
534
|
+
(0, mimePart_1.createContentType)('text', 'plain', new Map([['charset', 'us-ascii']]));
|
|
535
|
+
const metadata = {
|
|
536
|
+
blockId: brightchainMessageId,
|
|
537
|
+
createdAt: now,
|
|
538
|
+
expiresAt: null,
|
|
539
|
+
durabilityLevel: durabilityLevel_1.DurabilityLevel.Standard,
|
|
540
|
+
parityBlockIds: [],
|
|
541
|
+
accessCount: 0,
|
|
542
|
+
lastAccessedAt: now,
|
|
543
|
+
replicationStatus: replicationStatus_1.ReplicationStatus.Pending,
|
|
544
|
+
targetReplicationFactor: 0,
|
|
545
|
+
replicaNodeIds: [],
|
|
546
|
+
size: (email.textBody ? new TextEncoder().encode(email.textBody).length : 0) +
|
|
547
|
+
(email.htmlBody ? new TextEncoder().encode(email.htmlBody).length : 0) +
|
|
548
|
+
(email.attachments
|
|
549
|
+
? email.attachments.reduce((sum, a) => sum + a.content.length, 0)
|
|
550
|
+
: 0),
|
|
551
|
+
checksum: '',
|
|
552
|
+
messageType: 'email',
|
|
553
|
+
senderId: email.from.address,
|
|
554
|
+
recipients: allRecipientAddresses,
|
|
555
|
+
priority: messagePriority_1.MessagePriority.NORMAL,
|
|
556
|
+
deliveryStatus: new Map(allRecipientAddresses.map((addr) => [addr, deliveryStatus_1.DeliveryStatus.Pending])),
|
|
557
|
+
acknowledgments: new Map(),
|
|
558
|
+
encryptionScheme: messageEncryptionScheme_1.MessageEncryptionScheme.NONE,
|
|
559
|
+
isCBL: false,
|
|
560
|
+
cblBlockIds: [brightchainMessageId],
|
|
561
|
+
from: email.from,
|
|
562
|
+
sender: email.sender,
|
|
563
|
+
replyTo: email.replyTo,
|
|
564
|
+
to: email.to ?? [],
|
|
565
|
+
cc: email.cc,
|
|
566
|
+
bcc: email.bcc,
|
|
567
|
+
messageId,
|
|
568
|
+
inReplyTo: email.inReplyTo,
|
|
569
|
+
references: email.references,
|
|
570
|
+
subject: email.subject,
|
|
571
|
+
date,
|
|
572
|
+
mimeVersion: '1.0',
|
|
573
|
+
contentType,
|
|
574
|
+
customHeaders: email.customHeaders ?? new Map(),
|
|
575
|
+
parts: email.parts,
|
|
576
|
+
textBody: email.textBody,
|
|
577
|
+
htmlBody: email.htmlBody,
|
|
578
|
+
vaultContainerId: email.vaultContainerId,
|
|
579
|
+
folder: email.folder ?? 'inbox',
|
|
580
|
+
spamScore: email.spamScore,
|
|
581
|
+
spamClassification: email.spamClassification,
|
|
582
|
+
isStarred: false,
|
|
583
|
+
attachments: undefined,
|
|
584
|
+
deliveryReceipts: new Map(),
|
|
585
|
+
readReceipts: new Map(),
|
|
586
|
+
};
|
|
587
|
+
if (email.attachments && email.attachments.length > 0) {
|
|
588
|
+
metadata.attachments = await Promise.all(email.attachments.map((attachment) => this.storeAttachment(attachment)));
|
|
589
|
+
}
|
|
590
|
+
try {
|
|
591
|
+
await this.metadataStore.store(metadata);
|
|
592
|
+
}
|
|
593
|
+
catch (err) {
|
|
594
|
+
return {
|
|
595
|
+
messageId,
|
|
596
|
+
brightchainMessageId,
|
|
597
|
+
deliveryStatus: new Map(),
|
|
598
|
+
success: false,
|
|
599
|
+
error: `Failed to store inbound email metadata: ${err instanceof Error ? err.message : String(err)}`,
|
|
600
|
+
};
|
|
601
|
+
}
|
|
602
|
+
return {
|
|
603
|
+
messageId,
|
|
604
|
+
brightchainMessageId,
|
|
605
|
+
deliveryStatus: new Map(),
|
|
606
|
+
success: true,
|
|
607
|
+
};
|
|
608
|
+
}
|
|
470
609
|
/**
|
|
471
610
|
* Retrieves email metadata by Message-ID.
|
|
472
611
|
*
|
|
@@ -938,10 +1077,49 @@ class EmailMessageService {
|
|
|
938
1077
|
* @see Requirement 1.1 — detect external recipients
|
|
939
1078
|
*/
|
|
940
1079
|
isExternalMailbox(mailbox) {
|
|
1080
|
+
if (this.config.relayAllRecipientsExternally) {
|
|
1081
|
+
return true;
|
|
1082
|
+
}
|
|
941
1083
|
const domain = mailbox.domain.toLowerCase();
|
|
942
1084
|
const canonical = this.config.canonicalDomain.toLowerCase();
|
|
943
1085
|
return domain !== canonical && !domain.endsWith(`.${canonical}`);
|
|
944
1086
|
}
|
|
1087
|
+
/**
|
|
1088
|
+
* Collect all external recipients (To + CC + BCC) and hand them to the
|
|
1089
|
+
* configured outbound dispatcher. Local recipients (matching
|
|
1090
|
+
* `canonicalDomain`) are filtered out. Errors from the dispatcher are
|
|
1091
|
+
* caught and logged so they cannot fail the BrightMail send pipeline.
|
|
1092
|
+
*/
|
|
1093
|
+
async dispatchExternalRecipients(email, messageId) {
|
|
1094
|
+
if (!this.externalDispatcher) {
|
|
1095
|
+
return;
|
|
1096
|
+
}
|
|
1097
|
+
const externalTo = this.partitionRecipients(email.to ?? []).external;
|
|
1098
|
+
const externalCc = this.partitionRecipients(email.cc ?? []).external;
|
|
1099
|
+
const externalBcc = this.partitionRecipients(email.bcc ?? []).external;
|
|
1100
|
+
if (externalTo.length === 0 &&
|
|
1101
|
+
externalCc.length === 0 &&
|
|
1102
|
+
externalBcc.length === 0) {
|
|
1103
|
+
return;
|
|
1104
|
+
}
|
|
1105
|
+
try {
|
|
1106
|
+
await this.externalDispatcher({
|
|
1107
|
+
messageId,
|
|
1108
|
+
from: email.from,
|
|
1109
|
+
externalTo,
|
|
1110
|
+
externalCc,
|
|
1111
|
+
externalBcc,
|
|
1112
|
+
subject: email.subject ?? '',
|
|
1113
|
+
textBody: email.textBody,
|
|
1114
|
+
htmlBody: email.htmlBody,
|
|
1115
|
+
});
|
|
1116
|
+
}
|
|
1117
|
+
catch (err) {
|
|
1118
|
+
// Outbound transport failures are non-fatal for the BrightMail send.
|
|
1119
|
+
// Log so operators can diagnose; the message is already stored locally.
|
|
1120
|
+
console.error(`[email] external dispatcher failed for messageId=${messageId}:`, err);
|
|
1121
|
+
}
|
|
1122
|
+
}
|
|
945
1123
|
/**
|
|
946
1124
|
* Partition an array of mailboxes into internal (canonical domain) and
|
|
947
1125
|
* external (non-canonical domain) groups.
|
|
@@ -1137,6 +1315,7 @@ class EmailMessageService {
|
|
|
1137
1315
|
blockIds: [blockId],
|
|
1138
1316
|
checksum: sha256Checksum,
|
|
1139
1317
|
contentMd5: md5Checksum,
|
|
1318
|
+
vaultFileId: input.vaultFileId,
|
|
1140
1319
|
};
|
|
1141
1320
|
}
|
|
1142
1321
|
// ─── Message-ID Generation ────────────────────────────────────────────
|