@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.
Files changed (189) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +63 -17
  3. package/dist/account-signer/types.d.ts.map +1 -1
  4. package/dist/account-signer/types.js +6 -3
  5. package/dist/account-signer/types.js.map +1 -1
  6. package/dist/browser-client.d.ts +4 -2
  7. package/dist/browser-client.d.ts.map +1 -1
  8. package/dist/browser-client.js +3 -4
  9. package/dist/browser-client.js.map +1 -1
  10. package/dist/catalogs/client-catalog.d.ts.map +1 -1
  11. package/dist/catalogs/client-catalog.js +11 -4
  12. package/dist/catalogs/client-catalog.js.map +1 -1
  13. package/dist/catalogs/index.js +1 -1
  14. package/dist/catalogs/readers.d.ts.map +1 -1
  15. package/dist/catalogs/readers.js +3 -1
  16. package/dist/catalogs/readers.js.map +1 -1
  17. package/dist/catalogs/snapshot-validation.js +132 -0
  18. package/dist/catalogs/snapshot-validation.js.map +1 -0
  19. package/dist/catalogs/snapshot.d.ts.map +1 -1
  20. package/dist/catalogs/snapshot.js +16 -7
  21. package/dist/catalogs/snapshot.js.map +1 -1
  22. package/dist/catalogs/zipper-supply.d.ts.map +1 -1
  23. package/dist/catalogs/zipper-supply.js +10 -7
  24. package/dist/catalogs/zipper-supply.js.map +1 -1
  25. package/dist/core-client.d.ts +24 -17
  26. package/dist/core-client.d.ts.map +1 -1
  27. package/dist/core-client.js +21 -3
  28. package/dist/core-client.js.map +1 -1
  29. package/dist/environment.d.ts.map +1 -1
  30. package/dist/environment.js +32 -1
  31. package/dist/environment.js.map +1 -1
  32. package/dist/index.js +3 -3
  33. package/dist/realtime/client.js +13 -2
  34. package/dist/realtime/client.js.map +1 -1
  35. package/dist/realtime/snapshot-then-stream.js +1 -1
  36. package/dist/realtime/snapshot-then-stream.js.map +1 -1
  37. package/dist/realtime/types.d.ts +2 -0
  38. package/dist/realtime/types.d.ts.map +1 -1
  39. package/dist/server-client.d.ts +17 -8
  40. package/dist/server-client.d.ts.map +1 -1
  41. package/dist/server-client.js +8 -11
  42. package/dist/server-client.js.map +1 -1
  43. package/dist/services/accounts/accounts.js +3 -3
  44. package/dist/services/accounts/accounts.js.map +1 -1
  45. package/dist/services/address-book/address-book.js +28 -28
  46. package/dist/services/address-book/address-book.js.map +1 -1
  47. package/dist/services/address-book/address-book.schemas.d.ts.map +1 -1
  48. package/dist/services/address-book/address-book.schemas.js +2 -1
  49. package/dist/services/address-book/address-book.schemas.js.map +1 -1
  50. package/dist/services/api-keys/api-keys.d.ts.map +1 -1
  51. package/dist/services/api-keys/api-keys.js +12 -12
  52. package/dist/services/api-keys/api-keys.js.map +1 -1
  53. package/dist/services/auth/auth.d.ts +9 -3
  54. package/dist/services/auth/auth.d.ts.map +1 -1
  55. package/dist/services/auth/auth.js +11 -7
  56. package/dist/services/auth/auth.js.map +1 -1
  57. package/dist/services/auth/profile/profile.d.ts.map +1 -1
  58. package/dist/services/auth/profile/profile.js +7 -6
  59. package/dist/services/auth/profile/profile.js.map +1 -1
  60. package/dist/services/auth/session.d.ts +1 -1
  61. package/dist/services/auth/session.d.ts.map +1 -1
  62. package/dist/services/auth/session.js +6 -2
  63. package/dist/services/auth/session.js.map +1 -1
  64. package/dist/services/auth/session.types.d.ts +3 -2
  65. package/dist/services/auth/session.types.d.ts.map +1 -1
  66. package/dist/services/balances/balances.d.ts +1 -1
  67. package/dist/services/balances/balances.d.ts.map +1 -1
  68. package/dist/services/balances/balances.js +9 -8
  69. package/dist/services/balances/balances.js.map +1 -1
  70. package/dist/services/balances/balances.schemas.d.ts +1 -1
  71. package/dist/services/balances/balances.schemas.d.ts.map +1 -1
  72. package/dist/services/balances/balances.schemas.js +1 -1
  73. package/dist/services/balances/balances.schemas.js.map +1 -1
  74. package/dist/services/candles/candles.d.ts.map +1 -1
  75. package/dist/services/candles/candles.js +10 -9
  76. package/dist/services/candles/candles.js.map +1 -1
  77. package/dist/services/candles/candles.schemas.d.ts +11 -11
  78. package/dist/services/candles/candles.schemas.d.ts.map +1 -1
  79. package/dist/services/candles/candles.schemas.js +1 -2
  80. package/dist/services/candles/candles.schemas.js.map +1 -1
  81. package/dist/services/chain-analytics/chain-analytics.js +7 -7
  82. package/dist/services/chain-analytics/chain-analytics.js.map +1 -1
  83. package/dist/services/deposit/deposit.js +5 -5
  84. package/dist/services/deposit/deposit.js.map +1 -1
  85. package/dist/services/guard-signer/guard-signer.js +13 -13
  86. package/dist/services/guard-signer/guard-signer.js.map +1 -1
  87. package/dist/services/heatmap/heatmap.d.ts.map +1 -1
  88. package/dist/services/heatmap/heatmap.js +6 -5
  89. package/dist/services/heatmap/heatmap.js.map +1 -1
  90. package/dist/services/heatmap/heatmap.schemas.d.ts +17 -17
  91. package/dist/services/heatmap/heatmap.schemas.js +1 -1
  92. package/dist/services/heatmap/heatmap.schemas.js.map +1 -1
  93. package/dist/services/internal-transfers/internal-transfers.js +3 -3
  94. package/dist/services/internal-transfers/internal-transfers.js.map +1 -1
  95. package/dist/services/lifecycle/lifecycle.d.ts.map +1 -1
  96. package/dist/services/lifecycle/lifecycle.js +9 -8
  97. package/dist/services/lifecycle/lifecycle.js.map +1 -1
  98. package/dist/services/market-data/market-data.d.ts.map +1 -1
  99. package/dist/services/market-data/market-data.js +6 -5
  100. package/dist/services/market-data/market-data.js.map +1 -1
  101. package/dist/services/market-data/market-data.schemas.d.ts +2 -2
  102. package/dist/services/market-data/market-data.schemas.d.ts.map +1 -1
  103. package/dist/services/market-data/market-data.schemas.js +2 -6
  104. package/dist/services/market-data/market-data.schemas.js.map +1 -1
  105. package/dist/services/market-overview/market-overview.d.ts.map +1 -1
  106. package/dist/services/market-overview/market-overview.js +4 -3
  107. package/dist/services/market-overview/market-overview.js.map +1 -1
  108. package/dist/services/market-overview/market-overview.schemas.d.ts +3 -3
  109. package/dist/services/mfa/mfa.js +27 -27
  110. package/dist/services/mfa/mfa.js.map +1 -1
  111. package/dist/services/orderbook/orderbook.d.ts.map +1 -1
  112. package/dist/services/orderbook/orderbook.js +5 -4
  113. package/dist/services/orderbook/orderbook.js.map +1 -1
  114. package/dist/services/orderbook/orderbook.schemas.d.ts +1 -1
  115. package/dist/services/orders/orders-batch.schemas.d.ts +14 -14
  116. package/dist/services/orders/orders-batch.schemas.js +1 -1
  117. package/dist/services/orders/orders-input.schemas.d.ts +13 -4
  118. package/dist/services/orders/orders-input.schemas.d.ts.map +1 -1
  119. package/dist/services/orders/orders-input.schemas.js +8 -4
  120. package/dist/services/orders/orders-input.schemas.js.map +1 -1
  121. package/dist/services/orders/orders-modify.schemas.d.ts +22 -3
  122. package/dist/services/orders/orders-modify.schemas.d.ts.map +1 -1
  123. package/dist/services/orders/orders-modify.schemas.js +7 -3
  124. package/dist/services/orders/orders-modify.schemas.js.map +1 -1
  125. package/dist/services/orders/orders-output.schemas.d.ts +12 -12
  126. package/dist/services/orders/orders.d.ts +2 -2
  127. package/dist/services/orders/orders.d.ts.map +1 -1
  128. package/dist/services/orders/orders.js +44 -31
  129. package/dist/services/orders/orders.js.map +1 -1
  130. package/dist/services/policies/api-key-policies/api-key-policies.d.ts.map +1 -1
  131. package/dist/services/policies/api-key-policies/api-key-policies.js +11 -11
  132. package/dist/services/policies/api-key-policies/api-key-policies.js.map +1 -1
  133. package/dist/services/policies/subaccount-policies/subaccount-policies.d.ts.map +1 -1
  134. package/dist/services/policies/subaccount-policies/subaccount-policies.js +13 -12
  135. package/dist/services/policies/subaccount-policies/subaccount-policies.js.map +1 -1
  136. package/dist/services/social-verification/social-verification.d.ts.map +1 -1
  137. package/dist/services/social-verification/social-verification.js +7 -7
  138. package/dist/services/social-verification/social-verification.js.map +1 -1
  139. package/dist/services/subaccount-resolver.js +5 -3
  140. package/dist/services/subaccount-resolver.js.map +1 -1
  141. package/dist/services/subaccounts/subaccounts.d.ts +1 -1
  142. package/dist/services/subaccounts/subaccounts.d.ts.map +1 -1
  143. package/dist/services/subaccounts/subaccounts.js +34 -33
  144. package/dist/services/subaccounts/subaccounts.js.map +1 -1
  145. package/dist/services/subaccounts/subaccounts.schemas.d.ts +2 -2
  146. package/dist/services/subaccounts/subaccounts.schemas.js +1 -1
  147. package/dist/services/subaccounts/subaccounts.schemas.js.map +1 -1
  148. package/dist/services/trades/trades.d.ts.map +1 -1
  149. package/dist/services/trades/trades.js +5 -4
  150. package/dist/services/trades/trades.js.map +1 -1
  151. package/dist/services/trading-withdraws/trading-withdraws.js +8 -8
  152. package/dist/services/trading-withdraws/trading-withdraws.js.map +1 -1
  153. package/dist/services/transfers/transfers.d.ts +1 -1
  154. package/dist/services/transfers/transfers.d.ts.map +1 -1
  155. package/dist/services/transfers/transfers.js +5 -4
  156. package/dist/services/transfers/transfers.js.map +1 -1
  157. package/dist/services/triggers/trigger-input.schemas.d.ts +1 -1
  158. package/dist/services/triggers/triggers-output.schemas.d.ts +1 -1
  159. package/dist/services/triggers/triggers.d.ts.map +1 -1
  160. package/dist/services/triggers/triggers.js +21 -20
  161. package/dist/services/triggers/triggers.js.map +1 -1
  162. package/dist/services/whiteboard/whiteboard.js +15 -15
  163. package/dist/services/whiteboard/whiteboard.js.map +1 -1
  164. package/dist/services/zipper/zipper.js +3 -3
  165. package/dist/services/zipper/zipper.js.map +1 -1
  166. package/dist/shared/connect-error-mapping.d.ts +1 -1
  167. package/dist/shared/connect-error-mapping.js +27 -1
  168. package/dist/shared/connect-error-mapping.js.map +1 -1
  169. package/dist/shared/transports.js +7 -12
  170. package/dist/shared/transports.js.map +1 -1
  171. package/dist/shared/types.d.ts +12 -0
  172. package/dist/shared/types.d.ts.map +1 -1
  173. package/dist/shared/validation.js +19 -0
  174. package/dist/shared/validation.js.map +1 -0
  175. package/dist/utils/cookies.d.ts +8 -3
  176. package/dist/utils/cookies.d.ts.map +1 -1
  177. package/dist/utils/cookies.js +7 -1
  178. package/dist/utils/cookies.js.map +1 -1
  179. package/dist/utils/event-emitter.d.ts +1 -1
  180. package/dist/utils/event-emitter.d.ts.map +1 -1
  181. package/dist/utils/event-emitter.js +4 -2
  182. package/dist/utils/event-emitter.js.map +1 -1
  183. package/dist/utils/evm.js +2 -2
  184. package/dist/utils/evm.js.map +1 -1
  185. package/dist/utils/jwt.d.ts +2 -2
  186. package/dist/utils/jwt.d.ts.map +1 -1
  187. package/dist/utils/jwt.js +2 -2
  188. package/dist/utils/jwt.js.map +1 -1
  189. package/package.json +3 -3
@@ -1,5 +1,6 @@
1
1
  import { AuthService as AuthService$1 } from "../../gen/auth/v1/auth_pb.js";
2
- import { OptionalPublicIdSchema, PublicIdSchema, TimestampSchema } from "../../shared/schemas.js";
2
+ import { OptionalPublicIdSchema, OptionalTimestampMsSchema, PublicIdSchema, TimestampSchema } from "../../shared/schemas.js";
3
+ import { parse } from "../../shared/validation.js";
3
4
  import { toConnectCallOptions } from "../../shared/request-options.js";
4
5
  import { ProfileService } from "./profile/profile.js";
5
6
  import { MfaSessionInfoSchema } from "../mfa/mfa.schemas.js";
@@ -29,7 +30,7 @@ const LoginWithWalletResponseSchema = v.object({
29
30
  });
30
31
  const NonceSchema = v.object({
31
32
  nonce: v.string(),
32
- expiresAt: v.optional(TimestampSchema)
33
+ expiresAt: OptionalTimestampMsSchema
33
34
  });
34
35
  /**
35
36
  * Handles wallet-based authentication, caller introspection, and authenticated profile operations.
@@ -48,21 +49,24 @@ var AuthService = class {
48
49
  */
49
50
  async me(options) {
50
51
  const res = await this.#authClient.me({}, toConnectCallOptions(options));
51
- return v.parse(MeSchema, res);
52
+ return parse(MeSchema, res);
52
53
  }
53
54
  /**
54
- * Requests a short-lived nonce for the given smart-account EVM address; the nonce is single-purpose, replaced by subsequent requests, and expires after about five minutes.
55
+ * Requests a short-lived nonce for the given smart-account EVM address.
56
+ * The nonce is single-purpose, replaced by subsequent requests, and expires
57
+ * after about five minutes. The optional expiry is milliseconds since the
58
+ * Unix epoch.
55
59
  */
