aboutsummaryrefslogtreecommitdiffstats
path: root/src/background/run-ocr.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/background/run-ocr.ts')
-rw-r--r--src/background/run-ocr.ts42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/background/run-ocr.ts b/src/background/run-ocr.ts
new file mode 100644
index 0000000..4476f54
--- /dev/null
+++ b/src/background/run-ocr.ts
@@ -0,0 +1,42 @@
+const OFFSCREEN_DOCUMENT_PATH = "offscreen/ocr/index.html";
+
+// Function to ensure the offscreen document is open
+async function setupOffscreenDocument() {
+ if (await chrome.offscreen.hasDocument()) {
+ return; // Offscreen document already open
+ }
+ await chrome.offscreen.createDocument({
+ url: OFFSCREEN_DOCUMENT_PATH,
+ reasons: [chrome.offscreen.Reason.CLIPBOARD],
+ justification: "Performing OCR with Tesseract.js in a long-running context."
+ });
+}
+
+// Listen for messages from content scripts (and popup if applicable)
+chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
+ if (message.type === "OCR" && message.dataURL) {
+ (async () => {
+ try {
+ // Ensure the offscreen document is open
+ await setupOffscreenDocument();
+
+ // Send the OCR request to the offscreen document
+ const offscreenResponse = await chrome.runtime.sendMessage({
+ type: "OFFSCREEN_OCR_REQUEST",
+ dataURL: message.dataURL
+ });
+
+ if (offscreenResponse && offscreenResponse.success) {
+ sendResponse({ success: true, text: offscreenResponse.text });
+ } else {
+ sendResponse({ success: false, error: offscreenResponse?.error || "Unknown OCR error" });
+ }
+ } catch (error) {
+ sendResponse({ success: false, error: (error as Error).message });
+ }
+ })();
+ return true; // Indicate async response
+ }
+
+ return false;
+});