@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,246 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// import { expect } from 'chai';
|
|
3
|
+
// import { LeaderRequestWrapper } from './leader-request-wrapper.js';
|
|
4
|
+
// import { oAddress } from '@olane/o-core';
|
|
5
|
+
// import { CircuitState } from './circuit-breaker.js';
|
|
6
|
+
// describe('LeaderRequestWrapper with Circuit Breaker', () => {
|
|
7
|
+
// let wrapper: LeaderRequestWrapper;
|
|
8
|
+
// const leaderAddress = new oAddress('o://leader');
|
|
9
|
+
// const registryAddress = new oAddress('o://registry');
|
|
10
|
+
// const regularAddress = new oAddress('o://some-service');
|
|
11
|
+
// beforeEach(() => {
|
|
12
|
+
// wrapper = new LeaderRequestWrapper({
|
|
13
|
+
// enabled: true,
|
|
14
|
+
// maxAttempts: 5,
|
|
15
|
+
// baseDelayMs: 10,
|
|
16
|
+
// maxDelayMs: 100,
|
|
17
|
+
// timeoutMs: 1000,
|
|
18
|
+
// circuitBreaker: {
|
|
19
|
+
// enabled: true,
|
|
20
|
+
// failureThreshold: 3,
|
|
21
|
+
// openTimeoutMs: 500,
|
|
22
|
+
// halfOpenMaxAttempts: 1,
|
|
23
|
+
// },
|
|
24
|
+
// });
|
|
25
|
+
// });
|
|
26
|
+
// describe('Circuit Breaker Integration', () => {
|
|
27
|
+
// it('should execute request successfully and record success', async () => {
|
|
28
|
+
// const mockRequest = vi.fn().mockResolvedValue('success');
|
|
29
|
+
// const result = await wrapper.execute(mockRequest, leaderAddress);
|
|
30
|
+
// expect(result).toBe('success');
|
|
31
|
+
// expect(mockRequest).toHaveBeenCalledTimes(1);
|
|
32
|
+
// const stats = wrapper.getCircuitBreakerStats();
|
|
33
|
+
// expect(stats.leader.totalSuccesses).toBe(1);
|
|
34
|
+
// expect(stats.leader.state).toBe(CircuitState.CLOSED);
|
|
35
|
+
// });
|
|
36
|
+
// it('should record failures in circuit breaker', async () => {
|
|
37
|
+
// const mockRequest = vi.fn().mockRejectedValue(new Error('Service down'));
|
|
38
|
+
// await expect(
|
|
39
|
+
// wrapper.execute(mockRequest, leaderAddress),
|
|
40
|
+
// ).rejects.toThrow();
|
|
41
|
+
// const stats = wrapper.getCircuitBreakerStats();
|
|
42
|
+
// expect(stats.leader.totalFailures).toBeGreaterThan(0);
|
|
43
|
+
// expect(stats.leader.consecutiveFailures).toBeGreaterThan(0);
|
|
44
|
+
// });
|
|
45
|
+
// it('should open circuit after threshold failures', async () => {
|
|
46
|
+
// const mockRequest = vi.fn().mockRejectedValue(new Error('Service down'));
|
|
47
|
+
// // Attempt request multiple times to trigger circuit breaker
|
|
48
|
+
// await expect(
|
|
49
|
+
// wrapper.execute(mockRequest, leaderAddress),
|
|
50
|
+
// ).rejects.toThrow();
|
|
51
|
+
// const stats = wrapper.getCircuitBreakerStats();
|
|
52
|
+
// expect(stats.leader.state).toBe(CircuitState.OPEN);
|
|
53
|
+
// });
|
|
54
|
+
// it('should fast-fail when circuit is open', async () => {
|
|
55
|
+
// const mockRequest = vi.fn().mockRejectedValue(new Error('Service down'));
|
|
56
|
+
// // First request to open circuit
|
|
57
|
+
// await expect(
|
|
58
|
+
// wrapper.execute(mockRequest, leaderAddress),
|
|
59
|
+
// ).rejects.toThrow();
|
|
60
|
+
// // Reset mock to verify it's not called
|
|
61
|
+
// mockRequest.mockClear();
|
|
62
|
+
// // Second request should fast-fail
|
|
63
|
+
// await expect(wrapper.execute(mockRequest, leaderAddress)).rejects.toThrow(
|
|
64
|
+
// /Circuit breaker is OPEN/,
|
|
65
|
+
// );
|
|
66
|
+
// // Request function should not have been called
|
|
67
|
+
// expect(mockRequest).not.toHaveBeenCalled();
|
|
68
|
+
// });
|
|
69
|
+
// it('should stop retrying when circuit opens mid-retry', async () => {
|
|
70
|
+
// let callCount = 0;
|
|
71
|
+
// const mockRequest = vi.fn().mockImplementation(() => {
|
|
72
|
+
// callCount++;
|
|
73
|
+
// throw new Error('Service down');
|
|
74
|
+
// });
|
|
75
|
+
// await expect(
|
|
76
|
+
// wrapper.execute(mockRequest, leaderAddress),
|
|
77
|
+
// ).rejects.toThrow();
|
|
78
|
+
// // Should have stopped retrying after circuit opened
|
|
79
|
+
// expect(callCount).toBeLessThan(5); // Less than maxAttempts
|
|
80
|
+
// expect(callCount).toBeGreaterThanOrEqual(3); // At least threshold attempts
|
|
81
|
+
// });
|
|
82
|
+
// it('should track separate circuits for leader and registry', async () => {
|
|
83
|
+
// const failingRequest = vi
|
|
84
|
+
// .fn()
|
|
85
|
+
// .mockRejectedValue(new Error('Service down'));
|
|
86
|
+
// // Fail leader requests
|
|
87
|
+
// await expect(
|
|
88
|
+
// wrapper.execute(failingRequest, leaderAddress),
|
|
89
|
+
// ).rejects.toThrow();
|
|
90
|
+
// const stats = wrapper.getCircuitBreakerStats();
|
|
91
|
+
// expect(stats.leader.state).toBe(CircuitState.OPEN);
|
|
92
|
+
// expect(stats.registry.state).toBe(CircuitState.CLOSED);
|
|
93
|
+
// });
|
|
94
|
+
// it('should allow recovery after timeout in HALF_OPEN state', async () => {
|
|
95
|
+
// const mockRequest = vi
|
|
96
|
+
// .fn()
|
|
97
|
+
// .mockRejectedValueOnce(new Error('Service down'))
|
|
98
|
+
// .mockResolvedValue('recovered');
|
|
99
|
+
// // Open circuit
|
|
100
|
+
// await expect(
|
|
101
|
+
// wrapper.execute(mockRequest, leaderAddress),
|
|
102
|
+
// ).rejects.toThrow();
|
|
103
|
+
// expect(wrapper.getCircuitBreakerStats().leader.state).toBe(
|
|
104
|
+
// CircuitState.OPEN,
|
|
105
|
+
// );
|
|
106
|
+
// // Wait for circuit to attempt recovery
|
|
107
|
+
// await new Promise((resolve) => setTimeout(resolve, 600));
|
|
108
|
+
// // Should succeed and close circuit
|
|
109
|
+
// const result = await wrapper.execute(mockRequest, leaderAddress);
|
|
110
|
+
// expect(result).toBe('recovered');
|
|
111
|
+
// expect(wrapper.getCircuitBreakerStats().leader.state).toBe(
|
|
112
|
+
// CircuitState.CLOSED,
|
|
113
|
+
// );
|
|
114
|
+
// });
|
|
115
|
+
// });
|
|
116
|
+
// describe('Non-Leader Addresses', () => {
|
|
117
|
+
// it('should not use circuit breaker for non-leader addresses', async () => {
|
|
118
|
+
// const mockRequest = vi.fn().mockRejectedValue(new Error('Service down'));
|
|
119
|
+
// await expect(
|
|
120
|
+
// wrapper.execute(mockRequest, regularAddress),
|
|
121
|
+
// ).rejects.toThrow('Service down');
|
|
122
|
+
// // Should execute directly without retry
|
|
123
|
+
// expect(mockRequest).toHaveBeenCalledTimes(1);
|
|
124
|
+
// // Should not affect circuit breaker stats
|
|
125
|
+
// const stats = wrapper.getCircuitBreakerStats();
|
|
126
|
+
// expect(stats.leader.totalFailures).toBe(0);
|
|
127
|
+
// expect(stats.registry.totalFailures).toBe(0);
|
|
128
|
+
// });
|
|
129
|
+
// it('should execute successful requests directly', async () => {
|
|
130
|
+
// const mockRequest = vi.fn().mockResolvedValue('success');
|
|
131
|
+
// const result = await wrapper.execute(mockRequest, regularAddress);
|
|
132
|
+
// expect(result).toBe('success');
|
|
133
|
+
// expect(mockRequest).toHaveBeenCalledTimes(1);
|
|
134
|
+
// });
|
|
135
|
+
// });
|
|
136
|
+
// describe('Timeout Handling', () => {
|
|
137
|
+
// it('should timeout long-running requests', async () => {
|
|
138
|
+
// const longRequest = vi.fn().mockImplementation(
|
|
139
|
+
// () =>
|
|
140
|
+
// new Promise((resolve) => {
|
|
141
|
+
// setTimeout(() => resolve('too-late'), 2000);
|
|
142
|
+
// }),
|
|
143
|
+
// );
|
|
144
|
+
// await expect(wrapper.execute(longRequest, leaderAddress)).rejects.toThrow(
|
|
145
|
+
// /timeout/,
|
|
146
|
+
// );
|
|
147
|
+
// });
|
|
148
|
+
// it('should record timeout as failure in circuit breaker', async () => {
|
|
149
|
+
// const longRequest = vi.fn().mockImplementation(
|
|
150
|
+
// () =>
|
|
151
|
+
// new Promise((resolve) => {
|
|
152
|
+
// setTimeout(() => resolve('too-late'), 2000);
|
|
153
|
+
// }),
|
|
154
|
+
// );
|
|
155
|
+
// await expect(
|
|
156
|
+
// wrapper.execute(longRequest, leaderAddress),
|
|
157
|
+
// ).rejects.toThrow();
|
|
158
|
+
// const stats = wrapper.getCircuitBreakerStats();
|
|
159
|
+
// expect(stats.leader.totalFailures).toBeGreaterThan(0);
|
|
160
|
+
// });
|
|
161
|
+
// });
|
|
162
|
+
// describe('Configuration', () => {
|
|
163
|
+
// it('should bypass retry when disabled', async () => {
|
|
164
|
+
// const disabledWrapper = new LeaderRequestWrapper({
|
|
165
|
+
// enabled: false,
|
|
166
|
+
// maxAttempts: 5,
|
|
167
|
+
// baseDelayMs: 10,
|
|
168
|
+
// maxDelayMs: 100,
|
|
169
|
+
// timeoutMs: 1000,
|
|
170
|
+
// });
|
|
171
|
+
// const mockRequest = vi.fn().mockRejectedValue(new Error('Fail'));
|
|
172
|
+
// await expect(
|
|
173
|
+
// disabledWrapper.execute(mockRequest, leaderAddress),
|
|
174
|
+
// ).rejects.toThrow('Fail');
|
|
175
|
+
// // Should only call once (no retry)
|
|
176
|
+
// expect(mockRequest).toHaveBeenCalledTimes(1);
|
|
177
|
+
// });
|
|
178
|
+
// it('should allow circuit breaker to be disabled', async () => {
|
|
179
|
+
// const noBreakerWrapper = new LeaderRequestWrapper({
|
|
180
|
+
// enabled: true,
|
|
181
|
+
// maxAttempts: 3,
|
|
182
|
+
// baseDelayMs: 10,
|
|
183
|
+
// maxDelayMs: 100,
|
|
184
|
+
// timeoutMs: 1000,
|
|
185
|
+
// circuitBreaker: {
|
|
186
|
+
// enabled: false,
|
|
187
|
+
// failureThreshold: 3,
|
|
188
|
+
// openTimeoutMs: 500,
|
|
189
|
+
// halfOpenMaxAttempts: 1,
|
|
190
|
+
// },
|
|
191
|
+
// });
|
|
192
|
+
// let callCount = 0;
|
|
193
|
+
// const mockRequest = vi.fn().mockImplementation(() => {
|
|
194
|
+
// callCount++;
|
|
195
|
+
// throw new Error('Fail');
|
|
196
|
+
// });
|
|
197
|
+
// await expect(
|
|
198
|
+
// noBreakerWrapper.execute(mockRequest, leaderAddress),
|
|
199
|
+
// ).rejects.toThrow();
|
|
200
|
+
// // Should retry all attempts even with failures
|
|
201
|
+
// expect(callCount).toBe(3);
|
|
202
|
+
// });
|
|
203
|
+
// });
|
|
204
|
+
// describe('Manual Reset', () => {
|
|
205
|
+
// it('should reset circuit breakers manually', async () => {
|
|
206
|
+
// const mockRequest = vi.fn().mockRejectedValue(new Error('Service down'));
|
|
207
|
+
// // Open circuit
|
|
208
|
+
// await expect(
|
|
209
|
+
// wrapper.execute(mockRequest, leaderAddress),
|
|
210
|
+
// ).rejects.toThrow();
|
|
211
|
+
// expect(wrapper.getCircuitBreakerStats().leader.state).toBe(
|
|
212
|
+
// CircuitState.OPEN,
|
|
213
|
+
// );
|
|
214
|
+
// // Reset
|
|
215
|
+
// wrapper.resetCircuitBreakers();
|
|
216
|
+
// expect(wrapper.getCircuitBreakerStats().leader.state).toBe(
|
|
217
|
+
// CircuitState.CLOSED,
|
|
218
|
+
// );
|
|
219
|
+
// expect(wrapper.getCircuitBreakerStats().registry.state).toBe(
|
|
220
|
+
// CircuitState.CLOSED,
|
|
221
|
+
// );
|
|
222
|
+
// });
|
|
223
|
+
// });
|
|
224
|
+
// describe('Registry Address', () => {
|
|
225
|
+
// it('should use separate circuit breaker for registry', async () => {
|
|
226
|
+
// const mockRequest = vi.fn().mockRejectedValue(new Error('Registry down'));
|
|
227
|
+
// await expect(
|
|
228
|
+
// wrapper.execute(mockRequest, registryAddress),
|
|
229
|
+
// ).rejects.toThrow();
|
|
230
|
+
// const stats = wrapper.getCircuitBreakerStats();
|
|
231
|
+
// expect(stats.registry.totalFailures).toBeGreaterThan(0);
|
|
232
|
+
// expect(stats.registry.state).toBe(CircuitState.OPEN);
|
|
233
|
+
// expect(stats.leader.state).toBe(CircuitState.CLOSED);
|
|
234
|
+
// });
|
|
235
|
+
// });
|
|
236
|
+
// describe('Statistics', () => {
|
|
237
|
+
// it('should provide circuit breaker statistics', () => {
|
|
238
|
+
// const stats = wrapper.getCircuitBreakerStats();
|
|
239
|
+
// expect(stats).toHaveProperty('leader');
|
|
240
|
+
// expect(stats).toHaveProperty('registry');
|
|
241
|
+
// expect(stats.leader).toHaveProperty('state');
|
|
242
|
+
// expect(stats.leader).toHaveProperty('consecutiveFailures');
|
|
243
|
+
// expect(stats.registry).toHaveProperty('state');
|
|
244
|
+
// });
|
|
245
|
+
// });
|
|
246
|
+
// });
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Stream } from '@olane/o-config';
|
|
2
|
+
import { oObject, oRequest } from '@olane/o-core';
|
|
3
|
+
export declare class StreamUtils extends oObject {
|
|
4
|
+
static processGenerator(request: oRequest, generator: AsyncGenerator<any>, stream: Stream): Promise<any>;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=stream.utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.utils.d.ts","sourceRoot":"","sources":["../../../src/utils/stream.utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAEL,OAAO,EACP,QAAQ,EAGT,MAAM,eAAe,CAAC;AAEvB,qBAAa,WAAY,SAAQ,OAAO;WAClB,gBAAgB,CAClC,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAE,cAAc,CAAC,GAAG,CAAC,EAC9B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,GAAG,CAAC;CA6BhB"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { CoreUtils, oObject, ResponseBuilder, } from '@olane/o-core';
|
|
2
|
+
export class StreamUtils extends oObject {
|
|
3
|
+
static async processGenerator(request, generator, stream) {
|
|
4
|
+
const utils = new StreamUtils();
|
|
5
|
+
const responseBuilder = ResponseBuilder.create();
|
|
6
|
+
let aggregatedResult = '';
|
|
7
|
+
try {
|
|
8
|
+
// Send each chunk from the generator
|
|
9
|
+
// result should not be an oResponse, but rather a key value pair dict
|
|
10
|
+
for await (const result of generator) {
|
|
11
|
+
if (result.delta) {
|
|
12
|
+
aggregatedResult += result.delta;
|
|
13
|
+
}
|
|
14
|
+
const chunkResponse = await responseBuilder.buildChunk(request, result);
|
|
15
|
+
await CoreUtils.sendStreamResponse(chunkResponse, stream);
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
message: aggregatedResult,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
// If error occurs during streaming, send error response
|
|
23
|
+
const errorResponse = await responseBuilder.buildError(request, error, {
|
|
24
|
+
isStream: true,
|
|
25
|
+
isLast: true,
|
|
26
|
+
});
|
|
27
|
+
await CoreUtils.sendStreamResponse(errorResponse, stream);
|
|
28
|
+
throw error;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-breaker.test.d.ts","sourceRoot":"","sources":["../../test/circuit-breaker.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import { expect } from 'chai';
|
|
2
|
+
import { CircuitBreaker, CircuitState } from '../src/utils/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,15 @@
|
|
|
1
|
+
import { oNodeTool } from '../../src/o-node.tool.js';
|
|
2
|
+
/**
|
|
3
|
+
* Test-only extension of oNodeTool that adds streaming test methods.
|
|
4
|
+
* This class should only be used in test files and is not part of the production code.
|
|
5
|
+
*/
|
|
6
|
+
export declare class TestNodeTool extends oNodeTool {
|
|
7
|
+
/**
|
|
8
|
+
* Test method that emits chunks for 10 seconds at 100ms intervals.
|
|
9
|
+
* Used for testing streaming functionality across hierarchical networks.
|
|
10
|
+
*
|
|
11
|
+
* @returns AsyncGenerator that yields 100 chunks over 10 seconds
|
|
12
|
+
*/
|
|
13
|
+
_tool_test_stream(): AsyncGenerator<any>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=test-node.tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-node.tool.d.ts","sourceRoot":"","sources":["../../../test/helpers/test-node.tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAErD;;;GAGG;AACH,qBAAa,YAAa,SAAQ,SAAS;IACzC;;;;;OAKG;IACI,iBAAiB,IAAI,cAAc,CAAC,GAAG,CAAC;CAehD"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { oNodeTool } from '../../src/o-node.tool.js';
|
|
2
|
+
/**
|
|
3
|
+
* Test-only extension of oNodeTool that adds streaming test methods.
|
|
4
|
+
* This class should only be used in test files and is not part of the production code.
|
|
5
|
+
*/
|
|
6
|
+
export class TestNodeTool extends oNodeTool {
|
|
7
|
+
/**
|
|
8
|
+
* Test method that emits chunks for 10 seconds at 100ms intervals.
|
|
9
|
+
* Used for testing streaming functionality across hierarchical networks.
|
|
10
|
+
*
|
|
11
|
+
* @returns AsyncGenerator that yields 100 chunks over 10 seconds
|
|
12
|
+
*/
|
|
13
|
+
async *_tool_test_stream() {
|
|
14
|
+
const totalDuration = 10000; // 10 seconds
|
|
15
|
+
const intervalMs = 100; // 100ms between chunks
|
|
16
|
+
const totalChunks = totalDuration / intervalMs; // 100 chunks
|
|
17
|
+
for (let i = 0; i < totalChunks; i++) {
|
|
18
|
+
yield {
|
|
19
|
+
chunk: i + 1,
|
|
20
|
+
timestamp: new Date().toISOString(),
|
|
21
|
+
nodeAddress: this.address.toString(),
|
|
22
|
+
message: `Chunk ${i + 1} of ${totalChunks}`,
|
|
23
|
+
};
|
|
24
|
+
await new Promise((resolve) => setTimeout(resolve, intervalMs));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -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":["../../test/leader-request-wrapper.test.ts"],"names":[],"mappings":""}
|