@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.
Files changed (92) hide show
  1. package/README.md +1024 -0
  2. package/dist/src/connection/index.d.ts +5 -0
  3. package/dist/src/connection/index.d.ts.map +1 -0
  4. package/dist/src/connection/index.js +4 -0
  5. package/dist/src/connection/interfaces/o-node-connection-manager.config.d.ts +6 -0
  6. package/dist/src/connection/interfaces/o-node-connection-manager.config.d.ts.map +1 -0
  7. package/dist/src/connection/interfaces/o-node-connection-manager.config.js +1 -0
  8. package/dist/src/connection/interfaces/o-node-connection.config.d.ts +6 -0
  9. package/dist/src/connection/interfaces/o-node-connection.config.d.ts.map +1 -0
  10. package/dist/src/connection/interfaces/o-node-connection.config.js +1 -0
  11. package/dist/src/connection/o-node-connection.d.ts +13 -0
  12. package/dist/src/connection/o-node-connection.d.ts.map +1 -0
  13. package/dist/src/connection/o-node-connection.js +51 -0
  14. package/dist/src/connection/o-node-connection.manager.d.ts +17 -0
  15. package/dist/src/connection/o-node-connection.manager.d.ts.map +1 -0
  16. package/dist/src/connection/o-node-connection.manager.js +68 -0
  17. package/dist/src/index.d.ts +10 -0
  18. package/dist/src/index.d.ts.map +1 -0
  19. package/dist/src/index.js +9 -0
  20. package/dist/src/interfaces/o-node.config.d.ts +7 -0
  21. package/dist/src/interfaces/o-node.config.d.ts.map +1 -0
  22. package/dist/src/interfaces/o-node.config.js +1 -0
  23. package/dist/src/interfaces/o-node.tool-config.d.ts +4 -0
  24. package/dist/src/interfaces/o-node.tool-config.d.ts.map +1 -0
  25. package/dist/src/interfaces/o-node.tool-config.js +1 -0
  26. package/dist/src/lib/network-activity.lib.d.ts +1 -0
  27. package/dist/src/lib/network-activity.lib.d.ts.map +1 -0
  28. package/dist/src/lib/network-activity.lib.js +34 -0
  29. package/dist/src/nodes/client.node.d.ts +7 -0
  30. package/dist/src/nodes/client.node.d.ts.map +1 -0
  31. package/dist/src/nodes/client.node.js +16 -0
  32. package/dist/src/nodes/index.d.ts +4 -0
  33. package/dist/src/nodes/index.d.ts.map +1 -0
  34. package/dist/src/nodes/index.js +3 -0
  35. package/dist/src/nodes/server.node.d.ts +7 -0
  36. package/dist/src/nodes/server.node.d.ts.map +1 -0
  37. package/dist/src/nodes/server.node.js +20 -0
  38. package/dist/src/nodes/websocket.node.d.ts +7 -0
  39. package/dist/src/nodes/websocket.node.d.ts.map +1 -0
  40. package/dist/src/nodes/websocket.node.js +18 -0
  41. package/dist/src/o-node.d.ts +42 -0
  42. package/dist/src/o-node.d.ts.map +1 -0
  43. package/dist/src/o-node.hierarchy-manager.d.ts +15 -0
  44. package/dist/src/o-node.hierarchy-manager.d.ts.map +1 -0
  45. package/dist/src/o-node.hierarchy-manager.js +15 -0
  46. package/dist/src/o-node.js +242 -0
  47. package/dist/src/o-node.tool.d.ts +16 -0
  48. package/dist/src/o-node.tool.d.ts.map +1 -0
  49. package/dist/src/o-node.tool.js +48 -0
  50. package/dist/src/router/index.d.ts +6 -0
  51. package/dist/src/router/index.d.ts.map +1 -0
  52. package/dist/src/router/index.js +5 -0
  53. package/dist/src/router/interfaces/o-node-router.config.d.ts +3 -0
  54. package/dist/src/router/interfaces/o-node-router.config.d.ts.map +1 -0
  55. package/dist/src/router/interfaces/o-node-router.config.js +1 -0
  56. package/dist/src/router/interfaces/o-node-router.response.d.ts +8 -0
  57. package/dist/src/router/interfaces/o-node-router.response.d.ts.map +1 -0
  58. package/dist/src/router/interfaces/o-node-router.response.js +1 -0
  59. package/dist/src/router/o-node.address.d.ts +18 -0
  60. package/dist/src/router/o-node.address.d.ts.map +1 -0
  61. package/dist/src/router/o-node.address.js +29 -0
  62. package/dist/src/router/o-node.router.d.ts +12 -0
  63. package/dist/src/router/o-node.router.d.ts.map +1 -0
  64. package/dist/src/router/o-node.router.js +109 -0
  65. package/dist/src/router/o-node.transport.d.ts +11 -0
  66. package/dist/src/router/o-node.transport.d.ts.map +1 -0
  67. package/dist/src/router/o-node.transport.js +18 -0
  68. package/dist/src/router/resolvers/index.d.ts +4 -0
  69. package/dist/src/router/resolvers/index.d.ts.map +1 -0
  70. package/dist/src/router/resolvers/index.js +3 -0
  71. package/dist/src/router/resolvers/o-node.child-resolver.d.ts +11 -0
  72. package/dist/src/router/resolvers/o-node.child-resolver.d.ts.map +1 -0
  73. package/dist/src/router/resolvers/o-node.child-resolver.js +58 -0
  74. package/dist/src/router/resolvers/o-node.leader-resolver-fallback.d.ts +8 -0
  75. package/dist/src/router/resolvers/o-node.leader-resolver-fallback.d.ts.map +1 -0
  76. package/dist/src/router/resolvers/o-node.leader-resolver-fallback.js +35 -0
  77. package/dist/src/router/resolvers/o-node.resolver.d.ts +11 -0
  78. package/dist/src/router/resolvers/o-node.resolver.d.ts.map +1 -0
  79. package/dist/src/router/resolvers/o-node.resolver.js +41 -0
  80. package/dist/src/router/resolvers/o-node.search-resolver.d.ts +8 -0
  81. package/dist/src/router/resolvers/o-node.search-resolver.d.ts.map +1 -0
  82. package/dist/src/router/resolvers/o-node.search-resolver.js +60 -0
  83. package/dist/src/router/route.request.d.ts +14 -0
  84. package/dist/src/router/route.request.d.ts.map +1 -0
  85. package/dist/src/router/route.request.js +1 -0
  86. package/dist/src/utils/network.utils.d.ts +20 -0
  87. package/dist/src/utils/network.utils.d.ts.map +1 -0
  88. package/dist/src/utils/network.utils.js +74 -0
  89. package/dist/test/o-node.spec.d.ts +2 -0
  90. package/dist/test/o-node.spec.d.ts.map +1 -0
  91. package/dist/test/o-node.spec.js +20 -0
  92. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=o-node.spec.d.ts.map
@@ -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
+ }