56
60
  async requestLoginNonce(smartAccountAddress, options) {
57
- return v.parse(NonceSchema, await this.#publicClient.getNonce({ smartAccountAddress }, toConnectCallOptions(options)));
61
+ return parse(NonceSchema, await this.#publicClient.getNonce({ smartAccountAddress }, toConnectCallOptions(options)));
58
62
  }
59
63
  /**
60
64
  * Exchanges a signed login nonce for an authenticated session token and account identity returned by the auth API.
61
65
  */
62
66
  async loginWithWallet(input, options) {
63
- const validatedInput = v.parse(LoginWithWalletInputSchema, input);
67
+ const validatedInput = parse(LoginWithWalletInputSchema, input);
64
68
  const res = await this.#publicClient.loginWithWallet(validatedInput, toConnectCallOptions(options));
65
- return v.parse(LoginWithWalletResponseSchema, res);
69
+ return parse(LoginWithWalletResponseSchema, res);
66
70
  }
67
71
  };
68
72
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","names":["#publicClient","Proto.AuthService","#authClient"],"sources":["../../../src/services/auth/auth.ts"],"sourcesContent":["import { createClient, type Client, type Transport } from \"@connectrpc/connect\";\nimport * as Proto from \"../../gen/auth/v1/auth_pb.js\";\nimport * as v from \"valibot\";\nimport { ProfileService } from \"./profile/profile.js\";\nimport { OptionalPublicIdSchema, PublicIdSchema, TimestampSchema } from \"../../shared/schemas.js\";\nimport {\n toConnectCallOptions,\n type PolyesterMutationOptions,\n type PolyesterRequestOptions,\n} from \"../../shared/request-options.js\";\nimport { MfaSessionInfoSchema } from \"../mfa/mfa.schemas.js\";\nimport type { PolyesterRealtime } from \"../../realtime/index.js\";\n\nexport const LoginWithWalletInputSchema = v.strictObject({\n smartAccountAddress: v.string(),\n nonce: v.string(),\n signature: v.string(),\n userAgent: v.optional(v.string(), \"\"),\n ip: v.optional(v.string(), \"\"),\n primaryWalletAddress: v.optional(v.string(), \"\"),\n walletProvider: v.optional(v.string(), \"\"),\n});\n\nexport type LoginWithWalletInput = v.InferInput<typeof LoginWithWalletInputSchema>;\n\nexport interface AuthServiceTransports {\n publicApi: Transport;\n authApi: Transport;\n}\n\nconst MeSchema = v.object({\n accountId: PublicIdSchema,\n apiKeyId: OptionalPublicIdSchema,\n username: v.string(),\n session: v.optional(MfaSessionInfoSchema),\n});\n\nexport type Me = v.InferOutput<typeof MeSchema>;\n\nconst LoginWithWalletResponseSchema = v.object({\n accessToken: v.string(),\n expiresAt: v.optional(TimestampSchema),\n accountId: PublicIdSchema,\n username: v.string(),\n});\n\nexport type LoginWithWalletResponse = v.InferOutput<typeof LoginWithWalletResponseSchema>;\n\nconst NonceSchema = v.object({\n nonce: v.string(),\n expiresAt: v.optional(TimestampSchema),\n});\n\nexport type Nonce = v.InferOutput<typeof NonceSchema>;\n\n/**\n * Handles wallet-based authentication, caller introspection, and authenticated profile operations.\n */\nexport class AuthService {\n #publicClient: Client<typeof Proto.AuthService>;\n #authClient: Client<typeof Proto.AuthService>;\n profile: ProfileService;\n\n constructor(transports: AuthServiceTransports, realtime: PolyesterRealtime) {\n this.#publicClient = createClient(Proto.AuthService, transports.publicApi);\n this.#authClient = createClient(Proto.AuthService, transports.authApi);\n this.profile = new ProfileService(transports.authApi, realtime);\n }\n\n /**\n * Returns the authenticated caller's account context, including account ID, optional API key ID, username, and session assurance details from the presented token or API key.\n */\n async me(options?: PolyesterRequestOptions): Promise<Me> {\n const res = await this.#authClient.me({}, toConnectCallOptions(options));\n return v.parse(MeSchema, res);\n }\n\n /**\n * Requests a short-lived nonce for the given smart-account EVM address; the nonce is single-purpose, replaced by subsequent requests, and expires after about five minutes.\n */\n async requestLoginNonce(\n smartAccountAddress: string,\n options?: PolyesterRequestOptions,\n ): Promise<Nonce> {\n return v.parse(\n NonceSchema,\n await this.#publicClient.getNonce(\n { smartAccountAddress },\n toConnectCallOptions(options),\n ),\n );\n }\n\n /**\n * Exchanges a signed login nonce for an authenticated session token and account identity returned by the auth API.\n */\n protected async loginWithWallet(\n input: LoginWithWalletInput,\n options?: PolyesterMutationOptions,\n ): Promise<LoginWithWalletResponse> {\n const validatedInput = v.parse(LoginWithWalletInputSchema, input);\n const res = await this.#publicClient.loginWithWallet(\n validatedInput,\n toConnectCallOptions(options),\n );\n return v.parse(LoginWithWalletResponseSchema, res);\n }\n}\n"],"mappings":";;;;;;;;AAaA,MAAa,6BAA6B,EAAE,aAAa;CACrD,qBAAqB,EAAE,OAAO;CAC9B,OAAO,EAAE,OAAO;CAChB,WAAW,EAAE,OAAO;CACpB,WAAW,EAAE,SAAS,EAAE,OAAO,GAAG,EAAE;CACpC,IAAI,EAAE,SAAS,EAAE,OAAO,GAAG,EAAE;CAC7B,sBAAsB,EAAE,SAAS,EAAE,OAAO,GAAG,EAAE;CAC/C,gBAAgB,EAAE,SAAS,EAAE,OAAO,GAAG,EAAE;AAC7C,CAAC;AASD,MAAM,WAAW,EAAE,OAAO;CACtB,WAAW;CACX,UAAU;CACV,UAAU,EAAE,OAAO;CACnB,SAAS,EAAE,SAAS,oBAAoB;AAC5C,CAAC;AAID,MAAM,gCAAgC,EAAE,OAAO;CAC3C,aAAa,EAAE,OAAO;CACtB,WAAW,EAAE,SAAS,eAAe;CACrC,WAAW;CACX,UAAU,EAAE,OAAO;AACvB,CAAC;AAID,MAAM,cAAc,EAAE,OAAO;CACzB,OAAO,EAAE,OAAO;CAChB,WAAW,EAAE,SAAS,eAAe;AACzC,CAAC;;;;AAOD,IAAa,cAAb,MAAyB;CACrB;CACA;CACA;CAEA,YAAY,YAAmC,UAA6B;EACxE,KAAKA,gBAAgB,aAAaC,eAAmB,WAAW,SAAS;EACzE,KAAKC,cAAc,aAAaD,eAAmB,WAAW,OAAO;EACrE,KAAK,UAAU,IAAI,eAAe,WAAW,SAAS,QAAQ;CAClE;;;;CAKA,MAAM,GAAG,SAAgD;EACrD,MAAM,MAAM,MAAM,KAAKC,YAAY,GAAG,CAAC,GAAG,qBAAqB,OAAO,CAAC;EACvE,OAAO,EAAE,MAAM,UAAU,GAAG;CAChC;;;;CAKA,MAAM,kBACF,qBACA,SACc;EACd,OAAO,EAAE,MACL,aACA,MAAM,KAAKF,cAAc,SACrB,EAAE,oBAAoB,GACtB,qBAAqB,OAAO,CAChC,CACJ;CACJ;;;;CAKA,MAAgB,gBACZ,OACA,SACgC;EAChC,MAAM,iBAAiB,EAAE,MAAM,4BAA4B,KAAK;EAChE,MAAM,MAAM,MAAM,KAAKA,cAAc,gBACjC,gBACA,qBAAqB,OAAO,CAChC;EACA,OAAO,EAAE,MAAM,+BAA+B,GAAG;CACrD;AACJ"}
1
+ {"version":3,"file":"auth.js","names":["#publicClient","Proto.AuthService","#authClient"],"sources":["../../../src/services/auth/auth.ts"],"sourcesContent":["import { createClient, type Client, type Transport } from \"@connectrpc/connect\";\nimport * as Proto from \"../../gen/auth/v1/auth_pb.js\";\nimport * as v from \"valibot\";\nimport { parse } from \"../../shared/validation.js\";\nimport { ProfileService } from \"./profile/profile.js\";\nimport {\n OptionalPublicIdSchema,\n OptionalTimestampMsSchema,\n PublicIdSchema,\n TimestampSchema,\n} from \"../../shared/schemas.js\";\nimport {\n toConnectCallOptions,\n type PolyesterMutationOptions,\n type PolyesterRequestOptions,\n} from \"../../shared/request-options.js\";\nimport { MfaSessionInfoSchema } from \"../mfa/mfa.schemas.js\";\nimport type { PolyesterRealtime } from \"../../realtime/index.js\";\n\nexport const LoginWithWalletInputSchema = v.strictObject({\n smartAccountAddress: v.string(),\n nonce: v.string(),\n signature: v.string(),\n userAgent: v.optional(v.string(), \"\"),\n ip: v.optional(v.string(), \"\"),\n primaryWalletAddress: v.optional(v.string(), \"\"),\n walletProvider: v.optional(v.string(), \"\"),\n});\n\nexport type LoginWithWalletInput = v.InferInput<typeof LoginWithWalletInputSchema>;\n\nexport interface AuthServiceTransports {\n publicApi: Transport;\n authApi: Transport;\n}\n\nconst MeSchema = v.object({\n accountId: PublicIdSchema,\n apiKeyId: OptionalPublicIdSchema,\n username: v.string(),\n session: v.optional(MfaSessionInfoSchema),\n});\n\nexport type Me = v.InferOutput<typeof MeSchema>;\n\nconst LoginWithWalletResponseSchema = v.object({\n accessToken: v.string(),\n expiresAt: v.optional(TimestampSchema),\n accountId: PublicIdSchema,\n username: v.string(),\n});\n\nexport type LoginWithWalletResponse = v.InferOutput<typeof LoginWithWalletResponseSchema>;\n\nconst NonceSchema = v.object({\n nonce: v.string(),\n expiresAt: OptionalTimestampMsSchema,\n});\n\nexport type Nonce = v.InferOutput<typeof NonceSchema>;\n\n/**\n * Handles wallet-based authentication, caller introspection, and authenticated profile operations.\n */\nexport class AuthService {\n #publicClient: Client<typeof Proto.AuthService>;\n #authClient: Client<typeof Proto.AuthService>;\n profile: ProfileService;\n\n constructor(transports: AuthServiceTransports, realtime: PolyesterRealtime) {\n this.#publicClient = createClient(Proto.AuthService, transports.publicApi);\n this.#authClient = createClient(Proto.AuthService, transports.authApi);\n this.profile = new ProfileService(transports.authApi, realtime);\n }\n\n /**\n * Returns the authenticated caller's account context, including account ID, optional API key ID, username, and session assurance details from the presented token or API key.\n */\n async me(options?: PolyesterRequestOptions): Promise<Me> {\n const res = await this.#authClient.me({}, toConnectCallOptions(options));\n return parse(MeSchema, res);\n }\n\n /**\n * Requests a short-lived nonce for the given smart-account EVM address.\n * The nonce is single-purpose, replaced by subsequent requests, and expires\n * after about five minutes. The optional expiry is milliseconds since the\n * Unix epoch.\n */\n async requestLoginNonce(\n smartAccountAddress: string,\n options?: PolyesterRequestOptions,\n ): Promise<Nonce> {\n return parse(\n NonceSchema,\n await this.#publicClient.getNonce(\n { smartAccountAddress },\n toConnectCallOptions(options),\n ),\n );\n }\n\n /**\n * Exchanges a signed login nonce for an authenticated session token and account identity returned by the auth API.\n */\n protected async loginWithWallet(\n input: LoginWithWalletInput,\n options?: PolyesterMutationOptions,\n ): Promise<LoginWithWalletResponse> {\n const validatedInput = parse(LoginWithWalletInputSchema, input);\n const res = await this.#publicClient.loginWithWallet(\n validatedInput,\n toConnectCallOptions(options),\n );\n return parse(LoginWithWalletResponseSchema, res);\n }\n}\n"],"mappings":";;;;;;;;;AAmBA,MAAa,6BAA6B,EAAE,aAAa;CACrD,qBAAqB,EAAE,OAAO;CAC9B,OAAO,EAAE,OAAO;CAChB,WAAW,EAAE,OAAO;CACpB,WAAW,EAAE,SAAS,EAAE,OAAO,GAAG,EAAE;CACpC,IAAI,EAAE,SAAS,EAAE,OAAO,GAAG,EAAE;CAC7B,sBAAsB,EAAE,SAAS,EAAE,OAAO,GAAG,EAAE;CAC/C,gBAAgB,EAAE,SAAS,EAAE,OAAO,GAAG,EAAE;AAC7C,CAAC;AASD,MAAM,WAAW,EAAE,OAAO;CACtB,WAAW;CACX,UAAU;CACV,UAAU,EAAE,OAAO;CACnB,SAAS,EAAE,SAAS,oBAAoB;AAC5C,CAAC;AAID,MAAM,gCAAgC,EAAE,OAAO;CAC3C,aAAa,EAAE,OAAO;CACtB,WAAW,EAAE,SAAS,eAAe;CACrC,WAAW;CACX,UAAU,EAAE,OAAO;AACvB,CAAC;AAID,MAAM,cAAc,EAAE,OAAO;CACzB,OAAO,EAAE,OAAO;CAChB,WAAW;AACf,CAAC;;;;AAOD,IAAa,cAAb,MAAyB;CACrB;CACA;CACA;CAEA,YAAY,YAAmC,UAA6B;EACxE,KAAKA,gBAAgB,aAAaC,eAAmB,WAAW,SAAS;EACzE,KAAKC,cAAc,aAAaD,eAAmB,WAAW,OAAO;EACrE,KAAK,UAAU,IAAI,eAAe,WAAW,SAAS,QAAQ;CAClE;;;;CAKA,MAAM,GAAG,SAAgD;EACrD,MAAM,MAAM,MAAM,KAAKC,YAAY,GAAG,CAAC,GAAG,qBAAqB,OAAO,CAAC;EACvE,OAAO,MAAM,UAAU,GAAG;CAC9B;;;;;;;CAQA,MAAM,kBACF,qBACA,SACc;EACd,OAAO,MACH,aACA,MAAM,KAAKF,cAAc,SACrB,EAAE,oBAAoB,GACtB,qBAAqB,OAAO,CAChC,CACJ;CACJ;;;;CAKA,MAAgB,gBACZ,OACA,SACgC;EAChC,MAAM,iBAAiB,MAAM,4BAA4B,KAAK;EAC9D,MAAM,MAAM,MAAM,KAAKA,cAAc,gBACjC,gBACA,qBAAqB,OAAO,CAChC;EACA,OAAO,MAAM,+BAA+B,GAAG;CACnD;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"profile.d.ts","names":[],"sources":["../../../../src/services/auth/profile/profile.ts"],"mappings":";;;;;;;;UAqBU,+BAA+B,mBAAmB;;;;cAK/C;;EAIG,YAAA,WAAW,WAAW,UAAU;;;;EAQtC,IAAI,UAAU,0BAA0B,QAAQ;;;;EAShD,OACF,OAAO,EAAE,kBAAkB,2BAC3B,UAAU,2BACX,QAAQ;;;;EAYL,mBAAmB,UAAU,0BAA0B,QAAQ;;;;EAQrE,kBAAkB,OAAO"}
1
+ {"version":3,"file":"profile.d.ts","names":[],"sources":["../../../../src/services/auth/profile/profile.ts"],"mappings":";;;;;;;;UAsBU,+BAA+B,mBAAmB;;;;cAK/C;;EAIG,YAAA,WAAW,WAAW,UAAU;;;;EAQtC,IAAI,UAAU,0BAA0B,QAAQ;;;;EAShD,OACF,OAAO,EAAE,kBAAkB,2BAC3B,UAAU,2BACX,QAAQ;;;;EAYL,mBAAmB,UAAU,0BAA0B,QAAQ;;;;EAQrE,kBAAkB,OAAO"}
@@ -1,3 +1,4 @@
1
+ import { parse } from "../../../shared/validation.js";
1
2
  import { toConnectCallOptions } from "../../../shared/request-options.js";
2
3
  import { removeUndefined } from "../../../utils/remove-undefined.js";
3
4
  import { AccountIdentitySchema, ProfileService as ProfileService$1 } from "../../../gen/auth/v1/profile_pb.js";
@@ -21,22 +22,22 @@ var ProfileService = class {
21
22
  async get(options) {
22
23
  const res = await this.#client.getProfile({}, toConnectCallOptions(options));
23
24
  if (!res) throw new Error("Profile not found");
24
- return v.parse(ProfileSchema, res);
25
+ return parse(ProfileSchema, res);
25
26
  }
26
27
  /**
27
28
  * Updates only the provided mutable profile fields; omitted fields are unchanged, while present empty strings clear optional text fields such as bio, website, Twitter, and avatar URL.
28
29
  */
29
30
  async update(input, options) {
30
- const validatedInput = v.parse(UpdateProfileInputSchema, input);
31
+ const validatedInput = parse(UpdateProfileInputSchema, input);
31
32
  const res = await this.#client.updateProfile(removeUndefined(validatedInput), toConnectCallOptions(options));
32
- return v.parse(ProfileSchema, res);
33
+ return parse(ProfileSchema, res);
33
34
  }
34
35
  /**
35
36
  * Returns the caller's recent username changes, newest first, capped at 20 entries.
36
37
  */
37
38
  async getUsernameHistory(options) {
38
39
  const res = await this.#client.getUsernameHistory({}, toConnectCallOptions(options));
39
- return v.parse(v.array(UsernameHistoryEntrySchema), res.history);
40
+ return parse(v.array(UsernameHistoryEntrySchema), res.history);
40
41
  }
41
42
  /**
42
43
  * Subscribes to public identity updates and emits normalized account identity records with base58 account IDs, username, avatar URL, and root smart-account address.
@@ -46,12 +47,12 @@ var ProfileService = class {
46
47
  channel: "public:identity:updates:proto",
47
48
  schema: AccountIdentitySchema,
48
49
  onPublication: (data) => {
49
- const identity = v.parse(AccountIdentitySchema$1, data);
50
+ const identity = parse(AccountIdentitySchema$1, data);
50
51
  input.onEvent(identity);
51
52
  },
52
53
  onConnected: () => input.onOpen?.(),
53
54
  onDisconnected: () => input.onClose?.(),
54
- onError: (ctx) => input.onError?.(ctx)
55
+ onError: input.onError
55
56
  });
56
57
  }
57
58
  };
@@ -1 +1 @@
1
- {"version":3,"file":"profile.js","names":["#client","Proto.ProfileService","#realtime","Proto.AccountIdentitySchema","AccountIdentitySchema"],"sources":["../../../../src/services/auth/profile/profile.ts"],"sourcesContent":["import { createClient, type Client, type Transport } from \"@connectrpc/connect\";\nimport * as Proto from \"../../../gen/auth/v1/profile_pb.js\";\nimport * as v from \"valibot\";\nimport { removeUndefined } from \"../../../utils/remove-undefined.js\";\nimport {\n toConnectCallOptions,\n type PolyesterMutationOptions,\n type PolyesterRequestOptions,\n} from \"../../../shared/request-options.js\";\nimport {\n AccountIdentitySchema,\n ProfileSchema,\n UpdateProfileInputSchema,\n UsernameHistoryEntrySchema,\n type AccountIdentity,\n type Profile,\n type UsernameHistoryEntry,\n} from \"./profile.schemas.js\";\nimport type { BaseSubscribeInput } from \"../../../shared/types.js\";\nimport type { PolyesterRealtime } from \"../../../realtime/index.js\";\n\ninterface SubscribeIdentityInput extends BaseSubscribeInput<AccountIdentity> {}\n\n/**\n * Manages the authenticated account's public profile and realtime identity updates.\n */\nexport class ProfileService {\n #client: Client<typeof Proto.ProfileService>;\n #realtime: PolyesterRealtime;\n\n constructor(transport: Transport, realtime: PolyesterRealtime) {\n this.#client = createClient(Proto.ProfileService, transport);\n this.#realtime = realtime;\n }\n\n /**\n * Fetches the caller's public profile, including username eligibility/cooldown, verified social handles, avatar, VIP tier, and account creation timestamp.\n */\n async get(options?: PolyesterRequestOptions): Promise<Profile> {\n const res = await this.#client.getProfile({}, toConnectCallOptions(options));\n if (!res) throw new Error(\"Profile not found\");\n return v.parse(ProfileSchema, res);\n }\n\n /**\n * Updates only the provided mutable profile fields; omitted fields are unchanged, while present empty strings clear optional text fields such as bio, website, Twitter, and avatar URL.\n */\n async update(\n input: v.InferInput<typeof UpdateProfileInputSchema>,\n options?: PolyesterMutationOptions,\n ): Promise<Profile> {\n const validatedInput = v.parse(UpdateProfileInputSchema, input);\n const res = await this.#client.updateProfile(\n removeUndefined(validatedInput),\n toConnectCallOptions(options),\n );\n return v.parse(ProfileSchema, res);\n }\n\n /**\n * Returns the caller's recent username changes, newest first, capped at 20 entries.\n */\n async getUsernameHistory(options?: PolyesterRequestOptions): Promise<UsernameHistoryEntry[]> {\n const res = await this.#client.getUsernameHistory({}, toConnectCallOptions(options));\n return v.parse(v.array(UsernameHistoryEntrySchema), res.history);\n }\n\n /**\n * Subscribes to public identity updates and emits normalized account identity records with base58 account IDs, username, avatar URL, and root smart-account address.\n */\n subscribeIdentity(input: SubscribeIdentityInput): () => void {\n const channel = \"public:identity:updates:proto\";\n return this.#realtime.connectProtoChannel({\n channel,\n schema: Proto.AccountIdentitySchema,\n onPublication: (data) => {\n const identity = v.parse(AccountIdentitySchema, data);\n input.onEvent(identity);\n },\n onConnected: () => input.onOpen?.(),\n onDisconnected: () => input.onClose?.(),\n onError: (ctx) => input.onError?.(ctx),\n });\n }\n}\n"],"mappings":";;;;;;;;;;AA0BA,IAAa,iBAAb,MAA4B;CACxB;CACA;CAEA,YAAY,WAAsB,UAA6B;EAC3D,KAAKA,UAAU,aAAaC,kBAAsB,SAAS;EAC3D,KAAKC,YAAY;CACrB;;;;CAKA,MAAM,IAAI,SAAqD;EAC3D,MAAM,MAAM,MAAM,KAAKF,QAAQ,WAAW,CAAC,GAAG,qBAAqB,OAAO,CAAC;EAC3E,IAAI,CAAC,KAAK,MAAM,IAAI,MAAM,mBAAmB;EAC7C,OAAO,EAAE,MAAM,eAAe,GAAG;CACrC;;;;CAKA,MAAM,OACF,OACA,SACgB;EAChB,MAAM,iBAAiB,EAAE,MAAM,0BAA0B,KAAK;EAC9D,MAAM,MAAM,MAAM,KAAKA,QAAQ,cAC3B,gBAAgB,cAAc,GAC9B,qBAAqB,OAAO,CAChC;EACA,OAAO,EAAE,MAAM,eAAe,GAAG;CACrC;;;;CAKA,MAAM,mBAAmB,SAAoE;EACzF,MAAM,MAAM,MAAM,KAAKA,QAAQ,mBAAmB,CAAC,GAAG,qBAAqB,OAAO,CAAC;EACnF,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,GAAG,IAAI,OAAO;CACnE;;;;CAKA,kBAAkB,OAA2C;EAEzD,OAAO,KAAKE,UAAU,oBAAoB;GACtC,SAAA;GACA,QAAQC;GACR,gBAAgB,SAAS;IACrB,MAAM,WAAW,EAAE,MAAMC,yBAAuB,IAAI;IACpD,MAAM,QAAQ,QAAQ;GAC1B;GACA,mBAAmB,MAAM,SAAS;GAClC,sBAAsB,MAAM,UAAU;GACtC,UAAU,QAAQ,MAAM,UAAU,GAAG;EACzC,CAAC;CACL;AACJ"}
1
+ {"version":3,"file":"profile.js","names":["#client","Proto.ProfileService","#realtime","Proto.AccountIdentitySchema","AccountIdentitySchema"],"sources":["../../../../src/services/auth/profile/profile.ts"],"sourcesContent":["import { createClient, type Client, type Transport } from \"@connectrpc/connect\";\nimport * as Proto from \"../../../gen/auth/v1/profile_pb.js\";\nimport * as v from \"valibot\";\nimport { parse } from \"../../../shared/validation.js\";\nimport { removeUndefined } from \"../../../utils/remove-undefined.js\";\nimport {\n toConnectCallOptions,\n type PolyesterMutationOptions,\n type PolyesterRequestOptions,\n} from \"../../../shared/request-options.js\";\nimport {\n AccountIdentitySchema,\n ProfileSchema,\n UpdateProfileInputSchema,\n UsernameHistoryEntrySchema,\n type AccountIdentity,\n type Profile,\n type UsernameHistoryEntry,\n} from \"./profile.schemas.js\";\nimport type { BaseSubscribeInput } from \"../../../shared/types.js\";\nimport type { PolyesterRealtime } from \"../../../realtime/index.js\";\n\ninterface SubscribeIdentityInput extends BaseSubscribeInput<AccountIdentity> {}\n\n/**\n * Manages the authenticated account's public profile and realtime identity updates.\n */\nexport class ProfileService {\n #client: Client<typeof Proto.ProfileService>;\n #realtime: PolyesterRealtime;\n\n constructor(transport: Transport, realtime: PolyesterRealtime) {\n this.#client = createClient(Proto.ProfileService, transport);\n this.#realtime = realtime;\n }\n\n /**\n * Fetches the caller's public profile, including username eligibility/cooldown, verified social handles, avatar, VIP tier, and account creation timestamp.\n */\n async get(options?: PolyesterRequestOptions): Promise<Profile> {\n const res = await this.#client.getProfile({}, toConnectCallOptions(options));\n if (!res) throw new Error(\"Profile not found\");\n return parse(ProfileSchema, res);\n }\n\n /**\n * Updates only the provided mutable profile fields; omitted fields are unchanged, while present empty strings clear optional text fields such as bio, website, Twitter, and avatar URL.\n */\n async update(\n input: v.InferInput<typeof UpdateProfileInputSchema>,\n options?: PolyesterMutationOptions,\n ): Promise<Profile> {\n const validatedInput = parse(UpdateProfileInputSchema, input);\n const res = await this.#client.updateProfile(\n removeUndefined(validatedInput),\n toConnectCallOptions(options),\n );\n return parse(ProfileSchema, res);\n }\n\n /**\n * Returns the caller's recent username changes, newest first, capped at 20 entries.\n */\n async getUsernameHistory(options?: PolyesterRequestOptions): Promise<UsernameHistoryEntry[]> {\n const res = await this.#client.getUsernameHistory({}, toConnectCallOptions(options));\n return parse(v.array(UsernameHistoryEntrySchema), res.history);\n }\n\n /**\n * Subscribes to public identity updates and emits normalized account identity records with base58 account IDs, username, avatar URL, and root smart-account address.\n */\n subscribeIdentity(input: SubscribeIdentityInput): () => void {\n const channel = \"public:identity:updates:proto\";\n return this.#realtime.connectProtoChannel({\n channel,\n schema: Proto.AccountIdentitySchema,\n onPublication: (data) => {\n const identity = parse(AccountIdentitySchema, data);\n input.onEvent(identity);\n },\n onConnected: () => input.onOpen?.(),\n onDisconnected: () => input.onClose?.(),\n onError: input.onError,\n });\n }\n}\n"],"mappings":";;;;;;;;;;;AA2BA,IAAa,iBAAb,MAA4B;CACxB;CACA;CAEA,YAAY,WAAsB,UAA6B;EAC3D,KAAKA,UAAU,aAAaC,kBAAsB,SAAS;EAC3D,KAAKC,YAAY;CACrB;;;;CAKA,MAAM,IAAI,SAAqD;EAC3D,MAAM,MAAM,MAAM,KAAKF,QAAQ,WAAW,CAAC,GAAG,qBAAqB,OAAO,CAAC;EAC3E,IAAI,CAAC,KAAK,MAAM,IAAI,MAAM,mBAAmB;EAC7C,OAAO,MAAM,eAAe,GAAG;CACnC;;;;CAKA,MAAM,OACF,OACA,SACgB;EAChB,MAAM,iBAAiB,MAAM,0BAA0B,KAAK;EAC5D,MAAM,MAAM,MAAM,KAAKA,QAAQ,cAC3B,gBAAgB,cAAc,GAC9B,qBAAqB,OAAO,CAChC;EACA,OAAO,MAAM,eAAe,GAAG;CACnC;;;;CAKA,MAAM,mBAAmB,SAAoE;EACzF,MAAM,MAAM,MAAM,KAAKA,QAAQ,mBAAmB,CAAC,GAAG,qBAAqB,OAAO,CAAC;EACnF,OAAO,MAAM,EAAE,MAAM,0BAA0B,GAAG,IAAI,OAAO;CACjE;;;;CAKA,kBAAkB,OAA2C;EAEzD,OAAO,KAAKE,UAAU,oBAAoB;GACtC,SAAA;GACA,QAAQC;GACR,gBAAgB,SAAS;IACrB,MAAM,WAAW,MAAMC,yBAAuB,IAAI;IAClD,MAAM,QAAQ,QAAQ;GAC1B;GACA,mBAAmB,MAAM,SAAS;GAClC,sBAAsB,MAAM,UAAU;GACtC,SAAS,MAAM;EACnB,CAAC;CACL;AACJ"}
@@ -27,7 +27,7 @@ interface EnsureSessionParams {
27
27
  }
28
28
  declare function emptyServerSessionSnapshot(): ServerSessionSnapshot;
29
29
  /**
30
- * Parses a serialized session cookie into a display-only server snapshot.
30
+ * Parses bearer authentication and display-only session cookies into a server snapshot.
31
31
  */
32
32
  declare function parseServerSessionSnapshot(cookies: CookieGetter, environment: PolyesterEnvironment): ServerSessionSnapshot;
33
33
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","names":[],"sources":["../../../src/services/auth/session.ts"],"mappings":";;;;;UAyBiB;EACb;;UAGa;EACb;EACA,cAAc;EACd,UAAU;EACV,aAAa;EACb;EACA;EACA;EACA,gBAAgB;EAChB;;UAGa;EACb,UAAU;EACV,aAAa;EACb;EACA;EACA;EACA;;iBAoEY,8BAA8B;;;;iBAgB9B,2BACZ,SAAS,cACT,aAAa,uBACd;;;;cA2BU;;EAIG,cAAE;IAA4B;;EAK1C,OAAO;EAUP,yBAAyB,cAAc;EAYvC,YAAY,QAAQ,0BAA0B,cAAc;EAsB5D,cAAc,QAAQ,qBAAqB,UAAU,uBAAuB;EA8B5E,YAAY,yBAAyB,UAAU;EAO/C,iBACI,eAAe,KAAK,qCACpB,UAAU;EAoBd"}
1
+ {"version":3,"file":"session.d.ts","names":[],"sources":["../../../src/services/auth/session.ts"],"mappings":";;;;;UAyBiB;EACb;;UAGa;EACb;EACA,cAAc;EACd,UAAU;EACV,aAAa;EACb;EACA;EACA;EACA,gBAAgB;EAChB;;UAGa;EACb,UAAU;EACV,aAAa;EACb;EACA;EACA;EACA;;iBAoEY,8BAA8B;;;;iBAgB9B,2BACZ,SAAS,cACT,aAAa,uBACd;;;;cA+BU;;EAIG,cAAE;IAA4B;;EAK1C,OAAO;EAUP,yBAAyB,cAAc;EAYvC,YAAY,QAAQ,0BAA0B,cAAc;EAsB5D,cAAc,QAAQ,qBAAqB,UAAU,uBAAuB;EA8B5E,YAAY,yBAAyB,UAAU;EAO/C,iBACI,eAAe,KAAK,qCACpB,UAAU;EAoBd"}
@@ -70,13 +70,17 @@ function emptyServerSessionSnapshot() {
70
70
  };
71
71
  }
72
72
  /**
73
- * Parses a serialized session cookie into a display-only server snapshot.
73
+ * Parses bearer authentication and display-only session cookies into a server snapshot.
74
74
  */
75
75
  function parseServerSessionSnapshot(cookies, environment) {
76
76
  const sessionValue = getCookieValue(cookies, POLYESTER_SESSION_COOKIE_NAME);
77
77
  const bearerToken = getCookieValue(cookies, "polyester_auth_token") ?? null;
78
78
  const session = sessionValue ? SessionCodec.decode(sessionValue) : null;
79
- if (!session || session.environmentFingerprint !== environment.fingerprint) return emptyServerSessionSnapshot();
79
+ if (!session) return {
80
+ ...emptyServerSessionSnapshot(),
81
+ bearerToken
82
+ };
83
+ if (session.environmentFingerprint !== environment.fingerprint) return emptyServerSessionSnapshot();
80
84
  return {
81
85
  environmentFingerprint: session.environmentFingerprint,
82
86
  hasDisplaySession: true,
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","names":["#lastRawValue","#lastDecoded","#environmentFingerprint","#session"],"sources":["../../../src/services/auth/session.ts"],"sourcesContent":["import {\n setCookie,\n deleteCookie,\n getCookie,\n getCookieValue,\n shouldSecureCookies,\n type CookieGetter,\n} from \"../../utils/cookies.js\";\nimport {\n POLYESTER_AUTH_TOKEN_COOKIE_NAME,\n POLYESTER_SESSION_COOKIE_NAME,\n POLYESTER_LOGIN_COOKIE_MAX_AGE,\n} from \"./cookie-constants.js\";\nimport { SessionCodec } from \"./session-codec.js\";\nimport type { PolyesterEnvironment } from \"../../environment.js\";\nimport type { AuthTokenStorage, AuthTokenStorageSetOptions } from \"./token-storage.js\";\nimport type {\n ActiveAccountInfo,\n AuthLoginMethod,\n ServerSessionSnapshot,\n SessionData,\n} from \"./session.types.js\";\n\nexport type { ActiveAccountInfo, AuthLoginMethod, ServerSessionSnapshot, SessionData };\n\nexport interface SessionCookieOptions {\n maxAgeSeconds?: number | null;\n}\n\nexport interface CommitLoginSessionParams {\n accessToken: string;\n tokenOptions: AuthTokenStorageSetOptions;\n provider: SessionData[\"provider\"];\n loginMethod: AuthLoginMethod | null;\n primaryWallet: string;\n smartAccount: string;\n accountId: string;\n activeAccount?: ActiveAccountInfo;\n username?: string;\n}\n\nexport interface EnsureSessionParams {\n provider: SessionData[\"provider\"];\n loginMethod: AuthLoginMethod | null;\n primaryWallet: string;\n smartAccount: string;\n accountId: string;\n username?: string;\n}\n\nfunction resolveSessionCookieMaxAge(options?: SessionCookieOptions): number | undefined {\n if (!options) return POLYESTER_LOGIN_COOKIE_MAX_AGE;\n return options.maxAgeSeconds ?? undefined;\n}\n\n/**\n * Reads and writes the browser display-session cookie.\n */\nclass PolyesterSessionManager {\n /**\n * Replaces the current session state.\n */\n set(session: SessionData, options?: SessionCookieOptions): void {\n setCookie({\n name: POLYESTER_SESSION_COOKIE_NAME,\n value: SessionCodec.encode(session),\n options: {\n path: \"/\",\n maxAge: resolveSessionCookieMaxAge(options),\n secure: shouldSecureCookies(),\n sameSite: \"lax\",\n },\n });\n }\n\n // The session is re-read on every authenticated RPC; memoize the decode\n // (JSON.parse + schema validation) on the raw cookie value.\n #lastRawValue: string | null = null;\n #lastDecoded: SessionData | null = null;\n\n /**\n * Returns the current session state, or null when no session is active.\n */\n get(): SessionData | null {\n const value = getCookie(POLYESTER_SESSION_COOKIE_NAME);\n if (!value) {\n this.#lastRawValue = null;\n this.#lastDecoded = null;\n return null;\n }\n if (value === this.#lastRawValue) return this.#lastDecoded;\n\n const session = SessionCodec.decode(value);\n if (!session) {\n this.clear();\n this.#lastRawValue = null;\n this.#lastDecoded = null;\n return null;\n }\n\n this.#lastRawValue = value;\n this.#lastDecoded = session;\n return session;\n }\n\n /**\n * Clears the current session state.\n */\n clear(): void {\n deleteCookie(POLYESTER_SESSION_COOKIE_NAME);\n }\n}\n\nexport const polyesterSession = new PolyesterSessionManager();\n\nexport function emptyServerSessionSnapshot(): ServerSessionSnapshot {\n return {\n environmentFingerprint: null,\n hasDisplaySession: false,\n provider: null,\n loginMethod: null,\n accountAddresses: null,\n activeAccount: null,\n bearerToken: null,\n username: null,\n };\n}\n\n/**\n * Parses a serialized session cookie into a display-only server snapshot.\n */\nexport function parseServerSessionSnapshot(\n cookies: CookieGetter,\n environment: PolyesterEnvironment,\n): ServerSessionSnapshot {\n const sessionValue = getCookieValue(cookies, POLYESTER_SESSION_COOKIE_NAME);\n const bearerToken = getCookieValue(cookies, POLYESTER_AUTH_TOKEN_COOKIE_NAME) ?? null;\n const session = sessionValue ? SessionCodec.decode(sessionValue) : null;\n\n if (!session || session.environmentFingerprint !== environment.fingerprint) {\n return emptyServerSessionSnapshot();\n }\n\n return {\n environmentFingerprint: session.environmentFingerprint,\n hasDisplaySession: true,\n provider: session.provider,\n loginMethod: session.loginMethod,\n accountAddresses: {\n ownerAddress: session.primaryWallet,\n accountAddress: session.smartAccount,\n },\n activeAccount: session.activeAccount ?? null,\n bearerToken,\n username: session.username ?? null,\n };\n}\n\n/**\n * Owns environment-bound auth session transitions for browser clients.\n */\nexport class AuthSessionStore {\n #environmentFingerprint: string;\n #session: PolyesterSessionManager;\n\n constructor({ environmentFingerprint }: { environmentFingerprint: string }) {\n this.#environmentFingerprint = environmentFingerprint;\n this.#session = polyesterSession;\n }\n\n get(): SessionData | null {\n const session = this.#session.get();\n if (!session) return null;\n if (session.environmentFingerprint !== this.#environmentFingerprint) {\n this.#session.clear();\n return null;\n }\n return session;\n }\n\n getEnvironmentBoundToken(tokenStorage: AuthTokenStorage): string | null {\n const token = tokenStorage.get();\n if (!token) return null;\n\n if (!this.get()) {\n tokenStorage.clear();\n return null;\n }\n\n return token;\n }\n\n commitLogin(params: CommitLoginSessionParams, tokenStorage: AuthTokenStorage): void {\n tokenStorage.set(params.accessToken, params.tokenOptions);\n this.#session.set(\n {\n environmentFingerprint: this.#environmentFingerprint,\n provider: params.provider,\n loginMethod: params.loginMethod,\n primaryWallet: params.primaryWallet,\n smartAccount: params.smartAccount,\n activeAccount: {\n accountId: params.activeAccount?.accountId ?? params.accountId,\n isMain: params.activeAccount?.isMain ?? true,\n mainAccountId: params.accountId,\n smartAccountAddress: params.activeAccount?.smartAccountAddress,\n label: params.activeAccount?.label,\n },\n username: params.username,\n },\n { maxAgeSeconds: params.tokenOptions.maxAgeSeconds },\n );\n }\n\n ensureSession(params: EnsureSessionParams, options?: SessionCookieOptions): SessionData {\n const existingSession = this.get();\n if (existingSession) {\n const username = params.username || undefined;\n if (username === undefined || username === existingSession.username) {\n return existingSession;\n }\n\n const session = { ...existingSession, username };\n this.#session.set(session, options);\n return session;\n }\n\n const session: SessionData = {\n environmentFingerprint: this.#environmentFingerprint,\n provider: params.provider,\n loginMethod: params.loginMethod,\n primaryWallet: params.primaryWallet,\n smartAccount: params.smartAccount,\n activeAccount: {\n accountId: params.accountId,\n isMain: true,\n mainAccountId: params.accountId,\n },\n username: params.username,\n };\n this.#session.set(session, options);\n return session;\n }\n\n setUsername(username: string | null, options?: SessionCookieOptions): void {\n const session = this.get();\n if (!session) return;\n\n this.#session.set({ ...session, username: username || undefined }, options);\n }\n\n setActiveAccount(\n activeAccount: Omit<ActiveAccountInfo, \"mainAccountId\">,\n options?: SessionCookieOptions,\n ): void {\n const session = this.get();\n if (!session) return;\n\n const mainAccountId = session.activeAccount?.mainAccountId ?? activeAccount.accountId;\n const smartAccountAddress = activeAccount.isMain\n ? session.smartAccount\n : activeAccount.smartAccountAddress;\n const label = activeAccount.isMain ? undefined : activeAccount.label;\n this.#session.set(\n {\n ...session,\n activeAccount: { ...activeAccount, mainAccountId, smartAccountAddress, label },\n username: session.username,\n },\n options,\n );\n }\n\n clear(): void {\n this.#session.clear();\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"session.js","names":["#lastRawValue","#lastDecoded","#environmentFingerprint","#session"],"sources":["../../../src/services/auth/session.ts"],"sourcesContent":["import {\n setCookie,\n deleteCookie,\n getCookie,\n getCookieValue,\n shouldSecureCookies,\n type CookieGetter,\n} from \"../../utils/cookies.js\";\nimport {\n POLYESTER_AUTH_TOKEN_COOKIE_NAME,\n POLYESTER_SESSION_COOKIE_NAME,\n POLYESTER_LOGIN_COOKIE_MAX_AGE,\n} from \"./cookie-constants.js\";\nimport { SessionCodec } from \"./session-codec.js\";\nimport type { PolyesterEnvironment } from \"../../environment.js\";\nimport type { AuthTokenStorage, AuthTokenStorageSetOptions } from \"./token-storage.js\";\nimport type {\n ActiveAccountInfo,\n AuthLoginMethod,\n ServerSessionSnapshot,\n SessionData,\n} from \"./session.types.js\";\n\nexport type { ActiveAccountInfo, AuthLoginMethod, ServerSessionSnapshot, SessionData };\n\nexport interface SessionCookieOptions {\n maxAgeSeconds?: number | null;\n}\n\nexport interface CommitLoginSessionParams {\n accessToken: string;\n tokenOptions: AuthTokenStorageSetOptions;\n provider: SessionData[\"provider\"];\n loginMethod: AuthLoginMethod | null;\n primaryWallet: string;\n smartAccount: string;\n accountId: string;\n activeAccount?: ActiveAccountInfo;\n username?: string;\n}\n\nexport interface EnsureSessionParams {\n provider: SessionData[\"provider\"];\n loginMethod: AuthLoginMethod | null;\n primaryWallet: string;\n smartAccount: string;\n accountId: string;\n username?: string;\n}\n\nfunction resolveSessionCookieMaxAge(options?: SessionCookieOptions): number | undefined {\n if (!options) return POLYESTER_LOGIN_COOKIE_MAX_AGE;\n return options.maxAgeSeconds ?? undefined;\n}\n\n/**\n * Reads and writes the browser display-session cookie.\n */\nclass PolyesterSessionManager {\n /**\n * Replaces the current session state.\n */\n set(session: SessionData, options?: SessionCookieOptions): void {\n setCookie({\n name: POLYESTER_SESSION_COOKIE_NAME,\n value: SessionCodec.encode(session),\n options: {\n path: \"/\",\n maxAge: resolveSessionCookieMaxAge(options),\n secure: shouldSecureCookies(),\n sameSite: \"lax\",\n },\n });\n }\n\n // The session is re-read on every authenticated RPC; memoize the decode\n // (JSON.parse + schema validation) on the raw cookie value.\n #lastRawValue: string | null = null;\n #lastDecoded: SessionData | null = null;\n\n /**\n * Returns the current session state, or null when no session is active.\n */\n get(): SessionData | null {\n const value = getCookie(POLYESTER_SESSION_COOKIE_NAME);\n if (!value) {\n this.#lastRawValue = null;\n this.#lastDecoded = null;\n return null;\n }\n if (value === this.#lastRawValue) return this.#lastDecoded;\n\n const session = SessionCodec.decode(value);\n if (!session) {\n this.clear();\n this.#lastRawValue = null;\n this.#lastDecoded = null;\n return null;\n }\n\n this.#lastRawValue = value;\n this.#lastDecoded = session;\n return session;\n }\n\n /**\n * Clears the current session state.\n */\n clear(): void {\n deleteCookie(POLYESTER_SESSION_COOKIE_NAME);\n }\n}\n\nexport const polyesterSession = new PolyesterSessionManager();\n\nexport function emptyServerSessionSnapshot(): ServerSessionSnapshot {\n return {\n environmentFingerprint: null,\n hasDisplaySession: false,\n provider: null,\n loginMethod: null,\n accountAddresses: null,\n activeAccount: null,\n bearerToken: null,\n username: null,\n };\n}\n\n/**\n * Parses bearer authentication and display-only session cookies into a server snapshot.\n */\nexport function parseServerSessionSnapshot(\n cookies: CookieGetter,\n environment: PolyesterEnvironment,\n): ServerSessionSnapshot {\n const sessionValue = getCookieValue(cookies, POLYESTER_SESSION_COOKIE_NAME);\n const bearerToken = getCookieValue(cookies, POLYESTER_AUTH_TOKEN_COOKIE_NAME) ?? null;\n const session = sessionValue ? SessionCodec.decode(sessionValue) : null;\n\n if (!session) {\n return { ...emptyServerSessionSnapshot(), bearerToken };\n }\n\n if (session.environmentFingerprint !== environment.fingerprint) {\n return emptyServerSessionSnapshot();\n }\n\n return {\n environmentFingerprint: session.environmentFingerprint,\n hasDisplaySession: true,\n provider: session.provider,\n loginMethod: session.loginMethod,\n accountAddresses: {\n ownerAddress: session.primaryWallet,\n accountAddress: session.smartAccount,\n },\n activeAccount: session.activeAccount ?? null,\n bearerToken,\n username: session.username ?? null,\n };\n}\n\n/**\n * Owns environment-bound auth session transitions for browser clients.\n */\nexport class AuthSessionStore {\n #environmentFingerprint: string;\n #session: PolyesterSessionManager;\n\n constructor({ environmentFingerprint }: { environmentFingerprint: string }) {\n this.#environmentFingerprint = environmentFingerprint;\n this.#session = polyesterSession;\n }\n\n get(): SessionData | null {\n const session = this.#session.get();\n if (!session) return null;\n if (session.environmentFingerprint !== this.#environmentFingerprint) {\n this.#session.clear();\n return null;\n }\n return session;\n }\n\n getEnvironmentBoundToken(tokenStorage: AuthTokenStorage): string | null {\n const token = tokenStorage.get();\n if (!token) return null;\n\n if (!this.get()) {\n tokenStorage.clear();\n return null;\n }\n\n return token;\n }\n\n commitLogin(params: CommitLoginSessionParams, tokenStorage: AuthTokenStorage): void {\n tokenStorage.set(params.accessToken, params.tokenOptions);\n this.#session.set(\n {\n environmentFingerprint: this.#environmentFingerprint,\n provider: params.provider,\n loginMethod: params.loginMethod,\n primaryWallet: params.primaryWallet,\n smartAccount: params.smartAccount,\n activeAccount: {\n accountId: params.activeAccount?.accountId ?? params.accountId,\n isMain: params.activeAccount?.isMain ?? true,\n mainAccountId: params.accountId,\n smartAccountAddress: params.activeAccount?.smartAccountAddress,\n label: params.activeAccount?.label,\n },\n username: params.username,\n },\n { maxAgeSeconds: params.tokenOptions.maxAgeSeconds },\n );\n }\n\n ensureSession(params: EnsureSessionParams, options?: SessionCookieOptions): SessionData {\n const existingSession = this.get();\n if (existingSession) {\n const username = params.username || undefined;\n if (username === undefined || username === existingSession.username) {\n return existingSession;\n }\n\n const session = { ...existingSession, username };\n this.#session.set(session, options);\n return session;\n }\n\n const session: SessionData = {\n environmentFingerprint: this.#environmentFingerprint,\n provider: params.provider,\n loginMethod: params.loginMethod,\n primaryWallet: params.primaryWallet,\n smartAccount: params.smartAccount,\n activeAccount: {\n accountId: params.accountId,\n isMain: true,\n mainAccountId: params.accountId,\n },\n username: params.username,\n };\n this.#session.set(session, options);\n return session;\n }\n\n setUsername(username: string | null, options?: SessionCookieOptions): void {\n const session = this.get();\n if (!session) return;\n\n this.#session.set({ ...session, username: username || undefined }, options);\n }\n\n setActiveAccount(\n activeAccount: Omit<ActiveAccountInfo, \"mainAccountId\">,\n options?: SessionCookieOptions,\n ): void {\n const session = this.get();\n if (!session) return;\n\n const mainAccountId = session.activeAccount?.mainAccountId ?? activeAccount.accountId;\n const smartAccountAddress = activeAccount.isMain\n ? session.smartAccount\n : activeAccount.smartAccountAddress;\n const label = activeAccount.isMain ? undefined : activeAccount.label;\n this.#session.set(\n {\n ...session,\n activeAccount: { ...activeAccount, mainAccountId, smartAccountAddress, label },\n username: session.username,\n },\n options,\n );\n }\n\n clear(): void {\n this.#session.clear();\n }\n}\n"],"mappings":"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"}
@@ -48,9 +48,10 @@ interface AuthHydrationData {
48
48
  ownerAddress?: HexAddress;
49
49
  }
50
50
  /**
51
- * Display-only session data parsed from client-readable cookies.
51
+ * Server-side cookie state for authentication and UI hydration.
52
52
  *
53
- * This data is unsigned and must not be used for authorization.
53
+ * Display-session fields are unsigned and must not be used for authorization.
54
+ * The bearer token is a credential, but only backend verification proves authentication.
54
55
  */
55
56
  interface ServerSessionSnapshot {
56
57
  environmentFingerprint: string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"session.types.d.ts","names":[],"sources":["../../../src/services/auth/session.types.ts"],"mappings":";;;;;;UAMiB;EACb;EACA;EACA;EACA;EACA;;KAGQ;;;;;UAYK;EACb;EACA;EACA,aAAa;EACb;EACA;EACA,gBAAgB;EAChB;;;;;;UAOa;EACb;EACA,gBAAgB;EAChB,cAAc;EACd;EACA,eAAe;;;;;;UAOF;EACb;EACA;EACA;EACA,sBAAsB;EACtB,eAAe;;;;;;;UAQF;EACb;EACA;EACA;EACA,aAAa;EACb;IAAoB;IAAsB;;EAC1C,eAAe;EACf;EACA"}
1
+ {"version":3,"file":"session.types.d.ts","names":[],"sources":["../../../src/services/auth/session.types.ts"],"mappings":";;;;;;UAMiB;EACb;EACA;EACA;EACA;EACA;;KAGQ;;;;;UAYK;EACb;EACA;EACA,aAAa;EACb;EACA;EACA,gBAAgB;EAChB;;;;;;UAOa;EACb;EACA,gBAAgB;EAChB,cAAc;EACd;EACA,eAAe;;;;;;UAOF;EACb;EACA;EACA;EACA,sBAAsB;EACtB,eAAe;;;;;;;;UASF;EACb;EACA;EACA;EACA,aAAa;EACb;IAAoB;IAAsB;;EAC1C,eAAe;EACf;EACA"}
@@ -22,7 +22,7 @@ declare class BalancesService {
22
22
  */
23
23
  list(input?: AccountScopedInput, options?: PolyesterRequestOptions): Promise<LedgerBalance[]>;
24
24
  /**
25
- * Returns columnar balance history for the resolved account scope over a selected range, optionally filtered by ledger asset and account buckets.
25
+ * Returns columnar balance history for the resolved account scope over a selected range, optionally filtered by a non-negative integer ledger asset ID and account buckets. Ledger 0 or omission includes all assets.
26
26
  */
27
27
  getBalanceHistory(input: BalanceHistoryInput, options?: PolyesterRequestOptions): Promise<BalanceHistoryResponse>;
28
28
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"balances.d.ts","names":[],"sources":["../../../src/services/balances/balances.ts"],"mappings":";;;;;;;;;;UA2BU,+BAA+B,mBAAmB;EACxD;;;;;cAMS;;EAUL,YAAA,WAAW,WACX,UAAU,mBACV,UAAU,gCACV,QAAQ;;;;EAcN,KACF,QAAO,oBACP,UAAU,0BACX,QAAQ;;;;EAgBL,kBACF,OAAO,qBACP,UAAU,0BACX,QAAQ;;;;EAWL,iBACF,OAAO,oBACP,UAAU,0BACX,QAAQ;;;;EAcX,UAAU,OAAO"}
1
+ {"version":3,"file":"balances.d.ts","names":[],"sources":["../../../src/services/balances/balances.ts"],"mappings":";;;;;;;;;;UA4BU,+BAA+B,mBAAmB;EACxD;;;;;cAMS;;EAUL,YAAA,WAAW,WACX,UAAU,mBACV,UAAU,gCACV,QAAQ;;;;EAcN,KACF,QAAO,oBACP,UAAU,0BACX,QAAQ;;;;EAgBL,kBACF,OAAO,qBACP,UAAU,0BACX,QAAQ;;;;EAWL,iBACF,OAAO,oBACP,UAAU,0BACX,QAAQ;;;;EAcX,UAAU,OAAO"}
@@ -1,3 +1,4 @@
1
+ import { parse } from "../../shared/validation.js";
1
2
  import { toConnectCallOptions } from "../../shared/request-options.js";
2
3
  import { resolveAccountScopedInput } from "../subaccount-resolver.js";
3
4
  import { accountScopeToSubaccountId } from "../../shared/account-scope.js";
@@ -34,19 +35,19 @@ var BalancesService = class {
34
35
  async list(input = {}, options) {
35
36
  await this.#scales.ready();
36
37
  const resolved = resolveAccountScopedInput(input, this.#resolver);
37
- const validated = v.parse(BalancesListInputSchema, resolved);
38
+ const validated = parse(BalancesListInputSchema, resolved);
38
39
  const res = await this.#client.getBalances({ subaccountId: accountScopeToSubaccountId(validated.account) }, toConnectCallOptions(options));
39
- return v.parse(v.array(this.#ledgerBalanceSchema), res.balances);
40
+ return parse(v.array(this.#ledgerBalanceSchema), res.balances);
40
41
  }
41
42
  /**
42
- * Returns columnar balance history for the resolved account scope over a selected range, optionally filtered by ledger asset and account buckets.
43
+ * Returns columnar balance history for the resolved account scope over a selected range, optionally filtered by a non-negative integer ledger asset ID and account buckets. Ledger 0 or omission includes all assets.
43
44
  */
44
45
  async getBalanceHistory(input, options) {
45
46
  await this.#scales.ready();
46
47
  const resolved = resolveAccountScopedInput(input, this.#resolver);
47
- const validated = v.parse(BalanceHistoryInputSchema, resolved);
48
+ const validated = parse(BalanceHistoryInputSchema, resolved);
48
49
  const res = await this.#client.getBalanceHistory(validated, toConnectCallOptions(options));
49
- return v.parse(this.#balanceHistoryResponseSchema, res);
50
+ return parse(this.#balanceHistoryResponseSchema, res);
50
51
  }
51
52
  /**
52
53
  * Returns equity history series for the resolved account scope over a selected range, optionally grouped by account or asset and filtered by account buckets.
@@ -54,9 +55,9 @@ var BalancesService = class {
54
55
  async getEquityHistory(input, options) {
55
56
  await this.#scales.ready();
56
57
  const resolved = resolveAccountScopedInput(input, this.#resolver);
57
- const validated = v.parse(EquityHistoryInputSchema, resolved);
58
+ const validated = parse(EquityHistoryInputSchema, resolved);
58
59
  const res = await this.#client.getEquityHistorySeries(validated, toConnectCallOptions(options));
59
- return v.parse(this.#equityHistoryResponseSchema, res);
60
+ return parse(this.#equityHistoryResponseSchema, res);
60
61
  }
61
62
  /**
62
63
  * Subscribes to private balance updates on private:ledger:balances:{accountId}:proto and emits every balance record as a decimal-string row. Records for assets unknown to the catalog route a CatalogLookupError to onError.
@@ -69,7 +70,7 @@ var BalancesService = class {
69
70
  schema: AssetBalanceSchema,
70
71
  onPublication: (data) => {
71
72
  gate.run(() => {
72
- const b = v.parse(this.#ledgerBalanceSchema, data);
73
+ const b = parse(this.#ledgerBalanceSchema, data);
73
74
  input.onEvent(b);
74
75
  });
75
76
  },
@@ -1 +1 @@
1
- {"version":3,"file":"balances.js","names":["#client","Proto.LedgerReadService","#realtime","#resolver","#scales","#ledgerBalanceSchema","#balanceHistoryResponseSchema","#equityHistoryResponseSchema","Proto.AssetBalanceSchema"],"sources":["../../../src/services/balances/balances.ts"],"sourcesContent":["import * as Proto from \"../../gen/ledger/read/v1/ledger_read_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/index.js\";\nimport { type SubaccountResolver, resolveAccountScopedInput } from \"../subaccount-resolver.js\";\nimport {\n toConnectCallOptions,\n type PolyesterRequestOptions,\n} from \"../../shared/request-options.js\";\nimport { accountScopeToSubaccountId, type AccountScopedInput } from \"../../shared/account-scope.js\";\nimport type { BaseSubscribeInput } from \"../../shared/types.js\";\nimport { createReadyGate, type SdkScales } from \"../../shared/decimal-surface.js\";\nimport {\n BalanceHistoryInputSchema,\n BalancesListInputSchema,\n EquityHistoryInputSchema,\n createBalanceHistoryResponseSchema,\n createEquityHistoryResponseSchema,\n createLedgerBalanceSchema,\n type LedgerBalance,\n type BalanceHistoryInput,\n type BalanceHistoryResponse,\n type EquityHistoryInput,\n type EquityHistoryResponse,\n} from \"./balances.schemas.js\";\n\ninterface SubscribeBalancesInput extends BaseSubscribeInput<LedgerBalance> {\n accountId: string;\n}\n\n/**\n * Reads and streams ledger balances plus balance and equity history for the authenticated account scope.\n */\nexport class BalancesService {\n #client: Client<typeof Proto.LedgerReadService>;\n #realtime: PolyesterRealtime;\n #resolver?: SubaccountResolver;\n #scales: SdkScales;\n #ledgerBalanceSchema: ReturnType<typeof createLedgerBalanceSchema>;\n #balanceHistoryResponseSchema: ReturnType<typeof createBalanceHistoryResponseSchema>;\n #equityHistoryResponseSchema: ReturnType<typeof createEquityHistoryResponseSchema>;\n\n constructor(\n transport: Transport,\n realtime: PolyesterRealtime,\n resolver: SubaccountResolver | undefined,\n scales: SdkScales,\n ) {\n this.#client = createClient(Proto.LedgerReadService, transport);\n this.#realtime = realtime;\n this.#resolver = resolver;\n this.#scales = scales;\n this.#ledgerBalanceSchema = createLedgerBalanceSchema();\n this.#balanceHistoryResponseSchema = createBalanceHistoryResponseSchema();\n this.#equityHistoryResponseSchema = createEquityHistoryResponseSchema(scales);\n }\n\n /**\n * Returns current asset balances for the resolved root account or subaccount, including trading, funding, reserved, and available amounts as decimal strings.\n */\n async list(\n input: AccountScopedInput = {},\n options?: PolyesterRequestOptions,\n ): Promise<LedgerBalance[]> {\n await this.#scales.ready();\n const resolved = resolveAccountScopedInput(input, this.#resolver);\n const validated = v.parse(BalancesListInputSchema, resolved);\n const res = await this.#client.getBalances(\n {\n subaccountId: accountScopeToSubaccountId(validated.account),\n },\n toConnectCallOptions(options),\n );\n return v.parse(v.array(this.#ledgerBalanceSchema), res.balances);\n }\n\n /**\n * Returns columnar balance history for the resolved account scope over a selected range, optionally filtered by ledger asset and account buckets.\n */\n async getBalanceHistory(\n input: BalanceHistoryInput,\n options?: PolyesterRequestOptions,\n ): Promise<BalanceHistoryResponse> {\n await this.#scales.ready();\n const resolved = resolveAccountScopedInput(input, this.#resolver);\n const validated = v.parse(BalanceHistoryInputSchema, resolved);\n const res = await this.#client.getBalanceHistory(validated, toConnectCallOptions(options));\n return v.parse(this.#balanceHistoryResponseSchema, res);\n }\n\n /**\n * Returns equity history series for the resolved account scope over a selected range, optionally grouped by account or asset and filtered by account buckets.\n */\n async getEquityHistory(\n input: EquityHistoryInput,\n options?: PolyesterRequestOptions,\n ): Promise<EquityHistoryResponse> {\n await this.#scales.ready();\n const resolved = resolveAccountScopedInput(input, this.#resolver);\n const validated = v.parse(EquityHistoryInputSchema, resolved);\n const res = await this.#client.getEquityHistorySeries(\n validated,\n toConnectCallOptions(options),\n );\n return v.parse(this.#equityHistoryResponseSchema, res);\n }\n\n /**\n * Subscribes to private balance updates on private:ledger:balances:{accountId}:proto and emits every balance record as a decimal-string row. Records for assets unknown to the catalog route a CatalogLookupError to onError.\n */\n subscribe(input: SubscribeBalancesInput): () => void {\n const channel = `private:ledger:balances:${input.accountId}:proto`;\n const gate = createReadyGate(\n () => this.#scales.ready(),\n (error) => input.onError?.(publicationHandlerErrorContext(channel, error)),\n );\n return this.#realtime.connectProtoChannel({\n channel,\n schema: Proto.AssetBalanceSchema,\n onPublication: (data) => {\n gate.run(() => {\n const b = v.parse(this.#ledgerBalanceSchema, data);\n input.onEvent(b);\n });\n },\n onConnected: input.onOpen,\n onDisconnected: input.onClose,\n onError: input.onError,\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAkCA,IAAa,kBAAb,MAA6B;CACzB;CACA;CACA;CACA;CACA;CACA;CACA;CAEA,YACI,WACA,UACA,UACA,QACF;EACE,KAAKA,UAAU,aAAaC,mBAAyB,SAAS;EAC9D,KAAKC,YAAY;EACjB,KAAKC,YAAY;EACjB,KAAKC,UAAU;EACf,KAAKC,uBAAuB,0BAA0B;EACtD,KAAKC,gCAAgC,mCAAmC;EACxE,KAAKC,+BAA+B,kCAAkC,MAAM;CAChF;;;;CAKA,MAAM,KACF,QAA4B,CAAC,GAC7B,SACwB;EACxB,MAAM,KAAKH,QAAQ,MAAM;EACzB,MAAM,WAAW,0BAA0B,OAAO,KAAKD,SAAS;EAChE,MAAM,YAAY,EAAE,MAAM,yBAAyB,QAAQ;EAC3D,MAAM,MAAM,MAAM,KAAKH,QAAQ,YAC3B,EACI,cAAc,2BAA2B,UAAU,OAAO,EAC9D,GACA,qBAAqB,OAAO,CAChC;EACA,OAAO,EAAE,MAAM,EAAE,MAAM,KAAKK,oBAAoB,GAAG,IAAI,QAAQ;CACnE;;;;CAKA,MAAM,kBACF,OACA,SAC+B;EAC/B,MAAM,KAAKD,QAAQ,MAAM;EACzB,MAAM,WAAW,0BAA0B,OAAO,KAAKD,SAAS;EAChE,MAAM,YAAY,EAAE,MAAM,2BAA2B,QAAQ;EAC7D,MAAM,MAAM,MAAM,KAAKH,QAAQ,kBAAkB,WAAW,qBAAqB,OAAO,CAAC;EACzF,OAAO,EAAE,MAAM,KAAKM,+BAA+B,GAAG;CAC1D;;;;CAKA,MAAM,iBACF,OACA,SAC8B;EAC9B,MAAM,KAAKF,QAAQ,MAAM;EACzB,MAAM,WAAW,0BAA0B,OAAO,KAAKD,SAAS;EAChE,MAAM,YAAY,EAAE,MAAM,0BAA0B,QAAQ;EAC5D,MAAM,MAAM,MAAM,KAAKH,QAAQ,uBAC3B,WACA,qBAAqB,OAAO,CAChC;EACA,OAAO,EAAE,MAAM,KAAKO,8BAA8B,GAAG;CACzD;;;;CAKA,UAAU,OAA2C;EACjD,MAAM,UAAU,2BAA2B,MAAM,UAAU;EAC3D,MAAM,OAAO,sBACH,KAAKH,QAAQ,MAAM,IACxB,UAAU,MAAM,UAAU,+BAA+B,SAAS,KAAK,CAAC,CAC7E;EACA,OAAO,KAAKF,UAAU,oBAAoB;GACtC;GACA,QAAQM;GACR,gBAAgB,SAAS;IACrB,KAAK,UAAU;KACX,MAAM,IAAI,EAAE,MAAM,KAAKH,sBAAsB,IAAI;KACjD,MAAM,QAAQ,CAAC;IACnB,CAAC;GACL;GACA,aAAa,MAAM;GACnB,gBAAgB,MAAM;GACtB,SAAS,MAAM;EACnB,CAAC;CACL;AACJ"}
1
+ {"version":3,"file":"balances.js","names":["#client","Proto.LedgerReadService","#realtime","#resolver","#scales","#ledgerBalanceSchema","#balanceHistoryResponseSchema","#equityHistoryResponseSchema","Proto.AssetBalanceSchema"],"sources":["../../../src/services/balances/balances.ts"],"sourcesContent":["import * as Proto from \"../../gen/ledger/read/v1/ledger_read_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/index.js\";\nimport { type SubaccountResolver, resolveAccountScopedInput } from \"../subaccount-resolver.js\";\nimport {\n toConnectCallOptions,\n type PolyesterRequestOptions,\n} from \"../../shared/request-options.js\";\nimport { accountScopeToSubaccountId, type AccountScopedInput } from \"../../shared/account-scope.js\";\nimport type { BaseSubscribeInput } from \"../../shared/types.js\";\nimport { createReadyGate, type SdkScales } from \"../../shared/decimal-surface.js\";\nimport {\n BalanceHistoryInputSchema,\n BalancesListInputSchema,\n EquityHistoryInputSchema,\n createBalanceHistoryResponseSchema,\n createEquityHistoryResponseSchema,\n createLedgerBalanceSchema,\n type LedgerBalance,\n type BalanceHistoryInput,\n type BalanceHistoryResponse,\n type EquityHistoryInput,\n type EquityHistoryResponse,\n} from \"./balances.schemas.js\";\n\ninterface SubscribeBalancesInput extends BaseSubscribeInput<LedgerBalance> {\n accountId: string;\n}\n\n/**\n * Reads and streams ledger balances plus balance and equity history for the authenticated account scope.\n */\nexport class BalancesService {\n #client: Client<typeof Proto.LedgerReadService>;\n #realtime: PolyesterRealtime;\n #resolver?: SubaccountResolver;\n #scales: SdkScales;\n #ledgerBalanceSchema: ReturnType<typeof createLedgerBalanceSchema>;\n #balanceHistoryResponseSchema: ReturnType<typeof createBalanceHistoryResponseSchema>;\n #equityHistoryResponseSchema: ReturnType<typeof createEquityHistoryResponseSchema>;\n\n constructor(\n transport: Transport,\n realtime: PolyesterRealtime,\n resolver: SubaccountResolver | undefined,\n scales: SdkScales,\n ) {\n this.#client = createClient(Proto.LedgerReadService, transport);\n this.#realtime = realtime;\n this.#resolver = resolver;\n this.#scales = scales;\n this.#ledgerBalanceSchema = createLedgerBalanceSchema();\n this.#balanceHistoryResponseSchema = createBalanceHistoryResponseSchema();\n this.#equityHistoryResponseSchema = createEquityHistoryResponseSchema(scales);\n }\n\n /**\n * Returns current asset balances for the resolved root account or subaccount, including trading, funding, reserved, and available amounts as decimal strings.\n */\n async list(\n input: AccountScopedInput = {},\n options?: PolyesterRequestOptions,\n ): Promise<LedgerBalance[]> {\n await this.#scales.ready();\n const resolved = resolveAccountScopedInput(input, this.#resolver);\n const validated = parse(BalancesListInputSchema, resolved);\n const res = await this.#client.getBalances(\n {\n subaccountId: accountScopeToSubaccountId(validated.account),\n },\n toConnectCallOptions(options),\n );\n return parse(v.array(this.#ledgerBalanceSchema), res.balances);\n }\n\n /**\n * Returns columnar balance history for the resolved account scope over a selected range, optionally filtered by a non-negative integer ledger asset ID and account buckets. Ledger 0 or omission includes all assets.\n */\n async getBalanceHistory(\n input: BalanceHistoryInput,\n options?: PolyesterRequestOptions,\n ): Promise<BalanceHistoryResponse> {\n await this.#scales.ready();\n const resolved = resolveAccountScopedInput(input, this.#resolver);\n const validated = parse(BalanceHistoryInputSchema, resolved);\n const res = await this.#client.getBalanceHistory(validated, toConnectCallOptions(options));\n return parse(this.#balanceHistoryResponseSchema, res);\n }\n\n /**\n * Returns equity history series for the resolved account scope over a selected range, optionally grouped by account or asset and filtered by account buckets.\n */\n async getEquityHistory(\n input: EquityHistoryInput,\n options?: PolyesterRequestOptions,\n ): Promise<EquityHistoryResponse> {\n await this.#scales.ready();\n const resolved = resolveAccountScopedInput(input, this.#resolver);\n const validated = parse(EquityHistoryInputSchema, resolved);\n const res = await this.#client.getEquityHistorySeries(\n validated,\n toConnectCallOptions(options),\n );\n return parse(this.#equityHistoryResponseSchema, res);\n }\n\n /**\n * Subscribes to private balance updates on private:ledger:balances:{accountId}:proto and emits every balance record as a decimal-string row. Records for assets unknown to the catalog route a CatalogLookupError to onError.\n */\n subscribe(input: SubscribeBalancesInput): () => void {\n const channel = `private:ledger:balances:${input.accountId}:proto`;\n const gate = createReadyGate(\n () => this.#scales.ready(),\n (error) => input.onError?.(publicationHandlerErrorContext(channel, error)),\n );\n return this.#realtime.connectProtoChannel({\n channel,\n schema: Proto.AssetBalanceSchema,\n onPublication: (data) => {\n gate.run(() => {\n const b = parse(this.#ledgerBalanceSchema, data);\n input.onEvent(b);\n });\n },\n onConnected: input.onOpen,\n onDisconnected: input.onClose,\n onError: input.onError,\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAmCA,IAAa,kBAAb,MAA6B;CACzB;CACA;CACA;CACA;CACA;CACA;CACA;CAEA,YACI,WACA,UACA,UACA,QACF;EACE,KAAKA,UAAU,aAAaC,mBAAyB,SAAS;EAC9D,KAAKC,YAAY;EACjB,KAAKC,YAAY;EACjB,KAAKC,UAAU;EACf,KAAKC,uBAAuB,0BAA0B;EACtD,KAAKC,gCAAgC,mCAAmC;EACxE,KAAKC,+BAA+B,kCAAkC,MAAM;CAChF;;;;CAKA,MAAM,KACF,QAA4B,CAAC,GAC7B,SACwB;EACxB,MAAM,KAAKH,QAAQ,MAAM;EACzB,MAAM,WAAW,0BAA0B,OAAO,KAAKD,SAAS;EAChE,MAAM,YAAY,MAAM,yBAAyB,QAAQ;EACzD,MAAM,MAAM,MAAM,KAAKH,QAAQ,YAC3B,EACI,cAAc,2BAA2B,UAAU,OAAO,EAC9D,GACA,qBAAqB,OAAO,CAChC;EACA,OAAO,MAAM,EAAE,MAAM,KAAKK,oBAAoB,GAAG,IAAI,QAAQ;CACjE;;;;CAKA,MAAM,kBACF,OACA,SAC+B;EAC/B,MAAM,KAAKD,QAAQ,MAAM;EACzB,MAAM,WAAW,0BAA0B,OAAO,KAAKD,SAAS;EAChE,MAAM,YAAY,MAAM,2BAA2B,QAAQ;EAC3D,MAAM,MAAM,MAAM,KAAKH,QAAQ,kBAAkB,WAAW,qBAAqB,OAAO,CAAC;EACzF,OAAO,MAAM,KAAKM,+BAA+B,GAAG;CACxD;;;;CAKA,MAAM,iBACF,OACA,SAC8B;EAC9B,MAAM,KAAKF,QAAQ,MAAM;EACzB,MAAM,WAAW,0BAA0B,OAAO,KAAKD,SAAS;EAChE,MAAM,YAAY,MAAM,0BAA0B,QAAQ;EAC1D,MAAM,MAAM,MAAM,KAAKH,QAAQ,uBAC3B,WACA,qBAAqB,OAAO,CAChC;EACA,OAAO,MAAM,KAAKO,8BAA8B,GAAG;CACvD;;;;CAKA,UAAU,OAA2C;EACjD,MAAM,UAAU,2BAA2B,MAAM,UAAU;EAC3D,MAAM,OAAO,sBACH,KAAKH,QAAQ,MAAM,IACxB,UAAU,MAAM,UAAU,+BAA+B,SAAS,KAAK,CAAC,CAC7E;EACA,OAAO,KAAKF,UAAU,oBAAoB;GACtC;GACA,QAAQM;GACR,gBAAgB,SAAS;IACrB,KAAK,UAAU;KACX,MAAM,IAAI,MAAM,KAAKH,sBAAsB,IAAI;KAC/C,MAAM,QAAQ,CAAC;IACnB,CAAC;GACL;GACA,aAAa,MAAM;GACnB,gBAAgB,MAAM;GACtB,SAAS,MAAM;EACnB,CAAC;CACL;AACJ"}
@@ -55,7 +55,7 @@ declare const EquityGroupBySchema: v.PicklistSchema<readonly ["account", "asset"
55
55
  type EquityGroupBy = v.InferOutput<typeof EquityGroupBySchema>;
56
56
  declare const BalanceHistoryInputSchema: v.SchemaWithPipe<readonly [v.StrictObjectSchema<{
57
57
  readonly range: v.SchemaWithPipe<readonly [v.PicklistSchema<readonly ["1d", "7d", "30d", "90d", "180d", "365d"], undefined>, v.TransformAction<"1d" | "7d" | "30d" | "90d" | "180d" | "365d", BalanceRange$1.DAY_1 | BalanceRange$1.DAY_7 | BalanceRange$1.DAY_30 | BalanceRange$1.DAY_90 | BalanceRange$1.DAY_180 | BalanceRange$1.DAY_365>]>;
58
- readonly ledger: v.OptionalSchema<v.NumberSchema<undefined>, 0>;
58
+ readonly ledger: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>, v.MaxValueAction<number, 4294967295, undefined>]>, 0>;
59
59
  readonly accountCodes: v.OptionalSchema<v.ArraySchema<v.SchemaWithPipe<readonly [v.PicklistSchema<readonly ["funding", "trading"], undefined>, v.TransformAction<"funding" | "trading", AccountCode.FUNDING | AccountCode.TRADING>]>, undefined>, readonly []>;
60
60
  readonly account: v.OptionalSchema<v.UnionSchema<[v.PicklistSchema<["active", "main"], undefined>, v.StrictObjectSchema<{
61
61
  readonly subaccountId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>]>;
@@ -1 +1 @@
1
- {"version":3,"file":"balances.schemas.d.ts","names":[],"sources":["../../../src/services/balances/balances.schemas.ts"],"mappings":";;;;;;;;;;;;;iBAuCgB,6BAAyB,EAAA,yBAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA+B7B,gBAAgB,EAAE,YAAY,kBAAkB;cAQ/C,oBAAkB,EAAA;KAEnB,eAAe,EAAE,mBAAmB;cAInC,qBAAmB,EAAA;KAEpB,gBAAgB,EAAE,mBAAmB;cAEpC,2BAAyB,EAAA,yBAAA,EAAA;;;;;;;;;;;;;;;;;;;;KAwB1B,sBAAsB,EAAE,kBAAkB;iBAQtC,sCAAkC,EAAA,yBAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA0CtC,yBAAyB,EAAE,YACnC,kBAAkB;cAGT,0BAAwB,EAAA,yBAAA,EAAA;;;;;;;;;;;;;;;;;;;;KA2BzB,qBAAqB,EAAE,kBAAkB;KAmBzC;EAEF;EACA,aAAa,YAAY;EACzB;;EAGA;EACA;EACA;;cAGG,oBAAkB,EAAA,yBAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKO,UAAA;EAA8B;;iBA6BpD,kCAAkC,QAAQ,YAAS,EAAA,yBAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA7B7B,UAAA;IAA8B;;;;;;;;;;;IAA9B,UAAA;IAA8B;;;;;;;;;;;IAA9B,UAAA;IAA8B;;;;KAiExD,eAAe,EAAE,mBAAmB;KACpC,wBAAwB,EAAE,YAClC,kBAAkB"}
1
+ {"version":3,"file":"balances.schemas.d.ts","names":[],"sources":["../../../src/services/balances/balances.schemas.ts"],"mappings":";;;;;;;;;;;;;iBAuCgB,6BAAyB,EAAA,yBAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA+B7B,gBAAgB,EAAE,YAAY,kBAAkB;cAQ/C,oBAAkB,EAAA;KAEnB,eAAe,EAAE,mBAAmB;cAInC,qBAAmB,EAAA;KAEpB,gBAAgB,EAAE,mBAAmB;cAEpC,2BAAyB,EAAA,yBAAA,EAAA;;;;;;;;;;;;;;;;;;;;KA2B1B,sBAAsB,EAAE,kBAAkB;iBAQtC,sCAAkC,EAAA,yBAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA0CtC,yBAAyB,EAAE,YACnC,kBAAkB;cAGT,0BAAwB,EAAA,yBAAA,EAAA;;;;;;;;;;;;;;;;;;;;KA2BzB,qBAAqB,EAAE,kBAAkB;KAmBzC;EAEF;EACA,aAAa,YAAY;EACzB;;EAGA;EACA;EACA;;cAGG,oBAAkB,EAAA,yBAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKO,UAAA;EAA8B;;iBA6BpD,kCAAkC,QAAQ,YAAS,EAAA,yBAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA7B7B,UAAA;IAA8B;;;;;;;;;;;IAA9B,UAAA;IAA8B;;;;;;;;;;;IAA9B,UAAA;IAA8B;;;;KAiExD,eAAe,EAAE,mBAAmB;KACpC,wBAAwB,EAAE,YAClC,kBAAkB"}
@@ -62,7 +62,7 @@ const EquityGroupBySchema = v.picklist(EQUITY_GROUP_BYS);
62
62
  const BalanceHistoryInputSchema = v.pipe(v.strictObject({
63
63
  ...AccountScopeInputEntries,
64
64
  range: v.pipe(BalanceRangeSchema, v.transform((v) => BalanceRangeCodec.inputToProto[v])),
65
- ledger: v.optional(v.number(), 0),
65
+ ledger: v.optional(v.pipe(v.number(), v.integer(), v.minValue(0), v.maxValue(4294967295)), 0),
66
66
  accountCodes: v.optional(v.array(v.pipe(v.picklist(ACCOUNT_CODE_VALUES), v.transform((value) => AccountCodeCodec.inputToProto[value]))), [])
67
67
  }), v.transform(({ account, ...input }) => ({
68
68
  ...input,
@@ -1 +1 @@
1
- {"version":3,"file":"balances.schemas.js","names":["Proto.BalanceRange"],"sources":["../../../src/services/balances/balances.schemas.ts"],"sourcesContent":["import * as v from \"valibot\";\nimport { fromU128 } from \"../../utils/u128.js\";\nimport { requiredEnumLabel } from \"../../shared/proto-enum-codec.js\";\nimport type { DecodedEnum } from \"../../utils/types.js\";\nimport * as Proto from \"../../gen/ledger/read/v1/ledger_read_pb.js\";\nimport {\n AccountCodeCodec,\n ACCOUNT_CODE_VALUES,\n type AccountCodeValue,\n} from \"../../shared/ledger-codes.js\";\nimport { E18_SCALE, scaledToDecimalOutput, type SdkScales } from \"../../shared/decimal-surface.js\";\nimport { BalanceRangeCodec, EquityGroupByCodec } from \"./balances.codecs.js\";\nimport {\n AccountScopeInputEntries,\n accountScopeToSubaccountId,\n} from \"../../shared/account-scope.js\";\n\n/**\n * Equity history values are quoted in the response's quote currency at a fixed\n * 4-decimal wire scale (proto: \"Equity in quote currency scaled by 1e4\").\n */\nconst EQUITY_SCALE = 4;\n\n/**\n * Balance history buckets use a fixed 7-decimal scale (proto: \"balance in\n * asset units scaled by 1e7\"), unlike live ledger balances which use E18.\n */\nconst BALANCE_HISTORY_SCALE = 7;\n\nconst U128Schema = v.object({\n hi: v.bigint(),\n lo: v.bigint(),\n});\n\n/**\n * AssetBalance u128 fields on the ledger wire are always 18-decimal scaled\n * (PolyesterChain base units), independent of per-asset quantityScale used\n * elsewhere for order quantities and transfer inputs.\n */\nexport function createLedgerBalanceSchema() {\n return v.pipe(\n v.object({\n assetId: v.number(),\n trading: v.pipe(v.optional(U128Schema), v.transform(fromU128)),\n funding: v.pipe(v.optional(U128Schema), v.transform(fromU128)),\n reserved: v.pipe(v.optional(U128Schema), v.transform(fromU128)),\n available: v.pipe(v.optional(U128Schema), v.transform(fromU128)),\n tradingRevision: v.pipe(\n v.optional(v.bigint(), 0n),\n v.transform((value) => value.toString()),\n ),\n fundingRevision: v.pipe(\n v.optional(v.bigint(), 0n),\n v.transform((value) => value.toString()),\n ),\n }),\n v.transform((b) => {\n return {\n assetId: b.assetId,\n funding: scaledToDecimalOutput(b.funding ?? 0n, E18_SCALE),\n trading: scaledToDecimalOutput(b.trading ?? 0n, E18_SCALE),\n reserved: scaledToDecimalOutput(b.reserved ?? 0n, E18_SCALE),\n available: scaledToDecimalOutput(b.available ?? 0n, E18_SCALE),\n tradingRevision: b.tradingRevision,\n fundingRevision: b.fundingRevision,\n };\n }),\n );\n}\n\nexport type LedgerBalance = v.InferOutput<ReturnType<typeof createLedgerBalanceSchema>>;\n\nexport const BalancesListInputSchema = v.strictObject(AccountScopeInputEntries);\n\nexport type BalancesListInput = v.InferInput<typeof BalancesListInputSchema>;\n\nexport const BALANCE_RANGES = [\"1d\", \"7d\", \"30d\", \"90d\", \"180d\", \"365d\"] as const;\n\nexport const BalanceRangeSchema = v.picklist(BALANCE_RANGES);\n\nexport type BalanceRange = v.InferOutput<typeof BalanceRangeSchema>;\n\nexport const EQUITY_GROUP_BYS = [\"account\", \"asset\"] as const;\n\nexport const EquityGroupBySchema = v.picklist(EQUITY_GROUP_BYS);\n\nexport type EquityGroupBy = v.InferOutput<typeof EquityGroupBySchema>;\n\nexport const BalanceHistoryInputSchema = v.pipe(\n v.strictObject({\n ...AccountScopeInputEntries,\n range: v.pipe(\n BalanceRangeSchema,\n v.transform((v) => BalanceRangeCodec.inputToProto[v]),\n ),\n ledger: v.optional(v.number(), 0),\n accountCodes: v.optional(\n v.array(\n v.pipe(\n v.picklist(ACCOUNT_CODE_VALUES),\n v.transform((value) => AccountCodeCodec.inputToProto[value]),\n ),\n ),\n [],\n ),\n }),\n v.transform(({ account, ...input }) => ({\n ...input,\n subaccountId: accountScopeToSubaccountId(account),\n })),\n);\n\nexport type BalanceHistoryInput = v.InferInput<typeof BalanceHistoryInputSchema>;\n\nconst BalanceSeriesSchema = v.object({\n assetId: v.number(),\n accountCode: v.enum(AccountCodeCodec.inputToProto),\n balanceQ: v.array(v.bigint()),\n});\n\nexport function createBalanceHistoryResponseSchema() {\n return v.pipe(\n v.object({\n range: v.pipe(\n v.enum(Proto.BalanceRange),\n v.transform((v) =>\n requiredEnumLabel(\n BalanceRangeCodec.protoToOutput,\n v,\n \"BalanceHistoryResponseSchema\",\n \"range\",\n ),\n ),\n ),\n bucket: v.string(),\n startTsSec: v.number(),\n endTsSec: v.number(),\n points: v.number(),\n series: v.array(BalanceSeriesSchema),\n }),\n v.transform((data) => ({\n range: data.range,\n bucket: data.bucket,\n startTsSec: data.startTsSec,\n endTsSec: data.endTsSec,\n points: data.points,\n series: data.series.map((s) => {\n return {\n assetId: s.assetId,\n accountCode: requiredEnumLabel(\n AccountCodeCodec.protoToOutput,\n s.accountCode,\n \"BalanceHistoryResponseSchema\",\n \"account code\",\n ),\n balance: s.balanceQ.map((b) => scaledToDecimalOutput(b, BALANCE_HISTORY_SCALE)),\n };\n }),\n })),\n );\n}\n\nexport type BalanceHistoryResponse = v.InferOutput<\n ReturnType<typeof createBalanceHistoryResponseSchema>\n>;\n\nexport const EquityHistoryInputSchema = v.pipe(\n v.strictObject({\n ...AccountScopeInputEntries,\n range: v.pipe(\n BalanceRangeSchema,\n v.transform((v) => BalanceRangeCodec.inputToProto[v]),\n ),\n accountCodes: v.optional(\n v.array(\n v.pipe(\n v.picklist(ACCOUNT_CODE_VALUES),\n v.transform((value) => AccountCodeCodec.inputToProto[value]),\n ),\n ),\n [],\n ),\n groupBy: v.pipe(\n v.optional(EquityGroupBySchema, \"account\"),\n v.transform((v) => EquityGroupByCodec.inputToProto[v ?? \"account\"]),\n ),\n }),\n v.transform(({ account, ...input }) => ({\n ...input,\n subaccountId: accountScopeToSubaccountId(account),\n })),\n);\n\nexport type EquityHistoryInput = v.InferInput<typeof EquityHistoryInputSchema>;\n\nconst EquitySeriesGroupingSchema = v.union([\n v.object({\n case: v.literal(\"account\"),\n value: v.object({\n accountCode: v.enum(AccountCodeCodec.inputToProto),\n name: v.string(),\n }),\n }),\n v.object({\n case: v.literal(\"asset\"),\n value: v.object({\n id: v.number(),\n symbol: v.string(),\n }),\n }),\n]);\n\nexport type EquitySeriesGrouping =\n | {\n type: \"account\";\n accountCode: DecodedEnum<AccountCodeValue>;\n name: string;\n }\n | {\n type: \"asset\";\n assetId: number;\n symbol: string;\n };\n\nexport const EquitySeriesSchema = v.pipe(\n v.object({\n grouping: EquitySeriesGroupingSchema,\n equityQ: v.array(v.bigint()),\n }),\n v.transform((series): { grouping: EquitySeriesGrouping; equity: string[] } => {\n const equity = series.equityQ.map((value) => scaledToDecimalOutput(value, EQUITY_SCALE));\n if (series.grouping.case === \"account\") {\n return {\n grouping: {\n type: \"account\",\n accountCode: requiredEnumLabel(\n AccountCodeCodec.protoToOutput,\n series.grouping.value.accountCode,\n \"EquitySeriesSchema\",\n \"account code\",\n ),\n name: series.grouping.value.name,\n },\n equity,\n };\n }\n\n return {\n grouping: {\n type: \"asset\",\n assetId: series.grouping.value.id,\n symbol: series.grouping.value.symbol,\n },\n equity,\n };\n }),\n);\n\nexport function createEquityHistoryResponseSchema(scales: SdkScales) {\n return v.pipe(\n v.object({\n range: v.pipe(\n v.enum(Proto.BalanceRange),\n v.transform((v) =>\n requiredEnumLabel(\n BalanceRangeCodec.protoToOutput,\n v,\n \"EquityHistoryResponseSchema\",\n \"range\",\n ),\n ),\n ),\n bucket: v.string(),\n startTsSec: v.number(),\n endTsSec: v.number(),\n quoteAsset: v.string(),\n points: v.number(),\n series: v.array(EquitySeriesSchema),\n btcPricesQ: v.optional(v.array(v.bigint()), []),\n }),\n v.transform((data) => ({\n range: data.range,\n bucket: data.bucket,\n startTsSec: data.startTsSec,\n endTsSec: data.endTsSec,\n quoteAsset: data.quoteAsset,\n points: data.points,\n series: data.series,\n // BTC price in USDT at each timestamp, carried as price ticks on the wire.\n btcPrices: data.btcPricesQ.map((value) => scaledToDecimalOutput(value, scales.price())),\n })),\n );\n}\n\nexport type EquitySeries = v.InferOutput<typeof EquitySeriesSchema>;\nexport type EquityHistoryResponse = v.InferOutput<\n ReturnType<typeof createEquityHistoryResponseSchema>\n>;\n"],"mappings":"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"}
1
+ {"version":3,"file":"balances.schemas.js","names":["Proto.BalanceRange"],"sources":["../../../src/services/balances/balances.schemas.ts"],"sourcesContent":["import * as v from \"valibot\";\nimport { fromU128 } from \"../../utils/u128.js\";\nimport { requiredEnumLabel } from \"../../shared/proto-enum-codec.js\";\nimport type { DecodedEnum } from \"../../utils/types.js\";\nimport * as Proto from \"../../gen/ledger/read/v1/ledger_read_pb.js\";\nimport {\n AccountCodeCodec,\n ACCOUNT_CODE_VALUES,\n type AccountCodeValue,\n} from \"../../shared/ledger-codes.js\";\nimport { E18_SCALE, scaledToDecimalOutput, type SdkScales } from \"../../shared/decimal-surface.js\";\nimport { BalanceRangeCodec, EquityGroupByCodec } from \"./balances.codecs.js\";\nimport {\n AccountScopeInputEntries,\n accountScopeToSubaccountId,\n} from \"../../shared/account-scope.js\";\n\n/**\n * Equity history values are quoted in the response's quote currency at a fixed\n * 4-decimal wire scale (proto: \"Equity in quote currency scaled by 1e4\").\n */\nconst EQUITY_SCALE = 4;\n\n/**\n * Balance history buckets use a fixed 7-decimal scale (proto: \"balance in\n * asset units scaled by 1e7\"), unlike live ledger balances which use E18.\n */\nconst BALANCE_HISTORY_SCALE = 7;\n\nconst U128Schema = v.object({\n hi: v.bigint(),\n lo: v.bigint(),\n});\n\n/**\n * AssetBalance u128 fields on the ledger wire are always 18-decimal scaled\n * (PolyesterChain base units), independent of per-asset quantityScale used\n * elsewhere for order quantities and transfer inputs.\n */\nexport function createLedgerBalanceSchema() {\n return v.pipe(\n v.object({\n assetId: v.number(),\n trading: v.pipe(v.optional(U128Schema), v.transform(fromU128)),\n funding: v.pipe(v.optional(U128Schema), v.transform(fromU128)),\n reserved: v.pipe(v.optional(U128Schema), v.transform(fromU128)),\n available: v.pipe(v.optional(U128Schema), v.transform(fromU128)),\n tradingRevision: v.pipe(\n v.optional(v.bigint(), 0n),\n v.transform((value) => value.toString()),\n ),\n fundingRevision: v.pipe(\n v.optional(v.bigint(), 0n),\n v.transform((value) => value.toString()),\n ),\n }),\n v.transform((b) => {\n return {\n assetId: b.assetId,\n funding: scaledToDecimalOutput(b.funding ?? 0n, E18_SCALE),\n trading: scaledToDecimalOutput(b.trading ?? 0n, E18_SCALE),\n reserved: scaledToDecimalOutput(b.reserved ?? 0n, E18_SCALE),\n available: scaledToDecimalOutput(b.available ?? 0n, E18_SCALE),\n tradingRevision: b.tradingRevision,\n fundingRevision: b.fundingRevision,\n };\n }),\n );\n}\n\nexport type LedgerBalance = v.InferOutput<ReturnType<typeof createLedgerBalanceSchema>>;\n\nexport const BalancesListInputSchema = v.strictObject(AccountScopeInputEntries);\n\nexport type BalancesListInput = v.InferInput<typeof BalancesListInputSchema>;\n\nexport const BALANCE_RANGES = [\"1d\", \"7d\", \"30d\", \"90d\", \"180d\", \"365d\"] as const;\n\nexport const BalanceRangeSchema = v.picklist(BALANCE_RANGES);\n\nexport type BalanceRange = v.InferOutput<typeof BalanceRangeSchema>;\n\nexport const EQUITY_GROUP_BYS = [\"account\", \"asset\"] as const;\n\nexport const EquityGroupBySchema = v.picklist(EQUITY_GROUP_BYS);\n\nexport type EquityGroupBy = v.InferOutput<typeof EquityGroupBySchema>;\n\nexport const BalanceHistoryInputSchema = v.pipe(\n v.strictObject({\n ...AccountScopeInputEntries,\n range: v.pipe(\n BalanceRangeSchema,\n v.transform((v) => BalanceRangeCodec.inputToProto[v]),\n ),\n ledger: v.optional(\n v.pipe(v.number(), v.integer(), v.minValue(0), v.maxValue(4_294_967_295)),\n 0,\n ),\n accountCodes: v.optional(\n v.array(\n v.pipe(\n v.picklist(ACCOUNT_CODE_VALUES),\n v.transform((value) => AccountCodeCodec.inputToProto[value]),\n ),\n ),\n [],\n ),\n }),\n v.transform(({ account, ...input }) => ({\n ...input,\n subaccountId: accountScopeToSubaccountId(account),\n })),\n);\n\nexport type BalanceHistoryInput = v.InferInput<typeof BalanceHistoryInputSchema>;\n\nconst BalanceSeriesSchema = v.object({\n assetId: v.number(),\n accountCode: v.enum(AccountCodeCodec.inputToProto),\n balanceQ: v.array(v.bigint()),\n});\n\nexport function createBalanceHistoryResponseSchema() {\n return v.pipe(\n v.object({\n range: v.pipe(\n v.enum(Proto.BalanceRange),\n v.transform((v) =>\n requiredEnumLabel(\n BalanceRangeCodec.protoToOutput,\n v,\n \"BalanceHistoryResponseSchema\",\n \"range\",\n ),\n ),\n ),\n bucket: v.string(),\n startTsSec: v.number(),\n endTsSec: v.number(),\n points: v.number(),\n series: v.array(BalanceSeriesSchema),\n }),\n v.transform((data) => ({\n range: data.range,\n bucket: data.bucket,\n startTsSec: data.startTsSec,\n endTsSec: data.endTsSec,\n points: data.points,\n series: data.series.map((s) => {\n return {\n assetId: s.assetId,\n accountCode: requiredEnumLabel(\n AccountCodeCodec.protoToOutput,\n s.accountCode,\n \"BalanceHistoryResponseSchema\",\n \"account code\",\n ),\n balance: s.balanceQ.map((b) => scaledToDecimalOutput(b, BALANCE_HISTORY_SCALE)),\n };\n }),\n })),\n );\n}\n\nexport type BalanceHistoryResponse = v.InferOutput<\n ReturnType<typeof createBalanceHistoryResponseSchema>\n>;\n\nexport const EquityHistoryInputSchema = v.pipe(\n v.strictObject({\n ...AccountScopeInputEntries,\n range: v.pipe(\n BalanceRangeSchema,\n v.transform((v) => BalanceRangeCodec.inputToProto[v]),\n ),\n accountCodes: v.optional(\n v.array(\n v.pipe(\n v.picklist(ACCOUNT_CODE_VALUES),\n v.transform((value) => AccountCodeCodec.inputToProto[value]),\n ),\n ),\n [],\n ),\n groupBy: v.pipe(\n v.optional(EquityGroupBySchema, \"account\"),\n v.transform((v) => EquityGroupByCodec.inputToProto[v ?? \"account\"]),\n ),\n }),\n v.transform(({ account, ...input }) => ({\n ...input,\n subaccountId: accountScopeToSubaccountId(account),\n })),\n);\n\nexport type EquityHistoryInput = v.InferInput<typeof EquityHistoryInputSchema>;\n\nconst EquitySeriesGroupingSchema = v.union([\n v.object({\n case: v.literal(\"account\"),\n value: v.object({\n accountCode: v.enum(AccountCodeCodec.inputToProto),\n name: v.string(),\n }),\n }),\n v.object({\n case: v.literal(\"asset\"),\n value: v.object({\n id: v.number(),\n symbol: v.string(),\n }),\n }),\n]);\n\nexport type EquitySeriesGrouping =\n | {\n type: \"account\";\n accountCode: DecodedEnum<AccountCodeValue>;\n name: string;\n }\n | {\n type: \"asset\";\n assetId: number;\n symbol: string;\n };\n\nexport const EquitySeriesSchema = v.pipe(\n v.object({\n grouping: EquitySeriesGroupingSchema,\n equityQ: v.array(v.bigint()),\n }),\n v.transform((series): { grouping: EquitySeriesGrouping; equity: string[] } => {\n const equity = series.equityQ.map((value) => scaledToDecimalOutput(value, EQUITY_SCALE));\n if (series.grouping.case === \"account\") {\n return {\n grouping: {\n type: \"account\",\n accountCode: requiredEnumLabel(\n AccountCodeCodec.protoToOutput,\n series.grouping.value.accountCode,\n \"EquitySeriesSchema\",\n \"account code\",\n ),\n name: series.grouping.value.name,\n },\n equity,\n };\n }\n\n return {\n grouping: {\n type: \"asset\",\n assetId: series.grouping.value.id,\n symbol: series.grouping.value.symbol,\n },\n equity,\n };\n }),\n);\n\nexport function createEquityHistoryResponseSchema(scales: SdkScales) {\n return v.pipe(\n v.object({\n range: v.pipe(\n v.enum(Proto.BalanceRange),\n v.transform((v) =>\n requiredEnumLabel(\n BalanceRangeCodec.protoToOutput,\n v,\n \"EquityHistoryResponseSchema\",\n \"range\",\n ),\n ),\n ),\n bucket: v.string(),\n startTsSec: v.number(),\n endTsSec: v.number(),\n quoteAsset: v.string(),\n points: v.number(),\n series: v.array(EquitySeriesSchema),\n btcPricesQ: v.optional(v.array(v.bigint()), []),\n }),\n v.transform((data) => ({\n range: data.range,\n bucket: data.bucket,\n startTsSec: data.startTsSec,\n endTsSec: data.endTsSec,\n quoteAsset: data.quoteAsset,\n points: data.points,\n series: data.series,\n // BTC price in USDT at each timestamp, carried as price ticks on the wire.\n btcPrices: data.btcPricesQ.map((value) => scaledToDecimalOutput(value, scales.price())),\n })),\n );\n}\n\nexport type EquitySeries = v.InferOutput<typeof EquitySeriesSchema>;\nexport type EquityHistoryResponse = v.InferOutput<\n ReturnType<typeof createEquityHistoryResponseSchema>\n>;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"candles.d.ts","names":[],"sources":["../../../src/services/candles/candles.ts"],"mappings":";;;;;;;UA6BU,8BAA8B,mBAAmB;EACvD;EACA,WAAW;;UAGL,kCAAkC,mBAAmB;EAC3D;EACA,WAAW;;;;;cAWF;;EASG,YAAA,WAAW,WAAW,UAAU,mBAAmB,QAAQ;;;;EAajE,KAAK,OAAO,iBAAiB,UAAU,0BAA0B,QAAQ;;;;EAiBzE,aACF,OAAO,wBACP,UAAU,0BACX,QAAQ;;;;EAaL,iBACF,OAAO,wBACP,UAAU,0BACX,QAAQ;;;;EAaX,UAAU,OAAO;;;;EAOjB,cAAc,OAAO"}
1
+ {"version":3,"file":"candles.d.ts","names":[],"sources":["../../../src/services/candles/candles.ts"],"mappings":";;;;;;;UA8BU,8BAA8B,mBAAmB;EACvD;EACA,WAAW;;UAGL,kCAAkC,mBAAmB;EAC3D;EACA,WAAW;;;;;cAWF;;EASG,YAAA,WAAW,WAAW,UAAU,mBAAmB,QAAQ;;;;EAajE,KAAK,OAAO,iBAAiB,UAAU,0BAA0B,QAAQ;;;;EAiBzE,aACF,OAAO,wBACP,UAAU,0BACX,QAAQ;;;;EAaL,iBACF,OAAO,wBACP,UAAU,0BACX,QAAQ;;;;EAaX,UAAU,OAAO;;;;EAOjB,cAAc,OAAO"}
@@ -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 { CandlePointSchema, MarketDataService } from "../../gen/marketdata/v1/marketdata_pb.js";
@@ -35,10 +36,10 @@ var CandlesService = class {
35
36
  * Returns OHLCV candles for a symbol/timeframe request, mapped into row objects with symbol id and timeframe. The proto response is newest-first and may include incomplete/reference data depending on input flags.
36
37
  */
37
38
  async list(input, options) {
38
- const validatedInput = v.parse(ListCandlesInputSchema, input);
39
+ const validatedInput = parse(ListCandlesInputSchema, input);
39
40
  await this.#scales.ready();
40
41
  const res = await this.#client.getCandles(validatedInput, toConnectCallOptions(options));
41
- return v.parse(v.optional(v.array(CandlePointSchema$1), []), res.candles).map((c) => v.parse(this.#rowSchema, {
42
+ return parse(v.optional(v.array(CandlePointSchema$1), []), res.candles).map((c) => parse(this.#rowSchema, {
42
43
  ...c,
43
44
  symbolId: res.symbolId,
44
45
  timeframe: res.timeframe
@@ -48,19 +49,19 @@ var CandlesService = class {
48
49
  * Returns candle data in chart-friendly column arrays ordered oldest-first by bucket start time. This preserves decimal-string SDK formatting from the columnar schema.
49
50
  */
50
51
  async listColumnar(input, options) {
51
- const validatedInput = v.parse(ListCandlesInputSchema, input);
52
+ const validatedInput = parse(ListCandlesInputSchema, input);
52
53
  await this.#scales.ready();
53
54
  const res = await this.#client.getCandlesColumns(validatedInput, toConnectCallOptions(options));
54
- return v.parse(this.#columnarSchema, res);
55
+ return parse(this.#columnarSchema, res);
55
56
  }
56
57
  /**
57
58
  * Returns the same columnar candle series keyed by numeric bucket-start seconds (`tsSec`) instead of `time`.
58
59
  */
59
60
  async listColumnarInts(input, options) {
60
- const validatedInput = v.parse(ListCandlesInputSchema, input);
61
+ const validatedInput = parse(ListCandlesInputSchema, input);
61
62
  await this.#scales.ready();
62
63
  const res = await this.#client.getCandlesColumns(validatedInput, toConnectCallOptions(options));
63
- return v.parse(this.#columnarIntSchema, res);
64
+ return parse(this.#columnarIntSchema, res);
64
65
  }
65
66
  /**
66
67
  * Subscribes to live candle updates on public:spot:market:candles:{timeframe}:{symbolId}:proto and emits row-form candles.
@@ -75,7 +76,7 @@ var CandlesService = class {
75
76
  return this.#subscribeWithSchema(input, this.#rowIntSchema);
76
77
  }
77
78
  #subscribeWithSchema(input, schema) {
78
- const params = v.parse(SubscribeCandlesParamsSchema, {
79
+ const params = parse(SubscribeCandlesParamsSchema, {
79
80
  symbolId: input.symbolId,
80
81
  timeframe: input.timeframe
81
82
  });
@@ -87,8 +88,8 @@ var CandlesService = class {
87
88
  schema: CandlePointSchema,
88
89
  onPublication: (data) => {
89
90
  gate.run(() => {
90
- const point = v.parse(CandlePointSchema$1, data);
91
- const candle = v.parse(schema, {
91
+ const point = parse(CandlePointSchema$1, data);
92
+ const candle = parse(schema, {
92
93
  ...point,
93
94
  symbolId: params.symbolId,
94
95
  timeframe: protoTimeframe
@@ -1 +1 @@
1
- {"version":3,"file":"candles.js","names":["#client","Proto.MarketDataService","#realtime","#scales","#rowSchema","#rowIntSchema","#columnarSchema","#columnarIntSchema","CandlePointSchema","#subscribeWithSchema","Proto.CandlePointSchema"],"sources":["../../../src/services/candles/candles.ts"],"sourcesContent":["import { createClient, type Client, type Transport } from \"@connectrpc/connect\";\nimport { publicationHandlerErrorContext } from \"../../shared/subscription-errors.js\";\nimport * as Proto from \"../../gen/marketdata/v1/marketdata_pb.js\";\nimport * as v from \"valibot\";\nimport type { PolyesterRealtime } from \"../../realtime/types.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 type CandleColumnar,\n createCandleRowSchema,\n createCandleRowIntSchema,\n createCandleColumnarSchema,\n createCandleColumnarIntSchema,\n CandlePointSchema,\n TimeframeSchema,\n type Candle,\n type CandleInt,\n type Timeframe,\n type CandleColumnarInt,\n type GetCandlesInput,\n type GetCandlesColumnsInput,\n ListCandlesInputSchema,\n} from \"./candles.schemas.js\";\nimport { TimeframeCodec } from \"./candles.codecs.js\";\n\ninterface SubscribeCandlesInput extends BaseSubscribeInput<Candle> {\n symbolId: number;\n timeframe: Timeframe;\n}\n\ninterface SubscribeCandlesIntsInput extends BaseSubscribeInput<CandleInt> {\n symbolId: number;\n timeframe: Timeframe;\n}\n\nconst SubscribeCandlesParamsSchema = v.object({\n symbolId: v.pipe(v.number(), v.integer(), v.gtValue(0)),\n timeframe: TimeframeSchema,\n});\n\n/**\n * Reads and streams public spot OHLCV candle data in row and columnar formats.\n */\nexport class CandlesService {\n #client: Client<typeof Proto.MarketDataService>;\n #realtime: PolyesterRealtime;\n #scales: SdkScales;\n #rowSchema: ReturnType<typeof createCandleRowSchema>;\n #rowIntSchema: ReturnType<typeof createCandleRowIntSchema>;\n #columnarSchema: ReturnType<typeof createCandleColumnarSchema>;\n #columnarIntSchema: ReturnType<typeof createCandleColumnarIntSchema>;\n\n constructor(transport: Transport, realtime: PolyesterRealtime, scales: SdkScales) {\n this.#client = createClient(Proto.MarketDataService, transport);\n this.#realtime = realtime;\n this.#scales = scales;\n this.#rowSchema = createCandleRowSchema(scales);\n this.#rowIntSchema = createCandleRowIntSchema(scales);\n this.#columnarSchema = createCandleColumnarSchema(scales);\n this.#columnarIntSchema = createCandleColumnarIntSchema(scales);\n }\n\n /**\n * Returns OHLCV candles for a symbol/timeframe request, mapped into row objects with symbol id and timeframe. The proto response is newest-first and may include incomplete/reference data depending on input flags.\n */\n async list(input: GetCandlesInput, options?: PolyesterRequestOptions): Promise<Candle[]> {\n const validatedInput = v.parse(ListCandlesInputSchema, input);\n await this.#scales.ready();\n const res = await this.#client.getCandles(validatedInput, toConnectCallOptions(options));\n const candles = v.parse(v.optional(v.array(CandlePointSchema), []), res.candles);\n return candles.map((c) =>\n v.parse(this.#rowSchema, {\n ...c,\n symbolId: res.symbolId,\n timeframe: res.timeframe,\n }),\n );\n }\n\n /**\n * Returns candle data in chart-friendly column arrays ordered oldest-first by bucket start time. This preserves decimal-string SDK formatting from the columnar schema.\n */\n async listColumnar(\n input: GetCandlesColumnsInput,\n options?: PolyesterRequestOptions,\n ): Promise<CandleColumnar> {\n const validatedInput = v.parse(ListCandlesInputSchema, input);\n await this.#scales.ready();\n const res = await this.#client.getCandlesColumns(\n validatedInput,\n toConnectCallOptions(options),\n );\n return v.parse(this.#columnarSchema, res);\n }\n\n /**\n * Returns the same columnar candle series keyed by numeric bucket-start seconds (`tsSec`) instead of `time`.\n */\n async listColumnarInts(\n input: GetCandlesColumnsInput,\n options?: PolyesterRequestOptions,\n ): Promise<CandleColumnarInt> {\n const validatedInput = v.parse(ListCandlesInputSchema, input);\n await this.#scales.ready();\n const res = await this.#client.getCandlesColumns(\n validatedInput,\n toConnectCallOptions(options),\n );\n return v.parse(this.#columnarIntSchema, res);\n }\n\n /**\n * Subscribes to live candle updates on public:spot:market:candles:{timeframe}:{symbolId}:proto and emits row-form candles.\n */\n subscribe(input: SubscribeCandlesInput): () => void {\n return this.#subscribeWithSchema(input, this.#rowSchema);\n }\n\n /**\n * Subscribes to the same live candle channel as subscribe and emits row candles parsed through the row-int schema.\n */\n subscribeInts(input: SubscribeCandlesIntsInput): () => void {\n return this.#subscribeWithSchema(input, this.#rowIntSchema);\n }\n\n #subscribeWithSchema(\n input: SubscribeCandlesInput | SubscribeCandlesIntsInput,\n schema: ReturnType<typeof createCandleRowSchema>,\n ): () => void {\n const params = v.parse(SubscribeCandlesParamsSchema, {\n symbolId: input.symbolId,\n timeframe: input.timeframe,\n });\n const protoTimeframe = TimeframeCodec.inputToProto[params.timeframe];\n const channel = `public:spot:market:candles:${params.timeframe}:${params.symbolId}:proto`;\n const gate = createReadyGate(\n () => this.#scales.ready(),\n (error) => input.onError?.(publicationHandlerErrorContext(channel, error)),\n );\n return this.#realtime.connectProtoChannel({\n channel,\n schema: Proto.CandlePointSchema,\n onPublication: (data) => {\n gate.run(() => {\n const point = v.parse(CandlePointSchema, data);\n const candle = v.parse(schema, {\n ...point,\n symbolId: params.symbolId,\n timeframe: protoTimeframe,\n });\n input.onEvent(candle);\n });\n },\n onConnected: input.onOpen,\n onDisconnected: input.onClose,\n onError: input.onError,\n });\n }\n}\n"],"mappings":";;;;;;;;;AAuCA,MAAM,+BAA+B,EAAE,OAAO;CAC1C,UAAU,EAAE,KAAK,EAAE,OAAO,GAAG,EAAE,QAAQ,GAAG,EAAE,QAAQ,CAAC,CAAC;CACtD,WAAW;AACf,CAAC;;;;AAKD,IAAa,iBAAb,MAA4B;CACxB;CACA;CACA;CACA;CACA;CACA;CACA;CAEA,YAAY,WAAsB,UAA6B,QAAmB;EAC9E,KAAKA,UAAU,aAAaC,mBAAyB,SAAS;EAC9D,KAAKC,YAAY;EACjB,KAAKC,UAAU;EACf,KAAKC,aAAa,sBAAsB,MAAM;EAC9C,KAAKC,gBAAgB,yBAAyB,MAAM;EACpD,KAAKC,kBAAkB,2BAA2B,MAAM;EACxD,KAAKC,qBAAqB,8BAA8B,MAAM;CAClE;;;;CAKA,MAAM,KAAK,OAAwB,SAAsD;EACrF,MAAM,iBAAiB,EAAE,MAAM,wBAAwB,KAAK;EAC5D,MAAM,KAAKJ,QAAQ,MAAM;EACzB,MAAM,MAAM,MAAM,KAAKH,QAAQ,WAAW,gBAAgB,qBAAqB,OAAO,CAAC;EAEvF,OADgB,EAAE,MAAM,EAAE,SAAS,EAAE,MAAMQ,mBAAiB,GAAG,CAAC,CAAC,GAAG,IAAI,OAC3D,CAAC,CAAC,KAAK,MAChB,EAAE,MAAM,KAAKJ,YAAY;GACrB,GAAG;GACH,UAAU,IAAI;GACd,WAAW,IAAI;EACnB,CAAC,CACL;CACJ;;;;CAKA,MAAM,aACF,OACA,SACuB;EACvB,MAAM,iBAAiB,EAAE,MAAM,wBAAwB,KAAK;EAC5D,MAAM,KAAKD,QAAQ,MAAM;EACzB,MAAM,MAAM,MAAM,KAAKH,QAAQ,kBAC3B,gBACA,qBAAqB,OAAO,CAChC;EACA,OAAO,EAAE,MAAM,KAAKM,iBAAiB,GAAG;CAC5C;;;;CAKA,MAAM,iBACF,OACA,SAC0B;EAC1B,MAAM,iBAAiB,EAAE,MAAM,wBAAwB,KAAK;EAC5D,MAAM,KAAKH,QAAQ,MAAM;EACzB,MAAM,MAAM,MAAM,KAAKH,QAAQ,kBAC3B,gBACA,qBAAqB,OAAO,CAChC;EACA,OAAO,EAAE,MAAM,KAAKO,oBAAoB,GAAG;CAC/C;;;;CAKA,UAAU,OAA0C;EAChD,OAAO,KAAKE,qBAAqB,OAAO,KAAKL,UAAU;CAC3D;;;;CAKA,cAAc,OAA8C;EACxD,OAAO,KAAKK,qBAAqB,OAAO,KAAKJ,aAAa;CAC9D;CAEA,qBACI,OACA,QACU;EACV,MAAM,SAAS,EAAE,MAAM,8BAA8B;GACjD,UAAU,MAAM;GAChB,WAAW,MAAM;EACrB,CAAC;EACD,MAAM,iBAAiB,eAAe,aAAa,OAAO;EAC1D,MAAM,UAAU,8BAA8B,OAAO,UAAU,GAAG,OAAO,SAAS;EAClF,MAAM,OAAO,sBACH,KAAKF,QAAQ,MAAM,IACxB,UAAU,MAAM,UAAU,+BAA+B,SAAS,KAAK,CAAC,CAC7E;EACA,OAAO,KAAKD,UAAU,oBAAoB;GACtC;GACA,QAAQQ;GACR,gBAAgB,SAAS;IACrB,KAAK,UAAU;KACX,MAAM,QAAQ,EAAE,MAAMF,qBAAmB,IAAI;KAC7C,MAAM,SAAS,EAAE,MAAM,QAAQ;MAC3B,GAAG;MACH,UAAU,OAAO;MACjB,WAAW;KACf,CAAC;KACD,MAAM,QAAQ,MAAM;IACxB,CAAC;GACL;GACA,aAAa,MAAM;GACnB,gBAAgB,MAAM;GACtB,SAAS,MAAM;EACnB,CAAC;CACL;AACJ"}
1
+ {"version":3,"file":"candles.js","names":["#client","Proto.MarketDataService","#realtime","#scales","#rowSchema","#rowIntSchema","#columnarSchema","#columnarIntSchema","CandlePointSchema","#subscribeWithSchema","Proto.CandlePointSchema"],"sources":["../../../src/services/candles/candles.ts"],"sourcesContent":["import { createClient, type Client, type Transport } from \"@connectrpc/connect\";\nimport { publicationHandlerErrorContext } from \"../../shared/subscription-errors.js\";\nimport * as Proto from \"../../gen/marketdata/v1/marketdata_pb.js\";\nimport * as v from \"valibot\";\nimport { parse } from \"../../shared/validation.js\";\nimport type { PolyesterRealtime } from \"../../realtime/types.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 type CandleColumnar,\n createCandleRowSchema,\n createCandleRowIntSchema,\n createCandleColumnarSchema,\n createCandleColumnarIntSchema,\n CandlePointSchema,\n TimeframeSchema,\n type Candle,\n type CandleInt,\n type Timeframe,\n type CandleColumnarInt,\n type GetCandlesInput,\n type GetCandlesColumnsInput,\n ListCandlesInputSchema,\n} from \"./candles.schemas.js\";\nimport { TimeframeCodec } from \"./candles.codecs.js\";\n\ninterface SubscribeCandlesInput extends BaseSubscribeInput<Candle> {\n symbolId: number;\n timeframe: Timeframe;\n}\n\ninterface SubscribeCandlesIntsInput extends BaseSubscribeInput<CandleInt> {\n symbolId: number;\n timeframe: Timeframe;\n}\n\nconst SubscribeCandlesParamsSchema = v.object({\n symbolId: v.pipe(v.number(), v.integer(), v.gtValue(0)),\n timeframe: TimeframeSchema,\n});\n\n/**\n * Reads and streams public spot OHLCV candle data in row and columnar formats.\n */\nexport class CandlesService {\n #client: Client<typeof Proto.MarketDataService>;\n #realtime: PolyesterRealtime;\n #scales: SdkScales;\n #rowSchema: ReturnType<typeof createCandleRowSchema>;\n #rowIntSchema: ReturnType<typeof createCandleRowIntSchema>;\n #columnarSchema: ReturnType<typeof createCandleColumnarSchema>;\n #columnarIntSchema: ReturnType<typeof createCandleColumnarIntSchema>;\n\n constructor(transport: Transport, realtime: PolyesterRealtime, scales: SdkScales) {\n this.#client = createClient(Proto.MarketDataService, transport);\n this.#realtime = realtime;\n this.#scales = scales;\n this.#rowSchema = createCandleRowSchema(scales);\n this.#rowIntSchema = createCandleRowIntSchema(scales);\n this.#columnarSchema = createCandleColumnarSchema(scales);\n this.#columnarIntSchema = createCandleColumnarIntSchema(scales);\n }\n\n /**\n * Returns OHLCV candles for a symbol/timeframe request, mapped into row objects with symbol id and timeframe. The proto response is newest-first and may include incomplete/reference data depending on input flags.\n */\n async list(input: GetCandlesInput, options?: PolyesterRequestOptions): Promise<Candle[]> {\n const validatedInput = parse(ListCandlesInputSchema, input);\n await this.#scales.ready();\n const res = await this.#client.getCandles(validatedInput, toConnectCallOptions(options));\n const candles = parse(v.optional(v.array(CandlePointSchema), []), res.candles);\n return candles.map((c) =>\n parse(this.#rowSchema, {\n ...c,\n symbolId: res.symbolId,\n timeframe: res.timeframe,\n }),\n );\n }\n\n /**\n * Returns candle data in chart-friendly column arrays ordered oldest-first by bucket start time. This preserves decimal-string SDK formatting from the columnar schema.\n */\n async listColumnar(\n input: GetCandlesColumnsInput,\n options?: PolyesterRequestOptions,\n ): Promise<CandleColumnar> {\n const validatedInput = parse(ListCandlesInputSchema, input);\n await this.#scales.ready();\n const res = await this.#client.getCandlesColumns(\n validatedInput,\n toConnectCallOptions(options),\n );\n return parse(this.#columnarSchema, res);\n }\n\n /**\n * Returns the same columnar candle series keyed by numeric bucket-start seconds (`tsSec`) instead of `time`.\n */\n async listColumnarInts(\n input: GetCandlesColumnsInput,\n options?: PolyesterRequestOptions,\n ): Promise<CandleColumnarInt> {\n const validatedInput = parse(ListCandlesInputSchema, input);\n await this.#scales.ready();\n const res = await this.#client.getCandlesColumns(\n validatedInput,\n toConnectCallOptions(options),\n );\n return parse(this.#columnarIntSchema, res);\n }\n\n /**\n * Subscribes to live candle updates on public:spot:market:candles:{timeframe}:{symbolId}:proto and emits row-form candles.\n */\n subscribe(input: SubscribeCandlesInput): () => void {\n return this.#subscribeWithSchema(input, this.#rowSchema);\n }\n\n /**\n * Subscribes to the same live candle channel as subscribe and emits row candles parsed through the row-int schema.\n */\n subscribeInts(input: SubscribeCandlesIntsInput): () => void {\n return this.#subscribeWithSchema(input, this.#rowIntSchema);\n }\n\n #subscribeWithSchema(\n input: SubscribeCandlesInput | SubscribeCandlesIntsInput,\n schema: ReturnType<typeof createCandleRowSchema>,\n ): () => void {\n const params = parse(SubscribeCandlesParamsSchema, {\n symbolId: input.symbolId,\n timeframe: input.timeframe,\n });\n const protoTimeframe = TimeframeCodec.inputToProto[params.timeframe];\n const channel = `public:spot:market:candles:${params.timeframe}:${params.symbolId}:proto`;\n const gate = createReadyGate(\n () => this.#scales.ready(),\n (error) => input.onError?.(publicationHandlerErrorContext(channel, error)),\n );\n return this.#realtime.connectProtoChannel({\n channel,\n schema: Proto.CandlePointSchema,\n onPublication: (data) => {\n gate.run(() => {\n const point = parse(CandlePointSchema, data);\n const candle = parse(schema, {\n ...point,\n symbolId: params.symbolId,\n timeframe: protoTimeframe,\n });\n input.onEvent(candle);\n });\n },\n onConnected: input.onOpen,\n onDisconnected: input.onClose,\n onError: input.onError,\n });\n }\n}\n"],"mappings":";;;;;;;;;;AAwCA,MAAM,+BAA+B,EAAE,OAAO;CAC1C,UAAU,EAAE,KAAK,EAAE,OAAO,GAAG,EAAE,QAAQ,GAAG,EAAE,QAAQ,CAAC,CAAC;CACtD,WAAW;AACf,CAAC;;;;AAKD,IAAa,iBAAb,MAA4B;CACxB;CACA;CACA;CACA;CACA;CACA;CACA;CAEA,YAAY,WAAsB,UAA6B,QAAmB;EAC9E,KAAKA,UAAU,aAAaC,mBAAyB,SAAS;EAC9D,KAAKC,YAAY;EACjB,KAAKC,UAAU;EACf,KAAKC,aAAa,sBAAsB,MAAM;EAC9C,KAAKC,gBAAgB,yBAAyB,MAAM;EACpD,KAAKC,kBAAkB,2BAA2B,MAAM;EACxD,KAAKC,qBAAqB,8BAA8B,MAAM;CAClE;;;;CAKA,MAAM,KAAK,OAAwB,SAAsD;EACrF,MAAM,iBAAiB,MAAM,wBAAwB,KAAK;EAC1D,MAAM,KAAKJ,QAAQ,MAAM;EACzB,MAAM,MAAM,MAAM,KAAKH,QAAQ,WAAW,gBAAgB,qBAAqB,OAAO,CAAC;EAEvF,OADgB,MAAM,EAAE,SAAS,EAAE,MAAMQ,mBAAiB,GAAG,CAAC,CAAC,GAAG,IAAI,OACzD,CAAC,CAAC,KAAK,MAChB,MAAM,KAAKJ,YAAY;GACnB,GAAG;GACH,UAAU,IAAI;GACd,WAAW,IAAI;EACnB,CAAC,CACL;CACJ;;;;CAKA,MAAM,aACF,OACA,SACuB;EACvB,MAAM,iBAAiB,MAAM,wBAAwB,KAAK;EAC1D,MAAM,KAAKD,QAAQ,MAAM;EACzB,MAAM,MAAM,MAAM,KAAKH,QAAQ,kBAC3B,gBACA,qBAAqB,OAAO,CAChC;EACA,OAAO,MAAM,KAAKM,iBAAiB,GAAG;CAC1C;;;;CAKA,MAAM,iBACF,OACA,SAC0B;EAC1B,MAAM,iBAAiB,MAAM,wBAAwB,KAAK;EAC1D,MAAM,KAAKH,QAAQ,MAAM;EACzB,MAAM,MAAM,MAAM,KAAKH,QAAQ,kBAC3B,gBACA,qBAAqB,OAAO,CAChC;EACA,OAAO,MAAM,KAAKO,oBAAoB,GAAG;CAC7C;;;;CAKA,UAAU,OAA0C;EAChD,OAAO,KAAKE,qBAAqB,OAAO,KAAKL,UAAU;CAC3D;;;;CAKA,cAAc,OAA8C;EACxD,OAAO,KAAKK,qBAAqB,OAAO,KAAKJ,aAAa;CAC9D;CAEA,qBACI,OACA,QACU;EACV,MAAM,SAAS,MAAM,8BAA8B;GAC/C,UAAU,MAAM;GAChB,WAAW,MAAM;EACrB,CAAC;EACD,MAAM,iBAAiB,eAAe,aAAa,OAAO;EAC1D,MAAM,UAAU,8BAA8B,OAAO,UAAU,GAAG,OAAO,SAAS;EAClF,MAAM,OAAO,sBACH,KAAKF,QAAQ,MAAM,IACxB,UAAU,MAAM,UAAU,+BAA+B,SAAS,KAAK,CAAC,CAC7E;EACA,OAAO,KAAKD,UAAU,oBAAoB;GACtC;GACA,QAAQQ;GACR,gBAAgB,SAAS;IACrB,KAAK,UAAU;KACX,MAAM,QAAQ,MAAMF,qBAAmB,IAAI;KAC3C,MAAM,SAAS,MAAM,QAAQ;MACzB,GAAG;MACH,UAAU,OAAO;MACjB,WAAW;KACf,CAAC;KACD,MAAM,QAAQ,MAAM;IACxB,CAAC;GACL;GACA,aAAa,MAAM;GACnB,gBAAgB,MAAM;GACtB,SAAS,MAAM;EACnB,CAAC;CACL;AACJ"}