@lifi/perps-sdk 12.1.0 → 14.0.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 (130) hide show
  1. package/README.md +7 -5
  2. package/dist/cjs/client/PerpsClient.d.ts +8 -3
  3. package/dist/cjs/client/PerpsClient.d.ts.map +1 -1
  4. package/dist/cjs/client/PerpsClient.js +15 -0
  5. package/dist/cjs/client/PerpsClient.js.map +1 -1
  6. package/dist/cjs/index.d.ts +6 -5
  7. package/dist/cjs/index.d.ts.map +1 -1
  8. package/dist/cjs/index.js +10 -3
  9. package/dist/cjs/index.js.map +1 -1
  10. package/dist/cjs/registry/assetRegistry.d.ts +2 -0
  11. package/dist/cjs/registry/assetRegistry.d.ts.map +1 -1
  12. package/dist/cjs/registry/assetRegistry.js +18 -1
  13. package/dist/cjs/registry/assetRegistry.js.map +1 -1
  14. package/dist/cjs/registry/referenceDataRegistry.d.ts +5 -2
  15. package/dist/cjs/registry/referenceDataRegistry.d.ts.map +1 -1
  16. package/dist/cjs/registry/referenceDataRegistry.js +37 -7
  17. package/dist/cjs/registry/referenceDataRegistry.js.map +1 -1
  18. package/dist/cjs/services/getOrders.d.ts +2 -1
  19. package/dist/cjs/services/getOrders.d.ts.map +1 -1
  20. package/dist/cjs/services/getOrders.js +2 -0
  21. package/dist/cjs/services/getOrders.js.map +1 -1
  22. package/dist/cjs/transport/fetchWithRetry.d.ts.map +1 -1
  23. package/dist/cjs/transport/fetchWithRetry.js.map +1 -1
  24. package/dist/cjs/types/api.d.ts +6 -1
  25. package/dist/cjs/types/api.d.ts.map +1 -1
  26. package/dist/cjs/types/provider.d.ts +7 -6
  27. package/dist/cjs/types/provider.d.ts.map +1 -1
  28. package/dist/cjs/utils/orderClassification.d.ts +9 -5
  29. package/dist/cjs/utils/orderClassification.d.ts.map +1 -1
  30. package/dist/cjs/utils/orderClassification.js +19 -0
  31. package/dist/cjs/utils/orderClassification.js.map +1 -1
  32. package/dist/cjs/utils/orderMath.d.ts +2 -2
  33. package/dist/cjs/utils/orderMath.d.ts.map +1 -1
  34. package/dist/cjs/utils/orderMath.js +15 -4
  35. package/dist/cjs/utils/orderMath.js.map +1 -1
  36. package/dist/cjs/utils/warnOnce.d.ts +2 -0
  37. package/dist/cjs/utils/warnOnce.d.ts.map +1 -0
  38. package/dist/cjs/utils/warnOnce.js +22 -0
  39. package/dist/cjs/utils/warnOnce.js.map +1 -0
  40. package/dist/cjs/version.d.ts +1 -1
  41. package/dist/cjs/version.js +1 -1
  42. package/dist/cjs/websocket/PerpsWsClient.d.ts +7 -2
  43. package/dist/cjs/websocket/PerpsWsClient.d.ts.map +1 -1
  44. package/dist/cjs/websocket/PerpsWsClient.js +3 -0
  45. package/dist/cjs/websocket/PerpsWsClient.js.map +1 -1
  46. package/dist/esm/client/PerpsClient.d.ts +18 -3
  47. package/dist/esm/client/PerpsClient.d.ts.map +1 -1
  48. package/dist/esm/client/PerpsClient.js +25 -0
  49. package/dist/esm/client/PerpsClient.js.map +1 -1
  50. package/dist/esm/index.d.ts +6 -5
  51. package/dist/esm/index.d.ts.map +1 -1
  52. package/dist/esm/index.js +3 -2
  53. package/dist/esm/index.js.map +1 -1
  54. package/dist/esm/registry/assetRegistry.d.ts +5 -8
  55. package/dist/esm/registry/assetRegistry.d.ts.map +1 -1
  56. package/dist/esm/registry/assetRegistry.js +21 -9
  57. package/dist/esm/registry/assetRegistry.js.map +1 -1
  58. package/dist/esm/registry/referenceDataRegistry.d.ts +6 -14
  59. package/dist/esm/registry/referenceDataRegistry.d.ts.map +1 -1
  60. package/dist/esm/registry/referenceDataRegistry.js +38 -19
  61. package/dist/esm/registry/referenceDataRegistry.js.map +1 -1
  62. package/dist/esm/services/getOrders.d.ts +3 -17
  63. package/dist/esm/services/getOrders.d.ts.map +1 -1
  64. package/dist/esm/services/getOrders.js +3 -16
  65. package/dist/esm/services/getOrders.js.map +1 -1
  66. package/dist/esm/transport/fetchWithRetry.d.ts +3 -2
  67. package/dist/esm/transport/fetchWithRetry.d.ts.map +1 -1
  68. package/dist/esm/transport/fetchWithRetry.js +3 -2
  69. package/dist/esm/transport/fetchWithRetry.js.map +1 -1
  70. package/dist/esm/types/api.d.ts +13 -3
  71. package/dist/esm/types/api.d.ts.map +1 -1
  72. package/dist/esm/types/provider.d.ts +16 -16
  73. package/dist/esm/types/provider.d.ts.map +1 -1
  74. package/dist/esm/utils/orderClassification.d.ts +14 -19
  75. package/dist/esm/utils/orderClassification.d.ts.map +1 -1
  76. package/dist/esm/utils/orderClassification.js +21 -15
  77. package/dist/esm/utils/orderClassification.js.map +1 -1
  78. package/dist/esm/utils/orderMath.d.ts +3 -13
  79. package/dist/esm/utils/orderMath.d.ts.map +1 -1
  80. package/dist/esm/utils/orderMath.js +17 -16
  81. package/dist/esm/utils/orderMath.js.map +1 -1
  82. package/dist/esm/utils/warnOnce.d.ts +9 -0
  83. package/dist/esm/utils/warnOnce.d.ts.map +1 -0
  84. package/dist/esm/utils/warnOnce.js +29 -0
  85. package/dist/esm/utils/warnOnce.js.map +1 -0
  86. package/dist/esm/version.d.ts +1 -1
  87. package/dist/esm/version.js +1 -1
  88. package/dist/esm/websocket/PerpsWsClient.d.ts +25 -6
  89. package/dist/esm/websocket/PerpsWsClient.d.ts.map +1 -1
  90. package/dist/esm/websocket/PerpsWsClient.js +13 -2
  91. package/dist/esm/websocket/PerpsWsClient.js.map +1 -1
  92. package/dist/types/client/PerpsClient.d.ts +18 -3
  93. package/dist/types/client/PerpsClient.d.ts.map +1 -1
  94. package/dist/types/index.d.ts +6 -5
  95. package/dist/types/index.d.ts.map +1 -1
  96. package/dist/types/registry/assetRegistry.d.ts +5 -8
  97. package/dist/types/registry/assetRegistry.d.ts.map +1 -1
  98. package/dist/types/registry/referenceDataRegistry.d.ts +6 -14
  99. package/dist/types/registry/referenceDataRegistry.d.ts.map +1 -1
  100. package/dist/types/services/getOrders.d.ts +3 -17
  101. package/dist/types/services/getOrders.d.ts.map +1 -1
  102. package/dist/types/transport/fetchWithRetry.d.ts +3 -2
  103. package/dist/types/transport/fetchWithRetry.d.ts.map +1 -1
  104. package/dist/types/types/api.d.ts +13 -3
  105. package/dist/types/types/api.d.ts.map +1 -1
  106. package/dist/types/types/provider.d.ts +16 -16
  107. package/dist/types/types/provider.d.ts.map +1 -1
  108. package/dist/types/utils/orderClassification.d.ts +14 -19
  109. package/dist/types/utils/orderClassification.d.ts.map +1 -1
  110. package/dist/types/utils/orderMath.d.ts +3 -13
  111. package/dist/types/utils/orderMath.d.ts.map +1 -1
  112. package/dist/types/utils/warnOnce.d.ts +9 -0
  113. package/dist/types/utils/warnOnce.d.ts.map +1 -0
  114. package/dist/types/version.d.ts +1 -1
  115. package/dist/types/websocket/PerpsWsClient.d.ts +25 -6
  116. package/dist/types/websocket/PerpsWsClient.d.ts.map +1 -1
  117. package/package.json +2 -2
  118. package/src/client/PerpsClient.ts +58 -1
  119. package/src/index.ts +9 -2
  120. package/src/registry/assetRegistry.ts +29 -9
  121. package/src/registry/referenceDataRegistry.ts +46 -19
  122. package/src/services/getOrders.ts +5 -17
  123. package/src/transport/fetchWithRetry.ts +3 -2
  124. package/src/types/api.ts +14 -2
  125. package/src/types/provider.ts +23 -21
  126. package/src/utils/orderClassification.ts +37 -19
  127. package/src/utils/orderMath.ts +25 -17
  128. package/src/utils/warnOnce.ts +29 -0
  129. package/src/version.ts +1 -1
  130. package/src/websocket/PerpsWsClient.ts +29 -6
