@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,262 @@
|
|
|
1
|
+
import { expect } from 'chai';
|
|
2
|
+
import { CircuitBreaker, CircuitState } from './circuit-breaker.js';
|
|
3
|
+
describe('CircuitBreaker', () => {
|
|
4
|
+
let breaker;
|
|
5
|
+
beforeEach(() => {
|
|
6
|
+
breaker = new CircuitBreaker('test-service', {
|
|
7
|
+
enabled: true,
|
|
8
|
+
failureThreshold: 3,
|
|
9
|
+
openTimeoutMs: 1000,
|
|
10
|
+
halfOpenMaxAttempts: 1,
|
|
11
|
+
});
|
|
12
|
+
});
|
|
13
|
+
describe('State Transitions', () => {
|
|
14
|
+
it('should start in CLOSED state', () => {
|
|
15
|
+
expect(breaker.getState()).to.equal(CircuitState.CLOSED);
|
|
16
|
+
expect(breaker.shouldAllowRequest()).to.equal(true);
|
|
17
|
+
});
|
|
18
|
+
it('should transition to OPEN after threshold failures', () => {
|
|
19
|
+
expect(breaker.getState()).to.equal(CircuitState.CLOSED);
|
|
20
|
+
// Record failures up to threshold
|
|
21
|
+
breaker.recordFailure();
|
|
22
|
+
breaker.recordFailure();
|
|
23
|
+
expect(breaker.getState()).to.equal(CircuitState.CLOSED);
|
|
24
|
+
// Third failure should open circuit
|
|
25
|
+
breaker.recordFailure();
|
|
26
|
+
expect(breaker.getState()).to.equal(CircuitState.OPEN);
|
|
27
|
+
expect(breaker.shouldAllowRequest()).to.equal(false);
|
|
28
|
+
});
|
|
29
|
+
it('should transition to HALF_OPEN after timeout', async () => {
|
|
30
|
+
// Open the circuit
|
|
31
|
+
breaker.recordFailure();
|
|
32
|
+
breaker.recordFailure();
|
|
33
|
+
breaker.recordFailure();
|
|
34
|
+
expect(breaker.getState()).to.equal(CircuitState.OPEN);
|
|
35
|
+
// Wait for timeout
|
|
36
|
+
await new Promise((resolve) => setTimeout(resolve, 1100));
|
|
37
|
+
// Next request should transition to HALF_OPEN
|
|
38
|
+
expect(breaker.shouldAllowRequest()).to.equal(true);
|
|
39
|
+
expect(breaker.getState()).to.equal(CircuitState.HALF_OPEN);
|
|
40
|
+
});
|
|
41
|
+
it('should transition from HALF_OPEN to CLOSED on success', async () => {
|
|
42
|
+
// Open the circuit
|
|
43
|
+
breaker.recordFailure();
|
|
44
|
+
breaker.recordFailure();
|
|
45
|
+
breaker.recordFailure();
|
|
46
|
+
// Wait and transition to HALF_OPEN
|
|
47
|
+
await new Promise((resolve) => setTimeout(resolve, 1100));
|
|
48
|
+
breaker.shouldAllowRequest();
|
|
49
|
+
// Success should close circuit
|
|
50
|
+
breaker.recordSuccess();
|
|
51
|
+
expect(breaker.getState()).to.equal(CircuitState.CLOSED);
|
|
52
|
+
});
|
|
53
|
+
it('should transition from HALF_OPEN to OPEN on failure', async () => {
|
|
54
|
+
// Open the circuit
|
|
55
|
+
breaker.recordFailure();
|
|
56
|
+
breaker.recordFailure();
|
|
57
|
+
breaker.recordFailure();
|
|
58
|
+
// Wait and transition to HALF_OPEN
|
|
59
|
+
await new Promise((resolve) => setTimeout(resolve, 1100));
|
|
60
|
+
breaker.shouldAllowRequest();
|
|
61
|
+
expect(breaker.getState()).to.equal(CircuitState.HALF_OPEN);
|
|
62
|
+
// Failure should reopen circuit
|
|
63
|
+
breaker.recordFailure();
|
|
64
|
+
expect(breaker.getState()).to.equal(CircuitState.OPEN);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
describe('Request Gating', () => {
|
|
68
|
+
it('should allow all requests in CLOSED state', () => {
|
|
69
|
+
expect(breaker.shouldAllowRequest()).to.equal(true);
|
|
70
|
+
expect(breaker.shouldAllowRequest()).to.equal(true);
|
|
71
|
+
});
|
|
72
|
+
it('should block all requests in OPEN state', () => {
|
|
73
|
+
// Open the circuit
|
|
74
|
+
breaker.recordFailure();
|
|
75
|
+
breaker.recordFailure();
|
|
76
|
+
breaker.recordFailure();
|
|
77
|
+
expect(breaker.shouldAllowRequest()).to.equal(false);
|
|
78
|
+
});
|
|
79
|
+
it('should limit requests in HALF_OPEN state', async () => {
|
|
80
|
+
// Open the circuit
|
|
81
|
+
breaker.recordFailure();
|
|
82
|
+
breaker.recordFailure();
|
|
83
|
+
breaker.recordFailure();
|
|
84
|
+
// Wait and transition to HALF_OPEN
|
|
85
|
+
await new Promise((resolve) => setTimeout(resolve, 1100));
|
|
86
|
+
// First request allowed
|
|
87
|
+
expect(breaker.shouldAllowRequest()).to.equal(true);
|
|
88
|
+
expect(breaker.getState()).to.equal(CircuitState.HALF_OPEN);
|
|
89
|
+
// Subsequent requests blocked until result recorded
|
|
90
|
+
expect(breaker.shouldAllowRequest()).to.equal(false);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
describe('Failure Tracking', () => {
|
|
94
|
+
it('should track consecutive failures', () => {
|
|
95
|
+
breaker.recordFailure();
|
|
96
|
+
expect(breaker.getStats().consecutiveFailures).to.equal(1);
|
|
97
|
+
breaker.recordFailure();
|
|
98
|
+
expect(breaker.getStats().consecutiveFailures).to.equal(2);
|
|
99
|
+
breaker.recordFailure();
|
|
100
|
+
expect(breaker.getStats().consecutiveFailures).to.equal(3);
|
|
101
|
+
});
|
|
102
|
+
it('should reset consecutive failures on success', () => {
|
|
103
|
+
breaker.recordFailure();
|
|
104
|
+
breaker.recordFailure();
|
|
105
|
+
expect(breaker.getStats().consecutiveFailures).to.equal(2);
|
|
106
|
+
breaker.recordSuccess();
|
|
107
|
+
expect(breaker.getStats().consecutiveFailures).to.equal(0);
|
|
108
|
+
expect(breaker.getState()).to.equal(CircuitState.CLOSED);
|
|
109
|
+
});
|
|
110
|
+
it('should track total failures and successes', () => {
|
|
111
|
+
breaker.recordFailure();
|
|
112
|
+
breaker.recordSuccess();
|
|
113
|
+
breaker.recordFailure();
|
|
114
|
+
breaker.recordSuccess();
|
|
115
|
+
const stats = breaker.getStats();
|
|
116
|
+
expect(stats.totalFailures).to.equal(2);
|
|
117
|
+
expect(stats.totalSuccesses).to.equal(2);
|
|
118
|
+
});
|
|
119
|
+
it('should track timestamps', () => {
|
|
120
|
+
const beforeFailure = Date.now();
|
|
121
|
+
breaker.recordFailure();
|
|
122
|
+
const afterFailure = Date.now();
|
|
123
|
+
const stats = breaker.getStats();
|
|
124
|
+
expect(stats.lastFailureTime).greaterThanOrEqual(beforeFailure);
|
|
125
|
+
expect(stats.lastFailureTime).lessThanOrEqual(afterFailure);
|
|
126
|
+
const beforeSuccess = Date.now();
|
|
127
|
+
breaker.recordSuccess();
|
|
128
|
+
const afterSuccess = Date.now();
|
|
129
|
+
const stats2 = breaker.getStats();
|
|
130
|
+
expect(stats2.lastSuccessTime).greaterThanOrEqual(beforeSuccess);
|
|
131
|
+
expect(stats2.lastSuccessTime).lessThanOrEqual(afterSuccess);
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
describe('Configuration', () => {
|
|
135
|
+
it('should respect custom failure threshold', () => {
|
|
136
|
+
const customBreaker = new CircuitBreaker('test', {
|
|
137
|
+
enabled: true,
|
|
138
|
+
failureThreshold: 5,
|
|
139
|
+
openTimeoutMs: 1000,
|
|
140
|
+
halfOpenMaxAttempts: 1,
|
|
141
|
+
});
|
|
142
|
+
// Should not open before threshold
|
|
143
|
+
customBreaker.recordFailure();
|
|
144
|
+
customBreaker.recordFailure();
|
|
145
|
+
customBreaker.recordFailure();
|
|
146
|
+
customBreaker.recordFailure();
|
|
147
|
+
expect(customBreaker.getState()).to.equal(CircuitState.CLOSED);
|
|
148
|
+
// Should open at threshold
|
|
149
|
+
customBreaker.recordFailure();
|
|
150
|
+
expect(customBreaker.getState()).to.equal(CircuitState.OPEN);
|
|
151
|
+
});
|
|
152
|
+
it('should respect custom half-open attempts', async () => {
|
|
153
|
+
const customBreaker = new CircuitBreaker('test', {
|
|
154
|
+
enabled: true,
|
|
155
|
+
failureThreshold: 2,
|
|
156
|
+
openTimeoutMs: 100,
|
|
157
|
+
halfOpenMaxAttempts: 3,
|
|
158
|
+
});
|
|
159
|
+
// Open circuit
|
|
160
|
+
customBreaker.recordFailure();
|
|
161
|
+
customBreaker.recordFailure();
|
|
162
|
+
// Wait for timeout
|
|
163
|
+
await new Promise((resolve) => setTimeout(resolve, 150));
|
|
164
|
+
// Should allow 3 attempts in HALF_OPEN
|
|
165
|
+
expect(customBreaker.shouldAllowRequest()).to.equal(true);
|
|
166
|
+
expect(customBreaker.shouldAllowRequest()).to.equal(true);
|
|
167
|
+
expect(customBreaker.shouldAllowRequest()).to.equal(true);
|
|
168
|
+
expect(customBreaker.shouldAllowRequest()).to.equal(false);
|
|
169
|
+
});
|
|
170
|
+
it('should bypass all logic when disabled', () => {
|
|
171
|
+
const disabledBreaker = new CircuitBreaker('test', {
|
|
172
|
+
enabled: false,
|
|
173
|
+
failureThreshold: 1,
|
|
174
|
+
openTimeoutMs: 1000,
|
|
175
|
+
halfOpenMaxAttempts: 1,
|
|
176
|
+
});
|
|
177
|
+
// Record many failures
|
|
178
|
+
disabledBreaker.recordFailure();
|
|
179
|
+
disabledBreaker.recordFailure();
|
|
180
|
+
disabledBreaker.recordFailure();
|
|
181
|
+
// Should still allow requests
|
|
182
|
+
expect(disabledBreaker.shouldAllowRequest()).to.equal(true);
|
|
183
|
+
expect(disabledBreaker.getState()).to.equal(CircuitState.CLOSED);
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
describe('Manual Control', () => {
|
|
187
|
+
it('should reset to CLOSED state', () => {
|
|
188
|
+
// Open circuit
|
|
189
|
+
breaker.recordFailure();
|
|
190
|
+
breaker.recordFailure();
|
|
191
|
+
breaker.recordFailure();
|
|
192
|
+
expect(breaker.getState()).to.equal(CircuitState.OPEN);
|
|
193
|
+
// Reset
|
|
194
|
+
breaker.reset();
|
|
195
|
+
expect(breaker.getState()).to.equal(CircuitState.CLOSED);
|
|
196
|
+
expect(breaker.getStats().consecutiveFailures).to.equal(0);
|
|
197
|
+
expect(breaker.shouldAllowRequest()).to.equal(true);
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
describe('Statistics', () => {
|
|
201
|
+
it('should provide comprehensive stats', () => {
|
|
202
|
+
breaker.recordFailure();
|
|
203
|
+
breaker.recordFailure();
|
|
204
|
+
breaker.recordSuccess();
|
|
205
|
+
const stats = breaker.getStats();
|
|
206
|
+
expect(stats).to.have.property('state');
|
|
207
|
+
expect(stats).to.have.property('consecutiveFailures');
|
|
208
|
+
expect(stats).to.have.property('totalFailures');
|
|
209
|
+
expect(stats).to.have.property('totalSuccesses');
|
|
210
|
+
expect(stats).to.have.property('lastFailureTime');
|
|
211
|
+
expect(stats).to.have.property('lastSuccessTime');
|
|
212
|
+
expect(stats).to.have.property('openedAt');
|
|
213
|
+
expect(stats.state).to.equal(CircuitState.CLOSED);
|
|
214
|
+
expect(stats.consecutiveFailures).to.equal(0);
|
|
215
|
+
expect(stats.totalFailures).to.equal(2);
|
|
216
|
+
expect(stats.totalSuccesses).to.equal(1);
|
|
217
|
+
});
|
|
218
|
+
it('should track openedAt timestamp', () => {
|
|
219
|
+
const before = Date.now();
|
|
220
|
+
breaker.recordFailure();
|
|
221
|
+
breaker.recordFailure();
|
|
222
|
+
breaker.recordFailure();
|
|
223
|
+
const after = Date.now();
|
|
224
|
+
const stats = breaker.getStats();
|
|
225
|
+
expect(stats.openedAt).greaterThanOrEqual(before);
|
|
226
|
+
expect(stats.openedAt).lessThanOrEqual(after);
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
describe('Edge Cases', () => {
|
|
230
|
+
it('should handle rapid state transitions', async () => {
|
|
231
|
+
// Open
|
|
232
|
+
breaker.recordFailure();
|
|
233
|
+
breaker.recordFailure();
|
|
234
|
+
breaker.recordFailure();
|
|
235
|
+
expect(breaker.getState()).to.equal(CircuitState.OPEN);
|
|
236
|
+
// Wait for HALF_OPEN
|
|
237
|
+
await new Promise((resolve) => setTimeout(resolve, 1100));
|
|
238
|
+
breaker.shouldAllowRequest();
|
|
239
|
+
expect(breaker.getState()).to.equal(CircuitState.HALF_OPEN);
|
|
240
|
+
// Close
|
|
241
|
+
breaker.recordSuccess();
|
|
242
|
+
expect(breaker.getState()).to.equal(CircuitState.CLOSED);
|
|
243
|
+
// Open again
|
|
244
|
+
breaker.recordFailure();
|
|
245
|
+
breaker.recordFailure();
|
|
246
|
+
breaker.recordFailure();
|
|
247
|
+
expect(breaker.getState()).to.equal(CircuitState.OPEN);
|
|
248
|
+
});
|
|
249
|
+
it('should not open before timeout expires in OPEN state', async () => {
|
|
250
|
+
// Open circuit
|
|
251
|
+
breaker.recordFailure();
|
|
252
|
+
breaker.recordFailure();
|
|
253
|
+
breaker.recordFailure();
|
|
254
|
+
expect(breaker.getState()).to.equal(CircuitState.OPEN);
|
|
255
|
+
// Wait less than timeout
|
|
256
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
257
|
+
// Should still be closed
|
|
258
|
+
expect(breaker.shouldAllowRequest()).to.equal(false);
|
|
259
|
+
expect(breaker.getState()).to.equal(CircuitState.OPEN);
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { oObject, oAddress } from '@olane/o-core';
|
|
2
|
+
import { CircuitBreakerConfig } from './circuit-breaker.js';
|
|
3
|
+
export interface LeaderRetryConfig {
|
|
4
|
+
enabled: boolean;
|
|
5
|
+
maxAttempts: number;
|
|
6
|
+
baseDelayMs: number;
|
|
7
|
+
maxDelayMs: number;
|
|
8
|
+
timeoutMs: number;
|
|
9
|
+
circuitBreaker?: CircuitBreakerConfig;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Leader Request Wrapper
|
|
13
|
+
*
|
|
14
|
+
* Wraps requests to leader/registry with retry logic and circuit breaker.
|
|
15
|
+
* Used when leader may be temporarily unavailable (healing, maintenance).
|
|
16
|
+
*
|
|
17
|
+
* Strategy:
|
|
18
|
+
* 1. Detect if request is to leader or registry
|
|
19
|
+
* 2. Check circuit breaker state (fast-fail if open)
|
|
20
|
+
* 3. Apply retry logic with exponential backoff
|
|
21
|
+
* 4. Timeout individual attempts
|
|
22
|
+
* 5. Record success/failure in circuit breaker
|
|
23
|
+
* 6. Log retries for observability
|
|
24
|
+
*/
|
|
25
|
+
export declare class LeaderRequestWrapper extends oObject {
|
|
26
|
+
private config;
|
|
27
|
+
private leaderCircuitBreaker;
|
|
28
|
+
private registryCircuitBreaker;
|
|
29
|
+
constructor(config: LeaderRetryConfig);
|
|
30
|
+
/**
|
|
31
|
+
* Check if address is a leader-related address that needs retry
|
|
32
|
+
*/
|
|
33
|
+
private isLeaderAddress;
|
|
34
|
+
/**
|
|
35
|
+
* Get the appropriate circuit breaker for the address
|
|
36
|
+
*/
|
|
37
|
+
private getCircuitBreaker;
|
|
38
|
+
/**
|
|
39
|
+
* Execute request with retry logic and circuit breaker
|
|
40
|
+
*/
|
|
41
|
+
execute<T>(requestFn: () => Promise<T>, address: oAddress, context?: string): Promise<T>;
|
|
42
|
+
/**
|
|
43
|
+
* Calculate exponential backoff delay
|
|
44
|
+
*/
|
|
45
|
+
private calculateBackoffDelay;
|
|
46
|
+
/**
|
|
47
|
+
* Sleep utility
|
|
48
|
+
*/
|
|
49
|
+
private sleep;
|
|
50
|
+
/**
|
|
51
|
+
* Get current configuration
|
|
52
|
+
*/
|
|
53
|
+
getConfig(): LeaderRetryConfig;
|
|
54
|
+
/**
|
|
55
|
+
* Get circuit breaker statistics for observability
|
|
56
|
+
*/
|
|
57
|
+
getCircuitBreakerStats(): {
|
|
58
|
+
leader: import("./circuit-breaker.js").CircuitStats;
|
|
59
|
+
registry: import("./circuit-breaker.js").CircuitStats;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Reset circuit breakers (for testing or manual recovery)
|
|
63
|
+
*/
|
|
64
|
+
resetCircuitBreakers(): void;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=leader-request-wrapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leader-request-wrapper.d.ts","sourceRoot":"","sources":["../../../src/utils/leader-request-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAuB,MAAM,eAAe,CAAC;AACvE,OAAO,EAEL,oBAAoB,EAErB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,oBAAoB,CAAC;CACvC;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,oBAAqB,SAAQ,OAAO;IAInC,OAAO,CAAC,MAAM;IAH1B,OAAO,CAAC,oBAAoB,CAAiB;IAC7C,OAAO,CAAC,sBAAsB,CAAiB;gBAE3B,MAAM,EAAE,iBAAiB;IAuB7C;;OAEG;IACH,OAAO,CAAC,eAAe;IAKvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAWzB;;OAEG;IACG,OAAO,CAAC,CAAC,EACb,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,OAAO,EAAE,QAAQ,EACjB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,CAAC,CAAC;IA2Gb;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAK7B;;OAEG;IACH,OAAO,CAAC,KAAK;IAIb;;OAEG;IACH,SAAS,IAAI,iBAAiB;IAI9B;;OAEG;IACH,sBAAsB;;;;IAOtB;;OAEG;IACH,oBAAoB,IAAI,IAAI;CAI7B"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { oObject } from '@olane/o-core';
|
|
2
|
+
import { CircuitBreaker, CircuitState, } from './circuit-breaker.js';
|
|
3
|
+
/**
|
|
4
|
+
* Leader Request Wrapper
|
|
5
|
+
*
|
|
6
|
+
* Wraps requests to leader/registry with retry logic and circuit breaker.
|
|
7
|
+
* Used when leader may be temporarily unavailable (healing, maintenance).
|
|
8
|
+
*
|
|
9
|
+
* Strategy:
|
|
10
|
+
* 1. Detect if request is to leader or registry
|
|
11
|
+
* 2. Check circuit breaker state (fast-fail if open)
|
|
12
|
+
* 3. Apply retry logic with exponential backoff
|
|
13
|
+
* 4. Timeout individual attempts
|
|
14
|
+
* 5. Record success/failure in circuit breaker
|
|
15
|
+
* 6. Log retries for observability
|
|
16
|
+
*/
|
|
17
|
+
export class LeaderRequestWrapper extends oObject {
|
|
18
|
+
constructor(config) {
|
|
19
|
+
super();
|
|
20
|
+
this.config = config;
|
|
21
|
+
// Initialize circuit breakers with defaults if not provided
|
|
22
|
+
const defaultCircuitBreakerConfig = {
|
|
23
|
+
failureThreshold: 3,
|
|
24
|
+
openTimeoutMs: 30000, // 30 seconds
|
|
25
|
+
halfOpenMaxAttempts: 1,
|
|
26
|
+
enabled: true,
|
|
27
|
+
};
|
|
28
|
+
const circuitConfig = {
|
|
29
|
+
...defaultCircuitBreakerConfig,
|
|
30
|
+
...(config.circuitBreaker || {}),
|
|
31
|
+
};
|
|
32
|
+
this.leaderCircuitBreaker = new CircuitBreaker('leader', circuitConfig);
|
|
33
|
+
this.registryCircuitBreaker = new CircuitBreaker('registry', circuitConfig);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Check if address is a leader-related address that needs retry
|
|
37
|
+
*/
|
|
38
|
+
isLeaderAddress(address) {
|
|
39
|
+
const addressStr = address.toString();
|
|
40
|
+
return addressStr === 'o://leader' || addressStr === 'o://registry';
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get the appropriate circuit breaker for the address
|
|
44
|
+
*/
|
|
45
|
+
getCircuitBreaker(address) {
|
|
46
|
+
const addressStr = address.toString();
|
|
47
|
+
if (addressStr === 'o://leader') {
|
|
48
|
+
return this.leaderCircuitBreaker;
|
|
49
|
+
}
|
|
50
|
+
if (addressStr === 'o://registry') {
|
|
51
|
+
return this.registryCircuitBreaker;
|
|
52
|
+
}
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Execute request with retry logic and circuit breaker
|
|
57
|
+
*/
|
|
58
|
+
async execute(requestFn, address, context) {
|
|
59
|
+
// If retry disabled or not a leader address, execute directly
|
|
60
|
+
if (!this.config.enabled || !this.isLeaderAddress(address)) {
|
|
61
|
+
return await requestFn();
|
|
62
|
+
}
|
|
63
|
+
const circuitBreaker = this.getCircuitBreaker(address);
|
|
64
|
+
// Check circuit breaker state before attempting
|
|
65
|
+
if (circuitBreaker && !circuitBreaker.shouldAllowRequest()) {
|
|
66
|
+
const stats = circuitBreaker.getStats();
|
|
67
|
+
const error = new Error(`Circuit breaker is ${stats.state} for ${address.toString()}. ` +
|
|
68
|
+
`Consecutive failures: ${stats.consecutiveFailures}. ` +
|
|
69
|
+
`Fast-failing to prevent cascading failures.`);
|
|
70
|
+
this.logger.warn(`Circuit breaker blocked request to ${address.toString()}` +
|
|
71
|
+
(context ? ` (${context})` : ''));
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
let attempt = 0;
|
|
75
|
+
let lastError;
|
|
76
|
+
while (attempt < this.config.maxAttempts) {
|
|
77
|
+
attempt++;
|
|
78
|
+
try {
|
|
79
|
+
if (attempt > 5) {
|
|
80
|
+
this.logger.debug(`Retrying... Leader request attempt ${attempt}/${this.config.maxAttempts}` +
|
|
81
|
+
(context ? ` (${context})` : ''));
|
|
82
|
+
}
|
|
83
|
+
// Create timeout promise
|
|
84
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
85
|
+
setTimeout(() => reject(new Error(`Leader request timeout after ${this.config.timeoutMs}ms`)), this.config.timeoutMs);
|
|
86
|
+
});
|
|
87
|
+
// Race between request and timeout
|
|
88
|
+
const result = await Promise.race([requestFn(), timeoutPromise]);
|
|
89
|
+
// Success! Record in circuit breaker
|
|
90
|
+
if (circuitBreaker) {
|
|
91
|
+
circuitBreaker.recordSuccess();
|
|
92
|
+
}
|
|
93
|
+
if (attempt > 1) {
|
|
94
|
+
this.logger.info(`Leader request succeeded after ${attempt} attempts` +
|
|
95
|
+
(context ? ` (${context})` : ''));
|
|
96
|
+
}
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
101
|
+
// Record failure in circuit breaker
|
|
102
|
+
if (circuitBreaker) {
|
|
103
|
+
circuitBreaker.recordFailure();
|
|
104
|
+
}
|
|
105
|
+
this.logger.warn(`Leader request attempt ${attempt} failed: ${lastError.message}` +
|
|
106
|
+
(context ? ` (${context})` : ''));
|
|
107
|
+
// Check if circuit breaker has opened during retries
|
|
108
|
+
if (circuitBreaker && circuitBreaker.getState() === CircuitState.OPEN) {
|
|
109
|
+
this.logger.error(`Circuit breaker opened during retries for ${address.toString()}, stopping retry attempts` +
|
|
110
|
+
(context ? ` (${context})` : ''));
|
|
111
|
+
throw new Error(`Circuit breaker opened after ${attempt} attempts: ${lastError.message}`);
|
|
112
|
+
}
|
|
113
|
+
if (attempt < this.config.maxAttempts) {
|
|
114
|
+
const delay = this.calculateBackoffDelay(attempt);
|
|
115
|
+
this.logger.debug(`Waiting ${delay}ms before next attempt...`);
|
|
116
|
+
await this.sleep(delay);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// All attempts failed
|
|
121
|
+
this.logger.error(`Leader request failed after ${this.config.maxAttempts} attempts` +
|
|
122
|
+
(context ? ` (${context})` : ''));
|
|
123
|
+
throw lastError || new Error('Leader request failed');
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Calculate exponential backoff delay
|
|
127
|
+
*/
|
|
128
|
+
calculateBackoffDelay(attempt) {
|
|
129
|
+
const delay = this.config.baseDelayMs * Math.pow(2, attempt - 1);
|
|
130
|
+
return Math.min(delay, this.config.maxDelayMs);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Sleep utility
|
|
134
|
+
*/
|
|
135
|
+
sleep(ms) {
|
|
136
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Get current configuration
|
|
140
|
+
*/
|
|
141
|
+
getConfig() {
|
|
142
|
+
return { ...this.config };
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Get circuit breaker statistics for observability
|
|
146
|
+
*/
|
|
147
|
+
getCircuitBreakerStats() {
|
|
148
|
+
return {
|
|
149
|
+
leader: this.leaderCircuitBreaker.getStats(),
|
|
150
|
+
registry: this.registryCircuitBreaker.getStats(),
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Reset circuit breakers (for testing or manual recovery)
|
|
155
|
+
*/
|
|
156
|
+
resetCircuitBreakers() {
|
|
157
|
+
this.leaderCircuitBreaker.reset();
|
|
158
|
+
this.registryCircuitBreaker.reset();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=leader-request-wrapper.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leader-request-wrapper.test.d.ts","sourceRoot":"","sources":["../../../src/utils/leader-request-wrapper.test.ts"],"names":[],"mappings":""}
|