@brightchain/brightchain-api-lib 0.23.21 → 0.24.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/package.json +5 -5
- package/src/lib/__tests__/fixtures/mock-backend-brightchain-member.d.ts.map +1 -1
- package/src/lib/__tests__/fixtures/mock-backend-brightchain-member.js +11 -0
- package/src/lib/__tests__/fixtures/mock-backend-brightchain-member.js.map +1 -1
- package/src/lib/__tests__/fixtures/mocked-model.js +63 -60
- package/src/lib/__tests__/fixtures/mocked-model.js.map +1 -1
- package/src/lib/application.d.ts +1 -1
- package/src/lib/application.d.ts.map +1 -1
- package/src/lib/application.js +113 -33
- package/src/lib/application.js.map +1 -1
- package/src/lib/auth/aclEnforcedAvailability.js +4 -0
- package/src/lib/auth/aclEnforcedAvailability.js.map +1 -1
- package/src/lib/auth/aclEnforcedBlockStore.js +7 -0
- package/src/lib/auth/aclEnforcedBlockStore.js.map +1 -1
- package/src/lib/auth/ecdsaNodeAuthenticator.js +1 -0
- package/src/lib/auth/ecdsaNodeAuthenticator.js.map +1 -1
- package/src/lib/auth/poolAclBootstrap.js +2 -0
- package/src/lib/auth/poolAclBootstrap.js.map +1 -1
- package/src/lib/auth/poolAclStore.js +2 -1
- package/src/lib/auth/poolAclStore.js.map +1 -1
- package/src/lib/auth/poolAclUpdater.js +4 -0
- package/src/lib/auth/poolAclUpdater.js.map +1 -1
- package/src/lib/availability/availabilityMetrics.js +43 -45
- package/src/lib/availability/availabilityMetrics.js.map +1 -1
- package/src/lib/availability/availabilityService.js +26 -20
- package/src/lib/availability/availabilityService.js.map +1 -1
- package/src/lib/availability/blockRegistry.js +46 -25
- package/src/lib/availability/blockRegistry.js.map +1 -1
- package/src/lib/availability/discoveryProtocol.js +10 -8
- package/src/lib/availability/discoveryProtocol.js.map +1 -1
- package/src/lib/availability/gossipService.js +56 -45
- package/src/lib/availability/gossipService.js.map +1 -1
- package/src/lib/availability/heartbeatMonitor.js +22 -20
- package/src/lib/availability/heartbeatMonitor.js.map +1 -1
- package/src/lib/availability/poolDiscoveryService.js +7 -1
- package/src/lib/availability/poolDiscoveryService.js.map +1 -1
- package/src/lib/availability/quorumGossipHandler.js +13 -6
- package/src/lib/availability/quorumGossipHandler.js.map +1 -1
- package/src/lib/availability/reconciliationService.js +18 -12
- package/src/lib/availability/reconciliationService.js.map +1 -1
- package/src/lib/blockFetch/blockFetcher.js +14 -8
- package/src/lib/blockFetch/blockFetcher.js.map +1 -1
- package/src/lib/blockFetch/fetchQueue.js +9 -7
- package/src/lib/blockFetch/fetchQueue.js.map +1 -1
- package/src/lib/blockFetch/httpBlockFetchTransport.js +2 -0
- package/src/lib/blockFetch/httpBlockFetchTransport.js.map +1 -1
- package/src/lib/browserKeyring.js +5 -2
- package/src/lib/browserKeyring.js.map +1 -1
- package/src/lib/controllers/api/blocks.d.ts.map +1 -1
- package/src/lib/controllers/api/blocks.js +9 -3
- package/src/lib/controllers/api/blocks.js.map +1 -1
- package/src/lib/controllers/api/brighthub/connectionController.d.ts +80 -0
- package/src/lib/controllers/api/brighthub/connectionController.d.ts.map +1 -0
- package/src/lib/controllers/api/brighthub/connectionController.js +890 -0
- package/src/lib/controllers/api/brighthub/connectionController.js.map +1 -0
- package/src/lib/controllers/api/brighthub/index.d.ts +9 -0
- package/src/lib/controllers/api/brighthub/index.d.ts.map +1 -0
- package/src/lib/controllers/api/brighthub/index.js +12 -0
- package/src/lib/controllers/api/brighthub/index.js.map +1 -0
- package/src/lib/controllers/api/brighthub/messagingController.d.ts +84 -0
- package/src/lib/controllers/api/brighthub/messagingController.d.ts.map +1 -0
- package/src/lib/controllers/api/brighthub/messagingController.js +1077 -0
- package/src/lib/controllers/api/brighthub/messagingController.js.map +1 -0
- package/src/lib/controllers/api/brighthub/notificationController.d.ts +89 -0
- package/src/lib/controllers/api/brighthub/notificationController.d.ts.map +1 -0
- package/src/lib/controllers/api/brighthub/notificationController.js +444 -0
- package/src/lib/controllers/api/brighthub/notificationController.js.map +1 -0
- package/src/lib/controllers/api/brighthub/postController.d.ts +75 -0
- package/src/lib/controllers/api/brighthub/postController.d.ts.map +1 -0
- package/src/lib/controllers/api/brighthub/postController.js +388 -0
- package/src/lib/controllers/api/brighthub/postController.js.map +1 -0
- package/src/lib/controllers/api/brighthub/timelineController.d.ts +74 -0
- package/src/lib/controllers/api/brighthub/timelineController.d.ts.map +1 -0
- package/src/lib/controllers/api/brighthub/timelineController.js +418 -0
- package/src/lib/controllers/api/brighthub/timelineController.js.map +1 -0
- package/src/lib/controllers/api/brightpass.d.ts.map +1 -1
- package/src/lib/controllers/api/brightpass.js +46 -4
- package/src/lib/controllers/api/brightpass.js.map +1 -1
- package/src/lib/controllers/api/cbl.js +1 -0
- package/src/lib/controllers/api/cbl.js.map +1 -1
- package/src/lib/controllers/api/channels.js +2 -2
- package/src/lib/controllers/api/channels.js.map +1 -1
- package/src/lib/controllers/api/conversations.js +1 -1
- package/src/lib/controllers/api/conversations.js.map +1 -1
- package/src/lib/controllers/api/docs.js +2 -1
- package/src/lib/controllers/api/docs.js.map +1 -1
- package/src/lib/controllers/api/emails.d.ts.map +1 -1
- package/src/lib/controllers/api/emails.js +16 -2
- package/src/lib/controllers/api/emails.js.map +1 -1
- package/src/lib/controllers/api/explodingMessages.js +2 -4
- package/src/lib/controllers/api/explodingMessages.js.map +1 -1
- package/src/lib/controllers/api/groups.js +2 -2
- package/src/lib/controllers/api/groups.js.map +1 -1
- package/src/lib/controllers/api/health.d.ts +9 -2
- package/src/lib/controllers/api/health.d.ts.map +1 -1
- package/src/lib/controllers/api/health.js +48 -6
- package/src/lib/controllers/api/health.js.map +1 -1
- package/src/lib/controllers/api/index.d.ts +1 -0
- package/src/lib/controllers/api/index.d.ts.map +1 -1
- package/src/lib/controllers/api/index.js +1 -0
- package/src/lib/controllers/api/index.js.map +1 -1
- package/src/lib/controllers/api/introspection.js +2 -0
- package/src/lib/controllers/api/introspection.js.map +1 -1
- package/src/lib/controllers/api/messages.js +1 -1
- package/src/lib/controllers/api/messages.js.map +1 -1
- package/src/lib/controllers/api/nodes.js +6 -6
- package/src/lib/controllers/api/nodes.js.map +1 -1
- package/src/lib/controllers/api/quorum.d.ts +1 -1
- package/src/lib/controllers/api/quorum.d.ts.map +1 -1
- package/src/lib/controllers/api/quorum.js +3 -2
- package/src/lib/controllers/api/quorum.js.map +1 -1
- package/src/lib/controllers/api/scbl.js +3 -0
- package/src/lib/controllers/api/scbl.js.map +1 -1
- package/src/lib/controllers/api/sessions.d.ts +18 -2
- package/src/lib/controllers/api/sessions.d.ts.map +1 -1
- package/src/lib/controllers/api/sessions.js +60 -3
- package/src/lib/controllers/api/sessions.js.map +1 -1
- package/src/lib/controllers/api/sync.js +4 -4
- package/src/lib/controllers/api/sync.js.map +1 -1
- package/src/lib/controllers/api/user.d.ts +2 -0
- package/src/lib/controllers/api/user.d.ts.map +1 -1
- package/src/lib/controllers/api/user.js +95 -3
- package/src/lib/controllers/api/user.js.map +1 -1
- package/src/lib/controllers/identity/deviceController.js +2 -2
- package/src/lib/controllers/identity/deviceController.js.map +1 -1
- package/src/lib/controllers/identity/directoryController.js +1 -1
- package/src/lib/controllers/identity/directoryController.js.map +1 -1
- package/src/lib/controllers/identity/identityProofController.js +4 -6
- package/src/lib/controllers/identity/identityProofController.js.map +1 -1
- package/src/lib/databaseInit.d.ts +3 -3
- package/src/lib/databaseInit.js +5 -5
- package/src/lib/databaseInit.js.map +1 -1
- package/src/lib/datastore/block-document-store.d.ts.map +1 -1
- package/src/lib/datastore/block-document-store.js +18 -6
- package/src/lib/datastore/block-document-store.js.map +1 -1
- package/src/lib/datastore/document-store.d.ts.map +1 -1
- package/src/lib/datastore/memory-document-store.js +5 -2
- package/src/lib/datastore/memory-document-store.js.map +1 -1
- package/src/lib/encryption/encryptedMetadataService.js +2 -0
- package/src/lib/encryption/encryptedMetadataService.js.map +1 -1
- package/src/lib/encryption/encryptionAwareReplication.js +3 -0
- package/src/lib/encryption/encryptionAwareReplication.js.map +1 -1
- package/src/lib/encryption/errors.d.ts.map +1 -1
- package/src/lib/encryption/errors.js +8 -0
- package/src/lib/encryption/errors.js.map +1 -1
- package/src/lib/encryption/poolKeyManager.js +2 -0
- package/src/lib/encryption/poolKeyManager.js.map +1 -1
- package/src/lib/environment.js +10 -0
- package/src/lib/environment.js.map +1 -1
- package/src/lib/errors/express-validation.js +1 -0
- package/src/lib/errors/express-validation.js.map +1 -1
- package/src/lib/errors/invalid-backup-code-version.js +1 -0
- package/src/lib/errors/invalid-backup-code-version.js.map +1 -1
- package/src/lib/errors/memberIndexSchemaValidationError.js +1 -0
- package/src/lib/errors/memberIndexSchemaValidationError.js.map +1 -1
- package/src/lib/errors/missing-validated-data.js +2 -0
- package/src/lib/errors/missing-validated-data.js.map +1 -1
- package/src/lib/errors/token-not-found.js +1 -0
- package/src/lib/errors/token-not-found.js.map +1 -1
- package/src/lib/errors/typed-error-local.js +3 -0
- package/src/lib/errors/typed-error-local.js.map +1 -1
- package/src/lib/interfaces/brightpass/index.d.ts +103 -0
- package/src/lib/interfaces/brightpass/index.d.ts.map +1 -0
- package/src/lib/interfaces/brightpass/index.js +11 -0
- package/src/lib/interfaces/brightpass/index.js.map +1 -0
- package/src/lib/interfaces/environment.d.ts +1 -1
- package/src/lib/interfaces/environment.d.ts.map +1 -1
- package/src/lib/interfaces/index.d.ts +1 -0
- package/src/lib/interfaces/index.d.ts.map +1 -1
- package/src/lib/interfaces/member/memberProfileResponse.d.ts.map +1 -1
- package/src/lib/interfaces/member/operational.d.ts.map +1 -1
- package/src/lib/interfaces/member-init-config.d.ts +1 -1
- package/src/lib/interfaces/member-init-config.d.ts.map +1 -1
- package/src/lib/interfaces/responses/api-backup-codes-response.d.ts.map +1 -1
- package/src/lib/interfaces/responses/api-challenge-response.d.ts.map +1 -1
- package/src/lib/interfaces/responses/api-code-count-response.d.ts.map +1 -1
- package/src/lib/interfaces/responses/api-detailed-health-response.d.ts.map +1 -1
- package/src/lib/interfaces/responses/api-discover-block-response.d.ts.map +1 -1
- package/src/lib/interfaces/responses/api-express-validation-error.d.ts.map +1 -1
- package/src/lib/interfaces/responses/api-get-block-response.d.ts.map +1 -1
- package/src/lib/interfaces/responses/api-get-node-response.d.ts.map +1 -1
- package/src/lib/interfaces/responses/api-health-response.d.ts.map +1 -1
- package/src/lib/interfaces/responses/api-list-nodes-response.d.ts.map +1 -1
- package/src/lib/interfaces/responses/api-login-response.d.ts.map +1 -1
- package/src/lib/interfaces/responses/api-members-response.d.ts.map +1 -1
- package/src/lib/interfaces/responses/api-mnemonic-response.d.ts.map +1 -1
- package/src/lib/interfaces/responses/api-reconcile-response.d.ts.map +1 -1
- package/src/lib/interfaces/responses/api-register-node-response.d.ts.map +1 -1
- package/src/lib/interfaces/responses/api-registration-response.d.ts.map +1 -1
- package/src/lib/interfaces/responses/api-replicate-block-response.d.ts.map +1 -1
- package/src/lib/interfaces/responses/api-request-user-response.d.ts.map +1 -1
- package/src/lib/interfaces/responses/api-store-block-response.d.ts.map +1 -1
- package/src/lib/interfaces/responses/api-store-cbl-response.d.ts.map +1 -1
- package/src/lib/interfaces/responses/api-sync-request-response.d.ts.map +1 -1
- package/src/lib/interfaces/responses/brighthub/api-connection-response.d.ts +21 -0
- package/src/lib/interfaces/responses/brighthub/api-connection-response.d.ts.map +1 -0
- package/src/lib/interfaces/responses/brighthub/api-connection-response.js +3 -0
- package/src/lib/interfaces/responses/brighthub/api-connection-response.js.map +1 -0
- package/src/lib/interfaces/responses/brighthub/api-messaging-response.d.ts +39 -0
- package/src/lib/interfaces/responses/brighthub/api-messaging-response.d.ts.map +1 -0
- package/src/lib/interfaces/responses/brighthub/api-messaging-response.js +3 -0
- package/src/lib/interfaces/responses/brighthub/api-messaging-response.js.map +1 -0
- package/src/lib/interfaces/responses/brighthub/api-notification-response.d.ts +30 -0
- package/src/lib/interfaces/responses/brighthub/api-notification-response.d.ts.map +1 -0
- package/src/lib/interfaces/responses/brighthub/api-notification-response.js +3 -0
- package/src/lib/interfaces/responses/brighthub/api-notification-response.js.map +1 -0
- package/src/lib/interfaces/responses/brighthub/api-post-response.d.ts +21 -0
- package/src/lib/interfaces/responses/brighthub/api-post-response.d.ts.map +1 -0
- package/src/lib/interfaces/responses/brighthub/api-post-response.js +3 -0
- package/src/lib/interfaces/responses/brighthub/api-post-response.js.map +1 -0
- package/src/lib/interfaces/responses/brighthub/api-timeline-response.d.ts +14 -0
- package/src/lib/interfaces/responses/brighthub/api-timeline-response.d.ts.map +1 -0
- package/src/lib/interfaces/responses/brighthub/api-timeline-response.js +3 -0
- package/src/lib/interfaces/responses/brighthub/api-timeline-response.js.map +1 -0
- package/src/lib/interfaces/responses/brighthub/api-user-profile-response.d.ts +10 -0
- package/src/lib/interfaces/responses/brighthub/api-user-profile-response.d.ts.map +1 -0
- package/src/lib/interfaces/responses/brighthub/api-user-profile-response.js +3 -0
- package/src/lib/interfaces/responses/brighthub/api-user-profile-response.js.map +1 -0
- package/src/lib/interfaces/responses/brighthub/index.d.ts +13 -0
- package/src/lib/interfaces/responses/brighthub/index.d.ts.map +1 -0
- package/src/lib/interfaces/responses/brighthub/index.js +9 -0
- package/src/lib/interfaces/responses/brighthub/index.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/storage/storedDocumentTypes.d.ts +1 -1
- package/src/lib/interfaces/storage/storedDocumentTypes.js +1 -1
- package/src/lib/interfaces/storage/userRoleSchema.d.ts.map +1 -1
- package/src/lib/interfaces/storage/userRoleSchema.js +1 -3
- package/src/lib/interfaces/storage/userRoleSchema.js.map +1 -1
- package/src/lib/middlewares.js +31 -31
- package/src/lib/middlewares.js.map +1 -1
- package/src/lib/nodeKeyring.js +2 -0
- package/src/lib/nodeKeyring.js.map +1 -1
- package/src/lib/plugins/brightchain-database-plugin.d.ts +14 -14
- package/src/lib/plugins/brightchain-database-plugin.d.ts.map +1 -1
- package/src/lib/plugins/brightchain-database-plugin.js +36 -34
- package/src/lib/plugins/brightchain-database-plugin.js.map +1 -1
- package/src/lib/routers/api.d.ts +63 -1
- package/src/lib/routers/api.d.ts.map +1 -1
- package/src/lib/routers/api.js +126 -2
- package/src/lib/routers/api.js.map +1 -1
- package/src/lib/routers/app.d.ts.map +1 -1
- package/src/lib/routers/app.js +10 -1
- package/src/lib/routers/app.js.map +1 -1
- package/src/lib/routers/base.js +2 -0
- package/src/lib/routers/base.js.map +1 -1
- package/src/lib/routers/index.d.ts +1 -0
- package/src/lib/routers/index.d.ts.map +1 -1
- package/src/lib/routers/index.js +1 -0
- package/src/lib/routers/index.js.map +1 -1
- package/src/lib/routers/testEmailRouter.d.ts +15 -0
- package/src/lib/routers/testEmailRouter.d.ts.map +1 -0
- package/src/lib/routers/testEmailRouter.js +34 -0
- package/src/lib/routers/testEmailRouter.js.map +1 -0
- package/src/lib/secureEnclaveKeyring.js +4 -2
- package/src/lib/secureEnclaveKeyring.js.map +1 -1
- package/src/lib/services/auth.d.ts.map +1 -1
- package/src/lib/services/auth.js +11 -2
- package/src/lib/services/auth.js.map +1 -1
- package/src/lib/services/base.js +1 -0
- package/src/lib/services/base.js.map +1 -1
- package/src/lib/services/blockServiceFactory.js +2 -0
- package/src/lib/services/blockServiceFactory.js.map +1 -1
- package/src/lib/services/blockStore.js +3 -2
- package/src/lib/services/blockStore.js.map +1 -1
- package/src/lib/services/blocks.js +1 -0
- package/src/lib/services/blocks.js.map +1 -1
- package/src/lib/services/brightChainBackupCodeService.d.ts +114 -0
- package/src/lib/services/brightChainBackupCodeService.d.ts.map +1 -0
- package/src/lib/services/brightChainBackupCodeService.js +303 -0
- package/src/lib/services/brightChainBackupCodeService.js.map +1 -0
- package/src/lib/services/brightchain-authentication-provider.d.ts.map +1 -1
- package/src/lib/services/brightchain-authentication-provider.js +40 -9
- package/src/lib/services/brightchain-authentication-provider.js.map +1 -1
- package/src/lib/services/brightchain-member-init.service.d.ts +17 -17
- package/src/lib/services/brightchain-member-init.service.d.ts.map +1 -1
- package/src/lib/services/brightchain-member-init.service.js +12 -9
- package/src/lib/services/brightchain-member-init.service.js.map +1 -1
- package/src/lib/services/brighthub/connectionService.d.ts +286 -0
- package/src/lib/services/brighthub/connectionService.d.ts.map +1 -0
- package/src/lib/services/brighthub/connectionService.js +1887 -0
- package/src/lib/services/brighthub/connectionService.js.map +1 -0
- package/src/lib/services/brighthub/discoveryService.d.ts +110 -0
- package/src/lib/services/brighthub/discoveryService.d.ts.map +1 -0
- package/src/lib/services/brighthub/discoveryService.js +528 -0
- package/src/lib/services/brighthub/discoveryService.js.map +1 -0
- package/src/lib/services/brighthub/feedService.d.ts +141 -0
- package/src/lib/services/brighthub/feedService.d.ts.map +1 -0
- package/src/lib/services/brighthub/feedService.js +418 -0
- package/src/lib/services/brighthub/feedService.js.map +1 -0
- package/src/lib/services/brighthub/index.d.ts +11 -0
- package/src/lib/services/brighthub/index.d.ts.map +1 -0
- package/src/lib/services/brighthub/index.js +14 -0
- package/src/lib/services/brighthub/index.js.map +1 -0
- package/src/lib/services/brighthub/messagingService.d.ts +109 -0
- package/src/lib/services/brighthub/messagingService.d.ts.map +1 -0
- package/src/lib/services/brighthub/messagingService.js +947 -0
- package/src/lib/services/brighthub/messagingService.js.map +1 -0
- package/src/lib/services/brighthub/messagingService.test-helpers.d.ts +75 -0
- package/src/lib/services/brighthub/messagingService.test-helpers.d.ts.map +1 -0
- package/src/lib/services/brighthub/messagingService.test-helpers.js +237 -0
- package/src/lib/services/brighthub/messagingService.test-helpers.js.map +1 -0
- package/src/lib/services/brighthub/notificationService.d.ts +172 -0
- package/src/lib/services/brighthub/notificationService.d.ts.map +1 -0
- package/src/lib/services/brighthub/notificationService.js +768 -0
- package/src/lib/services/brighthub/notificationService.js.map +1 -0
- package/src/lib/services/brighthub/notificationService.test-helpers.d.ts +75 -0
- package/src/lib/services/brighthub/notificationService.test-helpers.d.ts.map +1 -0
- package/src/lib/services/brighthub/notificationService.test-helpers.js +230 -0
- package/src/lib/services/brighthub/notificationService.test-helpers.js.map +1 -0
- package/src/lib/services/brighthub/postService.d.ts +129 -0
- package/src/lib/services/brighthub/postService.d.ts.map +1 -0
- package/src/lib/services/brighthub/postService.js +470 -0
- package/src/lib/services/brighthub/postService.js.map +1 -0
- package/src/lib/services/brighthub/postService.test-helpers.d.ts +40 -0
- package/src/lib/services/brighthub/postService.test-helpers.d.ts.map +1 -0
- package/src/lib/services/brighthub/postService.test-helpers.js +84 -0
- package/src/lib/services/brighthub/postService.test-helpers.js.map +1 -0
- package/src/lib/services/brighthub/textFormatter.d.ts +64 -0
- package/src/lib/services/brighthub/textFormatter.d.ts.map +1 -0
- package/src/lib/services/brighthub/textFormatter.js +256 -0
- package/src/lib/services/brighthub/textFormatter.js.map +1 -0
- package/src/lib/services/brighthub/threadService.d.ts +79 -0
- package/src/lib/services/brighthub/threadService.d.ts.map +1 -0
- package/src/lib/services/brighthub/threadService.js +246 -0
- package/src/lib/services/brighthub/threadService.js.map +1 -0
- package/src/lib/services/brighthub/userProfileService.d.ts +203 -0
- package/src/lib/services/brighthub/userProfileService.d.ts.map +1 -0
- package/src/lib/services/brighthub/userProfileService.js +868 -0
- package/src/lib/services/brighthub/userProfileService.js.map +1 -0
- package/src/lib/services/brighthub/userProfileService.test-helpers.d.ts +86 -0
- package/src/lib/services/brighthub/userProfileService.test-helpers.d.ts.map +1 -0
- package/src/lib/services/brighthub/userProfileService.test-helpers.js +169 -0
- package/src/lib/services/brighthub/userProfileService.test-helpers.js.map +1 -0
- package/src/lib/services/brighthub/webSocketServer.d.ts +68 -0
- package/src/lib/services/brighthub/webSocketServer.d.ts.map +1 -0
- package/src/lib/services/brighthub/webSocketServer.js +194 -0
- package/src/lib/services/brighthub/webSocketServer.js.map +1 -0
- package/src/lib/services/brightpass/auditLogger.js +10 -5
- package/src/lib/services/brightpass/auditLogger.js.map +1 -1
- package/src/lib/services/brightpass/vaultEncryption.js +8 -8
- package/src/lib/services/brightpass/vaultEncryption.js.map +1 -1
- package/src/lib/services/brightpass.js +16 -8
- package/src/lib/services/brightpass.js.map +1 -1
- package/src/lib/services/cliOperatorPrompt.js +5 -2
- package/src/lib/services/cliOperatorPrompt.js.map +1 -1
- package/src/lib/services/clientWebSocketServer.d.ts +69 -4
- package/src/lib/services/clientWebSocketServer.d.ts.map +1 -1
- package/src/lib/services/clientWebSocketServer.js +188 -10
- package/src/lib/services/clientWebSocketServer.js.map +1 -1
- package/src/lib/services/contentAwareBlocksService.js +2 -0
- package/src/lib/services/contentAwareBlocksService.js.map +1 -1
- package/src/lib/services/contentIngestionService.d.ts.map +1 -1
- package/src/lib/services/contentIngestionService.js +2 -0
- package/src/lib/services/contentIngestionService.js.map +1 -1
- package/src/lib/services/diskQuorumService.js +3 -0
- package/src/lib/services/diskQuorumService.js.map +1 -1
- package/src/lib/services/email.js +5 -0
- package/src/lib/services/email.js.map +1 -1
- package/src/lib/services/eventNotificationSystem.d.ts +51 -10
- package/src/lib/services/eventNotificationSystem.d.ts.map +1 -1
- package/src/lib/services/eventNotificationSystem.js +76 -23
- package/src/lib/services/eventNotificationSystem.js.map +1 -1
- package/src/lib/services/expirationScheduler.js +6 -3
- package/src/lib/services/expirationScheduler.js.map +1 -1
- package/src/lib/services/fakeEmailService.d.ts +68 -0
- package/src/lib/services/fakeEmailService.d.ts.map +1 -0
- package/src/lib/services/fakeEmailService.js +110 -0
- package/src/lib/services/fakeEmailService.js.map +1 -0
- package/src/lib/services/fec.js +1 -3
- package/src/lib/services/fec.js.map +1 -1
- package/src/lib/services/fecServiceFactory.js +2 -2
- package/src/lib/services/fecServiceFactory.js.map +1 -1
- package/src/lib/services/fecUsageExample.js +1 -3
- package/src/lib/services/fecUsageExample.js.map +1 -1
- package/src/lib/services/identityExpirationScheduler.d.ts.map +1 -1
- package/src/lib/services/identityExpirationScheduler.js +7 -2
- package/src/lib/services/identityExpirationScheduler.js.map +1 -1
- package/src/lib/services/index.d.ts +3 -1
- package/src/lib/services/index.d.ts.map +1 -1
- package/src/lib/services/index.js +3 -1
- package/src/lib/services/index.js.map +1 -1
- package/src/lib/services/messageEventsWebSocketHandler.js +1 -0
- package/src/lib/services/messageEventsWebSocketHandler.js.map +1 -1
- package/src/lib/services/messagePassingService.js +5 -0
- package/src/lib/services/messagePassingService.js.map +1 -1
- package/src/lib/services/nativeRsFecService.js +3 -5
- package/src/lib/services/nativeRsFecService.js.map +1 -1
- package/src/lib/services/presenceService.js +5 -4
- package/src/lib/services/presenceService.js.map +1 -1
- package/src/lib/services/quorum.js +3 -2
- package/src/lib/services/quorum.js.map +1 -1
- package/src/lib/services/quorumDatabaseAdapter.d.ts +5 -5
- package/src/lib/services/quorumDatabaseAdapter.d.ts.map +1 -1
- package/src/lib/services/quorumDatabaseAdapter.js +5 -3
- package/src/lib/services/quorumDatabaseAdapter.js.map +1 -1
- package/src/lib/services/rbac-input-builder.js +5 -0
- package/src/lib/services/rbac-input-builder.js.map +1 -1
- package/src/lib/services/secureKeyStorage.js +3 -0
- package/src/lib/services/secureKeyStorage.js.map +1 -1
- package/src/lib/services/sessionAdapter.d.ts +4 -4
- package/src/lib/services/sessionAdapter.d.ts.map +1 -1
- package/src/lib/services/sessionAdapter.js +3 -2
- package/src/lib/services/sessionAdapter.js.map +1 -1
- package/src/lib/services/webSocketMessageServer.js +7 -4
- package/src/lib/services/webSocketMessageServer.js.map +1 -1
- package/src/lib/services/webSocketPeerProvider.js +2 -1
- package/src/lib/services/webSocketPeerProvider.js.map +1 -1
- package/src/lib/services/websocketHandler.js +9 -1
- package/src/lib/services/websocketHandler.js.map +1 -1
- package/src/lib/shared-types.d.ts +1 -2
- package/src/lib/shared-types.d.ts.map +1 -1
- package/src/lib/stores/__tests__/helpers/mockCloudBlockStore.d.ts +63 -0
- package/src/lib/stores/__tests__/helpers/mockCloudBlockStore.d.ts.map +1 -0
- package/src/lib/stores/__tests__/helpers/mockCloudBlockStore.js +160 -0
- package/src/lib/stores/__tests__/helpers/mockCloudBlockStore.js.map +1 -0
- package/src/lib/stores/availabilityAwareBlockStore.js +34 -5
- package/src/lib/stores/availabilityAwareBlockStore.js.map +1 -1
- package/src/lib/stores/cloudBlockStoreBase.d.ts +121 -0
- package/src/lib/stores/cloudBlockStoreBase.d.ts.map +1 -0
- package/src/lib/stores/cloudBlockStoreBase.js +1165 -0
- package/src/lib/stores/cloudBlockStoreBase.js.map +1 -0
- package/src/lib/stores/diskBlockAsyncStore.js +9 -5
- package/src/lib/stores/diskBlockAsyncStore.js.map +1 -1
- package/src/lib/stores/diskBlockMetadataStore.js +2 -0
- package/src/lib/stores/diskBlockMetadataStore.js.map +1 -1
- package/src/lib/stores/diskBlockStore.js +10 -8
- package/src/lib/stores/diskBlockStore.js.map +1 -1
- package/src/lib/stores/diskCBLStore.d.ts.map +1 -1
- package/src/lib/stores/diskCBLStore.js +8 -0
- package/src/lib/stores/diskCBLStore.js.map +1 -1
- package/src/lib/stores/index.d.ts +1 -0
- package/src/lib/stores/index.d.ts.map +1 -1
- package/src/lib/stores/index.js +1 -0
- package/src/lib/stores/index.js.map +1 -1
- package/src/lib/systemKeyring.d.ts.map +1 -1
- package/src/lib/systemKeyring.js +5 -4
- package/src/lib/systemKeyring.js.map +1 -1
- package/src/lib/transforms/checksumTransform.js +1 -0
- package/src/lib/transforms/checksumTransform.js.map +1 -1
- package/src/lib/transforms/memoryWritableStream.js +1 -0
- package/src/lib/transforms/memoryWritableStream.js.map +1 -1
- package/src/lib/transforms/xorMultipleTransform.js +3 -0
- package/src/lib/transforms/xorMultipleTransform.js.map +1 -1
- package/src/lib/utils/rehydration.d.ts +1 -1
- package/src/lib/utils/rehydration.js +1 -1
- package/src/lib/utils/serialization.d.ts +1 -1
- package/src/lib/utils/serialization.js +1 -1
- package/src/lib/services/backupCodeService.d.ts +0 -35
- package/src/lib/services/backupCodeService.d.ts.map +0 -1
- package/src/lib/services/backupCodeService.js +0 -109
- package/src/lib/services/backupCodeService.js.map +0 -1
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { IFormatOptions, IFormattedContent, ITextFormatter, IValidationResult } from '@brightchain/brighthub-lib';
|
|
2
|
+
/**
|
|
3
|
+
* Default maximum character count for posts
|
|
4
|
+
*/
|
|
5
|
+
export declare const DEFAULT_POST_MAX_CHARACTERS = 280;
|
|
6
|
+
/**
|
|
7
|
+
* Default maximum character count for messages
|
|
8
|
+
*/
|
|
9
|
+
export declare const DEFAULT_MESSAGE_MAX_CHARACTERS = 2000;
|
|
10
|
+
/**
|
|
11
|
+
* Maximum mentions allowed per post
|
|
12
|
+
*/
|
|
13
|
+
export declare const MAX_MENTIONS_PER_POST = 10;
|
|
14
|
+
/**
|
|
15
|
+
* Maximum hashtags allowed per post
|
|
16
|
+
*/
|
|
17
|
+
export declare const MAX_HASHTAGS_PER_POST = 10;
|
|
18
|
+
/**
|
|
19
|
+
* Text_Formatter service implementation
|
|
20
|
+
* Provides unified API for formatting post content with markdown, emojis, and FontAwesome icons
|
|
21
|
+
*/
|
|
22
|
+
export declare class TextFormatter implements ITextFormatter {
|
|
23
|
+
/**
|
|
24
|
+
* Format content with markdown, emojis, and FontAwesome icons
|
|
25
|
+
* Also extracts mentions and hashtags
|
|
26
|
+
*/
|
|
27
|
+
format(content: string, options?: IFormatOptions): IFormattedContent;
|
|
28
|
+
/**
|
|
29
|
+
* Extract @mentions from content
|
|
30
|
+
* Returns unique usernames without the @ prefix
|
|
31
|
+
*/
|
|
32
|
+
extractMentions(content: string): string[];
|
|
33
|
+
/**
|
|
34
|
+
* Extract #hashtags from content
|
|
35
|
+
* Returns unique hashtags without the # prefix
|
|
36
|
+
*/
|
|
37
|
+
extractHashtags(content: string): string[];
|
|
38
|
+
/**
|
|
39
|
+
* Sanitize input content to prevent XSS attacks
|
|
40
|
+
* Strips all HTML tags from input
|
|
41
|
+
*/
|
|
42
|
+
sanitize(content: string): string;
|
|
43
|
+
/**
|
|
44
|
+
* Sanitize formatted output while preserving safe HTML
|
|
45
|
+
*/
|
|
46
|
+
private sanitizeOutput;
|
|
47
|
+
/**
|
|
48
|
+
* Get character count using smart counting rules
|
|
49
|
+
*/
|
|
50
|
+
getCharacterCount(content: string, isBlogPost?: boolean): number;
|
|
51
|
+
/**
|
|
52
|
+
* Validate content against formatting rules
|
|
53
|
+
*/
|
|
54
|
+
validate(content: string, options?: IFormatOptions): IValidationResult;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get the singleton TextFormatter instance
|
|
58
|
+
*/
|
|
59
|
+
export declare function getTextFormatter(): TextFormatter;
|
|
60
|
+
/**
|
|
61
|
+
* Create a new TextFormatter instance
|
|
62
|
+
*/
|
|
63
|
+
export declare function createTextFormatter(): TextFormatter;
|
|
64
|
+
//# sourceMappingURL=textFormatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textFormatter.d.ts","sourceRoot":"","sources":["../../../../../../brightchain-api-lib/src/lib/services/brighthub/textFormatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EAElB,MAAM,4BAA4B,CAAC;AAGpC;;GAEG;AACH,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAE/C;;GAEG;AACH,eAAO,MAAM,8BAA8B,OAAO,CAAC;AAEnD;;GAEG;AACH,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC;;GAEG;AACH,eAAO,MAAM,qBAAqB,KAAK,CAAC;AA6GxC;;;GAGG;AACH,qBAAa,aAAc,YAAW,cAAc;IAClD;;;OAGG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,iBAAiB;IAyBxE;;;OAGG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAe1C;;;OAGG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAe1C;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAIjC;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,UAAQ,GAAG,MAAM;IAI9D;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,iBAAiB;CAyC3E;AAOD;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,CAKhD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,aAAa,CAEnD"}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TextFormatter = exports.MAX_HASHTAGS_PER_POST = exports.MAX_MENTIONS_PER_POST = exports.DEFAULT_MESSAGE_MAX_CHARACTERS = exports.DEFAULT_POST_MAX_CHARACTERS = void 0;
|
|
4
|
+
exports.getTextFormatter = getTextFormatter;
|
|
5
|
+
exports.createTextFormatter = createTextFormatter;
|
|
6
|
+
const tslib_1 = require("tslib");
|
|
7
|
+
const brighthub_lib_1 = require("@brightchain/brighthub-lib");
|
|
8
|
+
const sanitize_html_1 = tslib_1.__importDefault(require("sanitize-html"));
|
|
9
|
+
/**
|
|
10
|
+
* Default maximum character count for posts
|
|
11
|
+
*/
|
|
12
|
+
exports.DEFAULT_POST_MAX_CHARACTERS = 280;
|
|
13
|
+
/**
|
|
14
|
+
* Default maximum character count for messages
|
|
15
|
+
*/
|
|
16
|
+
exports.DEFAULT_MESSAGE_MAX_CHARACTERS = 2000;
|
|
17
|
+
/**
|
|
18
|
+
* Maximum mentions allowed per post
|
|
19
|
+
*/
|
|
20
|
+
exports.MAX_MENTIONS_PER_POST = 10;
|
|
21
|
+
/**
|
|
22
|
+
* Maximum hashtags allowed per post
|
|
23
|
+
*/
|
|
24
|
+
exports.MAX_HASHTAGS_PER_POST = 10;
|
|
25
|
+
/**
|
|
26
|
+
* Regex pattern for extracting @mentions
|
|
27
|
+
* Matches @username where username is alphanumeric with underscores, 1-30 chars
|
|
28
|
+
*/
|
|
29
|
+
const MENTION_REGEX = /(?:^|[^@\w])@([a-zA-Z_][a-zA-Z0-9_]{0,29})(?=\s|$|[^\w])/g;
|
|
30
|
+
/**
|
|
31
|
+
* Regex pattern for extracting #hashtags
|
|
32
|
+
* Matches #hashtag where hashtag is alphanumeric with underscores, 1-50 chars
|
|
33
|
+
*/
|
|
34
|
+
const HASHTAG_REGEX = /(?:^|[^#\w])#([a-zA-Z_][a-zA-Z0-9_]{0,49})(?=\s|$|[^\w])/g;
|
|
35
|
+
/**
|
|
36
|
+
* Sanitize-html configuration for XSS prevention
|
|
37
|
+
* Allows safe HTML tags that may be generated by markdown parsing
|
|
38
|
+
*/
|
|
39
|
+
const SANITIZE_CONFIG = {
|
|
40
|
+
allowedTags: [
|
|
41
|
+
'p',
|
|
42
|
+
'br',
|
|
43
|
+
'b',
|
|
44
|
+
'i',
|
|
45
|
+
'em',
|
|
46
|
+
'strong',
|
|
47
|
+
'a',
|
|
48
|
+
'ul',
|
|
49
|
+
'ol',
|
|
50
|
+
'li',
|
|
51
|
+
'code',
|
|
52
|
+
'pre',
|
|
53
|
+
'blockquote',
|
|
54
|
+
'h1',
|
|
55
|
+
'h2',
|
|
56
|
+
'h3',
|
|
57
|
+
'h4',
|
|
58
|
+
'h5',
|
|
59
|
+
'h6',
|
|
60
|
+
'hr',
|
|
61
|
+
'table',
|
|
62
|
+
'thead',
|
|
63
|
+
'tbody',
|
|
64
|
+
'tr',
|
|
65
|
+
'th',
|
|
66
|
+
'td',
|
|
67
|
+
'del',
|
|
68
|
+
's',
|
|
69
|
+
'mark',
|
|
70
|
+
'sup',
|
|
71
|
+
'sub',
|
|
72
|
+
'span',
|
|
73
|
+
'div',
|
|
74
|
+
'section',
|
|
75
|
+
'input', // For task lists
|
|
76
|
+
],
|
|
77
|
+
allowedAttributes: {
|
|
78
|
+
a: ['href', 'title', 'target', 'rel'],
|
|
79
|
+
img: ['src', 'alt', 'title', 'width', 'height'],
|
|
80
|
+
input: ['type', 'checked', 'disabled', 'class'],
|
|
81
|
+
'*': ['class', 'id', 'style'],
|
|
82
|
+
},
|
|
83
|
+
allowedStyles: {
|
|
84
|
+
'*': {
|
|
85
|
+
color: [
|
|
86
|
+
/^#[0-9A-Fa-f]{3,6}$/,
|
|
87
|
+
/^[a-zA-Z]+$/,
|
|
88
|
+
/^rgb\(\d+,\s*\d+,\s*\d+\)$/,
|
|
89
|
+
/^rgba\(\d+,\s*\d+,\s*\d+,\s*[\d.]+\)$/,
|
|
90
|
+
],
|
|
91
|
+
'font-size': [/^\d+(?:px|em|rem|%)$/],
|
|
92
|
+
'font-weight': [/^(?:normal|bold|\d{3})$/],
|
|
93
|
+
'text-align': [/^(?:left|right|center|justify)$/],
|
|
94
|
+
display: [/^inline-block$/],
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
allowedSchemes: ['http', 'https', 'mailto'],
|
|
98
|
+
allowedSchemesByTag: {
|
|
99
|
+
a: ['http', 'https', 'mailto'],
|
|
100
|
+
},
|
|
101
|
+
transformTags: {
|
|
102
|
+
a: (tagName, attribs) => {
|
|
103
|
+
// Add rel="noopener noreferrer" and target="_blank" to external links
|
|
104
|
+
const href = attribs['href'] || '';
|
|
105
|
+
if (href.startsWith('http://') || href.startsWith('https://')) {
|
|
106
|
+
return {
|
|
107
|
+
tagName,
|
|
108
|
+
attribs: {
|
|
109
|
+
...attribs,
|
|
110
|
+
target: '_blank',
|
|
111
|
+
rel: 'noopener noreferrer',
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
return { tagName, attribs };
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
/**
|
|
120
|
+
* Strict sanitize config that strips all HTML (for input sanitization)
|
|
121
|
+
*/
|
|
122
|
+
const STRICT_SANITIZE_CONFIG = {
|
|
123
|
+
allowedTags: [],
|
|
124
|
+
allowedAttributes: {},
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* Text_Formatter service implementation
|
|
128
|
+
* Provides unified API for formatting post content with markdown, emojis, and FontAwesome icons
|
|
129
|
+
*/
|
|
130
|
+
class TextFormatter {
|
|
131
|
+
/**
|
|
132
|
+
* Format content with markdown, emojis, and FontAwesome icons
|
|
133
|
+
* Also extracts mentions and hashtags
|
|
134
|
+
*/
|
|
135
|
+
format(content, options = {}) {
|
|
136
|
+
const { isBlogPost = false, docId, currentUrl } = options;
|
|
137
|
+
// Extract mentions and hashtags before formatting (from raw content)
|
|
138
|
+
const mentions = this.extractMentions(content);
|
|
139
|
+
const hashtags = this.extractHashtags(content);
|
|
140
|
+
// Get character count from raw content
|
|
141
|
+
const characterCount = this.getCharacterCount(content, isBlogPost);
|
|
142
|
+
// Format the content using existing brighthub-lib function
|
|
143
|
+
const formatted = (0, brighthub_lib_1.parsePostContent)(content, isBlogPost, docId, currentUrl);
|
|
144
|
+
// Sanitize the formatted output for XSS prevention
|
|
145
|
+
const sanitizedFormatted = this.sanitizeOutput(formatted);
|
|
146
|
+
return {
|
|
147
|
+
raw: content,
|
|
148
|
+
formatted: sanitizedFormatted,
|
|
149
|
+
mentions,
|
|
150
|
+
hashtags,
|
|
151
|
+
characterCount,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Extract @mentions from content
|
|
156
|
+
* Returns unique usernames without the @ prefix
|
|
157
|
+
*/
|
|
158
|
+
extractMentions(content) {
|
|
159
|
+
const mentions = new Set();
|
|
160
|
+
let match;
|
|
161
|
+
// Reset regex lastIndex
|
|
162
|
+
MENTION_REGEX.lastIndex = 0;
|
|
163
|
+
while ((match = MENTION_REGEX.exec(content)) !== null) {
|
|
164
|
+
const username = match[1].toLowerCase();
|
|
165
|
+
mentions.add(username);
|
|
166
|
+
}
|
|
167
|
+
return Array.from(mentions);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Extract #hashtags from content
|
|
171
|
+
* Returns unique hashtags without the # prefix
|
|
172
|
+
*/
|
|
173
|
+
extractHashtags(content) {
|
|
174
|
+
const hashtags = new Set();
|
|
175
|
+
let match;
|
|
176
|
+
// Reset regex lastIndex
|
|
177
|
+
HASHTAG_REGEX.lastIndex = 0;
|
|
178
|
+
while ((match = HASHTAG_REGEX.exec(content)) !== null) {
|
|
179
|
+
const hashtag = match[1].toLowerCase();
|
|
180
|
+
hashtags.add(hashtag);
|
|
181
|
+
}
|
|
182
|
+
return Array.from(hashtags);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Sanitize input content to prevent XSS attacks
|
|
186
|
+
* Strips all HTML tags from input
|
|
187
|
+
*/
|
|
188
|
+
sanitize(content) {
|
|
189
|
+
return (0, sanitize_html_1.default)(content, STRICT_SANITIZE_CONFIG);
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Sanitize formatted output while preserving safe HTML
|
|
193
|
+
*/
|
|
194
|
+
sanitizeOutput(content) {
|
|
195
|
+
return (0, sanitize_html_1.default)(content, SANITIZE_CONFIG);
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Get character count using smart counting rules
|
|
199
|
+
*/
|
|
200
|
+
getCharacterCount(content, isBlogPost = false) {
|
|
201
|
+
return (0, brighthub_lib_1.getCharacterCount)(content, isBlogPost);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Validate content against formatting rules
|
|
205
|
+
*/
|
|
206
|
+
validate(content, options = {}) {
|
|
207
|
+
const errors = [];
|
|
208
|
+
const { isBlogPost = false, maxCharacters } = options;
|
|
209
|
+
// Check for empty content
|
|
210
|
+
if (!content || content.trim().length === 0) {
|
|
211
|
+
errors.push('Content cannot be empty');
|
|
212
|
+
return { isValid: false, errors };
|
|
213
|
+
}
|
|
214
|
+
// Check character count
|
|
215
|
+
const charCount = this.getCharacterCount(content, isBlogPost);
|
|
216
|
+
const maxChars = maxCharacters ?? exports.DEFAULT_POST_MAX_CHARACTERS;
|
|
217
|
+
if (charCount > maxChars) {
|
|
218
|
+
errors.push(`Content exceeds maximum character limit of ${maxChars} (current: ${charCount})`);
|
|
219
|
+
}
|
|
220
|
+
// Check mention count
|
|
221
|
+
const mentions = this.extractMentions(content);
|
|
222
|
+
if (mentions.length > exports.MAX_MENTIONS_PER_POST) {
|
|
223
|
+
errors.push(`Too many mentions (maximum: ${exports.MAX_MENTIONS_PER_POST}, found: ${mentions.length})`);
|
|
224
|
+
}
|
|
225
|
+
// Check hashtag count
|
|
226
|
+
const hashtags = this.extractHashtags(content);
|
|
227
|
+
if (hashtags.length > exports.MAX_HASHTAGS_PER_POST) {
|
|
228
|
+
errors.push(`Too many hashtags (maximum: ${exports.MAX_HASHTAGS_PER_POST}, found: ${hashtags.length})`);
|
|
229
|
+
}
|
|
230
|
+
return {
|
|
231
|
+
isValid: errors.length === 0,
|
|
232
|
+
errors,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
exports.TextFormatter = TextFormatter;
|
|
237
|
+
/**
|
|
238
|
+
* Singleton instance of TextFormatter
|
|
239
|
+
*/
|
|
240
|
+
let textFormatterInstance = null;
|
|
241
|
+
/**
|
|
242
|
+
* Get the singleton TextFormatter instance
|
|
243
|
+
*/
|
|
244
|
+
function getTextFormatter() {
|
|
245
|
+
if (!textFormatterInstance) {
|
|
246
|
+
textFormatterInstance = new TextFormatter();
|
|
247
|
+
}
|
|
248
|
+
return textFormatterInstance;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Create a new TextFormatter instance
|
|
252
|
+
*/
|
|
253
|
+
function createTextFormatter() {
|
|
254
|
+
return new TextFormatter();
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=textFormatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textFormatter.js","sourceRoot":"","sources":["../../../../../../brightchain-api-lib/src/lib/services/brighthub/textFormatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { IBasePostData, IBaseThread, IThreadOptions, IThreadService } from '@brightchain/brighthub-lib';
|
|
2
|
+
/**
|
|
3
|
+
* Maximum character limit for replies (same as posts)
|
|
4
|
+
*/
|
|
5
|
+
export declare const REPLY_MAX_CHARACTERS = 280;
|
|
6
|
+
/**
|
|
7
|
+
* Collection interface for database operations
|
|
8
|
+
*/
|
|
9
|
+
interface Collection<T> {
|
|
10
|
+
create(record: T): Promise<T>;
|
|
11
|
+
findOne(filter: Partial<T>): {
|
|
12
|
+
exec(): Promise<T | null>;
|
|
13
|
+
};
|
|
14
|
+
find(filter: Partial<T>): {
|
|
15
|
+
exec(): Promise<T[]>;
|
|
16
|
+
};
|
|
17
|
+
updateOne(filter: Partial<T>, update: Partial<T>): {
|
|
18
|
+
exec(): Promise<{
|
|
19
|
+
modifiedCount: number;
|
|
20
|
+
}>;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Application interface for accessing database collections
|
|
25
|
+
*/
|
|
26
|
+
interface IApplicationWithCollections {
|
|
27
|
+
getModel<T>(name: string): Collection<T>;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Thread_Service implementation
|
|
31
|
+
* Manages threaded conversations and reply hierarchies
|
|
32
|
+
* @see Requirements: 2.1-2.6
|
|
33
|
+
*/
|
|
34
|
+
export declare class ThreadService implements IThreadService {
|
|
35
|
+
private readonly postsCollection;
|
|
36
|
+
private readonly textFormatter;
|
|
37
|
+
constructor(application: IApplicationWithCollections);
|
|
38
|
+
/**
|
|
39
|
+
* Validate reply content
|
|
40
|
+
* @throws ThreadServiceError if content is invalid
|
|
41
|
+
*/
|
|
42
|
+
private validateContent;
|
|
43
|
+
/**
|
|
44
|
+
* Convert a database record to the API response format
|
|
45
|
+
*/
|
|
46
|
+
private recordToPost;
|
|
47
|
+
/**
|
|
48
|
+
* Get the depth of a post by traversing up the parent chain
|
|
49
|
+
* @param postId ID of the post
|
|
50
|
+
* @returns The depth (0 for root posts, 1 for direct replies, etc.)
|
|
51
|
+
*/
|
|
52
|
+
getReplyDepth(postId: string): Promise<number>;
|
|
53
|
+
/**
|
|
54
|
+
* Find the appropriate parent for a reply, enforcing max depth
|
|
55
|
+
* If the target parent is at max depth, reassign to the deepest allowed parent
|
|
56
|
+
* @see Requirements: 2.3, 2.4
|
|
57
|
+
*/
|
|
58
|
+
private findEffectiveParent;
|
|
59
|
+
/**
|
|
60
|
+
* Create a reply to an existing post
|
|
61
|
+
* @see Requirements: 2.1, 2.3, 2.4, 2.6
|
|
62
|
+
*/
|
|
63
|
+
createReply(parentPostId: string, authorId: string, content: string): Promise<IBasePostData<string>>;
|
|
64
|
+
/**
|
|
65
|
+
* Get a thread with all its replies in hierarchical order
|
|
66
|
+
* @see Requirements: 2.2, 2.5
|
|
67
|
+
*/
|
|
68
|
+
getThread(rootPostId: string, options?: IThreadOptions): Promise<IBaseThread<string>>;
|
|
69
|
+
/**
|
|
70
|
+
* Recursively get all replies to a post
|
|
71
|
+
*/
|
|
72
|
+
private getAllReplies;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Create a new ThreadService instance
|
|
76
|
+
*/
|
|
77
|
+
export declare function createThreadService(application: IApplicationWithCollections): ThreadService;
|
|
78
|
+
export {};
|
|
79
|
+
//# sourceMappingURL=threadService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threadService.d.ts","sourceRoot":"","sources":["../../../../../../brightchain-api-lib/src/lib/services/brighthub/threadService.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,WAAW,EACX,cAAc,EACd,cAAc,EAKf,MAAM,4BAA4B,CAAC;AAIpC;;GAEG;AACH,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAsCxC;;GAEG;AACH,UAAU,UAAU,CAAC,CAAC;IACpB,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9B,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG;QAAE,IAAI,IAAI,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;KAAE,CAAC;IAC3D,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG;QAAE,IAAI,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAA;KAAE,CAAC;IACnD,SAAS,CACP,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAClB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GACjB;QAAE,IAAI,IAAI,OAAO,CAAC;YAAE,aAAa,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;CACnD;AAED;;GAEG;AACH,UAAU,2BAA2B;IACnC,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;CAC1C;AAED;;;;GAIG;AACH,qBAAa,aAAc,YAAW,cAAc;IAClD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyB;IACzD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAsB;gBAExC,WAAW,EAAE,2BAA2B;IAIpD;;;OAGG;IACH,OAAO,CAAC,eAAe;IAiBvB;;OAEG;IACH,OAAO,CAAC,YAAY;IA2BpB;;;;OAIG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA4BpD;;;;OAIG;YACW,mBAAmB;IAoDjC;;;OAGG;IACG,WAAW,CACf,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAgEjC;;;OAGG;IACG,SAAS,CACb,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAkC/B;;OAEG;YACW,aAAa;CAsC5B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,2BAA2B,GACvC,aAAa,CAEf"}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ThreadService = exports.REPLY_MAX_CHARACTERS = void 0;
|
|
4
|
+
exports.createThreadService = createThreadService;
|
|
5
|
+
const brighthub_lib_1 = require("@brightchain/brighthub-lib");
|
|
6
|
+
const crypto_1 = require("crypto");
|
|
7
|
+
const textFormatter_1 = require("./textFormatter");
|
|
8
|
+
/**
|
|
9
|
+
* Maximum character limit for replies (same as posts)
|
|
10
|
+
*/
|
|
11
|
+
exports.REPLY_MAX_CHARACTERS = 280;
|
|
12
|
+
/**
|
|
13
|
+
* Thread_Service implementation
|
|
14
|
+
* Manages threaded conversations and reply hierarchies
|
|
15
|
+
* @see Requirements: 2.1-2.6
|
|
16
|
+
*/
|
|
17
|
+
class ThreadService {
|
|
18
|
+
postsCollection;
|
|
19
|
+
textFormatter = (0, textFormatter_1.getTextFormatter)();
|
|
20
|
+
constructor(application) {
|
|
21
|
+
this.postsCollection = application.getModel('brighthub_posts');
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Validate reply content
|
|
25
|
+
* @throws ThreadServiceError if content is invalid
|
|
26
|
+
*/
|
|
27
|
+
validateContent(content) {
|
|
28
|
+
if (!content || content.trim().length === 0) {
|
|
29
|
+
throw new brighthub_lib_1.ThreadServiceError(brighthub_lib_1.ThreadErrorCode.EmptyContent, 'Reply content cannot be empty');
|
|
30
|
+
}
|
|
31
|
+
const charCount = this.textFormatter.getCharacterCount(content);
|
|
32
|
+
if (charCount > exports.REPLY_MAX_CHARACTERS) {
|
|
33
|
+
throw new brighthub_lib_1.ThreadServiceError(brighthub_lib_1.ThreadErrorCode.ContentTooLong, `Reply content exceeds maximum of ${exports.REPLY_MAX_CHARACTERS} characters (current: ${charCount})`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Convert a database record to the API response format
|
|
38
|
+
*/
|
|
39
|
+
recordToPost(record) {
|
|
40
|
+
return {
|
|
41
|
+
_id: record._id,
|
|
42
|
+
authorId: record.authorId,
|
|
43
|
+
content: record.content,
|
|
44
|
+
formattedContent: record.formattedContent,
|
|
45
|
+
postType: record.postType,
|
|
46
|
+
parentPostId: record.parentPostId,
|
|
47
|
+
quotedPostId: record.quotedPostId,
|
|
48
|
+
mediaAttachments: record.mediaAttachments,
|
|
49
|
+
mentions: record.mentions,
|
|
50
|
+
hashtags: record.hashtags,
|
|
51
|
+
likeCount: record.likeCount,
|
|
52
|
+
repostCount: record.repostCount,
|
|
53
|
+
replyCount: record.replyCount,
|
|
54
|
+
quoteCount: record.quoteCount,
|
|
55
|
+
isEdited: record.isEdited,
|
|
56
|
+
editedAt: record.editedAt,
|
|
57
|
+
hubIds: record.hubIds,
|
|
58
|
+
isDeleted: record.isDeleted,
|
|
59
|
+
createdAt: record.createdAt,
|
|
60
|
+
updatedAt: record.updatedAt,
|
|
61
|
+
createdBy: record.createdBy,
|
|
62
|
+
updatedBy: record.updatedBy,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Get the depth of a post by traversing up the parent chain
|
|
67
|
+
* @param postId ID of the post
|
|
68
|
+
* @returns The depth (0 for root posts, 1 for direct replies, etc.)
|
|
69
|
+
*/
|
|
70
|
+
async getReplyDepth(postId) {
|
|
71
|
+
let depth = 0;
|
|
72
|
+
let currentId = postId;
|
|
73
|
+
while (currentId) {
|
|
74
|
+
const post = await this.postsCollection
|
|
75
|
+
.findOne({ _id: currentId })
|
|
76
|
+
.exec();
|
|
77
|
+
if (!post) {
|
|
78
|
+
throw new brighthub_lib_1.ThreadServiceError(brighthub_lib_1.ThreadErrorCode.PostNotFound, 'Post not found');
|
|
79
|
+
}
|
|
80
|
+
if (!post.parentPostId) {
|
|
81
|
+
// Reached the root
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
depth++;
|
|
85
|
+
currentId = post.parentPostId;
|
|
86
|
+
}
|
|
87
|
+
return depth;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Find the appropriate parent for a reply, enforcing max depth
|
|
91
|
+
* If the target parent is at max depth, reassign to the deepest allowed parent
|
|
92
|
+
* @see Requirements: 2.3, 2.4
|
|
93
|
+
*/
|
|
94
|
+
async findEffectiveParent(parentPostId) {
|
|
95
|
+
// Build the ancestor chain from parent to root
|
|
96
|
+
const ancestors = [];
|
|
97
|
+
let currentId = parentPostId;
|
|
98
|
+
while (currentId) {
|
|
99
|
+
ancestors.push(currentId);
|
|
100
|
+
const post = await this.postsCollection
|
|
101
|
+
.findOne({ _id: currentId })
|
|
102
|
+
.exec();
|
|
103
|
+
if (!post) {
|
|
104
|
+
throw new brighthub_lib_1.ThreadServiceError(brighthub_lib_1.ThreadErrorCode.ParentPostNotFound, 'Parent post not found');
|
|
105
|
+
}
|
|
106
|
+
if (post.isDeleted) {
|
|
107
|
+
// Parent is deleted but we can still reply (with indicator)
|
|
108
|
+
// Continue traversing to find depth
|
|
109
|
+
}
|
|
110
|
+
currentId = post.parentPostId;
|
|
111
|
+
}
|
|
112
|
+
// ancestors[0] is the requested parent, ancestors[length-1] is the root
|
|
113
|
+
// The depth of the requested parent is ancestors.length - 1
|
|
114
|
+
const parentDepth = ancestors.length - 1;
|
|
115
|
+
// If adding a reply would exceed max depth, reassign to deepest allowed parent
|
|
116
|
+
// New reply depth would be parentDepth + 1
|
|
117
|
+
// MAX_THREAD_DEPTH = 10 means depths 0-9 are allowed (10 levels)
|
|
118
|
+
// So if parentDepth + 1 > MAX_THREAD_DEPTH - 1, we need to reassign
|
|
119
|
+
if (parentDepth + 1 > brighthub_lib_1.MAX_THREAD_DEPTH - 1) {
|
|
120
|
+
// We need to find an ancestor such that replying to it gives depth <= MAX_THREAD_DEPTH - 1
|
|
121
|
+
// If we reply to ancestor at depth D, the reply will be at depth D + 1
|
|
122
|
+
// So we need D + 1 <= MAX_THREAD_DEPTH - 1, meaning D <= MAX_THREAD_DEPTH - 2
|
|
123
|
+
// The ancestor at depth D is at index (ancestors.length - 1 - D) from the start
|
|
124
|
+
// We want D = MAX_THREAD_DEPTH - 2, so index = ancestors.length - 1 - (MAX_THREAD_DEPTH - 2)
|
|
125
|
+
// = ancestors.length - MAX_THREAD_DEPTH + 1
|
|
126
|
+
const targetIndex = ancestors.length - brighthub_lib_1.MAX_THREAD_DEPTH + 1;
|
|
127
|
+
if (targetIndex >= 0 && targetIndex < ancestors.length) {
|
|
128
|
+
return ancestors[targetIndex];
|
|
129
|
+
}
|
|
130
|
+
// Fallback to the root
|
|
131
|
+
return ancestors[ancestors.length - 1];
|
|
132
|
+
}
|
|
133
|
+
return parentPostId;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Create a reply to an existing post
|
|
137
|
+
* @see Requirements: 2.1, 2.3, 2.4, 2.6
|
|
138
|
+
*/
|
|
139
|
+
async createReply(parentPostId, authorId, content) {
|
|
140
|
+
// Validate content
|
|
141
|
+
this.validateContent(content);
|
|
142
|
+
// Find the effective parent (handles depth limiting)
|
|
143
|
+
const effectiveParentId = await this.findEffectiveParent(parentPostId);
|
|
144
|
+
// Verify parent exists
|
|
145
|
+
const parent = await this.postsCollection
|
|
146
|
+
.findOne({ _id: effectiveParentId })
|
|
147
|
+
.exec();
|
|
148
|
+
if (!parent) {
|
|
149
|
+
throw new brighthub_lib_1.ThreadServiceError(brighthub_lib_1.ThreadErrorCode.ParentPostNotFound, 'Parent post not found');
|
|
150
|
+
}
|
|
151
|
+
// Format content
|
|
152
|
+
const formatted = this.textFormatter.format(content);
|
|
153
|
+
const now = new Date().toISOString();
|
|
154
|
+
const replyId = (0, crypto_1.randomUUID)();
|
|
155
|
+
const replyRecord = {
|
|
156
|
+
_id: replyId,
|
|
157
|
+
authorId,
|
|
158
|
+
content: formatted.raw,
|
|
159
|
+
formattedContent: formatted.formatted,
|
|
160
|
+
postType: brighthub_lib_1.PostType.Reply,
|
|
161
|
+
parentPostId: effectiveParentId,
|
|
162
|
+
mediaAttachments: [],
|
|
163
|
+
mentions: formatted.mentions,
|
|
164
|
+
hashtags: formatted.hashtags,
|
|
165
|
+
likeCount: 0,
|
|
166
|
+
repostCount: 0,
|
|
167
|
+
replyCount: 0,
|
|
168
|
+
quoteCount: 0,
|
|
169
|
+
isEdited: false,
|
|
170
|
+
isDeleted: false,
|
|
171
|
+
createdAt: now,
|
|
172
|
+
updatedAt: now,
|
|
173
|
+
createdBy: authorId,
|
|
174
|
+
updatedBy: authorId,
|
|
175
|
+
};
|
|
176
|
+
const created = await this.postsCollection.create(replyRecord);
|
|
177
|
+
// Update parent's reply count
|
|
178
|
+
// Note: Even if parent is deleted, we track the count
|
|
179
|
+
await this.postsCollection
|
|
180
|
+
.updateOne({ _id: effectiveParentId }, {
|
|
181
|
+
replyCount: parent.replyCount + 1,
|
|
182
|
+
updatedAt: now,
|
|
183
|
+
})
|
|
184
|
+
.exec();
|
|
185
|
+
return this.recordToPost(created);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Get a thread with all its replies in hierarchical order
|
|
189
|
+
* @see Requirements: 2.2, 2.5
|
|
190
|
+
*/
|
|
191
|
+
async getThread(rootPostId, options) {
|
|
192
|
+
// Get the root post
|
|
193
|
+
const rootRecord = await this.postsCollection
|
|
194
|
+
.findOne({ _id: rootPostId })
|
|
195
|
+
.exec();
|
|
196
|
+
if (!rootRecord) {
|
|
197
|
+
throw new brighthub_lib_1.ThreadServiceError(brighthub_lib_1.ThreadErrorCode.PostNotFound, 'Root post not found');
|
|
198
|
+
}
|
|
199
|
+
// Get all replies recursively
|
|
200
|
+
const allReplies = await this.getAllReplies(rootPostId, options?.maxDepth ?? brighthub_lib_1.MAX_THREAD_DEPTH);
|
|
201
|
+
// Count unique participants
|
|
202
|
+
const participantIds = new Set();
|
|
203
|
+
participantIds.add(rootRecord.authorId);
|
|
204
|
+
for (const reply of allReplies) {
|
|
205
|
+
participantIds.add(reply.authorId);
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
rootPost: this.recordToPost(rootRecord),
|
|
209
|
+
replies: allReplies.map((r) => this.recordToPost(r)),
|
|
210
|
+
replyCount: allReplies.length,
|
|
211
|
+
participantCount: participantIds.size,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Recursively get all replies to a post
|
|
216
|
+
*/
|
|
217
|
+
async getAllReplies(postId, maxDepth, currentDepth = 0) {
|
|
218
|
+
if (currentDepth >= maxDepth) {
|
|
219
|
+
return [];
|
|
220
|
+
}
|
|
221
|
+
// Find direct replies to this post
|
|
222
|
+
const directReplies = await this.postsCollection
|
|
223
|
+
.find({ parentPostId: postId })
|
|
224
|
+
.exec();
|
|
225
|
+
// Filter out deleted posts but preserve structure
|
|
226
|
+
// (deleted posts show as "deleted" indicator per requirement 2.5)
|
|
227
|
+
const results = [];
|
|
228
|
+
for (const reply of directReplies) {
|
|
229
|
+
results.push(reply);
|
|
230
|
+
// Recursively get replies to this reply
|
|
231
|
+
const nestedReplies = await this.getAllReplies(reply._id, maxDepth, currentDepth + 1);
|
|
232
|
+
results.push(...nestedReplies);
|
|
233
|
+
}
|
|
234
|
+
// Sort by creation time
|
|
235
|
+
results.sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());
|
|
236
|
+
return results;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
exports.ThreadService = ThreadService;
|
|
240
|
+
/**
|
|
241
|
+
* Create a new ThreadService instance
|
|
242
|
+
*/
|
|
243
|
+
function createThreadService(application) {
|
|
244
|
+
return new ThreadService(application);
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=threadService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threadService.js","sourceRoot":"","sources":["../../../../../../brightchain-api-lib/src/lib/services/brighthub/threadService.ts"],"names":[],"mappings":"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"}
|