@@ -1,10 +1,12 @@
1
1
  import {
2
- type OpenOrder,
3
2
  OrderSide,
3
+ OrderStatus,
4
4
  type Position,
5
5
  PositionSide,
6
+ type RegularOrder,
6
7
  type TriggerOrder,
7
8
  } from '@lifi/perps-types'
9
+ import { isActiveOrderStatus } from './orderClassification.js'
8
10
  import { realizedPnlOnClose } from './positionMath.js'
9
11
 
10
12
  /**
@@ -55,10 +57,10 @@ export function resolveCloseSize(
55
57
  * @public
56
58
  */
57
59
  export function expectedRealizedPnlForOpenOrder(
58
- order: OpenOrder,
60
+ order: RegularOrder,
59
61
  position: Position | undefined
60
62
  ): number | null {
61
- if (!position) {
63
+ if (!position || !isActiveOrderStatus(order.status)) {
62
64
  return null
63
65
  }
64
66
 
@@ -70,7 +72,7 @@ export function expectedRealizedPnlForOpenOrder(
70
72
  return null
71
73
  }
72
74
 
73
- const limitPrice = Number.parseFloat(order.price)
75
+ const limitPrice = Number.parseFloat(order.price ?? '')
74
76
  const entryPrice = Number.parseFloat(position.entryPrice)
75
77
  const orderSize = Math.abs(Number.parseFloat(order.remainingSize))
76
78
  const positionSize = Math.abs(Number.parseFloat(position.size))
@@ -100,29 +102,29 @@ export function expectedRealizedPnlForOpenOrder(
100
102
  })
101
103
  }
