@brightchain/brightchain-api-lib 0.13.0 → 0.15.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/index.d.ts +3 -0
- package/src/index.d.ts.map +1 -1
- package/src/index.js +5 -0
- package/src/index.js.map +1 -1
- package/src/lib/application.d.ts +1 -0
- package/src/lib/application.d.ts.map +1 -1
- package/src/lib/application.js +23 -0
- package/src/lib/application.js.map +1 -1
- package/src/lib/auth/aclEnforcedAvailability.d.ts +57 -0
- package/src/lib/auth/aclEnforcedAvailability.d.ts.map +1 -0
- package/src/lib/auth/aclEnforcedAvailability.js +87 -0
- package/src/lib/auth/aclEnforcedAvailability.js.map +1 -0
- package/src/lib/auth/aclEnforcedBlockStore.d.ts +66 -0
- package/src/lib/auth/aclEnforcedBlockStore.d.ts.map +1 -0
- package/src/lib/auth/aclEnforcedBlockStore.js +83 -0
- package/src/lib/auth/aclEnforcedBlockStore.js.map +1 -0
- package/src/lib/auth/ecdsaNodeAuthenticator.d.ts +46 -0
- package/src/lib/auth/ecdsaNodeAuthenticator.d.ts.map +1 -0
- package/src/lib/auth/ecdsaNodeAuthenticator.js +110 -0
- package/src/lib/auth/ecdsaNodeAuthenticator.js.map +1 -0
- package/src/lib/auth/index.d.ts +7 -0
- package/src/lib/auth/index.d.ts.map +1 -0
- package/src/lib/auth/index.js +13 -0
- package/src/lib/auth/index.js.map +1 -0
- package/src/lib/auth/poolAclBootstrap.d.ts +36 -0
- package/src/lib/auth/poolAclBootstrap.d.ts.map +1 -0
- package/src/lib/auth/poolAclBootstrap.js +64 -0
- package/src/lib/auth/poolAclBootstrap.js.map +1 -0
- package/src/lib/auth/poolAclStore.d.ts +77 -0
- package/src/lib/auth/poolAclStore.d.ts.map +1 -0
- package/src/lib/auth/poolAclStore.js +189 -0
- package/src/lib/auth/poolAclStore.js.map +1 -0
- package/src/lib/auth/poolAclUpdater.d.ts +79 -0
- package/src/lib/auth/poolAclUpdater.d.ts.map +1 -0
- package/src/lib/auth/poolAclUpdater.js +144 -0
- package/src/lib/auth/poolAclUpdater.js.map +1 -0
- package/src/lib/availability/availabilityService.d.ts +2 -2
- package/src/lib/availability/availabilityService.d.ts.map +1 -1
- package/src/lib/availability/availabilityService.js +12 -5
- package/src/lib/availability/availabilityService.js.map +1 -1
- package/src/lib/availability/blockRegistry.d.ts +45 -3
- package/src/lib/availability/blockRegistry.d.ts.map +1 -1
- package/src/lib/availability/blockRegistry.js +123 -5
- package/src/lib/availability/blockRegistry.js.map +1 -1
- package/src/lib/availability/configValidation.d.ts.map +1 -1
- package/src/lib/availability/configValidation.js +20 -0
- package/src/lib/availability/configValidation.js.map +1 -1
- package/src/lib/availability/discoveryProtocol.d.ts +30 -1
- package/src/lib/availability/discoveryProtocol.d.ts.map +1 -1
- package/src/lib/availability/discoveryProtocol.js +76 -0
- package/src/lib/availability/discoveryProtocol.js.map +1 -1
- package/src/lib/availability/gossipService.d.ts +193 -11
- package/src/lib/availability/gossipService.d.ts.map +1 -1
- package/src/lib/availability/gossipService.js +473 -21
- package/src/lib/availability/gossipService.js.map +1 -1
- package/src/lib/availability/reconciliationService.d.ts +88 -1
- package/src/lib/availability/reconciliationService.d.ts.map +1 -1
- package/src/lib/availability/reconciliationService.js +246 -48
- package/src/lib/availability/reconciliationService.js.map +1 -1
- package/src/lib/blockFetch/blockFetcher.d.ts +100 -0
- package/src/lib/blockFetch/blockFetcher.d.ts.map +1 -0
- package/src/lib/blockFetch/blockFetcher.js +279 -0
- package/src/lib/blockFetch/blockFetcher.js.map +1 -0
- package/src/lib/blockFetch/fetchQueue.d.ts +88 -0
- package/src/lib/blockFetch/fetchQueue.d.ts.map +1 -0
- package/src/lib/blockFetch/fetchQueue.js +204 -0
- package/src/lib/blockFetch/fetchQueue.js.map +1 -0
- package/src/lib/blockFetch/httpBlockFetchTransport.d.ts +65 -0
- package/src/lib/blockFetch/httpBlockFetchTransport.d.ts.map +1 -0
- package/src/lib/blockFetch/httpBlockFetchTransport.js +104 -0
- package/src/lib/blockFetch/httpBlockFetchTransport.js.map +1 -0
- package/src/lib/blockFetch/index.d.ts +10 -0
- package/src/lib/blockFetch/index.d.ts.map +1 -0
- package/src/lib/blockFetch/index.js +13 -0
- package/src/lib/blockFetch/index.js.map +1 -0
- package/src/lib/controllers/api/brightpass.d.ts +72 -0
- package/src/lib/controllers/api/brightpass.d.ts.map +1 -0
- package/src/lib/controllers/api/brightpass.js +577 -0
- package/src/lib/controllers/api/brightpass.js.map +1 -0
- package/src/lib/controllers/api/channels.d.ts +122 -0
- package/src/lib/controllers/api/channels.d.ts.map +1 -0
- package/src/lib/controllers/api/channels.js +701 -0
- package/src/lib/controllers/api/channels.js.map +1 -0
- package/src/lib/controllers/api/conversations.d.ts +89 -0
- package/src/lib/controllers/api/conversations.d.ts.map +1 -0
- package/src/lib/controllers/api/conversations.js +259 -0
- package/src/lib/controllers/api/conversations.js.map +1 -0
- package/src/lib/controllers/api/emails.d.ts +122 -0
- package/src/lib/controllers/api/emails.d.ts.map +1 -0
- package/src/lib/controllers/api/emails.js +494 -0
- package/src/lib/controllers/api/emails.js.map +1 -0
- package/src/lib/controllers/api/explodingMessages.d.ts +79 -0
- package/src/lib/controllers/api/explodingMessages.d.ts.map +1 -0
- package/src/lib/controllers/api/explodingMessages.js +378 -0
- package/src/lib/controllers/api/explodingMessages.js.map +1 -0
- package/src/lib/controllers/api/groups.d.ts +94 -0
- package/src/lib/controllers/api/groups.d.ts.map +1 -0
- package/src/lib/controllers/api/groups.js +484 -0
- package/src/lib/controllers/api/groups.js.map +1 -0
- package/src/lib/controllers/api/index.d.ts +6 -0
- package/src/lib/controllers/api/index.d.ts.map +1 -1
- package/src/lib/controllers/api/index.js +6 -0
- package/src/lib/controllers/api/index.js.map +1 -1
- package/src/lib/controllers/api/messages.d.ts.map +1 -1
- package/src/lib/controllers/api/messages.js +2 -1
- package/src/lib/controllers/api/messages.js.map +1 -1
- package/src/lib/controllers/api/sync.d.ts +38 -2
- package/src/lib/controllers/api/sync.d.ts.map +1 -1
- package/src/lib/controllers/api/sync.js +89 -0
- package/src/lib/controllers/api/sync.js.map +1 -1
- package/src/lib/controllers/crypto/gitController.d.ts +70 -0
- package/src/lib/controllers/crypto/gitController.d.ts.map +1 -0
- package/src/lib/controllers/crypto/gitController.js +306 -0
- package/src/lib/controllers/crypto/gitController.js.map +1 -0
- package/src/lib/controllers/crypto/index.d.ts +3 -0
- package/src/lib/controllers/crypto/index.d.ts.map +1 -0
- package/src/lib/controllers/crypto/index.js +6 -0
- package/src/lib/controllers/crypto/index.js.map +1 -0
- package/src/lib/controllers/crypto/walletController.d.ts +64 -0
- package/src/lib/controllers/crypto/walletController.d.ts.map +1 -0
- package/src/lib/controllers/crypto/walletController.js +260 -0
- package/src/lib/controllers/crypto/walletController.js.map +1 -0
- package/src/lib/controllers/identity/deviceController.d.ts +96 -0
- package/src/lib/controllers/identity/deviceController.d.ts.map +1 -0
- package/src/lib/controllers/identity/deviceController.js +355 -0
- package/src/lib/controllers/identity/deviceController.js.map +1 -0
- package/src/lib/controllers/identity/directoryController.d.ts +75 -0
- package/src/lib/controllers/identity/directoryController.d.ts.map +1 -0
- package/src/lib/controllers/identity/directoryController.js +288 -0
- package/src/lib/controllers/identity/directoryController.js.map +1 -0
- package/src/lib/controllers/identity/identityProofController.d.ts +94 -0
- package/src/lib/controllers/identity/identityProofController.d.ts.map +1 -0
- package/src/lib/controllers/identity/identityProofController.js +454 -0
- package/src/lib/controllers/identity/identityProofController.js.map +1 -0
- package/src/lib/controllers/identity/index.d.ts +4 -0
- package/src/lib/controllers/identity/index.d.ts.map +1 -0
- package/src/lib/controllers/identity/index.js +7 -0
- package/src/lib/controllers/identity/index.js.map +1 -0
- package/src/lib/controllers/index.d.ts +2 -0
- package/src/lib/controllers/index.d.ts.map +1 -1
- package/src/lib/controllers/index.js +2 -0
- package/src/lib/controllers/index.js.map +1 -1
- package/src/lib/encryption/encryptedMetadataService.d.ts +87 -0
- package/src/lib/encryption/encryptedMetadataService.d.ts.map +1 -0
- package/src/lib/encryption/encryptedMetadataService.js +224 -0
- package/src/lib/encryption/encryptedMetadataService.js.map +1 -0
- package/src/lib/encryption/encryptionAwareReplication.d.ts +76 -0
- package/src/lib/encryption/encryptionAwareReplication.d.ts.map +1 -0
- package/src/lib/encryption/encryptionAwareReplication.js +116 -0
- package/src/lib/encryption/encryptionAwareReplication.js.map +1 -0
- package/src/lib/encryption/errors.d.ts +49 -0
- package/src/lib/encryption/errors.d.ts.map +1 -0
- package/src/lib/encryption/errors.js +80 -0
- package/src/lib/encryption/errors.js.map +1 -0
- package/src/lib/encryption/index.d.ts +6 -0
- package/src/lib/encryption/index.d.ts.map +1 -0
- package/src/lib/encryption/index.js +9 -0
- package/src/lib/encryption/index.js.map +1 -0
- package/src/lib/encryption/poolEncryptionService.d.ts +94 -0
- package/src/lib/encryption/poolEncryptionService.d.ts.map +1 -0
- package/src/lib/encryption/poolEncryptionService.js +252 -0
- package/src/lib/encryption/poolEncryptionService.js.map +1 -0
- package/src/lib/encryption/poolKeyManager.d.ts +82 -0
- package/src/lib/encryption/poolKeyManager.d.ts.map +1 -0
- package/src/lib/encryption/poolKeyManager.js +156 -0
- package/src/lib/encryption/poolKeyManager.js.map +1 -0
- package/src/lib/environment.d.ts +3 -0
- package/src/lib/environment.d.ts.map +1 -1
- package/src/lib/environment.js +5 -0
- package/src/lib/environment.js.map +1 -1
- package/src/lib/interfaces/environment.d.ts +7 -1
- package/src/lib/interfaces/environment.d.ts.map +1 -1
- package/src/lib/interfaces/index.d.ts +0 -1
- package/src/lib/interfaces/index.d.ts.map +1 -1
- package/src/lib/interfaces/requests/getBlockDataRequest.d.ts +12 -0
- package/src/lib/interfaces/requests/getBlockDataRequest.d.ts.map +1 -0
- package/src/lib/interfaces/{blockStore.js → requests/getBlockDataRequest.js} +1 -1
- package/src/lib/interfaces/requests/getBlockDataRequest.js.map +1 -0
- package/src/lib/interfaces/requests/index.d.ts +1 -0
- package/src/lib/interfaces/requests/index.d.ts.map +1 -1
- package/src/lib/interfaces/websocketMessages.d.ts +30 -1
- package/src/lib/interfaces/websocketMessages.d.ts.map +1 -1
- package/src/lib/routers/api.d.ts +54 -1
- package/src/lib/routers/api.d.ts.map +1 -1
- package/src/lib/routers/api.js +77 -0
- package/src/lib/routers/api.js.map +1 -1
- package/src/lib/services/blockStore.d.ts +5 -2
- package/src/lib/services/blockStore.d.ts.map +1 -1
- package/src/lib/services/blockStore.js +4 -0
- package/src/lib/services/blockStore.js.map +1 -1
- package/src/lib/services/brightpass/auditLogger.d.ts +77 -0
- package/src/lib/services/brightpass/auditLogger.d.ts.map +1 -0
- package/src/lib/services/brightpass/auditLogger.js +184 -0
- package/src/lib/services/brightpass/auditLogger.js.map +1 -0
- package/src/lib/services/brightpass/vaultEncryption.d.ts +82 -0
- package/src/lib/services/brightpass/vaultEncryption.d.ts.map +1 -0
- package/src/lib/services/brightpass/vaultEncryption.js +144 -0
- package/src/lib/services/brightpass/vaultEncryption.js.map +1 -0
- package/src/lib/services/brightpass.d.ts +294 -0
- package/src/lib/services/brightpass.d.ts.map +1 -0
- package/src/lib/services/brightpass.js +1260 -0
- package/src/lib/services/brightpass.js.map +1 -0
- package/src/lib/services/eventNotificationSystem.d.ts +69 -3
- package/src/lib/services/eventNotificationSystem.d.ts.map +1 -1
- package/src/lib/services/eventNotificationSystem.js +200 -0
- package/src/lib/services/eventNotificationSystem.js.map +1 -1
- package/src/lib/services/expirationScheduler.d.ts +90 -0
- package/src/lib/services/expirationScheduler.d.ts.map +1 -0
- package/src/lib/services/expirationScheduler.js +131 -0
- package/src/lib/services/expirationScheduler.js.map +1 -0
- package/src/lib/services/fecUsageExample.d.ts +2 -2
- package/src/lib/services/index.d.ts +3 -0
- package/src/lib/services/index.d.ts.map +1 -1
- package/src/lib/services/index.js +3 -0
- package/src/lib/services/index.js.map +1 -1
- package/src/lib/services/messagePassingService.d.ts +95 -5
- package/src/lib/services/messagePassingService.d.ts.map +1 -1
- package/src/lib/services/messagePassingService.js +187 -28
- package/src/lib/services/messagePassingService.js.map +1 -1
- package/src/lib/services/paginationService.d.ts +18 -0
- package/src/lib/services/paginationService.d.ts.map +1 -0
- package/src/lib/services/paginationService.js +32 -0
- package/src/lib/services/paginationService.js.map +1 -0
- package/src/lib/services/presenceService.d.ts +76 -0
- package/src/lib/services/presenceService.d.ts.map +1 -0
- package/src/lib/services/presenceService.js +143 -0
- package/src/lib/services/presenceService.js.map +1 -0
- package/src/lib/services/webSocketMessageServer.d.ts +18 -23
- package/src/lib/services/webSocketMessageServer.d.ts.map +1 -1
- package/src/lib/services/webSocketMessageServer.js +30 -46
- package/src/lib/services/webSocketMessageServer.js.map +1 -1
- package/src/lib/services/webSocketPeerProvider.d.ts +49 -0
- package/src/lib/services/webSocketPeerProvider.d.ts.map +1 -0
- package/src/lib/services/webSocketPeerProvider.js +133 -0
- package/src/lib/services/webSocketPeerProvider.js.map +1 -0
- package/src/lib/services/websocketHandler.d.ts +11 -8
- package/src/lib/services/websocketHandler.d.ts.map +1 -1
- package/src/lib/services/websocketHandler.js +33 -40
- package/src/lib/services/websocketHandler.js.map +1 -1
- package/src/lib/services/wireConversationPromotion.d.ts +23 -0
- package/src/lib/services/wireConversationPromotion.d.ts.map +1 -0
- package/src/lib/services/wireConversationPromotion.js +26 -0
- package/src/lib/services/wireConversationPromotion.js.map +1 -0
- package/src/lib/stores/availabilityAwareBlockStore.d.ts +115 -10
- package/src/lib/stores/availabilityAwareBlockStore.d.ts.map +1 -1
- package/src/lib/stores/availabilityAwareBlockStore.js +267 -23
- package/src/lib/stores/availabilityAwareBlockStore.js.map +1 -1
- package/src/lib/stores/diskBlockAsyncStore.d.ts +81 -2
- package/src/lib/stores/diskBlockAsyncStore.d.ts.map +1 -1
- package/src/lib/stores/diskBlockAsyncStore.js +297 -10
- package/src/lib/stores/diskBlockAsyncStore.js.map +1 -1
- package/src/lib/stores/diskMessageMetadataStore.d.ts +2 -2
- package/src/lib/stores/diskMessageMetadataStore.d.ts.map +1 -1
- package/src/lib/stores/diskMessageMetadataStore.js +1 -1
- package/src/lib/stores/diskMessageMetadataStore.js.map +1 -1
- package/src/lib/utils/communicationValidation.d.ts +44 -0
- package/src/lib/utils/communicationValidation.d.ts.map +1 -0
- package/src/lib/utils/communicationValidation.js +291 -0
- package/src/lib/utils/communicationValidation.js.map +1 -0
- package/src/lib/utils/emailValidation.d.ts +19 -0
- package/src/lib/utils/emailValidation.d.ts.map +1 -0
- package/src/lib/utils/emailValidation.js +232 -0
- package/src/lib/utils/emailValidation.js.map +1 -0
- package/src/lib/interfaces/blockStore.d.ts +0 -7
- package/src/lib/interfaces/blockStore.d.ts.map +0 -1
- package/src/lib/interfaces/blockStore.js.map +0 -1
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ExpirationScheduler — Background job for cleaning up expired messages.
|
|
4
|
+
*
|
|
5
|
+
* Periodically scans messages for time-based and read-count-based
|
|
6
|
+
* expiration, explodes expired messages, and emits events for
|
|
7
|
+
* downstream consumers (e.g., WebSocket notifications).
|
|
8
|
+
*
|
|
9
|
+
* This is a Node.js-specific service that lives in brightchain-api-lib.
|
|
10
|
+
*
|
|
11
|
+
* Requirements: 8.4, 8.6, 8.9
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.ExpirationScheduler = exports.ExpirationSchedulerEvent = void 0;
|
|
15
|
+
const explodingMessageService_1 = require("@brightchain/brightchain-lib/lib/services/communication/explodingMessageService");
|
|
16
|
+
const events_1 = require("events");
|
|
17
|
+
// ─── Events ─────────────────────────────────────────────────────────────────
|
|
18
|
+
var ExpirationSchedulerEvent;
|
|
19
|
+
(function (ExpirationSchedulerEvent) {
|
|
20
|
+
/** Emitted when a message is exploded by the scheduler */
|
|
21
|
+
ExpirationSchedulerEvent["MESSAGE_EXPLODED"] = "scheduler:message_exploded";
|
|
22
|
+
/** Emitted when a batch of expired messages is found */
|
|
23
|
+
ExpirationSchedulerEvent["BATCH_EXPIRED"] = "scheduler:batch_expired";
|
|
24
|
+
/** Emitted when the scheduler encounters an error */
|
|
25
|
+
ExpirationSchedulerEvent["ERROR"] = "scheduler:error";
|
|
26
|
+
/** Emitted when the scheduler starts */
|
|
27
|
+
ExpirationSchedulerEvent["STARTED"] = "scheduler:started";
|
|
28
|
+
/** Emitted when the scheduler stops */
|
|
29
|
+
ExpirationSchedulerEvent["STOPPED"] = "scheduler:stopped";
|
|
30
|
+
})(ExpirationSchedulerEvent || (exports.ExpirationSchedulerEvent = ExpirationSchedulerEvent = {}));
|
|
31
|
+
// ─── Scheduler ──────────────────────────────────────────────────────────────
|
|
32
|
+
/**
|
|
33
|
+
* Background scheduler that periodically checks for and cleans up
|
|
34
|
+
* expired exploding messages.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```typescript
|
|
38
|
+
* const scheduler = new ExpirationScheduler(
|
|
39
|
+
* () => messageStore.getAllExplodingMessages(),
|
|
40
|
+
* { intervalMs: 5000 },
|
|
41
|
+
* );
|
|
42
|
+
*
|
|
43
|
+
* scheduler.on(ExpirationSchedulerEvent.MESSAGE_EXPLODED, (event) => {
|
|
44
|
+
* console.log(`Message ${event.messageId} exploded`);
|
|
45
|
+
* });
|
|
46
|
+
*
|
|
47
|
+
* scheduler.start();
|
|
48
|
+
* // ... later
|
|
49
|
+
* scheduler.stop();
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
class ExpirationScheduler extends events_1.EventEmitter {
|
|
53
|
+
constructor(messageProvider, config = {}) {
|
|
54
|
+
super();
|
|
55
|
+
this.timer = null;
|
|
56
|
+
this.running = false;
|
|
57
|
+
this.messageProvider = messageProvider;
|
|
58
|
+
this.intervalMs = config.intervalMs ?? 10000;
|
|
59
|
+
this.autoExplode = config.autoExplode ?? true;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Start the scheduler. Begins periodic cleanup runs.
|
|
63
|
+
*
|
|
64
|
+
* @throws {Error} If the scheduler is already running
|
|
65
|
+
*/
|
|
66
|
+
start() {
|
|
67
|
+
if (this.running) {
|
|
68
|
+
throw new Error('ExpirationScheduler is already running');
|
|
69
|
+
}
|
|
70
|
+
this.running = true;
|
|
71
|
+
this.timer = setInterval(() => {
|
|
72
|
+
void this.tick();
|
|
73
|
+
}, this.intervalMs);
|
|
74
|
+
this.emit(ExpirationSchedulerEvent.STARTED);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Stop the scheduler. Cancels the periodic cleanup timer.
|
|
78
|
+
*/
|
|
79
|
+
stop() {
|
|
80
|
+
if (this.timer) {
|
|
81
|
+
clearInterval(this.timer);
|
|
82
|
+
this.timer = null;
|
|
83
|
+
}
|
|
84
|
+
this.running = false;
|
|
85
|
+
this.emit(ExpirationSchedulerEvent.STOPPED);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Whether the scheduler is currently running.
|
|
89
|
+
*/
|
|
90
|
+
get isRunning() {
|
|
91
|
+
return this.running;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Run a single cleanup tick manually.
|
|
95
|
+
* Useful for testing or on-demand cleanup.
|
|
96
|
+
*
|
|
97
|
+
* @returns The events generated during this tick
|
|
98
|
+
*/
|
|
99
|
+
async tick() {
|
|
100
|
+
try {
|
|
101
|
+
const messages = await this.messageProvider();
|
|
102
|
+
const { expired, events } = explodingMessageService_1.ExplodingMessageService.deleteExpired(messages);
|
|
103
|
+
if (expired.length === 0) {
|
|
104
|
+
return [];
|
|
105
|
+
}
|
|
106
|
+
// Explode each expired message
|
|
107
|
+
const explodedEvents = [];
|
|
108
|
+
if (this.autoExplode) {
|
|
109
|
+
for (const message of expired) {
|
|
110
|
+
if (!message.exploded) {
|
|
111
|
+
const event = explodingMessageService_1.ExplodingMessageService.explode(message);
|
|
112
|
+
explodedEvents.push(event);
|
|
113
|
+
this.emit(ExpirationSchedulerEvent.MESSAGE_EXPLODED, event);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Emit batch event
|
|
118
|
+
this.emit(ExpirationSchedulerEvent.BATCH_EXPIRED, {
|
|
119
|
+
count: expired.length,
|
|
120
|
+
events: explodedEvents.length > 0 ? explodedEvents : events,
|
|
121
|
+
});
|
|
122
|
+
return explodedEvents.length > 0 ? explodedEvents : events;
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
this.emit(ExpirationSchedulerEvent.ERROR, error);
|
|
126
|
+
return [];
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
exports.ExpirationScheduler = ExpirationScheduler;
|
|
131
|
+
//# sourceMappingURL=expirationScheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expirationScheduler.js","sourceRoot":"","sources":["../../../../../brightchain-api-lib/src/lib/services/expirationScheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,7 +15,7 @@ export declare class FecUsageExample {
|
|
|
15
15
|
/**
|
|
16
16
|
* Example: Recover a corrupted file using parity data
|
|
17
17
|
*/
|
|
18
|
-
recoverCorruptedFile(parityData: ParityData[], originalSize: number): Promise<Uint8Array<ArrayBufferLike
|
|
18
|
+
recoverCorruptedFile(parityData: ParityData[], originalSize: number): Promise<Uint8Array<ArrayBufferLike>>;
|
|
19
19
|
/**
|
|
20
20
|
* Example: Verify file integrity using parity data
|
|
21
21
|
*/
|
|
@@ -25,7 +25,7 @@ export declare class FecUsageExample {
|
|
|
25
25
|
*/
|
|
26
26
|
demonstrateWorkflow(): Promise<{
|
|
27
27
|
originalFile: Buffer<ArrayBuffer>;
|
|
28
|
-
recoveredFile: Uint8Array<ArrayBufferLike
|
|
28
|
+
recoveredFile: Uint8Array<ArrayBufferLike>;
|
|
29
29
|
parityData: ParityData[];
|
|
30
30
|
recoverySuccessful: boolean;
|
|
31
31
|
}>;
|
|
@@ -12,10 +12,13 @@ export * from './fecUsageExample';
|
|
|
12
12
|
export * from './messageEventsWebSocketHandler';
|
|
13
13
|
export * from './messagePassingService';
|
|
14
14
|
export * from './nativeRsFecService';
|
|
15
|
+
export * from './presenceService';
|
|
15
16
|
export * from './quorum';
|
|
16
17
|
export * from './requestUser';
|
|
17
18
|
export * from './role';
|
|
18
19
|
export * from './secureKeyStorage';
|
|
19
20
|
export * from './websocketHandler';
|
|
20
21
|
export * from './webSocketMessageServer';
|
|
22
|
+
export * from './webSocketPeerProvider';
|
|
23
|
+
export * from './wireConversationPromotion';
|
|
21
24
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../brightchain-api-lib/src/lib/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,SAAS,CAAC;AACxB,cAAc,2BAA2B,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iCAAiC,CAAC;AAChD,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,QAAQ,CAAC;AACvB,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../brightchain-api-lib/src/lib/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,SAAS,CAAC;AACxB,cAAc,2BAA2B,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iCAAiC,CAAC;AAChD,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,QAAQ,CAAC;AACvB,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC"}
|
|
@@ -17,10 +17,13 @@ tslib_1.__exportStar(require("./fecUsageExample"), exports);
|
|
|
17
17
|
tslib_1.__exportStar(require("./messageEventsWebSocketHandler"), exports);
|
|
18
18
|
tslib_1.__exportStar(require("./messagePassingService"), exports);
|
|
19
19
|
tslib_1.__exportStar(require("./nativeRsFecService"), exports);
|
|
20
|
+
tslib_1.__exportStar(require("./presenceService"), exports);
|
|
20
21
|
tslib_1.__exportStar(require("./quorum"), exports);
|
|
21
22
|
tslib_1.__exportStar(require("./requestUser"), exports);
|
|
22
23
|
tslib_1.__exportStar(require("./role"), exports);
|
|
23
24
|
tslib_1.__exportStar(require("./secureKeyStorage"), exports);
|
|
24
25
|
tslib_1.__exportStar(require("./websocketHandler"), exports);
|
|
25
26
|
tslib_1.__exportStar(require("./webSocketMessageServer"), exports);
|
|
27
|
+
tslib_1.__exportStar(require("./webSocketPeerProvider"), exports);
|
|
28
|
+
tslib_1.__exportStar(require("./wireConversationPromotion"), exports);
|
|
26
29
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../brightchain-api-lib/src/lib/services/index.ts"],"names":[],"mappings":";;;;AAAA,iDAAuB;AACvB,iDAAuB;AACvB,mDAAyB;AACzB,gEAAsC;AACtC,uDAA6B;AAC7B,8DAAoC;AACpC,kDAAwB;AACxB,oEAA0C;AAC1C,6BAAuC;AAA9B,qGAAA,cAAc,OAAA;AACvB,8DAAoC;AACpC,4DAAkC;AAClC,0EAAgD;AAChD,kEAAwC;AACxC,+DAAqC;AACrC,mDAAyB;AACzB,wDAA8B;AAC9B,iDAAuB;AACvB,6DAAmC;AACnC,6DAAmC;AACnC,mEAAyC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../brightchain-api-lib/src/lib/services/index.ts"],"names":[],"mappings":";;;;AAAA,iDAAuB;AACvB,iDAAuB;AACvB,mDAAyB;AACzB,gEAAsC;AACtC,uDAA6B;AAC7B,8DAAoC;AACpC,kDAAwB;AACxB,oEAA0C;AAC1C,6BAAuC;AAA9B,qGAAA,cAAc,OAAA;AACvB,8DAAoC;AACpC,4DAAkC;AAClC,0EAAgD;AAChD,kEAAwC;AACxC,+DAAqC;AACrC,4DAAkC;AAClC,mDAAyB;AACzB,wDAA8B;AAC9B,iDAAuB;AACvB,6DAAmC;AACnC,6DAAmC;AACnC,mEAAyC;AACzC,kEAAwC;AACxC,sEAA4C"}
|
|
@@ -1,17 +1,92 @@
|
|
|
1
|
-
import { IMessageCBLOptions as ICreateMessageOptions, IMessageMetadata, IMessageMetadataStore, MessageCBLService } from '@brightchain/brightchain-lib';
|
|
1
|
+
import { IMessageCBLOptions as ICreateMessageOptions, IGossipService, IMessageMetadata, IMessageMetadataStore, MessageCBLService, type IDeliveryReceipt, type IEmailContent, type IEmailInput, type IEmailMetadata, type IEmailMetadataStore, type IEmailServiceConfig, type IInboxQuery, type IInboxResult, type IMailbox, type IReplyInput, type ISendEmailResult } from '@brightchain/brightchain-lib';
|
|
2
2
|
import { EventNotificationSystem } from './eventNotificationSystem';
|
|
3
|
-
import { WebSocketMessageServer } from './webSocketMessageServer';
|
|
4
3
|
/**
|
|
5
|
-
* High-level message passing service coordinating storage, routing, and events
|
|
4
|
+
* High-level message passing service coordinating storage, routing, and events.
|
|
5
|
+
*
|
|
6
|
+
* Uses IGossipService for message delivery instead of WebSocketMessageServer.
|
|
7
|
+
* Messages are announced via gossip protocol and delivery acknowledgments
|
|
8
|
+
* are received through gossip ack events.
|
|
9
|
+
*
|
|
10
|
+
* @see Requirements 7.1, 7.2, 7.3, 7.4, 7.5
|
|
6
11
|
*/
|
|
7
12
|
export declare class MessagePassingService {
|
|
8
13
|
private messageCBL;
|
|
9
14
|
private metadataStore;
|
|
10
15
|
private eventSystem;
|
|
11
|
-
private
|
|
12
|
-
|
|
16
|
+
private gossipService;
|
|
17
|
+
private emailService?;
|
|
18
|
+
constructor(messageCBL: MessageCBLService, metadataStore: IMessageMetadataStore, eventSystem: EventNotificationSystem, gossipService: IGossipService);
|
|
19
|
+
/**
|
|
20
|
+
* Wire up the EmailMessageService for email-specific operations.
|
|
21
|
+
*
|
|
22
|
+
* Call this after construction to enable email methods (sendEmail,
|
|
23
|
+
* getEmail, queryInbox, etc.). Without this, email methods will throw.
|
|
24
|
+
*/
|
|
25
|
+
configureEmail(emailMetadataStore: IEmailMetadataStore, config?: Partial<IEmailServiceConfig>): void;
|
|
26
|
+
/**
|
|
27
|
+
* Returns the underlying EmailMessageService.
|
|
28
|
+
* @throws Error if email has not been configured via configureEmail()
|
|
29
|
+
*/
|
|
30
|
+
private getEmailService;
|
|
31
|
+
/**
|
|
32
|
+
* Send an email message via the BrightChain email protocol.
|
|
33
|
+
*
|
|
34
|
+
* @see Requirements 15.1, 15.4
|
|
35
|
+
*/
|
|
36
|
+
sendEmail(email: IEmailInput): Promise<ISendEmailResult>;
|
|
37
|
+
/**
|
|
38
|
+
* Retrieve email metadata by message ID.
|
|
39
|
+
*/
|
|
40
|
+
getEmail(messageId: string): Promise<IEmailMetadata | null>;
|
|
41
|
+
/**
|
|
42
|
+
* Retrieve full email content including MIME parts and attachments.
|
|
43
|
+
*/
|
|
44
|
+
getEmailContent(messageId: string): Promise<IEmailContent>;
|
|
45
|
+
/**
|
|
46
|
+
* Delete an email by message ID.
|
|
47
|
+
*/
|
|
48
|
+
deleteEmail(messageId: string): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Query a user's inbox with filtering, sorting, and pagination.
|
|
51
|
+
*
|
|
52
|
+
* @see Requirements 13.1, 13.2, 13.3, 13.6, 13.7
|
|
53
|
+
*/
|
|
54
|
+
queryInbox(userId: string, query: IInboxQuery): Promise<IInboxResult>;
|
|
55
|
+
/**
|
|
56
|
+
* Mark an email as read for a specific user.
|
|
57
|
+
*/
|
|
58
|
+
markEmailAsRead(messageId: string, userId: string): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Get unread email count for a user.
|
|
61
|
+
*/
|
|
62
|
+
getUnreadEmailCount(userId: string): Promise<number>;
|
|
63
|
+
/**
|
|
64
|
+
* Get all emails in a thread.
|
|
65
|
+
*/
|
|
66
|
+
getEmailThread(messageId: string): Promise<IEmailMetadata[]>;
|
|
67
|
+
/**
|
|
68
|
+
* Create a reply to an existing email.
|
|
69
|
+
*
|
|
70
|
+
* @see Requirements 10.1, 10.2, 10.3
|
|
71
|
+
*/
|
|
72
|
+
createEmailReply(originalId: string, replyContent: IReplyInput): Promise<ISendEmailResult>;
|
|
73
|
+
/**
|
|
74
|
+
* Forward an email to new recipients.
|
|
75
|
+
*
|
|
76
|
+
* @see Requirements 17.1, 17.2, 17.3
|
|
77
|
+
*/
|
|
78
|
+
forwardEmail(originalId: string, forwardTo: IMailbox[]): Promise<ISendEmailResult>;
|
|
79
|
+
/**
|
|
80
|
+
* Get delivery status for all recipients of an email.
|
|
81
|
+
*/
|
|
82
|
+
getEmailDeliveryStatus(messageId: string): Promise<Map<string, IDeliveryReceipt>>;
|
|
13
83
|
/**
|
|
14
84
|
* Send a message
|
|
85
|
+
*
|
|
86
|
+
* Stores the message via MessageCBLService, emits MESSAGE_STORED event,
|
|
87
|
+
* then announces the message via gossip protocol for delivery.
|
|
88
|
+
*
|
|
89
|
+
* @see Requirements 7.1, 7.3, 7.5
|
|
15
90
|
*/
|
|
16
91
|
sendMessage(content: Buffer, senderId: string, options: ICreateMessageOptions): Promise<{
|
|
17
92
|
messageId: string;
|
|
@@ -19,16 +94,31 @@ export declare class MessagePassingService {
|
|
|
19
94
|
}>;
|
|
20
95
|
/**
|
|
21
96
|
* Get message content
|
|
97
|
+
*
|
|
98
|
+
* @see Requirements 7.5
|
|
22
99
|
*/
|
|
23
100
|
getMessage(messageId: string): Promise<Buffer | null>;
|
|
24
101
|
/**
|
|
25
102
|
* Query messages
|
|
103
|
+
*
|
|
104
|
+
* @see Requirements 7.5
|
|
26
105
|
*/
|
|
27
106
|
queryMessages(query: Record<string, unknown>): Promise<IMessageMetadata[]>;
|
|
28
107
|
/**
|
|
29
108
|
* Delete message
|
|
109
|
+
*
|
|
110
|
+
* @see Requirements 7.5
|
|
30
111
|
*/
|
|
31
112
|
deleteMessage(messageId: string): Promise<void>;
|
|
113
|
+
/**
|
|
114
|
+
* Set up handlers for gossip delivery events.
|
|
115
|
+
*
|
|
116
|
+
* Listens for:
|
|
117
|
+
* - Message delivery announcements (incoming messages)
|
|
118
|
+
* - Delivery acknowledgments (confirmation of sent messages)
|
|
119
|
+
*
|
|
120
|
+
* @see Requirements 7.4
|
|
121
|
+
*/
|
|
32
122
|
private setupHandlers;
|
|
33
123
|
}
|
|
34
124
|
//# sourceMappingURL=messagePassingService.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messagePassingService.d.ts","sourceRoot":"","sources":["../../../../../brightchain-api-lib/src/lib/services/messagePassingService.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"messagePassingService.d.ts","sourceRoot":"","sources":["../../../../../brightchain-api-lib/src/lib/services/messagePassingService.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,40 +4,155 @@ exports.MessagePassingService = void 0;
|
|
|
4
4
|
const brightchain_lib_1 = require("@brightchain/brightchain-lib");
|
|
5
5
|
const eventNotificationSystem_1 = require("./eventNotificationSystem");
|
|
6
6
|
/**
|
|
7
|
-
* High-level message passing service coordinating storage, routing, and events
|
|
7
|
+
* High-level message passing service coordinating storage, routing, and events.
|
|
8
|
+
*
|
|
9
|
+
* Uses IGossipService for message delivery instead of WebSocketMessageServer.
|
|
10
|
+
* Messages are announced via gossip protocol and delivery acknowledgments
|
|
11
|
+
* are received through gossip ack events.
|
|
12
|
+
*
|
|
13
|
+
* @see Requirements 7.1, 7.2, 7.3, 7.4, 7.5
|
|
8
14
|
*/
|
|
9
15
|
class MessagePassingService {
|
|
10
|
-
constructor(messageCBL, metadataStore, eventSystem,
|
|
16
|
+
constructor(messageCBL, metadataStore, eventSystem, gossipService) {
|
|
11
17
|
this.messageCBL = messageCBL;
|
|
12
18
|
this.metadataStore = metadataStore;
|
|
13
19
|
this.eventSystem = eventSystem;
|
|
14
|
-
this.
|
|
20
|
+
this.gossipService = gossipService;
|
|
15
21
|
this.setupHandlers();
|
|
16
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* Wire up the EmailMessageService for email-specific operations.
|
|
25
|
+
*
|
|
26
|
+
* Call this after construction to enable email methods (sendEmail,
|
|
27
|
+
* getEmail, queryInbox, etc.). Without this, email methods will throw.
|
|
28
|
+
*/
|
|
29
|
+
configureEmail(emailMetadataStore, config) {
|
|
30
|
+
this.emailService = new brightchain_lib_1.EmailMessageService(this.messageCBL, emailMetadataStore, this.gossipService, config);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Returns the underlying EmailMessageService.
|
|
34
|
+
* @throws Error if email has not been configured via configureEmail()
|
|
35
|
+
*/
|
|
36
|
+
getEmailService() {
|
|
37
|
+
if (!this.emailService) {
|
|
38
|
+
throw new Error('Email not configured. Call configureEmail() before using email methods.');
|
|
39
|
+
}
|
|
40
|
+
return this.emailService;
|
|
41
|
+
}
|
|
42
|
+
// ─── Email Operations ─────────────────────────────────────────────
|
|
43
|
+
/**
|
|
44
|
+
* Send an email message via the BrightChain email protocol.
|
|
45
|
+
*
|
|
46
|
+
* @see Requirements 15.1, 15.4
|
|
47
|
+
*/
|
|
48
|
+
async sendEmail(email) {
|
|
49
|
+
return this.getEmailService().sendEmail(email);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Retrieve email metadata by message ID.
|
|
53
|
+
*/
|
|
54
|
+
async getEmail(messageId) {
|
|
55
|
+
return this.getEmailService().getEmail(messageId);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Retrieve full email content including MIME parts and attachments.
|
|
59
|
+
*/
|
|
60
|
+
async getEmailContent(messageId) {
|
|
61
|
+
return this.getEmailService().getEmailContent(messageId);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Delete an email by message ID.
|
|
65
|
+
*/
|
|
66
|
+
async deleteEmail(messageId) {
|
|
67
|
+
return this.getEmailService().deleteEmail(messageId);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Query a user's inbox with filtering, sorting, and pagination.
|
|
71
|
+
*
|
|
72
|
+
* @see Requirements 13.1, 13.2, 13.3, 13.6, 13.7
|
|
73
|
+
*/
|
|
74
|
+
async queryInbox(userId, query) {
|
|
75
|
+
return this.getEmailService().queryInbox(userId, query);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Mark an email as read for a specific user.
|
|
79
|
+
*/
|
|
80
|
+
async markEmailAsRead(messageId, userId) {
|
|
81
|
+
return this.getEmailService().markAsRead(messageId, userId);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Get unread email count for a user.
|
|
85
|
+
*/
|
|
86
|
+
async getUnreadEmailCount(userId) {
|
|
87
|
+
return this.getEmailService().getUnreadCount(userId);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Get all emails in a thread.
|
|
91
|
+
*/
|
|
92
|
+
async getEmailThread(messageId) {
|
|
93
|
+
return this.getEmailService().getThread(messageId);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Create a reply to an existing email.
|
|
97
|
+
*
|
|
98
|
+
* @see Requirements 10.1, 10.2, 10.3
|
|
99
|
+
*/
|
|
100
|
+
async createEmailReply(originalId, replyContent) {
|
|
101
|
+
return this.getEmailService().createReply(originalId, replyContent);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Forward an email to new recipients.
|
|
105
|
+
*
|
|
106
|
+
* @see Requirements 17.1, 17.2, 17.3
|
|
107
|
+
*/
|
|
108
|
+
async forwardEmail(originalId, forwardTo) {
|
|
109
|
+
return this.getEmailService().forwardEmail(originalId, forwardTo);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get delivery status for all recipients of an email.
|
|
113
|
+
*/
|
|
114
|
+
async getEmailDeliveryStatus(messageId) {
|
|
115
|
+
return this.getEmailService().getDeliveryStatus(messageId);
|
|
116
|
+
}
|
|
17
117
|
/**
|
|
18
118
|
* Send a message
|
|
119
|
+
*
|
|
120
|
+
* Stores the message via MessageCBLService, emits MESSAGE_STORED event,
|
|
121
|
+
* then announces the message via gossip protocol for delivery.
|
|
122
|
+
*
|
|
123
|
+
* @see Requirements 7.1, 7.3, 7.5
|
|
19
124
|
*/
|
|
20
125
|
async sendMessage(content, senderId, options) {
|
|
21
126
|
const { messageId, magnetUrl } = await this.messageCBL.createMessage(new Uint8Array(content), senderId, options);
|
|
22
127
|
const metadata = await this.messageCBL.getMessageMetadata(messageId);
|
|
23
128
|
if (metadata) {
|
|
129
|
+
// Emit MESSAGE_STORED event after successful storage (Requirement 7.3)
|
|
24
130
|
this.eventSystem.emit(eventNotificationSystem_1.MessageEventType.MESSAGE_STORED, metadata);
|
|
25
|
-
//
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
131
|
+
// Build message delivery metadata for gossip announcement
|
|
132
|
+
const recipientIds = options.recipients && options.recipients.length > 0
|
|
133
|
+
? [...options.recipients]
|
|
134
|
+
: [];
|
|
135
|
+
const deliveryMetadata = {
|
|
136
|
+
messageId,
|
|
137
|
+
recipientIds,
|
|
138
|
+
priority: 'normal',
|
|
139
|
+
blockIds: metadata.cblBlockIds ?? [],
|
|
140
|
+
cblBlockId: metadata.blockId,
|
|
141
|
+
ackRequired: true,
|
|
142
|
+
};
|
|
143
|
+
// Announce message via gossip protocol (Requirement 7.1)
|
|
144
|
+
await this.gossipService.announceMessage(metadata.cblBlockIds ?? [], deliveryMetadata);
|
|
145
|
+
// Update delivery status for each recipient to Announced
|
|
146
|
+
for (const recipientId of recipientIds) {
|
|
147
|
+
await this.metadataStore.updateDeliveryStatus(messageId, recipientId, brightchain_lib_1.DeliveryStatus.Announced);
|
|
35
148
|
}
|
|
36
149
|
}
|
|
37
150
|
return { messageId, magnetUrl };
|
|
38
151
|
}
|
|
39
152
|
/**
|
|
40
153
|
* Get message content
|
|
154
|
+
*
|
|
155
|
+
* @see Requirements 7.5
|
|
41
156
|
*/
|
|
42
157
|
async getMessage(messageId) {
|
|
43
158
|
const content = await this.messageCBL.getMessageContent(messageId);
|
|
@@ -45,12 +160,16 @@ class MessagePassingService {
|
|
|
45
160
|
}
|
|
46
161
|
/**
|
|
47
162
|
* Query messages
|
|
163
|
+
*
|
|
164
|
+
* @see Requirements 7.5
|
|
48
165
|
*/
|
|
49
166
|
async queryMessages(query) {
|
|
50
167
|
return this.metadataStore.queryMessages(query);
|
|
51
168
|
}
|
|
52
169
|
/**
|
|
53
170
|
* Delete message
|
|
171
|
+
*
|
|
172
|
+
* @see Requirements 7.5
|
|
54
173
|
*/
|
|
55
174
|
async deleteMessage(messageId) {
|
|
56
175
|
const metadata = await this.messageCBL.getMessageMetadata(messageId);
|
|
@@ -60,25 +179,65 @@ class MessagePassingService {
|
|
|
60
179
|
}
|
|
61
180
|
}
|
|
62
181
|
}
|
|
182
|
+
/**
|
|
183
|
+
* Set up handlers for gossip delivery events.
|
|
184
|
+
*
|
|
185
|
+
* Listens for:
|
|
186
|
+
* - Message delivery announcements (incoming messages)
|
|
187
|
+
* - Delivery acknowledgments (confirmation of sent messages)
|
|
188
|
+
*
|
|
189
|
+
* @see Requirements 7.4
|
|
190
|
+
*/
|
|
63
191
|
setupHandlers() {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
if (
|
|
67
|
-
this.
|
|
68
|
-
|
|
192
|
+
// Handle incoming message delivery announcements
|
|
193
|
+
this.gossipService.onMessageDelivery(async (announcement) => {
|
|
194
|
+
if (announcement.messageDelivery) {
|
|
195
|
+
const metadata = await this.messageCBL.getMessageMetadata(announcement.messageDelivery.messageId);
|
|
196
|
+
if (metadata) {
|
|
197
|
+
this.eventSystem.emit(eventNotificationSystem_1.MessageEventType.MESSAGE_RECEIVED, metadata);
|
|
198
|
+
}
|
|
69
199
|
}
|
|
70
200
|
});
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
201
|
+
// Handle delivery acknowledgments (Requirement 7.4)
|
|
202
|
+
this.gossipService.onDeliveryAck(async (announcement) => {
|
|
203
|
+
if (announcement.deliveryAck) {
|
|
204
|
+
const { messageId, recipientId, status } = announcement.deliveryAck;
|
|
205
|
+
// Map ack status to DeliveryStatus
|
|
206
|
+
const deliveryStatus = status === 'delivered' || status === 'read'
|
|
207
|
+
? brightchain_lib_1.DeliveryStatus.Delivered
|
|
208
|
+
: brightchain_lib_1.DeliveryStatus.Failed;
|
|
209
|
+
// Record the acknowledgment and update delivery status.
|
|
210
|
+
// The message may be managed by the email subsystem (InMemoryEmailMetadataStore)
|
|
211
|
+
// rather than the generic MemoryMessageMetadataStore, so KeyNotFound is expected
|
|
212
|
+
// for email messages and should be silently ignored.
|
|
213
|
+
try {
|
|
214
|
+
await this.metadataStore.recordAcknowledgment(messageId, recipientId, new Date());
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
217
|
+
if (!(err instanceof brightchain_lib_1.StoreError) ||
|
|
218
|
+
err.type !== brightchain_lib_1.StoreErrorType.KeyNotFound) {
|
|
219
|
+
throw err;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
try {
|
|
223
|
+
await this.metadataStore.updateDeliveryStatus(messageId, recipientId, deliveryStatus);
|
|
224
|
+
}
|
|
225
|
+
catch (err) {
|
|
226
|
+
if (!(err instanceof brightchain_lib_1.StoreError) ||
|
|
227
|
+
err.type !== brightchain_lib_1.StoreErrorType.KeyNotFound) {
|
|
228
|
+
throw err;
|
|
229
|
+
}
|
|
79
230
|
}
|
|
80
|
-
|
|
81
|
-
|
|
231
|
+
// Check if all recipients have been delivered and emit appropriate events
|
|
232
|
+
const metadata = await this.messageCBL.getMessageMetadata(messageId);
|
|
233
|
+
if (metadata) {
|
|
234
|
+
const allDelivered = metadata.recipients?.every((r) => metadata.deliveryStatus?.get(r) === brightchain_lib_1.DeliveryStatus.Delivered);
|
|
235
|
+
if (allDelivered) {
|
|
236
|
+
this.eventSystem.emit(eventNotificationSystem_1.MessageEventType.MESSAGE_DELIVERED, metadata);
|
|
237
|
+
}
|
|
238
|
+
else if (deliveryStatus === brightchain_lib_1.DeliveryStatus.Failed) {
|
|
239
|
+
this.eventSystem.emit(eventNotificationSystem_1.MessageEventType.MESSAGE_FAILED, metadata);
|
|
240
|
+
}
|
|
82
241
|
}
|
|
83
242
|
}
|
|
84
243
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messagePassingService.js","sourceRoot":"","sources":["../../../../../brightchain-api-lib/src/lib/services/messagePassingService.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"messagePassingService.js","sourceRoot":"","sources":["../../../../../brightchain-api-lib/src/lib/services/messagePassingService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface IPaginatedResult<T> {
|
|
2
|
+
items: T[];
|
|
3
|
+
nextCursor?: string;
|
|
4
|
+
hasMore: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface PaginationCursor {
|
|
7
|
+
timestamp: number;
|
|
8
|
+
id: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class PaginationService {
|
|
11
|
+
static encodeCursor(timestamp: number, id: string): string;
|
|
12
|
+
static decodeCursor(cursor: string): PaginationCursor;
|
|
13
|
+
static paginate<T extends {
|
|
14
|
+
timestamp: number;
|
|
15
|
+
id: string;
|
|
16
|
+
}>(items: T[], limit: number, cursor?: string): IPaginatedResult<T>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=paginationService.d.ts.map
|