PageSourceSearch

https://parcelnik.si/js/bridge.js?v=281

js parcelnik.si collected 2026-09-24 15:11:37 UTC 6,337 bytes, 122 lines download raw bytes

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.