@upbit-official/upbit-sdk 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.md +21 -0
  3. package/client.d.mts +10 -4
  4. package/client.d.mts.map +1 -1
  5. package/client.d.ts +10 -4
  6. package/client.d.ts.map +1 -1
  7. package/client.js +23 -5
  8. package/client.js.map +1 -1
  9. package/client.mjs +23 -5
  10. package/client.mjs.map +1 -1
  11. package/index.d.mts +3 -1
  12. package/index.d.mts.map +1 -1
  13. package/index.d.ts +3 -1
  14. package/index.d.ts.map +1 -1
  15. package/index.js +2 -1
  16. package/index.js.map +1 -1
  17. package/index.mjs +1 -1
  18. package/index.mjs.map +1 -1
  19. package/internal/ws-parser.d.mts +40 -0
  20. package/internal/ws-parser.d.mts.map +1 -0
  21. package/internal/ws-parser.d.ts +40 -0
  22. package/internal/ws-parser.d.ts.map +1 -0
  23. package/internal/ws-parser.js +125 -0
  24. package/internal/ws-parser.js.map +1 -0
  25. package/internal/ws-parser.mjs +118 -0
  26. package/internal/ws-parser.mjs.map +1 -0
  27. package/internal/ws-simple-types.d.mts +8 -0
  28. package/internal/ws-simple-types.d.mts.map +1 -0
  29. package/internal/ws-simple-types.d.ts +8 -0
  30. package/internal/ws-simple-types.d.ts.map +1 -0
  31. package/internal/ws-simple-types.js +3 -0
  32. package/internal/ws-simple-types.js.map +1 -0
  33. package/internal/ws-simple-types.mjs +2 -0
  34. package/internal/ws-simple-types.mjs.map +1 -0
  35. package/internal/ws.d.mts +1 -0
  36. package/internal/ws.d.mts.map +1 -1
  37. package/internal/ws.d.ts +1 -0
  38. package/internal/ws.d.ts.map +1 -1
  39. package/internal/ws.js.map +1 -1
  40. package/internal/ws.mjs.map +1 -1
  41. package/lib/index.d.mts +4 -2
  42. package/lib/index.d.mts.map +1 -1
  43. package/lib/index.d.ts +4 -2
  44. package/lib/index.d.ts.map +1 -1
  45. package/lib/index.js +2 -1
  46. package/lib/index.js.map +1 -1
  47. package/lib/index.mjs +1 -1
  48. package/lib/index.mjs.map +1 -1
  49. package/lib/jsonParseFloat.d.mts +5 -5
  50. package/lib/jsonParseFloat.d.mts.map +1 -1
  51. package/lib/jsonParseFloat.d.ts +5 -5
  52. package/lib/jsonParseFloat.d.ts.map +1 -1
  53. package/lib/jsonParseFloat.js +30 -12
  54. package/lib/jsonParseFloat.js.map +1 -1
  55. package/lib/jsonParseFloat.mjs +30 -12
  56. package/lib/jsonParseFloat.mjs.map +1 -1
  57. package/lib/ws.d.mts +102 -15
  58. package/lib/ws.d.mts.map +1 -1
  59. package/lib/ws.d.ts +102 -15
  60. package/lib/ws.d.ts.map +1 -1
  61. package/lib/ws.js +208 -34
  62. package/lib/ws.js.map +1 -1
  63. package/lib/ws.mjs +204 -33
  64. package/lib/ws.mjs.map +1 -1
  65. package/package.json +1 -1
  66. package/resources/index.d.mts +3 -2
  67. package/resources/index.d.mts.map +1 -1
  68. package/resources/index.d.ts +3 -2
  69. package/resources/index.d.ts.map +1 -1
  70. package/resources/index.js +3 -1
  71. package/resources/index.js.map +1 -1
  72. package/resources/index.mjs +3 -2
  73. package/resources/index.mjs.map +1 -1
  74. package/resources/ws-info/index.d.mts +6 -0
  75. package/resources/ws-info/index.d.mts.map +1 -0
  76. package/resources/ws-info/index.d.ts +6 -0
  77. package/resources/ws-info/index.d.ts.map +1 -0
  78. package/resources/ws-info/index.js +6 -0
  79. package/resources/ws-info/index.js.map +1 -0
  80. package/resources/ws-info/index.mjs +2 -0
  81. package/resources/ws-info/index.mjs.map +1 -0
  82. package/resources/ws-info/internal-base.d.mts +63 -0
  83. package/resources/ws-info/internal-base.d.mts.map +1 -0
  84. package/resources/ws-info/internal-base.d.ts +63 -0
  85. package/resources/ws-info/internal-base.d.ts.map +1 -0
  86. package/resources/ws-info/internal-base.js +47 -0
  87. package/resources/ws-info/internal-base.js.map +1 -0
  88. package/resources/ws-info/internal-base.mjs +41 -0
  89. package/resources/ws-info/internal-base.mjs.map +1 -0
  90. package/resources/ws-info/ws-info.d.mts +1180 -0
  91. package/resources/ws-info/ws-info.d.mts.map +1 -0
  92. package/resources/ws-info/ws-info.d.ts +1180 -0
  93. package/resources/ws-info/ws-info.d.ts.map +1 -0
  94. package/resources/ws-info/ws-info.js +8 -0
  95. package/resources/ws-info/ws-info.js.map +1 -0
  96. package/resources/ws-info/ws-info.mjs +4 -0
  97. package/resources/ws-info/ws-info.mjs.map +1 -0
  98. package/resources/ws-info/ws.d.mts +91 -0
  99. package/resources/ws-info/ws.d.mts.map +1 -0
  100. package/resources/ws-info/ws.d.ts +91 -0
  101. package/resources/ws-info/ws.d.ts.map +1 -0
  102. package/resources/ws-info/ws.js +463 -0
  103. package/resources/ws-info/ws.js.map +1 -0
  104. package/resources/ws-info/ws.mjs +458 -0
  105. package/resources/ws-info/ws.mjs.map +1 -0
  106. package/resources/ws-info.d.mts +2 -0
  107. package/resources/ws-info.d.mts.map +1 -0
  108. package/resources/ws-info.d.ts +2 -0
  109. package/resources/ws-info.d.ts.map +1 -0
  110. package/resources/ws-info.js +5 -0
  111. package/resources/ws-info.js.map +1 -0
  112. package/resources/ws-info.mjs +2 -0
  113. package/resources/ws-info.mjs.map +1 -0
  114. package/resources/ws-private/index.d.mts +3 -1
  115. package/resources/ws-private/index.d.mts.map +1 -1
  116. package/resources/ws-private/index.d.ts +3 -1
  117. package/resources/ws-private/index.d.ts.map +1 -1
  118. package/resources/ws-private/index.js.map +1 -1
  119. package/resources/ws-private/index.mjs +1 -1
  120. package/resources/ws-private/index.mjs.map +1 -1
  121. package/resources/ws-private/internal-base.d.mts.map +1 -1
  122. package/resources/ws-private/internal-base.d.ts.map +1 -1
  123. package/resources/ws-private/internal-base.js.map +1 -1
  124. package/resources/ws-private/internal-base.mjs.map +1 -1
  125. package/resources/ws-private/ws-private.d.mts +301 -9
  126. package/resources/ws-private/ws-private.d.mts.map +1 -1
  127. package/resources/ws-private/ws-private.d.ts +301 -9
  128. package/resources/ws-private/ws-private.d.ts.map +1 -1
  129. package/resources/ws-private/ws-private.js.map +1 -1
  130. package/resources/ws-private/ws-private.mjs.map +1 -1
  131. package/resources/ws-private/ws.d.mts +2 -2
  132. package/resources/ws-private/ws.d.mts.map +1 -1
  133. package/resources/ws-private/ws.d.ts +2 -2
  134. package/resources/ws-private/ws.d.ts.map +1 -1
  135. package/resources/ws-private/ws.js +15 -20
  136. package/resources/ws-private/ws.js.map +1 -1
  137. package/resources/ws-private/ws.mjs +15 -20
  138. package/resources/ws-private/ws.mjs.map +1 -1
  139. package/resources/ws-public/index.d.mts +3 -1
  140. package/resources/ws-public/index.d.mts.map +1 -1
  141. package/resources/ws-public/index.d.ts +3 -1
  142. package/resources/ws-public/index.d.ts.map +1 -1
  143. package/resources/ws-public/index.js.map +1 -1
  144. package/resources/ws-public/index.mjs +1 -1
  145. package/resources/ws-public/index.mjs.map +1 -1
  146. package/resources/ws-public/internal-base.d.mts.map +1 -1
  147. package/resources/ws-public/internal-base.d.ts.map +1 -1
  148. package/resources/ws-public/internal-base.js.map +1 -1
  149. package/resources/ws-public/internal-base.mjs.map +1 -1
  150. package/resources/ws-public/ws-public.d.mts +355 -5
  151. package/resources/ws-public/ws-public.d.mts.map +1 -1
  152. package/resources/ws-public/ws-public.d.ts +355 -5
  153. package/resources/ws-public/ws-public.d.ts.map +1 -1
  154. package/resources/ws-public/ws.d.mts +2 -2
  155. package/resources/ws-public/ws.d.mts.map +1 -1
  156. package/resources/ws-public/ws.d.ts +2 -2
  157. package/resources/ws-public/ws.d.ts.map +1 -1
  158. package/resources/ws-public/ws.js +15 -20
  159. package/resources/ws-public/ws.js.map +1 -1
  160. package/resources/ws-public/ws.mjs +15 -20
  161. package/resources/ws-public/ws.mjs.map +1 -1
  162. package/src/client.ts +92 -5
  163. package/src/index.ts +24 -1
  164. package/src/internal/ws-parser.ts +164 -0
  165. package/src/internal/ws-simple-types.ts +34 -0
  166. package/src/internal/ws.ts +1 -0
  167. package/src/lib/index.ts +17 -2
  168. package/src/lib/jsonParseFloat.ts +37 -12
  169. package/src/lib/ws.ts +367 -55
  170. package/src/resources/index.ts +42 -2
  171. package/src/resources/ws-info/index.ts +44 -0
  172. package/src/resources/ws-info/internal-base.ts +96 -0
  173. package/src/resources/ws-info/ws-info.ts +1855 -0
  174. package/src/resources/ws-info/ws.ts +574 -0
  175. package/src/resources/ws-info.ts +1 -0
  176. package/src/resources/ws-private/index.ts +12 -1
  177. package/src/resources/ws-private/internal-base.ts +0 -1
  178. package/src/resources/ws-private/ws-private.ts +420 -18
  179. package/src/resources/ws-private/ws.ts +16 -23
  180. package/src/resources/ws-public/index.ts +16 -1
  181. package/src/resources/ws-public/internal-base.ts +0 -1
  182. package/src/resources/ws-public/ws-public.ts +459 -4
  183. package/src/resources/ws-public/ws.ts +16 -23
  184. package/src/version.ts +1 -1
  185. package/version.d.mts +1 -1
  186. package/version.d.ts +1 -1
  187. package/version.js +1 -1
  188. package/version.js.map +1 -1
  189. package/version.mjs +1 -1
  190. package/version.mjs.map +1 -1
