@newyorkcompute/kalshi-core 0.1.1 → 0.3.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 (59) hide show
  1. package/dist/cache.d.ts +71 -0
  2. package/dist/cache.d.ts.map +1 -0
  3. package/dist/cache.js +96 -0
  4. package/dist/cache.js.map +1 -0
  5. package/dist/cache.test.d.ts +5 -0
  6. package/dist/cache.test.d.ts.map +1 -0
  7. package/dist/cache.test.js +108 -0
  8. package/dist/cache.test.js.map +1 -0
  9. package/dist/config.d.ts +61 -6
  10. package/dist/config.d.ts.map +1 -1
  11. package/dist/config.js +56 -5
  12. package/dist/config.js.map +1 -1
  13. package/dist/config.test.d.ts +2 -0
  14. package/dist/config.test.d.ts.map +1 -0
  15. package/dist/config.test.js +94 -0
  16. package/dist/config.test.js.map +1 -0
  17. package/dist/format.d.ts +110 -2
  18. package/dist/format.d.ts.map +1 -1
  19. package/dist/format.js +151 -2
  20. package/dist/format.js.map +1 -1
  21. package/dist/format.test.js +107 -2
  22. package/dist/format.test.js.map +1 -1
  23. package/dist/index.d.ts +4 -1
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +7 -1
  26. package/dist/index.js.map +1 -1
  27. package/dist/rate-limiter.d.ts +80 -0
  28. package/dist/rate-limiter.d.ts.map +1 -0
  29. package/dist/rate-limiter.js +180 -0
  30. package/dist/rate-limiter.js.map +1 -0
  31. package/dist/rate-limiter.test.d.ts +5 -0
  32. package/dist/rate-limiter.test.d.ts.map +1 -0
  33. package/dist/rate-limiter.test.js +175 -0
  34. package/dist/rate-limiter.test.js.map +1 -0
  35. package/dist/websocket/auth.d.ts +28 -0
  36. package/dist/websocket/auth.d.ts.map +1 -0
  37. package/dist/websocket/auth.js +55 -0
  38. package/dist/websocket/auth.js.map +1 -0
  39. package/dist/websocket/auth.test.d.ts +2 -0
  40. package/dist/websocket/auth.test.d.ts.map +1 -0
  41. package/dist/websocket/auth.test.js +56 -0
  42. package/dist/websocket/auth.test.js.map +1 -0
  43. package/dist/websocket/client.d.ts +95 -0
  44. package/dist/websocket/client.d.ts.map +1 -0
  45. package/dist/websocket/client.js +352 -0
  46. package/dist/websocket/client.js.map +1 -0
  47. package/dist/websocket/index.d.ts +9 -0
  48. package/dist/websocket/index.d.ts.map +1 -0
  49. package/dist/websocket/index.js +9 -0
  50. package/dist/websocket/index.js.map +1 -0
  51. package/dist/websocket/types.d.ts +160 -0
  52. package/dist/websocket/types.d.ts.map +1 -0
  53. package/dist/websocket/types.js +12 -0
  54. package/dist/websocket/types.js.map +1 -0
  55. package/dist/websocket/types.test.d.ts +2 -0
  56. package/dist/websocket/types.test.d.ts.map +1 -0
  57. package/dist/websocket/types.test.js +17 -0
  58. package/dist/websocket/types.test.js.map +1 -0
  59. package/package.json +8 -4
package/dist/format.d.ts CHANGED
@@ -5,34 +5,142 @@
5
5
  */
6
6
  /**
7
7
  * Format a price in cents to a display string (e.g., 45 -> "45¢")
8
+ *
9
+ * @param cents - Price in cents (0-100 for Kalshi markets)
10
+ * @returns Formatted price string with cent symbol, or "—" if null/undefined
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * formatPrice(45) // "45¢"
15
+ * formatPrice(null) // "—"
16
+ * ```
8
17
  */
9
18
  export declare function formatPrice(cents: number | undefined | null): string;
10
19
  /**
11
20
  * Format a price in cents to dollars (e.g., 4500 -> "$45.00")
21
+ *
22
+ * @param cents - Amount in cents
23
+ * @returns Formatted dollar string with currency symbol, or "—" if null/undefined
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * formatCurrency(4500) // "$45.00"
28
+ * formatCurrency(50) // "$0.50"
29
+ * ```
12
30
  */
13
31
  export declare function formatCurrency(cents: number | undefined | null): string;
