mtmsdk 0.0.50 → 0.0.52

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 (341) hide show
  1. package/dist/gomtmapi/@tanstack/react-query.gen.d.ts +1 -13
  2. package/dist/gomtmapi/@tanstack/react-query.gen.d.ts.map +1 -1
  3. package/dist/gomtmapi/@tanstack/react-query.gen.js +1 -37
  4. package/dist/gomtmapi/@tanstack/react-query.gen.js.map +1 -1
  5. package/dist/gomtmapi/index.d.ts +2 -2
  6. package/dist/gomtmapi/index.d.ts.map +1 -1
  7. package/dist/gomtmapi/index.js +1 -1
  8. package/dist/gomtmapi/index.js.map +1 -1
  9. package/dist/gomtmapi/schemas.gen.d.ts +0 -57
  10. package/dist/gomtmapi/schemas.gen.d.ts.map +1 -1
  11. package/dist/gomtmapi/schemas.gen.js +0 -60
  12. package/dist/gomtmapi/schemas.gen.js.map +1 -1
  13. package/dist/gomtmapi/sdk.gen.d.ts +1 -13
  14. package/dist/gomtmapi/sdk.gen.d.ts.map +1 -1
  15. package/dist/gomtmapi/sdk.gen.js +0 -26
  16. package/dist/gomtmapi/sdk.gen.js.map +1 -1
  17. package/dist/gomtmapi/types.gen.d.ts +0 -94
  18. package/dist/gomtmapi/types.gen.d.ts.map +1 -1
  19. package/dist/gomtmapi/zod.gen.d.ts +0 -62
  20. package/dist/gomtmapi/zod.gen.d.ts.map +1 -1
  21. package/dist/gomtmapi/zod.gen.js +0 -51
  22. package/dist/gomtmapi/zod.gen.js.map +1 -1
  23. package/dist/index.d.ts +1 -1
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +1 -4
  26. package/dist/index.js.map +1 -1
  27. package/dist/lib/schema.d.ts +1 -11
  28. package/dist/lib/schema.d.ts.map +1 -1
  29. package/dist/lib/schema.js +0 -9
  30. package/dist/lib/schema.js.map +1 -1
  31. package/dist/mtgate_api/client.gen.d.ts.map +1 -1
  32. package/dist/mtgate_api/client.gen.js +1 -1
  33. package/dist/mtgate_api/client.gen.js.map +1 -1
  34. package/dist/mtgate_api/index.d.ts +2 -2
  35. package/dist/mtgate_api/index.d.ts.map +1 -1
  36. package/dist/mtgate_api/index.js +1 -1
  37. package/dist/mtgate_api/index.js.map +1 -1
  38. package/dist/mtgate_api/sdk.gen.d.ts +0 -8
  39. package/dist/mtgate_api/sdk.gen.d.ts.map +1 -1
  40. package/dist/mtgate_api/sdk.gen.js +1 -29
  41. package/dist/mtgate_api/sdk.gen.js.map +1 -1
  42. package/dist/mtgate_api/types.gen.d.ts +1 -200
  43. package/dist/mtgate_api/types.gen.d.ts.map +1 -1
  44. package/dist/openclaw/gateway.d.ts.map +1 -1
  45. package/dist/openclaw/gateway.js +1 -1
  46. package/dist/openclaw/gateway.js.map +1 -1
  47. package/dist/sbmng/@tanstack/react-query.gen.d.ts +39 -65
  48. package/dist/sbmng/@tanstack/react-query.gen.d.ts.map +1 -1
  49. package/dist/sbmng/@tanstack/react-query.gen.js +19 -65
  50. package/dist/sbmng/@tanstack/react-query.gen.js.map +1 -1
  51. package/dist/sbmng/index.d.ts +2 -2
  52. package/dist/sbmng/index.d.ts.map +1 -1
  53. package/dist/sbmng/index.js +1 -1
  54. package/dist/sbmng/index.js.map +1 -1
  55. package/dist/sbmng/schemas.gen.d.ts +6 -95
  56. package/dist/sbmng/schemas.gen.d.ts.map +1 -1
  57. package/dist/sbmng/schemas.gen.js +7 -139
  58. package/dist/sbmng/schemas.gen.js.map +1 -1
  59. package/dist/sbmng/sdk.gen.d.ts +7 -17
  60. package/dist/sbmng/sdk.gen.d.ts.map +1 -1
  61. package/dist/sbmng/sdk.gen.js +10 -32
  62. package/dist/sbmng/sdk.gen.js.map +1 -1
  63. package/dist/sbmng/types.gen.d.ts +41 -157
  64. package/dist/sbmng/types.gen.d.ts.map +1 -1
  65. package/dist/supabase/supabase-client.d.ts +85 -181
  66. package/dist/supabase/supabase-client.d.ts.map +1 -1
  67. package/dist/supabase/supabase.d.ts +170 -362
  68. package/dist/supabase/supabase.d.ts.map +1 -1
  69. package/dist/supabase/use-sb-query/build-query-opts.d.ts +6 -2
  70. package/dist/supabase/use-sb-query/build-query-opts.d.ts.map +1 -1
  71. package/dist/supabase/use-sb-query/build-query-opts.js +8 -4
  72. package/dist/supabase/use-sb-query/build-query-opts.js.map +1 -1
  73. package/dist/supabase/use-sb-query/use-query.d.ts +9 -6
  74. package/dist/supabase/use-sb-query/use-query.d.ts.map +1 -1
  75. package/dist/supabase/use-sb-query/use-query.js.map +1 -1
  76. package/dist/supabase/use-sb-query/use-rpc-query.d.ts +25 -17
  77. package/dist/supabase/use-sb-query/use-rpc-query.d.ts.map +1 -1
  78. package/dist/supabase/use-sb-query/use-rpc-query.js +48 -26
  79. package/dist/supabase/use-sb-query/use-rpc-query.js.map +1 -1
  80. package/dist/types/database.schemas.d.ts +129 -222
  81. package/dist/types/database.schemas.d.ts.map +1 -1
  82. package/dist/types/database.schemas.js +112 -124
  83. package/dist/types/database.schemas.js.map +1 -1
  84. package/dist/types/database.types.d.ts +85 -181
  85. package/dist/types/database.types.d.ts.map +1 -1
  86. package/dist/types/database.types.js.map +1 -1
  87. package/dist/types/index.d.ts +30 -59
  88. package/dist/types/index.d.ts.map +1 -1
  89. package/dist/types/index.js +16 -3
  90. package/dist/types/index.js.map +1 -1
  91. package/package.json +105 -110
  92. package/src/cloud-account/platform-configs.ts +73 -73
  93. package/src/gomtmapi/@tanstack/react-query.gen.ts +537 -575
  94. package/src/gomtmapi/client/client.gen.ts +311 -311
  95. package/src/gomtmapi/client/index.ts +25 -25
  96. package/src/gomtmapi/client/types.gen.ts +241 -241
  97. package/src/gomtmapi/client/utils.gen.ts +332 -332
  98. package/src/gomtmapi/client.gen.ts +16 -16
  99. package/src/gomtmapi/core/auth.gen.ts +42 -42
  100. package/src/gomtmapi/core/bodySerializer.gen.ts +100 -100
  101. package/src/gomtmapi/core/params.gen.ts +176 -176
  102. package/src/gomtmapi/core/pathSerializer.gen.ts +181 -181
  103. package/src/gomtmapi/core/queryKeySerializer.gen.ts +136 -136
  104. package/src/gomtmapi/core/serverSentEvents.gen.ts +266 -266
  105. package/src/gomtmapi/core/types.gen.ts +118 -118
  106. package/src/gomtmapi/core/utils.gen.ts +143 -143
  107. package/src/gomtmapi/index.ts +4 -4
  108. package/src/gomtmapi/schemas.gen.ts +532 -596
  109. package/src/gomtmapi/sdk.gen.ts +371 -399
  110. package/src/gomtmapi/types.gen.ts +854 -962
  111. package/src/gomtmapi/zod.gen.ts +448 -507
  112. package/src/index.ts +4 -5
  113. package/src/lib/aisdk/types.ts +7 -7
  114. package/src/lib/logger/index.ts +8 -8
  115. package/src/lib/schema.ts +37 -50
  116. package/src/mtgate_api/client/client.gen.ts +311 -311
  117. package/src/mtgate_api/client/index.ts +25 -25
  118. package/src/mtgate_api/client/types.gen.ts +241 -241
  119. package/src/mtgate_api/client/utils.gen.ts +332 -332
  120. package/src/mtgate_api/client.gen.ts +16 -16
  121. package/src/mtgate_api/core/auth.gen.ts +42 -42
  122. package/src/mtgate_api/core/bodySerializer.gen.ts +100 -100
  123. package/src/mtgate_api/core/params.gen.ts +176 -176
  124. package/src/mtgate_api/core/pathSerializer.gen.ts +181 -181
  125. package/src/mtgate_api/core/queryKeySerializer.gen.ts +136 -136
  126. package/src/mtgate_api/core/serverSentEvents.gen.ts +266 -266
  127. package/src/mtgate_api/core/types.gen.ts +118 -118
  128. package/src/mtgate_api/core/utils.gen.ts +143 -143
  129. package/src/mtgate_api/index.ts +4 -4
  130. package/src/mtgate_api/sdk.gen.ts +17 -54
  131. package/src/mtgate_api/types.gen.ts +5 -239
  132. package/src/openclaw/client-info.ts +54 -54
  133. package/src/openclaw/device-auth-utils.ts +26 -26
  134. package/src/openclaw/device-auth.ts +99 -99
  135. package/src/openclaw/device-identity.ts +108 -108
  136. package/src/openclaw/gateway.ts +392 -392
  137. package/src/openclaw/types.ts +518 -518
  138. package/src/sbmng/@tanstack/react-query.gen.ts +2967 -3017
  139. package/src/sbmng/client/client.gen.ts +311 -311
  140. package/src/sbmng/client/index.ts +25 -25
  141. package/src/sbmng/client/types.gen.ts +241 -241
  142. package/src/sbmng/client/utils.gen.ts +332 -332
  143. package/src/sbmng/client.gen.ts +16 -16
  144. package/src/sbmng/core/auth.gen.ts +42 -42
  145. package/src/sbmng/core/bodySerializer.gen.ts +100 -100
  146. package/src/sbmng/core/params.gen.ts +176 -176
  147. package/src/sbmng/core/pathSerializer.gen.ts +181 -181
  148. package/src/sbmng/core/queryKeySerializer.gen.ts +136 -136
  149. package/src/sbmng/core/serverSentEvents.gen.ts +266 -266
  150. package/src/sbmng/core/types.gen.ts +118 -118
  151. package/src/sbmng/core/utils.gen.ts +143 -143
  152. package/src/sbmng/index.ts +4 -4
  153. package/src/sbmng/schemas.gen.ts +9671 -9805
  154. package/src/sbmng/sdk.gen.ts +1755 -1780
  155. package/src/sbmng/types.gen.ts +7886 -8016
  156. package/src/supabase/auth-provider.tsx +67 -67
  157. package/src/supabase/context.tsx +51 -51
  158. package/src/supabase/cursor-pagination.ts +155 -155
  159. package/src/supabase/schema/browser.ts +44 -44
  160. package/src/supabase/schema/index.ts +25 -25
  161. package/src/supabase/supabase-client.ts +30 -30
  162. package/src/supabase/supabase.ts +67 -67
  163. package/src/supabase/use-sb-query/build-query-opts.ts +68 -56
  164. package/src/supabase/use-sb-query/key.ts +57 -57
  165. package/src/supabase/use-sb-query/use-query.ts +352 -340
  166. package/src/supabase/use-sb-query/use-rpc-mutation.ts +83 -83
  167. package/src/supabase/use-sb-query/use-rpc-query.ts +267 -231
  168. package/src/supabase/utils.ts +75 -75
  169. package/src/types/database.schemas.ts +4359 -4378
  170. package/src/types/database.types.ts +4182 -4288
  171. package/src/types/index.ts +85 -102
  172. package/dist/adk/api/client.d.ts +0 -9
  173. package/dist/adk/api/client.d.ts.map +0 -1
  174. package/dist/adk/api/client.js +0 -39
  175. package/dist/adk/api/client.js.map +0 -1
  176. package/dist/adk/core/constants/tool-icons.d.ts +0 -21
  177. package/dist/adk/core/constants/tool-icons.d.ts.map +0 -1
  178. package/dist/adk/core/constants/tool-icons.js +0 -47
  179. package/dist/adk/core/constants/tool-icons.js.map +0 -1
  180. package/dist/adk/core/models/AgentBuilder.d.ts +0 -77
  181. package/dist/adk/core/models/AgentBuilder.d.ts.map +0 -1
  182. package/dist/adk/core/models/AgentBuilder.js +0 -18
  183. package/dist/adk/core/models/AgentBuilder.js.map +0 -1
  184. package/dist/adk/core/models/AgentRunRequest.d.ts +0 -37
  185. package/dist/adk/core/models/AgentRunRequest.d.ts.map +0 -1
  186. package/dist/adk/core/models/AgentRunRequest.js +0 -18
  187. package/dist/adk/core/models/AgentRunRequest.js.map +0 -1
  188. package/dist/adk/core/models/Eval.d.ts +0 -55
  189. package/dist/adk/core/models/Eval.d.ts.map +0 -1
  190. package/dist/adk/core/models/Eval.js +0 -27
  191. package/dist/adk/core/models/Eval.js.map +0 -1
  192. package/dist/adk/core/models/LiveRequest.d.ts +0 -23
  193. package/dist/adk/core/models/LiveRequest.d.ts.map +0 -1
  194. package/dist/adk/core/models/LiveRequest.js +0 -18
  195. package/dist/adk/core/models/LiveRequest.js.map +0 -1
  196. package/dist/adk/core/models/RuntimeConfig.d.ts +0 -32
  197. package/dist/adk/core/models/RuntimeConfig.d.ts.map +0 -1
  198. package/dist/adk/core/models/RuntimeConfig.js +0 -18
  199. package/dist/adk/core/models/RuntimeConfig.js.map +0 -1
  200. package/dist/adk/core/models/Session.d.ts +0 -117
  201. package/dist/adk/core/models/Session.d.ts.map +0 -1
  202. package/dist/adk/core/models/Session.js +0 -31
  203. package/dist/adk/core/models/Session.js.map +0 -1
  204. package/dist/adk/core/models/Trace.d.ts +0 -40
  205. package/dist/adk/core/models/Trace.d.ts.map +0 -1
  206. package/dist/adk/core/models/Trace.js +0 -2
  207. package/dist/adk/core/models/Trace.js.map +0 -1
  208. package/dist/adk/core/models/types.d.ts +0 -338
  209. package/dist/adk/core/models/types.d.ts.map +0 -1
  210. package/dist/adk/core/models/types.js +0 -189
  211. package/dist/adk/core/models/types.js.map +0 -1
  212. package/dist/lib/utils.d.ts +0 -14
  213. package/dist/lib/utils.d.ts.map +0 -1
  214. package/dist/lib/utils.js +0 -45
  215. package/dist/lib/utils.js.map +0 -1
  216. package/dist/mtgate_api/@tanstack/react-query.gen.d.ts +0 -166
  217. package/dist/mtgate_api/@tanstack/react-query.gen.d.ts.map +0 -1
  218. package/dist/mtgate_api/@tanstack/react-query.gen.js +0 -118
  219. package/dist/mtgate_api/@tanstack/react-query.gen.js.map +0 -1
  220. package/dist/mtgate_api/schemas.gen.d.ts +0 -233
  221. package/dist/mtgate_api/schemas.gen.d.ts.map +0 -1
  222. package/dist/mtgate_api/schemas.gen.js +0 -277
  223. package/dist/mtgate_api/schemas.gen.js.map +0 -1
  224. package/dist/mtgate_api/zod.gen.d.ts +0 -321
  225. package/dist/mtgate_api/zod.gen.d.ts.map +0 -1
  226. package/dist/mtgate_api/zod.gen.js +0 -148
  227. package/dist/mtgate_api/zod.gen.js.map +0 -1
  228. package/dist/mtmai_api/@tanstack/react-query.gen.d.ts +0 -949
  229. package/dist/mtmai_api/@tanstack/react-query.gen.d.ts.map +0 -1
  230. package/dist/mtmai_api/@tanstack/react-query.gen.js +0 -917
  231. package/dist/mtmai_api/@tanstack/react-query.gen.js.map +0 -1
  232. package/dist/mtmai_api/client/client.gen.d.ts +0 -3
  233. package/dist/mtmai_api/client/client.gen.d.ts.map +0 -1
  234. package/dist/mtmai_api/client/client.gen.js +0 -236
  235. package/dist/mtmai_api/client/client.gen.js.map +0 -1
  236. package/dist/mtmai_api/client/index.d.ts +0 -9
  237. package/dist/mtmai_api/client/index.d.ts.map +0 -1
  238. package/dist/mtmai_api/client/index.js +0 -7
  239. package/dist/mtmai_api/client/index.js.map +0 -1
  240. package/dist/mtmai_api/client/types.gen.d.ts +0 -118
  241. package/dist/mtmai_api/client/types.gen.d.ts.map +0 -1
  242. package/dist/mtmai_api/client/types.gen.js +0 -3
  243. package/dist/mtmai_api/client/types.gen.js.map +0 -1
  244. package/dist/mtmai_api/client/utils.gen.d.ts +0 -34
  245. package/dist/mtmai_api/client/utils.gen.d.ts.map +0 -1
  246. package/dist/mtmai_api/client/utils.gen.js +0 -232
  247. package/dist/mtmai_api/client/utils.gen.js.map +0 -1
  248. package/dist/mtmai_api/client.gen.d.ts +0 -13
  249. package/dist/mtmai_api/client.gen.d.ts.map +0 -1
  250. package/dist/mtmai_api/client.gen.js +0 -4
  251. package/dist/mtmai_api/client.gen.js.map +0 -1
  252. package/dist/mtmai_api/core/auth.gen.d.ts +0 -19
  253. package/dist/mtmai_api/core/auth.gen.d.ts.map +0 -1
  254. package/dist/mtmai_api/core/auth.gen.js +0 -15
  255. package/dist/mtmai_api/core/auth.gen.js.map +0 -1
  256. package/dist/mtmai_api/core/bodySerializer.gen.d.ts +0 -26
  257. package/dist/mtmai_api/core/bodySerializer.gen.d.ts.map +0 -1
  258. package/dist/mtmai_api/core/bodySerializer.gen.js +0 -58
  259. package/dist/mtmai_api/core/bodySerializer.gen.js.map +0 -1
  260. package/dist/mtmai_api/core/params.gen.d.ts +0 -44
  261. package/dist/mtmai_api/core/params.gen.d.ts.map +0 -1
  262. package/dist/mtmai_api/core/params.gen.js +0 -101
  263. package/dist/mtmai_api/core/params.gen.js.map +0 -1
  264. package/dist/mtmai_api/core/pathSerializer.gen.d.ts +0 -34
  265. package/dist/mtmai_api/core/pathSerializer.gen.d.ts.map +0 -1
  266. package/dist/mtmai_api/core/pathSerializer.gen.js +0 -115
  267. package/dist/mtmai_api/core/pathSerializer.gen.js.map +0 -1
  268. package/dist/mtmai_api/core/queryKeySerializer.gen.d.ts +0 -19
  269. package/dist/mtmai_api/core/queryKeySerializer.gen.d.ts.map +0 -1
  270. package/dist/mtmai_api/core/queryKeySerializer.gen.js +0 -100
  271. package/dist/mtmai_api/core/queryKeySerializer.gen.js.map +0 -1
  272. package/dist/mtmai_api/core/serverSentEvents.gen.d.ts +0 -72
  273. package/dist/mtmai_api/core/serverSentEvents.gen.d.ts.map +0 -1
  274. package/dist/mtmai_api/core/serverSentEvents.gen.js +0 -138
  275. package/dist/mtmai_api/core/serverSentEvents.gen.js.map +0 -1
  276. package/dist/mtmai_api/core/types.gen.d.ts +0 -79
  277. package/dist/mtmai_api/core/types.gen.d.ts.map +0 -1
  278. package/dist/mtmai_api/core/types.gen.js +0 -3
  279. package/dist/mtmai_api/core/types.gen.js.map +0 -1
  280. package/dist/mtmai_api/core/utils.gen.d.ts +0 -20
  281. package/dist/mtmai_api/core/utils.gen.d.ts.map +0 -1
  282. package/dist/mtmai_api/core/utils.gen.js +0 -88
  283. package/dist/mtmai_api/core/utils.gen.js.map +0 -1
  284. package/dist/mtmai_api/index.d.ts +0 -3
  285. package/dist/mtmai_api/index.d.ts.map +0 -1
  286. package/dist/mtmai_api/index.js +0 -4
  287. package/dist/mtmai_api/index.js.map +0 -1
  288. package/dist/mtmai_api/schemas.gen.d.ts +0 -7721
  289. package/dist/mtmai_api/schemas.gen.d.ts.map +0 -1
  290. package/dist/mtmai_api/schemas.gen.js +0 -9774
  291. package/dist/mtmai_api/schemas.gen.js.map +0 -1
  292. package/dist/mtmai_api/sdk.gen.d.ts +0 -282
  293. package/dist/mtmai_api/sdk.gen.d.ts.map +0 -1
  294. package/dist/mtmai_api/sdk.gen.js +0 -404
  295. package/dist/mtmai_api/sdk.gen.js.map +0 -1
  296. package/dist/mtmai_api/types.gen.d.ts +0 -7152
  297. package/dist/mtmai_api/types.gen.d.ts.map +0 -1
  298. package/dist/mtmai_api/types.gen.js +0 -253
  299. package/dist/mtmai_api/types.gen.js.map +0 -1
  300. package/dist/mtmai_api/zod.gen.d.ts +0 -55827
  301. package/dist/mtmai_api/zod.gen.d.ts.map +0 -1
  302. package/dist/mtmai_api/zod.gen.js +0 -4805
  303. package/dist/mtmai_api/zod.gen.js.map +0 -1
  304. package/dist/supabase/use-sb-query/prefetch.d.ts +0 -10
  305. package/dist/supabase/use-sb-query/prefetch.d.ts.map +0 -1
  306. package/dist/supabase/use-sb-query/prefetch.js +0 -14
  307. package/dist/supabase/use-sb-query/prefetch.js.map +0 -1
  308. package/src/adk/api/client.ts +0 -46
  309. package/src/adk/core/constants/tool-icons.ts +0 -51
  310. package/src/adk/core/models/AgentBuilder.ts +0 -80
  311. package/src/adk/core/models/AgentRunRequest.ts +0 -33
  312. package/src/adk/core/models/Eval.ts +0 -70
  313. package/src/adk/core/models/LiveRequest.ts +0 -23
  314. package/src/adk/core/models/RuntimeConfig.ts +0 -33
  315. package/src/adk/core/models/Session.ts +0 -52
  316. package/src/adk/core/models/Trace.ts +0 -42
  317. package/src/adk/core/models/types.ts +0 -255
  318. package/src/lib/utils.ts +0 -54
  319. package/src/mtgate_api/@tanstack/react-query.gen.ts +0 -142
  320. package/src/mtgate_api/schemas.gen.ts +0 -290
  321. package/src/mtgate_api/zod.gen.ts +0 -176
  322. package/src/mtmai_api/@tanstack/react-query.gen.ts +0 -1010
  323. package/src/mtmai_api/client/client.gen.ts +0 -311
  324. package/src/mtmai_api/client/index.ts +0 -25
  325. package/src/mtmai_api/client/types.gen.ts +0 -241
  326. package/src/mtmai_api/client/utils.gen.ts +0 -332
  327. package/src/mtmai_api/client.gen.ts +0 -16
  328. package/src/mtmai_api/core/auth.gen.ts +0 -42
  329. package/src/mtmai_api/core/bodySerializer.gen.ts +0 -100
  330. package/src/mtmai_api/core/params.gen.ts +0 -176
  331. package/src/mtmai_api/core/pathSerializer.gen.ts +0 -181
  332. package/src/mtmai_api/core/queryKeySerializer.gen.ts +0 -136
  333. package/src/mtmai_api/core/serverSentEvents.gen.ts +0 -266
  334. package/src/mtmai_api/core/types.gen.ts +0 -118
  335. package/src/mtmai_api/core/utils.gen.ts +0 -143
  336. package/src/mtmai_api/index.ts +0 -4
  337. package/src/mtmai_api/schemas.gen.ts +0 -9980
  338. package/src/mtmai_api/sdk.gen.ts +0 -471
  339. package/src/mtmai_api/types.gen.ts +0 -7609
  340. package/src/mtmai_api/zod.gen.ts +0 -5101
  341. package/src/supabase/use-sb-query/prefetch.ts +0 -59
