@polyester/sdk 0.3.1 → 0.4.1
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/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/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/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.map +1 -1
- package/dist/services/address-book/address-book.schemas.js +2 -1
- package/dist/services/address-book/address-book.schemas.js.map +1 -1
- 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/auth/auth.d.ts +9 -3
- package/dist/services/auth/auth.d.ts.map +1 -1
- package/dist/services/auth/auth.js +11 -7
- package/dist/services/auth/auth.js.map +1 -1
- package/dist/services/auth/profile/profile.d.ts.map +1 -1
- package/dist/services/auth/profile/profile.js +7 -6
- package/dist/services/auth/profile/profile.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.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.d.ts.map +1 -1
- package/dist/services/balances/balances.js +9 -8
- package/dist/services/balances/balances.js.map +1 -1
- package/dist/services/balances/balances.schemas.d.ts +1 -1
- package/dist/services/balances/balances.schemas.d.ts.map +1 -1
- package/dist/services/balances/balances.schemas.js +1 -1
- package/dist/services/balances/balances.schemas.js.map +1 -1
- package/dist/services/candles/candles.d.ts.map +1 -1
- package/dist/services/candles/candles.js +10 -9
- package/dist/services/candles/candles.js.map +1 -1
- package/dist/services/candles/candles.schemas.d.ts +11 -11
- package/dist/services/candles/candles.schemas.d.ts.map +1 -1
- package/dist/services/candles/candles.schemas.js +1 -2
- 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/deposit/deposit.js +5 -5
- package/dist/services/deposit/deposit.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/heatmap/heatmap.d.ts.map +1 -1
- package/dist/services/heatmap/heatmap.js +6 -5
- package/dist/services/heatmap/heatmap.js.map +1 -1
- package/dist/services/heatmap/heatmap.schemas.d.ts +17 -17
- package/dist/services/heatmap/heatmap.schemas.js +1 -1
- 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/lifecycle/lifecycle.d.ts.map +1 -1
- package/dist/services/lifecycle/lifecycle.js +9 -8
- package/dist/services/lifecycle/lifecycle.js.map +1 -1
- package/dist/services/market-data/market-data.d.ts.map +1 -1
- package/dist/services/market-data/market-data.js +6 -5
- package/dist/services/market-data/market-data.js.map +1 -1
- package/dist/services/market-data/market-data.schemas.d.ts +2 -2
- package/dist/services/market-data/market-data.schemas.d.ts.map +1 -1
- package/dist/services/market-data/market-data.schemas.js +2 -6
- package/dist/services/market-data/market-data.schemas.js.map +1 -1
- package/dist/services/market-overview/market-overview.d.ts.map +1 -1
- package/dist/services/market-overview/market-overview.js +4 -3
- package/dist/services/market-overview/market-overview.js.map +1 -1
- package/dist/services/market-overview/market-overview.schemas.d.ts +3 -3
- package/dist/services/mfa/mfa.js +27 -27
- package/dist/services/mfa/mfa.js.map +1 -1
- package/dist/services/orderbook/orderbook.d.ts.map +1 -1
- package/dist/services/orderbook/orderbook.js +5 -4
- package/dist/services/orderbook/orderbook.js.map +1 -1
- package/dist/services/orderbook/orderbook.schemas.d.ts +1 -1
- package/dist/services/orders/orders-batch.schemas.d.ts +14 -14
- package/dist/services/orders/orders-batch.schemas.js +1 -1
- package/dist/services/orders/orders-input.schemas.d.ts +13 -4
- package/dist/services/orders/orders-input.schemas.d.ts.map +1 -1
- package/dist/services/orders/orders-input.schemas.js +8 -4
- package/dist/services/orders/orders-input.schemas.js.map +1 -1
- package/dist/services/orders/orders-modify.schemas.d.ts +22 -3
- package/dist/services/orders/orders-modify.schemas.d.ts.map +1 -1
- package/dist/services/orders/orders-modify.schemas.js +7 -3
- package/dist/services/orders/orders-modify.schemas.js.map +1 -1
- package/dist/services/orders/orders-output.schemas.d.ts +12 -12
- package/dist/services/orders/orders.d.ts +2 -2
- package/dist/services/orders/orders.d.ts.map +1 -1
- package/dist/services/orders/orders.js +44 -31
- package/dist/services/orders/orders.js.map +1 -1
- 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/subaccount-policies/subaccount-policies.d.ts.map +1 -1
- package/dist/services/policies/subaccount-policies/subaccount-policies.js +13 -12
- package/dist/services/policies/subaccount-policies/subaccount-policies.js.map +1 -1
- 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/subaccount-resolver.js +5 -3
- package/dist/services/subaccount-resolver.js.map +1 -1
- package/dist/services/subaccounts/subaccounts.d.ts +1 -1
- package/dist/services/subaccounts/subaccounts.d.ts.map +1 -1
- package/dist/services/subaccounts/subaccounts.js +34 -33
- package/dist/services/subaccounts/subaccounts.js.map +1 -1
- package/dist/services/subaccounts/subaccounts.schemas.d.ts +2 -2
- package/dist/services/subaccounts/subaccounts.schemas.js +1 -1
- package/dist/services/subaccounts/subaccounts.schemas.js.map +1 -1
- package/dist/services/trades/trades.d.ts.map +1 -1
- package/dist/services/trades/trades.js +5 -4
- package/dist/services/trades/trades.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/transfers/transfers.d.ts +1 -1
- package/dist/services/transfers/transfers.d.ts.map +1 -1
- package/dist/services/transfers/transfers.js +5 -4
- package/dist/services/transfers/transfers.js.map +1 -1
- package/dist/services/triggers/trigger-input.schemas.d.ts +1 -1
- package/dist/services/triggers/triggers-output.schemas.d.ts +1 -1
- package/dist/services/triggers/triggers.d.ts.map +1 -1
- package/dist/services/triggers/triggers.js +21 -20
- 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/zipper/zipper.js +3 -3
- package/dist/services/zipper/zipper.js.map +1 -1
- package/dist/shared/connect-error-mapping.d.ts +1 -1
- package/dist/shared/connect-error-mapping.js +27 -1
- package/dist/shared/connect-error-mapping.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.js +19 -0
- package/dist/shared/validation.js.map +1 -0
- 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 +3 -3
|
@@ -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 \"valibot\";\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 =
|
|
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 \"valibot\";\nimport { parse } 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 = 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: 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) => 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":";;;;;;;;;;;;;AA6BA,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,iBAAiB,MAAM,+BAA+B,KAAK;EACjE,MAAM,KAAKD,QAAQ,MAAM;EACzB,MAAM,MAAM,MAAM,KAAKH,QAAQ,mBAC3B,gBACA,qBAAqB,OAAO,CAChC;EACA,OAAO;GACH,SAAS,MAAM,EAAE,MAAM,KAAKI,qBAAqB,GAAG,IAAI,OAAO;GAC/D,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,MAAM,MAAM,QAAQ,CAAC,CAAC;EAC9C;EAEA,eAAe,gBAA2C;GAKtD,QAAO,MAJc,mBAAmB;IACpC;IACA;GACJ,CAAC,EAAA,CACa;EAClB;EAEA,MAAM,SAAS,mBAAmB;GAC9B,UAAU,KAAKD;GACf;GACA,QAAQG;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"}
|
|
@@ -30,7 +30,7 @@ declare function createMarketOverviewSchema(scales: SdkScales): v.SchemaWithPipe
|
|
|
30
30
|
readonly bestAskTicks: v.BigintSchema<undefined>;
|
|
31
31
|
readonly bestAskQtyScaled: v.BigintSchema<undefined>;
|
|
32
32
|
readonly sparklines: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
|
|
33
|
-
readonly interval: v.SchemaWithPipe<readonly [v.EnumSchema<typeof SparklineInterval, undefined>, v.TransformAction<SparklineInterval, "unspecified" | "
|
|
33
|
+
readonly interval: v.SchemaWithPipe<readonly [v.EnumSchema<typeof SparklineInterval, undefined>, v.TransformAction<SparklineInterval, "unspecified" | "1h" | "24h" | "1w" | "1m">]>;
|
|
34
34
|
readonly closeTicks: v.ArraySchema<v.BigintSchema<undefined>, undefined>;
|
|
35
35
|
}, undefined>, undefined>, readonly []>;
|
|
36
36
|
readonly indexPriceTicks: v.BigintSchema<undefined>;
|
|
@@ -50,7 +50,7 @@ declare function createMarketOverviewSchema(scales: SdkScales): v.SchemaWithPipe
|
|
|
50
50
|
bestAskTicks: bigint;
|
|
51
51
|
bestAskQtyScaled: bigint;
|
|
52
52
|
sparklines: {
|
|
53
|
-
interval: "unspecified" | "
|
|
53
|
+
interval: "unspecified" | "1h" | "24h" | "1w" | "1m";
|
|
54
54
|
closeTicks: bigint[];
|
|
55
55
|
}[];
|
|
56
56
|
indexPriceTicks: bigint;
|
|
@@ -80,7 +80,7 @@ declare const ListMarketOverviewInputSchema: v.ObjectSchema<{
|
|
|
80
80
|
readonly orderBy: v.SchemaWithPipe<readonly [v.OptionalSchema<v.PicklistSchema<readonly ["change_24h_bps", "volume_24h_quote", "last_price", "date_added"], undefined>, "volume_24h_quote">, v.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
81
|
readonly sort: v.SchemaWithPipe<readonly [v.OptionalSchema<v.PicklistSchema<readonly ["asc", "desc"], undefined>, "desc">, v.TransformAction<"asc" | "desc", SortDirection.SORT_ASC | SortDirection.SORT_DESC>]>;
|
|
82
82
|
readonly includeSparklines: v.OptionalSchema<v.BooleanSchema<undefined>, true>;
|
|
83
|
-
readonly sparklineIntervals: v.SchemaWithPipe<readonly [v.OptionalSchema<v.ArraySchema<v.PicklistSchema<readonly ["1h", "24h", "1w", "1m"], undefined>, undefined>, readonly ["24h"]>, v.TransformAction<("
|
|
83
|
+
readonly sparklineIntervals: v.SchemaWithPipe<readonly [v.OptionalSchema<v.ArraySchema<v.PicklistSchema<readonly ["1h", "24h", "1w", "1m"], undefined>, undefined>, readonly ["24h"]>, v.TransformAction<("1h" | "24h" | "1w" | "1m")[], (SparklineInterval.SPARKLINE_1H | SparklineInterval.SPARKLINE_24H | SparklineInterval.SPARKLINE_1W | SparklineInterval.SPARKLINE_1M)[]>]>;
|
|
84
84
|
}, undefined>;
|
|
85
85
|
type ListMarketOverviewInput = v.InferInput<typeof ListMarketOverviewInputSchema>;
|
|
86
86
|
//#endregion
|
package/dist/services/mfa/mfa.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { MFAService } from "../../gen/auth/v1/mfa_pb.js";
|
|
2
|
+
import { parse } from "../../shared/validation.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":";;;;;;;;;;AA+DA,IAAa,aAAb,MAAwB;CACpB;CAEA,YAAY,WAAsB;EAC9B,KAAKA,UAAU,aAAaC,YAAkB,SAAS;CAC3D;;;;CAKA,MAAM,YAAY,SAAkE;EAChF,MAAM,MAAM,MAAM,KAAKD,QAAQ,eAAe,CAAC,GAAG,qBAAqB,OAAO,CAAC;EAC/E,OAAO,EAAE,MAAM,8BAA8B,GAAG;CACpD;;;;CAKA,MAAM,oBACF,OACA,SACkC;EAClC,MAAM,MAAM,EAAE,MAAM,gCAAgC,KAAK;EACzD,MAAM,MAAM,MAAM,KAAKA,QAAQ,oBAAoB,KAAK,qBAAqB,OAAO,CAAC;EACrF,OAAO,EAAE,MAAM,iCAAiC,GAAG;CACvD;;;;CAKA,MAAM,qBACF,OACA,SACmC;EACnC,MAAM,MAAM,EAAE,MAAM,iCAAiC,KAAK;EAC1D,MAAM,MAAM,MAAM,KAAKA,QAAQ,qBAAqB,KAAK,qBAAqB,OAAO,CAAC;EACtF,OAAO,EAAE,MAAM,kCAAkC,GAAG;CACxD;;;;CAKA,MAAM,uBACF,OACA,SACqC;EACrC,MAAM,MAAM,EAAE,MAAM,mCAAmC,KAAK;EAC5D,MAAM,MAAM,MAAM,KAAKA,QAAQ,uBAAuB,KAAK,qBAAqB,OAAO,CAAC;EACxF,OAAO,EAAE,MAAM,oCAAoC,GAAG;CAC1D;;;;CAKA,MAAM,wBACF,OACA,SACsC;EACtC,MAAM,MAAM,EAAE,MAAM,oCAAoC,KAAK;EAC7D,MAAM,MAAM,MAAM,KAAKA,QAAQ,wBAAwB,KAAK,qBAAqB,OAAO,CAAC;EACzF,OAAO,EAAE,MAAM,qCAAqC,GAAG;CAC3D;;;;CAKA,MAAM,eACF,OACA,SACgC;EAChC,MAAM,MAAM,EAAE,MAAM,8BAA8B,KAAK;EACvD,MAAM,MAAM,MAAM,KAAKA,QAAQ,kBAAkB,KAAK,qBAAqB,OAAO,CAAC;EACnF,OAAO,EAAE,MAAM,+BAA+B,GAAG;CACrD;;;;CAKA,MAAM,oBACF,OACA,SACmC;EACnC,MAAM,MAAM,EAAE,MAAM,gCAAgC,KAAK;EACzD,MAAM,MAAM,MAAM,KAAKA,QAAQ,oBAAoB,KAAK,qBAAqB,OAAO,CAAC;EACrF,OAAO,EAAE,MAAM,kCAAkC,GAAG;CACxD;;;;CAKA,MAAM,uBACF,OACA,SACmC;EACnC,MAAM,MAAM,EAAE,MAAM,mCAAmC,KAAK;EAC5D,MAAM,MAAM,MAAM,KAAKA,QAAQ,uBAAuB,KAAK,qBAAqB,OAAO,CAAC;EACxF,OAAO,EAAE,MAAM,kCAAkC,GAAG;CACxD;;;;CAKA,MAAM,4BACF,OACA,SACmC;EACnC,MAAM,MAAM,EAAE,MAAM,wCAAwC,KAAK;EACjE,MAAM,MAAM,MAAM,KAAKA,QAAQ,4BAC3B,KACA,qBAAqB,OAAO,CAChC;EACA,OAAO,EAAE,MAAM,kCAAkC,GAAG;CACxD;;;;CAKA,MAAM,aACF,OACA,SACa;EACb,MAAM,EAAE,aAAa,EAAE,MAAM,4BAA4B,KAAK;EAC9D,MAAM,KAAKA,QAAQ,gBAAgB,EAAE,SAAS,GAAG,qBAAqB,OAAO,CAAC;CAClF;;;;CAKA,MAAM,aACF,OACA,SAC8B;EAC9B,MAAM,EAAE,UAAU,UAAU,EAAE,MAAM,4BAA4B,KAAK;EACrE,MAAM,MAAM,MAAM,KAAKA,QAAQ,gBAC3B;GAAE;GAAU;EAAM,GAClB,qBAAqB,OAAO,CAChC;EACA,OAAO,EAAE,MAAM,6BAA6B,GAAG;CACnD;;;;CAKA,MAAM,wBACF,QAAsC,CAAC,GACvC,SACsC;EACtC,EAAE,MAAM,oCAAoC,KAAK;EACjD,MAAM,MAAM,MAAM,KAAKA,QAAQ,wBAAwB,CAAC,GAAG,qBAAqB,OAAO,CAAC;EACxF,OAAO,EAAE,MAAM,qCAAqC,GAAG;CAC3D;;;;CAKA,MAAM,iBACF,OACA,SAC+B;EAC/B,MAAM,MAAM,EAAE,MAAM,6BAA6B,KAAK;EACtD,MAAM,MAAM,MAAM,KAAKA,QAAQ,iBAAiB,KAAK,qBAAqB,OAAO,CAAC;EAClF,OAAO,EAAE,MAAM,8BAA8B,GAAG;CACpD;;;;CAKA,MAAM,mBACF,OACA,SACa;EACb,MAAM,MAAM,EAAE,MAAM,+BAA+B,KAAK;EACxD,MAAM,KAAKA,QAAQ,mBAAmB,gBAAgB,GAAG,GAAG,qBAAqB,OAAO,CAAC;CAC7F;;;;CAKA,MAAM,mBACF,OACA,SACa;EACb,MAAM,MAAM,EAAE,MAAM,+BAA+B,KAAK;EACxD,MAAM,KAAKA,QAAQ,mBAAmB,gBAAgB,GAAG,GAAG,qBAAqB,OAAO,CAAC;CAC7F;AACJ"}
|
|
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 { parse } 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 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 = parse(BeginTotpEnrollmentInputSchema, input);\n const res = await this.#client.beginTOTPEnrollment(req, toConnectCallOptions(options));\n return 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 = parse(FinishTotpEnrollmentInputSchema, input);\n const res = await this.#client.finishTOTPEnrollment(req, toConnectCallOptions(options));\n return 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 = parse(BeginPasskeyEnrollmentInputSchema, input);\n const res = await this.#client.beginPasskeyEnrollment(req, toConnectCallOptions(options));\n return 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 = parse(FinishPasskeyEnrollmentInputSchema, input);\n const res = await this.#client.finishPasskeyEnrollment(req, toConnectCallOptions(options));\n return 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 = parse(BeginMfaChallengeInputSchema, input);\n const res = await this.#client.beginMFAChallenge(req, toConnectCallOptions(options));\n return 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 = parse(VerifyTotpChallengeInputSchema, input);\n const res = await this.#client.verifyTOTPChallenge(req, toConnectCallOptions(options));\n return 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 = parse(FinishPasskeyChallengeInputSchema, input);\n const res = await this.#client.finishPasskeyChallenge(req, toConnectCallOptions(options));\n return 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 = parse(VerifyRecoveryCodeChallengeInputSchema, input);\n const res = await this.#client.verifyRecoveryCodeChallenge(\n req,\n toConnectCallOptions(options),\n );\n return 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 } = 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 } = parse(UpdateMfaFactorInputSchema, input);\n const res = await this.#client.updateMFAFactor(\n { factorId, label },\n toConnectCallOptions(options),\n );\n return 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 parse(RegenerateRecoveryCodesInputSchema, input);\n const res = await this.#client.regenerateRecoveryCodes({}, toConnectCallOptions(options));\n return 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 = parse(ClaimFreshStepUpInputSchema, input);\n const res = await this.#client.claimFreshStepUp(req, toConnectCallOptions(options));\n return 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 = 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 = parse(ReleaseFreshStepUpInputSchema, input);\n await this.#client.releaseFreshStepUp(removeUndefined(req), toConnectCallOptions(options));\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orderbook.d.ts","names":[],"sources":["../../../src/services/orderbook/orderbook.ts"],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"file":"orderbook.d.ts","names":[],"sources":["../../../src/services/orderbook/orderbook.ts"],"mappings":";;;;;;;;UA+BU,gCAAgC,mBAAmB;EACzD;EACA;EACA;EACA;;UAGa,gCAAgC,mBAAmB;UAEnD;EACb;EACA,YAAY;;UAGC,yCAET,yBACA,KAAK;;;;cAOA;;EAKG,YAAA,WAAW,WAAW,UAAU,mBAAmB,QAAQ;;;;EASjE,IACF,OAAO,EAAE,kBAAkB,0BAC3B,UAAU,0BACX,QAAQ;;;;EAmBX,UAAU,OAAO;;;;EAOjB,mBAAmB,OAAO,mCAAmC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { parse } 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, decimalInputToScaled } from "../../shared/decimal-surface.js";
|
|
@@ -26,13 +27,13 @@ var OrderbookService = class {
|
|
|
26
27
|
* Fetches a spot order book depth snapshot for a symbol and requested depth, returning best bids and asks with the backend book sequence.
|
|
27
28
|
*/
|
|
28
29
|
async get(input, options) {
|
|
29
|
-
const validated =
|
|
30
|
+
const validated = parse(GetOrderbookInputSchema, input);
|
|
30
31
|
await this.#scales.ready();
|
|
31
32
|
const res = await this.#client.getOrderBook({
|
|
32
33
|
symbol: validated.symbol,
|
|
33
34
|
depth: validated.protoDepth
|
|
34
35
|
}, toConnectCallOptions(options));
|
|
35
|
-
return
|
|
36
|
+
return parse(createOrderbookDataSchema(this.#scales, validated.symbol), {
|
|
36
37
|
symbol: validated.symbol,
|
|
37
38
|
depth: validated.depth,
|
|
38
39
|
bookSeq: res.bookSeq,
|
|
@@ -50,7 +51,7 @@ var OrderbookService = class {
|
|
|
50
51
|
* Creates a stateful order book subscription that first fetches a snapshot, buffers proto deltas from public:spot:orderbook:deltas:depth:{depth}:{symbolId}:proto, applies sequence-checked updates, and refetches on gaps or reconnects. The returned handle can unsubscribe or change local price bucket aggregation without reconnecting.
|
|
51
52
|
*/
|
|
52
53
|
createSubscription(input) {
|
|
53
|
-
const symbolId =
|
|
54
|
+
const symbolId = parse(v.pipe(v.number(), v.integer(), v.gtValue(0)), input.symbolId);
|
|
54
55
|
const wsDepth = Math.min(500, Math.max(1, Math.trunc(input.depth ?? 50)));
|
|
55
56
|
const channel = `public:spot:orderbook:deltas:depth:${wsDepth}:${symbolId}:proto`;
|
|
56
57
|
const client = this.#client;
|
|
@@ -115,7 +116,7 @@ var OrderbookService = class {
|
|
|
115
116
|
if (stream?.isReady()) emit();
|
|
116
117
|
}
|
|
117
118
|
async function inputServiceFetch() {
|
|
118
|
-
const validated =
|
|
119
|
+
const validated = parse(GetOrderbookInputSchema, {
|
|
119
120
|
symbol: input.symbol,
|
|
120
121
|
depth: wsDepth
|
|
121
122
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orderbook.js","names":["#client","Proto.OrderbookService","#realtime","#scales","Proto.GetOrderBookResponseSchema","Proto.OrderBookDeltaSchema"],"sources":["../../../src/services/orderbook/orderbook.ts"],"sourcesContent":["import { create } from \"@bufbuild/protobuf\";\nimport * as Proto from \"../../gen/orderbook/v1/orderbook_pb.js\";\nimport { createClient, type Client, type Transport } from \"@connectrpc/connect\";\nimport { publicationHandlerErrorContext } from \"../../shared/subscription-errors.js\";\nimport type { PolyesterRealtime } from \"../../realtime/types.js\";\nimport {\n snapshotThenStream,\n type SnapshotThenStreamSubscription,\n} 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 {\n createReadyGate,\n decimalInputToScaled,\n type SdkScales,\n} from \"../../shared/decimal-surface.js\";\nimport {\n formatOrderbookLevel,\n GetOrderbookInputSchema,\n createOrderbookDataSchema,\n type OrderbookLevel,\n type OrderbookData,\n} from \"./orderbook.schemas.js\";\nimport { toBig } from \"../../utils/u128.js\";\nimport { isResourceNotFoundError } from \"../../utils/errors.js\";\nimport * as v from \"valibot\";\n\ninterface SubscribeOrderbookInput extends BaseSubscribeInput<OrderbookData> {\n symbol: string;\n symbolId: number;\n depth?: number;\n bucket?: string | null;\n}\n\nexport interface OrderbookStreamHandlers extends BaseSubscribeInput<OrderbookData> {}\n\nexport interface OrderbookSubscription {\n unsubscribe: () => void;\n setBucket: (bucket: string | null | undefined) => void;\n}\n\nexport interface CreateOrderbookSubscriptionInput\n extends\n OrderbookStreamHandlers,\n Pick<SubscribeOrderbookInput, \"symbol\" | \"symbolId\" | \"depth\" | \"bucket\"> {}\n\ntype BookSide = Map<bigint, bigint>;\n\n/**\n * Reads spot order book snapshots and maintains realtime local order book state from public delta channels.\n */\nexport class OrderbookService {\n #client: Client<typeof Proto.OrderbookService>;\n #realtime: PolyesterRealtime;\n #scales: SdkScales;\n\n constructor(transport: Transport, realtime: PolyesterRealtime, scales: SdkScales) {\n this.#client = createClient(Proto.OrderbookService, transport);\n this.#realtime = realtime;\n this.#scales = scales;\n }\n\n /**\n * Fetches a spot order book depth snapshot for a symbol and requested depth, returning best bids and asks with the backend book sequence.\n */\n async get(\n input: v.InferInput<typeof GetOrderbookInputSchema>,\n options?: PolyesterRequestOptions,\n ): Promise<OrderbookData> {\n const validated = v.parse(GetOrderbookInputSchema, input);\n await this.#scales.ready();\n const res = await this.#client.getOrderBook(\n { symbol: validated.symbol, depth: validated.protoDepth },\n toConnectCallOptions(options),\n );\n return v.parse(createOrderbookDataSchema(this.#scales, validated.symbol), {\n symbol: validated.symbol,\n depth: validated.depth,\n bookSeq: res.bookSeq,\n bids: res.bids,\n asks: res.asks,\n });\n }\n\n /**\n * Subscribes to the managed order book stream for a symbol and forwards reconstructed snapshots to onEvent. This is a convenience wrapper around createSubscription().unsubscribe.\n */\n subscribe(input: SubscribeOrderbookInput): () => void {\n return this.createSubscription(input).unsubscribe;\n }\n\n /**\n * Creates a stateful order book subscription that first fetches a snapshot, buffers proto deltas from public:spot:orderbook:deltas:depth:{depth}:{symbolId}:proto, applies sequence-checked updates, and refetches on gaps or reconnects. The returned handle can unsubscribe or change local price bucket aggregation without reconnecting.\n */\n createSubscription(input: CreateOrderbookSubscriptionInput): OrderbookSubscription {\n const symbolId = v.parse(v.pipe(v.number(), v.integer(), v.gtValue(0)), input.symbolId);\n const wsDepth = Math.min(500, Math.max(1, Math.trunc(input.depth ?? 50)));\n const channel = `public:spot:orderbook:deltas:depth:${wsDepth}:${symbolId}:proto`;\n\n const client = this.#client;\n const scales = this.#scales;\n const gate = createReadyGate(\n () => scales.ready(),\n (error) => input.onError?.(publicationHandlerErrorContext(channel, error)),\n );\n\n let bidsMap: BookSide = new Map();\n let asksMap: BookSide = new Map();\n let currentBookSeq = 0n;\n let bucketTicks: bigint | null = null;\n let stream: SnapshotThenStreamSubscription | undefined;\n\n function levelsToMap(levels: Proto.PriceLevel[] | undefined): BookSide {\n const map: BookSide = new Map();\n for (const l of levels ?? []) {\n if (l.qtyScaled === 0n) continue;\n map.set(l.priceTicks, l.qtyScaled);\n }\n return map;\n }\n\n function applySideDelta(map: BookSide, levels: Proto.PriceLevel[] | undefined): void {\n for (const l of levels ?? []) {\n if (l.qtyScaled === 0n) map.delete(l.priceTicks);\n else map.set(l.priceTicks, l.qtyScaled);\n }\n }\n\n function sideToUI(map: BookSide, side: \"bids\" | \"asks\", limit: number): OrderbookLevel[] {\n const entries = Array.from(map.entries());\n entries.sort(([pa], [pb]) => {\n if (pa === pb) return 0;\n return side === \"bids\" ? (pa > pb ? -1 : 1) : pa < pb ? -1 : 1;\n });\n return entries\n .slice(0, limit)\n .map(([priceTicks, qtyScaled]) =>\n formatOrderbookLevel({ priceTicks, qtyScaled }, scales, symbolId),\n );\n }\n\n function sideToUIBucketed(\n map: BookSide,\n side: \"bids\" | \"asks\",\n limit: number,\n bucket: bigint | null,\n ): OrderbookLevel[] {\n if (!bucket || bucket <= 0n) return sideToUI(map, side, limit);\n\n const agg: BookSide = new Map();\n for (const [priceTicks, qtyScaled] of map.entries()) {\n if (qtyScaled <= 0n) continue;\n const bucketPrice = (priceTicks / bucket) * bucket;\n agg.set(bucketPrice, (agg.get(bucketPrice) ?? 0n) + qtyScaled);\n }\n return sideToUI(agg, side, limit);\n }\n\n function emit(): void {\n gate.run(() => {\n input.onEvent({\n symbol: input.symbol,\n depth: wsDepth,\n bookSeq: currentBookSeq.toString(),\n bids: sideToUIBucketed(bidsMap, \"bids\", wsDepth, bucketTicks),\n asks: sideToUIBucketed(asksMap, \"asks\", wsDepth, bucketTicks),\n });\n });\n }\n\n function setBucket(bucket: string | null | undefined): void {\n if (!bucket) {\n bucketTicks = null;\n } else {\n try {\n bucketTicks = decimalInputToScaled(\"bucket\", bucket, scales.price());\n } catch {\n bucketTicks = null;\n }\n }\n if (stream?.isReady()) emit();\n }\n\n async function inputServiceFetch(): Promise<Proto.GetOrderBookResponse> {\n const validated = v.parse(GetOrderbookInputSchema, {\n symbol: input.symbol,\n depth: wsDepth,\n });\n try {\n return await client.getOrderBook({\n symbol: validated.symbol,\n depth: validated.protoDepth,\n });\n } catch (error: unknown) {\n if (!isResourceNotFoundError(error)) throw error;\n\n return create(Proto.GetOrderBookResponseSchema, {\n bookSeq: 0n,\n bids: [],\n asks: [],\n });\n }\n }\n\n function handleDelta(delta: Proto.OrderBookDelta): void {\n if (delta.reset) {\n bidsMap.clear();\n asksMap.clear();\n currentBookSeq = 0n;\n }\n\n if (currentBookSeq !== 0n && delta.bookSeqStart > currentBookSeq + 1n) {\n stream?.refreshSnapshot();\n return;\n }\n\n if (delta.bookSeqEnd <= currentBookSeq) return;\n\n applySideDelta(bidsMap, delta.bids);\n applySideDelta(asksMap, delta.asks);\n\n currentBookSeq = delta.bookSeqEnd > currentBookSeq ? delta.bookSeqEnd : currentBookSeq;\n emit();\n }\n\n setBucket(input.bucket);\n stream = snapshotThenStream({\n realtime: this.#realtime,\n channel,\n schema: Proto.OrderBookDeltaSchema,\n maxBufferedPublications: 200,\n snapshotErrorLog: \"Failed to fetch orderbook\",\n fetchSnapshot: inputServiceFetch,\n readPublication: (delta) => [delta],\n applySnapshot: (snapshot, bufferedDeltas) => {\n bidsMap = levelsToMap(snapshot.bids);\n asksMap = levelsToMap(snapshot.asks);\n currentBookSeq = toBig(snapshot.bookSeq);\n emit();\n for (const delta of bufferedDeltas) {\n if (stream?.isDisposed()) return;\n handleDelta(delta);\n }\n },\n applyLivePublications: (deltas) => {\n for (const delta of deltas) {\n if (stream?.isDisposed()) return;\n handleDelta(delta);\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 { unsubscribe: dispose, setBucket };\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"orderbook.js","names":["#client","Proto.OrderbookService","#realtime","#scales","Proto.GetOrderBookResponseSchema","Proto.OrderBookDeltaSchema"],"sources":["../../../src/services/orderbook/orderbook.ts"],"sourcesContent":["import { create } from \"@bufbuild/protobuf\";\nimport * as Proto from \"../../gen/orderbook/v1/orderbook_pb.js\";\nimport { createClient, type Client, type Transport } from \"@connectrpc/connect\";\nimport { publicationHandlerErrorContext } from \"../../shared/subscription-errors.js\";\nimport type { PolyesterRealtime } from \"../../realtime/types.js\";\nimport {\n snapshotThenStream,\n type SnapshotThenStreamSubscription,\n} 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 {\n createReadyGate,\n decimalInputToScaled,\n type SdkScales,\n} from \"../../shared/decimal-surface.js\";\nimport {\n formatOrderbookLevel,\n GetOrderbookInputSchema,\n createOrderbookDataSchema,\n type OrderbookLevel,\n type OrderbookData,\n} from \"./orderbook.schemas.js\";\nimport { toBig } from \"../../utils/u128.js\";\nimport { isResourceNotFoundError } from \"../../utils/errors.js\";\nimport * as v from \"valibot\";\nimport { parse } from \"../../shared/validation.js\";\n\ninterface SubscribeOrderbookInput extends BaseSubscribeInput<OrderbookData> {\n symbol: string;\n symbolId: number;\n depth?: number;\n bucket?: string | null;\n}\n\nexport interface OrderbookStreamHandlers extends BaseSubscribeInput<OrderbookData> {}\n\nexport interface OrderbookSubscription {\n unsubscribe: () => void;\n setBucket: (bucket: string | null | undefined) => void;\n}\n\nexport interface CreateOrderbookSubscriptionInput\n extends\n OrderbookStreamHandlers,\n Pick<SubscribeOrderbookInput, \"symbol\" | \"symbolId\" | \"depth\" | \"bucket\"> {}\n\ntype BookSide = Map<bigint, bigint>;\n\n/**\n * Reads spot order book snapshots and maintains realtime local order book state from public delta channels.\n */\nexport class OrderbookService {\n #client: Client<typeof Proto.OrderbookService>;\n #realtime: PolyesterRealtime;\n #scales: SdkScales;\n\n constructor(transport: Transport, realtime: PolyesterRealtime, scales: SdkScales) {\n this.#client = createClient(Proto.OrderbookService, transport);\n this.#realtime = realtime;\n this.#scales = scales;\n }\n\n /**\n * Fetches a spot order book depth snapshot for a symbol and requested depth, returning best bids and asks with the backend book sequence.\n */\n async get(\n input: v.InferInput<typeof GetOrderbookInputSchema>,\n options?: PolyesterRequestOptions,\n ): Promise<OrderbookData> {\n const validated = parse(GetOrderbookInputSchema, input);\n await this.#scales.ready();\n const res = await this.#client.getOrderBook(\n { symbol: validated.symbol, depth: validated.protoDepth },\n toConnectCallOptions(options),\n );\n return parse(createOrderbookDataSchema(this.#scales, validated.symbol), {\n symbol: validated.symbol,\n depth: validated.depth,\n bookSeq: res.bookSeq,\n bids: res.bids,\n asks: res.asks,\n });\n }\n\n /**\n * Subscribes to the managed order book stream for a symbol and forwards reconstructed snapshots to onEvent. This is a convenience wrapper around createSubscription().unsubscribe.\n */\n subscribe(input: SubscribeOrderbookInput): () => void {\n return this.createSubscription(input).unsubscribe;\n }\n\n /**\n * Creates a stateful order book subscription that first fetches a snapshot, buffers proto deltas from public:spot:orderbook:deltas:depth:{depth}:{symbolId}:proto, applies sequence-checked updates, and refetches on gaps or reconnects. The returned handle can unsubscribe or change local price bucket aggregation without reconnecting.\n */\n createSubscription(input: CreateOrderbookSubscriptionInput): OrderbookSubscription {\n const symbolId = parse(v.pipe(v.number(), v.integer(), v.gtValue(0)), input.symbolId);\n const wsDepth = Math.min(500, Math.max(1, Math.trunc(input.depth ?? 50)));\n const channel = `public:spot:orderbook:deltas:depth:${wsDepth}:${symbolId}:proto`;\n\n const client = this.#client;\n const scales = this.#scales;\n const gate = createReadyGate(\n () => scales.ready(),\n (error) => input.onError?.(publicationHandlerErrorContext(channel, error)),\n );\n\n let bidsMap: BookSide = new Map();\n let asksMap: BookSide = new Map();\n let currentBookSeq = 0n;\n let bucketTicks: bigint | null = null;\n let stream: SnapshotThenStreamSubscription | undefined;\n\n function levelsToMap(levels: Proto.PriceLevel[] | undefined): BookSide {\n const map: BookSide = new Map();\n for (const l of levels ?? []) {\n if (l.qtyScaled === 0n) continue;\n map.set(l.priceTicks, l.qtyScaled);\n }\n return map;\n }\n\n function applySideDelta(map: BookSide, levels: Proto.PriceLevel[] | undefined): void {\n for (const l of levels ?? []) {\n if (l.qtyScaled === 0n) map.delete(l.priceTicks);\n else map.set(l.priceTicks, l.qtyScaled);\n }\n }\n\n function sideToUI(map: BookSide, side: \"bids\" | \"asks\", limit: number): OrderbookLevel[] {\n const entries = Array.from(map.entries());\n entries.sort(([pa], [pb]) => {\n if (pa === pb) return 0;\n return side === \"bids\" ? (pa > pb ? -1 : 1) : pa < pb ? -1 : 1;\n });\n return entries\n .slice(0, limit)\n .map(([priceTicks, qtyScaled]) =>\n formatOrderbookLevel({ priceTicks, qtyScaled }, scales, symbolId),\n );\n }\n\n function sideToUIBucketed(\n map: BookSide,\n side: \"bids\" | \"asks\",\n limit: number,\n bucket: bigint | null,\n ): OrderbookLevel[] {\n if (!bucket || bucket <= 0n) return sideToUI(map, side, limit);\n\n const agg: BookSide = new Map();\n for (const [priceTicks, qtyScaled] of map.entries()) {\n if (qtyScaled <= 0n) continue;\n const bucketPrice = (priceTicks / bucket) * bucket;\n agg.set(bucketPrice, (agg.get(bucketPrice) ?? 0n) + qtyScaled);\n }\n return sideToUI(agg, side, limit);\n }\n\n function emit(): void {\n gate.run(() => {\n input.onEvent({\n symbol: input.symbol,\n depth: wsDepth,\n bookSeq: currentBookSeq.toString(),\n bids: sideToUIBucketed(bidsMap, \"bids\", wsDepth, bucketTicks),\n asks: sideToUIBucketed(asksMap, \"asks\", wsDepth, bucketTicks),\n });\n });\n }\n\n function setBucket(bucket: string | null | undefined): void {\n if (!bucket) {\n bucketTicks = null;\n } else {\n try {\n bucketTicks = decimalInputToScaled(\"bucket\", bucket, scales.price());\n } catch {\n bucketTicks = null;\n }\n }\n if (stream?.isReady()) emit();\n }\n\n async function inputServiceFetch(): Promise<Proto.GetOrderBookResponse> {\n const validated = parse(GetOrderbookInputSchema, {\n symbol: input.symbol,\n depth: wsDepth,\n });\n try {\n return await client.getOrderBook({\n symbol: validated.symbol,\n depth: validated.protoDepth,\n });\n } catch (error: unknown) {\n if (!isResourceNotFoundError(error)) throw error;\n\n return create(Proto.GetOrderBookResponseSchema, {\n bookSeq: 0n,\n bids: [],\n asks: [],\n });\n }\n }\n\n function handleDelta(delta: Proto.OrderBookDelta): void {\n if (delta.reset) {\n bidsMap.clear();\n asksMap.clear();\n currentBookSeq = 0n;\n }\n\n if (currentBookSeq !== 0n && delta.bookSeqStart > currentBookSeq + 1n) {\n stream?.refreshSnapshot();\n return;\n }\n\n if (delta.bookSeqEnd <= currentBookSeq) return;\n\n applySideDelta(bidsMap, delta.bids);\n applySideDelta(asksMap, delta.asks);\n\n currentBookSeq = delta.bookSeqEnd > currentBookSeq ? delta.bookSeqEnd : currentBookSeq;\n emit();\n }\n\n setBucket(input.bucket);\n stream = snapshotThenStream({\n realtime: this.#realtime,\n channel,\n schema: Proto.OrderBookDeltaSchema,\n maxBufferedPublications: 200,\n snapshotErrorLog: \"Failed to fetch orderbook\",\n fetchSnapshot: inputServiceFetch,\n readPublication: (delta) => [delta],\n applySnapshot: (snapshot, bufferedDeltas) => {\n bidsMap = levelsToMap(snapshot.bids);\n asksMap = levelsToMap(snapshot.asks);\n currentBookSeq = toBig(snapshot.bookSeq);\n emit();\n for (const delta of bufferedDeltas) {\n if (stream?.isDisposed()) return;\n handleDelta(delta);\n }\n },\n applyLivePublications: (deltas) => {\n for (const delta of deltas) {\n if (stream?.isDisposed()) return;\n handleDelta(delta);\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 { unsubscribe: dispose, setBucket };\n }\n}\n"],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@ declare const GetOrderbookInputSchema: v.SchemaWithPipe<readonly [v.ObjectSchema
|
|
|
11
11
|
depth: number;
|
|
12
12
|
}, {
|
|
13
13
|
symbol: string;
|
|
14
|
-
depth: 5 | 10 | 20 | 1 | 200 | 500 | 50 |
|
|
14
|
+
depth: 5 | 10 | 20 | 1 | 200 | 500 | 50 | 1000 | 100;
|
|
15
15
|
protoDepth: Depth;
|
|
16
16
|
}>]>;
|
|
17
17
|
type GetOrderbookInput = v.InferInput<typeof GetOrderbookInputSchema>;
|
|
@@ -2982,18 +2982,18 @@ declare const GetBatchReplaceStatusResultSchema: v.SchemaWithPipe<readonly [v.Ob
|
|
|
2982
2982
|
readonly admissionStatus: v.SchemaWithPipe<readonly [v.EnumSchema<typeof BatchReplaceAdmissionStatus, undefined>, v.TransformAction<BatchReplaceAdmissionStatus, "unspecified" | "rejected" | "admitted" | "partially_admitted">]>;
|
|
2983
2983
|
readonly items: v.ArraySchema<v.SchemaWithPipe<readonly [v.ObjectSchema<{
|
|
2984
2984
|
readonly itemIndex: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
|
|
2985
|
-
readonly phase: v.SchemaWithPipe<readonly [v.EnumSchema<typeof BatchReplacePhase, undefined>, v.TransformAction<BatchReplacePhase, "unspecified" | "terminal" | "
|
|
2985
|
+
readonly phase: v.SchemaWithPipe<readonly [v.EnumSchema<typeof BatchReplacePhase, undefined>, v.TransformAction<BatchReplacePhase, "unspecified" | "terminal" | "working" | "rejected" | "admitted">]>;
|
|
2986
2986
|
readonly oldOrderId: v.SchemaWithPipe<readonly [v.OptionalSchema<v.BigintSchema<undefined>, undefined>, v.TransformAction<bigint | undefined, string | undefined>]>;
|
|
2987
2987
|
readonly replacementOrderId: v.SchemaWithPipe<readonly [v.OptionalSchema<v.BigintSchema<undefined>, undefined>, v.TransformAction<bigint | undefined, string | undefined>]>;
|
|
2988
|
-
readonly orderStatus: v.SchemaWithPipe<readonly [v.EnumSchema<typeof OrderStatus, undefined>, v.TransformAction<OrderStatus, "unspecified" | "pending" | "canceled" | "
|
|
2988
|
+
readonly orderStatus: v.SchemaWithPipe<readonly [v.EnumSchema<typeof OrderStatus, undefined>, v.TransformAction<OrderStatus, "unspecified" | "pending" | "canceled" | "pending_cancel" | "working" | "filled" | "rejected">]>;
|
|
2989
2989
|
readonly code: v.StringSchema<undefined>;
|
|
2990
2990
|
readonly updatedTsNs: v.BigintSchema<undefined>;
|
|
2991
2991
|
}, undefined>, v.TransformAction<{
|
|
2992
2992
|
itemIndex: number;
|
|
2993
|
-
phase: "unspecified" | "terminal" | "
|
|
2993
|
+
phase: "unspecified" | "terminal" | "working" | "rejected" | "admitted";
|
|
2994
2994
|
oldOrderId?: string | undefined;
|
|
2995
2995
|
replacementOrderId?: string | undefined;
|
|
2996
|
-
orderStatus: "unspecified" | "pending" | "canceled" | "
|
|
2996
|
+
orderStatus: "unspecified" | "pending" | "canceled" | "pending_cancel" | "working" | "filled" | "rejected";
|
|
2997
2997
|
code: string;
|
|
2998
2998
|
updatedTsNs: bigint;
|
|
2999
2999
|
}, {
|
|
@@ -3001,10 +3001,10 @@ declare const GetBatchReplaceStatusResultSchema: v.SchemaWithPipe<readonly [v.Ob
|
|
|
3001
3001
|
updatedTs: number;
|
|
3002
3002
|
updatedTsNs: string;
|
|
3003
3003
|
itemIndex: number;
|
|
3004
|
-
phase: "unspecified" | "terminal" | "
|
|
3004
|
+
phase: "unspecified" | "terminal" | "working" | "rejected" | "admitted";
|
|
3005
3005
|
oldOrderId?: string | undefined;
|
|
3006
3006
|
replacementOrderId?: string | undefined;
|
|
3007
|
-
orderStatus: "unspecified" | "pending" | "canceled" | "
|
|
3007
|
+
orderStatus: "unspecified" | "pending" | "canceled" | "pending_cancel" | "working" | "filled" | "rejected";
|
|
3008
3008
|
}>]>, undefined>;
|
|
3009
3009
|
readonly acceptedCount: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
|
|
3010
3010
|
readonly rejectedCount: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
|
|
@@ -3018,10 +3018,10 @@ declare const GetBatchReplaceStatusResultSchema: v.SchemaWithPipe<readonly [v.Ob
|
|
|
3018
3018
|
updatedTs: number;
|
|
3019
3019
|
updatedTsNs: string;
|
|
3020
3020
|
itemIndex: number;
|
|
3021
|
-
phase: "unspecified" | "terminal" | "
|
|
3021
|
+
phase: "unspecified" | "terminal" | "working" | "rejected" | "admitted";
|
|
3022
3022
|
oldOrderId?: string | undefined;
|
|
3023
3023
|
replacementOrderId?: string | undefined;
|
|
3024
|
-
orderStatus: "unspecified" | "pending" | "canceled" | "
|
|
3024
|
+
orderStatus: "unspecified" | "pending" | "canceled" | "pending_cancel" | "working" | "filled" | "rejected";
|
|
3025
3025
|
}[];
|
|
3026
3026
|
acceptedCount: number;
|
|
3027
3027
|
rejectedCount: number;
|
|
@@ -3035,10 +3035,10 @@ declare const GetBatchReplaceStatusResultSchema: v.SchemaWithPipe<readonly [v.Ob
|
|
|
3035
3035
|
updatedTs: number;
|
|
3036
3036
|
updatedTsNs: string;
|
|
3037
3037
|
itemIndex: number;
|
|
3038
|
-
phase: "unspecified" | "terminal" | "
|
|
3038
|
+
phase: "unspecified" | "terminal" | "working" | "rejected" | "admitted";
|
|
3039
3039
|
oldOrderId?: string | undefined;
|
|
3040
3040
|
replacementOrderId?: string | undefined;
|
|
3041
|
-
orderStatus: "unspecified" | "pending" | "canceled" | "
|
|
3041
|
+
orderStatus: "unspecified" | "pending" | "canceled" | "pending_cancel" | "working" | "filled" | "rejected";
|
|
3042
3042
|
}[];
|
|
3043
3043
|
acceptedCount: number;
|
|
3044
3044
|
rejectedCount: number;
|
|
@@ -3052,10 +3052,10 @@ declare const GetBatchReplaceStatusResultSchema: v.SchemaWithPipe<readonly [v.Ob
|
|
|
3052
3052
|
updatedTs: number;
|
|
3053
3053
|
updatedTsNs: string;
|
|
3054
3054
|
itemIndex: number;
|
|
3055
|
-
phase: "unspecified" | "terminal" | "
|
|
3055
|
+
phase: "unspecified" | "terminal" | "working" | "rejected" | "admitted";
|
|
3056
3056
|
oldOrderId?: string | undefined;
|
|
3057
3057
|
replacementOrderId?: string | undefined;
|
|
3058
|
-
orderStatus: "unspecified" | "pending" | "canceled" | "
|
|
3058
|
+
orderStatus: "unspecified" | "pending" | "canceled" | "pending_cancel" | "working" | "filled" | "rejected";
|
|
3059
3059
|
}[];
|
|
3060
3060
|
acceptedCount: number;
|
|
3061
3061
|
rejectedCount: number;
|
|
@@ -3073,10 +3073,10 @@ declare const GetBatchReplaceStatusResultSchema: v.SchemaWithPipe<readonly [v.Ob
|
|
|
3073
3073
|
updatedTs: number;
|
|
3074
3074
|
updatedTsNs: string;
|
|
3075
3075
|
itemIndex: number;
|
|
3076
|
-
phase: "unspecified" | "terminal" | "
|
|
3076
|
+
phase: "unspecified" | "terminal" | "working" | "rejected" | "admitted";
|
|
3077
3077
|
oldOrderId?: string | undefined;
|
|
3078
3078
|
replacementOrderId?: string | undefined;
|
|
3079
|
-
orderStatus: "unspecified" | "pending" | "canceled" | "
|
|
3079
|
+
orderStatus: "unspecified" | "pending" | "canceled" | "pending_cancel" | "working" | "filled" | "rejected";
|
|
3080
3080
|
}[];
|
|
3081
3081
|
acceptedCount: number;
|
|
3082
3082
|
rejectedCount: number;
|
|
@@ -9,9 +9,9 @@ import { SideSchema } from "../shared.js";
|
|
|
9
9
|
import { BatchReplacePhase, OrderStatus } from "../../gen/orders/v1/orders_read_pb.js";
|
|
10
10
|
import { OrderSideCodec } from "./order-enums.codecs.js";
|
|
11
11
|
import { BatchReplaceAdmissionStatusCodec, BatchReplaceItemAdmissionStatusCodec, BatchReplacePhaseCodec, OrderStatusCodec } from "./orders.codecs.js";
|
|
12
|
+
import { OrderErrorDetailSchema } from "./order-errors.schemas.js";
|
|
12
13
|
import { createRequiredRiskPolicyInputSchema } from "./orders-risk.schemas.js";
|
|
13
14
|
import { ClientOrderIdInputSchema, OrderRequestIdInputSchema } from "./orders-identifiers.schemas.js";
|
|
14
|
-
import { OrderErrorDetailSchema } from "./order-errors.schemas.js";
|
|
15
15
|
import { createOrderIntentInputSchema } from "./orders-input.schemas.js";
|
|
16
16
|
import { create } from "@bufbuild/protobuf";
|
|
17
17
|
import * as v from "valibot";
|
|
@@ -40,7 +40,7 @@ type OpenOrdersInput = v.InferInput<typeof OpenOrdersInputSchema>;
|
|
|
40
40
|
declare const OrderHistoryInputSchema: v.SchemaWithPipe<readonly [v.StrictObjectSchema<{
|
|
41
41
|
readonly includeAttachedRisk: v.OptionalSchema<v.BooleanSchema<undefined>, true>;
|
|
42
42
|
readonly includeAttachedRiskState: v.OptionalSchema<v.BooleanSchema<undefined>, false>;
|
|
43
|
-
readonly status: v.SchemaWithPipe<readonly [v.OptionalSchema<v.PicklistSchema<readonly ["FILLED", "CANCELED", "REJECTED"], undefined>, undefined>, v.TransformAction<"
|
|
43
|
+
readonly status: v.SchemaWithPipe<readonly [v.OptionalSchema<v.PicklistSchema<readonly ["FILLED", "CANCELED", "REJECTED"], undefined>, undefined>, v.TransformAction<"FILLED" | "CANCELED" | "REJECTED" | undefined, OrderStatus.FILLED | OrderStatus.CANCELED | OrderStatus.REJECTED | undefined>]>;
|
|
44
44
|
readonly startTsNs: v.SchemaWithPipe<readonly [v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction]>, undefined>, v.TransformAction<string | undefined, bigint | undefined>]>;
|
|
45
45
|
readonly endTsNs: v.SchemaWithPipe<readonly [v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction]>, undefined>, v.TransformAction<string | undefined, bigint | undefined>]>;
|
|
46
46
|
readonly symbolId: v.OptionalSchema<v.ArraySchema<v.NumberSchema<undefined>, undefined>, undefined>;
|
|
@@ -3568,11 +3568,20 @@ declare const CancelOrderInputSchema: v.SchemaWithPipe<readonly [v.UnionSchema<[
|
|
|
3568
3568
|
symbolId?: number | undefined;
|
|
3569
3569
|
}>]>;
|
|
3570
3570
|
type CancelOrderInput = v.InferInput<typeof CancelOrderInputSchema>;
|
|
3571
|
-
declare const CancelOrderResultSchema: v.ObjectSchema<{
|
|
3571
|
+
declare const CancelOrderResultSchema: v.SchemaWithPipe<readonly [v.ObjectSchema<{
|
|
3572
3572
|
readonly status: v.StringSchema<undefined>;
|
|
3573
3573
|
readonly orderId: v.SchemaWithPipe<readonly [v.BigintSchema<undefined>, v.TransformAction<bigint, string>]>;
|
|
3574
|
-
readonly tsNs: v.
|
|
3575
|
-
}, undefined
|
|
3574
|
+
readonly tsNs: v.BigintSchema<undefined>;
|
|
3575
|
+
}, undefined>, v.TransformAction<{
|
|
3576
|
+
status: string;
|
|
3577
|
+
orderId: string;
|
|
3578
|
+
tsNs: bigint;
|
|
3579
|
+
}, {
|
|
3580
|
+
ts: number;
|
|
3581
|
+
tsNs: string;
|
|
3582
|
+
status: string;
|
|
3583
|
+
orderId: string;
|
|
3584
|
+
}>]>;
|
|
3576
3585
|
type CancelOrderResult = v.InferOutput<typeof CancelOrderResultSchema>;
|
|
3577
3586
|
declare const CancelAllOrdersInputSchema: v.SchemaWithPipe<readonly [v.StrictObjectSchema<{
|
|
3578
3587
|
readonly symbol: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction]>, undefined>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orders-input.schemas.d.ts","names":[],"sources":["../../../src/services/orders/orders-input.schemas.ts"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"orders-input.schemas.d.ts","names":[],"sources":["../../../src/services/orders/orders-input.schemas.ts"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAY/C,gBAAgB,EAAE,WAAW,kBAAkB;cAO9C,wBAAsB,EAAA,yBAAA,EAAA,aAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA+BvB,mBAAmB,EAAE,kBAAkB;cAEtC,yBAAuB,EAAA,yBAAA,EAAA;;;;;;;;;;;;;;KAaxB,oBAAoB,EAAE,mBAAmB;cAExC,4BAA0B,EAAA,yBAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;KAiB3B,uBAAuB,EAAE,kBAAkB;cAE1C,+BAA6B,EAAA,yBAAA,EAAA;;;;;;;;;;;;;;;;;;;KAiB9B,0BAA0B,EAAE,mBAAmB;cAE9C,4BAA0B,EAAA,yBAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA0B3B,uBAAuB,EAAE,kBAAkB;iBAEvC,8BAA8B,QAAQ,WAAW,iBAAc,EAAA,yBAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAyCnE,oBAAoB,EAAE,YAAY,kBAAkB;iBAEhD,+BAA+B,QAAQ,WAAW,iBAAc,EAAA,yBAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA+BpE,qBAAqB,EAAE,YAAY,kBAAkB"}
|
|
@@ -7,9 +7,9 @@ import { positiveDecimalInputToScaled, scaledToDecimalOutput } from "../../share
|
|
|
7
7
|
import { SideSchema } from "../shared.js";
|
|
8
8
|
import { FEE_ASSET_VALUES, FeeAssetCodec, OrderSideCodec, SELF_TRADE_PREVENTION_MODE_VALUES, SelfTradePreventionModeCodec } from "./order-enums.codecs.js";
|
|
9
9
|
import { ORDER_STATUS_FILTER_VALUES, OrderStatusFilterCodec } from "./orders.codecs.js";
|
|
10
|
+
import { OrderErrorDetailSchema } from "./order-errors.schemas.js";
|
|
10
11
|
import { MarketMaxSlippageSchema, createRiskPolicyInputSchema, parseMarketMaxSlippage } from "./orders-risk.schemas.js";
|
|
11
12
|
import { OptionalClientOrderIdInputSchema } from "./orders-identifiers.schemas.js";
|
|
12
|
-
import { OrderErrorDetailSchema } from "./order-errors.schemas.js";
|
|
13
13
|
import { create } from "@bufbuild/protobuf";
|
|
14
14
|
import * as v from "valibot";
|
|
15
15
|
//#region src/services/orders/orders-input.schemas.ts
|
|
@@ -180,11 +180,15 @@ const CancelOrderInputSchema = v.pipe(v.union([v.strictObject({
|
|
|
180
180
|
key
|
|
181
181
|
};
|
|
182
182
|
}));
|
|
183
|
-
const CancelOrderResultSchema = v.object({
|
|
183
|
+
const CancelOrderResultSchema = v.pipe(v.object({
|
|
184
184
|
status: v.string(),
|
|
185
185
|
orderId: PublicIdSchema,
|
|
186
|
-
tsNs: v.
|
|
187
|
-
})
|
|
186
|
+
tsNs: v.bigint()
|
|
187
|
+
}), v.transform(({ tsNs, ...result }) => ({
|
|
188
|
+
...result,
|
|
189
|
+
ts: tsNsToMs(tsNs),
|
|
190
|
+
tsNs: tsNs.toString()
|
|
191
|
+
})));
|
|
188
192
|
const CancelAllOrdersInputSchema = v.pipe(v.strictObject({
|
|
189
193
|
...AccountScopeInputEntries,
|
|
190
194
|
symbol: v.optional(v.pipe(v.string(), v.trim())),
|