You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.9 KiB
JavaScript
79 lines
2.9 KiB
JavaScript
var messageQueue = {};
|
|
|
|
// https://stackoverflow.com/a/52171480
|
|
// simple 53-bit hash by https://github.com/bryc
|
|
const cyrb53 = function(str, seed = 0) {
|
|
let h1 = 0xdeadbeef ^ seed, h2 = 0x41c6ce57 ^ seed;
|
|
for (let i = 0, ch; i < str.length; i++) {
|
|
ch = str.charCodeAt(i);
|
|
h1 = Math.imul(h1 ^ ch, 2654435761);
|
|
h2 = Math.imul(h2 ^ ch, 1597334677);
|
|
}
|
|
h1 = Math.imul(h1 ^ (h1>>>16), 2246822507) ^ Math.imul(h2 ^ (h2>>>13), 3266489909);
|
|
h2 = Math.imul(h2 ^ (h2>>>16), 2246822507) ^ Math.imul(h1 ^ (h1>>>13), 3266489909);
|
|
return 4294967296 * (2097151 & h2) + (h1>>>0);
|
|
};
|
|
|
|
chrome.runtime.onMessage.addListener((m, n)=> {
|
|
var nh = chrome.runtime.connectNative("org.sandpoints.chromeext")
|
|
nh.onDisconnect.addListener((e, err)=> {
|
|
console.log("event:", e)
|
|
console.log("error:", err)
|
|
})
|
|
console.log("message:", m)
|
|
console.log("sender:", n)
|
|
console.log("message length:", JSON.stringify(m).length)
|
|
const messageLength = JSON.stringify(m).length
|
|
const digestHex = cyrb53(JSON.stringify(m)).toString();
|
|
if (messageLength > 61440) {
|
|
const contentLength = m.hugocontent.length
|
|
const fragmentLength = 61440 - (messageLength - JSON.stringify(m.hugocontent).length);
|
|
let hugocontent = ("_" + m.hugocontent).slice(1); // deep copy
|
|
messageQueue[digestHex] = [];
|
|
let x = 0;
|
|
while ((x+1)*fragmentLength < contentLength+fragmentLength) {
|
|
mm = {...m};
|
|
mm.multipart = true;
|
|
mm.multipartid = digestHex;
|
|
mm.multipartnext = true;
|
|
mm.hugocontent = hugocontent.slice(x*fragmentLength, (x+1)*fragmentLength == contentLength ? contentLength : Math.min(contentLength, (x+1)*fragmentLength))
|
|
console.log(x*fragmentLength, (x+1)*fragmentLength, "hugocontent(start):", m.hugocontent.slice(0, 32), "hugocontent(end):", m.hugocontent.slice(m.hugocontent.length - 32))
|
|
messageQueue[digestHex].push(mm)
|
|
x++;
|
|
}
|
|
nh.postMessage(messageQueue[digestHex].shift())
|
|
} else {
|
|
console.log("messageLength less than 61440:", messageLength)
|
|
m["multipart"] = false;
|
|
m["multipartnext"] = false;
|
|
m["multipartid"] = digestHex;
|
|
nh.postMessage(m);
|
|
}
|
|
|
|
nh.onMessage.addListener((m, n)=> {
|
|
console.log("native host message:", m)
|
|
console.log("native host sender:", n)
|
|
if (m.action == "redirect") {
|
|
chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {
|
|
chrome.tabs.sendMessage(tabs[0].id, { msg: m.actionid }, (response) => {
|
|
if (response) {
|
|
console.log(response)
|
|
}
|
|
});
|
|
})
|
|
console.log(m.actionid)
|
|
} else if (m.action == "nextMessage") {
|
|
if (messageQueue[m.actionid].length == 1) {
|
|
let mm = messageQueue[m.actionid][0];
|
|
mm.multipartnext = false;
|
|
messageQueue[m.actionid] = [];
|
|
nh.postMessage(mm);
|
|
} else {
|
|
nh.postMessage(messageQueue[m.actionid].shift())
|
|
}
|
|
}
|
|
})
|
|
})
|
|
|
|
|