1/* Most med spletno aplikacijo in motorjem za prenos. Podpira DVA transporta z isto 2 pogodbo ({ok, owners, reason}), tako da app kode ni treba spreminjati: 3 1. BRSKALNIÅ KA RAZÅ IRITEV â relay content script premosti window.postMessage 4 <-> chrome.runtime; prenos teÄe v content scriptu na esodisce.si (Chrome/Edge). 5 2. LOKALNI POMOÄNIK â native program na 127.0.0.1 (deluje v vseh brskalnikih, tudi 6 Safari); app ga doseže prek HTTP (localhost je izvzet iz mixed-content blokade). 7 Za razvoj/test: window.__ZK_MOCK_DOWNLOAD(...) -> Promise<{ok, owners, bremena?, sluznosti?}> 8 povozi oboje. */ 9 10const REQ_TIMEOUT_MS = 90000; // eZK je pogosto poÄasen; ne prekini veljavnega prenosa 11const HELPER_URL = "http://127.0.0.1:8791"; 12const pending = new Map(); 13let reqSeq = 0; 14let extReady = false; 15let helperReady = false; 16 17// ââ transport 1: razÅ¡iritev (postMessage relay) âââââââââââââââââââââââââââ 18window.addEventListener("message", (ev) => { 19 // sprejmi le sporoÄila z lastnega okna in lastnega izvora (obramba pred lažnimi sporoÄili) 20 if (ev.source !== window || ev.origin !== location.origin) return; 21 const d = ev.data; 22 if (!d || d.source !== "zk-ext") return; 23 if (d.type === "ready") { extReady = true; return; } 24 const p = pending.get(d.reqId); 25 if (!p) return; 26 pending.delete(d.reqId); 27 clearTimeout(p.timer); 28 p.resolve(d); 29}); 30 31export function hasExtension() { return extReady; } 32export function hasHelper() { return helperReady; } 33/** Ali je na voljo katerikoli transport (razÅ¡iritev ali lokalni pomoÄnik ali mock)? */ 34export function hasTransport() { 35 return extReady || helperReady || typeof window.__ZK_MOCK_DOWNLOAD === "function"; 36} 37 38/** Zaznaj transporta: aktivno pingaj razÅ¡iritev (relay odgovori 'ready') in lokalni 39 pomoÄnik (GET /ping). 'ready' iz relay-a bi sicer zamudili (poÅ¡lje ga ob document_start). */ 40export async function detectTransports(ms = 1200) { 41 // Sonda za lokalni pomoÄnik SAMO, Äe je vklopljena (localStorage zk_helper=1). 42 // PomoÄnik je bodoÄa komponenta; brez tega bi vsak zagon sprožil ERR_CONNECTION_REFUSED 43 // v konzoli (zavrnjena povezava na 127.0.0.1:8791). 44 if (localStorage.getItem("zk_helper") === "1") { 45 fetch(HELPER_URL + "/ping", { method: "GET" }) 46 .then((r) => r.ok && r.json()).then((j) => { if (j && j.ok) helperReady = true; }) 47 .catch(() => {}); 48 } 49 return new Promise((res) => { 50 if (extReady) return res(true); 51 const ping = () => window.postMessage({ source: "zk-app", type: "hello" }, location.origin); 52 ping(); 53 const t = setInterval(() => { extReady ? (clearInterval(t), res(true)) : ping(); }, 100); 54 setTimeout(() => { clearInterval(t); res(hasTransport()); }, ms); 55 }); 56} 57 58// združljivostni vzdevek (starejÅ¡i klic) 59export const waitForExtension = detectTransports; 60 61// ââ transport 2: lokalni pomoÄnik (HTTP na 127.0.0.1) ââââââââââââââââââââââ 62async function downloadViaHelper(args) { 63 try { 64 const r = await fetch(HELPER_URL + "/download", { 65 method: "POST", headers: { "Content-Type": "application/json" }, 66 body: JSON.stringify(args), 67 }); 68 if (!r.ok) return { ok: false, reason: "HELPER_HTTP_" + r.status }; 69 return await r.json(); 70 } catch (e) { 71 return { ok: false, reason: "HELPER_ERR", error: String(e && e.message || e) }; 72 } 73} 74 75// ââ transport 1: prek razÅ¡iritve (postMessage) âââââââââââââââââââââââââââââ 76function downloadViaExtension(args) { 77 const reqId = "r" + (++reqSeq); 78 return new Promise((resolve) => { 79 const timer = setTimeout(() => { pending.delete(reqId); resolve({ ok: false, reason: "TIMEOUT" }); }, REQ_TIMEOUT_MS); 80 pending.set(reqId, { resolve, timer }); 81 window.postMessage({ source: "zk-app", type: "download", reqId, ...args }, location.origin); 82 }); 83} 84 85/** Prenesi + parsaj en del stavbe (ali parcelo, Äe tip='parcela'). 86 Vrne {ok, owners:[{lastnik,delez,prebivalisce,emso,rojstvo,maticna,idPolozaja}], 87 bremena:[hipoteke, kronoloÅ¡ko], sluznosti:[služnosti], reason?}. 88 obrazec (neobvezno): "03-002"/"03-012" = zgodovinski izpis â vrne SUROV PDF 89 (base64) brez parsanja lastnikov (drugaÄen format, parsa ga zgodovina.js). */ 90export async function downloadOne({ ko, stavba, del, parcela, tip, obrazec }) { 91 const args = { ko, stavba, del, parcela, tip, obrazec }; 92 let res; 93 if (typeof window.__ZK_MOCK_DOWNLOAD === "function") res = await window.__ZK_MOCK_DOWNLOAD(args); 94 else if (extReady) res = await downloadViaExtension(args); 95 else if (helperReady) res = await downloadViaHelper(args); 96 else return { ok: false, reason: "NO_TRANSPORT" }; 97 // prazen odgovor (brez ok in brez reason): content script na esodisce zavihku 98 // ni odgovoril â najpogosteje star zavihek izpred posodobitve razÅ¡iritve 99 if (!res || (res.ok === undefined && !res.reason)) { 100 res = { ok: false, reason: "PRAZEN_ODGOVOR", error: "esodisce zavihek ni odgovoril â osveži zavihek esodisce.si in poskusi znova" }; 101 } 102 // razÅ¡iritev vrne surov PDF (base64) -> razÄlenimo ga TUKAJ (naÅ¡ CSP, ne esodisce.si); 103 // base64 vrnemo naprej, da lahko aplikacija ponudi tudi prenos surovega PDF-ja 104 if (obrazec && obrazec !== "03-001") { 105 if (res && res.ok && res.pdf && res.pdf.length > 34 * 1024 * 1024) return { ok: false, reason: "PDF_PREVELIK" }; 106 return res; 107 }
108 if (res && res.ok && res.pdf && !res.owners) { 109 // Varovalka pred nenormalno velikim PDF-jem (velja za oba transporta, tudi 110 // lokalni pomoÄnik): pravi izpisi so nekaj sto KB, base64 je ~1,33x bajtov. 111 // 25 MB bajtov -> ~34 MB base64. PrepreÄi obeÅ¡anje zavihka ob parsanju. 112 if (res.pdf.length > 34 * 1024 * 1024) return { ok: false, reason: "PDF_PREVELIK" }; 113 try { 114 // pdfparse.js potegne pdf.js (336 KB) â lazy, da ne visi na zagonu aplikacije 115 const { parsePdfBase64 } = await import("./pdfparse.js?v=281"); 116 const parsed = await parsePdfBase64(res.pdf); 117 return { ok: true, owners: parsed.owners, bremena: parsed.bremena, sluznosti: parsed.sluznosti, pdf: res.pdf }; 118 } 119 catch (e) { return { ok: false, reason: "PARSE", error: String(e && e.message || e) }; } 120 } 121 return res; 122}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.