@@ -0,0 +1,463 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WsInfoWS = void 0;
4
+ const tslib_1 = require("../../internal/tslib.js");
5
+ const internal_base_1 = require("./internal-base.js");
6
+ const EventEmitter_1 = require("../../core/EventEmitter.js");
7
+ const sleep_1 = require("../../internal/utils/sleep.js");
8
+ const WS = tslib_1.__importStar(require("ws"));
9
+ const ws_1 = require("../../internal/ws.js");
10
+ const error_1 = require("../../core/error.js");
11
+ const jwtAuth_1 = require("../../lib/jwtAuth.js");
12
+ const ws_parser_1 = require("../../internal/ws-parser.js");
13
+ class WsInfoWS extends internal_base_1.WsInfoEmitter {
14
+ constructor(client, parameters, options) {
15
+ super();
16
+ this._sendQueue = [];
17
+ this._isReconnecting = false;
18
+ this._intentionallyClosed = false;
19
+ this._closeCode = 1000;
20
+ this._closeReason = 'OK';
21
+ this._lastCloseCode = 1006;
22
+ this._lastCloseReason = '';
23
+ // Necessary to keep the public event interface clean while we manage reconnecting
24
+ this._internalEvents = new EventEmitter_1.InternalEventEmitter();
25
+ if (!WS?.WebSocket) {
26
+ throw new Error('WsInfoWS requires the "ws" package but it could not be loaded');
27
+ }
28
+ this._client = client;
29
+ this._parameters = parameters;
30
+ const { reconnect, ...wsOptions } = options ?? {};
31
+ this._wsOptions = wsOptions;
32
+ this._reconnectOptions = reconnect ?? null;
33
+ this.url = (0, internal_base_1.buildURL)(client, parameters);
34
+ this.socket = this._connect();
35
+ }
36
+ send(event) {
37
+ if (!this.socket) {
38
+ throw new error_1.UpbitError('Internal error: failed to initialize socket. Please report this issue.');
39
+ }
40
+ if (this._isReconnecting || this.socket.readyState === WS.WebSocket.CONNECTING) {
41
+ this._sendQueue.push(JSON.stringify(event));
42
+ return;
43
+ }
44
+ if (this.socket.readyState !== WS.WebSocket.OPEN) {
45
+ this._onError(null, 'cannot send on a closed WebSocket', undefined);
46
+ return;
47
+ }
48
+ try {
49
+ this.socket.send(JSON.stringify(event));
50
+ }
51
+ catch (err) {
52
+ this._onError(null, 'could not send data', err);
53
+ }
54
+ }
55
+ close(props) {
56
+ if (!this.socket) {
57
+ throw new error_1.UpbitError('Internal error: failed to initialize socket. Please report this issue.');
58
+ }
59
+ this._intentionallyClosed = true;
60
+ this._closeCode = props?.code ?? 1000;
61
+ this._closeReason = props?.reason ?? 'OK';
62
+ try {
63
+ this.socket.close(this._closeCode, this._closeReason);
64
+ }
65
+ catch (err) {
66
+ this._onError(null, 'could not close the connection', err);
67
+ }
68
+ }
69
+ /**
70
+ * Returns an async iterator over WebSocket lifecycle and message events,
71
+ * providing an alternative to the event-based `.on()` API.
72
+ * The iterator will exit if the socket closes but exiting the iterator
73
+ * does not close the socket.
74
+ *
75
+ * @example
76
+ * ```ts
77
+ * for await (const event of client.stream()) {
78
+ * switch (event.type) {
79
+ * case 'message':
80
+ * console.log('received:', event.message);
81
+ * break;
82
+ * case 'error':
83
+ * console.error(event.error);
84
+ * break;
85
+ * case 'close':
86
+ * console.log('connection closed');
87
+ * break;
88
+ * }
89
+ * }
90
+ * ```
91
+ */
92
+ stream() {
93
+ return this[Symbol.asyncIterator]();
94
+ }
95
+ [Symbol.asyncIterator]() {
96
+ if (!this.socket) {
97
+ throw new error_1.UpbitError('Internal error: failed to initialize socket. Please report this issue.');
98
+ }
99
+ // Two-queue async iterator: `queue` buffers incoming messages,
100
+ // `resolvers` buffers waiting next() calls. A push wakes the
101
+ // oldest next(); a next() drains the oldest message.
102
+ const queue = [];
103
+ const resolvers = [];
104
+ let done = false;
105
+ let currentSocket = this.socket;
106
+ const push = (msg) => {
107
+ queue.push(msg);
108
+ resolvers.shift()?.();
109
+ };
110
+ const onEvent = (event) => {
111
+ push({ type: 'message', message: event });
112
+ };
113
+ // Connection and transport errors funnel through _onError → 'error' event
114
+ const onEmitterError = (err) => {
115
+ push({ type: 'error', error: err });
116
+ };
117
+ const onOpen = () => {
118
+ push({ type: 'open' });
119
+ };
120
+ const onReconnecting = (evt) => {
121
+ push({ type: 'reconnecting', reconnect: evt });
122
+ };
123
+ const onReconnected = () => {
124
+ push({ type: 'reconnected' });
125
+ };
126
+ const flushResolvers = () => {
127
+ for (let resolver = resolvers.shift(); resolver; resolver = resolvers.shift()) {
128
+ resolver();
129
+ }
130
+ };
131
+ const onClose = (code, reason) => {
132
+ push({ type: 'close', code, reason });
133
+ done = true;
134
+ flushResolvers();
135
+ cleanup();
136
+ };
137
+ const onSocketSwap = (oldSocket, newSocket) => {
138
+ oldSocket.off('open', onOpen);
139
+ newSocket.on('open', onOpen);
140
+ currentSocket = newSocket;
141
+ };
142
+ const cleanup = () => {
143
+ this.off('event', onEvent);
144
+ this.off('error', onEmitterError);
145
+ currentSocket.off('open', onOpen);
146
+ this._internalEvents.off('close', onClose);
147
+ this._internalEvents.off('socketSwap', onSocketSwap);
148
+ this._internalEvents.off('reconnecting', onReconnecting);
149
+ this._internalEvents.off('reconnected', onReconnected);
150
+ };
151
+ this.on('event', onEvent);
152
+ this.on('error', onEmitterError);
153
+ this.socket.on('open', onOpen);
154
+ this._internalEvents.on('close', onClose);
155
+ this._internalEvents.on('socketSwap', onSocketSwap);
156
+ this._internalEvents.on('reconnecting', onReconnecting);
157
+ this._internalEvents.on('reconnected', onReconnected);
158
+ if (this._isReconnecting) {
159
+ // A reconnect is already in flight. The socket may be CLOSED but the
160
+ // instance is still alive. Emit 'reconnecting' so the iterator stays
161
+ // open and receives the upcoming reconnected/message events.
162
+ push({
163
+ type: 'reconnecting',
164
+ reconnect: { attempt: 0, maxAttempts: 0, delay: 0, closeCode: 0, parameters: undefined },
165
+ });
166
+ }
167
+ else {
168
+ switch (this.socket.readyState) {
169
+ case WS.WebSocket.CONNECTING:
170
+ push({ type: 'connecting' });
171
+ break;
172
+ case WS.WebSocket.OPEN:
173
+ push({ type: 'open' });
174
+ break;
175
+ case WS.WebSocket.CLOSING:
176
+ push({ type: 'closing' });
177
+ break;
178
+ case WS.WebSocket.CLOSED:
179
+ push({
180
+ type: 'close',
181
+ code: this._lastCloseCode,
182
+ reason: this._lastCloseReason,
183
+ });
184
+ done = true;
185
+ cleanup();
186
+ break;
187
+ }
188
+ }
189
+ const resolve = (res) => {
190
+ if (queue.length > 0) {
191
+ res({ value: queue.shift(), done: false });
192
+ }
193
+ else if (done) {
194
+ res({ value: undefined, done: true });
195
+ }
196
+ else {
197
+ return false;
198
+ }
199
+ return true;
200
+ };
201
+ const next = () => new Promise((res) => {
202
+ if (resolve(res))
203
+ return;
204
+ resolvers.push(() => {
205
+ resolve(res);
206
+ });
207
+ });
208
+ return {
209
+ next,
210
+ return: () => {
211
+ done = true;
212
+ cleanup();
213
+ flushResolvers();
214
+ return Promise.resolve({ value: undefined, done: true });
215
+ },
216
+ [Symbol.asyncIterator]() {
217
+ return this;
218
+ },
219
+ };
220
+ }
221
+ _connect() {
222
+ this.url = (0, internal_base_1.buildURL)(this._client, this._parameters ?? {});
223
+ const socket = new WS.WebSocket(this.url, {
224
+ ...this._wsOptions,
225
+ headers: this._client._buildWebSocketHandshakeHeaders(this._authHeaders(), this._wsOptions?.headers),
226
+ });
227
+ let pingTimer;
228
+ socket.on('open', () => {
229
+ pingTimer = setInterval(() => {
230
+ if (socket.readyState === WS.WebSocket.OPEN)
231
+ socket.ping();
232
+ }, 30000);
233
+ });
234
+ socket.on('close', () => {
235
+ if (pingTimer !== undefined)
236
+ clearInterval(pingTimer);
237
+ });
238
+ socket.on('message', (data, _isBinary) => {
239
+ let event;
240
+ try {
241
+ event = (0, ws_parser_1.parseWebSocketValue)(data);
242
+ }
243
+ catch {
244
+ this._onError(null, 'could not parse WebSocket message', new SyntaxError('Invalid WebSocket JSON'));
245
+ return;
246
+ }
247
+ this._emit('event', event);
248
+ if ((0, ws_parser_1.isRecord)(event) && (event['type'] === 'indicator' || event['type'] === 'indicator_signal')) {
249
+ // @ts-ignore The discriminator is checked at runtime.
250
+ this._emit(event['type'], event);
251
+ }
252
+ });
253
+ socket.on('error', (err) => {
254
+ // Suppress transient errors during reconnection — the retry loop
255
+ // already handles them and will surface a close if retries exhaust.
256
+ if (this._isReconnecting)
257
+ return;
258
+ this._onError(null, err.message, err);
259
+ });
260
+ socket.on('open', () => {
261
+ this._flushSendQueue();
262
+ });
263
+ socket.on('close', (code, reason) => {
264
+ // Ignore close events from superseded sockets — a stale socket's
265
+ // late close must not kick off a second reconnect loop.
266
+ if (socket !== this.socket)
267
+ return;
268
+ if (!this._intentionallyClosed && this._canReconnect(code)) {
269
+ this._reconnect(code);
270
+ }
271
+ else if (!this._isReconnecting) {
272
+ this._emitPermanentClose(code, reason.toString());
273
+ }
274
+ });
275
+ return socket;
276
+ }
277
+ // Reconnect is opt-in via onReconnecting so callers can pass
278
+ // state (e.g. session IDs) into the new connection.
279
+ _canReconnect(code) {
280
+ if (this._intentionallyClosed)
281
+ return false;
282
+ if (!this._reconnectOptions)
283
+ return false;
284
+ if (this._reconnectOptions.maxRetries === 0)
285
+ return false;
286
+ if (!this._reconnectOptions.onReconnecting)
287
+ return false;
288
+ return (0, ws_1.isRecoverableClose)(code);
289
+ }
290
+ async _reconnect(closeCode) {
291
+ if (!this.socket) {
292
+ throw new error_1.UpbitError('Internal error: failed to initialize socket. Please report this issue.');
293
+ }
294
+ if (this._isReconnecting || !this._reconnectOptions)
295
+ return;
296
+ this._isReconnecting = true;
297
+ const maxRetries = this._reconnectOptions.maxRetries ?? 5;
298
+ const initialDelay = this._reconnectOptions.initialDelay ?? 500;
299
+ const maxDelay = this._reconnectOptions.maxDelay ?? 8000;
300
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
301
+ if (!this._canReconnect(closeCode)) {
302
+ this._isReconnecting = false;
303
+ if (!this._intentionallyClosed) {
304
+ this._onError(null, `WebSocket reconnect aborted: non-recoverable close code ${closeCode}`, undefined);
305
+ }
306
+ this._emitPermanentClose(this._intentionallyClosed ? this._closeCode : closeCode, this._intentionallyClosed ? this._closeReason : 'reconnect aborted');
307
+ return;
308
+ }
309
+ const baseDelay = Math.min(initialDelay * Math.pow(2, attempt - 1), maxDelay);
310
+ // Jitter: rand [0.75, 1.0] to spread out connection attempts without over-delaying
311
+ const jitter = 0.75 + Math.random() * 0.25;
312
+ const actualDelay = Math.round(baseDelay * jitter);
313
+ let reconnectingEvent = {
314
+ attempt,
315
+ maxAttempts: maxRetries,
316
+ delay: actualDelay,
317
+ closeCode,
318
+ parameters: this._parameters ? { ...this._parameters } : undefined,
319
+ };
320
+ let overrides;
321
+ try {
322
+ overrides = this._reconnectOptions.onReconnecting(reconnectingEvent);
323
+ }
324
+ catch (err) {
325
+ this._isReconnecting = false;
326
+ this._onError(null, 'onReconnecting callback threw', err);
327
+ this._emitPermanentClose(closeCode, 'onReconnecting callback threw');
328
+ return;
329
+ }
330
+ if (overrides && 'abort' in overrides && overrides.abort) {
331
+ this._isReconnecting = false;
332
+ this._emitPermanentClose(closeCode, 'reconnect aborted by handler');
333
+ return;
334
+ }
335
+ if (overrides && 'parameters' in overrides) {
336
+ this._parameters = overrides.parameters;
337
+ reconnectingEvent = { ...reconnectingEvent, parameters: this._parameters };
338
+ }
339
+ try {
340
+ this._emit('reconnecting', reconnectingEvent);
341
+ }
342
+ catch (err) {
343
+ this._onError(null, 'onReconnecting callback threw', err);
344
+ }
345
+ this._internalEvents._emit('reconnecting', reconnectingEvent);
346
+ if (!this._canReconnect(closeCode)) {
347
+ this._isReconnecting = false;
348
+ if (!this._intentionallyClosed) {
349
+ this._onError(null, `WebSocket reconnect aborted: non-recoverable close code ${closeCode}`, undefined);
350
+ }
351
+ this._emitPermanentClose(this._intentionallyClosed ? this._closeCode : closeCode, this._intentionallyClosed ? this._closeReason : 'reconnect aborted');
352
+ return;
353
+ }
354
+ await (0, sleep_1.sleep)(actualDelay);
355
+ if (!this._canReconnect(closeCode)) {
356
+ this._isReconnecting = false;
357
+ if (!this._intentionallyClosed) {
358
+ this._onError(null, `WebSocket reconnect aborted: non-recoverable close code ${closeCode}`, undefined);
359
+ }
360
+ this._emitPermanentClose(this._intentionallyClosed ? this._closeCode : closeCode, this._intentionallyClosed ? this._closeReason : 'reconnect aborted');
361
+ return;
362
+ }
363
+ let closeCodePromise;
364
+ try {
365
+ const oldSocket = this.socket;
366
+ this.socket = this._connect();
367
+ // Registered synchronously after _connect() and before any
368
+ // await so the code is captured even when ws emits 'close'
369
+ // in the same tick as 'error' (e.g. abortHandshake).
370
+ closeCodePromise = new Promise((resolve) => {
371
+ this.socket.once('close', resolve);
372
+ });
373
+ await this._awaitOpen(this.socket);
374
+ this._internalEvents._emit('socketSwap', oldSocket, this.socket);
375
+ this._isReconnecting = false;
376
+ this._flushSendQueue();
377
+ this._emit('reconnected');
378
+ this._internalEvents._emit('reconnected');
379
+ return;
380
+ }
381
+ catch {
382
+ if (closeCodePromise) {
383
+ // ws may emit 'error' before 'close', so await the code
384
+ // rather than reading it synchronously.
385
+ closeCode = await closeCodePromise;
386
+ }
387
+ }
388
+ }
389
+ // All retries exhausted — surface an error so consumers can
390
+ // distinguish retry failure from a clean close.
391
+ this._isReconnecting = false;
392
+ this._onError(null, `WebSocket reconnect failed after ${maxRetries} attempts (close code: ${closeCode})`, undefined);
393
+ this._emitPermanentClose(closeCode, `reconnect failed after ${maxRetries} attempts`);
394
+ }
395
+ /**
396
+ * Resolves once the socket is open, rejects if it errors or closes first
397
+ */
398
+ _awaitOpen(socket) {
399
+ return new Promise((resolve, reject) => {
400
+ const cleanup = () => {
401
+ socket.off('open', onOpen);
402
+ socket.off('error', onError);
403
+ socket.off('close', onFail);
404
+ };
405
+ const onOpen = () => {
406
+ cleanup();
407
+ resolve();
408
+ };
409
+ const onError = (err) => {
410
+ cleanup();
411
+ reject(err);
412
+ };
413
+ const onFail = () => {
414
+ cleanup();
415
+ reject(new Error('socket closed before open'));
416
+ };
417
+ socket.once('open', onOpen);
418
+ socket.once('error', onError);
419
+ socket.once('close', onFail);
420
+ });
421
+ }
422
+ _flushSendQueue() {
423
+ if (!this.socket) {
424
+ throw new error_1.UpbitError('Internal error: failed to initialize socket. Please report this issue.');
425
+ }
426
+ const pending = this._sendQueue.splice(0);
427
+ for (let i = 0; i < pending.length; i++) {
428
+ try {
429
+ if (this.socket.readyState !== WS.WebSocket.OPEN) {
430
+ // Avoid dropping messages by sending them out over a closing socket
431
+ this._sendQueue.unshift(...pending.slice(i));
432
+ return;
433
+ }
434
+ else {
435
+ this.socket.send(pending[i]);
436
+ }
437
+ }
438
+ catch (err) {
439
+ // Re-queue remaining for next open/reconnect
440
+ this._sendQueue.unshift(...pending.slice(i));
441
+ this._onError(null, 'could not send queued data', err);
442
+ return;
443
+ }
444
+ }
445
+ }
446
+ /** Close the iterator even when a public close listener throws. */
447
+ _emitPermanentClose(code, reason) {
448
+ this._lastCloseCode = code;
449
+ this._lastCloseReason = reason;
450
+ this._sendQueue = [];
451
+ this._internalEvents._emit('close', code, reason);
452
+ this._emit('close', code, reason);
453
+ }
454
+ _authHeaders() {
455
+ const { accessKey, secretKey } = this._client;
456
+ if (!accessKey || !secretKey) {
457
+ throw new error_1.UpbitError('Info WebSocket requires accessKey and secretKey');
458
+ }
459
+ return { Authorization: `Bearer ${(0, jwtAuth_1.createJwtToken)(accessKey, secretKey)}` };
460
+ }
461
+ }
462
+ exports.WsInfoWS = WsInfoWS;
463
+ //# sourceMappingURL=ws.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws.js","sourceRoot":"","sources":["../../src/resources/ws-info/ws.ts"],"names":[],"mappings":"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"}