@my-swu/simulator-client 0.1.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 (530) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +355 -0
  3. package/dist/actionable.d.ts +61 -0
  4. package/dist/actionable.js +91 -0
  5. package/dist/client.d.ts +157 -0
  6. package/dist/client.js +92 -0
  7. package/dist/connection/handshake.d.ts +30 -0
  8. package/dist/connection/handshake.js +62 -0
  9. package/dist/connection/options.d.ts +36 -0
  10. package/dist/connection/options.js +1 -0
  11. package/dist/connection/url.d.ts +55 -0
  12. package/dist/connection/url.js +46 -0
  13. package/dist/connection/wait.d.ts +22 -0
  14. package/dist/connection/wait.js +10 -0
  15. package/dist/connection.d.ts +110 -0
  16. package/dist/connection.js +358 -0
  17. package/dist/generated/index.d.ts +121 -0
  18. package/dist/generated/index.js +1 -0
  19. package/dist/generated/public-types.d.ts +2 -0
  20. package/dist/generated/public-types.js +1 -0
  21. package/dist/generated/schemas.d.ts +27 -0
  22. package/dist/generated/schemas.js +21264 -0
  23. package/dist/generated/types/abandon-match-request.d.ts +1 -0
  24. package/dist/generated/types/abandon-match-request.js +2 -0
  25. package/dist/generated/types/abandon-match-response.d.ts +1 -0
  26. package/dist/generated/types/abandon-match-response.js +2 -0
  27. package/dist/generated/types/add-lobby-ai-player-request.d.ts +1 -0
  28. package/dist/generated/types/add-lobby-ai-player-request.js +2 -0
  29. package/dist/generated/types/ai-driver-error-report-list-response.d.ts +1 -0
  30. package/dist/generated/types/ai-driver-error-report-list-response.js +2 -0
  31. package/dist/generated/types/ai-driver-error-report-response.d.ts +1 -0
  32. package/dist/generated/types/ai-driver-error-report-response.js +2 -0
  33. package/dist/generated/types/api-error-response.d.ts +1 -0
  34. package/dist/generated/types/api-error-response.js +2 -0
  35. package/dist/generated/types/card-catalog-refresh-response.d.ts +1 -0
  36. package/dist/generated/types/card-catalog-refresh-response.js +2 -0
  37. package/dist/generated/types/cards-response.d.ts +1 -0
  38. package/dist/generated/types/cards-response.js +2 -0
  39. package/dist/generated/types/client-message.d.ts +1 -0
  40. package/dist/generated/types/client-message.js +2 -0
  41. package/dist/generated/types/close-tournament-room-request.d.ts +1 -0
  42. package/dist/generated/types/close-tournament-room-request.js +2 -0
  43. package/dist/generated/types/common.d.ts +5361 -0
  44. package/dist/generated/types/common.js +2 -0
  45. package/dist/generated/types/covered-cards-response.d.ts +47 -0
  46. package/dist/generated/types/covered-cards-response.js +2 -0
  47. package/dist/generated/types/create-limited-event-request.d.ts +1 -0
  48. package/dist/generated/types/create-limited-event-request.js +2 -0
  49. package/dist/generated/types/create-lobby-request.d.ts +1 -0
  50. package/dist/generated/types/create-lobby-request.js +2 -0
  51. package/dist/generated/types/create-match-request.d.ts +1 -0
  52. package/dist/generated/types/create-match-request.js +2 -0
  53. package/dist/generated/types/create-meta-window-request.d.ts +1 -0
  54. package/dist/generated/types/create-meta-window-request.js +2 -0
  55. package/dist/generated/types/create-tournament-room-request.d.ts +1 -0
  56. package/dist/generated/types/create-tournament-room-request.js +2 -0
  57. package/dist/generated/types/create-tournament-table-request.d.ts +1 -0
  58. package/dist/generated/types/create-tournament-table-request.js +2 -0
  59. package/dist/generated/types/error-payload.d.ts +1 -0
  60. package/dist/generated/types/error-payload.js +2 -0
  61. package/dist/generated/types/format-event-request.d.ts +1 -0
  62. package/dist/generated/types/format-event-request.js +2 -0
  63. package/dist/generated/types/format-event-response.d.ts +1 -0
  64. package/dist/generated/types/format-event-response.js +2 -0
  65. package/dist/generated/types/game-command.d.ts +1 -0
  66. package/dist/generated/types/game-command.js +2 -0
  67. package/dist/generated/types/game-event.d.ts +1 -0
  68. package/dist/generated/types/game-event.js +2 -0
  69. package/dist/generated/types/game-state.d.ts +1 -0
  70. package/dist/generated/types/game-state.js +2 -0
  71. package/dist/generated/types/get-match-response.d.ts +1 -0
  72. package/dist/generated/types/get-match-response.js +2 -0
  73. package/dist/generated/types/health-response.d.ts +1 -0
  74. package/dist/generated/types/health-response.js +2 -0
  75. package/dist/generated/types/join-limited-event-request.d.ts +1 -0
  76. package/dist/generated/types/join-limited-event-request.js +2 -0
  77. package/dist/generated/types/join-lobby-request.d.ts +1 -0
  78. package/dist/generated/types/join-lobby-request.js +2 -0
  79. package/dist/generated/types/join-match-request.d.ts +1 -0
  80. package/dist/generated/types/join-match-request.js +2 -0
  81. package/dist/generated/types/join-tournament-room-request.d.ts +1 -0
  82. package/dist/generated/types/join-tournament-room-request.js +2 -0
  83. package/dist/generated/types/join-tournament-table-request.d.ts +1 -0
  84. package/dist/generated/types/join-tournament-table-request.js +2 -0
  85. package/dist/generated/types/kick-lobby-player-request.d.ts +1 -0
  86. package/dist/generated/types/kick-lobby-player-request.js +2 -0
  87. package/dist/generated/types/kick-lobby-spectator-request.d.ts +1 -0
  88. package/dist/generated/types/kick-lobby-spectator-request.js +2 -0
  89. package/dist/generated/types/leave-lobby-request.d.ts +1 -0
  90. package/dist/generated/types/leave-lobby-request.js +2 -0
  91. package/dist/generated/types/leave-match-request.d.ts +1 -0
  92. package/dist/generated/types/leave-match-request.js +2 -0
  93. package/dist/generated/types/leave-match-response.d.ts +1 -0
  94. package/dist/generated/types/leave-match-response.js +2 -0
  95. package/dist/generated/types/leave-tournament-room-request.d.ts +1 -0
  96. package/dist/generated/types/leave-tournament-room-request.js +2 -0
  97. package/dist/generated/types/limited-event-access-response.d.ts +1 -0
  98. package/dist/generated/types/limited-event-access-response.js +2 -0
  99. package/dist/generated/types/limited-event-command-request.d.ts +1 -0
  100. package/dist/generated/types/limited-event-command-request.js +2 -0
  101. package/dist/generated/types/limited-event-preflight-response.d.ts +1 -0
  102. package/dist/generated/types/limited-event-preflight-response.js +2 -0
  103. package/dist/generated/types/limited-event-response.d.ts +1 -0
  104. package/dist/generated/types/limited-event-response.js +2 -0
  105. package/dist/generated/types/list-active-ai-matches-request.d.ts +1 -0
  106. package/dist/generated/types/list-active-ai-matches-request.js +2 -0
  107. package/dist/generated/types/list-active-ai-matches-response.d.ts +1 -0
  108. package/dist/generated/types/list-active-ai-matches-response.js +2 -0
  109. package/dist/generated/types/lobby-access-response.d.ts +1 -0
  110. package/dist/generated/types/lobby-access-response.js +2 -0
  111. package/dist/generated/types/lobby-chat-request.d.ts +1 -0
  112. package/dist/generated/types/lobby-chat-request.js +2 -0
  113. package/dist/generated/types/lobby-chat-response.d.ts +1 -0
  114. package/dist/generated/types/lobby-chat-response.js +2 -0
  115. package/dist/generated/types/lobby-list-response.d.ts +1 -0
  116. package/dist/generated/types/lobby-list-response.js +2 -0
  117. package/dist/generated/types/lobby-list-server-message.d.ts +1 -0
  118. package/dist/generated/types/lobby-list-server-message.js +2 -0
  119. package/dist/generated/types/lobby-matchmaking-decision-request.d.ts +1 -0
  120. package/dist/generated/types/lobby-matchmaking-decision-request.js +2 -0
  121. package/dist/generated/types/lobby-matchmaking-request.d.ts +1 -0
  122. package/dist/generated/types/lobby-matchmaking-request.js +2 -0
  123. package/dist/generated/types/lobby-response.d.ts +1 -0
  124. package/dist/generated/types/lobby-response.js +2 -0
  125. package/dist/generated/types/lobby-server-message.d.ts +1 -0
  126. package/dist/generated/types/lobby-server-message.js +2 -0
  127. package/dist/generated/types/lobby-sync-request.d.ts +1 -0
  128. package/dist/generated/types/lobby-sync-request.js +2 -0
  129. package/dist/generated/types/match-access-response.d.ts +1 -0
  130. package/dist/generated/types/match-access-response.js +2 -0
  131. package/dist/generated/types/match-chat-lookup-response.d.ts +1 -0
  132. package/dist/generated/types/match-chat-lookup-response.js +2 -0
  133. package/dist/generated/types/match-connection-role.d.ts +1 -0
  134. package/dist/generated/types/match-connection-role.js +2 -0
  135. package/dist/generated/types/match-history-deck-stats-request.d.ts +1 -0
  136. package/dist/generated/types/match-history-deck-stats-request.js +2 -0
  137. package/dist/generated/types/match-history-deck-stats-response.d.ts +1 -0
  138. package/dist/generated/types/match-history-deck-stats-response.js +2 -0
  139. package/dist/generated/types/match-history-entry.d.ts +1 -0
  140. package/dist/generated/types/match-history-entry.js +2 -0
  141. package/dist/generated/types/match-history-list-request.d.ts +1 -0
  142. package/dist/generated/types/match-history-list-request.js +2 -0
  143. package/dist/generated/types/match-history-list-response.d.ts +1 -0
  144. package/dist/generated/types/match-history-list-response.js +2 -0
  145. package/dist/generated/types/match-history-replay-request.d.ts +1 -0
  146. package/dist/generated/types/match-history-replay-request.js +2 -0
  147. package/dist/generated/types/match-history-replay-response.d.ts +1 -0
  148. package/dist/generated/types/match-history-replay-response.js +2 -0
  149. package/dist/generated/types/match-history-restore-request.d.ts +1 -0
  150. package/dist/generated/types/match-history-restore-request.js +2 -0
  151. package/dist/generated/types/match-save-payload.d.ts +1 -0
  152. package/dist/generated/types/match-save-payload.js +2 -0
  153. package/dist/generated/types/match-spectator-access-response.d.ts +1 -0
  154. package/dist/generated/types/match-spectator-access-response.js +2 -0
  155. package/dist/generated/types/meta-window.d.ts +1 -0
  156. package/dist/generated/types/meta-window.js +2 -0
  157. package/dist/generated/types/meta-windows-response.d.ts +1 -0
  158. package/dist/generated/types/meta-windows-response.js +2 -0
  159. package/dist/generated/types/prepare-lobby-limited-ai-decks-request.d.ts +1 -0
  160. package/dist/generated/types/prepare-lobby-limited-ai-decks-request.js +2 -0
  161. package/dist/generated/types/random-lobby-matchmaking-request.d.ts +173 -0
  162. package/dist/generated/types/random-lobby-matchmaking-request.js +2 -0
  163. package/dist/generated/types/ranked-admin-status.d.ts +1 -0
  164. package/dist/generated/types/ranked-admin-status.js +2 -0
  165. package/dist/generated/types/ranked-leaderboard-entry.d.ts +1 -0
  166. package/dist/generated/types/ranked-leaderboard-entry.js +2 -0
  167. package/dist/generated/types/ranked-leaderboard-query.d.ts +1 -0
  168. package/dist/generated/types/ranked-leaderboard-query.js +2 -0
  169. package/dist/generated/types/ranked-leaderboard-response.d.ts +1 -0
  170. package/dist/generated/types/ranked-leaderboard-response.js +2 -0
  171. package/dist/generated/types/ranked-matchmaking-request.d.ts +137 -0
  172. package/dist/generated/types/ranked-matchmaking-request.js +2 -0
  173. package/dist/generated/types/ranked-matchmaking-view.d.ts +1 -0
  174. package/dist/generated/types/ranked-matchmaking-view.js +2 -0
  175. package/dist/generated/types/ranked-profile-request.d.ts +1 -0
  176. package/dist/generated/types/ranked-profile-request.js +2 -0
  177. package/dist/generated/types/ranked-profile-response.d.ts +1 -0
  178. package/dist/generated/types/ranked-profile-response.js +2 -0
  179. package/dist/generated/types/ranked-queue.d.ts +1 -0
  180. package/dist/generated/types/ranked-queue.js +2 -0
  181. package/dist/generated/types/ready-tournament-table-request.d.ts +7 -0
  182. package/dist/generated/types/ready-tournament-table-request.js +2 -0
  183. package/dist/generated/types/rematch-match-request.d.ts +1 -0
  184. package/dist/generated/types/rematch-match-request.js +2 -0
  185. package/dist/generated/types/rematch-match-response.d.ts +1 -0
  186. package/dist/generated/types/rematch-match-response.js +2 -0
  187. package/dist/generated/types/resolve-card-ids-request.d.ts +1 -0
  188. package/dist/generated/types/resolve-card-ids-request.js +2 -0
  189. package/dist/generated/types/resolve-card-ids-response.d.ts +1 -0
  190. package/dist/generated/types/resolve-card-ids-response.js +2 -0
  191. package/dist/generated/types/restore-history-response.d.ts +1 -0
  192. package/dist/generated/types/restore-history-response.js +2 -0
  193. package/dist/generated/types/restore-match-save-request.d.ts +1 -0
  194. package/dist/generated/types/restore-match-save-request.js +2 -0
  195. package/dist/generated/types/restore-match-save-response.d.ts +1 -0
  196. package/dist/generated/types/restore-match-save-response.js +2 -0
  197. package/dist/generated/types/return-lobby-match-request.d.ts +1 -0
  198. package/dist/generated/types/return-lobby-match-request.js +2 -0
  199. package/dist/generated/types/return-tournament-match-request.d.ts +1 -0
  200. package/dist/generated/types/return-tournament-match-request.js +2 -0
  201. package/dist/generated/types/save-match-request.d.ts +1 -0
  202. package/dist/generated/types/save-match-request.js +2 -0
  203. package/dist/generated/types/server-message.d.ts +1 -0
  204. package/dist/generated/types/server-message.js +2 -0
  205. package/dist/generated/types/set-ai-paused-request.d.ts +1 -0
  206. package/dist/generated/types/set-ai-paused-request.js +2 -0
  207. package/dist/generated/types/set-ai-paused-response.d.ts +1 -0
  208. package/dist/generated/types/set-ai-paused-response.js +2 -0
  209. package/dist/generated/types/set-ranked-admission-request.d.ts +1 -0
  210. package/dist/generated/types/set-ranked-admission-request.js +2 -0
  211. package/dist/generated/types/set-simulator-maintenance-request.d.ts +1 -0
  212. package/dist/generated/types/set-simulator-maintenance-request.js +2 -0
  213. package/dist/generated/types/simulator-admin-status-response.d.ts +1 -0
  214. package/dist/generated/types/simulator-admin-status-response.js +2 -0
  215. package/dist/generated/types/simulator-availability-response.d.ts +1 -0
  216. package/dist/generated/types/simulator-availability-response.js +2 -0
  217. package/dist/generated/types/simulator-report-list-response.d.ts +1 -0
  218. package/dist/generated/types/simulator-report-list-response.js +2 -0
  219. package/dist/generated/types/simulator-report-response.d.ts +1 -0
  220. package/dist/generated/types/simulator-report-response.js +2 -0
  221. package/dist/generated/types/spectate-lobby-request.d.ts +1 -0
  222. package/dist/generated/types/spectate-lobby-request.js +2 -0
  223. package/dist/generated/types/spectate-match-request.d.ts +1 -0
  224. package/dist/generated/types/spectate-match-request.js +2 -0
  225. package/dist/generated/types/start-lobby-limited-match-request.d.ts +1 -0
  226. package/dist/generated/types/start-lobby-limited-match-request.js +2 -0
  227. package/dist/generated/types/start-lobby-request.d.ts +1 -0
  228. package/dist/generated/types/start-lobby-request.js +2 -0
  229. package/dist/generated/types/start-tournament-event-request.d.ts +1 -0
  230. package/dist/generated/types/start-tournament-event-request.js +2 -0
  231. package/dist/generated/types/stats-response.d.ts +5 -0
  232. package/dist/generated/types/stats-response.js +2 -0
  233. package/dist/generated/types/submit-lobby-limited-deck-request.d.ts +1 -0
  234. package/dist/generated/types/submit-lobby-limited-deck-request.js +2 -0
  235. package/dist/generated/types/submit-match-deck-request.d.ts +1 -0
  236. package/dist/generated/types/submit-match-deck-request.js +2 -0
  237. package/dist/generated/types/submit-match-deck-response.d.ts +1 -0
  238. package/dist/generated/types/submit-match-deck-response.js +2 -0
  239. package/dist/generated/types/submit-tournament-deck-request.d.ts +1 -0
  240. package/dist/generated/types/submit-tournament-deck-request.js +2 -0
  241. package/dist/generated/types/tournament-event-command-request.d.ts +1 -0
  242. package/dist/generated/types/tournament-event-command-request.js +2 -0
  243. package/dist/generated/types/tournament-room-access-response.d.ts +1 -0
  244. package/dist/generated/types/tournament-room-access-response.js +2 -0
  245. package/dist/generated/types/tournament-room-chat-request.d.ts +1 -0
  246. package/dist/generated/types/tournament-room-chat-request.js +2 -0
  247. package/dist/generated/types/tournament-room-chat-response.d.ts +1 -0
  248. package/dist/generated/types/tournament-room-chat-response.js +2 -0
  249. package/dist/generated/types/tournament-room-list-response.d.ts +1 -0
  250. package/dist/generated/types/tournament-room-list-response.js +2 -0
  251. package/dist/generated/types/tournament-room-response.d.ts +1 -0
  252. package/dist/generated/types/tournament-room-response.js +2 -0
  253. package/dist/generated/types/tournament-room-server-message.d.ts +1 -0
  254. package/dist/generated/types/tournament-room-server-message.js +2 -0
  255. package/dist/generated/types/tournament-room-sync-request.d.ts +1 -0
  256. package/dist/generated/types/tournament-room-sync-request.js +2 -0
  257. package/dist/generated/types/undo-match-request.d.ts +1 -0
  258. package/dist/generated/types/undo-match-request.js +2 -0
  259. package/dist/generated/types/undo-match-response.d.ts +1 -0
  260. package/dist/generated/types/undo-match-response.js +2 -0
  261. package/dist/generated/types/undo-respond-match-request.d.ts +1 -0
  262. package/dist/generated/types/undo-respond-match-request.js +2 -0
  263. package/dist/generated/types/update-lobby-ai-player-request.d.ts +1 -0
  264. package/dist/generated/types/update-lobby-ai-player-request.js +2 -0
  265. package/dist/generated/types/update-lobby-player-request.d.ts +1 -0
  266. package/dist/generated/types/update-lobby-player-request.js +2 -0
  267. package/dist/generated/types/update-lobby-settings-request.d.ts +1 -0
  268. package/dist/generated/types/update-lobby-settings-request.js +2 -0
  269. package/dist/generated/types/update-tournament-room-player-request.d.ts +1 -0
  270. package/dist/generated/types/update-tournament-room-player-request.js +2 -0
  271. package/dist/generated/types/update-tournament-room-settings-request.d.ts +1 -0
  272. package/dist/generated/types/update-tournament-room-settings-request.js +2 -0
  273. package/dist/generated/types/update-tournament-table-deck-request.d.ts +123 -0
  274. package/dist/generated/types/update-tournament-table-deck-request.js +2 -0
  275. package/dist/generated/types/welcome-payload.d.ts +1 -0
  276. package/dist/generated/types/welcome-payload.js +2 -0
  277. package/dist/generated/version.d.ts +16 -0
  278. package/dist/generated/version.js +16 -0
  279. package/dist/http/abort.d.ts +57 -0
  280. package/dist/http/abort.js +60 -0
  281. package/dist/http/json.d.ts +13 -0
  282. package/dist/http/json.js +24 -0
  283. package/dist/http/options.d.ts +40 -0
  284. package/dist/http/options.js +1 -0
  285. package/dist/http/request.d.ts +64 -0
  286. package/dist/http/request.js +182 -0
  287. package/dist/http/validated-json.d.ts +9 -0
  288. package/dist/http/validated-json.js +14 -0
  289. package/dist/index.d.ts +39 -0
  290. package/dist/index.js +10 -0
  291. package/dist/internal/abort-error.d.ts +91 -0
  292. package/dist/internal/abort-error.js +62 -0
  293. package/dist/internal/authenticated-socket-session.d.ts +63 -0
  294. package/dist/internal/authenticated-socket-session.js +170 -0
  295. package/dist/internal/emitter.d.ts +18 -0
  296. package/dist/internal/emitter.js +34 -0
  297. package/dist/internal/errors.d.ts +233 -0
  298. package/dist/internal/errors.js +238 -0
  299. package/dist/internal/limits.d.ts +13 -0
  300. package/dist/internal/limits.js +13 -0
  301. package/dist/internal/reconnect-backoff.d.ts +33 -0
  302. package/dist/internal/reconnect-backoff.js +25 -0
  303. package/dist/internal/socket-frame.d.ts +43 -0
  304. package/dist/internal/socket-frame.js +47 -0
  305. package/dist/internal/transport.d.ts +78 -0
  306. package/dist/internal/transport.js +18 -0
  307. package/dist/internal/websocket-event.d.ts +15 -0
  308. package/dist/internal/websocket-event.js +31 -0
  309. package/dist/local/assets.d.ts +96 -0
  310. package/dist/local/assets.js +235 -0
  311. package/dist/local/client.d.ts +32 -0
  312. package/dist/local/client.js +211 -0
  313. package/dist/local/engine.d.ts +79 -0
  314. package/dist/local/engine.js +6 -0
  315. package/dist/local/index.d.ts +20 -0
  316. package/dist/local/index.js +17 -0
  317. package/dist/local/offline-engine.d.ts +46 -0
  318. package/dist/local/offline-engine.js +74 -0
  319. package/dist/local/protocol.d.ts +95 -0
  320. package/dist/local/protocol.js +10 -0
  321. package/dist/local/routing.d.ts +52 -0
  322. package/dist/local/routing.js +193 -0
  323. package/dist/local/server/ai-scheduler.d.ts +31 -0
  324. package/dist/local/server/ai-scheduler.js +93 -0
  325. package/dist/local/server/http-router.d.ts +35 -0
  326. package/dist/local/server/http-router.js +185 -0
  327. package/dist/local/server/index.d.ts +16 -0
  328. package/dist/local/server/index.js +140 -0
  329. package/dist/local/server/sockets.d.ts +25 -0
  330. package/dist/local/server/sockets.js +141 -0
  331. package/dist/local/wasm-engine.d.ts +61 -0
  332. package/dist/local/wasm-engine.js +63 -0
  333. package/dist/local/worker-boot.d.ts +17 -0
  334. package/dist/local/worker-boot.js +76 -0
  335. package/dist/local/worker.d.ts +6 -0
  336. package/dist/local/worker.js +9 -0
  337. package/dist/match-session/access.d.ts +6 -0
  338. package/dist/match-session/access.js +8 -0
  339. package/dist/match-session/controller.d.ts +63 -0
  340. package/dist/match-session/controller.js +513 -0
  341. package/dist/match-session/errors.d.ts +3 -0
  342. package/dist/match-session/errors.js +34 -0
  343. package/dist/match-session/methods.d.ts +433 -0
  344. package/dist/match-session/methods.js +1 -0
  345. package/dist/match-session/session-state.d.ts +235 -0
  346. package/dist/match-session/session-state.js +1 -0
  347. package/dist/match-session/types.d.ts +56 -0
  348. package/dist/match-session/types.js +1 -0
  349. package/dist/match-session.d.ts +3 -0
  350. package/dist/match-session.js +1 -0
  351. package/dist/messages.d.ts +195 -0
  352. package/dist/messages.js +240 -0
  353. package/dist/resources/admin.d.ts +63 -0
  354. package/dist/resources/admin.js +75 -0
  355. package/dist/resources/card-deck-json.d.ts +11 -0
  356. package/dist/resources/card-deck-json.js +164 -0
  357. package/dist/resources/card-resolution.d.ts +9 -0
  358. package/dist/resources/card-resolution.js +21 -0
  359. package/dist/resources/card-resource.d.ts +157 -0
  360. package/dist/resources/card-resource.js +28 -0
  361. package/dist/resources/card-types.d.ts +203 -0
  362. package/dist/resources/card-types.js +1 -0
  363. package/dist/resources/cards.d.ts +3 -0
  364. package/dist/resources/cards.js +1 -0
  365. package/dist/resources/limited-event-types.d.ts +252 -0
  366. package/dist/resources/limited-event-types.js +1 -0
  367. package/dist/resources/limited-events.d.ts +7 -0
  368. package/dist/resources/limited-events.js +49 -0
  369. package/dist/resources/lobbies.d.ts +53 -0
  370. package/dist/resources/lobbies.js +50 -0
  371. package/dist/resources/lobby-list-session.d.ts +13 -0
  372. package/dist/resources/lobby-list-session.js +198 -0
  373. package/dist/resources/lobby-session.d.ts +9 -0
  374. package/dist/resources/lobby-session.js +59 -0
  375. package/dist/resources/lobby-types.d.ts +357 -0
  376. package/dist/resources/lobby-types.js +1 -0
  377. package/dist/resources/match-history.d.ts +49 -0
  378. package/dist/resources/match-history.js +34 -0
  379. package/dist/resources/match-types.d.ts +448 -0
  380. package/dist/resources/match-types.js +1 -0
  381. package/dist/resources/matches.d.ts +16 -0
  382. package/dist/resources/matches.js +109 -0
  383. package/dist/resources/ranked.d.ts +24 -0
  384. package/dist/resources/ranked.js +47 -0
  385. package/dist/resources/session.d.ts +62 -0
  386. package/dist/resources/session.js +26 -0
  387. package/dist/resources/system.d.ts +51 -0
  388. package/dist/resources/system.js +9 -0
  389. package/dist/resources/tournament-room-session.d.ts +9 -0
  390. package/dist/resources/tournament-room-session.js +53 -0
  391. package/dist/resources/tournament-room-types.d.ts +44 -0
  392. package/dist/resources/tournament-room-types.js +1 -0
  393. package/dist/resources/tournament-rooms.d.ts +33 -0
  394. package/dist/resources/tournament-rooms.js +33 -0
  395. package/dist/session.d.ts +56 -0
  396. package/dist/session.js +1 -0
  397. package/dist/types.d.ts +73 -0
  398. package/dist/types.js +27 -0
  399. package/dist/validators/ajv.d.ts +51 -0
  400. package/dist/validators/ajv.js +121 -0
  401. package/dist/validators/discriminants.d.ts +36 -0
  402. package/dist/validators/discriminants.js +89 -0
  403. package/dist/validators/validator.d.ts +73 -0
  404. package/dist/validators/validator.js +26 -0
  405. package/dist/validators/warm-up.d.ts +25 -0
  406. package/dist/validators/warm-up.js +59 -0
  407. package/dist/validators.d.ts +173 -0
  408. package/dist/validators.js +85 -0
  409. package/package.json +88 -0
  410. package/schema/abandon-match-request.schema.json +15 -0
  411. package/schema/abandon-match-response.schema.json +15 -0
  412. package/schema/add-lobby-ai-player-request.schema.json +53 -0
  413. package/schema/api-error-response.schema.json +13 -0
  414. package/schema/card-catalog-refresh-response.schema.json +31 -0
  415. package/schema/cards-response.schema.json +17 -0
  416. package/schema/client-message.schema.json +203 -0
  417. package/schema/close-tournament-room-request.schema.json +18 -0
  418. package/schema/common.schema.json +14129 -0
  419. package/schema/create-limited-event-request.schema.json +60 -0
  420. package/schema/create-lobby-request.schema.json +67 -0
  421. package/schema/create-match-request.schema.json +124 -0
  422. package/schema/create-meta-window-request.schema.json +27 -0
  423. package/schema/create-tournament-room-request.schema.json +104 -0
  424. package/schema/create-tournament-table-request.schema.json +14 -0
  425. package/schema/error-payload.schema.json +34 -0
  426. package/schema/format-event-request.schema.json +20 -0
  427. package/schema/format-event-response.schema.json +15 -0
  428. package/schema/game-command.schema.json +775 -0
  429. package/schema/game-event.schema.json +2012 -0
  430. package/schema/game-state.schema.json +273 -0
  431. package/schema/get-match-response.schema.json +13 -0
  432. package/schema/health-response.schema.json +13 -0
  433. package/schema/join-limited-event-request.schema.json +6 -0
  434. package/schema/join-lobby-request.schema.json +40 -0
  435. package/schema/join-match-request.schema.json +79 -0
  436. package/schema/join-tournament-room-request.schema.json +39 -0
  437. package/schema/join-tournament-table-request.schema.json +14 -0
  438. package/schema/kick-lobby-player-request.schema.json +13 -0
  439. package/schema/kick-lobby-spectator-request.schema.json +14 -0
  440. package/schema/leave-lobby-request.schema.json +13 -0
  441. package/schema/leave-match-request.schema.json +15 -0
  442. package/schema/leave-match-response.schema.json +15 -0
  443. package/schema/leave-tournament-room-request.schema.json +14 -0
  444. package/schema/limited-event-access-response.schema.json +34 -0
  445. package/schema/limited-event-command-request.schema.json +20 -0
  446. package/schema/limited-event-preflight-response.schema.json +25 -0
  447. package/schema/limited-event-response.schema.json +15 -0
  448. package/schema/list-active-ai-matches-request.schema.json +23 -0
  449. package/schema/list-active-ai-matches-response.schema.json +17 -0
  450. package/schema/lobby-access-response.schema.json +31 -0
  451. package/schema/lobby-chat-request.schema.json +17 -0
  452. package/schema/lobby-chat-response.schema.json +17 -0
  453. package/schema/lobby-list-response.schema.json +16 -0
  454. package/schema/lobby-list-server-message.schema.json +49 -0
  455. package/schema/lobby-matchmaking-decision-request.schema.json +13 -0
  456. package/schema/lobby-matchmaking-request.schema.json +80 -0
  457. package/schema/lobby-response.schema.json +13 -0
  458. package/schema/lobby-server-message.schema.json +155 -0
  459. package/schema/lobby-sync-request.schema.json +13 -0
  460. package/schema/manifest.json +124 -0
  461. package/schema/match-access-response.schema.json +32 -0
  462. package/schema/match-chat-lookup-response.schema.json +34 -0
  463. package/schema/match-connection-role.schema.json +9 -0
  464. package/schema/match-history-deck-stats-request.schema.json +26 -0
  465. package/schema/match-history-deck-stats-response.schema.json +17 -0
  466. package/schema/match-history-entry.schema.json +78 -0
  467. package/schema/match-history-list-request.schema.json +48 -0
  468. package/schema/match-history-list-response.schema.json +25 -0
  469. package/schema/match-history-replay-request.schema.json +17 -0
  470. package/schema/match-history-replay-response.schema.json +14 -0
  471. package/schema/match-history-restore-request.schema.json +23 -0
  472. package/schema/match-save-payload.schema.json +71 -0
  473. package/schema/match-spectator-access-response.schema.json +22 -0
  474. package/schema/meta-window.schema.json +37 -0
  475. package/schema/meta-windows-response.schema.json +24 -0
  476. package/schema/prepare-lobby-limited-ai-decks-request.schema.json +14 -0
  477. package/schema/ranked-admin-status.schema.json +43 -0
  478. package/schema/ranked-leaderboard-entry.schema.json +61 -0
  479. package/schema/ranked-leaderboard-query.schema.json +34 -0
  480. package/schema/ranked-leaderboard-response.schema.json +23 -0
  481. package/schema/ranked-matchmaking-view.schema.json +15 -0
  482. package/schema/ranked-profile-request.schema.json +21 -0
  483. package/schema/ranked-profile-response.schema.json +59 -0
  484. package/schema/ranked-queue.schema.json +12 -0
  485. package/schema/rematch-match-request.schema.json +20 -0
  486. package/schema/rematch-match-response.schema.json +61 -0
  487. package/schema/resolve-card-ids-request.schema.json +17 -0
  488. package/schema/resolve-card-ids-response.schema.json +16 -0
  489. package/schema/restore-history-response.schema.json +15 -0
  490. package/schema/restore-match-save-request.schema.json +20 -0
  491. package/schema/restore-match-save-response.schema.json +29 -0
  492. package/schema/return-lobby-match-request.schema.json +13 -0
  493. package/schema/return-tournament-match-request.schema.json +14 -0
  494. package/schema/route-manifest.json +1014 -0
  495. package/schema/save-match-request.schema.json +15 -0
  496. package/schema/server-message.schema.json +192 -0
  497. package/schema/set-ai-paused-request.schema.json +19 -0
  498. package/schema/set-ai-paused-response.schema.json +18 -0
  499. package/schema/set-ranked-admission-request.schema.json +15 -0
  500. package/schema/set-simulator-maintenance-request.schema.json +20 -0
  501. package/schema/simulator-admin-status-response.schema.json +37 -0
  502. package/schema/simulator-availability-response.schema.json +27 -0
  503. package/schema/simulator-report-list-response.schema.json +23 -0
  504. package/schema/simulator-report-response.schema.json +77 -0
  505. package/schema/spectate-lobby-request.schema.json +32 -0
  506. package/schema/spectate-match-request.schema.json +32 -0
  507. package/schema/start-lobby-limited-match-request.schema.json +13 -0
  508. package/schema/start-lobby-request.schema.json +13 -0
  509. package/schema/start-tournament-event-request.schema.json +14 -0
  510. package/schema/submit-lobby-limited-deck-request.schema.json +33 -0
  511. package/schema/submit-match-deck-request.schema.json +45 -0
  512. package/schema/submit-match-deck-response.schema.json +14 -0
  513. package/schema/submit-tournament-deck-request.schema.json +34 -0
  514. package/schema/tournament-event-command-request.schema.json +18 -0
  515. package/schema/tournament-room-access-response.schema.json +32 -0
  516. package/schema/tournament-room-chat-request.schema.json +18 -0
  517. package/schema/tournament-room-chat-response.schema.json +18 -0
  518. package/schema/tournament-room-list-response.schema.json +17 -0
  519. package/schema/tournament-room-response.schema.json +14 -0
  520. package/schema/tournament-room-server-message.schema.json +127 -0
  521. package/schema/tournament-room-sync-request.schema.json +14 -0
  522. package/schema/undo-match-request.schema.json +14 -0
  523. package/schema/undo-match-response.schema.json +14 -0
  524. package/schema/undo-respond-match-request.schema.json +19 -0
  525. package/schema/update-lobby-ai-player-request.schema.json +65 -0
  526. package/schema/update-lobby-player-request.schema.json +81 -0
  527. package/schema/update-lobby-settings-request.schema.json +70 -0
  528. package/schema/update-tournament-room-player-request.schema.json +45 -0
  529. package/schema/update-tournament-room-settings-request.schema.json +33 -0
  530. package/schema/welcome-payload.schema.json +38 -0
