@polyester/sdk 0.24.0 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +18 -12
  3. package/dist/account-signer/create-polyester-account-signer.d.ts +9 -5
  4. package/dist/account-signer/create-polyester-account-signer.d.ts.map +1 -1
  5. package/dist/account-signer/create-polyester-account-signer.js +9 -5
  6. package/dist/account-signer/create-polyester-account-signer.js.map +1 -1
  7. package/dist/account-signer/types.d.ts +10 -4
  8. package/dist/account-signer/types.d.ts.map +1 -1
  9. package/dist/account-signer/types.js.map +1 -1
  10. package/dist/core-client.d.ts +3 -0
  11. package/dist/core-client.d.ts.map +1 -1
  12. package/dist/core-client.js +23 -45
  13. package/dist/core-client.js.map +1 -1
  14. package/dist/gen/auth/v1/auth_pb.d.ts +7 -4
  15. package/dist/gen/auth/v1/auth_pb.d.ts.map +1 -1
  16. package/dist/gen/auth/v1/auth_pb.js.map +1 -1
  17. package/dist/gen/claims/v1/claims_pb.d.ts +313 -0
  18. package/dist/gen/claims/v1/claims_pb.d.ts.map +1 -0
  19. package/dist/gen/claims/v1/claims_pb.js +135 -0
  20. package/dist/gen/claims/v1/claims_pb.js.map +1 -0
  21. package/dist/gen/index.d.ts +2 -1
  22. package/dist/gen/index.js +2 -1
  23. package/dist/gen/orders/v1/orders_pb.d.ts +50 -3
  24. package/dist/gen/orders/v1/orders_pb.d.ts.map +1 -1
  25. package/dist/gen/orders/v1/orders_pb.js +55 -43
  26. package/dist/gen/orders/v1/orders_pb.js.map +1 -1
  27. package/dist/gen/orders/v1/orders_read_pb.d.ts +10 -0
  28. package/dist/gen/orders/v1/orders_read_pb.d.ts.map +1 -1
  29. package/dist/gen/orders/v1/orders_read_pb.js +3 -1
  30. package/dist/gen/orders/v1/orders_read_pb.js.map +1 -1
  31. package/dist/index.d.ts +4 -1
  32. package/dist/realtime/client.js +45 -26
  33. package/dist/realtime/client.js.map +1 -1
  34. package/dist/services/accounts/accounts.schemas.d.ts +2 -2
  35. package/dist/services/accounts/accounts.schemas.d.ts.map +1 -1
  36. package/dist/services/accounts/accounts.schemas.js +3 -3
  37. package/dist/services/accounts/accounts.schemas.js.map +1 -1
  38. package/dist/services/address-book/address-book.schemas.d.ts +67 -68
  39. package/dist/services/address-book/address-book.schemas.d.ts.map +1 -1
  40. package/dist/services/address-book/address-book.schemas.js +11 -13
  41. package/dist/services/address-book/address-book.schemas.js.map +1 -1
  42. package/dist/services/api-keys/api-keys.schemas.d.ts +1 -2
  43. package/dist/services/api-keys/api-keys.schemas.d.ts.map +1 -1
  44. package/dist/services/api-keys/api-keys.schemas.js +4 -9
  45. package/dist/services/api-keys/api-keys.schemas.js.map +1 -1
  46. package/dist/services/auth/account-signer-auth.js +1 -1
  47. package/dist/services/auth/account-signer-auth.js.map +1 -1
  48. package/dist/services/auth/auth.d.ts +2 -3
  49. package/dist/services/auth/auth.d.ts.map +1 -1
  50. package/dist/services/auth/auth.js +4 -2
  51. package/dist/services/auth/auth.js.map +1 -1
  52. package/dist/services/balances/balances.schemas.d.ts +3 -3
  53. package/dist/services/balances/balances.schemas.d.ts.map +1 -1
  54. package/dist/services/balances/balances.schemas.js +7 -12
  55. package/dist/services/balances/balances.schemas.js.map +1 -1
  56. package/dist/services/candles/candles.schemas.d.ts +3 -3
  57. package/dist/services/candles/candles.schemas.d.ts.map +1 -1
  58. package/dist/services/candles/candles.schemas.js +5 -6
  59. package/dist/services/candles/candles.schemas.js.map +1 -1
  60. package/dist/services/chain-analytics/chain-analytics.schemas.d.ts +3 -3
  61. package/dist/services/chain-analytics/chain-analytics.schemas.d.ts.map +1 -1
  62. package/dist/services/chain-analytics/chain-analytics.schemas.js +2 -3
  63. package/dist/services/chain-analytics/chain-analytics.schemas.js.map +1 -1
  64. package/dist/services/claims/claims.codecs.d.ts +8 -0
  65. package/dist/services/claims/claims.codecs.d.ts.map +1 -0
  66. package/dist/services/claims/claims.codecs.js +17 -0
  67. package/dist/services/claims/claims.codecs.js.map +1 -0
  68. package/dist/services/claims/claims.d.ts +19 -0
  69. package/dist/services/claims/claims.d.ts.map +1 -0
  70. package/dist/services/claims/claims.js +30 -0
  71. package/dist/services/claims/claims.js.map +1 -0
  72. package/dist/services/claims/claims.schemas.d.ts +122 -0
  73. package/dist/services/claims/claims.schemas.d.ts.map +1 -0
  74. package/dist/services/claims/claims.schemas.js +47 -0
  75. package/dist/services/claims/claims.schemas.js.map +1 -0
  76. package/dist/services/claims/claims.types.d.ts +3 -0
  77. package/dist/services/claims/index.d.ts +5 -0
  78. package/dist/services/heatmap/heatmap.schemas.d.ts +4 -4
  79. package/dist/services/heatmap/heatmap.schemas.d.ts.map +1 -1
  80. package/dist/services/heatmap/heatmap.schemas.js +10 -10
  81. package/dist/services/heatmap/heatmap.schemas.js.map +1 -1
  82. package/dist/services/internal-transfers/internal-transfers.schemas.d.ts.map +1 -1
  83. package/dist/services/internal-transfers/internal-transfers.schemas.js +1 -5
  84. package/dist/services/internal-transfers/internal-transfers.schemas.js.map +1 -1
  85. package/dist/services/lifecycle/lifecycle.schemas.d.ts +90 -90
  86. package/dist/services/lifecycle/lifecycle.schemas.d.ts.map +1 -1
  87. package/dist/services/lifecycle/lifecycle.schemas.js +10 -11
  88. package/dist/services/lifecycle/lifecycle.schemas.js.map +1 -1
  89. package/dist/services/market-overview/market-overview.schemas.d.ts +1 -1
  90. package/dist/services/market-overview/market-overview.schemas.d.ts.map +1 -1
  91. package/dist/services/market-overview/market-overview.schemas.js +3 -3
  92. package/dist/services/market-overview/market-overview.schemas.js.map +1 -1
  93. package/dist/services/mfa/mfa.schemas.d.ts +11 -11
  94. package/dist/services/mfa/mfa.schemas.d.ts.map +1 -1
  95. package/dist/services/mfa/mfa.schemas.js +4 -5
  96. package/dist/services/mfa/mfa.schemas.js.map +1 -1
  97. package/dist/services/orderbook/orderbook.schemas.d.ts +1 -1
  98. package/dist/services/orders/order-enums.codecs.js +2 -1
  99. package/dist/services/orders/order-enums.codecs.js.map +1 -1
  100. package/dist/services/orders/order-errors.schemas.d.ts +4 -5
  101. package/dist/services/orders/order-errors.schemas.d.ts.map +1 -1
  102. package/dist/services/orders/orders-batch.schemas.d.ts +110 -32
  103. package/dist/services/orders/orders-batch.schemas.d.ts.map +1 -1
  104. package/dist/services/orders/orders-batch.schemas.js +9 -10
  105. package/dist/services/orders/orders-batch.schemas.js.map +1 -1
  106. package/dist/services/orders/orders-input.schemas.d.ts +111 -8
  107. package/dist/services/orders/orders-input.schemas.d.ts.map +1 -1
  108. package/dist/services/orders/orders-input.schemas.js +20 -4
  109. package/dist/services/orders/orders-input.schemas.js.map +1 -1
  110. package/dist/services/orders/orders-modify.schemas.d.ts +2 -2
  111. package/dist/services/orders/orders-modify.schemas.d.ts.map +1 -1
  112. package/dist/services/orders/orders-modify.schemas.js +3 -3
  113. package/dist/services/orders/orders-modify.schemas.js.map +1 -1
  114. package/dist/services/orders/orders-output.schemas.d.ts +48 -32
  115. package/dist/services/orders/orders-output.schemas.d.ts.map +1 -1
  116. package/dist/services/orders/orders-output.schemas.js +16 -16
  117. package/dist/services/orders/orders-output.schemas.js.map +1 -1
  118. package/dist/services/orders/orders-risk.schemas.d.ts +0 -1
  119. package/dist/services/orders/orders-risk.schemas.d.ts.map +1 -1
  120. package/dist/services/orders/orders-risk.schemas.js +4 -4
  121. package/dist/services/orders/orders-risk.schemas.js.map +1 -1
  122. package/dist/services/policies/api-key-policies/api-key-policies.schemas.d.ts +4 -4
  123. package/dist/services/policies/shared.codecs.js +3 -3
  124. package/dist/services/policies/shared.codecs.js.map +1 -1
  125. package/dist/services/policies/shared.d.ts +0 -1
  126. package/dist/services/policies/shared.d.ts.map +1 -1
  127. package/dist/services/policies/shared.js +2 -3
  128. package/dist/services/policies/shared.js.map +1 -1
  129. package/dist/services/policies/subaccount-policies/subaccount-policies.schemas.d.ts +2 -2
  130. package/dist/services/policies/subaccount-policies/subaccount-policies.schemas.d.ts.map +1 -1
  131. package/dist/services/policies/subaccount-policies/subaccount-policies.schemas.js +2 -5
  132. package/dist/services/policies/subaccount-policies/subaccount-policies.schemas.js.map +1 -1
  133. package/dist/services/rate-limits/rate-limits.schemas.d.ts +6 -7
  134. package/dist/services/rate-limits/rate-limits.schemas.d.ts.map +1 -1
  135. package/dist/services/rate-limits/rate-limits.schemas.js +2 -3
  136. package/dist/services/rate-limits/rate-limits.schemas.js.map +1 -1
  137. package/dist/services/social-verification/social-verification.schemas.d.ts.map +1 -1
  138. package/dist/services/social-verification/social-verification.schemas.js +4 -4
  139. package/dist/services/social-verification/social-verification.schemas.js.map +1 -1
  140. package/dist/services/subaccounts/subaccounts.schemas.d.ts +23 -24
  141. package/dist/services/subaccounts/subaccounts.schemas.d.ts.map +1 -1
  142. package/dist/services/subaccounts/subaccounts.schemas.js +10 -12
  143. package/dist/services/subaccounts/subaccounts.schemas.js.map +1 -1
  144. package/dist/services/trades/trades.schemas.d.ts +1 -1
  145. package/dist/services/trades/trades.schemas.d.ts.map +1 -1
  146. package/dist/services/trades/trades.schemas.js +4 -8
  147. package/dist/services/trades/trades.schemas.js.map +1 -1
  148. package/dist/services/transfers/transfers.schemas.d.ts +3 -4
  149. package/dist/services/transfers/transfers.schemas.d.ts.map +1 -1
  150. package/dist/services/transfers/transfers.schemas.js +5 -10
  151. package/dist/services/transfers/transfers.schemas.js.map +1 -1
  152. package/dist/services/triggers/trigger-input.schemas.d.ts +2 -2
  153. package/dist/services/triggers/triggers-output.schemas.d.ts +56 -58
  154. package/dist/services/triggers/triggers-output.schemas.d.ts.map +1 -1
  155. package/dist/services/triggers/triggers-output.schemas.js +34 -36
  156. package/dist/services/triggers/triggers-output.schemas.js.map +1 -1
  157. package/dist/services/whiteboard/whiteboard.schemas.d.ts +42 -42
  158. package/dist/services/whiteboard/whiteboard.schemas.d.ts.map +1 -1
  159. package/dist/services/whiteboard/whiteboard.schemas.js +9 -10
  160. package/dist/services/whiteboard/whiteboard.schemas.js.map +1 -1
  161. package/dist/shared/proto-enum-codec.js +11 -6
  162. package/dist/shared/proto-enum-codec.js.map +1 -1
  163. package/dist/shared/rate-limit.schemas.d.ts +4 -5
  164. package/dist/shared/rate-limit.schemas.d.ts.map +1 -1
  165. package/dist/shared/rate-limit.schemas.js +41 -46
  166. package/dist/shared/rate-limit.schemas.js.map +1 -1
  167. package/dist/shared/schemas.js +5 -1
  168. package/dist/shared/schemas.js.map +1 -1
  169. package/dist/shared/transports.d.ts +5 -1
  170. package/dist/shared/transports.d.ts.map +1 -1
  171. package/dist/shared/transports.js.map +1 -1
  172. package/dist/utils/timestamp.js +8 -1
  173. package/dist/utils/timestamp.js.map +1 -1
  174. package/dist/wired-services.d.ts.map +1 -1
  175. package/dist/wired-services.js +2 -0
  176. package/dist/wired-services.js.map +1 -1
  177. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limit.schemas.js","names":["Proto.FailureReason","Proto.PolicyClass","Proto.LimiterScope","Proto.RefillModel"],"sources":["../../src/shared/rate-limit.schemas.ts"],"sourcesContent":["import * as v from \"valibot\";\nimport * as Proto from \"../gen/polyester/ratelimit/v1/types_pb.js\";\nimport type { ProtoToOutput } from \"../utils/types.js\";\nimport { requiredEnumLabel } from \"./proto-enum-codec.js\";\nimport { OptionalBigIntStringSchema } from \"./schemas.js\";\n\nconst RATE_LIMIT_FAILURE_REASON_VALUES = [\n \"unspecified\",\n \"quota_exceeded\",\n \"authority_unavailable\",\n] as const;\n\nconst RATE_LIMIT_POLICY_CLASS_VALUES = [\n \"unspecified\",\n \"auth_public\",\n \"trading_place\",\n \"trading_cancel\",\n \"trading_read\",\n \"account_admin\",\n \"public_read\",\n \"account_security\",\n \"deposit_create\",\n \"internal_transfer\",\n \"withdraw_submit\",\n \"withdraw_validate\",\n \"guard_sign\",\n \"social_provider\",\n] as const;\n\nconst RATE_LIMIT_SCOPE_VALUES = [\n \"unspecified\",\n \"client_ip\",\n \"api_key\",\n \"account\",\n \"subaccount\",\n \"connection\",\n \"service\",\n \"region\",\n \"symbol\",\n \"auth_subject\",\n] as const;\n\nconst RATE_LIMIT_REFILL_MODEL_VALUES = [\n \"unspecified\",\n \"continuous\",\n \"fixed_window\",\n \"rolling_window\",\n] as const;\n\n/** Machine-readable reason for a rate-limit rejection. */\nexport type RateLimitFailureReason = (typeof RATE_LIMIT_FAILURE_REASON_VALUES)[number];\n/** Quota policy family used for a rate-limit decision. */\nexport type RateLimitPolicyClass = (typeof RATE_LIMIT_POLICY_CLASS_VALUES)[number];\n/** Caller dimension that owns the exhausted capacity. */\nexport type RateLimitScope = (typeof RATE_LIMIT_SCOPE_VALUES)[number];\n/** Refill behavior for the exhausted quota. */\nexport type RateLimitRefillModel = (typeof RATE_LIMIT_REFILL_MODEL_VALUES)[number];\n\nconst RateLimitFailureReasonCodec = {\n protoToOutput: {\n [Proto.FailureReason.REASON_UNSPECIFIED]: \"unspecified\",\n [Proto.FailureReason.QUOTA_EXCEEDED]: \"quota_exceeded\",\n [Proto.FailureReason.AUTHORITY_UNAVAILABLE]: \"authority_unavailable\",\n } satisfies ProtoToOutput<Proto.FailureReason, RateLimitFailureReason>,\n} as const;\n\nconst RateLimitPolicyClassCodec = {\n protoToOutput: {\n [Proto.PolicyClass.CLASS_UNSPECIFIED]: \"unspecified\",\n [Proto.PolicyClass.AUTH_PUBLIC]: \"auth_public\",\n [Proto.PolicyClass.TRADING_PLACE]: \"trading_place\",\n [Proto.PolicyClass.TRADING_CANCEL]: \"trading_cancel\",\n [Proto.PolicyClass.TRADING_READ]: \"trading_read\",\n [Proto.PolicyClass.ACCOUNT_ADMIN]: \"account_admin\",\n [Proto.PolicyClass.PUBLIC_READ]: \"public_read\",\n [Proto.PolicyClass.ACCOUNT_SECURITY]: \"account_security\",\n [Proto.PolicyClass.DEPOSIT_CREATE]: \"deposit_create\",\n [Proto.PolicyClass.INTERNAL_TRANSFER]: \"internal_transfer\",\n [Proto.PolicyClass.WITHDRAW_SUBMIT]: \"withdraw_submit\",\n [Proto.PolicyClass.WITHDRAW_VALIDATE]: \"withdraw_validate\",\n [Proto.PolicyClass.GUARD_SIGN]: \"guard_sign\",\n [Proto.PolicyClass.SOCIAL_PROVIDER]: \"social_provider\",\n } satisfies ProtoToOutput<Proto.PolicyClass, RateLimitPolicyClass>,\n} as const;\n\nconst RateLimitScopeCodec = {\n protoToOutput: {\n [Proto.LimiterScope.SCOPE_UNSPECIFIED]: \"unspecified\",\n [Proto.LimiterScope.CLIENT_IP]: \"client_ip\",\n [Proto.LimiterScope.API_KEY]: \"api_key\",\n [Proto.LimiterScope.ACCOUNT]: \"account\",\n [Proto.LimiterScope.SUBACCOUNT]: \"subaccount\",\n [Proto.LimiterScope.CONNECTION]: \"connection\",\n [Proto.LimiterScope.SERVICE]: \"service\",\n [Proto.LimiterScope.REGION]: \"region\",\n [Proto.LimiterScope.SYMBOL]: \"symbol\",\n [Proto.LimiterScope.AUTH_SUBJECT]: \"auth_subject\",\n } satisfies ProtoToOutput<Proto.LimiterScope, RateLimitScope>,\n} as const;\n\nconst RateLimitRefillModelCodec = {\n protoToOutput: {\n [Proto.RefillModel.REFILL_UNSPECIFIED]: \"unspecified\",\n [Proto.RefillModel.CONTINUOUS]: \"continuous\",\n [Proto.RefillModel.FIXED_WINDOW]: \"fixed_window\",\n [Proto.RefillModel.ROLLING_WINDOW]: \"rolling_window\",\n } satisfies ProtoToOutput<Proto.RefillModel, RateLimitRefillModel>,\n} as const;\n\n/** Parses protobuf quota state into the stable SDK rate-limit detail shape. */\nexport const RateLimitDetailSchema = v.object({\n reason: v.pipe(\n v.enum(Proto.FailureReason),\n v.transform((reason) =>\n requiredEnumLabel(\n RateLimitFailureReasonCodec.protoToOutput,\n reason,\n \"RateLimitDetailSchema\",\n \"reason\",\n ),\n ),\n ),\n limit: OptionalBigIntStringSchema,\n remaining: OptionalBigIntStringSchema,\n retryAfterMs: OptionalBigIntStringSchema,\n policyVersion: OptionalBigIntStringSchema,\n operationId: v.string(),\n policyClass: v.pipe(\n v.enum(Proto.PolicyClass),\n v.transform((policyClass) =>\n requiredEnumLabel(\n RateLimitPolicyClassCodec.protoToOutput,\n policyClass,\n \"RateLimitDetailSchema\",\n \"policyClass\",\n ),\n ),\n ),\n scope: v.pipe(\n v.enum(Proto.LimiterScope),\n v.transform((scope) =>\n requiredEnumLabel(\n RateLimitScopeCodec.protoToOutput,\n scope,\n \"RateLimitDetailSchema\",\n \"scope\",\n ),\n ),\n ),\n refillModel: v.pipe(\n v.enum(Proto.RefillModel),\n v.transform((refillModel) =>\n requiredEnumLabel(\n RateLimitRefillModelCodec.protoToOutput,\n refillModel,\n \"RateLimitDetailSchema\",\n \"refillModel\",\n ),\n ),\n ),\n});\n\n/** Structured quota state exposed by order rejections and {@link RateLimitError}. */\nexport type RateLimitDetail = v.InferOutput<typeof RateLimitDetailSchema>;\n"],"mappings":";;;;;AA0DA,MAAM,8BAA8B,EAChC,eAAe;EAC+B,IAAA;EACJ,IAAA;EACO,IAAA;AACjD,EACJ;AAEA,MAAM,4BAA4B,EAC9B,eAAe;EAC4B,IAAA;EACN,IAAA;EACE,IAAA;EACC,IAAA;EACF,IAAA;EACC,IAAA;EACF,IAAA;EACK,IAAA;EACF,IAAA;EACG,IAAA;EACF,KAAA;EACE,KAAA;EACP,KAAA;EACK,KAAA;AACzC,EACJ;AAEA,MAAM,sBAAsB,EACxB,eAAe;EAC6B,IAAA;EACR,IAAA;EACF,IAAA;EACA,IAAA;EACG,IAAA;EACA,IAAA;EACH,IAAA;EACD,IAAA;EACA,IAAA;EACM,IAAA;AACvC,EACJ;AAEA,MAAM,4BAA4B,EAC9B,eAAe;EAC6B,IAAA;EACR,IAAA;EACE,IAAA;EACE,IAAA;AACxC,EACJ;;AAGA,MAAa,wBAAwB,EAAE,OAAO;CAC1C,QAAQ,EAAE,KACN,EAAE,KAAKA,aAAmB,GAC1B,EAAE,WAAW,WACT,kBACI,4BAA4B,eAC5B,QACA,yBACA,QACJ,CACJ,CACJ;CACA,OAAO;CACP,WAAW;CACX,cAAc;CACd,eAAe;CACf,aAAa,EAAE,OAAO;CACtB,aAAa,EAAE,KACX,EAAE,KAAKC,WAAiB,GACxB,EAAE,WAAW,gBACT,kBACI,0BAA0B,eAC1B,aACA,yBACA,aACJ,CACJ,CACJ;CACA,OAAO,EAAE,KACL,EAAE,KAAKC,YAAkB,GACzB,EAAE,WAAW,UACT,kBACI,oBAAoB,eACpB,OACA,yBACA,OACJ,CACJ,CACJ;CACA,aAAa,EAAE,KACX,EAAE,KAAKC,WAAiB,GACxB,EAAE,WAAW,gBACT,kBACI,0BAA0B,eAC1B,aACA,yBACA,aACJ,CACJ,CACJ;AACJ,CAAC"}
