parsec-sdk
Version:
UNOFFICIAL and WIP JavaScript/TypeScript SDK for Parsec remote desktop.
95 lines • 3.77 kB
JavaScript
;
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