@dimes-dot-fi/sdk 1.3.0 → 1.4.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 (49) hide show
  1. package/dist/{aliases-DzVxkXtK.d.cts → aliases-C-B9O2AE.d.cts} +107 -2
  2. package/dist/{aliases-DzVxkXtK.d.ts → aliases-C-B9O2AE.d.ts} +107 -2
  3. package/dist/{chunk-YUCGNELT.mjs → chunk-4MO3HKMS.mjs} +7 -1
  4. package/dist/chunk-4MO3HKMS.mjs.map +1 -0
  5. package/dist/{chunk-S65RABUT.mjs → chunk-BVILILIV.mjs} +13 -1
  6. package/dist/chunk-BVILILIV.mjs.map +1 -0
  7. package/dist/{chunk-JWAPH4GD.cjs → chunk-COSLZ5TM.cjs} +36 -11
  8. package/dist/chunk-COSLZ5TM.cjs.map +1 -0
  9. package/dist/{chunk-UUE4HG2H.cjs → chunk-DYPABUKC.cjs} +13 -1
  10. package/dist/chunk-DYPABUKC.cjs.map +1 -0
  11. package/dist/{chunk-EI5V5Z6G.mjs → chunk-SGA6OZEU.mjs} +33 -8
  12. package/dist/chunk-SGA6OZEU.mjs.map +1 -0
  13. package/dist/{chunk-ZK56XS4X.cjs → chunk-UHQZSMUD.cjs} +8 -2
  14. package/dist/chunk-UHQZSMUD.cjs.map +1 -0
  15. package/dist/contract/index.cjs +13 -13
  16. package/dist/contract/index.d.cts +3 -3
  17. package/dist/contract/index.d.ts +3 -3
  18. package/dist/contract/index.mjs +1 -1
  19. package/dist/{dimes-client-D88pW-Lm.d.ts → dimes-client-B0w_Ppd9.d.cts} +13 -3
  20. package/dist/{dimes-client-Bs6eTIvn.d.cts → dimes-client-uKVU4nq_.d.ts} +13 -3
  21. package/dist/{dimes-error-DxIoHQzj.d.cts → dimes-error-C7MRTq2N.d.cts} +1 -1
  22. package/dist/{dimes-error-BHVY6vDv.d.ts → dimes-error-y7fP6jqH.d.ts} +1 -1
  23. package/dist/index.cjs +12 -7
  24. package/dist/index.cjs.map +1 -1
  25. package/dist/index.d.cts +7 -7
  26. package/dist/index.d.ts +7 -7
  27. package/dist/index.mjs +8 -3
  28. package/dist/index.mjs.map +1 -1
  29. package/dist/{quote-CZqCqt8R.d.cts → quote-JAvWCzWa.d.cts} +2 -2
  30. package/dist/{quote-Cy7ie8yT.d.ts → quote-skfPSk-e.d.ts} +2 -2
  31. package/dist/react/index.cjs +4 -4
  32. package/dist/react/index.d.cts +3 -3
  33. package/dist/react/index.d.ts +3 -3
  34. package/dist/react/index.mjs +2 -2
  35. package/dist/{types--ysRe5Os.d.cts → types-BSBGUKeJ.d.ts} +20 -2
  36. package/dist/{types-BcUKsoEs.d.ts → types-opXc4MmU.d.cts} +20 -2
  37. package/dist/ws/index.cjs +115 -5
  38. package/dist/ws/index.cjs.map +1 -1
  39. package/dist/ws/index.d.cts +36 -9
  40. package/dist/ws/index.d.ts +36 -9
  41. package/dist/ws/index.mjs +112 -2
  42. package/dist/ws/index.mjs.map +1 -1
  43. package/package.json +1 -1
  44. package/dist/chunk-EI5V5Z6G.mjs.map +0 -1
  45. package/dist/chunk-JWAPH4GD.cjs.map +0 -1
  46. package/dist/chunk-S65RABUT.mjs.map +0 -1
  47. package/dist/chunk-UUE4HG2H.cjs.map +0 -1
  48. package/dist/chunk-YUCGNELT.mjs.map +0 -1
  49. package/dist/chunk-ZK56XS4X.cjs.map +0 -1
package/dist/ws/index.cjs CHANGED
@@ -1,12 +1,13 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class; var _class2;
2
2
 
3
3
 
4
- var _chunkZK56XS4Xcjs = require('../chunk-ZK56XS4X.cjs');
4
+
5
+ var _chunkUHQZSMUDcjs = require('../chunk-UHQZSMUD.cjs');
5
6
 
6
7
  // src/ws/position-socket.ts
7
8
  var _humps = require('humps');
8
9
  var _socketioclient = require('socket.io-client');
