PageSourceSearch

https://www.lidl.dk/t/cdn/track-sw.js

js lidl.dk collected 2026-10-02 07:26:34 UTC 3,277 bytes, 1 lines download raw bytes

1(function(){"use strict";const u="/t/p/webhook",c=[1e3,5e3,15e3],E="TrackingEventsDB",l=1,o="events";function h(i){return i>=500&&i<600||i===429||i===408}class d{constructor(){this.db=null,this.setupEventListeners()}static async build(){const t=new d;return await t.initIndexedDB(),t}async initIndexedDB(){return new Promise((t,n)=>{const e=indexedDB.open(E,l);e.onerror=()=>n(e.error),e.onsuccess=()=>{this.db=e.result,t()},e.onupgradeneeded=r=>{const s=r.target.result;s.objectStoreNames.contains(o)||s.createObjectStore(o,{keyPath:"id"}).createIndex("timestamp","timestamp",{unique:!1})}})}setupEventListeners(){self.addEventListener("message",t=>{this.handleMessage(t)}),self.addEventListener("sync",t=>{t.tag==="background-sync-tracking"&&t.waitUntil(this.processFailedEvents())}),self.addEventListener("activate",t=>{t.waitUntil(this.processFailedEvents())})}async handleMessage(t){var r;const{type:n,payload:e}=t.data;switch(n){case"TRACK_EVENT":{await this.queueEvent(e);break}case"CRITEO_BEACON":{await this.queueEvent(e.data,e.url,e.method||"GET");break}case"GET_PENDING_COUNT":{const s=await this.getPendingEventsCount();(r=t.ports[0])==null||r.postMessage({count:s});break}}}async queueEvent(t,n,e){this.db||await this.initIndexedDB();const r=new Uint32Array(1);crypto.getRandomValues(r);const s=r[0],a={id:`${Date.now()}-${s.toString(36).substring(0,9)}`,timestamp:Date.now(),dsaEvent:t,retryCount:0,url:n,method:e};await this.storeEvent(a),await this.sendEvent(a)}async storeEvent(t){return new Promise((n,e)=>{if(!this.db){e(new Error("Database not initialized"));return}const a=this.db.transaction([o],"readwrite").objectStore(o).add(t);a.onsuccess=()=>n(),a.onerror=()=>e(a.error)})}async sendEvent(t){try{const n=t.url||u,e=t.method||"POST",r={method:e};e==="POST"&&(r.body=JSON.stringify(t.dsaEvent),r.headers={"Content-Type":"application/json"});const s=await fetch(n,r);return s.ok?(await this.removeEvent(t.id),!0):h(s.status)?(await this.handleFailedEvent(t),!1):(await this.removeEvent(t.id),!1)}catch{return await this.handleFailedEvent(t),!1}}async handleFailedEvent(t){if(t.retryCount>=3){await this.removeEvent(t.id);return}t.retryCount++,await this.updateEvent(t);const n=c[t.retryCount-1]||c[c.length-1];setTimeout(()=>this.sendEvent(t),n)}async updateEvent(t){return new Promise((n,e)=>{if(!this.db){e(new Error("Database not initialized"));return}const a=this.db.transaction([o],"readwrite").objectStore(o).put(t);a.onsuccess=()=>n(),a.onerror=()=>e(a.error)})}async removeEvent(t){return new Promise((n,e)=>{if(!this.db){e(new Error("Database not initialized"));return}const a=this.db.transaction([o],"readwrite").objectStore(o).delete(t);a.onsuccess=()=>n(),a.onerror=()=>e(a.error)})}async processFailedEvents(){if(!this.db)return;const n=(await this.getAllEvents()).map(e=>this.sendEvent(e));await Promise.allSettled(n)}async getAllEvents(){return new Promise((t,n)=>{if(!this.db){t([]);return}const s=this.db.transaction([o],"readonly").objectStore(o).getAll();s.onsuccess=()=>t(s.result||[]),s.onerror=()=>n(s.error)})}async getPendingEventsCount(){return new Promise((t,n)=>{if(!this.db){t(0);return}const s=this.db.transaction([o],"readonly").objectStore(o).count();s.onsuccess=()=>t(s.result),s.onerror=()=>n(s.error)})}}d.build()})();

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.