wxt
Version:
⚡ Next-gen Web Extension Framework
64 lines (61 loc) • 2.02 kB
JavaScript
function print(method, ...args) {
if (import.meta.env.MODE === "production") return;
if (typeof args[0] === "string") {
const message = args.shift();
method(`[wxt] ${message}`, ...args);
} else {
method("[wxt]", ...args);
}
}
const logger = {
debug: (...args) => print(console.debug, ...args),
log: (...args) => print(console.log, ...args),
warn: (...args) => print(console.warn, ...args),
error: (...args) => print(console.error, ...args)
};
let ws;
function getDevServerWebSocket() {
if (import.meta.env.COMMAND !== "serve")
throw Error(
"Must be running WXT dev command to connect to call getDevServerWebSocket()"
);
if (ws == null) {
const serverUrl = __DEV_SERVER_ORIGIN__;
logger.debug("Connecting to dev server @", serverUrl);
ws = new WebSocket(serverUrl, "vite-hmr");
ws.addWxtEventListener = ws.addEventListener.bind(ws);
ws.sendCustom = (event, payload) => ws?.send(JSON.stringify({ type: "custom", event, payload }));
ws.addEventListener("open", () => {
logger.debug("Connected to dev server");
});
ws.addEventListener("close", () => {
logger.debug("Disconnected from dev server");
});
ws.addEventListener("error", (event) => {
logger.error("Failed to connect to dev server", event);
});
ws.addEventListener("message", (e) => {
try {
const message = JSON.parse(e.data);
if (message.type === "custom") {
ws?.dispatchEvent(
new CustomEvent(message.event, { detail: message.data })
);
}
} catch (err) {
logger.error("Failed to handle message", err);
}
});
}
return ws;
}
if (import.meta.env.COMMAND === "serve") {
try {
const ws = getDevServerWebSocket();
ws.addWxtEventListener("wxt:reload-page", (event) => {
if (event.detail === location.pathname.substring(1)) location.reload();
});
} catch (err) {
logger.error("Failed to setup web socket connection with dev server", err);
}
}