@olane/o-node 0.7.12 → 0.7.13-alpha.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 (57) hide show
  1. package/dist/src/connection/interfaces/o-node-connection-manager.config.d.ts +1 -0
  2. package/dist/src/connection/interfaces/o-node-connection-manager.config.d.ts.map +1 -1
  3. package/dist/src/connection/o-node-connection.d.ts +0 -1
  4. package/dist/src/connection/o-node-connection.d.ts.map +1 -1
  5. package/dist/src/connection/o-node-connection.js +0 -8
  6. package/dist/src/connection/o-node-connection.manager.d.ts +33 -4
  7. package/dist/src/connection/o-node-connection.manager.d.ts.map +1 -1
  8. package/dist/src/connection/o-node-connection.manager.js +153 -44
  9. package/dist/src/connection/stream-handler.d.ts.map +1 -1
  10. package/dist/src/connection/stream-handler.js +0 -2
  11. package/dist/src/managers/o-connection-heartbeat.manager.d.ts.map +1 -1
  12. package/dist/src/managers/o-connection-heartbeat.manager.js +15 -1
  13. package/dist/src/managers/o-reconnection.manager.d.ts.map +1 -1
  14. package/dist/src/managers/o-reconnection.manager.js +12 -7
  15. package/dist/src/o-node.d.ts +5 -0
  16. package/dist/src/o-node.d.ts.map +1 -1
  17. package/dist/src/o-node.js +46 -8
  18. package/dist/src/o-node.tool.d.ts.map +1 -1
  19. package/dist/src/o-node.tool.js +5 -0
  20. package/dist/src/router/o-node.router.d.ts.map +1 -1
  21. package/dist/src/router/o-node.router.js +16 -6
  22. package/dist/src/router/o-node.routing-policy.d.ts.map +1 -1
  23. package/dist/src/router/o-node.routing-policy.js +4 -0
  24. package/dist/test/connection-management.spec.d.ts +2 -0
  25. package/dist/test/connection-management.spec.d.ts.map +1 -0
  26. package/dist/test/connection-management.spec.js +370 -0
  27. package/dist/test/helpers/connection-spy.d.ts +124 -0
  28. package/dist/test/helpers/connection-spy.d.ts.map +1 -0
  29. package/dist/test/helpers/connection-spy.js +229 -0
  30. package/dist/test/helpers/index.d.ts +6 -0
  31. package/dist/test/helpers/index.d.ts.map +1 -0
  32. package/dist/test/helpers/index.js +12 -0
  33. package/dist/test/helpers/network-builder.d.ts +109 -0
  34. package/dist/test/helpers/network-builder.d.ts.map +1 -0
  35. package/dist/test/helpers/network-builder.js +309 -0
  36. package/dist/test/helpers/simple-node-builder.d.ts +50 -0
  37. package/dist/test/helpers/simple-node-builder.d.ts.map +1 -0
  38. package/dist/test/helpers/simple-node-builder.js +66 -0
  39. package/dist/test/helpers/test-environment.d.ts +140 -0
  40. package/dist/test/helpers/test-environment.d.ts.map +1 -0
  41. package/dist/test/helpers/test-environment.js +184 -0
  42. package/dist/test/helpers/test-node.tool.d.ts +31 -0
  43. package/dist/test/helpers/test-node.tool.d.ts.map +1 -1
  44. package/dist/test/helpers/test-node.tool.js +49 -0
  45. package/dist/test/network-communication.spec.d.ts +2 -0
  46. package/dist/test/network-communication.spec.d.ts.map +1 -0
  47. package/dist/test/network-communication.spec.js +256 -0
  48. package/dist/test/o-node.spec.d.ts +2 -0
  49. package/dist/test/o-node.spec.d.ts.map +1 -0
  50. package/dist/test/o-node.spec.js +247 -0
  51. package/dist/test/parent-child-registration.spec.d.ts +2 -0
  52. package/dist/test/parent-child-registration.spec.d.ts.map +1 -0
  53. package/dist/test/parent-child-registration.spec.js +177 -0
  54. package/dist/test/search-resolver.spec.d.ts +2 -0
  55. package/dist/test/search-resolver.spec.d.ts.map +1 -0
  56. package/dist/test/search-resolver.spec.js +648 -0
  57. package/package.json +12 -7