14
32
  /**
15
33
  * Format a number as a percentage (e.g., 0.45 -> "45%")
34
+ *
35
+ * @param value - Decimal value between 0 and 1
36
+ * @returns Formatted percentage string, or "—" if null/undefined
37
+ *
38
+ * @example
39
+ * ```ts
40
+ * formatPercent(0.45) // "45%"
41
+ * formatPercent(1.0) // "100%"
42
+ * ```
16
43
  */
17
44
  export declare function formatPercent(value: number | undefined | null): string;
18
45
  /**
19
- * Format a price change with indicator (e.g., 2 -> "▲ +2", -3 -> "▼ -3", 0 -> "━ 0")
46
+ * Format a price change with visual indicator
47
+ *
48
+ * @param change - Price change in cents (positive, negative, or zero)
49
+ * @returns Formatted string with arrow indicator
50
+ *
51
+ * @example
52
+ * ```ts
53
+ * formatPriceChange(2) // "▲ +2"
54
+ * formatPriceChange(-3) // "▼ -3"
55
+ * formatPriceChange(0) // "━ 0"
56
+ * ```
20
57
  */
21
58
  export declare function formatPriceChange(change: number): string;
22
59
  /**
23
- * Format a large number with abbreviations (e.g., 1500000 -> "1.5M")
60
+ * Format a large number with K/M abbreviations
61
+ *
62
+ * @param value - Number to format
63
+ * @returns Compact string with K (thousands) or M (millions) suffix
64
+ *
65
+ * @example
66
+ * ```ts
67
+ * formatCompactNumber(1500000) // "1.5M"
68
+ * formatCompactNumber(2500) // "2.5K"
69
+ * formatCompactNumber(500) // "500"
70
+ * ```
24
71
  */
25
72
  export declare function formatCompactNumber(value: number | undefined | null): string;
26
73
  /**
27
74
  * Format a timestamp to a relative time string
75
+ *
76
+ * @param timestamp - Date string or Date object
77
+ * @returns Relative time string (e.g., "2d ago", "in 3h")
28
78
  */
29
79
  export declare function formatRelativeTime(timestamp: string | Date): string;
80
+ /**
81
+ * Format market close time as expiry string
82
+ *
83
+ * Handles various time ranges:
84
+ * - Minutes: "45m"
85
+ * - Hours: "3h 45m"
86
+ * - Days: "2d 14h" or "45d" (for >30 days)
87
+ * - Years: "2y 3mo" or "2y"
88
+ * - Very distant (>10y): "distant"
89
+ * - Past: "CLOSED"
90
+ *
91
+ * @param closeTime - ISO date string for market close time
92
+ * @returns Formatted expiry string
93
+ *
94
+ * @example
95
+ * ```ts
96
+ * formatExpiry('2025-12-31T23:59:59Z') // "1y 2mo"
97
+ * formatExpiry('2099-01-01T00:00:00Z') // "distant"
98
+ * formatExpiry('2024-01-01T00:00:00Z') // "CLOSED" (if past)
99
+ * ```
100
+ */
101
+ export declare function formatExpiry(closeTime?: string): string;
102
+ /**
103
+ * Calculate spread between best bid and best ask
104
+ *
105
+ * @param bestBid - Best (highest) bid price
106
+ * @param bestAsk - Best (lowest) ask price
107
+ * @returns Spread in cents, or null if either price is missing
108
+ *
109
+ * @example
110
+ * ```ts
111
+ * calculateSpread(48, 52) // 4
112
+ * calculateSpread(null, 52) // null
113
+ * ```
114
+ */
115
+ export declare function calculateSpread(bestBid: number | null | undefined, bestAsk: number | null | undefined): number | null;
30
116
  /**
31
117
  * Truncate a string to a maximum length with ellipsis
118
+ *
119
+ * @param str - String to truncate
120
+ * @param maxLength - Maximum length including ellipsis
121
+ * @returns Truncated string with "…" if needed
122
+ *
123
+ * @example
124
+ * ```ts
125
+ * truncate("Hello World", 8) // "Hello W…"
126
+ * truncate("Hi", 8) // "Hi"
127
+ * ```
32
128
  */
33
129
  export declare function truncate(str: string, maxLength: number): string;
34
130
  /**
35
131
  * Pad a string to a fixed width (left or right aligned)
132
+ *
133
+ * @param str - String to pad
134
+ * @param width - Target width
135
+ * @param align - Alignment direction ("left" adds padding right, "right" adds padding left)
136
+ * @returns Padded string, truncated if longer than width
137
+ *
138
+ * @example
139
+ * ```ts
140
+ * padString("Hi", 5, "left") // "Hi "
141
+ * padString("Hi", 5, "right") // " Hi"
142
+ * padString("Hello World", 5) // "Hello"
143
+ * ```
36
144
  */
