@polyester/sdk 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (316) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +63 -17
  3. package/dist/_virtual/_rolldown/runtime.js +15 -1
  4. package/dist/account-signer/types.d.ts.map +1 -1
  5. package/dist/account-signer/types.js +6 -3
  6. package/dist/account-signer/types.js.map +1 -1
  7. package/dist/browser-client.d.ts +4 -2
  8. package/dist/browser-client.d.ts.map +1 -1
  9. package/dist/browser-client.js +3 -4
  10. package/dist/browser-client.js.map +1 -1
  11. package/dist/catalogs/client-catalog.d.ts.map +1 -1
  12. package/dist/catalogs/client-catalog.js +11 -4
  13. package/dist/catalogs/client-catalog.js.map +1 -1
  14. package/dist/catalogs/index.js +1 -1
  15. package/dist/catalogs/readers.d.ts.map +1 -1
  16. package/dist/catalogs/readers.js +3 -1
  17. package/dist/catalogs/readers.js.map +1 -1
  18. package/dist/catalogs/snapshot-validation.js +132 -0
  19. package/dist/catalogs/snapshot-validation.js.map +1 -0
  20. package/dist/catalogs/snapshot.d.ts.map +1 -1
  21. package/dist/catalogs/snapshot.js +16 -7
  22. package/dist/catalogs/snapshot.js.map +1 -1
  23. package/dist/catalogs/zipper-supply.d.ts.map +1 -1
  24. package/dist/catalogs/zipper-supply.js +10 -7
  25. package/dist/catalogs/zipper-supply.js.map +1 -1
  26. package/dist/core-client.d.ts +24 -17
  27. package/dist/core-client.d.ts.map +1 -1
  28. package/dist/core-client.js +21 -3
  29. package/dist/core-client.js.map +1 -1
  30. package/dist/environment.d.ts.map +1 -1
  31. package/dist/environment.js +32 -1
  32. package/dist/environment.js.map +1 -1
  33. package/dist/gen/marketoverview/v1/marketoverview_pb.d.ts +7 -0
  34. package/dist/gen/marketoverview/v1/marketoverview_pb.d.ts.map +1 -1
  35. package/dist/gen/marketoverview/v1/marketoverview_pb.js +1 -1
  36. package/dist/gen/marketoverview/v1/marketoverview_pb.js.map +1 -1
  37. package/dist/index.js +3 -3
  38. package/dist/realtime/client.js +13 -2
  39. package/dist/realtime/client.js.map +1 -1
  40. package/dist/realtime/snapshot-then-stream.js +1 -1
  41. package/dist/realtime/snapshot-then-stream.js.map +1 -1
  42. package/dist/realtime/types.d.ts +2 -0
  43. package/dist/realtime/types.d.ts.map +1 -1
  44. package/dist/server-client.d.ts +17 -8
  45. package/dist/server-client.d.ts.map +1 -1
  46. package/dist/server-client.js +8 -11
  47. package/dist/server-client.js.map +1 -1
  48. package/dist/services/accounts/accounts.js +3 -3
  49. package/dist/services/accounts/accounts.js.map +1 -1
  50. package/dist/services/accounts/accounts.schemas.d.ts +13 -13
  51. package/dist/services/accounts/accounts.schemas.d.ts.map +1 -1
  52. package/dist/services/accounts/accounts.schemas.js +11 -11
  53. package/dist/services/accounts/accounts.schemas.js.map +1 -1
  54. package/dist/services/address-book/address-book.js +28 -28
  55. package/dist/services/address-book/address-book.js.map +1 -1
  56. package/dist/services/address-book/address-book.schemas.d.ts +751 -751
  57. package/dist/services/address-book/address-book.schemas.d.ts.map +1 -1
  58. package/dist/services/address-book/address-book.schemas.js +160 -160
  59. package/dist/services/address-book/address-book.schemas.js.map +1 -1
  60. package/dist/services/api-keys/api-keys.d.ts +6 -6
  61. package/dist/services/api-keys/api-keys.d.ts.map +1 -1
  62. package/dist/services/api-keys/api-keys.js +12 -12
  63. package/dist/services/api-keys/api-keys.js.map +1 -1
  64. package/dist/services/api-keys/api-keys.schemas.d.ts +62 -62
  65. package/dist/services/api-keys/api-keys.schemas.d.ts.map +1 -1
  66. package/dist/services/api-keys/api-keys.schemas.js +34 -34
  67. package/dist/services/api-keys/api-keys.schemas.js.map +1 -1
  68. package/dist/services/auth/auth.d.ts +46 -40
  69. package/dist/services/auth/auth.d.ts.map +1 -1
  70. package/dist/services/auth/auth.js +28 -25
  71. package/dist/services/auth/auth.js.map +1 -1
  72. package/dist/services/auth/profile/profile.d.ts +2 -2
  73. package/dist/services/auth/profile/profile.d.ts.map +1 -1
  74. package/dist/services/auth/profile/profile.js +7 -7
  75. package/dist/services/auth/profile/profile.js.map +1 -1
  76. package/dist/services/auth/profile/profile.schemas.d.ts +41 -41
  77. package/dist/services/auth/profile/profile.schemas.d.ts.map +1 -1
  78. package/dist/services/auth/profile/profile.schemas.js +27 -27
  79. package/dist/services/auth/profile/profile.schemas.js.map +1 -1
  80. package/dist/services/auth/session.d.ts +1 -1
  81. package/dist/services/auth/session.d.ts.map +1 -1
  82. package/dist/services/auth/session.js +6 -2
  83. package/dist/services/auth/session.js.map +1 -1
  84. package/dist/services/auth/session.schemas.js +17 -17
  85. package/dist/services/auth/session.schemas.js.map +1 -1
  86. package/dist/services/auth/session.types.d.ts +3 -2
  87. package/dist/services/auth/session.types.d.ts.map +1 -1
  88. package/dist/services/balances/balances.d.ts +1 -1
  89. package/dist/services/balances/balances.js +9 -9
  90. package/dist/services/balances/balances.js.map +1 -1
  91. package/dist/services/balances/balances.schemas.d.ts +95 -95
  92. package/dist/services/balances/balances.schemas.d.ts.map +1 -1
  93. package/dist/services/balances/balances.schemas.js +61 -61
  94. package/dist/services/balances/balances.schemas.js.map +1 -1
  95. package/dist/services/candles/candles.js +12 -12
  96. package/dist/services/candles/candles.js.map +1 -1
  97. package/dist/services/candles/candles.schemas.d.ts +64 -64
  98. package/dist/services/candles/candles.schemas.d.ts.map +1 -1
  99. package/dist/services/candles/candles.schemas.js +47 -48
  100. package/dist/services/candles/candles.schemas.js.map +1 -1
  101. package/dist/services/chain-analytics/chain-analytics.js +7 -7
  102. package/dist/services/chain-analytics/chain-analytics.js.map +1 -1
  103. package/dist/services/chain-analytics/chain-analytics.schemas.d.ts +68 -68
  104. package/dist/services/chain-analytics/chain-analytics.schemas.d.ts.map +1 -1
  105. package/dist/services/chain-analytics/chain-analytics.schemas.js +29 -29
  106. package/dist/services/chain-analytics/chain-analytics.schemas.js.map +1 -1
  107. package/dist/services/deposit/deposit.js +5 -5
  108. package/dist/services/deposit/deposit.js.map +1 -1
  109. package/dist/services/deposit/deposit.schemas.d.ts +17 -17
  110. package/dist/services/deposit/deposit.schemas.d.ts.map +1 -1
  111. package/dist/services/deposit/deposit.schemas.js +11 -11
  112. package/dist/services/deposit/deposit.schemas.js.map +1 -1
  113. package/dist/services/guard-signer/guard-signer.js +13 -13
  114. package/dist/services/guard-signer/guard-signer.js.map +1 -1
  115. package/dist/services/guard-signer/guard-signer.schemas.d.ts +75 -75
  116. package/dist/services/guard-signer/guard-signer.schemas.d.ts.map +1 -1
  117. package/dist/services/guard-signer/guard-signer.schemas.js +42 -42
  118. package/dist/services/guard-signer/guard-signer.schemas.js.map +1 -1
  119. package/dist/services/heatmap/heatmap.js +9 -9
  120. package/dist/services/heatmap/heatmap.js.map +1 -1
  121. package/dist/services/heatmap/heatmap.schemas.d.ts +141 -141
  122. package/dist/services/heatmap/heatmap.schemas.d.ts.map +1 -1
  123. package/dist/services/heatmap/heatmap.schemas.js +47 -47
  124. package/dist/services/heatmap/heatmap.schemas.js.map +1 -1
  125. package/dist/services/internal-transfers/internal-transfers.js +3 -3
  126. package/dist/services/internal-transfers/internal-transfers.js.map +1 -1
  127. package/dist/services/internal-transfers/internal-transfers.schemas.d.ts +53 -53
  128. package/dist/services/internal-transfers/internal-transfers.schemas.d.ts.map +1 -1
  129. package/dist/services/internal-transfers/internal-transfers.schemas.js +27 -27
  130. package/dist/services/internal-transfers/internal-transfers.schemas.js.map +1 -1
  131. package/dist/services/lifecycle/lifecycle.js +10 -10
  132. package/dist/services/lifecycle/lifecycle.js.map +1 -1
  133. package/dist/services/lifecycle/lifecycle.schemas.d.ts +614 -614
  134. package/dist/services/lifecycle/lifecycle.schemas.d.ts.map +1 -1
  135. package/dist/services/lifecycle/lifecycle.schemas.js +146 -146
  136. package/dist/services/lifecycle/lifecycle.schemas.js.map +1 -1
  137. package/dist/services/market-data/market-data.js +6 -6
  138. package/dist/services/market-data/market-data.js.map +1 -1
  139. package/dist/services/market-data/market-data.schemas.d.ts +20 -20
  140. package/dist/services/market-data/market-data.schemas.d.ts.map +1 -1
  141. package/dist/services/market-data/market-data.schemas.js +51 -55
  142. package/dist/services/market-data/market-data.schemas.js.map +1 -1
  143. package/dist/services/market-overview/market-overview.d.ts +1 -1
  144. package/dist/services/market-overview/market-overview.js +5 -5
  145. package/dist/services/market-overview/market-overview.js.map +1 -1
  146. package/dist/services/market-overview/market-overview.schemas.d.ts +39 -36
  147. package/dist/services/market-overview/market-overview.schemas.d.ts.map +1 -1
  148. package/dist/services/market-overview/market-overview.schemas.js +34 -32
  149. package/dist/services/market-overview/market-overview.schemas.js.map +1 -1
  150. package/dist/services/mfa/mfa.js +27 -27
  151. package/dist/services/mfa/mfa.js.map +1 -1
  152. package/dist/services/mfa/mfa.schemas.d.ts +206 -206
  153. package/dist/services/mfa/mfa.schemas.d.ts.map +1 -1
  154. package/dist/services/mfa/mfa.schemas.js +83 -83
  155. package/dist/services/mfa/mfa.schemas.js.map +1 -1
  156. package/dist/services/orderbook/orderbook.d.ts +2 -2
  157. package/dist/services/orderbook/orderbook.d.ts.map +1 -1
  158. package/dist/services/orderbook/orderbook.js +5 -5
  159. package/dist/services/orderbook/orderbook.js.map +1 -1
  160. package/dist/services/orderbook/orderbook.schemas.d.ts +23 -23
  161. package/dist/services/orderbook/orderbook.schemas.d.ts.map +1 -1
  162. package/dist/services/orderbook/orderbook.schemas.js +15 -15
  163. package/dist/services/orderbook/orderbook.schemas.js.map +1 -1
  164. package/dist/services/orders/order-errors.schemas.d.ts +18 -18
  165. package/dist/services/orders/order-errors.schemas.d.ts.map +1 -1
  166. package/dist/services/orders/order-errors.schemas.js +8 -8
  167. package/dist/services/orders/order-errors.schemas.js.map +1 -1
  168. package/dist/services/orders/orders-batch.schemas.d.ts +492 -492
  169. package/dist/services/orders/orders-batch.schemas.d.ts.map +1 -1
  170. package/dist/services/orders/orders-batch.schemas.js +118 -118
  171. package/dist/services/orders/orders-batch.schemas.js.map +1 -1
  172. package/dist/services/orders/orders-identifiers.schemas.js +5 -5
  173. package/dist/services/orders/orders-identifiers.schemas.js.map +1 -1
  174. package/dist/services/orders/orders-input.schemas.d.ts +657 -648
  175. package/dist/services/orders/orders-input.schemas.d.ts.map +1 -1
  176. package/dist/services/orders/orders-input.schemas.js +100 -96
  177. package/dist/services/orders/orders-input.schemas.js.map +1 -1
  178. package/dist/services/orders/orders-modify.schemas.d.ts +370 -351
  179. package/dist/services/orders/orders-modify.schemas.d.ts.map +1 -1
  180. package/dist/services/orders/orders-modify.schemas.js +48 -44
  181. package/dist/services/orders/orders-modify.schemas.js.map +1 -1
  182. package/dist/services/orders/orders-output.schemas.d.ts +179 -179
  183. package/dist/services/orders/orders-output.schemas.d.ts.map +1 -1
  184. package/dist/services/orders/orders-output.schemas.js +49 -49
  185. package/dist/services/orders/orders-output.schemas.js.map +1 -1
  186. package/dist/services/orders/orders-risk.schemas.d.ts +226 -226
  187. package/dist/services/orders/orders-risk.schemas.d.ts.map +1 -1
  188. package/dist/services/orders/orders-risk.schemas.js +69 -69
  189. package/dist/services/orders/orders-risk.schemas.js.map +1 -1
  190. package/dist/services/orders/orders.d.ts +8 -8
  191. package/dist/services/orders/orders.d.ts.map +1 -1
  192. package/dist/services/orders/orders.js +44 -32
  193. package/dist/services/orders/orders.js.map +1 -1
  194. package/dist/services/policies/api-key-policies/api-key-policies.d.ts +6 -6
  195. package/dist/services/policies/api-key-policies/api-key-policies.d.ts.map +1 -1
  196. package/dist/services/policies/api-key-policies/api-key-policies.js +11 -11
  197. package/dist/services/policies/api-key-policies/api-key-policies.js.map +1 -1
  198. package/dist/services/policies/api-key-policies/api-key-policies.schemas.d.ts +105 -105
  199. package/dist/services/policies/api-key-policies/api-key-policies.schemas.d.ts.map +1 -1
  200. package/dist/services/policies/api-key-policies/api-key-policies.schemas.js +49 -49
  201. package/dist/services/policies/api-key-policies/api-key-policies.schemas.js.map +1 -1
  202. package/dist/services/policies/shared.d.ts +5 -5
  203. package/dist/services/policies/shared.d.ts.map +1 -1
  204. package/dist/services/policies/shared.js +10 -10
  205. package/dist/services/policies/shared.js.map +1 -1
  206. package/dist/services/policies/subaccount-policies/subaccount-policies.d.ts +6 -6
  207. package/dist/services/policies/subaccount-policies/subaccount-policies.d.ts.map +1 -1
  208. package/dist/services/policies/subaccount-policies/subaccount-policies.js +13 -13
  209. package/dist/services/policies/subaccount-policies/subaccount-policies.js.map +1 -1
  210. package/dist/services/policies/subaccount-policies/subaccount-policies.schemas.d.ts +124 -124
  211. package/dist/services/policies/subaccount-policies/subaccount-policies.schemas.d.ts.map +1 -1
  212. package/dist/services/policies/subaccount-policies/subaccount-policies.schemas.js +75 -75
  213. package/dist/services/policies/subaccount-policies/subaccount-policies.schemas.js.map +1 -1
  214. package/dist/services/shared.js +11 -11
  215. package/dist/services/shared.js.map +1 -1
  216. package/dist/services/social-verification/social-verification.d.ts +3 -3
  217. package/dist/services/social-verification/social-verification.d.ts.map +1 -1
  218. package/dist/services/social-verification/social-verification.js +7 -7
  219. package/dist/services/social-verification/social-verification.js.map +1 -1
  220. package/dist/services/social-verification/social-verification.schemas.d.ts +54 -54
  221. package/dist/services/social-verification/social-verification.schemas.d.ts.map +1 -1
  222. package/dist/services/social-verification/social-verification.schemas.js +28 -28
  223. package/dist/services/social-verification/social-verification.schemas.js.map +1 -1
  224. package/dist/services/subaccount-resolver.js +5 -3
  225. package/dist/services/subaccount-resolver.js.map +1 -1
  226. package/dist/services/subaccounts/subaccounts.d.ts +15 -15
  227. package/dist/services/subaccounts/subaccounts.d.ts.map +1 -1
  228. package/dist/services/subaccounts/subaccounts.js +35 -35
  229. package/dist/services/subaccounts/subaccounts.js.map +1 -1
  230. package/dist/services/subaccounts/subaccounts.schemas.d.ts +137 -137
  231. package/dist/services/subaccounts/subaccounts.schemas.d.ts.map +1 -1
  232. package/dist/services/subaccounts/subaccounts.schemas.js +72 -72
  233. package/dist/services/subaccounts/subaccounts.schemas.js.map +1 -1
  234. package/dist/services/trades/trades.d.ts +2 -2
  235. package/dist/services/trades/trades.d.ts.map +1 -1
  236. package/dist/services/trades/trades.js +5 -5
  237. package/dist/services/trades/trades.js.map +1 -1
  238. package/dist/services/trades/trades.schemas.d.ts +31 -31
  239. package/dist/services/trades/trades.schemas.d.ts.map +1 -1
  240. package/dist/services/trades/trades.schemas.js +24 -24
  241. package/dist/services/trades/trades.schemas.js.map +1 -1
  242. package/dist/services/trading-withdraws/trading-withdraws.js +8 -8
  243. package/dist/services/trading-withdraws/trading-withdraws.js.map +1 -1
  244. package/dist/services/trading-withdraws/trading-withdraws.schemas.d.ts +45 -45
  245. package/dist/services/trading-withdraws/trading-withdraws.schemas.d.ts.map +1 -1
  246. package/dist/services/trading-withdraws/trading-withdraws.schemas.js +36 -36
  247. package/dist/services/trading-withdraws/trading-withdraws.schemas.js.map +1 -1
  248. package/dist/services/transfers/transfers.d.ts +1 -1
  249. package/dist/services/transfers/transfers.d.ts.map +1 -1
  250. package/dist/services/transfers/transfers.js +5 -5
  251. package/dist/services/transfers/transfers.js.map +1 -1
  252. package/dist/services/transfers/transfers.schemas.d.ts +42 -42
  253. package/dist/services/transfers/transfers.schemas.d.ts.map +1 -1
  254. package/dist/services/transfers/transfers.schemas.js +30 -30
  255. package/dist/services/transfers/transfers.schemas.js.map +1 -1
  256. package/dist/services/triggers/trigger-child-order.schemas.js +23 -23
  257. package/dist/services/triggers/trigger-child-order.schemas.js.map +1 -1
  258. package/dist/services/triggers/trigger-input.schemas.d.ts +226 -226
  259. package/dist/services/triggers/trigger-input.schemas.d.ts.map +1 -1
  260. package/dist/services/triggers/trigger-input.schemas.js +53 -53
  261. package/dist/services/triggers/trigger-input.schemas.js.map +1 -1
  262. package/dist/services/triggers/triggers-output.schemas.d.ts +218 -218
  263. package/dist/services/triggers/triggers-output.schemas.d.ts.map +1 -1
  264. package/dist/services/triggers/triggers-output.schemas.js +152 -152
  265. package/dist/services/triggers/triggers-output.schemas.js.map +1 -1
  266. package/dist/services/triggers/triggers.js +21 -21
  267. package/dist/services/triggers/triggers.js.map +1 -1
  268. package/dist/services/whiteboard/whiteboard.js +15 -15
  269. package/dist/services/whiteboard/whiteboard.js.map +1 -1
  270. package/dist/services/whiteboard/whiteboard.schemas.d.ts +379 -379
  271. package/dist/services/whiteboard/whiteboard.schemas.d.ts.map +1 -1
  272. package/dist/services/whiteboard/whiteboard.schemas.js +71 -71
  273. package/dist/services/whiteboard/whiteboard.schemas.js.map +1 -1
  274. package/dist/services/zipper/zipper.js +3 -3
  275. package/dist/services/zipper/zipper.js.map +1 -1
  276. package/dist/services/zipper/zipper.schemas.d.ts +1 -1
  277. package/dist/services/zipper/zipper.schemas.js +54 -54
  278. package/dist/services/zipper/zipper.schemas.js.map +1 -1
  279. package/dist/shared/account-scope.d.ts +6 -6
  280. package/dist/shared/account-scope.d.ts.map +1 -1
  281. package/dist/shared/account-scope.js +3 -3
  282. package/dist/shared/account-scope.js.map +1 -1
  283. package/dist/shared/connect-error-mapping.d.ts +1 -1
  284. package/dist/shared/connect-error-mapping.js +29 -3
  285. package/dist/shared/connect-error-mapping.js.map +1 -1
  286. package/dist/shared/rate-limit.schemas.d.ts +12 -12
  287. package/dist/shared/rate-limit.schemas.d.ts.map +1 -1
  288. package/dist/shared/rate-limit.schemas.js +7 -7
  289. package/dist/shared/rate-limit.schemas.js.map +1 -1
  290. package/dist/shared/schemas.js +26 -26
  291. package/dist/shared/schemas.js.map +1 -1
  292. package/dist/shared/transports.js +7 -12
  293. package/dist/shared/transports.js.map +1 -1
  294. package/dist/shared/types.d.ts +12 -0
  295. package/dist/shared/types.d.ts.map +1 -1
  296. package/dist/shared/validation.d.ts +14 -0
  297. package/dist/shared/validation.d.ts.map +1 -0
  298. package/dist/shared/validation.js +24 -0
  299. package/dist/shared/validation.js.map +1 -0
  300. package/dist/utils/connect-order-errors.js +2 -2
  301. package/dist/utils/connect-order-errors.js.map +1 -1
  302. package/dist/utils/cookies.d.ts +8 -3
  303. package/dist/utils/cookies.d.ts.map +1 -1
  304. package/dist/utils/cookies.js +7 -1
  305. package/dist/utils/cookies.js.map +1 -1
  306. package/dist/utils/event-emitter.d.ts +1 -1
  307. package/dist/utils/event-emitter.d.ts.map +1 -1
  308. package/dist/utils/event-emitter.js +4 -2
  309. package/dist/utils/event-emitter.js.map +1 -1
  310. package/dist/utils/evm.js +2 -2
  311. package/dist/utils/evm.js.map +1 -1
  312. package/dist/utils/jwt.d.ts +2 -2
  313. package/dist/utils/jwt.d.ts.map +1 -1
  314. package/dist/utils/jwt.js +2 -2
  315. package/dist/utils/jwt.js.map +1 -1
  316. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"connect-order-errors.js","names":[],"sources":["../../src/utils/connect-order-errors.ts"],"sourcesContent":["import { ConnectError } from \"@connectrpc/connect\";\nimport * as v from \"valibot\";\nimport { ErrorDetailSchema } from \"../gen/orders/v1/orders_pb.js\";\nimport {\n OrderErrorDetailSchema,\n type OrderErrorDetail,\n} from \"../services/orders/order-errors.schemas.js\";\nimport { toPolyesterError } from \"../shared/connect-error-mapping.js\";\nimport { StaleQuoteError } from \"../shared/errors.js\";\n\n/**\n * Returns the first structured Orders API rejection detail in an error cause chain.\n * Invalid or unrelated details are ignored rather than exposing transport prose.\n */\nexport function getOrderErrorDetail(error: unknown): OrderErrorDetail | undefined {\n const seen = new Set<unknown>();\n let current: unknown = error;\n\n for (let depth = 0; depth < 5 && current != null && !seen.has(current); depth += 1) {\n seen.add(current);\n const details = ConnectError.from(current).findDetails(ErrorDetailSchema);\n for (const detail of details) {\n const parsed = v.safeParse(OrderErrorDetailSchema, detail);\n if (parsed.success) return parsed.output;\n }\n\n current = current instanceof Error ? current.cause : undefined;\n }\n\n return undefined;\n}\n\n/**\n * True when an order mutation was rejected because its client reference quote\n * exceeded the backend's configured drift limit.\n */\nexport function isStaleQuoteError(error: unknown): boolean {\n let current = error;\n\n for (let depth = 0; depth < 5; depth += 1) {\n if (toPolyesterError(current) instanceof StaleQuoteError) return true;\n if (!(current instanceof Error) || current.cause === undefined) return false;\n current = current.cause;\n }\n\n return false;\n}\n"],"mappings":";;;;;;;;;;;AAcA,SAAgB,oBAAoB,OAA8C;CAC9E,MAAM,uBAAO,IAAI,IAAa;CAC9B,IAAI,UAAmB;CAEvB,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,WAAW,QAAQ,CAAC,KAAK,IAAI,OAAO,GAAG,SAAS,GAAG;EAChF,KAAK,IAAI,OAAO;EAChB,MAAM,UAAU,aAAa,KAAK,OAAO,CAAC,CAAC,YAAY,iBAAiB;EACxE,KAAK,MAAM,UAAU,SAAS;GAC1B,MAAM,SAAS,EAAE,UAAU,wBAAwB,MAAM;GACzD,IAAI,OAAO,SAAS,OAAO,OAAO;EACtC;EAEA,UAAU,mBAAmB,QAAQ,QAAQ,QAAQ,KAAA;CACzD;AAGJ;;;;;AAMA,SAAgB,kBAAkB,OAAyB;CACvD,IAAI,UAAU;CAEd,KAAK,IAAI,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG;EACvC,IAAI,iBAAiB,OAAO,aAAa,iBAAiB,OAAO;EACjE,IAAI,EAAE,mBAAmB,UAAU,QAAQ,UAAU,KAAA,GAAW,OAAO;EACvE,UAAU,QAAQ;CACtB;CAEA,OAAO;AACX"}
