@olane/o-node 0.7.12-alpha.21 → 0.7.12-alpha.23

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 (175) hide show
  1. package/dist/o-core/src/connection/o-response.d.ts +26 -0
  2. package/dist/o-core/src/connection/o-response.d.ts.map +1 -0
  3. package/dist/o-core/src/connection/o-response.js +45 -0
  4. package/dist/o-core/src/error/enums/codes.error.d.ts +20 -0
  5. package/dist/o-core/src/error/enums/codes.error.d.ts.map +1 -0
  6. package/dist/o-core/src/error/enums/codes.error.js +20 -0
  7. package/dist/o-core/src/error/interfaces/o-error.interface.d.ts +6 -0
  8. package/dist/o-core/src/error/interfaces/o-error.interface.d.ts.map +1 -0
  9. package/dist/o-core/src/error/interfaces/o-error.interface.js +1 -0
  10. package/dist/o-core/src/error/o-error.d.ts +15 -0
  11. package/dist/o-core/src/error/o-error.d.ts.map +1 -0
  12. package/dist/o-core/src/error/o-error.js +27 -0
  13. package/dist/o-core/src/streaming/index.d.ts +11 -0
  14. package/dist/o-core/src/streaming/index.d.ts.map +1 -0
  15. package/dist/o-core/src/streaming/index.js +14 -0
  16. package/dist/o-core/src/streaming/protocol-builder.d.ts +62 -0
  17. package/dist/o-core/src/streaming/protocol-builder.d.ts.map +1 -0
  18. package/dist/o-core/src/streaming/protocol-builder.js +93 -0
  19. package/dist/o-core/src/streaming/stream-config.d.ts +36 -0
  20. package/dist/o-core/src/streaming/stream-config.d.ts.map +1 -0
  21. package/dist/o-core/src/streaming/stream-config.js +19 -0
  22. package/dist/o-core/src/streaming/stream-handler.base.d.ts +85 -0
  23. package/dist/o-core/src/streaming/stream-handler.base.d.ts.map +1 -0
  24. package/dist/o-core/src/streaming/stream-handler.base.js +112 -0
  25. package/dist/o-core/src/streaming/stream-transport.interface.d.ts +61 -0
  26. package/dist/o-core/src/streaming/stream-transport.interface.d.ts.map +1 -0
  27. package/dist/o-core/src/streaming/stream-transport.interface.js +10 -0
  28. package/dist/o-core/src/utils/streaming.utils.d.ts +37 -0
  29. package/dist/o-core/src/utils/streaming.utils.d.ts.map +1 -0
  30. package/dist/o-core/src/utils/streaming.utils.js +71 -0
  31. package/dist/o-node/src/connection/index.d.ts +5 -0
  32. package/dist/o-node/src/connection/index.d.ts.map +1 -0
  33. package/dist/o-node/src/connection/index.js +4 -0
  34. package/dist/o-node/src/connection/interfaces/o-node-connection-manager.config.d.ts +6 -0
  35. package/dist/o-node/src/connection/interfaces/o-node-connection-manager.config.d.ts.map +1 -0
  36. package/dist/o-node/src/connection/interfaces/o-node-connection-manager.config.js +1 -0
  37. package/dist/o-node/src/connection/interfaces/o-node-connection.config.d.ts +6 -0
  38. package/dist/o-node/src/connection/interfaces/o-node-connection.config.d.ts.map +1 -0
  39. package/dist/o-node/src/connection/interfaces/o-node-connection.config.js +1 -0
  40. package/dist/o-node/src/connection/o-node-connection.d.ts +20 -0
  41. package/dist/o-node/src/connection/o-node-connection.d.ts.map +1 -0
  42. package/dist/o-node/src/connection/o-node-connection.js +146 -0
  43. package/dist/o-node/src/connection/o-node-connection.manager.d.ts +19 -0
  44. package/dist/o-node/src/connection/o-node-connection.manager.d.ts.map +1 -0
  45. package/dist/o-node/src/connection/o-node-connection.manager.js +92 -0
  46. package/dist/o-node/src/index.d.ts +10 -0
  47. package/dist/o-node/src/index.d.ts.map +1 -0
  48. package/dist/o-node/src/index.js +9 -0
  49. package/dist/o-node/src/interfaces/i-heartbeatable-node.d.ts +49 -0
  50. package/dist/o-node/src/interfaces/i-heartbeatable-node.d.ts.map +1 -0
  51. package/dist/o-node/src/interfaces/i-heartbeatable-node.js +1 -0
  52. package/dist/o-node/src/interfaces/i-reconnectable-node.d.ts +46 -0
  53. package/dist/o-node/src/interfaces/i-reconnectable-node.d.ts.map +1 -0
  54. package/dist/o-node/src/interfaces/i-reconnectable-node.js +1 -0
  55. package/dist/o-node/src/interfaces/o-node.config.d.ts +66 -0
  56. package/dist/o-node/src/interfaces/o-node.config.d.ts.map +1 -0
  57. package/dist/o-node/src/interfaces/o-node.config.js +1 -0
  58. package/dist/o-node/src/interfaces/o-node.tool-config.d.ts +4 -0
  59. package/dist/o-node/src/interfaces/o-node.tool-config.d.ts.map +1 -0
  60. package/dist/o-node/src/interfaces/o-node.tool-config.js +1 -0
  61. package/dist/o-node/src/lib/network-activity.lib.d.ts +1 -0
  62. package/dist/o-node/src/lib/network-activity.lib.d.ts.map +1 -0
  63. package/dist/o-node/src/lib/network-activity.lib.js +34 -0
  64. package/dist/o-node/src/managers/o-connection-heartbeat.manager.d.ts +62 -0
  65. package/dist/o-node/src/managers/o-connection-heartbeat.manager.d.ts.map +1 -0
  66. package/dist/o-node/src/managers/o-connection-heartbeat.manager.js +213 -0
  67. package/dist/o-node/src/managers/o-reconnection.manager.d.ts +51 -0
  68. package/dist/o-node/src/managers/o-reconnection.manager.d.ts.map +1 -0
  69. package/dist/o-node/src/managers/o-reconnection.manager.js +266 -0
  70. package/dist/o-node/src/nodes/client.node.d.ts +7 -0
  71. package/dist/o-node/src/nodes/client.node.d.ts.map +1 -0
  72. package/dist/o-node/src/nodes/client.node.js +16 -0
  73. package/dist/o-node/src/nodes/index.d.ts +4 -0
  74. package/dist/o-node/src/nodes/index.d.ts.map +1 -0
  75. package/dist/o-node/src/nodes/index.js +3 -0
  76. package/dist/o-node/src/nodes/server.node.d.ts +7 -0
  77. package/dist/o-node/src/nodes/server.node.d.ts.map +1 -0
  78. package/dist/o-node/src/nodes/server.node.js +20 -0
  79. package/dist/o-node/src/nodes/websocket.node.d.ts +7 -0
  80. package/dist/o-node/src/nodes/websocket.node.d.ts.map +1 -0
  81. package/dist/o-node/src/nodes/websocket.node.js +18 -0
  82. package/dist/o-node/src/o-node.d.ts +72 -0
  83. package/dist/o-node/src/o-node.d.ts.map +1 -0
  84. package/dist/o-node/src/o-node.hierarchy-manager.d.ts +15 -0
  85. package/dist/o-node/src/o-node.hierarchy-manager.d.ts.map +1 -0
  86. package/dist/o-node/src/o-node.hierarchy-manager.js +15 -0
  87. package/dist/o-node/src/o-node.js +420 -0
  88. package/dist/o-node/src/o-node.notification-manager.d.ts +52 -0
  89. package/dist/o-node/src/o-node.notification-manager.d.ts.map +1 -0
  90. package/dist/o-node/src/o-node.notification-manager.js +185 -0
  91. package/dist/o-node/src/o-node.tool.d.ts +18 -0
  92. package/dist/o-node/src/o-node.tool.d.ts.map +1 -0
  93. package/dist/o-node/src/o-node.tool.js +116 -0
  94. package/dist/o-node/src/router/index.d.ts +6 -0
  95. package/dist/o-node/src/router/index.d.ts.map +1 -0
  96. package/dist/o-node/src/router/index.js +5 -0
  97. package/dist/o-node/src/router/interfaces/o-node-router.config.d.ts +3 -0
  98. package/dist/o-node/src/router/interfaces/o-node-router.config.d.ts.map +1 -0
  99. package/dist/o-node/src/router/interfaces/o-node-router.config.js +1 -0
  100. package/dist/o-node/src/router/interfaces/o-node-router.response.d.ts +8 -0
  101. package/dist/o-node/src/router/interfaces/o-node-router.response.d.ts.map +1 -0
  102. package/dist/o-node/src/router/interfaces/o-node-router.response.js +1 -0
  103. package/dist/o-node/src/router/o-node.address.d.ts +18 -0
  104. package/dist/o-node/src/router/o-node.address.d.ts.map +1 -0
  105. package/dist/o-node/src/router/o-node.address.js +29 -0
  106. package/dist/o-node/src/router/o-node.router.d.ts +45 -0
  107. package/dist/o-node/src/router/o-node.router.d.ts.map +1 -0
  108. package/dist/o-node/src/router/o-node.router.js +125 -0
  109. package/dist/o-node/src/router/o-node.routing-policy.d.ts +30 -0
  110. package/dist/o-node/src/router/o-node.routing-policy.d.ts.map +1 -0
  111. package/dist/o-node/src/router/o-node.routing-policy.js +57 -0
  112. package/dist/o-node/src/router/o-node.transport.d.ts +11 -0
  113. package/dist/o-node/src/router/o-node.transport.d.ts.map +1 -0
  114. package/dist/o-node/src/router/o-node.transport.js +18 -0
  115. package/dist/o-node/src/router/resolvers/index.d.ts +4 -0
  116. package/dist/o-node/src/router/resolvers/index.d.ts.map +1 -0
  117. package/dist/o-node/src/router/resolvers/index.js +3 -0
  118. package/dist/o-node/src/router/resolvers/o-node.leader-resolver-fallback.d.ts +8 -0
  119. package/dist/o-node/src/router/resolvers/o-node.leader-resolver-fallback.d.ts.map +1 -0
  120. package/dist/o-node/src/router/resolvers/o-node.leader-resolver-fallback.js +35 -0
  121. package/dist/o-node/src/router/resolvers/o-node.resolver.d.ts +11 -0
  122. package/dist/o-node/src/router/resolvers/o-node.resolver.d.ts.map +1 -0
  123. package/dist/o-node/src/router/resolvers/o-node.resolver.js +41 -0
  124. package/dist/o-node/src/router/resolvers/o-node.search-resolver.d.ts +170 -0
  125. package/dist/o-node/src/router/resolvers/o-node.search-resolver.d.ts.map +1 -0
  126. package/dist/o-node/src/router/resolvers/o-node.search-resolver.js +285 -0
  127. package/dist/o-node/src/router/route.request.d.ts +14 -0
  128. package/dist/o-node/src/router/route.request.d.ts.map +1 -0
  129. package/dist/o-node/src/router/route.request.js +1 -0
  130. package/dist/o-node/src/streaming/index.d.ts +10 -0
  131. package/dist/o-node/src/streaming/index.d.ts.map +1 -0
  132. package/dist/o-node/src/streaming/index.js +12 -0
  133. package/dist/o-node/src/streaming/libp2p-stream-transport.d.ts +50 -0
  134. package/dist/o-node/src/streaming/libp2p-stream-transport.d.ts.map +1 -0
  135. package/dist/o-node/src/streaming/libp2p-stream-transport.js +137 -0
  136. package/dist/o-node/src/streaming/node-stream-handler.d.ts +65 -0
  137. package/dist/o-node/src/streaming/node-stream-handler.d.ts.map +1 -0
  138. package/dist/o-node/src/streaming/node-stream-handler.js +101 -0
  139. package/dist/o-node/src/utils/circuit-breaker.d.ts +107 -0
  140. package/dist/o-node/src/utils/circuit-breaker.d.ts.map +1 -0
  141. package/dist/o-node/src/utils/circuit-breaker.js +175 -0
  142. package/dist/o-node/src/utils/circuit-breaker.test.d.ts +2 -0
  143. package/dist/o-node/src/utils/circuit-breaker.test.d.ts.map +1 -0
  144. package/dist/o-node/src/utils/circuit-breaker.test.js +262 -0
  145. package/dist/o-node/src/utils/leader-request-wrapper.d.ts +66 -0
  146. package/dist/o-node/src/utils/leader-request-wrapper.d.ts.map +1 -0
  147. package/dist/o-node/src/utils/leader-request-wrapper.js +160 -0
  148. package/dist/o-node/src/utils/leader-request-wrapper.test.d.ts +1 -0
  149. package/dist/o-node/src/utils/leader-request-wrapper.test.d.ts.map +1 -0
  150. package/dist/o-node/src/utils/leader-request-wrapper.test.js +246 -0
  151. package/dist/o-node/src/utils/network.utils.d.ts +20 -0
  152. package/dist/o-node/src/utils/network.utils.d.ts.map +1 -0
  153. package/dist/o-node/src/utils/network.utils.js +74 -0
  154. package/dist/o-node/test/o-node.spec.d.ts +2 -0
  155. package/dist/o-node/test/o-node.spec.d.ts.map +1 -0
  156. package/dist/o-node/test/o-node.spec.js +20 -0
  157. package/dist/o-node/test/search-resolver.spec.d.ts +2 -0
  158. package/dist/o-node/test/search-resolver.spec.d.ts.map +1 -0
  159. package/dist/o-node/test/search-resolver.spec.js +693 -0
  160. package/dist/src/connection/o-node-connection.d.ts +7 -0
  161. package/dist/src/connection/o-node-connection.d.ts.map +1 -1
  162. package/dist/src/connection/o-node-connection.js +89 -2
  163. package/dist/src/connection/o-node-connection.manager.d.ts +2 -0
  164. package/dist/src/connection/o-node-connection.manager.d.ts.map +1 -1
  165. package/dist/src/connection/o-node-connection.manager.js +5 -1
  166. package/dist/src/interfaces/o-node.config.d.ts +16 -0
  167. package/dist/src/interfaces/o-node.config.d.ts.map +1 -1
  168. package/dist/src/o-node.d.ts +1 -1
  169. package/dist/src/o-node.d.ts.map +1 -1
  170. package/dist/src/o-node.js +5 -1
  171. package/dist/src/o-node.tool.d.ts.map +1 -1
  172. package/dist/src/o-node.tool.js +37 -7
  173. package/dist/src/router/resolvers/o-node.search-resolver.d.ts.map +1 -1
  174. package/dist/src/router/resolvers/o-node.search-resolver.js +10 -3
  175. package/package.json +6 -6
