@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.
Files changed (102) hide show
  1. package/README.md +173 -44
  2. package/dist/auth/client.d.ts +1 -1
  3. package/dist/auth/client.d.ts.map +1 -1
  4. package/dist/auth/client.js +2 -7
  5. package/dist/auth/client.js.map +1 -1
  6. package/dist/domain/admin/client.d.ts +11 -8
  7. package/dist/domain/admin/client.d.ts.map +1 -1
  8. package/dist/domain/admin/client.js +33 -14
  9. package/dist/domain/admin/client.js.map +1 -1
  10. package/dist/domain/admin/index.d.ts +12 -3
  11. package/dist/domain/admin/index.d.ts.map +1 -1
  12. package/dist/domain/admin/index.js.map +1 -1
  13. package/dist/domain/admin/wire.d.ts +1 -2
  14. package/dist/domain/admin/wire.d.ts.map +1 -1
  15. package/dist/domain/admin/wire.js.map +1 -1
  16. package/dist/domain/market/tokens.js +4 -6
  17. package/dist/domain/market/tokens.js.map +1 -1
  18. package/dist/domain/market/wire.d.ts +1 -3
  19. package/dist/domain/market/wire.d.ts.map +1 -1
  20. package/dist/domain/market/wire.js.map +1 -1
  21. package/dist/domain/order/client.d.ts +1 -115
  22. package/dist/domain/order/client.d.ts.map +1 -1
  23. package/dist/domain/order/client.js +12 -71
  24. package/dist/domain/order/client.js.map +1 -1
  25. package/dist/domain/order/index.d.ts +2 -9
  26. package/dist/domain/order/index.d.ts.map +1 -1
  27. package/dist/domain/order/index.js +2 -9
  28. package/dist/domain/order/index.js.map +1 -1
  29. package/dist/domain/order/wire.d.ts +80 -2
  30. package/dist/domain/order/wire.d.ts.map +1 -1
  31. package/dist/domain/order/wire.js +141 -0
  32. package/dist/domain/order/wire.js.map +1 -1
  33. package/dist/domain/orderbook/state.d.ts +21 -2
  34. package/dist/domain/orderbook/state.d.ts.map +1 -1
  35. package/dist/domain/orderbook/state.js +38 -4
  36. package/dist/domain/orderbook/state.js.map +1 -1
  37. package/dist/domain/orderbook/wire.d.ts +1 -0
  38. package/dist/domain/orderbook/wire.d.ts.map +1 -1
  39. package/dist/domain/orderbook/wire.js.map +1 -1
  40. package/dist/domain/trade/convert.d.ts.map +1 -1
  41. package/dist/domain/trade/convert.js +5 -1
  42. package/dist/domain/trade/convert.js.map +1 -1
  43. package/dist/domain/trade/index.d.ts +4 -0
  44. package/dist/domain/trade/index.d.ts.map +1 -1
  45. package/dist/domain/trade/index.js.map +1 -1
  46. package/dist/domain/trade/state.d.ts +7 -0
  47. package/dist/domain/trade/state.d.ts.map +1 -1
  48. package/dist/domain/trade/state.js +36 -1
  49. package/dist/domain/trade/state.js.map +1 -1
  50. package/dist/domain/trade/wire.d.ts +3 -0
  51. package/dist/domain/trade/wire.d.ts.map +1 -1
  52. package/dist/domain/trade/wire.js.map +1 -1
  53. package/dist/error.d.ts +5 -2
  54. package/dist/error.d.ts.map +1 -1
  55. package/dist/error.js +10 -1
  56. package/dist/error.js.map +1 -1
  57. package/dist/http/client.d.ts +9 -1
  58. package/dist/http/client.d.ts.map +1 -1
  59. package/dist/http/client.js +126 -31
  60. package/dist/http/client.js.map +1 -1
  61. package/dist/prelude.d.ts +2 -2
  62. package/dist/prelude.d.ts.map +1 -1
  63. package/dist/prelude.js +5 -2
  64. package/dist/prelude.js.map +1 -1
  65. package/dist/privy/client.d.ts +3 -3
  66. package/dist/privy/client.d.ts.map +1 -1
  67. package/dist/privy/client.js.map +1 -1
  68. package/dist/privy/index.d.ts +1 -6
  69. package/dist/privy/index.d.ts.map +1 -1
  70. package/dist/privy/index.js.map +1 -1
  71. package/dist/program/accounts.d.ts +2 -1
  72. package/dist/program/accounts.d.ts.map +1 -1
  73. package/dist/program/accounts.js +6 -2
  74. package/dist/program/accounts.js.map +1 -1
  75. package/dist/program/instructions.d.ts +1 -1
  76. package/dist/program/instructions.d.ts.map +1 -1
  77. package/dist/program/instructions.js +2 -1
  78. package/dist/program/instructions.js.map +1 -1
  79. package/dist/program/types.d.ts +2 -0
  80. package/dist/program/types.d.ts.map +1 -1
  81. package/dist/program/types.js.map +1 -1
  82. package/dist/shared/api_response.d.ts +32 -0
  83. package/dist/shared/api_response.d.ts.map +1 -0
  84. package/dist/shared/api_response.js +61 -0
  85. package/dist/shared/api_response.js.map +1 -0
  86. package/dist/shared/index.d.ts +2 -0
  87. package/dist/shared/index.d.ts.map +1 -1
  88. package/dist/shared/index.js +6 -1
  89. package/dist/shared/index.js.map +1 -1
  90. package/dist/shared/rejection.d.ts +9 -0
  91. package/dist/shared/rejection.d.ts.map +1 -0
  92. package/dist/shared/rejection.js +48 -0
  93. package/dist/shared/rejection.js.map +1 -0
  94. package/dist/shared/types.d.ts +4 -2
  95. package/dist/shared/types.d.ts.map +1 -1
  96. package/dist/shared/types.js +2 -0
  97. package/dist/shared/types.js.map +1 -1
  98. package/dist/ws/index.d.ts +1 -1
  99. package/dist/ws/index.d.ts.map +1 -1
  100. package/dist/ws/index.js +9 -1
  101. package/dist/ws/index.js.map +1 -1
  102. package/package.json +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../../src/domain/trade/convert.ts"],"names":[],"mappings":";;AAGA,8CASC;AAED,kCASC;AApBD,SAAgB,iBAAiB,CAAC,MAAqB;IACrD,OAAO;QACL,WAAW,EAAE,MAAM,CAAC,YAAY;QAChC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,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;KAClB,CAAC;AACJ,CAAC;AAED,SAAgB,WAAW,CAAC,MAAe;IACzC,OAAO;QACL,WAAW,EAAE,MAAM,CAAC,YAAY;QAChC,OAAO,EAAE,MAAM,CAAC,QAAQ;QACxB,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;KAClB,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: String(source.id),\n timestamp: new Date(source.executed_at),\n price: source.price,\n size: source.size,\n side: source.side,\n };\n}\n\nexport function tradeFromWs(source: WsTrade): Trade {\n return {\n orderbookId: source.orderbook_id,\n tradeId: source.trade_id,\n timestamp: new Date(source.timestamp),\n price: source.price,\n size: source.size,\n side: source.side,\n };\n}\n"]}
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;CACZ;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB"}
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;IAOxB,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"}
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
- this.buffer.unshift(trade);
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;QAC3B,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YACtC,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;AA1CD,oCA0CC","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 push(trade: Trade): void {\n this.buffer.unshift(trade);\n if (this.buffer.length > this.maxSize) {\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
+ {"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;CACZ"}
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
- constructor(variant: SdkErrorVariant, message: string, causeError?: Error);
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
@@ -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,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,YAAY,GAAG,OAAO,GAAG,sBAAsB,GAAG,SAAS,GAAG,eAAe,GAAG,SAAS,GAAG,OAAO,CAAC;AAE3J,qBAAa,QAAS,SAAQ,KAAK;IACjC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC;gBAEhB,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,KAAK;IAOzE,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ;IA8BrC,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ;IAI5C,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ;IAIvC,MAAM,CAAC,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ;IAItD,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ;IAIzC,MAAM,CAAC,aAAa,IAAI,QAAQ;CAGjC"}
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
- constructor(variant, message, causeError) {
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"]}
@@ -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 doRequest;
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":"AACA,OAAO,EAAyC,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAElF,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,SAAS,CAAqB;gBAE1B,OAAO,EAAE,MAAM;IAI3B,OAAO,IAAI,MAAM;IAIX,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrC,YAAY,IAAI,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAI3C,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;IAoC9B,OAAO,CAAC,WAAW;YAaL,SAAS;CAiExB"}
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"}
@@ -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.doRequest(method, url, body);
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
- return await this.doRequest(method, url, body);
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 doRequest(method, url, body) {
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
- if (this.authToken && !hasBrowserWindow()) {
70
- headers.Cookie = `auth_token=${this.authToken}`;
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
- const cookieHeader = response.headers.get("set-cookie") ?? "";
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
- return JSON.parse(text);
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
- const statusCode = response.status;
117
- if (statusCode === 401)
118
- throw error_1.HttpError.unauthorized();
119
- if (statusCode === 404)
120
- throw error_1.HttpError.notFound(bodyText);
121
- if (statusCode === 429)
122
- throw error_1.HttpError.rateLimited();
123
- if (statusCode >= 400 && statusCode < 500)
124
- throw error_1.HttpError.badRequest(bodyText);
125
- throw error_1.HttpError.serverError(statusCode, bodyText);
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/http/client.ts"],"names":[],"mappings":"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","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"]}