@hathora/client-sdk
Version:

68 lines (67 loc) • 3.08 kB
JavaScript
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();
}
}