@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,170 @@
1
+ import { oAddress, oAddressResolver, oCore, oTransport, ResolveRequest, RouteResponse } from '@olane/o-core';
2
+ import { oNodeTransport } from '../o-node.transport.js';
3
+ /**
4
+ * Address resolver that searches a registry to find transports for addresses.
5
+ *
6
+ * This resolver queries a registry service to find the transport information
7
+ * for addresses that don't already have transports configured. It's designed
8
+ * to be extensible through subclassing via protected template methods.
9
+ *
10
+ * @example Basic usage
11
+ * ```typescript
12
+ * const resolver = new oSearchResolver(nodeAddress);
13
+ * router.addResolver(resolver);
14
+ * ```
15
+ *
16
+ * @example Creating a custom search resolver
17
+ * ```typescript
18
+ * class CustomSearchResolver extends oSearchResolver {
19
+ * // Search a different registry
20
+ * protected getRegistryAddress(): oAddress {
21
+ * return new oAddress('o://my-custom-registry');
22
+ * }
23
+ *
24
+ * // Use round-robin selection instead of first result
25
+ * private currentIndex = 0;
26
+ * protected selectResult(results: any[]): any | null {
27
+ * if (results.length === 0) return null;
28
+ * const result = results[this.currentIndex % results.length];
29
+ * this.currentIndex++;
30
+ * return result;
31
+ * }
32
+ *
33
+ * // Add custom filtering logic
34
+ * protected filterSearchResults(results: any[], node: oCore): any[] {
35
+ * return super.filterSearchResults(results, node).filter(
36
+ * result => result.status === 'active'
37
+ * );
38
+ * }
39
+ *
40
+ * // Implement custom routing logic with transport setup
41
+ * protected determineNextHop(
42
+ * node: oCore,
43
+ * resolvedTargetAddress: oAddress,
44
+ * searchResult: any
45
+ * ): oAddress {
46
+ * // Always route directly to target, bypassing hierarchy
47
+ * const targetTransports = this.mapTransports(searchResult);
48
+ * resolvedTargetAddress.setTransports(targetTransports);
49
+ * return resolvedTargetAddress;
50
+ * }
51
+ * }
52
+ * ```
53
+ *
54
+ * ## Extension Points
55
+ *
56
+ * The following protected methods can be overridden to customize behavior:
57
+ *
58
+ * - `getRegistryAddress()` - Change which registry to search
59
+ * - `getSearchMethod()` - Change the registry method to call
60
+ * - `buildSearchParams()` - Customize search parameters
61
+ * - `filterSearchResults()` - Add custom filtering logic
62
+ * - `selectResult()` - Implement custom result selection (e.g., load balancing)
63
+ * - `mapTransports()` - Customize how transports are mapped from results
64
+ * - `determineNextHop()` - Implement custom routing logic to determine the next hop address
65
+ * - `resolveNextHopTransports()` - Customize transport resolution for the next hop
66
+ */
67
+ export declare class oSearchResolver extends oAddressResolver {
68
+ protected readonly address: oAddress;
69
+ constructor(address: oAddress);
70
+ get customTransports(): oTransport[];
71
+ /**
72
+ * Returns the address of the registry to search.
73
+ * Override this method to search a different registry.
74
+ * @returns The registry address to query
75
+ */
76
+ protected getRegistryAddress(): oAddress;
77
+ /**
78
+ * Returns the method name to call on the registry.
79
+ * Override this method to use a different search method.
80
+ * @returns The method name to call
81
+ */
82
+ protected getSearchMethod(): string;
83
+ /**
84
+ * Builds the search parameters for the registry query.
85
+ * Override this method to customize search parameters.
86
+ * @param address - The address being resolved
87
+ * @returns Parameters to pass to the registry search method
88
+ */
89
+ protected buildSearchParams(address: oAddress): any;
90
+ /**
91
+ * Filters the search results from the registry.
92
+ * Override this method to apply custom filtering logic.
93
+ * @param results - Raw results from the registry
94
+ * @param node - The current node context
95
+ * @returns Filtered array of results
96
+ */
97
+ protected filterSearchResults(results: any[], node: oCore): any[];
98
+ /**
99
+ * Selects which result to use from the filtered results.
100
+ * Override this method to implement custom selection logic (e.g., load balancing).
101
+ * @param results - Filtered search results
102
+ * @returns The selected result, or null if no suitable result
103
+ */
104
+ protected selectResult(results: any[]): any | null;
105
+ /**
106
+ * Maps the transport data from the search result to oNodeTransport instances.
107
+ * Override this method to customize transport mapping.
108
+ * @param result - The selected search result
109
+ * @returns Array of oNodeTransport instances
110
+ */
111
+ protected mapTransports(result: any): oNodeTransport[];
112
+ /**
113
+ * Resolves the transports for the next hop address.
114
+ * This handles the logic of determining which transports to use based on
115
+ * whether the next hop is the leader, a known child, or a new target.
116
+ *
117
+ * Override this method to customize transport resolution logic.
118
+ *
119
+ * @param nextHop - The next hop address
120
+ * @param targetTransports - The transports from the registry search result
121
+ * @param node - The current node context
122
+ * @returns Array of transports to use for the next hop
123
+ */
124
+ protected resolveNextHopTransports(nextHop: oAddress, targetTransports: oNodeTransport[], node: oCore): oNodeTransport[];
125
+ /**
126
+ * Determines the next hop address for routing to the target and sets up its transports.
127
+ *
128
+ * This method implements the complete routing logic including:
129
+ * 1. Determining the next address in the path (using `oAddress.next()`)
130
+ * 2. Mapping transports from the search result
131
+ * 3. Resolving and setting transports on the next hop address
132
+ * 4. Setting transports on the target address
133
+ *
134
+ * The default implementation:
135
+ * - Uses `oAddress.next()` for standard hierarchy-based routing
136
+ * - Maps transports from the registry search result
137
+ * - Resolves next hop transports based on leader/hierarchy
138
+ * - Configures both next hop and target with appropriate transports
139
+ *
140
+ * Override this method to implement custom routing logic, such as:
141
+ * - Direct peer-to-peer routing
142
+ * - Custom hierarchy traversal
143
+ * - Alternative transport selection strategies
144
+ * - Bypass leader for certain routes
145
+ *
146
+ * @param node - The current node context
147
+ * @param resolvedTargetAddress - The resolved target address to route to
148
+ * @param searchResult - The raw search result from the registry containing transport data
149
+ * @returns The next hop address with transports configured
150
+ *
151
+ * @example Custom direct routing
152
+ * ```typescript
153
+ * class DirectSearchResolver extends oSearchResolver {
154
+ * protected determineNextHop(
155
+ * node: oCore,
156
+ * resolvedTargetAddress: oAddress,
157
+ * searchResult: any
158
+ * ): oAddress {
159
+ * // Always route directly to the target, bypassing hierarchy
160
+ * const targetTransports = this.mapTransports(searchResult);
161
+ * resolvedTargetAddress.setTransports(targetTransports);
162
+ * return resolvedTargetAddress;
163
+ * }
164
+ * }
165
+ * ```
166
+ */
167
+ protected determineNextHop(node: oCore, resolvedTargetAddress: oAddress, searchResult: any): oAddress;
168
+ resolve(request: ResolveRequest): Promise<RouteResponse>;
169
+ }
170
+ //# 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,EAEL,QAAQ,EACR,gBAAgB,EAChB,KAAK,EAEL,UAAU,EACV,cAAc,EAEd,aAAa,EAEd,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AACH,qBAAa,eAAgB,SAAQ,gBAAgB;IACvC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ;gBAAjB,OAAO,EAAE,QAAQ;IAIhD,IAAI,gBAAgB,IAAI,UAAU,EAAE,CAEnC;IAED;;;;OAIG;IACH,SAAS,CAAC,kBAAkB,IAAI,QAAQ;IAIxC;;;;OAIG;IACH,SAAS,CAAC,eAAe,IAAI,MAAM;IAInC;;;;;OAKG;IACH,SAAS,CAAC,iBAAiB,CAAC,OAAO,EAAE,QAAQ,GAAG,GAAG;IAOnD;;;;;;OAMG;IACH,SAAS,CAAC,mBAAmB,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,GAAG,GAAG,EAAE;IASjE;;;;;OAKG;IACH,SAAS,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI;IAIlD;;;;;OAKG;IACH,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,GAAG,cAAc,EAAE;IAOtD;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,wBAAwB,CAChC,OAAO,EAAE,QAAQ,EACjB,gBAAgB,EAAE,cAAc,EAAE,EAClC,IAAI,EAAE,KAAK,GACV,cAAc,EAAE;IAgBnB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAyCG;IACH,SAAS,CAAC,gBAAgB,CACxB,IAAI,EAAE,KAAK,EACX,qBAAqB,EAAE,QAAQ,EAC/B,YAAY,EAAE,GAAG,GAChB,QAAQ;IAeL,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;CAsG/D"}
@@ -0,0 +1,285 @@
1
+ import { NodeState, oAddress, oAddressResolver, oCustomTransport, RestrictedAddresses, } from '@olane/o-core';
2
+ import { oNodeTransport } from '../o-node.transport.js';
3
+ /**
4
+ * Address resolver that searches a registry to find transports for addresses.
5
+ *
6
+ * This resolver queries a registry service to find the transport information
7
+ * for addresses that don't already have transports configured. It's designed
8
+ * to be extensible through subclassing via protected template methods.
9
+ *
10
+ * @example Basic usage
11
+ * ```typescript
12
+ * const resolver = new oSearchResolver(nodeAddress);
13
+ * router.addResolver(resolver);
14
+ * ```
15
+ *
16
+ * @example Creating a custom search resolver
17
+ * ```typescript
18
+ * class CustomSearchResolver extends oSearchResolver {
19
+ * // Search a different registry
20
+ * protected getRegistryAddress(): oAddress {
21
+ * return new oAddress('o://my-custom-registry');
22
+ * }
23
+ *
24
+ * // Use round-robin selection instead of first result
25
+ * private currentIndex = 0;
26
+ * protected selectResult(results: any[]): any | null {
27
+ * if (results.length === 0) return null;
28
+ * const result = results[this.currentIndex % results.length];
29
+ * this.currentIndex++;
30
+ * return result;
31
+ * }
32
+ *
33
+ * // Add custom filtering logic
34
+ * protected filterSearchResults(results: any[], node: oCore): any[] {
35
+ * return super.filterSearchResults(results, node).filter(
36
+ * result => result.status === 'active'
37
+ * );
38
+ * }
39
+ *
40
+ * // Implement custom routing logic with transport setup
41
+ * protected determineNextHop(
42
+ * node: oCore,
43
+ * resolvedTargetAddress: oAddress,
44
+ * searchResult: any
45
+ * ): oAddress {
46
+ * // Always route directly to target, bypassing hierarchy
47
+ * const targetTransports = this.mapTransports(searchResult);
48
+ * resolvedTargetAddress.setTransports(targetTransports);
49
+ * return resolvedTargetAddress;
50
+ * }
51
+ * }
52
+ * ```
53
+ *
54
+ * ## Extension Points
55
+ *
56
+ * The following protected methods can be overridden to customize behavior:
57
+ *
58
+ * - `getRegistryAddress()` - Change which registry to search
59
+ * - `getSearchMethod()` - Change the registry method to call
60
+ * - `buildSearchParams()` - Customize search parameters
61
+ * - `filterSearchResults()` - Add custom filtering logic
62
+ * - `selectResult()` - Implement custom result selection (e.g., load balancing)
63
+ * - `mapTransports()` - Customize how transports are mapped from results
64
+ * - `determineNextHop()` - Implement custom routing logic to determine the next hop address
65
+ * - `resolveNextHopTransports()` - Customize transport resolution for the next hop
66
+ */
67
+ export class oSearchResolver extends oAddressResolver {
68
+ constructor(address) {
69
+ super(address);
70
+ this.address = address;
71
+ }
72
+ get customTransports() {
73
+ return [new oCustomTransport('/search')];
74
+ }
75
+ /**
76
+ * Returns the address of the registry to search.
77
+ * Override this method to search a different registry.
78
+ * @returns The registry address to query
79
+ */
80
+ getRegistryAddress() {
81
+ return new oAddress('o://leader/registry');
82
+ }
83
+ /**
84
+ * Returns the method name to call on the registry.
85
+ * Override this method to use a different search method.
86
+ * @returns The method name to call
87
+ */
88
+ getSearchMethod() {
89
+ return 'search';
90
+ }
91
+ /**
92
+ * Builds the search parameters for the registry query.
93
+ * Override this method to customize search parameters.
94
+ * @param address - The address being resolved
95
+ * @returns Parameters to pass to the registry search method
96
+ */
97
+ buildSearchParams(address) {
98
+ return {
99
+ staticAddress: address.toRootAddress().toString(),
100
+ address: address.toString(),
101
+ };
102
+ }
103
+ /**
104
+ * Filters the search results from the registry.
105
+ * Override this method to apply custom filtering logic.
106
+ * @param results - Raw results from the registry
107
+ * @param node - The current node context
108
+ * @returns Filtered array of results
109
+ */
110
+ filterSearchResults(results, node) {
111
+ return results.filter(
112
+ // filter out the items that may cause infinite looping
113
+ (result) => result.staticAddress !== RestrictedAddresses.REGISTRY &&
114
+ result.address !== node.address);
115
+ }
116
+ /**
117
+ * Selects which result to use from the filtered results.
118
+ * Override this method to implement custom selection logic (e.g., load balancing).
119
+ * @param results - Filtered search results
120
+ * @returns The selected result, or null if no suitable result
121
+ */
122
+ selectResult(results) {
123
+ return results.length > 0 ? results[0] : null;
124
+ }
125
+ /**
126
+ * Maps the transport data from the search result to oNodeTransport instances.
127
+ * Override this method to customize transport mapping.
128
+ * @param result - The selected search result
129
+ * @returns Array of oNodeTransport instances
130
+ */
131
+ mapTransports(result) {
132
+ return result.transports.map((t) => new oNodeTransport(t.value));
133
+ }
134
+ /**
135
+ * Resolves the transports for the next hop address.
136
+ * This handles the logic of determining which transports to use based on
137
+ * whether the next hop is the leader, a known child, or a new target.
138
+ *
139
+ * Override this method to customize transport resolution logic.
140
+ *
141
+ * @param nextHop - The next hop address
142
+ * @param targetTransports - The transports from the registry search result
143
+ * @param node - The current node context
144
+ * @returns Array of transports to use for the next hop
145
+ */
146
+ resolveNextHopTransports(nextHop, targetTransports, node) {
147
+ // If next hop is the leader, use leader transports
148
+ if (nextHop.value === RestrictedAddresses.LEADER) {
149
+ return (node.leader?.transports || []);
150
+ }
151
+ // Check if next hop is a known child in the hierarchy
152
+ const childAddress = node?.hierarchyManager.getChild(nextHop);
153
+ if (childAddress?.transports) {
154
+ return childAddress.transports;
155
+ }
156
+ // Fall back to target transports from registry
157
+ return targetTransports;
158
+ }
159
+ /**
160
+ * Determines the next hop address for routing to the target and sets up its transports.
161
+ *
162
+ * This method implements the complete routing logic including:
163
+ * 1. Determining the next address in the path (using `oAddress.next()`)
164
+ * 2. Mapping transports from the search result
165
+ * 3. Resolving and setting transports on the next hop address
166
+ * 4. Setting transports on the target address
167
+ *
168
+ * The default implementation:
169
+ * - Uses `oAddress.next()` for standard hierarchy-based routing
170
+ * - Maps transports from the registry search result
171
+ * - Resolves next hop transports based on leader/hierarchy
172
+ * - Configures both next hop and target with appropriate transports
173
+ *
174
+ * Override this method to implement custom routing logic, such as:
175
+ * - Direct peer-to-peer routing
176
+ * - Custom hierarchy traversal
177
+ * - Alternative transport selection strategies
178
+ * - Bypass leader for certain routes
179
+ *
180
+ * @param node - The current node context
181
+ * @param resolvedTargetAddress - The resolved target address to route to
182
+ * @param searchResult - The raw search result from the registry containing transport data
183
+ * @returns The next hop address with transports configured
184
+ *
185
+ * @example Custom direct routing
186
+ * ```typescript
187
+ * class DirectSearchResolver extends oSearchResolver {
188
+ * protected determineNextHop(
189
+ * node: oCore,
190
+ * resolvedTargetAddress: oAddress,
191
+ * searchResult: any
192
+ * ): oAddress {
193
+ * // Always route directly to the target, bypassing hierarchy
194
+ * const targetTransports = this.mapTransports(searchResult);
195
+ * resolvedTargetAddress.setTransports(targetTransports);
196
+ * return resolvedTargetAddress;
197
+ * }
198
+ * }
199
+ * ```
200
+ */
201
+ determineNextHop(node, resolvedTargetAddress, searchResult) {
202
+ // Determine next hop using standard hierarchy logic
203
+ const nextHopAddress = oAddress.next(node.address, resolvedTargetAddress);
204
+ // Map transports from search result
205
+ const targetTransports = this.mapTransports(searchResult);
206
+ // Set transports on the next hop based on routing logic
207
+ nextHopAddress.setTransports(this.resolveNextHopTransports(nextHopAddress, targetTransports, node));
208
+ return nextHopAddress;
209
+ }
210
+ async resolve(request) {
211
+ const { address, node, request: resolveRequest, targetAddress } = request;
212
+ // Early return: if address already has transports, no search needed
213
+ if (address.transports.length > 0) {
214
+ return {
215
+ nextHopAddress: address,
216
+ targetAddress: targetAddress,
217
+ requestOverride: resolveRequest,
218
+ };
219
+ }
220
+ if (node.state !== NodeState.RUNNING) {
221
+ return {
222
+ nextHopAddress: address,
223
+ targetAddress: targetAddress,
224
+ requestOverride: resolveRequest,
225
+ };
226
+ }
227
+ // Perform registry search with error handling
228
+ const searchParams = this.buildSearchParams(address);
229
+ const registryAddress = this.getRegistryAddress();
230
+ let searchResponse;
231
+ try {
232
+ searchResponse = await node.use(registryAddress, {
233
+ method: this.getSearchMethod(),
234
+ params: searchParams,
235
+ });
236
+ }
237
+ catch (error) {
238
+ // Log the error but don't throw - allow fallback resolvers to handle it
239
+ const errorMessage = error instanceof Error ? error.message : String(error);
240
+ // Check if this is a circuit breaker error (fast-fail scenario)
241
+ if (errorMessage.includes('Circuit breaker is OPEN')) {
242
+ this.logger.warn(`Registry search blocked by circuit breaker for ${address.toString()}: ${errorMessage}`);
243
+ }
244
+ else {
245
+ this.logger.error(`Registry search failed for ${address.toString()}: ${errorMessage}`);
246
+ }
247
+ // Return original address without transports, letting next resolver in chain handle it
248
+ return {
249
+ nextHopAddress: address,
250
+ targetAddress: targetAddress,
251
+ requestOverride: resolveRequest,
252
+ };
253
+ }
254
+ // Filter and select result
255
+ const filteredResults = this.filterSearchResults(searchResponse.result.data, node);
256
+ const selectedResult = this.selectResult(filteredResults);
257
+ // Early return: if no result found, return original address
258
+ if (!selectedResult) {
259
+ return {
260
+ nextHopAddress: address,
261
+ targetAddress: targetAddress,
262
+ requestOverride: resolveRequest,
263
+ };
264
+ }
265
+ // Build route from search result
266
+ const extraParams = address
267
+ .toString() // o://embeddings-text replace o://embeddings-text = ''
268
+ .replace(address.toRootAddress().toString(), '');
269
+ // Check if selectedResult.address already contains the complete path
270
+ // This happens when registry finds via staticAddress - the returned address
271
+ // is the canonical hierarchical location, so we shouldn't append extraParams
272
+ const resultAddress = selectedResult.address;
273
+ const shouldAppendParams = extraParams && !resultAddress.endsWith(extraParams);
274
+ const resolvedTargetAddress = new oAddress(shouldAppendParams ? resultAddress + extraParams : resultAddress);
275
+ // Set transports on the target address
276
+ resolvedTargetAddress.setTransports(this.mapTransports(selectedResult));
277
+ // Determine next hop and configure transports
278
+ const nextHopAddress = this.determineNextHop(node, resolvedTargetAddress, selectedResult);
279
+ return {
280
+ nextHopAddress: nextHopAddress,
281
+ targetAddress: resolvedTargetAddress,
282
+ requestOverride: resolveRequest,
283
+ };
284
+ }
285
+ }
@@ -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,10 @@
1
+ /**
2
+ * Streaming functionality for o-node
3
+ *
4
+ * This module provides libp2p-specific implementations of the streaming
5
+ * abstractions defined in o-core.
6
+ */
7
+ export * from '../../../o-core/src/streaming/index.js';
8
+ export { Libp2pStreamTransport } from './libp2p-stream-transport.js';
9
+ export { NodeStreamHandler, NodeStreamHandlerOptions, } from './node-stream-handler.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/streaming/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,cAAc,wCAAwC,CAAC;AAGvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAGrE,OAAO,EACL,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Streaming functionality for o-node
3
+ *
4
+ * This module provides libp2p-specific implementations of the streaming
5
+ * abstractions defined in o-core.
6
+ */
7
+ // Re-export o-core streaming abstractions for convenience
8
+ export * from '../../../o-core/src/streaming/index.js';
9
+ // libp2p-specific stream transport
10
+ export { Libp2pStreamTransport } from './libp2p-stream-transport.js';
11
+ // o-node stream handler with metrics
12
+ export { NodeStreamHandler, } from './node-stream-handler.js';
@@ -0,0 +1,50 @@
1
+ import { Stream } from '@olane/o-config';
2
+ import { IStreamTransport, StreamStatus, StreamTransportConfig } from '../../../o-core/src/streaming/index.js';
3
+ /**
4
+ * libp2p-specific implementation of IStreamTransport.
5
+ * Wraps a libp2p Stream and handles backpressure, message listening,
6
+ * and stream lifecycle management.
7
+ */
8
+ export declare class Libp2pStreamTransport implements IStreamTransport {
9
+ private readonly stream;
10
+ private messageHandler?;
11
+ private config;
12
+ constructor(stream: Stream, config?: StreamTransportConfig);
13
+ /**
14
+ * Get the underlying libp2p Stream (useful for advanced use cases)
15
+ */
16
+ getStream(): Stream;
17
+ /**
18
+ * Send data through the stream with backpressure handling
19
+ */
20
+ send(data: Uint8Array): Promise<void>;
21
+ /**
22
+ * Set up a message handler for incoming data.
23
+ * IMPORTANT: For libp2p v3, this must be called synchronously after
24
+ * receiving the stream to prevent buffer overflow.
25
+ */
26
+ onMessage(handler: (data: Uint8Array) => void): void;
27
+ /**
28
+ * Remove the message handler
29
+ */
30
+ removeMessageHandler(): void;
31
+ /**
32
+ * Close the stream and clean up resources
33
+ */
34
+ close(): Promise<void>;
35
+ /**
36
+ * Get the current status of the stream
37
+ */
38
+ getStatus(): StreamStatus;
39
+ /**
40
+ * Check if the stream is in a usable state
41
+ */
42
+ isOpen(): boolean;
43
+ /**
44
+ * Wait for the first message with timeout
45
+ * @param timeoutMs - Optional timeout in milliseconds (defaults to config.readTimeoutMs)
46
+ * @returns Promise that resolves with the first message
47
+ */
48
+ waitForMessage(timeoutMs?: number): Promise<Uint8Array>;
49
+ }
50
+ //# sourceMappingURL=libp2p-stream-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"libp2p-stream-transport.d.ts","sourceRoot":"","sources":["../../../../src/streaming/libp2p-stream-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,qBAAqB,EACtB,MAAM,wCAAwC,CAAC;AAUhD;;;;GAIG;AACH,qBAAa,qBAAsB,YAAW,gBAAgB;IAK1D,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJzB,OAAO,CAAC,cAAc,CAAC,CAA6B;IACpD,OAAO,CAAC,MAAM,CAAkC;gBAG7B,MAAM,EAAE,MAAM,EAC/B,MAAM,CAAC,EAAE,qBAAqB;IAQhC;;OAEG;IACI,SAAS,IAAI,MAAM;IAI1B;;OAEG;IACG,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB3C;;;;OAIG;IACH,SAAS,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI;IAcpD;;OAEG;IACH,oBAAoB,IAAI,IAAI;IAO5B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAa5B;;OAEG;IACH,SAAS,IAAI,YAAY;IAkBzB;;OAEG;IACH,MAAM,IAAI,OAAO;IAIjB;;;;OAIG;IACG,cAAc,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;CAe9D"}