/
talk.mjs
117 lines (100 loc) · 2.68 KB
/
talk.mjs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import base64uri from "../../../base64uri.mjs";
let ses = false;
function myinput(){
try{
const log = document.location;
const str = location.hash;
if(str == ""){
return {};
}else{
console.log("input", str);
const s = base64uri.decode(str.substring(1));
return JSON.parse(s);
}
}catch(e){
console.warn("Invalid hash");
return {};
}
}
function getval(name){
const prefix = "nestDev." + ses + ".";
const str = window.localStorage.getItem(prefix + name);
console.log("Getval",ses,name,str);
if(str){
const obj = JSON.parse(str);
return obj;
}else{
return false;
}
}
function getInbox(){
return {
in: getval("in"),
inbox: getval("inbox")
};
}
function clearInbox(){
const prefix = "nestDev." + ses + ".";
window.localStorage.setItem(prefix + "inbox", "null");
}
function setOutBox(obj){
const prefix = "nestDev." + ses + ".";
let outcnt = getval("out");
if(! outcnt){
outcnt = 1;
}else{
outcnt++;
}
/* Set `outbox`, then `out` */
const str_outbox = JSON.stringify({cnt: outcnt, data: obj});
const str_out = JSON.stringify(outcnt);
window.localStorage.setItem(prefix + "outbox", str_outbox);
window.localStorage.setItem(prefix + "out", str_out);
}
function action(func, data){
const prefix = "nestDev." + ses + ".";
const cb = getval("cb") + "/cnt/talk.html";
const myurl = window.location.protocol + "//" +
window.location.host + window.location.pathname;
if(func == "close"){
window.close();
}else{
const req = {
cb: myurl,
f: func,
d: data,
ses: ses
};
const target_data = base64uri.encode(JSON.stringify(req));
window.location.href = cb + "#" + target_data;
}
}
function checkNewMessage(){
const cur = getInbox();
console.log("Check New Message", cur);
if(cur.in != 0 && cur.inbox != null && cur.in == cur.inbox.cnt){
clearInbox();
action(cur.inbox.func, cur.inbox.data);
}
}
async function onStorage(e){
console.log("onStorage",e);
checkNewMessage();
}
async function onLoad(e){
const session_data = myinput();
const session = session_data.ses;
if(session_data.err){
console.log("Error??", err);
throw err;
}
console.log("Start session", session);
ses = session;
if(session_data.r){
console.log("Resp.", session_data);
setOutBox(session_data.r);
}
checkNewMessage();
addEventListener("storage", onStorage);
}
addEventListener("load", onLoad);