allow to rename the profile without a browser restart and remove old sockets and registry entry when browser closes
This commit is contained in:
+53
-7
@@ -8,27 +8,53 @@
|
||||
|
||||
const NATIVE_HOST = "com.browsercli.host";
|
||||
let port = null;
|
||||
let keepaliveEnabled = true;
|
||||
|
||||
// ── Connection management ─────────────────────────────────────────────────────
|
||||
|
||||
function sendControlMessage(targetPort, message) {
|
||||
if (!targetPort) return;
|
||||
try {
|
||||
targetPort.postMessage(message);
|
||||
} catch (e) {
|
||||
console.warn("[browser-cli] Failed to send control message:", e);
|
||||
}
|
||||
}
|
||||
|
||||
function disconnectPort({ sendBye = false } = {}) {
|
||||
const currentPort = port;
|
||||
if (!currentPort) return;
|
||||
|
||||
if (sendBye) sendControlMessage(currentPort, { type: "bye" });
|
||||
|
||||
if (port === currentPort) port = null;
|
||||
|
||||
try {
|
||||
currentPort.disconnect();
|
||||
} catch (e) {
|
||||
console.warn("[browser-cli] Failed to disconnect native port:", e);
|
||||
}
|
||||
}
|
||||
|
||||
async function getProfileAlias() {
|
||||
const { profileAlias } = await chrome.storage.local.get("profileAlias");
|
||||
return profileAlias || "default";
|
||||
}
|
||||
|
||||
async function connect() {
|
||||
if (port) return;
|
||||
if (port || !keepaliveEnabled) return;
|
||||
try {
|
||||
port = chrome.runtime.connectNative(NATIVE_HOST);
|
||||
port.onMessage.addListener(onMessage);
|
||||
port.onDisconnect.addListener(() => {
|
||||
port = null;
|
||||
const nativePort = chrome.runtime.connectNative(NATIVE_HOST);
|
||||
port = nativePort;
|
||||
nativePort.onMessage.addListener(onMessage);
|
||||
nativePort.onDisconnect.addListener(() => {
|
||||
if (port === nativePort) port = null;
|
||||
const err = chrome.runtime.lastError;
|
||||
if (err) console.warn("[browser-cli] Native host disconnected:", err.message);
|
||||
});
|
||||
// Send hello so native host knows which profile/alias this is
|
||||
const alias = await getProfileAlias();
|
||||
port.postMessage({ type: "hello", alias });
|
||||
nativePort.postMessage({ type: "hello", alias });
|
||||
console.log("[browser-cli] Connected to native host as profile:", alias);
|
||||
} catch (e) {
|
||||
port = null;
|
||||
@@ -38,12 +64,26 @@ async function connect() {
|
||||
|
||||
chrome.runtime.onInstalled.addListener(connect);
|
||||
chrome.runtime.onStartup.addListener(connect);
|
||||
chrome.runtime.onSuspend.addListener(() => {
|
||||
disconnectPort({ sendBye: true });
|
||||
});
|
||||
chrome.windows.onCreated.addListener(() => {
|
||||
keepaliveEnabled = true;
|
||||
if (!port) connect();
|
||||
});
|
||||
chrome.windows.onRemoved.addListener(async () => {
|
||||
const windows = await chrome.windows.getAll({});
|
||||
if (windows.length > 0) return;
|
||||
|
||||
keepaliveEnabled = false;
|
||||
disconnectPort({ sendBye: true });
|
||||
});
|
||||
|
||||
// Keepalive alarm — prevents service worker suspension and reconnects if needed
|
||||
chrome.alarms.create("keepalive", { periodInMinutes: 0.4 });
|
||||
chrome.alarms.onAlarm.addListener((alarm) => {
|
||||
if (alarm.name === "keepalive") {
|
||||
if (!port) connect();
|
||||
if (!port && keepaliveEnabled) connect();
|
||||
}
|
||||
});
|
||||
|
||||
@@ -69,6 +109,12 @@ async function onMessage(msg) {
|
||||
console.log("[browser-cli] →", command, data);
|
||||
port.postMessage({ id, success: true, data });
|
||||
}
|
||||
|
||||
if (command === "clients.rename_profile" && error === undefined) {
|
||||
disconnectPort({ sendBye: true });
|
||||
keepaliveEnabled = true;
|
||||
await connect();
|
||||
}
|
||||
}
|
||||
|
||||
async function dispatch(command, args) {
|
||||
|
||||
Reference in New Issue
Block a user