UNPKG

parsec-sdk

Version:

UNOFFICIAL and WIP JavaScript/TypeScript SDK for Parsec remote desktop.

95 lines 3.77 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Client = void 0; const querystring_1 = require("querystring"); const http_1 = require("../utils/http"); const Status_1 = require("../enums/Status"); const InvalidCredentials_1 = require("../errors/InvalidCredentials"); const TFARequired_1 = require("../errors/TFARequired"); const AuthRequired_1 = require("../errors/AuthRequired"); class Client { status = Status_1.Status.PARSEC_NOT_RUNNING; sessionID; peerID; webrtcPeerConnection; websocket; /** * Authenticate client using the _personal_ strategy * * @param {@link AuthPersonalCredentials} credentials Credentials to use * in the authentication request */ async authPersonal(credentials) { try { if (this.sessionID && this.peerID && this.status === Status_1.Status.PARSEC_OK) { return; } this.status = Status_1.Status.PARSEC_CONNECTING; const { data } = await http_1.http.post('/v1/auth', credentials); const { host_peer_id, session_id } = data; this.peerID = host_peer_id; this.sessionID = session_id; this.status = Status_1.Status.PARSEC_OK; } catch (error) { this.status = Status_1.Status.ERR_DEFAULT; const httpErrorBody = error.response?.data; if (httpErrorBody?.tfa_required) { throw new TFARequired_1.TFARequiredError(httpErrorBody?.tfa_type); } else if (!httpErrorBody?.tfa_required && httpErrorBody?.error) { throw new InvalidCredentials_1.InvalidCredentialsError(); } throw new Error(httpErrorBody?.error || error.message); } } /** * Obtain a list of hosts matching specified `mode` and `public` criteria * * @param {@link GetHostsQueryParams} queryParams get hosts request * query params object representation */ async getHosts(queryParams) { try { const queryString = (0, querystring_1.stringify)({ ...queryParams }); const { data } = await http_1.http.get(`/v2/hosts?${queryString}`, { headers: { Authorization: `Bearer ${this.sessionID}` } }); return data; } catch (error) { this.status = Status_1.Status.ERR_DEFAULT; const httpErrorBody = error.response?.data; if (!this.sessionID && httpErrorBody?.error === 'no session ID in request header') { throw new AuthRequired_1.AuthRequiredError(); } throw new Error(httpErrorBody?.error || error.message); } } /** * @param {{htmlVideo:HTMLVideoElement;htmlAudio:HTMLAudioElement;secret?:string;}} config */ async connect(config) { if (!this.sessionID) { throw new AuthRequired_1.AuthRequiredError(); } this.websocket = new WebSocket(`wss://kessel-ws.parsecgaming.com:443/?session_id=${this.sessionID}&role=client&version=1&sdk_version=0`); this.websocket.onclose; this.webrtcPeerConnection = new RTCPeerConnection({ iceServers: [{ urls: 'stun:stun.parsec.gg:3478' }] }); this.webrtcPeerConnection.onicecandidate = ({ candidate }) => { const iceCandidateData = candidate?.candidate ?.replace('candidate:', '') .split(' '); if (iceCandidateData && iceCandidateData.length >= 8) { const protocol = iceCandidateData[2].toLowerCase(); } }; } } exports.Client = Client; //# sourceMappingURL=Client.js.map