@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
package/dist/index.d.ts DELETED
@@ -1,6 +0,0 @@
1
- export { createClient } from "./core/client.js";
2
- export { createAcexError, isAcexError } from "./errors/acex-error.js";
3
- export { IMPLEMENTED_EXCHANGES } from "./types/public.js";
4
- export type { AcexClient, CreateClientOptions, RegisterAccountInput, RegisterAccountResult, } from "./core/client.js";
5
- export type { AcexErrorCode, ClientStatus, Exchange, ImplementedExchange, } from "./types/public.js";
6
- export type { AcexError, CreateAcexErrorInput } from "./errors/acex-error.js";
package/dist/index.js DELETED
@@ -1,3 +0,0 @@
1
- export { createClient } from "./core/client.js";
2
- export { createAcexError, isAcexError } from "./errors/acex-error.js";
3
- export { IMPLEMENTED_EXCHANGES } from "./types/public.js";
@@ -1,41 +0,0 @@
1
- import type { AdapterAccountBaseline, NormalizedAccountEvent } from "../adapters/types.js";
2
- import type { AccountBalanceSnapshot, AccountPositionSnapshot, AccountRiskSnapshot, AccountSnapshot, AccountStatus, AccountStore } from "../store/account-store.js";
3
- export interface SubscribeAccountInput {
4
- accountId: string;
5
- }
6
- export interface AccountPositionLookupInput {
7
- accountId: string;
8
- symbol: string;
9
- }
10
- export interface AccountManager {
11
- subscribeAccount(input: SubscribeAccountInput): Promise<void>;
12
- getBalance(accountId: string, asset: string): AccountBalanceSnapshot | undefined;
13
- getBalances(accountId: string): AccountBalanceSnapshot[];
14
- getPosition(input: AccountPositionLookupInput): AccountPositionSnapshot | undefined;
15
- getPositions(accountId: string): AccountPositionSnapshot[];
16
- getAccountSnapshot(accountId: string): AccountSnapshot | undefined;
17
- getAccountStatus(accountId: string): AccountStatus | undefined;
18
- getRiskSnapshot(accountId: string): AccountRiskSnapshot | undefined;
19
- watchAccountEvents(): AsyncIterable<NormalizedAccountEvent>;
20
- }
21
- interface AccountAdapter {
22
- exchange: string;
23
- fetchAccountBaseline(accountId: string): Promise<AdapterAccountBaseline>;
24
- }
25
- export declare function createAccountManager(store: AccountStore, adapter: AccountAdapter): {
26
- subscribeAccount(input: SubscribeAccountInput): Promise<void>;
27
- getBalance(accountId: string, asset: string): AccountBalanceSnapshot | undefined;
28
- getBalances(accountId: string): AccountBalanceSnapshot[];
29
- getPosition(input: AccountPositionLookupInput): AccountPositionSnapshot | undefined;
30
- getPositions(accountId: string): AccountPositionSnapshot[];
31
- getAccountSnapshot: (accountId: string) => AccountSnapshot | undefined;
32
- getAccountStatus: (accountId: string) => AccountStatus | undefined;
33
- getRiskSnapshot(accountId: string): AccountRiskSnapshot | undefined;
34
- watchAccountEvents(): import("../runtime/async-queue.js").AsyncQueue<NormalizedAccountEvent>;
35
- pushEvent(event: NormalizedAccountEvent): void;
36
- };
37
- export declare function createIdleAccountManager(): AccountManager;
38
- export interface AccountManagerRuntime extends AccountManager {
39
- pushEvent(event: NormalizedAccountEvent): void;
40
- }
41
- export {};
@@ -1,80 +0,0 @@
1
- import { createAsyncQueue } from "../runtime/async-queue.js";
2
- export function createAccountManager(store, adapter) {
3
- const publicEvents = createAsyncQueue({ maxBufferSize: 100 });
4
- return {
5
- async subscribeAccount(input) {
6
- const baseline = await adapter.fetchAccountBaseline(input.accountId);
7
- const now = Date.now();
8
- store.replaceSnapshot({
9
- accountId: input.accountId,
10
- exchange: adapter.exchange,
11
- balances: baseline.balances,
12
- positions: baseline.positions,
13
- ...(baseline.risk === undefined ? {} : { risk: baseline.risk }),
14
- receivedAt: now,
15
- updatedAt: now,
16
- });
17
- store.setStatus({
18
- accountId: input.accountId,
19
- exchange: adapter.exchange,
20
- status: "healthy",
21
- bootstrapCompleted: true,
22
- });
23
- },
24
- getBalance(accountId, asset) {
25
- return store.getSnapshot(accountId)?.balances?.[asset];
26
- },
27
- getBalances(accountId) {
28
- return Object.values(store.getSnapshot(accountId)?.balances ?? {});
29
- },
30
- getPosition(input) {
31
- return (store.getSnapshot(input.accountId)?.positions ?? []).find((position) => {
32
- return position.symbol === input.symbol;
33
- });
34
- },
35
- getPositions(accountId) {
36
- return store.getSnapshot(accountId)?.positions ?? [];
37
- },
38
- getAccountSnapshot: store.getSnapshot,
39
- getAccountStatus: store.getStatus,
40
- getRiskSnapshot(accountId) {
41
- return store.getSnapshot(accountId)?.risk;
42
- },
43
- watchAccountEvents() {
44
- return publicEvents;
45
- },
46
- pushEvent(event) {
47
- publicEvents.push(event);
48
- },
49
- };
50
- }
51
- export function createIdleAccountManager() {
52
- const events = createAsyncQueue({ maxBufferSize: 100 });
53
- return {
54
- async subscribeAccount() { },
55
- getBalance() {
56
- return undefined;
57
- },
58
- getBalances() {
59
- return [];
60
- },
61
- getPosition() {
62
- return undefined;
63
- },
64
- getPositions() {
65
- return [];
66
- },
67
- getAccountSnapshot() {
68
- return undefined;
69
- },
70
- getAccountStatus() {
71
- return undefined;
72
- },
73
- getRiskSnapshot() {
74
- return undefined;
75
- },
76
- watchAccountEvents() {
77
- return events;
78
- },
79
- };
80
- }
@@ -1,16 +0,0 @@
1
- import type { MarketDataStatus, MarketStore, MarketStoreKey } from "../store/market-store.js";
2
- export interface MarketManager {
3
- subscribeL1Book(input: MarketStoreKey): Promise<void>;
4
- subscribeFundingRate(input: MarketStoreKey): Promise<void>;
5
- getL1Book(key: MarketStoreKey): ReturnType<MarketStore["getL1Book"]>;
6
- getFundingRate(key: MarketStoreKey): ReturnType<MarketStore["getFundingRate"]>;
7
- getMarketSnapshot(key: MarketStoreKey): ReturnType<MarketStore["getSnapshot"]>;
8
- getMarketStatus(key: MarketStoreKey): MarketDataStatus | undefined;
9
- }
10
- interface MarketSubscriptionAdapter {
11
- subscribeL1Book(input: MarketStoreKey): Promise<void>;
12
- subscribeFundingRate(input: MarketStoreKey): Promise<void>;
13
- }
14
- export declare function createMarketManager(store: MarketStore, adapter: MarketSubscriptionAdapter): MarketManager;
15
- export declare function createIdleMarketManager(): MarketManager;
16
- export {};
@@ -1,28 +0,0 @@
1
- export function createMarketManager(store, adapter) {
2
- return {
3
- subscribeL1Book: adapter.subscribeL1Book.bind(adapter),
4
- subscribeFundingRate: adapter.subscribeFundingRate.bind(adapter),
5
- getL1Book: store.getL1Book,
6
- getFundingRate: store.getFundingRate,
7
- getMarketSnapshot: store.getSnapshot,
8
- getMarketStatus: store.getStatus,
9
- };
10
- }
11
- export function createIdleMarketManager() {
12
- return {
13
- async subscribeL1Book() { },
14
- async subscribeFundingRate() { },
15
- getL1Book() {
16
- return undefined;
17
- },
18
- getFundingRate() {
19
- return undefined;
20
- },
21
- getMarketSnapshot() {
22
- return {};
23
- },
24
- getMarketStatus() {
25
- return undefined;
26
- },
27
- };
28
- }
@@ -1,87 +0,0 @@
1
- import type { OrderSnapshot, OrderStatus, OrderStore } from "../store/order-store.js";
2
- export interface SubscribeOrdersInput {
3
- accountId: string;
4
- }
5
- export interface PlaceOrderInput {
6
- accountId: string;
7
- exchange: string;
8
- symbol: string;
9
- side: "buy" | "sell";
10
- amount: string;
11
- clientOrderId: string;
12
- type: string;
13
- price?: string;
14
- reduceOnly?: boolean;
15
- }
16
- export interface AmendOrderInput {
17
- accountId: string;
18
- exchange: string;
19
- clientOrderId?: string;
20
- orderId?: string;
21
- symbol?: string;
22
- newPrice?: string;
23
- }
24
- export interface CancelOrderInput {
25
- accountId: string;
26
- exchange: string;
27
- clientOrderId?: string;
28
- orderId?: string;
29
- }
30
- export interface CancelAllOrdersInput {
31
- accountId: string;
32
- exchange: string;
33
- }
34
- export interface OrderLookupInput {
35
- accountId: string;
36
- exchange: string;
37
- clientOrderId?: string;
38
- orderId?: string;
39
- }
40
- export interface OrderAck {
41
- requestId: string;
42
- accountId: string;
43
- exchange: string;
44
- clientOrderId?: string;
45
- orderId?: string;
46
- symbol?: string;
47
- submittedAt: number;
48
- }
49
- export interface CancelAllOrdersResult {
50
- accountId: string;
51
- exchange: string;
52
- canceledCount: number;
53
- }
54
- export interface OrderManager {
55
- subscribeOrders(input: SubscribeOrdersInput): Promise<void>;
56
- placeOrder(input: PlaceOrderInput): Promise<OrderAck>;
57
- amendOrder(input: AmendOrderInput): Promise<OrderAck>;
58
- cancelOrder(input: CancelOrderInput): Promise<OrderAck>;
59
- cancelAllOrders(input: CancelAllOrdersInput): Promise<CancelAllOrdersResult>;
60
- getOrder(input: OrderLookupInput): OrderSnapshot | undefined;
61
- getOpenOrders(accountId: string): OrderSnapshot[];
62
- getOrderStatus(accountId: string): OrderStatus | undefined;
63
- }
64
- interface OrderAdapter {
65
- exchange: string;
66
- subscribeOrders(input: SubscribeOrdersInput): Promise<void>;
67
- fetchOpenOrdersBaseline(accountId: string): Promise<OrderSnapshot[]>;
68
- placeOrder(input: PlaceOrderInput): Promise<{
69
- clientOrderId?: string;
70
- orderId?: string;
71
- receivedAt: number;
72
- }>;
73
- amendOrder(input: AmendOrderInput): Promise<{
74
- clientOrderId?: string;
75
- orderId?: string;
76
- receivedAt: number;
77
- }>;
78
- cancelOrder(input: CancelOrderInput): Promise<{
79
- clientOrderId?: string;
80
- orderId?: string;
81
- receivedAt: number;
82
- }>;
83
- cancelAllOrders(input: CancelAllOrdersInput): Promise<CancelAllOrdersResult>;
84
- }
85
- export declare function createOrderManager(store: OrderStore, adapter: OrderAdapter): OrderManager;
86
- export declare function createIdleOrderManager(): OrderManager;
87
- export {};
@@ -1,122 +0,0 @@
1
- import { nextRequestId } from "../runtime/request-id.js";
2
- export function createOrderManager(store, adapter) {
3
- return {
4
- async subscribeOrders(input) {
5
- await adapter.subscribeOrders(input);
6
- const baseline = await adapter.fetchOpenOrdersBaseline(input.accountId);
7
- for (const snapshot of baseline) {
8
- store.upsertOrder(snapshot);
9
- }
10
- store.setStatus({
11
- accountId: input.accountId,
12
- exchange: adapter.exchange,
13
- status: "healthy",
14
- bootstrapCompleted: true,
15
- });
16
- },
17
- async placeOrder(input) {
18
- const result = await adapter.placeOrder(input);
19
- return createOrderAck({
20
- requestId: nextRequestId(),
21
- accountId: input.accountId,
22
- exchange: input.exchange,
23
- symbol: input.symbol,
24
- clientOrderId: result.clientOrderId ?? input.clientOrderId,
25
- orderId: result.orderId,
26
- submittedAt: result.receivedAt,
27
- });
28
- },
29
- async amendOrder(input) {
30
- const result = await adapter.amendOrder(input);
31
- return createOrderAck({
32
- requestId: nextRequestId(),
33
- accountId: input.accountId,
34
- exchange: input.exchange,
35
- symbol: input.symbol,
36
- clientOrderId: result.clientOrderId ?? input.clientOrderId,
37
- orderId: result.orderId,
38
- submittedAt: result.receivedAt,
39
- });
40
- },
41
- async cancelOrder(input) {
42
- const result = await adapter.cancelOrder(input);
43
- return createOrderAck({
44
- requestId: nextRequestId(),
45
- accountId: input.accountId,
46
- exchange: input.exchange,
47
- clientOrderId: result.clientOrderId ?? input.clientOrderId,
48
- orderId: result.orderId,
49
- submittedAt: result.receivedAt,
50
- });
51
- },
52
- cancelAllOrders: adapter.cancelAllOrders.bind(adapter),
53
- getOrder(input) {
54
- return store.getOrder(input.accountId, input);
55
- },
56
- getOpenOrders: store.getOpenOrders,
57
- getOrderStatus: store.getStatus,
58
- };
59
- }
60
- export function createIdleOrderManager() {
61
- return {
62
- async subscribeOrders() { },
63
- async placeOrder(input) {
64
- return createOrderAck({
65
- requestId: nextRequestId(),
66
- accountId: input.accountId,
67
- exchange: input.exchange,
68
- symbol: input.symbol,
69
- clientOrderId: input.clientOrderId,
70
- submittedAt: Date.now(),
71
- });
72
- },
73
- async amendOrder(input) {
74
- return createOrderAck({
75
- requestId: nextRequestId(),
76
- accountId: input.accountId,
77
- exchange: input.exchange,
78
- symbol: input.symbol,
79
- clientOrderId: input.clientOrderId,
80
- orderId: input.orderId,
81
- submittedAt: Date.now(),
82
- });
83
- },
84
- async cancelOrder(input) {
85
- return createOrderAck({
86
- requestId: nextRequestId(),
87
- accountId: input.accountId,
88
- exchange: input.exchange,
89
- clientOrderId: input.clientOrderId,
90
- orderId: input.orderId,
91
- submittedAt: Date.now(),
92
- });
93
- },
94
- async cancelAllOrders(input) {
95
- return {
96
- accountId: input.accountId,
97
- exchange: input.exchange,
98
- canceledCount: 0,
99
- };
100
- },
101
- getOrder() {
102
- return undefined;
103
- },
104
- getOpenOrders() {
105
- return [];
106
- },
107
- getOrderStatus() {
108
- return undefined;
109
- },
110
- };
111
- }
112
- function createOrderAck(input) {
113
- return {
114
- requestId: input.requestId,
115
- accountId: input.accountId,
116
- exchange: input.exchange,
117
- submittedAt: input.submittedAt,
118
- ...(input.clientOrderId === undefined ? {} : { clientOrderId: input.clientOrderId }),
119
- ...(input.orderId === undefined ? {} : { orderId: input.orderId }),
120
- ...(input.symbol === undefined ? {} : { symbol: input.symbol }),
121
- };
122
- }
@@ -1,8 +0,0 @@
1
- export interface CreateAsyncQueueInput {
2
- maxBufferSize: number;
3
- }
4
- export interface AsyncQueue<T> extends AsyncIterable<T> {
5
- push(value: T): void;
6
- close(): void;
7
- }
8
- export declare function createAsyncQueue<T>(input: CreateAsyncQueueInput): AsyncQueue<T>;
@@ -1,88 +0,0 @@
1
- import { createAcexError } from "../errors/acex-error.js";
2
- export function createAsyncQueue(input) {
3
- const buffer = [];
4
- const pendingNext = [];
5
- let isClosed = false;
6
- let overflowError;
7
- const drainPending = () => {
8
- while (pendingNext.length > 0) {
9
- const next = pendingNext.shift();
10
- if (next === undefined) {
11
- return;
12
- }
13
- if (overflowError !== undefined) {
14
- next.reject(overflowError);
15
- continue;
16
- }
17
- if (buffer.length > 0) {
18
- const slot = buffer.shift();
19
- if (slot === undefined) {
20
- next.resolve({ done: true, value: undefined });
21
- continue;
22
- }
23
- next.resolve({ done: false, value: slot.value });
24
- continue;
25
- }
26
- if (isClosed) {
27
- next.resolve({ done: true, value: undefined });
28
- continue;
29
- }
30
- pendingNext.unshift(next);
31
- return;
32
- }
33
- };
34
- const next = () => {
35
- if (overflowError !== undefined) {
36
- return Promise.reject(overflowError);
37
- }
38
- if (buffer.length > 0) {
39
- const slot = buffer.shift();
40
- if (slot !== undefined) {
41
- return Promise.resolve({ done: false, value: slot.value });
42
- }
43
- }
44
- if (isClosed) {
45
- return Promise.resolve({ done: true, value: undefined });
46
- }
47
- return new Promise((resolve, reject) => {
48
- pendingNext.push({ resolve, reject });
49
- });
50
- };
51
- const queue = {
52
- push(value) {
53
- if (isClosed || overflowError !== undefined) {
54
- return;
55
- }
56
- if (pendingNext.length > 0) {
57
- const waiter = pendingNext.shift();
58
- if (waiter !== undefined) {
59
- waiter.resolve({ done: false, value });
60
- return;
61
- }
62
- }
63
- if (buffer.length >= input.maxBufferSize) {
64
- overflowError = createAcexError({
65
- code: "EVENT_CONSUMER_OVERFLOW",
66
- message: "EVENT_CONSUMER_OVERFLOW",
67
- retryable: false,
68
- });
69
- drainPending();
70
- return;
71
- }
72
- buffer.push({ value });
73
- },
74
- close() {
75
- if (isClosed) {
76
- return;
77
- }
78
- isClosed = true;
79
- drainPending();
80
- },
81
- [Symbol.asyncIterator]() {
82
- return {
83
- next,
84
- };
85
- },
86
- };
87
- return queue;
88
- }
@@ -1 +0,0 @@
1
- export declare function nextRequestId(): string;
@@ -1,5 +0,0 @@
1
- let counter = 0;
2
- export function nextRequestId() {
3
- counter += 1;
4
- return `req-${counter}`;
5
- }
@@ -1,76 +0,0 @@
1
- export type WsConnectionState = "idle" | "connecting" | "open" | "reconnecting" | "closed";
2
- export interface WsSocketLike {
3
- readyState: number;
4
- send(data: string | ArrayBufferLike | Uint8Array): void;
5
- close(code?: number, reason?: string): void;
6
- ping?(data?: string | ArrayBufferLike | Uint8Array): void;
7
- pong?(data?: string | ArrayBufferLike | Uint8Array): void;
8
- terminate?(): void;
9
- onopen: ((event: unknown) => void) | null;
10
- onmessage: ((event: {
11
- data: string | Buffer | ArrayBuffer | ArrayBufferView;
12
- }) => void) | null;
13
- onping?: ((event: {
14
- data?: string | Buffer | ArrayBuffer | ArrayBufferView;
15
- }) => void) | null;
16
- onpong?: ((event: {
17
- data?: string | Buffer | ArrayBuffer | ArrayBufferView;
18
- }) => void) | null;
19
- onclose: ((event: unknown) => void) | null;
20
- onerror: ((event: unknown) => void) | null;
21
- }
22
- type CustomHeartbeatCleanup = (() => void | Promise<void>) | undefined;
23
- type CustomHeartbeatContext = {
24
- socket: WsSocketLike;
25
- markActivity: () => void;
26
- send: (data: string | ArrayBufferLike | Uint8Array) => void;
27
- sleep: (ms: number) => Promise<void>;
28
- now: () => number;
29
- reportError: (error: unknown) => void;
30
- };
31
- type HeartbeatConfig = {
32
- kind: "passive_read_timeout";
33
- idleTimeoutMs: number;
34
- } | {
35
- kind: "native_ping_pong";
36
- heartbeatIntervalMs: number;
37
- idleTimeoutMs: number;
38
- } | {
39
- kind: "app_ping_message";
40
- heartbeatIntervalMs: number;
41
- idleTimeoutMs: number;
42
- buildPingMessage: () => string | ArrayBufferLike | Uint8Array;
43
- } | {
44
- kind: "custom";
45
- idleTimeoutMs: number;
46
- heartbeatIntervalMs?: number;
47
- start: (context: CustomHeartbeatContext) => CustomHeartbeatCleanup | Promise<CustomHeartbeatCleanup>;
48
- };
49
- interface CreateWsConnectionSupervisorInput {
50
- createSocket: () => WsSocketLike;
51
- heartbeat: HeartbeatConfig;
52
- backoff: {
53
- baseDelayMs: number;
54
- maxDelayMs: number;
55
- jitter: boolean;
56
- };
57
- now?: () => number;
58
- sleep?: (ms: number) => Promise<void>;
59
- onOpen?: () => void;
60
- onMessage?: (event: {
61
- data: string | Buffer | ArrayBuffer | ArrayBufferView;
62
- }) => void;
63
- onClose?: () => void;
64
- onDisconnect?: () => void;
65
- onReconnect?: () => void | Promise<void>;
66
- onError?: (error: Error) => void;
67
- }
68
- export interface WsConnectionSupervisor {
69
- connect(): Promise<void>;
70
- close(): Promise<void>;
71
- send(data: string | ArrayBufferLike | Uint8Array): void;
72
- getState(): WsConnectionState;
73
- getLastActivityAt(): number | undefined;
74
- }
75
- export declare function createWsConnectionSupervisor(input: CreateWsConnectionSupervisorInput): WsConnectionSupervisor;
76
- export {};