@olane/o-node 0.7.55 → 0.7.57

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 (54) hide show
  1. package/dist/src/connection/enums/o-node-message-event.d.ts +14 -0
  2. package/dist/src/connection/enums/o-node-message-event.d.ts.map +1 -0
  3. package/dist/src/connection/enums/o-node-message-event.js +5 -0
  4. package/dist/src/connection/index.d.ts +0 -3
  5. package/dist/src/connection/index.d.ts.map +1 -1
  6. package/dist/src/connection/index.js +0 -3
  7. package/dist/src/connection/interfaces/abort-signal.config.d.ts +5 -0
  8. package/dist/src/connection/interfaces/abort-signal.config.d.ts.map +1 -0
  9. package/dist/src/connection/interfaces/o-node-connection-manager.config.d.ts +13 -1
  10. package/dist/src/connection/interfaces/o-node-connection-manager.config.d.ts.map +1 -1
  11. package/dist/src/connection/interfaces/o-node-connection.config.d.ts +18 -5
  12. package/dist/src/connection/interfaces/o-node-connection.config.d.ts.map +1 -1
  13. package/dist/src/connection/interfaces/o-node-stream.config.d.ts +3 -11
  14. package/dist/src/connection/interfaces/o-node-stream.config.d.ts.map +1 -1
  15. package/dist/src/connection/o-node-connection.d.ts +29 -53
  16. package/dist/src/connection/o-node-connection.d.ts.map +1 -1
  17. package/dist/src/connection/o-node-connection.js +102 -149
  18. package/dist/src/connection/o-node-connection.manager.d.ts +12 -8
  19. package/dist/src/connection/o-node-connection.manager.d.ts.map +1 -1
  20. package/dist/src/connection/o-node-connection.manager.js +49 -35
  21. package/dist/src/connection/o-node-stream.d.ts +48 -15
  22. package/dist/src/connection/o-node-stream.d.ts.map +1 -1
  23. package/dist/src/connection/o-node-stream.js +143 -31
  24. package/dist/src/connection/stream-handler.config.d.ts +0 -11
  25. package/dist/src/connection/stream-handler.config.d.ts.map +1 -1
  26. package/dist/src/lib/interfaces/o-node-request-manager.config.d.ts +9 -0
  27. package/dist/src/lib/interfaces/o-node-request-manager.config.d.ts.map +1 -0
  28. package/dist/src/lib/interfaces/o-node-request-manager.config.js +1 -0
  29. package/dist/src/lib/o-node-request-manager.d.ts +46 -0
  30. package/dist/src/lib/o-node-request-manager.d.ts.map +1 -0
  31. package/dist/src/lib/o-node-request-manager.js +173 -0
  32. package/dist/src/managers/o-reconnection.manager.d.ts.map +1 -1
  33. package/dist/src/managers/o-reconnection.manager.js +4 -0
  34. package/dist/src/managers/o-registration.manager.d.ts.map +1 -1
  35. package/dist/src/managers/o-registration.manager.js +9 -4
  36. package/dist/src/o-node.d.ts +6 -7
  37. package/dist/src/o-node.d.ts.map +1 -1
  38. package/dist/src/o-node.js +22 -37
  39. package/dist/src/o-node.tool.d.ts +3 -3
  40. package/dist/src/o-node.tool.d.ts.map +1 -1
  41. package/dist/src/o-node.tool.js +28 -56
  42. package/dist/src/router/o-node.router.d.ts.map +1 -1
  43. package/dist/src/router/o-node.router.js +4 -2
  44. package/dist/test/connection-management.spec.js +3 -0
  45. package/package.json +7 -7
  46. package/dist/src/connection/interfaces/stream-init-message.d.ts +0 -64
  47. package/dist/src/connection/interfaces/stream-init-message.d.ts.map +0 -1
  48. package/dist/src/connection/interfaces/stream-init-message.js +0 -18
  49. package/dist/src/connection/interfaces/stream-manager.config.d.ts +0 -8
  50. package/dist/src/connection/interfaces/stream-manager.config.d.ts.map +0 -1
  51. package/dist/src/connection/o-node-stream.manager.d.ts +0 -210
  52. package/dist/src/connection/o-node-stream.manager.d.ts.map +0 -1
  53. package/dist/src/connection/o-node-stream.manager.js +0 -696
  54. /package/dist/src/connection/interfaces/{stream-manager.config.js → abort-signal.config.js} +0 -0
@@ -0,0 +1,14 @@
1
+ import { oResponse } from '@olane/o-core';
2
+ import { oStreamRequest } from '../o-stream.request.js';
3
+ export declare enum oNodeMessageEvent {
4
+ request = "request",
5
+ response = "response"
6
+ }
7
+ /**
8
+ * Mapped type for type-safe event listeners
9
+ */
10
+ export type oNodeMessageEventData = {
11
+ [oNodeMessageEvent.request]: oStreamRequest;
12
+ [oNodeMessageEvent.response]: oResponse;
13
+ };
14
+ //# sourceMappingURL=o-node-message-event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"o-node-message-event.d.ts","sourceRoot":"","sources":["../../../../src/connection/enums/o-node-message-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,SAAS,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,oBAAY,iBAAiB;IAC3B,OAAO,YAAY;IACnB,QAAQ,aAAa;CACtB;AAED;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;IAC5C,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;CACzC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export var oNodeMessageEvent;
2
+ (function (oNodeMessageEvent) {
3
+ oNodeMessageEvent["request"] = "request";
4
+ oNodeMessageEvent["response"] = "response";
5
+ })(oNodeMessageEvent || (oNodeMessageEvent = {}));
@@ -3,10 +3,7 @@ export * from './o-node-connection.manager.js';
3
3
  export * from './interfaces/o-node-connection.config.js';