37
145
  export declare function padString(str: string, width: number, align?: "left" | "right"): string;
38
146
  //# sourceMappingURL=format.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAKpE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAMvE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAKtE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAOxD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAY5E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAuBnE;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAK/D;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,MAAM,GAAG,OAAgB,GAC/B,MAAM,CAMR"}
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAKpE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAMvE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAKtE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAOxD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAY5E;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAuBnE;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CA4CvD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAClC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACjC,MAAM,GAAG,IAAI,CAGf;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAK/D;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,SAAS,CACvB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,MAAM,GAAG,OAAgB,GAC/B,MAAM,CAMR"}
package/dist/format.js CHANGED
@@ -5,6 +5,15 @@
5
5
  */
6
6
  /**
7
7
  * Format a price in cents to a display string (e.g., 45 -> "45¢")
8
+ *
9
+ * @param cents - Price in cents (0-100 for Kalshi markets)
10
+ * @returns Formatted price string with cent symbol, or "—" if null/undefined
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * formatPrice(45) // "45¢"
15
+ * formatPrice(null) // "—"
16
+ * ```
8
17
  */
9
18
  export function formatPrice(cents) {
10
19
  if (cents === undefined || cents === null) {
@@ -14,6 +23,15 @@ export function formatPrice(cents) {
14
23
  }
15
24
  /**
16
25
  * Format a price in cents to dollars (e.g., 4500 -> "$45.00")
26
+ *
27
+ * @param cents - Amount in cents
28
+ * @returns Formatted dollar string with currency symbol, or "—" if null/undefined
29
+ *
30
+ * @example
31
+ * ```ts
32
+ * formatCurrency(4500) // "$45.00"
33
+ * formatCurrency(50) // "$0.50"
34
+ * ```
17
35
  */
18
36
  export function formatCurrency(cents) {
19
37
  if (cents === undefined || cents === null) {
@@ -24,6 +42,15 @@ export function formatCurrency(cents) {
24
42
  }
25
43
  /**
26
44
  * Format a number as a percentage (e.g., 0.45 -> "45%")
45
+ *
46
+ * @param value - Decimal value between 0 and 1
47
+ * @returns Formatted percentage string, or "—" if null/undefined
48
+ *
49
+ * @example
50
+ * ```ts
51
+ * formatPercent(0.45) // "45%"
52
+ * formatPercent(1.0) // "100%"
53
+ * ```
27
54
  */
28
55
  export function formatPercent(value) {
29
56
  if (value === undefined || value === null) {
@@ -32,7 +59,17 @@ export function formatPercent(value) {
32
59
  return `${Math.round(value * 100)}%`;
33
60
  }
34
61
  /**
35
- * Format a price change with indicator (e.g., 2 -> "▲ +2", -3 -> "▼ -3", 0 -> "━ 0")
62
+ * Format a price change with visual indicator
63
+ *
64
+ * @param change - Price change in cents (positive, negative, or zero)
65
+ * @returns Formatted string with arrow indicator
66
+ *
67
+ * @example
68
+ * ```ts
69
+ * formatPriceChange(2) // "▲ +2"
70
+ * formatPriceChange(-3) // "▼ -3"
71
+ * formatPriceChange(0) // "━ 0"
72
+ * ```
36
73
  */
37
74
  export function formatPriceChange(change) {
38
75
  if (change > 0) {
@@ -44,7 +81,17 @@ export function formatPriceChange(change) {
44
81
  return "━ 0";
45
82
  }
46
83
  /**
47
- * Format a large number with abbreviations (e.g., 1500000 -> "1.5M")
84
+ * Format a large number with K/M abbreviations
85
+ *
86
+ * @param value - Number to format
87
+ * @returns Compact string with K (thousands) or M (millions) suffix
88
+ *
89
+ * @example
90
+ * ```ts
91
+ * formatCompactNumber(1500000) // "1.5M"
92
+ * formatCompactNumber(2500) // "2.5K"
93
+ * formatCompactNumber(500) // "500"
94
+ * ```
48
95
  */
49
96
  export function formatCompactNumber(value) {
50
97
  if (value === undefined || value === null) {
@@ -60,6 +107,9 @@ export function formatCompactNumber(value) {
60
107
  }
61
108
  /**
62
109
  * Format a timestamp to a relative time string
110
+ *
111
+ * @param timestamp - Date string or Date object
112
+ * @returns Relative time string (e.g., "2d ago", "in 3h")
63
113
  */
64
114
  export function formatRelativeTime(timestamp) {
65
115
  const date = typeof timestamp === "string" ? new Date(timestamp) : timestamp;
@@ -83,8 +133,95 @@ export function formatRelativeTime(timestamp) {
83
133
  }
84
134
  return "now";
85
135
  }
136
+ /**
137
+ * Format market close time as expiry string
138
+ *
139
+ * Handles various time ranges:
140
+ * - Minutes: "45m"
141
+ * - Hours: "3h 45m"
142
+ * - Days: "2d 14h" or "45d" (for >30 days)
143
+ * - Years: "2y 3mo" or "2y"
144
+ * - Very distant (>10y): "distant"
145
+ * - Past: "CLOSED"
146
+ *
147
+ * @param closeTime - ISO date string for market close time
148
+ * @returns Formatted expiry string
149
+ *
150
+ * @example
151
+ * ```ts
152
+ * formatExpiry('2025-12-31T23:59:59Z') // "1y 2mo"
153
+ * formatExpiry('2099-01-01T00:00:00Z') // "distant"
154
+ * formatExpiry('2024-01-01T00:00:00Z') // "CLOSED" (if past)
155
+ * ```
156
+ */
157
+ export function formatExpiry(closeTime) {
158
+ if (!closeTime)
159
+ return '';
160
+ const now = new Date();
161
+ const close = new Date(closeTime);
162
+ const diffMs = close.getTime() - now.getTime();
163
+ if (diffMs <= 0)
164
+ return 'CLOSED';
165
+ const diffMins = Math.floor(diffMs / (1000 * 60));
166
+ const diffHours = Math.floor(diffMs / (1000 * 60 * 60));
167
+ const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
168
+ const diffYears = Math.floor(diffDays / 365);
169
+ // For very distant dates, show "distant"
170
+ if (diffYears > 10) {
171
+ return 'distant';
172
+ }
173
+ // For dates > 1 year, show years and months
174
+ if (diffYears >= 1) {
175
+ const remainingMonths = Math.floor((diffDays % 365) / 30);
176
+ return remainingMonths > 0 ? `${diffYears}y ${remainingMonths}mo` : `${diffYears}y`;
177
+ }
178
+ // For dates > 30 days, show just days
179
+ if (diffDays > 30) {
180
+ return `${diffDays}d`;
181
+ }
182
+ // For dates with days remaining, show days and hours
183
+ if (diffDays > 0) {
184
+ const remainingHours = diffHours % 24;
185
+ return `${diffDays}d ${remainingHours}h`;
186
+ }
187
+ // For dates with hours remaining, show hours and minutes
188
+ if (diffHours > 0) {
189
+ const remainingMins = diffMins % 60;
190
+ return `${diffHours}h ${remainingMins}m`;
191
+ }
192
+ // Just minutes
193
+ return `${diffMins}m`;
194
+ }
195
+ /**
196
+ * Calculate spread between best bid and best ask
197
+ *
198
+ * @param bestBid - Best (highest) bid price
199
+ * @param bestAsk - Best (lowest) ask price
200
+ * @returns Spread in cents, or null if either price is missing
201
+ *
202
+ * @example
203
+ * ```ts
204
+ * calculateSpread(48, 52) // 4
205
+ * calculateSpread(null, 52) // null
206
+ * ```
207
+ */
208
+ export function calculateSpread(bestBid, bestAsk) {
209
+ if (bestBid == null || bestAsk == null)
210
+ return null;
211
+ return bestAsk - bestBid;
212
+ }
86
213
  /**
87
214
  * Truncate a string to a maximum length with ellipsis
215
+ *
216
+ * @param str - String to truncate
217
+ * @param maxLength - Maximum length including ellipsis
218
+ * @returns Truncated string with "…" if needed
219
+ *
220
+ * @example
221
+ * ```ts
222
+ * truncate("Hello World", 8) // "Hello W…"
223
+ * truncate("Hi", 8) // "Hi"
224
+ * ```
88
225
  */
89
226
  export function truncate(str, maxLength) {
90
227
  if (str.length <= maxLength) {
@@ -94,6 +231,18 @@ export function truncate(str, maxLength) {
94
231
  }
95
232
  /**
96
233
  * Pad a string to a fixed width (left or right aligned)
234
+ *
235
+ * @param str - String to pad
236
+ * @param width - Target width
237
+ * @param align - Alignment direction ("left" adds padding right, "right" adds padding left)
238
+ * @returns Padded string, truncated if longer than width
239
+ *
240
+ * @example
241
+ * ```ts
242
+ * padString("Hi", 5, "left") // "Hi "
243
+ * padString("Hi", 5, "right") // " Hi"
244
+ * padString("Hello World", 5) // "Hello"
245
+ * ```
97
246
  */
98
247
  export function padString(str, width, align = "left") {
99
248
  if (str.length >= width) {
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { describe, it, expect } from "vitest";
2
- import { formatPrice, formatCurrency, formatPercent, formatPriceChange, formatCompactNumber, truncate, padString, } from "./format.js";
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
+ import { formatPrice, formatCurrency, formatPercent, formatPriceChange, formatCompactNumber, formatRelativeTime, formatExpiry, calculateSpread, truncate, padString, } from "./format.js";
3
3
  describe("formatPrice", () => {
4
4
  it("formats cents with cent symbol", () => {
5
5
  expect(formatPrice(45)).toBe("45¢");
@@ -87,4 +87,109 @@ describe("padString", () => {
87
87
  expect(padString("Hello World", 5)).toBe("Hello");
88
88
  });
89
89
  });
90
+ describe("formatRelativeTime", () => {
91
+ beforeEach(() => {
92
+ vi.useFakeTimers();
93
+ vi.setSystemTime(new Date('2025-06-15T12:00:00Z'));
94
+ });
95
+ afterEach(() => {
96
+ vi.useRealTimers();
97
+ });
98
+ it("returns 'now' for current time", () => {
99
+ expect(formatRelativeTime('2025-06-15T12:00:00Z')).toBe('now');
100
+ expect(formatRelativeTime(new Date('2025-06-15T12:00:30Z'))).toBe('now');
101
+ });
102
+ it("formats past minutes", () => {
103
+ expect(formatRelativeTime('2025-06-15T11:30:00Z')).toBe('30m ago');
104
+ expect(formatRelativeTime('2025-06-15T11:45:00Z')).toBe('15m ago');
105
+ });
106
+ it("formats past hours", () => {
107
+ expect(formatRelativeTime('2025-06-15T09:00:00Z')).toBe('3h ago');
108
+ expect(formatRelativeTime('2025-06-15T06:00:00Z')).toBe('6h ago');
109
+ });
110
+ it("formats past days", () => {
111
+ expect(formatRelativeTime('2025-06-13T12:00:00Z')).toBe('2d ago');
112
+ expect(formatRelativeTime('2025-06-10T12:00:00Z')).toBe('5d ago');
113
+ });
114
+ it("formats future minutes", () => {
115
+ expect(formatRelativeTime('2025-06-15T12:30:00Z')).toBe('in 30m');
116
+ expect(formatRelativeTime('2025-06-15T12:15:00Z')).toBe('in 15m');
117
+ });
118
+ it("formats future hours", () => {
119
+ expect(formatRelativeTime('2025-06-15T15:00:00Z')).toBe('in 3h');
120
+ expect(formatRelativeTime('2025-06-15T18:00:00Z')).toBe('in 6h');
121
+ });
122
+ it("formats future days", () => {
123
+ expect(formatRelativeTime('2025-06-17T12:00:00Z')).toBe('in 2d');
124
+ expect(formatRelativeTime('2025-06-20T12:00:00Z')).toBe('in 5d');
125
+ });
126
+ it("accepts Date objects", () => {
127
+ expect(formatRelativeTime(new Date('2025-06-15T11:00:00Z'))).toBe('1h ago');
128
+ expect(formatRelativeTime(new Date('2025-06-16T12:00:00Z'))).toBe('in 1d');
129
+ });
130
+ });
131
+ describe("formatExpiry", () => {
132
+ beforeEach(() => {
133
+ vi.useFakeTimers();
134
+ vi.setSystemTime(new Date('2025-06-15T12:00:00Z'));
135
+ });
136
+ afterEach(() => {
137
+ vi.useRealTimers();
138
+ });
139
+ it("returns empty string for undefined", () => {
140
+ expect(formatExpiry(undefined)).toBe('');
141
+ });
142
+ it("returns CLOSED for past dates", () => {
143
+ expect(formatExpiry('2025-06-14T12:00:00Z')).toBe('CLOSED');
144
+ expect(formatExpiry('2020-01-01T00:00:00Z')).toBe('CLOSED');
145
+ });
146
+ it("formats minutes", () => {
147
+ expect(formatExpiry('2025-06-15T12:30:00Z')).toBe('30m');
148
+ expect(formatExpiry('2025-06-15T12:45:00Z')).toBe('45m');
149
+ });
150
+ it("formats hours and minutes", () => {
151
+ expect(formatExpiry('2025-06-15T15:30:00Z')).toBe('3h 30m');
152
+ expect(formatExpiry('2025-06-15T20:00:00Z')).toBe('8h 0m');
153
+ });
154
+ it("formats days and hours", () => {
155
+ expect(formatExpiry('2025-06-17T12:00:00Z')).toBe('2d 0h');
156
+ expect(formatExpiry('2025-06-20T18:00:00Z')).toBe('5d 6h');
157
+ });
158
+ it("formats just days for >30 days", () => {
159
+ expect(formatExpiry('2025-08-15T12:00:00Z')).toBe('61d');
160
+ expect(formatExpiry('2025-10-15T12:00:00Z')).toBe('122d');
161
+ });
162
+ it("formats years and months", () => {
163
+ expect(formatExpiry('2026-06-15T12:00:00Z')).toBe('1y');
164
+ expect(formatExpiry('2027-09-15T12:00:00Z')).toBe('2y 3mo');
165
+ });
166
+ it("returns distant for >10 years", () => {
167
+ expect(formatExpiry('2036-06-15T12:00:00Z')).toBe('distant');
168
+ expect(formatExpiry('2099-01-01T00:00:00Z')).toBe('distant');
169
+ });
170
+ });
171
+ describe("calculateSpread", () => {
172
+ it("calculates spread correctly", () => {
173
+ expect(calculateSpread(48, 52)).toBe(4);
174
+ expect(calculateSpread(45, 55)).toBe(10);
175
+ expect(calculateSpread(50, 51)).toBe(1);
176
+ });
177
+ it("returns null for null bid", () => {
178
+ expect(calculateSpread(null, 52)).toBeNull();
179
+ });
180
+ it("returns null for null ask", () => {
181
+ expect(calculateSpread(48, null)).toBeNull();
182
+ });
183
+ it("returns null for undefined values", () => {
184
+ expect(calculateSpread(undefined, 52)).toBeNull();
185
+ expect(calculateSpread(48, undefined)).toBeNull();
186
+ expect(calculateSpread(undefined, undefined)).toBeNull();
187
+ });
188
+ it("handles zero spread", () => {
189
+ expect(calculateSpread(50, 50)).toBe(0);
190
+ });
191
+ it("handles negative spread (crossed market)", () => {
192
+ expect(calculateSpread(52, 48)).toBe(-4);
193
+ });
194
+ });
90
195
  //# sourceMappingURL=format.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"format.test.js","sourceRoot":"","sources":["../src/format.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,WAAW,EACX,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,mBAAmB,EACnB,QAAQ,EACR,SAAS,GACV,MAAM,aAAa,CAAC;AAErB,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpD,MAAM,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpD,MAAM,CAAC,QAAQ,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"format.test.js","sourceRoot":"","sources":["../src/format.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EACL,WAAW,EACX,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,QAAQ,EACR,SAAS,GACV,MAAM,aAAa,CAAC;AAErB,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpD,MAAM,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpD,MAAM,CAAC,QAAQ,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,EAAE,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/D,MAAM,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnE,MAAM,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,MAAM,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClE,MAAM,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClE,MAAM,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClE,MAAM,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjE,MAAM,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,MAAM,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjE,MAAM,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5E,MAAM,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,EAAE,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5D,MAAM,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iBAAiB,EAAE,GAAG,EAAE;QACzB,MAAM,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzD,MAAM,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5D,MAAM,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3D,MAAM,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzD,MAAM,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7D,MAAM,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,eAAe,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAClD,MAAM,CAAC,eAAe,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAClD,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,MAAM,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -4,8 +4,11 @@
4
4
  * Shared utilities for Kalshi prediction market tools.
5
5
  */
6
6
  export { type KalshiConfig, DEFAULT_BASE_PATH, DEMO_BASE_PATH, getKalshiConfig, createSdkConfig, createMarketApi, createPortfolioApi, createOrdersApi, createEventsApi, } from "./config.js";
7
- export { formatPrice, formatCurrency, formatPercent, formatPriceChange, formatCompactNumber, formatRelativeTime, truncate, padString, } from "./format.js";
7
+ export { formatPrice, formatCurrency, formatPercent, formatPriceChange, formatCompactNumber, formatRelativeTime, formatExpiry, calculateSpread, truncate, padString, } from "./format.js";
8
+ export { getCached, setCache, clearCache, clearAllCache, getCacheStats, CACHE_TTL, } from "./cache.js";
9
+ export { createRateLimiter, isRateLimitError, type RateLimiter, type RateLimiterConfig, type RateLimiterState, } from "./rate-limiter.js";
8
10
  export * from "./types.js";
9
11
  export { withTimeout, TimeoutError } from "./with-timeout.js";
10
12
  export { validateOrder, type OrderValidationInput, type OrderValidationResult, } from "./validate-order.js";
13
+ export { KalshiWsClient, generateWsAuthHeaders, generateSignedWsUrl, type KalshiWsConfig, type KalshiWsEventHandlers, type SubscriptionChannel, type ConnectionState, type ActiveSubscriptions, type OrderbookDeltaMessage, type TickerMessage, type TradeMessage, type FillMessage, type WsMessage, WS_ENDPOINTS, } from "./websocket/index.js";
11
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,KAAK,YAAY,EACjB,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,eAAe,GAChB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,WAAW,EACX,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,QAAQ,EACR,SAAS,GACV,MAAM,aAAa,CAAC;AAGrB,cAAc,YAAY,CAAC;AAG3B,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAG9D,OAAO,EACL,aAAa,EACb,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,GAC3B,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,KAAK,YAAY,EACjB,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,eAAe,GAChB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,WAAW,EACX,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,QAAQ,EACR,SAAS,GACV,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,SAAS,EACT,QAAQ,EACR,UAAU,EACV,aAAa,EACb,aAAa,EACb,SAAS,GACV,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,mBAAmB,CAAC;AAG3B,cAAc,YAAY,CAAC;AAG3B,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAG9D,OAAO,EACL,aAAa,EACb,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,GAC3B,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,YAAY,GACb,MAAM,sBAAsB,CAAC"}
package/dist/index.js CHANGED
@@ -6,11 +6,17 @@
6
6
  // Configuration
7
7
  export { DEFAULT_BASE_PATH, DEMO_BASE_PATH, getKalshiConfig, createSdkConfig, createMarketApi, createPortfolioApi, createOrdersApi, createEventsApi, } from "./config.js";
8
8
  // Formatting utilities
9
- export { formatPrice, formatCurrency, formatPercent, formatPriceChange, formatCompactNumber, formatRelativeTime, truncate, padString, } from "./format.js";
9
+ export { formatPrice, formatCurrency, formatPercent, formatPriceChange, formatCompactNumber, formatRelativeTime, formatExpiry, calculateSpread, truncate, padString, } from "./format.js";
10
+ // Cache utilities
11
+ export { getCached, setCache, clearCache, clearAllCache, getCacheStats, CACHE_TTL, } from "./cache.js";
12
+ // Rate limiting
13
+ export { createRateLimiter, isRateLimitError, } from "./rate-limiter.js";
10
14
  // Types
11
15
  export * from "./types.js";
12
16
  // Utilities
13
17
  export { withTimeout, TimeoutError } from "./with-timeout.js";
14
18
  // Validation
15
19
  export { validateOrder, } from "./validate-order.js";
20
+ // WebSocket (real-time data)
21
+ export { KalshiWsClient, generateWsAuthHeaders, generateSignedWsUrl, WS_ENDPOINTS, } from "./websocket/index.js";
16
22
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,gBAAgB;AAChB,OAAO,EAEL,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,uBAAuB;AACvB,OAAO,EACL,WAAW,EACX,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,QAAQ,EACR,SAAS,GACV,MAAM,aAAa,CAAC;AAErB,QAAQ;AACR,cAAc,YAAY,CAAC;AAE3B,YAAY;AACZ,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE9D,aAAa;AACb,OAAO,EACL,aAAa,GAGd,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,gBAAgB;AAChB,OAAO,EAEL,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,uBAAuB;AACvB,OAAO,EACL,WAAW,EACX,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,QAAQ,EACR,SAAS,GACV,MAAM,aAAa,CAAC;AAErB,kBAAkB;AAClB,OAAO,EACL,SAAS,EACT,QAAQ,EACR,UAAU,EACV,aAAa,EACb,aAAa,EACb,SAAS,GACV,MAAM,YAAY,CAAC;AAEpB,gBAAgB;AAChB,OAAO,EACL,iBAAiB,EACjB,gBAAgB,GAIjB,MAAM,mBAAmB,CAAC;AAE3B,QAAQ;AACR,cAAc,YAAY,CAAC;AAE3B,YAAY;AACZ,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE9D,aAAa;AACb,OAAO,EACL,aAAa,GAGd,MAAM,qBAAqB,CAAC;AAE7B,6BAA6B;AAC7B,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EAWnB,YAAY,GACb,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Rate Limiter
3
+ *
4
+ * Implements exponential backoff and circuit breaker patterns
5
+ * for handling API rate limits gracefully.
6
+ */
7
+ export interface RateLimiterConfig {
8
+ /** Minimum interval between requests in ms (default: 1000) */
9
+ minInterval: number;
10
+ /** Maximum interval between requests in ms (default: 60000) */
11
+ maxInterval: number;
12
+ /** Multiplier for exponential backoff (default: 2) */
13
+ backoffMultiplier: number;
14
+ /** Number of consecutive failures before circuit opens (default: 5) */
15
+ circuitBreakerThreshold: number;
16
+ /** Time to wait before attempting to close circuit in ms (default: 30000) */
17
+ circuitResetTimeout: number;
18
+ }
19
+ export interface RateLimiterState {
20
+ /** Current interval between requests */
21
+ currentInterval: number;
22
+ /** Number of consecutive failures */
23
+ consecutiveFailures: number;
24
+ /** Whether the circuit breaker is open (blocking requests) */
25
+ isCircuitOpen: boolean;
26
+ /** Whether rate limiting is active */
27
+ isRateLimited: boolean;
28
+ /** Timestamp of last successful request */
29
+ lastSuccessTime: number;
30
+ /** Timestamp of last failure */
31
+ lastFailureTime: number;
32
+ }
33
+ /**
34
+ * Create a rate limiter instance
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * const limiter = createRateLimiter();
39
+ *
40
+ * async function fetchData() {
41
+ * if (limiter.shouldBlock()) {
42
+ * return; // Skip request
43
+ * }
44
+ *
45
+ * try {
46
+ * const data = await api.getData();
47
+ * limiter.recordSuccess();
48
+ * return data;
49
+ * } catch (err) {
50
+ * if (isRateLimitError(err)) {
51
+ * limiter.recordRateLimitError();
52
+ * } else {
53
+ * limiter.recordFailure();
54
+ * }
55
+ * throw err;
56
+ * }
57
+ * }
58
+ * ```
59
+ */
60
+ export declare function createRateLimiter(config?: Partial<RateLimiterConfig>): {
61
+ shouldBlock: () => boolean;
62
+ getCurrentInterval: () => number;
63
+ getState: () => Readonly<RateLimiterState>;
64
+ recordSuccess: () => void;
65
+ recordRateLimitError: () => void;
66
+ recordFailure: () => void;
67
+ reset: () => void;
68
+ };
69
+ /**
70
+ * Type for the rate limiter instance
71
+ */
72
+ export type RateLimiter = ReturnType<typeof createRateLimiter>;
73
+ /**
74
+ * Check if an error is a rate limit error (HTTP 429)
75
+ *
76
+ * @param error - Error to check
77
+ * @returns true if the error is a rate limit error
78
+ */
79
+ export declare function isRateLimitError(error: unknown): boolean;
80
+ //# sourceMappingURL=rate-limiter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../src/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,iBAAiB;IAChC,8DAA8D;IAC9D,WAAW,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,WAAW,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,uEAAuE;IACvE,uBAAuB,EAAE,MAAM,CAAC;IAChC,6EAA6E;IAC7E,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,eAAe,EAAE,MAAM,CAAC;IACxB,qCAAqC;IACrC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,8DAA8D;IAC9D,aAAa,EAAE,OAAO,CAAC;IACvB,sCAAsC;IACtC,aAAa,EAAE,OAAO,CAAC;IACvB,2CAA2C;IAC3C,eAAe,EAAE,MAAM,CAAC;IACxB,gCAAgC;IAChC,eAAe,EAAE,MAAM,CAAC;CACzB;AAUD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,GAAE,OAAO,CAAC,iBAAiB,CAAM;uBAiB/C,OAAO;8BAOA,MAAM;oBAOhB,QAAQ,CAAC,gBAAgB,CAAC;yBAOrB,IAAI;gCAmBG,IAAI;yBAoBX,IAAI;iBA8BZ,IAAI;EAyBvB;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE/D;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAmBxD"}