@chaindex/priorityfee 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +585 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +505 -0
- package/dist/index.d.ts +505 -0
- package/dist/index.mjs +553 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +36 -0
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,553 @@
|
|
|
1
|
+
// src/types/errors.ts
|
|
2
|
+
var SdkError = class extends Error {
|
|
3
|
+
constructor(message) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = "SdkError";
|
|
6
|
+
}
|
|
7
|
+
};
|
|
8
|
+
var ApiError = class extends SdkError {
|
|
9
|
+
constructor(status, message, body) {
|
|
10
|
+
super(message);
|
|
11
|
+
this.name = "ApiError";
|
|
12
|
+
this.status = status;
|
|
13
|
+
this.body = body;
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// src/transport/http.ts
|
|
18
|
+
var HttpTransport = class {
|
|
19
|
+
constructor(options) {
|
|
20
|
+
this.baseUrl = options.baseUrl.replace(/\/+$/, "");
|
|
21
|
+
this.apiKey = options.apiKey;
|
|
22
|
+
this.token = options.token;
|
|
23
|
+
this.fetch = options.fetch ?? globalThis.fetch.bind(globalThis);
|
|
24
|
+
}
|
|
25
|
+
setToken(token) {
|
|
26
|
+
this.token = token;
|
|
27
|
+
}
|
|
28
|
+
clearToken() {
|
|
29
|
+
this.token = void 0;
|
|
30
|
+
}
|
|
31
|
+
async get(path, params) {
|
|
32
|
+
const url = this.buildUrl(path, params);
|
|
33
|
+
return this.request(url, { method: "GET" });
|
|
34
|
+
}
|
|
35
|
+
async post(path, body) {
|
|
36
|
+
const url = this.buildUrl(path);
|
|
37
|
+
return this.request(url, {
|
|
38
|
+
method: "POST",
|
|
39
|
+
headers: { "Content-Type": "application/json" },
|
|
40
|
+
body: body !== void 0 ? JSON.stringify(body) : void 0
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
async delete(path) {
|
|
44
|
+
const url = this.buildUrl(path);
|
|
45
|
+
return this.request(url, { method: "DELETE" });
|
|
46
|
+
}
|
|
47
|
+
buildUrl(path, params) {
|
|
48
|
+
const url = new URL(`${this.baseUrl}${path}`);
|
|
49
|
+
if (params) {
|
|
50
|
+
for (const [key, value] of Object.entries(params)) {
|
|
51
|
+
if (value !== void 0) {
|
|
52
|
+
url.searchParams.set(key, value);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return url.toString();
|
|
57
|
+
}
|
|
58
|
+
async request(url, init) {
|
|
59
|
+
const headers = new Headers(init.headers);
|
|
60
|
+
if (this.token) {
|
|
61
|
+
headers.set("Authorization", `Bearer ${this.token}`);
|
|
62
|
+
}
|
|
63
|
+
if (this.apiKey) {
|
|
64
|
+
headers.set("X-API-Key", this.apiKey);
|
|
65
|
+
}
|
|
66
|
+
let response;
|
|
67
|
+
try {
|
|
68
|
+
response = await this.fetch(url, { ...init, headers });
|
|
69
|
+
} catch (err) {
|
|
70
|
+
throw new SdkError(
|
|
71
|
+
`Network error: ${err instanceof Error ? err.message : String(err)}`
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
if (!response.ok) {
|
|
75
|
+
let body;
|
|
76
|
+
try {
|
|
77
|
+
body = await response.json();
|
|
78
|
+
} catch {
|
|
79
|
+
body = await response.text().catch(() => void 0);
|
|
80
|
+
}
|
|
81
|
+
const message = body && typeof body === "object" && "error" in body ? String(body.error) : `HTTP ${response.status}`;
|
|
82
|
+
throw new ApiError(response.status, message, body);
|
|
83
|
+
}
|
|
84
|
+
return await response.json();
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
// src/resources/block.ts
|
|
89
|
+
var BlockResource = class {
|
|
90
|
+
constructor(transport) {
|
|
91
|
+
this.transport = transport;
|
|
92
|
+
}
|
|
93
|
+
async get(params) {
|
|
94
|
+
return this.transport.get("/v1/block", serializeBlockParams(params));
|
|
95
|
+
}
|
|
96
|
+
async getFee(params) {
|
|
97
|
+
return this.transport.get("/v1/block/fee", serializeBlockParams(params));
|
|
98
|
+
}
|
|
99
|
+
async getPrice(params) {
|
|
100
|
+
return this.transport.get("/v1/block/price", serializeBlockParams(params));
|
|
101
|
+
}
|
|
102
|
+
async getLimit(params) {
|
|
103
|
+
return this.transport.get("/v1/block/limit", serializeBlockParams(params));
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
function serializeBlockParams(params) {
|
|
107
|
+
if (!params) return void 0;
|
|
108
|
+
return {
|
|
109
|
+
limit: params.limit?.toString(),
|
|
110
|
+
detail: params.detail,
|
|
111
|
+
percentiles: params.percentiles?.join(",")
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// src/resources/rolling.ts
|
|
116
|
+
var RollingResource = class {
|
|
117
|
+
constructor(transport) {
|
|
118
|
+
this.transport = transport;
|
|
119
|
+
}
|
|
120
|
+
async get(params) {
|
|
121
|
+
return this.transport.get("/v1/rolling", serializeRollingParams(params));
|
|
122
|
+
}
|
|
123
|
+
async getFee(params) {
|
|
124
|
+
return this.transport.get("/v1/rolling/fee", serializeRollingParams(params));
|
|
125
|
+
}
|
|
126
|
+
async getPrice(params) {
|
|
127
|
+
return this.transport.get("/v1/rolling/price", serializeRollingParams(params));
|
|
128
|
+
}
|
|
129
|
+
async getLimit(params) {
|
|
130
|
+
return this.transport.get("/v1/rolling/limit", serializeRollingParams(params));
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
function serializeRollingParams(params) {
|
|
134
|
+
if (!params) return void 0;
|
|
135
|
+
return {
|
|
136
|
+
duration: params.duration,
|
|
137
|
+
detail: params.detail,
|
|
138
|
+
percentiles: params.percentiles?.join(",")
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// src/resources/tumbling.ts
|
|
143
|
+
var TumblingResource = class {
|
|
144
|
+
constructor(transport) {
|
|
145
|
+
this.transport = transport;
|
|
146
|
+
}
|
|
147
|
+
async get(params) {
|
|
148
|
+
return this.transport.get("/v1/tumbling", serializeTumblingParams(params));
|
|
149
|
+
}
|
|
150
|
+
async getFee(params) {
|
|
151
|
+
return this.transport.get("/v1/tumbling/fee", serializeTumblingParams(params));
|
|
152
|
+
}
|
|
153
|
+
async getPrice(params) {
|
|
154
|
+
return this.transport.get("/v1/tumbling/price", serializeTumblingParams(params));
|
|
155
|
+
}
|
|
156
|
+
async getLimit(params) {
|
|
157
|
+
return this.transport.get("/v1/tumbling/limit", serializeTumblingParams(params));
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
function serializeTumblingParams(params) {
|
|
161
|
+
if (!params) return void 0;
|
|
162
|
+
return {
|
|
163
|
+
duration: params.duration,
|
|
164
|
+
limit: params.limit?.toString(),
|
|
165
|
+
detail: params.detail,
|
|
166
|
+
percentiles: params.percentiles?.join(",")
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// src/resources/demo.ts
|
|
171
|
+
var DemoResource = class {
|
|
172
|
+
constructor(transport) {
|
|
173
|
+
this.transport = transport;
|
|
174
|
+
}
|
|
175
|
+
async get() {
|
|
176
|
+
return this.transport.get("/v1/demo");
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
// src/resources/auth.ts
|
|
181
|
+
var AuthResource = class {
|
|
182
|
+
constructor(transport) {
|
|
183
|
+
this.transport = transport;
|
|
184
|
+
}
|
|
185
|
+
async verify(request) {
|
|
186
|
+
return this.transport.post("/v1/auth/siws/verify", request);
|
|
187
|
+
}
|
|
188
|
+
async me() {
|
|
189
|
+
return this.transport.get("/v1/auth/me");
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
// src/resources/keys.ts
|
|
194
|
+
var KeysResource = class {
|
|
195
|
+
constructor(transport) {
|
|
196
|
+
this.transport = transport;
|
|
197
|
+
}
|
|
198
|
+
async create(name) {
|
|
199
|
+
return this.transport.post("/v1/keys", { name });
|
|
200
|
+
}
|
|
201
|
+
async list() {
|
|
202
|
+
return this.transport.get("/v1/keys");
|
|
203
|
+
}
|
|
204
|
+
async delete(id) {
|
|
205
|
+
return this.transport.delete(`/v1/keys/${encodeURIComponent(id)}`);
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
// src/resources/usage.ts
|
|
210
|
+
var UsageResource = class {
|
|
211
|
+
constructor(transport) {
|
|
212
|
+
this.transport = transport;
|
|
213
|
+
}
|
|
214
|
+
async get() {
|
|
215
|
+
return this.transport.get("/v1/usage");
|
|
216
|
+
}
|
|
217
|
+
async getDetailed(params) {
|
|
218
|
+
return this.transport.get("/v1/usage/detailed", {
|
|
219
|
+
resolution: params.resolution,
|
|
220
|
+
start: params.start?.toString(),
|
|
221
|
+
end: params.end?.toString(),
|
|
222
|
+
api_key_id: params.api_key_id
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
// src/resources/health.ts
|
|
228
|
+
var HealthResource = class {
|
|
229
|
+
constructor(transport) {
|
|
230
|
+
this.transport = transport;
|
|
231
|
+
}
|
|
232
|
+
async check() {
|
|
233
|
+
return this.transport.get("/v1/health");
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
// src/http-client.ts
|
|
238
|
+
var HttpClient = class {
|
|
239
|
+
constructor(options) {
|
|
240
|
+
this.transport = new HttpTransport(options);
|
|
241
|
+
this.block = new BlockResource(this.transport);
|
|
242
|
+
this.rolling = new RollingResource(this.transport);
|
|
243
|
+
this.tumbling = new TumblingResource(this.transport);
|
|
244
|
+
this.demo = new DemoResource(this.transport);
|
|
245
|
+
this.auth = new AuthResource(this.transport);
|
|
246
|
+
this.keys = new KeysResource(this.transport);
|
|
247
|
+
this.usage = new UsageResource(this.transport);
|
|
248
|
+
this.health = new HealthResource(this.transport);
|
|
249
|
+
}
|
|
250
|
+
setToken(token) {
|
|
251
|
+
this.transport.setToken(token);
|
|
252
|
+
}
|
|
253
|
+
clearToken() {
|
|
254
|
+
this.transport.clearToken();
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
|
|
258
|
+
// src/transport/ws.ts
|
|
259
|
+
var WsTransport = class {
|
|
260
|
+
constructor(options) {
|
|
261
|
+
this.ws = null;
|
|
262
|
+
this._state = "disconnected";
|
|
263
|
+
this.disposed = false;
|
|
264
|
+
this.reconnectAttempt = 0;
|
|
265
|
+
this.reconnectTimer = null;
|
|
266
|
+
this.pingTimer = null;
|
|
267
|
+
this.pongTimer = null;
|
|
268
|
+
this.listeners = /* @__PURE__ */ new Map();
|
|
269
|
+
const base = options.baseUrl.replace(/^http/, "ws").replace(/\/+$/, "");
|
|
270
|
+
this.url = `${base}/v1/ws?api_key=${encodeURIComponent(options.apiKey)}`;
|
|
271
|
+
this.reconnect = options.reconnect ?? true;
|
|
272
|
+
this.maxReconnectAttempts = options.maxReconnectAttempts ?? 10;
|
|
273
|
+
this.reconnectDelay = options.reconnectDelay ?? 1e3;
|
|
274
|
+
this.pingInterval = options.pingInterval ?? 3e4;
|
|
275
|
+
this.WsCtor = options.WebSocket ?? WebSocket;
|
|
276
|
+
}
|
|
277
|
+
get state() {
|
|
278
|
+
return this._state;
|
|
279
|
+
}
|
|
280
|
+
connect() {
|
|
281
|
+
this.disposed = false;
|
|
282
|
+
if (this.ws) return;
|
|
283
|
+
this.setState("connecting");
|
|
284
|
+
const ws = new this.WsCtor(this.url);
|
|
285
|
+
ws.onopen = () => {
|
|
286
|
+
this.reconnectAttempt = 0;
|
|
287
|
+
this.setState("connected");
|
|
288
|
+
this.startPing();
|
|
289
|
+
this.emit("open");
|
|
290
|
+
};
|
|
291
|
+
ws.onclose = (e) => {
|
|
292
|
+
this.stopPing();
|
|
293
|
+
this.ws = null;
|
|
294
|
+
this.emit("close", e.code, e.reason);
|
|
295
|
+
if (!this.disposed && this.reconnect) {
|
|
296
|
+
this.scheduleReconnect();
|
|
297
|
+
} else {
|
|
298
|
+
this.setState("disconnected");
|
|
299
|
+
}
|
|
300
|
+
};
|
|
301
|
+
ws.onerror = (e) => {
|
|
302
|
+
this.emit("error", e);
|
|
303
|
+
};
|
|
304
|
+
ws.onmessage = (e) => {
|
|
305
|
+
this.handleMessage(e.data);
|
|
306
|
+
};
|
|
307
|
+
this.ws = ws;
|
|
308
|
+
}
|
|
309
|
+
disconnect() {
|
|
310
|
+
this.disposed = true;
|
|
311
|
+
this.clearReconnectTimer();
|
|
312
|
+
this.stopPing();
|
|
313
|
+
if (this.ws) {
|
|
314
|
+
this.ws.onclose = null;
|
|
315
|
+
this.ws.onerror = null;
|
|
316
|
+
this.ws.onmessage = null;
|
|
317
|
+
this.ws.onopen = null;
|
|
318
|
+
this.ws.close(1e3);
|
|
319
|
+
this.ws = null;
|
|
320
|
+
}
|
|
321
|
+
this.setState("disconnected");
|
|
322
|
+
}
|
|
323
|
+
send(msg) {
|
|
324
|
+
if (this.ws && this.ws.readyState === WebSocket.OPEN) {
|
|
325
|
+
this.ws.send(JSON.stringify(msg));
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
on(event, fn) {
|
|
329
|
+
let set = this.listeners.get(event);
|
|
330
|
+
if (!set) {
|
|
331
|
+
set = /* @__PURE__ */ new Set();
|
|
332
|
+
this.listeners.set(event, set);
|
|
333
|
+
}
|
|
334
|
+
set.add(fn);
|
|
335
|
+
}
|
|
336
|
+
off(event, fn) {
|
|
337
|
+
this.listeners.get(event)?.delete(fn);
|
|
338
|
+
}
|
|
339
|
+
// --- Private ---
|
|
340
|
+
emit(event, ...args) {
|
|
341
|
+
const set = this.listeners.get(event);
|
|
342
|
+
if (!set) return;
|
|
343
|
+
for (const fn of set) {
|
|
344
|
+
fn(...args);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
setState(s) {
|
|
348
|
+
if (this._state === s) return;
|
|
349
|
+
this._state = s;
|
|
350
|
+
this.emit("stateChange", s);
|
|
351
|
+
}
|
|
352
|
+
handleMessage(raw) {
|
|
353
|
+
let msg;
|
|
354
|
+
try {
|
|
355
|
+
msg = JSON.parse(raw);
|
|
356
|
+
} catch {
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
if (msg.type === "pong") {
|
|
360
|
+
this.clearPongTimer();
|
|
361
|
+
}
|
|
362
|
+
this.emit("message", msg);
|
|
363
|
+
}
|
|
364
|
+
startPing() {
|
|
365
|
+
this.stopPing();
|
|
366
|
+
this.pingTimer = setInterval(() => {
|
|
367
|
+
this.send({ type: "ping" });
|
|
368
|
+
this.pongTimer = setTimeout(() => {
|
|
369
|
+
if (this.ws) {
|
|
370
|
+
this.ws.close(4e3, "pong timeout");
|
|
371
|
+
}
|
|
372
|
+
}, 1e4);
|
|
373
|
+
}, this.pingInterval);
|
|
374
|
+
}
|
|
375
|
+
stopPing() {
|
|
376
|
+
if (this.pingTimer !== null) {
|
|
377
|
+
clearInterval(this.pingTimer);
|
|
378
|
+
this.pingTimer = null;
|
|
379
|
+
}
|
|
380
|
+
this.clearPongTimer();
|
|
381
|
+
}
|
|
382
|
+
clearPongTimer() {
|
|
383
|
+
if (this.pongTimer !== null) {
|
|
384
|
+
clearTimeout(this.pongTimer);
|
|
385
|
+
this.pongTimer = null;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
scheduleReconnect() {
|
|
389
|
+
if (this.reconnectAttempt >= this.maxReconnectAttempts) {
|
|
390
|
+
this.setState("disconnected");
|
|
391
|
+
return;
|
|
392
|
+
}
|
|
393
|
+
this.setState("reconnecting");
|
|
394
|
+
const delay = Math.min(this.reconnectDelay * Math.pow(2, this.reconnectAttempt), 3e4);
|
|
395
|
+
const jitter = Math.random() * delay * 0.2;
|
|
396
|
+
this.reconnectAttempt++;
|
|
397
|
+
this.reconnectTimer = setTimeout(() => {
|
|
398
|
+
this.reconnectTimer = null;
|
|
399
|
+
this.connect();
|
|
400
|
+
}, delay + jitter);
|
|
401
|
+
}
|
|
402
|
+
clearReconnectTimer() {
|
|
403
|
+
if (this.reconnectTimer !== null) {
|
|
404
|
+
clearTimeout(this.reconnectTimer);
|
|
405
|
+
this.reconnectTimer = null;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
};
|
|
409
|
+
|
|
410
|
+
// src/ws-client.ts
|
|
411
|
+
var WsClient = class {
|
|
412
|
+
constructor(options) {
|
|
413
|
+
this.active = /* @__PURE__ */ new Map();
|
|
414
|
+
this.pending = [];
|
|
415
|
+
this.transport = new WsTransport(options);
|
|
416
|
+
this.transport.on("message", (msg) => this.handleMessage(msg));
|
|
417
|
+
this.transport.on("open", () => this.handleReconnect());
|
|
418
|
+
if (options.autoConnect !== false) {
|
|
419
|
+
this.transport.connect();
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
get state() {
|
|
423
|
+
return this.transport.state;
|
|
424
|
+
}
|
|
425
|
+
connect() {
|
|
426
|
+
this.transport.connect();
|
|
427
|
+
}
|
|
428
|
+
disconnect() {
|
|
429
|
+
this.transport.disconnect();
|
|
430
|
+
for (const p of this.pending) {
|
|
431
|
+
p.reject(new Error("Client disconnected"));
|
|
432
|
+
}
|
|
433
|
+
this.pending.length = 0;
|
|
434
|
+
this.active.clear();
|
|
435
|
+
}
|
|
436
|
+
on(event, fn) {
|
|
437
|
+
this.transport.on(event, fn);
|
|
438
|
+
}
|
|
439
|
+
off(event, fn) {
|
|
440
|
+
this.transport.off(event, fn);
|
|
441
|
+
}
|
|
442
|
+
subscribeBlock(params, handlers) {
|
|
443
|
+
return this.subscribe({ channel: { type: "block", ...params } }, "block", handlers);
|
|
444
|
+
}
|
|
445
|
+
subscribeRolling(params, handlers) {
|
|
446
|
+
return this.subscribe({ channel: { type: "rolling", ...params } }, "rolling", handlers);
|
|
447
|
+
}
|
|
448
|
+
subscribeDemo(handlers) {
|
|
449
|
+
return this.subscribe({ channel: { type: "demo" } }, "demo", handlers);
|
|
450
|
+
}
|
|
451
|
+
subscribe(params, channel, handlers) {
|
|
452
|
+
return new Promise((resolve, reject) => {
|
|
453
|
+
this.pending.push({
|
|
454
|
+
resolve,
|
|
455
|
+
reject,
|
|
456
|
+
channel,
|
|
457
|
+
params,
|
|
458
|
+
onData: handlers.onData,
|
|
459
|
+
onError: handlers.onError
|
|
460
|
+
});
|
|
461
|
+
this.transport.send({ type: "subscribe", channel: params.channel });
|
|
462
|
+
});
|
|
463
|
+
}
|
|
464
|
+
handleMessage(msg) {
|
|
465
|
+
switch (msg.type) {
|
|
466
|
+
case "subscribed":
|
|
467
|
+
this.handleSubscribed(msg);
|
|
468
|
+
break;
|
|
469
|
+
case "data":
|
|
470
|
+
this.handleData(msg);
|
|
471
|
+
break;
|
|
472
|
+
case "unsubscribed":
|
|
473
|
+
this.active.delete(msg.id);
|
|
474
|
+
break;
|
|
475
|
+
case "error":
|
|
476
|
+
this.handleError(msg);
|
|
477
|
+
break;
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
handleSubscribed(msg) {
|
|
481
|
+
const p = this.pending.shift();
|
|
482
|
+
if (!p) return;
|
|
483
|
+
const entry = {
|
|
484
|
+
channel: p.channel,
|
|
485
|
+
params: p.params,
|
|
486
|
+
onData: p.onData,
|
|
487
|
+
onError: p.onError,
|
|
488
|
+
currentId: msg.id
|
|
489
|
+
};
|
|
490
|
+
this.active.set(msg.id, entry);
|
|
491
|
+
const subscription = {
|
|
492
|
+
get id() {
|
|
493
|
+
return entry.currentId;
|
|
494
|
+
},
|
|
495
|
+
channel: p.channel,
|
|
496
|
+
unsubscribe: () => {
|
|
497
|
+
this.transport.send({ type: "unsubscribe", id: entry.currentId });
|
|
498
|
+
this.active.delete(entry.currentId);
|
|
499
|
+
}
|
|
500
|
+
};
|
|
501
|
+
p.resolve(subscription);
|
|
502
|
+
}
|
|
503
|
+
handleData(msg) {
|
|
504
|
+
const entry = this.active.get(msg.id);
|
|
505
|
+
if (entry) {
|
|
506
|
+
entry.onData(msg.payload);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
handleError(msg) {
|
|
510
|
+
if (msg.id) {
|
|
511
|
+
const entry = this.active.get(msg.id);
|
|
512
|
+
if (entry?.onError) {
|
|
513
|
+
entry.onError(msg);
|
|
514
|
+
}
|
|
515
|
+
} else {
|
|
516
|
+
const p = this.pending.shift();
|
|
517
|
+
if (p) {
|
|
518
|
+
p.reject(new Error(`${msg.code}: ${msg.message}`));
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
handleReconnect() {
|
|
523
|
+
if (this.active.size > 0) {
|
|
524
|
+
const entries = Array.from(this.active.values());
|
|
525
|
+
this.active.clear();
|
|
526
|
+
for (const entry of entries) {
|
|
527
|
+
this.pending.push({
|
|
528
|
+
resolve: (sub) => {
|
|
529
|
+
entry.currentId = sub.id;
|
|
530
|
+
},
|
|
531
|
+
reject: () => {
|
|
532
|
+
},
|
|
533
|
+
channel: entry.channel,
|
|
534
|
+
params: entry.params,
|
|
535
|
+
onData: entry.onData,
|
|
536
|
+
onError: entry.onError
|
|
537
|
+
});
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
for (const p of this.pending) {
|
|
541
|
+
this.transport.send({ type: "subscribe", channel: p.params.channel });
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
};
|
|
545
|
+
export {
|
|
546
|
+
ApiError,
|
|
547
|
+
HttpClient,
|
|
548
|
+
HttpTransport,
|
|
549
|
+
SdkError,
|
|
550
|
+
WsClient,
|
|
551
|
+
WsTransport
|
|
552
|
+
};
|
|
553
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types/errors.ts","../src/transport/http.ts","../src/resources/block.ts","../src/resources/rolling.ts","../src/resources/tumbling.ts","../src/resources/demo.ts","../src/resources/auth.ts","../src/resources/keys.ts","../src/resources/usage.ts","../src/resources/health.ts","../src/http-client.ts","../src/transport/ws.ts","../src/ws-client.ts"],"sourcesContent":["export class SdkError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'SdkError'\n }\n}\n\nexport class ApiError extends SdkError {\n readonly status: number\n readonly body?: unknown\n\n constructor(status: number, message: string, body?: unknown) {\n super(message)\n this.name = 'ApiError'\n this.status = status\n this.body = body\n }\n}\n","import { ApiError, SdkError } from '../types/errors'\n\nexport interface HttpTransportOptions {\n baseUrl: string\n apiKey?: string\n token?: string\n fetch?: typeof globalThis.fetch\n}\n\nexport class HttpTransport {\n private readonly baseUrl: string\n private apiKey?: string\n private token?: string\n private readonly fetch: typeof globalThis.fetch\n\n constructor(options: HttpTransportOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, '')\n this.apiKey = options.apiKey\n this.token = options.token\n this.fetch = options.fetch ?? globalThis.fetch.bind(globalThis)\n }\n\n setToken(token: string): void {\n this.token = token\n }\n\n clearToken(): void {\n this.token = undefined\n }\n\n async get<T>(path: string, params?: Record<string, string | undefined>): Promise<T> {\n const url = this.buildUrl(path, params)\n return this.request<T>(url, { method: 'GET' })\n }\n\n async post<T>(path: string, body?: unknown): Promise<T> {\n const url = this.buildUrl(path)\n return this.request<T>(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: body !== undefined ? JSON.stringify(body) : undefined,\n })\n }\n\n async delete<T>(path: string): Promise<T> {\n const url = this.buildUrl(path)\n return this.request<T>(url, { method: 'DELETE' })\n }\n\n private buildUrl(path: string, params?: Record<string, string | undefined>): string {\n const url = new URL(`${this.baseUrl}${path}`)\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.set(key, value)\n }\n }\n }\n return url.toString()\n }\n\n private async request<T>(url: string, init: RequestInit): Promise<T> {\n const headers = new Headers(init.headers)\n\n if (this.token) {\n headers.set('Authorization', `Bearer ${this.token}`)\n }\n if (this.apiKey) {\n headers.set('X-API-Key', this.apiKey)\n }\n\n let response: Response\n try {\n response = await this.fetch(url, { ...init, headers })\n } catch (err) {\n throw new SdkError(\n `Network error: ${err instanceof Error ? err.message : String(err)}`\n )\n }\n\n if (!response.ok) {\n let body: unknown\n try {\n body = await response.json()\n } catch {\n body = await response.text().catch(() => undefined)\n }\n const message =\n body && typeof body === 'object' && 'error' in body\n ? String((body as Record<string, unknown>).error)\n : `HTTP ${response.status}`\n throw new ApiError(response.status, message, body)\n }\n\n return (await response.json()) as T\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { BlockListResponse, BlockQueryParams } from '../types/block'\n\nexport class BlockResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async get(params?: BlockQueryParams): Promise<BlockListResponse> {\n return this.transport.get('/v1/block', serializeBlockParams(params))\n }\n\n async getFee(params?: BlockQueryParams): Promise<BlockListResponse> {\n return this.transport.get('/v1/block/fee', serializeBlockParams(params))\n }\n\n async getPrice(params?: BlockQueryParams): Promise<BlockListResponse> {\n return this.transport.get('/v1/block/price', serializeBlockParams(params))\n }\n\n async getLimit(params?: BlockQueryParams): Promise<BlockListResponse> {\n return this.transport.get('/v1/block/limit', serializeBlockParams(params))\n }\n}\n\nfunction serializeBlockParams(\n params?: BlockQueryParams\n): Record<string, string | undefined> | undefined {\n if (!params) return undefined\n return {\n limit: params.limit?.toString(),\n detail: params.detail,\n percentiles: params.percentiles?.join(','),\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { RollingResponse, RollingQueryParams } from '../types/rolling'\n\nexport class RollingResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async get(params?: RollingQueryParams): Promise<RollingResponse> {\n return this.transport.get('/v1/rolling', serializeRollingParams(params))\n }\n\n async getFee(params?: RollingQueryParams): Promise<RollingResponse> {\n return this.transport.get('/v1/rolling/fee', serializeRollingParams(params))\n }\n\n async getPrice(params?: RollingQueryParams): Promise<RollingResponse> {\n return this.transport.get('/v1/rolling/price', serializeRollingParams(params))\n }\n\n async getLimit(params?: RollingQueryParams): Promise<RollingResponse> {\n return this.transport.get('/v1/rolling/limit', serializeRollingParams(params))\n }\n}\n\nfunction serializeRollingParams(\n params?: RollingQueryParams\n): Record<string, string | undefined> | undefined {\n if (!params) return undefined\n return {\n duration: params.duration,\n detail: params.detail,\n percentiles: params.percentiles?.join(','),\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { TumblingResponse, TumblingQueryParams } from '../types/tumbling'\n\nexport class TumblingResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async get(params?: TumblingQueryParams): Promise<TumblingResponse> {\n return this.transport.get('/v1/tumbling', serializeTumblingParams(params))\n }\n\n async getFee(params?: TumblingQueryParams): Promise<TumblingResponse> {\n return this.transport.get('/v1/tumbling/fee', serializeTumblingParams(params))\n }\n\n async getPrice(params?: TumblingQueryParams): Promise<TumblingResponse> {\n return this.transport.get('/v1/tumbling/price', serializeTumblingParams(params))\n }\n\n async getLimit(params?: TumblingQueryParams): Promise<TumblingResponse> {\n return this.transport.get('/v1/tumbling/limit', serializeTumblingParams(params))\n }\n}\n\nfunction serializeTumblingParams(\n params?: TumblingQueryParams\n): Record<string, string | undefined> | undefined {\n if (!params) return undefined\n return {\n duration: params.duration,\n limit: params.limit?.toString(),\n detail: params.detail,\n percentiles: params.percentiles?.join(','),\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { DemoResponse } from '../types/demo'\n\nexport class DemoResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async get(): Promise<DemoResponse> {\n return this.transport.get('/v1/demo')\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { SiwsVerifyRequest, VerifyResponse, MeResponse } from '../types/auth'\n\nexport class AuthResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async verify(request: SiwsVerifyRequest): Promise<VerifyResponse> {\n return this.transport.post('/v1/auth/siws/verify', request)\n }\n\n async me(): Promise<MeResponse> {\n return this.transport.get('/v1/auth/me')\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { ApiKeyWithSecret, ListKeysResponse } from '../types/keys'\n\nexport class KeysResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async create(name: string): Promise<ApiKeyWithSecret> {\n return this.transport.post('/v1/keys', { name })\n }\n\n async list(): Promise<ListKeysResponse> {\n return this.transport.get('/v1/keys')\n }\n\n async delete(id: string): Promise<{ disabled: boolean }> {\n return this.transport.delete(`/v1/keys/${encodeURIComponent(id)}`)\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { UsageResponse, DetailedUsageResponse, DetailedUsageParams } from '../types/usage'\n\nexport class UsageResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async get(): Promise<UsageResponse> {\n return this.transport.get('/v1/usage')\n }\n\n async getDetailed(params: DetailedUsageParams): Promise<DetailedUsageResponse> {\n return this.transport.get('/v1/usage/detailed', {\n resolution: params.resolution,\n start: params.start?.toString(),\n end: params.end?.toString(),\n api_key_id: params.api_key_id,\n })\n }\n}\n","import type { HttpTransport } from '../transport/http'\nimport type { HealthResponse } from '../types/health'\n\nexport class HealthResource {\n constructor(private readonly transport: HttpTransport) {}\n\n async check(): Promise<HealthResponse> {\n return this.transport.get('/v1/health')\n }\n}\n","import { HttpTransport } from './transport/http'\nimport { BlockResource } from './resources/block'\nimport { RollingResource } from './resources/rolling'\nimport { TumblingResource } from './resources/tumbling'\nimport { DemoResource } from './resources/demo'\nimport { AuthResource } from './resources/auth'\nimport { KeysResource } from './resources/keys'\nimport { UsageResource } from './resources/usage'\nimport { HealthResource } from './resources/health'\n\nexport interface HttpClientOptions {\n baseUrl: string\n apiKey?: string\n token?: string\n fetch?: typeof globalThis.fetch\n}\n\nexport class HttpClient {\n readonly block: BlockResource\n readonly rolling: RollingResource\n readonly tumbling: TumblingResource\n readonly demo: DemoResource\n readonly auth: AuthResource\n readonly keys: KeysResource\n readonly usage: UsageResource\n readonly health: HealthResource\n\n private readonly transport: HttpTransport\n\n constructor(options: HttpClientOptions) {\n this.transport = new HttpTransport(options)\n this.block = new BlockResource(this.transport)\n this.rolling = new RollingResource(this.transport)\n this.tumbling = new TumblingResource(this.transport)\n this.demo = new DemoResource(this.transport)\n this.auth = new AuthResource(this.transport)\n this.keys = new KeysResource(this.transport)\n this.usage = new UsageResource(this.transport)\n this.health = new HealthResource(this.transport)\n }\n\n setToken(token: string): void {\n this.transport.setToken(token)\n }\n\n clearToken(): void {\n this.transport.clearToken()\n }\n}\n","import type {\n ClientMessage,\n ServerMessage,\n WsClientOptions,\n WsTransportState,\n WsTransportEvents,\n} from '../types/ws'\n\ntype EventName = keyof WsTransportEvents\ntype Listener<E extends EventName> = WsTransportEvents[E]\n\nexport class WsTransport {\n private ws: WebSocket | null = null\n private _state: WsTransportState = 'disconnected'\n private disposed = false\n private reconnectAttempt = 0\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null\n private pingTimer: ReturnType<typeof setInterval> | null = null\n private pongTimer: ReturnType<typeof setTimeout> | null = null\n private listeners = new Map<EventName, Set<Listener<any>>>()\n\n private readonly url: string\n private readonly reconnect: boolean\n private readonly maxReconnectAttempts: number\n private readonly reconnectDelay: number\n private readonly pingInterval: number\n private readonly WsCtor: typeof WebSocket\n\n constructor(options: WsClientOptions) {\n const base = options.baseUrl.replace(/^http/, 'ws').replace(/\\/+$/, '')\n this.url = `${base}/v1/ws?api_key=${encodeURIComponent(options.apiKey)}`\n this.reconnect = options.reconnect ?? true\n this.maxReconnectAttempts = options.maxReconnectAttempts ?? 10\n this.reconnectDelay = options.reconnectDelay ?? 1000\n this.pingInterval = options.pingInterval ?? 30_000\n this.WsCtor = (options.WebSocket ?? WebSocket) as typeof WebSocket\n }\n\n get state(): WsTransportState {\n return this._state\n }\n\n connect(): void {\n this.disposed = false\n if (this.ws) return\n\n this.setState('connecting')\n const ws = new this.WsCtor(this.url)\n\n ws.onopen = () => {\n this.reconnectAttempt = 0\n this.setState('connected')\n this.startPing()\n this.emit('open')\n }\n\n ws.onclose = (e: CloseEvent) => {\n this.stopPing()\n this.ws = null\n this.emit('close', e.code, e.reason)\n\n if (!this.disposed && this.reconnect) {\n this.scheduleReconnect()\n } else {\n this.setState('disconnected')\n }\n }\n\n ws.onerror = (e: Event) => {\n this.emit('error', e)\n }\n\n ws.onmessage = (e: MessageEvent) => {\n this.handleMessage(e.data as string)\n }\n\n this.ws = ws\n }\n\n disconnect(): void {\n this.disposed = true\n this.clearReconnectTimer()\n this.stopPing()\n if (this.ws) {\n this.ws.onclose = null\n this.ws.onerror = null\n this.ws.onmessage = null\n this.ws.onopen = null\n this.ws.close(1000)\n this.ws = null\n }\n this.setState('disconnected')\n }\n\n send(msg: ClientMessage): void {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.send(JSON.stringify(msg))\n }\n }\n\n on<E extends EventName>(event: E, fn: Listener<E>): void {\n let set = this.listeners.get(event)\n if (!set) {\n set = new Set()\n this.listeners.set(event, set)\n }\n set.add(fn)\n }\n\n off<E extends EventName>(event: E, fn: Listener<E>): void {\n this.listeners.get(event)?.delete(fn)\n }\n\n // --- Private ---\n\n private emit<E extends EventName>(event: E, ...args: Parameters<WsTransportEvents[E]>): void {\n const set = this.listeners.get(event)\n if (!set) return\n for (const fn of set) {\n (fn as (...a: unknown[]) => void)(...args)\n }\n }\n\n private setState(s: WsTransportState): void {\n if (this._state === s) return\n this._state = s\n this.emit('stateChange', s)\n }\n\n private handleMessage(raw: string): void {\n let msg: ServerMessage\n try {\n msg = JSON.parse(raw) as ServerMessage\n } catch {\n return\n }\n\n if (msg.type === 'pong') {\n this.clearPongTimer()\n }\n\n this.emit('message', msg)\n }\n\n private startPing(): void {\n this.stopPing()\n this.pingTimer = setInterval(() => {\n this.send({ type: 'ping' })\n this.pongTimer = setTimeout(() => {\n // No pong received — force close to trigger reconnect\n if (this.ws) {\n this.ws.close(4000, 'pong timeout')\n }\n }, 10_000)\n }, this.pingInterval)\n }\n\n private stopPing(): void {\n if (this.pingTimer !== null) {\n clearInterval(this.pingTimer)\n this.pingTimer = null\n }\n this.clearPongTimer()\n }\n\n private clearPongTimer(): void {\n if (this.pongTimer !== null) {\n clearTimeout(this.pongTimer)\n this.pongTimer = null\n }\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectAttempt >= this.maxReconnectAttempts) {\n this.setState('disconnected')\n return\n }\n\n this.setState('reconnecting')\n const delay = Math.min(this.reconnectDelay * Math.pow(2, this.reconnectAttempt), 30_000)\n const jitter = Math.random() * delay * 0.2\n this.reconnectAttempt++\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null\n this.connect()\n }, delay + jitter)\n }\n\n private clearReconnectTimer(): void {\n if (this.reconnectTimer !== null) {\n clearTimeout(this.reconnectTimer)\n this.reconnectTimer = null\n }\n }\n}\n","import { WsTransport } from './transport/ws'\nimport type {\n WsChannel,\n WsClientOptions,\n WsTransportState,\n WsTransportEvents,\n BlockSubscribeParams,\n RollingSubscribeParams,\n Subscription,\n SubscriptionHandlers,\n SubscribedMessage,\n DataMessage,\n WsErrorMessage,\n ChannelPayloadMap,\n SubscribeParams,\n} from './types/ws'\n\ntype ClientEventName = 'open' | 'close' | 'error' | 'stateChange'\ntype ClientListener<E extends ClientEventName> = WsTransportEvents[E]\n\ninterface ActiveSubscription {\n channel: WsChannel\n params: SubscribeParams\n onData: (data: unknown) => void\n onError?: (error: WsErrorMessage) => void\n /** Mutable — gets updated on reconnect re-subscribe */\n currentId: string\n}\n\ninterface PendingSubscription {\n resolve: (sub: Subscription) => void\n reject: (err: Error) => void\n channel: WsChannel\n params: SubscribeParams\n onData: (data: unknown) => void\n onError?: (error: WsErrorMessage) => void\n}\n\nexport class WsClient {\n private readonly transport: WsTransport\n private readonly active = new Map<string, ActiveSubscription>()\n private readonly pending: PendingSubscription[] = []\n\n constructor(options: WsClientOptions) {\n this.transport = new WsTransport(options)\n this.transport.on('message', (msg) => this.handleMessage(msg))\n this.transport.on('open', () => this.handleReconnect())\n\n if (options.autoConnect !== false) {\n this.transport.connect()\n }\n }\n\n get state(): WsTransportState {\n return this.transport.state\n }\n\n connect(): void {\n this.transport.connect()\n }\n\n disconnect(): void {\n this.transport.disconnect()\n // Reject any pending subscriptions\n for (const p of this.pending) {\n p.reject(new Error('Client disconnected'))\n }\n this.pending.length = 0\n this.active.clear()\n }\n\n on<E extends ClientEventName>(event: E, fn: ClientListener<E>): void {\n this.transport.on(event, fn as WsTransportEvents[typeof event])\n }\n\n off<E extends ClientEventName>(event: E, fn: ClientListener<E>): void {\n this.transport.off(event, fn as WsTransportEvents[typeof event])\n }\n\n subscribeBlock(\n params: BlockSubscribeParams,\n handlers: SubscriptionHandlers<'block'>,\n ): Promise<Subscription> {\n return this.subscribe({ channel: { type: 'block', ...params } }, 'block', handlers)\n }\n\n subscribeRolling(\n params: RollingSubscribeParams,\n handlers: SubscriptionHandlers<'rolling'>,\n ): Promise<Subscription> {\n return this.subscribe({ channel: { type: 'rolling', ...params } }, 'rolling', handlers)\n }\n\n subscribeDemo(handlers: SubscriptionHandlers<'demo'>): Promise<Subscription> {\n return this.subscribe({ channel: { type: 'demo' } }, 'demo', handlers)\n }\n\n private subscribe<C extends WsChannel>(\n params: SubscribeParams,\n channel: C,\n handlers: SubscriptionHandlers<C>,\n ): Promise<Subscription> {\n return new Promise<Subscription>((resolve, reject) => {\n this.pending.push({\n resolve,\n reject,\n channel,\n params,\n onData: handlers.onData as (data: unknown) => void,\n onError: handlers.onError,\n })\n this.transport.send({ type: 'subscribe', channel: params.channel })\n })\n }\n\n private handleMessage(msg: import('./types/ws').ServerMessage): void {\n switch (msg.type) {\n case 'subscribed':\n this.handleSubscribed(msg)\n break\n case 'data':\n this.handleData(msg)\n break\n case 'unsubscribed':\n this.active.delete(msg.id)\n break\n case 'error':\n this.handleError(msg)\n break\n }\n }\n\n private handleSubscribed(msg: SubscribedMessage): void {\n const p = this.pending.shift()\n if (!p) return\n\n const entry: ActiveSubscription = {\n channel: p.channel,\n params: p.params,\n onData: p.onData,\n onError: p.onError,\n currentId: msg.id,\n }\n\n this.active.set(msg.id, entry)\n\n const subscription: Subscription = {\n get id() {\n return entry.currentId\n },\n channel: p.channel,\n unsubscribe: () => {\n this.transport.send({ type: 'unsubscribe', id: entry.currentId })\n this.active.delete(entry.currentId)\n },\n }\n\n p.resolve(subscription)\n }\n\n private handleData(msg: DataMessage): void {\n const entry = this.active.get(msg.id)\n if (entry) {\n entry.onData(msg.payload)\n }\n }\n\n private handleError(msg: WsErrorMessage): void {\n if (msg.id) {\n const entry = this.active.get(msg.id)\n if (entry?.onError) {\n entry.onError(msg)\n }\n } else {\n // Error without id — reject the oldest pending subscription\n const p = this.pending.shift()\n if (p) {\n p.reject(new Error(`${msg.code}: ${msg.message}`))\n }\n }\n }\n\n private handleReconnect(): void {\n if (this.active.size > 0) {\n const entries = Array.from(this.active.values())\n this.active.clear()\n\n for (const entry of entries) {\n this.pending.push({\n resolve: (sub) => { entry.currentId = sub.id },\n reject: () => {},\n channel: entry.channel,\n params: entry.params,\n onData: entry.onData,\n onError: entry.onError,\n })\n }\n }\n\n for (const p of this.pending) {\n this.transport.send({ type: 'subscribe', channel: p.params.channel })\n }\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@chaindex/priorityfee",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "TypeScript SDK for the Chaindex Priority Fee API",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.mjs",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"default": "./dist/index.mjs"
|
|
14
|
+
},
|
|
15
|
+
"require": {
|
|
16
|
+
"types": "./dist/index.d.cts",
|
|
17
|
+
"default": "./dist/index.cjs"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist"
|
|
23
|
+
],
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"tsup": "^8.0.0",
|
|
26
|
+
"typescript": "^5.4.0"
|
|
27
|
+
},
|
|
28
|
+
"license": "MIT",
|
|
29
|
+
"engines": {
|
|
30
|
+
"node": ">=18"
|
|
31
|
+
},
|
|
32
|
+
"scripts": {
|
|
33
|
+
"build": "tsup",
|
|
34
|
+
"typecheck": "tsc --noEmit"
|
|
35
|
+
}
|
|
36
|
+
}
|