UNPKG

@hathora/client-sdk

Version:

![Hathora Logo](https://user-images.githubusercontent.com/7004280/223056895-c16419d2-2b91-4013-82f0-7616c84d31b7.svg)

68 lines (67 loc) 3.08 kB
import jwtDecode from "jwt-decode"; import { HathoraConnection } from "./connection.js"; export class HathoraClient { appId; localConnectionDetails; static getUserFromToken(token) { return jwtDecode(token); } constructor(appId, localConnectionDetails) { this.appId = appId; this.localConnectionDetails = localConnectionDetails; } async loginAnonymous() { const res = await this.postJson(`https://api.hathora.dev/auth/v1/${this.appId}/login/anonymous`, {}); return res.token; } async loginNickname(nickname) { const res = await this.postJson(`https://api.hathora.dev/auth/v1/${this.appId}/login/nickname`, { nickname }); return res.token; } async loginGoogle(idToken) { const res = await this.postJson(`https://api.hathora.dev/auth/v1/${this.appId}/login/google`, { idToken }); return res.token; } async createPrivateLobby(token, { region = "Washington_DC", initialConfig = {} } = {}) { const visibility = this.localConnectionDetails !== undefined ? "local" : "private"; const { roomId } = await this.postJson(`https://api.hathora.dev/lobby/v2/${this.appId}/create`, { visibility, region, initialConfig }, { Authorization: token }); return roomId; } async createPublicLobby(token, { region = "Washington_DC", initialConfig = {} } = {}) { const visibility = this.localConnectionDetails !== undefined ? "local" : "public"; const { roomId } = await this.postJson(`https://api.hathora.dev/lobby/v2/${this.appId}/create`, { visibility, region, initialConfig }, { Authorization: token }); return roomId; } async getPublicLobbies(token, region) { const regionParam = region === undefined ? "" : `?region=${region}`; const res = await fetch(`https://api.hathora.dev/lobby/v2/${this.appId}/list/public${regionParam}`, { headers: { Authorization: token } }); return await res.json(); } async getConnectionDetailsForRoomId(roomId) { if (this.localConnectionDetails !== undefined) { return this.localConnectionDetails; } const res = await fetch(`https://api.hathora.dev/rooms/v1/${this.appId}/connectioninfo/${roomId}`); const connectionInfo = await res.json(); if (connectionInfo.status === "starting") { return new Promise((resolve) => { setTimeout(() => { resolve(this.getConnectionDetailsForRoomId(roomId)); }, 1000); }); } return connectionInfo; } async newConnection(roomId) { const connectionDetails = await this.getConnectionDetailsForRoomId(roomId); return new HathoraConnection(roomId, connectionDetails); } async postJson(url, body, headers = {}) { const res = await fetch(url, { method: "POST", headers: { ...headers, "Content-Type": "application/json" }, body: JSON.stringify(body), }); return await res.json(); } }