@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.
- package/LICENSE +21 -0
- package/README.md +355 -0
- package/dist/actionable.d.ts +61 -0
- package/dist/actionable.js +91 -0
- package/dist/client.d.ts +157 -0
- package/dist/client.js +92 -0
- package/dist/connection/handshake.d.ts +30 -0
- package/dist/connection/handshake.js +62 -0
- package/dist/connection/options.d.ts +36 -0
- package/dist/connection/options.js +1 -0
- package/dist/connection/url.d.ts +55 -0
- package/dist/connection/url.js +46 -0
- package/dist/connection/wait.d.ts +22 -0
- package/dist/connection/wait.js +10 -0
- package/dist/connection.d.ts +110 -0
- package/dist/connection.js +358 -0
- package/dist/generated/index.d.ts +121 -0
- package/dist/generated/index.js +1 -0
- package/dist/generated/public-types.d.ts +2 -0
- package/dist/generated/public-types.js +1 -0
- package/dist/generated/schemas.d.ts +27 -0
- package/dist/generated/schemas.js +21264 -0
- package/dist/generated/types/abandon-match-request.d.ts +1 -0
- package/dist/generated/types/abandon-match-request.js +2 -0
- package/dist/generated/types/abandon-match-response.d.ts +1 -0
- package/dist/generated/types/abandon-match-response.js +2 -0
- package/dist/generated/types/add-lobby-ai-player-request.d.ts +1 -0
- package/dist/generated/types/add-lobby-ai-player-request.js +2 -0
- package/dist/generated/types/ai-driver-error-report-list-response.d.ts +1 -0
- package/dist/generated/types/ai-driver-error-report-list-response.js +2 -0
- package/dist/generated/types/ai-driver-error-report-response.d.ts +1 -0
- package/dist/generated/types/ai-driver-error-report-response.js +2 -0
- package/dist/generated/types/api-error-response.d.ts +1 -0
- package/dist/generated/types/api-error-response.js +2 -0
- package/dist/generated/types/card-catalog-refresh-response.d.ts +1 -0
- package/dist/generated/types/card-catalog-refresh-response.js +2 -0
- package/dist/generated/types/cards-response.d.ts +1 -0
- package/dist/generated/types/cards-response.js +2 -0
- package/dist/generated/types/client-message.d.ts +1 -0
- package/dist/generated/types/client-message.js +2 -0
- package/dist/generated/types/close-tournament-room-request.d.ts +1 -0
- package/dist/generated/types/close-tournament-room-request.js +2 -0
- package/dist/generated/types/common.d.ts +5361 -0
- package/dist/generated/types/common.js +2 -0
- package/dist/generated/types/covered-cards-response.d.ts +47 -0
- package/dist/generated/types/covered-cards-response.js +2 -0
- package/dist/generated/types/create-limited-event-request.d.ts +1 -0
- package/dist/generated/types/create-limited-event-request.js +2 -0
- package/dist/generated/types/create-lobby-request.d.ts +1 -0
- package/dist/generated/types/create-lobby-request.js +2 -0
- package/dist/generated/types/create-match-request.d.ts +1 -0
- package/dist/generated/types/create-match-request.js +2 -0
- package/dist/generated/types/create-meta-window-request.d.ts +1 -0
- package/dist/generated/types/create-meta-window-request.js +2 -0
- package/dist/generated/types/create-tournament-room-request.d.ts +1 -0
- package/dist/generated/types/create-tournament-room-request.js +2 -0
- package/dist/generated/types/create-tournament-table-request.d.ts +1 -0
- package/dist/generated/types/create-tournament-table-request.js +2 -0
- package/dist/generated/types/error-payload.d.ts +1 -0
- package/dist/generated/types/error-payload.js +2 -0
- package/dist/generated/types/format-event-request.d.ts +1 -0
- package/dist/generated/types/format-event-request.js +2 -0
- package/dist/generated/types/format-event-response.d.ts +1 -0
- package/dist/generated/types/format-event-response.js +2 -0
- package/dist/generated/types/game-command.d.ts +1 -0
- package/dist/generated/types/game-command.js +2 -0
- package/dist/generated/types/game-event.d.ts +1 -0
- package/dist/generated/types/game-event.js +2 -0
- package/dist/generated/types/game-state.d.ts +1 -0
- package/dist/generated/types/game-state.js +2 -0
- package/dist/generated/types/get-match-response.d.ts +1 -0
- package/dist/generated/types/get-match-response.js +2 -0
- package/dist/generated/types/health-response.d.ts +1 -0
- package/dist/generated/types/health-response.js +2 -0
- package/dist/generated/types/join-limited-event-request.d.ts +1 -0
- package/dist/generated/types/join-limited-event-request.js +2 -0
- package/dist/generated/types/join-lobby-request.d.ts +1 -0
- package/dist/generated/types/join-lobby-request.js +2 -0
- package/dist/generated/types/join-match-request.d.ts +1 -0
- package/dist/generated/types/join-match-request.js +2 -0
- package/dist/generated/types/join-tournament-room-request.d.ts +1 -0
- package/dist/generated/types/join-tournament-room-request.js +2 -0
- package/dist/generated/types/join-tournament-table-request.d.ts +1 -0
- package/dist/generated/types/join-tournament-table-request.js +2 -0
- package/dist/generated/types/kick-lobby-player-request.d.ts +1 -0
- package/dist/generated/types/kick-lobby-player-request.js +2 -0
- package/dist/generated/types/kick-lobby-spectator-request.d.ts +1 -0
- package/dist/generated/types/kick-lobby-spectator-request.js +2 -0
- package/dist/generated/types/leave-lobby-request.d.ts +1 -0
- package/dist/generated/types/leave-lobby-request.js +2 -0
- package/dist/generated/types/leave-match-request.d.ts +1 -0
- package/dist/generated/types/leave-match-request.js +2 -0
- package/dist/generated/types/leave-match-response.d.ts +1 -0
- package/dist/generated/types/leave-match-response.js +2 -0
- package/dist/generated/types/leave-tournament-room-request.d.ts +1 -0
- package/dist/generated/types/leave-tournament-room-request.js +2 -0
- package/dist/generated/types/limited-event-access-response.d.ts +1 -0
- package/dist/generated/types/limited-event-access-response.js +2 -0
- package/dist/generated/types/limited-event-command-request.d.ts +1 -0
- package/dist/generated/types/limited-event-command-request.js +2 -0
- package/dist/generated/types/limited-event-preflight-response.d.ts +1 -0
- package/dist/generated/types/limited-event-preflight-response.js +2 -0
- package/dist/generated/types/limited-event-response.d.ts +1 -0
- package/dist/generated/types/limited-event-response.js +2 -0
- package/dist/generated/types/list-active-ai-matches-request.d.ts +1 -0
- package/dist/generated/types/list-active-ai-matches-request.js +2 -0
- package/dist/generated/types/list-active-ai-matches-response.d.ts +1 -0
- package/dist/generated/types/list-active-ai-matches-response.js +2 -0
- package/dist/generated/types/lobby-access-response.d.ts +1 -0
- package/dist/generated/types/lobby-access-response.js +2 -0
- package/dist/generated/types/lobby-chat-request.d.ts +1 -0
- package/dist/generated/types/lobby-chat-request.js +2 -0
- package/dist/generated/types/lobby-chat-response.d.ts +1 -0
- package/dist/generated/types/lobby-chat-response.js +2 -0
- package/dist/generated/types/lobby-list-response.d.ts +1 -0
- package/dist/generated/types/lobby-list-response.js +2 -0
- package/dist/generated/types/lobby-list-server-message.d.ts +1 -0
- package/dist/generated/types/lobby-list-server-message.js +2 -0
- package/dist/generated/types/lobby-matchmaking-decision-request.d.ts +1 -0
- package/dist/generated/types/lobby-matchmaking-decision-request.js +2 -0
- package/dist/generated/types/lobby-matchmaking-request.d.ts +1 -0
- package/dist/generated/types/lobby-matchmaking-request.js +2 -0
- package/dist/generated/types/lobby-response.d.ts +1 -0
- package/dist/generated/types/lobby-response.js +2 -0
- package/dist/generated/types/lobby-server-message.d.ts +1 -0
- package/dist/generated/types/lobby-server-message.js +2 -0
- package/dist/generated/types/lobby-sync-request.d.ts +1 -0
- package/dist/generated/types/lobby-sync-request.js +2 -0
- package/dist/generated/types/match-access-response.d.ts +1 -0
- package/dist/generated/types/match-access-response.js +2 -0
- package/dist/generated/types/match-chat-lookup-response.d.ts +1 -0
- package/dist/generated/types/match-chat-lookup-response.js +2 -0
- package/dist/generated/types/match-connection-role.d.ts +1 -0
- package/dist/generated/types/match-connection-role.js +2 -0
- package/dist/generated/types/match-history-deck-stats-request.d.ts +1 -0
- package/dist/generated/types/match-history-deck-stats-request.js +2 -0
- package/dist/generated/types/match-history-deck-stats-response.d.ts +1 -0
- package/dist/generated/types/match-history-deck-stats-response.js +2 -0
- package/dist/generated/types/match-history-entry.d.ts +1 -0
- package/dist/generated/types/match-history-entry.js +2 -0
- package/dist/generated/types/match-history-list-request.d.ts +1 -0
- package/dist/generated/types/match-history-list-request.js +2 -0
- package/dist/generated/types/match-history-list-response.d.ts +1 -0
- package/dist/generated/types/match-history-list-response.js +2 -0
- package/dist/generated/types/match-history-replay-request.d.ts +1 -0
- package/dist/generated/types/match-history-replay-request.js +2 -0
- package/dist/generated/types/match-history-replay-response.d.ts +1 -0
- package/dist/generated/types/match-history-replay-response.js +2 -0
- package/dist/generated/types/match-history-restore-request.d.ts +1 -0
- package/dist/generated/types/match-history-restore-request.js +2 -0
- package/dist/generated/types/match-save-payload.d.ts +1 -0
- package/dist/generated/types/match-save-payload.js +2 -0
- package/dist/generated/types/match-spectator-access-response.d.ts +1 -0
- package/dist/generated/types/match-spectator-access-response.js +2 -0
- package/dist/generated/types/meta-window.d.ts +1 -0
- package/dist/generated/types/meta-window.js +2 -0
- package/dist/generated/types/meta-windows-response.d.ts +1 -0
- package/dist/generated/types/meta-windows-response.js +2 -0
- package/dist/generated/types/prepare-lobby-limited-ai-decks-request.d.ts +1 -0
- package/dist/generated/types/prepare-lobby-limited-ai-decks-request.js +2 -0
- package/dist/generated/types/random-lobby-matchmaking-request.d.ts +173 -0
- package/dist/generated/types/random-lobby-matchmaking-request.js +2 -0
- package/dist/generated/types/ranked-admin-status.d.ts +1 -0
- package/dist/generated/types/ranked-admin-status.js +2 -0
- package/dist/generated/types/ranked-leaderboard-entry.d.ts +1 -0
- package/dist/generated/types/ranked-leaderboard-entry.js +2 -0
- package/dist/generated/types/ranked-leaderboard-query.d.ts +1 -0
- package/dist/generated/types/ranked-leaderboard-query.js +2 -0
- package/dist/generated/types/ranked-leaderboard-response.d.ts +1 -0
- package/dist/generated/types/ranked-leaderboard-response.js +2 -0
- package/dist/generated/types/ranked-matchmaking-request.d.ts +137 -0
- package/dist/generated/types/ranked-matchmaking-request.js +2 -0
- package/dist/generated/types/ranked-matchmaking-view.d.ts +1 -0
- package/dist/generated/types/ranked-matchmaking-view.js +2 -0
- package/dist/generated/types/ranked-profile-request.d.ts +1 -0
- package/dist/generated/types/ranked-profile-request.js +2 -0
- package/dist/generated/types/ranked-profile-response.d.ts +1 -0
- package/dist/generated/types/ranked-profile-response.js +2 -0
- package/dist/generated/types/ranked-queue.d.ts +1 -0
- package/dist/generated/types/ranked-queue.js +2 -0
- package/dist/generated/types/ready-tournament-table-request.d.ts +7 -0
- package/dist/generated/types/ready-tournament-table-request.js +2 -0
- package/dist/generated/types/rematch-match-request.d.ts +1 -0
- package/dist/generated/types/rematch-match-request.js +2 -0
- package/dist/generated/types/rematch-match-response.d.ts +1 -0
- package/dist/generated/types/rematch-match-response.js +2 -0
- package/dist/generated/types/resolve-card-ids-request.d.ts +1 -0
- package/dist/generated/types/resolve-card-ids-request.js +2 -0
- package/dist/generated/types/resolve-card-ids-response.d.ts +1 -0
- package/dist/generated/types/resolve-card-ids-response.js +2 -0
- package/dist/generated/types/restore-history-response.d.ts +1 -0
- package/dist/generated/types/restore-history-response.js +2 -0
- package/dist/generated/types/restore-match-save-request.d.ts +1 -0
- package/dist/generated/types/restore-match-save-request.js +2 -0
- package/dist/generated/types/restore-match-save-response.d.ts +1 -0
- package/dist/generated/types/restore-match-save-response.js +2 -0
- package/dist/generated/types/return-lobby-match-request.d.ts +1 -0
- package/dist/generated/types/return-lobby-match-request.js +2 -0
- package/dist/generated/types/return-tournament-match-request.d.ts +1 -0
- package/dist/generated/types/return-tournament-match-request.js +2 -0
- package/dist/generated/types/save-match-request.d.ts +1 -0
- package/dist/generated/types/save-match-request.js +2 -0
- package/dist/generated/types/server-message.d.ts +1 -0
- package/dist/generated/types/server-message.js +2 -0
- package/dist/generated/types/set-ai-paused-request.d.ts +1 -0
- package/dist/generated/types/set-ai-paused-request.js +2 -0
- package/dist/generated/types/set-ai-paused-response.d.ts +1 -0
- package/dist/generated/types/set-ai-paused-response.js +2 -0
- package/dist/generated/types/set-ranked-admission-request.d.ts +1 -0
- package/dist/generated/types/set-ranked-admission-request.js +2 -0
- package/dist/generated/types/set-simulator-maintenance-request.d.ts +1 -0
- package/dist/generated/types/set-simulator-maintenance-request.js +2 -0
- package/dist/generated/types/simulator-admin-status-response.d.ts +1 -0
- package/dist/generated/types/simulator-admin-status-response.js +2 -0
- package/dist/generated/types/simulator-availability-response.d.ts +1 -0
- package/dist/generated/types/simulator-availability-response.js +2 -0
- package/dist/generated/types/simulator-report-list-response.d.ts +1 -0
- package/dist/generated/types/simulator-report-list-response.js +2 -0
- package/dist/generated/types/simulator-report-response.d.ts +1 -0
- package/dist/generated/types/simulator-report-response.js +2 -0
- package/dist/generated/types/spectate-lobby-request.d.ts +1 -0
- package/dist/generated/types/spectate-lobby-request.js +2 -0
- package/dist/generated/types/spectate-match-request.d.ts +1 -0
- package/dist/generated/types/spectate-match-request.js +2 -0
- package/dist/generated/types/start-lobby-limited-match-request.d.ts +1 -0
- package/dist/generated/types/start-lobby-limited-match-request.js +2 -0
- package/dist/generated/types/start-lobby-request.d.ts +1 -0
- package/dist/generated/types/start-lobby-request.js +2 -0
- package/dist/generated/types/start-tournament-event-request.d.ts +1 -0
- package/dist/generated/types/start-tournament-event-request.js +2 -0
- package/dist/generated/types/stats-response.d.ts +5 -0
- package/dist/generated/types/stats-response.js +2 -0
- package/dist/generated/types/submit-lobby-limited-deck-request.d.ts +1 -0
- package/dist/generated/types/submit-lobby-limited-deck-request.js +2 -0
- package/dist/generated/types/submit-match-deck-request.d.ts +1 -0
- package/dist/generated/types/submit-match-deck-request.js +2 -0
- package/dist/generated/types/submit-match-deck-response.d.ts +1 -0
- package/dist/generated/types/submit-match-deck-response.js +2 -0
- package/dist/generated/types/submit-tournament-deck-request.d.ts +1 -0
- package/dist/generated/types/submit-tournament-deck-request.js +2 -0
- package/dist/generated/types/tournament-event-command-request.d.ts +1 -0
- package/dist/generated/types/tournament-event-command-request.js +2 -0
- package/dist/generated/types/tournament-room-access-response.d.ts +1 -0
- package/dist/generated/types/tournament-room-access-response.js +2 -0
- package/dist/generated/types/tournament-room-chat-request.d.ts +1 -0
- package/dist/generated/types/tournament-room-chat-request.js +2 -0
- package/dist/generated/types/tournament-room-chat-response.d.ts +1 -0
- package/dist/generated/types/tournament-room-chat-response.js +2 -0
- package/dist/generated/types/tournament-room-list-response.d.ts +1 -0
- package/dist/generated/types/tournament-room-list-response.js +2 -0
- package/dist/generated/types/tournament-room-response.d.ts +1 -0
- package/dist/generated/types/tournament-room-response.js +2 -0
- package/dist/generated/types/tournament-room-server-message.d.ts +1 -0
- package/dist/generated/types/tournament-room-server-message.js +2 -0
- package/dist/generated/types/tournament-room-sync-request.d.ts +1 -0
- package/dist/generated/types/tournament-room-sync-request.js +2 -0
- package/dist/generated/types/undo-match-request.d.ts +1 -0
- package/dist/generated/types/undo-match-request.js +2 -0
- package/dist/generated/types/undo-match-response.d.ts +1 -0
- package/dist/generated/types/undo-match-response.js +2 -0
- package/dist/generated/types/undo-respond-match-request.d.ts +1 -0
- package/dist/generated/types/undo-respond-match-request.js +2 -0
- package/dist/generated/types/update-lobby-ai-player-request.d.ts +1 -0
- package/dist/generated/types/update-lobby-ai-player-request.js +2 -0
- package/dist/generated/types/update-lobby-player-request.d.ts +1 -0
- package/dist/generated/types/update-lobby-player-request.js +2 -0
- package/dist/generated/types/update-lobby-settings-request.d.ts +1 -0
- package/dist/generated/types/update-lobby-settings-request.js +2 -0
- package/dist/generated/types/update-tournament-room-player-request.d.ts +1 -0
- package/dist/generated/types/update-tournament-room-player-request.js +2 -0
- package/dist/generated/types/update-tournament-room-settings-request.d.ts +1 -0
- package/dist/generated/types/update-tournament-room-settings-request.js +2 -0
- package/dist/generated/types/update-tournament-table-deck-request.d.ts +123 -0
- package/dist/generated/types/update-tournament-table-deck-request.js +2 -0
- package/dist/generated/types/welcome-payload.d.ts +1 -0
- package/dist/generated/types/welcome-payload.js +2 -0
- package/dist/generated/version.d.ts +16 -0
- package/dist/generated/version.js +16 -0
- package/dist/http/abort.d.ts +57 -0
- package/dist/http/abort.js +60 -0
- package/dist/http/json.d.ts +13 -0
- package/dist/http/json.js +24 -0
- package/dist/http/options.d.ts +40 -0
- package/dist/http/options.js +1 -0
- package/dist/http/request.d.ts +64 -0
- package/dist/http/request.js +182 -0
- package/dist/http/validated-json.d.ts +9 -0
- package/dist/http/validated-json.js +14 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.js +10 -0
- package/dist/internal/abort-error.d.ts +91 -0
- package/dist/internal/abort-error.js +62 -0
- package/dist/internal/authenticated-socket-session.d.ts +63 -0
- package/dist/internal/authenticated-socket-session.js +170 -0
- package/dist/internal/emitter.d.ts +18 -0
- package/dist/internal/emitter.js +34 -0
- package/dist/internal/errors.d.ts +233 -0
- package/dist/internal/errors.js +238 -0
- package/dist/internal/limits.d.ts +13 -0
- package/dist/internal/limits.js +13 -0
- package/dist/internal/reconnect-backoff.d.ts +33 -0
- package/dist/internal/reconnect-backoff.js +25 -0
- package/dist/internal/socket-frame.d.ts +43 -0
- package/dist/internal/socket-frame.js +47 -0
- package/dist/internal/transport.d.ts +78 -0
- package/dist/internal/transport.js +18 -0
- package/dist/internal/websocket-event.d.ts +15 -0
- package/dist/internal/websocket-event.js +31 -0
- package/dist/local/assets.d.ts +96 -0
- package/dist/local/assets.js +235 -0
- package/dist/local/client.d.ts +32 -0
- package/dist/local/client.js +211 -0
- package/dist/local/engine.d.ts +79 -0
- package/dist/local/engine.js +6 -0
- package/dist/local/index.d.ts +20 -0
- package/dist/local/index.js +17 -0
- package/dist/local/offline-engine.d.ts +46 -0
- package/dist/local/offline-engine.js +74 -0
- package/dist/local/protocol.d.ts +95 -0
- package/dist/local/protocol.js +10 -0
- package/dist/local/routing.d.ts +52 -0
- package/dist/local/routing.js +193 -0
- package/dist/local/server/ai-scheduler.d.ts +31 -0
- package/dist/local/server/ai-scheduler.js +93 -0
- package/dist/local/server/http-router.d.ts +35 -0
- package/dist/local/server/http-router.js +185 -0
- package/dist/local/server/index.d.ts +16 -0
- package/dist/local/server/index.js +140 -0
- package/dist/local/server/sockets.d.ts +25 -0
- package/dist/local/server/sockets.js +141 -0
- package/dist/local/wasm-engine.d.ts +61 -0
- package/dist/local/wasm-engine.js +63 -0
- package/dist/local/worker-boot.d.ts +17 -0
- package/dist/local/worker-boot.js +76 -0
- package/dist/local/worker.d.ts +6 -0
- package/dist/local/worker.js +9 -0
- package/dist/match-session/access.d.ts +6 -0
- package/dist/match-session/access.js +8 -0
- package/dist/match-session/controller.d.ts +63 -0
- package/dist/match-session/controller.js +513 -0
- package/dist/match-session/errors.d.ts +3 -0
- package/dist/match-session/errors.js +34 -0
- package/dist/match-session/methods.d.ts +433 -0
- package/dist/match-session/methods.js +1 -0
- package/dist/match-session/session-state.d.ts +235 -0
- package/dist/match-session/session-state.js +1 -0
- package/dist/match-session/types.d.ts +56 -0
- package/dist/match-session/types.js +1 -0
- package/dist/match-session.d.ts +3 -0
- package/dist/match-session.js +1 -0
- package/dist/messages.d.ts +195 -0
- package/dist/messages.js +240 -0
- package/dist/resources/admin.d.ts +63 -0
- package/dist/resources/admin.js +75 -0
- package/dist/resources/card-deck-json.d.ts +11 -0
- package/dist/resources/card-deck-json.js +164 -0
- package/dist/resources/card-resolution.d.ts +9 -0
- package/dist/resources/card-resolution.js +21 -0
- package/dist/resources/card-resource.d.ts +157 -0
- package/dist/resources/card-resource.js +28 -0
- package/dist/resources/card-types.d.ts +203 -0
- package/dist/resources/card-types.js +1 -0
- package/dist/resources/cards.d.ts +3 -0
- package/dist/resources/cards.js +1 -0
- package/dist/resources/limited-event-types.d.ts +252 -0
- package/dist/resources/limited-event-types.js +1 -0
- package/dist/resources/limited-events.d.ts +7 -0
- package/dist/resources/limited-events.js +49 -0
- package/dist/resources/lobbies.d.ts +53 -0
- package/dist/resources/lobbies.js +50 -0
- package/dist/resources/lobby-list-session.d.ts +13 -0
- package/dist/resources/lobby-list-session.js +198 -0
- package/dist/resources/lobby-session.d.ts +9 -0
- package/dist/resources/lobby-session.js +59 -0
- package/dist/resources/lobby-types.d.ts +357 -0
- package/dist/resources/lobby-types.js +1 -0
- package/dist/resources/match-history.d.ts +49 -0
- package/dist/resources/match-history.js +34 -0
- package/dist/resources/match-types.d.ts +448 -0
- package/dist/resources/match-types.js +1 -0
- package/dist/resources/matches.d.ts +16 -0
- package/dist/resources/matches.js +109 -0
- package/dist/resources/ranked.d.ts +24 -0
- package/dist/resources/ranked.js +47 -0
- package/dist/resources/session.d.ts +62 -0
- package/dist/resources/session.js +26 -0
- package/dist/resources/system.d.ts +51 -0
- package/dist/resources/system.js +9 -0
- package/dist/resources/tournament-room-session.d.ts +9 -0
- package/dist/resources/tournament-room-session.js +53 -0
- package/dist/resources/tournament-room-types.d.ts +44 -0
- package/dist/resources/tournament-room-types.js +1 -0
- package/dist/resources/tournament-rooms.d.ts +33 -0
- package/dist/resources/tournament-rooms.js +33 -0
- package/dist/session.d.ts +56 -0
- package/dist/session.js +1 -0
- package/dist/types.d.ts +73 -0
- package/dist/types.js +27 -0
- package/dist/validators/ajv.d.ts +51 -0
- package/dist/validators/ajv.js +121 -0
- package/dist/validators/discriminants.d.ts +36 -0
- package/dist/validators/discriminants.js +89 -0
- package/dist/validators/validator.d.ts +73 -0
- package/dist/validators/validator.js +26 -0
- package/dist/validators/warm-up.d.ts +25 -0
- package/dist/validators/warm-up.js +59 -0
- package/dist/validators.d.ts +173 -0
- package/dist/validators.js +85 -0
- package/package.json +88 -0
- package/schema/abandon-match-request.schema.json +15 -0
- package/schema/abandon-match-response.schema.json +15 -0
- package/schema/add-lobby-ai-player-request.schema.json +53 -0
- package/schema/api-error-response.schema.json +13 -0
- package/schema/card-catalog-refresh-response.schema.json +31 -0
- package/schema/cards-response.schema.json +17 -0
- package/schema/client-message.schema.json +203 -0
- package/schema/close-tournament-room-request.schema.json +18 -0
- package/schema/common.schema.json +14129 -0
- package/schema/create-limited-event-request.schema.json +60 -0
- package/schema/create-lobby-request.schema.json +67 -0
- package/schema/create-match-request.schema.json +124 -0
- package/schema/create-meta-window-request.schema.json +27 -0
- package/schema/create-tournament-room-request.schema.json +104 -0
- package/schema/create-tournament-table-request.schema.json +14 -0
- package/schema/error-payload.schema.json +34 -0
- package/schema/format-event-request.schema.json +20 -0
- package/schema/format-event-response.schema.json +15 -0
- package/schema/game-command.schema.json +775 -0
- package/schema/game-event.schema.json +2012 -0
- package/schema/game-state.schema.json +273 -0
- package/schema/get-match-response.schema.json +13 -0
- package/schema/health-response.schema.json +13 -0
- package/schema/join-limited-event-request.schema.json +6 -0
- package/schema/join-lobby-request.schema.json +40 -0
- package/schema/join-match-request.schema.json +79 -0
- package/schema/join-tournament-room-request.schema.json +39 -0
- package/schema/join-tournament-table-request.schema.json +14 -0
- package/schema/kick-lobby-player-request.schema.json +13 -0
- package/schema/kick-lobby-spectator-request.schema.json +14 -0
- package/schema/leave-lobby-request.schema.json +13 -0
- package/schema/leave-match-request.schema.json +15 -0
- package/schema/leave-match-response.schema.json +15 -0
- package/schema/leave-tournament-room-request.schema.json +14 -0
- package/schema/limited-event-access-response.schema.json +34 -0
- package/schema/limited-event-command-request.schema.json +20 -0
- package/schema/limited-event-preflight-response.schema.json +25 -0
- package/schema/limited-event-response.schema.json +15 -0
- package/schema/list-active-ai-matches-request.schema.json +23 -0
- package/schema/list-active-ai-matches-response.schema.json +17 -0
- package/schema/lobby-access-response.schema.json +31 -0
- package/schema/lobby-chat-request.schema.json +17 -0
- package/schema/lobby-chat-response.schema.json +17 -0
- package/schema/lobby-list-response.schema.json +16 -0
- package/schema/lobby-list-server-message.schema.json +49 -0
- package/schema/lobby-matchmaking-decision-request.schema.json +13 -0
- package/schema/lobby-matchmaking-request.schema.json +80 -0
- package/schema/lobby-response.schema.json +13 -0
- package/schema/lobby-server-message.schema.json +155 -0
- package/schema/lobby-sync-request.schema.json +13 -0
- package/schema/manifest.json +124 -0
- package/schema/match-access-response.schema.json +32 -0
- package/schema/match-chat-lookup-response.schema.json +34 -0
- package/schema/match-connection-role.schema.json +9 -0
- package/schema/match-history-deck-stats-request.schema.json +26 -0
- package/schema/match-history-deck-stats-response.schema.json +17 -0
- package/schema/match-history-entry.schema.json +78 -0
- package/schema/match-history-list-request.schema.json +48 -0
- package/schema/match-history-list-response.schema.json +25 -0
- package/schema/match-history-replay-request.schema.json +17 -0
- package/schema/match-history-replay-response.schema.json +14 -0
- package/schema/match-history-restore-request.schema.json +23 -0
- package/schema/match-save-payload.schema.json +71 -0
- package/schema/match-spectator-access-response.schema.json +22 -0
- package/schema/meta-window.schema.json +37 -0
- package/schema/meta-windows-response.schema.json +24 -0
- package/schema/prepare-lobby-limited-ai-decks-request.schema.json +14 -0
- package/schema/ranked-admin-status.schema.json +43 -0
- package/schema/ranked-leaderboard-entry.schema.json +61 -0
- package/schema/ranked-leaderboard-query.schema.json +34 -0
- package/schema/ranked-leaderboard-response.schema.json +23 -0
- package/schema/ranked-matchmaking-view.schema.json +15 -0
- package/schema/ranked-profile-request.schema.json +21 -0
- package/schema/ranked-profile-response.schema.json +59 -0
- package/schema/ranked-queue.schema.json +12 -0
- package/schema/rematch-match-request.schema.json +20 -0
- package/schema/rematch-match-response.schema.json +61 -0
- package/schema/resolve-card-ids-request.schema.json +17 -0
- package/schema/resolve-card-ids-response.schema.json +16 -0
- package/schema/restore-history-response.schema.json +15 -0
- package/schema/restore-match-save-request.schema.json +20 -0
- package/schema/restore-match-save-response.schema.json +29 -0
- package/schema/return-lobby-match-request.schema.json +13 -0
- package/schema/return-tournament-match-request.schema.json +14 -0
- package/schema/route-manifest.json +1014 -0
- package/schema/save-match-request.schema.json +15 -0
- package/schema/server-message.schema.json +192 -0
- package/schema/set-ai-paused-request.schema.json +19 -0
- package/schema/set-ai-paused-response.schema.json +18 -0
- package/schema/set-ranked-admission-request.schema.json +15 -0
- package/schema/set-simulator-maintenance-request.schema.json +20 -0
- package/schema/simulator-admin-status-response.schema.json +37 -0
- package/schema/simulator-availability-response.schema.json +27 -0
- package/schema/simulator-report-list-response.schema.json +23 -0
- package/schema/simulator-report-response.schema.json +77 -0
- package/schema/spectate-lobby-request.schema.json +32 -0
- package/schema/spectate-match-request.schema.json +32 -0
- package/schema/start-lobby-limited-match-request.schema.json +13 -0
- package/schema/start-lobby-request.schema.json +13 -0
- package/schema/start-tournament-event-request.schema.json +14 -0
- package/schema/submit-lobby-limited-deck-request.schema.json +33 -0
- package/schema/submit-match-deck-request.schema.json +45 -0
- package/schema/submit-match-deck-response.schema.json +14 -0
- package/schema/submit-tournament-deck-request.schema.json +34 -0
- package/schema/tournament-event-command-request.schema.json +18 -0
- package/schema/tournament-room-access-response.schema.json +32 -0
- package/schema/tournament-room-chat-request.schema.json +18 -0
- package/schema/tournament-room-chat-response.schema.json +18 -0
- package/schema/tournament-room-list-response.schema.json +17 -0
- package/schema/tournament-room-response.schema.json +14 -0
- package/schema/tournament-room-server-message.schema.json +127 -0
- package/schema/tournament-room-sync-request.schema.json +14 -0
- package/schema/undo-match-request.schema.json +14 -0
- package/schema/undo-match-response.schema.json +14 -0
- package/schema/undo-respond-match-request.schema.json +19 -0
- package/schema/update-lobby-ai-player-request.schema.json +65 -0
- package/schema/update-lobby-player-request.schema.json +81 -0
- package/schema/update-lobby-settings-request.schema.json +70 -0
- package/schema/update-tournament-room-player-request.schema.json +45 -0
- package/schema/update-tournament-room-settings-request.schema.json +33 -0
- package/schema/welcome-payload.schema.json +38 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Function called when one typed event fires.
|
|
3
|
+
*/
|
|
4
|
+
export type EventListener<TValue> = (value: TValue) => void;
|
|
5
|
+
/**
|
|
6
|
+
* Small typed event emitter used by the SDK session layer.
|
|
7
|
+
*/
|
|
8
|
+
export declare class TypedEmitter<TEvents extends object> {
|
|
9
|
+
#private;
|
|
10
|
+
/**
|
|
11
|
+
* Registers one listener and returns its unsubscribe function.
|
|
12
|
+
*/
|
|
13
|
+
on<TKey extends keyof TEvents>(event: TKey, listener: EventListener<TEvents[TKey]>): () => void;
|
|
14
|
+
/**
|
|
15
|
+
* Emits one event to all current listeners.
|
|
16
|
+
*/
|
|
17
|
+
emit<TKey extends keyof TEvents>(event: TKey, value: TEvents[TKey]): void;
|
|
18
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Small typed event emitter used by the SDK session layer.
|
|
3
|
+
*/
|
|
4
|
+
export class TypedEmitter {
|
|
5
|
+
#listeners = new Map();
|
|
6
|
+
/**
|
|
7
|
+
* Registers one listener and returns its unsubscribe function.
|
|
8
|
+
*/
|
|
9
|
+
on(event, listener) {
|
|
10
|
+
const eventName = event;
|
|
11
|
+
const listeners = this.#listeners.get(eventName) ?? new Set();
|
|
12
|
+
listeners.add(listener);
|
|
13
|
+
this.#listeners.set(eventName, listeners);
|
|
14
|
+
return () => {
|
|
15
|
+
listeners.delete(listener);
|
|
16
|
+
if (listeners.size === 0) {
|
|
17
|
+
this.#listeners.delete(eventName);
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Emits one event to all current listeners.
|
|
23
|
+
*/
|
|
24
|
+
emit(event, value) {
|
|
25
|
+
const listeners = this.#listeners.get(event);
|
|
26
|
+
if (listeners == null) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
for (const listener of listeners) {
|
|
30
|
+
;
|
|
31
|
+
listener(value);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context captured for one non-2xx HTTP response.
|
|
3
|
+
*
|
|
4
|
+
* These fields make HTTP failures safe to render or log without parsing the
|
|
5
|
+
* original `Response` object again.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* import type { EngineHttpErrorOptions } from '@my-swu/simulator-client'
|
|
10
|
+
*
|
|
11
|
+
* const notFoundOptions: EngineHttpErrorOptions = {
|
|
12
|
+
* status: 404,
|
|
13
|
+
* code: 'match_not_found',
|
|
14
|
+
* method: 'GET',
|
|
15
|
+
* url: 'http://127.0.0.1:4000/api/matches/missing',
|
|
16
|
+
* }
|
|
17
|
+
*
|
|
18
|
+
* console.log(notFoundOptions.status)
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* @see https://simulator-sdk.my-swu.com/guide/errors
|
|
22
|
+
*/
|
|
23
|
+
export interface EngineHttpErrorOptions {
|
|
24
|
+
/**
|
|
25
|
+
* Engine error code when the response body matched `api-error-response`.
|
|
26
|
+
*/
|
|
27
|
+
code?: string | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* HTTP method used for the failed request.
|
|
30
|
+
*/
|
|
31
|
+
method?: string | undefined;
|
|
32
|
+
/**
|
|
33
|
+
* Parsed JSON payload when an error body was JSON but not a valid engine error.
|
|
34
|
+
*/
|
|
35
|
+
payload?: unknown;
|
|
36
|
+
/**
|
|
37
|
+
* Raw response text when the server returned an error body.
|
|
38
|
+
*/
|
|
39
|
+
responseText?: string | undefined;
|
|
40
|
+
/**
|
|
41
|
+
* HTTP response status.
|
|
42
|
+
*/
|
|
43
|
+
status: number;
|
|
44
|
+
/**
|
|
45
|
+
* Fully resolved request URL.
|
|
46
|
+
*/
|
|
47
|
+
url?: string | undefined;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Close code the simulator server uses to refuse a socket after completing
|
|
51
|
+
* the WebSocket upgrade.
|
|
52
|
+
*
|
|
53
|
+
* Browsers cannot read the HTTP status or body of a failed upgrade, so the
|
|
54
|
+
* server accepts user-relevant refusals (unknown match, dead token, full,
|
|
55
|
+
* maintenance, …) and closes immediately with this code; the close reason
|
|
56
|
+
* carries the engine error code (e.g. `match_not_found`) for classification.
|
|
57
|
+
*/
|
|
58
|
+
export declare const SIMULATOR_REJECTION_CLOSE_CODE = 4000;
|
|
59
|
+
/**
|
|
60
|
+
* Why a simulator socket connection failed.
|
|
61
|
+
*
|
|
62
|
+
* - `unreachable`: transport-level failure (offline, refused, DNS, reset).
|
|
63
|
+
* - `timeout`: the handshake never completed within its deadline.
|
|
64
|
+
* - `closed-before-welcome`: the server closed cleanly mid-handshake.
|
|
65
|
+
* - `rejected`: the server refused the connection with a machine-readable
|
|
66
|
+
* close frame; see [`SimulatorSocketError.serverCode`](#).
|
|
67
|
+
*/
|
|
68
|
+
export type SimulatorSocketErrorKind = 'unreachable' | 'timeout' | 'closed-before-welcome' | 'rejected';
|
|
69
|
+
/** Close-frame facts extracted from a browser-style close event. */
|
|
70
|
+
export interface WebSocketCloseInfo {
|
|
71
|
+
/** Close status code when the transport exposed one. */
|
|
72
|
+
closeCode?: number | undefined;
|
|
73
|
+
/** UTF-8 close reason when the transport exposed one. */
|
|
74
|
+
reason?: string | undefined;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Error thrown when a simulator socket connection fails.
|
|
78
|
+
*
|
|
79
|
+
* The browser WebSocket `error` event is an opaque `Event` (historically
|
|
80
|
+
* stringified as `"[object Event]"`), so the SDK classifies failures from
|
|
81
|
+
* what the transport CAN expose: the close code and reason. A close with
|
|
82
|
+
* [`SIMULATOR_REJECTION_CLOSE_CODE`](#) means the server deliberately refused
|
|
83
|
+
* the socket and named the engine error in the reason.
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```ts
|
|
87
|
+
* import { createSimulatorClient, SimulatorSocketError } from '@my-swu/simulator-client'
|
|
88
|
+
*
|
|
89
|
+
* const simulatorClient = createSimulatorClient({ baseUrl: 'http://127.0.0.1:4000' })
|
|
90
|
+
* const matchSession = simulatorClient.session.create({
|
|
91
|
+
* matchId: 'match_123',
|
|
92
|
+
* seatToken: 'seat_token_123',
|
|
93
|
+
* })
|
|
94
|
+
*
|
|
95
|
+
* try {
|
|
96
|
+
* await matchSession.connect()
|
|
97
|
+
* } catch (error) {
|
|
98
|
+
* if (error instanceof SimulatorSocketError && error.serverCode) {
|
|
99
|
+
* console.log('refused with', error.serverCode)
|
|
100
|
+
* }
|
|
101
|
+
* }
|
|
102
|
+
* ```
|
|
103
|
+
*
|
|
104
|
+
* @see https://simulator-sdk.my-swu.com/guide/errors
|
|
105
|
+
*/
|
|
106
|
+
export declare class SimulatorSocketError extends Error {
|
|
107
|
+
/**
|
|
108
|
+
* Stable classification of the connection failure.
|
|
109
|
+
*/
|
|
110
|
+
readonly kind: SimulatorSocketErrorKind;
|
|
111
|
+
/**
|
|
112
|
+
* WebSocket close status code when the transport exposed one.
|
|
113
|
+
*/
|
|
114
|
+
readonly closeCode: number | undefined;
|
|
115
|
+
/**
|
|
116
|
+
* WebSocket close reason when the transport exposed one.
|
|
117
|
+
*/
|
|
118
|
+
readonly reason: string | undefined;
|
|
119
|
+
/** Creates one classified socket error with its close-frame context. */
|
|
120
|
+
constructor(kind: SimulatorSocketErrorKind, message: string, options?: WebSocketCloseInfo);
|
|
121
|
+
/**
|
|
122
|
+
* Engine error code carried by a rejection close frame, when any.
|
|
123
|
+
*
|
|
124
|
+
* Only close frames using [`SIMULATOR_REJECTION_CLOSE_CODE`](#) carry a
|
|
125
|
+
* server-authored code; every other failure yields `undefined`.
|
|
126
|
+
*/
|
|
127
|
+
get serverCode(): string | undefined;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Classify one failed connection from its close frame.
|
|
131
|
+
*
|
|
132
|
+
* Transport `error` events carry no diagnostics, so classification leans on
|
|
133
|
+
* the close frame that always follows: code 4000 is a deliberate server
|
|
134
|
+
* refusal, 1006 (or a seen error event) is an unreachable transport, and
|
|
135
|
+
* anything else closed before the handshake finished.
|
|
136
|
+
*/
|
|
137
|
+
export declare function simulatorSocketErrorFromClose(info: WebSocketCloseInfo, sawErrorEvent: boolean): SimulatorSocketError;
|
|
138
|
+
/** Stable payload code pushed for each classified socket failure kind. */
|
|
139
|
+
export declare function socketPayloadCodeForKind(kind: SimulatorSocketErrorKind): string;
|
|
140
|
+
/**
|
|
141
|
+
* Default `{ code, message }` payload for authenticated room sockets.
|
|
142
|
+
*
|
|
143
|
+
* Lobby-like sessions push these when their transport fails. Classification
|
|
144
|
+
* runs through `simulatorSocketErrorFromClose` so every close shape maps to
|
|
145
|
+
* the same kind — and payload code — a thrown socket error would carry; a
|
|
146
|
+
* rejection close frame keeps the engine error code so clients can map it
|
|
147
|
+
* exactly like the equivalent HTTP error.
|
|
148
|
+
*/
|
|
149
|
+
export declare function simulatorSocketErrorPayload(info: WebSocketCloseInfo): {
|
|
150
|
+
code: string;
|
|
151
|
+
message: string;
|
|
152
|
+
};
|
|
153
|
+
/**
|
|
154
|
+
* Error thrown when a simulator payload does not match the generated schema.
|
|
155
|
+
*
|
|
156
|
+
* A client built with `validate` throws this when response, request-body or
|
|
157
|
+
* socket payload validation fails; the default client never validates those.
|
|
158
|
+
* It is also thrown by direct `parseSchema()` calls, whatever the client does.
|
|
159
|
+
*
|
|
160
|
+
* @example
|
|
161
|
+
* ```ts
|
|
162
|
+
* import { SdkValidationError } from '@my-swu/simulator-client'
|
|
163
|
+
*
|
|
164
|
+
* const validationError = new SdkValidationError(
|
|
165
|
+
* 'payload does not match schema health-response',
|
|
166
|
+
* 'health-response',
|
|
167
|
+
* ['/status must be equal to constant'],
|
|
168
|
+
* )
|
|
169
|
+
*
|
|
170
|
+
* console.log(validationError.schemaName)
|
|
171
|
+
* ```
|
|
172
|
+
*
|
|
173
|
+
* @see https://simulator-sdk.my-swu.com/guide/errors
|
|
174
|
+
*/
|
|
175
|
+
export declare class SdkValidationError extends Error {
|
|
176
|
+
readonly schemaName: string;
|
|
177
|
+
readonly details: readonly string[];
|
|
178
|
+
/**
|
|
179
|
+
* Creates one validation error with schema name and readable detail strings.
|
|
180
|
+
*/
|
|
181
|
+
constructor(message: string, schemaName: string, details: readonly string[]);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Error thrown for non-2xx HTTP responses from the simulator server.
|
|
185
|
+
*
|
|
186
|
+
* When the response body matches the API error schema, `code` contains the
|
|
187
|
+
* server error code. Malformed JSON or non-schema error bodies are preserved in
|
|
188
|
+
* `payload` or `responseText`.
|
|
189
|
+
*
|
|
190
|
+
* @example
|
|
191
|
+
* ```ts
|
|
192
|
+
* import { EngineHttpError } from '@my-swu/simulator-client'
|
|
193
|
+
*
|
|
194
|
+
* const httpError = new EngineHttpError('match not found', {
|
|
195
|
+
* status: 404,
|
|
196
|
+
* code: 'match_not_found',
|
|
197
|
+
* method: 'GET',
|
|
198
|
+
* url: 'http://127.0.0.1:4000/api/matches/missing',
|
|
199
|
+
* })
|
|
200
|
+
*
|
|
201
|
+
* console.log(httpError.status, httpError.code)
|
|
202
|
+
* ```
|
|
203
|
+
*
|
|
204
|
+
* @see https://simulator-sdk.my-swu.com/guide/errors
|
|
205
|
+
*/
|
|
206
|
+
export declare class EngineHttpError extends Error {
|
|
207
|
+
/**
|
|
208
|
+
* Engine error code when available.
|
|
209
|
+
*/
|
|
210
|
+
readonly code: string | undefined;
|
|
211
|
+
/**
|
|
212
|
+
* HTTP method used for the failed request.
|
|
213
|
+
*/
|
|
214
|
+
readonly method: string | undefined;
|
|
215
|
+
/**
|
|
216
|
+
* Parsed malformed JSON payload when available.
|
|
217
|
+
*/
|
|
218
|
+
readonly payload: unknown;
|
|
219
|
+
/**
|
|
220
|
+
* Raw response text when available.
|
|
221
|
+
*/
|
|
222
|
+
readonly responseText: string | undefined;
|
|
223
|
+
/**
|
|
224
|
+
* HTTP response status.
|
|
225
|
+
*/
|
|
226
|
+
readonly status: number;
|
|
227
|
+
/**
|
|
228
|
+
* Fully resolved request URL.
|
|
229
|
+
*/
|
|
230
|
+
readonly url: string | undefined;
|
|
231
|
+
/** Creates one HTTP error with normalized response context. */
|
|
232
|
+
constructor(message: string, options: EngineHttpErrorOptions);
|
|
233
|
+
}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Close code the simulator server uses to refuse a socket after completing
|
|
3
|
+
* the WebSocket upgrade.
|
|
4
|
+
*
|
|
5
|
+
* Browsers cannot read the HTTP status or body of a failed upgrade, so the
|
|
6
|
+
* server accepts user-relevant refusals (unknown match, dead token, full,
|
|
7
|
+
* maintenance, …) and closes immediately with this code; the close reason
|
|
8
|
+
* carries the engine error code (e.g. `match_not_found`) for classification.
|
|
9
|
+
*/
|
|
10
|
+
export const SIMULATOR_REJECTION_CLOSE_CODE = 4000;
|
|
11
|
+
/**
|
|
12
|
+
* Error thrown when a simulator socket connection fails.
|
|
13
|
+
*
|
|
14
|
+
* The browser WebSocket `error` event is an opaque `Event` (historically
|
|
15
|
+
* stringified as `"[object Event]"`), so the SDK classifies failures from
|
|
16
|
+
* what the transport CAN expose: the close code and reason. A close with
|
|
17
|
+
* [`SIMULATOR_REJECTION_CLOSE_CODE`](#) means the server deliberately refused
|
|
18
|
+
* the socket and named the engine error in the reason.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* import { createSimulatorClient, SimulatorSocketError } from '@my-swu/simulator-client'
|
|
23
|
+
*
|
|
24
|
+
* const simulatorClient = createSimulatorClient({ baseUrl: 'http://127.0.0.1:4000' })
|
|
25
|
+
* const matchSession = simulatorClient.session.create({
|
|
26
|
+
* matchId: 'match_123',
|
|
27
|
+
* seatToken: 'seat_token_123',
|
|
28
|
+
* })
|
|
29
|
+
*
|
|
30
|
+
* try {
|
|
31
|
+
* await matchSession.connect()
|
|
32
|
+
* } catch (error) {
|
|
33
|
+
* if (error instanceof SimulatorSocketError && error.serverCode) {
|
|
34
|
+
* console.log('refused with', error.serverCode)
|
|
35
|
+
* }
|
|
36
|
+
* }
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* @see https://simulator-sdk.my-swu.com/guide/errors
|
|
40
|
+
*/
|
|
41
|
+
export class SimulatorSocketError extends Error {
|
|
42
|
+
/**
|
|
43
|
+
* Stable classification of the connection failure.
|
|
44
|
+
*/
|
|
45
|
+
kind;
|
|
46
|
+
/**
|
|
47
|
+
* WebSocket close status code when the transport exposed one.
|
|
48
|
+
*/
|
|
49
|
+
closeCode;
|
|
50
|
+
/**
|
|
51
|
+
* WebSocket close reason when the transport exposed one.
|
|
52
|
+
*/
|
|
53
|
+
reason;
|
|
54
|
+
/** Creates one classified socket error with its close-frame context. */
|
|
55
|
+
constructor(kind, message, options = {}) {
|
|
56
|
+
super(message);
|
|
57
|
+
this.name = 'SimulatorSocketError';
|
|
58
|
+
this.kind = kind;
|
|
59
|
+
this.closeCode = options.closeCode;
|
|
60
|
+
this.reason = options.reason;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Engine error code carried by a rejection close frame, when any.
|
|
64
|
+
*
|
|
65
|
+
* Only close frames using [`SIMULATOR_REJECTION_CLOSE_CODE`](#) carry a
|
|
66
|
+
* server-authored code; every other failure yields `undefined`.
|
|
67
|
+
*/
|
|
68
|
+
get serverCode() {
|
|
69
|
+
if (this.closeCode !== SIMULATOR_REJECTION_CLOSE_CODE) {
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
const reason = this.reason?.trim();
|
|
73
|
+
return reason ? reason : undefined;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/** Human-readable developer message for one socket failure kind. */
|
|
77
|
+
function simulatorSocketErrorMessage(kind, info) {
|
|
78
|
+
switch (kind) {
|
|
79
|
+
case 'unreachable':
|
|
80
|
+
return 'socket error: could not reach the simulator server';
|
|
81
|
+
case 'timeout':
|
|
82
|
+
return 'socket handshake timed out';
|
|
83
|
+
case 'closed-before-welcome':
|
|
84
|
+
return 'socket closed before initial handshake completed';
|
|
85
|
+
case 'rejected':
|
|
86
|
+
return info.reason
|
|
87
|
+
? `socket rejected by the simulator server: ${info.reason}`
|
|
88
|
+
: 'socket rejected by the simulator server';
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Classify one failed connection from its close frame.
|
|
93
|
+
*
|
|
94
|
+
* Transport `error` events carry no diagnostics, so classification leans on
|
|
95
|
+
* the close frame that always follows: code 4000 is a deliberate server
|
|
96
|
+
* refusal, 1006 (or a seen error event) is an unreachable transport, and
|
|
97
|
+
* anything else closed before the handshake finished.
|
|
98
|
+
*/
|
|
99
|
+
export function simulatorSocketErrorFromClose(info, sawErrorEvent) {
|
|
100
|
+
let kind;
|
|
101
|
+
if (info.closeCode === SIMULATOR_REJECTION_CLOSE_CODE) {
|
|
102
|
+
kind = 'rejected';
|
|
103
|
+
}
|
|
104
|
+
else if (sawErrorEvent || info.closeCode === 1006) {
|
|
105
|
+
kind = 'unreachable';
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
kind = 'closed-before-welcome';
|
|
109
|
+
}
|
|
110
|
+
return new SimulatorSocketError(kind, simulatorSocketErrorMessage(kind, info), info);
|
|
111
|
+
}
|
|
112
|
+
/** Stable payload code pushed for each classified socket failure kind. */
|
|
113
|
+
export function socketPayloadCodeForKind(kind) {
|
|
114
|
+
switch (kind) {
|
|
115
|
+
case 'closed-before-welcome':
|
|
116
|
+
return 'sdk_socket_closed';
|
|
117
|
+
case 'rejected':
|
|
118
|
+
return 'sdk_socket_rejected';
|
|
119
|
+
case 'timeout':
|
|
120
|
+
return 'sdk_socket_timeout';
|
|
121
|
+
case 'unreachable':
|
|
122
|
+
return 'sdk_socket_unreachable';
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Default `{ code, message }` payload for authenticated room sockets.
|
|
127
|
+
*
|
|
128
|
+
* Lobby-like sessions push these when their transport fails. Classification
|
|
129
|
+
* runs through `simulatorSocketErrorFromClose` so every close shape maps to
|
|
130
|
+
* the same kind — and payload code — a thrown socket error would carry; a
|
|
131
|
+
* rejection close frame keeps the engine error code so clients can map it
|
|
132
|
+
* exactly like the equivalent HTTP error.
|
|
133
|
+
*/
|
|
134
|
+
export function simulatorSocketErrorPayload(info) {
|
|
135
|
+
// A missing close code means the payload comes from a transport `error`
|
|
136
|
+
// event, which never carries close facts.
|
|
137
|
+
const sawErrorEvent = info.closeCode === undefined;
|
|
138
|
+
const error = simulatorSocketErrorFromClose(info, sawErrorEvent);
|
|
139
|
+
return {
|
|
140
|
+
code: error.serverCode ?? socketPayloadCodeForKind(error.kind),
|
|
141
|
+
message: error.message,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Error thrown when a simulator payload does not match the generated schema.
|
|
146
|
+
*
|
|
147
|
+
* A client built with `validate` throws this when response, request-body or
|
|
148
|
+
* socket payload validation fails; the default client never validates those.
|
|
149
|
+
* It is also thrown by direct `parseSchema()` calls, whatever the client does.
|
|
150
|
+
*
|
|
151
|
+
* @example
|
|
152
|
+
* ```ts
|
|
153
|
+
* import { SdkValidationError } from '@my-swu/simulator-client'
|
|
154
|
+
*
|
|
155
|
+
* const validationError = new SdkValidationError(
|
|
156
|
+
* 'payload does not match schema health-response',
|
|
157
|
+
* 'health-response',
|
|
158
|
+
* ['/status must be equal to constant'],
|
|
159
|
+
* )
|
|
160
|
+
*
|
|
161
|
+
* console.log(validationError.schemaName)
|
|
162
|
+
* ```
|
|
163
|
+
*
|
|
164
|
+
* @see https://simulator-sdk.my-swu.com/guide/errors
|
|
165
|
+
*/
|
|
166
|
+
export class SdkValidationError extends Error {
|
|
167
|
+
schemaName;
|
|
168
|
+
details;
|
|
169
|
+
/**
|
|
170
|
+
* Creates one validation error with schema name and readable detail strings.
|
|
171
|
+
*/
|
|
172
|
+
constructor(message, schemaName, details) {
|
|
173
|
+
super(message);
|
|
174
|
+
this.schemaName = schemaName;
|
|
175
|
+
this.details = details;
|
|
176
|
+
this.name = 'SdkValidationError';
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Error thrown for non-2xx HTTP responses from the simulator server.
|
|
181
|
+
*
|
|
182
|
+
* When the response body matches the API error schema, `code` contains the
|
|
183
|
+
* server error code. Malformed JSON or non-schema error bodies are preserved in
|
|
184
|
+
* `payload` or `responseText`.
|
|
185
|
+
*
|
|
186
|
+
* @example
|
|
187
|
+
* ```ts
|
|
188
|
+
* import { EngineHttpError } from '@my-swu/simulator-client'
|
|
189
|
+
*
|
|
190
|
+
* const httpError = new EngineHttpError('match not found', {
|
|
191
|
+
* status: 404,
|
|
192
|
+
* code: 'match_not_found',
|
|
193
|
+
* method: 'GET',
|
|
194
|
+
* url: 'http://127.0.0.1:4000/api/matches/missing',
|
|
195
|
+
* })
|
|
196
|
+
*
|
|
197
|
+
* console.log(httpError.status, httpError.code)
|
|
198
|
+
* ```
|
|
199
|
+
*
|
|
200
|
+
* @see https://simulator-sdk.my-swu.com/guide/errors
|
|
201
|
+
*/
|
|
202
|
+
export class EngineHttpError extends Error {
|
|
203
|
+
/**
|
|
204
|
+
* Engine error code when available.
|
|
205
|
+
*/
|
|
206
|
+
code;
|
|
207
|
+
/**
|
|
208
|
+
* HTTP method used for the failed request.
|
|
209
|
+
*/
|
|
210
|
+
method;
|
|
211
|
+
/**
|
|
212
|
+
* Parsed malformed JSON payload when available.
|
|
213
|
+
*/
|
|
214
|
+
payload;
|
|
215
|
+
/**
|
|
216
|
+
* Raw response text when available.
|
|
217
|
+
*/
|
|
218
|
+
responseText;
|
|
219
|
+
/**
|
|
220
|
+
* HTTP response status.
|
|
221
|
+
*/
|
|
222
|
+
status;
|
|
223
|
+
/**
|
|
224
|
+
* Fully resolved request URL.
|
|
225
|
+
*/
|
|
226
|
+
url;
|
|
227
|
+
/** Creates one HTTP error with normalized response context. */
|
|
228
|
+
constructor(message, options) {
|
|
229
|
+
super(message);
|
|
230
|
+
this.name = 'EngineHttpError';
|
|
231
|
+
this.status = options.status;
|
|
232
|
+
this.code = options.code;
|
|
233
|
+
this.method = options.method;
|
|
234
|
+
this.payload = options.payload;
|
|
235
|
+
this.responseText = options.responseText;
|
|
236
|
+
this.url = options.url;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retention caps shared by the SDK's in-memory feeds.
|
|
3
|
+
*
|
|
4
|
+
* Every buffer fed by the network is bounded: a flapping connection or a long
|
|
5
|
+
* match must not grow an array without limit, and the copy-on-append pattern
|
|
6
|
+
* these feeds use is O(n²) once the array is unbounded. The caps live here so
|
|
7
|
+
* the low-level connection and the higher-level session agree on one number
|
|
8
|
+
* instead of drifting apart.
|
|
9
|
+
*/
|
|
10
|
+
/** Maximum match-history entries retained by one connection or session feed. */
|
|
11
|
+
export declare const DEFAULT_MATCH_HISTORY_LIMIT = 200;
|
|
12
|
+
/** Maximum recent errors retained by one connection, session or room socket. */
|
|
13
|
+
export declare const DEFAULT_ERROR_HISTORY_LIMIT = 50;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retention caps shared by the SDK's in-memory feeds.
|
|
3
|
+
*
|
|
4
|
+
* Every buffer fed by the network is bounded: a flapping connection or a long
|
|
5
|
+
* match must not grow an array without limit, and the copy-on-append pattern
|
|
6
|
+
* these feeds use is O(n²) once the array is unbounded. The caps live here so
|
|
7
|
+
* the low-level connection and the higher-level session agree on one number
|
|
8
|
+
* instead of drifting apart.
|
|
9
|
+
*/
|
|
10
|
+
/** Maximum match-history entries retained by one connection or session feed. */
|
|
11
|
+
export const DEFAULT_MATCH_HISTORY_LIMIT = 200;
|
|
12
|
+
/** Maximum recent errors retained by one connection, session or room socket. */
|
|
13
|
+
export const DEFAULT_ERROR_HISTORY_LIMIT = 50;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/** Return a finite non-negative number, or the supplied fallback. */
|
|
2
|
+
export declare function nonNegativeNumber(value: number | undefined, fallback: number): number;
|
|
3
|
+
/** Return a finite positive number, or the supplied fallback. */
|
|
4
|
+
export declare function positiveNumber(value: number | undefined, fallback: number): number;
|
|
5
|
+
/** Values needed to calculate capped exponential reconnect backoff. */
|
|
6
|
+
export interface ReconnectBackoffPolicy {
|
|
7
|
+
/** Multiplier applied after each failed attempt. */
|
|
8
|
+
backoffFactor: number;
|
|
9
|
+
/** Delay before the first reconnect attempt, in milliseconds. */
|
|
10
|
+
initialDelayMs: number;
|
|
11
|
+
/** Maximum reconnect delay, in milliseconds. */
|
|
12
|
+
maxDelayMs: number;
|
|
13
|
+
}
|
|
14
|
+
/** Defaults supplied by each session surface for reconnect behavior. */
|
|
15
|
+
export interface ReconnectBackoffDefaults extends ReconnectBackoffPolicy {
|
|
16
|
+
/** Whether reconnect is enabled when callers omit the option. */
|
|
17
|
+
enabled: boolean;
|
|
18
|
+
}
|
|
19
|
+
/** Caller-provided reconnect fields before defaults and validation apply. */
|
|
20
|
+
export interface ReconnectBackoffOptions {
|
|
21
|
+
backoffFactor?: number | undefined;
|
|
22
|
+
initialDelayMs?: number | undefined;
|
|
23
|
+
maxDelayMs?: number | undefined;
|
|
24
|
+
}
|
|
25
|
+
/** Concrete reconnect policy after boolean and invalid-number normalization. */
|
|
26
|
+
export interface NormalizedReconnectBackoffPolicy extends ReconnectBackoffPolicy {
|
|
27
|
+
/** Whether this session schedules reconnect attempts. */
|
|
28
|
+
enabled: boolean;
|
|
29
|
+
}
|
|
30
|
+
/** Normalizes shared reconnect options while retaining caller-specific defaults. */
|
|
31
|
+
export declare function normalizeReconnectBackoff(option: boolean | ReconnectBackoffOptions | undefined, defaults: ReconnectBackoffDefaults): NormalizedReconnectBackoffPolicy;
|
|
32
|
+
/** Compute the capped exponential delay for a one-based reconnect attempt. */
|
|
33
|
+
export declare function reconnectDelayMs(policy: ReconnectBackoffPolicy, attempt: number): number;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** Return a finite non-negative number, or the supplied fallback. */
|
|
2
|
+
export function nonNegativeNumber(value, fallback) {
|
|
3
|
+
return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : fallback;
|
|
4
|
+
}
|
|
5
|
+
/** Return a finite positive number, or the supplied fallback. */
|
|
6
|
+
export function positiveNumber(value, fallback) {
|
|
7
|
+
return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : fallback;
|
|
8
|
+
}
|
|
9
|
+
/** Normalizes shared reconnect options while retaining caller-specific defaults. */
|
|
10
|
+
export function normalizeReconnectBackoff(option, defaults) {
|
|
11
|
+
const enabled = option == null ? defaults.enabled : option !== false;
|
|
12
|
+
const policy = option === true || option === false || option == null ? {} : option;
|
|
13
|
+
return {
|
|
14
|
+
enabled,
|
|
15
|
+
backoffFactor: positiveNumber(policy.backoffFactor, defaults.backoffFactor),
|
|
16
|
+
initialDelayMs: nonNegativeNumber(policy.initialDelayMs, defaults.initialDelayMs),
|
|
17
|
+
maxDelayMs: nonNegativeNumber(policy.maxDelayMs, defaults.maxDelayMs),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/** Compute the capped exponential delay for a one-based reconnect attempt. */
|
|
21
|
+
export function reconnectDelayMs(policy, attempt) {
|
|
22
|
+
const exponent = Math.max(0, attempt - 1);
|
|
23
|
+
const uncapped = policy.initialDelayMs * policy.backoffFactor ** exponent;
|
|
24
|
+
return Math.min(policy.maxDelayMs, Math.max(0, Math.floor(uncapped)));
|
|
25
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { ErrorPayload } from '../generated/index.js';
|
|
2
|
+
import type { SchemaName } from '../generated/schemas.js';
|
|
3
|
+
import type { SchemaTypeMap } from '../validators.js';
|
|
4
|
+
import type { SchemaValidator } from '../validators/validator.js';
|
|
5
|
+
/**
|
|
6
|
+
* Generated schema names usable as a socket frame contract.
|
|
7
|
+
*
|
|
8
|
+
* Every socket protocol root is both a validated schema and a tagged union, so
|
|
9
|
+
* a frame schema has to satisfy `parse` and `hasUnknownDiscriminant` alike.
|
|
10
|
+
*/
|
|
11
|
+
export type SocketFrameSchemaName = keyof SchemaTypeMap & SchemaName;
|
|
12
|
+
/**
|
|
13
|
+
* Outcome of decoding one raw socket frame.
|
|
14
|
+
*
|
|
15
|
+
* `ignored` covers a non-text event and a frame carrying a `type` this build
|
|
16
|
+
* does not know; `error` covers a frame that is malformed against its schema.
|
|
17
|
+
*/
|
|
18
|
+
export type SocketFrameDecodeResult<TMessage> = {
|
|
19
|
+
type: 'ignored';
|
|
20
|
+
} | {
|
|
21
|
+
error: ErrorPayload;
|
|
22
|
+
type: 'error';
|
|
23
|
+
} | {
|
|
24
|
+
message: TMessage;
|
|
25
|
+
type: 'message';
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Parses one browser-style message event into a typed, validated socket frame.
|
|
29
|
+
*
|
|
30
|
+
* Shared by every socket in the SDK so all of them answer a malformed known
|
|
31
|
+
* frame the same way, whatever their protocol root. The validator decides
|
|
32
|
+
* whether anything is actually checked: with the pass-through the frame is
|
|
33
|
+
* trusted exactly as sent, which is the SDK's default.
|
|
34
|
+
*
|
|
35
|
+
* A JSON syntax error and a schema violation both surface as an `error`
|
|
36
|
+
* result rather than a throw, because the only caller is a socket `message`
|
|
37
|
+
* listener — throwing there escapes into the transport, not into the consumer.
|
|
38
|
+
*
|
|
39
|
+
* @param event Raw socket message event.
|
|
40
|
+
* @param validator Boundary validator; the pass-through trusts the frame.
|
|
41
|
+
* @param schemaName Generated schema name this socket's frames must match.
|
|
42
|
+
*/
|
|
43
|
+
export declare function decodeSocketFrame<TName extends SocketFrameSchemaName>(event: unknown, validator: SchemaValidator, schemaName: TName): SocketFrameDecodeResult<SchemaTypeMap[TName]>;
|