@imbingox/acex 0.4.0-beta.1 → 0.4.0-beta.10
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/README.md +4 -3
- package/docs/api.md +474 -1002
- package/package.json +1 -1
- package/src/adapters/binance/adapter.ts +19 -1
- package/src/adapters/binance/market-catalog.ts +83 -12
- package/src/adapters/binance/private-adapter.ts +302 -59
- package/src/adapters/binance/rate-limit.ts +47 -0
- package/src/adapters/binance/server-time.ts +106 -0
- package/src/adapters/juplend/private-adapter.ts +97 -68
- package/src/adapters/types.ts +25 -1
- package/src/client/context.ts +26 -9
- package/src/client/private-subscription-coordinator.ts +898 -63
- package/src/client/runtime.ts +49 -11
- package/src/client/venue-capabilities.ts +1 -0
- package/src/errors.ts +156 -2
- package/src/index.ts +8 -1
- package/src/internal/http-client.ts +608 -0
- package/src/internal/rate-limiter.ts +181 -0
- package/src/internal/watermark.ts +83 -0
- package/src/managers/account-manager.ts +227 -23
- package/src/managers/market-manager.ts +224 -34
- package/src/managers/order-manager.ts +791 -76
- package/src/types/client.ts +1 -0
- package/src/types/market.ts +25 -0
- package/src/types/order.ts +1 -0
- package/src/types/shared.ts +66 -0
package/src/types/client.ts
CHANGED
|
@@ -83,6 +83,7 @@ export type OrderTimeInForceCapability = "gtc" | "post_only";
|
|
|
83
83
|
|
|
84
84
|
export interface VenueMarketCapabilities {
|
|
85
85
|
catalog: VenueCapabilitySupport;
|
|
86
|
+
serverTime: VenueCapabilitySupport;
|
|
86
87
|
l1Book: VenueCapabilitySupport;
|
|
87
88
|
fundingRate: FundingRateCapability;
|
|
88
89
|
marketTypes: MarketType[];
|
package/src/types/market.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type BigNumber from "bignumber.js";
|
|
2
|
+
import type { AcexError } from "../errors.ts";
|
|
2
3
|
import type { MarketFreshness, SubscriptionActivity, Venue } from "./shared.ts";
|
|
3
4
|
|
|
4
5
|
export type MarketType = "spot" | "swap" | "future";
|
|
@@ -26,6 +27,28 @@ export interface MarketDefinition {
|
|
|
26
27
|
raw: Record<string, unknown>;
|
|
27
28
|
}
|
|
28
29
|
|
|
30
|
+
export interface MarketCatalogReloadSummary {
|
|
31
|
+
venue: Venue;
|
|
32
|
+
added: string[];
|
|
33
|
+
removed: string[];
|
|
34
|
+
total: number;
|
|
35
|
+
ok: boolean;
|
|
36
|
+
error?: AcexError;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface VenueServerTime {
|
|
40
|
+
/** Exchange server time in epoch milliseconds. Binance currently measures the USDM cluster. */
|
|
41
|
+
serverTime: number;
|
|
42
|
+
/** Local wall-clock timestamp captured immediately before the HTTP request is sent. */
|
|
43
|
+
requestSentAt: number;
|
|
44
|
+
/** Local wall-clock timestamp captured immediately after the HTTP response is received. */
|
|
45
|
+
responseReceivedAt: number;
|
|
46
|
+
/** Round trip duration measured with a monotonic clock, in milliseconds. */
|
|
47
|
+
roundTripMs: number;
|
|
48
|
+
/** NTP-style offset estimate: serverTime - midpoint(requestSentAt, responseReceivedAt). */
|
|
49
|
+
estimatedOffsetMs: number;
|
|
50
|
+
}
|
|
51
|
+
|
|
29
52
|
export interface MarketDataStatus {
|
|
30
53
|
venue: Venue;
|
|
31
54
|
symbol: string;
|
|
@@ -159,6 +182,8 @@ export interface MarketManager {
|
|
|
159
182
|
readonly events: MarketEventStreams;
|
|
160
183
|
|
|
161
184
|
loadMarkets(): Promise<void>;
|
|
185
|
+
reloadMarkets(venue?: Venue): Promise<MarketCatalogReloadSummary[]>;
|
|
186
|
+
fetchServerTime(venue: Venue): Promise<VenueServerTime>;
|
|
162
187
|
subscribeL1Book(input: SubscribeL1BookInput): Promise<void>;
|
|
163
188
|
unsubscribeL1Book(input: SubscribeL1BookInput): Promise<void>;
|
|
164
189
|
subscribeFundingRate(input: SubscribeFundingRateInput): Promise<void>;
|
package/src/types/order.ts
CHANGED
package/src/types/shared.ts
CHANGED
|
@@ -24,6 +24,63 @@ export interface Logger {
|
|
|
24
24
|
error(msg: string, context?: Record<string, unknown>): void;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
+
export interface TimeProvider {
|
|
28
|
+
/** Millisecond timestamp used for outbound request/signing timestamps. */
|
|
29
|
+
now(): number;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface RateLimitScope {
|
|
33
|
+
venue: Venue;
|
|
34
|
+
accountId?: string;
|
|
35
|
+
endpointKey: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface RateLimitUsage {
|
|
39
|
+
/** Exchange request-weight usage by interval key, e.g. "1m". */
|
|
40
|
+
weight?: Record<string, number>;
|
|
41
|
+
/** Exchange order-count usage by interval key, separate from request weight. */
|
|
42
|
+
orderCount?: Record<string, number>;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface RateLimitRequestContext {
|
|
46
|
+
scope: RateLimitScope;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export interface RateLimitResponseContext {
|
|
50
|
+
status: number;
|
|
51
|
+
headers?: Headers;
|
|
52
|
+
usage?: RateLimitUsage;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface RateLimitTransportErrorContext {
|
|
56
|
+
status?: number;
|
|
57
|
+
headers?: Headers;
|
|
58
|
+
retryAfterMs?: number;
|
|
59
|
+
usage?: RateLimitUsage;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export interface RateLimitSnapshot {
|
|
63
|
+
scope: RateLimitScope;
|
|
64
|
+
usage?: RateLimitUsage;
|
|
65
|
+
blockedUntil?: number;
|
|
66
|
+
retryAfterMs?: number;
|
|
67
|
+
state: "ok" | "rate_limited" | "banned";
|
|
68
|
+
updatedAt?: number;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export interface RateLimiter {
|
|
72
|
+
beforeRequest(ctx: RateLimitRequestContext): Promise<void> | void;
|
|
73
|
+
afterResponse(
|
|
74
|
+
ctx: RateLimitRequestContext,
|
|
75
|
+
response: RateLimitResponseContext,
|
|
76
|
+
): Promise<void> | void;
|
|
77
|
+
onTransportError(
|
|
78
|
+
ctx: RateLimitRequestContext,
|
|
79
|
+
error: RateLimitTransportErrorContext,
|
|
80
|
+
): Promise<void> | void;
|
|
81
|
+
getSnapshot(scope: RateLimitScope): RateLimitSnapshot | undefined;
|
|
82
|
+
}
|
|
83
|
+
|
|
27
84
|
export interface MarketRuntimeOptions {
|
|
28
85
|
l1InitialMessageTimeoutMs?: number;
|
|
29
86
|
l1StaleAfterMs?: number;
|
|
@@ -38,6 +95,7 @@ export interface AccountRuntimeOptions {
|
|
|
38
95
|
listenKeyKeepAliveMs?: number;
|
|
39
96
|
binance?: {
|
|
40
97
|
riskPollIntervalMs?: number;
|
|
98
|
+
privateReconcileIntervalMs?: number;
|
|
41
99
|
};
|
|
42
100
|
juplend?: {
|
|
43
101
|
pollIntervalMs?: number;
|
|
@@ -46,12 +104,20 @@ export interface AccountRuntimeOptions {
|
|
|
46
104
|
};
|
|
47
105
|
}
|
|
48
106
|
|
|
107
|
+
export interface OrderRuntimeOptions {
|
|
108
|
+
maxClosedOrdersPerSymbol?: number;
|
|
109
|
+
}
|
|
110
|
+
|
|
49
111
|
export interface CreateClientOptions {
|
|
50
112
|
sandbox?: boolean;
|
|
113
|
+
/** Request/signing clock; local receivedAt/freshness clocks stay independent. */
|
|
114
|
+
clock?: TimeProvider;
|
|
115
|
+
rateLimiter?: RateLimiter;
|
|
51
116
|
logger?: Logger;
|
|
52
117
|
logLevel?: LogLevel;
|
|
53
118
|
market?: MarketRuntimeOptions;
|
|
54
119
|
account?: AccountRuntimeOptions;
|
|
120
|
+
order?: OrderRuntimeOptions;
|
|
55
121
|
}
|
|
56
122
|
|
|
57
123
|
export interface AccountCredentials {
|