@lightconexyz/lightcone-sdk 0.4.16 → 0.5.2
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/README.md +173 -44
- package/dist/auth/client.d.ts +1 -1
- package/dist/auth/client.d.ts.map +1 -1
- package/dist/auth/client.js +2 -7
- package/dist/auth/client.js.map +1 -1
- package/dist/domain/admin/client.d.ts +11 -8
- package/dist/domain/admin/client.d.ts.map +1 -1
- package/dist/domain/admin/client.js +33 -14
- package/dist/domain/admin/client.js.map +1 -1
- package/dist/domain/admin/index.d.ts +12 -3
- package/dist/domain/admin/index.d.ts.map +1 -1
- package/dist/domain/admin/index.js.map +1 -1
- package/dist/domain/admin/wire.d.ts +1 -2
- package/dist/domain/admin/wire.d.ts.map +1 -1
- package/dist/domain/admin/wire.js.map +1 -1
- package/dist/domain/market/tokens.js +4 -6
- package/dist/domain/market/tokens.js.map +1 -1
- package/dist/domain/market/wire.d.ts +1 -3
- package/dist/domain/market/wire.d.ts.map +1 -1
- package/dist/domain/market/wire.js.map +1 -1
- package/dist/domain/order/client.d.ts +1 -115
- package/dist/domain/order/client.d.ts.map +1 -1
- package/dist/domain/order/client.js +12 -71
- package/dist/domain/order/client.js.map +1 -1
- package/dist/domain/order/index.d.ts +2 -9
- package/dist/domain/order/index.d.ts.map +1 -1
- package/dist/domain/order/index.js +2 -9
- package/dist/domain/order/index.js.map +1 -1
- package/dist/domain/order/wire.d.ts +80 -2
- package/dist/domain/order/wire.d.ts.map +1 -1
- package/dist/domain/order/wire.js +141 -0
- package/dist/domain/order/wire.js.map +1 -1
- package/dist/domain/orderbook/state.d.ts +21 -2
- package/dist/domain/orderbook/state.d.ts.map +1 -1
- package/dist/domain/orderbook/state.js +38 -4
- package/dist/domain/orderbook/state.js.map +1 -1
- package/dist/domain/orderbook/wire.d.ts +1 -0
- package/dist/domain/orderbook/wire.d.ts.map +1 -1
- package/dist/domain/orderbook/wire.js.map +1 -1
- package/dist/domain/trade/convert.d.ts.map +1 -1
- package/dist/domain/trade/convert.js +5 -1
- package/dist/domain/trade/convert.js.map +1 -1
- package/dist/domain/trade/index.d.ts +4 -0
- package/dist/domain/trade/index.d.ts.map +1 -1
- package/dist/domain/trade/index.js.map +1 -1
- package/dist/domain/trade/state.d.ts +7 -0
- package/dist/domain/trade/state.d.ts.map +1 -1
- package/dist/domain/trade/state.js +36 -1
- package/dist/domain/trade/state.js.map +1 -1
- package/dist/domain/trade/wire.d.ts +3 -0
- package/dist/domain/trade/wire.d.ts.map +1 -1
- package/dist/domain/trade/wire.js.map +1 -1
- package/dist/error.d.ts +5 -2
- package/dist/error.d.ts.map +1 -1
- package/dist/error.js +10 -1
- package/dist/error.js.map +1 -1
- package/dist/http/client.d.ts +9 -1
- package/dist/http/client.d.ts.map +1 -1
- package/dist/http/client.js +126 -31
- package/dist/http/client.js.map +1 -1
- package/dist/prelude.d.ts +2 -2
- package/dist/prelude.d.ts.map +1 -1
- package/dist/prelude.js +5 -2
- package/dist/prelude.js.map +1 -1
- package/dist/privy/client.d.ts +3 -3
- package/dist/privy/client.d.ts.map +1 -1
- package/dist/privy/client.js.map +1 -1
- package/dist/privy/index.d.ts +1 -6
- package/dist/privy/index.d.ts.map +1 -1
- package/dist/privy/index.js.map +1 -1
- package/dist/program/accounts.d.ts +2 -1
- package/dist/program/accounts.d.ts.map +1 -1
- package/dist/program/accounts.js +6 -2
- package/dist/program/accounts.js.map +1 -1
- package/dist/program/instructions.d.ts +1 -1
- package/dist/program/instructions.d.ts.map +1 -1
- package/dist/program/instructions.js +2 -1
- package/dist/program/instructions.js.map +1 -1
- package/dist/program/types.d.ts +2 -0
- package/dist/program/types.d.ts.map +1 -1
- package/dist/program/types.js.map +1 -1
- package/dist/shared/api_response.d.ts +32 -0
- package/dist/shared/api_response.d.ts.map +1 -0
- package/dist/shared/api_response.js +61 -0
- package/dist/shared/api_response.js.map +1 -0
- package/dist/shared/index.d.ts +2 -0
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js +6 -1
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/rejection.d.ts +9 -0
- package/dist/shared/rejection.d.ts.map +1 -0
- package/dist/shared/rejection.js +48 -0
- package/dist/shared/rejection.js.map +1 -0
- package/dist/shared/types.d.ts +4 -2
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/shared/types.js +2 -0
- package/dist/shared/types.js.map +1 -1
- package/dist/ws/index.d.ts +1 -1
- package/dist/ws/index.d.ts.map +1 -1
- package/dist/ws/index.js +9 -1
- package/dist/ws/index.js.map +1 -1
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convert.js","sourceRoot":"","sources":["../../../src/domain/trade/convert.ts"],"names":[],"mappings":";;AAGA,
|
|
1
|
+
{"version":3,"file":"convert.js","sourceRoot":"","sources":["../../../src/domain/trade/convert.ts"],"names":[],"mappings":";;AAGA,8CAWC;AAED,kCAWC;AAxBD,SAAgB,iBAAiB,CAAC,MAAqB;IACrD,OAAO;QACL,WAAW,EAAE,MAAM,CAAC,YAAY;QAChC,OAAO,EAAE,MAAM,CAAC,QAAQ;QACxB,QAAQ,EAAE,MAAM,CAAC,EAAE;QACnB,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;QACvC,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,QAAQ,EAAE,CAAC;KACZ,CAAC;AACJ,CAAC;AAED,SAAgB,WAAW,CAAC,MAAe;IACzC,OAAO;QACL,WAAW,EAAE,MAAM,CAAC,YAAY;QAChC,OAAO,EAAE,MAAM,CAAC,QAAQ;QACxB,QAAQ,EAAE,SAAS;QACnB,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QACrC,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC;AACJ,CAAC","sourcesContent":["import type { Trade } from \"./index\";\nimport type { TradeResponse, WsTrade } from \"./wire\";\n\nexport function tradeFromResponse(source: TradeResponse): Trade {\n return {\n orderbookId: source.orderbook_id,\n tradeId: source.trade_id,\n cursorId: source.id,\n timestamp: new Date(source.executed_at),\n price: source.price,\n size: source.size,\n side: source.side,\n sequence: 0,\n };\n}\n\nexport function tradeFromWs(source: WsTrade): Trade {\n return {\n orderbookId: source.orderbook_id,\n tradeId: source.trade_id,\n cursorId: undefined,\n timestamp: new Date(source.timestamp),\n price: source.price,\n size: source.size,\n side: source.side,\n sequence: source.sequence,\n };\n}\n"]}
|
|
@@ -6,10 +6,14 @@ export { tradeFromResponse, tradeFromWs } from "./convert";
|
|
|
6
6
|
export interface Trade {
|
|
7
7
|
orderbookId: OrderBookId;
|
|
8
8
|
tradeId: string;
|
|
9
|
+
/** Numeric REST row id used for cursor pagination. Undefined on WS trades. */
|
|
10
|
+
cursorId?: number;
|
|
9
11
|
timestamp: Date;
|
|
10
12
|
price: string;
|
|
11
13
|
size: string;
|
|
12
14
|
side: Side;
|
|
15
|
+
/** Monotonic sequence number per orderbook for ordering guarantees. 0 for REST trades. */
|
|
16
|
+
sequence: number;
|
|
13
17
|
}
|
|
14
18
|
export interface TradesPage {
|
|
15
19
|
trades: Trade[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/trade/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEtD,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE3D,MAAM,WAAW,KAAK;IACpB,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/trade/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEtD,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE3D,MAAM,WAAW,KAAK;IACpB,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,IAAI,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,IAAI,CAAC;IACX,0FAA0F;IAC1F,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domain/trade/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAEA,2CAAyB;AACzB,yCAAuB;AACvB,0CAAwB;AACxB,qCAA2D;AAAlD,4GAAA,iBAAiB,OAAA;AAAE,sGAAA,WAAW,OAAA","sourcesContent":["import type { OrderBookId, Side } from \"../../shared\";\n\nexport * from \"./client\";\nexport * from \"./wire\";\nexport * from \"./state\";\nexport { tradeFromResponse, tradeFromWs } from \"./convert\";\n\nexport interface Trade {\n orderbookId: OrderBookId;\n tradeId: string;\n timestamp: Date;\n price: string;\n size: string;\n side: Side;\n}\n\nexport interface TradesPage {\n trades: Trade[];\n nextCursor?: number;\n hasMore: boolean;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domain/trade/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAEA,2CAAyB;AACzB,yCAAuB;AACvB,0CAAwB;AACxB,qCAA2D;AAAlD,4GAAA,iBAAiB,OAAA;AAAE,sGAAA,WAAW,OAAA","sourcesContent":["import type { OrderBookId, Side } from \"../../shared\";\n\nexport * from \"./client\";\nexport * from \"./wire\";\nexport * from \"./state\";\nexport { tradeFromResponse, tradeFromWs } from \"./convert\";\n\nexport interface Trade {\n orderbookId: OrderBookId;\n tradeId: string;\n /** Numeric REST row id used for cursor pagination. Undefined on WS trades. */\n cursorId?: number;\n timestamp: Date;\n price: string;\n size: string;\n side: Side;\n /** Monotonic sequence number per orderbook for ordering guarantees. 0 for REST trades. */\n sequence: number;\n}\n\nexport interface TradesPage {\n trades: Trade[];\n nextCursor?: number;\n hasMore: boolean;\n}\n"]}
|
|
@@ -5,6 +5,13 @@ export declare class TradeHistory {
|
|
|
5
5
|
private readonly maxSize;
|
|
6
6
|
private readonly buffer;
|
|
7
7
|
constructor(orderbookId: OrderBookId, maxSize: number);
|
|
8
|
+
/**
|
|
9
|
+
* Insert a trade in descending sequence order.
|
|
10
|
+
*
|
|
11
|
+
* Trades with `sequence > 0` are placed at the correct position so the
|
|
12
|
+
* buffer stays sorted newest-first. Trades with `sequence === 0` (REST)
|
|
13
|
+
* are prepended.
|
|
14
|
+
*/
|
|
8
15
|
push(trade: Trade): void;
|
|
9
16
|
replace(trades: Trade[]): void;
|
|
10
17
|
trades(): readonly Trade[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/domain/trade/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAErC,qBAAa,YAAY;IACvB,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;gBAErB,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM;IAMrD,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/domain/trade/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAErC,qBAAa,YAAY;IACvB,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;gBAErB,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM;IAMrD;;;;;;OAMG;IACH,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAoCxB,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI;IAK9B,MAAM,IAAI,SAAS,KAAK,EAAE;IAI1B,MAAM,IAAI,KAAK,GAAG,SAAS;IAI3B,KAAK,IAAI,IAAI;IAIb,GAAG,IAAI,MAAM;IAIb,OAAO,IAAI,OAAO;CAGnB"}
|
|
@@ -10,9 +10,44 @@ class TradeHistory {
|
|
|
10
10
|
this.maxSize = maxSize;
|
|
11
11
|
this.buffer = [];
|
|
12
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* Insert a trade in descending sequence order.
|
|
15
|
+
*
|
|
16
|
+
* Trades with `sequence > 0` are placed at the correct position so the
|
|
17
|
+
* buffer stays sorted newest-first. Trades with `sequence === 0` (REST)
|
|
18
|
+
* are prepended.
|
|
19
|
+
*/
|
|
13
20
|
push(trade) {
|
|
14
|
-
|
|
21
|
+
// Treat a zero-capacity history as disabled.
|
|
22
|
+
if (this.maxSize === 0) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (trade.sequence === 0) {
|
|
26
|
+
// REST trades do not carry ordering metadata, so preserve the legacy
|
|
27
|
+
// "latest first" behavior and let normal capacity eviction apply.
|
|
28
|
+
this.buffer.unshift(trade);
|
|
29
|
+
if (this.buffer.length > this.maxSize) {
|
|
30
|
+
this.buffer.pop();
|
|
31
|
+
}
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
// Find the first retained trade that is older than the incoming sequence.
|
|
35
|
+
// Inserting there keeps the buffer sorted newest-first.
|
|
36
|
+
const position = this.buffer.findIndex((existing) => existing.sequence < trade.sequence);
|
|
37
|
+
if (this.buffer.length >= this.maxSize && position === -1) {
|
|
38
|
+
// The buffer is full and the new trade is older than everything we
|
|
39
|
+
// already keep, so dropping it preserves the newest retained window.
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (position === -1) {
|
|
43
|
+
this.buffer.push(trade);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
this.buffer.splice(position, 0, trade);
|
|
47
|
+
}
|
|
15
48
|
if (this.buffer.length > this.maxSize) {
|
|
49
|
+
// The new trade landed inside the retained window, so evict the oldest
|
|
50
|
+
// trade at the tail to restore capacity.
|
|
16
51
|
this.buffer.pop();
|
|
17
52
|
}
|
|
18
53
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/domain/trade/state.ts"],"names":[],"mappings":";;;AAGA,MAAa,YAAY;IACd,WAAW,CAAc;IACjB,OAAO,CAAS;IAChB,MAAM,CAAU;IAEjC,YAAY,WAAwB,EAAE,OAAe;QACnD,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,KAAY;QACf,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/domain/trade/state.ts"],"names":[],"mappings":";;;AAGA,MAAa,YAAY;IACd,WAAW,CAAc;IACjB,OAAO,CAAS;IAChB,MAAM,CAAU;IAEjC,YAAY,WAAwB,EAAE,OAAe;QACnD,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;IACnB,CAAC;IAED;;;;;;OAMG;IACH,IAAI,CAAC,KAAY;QACf,6CAA6C;QAC7C,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YACzB,qEAAqE;YACrE,kEAAkE;YAClE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC3B,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;gBACtC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YACpB,CAAC;YACD,OAAO;QACT,CAAC;QACD,0EAA0E;QAC1E,wDAAwD;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CACpC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CACjD,CAAC;QACF,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;YAC1D,mEAAmE;YACnE,qEAAqE;YACrE,OAAO;QACT,CAAC;QACD,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YACtC,uEAAuE;YACvE,yCAAyC;YACzC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,CAAC,MAAe;QACrB,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,GAAG;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;IAClC,CAAC;CACF;AA9ED,oCA8EC","sourcesContent":["import type { OrderBookId } from \"../../shared\";\nimport type { Trade } from \"./index\";\n\nexport class TradeHistory {\n readonly orderbookId: OrderBookId;\n private readonly maxSize: number;\n private readonly buffer: Trade[];\n\n constructor(orderbookId: OrderBookId, maxSize: number) {\n this.orderbookId = orderbookId;\n this.maxSize = maxSize;\n this.buffer = [];\n }\n\n /**\n * Insert a trade in descending sequence order.\n *\n * Trades with `sequence > 0` are placed at the correct position so the\n * buffer stays sorted newest-first. Trades with `sequence === 0` (REST)\n * are prepended.\n */\n push(trade: Trade): void {\n // Treat a zero-capacity history as disabled.\n if (this.maxSize === 0) {\n return;\n }\n if (trade.sequence === 0) {\n // REST trades do not carry ordering metadata, so preserve the legacy\n // \"latest first\" behavior and let normal capacity eviction apply.\n this.buffer.unshift(trade);\n if (this.buffer.length > this.maxSize) {\n this.buffer.pop();\n }\n return;\n }\n // Find the first retained trade that is older than the incoming sequence.\n // Inserting there keeps the buffer sorted newest-first.\n const position = this.buffer.findIndex(\n (existing) => existing.sequence < trade.sequence,\n );\n if (this.buffer.length >= this.maxSize && position === -1) {\n // The buffer is full and the new trade is older than everything we\n // already keep, so dropping it preserves the newest retained window.\n return;\n }\n if (position === -1) {\n this.buffer.push(trade);\n } else {\n this.buffer.splice(position, 0, trade);\n }\n if (this.buffer.length > this.maxSize) {\n // The new trade landed inside the retained window, so evict the oldest\n // trade at the tail to restore capacity.\n this.buffer.pop();\n }\n }\n\n replace(trades: Trade[]): void {\n this.buffer.length = 0;\n this.buffer.push(...trades.slice(0, this.maxSize));\n }\n\n trades(): readonly Trade[] {\n return this.buffer;\n }\n\n latest(): Trade | undefined {\n return this.buffer[0];\n }\n\n clear(): void {\n this.buffer.length = 0;\n }\n\n len(): number {\n return this.buffer.length;\n }\n\n isEmpty(): boolean {\n return this.buffer.length === 0;\n }\n}\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { OrderBookId, Side } from "../../shared";
|
|
2
2
|
export interface TradeResponse {
|
|
3
3
|
id: number;
|
|
4
|
+
trade_id: string;
|
|
4
5
|
orderbook_id: OrderBookId;
|
|
5
6
|
taker_pubkey: string;
|
|
6
7
|
maker_pubkey: string;
|
|
@@ -30,5 +31,7 @@ export interface WsTrade {
|
|
|
30
31
|
price: string;
|
|
31
32
|
size: string;
|
|
32
33
|
side: Side;
|
|
34
|
+
/** Monotonic sequence number per orderbook for ordering guarantees. */
|
|
35
|
+
sequence: number;
|
|
33
36
|
}
|
|
34
37
|
//# sourceMappingURL=wire.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wire.d.ts","sourceRoot":"","sources":["../../../src/domain/trade/wire.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,WAAW,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,WAAW,CAAC;IAC1B,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,MAAM,WAAW,OAAO;IACtB,YAAY,EAAE,WAAW,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"wire.d.ts","sourceRoot":"","sources":["../../../src/domain/trade/wire.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,WAAW,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,WAAW,CAAC;IAC1B,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,MAAM,WAAW,OAAO;IACtB,YAAY,EAAE,WAAW,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,IAAI,CAAC;IACX,uEAAuE;IACvE,QAAQ,EAAE,MAAM,CAAC;CAClB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wire.js","sourceRoot":"","sources":["../../../src/domain/trade/wire.ts"],"names":[],"mappings":"","sourcesContent":["import type { OrderBookId, Side } from \"../../shared\";\n\nexport interface TradeResponse {\n id: number;\n orderbook_id: OrderBookId;\n taker_pubkey: string;\n maker_pubkey: string;\n side: Side;\n size: string;\n price: string;\n taker_fee?: string;\n maker_fee?: string;\n executed_at: number;\n}\n\nexport interface TradesDecimals {\n price?: number;\n size?: number;\n fee?: number;\n}\n\nexport interface TradesResponse {\n orderbook_id: OrderBookId;\n trades: TradeResponse[];\n next_cursor?: number;\n has_more?: boolean;\n decimals?: TradesDecimals;\n}\n\nexport interface WsTrade {\n orderbook_id: OrderBookId;\n trade_id: string;\n timestamp: string;\n price: string;\n size: string;\n side: Side;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"wire.js","sourceRoot":"","sources":["../../../src/domain/trade/wire.ts"],"names":[],"mappings":"","sourcesContent":["import type { OrderBookId, Side } from \"../../shared\";\n\nexport interface TradeResponse {\n id: number;\n trade_id: string;\n orderbook_id: OrderBookId;\n taker_pubkey: string;\n maker_pubkey: string;\n side: Side;\n size: string;\n price: string;\n taker_fee?: string;\n maker_fee?: string;\n executed_at: number;\n}\n\nexport interface TradesDecimals {\n price?: number;\n size?: number;\n fee?: number;\n}\n\nexport interface TradesResponse {\n orderbook_id: OrderBookId;\n trades: TradeResponse[];\n next_cursor?: number;\n has_more?: boolean;\n decimals?: TradesDecimals;\n}\n\nexport interface WsTrade {\n orderbook_id: OrderBookId;\n trade_id: string;\n timestamp: string;\n price: string;\n size: string;\n side: Side;\n /** Monotonic sequence number per orderbook for ordering guarantees. */\n sequence: number;\n}\n"]}
|
package/dist/error.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ApiRejectedDetails } from "./shared/api_response";
|
|
1
2
|
export type HttpErrorVariant = "Request" | "ServerError" | "RateLimited" | "Unauthorized" | "NotFound" | "BadRequest" | "Timeout" | "MaxRetriesExceeded";
|
|
2
3
|
export declare class HttpError extends Error {
|
|
3
4
|
readonly variant: HttpErrorVariant;
|
|
@@ -33,16 +34,18 @@ export declare class AuthError extends Error {
|
|
|
33
34
|
readonly variant: AuthErrorVariant;
|
|
34
35
|
constructor(variant: AuthErrorVariant, message: string);
|
|
35
36
|
}
|
|
36
|
-
export type SdkErrorVariant = "Http" | "Ws" | "Auth" | "Validation" | "Serde" | "MissingMarketContext" | "Signing" | "UserCancelled" | "Program" | "Other";
|
|
37
|
+
export type SdkErrorVariant = "Http" | "Ws" | "Auth" | "Validation" | "Serde" | "MissingMarketContext" | "Signing" | "UserCancelled" | "ApiRejected" | "Program" | "Other";
|
|
37
38
|
export declare class SdkError extends Error {
|
|
38
39
|
readonly variant: SdkErrorVariant;
|
|
39
40
|
readonly causeError?: Error;
|
|
40
|
-
|
|
41
|
+
readonly apiRejectedDetails?: ApiRejectedDetails;
|
|
42
|
+
constructor(variant: SdkErrorVariant, message: string, causeError?: Error, apiRejectedDetails?: ApiRejectedDetails);
|
|
41
43
|
static from(error: unknown): SdkError;
|
|
42
44
|
static validation(message: string): SdkError;
|
|
43
45
|
static serde(message: string): SdkError;
|
|
44
46
|
static missingMarketContext(message: string): SdkError;
|
|
45
47
|
static signing(message: string): SdkError;
|
|
46
48
|
static userCancelled(): SdkError;
|
|
49
|
+
static apiRejected(details: ApiRejectedDetails): SdkError;
|
|
47
50
|
}
|
|
48
51
|
//# sourceMappingURL=error.d.ts.map
|
package/dist/error.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GACxB,SAAS,GACT,aAAa,GACb,aAAa,GACb,cAAc,GACd,UAAU,GACV,YAAY,GACZ,SAAS,GACT,oBAAoB,CAAC;AAEzB,qBAAa,SAAU,SAAQ,KAAK;IAClC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;gBAEf,MAAM,EAAE;QAClB,OAAO,EAAE,gBAAgB,CAAC;QAC1B,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;IAUD,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS;IAI1C,MAAM,CAAC,OAAO,IAAI,SAAS;IAI3B,MAAM,CAAC,YAAY,IAAI,SAAS;IAIhC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS;IASxC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS;IAS1C,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS;IAYpD,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS;IAS3D,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS;CAO1E;AAED,MAAM,MAAM,cAAc,GACtB,cAAc,GACd,kBAAkB,GAClB,YAAY,GACZ,sBAAsB,GACtB,eAAe,GACf,QAAQ,CAAC;AAEb,qBAAa,OAAQ,SAAQ,KAAK;IAChC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;gBAEX,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM;CAMpE;AAED,MAAM,MAAM,gBAAgB,GACxB,kBAAkB,GAClB,aAAa,GACb,6BAA6B,GAC7B,cAAc,CAAC;AAEnB,qBAAa,SAAU,SAAQ,KAAK;IAClC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;gBAEvB,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM;CAKvD;AAED,MAAM,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"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"}
|
package/dist/error.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SdkError = exports.AuthError = exports.WsError = exports.HttpError = void 0;
|
|
4
|
+
const api_response_1 = require("./shared/api_response");
|
|
4
5
|
class HttpError extends Error {
|
|
5
6
|
variant;
|
|
6
7
|
status;
|
|
@@ -91,16 +92,21 @@ exports.AuthError = AuthError;
|
|
|
91
92
|
class SdkError extends Error {
|
|
92
93
|
variant;
|
|
93
94
|
causeError;
|
|
94
|
-
|
|
95
|
+
apiRejectedDetails;
|
|
96
|
+
constructor(variant, message, causeError, apiRejectedDetails) {
|
|
95
97
|
super(message);
|
|
96
98
|
this.name = "SdkError";
|
|
97
99
|
this.variant = variant;
|
|
98
100
|
this.causeError = causeError;
|
|
101
|
+
this.apiRejectedDetails = apiRejectedDetails;
|
|
99
102
|
}
|
|
100
103
|
static from(error) {
|
|
101
104
|
if (error instanceof SdkError) {
|
|
102
105
|
return error;
|
|
103
106
|
}
|
|
107
|
+
if (error instanceof api_response_1.ApiRejectedDetails) {
|
|
108
|
+
return SdkError.apiRejected(error);
|
|
109
|
+
}
|
|
104
110
|
if (error instanceof HttpError) {
|
|
105
111
|
return new SdkError("Http", error.message, error);
|
|
106
112
|
}
|
|
@@ -141,6 +147,9 @@ class SdkError extends Error {
|
|
|
141
147
|
static userCancelled() {
|
|
142
148
|
return new SdkError("UserCancelled", "User cancelled signing");
|
|
143
149
|
}
|
|
150
|
+
static apiRejected(details) {
|
|
151
|
+
return new SdkError("ApiRejected", details.toString(), undefined, details);
|
|
152
|
+
}
|
|
144
153
|
}
|
|
145
154
|
exports.SdkError = SdkError;
|
|
146
155
|
//# sourceMappingURL=error.js.map
|
package/dist/error.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.js","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"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","sourcesContent":["export type HttpErrorVariant =\n | \"Request\"\n | \"ServerError\"\n | \"RateLimited\"\n | \"Unauthorized\"\n | \"NotFound\"\n | \"BadRequest\"\n | \"Timeout\"\n | \"MaxRetriesExceeded\";\n\nexport class HttpError extends Error {\n readonly variant: HttpErrorVariant;\n readonly status?: number;\n readonly body?: string;\n readonly retryAfterMs?: number;\n readonly attempts?: number;\n\n constructor(params: {\n variant: HttpErrorVariant;\n message: string;\n status?: number;\n body?: string;\n retryAfterMs?: number;\n attempts?: number;\n }) {\n super(params.message);\n this.name = \"HttpError\";\n this.variant = params.variant;\n this.status = params.status;\n this.body = params.body;\n this.retryAfterMs = params.retryAfterMs;\n this.attempts = params.attempts;\n }\n\n static request(message: string): HttpError {\n return new HttpError({ variant: \"Request\", message: `Request failed: ${message}` });\n }\n\n static timeout(): HttpError {\n return new HttpError({ variant: \"Timeout\", message: \"Timeout\" });\n }\n\n static unauthorized(): HttpError {\n return new HttpError({ variant: \"Unauthorized\", message: \"Unauthorized\", status: 401 });\n }\n\n static notFound(body: string): HttpError {\n return new HttpError({\n variant: \"NotFound\",\n message: `Not found: ${body || \"resource\"}`,\n status: 404,\n body,\n });\n }\n\n static badRequest(body: string): HttpError {\n return new HttpError({\n variant: \"BadRequest\",\n message: `Bad request: ${body || \"invalid request\"}`,\n status: 400,\n body,\n });\n }\n\n static rateLimited(retryAfterMs?: number): HttpError {\n return new HttpError({\n variant: \"RateLimited\",\n message:\n retryAfterMs !== undefined\n ? `Rate limited (retry after ${retryAfterMs}ms)`\n : \"Rate limited\",\n status: 429,\n retryAfterMs,\n });\n }\n\n static serverError(status: number, body: string): HttpError {\n return new HttpError({\n variant: \"ServerError\",\n message: `Server error ${status}: ${body}`,\n status,\n body,\n });\n }\n\n static maxRetriesExceeded(attempts: number, lastError: string): HttpError {\n return new HttpError({\n variant: \"MaxRetriesExceeded\",\n message: `Max retries exceeded after ${attempts} attempts: ${lastError}`,\n attempts,\n });\n }\n}\n\nexport type WsErrorVariant =\n | \"NotConnected\"\n | \"ConnectionFailed\"\n | \"SendFailed\"\n | \"DeserializationError\"\n | \"ProtocolError\"\n | \"Closed\";\n\nexport class WsError extends Error {\n readonly variant: WsErrorVariant;\n readonly code?: number;\n\n constructor(variant: WsErrorVariant, message: string, code?: number) {\n super(message);\n this.name = \"WsError\";\n this.variant = variant;\n this.code = code;\n }\n}\n\nexport type AuthErrorVariant =\n | \"NotAuthenticated\"\n | \"LoginFailed\"\n | \"SignatureVerificationFailed\"\n | \"TokenExpired\";\n\nexport class AuthError extends Error {\n readonly variant: AuthErrorVariant;\n\n constructor(variant: AuthErrorVariant, message: string) {\n super(message);\n this.name = \"AuthError\";\n this.variant = variant;\n }\n}\n\nexport type SdkErrorVariant = \"Http\" | \"Ws\" | \"Auth\" | \"Validation\" | \"Serde\" | \"MissingMarketContext\" | \"Signing\" | \"UserCancelled\" | \"Program\" | \"Other\";\n\nexport class SdkError extends Error {\n readonly variant: SdkErrorVariant;\n readonly causeError?: Error;\n\n constructor(variant: SdkErrorVariant, message: string, causeError?: Error) {\n super(message);\n this.name = \"SdkError\";\n this.variant = variant;\n this.causeError = causeError;\n }\n\n static from(error: unknown): SdkError {\n if (error instanceof SdkError) {\n return error;\n }\n if (error instanceof HttpError) {\n return new SdkError(\"Http\", error.message, error);\n }\n if (error instanceof WsError) {\n return new SdkError(\"Ws\", error.message, error);\n }\n if (error instanceof AuthError) {\n return new SdkError(\"Auth\", error.message, error);\n }\n if (error instanceof SyntaxError) {\n return new SdkError(\"Serde\", error.message, error);\n }\n // ProgramSdkError is imported lazily to avoid circular deps;\n // duck-type check on .name instead.\n if (error instanceof Error && error.name === \"ProgramSdkError\") {\n return new SdkError(\"Program\", error.message, error);\n }\n if (error instanceof Error) {\n return new SdkError(\"Other\", error.message, error);\n }\n if (typeof error === \"object\" && error !== null) {\n return new SdkError(\"Other\", JSON.stringify(error));\n }\n return new SdkError(\"Other\", String(error));\n }\n\n static validation(message: string): SdkError {\n return new SdkError(\"Validation\", message);\n }\n\n static serde(message: string): SdkError {\n return new SdkError(\"Serde\", message);\n }\n\n static missingMarketContext(message: string): SdkError {\n return new SdkError(\"MissingMarketContext\", message);\n }\n\n static signing(message: string): SdkError {\n return new SdkError(\"Signing\", message);\n }\n\n static userCancelled(): SdkError {\n return new SdkError(\"UserCancelled\", \"User cancelled signing\");\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"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","sourcesContent":["import { ApiRejectedDetails } from \"./shared/api_response\";\n\nexport type HttpErrorVariant =\n | \"Request\"\n | \"ServerError\"\n | \"RateLimited\"\n | \"Unauthorized\"\n | \"NotFound\"\n | \"BadRequest\"\n | \"Timeout\"\n | \"MaxRetriesExceeded\";\n\nexport class HttpError extends Error {\n readonly variant: HttpErrorVariant;\n readonly status?: number;\n readonly body?: string;\n readonly retryAfterMs?: number;\n readonly attempts?: number;\n\n constructor(params: {\n variant: HttpErrorVariant;\n message: string;\n status?: number;\n body?: string;\n retryAfterMs?: number;\n attempts?: number;\n }) {\n super(params.message);\n this.name = \"HttpError\";\n this.variant = params.variant;\n this.status = params.status;\n this.body = params.body;\n this.retryAfterMs = params.retryAfterMs;\n this.attempts = params.attempts;\n }\n\n static request(message: string): HttpError {\n return new HttpError({ variant: \"Request\", message: `Request failed: ${message}` });\n }\n\n static timeout(): HttpError {\n return new HttpError({ variant: \"Timeout\", message: \"Timeout\" });\n }\n\n static unauthorized(): HttpError {\n return new HttpError({ variant: \"Unauthorized\", message: \"Unauthorized\", status: 401 });\n }\n\n static notFound(body: string): HttpError {\n return new HttpError({\n variant: \"NotFound\",\n message: `Not found: ${body || \"resource\"}`,\n status: 404,\n body,\n });\n }\n\n static badRequest(body: string): HttpError {\n return new HttpError({\n variant: \"BadRequest\",\n message: `Bad request: ${body || \"invalid request\"}`,\n status: 400,\n body,\n });\n }\n\n static rateLimited(retryAfterMs?: number): HttpError {\n return new HttpError({\n variant: \"RateLimited\",\n message:\n retryAfterMs !== undefined\n ? `Rate limited (retry after ${retryAfterMs}ms)`\n : \"Rate limited\",\n status: 429,\n retryAfterMs,\n });\n }\n\n static serverError(status: number, body: string): HttpError {\n return new HttpError({\n variant: \"ServerError\",\n message: `Server error ${status}: ${body}`,\n status,\n body,\n });\n }\n\n static maxRetriesExceeded(attempts: number, lastError: string): HttpError {\n return new HttpError({\n variant: \"MaxRetriesExceeded\",\n message: `Max retries exceeded after ${attempts} attempts: ${lastError}`,\n attempts,\n });\n }\n}\n\nexport type WsErrorVariant =\n | \"NotConnected\"\n | \"ConnectionFailed\"\n | \"SendFailed\"\n | \"DeserializationError\"\n | \"ProtocolError\"\n | \"Closed\";\n\nexport class WsError extends Error {\n readonly variant: WsErrorVariant;\n readonly code?: number;\n\n constructor(variant: WsErrorVariant, message: string, code?: number) {\n super(message);\n this.name = \"WsError\";\n this.variant = variant;\n this.code = code;\n }\n}\n\nexport type AuthErrorVariant =\n | \"NotAuthenticated\"\n | \"LoginFailed\"\n | \"SignatureVerificationFailed\"\n | \"TokenExpired\";\n\nexport class AuthError extends Error {\n readonly variant: AuthErrorVariant;\n\n constructor(variant: AuthErrorVariant, message: string) {\n super(message);\n this.name = \"AuthError\";\n this.variant = variant;\n }\n}\n\nexport type SdkErrorVariant =\n | \"Http\"\n | \"Ws\"\n | \"Auth\"\n | \"Validation\"\n | \"Serde\"\n | \"MissingMarketContext\"\n | \"Signing\"\n | \"UserCancelled\"\n | \"ApiRejected\"\n | \"Program\"\n | \"Other\";\n\nexport class SdkError extends Error {\n readonly variant: SdkErrorVariant;\n readonly causeError?: Error;\n readonly apiRejectedDetails?: ApiRejectedDetails;\n\n constructor(\n variant: SdkErrorVariant,\n message: string,\n causeError?: Error,\n apiRejectedDetails?: ApiRejectedDetails\n ) {\n super(message);\n this.name = \"SdkError\";\n this.variant = variant;\n this.causeError = causeError;\n this.apiRejectedDetails = apiRejectedDetails;\n }\n\n static from(error: unknown): SdkError {\n if (error instanceof SdkError) {\n return error;\n }\n if (error instanceof ApiRejectedDetails) {\n return SdkError.apiRejected(error);\n }\n if (error instanceof HttpError) {\n return new SdkError(\"Http\", error.message, error);\n }\n if (error instanceof WsError) {\n return new SdkError(\"Ws\", error.message, error);\n }\n if (error instanceof AuthError) {\n return new SdkError(\"Auth\", error.message, error);\n }\n if (error instanceof SyntaxError) {\n return new SdkError(\"Serde\", error.message, error);\n }\n // ProgramSdkError is imported lazily to avoid circular deps;\n // duck-type check on .name instead.\n if (error instanceof Error && error.name === \"ProgramSdkError\") {\n return new SdkError(\"Program\", error.message, error);\n }\n if (error instanceof Error) {\n return new SdkError(\"Other\", error.message, error);\n }\n if (typeof error === \"object\" && error !== null) {\n return new SdkError(\"Other\", JSON.stringify(error));\n }\n return new SdkError(\"Other\", String(error));\n }\n\n static validation(message: string): SdkError {\n return new SdkError(\"Validation\", message);\n }\n\n static serde(message: string): SdkError {\n return new SdkError(\"Serde\", message);\n }\n\n static missingMarketContext(message: string): SdkError {\n return new SdkError(\"MissingMarketContext\", message);\n }\n\n static signing(message: string): SdkError {\n return new SdkError(\"Signing\", message);\n }\n\n static userCancelled(): SdkError {\n return new SdkError(\"UserCancelled\", \"User cancelled signing\");\n }\n\n static apiRejected(details: ApiRejectedDetails): SdkError {\n return new SdkError(\"ApiRejected\", details.toString(), undefined, details);\n }\n}\n"]}
|
package/dist/http/client.d.ts
CHANGED
|
@@ -2,14 +2,22 @@ import { type RetryPolicy } from "./retry";
|
|
|
2
2
|
export declare class LightconeHttp {
|
|
3
3
|
private readonly normalizedBaseUrl;
|
|
4
4
|
private authToken;
|
|
5
|
+
private adminToken;
|
|
5
6
|
constructor(baseUrl: string);
|
|
6
7
|
baseUrl(): string;
|
|
7
8
|
clearAuthToken(): Promise<void>;
|
|
8
9
|
authTokenRef(): () => Promise<string | undefined>;
|
|
10
|
+
clearAdminToken(): void;
|
|
11
|
+
adminGet<T>(url: string, retry: RetryPolicy): Promise<T>;
|
|
12
|
+
adminPost<T, B extends object>(url: string, body: B, retry: RetryPolicy): Promise<T>;
|
|
9
13
|
get<T>(url: string, retry: RetryPolicy): Promise<T>;
|
|
10
14
|
post<T, B extends object>(url: string, body: B, retry: RetryPolicy): Promise<T>;
|
|
11
15
|
private requestWithRetry;
|
|
12
16
|
private shouldRetry;
|
|
13
|
-
private
|
|
17
|
+
private sendAndParse;
|
|
18
|
+
private sendRequest;
|
|
19
|
+
private captureCookies;
|
|
20
|
+
private cookieHeader;
|
|
21
|
+
private mapStatusError;
|
|
14
22
|
}
|
|
15
23
|
//# sourceMappingURL=client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/http/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/http/client.ts"],"names":[],"mappings":"AAMA,OAAO,EAAyC,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAIlF,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,UAAU,CAAqB;gBAE3B,OAAO,EAAE,MAAM;IAI3B,OAAO,IAAI,MAAM;IAIX,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrC,YAAY,IAAI,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAIjD,eAAe,IAAI,IAAI;IAIjB,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC;IAUxD,SAAS,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC;IAIpF,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC;IAInD,IAAI,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC;YAIvE,gBAAgB;YA8ChB,WAAW;YAoBX,YAAY;YAeZ,WAAW;IAgEzB,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,cAAc;CAevB"}
|
package/dist/http/client.js
CHANGED
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.LightconeHttp = void 0;
|
|
4
4
|
const error_1 = require("../error");
|
|
5
|
+
const api_response_1 = require("../shared/api_response");
|
|
5
6
|
const retry_1 = require("./retry");
|
|
6
7
|
class LightconeHttp {
|
|
7
8
|
normalizedBaseUrl;
|
|
8
9
|
authToken;
|
|
10
|
+
adminToken;
|
|
9
11
|
constructor(baseUrl) {
|
|
10
12
|
this.normalizedBaseUrl = baseUrl.replace(/\/+$/, "");
|
|
11
13
|
}
|
|
@@ -18,27 +20,37 @@ class LightconeHttp {
|
|
|
18
20
|
authTokenRef() {
|
|
19
21
|
return async () => this.authToken;
|
|
20
22
|
}
|
|
23
|
+
clearAdminToken() {
|
|
24
|
+
this.adminToken = undefined;
|
|
25
|
+
}
|
|
26
|
+
async adminGet(url, retry) {
|
|
27
|
+
return this.requestWithRetry("GET", url, undefined, retry, "adminCookie");
|
|
28
|
+
}
|
|
29
|
+
async adminPost(url, body, retry) {
|
|
30
|
+
return this.requestWithRetry("POST", url, body, retry, "adminCookie");
|
|
31
|
+
}
|
|
21
32
|
async get(url, retry) {
|
|
22
|
-
return this.requestWithRetry("GET", url, undefined, retry);
|
|
33
|
+
return this.requestWithRetry("GET", url, undefined, retry, "cookie");
|
|
23
34
|
}
|
|
24
35
|
async post(url, body, retry) {
|
|
25
|
-
return this.requestWithRetry("POST", url, body, retry);
|
|
36
|
+
return this.requestWithRetry("POST", url, body, retry, "cookie");
|
|
26
37
|
}
|
|
27
|
-
async requestWithRetry(method, url, body, policy) {
|
|
38
|
+
async requestWithRetry(method, url, body, policy, authMode) {
|
|
28
39
|
const config = (0, retry_1.retryConfigForPolicy)(policy);
|
|
29
40
|
if (!config) {
|
|
30
|
-
return this.
|
|
41
|
+
return this.sendAndParse(method, url, body, authMode);
|
|
31
42
|
}
|
|
32
43
|
let lastError;
|
|
33
44
|
for (let attempt = 0; attempt <= config.maxRetries; attempt += 1) {
|
|
34
45
|
try {
|
|
35
|
-
|
|
46
|
+
const [apiResponse, requestId] = await this.sendRequest(method, url, body, authMode);
|
|
47
|
+
return parseApiResponse(apiResponse, requestId);
|
|
36
48
|
}
|
|
37
49
|
catch (error) {
|
|
38
50
|
if (!(error instanceof error_1.HttpError)) {
|
|
39
51
|
throw error;
|
|
40
52
|
}
|
|
41
|
-
const shouldRetry = this.shouldRetry(error, config.retryableStatuses);
|
|
53
|
+
const shouldRetry = await this.shouldRetry(error, config.retryableStatuses);
|
|
42
54
|
if (!shouldRetry || attempt >= config.maxRetries) {
|
|
43
55
|
throw error;
|
|
44
56
|
}
|
|
@@ -49,11 +61,15 @@ class LightconeHttp {
|
|
|
49
61
|
}
|
|
50
62
|
throw error_1.HttpError.maxRetriesExceeded(config.maxRetries + 1, lastError?.message ?? "unknown");
|
|
51
63
|
}
|
|
52
|
-
shouldRetry(error, retryableStatuses) {
|
|
64
|
+
async shouldRetry(error, retryableStatuses) {
|
|
53
65
|
switch (error.variant) {
|
|
54
66
|
case "Timeout":
|
|
55
67
|
case "Request":
|
|
68
|
+
return true;
|
|
56
69
|
case "RateLimited":
|
|
70
|
+
if (error.retryAfterMs !== undefined) {
|
|
71
|
+
await sleep(error.retryAfterMs);
|
|
72
|
+
}
|
|
57
73
|
return true;
|
|
58
74
|
case "ServerError":
|
|
59
75
|
return error.status !== undefined && retryableStatuses.includes(error.status);
|
|
@@ -61,13 +77,22 @@ class LightconeHttp {
|
|
|
61
77
|
return false;
|
|
62
78
|
}
|
|
63
79
|
}
|
|
64
|
-
async
|
|
80
|
+
async sendAndParse(method, url, body, authMode = "cookie") {
|
|
81
|
+
const [apiResponse, requestId] = await this.sendRequest(method, url, body, authMode);
|
|
82
|
+
return parseApiResponse(apiResponse, requestId);
|
|
83
|
+
}
|
|
84
|
+
async sendRequest(method, url, body, authMode = "cookie") {
|
|
85
|
+
const requestId = generateRequestId();
|
|
65
86
|
const headers = {};
|
|
66
87
|
if (body) {
|
|
67
88
|
headers["Content-Type"] = "application/json";
|
|
68
89
|
}
|
|
69
|
-
|
|
70
|
-
|
|
90
|
+
headers["x-request-id"] = requestId;
|
|
91
|
+
if (!hasBrowserWindow()) {
|
|
92
|
+
const cookie = this.cookieHeader(authMode);
|
|
93
|
+
if (cookie) {
|
|
94
|
+
headers.Cookie = cookie;
|
|
95
|
+
}
|
|
71
96
|
}
|
|
72
97
|
const controller = new AbortController();
|
|
73
98
|
const timeoutId = setTimeout(() => controller.abort(), 30_000);
|
|
@@ -93,36 +118,56 @@ class LightconeHttp {
|
|
|
93
118
|
}
|
|
94
119
|
if (response.ok) {
|
|
95
120
|
if (!hasBrowserWindow()) {
|
|
96
|
-
|
|
97
|
-
for (const part of cookieHeader.split(",")) {
|
|
98
|
-
const trimmed = part.trim();
|
|
99
|
-
if (trimmed.startsWith("auth_token=")) {
|
|
100
|
-
const token = trimmed.slice("auth_token=".length).split(";")[0];
|
|
101
|
-
if (token) {
|
|
102
|
-
this.authToken = token;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
}
|
|
121
|
+
this.captureCookies(response);
|
|
106
122
|
}
|
|
107
123
|
const text = await response.text();
|
|
124
|
+
let payload;
|
|
108
125
|
try {
|
|
109
|
-
|
|
126
|
+
payload = JSON.parse(text);
|
|
110
127
|
}
|
|
111
128
|
catch (e) {
|
|
112
129
|
throw error_1.HttpError.request(e instanceof Error ? e.message : "JSON parse failed");
|
|
113
130
|
}
|
|
131
|
+
return [payload, requestId];
|
|
114
132
|
}
|
|
115
133
|
const bodyText = await response.text().catch(() => "");
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
134
|
+
throw this.mapStatusError(response.status, bodyText, response.headers);
|
|
135
|
+
}
|
|
136
|
+
captureCookies(response) {
|
|
137
|
+
for (const cookieHeader of getSetCookieHeaders(response.headers)) {
|
|
138
|
+
const authToken = extractCookieValue(cookieHeader, "auth_token");
|
|
139
|
+
if (authToken) {
|
|
140
|
+
this.authToken = authToken;
|
|
141
|
+
}
|
|
142
|
+
const adminToken = extractCookieValue(cookieHeader, "admin_token");
|
|
143
|
+
if (adminToken) {
|
|
144
|
+
this.adminToken = adminToken;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
cookieHeader(authMode) {
|
|
149
|
+
if (hasBrowserWindow()) {
|
|
150
|
+
return undefined;
|
|
151
|
+
}
|
|
152
|
+
if (authMode === "adminCookie") {
|
|
153
|
+
return this.adminToken ? `admin_token=${this.adminToken}` : undefined;
|
|
154
|
+
}
|
|
155
|
+
return this.authToken ? `auth_token=${this.authToken}` : undefined;
|
|
156
|
+
}
|
|
157
|
+
mapStatusError(statusCode, bodyText, headers) {
|
|
158
|
+
if (statusCode === 401) {
|
|
159
|
+
return error_1.HttpError.unauthorized();
|
|
160
|
+
}
|
|
161
|
+
if (statusCode === 404) {
|
|
162
|
+
return error_1.HttpError.notFound(bodyText);
|
|
163
|
+
}
|
|
164
|
+
if (statusCode === 429) {
|
|
165
|
+
return error_1.HttpError.rateLimited(retryAfterMs(headers));
|
|
166
|
+
}
|
|
167
|
+
if (statusCode >= 400 && statusCode < 500) {
|
|
168
|
+
return error_1.HttpError.badRequest(bodyText);
|
|
169
|
+
}
|
|
170
|
+
return error_1.HttpError.serverError(statusCode, bodyText);
|
|
126
171
|
}
|
|
127
172
|
}
|
|
128
173
|
exports.LightconeHttp = LightconeHttp;
|
|
@@ -131,6 +176,56 @@ function sleep(ms) {
|
|
|
131
176
|
setTimeout(resolve, ms);
|
|
132
177
|
});
|
|
133
178
|
}
|
|
179
|
+
function parseApiResponse(payload, requestId) {
|
|
180
|
+
if (!(0, api_response_1.isApiResponse)(payload)) {
|
|
181
|
+
throw error_1.SdkError.serde("Invalid ApiResponse envelope");
|
|
182
|
+
}
|
|
183
|
+
if (payload.status === "success") {
|
|
184
|
+
return payload.body;
|
|
185
|
+
}
|
|
186
|
+
throw error_1.SdkError.apiRejected(api_response_1.ApiRejectedDetails.fromWire(payload.error_details, requestId));
|
|
187
|
+
}
|
|
188
|
+
function generateRequestId() {
|
|
189
|
+
if (typeof globalThis.crypto?.randomUUID === "function") {
|
|
190
|
+
return globalThis.crypto.randomUUID();
|
|
191
|
+
}
|
|
192
|
+
return `lc-${Date.now()}-${Math.random().toString(16).slice(2)}`;
|
|
193
|
+
}
|
|
194
|
+
function getSetCookieHeaders(headers) {
|
|
195
|
+
const headersWithCookies = headers;
|
|
196
|
+
if (typeof headersWithCookies.getSetCookie === "function") {
|
|
197
|
+
const values = headersWithCookies.getSetCookie();
|
|
198
|
+
if (values.length > 0) {
|
|
199
|
+
return values;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
const combined = headers.get("set-cookie");
|
|
203
|
+
return combined ? [combined] : [];
|
|
204
|
+
}
|
|
205
|
+
function retryAfterMs(headers) {
|
|
206
|
+
const retryAfterMsValue = headers.get("retry-after-ms");
|
|
207
|
+
if (retryAfterMsValue) {
|
|
208
|
+
const parsed = Number.parseInt(retryAfterMsValue, 10);
|
|
209
|
+
if (Number.isFinite(parsed)) {
|
|
210
|
+
return parsed;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
const retryAfterValue = headers.get("retry-after");
|
|
214
|
+
if (retryAfterValue) {
|
|
215
|
+
const parsed = Number.parseFloat(retryAfterValue);
|
|
216
|
+
if (Number.isFinite(parsed)) {
|
|
217
|
+
return Math.round(parsed * 1000);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return undefined;
|
|
221
|
+
}
|
|
222
|
+
function extractCookieValue(header, name) {
|
|
223
|
+
const match = header.match(new RegExp(`(?:^|,\\s*)${escapeRegExp(name)}=([^;,]+)`));
|
|
224
|
+
return match?.[1];
|
|
225
|
+
}
|
|
226
|
+
function escapeRegExp(value) {
|
|
227
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
228
|
+
}
|
|
134
229
|
function hasBrowserWindow() {
|
|
135
230
|
return typeof globalThis !== "undefined" && "window" in globalThis;
|
|
136
231
|
}
|
package/dist/http/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/http/client.ts"],"names":[],"mappings":";;;AAAA,oCAAqC;AACrC,mCAAkF;AAElF,MAAa,aAAa;IACP,iBAAiB,CAAS;IACnC,SAAS,CAAqB;IAEtC,YAAY,OAAe;QACzB,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,YAAY;QACV,OAAO,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,GAAG,CAAI,GAAW,EAAE,KAAkB;QAC1C,OAAO,IAAI,CAAC,gBAAgB,CAAI,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,IAAI,CAAsB,GAAW,EAAE,IAAO,EAAE,KAAkB;QACtE,OAAO,IAAI,CAAC,gBAAgB,CAAI,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5D,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAC5B,MAAsB,EACtB,GAAW,EACX,IAAwB,EACxB,MAAmB;QAEnB,MAAM,MAAM,GAAG,IAAA,4BAAoB,EAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC,SAAS,CAAI,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC;QAED,IAAI,SAAgC,CAAC;QAErC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,UAAU,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;YACjE,IAAI,CAAC;gBACH,OAAO,MAAM,IAAI,CAAC,SAAS,CAAI,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;YACpD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,CAAC,KAAK,YAAY,iBAAS,CAAC,EAAE,CAAC;oBAClC,MAAM,KAAK,CAAC;gBACd,CAAC;gBAED,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC;gBACtE,IAAI,CAAC,WAAW,IAAI,OAAO,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;oBACjD,MAAM,KAAK,CAAC;gBACd,CAAC;gBAED,SAAS,GAAG,KAAK,CAAC;gBAClB,MAAM,KAAK,GAAG,IAAA,uBAAe,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAE/C,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QAED,MAAM,iBAAS,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,SAAS,EAAE,OAAO,IAAI,SAAS,CAAC,CAAC;IAC7F,CAAC;IAEO,WAAW,CAAC,KAAgB,EAAE,iBAAoC;QACxE,QAAQ,KAAK,CAAC,OAAO,EAAE,CAAC;YACtB,KAAK,SAAS,CAAC;YACf,KAAK,SAAS,CAAC;YACf,KAAK,aAAa;gBAChB,OAAO,IAAI,CAAC;YACd,KAAK,aAAa;gBAChB,OAAO,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,iBAAiB,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAChF;gBACE,OAAO,KAAK,CAAC;QACjB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,SAAS,CAAI,MAAsB,EAAE,GAAW,EAAE,IAAa;QAC3E,MAAM,OAAO,GAA2B,EAAE,CAAC;QAE3C,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;QAC/C,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;YAC1C,OAAO,CAAC,MAAM,GAAG,cAAc,IAAI,CAAC,SAAS,EAAE,CAAC;QAClD,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;QAE/D,IAAI,QAAkB,CAAC;QAEvB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAC1B,MAAM;gBACN,OAAO;gBACP,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;gBAC7C,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,SAA+B,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAChF,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,SAAS,CAAC,CAAC;YACxB,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC1D,MAAM,iBAAS,CAAC,OAAO,EAAE,CAAC;YAC5B,CAAC;YACD,MAAM,iBAAS,CAAC,OAAO,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAClF,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;QAED,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YAChB,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;gBACxB,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;gBAC9D,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;oBAC5B,IAAI,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;wBACtC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;wBAChE,IAAI,KAAK,EAAE,CAAC;4BACV,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;wBACzB,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;YAC/B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,iBAAS,CAAC,OAAO,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;YAChF,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAEvD,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC;QACnC,IAAI,UAAU,KAAK,GAAG;YAAE,MAAM,iBAAS,CAAC,YAAY,EAAE,CAAC;QACvD,IAAI,UAAU,KAAK,GAAG;YAAE,MAAM,iBAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC3D,IAAI,UAAU,KAAK,GAAG;YAAE,MAAM,iBAAS,CAAC,WAAW,EAAE,CAAC;QACtD,IAAI,UAAU,IAAI,GAAG,IAAI,UAAU,GAAG,GAAG;YAAE,MAAM,iBAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAChF,MAAM,iBAAS,CAAC,WAAW,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACpD,CAAC;CACF;AA9ID,sCA8IC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB;IACvB,OAAO,OAAO,UAAU,KAAK,WAAW,IAAI,QAAQ,IAAI,UAAU,CAAC;AACrE,CAAC","sourcesContent":["import { HttpError } from \"../error\";\nimport { delayForAttempt, retryConfigForPolicy, type RetryPolicy } from \"./retry\";\n\nexport class LightconeHttp {\n private readonly normalizedBaseUrl: string;\n private authToken: string | undefined;\n\n constructor(baseUrl: string) {\n this.normalizedBaseUrl = baseUrl.replace(/\\/+$/, \"\");\n }\n\n baseUrl(): string {\n return this.normalizedBaseUrl;\n }\n\n async clearAuthToken(): Promise<void> {\n this.authToken = undefined;\n }\n\n authTokenRef(): () => Promise<string | undefined> {\n return async () => this.authToken;\n }\n\n async get<T>(url: string, retry: RetryPolicy): Promise<T> {\n return this.requestWithRetry<T>(\"GET\", url, undefined, retry);\n }\n\n async post<T, B extends object>(url: string, body: B, retry: RetryPolicy): Promise<T> {\n return this.requestWithRetry<T>(\"POST\", url, body, retry);\n }\n\n private async requestWithRetry<T>(\n method: \"GET\" | \"POST\",\n url: string,\n body: object | undefined,\n policy: RetryPolicy\n ): Promise<T> {\n const config = retryConfigForPolicy(policy);\n if (!config) {\n return this.doRequest<T>(method, url, body);\n }\n\n let lastError: HttpError | undefined;\n\n for (let attempt = 0; attempt <= config.maxRetries; attempt += 1) {\n try {\n return await this.doRequest<T>(method, url, body);\n } catch (error) {\n if (!(error instanceof HttpError)) {\n throw error;\n }\n\n const shouldRetry = this.shouldRetry(error, config.retryableStatuses);\n if (!shouldRetry || attempt >= config.maxRetries) {\n throw error;\n }\n\n lastError = error;\n const delay = delayForAttempt(config, attempt);\n\n await sleep(delay);\n }\n }\n\n throw HttpError.maxRetriesExceeded(config.maxRetries + 1, lastError?.message ?? \"unknown\");\n }\n\n private shouldRetry(error: HttpError, retryableStatuses: readonly number[]): boolean {\n switch (error.variant) {\n case \"Timeout\":\n case \"Request\":\n case \"RateLimited\":\n return true;\n case \"ServerError\":\n return error.status !== undefined && retryableStatuses.includes(error.status);\n default:\n return false;\n }\n }\n\n private async doRequest<T>(method: \"GET\" | \"POST\", url: string, body?: object): Promise<T> {\n const headers: Record<string, string> = {};\n\n if (body) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n\n if (this.authToken && !hasBrowserWindow()) {\n headers.Cookie = `auth_token=${this.authToken}`;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 30_000);\n\n let response: Response;\n\n try {\n response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n ...(hasBrowserWindow() ? { credentials: \"include\" as RequestCredentials } : {}),\n });\n } catch (error) {\n clearTimeout(timeoutId);\n if (error instanceof Error && error.name === \"AbortError\") {\n throw HttpError.timeout();\n }\n throw HttpError.request(error instanceof Error ? error.message : String(error));\n } finally {\n clearTimeout(timeoutId);\n }\n\n if (response.ok) {\n if (!hasBrowserWindow()) {\n const cookieHeader = response.headers.get(\"set-cookie\") ?? \"\";\n for (const part of cookieHeader.split(\",\")) {\n const trimmed = part.trim();\n if (trimmed.startsWith(\"auth_token=\")) {\n const token = trimmed.slice(\"auth_token=\".length).split(\";\")[0];\n if (token) {\n this.authToken = token;\n }\n }\n }\n }\n\n const text = await response.text();\n try {\n return JSON.parse(text) as T;\n } catch (e) {\n throw HttpError.request(e instanceof Error ? e.message : \"JSON parse failed\");\n }\n }\n\n const bodyText = await response.text().catch(() => \"\");\n\n const statusCode = response.status;\n if (statusCode === 401) throw HttpError.unauthorized();\n if (statusCode === 404) throw HttpError.notFound(bodyText);\n if (statusCode === 429) throw HttpError.rateLimited();\n if (statusCode >= 400 && statusCode < 500) throw HttpError.badRequest(bodyText);\n throw HttpError.serverError(statusCode, bodyText);\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction hasBrowserWindow(): boolean {\n return typeof globalThis !== \"undefined\" && \"window\" in globalThis;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/http/client.ts"],"names":[],"mappings":"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","sourcesContent":["import { HttpError, SdkError } from \"../error\";\nimport {\n ApiRejectedDetails,\n isApiResponse,\n type ApiResponse,\n} from \"../shared/api_response\";\nimport { delayForAttempt, retryConfigForPolicy, type RetryPolicy } from \"./retry\";\n\ntype AuthMode = \"cookie\" | \"adminCookie\";\n\nexport class LightconeHttp {\n private readonly normalizedBaseUrl: string;\n private authToken: string | undefined;\n private adminToken: string | undefined;\n\n constructor(baseUrl: string) {\n this.normalizedBaseUrl = baseUrl.replace(/\\/+$/, \"\");\n }\n\n baseUrl(): string {\n return this.normalizedBaseUrl;\n }\n\n async clearAuthToken(): Promise<void> {\n this.authToken = undefined;\n }\n\n authTokenRef(): () => Promise<string | undefined> {\n return async () => this.authToken;\n }\n\n clearAdminToken(): void {\n this.adminToken = undefined;\n }\n\n async adminGet<T>(url: string, retry: RetryPolicy): Promise<T> {\n return this.requestWithRetry<T>(\n \"GET\",\n url,\n undefined,\n retry,\n \"adminCookie\"\n );\n }\n\n async adminPost<T, B extends object>(url: string, body: B, retry: RetryPolicy): Promise<T> {\n return this.requestWithRetry<T>(\"POST\", url, body, retry, \"adminCookie\");\n }\n\n async get<T>(url: string, retry: RetryPolicy): Promise<T> {\n return this.requestWithRetry<T>(\"GET\", url, undefined, retry, \"cookie\");\n }\n\n async post<T, B extends object>(url: string, body: B, retry: RetryPolicy): Promise<T> {\n return this.requestWithRetry<T>(\"POST\", url, body, retry, \"cookie\");\n }\n\n private async requestWithRetry<T>(\n method: \"GET\" | \"POST\",\n url: string,\n body: object | undefined,\n policy: RetryPolicy,\n authMode: AuthMode\n ): Promise<T> {\n const config = retryConfigForPolicy(policy);\n if (!config) {\n return this.sendAndParse<T>(method, url, body, authMode);\n }\n\n let lastError: HttpError | undefined;\n\n for (let attempt = 0; attempt <= config.maxRetries; attempt += 1) {\n try {\n const [apiResponse, requestId] = await this.sendRequest<ApiResponse<T>>(\n method,\n url,\n body,\n authMode\n );\n return parseApiResponse<T>(apiResponse, requestId);\n } catch (error) {\n if (!(error instanceof HttpError)) {\n throw error;\n }\n\n const shouldRetry = await this.shouldRetry(\n error,\n config.retryableStatuses\n );\n if (!shouldRetry || attempt >= config.maxRetries) {\n throw error;\n }\n\n lastError = error;\n const delay = delayForAttempt(config, attempt);\n\n await sleep(delay);\n }\n }\n\n throw HttpError.maxRetriesExceeded(config.maxRetries + 1, lastError?.message ?? \"unknown\");\n }\n\n private async shouldRetry(\n error: HttpError,\n retryableStatuses: readonly number[]\n ): Promise<boolean> {\n switch (error.variant) {\n case \"Timeout\":\n case \"Request\":\n return true;\n case \"RateLimited\":\n if (error.retryAfterMs !== undefined) {\n await sleep(error.retryAfterMs);\n }\n return true;\n case \"ServerError\":\n return error.status !== undefined && retryableStatuses.includes(error.status);\n default:\n return false;\n }\n }\n\n private async sendAndParse<T>(\n method: \"GET\" | \"POST\",\n url: string,\n body?: object,\n authMode: AuthMode = \"cookie\"\n ): Promise<T> {\n const [apiResponse, requestId] = await this.sendRequest<ApiResponse<T>>(\n method,\n url,\n body,\n authMode\n );\n return parseApiResponse<T>(apiResponse, requestId);\n }\n\n private async sendRequest<T>(\n method: \"GET\" | \"POST\",\n url: string,\n body?: object,\n authMode: AuthMode = \"cookie\"\n ): Promise<[T, string]> {\n const requestId = generateRequestId();\n const headers: Record<string, string> = {};\n\n if (body) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n headers[\"x-request-id\"] = requestId;\n\n if (!hasBrowserWindow()) {\n const cookie = this.cookieHeader(authMode);\n if (cookie) {\n headers.Cookie = cookie;\n }\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 30_000);\n\n let response: Response;\n\n try {\n response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n ...(hasBrowserWindow() ? { credentials: \"include\" as RequestCredentials } : {}),\n });\n } catch (error) {\n clearTimeout(timeoutId);\n if (error instanceof Error && error.name === \"AbortError\") {\n throw HttpError.timeout();\n }\n throw HttpError.request(error instanceof Error ? error.message : String(error));\n } finally {\n clearTimeout(timeoutId);\n }\n\n if (response.ok) {\n if (!hasBrowserWindow()) {\n this.captureCookies(response);\n }\n\n const text = await response.text();\n let payload: T;\n try {\n payload = JSON.parse(text) as T;\n } catch (e) {\n throw HttpError.request(e instanceof Error ? e.message : \"JSON parse failed\");\n }\n\n return [payload, requestId];\n }\n\n const bodyText = await response.text().catch(() => \"\");\n throw this.mapStatusError(response.status, bodyText, response.headers);\n }\n\n private captureCookies(response: Response): void {\n for (const cookieHeader of getSetCookieHeaders(response.headers)) {\n const authToken = extractCookieValue(cookieHeader, \"auth_token\");\n if (authToken) {\n this.authToken = authToken;\n }\n\n const adminToken = extractCookieValue(cookieHeader, \"admin_token\");\n if (adminToken) {\n this.adminToken = adminToken;\n }\n }\n }\n\n private cookieHeader(authMode: AuthMode): string | undefined {\n if (hasBrowserWindow()) {\n return undefined;\n }\n\n if (authMode === \"adminCookie\") {\n return this.adminToken ? `admin_token=${this.adminToken}` : undefined;\n }\n\n return this.authToken ? `auth_token=${this.authToken}` : undefined;\n }\n\n private mapStatusError(statusCode: number, bodyText: string, headers: Headers): HttpError {\n if (statusCode === 401) {\n return HttpError.unauthorized();\n }\n if (statusCode === 404) {\n return HttpError.notFound(bodyText);\n }\n if (statusCode === 429) {\n return HttpError.rateLimited(retryAfterMs(headers));\n }\n if (statusCode >= 400 && statusCode < 500) {\n return HttpError.badRequest(bodyText);\n }\n return HttpError.serverError(statusCode, bodyText);\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction parseApiResponse<T>(payload: unknown, requestId: string): T {\n if (!isApiResponse<T>(payload)) {\n throw SdkError.serde(\"Invalid ApiResponse envelope\");\n }\n\n if (payload.status === \"success\") {\n return payload.body;\n }\n\n throw SdkError.apiRejected(\n ApiRejectedDetails.fromWire(payload.error_details, requestId)\n );\n}\n\nfunction generateRequestId(): string {\n if (typeof globalThis.crypto?.randomUUID === \"function\") {\n return globalThis.crypto.randomUUID();\n }\n\n return `lc-${Date.now()}-${Math.random().toString(16).slice(2)}`;\n}\n\nfunction getSetCookieHeaders(headers: Headers): string[] {\n const headersWithCookies = headers as Headers & {\n getSetCookie?: () => string[];\n };\n\n if (typeof headersWithCookies.getSetCookie === \"function\") {\n const values = headersWithCookies.getSetCookie();\n if (values.length > 0) {\n return values;\n }\n }\n\n const combined = headers.get(\"set-cookie\");\n return combined ? [combined] : [];\n}\n\nfunction retryAfterMs(headers: Headers): number | undefined {\n const retryAfterMsValue = headers.get(\"retry-after-ms\");\n if (retryAfterMsValue) {\n const parsed = Number.parseInt(retryAfterMsValue, 10);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n\n const retryAfterValue = headers.get(\"retry-after\");\n if (retryAfterValue) {\n const parsed = Number.parseFloat(retryAfterValue);\n if (Number.isFinite(parsed)) {\n return Math.round(parsed * 1000);\n }\n }\n\n return undefined;\n}\n\nfunction extractCookieValue(header: string, name: string): string | undefined {\n const match = header.match(\n new RegExp(`(?:^|,\\\\s*)${escapeRegExp(name)}=([^;,]+)`)\n );\n return match?.[1];\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction hasBrowserWindow(): boolean {\n return typeof globalThis !== \"undefined\" && \"window\" in globalThis;\n}\n"]}
|