1
+ {"version":3,"file":"rate-limit.schemas.js","names":[],"sources":["../../src/shared/rate-limit.schemas.ts"],"sourcesContent":["import * as v from \"valibot\";\nimport * as Proto from \"../gen/polyester/ratelimit/v1/types_pb.js\";\nimport type { ProtoToOutput } from \"../utils/types.js\";\nimport { enumLabelSchema } from \"./proto-enum-codec.js\";\nimport { OptionalBigIntStringSchema } from \"./schemas.js\";\n\nconst RATE_LIMIT_FAILURE_REASON_VALUES = [\n \"unspecified\",\n \"quota_exceeded\",\n \"authority_unavailable\",\n] as const;\n\nconst RATE_LIMIT_POLICY_CLASS_VALUES = [\n \"unspecified\",\n \"auth_public\",\n \"trading_place\",\n \"trading_cancel\",\n \"trading_read\",\n \"account_admin\",\n \"public_read\",\n \"account_security\",\n \"deposit_create\",\n \"internal_transfer\",\n \"withdraw_submit\",\n \"withdraw_validate\",\n \"guard_sign\",\n \"social_provider\",\n] as const;\n\nconst RATE_LIMIT_SCOPE_VALUES = [\n \"unspecified\",\n \"client_ip\",\n \"api_key\",\n \"account\",\n \"subaccount\",\n \"connection\",\n \"service\",\n \"region\",\n \"symbol\",\n \"auth_subject\",\n] as const;\n\nconst RATE_LIMIT_REFILL_MODEL_VALUES = [\n \"unspecified\",\n \"continuous\",\n \"fixed_window\",\n \"rolling_window\",\n] as const;\n\n/** Machine-readable reason for a rate-limit rejection. */\nexport type RateLimitFailureReason = (typeof RATE_LIMIT_FAILURE_REASON_VALUES)[number];\n/** Quota policy family used for a rate-limit decision. */\nexport type RateLimitPolicyClass = (typeof RATE_LIMIT_POLICY_CLASS_VALUES)[number];\n/** Caller dimension that owns the exhausted capacity. */\nexport type RateLimitScope = (typeof RATE_LIMIT_SCOPE_VALUES)[number];\n/** Refill behavior for the exhausted quota. */\nexport type RateLimitRefillModel = (typeof RATE_LIMIT_REFILL_MODEL_VALUES)[number];\n\nconst RateLimitFailureReasonCodec = {\n protoToOutput: {\n [Proto.FailureReason.REASON_UNSPECIFIED]: \"unspecified\",\n [Proto.FailureReason.QUOTA_EXCEEDED]: \"quota_exceeded\",\n [Proto.FailureReason.AUTHORITY_UNAVAILABLE]: \"authority_unavailable\",\n } satisfies ProtoToOutput<Proto.FailureReason, RateLimitFailureReason>,\n} as const;\n\nconst RateLimitPolicyClassCodec = {\n protoToOutput: {\n [Proto.PolicyClass.CLASS_UNSPECIFIED]: \"unspecified\",\n [Proto.PolicyClass.AUTH_PUBLIC]: \"auth_public\",\n [Proto.PolicyClass.TRADING_PLACE]: \"trading_place\",\n [Proto.PolicyClass.TRADING_CANCEL]: \"trading_cancel\",\n [Proto.PolicyClass.TRADING_READ]: \"trading_read\",\n [Proto.PolicyClass.ACCOUNT_ADMIN]: \"account_admin\",\n [Proto.PolicyClass.PUBLIC_READ]: \"public_read\",\n [Proto.PolicyClass.ACCOUNT_SECURITY]: \"account_security\",\n [Proto.PolicyClass.DEPOSIT_CREATE]: \"deposit_create\",\n [Proto.PolicyClass.INTERNAL_TRANSFER]: \"internal_transfer\",\n [Proto.PolicyClass.WITHDRAW_SUBMIT]: \"withdraw_submit\",\n [Proto.PolicyClass.WITHDRAW_VALIDATE]: \"withdraw_validate\",\n [Proto.PolicyClass.GUARD_SIGN]: \"guard_sign\",\n [Proto.PolicyClass.SOCIAL_PROVIDER]: \"social_provider\",\n } satisfies ProtoToOutput<Proto.PolicyClass, RateLimitPolicyClass>,\n} as const;\n\nconst RateLimitScopeCodec = {\n protoToOutput: {\n [Proto.LimiterScope.SCOPE_UNSPECIFIED]: \"unspecified\",\n [Proto.LimiterScope.CLIENT_IP]: \"client_ip\",\n [Proto.LimiterScope.API_KEY]: \"api_key\",\n [Proto.LimiterScope.ACCOUNT]: \"account\",\n [Proto.LimiterScope.SUBACCOUNT]: \"subaccount\",\n [Proto.LimiterScope.CONNECTION]: \"connection\",\n [Proto.LimiterScope.SERVICE]: \"service\",\n [Proto.LimiterScope.REGION]: \"region\",\n [Proto.LimiterScope.SYMBOL]: \"symbol\",\n [Proto.LimiterScope.AUTH_SUBJECT]: \"auth_subject\",\n } satisfies ProtoToOutput<Proto.LimiterScope, RateLimitScope>,\n} as const;\n\nconst RateLimitRefillModelCodec = {\n protoToOutput: {\n [Proto.RefillModel.REFILL_UNSPECIFIED]: \"unspecified\",\n [Proto.RefillModel.CONTINUOUS]: \"continuous\",\n [Proto.RefillModel.FIXED_WINDOW]: \"fixed_window\",\n [Proto.RefillModel.ROLLING_WINDOW]: \"rolling_window\",\n } satisfies ProtoToOutput<Proto.RefillModel, RateLimitRefillModel>,\n} as const;\n\n/** Parses protobuf quota state into the stable SDK rate-limit detail shape. */\nexport const RateLimitDetailSchema = v.object({\n reason: enumLabelSchema(RateLimitFailureReasonCodec.protoToOutput),\n limit: OptionalBigIntStringSchema,\n remaining: OptionalBigIntStringSchema,\n retryAfterMs: OptionalBigIntStringSchema,\n policyVersion: OptionalBigIntStringSchema,\n operationId: v.string(),\n policyClass: enumLabelSchema(RateLimitPolicyClassCodec.protoToOutput),\n scope: enumLabelSchema(RateLimitScopeCodec.protoToOutput),\n refillModel: enumLabelSchema(RateLimitRefillModelCodec.protoToOutput),\n});\n\n/** Structured quota state exposed by order rejections and {@link RateLimitError}. */\nexport type RateLimitDetail = v.InferOutput<typeof RateLimitDetailSchema>;\n"],"mappings":";;;;;AA8GA,MAAa,wBAAwB,EAAE,OAAO;CAC1C,QAAQ,gBAAgB,EApDxB,eAAe;GAC+B,IAAA;GACJ,IAAA;GACO,IAAA;CACjD,EAgDwB,EAA4B,aAAa;CACjE,OAAO;CACP,WAAW;CACX,cAAc;CACd,eAAe;CACf,aAAa,EAAE,OAAO;CACtB,aAAa,gBAAgB,EAlD7B,eAAe;GAC4B,IAAA;GACN,IAAA;GACE,IAAA;GACC,IAAA;GACF,IAAA;GACC,IAAA;GACF,IAAA;GACK,IAAA;GACF,IAAA;GACG,IAAA;GACF,KAAA;GACE,KAAA;GACP,KAAA;GACK,KAAA;CACzC,EAmC6B,EAA0B,aAAa;CACpE,OAAO,gBAAgB,EAhCvB,eAAe;GAC6B,IAAA;GACR,IAAA;GACF,IAAA;GACA,IAAA;GACG,IAAA;GACA,IAAA;GACH,IAAA;GACD,IAAA;GACA,IAAA;GACM,IAAA;CACvC,EAqBuB,EAAoB,aAAa;CACxD,aAAa,gBAAgB,EAlB7B,eAAe;GAC6B,IAAA;GACR,IAAA;GACE,IAAA;GACE,IAAA;CACxC,EAa6B,EAA0B,aAAa;AACxE,CAAC"}
@@ -9,6 +9,10 @@ const MS_TO_US = 1000n;
9
9
  const MS_TO_NS = 1000000n;
