@polyester/sdk 0.9.1 → 0.11.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 (170) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/dist/catalogs/readers.d.ts.map +1 -1
  3. package/dist/catalogs/readers.js +22 -0
  4. package/dist/catalogs/readers.js.map +1 -1
  5. package/dist/core-client.d.ts.map +1 -1
  6. package/dist/core-client.js +49 -15
  7. package/dist/core-client.js.map +1 -1
  8. package/dist/environment.d.ts.map +1 -1
  9. package/dist/environment.js +3 -2
  10. package/dist/environment.js.map +1 -1
  11. package/dist/gen/auth/v1/api_keys_pb.d.ts +8 -7
  12. package/dist/gen/auth/v1/api_keys_pb.d.ts.map +1 -1
  13. package/dist/gen/auth/v1/api_keys_pb.js.map +1 -1
  14. package/dist/gen/auth/v1/policies_pb.d.ts +8 -4
  15. package/dist/gen/auth/v1/policies_pb.d.ts.map +1 -1
  16. package/dist/gen/auth/v1/policies_pb.js.map +1 -1
  17. package/dist/gen/auth/v1/subaccounts_pb.d.ts +382 -18
  18. package/dist/gen/auth/v1/subaccounts_pb.d.ts.map +1 -1
  19. package/dist/gen/auth/v1/subaccounts_pb.js +253 -38
  20. package/dist/gen/auth/v1/subaccounts_pb.js.map +1 -1
  21. package/dist/gen/orders/v1/orders_pb.d.ts +2 -2
  22. package/dist/gen/orders/v1/orders_pb.js.map +1 -1
  23. package/dist/gen/orders/v1/orders_read_pb.d.ts +8 -0
  24. package/dist/gen/orders/v1/orders_read_pb.d.ts.map +1 -1
  25. package/dist/gen/orders/v1/orders_read_pb.js +1 -1
  26. package/dist/gen/orders/v1/orders_read_pb.js.map +1 -1
  27. package/dist/gen/ratelimit/v1/ratelimit_pb.d.ts +2 -2
  28. package/dist/gen/ratelimit/v1/ratelimit_pb.js +1 -1
  29. package/dist/gen/ratelimit/v1/ratelimit_pb.js.map +1 -1
  30. package/dist/gen/triggers/v1/triggers_pb.d.ts +4 -4
  31. package/dist/gen/triggers/v1/triggers_pb.js.map +1 -1
  32. package/dist/index.d.ts +2 -2
  33. package/dist/realtime/client.d.ts.map +1 -1
  34. package/dist/realtime/client.js +13 -5
  35. package/dist/realtime/client.js.map +1 -1
  36. package/dist/realtime/ready-gated-subscription.js +68 -0
  37. package/dist/realtime/ready-gated-subscription.js.map +1 -0
  38. package/dist/realtime/snapshot-then-stream.js +19 -10
  39. package/dist/realtime/snapshot-then-stream.js.map +1 -1
  40. package/dist/server-client.d.ts +3 -1
  41. package/dist/server-client.d.ts.map +1 -1
  42. package/dist/server-client.js +9 -4
  43. package/dist/server-client.js.map +1 -1
  44. package/dist/services/auth/session.d.ts.map +1 -1
  45. package/dist/services/auth/session.js +4 -1
  46. package/dist/services/auth/session.js.map +1 -1
  47. package/dist/services/auth/token-storage.js +2 -2
  48. package/dist/services/auth/token-storage.js.map +1 -1
  49. package/dist/services/balances/balances.js +5 -8
  50. package/dist/services/balances/balances.js.map +1 -1
  51. package/dist/services/candles/candles.js +9 -12
  52. package/dist/services/candles/candles.js.map +1 -1
  53. package/dist/services/heatmap/heatmap.js +5 -8
  54. package/dist/services/heatmap/heatmap.js.map +1 -1
  55. package/dist/services/lifecycle/lifecycle.schemas.js +1 -1
  56. package/dist/services/market-data/market-data.d.ts.map +1 -1
  57. package/dist/services/market-data/market-data.js +5 -8
  58. package/dist/services/market-data/market-data.js.map +1 -1
  59. package/dist/services/market-data/market-data.schemas.d.ts.map +1 -1
  60. package/dist/services/market-data/market-data.schemas.js +3 -2
  61. package/dist/services/market-data/market-data.schemas.js.map +1 -1
  62. package/dist/services/market-overview/market-overview.d.ts.map +1 -1
  63. package/dist/services/market-overview/market-overview.js +7 -13
  64. package/dist/services/market-overview/market-overview.js.map +1 -1
  65. package/dist/services/orderbook/orderbook.d.ts.map +1 -1
  66. package/dist/services/orderbook/orderbook.js +18 -11
  67. package/dist/services/orderbook/orderbook.js.map +1 -1
  68. package/dist/services/orders/orders-batch.schemas.d.ts +6 -22
  69. package/dist/services/orders/orders-batch.schemas.d.ts.map +1 -1
  70. package/dist/services/orders/orders-batch.schemas.js +23 -20
  71. package/dist/services/orders/orders-batch.schemas.js.map +1 -1
  72. package/dist/services/orders/orders-identifiers.schemas.js +6 -1
  73. package/dist/services/orders/orders-identifiers.schemas.js.map +1 -1
  74. package/dist/services/orders/orders-input.schemas.d.ts +11 -43
  75. package/dist/services/orders/orders-input.schemas.d.ts.map +1 -1
  76. package/dist/services/orders/orders-input.schemas.js +10 -11
  77. package/dist/services/orders/orders-input.schemas.js.map +1 -1
  78. package/dist/services/orders/orders-modify.schemas.d.ts +1 -25
  79. package/dist/services/orders/orders-modify.schemas.d.ts.map +1 -1
  80. package/dist/services/orders/orders-modify.schemas.js +2 -4
  81. package/dist/services/orders/orders-modify.schemas.js.map +1 -1
  82. package/dist/services/orders/orders-output.schemas.d.ts +165 -27
  83. package/dist/services/orders/orders-output.schemas.d.ts.map +1 -1
  84. package/dist/services/orders/orders-output.schemas.js +1 -1
  85. package/dist/services/orders/orders-output.schemas.js.map +1 -1
  86. package/dist/services/orders/orders-risk.schemas.d.ts +1 -20
  87. package/dist/services/orders/orders-risk.schemas.d.ts.map +1 -1
  88. package/dist/services/orders/orders-risk.schemas.js +52 -15
  89. package/dist/services/orders/orders-risk.schemas.js.map +1 -1
  90. package/dist/services/orders/orders.codecs.js +12 -1
  91. package/dist/services/orders/orders.codecs.js.map +1 -1
  92. package/dist/services/orders/orders.d.ts.map +1 -1
  93. package/dist/services/orders/orders.js +6 -9
  94. package/dist/services/orders/orders.js.map +1 -1
  95. package/dist/services/rate-limits/rate-limits.schemas.d.ts +4 -4
  96. package/dist/services/rate-limits/rate-limits.schemas.js +1 -1
  97. package/dist/services/rate-limits/rate-limits.schemas.js.map +1 -1
  98. package/dist/services/subaccounts/index.d.ts +2 -2
  99. package/dist/services/subaccounts/subaccounts.codecs.js +29 -1
  100. package/dist/services/subaccounts/subaccounts.codecs.js.map +1 -1
  101. package/dist/services/subaccounts/subaccounts.d.ts +9 -1
  102. package/dist/services/subaccounts/subaccounts.d.ts.map +1 -1
  103. package/dist/services/subaccounts/subaccounts.js +19 -2
  104. package/dist/services/subaccounts/subaccounts.js.map +1 -1
  105. package/dist/services/subaccounts/subaccounts.schemas.d.ts +46 -6
  106. package/dist/services/subaccounts/subaccounts.schemas.d.ts.map +1 -1
  107. package/dist/services/subaccounts/subaccounts.schemas.js +28 -3
  108. package/dist/services/subaccounts/subaccounts.schemas.js.map +1 -1
  109. package/dist/services/subaccounts/subaccounts.types.d.ts +2 -2
  110. package/dist/services/trades/trades.d.ts +1 -1
  111. package/dist/services/trades/trades.js +6 -9
  112. package/dist/services/trades/trades.js.map +1 -1
  113. package/dist/services/trades/trades.schemas.d.ts +3 -0
  114. package/dist/services/trades/trades.schemas.d.ts.map +1 -1
  115. package/dist/services/trades/trades.schemas.js +2 -1
  116. package/dist/services/trades/trades.schemas.js.map +1 -1
  117. package/dist/services/trailing-oneof-inputs.js +3 -3
  118. package/dist/services/trailing-oneof-inputs.js.map +1 -1
  119. package/dist/services/transfers/index.d.ts +2 -2
  120. package/dist/services/transfers/transfers.d.ts +1 -2
  121. package/dist/services/transfers/transfers.d.ts.map +1 -1
  122. package/dist/services/transfers/transfers.js +8 -13
  123. package/dist/services/transfers/transfers.js.map +1 -1
  124. package/dist/services/transfers/transfers.schemas.d.ts +5 -5
  125. package/dist/services/transfers/transfers.schemas.d.ts.map +1 -1
  126. package/dist/services/transfers/transfers.schemas.js +31 -33
  127. package/dist/services/transfers/transfers.schemas.js.map +1 -1
  128. package/dist/services/triggers/trigger-input.schemas.d.ts +22 -9
  129. package/dist/services/triggers/trigger-input.schemas.d.ts.map +1 -1
  130. package/dist/services/triggers/trigger-input.schemas.js +20 -43
  131. package/dist/services/triggers/trigger-input.schemas.js.map +1 -1
  132. package/dist/services/triggers/triggers-output.schemas.d.ts +14 -14
  133. package/dist/services/triggers/triggers-output.schemas.js +5 -5
  134. package/dist/services/triggers/triggers-output.schemas.js.map +1 -1
  135. package/dist/services/triggers/triggers.d.ts.map +1 -1
  136. package/dist/services/triggers/triggers.js +10 -23
  137. package/dist/services/triggers/triggers.js.map +1 -1
  138. package/dist/services/zipper/zipper.d.ts.map +1 -1
  139. package/dist/services/zipper/zipper.js +15 -18
  140. package/dist/services/zipper/zipper.js.map +1 -1
  141. package/dist/shared/connect-error-mapping.d.ts.map +1 -1
  142. package/dist/shared/connect-error-mapping.js +9 -2
  143. package/dist/shared/connect-error-mapping.js.map +1 -1
  144. package/dist/shared/decimal-surface.d.ts.map +1 -1
  145. package/dist/shared/decimal-surface.js +40 -17
  146. package/dist/shared/decimal-surface.js.map +1 -1
  147. package/dist/shared/transports.d.ts.map +1 -1
  148. package/dist/shared/transports.js +33 -11
  149. package/dist/shared/transports.js.map +1 -1
  150. package/dist/utils/base58-id.js +1 -2
  151. package/dist/utils/base58-id.js.map +1 -1
  152. package/dist/utils/errors.d.ts.map +1 -1
  153. package/dist/utils/errors.js +4 -3
  154. package/dist/utils/errors.js.map +1 -1
  155. package/dist/utils/event-emitter.d.ts.map +1 -1
  156. package/dist/utils/event-emitter.js +6 -3
  157. package/dist/utils/event-emitter.js.map +1 -1
  158. package/dist/utils/jwt.d.ts.map +1 -1
  159. package/dist/utils/jwt.js +2 -2
  160. package/dist/utils/jwt.js.map +1 -1
  161. package/dist/utils/numbers.js +20 -3
  162. package/dist/utils/numbers.js.map +1 -1
  163. package/dist/utils/timestamp.js +27 -16
  164. package/dist/utils/timestamp.js.map +1 -1
  165. package/dist/utils/u128.js +6 -18
  166. package/dist/utils/u128.js.map +1 -1
  167. package/dist/wired-services.d.ts.map +1 -1
  168. package/dist/wired-services.js +2 -1
  169. package/dist/wired-services.js.map +1 -1
  170. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","names":[],"sources":["../../src/utils/errors.ts"],"sourcesContent":["import { Code, ConnectError } from \"@connectrpc/connect\";\nimport { AuthErrorCode, AuthErrorDetailSchema } from \"../gen/auth/v1/auth_pb.js\";\nimport { getNormalizedConnectMessage, toPolyesterError } from \"../shared/connect-error-mapping.js\";\nimport {\n isAbortError,\n NetworkError,\n PolicyInUseError,\n PolicyLockedError,\n PolicyScopeMismatchError,\n PolyesterError,\n RateLimitError,\n ResourceNotFoundError,\n RevisionConflictError,\n ServiceUnavailableError,\n TimeoutError,\n} from \"../shared/errors.js\";\n\nfunction hasAuthErrorCode(err: unknown, code: AuthErrorCode): boolean {\n return ConnectError.from(err)\n .findDetails(AuthErrorDetailSchema)\n .some((detail) => detail.code === code);\n}\n\n/**\n * Unwraps a typed SDK error to the underlying `ConnectError` (kept as `cause`)\n * so legacy heuristics keep working on raw backend details.\n */\nfunction unwrapCause(err: unknown): unknown {\n return err instanceof PolyesterError && err.cause !== undefined ? err.cause : err;\n}\n\n/**\n * Whether the backend signalled that the requested resource does not exist.\n * Prefer `err instanceof ResourceNotFoundError`; this predicate also covers\n * raw `ConnectError`s (NotFound or the auth resource-not-found detail).\n */\nexport function isResourceNotFoundError(err: unknown): boolean {\n // Connect can re-wrap interceptor errors as an Unknown ConnectError whose\n // cause is the typed SDK error. Normalize first to recover that cause.\n const mapped = toPolyesterError(err);\n if (mapped instanceof ResourceNotFoundError) return true;\n if (mapped instanceof PolyesterError && mapped.cause === undefined) return false;\n const target = unwrapCause(mapped);\n return (\n hasAuthErrorCode(target, AuthErrorCode.AUTH_RESOURCE_NOT_FOUND) ||\n ConnectError.from(target).code === Code.NotFound\n );\n}\n\n/** Whether an optimistic-concurrency update used a stale resource revision. */\nexport function isRevisionConflictError(err: unknown): boolean {\n const seen = new Set<unknown>();\n let current = err;\n while (current !== undefined && current !== null && !seen.has(current)) {\n seen.add(current);\n if (toPolyesterError(current) instanceof RevisionConflictError) return true;\n const connectError = ConnectError.from(current);\n if (\n (connectError.code === Code.Unknown || connectError.code === Code.Aborted) &&\n /\\brevision conflict\\b/i.test(getNormalizedConnectMessage(connectError))\n ) {\n return true;\n }\n current =\n typeof current === \"object\" && \"cause\" in current\n ? (current as { cause?: unknown }).cause\n : undefined;\n }\n return false;\n}\n\n/** Whether a policy mutation failed because the policy is still attached to a resource. */\nexport function isPolicyInUseError(err: unknown): boolean {\n return toPolyesterError(err) instanceof PolicyInUseError;\n}\n\n/** Whether a policy mutation failed because the policy is locked. */\nexport function isPolicyLockedError(err: unknown): boolean {\n return toPolyesterError(err) instanceof PolicyLockedError;\n}\n\n/** Whether the policy and target account belong to different scopes. */\nexport function isPolicyScopeMismatchError(err: unknown): boolean {\n return toPolyesterError(err) instanceof PolicyScopeMismatchError;\n}\n\n/**\n * Whether an error is retryable (network/timeout) for idempotent operations.\n * Uses same requestId on retry; backend dedupes within 2min.\n * Prefer `err instanceof TransientError` or `err.retryable` on typed errors.\n */\nexport function isRetryableError(err: unknown): boolean {\n if (isAbortError(err)) return false;\n if (err instanceof PolyesterError) return err.retryable;\n const ce = ConnectError.from(err);\n return ce.code === Code.Unavailable || ce.code === Code.DeadlineExceeded;\n}\n\n/**\n * Diagnostic formatter for SDK and ConnectRPC errors.\n * Typed SDK errors already carry normalized messages; for raw ConnectErrors\n * this strips leading \"[CODE]\" prefixes. Falls back to a friendly default.\n * The returned message may contain backend implementation details. Never render\n * it to a user; use {@link formatUserFacingError} at presentation boundaries.\n * @param err - The error to format.\n * @param fallback - The fallback message when no message is available.\n * @returns The formatted error message.\n */\nexport function formatConnectError(\n err: unknown,\n fallback = \"Request failed. Please try again.\",\n): string {\n if (err == null) return fallback;\n if (err instanceof PolyesterError) return err.message || fallback;\n const withoutCode = getNormalizedConnectMessage(err);\n return withoutCode || fallback;\n}\n\n/**\n * Formats an untrusted failure for direct display to a user.\n *\n * This function never returns an exception or backend message. A small allowlist\n * of typed transport conditions receives SDK-owned copy; every other failure\n * returns the caller-owned fallback.\n */\nfunction userFacingTransportMessage(error: unknown): string | undefined {\n if (error instanceof RateLimitError) {\n return \"You've made too many requests. Wait a moment and try again.\";\n }\n if (error instanceof TimeoutError) return \"This is taking longer than expected. Try again.\";\n if (error instanceof ServiceUnavailableError) {\n return \"This service is temporarily unavailable. Try again in a few minutes.\";\n }\n if (error instanceof NetworkError) {\n return \"We couldn't connect. Check your internet connection and try again.\";\n }\n\n if (error instanceof ConnectError) {\n if (error.code === Code.ResourceExhausted) {\n return \"You've made too many requests. Wait a moment and try again.\";\n }\n if (error.code === Code.DeadlineExceeded) {\n return \"This is taking longer than expected. Try again.\";\n }\n if (error.code === Code.Unavailable) {\n return \"This service is temporarily unavailable. Try again in a few minutes.\";\n }\n }\n\n return undefined;\n}\n\nexport function formatUserFacingError(error: unknown, fallback: string): string {\n // Walk the cause chain and normalize ConnectErrors so wrapped submit failures\n // (e.g. Error → ConnectError[unknown] \"Service temporarily unavailable.\")\n // still hit the transport allowlist.\n let current: unknown = error;\n for (let depth = 0; depth < 5 && current != null; depth++) {\n const mapped = toPolyesterError(current);\n const fromMapped = userFacingTransportMessage(mapped);\n if (fromMapped !== undefined) return fromMapped;\n const fromCurrent = userFacingTransportMessage(current);\n if (fromCurrent !== undefined) return fromCurrent;\n\n current =\n typeof current === \"object\" && current !== null && \"cause\" in current\n ? (current as { cause?: unknown }).cause\n : undefined;\n }\n\n return fallback;\n}\n"],"mappings":";;;;;AAiBA,SAAS,iBAAiB,KAAc,MAA8B;CAClE,OAAO,aAAa,KAAK,GAAG,CAAC,CACxB,YAAY,qBAAqB,CAAC,CAClC,MAAM,WAAW,OAAO,SAAS,IAAI;AAC9C;;;;;AAMA,SAAS,YAAY,KAAuB;CACxC,OAAO,eAAe,kBAAkB,IAAI,UAAU,KAAA,IAAY,IAAI,QAAQ;AAClF;;;;;;AAOA,SAAgB,wBAAwB,KAAuB;CAG3D,MAAM,SAAS,iBAAiB,GAAG;CACnC,IAAI,kBAAkB,uBAAuB,OAAO;CACpD,IAAI,kBAAkB,kBAAkB,OAAO,UAAU,KAAA,GAAW,OAAO;CAC3E,MAAM,SAAS,YAAY,MAAM;CACjC,OACI,iBAAiB,QAAA,EAA6C,KAC9D,aAAa,KAAK,MAAM,CAAC,CAAC,SAAS,KAAK;AAEhD;;AAGA,SAAgB,wBAAwB,KAAuB;CAC3D,MAAM,uBAAO,IAAI,IAAa;CAC9B,IAAI,UAAU;CACd,OAAO,YAAY,KAAA,KAAa,YAAY,QAAQ,CAAC,KAAK,IAAI,OAAO,GAAG;EACpE,KAAK,IAAI,OAAO;EAChB,IAAI,iBAAiB,OAAO,aAAa,uBAAuB,OAAO;EACvE,MAAM,eAAe,aAAa,KAAK,OAAO;EAC9C,KACK,aAAa,SAAS,KAAK,WAAW,aAAa,SAAS,KAAK,YAClE,yBAAyB,KAAK,4BAA4B,YAAY,CAAC,GAEvE,OAAO;EAEX,UACI,OAAO,YAAY,YAAY,WAAW,UACnC,QAAgC,QACjC,KAAA;CACd;CACA,OAAO;AACX;;AAGA,SAAgB,mBAAmB,KAAuB;CACtD,OAAO,iBAAiB,GAAG,aAAa;AAC5C;;AAGA,SAAgB,oBAAoB,KAAuB;CACvD,OAAO,iBAAiB,GAAG,aAAa;AAC5C;;AAGA,SAAgB,2BAA2B,KAAuB;CAC9D,OAAO,iBAAiB,GAAG,aAAa;AAC5C;;;;;;AAOA,SAAgB,iBAAiB,KAAuB;CACpD,IAAI,aAAa,GAAG,GAAG,OAAO;CAC9B,IAAI,eAAe,gBAAgB,OAAO,IAAI;CAC9C,MAAM,KAAK,aAAa,KAAK,GAAG;CAChC,OAAO,GAAG,SAAS,KAAK,eAAe,GAAG,SAAS,KAAK;AAC5D;;;;;;;;;;;AAYA,SAAgB,mBACZ,KACA,WAAW,qCACL;CACN,IAAI,OAAO,MAAM,OAAO;CACxB,IAAI,eAAe,gBAAgB,OAAO,IAAI,WAAW;CAEzD,OADoB,4BAA4B,GAC/B,KAAK;AAC1B;;;;;;;;AASA,SAAS,2BAA2B,OAAoC;CACpE,IAAI,iBAAiB,gBACjB,OAAO;CAEX,IAAI,iBAAiB,cAAc,OAAO;CAC1C,IAAI,iBAAiB,yBACjB,OAAO;CAEX,IAAI,iBAAiB,cACjB,OAAO;CAGX,IAAI,iBAAiB,cAAc;EAC/B,IAAI,MAAM,SAAS,KAAK,mBACpB,OAAO;EAEX,IAAI,MAAM,SAAS,KAAK,kBACpB,OAAO;EAEX,IAAI,MAAM,SAAS,KAAK,aACpB,OAAO;CAEf;AAGJ;AAEA,SAAgB,sBAAsB,OAAgB,UAA0B;CAI5E,IAAI,UAAmB;CACvB,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,WAAW,MAAM,SAAS;EAEvD,MAAM,aAAa,2BADJ,iBAAiB,OACmB,CAAC;EACpD,IAAI,eAAe,KAAA,GAAW,OAAO;EACrC,MAAM,cAAc,2BAA2B,OAAO;EACtD,IAAI,gBAAgB,KAAA,GAAW,OAAO;EAEtC,UACI,OAAO,YAAY,YAAY,YAAY,QAAQ,WAAW,UACvD,QAAgC,QACjC,KAAA;CACd;CAEA,OAAO;AACX"}
