@brightchain/brightchain-api-lib 0.12.0 → 0.13.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.
Files changed (184) hide show
  1. package/package.json +4 -4
  2. package/src/lib/application-base.d.ts +1 -1
  3. package/src/lib/application-base.d.ts.map +1 -1
  4. package/src/lib/application.d.ts +52 -0
  5. package/src/lib/application.d.ts.map +1 -1
  6. package/src/lib/application.js +104 -0
  7. package/src/lib/application.js.map +1 -1
  8. package/src/lib/controllers/api/blocks.d.ts.map +1 -1
  9. package/src/lib/controllers/api/blocks.js +62 -0
  10. package/src/lib/controllers/api/blocks.js.map +1 -1
  11. package/src/lib/controllers/api/docs.d.ts +67 -0
  12. package/src/lib/controllers/api/docs.d.ts.map +1 -0
  13. package/src/lib/controllers/api/docs.js +86 -0
  14. package/src/lib/controllers/api/docs.js.map +1 -0
  15. package/src/lib/controllers/api/energy.d.ts.map +1 -1
  16. package/src/lib/controllers/api/energy.js +35 -7
  17. package/src/lib/controllers/api/energy.js.map +1 -1
  18. package/src/lib/controllers/api/health.d.ts +95 -0
  19. package/src/lib/controllers/api/health.d.ts.map +1 -0
  20. package/src/lib/controllers/api/health.js +319 -0
  21. package/src/lib/controllers/api/health.js.map +1 -0
  22. package/src/lib/controllers/api/index.d.ts +6 -0
  23. package/src/lib/controllers/api/index.d.ts.map +1 -1
  24. package/src/lib/controllers/api/index.js +6 -0
  25. package/src/lib/controllers/api/index.js.map +1 -1
  26. package/src/lib/controllers/api/messages.d.ts +119 -0
  27. package/src/lib/controllers/api/messages.d.ts.map +1 -0
  28. package/src/lib/controllers/api/messages.js +269 -0
  29. package/src/lib/controllers/api/messages.js.map +1 -0
  30. package/src/lib/controllers/api/nodes.d.ts +152 -0
  31. package/src/lib/controllers/api/nodes.d.ts.map +1 -0
  32. package/src/lib/controllers/api/nodes.js +378 -0
  33. package/src/lib/controllers/api/nodes.js.map +1 -0
  34. package/src/lib/controllers/api/quorum.d.ts +12 -8
  35. package/src/lib/controllers/api/quorum.d.ts.map +1 -1
  36. package/src/lib/controllers/api/quorum.js +83 -17
  37. package/src/lib/controllers/api/quorum.js.map +1 -1
  38. package/src/lib/controllers/api/scbl.d.ts +80 -0
  39. package/src/lib/controllers/api/scbl.d.ts.map +1 -0
  40. package/src/lib/controllers/api/scbl.js +325 -0
  41. package/src/lib/controllers/api/scbl.js.map +1 -0
  42. package/src/lib/controllers/api/sync.d.ts +140 -0
  43. package/src/lib/controllers/api/sync.d.ts.map +1 -0
  44. package/src/lib/controllers/api/sync.js +352 -0
  45. package/src/lib/controllers/api/sync.js.map +1 -0
  46. package/src/lib/controllers/api/user.d.ts +2 -0
  47. package/src/lib/controllers/api/user.d.ts.map +1 -1
  48. package/src/lib/controllers/api/user.js +122 -7
  49. package/src/lib/controllers/api/user.js.map +1 -1
  50. package/src/lib/enumerations/brightChainApiStrings.d.ts.map +1 -1
  51. package/src/lib/enumerations/brightChainApiStrings.js.map +1 -1
  52. package/src/lib/errors/symmetric.d.ts +2 -2
  53. package/src/lib/errors/symmetric.d.ts.map +1 -1
  54. package/src/lib/errors/symmetric.js.map +1 -1
  55. package/src/lib/errors/typed-error-local.d.ts +3 -3
  56. package/src/lib/errors/typed-error-local.d.ts.map +1 -1
  57. package/src/lib/errors/typed-error-local.js.map +1 -1
  58. package/src/lib/interfaces/application.d.ts +2 -1
  59. package/src/lib/interfaces/application.d.ts.map +1 -1
  60. package/src/lib/interfaces/backend-objects/index.d.ts +4 -4
  61. package/src/lib/interfaces/backend-objects/index.d.ts.map +1 -1
  62. package/src/lib/interfaces/backend-objects/index.js +0 -5
  63. package/src/lib/interfaces/backend-objects/index.js.map +1 -1
  64. package/src/lib/interfaces/bases/index.d.ts +4 -4
  65. package/src/lib/interfaces/bases/index.d.ts.map +1 -1
  66. package/src/lib/interfaces/bases/index.js +0 -5
  67. package/src/lib/interfaces/bases/index.js.map +1 -1
  68. package/src/lib/interfaces/index.d.ts +32 -32
  69. package/src/lib/interfaces/index.d.ts.map +1 -1
  70. package/src/lib/interfaces/index.js +0 -33
  71. package/src/lib/interfaces/index.js.map +1 -1
  72. package/src/lib/interfaces/member/index.d.ts +3 -3
  73. package/src/lib/interfaces/member/index.d.ts.map +1 -1
  74. package/src/lib/interfaces/member/index.js +0 -4
  75. package/src/lib/interfaces/member/index.js.map +1 -1
  76. package/src/lib/interfaces/requests/deleteMessagesRequest.d.ts +12 -0
  77. package/src/lib/interfaces/requests/deleteMessagesRequest.d.ts.map +1 -0
  78. package/src/lib/interfaces/requests/deleteMessagesRequest.js +3 -0
  79. package/src/lib/interfaces/requests/deleteMessagesRequest.js.map +1 -0
  80. package/src/lib/interfaces/requests/discoverBlockRequest.d.ts +10 -0
  81. package/src/lib/interfaces/requests/discoverBlockRequest.d.ts.map +1 -0
  82. package/src/lib/interfaces/requests/discoverBlockRequest.js +3 -0
  83. package/src/lib/interfaces/requests/discoverBlockRequest.js.map +1 -0
  84. package/src/lib/interfaces/requests/getBlockLocationRequest.d.ts +9 -0
  85. package/src/lib/interfaces/requests/getBlockLocationRequest.d.ts.map +1 -0
  86. package/src/lib/interfaces/requests/getBlockLocationRequest.js +3 -0
  87. package/src/lib/interfaces/requests/getBlockLocationRequest.js.map +1 -0
  88. package/src/lib/interfaces/requests/getMessageRequest.d.ts +12 -0
  89. package/src/lib/interfaces/requests/getMessageRequest.d.ts.map +1 -0
  90. package/src/lib/interfaces/requests/getMessageRequest.js +3 -0
  91. package/src/lib/interfaces/requests/getMessageRequest.js.map +1 -0
  92. package/src/lib/interfaces/requests/getNodeRequest.d.ts +9 -0
  93. package/src/lib/interfaces/requests/getNodeRequest.d.ts.map +1 -0
  94. package/src/lib/interfaces/{membersResponse.js → requests/getNodeRequest.js} +1 -1
  95. package/src/lib/interfaces/requests/getNodeRequest.js.map +1 -0
  96. package/src/lib/interfaces/requests/index.d.ts +12 -0
  97. package/src/lib/interfaces/requests/index.d.ts.map +1 -0
  98. package/src/lib/interfaces/requests/index.js +3 -0
  99. package/src/lib/interfaces/requests/index.js.map +1 -0
  100. package/src/lib/interfaces/requests/messageRequest.d.ts +10 -0
  101. package/src/lib/interfaces/requests/messageRequest.d.ts.map +1 -0
  102. package/src/lib/interfaces/requests/messageRequest.js +3 -0
  103. package/src/lib/interfaces/requests/messageRequest.js.map +1 -0
  104. package/src/lib/interfaces/requests/queryMessagesRequest.d.ts +16 -0
  105. package/src/lib/interfaces/requests/queryMessagesRequest.d.ts.map +1 -0
  106. package/src/lib/interfaces/requests/queryMessagesRequest.js +3 -0
  107. package/src/lib/interfaces/requests/queryMessagesRequest.js.map +1 -0
  108. package/src/lib/interfaces/requests/registerNodeRequest.d.ts +11 -0
  109. package/src/lib/interfaces/requests/registerNodeRequest.d.ts.map +1 -0
  110. package/src/lib/interfaces/requests/registerNodeRequest.js +3 -0
  111. package/src/lib/interfaces/requests/registerNodeRequest.js.map +1 -0
  112. package/src/lib/interfaces/requests/replicateBlockRequest.d.ts +13 -0
  113. package/src/lib/interfaces/requests/replicateBlockRequest.d.ts.map +1 -0
  114. package/src/lib/interfaces/requests/replicateBlockRequest.js +3 -0
  115. package/src/lib/interfaces/requests/replicateBlockRequest.js.map +1 -0
  116. package/src/lib/interfaces/requests/sendMessageRequest.d.ts +24 -0
  117. package/src/lib/interfaces/requests/sendMessageRequest.d.ts.map +1 -0
  118. package/src/lib/interfaces/requests/sendMessageRequest.js +3 -0
  119. package/src/lib/interfaces/requests/sendMessageRequest.js.map +1 -0
  120. package/src/lib/interfaces/requests/storeSCBLRequestBody.d.ts +9 -0
  121. package/src/lib/interfaces/requests/storeSCBLRequestBody.d.ts.map +1 -0
  122. package/src/lib/interfaces/requests/storeSCBLRequestBody.js +3 -0
  123. package/src/lib/interfaces/requests/storeSCBLRequestBody.js.map +1 -0
  124. package/src/lib/interfaces/requests/syncRequestBody.d.ts +10 -0
  125. package/src/lib/interfaces/requests/syncRequestBody.d.ts.map +1 -0
  126. package/src/lib/interfaces/requests/syncRequestBody.js +3 -0
  127. package/src/lib/interfaces/requests/syncRequestBody.js.map +1 -0
  128. package/src/lib/interfaces/responses/index.d.ts +7 -7
  129. package/src/lib/interfaces/responses/index.d.ts.map +1 -1
  130. package/src/lib/interfaces/responses/index.js +0 -8
  131. package/src/lib/interfaces/responses/index.js.map +1 -1
  132. package/src/lib/middlewares/authentication.d.ts +133 -0
  133. package/src/lib/middlewares/authentication.d.ts.map +1 -0
  134. package/src/lib/middlewares/authentication.js +224 -0
  135. package/src/lib/middlewares/authentication.js.map +1 -0
  136. package/src/lib/middlewares/index.d.ts +2 -0
  137. package/src/lib/middlewares/index.d.ts.map +1 -1
  138. package/src/lib/middlewares/index.js +15 -1
  139. package/src/lib/middlewares/index.js.map +1 -1
  140. package/src/lib/middlewares/request-id.d.ts +18 -0
  141. package/src/lib/middlewares/request-id.d.ts.map +1 -0
  142. package/src/lib/middlewares/request-id.js +30 -0
  143. package/src/lib/middlewares/request-id.js.map +1 -0
  144. package/src/lib/openapi/index.d.ts +8 -0
  145. package/src/lib/openapi/index.d.ts.map +1 -0
  146. package/src/lib/openapi/index.js +21 -0
  147. package/src/lib/openapi/index.js.map +1 -0
  148. package/src/lib/openapi/schemas.d.ts +15 -0
  149. package/src/lib/openapi/schemas.d.ts.map +1 -0
  150. package/src/lib/openapi/schemas.js +610 -0
  151. package/src/lib/openapi/schemas.js.map +1 -0
  152. package/src/lib/routers/api.d.ts +62 -0
  153. package/src/lib/routers/api.d.ts.map +1 -1
  154. package/src/lib/routers/api.js +85 -0
  155. package/src/lib/routers/api.js.map +1 -1
  156. package/src/lib/services/diskQuorumService.d.ts +7 -6
  157. package/src/lib/services/diskQuorumService.d.ts.map +1 -1
  158. package/src/lib/services/diskQuorumService.js.map +1 -1
  159. package/src/lib/services/email.d.ts +2 -1
  160. package/src/lib/services/email.d.ts.map +1 -1
  161. package/src/lib/services/email.js.map +1 -1
  162. package/src/lib/services/eventNotificationSystem.d.ts +88 -6
  163. package/src/lib/services/eventNotificationSystem.d.ts.map +1 -1
  164. package/src/lib/services/eventNotificationSystem.js +132 -17
  165. package/src/lib/services/eventNotificationSystem.js.map +1 -1
  166. package/src/lib/services/fec.js +1 -1
  167. package/src/lib/services/fec.js.map +1 -1
  168. package/src/lib/types/backend-id.d.ts +2 -1
  169. package/src/lib/types/backend-id.d.ts.map +1 -1
  170. package/src/lib/utils/errorResponse.d.ts +227 -2
  171. package/src/lib/utils/errorResponse.d.ts.map +1 -1
  172. package/src/lib/utils/errorResponse.js +292 -3
  173. package/src/lib/utils/errorResponse.js.map +1 -1
  174. package/src/lib/i18n/index.d.ts +0 -7
  175. package/src/lib/i18n/index.d.ts.map +0 -1
  176. package/src/lib/i18n/index.js +0 -29
  177. package/src/lib/i18n/index.js.map +0 -1
  178. package/src/lib/i18n/strings/index.d.ts +0 -6
  179. package/src/lib/i18n/strings/index.d.ts.map +0 -1
  180. package/src/lib/i18n/strings/index.js +0 -17
  181. package/src/lib/i18n/strings/index.js.map +0 -1
  182. package/src/lib/interfaces/membersResponse.d.ts +0 -12
  183. package/src/lib/interfaces/membersResponse.d.ts.map +0 -1
  184. package/src/lib/interfaces/membersResponse.js.map +0 -1