10
10
  const MAX_UINT64_TIMESTAMP_MS_US = Number(UINT64_MAX / MS_TO_US);
11
11
  const MAX_UINT64_TIMESTAMP_MS = Number(UINT64_MAX / MS_TO_NS);
12
+ const U128Schema = v.object({
13
+ hi: v.bigint(),
14
+ lo: v.bigint()
15
+ });
12
16
  const TimestampSchema = v.object({
13
17
  seconds: v.bigint(),
14
18
  nanos: v.optional(v.number(), 0)
@@ -60,6 +64,6 @@ function positiveBigintStringInputSchema(fieldName) {
60
64
  }
61
65
  const JsonObjectSchema = v.custom((input) => typeof input === "object" && input !== null && !Array.isArray(input));
62
66
  //#endregion
63
- export { BigIntStringSchema, JsonObjectSchema, OptionalBigIntStringSchema, OptionalNumberDefaultNullSchema, OptionalNumberToIntOrZeroSchema, OptionalPublicIdSchema, OptionalTimestampMsSchema, OptionalTimestampMsToUsInputSchema, OptionalTimestampSecondsInputSchema, PublicIdSchema, TimestampMsSchema, TimestampSchema, bigintStringInputSchema, idInputSchema, optionalIdInputSchema, optionalSubaccountIdInputSchema, optionalUint64DecimalFilterSchema, positiveBigintStringInputSchema };
67
+ export { BigIntStringSchema, JsonObjectSchema, OptionalBigIntStringSchema, OptionalNumberDefaultNullSchema, OptionalNumberToIntOrZeroSchema, OptionalPublicIdSchema, OptionalTimestampMsSchema, OptionalTimestampMsToUsInputSchema, OptionalTimestampSecondsInputSchema, PublicIdSchema, TimestampMsSchema, TimestampSchema, U128Schema, bigintStringInputSchema, idInputSchema, optionalIdInputSchema, optionalSubaccountIdInputSchema, optionalUint64DecimalFilterSchema, positiveBigintStringInputSchema };
64
68
 
65
69
  //# sourceMappingURL=schemas.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.js","names":[],"sources":["../../src/shared/schemas.ts"],"sourcesContent":["import * as v from \"valibot\";\nimport { formatId, idToBigInt } from \"../utils/base58-id.js\";\nimport { parseOptionalUint64DecimalStrict, toBpsOrZero, toIntOrZero } from \"../utils/numbers.js\";\nimport { tsNsToMs, tsObjToMs } from \"../utils/time.js\";\nimport type { JsonObject } from \"@bufbuild/protobuf\";\nimport { PROTOBUF_UINT32_MAX } from \"./wire-bounds.js\";\n\nconst UINT64_MAX = (1n << 64n) - 1n;\nconst MS_TO_US = 1_000n;\nconst MS_TO_NS = 1_000_000n;\nconst MAX_UINT64_TIMESTAMP_MS_US = Number(UINT64_MAX / MS_TO_US);\nconst MAX_UINT64_TIMESTAMP_MS = Number(UINT64_MAX / MS_TO_NS);\n\nexport const TimestampSchema = v.object({\n seconds: v.bigint(),\n nanos: v.optional(v.number(), 0),\n});\n\nexport const TimestampMsSchema = v.pipe(\n TimestampSchema,\n v.transform((value) => tsObjToMs(value)),\n);\n\nexport const OptionalTimestampMsSchema = v.pipe(\n v.optional(TimestampSchema),\n v.transform((value) => tsObjToMs(value)),\n);\n\nexport const OptionalNumberDefaultNullSchema = v.optional(v.nullable(v.number()), null);\n\nexport const OptionalNumberToIntOrZeroSchema = v.pipe(\n v.optional(v.nullable(v.pipe(v.number(), v.maxValue(PROTOBUF_UINT32_MAX))), null),\n v.transform((value) => toIntOrZero(value)),\n);\n\nexport const OptionalNumberToBpsOrZeroSchema = v.pipe(\n OptionalNumberDefaultNullSchema,\n v.transform((value) => toBpsOrZero(value)),\n);\n\nexport const TimestampNsMsSchema = v.pipe(\n v.bigint(),\n v.transform((value) => tsNsToMs(value)),\n);\n\nexport const BigIntStringSchema = v.pipe(\n v.bigint(),\n v.transform((value) => value.toString()),\n);\n\nexport const OptionalBigIntStringSchema = v.pipe(\n v.optional(v.bigint()),\n v.transform((value) => (value === undefined ? undefined : value.toString())),\n);\n\nexport const OptionalTimestampMsToNsInputSchema = v.optional(\n v.pipe(\n v.number(),\n v.integer(),\n v.minValue(0),\n v.maxValue(MAX_UINT64_TIMESTAMP_MS),\n v.transform((value) => BigInt(value) * MS_TO_NS),\n ),\n);\n\nexport const OptionalTimestampMsToUsInputSchema = v.optional(\n v.pipe(\n v.number(),\n v.integer(),\n v.minValue(0),\n v.maxValue(MAX_UINT64_TIMESTAMP_MS_US),\n v.transform((value) => BigInt(value) * MS_TO_US),\n ),\n);\n\nexport const OptionalTimestampSecondsInputSchema = v.optional(\n v.pipe(\n v.number(),\n v.integer(),\n v.minValue(0),\n v.maxValue(Number.MAX_SAFE_INTEGER),\n v.transform((value) => BigInt(value)),\n ),\n);\n\nexport const PublicIdSchema = v.pipe(\n v.bigint(),\n v.transform((value) => formatId(value)),\n);\n\nexport const OptionalPublicIdSchema = v.pipe(\n v.optional(v.bigint()),\n v.transform((value) => (value ? formatId(value) : undefined)),\n);\n\nconst TrimmedStringSchema = v.pipe(v.string(), v.trim());\n\nconst OptionalTrimmedStringSchema = v.optional(TrimmedStringSchema);\n\n/**\n * Creates a schema for required public id input.\n */\nexport function idInputSchema(fieldName: string) {\n return v.pipe(\n v.string(),\n v.trim(),\n v.minLength(1),\n v.transform((value) => idToBigInt(value, fieldName)),\n );\n}\n\n/**\n * Creates a schema for optional public id input.\n */\nexport function optionalIdInputSchema(fieldName: string) {\n return v.pipe(\n OptionalTrimmedStringSchema,\n v.transform((value) => (value ? idToBigInt(value, fieldName) : undefined)),\n );\n}\n\n/**\n * Creates a schema for optional subaccount id input.\n */\nexport function optionalSubaccountIdInputSchema() {\n return optionalIdInputSchema(\"subaccountId\");\n}\n\n/**\n * Creates a schema for optional uint64 decimal filter input.\n */\nexport function optionalUint64DecimalFilterSchema(fieldName: string) {\n return v.pipe(\n OptionalTrimmedStringSchema,\n v.transform((value) => parseOptionalUint64DecimalStrict(value, fieldName)),\n );\n}\n\n/**\n * Creates a schema for positive bigint-like input.\n */\nexport function positiveBigintLikeSchema(message: string) {\n return v.pipe(\n v.union([\n v.bigint(),\n v.pipe(\n TrimmedStringSchema,\n v.regex(/^\\d+$/),\n v.transform((value) => BigInt(value)),\n ),\n ]),\n v.check((value) => value > 0n, message),\n );\n}\n\nexport function bigintStringInputSchema(fieldName: string) {\n return v.pipe(\n TrimmedStringSchema,\n v.regex(/^\\d+$/, `${fieldName} must be a decimal integer`),\n v.transform((value) => BigInt(value)),\n );\n}\n\nexport function positiveBigintStringInputSchema(fieldName: string) {\n return v.pipe(\n bigintStringInputSchema(fieldName),\n v.check((value) => value > 0n, `${fieldName} must be greater than 0`),\n );\n}\n\nexport const JsonObjectSchema = v.custom<JsonObject>(\n (input): input is JsonObject =>\n typeof input === \"object\" && input !== null && !Array.isArray(input),\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"schemas.js","names":[],"sources":["../../src/shared/schemas.ts"],"sourcesContent":["import * as v from \"valibot\";\nimport { formatId, idToBigInt } from \"../utils/base58-id.js\";\nimport { parseOptionalUint64DecimalStrict, toBpsOrZero, toIntOrZero } from \"../utils/numbers.js\";\nimport { tsNsToMs, tsObjToMs } from \"../utils/time.js\";\nimport type { JsonObject } from \"@bufbuild/protobuf\";\nimport { PROTOBUF_UINT32_MAX } from \"./wire-bounds.js\";\n\nconst UINT64_MAX = (1n << 64n) - 1n;\nconst MS_TO_US = 1_000n;\nconst MS_TO_NS = 1_000_000n;\nconst MAX_UINT64_TIMESTAMP_MS_US = Number(UINT64_MAX / MS_TO_US);\nconst MAX_UINT64_TIMESTAMP_MS = Number(UINT64_MAX / MS_TO_NS);\n\nexport const U128Schema = v.object({\n hi: v.bigint(),\n lo: v.bigint(),\n});\n\nexport const TimestampSchema = v.object({\n seconds: v.bigint(),\n nanos: v.optional(v.number(), 0),\n});\n\nexport const TimestampMsSchema = v.pipe(\n TimestampSchema,\n v.transform((value) => tsObjToMs(value)),\n);\n\nexport const OptionalTimestampMsSchema = v.pipe(\n v.optional(TimestampSchema),\n v.transform((value) => tsObjToMs(value)),\n);\n\nexport const OptionalNumberDefaultNullSchema = v.optional(v.nullable(v.number()), null);\n\nexport const OptionalNumberToIntOrZeroSchema = v.pipe(\n v.optional(v.nullable(v.pipe(v.number(), v.maxValue(PROTOBUF_UINT32_MAX))), null),\n v.transform((value) => toIntOrZero(value)),\n);\n\nexport const OptionalNumberToBpsOrZeroSchema = v.pipe(\n OptionalNumberDefaultNullSchema,\n v.transform((value) => toBpsOrZero(value)),\n);\n\nexport const TimestampNsMsSchema = v.pipe(\n v.bigint(),\n v.transform((value) => tsNsToMs(value)),\n);\n\nexport const BigIntStringSchema = v.pipe(\n v.bigint(),\n v.transform((value) => value.toString()),\n);\n\nexport const OptionalBigIntStringSchema = v.pipe(\n v.optional(v.bigint()),\n v.transform((value) => (value === undefined ? undefined : value.toString())),\n);\n\nexport const OptionalTimestampMsToNsInputSchema = v.optional(\n v.pipe(\n v.number(),\n v.integer(),\n v.minValue(0),\n v.maxValue(MAX_UINT64_TIMESTAMP_MS),\n v.transform((value) => BigInt(value) * MS_TO_NS),\n ),\n);\n\nexport const OptionalTimestampMsToUsInputSchema = v.optional(\n v.pipe(\n v.number(),\n v.integer(),\n v.minValue(0),\n v.maxValue(MAX_UINT64_TIMESTAMP_MS_US),\n v.transform((value) => BigInt(value) * MS_TO_US),\n ),\n);\n\nexport const OptionalTimestampSecondsInputSchema = v.optional(\n v.pipe(\n v.number(),\n v.integer(),\n v.minValue(0),\n v.maxValue(Number.MAX_SAFE_INTEGER),\n v.transform((value) => BigInt(value)),\n ),\n);\n\nexport const PublicIdSchema = v.pipe(\n v.bigint(),\n v.transform((value) => formatId(value)),\n);\n\nexport const OptionalPublicIdSchema = v.pipe(\n v.optional(v.bigint()),\n v.transform((value) => (value ? formatId(value) : undefined)),\n);\n\nconst TrimmedStringSchema = v.pipe(v.string(), v.trim());\n\nconst OptionalTrimmedStringSchema = v.optional(TrimmedStringSchema);\n\n/**\n * Creates a schema for required public id input.\n */\nexport function idInputSchema(fieldName: string) {\n return v.pipe(\n v.string(),\n v.trim(),\n v.minLength(1),\n v.transform((value) => idToBigInt(value, fieldName)),\n );\n}\n\n/**\n * Creates a schema for optional public id input.\n */\nexport function optionalIdInputSchema(fieldName: string) {\n return v.pipe(\n OptionalTrimmedStringSchema,\n v.transform((value) => (value ? idToBigInt(value, fieldName) : undefined)),\n );\n}\n\n/**\n * Creates a schema for optional subaccount id input.\n */\nexport function optionalSubaccountIdInputSchema() {\n return optionalIdInputSchema(\"subaccountId\");\n}\n\n/**\n * Creates a schema for optional uint64 decimal filter input.\n */\nexport function optionalUint64DecimalFilterSchema(fieldName: string) {\n return v.pipe(\n OptionalTrimmedStringSchema,\n v.transform((value) => parseOptionalUint64DecimalStrict(value, fieldName)),\n );\n}\n\n/**\n * Creates a schema for positive bigint-like input.\n */\nexport function positiveBigintLikeSchema(message: string) {\n return v.pipe(\n v.union([\n v.bigint(),\n v.pipe(\n TrimmedStringSchema,\n v.regex(/^\\d+$/),\n v.transform((value) => BigInt(value)),\n ),\n ]),\n v.check((value) => value > 0n, message),\n );\n}\n\nexport function bigintStringInputSchema(fieldName: string) {\n return v.pipe(\n TrimmedStringSchema,\n v.regex(/^\\d+$/, `${fieldName} must be a decimal integer`),\n v.transform((value) => BigInt(value)),\n );\n}\n\nexport function positiveBigintStringInputSchema(fieldName: string) {\n return v.pipe(\n bigintStringInputSchema(fieldName),\n v.check((value) => value > 0n, `${fieldName} must be greater than 0`),\n );\n}\n\nexport const JsonObjectSchema = v.custom<JsonObject>(\n (input): input is JsonObject =>\n typeof input === \"object\" && input !== null && !Array.isArray(input),\n);\n"],"mappings":"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"}
@@ -16,7 +16,11 @@ type AuthAndPublicApiTransports = Pick<Transports, "authApi" | "publicApi">;
16
16
  */
17
17
  interface JwtAuthProvider {
18
18
  kind: "jwt";
19
- /** Typically wraps the configured browser auth token storage. */
19
+ /**
20
+ * Typically wraps the configured browser auth token storage. The SDK reads
21
+ * the current value for every request and for every realtime auth check, so
22
+ * keep this cheap and return the freshest credential rather than caching.
23
+ */
20
24
  getToken: () => string | null | Promise<string | null>;
21
25
  }
22
26
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"transports.d.ts","names":[],"sources":["../../src/shared/transports.ts"],"mappings":";;;UA8BiB;EACb,SAAS;EACT,WAAW;;;KAIH,oBAAoB,KAAK;;KAGzB,sBAAsB,KAAK;;KAG3B,6BAA6B,KAAK;;;;UAK7B;EACb;;EAEA,gCAAgC;;;;;;UAOnB;EACb;EACA,gCAAgC;;EAEhC,oBAAoB,oBAAoB,QAAQ"}
1
+ {"version":3,"file":"transports.d.ts","names":[],"sources":["../../src/shared/transports.ts"],"mappings":";;;UA8BiB;EACb,SAAS;EACT,WAAW;;;KAIH,oBAAoB,KAAK;;KAGzB,sBAAsB,KAAK;;KAG3B,6BAA6B,KAAK;;;;UAK7B;EACb;;;;;;EAMA,gCAAgC;;;;;;UAOnB;EACb;EACA,gCAAgC;;EAEhC,oBAAoB,oBAAoB,QAAQ"}
@@ -1 +1 @@
1
- {"version":3,"file":"transports.js","names":[],"sources":["../../src/shared/transports.ts"],"sourcesContent":["import { createConnectTransport } from \"@connectrpc/connect-web\";\nimport type { Transport, Interceptor } from \"@connectrpc/connect\";\nimport { toBinary, toJsonString } from \"@bufbuild/protobuf\";\nimport { signAsync } from \"@noble/ed25519\";\nimport { createErrorMappingTransport } from \"./connect-error-mapping.js\";\nimport {\n AuthenticationError,\n ConfigurationError,\n isAbortError,\n NetworkError,\n PolyesterError,\n} from \"./errors.js\";\n\nexport { isAbortError };\n\nexport type ConnectWireFormat = \"binary\" | \"json\";\n\nexport const POLYESTER_MOCK_HEADER = \"x-polyester-mock\";\n\nexport interface TransportConfig {\n apiUrl: string;\n interceptors?: Interceptor[];\n auth?: JwtAuthProvider | ApiKeyEd25519AuthProvider;\n /**\n * Connect wire format. Defaults to binary for production performance.\n * Use `json` for the API Playground visualization.\n */\n wireFormat?: ConnectWireFormat;\n}\n\nexport interface Transports {\n authApi: Transport;\n publicApi: Transport;\n}\n\n/** Connect transports available to services that call authenticated APIs. */\nexport type AuthApiTransports = Pick<Transports, \"authApi\">;\n\n/** Connect transports available to services that call public APIs. */\nexport type PublicApiTransports = Pick<Transports, \"publicApi\">;\n\n/** Connect transports available to services that call both public and authenticated APIs. */\nexport type AuthAndPublicApiTransports = Pick<Transports, \"authApi\" | \"publicApi\">;\n\n/**\n * Generic JWT auth for HTTP/Connect endpoints that follow the Bearer token contract.\n */\nexport interface JwtAuthProvider {\n kind: \"jwt\";\n /** Typically wraps the configured browser auth token storage. */\n getToken: () => string | null | Promise<string | null>;\n}\n\n/**\n * Generic Ed25519 API key auth for HTTP/Connect endpoints that follow the\n * X-API-KEY-ID / X-API-TIMESTAMP / X-API-SIGNATURE contract.\n */\nexport interface ApiKeyEd25519AuthProvider {\n kind: \"api-key-ed25519\";\n getKeyId: () => string | null | Promise<string | null>;\n /** Ed25519 secret key bytes (not hex) for signing. */\n getSecretKey: () => Uint8Array | null | Promise<Uint8Array | null>;\n}\n\nexport interface ApiKeyEd25519SigningRequest {\n url: string | URL;\n method: string;\n body?: Uint8Array;\n timestamp?: string;\n}\n\n/**\n * Returns the fetch implementation used by SDK transports.\n */\nexport function makeFetch(): typeof fetch {\n const wrappedFetch = Object.assign(\n async (input: Parameters<typeof fetch>[0], init?: Parameters<typeof fetch>[1]) => {\n // Normalize headers into a mutable Headers object\n const headers = new Headers(init?.headers);\n\n try {\n const res = await fetch(input, {\n ...init,\n headers,\n redirect: \"manual\",\n });\n\n return res;\n } catch (err) {\n if (isAbortError(err)) throw err;\n throw new NetworkError(\"Transport request failed\", { cause: err });\n }\n },\n fetch,\n );\n\n return wrappedFetch;\n}\n\n/**\n * Creates Connect transports for SDK service clients.\n */\nexport function createTransports(config: TransportConfig): Transports {\n const { apiUrl, interceptors = [], auth, wireFormat = \"binary\" } = config;\n const useBinaryFormat = wireFormat === \"binary\";\n const publicApi = createErrorMappingTransport(\n createConnectTransport({\n baseUrl: apiUrl,\n useBinaryFormat,\n interceptors,\n fetch: makeFetch(),\n }),\n );\n\n const authInterceptors = auth\n ? auth.kind === \"jwt\"\n ? [createAuthInterceptor(auth, { wireFormat }), ...interceptors]\n : [...interceptors, createAuthInterceptor(auth, { wireFormat })]\n : interceptors;\n const authApi = createErrorMappingTransport(\n createConnectTransport({\n baseUrl: apiUrl,\n useBinaryFormat,\n interceptors: authInterceptors,\n fetch: makeFetch(),\n }),\n );\n\n return { authApi, publicApi };\n}\n\n/**\n * Creates an interceptor that enables mock transport behavior.\n */\nexport function createMockInterceptor(getEnabled: () => boolean): Interceptor {\n return (next) => async (req) => {\n if (getEnabled()) req.header.set(POLYESTER_MOCK_HEADER, \"true\");\n return next(req);\n };\n}\n\nasync function sha256Hex(bytes: Uint8Array): Promise<string> {\n if (typeof crypto === \"undefined\" || !crypto.subtle) {\n throw new ConfigurationError(\"SHA-256 not available in this environment\");\n }\n const hash = await crypto.subtle.digest(\"SHA-256\", bytes.slice());\n return Array.from(new Uint8Array(hash), (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nlet lastTimestamp = 0;\nfunction nextTimestamp(): string {\n lastTimestamp = Math.max(lastTimestamp + 1, Date.now());\n return String(lastTimestamp);\n}\n\nfunction canonicalQueryString(params: URLSearchParams): string {\n const pairs: string[] = [];\n for (const [k, v] of params.entries()) {\n pairs.push(`${encodeURIComponent(k)}=${encodeURIComponent(v)}`);\n }\n pairs.sort();\n return pairs.join(\"&\");\n}\n\n/**\n * Creates API-key authentication headers for endpoints using the Polyester Ed25519 signing contract.\n */\nexport async function createApiKeyEd25519AuthHeaders(\n auth: ApiKeyEd25519AuthProvider,\n request: ApiKeyEd25519SigningRequest,\n): Promise<Record<string, string>> {\n let keyId: string | null;\n let secretKey: Uint8Array | null;\n try {\n [keyId, secretKey] = await Promise.all([auth.getKeyId(), auth.getSecretKey()]);\n } catch (cause) {\n if (cause instanceof PolyesterError) throw cause;\n throw new ConfigurationError(\"API key credential provider failed\", { cause });\n }\n if (!keyId || !secretKey) throw new ConfigurationError(\"Missing API key ID or secret key\");\n if (!(secretKey instanceof Uint8Array) || secretKey.byteLength !== 32) {\n throw new ConfigurationError(\"API key secret key must contain exactly 32 bytes\");\n }\n\n const urlObj = new URL(request.url);\n const timestamp = request.timestamp ?? nextTimestamp();\n const bodyHash = await sha256Hex(request.body ?? new Uint8Array(0));\n const canonicalQuery = canonicalQueryString(urlObj.searchParams);\n const canonical = `${timestamp}\\n${request.method}\\n${urlObj.pathname}\\n${canonicalQuery}\\n${bodyHash}`;\n const msgBytes = new TextEncoder().encode(canonical);\n const sig = await signAsync(msgBytes, secretKey);\n const signatureHex = Array.from(sig, (b: number) => b.toString(16).padStart(2, \"0\")).join(\"\");\n\n return {\n \"X-API-KEY-ID\": keyId,\n \"X-API-TIMESTAMP\": timestamp,\n \"X-API-SIGNATURE\": signatureHex,\n };\n}\n\n/**\n * Resolves a JWT credential and translates provider failures or invalid values\n * into stable SDK errors.\n */\nexport async function resolveJwtToken(auth: JwtAuthProvider): Promise<string | null> {\n let token: string | null;\n try {\n token = await auth.getToken();\n } catch (cause) {\n if (cause instanceof PolyesterError) throw cause;\n throw new AuthenticationError(\"JWT token provider failed\", { cause });\n }\n if (token !== null && typeof token !== \"string\") {\n throw new ConfigurationError(\"JWT token provider must return a string or null\");\n }\n return token;\n}\n\n/**\n * Creates an interceptor that attaches SDK authentication headers.\n */\nexport function createAuthInterceptor(\n auth: JwtAuthProvider | ApiKeyEd25519AuthProvider,\n options?: { wireFormat?: ConnectWireFormat },\n): Interceptor {\n return (next) => async (req) => {\n const wireFormat = options?.wireFormat ?? \"binary\";\n if (auth.kind === \"jwt\") {\n const token = await resolveJwtToken(auth);\n if (token) {\n req.header.set(\"Authorization\", `Bearer ${token}`);\n }\n } else if (auth.kind === \"api-key-ed25519\") {\n if (req.stream) {\n throw new ConfigurationError(\n \"API key authentication does not support streaming Connect RPCs\",\n );\n }\n // Unary request: serialize the message using the method's input schema.\n const inputSchema = req.method.input;\n const bodyBytes =\n wireFormat === \"json\"\n ? new TextEncoder().encode(toJsonString(inputSchema, req.message))\n : toBinary(inputSchema, req.message);\n\n const headers = await createApiKeyEd25519AuthHeaders(auth, {\n url: req.url,\n method: req.requestMethod,\n body: bodyBytes,\n });\n for (const [key, value] of Object.entries(headers)) {\n req.header.set(key, value);\n }\n }\n return next(req);\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"transports.js","names":[],"sources":["../../src/shared/transports.ts"],"sourcesContent":["import { createConnectTransport } from \"@connectrpc/connect-web\";\nimport type { Transport, Interceptor } from \"@connectrpc/connect\";\nimport { toBinary, toJsonString } from \"@bufbuild/protobuf\";\nimport { signAsync } from \"@noble/ed25519\";\nimport { createErrorMappingTransport } from \"./connect-error-mapping.js\";\nimport {\n AuthenticationError,\n ConfigurationError,\n isAbortError,\n NetworkError,\n PolyesterError,\n} from \"./errors.js\";\n\nexport { isAbortError };\n\nexport type ConnectWireFormat = \"binary\" | \"json\";\n\nexport const POLYESTER_MOCK_HEADER = \"x-polyester-mock\";\n\nexport interface TransportConfig {\n apiUrl: string;\n interceptors?: Interceptor[];\n auth?: JwtAuthProvider | ApiKeyEd25519AuthProvider;\n /**\n * Connect wire format. Defaults to binary for production performance.\n * Use `json` for the API Playground visualization.\n */\n wireFormat?: ConnectWireFormat;\n}\n\nexport interface Transports {\n authApi: Transport;\n publicApi: Transport;\n}\n\n/** Connect transports available to services that call authenticated APIs. */\nexport type AuthApiTransports = Pick<Transports, \"authApi\">;\n\n/** Connect transports available to services that call public APIs. */\nexport type PublicApiTransports = Pick<Transports, \"publicApi\">;\n\n/** Connect transports available to services that call both public and authenticated APIs. */\nexport type AuthAndPublicApiTransports = Pick<Transports, \"authApi\" | \"publicApi\">;\n\n/**\n * Generic JWT auth for HTTP/Connect endpoints that follow the Bearer token contract.\n */\nexport interface JwtAuthProvider {\n kind: \"jwt\";\n /**\n * Typically wraps the configured browser auth token storage. The SDK reads\n * the current value for every request and for every realtime auth check, so\n * keep this cheap and return the freshest credential rather than caching.\n */\n getToken: () => string | null | Promise<string | null>;\n}\n\n/**\n * Generic Ed25519 API key auth for HTTP/Connect endpoints that follow the\n * X-API-KEY-ID / X-API-TIMESTAMP / X-API-SIGNATURE contract.\n */\nexport interface ApiKeyEd25519AuthProvider {\n kind: \"api-key-ed25519\";\n getKeyId: () => string | null | Promise<string | null>;\n /** Ed25519 secret key bytes (not hex) for signing. */\n getSecretKey: () => Uint8Array | null | Promise<Uint8Array | null>;\n}\n\nexport interface ApiKeyEd25519SigningRequest {\n url: string | URL;\n method: string;\n body?: Uint8Array;\n timestamp?: string;\n}\n\n/**\n * Returns the fetch implementation used by SDK transports.\n */\nexport function makeFetch(): typeof fetch {\n const wrappedFetch = Object.assign(\n async (input: Parameters<typeof fetch>[0], init?: Parameters<typeof fetch>[1]) => {\n // Normalize headers into a mutable Headers object\n const headers = new Headers(init?.headers);\n\n try {\n const res = await fetch(input, {\n ...init,\n headers,\n redirect: \"manual\",\n });\n\n return res;\n } catch (err) {\n if (isAbortError(err)) throw err;\n throw new NetworkError(\"Transport request failed\", { cause: err });\n }\n },\n fetch,\n );\n\n return wrappedFetch;\n}\n\n/**\n * Creates Connect transports for SDK service clients.\n */\nexport function createTransports(config: TransportConfig): Transports {\n const { apiUrl, interceptors = [], auth, wireFormat = \"binary\" } = config;\n const useBinaryFormat = wireFormat === \"binary\";\n const publicApi = createErrorMappingTransport(\n createConnectTransport({\n baseUrl: apiUrl,\n useBinaryFormat,\n interceptors,\n fetch: makeFetch(),\n }),\n );\n\n const authInterceptors = auth\n ? auth.kind === \"jwt\"\n ? [createAuthInterceptor(auth, { wireFormat }), ...interceptors]\n : [...interceptors, createAuthInterceptor(auth, { wireFormat })]\n : interceptors;\n const authApi = createErrorMappingTransport(\n createConnectTransport({\n baseUrl: apiUrl,\n useBinaryFormat,\n interceptors: authInterceptors,\n fetch: makeFetch(),\n }),\n );\n\n return { authApi, publicApi };\n}\n\n/**\n * Creates an interceptor that enables mock transport behavior.\n */\nexport function createMockInterceptor(getEnabled: () => boolean): Interceptor {\n return (next) => async (req) => {\n if (getEnabled()) req.header.set(POLYESTER_MOCK_HEADER, \"true\");\n return next(req);\n };\n}\n\nasync function sha256Hex(bytes: Uint8Array): Promise<string> {\n if (typeof crypto === \"undefined\" || !crypto.subtle) {\n throw new ConfigurationError(\"SHA-256 not available in this environment\");\n }\n const hash = await crypto.subtle.digest(\"SHA-256\", bytes.slice());\n return Array.from(new Uint8Array(hash), (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nlet lastTimestamp = 0;\nfunction nextTimestamp(): string {\n lastTimestamp = Math.max(lastTimestamp + 1, Date.now());\n return String(lastTimestamp);\n}\n\nfunction canonicalQueryString(params: URLSearchParams): string {\n const pairs: string[] = [];\n for (const [k, v] of params.entries()) {\n pairs.push(`${encodeURIComponent(k)}=${encodeURIComponent(v)}`);\n }\n pairs.sort();\n return pairs.join(\"&\");\n}\n\n/**\n * Creates API-key authentication headers for endpoints using the Polyester Ed25519 signing contract.\n */\nexport async function createApiKeyEd25519AuthHeaders(\n auth: ApiKeyEd25519AuthProvider,\n request: ApiKeyEd25519SigningRequest,\n): Promise<Record<string, string>> {\n let keyId: string | null;\n let secretKey: Uint8Array | null;\n try {\n [keyId, secretKey] = await Promise.all([auth.getKeyId(), auth.getSecretKey()]);\n } catch (cause) {\n if (cause instanceof PolyesterError) throw cause;\n throw new ConfigurationError(\"API key credential provider failed\", { cause });\n }\n if (!keyId || !secretKey) throw new ConfigurationError(\"Missing API key ID or secret key\");\n if (!(secretKey instanceof Uint8Array) || secretKey.byteLength !== 32) {\n throw new ConfigurationError(\"API key secret key must contain exactly 32 bytes\");\n }\n\n const urlObj = new URL(request.url);\n const timestamp = request.timestamp ?? nextTimestamp();\n const bodyHash = await sha256Hex(request.body ?? new Uint8Array(0));\n const canonicalQuery = canonicalQueryString(urlObj.searchParams);\n const canonical = `${timestamp}\\n${request.method}\\n${urlObj.pathname}\\n${canonicalQuery}\\n${bodyHash}`;\n const msgBytes = new TextEncoder().encode(canonical);\n const sig = await signAsync(msgBytes, secretKey);\n const signatureHex = Array.from(sig, (b: number) => b.toString(16).padStart(2, \"0\")).join(\"\");\n\n return {\n \"X-API-KEY-ID\": keyId,\n \"X-API-TIMESTAMP\": timestamp,\n \"X-API-SIGNATURE\": signatureHex,\n };\n}\n\n/**\n * Resolves a JWT credential and translates provider failures or invalid values\n * into stable SDK errors.\n */\nexport async function resolveJwtToken(auth: JwtAuthProvider): Promise<string | null> {\n let token: string | null;\n try {\n token = await auth.getToken();\n } catch (cause) {\n if (cause instanceof PolyesterError) throw cause;\n throw new AuthenticationError(\"JWT token provider failed\", { cause });\n }\n if (token !== null && typeof token !== \"string\") {\n throw new ConfigurationError(\"JWT token provider must return a string or null\");\n }\n return token;\n}\n\n/**\n * Creates an interceptor that attaches SDK authentication headers.\n */\nexport function createAuthInterceptor(\n auth: JwtAuthProvider | ApiKeyEd25519AuthProvider,\n options?: { wireFormat?: ConnectWireFormat },\n): Interceptor {\n return (next) => async (req) => {\n const wireFormat = options?.wireFormat ?? \"binary\";\n if (auth.kind === \"jwt\") {\n const token = await resolveJwtToken(auth);\n if (token) {\n req.header.set(\"Authorization\", `Bearer ${token}`);\n }\n } else if (auth.kind === \"api-key-ed25519\") {\n if (req.stream) {\n throw new ConfigurationError(\n \"API key authentication does not support streaming Connect RPCs\",\n );\n }\n // Unary request: serialize the message using the method's input schema.\n const inputSchema = req.method.input;\n const bodyBytes =\n wireFormat === \"json\"\n ? new TextEncoder().encode(toJsonString(inputSchema, req.message))\n : toBinary(inputSchema, req.message);\n\n const headers = await createApiKeyEd25519AuthHeaders(auth, {\n url: req.url,\n method: req.requestMethod,\n body: bodyBytes,\n });\n for (const [key, value] of Object.entries(headers)) {\n req.header.set(key, value);\n }\n }\n return next(req);\n };\n}\n"],"mappings":"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"}
@@ -24,6 +24,13 @@ function tsNsToTimestamp(tsNs) {
24
24
  nanos: Number(nanos)
25
25
  });
