100 lines
2.0 KiB
JavaScript
100 lines
2.0 KiB
JavaScript
import { ServerAuth } from "/js/connect/auth.js";
|
|
|
|
function randint(min, max) {
|
|
return Math.ceil((Math.random() * (max - min)) + min);
|
|
}
|
|
|
|
function getTraceId() {
|
|
const dict = "1234567890abcdefABCDEF";
|
|
return [...new Array(16)]
|
|
.map(() => dict[randint(0, dict.length - 1)])
|
|
.join("");
|
|
}
|
|
|
|
class ProtoApiMethods {
|
|
constructor (api) {
|
|
this.api = api;
|
|
}
|
|
|
|
async _protoMethod (rqdata, threadcb) {
|
|
const socket = this.api.socket;
|
|
const trace_id = getTraceId()
|
|
|
|
const promise = new Promise((rs, rj) => {
|
|
socket.onmessage = (ev) => {
|
|
ev = JSON.parse(ev.data);
|
|
const data = ev.result;
|
|
return rs(data);
|
|
if (ev.trace_id === trace_id)
|
|
if (!!ev.ended)
|
|
return rs(data);
|
|
threadcb(data);
|
|
};
|
|
socket.onerror = (err) => rj(err);
|
|
});
|
|
socket.send(
|
|
JSON.stringify({ trace_id, ...rqdata }),
|
|
);
|
|
return await promise;
|
|
}
|
|
}
|
|
|
|
class ApiMethods extends ProtoApiMethods {
|
|
async _protoMethod (rqdata) {
|
|
throw new Error("_protoMethod allowed only into abstract class");
|
|
}
|
|
|
|
constructor (api) {
|
|
super(api);
|
|
}
|
|
|
|
async info () {
|
|
return await super._protoMethod({
|
|
method: "info",
|
|
});
|
|
}
|
|
|
|
async authed () {
|
|
return await super._protoMethod({
|
|
method: "authed",
|
|
});
|
|
}
|
|
}
|
|
|
|
class ApiHTML {
|
|
constructor (api) {
|
|
this.api = api;
|
|
}
|
|
|
|
async renderAuth (authMode) {
|
|
document.body.style.backgroundImage = "url('assets/hello/1.png')";
|
|
|
|
document.getElementById("server.area").innerHTML = '';
|
|
$(document.getElementById("server.area")).append(ServerAuth.authForm);
|
|
//switch (authMode) {}
|
|
}
|
|
}
|
|
|
|
export class ApiSocket {
|
|
constructor ({
|
|
isTLSmode, address, port
|
|
}) {
|
|
this.tlsMode = isTLSmode;
|
|
this.address = address;
|
|
this.port = port;
|
|
|
|
this.socket = new WebSocket(`${!isTLSmode ? "ws" : "wss"}://${address}:${port}`);
|
|
this.methods = new ApiMethods(this);
|
|
|
|
this.html = new ApiHTML(this);
|
|
}
|
|
|
|
async run () {
|
|
const socket = this.socket;
|
|
const promise = new Promise((rs, rj) => {
|
|
socket.onopen = () => this.methods.info().then(data => rs(data));
|
|
socket.onerror = (err) => rj(err);
|
|
});
|
|
return await promise;
|
|
}
|
|
} |