@olane/o-node 0.7.12-alpha.17 → 0.7.12-alpha.19
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/interfaces/i-reconnectable-node.d.ts +1 -0
- package/dist/src/interfaces/i-reconnectable-node.d.ts.map +1 -1
- package/dist/src/managers/o-reconnection.manager.d.ts +1 -0
- package/dist/src/managers/o-reconnection.manager.d.ts.map +1 -1
- package/dist/src/managers/o-reconnection.manager.js +12 -1
- package/dist/src/o-node.d.ts +3 -1
- package/dist/src/o-node.d.ts.map +1 -1
- package/dist/src/o-node.js +36 -14
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i-reconnectable-node.d.ts","sourceRoot":"","sources":["../../../src/interfaces/i-reconnectable-node.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"i-reconnectable-node.d.ts","sourceRoot":"","sources":["../../../src/interfaces/i-reconnectable-node.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,SAAS,EACT,oBAAoB,EAErB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,MAAM,EAAE,WAAW,CAAC;IAEpB;;OAEG;IACH,OAAO,EAAE,YAAY,CAAC;IAEtB;;OAEG;IACH,KAAK,EAAE,SAAS,CAAC;IAEjB;;OAEG;IACH,mBAAmB,EAAE,oBAAoB,CAAC;IAE1C;;OAEG;IACH,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhC;;OAEG;IACH,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1B,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAErC;;OAEG;IACH,GAAG,CACD,OAAO,EAAE,QAAQ,EACjB,IAAI,CAAC,EAAE;QACL,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE;YAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;SAAE,CAAC;QAChC,EAAE,CAAC,EAAE,MAAM,CAAC;KACb,GACA,OAAO,CAAC,GAAG,CAAC,CAAC;CACjB"}
|
|
@@ -27,6 +27,7 @@ export declare class oReconnectionManager extends oObject {
|
|
|
27
27
|
private reconnecting;
|
|
28
28
|
constructor(node: IReconnectableNode, config: ReconnectionConfig);
|
|
29
29
|
private setupEventListeners;
|
|
30
|
+
handleNodeConnected(event: any): Promise<void>;
|
|
30
31
|
private handleConnectionDegraded;
|
|
31
32
|
private handleLeaderDisconnected;
|
|
32
33
|
private handleParentDisconnected;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"o-reconnection.manager.d.ts","sourceRoot":"","sources":["../../../src/managers/o-reconnection.manager.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,
|
|
1
|
+
{"version":3,"file":"o-reconnection.manager.d.ts","sourceRoot":"","sources":["../../../src/managers/o-reconnection.manager.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EASR,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAI3E,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,yBAAyB,EAAE,MAAM,CAAC;IAClC,yBAAyB,EAAE,MAAM,CAAC;CACnC;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,oBAAqB,SAAQ,OAAO;IAI7C,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,MAAM;IAJhB,OAAO,CAAC,YAAY,CAAS;gBAGnB,IAAI,EAAE,kBAAkB,EACxB,MAAM,EAAE,kBAAkB;IAMpC,OAAO,CAAC,mBAAmB;IAyBrB,mBAAmB,CAAC,KAAK,EAAE,GAAG;YAatB,wBAAwB;YAaxB,wBAAwB;YAexB,wBAAwB;IAehC,mBAAmB;YAgDX,2BAA2B;YAiB3B,iBAAiB;IAkB/B;;;OAGG;YACW,yBAAyB;IAiFvC;;OAEG;IACG,yBAAyB;IAkG/B,OAAO,CAAC,yBAAyB;IAajC,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,qBAAqB;IAK7B,OAAO,CAAC,KAAK;CAGd"}
|
|
@@ -28,6 +28,17 @@ export class oReconnectionManager extends oObject {
|
|
|
28
28
|
this.node.notificationManager.on('leader:disconnected', this.handleLeaderDisconnected.bind(this));
|
|
29
29
|
// Listen for connection degradation as early warning
|
|
30
30
|
this.node.notificationManager.on('connection:degraded', this.handleConnectionDegraded.bind(this));
|
|
31
|
+
this.node.notificationManager.on('node:connected', this.handleNodeConnected.bind(this));
|
|
32
|
+
}
|
|
33
|
+
async handleNodeConnected(event) {
|
|
34
|
+
const connectedEvent = event;
|
|
35
|
+
if (connectedEvent.nodeAddress.toString() === oAddress.leader().toString()) {
|
|
36
|
+
// the leader is back online, let's re-register & tell sub-graphs to re-register
|
|
37
|
+
await this.node.useSelf({
|
|
38
|
+
method: 'register_leader',
|
|
39
|
+
params: {},
|
|
40
|
+
});
|
|
41
|
+
}
|
|
31
42
|
}
|
|
32
43
|
async handleConnectionDegraded(event) {
|
|
33
44
|
const degradedEvent = event;
|
|
@@ -185,7 +196,7 @@ export class oReconnectionManager extends oObject {
|
|
|
185
196
|
this.logger.info(`Parent discovery attempt ${attempt} (elapsed: ${elapsedMinutes}m)`);
|
|
186
197
|
try {
|
|
187
198
|
// Query registry for parent by its known address
|
|
188
|
-
const response = await this.node.use(
|
|
199
|
+
const response = await this.node.use(oAddress.registry(), {
|
|
189
200
|
method: 'find_available_parent',
|
|
190
201
|
params: {
|
|
191
202
|
parentAddress: this.node.config.parent?.toString(),
|
package/dist/src/o-node.d.ts
CHANGED
|
@@ -34,6 +34,7 @@ export declare class oNode extends oToolBase {
|
|
|
34
34
|
get transports(): oNodeTransport[];
|
|
35
35
|
unregister(): Promise<void>;
|
|
36
36
|
registerParent(): Promise<void>;
|
|
37
|
+
registerLeader(): Promise<void>;
|
|
37
38
|
register(): Promise<void>;
|
|
38
39
|
extractMethod(address: oNodeAddress): string;
|
|
39
40
|
start(): Promise<void>;
|
|
@@ -47,7 +48,8 @@ export declare class oNode extends oToolBase {
|
|
|
47
48
|
connect(nextHopAddress: oNodeAddress, targetAddress: oNodeAddress): Promise<oNodeConnection>;
|
|
48
49
|
initConnectionManager(): Promise<void>;
|
|
49
50
|
initReconnectionManager(): Promise<void>;
|
|
50
|
-
|
|
51
|
+
hookInitializeFinished(): Promise<void>;
|
|
52
|
+
hookStartFinished(): Promise<void>;
|
|
51
53
|
initialize(): Promise<void>;
|
|
52
54
|
/**
|
|
53
55
|
* Override use() to wrap leader/registry requests with retry logic
|
package/dist/src/o-node.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"o-node.d.ts","sourceRoot":"","sources":["../../src/o-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,MAAM,EACN,YAAY,EACb,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAIL,QAAQ,EACR,QAAQ,EAER,oBAAoB,EACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC;AAGnF,OAAO,EAAmB,SAAS,EAAE,MAAM,eAAe,CAAC;AAI3D,OAAO,EAAE,2BAA2B,EAAE,MAAM,8CAA8C,CAAC;AAC3F,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAEzE,qBAAa,KAAM,SAAQ,SAAS;IAC3B,MAAM,EAAG,MAAM,CAAC;IAChB,OAAO,EAAG,MAAM,CAAC;IACjB,OAAO,EAAG,YAAY,CAAC;IACvB,MAAM,EAAE,WAAW,CAAC;IACpB,iBAAiB,EAAG,sBAAsB,CAAC;IAC3C,gBAAgB,EAAG,qBAAqB,CAAC;IACzC,0BAA0B,CAAC,EAAE,2BAA2B,CAAC;IACzD,mBAAmB,CAAC,EAAE,oBAAoB,CAAC;IAC3C,oBAAoB,EAAG,oBAAoB,CAAC;IACnD,SAAS,CAAC,WAAW,EAAE,OAAO,CAAS;gBAE3B,MAAM,EAAE,WAAW;IAK/B,IAAI,MAAM,IAAI,YAAY,GAAG,IAAI,CAEhC;IAED,IAAI,aAAa,IAAI,YAAY,CAKhC;IAED,IAAI,YAAY,IAAI,MAAM,GAAG,IAAI,CAOhC;IAED,mBAAmB,IAAI,GAAG,EAAE;IAItB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IASvC,SAAS,CAAC,yBAAyB,IAAI,oBAAoB;IAQ3D,IAAI,aAAa,IAAI,YAAY,CAEhC;IAED,IAAI,gBAAgB,IAAI,cAAc,EAAE,CAEvC;IAED,IAAI,UAAU,IAAI,cAAc,EAAE,CAIjC;IAEK,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAsD3B,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"o-node.d.ts","sourceRoot":"","sources":["../../src/o-node.ts"],"names":[],"mappings":"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"}
|
package/dist/src/o-node.js
CHANGED
|
@@ -116,6 +116,7 @@ export class oNode extends oToolBase {
|
|
|
116
116
|
this.parent.setTransports(this.leader?.libp2pTransports || []);
|
|
117
117
|
}
|
|
118
118
|
else {
|
|
119
|
+
this.logger.debug('Waiting for parent and reconnecting...');
|
|
119
120
|
await this.reconnectionManager?.waitForParentAndReconnect();
|
|
120
121
|
}
|
|
121
122
|
}
|
|
@@ -134,6 +135,20 @@ export class oNode extends oToolBase {
|
|
|
134
135
|
});
|
|
135
136
|
}
|
|
136
137
|
}
|
|
138
|
+
async registerLeader() {
|
|
139
|
+
const address = oAddress.registry();
|
|
140
|
+
const params = {
|
|
141
|
+
method: 'commit',
|
|
142
|
+
params: {
|
|
143
|
+
peerId: this.peerId.toString(),
|
|
144
|
+
address: this.address.toString(),
|
|
145
|
+
protocols: this.p2pNode.getProtocols(),
|
|
146
|
+
transports: this.transports,
|
|
147
|
+
staticAddress: this.staticAddress.toString(),
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
await this.use(address, params);
|
|
151
|
+
}
|
|
137
152
|
async register() {
|
|
138
153
|
if (this.type === NodeType.LEADER) {
|
|
139
154
|
this.logger.debug('Skipping registration, node is leader');
|
|
@@ -154,18 +169,7 @@ export class oNode extends oToolBase {
|
|
|
154
169
|
this.logger.debug('Registering node with leader...');
|
|
155
170
|
}
|
|
156
171
|
await this.registerParent();
|
|
157
|
-
|
|
158
|
-
const params = {
|
|
159
|
-
method: 'commit',
|
|
160
|
-
params: {
|
|
161
|
-
peerId: this.peerId.toString(),
|
|
162
|
-
address: this.address.toString(),
|
|
163
|
-
protocols: this.p2pNode.getProtocols(),
|
|
164
|
-
transports: this.transports,
|
|
165
|
-
staticAddress: this.staticAddress.toString(),
|
|
166
|
-
},
|
|
167
|
-
};
|
|
168
|
-
await this.use(address, params);
|
|
172
|
+
await this.registerLeader();
|
|
169
173
|
this.logger.debug('Registration successful');
|
|
170
174
|
}
|
|
171
175
|
extractMethod(address) {
|
|
@@ -226,12 +230,28 @@ export class oNode extends oToolBase {
|
|
|
226
230
|
// ];
|
|
227
231
|
// // let's make sure we only allow communication through the parent transports
|
|
228
232
|
params.connectionGater = {
|
|
233
|
+
denyDialPeer: (peerId) => {
|
|
234
|
+
// we can call the leader
|
|
235
|
+
if (this.config.leader?.libp2pTransports.some((t) => t.toPeerId() === peerId.toString())) {
|
|
236
|
+
return false;
|
|
237
|
+
}
|
|
238
|
+
// we can call our parent
|
|
239
|
+
if (this.parentPeerId === peerId.toString()) {
|
|
240
|
+
return false;
|
|
241
|
+
}
|
|
242
|
+
// we can call our children
|
|
243
|
+
if (this.hierarchyManager.children.some((c) => c.libp2pTransports.some((t) => t.toPeerId() === peerId.toString()))) {
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
return true;
|
|
247
|
+
},
|
|
229
248
|
// who can call us?
|
|
230
249
|
denyInboundEncryptedConnection: (peerId, maConn) => {
|
|
231
250
|
// deny all inbound connections unless they are from a parent transport
|
|
232
251
|
if (this.parentPeerId === peerId.toString()) {
|
|
233
252
|
return false;
|
|
234
253
|
}
|
|
254
|
+
// allow connections from children (for ping)
|
|
235
255
|
if (this.hierarchyManager.children.some((c) => c.libp2pTransports.some((t) => t.toPeerId() === peerId.toString()))) {
|
|
236
256
|
return false;
|
|
237
257
|
}
|
|
@@ -301,7 +321,8 @@ export class oNode extends oToolBase {
|
|
|
301
321
|
});
|
|
302
322
|
}
|
|
303
323
|
}
|
|
304
|
-
async
|
|
324
|
+
async hookInitializeFinished() { }
|
|
325
|
+
async hookStartFinished() {
|
|
305
326
|
// Initialize connection heartbeat manager
|
|
306
327
|
this.connectionHeartbeatManager = new oConnectionHeartbeatManager(this, {
|
|
307
328
|
enabled: this.config.connectionHeartbeat?.enabled ?? true,
|
|
@@ -327,7 +348,7 @@ export class oNode extends oToolBase {
|
|
|
327
348
|
await this.initializeRouter();
|
|
328
349
|
// need to wait until our libpp2 node is initialized before calling super.initialize
|
|
329
350
|
await super.initialize();
|
|
330
|
-
this.logger.debug('Node
|
|
351
|
+
this.logger.debug('Node initializedddd!', this.transports.map((t) => t.toString()));
|
|
331
352
|
this.address.setTransports(this.transports);
|
|
332
353
|
this.peerId = this.p2pNode.peerId;
|
|
333
354
|
// initialize connection manager
|
|
@@ -359,6 +380,7 @@ export class oNode extends oToolBase {
|
|
|
359
380
|
}
|
|
360
381
|
// initialize reconnection manager
|
|
361
382
|
await this.initReconnectionManager();
|
|
383
|
+
await this.hookInitializeFinished();
|
|
362
384
|
}
|
|
363
385
|
/**
|
|
364
386
|
* Override use() to wrap leader/registry requests with retry logic
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@olane/o-node",
|
|
3
|
-
"version": "0.7.12-alpha.
|
|
3
|
+
"version": "0.7.12-alpha.19",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/src/index.js",
|
|
6
6
|
"types": "dist/src/index.d.ts",
|
|
@@ -54,12 +54,12 @@
|
|
|
54
54
|
"typescript": "5.4.5"
|
|
55
55
|
},
|
|
56
56
|
"dependencies": {
|
|
57
|
-
"@olane/o-config": "0.7.12-alpha.
|
|
58
|
-
"@olane/o-core": "0.7.12-alpha.
|
|
59
|
-
"@olane/o-protocol": "0.7.12-alpha.
|
|
60
|
-
"@olane/o-tool": "0.7.12-alpha.
|
|
57
|
+
"@olane/o-config": "0.7.12-alpha.19",
|
|
58
|
+
"@olane/o-core": "0.7.12-alpha.19",
|
|
59
|
+
"@olane/o-protocol": "0.7.12-alpha.19",
|
|
60
|
+
"@olane/o-tool": "0.7.12-alpha.19",
|
|
61
61
|
"debug": "^4.4.1",
|
|
62
62
|
"dotenv": "^16.5.0"
|
|
63
63
|
},
|
|
64
|
-
"gitHead": "
|
|
64
|
+
"gitHead": "4ec8067e4e2b53232f10e71528d7aecf03c38bb5"
|
|
65
65
|
}
|