@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.
@@ -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 { oAddressResolution } from '../../router/o-address-resolution';
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: oAddressResolution;
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,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,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,kBAAkB,CAAC;IACtC,WAAW,EAAE,MAAM,CAAC;IAEpB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B"}
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;IAU7B,QAAQ,CAAC,MAAM,EAAE,WAAW;IATjC,OAAO,EAAE,QAAQ,CAAC;IAClB,KAAK,EAAE,SAAS,CAAqB;IACrC,MAAM,EAAE,KAAK,EAAE,CAAM;IACrB,iBAAiB,EAAG,kBAAkB,CAAC;IACvC,gBAAgB,EAAE,iBAAiB,CAAC;IACpC,OAAO,EAAE,QAAQ,CAAkB;IACnC,cAAc,EAAE,eAAe,CAAyB;IACxD,MAAM,EAAG,OAAO,CAAC;gBAEH,MAAM,EAAE,WAAW;IAWxC,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,IAAI,MAAM,IAAI,QAAQ,GAAG,IAAI,CAE5B;IAGD,QAAQ,CAAC,mBAAmB,IAAI,GAAG,EAAE;IAErC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoDG;IACG,GAAG,CACP,OAAO,EAAE,QAAQ,EACjB,IAAI,CAAC,EAAE;QACL,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE;YAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;SAAE,CAAC;QAChC,EAAE,CAAC,EAAE,MAAM,CAAC;KACb,GACA,OAAO,CAAC,SAAS,CAAC;IA+CrB,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC;IAE3C,OAAO,CAAC,IAAI,CAAC,EAAE;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE;YAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;SAAE,CAAC;QAChC,EAAE,CAAC,EAAE,MAAM,CAAC;KACb,GAAG,OAAO,CAAC,SAAS,CAAC;IAqChB,QAAQ,CACZ,YAAY,EAAE,QAAQ,EACtB,IAAI,CAAC,EAAE;QACL,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE;YAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;SAAE,CAAC;QAChC,EAAE,CAAC,EAAE,MAAM,CAAC;KACb,GACA,OAAO,CAAC,SAAS,CAAC;IA6BrB,YAAY,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI;IAI/B,eAAe,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI;IAKlC,QAAQ,CAAC,OAAO,CACd,cAAc,EAAE,QAAQ,EACxB,aAAa,EAAE,QAAQ,GACtB,OAAO,CAAC,WAAW,CAAC;IAGvB,QAAQ,CAAC,gBAAgB,IAAI,IAAI;IAGjC,QAAQ,CAAC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IACpC,QAAQ,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAG5B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAEjC,IAAI,SAAS,IAAI,OAAO,CAMvB;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBrB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBtC,IAAI,YAAY,IAAI,WAAW,EAAE,CAEhC;IAED,IAAI,OAAO,IAAI;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAExC;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,aAAa,IAAI,QAAQ,CAE5B;IAED,IAAI,IAAI,IAAI,QAAQ,CAEnB;IAED,IAAI,UAAU,IAAI,UAAU,EAAE,CAE7B;IAED,IAAI,MAAM,IAAI,QAAQ,GAAG,IAAI,CAE5B;IAED,IAAI,gBAAgB,IAAI,UAAU,EAAE,CAEnC;IAEK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC;CAQ7B"}
1
+ {"version":3,"file":"o-core.d.ts","sourceRoot":"","sources":["../../../src/core/o-core.ts"],"names":[],"mappings":"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"}
@@ -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.logger.warn('Child address has no transports, this might break!');
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-address-resolution.js';
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,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,iCAAiC,CAAC;AAChD,cAAc,uBAAuB,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"}
@@ -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-address-resolution.js';
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 { oAddressResolution } from './o-address-resolution.js';
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: oAddressResolution;
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,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,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,kBAAkB,CAAC;;IAQ9C,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
+ {"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 { oAddressResolution } from './o-address-resolution.js';
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 oAddressResolution();
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.6",
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.5"
64
+ "@olane/o-protocol": "^0.7.7"
65
65
  },
66
66
  "dependencies": {
67
67
  "chalk": "^5.4.1",