9
- var wsNamespace = "/v1/ws/prediction-markets/customer-positions";
10
+ var wsNamespace = "/v1/ws/prediction-markets/user-positions";
10
11
  function camelizeEnvelope(envelope) {
11
12
  return {
12
13
  id: envelope.id,
@@ -63,7 +64,7 @@ var PositionSocket = (_class = class {
63
64
  cb(err);
64
65
  }
65
66
  });
66
- for (const eventType of _chunkZK56XS4Xcjs.positionEventTypes) {
67
+ for (const eventType of _chunkUHQZSMUDcjs.positionEventTypes) {
67
68
  this.socket.on(eventType, (envelope) => {
68
69
  const event = camelizeEnvelope(envelope);
69
70
  this.emit(eventType, event);
@@ -126,8 +127,117 @@ var PositionSocket = (_class = class {
126
127
  }
127
128
  }, _class);
128
129
 
130
+ // src/ws/market-socket.ts
131
+
132
+
133
+ var wsNamespace2 = "/v1/ws/prediction-markets/user-markets";
134
+ function camelizeEnvelope2(envelope) {
135
+ return {
136
+ id: envelope.id,
137
+ type: envelope.type,
138
+ createdAt: envelope.created_at,
139
+ data: envelope.data.map((item) => _humps.camelizeKeys.call(void 0, item))
140
+ };
141
+ }
142
+ var MarketSocket = (_class2 = class {
143
+ __init7() {this.socket = null}
144
+
145
+
146
+ __init8() {this.eventListeners = /* @__PURE__ */ new Map()}
147
+ __init9() {this.connectListeners = /* @__PURE__ */ new Set()}
148
+ __init10() {this.disconnectListeners = /* @__PURE__ */ new Set()}
149
+ __init11() {this.errorListeners = /* @__PURE__ */ new Set()}
150
+ constructor(options) {;_class2.prototype.__init7.call(this);_class2.prototype.__init8.call(this);_class2.prototype.__init9.call(this);_class2.prototype.__init10.call(this);_class2.prototype.__init11.call(this);
151
+ this.baseUrl = _nullishCoalesce(options.baseUrl, () => ( "https://api.dimes.fi"));
152
+ this.getToken = options.getToken;
153
+ }
154
+ get connected() {
155
+ return _nullishCoalesce(_optionalChain([this, 'access', _11 => _11.socket, 'optionalAccess', _12 => _12.connected]), () => ( false));
156
+ }
157
+ connect() {
158
+ if (_optionalChain([this, 'access', _13 => _13.socket, 'optionalAccess', _14 => _14.connected])) {
159
+ return;
160
+ }
161
+ _optionalChain([this, 'access', _15 => _15.socket, 'optionalAccess', _16 => _16.disconnect, 'call', _17 => _17()]);
162
+ const token = this.getToken();
163
+ if (!token) {
164
+ return;
165
+ }
166
+ const getToken = this.getToken;
167
+ this.socket = _socketioclient.io.call(void 0, `${this.baseUrl}${wsNamespace2}`, {
168
+ auth: (cb) => cb({ token: getToken() }),
169
+ transports: ["websocket"],
170
+ reconnection: true,
171
+ reconnectionDelay: 1e3,
172
+ reconnectionDelayMax: 3e4
173
+ });
174
+ this.socket.on("connect", () => {
175
+ for (const cb of this.connectListeners) {
176
+ cb();
177
+ }
178
+ });
179
+ this.socket.on("disconnect", () => {
180
+ for (const cb of this.disconnectListeners) {
181
+ cb();
182
+ }
183
+ });
184
+ this.socket.on("error", (err) => {
185
+ for (const cb of this.errorListeners) {
186
+ cb(err);
187
+ }
188
+ });
189
+ for (const eventType of _chunkUHQZSMUDcjs.marketEventTypes) {
190
+ this.socket.on(eventType, (envelope) => {
191
+ const event = camelizeEnvelope2(envelope);
192
+ this.emit(eventType, event);
193
+ this.emit("*", event);
194
+ });
195
+ }
196
+ }
197
+ disconnect() {
198
+ _optionalChain([this, 'access', _18 => _18.socket, 'optionalAccess', _19 => _19.disconnect, 'call', _20 => _20()]);
199
+ this.socket = null;
200
+ }
201
+ reconnectWithToken() {
202
+ this.disconnect();
203
+ this.connect();
204
+ }
205
+ on(event, cb) {
206
+ let set = this.eventListeners.get(event);
207
+ if (!set) {
208
+ set = /* @__PURE__ */ new Set();
209
+ this.eventListeners.set(event, set);
210
+ }
211
+ set.add(cb);
212
+ return () => set.delete(cb);
213
+ }
214
+ onConnect(cb) {
215
+ this.connectListeners.add(cb);
216
+ return () => this.connectListeners.delete(cb);
217
+ }
218
+ onDisconnect(cb) {
219
+ this.disconnectListeners.add(cb);
220
+ return () => this.disconnectListeners.delete(cb);
221
+ }
222
+ onError(cb) {
223
+ this.errorListeners.add(cb);
224
+ return () => this.errorListeners.delete(cb);
225
+ }
226
+ emit(event, data) {
227
+ const set = this.eventListeners.get(event);
228
+ if (!set) {
229
+ return;
230
+ }
231
+ for (const cb of set) {
232
+ cb(data);
233
+ }
234
+ }
235
+ }, _class2);
236
+
237
+
238
+
129
239
 
130
240
 
131
241
 
132
- exports.PositionSocket = PositionSocket; exports.notificationCodes = _chunkZK56XS4Xcjs.notificationCodes; exports.positionEventTypes = _chunkZK56XS4Xcjs.positionEventTypes;
242
+ exports.MarketSocket = MarketSocket; exports.PositionSocket = PositionSocket; exports.marketEventTypes = _chunkUHQZSMUDcjs.marketEventTypes; exports.notificationCodes = _chunkUHQZSMUDcjs.notificationCodes; exports.positionEventTypes = _chunkUHQZSMUDcjs.positionEventTypes;
133
243
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/alexemery/bl/dimes-sdk/dist/ws/index.cjs","../../src/ws/position-socket.ts"],"names":[],"mappings":"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","file":"/Users/alexemery/bl/dimes-sdk/dist/ws/index.cjs","sourcesContent":[null,"import { camelizeKeys } from \"humps\";\nimport { io, type Socket } from \"socket.io-client\";\nimport type { Position } from \"../types\";\nimport {\n positionEventTypes,\n type NotificationEvent,\n type NotificationEventEnvelope,\n type PositionEvent,\n type PositionEventEnvelope,\n type PositionEventType,\n} from \"./types\";\n\nexport interface PositionSocketOptions {\n baseUrl?: string;\n getToken: () => string | null;\n}\n\ntype EventCallback = (event: PositionEvent) => void;\ntype NotificationCallback = (event: NotificationEvent) => void;\ntype ConnectionCallback = () => void;\ntype ErrorCallback = (error: unknown) => void;\n\nconst wsNamespace = \"/v1/ws/prediction-markets/customer-positions\";\n\nfunction camelizeEnvelope(envelope: PositionEventEnvelope): PositionEvent {\n return {\n id: envelope.id,\n type: envelope.type,\n createdAt: envelope.created_at,\n data: camelizeKeys(envelope.data) as unknown as Position,\n };\n}\n\nexport class PositionSocket {\n private socket: Socket | null = null;\n\n private readonly baseUrl: string;\n\n private readonly getToken: () => string | null;\n\n private readonly eventListeners = new Map<string, Set<EventCallback>>();\n\n private readonly connectListeners = new Set<ConnectionCallback>();\n\n private readonly disconnectListeners = new Set<ConnectionCallback>();\n\n private readonly errorListeners = new Set<ErrorCallback>();\n\n private readonly notificationListeners = new Set<NotificationCallback>();\n\n constructor(options: PositionSocketOptions) {\n this.baseUrl = options.baseUrl ?? \"https://api.dimes.fi\";\n this.getToken = options.getToken;\n }\n\n public get connected(): boolean {\n return this.socket?.connected ?? false;\n }\n\n public connect(): void {\n if (this.socket?.connected) {\n return;\n }\n\n this.socket?.disconnect();\n\n const token = this.getToken();\n if (!token) {\n return;\n }\n\n const getToken = this.getToken;\n this.socket = io(`${this.baseUrl}${wsNamespace}`, {\n auth: (cb) => cb({ token: getToken() }),\n transports: [\"websocket\"],\n reconnection: true,\n reconnectionDelay: 1000,\n reconnectionDelayMax: 30000,\n });\n\n this.socket.on(\"connect\", () => {\n for (const cb of this.connectListeners) {\n cb();\n }\n });\n\n this.socket.on(\"disconnect\", () => {\n for (const cb of this.disconnectListeners) {\n cb();\n }\n });\n\n this.socket.on(\"error\", (err: unknown) => {\n for (const cb of this.errorListeners) {\n cb(err);\n }\n });\n\n for (const eventType of positionEventTypes) {\n this.socket.on(eventType, (envelope: PositionEventEnvelope) => {\n const event = camelizeEnvelope(envelope);\n this.emit(eventType, event);\n this.emit(\"*\", event);\n });\n }\n\n this.socket.on(\"notification\", (envelope: NotificationEventEnvelope) => {\n const event: NotificationEvent = {\n id: envelope.id,\n type: \"notification\",\n createdAt: envelope.created_at,\n data: envelope.data,\n };\n for (const cb of this.notificationListeners) {\n cb(event);\n }\n });\n }\n\n public disconnect(): void {\n this.socket?.disconnect();\n this.socket = null;\n }\n\n public reconnectWithToken(): void {\n this.disconnect();\n this.connect();\n }\n\n public on(event: PositionEventType | \"*\", cb: EventCallback): () => void {\n let set = this.eventListeners.get(event);\n if (!set) {\n set = new Set();\n this.eventListeners.set(event, set);\n }\n set.add(cb);\n return () => set.delete(cb);\n }\n\n public onConnect(cb: ConnectionCallback): () => void {\n this.connectListeners.add(cb);\n return () => this.connectListeners.delete(cb);\n }\n\n public onDisconnect(cb: ConnectionCallback): () => void {\n this.disconnectListeners.add(cb);\n return () => this.disconnectListeners.delete(cb);\n }\n\n public onError(cb: ErrorCallback): () => void {\n this.errorListeners.add(cb);\n return () => this.errorListeners.delete(cb);\n }\n\n public onNotification(cb: NotificationCallback): () => void {\n this.notificationListeners.add(cb);\n return () => this.notificationListeners.delete(cb);\n }\n\n private emit(event: string, data: PositionEvent): void {\n const set = this.eventListeners.get(event);\n if (!set) {\n return;\n }\n for (const cb of set) {\n cb(data);\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["/Users/alexemery/bl/dimes-sdk/dist/ws/index.cjs","../../src/ws/position-socket.ts","../../src/ws/market-socket.ts"],"names":["io","camelizeEnvelope"],"mappings":"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","file":"/Users/alexemery/bl/dimes-sdk/dist/ws/index.cjs","sourcesContent":[null,"import { camelizeKeys } from \"humps\";\nimport { io, type Socket } from \"socket.io-client\";\nimport type { Position } from \"../types\";\nimport {\n positionEventTypes,\n type NotificationEvent,\n type NotificationEventEnvelope,\n type PositionEvent,\n type PositionEventEnvelope,\n type PositionEventType,\n} from \"./types\";\n\nexport interface PositionSocketOptions {\n baseUrl?: string;\n getToken: () => string | null;\n}\n\ntype EventCallback = (event: PositionEvent) => void;\ntype NotificationCallback = (event: NotificationEvent) => void;\ntype ConnectionCallback = () => void;\ntype ErrorCallback = (error: unknown) => void;\n\nconst wsNamespace = \"/v1/ws/prediction-markets/user-positions\";\n\nfunction camelizeEnvelope(envelope: PositionEventEnvelope): PositionEvent {\n return {\n id: envelope.id,\n type: envelope.type,\n createdAt: envelope.created_at,\n data: camelizeKeys(envelope.data) as unknown as Position,\n };\n}\n\nexport class PositionSocket {\n private socket: Socket | null = null;\n\n private readonly baseUrl: string;\n\n private readonly getToken: () => string | null;\n\n private readonly eventListeners = new Map<string, Set<EventCallback>>();\n\n private readonly connectListeners = new Set<ConnectionCallback>();\n\n private readonly disconnectListeners = new Set<ConnectionCallback>();\n\n private readonly errorListeners = new Set<ErrorCallback>();\n\n private readonly notificationListeners = new Set<NotificationCallback>();\n\n constructor(options: PositionSocketOptions) {\n this.baseUrl = options.baseUrl ?? \"https://api.dimes.fi\";\n this.getToken = options.getToken;\n }\n\n public get connected(): boolean {\n return this.socket?.connected ?? false;\n }\n\n public connect(): void {\n if (this.socket?.connected) {\n return;\n }\n\n this.socket?.disconnect();\n\n const token = this.getToken();\n if (!token) {\n return;\n }\n\n const getToken = this.getToken;\n this.socket = io(`${this.baseUrl}${wsNamespace}`, {\n auth: (cb) => cb({ token: getToken() }),\n transports: [\"websocket\"],\n reconnection: true,\n reconnectionDelay: 1000,\n reconnectionDelayMax: 30000,\n });\n\n this.socket.on(\"connect\", () => {\n for (const cb of this.connectListeners) {\n cb();\n }\n });\n\n this.socket.on(\"disconnect\", () => {\n for (const cb of this.disconnectListeners) {\n cb();\n }\n });\n\n this.socket.on(\"error\", (err: unknown) => {\n for (const cb of this.errorListeners) {\n cb(err);\n }\n });\n\n for (const eventType of positionEventTypes) {\n this.socket.on(eventType, (envelope: PositionEventEnvelope) => {\n const event = camelizeEnvelope(envelope);\n this.emit(eventType, event);\n this.emit(\"*\", event);\n });\n }\n\n this.socket.on(\"notification\", (envelope: NotificationEventEnvelope) => {\n const event: NotificationEvent = {\n id: envelope.id,\n type: \"notification\",\n createdAt: envelope.created_at,\n data: envelope.data,\n };\n for (const cb of this.notificationListeners) {\n cb(event);\n }\n });\n }\n\n public disconnect(): void {\n this.socket?.disconnect();\n this.socket = null;\n }\n\n public reconnectWithToken(): void {\n this.disconnect();\n this.connect();\n }\n\n public on(event: PositionEventType | \"*\", cb: EventCallback): () => void {\n let set = this.eventListeners.get(event);\n if (!set) {\n set = new Set();\n this.eventListeners.set(event, set);\n }\n set.add(cb);\n return () => set.delete(cb);\n }\n\n public onConnect(cb: ConnectionCallback): () => void {\n this.connectListeners.add(cb);\n return () => this.connectListeners.delete(cb);\n }\n\n public onDisconnect(cb: ConnectionCallback): () => void {\n this.disconnectListeners.add(cb);\n return () => this.disconnectListeners.delete(cb);\n }\n\n public onError(cb: ErrorCallback): () => void {\n this.errorListeners.add(cb);\n return () => this.errorListeners.delete(cb);\n }\n\n public onNotification(cb: NotificationCallback): () => void {\n this.notificationListeners.add(cb);\n return () => this.notificationListeners.delete(cb);\n }\n\n private emit(event: string, data: PositionEvent): void {\n const set = this.eventListeners.get(event);\n if (!set) {\n return;\n }\n for (const cb of set) {\n cb(data);\n }\n }\n}\n","import { camelizeKeys } from \"humps\";\nimport { io, type Socket } from \"socket.io-client\";\nimport type { Market } from \"../types\";\nimport {\n marketEventTypes,\n type MarketDelta,\n type MarketEvent,\n type MarketEventEnvelope,\n type MarketEventType,\n} from \"./types\";\n\nexport interface MarketSocketOptions {\n baseUrl?: string;\n getToken: () => string | null;\n}\n\ntype EventCallback = (event: MarketEvent) => void;\ntype ConnectionCallback = () => void;\ntype ErrorCallback = (error: unknown) => void;\n\nconst wsNamespace = \"/v1/ws/prediction-markets/user-markets\";\n\nfunction camelizeEnvelope(envelope: MarketEventEnvelope): MarketEvent {\n return {\n id: envelope.id,\n type: envelope.type,\n createdAt: envelope.created_at,\n data: envelope.data.map((item) => camelizeKeys(item)) as unknown as Market[] | MarketDelta[],\n };\n}\n\nexport class MarketSocket {\n private socket: Socket | null = null;\n\n private readonly baseUrl: string;\n\n private readonly getToken: () => string | null;\n\n private readonly eventListeners = new Map<string, Set<EventCallback>>();\n\n private readonly connectListeners = new Set<ConnectionCallback>();\n\n private readonly disconnectListeners = new Set<ConnectionCallback>();\n\n private readonly errorListeners = new Set<ErrorCallback>();\n\n constructor(options: MarketSocketOptions) {\n this.baseUrl = options.baseUrl ?? \"https://api.dimes.fi\";\n this.getToken = options.getToken;\n }\n\n public get connected(): boolean {\n return this.socket?.connected ?? false;\n }\n\n public connect(): void {\n if (this.socket?.connected) {\n return;\n }\n\n this.socket?.disconnect();\n\n const token = this.getToken();\n if (!token) {\n return;\n }\n\n const getToken = this.getToken;\n this.socket = io(`${this.baseUrl}${wsNamespace}`, {\n auth: (cb) => cb({ token: getToken() }),\n transports: [\"websocket\"],\n reconnection: true,\n reconnectionDelay: 1000,\n reconnectionDelayMax: 30000,\n });\n\n this.socket.on(\"connect\", () => {\n for (const cb of this.connectListeners) {\n cb();\n }\n });\n\n this.socket.on(\"disconnect\", () => {\n for (const cb of this.disconnectListeners) {\n cb();\n }\n });\n\n this.socket.on(\"error\", (err: unknown) => {\n for (const cb of this.errorListeners) {\n cb(err);\n }\n });\n\n for (const eventType of marketEventTypes) {\n this.socket.on(eventType, (envelope: MarketEventEnvelope) => {\n const event = camelizeEnvelope(envelope);\n this.emit(eventType, event);\n this.emit(\"*\", event);\n });\n }\n }\n\n public disconnect(): void {\n this.socket?.disconnect();\n this.socket = null;\n }\n\n public reconnectWithToken(): void {\n this.disconnect();\n this.connect();\n }\n\n public on(event: MarketEventType | \"*\", cb: EventCallback): () => void {\n let set = this.eventListeners.get(event);\n if (!set) {\n set = new Set();\n this.eventListeners.set(event, set);\n }\n set.add(cb);\n return () => set.delete(cb);\n }\n\n public onConnect(cb: ConnectionCallback): () => void {\n this.connectListeners.add(cb);\n return () => this.connectListeners.delete(cb);\n }\n\n public onDisconnect(cb: ConnectionCallback): () => void {\n this.disconnectListeners.add(cb);\n return () => this.disconnectListeners.delete(cb);\n }\n\n public onError(cb: ErrorCallback): () => void {\n this.errorListeners.add(cb);\n return () => this.errorListeners.delete(cb);\n }\n\n private emit(event: string, data: MarketEvent): void {\n const set = this.eventListeners.get(event);\n if (!set) {\n return;\n }\n for (const cb of set) {\n cb(data);\n }\n }\n}\n"]}
@@ -1,15 +1,15 @@
1
- import { a as PositionEventType, P as PositionEvent, N as NotificationEvent } from '../types--ysRe5Os.cjs';
2
- export { b as NotificationCode, c as NotificationEventEnvelope, d as PositionEventEnvelope, n as notificationCodes, p as positionEventTypes } from '../types--ysRe5Os.cjs';
3
- import '../aliases-DzVxkXtK.cjs';
1
+ import { a as PositionEventType, P as PositionEvent, N as NotificationEvent, M as MarketEventType, b as MarketEvent } from '../types-opXc4MmU.cjs';
2
+ export { c as MarketDelta, d as MarketEventEnvelope, e as NotificationCode, f as NotificationEventEnvelope, g as PositionEventEnvelope, m as marketEventTypes, n as notificationCodes, p as positionEventTypes } from '../types-opXc4MmU.cjs';
3
+ import '../aliases-C-B9O2AE.cjs';
4
4
 
5
5
  interface PositionSocketOptions {
6
6
  baseUrl?: string;
7
7
  getToken: () => string | null;
8
8
  }
9
- type EventCallback = (event: PositionEvent) => void;
9
+ type EventCallback$1 = (event: PositionEvent) => void;
10
10
  type NotificationCallback = (event: NotificationEvent) => void;
11
- type ConnectionCallback = () => void;
12
- type ErrorCallback = (error: unknown) => void;
11
+ type ConnectionCallback$1 = () => void;
12
+ type ErrorCallback$1 = (error: unknown) => void;
13
13
  declare class PositionSocket {
14
14
  private socket;
15
15
  private readonly baseUrl;
@@ -24,12 +24,39 @@ declare class PositionSocket {
24
24
  connect(): void;
25
25
  disconnect(): void;
26
26
  reconnectWithToken(): void;
27
- on(event: PositionEventType | "*", cb: EventCallback): () => void;
27
+ on(event: PositionEventType | "*", cb: EventCallback$1): () => void;
28
+ onConnect(cb: ConnectionCallback$1): () => void;
29
+ onDisconnect(cb: ConnectionCallback$1): () => void;
30
+ onError(cb: ErrorCallback$1): () => void;
31
+ onNotification(cb: NotificationCallback): () => void;
32
+ private emit;
33
+ }
34
+
35
+ interface MarketSocketOptions {
36
+ baseUrl?: string;
37
+ getToken: () => string | null;
38
+ }
39
+ type EventCallback = (event: MarketEvent) => void;
40
+ type ConnectionCallback = () => void;
41
+ type ErrorCallback = (error: unknown) => void;
42
+ declare class MarketSocket {
43
+ private socket;
44
+ private readonly baseUrl;
45
+ private readonly getToken;
46
+ private readonly eventListeners;
47
+ private readonly connectListeners;
48
+ private readonly disconnectListeners;
49
+ private readonly errorListeners;
50
+ constructor(options: MarketSocketOptions);
51
+ get connected(): boolean;
52
+ connect(): void;
53
+ disconnect(): void;
54
+ reconnectWithToken(): void;
55
+ on(event: MarketEventType | "*", cb: EventCallback): () => void;
28
56
  onConnect(cb: ConnectionCallback): () => void;
29
57
  onDisconnect(cb: ConnectionCallback): () => void;
30
58
  onError(cb: ErrorCallback): () => void;
31
- onNotification(cb: NotificationCallback): () => void;
32
59
  private emit;
33
60
  }
34
61
 
35
- export { NotificationEvent, PositionEvent, PositionEventType, PositionSocket, type PositionSocketOptions };
62
+ export { MarketEvent, MarketEventType, MarketSocket, type MarketSocketOptions, NotificationEvent, PositionEvent, PositionEventType, PositionSocket, type PositionSocketOptions };
@@ -1,15 +1,15 @@
1
- import { a as PositionEventType, P as PositionEvent, N as NotificationEvent } from '../types-BcUKsoEs.js';
2
- export { b as NotificationCode, c as NotificationEventEnvelope, d as PositionEventEnvelope, n as notificationCodes, p as positionEventTypes } from '../types-BcUKsoEs.js';
3
- import '../aliases-DzVxkXtK.js';
1
+ import { a as PositionEventType, P as PositionEvent, N as NotificationEvent, M as MarketEventType, b as MarketEvent } from '../types-BSBGUKeJ.js';
2
+ export { c as MarketDelta, d as MarketEventEnvelope, e as NotificationCode, f as NotificationEventEnvelope, g as PositionEventEnvelope, m as marketEventTypes, n as notificationCodes, p as positionEventTypes } from '../types-BSBGUKeJ.js';
3
+ import '../aliases-C-B9O2AE.js';
4
4
 
5
5
  interface PositionSocketOptions {
6
6
  baseUrl?: string;
7
7
  getToken: () => string | null;
8
8
  }
9
- type EventCallback = (event: PositionEvent) => void;
9
+ type EventCallback$1 = (event: PositionEvent) => void;
10
10
  type NotificationCallback = (event: NotificationEvent) => void;
11
- type ConnectionCallback = () => void;
12
- type ErrorCallback = (error: unknown) => void;
11
+ type ConnectionCallback$1 = () => void;
12
+ type ErrorCallback$1 = (error: unknown) => void;
13
13
  declare class PositionSocket {
14
14
  private socket;
15
15
  private readonly baseUrl;
@@ -24,12 +24,39 @@ declare class PositionSocket {
24
24
  connect(): void;
25
25
  disconnect(): void;
26
26
  reconnectWithToken(): void;
27
- on(event: PositionEventType | "*", cb: EventCallback): () => void;
27
+ on(event: PositionEventType | "*", cb: EventCallback$1): () => void;
28
+ onConnect(cb: ConnectionCallback$1): () => void;
29
+ onDisconnect(cb: ConnectionCallback$1): () => void;
30
+ onError(cb: ErrorCallback$1): () => void;
31
+ onNotification(cb: NotificationCallback): () => void;
32
+ private emit;
33
+ }
34
+
35
+ interface MarketSocketOptions {
36
+ baseUrl?: string;
37
+ getToken: () => string | null;
38
+ }
39
+ type EventCallback = (event: MarketEvent) => void;
40
+ type ConnectionCallback = () => void;
41
+ type ErrorCallback = (error: unknown) => void;
42
+ declare class MarketSocket {
43
+ private socket;
44
+ private readonly baseUrl;
45
+ private readonly getToken;
46
+ private readonly eventListeners;
47
+ private readonly connectListeners;
48
+ private readonly disconnectListeners;
49
+ private readonly errorListeners;
50
+ constructor(options: MarketSocketOptions);
51
+ get connected(): boolean;
52
+ connect(): void;
53
+ disconnect(): void;
54
+ reconnectWithToken(): void;
55
+ on(event: MarketEventType | "*", cb: EventCallback): () => void;
28
56
  onConnect(cb: ConnectionCallback): () => void;
29
57
  onDisconnect(cb: ConnectionCallback): () => void;
30
58
  onError(cb: ErrorCallback): () => void;
31
- onNotification(cb: NotificationCallback): () => void;
32
59
  private emit;
33
60
  }
34
61
 
35
- export { NotificationEvent, PositionEvent, PositionEventType, PositionSocket, type PositionSocketOptions };
62
+ export { MarketEvent, MarketEventType, MarketSocket, type MarketSocketOptions, NotificationEvent, PositionEvent, PositionEventType, PositionSocket, type PositionSocketOptions };
package/dist/ws/index.mjs CHANGED
@@ -1,12 +1,13 @@
1
1
  import {
2
+ marketEventTypes,
2
3
  notificationCodes,
3
4
  positionEventTypes
4
- } from "../chunk-YUCGNELT.mjs";
5
+ } from "../chunk-4MO3HKMS.mjs";
5
6
 
6
7
  // src/ws/position-socket.ts
7
8
  import { camelizeKeys } from "humps";
8
9
  import { io } from "socket.io-client";
9
- var wsNamespace = "/v1/ws/prediction-markets/customer-positions";
10
+ var wsNamespace = "/v1/ws/prediction-markets/user-positions";
10
11
  function camelizeEnvelope(envelope) {
11
12
  return {
12
13
  id: envelope.id,
@@ -125,8 +126,117 @@ var PositionSocket = class {
125
126
  }
126
127
  }
127
128
  };
129
+
130
+ // src/ws/market-socket.ts
131
+ import { camelizeKeys as camelizeKeys2 } from "humps";
132
+ import { io as io2 } from "socket.io-client";
133
+ var wsNamespace2 = "/v1/ws/prediction-markets/user-markets";
134
+ function camelizeEnvelope2(envelope) {
135
+ return {
136
+ id: envelope.id,
137
+ type: envelope.type,
138
+ createdAt: envelope.created_at,
139
+ data: envelope.data.map((item) => camelizeKeys2(item))
140
+ };
141
+ }
142
+ var MarketSocket = class {
143
+ socket = null;
144
+ baseUrl;
145
+ getToken;
146
+ eventListeners = /* @__PURE__ */ new Map();
147
+ connectListeners = /* @__PURE__ */ new Set();
148
+ disconnectListeners = /* @__PURE__ */ new Set();
149
+ errorListeners = /* @__PURE__ */ new Set();
150
+ constructor(options) {
151
+ this.baseUrl = options.baseUrl ?? "https://api.dimes.fi";
152
+ this.getToken = options.getToken;
153
+ }
154
+ get connected() {
155
+ return this.socket?.connected ?? false;
156
+ }
157
+ connect() {
158
+ if (this.socket?.connected) {
159
+ return;
160
+ }
161
+ this.socket?.disconnect();
162
+ const token = this.getToken();
163
+ if (!token) {
164
+ return;
165
+ }
166
+ const getToken = this.getToken;
167
+ this.socket = io2(`${this.baseUrl}${wsNamespace2}`, {
168
+ auth: (cb) => cb({ token: getToken() }),
169
+ transports: ["websocket"],
170
+ reconnection: true,
171
+ reconnectionDelay: 1e3,
172
+ reconnectionDelayMax: 3e4
173
+ });
174
+ this.socket.on("connect", () => {
175
+ for (const cb of this.connectListeners) {
176
+ cb();
177
+ }
178
+ });
179
+ this.socket.on("disconnect", () => {
180
+ for (const cb of this.disconnectListeners) {
181
+ cb();
182
+ }
183
+ });
184
+ this.socket.on("error", (err) => {
185
+ for (const cb of this.errorListeners) {
186
+ cb(err);
187
+ }
188
+ });
189
+ for (const eventType of marketEventTypes) {
190
+ this.socket.on(eventType, (envelope) => {
191
+ const event = camelizeEnvelope2(envelope);
192
+ this.emit(eventType, event);
193
+ this.emit("*", event);
194
+ });
195
+ }
196
+ }
197
+ disconnect() {
198
+ this.socket?.disconnect();
199
+ this.socket = null;
200
+ }
201
+ reconnectWithToken() {
202
+ this.disconnect();
203
+ this.connect();
204
+ }
205
+ on(event, cb) {
206
+ let set = this.eventListeners.get(event);
207
+ if (!set) {
208
+ set = /* @__PURE__ */ new Set();
209
+ this.eventListeners.set(event, set);
210
+ }
211
+ set.add(cb);
212
+ return () => set.delete(cb);
213
+ }
214
+ onConnect(cb) {
215
+ this.connectListeners.add(cb);
216
+ return () => this.connectListeners.delete(cb);
217
+ }
218
+ onDisconnect(cb) {
219
+ this.disconnectListeners.add(cb);
220
+ return () => this.disconnectListeners.delete(cb);
221
+ }
222
+ onError(cb) {
223
+ this.errorListeners.add(cb);
224
+ return () => this.errorListeners.delete(cb);
225
+ }
226
+ emit(event, data) {
227
+ const set = this.eventListeners.get(event);
228
+ if (!set) {
229
+ return;
230
+ }
231
+ for (const cb of set) {
232
+ cb(data);
233
+ }
234
+ }
235
+ };
128
236
  export {
237
+ MarketSocket,
129
238
  PositionSocket,
239
+ marketEventTypes,
130
240
  notificationCodes,
131
241
  positionEventTypes
132
242
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ws/position-socket.ts"],"sourcesContent":["import { camelizeKeys } from \"humps\";\nimport { io, type Socket } from \"socket.io-client\";\nimport type { Position } from \"../types\";\nimport {\n positionEventTypes,\n type NotificationEvent,\n type NotificationEventEnvelope,\n type PositionEvent,\n type PositionEventEnvelope,\n type PositionEventType,\n} from \"./types\";\n\nexport interface PositionSocketOptions {\n baseUrl?: string;\n getToken: () => string | null;\n}\n\ntype EventCallback = (event: PositionEvent) => void;\ntype NotificationCallback = (event: NotificationEvent) => void;\ntype ConnectionCallback = () => void;\ntype ErrorCallback = (error: unknown) => void;\n\nconst wsNamespace = \"/v1/ws/prediction-markets/customer-positions\";\n\nfunction camelizeEnvelope(envelope: PositionEventEnvelope): PositionEvent {\n return {\n id: envelope.id,\n type: envelope.type,\n createdAt: envelope.created_at,\n data: camelizeKeys(envelope.data) as unknown as Position,\n };\n}\n\nexport class PositionSocket {\n private socket: Socket | null = null;\n\n private readonly baseUrl: string;\n\n private readonly getToken: () => string | null;\n\n private readonly eventListeners = new Map<string, Set<EventCallback>>();\n\n private readonly connectListeners = new Set<ConnectionCallback>();\n\n private readonly disconnectListeners = new Set<ConnectionCallback>();\n\n private readonly errorListeners = new Set<ErrorCallback>();\n\n private readonly notificationListeners = new Set<NotificationCallback>();\n\n constructor(options: PositionSocketOptions) {\n this.baseUrl = options.baseUrl ?? \"https://api.dimes.fi\";\n this.getToken = options.getToken;\n }\n\n public get connected(): boolean {\n return this.socket?.connected ?? false;\n }\n\n public connect(): void {\n if (this.socket?.connected) {\n return;\n }\n\n this.socket?.disconnect();\n\n const token = this.getToken();\n if (!token) {\n return;\n }\n\n const getToken = this.getToken;\n this.socket = io(`${this.baseUrl}${wsNamespace}`, {\n auth: (cb) => cb({ token: getToken() }),\n transports: [\"websocket\"],\n reconnection: true,\n reconnectionDelay: 1000,\n reconnectionDelayMax: 30000,\n });\n\n this.socket.on(\"connect\", () => {\n for (const cb of this.connectListeners) {\n cb();\n }\n });\n\n this.socket.on(\"disconnect\", () => {\n for (const cb of this.disconnectListeners) {\n cb();\n }\n });\n\n this.socket.on(\"error\", (err: unknown) => {\n for (const cb of this.errorListeners) {\n cb(err);\n }\n });\n\n for (const eventType of positionEventTypes) {\n this.socket.on(eventType, (envelope: PositionEventEnvelope) => {\n const event = camelizeEnvelope(envelope);\n this.emit(eventType, event);\n this.emit(\"*\", event);\n });\n }\n\n this.socket.on(\"notification\", (envelope: NotificationEventEnvelope) => {\n const event: NotificationEvent = {\n id: envelope.id,\n type: \"notification\",\n createdAt: envelope.created_at,\n data: envelope.data,\n };\n for (const cb of this.notificationListeners) {\n cb(event);\n }\n });\n }\n\n public disconnect(): void {\n this.socket?.disconnect();\n this.socket = null;\n }\n\n public reconnectWithToken(): void {\n this.disconnect();\n this.connect();\n }\n\n public on(event: PositionEventType | \"*\", cb: EventCallback): () => void {\n let set = this.eventListeners.get(event);\n if (!set) {\n set = new Set();\n this.eventListeners.set(event, set);\n }\n set.add(cb);\n return () => set.delete(cb);\n }\n\n public onConnect(cb: ConnectionCallback): () => void {\n this.connectListeners.add(cb);\n return () => this.connectListeners.delete(cb);\n }\n\n public onDisconnect(cb: ConnectionCallback): () => void {\n this.disconnectListeners.add(cb);\n return () => this.disconnectListeners.delete(cb);\n }\n\n public onError(cb: ErrorCallback): () => void {\n this.errorListeners.add(cb);\n return () => this.errorListeners.delete(cb);\n }\n\n public onNotification(cb: NotificationCallback): () => void {\n this.notificationListeners.add(cb);\n return () => this.notificationListeners.delete(cb);\n }\n\n private emit(event: string, data: PositionEvent): void {\n const set = this.eventListeners.get(event);\n if (!set) {\n return;\n }\n for (const cb of set) {\n cb(data);\n }\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/ws/position-socket.ts","../../src/ws/market-socket.ts"],"sourcesContent":["import { camelizeKeys } from \"humps\";\nimport { io, type Socket } from \"socket.io-client\";\nimport type { Position } from \"../types\";\nimport {\n positionEventTypes,\n type NotificationEvent,\n type NotificationEventEnvelope,\n type PositionEvent,\n type PositionEventEnvelope,\n type PositionEventType,\n} from \"./types\";\n\nexport interface PositionSocketOptions {\n baseUrl?: string;\n getToken: () => string | null;\n}\n\ntype EventCallback = (event: PositionEvent) => void;\ntype NotificationCallback = (event: NotificationEvent) => void;\ntype ConnectionCallback = () => void;\ntype ErrorCallback = (error: unknown) => void;\n\nconst wsNamespace = \"/v1/ws/prediction-markets/user-positions\";\n\nfunction camelizeEnvelope(envelope: PositionEventEnvelope): PositionEvent {\n return {\n id: envelope.id,\n type: envelope.type,\n createdAt: envelope.created_at,\n data: camelizeKeys(envelope.data) as unknown as Position,\n };\n}\n\nexport class PositionSocket {\n private socket: Socket | null = null;\n\n private readonly baseUrl: string;\n\n private readonly getToken: () => string | null;\n\n private readonly eventListeners = new Map<string, Set<EventCallback>>();\n\n private readonly connectListeners = new Set<ConnectionCallback>();\n\n private readonly disconnectListeners = new Set<ConnectionCallback>();\n\n private readonly errorListeners = new Set<ErrorCallback>();\n\n private readonly notificationListeners = new Set<NotificationCallback>();\n\n constructor(options: PositionSocketOptions) {\n this.baseUrl = options.baseUrl ?? \"https://api.dimes.fi\";\n this.getToken = options.getToken;\n }\n\n public get connected(): boolean {\n return this.socket?.connected ?? false;\n }\n\n public connect(): void {\n if (this.socket?.connected) {\n return;\n }\n\n this.socket?.disconnect();\n\n const token = this.getToken();\n if (!token) {\n return;\n }\n\n const getToken = this.getToken;\n this.socket = io(`${this.baseUrl}${wsNamespace}`, {\n auth: (cb) => cb({ token: getToken() }),\n transports: [\"websocket\"],\n reconnection: true,\n reconnectionDelay: 1000,\n reconnectionDelayMax: 30000,\n });\n\n this.socket.on(\"connect\", () => {\n for (const cb of this.connectListeners) {\n cb();\n }\n });\n\n this.socket.on(\"disconnect\", () => {\n for (const cb of this.disconnectListeners) {\n cb();\n }\n });\n\n this.socket.on(\"error\", (err: unknown) => {\n for (const cb of this.errorListeners) {\n cb(err);\n }\n });\n\n for (const eventType of positionEventTypes) {\n this.socket.on(eventType, (envelope: PositionEventEnvelope) => {\n const event = camelizeEnvelope(envelope);\n this.emit(eventType, event);\n this.emit(\"*\", event);\n });\n }\n\n this.socket.on(\"notification\", (envelope: NotificationEventEnvelope) => {\n const event: NotificationEvent = {\n id: envelope.id,\n type: \"notification\",\n createdAt: envelope.created_at,\n data: envelope.data,\n };\n for (const cb of this.notificationListeners) {\n cb(event);\n }\n });\n }\n\n public disconnect(): void {\n this.socket?.disconnect();\n this.socket = null;\n }\n\n public reconnectWithToken(): void {\n this.disconnect();\n this.connect();\n }\n\n public on(event: PositionEventType | \"*\", cb: EventCallback): () => void {\n let set = this.eventListeners.get(event);\n if (!set) {\n set = new Set();\n this.eventListeners.set(event, set);\n }\n set.add(cb);\n return () => set.delete(cb);\n }\n\n public onConnect(cb: ConnectionCallback): () => void {\n this.connectListeners.add(cb);\n return () => this.connectListeners.delete(cb);\n }\n\n public onDisconnect(cb: ConnectionCallback): () => void {\n this.disconnectListeners.add(cb);\n return () => this.disconnectListeners.delete(cb);\n }\n\n public onError(cb: ErrorCallback): () => void {\n this.errorListeners.add(cb);\n return () => this.errorListeners.delete(cb);\n }\n\n public onNotification(cb: NotificationCallback): () => void {\n this.notificationListeners.add(cb);\n return () => this.notificationListeners.delete(cb);\n }\n\n private emit(event: string, data: PositionEvent): void {\n const set = this.eventListeners.get(event);\n if (!set) {\n return;\n }\n for (const cb of set) {\n cb(data);\n }\n }\n}\n","import { camelizeKeys } from \"humps\";\nimport { io, type Socket } from \"socket.io-client\";\nimport type { Market } from \"../types\";\nimport {\n marketEventTypes,\n type MarketDelta,\n type MarketEvent,\n type MarketEventEnvelope,\n type MarketEventType,\n} from \"./types\";\n\nexport interface MarketSocketOptions {\n baseUrl?: string;\n getToken: () => string | null;\n}\n\ntype EventCallback = (event: MarketEvent) => void;\ntype ConnectionCallback = () => void;\ntype ErrorCallback = (error: unknown) => void;\n\nconst wsNamespace = \"/v1/ws/prediction-markets/user-markets\";\n\nfunction camelizeEnvelope(envelope: MarketEventEnvelope): MarketEvent {\n return {\n id: envelope.id,\n type: envelope.type,\n createdAt: envelope.created_at,\n data: envelope.data.map((item) => camelizeKeys(item)) as unknown as Market[] | MarketDelta[],\n };\n}\n\nexport class MarketSocket {\n private socket: Socket | null = null;\n\n private readonly baseUrl: string;\n\n private readonly getToken: () => string | null;\n\n private readonly eventListeners = new Map<string, Set<EventCallback>>();\n\n private readonly connectListeners = new Set<ConnectionCallback>();\n\n private readonly disconnectListeners = new Set<ConnectionCallback>();\n\n private readonly errorListeners = new Set<ErrorCallback>();\n\n constructor(options: MarketSocketOptions) {\n this.baseUrl = options.baseUrl ?? \"https://api.dimes.fi\";\n this.getToken = options.getToken;\n }\n\n public get connected(): boolean {\n return this.socket?.connected ?? false;\n }\n\n public connect(): void {\n if (this.socket?.connected) {\n return;\n }\n\n this.socket?.disconnect();\n\n const token = this.getToken();\n if (!token) {\n return;\n }\n\n const getToken = this.getToken;\n this.socket = io(`${this.baseUrl}${wsNamespace}`, {\n auth: (cb) => cb({ token: getToken() }),\n transports: [\"websocket\"],\n reconnection: true,\n reconnectionDelay: 1000,\n reconnectionDelayMax: 30000,\n });\n\n this.socket.on(\"connect\", () => {\n for (const cb of this.connectListeners) {\n cb();\n }\n });\n\n this.socket.on(\"disconnect\", () => {\n for (const cb of this.disconnectListeners) {\n cb();\n }\n });\n\n this.socket.on(\"error\", (err: unknown) => {\n for (const cb of this.errorListeners) {\n cb(err);\n }\n });\n\n for (const eventType of marketEventTypes) {\n this.socket.on(eventType, (envelope: MarketEventEnvelope) => {\n const event = camelizeEnvelope(envelope);\n this.emit(eventType, event);\n this.emit(\"*\", event);\n });\n }\n }\n\n public disconnect(): void {\n this.socket?.disconnect();\n this.socket = null;\n }\n\n public reconnectWithToken(): void {\n this.disconnect();\n this.connect();\n }\n\n public on(event: MarketEventType | \"*\", cb: EventCallback): () => void {\n let set = this.eventListeners.get(event);\n if (!set) {\n set = new Set();\n this.eventListeners.set(event, set);\n }\n set.add(cb);\n return () => set.delete(cb);\n }\n\n public onConnect(cb: ConnectionCallback): () => void {\n this.connectListeners.add(cb);\n return () => this.connectListeners.delete(cb);\n }\n\n public onDisconnect(cb: ConnectionCallback): () => void {\n this.disconnectListeners.add(cb);\n return () => this.disconnectListeners.delete(cb);\n }\n\n public onError(cb: ErrorCallback): () => void {\n this.errorListeners.add(cb);\n return () => this.errorListeners.delete(cb);\n }\n\n private emit(event: string, data: MarketEvent): void {\n const set = this.eventListeners.get(event);\n if (!set) {\n return;\n }\n for (const cb of set) {\n cb(data);\n }\n }\n}\n"],"mappings":"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","names":["camelizeKeys","io","wsNamespace","camelizeEnvelope","camelizeKeys","io"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dimes-dot-fi/sdk",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "TypeScript SDK for the Dimes prediction market API",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/quote/build-quote-params.ts","../src/quote/quote-error-hints.ts","../src/quote/quote.ts"],"sourcesContent":["import type { CreateOfferParams } from \"../types\";\nimport type { QuoteParams } from \"../types/quote\";\n\nconst DEFAULT_LEVERAGE_STEP_BPS = 2500;\n\nexport function buildQuoteParams(params: QuoteParams, stepBps: number = DEFAULT_LEVERAGE_STEP_BPS): CreateOfferParams {\n const leverageBps = Math.round(params.leverageBps / stepBps) * stepBps;\n const notionalUsdPips = Math.round(params.collateralUsd * leverageBps);\n\n return {\n marketTicker: params.marketTicker,\n effectiveSide: params.side,\n leverageBps,\n notionalAmountUsdPips: notionalUsdPips.toString(),\n slippageBps: params.slippageBps,\n };\n}\n","const pipsPerUsd = 10_000;\nconst bpsPerUnit = 10_000;\nconst bpsPerPct = 100;\nconst centsFactor = 100;\nconst decimalPlaces = 2;\n\nexport const marketMovedCodes = new Set([\n \"quote_slippage_too_high\",\n \"quote_insufficient_liquidity\",\n \"quote_entry_price_out_of_range\",\n \"quote_entry_bid_depth_too_low\",\n \"quote_entry_depth_too_low\",\n \"quote_entry_spread_too_wide\",\n]);\n\nexport type QuoteHint =\n | { kind: \"use-max-collateral\"; maxCollateralUsd: number; minCollateralUsd: number }\n | { kind: \"clamp-leverage\"; maxLeverageBps?: number }\n | { kind: \"raise-leverage\"; minLeverageBps: number }\n | { kind: \"raise-slippage\"; currentSlippageBps: number; maxSlippageBps: number }\n | { kind: \"market-full\" }\n | null;\n\ntype Params = Record<string, unknown> | null | undefined;\n\nfunction num(params: Params, key: string): number | null {\n if (!params) {\n return null;\n }\n const raw = params[key];\n if (raw === null || raw === undefined) {\n return null;\n }\n // eslint-disable-next-line no-restricted-syntax\n const n = typeof raw === \"string\" ? Number(raw) : typeof raw === \"number\" ? raw : NaN;\n return Number.isFinite(n) ? n : null;\n}\n\nfunction pipsToUsd(pips: number): number {\n return pips / pipsPerUsd;\n}\n\nfunction notionalPipsToCollateralUsd(notionalPips: number, leverageBps: number): number | null {\n if (!Number.isFinite(leverageBps) || leverageBps <= 0) {\n return null;\n }\n return (notionalPips * bpsPerUnit) / leverageBps / pipsPerUsd;\n}\n\nfunction resolveMaxCollateralHint(params: Params, context: { leverageBps: number }, capacityKey: string): QuoteHint {\n const serverMaxCollateralPips = num(params, \"maxSupportedCollateralUsdPips\");\n const capacityPips = num(params, capacityKey);\n const minNotionalPips = num(params, \"minNotionalUsdPips\");\n\n const fromServer = serverMaxCollateralPips !== null ? pipsToUsd(serverMaxCollateralPips) : null;\n const fromCapacity = capacityPips !== null ? notionalPipsToCollateralUsd(capacityPips, context.leverageBps) : null;\n const maxCollateralUsd =\n fromServer !== null && fromCapacity !== null ? Math.min(fromServer, fromCapacity) : (fromServer ?? fromCapacity);\n\n const minCollateralUsd =\n minNotionalPips !== null ? notionalPipsToCollateralUsd(minNotionalPips, context.leverageBps) : null;\n\n if (maxCollateralUsd === null || minCollateralUsd === null) {\n return null;\n }\n if (maxCollateralUsd < minCollateralUsd) {\n return { kind: \"market-full\" };\n }\n return { kind: \"use-max-collateral\", maxCollateralUsd, minCollateralUsd };\n}\n\n// eslint-disable-next-line complexity\nexport function quoteErrorHint(code: string | null, params: Params, context: { leverageBps: number }): QuoteHint {\n if (!code) {\n return null;\n }\n\n switch (code) {\n case \"quote_side_capacity_exceeded\":\n case \"quote_user_position_limit_exceeded\":\n case \"quote_market_position_limit_exceeded\":\n case \"quote_side_position_limit_exceeded\":\n case \"quote_global_position_limit_exceeded\":\n case \"quote_partner_position_limit_exceeded\":\n return resolveMaxCollateralHint(params, context, \"availableCapacityUsdPips\");\n\n case \"quote_insufficient_liquidity\":\n case \"notional_selector_insufficient_liquidity\":\n return resolveMaxCollateralHint(params, context, \"slippageMaxUsdPips\");\n\n case \"quote_leverage_exceeds_maximum\":\n case \"quote_leverage_exceeds_model_max\": {\n const maxLeverageBps = num(params, \"maxLeverageBps\");\n if (maxLeverageBps === null) {\n return null;\n }\n return { kind: \"clamp-leverage\", maxLeverageBps };\n }\n\n case \"quote_leverage_too_high_for_price\": {\n const maxLeverageBps = num(params, \"maxAcceptableLeverageBps\");\n if (maxLeverageBps === null) {\n return null;\n }\n return { kind: \"clamp-leverage\", maxLeverageBps };\n }\n\n case \"quote_leverage_below_minimum\": {\n const minLeverageBps = num(params, \"minLeverageBps\");\n if (minLeverageBps === null) {\n return null;\n }\n return { kind: \"raise-leverage\", minLeverageBps };\n }\n\n case \"quote_slippage_too_high\": {\n const currentSlippageBps = num(params, \"currentSlippageBps\");\n const maxSlippageBps = num(params, \"maxSlippageBps\");\n if (currentSlippageBps === null || maxSlippageBps === null) {\n return null;\n }\n return { kind: \"raise-slippage\", currentSlippageBps, maxSlippageBps };\n }\n\n default:\n return null;\n }\n}\n\nexport type CorrectedField = \"collateral\" | \"leverage\" | \"slippage\";\n\nexport type HintAdjustment =\n | {\n field: \"collateral\";\n fromValue: number;\n toValue: number;\n toLabel: string;\n reason: \"max-collateral\";\n }\n | {\n field: \"leverage\";\n fromValue: number;\n toValue: number;\n toLabel: string;\n reason: \"clamp-max\" | \"raise-min\";\n }\n | {\n field: \"slippage\";\n fromValue: number;\n toValue: number;\n toLabel: string;\n reason: \"raise-slippage\";\n }\n | null;\n\nfunction formatUsd(value: number): string {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(value);\n}\n\nfunction bpsToMultiplier(bps: number): string {\n return `${(bps / bpsPerUnit).toFixed(1).replace(/\\.0$/, \"\")}x`;\n}\n\nexport function hintAdjustment(\n hint: QuoteHint,\n current: { collateralUsd: number; leverageBps: number; slippageBps: number },\n): HintAdjustment {\n if (!hint) {\n return null;\n }\n\n switch (hint.kind) {\n case \"use-max-collateral\": {\n const to = Math.max(0, Math.floor(hint.maxCollateralUsd * centsFactor) / centsFactor);\n if (to <= 0) {\n return null;\n }\n return {\n field: \"collateral\",\n fromValue: current.collateralUsd,\n toValue: to,\n toLabel: formatUsd(to),\n reason: \"max-collateral\",\n };\n }\n case \"clamp-leverage\": {\n if (hint.maxLeverageBps === undefined) {\n return null;\n }\n return {\n field: \"leverage\",\n fromValue: current.leverageBps,\n toValue: hint.maxLeverageBps,\n toLabel: bpsToMultiplier(hint.maxLeverageBps),\n reason: \"clamp-max\",\n };\n }\n case \"raise-leverage\":\n return {\n field: \"leverage\",\n fromValue: current.leverageBps,\n toValue: hint.minLeverageBps,\n toLabel: bpsToMultiplier(hint.minLeverageBps),\n reason: \"raise-min\",\n };\n case \"raise-slippage\":\n return {\n field: \"slippage\",\n fromValue: hint.currentSlippageBps,\n toValue: hint.maxSlippageBps,\n toLabel: `${(hint.maxSlippageBps / bpsPerPct).toFixed(decimalPlaces).replace(/\\.?0+$/, \"\")}%`,\n reason: \"raise-slippage\",\n };\n case \"market-full\":\n return null;\n default:\n return null;\n }\n}\n","import { DimesApiError, DimesError } from \"../errors/dimes-error\";\nimport type { CreateOfferParams, Offer } from \"../types\";\nimport type { QuoteOptions, QuoteParams, QuoteResult } from \"../types/quote\";\nimport { buildQuoteParams } from \"./build-quote-params\";\nimport { type HintAdjustment, hintAdjustment, marketMovedCodes, quoteErrorHint } from \"./quote-error-hints\";\n\nexport interface QuoteClient {\n createDraftQuote(params: CreateOfferParams): Promise<Offer>;\n promoteDraftQuote(draftId: string): Promise<Offer>;\n createQuote(params: CreateOfferParams): Promise<Offer>;\n}\n\nconst DEFAULT_MAX_RETRIES = 3;\n\nfunction isMarketMovedError(err: unknown): boolean {\n return err instanceof DimesApiError && marketMovedCodes.has(err.code);\n}\n\nfunction applyAdjustment(\n params: CreateOfferParams,\n adj: NonNullable<HintAdjustment>,\n currentParams: QuoteParams,\n): CreateOfferParams {\n switch (adj.field) {\n case \"collateral\": {\n const notionalUsdPips = Math.round(adj.toValue * params.leverageBps);\n return { ...params, notionalAmountUsdPips: notionalUsdPips.toString() };\n }\n case \"leverage\": {\n const notionalUsdPips = Math.round(currentParams.collateralUsd * adj.toValue);\n return {\n ...params,\n leverageBps: adj.toValue,\n notionalAmountUsdPips: notionalUsdPips.toString(),\n };\n }\n case \"slippage\":\n return { ...params, slippageBps: adj.toValue };\n default:\n return params;\n }\n}\n\nfunction handleMarketMoved(err: unknown, attempt: number, maxRetries: number): boolean {\n return isMarketMovedError(err) && attempt < maxRetries;\n}\n\nfunction handleCorrection(err: unknown, currentParams: QuoteParams): { adj: NonNullable<HintAdjustment> } | null {\n if (!(err instanceof DimesApiError)) {\n return null;\n }\n\n const hint = quoteErrorHint(err.code, err.params, {\n leverageBps: currentParams.leverageBps,\n });\n\n const adj = hintAdjustment(hint, {\n collateralUsd: currentParams.collateralUsd,\n leverageBps: currentParams.leverageBps,\n slippageBps: currentParams.slippageBps,\n });\n\n if (!adj) {\n return null;\n }\n\n return { adj };\n}\n\n// eslint-disable-next-line complexity\nexport async function executeQuote(\n client: QuoteClient,\n params: QuoteParams,\n options?: QuoteOptions,\n): Promise<QuoteResult> {\n const maxRetries = options?.maxRetries ?? DEFAULT_MAX_RETRIES;\n const autoCorrect = options?.autoCorrect ?? true;\n const corrections: NonNullable<HintAdjustment>[] = [];\n let retries = 0;\n\n let offerParams = buildQuoteParams(params);\n const currentParams = { ...params };\n\n const draft = await client.createDraftQuote(offerParams);\n options?.onDraftReady?.(draft);\n\n let currentDraft: Offer = draft;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n const promotedOffer = await client.promoteDraftQuote(currentDraft.id);\n return { offer: promotedOffer, corrections, retries };\n } catch (err) {\n if (handleMarketMoved(err, attempt, maxRetries)) {\n const newDraft = await client.createDraftQuote(offerParams);\n retries++;\n\n const callbackResult = options?.onMarketMoved?.({\n originalDraft: currentDraft,\n newDraft,\n retryCount: retries,\n });\n\n if (callbackResult === false) {\n throw err;\n }\n\n currentDraft = newDraft;\n continue;\n }\n\n if (autoCorrect) {\n const correction = handleCorrection(err, currentParams);\n\n if (correction) {\n const callbackResult = options?.onCorrection?.(correction.adj);\n if (callbackResult === false) {\n throw err;\n }\n\n offerParams = applyAdjustment(offerParams, correction.adj, currentParams);\n corrections.push(correction.adj);\n\n const correctedOffer = await client.createQuote(offerParams);\n return { offer: correctedOffer, corrections, retries };\n }\n }\n\n throw err;\n }\n }\n\n throw new DimesError(\"market_moved_retries_exhausted\", \"Exhausted market-moved retries\");\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/Users/alexemery/bl/dimes-sdk/dist/chunk-JWAPH4GD.cjs","../src/quote/build-quote-params.ts","../src/quote/quote-error-hints.ts","../src/quote/quote.ts"],"names":[],"mappings":"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","file":"/Users/alexemery/bl/dimes-sdk/dist/chunk-JWAPH4GD.cjs","sourcesContent":[null,"import type { CreateOfferParams } from \"../types\";\nimport type { QuoteParams } from \"../types/quote\";\n\nconst DEFAULT_LEVERAGE_STEP_BPS = 2500;\n\nexport function buildQuoteParams(params: QuoteParams, stepBps: number = DEFAULT_LEVERAGE_STEP_BPS): CreateOfferParams {\n const leverageBps = Math.round(params.leverageBps / stepBps) * stepBps;\n const notionalUsdPips = Math.round(params.collateralUsd * leverageBps);\n\n return {\n marketTicker: params.marketTicker,\n effectiveSide: params.side,\n leverageBps,\n notionalAmountUsdPips: notionalUsdPips.toString(),\n slippageBps: params.slippageBps,\n };\n}\n","const pipsPerUsd = 10_000;\nconst bpsPerUnit = 10_000;\nconst bpsPerPct = 100;\nconst centsFactor = 100;\nconst decimalPlaces = 2;\n\nexport const marketMovedCodes = new Set([\n \"quote_slippage_too_high\",\n \"quote_insufficient_liquidity\",\n \"quote_entry_price_out_of_range\",\n \"quote_entry_bid_depth_too_low\",\n \"quote_entry_depth_too_low\",\n \"quote_entry_spread_too_wide\",\n]);\n\nexport type QuoteHint =\n | { kind: \"use-max-collateral\"; maxCollateralUsd: number; minCollateralUsd: number }\n | { kind: \"clamp-leverage\"; maxLeverageBps?: number }\n | { kind: \"raise-leverage\"; minLeverageBps: number }\n | { kind: \"raise-slippage\"; currentSlippageBps: number; maxSlippageBps: number }\n | { kind: \"market-full\" }\n | null;\n\ntype Params = Record<string, unknown> | null | undefined;\n\nfunction num(params: Params, key: string): number | null {\n if (!params) {\n return null;\n }\n const raw = params[key];\n if (raw === null || raw === undefined) {\n return null;\n }\n // eslint-disable-next-line no-restricted-syntax\n const n = typeof raw === \"string\" ? Number(raw) : typeof raw === \"number\" ? raw : NaN;\n return Number.isFinite(n) ? n : null;\n}\n\nfunction pipsToUsd(pips: number): number {\n return pips / pipsPerUsd;\n}\n\nfunction notionalPipsToCollateralUsd(notionalPips: number, leverageBps: number): number | null {\n if (!Number.isFinite(leverageBps) || leverageBps <= 0) {\n return null;\n }\n return (notionalPips * bpsPerUnit) / leverageBps / pipsPerUsd;\n}\n\nfunction resolveMaxCollateralHint(params: Params, context: { leverageBps: number }, capacityKey: string): QuoteHint {\n const serverMaxCollateralPips = num(params, \"maxSupportedCollateralUsdPips\");\n const capacityPips = num(params, capacityKey);\n const minNotionalPips = num(params, \"minNotionalUsdPips\");\n\n const fromServer = serverMaxCollateralPips !== null ? pipsToUsd(serverMaxCollateralPips) : null;\n const fromCapacity = capacityPips !== null ? notionalPipsToCollateralUsd(capacityPips, context.leverageBps) : null;\n const maxCollateralUsd =\n fromServer !== null && fromCapacity !== null ? Math.min(fromServer, fromCapacity) : (fromServer ?? fromCapacity);\n\n const minCollateralUsd =\n minNotionalPips !== null ? notionalPipsToCollateralUsd(minNotionalPips, context.leverageBps) : null;\n\n if (maxCollateralUsd === null || minCollateralUsd === null) {\n return null;\n }\n if (maxCollateralUsd < minCollateralUsd) {\n return { kind: \"market-full\" };\n }\n return { kind: \"use-max-collateral\", maxCollateralUsd, minCollateralUsd };\n}\n\n// eslint-disable-next-line complexity\nexport function quoteErrorHint(code: string | null, params: Params, context: { leverageBps: number }): QuoteHint {\n if (!code) {\n return null;\n }\n\n switch (code) {\n case \"quote_side_capacity_exceeded\":\n case \"quote_user_position_limit_exceeded\":\n case \"quote_market_position_limit_exceeded\":\n case \"quote_side_position_limit_exceeded\":\n case \"quote_global_position_limit_exceeded\":\n case \"quote_partner_position_limit_exceeded\":\n return resolveMaxCollateralHint(params, context, \"availableCapacityUsdPips\");\n\n case \"quote_insufficient_liquidity\":\n case \"notional_selector_insufficient_liquidity\":\n return resolveMaxCollateralHint(params, context, \"slippageMaxUsdPips\");\n\n case \"quote_leverage_exceeds_maximum\":\n case \"quote_leverage_exceeds_model_max\": {\n const maxLeverageBps = num(params, \"maxLeverageBps\");\n if (maxLeverageBps === null) {\n return null;\n }\n return { kind: \"clamp-leverage\", maxLeverageBps };\n }\n\n case \"quote_leverage_too_high_for_price\": {\n const maxLeverageBps = num(params, \"maxAcceptableLeverageBps\");\n if (maxLeverageBps === null) {\n return null;\n }\n return { kind: \"clamp-leverage\", maxLeverageBps };\n }\n\n case \"quote_leverage_below_minimum\": {\n const minLeverageBps = num(params, \"minLeverageBps\");\n if (minLeverageBps === null) {\n return null;\n }\n return { kind: \"raise-leverage\", minLeverageBps };\n }\n\n case \"quote_slippage_too_high\": {\n const currentSlippageBps = num(params, \"currentSlippageBps\");\n const maxSlippageBps = num(params, \"maxSlippageBps\");\n if (currentSlippageBps === null || maxSlippageBps === null) {\n return null;\n }\n return { kind: \"raise-slippage\", currentSlippageBps, maxSlippageBps };\n }\n\n default:\n return null;\n }\n}\n\nexport type CorrectedField = \"collateral\" | \"leverage\" | \"slippage\";\n\nexport type HintAdjustment =\n | {\n field: \"collateral\";\n fromValue: number;\n toValue: number;\n toLabel: string;\n reason: \"max-collateral\";\n }\n | {\n field: \"leverage\";\n fromValue: number;\n toValue: number;\n toLabel: string;\n reason: \"clamp-max\" | \"raise-min\";\n }\n | {\n field: \"slippage\";\n fromValue: number;\n toValue: number;\n toLabel: string;\n reason: \"raise-slippage\";\n }\n | null;\n\nfunction formatUsd(value: number): string {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(value);\n}\n\nfunction bpsToMultiplier(bps: number): string {\n return `${(bps / bpsPerUnit).toFixed(1).replace(/\\.0$/, \"\")}x`;\n}\n\nexport function hintAdjustment(\n hint: QuoteHint,\n current: { collateralUsd: number; leverageBps: number; slippageBps: number },\n): HintAdjustment {\n if (!hint) {\n return null;\n }\n\n switch (hint.kind) {\n case \"use-max-collateral\": {\n const to = Math.max(0, Math.floor(hint.maxCollateralUsd * centsFactor) / centsFactor);\n if (to <= 0) {\n return null;\n }\n return {\n field: \"collateral\",\n fromValue: current.collateralUsd,\n toValue: to,\n toLabel: formatUsd(to),\n reason: \"max-collateral\",\n };\n }\n case \"clamp-leverage\": {\n if (hint.maxLeverageBps === undefined) {\n return null;\n }\n return {\n field: \"leverage\",\n fromValue: current.leverageBps,\n toValue: hint.maxLeverageBps,\n toLabel: bpsToMultiplier(hint.maxLeverageBps),\n reason: \"clamp-max\",\n };\n }\n case \"raise-leverage\":\n return {\n field: \"leverage\",\n fromValue: current.leverageBps,\n toValue: hint.minLeverageBps,\n toLabel: bpsToMultiplier(hint.minLeverageBps),\n reason: \"raise-min\",\n };\n case \"raise-slippage\":\n return {\n field: \"slippage\",\n fromValue: hint.currentSlippageBps,\n toValue: hint.maxSlippageBps,\n toLabel: `${(hint.maxSlippageBps / bpsPerPct).toFixed(decimalPlaces).replace(/\\.?0+$/, \"\")}%`,\n reason: \"raise-slippage\",\n };\n case \"market-full\":\n return null;\n default:\n return null;\n }\n}\n","import { DimesApiError, DimesError } from \"../errors/dimes-error\";\nimport type { CreateOfferParams, Offer } from \"../types\";\nimport type { QuoteOptions, QuoteParams, QuoteResult } from \"../types/quote\";\nimport { buildQuoteParams } from \"./build-quote-params\";\nimport { type HintAdjustment, hintAdjustment, marketMovedCodes, quoteErrorHint } from \"./quote-error-hints\";\n\nexport interface QuoteClient {\n createDraftQuote(params: CreateOfferParams): Promise<Offer>;\n promoteDraftQuote(draftId: string): Promise<Offer>;\n createQuote(params: CreateOfferParams): Promise<Offer>;\n}\n\nconst DEFAULT_MAX_RETRIES = 3;\n\nfunction isMarketMovedError(err: unknown): boolean {\n return err instanceof DimesApiError && marketMovedCodes.has(err.code);\n}\n\nfunction applyAdjustment(\n params: CreateOfferParams,\n adj: NonNullable<HintAdjustment>,\n currentParams: QuoteParams,\n): CreateOfferParams {\n switch (adj.field) {\n case \"collateral\": {\n const notionalUsdPips = Math.round(adj.toValue * params.leverageBps);\n return { ...params, notionalAmountUsdPips: notionalUsdPips.toString() };\n }\n case \"leverage\": {\n const notionalUsdPips = Math.round(currentParams.collateralUsd * adj.toValue);\n return {\n ...params,\n leverageBps: adj.toValue,\n notionalAmountUsdPips: notionalUsdPips.toString(),\n };\n }\n case \"slippage\":\n return { ...params, slippageBps: adj.toValue };\n default:\n return params;\n }\n}\n\nfunction handleMarketMoved(err: unknown, attempt: number, maxRetries: number): boolean {\n return isMarketMovedError(err) && attempt < maxRetries;\n}\n\nfunction handleCorrection(err: unknown, currentParams: QuoteParams): { adj: NonNullable<HintAdjustment> } | null {\n if (!(err instanceof DimesApiError)) {\n return null;\n }\n\n const hint = quoteErrorHint(err.code, err.params, {\n leverageBps: currentParams.leverageBps,\n });\n\n const adj = hintAdjustment(hint, {\n collateralUsd: currentParams.collateralUsd,\n leverageBps: currentParams.leverageBps,\n slippageBps: currentParams.slippageBps,\n });\n\n if (!adj) {\n return null;\n }\n\n return { adj };\n}\n\n// eslint-disable-next-line complexity\nexport async function executeQuote(\n client: QuoteClient,\n params: QuoteParams,\n options?: QuoteOptions,\n): Promise<QuoteResult> {\n const maxRetries = options?.maxRetries ?? DEFAULT_MAX_RETRIES;\n const autoCorrect = options?.autoCorrect ?? true;\n const corrections: NonNullable<HintAdjustment>[] = [];\n let retries = 0;\n\n let offerParams = buildQuoteParams(params);\n const currentParams = { ...params };\n\n const draft = await client.createDraftQuote(offerParams);\n options?.onDraftReady?.(draft);\n\n let currentDraft: Offer = draft;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n const promotedOffer = await client.promoteDraftQuote(currentDraft.id);\n return { offer: promotedOffer, corrections, retries };\n } catch (err) {\n if (handleMarketMoved(err, attempt, maxRetries)) {\n const newDraft = await client.createDraftQuote(offerParams);\n retries++;\n\n const callbackResult = options?.onMarketMoved?.({\n originalDraft: currentDraft,\n newDraft,\n retryCount: retries,\n });\n\n if (callbackResult === false) {\n throw err;\n }\n\n currentDraft = newDraft;\n continue;\n }\n\n if (autoCorrect) {\n const correction = handleCorrection(err, currentParams);\n\n if (correction) {\n const callbackResult = options?.onCorrection?.(correction.adj);\n if (callbackResult === false) {\n throw err;\n }\n\n offerParams = applyAdjustment(offerParams, correction.adj, currentParams);\n corrections.push(correction.adj);\n\n const correctedOffer = await client.createQuote(offerParams);\n return { offer: correctedOffer, corrections, retries };\n }\n }\n\n throw err;\n }\n }\n\n throw new DimesError(\"market_moved_retries_exhausted\", \"Exhausted market-moved retries\");\n}\n"]}