@imbingox/acex 0.1.0 → 0.2.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.
Files changed (85) hide show
  1. package/README.md +92 -285
  2. package/index.ts +1 -0
  3. package/package.json +40 -23
  4. package/src/adapters/binance/adapter.ts +80 -0
  5. package/src/adapters/binance/book-ticker.ts +123 -0
  6. package/src/adapters/binance/mark-price.ts +126 -0
  7. package/src/adapters/binance/market-catalog.ts +258 -0
  8. package/src/adapters/binance/private-adapter.ts +833 -0
  9. package/src/adapters/types.ts +219 -0
  10. package/src/client/context.ts +123 -0
  11. package/src/client/create-client.ts +6 -0
  12. package/src/client/private-subscription-coordinator.ts +512 -0
  13. package/src/client/runtime.ts +410 -0
  14. package/src/errors.ts +27 -0
  15. package/src/index.ts +5 -0
  16. package/src/internal/async-event-bus.ts +100 -0
  17. package/src/internal/filters.ts +117 -0
  18. package/src/internal/managed-websocket.ts +280 -0
  19. package/src/managers/account-manager.ts +609 -0
  20. package/src/managers/market-manager.ts +889 -0
  21. package/src/managers/order-manager.ts +685 -0
  22. package/src/types/account.ts +157 -0
  23. package/src/types/client.ts +79 -0
  24. package/src/types/index.ts +5 -0
  25. package/src/types/market.ts +150 -0
  26. package/src/types/order.ts +177 -0
  27. package/src/types/shared.ts +93 -0
  28. package/dist/adapters/binance/composite-adapter.d.ts +0 -116
  29. package/dist/adapters/binance/composite-adapter.js +0 -121
  30. package/dist/adapters/binance/market-types.d.ts +0 -63
  31. package/dist/adapters/binance/market-types.js +0 -1
  32. package/dist/adapters/binance/native-market-adapter.d.ts +0 -102
  33. package/dist/adapters/binance/native-market-adapter.js +0 -455
  34. package/dist/adapters/binance/normalizers.d.ts +0 -8
  35. package/dist/adapters/binance/normalizers.js +0 -123
  36. package/dist/adapters/binance/rest-client.d.ts +0 -17
  37. package/dist/adapters/binance/rest-client.js +0 -66
  38. package/dist/adapters/binance/symbol-router.d.ts +0 -9
  39. package/dist/adapters/binance/symbol-router.js +0 -174
  40. package/dist/adapters/binance/ws-client.d.ts +0 -24
  41. package/dist/adapters/binance/ws-client.js +0 -261
  42. package/dist/adapters/ccxt/aster-ccxt-adapter.d.ts +0 -157
  43. package/dist/adapters/ccxt/aster-ccxt-adapter.js +0 -272
  44. package/dist/adapters/ccxt/binance-usdm-ccxt-adapter.d.ts +0 -180
  45. package/dist/adapters/ccxt/binance-usdm-ccxt-adapter.js +0 -539
  46. package/dist/adapters/ccxt/binance-usdm-exchange.d.ts +0 -22
  47. package/dist/adapters/ccxt/binance-usdm-exchange.js +0 -23
  48. package/dist/adapters/fake/fake-aster-adapter.d.ts +0 -130
  49. package/dist/adapters/fake/fake-aster-adapter.js +0 -283
  50. package/dist/adapters/types.d.ts +0 -210
  51. package/dist/adapters/types.js +0 -1
  52. package/dist/core/client.d.ts +0 -50
  53. package/dist/core/client.js +0 -403
  54. package/dist/core/recovery.d.ts +0 -22
  55. package/dist/core/recovery.js +0 -18
  56. package/dist/core/runtime.d.ts +0 -26
  57. package/dist/core/runtime.js +0 -150
  58. package/dist/errors/acex-error.d.ts +0 -25
  59. package/dist/errors/acex-error.js +0 -54
  60. package/dist/index.d.ts +0 -6
  61. package/dist/index.js +0 -3
  62. package/dist/managers/account-manager.d.ts +0 -41
  63. package/dist/managers/account-manager.js +0 -80
  64. package/dist/managers/market-manager.d.ts +0 -16
  65. package/dist/managers/market-manager.js +0 -28
  66. package/dist/managers/order-manager.d.ts +0 -87
  67. package/dist/managers/order-manager.js +0 -122
  68. package/dist/runtime/async-queue.d.ts +0 -8
  69. package/dist/runtime/async-queue.js +0 -88
  70. package/dist/runtime/request-id.d.ts +0 -1
  71. package/dist/runtime/request-id.js +0 -5
  72. package/dist/runtime/ws-connection-supervisor.d.ts +0 -76
  73. package/dist/runtime/ws-connection-supervisor.js +0 -522
  74. package/dist/store/account-store.d.ts +0 -52
  75. package/dist/store/account-store.js +0 -18
  76. package/dist/store/health-store.d.ts +0 -16
  77. package/dist/store/health-store.js +0 -29
  78. package/dist/store/market-store.d.ts +0 -42
  79. package/dist/store/market-store.js +0 -51
  80. package/dist/store/order-store.d.ts +0 -38
  81. package/dist/store/order-store.js +0 -49
  82. package/dist/testing/create-fake-runtime.d.ts +0 -5
  83. package/dist/testing/create-fake-runtime.js +0 -7
  84. package/dist/types/public.d.ts +0 -5
  85. package/dist/types/public.js +0 -1
