@olane/o-node 0.7.12-alpha.21 → 0.7.12-alpha.23
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/o-core/src/connection/o-response.d.ts +26 -0
- package/dist/o-core/src/connection/o-response.d.ts.map +1 -0
- package/dist/o-core/src/connection/o-response.js +45 -0
- package/dist/o-core/src/error/enums/codes.error.d.ts +20 -0
- package/dist/o-core/src/error/enums/codes.error.d.ts.map +1 -0
- package/dist/o-core/src/error/enums/codes.error.js +20 -0
- package/dist/o-core/src/error/interfaces/o-error.interface.d.ts +6 -0
- package/dist/o-core/src/error/interfaces/o-error.interface.d.ts.map +1 -0
- package/dist/o-core/src/error/interfaces/o-error.interface.js +1 -0
- package/dist/o-core/src/error/o-error.d.ts +15 -0
- package/dist/o-core/src/error/o-error.d.ts.map +1 -0
- package/dist/o-core/src/error/o-error.js +27 -0
- package/dist/o-core/src/streaming/index.d.ts +11 -0
- package/dist/o-core/src/streaming/index.d.ts.map +1 -0
- package/dist/o-core/src/streaming/index.js +14 -0
- package/dist/o-core/src/streaming/protocol-builder.d.ts +62 -0
- package/dist/o-core/src/streaming/protocol-builder.d.ts.map +1 -0
- package/dist/o-core/src/streaming/protocol-builder.js +93 -0
- package/dist/o-core/src/streaming/stream-config.d.ts +36 -0
- package/dist/o-core/src/streaming/stream-config.d.ts.map +1 -0
- package/dist/o-core/src/streaming/stream-config.js +19 -0
- package/dist/o-core/src/streaming/stream-handler.base.d.ts +85 -0
- package/dist/o-core/src/streaming/stream-handler.base.d.ts.map +1 -0
- package/dist/o-core/src/streaming/stream-handler.base.js +112 -0
- package/dist/o-core/src/streaming/stream-transport.interface.d.ts +61 -0
- package/dist/o-core/src/streaming/stream-transport.interface.d.ts.map +1 -0
- package/dist/o-core/src/streaming/stream-transport.interface.js +10 -0
- package/dist/o-core/src/utils/streaming.utils.d.ts +37 -0
- package/dist/o-core/src/utils/streaming.utils.d.ts.map +1 -0
- package/dist/o-core/src/utils/streaming.utils.js +71 -0
- package/dist/o-node/src/connection/index.d.ts +5 -0
- package/dist/o-node/src/connection/index.d.ts.map +1 -0
- package/dist/o-node/src/connection/index.js +4 -0
- package/dist/o-node/src/connection/interfaces/o-node-connection-manager.config.d.ts +6 -0
- package/dist/o-node/src/connection/interfaces/o-node-connection-manager.config.d.ts.map +1 -0
- package/dist/o-node/src/connection/interfaces/o-node-connection-manager.config.js +1 -0
- package/dist/o-node/src/connection/interfaces/o-node-connection.config.d.ts +6 -0
- package/dist/o-node/src/connection/interfaces/o-node-connection.config.d.ts.map +1 -0
- package/dist/o-node/src/connection/interfaces/o-node-connection.config.js +1 -0
- package/dist/o-node/src/connection/o-node-connection.d.ts +20 -0
- package/dist/o-node/src/connection/o-node-connection.d.ts.map +1 -0
- package/dist/o-node/src/connection/o-node-connection.js +146 -0
- package/dist/o-node/src/connection/o-node-connection.manager.d.ts +19 -0
- package/dist/o-node/src/connection/o-node-connection.manager.d.ts.map +1 -0
- package/dist/o-node/src/connection/o-node-connection.manager.js +92 -0
- package/dist/o-node/src/index.d.ts +10 -0
- package/dist/o-node/src/index.d.ts.map +1 -0
- package/dist/o-node/src/index.js +9 -0
- package/dist/o-node/src/interfaces/i-heartbeatable-node.d.ts +49 -0
- package/dist/o-node/src/interfaces/i-heartbeatable-node.d.ts.map +1 -0
- package/dist/o-node/src/interfaces/i-heartbeatable-node.js +1 -0
- package/dist/o-node/src/interfaces/i-reconnectable-node.d.ts +46 -0
- package/dist/o-node/src/interfaces/i-reconnectable-node.d.ts.map +1 -0
- package/dist/o-node/src/interfaces/i-reconnectable-node.js +1 -0
- package/dist/o-node/src/interfaces/o-node.config.d.ts +66 -0
- package/dist/o-node/src/interfaces/o-node.config.d.ts.map +1 -0
- package/dist/o-node/src/interfaces/o-node.config.js +1 -0
- package/dist/o-node/src/interfaces/o-node.tool-config.d.ts +4 -0
- package/dist/o-node/src/interfaces/o-node.tool-config.d.ts.map +1 -0
- package/dist/o-node/src/interfaces/o-node.tool-config.js +1 -0
- package/dist/o-node/src/lib/network-activity.lib.d.ts +1 -0
- package/dist/o-node/src/lib/network-activity.lib.d.ts.map +1 -0
- package/dist/o-node/src/lib/network-activity.lib.js +34 -0
- package/dist/o-node/src/managers/o-connection-heartbeat.manager.d.ts +62 -0
- package/dist/o-node/src/managers/o-connection-heartbeat.manager.d.ts.map +1 -0
- package/dist/o-node/src/managers/o-connection-heartbeat.manager.js +213 -0
- package/dist/o-node/src/managers/o-reconnection.manager.d.ts +51 -0
- package/dist/o-node/src/managers/o-reconnection.manager.d.ts.map +1 -0
- package/dist/o-node/src/managers/o-reconnection.manager.js +266 -0
- package/dist/o-node/src/nodes/client.node.d.ts +7 -0
- package/dist/o-node/src/nodes/client.node.d.ts.map +1 -0
- package/dist/o-node/src/nodes/client.node.js +16 -0
- package/dist/o-node/src/nodes/index.d.ts +4 -0
- package/dist/o-node/src/nodes/index.d.ts.map +1 -0
- package/dist/o-node/src/nodes/index.js +3 -0
- package/dist/o-node/src/nodes/server.node.d.ts +7 -0
- package/dist/o-node/src/nodes/server.node.d.ts.map +1 -0
- package/dist/o-node/src/nodes/server.node.js +20 -0
- package/dist/o-node/src/nodes/websocket.node.d.ts +7 -0
- package/dist/o-node/src/nodes/websocket.node.d.ts.map +1 -0
- package/dist/o-node/src/nodes/websocket.node.js +18 -0
- package/dist/o-node/src/o-node.d.ts +72 -0
- package/dist/o-node/src/o-node.d.ts.map +1 -0
- package/dist/o-node/src/o-node.hierarchy-manager.d.ts +15 -0
- package/dist/o-node/src/o-node.hierarchy-manager.d.ts.map +1 -0
- package/dist/o-node/src/o-node.hierarchy-manager.js +15 -0
- package/dist/o-node/src/o-node.js +420 -0
- package/dist/o-node/src/o-node.notification-manager.d.ts +52 -0
- package/dist/o-node/src/o-node.notification-manager.d.ts.map +1 -0
- package/dist/o-node/src/o-node.notification-manager.js +185 -0
- package/dist/o-node/src/o-node.tool.d.ts +18 -0
- package/dist/o-node/src/o-node.tool.d.ts.map +1 -0
- package/dist/o-node/src/o-node.tool.js +116 -0
- package/dist/o-node/src/router/index.d.ts +6 -0
- package/dist/o-node/src/router/index.d.ts.map +1 -0
- package/dist/o-node/src/router/index.js +5 -0
- package/dist/o-node/src/router/interfaces/o-node-router.config.d.ts +3 -0
- package/dist/o-node/src/router/interfaces/o-node-router.config.d.ts.map +1 -0
- package/dist/o-node/src/router/interfaces/o-node-router.config.js +1 -0
- package/dist/o-node/src/router/interfaces/o-node-router.response.d.ts +8 -0
- package/dist/o-node/src/router/interfaces/o-node-router.response.d.ts.map +1 -0
- package/dist/o-node/src/router/interfaces/o-node-router.response.js +1 -0
- package/dist/o-node/src/router/o-node.address.d.ts +18 -0
- package/dist/o-node/src/router/o-node.address.d.ts.map +1 -0
- package/dist/o-node/src/router/o-node.address.js +29 -0
- package/dist/o-node/src/router/o-node.router.d.ts +45 -0
- package/dist/o-node/src/router/o-node.router.d.ts.map +1 -0
- package/dist/o-node/src/router/o-node.router.js +125 -0
- package/dist/o-node/src/router/o-node.routing-policy.d.ts +30 -0
- package/dist/o-node/src/router/o-node.routing-policy.d.ts.map +1 -0
- package/dist/o-node/src/router/o-node.routing-policy.js +57 -0
- package/dist/o-node/src/router/o-node.transport.d.ts +11 -0
- package/dist/o-node/src/router/o-node.transport.d.ts.map +1 -0
- package/dist/o-node/src/router/o-node.transport.js +18 -0
- package/dist/o-node/src/router/resolvers/index.d.ts +4 -0
- package/dist/o-node/src/router/resolvers/index.d.ts.map +1 -0
- package/dist/o-node/src/router/resolvers/index.js +3 -0
- package/dist/o-node/src/router/resolvers/o-node.leader-resolver-fallback.d.ts +8 -0
- package/dist/o-node/src/router/resolvers/o-node.leader-resolver-fallback.d.ts.map +1 -0
- package/dist/o-node/src/router/resolvers/o-node.leader-resolver-fallback.js +35 -0
- package/dist/o-node/src/router/resolvers/o-node.resolver.d.ts +11 -0
- package/dist/o-node/src/router/resolvers/o-node.resolver.d.ts.map +1 -0
- package/dist/o-node/src/router/resolvers/o-node.resolver.js +41 -0
- package/dist/o-node/src/router/resolvers/o-node.search-resolver.d.ts +170 -0
- package/dist/o-node/src/router/resolvers/o-node.search-resolver.d.ts.map +1 -0
- package/dist/o-node/src/router/resolvers/o-node.search-resolver.js +285 -0
- package/dist/o-node/src/router/route.request.d.ts +14 -0
- package/dist/o-node/src/router/route.request.d.ts.map +1 -0
- package/dist/o-node/src/router/route.request.js +1 -0
- package/dist/o-node/src/streaming/index.d.ts +10 -0
- package/dist/o-node/src/streaming/index.d.ts.map +1 -0
- package/dist/o-node/src/streaming/index.js +12 -0
- package/dist/o-node/src/streaming/libp2p-stream-transport.d.ts +50 -0
- package/dist/o-node/src/streaming/libp2p-stream-transport.d.ts.map +1 -0
- package/dist/o-node/src/streaming/libp2p-stream-transport.js +137 -0
- package/dist/o-node/src/streaming/node-stream-handler.d.ts +65 -0
- package/dist/o-node/src/streaming/node-stream-handler.d.ts.map +1 -0
- package/dist/o-node/src/streaming/node-stream-handler.js +101 -0
- package/dist/o-node/src/utils/circuit-breaker.d.ts +107 -0
- package/dist/o-node/src/utils/circuit-breaker.d.ts.map +1 -0
- package/dist/o-node/src/utils/circuit-breaker.js +175 -0
- package/dist/o-node/src/utils/circuit-breaker.test.d.ts +2 -0
- package/dist/o-node/src/utils/circuit-breaker.test.d.ts.map +1 -0
- package/dist/o-node/src/utils/circuit-breaker.test.js +262 -0
- package/dist/o-node/src/utils/leader-request-wrapper.d.ts +66 -0
- package/dist/o-node/src/utils/leader-request-wrapper.d.ts.map +1 -0
- package/dist/o-node/src/utils/leader-request-wrapper.js +160 -0
- package/dist/o-node/src/utils/leader-request-wrapper.test.d.ts +1 -0
- package/dist/o-node/src/utils/leader-request-wrapper.test.d.ts.map +1 -0
- package/dist/o-node/src/utils/leader-request-wrapper.test.js +246 -0
- package/dist/o-node/src/utils/network.utils.d.ts +20 -0
- package/dist/o-node/src/utils/network.utils.d.ts.map +1 -0
- package/dist/o-node/src/utils/network.utils.js +74 -0
- package/dist/o-node/test/o-node.spec.d.ts +2 -0
- package/dist/o-node/test/o-node.spec.d.ts.map +1 -0
- package/dist/o-node/test/o-node.spec.js +20 -0
- package/dist/o-node/test/search-resolver.spec.d.ts +2 -0
- package/dist/o-node/test/search-resolver.spec.d.ts.map +1 -0
- package/dist/o-node/test/search-resolver.spec.js +693 -0
- package/dist/src/connection/o-node-connection.d.ts +7 -0
- package/dist/src/connection/o-node-connection.d.ts.map +1 -1
- package/dist/src/connection/o-node-connection.js +89 -2
- package/dist/src/connection/o-node-connection.manager.d.ts +2 -0
- package/dist/src/connection/o-node-connection.manager.d.ts.map +1 -1
- package/dist/src/connection/o-node-connection.manager.js +5 -1
- package/dist/src/interfaces/o-node.config.d.ts +16 -0
- package/dist/src/interfaces/o-node.config.d.ts.map +1 -1
- package/dist/src/o-node.d.ts +1 -1
- package/dist/src/o-node.d.ts.map +1 -1
- package/dist/src/o-node.js +5 -1
- package/dist/src/o-node.tool.d.ts.map +1 -1
- package/dist/src/o-node.tool.js +37 -7
- package/dist/src/router/resolvers/o-node.search-resolver.d.ts.map +1 -1
- package/dist/src/router/resolvers/o-node.search-resolver.js +10 -3
- package/package.json +6 -6
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { CoreUtils, oError, oErrorCodes, oRequest, ChildJoinedEvent, } from '@olane/o-core';
|
|
2
|
+
import { isAsyncGenerator, processStream } from '../../o-core/src/utils/streaming.utils.js';
|
|
3
|
+
import { oTool } from '@olane/o-tool';
|
|
4
|
+
import { oServerNode } from './nodes/server.node.js';
|
|
5
|
+
import { oNodeTransport } from './router/o-node.transport.js';
|
|
6
|
+
import { oNodeAddress } from './router/o-node.address.js';
|
|
7
|
+
import { Libp2pStreamTransport } from './streaming/libp2p-stream-transport.js';
|
|
8
|
+
import { NodeStreamHandler } from './streaming/node-stream-handler.js';
|
|
9
|
+
/**
|
|
10
|
+
* oTool is a mixin that extends the base class and implements the oTool interface
|
|
11
|
+
* @param Base - The base class to extend
|
|
12
|
+
* @returns A new class that extends the base class and implements the oTool interface
|
|
13
|
+
*/
|
|
14
|
+
export class oNodeTool extends oTool(oServerNode) {
|
|
15
|
+
async handleProtocol(address) {
|
|
16
|
+
this.logger.debug('Handling protocol: ' + address.protocol);
|
|
17
|
+
await this.p2pNode.handle(address.protocol, this.handleStream.bind(this), {
|
|
18
|
+
maxInboundStreams: Infinity,
|
|
19
|
+
maxOutboundStreams: Infinity,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
async initialize() {
|
|
23
|
+
await super.initialize();
|
|
24
|
+
await this.handleProtocol(this.address);
|
|
25
|
+
if (this.staticAddress &&
|
|
26
|
+
this.staticAddress?.toString() !== this.address.toString()) {
|
|
27
|
+
await this.handleProtocol(this.staticAddress);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
async handleStream(stream, connection) {
|
|
31
|
+
// CRITICAL: Attach message listener immediately to prevent buffer overflow (libp2p v3)
|
|
32
|
+
// Per libp2p migration guide: "If no message event handler is added, streams will
|
|
33
|
+
// buffer incoming data until a pre-configured limit is reached, after which the stream will be reset."
|
|
34
|
+
const messageHandler = async (event) => {
|
|
35
|
+
if (!event.data) {
|
|
36
|
+
this.logger.warn('Malformed event data');
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const requestConfig = await processStream(event);
|
|
40
|
+
const request = new oRequest(requestConfig);
|
|
41
|
+
let success = true;
|
|
42
|
+
const result = await this.execute(request, stream).catch((error) => {
|
|
43
|
+
this.logger.error('Error executing tool: ', request.toString(), error, typeof error);
|
|
44
|
+
success = false;
|
|
45
|
+
const responseError = error instanceof oError
|
|
46
|
+
? error
|
|
47
|
+
: new oError(oErrorCodes.UNKNOWN, error.message);
|
|
48
|
+
return {
|
|
49
|
+
error: responseError.toJSON(),
|
|
50
|
+
};
|
|
51
|
+
});
|
|
52
|
+
// Check if result is a streaming AsyncGenerator
|
|
53
|
+
if (isAsyncGenerator(result)) {
|
|
54
|
+
this.logger.debug('Handling streaming response for: ' + request.method);
|
|
55
|
+
// Create stream transport and handler
|
|
56
|
+
const transport = new Libp2pStreamTransport(stream);
|
|
57
|
+
const streamHandler = new NodeStreamHandler(transport, {
|
|
58
|
+
enableMetrics: true,
|
|
59
|
+
trackSuccessCount: true,
|
|
60
|
+
trackErrorCount: true,
|
|
61
|
+
});
|
|
62
|
+
try {
|
|
63
|
+
// Handle the streaming using the new abstraction
|
|
64
|
+
await streamHandler.handleStream(result, request);
|
|
65
|
+
// Update metrics from the stream handler
|
|
66
|
+
this.metrics.successCount += streamHandler.getSuccessCount();
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
this.logger.error('Error in streaming response: ', error);
|
|
70
|
+
this.metrics.errorCount++;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
// Non-streaming response - original behavior
|
|
75
|
+
if (success) {
|
|
76
|
+
this.metrics.successCount++;
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
this.metrics.errorCount++;
|
|
80
|
+
}
|
|
81
|
+
// compose the response & add the expected connection + request fields
|
|
82
|
+
const response = CoreUtils.buildResponse(request, result, result?.error);
|
|
83
|
+
// add the request method to the response
|
|
84
|
+
await CoreUtils.sendResponse(response, stream);
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
// Attach listener synchronously before any async operations
|
|
88
|
+
stream.addEventListener('message', messageHandler);
|
|
89
|
+
}
|
|
90
|
+
async _tool_identify() {
|
|
91
|
+
return {
|
|
92
|
+
address: this.address.toString(),
|
|
93
|
+
staticAddress: this.staticAddress?.toString(),
|
|
94
|
+
transports: this.transports.map((t) => t.toMultiaddr().toString()),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
async _tool_child_register(request) {
|
|
98
|
+
this.logger.debug('Child register: ', request.params);
|
|
99
|
+
const { address, transports } = request.params;
|
|
100
|
+
const childAddress = new oNodeAddress(address, transports.map((t) => new oNodeTransport(t)));
|
|
101
|
+
// Add child to hierarchy
|
|
102
|
+
this.hierarchyManager.addChild(childAddress);
|
|
103
|
+
// Emit child joined event
|
|
104
|
+
if (this.notificationManager) {
|
|
105
|
+
this.notificationManager.emit(new ChildJoinedEvent({
|
|
106
|
+
source: this.address,
|
|
107
|
+
childAddress,
|
|
108
|
+
parentAddress: this.address,
|
|
109
|
+
}));
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
message: `Child node registered with parent! ${childAddress.toString()}`,
|
|
113
|
+
parentTransports: this.parentTransports.map((t) => t.toString()),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/router/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"o-node-router.config.d.ts","sourceRoot":"","sources":["../../../../../src/router/interfaces/o-node-router.config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;CAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { oNodeAddress } from '../o-node.address';
|
|
2
|
+
import { oRouterRequest, RouteResponse } from '@olane/o-core';
|
|
3
|
+
export interface oNodeRouterResponse extends RouteResponse {
|
|
4
|
+
nextHopAddress: oNodeAddress;
|
|
5
|
+
targetAddress: oNodeAddress;
|
|
6
|
+
requestOverride?: oRouterRequest;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=o-node-router.response.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"o-node-router.response.d.ts","sourceRoot":"","sources":["../../../../../src/router/interfaces/o-node-router.response.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9D,MAAM,WAAW,mBAAoB,SAAQ,aAAa;IACxD,cAAc,EAAE,YAAY,CAAC;IAC7B,aAAa,EAAE,YAAY,CAAC;IAC5B,eAAe,CAAC,EAAE,cAAc,CAAC;CAClC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Multiaddr } from '@olane/o-config';
|
|
2
|
+
import { oNodeTransport } from './o-node.transport.js';
|
|
3
|
+
import { oAddress } from '@olane/o-core';
|
|
4
|
+
export declare class oNodeAddress extends oAddress {
|
|
5
|
+
readonly value: string;
|
|
6
|
+
transports: oNodeTransport[];
|
|
7
|
+
constructor(value: string, transports?: oNodeTransport[]);
|
|
8
|
+
static fromJSON(json: {
|
|
9
|
+
value: string;
|
|
10
|
+
transports: string[] | Multiaddr[];
|
|
11
|
+
}): oNodeAddress;
|
|
12
|
+
get libp2pTransports(): oNodeTransport[];
|
|
13
|
+
get customTransports(): oNodeTransport[];
|
|
14
|
+
toString(): string;
|
|
15
|
+
toMultiaddr(): Multiaddr;
|
|
16
|
+
static fromMultiaddr(ma: Multiaddr): oAddress;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=o-node.address.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"o-node.address.d.ts","sourceRoot":"","sources":["../../../../src/router/o-node.address.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAa,MAAM,iBAAiB,CAAC;AAEvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAqB,QAAQ,EAAiB,MAAM,eAAe,CAAC;AAE3E,qBAAa,YAAa,SAAQ,QAAQ;aAItB,KAAK,EAAE,MAAM;IAHxB,UAAU,EAAE,cAAc,EAAE,CAAM;gBAGvB,KAAK,EAAE,MAAM,EAC7B,UAAU,GAAE,cAAc,EAAO;IAMnC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;KACpC,GAAG,YAAY;IAShB,IAAI,gBAAgB,IAAI,cAAc,EAAE,CAEvC;IAED,IAAI,gBAAgB,IAAI,cAAc,EAAE,CAEvC;IAED,QAAQ,IAAI,MAAM;IAIlB,WAAW,IAAI,SAAS;IAIxB,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,SAAS,GAAG,QAAQ;CAG9C"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { multiaddr } from '@olane/o-config';
|
|
2
|
+
import { oNodeTransport } from './o-node.transport.js';
|
|
3
|
+
import { oAddress, TransportType } from '@olane/o-core';
|
|
4
|
+
export class oNodeAddress extends oAddress {
|
|
5
|
+
constructor(value, transports = []) {
|
|
6
|
+
super(value);
|
|
7
|
+
this.value = value;
|
|
8
|
+
this.transports = [];
|
|
9
|
+
this.transports = transports;
|
|
10
|
+
}
|
|
11
|
+
static fromJSON(json) {
|
|
12
|
+
return new oNodeAddress(json.value, json.transports.map((t) => new oNodeTransport(t)));
|
|
13
|
+
}
|
|
14
|
+
get libp2pTransports() {
|
|
15
|
+
return this.transports.filter((t) => t.type === TransportType.LIBP2P) || [];
|
|
16
|
+
}
|
|
17
|
+
get customTransports() {
|
|
18
|
+
return this.transports.filter((t) => t.type === TransportType.CUSTOM) || [];
|
|
19
|
+
}
|
|
20
|
+
toString() {
|
|
21
|
+
return this.value;
|
|
22
|
+
}
|
|
23
|
+
toMultiaddr() {
|
|
24
|
+
return multiaddr(this.protocol);
|
|
25
|
+
}
|
|
26
|
+
static fromMultiaddr(ma) {
|
|
27
|
+
return new oAddress(ma.toString().replace('/o/', 'o://'));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { oNodeAddress } from './o-node.address.js';
|
|
2
|
+
import { oRouterRequest, RouteResponse } from '@olane/o-core';
|
|
3
|
+
import type { oNode } from '../o-node.js';
|
|
4
|
+
import { oToolRouter } from '@olane/o-tool';
|
|
5
|
+
export declare class oNodeRouter extends oToolRouter {
|
|
6
|
+
private routingPolicy;
|
|
7
|
+
constructor();
|
|
8
|
+
/**
|
|
9
|
+
* Forwards a request to the specified address via libp2p transport.
|
|
10
|
+
* Handles self-routing (local execution) and destination detection.
|
|
11
|
+
*
|
|
12
|
+
* @param address The next hop address to forward to
|
|
13
|
+
* @param request The router request to forward
|
|
14
|
+
* @param node The current node context
|
|
15
|
+
* @returns The response from the forwarded request
|
|
16
|
+
*/
|
|
17
|
+
protected forward(address: oNodeAddress, request: oRouterRequest, node: oNode): Promise<any>;
|
|
18
|
+
/**
|
|
19
|
+
* Executes a request locally when routing to self.
|
|
20
|
+
*/
|
|
21
|
+
private executeSelfRouting;
|
|
22
|
+
/**
|
|
23
|
+
* Checks if the next hop is the final destination address.
|
|
24
|
+
*/
|
|
25
|
+
private isDestinationAddress;
|
|
26
|
+
/**
|
|
27
|
+
* Unwraps the routing envelope when we've reached the destination.
|
|
28
|
+
*/
|
|
29
|
+
private unwrapDestinationRequest;
|
|
30
|
+
/**
|
|
31
|
+
* Dials a remote node and transmits the request via libp2p.
|
|
32
|
+
*/
|
|
33
|
+
private dialAndTransmit;
|
|
34
|
+
/**
|
|
35
|
+
* Translates an address to determine the next hop and target addresses.
|
|
36
|
+
* First checks routing policy for external routing, then applies resolver chain.
|
|
37
|
+
*/
|
|
38
|
+
translate(address: oNodeAddress, node: oNode): Promise<RouteResponse>;
|
|
39
|
+
/**
|
|
40
|
+
* Determines if an address is internal to this node's hierarchy.
|
|
41
|
+
* Delegates to the routing policy for the decision.
|
|
42
|
+
*/
|
|
43
|
+
isInternal(addressWithTransports: oNodeAddress, node: oNode): boolean;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=o-node.router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"o-node.router.d.ts","sourceRoot":"","sources":["../../../../src/router/o-node.router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAML,cAAc,EACd,aAAa,EACd,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAK5C,qBAAa,WAAY,SAAQ,WAAW;IAC1C,OAAO,CAAC,aAAa,CAAqB;;IAO1C;;;;;;;;OAQG;cACa,OAAO,CACrB,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,KAAK,GACV,OAAO,CAAC,GAAG,CAAC;IA0Bf;;OAEG;YACW,kBAAkB;IAgBhC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAS5B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAUhC;;OAEG;YACW,eAAe;IA2B7B;;;OAGG;IACG,SAAS,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC;IAyB3E;;;OAGG;IACH,UAAU,CAAC,qBAAqB,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,GAAG,OAAO;CAGtE"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { oAddress, oError, oErrorCodes, oRequest, } from '@olane/o-core';
|
|
2
|
+
import { oToolRouter } from '@olane/o-tool';
|
|
3
|
+
import { oNodeConnection } from '../connection/o-node-connection.js';
|
|
4
|
+
import { oNodeRoutingPolicy } from './o-node.routing-policy.js';
|
|
5
|
+
export class oNodeRouter extends oToolRouter {
|
|
6
|
+
constructor() {
|
|
7
|
+
super();
|
|
8
|
+
this.routingPolicy = new oNodeRoutingPolicy();
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Forwards a request to the specified address via libp2p transport.
|
|
12
|
+
* Handles self-routing (local execution) and destination detection.
|
|
13
|
+
*
|
|
14
|
+
* @param address The next hop address to forward to
|
|
15
|
+
* @param request The router request to forward
|
|
16
|
+
* @param node The current node context
|
|
17
|
+
* @returns The response from the forwarded request
|
|
18
|
+
*/
|
|
19
|
+
async forward(address, request, node) {
|
|
20
|
+
if (!request.stream) {
|
|
21
|
+
throw new oError(oErrorCodes.INVALID_REQUEST, 'Stream is required');
|
|
22
|
+
}
|
|
23
|
+
let nextHopRequest = new oRequest({
|
|
24
|
+
method: request.method,
|
|
25
|
+
params: request.params,
|
|
26
|
+
id: request.id,
|
|
27
|
+
});
|
|
28
|
+
// Handle self-routing: execute locally instead of dialing
|
|
29
|
+
if (this.routingPolicy.isSelfAddress(address, node)) {
|
|
30
|
+
return this.executeSelfRouting(request, node);
|
|
31
|
+
}
|
|
32
|
+
// Check if we've reached the final destination
|
|
33
|
+
const isDestination = this.isDestinationAddress(address, request);
|
|
34
|
+
if (isDestination) {
|
|
35
|
+
nextHopRequest = this.unwrapDestinationRequest(request);
|
|
36
|
+
}
|
|
37
|
+
// Dial and transmit to remote node
|
|
38
|
+
return this.dialAndTransmit(address, nextHopRequest, node);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Executes a request locally when routing to self.
|
|
42
|
+
*/
|
|
43
|
+
async executeSelfRouting(request, node) {
|
|
44
|
+
const { payload } = request.params;
|
|
45
|
+
const params = payload.params;
|
|
46
|
+
const localRequest = new oRequest({
|
|
47
|
+
method: payload.method,
|
|
48
|
+
params: { ...params },
|
|
49
|
+
id: request.id,
|
|
50
|
+
});
|
|
51
|
+
const result = await node.execute(localRequest);
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Checks if the next hop is the final destination address.
|
|
56
|
+
*/
|
|
57
|
+
isDestinationAddress(address, request) {
|
|
58
|
+
return address
|
|
59
|
+
?.toStaticAddress()
|
|
60
|
+
.equals(new oAddress(request?.params?.address).toStaticAddress());
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Unwraps the routing envelope when we've reached the destination.
|
|
64
|
+
*/
|
|
65
|
+
unwrapDestinationRequest(request) {
|
|
66
|
+
const { payload } = request.params;
|
|
67
|
+
const params = payload.params;
|
|
68
|
+
return new oRequest({
|
|
69
|
+
method: payload.method,
|
|
70
|
+
params: { ...params },
|
|
71
|
+
id: request.id,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Dials a remote node and transmits the request via libp2p.
|
|
76
|
+
*/
|
|
77
|
+
async dialAndTransmit(address, request, node) {
|
|
78
|
+
try {
|
|
79
|
+
const connection = await node.p2pNode.dial(address.libp2pTransports.map((t) => t.toMultiaddr()));
|
|
80
|
+
const nodeConnection = new oNodeConnection({
|
|
81
|
+
p2pConnection: connection,
|
|
82
|
+
nextHopAddress: address,
|
|
83
|
+
address: node.address,
|
|
84
|
+
callerAddress: node.address,
|
|
85
|
+
});
|
|
86
|
+
const response = await nodeConnection.transmit(request);
|
|
87
|
+
return response.result.data;
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
if (error?.name === 'UnsupportedProtocolError') {
|
|
91
|
+
throw new oError(oErrorCodes.NOT_FOUND, 'Address not found');
|
|
92
|
+
}
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Translates an address to determine the next hop and target addresses.
|
|
98
|
+
* First checks routing policy for external routing, then applies resolver chain.
|
|
99
|
+
*/
|
|
100
|
+
async translate(address, node) {
|
|
101
|
+
// Check if external routing is needed
|
|
102
|
+
const externalRoute = this.routingPolicy.getExternalRoutingStrategy(address, node);
|
|
103
|
+
if (externalRoute) {
|
|
104
|
+
return externalRoute;
|
|
105
|
+
}
|
|
106
|
+
// Apply resolver chain for internal routing
|
|
107
|
+
const { nextHopAddress, targetAddress, requestOverride } = await this.addressResolution.resolve({
|
|
108
|
+
address,
|
|
109
|
+
node,
|
|
110
|
+
targetAddress: address,
|
|
111
|
+
});
|
|
112
|
+
return {
|
|
113
|
+
nextHopAddress,
|
|
114
|
+
targetAddress: targetAddress,
|
|
115
|
+
requestOverride,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Determines if an address is internal to this node's hierarchy.
|
|
120
|
+
* Delegates to the routing policy for the decision.
|
|
121
|
+
*/
|
|
122
|
+
isInternal(addressWithTransports, node) {
|
|
123
|
+
return this.routingPolicy.isInternalAddress(addressWithTransports, node);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { oAddress, oRoutingPolicy, RouteResponse } from '@olane/o-core';
|
|
2
|
+
import type { oNode } from '../o-node.js';
|
|
3
|
+
/**
|
|
4
|
+
* Routing policy implementation for oNode that handles internal/external routing decisions
|
|
5
|
+
* and leader-based routing strategies.
|
|
6
|
+
*/
|
|
7
|
+
export declare class oNodeRoutingPolicy extends oRoutingPolicy {
|
|
8
|
+
/**
|
|
9
|
+
* Determines if an address is internal to the current node's hierarchy.
|
|
10
|
+
* An address is considered internal if:
|
|
11
|
+
* 1. It doesn't have leader references, OR
|
|
12
|
+
* 2. Its leader references match our known leaders
|
|
13
|
+
*
|
|
14
|
+
* @param address The address to check
|
|
15
|
+
* @param node The current node context
|
|
16
|
+
* @returns True if the address is internal to this hierarchy
|
|
17
|
+
*/
|
|
18
|
+
isInternalAddress(address: oAddress, node: oNode): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Determines the routing strategy for external addresses.
|
|
21
|
+
* External addresses are routed to the leader of the external OS using
|
|
22
|
+
* the address's libp2p transports.
|
|
23
|
+
*
|
|
24
|
+
* @param address The address to evaluate
|
|
25
|
+
* @param node The current node context
|
|
26
|
+
* @returns RouteResponse if external routing is needed, null if internal
|
|
27
|
+
*/
|
|
28
|
+
getExternalRoutingStrategy(address: oAddress, node: oNode): RouteResponse | null;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=o-node.routing-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"o-node.routing-policy.d.ts","sourceRoot":"","sources":["../../../../src/router/o-node.routing-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAG1C;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,cAAc;IACpD;;;;;;;;;OASG;IACH,iBAAiB,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,GAAG,OAAO;IAuB1D;;;;;;;;OAQG;IACH,0BAA0B,CACxB,OAAO,EAAE,QAAQ,EACjB,IAAI,EAAE,KAAK,GACV,aAAa,GAAG,IAAI;CAmBxB"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { oAddress, oRoutingPolicy } from '@olane/o-core';
|
|
2
|
+
import { oNodeAddress } from './o-node.address.js';
|
|
3
|
+
/**
|
|
4
|
+
* Routing policy implementation for oNode that handles internal/external routing decisions
|
|
5
|
+
* and leader-based routing strategies.
|
|
6
|
+
*/
|
|
7
|
+
export class oNodeRoutingPolicy extends oRoutingPolicy {
|
|
8
|
+
/**
|
|
9
|
+
* Determines if an address is internal to the current node's hierarchy.
|
|
10
|
+
* An address is considered internal if:
|
|
11
|
+
* 1. It doesn't have leader references, OR
|
|
12
|
+
* 2. Its leader references match our known leaders
|
|
13
|
+
*
|
|
14
|
+
* @param address The address to check
|
|
15
|
+
* @param node The current node context
|
|
16
|
+
* @returns True if the address is internal to this hierarchy
|
|
17
|
+
*/
|
|
18
|
+
isInternalAddress(address, node) {
|
|
19
|
+
const nodeAddress = address;
|
|
20
|
+
// if we are trying to connect to a parent, it's internal
|
|
21
|
+
if (node.hierarchyManager.parents.some((p) => p.equals(address))) {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
if (nodeAddress.paths.indexOf(oAddress.leader().paths) !== -1 && // if the address has a leader
|
|
25
|
+
nodeAddress.libp2pTransports?.length > 0) {
|
|
26
|
+
// transports are provided, let's see if they match our known leaders
|
|
27
|
+
const isLeaderRef = nodeAddress.toString() === oAddress.leader().toString();
|
|
28
|
+
const isOurLeaderRef = node.address.equals(nodeAddress) ||
|
|
29
|
+
node.hierarchyManager.leaders.some((l) => l.equals(nodeAddress));
|
|
30
|
+
return isLeaderRef || isOurLeaderRef;
|
|
31
|
+
}
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Determines the routing strategy for external addresses.
|
|
36
|
+
* External addresses are routed to the leader of the external OS using
|
|
37
|
+
* the address's libp2p transports.
|
|
38
|
+
*
|
|
39
|
+
* @param address The address to evaluate
|
|
40
|
+
* @param node The current node context
|
|
41
|
+
* @returns RouteResponse if external routing is needed, null if internal
|
|
42
|
+
*/
|
|
43
|
+
getExternalRoutingStrategy(address, node) {
|
|
44
|
+
const nodeAddress = address;
|
|
45
|
+
const isInternal = this.isInternalAddress(address, node);
|
|
46
|
+
if (!isInternal) {
|
|
47
|
+
// external address, so we need to route
|
|
48
|
+
this.logger.debug('Address is external, routing...', nodeAddress);
|
|
49
|
+
// route to leader of external OS
|
|
50
|
+
return {
|
|
51
|
+
nextHopAddress: new oNodeAddress(oAddress.leader().toString(), nodeAddress.libp2pTransports),
|
|
52
|
+
targetAddress: nodeAddress,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Multiaddr } from '@olane/o-config';
|
|
2
|
+
import { oTransport, TransportType } from '@olane/o-core';
|
|
3
|
+
export declare class oNodeTransport extends oTransport {
|
|
4
|
+
readonly type: TransportType;
|
|
5
|
+
value: Multiaddr | string;
|
|
6
|
+
constructor(value: Multiaddr | string);
|
|
7
|
+
toMultiaddr(): Multiaddr;
|
|
8
|
+
toString(): string;
|
|
9
|
+
toPeerId(): string;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=o-node.transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"o-node.transport.d.ts","sourceRoot":"","sources":["../../../../src/router/o-node.transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE1D,qBAAa,cAAe,SAAQ,UAAU;IAC5C,SAAgB,IAAI,EAAE,aAAa,CAAwB;IACpD,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC;gBAErB,KAAK,EAAE,SAAS,GAAG,MAAM;IAKrC,WAAW,IAAI,SAAS;IAIxB,QAAQ,IAAI,MAAM;IAIlB,QAAQ,IAAI,MAAM;CAGnB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { multiaddr } from '@olane/o-config';
|
|
2
|
+
import { oTransport, TransportType } from '@olane/o-core';
|
|
3
|
+
export class oNodeTransport extends oTransport {
|
|
4
|
+
constructor(value) {
|
|
5
|
+
super(value);
|
|
6
|
+
this.type = TransportType.LIBP2P;
|
|
7
|
+
this.value = value;
|
|
8
|
+
}
|
|
9
|
+
toMultiaddr() {
|
|
10
|
+
return multiaddr(this.toString());
|
|
11
|
+
}
|
|
12
|
+
toString() {
|
|
13
|
+
return this.value.toString();
|
|
14
|
+
}
|
|
15
|
+
toPeerId() {
|
|
16
|
+
return this.value.toString().split('/p2p/')[1];
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/router/resolvers/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sCAAsC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { oAddress, oAddressResolver, oTransport, ResolveRequest, RouteResponse } from '@olane/o-core';
|
|
2
|
+
export declare class oLeaderResolverFallback extends oAddressResolver {
|
|
3
|
+
protected readonly address: oAddress;
|
|
4
|
+
constructor(address: oAddress);
|
|
5
|
+
get customTransports(): oTransport[];
|
|
6
|
+
resolve(request: ResolveRequest): Promise<RouteResponse>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=o-node.leader-resolver-fallback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"o-node.leader-resolver-fallback.d.ts","sourceRoot":"","sources":["../../../../../src/router/resolvers/o-node.leader-resolver-fallback.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,gBAAgB,EAEhB,UAAU,EACV,cAAc,EAEd,aAAa,EAEd,MAAM,eAAe,CAAC;AAIvB,qBAAa,uBAAwB,SAAQ,gBAAgB;IAC/C,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ;gBAAjB,OAAO,EAAE,QAAQ;IAIhD,IAAI,gBAAgB,IAAI,UAAU,EAAE,CAEnC;IAEK,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;CA4B/D"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { oAddressResolver, oCustomTransport, } from '@olane/o-core';
|
|
2
|
+
export class oLeaderResolverFallback extends oAddressResolver {
|
|
3
|
+
constructor(address) {
|
|
4
|
+
super(address);
|
|
5
|
+
this.address = address;
|
|
6
|
+
}
|
|
7
|
+
get customTransports() {
|
|
8
|
+
return [new oCustomTransport('/fallback/leader')];
|
|
9
|
+
}
|
|
10
|
+
async resolve(request) {
|
|
11
|
+
const { address, node, request: resolveRequest, targetAddress } = request;
|
|
12
|
+
// check to see if something odd was attempted where the leader transports were applied to a different address
|
|
13
|
+
if (node.leader &&
|
|
14
|
+
address.transports.some((t) => node.leader?.transports.includes(t))) {
|
|
15
|
+
return {
|
|
16
|
+
nextHopAddress: node.leader,
|
|
17
|
+
targetAddress: targetAddress,
|
|
18
|
+
requestOverride: resolveRequest,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
// if already has transports, return the address
|
|
22
|
+
if (address.transports.length > 0) {
|
|
23
|
+
return {
|
|
24
|
+
nextHopAddress: address,
|
|
25
|
+
targetAddress: targetAddress,
|
|
26
|
+
requestOverride: resolveRequest,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
nextHopAddress: node.leader,
|
|
31
|
+
targetAddress: targetAddress,
|
|
32
|
+
requestOverride: resolveRequest,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { oAddressResolver, TransportType } from '@olane/o-core';
|
|
2
|
+
import { oNodeAddress } from '../o-node.address.js';
|
|
3
|
+
import { oNodeRouterResponse } from '../interfaces/o-node-router.response.js';
|
|
4
|
+
import { ResolveRequest } from '@olane/o-core';
|
|
5
|
+
export declare class oNodeResolver extends oAddressResolver {
|
|
6
|
+
protected readonly address: oNodeAddress;
|
|
7
|
+
constructor(address: oNodeAddress);
|
|
8
|
+
get supportedTransports(): TransportType[];
|
|
9
|
+
resolve(routeRequest: ResolveRequest): Promise<oNodeRouterResponse>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=o-node.resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"o-node.resolver.d.ts","sourceRoot":"","sources":["../../../../../src/router/resolvers/o-node.resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAEhB,aAAa,EAEd,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,qBAAa,aAAc,SAAQ,gBAAgB;IACrC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,YAAY;gBAArB,OAAO,EAAE,YAAY;IAIpD,IAAI,mBAAmB,IAAI,aAAa,EAAE,CAEzC;IAEK,OAAO,CAAC,YAAY,EAAE,cAAc,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAsC1E"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { oAddressResolver, TransportType, } from '@olane/o-core';
|
|
2
|
+
import { oNodeAddress } from '../o-node.address.js';
|
|
3
|
+
export class oNodeResolver extends oAddressResolver {
|
|
4
|
+
constructor(address) {
|
|
5
|
+
super(address);
|
|
6
|
+
this.address = address;
|
|
7
|
+
}
|
|
8
|
+
get supportedTransports() {
|
|
9
|
+
return [TransportType.LIBP2P];
|
|
10
|
+
}
|
|
11
|
+
async resolve(routeRequest) {
|
|
12
|
+
const { address, node, request, targetAddress } = routeRequest;
|
|
13
|
+
// get the next node & check for child address existence
|
|
14
|
+
const remainingPath = targetAddress.paths.replace(node.address.paths + '/', '');
|
|
15
|
+
// ensure this is going down in the hierarchy
|
|
16
|
+
if (remainingPath === targetAddress.paths && node.isLeader === false) {
|
|
17
|
+
return {
|
|
18
|
+
nextHopAddress: address,
|
|
19
|
+
targetAddress: targetAddress,
|
|
20
|
+
requestOverride: request,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
// next term resolver
|
|
24
|
+
const parts = remainingPath.split('/');
|
|
25
|
+
const nextNode = new oNodeAddress(`o://${parts.shift()}`);
|
|
26
|
+
const childAddress = node?.hierarchyManager.getChild(nextNode);
|
|
27
|
+
// get the child address from hierarchy (which includes transports)
|
|
28
|
+
if (childAddress) {
|
|
29
|
+
return {
|
|
30
|
+
nextHopAddress: childAddress,
|
|
31
|
+
targetAddress: targetAddress,
|
|
32
|
+
requestOverride: request,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
nextHopAddress: address,
|
|
37
|
+
targetAddress: targetAddress,
|
|
38
|
+
requestOverride: request,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|