@@ -0,0 +1,47 @@
1
+ import { messageEventDataString } from './websocket-event.js';
2
+ /**
3
+ * Parses one browser-style message event into a typed, validated socket frame.
4
+ *
5
+ * Shared by every socket in the SDK so all of them answer a malformed known
6
+ * frame the same way, whatever their protocol root. The validator decides
7
+ * whether anything is actually checked: with the pass-through the frame is
8
+ * trusted exactly as sent, which is the SDK's default.
9
+ *
10
+ * A JSON syntax error and a schema violation both surface as an `error`
11
+ * result rather than a throw, because the only caller is a socket `message`
12
+ * listener — throwing there escapes into the transport, not into the consumer.
13
+ *
14
+ * @param event Raw socket message event.
15
+ * @param validator Boundary validator; the pass-through trusts the frame.
16
+ * @param schemaName Generated schema name this socket's frames must match.
17
+ */
18
+ export function decodeSocketFrame(event, validator, schemaName) {
19
+ const raw = messageEventDataString(event);
20
+ if (raw == null) {
21
+ return { type: 'ignored' };
22
+ }
23
+ try {
24
+ const payload = JSON.parse(raw);
25
+ // A `type` this build does not know is a newer server variant, not a
26
+ // contract violation: drop it so the wire can grow message types. A known
27
+ // type with a malformed payload still fails validation below.
28
+ //
29
+ // Without a schema map there is no set of known types to test against, so
30
+ // the check is absent rather than negative: the frame is decoded and the
31
+ // caller's dispatch `switch` — which has no case for it — ignores it.
32
+ if (validator.hasUnknownDiscriminant?.(schemaName, payload) === true) {
33
+ return { type: 'ignored' };
34
+ }
35
+ return {
36
+ message: validator.parse(schemaName, payload),
37
+ type: 'message',
38
+ };
39
+ }
40
+ catch (cause) {
41
+ const message = cause instanceof Error ? cause.message : `invalid ${schemaName}`;
42
+ return {
43
+ error: { code: 'sdk_invalid_server_message', message },
44
+ type: 'error',
45
+ };
46
+ }
47
+ }
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Fetch implementation accepted by the SDK.
3
+ *
4
+ * Browser runtimes and Node 18+ usually provide this globally. Pass a custom
5
+ * value when your runtime needs a fetch adapter, proxy wrapper, or test double.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * import type { FetchLike } from '@my-swu/simulator-client'
10
+ *
11
+ * const tracedFetch: FetchLike = (input, init) => {
12
+ * console.log('SDK request', input)
13
+ * return fetch(input, init)
14
+ * }
15
+ *
16
+ * console.log(typeof tracedFetch)
17
+ * ```
18
+ *
19
+ * @see https://simulator-sdk.my-swu.com/guide/runtime-adapters
20
+ */
21
+ export type FetchLike = typeof fetch;
22
+ /**
23
+ * Minimal WebSocket shape required by the SDK.
24
+ *
25
+ * This intentionally matches the browser event-listener style used by
26
+ * `WebSocket` and common Node adapters.
27
+ *
28
+ * @see https://simulator-sdk.my-swu.com/guide/runtime-adapters
29
+ */
30
+ export interface EngineWebSocket {
31
+ /**
32
+ * Registers one DOM-style event listener.
33
+ */
34
+ addEventListener(type: 'open' | 'message' | 'error' | 'close', listener: (event: unknown) => void): void;
35
+ /**
36
+ * Unregisters one DOM-style event listener.
37
+ */
38
+ removeEventListener(type: 'open' | 'message' | 'error' | 'close', listener: (event: unknown) => void): void;
39
+ /**
40
+ * Sends one text frame.
41
+ */
42
+ send(data: string): void;
43
+ /**
44
+ * Closes the socket.
45
+ */
46
+ close(code?: number, reason?: string): void;
47
+ }
48
+ /**
49
+ * Factory used to create WebSocket clients.
50
+ *
51
+ * Use this in runtimes without a global browser-style `WebSocket`.
52
+ *
53
+ * The optional `protocols` argument carries the WebSocket subprotocol list used
54
+ * to authenticate the connection (the auth token is sent off-URL via
55
+ * `Sec-WebSocket-Protocol`; see the connection docs). A custom factory MUST
56
+ * forward `protocols` to its underlying socket, otherwise authentication will
57
+ * fail once tokens are no longer placed in the URL.
58
+ *
59
+ * @example
60
+ * ```ts
61
+ * import WebSocket from 'ws'
62
+ * import type { WebSocketFactory } from '@my-swu/simulator-client'
63
+ *
64
+ * const nodeWebSocketFactory: WebSocketFactory = (url, protocols) => new WebSocket(url, protocols)
65
+ * console.log(typeof nodeWebSocketFactory)
66
+ * ```
67
+ *
68
+ * @see https://simulator-sdk.my-swu.com/guide/runtime-adapters
69
+ */
70
+ export type WebSocketFactory = (url: string, protocols?: string | string[]) => EngineWebSocket;
71
+ /**
72
+ * Returns the ambient fetch implementation.
73
+ */
74
+ export declare function getDefaultFetch(): FetchLike;
75
+ /**
76
+ * Returns the ambient browser-style WebSocket factory.
77
+ */
78
+ export declare function getDefaultWebSocketFactory(): WebSocketFactory;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Returns the ambient fetch implementation.
3
+ */
4
+ export function getDefaultFetch() {
5
+ if (typeof globalThis.fetch !== 'function') {
6
+ throw new Error('global fetch is not available; pass options.fetch');
7
+ }
8
+ return globalThis.fetch.bind(globalThis);
9
+ }
10
+ /**
11
+ * Returns the ambient browser-style WebSocket factory.
12
+ */
13
+ export function getDefaultWebSocketFactory() {
14
+ if (typeof globalThis.WebSocket !== 'function') {
15
+ throw new Error('global WebSocket is not available; pass options.webSocketFactory');
16
+ }
17
+ return (url, protocols) => new globalThis.WebSocket(url, protocols);
18
+ }
@@ -0,0 +1,15 @@
1
+ import type { WebSocketCloseInfo } from './errors.js';
2
+ /**
3
+ * Returns text data from one browser-style WebSocket message event.
4
+ *
5
+ * The SDK's transport boundary accepts `unknown` events so browser sockets,
6
+ * Node adapters, and local-worker sockets all share one safe extraction path.
7
+ */
8
+ export declare function messageEventDataString(event: unknown): string | undefined;
9
+ /**
10
+ * Returns close facts from one browser-style WebSocket close event.
11
+ *
12
+ * Browsers expose `{ code, reason }` on `CloseEvent`; Node adapters and test
13
+ * doubles may pass anything, so both fields are validated defensively.
14
+ */
15
+ export declare function websocketCloseInfo(event: unknown): WebSocketCloseInfo;
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Returns text data from one browser-style WebSocket message event.
3
+ *
4
+ * The SDK's transport boundary accepts `unknown` events so browser sockets,
5
+ * Node adapters, and local-worker sockets all share one safe extraction path.
6
+ */
7
+ export function messageEventDataString(event) {
8
+ if (typeof event === 'object' && event != null && 'data' in event) {
9
+ const data = event.data;
10
+ if (typeof data === 'string') {
11
+ return data;
12
+ }
13
+ }
14
+ return undefined;
15
+ }
16
+ /**
17
+ * Returns close facts from one browser-style WebSocket close event.
18
+ *
19
+ * Browsers expose `{ code, reason }` on `CloseEvent`; Node adapters and test
20
+ * doubles may pass anything, so both fields are validated defensively.
21
+ */
22
+ export function websocketCloseInfo(event) {
23
+ if (typeof event === 'object' && event != null) {
24
+ const { code, reason } = event;
25
+ return {
26
+ closeCode: typeof code === 'number' ? code : undefined,
27
+ reason: typeof reason === 'string' ? reason : undefined,
28
+ };
29
+ }
30
+ return {};
31
+ }
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Engine asset store: downloads the browser-engine runtime assets (wasm
3
+ * binary, wasm-bindgen glue, and gzip card blobs) from a simulator-served base URL into a dedicated
4
+ * Cache API bucket, versioned by the server manifest's content hash.
5
+ *
6
+ * Deliberately dependency-free so app boot code can import it without
7
+ * dragging in the transport/worker modules: keep this module's import list
8
+ * empty (types only).
9
+ */
10
+ /** Shape of `GET {baseUrl}/manifest.json` served by the simulator backend. */
11
+ export interface EngineAssetManifest {
12
+ version: string;
13
+ files: {
14
+ wasm: {
15
+ path: string;
16
+ size: number;
17
+ };
18
+ glue: {
19
+ path: string;
20
+ size: number;
21
+ };
22
+ catalog: {
23
+ path: string;
24
+ size: number;
25
+ };
26
+ };
27
+ }
28
+ /** Locally persisted marker describing the last successful prefetch. */
29
+ export interface EngineAssetMeta {
30
+ version: string;
31
+ cachedAt: string;
32
+ totalBytes: number;
33
+ }
34
+ /** Decompressed byte payloads the engine worker init frame needs. */
35
+ export interface EngineAssetBytes {
36
+ wasmBytes: ArrayBuffer;
37
+ /** wasm-bindgen ES module source matching `wasmBytes`. */
38
+ glueSource: string;
39
+ catalogBytes: ArrayBuffer;
40
+ }
41
+ export interface EngineAssetStoreOptions {
42
+ /** Base URL of the asset routes (e.g. `https://sim.example/assets/engine`). */
43
+ baseUrl: string;
44
+ /** Cache bucket prefix; the bucket is `${prefix}:v${version}`. */
45
+ cachePrefix?: string;
46
+ /** localStorage key for the prefetch marker. */
47
+ metaKey?: string;
48
+ }
49
+ /** Byte-level download progress across all assets of one `prepare()` run. */
50
+ export interface EngineAssetProgress {
51
+ /** Bytes accounted for so far (cache hits count immediately). */
52
+ loadedBytes: number;
53
+ /** Expected total from the manifest's file sizes. */
54
+ totalBytes: number;
55
+ }
56
+ export interface EngineAssetPrepareOptions {
57
+ /** Streams download progress (called per network chunk + per cache hit). */
58
+ onProgress?: ((progress: EngineAssetProgress) => void) | undefined;
59
+ }
60
+ export interface EngineAssetPrepareResult {
61
+ meta: EngineAssetMeta;
62
+ /** Whether any bytes were actually fetched (false = pure cache hit). */
63
+ downloaded: boolean;
64
+ }
65
+ export interface EngineAssetStore {
66
+ /**
67
+ * Fetches the live server manifest (requires network). Lets callers
68
+ * compare the served version against `meta()` to detect updates.
69
+ */
70
+ manifest: () => Promise<EngineAssetManifest>;
71
+ /**
72
+ * Syncs the cache to the server manifest. Only bumps `cachedAt` when bytes
73
+ * were actually downloaded, so "last updated" stays truthful across
74
+ * cache-hit boots. Requires network for the manifest read.
75
+ */
76
+ prepare: (options?: EngineAssetPrepareOptions) => Promise<EngineAssetPrepareResult>;
77
+ /** Whether every asset of the last-prepared version is cached. */
78
+ ready: () => Promise<boolean>;
79
+ /** The last prefetch marker, or `null` when never prepared. */
80
+ meta: () => EngineAssetMeta | null;
81
+ /** Total cached bytes (0 when nothing is cached). */
82
+ cacheSize: () => Promise<number>;
83
+ /** Deletes every bucket under the prefix and the meta marker. */
84
+ wipe: () => Promise<void>;
85
+ /** Reads (and decompresses) the cached assets for the worker init frame. */
86
+ loadBytes: () => Promise<EngineAssetBytes>;
87
+ }
88
+ /**
89
+ * Creates the store. Browser-only: requires the Cache API and localStorage.
90
+ */
91
+ export declare function createEngineAssetStore(options: EngineAssetStoreOptions): EngineAssetStore;
92
+ /**
93
+ * Decompresses a gzip payload (`.gz` assets are stored pre-compressed and
94
+ * served raw). Skips when a proxy already inflated the bytes.
95
+ */
96
+ export declare function decompressGzip(bytes: ArrayBuffer): Promise<ArrayBuffer>;
@@ -0,0 +1,235 @@
1
+ /**
2
+ * Engine asset store: downloads the browser-engine runtime assets (wasm
3
+ * binary, wasm-bindgen glue, and gzip card blobs) from a simulator-served base URL into a dedicated
4
+ * Cache API bucket, versioned by the server manifest's content hash.
5
+ *
6
+ * Deliberately dependency-free so app boot code can import it without
7
+ * dragging in the transport/worker modules: keep this module's import list
8
+ * empty (types only).
9
+ */
10
+ /** Fixed route paths under the base URL — the server contract. */
11
+ const ASSET_PATHS = {
12
+ wasm: 'wasm',
13
+ glue: 'glue',
14
+ catalog: 'catalog',
15
+ };
16
+ const ASSET_KEYS = ['wasm', 'glue', 'catalog'];
17
+ /**
18
+ * Creates the store. Browser-only: requires the Cache API and localStorage.
19
+ */
20
+ export function createEngineAssetStore(options) {
21
+ const cachePrefix = options.cachePrefix ?? 'swu-sim:engine';
22
+ const metaKey = options.metaKey ?? 'swu:simOffline:engineMeta';
23
+ // Cache keys MUST be absolute: `Request.url` is always absolute, so a
24
+ // relative base (dev-server route) would make the stale-key prune below
25
+ // mismatch — and delete — every entry it just stored.
26
+ const trimmedBase = options.baseUrl.replace(/\/$/, '');
27
+ const baseUrl = typeof location !== 'undefined'
28
+ ? new URL(trimmedBase, location.href).toString()
29
+ : trimmedBase;
30
+ const bucketName = (version) => `${cachePrefix}:v${version}`;
31
+ /** Stable cache key per asset — versioning lives in the bucket name. */
32
+ const assetKeyUrl = (path) => `${baseUrl}/${path}`;
33
+ function readMeta() {
34
+ try {
35
+ const raw = localStorage.getItem(metaKey);
36
+ if (!raw) {
37
+ return null;
38
+ }
39
+ const parsed = JSON.parse(raw);
40
+ if (typeof parsed.version !== 'string' || typeof parsed.cachedAt !== 'string') {
41
+ return null;
42
+ }
43
+ return {
44
+ version: parsed.version,
45
+ cachedAt: parsed.cachedAt,
46
+ totalBytes: typeof parsed.totalBytes === 'number' ? parsed.totalBytes : 0,
47
+ };
48
+ }
49
+ catch {
50
+ return null;
51
+ }
52
+ }
53
+ async function fetchManifest() {
54
+ const response = await fetch(`${baseUrl}/manifest.json`, { cache: 'no-cache' });
55
+ if (!response.ok) {
56
+ throw new Error(`failed to fetch engine asset manifest: ${response.status}`);
57
+ }
58
+ const manifest = await response.json();
59
+ if (typeof manifest.version !== 'string' || !manifest.files) {
60
+ throw new Error('invalid engine asset manifest');
61
+ }
62
+ return manifest;
63
+ }
64
+ async function dropOtherBuckets(keep) {
65
+ const names = await caches.keys();
66
+ await Promise.all(names
67
+ .filter(name => name.startsWith(`${cachePrefix}:`) && name !== keep)
68
+ .map(name => caches.delete(name)));
69
+ }
70
+ async function prepare(prepareOptions) {
71
+ const manifest = await fetchManifest();
72
+ const bucket = bucketName(manifest.version);
73
+ await dropOtherBuckets(bucket);
74
+ const cache = await caches.open(bucket);
75
+ // Progress denominator comes from the manifest so the bar is meaningful
76
+ // from the first chunk of the first file.
77
+ const expectedTotal = ASSET_KEYS.reduce((sum, key) => sum + (manifest.files[key]?.size ?? 0), 0);
78
+ let loadedBytes = 0;
79
+ const report = () => prepareOptions?.onProgress?.({ loadedBytes, totalBytes: expectedTotal });
80
+ report();
81
+ let downloaded = false;
82
+ let totalBytes = 0;
83
+ const wantedKeys = new Set();
84
+ for (const key of ASSET_KEYS) {
85
+ const keyUrl = assetKeyUrl(ASSET_PATHS[key]);
86
+ wantedKeys.add(keyUrl);
87
+ const hit = await cache.match(keyUrl);
88
+ if (hit) {
89
+ const size = (await hit.blob()).size;
90
+ totalBytes += size;
91
+ loadedBytes += size;
92
+ report();
93
+ continue;
94
+ }
95
+ // `?v=` busts intermediary HTTP caches; the bucket key stays stable.
96
+ const response = await fetch(`${keyUrl}?v=${encodeURIComponent(manifest.version)}`);
97
+ if (!response.ok) {
98
+ throw new Error(`failed to fetch engine asset ${ASSET_PATHS[key]}: ${response.status}`);
99
+ }
100
+ const bytes = await readWithProgress(response, (chunkBytes) => {
101
+ loadedBytes += chunkBytes;
102
+ report();
103
+ });
104
+ totalBytes += bytes.byteLength;
105
+ // `.buffer` is exact-size (allocated by readWithProgress) — the cast
106
+ // only bridges the TS 5.7 generic-Uint8Array vs DOM BodyInit gap.
107
+ await cache.put(keyUrl, new Response(bytes.buffer, {
108
+ headers: {
109
+ 'content-type': response.headers.get('content-type') ?? 'application/octet-stream',
110
+ },
111
+ }));
112
+ downloaded = true;
113
+ }
114
+ // Prune keys a base-URL change or manifest rename left behind.
115
+ for (const request of await cache.keys()) {
116
+ if (!wantedKeys.has(request.url)) {
117
+ await cache.delete(request);
118
+ }
119
+ }
120
+ const previous = readMeta();
121
+ const meta = {
122
+ version: manifest.version,
123
+ cachedAt: downloaded || previous?.version !== manifest.version
124
+ ? new Date().toISOString()
125
+ : previous.cachedAt,
126
+ totalBytes,
127
+ };
128
+ localStorage.setItem(metaKey, JSON.stringify(meta));
129
+ return { meta, downloaded };
130
+ }
131
+ async function openCurrentCache() {
132
+ const meta = readMeta();
133
+ if (!meta) {
134
+ return null;
135
+ }
136
+ return { cache: await caches.open(bucketName(meta.version)), meta };
137
+ }
138
+ async function ready() {
139
+ const current = await openCurrentCache();
140
+ if (!current) {
141
+ return false;
142
+ }
143
+ for (const key of ASSET_KEYS) {
144
+ if (!(await current.cache.match(assetKeyUrl(ASSET_PATHS[key])))) {
145
+ return false;
146
+ }
147
+ }
148
+ return true;
149
+ }
150
+ async function cacheSize() {
151
+ const current = await openCurrentCache();
152
+ if (!current) {
153
+ return 0;
154
+ }
155
+ let total = 0;
156
+ for (const request of await current.cache.keys()) {
157
+ const hit = await current.cache.match(request);
158
+ if (hit) {
159
+ total += (await hit.blob()).size;
160
+ }
161
+ }
162
+ return total;
163
+ }
164
+ async function wipe() {
165
+ const names = await caches.keys();
166
+ await Promise.all(names
167
+ .filter(name => name.startsWith(`${cachePrefix}:`))
168
+ .map(name => caches.delete(name)));
169
+ localStorage.removeItem(metaKey);
170
+ }
171
+ async function loadBytes() {
172
+ const current = await openCurrentCache();
173
+ if (!current) {
174
+ throw new Error('engine assets have not been prepared');
175
+ }
176
+ const read = async (path) => {
177
+ const hit = await current.cache.match(assetKeyUrl(path));
178
+ if (!hit) {
179
+ throw new Error(`engine asset ${path} missing from cache`);
180
+ }
181
+ return await hit.arrayBuffer();
182
+ };
183
+ const [wasmBytes, glueSource, catalogBytes] = await Promise.all([
184
+ read(ASSET_PATHS.wasm),
185
+ read(ASSET_PATHS.glue).then(bytes => new TextDecoder().decode(bytes)),
186
+ read(ASSET_PATHS.catalog).then(decompressGzip),
187
+ ]);
188
+ return { wasmBytes, glueSource, catalogBytes };
189
+ }
190
+ return { manifest: fetchManifest, prepare, ready, meta: readMeta, cacheSize, wipe, loadBytes };
191
+ }
192
+ /**
193
+ * Reads a response body to completion, reporting each chunk's byte count.
194
+ * Falls back to one `arrayBuffer()` read when the body is not streamable.
195
+ */
196
+ async function readWithProgress(response, onChunk) {
197
+ const reader = response.body?.getReader();
198
+ if (!reader) {
199
+ const buffer = new Uint8Array(await response.arrayBuffer());
200
+ onChunk(buffer.byteLength);
201
+ return buffer;
202
+ }
203
+ const chunks = [];
204
+ let length = 0;
205
+ while (true) {
206
+ const { done, value } = await reader.read();
207
+ if (done) {
208
+ break;
209
+ }
210
+ chunks.push(value);
211
+ length += value.byteLength;
212
+ onChunk(value.byteLength);
213
+ }
214
+ const merged = new Uint8Array(length);
215
+ let offset = 0;
216
+ for (const chunk of chunks) {
217
+ merged.set(chunk, offset);
218
+ offset += chunk.byteLength;
219
+ }
220
+ return merged;
221
+ }
222
+ /**
223
+ * Decompresses a gzip payload (`.gz` assets are stored pre-compressed and
224
+ * served raw). Skips when a proxy already inflated the bytes.
225
+ */
226
+ export async function decompressGzip(bytes) {
227
+ const view = new Uint8Array(bytes);
228
+ // gzip magic bytes; anything else is already-decompressed JSON.
229
+ if (view[0] !== 0x1F || view[1] !== 0x8B) {
230
+ return bytes;
231
+ }
232
+ const stream = new DecompressionStream('gzip');
233
+ const decompressed = new Response(new Response(bytes).body.pipeThrough(stream));
234
+ return await decompressed.arrayBuffer();
235
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Main-thread half of the local transport: a `FetchLike` + `WebSocketFactory`
3
+ * pair backed by the engine worker. Injecting these into
4
+ * `createSimulatorClient` lights up the entire existing SDK (resources,
5
+ * `MatchSession`, reconnect) against the in-browser engine with zero changes.
6
+ */
7
+ import type { FetchLike, WebSocketFactory } from '../internal/transport.js';
8
+ import type { WorkerLike } from './protocol.js';
9
+ export interface WorkerTransport {
10
+ fetch: FetchLike;
11
+ webSocketFactory: WebSocketFactory;
12
+ /** Installs the engine assets; resolves with the engine version. */
13
+ init: (wasmBytes: ArrayBuffer, glueSource: string, catalogBytes: ArrayBuffer) => Promise<string>;
14
+ /** Replaces dynamic app catalog metadata for future local validation. */
15
+ applyCatalogSync: (catalogSyncJson: string) => Promise<void>;
16
+ /** Saves the active match's local record. */
17
+ saveRecord: () => Promise<{
18
+ matchId: string;
19
+ seatToken: string;
20
+ bytes: ArrayBuffer;
21
+ }>;
22
+ /** Restores a match from record bytes; resolves with its access info. */
23
+ restoreRecord: (bytes: ArrayBuffer) => Promise<{
24
+ matchId: string;
25
+ seatToken: string;
26
+ }>;
27
+ dispose: () => void;
28
+ }
29
+ /**
30
+ * Creates the transport over a running engine worker (or a test double).
31
+ */
32
+ export declare function createWorkerTransport(port: WorkerLike): WorkerTransport;