@@ -0,0 +1 @@
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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,66 @@
1
+ import { oCoreConfig } from '@olane/o-core';
2
+ import { oNodeAddress } from '../router/o-node.address.js';
3
+ export interface oNodeConfig extends oCoreConfig {
4
+ leader: oNodeAddress | null;
5
+ parent: oNodeAddress | null;
6
+ /**
7
+ * Connection heartbeat configuration (libp2p-native pings)
8
+ * Detects dead connections via periodic pings using libp2p's ping service
9
+ */
10
+ connectionHeartbeat?: {
11
+ enabled?: boolean;
12
+ intervalMs?: number;
13
+ timeoutMs?: number;
14
+ failureThreshold?: number;
15
+ checkChildren?: boolean;
16
+ checkParent?: boolean;
17
+ checkLeader?: boolean;
18
+ };
19
+ /**
20
+ * Automatic reconnection configuration
21
+ * Handles parent connection failures and attempts to reconnect
22
+ */
23
+ reconnection?: {
24
+ enabled?: boolean;
25
+ maxAttempts?: number;
26
+ baseDelayMs?: number;
27
+ maxDelayMs?: number;
28
+ useLeaderFallback?: boolean;
29
+ parentDiscoveryIntervalMs?: number;
30
+ parentDiscoveryMaxDelayMs?: number;
31
+ };
32
+ /**
33
+ * Leader request retry configuration
34
+ * Handles temporary leader unavailability (healing, maintenance)
35
+ */
36
+ leaderRetry?: {
37
+ enabled?: boolean;
38
+ maxAttempts?: number;
39
+ baseDelayMs?: number;
40
+ maxDelayMs?: number;
41
+ timeoutMs?: number;
42
+ circuitBreaker?: {
43
+ enabled?: boolean;
44
+ failureThreshold?: number;
45
+ openTimeoutMs?: number;
46
+ halfOpenMaxAttempts?: number;
47
+ };
48
+ };
49
+ /**
50
+ * Connection timeout configuration
51
+ * Controls timeouts for stream read and drain operations in connections
52
+ */
53
+ connectionTimeouts?: {
54
+ /**
55
+ * Timeout in milliseconds for reading response data from a stream
56
+ * Default: 120000 (2 minutes)
57
+ */
58
+ readTimeoutMs?: number;
59
+ /**
60
+ * Timeout in milliseconds for waiting for stream buffer to drain when backpressure occurs
61
+ * Default: 30000 (30 seconds)
62
+ */
63
+ drainTimeoutMs?: number;
64
+ };
65
+ }
66
+ //# sourceMappingURL=o-node.config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"o-node.config.d.ts","sourceRoot":"","sources":["../../../../src/interfaces/o-node.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3D,MAAM,WAAW,WAAY,SAAQ,WAAW;IAC9C,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAE5B;;;OAGG;IACH,mBAAmB,CAAC,EAAE;QACpB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,WAAW,CAAC,EAAE,OAAO,CAAC;KACvB,CAAC;IAEF;;;OAGG;IACH,YAAY,CAAC,EAAE;QACb,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,yBAAyB,CAAC,EAAE,MAAM,CAAC;QACnC,yBAAyB,CAAC,EAAE,MAAM,CAAC;KACpC,CAAC;IAEF;;;OAGG;IACH,WAAW,CAAC,EAAE;QACZ,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,cAAc,CAAC,EAAE;YACf,OAAO,CAAC,EAAE,OAAO,CAAC;YAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;YAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;YACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;SAC9B,CAAC;KACH,CAAC;IAEF;;;OAGG;IACH,kBAAkB,CAAC,EAAE;QACnB;;;WAGG;QACH,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB;;;WAGG;QACH,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACH"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,4 @@
1
+ import { oNodeConfig } from './o-node.config';
2
+ export interface oNodeToolConfig extends Omit<oNodeConfig, 'address'> {
3
+ }
4
+ //# sourceMappingURL=o-node.tool-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"o-node.tool-config.d.ts","sourceRoot":"","sources":["../../../../src/interfaces/o-node.tool-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC;CAAG"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=network-activity.lib.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network-activity.lib.d.ts","sourceRoot":"","sources":["../../../../src/lib/network-activity.lib.ts"],"names":[],"mappings":""}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ // import { Libp2p, Libp2pEvents, ServiceFactoryMap } from '@olane/o-config';
3
+ // import { Logger } from '../../core/utils/logger.js';
4
+ // export const NETWORK_ACTIVITY_EVENTS: NetworkActivityEvent[] = [
5
+ // 'peer:connect',
6
+ // 'peer:disconnect',
7
+ // 'peer:update',
8
+ // 'peer:discovery',
9
+ // 'peer:reconnect-failure',
10
+ // 'peer:identify',
11
+ // 'transport:listening',
12
+ // 'transport:close',
13
+ // 'connection:prune',
14
+ // 'connection:open',
15
+ // 'connection:close',
16
+ // 'certificate:provision',
17
+ // 'certificate:renew',
18
+ // ];
19
+ // type NetworkActivityEvent = keyof Libp2pEvents<ServiceFactoryMap>;
20
+ // export class NetworkActivity {
21
+ // constructor(
22
+ // private readonly logger: Logger,
23
+ // private readonly p2pNode: Libp2p,
24
+ // ) {
25
+ // this.setup();
26
+ // }
27
+ // setup() {
28
+ // for (const event of NETWORK_ACTIVITY_EVENTS) {
29
+ // this.p2pNode.addEventListener(event, (evt: any) => {
30
+ // this.logger.debug('Network activity: ', event, evt.detail);
31
+ // });
32
+ // }
33
+ // }
34
+ // }
@@ -0,0 +1,62 @@
1
+ import { oObject } from '@olane/o-core';
2
+ import { oNodeAddress } from '../router/o-node.address.js';
3
+ import { IHeartbeatableNode } from '../interfaces/i-heartbeatable-node.js';
4
+ export interface HeartbeatConfig {
5
+ enabled: boolean;
6
+ intervalMs: number;
7
+ timeoutMs: number;
8
+ failureThreshold: number;
9
+ checkChildren: boolean;
10
+ checkParent: boolean;
11
+ checkLeader: boolean;
12
+ }
13
+ export interface ConnectionHealth {
14
+ address: oNodeAddress;
15
+ peerId: string;
16
+ lastSuccessfulPing: number;
17
+ consecutiveFailures: number;
18
+ averageLatency: number;
19
+ status: 'healthy' | 'degraded' | 'dead';
20
+ }
21
+ /**
22
+ * Connection Heartbeat Manager
23
+ *
24
+ * Uses libp2p's native ping service to detect dead connections early.
25
+ * Continuously pings parent and children to ensure they're alive.
26
+ *
27
+ * How it works:
28
+ * - Every `intervalMs`, pings all tracked connections
29
+ * - If ping fails, increments failure counter
30
+ * - After `failureThreshold` failures, marks connection as dead
31
+ * - Emits events for degraded/recovered/dead connections
32
+ * - Automatically removes dead children from hierarchy
33
+ * - Emits ParentDisconnectedEvent when parent dies (triggers reconnection)
34
+ */
35
+ export declare class oConnectionHeartbeatManager extends oObject {
36
+ private node;
37
+ private config;
38
+ private heartbeatInterval?;
39
+ private healthMap;
40
+ constructor(node: IHeartbeatableNode, config: HeartbeatConfig);
41
+ start(): Promise<void>;
42
+ stop(): Promise<void>;
43
+ private performHeartbeatCycle;
44
+ private doPing;
45
+ private pingTarget;
46
+ private handleConnectionDead;
47
+ private emitConnectionDegradedEvent;
48
+ private emitConnectionRecoveredEvent;
49
+ /**
50
+ * Get current health status of all connections
51
+ */
52
+ getHealthStatus(): ConnectionHealth[];
53
+ /**
54
+ * Get health status for specific address
55
+ */
56
+ getConnectionHealth(address: oNodeAddress): ConnectionHealth | undefined;
57
+ /**
58
+ * Get current configuration
59
+ */
60
+ getConfig(): HeartbeatConfig;
61
+ }
62
+ //# sourceMappingURL=o-connection-heartbeat.manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"o-connection-heartbeat.manager.d.ts","sourceRoot":"","sources":["../../../../src/managers/o-connection-heartbeat.manager.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EAOR,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAE3E,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,MAAM,CAAC;CACzC;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,2BAA4B,SAAQ,OAAO;IAKpD,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,MAAM;IALhB,OAAO,CAAC,iBAAiB,CAAC,CAAiB;IAC3C,OAAO,CAAC,SAAS,CAAuC;gBAG9C,IAAI,EAAE,kBAAkB,EACxB,MAAM,EAAE,eAAe;IAK3B,KAAK;IAqBL,IAAI;YAQI,qBAAqB;IAyCnC,OAAO,CAAC,MAAM;YASA,UAAU;IAuFxB,OAAO,CAAC,oBAAoB;IAyD5B,OAAO,CAAC,2BAA2B;IAmBnC,OAAO,CAAC,4BAA4B;IAiBpC;;OAEG;IACH,eAAe,IAAI,gBAAgB,EAAE;IAIrC;;OAEG;IACH,mBAAmB,CAAC,OAAO,EAAE,YAAY,GAAG,gBAAgB,GAAG,SAAS;IAIxE;;OAEG;IACH,SAAS,IAAI,eAAe;CAG7B"}
@@ -0,0 +1,213 @@
1
+ import { oObject, ChildLeftEvent, ParentDisconnectedEvent, LeaderDisconnectedEvent, ConnectionDegradedEvent, ConnectionRecoveredEvent, } from '@olane/o-core';
2
+ /**
3
+ * Connection Heartbeat Manager
4
+ *
5
+ * Uses libp2p's native ping service to detect dead connections early.
6
+ * Continuously pings parent and children to ensure they're alive.
7
+ *
8
+ * How it works:
9
+ * - Every `intervalMs`, pings all tracked connections
10
+ * - If ping fails, increments failure counter
11
+ * - After `failureThreshold` failures, marks connection as dead
12
+ * - Emits events for degraded/recovered/dead connections
13
+ * - Automatically removes dead children from hierarchy
14
+ * - Emits ParentDisconnectedEvent when parent dies (triggers reconnection)
15
+ */
16
+ export class oConnectionHeartbeatManager extends oObject {
17
+ constructor(node, config) {
18
+ super();
19
+ this.node = node;
20
+ this.config = config;
21
+ this.healthMap = new Map();
22
+ }
23
+ async start() {
24
+ if (!this.config.enabled) {
25
+ this.logger.debug('Connection heartbeat disabled');
26
+ return;
27
+ }
28
+ this.logger.info(`Starting connection heartbeat: interval=${this.config.intervalMs}ms, ` +
29
+ `timeout=${this.config.timeoutMs}ms, threshold=${this.config.failureThreshold}`);
30
+ // Immediate first check
31
+ await this.performHeartbeatCycle();
32
+ // Schedule recurring checks
33
+ this.heartbeatInterval = setInterval(() => this.performHeartbeatCycle(), this.config.intervalMs);
34
+ }
35
+ async stop() {
36
+ if (this.heartbeatInterval) {
37
+ clearInterval(this.heartbeatInterval);
38
+ this.heartbeatInterval = undefined;
39
+ }
40
+ this.healthMap.clear();
41
+ }
42
+ async performHeartbeatCycle() {
43
+ const targets = [];
44
+ // Check if this is a leader node (no leader in hierarchy = we are leader)
45
+ const isLeaderNode = this.node.getLeaders().length === 0;
46
+ // Collect leader (if enabled and we're not the leader)
47
+ if (!isLeaderNode) {
48
+ const leaders = this.node.getLeaders();
49
+ for (const leader of leaders) {
50
+ targets.push({ address: leader, role: 'leader' });
51
+ }
52
+ }
53
+ // Collect parent
54
+ if (this.config.checkParent && !isLeaderNode) {
55
+ // Use this.node.parent getter to get the current parent address with transports
56
+ // rather than getParents() which may have a stale reference
57
+ const parent = this.node.parent;
58
+ if (parent) {
59
+ targets.push({ address: parent, role: 'parent' });
60
+ }
61
+ }
62
+ // Collect children
63
+ if (this.config.checkChildren) {
64
+ const children = this.node.getChildren();
65
+ for (const child of children) {
66
+ targets.push({ address: child, role: 'child' });
67
+ }
68
+ }
69
+ // Ping all targets in parallel
70
+ await Promise.allSettled(targets.map((target) => this.pingTarget(target.address, target.role)));
71
+ }
72
+ doPing(address) {
73
+ if (address.toString() === this.node.address.toString()) {
74
+ return Promise.resolve();
75
+ }
76
+ return this.node.p2pNode.services.ping.ping(address.libp2pTransports[0].toMultiaddr());
77
+ }
78
+ async pingTarget(address, role) {
79
+ if (!address.libp2pTransports.length) {
80
+ this.logger.debug(`${role} has no transports, skipping ping`, address);
81
+ return;
82
+ }
83
+ const key = address.toString();
84
+ let health = this.healthMap.get(key);
85
+ if (!health) {
86
+ health = {
87
+ address,
88
+ peerId: 'unknown',
89
+ lastSuccessfulPing: 0,
90
+ consecutiveFailures: 0,
91
+ averageLatency: 0,
92
+ status: 'healthy',
93
+ };
94
+ this.healthMap.set(key, health);
95
+ }
96
+ try {
97
+ // Use libp2p's native ping service
98
+ const startTime = Date.now();
99
+ // Create timeout promise
100
+ const timeoutPromise = new Promise((_, reject) => {
101
+ setTimeout(() => reject(new Error('Ping timeout')), this.config.timeoutMs);
102
+ });
103
+ // Race between ping and timeout
104
+ // The ping service accepts PeerId as string or object
105
+ await Promise.race([this.doPing(address), timeoutPromise]);
106
+ const latency = Date.now() - startTime;
107
+ // Success - update health
108
+ health.lastSuccessfulPing = Date.now();
109
+ health.consecutiveFailures = 0;
110
+ health.averageLatency =
111
+ health.averageLatency === 0
112
+ ? latency
113
+ : health.averageLatency * 0.7 + latency * 0.3; // Exponential moving average
114
+ const previousStatus = health.status;
115
+ health.status = 'healthy';
116
+ // Emit recovery event if was degraded
117
+ if (previousStatus === 'degraded') {
118
+ this.logger.info(`Connection recovered: ${address} (latency: ${latency}ms)`);
119
+ this.emitConnectionRecoveredEvent(address, role);
120
+ }
121
+ // this.logger.debug(`Ping successful: ${address} (${latency}ms)`);
122
+ }
123
+ catch (error) {
124
+ health.consecutiveFailures++;
125
+ this.logger.warn(`Ping failed: ${address} (failures: ${health.consecutiveFailures}/${this.config.failureThreshold})`, error);
126
+ // Update status based on failure count
127
+ if (health.consecutiveFailures >= this.config.failureThreshold) {
128
+ this.handleConnectionDead(address, role, health);
129
+ }
130
+ else if (health.consecutiveFailures >=
131
+ Math.ceil(this.config.failureThreshold / 2)) {
132
+ health.status = 'degraded';
133
+ this.emitConnectionDegradedEvent(address, role, health.consecutiveFailures);
134
+ }
135
+ }
136
+ }
137
+ handleConnectionDead(address, role, health) {
138
+ health.status = 'dead';
139
+ this.logger.error(`Connection dead after ${health.consecutiveFailures} failures: ${address} (role: ${role})`);
140
+ // Remove from health tracking
141
+ this.healthMap.delete(address.toString());
142
+ // Emit events based on role
143
+ if (role === 'child') {
144
+ // Remove dead child from hierarchy
145
+ this.node.removeChild(address);
146
+ // Emit child left event
147
+ this.node.notificationManager.emit(new ChildLeftEvent({
148
+ source: this.node.address,
149
+ childAddress: address,
150
+ parentAddress: this.node.address,
151
+ reason: `heartbeat_failed_${health.consecutiveFailures}_times`,
152
+ }));
153
+ this.logger.warn(`Removed dead child: ${address}`);
154
+ }
155
+ else if (role === 'parent') {
156
+ // Emit parent disconnected event
157
+ this.node.notificationManager.emit(new ParentDisconnectedEvent({
158
+ source: this.node.address,
159
+ parentAddress: address,
160
+ reason: `heartbeat_failed_${health.consecutiveFailures}_times`,
161
+ }));
162
+ this.logger.error(`Parent connection dead: ${address}`);
163
+ // Reconnection manager will handle this event
164
+ }
165
+ else if (role === 'leader') {
166
+ // Emit leader disconnected event
167
+ this.node.notificationManager.emit(new LeaderDisconnectedEvent({
168
+ source: this.node.address,
169
+ leaderAddress: address,
170
+ reason: `heartbeat_failed_${health.consecutiveFailures}_times`,
171
+ }));
172
+ this.logger.error(`Leader connection dead: ${address}`);
173
+ // Reconnection manager will handle this event
174
+ }
175
+ }
176
+ emitConnectionDegradedEvent(address, role, failures) {
177
+ // ConnectionDegradedEvent only supports parent/child, so we map leader to parent
178
+ const eventRole = role === 'leader' ? 'parent' : role === 'child' ? 'child' : 'parent';
179
+ this.node.notificationManager.emit(new ConnectionDegradedEvent({
180
+ source: this.node.address,
181
+ targetAddress: address,
182
+ role: eventRole,
183
+ consecutiveFailures: failures,
184
+ }));
185
+ }
186
+ emitConnectionRecoveredEvent(address, role) {
187
+ // ConnectionRecoveredEvent only supports parent/child, so we map leader to parent
188
+ const eventRole = role === 'leader' ? 'parent' : role === 'child' ? 'child' : 'parent';
189
+ this.node.notificationManager.emit(new ConnectionRecoveredEvent({
190
+ source: this.node.address,
191
+ targetAddress: address,
192
+ role: eventRole,
193
+ }));
194
+ }
195
+ /**
196
+ * Get current health status of all connections
197
+ */
198
+ getHealthStatus() {
199
+ return Array.from(this.healthMap.values());
200
+ }
201
+ /**
202
+ * Get health status for specific address
203
+ */
204
+ getConnectionHealth(address) {
205
+ return this.healthMap.get(address.toString());
206
+ }
207
+ /**
208
+ * Get current configuration
209
+ */
210
+ getConfig() {
211
+ return { ...this.config };
212
+ }
213
+ }
@@ -0,0 +1,51 @@
1
+ import { oObject } from '@olane/o-core';
2
+ import { IReconnectableNode } from '../interfaces/i-reconnectable-node.js';
3
+ export interface ReconnectionConfig {
4
+ enabled: boolean;
5
+ maxAttempts: number;
6
+ baseDelayMs: number;
7
+ maxDelayMs: number;
8
+ useLeaderFallback: boolean;
9
+ parentDiscoveryIntervalMs: number;
10
+ parentDiscoveryMaxDelayMs: number;
11
+ }
12
+ /**
13
+ * Reconnection Manager
14
+ *
15
+ * Automatically attempts to reconnect to parent when connection is lost.
16
+ *
17
+ * Strategy:
18
+ * 1. Listen for ParentDisconnectedEvent (from heartbeat or libp2p)
19
+ * 2. Attempt direct reconnection with exponential backoff
20
+ * 3. If direct reconnection fails, query leader for new parent
21
+ * 4. Register with new parent and continue operation
22
+ * 5. If all attempts fail, transition node to ERROR state
23
+ */
24
+ export declare class oReconnectionManager extends oObject {
25
+ private node;
26
+ private config;
27
+ private reconnecting;
28
+ constructor(node: IReconnectableNode, config: ReconnectionConfig);
29
+ private setupEventListeners;
30
+ handleNodeConnected(event: any): Promise<void>;
31
+ private handleConnectionDegraded;
32
+ private handleLeaderDisconnected;
33
+ private handleParentDisconnected;
34
+ attemptReconnection(): Promise<void>;
35
+ private tryDirectParentReconnection;
36
+ private tryLeaderFallback;
37
+ /**
38
+ * Wait for leader to become available and reconnect
39
+ * Leader transports are static (configured), so we just need to detect when it's back
40
+ */
41
+ private waitForLeaderAndReconnect;
42
+ /**
43
+ * Wait for non-leader parent to appear in registry and reconnect
44
+ */
45
+ waitForParentAndReconnect(): Promise<void>;
46
+ private handleReconnectionFailure;
47
+ private calculateNodeLevel;
48
+ private calculateBackoffDelay;
49
+ private sleep;
50
+ }
51
+ //# sourceMappingURL=o-reconnection.manager.d.ts.map
@@ -0,0 +1 @@
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"}