@@ -0,0 +1,177 @@
1
+ import { expect } from 'chai';
2
+ import { TestEnvironment } from './helpers/index.js';
3
+ import { NetworkBuilder } from './helpers/network-builder.js';
4
+ import { NodeState } from '@olane/o-core';
5
+ describe('Parent-Child Registration', () => {
6
+ const env = new TestEnvironment();
7
+ let builder;
8
+ afterEach(async () => {
9
+ if (builder) {
10
+ await builder.cleanup();
11
+ }
12
+ await env.cleanup();
13
+ });
14
+ describe('Basic Registration', () => {
15
+ it('should register child with parent during startup', async () => {
16
+ builder = new NetworkBuilder();
17
+ const leader = await builder.addNode('o://leader');
18
+ await builder.startNode('o://leader');
19
+ const child = await builder.addNode('o://child', 'o://leader');
20
+ await builder.startNode('o://child');
21
+ // Verify child is in parent's hierarchy manager
22
+ const children = leader.getChildren();
23
+ console.log('Leader status:', leader.state);
24
+ expect(children).to.have.lengthOf(1);
25
+ expect(children[0].toString()).to.include('child');
26
+ });
27
+ it('should exchange transports during registration', async () => {
28
+ builder = new NetworkBuilder();
29
+ const leader = await builder.addNode('o://leader');
30
+ await builder.startNode('o://leader');
31
+ const child = await builder.addNode('o://child', 'o://leader');
32
+ // Child should have parent reference but no transports yet
33
+ expect(child.parent).to.exist;
34
+ await builder.startNode('o://child');
35
+ // After registration, child should have parent transports
36
+ expect(child.parent?.libp2pTransports.length).to.be.greaterThan(0);
37
+ // Parent should have child transports
38
+ const children = leader.getChildren();
39
+ expect(children[0].libp2pTransports.length).to.be.greaterThan(0);
40
+ });
41
+ it('should construct nested addresses after registration', async () => {
42
+ builder = new NetworkBuilder();
43
+ const leader = await builder.addNode('o://leader');
44
+ await builder.startNode('o://leader');
45
+ const child = await builder.addNode('o://child', 'o://leader');
46
+ // After registration, address becomes nested
47
+ expect(child.address.toString()).to.include('leader');
48
+ expect(child.address.toString()).to.include('child');
49
+ });
50
+ it('should establish connection during registration', async () => {
51
+ builder = new NetworkBuilder();
52
+ const leader = await builder.addNode('o://leader');
53
+ await builder.startNode('o://leader');
54
+ const child = await builder.addNode('o://child', 'o://leader');
55
+ await builder.startNode('o://child');
56
+ // Wait for registration
57
+ await new Promise((resolve) => setTimeout(resolve, 100));
58
+ // Verify connection exists
59
+ const connections = leader.p2pNode.getConnections();
60
+ expect(connections.length).to.be.greaterThan(0);
61
+ // Child should also have connection to parent
62
+ const childConnections = child.p2pNode.getConnections();
63
+ expect(childConnections.length).to.be.greaterThan(0);
64
+ });
65
+ });
66
+ describe('Multiple Children Registration', () => {
67
+ it('should register multiple children with same parent', async () => {
68
+ builder = new NetworkBuilder();
69
+ const leader = await builder.addNode('o://leader');
70
+ await builder.startNode('o://leader');
71
+ const child1 = await builder.addNode('o://child1', 'o://leader');
72
+ const child2 = await builder.addNode('o://child2', 'o://leader');
73
+ const child3 = await builder.addNode('o://child3', 'o://leader');
74
+ await builder.startNode('o://child1');
75
+ await builder.startNode('o://child2');
76
+ await builder.startNode('o://child3');
77
+ // Wait for all registrations
78
+ await new Promise((resolve) => setTimeout(resolve, 200));
79
+ // Verify all children registered
80
+ const children = leader.getChildren();
81
+ expect(children).to.have.lengthOf(3);
82
+ const childAddresses = children.map((c) => c.toString());
83
+ expect(childAddresses.some((a) => a.includes('child1'))).to.be.true;
84
+ expect(childAddresses.some((a) => a.includes('child2'))).to.be.true;
85
+ expect(childAddresses.some((a) => a.includes('child3'))).to.be.true;
86
+ });
87
+ it('should maintain separate connections for each child', async () => {
88
+ builder = new NetworkBuilder();
89
+ const leader = await builder.addNode('o://leader');
90
+ await builder.startNode('o://leader');
91
+ await builder.addNode('o://child1', 'o://leader');
92
+ await builder.addNode('o://child2', 'o://leader');
93
+ await builder.startNode('o://child1');
94
+ await builder.startNode('o://child2');
95
+ await new Promise((resolve) => setTimeout(resolve, 200));
96
+ // Leader should have multiple connections
97
+ const connections = leader.p2pNode.getConnections();
98
+ expect(connections.length).to.be.greaterThan(1);
99
+ // Each connection should be open
100
+ connections.forEach((conn) => {
101
+ expect(conn.status).to.equal('open');
102
+ });
103
+ });
104
+ });
105
+ describe('Hierarchical Registration', () => {
106
+ it('should register grandchildren through parent', async () => {
107
+ builder = new NetworkBuilder();
108
+ const leader = await builder.addNode('o://leader');
109
+ await builder.startNode('o://leader');
110
+ const parent = await builder.addNode('o://parent', 'o://leader');
111
+ await builder.startNode('o://parent');
112
+ await new Promise((resolve) => setTimeout(resolve, 100));
113
+ const child = await builder.addNode('o://child', 'o://parent');
114
+ await builder.startNode('o://child');
115
+ await new Promise((resolve) => setTimeout(resolve, 100));
116
+ // Child address should be fully nested
117
+ expect(child.address.toString()).to.include('leader');
118
+ expect(child.address.toString()).to.include('parent');
119
+ expect(child.address.toString()).to.include('child');
120
+ });
121
+ it('should maintain hierarchy references', async () => {
122
+ builder = new NetworkBuilder();
123
+ const leader = await builder.addNode('o://leader');
124
+ await builder.startNode('o://leader');
125
+ const parent = await builder.addNode('o://parent', 'o://leader');
126
+ await builder.startNode('o://parent');
127
+ const child = await builder.addNode('o://child', 'o://parent');
128
+ await builder.startNode('o://child');
129
+ await new Promise((resolve) => setTimeout(resolve, 200));
130
+ // Child should know its parent and leader
131
+ expect(child.parent?.toString()).to.include('parent');
132
+ // Parent should know its leader
133
+ expect(parent.parent?.toString()).to.include('leader');
134
+ // Leader should have no parent
135
+ expect(leader.parent).to.be.null;
136
+ });
137
+ });
138
+ describe('Child Disconnection', () => {
139
+ it('should remove child from hierarchy when stopped', async () => {
140
+ builder = new NetworkBuilder();
141
+ const leader = await builder.addNode('o://leader');
142
+ await builder.startNode('o://leader');
143
+ const child = await builder.addNode('o://child', 'o://leader');
144
+ await builder.startNode('o://child');
145
+ await new Promise((resolve) => setTimeout(resolve, 100));
146
+ // Verify child registered
147
+ expect(leader.getChildren()).to.have.lengthOf(1);
148
+ // Stop child
149
+ await builder.stopNode('o://child');
150
+ // Note: Without heartbeat monitoring, parent won't detect disconnection immediately
151
+ // This test verifies the stop mechanism works cleanly
152
+ expect(child.state).to.equal(NodeState.STOPPED);
153
+ });
154
+ it('should handle graceful disconnection of multiple children', async () => {
155
+ builder = new NetworkBuilder();
156
+ const leader = await builder.addNode('o://leader');
157
+ await builder.startNode('o://leader');
158
+ await builder.addNode('o://child1', 'o://leader');
159
+ await builder.addNode('o://child2', 'o://leader');
160
+ await builder.addNode('o://child3', 'o://leader');
161
+ await builder.startNode('o://child1');
162
+ await builder.startNode('o://child2');
163
+ await builder.startNode('o://child3');
164
+ await new Promise((resolve) => setTimeout(resolve, 200));
165
+ // Stop children one by one
166
+ await builder.stopNode('o://child1');
167
+ await builder.stopNode('o://child2');
168
+ await builder.stopNode('o://child3');
169
+ // Leader should remain operational
170
+ const response = await leader.use(leader.address, {
171
+ method: 'get_info',
172
+ params: {},
173
+ });
174
+ expect(response.result.success).to.be.true;
175
+ });
176
+ });
177
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=search-resolver.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-resolver.spec.d.ts","sourceRoot":"","sources":["../../test/search-resolver.spec.ts"],"names":[],"mappings":""}