1
+ {"version":3,"file":"connect-order-errors.js","names":["v"],"sources":["../../src/utils/connect-order-errors.ts"],"sourcesContent":["import { ConnectError } from \"@connectrpc/connect\";\nimport * as v from \"../shared/validation.js\";\nimport { ErrorDetailSchema } from \"../gen/orders/v1/orders_pb.js\";\nimport {\n OrderErrorDetailSchema,\n type OrderErrorDetail,\n} from \"../services/orders/order-errors.schemas.js\";\nimport { toPolyesterError } from \"../shared/connect-error-mapping.js\";\nimport { StaleQuoteError } from \"../shared/errors.js\";\n\n/**\n * Returns the first structured Orders API rejection detail in an error cause chain.\n * Invalid or unrelated details are ignored rather than exposing transport prose.\n */\nexport function getOrderErrorDetail(error: unknown): OrderErrorDetail | undefined {\n const seen = new Set<unknown>();\n let current: unknown = error;\n\n for (let depth = 0; depth < 5 && current != null && !seen.has(current); depth += 1) {\n seen.add(current);\n const details = ConnectError.from(current).findDetails(ErrorDetailSchema);\n for (const detail of details) {\n const parsed = v.safeParse(OrderErrorDetailSchema, detail);\n if (parsed.success) return parsed.output;\n }\n\n current = current instanceof Error ? current.cause : undefined;\n }\n\n return undefined;\n}\n\n/**\n * True when an order mutation was rejected because its client reference quote\n * exceeded the backend's configured drift limit.\n */\nexport function isStaleQuoteError(error: unknown): boolean {\n let current = error;\n\n for (let depth = 0; depth < 5; depth += 1) {\n if (toPolyesterError(current) instanceof StaleQuoteError) return true;\n if (!(current instanceof Error) || current.cause === undefined) return false;\n current = current.cause;\n }\n\n return false;\n}\n"],"mappings":";;;;;;;;;;;AAcA,SAAgB,oBAAoB,OAA8C;CAC9E,MAAM,uBAAO,IAAI,IAAa;CAC9B,IAAI,UAAmB;CAEvB,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,WAAW,QAAQ,CAAC,KAAK,IAAI,OAAO,GAAG,SAAS,GAAG;EAChF,KAAK,IAAI,OAAO;EAChB,MAAM,UAAU,aAAa,KAAK,OAAO,CAAC,CAAC,YAAY,iBAAiB;EACxE,KAAK,MAAM,UAAU,SAAS;GAC1B,MAAM,SAASA,mBAAE,UAAU,wBAAwB,MAAM;GACzD,IAAI,OAAO,SAAS,OAAO,OAAO;EACtC;EAEA,UAAU,mBAAmB,QAAQ,QAAQ,QAAQ,KAAA;CACzD;AAGJ;;;;;AAMA,SAAgB,kBAAkB,OAAyB;CACvD,IAAI,UAAU;CAEd,KAAK,IAAI,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG;EACvC,IAAI,iBAAiB,OAAO,aAAa,iBAAiB,OAAO;EACjE,IAAI,EAAE,mBAAmB,UAAU,QAAQ,UAAU,KAAA,GAAW,OAAO;EACvE,UAAU,QAAQ;CACtB;CAEA,OAAO;AACX"}
@@ -1,7 +1,12 @@
1
1
  //#region src/utils/cookies.d.ts