1
+ {"version":3,"file":"errors.js","names":[],"sources":["../../src/utils/errors.ts"],"sourcesContent":["import { Code, ConnectError } from \"@connectrpc/connect\";\nimport { AuthErrorCode, AuthErrorDetailSchema } from \"../gen/auth/v1/auth_pb.js\";\nimport { getNormalizedConnectMessage, toPolyesterError } from \"../shared/connect-error-mapping.js\";\nimport {\n isAbortError,\n NetworkError,\n PolicyInUseError,\n PolicyLockedError,\n PolicyScopeMismatchError,\n PolyesterError,\n RateLimitError,\n ResourceNotFoundError,\n RevisionConflictError,\n ServiceUnavailableError,\n TimeoutError,\n} from \"../shared/errors.js\";\n\nfunction hasAuthErrorCode(err: unknown, code: AuthErrorCode): boolean {\n return ConnectError.from(err)\n .findDetails(AuthErrorDetailSchema)\n .some((detail) => detail.code === code);\n}\n\n/**\n * Unwraps a typed SDK error to the underlying `ConnectError` (kept as `cause`)\n * so legacy heuristics keep working on raw backend details.\n */\nfunction unwrapCause(err: unknown): unknown {\n return err instanceof PolyesterError && err.cause !== undefined ? err.cause : err;\n}\n\n/**\n * Whether the backend signalled that the requested resource does not exist.\n * Prefer `err instanceof ResourceNotFoundError`; this predicate also covers\n * raw `ConnectError`s (NotFound or the auth resource-not-found detail).\n */\nexport function isResourceNotFoundError(err: unknown): boolean {\n // Connect can re-wrap interceptor errors as an Unknown ConnectError whose\n // cause is the typed SDK error. Normalize first to recover that cause.\n const mapped = toPolyesterError(err);\n if (mapped instanceof ResourceNotFoundError) return true;\n if (mapped instanceof PolyesterError && mapped.cause === undefined) return false;\n const target = unwrapCause(mapped);\n return (\n hasAuthErrorCode(target, AuthErrorCode.AUTH_RESOURCE_NOT_FOUND) ||\n ConnectError.from(target).code === Code.NotFound\n );\n}\n\n/** Whether an optimistic-concurrency update used a stale resource revision. */\nexport function isRevisionConflictError(err: unknown): boolean {\n const seen = new Set<unknown>();\n let current = err;\n while (current !== undefined && current !== null && !seen.has(current)) {\n seen.add(current);\n if (toPolyesterError(current) instanceof RevisionConflictError) return true;\n const connectError = ConnectError.from(current);\n if (\n (connectError.code === Code.Unknown || connectError.code === Code.Aborted) &&\n /\\brevision conflict\\b/i.test(getNormalizedConnectMessage(connectError))\n ) {\n return true;\n }\n current =\n typeof current === \"object\" && \"cause\" in current\n ? (current as { cause?: unknown }).cause\n : undefined;\n }\n return false;\n}\n\n/** Whether a policy mutation failed because the policy is still attached to a resource. */\nexport function isPolicyInUseError(err: unknown): boolean {\n return toPolyesterError(err) instanceof PolicyInUseError;\n}\n\n/** Whether a policy mutation failed because the policy is locked. */\nexport function isPolicyLockedError(err: unknown): boolean {\n return toPolyesterError(err) instanceof PolicyLockedError;\n}\n\n/** Whether the policy and target account belong to different scopes. */\nexport function isPolicyScopeMismatchError(err: unknown): boolean {\n return toPolyesterError(err) instanceof PolicyScopeMismatchError;\n}\n\n/**\n * Whether an error is retryable (network/timeout) for idempotent operations.\n * Uses same requestId on retry; backend dedupes within 2min.\n * Prefer `err instanceof TransientError` or `err.retryable` on typed errors.\n */\nexport function isRetryableError(err: unknown): boolean {\n if (isAbortError(err)) return false;\n const mapped = toPolyesterError(err);\n if (mapped instanceof PolyesterError) return mapped.retryable;\n const ce = ConnectError.from(mapped);\n return (\n ce.code === Code.Unavailable ||\n ce.code === Code.DeadlineExceeded ||\n ce.code === Code.ResourceExhausted ||\n ce.code === Code.Aborted\n );\n}\n\n/**\n * Diagnostic formatter for SDK and ConnectRPC errors.\n * Typed SDK errors already carry normalized messages; for raw ConnectErrors\n * this strips leading \"[CODE]\" prefixes. Falls back to a friendly default.\n * The returned message may contain backend implementation details. Never render\n * it to a user; use {@link formatUserFacingError} at presentation boundaries.\n * @param err - The error to format.\n * @param fallback - The fallback message when no message is available.\n * @returns The formatted error message.\n */\nexport function formatConnectError(\n err: unknown,\n fallback = \"Request failed. Please try again.\",\n): string {\n if (err == null) return fallback;\n if (err instanceof PolyesterError) return err.message || fallback;\n const withoutCode = getNormalizedConnectMessage(err);\n return withoutCode || fallback;\n}\n\n/**\n * Formats an untrusted failure for direct display to a user.\n *\n * This function never returns an exception or backend message. A small allowlist\n * of typed transport conditions receives SDK-owned copy; every other failure\n * returns the caller-owned fallback.\n */\nfunction userFacingTransportMessage(error: unknown): string | undefined {\n if (error instanceof RateLimitError) {\n return \"You've made too many requests. Wait a moment and try again.\";\n }\n if (error instanceof TimeoutError) return \"This is taking longer than expected. Try again.\";\n if (error instanceof ServiceUnavailableError) {\n return \"This service is temporarily unavailable. Try again in a few minutes.\";\n }\n if (error instanceof NetworkError) {\n return \"We couldn't connect. Check your internet connection and try again.\";\n }\n\n if (error instanceof ConnectError) {\n if (error.code === Code.ResourceExhausted) {\n return \"You've made too many requests. Wait a moment and try again.\";\n }\n if (error.code === Code.DeadlineExceeded) {\n return \"This is taking longer than expected. Try again.\";\n }\n if (error.code === Code.Unavailable) {\n return \"This service is temporarily unavailable. Try again in a few minutes.\";\n }\n }\n\n return undefined;\n}\n\nexport function formatUserFacingError(error: unknown, fallback: string): string {\n // Walk the cause chain and normalize ConnectErrors so wrapped submit failures\n // (e.g. Error → ConnectError[unknown] \"Service temporarily unavailable.\")\n // still hit the transport allowlist.\n let current: unknown = error;\n for (let depth = 0; depth < 5 && current != null; depth++) {\n const mapped = toPolyesterError(current);\n const fromMapped = userFacingTransportMessage(mapped);\n if (fromMapped !== undefined) return fromMapped;\n const fromCurrent = userFacingTransportMessage(current);\n if (fromCurrent !== undefined) return fromCurrent;\n\n current =\n typeof current === \"object\" && current !== null && \"cause\" in current\n ? (current as { cause?: unknown }).cause\n : undefined;\n }\n\n return fallback;\n}\n"],"mappings":";;;;;AAiBA,SAAS,iBAAiB,KAAc,MAA8B;CAClE,OAAO,aAAa,KAAK,GAAG,CAAC,CACxB,YAAY,qBAAqB,CAAC,CAClC,MAAM,WAAW,OAAO,SAAS,IAAI;AAC9C;;;;;AAMA,SAAS,YAAY,KAAuB;CACxC,OAAO,eAAe,kBAAkB,IAAI,UAAU,KAAA,IAAY,IAAI,QAAQ;AAClF;;;;;;AAOA,SAAgB,wBAAwB,KAAuB;CAG3D,MAAM,SAAS,iBAAiB,GAAG;CACnC,IAAI,kBAAkB,uBAAuB,OAAO;CACpD,IAAI,kBAAkB,kBAAkB,OAAO,UAAU,KAAA,GAAW,OAAO;CAC3E,MAAM,SAAS,YAAY,MAAM;CACjC,OACI,iBAAiB,QAAA,EAA6C,KAC9D,aAAa,KAAK,MAAM,CAAC,CAAC,SAAS,KAAK;AAEhD;;AAGA,SAAgB,wBAAwB,KAAuB;CAC3D,MAAM,uBAAO,IAAI,IAAa;CAC9B,IAAI,UAAU;CACd,OAAO,YAAY,KAAA,KAAa,YAAY,QAAQ,CAAC,KAAK,IAAI,OAAO,GAAG;EACpE,KAAK,IAAI,OAAO;EAChB,IAAI,iBAAiB,OAAO,aAAa,uBAAuB,OAAO;EACvE,MAAM,eAAe,aAAa,KAAK,OAAO;EAC9C,KACK,aAAa,SAAS,KAAK,WAAW,aAAa,SAAS,KAAK,YAClE,yBAAyB,KAAK,4BAA4B,YAAY,CAAC,GAEvE,OAAO;EAEX,UACI,OAAO,YAAY,YAAY,WAAW,UACnC,QAAgC,QACjC,KAAA;CACd;CACA,OAAO;AACX;;AAGA,SAAgB,mBAAmB,KAAuB;CACtD,OAAO,iBAAiB,GAAG,aAAa;AAC5C;;AAGA,SAAgB,oBAAoB,KAAuB;CACvD,OAAO,iBAAiB,GAAG,aAAa;AAC5C;;AAGA,SAAgB,2BAA2B,KAAuB;CAC9D,OAAO,iBAAiB,GAAG,aAAa;AAC5C;;;;;;AAOA,SAAgB,iBAAiB,KAAuB;CACpD,IAAI,aAAa,GAAG,GAAG,OAAO;CAC9B,MAAM,SAAS,iBAAiB,GAAG;CACnC,IAAI,kBAAkB,gBAAgB,OAAO,OAAO;CACpD,MAAM,KAAK,aAAa,KAAK,MAAM;CACnC,OACI,GAAG,SAAS,KAAK,eACjB,GAAG,SAAS,KAAK,oBACjB,GAAG,SAAS,KAAK,qBACjB,GAAG,SAAS,KAAK;AAEzB;;;;;;;;;;;AAYA,SAAgB,mBACZ,KACA,WAAW,qCACL;CACN,IAAI,OAAO,MAAM,OAAO;CACxB,IAAI,eAAe,gBAAgB,OAAO,IAAI,WAAW;CAEzD,OADoB,4BAA4B,GAC/B,KAAK;AAC1B;;;;;;;;AASA,SAAS,2BAA2B,OAAoC;CACpE,IAAI,iBAAiB,gBACjB,OAAO;CAEX,IAAI,iBAAiB,cAAc,OAAO;CAC1C,IAAI,iBAAiB,yBACjB,OAAO;CAEX,IAAI,iBAAiB,cACjB,OAAO;CAGX,IAAI,iBAAiB,cAAc;EAC/B,IAAI,MAAM,SAAS,KAAK,mBACpB,OAAO;EAEX,IAAI,MAAM,SAAS,KAAK,kBACpB,OAAO;EAEX,IAAI,MAAM,SAAS,KAAK,aACpB,OAAO;CAEf;AAGJ;AAEA,SAAgB,sBAAsB,OAAgB,UAA0B;CAI5E,IAAI,UAAmB;CACvB,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,WAAW,MAAM,SAAS;EAEvD,MAAM,aAAa,2BADJ,iBAAiB,OACmB,CAAC;EACpD,IAAI,eAAe,KAAA,GAAW,OAAO;EACrC,MAAM,cAAc,2BAA2B,OAAO;EACtD,IAAI,gBAAgB,KAAA,GAAW,OAAO;EAEtC,UACI,OAAO,YAAY,YAAY,YAAY,QAAQ,WAAW,UACvD,QAAgC,QACjC,KAAA;CACd;CAEA,OAAO;AACX"}
@@ -1 +1 @@
1
- {"version":3,"file":"event-emitter.d.ts","names":[],"sources":["../../src/utils/event-emitter.ts"],"mappings":";KAAK,cAAc,gBAAgB,MAAM;;;;cAK5B,aAAa,mBAAmB,WAAW;;;;;EAMpD,GAAG,gBAAgB,SAAS,OAAO,GAAG,UAAU,cAAc,QAAQ;;;;EActE,KAAK,gBAAgB,SAAS,OAAO,GAAG,UAAU,cAAc,QAAQ;;;;EAWxE,KAAK,gBAAgB,SAAS,OAAO,GAAG,MAAM,QAAQ;;;;EAgBtD,IAAI,gBAAgB,SAAS,OAAO,GAAG,WAAW,cAAc,QAAQ;;;;EAWxE"}
1
+ {"version":3,"file":"event-emitter.d.ts","names":[],"sources":["../../src/utils/event-emitter.ts"],"mappings":";KAAK,cAAc,gBAAgB,MAAM;;;;cAK5B,aAAa,mBAAmB,WAAW;;;;;EAMpD,GAAG,gBAAgB,SAAS,OAAO,GAAG,UAAU,cAAc,QAAQ;;;;EActE,KAAK,gBAAgB,SAAS,OAAO,GAAG,UAAU,cAAc,QAAQ;;;;EAWxE,KAAK,gBAAgB,SAAS,OAAO,GAAG,MAAM,QAAQ;;;;EAiBtD,IAAI,gBAAgB,SAAS,OAAO,GAAG,WAAW,cAAc,QAAQ;;;;EAWxE"}
@@ -29,9 +29,12 @@ var EventEmitter = class {
29
29
  */
30
30
  emit(event, data) {
31
31
  const callbacks = this.#listeners.get(event);
32
- if (callbacks) for (const callback of callbacks) try {
33
- callback(data);
34
- } catch {}
32
+ if (callbacks) {
33
+ const snapshot = Array.from(callbacks);
34
+ for (const callback of snapshot) try {
35
+ callback(data);
36
+ } catch {}
37
+ }
35
38
  }
36
39
  /**
37
40
  * Removes a previously registered event listener.
@@ -1 +1 @@
1
- {"version":3,"file":"event-emitter.js","names":["#listeners"],"sources":["../../src/utils/event-emitter.ts"],"sourcesContent":["type EventCallback<T = unknown> = (data: T) => void;\n\n/**\n * Minimal typed event emitter used by SDK services to publish auth and lifecycle state changes.\n */\nexport class EventEmitter<TEvents extends { [K in keyof TEvents]: unknown }> {\n #listeners: Map<keyof TEvents, Set<EventCallback>> = new Map();\n\n /**\n * Registers an event listener and returns an unsubscribe function.\n */\n on<K extends keyof TEvents>(event: K, callback: EventCallback<TEvents[K]>): () => void {\n if (!this.#listeners.has(event)) {\n this.#listeners.set(event, new Set());\n }\n this.#listeners.get(event)!.add(callback as EventCallback);\n\n return () => {\n this.#listeners.get(event)?.delete(callback as EventCallback);\n };\n }\n\n /**\n * Registers an event listener that runs at most once.\n */\n once<K extends keyof TEvents>(event: K, callback: EventCallback<TEvents[K]>): () => void {\n const unsubscribe = this.on(event, (data) => {\n unsubscribe();\n callback(data);\n });\n return unsubscribe;\n }\n\n /**\n * Emits an event to all registered listeners, isolating errors thrown synchronously by each listener.\n */\n emit<K extends keyof TEvents>(event: K, data: TEvents[K]): void {\n const callbacks = this.#listeners.get(event);\n if (callbacks) {\n for (const callback of callbacks) {\n try {\n callback(data);\n } catch {\n // A consumer callback must not interrupt the SDK operation or other listeners.\n }\n }\n }\n }\n\n /**\n * Removes a previously registered event listener.\n */\n off<K extends keyof TEvents>(event: K, callback?: EventCallback<TEvents[K]>): void {\n if (callback) {\n this.#listeners.get(event)?.delete(callback as EventCallback);\n } else {\n this.#listeners.delete(event);\n }\n }\n\n /**\n * Removes every registered event listener.\n */\n removeAllListeners(): void {\n this.#listeners.clear();\n }\n}\n"],"mappings":";;;;AAKA,IAAa,eAAb,MAA6E;CACzE,6BAAqD,IAAI,IAAI;;;;CAK7D,GAA4B,OAAU,UAAiD;EACnF,IAAI,CAAC,KAAKA,WAAW,IAAI,KAAK,GAC1B,KAAKA,WAAW,IAAI,uBAAO,IAAI,IAAI,CAAC;EAExC,KAAKA,WAAW,IAAI,KAAK,CAAC,CAAE,IAAI,QAAyB;EAEzD,aAAa;GACT,KAAKA,WAAW,IAAI,KAAK,CAAC,EAAE,OAAO,QAAyB;EAChE;CACJ;;;;CAKA,KAA8B,OAAU,UAAiD;EACrF,MAAM,cAAc,KAAK,GAAG,QAAQ,SAAS;GACzC,YAAY;GACZ,SAAS,IAAI;EACjB,CAAC;EACD,OAAO;CACX;;;;CAKA,KAA8B,OAAU,MAAwB;EAC5D,MAAM,YAAY,KAAKA,WAAW,IAAI,KAAK;EAC3C,IAAI,WACA,KAAK,MAAM,YAAY,WACnB,IAAI;GACA,SAAS,IAAI;EACjB,QAAQ,CAER;CAGZ;;;;CAKA,IAA6B,OAAU,UAA4C;EAC/E,IAAI,UACA,KAAKA,WAAW,IAAI,KAAK,CAAC,EAAE,OAAO,QAAyB;OAE5D,KAAKA,WAAW,OAAO,KAAK;CAEpC;;;;CAKA,qBAA2B;EACvB,KAAKA,WAAW,MAAM;CAC1B;AACJ"}
1
+ {"version":3,"file":"event-emitter.js","names":["#listeners"],"sources":["../../src/utils/event-emitter.ts"],"sourcesContent":["type EventCallback<T = unknown> = (data: T) => void;\n\n/**\n * Minimal typed event emitter used by SDK services to publish auth and lifecycle state changes.\n */\nexport class EventEmitter<TEvents extends { [K in keyof TEvents]: unknown }> {\n #listeners: Map<keyof TEvents, Set<EventCallback>> = new Map();\n\n /**\n * Registers an event listener and returns an unsubscribe function.\n */\n on<K extends keyof TEvents>(event: K, callback: EventCallback<TEvents[K]>): () => void {\n if (!this.#listeners.has(event)) {\n this.#listeners.set(event, new Set());\n }\n this.#listeners.get(event)!.add(callback as EventCallback);\n\n return () => {\n this.#listeners.get(event)?.delete(callback as EventCallback);\n };\n }\n\n /**\n * Registers an event listener that runs at most once.\n */\n once<K extends keyof TEvents>(event: K, callback: EventCallback<TEvents[K]>): () => void {\n const unsubscribe = this.on(event, (data) => {\n unsubscribe();\n callback(data);\n });\n return unsubscribe;\n }\n\n /**\n * Emits an event to all registered listeners, isolating errors thrown synchronously by each listener.\n */\n emit<K extends keyof TEvents>(event: K, data: TEvents[K]): void {\n const callbacks = this.#listeners.get(event);\n if (callbacks) {\n const snapshot = Array.from(callbacks);\n for (const callback of snapshot) {\n try {\n callback(data);\n } catch {\n // A consumer callback must not interrupt the SDK operation or other listeners.\n }\n }\n }\n }\n\n /**\n * Removes a previously registered event listener.\n */\n off<K extends keyof TEvents>(event: K, callback?: EventCallback<TEvents[K]>): void {\n if (callback) {\n this.#listeners.get(event)?.delete(callback as EventCallback);\n } else {\n this.#listeners.delete(event);\n }\n }\n\n /**\n * Removes every registered event listener.\n */\n removeAllListeners(): void {\n this.#listeners.clear();\n }\n}\n"],"mappings":";;;;AAKA,IAAa,eAAb,MAA6E;CACzE,6BAAqD,IAAI,IAAI;;;;CAK7D,GAA4B,OAAU,UAAiD;EACnF,IAAI,CAAC,KAAKA,WAAW,IAAI,KAAK,GAC1B,KAAKA,WAAW,IAAI,uBAAO,IAAI,IAAI,CAAC;EAExC,KAAKA,WAAW,IAAI,KAAK,CAAC,CAAE,IAAI,QAAyB;EAEzD,aAAa;GACT,KAAKA,WAAW,IAAI,KAAK,CAAC,EAAE,OAAO,QAAyB;EAChE;CACJ;;;;CAKA,KAA8B,OAAU,UAAiD;EACrF,MAAM,cAAc,KAAK,GAAG,QAAQ,SAAS;GACzC,YAAY;GACZ,SAAS,IAAI;EACjB,CAAC;EACD,OAAO;CACX;;;;CAKA,KAA8B,OAAU,MAAwB;EAC5D,MAAM,YAAY,KAAKA,WAAW,IAAI,KAAK;EAC3C,IAAI,WAAW;GACX,MAAM,WAAW,MAAM,KAAK,SAAS;GACrC,KAAK,MAAM,YAAY,UACnB,IAAI;IACA,SAAS,IAAI;GACjB,QAAQ,CAER;EAER;CACJ;;;;CAKA,IAA6B,OAAU,UAA4C;EAC/E,IAAI,UACA,KAAKA,WAAW,IAAI,KAAK,CAAC,EAAE,OAAO,QAAyB;OAE5D,KAAKA,WAAW,OAAO,KAAK;CAEpC;;;;CAKA,qBAA2B;EACvB,KAAKA,WAAW,MAAM;CAC1B;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"jwt.d.ts","names":[],"sources":["../../src/utils/jwt.ts"],"mappings":";;;;iBA6DgB,WAAW,iBAAiB"}
1
+ {"version":3,"file":"jwt.d.ts","names":[],"sources":["../../src/utils/jwt.ts"],"mappings":";;;;iBA4DgB,WAAW,iBAAiB"}
package/dist/utils/jwt.js CHANGED
@@ -35,7 +35,7 @@ function getJwtExpiration(token) {
35
35
  const payload = JSON.parse(decodedPayload);
36
36
  if (typeof payload !== "object" || payload === null) return null;
37
37
  const exp = payload.exp;
38
- return typeof exp === "number" ? exp : null;
38
+ return typeof exp === "number" && Number.isFinite(exp) ? exp : null;
39
39
  } catch {
40
40
  return null;
41
41
  }
@@ -46,7 +46,7 @@ function getJwtExpiration(token) {
46
46
  function isJwtExpired(token) {
47
47
  const exp = getJwtExpiration(token);
48
48
  if (exp === null) return true;
49
- return exp < Math.floor(Date.now() / 1e3);
49
+ return Date.now() >= exp * 1e3;
50
50
  }
51
51
  /**
52
52
  * Checks whether a value is a present, well-formed, unexpired JWT string.
@@ -1 +1 @@
1
- {"version":3,"file":"jwt.js","names":[],"sources":["../../src/utils/jwt.ts"],"sourcesContent":["/**\n * Checks whether a string has the shape of a JWT.\n */\nexport function isJwt(token: string): boolean {\n const parts = token.split(\".\");\n return parts.length === 3 && !!parts[0] && !!parts[1] && !!parts[2];\n}\n\nlet textDecoder: TextDecoder | undefined;\n\n/**\n * Gets a TextDecoder instance.\n */\nfunction getTextDecoder(): TextDecoder {\n textDecoder ??= new TextDecoder(\"utf-8\", { fatal: true });\n return textDecoder;\n}\n\nfunction decodeBase64Url(value: string): string | null {\n const remainder = value.length % 4;\n if (remainder === 1) return null;\n\n const base64 = value.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const paddedBase64 =\n remainder === 0 ? base64 : base64.padEnd(base64.length + 4 - remainder, \"=\");\n const binary = atob(paddedBase64);\n const bytes = Uint8Array.from(binary, (character) => character.charCodeAt(0));\n return getTextDecoder().decode(bytes);\n}\n\n/**\n * Reads a JWT expiration timestamp when present.\n */\nexport function getJwtExpiration(token: string): number | null {\n try {\n const [_, rawPayload] = token.split(\".\");\n if (!rawPayload) return null;\n const decodedPayload = decodeBase64Url(rawPayload);\n if (!decodedPayload) return null;\n const payload: unknown = JSON.parse(decodedPayload);\n if (typeof payload !== \"object\" || payload === null) return null;\n const exp = (payload as { exp?: unknown }).exp;\n return typeof exp === \"number\" ? exp : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Checks whether a JWT is expired.\n */\nexport function isJwtExpired(token: string): boolean {\n const exp = getJwtExpiration(token);\n if (exp === null) return true;\n const currentTime = Math.floor(Date.now() / 1000);\n return exp < currentTime;\n}\n\n/**\n * Checks whether a value is a present, well-formed, unexpired JWT string.\n */\nexport function isJwtValid(token: unknown): token is string {\n if (typeof token !== \"string\" || !token) return false;\n if (!isJwt(token)) return false;\n if (isJwtExpired(token)) return false;\n return true;\n}\n\n/**\n * Returns the number of milliseconds until the JWT expires.\n * Returns 0 if already expired or invalid.\n */\nexport function getJwtTimeToExpiry(token: string): number {\n const exp = getJwtExpiration(token);\n if (exp === null) return 0;\n const nowMs = Date.now();\n const expiresAtMs = exp * 1000;\n return Math.max(0, expiresAtMs - nowMs);\n}\n"],"mappings":";;;;AAGA,SAAgB,MAAM,OAAwB;CAC1C,MAAM,QAAQ,MAAM,MAAM,GAAG;CAC7B,OAAO,MAAM,WAAW,KAAK,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,MAAM;AACrE;AAEA,IAAI;;;;AAKJ,SAAS,iBAA8B;CACnC,gBAAgB,IAAI,YAAY,SAAS,EAAE,OAAO,KAAK,CAAC;CACxD,OAAO;AACX;AAEA,SAAS,gBAAgB,OAA8B;CACnD,MAAM,YAAY,MAAM,SAAS;CACjC,IAAI,cAAc,GAAG,OAAO;CAE5B,MAAM,SAAS,MAAM,QAAQ,MAAM,GAAG,CAAC,CAAC,QAAQ,MAAM,GAAG;CACzD,MAAM,eACF,cAAc,IAAI,SAAS,OAAO,OAAO,OAAO,SAAS,IAAI,WAAW,GAAG;CAC/E,MAAM,SAAS,KAAK,YAAY;CAChC,MAAM,QAAQ,WAAW,KAAK,SAAS,cAAc,UAAU,WAAW,CAAC,CAAC;CAC5E,OAAO,eAAe,CAAC,CAAC,OAAO,KAAK;AACxC;;;;AAKA,SAAgB,iBAAiB,OAA8B;CAC3D,IAAI;EACA,MAAM,CAAC,GAAG,cAAc,MAAM,MAAM,GAAG;EACvC,IAAI,CAAC,YAAY,OAAO;EACxB,MAAM,iBAAiB,gBAAgB,UAAU;EACjD,IAAI,CAAC,gBAAgB,OAAO;EAC5B,MAAM,UAAmB,KAAK,MAAM,cAAc;EAClD,IAAI,OAAO,YAAY,YAAY,YAAY,MAAM,OAAO;EAC5D,MAAM,MAAO,QAA8B;EAC3C,OAAO,OAAO,QAAQ,WAAW,MAAM;CAC3C,QAAQ;EACJ,OAAO;CACX;AACJ;;;;AAKA,SAAgB,aAAa,OAAwB;CACjD,MAAM,MAAM,iBAAiB,KAAK;CAClC,IAAI,QAAQ,MAAM,OAAO;CAEzB,OAAO,MADa,KAAK,MAAM,KAAK,IAAI,IAAI,GACrB;AAC3B;;;;AAKA,SAAgB,WAAW,OAAiC;CACxD,IAAI,OAAO,UAAU,YAAY,CAAC,OAAO,OAAO;CAChD,IAAI,CAAC,MAAM,KAAK,GAAG,OAAO;CAC1B,IAAI,aAAa,KAAK,GAAG,OAAO;CAChC,OAAO;AACX;;;;;AAMA,SAAgB,mBAAmB,OAAuB;CACtD,MAAM,MAAM,iBAAiB,KAAK;CAClC,IAAI,QAAQ,MAAM,OAAO;CACzB,MAAM,QAAQ,KAAK,IAAI;CACvB,MAAM,cAAc,MAAM;CAC1B,OAAO,KAAK,IAAI,GAAG,cAAc,KAAK;AAC1C"}
1
+ {"version":3,"file":"jwt.js","names":[],"sources":["../../src/utils/jwt.ts"],"sourcesContent":["/**\n * Checks whether a string has the shape of a JWT.\n */\nexport function isJwt(token: string): boolean {\n const parts = token.split(\".\");\n return parts.length === 3 && !!parts[0] && !!parts[1] && !!parts[2];\n}\n\nlet textDecoder: TextDecoder | undefined;\n\n/**\n * Gets a TextDecoder instance.\n */\nfunction getTextDecoder(): TextDecoder {\n textDecoder ??= new TextDecoder(\"utf-8\", { fatal: true });\n return textDecoder;\n}\n\nfunction decodeBase64Url(value: string): string | null {\n const remainder = value.length % 4;\n if (remainder === 1) return null;\n\n const base64 = value.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const paddedBase64 =\n remainder === 0 ? base64 : base64.padEnd(base64.length + 4 - remainder, \"=\");\n const binary = atob(paddedBase64);\n const bytes = Uint8Array.from(binary, (character) => character.charCodeAt(0));\n return getTextDecoder().decode(bytes);\n}\n\n/**\n * Reads a JWT expiration timestamp when present.\n */\nexport function getJwtExpiration(token: string): number | null {\n try {\n const [_, rawPayload] = token.split(\".\");\n if (!rawPayload) return null;\n const decodedPayload = decodeBase64Url(rawPayload);\n if (!decodedPayload) return null;\n const payload: unknown = JSON.parse(decodedPayload);\n if (typeof payload !== \"object\" || payload === null) return null;\n const exp = (payload as { exp?: unknown }).exp;\n return typeof exp === \"number\" && Number.isFinite(exp) ? exp : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Checks whether a JWT is expired.\n */\nexport function isJwtExpired(token: string): boolean {\n const exp = getJwtExpiration(token);\n if (exp === null) return true;\n return Date.now() >= exp * 1000;\n}\n\n/**\n * Checks whether a value is a present, well-formed, unexpired JWT string.\n */\nexport function isJwtValid(token: unknown): token is string {\n if (typeof token !== \"string\" || !token) return false;\n if (!isJwt(token)) return false;\n if (isJwtExpired(token)) return false;\n return true;\n}\n\n/**\n * Returns the number of milliseconds until the JWT expires.\n * Returns 0 if already expired or invalid.\n */\nexport function getJwtTimeToExpiry(token: string): number {\n const exp = getJwtExpiration(token);\n if (exp === null) return 0;\n const nowMs = Date.now();\n const expiresAtMs = exp * 1000;\n return Math.max(0, expiresAtMs - nowMs);\n}\n"],"mappings":";;;;AAGA,SAAgB,MAAM,OAAwB;CAC1C,MAAM,QAAQ,MAAM,MAAM,GAAG;CAC7B,OAAO,MAAM,WAAW,KAAK,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,MAAM;AACrE;AAEA,IAAI;;;;AAKJ,SAAS,iBAA8B;CACnC,gBAAgB,IAAI,YAAY,SAAS,EAAE,OAAO,KAAK,CAAC;CACxD,OAAO;AACX;AAEA,SAAS,gBAAgB,OAA8B;CACnD,MAAM,YAAY,MAAM,SAAS;CACjC,IAAI,cAAc,GAAG,OAAO;CAE5B,MAAM,SAAS,MAAM,QAAQ,MAAM,GAAG,CAAC,CAAC,QAAQ,MAAM,GAAG;CACzD,MAAM,eACF,cAAc,IAAI,SAAS,OAAO,OAAO,OAAO,SAAS,IAAI,WAAW,GAAG;CAC/E,MAAM,SAAS,KAAK,YAAY;CAChC,MAAM,QAAQ,WAAW,KAAK,SAAS,cAAc,UAAU,WAAW,CAAC,CAAC;CAC5E,OAAO,eAAe,CAAC,CAAC,OAAO,KAAK;AACxC;;;;AAKA,SAAgB,iBAAiB,OAA8B;CAC3D,IAAI;EACA,MAAM,CAAC,GAAG,cAAc,MAAM,MAAM,GAAG;EACvC,IAAI,CAAC,YAAY,OAAO;EACxB,MAAM,iBAAiB,gBAAgB,UAAU;EACjD,IAAI,CAAC,gBAAgB,OAAO;EAC5B,MAAM,UAAmB,KAAK,MAAM,cAAc;EAClD,IAAI,OAAO,YAAY,YAAY,YAAY,MAAM,OAAO;EAC5D,MAAM,MAAO,QAA8B;EAC3C,OAAO,OAAO,QAAQ,YAAY,OAAO,SAAS,GAAG,IAAI,MAAM;CACnE,QAAQ;EACJ,OAAO;CACX;AACJ;;;;AAKA,SAAgB,aAAa,OAAwB;CACjD,MAAM,MAAM,iBAAiB,KAAK;CAClC,IAAI,QAAQ,MAAM,OAAO;CACzB,OAAO,KAAK,IAAI,KAAK,MAAM;AAC/B;;;;AAKA,SAAgB,WAAW,OAAiC;CACxD,IAAI,OAAO,UAAU,YAAY,CAAC,OAAO,OAAO;CAChD,IAAI,CAAC,MAAM,KAAK,GAAG,OAAO;CAC1B,IAAI,aAAa,KAAK,GAAG,OAAO;CAChC,OAAO;AACX;;;;;AAMA,SAAgB,mBAAmB,OAAuB;CACtD,MAAM,MAAM,iBAAiB,KAAK;CAClC,IAAI,QAAQ,MAAM,OAAO;CACzB,MAAM,QAAQ,KAAK,IAAI;CACvB,MAAM,cAAc,MAAM;CAC1B,OAAO,KAAK,IAAI,GAAG,cAAc,KAAK;AAC1C"}
@@ -15,8 +15,25 @@ function parseOptionalUint64DecimalStrict(raw, fieldName) {
15
15
  */
16
16
  function parseOptionalPositiveIntLike(value) {
17
17
  if (value === void 0 || value === null) return void 0;
18
- const n = typeof value === "string" ? Number(value.trim()) : value;
19
- return Number.isInteger(n) && n > 0 ? n : void 0;
18
+ if (typeof value === "string") {
19
+ const decimal = value.trim();
20
+ if (!/^\d+$/.test(decimal)) return void 0;
21
+ const parsed = Number(decimal);
22
+ return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : void 0;
23
+ }
24
+ return Number.isSafeInteger(value) && value > 0 ? value : void 0;
25
+ }
26
+ /**
27
+ * Parse a positive integer-like value without losing precision.
28
+ * Decimal strings may exceed JavaScript's safe-integer range; number inputs may not.
29
+ */
30
+ function parseOptionalPositiveBigIntLike(value) {
31
+ if (value === void 0 || value === null) return void 0;
32
+ if (typeof value === "number") return Number.isSafeInteger(value) && value > 0 ? BigInt(value) : void 0;
33
+ const decimal = value.trim();
34
+ if (!/^\d+$/.test(decimal)) return void 0;
35
+ const parsed = BigInt(decimal);
36
+ return parsed > 0n ? parsed : void 0;
20
37
  }
21
38
  /**
22
39
  * Coerce optional UI number into non-negative bigint (e.g. caps, limits).
@@ -46,6 +63,6 @@ function toBpsOrZero(value) {
46
63
  return Math.max(0, Math.trunc(value * 100));
47
64
  }
48
65
  //#endregion
49
- export { parseOptionalPositiveIntLike, parseOptionalUint64DecimalStrict, toBigIntOrZero, toBpsOrZero, toIntOrZero };
66
+ export { parseOptionalPositiveBigIntLike, parseOptionalPositiveIntLike, parseOptionalUint64DecimalStrict, toBigIntOrZero, toBpsOrZero, toIntOrZero };
50
67
 
51
68
  //# sourceMappingURL=numbers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"numbers.js","names":[],"sources":["../../src/utils/numbers.ts"],"sourcesContent":["// Shared numeric helpers for gRPC/Connect clients.\n\n/**\n * Parse a required uint64 encoded as a base-10 string into bigint.\n * @param raw - The raw string to parse.\n * @param fieldName - The name of the field to parse.\n * @returns The parsed bigint.\n * @throws An error if the field is required and not provided.\n * @throws An error if the field is not a positive integer.\n */\nexport function parseRequiredUint64Decimal(raw: string, fieldName: string): bigint {\n const s = (raw ?? \"\").trim();\n if (!s) throw new Error(`${fieldName} is required`);\n if (!/^[0-9]+$/.test(s)) throw new Error(`${fieldName} must be a positive integer`);\n return BigInt(s);\n}\n\n/**\n * Parse an optional uint64 encoded as a base-10 string into bigint, or undefined on invalid/empty.\n * @param raw - The raw string to parse.\n * @returns The parsed bigint, or undefined if the field is invalid or empty.\n */\nexport function parseOptionalUint64Decimal(raw: string | undefined): bigint | undefined {\n const s = (raw ?? \"\").trim();\n if (!s) return;\n // For optional filters, treat invalid input as \"unset\" rather than surfacing an error.\n if (!/^[0-9]+$/.test(s)) return;\n return BigInt(s);\n}\n\n/**\n * Parse an optional uint64 encoded as a base-10 string into bigint.\n * Empty values are omitted, but supplied invalid values are rejected.\n */\nexport function parseOptionalUint64DecimalStrict(\n raw: string | undefined,\n fieldName: string,\n): bigint | undefined {\n const s = (raw ?? \"\").trim();\n if (!s) return;\n if (!/^[0-9]+$/.test(s)) throw new Error(`${fieldName} must be a positive integer`);\n return BigInt(s);\n}\n\n/**\n * Parse an optional uint64-ish value (string/number/bigint) into bigint, or undefined on invalid/empty.\n * Accepts base-10 strings, numeric inputs (truncated), and bigint inputs.\n */\nexport function parseOptionalUint64Like(\n value: string | number | bigint | undefined | null,\n): bigint | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value === \"bigint\") return value >= 0n ? value : undefined;\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) return undefined;\n const n = Math.trunc(value);\n return n >= 0 ? BigInt(n) : undefined;\n }\n return parseOptionalUint64Decimal(value);\n}\n\n/**\n * Parse an optional positive integer-ish value (string/number) into a number, or undefined on invalid/empty.\n * Useful for common \"limit\" fields coming from UI inputs.\n */\nexport function parseOptionalPositiveIntLike(\n value: string | number | undefined | null,\n): number | undefined {\n if (value === undefined || value === null) return undefined;\n const n = typeof value === \"string\" ? Number(value.trim()) : value;\n return Number.isInteger(n) && n > 0 ? n : undefined;\n}\n\n/**\n * Convert a decimal string into a scaled bigint (e.g. 18dp quantity, 6dp price).\n * @param raw - The raw string to parse.\n * @param scale - The scale of the number.\n * @param fieldName - The name of the field to parse.\n * @returns The parsed bigint.\n * @throws An error if the field is required and not provided.\n * @throws An error if the field is not a positive number.\n */\nexport function decimalToScaledInt(raw: string, scale: number, fieldName: string): bigint {\n const s = (raw ?? \"\").trim();\n if (!s) throw new Error(`${fieldName} is required`);\n if (!/^[0-9]+(\\.[0-9]+)?$/.test(s)) throw new Error(`${fieldName} must be a positive number`);\n const [intPartRaw, fracRaw = \"\"] = s.split(\".\");\n if (fracRaw.length > scale) {\n throw new Error(`${fieldName} supports at most ${scale} decimal places`);\n }\n const intPart = intPartRaw?.replace(/^0+/, \"\") ?? \"0\";\n const fracPart = fracRaw.padEnd(scale, \"0\");\n const combined = `${intPart}${fracPart}`;\n return BigInt(combined ?? \"0\");\n}\n\n/**\n * Parse a quantity scaled to the given number of decimal places.\n * @param raw - The raw string to parse.\n * @param scale - The number of decimal places to scale to.\n * @param fieldName - The name of the field to parse.\n * @returns The parsed bigint.\n * @throws An error if the field is required and not provided.\n * @throws An error if the field is not a positive number.\n */\nexport function parseQtyScaled(raw: string, scale: number, fieldName: string): bigint {\n return decimalToScaledInt(raw, scale, fieldName);\n}\n\n/**\n * Parse a price scaled to 6 decimal places.\n * @param raw - The raw string to parse.\n * @param fieldName - The name of the field to parse.\n * @returns The parsed bigint.\n * @throws An error if the field is required and not provided.\n * @throws An error if the field is not a positive number.\n */\nexport function parsePriceTicks(raw: string, fieldName: string): bigint {\n return decimalToScaledInt(raw, 6, fieldName);\n}\n\n/**\n * Coerce optional UI number into non-negative bigint (e.g. caps, limits).\n * @param value - The value to coerce.\n * @returns The coerced bigint.\n */\nexport function toBigIntOrZero(value?: number | null): bigint {\n if (value == null || Number.isNaN(value)) return 0n;\n return BigInt(Math.max(0, Math.trunc(value)));\n}\n\n/**\n * Coerce optional UI number into non-negative integer.\n * @param value - The value to coerce.\n * @returns The coerced integer.\n */\nexport function toIntOrZero(value?: number | null): number {\n if (value == null || Number.isNaN(value)) return 0;\n return Math.max(0, Math.trunc(value));\n}\n\n/**\n * Coerce optional UI percentage into non-negative basis points integer.\n * @param value - The value to coerce.\n * @returns The coerced integer.\n */\nexport function toBpsOrZero(value?: number | null): number {\n if (value == null || Number.isNaN(value)) return 0;\n return Math.max(0, Math.trunc(value * 100));\n}\n\n/**\n * Convert basis points to percentage.\n * @param value - The value to convert.\n * @returns The converted percentage.\n */\nexport function bpsToPct(value?: number | null): number {\n if (value == null || Number.isNaN(value)) return 0;\n return value / 100;\n}\n"],"mappings":";;;;;AAkCA,SAAgB,iCACZ,KACA,WACkB;CAClB,MAAM,KAAK,OAAO,GAAA,CAAI,KAAK;CAC3B,IAAI,CAAC,GAAG;CACR,IAAI,CAAC,WAAW,KAAK,CAAC,GAAG,MAAM,IAAI,MAAM,GAAG,UAAU,4BAA4B;CAClF,OAAO,OAAO,CAAC;AACnB;;;;;AAuBA,SAAgB,6BACZ,OACkB;CAClB,IAAI,UAAU,KAAA,KAAa,UAAU,MAAM,OAAO,KAAA;CAClD,MAAM,IAAI,OAAO,UAAU,WAAW,OAAO,MAAM,KAAK,CAAC,IAAI;CAC7D,OAAO,OAAO,UAAU,CAAC,KAAK,IAAI,IAAI,IAAI,KAAA;AAC9C;;;;;;AAuDA,SAAgB,eAAe,OAA+B;CAC1D,IAAI,SAAS,QAAQ,OAAO,MAAM,KAAK,GAAG,OAAO;CACjD,OAAO,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC,CAAC;AAChD;;;;;;AAOA,SAAgB,YAAY,OAA+B;CACvD,IAAI,SAAS,QAAQ,OAAO,MAAM,KAAK,GAAG,OAAO;CACjD,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC;AACxC;;;;;;AAOA,SAAgB,YAAY,OAA+B;CACvD,IAAI,SAAS,QAAQ,OAAO,MAAM,KAAK,GAAG,OAAO;CACjD,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,GAAG,CAAC;AAC9C"}
1
+ {"version":3,"file":"numbers.js","names":[],"sources":["../../src/utils/numbers.ts"],"sourcesContent":["// Shared numeric helpers for gRPC/Connect clients.\n\n/**\n * Parse a required uint64 encoded as a base-10 string into bigint.\n * @param raw - The raw string to parse.\n * @param fieldName - The name of the field to parse.\n * @returns The parsed bigint.\n * @throws An error if the field is required and not provided.\n * @throws An error if the field is not a positive integer.\n */\nexport function parseRequiredUint64Decimal(raw: string, fieldName: string): bigint {\n const s = (raw ?? \"\").trim();\n if (!s) throw new Error(`${fieldName} is required`);\n if (!/^[0-9]+$/.test(s)) throw new Error(`${fieldName} must be a positive integer`);\n return BigInt(s);\n}\n\n/**\n * Parse an optional uint64 encoded as a base-10 string into bigint, or undefined on invalid/empty.\n * @param raw - The raw string to parse.\n * @returns The parsed bigint, or undefined if the field is invalid or empty.\n */\nexport function parseOptionalUint64Decimal(raw: string | undefined): bigint | undefined {\n const s = (raw ?? \"\").trim();\n if (!s) return;\n // For optional filters, treat invalid input as \"unset\" rather than surfacing an error.\n if (!/^[0-9]+$/.test(s)) return;\n return BigInt(s);\n}\n\n/**\n * Parse an optional uint64 encoded as a base-10 string into bigint.\n * Empty values are omitted, but supplied invalid values are rejected.\n */\nexport function parseOptionalUint64DecimalStrict(\n raw: string | undefined,\n fieldName: string,\n): bigint | undefined {\n const s = (raw ?? \"\").trim();\n if (!s) return;\n if (!/^[0-9]+$/.test(s)) throw new Error(`${fieldName} must be a positive integer`);\n return BigInt(s);\n}\n\n/**\n * Parse an optional uint64-ish value (string/number/bigint) into bigint, or undefined on invalid/empty.\n * Accepts base-10 strings, numeric inputs (truncated), and bigint inputs.\n */\nexport function parseOptionalUint64Like(\n value: string | number | bigint | undefined | null,\n): bigint | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value === \"bigint\") return value >= 0n ? value : undefined;\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) return undefined;\n const n = Math.trunc(value);\n return n >= 0 ? BigInt(n) : undefined;\n }\n return parseOptionalUint64Decimal(value);\n}\n\n/**\n * Parse an optional positive integer-ish value (string/number) into a number, or undefined on invalid/empty.\n * Useful for common \"limit\" fields coming from UI inputs.\n */\nexport function parseOptionalPositiveIntLike(\n value: string | number | undefined | null,\n): number | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value === \"string\") {\n const decimal = value.trim();\n if (!/^\\d+$/.test(decimal)) return undefined;\n const parsed = Number(decimal);\n return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : undefined;\n }\n return Number.isSafeInteger(value) && value > 0 ? value : undefined;\n}\n\n/**\n * Parse a positive integer-like value without losing precision.\n * Decimal strings may exceed JavaScript's safe-integer range; number inputs may not.\n */\nexport function parseOptionalPositiveBigIntLike(\n value: string | number | undefined | null,\n): bigint | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value === \"number\") {\n return Number.isSafeInteger(value) && value > 0 ? BigInt(value) : undefined;\n }\n const decimal = value.trim();\n if (!/^\\d+$/.test(decimal)) return undefined;\n const parsed = BigInt(decimal);\n return parsed > 0n ? parsed : undefined;\n}\n\n/**\n * Convert a decimal string into a scaled bigint (e.g. 18dp quantity, 6dp price).\n * @param raw - The raw string to parse.\n * @param scale - The scale of the number.\n * @param fieldName - The name of the field to parse.\n * @returns The parsed bigint.\n * @throws An error if the field is required and not provided.\n * @throws An error if the field is not a positive number.\n */\nexport function decimalToScaledInt(raw: string, scale: number, fieldName: string): bigint {\n const s = (raw ?? \"\").trim();\n if (!s) throw new Error(`${fieldName} is required`);\n if (!/^[0-9]+(\\.[0-9]+)?$/.test(s)) throw new Error(`${fieldName} must be a positive number`);\n const [intPartRaw, fracRaw = \"\"] = s.split(\".\");\n if (fracRaw.length > scale) {\n throw new Error(`${fieldName} supports at most ${scale} decimal places`);\n }\n const intPart = intPartRaw?.replace(/^0+/, \"\") ?? \"0\";\n const fracPart = fracRaw.padEnd(scale, \"0\");\n const combined = `${intPart}${fracPart}`;\n return BigInt(combined ?? \"0\");\n}\n\n/**\n * Parse a quantity scaled to the given number of decimal places.\n * @param raw - The raw string to parse.\n * @param scale - The number of decimal places to scale to.\n * @param fieldName - The name of the field to parse.\n * @returns The parsed bigint.\n * @throws An error if the field is required and not provided.\n * @throws An error if the field is not a positive number.\n */\nexport function parseQtyScaled(raw: string, scale: number, fieldName: string): bigint {\n return decimalToScaledInt(raw, scale, fieldName);\n}\n\n/**\n * Parse a price scaled to 6 decimal places.\n * @param raw - The raw string to parse.\n * @param fieldName - The name of the field to parse.\n * @returns The parsed bigint.\n * @throws An error if the field is required and not provided.\n * @throws An error if the field is not a positive number.\n */\nexport function parsePriceTicks(raw: string, fieldName: string): bigint {\n return decimalToScaledInt(raw, 6, fieldName);\n}\n\n/**\n * Coerce optional UI number into non-negative bigint (e.g. caps, limits).\n * @param value - The value to coerce.\n * @returns The coerced bigint.\n */\nexport function toBigIntOrZero(value?: number | null): bigint {\n if (value == null || Number.isNaN(value)) return 0n;\n return BigInt(Math.max(0, Math.trunc(value)));\n}\n\n/**\n * Coerce optional UI number into non-negative integer.\n * @param value - The value to coerce.\n * @returns The coerced integer.\n */\nexport function toIntOrZero(value?: number | null): number {\n if (value == null || Number.isNaN(value)) return 0;\n return Math.max(0, Math.trunc(value));\n}\n\n/**\n * Coerce optional UI percentage into non-negative basis points integer.\n * @param value - The value to coerce.\n * @returns The coerced integer.\n */\nexport function toBpsOrZero(value?: number | null): number {\n if (value == null || Number.isNaN(value)) return 0;\n return Math.max(0, Math.trunc(value * 100));\n}\n\n/**\n * Convert basis points to percentage.\n * @param value - The value to convert.\n * @returns The converted percentage.\n */\nexport function bpsToPct(value?: number | null): number {\n if (value == null || Number.isNaN(value)) return 0;\n return value / 100;\n}\n"],"mappings":";;;;;AAkCA,SAAgB,iCACZ,KACA,WACkB;CAClB,MAAM,KAAK,OAAO,GAAA,CAAI,KAAK;CAC3B,IAAI,CAAC,GAAG;CACR,IAAI,CAAC,WAAW,KAAK,CAAC,GAAG,MAAM,IAAI,MAAM,GAAG,UAAU,4BAA4B;CAClF,OAAO,OAAO,CAAC;AACnB;;;;;AAuBA,SAAgB,6BACZ,OACkB;CAClB,IAAI,UAAU,KAAA,KAAa,UAAU,MAAM,OAAO,KAAA;CAClD,IAAI,OAAO,UAAU,UAAU;EAC3B,MAAM,UAAU,MAAM,KAAK;EAC3B,IAAI,CAAC,QAAQ,KAAK,OAAO,GAAG,OAAO,KAAA;EACnC,MAAM,SAAS,OAAO,OAAO;EAC7B,OAAO,OAAO,cAAc,MAAM,KAAK,SAAS,IAAI,SAAS,KAAA;CACjE;CACA,OAAO,OAAO,cAAc,KAAK,KAAK,QAAQ,IAAI,QAAQ,KAAA;AAC9D;;;;;AAMA,SAAgB,gCACZ,OACkB;CAClB,IAAI,UAAU,KAAA,KAAa,UAAU,MAAM,OAAO,KAAA;CAClD,IAAI,OAAO,UAAU,UACjB,OAAO,OAAO,cAAc,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,KAAA;CAEtE,MAAM,UAAU,MAAM,KAAK;CAC3B,IAAI,CAAC,QAAQ,KAAK,OAAO,GAAG,OAAO,KAAA;CACnC,MAAM,SAAS,OAAO,OAAO;CAC7B,OAAO,SAAS,KAAK,SAAS,KAAA;AAClC;;;;;;AAuDA,SAAgB,eAAe,OAA+B;CAC1D,IAAI,SAAS,QAAQ,OAAO,MAAM,KAAK,GAAG,OAAO;CACjD,OAAO,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC,CAAC;AAChD;;;;;;AAOA,SAAgB,YAAY,OAA+B;CACvD,IAAI,SAAS,QAAQ,OAAO,MAAM,KAAK,GAAG,OAAO;CACjD,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC;AACxC;;;;;;AAOA,SAAgB,YAAY,OAA+B;CACvD,IAAI,SAAS,QAAQ,OAAO,MAAM,KAAK,GAAG,OAAO;CACjD,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,GAAG,CAAC;AAC9C"}
@@ -13,11 +13,29 @@ function toTimestamp({ seconds, nanos }) {
13
13
  */
14
14
  function tsNsToTimestamp(tsNs) {
15
15
  if (tsNs === void 0) return void 0;
16
+ let seconds = tsNs / 1000000000n;
17
+ let nanos = tsNs % 1000000000n;
18
+ if (nanos < 0n) {
19
+ seconds -= 1n;
20
+ nanos += 1000000000n;
21
+ }
16
22
  return toTimestamp({
17
- seconds: tsNs / 1000000000n,
18
- nanos: Number(tsNs % 1000000000n)
23
+ seconds,
24
+ nanos: Number(nanos)
19
25
  });
20
26
  }
27
+ function timestampSeconds(value) {
28
+ if (typeof value === "bigint") return value;
29
+ if (typeof value === "number") return Number.isSafeInteger(value) ? BigInt(value) : null;
30
+ if (typeof value !== "string") return null;
31
+ const trimmed = value.trim();
32
+ return /^-?\d+$/.test(trimmed) ? BigInt(trimmed) : null;
33
+ }
34
+ function timestampNanos(value) {
35
+ if (value === void 0) return 0n;
36
+ if (typeof value !== "number" || !Number.isInteger(value) || value < 0 || value >= 1e9) return null;
37
+ return BigInt(value);
38
+ }
21
39
  /**
22
40
  * Converts supported timestamp-like values to epoch milliseconds.
23
41
  */
@@ -31,20 +49,13 @@ function timestampToMs(value) {
31
49
  const ms = Date.parse(value);
32
50
  return Number.isFinite(ms) ? ms : null;
33
51
  }
34
- if (typeof value !== "object") return null;
35
- const timestamp = value;
36
- const rawSeconds = timestamp.seconds;
37
- const rawNanos = timestamp.nanos;
38
- let seconds = null;
39
- if (typeof rawSeconds === "bigint") seconds = Number(rawSeconds);
40
- else if (typeof rawSeconds === "number") seconds = rawSeconds;
41
- else if (typeof rawSeconds === "string" && rawSeconds.trim().length > 0) {
42
- const parsed = Number(rawSeconds);
43
- seconds = Number.isFinite(parsed) ? parsed : null;
44
- }
45
- if (seconds == null || !Number.isFinite(seconds)) return null;
46
- const nanos = typeof rawNanos === "number" && Number.isFinite(rawNanos) ? rawNanos : 0;
47
- return Math.trunc(seconds * 1e3 + nanos / 1e6);
52
+ if (typeof value !== "object" || !("seconds" in value)) return null;
53
+ const seconds = timestampSeconds(value.seconds);
54
+ const nanos = timestampNanos("nanos" in value ? value.nanos : void 0);
55
+ if (seconds === null || nanos === null) return null;
56
+ const milliseconds = (seconds * 1000000000n + nanos) / 1000000n;
57
+ const output = Number(milliseconds);
58
+ return Number.isSafeInteger(output) ? output : null;
48
59
  }
49
60
  //#endregion
50
61
  export { timestampToMs, toTimestamp, tsNsToTimestamp };
@@ -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 return toTimestamp({\n seconds: tsNs / 1_000_000_000n,\n nanos: Number(tsNs % 1_000_000_000n),\n });\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\") return null;\n const timestamp = value as Record<string, unknown>;\n const rawSeconds = timestamp.seconds;\n const rawNanos = timestamp.nanos;\n\n let seconds: number | null = null;\n if (typeof rawSeconds === \"bigint\") {\n seconds = Number(rawSeconds);\n } else if (typeof rawSeconds === \"number\") {\n seconds = rawSeconds;\n } else if (typeof rawSeconds === \"string\" && rawSeconds.trim().length > 0) {\n const parsed = Number(rawSeconds);\n seconds = Number.isFinite(parsed) ? parsed : null;\n }\n if (seconds == null || !Number.isFinite(seconds)) return null;\n\n const nanos = typeof rawNanos === \"number\" && Number.isFinite(rawNanos) ? rawNanos : 0;\n return Math.trunc(seconds * 1000 + nanos / 1_000_000);\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;CAC/B,OAAO,YAAY;EACf,SAAS,OAAO;EAChB,OAAO,OAAO,OAAO,WAAc;CACvC,CAAC;AACL;;;;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,UAAU,OAAO;CACtC,MAAM,YAAY;CAClB,MAAM,aAAa,UAAU;CAC7B,MAAM,WAAW,UAAU;CAE3B,IAAI,UAAyB;CAC7B,IAAI,OAAO,eAAe,UACtB,UAAU,OAAO,UAAU;MACxB,IAAI,OAAO,eAAe,UAC7B,UAAU;MACP,IAAI,OAAO,eAAe,YAAY,WAAW,KAAK,CAAC,CAAC,SAAS,GAAG;EACvE,MAAM,SAAS,OAAO,UAAU;EAChC,UAAU,OAAO,SAAS,MAAM,IAAI,SAAS;CACjD;CACA,IAAI,WAAW,QAAQ,CAAC,OAAO,SAAS,OAAO,GAAG,OAAO;CAEzD,MAAM,QAAQ,OAAO,aAAa,YAAY,OAAO,SAAS,QAAQ,IAAI,WAAW;CACrF,OAAO,KAAK,MAAM,UAAU,MAAO,QAAQ,GAAS;AACxD"}
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"}
@@ -2,21 +2,9 @@
2
2
  const U64_BITS = 64n;
3
3
  const U64_MASK = (1n << U64_BITS) - 1n;
4
4
  const U128_MAX = (1n << 128n) - 1n;
5
- /**
6
- * Convert a value to a bigint.
7
- * @param v - The value to convert to a bigint.
8
- * @returns The bigint.
9
- */
10
- function toBig(v) {
11
- if (v === void 0 || v === null) return 0n;
12
- if (typeof v === "bigint") return v;
13
- if (typeof v === "number") return BigInt(v);
14
- if (typeof v === "string" && v.length > 0) try {
15
- return BigInt(v);
16
- } catch {
17
- return 0n;
18
- }
19
- return 0n;
5
+ function requireU64(value, part) {
6
+ if (value < 0n || value > U64_MASK) throw new RangeError(`U128 ${part} must be between 0 and 2^64 - 1.`);
7
+ return value;
20
8
  }
21
9
  /**
22
10
  * Convert a {hi, lo} object (or compatible) into a single bigint.
@@ -25,8 +13,8 @@ function toBig(v) {
25
13
  */
26
14
  function fromU128(u) {
27
15
  if (!u) return 0n;
28
- const hi = toBig(u.hi);
29
- const lo = toBig(u.lo);
16
+ const hi = requireU64(u.hi, "hi");
17
+ const lo = requireU64(u.lo, "lo");
30
18
  return (hi << U64_BITS) + lo;
31
19
  }
32
20
  /** Convert a non-negative bigint into the protobuf U128 hi/lo representation. */
@@ -38,6 +26,6 @@ function toU128(value) {
38
26
  };
39
27
  }
40
28
  //#endregion
41
- export { fromU128, toBig, toU128 };
29
+ export { fromU128, toU128 };
42
30
 
43
31
  //# sourceMappingURL=u128.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"u128.js","names":[],"sources":["../../src/utils/u128.ts"],"sourcesContent":["// Utility helpers for working with 128-bit unsigned integers encoded as hi/lo.\n\nconst U64_BITS = 64n;\nconst U64_MASK = (1n << U64_BITS) - 1n;\nconst U128_MAX = (1n << 128n) - 1n;\n\nexport type U128Value = {\n hi: bigint;\n lo: bigint;\n};\n\n/**\n * Convert a value to a bigint.\n * @param v - The value to convert to a bigint.\n * @returns The bigint.\n */\nexport function toBig(v: unknown): bigint {\n if (v === undefined || v === null) return 0n;\n if (typeof v === \"bigint\") return v;\n if (typeof v === \"number\") return BigInt(v);\n if (typeof v === \"string\" && v.length > 0) {\n try {\n return BigInt(v);\n } catch {\n return 0n;\n }\n }\n return 0n;\n}\n\n/**\n * Convert a {hi, lo} object (or compatible) into a single bigint.\n * @param u - The object to convert to a bigint.\n * @returns The bigint.\n */\nexport function fromU128(u: U128Value | undefined): bigint {\n if (!u) return 0n;\n const hi = toBig(u.hi);\n const lo = toBig(u.lo);\n return (hi << U64_BITS) + lo;\n}\n\n/** Convert a non-negative bigint into the protobuf U128 hi/lo representation. */\nexport function toU128(value: bigint): U128Value {\n if (value < 0n || value > U128_MAX) {\n throw new RangeError(\"U128 value must be between 0 and 2^128 - 1.\");\n }\n return {\n hi: value >> U64_BITS,\n lo: value & U64_MASK,\n };\n}\n\n/**\n * Convert a bigint and scale into a decimal string.\n * @param value - The value to convert to a decimal string.\n * @param scale - The scale to convert the value to.\n * @returns The decimal string.\n */\nexport function u128ToDecimal(value: bigint, scale: number): string {\n if (scale <= 0) return value.toString();\n const base = 10n ** BigInt(scale);\n const i = value / base;\n const f = value % base;\n return `${i}.${f.toString().padStart(scale, \"0\")}`;\n}\n"],"mappings":";AAEA,MAAM,WAAW;AACjB,MAAM,YAAY,MAAM,YAAY;AACpC,MAAM,YAAY,MAAM,QAAQ;;;;;;AAYhC,SAAgB,MAAM,GAAoB;CACtC,IAAI,MAAM,KAAA,KAAa,MAAM,MAAM,OAAO;CAC1C,IAAI,OAAO,MAAM,UAAU,OAAO;CAClC,IAAI,OAAO,MAAM,UAAU,OAAO,OAAO,CAAC;CAC1C,IAAI,OAAO,MAAM,YAAY,EAAE,SAAS,GACpC,IAAI;EACA,OAAO,OAAO,CAAC;CACnB,QAAQ;EACJ,OAAO;CACX;CAEJ,OAAO;AACX;;;;;;AAOA,SAAgB,SAAS,GAAkC;CACvD,IAAI,CAAC,GAAG,OAAO;CACf,MAAM,KAAK,MAAM,EAAE,EAAE;CACrB,MAAM,KAAK,MAAM,EAAE,EAAE;CACrB,QAAQ,MAAM,YAAY;AAC9B;;AAGA,SAAgB,OAAO,OAA0B;CAC7C,IAAI,QAAQ,MAAM,QAAQ,UACtB,MAAM,IAAI,WAAW,6CAA6C;CAEtE,OAAO;EACH,IAAI,SAAS;EACb,IAAI,QAAQ;CAChB;AACJ"}
1
+ {"version":3,"file":"u128.js","names":[],"sources":["../../src/utils/u128.ts"],"sourcesContent":["// Utility helpers for working with 128-bit unsigned integers encoded as hi/lo.\n\nconst U64_BITS = 64n;\nconst U64_MASK = (1n << U64_BITS) - 1n;\nconst U128_MAX = (1n << 128n) - 1n;\n\nexport type U128Value = {\n hi: bigint;\n lo: bigint;\n};\n\nfunction requireU64(value: bigint, part: \"hi\" | \"lo\"): bigint {\n if (value < 0n || value > U64_MASK) {\n throw new RangeError(`U128 ${part} must be between 0 and 2^64 - 1.`);\n }\n return value;\n}\n\n/**\n * Convert a {hi, lo} object (or compatible) into a single bigint.\n * @param u - The object to convert to a bigint.\n * @returns The bigint.\n */\nexport function fromU128(u: U128Value | undefined): bigint {\n if (!u) return 0n;\n const hi = requireU64(u.hi, \"hi\");\n const lo = requireU64(u.lo, \"lo\");\n return (hi << U64_BITS) + lo;\n}\n\n/** Convert a non-negative bigint into the protobuf U128 hi/lo representation. */\nexport function toU128(value: bigint): U128Value {\n if (value < 0n || value > U128_MAX) {\n throw new RangeError(\"U128 value must be between 0 and 2^128 - 1.\");\n }\n return {\n hi: value >> U64_BITS,\n lo: value & U64_MASK,\n };\n}\n"],"mappings":";AAEA,MAAM,WAAW;AACjB,MAAM,YAAY,MAAM,YAAY;AACpC,MAAM,YAAY,MAAM,QAAQ;AAOhC,SAAS,WAAW,OAAe,MAA2B;CAC1D,IAAI,QAAQ,MAAM,QAAQ,UACtB,MAAM,IAAI,WAAW,QAAQ,KAAK,iCAAiC;CAEvE,OAAO;AACX;;;;;;AAOA,SAAgB,SAAS,GAAkC;CACvD,IAAI,CAAC,GAAG,OAAO;CACf,MAAM,KAAK,WAAW,EAAE,IAAI,IAAI;CAChC,MAAM,KAAK,WAAW,EAAE,IAAI,IAAI;CAChC,QAAQ,MAAM,YAAY;AAC9B;;AAGA,SAAgB,OAAO,OAA0B;CAC7C,IAAI,QAAQ,MAAM,QAAQ,UACtB,MAAM,IAAI,WAAW,6CAA6C;CAEtE,OAAO;EACH,IAAI,SAAS;EACb,IAAI,QAAQ;CAChB;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"wired-services.d.ts","names":[],"sources":["../src/wired-services.ts"],"mappings":";;;;;;;;;;;cAuCa,oCAAoC"}
1
+ {"version":3,"file":"wired-services.d.ts","names":[],"sources":["../src/wired-services.ts"],"mappings":";;;;;;;;;;;cA2Ca,oCAAoC"}
@@ -6,7 +6,7 @@ import { ApiKeyService } from "./gen/auth/v1/api_keys_pb.js";
6
6
  import { PolicyService } from "./gen/auth/v1/policies_pb.js";
7
7
  import { ProfileService } from "./gen/auth/v1/profile_pb.js";
8
8
  import { LedgerReadService } from "./gen/ledger/read/v1/ledger_read_pb.js";
9
- import { SubaccountService, SubaccountViewService } from "./gen/auth/v1/subaccounts_pb.js";
9
+ import { SubaccountRoleService, SubaccountService, SubaccountViewService } from "./gen/auth/v1/subaccounts_pb.js";
10
10
  import { MarketDataService } from "./gen/marketdata/v1/marketdata_pb.js";
11
11
  import { ChainAnalyticsService } from "./gen/chain/analytics/v1/analytics_read_pb.js";
12
12
  import { MarketOverviewService } from "./gen/marketoverview/v1/marketoverview_pb.js";
@@ -59,6 +59,7 @@ const WIRED_SERVICE_DESCRIPTORS = [
59
59
  RateLimitService,
60
60
  ResolveService,
61
61
  SocialVerificationService,
62
+ SubaccountRoleService,
62
63
  SubaccountService,
63
64
  SubaccountViewService,
64
65
  TriggersService,
@@ -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 { SubaccountService, SubaccountViewService } 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 SubaccountService,\n SubaccountViewService,\n TriggersService,\n VIPService,\n WhiteboardService,\n WithdrawService,\n ZipperService,\n];\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCA,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;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 { 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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@polyester/sdk",
3
- "version": "0.9.1",
3
+ "version": "0.11.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",