@lifi/perps-sdk 0.0.0-preview-34f3bb2 → 0.0.0-preview-2d69491

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 (71) hide show
  1. package/dist/cjs/registry/assetRegistry.d.ts +1 -1
  2. package/dist/cjs/registry/assetRegistry.d.ts.map +1 -1
  3. package/dist/cjs/registry/assetRegistry.js +2 -2
  4. package/dist/cjs/registry/assetRegistry.js.map +1 -1
  5. package/dist/cjs/registry/marketRegistry.d.ts +1 -1
  6. package/dist/cjs/registry/marketRegistry.d.ts.map +1 -1
  7. package/dist/cjs/registry/marketRegistry.js +2 -2
  8. package/dist/cjs/registry/marketRegistry.js.map +1 -1
  9. package/dist/cjs/registry/referenceDataRegistry.d.ts +1 -3
  10. package/dist/cjs/registry/referenceDataRegistry.d.ts.map +1 -1
  11. package/dist/cjs/registry/referenceDataRegistry.js +3 -14
  12. package/dist/cjs/registry/referenceDataRegistry.js.map +1 -1
  13. package/dist/cjs/services/getMarket.d.ts.map +1 -1
  14. package/dist/cjs/services/getMarket.js +9 -1
  15. package/dist/cjs/services/getMarket.js.map +1 -1
  16. package/dist/cjs/version.d.ts +1 -1
  17. package/dist/cjs/version.js +1 -1
  18. package/dist/cjs/websocket/ReconnectingWebSocket.d.ts.map +1 -1
  19. package/dist/cjs/websocket/ReconnectingWebSocket.js +4 -0
  20. package/dist/cjs/websocket/ReconnectingWebSocket.js.map +1 -1
  21. package/dist/cjs/websocket/WsProviderBase.d.ts.map +1 -1
  22. package/dist/cjs/websocket/WsProviderBase.js +9 -1
  23. package/dist/cjs/websocket/WsProviderBase.js.map +1 -1
  24. package/dist/esm/registry/assetRegistry.d.ts +1 -1
  25. package/dist/esm/registry/assetRegistry.d.ts.map +1 -1
  26. package/dist/esm/registry/assetRegistry.js +2 -2
  27. package/dist/esm/registry/assetRegistry.js.map +1 -1
  28. package/dist/esm/registry/marketRegistry.d.ts +1 -1
  29. package/dist/esm/registry/marketRegistry.d.ts.map +1 -1
  30. package/dist/esm/registry/marketRegistry.js +2 -2
  31. package/dist/esm/registry/marketRegistry.js.map +1 -1
  32. package/dist/esm/registry/referenceDataRegistry.d.ts +5 -11
  33. package/dist/esm/registry/referenceDataRegistry.d.ts.map +1 -1
  34. package/dist/esm/registry/referenceDataRegistry.js +6 -23
  35. package/dist/esm/registry/referenceDataRegistry.js.map +1 -1
  36. package/dist/esm/services/getMarket.d.ts +4 -3
  37. package/dist/esm/services/getMarket.d.ts.map +1 -1
  38. package/dist/esm/services/getMarket.js +13 -4
  39. package/dist/esm/services/getMarket.js.map +1 -1
  40. package/dist/esm/version.d.ts +1 -1
  41. package/dist/esm/version.js +1 -1
  42. package/dist/esm/websocket/ReconnectingWebSocket.d.ts +7 -4
  43. package/dist/esm/websocket/ReconnectingWebSocket.d.ts.map +1 -1
  44. package/dist/esm/websocket/ReconnectingWebSocket.js +11 -4
  45. package/dist/esm/websocket/ReconnectingWebSocket.js.map +1 -1
  46. package/dist/esm/websocket/WsProviderBase.d.ts.map +1 -1
  47. package/dist/esm/websocket/WsProviderBase.js +14 -1
  48. package/dist/esm/websocket/WsProviderBase.js.map +1 -1
  49. package/dist/esm/websocket/types.d.ts +3 -3
  50. package/dist/types/registry/assetRegistry.d.ts +1 -1
  51. package/dist/types/registry/assetRegistry.d.ts.map +1 -1
  52. package/dist/types/registry/marketRegistry.d.ts +1 -1
  53. package/dist/types/registry/marketRegistry.d.ts.map +1 -1
  54. package/dist/types/registry/referenceDataRegistry.d.ts +5 -11
  55. package/dist/types/registry/referenceDataRegistry.d.ts.map +1 -1
  56. package/dist/types/services/getMarket.d.ts +4 -3
  57. package/dist/types/services/getMarket.d.ts.map +1 -1
  58. package/dist/types/version.d.ts +1 -1
  59. package/dist/types/websocket/ReconnectingWebSocket.d.ts +7 -4
  60. package/dist/types/websocket/ReconnectingWebSocket.d.ts.map +1 -1
  61. package/dist/types/websocket/WsProviderBase.d.ts.map +1 -1
  62. package/dist/types/websocket/types.d.ts +3 -3
  63. package/package.json +2 -2
  64. package/src/registry/assetRegistry.ts +4 -6
  65. package/src/registry/marketRegistry.ts +4 -6
  66. package/src/registry/referenceDataRegistry.ts +8 -32
  67. package/src/services/getMarket.ts +16 -4
  68. package/src/version.ts +1 -1
  69. package/src/websocket/ReconnectingWebSocket.ts +11 -4
  70. package/src/websocket/WsProviderBase.ts +14 -1
  71. package/src/websocket/types.ts +3 -3