2
- type CookieGetter = Record<string, string> | {
3
- get(name: string): string | undefined;
4
- } | Request;
2
+ type CookieValue = string | {
3
+ readonly value: string;
4
+ };
5
+ type CookieStoreLike = {
6
+ get(name: string): CookieValue | undefined;
7
+ };
8
+ /** A supported server-side cookie source. */
9
+ type CookieGetter = Record<string, string> | CookieStoreLike | Request;
5
10
  //#endregion
6
11
  export { CookieGetter };
7
12
  //# sourceMappingURL=cookies.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cookies.d.ts","names":[],"sources":["../../src/utils/cookies.ts"],"mappings":";KA6DY,eACN;EACE,IAAI;IACN"}
1
+ {"version":3,"file":"cookies.d.ts","names":[],"sources":["../../src/utils/cookies.ts"],"mappings":";KA6DK;WAAkC;;KAClC;EAAoB,IAAI,eAAe;;;KAGhC,eAAe,yBAAyB,kBAAkB"}
@@ -42,6 +42,9 @@ function deleteCookie(name, options) {
42
42
  expires: /* @__PURE__ */ new Date("Thu, 01 Jan 1970 00:00:00 GMT")
43
43
  });
44
44
  }
45
+ function isCookieStore(cookies) {
46
+ return typeof cookies.get === "function";
47
+ }
45
48
  /**
46
49
  * Parses cookies from a Request header.
47
50
  */
