@polyester/sdk 0.3.0 → 0.4.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/CHANGELOG.md +44 -0
- package/README.md +63 -17
- package/dist/_virtual/_rolldown/runtime.js +15 -1
- package/dist/account-signer/types.d.ts.map +1 -1
- package/dist/account-signer/types.js +6 -3
- package/dist/account-signer/types.js.map +1 -1
- package/dist/browser-client.d.ts +4 -2
- package/dist/browser-client.d.ts.map +1 -1
- package/dist/browser-client.js +3 -4
- package/dist/browser-client.js.map +1 -1
- package/dist/catalogs/client-catalog.d.ts.map +1 -1
- package/dist/catalogs/client-catalog.js +11 -4
- package/dist/catalogs/client-catalog.js.map +1 -1
- package/dist/catalogs/index.js +1 -1
- package/dist/catalogs/readers.d.ts.map +1 -1
- package/dist/catalogs/readers.js +3 -1
- package/dist/catalogs/readers.js.map +1 -1
- package/dist/catalogs/snapshot-validation.js +132 -0
- package/dist/catalogs/snapshot-validation.js.map +1 -0
- package/dist/catalogs/snapshot.d.ts.map +1 -1
- package/dist/catalogs/snapshot.js +16 -7
- package/dist/catalogs/snapshot.js.map +1 -1
- package/dist/catalogs/zipper-supply.d.ts.map +1 -1
- package/dist/catalogs/zipper-supply.js +10 -7
- package/dist/catalogs/zipper-supply.js.map +1 -1
- package/dist/core-client.d.ts +24 -17
- package/dist/core-client.d.ts.map +1 -1
- package/dist/core-client.js +21 -3
- package/dist/core-client.js.map +1 -1
- package/dist/environment.d.ts.map +1 -1
- package/dist/environment.js +32 -1
- package/dist/environment.js.map +1 -1
- package/dist/gen/marketoverview/v1/marketoverview_pb.d.ts +7 -0
- package/dist/gen/marketoverview/v1/marketoverview_pb.d.ts.map +1 -1
- package/dist/gen/marketoverview/v1/marketoverview_pb.js +1 -1
- package/dist/gen/marketoverview/v1/marketoverview_pb.js.map +1 -1
- package/dist/index.js +3 -3
- package/dist/realtime/client.js +13 -2
- package/dist/realtime/client.js.map +1 -1
- package/dist/realtime/snapshot-then-stream.js +1 -1
- package/dist/realtime/snapshot-then-stream.js.map +1 -1
- package/dist/realtime/types.d.ts +2 -0
- package/dist/realtime/types.d.ts.map +1 -1
- package/dist/server-client.d.ts +17 -8
- package/dist/server-client.d.ts.map +1 -1
- package/dist/server-client.js +8 -11
- package/dist/server-client.js.map +1 -1
- package/dist/services/accounts/accounts.js +3 -3
- package/dist/services/accounts/accounts.js.map +1 -1
- package/dist/services/accounts/accounts.schemas.d.ts +13 -13
- package/dist/services/accounts/accounts.schemas.d.ts.map +1 -1
- package/dist/services/accounts/accounts.schemas.js +11 -11
- package/dist/services/accounts/accounts.schemas.js.map +1 -1
- package/dist/services/address-book/address-book.js +28 -28
- package/dist/services/address-book/address-book.js.map +1 -1
- package/dist/services/address-book/address-book.schemas.d.ts +751 -751
- package/dist/services/address-book/address-book.schemas.d.ts.map +1 -1
- package/dist/services/address-book/address-book.schemas.js +160 -160
- package/dist/services/address-book/address-book.schemas.js.map +1 -1
- package/dist/services/api-keys/api-keys.d.ts +6 -6
- package/dist/services/api-keys/api-keys.d.ts.map +1 -1
- package/dist/services/api-keys/api-keys.js +12 -12
- package/dist/services/api-keys/api-keys.js.map +1 -1
- package/dist/services/api-keys/api-keys.schemas.d.ts +62 -62
- package/dist/services/api-keys/api-keys.schemas.d.ts.map +1 -1
- package/dist/services/api-keys/api-keys.schemas.js +34 -34
- package/dist/services/api-keys/api-keys.schemas.js.map +1 -1
- package/dist/services/auth/auth.d.ts +46 -40
- package/dist/services/auth/auth.d.ts.map +1 -1
- package/dist/services/auth/auth.js +28 -25
- package/dist/services/auth/auth.js.map +1 -1
- package/dist/services/auth/profile/profile.d.ts +2 -2
- package/dist/services/auth/profile/profile.d.ts.map +1 -1
- package/dist/services/auth/profile/profile.js +7 -7
- package/dist/services/auth/profile/profile.js.map +1 -1
- package/dist/services/auth/profile/profile.schemas.d.ts +41 -41
- package/dist/services/auth/profile/profile.schemas.d.ts.map +1 -1
- package/dist/services/auth/profile/profile.schemas.js +27 -27
- package/dist/services/auth/profile/profile.schemas.js.map +1 -1
- package/dist/services/auth/session.d.ts +1 -1
- package/dist/services/auth/session.d.ts.map +1 -1
- package/dist/services/auth/session.js +6 -2
- package/dist/services/auth/session.js.map +1 -1
- package/dist/services/auth/session.schemas.js +17 -17
- package/dist/services/auth/session.schemas.js.map +1 -1
- package/dist/services/auth/session.types.d.ts +3 -2
- package/dist/services/auth/session.types.d.ts.map +1 -1
- package/dist/services/balances/balances.d.ts +1 -1
- package/dist/services/balances/balances.js +9 -9
- package/dist/services/balances/balances.js.map +1 -1
- package/dist/services/balances/balances.schemas.d.ts +95 -95
- package/dist/services/balances/balances.schemas.d.ts.map +1 -1
- package/dist/services/balances/balances.schemas.js +61 -61
- package/dist/services/balances/balances.schemas.js.map +1 -1
- package/dist/services/candles/candles.js +12 -12
- package/dist/services/candles/candles.js.map +1 -1
- package/dist/services/candles/candles.schemas.d.ts +64 -64
- package/dist/services/candles/candles.schemas.d.ts.map +1 -1
- package/dist/services/candles/candles.schemas.js +47 -48
- package/dist/services/candles/candles.schemas.js.map +1 -1
- package/dist/services/chain-analytics/chain-analytics.js +7 -7
- package/dist/services/chain-analytics/chain-analytics.js.map +1 -1
- package/dist/services/chain-analytics/chain-analytics.schemas.d.ts +68 -68
- package/dist/services/chain-analytics/chain-analytics.schemas.d.ts.map +1 -1
- package/dist/services/chain-analytics/chain-analytics.schemas.js +29 -29
- package/dist/services/chain-analytics/chain-analytics.schemas.js.map +1 -1
- package/dist/services/deposit/deposit.js +5 -5
- package/dist/services/deposit/deposit.js.map +1 -1
- package/dist/services/deposit/deposit.schemas.d.ts +17 -17
- package/dist/services/deposit/deposit.schemas.d.ts.map +1 -1
- package/dist/services/deposit/deposit.schemas.js +11 -11
- package/dist/services/deposit/deposit.schemas.js.map +1 -1
- package/dist/services/guard-signer/guard-signer.js +13 -13
- package/dist/services/guard-signer/guard-signer.js.map +1 -1
- package/dist/services/guard-signer/guard-signer.schemas.d.ts +75 -75
- package/dist/services/guard-signer/guard-signer.schemas.d.ts.map +1 -1
- package/dist/services/guard-signer/guard-signer.schemas.js +42 -42
- package/dist/services/guard-signer/guard-signer.schemas.js.map +1 -1
- package/dist/services/heatmap/heatmap.js +9 -9
- package/dist/services/heatmap/heatmap.js.map +1 -1
- package/dist/services/heatmap/heatmap.schemas.d.ts +141 -141
- package/dist/services/heatmap/heatmap.schemas.d.ts.map +1 -1
- package/dist/services/heatmap/heatmap.schemas.js +47 -47
- package/dist/services/heatmap/heatmap.schemas.js.map +1 -1
- package/dist/services/internal-transfers/internal-transfers.js +3 -3
- package/dist/services/internal-transfers/internal-transfers.js.map +1 -1
- package/dist/services/internal-transfers/internal-transfers.schemas.d.ts +53 -53
- package/dist/services/internal-transfers/internal-transfers.schemas.d.ts.map +1 -1
- package/dist/services/internal-transfers/internal-transfers.schemas.js +27 -27
- package/dist/services/internal-transfers/internal-transfers.schemas.js.map +1 -1
- package/dist/services/lifecycle/lifecycle.js +10 -10
- package/dist/services/lifecycle/lifecycle.js.map +1 -1
- package/dist/services/lifecycle/lifecycle.schemas.d.ts +614 -614
- package/dist/services/lifecycle/lifecycle.schemas.d.ts.map +1 -1
- package/dist/services/lifecycle/lifecycle.schemas.js +146 -146
- package/dist/services/lifecycle/lifecycle.schemas.js.map +1 -1
- package/dist/services/market-data/market-data.js +6 -6
- package/dist/services/market-data/market-data.js.map +1 -1
- package/dist/services/market-data/market-data.schemas.d.ts +20 -20
- package/dist/services/market-data/market-data.schemas.d.ts.map +1 -1
- package/dist/services/market-data/market-data.schemas.js +51 -55
- package/dist/services/market-data/market-data.schemas.js.map +1 -1
- package/dist/services/market-overview/market-overview.d.ts +1 -1
- package/dist/services/market-overview/market-overview.js +5 -5
- package/dist/services/market-overview/market-overview.js.map +1 -1
- package/dist/services/market-overview/market-overview.schemas.d.ts +39 -36
- package/dist/services/market-overview/market-overview.schemas.d.ts.map +1 -1
- package/dist/services/market-overview/market-overview.schemas.js +34 -32
- package/dist/services/market-overview/market-overview.schemas.js.map +1 -1
- package/dist/services/mfa/mfa.js +27 -27
- package/dist/services/mfa/mfa.js.map +1 -1
- package/dist/services/mfa/mfa.schemas.d.ts +206 -206
- package/dist/services/mfa/mfa.schemas.d.ts.map +1 -1
- package/dist/services/mfa/mfa.schemas.js +83 -83
- package/dist/services/mfa/mfa.schemas.js.map +1 -1
- package/dist/services/orderbook/orderbook.d.ts +2 -2
- package/dist/services/orderbook/orderbook.d.ts.map +1 -1
- package/dist/services/orderbook/orderbook.js +5 -5
- package/dist/services/orderbook/orderbook.js.map +1 -1
- package/dist/services/orderbook/orderbook.schemas.d.ts +23 -23
- package/dist/services/orderbook/orderbook.schemas.d.ts.map +1 -1
- package/dist/services/orderbook/orderbook.schemas.js +15 -15
- package/dist/services/orderbook/orderbook.schemas.js.map +1 -1
- package/dist/services/orders/order-errors.schemas.d.ts +18 -18
- package/dist/services/orders/order-errors.schemas.d.ts.map +1 -1
- package/dist/services/orders/order-errors.schemas.js +8 -8
- package/dist/services/orders/order-errors.schemas.js.map +1 -1
- package/dist/services/orders/orders-batch.schemas.d.ts +492 -492
- package/dist/services/orders/orders-batch.schemas.d.ts.map +1 -1
- package/dist/services/orders/orders-batch.schemas.js +118 -118
- package/dist/services/orders/orders-batch.schemas.js.map +1 -1
- package/dist/services/orders/orders-identifiers.schemas.js +5 -5
- package/dist/services/orders/orders-identifiers.schemas.js.map +1 -1
- package/dist/services/orders/orders-input.schemas.d.ts +657 -648
- package/dist/services/orders/orders-input.schemas.d.ts.map +1 -1
- package/dist/services/orders/orders-input.schemas.js +100 -96
- package/dist/services/orders/orders-input.schemas.js.map +1 -1
- package/dist/services/orders/orders-modify.schemas.d.ts +370 -351
- package/dist/services/orders/orders-modify.schemas.d.ts.map +1 -1
- package/dist/services/orders/orders-modify.schemas.js +48 -44
- package/dist/services/orders/orders-modify.schemas.js.map +1 -1
- package/dist/services/orders/orders-output.schemas.d.ts +179 -179
- package/dist/services/orders/orders-output.schemas.d.ts.map +1 -1
- package/dist/services/orders/orders-output.schemas.js +49 -49
- package/dist/services/orders/orders-output.schemas.js.map +1 -1
- package/dist/services/orders/orders-risk.schemas.d.ts +226 -226
- package/dist/services/orders/orders-risk.schemas.d.ts.map +1 -1
- package/dist/services/orders/orders-risk.schemas.js +69 -69
- package/dist/services/orders/orders-risk.schemas.js.map +1 -1
- package/dist/services/orders/orders.d.ts +8 -8
- package/dist/services/orders/orders.d.ts.map +1 -1
- package/dist/services/orders/orders.js +44 -32
- package/dist/services/orders/orders.js.map +1 -1
- package/dist/services/policies/api-key-policies/api-key-policies.d.ts +6 -6
- package/dist/services/policies/api-key-policies/api-key-policies.d.ts.map +1 -1
- package/dist/services/policies/api-key-policies/api-key-policies.js +11 -11
- package/dist/services/policies/api-key-policies/api-key-policies.js.map +1 -1
- package/dist/services/policies/api-key-policies/api-key-policies.schemas.d.ts +105 -105
- package/dist/services/policies/api-key-policies/api-key-policies.schemas.d.ts.map +1 -1
- package/dist/services/policies/api-key-policies/api-key-policies.schemas.js +49 -49
- package/dist/services/policies/api-key-policies/api-key-policies.schemas.js.map +1 -1
- package/dist/services/policies/shared.d.ts +5 -5
- package/dist/services/policies/shared.d.ts.map +1 -1
- package/dist/services/policies/shared.js +10 -10
- package/dist/services/policies/shared.js.map +1 -1
- package/dist/services/policies/subaccount-policies/subaccount-policies.d.ts +6 -6
- package/dist/services/policies/subaccount-policies/subaccount-policies.d.ts.map +1 -1
- package/dist/services/policies/subaccount-policies/subaccount-policies.js +13 -13
- package/dist/services/policies/subaccount-policies/subaccount-policies.js.map +1 -1
- package/dist/services/policies/subaccount-policies/subaccount-policies.schemas.d.ts +124 -124
- package/dist/services/policies/subaccount-policies/subaccount-policies.schemas.d.ts.map +1 -1
- package/dist/services/policies/subaccount-policies/subaccount-policies.schemas.js +75 -75
- package/dist/services/policies/subaccount-policies/subaccount-policies.schemas.js.map +1 -1
- package/dist/services/shared.js +11 -11
- package/dist/services/shared.js.map +1 -1
- package/dist/services/social-verification/social-verification.d.ts +3 -3
- package/dist/services/social-verification/social-verification.d.ts.map +1 -1
- package/dist/services/social-verification/social-verification.js +7 -7
- package/dist/services/social-verification/social-verification.js.map +1 -1
- package/dist/services/social-verification/social-verification.schemas.d.ts +54 -54
- package/dist/services/social-verification/social-verification.schemas.d.ts.map +1 -1
- package/dist/services/social-verification/social-verification.schemas.js +28 -28
- package/dist/services/social-verification/social-verification.schemas.js.map +1 -1
- package/dist/services/subaccount-resolver.js +5 -3
- package/dist/services/subaccount-resolver.js.map +1 -1
- package/dist/services/subaccounts/subaccounts.d.ts +15 -15
- package/dist/services/subaccounts/subaccounts.d.ts.map +1 -1
- package/dist/services/subaccounts/subaccounts.js +35 -35
- package/dist/services/subaccounts/subaccounts.js.map +1 -1
- package/dist/services/subaccounts/subaccounts.schemas.d.ts +137 -137
- package/dist/services/subaccounts/subaccounts.schemas.d.ts.map +1 -1
- package/dist/services/subaccounts/subaccounts.schemas.js +72 -72
- package/dist/services/subaccounts/subaccounts.schemas.js.map +1 -1
- package/dist/services/trades/trades.d.ts +2 -2
- package/dist/services/trades/trades.d.ts.map +1 -1
- package/dist/services/trades/trades.js +5 -5
- package/dist/services/trades/trades.js.map +1 -1
- package/dist/services/trades/trades.schemas.d.ts +31 -31
- package/dist/services/trades/trades.schemas.d.ts.map +1 -1
- package/dist/services/trades/trades.schemas.js +24 -24
- package/dist/services/trades/trades.schemas.js.map +1 -1
- package/dist/services/trading-withdraws/trading-withdraws.js +8 -8
- package/dist/services/trading-withdraws/trading-withdraws.js.map +1 -1
- package/dist/services/trading-withdraws/trading-withdraws.schemas.d.ts +45 -45
- package/dist/services/trading-withdraws/trading-withdraws.schemas.d.ts.map +1 -1
- package/dist/services/trading-withdraws/trading-withdraws.schemas.js +36 -36
- package/dist/services/trading-withdraws/trading-withdraws.schemas.js.map +1 -1
- package/dist/services/transfers/transfers.d.ts +1 -1
- package/dist/services/transfers/transfers.d.ts.map +1 -1
- package/dist/services/transfers/transfers.js +5 -5
- package/dist/services/transfers/transfers.js.map +1 -1
- package/dist/services/transfers/transfers.schemas.d.ts +42 -42
- package/dist/services/transfers/transfers.schemas.d.ts.map +1 -1
- package/dist/services/transfers/transfers.schemas.js +30 -30
- package/dist/services/transfers/transfers.schemas.js.map +1 -1
- package/dist/services/triggers/trigger-child-order.schemas.js +23 -23
- package/dist/services/triggers/trigger-child-order.schemas.js.map +1 -1
- package/dist/services/triggers/trigger-input.schemas.d.ts +226 -226
- package/dist/services/triggers/trigger-input.schemas.d.ts.map +1 -1
- package/dist/services/triggers/trigger-input.schemas.js +53 -53
- package/dist/services/triggers/trigger-input.schemas.js.map +1 -1
- package/dist/services/triggers/triggers-output.schemas.d.ts +218 -218
- package/dist/services/triggers/triggers-output.schemas.d.ts.map +1 -1
- package/dist/services/triggers/triggers-output.schemas.js +152 -152
- package/dist/services/triggers/triggers-output.schemas.js.map +1 -1
- package/dist/services/triggers/triggers.js +21 -21
- package/dist/services/triggers/triggers.js.map +1 -1
- package/dist/services/whiteboard/whiteboard.js +15 -15
- package/dist/services/whiteboard/whiteboard.js.map +1 -1
- package/dist/services/whiteboard/whiteboard.schemas.d.ts +379 -379
- package/dist/services/whiteboard/whiteboard.schemas.d.ts.map +1 -1
- package/dist/services/whiteboard/whiteboard.schemas.js +71 -71
- package/dist/services/whiteboard/whiteboard.schemas.js.map +1 -1
- package/dist/services/zipper/zipper.js +3 -3
- package/dist/services/zipper/zipper.js.map +1 -1
- package/dist/services/zipper/zipper.schemas.d.ts +1 -1
- package/dist/services/zipper/zipper.schemas.js +54 -54
- package/dist/services/zipper/zipper.schemas.js.map +1 -1
- package/dist/shared/account-scope.d.ts +6 -6
- package/dist/shared/account-scope.d.ts.map +1 -1
- package/dist/shared/account-scope.js +3 -3
- package/dist/shared/account-scope.js.map +1 -1
- package/dist/shared/connect-error-mapping.d.ts +1 -1
- package/dist/shared/connect-error-mapping.js +29 -3
- package/dist/shared/connect-error-mapping.js.map +1 -1
- package/dist/shared/rate-limit.schemas.d.ts +12 -12
- package/dist/shared/rate-limit.schemas.d.ts.map +1 -1
- package/dist/shared/rate-limit.schemas.js +7 -7
- package/dist/shared/rate-limit.schemas.js.map +1 -1
- package/dist/shared/schemas.js +26 -26
- package/dist/shared/schemas.js.map +1 -1
- package/dist/shared/transports.js +7 -12
- package/dist/shared/transports.js.map +1 -1
- package/dist/shared/types.d.ts +12 -0
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/shared/validation.d.ts +14 -0
- package/dist/shared/validation.d.ts.map +1 -0
- package/dist/shared/validation.js +24 -0
- package/dist/shared/validation.js.map +1 -0
- package/dist/utils/connect-order-errors.js +2 -2
- package/dist/utils/connect-order-errors.js.map +1 -1
- package/dist/utils/cookies.d.ts +8 -3
- package/dist/utils/cookies.d.ts.map +1 -1
- package/dist/utils/cookies.js +7 -1
- package/dist/utils/cookies.js.map +1 -1
- package/dist/utils/event-emitter.d.ts +1 -1
- package/dist/utils/event-emitter.d.ts.map +1 -1
- package/dist/utils/event-emitter.js +4 -2
- package/dist/utils/event-emitter.js.map +1 -1
- package/dist/utils/evm.js +2 -2
- package/dist/utils/evm.js.map +1 -1
- package/dist/utils/jwt.d.ts +2 -2
- package/dist/utils/jwt.d.ts.map +1 -1
- package/dist/utils/jwt.js +2 -2
- package/dist/utils/jwt.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { parse, validation_exports } from "../../shared/validation.js";
|
|
1
2
|
import { toConnectCallOptions } from "../../shared/request-options.js";
|
|
2
3
|
import { publicationHandlerErrorContext } from "../../shared/subscription-errors.js";
|
|
3
4
|
import { MarketDataService as MarketDataService$1, MarketTradeSchema } from "../../gen/marketdata/v1/marketdata_pb.js";
|
|
@@ -5,7 +6,6 @@ import { createReadyGate } from "../../shared/decimal-surface.js";
|
|
|
5
6
|
import { GetMarketTradesInputSchema, SpotConfigSchema, createMarketTradeSchema } from "./market-data.schemas.js";
|
|
6
7
|
import { isDev } from "../../utils/is-dev.js";
|
|
7
8
|
import { createClient } from "@connectrpc/connect";
|
|
8
|
-
import * as v from "valibot";
|
|
9
9
|
//#region src/services/market-data/market-data.ts
|
|
10
10
|
/**
|
|
11
11
|
* Exposes public spot trades, spot configuration, and live trade streams.
|
|
@@ -26,10 +26,10 @@ var MarketDataService = class {
|
|
|
26
26
|
*/
|
|
27
27
|
async listTrades(input, options) {
|
|
28
28
|
await this.#scales.ready();
|
|
29
|
-
const validatedInput =
|
|
29
|
+
const validatedInput = parse(GetMarketTradesInputSchema, input);
|
|
30
30
|
const res = await this.#client.getTrades(validatedInput, toConnectCallOptions(options));
|
|
31
31
|
return {
|
|
32
|
-
trades:
|
|
32
|
+
trades: parse(validation_exports.array(this.#marketTradeSchema), res.trades),
|
|
33
33
|
nextPageToken: res.nextPageToken
|
|
34
34
|
};
|
|
35
35
|
}
|
|
@@ -42,13 +42,13 @@ var MarketDataService = class {
|
|
|
42
42
|
*/
|
|
43
43
|
async getSpotConfig(options) {
|
|
44
44
|
const res = await this.#client.getSpotConfig({}, toConnectCallOptions(options));
|
|
45
|
-
return
|
|
45
|
+
return parse(SpotConfigSchema, res);
|
|
46
46
|
}
|
|
47
47
|
/**
|
|
48
48
|
* Subscribes to public trade prints on public:spot:market:trades:{symbolId}:proto for the requested symbol and emits parsed market trades.
|
|
49
49
|
*/
|
|
50
50
|
subscribeTrades(input) {
|
|
51
|
-
const channel = `public:spot:market:trades:${
|
|
51
|
+
const channel = `public:spot:market:trades:${parse(validation_exports.pipe(validation_exports.number(), validation_exports.integer(), validation_exports.gtValue(0)), input.symbolId)}:proto`;
|
|
52
52
|
const notifyError = (error) => {
|
|
53
53
|
if (isDev()) console.error("Market trades subscription error", error);
|
|
54
54
|
input.onError?.(error);
|
|
@@ -59,7 +59,7 @@ var MarketDataService = class {
|
|
|
59
59
|
schema: MarketTradeSchema,
|
|
60
60
|
onPublication: (data) => {
|
|
61
61
|
gate.run(() => {
|
|
62
|
-
const trade =
|
|
62
|
+
const trade = parse(this.#marketTradeSchema, data);
|
|
63
63
|
input.onEvent(trade);
|
|
64
64
|
});
|
|
65
65
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"market-data.js","names":["#client","Proto.MarketDataService","#realtime","#scales","#marketTradeSchema","Proto.MarketTradeSchema"],"sources":["../../../src/services/market-data/market-data.ts"],"sourcesContent":["import * as Proto from \"../../gen/marketdata/v1/marketdata_pb.js\";\nimport type { PolyesterRealtime } from \"../../realtime/types.js\";\nimport { createClient, type Client, type Transport } from \"@connectrpc/connect\";\nimport {\n publicationHandlerErrorContext,\n type SdkSubscriptionErrorContext,\n} from \"../../shared/subscription-errors.js\";\nimport * as v from \"
|
|
1
|
+
{"version":3,"file":"market-data.js","names":["#client","Proto.MarketDataService","#realtime","#scales","#marketTradeSchema","v.parse","v","Proto.MarketTradeSchema"],"sources":["../../../src/services/market-data/market-data.ts"],"sourcesContent":["import * as Proto from \"../../gen/marketdata/v1/marketdata_pb.js\";\nimport type { PolyesterRealtime } from \"../../realtime/types.js\";\nimport { createClient, type Client, type Transport } from \"@connectrpc/connect\";\nimport {\n publicationHandlerErrorContext,\n type SdkSubscriptionErrorContext,\n} from \"../../shared/subscription-errors.js\";\nimport * as v from \"../../shared/validation.js\";\nimport type { BaseSubscribeInput } from \"../../shared/types.js\";\nimport {\n toConnectCallOptions,\n type PolyesterRequestOptions,\n} from \"../../shared/request-options.js\";\nimport { createReadyGate, type SdkScales } from \"../../shared/decimal-surface.js\";\nimport {\n GetMarketTradesInputSchema,\n createMarketTradeSchema,\n type GetMarketTradesInput,\n type SpotConfig,\n SpotConfigSchema,\n type MarketTrade,\n} from \"./market-data.schemas.js\";\nimport { isDev } from \"../../utils/is-dev.js\";\n\ninterface SubscribeTradesInput extends BaseSubscribeInput<MarketTrade> {\n symbolId: number;\n}\n\n/**\n * Exposes public spot trades, spot configuration, and live trade streams.\n */\nexport class MarketDataService {\n #client: Client<typeof Proto.MarketDataService>;\n #realtime: PolyesterRealtime;\n #scales: SdkScales;\n #marketTradeSchema: ReturnType<typeof createMarketTradeSchema>;\n\n constructor(transport: Transport, realtime: PolyesterRealtime, scales: SdkScales) {\n this.#client = createClient(Proto.MarketDataService, transport);\n this.#realtime = realtime;\n this.#scales = scales;\n this.#marketTradeSchema = createMarketTradeSchema(scales);\n }\n\n /**\n * Returns recent public trades for one spot market, ordered newest-first by execution timestamp with match id as a tie-breaker. Supports limit, time bounds, side filtering, and match-id pagination.\n */\n async listTrades(\n input: GetMarketTradesInput,\n options?: PolyesterRequestOptions,\n ): Promise<{ trades: MarketTrade[]; nextPageToken: string }> {\n await this.#scales.ready();\n const validatedInput = v.parse(GetMarketTradesInputSchema, input);\n const res = await this.#client.getTrades(validatedInput, toConnectCallOptions(options));\n return {\n trades: v.parse(v.array(this.#marketTradeSchema), res.trades),\n nextPageToken: res.nextPageToken,\n };\n }\n\n /**\n * Returns the cacheable spot reference-data snapshot, including asset metadata, pair trading constraints, display scales, statuses, and market slippage defaults.\n *\n * This is the catalog's own data source, so it must never wait on catalog\n * readiness (that would deadlock the initial catalog refresh) and carries\n * no decimal conversion.\n */\n async getSpotConfig(options?: PolyesterRequestOptions): Promise<SpotConfig> {\n const res = await this.#client.getSpotConfig({}, toConnectCallOptions(options));\n return v.parse(SpotConfigSchema, res);\n }\n\n /**\n * Subscribes to public trade prints on public:spot:market:trades:{symbolId}:proto for the requested symbol and emits parsed market trades.\n */\n subscribeTrades(input: SubscribeTradesInput): () => void {\n const symbolId = v.parse(v.pipe(v.number(), v.integer(), v.gtValue(0)), input.symbolId);\n const channel = `public:spot:market:trades:${symbolId}:proto`;\n const notifyError = (error: SdkSubscriptionErrorContext) => {\n if (isDev()) {\n console.error(\"Market trades subscription error\", error);\n }\n input.onError?.(error);\n };\n const gate = createReadyGate(\n () => this.#scales.ready(),\n (error) => notifyError(publicationHandlerErrorContext(channel, error)),\n );\n return this.#realtime.connectProtoChannel({\n channel,\n schema: Proto.MarketTradeSchema,\n onPublication: (data) => {\n gate.run(() => {\n const trade = v.parse(this.#marketTradeSchema, data);\n input.onEvent(trade);\n });\n },\n onConnected: () => input.onOpen?.(),\n onDisconnected: () => input.onClose?.(),\n onError: notifyError,\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;AA+BA,IAAa,oBAAb,MAA+B;CAC3B;CACA;CACA;CACA;CAEA,YAAY,WAAsB,UAA6B,QAAmB;EAC9E,KAAKA,UAAU,aAAaC,qBAAyB,SAAS;EAC9D,KAAKC,YAAY;EACjB,KAAKC,UAAU;EACf,KAAKC,qBAAqB,wBAAwB,MAAM;CAC5D;;;;CAKA,MAAM,WACF,OACA,SACyD;EACzD,MAAM,KAAKD,QAAQ,MAAM;EACzB,MAAM,iBAAiBE,MAAQ,4BAA4B,KAAK;EAChE,MAAM,MAAM,MAAM,KAAKL,QAAQ,UAAU,gBAAgB,qBAAqB,OAAO,CAAC;EACtF,OAAO;GACH,QAAQK,MAAQC,mBAAE,MAAM,KAAKF,kBAAkB,GAAG,IAAI,MAAM;GAC5D,eAAe,IAAI;EACvB;CACJ;;;;;;;;CASA,MAAM,cAAc,SAAwD;EACxE,MAAM,MAAM,MAAM,KAAKJ,QAAQ,cAAc,CAAC,GAAG,qBAAqB,OAAO,CAAC;EAC9E,OAAOK,MAAQ,kBAAkB,GAAG;CACxC;;;;CAKA,gBAAgB,OAAyC;EAErD,MAAM,UAAU,6BADCA,MAAQC,mBAAE,KAAKA,mBAAE,OAAO,GAAGA,mBAAE,QAAQ,GAAGA,mBAAE,QAAQ,CAAC,CAAC,GAAG,MAAM,QAC1B,EAAE;EACtD,MAAM,eAAe,UAAuC;GACxD,IAAI,MAAM,GACN,QAAQ,MAAM,oCAAoC,KAAK;GAE3D,MAAM,UAAU,KAAK;EACzB;EACA,MAAM,OAAO,sBACH,KAAKH,QAAQ,MAAM,IACxB,UAAU,YAAY,+BAA+B,SAAS,KAAK,CAAC,CACzE;EACA,OAAO,KAAKD,UAAU,oBAAoB;GACtC;GACA,QAAQK;GACR,gBAAgB,SAAS;IACrB,KAAK,UAAU;KACX,MAAM,QAAQF,MAAQ,KAAKD,oBAAoB,IAAI;KACnD,MAAM,QAAQ,KAAK;IACvB,CAAC;GACL;GACA,mBAAmB,MAAM,SAAS;GAClC,sBAAsB,MAAM,UAAU;GACtC,SAAS;EACb,CAAC;CACL;AACJ"}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { AssetConfig, PAIR_STATUSES, PairConfig, PairMarketDataConfig, PairStatus, SpotConfig } from "../../shared/catalog-config.js";
|
|
2
|
+
import { validation_d_exports } from "../../shared/validation.js";
|
|
2
3
|
import { SideFilter } from "../../gen/marketdata/v1/marketdata_pb.js";
|
|
3
4
|
import { SdkScales } from "../../shared/decimal-surface.js";
|
|
4
|
-
import * as v from "valibot";
|
|
5
5
|
//#region src/services/market-data/market-data.schemas.d.ts
|
|
6
|
-
declare function createMarketTradeSchema(scales: SdkScales):
|
|
7
|
-
readonly symbolId:
|
|
8
|
-
readonly matchId:
|
|
9
|
-
readonly isBuy:
|
|
10
|
-
readonly priceTicks:
|
|
11
|
-
readonly qtyScaled:
|
|
12
|
-
readonly tsNs:
|
|
13
|
-
}, undefined>,
|
|
6
|
+
declare function createMarketTradeSchema(scales: SdkScales): validation_d_exports.SchemaWithPipe<readonly [validation_d_exports.ObjectSchema<{
|
|
7
|
+
readonly symbolId: validation_d_exports.NumberSchema<undefined>;
|
|
8
|
+
readonly matchId: validation_d_exports.BigintSchema<undefined>;
|
|
9
|
+
readonly isBuy: validation_d_exports.BooleanSchema<undefined>;
|
|
10
|
+
readonly priceTicks: validation_d_exports.BigintSchema<undefined>;
|
|
11
|
+
readonly qtyScaled: validation_d_exports.BigintSchema<undefined>;
|
|
12
|
+
readonly tsNs: validation_d_exports.OptionalSchema<validation_d_exports.BigintSchema<undefined>, 0n>;
|
|
13
|
+
}, undefined>, validation_d_exports.TransformAction<{
|
|
14
14
|
symbolId: number;
|
|
15
15
|
matchId: bigint;
|
|
16
16
|
isBuy: boolean;
|
|
@@ -27,20 +27,20 @@ declare function createMarketTradeSchema(scales: SdkScales): v.SchemaWithPipe<re
|
|
|
27
27
|
tsNs: string;
|
|
28
28
|
tsMs: number;
|
|
29
29
|
}>]>;
|
|
30
|
-
type MarketTrade =
|
|
31
|
-
declare function createGetMarketTradesInputSchema():
|
|
32
|
-
readonly symbolId:
|
|
33
|
-
readonly side:
|
|
34
|
-
readonly startTsNs:
|
|
35
|
-
readonly endTsNs:
|
|
36
|
-
readonly limit:
|
|
37
|
-
readonly pageToken:
|
|
38
|
-
}, undefined>,
|
|
30
|
+
type MarketTrade = validation_d_exports.InferOutput<ReturnType<typeof createMarketTradeSchema>>;
|
|
31
|
+
declare function createGetMarketTradesInputSchema(): validation_d_exports.SchemaWithPipe<readonly [validation_d_exports.ObjectSchema<{
|
|
32
|
+
readonly symbolId: validation_d_exports.SchemaWithPipe<readonly [validation_d_exports.NumberSchema<undefined>, validation_d_exports.IntegerAction<number, undefined>, validation_d_exports.GtValueAction<number, 0, undefined>]>;
|
|
33
|
+
readonly side: validation_d_exports.OptionalSchema<validation_d_exports.PicklistSchema<["buy", "sell"], undefined>, undefined>;
|
|
34
|
+
readonly startTsNs: validation_d_exports.SchemaWithPipe<readonly [validation_d_exports.OptionalSchema<validation_d_exports.SchemaWithPipe<readonly [validation_d_exports.StringSchema<undefined>, validation_d_exports.TrimAction]>, undefined>, validation_d_exports.TransformAction<string | undefined, bigint | undefined>]>;
|
|
35
|
+
readonly endTsNs: validation_d_exports.SchemaWithPipe<readonly [validation_d_exports.OptionalSchema<validation_d_exports.SchemaWithPipe<readonly [validation_d_exports.StringSchema<undefined>, validation_d_exports.TrimAction]>, undefined>, validation_d_exports.TransformAction<string | undefined, bigint | undefined>]>;
|
|
36
|
+
readonly limit: validation_d_exports.OptionalSchema<validation_d_exports.SchemaWithPipe<readonly [validation_d_exports.NumberSchema<undefined>, validation_d_exports.IntegerAction<number, undefined>, validation_d_exports.GtValueAction<number, 0, undefined>, validation_d_exports.MaxValueAction<number, 1000, undefined>]>, undefined>;
|
|
37
|
+
readonly pageToken: validation_d_exports.OptionalSchema<validation_d_exports.SchemaWithPipe<readonly [validation_d_exports.StringSchema<undefined>, validation_d_exports.TrimAction]>, "">;
|
|
38
|
+
}, undefined>, validation_d_exports.TransformAction<{
|
|
39
39
|
symbolId: number;
|
|
40
40
|
side?: "buy" | "sell" | undefined;
|
|
41
41
|
startTsNs?: bigint | undefined;
|
|
42
42
|
endTsNs?: bigint | undefined;
|
|
43
|
-
limit
|
|
43
|
+
limit?: number | undefined;
|
|
44
44
|
pageToken: string;
|
|
45
45
|
}, {
|
|
46
46
|
symbolId: number;
|
|
@@ -50,7 +50,7 @@ declare function createGetMarketTradesInputSchema(): v.SchemaWithPipe<readonly [
|
|
|
50
50
|
limit: number | undefined;
|
|
51
51
|
pageToken: string;
|
|
52
52
|
}>]>;
|
|
53
|
-
type GetMarketTradesInput =
|
|
53
|
+
type GetMarketTradesInput = validation_d_exports.InferInput<ReturnType<typeof createGetMarketTradesInputSchema>>;
|
|
54
54
|
//#endregion
|
|
55
55
|
export { type AssetConfig, GetMarketTradesInput, MarketTrade, type PairConfig, type PairStatus, type SpotConfig, createGetMarketTradesInputSchema, createMarketTradeSchema };
|
|
56
56
|
//# sourceMappingURL=market-data.schemas.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"market-data.schemas.d.ts","names":[],"sources":["../../../src/services/market-data/market-data.schemas.ts"],"mappings":";;;;;iBAkBgB,wBAAwB,QAAQ,YAAS,
|
|
1
|
+
{"version":3,"file":"market-data.schemas.d.ts","names":[],"sources":["../../../src/services/market-data/market-data.schemas.ts"],"mappings":";;;;;iBAkBgB,wBAAwB,QAAQ,YAAS,qBAAA,yBAAA,qBAAA;;;;;;;;;;;;;;;;;;;;;;;;KA0B7C,cAAc,qBAAE,YAAY,kBAAkB;iBA2B1C,oCAAgC,qBAAA,yBAAA,qBAAA;;;;;;;;;;;;;;;;;;;;;;KAIpC,uBAAuB,qBAAE,WACjC,kBAAkB"}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
+
import { validation_exports } from "../../shared/validation.js";
|
|
1
2
|
import { tsNsToMs } from "../../utils/time.js";
|
|
2
3
|
import { timestampToMs, tsNsToTimestamp } from "../../utils/timestamp.js";
|
|
4
|
+
import "../../shared/catalog-config.js";
|
|
3
5
|
import { scaledToDecimalOutput } from "../../shared/decimal-surface.js";
|
|
4
6
|
import { SideSchema } from "../shared.js";
|
|
5
|
-
import "../../shared/catalog-config.js";
|
|
6
7
|
import { PairStatusCodec, SideFilterCodec } from "./market-data.codecs.js";
|
|
7
|
-
import * as v from "valibot";
|
|
8
8
|
//#region src/services/market-data/market-data.schemas.ts
|
|
9
9
|
function createMarketTradeSchema(scales) {
|
|
10
|
-
return
|
|
11
|
-
symbolId:
|
|
12
|
-
matchId:
|
|
13
|
-
isBuy:
|
|
14
|
-
priceTicks:
|
|
15
|
-
qtyScaled:
|
|
16
|
-
tsNs:
|
|
17
|
-
}),
|
|
10
|
+
return validation_exports.pipe(validation_exports.object({
|
|
11
|
+
symbolId: validation_exports.number(),
|
|
12
|
+
matchId: validation_exports.bigint(),
|
|
13
|
+
isBuy: validation_exports.boolean(),
|
|
14
|
+
priceTicks: validation_exports.bigint(),
|
|
15
|
+
qtyScaled: validation_exports.bigint(),
|
|
16
|
+
tsNs: validation_exports.optional(validation_exports.bigint(), 0n)
|
|
17
|
+
}), validation_exports.transform((t) => {
|
|
18
18
|
const sideLabel = t.isBuy ? "buy" : "sell";
|
|
19
19
|
return {
|
|
20
20
|
symbolId: t.symbolId,
|
|
@@ -28,18 +28,14 @@ function createMarketTradeSchema(scales) {
|
|
|
28
28
|
};
|
|
29
29
|
}));
|
|
30
30
|
}
|
|
31
|
-
const GetMarketTradesInputSchema =
|
|
32
|
-
symbolId:
|
|
33
|
-
side:
|
|
34
|
-
startTsNs:
|
|
35
|
-
endTsNs:
|
|
36
|
-
limit:
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
return Number.isFinite(lim) && lim > 0 ? lim : void 0;
|
|
40
|
-
})),
|
|
41
|
-
pageToken: v.optional(v.pipe(v.string(), v.trim()), "")
|
|
42
|
-
}), v.transform((input) => ({
|
|
31
|
+
const GetMarketTradesInputSchema = validation_exports.pipe(validation_exports.object({
|
|
32
|
+
symbolId: validation_exports.pipe(validation_exports.number(), validation_exports.integer(), validation_exports.gtValue(0)),
|
|
33
|
+
side: validation_exports.optional(SideSchema),
|
|
34
|
+
startTsNs: validation_exports.pipe(validation_exports.optional(validation_exports.pipe(validation_exports.string(), validation_exports.trim())), validation_exports.transform((v) => v ? BigInt(v) : void 0)),
|
|
35
|
+
endTsNs: validation_exports.pipe(validation_exports.optional(validation_exports.pipe(validation_exports.string(), validation_exports.trim())), validation_exports.transform((v) => v ? BigInt(v) : void 0)),
|
|
36
|
+
limit: validation_exports.optional(validation_exports.pipe(validation_exports.number(), validation_exports.integer(), validation_exports.gtValue(0), validation_exports.maxValue(1e3))),
|
|
37
|
+
pageToken: validation_exports.optional(validation_exports.pipe(validation_exports.string(), validation_exports.trim()), "")
|
|
38
|
+
}), validation_exports.transform((input) => ({
|
|
43
39
|
symbolId: input.symbolId,
|
|
44
40
|
side: input.side ? SideFilterCodec.inputToProto[input.side] : void 0,
|
|
45
41
|
startTime: tsNsToTimestamp(input.startTsNs),
|
|
@@ -47,76 +43,76 @@ const GetMarketTradesInputSchema = v.pipe(v.object({
|
|
|
47
43
|
limit: input.limit,
|
|
48
44
|
pageToken: input.pageToken
|
|
49
45
|
})));
|
|
50
|
-
const AssetConfigSchema =
|
|
46
|
+
const AssetConfigSchema = validation_exports.pipe(validation_exports.object({
|
|
51
47
|
/**
|
|
52
48
|
* Asset identifier/symbol, e.g. 'USDT', 'BTC'.
|
|
53
49
|
*/
|
|
54
|
-
asset:
|
|
50
|
+
asset: validation_exports.string(),
|
|
55
51
|
/**
|
|
56
52
|
* Internal ledger identifier for settlement systems.
|
|
57
53
|
*/
|
|
58
|
-
ledgerId:
|
|
54
|
+
ledgerId: validation_exports.number(),
|
|
59
55
|
/**
|
|
60
56
|
* The friendly display name for the asset (e.g. 'Bitcoin').
|
|
61
57
|
*/
|
|
62
|
-
name:
|
|
58
|
+
name: validation_exports.string(),
|
|
63
59
|
/**
|
|
64
60
|
* UI-only display precision for asset amounts/balances.
|
|
65
61
|
*/
|
|
66
|
-
quantityDisplayDecimals:
|
|
62
|
+
quantityDisplayDecimals: validation_exports.number(),
|
|
67
63
|
/**
|
|
68
64
|
* Fixed integer scaling for quantities/amounts in this asset (0..18).
|
|
69
65
|
*/
|
|
70
|
-
quantityScale:
|
|
71
|
-
}),
|
|
66
|
+
quantityScale: validation_exports.number()
|
|
67
|
+
}), validation_exports.transform((a) => ({
|
|
72
68
|
symbol: a.asset,
|
|
73
69
|
ledgerId: a.ledgerId,
|
|
74
70
|
name: a.name,
|
|
75
71
|
quantityDisplayDecimals: a.quantityDisplayDecimals,
|
|
76
72
|
quantityScale: a.quantityScale
|
|
77
73
|
})));
|
|
78
|
-
const PairMarketDataConfigSchema =
|
|
74
|
+
const PairMarketDataConfigSchema = validation_exports.optional(validation_exports.object({
|
|
79
75
|
/**
|
|
80
76
|
* Available price grouping sizes for the orderbook in quote units.
|
|
81
77
|
* Allows viewing orders bucketed by larger increments (e.g., [0.01, 0.1, 1, 10]).
|
|
82
78
|
*/
|
|
83
|
-
orderbookPriceBuckets:
|
|
79
|
+
orderbookPriceBuckets: validation_exports.array(validation_exports.number()) }), { orderbookPriceBuckets: [] });
|
|
84
80
|
function bpsToPercent(bps) {
|
|
85
81
|
return bps / 100;
|
|
86
82
|
}
|
|
87
|
-
const PairConfigSchema =
|
|
83
|
+
const PairConfigSchema = validation_exports.pipe(validation_exports.object({
|
|
88
84
|
/**
|
|
89
85
|
* Internal engine symbol id for the pair.
|
|
90
86
|
*/
|
|
91
|
-
symbolId:
|
|
87
|
+
symbolId: validation_exports.number(),
|
|
92
88
|
/**
|
|
93
89
|
* Pair symbol string, e.g. 'BTC-USDT'
|
|
94
90
|
*/
|
|
95
|
-
symbol:
|
|
91
|
+
symbol: validation_exports.string(),
|
|
96
92
|
/**
|
|
97
93
|
* Base asset symbol, e.g. 'BTC'
|
|
98
94
|
*/
|
|
99
|
-
baseAsset:
|
|
95
|
+
baseAsset: validation_exports.string(),
|
|
100
96
|
/**
|
|
101
97
|
* Quote asset symbol, e.g. 'USDT'
|
|
102
98
|
*/
|
|
103
|
-
quoteAsset:
|
|
99
|
+
quoteAsset: validation_exports.string(),
|
|
104
100
|
/**
|
|
105
101
|
* (e.g., "0.01") - The smallest price increment allowed. If tick size is 0.01, you can price at $100.00, $100.01, $100.02... but NOT $100.005.
|
|
106
102
|
*/
|
|
107
|
-
tickSize:
|
|
103
|
+
tickSize: validation_exports.string(),
|
|
108
104
|
/**
|
|
109
105
|
* (e.g., "0.0001") - The smallest quantity increment allowed. If step size is 0.0001, you can order 100.0000, 100.0001, 100.0002... but NOT 100.00005.
|
|
110
106
|
*/
|
|
111
|
-
stepSize:
|
|
107
|
+
stepSize: validation_exports.string(),
|
|
112
108
|
/**
|
|
113
109
|
* (e.g., "1") - Minimum order value in quote currency. If it's "1" and quote is USD, your order must be worth at least $1. So you can't buy $0.50 worth of something.
|
|
114
110
|
*/
|
|
115
|
-
minNotionalQuote:
|
|
111
|
+
minNotionalQuote: validation_exports.string(),
|
|
116
112
|
/**
|
|
117
113
|
* Minimum quantity you can order in base currency terms. If it's "0.001" for BTC, smallest order is 0.001 BTC.
|
|
118
114
|
*/
|
|
119
|
-
minQtyBase:
|
|
115
|
+
minQtyBase: validation_exports.string(),
|
|
120
116
|
/**
|
|
121
117
|
* Controls whether trading fee can be deducted from what you receive when buying.
|
|
122
118
|
* Example
|
|
@@ -124,53 +120,53 @@ const PairConfigSchema = v.pipe(v.object({
|
|
|
124
120
|
* - if `true`, you receive 0.999 ETH (fee taken from ETH you're getting)
|
|
125
121
|
* - if `false`, you receive 1 ETH, but you pay the fee separately in the quote currency (e.g., extra USDT)
|
|
126
122
|
*/
|
|
127
|
-
allowBuyFeeFromBase:
|
|
123
|
+
allowBuyFeeFromBase: validation_exports.boolean(),
|
|
128
124
|
/**
|
|
129
125
|
* Default market slippage for buy orders in basis points from proto.
|
|
130
126
|
*/
|
|
131
|
-
defaultMarketSlippageBpsBuy:
|
|
127
|
+
defaultMarketSlippageBpsBuy: validation_exports.optional(validation_exports.number(), 0),
|
|
132
128
|
/**
|
|
133
129
|
* Default market slippage for sell orders in basis points from proto.
|
|
134
130
|
*/
|
|
135
|
-
defaultMarketSlippageBpsSell:
|
|
131
|
+
defaultMarketSlippageBpsSell: validation_exports.optional(validation_exports.number(), 0),
|
|
136
132
|
/**
|
|
137
133
|
* Maximum server/client reference-price drift in basis points from proto.
|
|
138
134
|
*/
|
|
139
|
-
maxClientRefDriftBps:
|
|
135
|
+
maxClientRefDriftBps: validation_exports.optional(validation_exports.number(), 0),
|
|
140
136
|
/**
|
|
141
137
|
* Market-data configuration for this pair (orderbook bucket sizes, depths).
|
|
142
138
|
*/
|
|
143
|
-
marketdata:
|
|
139
|
+
marketdata: validation_exports.optional(PairMarketDataConfigSchema),
|
|
144
140
|
/**
|
|
145
141
|
* Base asset quantity scale copied from AssetConfig.quantityScale.
|
|
146
142
|
*/
|
|
147
|
-
baseQuantityScale:
|
|
143
|
+
baseQuantityScale: validation_exports.number(),
|
|
148
144
|
/**
|
|
149
145
|
* Quote asset quantity scale copied from AssetConfig.quantityScale.
|
|
150
146
|
*/
|
|
151
|
-
quoteQuantityScale:
|
|
147
|
+
quoteQuantityScale: validation_exports.number(),
|
|
152
148
|
/**
|
|
153
149
|
* Optional scheduled listing timestamp (UTC).
|
|
154
150
|
*/
|
|
155
|
-
listingAt:
|
|
151
|
+
listingAt: validation_exports.pipe(validation_exports.optional(validation_exports.unknown()), validation_exports.transform(timestampToMs)),
|
|
156
152
|
/**
|
|
157
153
|
* Optional scheduled delisting timestamp (UTC).
|
|
158
154
|
*/
|
|
159
|
-
delistingAt:
|
|
155
|
+
delistingAt: validation_exports.pipe(validation_exports.optional(validation_exports.unknown()), validation_exports.transform(timestampToMs)),
|
|
160
156
|
/**
|
|
161
157
|
* Operational status of the pair.
|
|
162
158
|
*/
|
|
163
|
-
status:
|
|
164
|
-
}),
|
|
159
|
+
status: validation_exports.pipe(validation_exports.number(), validation_exports.transform((status) => PairStatusCodec.protoToOutput[status] ?? "unknown"))
|
|
160
|
+
}), validation_exports.transform(({ defaultMarketSlippageBpsBuy, defaultMarketSlippageBpsSell, maxClientRefDriftBps, ...pair }) => ({
|
|
165
161
|
...pair,
|
|
166
162
|
defaultMarketSlippagePctBuy: bpsToPercent(defaultMarketSlippageBpsBuy),
|
|
167
163
|
defaultMarketSlippagePctSell: bpsToPercent(defaultMarketSlippageBpsSell),
|
|
168
164
|
maxClientRefDriftPct: bpsToPercent(maxClientRefDriftBps)
|
|
169
165
|
})));
|
|
170
|
-
const SpotConfigSchema =
|
|
171
|
-
assets:
|
|
172
|
-
pairs:
|
|
173
|
-
tsSec:
|
|
166
|
+
const SpotConfigSchema = validation_exports.object({
|
|
167
|
+
assets: validation_exports.array(AssetConfigSchema),
|
|
168
|
+
pairs: validation_exports.array(PairConfigSchema),
|
|
169
|
+
tsSec: validation_exports.pipe(validation_exports.bigint(), validation_exports.transform((v) => Number(v) * 1e3))
|
|
174
170
|
});
|
|
175
171
|
//#endregion
|
|
176
172
|
export { AssetConfigSchema, GetMarketTradesInputSchema, PairConfigSchema, PairMarketDataConfigSchema, SpotConfigSchema, createMarketTradeSchema };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"market-data.schemas.js","names":[],"sources":["../../../src/services/market-data/market-data.schemas.ts"],"sourcesContent":["import * as v from \"valibot\";\nimport { SideSchema } from \"../shared.js\";\nimport {\n PAIR_STATUSES,\n type AssetConfig,\n type PairConfig,\n type PairMarketDataConfig,\n type PairStatus,\n type SpotConfig,\n} from \"../../shared/catalog-config.js\";\nimport { tsNsToMs } from \"../../utils/time.js\";\nimport { timestampToMs, tsNsToTimestamp } from \"../../utils/timestamp.js\";\nimport { scaledToDecimalOutput, type SdkScales } from \"../../shared/decimal-surface.js\";\nimport { PairStatusCodec, SideFilterCodec } from \"./market-data.codecs.js\";\n\nexport type { AssetConfig, PairConfig, PairMarketDataConfig, PairStatus, SpotConfig };\nexport { PAIR_STATUSES };\n\nexport function createMarketTradeSchema(scales: SdkScales) {\n return v.pipe(\n v.object({\n symbolId: v.number(),\n matchId: v.bigint(),\n isBuy: v.boolean(),\n priceTicks: v.bigint(),\n qtyScaled: v.bigint(),\n tsNs: v.optional(v.bigint(), 0n),\n }),\n v.transform((t) => {\n const sideLabel: v.InferOutput<typeof SideSchema> = t.isBuy ? \"buy\" : \"sell\";\n return {\n symbolId: t.symbolId,\n matchId: t.matchId.toString(),\n isBuy: t.isBuy,\n sideLabel,\n qty: scaledToDecimalOutput(t.qtyScaled, scales.baseQty(t.symbolId)),\n price: scaledToDecimalOutput(t.priceTicks, scales.price()),\n tsNs: t.tsNs.toString(),\n tsMs: tsNsToMs(t.tsNs),\n };\n }),\n );\n}\n\nexport type MarketTrade = v.InferOutput<ReturnType<typeof createMarketTradeSchema>>;\n\nexport const GetMarketTradesInputSchema = v.pipe(\n v.object({\n symbolId: v.pipe(v.number(), v.integer(), v.gtValue(0)),\n side: v.optional(SideSchema),\n startTsNs: v.pipe(\n v.optional(v.pipe(v.string(), v.trim())),\n v.transform((v) => (v ? BigInt(v) : undefined)),\n ),\n endTsNs: v.pipe(\n v.optional(v.pipe(v.string(), v.trim())),\n v.transform((v) => (v ? BigInt(v) : undefined)),\n ),\n limit: v.pipe(\n v.optional(v.pipe(v.string(), v.trim()), \"\"),\n v.transform((v) => {\n if (!v) return undefined;\n const lim = Number(v);\n return Number.isFinite(lim) && lim > 0 ? lim : undefined;\n }),\n ),\n pageToken: v.optional(v.pipe(v.string(), v.trim()), \"\"),\n }),\n v.transform((input) => ({\n symbolId: input.symbolId,\n side: input.side ? SideFilterCodec.inputToProto[input.side] : undefined,\n startTime: tsNsToTimestamp(input.startTsNs),\n endTime: tsNsToTimestamp(input.endTsNs),\n limit: input.limit,\n pageToken: input.pageToken,\n })),\n);\n\nexport function createGetMarketTradesInputSchema() {\n return GetMarketTradesInputSchema;\n}\n\nexport type GetMarketTradesInput = v.InferInput<\n ReturnType<typeof createGetMarketTradesInputSchema>\n>;\nexport type GetMarketTradesRequest = v.InferOutput<\n ReturnType<typeof createGetMarketTradesInputSchema>\n>;\n\nexport const AssetConfigSchema = v.pipe(\n v.object({\n /**\n * Asset identifier/symbol, e.g. 'USDT', 'BTC'.\n */\n asset: v.string(),\n /**\n * Internal ledger identifier for settlement systems.\n */\n ledgerId: v.number(),\n /**\n * The friendly display name for the asset (e.g. 'Bitcoin').\n */\n name: v.string(),\n /**\n * UI-only display precision for asset amounts/balances.\n */\n quantityDisplayDecimals: v.number(),\n /**\n * Fixed integer scaling for quantities/amounts in this asset (0..18).\n */\n quantityScale: v.number(),\n }),\n v.transform((a) => ({\n symbol: a.asset,\n ledgerId: a.ledgerId,\n name: a.name,\n quantityDisplayDecimals: a.quantityDisplayDecimals,\n quantityScale: a.quantityScale,\n })),\n);\n\nexport const PairMarketDataConfigSchema = v.optional(\n v.object({\n /**\n * Available price grouping sizes for the orderbook in quote units.\n * Allows viewing orders bucketed by larger increments (e.g., [0.01, 0.1, 1, 10]).\n */\n orderbookPriceBuckets: v.array(v.number()),\n }),\n {\n orderbookPriceBuckets: [] as number[],\n },\n);\n\nfunction bpsToPercent(bps: number): number {\n return bps / 100;\n}\n\nexport const PairConfigSchema = v.pipe(\n v.object({\n /**\n * Internal engine symbol id for the pair.\n */\n symbolId: v.number(),\n /**\n * Pair symbol string, e.g. 'BTC-USDT'\n */\n symbol: v.string(),\n /**\n * Base asset symbol, e.g. 'BTC'\n */\n baseAsset: v.string(),\n /**\n * Quote asset symbol, e.g. 'USDT'\n */\n quoteAsset: v.string(),\n /**\n * (e.g., \"0.01\") - The smallest price increment allowed. If tick size is 0.01, you can price at $100.00, $100.01, $100.02... but NOT $100.005.\n */\n tickSize: v.string(),\n /**\n * (e.g., \"0.0001\") - The smallest quantity increment allowed. If step size is 0.0001, you can order 100.0000, 100.0001, 100.0002... but NOT 100.00005.\n */\n stepSize: v.string(),\n /**\n * (e.g., \"1\") - Minimum order value in quote currency. If it's \"1\" and quote is USD, your order must be worth at least $1. So you can't buy $0.50 worth of something.\n */\n minNotionalQuote: v.string(),\n /**\n * Minimum quantity you can order in base currency terms. If it's \"0.001\" for BTC, smallest order is 0.001 BTC.\n */\n minQtyBase: v.string(),\n\n /**\n * Controls whether trading fee can be deducted from what you receive when buying.\n * Example\n * - You buy 1 ETH, fee is 0.1%\n * - if `true`, you receive 0.999 ETH (fee taken from ETH you're getting)\n * - if `false`, you receive 1 ETH, but you pay the fee separately in the quote currency (e.g., extra USDT)\n */\n allowBuyFeeFromBase: v.boolean(),\n /**\n * Default market slippage for buy orders in basis points from proto.\n */\n defaultMarketSlippageBpsBuy: v.optional(v.number(), 0),\n /**\n * Default market slippage for sell orders in basis points from proto.\n */\n defaultMarketSlippageBpsSell: v.optional(v.number(), 0),\n /**\n * Maximum server/client reference-price drift in basis points from proto.\n */\n maxClientRefDriftBps: v.optional(v.number(), 0),\n\n /**\n * Market-data configuration for this pair (orderbook bucket sizes, depths).\n */\n marketdata: v.optional(PairMarketDataConfigSchema),\n /**\n * Base asset quantity scale copied from AssetConfig.quantityScale.\n */\n baseQuantityScale: v.number(),\n /**\n * Quote asset quantity scale copied from AssetConfig.quantityScale.\n */\n quoteQuantityScale: v.number(),\n /**\n * Optional scheduled listing timestamp (UTC).\n */\n listingAt: v.pipe(v.optional(v.unknown()), v.transform(timestampToMs)),\n /**\n * Optional scheduled delisting timestamp (UTC).\n */\n delistingAt: v.pipe(v.optional(v.unknown()), v.transform(timestampToMs)),\n /**\n * Operational status of the pair.\n */\n status: v.pipe(\n v.number(),\n v.transform(\n (status): PairStatus =>\n PairStatusCodec.protoToOutput[\n status as keyof typeof PairStatusCodec.protoToOutput\n ] ?? \"unknown\",\n ),\n ),\n }),\n v.transform(\n ({\n defaultMarketSlippageBpsBuy,\n defaultMarketSlippageBpsSell,\n maxClientRefDriftBps,\n ...pair\n }) => ({\n ...pair,\n defaultMarketSlippagePctBuy: bpsToPercent(defaultMarketSlippageBpsBuy),\n defaultMarketSlippagePctSell: bpsToPercent(defaultMarketSlippageBpsSell),\n maxClientRefDriftPct: bpsToPercent(maxClientRefDriftBps),\n }),\n ),\n);\n\nexport const SpotConfigSchema = v.object({\n assets: v.array(AssetConfigSchema),\n pairs: v.array(PairConfigSchema),\n tsSec: v.pipe(\n v.bigint(),\n v.transform((v) => Number(v) * 1000),\n ),\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"market-data.schemas.js","names":["v"],"sources":["../../../src/services/market-data/market-data.schemas.ts"],"sourcesContent":["import * as v from \"../../shared/validation.js\";\nimport { SideSchema } from \"../shared.js\";\nimport {\n PAIR_STATUSES,\n type AssetConfig,\n type PairConfig,\n type PairMarketDataConfig,\n type PairStatus,\n type SpotConfig,\n} from \"../../shared/catalog-config.js\";\nimport { tsNsToMs } from \"../../utils/time.js\";\nimport { timestampToMs, tsNsToTimestamp } from \"../../utils/timestamp.js\";\nimport { scaledToDecimalOutput, type SdkScales } from \"../../shared/decimal-surface.js\";\nimport { PairStatusCodec, SideFilterCodec } from \"./market-data.codecs.js\";\n\nexport type { AssetConfig, PairConfig, PairMarketDataConfig, PairStatus, SpotConfig };\nexport { PAIR_STATUSES };\n\nexport function createMarketTradeSchema(scales: SdkScales) {\n return v.pipe(\n v.object({\n symbolId: v.number(),\n matchId: v.bigint(),\n isBuy: v.boolean(),\n priceTicks: v.bigint(),\n qtyScaled: v.bigint(),\n tsNs: v.optional(v.bigint(), 0n),\n }),\n v.transform((t) => {\n const sideLabel: v.InferOutput<typeof SideSchema> = t.isBuy ? \"buy\" : \"sell\";\n return {\n symbolId: t.symbolId,\n matchId: t.matchId.toString(),\n isBuy: t.isBuy,\n sideLabel,\n qty: scaledToDecimalOutput(t.qtyScaled, scales.baseQty(t.symbolId)),\n price: scaledToDecimalOutput(t.priceTicks, scales.price()),\n tsNs: t.tsNs.toString(),\n tsMs: tsNsToMs(t.tsNs),\n };\n }),\n );\n}\n\nexport type MarketTrade = v.InferOutput<ReturnType<typeof createMarketTradeSchema>>;\n\nexport const GetMarketTradesInputSchema = v.pipe(\n v.object({\n symbolId: v.pipe(v.number(), v.integer(), v.gtValue(0)),\n side: v.optional(SideSchema),\n startTsNs: v.pipe(\n v.optional(v.pipe(v.string(), v.trim())),\n v.transform((v) => (v ? BigInt(v) : undefined)),\n ),\n endTsNs: v.pipe(\n v.optional(v.pipe(v.string(), v.trim())),\n v.transform((v) => (v ? BigInt(v) : undefined)),\n ),\n limit: v.optional(v.pipe(v.number(), v.integer(), v.gtValue(0), v.maxValue(1_000))),\n pageToken: v.optional(v.pipe(v.string(), v.trim()), \"\"),\n }),\n v.transform((input) => ({\n symbolId: input.symbolId,\n side: input.side ? SideFilterCodec.inputToProto[input.side] : undefined,\n startTime: tsNsToTimestamp(input.startTsNs),\n endTime: tsNsToTimestamp(input.endTsNs),\n limit: input.limit,\n pageToken: input.pageToken,\n })),\n);\n\nexport function createGetMarketTradesInputSchema() {\n return GetMarketTradesInputSchema;\n}\n\nexport type GetMarketTradesInput = v.InferInput<\n ReturnType<typeof createGetMarketTradesInputSchema>\n>;\nexport type GetMarketTradesRequest = v.InferOutput<\n ReturnType<typeof createGetMarketTradesInputSchema>\n>;\n\nexport const AssetConfigSchema = v.pipe(\n v.object({\n /**\n * Asset identifier/symbol, e.g. 'USDT', 'BTC'.\n */\n asset: v.string(),\n /**\n * Internal ledger identifier for settlement systems.\n */\n ledgerId: v.number(),\n /**\n * The friendly display name for the asset (e.g. 'Bitcoin').\n */\n name: v.string(),\n /**\n * UI-only display precision for asset amounts/balances.\n */\n quantityDisplayDecimals: v.number(),\n /**\n * Fixed integer scaling for quantities/amounts in this asset (0..18).\n */\n quantityScale: v.number(),\n }),\n v.transform((a) => ({\n symbol: a.asset,\n ledgerId: a.ledgerId,\n name: a.name,\n quantityDisplayDecimals: a.quantityDisplayDecimals,\n quantityScale: a.quantityScale,\n })),\n);\n\nexport const PairMarketDataConfigSchema = v.optional(\n v.object({\n /**\n * Available price grouping sizes for the orderbook in quote units.\n * Allows viewing orders bucketed by larger increments (e.g., [0.01, 0.1, 1, 10]).\n */\n orderbookPriceBuckets: v.array(v.number()),\n }),\n {\n orderbookPriceBuckets: [] as number[],\n },\n);\n\nfunction bpsToPercent(bps: number): number {\n return bps / 100;\n}\n\nexport const PairConfigSchema = v.pipe(\n v.object({\n /**\n * Internal engine symbol id for the pair.\n */\n symbolId: v.number(),\n /**\n * Pair symbol string, e.g. 'BTC-USDT'\n */\n symbol: v.string(),\n /**\n * Base asset symbol, e.g. 'BTC'\n */\n baseAsset: v.string(),\n /**\n * Quote asset symbol, e.g. 'USDT'\n */\n quoteAsset: v.string(),\n /**\n * (e.g., \"0.01\") - The smallest price increment allowed. If tick size is 0.01, you can price at $100.00, $100.01, $100.02... but NOT $100.005.\n */\n tickSize: v.string(),\n /**\n * (e.g., \"0.0001\") - The smallest quantity increment allowed. If step size is 0.0001, you can order 100.0000, 100.0001, 100.0002... but NOT 100.00005.\n */\n stepSize: v.string(),\n /**\n * (e.g., \"1\") - Minimum order value in quote currency. If it's \"1\" and quote is USD, your order must be worth at least $1. So you can't buy $0.50 worth of something.\n */\n minNotionalQuote: v.string(),\n /**\n * Minimum quantity you can order in base currency terms. If it's \"0.001\" for BTC, smallest order is 0.001 BTC.\n */\n minQtyBase: v.string(),\n\n /**\n * Controls whether trading fee can be deducted from what you receive when buying.\n * Example\n * - You buy 1 ETH, fee is 0.1%\n * - if `true`, you receive 0.999 ETH (fee taken from ETH you're getting)\n * - if `false`, you receive 1 ETH, but you pay the fee separately in the quote currency (e.g., extra USDT)\n */\n allowBuyFeeFromBase: v.boolean(),\n /**\n * Default market slippage for buy orders in basis points from proto.\n */\n defaultMarketSlippageBpsBuy: v.optional(v.number(), 0),\n /**\n * Default market slippage for sell orders in basis points from proto.\n */\n defaultMarketSlippageBpsSell: v.optional(v.number(), 0),\n /**\n * Maximum server/client reference-price drift in basis points from proto.\n */\n maxClientRefDriftBps: v.optional(v.number(), 0),\n\n /**\n * Market-data configuration for this pair (orderbook bucket sizes, depths).\n */\n marketdata: v.optional(PairMarketDataConfigSchema),\n /**\n * Base asset quantity scale copied from AssetConfig.quantityScale.\n */\n baseQuantityScale: v.number(),\n /**\n * Quote asset quantity scale copied from AssetConfig.quantityScale.\n */\n quoteQuantityScale: v.number(),\n /**\n * Optional scheduled listing timestamp (UTC).\n */\n listingAt: v.pipe(v.optional(v.unknown()), v.transform(timestampToMs)),\n /**\n * Optional scheduled delisting timestamp (UTC).\n */\n delistingAt: v.pipe(v.optional(v.unknown()), v.transform(timestampToMs)),\n /**\n * Operational status of the pair.\n */\n status: v.pipe(\n v.number(),\n v.transform(\n (status): PairStatus =>\n PairStatusCodec.protoToOutput[\n status as keyof typeof PairStatusCodec.protoToOutput\n ] ?? \"unknown\",\n ),\n ),\n }),\n v.transform(\n ({\n defaultMarketSlippageBpsBuy,\n defaultMarketSlippageBpsSell,\n maxClientRefDriftBps,\n ...pair\n }) => ({\n ...pair,\n defaultMarketSlippagePctBuy: bpsToPercent(defaultMarketSlippageBpsBuy),\n defaultMarketSlippagePctSell: bpsToPercent(defaultMarketSlippageBpsSell),\n maxClientRefDriftPct: bpsToPercent(maxClientRefDriftBps),\n }),\n ),\n);\n\nexport const SpotConfigSchema = v.object({\n assets: v.array(AssetConfigSchema),\n pairs: v.array(PairConfigSchema),\n tsSec: v.pipe(\n v.bigint(),\n v.transform((v) => Number(v) * 1000),\n ),\n});\n"],"mappings":"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"}
|
|
@@ -16,7 +16,7 @@ declare class MarketOverviewService {
|
|
|
16
16
|
#private;
|
|
17
17
|
constructor(transport: Transport, realtime: PolyesterRealtime, scales: SdkScales);
|
|
18
18
|
/**
|
|
19
|
-
* Returns market overview rows with last
|
|
19
|
+
* Returns market overview rows with last and index prices, 24h stats, top-of-book values, listing timestamp, and optional sparklines. Supports symbol filtering, sorting, pagination, and sparkline interval selection.
|
|
20
20
|
*/
|
|
21
21
|
list(input?: ListMarketOverviewInput, options?: PolyesterRequestOptions): Promise<{
|
|
22
22
|
markets: MarketOverview[];
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { parse, validation_exports } from "../../shared/validation.js";
|
|
1
2
|
import { toConnectCallOptions } from "../../shared/request-options.js";
|
|
2
3
|
import { publicationHandlerErrorContext } from "../../shared/subscription-errors.js";
|
|
3
4
|
import { createReadyGate } from "../../shared/decimal-surface.js";
|
|
@@ -5,7 +6,6 @@ import { MarketOverviewBatchSchema, MarketOverviewService as MarketOverviewServi
|
|
|
5
6
|
import { snapshotThenStream } from "../../realtime/snapshot-then-stream.js";
|
|
6
7
|
import { ListMarketOverviewInputSchema, createMarketOverviewSchema } from "./market-overview.schemas.js";
|
|
7
8
|
import { createClient } from "@connectrpc/connect";
|
|
8
|
-
import * as v from "valibot";
|
|
9
9
|
//#region src/services/market-overview/market-overview.ts
|
|
10
10
|
/**
|
|
11
11
|
* Provides ticker-style per-market stats and a live merged overview stream.
|
|
@@ -22,14 +22,14 @@ var MarketOverviewService = class {
|
|
|
22
22
|
this.#marketOverviewSchema = createMarketOverviewSchema(scales);
|
|
23
23
|
}
|
|
24
24
|
/**
|
|
25
|
-
* Returns market overview rows with last
|
|
25
|
+
* Returns market overview rows with last and index prices, 24h stats, top-of-book values, listing timestamp, and optional sparklines. Supports symbol filtering, sorting, pagination, and sparkline interval selection.
|
|
26
26
|
*/
|
|
27
27
|
async list(input = {}, options) {
|
|
28
|
-
const validatedInput =
|
|
28
|
+
const validatedInput = parse(ListMarketOverviewInputSchema, input);
|
|
29
29
|
await this.#scales.ready();
|
|
30
30
|
const res = await this.#client.listMarketOverview(validatedInput, toConnectCallOptions(options));
|
|
31
31
|
return {
|
|
32
|
-
markets:
|
|
32
|
+
markets: parse(validation_exports.array(this.#marketOverviewSchema), res.markets),
|
|
33
33
|
nextPageToken: res.nextPageToken
|
|
34
34
|
};
|
|
35
35
|
}
|
|
@@ -54,7 +54,7 @@ var MarketOverviewService = class {
|
|
|
54
54
|
for (const market of markets) handleMarketUpdate(market);
|
|
55
55
|
}
|
|
56
56
|
function parseMarkets(markets) {
|
|
57
|
-
return markets.map((m) =>
|
|
57
|
+
return markets.map((m) => parse(schema, m));
|
|
58
58
|
}
|
|
59
59
|
async function fetchSnapshot() {
|
|
60
60
|
return (await listMarketOverview({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"market-overview.js","names":["#client","Proto.MarketOverviewService","#realtime","#scales","#marketOverviewSchema","Proto.MarketOverviewBatchSchema"],"sources":["../../../src/services/market-overview/market-overview.ts"],"sourcesContent":["import * as Proto from \"../../gen/marketoverview/v1/marketoverview_pb.js\";\nimport { createClient, type Client, type Transport } from \"@connectrpc/connect\";\nimport { publicationHandlerErrorContext } from \"../../shared/subscription-errors.js\";\nimport * as v from \"
|
|
1
|
+
{"version":3,"file":"market-overview.js","names":["#client","Proto.MarketOverviewService","#realtime","#scales","#marketOverviewSchema","v.parse","v","Proto.MarketOverviewBatchSchema"],"sources":["../../../src/services/market-overview/market-overview.ts"],"sourcesContent":["import * as Proto from \"../../gen/marketoverview/v1/marketoverview_pb.js\";\nimport { createClient, type Client, type Transport } from \"@connectrpc/connect\";\nimport { publicationHandlerErrorContext } from \"../../shared/subscription-errors.js\";\nimport * as v from \"../../shared/validation.js\";\nimport type { PolyesterRealtime } from \"../../realtime/types.js\";\nimport { snapshotThenStream } from \"../../realtime/snapshot-then-stream.js\";\nimport type { BaseSubscribeInput } from \"../../shared/types.js\";\nimport {\n toConnectCallOptions,\n type PolyesterRequestOptions,\n} from \"../../shared/request-options.js\";\nimport { createReadyGate, type SdkScales } from \"../../shared/decimal-surface.js\";\nimport {\n ListMarketOverviewInputSchema,\n createMarketOverviewSchema,\n type SparklineIntervalName,\n type ListMarketOverviewInput,\n type MarketOverview,\n} from \"./market-overview.schemas.js\";\n\ninterface SubscribeMarketOverviewInput extends BaseSubscribeInput<MarketOverview[]> {\n includeSparklines?: boolean;\n sparklineIntervals?: SparklineIntervalName[];\n}\n\n/**\n * Provides ticker-style per-market stats and a live merged overview stream.\n */\nexport class MarketOverviewService {\n #client: Client<typeof Proto.MarketOverviewService>;\n #realtime: PolyesterRealtime;\n #scales: SdkScales;\n #marketOverviewSchema: ReturnType<typeof createMarketOverviewSchema>;\n\n constructor(transport: Transport, realtime: PolyesterRealtime, scales: SdkScales) {\n this.#client = createClient(Proto.MarketOverviewService, transport);\n this.#realtime = realtime;\n this.#scales = scales;\n this.#marketOverviewSchema = createMarketOverviewSchema(scales);\n }\n\n /**\n * Returns market overview rows with last and index prices, 24h stats, top-of-book values, listing timestamp, and optional sparklines. Supports symbol filtering, sorting, pagination, and sparkline interval selection.\n */\n async list(\n input: ListMarketOverviewInput = {},\n options?: PolyesterRequestOptions,\n ): Promise<{ markets: MarketOverview[]; nextPageToken: string }> {\n const validatedInput = v.parse(ListMarketOverviewInputSchema, input);\n await this.#scales.ready();\n const res = await this.#client.listMarketOverview(\n validatedInput,\n toConnectCallOptions(options),\n );\n return {\n markets: v.parse(v.array(this.#marketOverviewSchema), res.markets),\n nextPageToken: res.nextPageToken,\n };\n }\n\n /**\n * Subscribes to public:spot:market_overview:updates:proto, fetches an initial snapshot, buffers updates until ready, and emits the merged set of latest market rows. On reconnect it refetches the snapshot before resuming updates.\n */\n subscribe(input: SubscribeMarketOverviewInput): () => void {\n const channel = \"public:spot:market_overview:updates:proto\";\n const bySymbolId = new Map<number, MarketOverview>();\n const includeSparklines = input.includeSparklines ?? true;\n const sparklineIntervals = input.sparklineIntervals ?? [\"24h\"];\n const listMarketOverview = this.list.bind(this);\n const schema = this.#marketOverviewSchema;\n const gate = createReadyGate(\n () => this.#scales.ready(),\n (error) => input.onError?.(publicationHandlerErrorContext(channel, error)),\n );\n\n function emit(): void {\n input.onEvent(Array.from(bySymbolId.values()));\n }\n\n function handleMarketUpdate(m: MarketOverview): void {\n bySymbolId.set(m.symbolId, m);\n }\n\n function applyMarkets(markets: readonly MarketOverview[]): void {\n for (const market of markets) {\n handleMarketUpdate(market);\n }\n }\n\n function parseMarkets(markets: readonly Proto.MarketOverview[]): MarketOverview[] {\n return markets.map((m) => v.parse(schema, m));\n }\n\n async function fetchSnapshot(): Promise<MarketOverview[]> {\n const result = await listMarketOverview({\n includeSparklines,\n sparklineIntervals,\n });\n return result.markets;\n }\n\n const stream = snapshotThenStream({\n realtime: this.#realtime,\n channel,\n schema: Proto.MarketOverviewBatchSchema,\n maxBufferedPublications: 2000,\n snapshotErrorLog: \"Failed to fetch market overview\",\n fetchSnapshot,\n readPublication: (batch) => batch.markets ?? [],\n applySnapshot: (markets, bufferedMarkets) => {\n gate.run(() => {\n bySymbolId.clear();\n applyMarkets(markets);\n applyMarkets(parseMarkets(bufferedMarkets));\n emit();\n });\n },\n applyLivePublications: (markets) => {\n gate.run(() => {\n applyMarkets(parseMarkets(markets));\n emit();\n });\n },\n onOpen: input.onOpen,\n onClose: input.onClose,\n onError: input.onError,\n });\n\n function dispose(): void {\n stream.unsubscribe();\n }\n\n return dispose;\n }\n}\n"],"mappings":";;;;;;;;;;;;AA4BA,IAAa,wBAAb,MAAmC;CAC/B;CACA;CACA;CACA;CAEA,YAAY,WAAsB,UAA6B,QAAmB;EAC9E,KAAKA,UAAU,aAAaC,yBAA6B,SAAS;EAClE,KAAKC,YAAY;EACjB,KAAKC,UAAU;EACf,KAAKC,wBAAwB,2BAA2B,MAAM;CAClE;;;;CAKA,MAAM,KACF,QAAiC,CAAC,GAClC,SAC6D;EAC7D,MAAM,iBAAiBC,MAAQ,+BAA+B,KAAK;EACnE,MAAM,KAAKF,QAAQ,MAAM;EACzB,MAAM,MAAM,MAAM,KAAKH,QAAQ,mBAC3B,gBACA,qBAAqB,OAAO,CAChC;EACA,OAAO;GACH,SAASK,MAAQC,mBAAE,MAAM,KAAKF,qBAAqB,GAAG,IAAI,OAAO;GACjE,eAAe,IAAI;EACvB;CACJ;;;;CAKA,UAAU,OAAiD;EACvD,MAAM,UAAU;EAChB,MAAM,6BAAa,IAAI,IAA4B;EACnD,MAAM,oBAAoB,MAAM,qBAAqB;EACrD,MAAM,qBAAqB,MAAM,sBAAsB,CAAC,KAAK;EAC7D,MAAM,qBAAqB,KAAK,KAAK,KAAK,IAAI;EAC9C,MAAM,SAAS,KAAKA;EACpB,MAAM,OAAO,sBACH,KAAKD,QAAQ,MAAM,IACxB,UAAU,MAAM,UAAU,+BAA+B,SAAS,KAAK,CAAC,CAC7E;EAEA,SAAS,OAAa;GAClB,MAAM,QAAQ,MAAM,KAAK,WAAW,OAAO,CAAC,CAAC;EACjD;EAEA,SAAS,mBAAmB,GAAyB;GACjD,WAAW,IAAI,EAAE,UAAU,CAAC;EAChC;EAEA,SAAS,aAAa,SAA0C;GAC5D,KAAK,MAAM,UAAU,SACjB,mBAAmB,MAAM;EAEjC;EAEA,SAAS,aAAa,SAA4D;GAC9E,OAAO,QAAQ,KAAK,MAAME,MAAQ,QAAQ,CAAC,CAAC;EAChD;EAEA,eAAe,gBAA2C;GAKtD,QAAO,MAJc,mBAAmB;IACpC;IACA;GACJ,CAAC,EAAA,CACa;EAClB;EAEA,MAAM,SAAS,mBAAmB;GAC9B,UAAU,KAAKH;GACf;GACA,QAAQK;GACR,yBAAyB;GACzB,kBAAkB;GAClB;GACA,kBAAkB,UAAU,MAAM,WAAW,CAAC;GAC9C,gBAAgB,SAAS,oBAAoB;IACzC,KAAK,UAAU;KACX,WAAW,MAAM;KACjB,aAAa,OAAO;KACpB,aAAa,aAAa,eAAe,CAAC;KAC1C,KAAK;IACT,CAAC;GACL;GACA,wBAAwB,YAAY;IAChC,KAAK,UAAU;KACX,aAAa,aAAa,OAAO,CAAC;KAClC,KAAK;IACT,CAAC;GACL;GACA,QAAQ,MAAM;GACd,SAAS,MAAM;GACf,SAAS,MAAM;EACnB,CAAC;EAED,SAAS,UAAgB;GACrB,OAAO,YAAY;EACvB;EAEA,OAAO;CACX;AACJ"}
|