4
4
  export * from './interfaces/o-node-connection-manager.config.js';
5
5
  export * from './interfaces/o-node-stream.config.js';
6
- export * from './interfaces/stream-manager.config.js';
7
- export * from './interfaces/stream-init-message.js';
8
6
  export * from './o-node-stream.js';
9
7
  export * from './stream-handler.config.js';
10
- export * from './o-node-stream.manager.js';
11
8
  export * from './stream-manager.events.js';
12
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/connection/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0CAA0C,CAAC;AACzD,cAAc,kDAAkD,CAAC;AACjE,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,qCAAqC,CAAC;AACpD,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/connection/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0CAA0C,CAAC;AACzD,cAAc,kDAAkD,CAAC;AACjE,cAAc,sCAAsC,CAAC;AACrD,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC"}
@@ -3,9 +3,6 @@ export * from './o-node-connection.manager.js';
3
3
  export * from './interfaces/o-node-connection.config.js';
4
4
  export * from './interfaces/o-node-connection-manager.config.js';
5
5
  export * from './interfaces/o-node-stream.config.js';
6
- export * from './interfaces/stream-manager.config.js';
7
- export * from './interfaces/stream-init-message.js';
8
6
  export * from './o-node-stream.js';
9
7
  export * from './stream-handler.config.js';
10
- export * from './o-node-stream.manager.js';
11
8
  export * from './stream-manager.events.js';
@@ -0,0 +1,5 @@
1
+ /// <reference types="node" />
2
+ export interface AbortSignalConfig {
3
+ abortSignal?: AbortSignal;
4
+ }
5
+ //# sourceMappingURL=abort-signal.config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abort-signal.config.d.ts","sourceRoot":"","sources":["../../../../src/connection/interfaces/abort-signal.config.ts"],"names":[],"mappings":";AAAA,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B"}
@@ -3,6 +3,18 @@ import { Libp2p } from '@olane/o-config';
3
3
  export interface oNodeConnectionManagerConfig extends oConnectionManagerConfig {
4
4
  p2pNode: Libp2p;
5
5
  runOnLimitedConnection?: boolean;
6
- originAddress?: string;
6
+ callerAddress?: string;
7
+ /**
8
+ * Default timeout in milliseconds for reading response data from a stream.
9
+ * Can be overridden per connection.
10
+ * Default: 120000 (2 minutes)
11
+ */
12
+ defaultReadTimeoutMs?: number;
13
+ /**
14
+ * Default timeout in milliseconds for waiting for stream buffer to drain when backpressure occurs.
15
+ * Can be overridden per connection.
16
+ * Default: 30000 (30 seconds)
17
+ */
18
+ defaultDrainTimeoutMs?: number;
7
19
  }
8
20
  //# sourceMappingURL=o-node-connection-manager.config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"o-node-connection-manager.config.d.ts","sourceRoot":"","sources":["../../../../src/connection/interfaces/o-node-connection-manager.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,MAAM,WAAW,4BAA6B,SAAQ,wBAAwB;IAC5E,OAAO,EAAE,MAAM,CAAC;IAChB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB"}
