@brightchain/brightchain-api-lib 0.23.25 → 0.24.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (438) hide show
  1. package/package.json +5 -5
  2. package/src/lib/__tests__/fixtures/mock-backend-brightchain-member.d.ts.map +1 -1
  3. package/src/lib/__tests__/fixtures/mock-backend-brightchain-member.js +11 -0
  4. package/src/lib/__tests__/fixtures/mock-backend-brightchain-member.js.map +1 -1
  5. package/src/lib/__tests__/fixtures/mocked-model.js +63 -60
  6. package/src/lib/__tests__/fixtures/mocked-model.js.map +1 -1
  7. package/src/lib/application.d.ts +1 -1
  8. package/src/lib/application.d.ts.map +1 -1
  9. package/src/lib/application.js +103 -34
  10. package/src/lib/application.js.map +1 -1
  11. package/src/lib/auth/aclEnforcedAvailability.js +4 -0
  12. package/src/lib/auth/aclEnforcedAvailability.js.map +1 -1
  13. package/src/lib/auth/aclEnforcedBlockStore.js +7 -0
  14. package/src/lib/auth/aclEnforcedBlockStore.js.map +1 -1
  15. package/src/lib/auth/ecdsaNodeAuthenticator.js +1 -0
  16. package/src/lib/auth/ecdsaNodeAuthenticator.js.map +1 -1
  17. package/src/lib/auth/poolAclBootstrap.js +2 -0
  18. package/src/lib/auth/poolAclBootstrap.js.map +1 -1
  19. package/src/lib/auth/poolAclStore.js +2 -1
  20. package/src/lib/auth/poolAclStore.js.map +1 -1
  21. package/src/lib/auth/poolAclUpdater.js +4 -0
  22. package/src/lib/auth/poolAclUpdater.js.map +1 -1
  23. package/src/lib/availability/availabilityMetrics.js +43 -45
  24. package/src/lib/availability/availabilityMetrics.js.map +1 -1
  25. package/src/lib/availability/availabilityService.js +26 -20
  26. package/src/lib/availability/availabilityService.js.map +1 -1
  27. package/src/lib/availability/blockRegistry.js +46 -25
  28. package/src/lib/availability/blockRegistry.js.map +1 -1
  29. package/src/lib/availability/discoveryProtocol.js +10 -8
  30. package/src/lib/availability/discoveryProtocol.js.map +1 -1
  31. package/src/lib/availability/gossipService.js +56 -45
  32. package/src/lib/availability/gossipService.js.map +1 -1
  33. package/src/lib/availability/heartbeatMonitor.js +22 -20
  34. package/src/lib/availability/heartbeatMonitor.js.map +1 -1
  35. package/src/lib/availability/poolDiscoveryService.js +7 -1
  36. package/src/lib/availability/poolDiscoveryService.js.map +1 -1
  37. package/src/lib/availability/quorumGossipHandler.js +13 -6
  38. package/src/lib/availability/quorumGossipHandler.js.map +1 -1
  39. package/src/lib/availability/reconciliationService.js +18 -12
  40. package/src/lib/availability/reconciliationService.js.map +1 -1
  41. package/src/lib/blockFetch/blockFetcher.js +14 -8
  42. package/src/lib/blockFetch/blockFetcher.js.map +1 -1
  43. package/src/lib/blockFetch/fetchQueue.js +9 -7
  44. package/src/lib/blockFetch/fetchQueue.js.map +1 -1
  45. package/src/lib/blockFetch/httpBlockFetchTransport.js +2 -0
  46. package/src/lib/blockFetch/httpBlockFetchTransport.js.map +1 -1
  47. package/src/lib/browserKeyring.js +5 -2
  48. package/src/lib/browserKeyring.js.map +1 -1
  49. package/src/lib/controllers/api/blocks.d.ts.map +1 -1
  50. package/src/lib/controllers/api/blocks.js +9 -3
  51. package/src/lib/controllers/api/blocks.js.map +1 -1
  52. package/src/lib/controllers/api/brighthub/connectionController.d.ts +80 -0
  53. package/src/lib/controllers/api/brighthub/connectionController.d.ts.map +1 -0
  54. package/src/lib/controllers/api/brighthub/connectionController.js +890 -0
  55. package/src/lib/controllers/api/brighthub/connectionController.js.map +1 -0
  56. package/src/lib/controllers/api/brighthub/index.d.ts +9 -0
  57. package/src/lib/controllers/api/brighthub/index.d.ts.map +1 -0
  58. package/src/lib/controllers/api/brighthub/index.js +12 -0
  59. package/src/lib/controllers/api/brighthub/index.js.map +1 -0
  60. package/src/lib/controllers/api/brighthub/messagingController.d.ts +84 -0
  61. package/src/lib/controllers/api/brighthub/messagingController.d.ts.map +1 -0
  62. package/src/lib/controllers/api/brighthub/messagingController.js +1077 -0
  63. package/src/lib/controllers/api/brighthub/messagingController.js.map +1 -0
  64. package/src/lib/controllers/api/brighthub/notificationController.d.ts +89 -0
  65. package/src/lib/controllers/api/brighthub/notificationController.d.ts.map +1 -0
  66. package/src/lib/controllers/api/brighthub/notificationController.js +444 -0
  67. package/src/lib/controllers/api/brighthub/notificationController.js.map +1 -0
  68. package/src/lib/controllers/api/brighthub/postController.d.ts +75 -0
  69. package/src/lib/controllers/api/brighthub/postController.d.ts.map +1 -0
  70. package/src/lib/controllers/api/brighthub/postController.js +388 -0
  71. package/src/lib/controllers/api/brighthub/postController.js.map +1 -0
  72. package/src/lib/controllers/api/brighthub/timelineController.d.ts +74 -0
  73. package/src/lib/controllers/api/brighthub/timelineController.d.ts.map +1 -0
  74. package/src/lib/controllers/api/brighthub/timelineController.js +418 -0
  75. package/src/lib/controllers/api/brighthub/timelineController.js.map +1 -0
  76. package/src/lib/controllers/api/brightpass.d.ts.map +1 -1
  77. package/src/lib/controllers/api/brightpass.js +46 -4
  78. package/src/lib/controllers/api/brightpass.js.map +1 -1
  79. package/src/lib/controllers/api/cbl.js +1 -0
  80. package/src/lib/controllers/api/cbl.js.map +1 -1
  81. package/src/lib/controllers/api/channels.js +2 -2
  82. package/src/lib/controllers/api/channels.js.map +1 -1
  83. package/src/lib/controllers/api/conversations.js +1 -1
  84. package/src/lib/controllers/api/conversations.js.map +1 -1
  85. package/src/lib/controllers/api/docs.js +2 -1
  86. package/src/lib/controllers/api/docs.js.map +1 -1
  87. package/src/lib/controllers/api/emails.d.ts.map +1 -1
  88. package/src/lib/controllers/api/emails.js +16 -2
  89. package/src/lib/controllers/api/emails.js.map +1 -1
  90. package/src/lib/controllers/api/explodingMessages.js +2 -4
  91. package/src/lib/controllers/api/explodingMessages.js.map +1 -1
  92. package/src/lib/controllers/api/groups.js +2 -2
  93. package/src/lib/controllers/api/groups.js.map +1 -1
  94. package/src/lib/controllers/api/health.d.ts +9 -2
  95. package/src/lib/controllers/api/health.d.ts.map +1 -1
  96. package/src/lib/controllers/api/health.js +48 -6
  97. package/src/lib/controllers/api/health.js.map +1 -1
  98. package/src/lib/controllers/api/index.d.ts +1 -0
  99. package/src/lib/controllers/api/index.d.ts.map +1 -1
  100. package/src/lib/controllers/api/index.js +1 -0
  101. package/src/lib/controllers/api/index.js.map +1 -1
  102. package/src/lib/controllers/api/introspection.js +2 -0
  103. package/src/lib/controllers/api/introspection.js.map +1 -1
  104. package/src/lib/controllers/api/messages.js +1 -1
  105. package/src/lib/controllers/api/messages.js.map +1 -1
  106. package/src/lib/controllers/api/nodes.js +6 -6
  107. package/src/lib/controllers/api/nodes.js.map +1 -1
  108. package/src/lib/controllers/api/quorum.d.ts +1 -1
  109. package/src/lib/controllers/api/quorum.d.ts.map +1 -1
  110. package/src/lib/controllers/api/quorum.js +3 -2
  111. package/src/lib/controllers/api/quorum.js.map +1 -1
  112. package/src/lib/controllers/api/scbl.js +3 -0
  113. package/src/lib/controllers/api/scbl.js.map +1 -1
  114. package/src/lib/controllers/api/sessions.d.ts +18 -2
  115. package/src/lib/controllers/api/sessions.d.ts.map +1 -1
  116. package/src/lib/controllers/api/sessions.js +60 -3
  117. package/src/lib/controllers/api/sessions.js.map +1 -1
  118. package/src/lib/controllers/api/sync.js +4 -4
  119. package/src/lib/controllers/api/sync.js.map +1 -1
  120. package/src/lib/controllers/api/user.d.ts +2 -0
  121. package/src/lib/controllers/api/user.d.ts.map +1 -1
  122. package/src/lib/controllers/api/user.js +95 -3
  123. package/src/lib/controllers/api/user.js.map +1 -1
  124. package/src/lib/controllers/identity/deviceController.js +2 -2
  125. package/src/lib/controllers/identity/deviceController.js.map +1 -1
  126. package/src/lib/controllers/identity/directoryController.js +1 -1
  127. package/src/lib/controllers/identity/directoryController.js.map +1 -1
  128. package/src/lib/controllers/identity/identityProofController.js +4 -6
  129. package/src/lib/controllers/identity/identityProofController.js.map +1 -1
  130. package/src/lib/databaseInit.d.ts +3 -3
  131. package/src/lib/databaseInit.js +5 -5
  132. package/src/lib/databaseInit.js.map +1 -1
  133. package/src/lib/datastore/block-document-store.d.ts.map +1 -1
  134. package/src/lib/datastore/block-document-store.js +18 -6
  135. package/src/lib/datastore/block-document-store.js.map +1 -1
  136. package/src/lib/datastore/document-store.d.ts.map +1 -1
  137. package/src/lib/datastore/memory-document-store.js +5 -2
  138. package/src/lib/datastore/memory-document-store.js.map +1 -1
  139. package/src/lib/encryption/encryptedMetadataService.js +2 -0
  140. package/src/lib/encryption/encryptedMetadataService.js.map +1 -1
  141. package/src/lib/encryption/encryptionAwareReplication.js +3 -0
  142. package/src/lib/encryption/encryptionAwareReplication.js.map +1 -1
  143. package/src/lib/encryption/errors.d.ts.map +1 -1
  144. package/src/lib/encryption/errors.js +8 -0
  145. package/src/lib/encryption/errors.js.map +1 -1
  146. package/src/lib/encryption/poolKeyManager.js +2 -0
  147. package/src/lib/encryption/poolKeyManager.js.map +1 -1
  148. package/src/lib/environment.js +10 -0
  149. package/src/lib/environment.js.map +1 -1
  150. package/src/lib/errors/express-validation.js +1 -0
  151. package/src/lib/errors/express-validation.js.map +1 -1
  152. package/src/lib/errors/invalid-backup-code-version.js +1 -0
  153. package/src/lib/errors/invalid-backup-code-version.js.map +1 -1
  154. package/src/lib/errors/memberIndexSchemaValidationError.js +1 -0
  155. package/src/lib/errors/memberIndexSchemaValidationError.js.map +1 -1
  156. package/src/lib/errors/missing-validated-data.js +2 -0
  157. package/src/lib/errors/missing-validated-data.js.map +1 -1
  158. package/src/lib/errors/token-not-found.js +1 -0
  159. package/src/lib/errors/token-not-found.js.map +1 -1
  160. package/src/lib/errors/typed-error-local.js +3 -0
  161. package/src/lib/errors/typed-error-local.js.map +1 -1
  162. package/src/lib/interfaces/brightpass/index.d.ts +1 -1
  163. package/src/lib/interfaces/brightpass/index.d.ts.map +1 -1
  164. package/src/lib/interfaces/environment.d.ts +1 -1
  165. package/src/lib/interfaces/environment.d.ts.map +1 -1
  166. package/src/lib/interfaces/member/memberProfileResponse.d.ts.map +1 -1
  167. package/src/lib/interfaces/member/operational.d.ts.map +1 -1
  168. package/src/lib/interfaces/member-init-config.d.ts +1 -1
  169. package/src/lib/interfaces/member-init-config.d.ts.map +1 -1
  170. package/src/lib/interfaces/responses/api-backup-codes-response.d.ts.map +1 -1
  171. package/src/lib/interfaces/responses/api-challenge-response.d.ts.map +1 -1
  172. package/src/lib/interfaces/responses/api-code-count-response.d.ts.map +1 -1
  173. package/src/lib/interfaces/responses/api-detailed-health-response.d.ts.map +1 -1
  174. package/src/lib/interfaces/responses/api-discover-block-response.d.ts.map +1 -1
  175. package/src/lib/interfaces/responses/api-express-validation-error.d.ts.map +1 -1
  176. package/src/lib/interfaces/responses/api-get-block-response.d.ts.map +1 -1
  177. package/src/lib/interfaces/responses/api-get-node-response.d.ts.map +1 -1
  178. package/src/lib/interfaces/responses/api-health-response.d.ts.map +1 -1
  179. package/src/lib/interfaces/responses/api-list-nodes-response.d.ts.map +1 -1
  180. package/src/lib/interfaces/responses/api-login-response.d.ts.map +1 -1
  181. package/src/lib/interfaces/responses/api-members-response.d.ts.map +1 -1
  182. package/src/lib/interfaces/responses/api-mnemonic-response.d.ts.map +1 -1
  183. package/src/lib/interfaces/responses/api-reconcile-response.d.ts.map +1 -1
  184. package/src/lib/interfaces/responses/api-register-node-response.d.ts.map +1 -1
  185. package/src/lib/interfaces/responses/api-registration-response.d.ts.map +1 -1
  186. package/src/lib/interfaces/responses/api-replicate-block-response.d.ts.map +1 -1
  187. package/src/lib/interfaces/responses/api-request-user-response.d.ts.map +1 -1
  188. package/src/lib/interfaces/responses/api-store-block-response.d.ts.map +1 -1
  189. package/src/lib/interfaces/responses/api-store-cbl-response.d.ts.map +1 -1
  190. package/src/lib/interfaces/responses/api-sync-request-response.d.ts.map +1 -1
  191. package/src/lib/interfaces/responses/brighthub/api-connection-response.d.ts +21 -0
  192. package/src/lib/interfaces/responses/brighthub/api-connection-response.d.ts.map +1 -0
  193. package/src/lib/interfaces/responses/brighthub/api-connection-response.js +3 -0
  194. package/src/lib/interfaces/responses/brighthub/api-connection-response.js.map +1 -0
  195. package/src/lib/interfaces/responses/brighthub/api-messaging-response.d.ts +39 -0
  196. package/src/lib/interfaces/responses/brighthub/api-messaging-response.d.ts.map +1 -0
  197. package/src/lib/interfaces/responses/brighthub/api-messaging-response.js +3 -0
  198. package/src/lib/interfaces/responses/brighthub/api-messaging-response.js.map +1 -0
  199. package/src/lib/interfaces/responses/brighthub/api-notification-response.d.ts +30 -0
  200. package/src/lib/interfaces/responses/brighthub/api-notification-response.d.ts.map +1 -0
  201. package/src/lib/interfaces/responses/brighthub/api-notification-response.js +3 -0
  202. package/src/lib/interfaces/responses/brighthub/api-notification-response.js.map +1 -0
  203. package/src/lib/interfaces/responses/brighthub/api-post-response.d.ts +21 -0
  204. package/src/lib/interfaces/responses/brighthub/api-post-response.d.ts.map +1 -0
  205. package/src/lib/interfaces/responses/brighthub/api-post-response.js +3 -0
  206. package/src/lib/interfaces/responses/brighthub/api-post-response.js.map +1 -0
  207. package/src/lib/interfaces/responses/brighthub/api-timeline-response.d.ts +14 -0
  208. package/src/lib/interfaces/responses/brighthub/api-timeline-response.d.ts.map +1 -0
  209. package/src/lib/interfaces/responses/brighthub/api-timeline-response.js +3 -0
  210. package/src/lib/interfaces/responses/brighthub/api-timeline-response.js.map +1 -0
  211. package/src/lib/interfaces/responses/brighthub/api-user-profile-response.d.ts +10 -0
  212. package/src/lib/interfaces/responses/brighthub/api-user-profile-response.d.ts.map +1 -0
  213. package/src/lib/interfaces/responses/brighthub/api-user-profile-response.js +3 -0
  214. package/src/lib/interfaces/responses/brighthub/api-user-profile-response.js.map +1 -0
  215. package/src/lib/interfaces/responses/brighthub/index.d.ts +13 -0
  216. package/src/lib/interfaces/responses/brighthub/index.d.ts.map +1 -0
  217. package/src/lib/interfaces/responses/brighthub/index.js +9 -0
  218. package/src/lib/interfaces/responses/brighthub/index.js.map +1 -0
  219. package/src/lib/interfaces/responses/index.d.ts +1 -0
  220. package/src/lib/interfaces/responses/index.d.ts.map +1 -1
  221. package/src/lib/interfaces/storage/storedDocumentTypes.d.ts +1 -1
  222. package/src/lib/interfaces/storage/storedDocumentTypes.js +1 -1
  223. package/src/lib/interfaces/storage/userRoleSchema.d.ts.map +1 -1
  224. package/src/lib/interfaces/storage/userRoleSchema.js +1 -3
  225. package/src/lib/interfaces/storage/userRoleSchema.js.map +1 -1
  226. package/src/lib/middlewares.js +31 -31
  227. package/src/lib/middlewares.js.map +1 -1
  228. package/src/lib/nodeKeyring.js +2 -0
  229. package/src/lib/nodeKeyring.js.map +1 -1
  230. package/src/lib/plugins/brightchain-database-plugin.d.ts +14 -14
  231. package/src/lib/plugins/brightchain-database-plugin.d.ts.map +1 -1
  232. package/src/lib/plugins/brightchain-database-plugin.js +36 -34
  233. package/src/lib/plugins/brightchain-database-plugin.js.map +1 -1
  234. package/src/lib/routers/api.d.ts +62 -1
  235. package/src/lib/routers/api.d.ts.map +1 -1
  236. package/src/lib/routers/api.js +123 -2
  237. package/src/lib/routers/api.js.map +1 -1
  238. package/src/lib/routers/app.d.ts.map +1 -1
  239. package/src/lib/routers/app.js +10 -1
  240. package/src/lib/routers/app.js.map +1 -1
  241. package/src/lib/routers/base.js +2 -0
  242. package/src/lib/routers/base.js.map +1 -1
  243. package/src/lib/secureEnclaveKeyring.js +4 -2
  244. package/src/lib/secureEnclaveKeyring.js.map +1 -1
  245. package/src/lib/services/auth.d.ts.map +1 -1
  246. package/src/lib/services/auth.js +11 -2
  247. package/src/lib/services/auth.js.map +1 -1
  248. package/src/lib/services/base.js +1 -0
  249. package/src/lib/services/base.js.map +1 -1
  250. package/src/lib/services/blockServiceFactory.js +2 -0
  251. package/src/lib/services/blockServiceFactory.js.map +1 -1
  252. package/src/lib/services/blockStore.js +3 -2
  253. package/src/lib/services/blockStore.js.map +1 -1
  254. package/src/lib/services/blocks.js +1 -0
  255. package/src/lib/services/blocks.js.map +1 -1
  256. package/src/lib/services/brightChainBackupCodeService.d.ts +114 -0
  257. package/src/lib/services/brightChainBackupCodeService.d.ts.map +1 -0
  258. package/src/lib/services/brightChainBackupCodeService.js +303 -0
  259. package/src/lib/services/brightChainBackupCodeService.js.map +1 -0
  260. package/src/lib/services/brightchain-authentication-provider.d.ts.map +1 -1
  261. package/src/lib/services/brightchain-authentication-provider.js +40 -9
  262. package/src/lib/services/brightchain-authentication-provider.js.map +1 -1
  263. package/src/lib/services/brightchain-member-init.service.d.ts +17 -17
  264. package/src/lib/services/brightchain-member-init.service.d.ts.map +1 -1
  265. package/src/lib/services/brightchain-member-init.service.js +12 -9
  266. package/src/lib/services/brightchain-member-init.service.js.map +1 -1
  267. package/src/lib/services/brighthub/connectionService.d.ts +286 -0
  268. package/src/lib/services/brighthub/connectionService.d.ts.map +1 -0
  269. package/src/lib/services/brighthub/connectionService.js +1887 -0
  270. package/src/lib/services/brighthub/connectionService.js.map +1 -0
  271. package/src/lib/services/brighthub/discoveryService.d.ts +110 -0
  272. package/src/lib/services/brighthub/discoveryService.d.ts.map +1 -0
  273. package/src/lib/services/brighthub/discoveryService.js +528 -0
  274. package/src/lib/services/brighthub/discoveryService.js.map +1 -0
  275. package/src/lib/services/brighthub/feedService.d.ts +141 -0
  276. package/src/lib/services/brighthub/feedService.d.ts.map +1 -0
  277. package/src/lib/services/brighthub/feedService.js +418 -0
  278. package/src/lib/services/brighthub/feedService.js.map +1 -0
  279. package/src/lib/services/brighthub/index.d.ts +11 -0
  280. package/src/lib/services/brighthub/index.d.ts.map +1 -0
  281. package/src/lib/services/brighthub/index.js +14 -0
  282. package/src/lib/services/brighthub/index.js.map +1 -0
  283. package/src/lib/services/brighthub/messagingService.d.ts +109 -0
  284. package/src/lib/services/brighthub/messagingService.d.ts.map +1 -0
  285. package/src/lib/services/brighthub/messagingService.js +947 -0
  286. package/src/lib/services/brighthub/messagingService.js.map +1 -0
  287. package/src/lib/services/brighthub/messagingService.test-helpers.d.ts +75 -0
  288. package/src/lib/services/brighthub/messagingService.test-helpers.d.ts.map +1 -0
  289. package/src/lib/services/brighthub/messagingService.test-helpers.js +237 -0
  290. package/src/lib/services/brighthub/messagingService.test-helpers.js.map +1 -0
  291. package/src/lib/services/brighthub/notificationService.d.ts +172 -0
  292. package/src/lib/services/brighthub/notificationService.d.ts.map +1 -0
  293. package/src/lib/services/brighthub/notificationService.js +768 -0
  294. package/src/lib/services/brighthub/notificationService.js.map +1 -0
  295. package/src/lib/services/brighthub/notificationService.test-helpers.d.ts +75 -0
  296. package/src/lib/services/brighthub/notificationService.test-helpers.d.ts.map +1 -0
  297. package/src/lib/services/brighthub/notificationService.test-helpers.js +230 -0
  298. package/src/lib/services/brighthub/notificationService.test-helpers.js.map +1 -0
  299. package/src/lib/services/brighthub/postService.d.ts +129 -0
  300. package/src/lib/services/brighthub/postService.d.ts.map +1 -0
  301. package/src/lib/services/brighthub/postService.js +470 -0
  302. package/src/lib/services/brighthub/postService.js.map +1 -0
  303. package/src/lib/services/brighthub/postService.test-helpers.d.ts +40 -0
  304. package/src/lib/services/brighthub/postService.test-helpers.d.ts.map +1 -0
  305. package/src/lib/services/brighthub/postService.test-helpers.js +84 -0
  306. package/src/lib/services/brighthub/postService.test-helpers.js.map +1 -0
  307. package/src/lib/services/brighthub/textFormatter.d.ts +64 -0
  308. package/src/lib/services/brighthub/textFormatter.d.ts.map +1 -0
  309. package/src/lib/services/brighthub/textFormatter.js +256 -0
  310. package/src/lib/services/brighthub/textFormatter.js.map +1 -0
  311. package/src/lib/services/brighthub/threadService.d.ts +79 -0
  312. package/src/lib/services/brighthub/threadService.d.ts.map +1 -0
  313. package/src/lib/services/brighthub/threadService.js +246 -0
  314. package/src/lib/services/brighthub/threadService.js.map +1 -0
  315. package/src/lib/services/brighthub/userProfileService.d.ts +203 -0
  316. package/src/lib/services/brighthub/userProfileService.d.ts.map +1 -0
  317. package/src/lib/services/brighthub/userProfileService.js +868 -0
  318. package/src/lib/services/brighthub/userProfileService.js.map +1 -0
  319. package/src/lib/services/brighthub/userProfileService.test-helpers.d.ts +86 -0
  320. package/src/lib/services/brighthub/userProfileService.test-helpers.d.ts.map +1 -0
  321. package/src/lib/services/brighthub/userProfileService.test-helpers.js +169 -0
  322. package/src/lib/services/brighthub/userProfileService.test-helpers.js.map +1 -0
  323. package/src/lib/services/brighthub/webSocketServer.d.ts +68 -0
  324. package/src/lib/services/brighthub/webSocketServer.d.ts.map +1 -0
  325. package/src/lib/services/brighthub/webSocketServer.js +194 -0
  326. package/src/lib/services/brighthub/webSocketServer.js.map +1 -0
  327. package/src/lib/services/brightpass/auditLogger.js +10 -5
  328. package/src/lib/services/brightpass/auditLogger.js.map +1 -1
  329. package/src/lib/services/brightpass/vaultEncryption.js +8 -8
  330. package/src/lib/services/brightpass/vaultEncryption.js.map +1 -1
  331. package/src/lib/services/brightpass.js +16 -8
  332. package/src/lib/services/brightpass.js.map +1 -1
  333. package/src/lib/services/cliOperatorPrompt.js +5 -2
  334. package/src/lib/services/cliOperatorPrompt.js.map +1 -1
  335. package/src/lib/services/clientWebSocketServer.d.ts +69 -4
  336. package/src/lib/services/clientWebSocketServer.d.ts.map +1 -1
  337. package/src/lib/services/clientWebSocketServer.js +188 -10
  338. package/src/lib/services/clientWebSocketServer.js.map +1 -1
  339. package/src/lib/services/contentAwareBlocksService.js +2 -0
  340. package/src/lib/services/contentAwareBlocksService.js.map +1 -1
  341. package/src/lib/services/contentIngestionService.d.ts.map +1 -1
  342. package/src/lib/services/contentIngestionService.js +2 -0
  343. package/src/lib/services/contentIngestionService.js.map +1 -1
  344. package/src/lib/services/diskQuorumService.js +3 -0
  345. package/src/lib/services/diskQuorumService.js.map +1 -1
  346. package/src/lib/services/email.js +5 -0
  347. package/src/lib/services/email.js.map +1 -1
  348. package/src/lib/services/eventNotificationSystem.d.ts +51 -10
  349. package/src/lib/services/eventNotificationSystem.d.ts.map +1 -1
  350. package/src/lib/services/eventNotificationSystem.js +76 -23
  351. package/src/lib/services/eventNotificationSystem.js.map +1 -1
  352. package/src/lib/services/expirationScheduler.js +6 -3
  353. package/src/lib/services/expirationScheduler.js.map +1 -1
  354. package/src/lib/services/fakeEmailService.js +3 -4
  355. package/src/lib/services/fakeEmailService.js.map +1 -1
  356. package/src/lib/services/fec.js +1 -3
  357. package/src/lib/services/fec.js.map +1 -1
  358. package/src/lib/services/fecServiceFactory.js +2 -2
  359. package/src/lib/services/fecServiceFactory.js.map +1 -1
  360. package/src/lib/services/fecUsageExample.js +1 -3
  361. package/src/lib/services/fecUsageExample.js.map +1 -1
  362. package/src/lib/services/identityExpirationScheduler.d.ts.map +1 -1
  363. package/src/lib/services/identityExpirationScheduler.js +7 -2
  364. package/src/lib/services/identityExpirationScheduler.js.map +1 -1
  365. package/src/lib/services/index.d.ts +3 -2
  366. package/src/lib/services/index.d.ts.map +1 -1
  367. package/src/lib/services/index.js +3 -2
  368. package/src/lib/services/index.js.map +1 -1
  369. package/src/lib/services/messageEventsWebSocketHandler.js +1 -0
  370. package/src/lib/services/messageEventsWebSocketHandler.js.map +1 -1
  371. package/src/lib/services/messagePassingService.js +5 -0
  372. package/src/lib/services/messagePassingService.js.map +1 -1
  373. package/src/lib/services/nativeRsFecService.js +3 -5
  374. package/src/lib/services/nativeRsFecService.js.map +1 -1
  375. package/src/lib/services/presenceService.js +5 -4
  376. package/src/lib/services/presenceService.js.map +1 -1
  377. package/src/lib/services/quorum.js +3 -2
  378. package/src/lib/services/quorum.js.map +1 -1
  379. package/src/lib/services/quorumDatabaseAdapter.d.ts +5 -5
  380. package/src/lib/services/quorumDatabaseAdapter.d.ts.map +1 -1
  381. package/src/lib/services/quorumDatabaseAdapter.js +5 -3
  382. package/src/lib/services/quorumDatabaseAdapter.js.map +1 -1
  383. package/src/lib/services/rbac-input-builder.js +5 -0
  384. package/src/lib/services/rbac-input-builder.js.map +1 -1
  385. package/src/lib/services/secureKeyStorage.js +3 -0
  386. package/src/lib/services/secureKeyStorage.js.map +1 -1
  387. package/src/lib/services/sessionAdapter.d.ts +4 -4
  388. package/src/lib/services/sessionAdapter.d.ts.map +1 -1
  389. package/src/lib/services/sessionAdapter.js +3 -2
  390. package/src/lib/services/sessionAdapter.js.map +1 -1
  391. package/src/lib/services/webSocketMessageServer.js +7 -4
  392. package/src/lib/services/webSocketMessageServer.js.map +1 -1
  393. package/src/lib/services/webSocketPeerProvider.js +2 -1
  394. package/src/lib/services/webSocketPeerProvider.js.map +1 -1
  395. package/src/lib/services/websocketHandler.js +9 -1
  396. package/src/lib/services/websocketHandler.js.map +1 -1
  397. package/src/lib/shared-types.d.ts +1 -2
  398. package/src/lib/shared-types.d.ts.map +1 -1
  399. package/src/lib/stores/__tests__/helpers/mockCloudBlockStore.d.ts +63 -0
  400. package/src/lib/stores/__tests__/helpers/mockCloudBlockStore.d.ts.map +1 -0
  401. package/src/lib/stores/__tests__/helpers/mockCloudBlockStore.js +160 -0
  402. package/src/lib/stores/__tests__/helpers/mockCloudBlockStore.js.map +1 -0
  403. package/src/lib/stores/availabilityAwareBlockStore.js +34 -5
  404. package/src/lib/stores/availabilityAwareBlockStore.js.map +1 -1
  405. package/src/lib/stores/cloudBlockStoreBase.d.ts +121 -0
  406. package/src/lib/stores/cloudBlockStoreBase.d.ts.map +1 -0
  407. package/src/lib/stores/cloudBlockStoreBase.js +1165 -0
  408. package/src/lib/stores/cloudBlockStoreBase.js.map +1 -0
  409. package/src/lib/stores/diskBlockAsyncStore.js +9 -5
  410. package/src/lib/stores/diskBlockAsyncStore.js.map +1 -1
  411. package/src/lib/stores/diskBlockMetadataStore.js +2 -0
  412. package/src/lib/stores/diskBlockMetadataStore.js.map +1 -1
  413. package/src/lib/stores/diskBlockStore.js +10 -8
  414. package/src/lib/stores/diskBlockStore.js.map +1 -1
  415. package/src/lib/stores/diskCBLStore.d.ts.map +1 -1
  416. package/src/lib/stores/diskCBLStore.js +8 -0
  417. package/src/lib/stores/diskCBLStore.js.map +1 -1
  418. package/src/lib/stores/index.d.ts +1 -0
  419. package/src/lib/stores/index.d.ts.map +1 -1
  420. package/src/lib/stores/index.js +1 -0
  421. package/src/lib/stores/index.js.map +1 -1
  422. package/src/lib/systemKeyring.d.ts.map +1 -1
  423. package/src/lib/systemKeyring.js +5 -4
  424. package/src/lib/systemKeyring.js.map +1 -1
  425. package/src/lib/transforms/checksumTransform.js +1 -0
  426. package/src/lib/transforms/checksumTransform.js.map +1 -1
  427. package/src/lib/transforms/memoryWritableStream.js +1 -0
  428. package/src/lib/transforms/memoryWritableStream.js.map +1 -1
  429. package/src/lib/transforms/xorMultipleTransform.js +3 -0
  430. package/src/lib/transforms/xorMultipleTransform.js.map +1 -1
  431. package/src/lib/utils/rehydration.d.ts +1 -1
  432. package/src/lib/utils/rehydration.js +1 -1
  433. package/src/lib/utils/serialization.d.ts +1 -1
  434. package/src/lib/utils/serialization.js +1 -1
  435. package/src/lib/services/backupCodeService.d.ts +0 -35
  436. package/src/lib/services/backupCodeService.d.ts.map +0 -1
  437. package/src/lib/services/backupCodeService.js +0 -109
  438. 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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"}