@@ -0,0 +1,269 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MessagesController = void 0;
4
+ const brightchain_lib_1 = require("@brightchain/brightchain-lib");
5
+ const node_express_suite_1 = require("@digitaldefiance/node-express-suite");
6
+ const errorResponse_1 = require("../../utils/errorResponse");
7
+ const base_1 = require("../base");
8
+ /**
9
+ * Controller for message passing operations.
10
+ *
11
+ * Provides REST API endpoints for sending, retrieving, querying, and deleting
12
+ * messages in the BrightChain distributed messaging system.
13
+ *
14
+ * ## Endpoints
15
+ *
16
+ * ### POST /api/messages
17
+ * Send a new message with optional recipients.
18
+ *
19
+ * **Request Body:**
20
+ * - `content` (string, required): Base64-encoded message content
21
+ * - `senderId` (string, required): Sender member ID
22
+ * - `recipients` (string[], optional): Recipient IDs (broadcast if empty)
23
+ * - `messageType` (string, required): Message type identifier
24
+ * - `priority` (number, optional): Message priority level
25
+ * - `encryptionScheme` (number, optional): Encryption scheme identifier
26
+ *
27
+ * **Response:** Message ID and magnet URL
28
+ *
29
+ * ### GET /api/messages/:id
30
+ * Retrieve a message by its ID.
31
+ *
32
+ * **Parameters:**
33
+ * - `id` (string, required): Message ID
34
+ *
35
+ * **Response:** Base64-encoded message content
36
+ *
37
+ * ### GET /api/messages
38
+ * Query messages with optional filters.
39
+ *
40
+ * **Query Parameters:**
41
+ * - `recipientId` (string, optional): Filter by recipient ID
42
+ * - `senderId` (string, optional): Filter by sender ID
43
+ * - `messageType` (string, optional): Filter by message type
44
+ * - `page` (number, optional): Page number (default: 1)
45
+ * - `pageSize` (number, optional): Page size (default: 50)
46
+ *
47
+ * **Response:** Array of message metadata
48
+ *
49
+ * ### DELETE /api/messages/:id
50
+ * Delete a message by its ID.
51
+ *
52
+ * **Parameters:**
53
+ * - `id` (string, required): Message ID
54
+ *
55
+ * **Response:** 204 No Content on success
56
+ *
57
+ * @requirements 1.1, 1.2, 1.3, 1.4, 1.5, 1.6
58
+ */
59
+ class MessagesController extends base_1.BaseController {
60
+ constructor(application) {
61
+ super(application);
62
+ this.messageService = null;
63
+ }
64
+ /**
65
+ * Set the MessagePassingService instance.
66
+ * This allows for dependency injection and testing.
67
+ */
68
+ setMessageService(service) {
69
+ this.messageService = service;
70
+ }
71
+ /**
72
+ * Get the MessagePassingService instance.
73
+ * Throws if the service has not been set.
74
+ */
75
+ getMessageService() {
76
+ if (!this.messageService) {
77
+ throw new Error('MessagePassingService not initialized');
78
+ }
79
+ return this.messageService;
80
+ }
81
+ initRouteDefinitions() {
82
+ this.routeDefinitions = [
83
+ (0, node_express_suite_1.routeConfig)('post', '/', {
84
+ useAuthentication: false,
85
+ useCryptoAuthentication: false,
86
+ handlerKey: 'sendMessage',
87
+ }),
88
+ (0, node_express_suite_1.routeConfig)('get', '/:id', {
89
+ handlerKey: 'getMessage',
90
+ useAuthentication: false,
91
+ useCryptoAuthentication: false,
92
+ }),
93
+ (0, node_express_suite_1.routeConfig)('get', '/', {
94
+ handlerKey: 'queryMessages',
95
+ useAuthentication: false,
96
+ useCryptoAuthentication: false,
97
+ }),
98
+ (0, node_express_suite_1.routeConfig)('delete', '/:id', {
99
+ handlerKey: 'deleteMessage',
100
+ useAuthentication: false,
101
+ useCryptoAuthentication: false,
102
+ }),
103
+ ];
104
+ this.handlers = {
105
+ sendMessage: this.handleSendMessage.bind(this),
106
+ getMessage: this.handleGetMessage.bind(this),
107
+ queryMessages: this.handleQueryMessages.bind(this),
108
+ deleteMessage: this.handleDeleteMessage.bind(this),
109
+ };
110
+ }
111
+ /**
112
+ * POST /api/messages
113
+ * Send a new message.
114
+ *
115
+ * @param req - Request containing message content and metadata
116
+ * @returns Message ID and magnet URL on success, or error response
117
+ * @requirements 1.1
118
+ */
119
+ async handleSendMessage(req) {
120
+ try {
121
+ const { content, senderId, recipients, messageType, priority, encryptionScheme, } = req.body;
122
+ // Validate required fields
123
+ if (!content) {
124
+ return (0, errorResponse_1.validationError)('Missing required field: content');
125
+ }
126
+ if (!senderId) {
127
+ return (0, errorResponse_1.validationError)('Missing required field: senderId');
128
+ }
129
+ if (!messageType) {
130
+ return (0, errorResponse_1.validationError)('Missing required field: messageType');
131
+ }
132
+ // Validate field types
133
+ if (typeof content !== 'string') {
134
+ return (0, errorResponse_1.validationError)('Invalid field type: content must be a string');
135
+ }
136
+ if (typeof senderId !== 'string') {
137
+ return (0, errorResponse_1.validationError)('Invalid field type: senderId must be a string');
138
+ }
139
+ if (typeof messageType !== 'string') {
140
+ return (0, errorResponse_1.validationError)('Invalid field type: messageType must be a string');
141
+ }
142
+ const contentBuffer = Buffer.from(content, 'base64');
143
+ const service = this.getMessageService();
144
+ // Map numeric encryption scheme to enum value
145
+ const encryptionSchemeValue = encryptionScheme === 1
146
+ ? brightchain_lib_1.MessageEncryptionScheme.SHARED_KEY
147
+ : encryptionScheme === 2
148
+ ? brightchain_lib_1.MessageEncryptionScheme.RECIPIENT_KEYS
149
+ : brightchain_lib_1.MessageEncryptionScheme.NONE;
150
+ const result = await service.sendMessage(contentBuffer, senderId, {
151
+ recipients: recipients || [],
152
+ messageType,
153
+ priority: priority ?? brightchain_lib_1.MessagePriority.NORMAL,
154
+ senderId,
155
+ encryptionScheme: encryptionSchemeValue,
156
+ });
157
+ return {
158
+ statusCode: 201,
159
+ response: {
160
+ messageId: result.messageId,
161
+ magnetUrl: result.magnetUrl,
162
+ },
163
+ };
164
+ }
165
+ catch (_error) {
166
+ return (0, errorResponse_1.handleError)(_error);
167
+ }
168
+ }
169
+ /**
170
+ * GET /api/messages/:id
171
+ * Retrieve a message by its ID.
172
+ *
173
+ * @param req - Request containing the message ID parameter
174
+ * @returns Base64-encoded message content on success, or 404 if not found
175
+ * @requirements 1.2, 1.5
176
+ */
177
+ async handleGetMessage(req) {
178
+ try {
179
+ const { id } = req.params;
180
+ if (!id) {
181
+ return (0, errorResponse_1.validationError)('Missing required parameter: id');
182
+ }
183
+ const service = this.getMessageService();
184
+ const content = await service.getMessage(id);
185
+ if (!content) {
186
+ return (0, errorResponse_1.notFoundError)('Message', id);
187
+ }
188
+ return {
189
+ statusCode: 200,
190
+ response: {
191
+ content: content.toString('base64'),
192
+ },
193
+ };
194
+ }
195
+ catch (_error) {
196
+ return (0, errorResponse_1.handleError)(_error);
197
+ }
198
+ }
199
+ /**
200
+ * GET /api/messages
201
+ * Query messages with optional filters.
202
+ *
203
+ * @param req - Request containing query parameters
204
+ * @returns Array of message metadata matching the query
205
+ * @requirements 1.3
206
+ */
207
+ async handleQueryMessages(req) {
208
+ try {
209
+ const { recipientId, senderId, messageType, page, pageSize } = req.query;
210
+ const query = {};
211
+ if (recipientId) {
212
+ query['recipientId'] = recipientId;
213
+ }
214
+ if (senderId) {
215
+ query['senderId'] = senderId;
216
+ }
217
+ if (messageType) {
218
+ query['messageType'] = messageType;
219
+ }
220
+ const pageNum = parseInt(page || '1', 10);
221
+ const pageSizeNum = parseInt(pageSize || '50', 10);
222
+ query['page'] = pageNum;
223
+ query['pageSize'] = pageSizeNum;
224
+ const service = this.getMessageService();
225
+ const results = await service.queryMessages(query);
226
+ return {
227
+ statusCode: 200,
228
+ response: {
229
+ messages: results,
230
+ total: results.length,
231
+ page: pageNum,
232
+ pageSize: pageSizeNum,
233
+ },
234
+ };
235
+ }
236
+ catch (_error) {
237
+ return (0, errorResponse_1.handleError)(_error);
238
+ }
239
+ }
240
+ /**
241
+ * DELETE /api/messages/:id
242
+ * Delete a message by its ID.
243
+ *
244
+ * @param req - Request containing the message ID parameter
245
+ * @returns 204 No Content on success, or 404 if not found
246
+ * @requirements 1.4
247
+ */
248
+ async handleDeleteMessage(req) {
249
+ try {
250
+ const { id } = req.params;
251
+ if (!id) {
252
+ return (0, errorResponse_1.validationError)('Missing required parameter: id');
253
+ }
254
+ const service = this.getMessageService();
255
+ await service.deleteMessage(id);
256
+ return {
257
+ statusCode: 204,
258
+ response: {
259
+ success: true,
260
+ },
261
+ };
262
+ }
263
+ catch (_error) {
264
+ return (0, errorResponse_1.handleError)(_error);
265
+ }
266
+ }
267
+ }
268
+ exports.MessagesController = MessagesController;
269
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../../../../brightchain-api-lib/src/lib/controllers/api/messages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,152 @@
1
+ import { IAvailabilityService, IDiscoverBlockResponse, IDiscoveryProtocol, IGetNodeResponse, IListNodesResponse, IRegisterNodeResponse } from '@brightchain/brightchain-lib';
2
+ import { CoreLanguageCode } from '@digitaldefiance/i18n-lib';
3
+ import { PlatformID } from '@digitaldefiance/node-ecies-lib';
4
+ import { ApiErrorResponse, ApiRequestHandler, TypedHandlers } from '@digitaldefiance/node-express-suite';
5
+ import { IBrightChainApplication } from '../../interfaces/application';
6
+ import { DefaultBackendIdType } from '../../shared-types';
7
+ import { BaseController } from '../base';
8
+ type NodesApiResponse = IListNodesResponse | IGetNodeResponse | IDiscoverBlockResponse | IRegisterNodeResponse | ApiErrorResponse;
9
+ interface NodesHandlers extends TypedHandlers {
10
+ listNodes: ApiRequestHandler<IListNodesResponse | ApiErrorResponse>;
11
+ getNode: ApiRequestHandler<IGetNodeResponse | ApiErrorResponse>;
12
+ discoverBlock: ApiRequestHandler<IDiscoverBlockResponse | ApiErrorResponse>;
13
+ registerNode: ApiRequestHandler<IRegisterNodeResponse | ApiErrorResponse>;
14
+ }
15
+ /**
16
+ * Controller for node discovery and network management operations.
17
+ *
18
+ * Provides REST API endpoints for listing connected nodes, getting node details,
19
+ * discovering blocks across the network, and registering nodes for WebSocket authentication.
20
+ *
21
+ * ## Endpoints
22
+ *
23
+ * ### GET /api/nodes
24
+ * List all connected peer nodes with their status and capabilities.
25
+ *
26
+ * **Response:**
27
+ * - `nodes` (array): Array of node information objects
28
+ * - `total` (number): Total number of connected nodes
29
+ *
30
+ * ### GET /api/nodes/:nodeId
31
+ * Get detailed information about a specific node.
32
+ *
33
+ * **Parameters:**
34
+ * - `nodeId` (string, required): Node ID to retrieve
35
+ *
36
+ * **Response:**
37
+ * - `node` (object): Node information including latency and last seen timestamp
38
+ *
39
+ * ### POST /api/nodes/discover
40
+ * Discover nodes that have a specific block.
41
+ *
42
+ * **Request Body:**
43
+ * - `blockId` (string, required): Block ID to discover
44
+ *
45
+ * **Response:**
46
+ * - `blockId` (string): The block ID that was searched for
47
+ * - `found` (boolean): Whether the block was found
48
+ * - `locations` (array): Nodes where the block was found
49
+ * - `queriedPeers` (number): Number of peers queried
50
+ * - `duration` (number): Discovery duration in milliseconds
51
+ *
52
+ * ### POST /api/nodes/register
53
+ * Register a node's public key for WebSocket authentication.
54
+ *
55
+ * **Request Body:**
56
+ * - `nodeId` (string, required): Node ID to register
57
+ * - `publicKey` (string, required): Public key for authentication
58
+ *
59
+ * **Response:**
60
+ * - `success` (boolean): Whether registration succeeded
61
+ * - `nodeId` (string): The registered node ID
62
+ * - `message` (string): Status message
63
+ *
64
+ * @requirements 3.1, 3.2, 3.3, 3.4, 3.5
65
+ */
66
+ export declare class NodesController<TID extends PlatformID = DefaultBackendIdType> extends BaseController<TID, NodesApiResponse, NodesHandlers, CoreLanguageCode> {
67
+ private discoveryProtocol;
68
+ private availabilityService;
69
+ /**
70
+ * Store for registered node public keys (nodeId -> publicKey)
71
+ */
72
+ private registeredNodes;
73
+ constructor(application: IBrightChainApplication<TID>);
74
+ /**
75
+ * Set the DiscoveryProtocol instance.
76
+ * This allows for dependency injection and testing.
77
+ */
78
+ setDiscoveryProtocol(protocol: IDiscoveryProtocol): void;
79
+ /**
80
+ * Set the AvailabilityService instance.
81
+ * This allows for dependency injection and testing.
82
+ */
83
+ setAvailabilityService(service: IAvailabilityService): void;
84
+ /**
85
+ * Get the DiscoveryProtocol instance.
86
+ * Throws if the protocol has not been set.
87
+ */
88
+ private getDiscoveryProtocol;
89
+ /**
90
+ * Get the AvailabilityService instance.
91
+ * Throws if the service has not been set.
92
+ */
93
+ private getAvailabilityService;
94
+ /**
95
+ * Check if a node is registered.
96
+ * @param nodeId - The node ID to check
97
+ * @returns True if the node is registered
98
+ */
99
+ isNodeRegistered(nodeId: string): boolean;
100
+ /**
101
+ * Get the public key for a registered node.
102
+ * @param nodeId - The node ID to get the public key for
103
+ * @returns The public key or undefined if not registered
104
+ */
105
+ getNodePublicKey(nodeId: string): string | undefined;
106
+ /**
107
+ * Clear all registered nodes (for testing).
108
+ */
109
+ clearRegisteredNodes(): void;
110
+ protected initRouteDefinitions(): void;
111
+ /**
112
+ * Convert ILocationRecord to node info format
113
+ */
114
+ private locationToNodeInfo;
115
+ /**
116
+ * GET /api/nodes
117
+ * List all connected peer nodes with their status and capabilities.
118
+ *
119
+ * @returns List of connected nodes
120
+ * @requirements 3.1
121
+ */
122
+ private handleListNodes;
123
+ /**
124
+ * GET /api/nodes/:nodeId
125
+ * Get detailed information about a specific node.
126
+ *
127
+ * @param req - Request containing the node ID parameter
128
+ * @returns Node information on success, or 404 if not found
129
+ * @requirements 3.2, 3.5
130
+ */
131
+ private handleGetNode;
132
+ /**
133
+ * POST /api/nodes/discover
134
+ * Discover nodes that have a specific block.
135
+ *
136
+ * @param req - Request containing the block ID to discover
137
+ * @returns Discovery result with locations
138
+ * @requirements 3.3
139
+ */
140
+ private handleDiscoverBlock;
141
+ /**
142
+ * POST /api/nodes/register
143
+ * Register a node's public key for WebSocket authentication.
144
+ *
145
+ * @param req - Request containing node ID and public key
146
+ * @returns Registration result
147
+ * @requirements 3.4, 3.5
148
+ */
149
+ private handleRegisterNode;
150
+ }
151
+ export {};
152
+ //# sourceMappingURL=nodes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../../../../../../brightchain-api-lib/src/lib/controllers/api/nodes.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAGlB,qBAAqB,EAEtB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EAEd,MAAM,qCAAqC,CAAC;AAM7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAM1D,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC,KAAK,gBAAgB,GACjB,kBAAkB,GAClB,gBAAgB,GAChB,sBAAsB,GACtB,qBAAqB,GACrB,gBAAgB,CAAC;AAErB,UAAU,aAAc,SAAQ,aAAa;IAC3C,SAAS,EAAE,iBAAiB,CAAC,kBAAkB,GAAG,gBAAgB,CAAC,CAAC;IACpE,OAAO,EAAE,iBAAiB,CAAC,gBAAgB,GAAG,gBAAgB,CAAC,CAAC;IAChE,aAAa,EAAE,iBAAiB,CAAC,sBAAsB,GAAG,gBAAgB,CAAC,CAAC;IAC5E,YAAY,EAAE,iBAAiB,CAAC,qBAAqB,GAAG,gBAAgB,CAAC,CAAC;CAC3E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,qBAAa,eAAe,CAC1B,GAAG,SAAS,UAAU,GAAG,oBAAoB,CAC7C,SAAQ,cAAc,CACtB,GAAG,EACH,gBAAgB,EAChB,aAAa,EACb,gBAAgB,CACjB;IACC,OAAO,CAAC,iBAAiB,CAAmC;IAC5D,OAAO,CAAC,mBAAmB,CAAqC;IAEhE;;OAEG;IACH,OAAO,CAAC,eAAe,CAAkC;gBAE7C,WAAW,EAAE,uBAAuB,CAAC,GAAG,CAAC;IAIrD;;;OAGG;IACI,oBAAoB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI;IAI/D;;;OAGG;IACI,sBAAsB,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI;IAIlE;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAO5B;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAO9B;;;;OAIG;IACI,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIhD;;;;OAIG;IACI,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI3D;;OAEG;IACI,oBAAoB,IAAI,IAAI;IAInC,SAAS,CAAC,oBAAoB,IAAI,IAAI;IAgCtC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAU1B;;;;;;OAMG;YACW,eAAe;IA+D7B;;;;;;;OAOG;YACW,aAAa;IAsE3B;;;;;;;OAOG;YACW,mBAAmB;IA0CjC;;;;;;;OAOG;YACW,kBAAkB;CAyCjC"}