@brightchain/brightchain-api-lib 0.14.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/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 +45 -6
- package/src/lib/availability/gossipService.d.ts.map +1 -1
- package/src/lib/availability/gossipService.js +177 -5
- 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/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 +2 -0
- package/src/lib/services/index.d.ts.map +1 -1
- package/src/lib/services/index.js +2 -0
- package/src/lib/services/index.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/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/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,6 +12,7 @@ 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';
|
|
@@ -19,4 +20,5 @@ export * from './secureKeyStorage';
|
|
|
19
20
|
export * from './websocketHandler';
|
|
20
21
|
export * from './webSocketMessageServer';
|
|
21
22
|
export * from './webSocketPeerProvider';
|
|
23
|
+
export * from './wireConversationPromotion';
|
|
22
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;AACzC,cAAc,yBAAyB,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,6 +17,7 @@ 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);
|
|
@@ -24,4 +25,5 @@ tslib_1.__exportStar(require("./secureKeyStorage"), exports);
|
|
|
24
25
|
tslib_1.__exportStar(require("./websocketHandler"), exports);
|
|
25
26
|
tslib_1.__exportStar(require("./webSocketMessageServer"), exports);
|
|
26
27
|
tslib_1.__exportStar(require("./webSocketPeerProvider"), exports);
|
|
28
|
+
tslib_1.__exportStar(require("./wireConversationPromotion"), exports);
|
|
27
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;AACzC,kEAAwC"}
|
|
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"}
|
|
@@ -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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paginationService.d.ts","sourceRoot":"","sources":["../../../../../brightchain-api-lib/src/lib/services/paginationService.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,qBAAa,iBAAiB;IAC5B,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM;IAI1D,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB;IAIrD,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EACzD,KAAK,EAAE,CAAC,EAAE,EACV,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,GACd,gBAAgB,CAAC,CAAC,CAAC;CA4BvB"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PaginationService = void 0;
|
|
4
|
+
class PaginationService {
|
|
5
|
+
static encodeCursor(timestamp, id) {
|
|
6
|
+
return Buffer.from(JSON.stringify({ timestamp, id })).toString('base64');
|
|
7
|
+
}
|
|
8
|
+
static decodeCursor(cursor) {
|
|
9
|
+
return JSON.parse(Buffer.from(cursor, 'base64').toString('utf-8'));
|
|
10
|
+
}
|
|
11
|
+
static paginate(items, limit, cursor) {
|
|
12
|
+
const sortedItems = [...items].sort((a, b) => b.timestamp - a.timestamp);
|
|
13
|
+
let startIndex = 0;
|
|
14
|
+
if (cursor) {
|
|
15
|
+
const { timestamp, id } = this.decodeCursor(cursor);
|
|
16
|
+
startIndex =
|
|
17
|
+
sortedItems.findIndex((item) => item.timestamp === timestamp && item.id === id) + 1;
|
|
18
|
+
}
|
|
19
|
+
const pageItems = sortedItems.slice(startIndex, startIndex + limit);
|
|
20
|
+
const hasMore = startIndex + limit < sortedItems.length;
|
|
21
|
+
const nextCursor = hasMore && pageItems.length > 0
|
|
22
|
+
? this.encodeCursor(pageItems[pageItems.length - 1].timestamp, pageItems[pageItems.length - 1].id)
|
|
23
|
+
: undefined;
|
|
24
|
+
return {
|
|
25
|
+
items: pageItems,
|
|
26
|
+
nextCursor,
|
|
27
|
+
hasMore,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
exports.PaginationService = PaginationService;
|
|
32
|
+
//# sourceMappingURL=paginationService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paginationService.js","sourceRoot":"","sources":["../../../../../brightchain-api-lib/src/lib/services/paginationService.ts"],"names":[],"mappings":";;;AAWA,MAAa,iBAAiB;IAC5B,MAAM,CAAC,YAAY,CAAC,SAAiB,EAAE,EAAU;QAC/C,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,MAAc;QAChC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,CAAC,QAAQ,CACb,KAAU,EACV,KAAa,EACb,MAAe;QAEf,MAAM,WAAW,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;QAEzE,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YACpD,UAAU;gBACR,WAAW,CAAC,SAAS,CACnB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,CACzD,GAAG,CAAC,CAAC;QACV,CAAC;QAED,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,GAAG,KAAK,CAAC,CAAC;QACpE,MAAM,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC;QACxD,MAAM,UAAU,GACd,OAAO,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;YAC7B,CAAC,CAAC,IAAI,CAAC,YAAY,CACf,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,SAAS,EACzC,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CACnC;YACH,CAAC,CAAC,SAAS,CAAC;QAEhB,OAAO;YACL,KAAK,EAAE,SAAS;YAChB,UAAU;YACV,OAAO;SACR,CAAC;IACJ,CAAC;CACF;AAzCD,8CAyCC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PresenceService — tracks member online status and broadcasts presence
|
|
3
|
+
* changes via WebSocket through EventNotificationSystem.
|
|
4
|
+
*
|
|
5
|
+
* Maintains an in-memory map of member statuses and WebSocket connections.
|
|
6
|
+
* When a member's status changes, the service broadcasts the change only
|
|
7
|
+
* to members who share at least one context (conversation, group, or channel)
|
|
8
|
+
* with them — determined by the shared-context resolver supplied at construction.
|
|
9
|
+
*
|
|
10
|
+
* Requirements: 7.3, 7.4
|
|
11
|
+
*/
|
|
12
|
+
import { CommunicationEventType, PresenceStatus } from '@brightchain/brightchain-lib';
|
|
13
|
+
import { WebSocket } from 'ws';
|
|
14
|
+
/**
|
|
15
|
+
* Callback that resolves the set of member IDs who share at least one
|
|
16
|
+
* conversation, group, or channel with the given member.
|
|
17
|
+
*/
|
|
18
|
+
export type SharedContextResolver = (memberId: string) => Set<string>;
|
|
19
|
+
/**
|
|
20
|
+
* Presence change event payload sent over WebSocket.
|
|
21
|
+
*/
|
|
22
|
+
export interface IPresenceChangeEvent {
|
|
23
|
+
type: CommunicationEventType.PRESENCE_CHANGED;
|
|
24
|
+
timestamp: Date;
|
|
25
|
+
data: {
|
|
26
|
+
memberId: string;
|
|
27
|
+
status: PresenceStatus;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export declare class PresenceService {
|
|
31
|
+
private readonly sharedContextResolver;
|
|
32
|
+
/** memberId → current presence status */
|
|
33
|
+
private readonly statuses;
|
|
34
|
+
/** memberId → set of active WebSocket connections (supports multiple devices) */
|
|
35
|
+
private readonly connections;
|
|
36
|
+
constructor(sharedContextResolver: SharedContextResolver);
|
|
37
|
+
/**
|
|
38
|
+
* Set a member's presence status and broadcast the change to members
|
|
39
|
+
* who share a context with them.
|
|
40
|
+
*
|
|
41
|
+
* Requirement 7.3: broadcast status change to shared-context members.
|
|
42
|
+
*/
|
|
43
|
+
setStatus(memberId: string, status: PresenceStatus): void;
|
|
44
|
+
/**
|
|
45
|
+
* Get a single member's current presence status.
|
|
46
|
+
* Defaults to OFFLINE if the member has never connected.
|
|
47
|
+
*/
|
|
48
|
+
getStatus(memberId: string): PresenceStatus;
|
|
49
|
+
/**
|
|
50
|
+
* Get presence statuses for multiple members at once.
|
|
51
|
+
*
|
|
52
|
+
* Requirement 7.4: deliver current presence of shared-context members on connect.
|
|
53
|
+
*/
|
|
54
|
+
getStatusBulk(memberIds: string[]): Map<string, PresenceStatus>;
|
|
55
|
+
/**
|
|
56
|
+
* Handle a member connecting via WebSocket.
|
|
57
|
+
* Sets status to ONLINE (if currently OFFLINE) and delivers the current
|
|
58
|
+
* presence of all shared-context members.
|
|
59
|
+
*
|
|
60
|
+
* Requirements: 7.3, 7.4
|
|
61
|
+
*/
|
|
62
|
+
onConnect(memberId: string, ws: WebSocket): void;
|
|
63
|
+
/**
|
|
64
|
+
* Handle a member explicitly disconnecting.
|
|
65
|
+
* Removes all WebSocket connections and sets status to OFFLINE.
|
|
66
|
+
*/
|
|
67
|
+
onDisconnect(memberId: string): void;
|
|
68
|
+
/**
|
|
69
|
+
* Broadcast a presence change event to all members who share a context
|
|
70
|
+
* with the given member.
|
|
71
|
+
*
|
|
72
|
+
* Requirement 7.3: presence change delivered only to shared-context members.
|
|
73
|
+
*/
|
|
74
|
+
private broadcastPresenceChange;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=presenceService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presenceService.d.ts","sourceRoot":"","sources":["../../../../../brightchain-api-lib/src/lib/services/presenceService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,sBAAsB,EACtB,cAAc,EACf,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAE/B;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC;AAEtE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,sBAAsB,CAAC,gBAAgB,CAAC;IAC9C,SAAS,EAAE,IAAI,CAAC;IAChB,IAAI,EAAE;QACJ,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,cAAc,CAAC;KACxB,CAAC;CACH;AAED,qBAAa,eAAe;IAOd,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IANlD,yCAAyC;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IAE9D,iFAAiF;IACjF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqC;gBAEpC,qBAAqB,EAAE,qBAAqB;IAEzE;;;;;OAKG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI;IASzD;;;OAGG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc;IAI3C;;;;OAIG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC;IAQ/D;;;;;;OAMG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,GAAG,IAAI;IAoChD;;;OAGG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAcpC;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB;CA2BhC"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* PresenceService — tracks member online status and broadcasts presence
|
|
4
|
+
* changes via WebSocket through EventNotificationSystem.
|
|
5
|
+
*
|
|
6
|
+
* Maintains an in-memory map of member statuses and WebSocket connections.
|
|
7
|
+
* When a member's status changes, the service broadcasts the change only
|
|
8
|
+
* to members who share at least one context (conversation, group, or channel)
|
|
9
|
+
* with them — determined by the shared-context resolver supplied at construction.
|
|
10
|
+
*
|
|
11
|
+
* Requirements: 7.3, 7.4
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.PresenceService = void 0;
|
|
15
|
+
const brightchain_lib_1 = require("@brightchain/brightchain-lib");
|
|
16
|
+
const ws_1 = require("ws");
|
|
17
|
+
class PresenceService {
|
|
18
|
+
constructor(sharedContextResolver) {
|
|
19
|
+
this.sharedContextResolver = sharedContextResolver;
|
|
20
|
+
/** memberId → current presence status */
|
|
21
|
+
this.statuses = new Map();
|
|
22
|
+
/** memberId → set of active WebSocket connections (supports multiple devices) */
|
|
23
|
+
this.connections = new Map();
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Set a member's presence status and broadcast the change to members
|
|
27
|
+
* who share a context with them.
|
|
28
|
+
*
|
|
29
|
+
* Requirement 7.3: broadcast status change to shared-context members.
|
|
30
|
+
*/
|
|
31
|
+
setStatus(memberId, status) {
|
|
32
|
+
const previous = this.statuses.get(memberId) ?? brightchain_lib_1.PresenceStatus.OFFLINE;
|
|
33
|
+
this.statuses.set(memberId, status);
|
|
34
|
+
if (previous !== status) {
|
|
35
|
+
this.broadcastPresenceChange(memberId, status);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Get a single member's current presence status.
|
|
40
|
+
* Defaults to OFFLINE if the member has never connected.
|
|
41
|
+
*/
|
|
42
|
+
getStatus(memberId) {
|
|
43
|
+
return this.statuses.get(memberId) ?? brightchain_lib_1.PresenceStatus.OFFLINE;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get presence statuses for multiple members at once.
|
|
47
|
+
*
|
|
48
|
+
* Requirement 7.4: deliver current presence of shared-context members on connect.
|
|
49
|
+
*/
|
|
50
|
+
getStatusBulk(memberIds) {
|
|
51
|
+
const result = new Map();
|
|
52
|
+
for (const id of memberIds) {
|
|
53
|
+
result.set(id, this.getStatus(id));
|
|
54
|
+
}
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Handle a member connecting via WebSocket.
|
|
59
|
+
* Sets status to ONLINE (if currently OFFLINE) and delivers the current
|
|
60
|
+
* presence of all shared-context members.
|
|
61
|
+
*
|
|
62
|
+
* Requirements: 7.3, 7.4
|
|
63
|
+
*/
|
|
64
|
+
onConnect(memberId, ws) {
|
|
65
|
+
// Track the connection
|
|
66
|
+
let memberConns = this.connections.get(memberId);
|
|
67
|
+
if (!memberConns) {
|
|
68
|
+
memberConns = new Set();
|
|
69
|
+
this.connections.set(memberId, memberConns);
|
|
70
|
+
}
|
|
71
|
+
memberConns.add(ws);
|
|
72
|
+
// Auto-clean on close
|
|
73
|
+
ws.on('close', () => {
|
|
74
|
+
memberConns.delete(ws);
|
|
75
|
+
if (memberConns.size === 0) {
|
|
76
|
+
this.connections.delete(memberId);
|
|
77
|
+
this.setStatus(memberId, brightchain_lib_1.PresenceStatus.OFFLINE);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
// Set online if currently offline
|
|
81
|
+
if (this.getStatus(memberId) === brightchain_lib_1.PresenceStatus.OFFLINE) {
|
|
82
|
+
this.setStatus(memberId, brightchain_lib_1.PresenceStatus.ONLINE);
|
|
83
|
+
}
|
|
84
|
+
// Deliver current presence of shared-context members (Req 7.4)
|
|
85
|
+
const sharedMembers = this.sharedContextResolver(memberId);
|
|
86
|
+
const bulkStatus = this.getStatusBulk([...sharedMembers]);
|
|
87
|
+
const payload = {
|
|
88
|
+
type: 'presence:bulk_status',
|
|
89
|
+
timestamp: new Date(),
|
|
90
|
+
data: Object.fromEntries(bulkStatus),
|
|
91
|
+
};
|
|
92
|
+
if (ws.readyState === ws_1.WebSocket.OPEN) {
|
|
93
|
+
ws.send(JSON.stringify(payload));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Handle a member explicitly disconnecting.
|
|
98
|
+
* Removes all WebSocket connections and sets status to OFFLINE.
|
|
99
|
+
*/
|
|
100
|
+
onDisconnect(memberId) {
|
|
101
|
+
const memberConns = this.connections.get(memberId);
|
|
102
|
+
if (memberConns) {
|
|
103
|
+
for (const ws of memberConns) {
|
|
104
|
+
if (ws.readyState === ws_1.WebSocket.OPEN) {
|
|
105
|
+
ws.close();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
memberConns.clear();
|
|
109
|
+
this.connections.delete(memberId);
|
|
110
|
+
}
|
|
111
|
+
this.setStatus(memberId, brightchain_lib_1.PresenceStatus.OFFLINE);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Broadcast a presence change event to all members who share a context
|
|
115
|
+
* with the given member.
|
|
116
|
+
*
|
|
117
|
+
* Requirement 7.3: presence change delivered only to shared-context members.
|
|
118
|
+
*/
|
|
119
|
+
broadcastPresenceChange(memberId, status) {
|
|
120
|
+
const event = {
|
|
121
|
+
type: brightchain_lib_1.CommunicationEventType.PRESENCE_CHANGED,
|
|
122
|
+
timestamp: new Date(),
|
|
123
|
+
data: { memberId, status },
|
|
124
|
+
};
|
|
125
|
+
const sharedMembers = this.sharedContextResolver(memberId);
|
|
126
|
+
const serialized = JSON.stringify(event);
|
|
127
|
+
for (const targetMemberId of sharedMembers) {
|
|
128
|
+
// Don't send to the member whose status changed
|
|
129
|
+
if (targetMemberId === memberId)
|
|
130
|
+
continue;
|
|
131
|
+
const targetConns = this.connections.get(targetMemberId);
|
|
132
|
+
if (!targetConns)
|
|
133
|
+
continue;
|
|
134
|
+
for (const ws of targetConns) {
|
|
135
|
+
if (ws.readyState === ws_1.WebSocket.OPEN) {
|
|
136
|
+
ws.send(serialized);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
exports.PresenceService = PresenceService;
|
|
143
|
+
//# sourceMappingURL=presenceService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presenceService.js","sourceRoot":"","sources":["../../../../../brightchain-api-lib/src/lib/services/presenceService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wires ConversationService.promoteToGroup to GroupService.createGroupFromConversation.
|
|
3
|
+
*
|
|
4
|
+
* This module provides the glue between the two services, enabling conversation
|
|
5
|
+
* promotion to group with message history migration and key re-encryption
|
|
6
|
+
* for all members (original + new).
|
|
7
|
+
*
|
|
8
|
+
* Requirements: 2.1, 2.2, 2.3
|
|
9
|
+
*/
|
|
10
|
+
import { ConversationService } from '@brightchain/brightchain-lib/lib/services/communication/conversationService';
|
|
11
|
+
import { GroupService } from '@brightchain/brightchain-lib/lib/services/communication/groupService';
|
|
12
|
+
/**
|
|
13
|
+
* Connects the ConversationService's group promotion handler to the
|
|
14
|
+
* GroupService's createGroupFromConversation method.
|
|
15
|
+
*
|
|
16
|
+
* Call this once during application initialization after both services
|
|
17
|
+
* are constructed.
|
|
18
|
+
*
|
|
19
|
+
* @param conversationService - The ConversationService instance
|
|
20
|
+
* @param groupService - The GroupService instance
|
|
21
|
+
*/
|
|
22
|
+
export declare function wireConversationPromotion(conversationService: ConversationService, groupService: GroupService): void;
|
|
23
|
+
//# sourceMappingURL=wireConversationPromotion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wireConversationPromotion.d.ts","sourceRoot":"","sources":["../../../../../brightchain-api-lib/src/lib/services/wireConversationPromotion.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,6EAA6E,CAAC;AAClH,OAAO,EAAE,YAAY,EAAE,MAAM,sEAAsE,CAAC;AAEpG;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CACvC,mBAAmB,EAAE,mBAAmB,EACxC,YAAY,EAAE,YAAY,GACzB,IAAI,CAiBN"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Wires ConversationService.promoteToGroup to GroupService.createGroupFromConversation.
|
|
4
|
+
*
|
|
5
|
+
* This module provides the glue between the two services, enabling conversation
|
|
6
|
+
* promotion to group with message history migration and key re-encryption
|
|
7
|
+
* for all members (original + new).
|
|
8
|
+
*
|
|
9
|
+
* Requirements: 2.1, 2.2, 2.3
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.wireConversationPromotion = wireConversationPromotion;
|
|
13
|
+
/**
|
|
14
|
+
* Connects the ConversationService's group promotion handler to the
|
|
15
|
+
* GroupService's createGroupFromConversation method.
|
|
16
|
+
*
|
|
17
|
+
* Call this once during application initialization after both services
|
|
18
|
+
* are constructed.
|
|
19
|
+
*
|
|
20
|
+
* @param conversationService - The ConversationService instance
|
|
21
|
+
* @param groupService - The GroupService instance
|
|
22
|
+
*/
|
|
23
|
+
function wireConversationPromotion(conversationService, groupService) {
|
|
24
|
+
conversationService.setGroupPromotionHandler((conversationId, existingParticipants, newMemberIds, messages, requesterId) => groupService.createGroupFromConversation(conversationId, existingParticipants, newMemberIds, messages, requesterId));
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=wireConversationPromotion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wireConversationPromotion.js","sourceRoot":"","sources":["../../../../../brightchain-api-lib/src/lib/services/wireConversationPromotion.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAeH,8DAoBC;AA9BD;;;;;;;;;GASG;AACH,SAAgB,yBAAyB,CACvC,mBAAwC,EACxC,YAA0B;IAE1B,mBAAmB,CAAC,wBAAwB,CAC1C,CACE,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,EAAE,CACF,YAAY,CAAC,2BAA2B,CACtC,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,QAAQ,EACR,WAAW,CACZ,CACJ,CAAC;AACJ,CAAC"}
|