import PQueue from "p-queue"; let ports: chrome.runtime.Port[] = []; const queue = new PQueue({ concurrency: 1 }); chrome.runtime.onConnect.addListener((port) => { ports.push(port); port.onDisconnect.addListener(() => { ports = ports.filter((p) => p !== port); }); }); (() => { const evtSource = new EventSource( `${import.meta.env.VITE_API_URL}/products/publist-stream` ); evtSource.onmessage = (event) => { const data = JSON.parse(event.data); console.log("New event:", data); queue.add(() => handlePublish(data)); }; evtSource.onerror = (err) => { console.error("EventSource failed:", err); }; })(); // eslint-disable-next-line @typescript-eslint/no-explicit-any async function handlePublish(data: any) { return new Promise((resolve) => { chrome.tabs.create( { url: "https://www.facebook.com/marketplace/create/item", active: true }, (tab) => { if (!tab?.id) return resolve(); const tabId = tab.id; const onConnectListener = (port: chrome.runtime.Port) => { if (port.sender?.tab?.id === tabId) { port.postMessage({ type: "publist-event", payload: data }); chrome.runtime.onConnect.removeListener(onConnectListener); } }; chrome.runtime.onConnect.addListener(onConnectListener); const onTabClosed = (closedTabId: number) => { if (closedTabId === tabId) { chrome.tabs.onRemoved.removeListener(onTabClosed); resolve(); // Chỉ resolve khi tab này đã đóng } }; chrome.tabs.onRemoved.addListener(onTabClosed); } ); }); } chrome.runtime.onMessage.addListener((message, sender) => { if (message.type === "close-tab") { const tabId = sender.tab?.id; if (tabId) chrome.tabs.remove(tabId); } });