@reefclaw/openclaw-plugin 0.1.0
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/.gitignore +8 -0
- package/audit/mode-transition-audit.d.ts +11 -0
- package/audit/mode-transition-audit.js +29 -0
- package/balance-utils.d.ts +36 -0
- package/balance-utils.js +98 -0
- package/bridge/bridge.d.ts +109 -0
- package/bridge/bridge.js +1036 -0
- package/bridge/config.d.ts +43 -0
- package/bridge/config.js +176 -0
- package/bridge/connector.d.ts +52 -0
- package/bridge/connector.js +293 -0
- package/bridge/event-replay-buffer.d.ts +43 -0
- package/bridge/event-replay-buffer.js +109 -0
- package/bridge/gateway/event-parser.d.ts +209 -0
- package/bridge/gateway/event-parser.js +793 -0
- package/bridge/gateway/gateway-config.d.ts +39 -0
- package/bridge/gateway/gateway-config.js +86 -0
- package/bridge/gateway/gateway-http-client.d.ts +50 -0
- package/bridge/gateway/gateway-http-client.js +165 -0
- package/bridge/gateway/gateway-ws-client.d.ts +116 -0
- package/bridge/gateway/gateway-ws-client.js +417 -0
- package/bridge/gateway/poller.d.ts +146 -0
- package/bridge/gateway/poller.js +505 -0
- package/bridge/gateway/tool-discovery.d.ts +25 -0
- package/bridge/gateway/tool-discovery.js +198 -0
- package/bridge/index.d.ts +2 -0
- package/bridge/index.js +253 -0
- package/bridge/logger.d.ts +2 -0
- package/bridge/logger.js +2 -0
- package/bridge/provider.d.ts +156 -0
- package/bridge/provider.js +2 -0
- package/bridge/providers/emergency-commands.d.ts +54 -0
- package/bridge/providers/emergency-commands.js +235 -0
- package/bridge/providers/gateway.d.ts +322 -0
- package/bridge/providers/gateway.js +2302 -0
- package/bridge/providers/mock.d.ts +37 -0
- package/bridge/providers/mock.js +385 -0
- package/bridge/providers/onboarding-commands.d.ts +83 -0
- package/bridge/providers/onboarding-commands.js +213 -0
- package/bridge/providers/risk-calculator.d.ts +96 -0
- package/bridge/providers/risk-calculator.js +369 -0
- package/bridge/setup.d.ts +32 -0
- package/bridge/setup.js +226 -0
- package/bridge/types.d.ts +584 -0
- package/bridge/types.js +50 -0
- package/bridge/utils/reconnect.d.ts +6 -0
- package/bridge/utils/reconnect.js +6 -0
- package/bridge/utils/skill-signing.d.ts +51 -0
- package/bridge/utils/skill-signing.js +138 -0
- package/bridge/utils/skill-version.d.ts +17 -0
- package/bridge/utils/skill-version.js +74 -0
- package/ccxt/binance-ban-gate.d.ts +47 -0
- package/ccxt/binance-ban-gate.js +409 -0
- package/ccxt/binance-private.d.ts +325 -0
- package/ccxt/binance-private.js +1415 -0
- package/ccxt/binance-public.d.ts +18 -0
- package/ccxt/binance-public.js +147 -0
- package/config/agent-config-client.d.ts +55 -0
- package/config/agent-config-client.js +145 -0
- package/config/agent-config-poller.d.ts +25 -0
- package/config/agent-config-poller.js +100 -0
- package/config/brackets-config.d.ts +22 -0
- package/config/brackets-config.js +58 -0
- package/config/gate-store.d.ts +18 -0
- package/config/gate-store.js +61 -0
- package/config/plugin-config-io.d.ts +181 -0
- package/config/plugin-config-io.js +84 -0
- package/config/position-review-config.d.ts +35 -0
- package/config/position-review-config.js +105 -0
- package/config/tool-gate.d.ts +53 -0
- package/config/tool-gate.js +125 -0
- package/config/user-data-stream-config.d.ts +85 -0
- package/config/user-data-stream-config.js +224 -0
- package/connector-supervisor.d.ts +36 -0
- package/connector-supervisor.js +149 -0
- package/exchange-adapter.d.ts +49 -0
- package/exchange-adapter.js +4 -0
- package/index.d.ts +30 -0
- package/index.js +2030 -0
- package/ingest/pending-entry-metadata.d.ts +52 -0
- package/ingest/pending-entry-metadata.js +182 -0
- package/ingest/position-auto-capture.d.ts +98 -0
- package/ingest/position-auto-capture.js +394 -0
- package/ingest/position-decisions-client.d.ts +318 -0
- package/ingest/position-decisions-client.js +296 -0
- package/ingest/reconcile-db-vs-exchange.d.ts +13 -0
- package/ingest/reconcile-db-vs-exchange.js +114 -0
- package/ingest/reconciler-cleanup.d.ts +37 -0
- package/ingest/reconciler-cleanup.js +147 -0
- package/ingest/rest-gap-filler.d.ts +191 -0
- package/ingest/rest-gap-filler.js +565 -0
- package/ingest/touched-symbols-store.d.ts +25 -0
- package/ingest/touched-symbols-store.js +96 -0
- package/ingest/trade-store-client.d.ts +40 -0
- package/ingest/trade-store-client.js +125 -0
- package/ingest/ws-ingest.d.ts +43 -0
- package/ingest/ws-ingest.js +126 -0
- package/learning/setup-family.d.ts +21 -0
- package/learning/setup-family.js +103 -0
- package/lifecycle/install-signal-handlers.d.ts +33 -0
- package/lifecycle/install-signal-handlers.js +112 -0
- package/lifecycle/shutdown-coordinator.d.ts +43 -0
- package/lifecycle/shutdown-coordinator.js +131 -0
- package/live/bracket-id.d.ts +18 -0
- package/live/bracket-id.js +81 -0
- package/live/bracket-ledger.d.ts +54 -0
- package/live/bracket-ledger.js +267 -0
- package/live/bracket-manager.d.ts +82 -0
- package/live/bracket-manager.js +478 -0
- package/live/bracket-params.d.ts +22 -0
- package/live/bracket-params.js +124 -0
- package/live/bracket-reconciler.d.ts +95 -0
- package/live/bracket-reconciler.js +573 -0
- package/live/bracket-types.d.ts +102 -0
- package/live/bracket-types.js +8 -0
- package/live/deposit-tracker.d.ts +62 -0
- package/live/deposit-tracker.js +97 -0
- package/live/emergency-controls.d.ts +32 -0
- package/live/emergency-controls.js +226 -0
- package/live/exchange-errors.d.ts +12 -0
- package/live/exchange-errors.js +130 -0
- package/live/exchange-info-cache.d.ts +35 -0
- package/live/exchange-info-cache.js +119 -0
- package/live/fact-subscriber.d.ts +78 -0
- package/live/fact-subscriber.js +182 -0
- package/live/intent-journal.d.ts +42 -0
- package/live/intent-journal.js +122 -0
- package/live/listen-key-manager.d.ts +70 -0
- package/live/listen-key-manager.js +169 -0
- package/live/live-adapter.d.ts +264 -0
- package/live/live-adapter.js +1665 -0
- package/live/live-balance-enricher.d.ts +32 -0
- package/live/live-balance-enricher.js +104 -0
- package/live/live-bracket-api.d.ts +13 -0
- package/live/live-bracket-api.js +20 -0
- package/live/live-state-store.d.ts +194 -0
- package/live/live-state-store.js +450 -0
- package/live/local-signal-service.d.ts +57 -0
- package/live/local-signal-service.js +146 -0
- package/live/local-strategy-evaluator.d.ts +62 -0
- package/live/local-strategy-evaluator.js +127 -0
- package/live/microstructure-assembler.d.ts +54 -0
- package/live/microstructure-assembler.js +148 -0
- package/live/order-poller.d.ts +29 -0
- package/live/order-poller.js +125 -0
- package/live/position-state-store.d.ts +83 -0
- package/live/position-state-store.js +237 -0
- package/live/proposal-decision-listener.d.ts +64 -0
- package/live/proposal-decision-listener.js +288 -0
- package/live/proposal-manager.d.ts +76 -0
- package/live/proposal-manager.js +140 -0
- package/live/rate-limiter.d.ts +47 -0
- package/live/rate-limiter.js +159 -0
- package/live/reconciler.d.ts +39 -0
- package/live/reconciler.js +175 -0
- package/live/setup-buckets.d.ts +7 -0
- package/live/setup-buckets.js +33 -0
- package/live/slippage-tracker.d.ts +45 -0
- package/live/slippage-tracker.js +78 -0
- package/live/stop-watcher.d.ts +34 -0
- package/live/stop-watcher.js +158 -0
- package/live/user-data-active-probe.d.ts +54 -0
- package/live/user-data-active-probe.js +180 -0
- package/live/user-data-stream-controller.d.ts +200 -0
- package/live/user-data-stream-controller.js +579 -0
- package/live/user-data-stream-ws.d.ts +22 -0
- package/live/user-data-stream-ws.js +63 -0
- package/live/user-data-stream.d.ts +243 -0
- package/live/user-data-stream.js +704 -0
- package/logger.d.ts +2 -0
- package/logger.js +2 -0
- package/mfe.d.ts +21 -0
- package/mfe.js +68 -0
- package/onboarding/mode-ladder.d.ts +1 -0
- package/onboarding/mode-ladder.js +3 -0
- package/onboarding/runtime.d.ts +71 -0
- package/onboarding/runtime.js +153 -0
- package/openclaw.plugin.json +94 -0
- package/package.json +27 -0
- package/paper-adapter.d.ts +24 -0
- package/paper-adapter.js +91 -0
- package/persistence/state-manager.d.ts +42 -0
- package/persistence/state-manager.js +164 -0
- package/pinned-plan.d.ts +9 -0
- package/pinned-plan.js +23 -0
- package/risk/pre-trade-check.d.ts +38 -0
- package/risk/pre-trade-check.js +345 -0
- package/risk/pre-trade-types.d.ts +60 -0
- package/risk/pre-trade-types.js +3 -0
- package/scripts/assemble.mjs +114 -0
- package/shadow/shadow-tracker.d.ts +36 -0
- package/shadow/shadow-tracker.js +151 -0
- package/shadow/types.d.ts +42 -0
- package/shadow/types.js +20 -0
- package/shared/indicators-extended.d.ts +52 -0
- package/shared/indicators-extended.js +291 -0
- package/shared/indicators.d.ts +15 -0
- package/shared/indicators.js +114 -0
- package/signals/conditions/registry.d.ts +16 -0
- package/signals/conditions/registry.js +1274 -0
- package/signals/conditions/types.d.ts +1 -0
- package/signals/conditions/types.js +4 -0
- package/signals/direction-rules.d.ts +3 -0
- package/signals/direction-rules.js +24 -0
- package/signals/entry-rules.d.ts +6 -0
- package/signals/entry-rules.js +33 -0
- package/signals/serialize-context.d.ts +4 -0
- package/signals/serialize-context.js +39 -0
- package/signals/stop-rules.d.ts +3 -0
- package/signals/stop-rules.js +48 -0
- package/signals/strategy-adapter.d.ts +14 -0
- package/signals/strategy-adapter.js +122 -0
- package/signals/types.d.ts +1 -0
- package/signals/types.js +8 -0
- package/simulator/exchange-simulator.d.ts +93 -0
- package/simulator/exchange-simulator.js +684 -0
- package/simulator/fill-engine.d.ts +53 -0
- package/simulator/fill-engine.js +276 -0
- package/simulator/paper-market-feed.d.ts +26 -0
- package/simulator/paper-market-feed.js +104 -0
- package/simulator/realistic-fills.d.ts +59 -0
- package/simulator/realistic-fills.js +175 -0
- package/simulator/types.d.ts +219 -0
- package/simulator/types.js +43 -0
- package/skills/reefclaw/SKILL.md +97 -0
- package/strategy/builtin-strategies.d.ts +2 -0
- package/strategy/builtin-strategies.js +109 -0
- package/strategy/condition-registry.d.ts +3 -0
- package/strategy/condition-registry.js +153 -0
- package/strategy/evaluator.d.ts +67 -0
- package/strategy/evaluator.js +93 -0
- package/tools/assessment-validation.d.ts +118 -0
- package/tools/assessment-validation.js +415 -0
- package/tools/attach-brackets.d.ts +34 -0
- package/tools/attach-brackets.js +363 -0
- package/tools/audit-bracket-protection.d.ts +49 -0
- package/tools/audit-bracket-protection.js +527 -0
- package/tools/cancel-all-orders.d.ts +7 -0
- package/tools/cancel-all-orders.js +5 -0
- package/tools/cancel-order.d.ts +10 -0
- package/tools/cancel-order.js +14 -0
- package/tools/check-position-health.d.ts +46 -0
- package/tools/check-position-health.js +194 -0
- package/tools/clear-exchange-credentials.d.ts +24 -0
- package/tools/clear-exchange-credentials.js +70 -0
- package/tools/close-position.d.ts +22 -0
- package/tools/close-position.js +449 -0
- package/tools/create-order.d.ts +54 -0
- package/tools/create-order.js +338 -0
- package/tools/exit-gate.d.ts +58 -0
- package/tools/exit-gate.js +162 -0
- package/tools/fetch-balance.d.ts +5 -0
- package/tools/fetch-balance.js +4 -0
- package/tools/fetch-ohlcv.d.ts +11 -0
- package/tools/fetch-ohlcv.js +8 -0
- package/tools/fetch-open-orders.d.ts +7 -0
- package/tools/fetch-open-orders.js +4 -0
- package/tools/fetch-positions.d.ts +7 -0
- package/tools/fetch-positions.js +4 -0
- package/tools/fetch-ticker.d.ts +11 -0
- package/tools/fetch-ticker.js +5 -0
- package/tools/get-agent-profile.d.ts +4 -0
- package/tools/get-agent-profile.js +6 -0
- package/tools/get-analytics.d.ts +6 -0
- package/tools/get-analytics.js +7 -0
- package/tools/get-backtest.d.ts +12 -0
- package/tools/get-backtest.js +91 -0
- package/tools/get-basis.d.ts +7 -0
- package/tools/get-basis.js +7 -0
- package/tools/get-bracket-config.d.ts +11 -0
- package/tools/get-bracket-config.js +24 -0
- package/tools/get-cascade-risk.d.ts +7 -0
- package/tools/get-cascade-risk.js +8 -0
- package/tools/get-crypto-metrics.d.ts +18 -0
- package/tools/get-crypto-metrics.js +45 -0
- package/tools/get-cvd.d.ts +6 -0
- package/tools/get-cvd.js +6 -0
- package/tools/get-divergences.d.ts +6 -0
- package/tools/get-divergences.js +6 -0
- package/tools/get-funding-context.d.ts +6 -0
- package/tools/get-funding-context.js +16 -0
- package/tools/get-liquidation-levels.d.ts +7 -0
- package/tools/get-liquidation-levels.js +7 -0
- package/tools/get-liquidation-pulse.d.ts +9 -0
- package/tools/get-liquidation-pulse.js +22 -0
- package/tools/get-market-breadth.d.ts +6 -0
- package/tools/get-market-breadth.js +8 -0
- package/tools/get-market-intel.d.ts +19 -0
- package/tools/get-market-intel.js +116 -0
- package/tools/get-market-structure.d.ts +47 -0
- package/tools/get-market-structure.js +198 -0
- package/tools/get-my-mined-patterns.d.ts +20 -0
- package/tools/get-my-mined-patterns.js +61 -0
- package/tools/get-my-proposed-learnings.d.ts +20 -0
- package/tools/get-my-proposed-learnings.js +55 -0
- package/tools/get-my-recent-reviews.d.ts +22 -0
- package/tools/get-my-recent-reviews.js +66 -0
- package/tools/get-orderbook.d.ts +21 -0
- package/tools/get-orderbook.js +32 -0
- package/tools/get-pattern-scan.d.ts +7 -0
- package/tools/get-pattern-scan.js +8 -0
- package/tools/get-regime.d.ts +6 -0
- package/tools/get-regime.js +7 -0
- package/tools/get-relevant-learnings.d.ts +21 -0
- package/tools/get-relevant-learnings.js +65 -0
- package/tools/get-resting-liquidity.d.ts +6 -0
- package/tools/get-resting-liquidity.js +11 -0
- package/tools/get-risk-scenario.d.ts +29 -0
- package/tools/get-risk-scenario.js +47 -0
- package/tools/get-risk-summary.d.ts +51 -0
- package/tools/get-risk-summary.js +118 -0
- package/tools/get-sentiment.d.ts +4 -0
- package/tools/get-sentiment.js +6 -0
- package/tools/get-session-review.d.ts +7 -0
- package/tools/get-session-review.js +8 -0
- package/tools/get-setup-detail.d.ts +7 -0
- package/tools/get-setup-detail.js +303 -0
- package/tools/get-signals.d.ts +15 -0
- package/tools/get-signals.js +54 -0
- package/tools/get-sizing.d.ts +6 -0
- package/tools/get-sizing.js +6 -0
- package/tools/get-trade-feedback.d.ts +7 -0
- package/tools/get-trade-feedback.js +8 -0
- package/tools/get-trade-flow.d.ts +7 -0
- package/tools/get-trade-flow.js +7 -0
- package/tools/get-volume-analysis.d.ts +21 -0
- package/tools/get-volume-analysis.js +74 -0
- package/tools/get-volume-profile.d.ts +7 -0
- package/tools/get-volume-profile.js +7 -0
- package/tools/helpers.d.ts +25 -0
- package/tools/helpers.js +38 -0
- package/tools/intel-api.d.ts +14 -0
- package/tools/intel-api.js +52 -0
- package/tools/intel-cache.d.ts +25 -0
- package/tools/intel-cache.js +133 -0
- package/tools/list-strategies.d.ts +7 -0
- package/tools/list-strategies.js +6 -0
- package/tools/modify-stop.d.ts +17 -0
- package/tools/modify-stop.js +81 -0
- package/tools/modify-target.d.ts +17 -0
- package/tools/modify-target.js +71 -0
- package/tools/propose-learning.d.ts +22 -0
- package/tools/propose-learning.js +65 -0
- package/tools/query-review-outcomes.d.ts +30 -0
- package/tools/query-review-outcomes.js +64 -0
- package/tools/query-trades.d.ts +21 -0
- package/tools/query-trades.js +37 -0
- package/tools/record-position-reviews.d.ts +38 -0
- package/tools/record-position-reviews.js +147 -0
- package/tools/save-strategy.d.ts +16 -0
- package/tools/save-strategy.js +46 -0
- package/tools/scan-pairs.d.ts +18 -0
- package/tools/scan-pairs.js +220 -0
- package/tools/score-setup.d.ts +31 -0
- package/tools/score-setup.js +268 -0
- package/tools/set-bracket-requirement.d.ts +18 -0
- package/tools/set-bracket-requirement.js +81 -0
- package/tools/set-exchange-credentials.d.ts +25 -0
- package/tools/set-exchange-credentials.js +80 -0
- package/tools/set-trading-mode.d.ts +26 -0
- package/tools/set-trading-mode.js +135 -0
- package/tools/test-exchange-credentials.d.ts +16 -0
- package/tools/test-exchange-credentials.js +100 -0
- package/tools/toggle-strategy.d.ts +8 -0
- package/tools/toggle-strategy.js +8 -0
- package/trading-params-cache.d.ts +26 -0
- package/trading-params-cache.js +52 -0
- package/types.d.ts +110 -0
- package/types.js +7 -0
- package/util/plugin-paths.d.ts +3 -0
- package/util/plugin-paths.js +15 -0
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import type { BinancePrivateApi } from '../ccxt/binance-private.js';
|
|
3
|
+
import { ListenKeyManager } from './listen-key-manager.js';
|
|
4
|
+
import type { ListenKeyManagerOptions } from './listen-key-manager.js';
|
|
5
|
+
import type { ParsedAccountUpdate, ParsedOrderUpdate } from './live-state-store.js';
|
|
6
|
+
/** Minimal WebSocket shape we depend on — matches both the `ws` library and
|
|
7
|
+
* the browser WebSocket. Tests implement this directly. */
|
|
8
|
+
export interface StreamWebSocket {
|
|
9
|
+
on(event: 'open', cb: () => void): void;
|
|
10
|
+
on(event: 'close', cb: (code?: number, reason?: Buffer | string) => void): void;
|
|
11
|
+
on(event: 'error', cb: (err: Error) => void): void;
|
|
12
|
+
on(event: 'message', cb: (data: Buffer | string) => void): void;
|
|
13
|
+
on(event: 'ping', cb: (data: Buffer) => void): void;
|
|
14
|
+
on(event: 'pong', cb: (data: Buffer) => void): void;
|
|
15
|
+
/** Close the connection gracefully. Safe to call if already closed. */
|
|
16
|
+
close(code?: number, reason?: string): void;
|
|
17
|
+
/** Called to reply to server pings. Most WS clients auto-pong; we expose
|
|
18
|
+
* this for tests + for when the client library doesn't. */
|
|
19
|
+
pong?(data?: Buffer): void;
|
|
20
|
+
/** Force-terminate (no TCP FIN). Fallback for stuck sockets. */
|
|
21
|
+
terminate?(): void;
|
|
22
|
+
}
|
|
23
|
+
export type WebSocketFactory = (url: string) => StreamWebSocket;
|
|
24
|
+
export interface StreamTimerDeps {
|
|
25
|
+
setTimeout: (fn: () => void, ms: number) => ReturnType<typeof setTimeout>;
|
|
26
|
+
clearTimeout: (handle: ReturnType<typeof setTimeout>) => void;
|
|
27
|
+
setInterval: (fn: () => void, ms: number) => ReturnType<typeof setInterval>;
|
|
28
|
+
clearInterval: (handle: ReturnType<typeof setInterval>) => void;
|
|
29
|
+
now: () => number;
|
|
30
|
+
/** Used for jittered backoff. Tests override with a deterministic RNG. */
|
|
31
|
+
random: () => number;
|
|
32
|
+
}
|
|
33
|
+
export interface UserDataStreamOptions {
|
|
34
|
+
/** Mainnet: 'wss://fstream.binance.com/private/ws'. Testnet: 'wss://stream.binancefuture.com/ws'.
|
|
35
|
+
* The listenKey is appended at connect time. Do NOT include trailing slash. */
|
|
36
|
+
wsBaseUrl: string;
|
|
37
|
+
/** Injection — produces a StreamWebSocket given the full URL. */
|
|
38
|
+
webSocketFactory: WebSocketFactory;
|
|
39
|
+
/** ListenKeyManager-compat options passed through. */
|
|
40
|
+
listenKey?: ListenKeyManagerOptions;
|
|
41
|
+
/** Reconnect backoff base. Default 1000 ms. */
|
|
42
|
+
reconnectBaseMs?: number;
|
|
43
|
+
/** Reconnect backoff cap. Default 60000 ms. */
|
|
44
|
+
reconnectCapMs?: number;
|
|
45
|
+
/** Fractional jitter applied to each reconnect delay. Default 0.2 (±20%). */
|
|
46
|
+
reconnectJitterPct?: number;
|
|
47
|
+
/** Dead-socket watchdog. Compares the configured threshold against the
|
|
48
|
+
* most recent INCOMING FRAME of any kind — `message`, `ping`, or `pong`
|
|
49
|
+
* (tracked as `lastFrameAt`), NOT just data-bearing message frames. Binance
|
|
50
|
+
* documents server pings every 3 min on the user-data stream
|
|
51
|
+
* (developers.binance.com → futures websocket-market-streams); counting
|
|
52
|
+
* them as liveness signals means a calm account (no fills, stable balance)
|
|
53
|
+
* doesn't trip the watchdog.
|
|
54
|
+
*
|
|
55
|
+
* Default 6 min — comfortably above the 180 s ping interval, comfortably
|
|
56
|
+
* below Binance's own 10-min no-pong cutoff. The watchdog is the
|
|
57
|
+
* "TCP-is-actually-dead" safety net; the active REST probe (60 s tick,
|
|
58
|
+
* see UserDataActiveProbe) is the canonical "events stopped arriving"
|
|
59
|
+
* detector for missed fills on open positions. */
|
|
60
|
+
staleEventWatchdogMs?: number;
|
|
61
|
+
/** Alert thresholds on consecutive reconnect attempts. */
|
|
62
|
+
warnThreshold?: number;
|
|
63
|
+
errorThreshold?: number;
|
|
64
|
+
fatalThreshold?: number;
|
|
65
|
+
/** Injection — timers + RNG. Defaults to real. */
|
|
66
|
+
timers?: Partial<StreamTimerDeps>;
|
|
67
|
+
/** Injection — testability. Tests supply a fake ListenKeyManager. */
|
|
68
|
+
listenKeyManagerFactory?: (api: BinancePrivateApi, opts: ListenKeyManagerOptions | undefined) => ListenKeyManager;
|
|
69
|
+
/** Translate Binance raw market IDs (`BTCUSDT`) back to unified CCXT
|
|
70
|
+
* symbols (`BTC/USDT`) before emitting. Defaults to `api.symbolFromMarketId`
|
|
71
|
+
* which uses CCXT's market cache. Identity function for unit tests that
|
|
72
|
+
* don't care about symbol shape. */
|
|
73
|
+
symbolTranslator?: (marketId: string) => string;
|
|
74
|
+
}
|
|
75
|
+
export type StreamStatus = 'stopped' | 'connecting' | 'open' | 'reconnecting';
|
|
76
|
+
export interface StreamHealth {
|
|
77
|
+
status: StreamStatus;
|
|
78
|
+
currentListenKey: string | null;
|
|
79
|
+
/** Last `message` frame timestamp (data event from Binance). Drives the
|
|
80
|
+
* active REST probe's freshness check. Null until first frame after
|
|
81
|
+
* (re)connect. */
|
|
82
|
+
lastEventAt: number | null;
|
|
83
|
+
/** Last frame of ANY kind — message, ping, or pong. Drives the dead-socket
|
|
84
|
+
* watchdog. Distinct from `lastEventAt` because Binance pings every 3 min
|
|
85
|
+
* on the user-data stream regardless of account activity, and those pings
|
|
86
|
+
* are the only liveness signal an idle account ever gets. */
|
|
87
|
+
lastFrameAt: number | null;
|
|
88
|
+
lastConnectedAt: number | null;
|
|
89
|
+
consecutiveReconnectAttempts: number;
|
|
90
|
+
totalReconnects: number;
|
|
91
|
+
}
|
|
92
|
+
export type UserDataStreamEvents = {
|
|
93
|
+
/** WS opened successfully. Parent should run a REST snapshot and seed the store. */
|
|
94
|
+
connected: () => void;
|
|
95
|
+
/** WS closed. `willReconnect` is false only for a manual stop(). */
|
|
96
|
+
disconnected: (reason: string, willReconnect: boolean) => void;
|
|
97
|
+
/** Emitted every time we're about to attempt a reconnect. Useful for metrics. */
|
|
98
|
+
reconnecting: (attempt: number, delayMs: number) => void;
|
|
99
|
+
/** ACCOUNT_UPDATE event — positions + balance deltas. */
|
|
100
|
+
accountUpdate: (ev: ParsedAccountUpdate) => void;
|
|
101
|
+
/** ORDER_TRADE_UPDATE event — single order state transition. */
|
|
102
|
+
orderUpdate: (ev: ParsedOrderUpdate) => void;
|
|
103
|
+
/** ALGO_UPDATE event — single algo/conditional order state transition
|
|
104
|
+
* (STOP_MARKET / TAKE_PROFIT_MARKET / TRAILING_STOP_MARKET). Binance does
|
|
105
|
+
* NOT route these through ORDER_TRADE_UPDATE — they have their own event
|
|
106
|
+
* type that we previously swallowed at the `default` branch. Downstream
|
|
107
|
+
* listeners use this to detect bracket-leg cancellation by the exchange. */
|
|
108
|
+
algoUpdate: (ev: ParsedAlgoUpdate) => void;
|
|
109
|
+
/** MARGIN_CALL event — pre-liquidation warning. Advisory. */
|
|
110
|
+
marginCall: (ev: ParsedMarginCall) => void;
|
|
111
|
+
/** ACCOUNT_CONFIG_UPDATE event — leverage/margin-mode changes. Operator-visible. */
|
|
112
|
+
accountConfigUpdate: (ev: ParsedAccountConfigUpdate) => void;
|
|
113
|
+
/** Server-sent listenKey expiry notice. We re-mint + reconnect automatically. */
|
|
114
|
+
listenKeyExpired: () => void;
|
|
115
|
+
/** Forced reconnect due to staleness watchdog (no events for too long). */
|
|
116
|
+
staleForcedReconnect: (idleMs: number) => void;
|
|
117
|
+
/** Parent should run a REST snapshot + re-seed the store. Emitted on every
|
|
118
|
+
* successful (re)connect AFTER 'connected' — gives a distinct hook for
|
|
119
|
+
* resync logic that doesn't also fire on first connect (which uses the
|
|
120
|
+
* 'connected' hook). */
|
|
121
|
+
resyncRequired: (cause: 'reconnect' | 'listen_key_rotation') => void;
|
|
122
|
+
};
|
|
123
|
+
export interface ParsedMarginCall {
|
|
124
|
+
eventTime: number;
|
|
125
|
+
crossWallet: number;
|
|
126
|
+
positions: Array<{
|
|
127
|
+
symbol: string;
|
|
128
|
+
positionSide: 'LONG' | 'SHORT' | 'BOTH';
|
|
129
|
+
positionAmt: number;
|
|
130
|
+
marginType: 'cross' | 'isolated';
|
|
131
|
+
isolatedWallet: number;
|
|
132
|
+
markPrice: number;
|
|
133
|
+
unrealizedPnl: number;
|
|
134
|
+
maintMargin: number;
|
|
135
|
+
}>;
|
|
136
|
+
}
|
|
137
|
+
export interface ParsedAccountConfigUpdate {
|
|
138
|
+
eventTime: number;
|
|
139
|
+
/** Which section changed. Binance sends either `ac` (leverage) or `ai`
|
|
140
|
+
* (account-level multi-asset mode). We surface both under one type. */
|
|
141
|
+
kind: 'leverage' | 'multi_asset_mode' | 'other';
|
|
142
|
+
symbol?: string;
|
|
143
|
+
leverage?: number;
|
|
144
|
+
multiAssetMode?: boolean;
|
|
145
|
+
}
|
|
146
|
+
/** Parsed ALGO_UPDATE event. Mirrors Binance Futures' conditional-order
|
|
147
|
+
* user-data frame for STOP_MARKET / TAKE_PROFIT_MARKET / TRAILING_STOP_MARKET.
|
|
148
|
+
* Field shape VERIFIED 2026-05-15 against the authoritative doc
|
|
149
|
+
* (developers.binance.com → USD-M Futures → User Data Streams → Event Algo
|
|
150
|
+
* Order Update) + a raw prod capture. Binance wraps the algo-order detail
|
|
151
|
+
* under the **`o`** key (NOT `ao`/`a` — the original guess was wrong and
|
|
152
|
+
* parsed nothing). Status `X` semantics that matter downstream:
|
|
153
|
+
* CANCELED = manual cancel (our explicit cancelOrder); EXPIRED = system
|
|
154
|
+
* cancel (e.g. position closed → Binance auto-cancels the sibling).
|
|
155
|
+
*
|
|
156
|
+
* The 2026-05-15 ATOM/SOL/LINK bracket-spiral incident traced to this event
|
|
157
|
+
* being silently swallowed at the `default` case in `handleFrame`. Listeners
|
|
158
|
+
* should still treat `status` defensively (Binance has added new states
|
|
159
|
+
* without notice — e.g. 2024's `EXPIRED_IN_MATCH`). The original raw payload is
|
|
160
|
+
* preserved under `raw` so post-hoc analysis can recover missing fields. */
|
|
161
|
+
export interface ParsedAlgoUpdate {
|
|
162
|
+
eventTime: number;
|
|
163
|
+
transactionTime: number;
|
|
164
|
+
symbol: string;
|
|
165
|
+
algoId: string;
|
|
166
|
+
clientAlgoId: string | null;
|
|
167
|
+
side: 'buy' | 'sell';
|
|
168
|
+
/** Binance's documented enum: STOP_MARKET, TAKE_PROFIT_MARKET,
|
|
169
|
+
* TRAILING_STOP_MARKET. Forwarded verbatim, uppercased. */
|
|
170
|
+
orderType: string;
|
|
171
|
+
/** Binance's documented enum: NEW, WORKING, TRIGGERED, FINISHED,
|
|
172
|
+
* CANCELED, EXPIRED, REJECTED. Forwarded verbatim, uppercased. */
|
|
173
|
+
status: string;
|
|
174
|
+
triggerPrice: number | null;
|
|
175
|
+
quantity: number;
|
|
176
|
+
reduceOnly: boolean;
|
|
177
|
+
/** Binance's optional `r` field — string reason on terminal states like
|
|
178
|
+
* `CANCELED_BY_EXCHANGE`, `MARGIN_CHECK_FAILED`, etc. Undefined when
|
|
179
|
+
* Binance doesn't supply one. Useful for diagnosing auto-cancel. */
|
|
180
|
+
reason?: string;
|
|
181
|
+
/** Full raw event for first-N debug logging and for fields we don't model
|
|
182
|
+
* yet. Don't read this in production code — add a typed accessor instead. */
|
|
183
|
+
raw: Record<string, unknown>;
|
|
184
|
+
}
|
|
185
|
+
export declare class UserDataStream extends EventEmitter {
|
|
186
|
+
private readonly api;
|
|
187
|
+
private readonly opts;
|
|
188
|
+
private readonly webSocketFactory;
|
|
189
|
+
private readonly timers;
|
|
190
|
+
private readonly listenKeyManager;
|
|
191
|
+
private readonly translateSymbol;
|
|
192
|
+
private ws;
|
|
193
|
+
private status;
|
|
194
|
+
private reconnectTimer;
|
|
195
|
+
private watchdogInterval;
|
|
196
|
+
private lastEventAt;
|
|
197
|
+
private lastFrameAt;
|
|
198
|
+
private lastConnectedAt;
|
|
199
|
+
private consecutiveReconnects;
|
|
200
|
+
private totalReconnects;
|
|
201
|
+
private stopRequested;
|
|
202
|
+
private firstConnect;
|
|
203
|
+
/** First-N raw ALGO_UPDATE payloads logged at INFO so operators can verify
|
|
204
|
+
* the parser against real Binance traffic without scraping the WS at
|
|
205
|
+
* TRACE. Capped to avoid log volume; resets per process restart. */
|
|
206
|
+
private algoUpdateRawLogged;
|
|
207
|
+
private static readonly ALGO_UPDATE_RAW_LOG_CAP;
|
|
208
|
+
constructor(api: BinancePrivateApi, options: UserDataStreamOptions);
|
|
209
|
+
/** Start the stream. Idempotent — returns immediately if already running. */
|
|
210
|
+
start(): Promise<void>;
|
|
211
|
+
/** Graceful stop. Closes WS + stops listenKey. Idempotent. */
|
|
212
|
+
stop(): Promise<void>;
|
|
213
|
+
/** Current health snapshot for observability. */
|
|
214
|
+
getHealth(): StreamHealth;
|
|
215
|
+
/** Whether the stream is currently open. Convenience for tests + callers. */
|
|
216
|
+
isConnected(): boolean;
|
|
217
|
+
private openConnection;
|
|
218
|
+
private attachWsHandlers;
|
|
219
|
+
private handleFrame;
|
|
220
|
+
private scheduleReconnect;
|
|
221
|
+
private computeBackoffMs;
|
|
222
|
+
private clearReconnectTimer;
|
|
223
|
+
/** Force a reconnect now — used when the server tells us the key expired
|
|
224
|
+
* or when the listenKey keep-alive loop gives up.
|
|
225
|
+
*
|
|
226
|
+
* Invariant: the close handler is responsible for clearing `this.ws`,
|
|
227
|
+
* stopping the listenKey loop, and scheduling the reconnect. We only
|
|
228
|
+
* trigger close() here and let the handler run. If there's no socket to
|
|
229
|
+
* close (manager dropped out-of-band), we schedule directly. */
|
|
230
|
+
private forceReconnect;
|
|
231
|
+
private startWatchdog;
|
|
232
|
+
/** External trigger for a reconnect — used by the active REST probe when
|
|
233
|
+
* it detects a fill that the WS missed. Same plumbing as the watchdog
|
|
234
|
+
* path; the close handler runs the reconnect schedule. */
|
|
235
|
+
requestReconnect(reason: string): void;
|
|
236
|
+
private stopWatchdog;
|
|
237
|
+
private setStatus;
|
|
238
|
+
}
|
|
239
|
+
export declare function parseAccountUpdate(obj: Record<string, unknown>, translateSymbol?: (id: string) => string): ParsedAccountUpdate | null;
|
|
240
|
+
export declare function parseOrderUpdate(obj: Record<string, unknown>, translateSymbol?: (id: string) => string): ParsedOrderUpdate | null;
|
|
241
|
+
export declare function parseMarginCall(obj: Record<string, unknown>, translateSymbol?: (id: string) => string): ParsedMarginCall | null;
|
|
242
|
+
export declare function parseAlgoUpdate(obj: Record<string, unknown>, translateSymbol?: (id: string) => string): ParsedAlgoUpdate | null;
|
|
243
|
+
export declare function parseAccountConfigUpdate(obj: Record<string, unknown>, translateSymbol?: (id: string) => string): ParsedAccountConfigUpdate | null;
|