godprotocol 1.2.54 → 2.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Godprotocol.js +33 -0
- package/Index.js +10 -5
- package/package.json +1 -1
- package/server/Routable/Header.js +240 -0
- package/server/Routable/Route_table.js +198 -0
- package/server/Routable/Services.js +193 -0
- package/server/utils.js +54 -0
- package/server/version_control.js +71 -0
- package/{Objects → virtual_machine/Objects}/Clock.js +9 -9
- package/{Objects → virtual_machine/Objects}/Events.js +47 -47
- package/{callables → virtual_machine/callables}/functions/assert.js +9 -9
- package/{callables → virtual_machine/callables}/functions/env.js +4 -4
- package/{callables → virtual_machine/callables}/functions/query.js +17 -17
- package/{callables → virtual_machine/callables}/functions/wait.js +8 -8
- package/{html → virtual_machine/html}/create.js +95 -95
- package/{html → virtual_machine/html}/index.js +125 -125
- package/{html → virtual_machine/html}/load.js +166 -166
- package/{html → virtual_machine/html}/parse.js +170 -170
- package/{html → virtual_machine/html}/run.js +150 -150
- package/{html → virtual_machine/html}/util.js +4 -4
- /package/{Datatypes → virtual_machine/Datatypes}/arr.js +0 -0
- /package/{Datatypes → virtual_machine/Datatypes}/bool.js +0 -0
- /package/{Datatypes → virtual_machine/Datatypes}/callable.js +0 -0
- /package/{Datatypes → virtual_machine/Datatypes}/cls.js +0 -0
- /package/{Datatypes → virtual_machine/Datatypes}/conf.js +0 -0
- /package/{Datatypes → virtual_machine/Datatypes}/err.js +0 -0
- /package/{Datatypes → virtual_machine/Datatypes}/func.js +0 -0
- /package/{Datatypes → virtual_machine/Datatypes}/functions/storage.js +0 -0
- /package/{Datatypes → virtual_machine/Datatypes}/functions/wallet.js +0 -0
- /package/{Datatypes → virtual_machine/Datatypes}/instance.js +0 -0
- /package/{Datatypes → virtual_machine/Datatypes}/num.js +0 -0
- /package/{Datatypes → virtual_machine/Datatypes}/str.js +0 -0
- /package/{Datatypes → virtual_machine/Datatypes}/twa.js +0 -0
- /package/{Datatypes → virtual_machine/Datatypes}/voi.js +0 -0
- /package/{Instances → virtual_machine/Instances}/account.js +0 -0
- /package/{Instances → virtual_machine/Instances}/event.js +0 -0
- /package/{Instances → virtual_machine/Instances}/fold.js +0 -0
- /package/{Instances → virtual_machine/Instances}/folder_queries.js +0 -0
- /package/{Instances → virtual_machine/Instances}/response.js +0 -0
- /package/{Objects → virtual_machine/Objects}/Account.js +0 -0
- /package/{Objects → virtual_machine/Objects}/Block.js +0 -0
- /package/{Objects → virtual_machine/Objects}/Blockweb.js +0 -0
- /package/{Objects → virtual_machine/Objects}/Callable.js +0 -0
- /package/{Objects → virtual_machine/Objects}/Chain.js +0 -0
- /package/{Objects → virtual_machine/Objects}/Datatypes.js +0 -0
- /package/{Objects → virtual_machine/Objects}/Manager.js +0 -0
- /package/{Objects → virtual_machine/Objects}/Oracle.js +0 -0
- /package/{Objects → virtual_machine/Objects}/Repository.js +0 -0
- /package/{Objects → virtual_machine/Objects}/Trinity.js +0 -0
- /package/{Objects → virtual_machine/Objects}/Utils.js +0 -0
- /package/{Objects → virtual_machine/Objects}/Virtual_machine.js +0 -0
- /package/{callables → virtual_machine/callables}/functions/display.js +0 -0
- /package/{callables → virtual_machine/callables}/functions/event.js +0 -0
- /package/{callables → virtual_machine/callables}/functions/exit.js +0 -0
- /package/{callables → virtual_machine/callables}/functions/folder.js +0 -0
- /package/{callables → virtual_machine/callables}/functions/get_uid.js +0 -0
- /package/{callables → virtual_machine/callables}/functions/hash.js +0 -0
- /package/{callables → virtual_machine/callables}/functions/import_.js +0 -0
- /package/{callables → virtual_machine/callables}/functions/local.js +0 -0
- /package/{callables → virtual_machine/callables}/functions/net.js +0 -0
- /package/{callables → virtual_machine/callables}/functions/parse.js +0 -0
- /package/{callables → virtual_machine/callables}/functions/render.js +0 -0
- /package/{callables → virtual_machine/callables}/functions/servers.js +0 -0
- /package/{callables → virtual_machine/callables}/functions/spawn.js +0 -0
- /package/{callables → virtual_machine/callables}/functions/store.js +0 -0
- /package/{callables → virtual_machine/callables}/functions/super_.js +0 -0
- /package/{callables → virtual_machine/callables}/functions/twain.js +0 -0
- /package/{callables → virtual_machine/callables}/functions/typeof.js +0 -0
- /package/{callables → virtual_machine/callables}/register.js +0 -0
- /package/{utils → virtual_machine/utils}/create_server.js +0 -0
- /package/{utils → virtual_machine/utils}/functions.js +0 -0
- /package/{utils → virtual_machine/utils}/hash.js +0 -0
- /package/{utils → virtual_machine/utils}/ops.js +0 -0
- /package/{utils → virtual_machine/utils}/oracle_handlers.js +0 -0
- /package/{utils → virtual_machine/utils}/server.cert +0 -0
- /package/{utils → virtual_machine/utils}/server.key +0 -0
- /package/{utils → virtual_machine/utils}/services.js +0 -0
- /package/{utils → virtual_machine/utils}/socket_server.js +0 -0
- /package/{utils → virtual_machine/utils}/vm_utils.js +0 -0
package/server/utils.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import crypto, { createHash, randomBytes, createCipheriv } from "crypto";
|
|
2
|
+
|
|
3
|
+
const deriveKey = (secret) =>
|
|
4
|
+
createHash("sha256").update(String(secret)).digest();
|
|
5
|
+
/**
|
|
6
|
+
* Encrypt a value (usually a session token) using AES-256-GCM.
|
|
7
|
+
* Returns a compact base64 string encoding iv|authTag|ciphertext.
|
|
8
|
+
*/
|
|
9
|
+
const decryptToken = (enc, secret) => {
|
|
10
|
+
if (!enc) return null;
|
|
11
|
+
|
|
12
|
+
try {
|
|
13
|
+
const key = deriveKey(secret);
|
|
14
|
+
|
|
15
|
+
const parts = enc.split(":");
|
|
16
|
+
if (parts.length < 3) throw new Error("Invalid token format");
|
|
17
|
+
|
|
18
|
+
const iv = Buffer.from(parts[0], "base64");
|
|
19
|
+
const tag = Buffer.from(parts[1], "base64");
|
|
20
|
+
const data = Buffer.from(parts.slice(2).join(":"), "base64");
|
|
21
|
+
|
|
22
|
+
const decipher = createDecipheriv("aes-256-gcm", key, iv);
|
|
23
|
+
decipher.setAuthTag(tag);
|
|
24
|
+
|
|
25
|
+
const decrypted = Buffer.concat([
|
|
26
|
+
decipher.update(data),
|
|
27
|
+
decipher.final(),
|
|
28
|
+
]).toString("utf8");
|
|
29
|
+
|
|
30
|
+
return JSON.parse(decrypted);
|
|
31
|
+
} catch (err) {
|
|
32
|
+
console.error("❌ Decrypt failed:", err.message);
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const encryptToken = (payload, secret) => {
|
|
38
|
+
const key = deriveKey(secret);
|
|
39
|
+
const iv = randomBytes(12); // GCM standard
|
|
40
|
+
|
|
41
|
+
const cipher = createCipheriv("aes-256-gcm", key, iv);
|
|
42
|
+
|
|
43
|
+
const encrypted = Buffer.concat([
|
|
44
|
+
cipher.update(JSON.stringify(payload), "utf8"),
|
|
45
|
+
cipher.final(),
|
|
46
|
+
]);
|
|
47
|
+
|
|
48
|
+
const tag = cipher.getAuthTag();
|
|
49
|
+
|
|
50
|
+
// iv:tag:data
|
|
51
|
+
return `${iv.toString("base64")}:${tag.toString("base64")}:${encrypted.toString("base64")}`;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export { encryptToken, decryptToken };
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
const respond = async (result, res) => {
|
|
2
|
+
let response = {
|
|
3
|
+
ok: result?.ok,
|
|
4
|
+
message: result.message,
|
|
5
|
+
data: result.data,
|
|
6
|
+
};
|
|
7
|
+
if (result.pagination) response.pagination = result.pagination;
|
|
8
|
+
if (result.token) response.token = result.token;
|
|
9
|
+
|
|
10
|
+
res.status(result?.status || (result?.ok ? 200 : 403)).json(response);
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const version_middleware = async (req, res, routers) => {
|
|
14
|
+
try {
|
|
15
|
+
const version = req.headers["x-api-version"] || "v1";
|
|
16
|
+
|
|
17
|
+
let router = routers.get_version(version);
|
|
18
|
+
|
|
19
|
+
if (router.config?.is_old) return router.routes(req, res);
|
|
20
|
+
|
|
21
|
+
if (!router) {
|
|
22
|
+
return res.status(400).json({
|
|
23
|
+
error: "Invalid API version",
|
|
24
|
+
version,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
router = routers;
|
|
29
|
+
|
|
30
|
+
let name = req.path.slice(1),
|
|
31
|
+
result;
|
|
32
|
+
|
|
33
|
+
try {
|
|
34
|
+
result = await router.handle_security(name, req);
|
|
35
|
+
|
|
36
|
+
if (result !== true) {
|
|
37
|
+
return await respond(result, res);
|
|
38
|
+
}
|
|
39
|
+
} catch (err) {
|
|
40
|
+
console.error(err);
|
|
41
|
+
|
|
42
|
+
throw new Error("Security check failed");
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
let db = await router.resolve_db(req);
|
|
46
|
+
|
|
47
|
+
try {
|
|
48
|
+
result = await router.execute(name, {
|
|
49
|
+
body: req.body,
|
|
50
|
+
headers: req.headers,
|
|
51
|
+
db,
|
|
52
|
+
services: router.get_service,
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
await respond(result, res);
|
|
56
|
+
} catch (err) {
|
|
57
|
+
console.error(err);
|
|
58
|
+
|
|
59
|
+
throw new Error("Route execution failed");
|
|
60
|
+
}
|
|
61
|
+
} catch (err) {
|
|
62
|
+
console.error("Version Middleware Error:", err);
|
|
63
|
+
|
|
64
|
+
return res.status(500).json({
|
|
65
|
+
ok: false,
|
|
66
|
+
message: "Internal server error",
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
export default version_middleware;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import Events from "./Events.js";
|
|
2
|
-
|
|
3
|
-
class Clock extends Events {
|
|
4
|
-
constructor() {
|
|
5
|
-
super();
|
|
6
|
-
}
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export default Clock;
|
|
1
|
+
import Events from "./Events.js";
|
|
2
|
+
|
|
3
|
+
class Clock extends Events {
|
|
4
|
+
constructor() {
|
|
5
|
+
super();
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export default Clock;
|
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
import { query_ } from "../callables/functions/query.js";
|
|
2
|
-
|
|
3
|
-
class Events {
|
|
4
|
-
constructor() {
|
|
5
|
-
this.events_listeners = new Object();
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
add_listener = async (name, handler, filter) => {
|
|
9
|
-
let listeners = this.events_listeners[name];
|
|
10
|
-
if (!listeners) {
|
|
11
|
-
listeners = new Array();
|
|
12
|
-
this.events_listeners[name] = listeners;
|
|
13
|
-
}
|
|
14
|
-
if (
|
|
15
|
-
!listeners.find(
|
|
16
|
-
(li) =>
|
|
17
|
-
li.handler === handler &&
|
|
18
|
-
JSON.stringify(li.filter) === JSON.stringify(filter)
|
|
19
|
-
)
|
|
20
|
-
)
|
|
21
|
-
listeners.push({ handler, filter });
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
emit = async (name, payload, cb) => {
|
|
25
|
-
let listeners = this.events_listeners[name];
|
|
26
|
-
if (!listeners) return;
|
|
27
|
-
|
|
28
|
-
let total = 0;
|
|
29
|
-
for (let l = 0; l < listeners.length; l++) {
|
|
30
|
-
let { filter, handler } = listeners[l];
|
|
31
|
-
|
|
32
|
-
if (await query_(payload, filter, await this.ds.get_folder())) {
|
|
33
|
-
total++;
|
|
34
|
-
handler(payload)
|
|
35
|
-
.then((res) => {
|
|
36
|
-
total--;
|
|
37
|
-
cb && cb(res, { done: !total, event: { name, handler, filter } });
|
|
38
|
-
})
|
|
39
|
-
.catch((e) => {
|
|
40
|
-
console.log(e.message);
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export default Events;
|
|
1
|
+
import { query_ } from "../callables/functions/query.js";
|
|
2
|
+
|
|
3
|
+
class Events {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.events_listeners = new Object();
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
add_listener = async (name, handler, filter) => {
|
|
9
|
+
let listeners = this.events_listeners[name];
|
|
10
|
+
if (!listeners) {
|
|
11
|
+
listeners = new Array();
|
|
12
|
+
this.events_listeners[name] = listeners;
|
|
13
|
+
}
|
|
14
|
+
if (
|
|
15
|
+
!listeners.find(
|
|
16
|
+
(li) =>
|
|
17
|
+
li.handler === handler &&
|
|
18
|
+
JSON.stringify(li.filter) === JSON.stringify(filter)
|
|
19
|
+
)
|
|
20
|
+
)
|
|
21
|
+
listeners.push({ handler, filter });
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
emit = async (name, payload, cb) => {
|
|
25
|
+
let listeners = this.events_listeners[name];
|
|
26
|
+
if (!listeners) return;
|
|
27
|
+
|
|
28
|
+
let total = 0;
|
|
29
|
+
for (let l = 0; l < listeners.length; l++) {
|
|
30
|
+
let { filter, handler } = listeners[l];
|
|
31
|
+
|
|
32
|
+
if (await query_(payload, filter, await this.ds.get_folder())) {
|
|
33
|
+
total++;
|
|
34
|
+
handler(payload)
|
|
35
|
+
.then((res) => {
|
|
36
|
+
total--;
|
|
37
|
+
cb && cb(res, { done: !total, event: { name, handler, filter } });
|
|
38
|
+
})
|
|
39
|
+
.catch((e) => {
|
|
40
|
+
console.log(e.message);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export default Events;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
const assert = async(args, {vm})=>{
|
|
2
|
-
let {predicate} = args;
|
|
3
|
-
|
|
4
|
-
let yes = !!await predicate.literal()
|
|
5
|
-
|
|
6
|
-
if (yes) return;
|
|
7
|
-
return await vm.throw_error({type: 'AssertionError', message: 'Test case failed!'})
|
|
8
|
-
}
|
|
9
|
-
|
|
1
|
+
const assert = async(args, {vm})=>{
|
|
2
|
+
let {predicate} = args;
|
|
3
|
+
|
|
4
|
+
let yes = !!await predicate.literal()
|
|
5
|
+
|
|
6
|
+
if (yes) return;
|
|
7
|
+
return await vm.throw_error({type: 'AssertionError', message: 'Test case failed!'})
|
|
8
|
+
}
|
|
9
|
+
|
|
10
10
|
export default assert
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const env = async(args, {vm, thread})=>{
|
|
2
|
-
return vm.envs[thread._id]
|
|
3
|
-
}
|
|
4
|
-
|
|
1
|
+
const env = async(args, {vm, thread})=>{
|
|
2
|
+
return vm.envs[thread._id]
|
|
3
|
+
}
|
|
4
|
+
|
|
5
5
|
export default env;
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
const query_ = async (object, filter, folder) => {
|
|
2
|
-
let res = filter ? await folder.pass(object, filter) : true;
|
|
3
|
-
|
|
4
|
-
return res;
|
|
5
|
-
};
|
|
6
|
-
|
|
7
|
-
const query = async (args, { vm, thread }) => {
|
|
8
|
-
let { object, filter } = args;
|
|
9
|
-
|
|
10
|
-
object = await object.literal();
|
|
11
|
-
filter = await filter.literal();
|
|
12
|
-
|
|
13
|
-
return await query_(object, filter, await vm.account.chain.folder());
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
export default query;
|
|
17
|
-
export { query_ };
|
|
1
|
+
const query_ = async (object, filter, folder) => {
|
|
2
|
+
let res = filter ? await folder.pass(object, filter) : true;
|
|
3
|
+
|
|
4
|
+
return res;
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
const query = async (args, { vm, thread }) => {
|
|
8
|
+
let { object, filter } = args;
|
|
9
|
+
|
|
10
|
+
object = await object.literal();
|
|
11
|
+
filter = await filter.literal();
|
|
12
|
+
|
|
13
|
+
return await query_(object, filter, await vm.account.chain.folder());
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export default query;
|
|
17
|
+
export { query_ };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
const wait = async(args, {vm, thread})=>{
|
|
2
|
-
let {duration} = args;
|
|
3
|
-
|
|
4
|
-
duration = await duration.literal()
|
|
5
|
-
|
|
6
|
-
thread.status = {duration, start: Date.now()}
|
|
7
|
-
}
|
|
8
|
-
|
|
1
|
+
const wait = async(args, {vm, thread})=>{
|
|
2
|
+
let {duration} = args;
|
|
3
|
+
|
|
4
|
+
duration = await duration.literal()
|
|
5
|
+
|
|
6
|
+
thread.status = {duration, start: Date.now()}
|
|
7
|
+
}
|
|
8
|
+
|
|
9
9
|
export default wait
|
|
@@ -1,96 +1,96 @@
|
|
|
1
|
-
const script = (manager)=> {
|
|
2
|
-
return `
|
|
3
|
-
const account_id_el = document.getElementById('account_id'), account_password_el = document.getElementById('account_password'),
|
|
4
|
-
show_password = document.getElementById('show_password'), create_account = document.getElementById('create_account')
|
|
5
|
-
|
|
6
|
-
show_password.addEventListener('click', e=>{
|
|
7
|
-
account_password_el.setAttribute('type', e.target.checked ? 'text' : 'password')
|
|
8
|
-
})
|
|
9
|
-
|
|
10
|
-
let message_box = document.getElementById('message-box')
|
|
11
|
-
|
|
12
|
-
create_account.addEventListener('click', e=>{
|
|
13
|
-
e.preventDefault();
|
|
14
|
-
console.log('click click', "${manager.options.server_domain}")
|
|
15
|
-
|
|
16
|
-
let name = account_id_el.value.trim(), password = account_password_el.value.trim();
|
|
17
|
-
|
|
18
|
-
if (!name || !password){
|
|
19
|
-
message_box.textContent = 'Please completely fill all form fields.'
|
|
20
|
-
|
|
21
|
-
setTimeout(() => {
|
|
22
|
-
message_box.textContent = ''
|
|
23
|
-
}, 2500);
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
ftch("/create_account", {name, password})
|
|
28
|
-
.then(res=>{
|
|
29
|
-
let accs = sessionStorage.getItem('accounts')
|
|
30
|
-
if (accs) accs = JSON.parse(accs)
|
|
31
|
-
else accs = new Array()
|
|
32
|
-
|
|
33
|
-
if (res.uid){
|
|
34
|
-
let indx = accs.findIndex(ac=>ac.name === name)
|
|
35
|
-
if (indx !== -1){
|
|
36
|
-
accs[indx].uid = res.uid
|
|
37
|
-
} else {
|
|
38
|
-
accs.push({name, uid: res.uid})
|
|
39
|
-
}
|
|
40
|
-
sessionStorage.setItem('accounts', JSON.stringify(accs))
|
|
41
|
-
|
|
42
|
-
account_password_el.value = ''
|
|
43
|
-
account_id_el.value = ''
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
message_box.textContent = res.uid ? 'Account signed succesfully!' : res.message
|
|
47
|
-
return;
|
|
48
|
-
})
|
|
49
|
-
.catch(err=>console.log(err))
|
|
50
|
-
|
|
51
|
-
}) `
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const create = (manager)=>{
|
|
55
|
-
let tml = `<div class="container my-5">
|
|
56
|
-
<div class="row justify-content-center">
|
|
57
|
-
<div class="col-md-6">
|
|
58
|
-
<form id="create-form" class="card p-4 shadow-sm">
|
|
59
|
-
<h4 class="mb-4 text-center">Create Account</h4>
|
|
60
|
-
|
|
61
|
-
<!-- Account Name -->
|
|
62
|
-
<div class="mb-3">
|
|
63
|
-
<label for="account_id" class="form-label">Account Name</label>
|
|
64
|
-
<input type="text" class="form-control" id="account_id" placeholder="Name" required>
|
|
65
|
-
</div>
|
|
66
|
-
|
|
67
|
-
<!-- Password -->
|
|
68
|
-
<div class="mb-3">
|
|
69
|
-
<label for="account_password" class="form-label">Password</label>
|
|
70
|
-
<input type="password" class="form-control" id="account_password" placeholder="Password" required>
|
|
71
|
-
</div>
|
|
72
|
-
|
|
73
|
-
<!-- Show Password -->
|
|
74
|
-
<div class="form-check mb-3">
|
|
75
|
-
<input class="form-check-input" type="checkbox" id="show_password">
|
|
76
|
-
<label class="form-check-label" for="show_password">Show Password</label>
|
|
77
|
-
</div>
|
|
78
|
-
|
|
79
|
-
<!-- Submit -->
|
|
80
|
-
<div class="d-grid">
|
|
81
|
-
<button type="submit" class="btn btn-primary" id="create_account">Submit</button>
|
|
82
|
-
</div>
|
|
83
|
-
</form>
|
|
84
|
-
|
|
85
|
-
<!-- Message box placeholder -->
|
|
86
|
-
<div id="message-box" class="mt-3"></div>
|
|
87
|
-
</div>
|
|
88
|
-
</div>
|
|
89
|
-
</div>`
|
|
90
|
-
|
|
91
|
-
tml = `${tml} <script>${script(manager)}</script>`
|
|
92
|
-
|
|
93
|
-
return tml
|
|
94
|
-
}
|
|
95
|
-
|
|
1
|
+
const script = (manager)=> {
|
|
2
|
+
return `
|
|
3
|
+
const account_id_el = document.getElementById('account_id'), account_password_el = document.getElementById('account_password'),
|
|
4
|
+
show_password = document.getElementById('show_password'), create_account = document.getElementById('create_account')
|
|
5
|
+
|
|
6
|
+
show_password.addEventListener('click', e=>{
|
|
7
|
+
account_password_el.setAttribute('type', e.target.checked ? 'text' : 'password')
|
|
8
|
+
})
|
|
9
|
+
|
|
10
|
+
let message_box = document.getElementById('message-box')
|
|
11
|
+
|
|
12
|
+
create_account.addEventListener('click', e=>{
|
|
13
|
+
e.preventDefault();
|
|
14
|
+
console.log('click click', "${manager.options.server_domain}")
|
|
15
|
+
|
|
16
|
+
let name = account_id_el.value.trim(), password = account_password_el.value.trim();
|
|
17
|
+
|
|
18
|
+
if (!name || !password){
|
|
19
|
+
message_box.textContent = 'Please completely fill all form fields.'
|
|
20
|
+
|
|
21
|
+
setTimeout(() => {
|
|
22
|
+
message_box.textContent = ''
|
|
23
|
+
}, 2500);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
ftch("/create_account", {name, password})
|
|
28
|
+
.then(res=>{
|
|
29
|
+
let accs = sessionStorage.getItem('accounts')
|
|
30
|
+
if (accs) accs = JSON.parse(accs)
|
|
31
|
+
else accs = new Array()
|
|
32
|
+
|
|
33
|
+
if (res.uid){
|
|
34
|
+
let indx = accs.findIndex(ac=>ac.name === name)
|
|
35
|
+
if (indx !== -1){
|
|
36
|
+
accs[indx].uid = res.uid
|
|
37
|
+
} else {
|
|
38
|
+
accs.push({name, uid: res.uid})
|
|
39
|
+
}
|
|
40
|
+
sessionStorage.setItem('accounts', JSON.stringify(accs))
|
|
41
|
+
|
|
42
|
+
account_password_el.value = ''
|
|
43
|
+
account_id_el.value = ''
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
message_box.textContent = res.uid ? 'Account signed succesfully!' : res.message
|
|
47
|
+
return;
|
|
48
|
+
})
|
|
49
|
+
.catch(err=>console.log(err))
|
|
50
|
+
|
|
51
|
+
}) `
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const create = (manager)=>{
|
|
55
|
+
let tml = `<div class="container my-5">
|
|
56
|
+
<div class="row justify-content-center">
|
|
57
|
+
<div class="col-md-6">
|
|
58
|
+
<form id="create-form" class="card p-4 shadow-sm">
|
|
59
|
+
<h4 class="mb-4 text-center">Create Account</h4>
|
|
60
|
+
|
|
61
|
+
<!-- Account Name -->
|
|
62
|
+
<div class="mb-3">
|
|
63
|
+
<label for="account_id" class="form-label">Account Name</label>
|
|
64
|
+
<input type="text" class="form-control" id="account_id" placeholder="Name" required>
|
|
65
|
+
</div>
|
|
66
|
+
|
|
67
|
+
<!-- Password -->
|
|
68
|
+
<div class="mb-3">
|
|
69
|
+
<label for="account_password" class="form-label">Password</label>
|
|
70
|
+
<input type="password" class="form-control" id="account_password" placeholder="Password" required>
|
|
71
|
+
</div>
|
|
72
|
+
|
|
73
|
+
<!-- Show Password -->
|
|
74
|
+
<div class="form-check mb-3">
|
|
75
|
+
<input class="form-check-input" type="checkbox" id="show_password">
|
|
76
|
+
<label class="form-check-label" for="show_password">Show Password</label>
|
|
77
|
+
</div>
|
|
78
|
+
|
|
79
|
+
<!-- Submit -->
|
|
80
|
+
<div class="d-grid">
|
|
81
|
+
<button type="submit" class="btn btn-primary" id="create_account">Submit</button>
|
|
82
|
+
</div>
|
|
83
|
+
</form>
|
|
84
|
+
|
|
85
|
+
<!-- Message box placeholder -->
|
|
86
|
+
<div id="message-box" class="mt-3"></div>
|
|
87
|
+
</div>
|
|
88
|
+
</div>
|
|
89
|
+
</div>`
|
|
90
|
+
|
|
91
|
+
tml = `${tml} <script>${script(manager)}</script>`
|
|
92
|
+
|
|
93
|
+
return tml
|
|
94
|
+
}
|
|
95
|
+
|
|
96
96
|
export default create
|