@@ -1,392 +1,392 @@
1
- import { GATEWAY_CLIENT_MODES, GATEWAY_CLIENT_IDS, type GatewayClientId, type GatewayClientMode } from "./client-info";
2
- import type { DeviceIdentity } from "./device-identity";
3
- import { clearDeviceAuthToken, loadDeviceAuthToken, storeDeviceAuthToken } from "./device-auth";
4
-
5
- export type GatewayEventFrame = {
6
- type: "event";
7
- event: string;
8
- payload?: unknown;
9
- seq?: number;
10
- stateVersion?: { presence: number; health: number };
11
- };
12
-
13
- export type GatewayResponseFrame = {
14
- type: "res";
15
- id: string;
16
- ok: boolean;
17
- payload?: unknown;
18
- error?: { code: string; message: string; details?: unknown };
19
- };
20
-
21
- export type GatewayErrorInfo = {
22
- code: string;
23
- message: string;
24
- details?: unknown;
25
- };
26
-
27
- export type GatewayHelloOk = {
28
- type: "hello-ok";
29
- protocol: number;
30
- features?: { methods?: string[]; events?: string[] };
31
- snapshot?: unknown;
32
- auth?: {
33
- deviceToken?: string;
34
- role?: string;
35
- scopes?: string[];
36
- issuedAtMs?: number;
37
- };
38
- policy?: { tickIntervalMs?: number };
39
- };
40
-
41
- type Pending = {
42
- resolve: (value: unknown) => void;
43
- reject: (err: unknown) => void;
44
- };
45
-
46
- export type GatewayBrowserClientOptions = {
47
- url: string;
48
- token?: string;
49
- password?: string;
50
- deviceIdentity?: DeviceIdentity | null;
51
- clientName?: GatewayClientId;
52
- clientVersion?: string;
53
- platform?: string;
54
- mode?: GatewayClientMode;
55
- instanceId?: string;
56
- onHello?: (hello: GatewayHelloOk) => void;
57
- onEvent?: (evt: GatewayEventFrame) => void;
58
- onClose?: (info: { code: number; reason: string; error?: GatewayErrorInfo | null }) => void;
59
- onGap?: (info: { expected: number; received: number }) => void;
60
- autoReconnect?: boolean;
61
- };
62
-
63
- // 4008 = application-defined code (browser rejects 1008 "Policy Violation")
64
- const CONNECT_FAILED_CLOSE_CODE = 4008;
65
-
66
- export class GatewayRequestError extends Error {
67
- readonly code: string;
68
- readonly details?: unknown;
69
-
70
- constructor(error: GatewayErrorInfo) {
71
- super(error.message || error.code);
72
- this.name = "GatewayRequestError";
73
- this.code = error.code;
74
- this.details = error.details;
75
- }
76
- }
77
-
78
- export class GatewayBrowserClient {
79
- private ws: WebSocket | null = null;
80
- private pending = new Map<string, Pending>();
81
- private closed = false;
82
- private lastSeq: number | null = null;
83
- private connectNonce: string | null = null;
84
- private connectSent = false;
85
- private connectTimer: number | null = null;
86
- private backoffMs = 800;
87
- private connectError: GatewayErrorInfo | null = null;
88
- private pendingTokenResetRetry = false;
89
- private tokenResetRetryBudgetUsed = false;
90
-
91
- constructor(private opts: GatewayBrowserClientOptions) {}
92
-
93
- start() {
94
- this.closed = false;
95
- this.connect();
96
- }
97
-
98
- stop() {
99
- this.closed = true;
100
- this.ws?.close();
101
- this.ws = null;
102
- this.pendingTokenResetRetry = false;
103
- this.tokenResetRetryBudgetUsed = false;
104
- this.flushPending(new Error("gateway client stopped"));
105
- }
106
-
107
- get connected() {
108
- return this.ws?.readyState === WebSocket.OPEN;
109
- }
110
-
111
- private connect() {
112
- if (this.closed) return;
113
- try {
114
- this.ws = new WebSocket(this.opts.url);
115
- this.ws.onopen = () => this.queueConnect();
116
- this.ws.onmessage = (ev) => this.handleMessage(String(ev.data ?? ""));
117
- this.ws.onclose = (ev) => {
118
- const reason = String(ev.reason ?? "");
119
- const error = this.connectError;
120
- this.connectError = null;
121
- this.ws = null;
122
- this.flushPending(new Error(`gateway closed (${ev.code}): ${reason}`));
123
-
124
- if (this.pendingTokenResetRetry) {
125
- this.pendingTokenResetRetry = false;
126
- window.setTimeout(() => this.connect(), 0);
127
- return;
128
- }
129
-
130
- this.opts.onClose?.({ code: ev.code, reason, error });
131
- this.scheduleReconnect();
132
- };
133
- this.ws.onerror = () => {
134
- // ignored; close handler will fire
135
- };
136
- } catch (err) {
137
- console.error("[gateway] Failed to create WebSocket instance:", err);
138
- // Simulate a close event for the UI to handle
139
- this.opts.onClose?.({
140
- code: 1006,
141
- reason: err instanceof Error ? err.message : "Connect failed",
142
- error: null,
143
- });
144
- this.scheduleReconnect();
145
- }
146
- }
147
-
148
- private scheduleReconnect() {
149
- if (this.closed || this.opts.autoReconnect === false) return;
150
- const delay = this.backoffMs;
151
- this.backoffMs = Math.min(this.backoffMs * 1.7, 15_000);
152
- window.setTimeout(() => this.connect(), delay);
153
- }
154
-
155
- private flushPending(err: Error) {
156
- for (const [, p] of this.pending) p.reject(err);
157
- this.pending.clear();
158
- }
159
-
160
- private async sendConnect() {
161
- if (this.connectSent) return;
162
- this.connectSent = true;
163
- if (this.connectTimer !== null) {
164
- window.clearTimeout(this.connectTimer);
165
- this.connectTimer = null;
166
- }
167
- const hasWebCrypto = typeof crypto !== "undefined" && !!crypto.subtle;
168
-
169
- const scopes = ["operator.admin", "operator.approvals", "operator.pairing"];
170
- const role = "operator";
171
-
172
- // Dynamic import types for correct typing
173
- let deviceIdentity = this.opts.deviceIdentity ?? null;
174
- let authToken: string | undefined;
175
-
176
- // Dynamically import device auth logic only if needed and in secure context
177
- if (hasWebCrypto && !deviceIdentity) {
178
- try {
179
- const { loadOrCreateDeviceIdentity } = await import("./device-identity");
180
-
181
- deviceIdentity = await loadOrCreateDeviceIdentity();
182
- } catch (e) {
183
- console.warn("[gateway] Failed to load device identity libs", e);
184
- }
185
- }
186
-
187
- if (deviceIdentity) {
188
- authToken = loadDeviceAuthToken({
189
- deviceId: deviceIdentity.deviceId,
190
- role,
191
- })?.token;
192
- }
193
-
194
- const auth =
195
- authToken || this.opts.token || this.opts.password
196
- ? {
197
- token: authToken ?? this.opts.token,
198
- password: this.opts.password,
199
- }
200
- : undefined;
201
-
202
- let device:
203
- | {
204
- id: string;
205
- publicKey: string;
206
- signature: string;
207
- signedAt: number;
208
- nonce: string | undefined;
209
- }
210
- | undefined;
211
-
212
- if (deviceIdentity) {
213
- const signedAtMs = Date.now();
214
- const nonce = this.connectNonce ?? "";
215
-
216
- try {
217
- const { buildDeviceAuthPayload } = await import("./device-auth-utils");
218
- const { signDevicePayload } = await import("./device-identity");
219
-
220
- const payload = buildDeviceAuthPayload({
221
- deviceId: deviceIdentity.deviceId,
222
- clientId: this.opts.clientName ?? GATEWAY_CLIENT_IDS.CONTROL_UI,
223
- clientMode: this.opts.mode ?? GATEWAY_CLIENT_MODES.WEBCHAT,
224
- role,
225
- scopes,
226
- signedAtMs,
227
- token: authToken ?? undefined,
228
- nonce,
229
- });
230
- const signature = await signDevicePayload(deviceIdentity.privateKey, payload);
231
- device = {
232
- id: deviceIdentity.deviceId,
233
- publicKey: deviceIdentity.publicKey,
234
- signature,
235
- signedAt: signedAtMs,
236
- nonce,
237
- };
238
- } catch (e) {
239
- console.error("[gateway] Failed to sign device payload", e);
240
- }
241
- }
242
-
243
- const params = {
244
- minProtocol: 3,
245
- maxProtocol: 3,
246
- client: {
247
- id: this.opts.clientName ?? GATEWAY_CLIENT_IDS.CONTROL_UI,
248
- version: this.opts.clientVersion ?? "dev",
249
- platform: this.opts.platform ?? navigator.platform ?? "web",
250
- mode: this.opts.mode ?? GATEWAY_CLIENT_MODES.WEBCHAT,
251
- instanceId: this.opts.instanceId,
252
- },
253
- role,
254
- scopes,
255
- device,
256
- caps: [],
257
- auth,
258
- userAgent: navigator.userAgent,
259
- locale: navigator.language,
260
- };
261
-
262
- void this.request<GatewayHelloOk>("connect", params)
263
- .then(async (hello) => {
264
- this.connectError = null;
265
- if (hello?.auth?.deviceToken && deviceIdentity) {
266
- try {
267
- storeDeviceAuthToken({
268
- deviceId: deviceIdentity.deviceId,
269
- role: hello.auth.role ?? role,
270
- token: hello.auth.deviceToken,
271
- scopes: hello.auth.scopes ?? [],
272
- });
273
- } catch (e) {
274
- console.warn("[gateway] Failed to store device token", e);
275
- }
276
- }
277
- this.backoffMs = 800;
278
- this.tokenResetRetryBudgetUsed = false;
279
- this.opts.onHello?.(hello);
280
- })
281
- .catch((err) => {
282
- console.warn("[gateway] connect seq failed", err);
283
-
284
- if (
285
- !this.tokenResetRetryBudgetUsed &&
286
- deviceIdentity &&
287
- authToken &&
288
- err instanceof GatewayRequestError &&
289
- err.code === "AUTH_TOKEN_MISMATCH"
290
- ) {
291
- clearDeviceAuthToken({
292
- deviceId: deviceIdentity.deviceId,
293
- role,
294
- });
295
- this.pendingTokenResetRetry = true;
296
- this.tokenResetRetryBudgetUsed = true;
297
- this.connectError = null;
298
- this.ws?.close(CONNECT_FAILED_CLOSE_CODE, "retry after clearing stale device token");
299
- return;
300
- }
301
-
302
- this.connectError =
303
- err instanceof GatewayRequestError
304
- ? { code: err.code, message: err.message, details: err.details }
305
- : { code: "CONNECT_FAILED", message: err instanceof Error ? err.message : "connect failed" };
306
- // Do not close here, let the interval handle it or the error event?
307
- // Original code closed it.
308
- this.ws?.close(CONNECT_FAILED_CLOSE_CODE, "connect failed");
309
- });
310
- }
311
-
312
- private handleMessage(raw: string) {
313
- let parsed: unknown;
314
- try {
315
- parsed = JSON.parse(raw);
316
- } catch {
317
- return;
318
- }
319
-
320
- const frame = parsed as { type?: unknown };
321
- if (frame.type === "event") {
322
- const evt = parsed as GatewayEventFrame;
323
-
324
- if (evt.event === "connect.challenge") {
325
- const payload = evt.payload as { nonce?: unknown } | undefined;
326
- const nonce = payload && typeof payload.nonce === "string" ? payload.nonce : null;
327
- if (nonce) {
328
- this.connectNonce = nonce;
329
- void this.sendConnect();
330
- }
331
- return;
332
- }
333
- const seq = typeof evt.seq === "number" ? evt.seq : null;
334
- if (seq !== null) {
335
- if (this.lastSeq !== null && seq > this.lastSeq + 1) {
336
- this.opts.onGap?.({ expected: this.lastSeq + 1, received: seq });
337
- }
338
- this.lastSeq = seq;
339
- }
340
- try {
341
- this.opts.onEvent?.(evt);
342
- } catch (err) {
343
- console.error("[gateway] event handler error:", err);
344
- }
345
- return;
346
- }
347
-
348
- if (frame.type === "res") {
349
- const res = parsed as GatewayResponseFrame;
350
- const pending = this.pending.get(res.id);
351
- if (!pending) return;
352
- this.pending.delete(res.id);
353
- if (res.ok) pending.resolve(res.payload);
354
- else {
355
- const error = res.error;
356
- pending.reject(
357
- error
358
- ? new GatewayRequestError({
359
- code: error.code,
360
- message: error.message ?? "request failed",
361
- details: error.details,
362
- })
363
- : new Error("request failed"),
364
- );
365
- }
366
- return;
367
- }
368
- }
369
-
370
- request<T = unknown>(method: string, params?: unknown): Promise<T> {
371
- if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
372
- return Promise.reject(new Error("gateway not connected"));
373
- }
374
- const id = crypto.randomUUID();
375
- const frame = { type: "req", id, method, params };
376
- const p = new Promise<T>((resolve, reject) => {
377
- this.pending.set(id, { resolve: (v) => resolve(v as T), reject });
378
- });
379
- this.ws.send(JSON.stringify(frame));
380
- return p;
381
- }
382
-
383
- private queueConnect() {
384
- this.connectNonce = null;
385
- this.connectSent = false;
386
- if (this.connectTimer !== null) window.clearTimeout(this.connectTimer);
387
-
388
- this.connectTimer = window.setTimeout(() => {
389
- void this.sendConnect();
390
- }, 750);
391
- }
392
- }
1
+ import { GATEWAY_CLIENT_IDS, GATEWAY_CLIENT_MODES, type GatewayClientId, type GatewayClientMode } from "./client-info";
2
+ import { clearDeviceAuthToken, loadDeviceAuthToken, storeDeviceAuthToken } from "./device-auth";
3
+ import type { DeviceIdentity } from "./device-identity";
4
+
5
+ export type GatewayEventFrame = {
6
+ type: "event";
7
+ event: string;
8
+ payload?: unknown;
9
+ seq?: number;
10
+ stateVersion?: { presence: number; health: number };
11
+ };
12
+
13
+ export type GatewayResponseFrame = {
14
+ type: "res";
15
+ id: string;
16
+ ok: boolean;
17
+ payload?: unknown;
18
+ error?: { code: string; message: string; details?: unknown };
19
+ };
20
+
21
+ export type GatewayErrorInfo = {
22
+ code: string;
23
+ message: string;
24
+ details?: unknown;
25
+ };
26
+
27
+ export type GatewayHelloOk = {
28
+ type: "hello-ok";
29
+ protocol: number;
30
+ features?: { methods?: string[]; events?: string[] };
31
+ snapshot?: unknown;
32
+ auth?: {
33
+ deviceToken?: string;
34
+ role?: string;
35
+ scopes?: string[];
36
+ issuedAtMs?: number;
37
+ };
38
+ policy?: { tickIntervalMs?: number };
39
+ };
40
+
41
+ type Pending = {
42
+ resolve: (value: unknown) => void;
43
+ reject: (err: unknown) => void;
44
+ };
45
+
46
+ export type GatewayBrowserClientOptions = {
47
+ url: string;
48
+ token?: string;
49
+ password?: string;
50
+ deviceIdentity?: DeviceIdentity | null;
51
+ clientName?: GatewayClientId;
52
+ clientVersion?: string;
53
+ platform?: string;
54
+ mode?: GatewayClientMode;
55
+ instanceId?: string;
56
+ onHello?: (hello: GatewayHelloOk) => void;
57
+ onEvent?: (evt: GatewayEventFrame) => void;
58
+ onClose?: (info: { code: number; reason: string; error?: GatewayErrorInfo | null }) => void;
59
+ onGap?: (info: { expected: number; received: number }) => void;
60
+ autoReconnect?: boolean;
61
+ };
62
+
63
+ // 4008 = application-defined code (browser rejects 1008 "Policy Violation")
64
+ const CONNECT_FAILED_CLOSE_CODE = 4008;
65
+
66
+ export class GatewayRequestError extends Error {
67
+ readonly code: string;
68
+ readonly details?: unknown;
69
+
70
+ constructor(error: GatewayErrorInfo) {
71
+ super(error.message || error.code);
72
+ this.name = "GatewayRequestError";
73
+ this.code = error.code;
74
+ this.details = error.details;
75
+ }
76
+ }
77
+
78
+ export class GatewayBrowserClient {
79
+ private ws: WebSocket | null = null;
80
+ private pending = new Map<string, Pending>();
81
+ private closed = false;
82
+ private lastSeq: number | null = null;
83
+ private connectNonce: string | null = null;
84
+ private connectSent = false;
85
+ private connectTimer: number | null = null;
86
+ private backoffMs = 800;
87
+ private connectError: GatewayErrorInfo | null = null;
88
+ private pendingTokenResetRetry = false;
89
+ private tokenResetRetryBudgetUsed = false;
90
+
91
+ constructor(private opts: GatewayBrowserClientOptions) {}
92
+
93
+ start() {
94
+ this.closed = false;
95
+ this.connect();
96
+ }
97
+
98
+ stop() {
99
+ this.closed = true;
100
+ this.ws?.close();
101
+ this.ws = null;
102
+ this.pendingTokenResetRetry = false;
103
+ this.tokenResetRetryBudgetUsed = false;
104
+ this.flushPending(new Error("gateway client stopped"));
105
+ }
106
+
107
+ get connected() {
108
+ return this.ws?.readyState === WebSocket.OPEN;
109
+ }
110
+
111
+ private connect() {
112
+ if (this.closed) return;
113
+ try {
114
+ this.ws = new WebSocket(this.opts.url);
115
+ this.ws.onopen = () => this.queueConnect();
116
+ this.ws.onmessage = (ev) => this.handleMessage(String(ev.data ?? ""));
117
+ this.ws.onclose = (ev) => {
118
+ const reason = String(ev.reason ?? "");
119
+ const error = this.connectError;
120
+ this.connectError = null;
121
+ this.ws = null;
122
+ this.flushPending(new Error(`gateway closed (${ev.code}): ${reason}`));
123
+
124
+ if (this.pendingTokenResetRetry) {
125
+ this.pendingTokenResetRetry = false;
126
+ window.setTimeout(() => this.connect(), 0);
127
+ return;
128
+ }
129
+
130
+ this.opts.onClose?.({ code: ev.code, reason, error });
131
+ this.scheduleReconnect();
132
+ };
133
+ this.ws.onerror = () => {
134
+ // ignored; close handler will fire
135
+ };
136
+ } catch (err) {
137
+ console.error("[gateway] Failed to create WebSocket instance:", err);
138
+ // Simulate a close event for the UI to handle
139
+ this.opts.onClose?.({
140
+ code: 1006,
141
+ reason: err instanceof Error ? err.message : "Connect failed",
142
+ error: null,
143
+ });
144
+ this.scheduleReconnect();
145
+ }
146
+ }
147
+
148
+ private scheduleReconnect() {
149
+ if (this.closed || this.opts.autoReconnect === false) return;
150
+ const delay = this.backoffMs;
151
+ this.backoffMs = Math.min(this.backoffMs * 1.7, 15_000);
152
+ window.setTimeout(() => this.connect(), delay);
153
+ }
154
+
155
+ private flushPending(err: Error) {
156
+ for (const [, p] of this.pending) p.reject(err);
157
+ this.pending.clear();
158
+ }
159
+
160
+ private async sendConnect() {
161
+ if (this.connectSent) return;
162
+ this.connectSent = true;
163
+ if (this.connectTimer !== null) {
164
+ window.clearTimeout(this.connectTimer);
165
+ this.connectTimer = null;
166
+ }
167
+ const hasWebCrypto = typeof crypto !== "undefined" && !!crypto.subtle;
168
+
169
+ const scopes = ["operator.admin", "operator.approvals", "operator.pairing"];
170
+ const role = "operator";
171
+
172
+ // Dynamic import types for correct typing
173
+ let deviceIdentity = this.opts.deviceIdentity ?? null;
174
+ let authToken: string | undefined;
175
+
176
+ // Dynamically import device auth logic only if needed and in secure context
177
+ if (hasWebCrypto && !deviceIdentity) {
178
+ try {
179
+ const { loadOrCreateDeviceIdentity } = await import("./device-identity");
180
+
181
+ deviceIdentity = await loadOrCreateDeviceIdentity();
182
+ } catch (e) {
183
+ console.warn("[gateway] Failed to load device identity libs", e);
184
+ }
185
+ }
186
+
187
+ if (deviceIdentity) {
188
+ authToken = loadDeviceAuthToken({
189
+ deviceId: deviceIdentity.deviceId,
190
+ role,
191
+ })?.token;
192
+ }
193
+
194
+ const auth =
195
+ authToken || this.opts.token || this.opts.password
196
+ ? {
197
+ token: authToken ?? this.opts.token,
198
+ password: this.opts.password,
199
+ }
200
+ : undefined;
201
+
202
+ let device:
203
+ | {
204
+ id: string;
205
+ publicKey: string;
206
+ signature: string;
207
+ signedAt: number;
208
+ nonce: string | undefined;
209
+ }
210
+ | undefined;
211
+
212
+ if (deviceIdentity) {
213
+ const signedAtMs = Date.now();
214
+ const nonce = this.connectNonce ?? "";
215
+
216
+ try {
217
+ const { buildDeviceAuthPayload } = await import("./device-auth-utils");
218
+ const { signDevicePayload } = await import("./device-identity");
219
+
220
+ const payload = buildDeviceAuthPayload({
221
+ deviceId: deviceIdentity.deviceId,
222
+ clientId: this.opts.clientName ?? GATEWAY_CLIENT_IDS.CONTROL_UI,
223
+ clientMode: this.opts.mode ?? GATEWAY_CLIENT_MODES.WEBCHAT,
224
+ role,
225
+ scopes,
226
+ signedAtMs,
227
+ token: authToken ?? undefined,
228
+ nonce,
229
+ });
230
+ const signature = await signDevicePayload(deviceIdentity.privateKey, payload);
231
+ device = {
232
+ id: deviceIdentity.deviceId,
233
+ publicKey: deviceIdentity.publicKey,
234
+ signature,
235
+ signedAt: signedAtMs,
236
+ nonce,
237
+ };
238
+ } catch (e) {
239
+ console.error("[gateway] Failed to sign device payload", e);
240
+ }
241
+ }
242
+
243
+ const params = {
244
+ minProtocol: 3,
245
+ maxProtocol: 3,
246
+ client: {
247
+ id: this.opts.clientName ?? GATEWAY_CLIENT_IDS.CONTROL_UI,
248
+ version: this.opts.clientVersion ?? "dev",
249
+ platform: this.opts.platform ?? navigator.platform ?? "web",
250
+ mode: this.opts.mode ?? GATEWAY_CLIENT_MODES.WEBCHAT,
251
+ instanceId: this.opts.instanceId,
252
+ },
253
+ role,
254
+ scopes,
255
+ device,
256
+ caps: [],
257
+ auth,
258
+ userAgent: navigator.userAgent,
259
+ locale: navigator.language,
260
+ };
261
+
262
+ void this.request<GatewayHelloOk>("connect", params)
263
+ .then(async (hello) => {
264
+ this.connectError = null;
265
+ if (hello?.auth?.deviceToken && deviceIdentity) {
266
+ try {
267
+ storeDeviceAuthToken({
268
+ deviceId: deviceIdentity.deviceId,
269
+ role: hello.auth.role ?? role,
270
+ token: hello.auth.deviceToken,
271
+ scopes: hello.auth.scopes ?? [],
272
+ });
273
+ } catch (e) {
274
+ console.warn("[gateway] Failed to store device token", e);
275
+ }
276
+ }
277
+ this.backoffMs = 800;
278
+ this.tokenResetRetryBudgetUsed = false;
279
+ this.opts.onHello?.(hello);
280
+ })
281
+ .catch((err) => {
282
+ console.warn("[gateway] connect seq failed", err);
283
+
284
+ if (
285
+ !this.tokenResetRetryBudgetUsed &&
286
+ deviceIdentity &&
287
+ authToken &&
288
+ err instanceof GatewayRequestError &&
289
+ err.code === "AUTH_TOKEN_MISMATCH"
290
+ ) {
291
+ clearDeviceAuthToken({
292
+ deviceId: deviceIdentity.deviceId,
293
+ role,
294
+ });
295
+ this.pendingTokenResetRetry = true;
296
+ this.tokenResetRetryBudgetUsed = true;
297
+ this.connectError = null;
298
+ this.ws?.close(CONNECT_FAILED_CLOSE_CODE, "retry after clearing stale device token");
299
+ return;
300
+ }
301
+
302
+ this.connectError =
303
+ err instanceof GatewayRequestError
304
+ ? { code: err.code, message: err.message, details: err.details }
305
+ : { code: "CONNECT_FAILED", message: err instanceof Error ? err.message : "connect failed" };
306
+ // Do not close here, let the interval handle it or the error event?
307
+ // Original code closed it.
308
+ this.ws?.close(CONNECT_FAILED_CLOSE_CODE, "connect failed");
309
+ });
310
+ }
311
+
312
+ private handleMessage(raw: string) {
313
+ let parsed: unknown;
314
+ try {
315
+ parsed = JSON.parse(raw);
316
+ } catch {
317
+ return;
318
+ }
319
+
320
+ const frame = parsed as { type?: unknown };
321
+ if (frame.type === "event") {
322
+ const evt = parsed as GatewayEventFrame;
323
+
324
+ if (evt.event === "connect.challenge") {
325
+ const payload = evt.payload as { nonce?: unknown } | undefined;
326
+ const nonce = payload && typeof payload.nonce === "string" ? payload.nonce : null;
327
+ if (nonce) {
328
+ this.connectNonce = nonce;
329
+ void this.sendConnect();
330
+ }
331
+ return;
332
+ }
333
+ const seq = typeof evt.seq === "number" ? evt.seq : null;
334
+ if (seq !== null) {
335
+ if (this.lastSeq !== null && seq > this.lastSeq + 1) {
336
+ this.opts.onGap?.({ expected: this.lastSeq + 1, received: seq });
337
+ }
338
+ this.lastSeq = seq;
339
+ }
340
+ try {
341
+ this.opts.onEvent?.(evt);
342
+ } catch (err) {
343
+ console.error("[gateway] event handler error:", err);
344
+ }
345
+ return;
346
+ }
347
+
348
+ if (frame.type === "res") {
349
+ const res = parsed as GatewayResponseFrame;
350
+ const pending = this.pending.get(res.id);
351
+ if (!pending) return;
352
+ this.pending.delete(res.id);
353
+ if (res.ok) pending.resolve(res.payload);
354
+ else {
355
+ const error = res.error;
356
+ pending.reject(
357
+ error
358
+ ? new GatewayRequestError({
359
+ code: error.code,
360
+ message: error.message ?? "request failed",
361
+ details: error.details,
362
+ })
363
+ : new Error("request failed"),
364
+ );
365
+ }
366
+ return;
367
+ }
368
+ }
369
+
370
+ request<T = unknown>(method: string, params?: unknown): Promise<T> {
371
+ if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
372
+ return Promise.reject(new Error("gateway not connected"));
373
+ }
374
+ const id = crypto.randomUUID();
375
+ const frame = { type: "req", id, method, params };
376
+ const p = new Promise<T>((resolve, reject) => {
377
+ this.pending.set(id, { resolve: (v) => resolve(v as T), reject });
378
+ });
379
+ this.ws.send(JSON.stringify(frame));
380
+ return p;
381
+ }
382
+
383
+ private queueConnect() {
384
+ this.connectNonce = null;
385
+ this.connectSent = false;
386
+ if (this.connectTimer !== null) window.clearTimeout(this.connectTimer);
387
+
388
+ this.connectTimer = window.setTimeout(() => {
389
+ void this.sendConnect();
390
+ }, 750);
391
+ }
392
+ }