@olane/o-node 0.7.13-alpha.0 → 0.7.13-alpha.2
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/src/connection/interfaces/o-node-connection-manager.config.d.ts +1 -0
- package/dist/src/connection/interfaces/o-node-connection-manager.config.d.ts.map +1 -1
- package/dist/src/connection/o-node-connection.d.ts +0 -1
- package/dist/src/connection/o-node-connection.d.ts.map +1 -1
- package/dist/src/connection/o-node-connection.js +0 -8
- package/dist/src/connection/o-node-connection.manager.d.ts +41 -4
- package/dist/src/connection/o-node-connection.manager.d.ts.map +1 -1
- package/dist/src/connection/o-node-connection.manager.js +187 -45
- package/dist/src/connection/stream-handler.d.ts.map +1 -1
- package/dist/src/connection/stream-handler.js +0 -2
- package/dist/src/managers/o-connection-heartbeat.manager.d.ts.map +1 -1
- package/dist/src/managers/o-connection-heartbeat.manager.js +15 -1
- package/dist/src/managers/o-reconnection.manager.d.ts.map +1 -1
- package/dist/src/managers/o-reconnection.manager.js +12 -7
- package/dist/src/o-node.d.ts +19 -0
- package/dist/src/o-node.d.ts.map +1 -1
- package/dist/src/o-node.js +89 -11
- package/dist/src/o-node.tool.d.ts.map +1 -1
- package/dist/src/o-node.tool.js +5 -0
- package/dist/src/router/o-node.router.d.ts.map +1 -1
- package/dist/src/router/o-node.router.js +16 -6
- package/dist/src/router/o-node.routing-policy.d.ts.map +1 -1
- package/dist/src/router/o-node.routing-policy.js +4 -0
- package/dist/test/connection-management.spec.d.ts +2 -0
- package/dist/test/connection-management.spec.d.ts.map +1 -0
- package/dist/test/connection-management.spec.js +370 -0
- package/dist/test/helpers/connection-spy.d.ts +124 -0
- package/dist/test/helpers/connection-spy.d.ts.map +1 -0
- package/dist/test/helpers/connection-spy.js +229 -0
- package/dist/test/helpers/index.d.ts +6 -0
- package/dist/test/helpers/index.d.ts.map +1 -0
- package/dist/test/helpers/index.js +12 -0
- package/dist/test/helpers/network-builder.d.ts +109 -0
- package/dist/test/helpers/network-builder.d.ts.map +1 -0
- package/dist/test/helpers/network-builder.js +309 -0
- package/dist/test/helpers/simple-node-builder.d.ts +50 -0
- package/dist/test/helpers/simple-node-builder.d.ts.map +1 -0
- package/dist/test/helpers/simple-node-builder.js +66 -0
- package/dist/test/helpers/test-environment.d.ts +140 -0
- package/dist/test/helpers/test-environment.d.ts.map +1 -0
- package/dist/test/helpers/test-environment.js +184 -0
- package/dist/test/helpers/test-node.tool.d.ts +31 -0
- package/dist/test/helpers/test-node.tool.d.ts.map +1 -1
- package/dist/test/helpers/test-node.tool.js +49 -0
- package/dist/test/leader-transport-validation.spec.d.ts +2 -0
- package/dist/test/leader-transport-validation.spec.d.ts.map +1 -0
- package/dist/test/leader-transport-validation.spec.js +177 -0
- package/dist/test/network-communication.spec.d.ts +2 -0
- package/dist/test/network-communication.spec.d.ts.map +1 -0
- package/dist/test/network-communication.spec.js +256 -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 +247 -0
- package/dist/test/parent-child-registration.spec.d.ts +2 -0
- package/dist/test/parent-child-registration.spec.d.ts.map +1 -0
- package/dist/test/parent-child-registration.spec.js +177 -0
- package/dist/test/search-resolver.spec.d.ts +2 -0
- package/dist/test/search-resolver.spec.d.ts.map +1 -0
- package/dist/test/search-resolver.spec.js +648 -0
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"search-resolver.spec.d.ts","sourceRoot":"","sources":["../../test/search-resolver.spec.ts"],"names":[],"mappings":""}
|