Compare commits

..

No commits in common. "904090f51e81d0980bd12fdcb0680c54ad30df63" and "956435ba40f93a88a0f1f55405cf46abd8770b4a" have entirely different histories.

5 changed files with 50 additions and 119 deletions

View File

@ -116,7 +116,6 @@ class APIMethods {
// getting characters // getting characters
const user = global.authed.get(con); const user = global.authed.get(con);
const fields = req.fields.split(/\s*,\s*/g);
const result = (await user.getCharacters()) const result = (await user.getCharacters())
.map(character => { .map(character => {
return character; return character;

View File

@ -15,28 +15,12 @@ const curUrl = new URL(location.href);
const [address, port] = curUrl.searchParams.get("server").split(/:/); const [address, port] = curUrl.searchParams.get("server").split(/:/);
const isTLSmode = curUrl.searchParams.get("encrypted") === "true"; const isTLSmode = curUrl.searchParams.get("encrypted") === "true";
const apiMethodsProtected = new WeakMap();
class ProtoApiMethods { class ProtoApiMethods {
constructor (api) { constructor (api) {
//this.api = api; this.api = api;
if (!(api instanceof ApiSocket))
throw new Error("api must be instance of ApiSocket class");
apiMethodsProtected.set(this, api);
}
set api (_) {
throw new Error("api is not writeable");
}
get api () {
return apiMethodsProtected.get(this);
} }
async _protoMethod (rqdata, threadcb = null) { async _protoMethod (rqdata, threadcb = null) {
if (!(this instanceof ProtoApiMethods)) {
throw new Error("_protoMethod allowed only into original abstract class");
}
const socket = this.api.socket; const socket = this.api.socket;
const trace_id = getTraceId() const trace_id = getTraceId()
@ -64,9 +48,9 @@ class ProtoApiMethods {
} }
class ApiMethods extends ProtoApiMethods { class ApiMethods extends ProtoApiMethods {
/*async _protoMethod (rqdata) { async _protoMethod (rqdata) {
throw new Error("_protoMethod allowed only into abstract class"); throw new Error("_protoMethod allowed only into abstract class");
}*/ }
constructor (api) { constructor (api) {
super(api); super(api);
@ -100,28 +84,16 @@ class ApiMethods extends ProtoApiMethods {
}); });
} }
async characters (fields = "*") { async characters () {
return await super._protoMethod({ return await super._protoMethod({
method: "characters", fields method: "characters"
}); });
} }
} }
const apiHTMLProtected = new WeakMap();
class ApiHTML { class ApiHTML {
constructor (api) { constructor (api) {
//this.api = api; this.api = api;
if (!(api instanceof ApiSocket))
throw new Error("api must be instance of ApiSocket class");
apiHTMLProtected.set(this, api);
}
set api (_) {
throw new Error("api is not writeable");
}
get api () {
return apiHTMLProtected.get(this);
} }
async renderMainMenu (user, bgUrl = null, favicon = null) { async renderMainMenu (user, bgUrl = null, favicon = null) {
@ -137,30 +109,8 @@ class ApiHTML {
document.getElementById("server.area").innerHTML = ''; document.getElementById("server.area").innerHTML = '';
$(document.getElementById("server.area")).append(ServerAuth.mainMenuForm); $(document.getElementById("server.area")).append(ServerAuth.mainMenuForm);
// JS-Events // JS-Events
this.api.methods.characters("*") const charactersEvents = await this.api.methods.characters();
.then(characters => { console.debug({ charactersEvents });
const addCharBtn = document.createElement("button");
addCharBtn.setAttribute("type", "button");
["btn", "btn-success", "btn-outline-light"].forEach(c =>
addCharBtn.classList.add(c));
addCharBtn.innerText = "Add character";
const charlist = $.find("#user-charlist")[0];
for (let character of characters) {
// TODO: Create add chars to charlist
}
charlist.append(addCharBtn);
// Display
$.find("#mainmenu-load")[0].hidden = true;
$.find("#main-panel")[0].hidden = false;
}).catch(err => {
// Logging error
console.error(err.stack);
// Display
$.find("#mainmenu-load")[0].hidden = true;
$.find("#mainmenu-error")[0].hidden = false;
});
} }
async renderAuth (authMode, bgUrl = null, favicon = null) { async renderAuth (authMode, bgUrl = null, favicon = null) {
@ -215,7 +165,6 @@ class ApiHTML {
} }
} }
const apiSocketsProtected = new WeakMap();
export class ApiSocket { export class ApiSocket {
constructor ({ constructor ({
isTLSmode, address, port isTLSmode, address, port
@ -224,23 +173,13 @@ export class ApiSocket {
this.address = address; this.address = address;
this.port = port; this.port = port;
//this.socket = new WebSocket(`${!isTLSmode ? "ws" : "wss"}://${address}:${port}`); this.socket = new WebSocket(`${!isTLSmode ? "ws" : "wss"}://${address}:${port}`);
const socket = new WebSocket(`${!isTLSmode ? "ws" : "wss"}://${address}:${port}`);
apiSocketsProtected.set(this, socket);
this.methods = new ApiMethods(this); this.methods = new ApiMethods(this);
this.user = null; this.user = null;
this.html = new ApiHTML(this); this.html = new ApiHTML(this);
} }
set socket (_) {
throw new Error("api is not writeable");
}
get socket () {
return apiSocketsProtected.get(this);
}
async run () { async run () {
const socket = this.socket; const socket = this.socket;
const promise = new Promise((rs, rj) => { const promise = new Promise((rs, rj) => {

View File

@ -101,17 +101,17 @@ ServerAuth.mainMenuForm.innerHTML = `
</div> </div>
</div> </div>
<div id="main-panel" hidden> <div id="main-panel" >
<div id="main-content"> <div id="main-content">
<center><h2>Your Profile</h2></center><hr/> <center><h2>Your Profile</h2></center><hr/>
<div class="flex-box"> <div class="flex-box">
<div class="characters-menu"> <div class="characters-menu">
<center><h4>Characters</h4></center> <center><h4>Characters</h4></center>
<div id="user-charlist" class="user-character-list btn-group-vertical charlist-item" role="group" aria-label="Characters"> <div class="user-character-list btn-group-vertical charlist-item" role="group" aria-label="Characters">
<!--<button type="button" class="btn btn-dark btn-outline-light"> <button type="button" class="btn btn-dark btn-outline-light">
<div class="flex-box"><img src="https://fullgream.tech/assets/contacts-image.jpg" class="avatar-on-charlist" /><h5>John Doe</h5></div> <div class="flex-box"><img src="https://fullgream.tech/assets/contacts-image.jpg" class="avatar-on-charlist" /><h5>John Doe</h5></div>
</button> </button>
<button type="button" class="btn btn-success btn-outline-light">Add character</button>--> <button type="button" class="btn btn-success btn-outline-light">Add character</button>
</div> </div>
</div> </div>
<div class="character-menu"> <div class="character-menu">
@ -123,7 +123,5 @@ ServerAuth.mainMenuForm.innerHTML = `
</div> </div>
</div> </div>
<div id="mainmenu-load"><center>Loading...</center></div> <div id="mainmenu-load" hidden><center>Loading...</center></div>
<div id="mainmenu-error"><center>Throwed error</center></div>
`; `;

View File

@ -1,10 +1,11 @@
function simpleParseHeaders (packet) { function simpleParseHeaders (packet) {
return Object.fromEntries( return Object.fromEntries(packet.match(/[a-z\-]{1,}:\s{0,}.{1,}(\n|\r){1,}/gmiu)?.map(i => {
packet.match(/[a-z\-]{1,}:\s{0,}.{1,}(\n|\r){1,}/gimu)?.map((i) => { const [key, value] = i.split(/:\s{0,}/miu);
const [key, value] = i.split(/:\s{0,}/imu); return [
return [key.trim(), value.trim()]; key.trim(),
}) ?? [], value.trim()
); ];
}) ?? []);
} }
class PacketParseResult { class PacketParseResult {
@ -18,21 +19,15 @@ module.exports = async (bytes) => {
//console.log("((('", bytes.toString("utf8"), "')))"); //console.log("((('", bytes.toString("utf8"), "')))");
const packet = bytes.toString("utf8"); const packet = bytes.toString("utf8");
const isHTTP = const isHTTP = packet.match(/(GET|POST|PUT|DELETE|OPTIONS|HEAD|PATCH|TRACE|CONNECT)\s{1,}\/[a-zA-Z0-9_\-\.\/?=&%:]{0,}\s{1,}HTTP(S|)\/(1\.0|1\.1|2\.0)(\n|\r)/gmu)?.length > 0 ?? false;
packet.match(
/(GET|POST|PUT|DELETE|OPTIONS|HEAD|PATCH|TRACE|CONNECT)\s{1,}\/[a-zA-Z0-9_\-\.\/?=&%:]{0,}\s{1,}HTTP(S|)\/(1\.0|1\.1|2\.0)(\n|\r)/gmu,
)?.length > 0 ?? false;
//console.log({ isHTTP }); //console.log({ isHTTP });
let isWebSocket = false; let isWebSocket = false;
if (isHTTP) { if (isHTTP) {
const headers = simpleParseHeaders(packet); const headers = simpleParseHeaders(packet);
if (headers.Upgrade === "websocket") isWebSocket = true; if (headers.Upgrade === "websocket")
isWebSocket = true;
}
return new PacketParseResult({
isHTTP, isWebSocket
}, false);
} }
return new PacketParseResult(
{
isHTTP,
isWebSocket,
},
false,
);
};