@@ -0,0 +1,219 @@
1
+ import type {
2
+ AccountCredentials,
3
+ CreateOrderType,
4
+ Exchange,
5
+ MarketDefinition,
6
+ OrderSide,
7
+ OrderStatus,
8
+ PositionSide,
9
+ } from "../types/index.ts";
10
+
11
+ export interface StreamHandle {
12
+ readonly ready: Promise<void>;
13
+ close(): void;
14
+ }
15
+
16
+ export interface RawL1BookUpdate {
17
+ bidPrice: string;
18
+ bidSize: string;
19
+ askPrice: string;
20
+ askSize: string;
21
+ exchangeTs?: number;
22
+ receivedAt: number;
23
+ }
24
+
25
+ export interface RawFundingRateUpdate {
26
+ fundingRate: string;
27
+ nextFundingTime?: number;
28
+ markPrice?: string;
29
+ indexPrice?: string;
30
+ exchangeTs?: number;
31
+ receivedAt: number;
32
+ }
33
+
34
+ export interface L1BookStreamCallbacks {
35
+ onUpdate(update: RawL1BookUpdate): void;
36
+ onFreshnessChange(
37
+ freshness: "fresh" | "stale",
38
+ reason?: "heartbeat_timeout",
39
+ ): void;
40
+ onDisconnected(): void;
41
+ onError(error: Error): void;
42
+ }
43
+
44
+ export interface L1BookStreamOptions {
45
+ initialMessageTimeoutMs: number;
46
+ staleAfterMs: number;
47
+ reconnectDelayMs: number;
48
+ reconnectMaxDelayMs: number;
49
+ now?: () => number;
50
+ }
51
+
52
+ export interface FundingRateStreamCallbacks {
53
+ onUpdate(update: RawFundingRateUpdate): void;
54
+ onFreshnessChange(
55
+ freshness: "fresh" | "stale",
56
+ reason?: "heartbeat_timeout",
57
+ ): void;
58
+ onDisconnected(): void;
59
+ onError(error: Error): void;
60
+ }
61
+
62
+ export interface FundingRateStreamOptions {
63
+ initialMessageTimeoutMs: number;
64
+ staleAfterMs: number;
65
+ reconnectDelayMs: number;
66
+ reconnectMaxDelayMs: number;
67
+ now?: () => number;
68
+ }
69
+
70
+ export interface MarketAdapter {
71
+ readonly exchange: Exchange;
72
+ loadMarkets(): Promise<MarketDefinition[]>;
73
+ createL1BookStream(
74
+ market: MarketDefinition,
75
+ callbacks: L1BookStreamCallbacks,
76
+ options: L1BookStreamOptions,
77
+ ): StreamHandle;
78
+ createFundingRateStream(
79
+ market: MarketDefinition,
80
+ callbacks: FundingRateStreamCallbacks,
81
+ options: FundingRateStreamOptions,
82
+ ): StreamHandle;
83
+ }
84
+
85
+ export interface RawBalanceUpdate {
86
+ asset: string;
87
+ free?: string;
88
+ used?: string;
89
+ total?: string;
90
+ exchangeTs?: number;
91
+ receivedAt: number;
92
+ }
93
+
94
+ export interface RawPositionUpdate {
95
+ symbol: string;
96
+ side: PositionSide;
97
+ size: string;
98
+ entryPrice?: string;
99
+ markPrice?: string;
100
+ unrealizedPnl?: string;
101
+ leverage?: string;
102
+ liquidationPrice?: string;
103
+ exchangeTs?: number;
104
+ receivedAt: number;
105
+ }
106
+
107
+ export interface RawRiskUpdate {
108
+ equity?: string;
109
+ marginRatio?: string;
110
+ initialMargin?: string;
111
+ maintenanceMargin?: string;
112
+ exchangeTs?: number;
113
+ receivedAt: number;
114
+ }
115
+
116
+ export interface RawAccountBootstrap {
117
+ balances: RawBalanceUpdate[];
118
+ positions: RawPositionUpdate[];
119
+ risk?: RawRiskUpdate;
120
+ exchangeTs?: number;
121
+ receivedAt: number;
122
+ }
123
+
124
+ export interface RawAccountUpdate {
125
+ balances?: RawBalanceUpdate[];
126
+ positions?: RawPositionUpdate[];
127
+ risk?: RawRiskUpdate;
128
+ exchangeTs?: number;
129
+ receivedAt: number;
130
+ }
131
+
132
+ export interface RawOrderUpdate {
133
+ orderId?: string;
134
+ clientOrderId?: string;
135
+ symbol: string;
136
+ side: OrderSide;
137
+ type: string;
138
+ status: OrderStatus;
139
+ price?: string;
140
+ triggerPrice?: string;
141
+ amount: string;
142
+ filled: string;
143
+ remaining?: string;
144
+ reduceOnly?: boolean;
145
+ positionSide?: PositionSide;
146
+ avgFillPrice?: string;
147
+ exchangeTs?: number;
148
+ receivedAt: number;
149
+ }
150
+
151
+ export interface CreateOrderRequest {
152
+ symbol: string;
153
+ side: OrderSide;
154
+ type: CreateOrderType;
155
+ amount: string;
156
+ price?: string;
157
+ clientOrderId?: string;
158
+ reduceOnly?: boolean;
159
+ positionSide?: PositionSide;
160
+ }
161
+
162
+ export interface CancelOrderRequest {
163
+ symbol: string;
164
+ orderId?: string;
165
+ clientOrderId?: string;
166
+ }
167
+
168
+ export interface CancelAllOrdersRequest {
169
+ symbol: string;
170
+ }
171
+
172
+ export interface PrivateStreamCallbacks {
173
+ onAccountUpdate(update: RawAccountUpdate): void;
174
+ onOrderUpdate(update: RawOrderUpdate): void;
175
+ onDisconnected(): void;
176
+ onReconnected(): void;
177
+ onError(error: Error): void;
178
+ }
179
+
180
+ export interface PrivateStreamOptions {
181
+ openTimeoutMs: number;
182
+ reconnectDelayMs: number;
183
+ reconnectMaxDelayMs: number;
184
+ listenKeyKeepAliveMs: number;
185
+ now?: () => number;
186
+ }
187
+
188
+ export interface PrivateUserDataAdapter {
189
+ readonly exchange: Exchange;
190
+ bootstrapAccount(
191
+ credentials: AccountCredentials,
192
+ accountOptions?: Record<string, unknown>,
193
+ ): Promise<RawAccountBootstrap>;
194
+ bootstrapOpenOrders(
195
+ credentials: AccountCredentials,
196
+ accountOptions?: Record<string, unknown>,
197
+ ): Promise<RawOrderUpdate[]>;
198
+ createOrder(
199
+ credentials: AccountCredentials,
200
+ request: CreateOrderRequest,
201
+ accountOptions?: Record<string, unknown>,
202
+ ): Promise<RawOrderUpdate>;
203
+ cancelOrder(
204
+ credentials: AccountCredentials,
205
+ request: CancelOrderRequest,
206
+ accountOptions?: Record<string, unknown>,
207
+ ): Promise<RawOrderUpdate>;
208
+ cancelAllOrders(
209
+ credentials: AccountCredentials,
210
+ request: CancelAllOrdersRequest,
211
+ accountOptions?: Record<string, unknown>,
212
+ ): Promise<RawOrderUpdate[]>;
213
+ createPrivateStream(
214
+ credentials: AccountCredentials,
215
+ callbacks: PrivateStreamCallbacks,
216
+ options: PrivateStreamOptions,
217
+ accountOptions?: Record<string, unknown>,
218
+ ): StreamHandle;
219
+ }
@@ -0,0 +1,123 @@
1
+ import type {
2
+ RawAccountBootstrap,
3
+ RawAccountUpdate,
4
+ RawOrderUpdate,
5
+ } from "../adapters/types.ts";
6
+ import type {
7
+ AccountCredentials,
8
+ AcexInternalError,
9
+ CancelAllOrdersInput,
10
+ CancelOrderInput,
11
+ CreateOrderInput,
12
+ Exchange,
13
+ HealthEvent,
14
+ PrivateRuntimeReason,
15
+ PrivateRuntimeStatus,
16
+ } from "../types/index.ts";
17
+
18
+ export interface RegisteredAccountRecord {
19
+ accountId: string;
20
+ exchange: Exchange;
21
+ credentials?: AccountCredentials;
22
+ options?: Record<string, unknown>;
23
+ }
24
+
25
+ export interface ClientContext {
26
+ now(): number;
27
+ assertStarted(): void;
28
+ getRegisteredAccount(accountId: string): RegisteredAccountRecord;
29
+ ensurePrivateCredentials(accountId: string): void;
30
+ subscribePrivateAccountFeed(accountId: string): Promise<void>;
31
+ unsubscribePrivateAccountFeed(accountId: string): void;
32
+ subscribePrivateOrderFeed(accountId: string): Promise<void>;
33
+ unsubscribePrivateOrderFeed(accountId: string): void;
34
+ createOrder(input: CreateOrderInput): Promise<RawOrderUpdate>;
35
+ cancelOrder(input: CancelOrderInput): Promise<RawOrderUpdate>;
36
+ cancelAllOrders(input: CancelAllOrdersInput): Promise<RawOrderUpdate[]>;
37
+ publishRuntimeError(
38
+ source: AcexInternalError["source"],
39
+ error: Error,
40
+ metadata?: Omit<AcexInternalError, "error" | "source" | "ts">,
41
+ ): void;
42
+ publishHealthEvent(event: HealthEvent): void;
43
+ }
44
+
45
+ export interface ManagerLifecycle {
46
+ onClientStarted(): void;
47
+ onClientStopping(now: number): void;
48
+ }
49
+
50
+ export interface AccountAwareManager {
51
+ onAccountRemoved(accountId: string, now: number): void;
52
+ onCredentialsUpdated(accountId: string, exchange: Exchange): void;
53
+ }
54
+
55
+ export interface HealthReporter<T> {
56
+ getStatuses(): T[];
57
+ }
58
+
59
+ export interface PrivateSubscriptionState {
60
+ runtimeStatus: PrivateRuntimeStatus;
61
+ ready: boolean;
62
+ reason?: PrivateRuntimeReason;
63
+ lastReceivedAt?: number;
64
+ lastReadyAt?: number;
65
+ }
66
+
67
+ export interface PrivateAccountDataConsumer {
68
+ onPrivateAccountPending(accountId: string, exchange: Exchange): void;
69
+ onPrivateAccountBootstrap(
70
+ accountId: string,
71
+ exchange: Exchange,
72
+ bootstrap: RawAccountBootstrap,
73
+ ): void;
74
+ onPrivateAccountUpdate(
75
+ accountId: string,
76
+ exchange: Exchange,
77
+ update: RawAccountUpdate,
78
+ ): void;
79
+ onPrivateAccountStreamState(
80
+ accountId: string,
81
+ exchange: Exchange,
82
+ state: PrivateSubscriptionState,
83
+ ): void;
84
+ }
85
+
86
+ export interface PrivateOrderDataConsumer {
87
+ onPrivateOrderPending(accountId: string, exchange: Exchange): void;
88
+ onPrivateOrderBootstrap(
89
+ accountId: string,
90
+ exchange: Exchange,
91
+ snapshots: RawOrderUpdate[],
92
+ ): void;
93
+ onPrivateOrderUpdate(
94
+ accountId: string,
95
+ exchange: Exchange,
96
+ update: RawOrderUpdate,
97
+ ): void;
98
+ onPrivateOrderStreamState(
99
+ accountId: string,
100
+ exchange: Exchange,
101
+ state: PrivateSubscriptionState,
102
+ ): void;
103
+ }
104
+
105
+ export function hasPrivateCredentials(
106
+ credentials?: AccountCredentials,
107
+ ): boolean {
108
+ return Boolean(credentials?.apiKey && credentials.secret);
109
+ }
110
+
111
+ export function mergeCredentials(
112
+ current: AccountCredentials | undefined,
113
+ next: AccountCredentials,
114
+ ): AccountCredentials {
115
+ return {
116
+ ...current,
117
+ ...next,
118
+ extra: {
119
+ ...(current?.extra ?? {}),
120
+ ...(next.extra ?? {}),
121
+ },
122
+ };
123
+ }
@@ -0,0 +1,6 @@
1
+ import type { AcexClient, CreateClientOptions } from "../types/index.ts";
2
+ import { AcexClientImpl } from "./runtime.ts";
3
+
4
+ export function createClient(options?: CreateClientOptions): AcexClient {
5
+ return new AcexClientImpl(options);
6
+ }