@@ -55,7 +58,10 @@ function parseCookiesFromRequest(request) {
55
58
  */
56
59
  function getCookieValue(cookies, name) {
57
60
  if (cookies instanceof Request) return parseCookiesFromRequest(cookies)[name];
58
- if (typeof cookies.get === "function") return cookies.get(name);
61
+ if (isCookieStore(cookies)) {
62
+ const cookie = cookies.get(name);
63
+ return typeof cookie === "string" ? cookie : cookie?.value;
64
+ }
59
65
  return cookies[name];
60
66
  }
61
67
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"cookies.js","names":["serializeCookie","parseCookie","#name"],"sources":["../../src/utils/cookies.ts"],"sourcesContent":["import {\n type Cookies,\n type CookieSerializeOptions,\n parseCookie,\n serializeCookie,\n} from \"./cookie-es/index.js\";\nimport { isLocalNetworkHost } from \"./is-dev.js\";\n\n/**\n * Whether auth cookies should carry the `Secure` attribute.\n *\n * On https pages: always Secure. On plaintext pages, browsers silently DROP\n * Secure cookies (localhost excepted), so dev against a LAN IP — e.g. phone\n * testing http://192.168.x.x — logged users out instantly because the freshly\n * written session cookies never persisted. The downgrade is therefore allowed\n * ONLY on local/private-network hosts; on a public hostname served over http\n * (a misconfigured production deployment) cookies stay Secure so auth fails\n * closed instead of shipping session cookies over plaintext.\n */\nexport function shouldSecureCookies(): boolean {\n if (typeof window === \"undefined\") return true;\n if (window.location.protocol === \"https:\") return true;\n return !isLocalNetworkHost(window.location.hostname);\n}\n\ninterface SetCookieParams {\n name: string;\n value: string;\n options: CookieSerializeOptions;\n}\n\n/**\n * Writes a browser cookie.\n */\nexport function setCookie({ name, value, options }: SetCookieParams): void {\n if (typeof document === \"undefined\") return;\n\n document.cookie = serializeCookie(name, value, options);\n}\n\n/**\n * Reads a browser cookie by name.\n */\nexport function getCookie(name: string): string | undefined {\n if (typeof document === \"undefined\") return;\n\n return parseCookie(document.cookie)[name];\n}\n\n/**\n * Deletes a browser cookie by name.\n */\nexport function deleteCookie(name: string, options?: { path?: string }): void {\n if (typeof document === \"undefined\") return;\n\n document.cookie = serializeCookie(name, \"\", {\n path: options?.path ?? \"/\",\n expires: new Date(\"Thu, 01 Jan 1970 00:00:00 GMT\"),\n });\n}\n\nexport type CookieGetter =\n | Record<string, string>\n | { get(name: string): string | undefined }\n | Request;\n\n/**\n * Parses cookies from a Request header.\n */\nexport function parseCookiesFromRequest(request: Request): Cookies {\n const cookieHeader = request.headers.get(\"cookie\");\n if (!cookieHeader) return {};\n\n return parseCookie(cookieHeader);\n}\n\n/**\n * Reads a cookie value from either a cookie map or cookie getter.\n */\nexport function getCookieValue(cookies: CookieGetter, name: string): string | undefined {\n if (cookies instanceof Request) {\n const parsed = parseCookiesFromRequest(cookies);\n return parsed[name];\n }\n if (typeof cookies.get === \"function\") {\n return cookies.get(name);\n }\n return (cookies as Record<string, string>)[name];\n}\n\ninterface CookieManagerOptions {\n /**\n * The name of the cookie to manage.\n */\n name: string;\n}\n\n/**\n * A generic class for managing cookies on the client side.\n * Provides a consistent interface for getting, setting, and deleting cookies.\n *\n * @example\n * ```ts\n * const cookieManager = new CookieManager({ name: \"my-cookie\" });\n * cookieManager.get();\n * cookieManager.set(\"my-value\");\n * cookieManager.clear();\n * ```\n */\nexport class CookieManager {\n #name: string;\n constructor(opts: CookieManagerOptions) {\n this.#name = opts.name;\n }\n /**\n * Reads the managed cookie value.\n */\n get(): string | null {\n const token = getCookie(this.#name);\n return token ?? null;\n }\n\n /**\n * Writes the managed cookie value.\n */\n set(\n token: string,\n options?: {\n path?: string;\n secure?: boolean;\n sameSite?: \"lax\" | \"strict\" | \"none\";\n maxAge?: number;\n expires?: Date;\n },\n ): void {\n setCookie({\n name: this.#name,\n value: token,\n options: {\n path: options?.path ?? \"/\",\n sameSite: options?.sameSite ?? \"lax\",\n secure: options?.secure ?? shouldSecureCookies(),\n maxAge: options?.maxAge,\n expires: options?.expires,\n },\n });\n }\n\n /**\n * Clears the managed cookie value.\n */\n clear(options?: { path?: string }): void {\n deleteCookie(this.#name, options);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAmBA,SAAgB,sBAA+B;CAC3C,IAAI,OAAO,WAAW,aAAa,OAAO;CAC1C,IAAI,OAAO,SAAS,aAAa,UAAU,OAAO;CAClD,OAAO,CAAC,mBAAmB,OAAO,SAAS,QAAQ;AACvD;;;;AAWA,SAAgB,UAAU,EAAE,MAAM,OAAO,WAAkC;CACvE,IAAI,OAAO,aAAa,aAAa;CAErC,SAAS,SAASA,UAAgB,MAAM,OAAO,OAAO;AAC1D;;;;AAKA,SAAgB,UAAU,MAAkC;CACxD,IAAI,OAAO,aAAa,aAAa;CAErC,OAAOC,MAAY,SAAS,MAAM,CAAC,CAAC;AACxC;;;;AAKA,SAAgB,aAAa,MAAc,SAAmC;CAC1E,IAAI,OAAO,aAAa,aAAa;CAErC,SAAS,SAASD,UAAgB,MAAM,IAAI;EACxC,MAAM,SAAS,QAAQ;EACvB,yBAAS,IAAI,KAAK,+BAA+B;CACrD,CAAC;AACL;;;;AAUA,SAAgB,wBAAwB,SAA2B;CAC/D,MAAM,eAAe,QAAQ,QAAQ,IAAI,QAAQ;CACjD,IAAI,CAAC,cAAc,OAAO,CAAC;CAE3B,OAAOC,MAAY,YAAY;AACnC;;;;AAKA,SAAgB,eAAe,SAAuB,MAAkC;CACpF,IAAI,mBAAmB,SAEnB,OADe,wBAAwB,OAC3B,CAAC,CAAC;CAElB,IAAI,OAAO,QAAQ,QAAQ,YACvB,OAAO,QAAQ,IAAI,IAAI;CAE3B,OAAQ,QAAmC;AAC/C;;;;;;;;;;;;;AAqBA,IAAa,gBAAb,MAA2B;CACvB;CACA,YAAY,MAA4B;EACpC,KAAKC,QAAQ,KAAK;CACtB;;;;CAIA,MAAqB;EAEjB,OADc,UAAU,KAAKA,KAClB,KAAK;CACpB;;;;CAKA,IACI,OACA,SAOI;EACJ,UAAU;GACN,MAAM,KAAKA;GACX,OAAO;GACP,SAAS;IACL,MAAM,SAAS,QAAQ;IACvB,UAAU,SAAS,YAAY;IAC/B,QAAQ,SAAS,UAAU,oBAAoB;IAC/C,QAAQ,SAAS;IACjB,SAAS,SAAS;GACtB;EACJ,CAAC;CACL;;;;CAKA,MAAM,SAAmC;EACrC,aAAa,KAAKA,OAAO,OAAO;CACpC;AACJ"}
1
+ {"version":3,"file":"cookies.js","names":["serializeCookie","parseCookie","#name"],"sources":["../../src/utils/cookies.ts"],"sourcesContent":["import {\n type Cookies,\n type CookieSerializeOptions,\n parseCookie,\n serializeCookie,\n} from \"./cookie-es/index.js\";\nimport { isLocalNetworkHost } from \"./is-dev.js\";\n\n/**\n * Whether auth cookies should carry the `Secure` attribute.\n *\n * On https pages: always Secure. On plaintext pages, browsers silently DROP\n * Secure cookies (localhost excepted), so dev against a LAN IP — e.g. phone\n * testing http://192.168.x.x — logged users out instantly because the freshly\n * written session cookies never persisted. The downgrade is therefore allowed\n * ONLY on local/private-network hosts; on a public hostname served over http\n * (a misconfigured production deployment) cookies stay Secure so auth fails\n * closed instead of shipping session cookies over plaintext.\n */\nexport function shouldSecureCookies(): boolean {\n if (typeof window === \"undefined\") return true;\n if (window.location.protocol === \"https:\") return true;\n return !isLocalNetworkHost(window.location.hostname);\n}\n\ninterface SetCookieParams {\n name: string;\n value: string;\n options: CookieSerializeOptions;\n}\n\n/**\n * Writes a browser cookie.\n */\nexport function setCookie({ name, value, options }: SetCookieParams): void {\n if (typeof document === \"undefined\") return;\n\n document.cookie = serializeCookie(name, value, options);\n}\n\n/**\n * Reads a browser cookie by name.\n */\nexport function getCookie(name: string): string | undefined {\n if (typeof document === \"undefined\") return;\n\n return parseCookie(document.cookie)[name];\n}\n\n/**\n * Deletes a browser cookie by name.\n */\nexport function deleteCookie(name: string, options?: { path?: string }): void {\n if (typeof document === \"undefined\") return;\n\n document.cookie = serializeCookie(name, \"\", {\n path: options?.path ?? \"/\",\n expires: new Date(\"Thu, 01 Jan 1970 00:00:00 GMT\"),\n });\n}\n\ntype CookieValue = string | { readonly value: string };\ntype CookieStoreLike = { get(name: string): CookieValue | undefined };\n\n/** A supported server-side cookie source. */\nexport type CookieGetter = Record<string, string> | CookieStoreLike | Request;\n\nfunction isCookieStore(\n cookies: Record<string, string> | CookieStoreLike,\n): cookies is CookieStoreLike {\n return typeof cookies.get === \"function\";\n}\n\n/**\n * Parses cookies from a Request header.\n */\nexport function parseCookiesFromRequest(request: Request): Cookies {\n const cookieHeader = request.headers.get(\"cookie\");\n if (!cookieHeader) return {};\n\n return parseCookie(cookieHeader);\n}\n\n/**\n * Reads a cookie value from either a cookie map or cookie getter.\n */\nexport function getCookieValue(cookies: CookieGetter, name: string): string | undefined {\n if (cookies instanceof Request) {\n const parsed = parseCookiesFromRequest(cookies);\n return parsed[name];\n }\n if (isCookieStore(cookies)) {\n const cookie = cookies.get(name);\n return typeof cookie === \"string\" ? cookie : cookie?.value;\n }\n return cookies[name];\n}\n\ninterface CookieManagerOptions {\n /**\n * The name of the cookie to manage.\n */\n name: string;\n}\n\n/**\n * A generic class for managing cookies on the client side.\n * Provides a consistent interface for getting, setting, and deleting cookies.\n *\n * @example\n * ```ts\n * const cookieManager = new CookieManager({ name: \"my-cookie\" });\n * cookieManager.get();\n * cookieManager.set(\"my-value\");\n * cookieManager.clear();\n * ```\n */\nexport class CookieManager {\n #name: string;\n constructor(opts: CookieManagerOptions) {\n this.#name = opts.name;\n }\n /**\n * Reads the managed cookie value.\n */\n get(): string | null {\n const token = getCookie(this.#name);\n return token ?? null;\n }\n\n /**\n * Writes the managed cookie value.\n */\n set(\n token: string,\n options?: {\n path?: string;\n secure?: boolean;\n sameSite?: \"lax\" | \"strict\" | \"none\";\n maxAge?: number;\n expires?: Date;\n },\n ): void {\n setCookie({\n name: this.#name,\n value: token,\n options: {\n path: options?.path ?? \"/\",\n sameSite: options?.sameSite ?? \"lax\",\n secure: options?.secure ?? shouldSecureCookies(),\n maxAge: options?.maxAge,\n expires: options?.expires,\n },\n });\n }\n\n /**\n * Clears the managed cookie value.\n */\n clear(options?: { path?: string }): void {\n deleteCookie(this.#name, options);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAmBA,SAAgB,sBAA+B;CAC3C,IAAI,OAAO,WAAW,aAAa,OAAO;CAC1C,IAAI,OAAO,SAAS,aAAa,UAAU,OAAO;CAClD,OAAO,CAAC,mBAAmB,OAAO,SAAS,QAAQ;AACvD;;;;AAWA,SAAgB,UAAU,EAAE,MAAM,OAAO,WAAkC;CACvE,IAAI,OAAO,aAAa,aAAa;CAErC,SAAS,SAASA,UAAgB,MAAM,OAAO,OAAO;AAC1D;;;;AAKA,SAAgB,UAAU,MAAkC;CACxD,IAAI,OAAO,aAAa,aAAa;CAErC,OAAOC,MAAY,SAAS,MAAM,CAAC,CAAC;AACxC;;;;AAKA,SAAgB,aAAa,MAAc,SAAmC;CAC1E,IAAI,OAAO,aAAa,aAAa;CAErC,SAAS,SAASD,UAAgB,MAAM,IAAI;EACxC,MAAM,SAAS,QAAQ;EACvB,yBAAS,IAAI,KAAK,+BAA+B;CACrD,CAAC;AACL;AAQA,SAAS,cACL,SAC0B;CAC1B,OAAO,OAAO,QAAQ,QAAQ;AAClC;;;;AAKA,SAAgB,wBAAwB,SAA2B;CAC/D,MAAM,eAAe,QAAQ,QAAQ,IAAI,QAAQ;CACjD,IAAI,CAAC,cAAc,OAAO,CAAC;CAE3B,OAAOC,MAAY,YAAY;AACnC;;;;AAKA,SAAgB,eAAe,SAAuB,MAAkC;CACpF,IAAI,mBAAmB,SAEnB,OADe,wBAAwB,OAC3B,CAAC,CAAC;CAElB,IAAI,cAAc,OAAO,GAAG;EACxB,MAAM,SAAS,QAAQ,IAAI,IAAI;EAC/B,OAAO,OAAO,WAAW,WAAW,SAAS,QAAQ;CACzD;CACA,OAAO,QAAQ;AACnB;;;;;;;;;;;;;AAqBA,IAAa,gBAAb,MAA2B;CACvB;CACA,YAAY,MAA4B;EACpC,KAAKC,QAAQ,KAAK;CACtB;;;;CAIA,MAAqB;EAEjB,OADc,UAAU,KAAKA,KAClB,KAAK;CACpB;;;;CAKA,IACI,OACA,SAOI;EACJ,UAAU;GACN,MAAM,KAAKA;GACX,OAAO;GACP,SAAS;IACL,MAAM,SAAS,QAAQ;IACvB,UAAU,SAAS,YAAY;IAC/B,QAAQ,SAAS,UAAU,oBAAoB;IAC/C,QAAQ,SAAS;IACjB,SAAS,SAAS;GACtB;EACJ,CAAC;CACL;;;;CAKA,MAAM,SAAmC;EACrC,aAAa,KAAKA,OAAO,OAAO;CACpC;AACJ"}
@@ -14,7 +14,7 @@ declare class EventEmitter<TEvents extends { [K in keyof TEvents]: unknown; }> {
14
14
  */
15
15
  once<K extends keyof TEvents>(event: K, callback: EventCallback<TEvents[K]>): () => void;
16
16
  /**
17
- * Emits an event to all registered listeners.
17
+ * Emits an event to all registered listeners, isolating errors thrown synchronously by each listener.
18
18
  */
19
19
  emit<K extends keyof TEvents>(event: K, data: TEvents[K]): void;
20
20
  /**
@@ -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;;;;EAYtD,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;;;;EAgBtD,IAAI,gBAAgB,SAAS,OAAO,GAAG,WAAW,cAAc,QAAQ;;;;EAWxE"}
@@ -25,11 +25,13 @@ var EventEmitter = class {
25
25
  return unsubscribe;
26
26
  }
27
27
  /**
28
- * Emits an event to all registered listeners.
28
+ * Emits an event to all registered listeners, isolating errors thrown synchronously by each listener.
29
29
  */
30
30
  emit(event, data) {
31
31
  const callbacks = this.#listeners.get(event);
32
- if (callbacks) for (const callback of callbacks) callback(data);
32
+ if (callbacks) for (const callback of callbacks) try {
33
+ callback(data);
34
+ } catch {}
33
35
  }
34
36
  /**
35
37
  * 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.\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 callback(data);\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,SAAS,IAAI;CAGzB;;;;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 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"}
package/dist/utils/evm.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { ConfigurationError } from "../shared/errors.js";
2
- import { bytesToHex, hexToBytes, utf8ToBytes } from "@noble/hashes/utils.js";
3
2
  import { keccak_256 } from "@noble/hashes/sha3.js";
3
+ import { bytesToHex, hexToBytes, utf8ToBytes } from "@noble/hashes/utils.js";
4
4
  //#region src/utils/evm.ts
5
5
  const ADDRESS_RE = /^0x[0-9a-fA-F]{40}$/;
6
6
  /** Format-only address check (viem `isAddress(value, { strict: false })`). */
@@ -44,7 +44,7 @@ function evmUtf8ToHex(value) {
44
44
  }
45
45
  /** 0x-prefixed hex to bytes (viem `hexToBytes`); throws on malformed input. */
46
46
  function evmHexToBytes(value) {
47
- if (!/^0x(?:[0-9a-fA-F]{2})*$/.test(value)) throw new ConfigurationError(`Invalid hex value: ${value}`);
47
+ if (!/^0x(?:[0-9a-fA-F]{2})*$/.test(value)) throw new ConfigurationError("Invalid hex value");
48
48
  return hexToBytes(value.slice(2).toLowerCase());
49
49
  }
50
50
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"evm.js","names":["nobleHexToBytes"],"sources":["../../src/utils/evm.ts"],"sourcesContent":["import { keccak_256 } from \"@noble/hashes/sha3.js\";\nimport { bytesToHex, hexToBytes as nobleHexToBytes, utf8ToBytes } from \"@noble/hashes/utils.js\";\nimport { ConfigurationError } from \"../shared/errors.js\";\n\n/**\n * Minimal EVM helpers backed by @noble/hashes.\n *\n * The SDK core previously imported these five utilities from viem. Rolldown\n * groups all shared viem modules into a single chunk, so those tiny static\n * imports forced viem's entire abi/actions graph (~270 KB emitted) into the\n * app shell and the server's eager exec path, even though everything heavy is\n * loaded lazily. Semantics mirror the viem calls they replaced:\n * `isAddress(x, { strict: false })`, `getAddress`, `keccak256`,\n * `stringToBytes`, `hexToBytes`.\n */\n\nexport type EvmHex = `0x${string}`;\n\nconst ADDRESS_RE = /^0x[0-9a-fA-F]{40}$/;\n\n/** Format-only address check (viem `isAddress(value, { strict: false })`). */\nexport function isEvmAddress(value: string): value is EvmHex {\n return ADDRESS_RE.test(value);\n}\n\n/**\n * viem `isAddress(value)` default-mode parity: format check plus EIP-55\n * checksum validation for any address that is not all-lowercase.\n */\nexport function isEvmAddressStrict(value: string): value is EvmHex {\n if (!isEvmAddress(value)) return false;\n const body = value.slice(2);\n // viem only exempts all-lowercase addresses from checksum validation.\n if (body === body.toLowerCase()) return true;\n return checksumEvmAddress(value) === value;\n}\n\n/** EIP-55 checksummed address (viem `getAddress`); throws on invalid input. */\nexport function checksumEvmAddress(value: string): EvmHex {\n if (!isEvmAddress(value)) {\n throw new ConfigurationError(`Invalid EVM address: ${value}`);\n }\n const lower = value.slice(2).toLowerCase();\n const hash = keccak_256(utf8ToBytes(lower));\n let out = \"0x\";\n for (let i = 0; i < 40; i++) {\n const char = lower[i]!;\n // Each hash byte covers two nibbles of the address.\n const nibble = (hash[i >> 1]! >> (i % 2 === 0 ? 4 : 0)) & 0x0f;\n out += nibble >= 8 ? char.toUpperCase() : char;\n }\n return out as EvmHex;\n}\n\n/** keccak-256 of raw bytes, hex-encoded (viem `keccak256(bytes)`). */\nexport function keccak256Hex(bytes: Uint8Array): EvmHex {\n return `0x${bytesToHex(keccak_256(bytes))}`;\n}\n\n/** UTF-8 encode (viem `stringToBytes`). */\nexport function evmUtf8ToBytes(value: string): Uint8Array {\n return utf8ToBytes(value);\n}\n\n/** UTF-8 string to 0x-prefixed hex (viem `stringToHex`). */\nexport function evmUtf8ToHex(value: string): EvmHex {\n return `0x${bytesToHex(utf8ToBytes(value))}`;\n}\n\n/** 0x-prefixed hex to bytes (viem `hexToBytes`); throws on malformed input. */\nexport function evmHexToBytes(value: string): Uint8Array {\n if (!/^0x(?:[0-9a-fA-F]{2})*$/.test(value)) {\n throw new ConfigurationError(`Invalid hex value: ${value}`);\n }\n return nobleHexToBytes(value.slice(2).toLowerCase());\n}\n"],"mappings":";;;;AAkBA,MAAM,aAAa;;AAGnB,SAAgB,aAAa,OAAgC;CACzD,OAAO,WAAW,KAAK,KAAK;AAChC;;;;;AAMA,SAAgB,mBAAmB,OAAgC;CAC/D,IAAI,CAAC,aAAa,KAAK,GAAG,OAAO;CACjC,MAAM,OAAO,MAAM,MAAM,CAAC;CAE1B,IAAI,SAAS,KAAK,YAAY,GAAG,OAAO;CACxC,OAAO,mBAAmB,KAAK,MAAM;AACzC;;AAGA,SAAgB,mBAAmB,OAAuB;CACtD,IAAI,CAAC,aAAa,KAAK,GACnB,MAAM,IAAI,mBAAmB,wBAAwB,OAAO;CAEhE,MAAM,QAAQ,MAAM,MAAM,CAAC,CAAC,CAAC,YAAY;CACzC,MAAM,OAAO,WAAW,YAAY,KAAK,CAAC;CAC1C,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KAAK;EACzB,MAAM,OAAO,MAAM;EAEnB,MAAM,SAAU,KAAK,KAAK,OAAQ,IAAI,MAAM,IAAI,IAAI,KAAM;EAC1D,OAAO,UAAU,IAAI,KAAK,YAAY,IAAI;CAC9C;CACA,OAAO;AACX;;AAGA,SAAgB,aAAa,OAA2B;CACpD,OAAO,KAAK,WAAW,WAAW,KAAK,CAAC;AAC5C;;AAGA,SAAgB,eAAe,OAA2B;CACtD,OAAO,YAAY,KAAK;AAC5B;;AAGA,SAAgB,aAAa,OAAuB;CAChD,OAAO,KAAK,WAAW,YAAY,KAAK,CAAC;AAC7C;;AAGA,SAAgB,cAAc,OAA2B;CACrD,IAAI,CAAC,0BAA0B,KAAK,KAAK,GACrC,MAAM,IAAI,mBAAmB,sBAAsB,OAAO;CAE9D,OAAOA,WAAgB,MAAM,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC;AACvD"}
1
+ {"version":3,"file":"evm.js","names":["nobleHexToBytes"],"sources":["../../src/utils/evm.ts"],"sourcesContent":["import { keccak_256 } from \"@noble/hashes/sha3.js\";\nimport { bytesToHex, hexToBytes as nobleHexToBytes, utf8ToBytes } from \"@noble/hashes/utils.js\";\nimport { ConfigurationError } from \"../shared/errors.js\";\n\n/**\n * Minimal EVM helpers backed by @noble/hashes.\n *\n * The SDK core previously imported these five utilities from viem. Rolldown\n * groups all shared viem modules into a single chunk, so those tiny static\n * imports forced viem's entire abi/actions graph (~270 KB emitted) into the\n * app shell and the server's eager exec path, even though everything heavy is\n * loaded lazily. Semantics mirror the viem calls they replaced:\n * `isAddress(x, { strict: false })`, `getAddress`, `keccak256`,\n * `stringToBytes`, `hexToBytes`.\n */\n\nexport type EvmHex = `0x${string}`;\n\nconst ADDRESS_RE = /^0x[0-9a-fA-F]{40}$/;\n\n/** Format-only address check (viem `isAddress(value, { strict: false })`). */\nexport function isEvmAddress(value: string): value is EvmHex {\n return ADDRESS_RE.test(value);\n}\n\n/**\n * viem `isAddress(value)` default-mode parity: format check plus EIP-55\n * checksum validation for any address that is not all-lowercase.\n */\nexport function isEvmAddressStrict(value: string): value is EvmHex {\n if (!isEvmAddress(value)) return false;\n const body = value.slice(2);\n // viem only exempts all-lowercase addresses from checksum validation.\n if (body === body.toLowerCase()) return true;\n return checksumEvmAddress(value) === value;\n}\n\n/** EIP-55 checksummed address (viem `getAddress`); throws on invalid input. */\nexport function checksumEvmAddress(value: string): EvmHex {\n if (!isEvmAddress(value)) {\n throw new ConfigurationError(`Invalid EVM address: ${value}`);\n }\n const lower = value.slice(2).toLowerCase();\n const hash = keccak_256(utf8ToBytes(lower));\n let out = \"0x\";\n for (let i = 0; i < 40; i++) {\n const char = lower[i]!;\n // Each hash byte covers two nibbles of the address.\n const nibble = (hash[i >> 1]! >> (i % 2 === 0 ? 4 : 0)) & 0x0f;\n out += nibble >= 8 ? char.toUpperCase() : char;\n }\n return out as EvmHex;\n}\n\n/** keccak-256 of raw bytes, hex-encoded (viem `keccak256(bytes)`). */\nexport function keccak256Hex(bytes: Uint8Array): EvmHex {\n return `0x${bytesToHex(keccak_256(bytes))}`;\n}\n\n/** UTF-8 encode (viem `stringToBytes`). */\nexport function evmUtf8ToBytes(value: string): Uint8Array {\n return utf8ToBytes(value);\n}\n\n/** UTF-8 string to 0x-prefixed hex (viem `stringToHex`). */\nexport function evmUtf8ToHex(value: string): EvmHex {\n return `0x${bytesToHex(utf8ToBytes(value))}`;\n}\n\n/** 0x-prefixed hex to bytes (viem `hexToBytes`); throws on malformed input. */\nexport function evmHexToBytes(value: string): Uint8Array {\n if (!/^0x(?:[0-9a-fA-F]{2})*$/.test(value)) {\n throw new ConfigurationError(\"Invalid hex value\");\n }\n return nobleHexToBytes(value.slice(2).toLowerCase());\n}\n"],"mappings":";;;;AAkBA,MAAM,aAAa;;AAGnB,SAAgB,aAAa,OAAgC;CACzD,OAAO,WAAW,KAAK,KAAK;AAChC;;;;;AAMA,SAAgB,mBAAmB,OAAgC;CAC/D,IAAI,CAAC,aAAa,KAAK,GAAG,OAAO;CACjC,MAAM,OAAO,MAAM,MAAM,CAAC;CAE1B,IAAI,SAAS,KAAK,YAAY,GAAG,OAAO;CACxC,OAAO,mBAAmB,KAAK,MAAM;AACzC;;AAGA,SAAgB,mBAAmB,OAAuB;CACtD,IAAI,CAAC,aAAa,KAAK,GACnB,MAAM,IAAI,mBAAmB,wBAAwB,OAAO;CAEhE,MAAM,QAAQ,MAAM,MAAM,CAAC,CAAC,CAAC,YAAY;CACzC,MAAM,OAAO,WAAW,YAAY,KAAK,CAAC;CAC1C,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KAAK;EACzB,MAAM,OAAO,MAAM;EAEnB,MAAM,SAAU,KAAK,KAAK,OAAQ,IAAI,MAAM,IAAI,IAAI,KAAM;EAC1D,OAAO,UAAU,IAAI,KAAK,YAAY,IAAI;CAC9C;CACA,OAAO;AACX;;AAGA,SAAgB,aAAa,OAA2B;CACpD,OAAO,KAAK,WAAW,WAAW,KAAK,CAAC;AAC5C;;AAGA,SAAgB,eAAe,OAA2B;CACtD,OAAO,YAAY,KAAK;AAC5B;;AAGA,SAAgB,aAAa,OAAuB;CAChD,OAAO,KAAK,WAAW,YAAY,KAAK,CAAC;AAC7C;;AAGA,SAAgB,cAAc,OAA2B;CACrD,IAAI,CAAC,0BAA0B,KAAK,KAAK,GACrC,MAAM,IAAI,mBAAmB,mBAAmB;CAEpD,OAAOA,WAAgB,MAAM,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC;AACvD"}
@@ -1,8 +1,8 @@
1
1
  //#region src/utils/jwt.d.ts
2
2
  /**
3
- * Checks whether a JWT is present, well formed, and not expired.
3
+ * Checks whether a value is a present, well-formed, unexpired JWT string.
4
4
  */
5
- declare function isJwtValid(token: string | null): token is string;
5
+ declare function isJwtValid(token: unknown): token is string;
6
6
  //#endregion
7
7
  export { isJwtValid };
8
8
  //# sourceMappingURL=jwt.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"jwt.d.ts","names":[],"sources":["../../src/utils/jwt.ts"],"mappings":";;;;iBA6DgB,WAAW,uBAAuB"}
1
+ {"version":3,"file":"jwt.d.ts","names":[],"sources":["../../src/utils/jwt.ts"],"mappings":";;;;iBA6DgB,WAAW,iBAAiB"}
package/dist/utils/jwt.js CHANGED
@@ -49,10 +49,10 @@ function isJwtExpired(token) {
49
49
  return exp < Math.floor(Date.now() / 1e3);
50
50
  }
51
51
  /**
52
- * Checks whether a JWT is present, well formed, and not expired.
52
+ * Checks whether a value is a present, well-formed, unexpired JWT string.
53
53
  */
54
54
  function isJwtValid(token) {
55
- if (!token) return false;
55
+ if (typeof token !== "string" || !token) return false;
56
56
  if (!isJwt(token)) return false;
57
57
  if (isJwtExpired(token)) return false;
58
58
  return true;
@@ -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 JWT is present, well formed, and not expired.\n */\nexport function isJwtValid(token: string | null): token is string {\n if (!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,OAAuC;CAC9D,IAAI,CAAC,OAAO,OAAO;CACnB,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\" ? 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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@polyester/sdk",
3
- "version": "0.3.0",
3
+ "version": "0.4.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",