@olane/o-node 0.7.1
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/README.md +1024 -0
- package/dist/src/connection/index.d.ts +5 -0
- package/dist/src/connection/index.d.ts.map +1 -0
- package/dist/src/connection/index.js +4 -0
- package/dist/src/connection/interfaces/o-node-connection-manager.config.d.ts +6 -0
- package/dist/src/connection/interfaces/o-node-connection-manager.config.d.ts.map +1 -0
- package/dist/src/connection/interfaces/o-node-connection-manager.config.js +1 -0
- package/dist/src/connection/interfaces/o-node-connection.config.d.ts +6 -0
- package/dist/src/connection/interfaces/o-node-connection.config.d.ts.map +1 -0
- package/dist/src/connection/interfaces/o-node-connection.config.js +1 -0
- package/dist/src/connection/o-node-connection.d.ts +13 -0
- package/dist/src/connection/o-node-connection.d.ts.map +1 -0
- package/dist/src/connection/o-node-connection.js +51 -0
- package/dist/src/connection/o-node-connection.manager.d.ts +17 -0
- package/dist/src/connection/o-node-connection.manager.d.ts.map +1 -0
- package/dist/src/connection/o-node-connection.manager.js +68 -0
- package/dist/src/index.d.ts +10 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +9 -0
- package/dist/src/interfaces/o-node.config.d.ts +7 -0
- package/dist/src/interfaces/o-node.config.d.ts.map +1 -0
- package/dist/src/interfaces/o-node.config.js +1 -0
- package/dist/src/interfaces/o-node.tool-config.d.ts +4 -0
- package/dist/src/interfaces/o-node.tool-config.d.ts.map +1 -0
- package/dist/src/interfaces/o-node.tool-config.js +1 -0
- package/dist/src/lib/network-activity.lib.d.ts +1 -0
- package/dist/src/lib/network-activity.lib.d.ts.map +1 -0
- package/dist/src/lib/network-activity.lib.js +34 -0
- package/dist/src/nodes/client.node.d.ts +7 -0
- package/dist/src/nodes/client.node.d.ts.map +1 -0
- package/dist/src/nodes/client.node.js +16 -0
- package/dist/src/nodes/index.d.ts +4 -0
- package/dist/src/nodes/index.d.ts.map +1 -0
- package/dist/src/nodes/index.js +3 -0
- package/dist/src/nodes/server.node.d.ts +7 -0
- package/dist/src/nodes/server.node.d.ts.map +1 -0
- package/dist/src/nodes/server.node.js +20 -0
- package/dist/src/nodes/websocket.node.d.ts +7 -0
- package/dist/src/nodes/websocket.node.d.ts.map +1 -0
- package/dist/src/nodes/websocket.node.js +18 -0
- package/dist/src/o-node.d.ts +42 -0
- package/dist/src/o-node.d.ts.map +1 -0
- package/dist/src/o-node.hierarchy-manager.d.ts +15 -0
- package/dist/src/o-node.hierarchy-manager.d.ts.map +1 -0
- package/dist/src/o-node.hierarchy-manager.js +15 -0
- package/dist/src/o-node.js +242 -0
- package/dist/src/o-node.tool.d.ts +16 -0
- package/dist/src/o-node.tool.d.ts.map +1 -0
- package/dist/src/o-node.tool.js +48 -0
- package/dist/src/router/index.d.ts +6 -0
- package/dist/src/router/index.d.ts.map +1 -0
- package/dist/src/router/index.js +5 -0
- package/dist/src/router/interfaces/o-node-router.config.d.ts +3 -0
- package/dist/src/router/interfaces/o-node-router.config.d.ts.map +1 -0
- package/dist/src/router/interfaces/o-node-router.config.js +1 -0
- package/dist/src/router/interfaces/o-node-router.response.d.ts +8 -0
- package/dist/src/router/interfaces/o-node-router.response.d.ts.map +1 -0
- package/dist/src/router/interfaces/o-node-router.response.js +1 -0
- package/dist/src/router/o-node.address.d.ts +18 -0
- package/dist/src/router/o-node.address.d.ts.map +1 -0
- package/dist/src/router/o-node.address.js +29 -0
- package/dist/src/router/o-node.router.d.ts +12 -0
- package/dist/src/router/o-node.router.d.ts.map +1 -0
- package/dist/src/router/o-node.router.js +109 -0
- package/dist/src/router/o-node.transport.d.ts +11 -0
- package/dist/src/router/o-node.transport.d.ts.map +1 -0
- package/dist/src/router/o-node.transport.js +18 -0
- package/dist/src/router/resolvers/index.d.ts +4 -0
- package/dist/src/router/resolvers/index.d.ts.map +1 -0
- package/dist/src/router/resolvers/index.js +3 -0
- package/dist/src/router/resolvers/o-node.child-resolver.d.ts +11 -0
- package/dist/src/router/resolvers/o-node.child-resolver.d.ts.map +1 -0
- package/dist/src/router/resolvers/o-node.child-resolver.js +58 -0
- package/dist/src/router/resolvers/o-node.leader-resolver-fallback.d.ts +8 -0
- package/dist/src/router/resolvers/o-node.leader-resolver-fallback.d.ts.map +1 -0
- package/dist/src/router/resolvers/o-node.leader-resolver-fallback.js +35 -0
- package/dist/src/router/resolvers/o-node.resolver.d.ts +11 -0
- package/dist/src/router/resolvers/o-node.resolver.d.ts.map +1 -0
- package/dist/src/router/resolvers/o-node.resolver.js +41 -0
- package/dist/src/router/resolvers/o-node.search-resolver.d.ts +8 -0
- package/dist/src/router/resolvers/o-node.search-resolver.d.ts.map +1 -0
- package/dist/src/router/resolvers/o-node.search-resolver.js +60 -0
- package/dist/src/router/route.request.d.ts +14 -0
- package/dist/src/router/route.request.d.ts.map +1 -0
- package/dist/src/router/route.request.js +1 -0
- package/dist/src/utils/network.utils.d.ts +20 -0
- package/dist/src/utils/network.utils.d.ts.map +1 -0
- package/dist/src/utils/network.utils.js +74 -0
- package/dist/test/o-node.spec.d.ts +2 -0
- package/dist/test/o-node.spec.d.ts.map +1 -0
- package/dist/test/o-node.spec.js +20 -0
- package/package.json +68 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { oAddressResolver, TransportType, } from '@olane/o-core';
|
|
2
|
+
export class oNodeChildResolver extends oAddressResolver {
|
|
3
|
+
constructor(address) {
|
|
4
|
+
super(address);
|
|
5
|
+
this.address = address;
|
|
6
|
+
}
|
|
7
|
+
get supportedTransports() {
|
|
8
|
+
return [TransportType.LIBP2P];
|
|
9
|
+
}
|
|
10
|
+
async resolve(routeRequest) {
|
|
11
|
+
const { address, node, request } = routeRequest;
|
|
12
|
+
if (!node) {
|
|
13
|
+
return {
|
|
14
|
+
nextHopAddress: address,
|
|
15
|
+
targetAddress: address,
|
|
16
|
+
requestOverride: request,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
// if we are the same address, return the address
|
|
20
|
+
if (address.toStaticAddress().equals(node.address.toStaticAddress())) {
|
|
21
|
+
return {
|
|
22
|
+
nextHopAddress: node.address,
|
|
23
|
+
targetAddress: node.address,
|
|
24
|
+
requestOverride: request,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
// get the next node & check for child address existence
|
|
28
|
+
const remainingPath = address.protocol.replace(node.address.protocol + '/', '');
|
|
29
|
+
// ensure this is going down in the hierarchy
|
|
30
|
+
if (remainingPath === address.protocol && node.isLeader === false) {
|
|
31
|
+
return {
|
|
32
|
+
nextHopAddress: node.address,
|
|
33
|
+
targetAddress: address,
|
|
34
|
+
requestOverride: request,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
// static resolver
|
|
38
|
+
this.logger.debug(`[${node?.address}]: Next node: ${address.toString()}`);
|
|
39
|
+
const childAddress = node?.hierarchyManager.getChild(address);
|
|
40
|
+
this.logger.debug(`[${node?.address}]: Children: ${node?.hierarchyManager.children.map((c) => c.toString()).join(', ')}`);
|
|
41
|
+
this.logger.debug(`[${node?.address}]: Resolving address: ${address.toString()} and child address: ${childAddress?.toString()}`);
|
|
42
|
+
this.logger.debug('Child transports: ' +
|
|
43
|
+
childAddress?.transports.map((t) => t.toString()).join(', '));
|
|
44
|
+
// get the child address from hierarchy (which includes transports)
|
|
45
|
+
if (childAddress) {
|
|
46
|
+
return {
|
|
47
|
+
nextHopAddress: childAddress,
|
|
48
|
+
targetAddress: address,
|
|
49
|
+
requestOverride: request,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
nextHopAddress: address,
|
|
54
|
+
targetAddress: address,
|
|
55
|
+
requestOverride: request,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { oAddress, oAddressResolver, oTransport, ResolveRequest, RouteResponse } from '@olane/o-core';
|
|
2
|
+
export declare class oSearchResolver 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.search-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"o-node.search-resolver.d.ts","sourceRoot":"","sources":["../../../../src/router/resolvers/o-node.search-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,gBAAgB,EAEhB,UAAU,EACV,cAAc,EAEd,aAAa,EAEd,MAAM,eAAe,CAAC;AAGvB,qBAAa,eAAgB,SAAQ,gBAAgB;IACvC,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;CAiE/D"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { oAddress, oAddressResolver, oCustomTransport, RestrictedAddresses, } from '@olane/o-core';
|
|
2
|
+
import { oNodeTransport } from '../o-node.transport.js';
|
|
3
|
+
export class oSearchResolver extends oAddressResolver {
|
|
4
|
+
constructor(address) {
|
|
5
|
+
super(address);
|
|
6
|
+
this.address = address;
|
|
7
|
+
}
|
|
8
|
+
get customTransports() {
|
|
9
|
+
return [new oCustomTransport('/search')];
|
|
10
|
+
}
|
|
11
|
+
async resolve(request) {
|
|
12
|
+
const { address, node, request: resolveRequest, targetAddress } = request;
|
|
13
|
+
if (address.transports.length > 0) {
|
|
14
|
+
return {
|
|
15
|
+
nextHopAddress: address,
|
|
16
|
+
targetAddress: targetAddress,
|
|
17
|
+
requestOverride: resolveRequest,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
// search the leader registry for the address
|
|
21
|
+
const extraParams = address
|
|
22
|
+
.toString()
|
|
23
|
+
.replace(address.toRootAddress().toString(), '');
|
|
24
|
+
const params = {
|
|
25
|
+
staticAddress: address.toRootAddress().toString(),
|
|
26
|
+
address: address.toString(),
|
|
27
|
+
};
|
|
28
|
+
const registrySearchResults = await node.use(new oAddress(RestrictedAddresses.REGISTRY), {
|
|
29
|
+
method: 'search',
|
|
30
|
+
params: params,
|
|
31
|
+
});
|
|
32
|
+
// if there are results, return the first one
|
|
33
|
+
const registrySearchResultsArray = registrySearchResults.result.data.filter(
|
|
34
|
+
// filter out the items that may cause infinite looping
|
|
35
|
+
(result) => result.staticAddress !== RestrictedAddresses.REGISTRY &&
|
|
36
|
+
result.address !== node.address);
|
|
37
|
+
if (registrySearchResultsArray.length > 0) {
|
|
38
|
+
const registrySearchResult = registrySearchResultsArray[0];
|
|
39
|
+
// we know the final destination, so let's return it + the next hop
|
|
40
|
+
const targetAddress = new oAddress(registrySearchResult.address + extraParams);
|
|
41
|
+
const nextHopAddress = oAddress.next(node.address, targetAddress);
|
|
42
|
+
const targetTransports = registrySearchResult.transports.map((t) => new oNodeTransport(t.value));
|
|
43
|
+
const childAddress = node?.hierarchyManager.getChild(nextHopAddress);
|
|
44
|
+
nextHopAddress.setTransports(nextHopAddress.value === RestrictedAddresses.LEADER
|
|
45
|
+
? node.leader?.transports
|
|
46
|
+
: childAddress?.transports || targetTransports);
|
|
47
|
+
targetAddress.setTransports(targetTransports);
|
|
48
|
+
return {
|
|
49
|
+
nextHopAddress: nextHopAddress,
|
|
50
|
+
targetAddress: targetAddress,
|
|
51
|
+
requestOverride: resolveRequest,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
nextHopAddress: address,
|
|
56
|
+
targetAddress: targetAddress,
|
|
57
|
+
requestOverride: resolveRequest,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { RequestParams } from '@olane/o-protocol';
|
|
2
|
+
import { oRequest } from '@olane/o-core';
|
|
3
|
+
import { Stream } from '@olane/o-config';
|
|
4
|
+
export interface RouteRequest extends oRequest {
|
|
5
|
+
stream: Stream;
|
|
6
|
+
params: RequestParams & {
|
|
7
|
+
address: string;
|
|
8
|
+
payload: {
|
|
9
|
+
method: string;
|
|
10
|
+
params: RequestParams;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=route.request.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.request.d.ts","sourceRoot":"","sources":["../../../src/router/route.request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,MAAM,WAAW,YAAa,SAAQ,QAAQ;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,aAAa,GAAG;QACtB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE;YACP,MAAM,EAAE,MAAM,CAAC;YACf,MAAM,EAAE,aAAa,CAAC;SACvB,CAAC;KACH,CAAC;CACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Libp2p, Multiaddr } from '@olane/o-config';
|
|
2
|
+
import { oObject } from '@olane/o-core';
|
|
3
|
+
import { CID } from 'multiformats';
|
|
4
|
+
import { oNodeAddress } from '../router/o-node.address.js';
|
|
5
|
+
export declare class NetworkUtils extends oObject {
|
|
6
|
+
static findProviders(p2pNode: Libp2p, cid: CID): Promise<{
|
|
7
|
+
transports: Multiaddr[];
|
|
8
|
+
staticAddress: string;
|
|
9
|
+
absoluteAddress: string;
|
|
10
|
+
}>;
|
|
11
|
+
static findNode(p2pNode: Libp2p, address: oNodeAddress): Promise<{
|
|
12
|
+
transports: Multiaddr[];
|
|
13
|
+
staticAddress: string;
|
|
14
|
+
absoluteAddress: string;
|
|
15
|
+
}>;
|
|
16
|
+
static advertiseValueToNetwork(value: CID, p2pNode: Libp2p): Promise<void>;
|
|
17
|
+
static dhtProvide(value: CID, p2pNode: Libp2p): Promise<void>;
|
|
18
|
+
static advertiseToNetwork(address: oNodeAddress, staticAddress: oNodeAddress, p2pNode: Libp2p): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=network.utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.utils.d.ts","sourceRoot":"","sources":["../../../src/utils/network.utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3D,qBAAa,YAAa,SAAQ,OAAO;WACnB,aAAa,CAC/B,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,GAAG,GACP,OAAO,CAAC;QACT,UAAU,EAAE,SAAS,EAAE,CAAC;QACxB,aAAa,EAAE,MAAM,CAAC;QACtB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;WA2BkB,QAAQ,CAC1B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC;QACT,UAAU,EAAE,SAAS,EAAE,CAAC;QACxB,aAAa,EAAE,MAAM,CAAC;QACtB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;WAiBkB,uBAAuB,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM;WAgBnD,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM;WAYtC,kBAAkB,CACpC,OAAO,EAAE,YAAY,EACrB,aAAa,EAAE,YAAY,EAC3B,OAAO,EAAE,MAAM;CAoClB"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { oObject } from '@olane/o-core';
|
|
2
|
+
import { oNodeAddress } from '../router/o-node.address.js';
|
|
3
|
+
export class NetworkUtils extends oObject {
|
|
4
|
+
static async findProviders(p2pNode, cid) {
|
|
5
|
+
let peer = null;
|
|
6
|
+
let multiaddrs = [];
|
|
7
|
+
for await (const event of p2pNode.services.dht.findProviders(cid)) {
|
|
8
|
+
// Look for events that contain actual provider information
|
|
9
|
+
if (event.name === 'PEER_RESPONSE') {
|
|
10
|
+
if (event.providers?.length === 0) {
|
|
11
|
+
NetworkUtils.log('No providers found');
|
|
12
|
+
break;
|
|
13
|
+
}
|
|
14
|
+
peer = event.providers[0].id;
|
|
15
|
+
multiaddrs = event.providers[0].multiaddrs;
|
|
16
|
+
break;
|
|
17
|
+
}
|
|
18
|
+
if (event.name === 'PATH_ENDED' || event.name === 'QUERY_ERROR') {
|
|
19
|
+
break;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
transports: multiaddrs,
|
|
24
|
+
staticAddress: '',
|
|
25
|
+
absoluteAddress: '',
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
static async findNode(p2pNode, address) {
|
|
29
|
+
const cid = await address.toCID();
|
|
30
|
+
return await Promise.race([
|
|
31
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Content routing provide timeout')), 5000)),
|
|
32
|
+
this.findProviders(p2pNode, cid),
|
|
33
|
+
]);
|
|
34
|
+
}
|
|
35
|
+
static async advertiseValueToNetwork(value, p2pNode) {
|
|
36
|
+
NetworkUtils.log('Advertising value to network: ', value.toString());
|
|
37
|
+
const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error('Advertise Content routing provide timeout')), 5000));
|
|
38
|
+
await Promise.race([
|
|
39
|
+
NetworkUtils.dhtProvide(value, p2pNode),
|
|
40
|
+
timeoutPromise,
|
|
41
|
+
]);
|
|
42
|
+
NetworkUtils.log('Advertise complete!');
|
|
43
|
+
}
|
|
44
|
+
static async dhtProvide(value, p2pNode) {
|
|
45
|
+
for await (const event of p2pNode.services.dht.provide(value)) {
|
|
46
|
+
if (event.name === 'PATH_ENDED' ||
|
|
47
|
+
event.name === 'QUERY_ERROR' ||
|
|
48
|
+
event.name === 'PEER_RESPONSE') {
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
static async advertiseToNetwork(address, staticAddress, p2pNode) {
|
|
54
|
+
NetworkUtils.log('Advertising to network our static and absolute addresses...');
|
|
55
|
+
// advertise the absolute address to the network with timeout
|
|
56
|
+
const add = new oNodeAddress(address.toString());
|
|
57
|
+
const absoluteAddressCid = await add.toCID();
|
|
58
|
+
// Add timeout to prevent hanging
|
|
59
|
+
NetworkUtils.advertiseValueToNetwork(absoluteAddressCid, p2pNode)
|
|
60
|
+
.then((d) => {
|
|
61
|
+
NetworkUtils.log(`${address.toString()} - Successfully advertised absolute address`);
|
|
62
|
+
})
|
|
63
|
+
.catch((error) => {
|
|
64
|
+
NetworkUtils.log(`${address.toString()} - Failed to advertise absolute address (this is normal for isolated nodes):`, error.message);
|
|
65
|
+
});
|
|
66
|
+
// advertise the static address to the network with timeout
|
|
67
|
+
const staticAdd = new oNodeAddress(staticAddress.toString());
|
|
68
|
+
const staticAddressCid = await staticAdd.toCID();
|
|
69
|
+
// Add timeout to prevent hanging
|
|
70
|
+
NetworkUtils.advertiseValueToNetwork(staticAddressCid, p2pNode).catch((error) => {
|
|
71
|
+
NetworkUtils.log('Failed to advertise absolute address (this is normal for isolated nodes):', error.message);
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"o-node.spec.d.ts","sourceRoot":"","sources":["../../test/o-node.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { NodeState } from '@olane/o-core';
|
|
2
|
+
import { expect } from 'chai';
|
|
3
|
+
import { oNode } from '../src/index.js';
|
|
4
|
+
import { oNodeAddress } from '../src/router/o-node.address.js';
|
|
5
|
+
describe('in-process @memory', () => {
|
|
6
|
+
it('should be able to start a single node with no leader', async () => {
|
|
7
|
+
const node = new oNode({
|
|
8
|
+
address: new oNodeAddress('o://test'),
|
|
9
|
+
leader: null,
|
|
10
|
+
parent: null,
|
|
11
|
+
});
|
|
12
|
+
await node.start();
|
|
13
|
+
expect(node.state).to.equal(NodeState.RUNNING);
|
|
14
|
+
const transports = node.transports;
|
|
15
|
+
// expect(transports.length).to.equal(1);
|
|
16
|
+
// expect(transports[0].toString()).to.contain('/memory');
|
|
17
|
+
await node.stop();
|
|
18
|
+
expect(node.state).to.equal(NodeState.STOPPED);
|
|
19
|
+
});
|
|
20
|
+
});
|
package/package.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@olane/o-node",
|
|
3
|
+
"version": "0.7.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "dist/src/index.js",
|
|
6
|
+
"types": "dist/src/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/src/index.d.ts",
|
|
10
|
+
"default": "./dist/src/index.js"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist/**/*",
|
|
15
|
+
"README.md",
|
|
16
|
+
"LICENSE"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"test": "aegir test",
|
|
20
|
+
"test:node": "aegir test -t node",
|
|
21
|
+
"test:browser": "aegir test -t browser",
|
|
22
|
+
"dev": "DEBUG=o-protocol:* npx tsx src/tests/index.ts",
|
|
23
|
+
"build": "tsc",
|
|
24
|
+
"deep:clean": "rm -rf node_modules && rm package-lock.json",
|
|
25
|
+
"start:prod": "node dist/index.js",
|
|
26
|
+
"prepublishOnly": "npm run build",
|
|
27
|
+
"update:lib": "npm install @olane/o-core@latest",
|
|
28
|
+
"update:peers": "npm install @olane/o-core@latest @olane/o-config@latest @olane/o-protocol@latest @olane/o-tool@latest --save-peer",
|
|
29
|
+
"lint": "eslint src/**/*.ts"
|
|
30
|
+
},
|
|
31
|
+
"repository": {
|
|
32
|
+
"type": "git",
|
|
33
|
+
"url": "git+https://github.com/olane-labs/olane.git"
|
|
34
|
+
},
|
|
35
|
+
"author": "oLane Inc.",
|
|
36
|
+
"license": "ISC",
|
|
37
|
+
"description": "oLane p2p node used to host agentic functionality",
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@eslint/eslintrc": "^3.3.1",
|
|
40
|
+
"@eslint/js": "^9.29.0",
|
|
41
|
+
"@tsconfig/node20": "^20.1.6",
|
|
42
|
+
"@types/jest": "^30.0.0",
|
|
43
|
+
"@typescript-eslint/eslint-plugin": "^8.34.1",
|
|
44
|
+
"@typescript-eslint/parser": "^8.34.1",
|
|
45
|
+
"aegir": "^47.0.21",
|
|
46
|
+
"eslint": "^9.29.0",
|
|
47
|
+
"eslint-config-prettier": "^10.1.6",
|
|
48
|
+
"eslint-plugin-prettier": "^5.5.0",
|
|
49
|
+
"globals": "^16.2.0",
|
|
50
|
+
"jest": "^30.0.0",
|
|
51
|
+
"prettier": "^3.5.3",
|
|
52
|
+
"ts-jest": "^29.4.0",
|
|
53
|
+
"ts-node": "^10.9.2",
|
|
54
|
+
"tsconfig-paths": "^4.2.0",
|
|
55
|
+
"tsx": "^4.20.3",
|
|
56
|
+
"typescript": "5.4.5"
|
|
57
|
+
},
|
|
58
|
+
"peerDependencies": {
|
|
59
|
+
"@olane/o-config": "^0.7.0",
|
|
60
|
+
"@olane/o-core": "^0.7.0",
|
|
61
|
+
"@olane/o-protocol": "^0.7.0",
|
|
62
|
+
"@olane/o-tool": "^0.7.0"
|
|
63
|
+
},
|
|
64
|
+
"dependencies": {
|
|
65
|
+
"debug": "^4.4.1",
|
|
66
|
+
"dotenv": "^16.5.0"
|
|
67
|
+
}
|
|
68
|
+
}
|