@@ -1,4 +1,6 @@
1
1
  import type { Market, MarketsResponse } from '@lifi/perps-types'
2
+ import { PerpsErrorCode } from '@lifi/perps-types'
3
+ import { PerpsError } from '../errors/PerpsError.js'
2
4
  import { buildUrl, request } from '../transport/request.js'
3
5
  import type { SDKRequestOptions } from '../types/config.js'
4
6
  import type { PerpsSDKClient } from '../types/provider.js'
@@ -21,10 +23,11 @@ export interface GetMarketParams {
21
23
  /**
22
24
  * Get a specific market by its opaque marketId. Requests the single market
23
25
  * from the backend `/markets` route (filtered by `marketIds`) and returns the
24
- * first match; the backend responds 404 (thrown as a {@link PerpsError}) when
25
- * nothing matches.
26
+ * first match; throws a `MarketNotFound` {@link PerpsError} both when the
27
+ * backend responds 404 and when it responds 200 with an empty list, matching
28
+ * `MarketRegistry.require`'s miss behaviour.
26
29
  *
27
- * @throws {PerpsError} On backend (e.g. 404), network, or parsing errors.
30
+ * @throws {PerpsError} On backend (e.g. 404 or empty match), network, or parsing errors.
28
31
  * @example
29
32
  * ```ts
30
33
  * const client = createPerpsClient({ integrator: 'my-app' })
@@ -48,5 +51,14 @@ export async function getMarket(
48
51
  {},
49
52
  options
50
53
  )
51
- return markets[0]
54
+ const market = markets[0]
55
+ if (market === undefined) {
56
+ const error = new PerpsError(
57
+ PerpsErrorCode.MarketNotFound,
58
+ `No ${params.provider} market found for marketId '${params.marketId}'`
59
+ )
60
+ error.tool = params.provider
61
+ throw error
62
+ }
63
+ return market
52
64
  }
package/src/version.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  export const name = '@lifi/perps-sdk'
2
- export const version = '0.0.0-preview-34f3bb2'
2
+ export const version = '0.0.0-preview-2d69491'
@@ -238,16 +238,21 @@ export class ReconnectingWebSocket {
238
238
 
239
239
  /**
240
240
  * Send `data`, buffering it (bounded) for replay when the socket is not yet
241
- * open.
241
+ * open. Throws once {@link ReconnectingWebSocket.close} has been called —
242
+ * there is no socket left to buffer against.
242
243
  *
243
244
  * @public
244
245
  */
245
246
  send(data: string) {
247
+ if (this.closed) {
248
+ throw new Error(CLOSED_ERROR)
249
+ }
246
250
  this.socket.send(data)
247
251
  }
248
252
 
249
253
  /**
250
- * Permanently close the socket and suppress further reconnection.
254
+ * Permanently close the socket, suppress further reconnection, and set
255
+ * status to terminal `disconnected`.
251
256
  *
252
257
  * @public
253
258
  */
@@ -256,6 +261,7 @@ export class ReconnectingWebSocket {
256
261
  this.stopPing()
257
262
  this.clearWatchdog()
258
263
  this.socket.close()
264
+ this.setStatus('disconnected')
259
265
  for (const { reject } of this.readyResolvers) {
260
266
  reject(new Error(CLOSED_ERROR))
261
267
  }
@@ -300,8 +306,9 @@ export class ReconnectingWebSocket {
300
306
 
301
307
  /**
302
308
  * Current connection health. `reconnecting` until the first open;
303
- * `disconnected` once auto-reconnect is abandoned (terminal until
304
- * {@link ReconnectingWebSocket.reconnect} is called).
309
+ * `disconnected` once auto-reconnect is abandoned or {@link
310
+ * ReconnectingWebSocket.close} is called (terminal until {@link
311
+ * ReconnectingWebSocket.reconnect} is called).
305
312
  *
306
313
  * @public
307
314
  */
@@ -94,7 +94,12 @@ export abstract class WsProviderBase<TSub = unknown> implements WsProvider {
94
94
  onStatus(this.rws.getStatus())
95
95
  }
96
96
 
97
+ let released = false
97
98
  return () => {
99
+ if (released) {
100
+ return
101
+ }
102
+ released = true
98
103
  if (onStatus) {
99
104
  const remaining = (this.statusListeners.get(onStatus) ?? 0) - 1
100
105
  if (remaining > 0) {
@@ -188,7 +193,15 @@ export abstract class WsProviderBase<TSub = unknown> implements WsProvider {
188
193
  }
189
194
 
190
195
  private async replaySubs(): Promise<void> {
191
- for (const [key, state] of this.wireSubs) {
196
+ // Snapshot at replay start, and re-check the live registry before each
197
+ // send. An async sendSubscribe (e.g. Lighter's auth-token fetch) suspends
198
+ // the loop; status is already 'connected' while open listeners run, so a
199
+ // subscribe landing mid-replay is sent inline by registerSub — it must not
200
+ // be revisited here, and an entry unregistered mid-replay must be skipped.
201
+ for (const [key, state] of [...this.wireSubs]) {
202
+ if (this.wireSubs.get(key) !== state) {
203
+ continue
204
+ }
192
205
  // Isolate each resubscribe: a send can reject (e.g. an auth-token fetch
193
206
  // after reconnect), and one sub's failure must not abort the rest of
194
207
  // the loop or escape as an unhandled rejection.
@@ -28,9 +28,9 @@ export type SubscriptionListener = (event: SubscriptionEvent) => void
28
28
  * - `connected` — socket open, live data flowing.
29
29
  * - `reconnecting` — socket dropped; auto-reconnect with backoff in progress.
30
30
  * Data may be stale until it returns to `connected`.
31
- * - `disconnected` — reconnection abandoned after the retry cap. The
32
- * connection is permanently dead and will not recover on its own; the
33
- * subscription's data is stale. Terminal.
31
+ * - `disconnected` — reconnection abandoned after the retry cap, or the
32
+ * connection was explicitly closed. The connection is permanently dead and
33
+ * will not recover on its own; the subscription's data is stale. Terminal.
34
34
  *
35
35
  * @public
36
36
  */