listing-facebook/auto-listing-facebook-marke.../src/background.ts

64 lines
1.8 KiB
TypeScript

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