@lightconexyz/lightcone-sdk 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -206
- package/dist/auth/client.d.ts +25 -0
- package/dist/auth/client.d.ts.map +1 -0
- package/dist/auth/client.js +120 -0
- package/dist/auth/client.js.map +1 -0
- package/dist/auth/index.d.ts +73 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +42 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/native.d.ts +8 -0
- package/dist/auth/native.d.ts.map +1 -0
- package/dist/auth/native.js +19 -0
- package/dist/auth/native.js.map +1 -0
- package/dist/auth.d.ts +1 -79
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +15 -145
- package/dist/auth.js.map +1 -1
- package/dist/client.d.ts +69 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +158 -0
- package/dist/client.js.map +1 -0
- package/dist/domain/admin/client.d.ts +17 -0
- package/dist/domain/admin/client.d.ts.map +1 -0
- package/dist/domain/admin/client.js +32 -0
- package/dist/domain/admin/client.js.map +1 -0
- package/dist/domain/admin/index.d.ts +7 -0
- package/dist/domain/admin/index.d.ts.map +1 -0
- package/dist/domain/admin/index.js +19 -0
- package/dist/domain/admin/index.js.map +1 -0
- package/dist/domain/admin/wire.d.ts +117 -0
- package/dist/domain/admin/wire.d.ts.map +1 -0
- package/dist/domain/admin/wire.js +3 -0
- package/dist/domain/admin/wire.js.map +1 -0
- package/dist/domain/index.d.ts +9 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +45 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/domain/market/client.d.ts +21 -0
- package/dist/domain/market/client.d.ts.map +1 -0
- package/dist/domain/market/client.js +70 -0
- package/dist/domain/market/client.js.map +1 -0
- package/dist/domain/market/convert.d.ts +8 -0
- package/dist/domain/market/convert.d.ts.map +1 -0
- package/dist/domain/market/convert.js +96 -0
- package/dist/domain/market/convert.js.map +1 -0
- package/dist/domain/market/index.d.ts +47 -0
- package/dist/domain/market/index.d.ts.map +1 -0
- package/dist/domain/market/index.js +58 -0
- package/dist/domain/market/index.js.map +1 -0
- package/dist/domain/market/outcome.d.ts +12 -0
- package/dist/domain/market/outcome.d.ts.map +1 -0
- package/dist/domain/market/outcome.js +28 -0
- package/dist/domain/market/outcome.js.map +1 -0
- package/dist/domain/market/tokens.d.ts +42 -0
- package/dist/domain/market/tokens.d.ts.map +1 -0
- package/dist/domain/market/tokens.js +106 -0
- package/dist/domain/market/tokens.js.map +1 -0
- package/dist/domain/market/wire.d.ts +116 -0
- package/dist/domain/market/wire.d.ts.map +1 -0
- package/dist/domain/market/wire.js +3 -0
- package/dist/domain/market/wire.js.map +1 -0
- package/dist/domain/order/client.d.ts +187 -0
- package/dist/domain/order/client.d.ts.map +1 -0
- package/dist/domain/order/client.js +122 -0
- package/dist/domain/order/client.js.map +1 -0
- package/dist/domain/order/convert.d.ts +8 -0
- package/dist/domain/order/convert.d.ts.map +1 -0
- package/dist/domain/order/convert.js +80 -0
- package/dist/domain/order/convert.js.map +1 -0
- package/dist/domain/order/index.d.ts +48 -0
- package/dist/domain/order/index.d.ts.map +1 -0
- package/dist/domain/order/index.js +41 -0
- package/dist/domain/order/index.js.map +1 -0
- package/dist/domain/order/state.d.ts +26 -0
- package/dist/domain/order/state.d.ts.map +1 -0
- package/dist/domain/order/state.js +85 -0
- package/dist/domain/order/state.js.map +1 -0
- package/dist/domain/order/wire.d.ts +123 -0
- package/dist/domain/order/wire.d.ts.map +1 -0
- package/dist/domain/order/wire.js +3 -0
- package/dist/domain/order/wire.js.map +1 -0
- package/dist/domain/orderbook/client.d.ts +20 -0
- package/dist/domain/orderbook/client.d.ts.map +1 -0
- package/dist/domain/orderbook/client.js +30 -0
- package/dist/domain/orderbook/client.js.map +1 -0
- package/dist/domain/orderbook/convert.d.ts +5 -0
- package/dist/domain/orderbook/convert.d.ts.map +1 -0
- package/dist/domain/orderbook/convert.js +34 -0
- package/dist/domain/orderbook/convert.js.map +1 -0
- package/dist/domain/orderbook/index.d.ts +36 -0
- package/dist/domain/orderbook/index.d.ts.map +1 -0
- package/dist/domain/orderbook/index.js +63 -0
- package/dist/domain/orderbook/index.js.map +1 -0
- package/dist/domain/orderbook/state.d.ts +19 -0
- package/dist/domain/orderbook/state.d.ts.map +1 -0
- package/dist/domain/orderbook/state.js +86 -0
- package/dist/domain/orderbook/state.js.map +1 -0
- package/dist/domain/orderbook/ticker.d.ts +8 -0
- package/dist/domain/orderbook/ticker.d.ts.map +1 -0
- package/dist/domain/orderbook/ticker.js +3 -0
- package/dist/domain/orderbook/ticker.js.map +1 -0
- package/dist/domain/orderbook/wire.d.ts +61 -0
- package/dist/domain/orderbook/wire.d.ts.map +1 -0
- package/dist/domain/orderbook/wire.js +3 -0
- package/dist/domain/orderbook/wire.js.map +1 -0
- package/dist/domain/position/client.d.ts +13 -0
- package/dist/domain/position/client.d.ts.map +1 -0
- package/dist/domain/position/client.js +20 -0
- package/dist/domain/position/client.js.map +1 -0
- package/dist/domain/position/index.d.ts +66 -0
- package/dist/domain/position/index.d.ts.map +1 -0
- package/dist/domain/position/index.js +19 -0
- package/dist/domain/position/index.js.map +1 -0
- package/dist/domain/position/wire.d.ts +29 -0
- package/dist/domain/position/wire.d.ts.map +1 -0
- package/dist/domain/position/wire.js +3 -0
- package/dist/domain/position/wire.js.map +1 -0
- package/dist/domain/price_history/client.d.ts +12 -0
- package/dist/domain/price_history/client.d.ts.map +1 -0
- package/dist/domain/price_history/client.js +24 -0
- package/dist/domain/price_history/client.js.map +1 -0
- package/dist/domain/price_history/index.d.ts +14 -0
- package/dist/domain/price_history/index.d.ts.map +1 -0
- package/dist/domain/price_history/index.js +27 -0
- package/dist/domain/price_history/index.js.map +1 -0
- package/dist/domain/price_history/state.d.ts +11 -0
- package/dist/domain/price_history/state.d.ts.map +1 -0
- package/dist/domain/price_history/state.js +35 -0
- package/dist/domain/price_history/state.js.map +1 -0
- package/dist/domain/price_history/wire.d.ts +47 -0
- package/dist/domain/price_history/wire.d.ts.map +1 -0
- package/dist/domain/price_history/wire.js +3 -0
- package/dist/domain/price_history/wire.js.map +1 -0
- package/dist/domain/referral/client.d.ts +13 -0
- package/dist/domain/referral/client.d.ts.map +1 -0
- package/dist/domain/referral/client.js +34 -0
- package/dist/domain/referral/client.js.map +1 -0
- package/dist/domain/referral/index.d.ts +17 -0
- package/dist/domain/referral/index.d.ts.map +1 -0
- package/dist/domain/referral/index.js +19 -0
- package/dist/domain/referral/index.js.map +1 -0
- package/dist/domain/referral/wire.d.ts +22 -0
- package/dist/domain/referral/wire.d.ts.map +1 -0
- package/dist/domain/referral/wire.js +3 -0
- package/dist/domain/referral/wire.js.map +1 -0
- package/dist/domain/trade/client.d.ts +12 -0
- package/dist/domain/trade/client.d.ts.map +1 -0
- package/dist/domain/trade/client.js +27 -0
- package/dist/domain/trade/client.js.map +1 -0
- package/dist/domain/trade/convert.d.ts +5 -0
- package/dist/domain/trade/convert.d.ts.map +1 -0
- package/dist/domain/trade/convert.js +25 -0
- package/dist/domain/trade/convert.js.map +1 -0
- package/dist/domain/trade/index.d.ts +19 -0
- package/dist/domain/trade/index.d.ts.map +1 -0
- package/dist/domain/trade/index.js +24 -0
- package/dist/domain/trade/index.js.map +1 -0
- package/dist/domain/trade/state.d.ts +16 -0
- package/dist/domain/trade/state.d.ts.map +1 -0
- package/dist/domain/trade/state.js +40 -0
- package/dist/domain/trade/state.js.map +1 -0
- package/dist/domain/trade/wire.d.ts +34 -0
- package/dist/domain/trade/wire.d.ts.map +1 -0
- package/dist/domain/trade/wire.js +3 -0
- package/dist/domain/trade/wire.js.map +1 -0
- package/dist/error.d.ts +44 -0
- package/dist/error.d.ts.map +1 -0
- package/dist/error.js +126 -0
- package/dist/error.js.map +1 -0
- package/dist/http/client.d.ts +16 -0
- package/dist/http/client.d.ts.map +1 -0
- package/dist/http/client.js +146 -0
- package/dist/http/client.js.map +1 -0
- package/dist/http/index.d.ts +3 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +12 -0
- package/dist/http/index.js.map +1 -0
- package/dist/http/retry.d.ts +30 -0
- package/dist/http/retry.d.ts.map +1 -0
- package/dist/http/retry.js +48 -0
- package/dist/http/retry.js.map +1 -0
- package/dist/index.d.ts +13 -51
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -68
- package/dist/index.js.map +1 -1
- package/dist/network.d.ts +4 -4
- package/dist/network.d.ts.map +1 -1
- package/dist/network.js +4 -4
- package/dist/network.js.map +1 -1
- package/dist/prelude.d.ts +41 -0
- package/dist/prelude.d.ts.map +1 -0
- package/dist/prelude.js +55 -0
- package/dist/prelude.js.map +1 -0
- package/dist/privy/client.d.ts +17 -0
- package/dist/privy/client.d.ts.map +1 -0
- package/dist/privy/client.js +66 -0
- package/dist/privy/client.js.map +1 -0
- package/dist/privy/index.d.ts +57 -0
- package/dist/privy/index.d.ts.map +1 -0
- package/dist/privy/index.js +80 -0
- package/dist/privy/index.js.map +1 -0
- package/dist/program/accounts.d.ts +19 -2
- package/dist/program/accounts.d.ts.map +1 -1
- package/dist/program/accounts.js +52 -2
- package/dist/program/accounts.js.map +1 -1
- package/dist/program/builder.d.ts +15 -11
- package/dist/program/builder.d.ts.map +1 -1
- package/dist/program/builder.js +30 -22
- package/dist/program/builder.js.map +1 -1
- package/dist/program/client.d.ts +40 -1
- package/dist/program/client.d.ts.map +1 -1
- package/dist/program/client.js +87 -2
- package/dist/program/client.js.map +1 -1
- package/dist/program/constants.d.ts +10 -1
- package/dist/program/constants.d.ts.map +1 -1
- package/dist/program/constants.js +11 -2
- package/dist/program/constants.js.map +1 -1
- package/dist/program/envelope.d.ts +94 -0
- package/dist/program/envelope.d.ts.map +1 -0
- package/dist/program/envelope.js +258 -0
- package/dist/program/envelope.js.map +1 -0
- package/dist/program/error.d.ts +8 -0
- package/dist/program/error.d.ts.map +1 -0
- package/dist/program/error.js +20 -0
- package/dist/program/error.js.map +1 -0
- package/dist/program/index.d.ts +8 -5
- package/dist/program/index.d.ts.map +1 -1
- package/dist/program/index.js +29 -3
- package/dist/program/index.js.map +1 -1
- package/dist/program/instructions.d.ts +124 -1
- package/dist/program/instructions.d.ts.map +1 -1
- package/dist/program/instructions.js +439 -4
- package/dist/program/instructions.js.map +1 -1
- package/dist/program/orders.d.ts +26 -8
- package/dist/program/orders.d.ts.map +1 -1
- package/dist/program/orders.js +58 -31
- package/dist/program/orders.js.map +1 -1
- package/dist/program/pda.d.ts +19 -0
- package/dist/program/pda.d.ts.map +1 -1
- package/dist/program/pda.js +28 -0
- package/dist/program/pda.js.map +1 -1
- package/dist/program/types.d.ts +93 -9
- package/dist/program/types.d.ts.map +1 -1
- package/dist/program/types.js.map +1 -1
- package/dist/shared/fmt/decimal.d.ts +5 -0
- package/dist/shared/fmt/decimal.d.ts.map +1 -0
- package/dist/shared/fmt/decimal.js +54 -0
- package/dist/shared/fmt/decimal.js.map +1 -0
- package/dist/shared/fmt/index.d.ts +3 -0
- package/dist/shared/fmt/index.d.ts.map +1 -0
- package/dist/shared/fmt/index.js +39 -0
- package/dist/shared/fmt/index.js.map +1 -0
- package/dist/shared/fmt/num.d.ts +6 -0
- package/dist/shared/fmt/num.d.ts.map +1 -0
- package/dist/shared/fmt/num.js +44 -0
- package/dist/shared/fmt/num.js.map +1 -0
- package/dist/shared/index.d.ts +4 -7
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js +19 -7
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/price.d.ts +5 -33
- package/dist/shared/price.d.ts.map +1 -1
- package/dist/shared/price.js +11 -39
- package/dist/shared/price.js.map +1 -1
- package/dist/shared/scaling.d.ts +17 -30
- package/dist/shared/scaling.d.ts.map +1 -1
- package/dist/shared/scaling.js +88 -57
- package/dist/shared/scaling.js.map +1 -1
- package/dist/shared/types.d.ts +66 -16
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/shared/types.js +81 -17
- package/dist/shared/types.js.map +1 -1
- package/dist/ws/client.d.ts +35 -0
- package/dist/ws/client.d.ts.map +1 -0
- package/dist/ws/client.js +226 -0
- package/dist/ws/client.js.map +1 -0
- package/dist/ws/index.d.ts +109 -0
- package/dist/ws/index.d.ts.map +1 -0
- package/dist/ws/index.js +181 -0
- package/dist/ws/index.js.map +1 -0
- package/dist/ws/subscriptions.d.ts +51 -0
- package/dist/ws/subscriptions.d.ts.map +1 -0
- package/dist/ws/subscriptions.js +44 -0
- package/dist/ws/subscriptions.js.map +1 -0
- package/package.json +3 -11
- package/dist/api/client.d.ts +0 -225
- package/dist/api/client.d.ts.map +0 -1
- package/dist/api/client.js +0 -452
- package/dist/api/client.js.map +0 -1
- package/dist/api/error.d.ts +0 -58
- package/dist/api/error.d.ts.map +0 -1
- package/dist/api/error.js +0 -98
- package/dist/api/error.js.map +0 -1
- package/dist/api/index.d.ts +0 -23
- package/dist/api/index.d.ts.map +0 -1
- package/dist/api/index.js +0 -51
- package/dist/api/index.js.map +0 -1
- package/dist/api/types/admin.d.ts +0 -49
- package/dist/api/types/admin.d.ts.map +0 -1
- package/dist/api/types/admin.js +0 -13
- package/dist/api/types/admin.js.map +0 -1
- package/dist/api/types/index.d.ts +0 -14
- package/dist/api/types/index.d.ts.map +0 -1
- package/dist/api/types/index.js +0 -13
- package/dist/api/types/index.js.map +0 -1
- package/dist/api/types/market.d.ts +0 -186
- package/dist/api/types/market.d.ts.map +0 -1
- package/dist/api/types/market.js +0 -6
- package/dist/api/types/market.js.map +0 -1
- package/dist/api/types/order.d.ts +0 -190
- package/dist/api/types/order.d.ts.map +0 -1
- package/dist/api/types/order.js +0 -6
- package/dist/api/types/order.js.map +0 -1
- package/dist/api/types/orderbook.d.ts +0 -36
- package/dist/api/types/orderbook.d.ts.map +0 -1
- package/dist/api/types/orderbook.js +0 -6
- package/dist/api/types/orderbook.js.map +0 -1
- package/dist/api/types/position.d.ts +0 -60
- package/dist/api/types/position.d.ts.map +0 -1
- package/dist/api/types/position.js +0 -6
- package/dist/api/types/position.js.map +0 -1
- package/dist/api/types/price_history.d.ts +0 -68
- package/dist/api/types/price_history.d.ts.map +0 -1
- package/dist/api/types/price_history.js +0 -13
- package/dist/api/types/price_history.js.map +0 -1
- package/dist/api/types/trade.d.ts +0 -67
- package/dist/api/types/trade.d.ts.map +0 -1
- package/dist/api/types/trade.js +0 -13
- package/dist/api/types/trade.js.map +0 -1
- package/dist/api/validation.d.ts +0 -24
- package/dist/api/validation.d.ts.map +0 -1
- package/dist/api/validation.js +0 -53
- package/dist/api/validation.js.map +0 -1
- package/dist/websocket/client.d.ts +0 -238
- package/dist/websocket/client.d.ts.map +0 -1
- package/dist/websocket/client.js +0 -580
- package/dist/websocket/client.js.map +0 -1
- package/dist/websocket/error.d.ts +0 -47
- package/dist/websocket/error.d.ts.map +0 -1
- package/dist/websocket/error.js +0 -83
- package/dist/websocket/error.js.map +0 -1
- package/dist/websocket/handlers.d.ts +0 -97
- package/dist/websocket/handlers.d.ts.map +0 -1
- package/dist/websocket/handlers.js +0 -277
- package/dist/websocket/handlers.js.map +0 -1
- package/dist/websocket/index.d.ts +0 -38
- package/dist/websocket/index.d.ts.map +0 -1
- package/dist/websocket/index.js +0 -75
- package/dist/websocket/index.js.map +0 -1
- package/dist/websocket/state/index.d.ts +0 -7
- package/dist/websocket/state/index.d.ts.map +0 -1
- package/dist/websocket/state/index.js +0 -14
- package/dist/websocket/state/index.js.map +0 -1
- package/dist/websocket/state/orderbook.d.ts +0 -107
- package/dist/websocket/state/orderbook.d.ts.map +0 -1
- package/dist/websocket/state/orderbook.js +0 -293
- package/dist/websocket/state/orderbook.js.map +0 -1
- package/dist/websocket/state/price.d.ts +0 -108
- package/dist/websocket/state/price.d.ts.map +0 -1
- package/dist/websocket/state/price.js +0 -243
- package/dist/websocket/state/price.js.map +0 -1
- package/dist/websocket/state/user.d.ts +0 -83
- package/dist/websocket/state/user.d.ts.map +0 -1
- package/dist/websocket/state/user.js +0 -228
- package/dist/websocket/state/user.js.map +0 -1
- package/dist/websocket/subscriptions.d.ts +0 -143
- package/dist/websocket/subscriptions.d.ts.map +0 -1
- package/dist/websocket/subscriptions.js +0 -244
- package/dist/websocket/subscriptions.js.map +0 -1
- package/dist/websocket/types.d.ts +0 -417
- package/dist/websocket/types.d.ts.map +0 -1
- package/dist/websocket/types.js +0 -195
- package/dist/websocket/types.js.map +0 -1
package/dist/error.js
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SdkError = exports.AuthError = exports.WsError = exports.HttpError = void 0;
|
|
4
|
+
class HttpError extends Error {
|
|
5
|
+
variant;
|
|
6
|
+
status;
|
|
7
|
+
body;
|
|
8
|
+
retryAfterMs;
|
|
9
|
+
attempts;
|
|
10
|
+
constructor(params) {
|
|
11
|
+
super(params.message);
|
|
12
|
+
this.name = "HttpError";
|
|
13
|
+
this.variant = params.variant;
|
|
14
|
+
this.status = params.status;
|
|
15
|
+
this.body = params.body;
|
|
16
|
+
this.retryAfterMs = params.retryAfterMs;
|
|
17
|
+
this.attempts = params.attempts;
|
|
18
|
+
}
|
|
19
|
+
static request(message) {
|
|
20
|
+
return new HttpError({ variant: "Request", message: `Request failed: ${message}` });
|
|
21
|
+
}
|
|
22
|
+
static timeout() {
|
|
23
|
+
return new HttpError({ variant: "Timeout", message: "Timeout" });
|
|
24
|
+
}
|
|
25
|
+
static unauthorized() {
|
|
26
|
+
return new HttpError({ variant: "Unauthorized", message: "Unauthorized", status: 401 });
|
|
27
|
+
}
|
|
28
|
+
static notFound(body) {
|
|
29
|
+
return new HttpError({
|
|
30
|
+
variant: "NotFound",
|
|
31
|
+
message: `Not found: ${body || "resource"}`,
|
|
32
|
+
status: 404,
|
|
33
|
+
body,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
static badRequest(body) {
|
|
37
|
+
return new HttpError({
|
|
38
|
+
variant: "BadRequest",
|
|
39
|
+
message: `Bad request: ${body || "invalid request"}`,
|
|
40
|
+
status: 400,
|
|
41
|
+
body,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
static rateLimited(retryAfterMs) {
|
|
45
|
+
return new HttpError({
|
|
46
|
+
variant: "RateLimited",
|
|
47
|
+
message: retryAfterMs !== undefined
|
|
48
|
+
? `Rate limited (retry after ${retryAfterMs}ms)`
|
|
49
|
+
: "Rate limited",
|
|
50
|
+
status: 429,
|
|
51
|
+
retryAfterMs,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
static serverError(status, body) {
|
|
55
|
+
return new HttpError({
|
|
56
|
+
variant: "ServerError",
|
|
57
|
+
message: `Server error ${status}: ${body}`,
|
|
58
|
+
status,
|
|
59
|
+
body,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
static maxRetriesExceeded(attempts, lastError) {
|
|
63
|
+
return new HttpError({
|
|
64
|
+
variant: "MaxRetriesExceeded",
|
|
65
|
+
message: `Max retries exceeded after ${attempts} attempts: ${lastError}`,
|
|
66
|
+
attempts,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.HttpError = HttpError;
|
|
71
|
+
class WsError extends Error {
|
|
72
|
+
variant;
|
|
73
|
+
code;
|
|
74
|
+
constructor(variant, message, code) {
|
|
75
|
+
super(message);
|
|
76
|
+
this.name = "WsError";
|
|
77
|
+
this.variant = variant;
|
|
78
|
+
this.code = code;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
exports.WsError = WsError;
|
|
82
|
+
class AuthError extends Error {
|
|
83
|
+
variant;
|
|
84
|
+
constructor(variant, message) {
|
|
85
|
+
super(message);
|
|
86
|
+
this.name = "AuthError";
|
|
87
|
+
this.variant = variant;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
exports.AuthError = AuthError;
|
|
91
|
+
class SdkError extends Error {
|
|
92
|
+
variant;
|
|
93
|
+
causeError;
|
|
94
|
+
constructor(variant, message, causeError) {
|
|
95
|
+
super(message);
|
|
96
|
+
this.name = "SdkError";
|
|
97
|
+
this.variant = variant;
|
|
98
|
+
this.causeError = causeError;
|
|
99
|
+
}
|
|
100
|
+
static from(error) {
|
|
101
|
+
if (error instanceof SdkError) {
|
|
102
|
+
return error;
|
|
103
|
+
}
|
|
104
|
+
if (error instanceof HttpError) {
|
|
105
|
+
return new SdkError("Http", error.message, error);
|
|
106
|
+
}
|
|
107
|
+
if (error instanceof WsError) {
|
|
108
|
+
return new SdkError("Ws", error.message, error);
|
|
109
|
+
}
|
|
110
|
+
if (error instanceof AuthError) {
|
|
111
|
+
return new SdkError("Auth", error.message, error);
|
|
112
|
+
}
|
|
113
|
+
if (error instanceof SyntaxError) {
|
|
114
|
+
return new SdkError("Serde", error.message, error);
|
|
115
|
+
}
|
|
116
|
+
if (error instanceof Error) {
|
|
117
|
+
return new SdkError("Other", error.message, error);
|
|
118
|
+
}
|
|
119
|
+
return new SdkError("Other", String(error));
|
|
120
|
+
}
|
|
121
|
+
static validation(message) {
|
|
122
|
+
return new SdkError("Validation", message);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
exports.SdkError = SdkError;
|
|
126
|
+
//# sourceMappingURL=error.js.map
|
|
@@ -0,0 +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\" | \"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 if (error instanceof Error) {\n return new SdkError(\"Other\", error.message, 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"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type RetryPolicy } from "./retry";
|
|
2
|
+
export declare class LightconeHttp {
|
|
3
|
+
private readonly normalizedBaseUrl;
|
|
4
|
+
private authToken;
|
|
5
|
+
constructor(baseUrl: string);
|
|
6
|
+
baseUrl(): string;
|
|
7
|
+
setAuthToken(token: string | undefined): Promise<void>;
|
|
8
|
+
clearAuthToken(): Promise<void>;
|
|
9
|
+
authTokenRef(): () => Promise<string | undefined>;
|
|
10
|
+
get<T>(url: string, retry: RetryPolicy): Promise<T>;
|
|
11
|
+
post<T, B extends object>(url: string, body: B, retry: RetryPolicy): Promise<T>;
|
|
12
|
+
private requestWithRetry;
|
|
13
|
+
private shouldRetry;
|
|
14
|
+
private doRequest;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +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,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAItD,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;IAsC9B,OAAO,CAAC,WAAW;YAaL,SAAS;CA0DxB"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LightconeHttp = void 0;
|
|
4
|
+
const error_1 = require("../error");
|
|
5
|
+
const retry_1 = require("./retry");
|
|
6
|
+
class LightconeHttp {
|
|
7
|
+
normalizedBaseUrl;
|
|
8
|
+
authToken;
|
|
9
|
+
constructor(baseUrl) {
|
|
10
|
+
this.normalizedBaseUrl = baseUrl.replace(/\/+$/, "");
|
|
11
|
+
}
|
|
12
|
+
baseUrl() {
|
|
13
|
+
return this.normalizedBaseUrl;
|
|
14
|
+
}
|
|
15
|
+
async setAuthToken(token) {
|
|
16
|
+
this.authToken = token;
|
|
17
|
+
}
|
|
18
|
+
async clearAuthToken() {
|
|
19
|
+
this.authToken = undefined;
|
|
20
|
+
}
|
|
21
|
+
authTokenRef() {
|
|
22
|
+
return async () => this.authToken;
|
|
23
|
+
}
|
|
24
|
+
async get(url, retry) {
|
|
25
|
+
return this.requestWithRetry("GET", url, undefined, retry);
|
|
26
|
+
}
|
|
27
|
+
async post(url, body, retry) {
|
|
28
|
+
return this.requestWithRetry("POST", url, body, retry);
|
|
29
|
+
}
|
|
30
|
+
async requestWithRetry(method, url, body, policy) {
|
|
31
|
+
const config = (0, retry_1.retryConfigForPolicy)(policy);
|
|
32
|
+
if (!config) {
|
|
33
|
+
return this.doRequest(method, url, body);
|
|
34
|
+
}
|
|
35
|
+
let lastError;
|
|
36
|
+
for (let attempt = 0; attempt <= config.maxRetries; attempt += 1) {
|
|
37
|
+
try {
|
|
38
|
+
return await this.doRequest(method, url, body);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
if (!(error instanceof error_1.HttpError)) {
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
const shouldRetry = this.shouldRetry(error, config.retryableStatuses);
|
|
45
|
+
if (!shouldRetry || attempt >= config.maxRetries) {
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
lastError = error;
|
|
49
|
+
const delay = error.variant === "RateLimited" && error.retryAfterMs !== undefined
|
|
50
|
+
? error.retryAfterMs
|
|
51
|
+
: (0, retry_1.delayForAttempt)(config, attempt);
|
|
52
|
+
await sleep(delay);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
throw error_1.HttpError.maxRetriesExceeded(config.maxRetries + 1, lastError?.message ?? "unknown");
|
|
56
|
+
}
|
|
57
|
+
shouldRetry(error, retryableStatuses) {
|
|
58
|
+
switch (error.variant) {
|
|
59
|
+
case "Timeout":
|
|
60
|
+
case "Request":
|
|
61
|
+
case "RateLimited":
|
|
62
|
+
return true;
|
|
63
|
+
case "ServerError":
|
|
64
|
+
return error.status !== undefined && retryableStatuses.includes(error.status);
|
|
65
|
+
default:
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async doRequest(method, url, body) {
|
|
70
|
+
const headers = {
|
|
71
|
+
"Content-Type": "application/json",
|
|
72
|
+
};
|
|
73
|
+
if (this.authToken && !hasBrowserWindow()) {
|
|
74
|
+
headers.Cookie = `auth_token=${this.authToken}`;
|
|
75
|
+
}
|
|
76
|
+
const controller = new AbortController();
|
|
77
|
+
const timeoutId = setTimeout(() => controller.abort(), 30_000);
|
|
78
|
+
let response;
|
|
79
|
+
try {
|
|
80
|
+
response = await fetch(url, {
|
|
81
|
+
method,
|
|
82
|
+
headers,
|
|
83
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
84
|
+
signal: controller.signal,
|
|
85
|
+
credentials: "include",
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
clearTimeout(timeoutId);
|
|
90
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
91
|
+
throw error_1.HttpError.timeout();
|
|
92
|
+
}
|
|
93
|
+
throw error_1.HttpError.request(error instanceof Error ? error.message : String(error));
|
|
94
|
+
}
|
|
95
|
+
finally {
|
|
96
|
+
clearTimeout(timeoutId);
|
|
97
|
+
}
|
|
98
|
+
if (response.ok) {
|
|
99
|
+
const text = await response.text();
|
|
100
|
+
if (!text) {
|
|
101
|
+
return undefined;
|
|
102
|
+
}
|
|
103
|
+
return JSON.parse(text);
|
|
104
|
+
}
|
|
105
|
+
const bodyText = await response.text().catch(() => "");
|
|
106
|
+
switch (response.status) {
|
|
107
|
+
case 400:
|
|
108
|
+
throw error_1.HttpError.badRequest(bodyText);
|
|
109
|
+
case 401:
|
|
110
|
+
throw error_1.HttpError.unauthorized();
|
|
111
|
+
case 404:
|
|
112
|
+
throw error_1.HttpError.notFound(bodyText);
|
|
113
|
+
case 429:
|
|
114
|
+
throw error_1.HttpError.rateLimited(parseRetryAfterMs(response.headers.get("retry-after")));
|
|
115
|
+
default:
|
|
116
|
+
if (response.status >= 500) {
|
|
117
|
+
throw error_1.HttpError.serverError(response.status, bodyText);
|
|
118
|
+
}
|
|
119
|
+
throw error_1.HttpError.badRequest(bodyText || `HTTP ${response.status}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
exports.LightconeHttp = LightconeHttp;
|
|
124
|
+
function parseRetryAfterMs(header) {
|
|
125
|
+
if (!header) {
|
|
126
|
+
return undefined;
|
|
127
|
+
}
|
|
128
|
+
const seconds = Number.parseFloat(header);
|
|
129
|
+
if (Number.isFinite(seconds) && seconds >= 0) {
|
|
130
|
+
return Math.floor(seconds * 1000);
|
|
131
|
+
}
|
|
132
|
+
const retryDate = Date.parse(header);
|
|
133
|
+
if (Number.isFinite(retryDate)) {
|
|
134
|
+
return Math.max(0, retryDate - Date.now());
|
|
135
|
+
}
|
|
136
|
+
return undefined;
|
|
137
|
+
}
|
|
138
|
+
function sleep(ms) {
|
|
139
|
+
return new Promise((resolve) => {
|
|
140
|
+
setTimeout(resolve, ms);
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
function hasBrowserWindow() {
|
|
144
|
+
return typeof globalThis !== "undefined" && "window" in globalThis;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +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 setAuthToken(token: string | undefined): Promise<void> {\n this.authToken = token;\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 = error.variant === \"RateLimited\" && error.retryAfterMs !== undefined\n ? error.retryAfterMs\n : 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 \"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 credentials: \"include\",\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 const text = await response.text();\n if (!text) {\n return undefined as T;\n }\n return JSON.parse(text) as T;\n }\n\n const bodyText = await response.text().catch(() => \"\");\n\n switch (response.status) {\n case 400:\n throw HttpError.badRequest(bodyText);\n case 401:\n throw HttpError.unauthorized();\n case 404:\n throw HttpError.notFound(bodyText);\n case 429:\n throw HttpError.rateLimited(parseRetryAfterMs(response.headers.get(\"retry-after\")));\n default:\n if (response.status >= 500) {\n throw HttpError.serverError(response.status, bodyText);\n }\n throw HttpError.badRequest(bodyText || `HTTP ${response.status}`);\n }\n }\n}\n\nfunction parseRetryAfterMs(header: string | null): number | undefined {\n if (!header) {\n return undefined;\n }\n\n const seconds = Number.parseFloat(header);\n if (Number.isFinite(seconds) && seconds >= 0) {\n return Math.floor(seconds * 1000);\n }\n\n const retryDate = Date.parse(header);\n if (Number.isFinite(retryDate)) {\n return Math.max(0, retryDate - Date.now());\n }\n\n return undefined;\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"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,eAAe,EACf,qBAAqB,EACrB,oBAAoB,EACpB,KAAK,WAAW,EAChB,KAAK,WAAW,IAAI,eAAe,GACpC,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.retryConfigForPolicy = exports.idempotentRetryConfig = exports.delayForAttempt = exports.RetryPolicy = exports.DEFAULT_RETRY_CONFIG = exports.LightconeHttp = void 0;
|
|
4
|
+
var client_1 = require("./client");
|
|
5
|
+
Object.defineProperty(exports, "LightconeHttp", { enumerable: true, get: function () { return client_1.LightconeHttp; } });
|
|
6
|
+
var retry_1 = require("./retry");
|
|
7
|
+
Object.defineProperty(exports, "DEFAULT_RETRY_CONFIG", { enumerable: true, get: function () { return retry_1.DEFAULT_RETRY_CONFIG; } });
|
|
8
|
+
Object.defineProperty(exports, "RetryPolicy", { enumerable: true, get: function () { return retry_1.RetryPolicy; } });
|
|
9
|
+
Object.defineProperty(exports, "delayForAttempt", { enumerable: true, get: function () { return retry_1.delayForAttempt; } });
|
|
10
|
+
Object.defineProperty(exports, "idempotentRetryConfig", { enumerable: true, get: function () { return retry_1.idempotentRetryConfig; } });
|
|
11
|
+
Object.defineProperty(exports, "retryConfigForPolicy", { enumerable: true, get: function () { return retry_1.retryConfigForPolicy; } });
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":";;;AAAA,mCAAyC;AAAhC,uGAAA,aAAa,OAAA;AACtB,iCAQiB;AAPf,6GAAA,oBAAoB,OAAA;AACpB,oGAAA,WAAW,OAAA;AACX,wGAAA,eAAe,OAAA;AACf,8GAAA,qBAAqB,OAAA;AACrB,6GAAA,oBAAoB,OAAA","sourcesContent":["export { LightconeHttp } from \"./client\";\nexport {\n DEFAULT_RETRY_CONFIG,\n RetryPolicy,\n delayForAttempt,\n idempotentRetryConfig,\n retryConfigForPolicy,\n type RetryConfig,\n type RetryPolicy as RetryPolicyType,\n} from \"./retry\";\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface RetryConfig {
|
|
2
|
+
maxRetries: number;
|
|
3
|
+
initialDelayMs: number;
|
|
4
|
+
maxDelayMs: number;
|
|
5
|
+
backoffFactor: number;
|
|
6
|
+
jitter: boolean;
|
|
7
|
+
retryableStatuses: readonly number[];
|
|
8
|
+
}
|
|
9
|
+
export type RetryPolicy = {
|
|
10
|
+
kind: "none";
|
|
11
|
+
} | {
|
|
12
|
+
kind: "idempotent";
|
|
13
|
+
} | {
|
|
14
|
+
kind: "custom";
|
|
15
|
+
config: RetryConfig;
|
|
16
|
+
};
|
|
17
|
+
export declare const RetryPolicy: {
|
|
18
|
+
None: {
|
|
19
|
+
readonly kind: "none";
|
|
20
|
+
};
|
|
21
|
+
Idempotent: {
|
|
22
|
+
readonly kind: "idempotent";
|
|
23
|
+
};
|
|
24
|
+
custom(config: RetryConfig): RetryPolicy;
|
|
25
|
+
};
|
|
26
|
+
export declare const DEFAULT_RETRY_CONFIG: RetryConfig;
|
|
27
|
+
export declare function idempotentRetryConfig(): RetryConfig;
|
|
28
|
+
export declare function retryConfigForPolicy(policy: RetryPolicy): RetryConfig | null;
|
|
29
|
+
export declare function delayForAttempt(config: RetryConfig, attempt: number): number;
|
|
30
|
+
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/http/retry.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,CAAC;AAE5C,eAAO,MAAM,WAAW;;;;;;;mBAGP,WAAW,GAAG,WAAW;CAGzC,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,WAOlC,CAAC;AAEF,wBAAgB,qBAAqB,IAAI,WAAW,CAKnD;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAS5E;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAU5E"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_RETRY_CONFIG = exports.RetryPolicy = void 0;
|
|
4
|
+
exports.idempotentRetryConfig = idempotentRetryConfig;
|
|
5
|
+
exports.retryConfigForPolicy = retryConfigForPolicy;
|
|
6
|
+
exports.delayForAttempt = delayForAttempt;
|
|
7
|
+
exports.RetryPolicy = {
|
|
8
|
+
None: { kind: "none" },
|
|
9
|
+
Idempotent: { kind: "idempotent" },
|
|
10
|
+
custom(config) {
|
|
11
|
+
return { kind: "custom", config };
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
exports.DEFAULT_RETRY_CONFIG = {
|
|
15
|
+
maxRetries: 3,
|
|
16
|
+
initialDelayMs: 200,
|
|
17
|
+
maxDelayMs: 10_000,
|
|
18
|
+
backoffFactor: 2,
|
|
19
|
+
jitter: true,
|
|
20
|
+
retryableStatuses: [502, 503, 504],
|
|
21
|
+
};
|
|
22
|
+
function idempotentRetryConfig() {
|
|
23
|
+
return {
|
|
24
|
+
...exports.DEFAULT_RETRY_CONFIG,
|
|
25
|
+
retryableStatuses: [429, 502, 503, 504],
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function retryConfigForPolicy(policy) {
|
|
29
|
+
switch (policy.kind) {
|
|
30
|
+
case "none":
|
|
31
|
+
return null;
|
|
32
|
+
case "idempotent":
|
|
33
|
+
return idempotentRetryConfig();
|
|
34
|
+
case "custom":
|
|
35
|
+
return policy.config;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function delayForAttempt(config, attempt) {
|
|
39
|
+
const base = config.initialDelayMs * config.backoffFactor ** attempt;
|
|
40
|
+
const capped = Math.min(base, config.maxDelayMs);
|
|
41
|
+
if (!config.jitter) {
|
|
42
|
+
return Math.max(0, Math.floor(capped));
|
|
43
|
+
}
|
|
44
|
+
const jitterRange = capped * 0.25;
|
|
45
|
+
const jitter = (Math.random() - 0.5) * 2 * jitterRange;
|
|
46
|
+
return Math.max(0, Math.floor(capped + jitter));
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/http/retry.ts"],"names":[],"mappings":";;;AA+BA,sDAKC;AAED,oDASC;AAED,0CAUC;AA7CY,QAAA,WAAW,GAAG;IACzB,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAW;IAC/B,UAAU,EAAE,EAAE,IAAI,EAAE,YAAY,EAAW;IAC3C,MAAM,CAAC,MAAmB;QACxB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACpC,CAAC;CACF,CAAC;AAEW,QAAA,oBAAoB,GAAgB;IAC/C,UAAU,EAAE,CAAC;IACb,cAAc,EAAE,GAAG;IACnB,UAAU,EAAE,MAAM;IAClB,aAAa,EAAE,CAAC;IAChB,MAAM,EAAE,IAAI;IACZ,iBAAiB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;CACnC,CAAC;AAEF,SAAgB,qBAAqB;IACnC,OAAO;QACL,GAAG,4BAAoB;QACvB,iBAAiB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;KACxC,CAAC;AACJ,CAAC;AAED,SAAgB,oBAAoB,CAAC,MAAmB;IACtD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,MAAM;YACT,OAAO,IAAI,CAAC;QACd,KAAK,YAAY;YACf,OAAO,qBAAqB,EAAE,CAAC;QACjC,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC;AACH,CAAC;AAED,SAAgB,eAAe,CAAC,MAAmB,EAAE,OAAe;IAClE,MAAM,IAAI,GAAG,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC,aAAa,IAAI,OAAO,CAAC;IACrE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IACjD,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,GAAG,IAAI,CAAC;IAClC,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC;IACvD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;AAClD,CAAC","sourcesContent":["export interface RetryConfig {\n maxRetries: number;\n initialDelayMs: number;\n maxDelayMs: number;\n backoffFactor: number;\n jitter: boolean;\n retryableStatuses: readonly number[];\n}\n\nexport type RetryPolicy =\n | { kind: \"none\" }\n | { kind: \"idempotent\" }\n | { kind: \"custom\"; config: RetryConfig };\n\nexport const RetryPolicy = {\n None: { kind: \"none\" } as const,\n Idempotent: { kind: \"idempotent\" } as const,\n custom(config: RetryConfig): RetryPolicy {\n return { kind: \"custom\", config };\n },\n};\n\nexport const DEFAULT_RETRY_CONFIG: RetryConfig = {\n maxRetries: 3,\n initialDelayMs: 200,\n maxDelayMs: 10_000,\n backoffFactor: 2,\n jitter: true,\n retryableStatuses: [502, 503, 504],\n};\n\nexport function idempotentRetryConfig(): RetryConfig {\n return {\n ...DEFAULT_RETRY_CONFIG,\n retryableStatuses: [429, 502, 503, 504],\n };\n}\n\nexport function retryConfigForPolicy(policy: RetryPolicy): RetryConfig | null {\n switch (policy.kind) {\n case \"none\":\n return null;\n case \"idempotent\":\n return idempotentRetryConfig();\n case \"custom\":\n return policy.config;\n }\n}\n\nexport function delayForAttempt(config: RetryConfig, attempt: number): number {\n const base = config.initialDelayMs * config.backoffFactor ** attempt;\n const capped = Math.min(base, config.maxDelayMs);\n if (!config.jitter) {\n return Math.max(0, Math.floor(capped));\n }\n\n const jitterRange = capped * 0.25;\n const jitter = (Math.random() - 0.5) * 2 * jitterRange;\n return Math.max(0, Math.floor(capped + jitter));\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,55 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Lightcone SDK - TypeScript
|
|
3
|
-
*
|
|
4
|
-
* This SDK provides three main modules:
|
|
5
|
-
* - `program`: On-chain program interaction (smart contract)
|
|
6
|
-
* - `api`: REST API client for market data, orders, and positions
|
|
7
|
-
* - `websocket`: Real-time data streaming for orderbooks, trades, and user events
|
|
8
|
-
*
|
|
9
|
-
* @example
|
|
10
|
-
* ```typescript
|
|
11
|
-
* import { LightconePinocchioClient, PROGRAM_ID, api, websocket } from "@lightcone/sdk";
|
|
12
|
-
*
|
|
13
|
-
* // On-chain program interaction
|
|
14
|
-
* const programClient = new LightconePinocchioClient(connection, payer);
|
|
15
|
-
*
|
|
16
|
-
* // REST API client
|
|
17
|
-
* const apiClient = new api.LightconeApiClient();
|
|
18
|
-
* const markets = await apiClient.getMarkets();
|
|
19
|
-
*
|
|
20
|
-
* // WebSocket client for real-time data
|
|
21
|
-
* const wsClient = await websocket.LightconeWebSocketClient.connectDefault();
|
|
22
|
-
* await wsClient.subscribeBookUpdates(["market1:ob1"]);
|
|
23
|
-
* ```
|
|
24
|
-
*/
|
|
25
|
-
/**
|
|
26
|
-
* On-chain program interaction module.
|
|
27
|
-
* Contains the client and utilities for interacting with the Lightcone smart contract.
|
|
28
|
-
*/
|
|
29
|
-
export * from "./program";
|
|
30
|
-
/**
|
|
31
|
-
* Network URL constants (API and WebSocket endpoints).
|
|
32
|
-
*/
|
|
33
|
-
export { DEFAULT_API_URL, DEFAULT_WS_URL } from "./network";
|
|
34
|
-
/**
|
|
35
|
-
* Shared utilities, types, and constants.
|
|
36
|
-
* Used across all SDK modules.
|
|
37
|
-
*/
|
|
38
|
-
export * from "./shared";
|
|
39
|
-
/**
|
|
40
|
-
* REST API client module.
|
|
41
|
-
* Provides HTTP client functionality for market data, orders, and positions.
|
|
42
|
-
*/
|
|
43
|
-
export * as api from "./api";
|
|
44
|
-
/**
|
|
45
|
-
* WebSocket client module.
|
|
46
|
-
* Provides real-time data streaming for orderbooks, trades, and user events.
|
|
47
|
-
*/
|
|
48
|
-
export * as websocket from "./websocket";
|
|
49
|
-
/**
|
|
50
|
-
* Authentication module.
|
|
51
|
-
* Provides authentication functionality shared by API and WebSocket clients.
|
|
2
|
+
* Lightcone SDK v2 - TypeScript implementation mirroring Rust SDK v2 layers.
|
|
52
3
|
*/
|
|
4
|
+
export * as shared from "./shared";
|
|
5
|
+
export * as domain from "./domain";
|
|
6
|
+
export * as program from "./program";
|
|
7
|
+
export * from "./error";
|
|
8
|
+
export * from "./network";
|
|
53
9
|
export * as auth from "./auth";
|
|
54
|
-
export
|
|
10
|
+
export * as privy from "./privy";
|
|
11
|
+
export * as http from "./http";
|
|
12
|
+
export * as ws from "./ws";
|
|
13
|
+
export { LightconeClient, LightconeClientBuilder } from "./client";
|
|
14
|
+
export type { AuthCredentials, ChainType, EmbeddedWallet, LinkedAccount, LinkedAccountType, User, } from "./auth";
|
|
15
|
+
export type { AdminClient, MarketsClient, MarketsResult, OrdersClient, OrderbooksClient, PositionsClient, PriceHistorySubClient, ReferralsClient, TradesClient, } from "./prelude";
|
|
16
|
+
export * from "./prelude";
|
|
55
17
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC;AACrC,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAG1B,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC/B,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AAGjC,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAG/B,OAAO,KAAK,EAAE,MAAM,MAAM,CAAC;AAG3B,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAGnE,YAAY,EACV,eAAe,EACf,SAAS,EACT,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,IAAI,GACL,MAAM,QAAQ,CAAC;AAEhB,YAAY,EACV,WAAW,EACX,aAAa,EACb,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,qBAAqB,EACrB,eAAe,EACf,YAAY,GACb,MAAM,WAAW,CAAC;AAEnB,cAAc,WAAW,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,27 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* Lightcone SDK - TypeScript
|
|
4
|
-
*
|
|
5
|
-
* This SDK provides three main modules:
|
|
6
|
-
* - `program`: On-chain program interaction (smart contract)
|
|
7
|
-
* - `api`: REST API client for market data, orders, and positions
|
|
8
|
-
* - `websocket`: Real-time data streaming for orderbooks, trades, and user events
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```typescript
|
|
12
|
-
* import { LightconePinocchioClient, PROGRAM_ID, api, websocket } from "@lightcone/sdk";
|
|
13
|
-
*
|
|
14
|
-
* // On-chain program interaction
|
|
15
|
-
* const programClient = new LightconePinocchioClient(connection, payer);
|
|
16
|
-
*
|
|
17
|
-
* // REST API client
|
|
18
|
-
* const apiClient = new api.LightconeApiClient();
|
|
19
|
-
* const markets = await apiClient.getMarkets();
|
|
20
|
-
*
|
|
21
|
-
* // WebSocket client for real-time data
|
|
22
|
-
* const wsClient = await websocket.LightconeWebSocketClient.connectDefault();
|
|
23
|
-
* await wsClient.subscribeBookUpdates(["market1:ob1"]);
|
|
24
|
-
* ```
|
|
3
|
+
* Lightcone SDK v2 - TypeScript implementation mirroring Rust SDK v2 layers.
|
|
25
4
|
*/
|
|
26
5
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
27
6
|
if (k2 === undefined) k2 = k;
|
|
@@ -39,9 +18,6 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
39
18
|
}) : function(o, v) {
|
|
40
19
|
o["default"] = v;
|
|
41
20
|
});
|
|
42
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
43
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
44
|
-
};
|
|
45
21
|
var __importStar = (this && this.__importStar) || (function () {
|
|
46
22
|
var ownKeys = function(o) {
|
|
47
23
|
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
@@ -59,49 +35,27 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
59
35
|
return result;
|
|
60
36
|
};
|
|
61
37
|
})();
|
|
38
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
39
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
40
|
+
};
|
|
62
41
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
63
|
-
exports.
|
|
64
|
-
//
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
__exportStar(require("./program"), exports);
|
|
72
|
-
/**
|
|
73
|
-
* Network URL constants (API and WebSocket endpoints).
|
|
74
|
-
*/
|
|
75
|
-
var network_1 = require("./network");
|
|
76
|
-
Object.defineProperty(exports, "DEFAULT_API_URL", { enumerable: true, get: function () { return network_1.DEFAULT_API_URL; } });
|
|
77
|
-
Object.defineProperty(exports, "DEFAULT_WS_URL", { enumerable: true, get: function () { return network_1.DEFAULT_WS_URL; } });
|
|
78
|
-
/**
|
|
79
|
-
* Shared utilities, types, and constants.
|
|
80
|
-
* Used across all SDK modules.
|
|
81
|
-
*/
|
|
82
|
-
__exportStar(require("./shared"), exports);
|
|
83
|
-
/**
|
|
84
|
-
* REST API client module.
|
|
85
|
-
* Provides HTTP client functionality for market data, orders, and positions.
|
|
86
|
-
*/
|
|
87
|
-
exports.api = __importStar(require("./api"));
|
|
88
|
-
/**
|
|
89
|
-
* WebSocket client module.
|
|
90
|
-
* Provides real-time data streaming for orderbooks, trades, and user events.
|
|
91
|
-
*/
|
|
92
|
-
exports.websocket = __importStar(require("./websocket"));
|
|
93
|
-
/**
|
|
94
|
-
* Authentication module.
|
|
95
|
-
* Provides authentication functionality shared by API and WebSocket clients.
|
|
96
|
-
*/
|
|
42
|
+
exports.LightconeClientBuilder = exports.LightconeClient = exports.ws = exports.http = exports.privy = exports.auth = exports.program = exports.domain = exports.shared = void 0;
|
|
43
|
+
// Layer 1: Core
|
|
44
|
+
exports.shared = __importStar(require("./shared"));
|
|
45
|
+
exports.domain = __importStar(require("./domain"));
|
|
46
|
+
exports.program = __importStar(require("./program"));
|
|
47
|
+
__exportStar(require("./error"), exports);
|
|
48
|
+
__exportStar(require("./network"), exports);
|
|
49
|
+
// Layer 2: Auth + Privy
|
|
97
50
|
exports.auth = __importStar(require("./auth"));
|
|
98
|
-
|
|
99
|
-
//
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
Object.defineProperty(exports, "
|
|
106
|
-
Object.defineProperty(exports, "
|
|
51
|
+
exports.privy = __importStar(require("./privy"));
|
|
52
|
+
// Layer 3: HTTP
|
|
53
|
+
exports.http = __importStar(require("./http"));
|
|
54
|
+
// Layer 4: WebSocket
|
|
55
|
+
exports.ws = __importStar(require("./ws"));
|
|
56
|
+
// Layer 5: High-level client
|
|
57
|
+
var client_1 = require("./client");
|
|
58
|
+
Object.defineProperty(exports, "LightconeClient", { enumerable: true, get: function () { return client_1.LightconeClient; } });
|
|
59
|
+
Object.defineProperty(exports, "LightconeClientBuilder", { enumerable: true, get: function () { return client_1.LightconeClientBuilder; } });
|
|
60
|
+
__exportStar(require("./prelude"), exports);
|
|
107
61
|
//# sourceMappingURL=index.js.map
|