102
104
 
103
- /**
104
- * Expected rPnL for a TP/SL trigger order against a matching position.
105
- *
106
- * A trigger order is by construction a closing leg — its direction is the
107
- * opposite of the position's. With no matching position there is nothing to
108
- * close, so rPnL is `null`. The trigger price (always present on the SDK
109
- * `TriggerOrder` shape) is used as the rPnL price; the optional `limitPrice`
110
- * for STOP_LIMIT / TAKE_PROFIT_LIMIT is the post-trigger limit, not the rPnL
111
- * price.
112
- * @public
113
- */
105
+ /** Project the unfilled closing quantity of an active trigger at its trigger price. */
114
106
  export function expectedRealizedPnlForTriggerOrder(
115
107
  order: TriggerOrder,
116
108
  position: Position | undefined
117
109
  ): number | null {
118
- if (!position) {
110
+ if (
111
+ !position ||
112
+ !isActiveOrderStatus(order.status) ||
113
+ order.status === OrderStatus.PENDING
114
+ ) {
119
115
  return null
120
116
  }
121
117
 
122
118
  const isLong = position.side === PositionSide.LONG
119
+ if (
120
+ (isLong && order.side !== OrderSide.SELL) ||
121
+ (!isLong && order.side !== OrderSide.BUY)
122
+ ) {
123
+ return null
124
+ }
123
125
  const triggerPrice = Number.parseFloat(order.triggerPrice)
124
126
  const entryPrice = Number.parseFloat(position.entryPrice)
125
- const orderSize = Math.abs(Number.parseFloat(order.size))
127
+ const orderSize = Math.abs(Number.parseFloat(order.remainingSize))
126
128
  const positionSize = Math.abs(Number.parseFloat(position.size))
127
129
  if (
128
130
  !Number.isFinite(triggerPrice) ||
@@ -133,6 +135,12 @@ export function expectedRealizedPnlForTriggerOrder(
133
135
  ) {
134
136
  return null
135
137
  }
138
+ if (
139
+ orderSize === 0 &&
140
+ (Number.parseFloat(order.originalSize) !== 0 || !order.reduceOnly)
141
+ ) {
142
+ return null
143
+ }
136
144
 
137
145
  const closeSize = resolveCloseSize(orderSize, positionSize)
138
146
  return realizedPnlOnClose({
@@ -0,0 +1,29 @@
1
+ /**
2
+ * The number of keys one warner remembers. Venue wire data supplies the keys,
3
+ * so the memory must not grow for as long as the process runs.
4
+ */
5
+ const KEY_MEMORY_LIMIT = 256
6
+
7
+ /**
8
+ * Build a warner that writes each distinct key once. The warner forgets the
9
+ * oldest key when its memory is full, so a key it saw long ago can warn a
10
+ * second time.
11
+ *
12
+ * @internal
13
+ */
14
+ export const createWarnOnce = (): ((key: string, message: string) => void) => {
15
+ const seen = new Set<string>()
16
+ return (key, message) => {
17
+ if (seen.has(key)) {
18
+ return
19
+ }
20
+ if (seen.size >= KEY_MEMORY_LIMIT) {
21
+ const oldest = seen.values().next().value
22
+ if (oldest !== undefined) {
23
+ seen.delete(oldest)
24
+ }
25
+ }
26
+ seen.add(key)
27
+ console.warn(message)
28
+ }
29
+ }
package/src/version.ts CHANGED
@@ -10,4 +10,4 @@ export const name = '@lifi/perps-sdk'
10
10
  *
11
11
  * @public
12
12
  */
13
- export const version = '12.1.0'
13
+ export const version = '14.0.0'
@@ -12,12 +12,11 @@ import type {
12
12
  } from './types.js'
13
13
 
14
14
  /**
15
- * Factory for a per-provider WS plugin. Invoked once per provider key the
16
- * first time `subscribe(...)` is called against it.
15
+ * Call parameters of a {@link WsProviderFactory}.
17
16
  *
18
17
  * @public
19
18
  */
20
- export type WsProviderFactory = (params: {
19
+ export interface WsProviderFactoryParams {
21
20
  provider: string
22
21
  /** WS URL discovered from `/providers`. */
23
22
  wsUrl: string
@@ -34,7 +33,19 @@ export type WsProviderFactory = (params: {
34
33
  * duplicating backend orchestration in the WS layer.
35
34
  */
36
35
  client: PerpsSDKClient
37
- }) => WsProvider
36
+ }
37
+
38
+ /**
39
+ * Factory for a per-provider WS plugin. Invoked once per provider key the
40
+ * first time `subscribe(...)` is called against it.
41
+ *
42
+ * @public
43
+ */
44
+ export interface WsProviderFactory {
45
+ (params: WsProviderFactoryParams): WsProvider
46
+ /** `true` when the venue socket serves the `candle` channel. */
47
+ readonly streamsCandles: boolean
48
+ }
38
49
 
39
50
  /**
40
51
  * Options for {@link PerpsWsClient}.
@@ -54,7 +65,7 @@ export interface PerpsWsClientOptions {
54
65
  }
55
66
 
56
67
  /**
57
- * Realtime client: lazily instantiates a per-provider {@link WsProvider} on
68
+ * WebSocket client: lazily instantiates a per-provider {@link WsProvider} on
58
69
  * first subscription and fans subscriptions out to it.
59
70
  *
60
71
  * @public
@@ -72,7 +83,19 @@ export class PerpsWsClient {
72
83
  }
73
84
 
74
85
  /**
75
- * Subscribe to a realtime channel, lazily creating the provider's WS
86
+ * Whether `provider`'s socket serves the `candle` channel, as reported by
87
+ * its registered factory. Returns `false` when no factory is registered.
88
+ * Synchronous: it reads the factory without instantiating the provider and
89
+ * makes no network call, so a caller can branch before the first subscribe.
90
+ *
91
+ * @public
92
+ */
93
+ streamsCandles(provider: string): boolean {
94
+ return this.options.wsProviders?.[provider]?.streamsCandles ?? false
95
+ }
96
+
97
+ /**
98
+ * Subscribe to a WebSocket channel, lazily creating the provider's WS
76
99
  * connection. Returns an unsubscribe function.
77
100
  *
78
101
  * @param onStatus - Optional listener for the underlying connection's