@olane/o-node 0.7.12-alpha.4 → 0.7.12-alpha.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/o-core/src/connection/index.d.ts +8 -0
- package/dist/o-core/src/connection/index.d.ts.map +1 -0
- package/dist/o-core/src/connection/index.js +7 -0
- package/dist/o-core/src/connection/interfaces/connection-manager.config.d.ts +15 -0
- package/dist/o-core/src/connection/interfaces/connection-manager.config.d.ts.map +1 -0
- package/dist/o-core/src/connection/interfaces/connection-manager.config.js +1 -0
- package/dist/o-core/src/connection/interfaces/connection-send-params.interface.d.ts +9 -0
- package/dist/o-core/src/connection/interfaces/connection-send-params.interface.d.ts.map +1 -0
- package/dist/o-core/src/connection/interfaces/connection-send-params.interface.js +1 -0
- package/dist/o-core/src/connection/interfaces/connection.config.d.ts +20 -0
- package/dist/o-core/src/connection/interfaces/connection.config.d.ts.map +1 -0
- package/dist/o-core/src/connection/interfaces/connection.config.js +1 -0
- package/dist/o-core/src/connection/interfaces/index.d.ts +5 -0
- package/dist/o-core/src/connection/interfaces/index.d.ts.map +1 -0
- package/dist/o-core/src/connection/interfaces/index.js +4 -0
- package/dist/o-core/src/connection/interfaces/request-state.enum.d.ts +7 -0
- package/dist/o-core/src/connection/interfaces/request-state.enum.d.ts.map +1 -0
- package/dist/o-core/src/connection/interfaces/request-state.enum.js +7 -0
- package/dist/o-core/src/connection/o-connection-manager.d.ts +19 -0
- package/dist/o-core/src/connection/o-connection-manager.d.ts.map +1 -0
- package/dist/o-core/src/connection/o-connection-manager.js +27 -0
- package/dist/o-core/src/connection/o-connection.d.ts +26 -0
- package/dist/o-core/src/connection/o-connection.d.ts.map +1 -0
- package/dist/o-core/src/connection/o-connection.js +54 -0
- package/dist/o-core/src/connection/o-request.d.ts +23 -0
- package/dist/o-core/src/connection/o-request.d.ts.map +1 -0
- package/dist/o-core/src/connection/o-request.js +42 -0
- package/dist/o-core/src/connection/o-response.d.ts +13 -0
- package/dist/o-core/src/connection/o-response.d.ts.map +1 -0
- package/dist/o-core/src/connection/o-response.js +25 -0
- package/dist/o-core/src/core/defaults/config.d.ts +4 -0
- package/dist/o-core/src/core/defaults/config.d.ts.map +1 -0
- package/dist/o-core/src/core/defaults/config.js +5 -0
- package/dist/o-core/src/core/defaults/index.d.ts +2 -0
- package/dist/o-core/src/core/defaults/index.d.ts.map +1 -0
- package/dist/o-core/src/core/defaults/index.js +1 -0
- package/dist/o-core/src/core/graceful-shutdown.d.ts +25 -0
- package/dist/o-core/src/core/graceful-shutdown.d.ts.map +1 -0
- package/dist/o-core/src/core/graceful-shutdown.js +84 -0
- package/dist/o-core/src/core/index.d.ts +9 -0
- package/dist/o-core/src/core/index.d.ts.map +1 -0
- package/dist/o-core/src/core/index.js +8 -0
- package/dist/o-core/src/core/interfaces/index.d.ts +7 -0
- package/dist/o-core/src/core/interfaces/index.d.ts.map +1 -0
- package/dist/o-core/src/core/interfaces/index.js +6 -0
- package/dist/o-core/src/core/interfaces/node-type.enum.d.ts +10 -0
- package/dist/o-core/src/core/interfaces/node-type.enum.d.ts.map +1 -0
- package/dist/o-core/src/core/interfaces/node-type.enum.js +10 -0
- package/dist/o-core/src/core/interfaces/o-core.config.d.ts +23 -0
- package/dist/o-core/src/core/interfaces/o-core.config.d.ts.map +1 -0
- package/dist/o-core/src/core/interfaces/o-core.config.js +1 -0
- package/dist/o-core/src/core/interfaces/o-core.interface.d.ts +18 -0
- package/dist/o-core/src/core/interfaces/o-core.interface.d.ts.map +1 -0
- package/dist/o-core/src/core/interfaces/o-core.interface.js +1 -0
- package/dist/o-core/src/core/interfaces/state.enum.d.ts +8 -0
- package/dist/o-core/src/core/interfaces/state.enum.d.ts.map +1 -0
- package/dist/o-core/src/core/interfaces/state.enum.js +8 -0
- package/dist/o-core/src/core/interfaces/use-options.interface.d.ts +11 -0
- package/dist/o-core/src/core/interfaces/use-options.interface.d.ts.map +1 -0
- package/dist/o-core/src/core/interfaces/use-options.interface.js +1 -0
- package/dist/o-core/src/core/interfaces/use-stream-options.interface.d.ts +4 -0
- package/dist/o-core/src/core/interfaces/use-stream-options.interface.d.ts.map +1 -0
- package/dist/o-core/src/core/interfaces/use-stream-options.interface.js +1 -0
- package/dist/o-core/src/core/lib/events/connection-events.d.ts +31 -0
- package/dist/o-core/src/core/lib/events/connection-events.d.ts.map +1 -0
- package/dist/o-core/src/core/lib/events/connection-events.js +46 -0
- package/dist/o-core/src/core/lib/events/hierarchy-events.d.ts +69 -0
- package/dist/o-core/src/core/lib/events/hierarchy-events.d.ts.map +1 -0
- package/dist/o-core/src/core/lib/events/hierarchy-events.js +100 -0
- package/dist/o-core/src/core/lib/events/index.d.ts +6 -0
- package/dist/o-core/src/core/lib/events/index.d.ts.map +1 -0
- package/dist/o-core/src/core/lib/events/index.js +5 -0
- package/dist/o-core/src/core/lib/events/node-events.d.ts +40 -0
- package/dist/o-core/src/core/lib/events/node-events.d.ts.map +1 -0
- package/dist/o-core/src/core/lib/events/node-events.js +58 -0
- package/dist/o-core/src/core/lib/events/o-notification-event.d.ts +26 -0
- package/dist/o-core/src/core/lib/events/o-notification-event.d.ts.map +1 -0
- package/dist/o-core/src/core/lib/events/o-notification-event.js +30 -0
- package/dist/o-core/src/core/lib/index.d.ts +8 -0
- package/dist/o-core/src/core/lib/index.d.ts.map +1 -0
- package/dist/o-core/src/core/lib/index.js +7 -0
- package/dist/o-core/src/core/lib/interfaces/notification-types.d.ts +49 -0
- package/dist/o-core/src/core/lib/interfaces/notification-types.d.ts.map +1 -0
- package/dist/o-core/src/core/lib/interfaces/notification-types.js +1 -0
- package/dist/o-core/src/core/lib/o-hierarchy.manager.d.ts +24 -0
- package/dist/o-core/src/core/lib/o-hierarchy.manager.d.ts.map +1 -0
- package/dist/o-core/src/core/lib/o-hierarchy.manager.js +58 -0
- package/dist/o-core/src/core/lib/o-metrics.d.ts +5 -0
- package/dist/o-core/src/core/lib/o-metrics.d.ts.map +1 -0
- package/dist/o-core/src/core/lib/o-metrics.js +6 -0
- package/dist/o-core/src/core/lib/o-notification.manager.d.ts +58 -0
- package/dist/o-core/src/core/lib/o-notification.manager.d.ts.map +1 -0
- package/dist/o-core/src/core/lib/o-notification.manager.js +159 -0
- package/dist/o-core/src/core/lib/o-request.manager.d.ts +10 -0
- package/dist/o-core/src/core/lib/o-request.manager.d.ts.map +1 -0
- package/dist/o-core/src/core/lib/o-request.manager.js +18 -0
- package/dist/o-core/src/core/lib/utils/event-filters.d.ts +38 -0
- package/dist/o-core/src/core/lib/utils/event-filters.d.ts.map +1 -0
- package/dist/o-core/src/core/lib/utils/event-filters.js +159 -0
- package/dist/o-core/src/core/o-core.d.ts +240 -0
- package/dist/o-core/src/core/o-core.d.ts.map +1 -0
- package/dist/o-core/src/core/o-core.js +463 -0
- package/dist/o-core/src/core/o-dependency.d.ts +9 -0
- package/dist/o-core/src/core/o-dependency.d.ts.map +1 -0
- package/dist/o-core/src/core/o-dependency.js +15 -0
- package/dist/o-core/src/core/o-object.d.ts +7 -0
- package/dist/o-core/src/core/o-object.d.ts.map +1 -0
- package/dist/o-core/src/core/o-object.js +10 -0
- package/dist/o-core/src/core/o-parameter.d.ts +12 -0
- package/dist/o-core/src/core/o-parameter.d.ts.map +1 -0
- package/dist/o-core/src/core/o-parameter.js +21 -0
- package/dist/o-core/src/error/enums/codes.error.d.ts +20 -0
- package/dist/o-core/src/error/enums/codes.error.d.ts.map +1 -0
- package/dist/o-core/src/error/enums/codes.error.js +20 -0
- package/dist/o-core/src/error/index.d.ts +3 -0
- package/dist/o-core/src/error/index.d.ts.map +1 -0
- package/dist/o-core/src/error/index.js +2 -0
- package/dist/o-core/src/error/interfaces/o-error.interface.d.ts +6 -0
- package/dist/o-core/src/error/interfaces/o-error.interface.d.ts.map +1 -0
- package/dist/o-core/src/error/interfaces/o-error.interface.js +1 -0
- package/dist/o-core/src/error/o-error.d.ts +15 -0
- package/dist/o-core/src/error/o-error.d.ts.map +1 -0
- package/dist/o-core/src/error/o-error.js +27 -0
- package/dist/o-core/src/index.d.ts +8 -0
- package/dist/o-core/src/index.d.ts.map +1 -0
- package/dist/o-core/src/index.js +7 -0
- package/dist/o-core/src/response/index.d.ts +2 -0
- package/dist/o-core/src/response/index.d.ts.map +1 -0
- package/dist/o-core/src/response/index.js +1 -0
- package/dist/o-core/src/response/response-builder.d.ts +140 -0
- package/dist/o-core/src/response/response-builder.d.ts.map +1 -0
- package/dist/o-core/src/response/response-builder.js +190 -0
- package/dist/o-core/src/router/enums/restricted-addresses.enum.d.ts +8 -0
- package/dist/o-core/src/router/enums/restricted-addresses.enum.d.ts.map +1 -0
- package/dist/o-core/src/router/enums/restricted-addresses.enum.js +13 -0
- package/dist/o-core/src/router/index.d.ts +11 -0
- package/dist/o-core/src/router/index.d.ts.map +1 -0
- package/dist/o-core/src/router/index.js +10 -0
- package/dist/o-core/src/router/interfaces/resolve.request.d.ts +10 -0
- package/dist/o-core/src/router/interfaces/resolve.request.d.ts.map +1 -0
- package/dist/o-core/src/router/interfaces/resolve.request.js +1 -0
- package/dist/o-core/src/router/interfaces/route.response.d.ts +8 -0
- package/dist/o-core/src/router/interfaces/route.response.d.ts.map +1 -0
- package/dist/o-core/src/router/interfaces/route.response.js +1 -0
- package/dist/o-core/src/router/o-address-resolver.d.ts +14 -0
- package/dist/o-core/src/router/o-address-resolver.d.ts.map +1 -0
- package/dist/o-core/src/router/o-address-resolver.js +19 -0
- package/dist/o-core/src/router/o-address.d.ts +33 -0
- package/dist/o-core/src/router/o-address.d.ts.map +1 -0
- package/dist/o-core/src/router/o-address.js +114 -0
- package/dist/o-core/src/router/o-request-preparation.d.ts +37 -0
- package/dist/o-core/src/router/o-request-preparation.d.ts.map +1 -0
- package/dist/o-core/src/router/o-request-preparation.js +75 -0
- package/dist/o-core/src/router/o-request.router.d.ts +18 -0
- package/dist/o-core/src/router/o-request.router.d.ts.map +1 -0
- package/dist/o-core/src/router/o-request.router.js +12 -0
- package/dist/o-core/src/router/o-resolver-chain.d.ts +32 -0
- package/dist/o-core/src/router/o-resolver-chain.d.ts.map +1 -0
- package/dist/o-core/src/router/o-resolver-chain.js +62 -0
- package/dist/o-core/src/router/o-router.d.ts +19 -0
- package/dist/o-core/src/router/o-router.d.ts.map +1 -0
- package/dist/o-core/src/router/o-router.js +14 -0
- package/dist/o-core/src/router/o-routing-policy.d.ts +36 -0
- package/dist/o-core/src/router/o-routing-policy.d.ts.map +1 -0
- package/dist/o-core/src/router/o-routing-policy.js +19 -0
- package/dist/o-core/src/streaming/index.d.ts +11 -0
- package/dist/o-core/src/streaming/index.d.ts.map +1 -0
- package/dist/o-core/src/streaming/index.js +14 -0
- package/dist/o-core/src/streaming/protocol-builder.d.ts +62 -0
- package/dist/o-core/src/streaming/protocol-builder.d.ts.map +1 -0
- package/dist/o-core/src/streaming/protocol-builder.js +93 -0
- package/dist/o-core/src/streaming/stream-config.d.ts +36 -0
- package/dist/o-core/src/streaming/stream-config.d.ts.map +1 -0
- package/dist/o-core/src/streaming/stream-config.js +19 -0
- package/dist/o-core/src/streaming/stream-handler.base.d.ts +85 -0
- package/dist/o-core/src/streaming/stream-handler.base.d.ts.map +1 -0
- package/dist/o-core/src/streaming/stream-handler.base.js +112 -0
- package/dist/o-core/src/streaming/stream-transport.interface.d.ts +61 -0
- package/dist/o-core/src/streaming/stream-transport.interface.d.ts.map +1 -0
- package/dist/o-core/src/streaming/stream-transport.interface.js +10 -0
- package/dist/o-core/src/transports/custom.transport.d.ts +6 -0
- package/dist/o-core/src/transports/custom.transport.d.ts.map +1 -0
- package/dist/o-core/src/transports/custom.transport.js +10 -0
- package/dist/o-core/src/transports/index.d.ts +4 -0
- package/dist/o-core/src/transports/index.d.ts.map +1 -0
- package/dist/o-core/src/transports/index.js +3 -0
- package/dist/o-core/src/transports/interfaces/transport-type.enum.d.ts +5 -0
- package/dist/o-core/src/transports/interfaces/transport-type.enum.d.ts.map +1 -0
- package/dist/o-core/src/transports/interfaces/transport-type.enum.js +5 -0
- package/dist/o-core/src/transports/o-transport.d.ts +10 -0
- package/dist/o-core/src/transports/o-transport.d.ts.map +1 -0
- package/dist/o-core/src/transports/o-transport.js +16 -0
- package/dist/o-core/src/utils/core.utils.d.ts +34 -0
- package/dist/o-core/src/utils/core.utils.d.ts.map +1 -0
- package/dist/o-core/src/utils/core.utils.js +123 -0
- package/dist/o-core/src/utils/index.d.ts +6 -0
- package/dist/o-core/src/utils/index.d.ts.map +1 -0
- package/dist/o-core/src/utils/index.js +5 -0
- package/dist/o-core/src/utils/logger.d.ts +14 -0
- package/dist/o-core/src/utils/logger.d.ts.map +1 -0
- package/dist/o-core/src/utils/logger.js +31 -0
- package/dist/o-core/src/utils/object.utils.d.ts +5 -0
- package/dist/o-core/src/utils/object.utils.d.ts.map +1 -0
- package/dist/o-core/src/utils/object.utils.js +23 -0
- package/dist/o-core/src/utils/regex.utils.d.ts +4 -0
- package/dist/o-core/src/utils/regex.utils.d.ts.map +1 -0
- package/dist/o-core/src/utils/regex.utils.js +13 -0
- package/dist/o-core/src/utils/remote.utils.d.ts +4 -0
- package/dist/o-core/src/utils/remote.utils.d.ts.map +1 -0
- package/dist/o-core/src/utils/remote.utils.js +5 -0
- package/dist/o-core/src/utils/streaming.utils.d.ts +22 -0
- package/dist/o-core/src/utils/streaming.utils.d.ts.map +1 -0
- package/dist/o-core/src/utils/streaming.utils.js +45 -0
- package/dist/o-node/src/connection/index.d.ts +5 -0
- package/dist/o-node/src/connection/index.d.ts.map +1 -0
- package/dist/o-node/src/connection/index.js +4 -0
- package/dist/o-node/src/connection/interfaces/o-node-connection-manager.config.d.ts +6 -0
- package/dist/o-node/src/connection/interfaces/o-node-connection-manager.config.d.ts.map +1 -0
- package/dist/o-node/src/connection/interfaces/o-node-connection-manager.config.js +1 -0
- package/dist/o-node/src/connection/interfaces/o-node-connection.config.d.ts +6 -0
- package/dist/o-node/src/connection/interfaces/o-node-connection.config.d.ts.map +1 -0
- package/dist/o-node/src/connection/interfaces/o-node-connection.config.js +1 -0
- package/dist/o-node/src/connection/o-node-connection.d.ts +13 -0
- package/dist/o-node/src/connection/o-node-connection.d.ts.map +1 -0
- package/dist/o-node/src/connection/o-node-connection.js +93 -0
- package/dist/o-node/src/connection/o-node-connection.manager.d.ts +19 -0
- package/dist/o-node/src/connection/o-node-connection.manager.d.ts.map +1 -0
- package/dist/o-node/src/connection/o-node-connection.manager.js +65 -0
- package/dist/o-node/src/connection/o-stream.request.d.ts +11 -0
- package/dist/o-node/src/connection/o-stream.request.d.ts.map +1 -0
- package/dist/o-node/src/connection/o-stream.request.js +7 -0
- package/dist/o-node/src/index.d.ts +12 -0
- package/dist/o-node/src/index.d.ts.map +1 -0
- package/dist/o-node/src/index.js +11 -0
- package/dist/o-node/src/interfaces/i-heartbeatable-node.d.ts +49 -0
- package/dist/o-node/src/interfaces/i-heartbeatable-node.d.ts.map +1 -0
- package/dist/o-node/src/interfaces/i-heartbeatable-node.js +1 -0
- package/dist/o-node/src/interfaces/i-reconnectable-node.d.ts +46 -0
- package/dist/o-node/src/interfaces/i-reconnectable-node.d.ts.map +1 -0
- package/dist/o-node/src/interfaces/i-reconnectable-node.js +1 -0
- package/dist/o-node/src/interfaces/o-node.config.d.ts +49 -0
- package/dist/o-node/src/interfaces/o-node.config.d.ts.map +1 -0
- package/dist/o-node/src/interfaces/o-node.config.js +1 -0
- package/dist/o-node/src/interfaces/o-node.tool-config.d.ts +4 -0
- package/dist/o-node/src/interfaces/o-node.tool-config.d.ts.map +1 -0
- package/dist/o-node/src/interfaces/o-node.tool-config.js +1 -0
- package/dist/o-node/src/lib/network-activity.lib.d.ts +1 -0
- package/dist/o-node/src/lib/network-activity.lib.d.ts.map +1 -0
- package/dist/o-node/src/lib/network-activity.lib.js +34 -0
- package/dist/o-node/src/managers/o-connection-heartbeat.manager.d.ts +63 -0
- package/dist/o-node/src/managers/o-connection-heartbeat.manager.d.ts.map +1 -0
- package/dist/o-node/src/managers/o-connection-heartbeat.manager.js +227 -0
- package/dist/o-node/src/managers/o-reconnection.manager.d.ts +51 -0
- package/dist/o-node/src/managers/o-reconnection.manager.d.ts.map +1 -0
- package/dist/o-node/src/managers/o-reconnection.manager.js +266 -0
- package/dist/o-node/src/nodes/client.node.d.ts +7 -0
- package/dist/o-node/src/nodes/client.node.d.ts.map +1 -0
- package/dist/o-node/src/nodes/client.node.js +16 -0
- package/dist/o-node/src/nodes/index.d.ts +4 -0
- package/dist/o-node/src/nodes/index.d.ts.map +1 -0
- package/dist/o-node/src/nodes/index.js +3 -0
- package/dist/o-node/src/nodes/server.node.d.ts +7 -0
- package/dist/o-node/src/nodes/server.node.d.ts.map +1 -0
- package/dist/o-node/src/nodes/server.node.js +20 -0
- package/dist/o-node/src/nodes/websocket.node.d.ts +7 -0
- package/dist/o-node/src/nodes/websocket.node.d.ts.map +1 -0
- package/dist/o-node/src/nodes/websocket.node.js +18 -0
- package/dist/o-node/src/o-node.d.ts +72 -0
- package/dist/o-node/src/o-node.d.ts.map +1 -0
- package/dist/o-node/src/o-node.hierarchy-manager.d.ts +15 -0
- package/dist/o-node/src/o-node.hierarchy-manager.d.ts.map +1 -0
- package/dist/o-node/src/o-node.hierarchy-manager.js +15 -0
- package/dist/o-node/src/o-node.js +493 -0
- package/dist/o-node/src/o-node.notification-manager.d.ts +52 -0
- package/dist/o-node/src/o-node.notification-manager.d.ts.map +1 -0
- package/dist/o-node/src/o-node.notification-manager.js +188 -0
- package/dist/o-node/src/o-node.tool.d.ts +18 -0
- package/dist/o-node/src/o-node.tool.d.ts.map +1 -0
- package/dist/o-node/src/o-node.tool.js +83 -0
- package/dist/o-node/src/router/index.d.ts +6 -0
- package/dist/o-node/src/router/index.d.ts.map +1 -0
- package/dist/o-node/src/router/index.js +5 -0
- package/dist/o-node/src/router/interfaces/o-node-router.config.d.ts +3 -0
- package/dist/o-node/src/router/interfaces/o-node-router.config.d.ts.map +1 -0
- package/dist/o-node/src/router/interfaces/o-node-router.config.js +1 -0
- package/dist/o-node/src/router/interfaces/o-node-router.response.d.ts +8 -0
- package/dist/o-node/src/router/interfaces/o-node-router.response.d.ts.map +1 -0
- package/dist/o-node/src/router/interfaces/o-node-router.response.js +1 -0
- package/dist/o-node/src/router/o-node.address.d.ts +18 -0
- package/dist/o-node/src/router/o-node.address.d.ts.map +1 -0
- package/dist/o-node/src/router/o-node.address.js +29 -0
- package/dist/o-node/src/router/o-node.router.d.ts +46 -0
- package/dist/o-node/src/router/o-node.router.d.ts.map +1 -0
- package/dist/o-node/src/router/o-node.router.js +181 -0
- package/dist/o-node/src/router/o-node.routing-policy.d.ts +30 -0
- package/dist/o-node/src/router/o-node.routing-policy.d.ts.map +1 -0
- package/dist/o-node/src/router/o-node.routing-policy.js +57 -0
- package/dist/o-node/src/router/o-node.transport.d.ts +11 -0
- package/dist/o-node/src/router/o-node.transport.d.ts.map +1 -0
- package/dist/o-node/src/router/o-node.transport.js +18 -0
- package/dist/o-node/src/router/resolvers/index.d.ts +4 -0
- package/dist/o-node/src/router/resolvers/index.d.ts.map +1 -0
- package/dist/o-node/src/router/resolvers/index.js +3 -0
- package/dist/o-node/src/router/resolvers/o-node.leader-resolver-fallback.d.ts +8 -0
- package/dist/o-node/src/router/resolvers/o-node.leader-resolver-fallback.d.ts.map +1 -0
- package/dist/o-node/src/router/resolvers/o-node.leader-resolver-fallback.js +35 -0
- package/dist/{src/router/resolvers/o-node.child-resolver.d.ts → o-node/src/router/resolvers/o-node.resolver.d.ts} +2 -2
- package/dist/o-node/src/router/resolvers/o-node.resolver.d.ts.map +1 -0
- package/dist/o-node/src/router/resolvers/o-node.resolver.js +45 -0
- package/dist/o-node/src/router/resolvers/o-node.search-resolver.d.ts +170 -0
- package/dist/o-node/src/router/resolvers/o-node.search-resolver.d.ts.map +1 -0
- package/dist/o-node/src/router/resolvers/o-node.search-resolver.js +285 -0
- package/dist/o-node/src/router/route.request.d.ts +14 -0
- package/dist/o-node/src/router/route.request.d.ts.map +1 -0
- package/dist/o-node/src/router/route.request.js +1 -0
- package/dist/o-node/src/streaming/index.d.ts +10 -0
- package/dist/o-node/src/streaming/index.d.ts.map +1 -0
- package/dist/o-node/src/streaming/index.js +12 -0
- package/dist/o-node/src/streaming/libp2p-stream-transport.d.ts +50 -0
- package/dist/o-node/src/streaming/libp2p-stream-transport.d.ts.map +1 -0
- package/dist/o-node/src/streaming/libp2p-stream-transport.js +137 -0
- package/dist/o-node/src/streaming/node-stream-handler.d.ts +65 -0
- package/dist/o-node/src/streaming/node-stream-handler.d.ts.map +1 -0
- package/dist/o-node/src/streaming/node-stream-handler.js +101 -0
- package/dist/o-node/src/ui/index.d.ts +3 -0
- package/dist/o-node/src/ui/index.d.ts.map +1 -0
- package/dist/o-node/src/ui/index.js +2 -0
- package/dist/o-node/src/ui/types.d.ts +110 -0
- package/dist/o-node/src/ui/types.d.ts.map +1 -0
- package/dist/o-node/src/ui/types.js +17 -0
- package/dist/o-node/src/ui/ui-graph.manager.d.ts +70 -0
- package/dist/o-node/src/ui/ui-graph.manager.d.ts.map +1 -0
- package/dist/o-node/src/ui/ui-graph.manager.js +274 -0
- package/dist/o-node/src/utils/circuit-breaker.d.ts +107 -0
- package/dist/o-node/src/utils/circuit-breaker.d.ts.map +1 -0
- package/dist/o-node/src/utils/circuit-breaker.js +175 -0
- package/dist/o-node/src/utils/index.d.ts +3 -0
- package/dist/o-node/src/utils/index.d.ts.map +1 -0
- package/dist/o-node/src/utils/index.js +2 -0
- package/dist/o-node/src/utils/leader-request-wrapper.d.ts +66 -0
- package/dist/o-node/src/utils/leader-request-wrapper.d.ts.map +1 -0
- package/dist/o-node/src/utils/leader-request-wrapper.js +160 -0
- package/dist/o-node/src/utils/network.utils.d.ts +20 -0
- package/dist/o-node/src/utils/network.utils.d.ts.map +1 -0
- package/dist/o-node/src/utils/network.utils.js +74 -0
- package/dist/o-node/src/utils/stream.utils.d.ts +6 -0
- package/dist/o-node/src/utils/stream.utils.d.ts.map +1 -0
- package/dist/o-node/src/utils/stream.utils.js +31 -0
- package/dist/o-node/test/circuit-breaker.test.d.ts +2 -0
- package/dist/o-node/test/circuit-breaker.test.d.ts.map +1 -0
- package/dist/o-node/test/circuit-breaker.test.js +262 -0
- package/dist/o-node/test/helpers/test-node.tool.d.ts +15 -0
- package/dist/o-node/test/helpers/test-node.tool.d.ts.map +1 -0
- package/dist/o-node/test/helpers/test-node.tool.js +27 -0
- package/dist/o-node/test/leader-request-wrapper.test.d.ts +1 -0
- package/dist/o-node/test/leader-request-wrapper.test.d.ts.map +1 -0
- package/dist/o-node/test/leader-request-wrapper.test.js +246 -0
- package/dist/o-node/test/o-node.spec.d.ts +2 -0
- package/dist/o-node/test/o-node.spec.d.ts.map +1 -0
- package/dist/o-node/test/o-node.spec.js +20 -0
- package/dist/o-node/test/search-resolver.spec.d.ts +2 -0
- package/dist/o-node/test/search-resolver.spec.d.ts.map +1 -0
- package/dist/o-node/test/search-resolver.spec.js +693 -0
- package/dist/src/connection/o-node-connection.d.ts +2 -2
- package/dist/src/connection/o-node-connection.d.ts.map +1 -1
- package/dist/src/connection/o-node-connection.js +54 -19
- package/dist/src/connection/o-node-connection.manager.d.ts +16 -4
- package/dist/src/connection/o-node-connection.manager.d.ts.map +1 -1
- package/dist/src/connection/o-node-connection.manager.js +73 -44
- package/dist/src/connection/o-stream.request.d.ts +11 -0
- package/dist/src/connection/o-stream.request.d.ts.map +1 -0
- package/dist/src/connection/o-stream.request.js +7 -0
- package/dist/src/index.d.ts +2 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -1
- package/dist/src/interfaces/i-heartbeatable-node.d.ts +49 -0
- package/dist/src/interfaces/i-heartbeatable-node.d.ts.map +1 -0
- package/dist/src/interfaces/i-heartbeatable-node.js +1 -0
- package/dist/src/interfaces/i-reconnectable-node.d.ts +46 -0
- package/dist/src/interfaces/i-reconnectable-node.d.ts.map +1 -0
- package/dist/src/interfaces/i-reconnectable-node.js +1 -0
- package/dist/src/interfaces/o-node.config.d.ts +42 -0
- package/dist/src/interfaces/o-node.config.d.ts.map +1 -1
- package/dist/src/managers/o-connection-heartbeat.manager.d.ts +63 -0
- package/dist/src/managers/o-connection-heartbeat.manager.d.ts.map +1 -0
- package/dist/src/managers/o-connection-heartbeat.manager.js +227 -0
- package/dist/src/managers/o-reconnection.manager.d.ts +51 -0
- package/dist/src/managers/o-reconnection.manager.d.ts.map +1 -0
- package/dist/src/managers/o-reconnection.manager.js +266 -0
- package/dist/src/o-node.d.ts +30 -2
- package/dist/src/o-node.d.ts.map +1 -1
- package/dist/src/o-node.js +244 -33
- package/dist/src/o-node.notification-manager.d.ts +52 -0
- package/dist/src/o-node.notification-manager.d.ts.map +1 -0
- package/dist/src/o-node.notification-manager.js +188 -0
- package/dist/src/o-node.tool.d.ts.map +1 -1
- package/dist/src/o-node.tool.js +33 -24
- package/dist/src/router/o-node.router.d.ts +1 -0
- package/dist/src/router/o-node.router.d.ts.map +1 -1
- package/dist/src/router/o-node.router.js +61 -5
- package/dist/src/router/o-node.routing-policy.d.ts.map +1 -1
- package/dist/src/router/o-node.routing-policy.js +7 -2
- package/dist/src/router/resolvers/o-node.resolver.d.ts.map +1 -1
- package/dist/src/router/resolvers/o-node.resolver.js +5 -1
- package/dist/src/router/resolvers/o-node.search-resolver.d.ts.map +1 -1
- package/dist/src/router/resolvers/o-node.search-resolver.js +34 -9
- package/dist/src/streaming/index.d.ts +10 -0
- package/dist/src/streaming/index.d.ts.map +1 -0
- package/dist/src/streaming/index.js +12 -0
- package/dist/src/streaming/libp2p-stream-transport.d.ts +50 -0
- package/dist/src/streaming/libp2p-stream-transport.d.ts.map +1 -0
- package/dist/src/streaming/libp2p-stream-transport.js +137 -0
- package/dist/src/streaming/node-stream-handler.d.ts +65 -0
- package/dist/src/streaming/node-stream-handler.d.ts.map +1 -0
- package/dist/src/streaming/node-stream-handler.js +101 -0
- package/dist/src/streaming/o-node-streaming-client.d.ts +33 -0
- package/dist/src/streaming/o-node-streaming-client.d.ts.map +1 -0
- package/dist/src/streaming/o-node-streaming-client.js +130 -0
- package/dist/src/utils/circuit-breaker.d.ts +107 -0
- package/dist/src/utils/circuit-breaker.d.ts.map +1 -0
- package/dist/src/utils/circuit-breaker.js +175 -0
- package/dist/src/utils/circuit-breaker.test.d.ts +2 -0
- package/dist/src/utils/circuit-breaker.test.d.ts.map +1 -0
- package/dist/src/utils/circuit-breaker.test.js +262 -0
- package/dist/src/utils/index.d.ts +3 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/index.js +2 -0
- package/dist/src/utils/leader-request-wrapper.d.ts +66 -0
- package/dist/src/utils/leader-request-wrapper.d.ts.map +1 -0
- package/dist/src/utils/leader-request-wrapper.js +160 -0
- package/dist/src/utils/leader-request-wrapper.test.d.ts +1 -0
- package/dist/src/utils/leader-request-wrapper.test.d.ts.map +1 -0
- package/dist/src/utils/leader-request-wrapper.test.js +246 -0
- package/dist/src/utils/stream.utils.d.ts +6 -0
- package/dist/src/utils/stream.utils.d.ts.map +1 -0
- package/dist/src/utils/stream.utils.js +31 -0
- package/dist/test/circuit-breaker.test.d.ts +2 -0
- package/dist/test/circuit-breaker.test.d.ts.map +1 -0
- package/dist/test/circuit-breaker.test.js +262 -0
- package/dist/test/helpers/test-node.tool.d.ts +15 -0
- package/dist/test/helpers/test-node.tool.d.ts.map +1 -0
- package/dist/test/helpers/test-node.tool.js +27 -0
- package/dist/test/leader-request-wrapper.test.d.ts +1 -0
- package/dist/test/leader-request-wrapper.test.d.ts.map +1 -0
- package/dist/test/leader-request-wrapper.test.js +246 -0
- package/package.json +6 -6
- package/dist/src/router/resolvers/o-node.child-resolver.d.ts.map +0 -1
- package/dist/src/router/resolvers/o-node.child-resolver.js +0 -58
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import { oObject, ChildLeftEvent, ParentDisconnectedEvent, LeaderDisconnectedEvent, ConnectionDegradedEvent, ConnectionRecoveredEvent, oAddress, } 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
|
+
this.isRunning = false;
|
|
23
|
+
}
|
|
24
|
+
async start() {
|
|
25
|
+
if (!this.config.enabled) {
|
|
26
|
+
this.logger.debug('Connection heartbeat disabled');
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
this.logger.info(`Starting connection heartbeat: interval=${this.config.intervalMs}ms, ` +
|
|
30
|
+
`timeout=${this.config.timeoutMs}ms, threshold=${this.config.failureThreshold}`);
|
|
31
|
+
// Immediate first check
|
|
32
|
+
await this.performHeartbeatCycle();
|
|
33
|
+
// Schedule recurring checks
|
|
34
|
+
this.heartbeatInterval = setInterval(() => this.performHeartbeatCycle(), this.config.intervalMs);
|
|
35
|
+
}
|
|
36
|
+
async stop() {
|
|
37
|
+
if (this.heartbeatInterval) {
|
|
38
|
+
clearInterval(this.heartbeatInterval);
|
|
39
|
+
this.heartbeatInterval = undefined;
|
|
40
|
+
}
|
|
41
|
+
this.healthMap.clear();
|
|
42
|
+
}
|
|
43
|
+
async performHeartbeatCycle() {
|
|
44
|
+
if (!this.isRunning) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
this.isRunning = true;
|
|
48
|
+
const targets = [];
|
|
49
|
+
// Check if this is a leader node (no leader in hierarchy = we are leader)
|
|
50
|
+
const isLeaderNode = this.node.getLeaders().length === 0;
|
|
51
|
+
// Collect leader (if enabled and we're not the leader)
|
|
52
|
+
if (!isLeaderNode) {
|
|
53
|
+
const leaders = this.node.getLeaders();
|
|
54
|
+
for (const leader of leaders) {
|
|
55
|
+
targets.push({ address: leader, role: 'leader' });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Collect parent
|
|
59
|
+
if (this.config.checkParent && !isLeaderNode) {
|
|
60
|
+
// Use this.node.parent getter to get the current parent address with transports
|
|
61
|
+
// rather than getParents() which may have a stale reference
|
|
62
|
+
const parent = this.node.parent;
|
|
63
|
+
// make sure that we don't double ping the leader
|
|
64
|
+
if (parent && parent?.toString() !== oAddress.leader().toString()) {
|
|
65
|
+
targets.push({ address: parent, role: 'parent' });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Collect children
|
|
69
|
+
if (this.config.checkChildren) {
|
|
70
|
+
const children = this.node.getChildren();
|
|
71
|
+
for (const child of children) {
|
|
72
|
+
targets.push({ address: child, role: 'child' });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Ping all targets in parallel
|
|
76
|
+
await Promise.allSettled(targets.map((target) => this.pingTarget(target.address, target.role)));
|
|
77
|
+
this.isRunning = false;
|
|
78
|
+
}
|
|
79
|
+
doPing(address) {
|
|
80
|
+
if (address.toString() === this.node.address.toString()) {
|
|
81
|
+
return Promise.resolve();
|
|
82
|
+
}
|
|
83
|
+
const transport = address.libp2pTransports[0].toMultiaddr();
|
|
84
|
+
if (transport.toString().indexOf('p2p-circuit') > -1) {
|
|
85
|
+
return this.node.use(address, {
|
|
86
|
+
method: 'ping',
|
|
87
|
+
params: {},
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return this.node.p2pNode.services.ping.ping(transport);
|
|
91
|
+
}
|
|
92
|
+
async pingTarget(address, role) {
|
|
93
|
+
if (!address.libp2pTransports.length) {
|
|
94
|
+
this.logger.debug(`${role} has no transports, skipping ping`, address);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const key = address.toString();
|
|
98
|
+
let health = this.healthMap.get(key);
|
|
99
|
+
if (!health) {
|
|
100
|
+
health = {
|
|
101
|
+
address,
|
|
102
|
+
peerId: 'unknown',
|
|
103
|
+
lastSuccessfulPing: 0,
|
|
104
|
+
consecutiveFailures: 0,
|
|
105
|
+
averageLatency: 0,
|
|
106
|
+
status: 'healthy',
|
|
107
|
+
};
|
|
108
|
+
this.healthMap.set(key, health);
|
|
109
|
+
}
|
|
110
|
+
try {
|
|
111
|
+
// Use libp2p's native ping service
|
|
112
|
+
const startTime = Date.now();
|
|
113
|
+
// Create timeout promise
|
|
114
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
115
|
+
setTimeout(() => reject(new Error('Ping timeout')), this.config.timeoutMs);
|
|
116
|
+
});
|
|
117
|
+
// Race between ping and timeout
|
|
118
|
+
// The ping service accepts PeerId as string or object
|
|
119
|
+
await Promise.race([this.doPing(address), timeoutPromise]);
|
|
120
|
+
const latency = Date.now() - startTime;
|
|
121
|
+
// Success - update health
|
|
122
|
+
health.lastSuccessfulPing = Date.now();
|
|
123
|
+
health.consecutiveFailures = 0;
|
|
124
|
+
health.averageLatency =
|
|
125
|
+
health.averageLatency === 0
|
|
126
|
+
? latency
|
|
127
|
+
: health.averageLatency * 0.7 + latency * 0.3; // Exponential moving average
|
|
128
|
+
const previousStatus = health.status;
|
|
129
|
+
health.status = 'healthy';
|
|
130
|
+
// Emit recovery event if was degraded
|
|
131
|
+
if (previousStatus === 'degraded') {
|
|
132
|
+
this.logger.info(`Connection recovered: ${address} (latency: ${latency}ms)`);
|
|
133
|
+
this.emitConnectionRecoveredEvent(address, role);
|
|
134
|
+
}
|
|
135
|
+
// this.logger.debug(`Ping successful: ${address} (${latency}ms)`);
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
health.consecutiveFailures++;
|
|
139
|
+
this.logger.warn(`Ping failed: ${address} (failures: ${health.consecutiveFailures}/${this.config.failureThreshold})`, error);
|
|
140
|
+
// Update status based on failure count
|
|
141
|
+
if (health.consecutiveFailures >= this.config.failureThreshold) {
|
|
142
|
+
this.handleConnectionDead(address, role, health);
|
|
143
|
+
}
|
|
144
|
+
else if (health.consecutiveFailures >=
|
|
145
|
+
Math.ceil(this.config.failureThreshold / 2)) {
|
|
146
|
+
health.status = 'degraded';
|
|
147
|
+
this.emitConnectionDegradedEvent(address, role, health.consecutiveFailures);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
handleConnectionDead(address, role, health) {
|
|
152
|
+
health.status = 'dead';
|
|
153
|
+
this.logger.error(`Connection dead after ${health.consecutiveFailures} failures: ${address} (role: ${role})`);
|
|
154
|
+
// Remove from health tracking
|
|
155
|
+
this.healthMap.delete(address.toString());
|
|
156
|
+
// Emit events based on role
|
|
157
|
+
if (role === 'child') {
|
|
158
|
+
// Remove dead child from hierarchy
|
|
159
|
+
this.node.removeChild(address);
|
|
160
|
+
// Emit child left event
|
|
161
|
+
this.node.notificationManager.emit(new ChildLeftEvent({
|
|
162
|
+
source: this.node.address,
|
|
163
|
+
childAddress: address,
|
|
164
|
+
parentAddress: this.node.address,
|
|
165
|
+
reason: `heartbeat_failed_${health.consecutiveFailures}_times`,
|
|
166
|
+
}));
|
|
167
|
+
this.logger.warn(`Removed dead child: ${address}`);
|
|
168
|
+
}
|
|
169
|
+
else if (role === 'parent') {
|
|
170
|
+
// Emit parent disconnected event
|
|
171
|
+
this.node.notificationManager.emit(new ParentDisconnectedEvent({
|
|
172
|
+
source: this.node.address,
|
|
173
|
+
parentAddress: address,
|
|
174
|
+
reason: `heartbeat_failed_${health.consecutiveFailures}_times`,
|
|
175
|
+
}));
|
|
176
|
+
this.logger.error(`Parent connection dead: ${address}`);
|
|
177
|
+
// Reconnection manager will handle this event
|
|
178
|
+
}
|
|
179
|
+
else if (role === 'leader') {
|
|
180
|
+
// Emit leader disconnected event
|
|
181
|
+
this.node.notificationManager.emit(new LeaderDisconnectedEvent({
|
|
182
|
+
source: this.node.address,
|
|
183
|
+
leaderAddress: address,
|
|
184
|
+
reason: `heartbeat_failed_${health.consecutiveFailures}_times`,
|
|
185
|
+
}));
|
|
186
|
+
this.logger.error(`Leader connection dead: ${address}`);
|
|
187
|
+
// Reconnection manager will handle this event
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
emitConnectionDegradedEvent(address, role, failures) {
|
|
191
|
+
// ConnectionDegradedEvent only supports parent/child, so we map leader to parent
|
|
192
|
+
const eventRole = role === 'leader' ? 'parent' : role === 'child' ? 'child' : 'parent';
|
|
193
|
+
this.node.notificationManager.emit(new ConnectionDegradedEvent({
|
|
194
|
+
source: this.node.address,
|
|
195
|
+
targetAddress: address,
|
|
196
|
+
role: eventRole,
|
|
197
|
+
consecutiveFailures: failures,
|
|
198
|
+
}));
|
|
199
|
+
}
|
|
200
|
+
emitConnectionRecoveredEvent(address, role) {
|
|
201
|
+
// ConnectionRecoveredEvent only supports parent/child, so we map leader to parent
|
|
202
|
+
const eventRole = role === 'leader' ? 'parent' : role === 'child' ? 'child' : 'parent';
|
|
203
|
+
this.node.notificationManager.emit(new ConnectionRecoveredEvent({
|
|
204
|
+
source: this.node.address,
|
|
205
|
+
targetAddress: address,
|
|
206
|
+
role: eventRole,
|
|
207
|
+
}));
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Get current health status of all connections
|
|
211
|
+
*/
|
|
212
|
+
getHealthStatus() {
|
|
213
|
+
return Array.from(this.healthMap.values());
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Get health status for specific address
|
|
217
|
+
*/
|
|
218
|
+
getConnectionHealth(address) {
|
|
219
|
+
return this.healthMap.get(address.toString());
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Get current configuration
|
|
223
|
+
*/
|
|
224
|
+
getConfig() {
|
|
225
|
+
return { ...this.config };
|
|
226
|
+
}
|
|
227
|
+
}
|
|
@@ -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"}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { oObject, oAddress, NodeState, } from '@olane/o-core';
|
|
2
|
+
import { oNodeAddress } from '../router/o-node.address.js';
|
|
3
|
+
import { oNodeTransport } from '../router/o-node.transport.js';
|
|
4
|
+
/**
|
|
5
|
+
* Reconnection Manager
|
|
6
|
+
*
|
|
7
|
+
* Automatically attempts to reconnect to parent when connection is lost.
|
|
8
|
+
*
|
|
9
|
+
* Strategy:
|
|
10
|
+
* 1. Listen for ParentDisconnectedEvent (from heartbeat or libp2p)
|
|
11
|
+
* 2. Attempt direct reconnection with exponential backoff
|
|
12
|
+
* 3. If direct reconnection fails, query leader for new parent
|
|
13
|
+
* 4. Register with new parent and continue operation
|
|
14
|
+
* 5. If all attempts fail, transition node to ERROR state
|
|
15
|
+
*/
|
|
16
|
+
export class oReconnectionManager extends oObject {
|
|
17
|
+
constructor(node, config) {
|
|
18
|
+
super();
|
|
19
|
+
this.node = node;
|
|
20
|
+
this.config = config;
|
|
21
|
+
this.reconnecting = false;
|
|
22
|
+
this.setupEventListeners();
|
|
23
|
+
}
|
|
24
|
+
setupEventListeners() {
|
|
25
|
+
// Listen for parent disconnection (from heartbeat or libp2p)
|
|
26
|
+
this.node.notificationManager.on('parent:disconnected', this.handleParentDisconnected.bind(this));
|
|
27
|
+
// Listen for leader disconnection (from heartbeat)
|
|
28
|
+
this.node.notificationManager.on('leader:disconnected', this.handleLeaderDisconnected.bind(this));
|
|
29
|
+
// Listen for connection degradation as early warning
|
|
30
|
+
this.node.notificationManager.on('connection:degraded', this.handleConnectionDegraded.bind(this));
|
|
31
|
+
this.node.notificationManager.on('node:connected', this.handleNodeConnected.bind(this));
|
|
32
|
+
}
|
|
33
|
+
async handleNodeConnected(event) {
|
|
34
|
+
const connectedEvent = event;
|
|
35
|
+
if (connectedEvent.nodeAddress.toString() === oAddress.leader().toString()) {
|
|
36
|
+
// the leader is back online, let's re-register & tell sub-graphs to re-register
|
|
37
|
+
await this.node.useSelf({
|
|
38
|
+
method: 'register_leader',
|
|
39
|
+
params: {},
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async handleConnectionDegraded(event) {
|
|
44
|
+
const degradedEvent = event;
|
|
45
|
+
if (degradedEvent.role !== 'parent')
|
|
46
|
+
return;
|
|
47
|
+
this.logger.warn(`Parent connection degraded: ${degradedEvent.targetAddress} ` +
|
|
48
|
+
`(failures: ${degradedEvent.consecutiveFailures})`);
|
|
49
|
+
// Could implement pre-emptive parent discovery here
|
|
50
|
+
// For now, just log the warning and wait for full disconnection
|
|
51
|
+
}
|
|
52
|
+
async handleLeaderDisconnected(event) {
|
|
53
|
+
const disconnectEvent = event;
|
|
54
|
+
this.logger.warn(`Leader disconnected: ${disconnectEvent.leaderAddress} (reason: ${disconnectEvent.reason})`);
|
|
55
|
+
// Don't attempt reconnection for leader - the LeaderRequestWrapper
|
|
56
|
+
// will handle retries automatically when we make requests
|
|
57
|
+
// Just log the event for observability
|
|
58
|
+
this.logger.info('Leader requests will use automatic retry mechanism (LeaderRequestWrapper)');
|
|
59
|
+
}
|
|
60
|
+
async handleParentDisconnected(event) {
|
|
61
|
+
const disconnectEvent = event;
|
|
62
|
+
if (this.reconnecting) {
|
|
63
|
+
this.logger.debug('Already reconnecting, ignoring duplicate event');
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
this.logger.warn(`Parent disconnected: ${disconnectEvent.parentAddress} (reason: ${disconnectEvent.reason})`);
|
|
67
|
+
await this.attemptReconnection();
|
|
68
|
+
}
|
|
69
|
+
async attemptReconnection() {
|
|
70
|
+
if (!this.config.enabled) {
|
|
71
|
+
this.logger.warn('Reconnection disabled - node will remain disconnected');
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
this.reconnecting = true;
|
|
75
|
+
let attempt = 0;
|
|
76
|
+
while (attempt < this.config.maxAttempts) {
|
|
77
|
+
attempt++;
|
|
78
|
+
this.logger.info(`Reconnection attempt ${attempt}/${this.config.maxAttempts} to parent: ${this.node.config.parent}`);
|
|
79
|
+
try {
|
|
80
|
+
// Strategy 1: Try direct parent reconnection
|
|
81
|
+
await this.tryDirectParentReconnection();
|
|
82
|
+
// Success!
|
|
83
|
+
this.reconnecting = false;
|
|
84
|
+
this.logger.info(`Successfully reconnected to parent after ${attempt} attempts`);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
this.logger.warn(`Reconnection attempt ${attempt} failed:`, error instanceof Error ? error.message : error);
|
|
89
|
+
if (attempt < this.config.maxAttempts) {
|
|
90
|
+
const delay = this.calculateBackoffDelay(attempt);
|
|
91
|
+
this.logger.debug(`Waiting ${delay}ms before next attempt...`);
|
|
92
|
+
await this.sleep(delay);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// All direct attempts failed - try leader fallback
|
|
97
|
+
if (this.config.useLeaderFallback) {
|
|
98
|
+
await this.tryLeaderFallback();
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
this.handleReconnectionFailure();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async tryDirectParentReconnection() {
|
|
105
|
+
if (!this.node.config.parent) {
|
|
106
|
+
throw new Error('No parent configured');
|
|
107
|
+
}
|
|
108
|
+
// Re-register with parent (might have new transports)
|
|
109
|
+
await this.node.registerParent();
|
|
110
|
+
// Verify connection works with a ping
|
|
111
|
+
await this.node.use(this.node.config.parent, {
|
|
112
|
+
method: 'ping',
|
|
113
|
+
params: {},
|
|
114
|
+
});
|
|
115
|
+
this.logger.info('Direct parent reconnection successful');
|
|
116
|
+
}
|
|
117
|
+
async tryLeaderFallback() {
|
|
118
|
+
// Check if parent is the leader - special case
|
|
119
|
+
const parentIsLeader = this.node.config.parent?.toString() === oAddress.leader().toString();
|
|
120
|
+
if (parentIsLeader) {
|
|
121
|
+
this.logger.info('Parent is the leader - waiting for leader to become available');
|
|
122
|
+
await this.waitForLeaderAndReconnect();
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
this.logger.info('Starting infinite parent discovery via leader registry');
|
|
126
|
+
await this.waitForParentAndReconnect();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Wait for leader to become available and reconnect
|
|
131
|
+
* Leader transports are static (configured), so we just need to detect when it's back
|
|
132
|
+
*/
|
|
133
|
+
async waitForLeaderAndReconnect() {
|
|
134
|
+
const startTime = Date.now();
|
|
135
|
+
let attempt = 0;
|
|
136
|
+
let currentDelay = this.config.parentDiscoveryIntervalMs;
|
|
137
|
+
// Infinite retry loop - keep trying until leader is back
|
|
138
|
+
while (true) {
|
|
139
|
+
attempt++;
|
|
140
|
+
const elapsedMinutes = Math.floor((Date.now() - startTime) / 60000);
|
|
141
|
+
this.logger.info(`Leader discovery attempt ${attempt} (elapsed: ${elapsedMinutes}m)`);
|
|
142
|
+
try {
|
|
143
|
+
// Try to ping the leader using its configured transports
|
|
144
|
+
// The leader address should already have transports configured
|
|
145
|
+
await this.node.use(this.node.config.parent, {
|
|
146
|
+
method: 'ping',
|
|
147
|
+
params: {},
|
|
148
|
+
});
|
|
149
|
+
// Leader is back! Now re-register with parent and registry
|
|
150
|
+
this.logger.info(`Leader is back online after ${elapsedMinutes}m, re-registering...`);
|
|
151
|
+
try {
|
|
152
|
+
// Register with parent (leader)
|
|
153
|
+
await this.node.registerParent();
|
|
154
|
+
// Force re-registration with registry by resetting the flag
|
|
155
|
+
this.node.didRegister = false;
|
|
156
|
+
await this.node.register();
|
|
157
|
+
// Success!
|
|
158
|
+
this.reconnecting = false;
|
|
159
|
+
this.logger.info(`Successfully reconnected to leader and re-registered after ${elapsedMinutes}m`);
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
catch (registrationError) {
|
|
163
|
+
this.logger.warn('Leader online but registration failed, will retry:', registrationError instanceof Error
|
|
164
|
+
? registrationError.message
|
|
165
|
+
: registrationError);
|
|
166
|
+
// Fall through to retry with backoff
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
// Leader not yet available
|
|
171
|
+
this.logger.debug(`Leader not yet available (will retry): ${error instanceof Error ? error.message : error}`);
|
|
172
|
+
}
|
|
173
|
+
// Calculate backoff delay
|
|
174
|
+
const delay = Math.min(currentDelay, this.config.parentDiscoveryMaxDelayMs);
|
|
175
|
+
// Log periodic status updates (every 5 minutes)
|
|
176
|
+
if (attempt % 30 === 0) {
|
|
177
|
+
this.logger.info(`Still waiting for leader to come back online... (${elapsedMinutes}m elapsed, ${attempt} attempts)`);
|
|
178
|
+
}
|
|
179
|
+
this.logger.debug(`Waiting ${delay}ms before next discovery attempt...`);
|
|
180
|
+
await this.sleep(delay);
|
|
181
|
+
// Exponential backoff for next iteration
|
|
182
|
+
currentDelay = Math.min(currentDelay * 2, this.config.parentDiscoveryMaxDelayMs);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Wait for non-leader parent to appear in registry and reconnect
|
|
187
|
+
*/
|
|
188
|
+
async waitForParentAndReconnect() {
|
|
189
|
+
const startTime = Date.now();
|
|
190
|
+
let attempt = 0;
|
|
191
|
+
let currentDelay = this.config.parentDiscoveryIntervalMs;
|
|
192
|
+
// Infinite retry loop - keep trying until parent is found
|
|
193
|
+
while (true) {
|
|
194
|
+
attempt++;
|
|
195
|
+
const elapsedMinutes = Math.floor((Date.now() - startTime) / 60000);
|
|
196
|
+
this.logger.info(`Parent discovery attempt ${attempt} (elapsed: ${elapsedMinutes}m)`);
|
|
197
|
+
try {
|
|
198
|
+
// Query registry for parent by its known address
|
|
199
|
+
const response = await this.node.use(oAddress.registry(), {
|
|
200
|
+
method: 'find_available_parent',
|
|
201
|
+
params: {
|
|
202
|
+
parentAddress: this.node.config.parent?.toString(),
|
|
203
|
+
},
|
|
204
|
+
});
|
|
205
|
+
const { parentAddress, parentTransports } = response.result.data;
|
|
206
|
+
// Check if parent was found in registry
|
|
207
|
+
if (parentAddress && parentTransports && parentTransports.length > 0) {
|
|
208
|
+
this.logger.info(`Parent found in registry: ${parentAddress} with ${parentTransports.length} transports`);
|
|
209
|
+
// Update parent reference with fresh transports
|
|
210
|
+
this.node.config.parent = new oNodeAddress(parentAddress, parentTransports.map((t) => new oNodeTransport(t.value)));
|
|
211
|
+
// Attempt to register with parent and re-register with registry
|
|
212
|
+
try {
|
|
213
|
+
await this.tryDirectParentReconnection();
|
|
214
|
+
// Force re-registration with registry by resetting the flag
|
|
215
|
+
this.node.didRegister = false;
|
|
216
|
+
await this.node.register();
|
|
217
|
+
// Success!
|
|
218
|
+
this.reconnecting = false;
|
|
219
|
+
this.logger.info(`Successfully reconnected to parent and re-registered after ${elapsedMinutes}m of discovery attempts`);
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
catch (registrationError) {
|
|
223
|
+
this.logger.warn('Parent found but registration failed, will retry:', registrationError instanceof Error
|
|
224
|
+
? registrationError.message
|
|
225
|
+
: registrationError);
|
|
226
|
+
// Fall through to retry with backoff
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
this.logger.debug(`Parent not yet available in registry: ${this.node.config.parent?.toString()}`);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
catch (error) {
|
|
234
|
+
// Network error communicating with leader/registry
|
|
235
|
+
this.logger.warn('Error querying registry for parent (will retry):', error instanceof Error ? error.message : error);
|
|
236
|
+
}
|
|
237
|
+
// Calculate backoff delay with exponential increase, capped at max
|
|
238
|
+
const delay = Math.min(currentDelay, this.config.parentDiscoveryMaxDelayMs);
|
|
239
|
+
// Log periodic status updates (every 5 minutes)
|
|
240
|
+
if (attempt % 30 === 0) {
|
|
241
|
+
this.logger.info(`Still waiting for parent to appear in registry... (${elapsedMinutes}m elapsed, ${attempt} attempts)`);
|
|
242
|
+
}
|
|
243
|
+
this.logger.debug(`Waiting ${delay}ms before next discovery attempt...`);
|
|
244
|
+
await this.sleep(delay);
|
|
245
|
+
// Exponential backoff for next iteration
|
|
246
|
+
currentDelay = Math.min(currentDelay * 2, this.config.parentDiscoveryMaxDelayMs);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
handleReconnectionFailure() {
|
|
250
|
+
this.reconnecting = false;
|
|
251
|
+
this.logger.error('Failed to reconnect to parent after all attempts - node in ERROR state');
|
|
252
|
+
// Transition to error state
|
|
253
|
+
this.node.state = NodeState.ERROR;
|
|
254
|
+
// Could emit custom event here for monitoring
|
|
255
|
+
}
|
|
256
|
+
calculateNodeLevel() {
|
|
257
|
+
return this.node.address.paths.length;
|
|
258
|
+
}
|
|
259
|
+
calculateBackoffDelay(attempt) {
|
|
260
|
+
const delay = this.config.baseDelayMs * Math.pow(2, attempt - 1);
|
|
261
|
+
return Math.min(delay, this.config.maxDelayMs);
|
|
262
|
+
}
|
|
263
|
+
sleep(ms) {
|
|
264
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
265
|
+
}
|
|
266
|
+
}
|
package/dist/src/o-node.d.ts
CHANGED
|
@@ -3,11 +3,14 @@ import { PeerId } from '@olane/o-config';
|
|
|
3
3
|
import { oNodeHierarchyManager } from './o-node.hierarchy-manager.js';
|
|
4
4
|
import { oNodeConfig } from './interfaces/o-node.config.js';
|
|
5
5
|
import { oNodeTransport } from './router/o-node.transport.js';
|
|
6
|
-
import { oRequest } from '@olane/o-core';
|
|
6
|
+
import { oRequest, oNotificationManager } from '@olane/o-core';
|
|
7
7
|
import { oNodeAddress } from './router/o-node.address.js';
|
|
8
8
|
import { oNodeConnection } from './connection/o-node-connection.js';
|
|
9
9
|
import { oNodeConnectionManager } from './connection/o-node-connection.manager.js';
|
|
10
10
|
import { oToolBase } from '@olane/o-tool';
|
|
11
|
+
import { oConnectionHeartbeatManager } from './managers/o-connection-heartbeat.manager.js';
|
|
12
|
+
import { oReconnectionManager } from './managers/o-reconnection.manager.js';
|
|
13
|
+
import { oNodeConnectionConfig } from './connection/index.js';
|
|
11
14
|
export declare class oNode extends oToolBase {
|
|
12
15
|
peerId: PeerId;
|
|
13
16
|
p2pNode: Libp2p;
|
|
@@ -15,6 +18,8 @@ export declare class oNode extends oToolBase {
|
|
|
15
18
|
config: oNodeConfig;
|
|
16
19
|
connectionManager: oNodeConnectionManager;
|
|
17
20
|
hierarchyManager: oNodeHierarchyManager;
|
|
21
|
+
connectionHeartbeatManager?: oConnectionHeartbeatManager;
|
|
22
|
+
reconnectionManager?: oReconnectionManager;
|
|
18
23
|
protected didRegister: boolean;
|
|
19
24
|
constructor(config: oNodeConfig);
|
|
20
25
|
get leader(): oNodeAddress | null;
|
|
@@ -22,11 +27,13 @@ export declare class oNode extends oToolBase {
|
|
|
22
27
|
get parentPeerId(): string | null;
|
|
23
28
|
configureTransports(): any[];
|
|
24
29
|
initializeRouter(): Promise<void>;
|
|
30
|
+
protected createNotificationManager(): oNotificationManager;
|
|
25
31
|
get staticAddress(): oNodeAddress;
|
|
26
32
|
get parentTransports(): oNodeTransport[];
|
|
27
33
|
get transports(): oNodeTransport[];
|
|
28
34
|
unregister(): Promise<void>;
|
|
29
35
|
registerParent(): Promise<void>;
|
|
36
|
+
registerLeader(): Promise<void>;
|
|
30
37
|
register(): Promise<void>;
|
|
31
38
|
extractMethod(address: oNodeAddress): string;
|
|
32
39
|
start(): Promise<void>;
|
|
@@ -37,8 +44,29 @@ export declare class oNode extends oToolBase {
|
|
|
37
44
|
*/
|
|
38
45
|
configure(): Promise<Libp2pConfig>;
|
|
39
46
|
protected createNode(): Promise<Libp2p>;
|
|
40
|
-
connect(
|
|
47
|
+
connect(config: oNodeConnectionConfig): Promise<oNodeConnection>;
|
|
48
|
+
initConnectionManager(): Promise<void>;
|
|
49
|
+
initReconnectionManager(): Promise<void>;
|
|
50
|
+
hookInitializeFinished(): Promise<void>;
|
|
51
|
+
hookStartFinished(): Promise<void>;
|
|
41
52
|
initialize(): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Override use() to wrap leader/registry requests with retry logic
|
|
55
|
+
*/
|
|
42
56
|
teardown(): Promise<void>;
|
|
57
|
+
getLeaders(): oNodeAddress[];
|
|
58
|
+
getParents(): oNodeAddress[];
|
|
59
|
+
getChildren(): oNodeAddress[];
|
|
60
|
+
removeChild(childAddress: oNodeAddress): void;
|
|
61
|
+
/**
|
|
62
|
+
* Get the total number of active streams across all connections
|
|
63
|
+
* @returns Total count of active streams
|
|
64
|
+
*/
|
|
65
|
+
getStreamCount(): number;
|
|
66
|
+
/**
|
|
67
|
+
* Get libp2p metrics for this node
|
|
68
|
+
* Tool method that can be called remotely by monitoring systems
|
|
69
|
+
*/
|
|
70
|
+
_tool_get_libp2p_metrics(request: oRequest): Promise<any>;
|
|
43
71
|
}
|
|
44
72
|
//# sourceMappingURL=o-node.d.ts.map
|
package/dist/src/o-node.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"o-node.d.ts","sourceRoot":"","sources":["../../src/o-node.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"o-node.d.ts","sourceRoot":"","sources":["../../src/o-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,MAAM,EACN,YAAY,EACb,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAKL,QAAQ,EAER,oBAAoB,EAGrB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC;AAEnF,OAAO,EAAmB,SAAS,EAAE,MAAM,eAAe,CAAC;AAG3D,OAAO,EAAE,2BAA2B,EAAE,MAAM,8CAA8C,CAAC;AAC3F,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,qBAAa,KAAM,SAAQ,SAAS;IAC3B,MAAM,EAAG,MAAM,CAAC;IAChB,OAAO,EAAG,MAAM,CAAC;IACjB,OAAO,EAAG,YAAY,CAAC;IACvB,MAAM,EAAE,WAAW,CAAC;IACpB,iBAAiB,EAAG,sBAAsB,CAAC;IAC3C,gBAAgB,EAAG,qBAAqB,CAAC;IACzC,0BAA0B,CAAC,EAAE,2BAA2B,CAAC;IACzD,mBAAmB,CAAC,EAAE,oBAAoB,CAAC;IAClD,SAAS,CAAC,WAAW,EAAE,OAAO,CAAS;gBAE3B,MAAM,EAAE,WAAW;IAK/B,IAAI,MAAM,IAAI,YAAY,GAAG,IAAI,CAEhC;IAED,IAAI,aAAa,IAAI,YAAY,CAKhC;IAED,IAAI,YAAY,IAAI,MAAM,GAAG,IAAI,CAOhC;IAED,mBAAmB,IAAI,GAAG,EAAE;IAItB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IASvC,SAAS,CAAC,yBAAyB,IAAI,oBAAoB;IAQ3D,IAAI,aAAa,IAAI,YAAY,CAEhC;IAED,IAAI,gBAAgB,IAAI,cAAc,EAAE,CAEvC;IAED,IAAI,UAAU,IAAI,cAAc,EAAE,CAIjC;IAEK,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAwD3B,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAqC/B,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB/B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IA4B/B,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM;IAItC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAStB,mBAAmB,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC;IAG1D;;;OAGG;IACG,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC;cA0HxB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAMvC,OAAO,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC;IAsBhE,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAQtC,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBxC,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAEvC,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBlC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAwCjC;;OAEG;IAiBG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAc/B,UAAU,IAAI,YAAY,EAAE;IAI5B,UAAU,IAAI,YAAY,EAAE;IAI5B,WAAW,IAAI,YAAY,EAAE;IAI7B,WAAW,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI;IAI7C;;;OAGG;IACH,cAAc,IAAI,MAAM;IAUxB;;;OAGG;IACG,wBAAwB,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC;CAwEhE"}
|