1
+ {"version":3,"file":"o-node-connection-manager.config.d.ts","sourceRoot":"","sources":["../../../../src/connection/interfaces/o-node-connection-manager.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,MAAM,WAAW,4BAA6B,SAAQ,wBAAwB;IAC5E,OAAO,EAAE,MAAM,CAAC;IAChB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC"}
@@ -1,10 +1,23 @@
1
- import { Connection, Libp2p } from '@olane/o-config';
1
+ /// <reference types="node" />
2
+ import { Connection } from '@olane/o-config';
2
3
  import { oConnectionConfig } from '@olane/o-core';
3
- import type { StreamReusePolicy } from '../stream-handler.config.js';
4
+ import { oNodeAddress } from '../../router';
4
5
  export interface oNodeConnectionConfig extends oConnectionConfig {
5
- p2pConnection: Connection;
6
- p2pNode?: Libp2p;
6
+ nextHopAddress: oNodeAddress;
7
+ callerAddress?: oNodeAddress;
8
+ targetAddress: oNodeAddress;
9
+ p2pConnection?: Connection;
7
10
  runOnLimitedConnection?: boolean;
8
- reusePolicy?: StreamReusePolicy;
11
+ /**
12
+ * Timeout in milliseconds for waiting for stream buffer to drain when backpressure occurs.
13
+ * Default: 30000 (30 seconds)
14
+ */
15
+ drainTimeoutMs?: number;
16
+ abortSignal?: AbortSignal;
17
+ /**
18
+ * Timeout in milliseconds for reading response data from a stream.
19
+ * Default: 120000 (2 minutes)
20
+ */
21
+ readTimeoutMs?: number;
9
22
  }
10
23
  //# sourceMappingURL=o-node-connection.config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"o-node-connection.config.d.ts","sourceRoot":"","sources":["../../../../src/connection/interfaces/o-node-connection.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE,MAAM,WAAW,qBAAsB,SAAQ,iBAAiB;IAC9D,aAAa,EAAE,UAAU,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,WAAW,CAAC,EAAE,iBAAiB,CAAC;CACjC"}
1
+ {"version":3,"file":"o-node-connection.config.d.ts","sourceRoot":"","sources":["../../../../src/connection/interfaces/o-node-connection.config.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAU,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,WAAW,qBAAsB,SAAQ,iBAAiB;IAC9D,cAAc,EAAE,YAAY,CAAC;IAC7B,aAAa,CAAC,EAAE,YAAY,CAAC;IAC7B,aAAa,EAAE,YAAY,CAAC;IAC5B,aAAa,CAAC,EAAE,UAAU,CAAC;IAC3B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB"}
@@ -1,16 +1,8 @@
1
+ /// <reference types="node" />
1
2
  import { oAddress } from '@olane/o-core';
2
- import { StreamReusePolicy } from '../stream-handler.config';
3
- /**
4
- * Stream type defines the role and usage pattern of a stream:
5
- * - 'dedicated-reader': Stream exclusively used for reading incoming requests (background reader)
6
- * - 'request-response': Stream used for outgoing request-response cycles
7
- * - 'general': Stream with no specific role (default, backward compatible)
8
- */
9
- export type StreamType = 'dedicated-reader' | 'request-response' | 'general';
10
3
  export interface oNodeStreamConfig {
11
- direction: 'inbound' | 'outbound';
12
- reusePolicy: StreamReusePolicy;
13
4
  remoteAddress: oAddress;
14
- streamType?: StreamType;
5
+ abortSignal?: AbortSignal;
6
+ limited?: boolean;
15
7
  }
16
8
  //# sourceMappingURL=o-node-stream.config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"o-node-stream.config.d.ts","sourceRoot":"","sources":["../../../../src/connection/interfaces/o-node-stream.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG,kBAAkB,GAAG,kBAAkB,GAAG,SAAS,CAAC;AAE7E,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,SAAS,GAAG,UAAU,CAAC;IAClC,WAAW,EAAE,iBAAiB,CAAC;IAC/B,aAAa,EAAE,QAAQ,CAAC;IACxB,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB"}
1
+ {"version":3,"file":"o-node-stream.config.d.ts","sourceRoot":"","sources":["../../../../src/connection/interfaces/o-node-stream.config.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,QAAQ,CAAC;IACxB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB"}
@@ -1,73 +1,49 @@
1
- import { Connection, Libp2p, Multiaddr } from '@olane/o-config';
2
- import { oAddress, oConnection, oRequest, oResponse } from '@olane/o-core';
1
+ /// <reference types="node" />
2
+ import { Connection, Multiaddr } from '@olane/o-config';
3
+ import { oAddress, oConnection, oRequest } from '@olane/o-core';
3
4
  import { oNodeConnectionConfig } from './interfaces/o-node-connection.config.js';
4
- import type { StreamReusePolicy } from './stream-handler.config.js';
5
- import { oNodeAddress } from '../router/o-node.address.js';
6
5
  import { oNodeStream } from './o-node-stream.js';
7
- import { oNodeStreamManager } from './o-node-stream.manager.js';
8
- interface CachedIdentifyData {
9
- protocols: string[];
10
- agentVersion?: string;
11
- protocolVersion?: string;
12
- listenAddrs: Multiaddr[];
13
- observedAddr?: Multiaddr;
14
- timestamp: number;
15
- }
6
+ import { oNodeStreamConfig } from './interfaces/o-node-stream.config.js';
7
+ import { AbortSignalConfig } from './interfaces/abort-signal.config.js';
8
+ import { EventEmitter } from 'events';
9
+ import { oNodeMessageEvent, oNodeMessageEventData } from './enums/o-node-message-event.js';
16
10
  export declare class oNodeConnection extends oConnection {
17
11
  protected readonly config: oNodeConnectionConfig;
18
12
  p2pConnection: Connection;
19
- protected reusePolicy: StreamReusePolicy;
20
- streamManager: oNodeStreamManager;
21
- protected p2pNode?: Libp2p;
22
- protected identifyData?: CachedIdentifyData;
23
- protected identifyListener?: (evt: any) => void;
13
+ protected streams: Map<string, oNodeStream>;
14
+ protected runOnLimitedConnection: boolean;
15
+ eventEmitter: EventEmitter;
24
16
  constructor(config: oNodeConnectionConfig);
17
+ listenForClose(): void;
18
+ get isOpen(): boolean;
25
19
  get remotePeerId(): import("@olane/o-config").PeerId;
26
20
  get remoteAddr(): Multiaddr;
27
21
  /**
28
22
  * Get the connection configuration for compatibility checking.
29
23
  */
30
24
  get connectionConfig(): oNodeConnectionConfig;
31
- supportsAddress(address: oNodeAddress): boolean;
32
- get streams(): oNodeStream[];
33
- /**
34
- * Get cached identify data for the remote peer.
35
- * Returns undefined if identify event hasn't been received yet.
36
- */
37
- get cachedIdentifyData(): CachedIdentifyData | undefined;
38
- /**
39
- * Get protocols supported by the remote peer from cached identify data.
40
- * Returns empty array if identify data not available yet.
41
- */
42
- get remoteProtocols(): string[];
43
- /**
44
- * Get agent version of the remote peer from cached identify data.
45
- */
46
- get remoteAgentVersion(): string | undefined;
47
- /**
48
- * Get protocol version of the remote peer from cached identify data.
49
- */
50
- get remoteProtocolVersion(): string | undefined;
51
- /**
52
- * Get listen addresses advertised by the remote peer.
53
- * Returns empty array if identify data not available yet.
54
- */
55
- get remoteListenAddrs(): Multiaddr[];
56
- /**
57
- * Get our observed address as seen by the remote peer.
58
- */
59
- get observedAddress(): Multiaddr | undefined;
60
25
  get address(): oAddress;
61
26
  get nextHopAddress(): oAddress;
62
27
  get callerAddress(): oAddress | undefined;
63
- transmit(request: oRequest): Promise<oResponse>;
28
+ newStream(config: oNodeStreamConfig): Promise<oNodeStream>;
29
+ listenForMessages(stream: oNodeStream, options: AbortSignalConfig): Promise<void>;
30
+ trackStream(stream: oNodeStream, options: AbortSignalConfig): void;
31
+ protected doSend(request: oRequest, options: AbortSignalConfig): Promise<oNodeStream>;
32
+ transmit(request: oRequest, options: AbortSignalConfig): Promise<oNodeStream>;
64
33
  postTransmit(stream: oNodeStream): Promise<void>;
65
- /**
66
- * Set up persistent listener for identify events from the remote peer
67
- */
68
- protected setupIdentifyListener(): void;
69
34
  abort(error: Error): Promise<void>;
70
35
  close(): Promise<void>;
36
+ /**
37
+ * Add event listener
38
+ */
39
+ on<K extends oNodeMessageEvent>(event: K | string, listener: (data: oNodeMessageEventData[K]) => void): void;
40
+ /**
41
+ * Remove event listener
42
+ */
43
+ off<K extends oNodeMessageEvent>(event: K | string, listener: (data: oNodeMessageEventData[K]) => void): void;
44
+ /**
45
+ * Emit event
46
+ */
47
+ private emit;
71
48
  }
72
- export {};
73
49
  //# sourceMappingURL=o-node-connection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"o-node-connection.d.ts","sourceRoot":"","sources":["../../../src/connection/o-node-connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAU,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAEL,QAAQ,EACR,WAAW,EAGX,QAAQ,EACR,SAAS,EACV,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AACjF,OAAO,KAAK,EAEV,iBAAiB,EAClB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEhE,UAAU,kBAAkB;IAC1B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,SAAS,EAAE,CAAC;IACzB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,eAAgB,SAAQ,WAAW;IAQlC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,qBAAqB;IAPrD,aAAa,EAAE,UAAU,CAAC;IACjC,SAAS,CAAC,WAAW,EAAE,iBAAiB,CAAC;IAClC,aAAa,EAAE,kBAAkB,CAAC;IACzC,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAC5C,SAAS,CAAC,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC;gBAEjB,MAAM,EAAE,qBAAqB;IAe5D,IAAI,YAAY,qCAEf;IAED,IAAI,UAAU,cAEb;IAED;;OAEG;IACH,IAAI,gBAAgB,IAAI,qBAAqB,CAE5C;IAED,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAM/C,IAAI,OAAO,IAAI,WAAW,EAAE,CAE3B;IAED;;;OAGG;IACH,IAAI,kBAAkB,IAAI,kBAAkB,GAAG,SAAS,CAEvD;IAED;;;OAGG;IACH,IAAI,eAAe,IAAI,MAAM,EAAE,CAE9B;IAED;;OAEG;IACH,IAAI,kBAAkB,IAAI,MAAM,GAAG,SAAS,CAE3C;IAED;;OAEG;IACH,IAAI,qBAAqB,IAAI,MAAM,GAAG,SAAS,CAE9C;IAED;;;OAGG;IACH,IAAI,iBAAiB,IAAI,SAAS,EAAE,CAEnC;IAED;;OAEG;IACH,IAAI,eAAe,IAAI,SAAS,GAAG,SAAS,CAE3C;IAED,IAAI,OAAO,IAAI,QAAQ,CActB;IAED,IAAI,cAAc,IAAI,QAAQ,CAK7B;IAED,IAAI,aAAa,IAAI,QAAQ,GAAG,SAAS,CAMxC;IAEK,QAAQ,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;IAkF/C,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtD;;OAEG;IACH,SAAS,CAAC,qBAAqB,IAAI,IAAI;IAsCjC,KAAK,CAAC,KAAK,EAAE,KAAK;IAMlB,KAAK;CAcZ"}
1
+ {"version":3,"file":"o-node-connection.d.ts","sourceRoot":"","sources":["../../../src/connection/o-node-connection.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAU,SAAS,EAAU,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAEL,QAAQ,EACR,WAAW,EAGX,QAAQ,EAET,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AAGjF,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACtB,MAAM,iCAAiC,CAAC;AAYzC,qBAAa,eAAgB,SAAQ,WAAW;IAMlC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,qBAAqB;IALrD,aAAa,EAAE,UAAU,CAAC;IACjC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAkC;IAC7E,SAAS,CAAC,sBAAsB,EAAE,OAAO,CAAC;IAC1C,YAAY,EAAE,YAAY,CAAsB;gBAEjB,MAAM,EAAE,qBAAqB;IAQ5D,cAAc;IAMd,IAAI,MAAM,YAET;IAED,IAAI,YAAY,qCAEf;IAED,IAAI,UAAU,cAEb;IAED;;OAEG;IACH,IAAI,gBAAgB,IAAI,qBAAqB,CAE5C;IAED,IAAI,OAAO,IAAI,QAAQ,CAEtB;IAED,IAAI,cAAc,IAAI,QAAQ,CAE7B;IAED,IAAI,aAAa,IAAI,QAAQ,GAAG,SAAS,CAMxC;IAEK,SAAS,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC;IA2B1D,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,iBAAiB;IAyBvE,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,iBAAiB;cAO3C,MAAM,CACpB,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,WAAW,CAAC;IAsBjB,QAAQ,CACZ,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,WAAW,CAAC;IAoBjB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,KAAK,CAAC,KAAK,EAAE,KAAK;IAMlB,KAAK;IAOX;;OAEG;IACH,EAAE,CAAC,CAAC,SAAS,iBAAiB,EAC5B,KAAK,EAAE,CAAC,GAAG,MAAM,EACjB,QAAQ,EAAE,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC,CAAC,KAAK,IAAI,GACjD,IAAI;IAIP;;OAEG;IACH,GAAG,CAAC,CAAC,SAAS,iBAAiB,EAC7B,KAAK,EAAE,CAAC,GAAG,MAAM,EACjB,QAAQ,EAAE,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC,CAAC,KAAK,IAAI,GACjD,IAAI;IAIP;;OAEG;IACH,OAAO,CAAC,IAAI;CAMb"}
@@ -1,19 +1,24 @@
1
1
  import { oConnection, oError, oErrorCodes, } from '@olane/o-core';
2
- import { oNodeAddress } from '../router/o-node.address.js';
3
- import { oNodeStreamManager } from './o-node-stream.manager.js';
2
+ import { oNodeStream } from './o-node-stream.js';
3
+ import { EventEmitter } from 'events';
4
+ import { oNodeMessageEvent, } from './enums/o-node-message-event.js';
4
5
  export class oNodeConnection extends oConnection {
5
6
  constructor(config) {
6
7
  super(config);
7
8
  this.config = config;
9
+ this.streams = new Map();
10
+ this.eventEmitter = new EventEmitter();
8
11
  this.p2pConnection = config.p2pConnection;
9
- this.reusePolicy = config.reusePolicy ?? 'none';
10
- this.p2pNode = config.p2pNode;
11
- // Initialize oNodeStreamManager (stream lifecycle and protocol management)
12
- this.streamManager = new oNodeStreamManager({
13
- p2pConnection: this.p2pConnection,
12
+ this.runOnLimitedConnection = config.runOnLimitedConnection ?? false;
13
+ this.listenForClose();
14
+ }
15
+ listenForClose() {
16
+ this.p2pConnection.addEventListener('close', () => {
17
+ this.close();
14
18
  });
15
- // Set up persistent identify event listener
16
- this.setupIdentifyListener();
19
+ }
20
+ get isOpen() {
21
+ return this.p2pConnection.status === 'open';
17
22
  }
18
23
  get remotePeerId() {
19
24
  return this.p2pConnection.remotePeer;
@@ -27,68 +32,10 @@ export class oNodeConnection extends oConnection {
27
32
  get connectionConfig() {
28
33
  return this.config;
29
34
  }
30
- supportsAddress(address) {
31
- return address.libp2pTransports.some((transport) => {
32
- return transport.toString() === this.remoteAddr.toString();
33
- });
34
- }
35
- get streams() {
36
- return this.streamManager.getAllStreams();
37
- }
38
- /**
39
- * Get cached identify data for the remote peer.
40
- * Returns undefined if identify event hasn't been received yet.
41
- */
42
- get cachedIdentifyData() {
43
- return this.identifyData;
44
- }
45
- /**
46
- * Get protocols supported by the remote peer from cached identify data.
47
- * Returns empty array if identify data not available yet.
48
- */
49
- get remoteProtocols() {
50
- return this.identifyData?.protocols || [];
51
- }
52
- /**
53
- * Get agent version of the remote peer from cached identify data.
54
- */
55
- get remoteAgentVersion() {
56
- return this.identifyData?.agentVersion;
57
- }
58
- /**
59
- * Get protocol version of the remote peer from cached identify data.
60
- */
61
- get remoteProtocolVersion() {
62
- return this.identifyData?.protocolVersion;
63
- }
64
- /**
65
- * Get listen addresses advertised by the remote peer.
66
- * Returns empty array if identify data not available yet.
67
- */
68
- get remoteListenAddrs() {
69
- return this.identifyData?.listenAddrs || [];
70
- }
71
- /**
72
- * Get our observed address as seen by the remote peer.
73
- */
74
- get observedAddress() {
75
- return this.identifyData?.observedAddr;
76
- }
77
35
  get address() {
78
- if (this.identifyData?.protocols &&
79
- this.identifyData.protocols.length > 0) {
80
- const filtered = this.identifyData.protocols.filter((p) => p.startsWith('/o/'));
81
- if (filtered.length > 0) {
82
- const remoteAddress = oNodeAddress.fromProtocol(filtered[0]);
83
- return remoteAddress;
84
- }
85
- }
86
- return this.config.address;
36
+ return this.config.targetAddress;
87
37
  }
88
38
  get nextHopAddress() {
89
- if (this.config.nextHopAddress.value === 'o://unknown') {
90
- return this.address;
91
- }
92
39
  return this.config.nextHopAddress;
93
40
  }
94
41
  get callerAddress() {
@@ -97,53 +44,77 @@ export class oNodeConnection extends oConnection {
97
44
  }
98
45
  return this.config.callerAddress;
99
46
  }
100
- async transmit(request) {
47
+ async newStream(config) {
48
+ const protocol = config.remoteAddress.protocol;
49
+ this.logger.debug('Creating new stream', {
50
+ protocol,
51
+ currentStreamCount: this.streams.size,
52
+ });
53
+ // Create stream from libp2p connection
54
+ const stream = await this.p2pConnection.newStream(protocol, {
55
+ signal: config.abortSignal,
56
+ maxOutboundStreams: 1000,
57
+ runOnLimitedConnection: this.runOnLimitedConnection,
58
+ });
59
+ // Wrap in oNodeStream with metadata
60
+ const wrappedStream = new oNodeStream(stream, config);
61
+ this.logger.debug('Stream created', {
62
+ streamId: stream.id,
63
+ protocol,
64
+ totalStreams: this.streams.size,
65
+ });
66
+ return wrappedStream;
67
+ }
68
+ // bubble up the messages to the request handler
69
+ async listenForMessages(stream, options) {
101
70
  try {
102
- // Build protocol string
103
- const protocol = this.nextHopAddress.protocol +
104
- (this.reusePolicy === 'reuse' ? '/reuse' : '');
105
- this.logger.debug('Transmitting request on limited connection?', this.config.runOnLimitedConnection);
106
- const streamConfig = {
107
- signal: this.abortSignal,
108
- drainTimeoutMs: this.config.drainTimeoutMs,
109
- reusePolicy: this.reusePolicy,
110
- maxOutboundStreams: process.env.MAX_OUTBOUND_STREAMS
111
- ? parseInt(process.env.MAX_OUTBOUND_STREAMS)
112
- : 1000,
113
- runOnLimitedConnection: this.config.runOnLimitedConnection ?? false,
114
- };
115
- // Get stream from StreamManager
116
- const wrappedStream = await this.streamManager.getOrCreateStream(protocol, this.nextHopAddress, streamConfig);
117
- // Ensure stream is valid
118
- wrappedStream.validate();
119
- const stream = wrappedStream.p2pStream;
120
- // Send the request with backpressure handling
121
- const data = new TextEncoder().encode(request.toString());
122
- await this.streamManager.sendLengthPrefixed(stream, data, streamConfig);
123
- // Determine which stream to wait for response on
124
- // If _streamId is specified, use that stream (for limited connections with persistent writer stream)
125
- let responseStream = stream;
126
- if (request.params._streamId) {
127
- const specifiedStream = this.streamManager.getStreamById(request.params._streamId);
128
- if (specifiedStream) {
129
- responseStream = specifiedStream;
130
- this.logger.debug('Using specified stream for response', {
131
- requestStreamId: stream.id,
132
- responseStreamId: specifiedStream.id,
133
- });
71
+ stream.on(oNodeMessageEvent.request, (data) => {
72
+ this.emit(oNodeMessageEvent.request, data);
73
+ });
74
+ stream.on(oNodeMessageEvent.response, (data) => {
75
+ this.emit(oNodeMessageEvent.response, data);
76
+ });
77
+ stream.p2pStream.addEventListener('close', () => {
78
+ if (this.streams.has(stream.id)) {
79
+ this.streams.delete(stream.id);
134
80
  }
135
- else {
136
- this.logger.warn('Specified response stream not found, using request stream', {
137
- streamId: request.params._streamId,
138
- });
139
- }
140
- }
141
- // Handle response using StreamManager
142
- // Pass request ID to enable proper response correlation on shared streams
143
- const response = await this.streamManager.handleOutgoingStream(responseStream, this.emitter, streamConfig, request.id);
81
+ });
82
+ await stream.listen(options);
83
+ }
84
+ catch (err) {
85
+ this.logger.warn('Stream errored out when listening for key messages:', err?.message);
86
+ }
87
+ }
88
+ trackStream(stream, options) {
89
+ this.streams.set(stream.id, stream);
90
+ this.logger.debug('Stream count: ' + this.streams.size);
91
+ // persistent listener
92
+ this.listenForMessages(stream, options);
93
+ }
94
+ async doSend(request, options) {
95
+ try {
96
+ // create a new stream and send the payload
97
+ const wrappedStream = await this.newStream({
98
+ remoteAddress: this.nextHopAddress,
99
+ limited: this.runOnLimitedConnection,
100
+ ...options,
101
+ });
102
+ this.trackStream(wrappedStream, options);
103
+ await wrappedStream.send(request, options);
104
+ return wrappedStream;
105
+ }
106
+ catch (err) {
107
+ this.logger.error('Failed to send request over stream.', err);
108
+ throw new oError(oErrorCodes.SEND_FAILED, 'Failed to send request over stream.', { request: request.toJSON() });
109
+ }
110
+ }
111
+ async transmit(request, options) {
112
+ try {
113
+ this.logger.debug('Transmitting request on limited connection?', this.config.runOnLimitedConnection);
114
+ const stream = await this.doSend(request, options);
144
115
  // Handle cleanup of the stream
145
- await this.postTransmit(wrappedStream);
146
- return response;
116
+ await this.postTransmit(stream);
117
+ return stream;
147
118
  }
148
119
  catch (error) {
149
120
  if (error?.name === 'UnsupportedProtocolError') {
@@ -153,37 +124,7 @@ export class oNodeConnection extends oConnection {
153
124
  }
154
125
  }
155
126
  async postTransmit(stream) {
156
- // Always cleanup streams (no reuse at base layer)
157
- await this.streamManager.releaseStream(stream.p2pStream.id);
158
- }
159
- /**
160
- * Set up persistent listener for identify events from the remote peer
161
- */
162
- setupIdentifyListener() {
163
- if (!this.p2pNode) {
164
- return;
165
- }
166
- this.identifyListener = (evt) => {
167
- const { peerId, protocols, agentVersion, protocolVersion, listenAddrs, observedAddr, } = evt.detail;
168
- // Only cache if this event is for our remote peer
169
- if (peerId?.toString() === this.remotePeerId.toString()) {
170
- this.identifyData = {
171
- protocols: protocols || [],
172
- agentVersion,
173
- protocolVersion,
174
- listenAddrs: listenAddrs || [],
175
- observedAddr,
176
- timestamp: Date.now(),
177
- };
178
- this.logger.debug('Cached identify data for peer', {
179
- peerId: peerId.toString(),
180
- protocols: this.identifyData.protocols,
181
- agentVersion: this.identifyData.agentVersion,
182
- });
183
- }
184
- };
185
- this.p2pNode.addEventListener('peer:identify', this.identifyListener);
186
- this.logger.debug('Identify listener set up for connection');
127
+ // after transmit, let's just leave this connection open for now
187
128
  }
188
129
  async abort(error) {
189
130
  this.logger.debug('Aborting connection');
@@ -192,13 +133,25 @@ export class oNodeConnection extends oConnection {
192
133
  }
193
134
  async close() {
194
135
  this.logger.debug('Closing connection');
195
- // Remove identify listener
196
- if (this.p2pNode && this.identifyListener) {
197
- this.p2pNode.removeEventListener('peer:identify', this.identifyListener);
198
- }
199
- // Close stream manager (handles all stream cleanup)
200
- await this.streamManager.close();
201
136
  await this.p2pConnection.close();
202
137
  this.logger.debug('Connection closed');
203
138
  }
139
+ /**
140
+ * Add event listener
141
+ */
142
+ on(event, listener) {
143
+ this.eventEmitter.on(event, listener);
144
+ }
145
+ /**
146
+ * Remove event listener
147
+ */
148
+ off(event, listener) {
149
+ this.eventEmitter.off(event, listener);
150
+ }
151
+ /**
152
+ * Emit event
153
+ */
154
+ emit(event, data) {
155
+ this.eventEmitter.emit(event, data);
156
+ }
204
157
  }
@@ -1,7 +1,11 @@
1
- import { oAddress, oConnectionConfig, oConnectionManager } from '@olane/o-core';
2
- import { Libp2p, Connection } from '@olane/o-config';
1
+ /// <reference types="node" />
2
+ import { oAddress, oConnectionManager } from '@olane/o-core';
3
+ import { Libp2p, Connection, Stream } from '@olane/o-config';
3
4
  import { oNodeConnectionManagerConfig } from './interfaces/o-node-connection-manager.config.js';
5
+ import { oNodeAddress } from '../router/o-node.address.js';
4
6
  import { oNodeConnection } from './o-node-connection.js';
7
+ import { EventEmitter } from 'events';
8
+ import { oNodeConnectionConfig } from './interfaces/o-node-connection.config.js';
5
9
  /**
6
10
  * Manages oNodeConnection instances, reusing connections when possible.
7
11
  */
@@ -13,6 +17,7 @@ export declare class oNodeConnectionManager extends oConnectionManager {
13
17
  /** Single cache of oNodeConnection instances keyed by address */
14
18
  protected cachedConnections: Map<string, oNodeConnection>;
15
19
  protected pendingDialsByAddress: Map<string, Promise<Connection>>;
20
+ protected eventEmitter: EventEmitter;
16
21
  constructor(config: oNodeConnectionManagerConfig);
17
22
  /**
18
23
  * Set up listeners to maintain connection cache state
@@ -36,16 +41,15 @@ export declare class oNodeConnectionManager extends oConnectionManager {
36
41
  */
37
42
  protected getOrCreateP2pConnection(nextHopAddress: oAddress, addressKey: string): Promise<Connection>;
38
43
  protected performDial(nextHopAddress: oAddress, addressKey: string): Promise<Connection>;
39
- answer(config: oConnectionConfig & {
40
- p2pConnection: Connection;
41
- reuse?: boolean;
42
- }): Promise<oNodeConnection>;
43
- getConnectionFromAddress(address: oAddress): oNodeConnection | null;
44
+ createConnection(config: oNodeConnectionConfig): Promise<oNodeConnection>;
45
+ answer(config: oNodeConnectionConfig, stream: Stream): Promise<oNodeConnection>;
44
46
  /**
45
47
  * Connect to a given address, reusing oNodeConnection when possible
46
48
  * @param config - Connection configuration
47
49
  * @returns The connection object
48
50
  */
49
- connect(config: oConnectionConfig): Promise<oNodeConnection>;
51
+ connect(config: oNodeConnectionConfig): Promise<oNodeConnection>;
52
+ getCachedConnectionFromAddress(address: oNodeAddress): oNodeConnection | null;
53
+ get connectionCount(): number;
50
54
  }
51
55
  //# sourceMappingURL=o-node-connection.manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"o-node-connection.manager.d.ts","sourceRoot":"","sources":["../../../src/connection/o-node-connection.manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,4BAA4B,EAAE,MAAM,kDAAkD,CAAC;AAEhG,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,kBAAkB;IAQhD,QAAQ,CAAC,MAAM,EAAE,4BAA4B;IAPzD,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACxC,SAAS,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IACzC,iEAAiE;IACjE,SAAS,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAa;IACtE,SAAS,CAAC,qBAAqB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAa;gBAEzD,MAAM,EAAE,4BAA4B;IAWzD;;OAEG;IACH,SAAS,CAAC,wBAAwB,IAAI,IAAI;IAY1C;;;;OAIG;IACH,SAAS,CAAC,oBAAoB,CAAC,OAAO,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI;IAahE;;;;OAIG;IACH,SAAS,CAAC,eAAe,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI;IAWtD;;;OAGG;cACa,wBAAwB,CACtC,cAAc,EAAE,QAAQ,EACxB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,UAAU,CAAC;cAoBN,WAAW,CACzB,cAAc,EAAE,QAAQ,EACxB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,UAAU,CAAC;IAqBhB,MAAM,CACV,MAAM,EAAE,iBAAiB,GAAG;QAAE,aAAa,EAAE,UAAU,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GACzE,OAAO,CAAC,eAAe,CAAC;IAgD3B,wBAAwB,CAAC,OAAO,EAAE,QAAQ,GAAG,eAAe,GAAG,IAAI;IAkBnE;;;;OAIG;IACG,OAAO,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC;CAqDnE"}
1
+ {"version":3,"file":"o-node-connection.manager.d.ts","sourceRoot":"","sources":["../../../src/connection/o-node-connection.manager.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAqB,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,kDAAkD,CAAC;AAChG,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AAGjF;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,kBAAkB;IAShD,QAAQ,CAAC,MAAM,EAAE,4BAA4B;IARzD,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACxC,SAAS,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IACzC,iEAAiE;IACjE,SAAS,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAa;IACtE,SAAS,CAAC,qBAAqB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAa;IAC9E,SAAS,CAAC,YAAY,EAAE,YAAY,CAAsB;gBAErC,MAAM,EAAE,4BAA4B;IAWzD;;OAEG;IACH,SAAS,CAAC,wBAAwB,IAAI,IAAI;IAY1C;;;;OAIG;IACH,SAAS,CAAC,oBAAoB,CAAC,OAAO,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI;IAahE;;;;OAIG;IACH,SAAS,CAAC,eAAe,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI;IAYtD;;;OAGG;cACa,wBAAwB,CACtC,cAAc,EAAE,QAAQ,EACxB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,UAAU,CAAC;cAoBN,WAAW,CACzB,cAAc,EAAE,QAAQ,EACxB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,UAAU,CAAC;IAqBhB,gBAAgB,CACpB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,eAAe,CAAC;IAIrB,MAAM,CACV,MAAM,EAAE,qBAAqB,EAC7B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,eAAe,CAAC;IAgE3B;;;;OAIG;IACG,OAAO,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC;IA0DtE,8BAA8B,CAC5B,OAAO,EAAE,YAAY,GACpB,eAAe,GAAG,IAAI;IAgBzB,IAAI,eAAe,WAElB;CACF"}