pixelass's picture
feat: 100% browser yeah baby yeah
e5ae926 unverified
raw
history blame
1.73 kB
const canvas = document.querySelector("#canvas");
const ctx = canvas.getContext("2d");
function handleResize() {
requestAnimationFrame(() => {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
});
}
handleResize();
window.addEventListener("resize", handleResize, { passive: true });
const clients = {
host: "__ESDEKA::host__",
guest: "__ESDEKA::guest__",
};
// Shared communicators
function subscribe(channel, callback) {
function handleMessage(event) {
if (
event.data.client &&
Object.values(clients).includes(event.data.client) &&
event.data.channel === channel
) {
callback(event);
}
}
window.addEventListener("message", handleMessage);
return () => {
window.removeEventListener("message", handleMessage);
};
}
const host = {};
// Guest communicators
function answer(window_, channel, targetOrigin = "*") {
window_.postMessage(
{
client: clients.guest,
channel,
action: {
type: "answer",
},
},
targetOrigin
);
}
function handleTemplate(template) {
for (let i = 1; i < 100_000_000; i++) {
window.clearInterval(i);
window.cancelAnimationFrame(i);
window.clearTimeout(i);
}
Function("Template", `${template};`)();
}
subscribe("fail4", event => {
console.log("GUEST", event);
const { action } = event.data;
switch (action.type) {
case "call":
host.current = event.source;
answer(event.source, "fail4");
ctx.clearRect(0, 0, canvas.width, canvas.height);
handleTemplate(action.payload.template);
break;
case "broadcast":
console.log("broadcast", action.payload.template);
ctx.clearRect(0, 0, canvas.width, canvas.height);
handleTemplate(action.payload.template);
break;
default:
break;
}
});