@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,39 +1,40 @@
|
|
|
1
|
+
import { validation_d_exports } from "../../shared/validation.js";
|
|
1
2
|
import { MarketOrderBy, SortDirection, SparklineInterval } from "../../gen/marketoverview/v1/marketoverview_pb.js";
|
|
2
3
|
import { DecodedEnum } from "../../utils/types.js";
|
|
3
4
|
import { SdkScales } from "../../shared/decimal-surface.js";
|
|
4
5
|
import "./market-overview.codecs.js";
|
|
5
|
-
import * as v from "valibot";
|
|
6
6
|
//#region src/services/market-overview/market-overview.schemas.d.ts
|
|
7
|
-
declare const SparklineIntervalSchema:
|
|
8
|
-
type SparklineIntervalName =
|
|
7
|
+
declare const SparklineIntervalSchema: validation_d_exports.PicklistSchema<readonly ["1h", "24h", "1w", "1m"], undefined>;
|
|
8
|
+
type SparklineIntervalName = validation_d_exports.InferOutput<typeof SparklineIntervalSchema>;
|
|
9
9
|
type MarketOverviewSparkline = {
|
|
10
10
|
interval: DecodedEnum<SparklineIntervalName>;
|
|
11
11
|
close: string[];
|
|
12
12
|
};
|
|
13
|
-
declare const MarketOverviewOrderBySchema:
|
|
14
|
-
type MarketOverviewOrderBy =
|
|
15
|
-
declare const MarketOverviewSortSchema:
|
|
16
|
-
type MarketOverviewSort =
|
|
17
|
-
declare function createMarketOverviewSchema(scales: SdkScales):
|
|
18
|
-
readonly symbolId:
|
|
19
|
-
readonly symbol:
|
|
20
|
-
readonly lastPriceTicks:
|
|
21
|
-
readonly lastTradeTsNs:
|
|
22
|
-
readonly change24hBps:
|
|
23
|
-
readonly high24hTicks:
|
|
24
|
-
readonly low24hTicks:
|
|
25
|
-
readonly volume24hBaseScaled:
|
|
26
|
-
readonly volume24hQuoteScaled:
|
|
27
|
-
readonly listedTsNs:
|
|
28
|
-
readonly bestBidTicks:
|
|
29
|
-
readonly bestBidQtyScaled:
|
|
30
|
-
readonly bestAskTicks:
|
|
31
|
-
readonly bestAskQtyScaled:
|
|
32
|
-
readonly sparklines:
|
|
33
|
-
readonly interval:
|
|
34
|
-
readonly closeTicks:
|
|
13
|
+
declare const MarketOverviewOrderBySchema: validation_d_exports.PicklistSchema<readonly ["change_24h_bps", "volume_24h_quote", "last_price", "date_added"], undefined>;
|
|
14
|
+
type MarketOverviewOrderBy = validation_d_exports.InferOutput<typeof MarketOverviewOrderBySchema>;
|
|
15
|
+
declare const MarketOverviewSortSchema: validation_d_exports.PicklistSchema<readonly ["asc", "desc"], undefined>;
|
|
16
|
+
type MarketOverviewSort = validation_d_exports.InferOutput<typeof MarketOverviewSortSchema>;
|
|
17
|
+
declare function createMarketOverviewSchema(scales: SdkScales): validation_d_exports.SchemaWithPipe<readonly [validation_d_exports.ObjectSchema<{
|
|
18
|
+
readonly symbolId: validation_d_exports.NumberSchema<undefined>;
|
|
19
|
+
readonly symbol: validation_d_exports.StringSchema<undefined>;
|
|
20
|
+
readonly lastPriceTicks: validation_d_exports.BigintSchema<undefined>;
|
|
21
|
+
readonly lastTradeTsNs: validation_d_exports.OptionalSchema<validation_d_exports.BigintSchema<undefined>, 0n>;
|
|
22
|
+
readonly change24hBps: validation_d_exports.NumberSchema<undefined>;
|
|
23
|
+
readonly high24hTicks: validation_d_exports.BigintSchema<undefined>;
|
|
24
|
+
readonly low24hTicks: validation_d_exports.BigintSchema<undefined>;
|
|
25
|
+
readonly volume24hBaseScaled: validation_d_exports.BigintSchema<undefined>;
|
|
26
|
+
readonly volume24hQuoteScaled: validation_d_exports.BigintSchema<undefined>;
|
|
27
|
+
readonly listedTsNs: validation_d_exports.OptionalSchema<validation_d_exports.BigintSchema<undefined>, 0n>;
|
|
28
|
+
readonly bestBidTicks: validation_d_exports.BigintSchema<undefined>;
|
|
29
|
+
readonly bestBidQtyScaled: validation_d_exports.BigintSchema<undefined>;
|
|
30
|
+
readonly bestAskTicks: validation_d_exports.BigintSchema<undefined>;
|
|
31
|
+
readonly bestAskQtyScaled: validation_d_exports.BigintSchema<undefined>;
|
|
32
|
+
readonly sparklines: validation_d_exports.OptionalSchema<validation_d_exports.ArraySchema<validation_d_exports.ObjectSchema<{
|
|
33
|
+
readonly interval: validation_d_exports.SchemaWithPipe<readonly [validation_d_exports.EnumSchema<typeof SparklineInterval, undefined>, validation_d_exports.TransformAction<SparklineInterval, "unspecified" | "1h" | "24h" | "1w" | "1m">]>;
|
|
34
|
+
readonly closeTicks: validation_d_exports.ArraySchema<validation_d_exports.BigintSchema<undefined>, undefined>;
|
|
35
35
|
}, undefined>, undefined>, readonly []>;
|
|
36
|
-
|
|
36
|
+
readonly indexPriceTicks: validation_d_exports.BigintSchema<undefined>;
|
|
37
|
+
}, undefined>, validation_d_exports.TransformAction<{
|
|
37
38
|
symbolId: number;
|
|
38
39
|
symbol: string;
|
|
39
40
|
lastPriceTicks: bigint;
|
|
@@ -52,6 +53,7 @@ declare function createMarketOverviewSchema(scales: SdkScales): v.SchemaWithPipe
|
|
|
52
53
|
interval: "unspecified" | "1h" | "24h" | "1w" | "1m";
|
|
53
54
|
closeTicks: bigint[];
|
|
54
55
|
}[];
|
|
56
|
+
indexPriceTicks: bigint;
|
|
55
57
|
}, {
|
|
56
58
|
symbolId: number;
|
|
57
59
|
symbol: string;
|
|
@@ -67,19 +69,20 @@ declare function createMarketOverviewSchema(scales: SdkScales): v.SchemaWithPipe
|
|
|
67
69
|
bestBidQty: string;
|
|
68
70
|
bestAsk: string;
|
|
69
71
|
bestAskQty: string;
|
|
72
|
+
indexPrice: string | undefined;
|
|
70
73
|
sparklines: MarketOverviewSparkline[];
|
|
71
74
|
}>]>;
|
|
72
|
-
type MarketOverview =
|
|
73
|
-
declare const ListMarketOverviewInputSchema:
|
|
74
|
-
readonly symbols:
|
|
75
|
-
readonly limit:
|
|
76
|
-
readonly pageToken:
|
|
77
|
-
readonly orderBy:
|
|
78
|
-
readonly sort:
|
|
79
|
-
readonly includeSparklines:
|
|
80
|
-
readonly sparklineIntervals:
|
|
75
|
+
type MarketOverview = validation_d_exports.InferOutput<ReturnType<typeof createMarketOverviewSchema>>;
|
|
76
|
+
declare const ListMarketOverviewInputSchema: validation_d_exports.ObjectSchema<{
|
|
77
|
+
readonly symbols: validation_d_exports.OptionalSchema<validation_d_exports.ArraySchema<validation_d_exports.SchemaWithPipe<readonly [validation_d_exports.StringSchema<undefined>, validation_d_exports.TrimAction, validation_d_exports.MinLengthAction<string, 1, undefined>]>, undefined>, readonly []>;
|
|
78
|
+
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>]>, 500>;
|
|
79
|
+
readonly pageToken: validation_d_exports.OptionalSchema<validation_d_exports.SchemaWithPipe<readonly [validation_d_exports.StringSchema<undefined>, validation_d_exports.TrimAction]>, "">;
|
|
80
|
+
readonly orderBy: validation_d_exports.SchemaWithPipe<readonly [validation_d_exports.OptionalSchema<validation_d_exports.PicklistSchema<readonly ["change_24h_bps", "volume_24h_quote", "last_price", "date_added"], undefined>, "volume_24h_quote">, validation_d_exports.TransformAction<"change_24h_bps" | "volume_24h_quote" | "last_price" | "date_added", MarketOrderBy.ORDER_BY_CHANGE_24H_BPS | MarketOrderBy.ORDER_BY_VOLUME_24H_QUOTE | MarketOrderBy.ORDER_BY_LAST_PRICE | MarketOrderBy.ORDER_BY_DATE_ADDED>]>;
|
|
81
|
+
readonly sort: validation_d_exports.SchemaWithPipe<readonly [validation_d_exports.OptionalSchema<validation_d_exports.PicklistSchema<readonly ["asc", "desc"], undefined>, "desc">, validation_d_exports.TransformAction<"asc" | "desc", SortDirection.SORT_ASC | SortDirection.SORT_DESC>]>;
|
|
82
|
+
readonly includeSparklines: validation_d_exports.OptionalSchema<validation_d_exports.BooleanSchema<undefined>, true>;
|
|
83
|
+
readonly sparklineIntervals: validation_d_exports.SchemaWithPipe<readonly [validation_d_exports.OptionalSchema<validation_d_exports.ArraySchema<validation_d_exports.PicklistSchema<readonly ["1h", "24h", "1w", "1m"], undefined>, undefined>, readonly ["24h"]>, validation_d_exports.TransformAction<("1h" | "24h" | "1w" | "1m")[], (SparklineInterval.SPARKLINE_1H | SparklineInterval.SPARKLINE_24H | SparklineInterval.SPARKLINE_1W | SparklineInterval.SPARKLINE_1M)[]>]>;
|
|
81
84
|
}, undefined>;
|
|
82
|
-
type ListMarketOverviewInput =
|
|
85
|
+
type ListMarketOverviewInput = validation_d_exports.InferInput<typeof ListMarketOverviewInputSchema>;
|
|
83
86
|
//#endregion
|
|
84
87
|
export { ListMarketOverviewInput, ListMarketOverviewInputSchema, MarketOverview, MarketOverviewOrderBy, MarketOverviewOrderBySchema, MarketOverviewSort, MarketOverviewSortSchema, MarketOverviewSparkline, SparklineIntervalName, SparklineIntervalSchema, createMarketOverviewSchema };
|
|
85
88
|
//# sourceMappingURL=market-overview.schemas.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"market-overview.schemas.d.ts","names":[],"sources":["../../../src/services/market-overview/market-overview.schemas.ts"],"mappings":";;;;;;cA2Ba,yBAAuB,
|
|
1
|
+
{"version":3,"file":"market-overview.schemas.d.ts","names":[],"sources":["../../../src/services/market-overview/market-overview.schemas.ts"],"mappings":";;;;;;cA2Ba,yBAAuB,qBAAA;KAExB,wBAAwB,qBAAE,mBAAmB;KAiB7C;EACR,UAAU,YAAY;EACtB;;cAGS,6BAA2B,qBAAA;KAE5B,wBAAwB,qBAAE,mBAAmB;cAE5C,0BAAwB,qBAAA;KAEzB,qBAAqB,qBAAE,mBAAmB;iBAqBtC,2BAA2B,QAAQ,YAAS,qBAAA,yBAAA,qBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAuChD,iBAAiB,qBAAE,YAAY,kBAAkB;cAqChD,+BAA6B,qBAAA;;;;;;;;;KAqB9B,0BAA0B,qBAAE,kBAAkB"}
|
|
@@ -1,36 +1,37 @@
|
|
|
1
|
+
import { validation_exports } from "../../shared/validation.js";
|
|
1
2
|
import { requiredEnumLabel } from "../../shared/proto-enum-codec.js";
|
|
2
3
|
import { tsNsToMs } from "../../utils/time.js";
|
|
3
4
|
import { scaledToDecimalOutput } from "../../shared/decimal-surface.js";
|
|
4
5
|
import { SparklineInterval } from "../../gen/marketoverview/v1/marketoverview_pb.js";
|
|
5
6
|
import { MARKET_OVERVIEW_ORDER_BY_VALUES, MARKET_OVERVIEW_SORT_VALUES, MarketOverviewOrderByCodec, MarketOverviewSortCodec, SPARKLINE_INTERVAL_VALUES, SparklineIntervalCodec } from "./market-overview.codecs.js";
|
|
6
|
-
import * as v from "valibot";
|
|
7
7
|
//#region src/services/market-overview/market-overview.schemas.ts
|
|
8
|
-
const SparklineIntervalSchema =
|
|
9
|
-
const MarketOverviewSparklineRawSchema =
|
|
10
|
-
interval:
|
|
11
|
-
closeTicks:
|
|
8
|
+
const SparklineIntervalSchema = validation_exports.picklist(SPARKLINE_INTERVAL_VALUES);
|
|
9
|
+
const MarketOverviewSparklineRawSchema = validation_exports.object({
|
|
10
|
+
interval: validation_exports.pipe(validation_exports.enum(SparklineInterval), validation_exports.transform((value) => requiredEnumLabel(SparklineIntervalCodec.protoToOutput, value, "MarketOverviewSparklineSchema", "interval"))),
|
|
11
|
+
closeTicks: validation_exports.array(validation_exports.bigint())
|
|
12
12
|
});
|
|
13
|
-
const MarketOverviewOrderBySchema =
|
|
14
|
-
const MarketOverviewSortSchema =
|
|
15
|
-
const MarketOverviewRawSchema =
|
|
16
|
-
symbolId:
|
|
17
|
-
symbol:
|
|
18
|
-
lastPriceTicks:
|
|
19
|
-
lastTradeTsNs:
|
|
20
|
-
change24hBps:
|
|
21
|
-
high24hTicks:
|
|
22
|
-
low24hTicks:
|
|
23
|
-
volume24hBaseScaled:
|
|
24
|
-
volume24hQuoteScaled:
|
|
25
|
-
listedTsNs:
|
|
26
|
-
bestBidTicks:
|
|
27
|
-
bestBidQtyScaled:
|
|
28
|
-
bestAskTicks:
|
|
29
|
-
bestAskQtyScaled:
|
|
30
|
-
sparklines:
|
|
13
|
+
const MarketOverviewOrderBySchema = validation_exports.picklist(MARKET_OVERVIEW_ORDER_BY_VALUES);
|
|
14
|
+
const MarketOverviewSortSchema = validation_exports.picklist(MARKET_OVERVIEW_SORT_VALUES);
|
|
15
|
+
const MarketOverviewRawSchema = validation_exports.object({
|
|
16
|
+
symbolId: validation_exports.number(),
|
|
17
|
+
symbol: validation_exports.string(),
|
|
18
|
+
lastPriceTicks: validation_exports.bigint(),
|
|
19
|
+
lastTradeTsNs: validation_exports.optional(validation_exports.bigint(), 0n),
|
|
20
|
+
change24hBps: validation_exports.number(),
|
|
21
|
+
high24hTicks: validation_exports.bigint(),
|
|
22
|
+
low24hTicks: validation_exports.bigint(),
|
|
23
|
+
volume24hBaseScaled: validation_exports.bigint(),
|
|
24
|
+
volume24hQuoteScaled: validation_exports.bigint(),
|
|
25
|
+
listedTsNs: validation_exports.optional(validation_exports.bigint(), 0n),
|
|
26
|
+
bestBidTicks: validation_exports.bigint(),
|
|
27
|
+
bestBidQtyScaled: validation_exports.bigint(),
|
|
28
|
+
bestAskTicks: validation_exports.bigint(),
|
|
29
|
+
bestAskQtyScaled: validation_exports.bigint(),
|
|
30
|
+
sparklines: validation_exports.optional(validation_exports.array(MarketOverviewSparklineRawSchema), []),
|
|
31
|
+
indexPriceTicks: validation_exports.bigint()
|
|
31
32
|
});
|
|
32
33
|
function createMarketOverviewSchema(scales) {
|
|
33
|
-
return
|
|
34
|
+
return validation_exports.pipe(MarketOverviewRawSchema, validation_exports.transform((m) => {
|
|
34
35
|
const priceScale = scales.price();
|
|
35
36
|
const baseQtyScale = scales.baseQty(m.symbolId);
|
|
36
37
|
const quoteAmountScale = scales.quoteAmount(m.symbolId);
|
|
@@ -49,6 +50,7 @@ function createMarketOverviewSchema(scales) {
|
|
|
49
50
|
bestBidQty: scaledToDecimalOutput(m.bestBidQtyScaled, baseQtyScale),
|
|
50
51
|
bestAsk: scaledToDecimalOutput(m.bestAskTicks, priceScale),
|
|
51
52
|
bestAskQty: scaledToDecimalOutput(m.bestAskQtyScaled, baseQtyScale),
|
|
53
|
+
indexPrice: m.indexPriceTicks > 0n ? scaledToDecimalOutput(m.indexPriceTicks, priceScale) : void 0,
|
|
52
54
|
sparklines: (m.sparklines ?? []).map((s) => ({
|
|
53
55
|
interval: s.interval,
|
|
54
56
|
close: s.closeTicks.map((tick) => scaledToDecimalOutput(tick, priceScale)).reverse()
|
|
@@ -56,14 +58,14 @@ function createMarketOverviewSchema(scales) {
|
|
|
56
58
|
};
|
|
57
59
|
}));
|
|
58
60
|
}
|
|
59
|
-
const ListMarketOverviewInputSchema =
|
|
60
|
-
symbols:
|
|
61
|
-
limit:
|
|
62
|
-
pageToken:
|
|
63
|
-
orderBy:
|
|
64
|
-
sort:
|
|
65
|
-
includeSparklines:
|
|
66
|
-
sparklineIntervals:
|
|
61
|
+
const ListMarketOverviewInputSchema = validation_exports.object({
|
|
62
|
+
symbols: validation_exports.optional(validation_exports.array(validation_exports.pipe(validation_exports.string(), validation_exports.trim(), validation_exports.minLength(1))), []),
|
|
63
|
+
limit: validation_exports.optional(validation_exports.pipe(validation_exports.number(), validation_exports.integer(), validation_exports.gtValue(0)), 500),
|
|
64
|
+
pageToken: validation_exports.optional(validation_exports.pipe(validation_exports.string(), validation_exports.trim()), ""),
|
|
65
|
+
orderBy: validation_exports.pipe(validation_exports.optional(MarketOverviewOrderBySchema, "volume_24h_quote"), validation_exports.transform((v) => MarketOverviewOrderByCodec.inputToProto[v ?? "volume_24h_quote"])),
|
|
66
|
+
sort: validation_exports.pipe(validation_exports.optional(MarketOverviewSortSchema, "desc"), validation_exports.transform((v) => MarketOverviewSortCodec.inputToProto[v ?? "desc"])),
|
|
67
|
+
includeSparklines: validation_exports.optional(validation_exports.boolean(), true),
|
|
68
|
+
sparklineIntervals: validation_exports.pipe(validation_exports.optional(validation_exports.array(SparklineIntervalSchema), ["24h"]), validation_exports.transform((intervals) => (intervals ?? ["24h"]).map((v) => SparklineIntervalCodec.inputToProto[v])))
|
|
67
69
|
});
|
|
68
70
|
//#endregion
|
|
69
71
|
export { ListMarketOverviewInputSchema, MarketOverviewOrderBySchema, MarketOverviewSortSchema, SparklineIntervalSchema, createMarketOverviewSchema };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"market-overview.schemas.js","names":["Proto.SparklineInterval"],"sources":["../../../src/services/market-overview/market-overview.schemas.ts"],"sourcesContent":["import * as Proto from \"../../gen/marketoverview/v1/marketoverview_pb.js\";\nimport * as v from \"
|
|
1
|
+
{"version":3,"file":"market-overview.schemas.js","names":["v","Proto.SparklineInterval"],"sources":["../../../src/services/market-overview/market-overview.schemas.ts"],"sourcesContent":["import * as Proto from \"../../gen/marketoverview/v1/marketoverview_pb.js\";\nimport * as v from \"../../shared/validation.js\";\nimport { tsNsToMs } from \"../../utils/time.js\";\nimport type { DecodedEnum } from \"../../utils/types.js\";\nimport { requiredEnumLabel } from \"../../shared/proto-enum-codec.js\";\nimport { scaledToDecimalOutput, type SdkScales } from \"../../shared/decimal-surface.js\";\nimport {\n SPARKLINE_INTERVAL_VALUES,\n MARKET_OVERVIEW_ORDER_BY_VALUES,\n MARKET_OVERVIEW_SORT_VALUES,\n SparklineIntervalCodec,\n MarketOverviewOrderByCodec,\n MarketOverviewSortCodec,\n} from \"./market-overview.codecs.js\";\n\nexport {\n SPARKLINE_INTERVAL_VALUES,\n MARKET_OVERVIEW_ORDER_BY_VALUES,\n MARKET_OVERVIEW_SORT_VALUES,\n} from \"./market-overview.codecs.js\";\n\nexport {\n MarketOrderBy,\n SortDirection,\n SparklineInterval,\n} from \"../../gen/marketoverview/v1/marketoverview_pb.js\";\n\nexport const SparklineIntervalSchema = v.picklist(SPARKLINE_INTERVAL_VALUES);\n\nexport type SparklineIntervalName = v.InferOutput<typeof SparklineIntervalSchema>;\n\nconst MarketOverviewSparklineRawSchema = v.object({\n interval: v.pipe(\n v.enum(Proto.SparklineInterval),\n v.transform((value) =>\n requiredEnumLabel(\n SparklineIntervalCodec.protoToOutput,\n value,\n \"MarketOverviewSparklineSchema\",\n \"interval\",\n ),\n ),\n ),\n closeTicks: v.array(v.bigint()),\n});\n\nexport type MarketOverviewSparkline = {\n interval: DecodedEnum<SparklineIntervalName>;\n close: string[];\n};\n\nexport const MarketOverviewOrderBySchema = v.picklist(MARKET_OVERVIEW_ORDER_BY_VALUES);\n\nexport type MarketOverviewOrderBy = v.InferOutput<typeof MarketOverviewOrderBySchema>;\n\nexport const MarketOverviewSortSchema = v.picklist(MARKET_OVERVIEW_SORT_VALUES);\n\nexport type MarketOverviewSort = v.InferOutput<typeof MarketOverviewSortSchema>;\n\nconst MarketOverviewRawSchema = v.object({\n symbolId: v.number(),\n symbol: v.string(),\n lastPriceTicks: v.bigint(),\n lastTradeTsNs: v.optional(v.bigint(), 0n),\n change24hBps: v.number(),\n high24hTicks: v.bigint(),\n low24hTicks: v.bigint(),\n volume24hBaseScaled: v.bigint(),\n volume24hQuoteScaled: v.bigint(),\n listedTsNs: v.optional(v.bigint(), 0n),\n bestBidTicks: v.bigint(),\n bestBidQtyScaled: v.bigint(),\n bestAskTicks: v.bigint(),\n bestAskQtyScaled: v.bigint(),\n sparklines: v.optional(v.array(MarketOverviewSparklineRawSchema), []),\n indexPriceTicks: v.bigint(),\n});\n\nexport function createMarketOverviewSchema(scales: SdkScales) {\n return v.pipe(\n MarketOverviewRawSchema,\n v.transform((m) => {\n const priceScale = scales.price();\n const baseQtyScale = scales.baseQty(m.symbolId);\n const quoteAmountScale = scales.quoteAmount(m.symbolId);\n return {\n symbolId: m.symbolId,\n symbol: m.symbol,\n lastPrice: scaledToDecimalOutput(m.lastPriceTicks, priceScale),\n lastTradeTsMs: tsNsToMs(m.lastTradeTsNs),\n change24hBps: m.change24hBps,\n high24h: scaledToDecimalOutput(m.high24hTicks, priceScale),\n low24h: scaledToDecimalOutput(m.low24hTicks, priceScale),\n volume24hBase: scaledToDecimalOutput(m.volume24hBaseScaled, baseQtyScale),\n volume24hQuote: scaledToDecimalOutput(m.volume24hQuoteScaled, quoteAmountScale),\n listedTsMs: tsNsToMs(m.listedTsNs),\n bestBid: scaledToDecimalOutput(m.bestBidTicks, priceScale),\n bestBidQty: scaledToDecimalOutput(m.bestBidQtyScaled, baseQtyScale),\n bestAsk: scaledToDecimalOutput(m.bestAskTicks, priceScale),\n bestAskQty: scaledToDecimalOutput(m.bestAskQtyScaled, baseQtyScale),\n indexPrice:\n m.indexPriceTicks > 0n\n ? scaledToDecimalOutput(m.indexPriceTicks, priceScale)\n : undefined,\n sparklines: (m.sparklines ?? []).map(\n (s): MarketOverviewSparkline => ({\n interval: s.interval,\n close: s.closeTicks\n .map((tick) => scaledToDecimalOutput(tick, priceScale))\n .reverse(),\n }),\n ),\n };\n }),\n );\n}\n\nexport type MarketOverview = v.InferOutput<ReturnType<typeof createMarketOverviewSchema>>;\n\nconst MS_PER_24H = 86_400_000;\n\nfunction change24hBpsFromSparklineFirstLast(sparklines: MarketOverview[\"sparklines\"]): number {\n const s = sparklines.find((e) => e.interval === \"24h\") ?? sparklines[0];\n if (!s || s.close.length < 2) return 0;\n const first = Number(s.close[0] ?? 0);\n const last = Number(s.close.at(-1) ?? 0);\n if (!Number.isFinite(first) || !Number.isFinite(last)) return 0;\n if (first === 0) return 0;\n return Math.round(((last - first) / first) * 10_000);\n}\n\n/**\n * Formats the 24-hour market change percentage for display.\n */\nexport function getMarketOverview24hChangeDisplay(\n market: Pick<MarketOverview, \"change24hBps\" | \"listedTsMs\" | \"sparklines\">,\n nowMs: number = Date.now(),\n): { change24hBps: number; showNewListingSparklineInfo: boolean } {\n const api = market.change24hBps;\n const newish = api === 0 && market.listedTsMs > 0 && nowMs - market.listedTsMs < MS_PER_24H;\n if (!newish) {\n return { change24hBps: api, showNewListingSparklineInfo: false };\n }\n return {\n change24hBps: change24hBpsFromSparklineFirstLast(market.sparklines),\n showNewListingSparklineInfo: true,\n };\n}\n\nexport type MarketOverviewBatch = {\n markets: MarketOverview[];\n tsNs: bigint;\n};\n\nexport const ListMarketOverviewInputSchema = v.object({\n symbols: v.optional(v.array(v.pipe(v.string(), v.trim(), v.minLength(1))), []),\n limit: v.optional(v.pipe(v.number(), v.integer(), v.gtValue(0)), 500),\n pageToken: v.optional(v.pipe(v.string(), v.trim()), \"\"),\n orderBy: v.pipe(\n v.optional(MarketOverviewOrderBySchema, \"volume_24h_quote\"),\n v.transform((v) => MarketOverviewOrderByCodec.inputToProto[v ?? \"volume_24h_quote\"]),\n ),\n sort: v.pipe(\n v.optional(MarketOverviewSortSchema, \"desc\"),\n v.transform((v) => MarketOverviewSortCodec.inputToProto[v ?? \"desc\"]),\n ),\n includeSparklines: v.optional(v.boolean(), true),\n sparklineIntervals: v.pipe(\n v.optional(v.array(SparklineIntervalSchema), [\"24h\"]),\n v.transform((intervals) =>\n (intervals ?? [\"24h\"]).map((v) => SparklineIntervalCodec.inputToProto[v]),\n ),\n ),\n});\n\nexport type ListMarketOverviewInput = v.InferInput<typeof ListMarketOverviewInputSchema>;\n"],"mappings":"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"}
|
package/dist/services/mfa/mfa.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
+
import { parse } from "../../shared/validation.js";
|
|
1
2
|
import { MFAService } from "../../gen/auth/v1/mfa_pb.js";
|
|
2
3
|
import { toConnectCallOptions } from "../../shared/request-options.js";
|
|
3
4
|
import { removeUndefined } from "../../utils/remove-undefined.js";
|
|
4
5
|
import { BeginMfaChallengeInputSchema, BeginMfaChallengeResultSchema, BeginPasskeyEnrollmentInputSchema, BeginPasskeyEnrollmentResultSchema, BeginTotpEnrollmentInputSchema, BeginTotpEnrollmentResultSchema, ClaimFreshStepUpInputSchema, ClaimFreshStepUpResultSchema, CompleteMfaChallengeResultSchema, ConsumeFreshStepUpInputSchema, DeleteMfaFactorInputSchema, FinishPasskeyChallengeInputSchema, FinishPasskeyEnrollmentInputSchema, FinishPasskeyEnrollmentResultSchema, FinishTotpEnrollmentInputSchema, FinishTotpEnrollmentResultSchema, ListMfaFactorsResponseSchema, RegenerateRecoveryCodesInputSchema, RegenerateRecoveryCodesResultSchema, ReleaseFreshStepUpInputSchema, UpdateMfaFactorInputSchema, UpdateMfaFactorResultSchema, VerifyRecoveryCodeChallengeInputSchema, VerifyTotpChallengeInputSchema } from "./mfa.schemas.js";
|
|
5
6
|
import { createClient } from "@connectrpc/connect";
|
|
6
|
-
import * as v from "valibot";
|
|
7
7
|
//#region src/services/mfa/mfa.ts
|
|
8
8
|
/**
|
|
9
9
|
* Manages MFA enrollment, challenges, recovery codes, session elevation, and fresh step-up proofs.
|
|
@@ -18,118 +18,118 @@ var MfaService = class {
|
|
|
18
18
|
*/
|
|
19
19
|
async listFactors(options) {
|
|
20
20
|
const res = await this.#client.listMFAFactors({}, toConnectCallOptions(options));
|
|
21
|
-
return
|
|
21
|
+
return parse(ListMfaFactorsResponseSchema, res);
|
|
22
22
|
}
|
|
23
23
|
/**
|
|
24
24
|
* Creates an authenticator-app enrollment challenge and returns the secret, QR-compatible otpauth URI, enrollment ID, and expiry.
|
|
25
25
|
*/
|
|
26
26
|
async beginTotpEnrollment(input, options) {
|
|
27
|
-
const req =
|
|
27
|
+
const req = parse(BeginTotpEnrollmentInputSchema, input);
|
|
28
28
|
const res = await this.#client.beginTOTPEnrollment(req, toConnectCallOptions(options));
|
|
29
|
-
return
|
|
29
|
+
return parse(BeginTotpEnrollmentResultSchema, res);
|
|
30
30
|
}
|
|
31
31
|
/**
|
|
32
32
|
* Verifies the first authenticator code, activates the factor, and returns one-time recovery codes that are only shown in this response.
|
|
33
33
|
*/
|
|
34
34
|
async finishTotpEnrollment(input, options) {
|
|
35
|
-
const req =
|
|
35
|
+
const req = parse(FinishTotpEnrollmentInputSchema, input);
|
|
36
36
|
const res = await this.#client.finishTOTPEnrollment(req, toConnectCallOptions(options));
|
|
37
|
-
return
|
|
37
|
+
return parse(FinishTotpEnrollmentResultSchema, res);
|
|
38
38
|
}
|
|
39
39
|
/**
|
|
40
40
|
* Creates passkey registration options for a new factor and returns the enrollment challenge and expiry.
|
|
41
41
|
*/
|
|
42
42
|
async beginPasskeyEnrollment(input, options) {
|
|
43
|
-
const req =
|
|
43
|
+
const req = parse(BeginPasskeyEnrollmentInputSchema, input);
|
|
44
44
|
const res = await this.#client.beginPasskeyEnrollment(req, toConnectCallOptions(options));
|
|
45
|
-
return
|
|
45
|
+
return parse(BeginPasskeyEnrollmentResultSchema, res);
|
|
46
46
|
}
|
|
47
47
|
/**
|
|
48
48
|
* Verifies the passkey registration response, activates the factor, and returns one-time recovery codes.
|
|
49
49
|
*/
|
|
50
50
|
async finishPasskeyEnrollment(input, options) {
|
|
51
|
-
const req =
|
|
51
|
+
const req = parse(FinishPasskeyEnrollmentInputSchema, input);
|
|
52
52
|
const res = await this.#client.finishPasskeyEnrollment(req, toConnectCallOptions(options));
|
|
53
|
-
return
|
|
53
|
+
return parse(FinishPasskeyEnrollmentResultSchema, res);
|
|
54
54
|
}
|
|
55
55
|
/**
|
|
56
56
|
* Starts an MFA challenge for either session elevation or fresh step-up and returns allowed factor types plus passkey request options when available.
|
|
57
57
|
*/
|
|
58
58
|
async beginChallenge(input, options) {
|
|
59
|
-
const req =
|
|
59
|
+
const req = parse(BeginMfaChallengeInputSchema, input);
|
|
60
60
|
const res = await this.#client.beginMFAChallenge(req, toConnectCallOptions(options));
|
|
61
|
-
return
|
|
61
|
+
return parse(BeginMfaChallengeResultSchema, res);
|
|
62
62
|
}
|
|
63
63
|
/**
|
|
64
64
|
* Completes a challenge with an authenticator code, returning either an elevated access token or a fresh step-up token depending on the challenge purpose.
|
|
65
65
|
*/
|
|
66
66
|
async verifyTotpChallenge(input, options) {
|
|
67
|
-
const req =
|
|
67
|
+
const req = parse(VerifyTotpChallengeInputSchema, input);
|
|
68
68
|
const res = await this.#client.verifyTOTPChallenge(req, toConnectCallOptions(options));
|
|
69
|
-
return
|
|
69
|
+
return parse(CompleteMfaChallengeResultSchema, res);
|
|
70
70
|
}
|
|
71
71
|
/**
|
|
72
72
|
* Completes a challenge with a passkey authentication response, returning session assurance and the relevant token for the challenge purpose.
|
|
73
73
|
*/
|
|
74
74
|
async finishPasskeyChallenge(input, options) {
|
|
75
|
-
const req =
|
|
75
|
+
const req = parse(FinishPasskeyChallengeInputSchema, input);
|
|
76
76
|
const res = await this.#client.finishPasskeyChallenge(req, toConnectCallOptions(options));
|
|
77
|
-
return
|
|
77
|
+
return parse(CompleteMfaChallengeResultSchema, res);
|
|
78
78
|
}
|
|
79
79
|
/**
|
|
80
80
|
* Consumes a one-time recovery code to complete session elevation or fresh step-up.
|
|
81
81
|
*/
|
|
82
82
|
async verifyRecoveryCodeChallenge(input, options) {
|
|
83
|
-
const req =
|
|
83
|
+
const req = parse(VerifyRecoveryCodeChallengeInputSchema, input);
|
|
84
84
|
const res = await this.#client.verifyRecoveryCodeChallenge(req, toConnectCallOptions(options));
|
|
85
|
-
return
|
|
85
|
+
return parse(CompleteMfaChallengeResultSchema, res);
|
|
86
86
|
}
|
|
87
87
|
/**
|
|
88
88
|
* Removes an enrolled MFA factor by factor ID; backend policy may require fresh step-up for this protected action.
|
|
89
89
|
*/
|
|
90
90
|
async deleteFactor(input, options) {
|
|
91
|
-
const { factorId } =
|
|
91
|
+
const { factorId } = parse(DeleteMfaFactorInputSchema, input);
|
|
92
92
|
await this.#client.deleteMFAFactor({ factorId }, toConnectCallOptions(options));
|
|
93
93
|
}
|
|
94
94
|
/**
|
|
95
95
|
* Updates an MFA factor label, where an empty label clears the display name.
|
|
96
96
|
*/
|
|
97
97
|
async updateFactor(input, options) {
|
|
98
|
-
const { factorId, label } =
|
|
98
|
+
const { factorId, label } = parse(UpdateMfaFactorInputSchema, input);
|
|
99
99
|
const res = await this.#client.updateMFAFactor({
|
|
100
100
|
factorId,
|
|
101
101
|
label
|
|
102
102
|
}, toConnectCallOptions(options));
|
|
103
|
-
return
|
|
103
|
+
return parse(UpdateMfaFactorResultSchema, res);
|
|
104
104
|
}
|
|
105
105
|
/**
|
|
106
106
|
* Rotates recovery codes after step-up and returns the new one-time codes, which are only available in this response.
|
|
107
107
|
*/
|
|
108
108
|
async regenerateRecoveryCodes(input = {}, options) {
|
|
109
|
-
|
|
109
|
+
parse(RegenerateRecoveryCodesInputSchema, input);
|
|
110
110
|
const res = await this.#client.regenerateRecoveryCodes({}, toConnectCallOptions(options));
|
|
111
|
-
return
|
|
111
|
+
return parse(RegenerateRecoveryCodesResultSchema, res);
|
|
112
112
|
}
|
|
113
113
|
/**
|
|
114
114
|
* Binds a fresh step-up proof to one protected request using a request ID, action type, and subject, returning a claim nonce and expiry.
|
|
115
115
|
*/
|
|
116
116
|
async claimFreshStepUp(input, options) {
|
|
117
|
-
const req =
|
|
117
|
+
const req = parse(ClaimFreshStepUpInputSchema, input);
|
|
118
118
|
const res = await this.#client.claimFreshStepUp(req, toConnectCallOptions(options));
|
|
119
|
-
return
|
|
119
|
+
return parse(ClaimFreshStepUpResultSchema, res);
|
|
120
120
|
}
|
|
121
121
|
/**
|
|
122
122
|
* Marks a claimed fresh step-up proof as used after the protected request succeeds, echoing the original request binding and claim nonce.
|
|
123
123
|
*/
|
|
124
124
|
async consumeFreshStepUp(input, options) {
|
|
125
|
-
const req =
|
|
125
|
+
const req = parse(ConsumeFreshStepUpInputSchema, input);
|
|
126
126
|
await this.#client.consumeFreshStepUp(removeUndefined(req), toConnectCallOptions(options));
|
|
127
127
|
}
|
|
128
128
|
/**
|
|
129
129
|
* Releases a claimed fresh step-up proof when the protected request is abandoned or fails, preserving the original request binding and reason.
|
|
130
130
|
*/
|
|
131
131
|
async releaseFreshStepUp(input, options) {
|
|
132
|
-
const req =
|
|
132
|
+
const req = parse(ReleaseFreshStepUpInputSchema, input);
|
|
133
133
|
await this.#client.releaseFreshStepUp(removeUndefined(req), toConnectCallOptions(options));
|
|
134
134
|
}
|
|
135
135
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mfa.js","names":["#client","Proto.MFAService"],"sources":["../../../src/services/mfa/mfa.ts"],"sourcesContent":["import { createClient, type Client, type Transport } from \"@connectrpc/connect\";\nimport * as Proto from \"../../gen/auth/v1/mfa_pb.js\";\nimport { removeUndefined } from \"../../utils/remove-undefined.js\";\nimport {\n toConnectCallOptions,\n type PolyesterMutationOptions,\n type PolyesterRequestOptions,\n} from \"../../shared/request-options.js\";\nimport * as v from \"valibot\";\nimport {\n BeginMfaChallengeInputSchema,\n BeginMfaChallengeResultSchema,\n BeginPasskeyEnrollmentInputSchema,\n BeginPasskeyEnrollmentResultSchema,\n BeginTotpEnrollmentInputSchema,\n BeginTotpEnrollmentResultSchema,\n ClaimFreshStepUpInputSchema,\n ClaimFreshStepUpResultSchema,\n CompleteMfaChallengeResultSchema,\n ConsumeFreshStepUpInputSchema,\n DeleteMfaFactorInputSchema,\n UpdateMfaFactorInputSchema,\n UpdateMfaFactorResultSchema,\n FinishPasskeyChallengeInputSchema,\n FinishPasskeyEnrollmentInputSchema,\n FinishPasskeyEnrollmentResultSchema,\n FinishTotpEnrollmentInputSchema,\n FinishTotpEnrollmentResultSchema,\n ListMfaFactorsResponseSchema,\n RegenerateRecoveryCodesInputSchema,\n RegenerateRecoveryCodesResultSchema,\n ReleaseFreshStepUpInputSchema,\n VerifyRecoveryCodeChallengeInputSchema,\n VerifyTotpChallengeInputSchema,\n type BeginMfaChallengeInput,\n type BeginMfaChallengeResult,\n type BeginPasskeyEnrollmentInput,\n type BeginPasskeyEnrollmentResult,\n type BeginTotpEnrollmentInput,\n type BeginTotpEnrollmentResult,\n type ClaimFreshStepUpInput,\n type ClaimFreshStepUpResult,\n type CompleteMfaChallengeResult,\n type ConsumeFreshStepUpInput,\n type DeleteMfaFactorInput,\n type UpdateMfaFactorInput,\n type UpdateMfaFactorResult,\n type FinishPasskeyChallengeInput,\n type FinishPasskeyEnrollmentInput,\n type FinishPasskeyEnrollmentResult,\n type FinishTotpEnrollmentInput,\n type FinishTotpEnrollmentResult,\n type ListMfaFactorsResult,\n type RegenerateRecoveryCodesInput,\n type RegenerateRecoveryCodesResult,\n type ReleaseFreshStepUpInput,\n type VerifyRecoveryCodeChallengeInput,\n type VerifyTotpChallengeInput,\n} from \"./mfa.schemas.js\";\n\n/**\n * Manages MFA enrollment, challenges, recovery codes, session elevation, and fresh step-up proofs.\n */\nexport class MfaService {\n #client: Client<typeof Proto.MFAService>;\n\n constructor(transport: Transport) {\n this.#client = createClient(Proto.MFAService, transport);\n }\n\n /**\n * Returns the caller's enrolled MFA factors, oldest first, and whether unused recovery codes exist.\n */\n async listFactors(options?: PolyesterRequestOptions): Promise<ListMfaFactorsResult> {\n const res = await this.#client.listMFAFactors({}, toConnectCallOptions(options));\n return v.parse(ListMfaFactorsResponseSchema, res);\n }\n\n /**\n * Creates an authenticator-app enrollment challenge and returns the secret, QR-compatible otpauth URI, enrollment ID, and expiry.\n */\n async beginTotpEnrollment(\n input: BeginTotpEnrollmentInput,\n options?: PolyesterMutationOptions,\n ): Promise<BeginTotpEnrollmentResult> {\n const req = v.parse(BeginTotpEnrollmentInputSchema, input);\n const res = await this.#client.beginTOTPEnrollment(req, toConnectCallOptions(options));\n return v.parse(BeginTotpEnrollmentResultSchema, res);\n }\n\n /**\n * Verifies the first authenticator code, activates the factor, and returns one-time recovery codes that are only shown in this response.\n */\n async finishTotpEnrollment(\n input: FinishTotpEnrollmentInput,\n options?: PolyesterRequestOptions,\n ): Promise<FinishTotpEnrollmentResult> {\n const req = v.parse(FinishTotpEnrollmentInputSchema, input);\n const res = await this.#client.finishTOTPEnrollment(req, toConnectCallOptions(options));\n return v.parse(FinishTotpEnrollmentResultSchema, res);\n }\n\n /**\n * Creates passkey registration options for a new factor and returns the enrollment challenge and expiry.\n */\n async beginPasskeyEnrollment(\n input: BeginPasskeyEnrollmentInput,\n options?: PolyesterMutationOptions,\n ): Promise<BeginPasskeyEnrollmentResult> {\n const req = v.parse(BeginPasskeyEnrollmentInputSchema, input);\n const res = await this.#client.beginPasskeyEnrollment(req, toConnectCallOptions(options));\n return v.parse(BeginPasskeyEnrollmentResultSchema, res);\n }\n\n /**\n * Verifies the passkey registration response, activates the factor, and returns one-time recovery codes.\n */\n async finishPasskeyEnrollment(\n input: FinishPasskeyEnrollmentInput,\n options?: PolyesterRequestOptions,\n ): Promise<FinishPasskeyEnrollmentResult> {\n const req = v.parse(FinishPasskeyEnrollmentInputSchema, input);\n const res = await this.#client.finishPasskeyEnrollment(req, toConnectCallOptions(options));\n return v.parse(FinishPasskeyEnrollmentResultSchema, res);\n }\n\n /**\n * Starts an MFA challenge for either session elevation or fresh step-up and returns allowed factor types plus passkey request options when available.\n */\n async beginChallenge(\n input: BeginMfaChallengeInput,\n options?: PolyesterRequestOptions,\n ): Promise<BeginMfaChallengeResult> {\n const req = v.parse(BeginMfaChallengeInputSchema, input);\n const res = await this.#client.beginMFAChallenge(req, toConnectCallOptions(options));\n return v.parse(BeginMfaChallengeResultSchema, res);\n }\n\n /**\n * Completes a challenge with an authenticator code, returning either an elevated access token or a fresh step-up token depending on the challenge purpose.\n */\n async verifyTotpChallenge(\n input: VerifyTotpChallengeInput,\n options?: PolyesterRequestOptions,\n ): Promise<CompleteMfaChallengeResult> {\n const req = v.parse(VerifyTotpChallengeInputSchema, input);\n const res = await this.#client.verifyTOTPChallenge(req, toConnectCallOptions(options));\n return v.parse(CompleteMfaChallengeResultSchema, res);\n }\n\n /**\n * Completes a challenge with a passkey authentication response, returning session assurance and the relevant token for the challenge purpose.\n */\n async finishPasskeyChallenge(\n input: FinishPasskeyChallengeInput,\n options?: PolyesterRequestOptions,\n ): Promise<CompleteMfaChallengeResult> {\n const req = v.parse(FinishPasskeyChallengeInputSchema, input);\n const res = await this.#client.finishPasskeyChallenge(req, toConnectCallOptions(options));\n return v.parse(CompleteMfaChallengeResultSchema, res);\n }\n\n /**\n * Consumes a one-time recovery code to complete session elevation or fresh step-up.\n */\n async verifyRecoveryCodeChallenge(\n input: VerifyRecoveryCodeChallengeInput,\n options?: PolyesterRequestOptions,\n ): Promise<CompleteMfaChallengeResult> {\n const req = v.parse(VerifyRecoveryCodeChallengeInputSchema, input);\n const res = await this.#client.verifyRecoveryCodeChallenge(\n req,\n toConnectCallOptions(options),\n );\n return v.parse(CompleteMfaChallengeResultSchema, res);\n }\n\n /**\n * Removes an enrolled MFA factor by factor ID; backend policy may require fresh step-up for this protected action.\n */\n async deleteFactor(\n input: DeleteMfaFactorInput,\n options?: PolyesterMutationOptions,\n ): Promise<void> {\n const { factorId } = v.parse(DeleteMfaFactorInputSchema, input);\n await this.#client.deleteMFAFactor({ factorId }, toConnectCallOptions(options));\n }\n\n /**\n * Updates an MFA factor label, where an empty label clears the display name.\n */\n async updateFactor(\n input: UpdateMfaFactorInput,\n options?: PolyesterMutationOptions,\n ): Promise<UpdateMfaFactorResult> {\n const { factorId, label } = v.parse(UpdateMfaFactorInputSchema, input);\n const res = await this.#client.updateMFAFactor(\n { factorId, label },\n toConnectCallOptions(options),\n );\n return v.parse(UpdateMfaFactorResultSchema, res);\n }\n\n /**\n * Rotates recovery codes after step-up and returns the new one-time codes, which are only available in this response.\n */\n async regenerateRecoveryCodes(\n input: RegenerateRecoveryCodesInput = {},\n options?: PolyesterMutationOptions,\n ): Promise<RegenerateRecoveryCodesResult> {\n v.parse(RegenerateRecoveryCodesInputSchema, input);\n const res = await this.#client.regenerateRecoveryCodes({}, toConnectCallOptions(options));\n return v.parse(RegenerateRecoveryCodesResultSchema, res);\n }\n\n /**\n * Binds a fresh step-up proof to one protected request using a request ID, action type, and subject, returning a claim nonce and expiry.\n */\n async claimFreshStepUp(\n input: ClaimFreshStepUpInput,\n options?: PolyesterRequestOptions,\n ): Promise<ClaimFreshStepUpResult> {\n const req = v.parse(ClaimFreshStepUpInputSchema, input);\n const res = await this.#client.claimFreshStepUp(req, toConnectCallOptions(options));\n return v.parse(ClaimFreshStepUpResultSchema, res);\n }\n\n /**\n * Marks a claimed fresh step-up proof as used after the protected request succeeds, echoing the original request binding and claim nonce.\n */\n async consumeFreshStepUp(\n input: ConsumeFreshStepUpInput,\n options?: PolyesterRequestOptions,\n ): Promise<void> {\n const req = v.parse(ConsumeFreshStepUpInputSchema, input);\n await this.#client.consumeFreshStepUp(removeUndefined(req), toConnectCallOptions(options));\n }\n\n /**\n * Releases a claimed fresh step-up proof when the protected request is abandoned or fails, preserving the original request binding and reason.\n */\n async releaseFreshStepUp(\n input: ReleaseFreshStepUpInput,\n options?: PolyesterRequestOptions,\n ): Promise<void> {\n const req = v.parse(ReleaseFreshStepUpInputSchema, input);\n await this.#client.releaseFreshStepUp(removeUndefined(req), toConnectCallOptions(options));\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mfa.js","names":["#client","Proto.MFAService","v.parse"],"sources":["../../../src/services/mfa/mfa.ts"],"sourcesContent":["import { createClient, type Client, type Transport } from \"@connectrpc/connect\";\nimport * as Proto from \"../../gen/auth/v1/mfa_pb.js\";\nimport { removeUndefined } from \"../../utils/remove-undefined.js\";\nimport {\n toConnectCallOptions,\n type PolyesterMutationOptions,\n type PolyesterRequestOptions,\n} from \"../../shared/request-options.js\";\nimport * as v from \"../../shared/validation.js\";\nimport {\n BeginMfaChallengeInputSchema,\n BeginMfaChallengeResultSchema,\n BeginPasskeyEnrollmentInputSchema,\n BeginPasskeyEnrollmentResultSchema,\n BeginTotpEnrollmentInputSchema,\n BeginTotpEnrollmentResultSchema,\n ClaimFreshStepUpInputSchema,\n ClaimFreshStepUpResultSchema,\n CompleteMfaChallengeResultSchema,\n ConsumeFreshStepUpInputSchema,\n DeleteMfaFactorInputSchema,\n UpdateMfaFactorInputSchema,\n UpdateMfaFactorResultSchema,\n FinishPasskeyChallengeInputSchema,\n FinishPasskeyEnrollmentInputSchema,\n FinishPasskeyEnrollmentResultSchema,\n FinishTotpEnrollmentInputSchema,\n FinishTotpEnrollmentResultSchema,\n ListMfaFactorsResponseSchema,\n RegenerateRecoveryCodesInputSchema,\n RegenerateRecoveryCodesResultSchema,\n ReleaseFreshStepUpInputSchema,\n VerifyRecoveryCodeChallengeInputSchema,\n VerifyTotpChallengeInputSchema,\n type BeginMfaChallengeInput,\n type BeginMfaChallengeResult,\n type BeginPasskeyEnrollmentInput,\n type BeginPasskeyEnrollmentResult,\n type BeginTotpEnrollmentInput,\n type BeginTotpEnrollmentResult,\n type ClaimFreshStepUpInput,\n type ClaimFreshStepUpResult,\n type CompleteMfaChallengeResult,\n type ConsumeFreshStepUpInput,\n type DeleteMfaFactorInput,\n type UpdateMfaFactorInput,\n type UpdateMfaFactorResult,\n type FinishPasskeyChallengeInput,\n type FinishPasskeyEnrollmentInput,\n type FinishPasskeyEnrollmentResult,\n type FinishTotpEnrollmentInput,\n type FinishTotpEnrollmentResult,\n type ListMfaFactorsResult,\n type RegenerateRecoveryCodesInput,\n type RegenerateRecoveryCodesResult,\n type ReleaseFreshStepUpInput,\n type VerifyRecoveryCodeChallengeInput,\n type VerifyTotpChallengeInput,\n} from \"./mfa.schemas.js\";\n\n/**\n * Manages MFA enrollment, challenges, recovery codes, session elevation, and fresh step-up proofs.\n */\nexport class MfaService {\n #client: Client<typeof Proto.MFAService>;\n\n constructor(transport: Transport) {\n this.#client = createClient(Proto.MFAService, transport);\n }\n\n /**\n * Returns the caller's enrolled MFA factors, oldest first, and whether unused recovery codes exist.\n */\n async listFactors(options?: PolyesterRequestOptions): Promise<ListMfaFactorsResult> {\n const res = await this.#client.listMFAFactors({}, toConnectCallOptions(options));\n return v.parse(ListMfaFactorsResponseSchema, res);\n }\n\n /**\n * Creates an authenticator-app enrollment challenge and returns the secret, QR-compatible otpauth URI, enrollment ID, and expiry.\n */\n async beginTotpEnrollment(\n input: BeginTotpEnrollmentInput,\n options?: PolyesterMutationOptions,\n ): Promise<BeginTotpEnrollmentResult> {\n const req = v.parse(BeginTotpEnrollmentInputSchema, input);\n const res = await this.#client.beginTOTPEnrollment(req, toConnectCallOptions(options));\n return v.parse(BeginTotpEnrollmentResultSchema, res);\n }\n\n /**\n * Verifies the first authenticator code, activates the factor, and returns one-time recovery codes that are only shown in this response.\n */\n async finishTotpEnrollment(\n input: FinishTotpEnrollmentInput,\n options?: PolyesterRequestOptions,\n ): Promise<FinishTotpEnrollmentResult> {\n const req = v.parse(FinishTotpEnrollmentInputSchema, input);\n const res = await this.#client.finishTOTPEnrollment(req, toConnectCallOptions(options));\n return v.parse(FinishTotpEnrollmentResultSchema, res);\n }\n\n /**\n * Creates passkey registration options for a new factor and returns the enrollment challenge and expiry.\n */\n async beginPasskeyEnrollment(\n input: BeginPasskeyEnrollmentInput,\n options?: PolyesterMutationOptions,\n ): Promise<BeginPasskeyEnrollmentResult> {\n const req = v.parse(BeginPasskeyEnrollmentInputSchema, input);\n const res = await this.#client.beginPasskeyEnrollment(req, toConnectCallOptions(options));\n return v.parse(BeginPasskeyEnrollmentResultSchema, res);\n }\n\n /**\n * Verifies the passkey registration response, activates the factor, and returns one-time recovery codes.\n */\n async finishPasskeyEnrollment(\n input: FinishPasskeyEnrollmentInput,\n options?: PolyesterRequestOptions,\n ): Promise<FinishPasskeyEnrollmentResult> {\n const req = v.parse(FinishPasskeyEnrollmentInputSchema, input);\n const res = await this.#client.finishPasskeyEnrollment(req, toConnectCallOptions(options));\n return v.parse(FinishPasskeyEnrollmentResultSchema, res);\n }\n\n /**\n * Starts an MFA challenge for either session elevation or fresh step-up and returns allowed factor types plus passkey request options when available.\n */\n async beginChallenge(\n input: BeginMfaChallengeInput,\n options?: PolyesterRequestOptions,\n ): Promise<BeginMfaChallengeResult> {\n const req = v.parse(BeginMfaChallengeInputSchema, input);\n const res = await this.#client.beginMFAChallenge(req, toConnectCallOptions(options));\n return v.parse(BeginMfaChallengeResultSchema, res);\n }\n\n /**\n * Completes a challenge with an authenticator code, returning either an elevated access token or a fresh step-up token depending on the challenge purpose.\n */\n async verifyTotpChallenge(\n input: VerifyTotpChallengeInput,\n options?: PolyesterRequestOptions,\n ): Promise<CompleteMfaChallengeResult> {\n const req = v.parse(VerifyTotpChallengeInputSchema, input);\n const res = await this.#client.verifyTOTPChallenge(req, toConnectCallOptions(options));\n return v.parse(CompleteMfaChallengeResultSchema, res);\n }\n\n /**\n * Completes a challenge with a passkey authentication response, returning session assurance and the relevant token for the challenge purpose.\n */\n async finishPasskeyChallenge(\n input: FinishPasskeyChallengeInput,\n options?: PolyesterRequestOptions,\n ): Promise<CompleteMfaChallengeResult> {\n const req = v.parse(FinishPasskeyChallengeInputSchema, input);\n const res = await this.#client.finishPasskeyChallenge(req, toConnectCallOptions(options));\n return v.parse(CompleteMfaChallengeResultSchema, res);\n }\n\n /**\n * Consumes a one-time recovery code to complete session elevation or fresh step-up.\n */\n async verifyRecoveryCodeChallenge(\n input: VerifyRecoveryCodeChallengeInput,\n options?: PolyesterRequestOptions,\n ): Promise<CompleteMfaChallengeResult> {\n const req = v.parse(VerifyRecoveryCodeChallengeInputSchema, input);\n const res = await this.#client.verifyRecoveryCodeChallenge(\n req,\n toConnectCallOptions(options),\n );\n return v.parse(CompleteMfaChallengeResultSchema, res);\n }\n\n /**\n * Removes an enrolled MFA factor by factor ID; backend policy may require fresh step-up for this protected action.\n */\n async deleteFactor(\n input: DeleteMfaFactorInput,\n options?: PolyesterMutationOptions,\n ): Promise<void> {\n const { factorId } = v.parse(DeleteMfaFactorInputSchema, input);\n await this.#client.deleteMFAFactor({ factorId }, toConnectCallOptions(options));\n }\n\n /**\n * Updates an MFA factor label, where an empty label clears the display name.\n */\n async updateFactor(\n input: UpdateMfaFactorInput,\n options?: PolyesterMutationOptions,\n ): Promise<UpdateMfaFactorResult> {\n const { factorId, label } = v.parse(UpdateMfaFactorInputSchema, input);\n const res = await this.#client.updateMFAFactor(\n { factorId, label },\n toConnectCallOptions(options),\n );\n return v.parse(UpdateMfaFactorResultSchema, res);\n }\n\n /**\n * Rotates recovery codes after step-up and returns the new one-time codes, which are only available in this response.\n */\n async regenerateRecoveryCodes(\n input: RegenerateRecoveryCodesInput = {},\n options?: PolyesterMutationOptions,\n ): Promise<RegenerateRecoveryCodesResult> {\n v.parse(RegenerateRecoveryCodesInputSchema, input);\n const res = await this.#client.regenerateRecoveryCodes({}, toConnectCallOptions(options));\n return v.parse(RegenerateRecoveryCodesResultSchema, res);\n }\n\n /**\n * Binds a fresh step-up proof to one protected request using a request ID, action type, and subject, returning a claim nonce and expiry.\n */\n async claimFreshStepUp(\n input: ClaimFreshStepUpInput,\n options?: PolyesterRequestOptions,\n ): Promise<ClaimFreshStepUpResult> {\n const req = v.parse(ClaimFreshStepUpInputSchema, input);\n const res = await this.#client.claimFreshStepUp(req, toConnectCallOptions(options));\n return v.parse(ClaimFreshStepUpResultSchema, res);\n }\n\n /**\n * Marks a claimed fresh step-up proof as used after the protected request succeeds, echoing the original request binding and claim nonce.\n */\n async consumeFreshStepUp(\n input: ConsumeFreshStepUpInput,\n options?: PolyesterRequestOptions,\n ): Promise<void> {\n const req = v.parse(ConsumeFreshStepUpInputSchema, input);\n await this.#client.consumeFreshStepUp(removeUndefined(req), toConnectCallOptions(options));\n }\n\n /**\n * Releases a claimed fresh step-up proof when the protected request is abandoned or fails, preserving the original request binding and reason.\n */\n async releaseFreshStepUp(\n input: ReleaseFreshStepUpInput,\n options?: PolyesterRequestOptions,\n ): Promise<void> {\n const req = v.parse(ReleaseFreshStepUpInputSchema, input);\n await this.#client.releaseFreshStepUp(removeUndefined(req), toConnectCallOptions(options));\n }\n}\n"],"mappings":"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"}
|