26
26
  }
27
+ /**
28
+ * Converts integer epoch milliseconds to a proto Timestamp. Handles negative
29
+ * values, unlike naive `(ms % 1000) * 1e6` nanos math.
30
+ */
31
+ function msToTimestamp(ms) {
32
+ return tsNsToTimestamp(BigInt(ms) * 1000000n);
33
+ }
27
34
  function timestampSeconds(value) {
28
35
  if (typeof value === "bigint") return value;
29
36
  if (typeof value === "number") return Number.isSafeInteger(value) ? BigInt(value) : null;
@@ -58,6 +65,6 @@ function timestampToMs(value) {
58
65
  return Number.isSafeInteger(output) ? output : null;
59
66
  }
60
67
  //#endregion
61
- export { timestampToMs, toTimestamp, tsNsToTimestamp };
68
+ export { msToTimestamp, timestampToMs, toTimestamp, tsNsToTimestamp };
62
69
 
63
70
  //# sourceMappingURL=timestamp.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"timestamp.js","names":[],"sources":["../../src/utils/timestamp.ts"],"sourcesContent":["import type { Timestamp } from \"@bufbuild/protobuf/wkt\";\n\n/**\n * Creates a proto Timestamp from seconds and nanos parts.\n */\nexport function toTimestamp({ seconds, nanos }: { seconds: bigint; nanos: number }): Timestamp {\n return { seconds, nanos } as Timestamp;\n}\n\n/**\n * Converts epoch nanoseconds to a proto Timestamp.\n */\nexport function tsNsToTimestamp(tsNs: bigint | undefined): Timestamp | undefined {\n if (tsNs === undefined) return undefined;\n\n let seconds = tsNs / 1_000_000_000n;\n let nanos = tsNs % 1_000_000_000n;\n if (nanos < 0n) {\n seconds -= 1n;\n nanos += 1_000_000_000n;\n }\n\n return toTimestamp({\n seconds,\n nanos: Number(nanos),\n });\n}\n\nfunction timestampSeconds(value: unknown): bigint | null {\n if (typeof value === \"bigint\") return value;\n if (typeof value === \"number\") {\n return Number.isSafeInteger(value) ? BigInt(value) : null;\n }\n if (typeof value !== \"string\") return null;\n\n const trimmed = value.trim();\n return /^-?\\d+$/.test(trimmed) ? BigInt(trimmed) : null;\n}\n\nfunction timestampNanos(value: unknown): bigint | null {\n if (value === undefined) return 0n;\n if (\n typeof value !== \"number\" ||\n !Number.isInteger(value) ||\n value < 0 ||\n value >= 1_000_000_000\n ) {\n return null;\n }\n return BigInt(value);\n}\n\n/**\n * Converts supported timestamp-like values to epoch milliseconds.\n */\nexport function timestampToMs(value: unknown): number | null {\n if (value == null) return null;\n\n if (value instanceof Date) {\n const ms = value.getTime();\n return Number.isFinite(ms) ? ms : null;\n }\n\n if (typeof value === \"string\") {\n const ms = Date.parse(value);\n return Number.isFinite(ms) ? ms : null;\n }\n\n if (typeof value !== \"object\" || !(\"seconds\" in value)) return null;\n\n const seconds = timestampSeconds(value.seconds);\n const nanos = timestampNanos(\"nanos\" in value ? value.nanos : undefined);\n if (seconds === null || nanos === null) return null;\n\n const milliseconds = (seconds * 1_000_000_000n + nanos) / 1_000_000n;\n const output = Number(milliseconds);\n return Number.isSafeInteger(output) ? output : null;\n}\n"],"mappings":";;;;AAKA,SAAgB,YAAY,EAAE,SAAS,SAAwD;CAC3F,OAAO;EAAE;EAAS;CAAM;AAC5B;;;;AAKA,SAAgB,gBAAgB,MAAiD;CAC7E,IAAI,SAAS,KAAA,GAAW,OAAO,KAAA;CAE/B,IAAI,UAAU,OAAO;CACrB,IAAI,QAAQ,OAAO;CACnB,IAAI,QAAQ,IAAI;EACZ,WAAW;EACX,SAAS;CACb;CAEA,OAAO,YAAY;EACf;EACA,OAAO,OAAO,KAAK;CACvB,CAAC;AACL;AAEA,SAAS,iBAAiB,OAA+B;CACrD,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,IAAI,OAAO,UAAU,UACjB,OAAO,OAAO,cAAc,KAAK,IAAI,OAAO,KAAK,IAAI;CAEzD,IAAI,OAAO,UAAU,UAAU,OAAO;CAEtC,MAAM,UAAU,MAAM,KAAK;CAC3B,OAAO,UAAU,KAAK,OAAO,IAAI,OAAO,OAAO,IAAI;AACvD;AAEA,SAAS,eAAe,OAA+B;CACnD,IAAI,UAAU,KAAA,GAAW,OAAO;CAChC,IACI,OAAO,UAAU,YACjB,CAAC,OAAO,UAAU,KAAK,KACvB,QAAQ,KACR,SAAS,KAET,OAAO;CAEX,OAAO,OAAO,KAAK;AACvB;;;;AAKA,SAAgB,cAAc,OAA+B;CACzD,IAAI,SAAS,MAAM,OAAO;CAE1B,IAAI,iBAAiB,MAAM;EACvB,MAAM,KAAK,MAAM,QAAQ;EACzB,OAAO,OAAO,SAAS,EAAE,IAAI,KAAK;CACtC;CAEA,IAAI,OAAO,UAAU,UAAU;EAC3B,MAAM,KAAK,KAAK,MAAM,KAAK;EAC3B,OAAO,OAAO,SAAS,EAAE,IAAI,KAAK;CACtC;CAEA,IAAI,OAAO,UAAU,YAAY,EAAE,aAAa,QAAQ,OAAO;CAE/D,MAAM,UAAU,iBAAiB,MAAM,OAAO;CAC9C,MAAM,QAAQ,eAAe,WAAW,QAAQ,MAAM,QAAQ,KAAA,CAAS;CACvE,IAAI,YAAY,QAAQ,UAAU,MAAM,OAAO;CAE/C,MAAM,gBAAgB,UAAU,cAAiB,SAAS;CAC1D,MAAM,SAAS,OAAO,YAAY;CAClC,OAAO,OAAO,cAAc,MAAM,IAAI,SAAS;AACnD"}
1
+ {"version":3,"file":"timestamp.js","names":[],"sources":["../../src/utils/timestamp.ts"],"sourcesContent":["import type { Timestamp } from \"@bufbuild/protobuf/wkt\";\n\n/**\n * Creates a proto Timestamp from seconds and nanos parts.\n */\nexport function toTimestamp({ seconds, nanos }: { seconds: bigint; nanos: number }): Timestamp {\n return { seconds, nanos } as Timestamp;\n}\n\n/**\n * Converts epoch nanoseconds to a proto Timestamp.\n */\nexport function tsNsToTimestamp(tsNs: bigint | undefined): Timestamp | undefined {\n if (tsNs === undefined) return undefined;\n\n let seconds = tsNs / 1_000_000_000n;\n let nanos = tsNs % 1_000_000_000n;\n if (nanos < 0n) {\n seconds -= 1n;\n nanos += 1_000_000_000n;\n }\n\n return toTimestamp({\n seconds,\n nanos: Number(nanos),\n });\n}\n\n/**\n * Converts integer epoch milliseconds to a proto Timestamp. Handles negative\n * values, unlike naive `(ms % 1000) * 1e6` nanos math.\n */\nexport function msToTimestamp(ms: number): Timestamp {\n return tsNsToTimestamp(BigInt(ms) * 1_000_000n) as Timestamp;\n}\n\nfunction timestampSeconds(value: unknown): bigint | null {\n if (typeof value === \"bigint\") return value;\n if (typeof value === \"number\") {\n return Number.isSafeInteger(value) ? BigInt(value) : null;\n }\n if (typeof value !== \"string\") return null;\n\n const trimmed = value.trim();\n return /^-?\\d+$/.test(trimmed) ? BigInt(trimmed) : null;\n}\n\nfunction timestampNanos(value: unknown): bigint | null {\n if (value === undefined) return 0n;\n if (\n typeof value !== \"number\" ||\n !Number.isInteger(value) ||\n value < 0 ||\n value >= 1_000_000_000\n ) {\n return null;\n }\n return BigInt(value);\n}\n\n/**\n * Converts supported timestamp-like values to epoch milliseconds.\n */\nexport function timestampToMs(value: unknown): number | null {\n if (value == null) return null;\n\n if (value instanceof Date) {\n const ms = value.getTime();\n return Number.isFinite(ms) ? ms : null;\n }\n\n if (typeof value === \"string\") {\n const ms = Date.parse(value);\n return Number.isFinite(ms) ? ms : null;\n }\n\n if (typeof value !== \"object\" || !(\"seconds\" in value)) return null;\n\n const seconds = timestampSeconds(value.seconds);\n const nanos = timestampNanos(\"nanos\" in value ? value.nanos : undefined);\n if (seconds === null || nanos === null) return null;\n\n const milliseconds = (seconds * 1_000_000_000n + nanos) / 1_000_000n;\n const output = Number(milliseconds);\n return Number.isSafeInteger(output) ? output : null;\n}\n"],"mappings":";;;;AAKA,SAAgB,YAAY,EAAE,SAAS,SAAwD;CAC3F,OAAO;EAAE;EAAS;CAAM;AAC5B;;;;AAKA,SAAgB,gBAAgB,MAAiD;CAC7E,IAAI,SAAS,KAAA,GAAW,OAAO,KAAA;CAE/B,IAAI,UAAU,OAAO;CACrB,IAAI,QAAQ,OAAO;CACnB,IAAI,QAAQ,IAAI;EACZ,WAAW;EACX,SAAS;CACb;CAEA,OAAO,YAAY;EACf;EACA,OAAO,OAAO,KAAK;CACvB,CAAC;AACL;;;;;AAMA,SAAgB,cAAc,IAAuB;CACjD,OAAO,gBAAgB,OAAO,EAAE,IAAI,QAAU;AAClD;AAEA,SAAS,iBAAiB,OAA+B;CACrD,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,IAAI,OAAO,UAAU,UACjB,OAAO,OAAO,cAAc,KAAK,IAAI,OAAO,KAAK,IAAI;CAEzD,IAAI,OAAO,UAAU,UAAU,OAAO;CAEtC,MAAM,UAAU,MAAM,KAAK;CAC3B,OAAO,UAAU,KAAK,OAAO,IAAI,OAAO,OAAO,IAAI;AACvD;AAEA,SAAS,eAAe,OAA+B;CACnD,IAAI,UAAU,KAAA,GAAW,OAAO;CAChC,IACI,OAAO,UAAU,YACjB,CAAC,OAAO,UAAU,KAAK,KACvB,QAAQ,KACR,SAAS,KAET,OAAO;CAEX,OAAO,OAAO,KAAK;AACvB;;;;AAKA,SAAgB,cAAc,OAA+B;CACzD,IAAI,SAAS,MAAM,OAAO;CAE1B,IAAI,iBAAiB,MAAM;EACvB,MAAM,KAAK,MAAM,QAAQ;EACzB,OAAO,OAAO,SAAS,EAAE,IAAI,KAAK;CACtC;CAEA,IAAI,OAAO,UAAU,UAAU;EAC3B,MAAM,KAAK,KAAK,MAAM,KAAK;EAC3B,OAAO,OAAO,SAAS,EAAE,IAAI,KAAK;CACtC;CAEA,IAAI,OAAO,UAAU,YAAY,EAAE,aAAa,QAAQ,OAAO;CAE/D,MAAM,UAAU,iBAAiB,MAAM,OAAO;CAC9C,MAAM,QAAQ,eAAe,WAAW,QAAQ,MAAM,QAAQ,KAAA,CAAS;CACvE,IAAI,YAAY,QAAQ,UAAU,MAAM,OAAO;CAE/C,MAAM,gBAAgB,UAAU,cAAiB,SAAS;CAC1D,MAAM,SAAS,OAAO,YAAY;CAClC,OAAO,OAAO,cAAc,MAAM,IAAI,SAAS;AACnD"}
@@ -1 +1 @@
1
- {"version":3,"file":"wired-services.d.ts","names":[],"sources":["../src/wired-services.ts"],"mappings":";;;;;;;;;;;cA2Ca,oCAAoC"}
1
+ {"version":3,"file":"wired-services.d.ts","names":[],"sources":["../src/wired-services.ts"],"mappings":";;;;;;;;;;;cA4Ca,oCAAoC"}
@@ -23,6 +23,7 @@ import { GuardSignerService } from "./gen/chain/guard/v1/guard_signer_pb.js";
23
23
  import { SocialVerificationService } from "./gen/auth/v1/social_verification_pb.js";
24
24
  import { WhiteboardService } from "./gen/collab/v1/whiteboard_pb.js";
25
25
  import { ZipperService } from "./gen/chain/zipper/v1/zipper_pb.js";
26
+ import { ClaimsService } from "./gen/claims/v1/claims_pb.js";
26
27
  import { VIPService } from "./gen/vip/v1/vip_pb.js";
27
28
  import { FeeService } from "./gen/fees/v1/fees_pb.js";
28
29
  import { RateLimitService } from "./gen/ratelimit/v1/ratelimit_pb.js";
@@ -41,6 +42,7 @@ const WIRED_SERVICE_DESCRIPTORS = [
41
42
  ApiKeyService,
42
43
  AuthService,
43
44
  ChainAnalyticsService,
45
+ ClaimsService,
44
46
  DepositAddressService,
45
47
  FeeService,
46
48
  GuardSignerService,
@@ -1 +1 @@
1
- {"version":3,"file":"wired-services.js","names":[],"sources":["../src/wired-services.ts"],"sourcesContent":["import type { DescService } from \"@bufbuild/protobuf\";\nimport { AddressBookService } from \"./gen/auth/v1/address_book_pb.js\";\nimport { ApiKeyService } from \"./gen/auth/v1/api_keys_pb.js\";\nimport { AuthService } from \"./gen/auth/v1/auth_pb.js\";\nimport { MFAService } from \"./gen/auth/v1/mfa_pb.js\";\nimport { PolicyService } from \"./gen/auth/v1/policies_pb.js\";\nimport { ProfileService } from \"./gen/auth/v1/profile_pb.js\";\nimport { ResolveService } from \"./gen/auth/v1/resolve_pb.js\";\nimport { SocialVerificationService } from \"./gen/auth/v1/social_verification_pb.js\";\nimport {\n SubaccountRoleService,\n SubaccountService,\n SubaccountViewService,\n} from \"./gen/auth/v1/subaccounts_pb.js\";\nimport { ChainAnalyticsService } from \"./gen/chain/analytics/v1/analytics_read_pb.js\";\nimport { DepositAddressService } from \"./gen/chain/deposit/v1/deposit_pb.js\";\nimport { GuardSignerService } from \"./gen/chain/guard/v1/guard_signer_pb.js\";\nimport { LifecycleReadService } from \"./gen/chain/lifecycle/v1/lifecycle_read_pb.js\";\nimport { WithdrawService } from \"./gen/chain/withdraw/v1/withdraw_pb.js\";\nimport { ZipperService } from \"./gen/chain/zipper/v1/zipper_pb.js\";\nimport { WhiteboardService } from \"./gen/collab/v1/whiteboard_pb.js\";\nimport { FeeService } from \"./gen/fees/v1/fees_pb.js\";\nimport { LedgerReadService } from \"./gen/ledger/read/v1/ledger_read_pb.js\";\nimport { HeatmapService } from \"./gen/marketdata/v1/heatmap_pb.js\";\nimport { MarketDataService } from \"./gen/marketdata/v1/marketdata_pb.js\";\nimport { MarketOverviewService } from \"./gen/marketoverview/v1/marketoverview_pb.js\";\nimport { OrderbookService } from \"./gen/orderbook/v1/orderbook_pb.js\";\nimport { OrdersService } from \"./gen/orders/v1/orders_pb.js\";\nimport { OrdersReadService } from \"./gen/orders/v1/orders_read_pb.js\";\nimport { RateLimitService } from \"./gen/ratelimit/v1/ratelimit_pb.js\";\nimport { InternalTransferService } from \"./gen/transfer/v1/internal_transfer_pb.js\";\nimport { TriggersService } from \"./gen/triggers/v1/triggers_pb.js\";\nimport { VIPService } from \"./gen/vip/v1/vip_pb.js\";\n\n/**\n * Every proto service descriptor the SDK's service layer wires a client for.\n * This is the authoritative surface for transport-level mocks: an in-memory\n * transport that routes all of these can serve the whole SDK.\n *\n * Kept in sync mechanically — `wired-services.test.ts` scans every\n * `createClient(...)` call site under `src/services` and `src/realtime` and\n * fails when this list drifts from the code.\n */\nexport const WIRED_SERVICE_DESCRIPTORS: readonly DescService[] = [\n AddressBookService,\n ApiKeyService,\n AuthService,\n ChainAnalyticsService,\n DepositAddressService,\n FeeService,\n GuardSignerService,\n HeatmapService,\n InternalTransferService,\n LedgerReadService,\n LifecycleReadService,\n MarketDataService,\n MarketOverviewService,\n MFAService,\n OrderbookService,\n OrdersReadService,\n OrdersService,\n PolicyService,\n ProfileService,\n RateLimitService,\n ResolveService,\n SocialVerificationService,\n SubaccountRoleService,\n SubaccountService,\n SubaccountViewService,\n TriggersService,\n VIPService,\n WhiteboardService,\n WithdrawService,\n ZipperService,\n];\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,MAAa,4BAAoD;CAC7D;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACJ"}
1
+ {"version":3,"file":"wired-services.js","names":[],"sources":["../src/wired-services.ts"],"sourcesContent":["import type { DescService } from \"@bufbuild/protobuf\";\nimport { AddressBookService } from \"./gen/auth/v1/address_book_pb.js\";\nimport { ApiKeyService } from \"./gen/auth/v1/api_keys_pb.js\";\nimport { AuthService } from \"./gen/auth/v1/auth_pb.js\";\nimport { MFAService } from \"./gen/auth/v1/mfa_pb.js\";\nimport { PolicyService } from \"./gen/auth/v1/policies_pb.js\";\nimport { ProfileService } from \"./gen/auth/v1/profile_pb.js\";\nimport { ResolveService } from \"./gen/auth/v1/resolve_pb.js\";\nimport { SocialVerificationService } from \"./gen/auth/v1/social_verification_pb.js\";\nimport {\n SubaccountRoleService,\n SubaccountService,\n SubaccountViewService,\n} from \"./gen/auth/v1/subaccounts_pb.js\";\nimport { ChainAnalyticsService } from \"./gen/chain/analytics/v1/analytics_read_pb.js\";\nimport { DepositAddressService } from \"./gen/chain/deposit/v1/deposit_pb.js\";\nimport { GuardSignerService } from \"./gen/chain/guard/v1/guard_signer_pb.js\";\nimport { LifecycleReadService } from \"./gen/chain/lifecycle/v1/lifecycle_read_pb.js\";\nimport { WithdrawService } from \"./gen/chain/withdraw/v1/withdraw_pb.js\";\nimport { ZipperService } from \"./gen/chain/zipper/v1/zipper_pb.js\";\nimport { ClaimsService } from \"./gen/claims/v1/claims_pb.js\";\nimport { WhiteboardService } from \"./gen/collab/v1/whiteboard_pb.js\";\nimport { FeeService } from \"./gen/fees/v1/fees_pb.js\";\nimport { LedgerReadService } from \"./gen/ledger/read/v1/ledger_read_pb.js\";\nimport { HeatmapService } from \"./gen/marketdata/v1/heatmap_pb.js\";\nimport { MarketDataService } from \"./gen/marketdata/v1/marketdata_pb.js\";\nimport { MarketOverviewService } from \"./gen/marketoverview/v1/marketoverview_pb.js\";\nimport { OrderbookService } from \"./gen/orderbook/v1/orderbook_pb.js\";\nimport { OrdersService } from \"./gen/orders/v1/orders_pb.js\";\nimport { OrdersReadService } from \"./gen/orders/v1/orders_read_pb.js\";\nimport { RateLimitService } from \"./gen/ratelimit/v1/ratelimit_pb.js\";\nimport { InternalTransferService } from \"./gen/transfer/v1/internal_transfer_pb.js\";\nimport { TriggersService } from \"./gen/triggers/v1/triggers_pb.js\";\nimport { VIPService } from \"./gen/vip/v1/vip_pb.js\";\n\n/**\n * Every proto service descriptor the SDK's service layer wires a client for.\n * This is the authoritative surface for transport-level mocks: an in-memory\n * transport that routes all of these can serve the whole SDK.\n *\n * Kept in sync mechanically — `wired-services.test.ts` scans every\n * `createClient(...)` call site under `src/services` and `src/realtime` and\n * fails when this list drifts from the code.\n */\nexport const WIRED_SERVICE_DESCRIPTORS: readonly DescService[] = [\n AddressBookService,\n ApiKeyService,\n AuthService,\n ChainAnalyticsService,\n ClaimsService,\n DepositAddressService,\n FeeService,\n GuardSignerService,\n HeatmapService,\n InternalTransferService,\n LedgerReadService,\n LifecycleReadService,\n MarketDataService,\n MarketOverviewService,\n MFAService,\n OrderbookService,\n OrdersReadService,\n OrdersService,\n PolicyService,\n ProfileService,\n RateLimitService,\n ResolveService,\n SocialVerificationService,\n SubaccountRoleService,\n SubaccountService,\n SubaccountViewService,\n TriggersService,\n VIPService,\n WhiteboardService,\n WithdrawService,\n ZipperService,\n];\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CA,MAAa,4BAAoD;CAC7D;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACJ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@polyester/sdk",
3
- "version": "0.24.0",
3
+ "version": "0.25.0",
4
4
  "private": false,
5
5
  "description": "TypeScript SDK providing access to APIs on Polyester Exchange.",
6
6
  "homepage": "https://github.com/Fabric-Labs/polyester-sdk-typescript#readme",