@olane/o-core 0.7.6 → 0.7.8
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/dist/src/core/interfaces/o-core.interface.d.ts +2 -2
- package/dist/src/core/interfaces/o-core.interface.d.ts.map +1 -1
- package/dist/src/core/o-core.d.ts +6 -0
- package/dist/src/core/o-core.d.ts.map +1 -1
- package/dist/src/core/o-core.js +49 -1
- package/dist/src/router/index.d.ts +3 -1
- package/dist/src/router/index.d.ts.map +1 -1
- package/dist/src/router/index.js +3 -1
- package/dist/src/router/o-address.js +1 -1
- package/dist/src/router/o-request-preparation.d.ts +37 -0
- package/dist/src/router/o-request-preparation.d.ts.map +1 -0
- package/dist/src/router/o-request-preparation.js +75 -0
- package/dist/src/router/o-resolver-chain.d.ts +32 -0
- package/dist/src/router/o-resolver-chain.d.ts.map +1 -0
- package/dist/src/router/o-resolver-chain.js +62 -0
- package/dist/src/router/o-router.d.ts +2 -2
- package/dist/src/router/o-router.d.ts.map +1 -1
- package/dist/src/router/o-router.js +2 -2
- package/dist/src/router/o-routing-policy.d.ts +36 -0
- package/dist/src/router/o-routing-policy.d.ts.map +1 -0
- package/dist/src/router/o-routing-policy.js +19 -0
- package/package.json +2 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Multiaddr } from '@olane/o-config';
|
|
2
2
|
import { oAddress } from '../../router/o-address';
|
|
3
3
|
import { oConnectionManager } from '../../connection/o-connection-manager';
|
|
4
|
-
import {
|
|
4
|
+
import { oResolverChain } from '../../router/o-resolver-chain';
|
|
5
5
|
import { NodeState } from './state.enum';
|
|
6
6
|
export interface oCoreInterface {
|
|
7
7
|
leaders: Multiaddr[];
|
|
@@ -10,7 +10,7 @@ export interface oCoreInterface {
|
|
|
10
10
|
state: NodeState;
|
|
11
11
|
errors: Error[];
|
|
12
12
|
connectionManager: oConnectionManager;
|
|
13
|
-
addressResolution:
|
|
13
|
+
addressResolution: oResolverChain;
|
|
14
14
|
description: string;
|
|
15
15
|
start: () => Promise<void>;
|
|
16
16
|
stop: () => Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"o-core.interface.d.ts","sourceRoot":"","sources":["../../../../src/core/interfaces/o-core.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"o-core.interface.d.ts","sourceRoot":"","sources":["../../../../src/core/interfaces/o-core.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,OAAO,EAAE,QAAQ,CAAC;IAClB,aAAa,EAAE,QAAQ,CAAC;IACxB,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,iBAAiB,EAAE,kBAAkB,CAAC;IACtC,iBAAiB,EAAE,cAAc,CAAC;IAClC,WAAW,EAAE,MAAM,CAAC;IAEpB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B"}
|
|
@@ -24,6 +24,7 @@ export declare abstract class oCore extends oObject {
|
|
|
24
24
|
metrics: oMetrics;
|
|
25
25
|
requestManager: oRequestManager;
|
|
26
26
|
router: oRouter;
|
|
27
|
+
private heartbeatInterval?;
|
|
27
28
|
constructor(config: oCoreConfig);
|
|
28
29
|
get isLeader(): boolean;
|
|
29
30
|
get leader(): oAddress | null;
|
|
@@ -176,6 +177,11 @@ export declare abstract class oCore extends oObject {
|
|
|
176
177
|
stop(): Promise<void>;
|
|
177
178
|
teardown(): Promise<void>;
|
|
178
179
|
get dependencies(): oDependency[];
|
|
180
|
+
/**
|
|
181
|
+
* Start sending periodic heartbeats to the monitor node
|
|
182
|
+
* This is optional and only runs if MONITOR_ENABLED=true and MONITOR_ADDRESS is set
|
|
183
|
+
*/
|
|
184
|
+
private startHeartbeat;
|
|
179
185
|
get methods(): {
|
|
180
186
|
[key: string]: oMethod;
|
|
181
187
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"o-core.d.ts","sourceRoot":"","sources":["../../../src/core/o-core.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAGhD,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAEtD,8BAAsB,KAAM,SAAQ,OAAO;
|
|
1
|
+
{"version":3,"file":"o-core.d.ts","sourceRoot":"","sources":["../../../src/core/o-core.ts"],"names":[],"mappings":"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"}
|
package/dist/src/core/o-core.js
CHANGED
|
@@ -92,6 +92,7 @@ export class oCore extends oObject {
|
|
|
92
92
|
throw new Error('Invalid address');
|
|
93
93
|
}
|
|
94
94
|
this.logger.debug('Using address: ', address.toString());
|
|
95
|
+
// check for static match
|
|
95
96
|
if (address.toStaticAddress().equals(this.address.toStaticAddress())) {
|
|
96
97
|
return this.useSelf(data);
|
|
97
98
|
}
|
|
@@ -152,7 +153,14 @@ export class oCore extends oObject {
|
|
|
152
153
|
throw new Error('Node is not running');
|
|
153
154
|
}
|
|
154
155
|
if (!childAddress.transports) {
|
|
155
|
-
this.
|
|
156
|
+
const child = this.hierarchyManager.getChild(childAddress);
|
|
157
|
+
if (!child) {
|
|
158
|
+
this.logger.warn('Child address has no transports, this might break!');
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
this.logger.debug('Setting transports for child: ', child.transports.map((t) => t.toString()));
|
|
162
|
+
childAddress.setTransports(child?.transports || []);
|
|
163
|
+
}
|
|
156
164
|
}
|
|
157
165
|
const connection = await this.connect(childAddress, childAddress);
|
|
158
166
|
// communicate the payload to the target node
|
|
@@ -224,6 +232,11 @@ export class oCore extends oObject {
|
|
|
224
232
|
this.logger.error('Failed to register node', error);
|
|
225
233
|
});
|
|
226
234
|
this.state = NodeState.RUNNING;
|
|
235
|
+
// Start optional heartbeat to monitor if enabled
|
|
236
|
+
if (process.env.MONITOR_ENABLED === 'true' &&
|
|
237
|
+
process.env.MONITOR_ADDRESS) {
|
|
238
|
+
this.startHeartbeat();
|
|
239
|
+
}
|
|
227
240
|
}
|
|
228
241
|
catch (error) {
|
|
229
242
|
this.logger.error('Failed to start node', error);
|
|
@@ -270,6 +283,11 @@ export class oCore extends oObject {
|
|
|
270
283
|
return;
|
|
271
284
|
}
|
|
272
285
|
this.state = NodeState.STOPPING;
|
|
286
|
+
// Stop heartbeat if running
|
|
287
|
+
if (this.heartbeatInterval) {
|
|
288
|
+
clearInterval(this.heartbeatInterval);
|
|
289
|
+
this.heartbeatInterval = undefined;
|
|
290
|
+
}
|
|
273
291
|
try {
|
|
274
292
|
await this.teardown();
|
|
275
293
|
this.state = NodeState.STOPPED;
|
|
@@ -304,6 +322,36 @@ export class oCore extends oObject {
|
|
|
304
322
|
get dependencies() {
|
|
305
323
|
return this.config.dependencies?.map((d) => new oDependency(d)) || [];
|
|
306
324
|
}
|
|
325
|
+
/**
|
|
326
|
+
* Start sending periodic heartbeats to the monitor node
|
|
327
|
+
* This is optional and only runs if MONITOR_ENABLED=true and MONITOR_ADDRESS is set
|
|
328
|
+
*/
|
|
329
|
+
startHeartbeat() {
|
|
330
|
+
const interval = parseInt(process.env.MONITOR_HEARTBEAT_INTERVAL || '30000', 10);
|
|
331
|
+
const monitorAddress = new oAddress(process.env.MONITOR_ADDRESS || 'o://monitor');
|
|
332
|
+
this.logger.debug(`Starting heartbeat to ${monitorAddress.toString()} every ${interval}ms`);
|
|
333
|
+
this.heartbeatInterval = setInterval(async () => {
|
|
334
|
+
try {
|
|
335
|
+
await this.use(monitorAddress, {
|
|
336
|
+
method: 'record_heartbeat',
|
|
337
|
+
params: {
|
|
338
|
+
address: this.address.toString(),
|
|
339
|
+
timestamp: Date.now(),
|
|
340
|
+
metrics: {
|
|
341
|
+
successCount: this.metrics.successCount,
|
|
342
|
+
errorCount: this.metrics.errorCount,
|
|
343
|
+
activeRequests: this.requestManager.activeRequests.length,
|
|
344
|
+
state: this.state,
|
|
345
|
+
},
|
|
346
|
+
},
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
catch (error) {
|
|
350
|
+
// Monitor unavailable, fail silently
|
|
351
|
+
this.logger.debug('Heartbeat failed (monitor unavailable):', error);
|
|
352
|
+
}
|
|
353
|
+
}, interval);
|
|
354
|
+
}
|
|
307
355
|
get methods() {
|
|
308
356
|
return this.config.methods || {};
|
|
309
357
|
}
|
|
@@ -2,8 +2,10 @@ export * from './o-router.js';
|
|
|
2
2
|
export * from './o-address.js';
|
|
3
3
|
export * from './interfaces/route.response.js';
|
|
4
4
|
export * from './enums/restricted-addresses.enum.js';
|
|
5
|
-
export * from './o-
|
|
5
|
+
export * from './o-resolver-chain.js';
|
|
6
6
|
export * from './o-address-resolver.js';
|
|
7
|
+
export * from './o-routing-policy.js';
|
|
8
|
+
export * from './o-request-preparation.js';
|
|
7
9
|
export * from './interfaces/resolve.request.js';
|
|
8
10
|
export * from './o-request.router.js';
|
|
9
11
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/router/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sCAAsC,CAAC;AACrD,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/router/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sCAAsC,CAAC;AACrD,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iCAAiC,CAAC;AAChD,cAAc,uBAAuB,CAAC"}
|
package/dist/src/router/index.js
CHANGED
|
@@ -2,7 +2,9 @@ export * from './o-router.js';
|
|
|
2
2
|
export * from './o-address.js';
|
|
3
3
|
export * from './interfaces/route.response.js';
|
|
4
4
|
export * from './enums/restricted-addresses.enum.js';
|
|
5
|
-
export * from './o-
|
|
5
|
+
export * from './o-resolver-chain.js';
|
|
6
6
|
export * from './o-address-resolver.js';
|
|
7
|
+
export * from './o-routing-policy.js';
|
|
8
|
+
export * from './o-request-preparation.js';
|
|
7
9
|
export * from './interfaces/resolve.request.js';
|
|
8
10
|
export * from './o-request.router.js';
|
|
@@ -43,7 +43,7 @@ export class oAddress extends oObject {
|
|
|
43
43
|
if (paths.length === 0) {
|
|
44
44
|
return this;
|
|
45
45
|
}
|
|
46
|
-
return new oAddress(`o://${paths[paths.length - 1]}
|
|
46
|
+
return new oAddress(`o://${paths[paths.length - 1]}`, this.transports);
|
|
47
47
|
}
|
|
48
48
|
toRootAddress() {
|
|
49
49
|
const paths = this.paths.split('/');
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { oObject } from '../core/o-object.js';
|
|
2
|
+
import { oAddress } from './o-address.js';
|
|
3
|
+
import { oRouterRequest } from './o-request.router.js';
|
|
4
|
+
/**
|
|
5
|
+
* Handles request transformation and preparation for routing.
|
|
6
|
+
* Manages payload wrapping/unwrapping, parameter merging, and request envelope handling.
|
|
7
|
+
*/
|
|
8
|
+
export declare class oRequestPreparation extends oObject {
|
|
9
|
+
/**
|
|
10
|
+
* Prepares a routing request by applying overrides and updating addresses.
|
|
11
|
+
* @param originalRequest The original router request
|
|
12
|
+
* @param requestOverride Optional request override from resolvers
|
|
13
|
+
* @param targetAddress The final target address
|
|
14
|
+
* @returns The prepared routing request
|
|
15
|
+
*/
|
|
16
|
+
prepareRequest(originalRequest: oRouterRequest, requestOverride: oRouterRequest | undefined, targetAddress: oAddress): oRouterRequest;
|
|
17
|
+
/**
|
|
18
|
+
* Applies handshake-specific transformations to a request.
|
|
19
|
+
* @param request The routing request to modify
|
|
20
|
+
* @param requestOverride The request override from resolvers
|
|
21
|
+
*/
|
|
22
|
+
applyHandshakeTransform(request: oRouterRequest, requestOverride: oRouterRequest | undefined): oRouterRequest;
|
|
23
|
+
/**
|
|
24
|
+
* Merges parameters from original payload and resolver overrides.
|
|
25
|
+
* @param request The routing request to modify
|
|
26
|
+
* @param originalPayload The original request payload
|
|
27
|
+
*/
|
|
28
|
+
applyParameterMerge(request: oRouterRequest, originalPayload: any): oRouterRequest;
|
|
29
|
+
/**
|
|
30
|
+
* Checks if the request is a handshake request.
|
|
31
|
+
* @param method The method to check
|
|
32
|
+
* @param handshakeMethod The handshake method constant
|
|
33
|
+
* @returns True if this is a handshake request
|
|
34
|
+
*/
|
|
35
|
+
isHandshakeRequest(method: string, handshakeMethod: string): boolean;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=o-request-preparation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"o-request-preparation.d.ts","sourceRoot":"","sources":["../../../src/router/o-request-preparation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,OAAO;IAC9C;;;;;;OAMG;IACH,cAAc,CACZ,eAAe,EAAE,cAAc,EAC/B,eAAe,EAAE,cAAc,GAAG,SAAS,EAC3C,aAAa,EAAE,QAAQ,GACtB,cAAc;IAkBjB;;;;OAIG;IACH,uBAAuB,CACrB,OAAO,EAAE,cAAc,EACvB,eAAe,EAAE,cAAc,GAAG,SAAS,GAC1C,cAAc;IAmBjB;;;;OAIG;IACH,mBAAmB,CACjB,OAAO,EAAE,cAAc,EACvB,eAAe,EAAE,GAAG,GACnB,cAAc;IAUjB;;;;;OAKG;IACH,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO;CAGrE"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { oObject } from '../core/o-object.js';
|
|
2
|
+
import { oRouterRequest } from './o-request.router.js';
|
|
3
|
+
import { JSONRPC_VERSION, oProtocolMethods } from '@olane/o-protocol';
|
|
4
|
+
/**
|
|
5
|
+
* Handles request transformation and preparation for routing.
|
|
6
|
+
* Manages payload wrapping/unwrapping, parameter merging, and request envelope handling.
|
|
7
|
+
*/
|
|
8
|
+
export class oRequestPreparation extends oObject {
|
|
9
|
+
/**
|
|
10
|
+
* Prepares a routing request by applying overrides and updating addresses.
|
|
11
|
+
* @param originalRequest The original router request
|
|
12
|
+
* @param requestOverride Optional request override from resolvers
|
|
13
|
+
* @param targetAddress The final target address
|
|
14
|
+
* @returns The prepared routing request
|
|
15
|
+
*/
|
|
16
|
+
prepareRequest(originalRequest, requestOverride, targetAddress) {
|
|
17
|
+
const finalRequest = requestOverride || originalRequest;
|
|
18
|
+
const req = new oRouterRequest({
|
|
19
|
+
method: finalRequest.method,
|
|
20
|
+
params: finalRequest.params,
|
|
21
|
+
id: finalRequest.id,
|
|
22
|
+
jsonrpc: JSONRPC_VERSION,
|
|
23
|
+
stream: originalRequest.stream,
|
|
24
|
+
});
|
|
25
|
+
// Update target address in request
|
|
26
|
+
if (finalRequest && targetAddress) {
|
|
27
|
+
finalRequest.params.address = targetAddress.toString();
|
|
28
|
+
}
|
|
29
|
+
return req;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Applies handshake-specific transformations to a request.
|
|
33
|
+
* @param request The routing request to modify
|
|
34
|
+
* @param requestOverride The request override from resolvers
|
|
35
|
+
*/
|
|
36
|
+
applyHandshakeTransform(request, requestOverride) {
|
|
37
|
+
const params = request.params.payload.params;
|
|
38
|
+
const { method } = request.params.payload;
|
|
39
|
+
try {
|
|
40
|
+
if (requestOverride) {
|
|
41
|
+
// This is likely a method resolver, so we need to override the method
|
|
42
|
+
// Let's specify the method in the request params to optimize on context window
|
|
43
|
+
params.tool = request.params?.payload?.method;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch (e) {
|
|
47
|
+
this.logger.error('Error assigning tool to handshake: ', e);
|
|
48
|
+
}
|
|
49
|
+
// Update the method to be the handshake
|
|
50
|
+
request.params.payload.method = oProtocolMethods.HANDSHAKE;
|
|
51
|
+
return request;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Merges parameters from original payload and resolver overrides.
|
|
55
|
+
* @param request The routing request to modify
|
|
56
|
+
* @param originalPayload The original request payload
|
|
57
|
+
*/
|
|
58
|
+
applyParameterMerge(request, originalPayload) {
|
|
59
|
+
const params = request.params.payload.params;
|
|
60
|
+
request.params.payload.params = {
|
|
61
|
+
...originalPayload.params, // initial params
|
|
62
|
+
...params, // overloaded params
|
|
63
|
+
};
|
|
64
|
+
return request;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Checks if the request is a handshake request.
|
|
68
|
+
* @param method The method to check
|
|
69
|
+
* @param handshakeMethod The handshake method constant
|
|
70
|
+
* @returns True if this is a handshake request
|
|
71
|
+
*/
|
|
72
|
+
isHandshakeRequest(method, handshakeMethod) {
|
|
73
|
+
return method === handshakeMethod;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { oAddress } from './o-address.js';
|
|
2
|
+
import { oAddressResolver } from './o-address-resolver.js';
|
|
3
|
+
import { oObject } from '../core/o-object.js';
|
|
4
|
+
import { RouteResponse } from './interfaces/route.response.js';
|
|
5
|
+
import { ResolveRequest } from './interfaces/resolve.request.js';
|
|
6
|
+
/**
|
|
7
|
+
* Manages a chain of address resolvers using the Chain of Responsibility pattern.
|
|
8
|
+
* Sequentially executes registered resolvers to transform addresses and routing requests.
|
|
9
|
+
*/
|
|
10
|
+
export declare class oResolverChain extends oObject {
|
|
11
|
+
private readonly resolvers;
|
|
12
|
+
/**
|
|
13
|
+
* Registers a resolver in the chain.
|
|
14
|
+
* @param resolver The resolver to add
|
|
15
|
+
* @param isPriority If true, adds to the front of the chain; otherwise appends to the end
|
|
16
|
+
*/
|
|
17
|
+
addResolver(resolver: oAddressResolver, isPriority?: boolean): void;
|
|
18
|
+
/**
|
|
19
|
+
* Checks if any resolver in the chain supports the given address.
|
|
20
|
+
* @param address The address to check
|
|
21
|
+
* @returns True if at least one resolver supports this address
|
|
22
|
+
*/
|
|
23
|
+
supportsAddress(address: oAddress): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Executes the resolver chain to transform an address and request.
|
|
26
|
+
* Each resolver in sequence can modify the nextHopAddress, targetAddress, and request.
|
|
27
|
+
* @param request The resolve request containing address, node, and optional request override
|
|
28
|
+
* @returns The final route response after all resolvers have executed
|
|
29
|
+
*/
|
|
30
|
+
resolve(request: ResolveRequest): Promise<RouteResponse>;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=o-resolver-chain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"o-resolver-chain.d.ts","sourceRoot":"","sources":["../../../src/router/o-resolver-chain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAG3D,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAGjE;;;GAGG;AACH,qBAAa,cAAe,SAAQ,OAAO;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;IAEpD;;;;OAIG;IACH,WAAW,CAAC,QAAQ,EAAE,gBAAgB,EAAE,UAAU,GAAE,OAAe;IAQnE;;;;OAIG;IACH,eAAe,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO;IAQ3C;;;;;OAKG;IACG,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;CA+B/D"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { oAddress } from './o-address.js';
|
|
2
|
+
import { oObject } from '../core/o-object.js';
|
|
3
|
+
/**
|
|
4
|
+
* Manages a chain of address resolvers using the Chain of Responsibility pattern.
|
|
5
|
+
* Sequentially executes registered resolvers to transform addresses and routing requests.
|
|
6
|
+
*/
|
|
7
|
+
export class oResolverChain extends oObject {
|
|
8
|
+
constructor() {
|
|
9
|
+
super(...arguments);
|
|
10
|
+
this.resolvers = [];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Registers a resolver in the chain.
|
|
14
|
+
* @param resolver The resolver to add
|
|
15
|
+
* @param isPriority If true, adds to the front of the chain; otherwise appends to the end
|
|
16
|
+
*/
|
|
17
|
+
addResolver(resolver, isPriority = false) {
|
|
18
|
+
if (isPriority) {
|
|
19
|
+
this.resolvers.unshift(resolver);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
this.resolvers.push(resolver);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Checks if any resolver in the chain supports the given address.
|
|
27
|
+
* @param address The address to check
|
|
28
|
+
* @returns True if at least one resolver supports this address
|
|
29
|
+
*/
|
|
30
|
+
supportsAddress(address) {
|
|
31
|
+
return this.resolvers.some((r) => address.transports.some((t) => {
|
|
32
|
+
return r.transportTypes.some((r) => r === t.type);
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Executes the resolver chain to transform an address and request.
|
|
37
|
+
* Each resolver in sequence can modify the nextHopAddress, targetAddress, and request.
|
|
38
|
+
* @param request The resolve request containing address, node, and optional request override
|
|
39
|
+
* @returns The final route response after all resolvers have executed
|
|
40
|
+
*/
|
|
41
|
+
async resolve(request) {
|
|
42
|
+
let resolvedAddress = new oAddress(request.address.toString(), request.address.transports);
|
|
43
|
+
let targetAddress = resolvedAddress;
|
|
44
|
+
let requestOverride = request.request;
|
|
45
|
+
for (const resolver of this.resolvers) {
|
|
46
|
+
const { nextHopAddress, targetAddress: resolverTargetAddress, requestOverride: resolverRequestOverride, } = await resolver.resolve({
|
|
47
|
+
address: resolvedAddress,
|
|
48
|
+
targetAddress: targetAddress,
|
|
49
|
+
node: request.node,
|
|
50
|
+
request: requestOverride,
|
|
51
|
+
});
|
|
52
|
+
requestOverride = resolverRequestOverride || requestOverride;
|
|
53
|
+
targetAddress = resolverTargetAddress || targetAddress;
|
|
54
|
+
resolvedAddress = nextHopAddress;
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
nextHopAddress: resolvedAddress,
|
|
58
|
+
targetAddress: targetAddress,
|
|
59
|
+
requestOverride: requestOverride,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { oAddress } from './o-address.js';
|
|
2
2
|
import { oObject } from '../core/o-object.js';
|
|
3
|
-
import {
|
|
3
|
+
import { oResolverChain } from './o-resolver-chain.js';
|
|
4
4
|
import { oAddressResolver } from './o-address-resolver.js';
|
|
5
5
|
import { oRequest } from '../connection/o-request.js';
|
|
6
6
|
import type { oCore } from '../core/o-core.js';
|
|
7
7
|
import { RouteResponse } from './interfaces/route.response.js';
|
|
8
8
|
import { oRouterRequest } from './o-request.router.js';
|
|
9
9
|
export declare abstract class oRouter extends oObject {
|
|
10
|
-
addressResolution:
|
|
10
|
+
addressResolution: oResolverChain;
|
|
11
11
|
constructor();
|
|
12
12
|
abstract translate(addressWithLeaderTransports: oAddress, node: oCore): Promise<RouteResponse>;
|
|
13
13
|
abstract isInternal(addressWithLeaderTransports: oAddress, node: oCore): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"o-router.d.ts","sourceRoot":"","sources":["../../../src/router/o-router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"o-router.d.ts","sourceRoot":"","sources":["../../../src/router/o-router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,8BAAsB,OAAQ,SAAQ,OAAO;IACpC,iBAAiB,EAAG,cAAc,CAAC;;IAQ1C,QAAQ,CAAC,SAAS,CAChB,2BAA2B,EAAE,QAAQ,EACrC,IAAI,EAAE,KAAK,GACV,OAAO,CAAC,aAAa,CAAC;IAGzB,QAAQ,CAAC,UAAU,CACjB,2BAA2B,EAAE,QAAQ,EACrC,IAAI,EAAE,KAAK,GACV,OAAO;IAKV,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC;IAG5E,SAAS,CAAC,QAAQ,CAAC,OAAO,CACxB,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAE,QAAQ,GAAG,cAAc,EAClC,IAAI,EAAE,KAAK,GACV,OAAO,CAAC,GAAG,CAAC;IAEf,WAAW,CAAC,QAAQ,EAAE,gBAAgB,EAAE,UAAU,GAAE,OAAe,GAAG,IAAI;IAI1E,eAAe,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO;CAG5C"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { oObject } from '../core/o-object.js';
|
|
2
|
-
import {
|
|
2
|
+
import { oResolverChain } from './o-resolver-chain.js';
|
|
3
3
|
export class oRouter extends oObject {
|
|
4
4
|
constructor() {
|
|
5
5
|
super();
|
|
6
|
-
this.addressResolution = new
|
|
6
|
+
this.addressResolution = new oResolverChain();
|
|
7
7
|
}
|
|
8
8
|
addResolver(resolver, isPriority = false) {
|
|
9
9
|
this.addressResolution.addResolver(resolver, isPriority);
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { oAddress } from './o-address.js';
|
|
2
|
+
import { oObject } from '../core/o-object.js';
|
|
3
|
+
import type { oCore } from '../core/o-core.js';
|
|
4
|
+
import { RouteResponse } from './interfaces/route.response.js';
|
|
5
|
+
/**
|
|
6
|
+
* Provides routing policy decisions based on network topology and address characteristics.
|
|
7
|
+
* Determines whether addresses are internal/external, when to route to leaders, etc.
|
|
8
|
+
*
|
|
9
|
+
* This layer separates network topology awareness from address resolution logic,
|
|
10
|
+
* making routing decisions testable without network calls.
|
|
11
|
+
*/
|
|
12
|
+
export declare abstract class oRoutingPolicy extends oObject {
|
|
13
|
+
/**
|
|
14
|
+
* Determines if an address is internal to the current network/hierarchy.
|
|
15
|
+
* @param address The address to check
|
|
16
|
+
* @param node The current node context
|
|
17
|
+
* @returns True if the address is internal, false if external
|
|
18
|
+
*/
|
|
19
|
+
abstract isInternalAddress(address: oAddress, node: oCore): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Determines if the given address points to the node itself.
|
|
22
|
+
* @param address The address to check
|
|
23
|
+
* @param node The current node context
|
|
24
|
+
* @returns True if this is a self-reference
|
|
25
|
+
*/
|
|
26
|
+
isSelfAddress(address: oAddress, node: oCore): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Checks if an address should be routed to a leader node.
|
|
29
|
+
* Returns a RouteResponse if leader routing is required, null otherwise.
|
|
30
|
+
* @param address The address to evaluate
|
|
31
|
+
* @param node The current node context
|
|
32
|
+
* @returns RouteResponse for leader routing, or null if not applicable
|
|
33
|
+
*/
|
|
34
|
+
abstract getExternalRoutingStrategy(address: oAddress, node: oCore): RouteResponse | null;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=o-routing-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"o-routing-policy.d.ts","sourceRoot":"","sources":["../../../src/router/o-routing-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D;;;;;;GAMG;AACH,8BAAsB,cAAe,SAAQ,OAAO;IAClD;;;;;OAKG;IACH,QAAQ,CAAC,iBAAiB,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,GAAG,OAAO;IAEnE;;;;;OAKG;IACH,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,GAAG,OAAO;IAItD;;;;;;OAMG;IACH,QAAQ,CAAC,0BAA0B,CACjC,OAAO,EAAE,QAAQ,EACjB,IAAI,EAAE,KAAK,GACV,aAAa,GAAG,IAAI;CACxB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { oObject } from '../core/o-object.js';
|
|
2
|
+
/**
|
|
3
|
+
* Provides routing policy decisions based on network topology and address characteristics.
|
|
4
|
+
* Determines whether addresses are internal/external, when to route to leaders, etc.
|
|
5
|
+
*
|
|
6
|
+
* This layer separates network topology awareness from address resolution logic,
|
|
7
|
+
* making routing decisions testable without network calls.
|
|
8
|
+
*/
|
|
9
|
+
export class oRoutingPolicy extends oObject {
|
|
10
|
+
/**
|
|
11
|
+
* Determines if the given address points to the node itself.
|
|
12
|
+
* @param address The address to check
|
|
13
|
+
* @param node The current node context
|
|
14
|
+
* @returns True if this is a self-reference
|
|
15
|
+
*/
|
|
16
|
+
isSelfAddress(address, node) {
|
|
17
|
+
return node.address.equals(address);
|
|
18
|
+
}
|
|
19
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@olane/o-core",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.8",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/src/index.js",
|
|
6
6
|
"types": "dist/src/index.d.ts",
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
"typescript": "^5.8.3"
|
|
62
62
|
},
|
|
63
63
|
"peerDependencies": {
|
|
64
|
-
"@olane/o-protocol": "^0.7.
|
|
64
|
+
"@olane/o-protocol": "^0.7.7"
|
|
65
65
|
},
|
|
66
66
|
"dependencies": {
|
|
67
67
|
"chalk": "^5.4.1",
|