@injectivelabs/sdk-ts 1.17.6 → 1.17.8
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/cjs/{AbacusGrpcApi-QbGB8ZMB.cjs → AbacusGrpcApi-Da2mxc3z.cjs} +2 -2
- package/dist/cjs/{BaseGrpcConsumer-Db3sCC6b.cjs → BaseGrpcConsumer-B1hpRQJ-.cjs} +1 -1
- package/dist/cjs/{BaseIndexerGrpcConsumer-BBXxg_BR.cjs → BaseIndexerGrpcConsumer-rRYRp48i.cjs} +1 -1
- package/dist/cjs/{ChainGrpcExchangeApi-Xtflr7xp.cjs → ChainGrpcExchangeApi-5On5kown.cjs} +3 -3
- package/dist/cjs/{ChainRestTendermintApi-CyeoAmer.cjs → ChainRestTendermintApi-DILpgVDN.cjs} +2 -2
- package/dist/cjs/{DirectEthSecp256k1Wallet-BiAOoEd6.cjs → DirectEthSecp256k1Wallet-Bz_TABf8.cjs} +2 -2
- package/dist/cjs/{ExecArgNeptuneWithdraw-4esQ6Su-.cjs → ExecArgNeptuneWithdraw-TyUvdHsN.cjs} +2 -2
- package/dist/cjs/{IndexerGrpcWeb3GwApi-BxJoq1-k.cjs → IndexerGrpcWeb3GwApi-wpbu-sy0.cjs} +2 -2
- package/dist/cjs/{MsgBase-D_1CCpXQ.cjs → MsgBase-DknjeeDb.cjs} +1 -1
- package/dist/cjs/{MsgSetDenomMetadata-DzYvKtNj.cjs → MsgSetDenomMetadata-MOKVZiSF.cjs} +39 -8
- package/dist/cjs/{OLPGrpcApi-CoVqLaSC.cjs → OLPGrpcApi-DYU9vRNO.cjs} +2 -2
- package/dist/cjs/{QueryTradingStrategyContractTotalStrategies-DPrIH5Jb.cjs → QueryTradingStrategyContractTotalStrategies-CDeAJmZj.cjs} +3 -3
- package/dist/cjs/{StreamManagerV2-Dvfpwi5Z.cjs → StreamManagerV2-ocvGmGvp.cjs} +1034 -4
- package/dist/cjs/{accounts-HFzAaFRB.cjs → accounts-BPCUUwFm.cjs} +2 -2
- package/dist/cjs/{chain-CPs0kwL0.cjs → chain-DmIDW_8V.cjs} +3 -3
- package/dist/cjs/client/abacus.cjs +3 -3
- package/dist/cjs/client/chain.cjs +5 -5
- package/dist/cjs/client/chain.d.cts +2 -2
- package/dist/cjs/client/indexer.cjs +17 -5
- package/dist/cjs/client/indexer.d.cts +3 -3
- package/dist/cjs/client/olp.cjs +4 -4
- package/dist/cjs/client/wasm.cjs +8 -8
- package/dist/cjs/client/wasm.d.cts +1 -1
- package/dist/cjs/core/accounts.cjs +3 -3
- package/dist/cjs/core/accounts.d.cts +2 -2
- package/dist/cjs/core/modules.cjs +11 -11
- package/dist/cjs/core/modules.d.cts +2 -2
- package/dist/cjs/core/tx.cjs +8 -8
- package/dist/cjs/core/tx.d.cts +2 -2
- package/dist/cjs/cosmjs.cjs +9 -9
- package/dist/cjs/{defineProperty-dyr5BsvG.cjs → defineProperty-DAtJs5JQ.cjs} +4 -4
- package/dist/cjs/exports.cjs +9 -9
- package/dist/cjs/{index-Dz6elmkG.d.cts → index-CNxu0jEc.d.cts} +1312 -113
- package/dist/cjs/{index-CSWj2FPd.d.cts → index-COusnMLC.d.cts} +8 -5
- package/dist/cjs/index.cjs +29 -17
- package/dist/cjs/index.d.cts +3 -3
- package/dist/cjs/{service-C0DSVBn_.cjs → service-DmzN9jAl.cjs} +1 -1
- package/dist/cjs/service.cjs +2 -2
- package/dist/cjs/{tx-MgHAjEie.cjs → tx-CYMyLXlj.cjs} +5 -5
- package/dist/cjs/utils.d.cts +2 -2
- package/dist/esm/{AbacusGrpcApi-H-P0UiPh.js → AbacusGrpcApi-DG807S_D.js} +2 -2
- package/dist/esm/{BaseGrpcConsumer-a7fB9A_e.js → BaseGrpcConsumer-lUDP-V1I.js} +1 -1
- package/dist/esm/{BaseIndexerGrpcConsumer-CrwqSxDq.js → BaseIndexerGrpcConsumer-ByGqwnv0.js} +1 -1
- package/dist/esm/{ChainGrpcExchangeApi-Ko7rM6Df.js → ChainGrpcExchangeApi-dM8pIv3Q.js} +3 -3
- package/dist/esm/{ChainRestTendermintApi-BUV-cxVj.js → ChainRestTendermintApi-iiW50Z2J.js} +2 -2
- package/dist/esm/{DirectEthSecp256k1Wallet-CMxBvSTE.js → DirectEthSecp256k1Wallet-BV8ttcYH.js} +2 -2
- package/dist/esm/{ExecArgNeptuneWithdraw-BRJZq8Vb.js → ExecArgNeptuneWithdraw-DqIWmqJy.js} +2 -2
- package/dist/esm/{IndexerGrpcWeb3GwApi-CX4ohUOk.js → IndexerGrpcWeb3GwApi-OwqVZsKE.js} +2 -2
- package/dist/esm/{MsgBase-D4pO6org.js → MsgBase-BYNH7Kr5.js} +1 -1
- package/dist/esm/{MsgSetDenomMetadata-CeD0R82a.js → MsgSetDenomMetadata-CTyvXOGo.js} +39 -8
- package/dist/esm/{OLPGrpcApi-CX-m2wvC.js → OLPGrpcApi-CYVKwBCj.js} +2 -2
- package/dist/esm/{QueryTradingStrategyContractTotalStrategies-D9fMELJH.js → QueryTradingStrategyContractTotalStrategies-CCM0S67l.js} +3 -3
- package/dist/esm/{StreamManagerV2-B_6ctbMb.js → StreamManagerV2-CbZamzIn.js} +962 -5
- package/dist/esm/{accounts-CP_DVUou.js → accounts-DaSGlOcB.js} +2 -2
- package/dist/esm/{chain-CQczt2h3.js → chain-DqFxHeeE.js} +3 -3
- package/dist/esm/client/abacus.js +3 -3
- package/dist/esm/client/chain.d.ts +2 -2
- package/dist/esm/client/chain.js +5 -5
- package/dist/esm/client/indexer.d.ts +3 -3
- package/dist/esm/client/indexer.js +6 -6
- package/dist/esm/client/olp.js +4 -4
- package/dist/esm/client/wasm.d.ts +1 -1
- package/dist/esm/client/wasm.js +8 -8
- package/dist/esm/core/accounts.d.ts +2 -2
- package/dist/esm/core/accounts.js +3 -3
- package/dist/esm/core/modules.d.ts +2 -2
- package/dist/esm/core/modules.js +11 -11
- package/dist/esm/core/tx.d.ts +2 -2
- package/dist/esm/core/tx.js +8 -8
- package/dist/esm/cosmjs.js +9 -9
- package/dist/esm/{defineProperty-Bq6QU9Te.js → defineProperty-DuYPbdEg.js} +4 -4
- package/dist/esm/exports.js +9 -9
- package/dist/esm/{index-CvTpnDXx.d.ts → index-C32ydr8i.d.ts} +1313 -113
- package/dist/esm/{index-BbVYW9Fg.d.ts → index-M499Wbuy.d.ts} +8 -5
- package/dist/esm/index.d.ts +3 -3
- package/dist/esm/index.js +18 -18
- package/dist/esm/{service-CqKPnKgb.js → service-DcE3KfV9.js} +1 -1
- package/dist/esm/service.js +2 -2
- package/dist/esm/{tx-ZGcAWTaC.js → tx-CSkj2rce.js} +5 -5
- package/dist/esm/utils.d.ts +2 -2
- package/package.json +7 -6
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import { $t as uint8ArrayToString, a as grpcPagingToPagingV2, nn as bigIntToString, sn as isJsonString, tn as bigIntToNumber } from "./utils-CewUFGKA.js";
|
|
2
|
-
import { t as _defineProperty } from "./defineProperty-
|
|
3
|
-
import { n as GrpcWebRpcTransport } from "./BaseGrpcConsumer-
|
|
4
|
-
import { t as BaseIndexerGrpcConsumer } from "./BaseIndexerGrpcConsumer-
|
|
2
|
+
import { t as _defineProperty } from "./defineProperty-DuYPbdEg.js";
|
|
3
|
+
import { n as GrpcWebRpcTransport } from "./BaseGrpcConsumer-lUDP-V1I.js";
|
|
4
|
+
import { t as BaseIndexerGrpcConsumer } from "./BaseIndexerGrpcConsumer-ByGqwnv0.js";
|
|
5
5
|
import { t as BaseRestConsumer } from "./BaseRestConsumer-DTvorEHL.js";
|
|
6
|
-
import { r as IndexerModule } from "./IndexerGrpcWeb3GwApi-
|
|
6
|
+
import { r as IndexerModule } from "./IndexerGrpcWeb3GwApi-OwqVZsKE.js";
|
|
7
7
|
import { a as TradeDirection, c as GrpcStatusCode, d as StreamState, i as OrderState, l as StreamDisconnectReason, m as TokenVerification, p as TokenType, t as StreamOperation, u as StreamEvent } from "./types-Cf4oVv93.js";
|
|
8
8
|
import { BigNumber, toBigNumber, toHumanReadable } from "@injectivelabs/utils";
|
|
9
9
|
import { GeneralException, HttpRequestException, UnspecifiedErrorCode } from "@injectivelabs/exceptions";
|
|
10
|
+
import { MakerStreamResponse, MakerStreamStreamingRequest, RFQQuoteType, RFQRequestType, TakerStreamResponse, TakerStreamStreamingRequest } from "@injectivelabs/indexer-proto-ts-v2/generated/injective_rfqrpc_pb.js";
|
|
11
|
+
import * as InjectiveRFQExchangeRpcPb from "@injectivelabs/indexer-proto-ts-v2/generated/injective_rfqrpc_pb";
|
|
12
|
+
import { InjectiveRFQRPCClient } from "@injectivelabs/indexer-proto-ts-v2/generated/injective_rfqrpc_pb.client";
|
|
10
13
|
import { MitoAPIClient } from "@injectivelabs/mito-proto-ts-v2/generated/goadesign_goagen_mito_api_pb.client";
|
|
11
14
|
import * as GoadesignGoagenMitoApiPb from "@injectivelabs/mito-proto-ts-v2/generated/goadesign_goagen_mito_api_pb";
|
|
12
15
|
import * as InjectiveMetaRpcPb from "@injectivelabs/indexer-proto-ts-v2/generated/injective_meta_rpc_pb";
|
|
@@ -39,6 +42,839 @@ import * as InjectiveInsuranceRpcPb from "@injectivelabs/indexer-proto-ts-v2/gen
|
|
|
39
42
|
import { InjectiveInsuranceRPCClient } from "@injectivelabs/indexer-proto-ts-v2/generated/injective_insurance_rpc_pb.client";
|
|
40
43
|
import { EventEmitter } from "eventemitter3";
|
|
41
44
|
|
|
45
|
+
//#region src/client/indexer/ws/types.ts
|
|
46
|
+
/**
|
|
47
|
+
* WebSocket connection states
|
|
48
|
+
*/
|
|
49
|
+
const WsState = {
|
|
50
|
+
Idle: "idle",
|
|
51
|
+
Connecting: "connecting",
|
|
52
|
+
Connected: "connected",
|
|
53
|
+
Reconnecting: "reconnecting",
|
|
54
|
+
Disconnected: "disconnected"
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Reasons for WebSocket disconnection
|
|
58
|
+
*/
|
|
59
|
+
const WsDisconnectReason = {
|
|
60
|
+
UserStopped: "user-stopped",
|
|
61
|
+
ConnectionFailed: "connection-failed",
|
|
62
|
+
ConnectionTimeout: "connection-timeout",
|
|
63
|
+
ServerClosed: "server-closed",
|
|
64
|
+
MaxRetries: "max-retries",
|
|
65
|
+
Error: "error"
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Default reconnection configuration
|
|
69
|
+
*/
|
|
70
|
+
const DEFAULT_RECONNECT_CONFIG = {
|
|
71
|
+
enabled: true,
|
|
72
|
+
maxAttempts: 10,
|
|
73
|
+
initialDelayMs: 1e3,
|
|
74
|
+
maxDelayMs: 3e4,
|
|
75
|
+
backoffMultiplier: 2
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* Default transport configuration values
|
|
79
|
+
*/
|
|
80
|
+
const DEFAULT_TRANSPORT_CONFIG = {
|
|
81
|
+
protocol: "grpc-ws",
|
|
82
|
+
connectionTimeoutMs: 1e4
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* gRPC service paths for RFQ streams
|
|
86
|
+
*/
|
|
87
|
+
const RFQ_GRPC_PATHS = {
|
|
88
|
+
TakerStream: "/injective_rfqrpc.InjectiveRFQRPC/TakerStream",
|
|
89
|
+
MakerStream: "/injective_rfqrpc.InjectiveRFQRPC/MakerStream"
|
|
90
|
+
};
|
|
91
|
+
var GrpcDecodeError = class extends Error {
|
|
92
|
+
constructor(message) {
|
|
93
|
+
super(message);
|
|
94
|
+
this.name = "GrpcDecodeError";
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
//#endregion
|
|
99
|
+
//#region src/client/indexer/ws/GrpcWebSocketCodec.ts
|
|
100
|
+
const COMPRESSION_FLAG_NONE = 0;
|
|
101
|
+
const COMPRESSION_FLAG_TRAILER = 128;
|
|
102
|
+
const GRPC_HEADER_SIZE = 5;
|
|
103
|
+
/**
|
|
104
|
+
* Codec for encoding/decoding gRPC-over-WebSocket messages for RFQ streams.
|
|
105
|
+
*/
|
|
106
|
+
const GrpcWebSocketCodec = {
|
|
107
|
+
encodeTakerPing() {
|
|
108
|
+
const message = TakerStreamStreamingRequest.create({ messageType: "ping" });
|
|
109
|
+
return encodeGrpcFrame(TakerStreamStreamingRequest.toBinary(message));
|
|
110
|
+
},
|
|
111
|
+
encodeTakerRequest(input) {
|
|
112
|
+
const request = RFQRequestType.create({
|
|
113
|
+
rfqId: BigInt(input.rfqId),
|
|
114
|
+
marketId: input.marketId,
|
|
115
|
+
direction: input.direction,
|
|
116
|
+
margin: input.margin,
|
|
117
|
+
quantity: input.quantity,
|
|
118
|
+
worstPrice: input.worstPrice,
|
|
119
|
+
requestAddress: input.requestAddress,
|
|
120
|
+
expiry: BigInt(input.expiry),
|
|
121
|
+
status: input.status,
|
|
122
|
+
createdAt: 0n,
|
|
123
|
+
updatedAt: 0n,
|
|
124
|
+
transactionTime: 0n,
|
|
125
|
+
height: 0n
|
|
126
|
+
});
|
|
127
|
+
const message = TakerStreamStreamingRequest.create({
|
|
128
|
+
messageType: "request",
|
|
129
|
+
request
|
|
130
|
+
});
|
|
131
|
+
return encodeGrpcFrame(TakerStreamStreamingRequest.toBinary(message));
|
|
132
|
+
},
|
|
133
|
+
decodeTakerResponse(data) {
|
|
134
|
+
return decodeGrpcFrame(data instanceof ArrayBuffer ? new Uint8Array(data) : data, TakerStreamResponse);
|
|
135
|
+
},
|
|
136
|
+
encodeMakerPing() {
|
|
137
|
+
const message = MakerStreamStreamingRequest.create({ messageType: "ping" });
|
|
138
|
+
return encodeGrpcFrame(MakerStreamStreamingRequest.toBinary(message));
|
|
139
|
+
},
|
|
140
|
+
encodeMakerQuote(input) {
|
|
141
|
+
const quote = RFQQuoteType.create({
|
|
142
|
+
chainId: input.chainId,
|
|
143
|
+
contractAddress: input.contractAddress,
|
|
144
|
+
marketId: input.marketId,
|
|
145
|
+
rfqId: BigInt(input.rfqId),
|
|
146
|
+
takerDirection: input.takerDirection,
|
|
147
|
+
margin: input.margin,
|
|
148
|
+
quantity: input.quantity,
|
|
149
|
+
price: input.price,
|
|
150
|
+
expiry: BigInt(input.expiry),
|
|
151
|
+
maker: input.maker,
|
|
152
|
+
taker: input.taker,
|
|
153
|
+
signature: input.signature,
|
|
154
|
+
status: input.status,
|
|
155
|
+
createdAt: 0n,
|
|
156
|
+
updatedAt: 0n,
|
|
157
|
+
height: 0n,
|
|
158
|
+
eventTime: 0n,
|
|
159
|
+
transactionTime: 0n
|
|
160
|
+
});
|
|
161
|
+
const message = MakerStreamStreamingRequest.create({
|
|
162
|
+
messageType: "quote",
|
|
163
|
+
quote
|
|
164
|
+
});
|
|
165
|
+
return encodeGrpcFrame(MakerStreamStreamingRequest.toBinary(message));
|
|
166
|
+
},
|
|
167
|
+
decodeMakerResponse(data) {
|
|
168
|
+
return decodeGrpcFrame(data instanceof ArrayBuffer ? new Uint8Array(data) : data, MakerStreamResponse);
|
|
169
|
+
},
|
|
170
|
+
isTrailerFrame(data) {
|
|
171
|
+
const bytes = data instanceof ArrayBuffer ? new Uint8Array(data) : data;
|
|
172
|
+
if (bytes.length < 1) return false;
|
|
173
|
+
return (bytes[0] & COMPRESSION_FLAG_TRAILER) !== 0;
|
|
174
|
+
},
|
|
175
|
+
getPayloadLength(data) {
|
|
176
|
+
const bytes = data instanceof ArrayBuffer ? new Uint8Array(data) : data;
|
|
177
|
+
if (bytes.length < GRPC_HEADER_SIZE) return -1;
|
|
178
|
+
return bytes[1] << 24 | bytes[2] << 16 | bytes[3] << 8 | bytes[4];
|
|
179
|
+
},
|
|
180
|
+
isCompleteFrame(data) {
|
|
181
|
+
const bytes = data instanceof ArrayBuffer ? new Uint8Array(data) : data;
|
|
182
|
+
if (bytes.length < GRPC_HEADER_SIZE) return false;
|
|
183
|
+
const payloadLength = this.getPayloadLength(bytes);
|
|
184
|
+
return bytes.length >= GRPC_HEADER_SIZE + payloadLength;
|
|
185
|
+
},
|
|
186
|
+
HEADER_SIZE: GRPC_HEADER_SIZE
|
|
187
|
+
};
|
|
188
|
+
function encodeGrpcFrame(payload) {
|
|
189
|
+
const frame = new Uint8Array(GRPC_HEADER_SIZE + payload.length);
|
|
190
|
+
frame[0] = COMPRESSION_FLAG_NONE;
|
|
191
|
+
new DataView(frame.buffer).setUint32(1, payload.length, false);
|
|
192
|
+
frame.set(payload, GRPC_HEADER_SIZE);
|
|
193
|
+
return frame;
|
|
194
|
+
}
|
|
195
|
+
function decodeGrpcFrame(data, messageType) {
|
|
196
|
+
if (data.byteLength < GRPC_HEADER_SIZE) throw new GrpcDecodeError(`Frame too short: expected at least ${GRPC_HEADER_SIZE} bytes, got ${data.byteLength}`);
|
|
197
|
+
const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
198
|
+
const compressionFlag = view.getUint8(0);
|
|
199
|
+
const isTrailer = (compressionFlag & COMPRESSION_FLAG_TRAILER) !== 0;
|
|
200
|
+
const totalLength = GRPC_HEADER_SIZE + view.getUint32(1, false);
|
|
201
|
+
if (data.byteLength < totalLength) throw new GrpcDecodeError(`Incomplete frame: expected ${totalLength} bytes, got ${data.byteLength}`);
|
|
202
|
+
const payload = data.subarray(GRPC_HEADER_SIZE, totalLength);
|
|
203
|
+
if (isTrailer) return {
|
|
204
|
+
isTrailer: true,
|
|
205
|
+
payload
|
|
206
|
+
};
|
|
207
|
+
if (compressionFlag !== COMPRESSION_FLAG_NONE) throw new GrpcDecodeError(`Unsupported compression flag: 0x${compressionFlag.toString(16)}`);
|
|
208
|
+
try {
|
|
209
|
+
return {
|
|
210
|
+
isTrailer: false,
|
|
211
|
+
message: messageType.fromBinary(payload),
|
|
212
|
+
payload
|
|
213
|
+
};
|
|
214
|
+
} catch (error) {
|
|
215
|
+
throw new GrpcDecodeError(`Failed to decode protobuf message: ${error instanceof Error ? error.message : String(error)}`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
//#endregion
|
|
220
|
+
//#region src/client/indexer/ws/GrpcWebSocketTransport.ts
|
|
221
|
+
/**
|
|
222
|
+
* Low-level gRPC-over-WebSocket transport layer.
|
|
223
|
+
*
|
|
224
|
+
* Handles:
|
|
225
|
+
* - WebSocket connection lifecycle
|
|
226
|
+
* - Reconnection with exponential backoff
|
|
227
|
+
* - State management
|
|
228
|
+
* - Binary message framing
|
|
229
|
+
*
|
|
230
|
+
* This class does NOT handle protobuf encoding/decoding - use GrpcWebSocketCodec for that.
|
|
231
|
+
*/
|
|
232
|
+
var GrpcWebSocketTransport = class {
|
|
233
|
+
constructor(config) {
|
|
234
|
+
_defineProperty(this, "config", void 0);
|
|
235
|
+
_defineProperty(this, "ws", null);
|
|
236
|
+
_defineProperty(this, "state", WsState.Idle);
|
|
237
|
+
_defineProperty(this, "connectionTimeout", null);
|
|
238
|
+
_defineProperty(this, "reconnectTimeout", null);
|
|
239
|
+
_defineProperty(this, "reconnectAttempts", 0);
|
|
240
|
+
_defineProperty(this, "currentReconnectDelay", void 0);
|
|
241
|
+
_defineProperty(this, "isDestroyed", false);
|
|
242
|
+
_defineProperty(this, "hasConnectedOnce", false);
|
|
243
|
+
_defineProperty(this, "listeners", /* @__PURE__ */ new Map());
|
|
244
|
+
this.config = this.resolveConfig(config);
|
|
245
|
+
this.currentReconnectDelay = this.config.reconnect.initialDelayMs;
|
|
246
|
+
}
|
|
247
|
+
getState() {
|
|
248
|
+
return this.state;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Check if the transport is connected and ready to send
|
|
252
|
+
*/
|
|
253
|
+
isConnected() {
|
|
254
|
+
var _this$ws;
|
|
255
|
+
return this.state === WsState.Connected && ((_this$ws = this.ws) === null || _this$ws === void 0 ? void 0 : _this$ws.readyState) === 1;
|
|
256
|
+
}
|
|
257
|
+
async connect() {
|
|
258
|
+
if (this.isDestroyed) throw new Error("Transport has been destroyed");
|
|
259
|
+
if (this.state === WsState.Connected || this.state === WsState.Connecting) return;
|
|
260
|
+
try {
|
|
261
|
+
await this.createConnection();
|
|
262
|
+
} catch (error) {
|
|
263
|
+
const reason = WsDisconnectReason.ConnectionFailed;
|
|
264
|
+
if (this.shouldAttemptReconnect(reason)) {
|
|
265
|
+
this.setState(WsState.Reconnecting);
|
|
266
|
+
this.emit("disconnect", {
|
|
267
|
+
reason,
|
|
268
|
+
willRetry: true
|
|
269
|
+
});
|
|
270
|
+
this.scheduleReconnect();
|
|
271
|
+
} else this.cleanup(reason, false);
|
|
272
|
+
throw error;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
disconnect() {
|
|
276
|
+
this.cleanup(WsDisconnectReason.UserStopped, false);
|
|
277
|
+
}
|
|
278
|
+
destroy() {
|
|
279
|
+
this.isDestroyed = true;
|
|
280
|
+
this.cleanup(WsDisconnectReason.UserStopped, false);
|
|
281
|
+
this.listeners.clear();
|
|
282
|
+
}
|
|
283
|
+
send(data) {
|
|
284
|
+
if (!this.isConnected()) throw new Error("Cannot send: WebSocket is not connected");
|
|
285
|
+
this.ws.send(data);
|
|
286
|
+
}
|
|
287
|
+
on(event, listener) {
|
|
288
|
+
if (!this.listeners.has(event)) this.listeners.set(event, /* @__PURE__ */ new Set());
|
|
289
|
+
this.listeners.get(event).add(listener);
|
|
290
|
+
}
|
|
291
|
+
off(event, listener) {
|
|
292
|
+
var _this$listeners$get;
|
|
293
|
+
(_this$listeners$get = this.listeners.get(event)) === null || _this$listeners$get === void 0 || _this$listeners$get.delete(listener);
|
|
294
|
+
}
|
|
295
|
+
emit(event, data) {
|
|
296
|
+
var _this$listeners$get2;
|
|
297
|
+
(_this$listeners$get2 = this.listeners.get(event)) === null || _this$listeners$get2 === void 0 || _this$listeners$get2.forEach((listener) => {
|
|
298
|
+
try {
|
|
299
|
+
listener(data);
|
|
300
|
+
} catch (error) {
|
|
301
|
+
console.error(`Error in ${event} listener:`, error);
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
async createConnection() {
|
|
306
|
+
return new Promise(async (resolve, reject) => {
|
|
307
|
+
const url = this.config.url;
|
|
308
|
+
this.connectionTimeout = setTimeout(() => {
|
|
309
|
+
this.handleConnectionTimeout(reject);
|
|
310
|
+
}, this.config.connectionTimeoutMs);
|
|
311
|
+
try {
|
|
312
|
+
this.ws = await this.createWebSocket(url, this.config.protocol, this.config.metadata);
|
|
313
|
+
if ("binaryType" in this.ws) this.ws.binaryType = "arraybuffer";
|
|
314
|
+
this.ws.onopen = () => {
|
|
315
|
+
this.handleOpen(resolve);
|
|
316
|
+
};
|
|
317
|
+
this.ws.onclose = (event) => {
|
|
318
|
+
this.handleClose(event, reject);
|
|
319
|
+
};
|
|
320
|
+
this.ws.onerror = (error) => {
|
|
321
|
+
this.handleError(error, reject);
|
|
322
|
+
};
|
|
323
|
+
this.ws.onmessage = (event) => {
|
|
324
|
+
this.handleMessage(event);
|
|
325
|
+
};
|
|
326
|
+
} catch (error) {
|
|
327
|
+
this.clearConnectionTimeout();
|
|
328
|
+
reject(error);
|
|
329
|
+
}
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
async createWebSocket(url, protocol, metadata) {
|
|
333
|
+
if (typeof WebSocket !== "undefined") {
|
|
334
|
+
const urlWithMetadata = this.addMetadataToUrl(url, metadata);
|
|
335
|
+
return new WebSocket(urlWithMetadata, protocol);
|
|
336
|
+
}
|
|
337
|
+
return new (await (import("ws"))).default(url, protocol, { headers: metadata || {} });
|
|
338
|
+
}
|
|
339
|
+
addMetadataToUrl(url, metadata) {
|
|
340
|
+
if (!metadata || Object.keys(metadata).length === 0) return url;
|
|
341
|
+
const params = new URLSearchParams(metadata);
|
|
342
|
+
return `${url}${url.includes("?") ? "&" : "?"}${params.toString()}`;
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Handle WebSocket open event
|
|
346
|
+
*/
|
|
347
|
+
handleOpen(resolve) {
|
|
348
|
+
this.clearConnectionTimeout();
|
|
349
|
+
this.setState(WsState.Connected);
|
|
350
|
+
this.reconnectAttempts = 0;
|
|
351
|
+
this.currentReconnectDelay = this.config.reconnect.initialDelayMs;
|
|
352
|
+
const isReconnect = this.hasConnectedOnce;
|
|
353
|
+
this.hasConnectedOnce = true;
|
|
354
|
+
this.emit("connect", { isReconnect });
|
|
355
|
+
resolve();
|
|
356
|
+
}
|
|
357
|
+
handleClose(event, reject) {
|
|
358
|
+
if (this.state === WsState.Connecting) {
|
|
359
|
+
this.clearConnectionTimeout();
|
|
360
|
+
if (reject) reject(/* @__PURE__ */ new Error(`WebSocket closed before open: code=${event.code}, reason=${event.reason}`));
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
if (this.state === WsState.Disconnected || this.isDestroyed) return;
|
|
364
|
+
const reason = this.determineDisconnectReason(event);
|
|
365
|
+
if (this.shouldAttemptReconnect(reason)) {
|
|
366
|
+
this.setState(WsState.Reconnecting);
|
|
367
|
+
this.scheduleReconnect();
|
|
368
|
+
this.emit("disconnect", {
|
|
369
|
+
reason,
|
|
370
|
+
willRetry: true
|
|
371
|
+
});
|
|
372
|
+
} else this.cleanup(reason, false);
|
|
373
|
+
}
|
|
374
|
+
handleError(error, reject) {
|
|
375
|
+
const errorObj = error instanceof Error ? error : /* @__PURE__ */ new Error("WebSocket error");
|
|
376
|
+
this.emit("error", errorObj);
|
|
377
|
+
if (this.state === WsState.Connecting && reject) {
|
|
378
|
+
this.clearConnectionTimeout();
|
|
379
|
+
reject(errorObj);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
handleMessage(event) {
|
|
383
|
+
const data = event.data;
|
|
384
|
+
if (data instanceof ArrayBuffer) this.emit("message", data);
|
|
385
|
+
else if (typeof Blob !== "undefined" && data instanceof Blob) data.arrayBuffer().then((buffer) => {
|
|
386
|
+
this.emit("message", buffer);
|
|
387
|
+
});
|
|
388
|
+
else if (typeof Buffer !== "undefined" && Buffer.isBuffer(data)) {
|
|
389
|
+
const buffer = new Uint8Array(data).buffer;
|
|
390
|
+
this.emit("message", buffer);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
handleConnectionTimeout(reject) {
|
|
394
|
+
var _this$ws2;
|
|
395
|
+
(_this$ws2 = this.ws) === null || _this$ws2 === void 0 || _this$ws2.close();
|
|
396
|
+
this.ws = null;
|
|
397
|
+
reject(/* @__PURE__ */ new Error("Connection timeout"));
|
|
398
|
+
if (this.shouldAttemptReconnect(WsDisconnectReason.ConnectionTimeout)) {
|
|
399
|
+
this.setState(WsState.Reconnecting);
|
|
400
|
+
this.scheduleReconnect();
|
|
401
|
+
} else this.cleanup(WsDisconnectReason.ConnectionTimeout, false);
|
|
402
|
+
}
|
|
403
|
+
clearConnectionTimeout() {
|
|
404
|
+
if (this.connectionTimeout) {
|
|
405
|
+
clearTimeout(this.connectionTimeout);
|
|
406
|
+
this.connectionTimeout = null;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
clearReconnectTimeout() {
|
|
410
|
+
if (this.reconnectTimeout) {
|
|
411
|
+
clearTimeout(this.reconnectTimeout);
|
|
412
|
+
this.reconnectTimeout = null;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
scheduleReconnect() {
|
|
416
|
+
this.clearReconnectTimeout();
|
|
417
|
+
this.reconnectTimeout = setTimeout(async () => {
|
|
418
|
+
if (this.isDestroyed || this.state === WsState.Disconnected) return;
|
|
419
|
+
this.reconnectAttempts++;
|
|
420
|
+
try {
|
|
421
|
+
await this.createConnection();
|
|
422
|
+
} catch (_unused) {}
|
|
423
|
+
this.currentReconnectDelay = Math.min(this.currentReconnectDelay * this.config.reconnect.backoffMultiplier, this.config.reconnect.maxDelayMs);
|
|
424
|
+
}, this.currentReconnectDelay);
|
|
425
|
+
}
|
|
426
|
+
shouldAttemptReconnect(reason) {
|
|
427
|
+
if (reason === WsDisconnectReason.UserStopped) return false;
|
|
428
|
+
if (!this.config.reconnect.enabled) return false;
|
|
429
|
+
if (this.config.reconnect.maxAttempts > 0 && this.reconnectAttempts >= this.config.reconnect.maxAttempts) return false;
|
|
430
|
+
return true;
|
|
431
|
+
}
|
|
432
|
+
determineDisconnectReason(event) {
|
|
433
|
+
if (event.code === 1e3) return WsDisconnectReason.ServerClosed;
|
|
434
|
+
if (event.code === 1001) return WsDisconnectReason.ServerClosed;
|
|
435
|
+
if (event.code === 1006) return WsDisconnectReason.ConnectionFailed;
|
|
436
|
+
return WsDisconnectReason.Error;
|
|
437
|
+
}
|
|
438
|
+
cleanup(reason, willRetry) {
|
|
439
|
+
this.clearConnectionTimeout();
|
|
440
|
+
this.clearReconnectTimeout();
|
|
441
|
+
if (this.ws) {
|
|
442
|
+
this.ws.onopen = null;
|
|
443
|
+
this.ws.onclose = null;
|
|
444
|
+
this.ws.onerror = null;
|
|
445
|
+
this.ws.onmessage = null;
|
|
446
|
+
if (this.ws.readyState === 0 || this.ws.readyState === 1) this.ws.close();
|
|
447
|
+
this.ws = null;
|
|
448
|
+
}
|
|
449
|
+
this.setState(WsState.Disconnected);
|
|
450
|
+
this.emit("disconnect", {
|
|
451
|
+
reason,
|
|
452
|
+
willRetry
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
setState(newState) {
|
|
456
|
+
if (this.state === newState) return;
|
|
457
|
+
const from = this.state;
|
|
458
|
+
this.state = newState;
|
|
459
|
+
this.emit("state_change", {
|
|
460
|
+
from,
|
|
461
|
+
to: newState
|
|
462
|
+
});
|
|
463
|
+
}
|
|
464
|
+
resolveConfig(config) {
|
|
465
|
+
var _config$protocol, _config$connectionTim;
|
|
466
|
+
const reconnect = {
|
|
467
|
+
...DEFAULT_RECONNECT_CONFIG,
|
|
468
|
+
...config.reconnect
|
|
469
|
+
};
|
|
470
|
+
return {
|
|
471
|
+
url: config.url,
|
|
472
|
+
protocol: (_config$protocol = config.protocol) !== null && _config$protocol !== void 0 ? _config$protocol : DEFAULT_TRANSPORT_CONFIG.protocol,
|
|
473
|
+
connectionTimeoutMs: (_config$connectionTim = config.connectionTimeoutMs) !== null && _config$connectionTim !== void 0 ? _config$connectionTim : DEFAULT_TRANSPORT_CONFIG.connectionTimeoutMs,
|
|
474
|
+
reconnect,
|
|
475
|
+
metadata: config.metadata
|
|
476
|
+
};
|
|
477
|
+
}
|
|
478
|
+
};
|
|
479
|
+
|
|
480
|
+
//#endregion
|
|
481
|
+
//#region src/client/indexer/transformers/IndexerGrpcRfqTransformer.ts
|
|
482
|
+
/**
|
|
483
|
+
* @category Indexer Grpc Transformer
|
|
484
|
+
*/
|
|
485
|
+
var IndexerGrpcRfqTransformer = class IndexerGrpcRfqTransformer {
|
|
486
|
+
static grpcRfqRequestToRfqRequest(grpcRequest) {
|
|
487
|
+
return {
|
|
488
|
+
margin: grpcRequest.margin,
|
|
489
|
+
status: grpcRequest.status,
|
|
490
|
+
marketId: grpcRequest.marketId,
|
|
491
|
+
quantity: grpcRequest.quantity,
|
|
492
|
+
direction: grpcRequest.direction,
|
|
493
|
+
worstPrice: grpcRequest.worstPrice,
|
|
494
|
+
expiry: Number(grpcRequest.expiry),
|
|
495
|
+
height: Number(grpcRequest.height),
|
|
496
|
+
rfqId: grpcRequest.rfqId.toString(),
|
|
497
|
+
createdAt: Number(grpcRequest.createdAt),
|
|
498
|
+
updatedAt: Number(grpcRequest.updatedAt),
|
|
499
|
+
requestAddress: grpcRequest.requestAddress,
|
|
500
|
+
transactionTime: Number(grpcRequest.transactionTime)
|
|
501
|
+
};
|
|
502
|
+
}
|
|
503
|
+
static grpcRfqQuoteToRfqQuote(grpcQuote) {
|
|
504
|
+
return {
|
|
505
|
+
price: grpcQuote.price,
|
|
506
|
+
maker: grpcQuote.maker,
|
|
507
|
+
taker: grpcQuote.taker,
|
|
508
|
+
margin: grpcQuote.margin,
|
|
509
|
+
status: grpcQuote.status,
|
|
510
|
+
chainId: grpcQuote.chainId,
|
|
511
|
+
marketId: grpcQuote.marketId,
|
|
512
|
+
quantity: grpcQuote.quantity,
|
|
513
|
+
signature: grpcQuote.signature,
|
|
514
|
+
expiry: Number(grpcQuote.expiry),
|
|
515
|
+
height: Number(grpcQuote.height),
|
|
516
|
+
rfqId: grpcQuote.rfqId.toString(),
|
|
517
|
+
createdAt: Number(grpcQuote.createdAt),
|
|
518
|
+
updatedAt: Number(grpcQuote.updatedAt),
|
|
519
|
+
eventTime: Number(grpcQuote.eventTime),
|
|
520
|
+
takerDirection: grpcQuote.takerDirection,
|
|
521
|
+
contractAddress: grpcQuote.contractAddress,
|
|
522
|
+
transactionTime: Number(grpcQuote.transactionTime)
|
|
523
|
+
};
|
|
524
|
+
}
|
|
525
|
+
static grpcRfqSettlementToRfqSettlement(grpcSettlement) {
|
|
526
|
+
return {
|
|
527
|
+
taker: grpcSettlement.taker,
|
|
528
|
+
margin: grpcSettlement.margin,
|
|
529
|
+
marketId: grpcSettlement.marketId,
|
|
530
|
+
quantity: grpcSettlement.quantity,
|
|
531
|
+
direction: grpcSettlement.direction,
|
|
532
|
+
worstPrice: grpcSettlement.worstPrice,
|
|
533
|
+
height: Number(grpcSettlement.height),
|
|
534
|
+
rfqId: grpcSettlement.rfqId.toString(),
|
|
535
|
+
createdAt: Number(grpcSettlement.createdAt),
|
|
536
|
+
updatedAt: Number(grpcSettlement.updatedAt),
|
|
537
|
+
eventTime: Number(grpcSettlement.eventTime),
|
|
538
|
+
fallbackMargin: grpcSettlement.fallbackMargin,
|
|
539
|
+
fallbackQuantity: grpcSettlement.fallbackQuantity,
|
|
540
|
+
transactionTime: Number(grpcSettlement.transactionTime)
|
|
541
|
+
};
|
|
542
|
+
}
|
|
543
|
+
static openRequestsResponseToOpenRequests(response) {
|
|
544
|
+
return { requests: response.requests.map(IndexerGrpcRfqTransformer.grpcRfqRequestToRfqRequest) };
|
|
545
|
+
}
|
|
546
|
+
static pendingQuotesResponseToPendingQuotes(response) {
|
|
547
|
+
return { quotes: response.quotes.map(IndexerGrpcRfqTransformer.grpcRfqQuoteToRfqQuote) };
|
|
548
|
+
}
|
|
549
|
+
static listSettlementsResponseToSettlements(response) {
|
|
550
|
+
return {
|
|
551
|
+
settlements: response.settlements.map(IndexerGrpcRfqTransformer.grpcRfqSettlementToRfqSettlement),
|
|
552
|
+
total: Number(response.total)
|
|
553
|
+
};
|
|
554
|
+
}
|
|
555
|
+
};
|
|
556
|
+
|
|
557
|
+
//#endregion
|
|
558
|
+
//#region src/client/indexer/ws/rfq/IndexerWsTakerStream.ts
|
|
559
|
+
var IndexerWsTakerStream = class {
|
|
560
|
+
constructor(config) {
|
|
561
|
+
var _config$pingIntervalM;
|
|
562
|
+
_defineProperty(this, "transport", void 0);
|
|
563
|
+
_defineProperty(this, "pingInterval", null);
|
|
564
|
+
_defineProperty(this, "listeners", /* @__PURE__ */ new Map());
|
|
565
|
+
_defineProperty(this, "isDestroyed", false);
|
|
566
|
+
_defineProperty(this, "pingIntervalMs", void 0);
|
|
567
|
+
const fullUrl = this.buildUrl(config.url, RFQ_GRPC_PATHS.TakerStream);
|
|
568
|
+
this.pingIntervalMs = (_config$pingIntervalM = config.pingIntervalMs) !== null && _config$pingIntervalM !== void 0 ? _config$pingIntervalM : 1e3;
|
|
569
|
+
this.transport = new GrpcWebSocketTransport({
|
|
570
|
+
url: fullUrl,
|
|
571
|
+
connectionTimeoutMs: config.connectionTimeoutMs,
|
|
572
|
+
reconnect: config.reconnect,
|
|
573
|
+
metadata: { request_address: config.requestAddress }
|
|
574
|
+
});
|
|
575
|
+
this.setupTransportHandlers();
|
|
576
|
+
}
|
|
577
|
+
getState() {
|
|
578
|
+
return this.transport.getState();
|
|
579
|
+
}
|
|
580
|
+
isConnected() {
|
|
581
|
+
return this.transport.isConnected();
|
|
582
|
+
}
|
|
583
|
+
async connect() {
|
|
584
|
+
if (this.isDestroyed) throw new Error("Stream has been destroyed");
|
|
585
|
+
await this.transport.connect();
|
|
586
|
+
}
|
|
587
|
+
disconnect() {
|
|
588
|
+
this.stopPingInterval();
|
|
589
|
+
this.transport.disconnect();
|
|
590
|
+
}
|
|
591
|
+
destroy() {
|
|
592
|
+
this.isDestroyed = true;
|
|
593
|
+
this.stopPingInterval();
|
|
594
|
+
this.transport.destroy();
|
|
595
|
+
this.listeners.clear();
|
|
596
|
+
}
|
|
597
|
+
sendRequest(request) {
|
|
598
|
+
if (!this.isConnected()) throw new Error("Cannot send request: stream is not connected");
|
|
599
|
+
const encoded = GrpcWebSocketCodec.encodeTakerRequest(request);
|
|
600
|
+
this.transport.send(encoded);
|
|
601
|
+
}
|
|
602
|
+
on(event, listener) {
|
|
603
|
+
if (!this.listeners.has(event)) this.listeners.set(event, /* @__PURE__ */ new Set());
|
|
604
|
+
this.listeners.get(event).add(listener);
|
|
605
|
+
}
|
|
606
|
+
off(event, listener) {
|
|
607
|
+
var _this$listeners$get;
|
|
608
|
+
(_this$listeners$get = this.listeners.get(event)) === null || _this$listeners$get === void 0 || _this$listeners$get.delete(listener);
|
|
609
|
+
}
|
|
610
|
+
emit(event, data) {
|
|
611
|
+
var _this$listeners$get2;
|
|
612
|
+
(_this$listeners$get2 = this.listeners.get(event)) === null || _this$listeners$get2 === void 0 || _this$listeners$get2.forEach((listener) => {
|
|
613
|
+
try {
|
|
614
|
+
listener(data);
|
|
615
|
+
} catch (error) {
|
|
616
|
+
console.error(`Error in ${event} listener:`, error);
|
|
617
|
+
}
|
|
618
|
+
});
|
|
619
|
+
}
|
|
620
|
+
setupTransportHandlers() {
|
|
621
|
+
this.transport.on("connect", ({ isReconnect }) => {
|
|
622
|
+
this.startPingInterval();
|
|
623
|
+
this.emit("connect", { isReconnect });
|
|
624
|
+
});
|
|
625
|
+
this.transport.on("disconnect", ({ reason, willRetry }) => {
|
|
626
|
+
this.stopPingInterval();
|
|
627
|
+
this.emit("disconnect", {
|
|
628
|
+
reason,
|
|
629
|
+
willRetry
|
|
630
|
+
});
|
|
631
|
+
});
|
|
632
|
+
this.transport.on("state_change", ({ from, to }) => {
|
|
633
|
+
this.emit("state_change", {
|
|
634
|
+
from,
|
|
635
|
+
to
|
|
636
|
+
});
|
|
637
|
+
});
|
|
638
|
+
this.transport.on("message", (data) => {
|
|
639
|
+
this.handleMessage(data);
|
|
640
|
+
});
|
|
641
|
+
this.transport.on("error", (error) => {
|
|
642
|
+
this.emit("error", {
|
|
643
|
+
code: "TRANSPORT_ERROR",
|
|
644
|
+
message: error.message
|
|
645
|
+
});
|
|
646
|
+
});
|
|
647
|
+
}
|
|
648
|
+
handleMessage(data) {
|
|
649
|
+
try {
|
|
650
|
+
const frame = GrpcWebSocketCodec.decodeTakerResponse(data);
|
|
651
|
+
if (frame.isTrailer) return;
|
|
652
|
+
const response = frame.message;
|
|
653
|
+
if (!response) return;
|
|
654
|
+
switch (response.messageType) {
|
|
655
|
+
case "pong":
|
|
656
|
+
this.emit("pong", void 0);
|
|
657
|
+
break;
|
|
658
|
+
case "quote":
|
|
659
|
+
if (response.quote) {
|
|
660
|
+
const quote = IndexerGrpcRfqTransformer.grpcRfqQuoteToRfqQuote(response.quote);
|
|
661
|
+
this.emit("quote", { quote });
|
|
662
|
+
}
|
|
663
|
+
break;
|
|
664
|
+
case "request_ack":
|
|
665
|
+
if (response.requestAck) {
|
|
666
|
+
const ack = {
|
|
667
|
+
rfqId: response.requestAck.rfqId.toString(),
|
|
668
|
+
status: response.requestAck.status
|
|
669
|
+
};
|
|
670
|
+
this.emit("request_ack", ack);
|
|
671
|
+
}
|
|
672
|
+
break;
|
|
673
|
+
case "error":
|
|
674
|
+
if (response.error) {
|
|
675
|
+
const error = {
|
|
676
|
+
code: response.error.code,
|
|
677
|
+
message: response.error.message
|
|
678
|
+
};
|
|
679
|
+
this.emit("error", error);
|
|
680
|
+
}
|
|
681
|
+
break;
|
|
682
|
+
default: console.warn(`Unknown taker stream message type: ${response.messageType}`);
|
|
683
|
+
}
|
|
684
|
+
} catch (error) {
|
|
685
|
+
if (error instanceof GrpcDecodeError) this.emit("error", {
|
|
686
|
+
code: "DECODE_ERROR",
|
|
687
|
+
message: error.message
|
|
688
|
+
});
|
|
689
|
+
else this.emit("error", {
|
|
690
|
+
code: "UNKNOWN_ERROR",
|
|
691
|
+
message: error instanceof Error ? error.message : String(error)
|
|
692
|
+
});
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
startPingInterval() {
|
|
696
|
+
this.stopPingInterval();
|
|
697
|
+
this.pingInterval = setInterval(() => {
|
|
698
|
+
if (this.isConnected()) try {
|
|
699
|
+
const pingMessage = GrpcWebSocketCodec.encodeTakerPing();
|
|
700
|
+
this.transport.send(pingMessage);
|
|
701
|
+
} catch (error) {
|
|
702
|
+
console.error("Failed to send ping:", error);
|
|
703
|
+
}
|
|
704
|
+
}, this.pingIntervalMs);
|
|
705
|
+
}
|
|
706
|
+
stopPingInterval() {
|
|
707
|
+
if (this.pingInterval) {
|
|
708
|
+
clearInterval(this.pingInterval);
|
|
709
|
+
this.pingInterval = null;
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
buildUrl(baseUrl, grpcPath) {
|
|
713
|
+
return `${baseUrl.replace(/\/$/, "")}${grpcPath.startsWith("/") ? grpcPath : `/${grpcPath}`}`;
|
|
714
|
+
}
|
|
715
|
+
};
|
|
716
|
+
|
|
717
|
+
//#endregion
|
|
718
|
+
//#region src/client/indexer/ws/rfq/IndexerWsMakerStream.ts
|
|
719
|
+
var IndexerWsMakerStream = class {
|
|
720
|
+
constructor(config) {
|
|
721
|
+
var _config$pingIntervalM;
|
|
722
|
+
_defineProperty(this, "transport", void 0);
|
|
723
|
+
_defineProperty(this, "pingInterval", null);
|
|
724
|
+
_defineProperty(this, "listeners", /* @__PURE__ */ new Map());
|
|
725
|
+
_defineProperty(this, "isDestroyed", false);
|
|
726
|
+
_defineProperty(this, "pingIntervalMs", void 0);
|
|
727
|
+
const fullUrl = this.buildUrl(config.url, RFQ_GRPC_PATHS.MakerStream);
|
|
728
|
+
this.pingIntervalMs = (_config$pingIntervalM = config.pingIntervalMs) !== null && _config$pingIntervalM !== void 0 ? _config$pingIntervalM : 1e3;
|
|
729
|
+
this.transport = new GrpcWebSocketTransport({
|
|
730
|
+
url: fullUrl,
|
|
731
|
+
connectionTimeoutMs: config.connectionTimeoutMs,
|
|
732
|
+
reconnect: config.reconnect,
|
|
733
|
+
metadata: { maker_address: config.makerAddress }
|
|
734
|
+
});
|
|
735
|
+
this.setupTransportHandlers();
|
|
736
|
+
}
|
|
737
|
+
getState() {
|
|
738
|
+
return this.transport.getState();
|
|
739
|
+
}
|
|
740
|
+
isConnected() {
|
|
741
|
+
return this.transport.isConnected();
|
|
742
|
+
}
|
|
743
|
+
async connect() {
|
|
744
|
+
if (this.isDestroyed) throw new Error("Stream has been destroyed");
|
|
745
|
+
await this.transport.connect();
|
|
746
|
+
}
|
|
747
|
+
disconnect() {
|
|
748
|
+
this.stopPingInterval();
|
|
749
|
+
this.transport.disconnect();
|
|
750
|
+
}
|
|
751
|
+
destroy() {
|
|
752
|
+
this.isDestroyed = true;
|
|
753
|
+
this.stopPingInterval();
|
|
754
|
+
this.transport.destroy();
|
|
755
|
+
this.listeners.clear();
|
|
756
|
+
}
|
|
757
|
+
sendQuote(quote) {
|
|
758
|
+
if (!this.isConnected()) throw new Error("Cannot send quote: stream is not connected");
|
|
759
|
+
const encoded = GrpcWebSocketCodec.encodeMakerQuote(quote);
|
|
760
|
+
this.transport.send(encoded);
|
|
761
|
+
}
|
|
762
|
+
on(event, listener) {
|
|
763
|
+
if (!this.listeners.has(event)) this.listeners.set(event, /* @__PURE__ */ new Set());
|
|
764
|
+
this.listeners.get(event).add(listener);
|
|
765
|
+
}
|
|
766
|
+
off(event, listener) {
|
|
767
|
+
var _this$listeners$get;
|
|
768
|
+
(_this$listeners$get = this.listeners.get(event)) === null || _this$listeners$get === void 0 || _this$listeners$get.delete(listener);
|
|
769
|
+
}
|
|
770
|
+
emit(event, data) {
|
|
771
|
+
var _this$listeners$get2;
|
|
772
|
+
(_this$listeners$get2 = this.listeners.get(event)) === null || _this$listeners$get2 === void 0 || _this$listeners$get2.forEach((listener) => {
|
|
773
|
+
try {
|
|
774
|
+
listener(data);
|
|
775
|
+
} catch (error) {
|
|
776
|
+
console.error(`Error in ${event} listener:`, error);
|
|
777
|
+
}
|
|
778
|
+
});
|
|
779
|
+
}
|
|
780
|
+
setupTransportHandlers() {
|
|
781
|
+
this.transport.on("connect", ({ isReconnect }) => {
|
|
782
|
+
this.startPingInterval();
|
|
783
|
+
this.emit("connect", { isReconnect });
|
|
784
|
+
});
|
|
785
|
+
this.transport.on("disconnect", ({ reason, willRetry }) => {
|
|
786
|
+
this.stopPingInterval();
|
|
787
|
+
this.emit("disconnect", {
|
|
788
|
+
reason,
|
|
789
|
+
willRetry
|
|
790
|
+
});
|
|
791
|
+
});
|
|
792
|
+
this.transport.on("state_change", ({ from, to }) => {
|
|
793
|
+
this.emit("state_change", {
|
|
794
|
+
from,
|
|
795
|
+
to
|
|
796
|
+
});
|
|
797
|
+
});
|
|
798
|
+
this.transport.on("message", (data) => {
|
|
799
|
+
this.handleMessage(data);
|
|
800
|
+
});
|
|
801
|
+
this.transport.on("error", (error) => {
|
|
802
|
+
this.emit("error", {
|
|
803
|
+
code: "TRANSPORT_ERROR",
|
|
804
|
+
message: error.message
|
|
805
|
+
});
|
|
806
|
+
});
|
|
807
|
+
}
|
|
808
|
+
handleMessage(data) {
|
|
809
|
+
try {
|
|
810
|
+
const frame = GrpcWebSocketCodec.decodeMakerResponse(data);
|
|
811
|
+
if (frame.isTrailer) return;
|
|
812
|
+
const response = frame.message;
|
|
813
|
+
if (!response) return;
|
|
814
|
+
switch (response.messageType) {
|
|
815
|
+
case "pong":
|
|
816
|
+
this.emit("pong", void 0);
|
|
817
|
+
break;
|
|
818
|
+
case "request":
|
|
819
|
+
if (response.request) {
|
|
820
|
+
const request = IndexerGrpcRfqTransformer.grpcRfqRequestToRfqRequest(response.request);
|
|
821
|
+
this.emit("request", { request });
|
|
822
|
+
}
|
|
823
|
+
break;
|
|
824
|
+
case "quote_ack":
|
|
825
|
+
if (response.quoteAck) {
|
|
826
|
+
const ack = {
|
|
827
|
+
rfqId: response.quoteAck.rfqId.toString(),
|
|
828
|
+
status: response.quoteAck.status
|
|
829
|
+
};
|
|
830
|
+
this.emit("quote_ack", ack);
|
|
831
|
+
}
|
|
832
|
+
break;
|
|
833
|
+
case "error":
|
|
834
|
+
if (response.error) {
|
|
835
|
+
const error = {
|
|
836
|
+
code: response.error.code,
|
|
837
|
+
message: response.error.message
|
|
838
|
+
};
|
|
839
|
+
this.emit("error", error);
|
|
840
|
+
}
|
|
841
|
+
break;
|
|
842
|
+
default: console.warn(`Unknown maker stream message type: ${response.messageType}`);
|
|
843
|
+
}
|
|
844
|
+
} catch (error) {
|
|
845
|
+
if (error instanceof GrpcDecodeError) this.emit("error", {
|
|
846
|
+
code: "DECODE_ERROR",
|
|
847
|
+
message: error.message
|
|
848
|
+
});
|
|
849
|
+
else this.emit("error", {
|
|
850
|
+
code: "UNKNOWN_ERROR",
|
|
851
|
+
message: error instanceof Error ? error.message : String(error)
|
|
852
|
+
});
|
|
853
|
+
}
|
|
854
|
+
}
|
|
855
|
+
startPingInterval() {
|
|
856
|
+
this.stopPingInterval();
|
|
857
|
+
this.pingInterval = setInterval(() => {
|
|
858
|
+
if (this.isConnected()) try {
|
|
859
|
+
const pingMessage = GrpcWebSocketCodec.encodeMakerPing();
|
|
860
|
+
this.transport.send(pingMessage);
|
|
861
|
+
} catch (error) {
|
|
862
|
+
console.error("Failed to send ping:", error);
|
|
863
|
+
}
|
|
864
|
+
}, this.pingIntervalMs);
|
|
865
|
+
}
|
|
866
|
+
stopPingInterval() {
|
|
867
|
+
if (this.pingInterval) {
|
|
868
|
+
clearInterval(this.pingInterval);
|
|
869
|
+
this.pingInterval = null;
|
|
870
|
+
}
|
|
871
|
+
}
|
|
872
|
+
buildUrl(baseUrl, grpcPath) {
|
|
873
|
+
return `${baseUrl.replace(/\/$/, "")}${grpcPath.startsWith("/") ? grpcPath : `/${grpcPath}`}`;
|
|
874
|
+
}
|
|
875
|
+
};
|
|
876
|
+
|
|
877
|
+
//#endregion
|
|
42
878
|
//#region src/client/indexer/transformers/IndexerCommonTransformer.ts
|
|
43
879
|
var IndexerCommonTransformer = class {
|
|
44
880
|
static grpcCoinToCoin(coin) {
|
|
@@ -836,6 +1672,25 @@ var IndexerCampaignTransformer = class IndexerCampaignTransformer {
|
|
|
836
1672
|
}
|
|
837
1673
|
};
|
|
838
1674
|
|
|
1675
|
+
//#endregion
|
|
1676
|
+
//#region src/client/indexer/transformers/IndexerRfqStreamTransformer.ts
|
|
1677
|
+
/**
|
|
1678
|
+
* @category Indexer Stream Transformer
|
|
1679
|
+
*/
|
|
1680
|
+
var IndexerRfqStreamTransformer = class {};
|
|
1681
|
+
_defineProperty(IndexerRfqStreamTransformer, "requestStreamCallback", (response) => {
|
|
1682
|
+
const request = response.request;
|
|
1683
|
+
return { request: request ? IndexerGrpcRfqTransformer.grpcRfqRequestToRfqRequest(request) : void 0 };
|
|
1684
|
+
});
|
|
1685
|
+
_defineProperty(IndexerRfqStreamTransformer, "quoteStreamCallback", (response) => {
|
|
1686
|
+
const quote = response.quote;
|
|
1687
|
+
return { quote: quote ? IndexerGrpcRfqTransformer.grpcRfqQuoteToRfqQuote(quote) : void 0 };
|
|
1688
|
+
});
|
|
1689
|
+
_defineProperty(IndexerRfqStreamTransformer, "settlementStreamCallback", (response) => {
|
|
1690
|
+
const settlement = response.settlement;
|
|
1691
|
+
return { settlement: settlement ? IndexerGrpcRfqTransformer.grpcRfqSettlementToRfqSettlement(settlement) : void 0 };
|
|
1692
|
+
});
|
|
1693
|
+
|
|
839
1694
|
//#endregion
|
|
840
1695
|
//#region src/client/indexer/transformers/IndexerGrpcOracleTransformer.ts
|
|
841
1696
|
var IndexerGrpcOracleTransformer = class IndexerGrpcOracleTransformer {
|
|
@@ -2825,6 +3680,73 @@ _defineProperty(IndexerAccountPortfolioStreamTransformer, "accountPortfolioStrea
|
|
|
2825
3680
|
};
|
|
2826
3681
|
});
|
|
2827
3682
|
|
|
3683
|
+
//#endregion
|
|
3684
|
+
//#region src/client/indexer/grpc/IndexerGrpcRfqApi.ts
|
|
3685
|
+
/**
|
|
3686
|
+
* @category Indexer Grpc API
|
|
3687
|
+
*/
|
|
3688
|
+
var IndexerGrpcRFQApi = class extends BaseIndexerGrpcConsumer {
|
|
3689
|
+
constructor(..._args) {
|
|
3690
|
+
super(..._args);
|
|
3691
|
+
_defineProperty(this, "module", IndexerModule.RFQ);
|
|
3692
|
+
}
|
|
3693
|
+
get client() {
|
|
3694
|
+
return this.initClient(InjectiveRFQRPCClient);
|
|
3695
|
+
}
|
|
3696
|
+
async submitRequest({ rfqId, margin, expiry, status, height, marketId, quantity, direction, createdAt, updatedAt, worstPrice, requestAddress, transactionTime }) {
|
|
3697
|
+
const request = InjectiveRFQExchangeRpcPb.RFQRequestType.create();
|
|
3698
|
+
if (rfqId !== void 0) request.rfqId = rfqId;
|
|
3699
|
+
if (marketId) request.marketId = marketId;
|
|
3700
|
+
if (direction) request.direction = direction;
|
|
3701
|
+
if (margin) request.margin = margin;
|
|
3702
|
+
if (quantity) request.quantity = quantity;
|
|
3703
|
+
if (worstPrice) request.worstPrice = worstPrice;
|
|
3704
|
+
if (requestAddress) request.requestAddress = requestAddress;
|
|
3705
|
+
if (expiry) request.expiry = expiry;
|
|
3706
|
+
if (status) request.status = status;
|
|
3707
|
+
if (createdAt) request.createdAt = createdAt;
|
|
3708
|
+
if (updatedAt) request.updatedAt = updatedAt;
|
|
3709
|
+
if (transactionTime) request.transactionTime = transactionTime;
|
|
3710
|
+
if (height) request.height = height;
|
|
3711
|
+
const requestMessage = InjectiveRFQExchangeRpcPb.RequestRequest.create();
|
|
3712
|
+
requestMessage.request = request;
|
|
3713
|
+
return { status: (await this.executeGrpcCall(requestMessage, this.client.request.bind(this.client))).status };
|
|
3714
|
+
}
|
|
3715
|
+
async submitQuote({ rfqId, price, maker, taker, margin, expiry, status, height, chainId, marketId, quantity, signature, createdAt, updatedAt, eventTime, takerDirection, contractAddress, transactionTime }) {
|
|
3716
|
+
const request = InjectiveRFQExchangeRpcPb.RFQQuoteType.create();
|
|
3717
|
+
if (chainId) request.chainId = chainId;
|
|
3718
|
+
if (contractAddress) request.contractAddress = contractAddress;
|
|
3719
|
+
if (marketId) request.marketId = marketId;
|
|
3720
|
+
if (rfqId !== void 0) request.rfqId = rfqId;
|
|
3721
|
+
if (takerDirection) request.takerDirection = takerDirection;
|
|
3722
|
+
if (margin) request.margin = margin;
|
|
3723
|
+
if (quantity) request.quantity = quantity;
|
|
3724
|
+
if (price) request.price = price;
|
|
3725
|
+
if (expiry) request.expiry = expiry;
|
|
3726
|
+
if (maker) request.maker = maker;
|
|
3727
|
+
if (taker) request.taker = taker;
|
|
3728
|
+
if (signature) request.signature = signature;
|
|
3729
|
+
if (status) request.status = status;
|
|
3730
|
+
if (createdAt) request.createdAt = createdAt;
|
|
3731
|
+
if (updatedAt) request.updatedAt = updatedAt;
|
|
3732
|
+
if (height) request.height = height;
|
|
3733
|
+
if (eventTime) request.eventTime = eventTime;
|
|
3734
|
+
if (transactionTime) request.transactionTime = transactionTime;
|
|
3735
|
+
const quoteMessage = InjectiveRFQExchangeRpcPb.QuoteRequest.create();
|
|
3736
|
+
quoteMessage.quote = request;
|
|
3737
|
+
return { status: (await this.executeGrpcCall(quoteMessage, this.client.quote.bind(this.client))).status };
|
|
3738
|
+
}
|
|
3739
|
+
async fetchSettlements(params) {
|
|
3740
|
+
const { addresses, pagination } = params || {};
|
|
3741
|
+
const request = InjectiveRFQExchangeRpcPb.ListSettlementRequest.create();
|
|
3742
|
+
if (addresses && addresses.length > 0) request.addresses = addresses;
|
|
3743
|
+
if (pagination === null || pagination === void 0 ? void 0 : pagination.skip) request.skip = BigInt(pagination.skip);
|
|
3744
|
+
if (pagination === null || pagination === void 0 ? void 0 : pagination.limit) request.limit = BigInt(pagination.limit);
|
|
3745
|
+
const response = await this.executeGrpcCall(request, this.client.listSettlement.bind(this.client));
|
|
3746
|
+
return IndexerGrpcRfqTransformer.listSettlementsResponseToSettlements(response);
|
|
3747
|
+
}
|
|
3748
|
+
};
|
|
3749
|
+
|
|
2828
3750
|
//#endregion
|
|
2829
3751
|
//#region src/client/indexer/grpc/IndexerGrpcMitoApi.ts
|
|
2830
3752
|
/**
|
|
@@ -5519,6 +6441,41 @@ function createStreamSubscriptionV2(stream, handleResponse) {
|
|
|
5519
6441
|
return subscription;
|
|
5520
6442
|
}
|
|
5521
6443
|
|
|
6444
|
+
//#endregion
|
|
6445
|
+
//#region src/client/indexer/grpc_stream/streamV2/IndexerGrpcRfqStreamV2.ts
|
|
6446
|
+
var IndexerGrpcRfqStreamV2 = class {
|
|
6447
|
+
constructor(endpoint, metadata) {
|
|
6448
|
+
_defineProperty(this, "client", void 0);
|
|
6449
|
+
_defineProperty(this, "transport", void 0);
|
|
6450
|
+
this.transport = new GrpcWebRpcTransport(endpoint, metadata);
|
|
6451
|
+
this.client = new InjectiveRFQRPCClient(this.transport);
|
|
6452
|
+
}
|
|
6453
|
+
streamRequests({ marketIds, callback }) {
|
|
6454
|
+
if (typeof callback !== "function") throw new Error("callback must be a function");
|
|
6455
|
+
const request = InjectiveRFQExchangeRpcPb.StreamRequestRequest.create();
|
|
6456
|
+
if (marketIds && marketIds.length > 0) request.marketIds = marketIds;
|
|
6457
|
+
return createStreamSubscriptionV2(this.client.streamRequest(request), (response) => {
|
|
6458
|
+
callback(IndexerRfqStreamTransformer.requestStreamCallback(response));
|
|
6459
|
+
});
|
|
6460
|
+
}
|
|
6461
|
+
streamQuotes({ addresses, callback }) {
|
|
6462
|
+
if (typeof callback !== "function") throw new Error("callback must be a function");
|
|
6463
|
+
const request = InjectiveRFQExchangeRpcPb.StreamQuoteRequest.create();
|
|
6464
|
+
if (addresses && addresses.length > 0) request.addresses = addresses;
|
|
6465
|
+
return createStreamSubscriptionV2(this.client.streamQuote(request), (response) => {
|
|
6466
|
+
callback(IndexerRfqStreamTransformer.quoteStreamCallback(response));
|
|
6467
|
+
});
|
|
6468
|
+
}
|
|
6469
|
+
streamSettlements({ addresses, callback }) {
|
|
6470
|
+
if (typeof callback !== "function") throw new Error("callback must be a function");
|
|
6471
|
+
const request = InjectiveRFQExchangeRpcPb.StreamSettlementRequest.create();
|
|
6472
|
+
if (addresses && addresses.length > 0) request.addresses = addresses;
|
|
6473
|
+
return createStreamSubscriptionV2(this.client.streamSettlement(request), (response) => {
|
|
6474
|
+
callback(IndexerRfqStreamTransformer.settlementStreamCallback(response));
|
|
6475
|
+
});
|
|
6476
|
+
}
|
|
6477
|
+
};
|
|
6478
|
+
|
|
5522
6479
|
//#endregion
|
|
5523
6480
|
//#region src/client/indexer/grpc_stream/streamV2/IndexerGrpcSpotStreamV2.ts
|
|
5524
6481
|
var IndexerGrpcSpotStreamV2 = class {
|
|
@@ -6327,4 +7284,4 @@ var StreamManagerV2 = class extends EventEmitter {
|
|
|
6327
7284
|
};
|
|
6328
7285
|
|
|
6329
7286
|
//#endregion
|
|
6330
|
-
export {
|
|
7287
|
+
export { ExplorerStreamTransformer as $, IndexerRestExplorerApi as A, IndexerGrpcAuctionApi as B, IndexerGrpcMitoStream as C, DEFAULT_TRANSPORT_CONFIG as Ct, IndexerRestDerivativesChronosApi as D, IndexerRestLeaderboardChronosApi as E, IndexerGrpcReferralApi as F, IndexerGrpcMitoApi as G, IndexerGrpcOracleApi as H, IndexerGrpcArchiverApi as I, IndexerGrpcInsuranceFundTransformer as J, IndexerGrpcRFQApi as K, IndexerGrpcCampaignApi as L, IndexerGrpcAccountPortfolioApi as M, IndexerGrpcDerivativesApi as N, IndexerRestMarketChronosApi as O, IndexerGrpcMegaVaultApi as P, IndexerGrpcDerivativeTransformer as Q, IndexerGrpcExplorerApi as R, IndexerGrpcOracleStream as S, DEFAULT_RECONNECT_CONFIG as St, createStreamSubscription as T, WsState as Tt, IndexerGrpcSpotApi as U, IndexerGrpcAccountApi as V, IndexerGrpcMetaApi as W, IndexerGrpcAccountPortfolioTransformer as X, IndexerDerivativeStreamTransformer as Y, IndexerGrpcMitoStreamTransformer as Z, IndexerGrpcExplorerStream as _, IndexerWsMakerStream as _t, IndexerGrpcArchiverStreamV2 as a, IndexerOracleStreamTransformer as at, IndexerGrpcAuctionStream as b, GrpcWebSocketTransport as bt, IndexerGrpcAccountStreamV2 as c, IndexerGrpcArchiverTransformer as ct, IndexerGrpcSpotStreamV2 as d, IndexerSpotStreamTransformer as dt, IndexerArchiverStreamTransformer as et, IndexerGrpcRfqStreamV2 as f, IndexerGrpcOracleTransformer as ft, IndexerGrpcDerivativesStream as g, IndexerGrpcMitoTransformer as gt, IndexerGrpcAccountPortfolioStream as h, IndexerGrpcSpotTransformer as ht, IndexerGrpcExplorerStreamV2 as i, IndexerRestExplorerTransformer as it, IndexerGrpcInsuranceFundApi as j, IndexerRestSpotChronosApi as k, IndexerGrpcOracleStreamV2 as l, IndexerGrpcAuctionTransformer as lt, StreamManager as m, IndexerCampaignTransformer as mt, IndexerGrpcAccountPortfolioStreamV2 as n, IndexerAuctionStreamTransformer as nt, IndexerGrpcTradingStreamV2 as o, IndexerGrpcReferralTransformer as ot, createStreamSubscriptionV2 as p, IndexerRfqStreamTransformer as pt, IndexerAccountPortfolioStreamTransformer as q, IndexerGrpcDerivativesStreamV2 as r, IndexerAccountStreamTransformer as rt, IndexerGrpcAuctionStreamV2 as s, IndexerGrpcExplorerTransformer as st, StreamManagerV2 as t, IndexerGrpcMegaVaultTransformer as tt, IndexerGrpcMitoStreamV2 as u, IndexerGrpcAccountTransformer as ut, IndexerGrpcArchiverStream as v, IndexerWsTakerStream as vt, IndexerGrpcSpotStream as w, WsDisconnectReason as wt, IndexerGrpcAccountStream as x, GrpcWebSocketCodec as xt, IndexerGrpcTradingStream as y, IndexerGrpcRfqTransformer as yt, IndexerGrpcTradingApi as z };
|