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

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())
}
}
})
})