UNPKG

tattica

Version:

Tactical and adaptive asset loading library

2 lines (1 loc) 3.94 kB
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.tattica=e()}(this,function(){var t=function(t,e){return t[e]?t[e].value:null},e=function(t,e){var r=t.el,i=t.src,n=t.timestamp,o=t.timeout,a=t.callback,u=i[e.string]||i.medium||i.slow||i.default,l=r.attributes["data-is-loaded"];return new Promise(function(c,s){l&&c(),o&&setTimeout(c,o),r.onload=function(){r.style.visibility="visible",r.setAttribute("data-is-loaded",!0),n&&r.setAttribute("data-timestamp-loaded",Date.now()),a&&a(r),c()},r.onerror=function(o){var a=i.fall||"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=",u={err:o,ref:e.ref,fall:i.fall,fallUsed:a,key:t.key};n&&r.setAttribute("data-timestamp-loaded",Date.now()),r.src=a,s(u)},n&&r.setAttribute("data-timestamp-start",Date.now()),r.src=u})},r=function(t){var e=console.error;e("\n The '"+t.ref+"' attribute you inserted in element at key '"+t.key+"' is invalid. \n The 'data-src-fall' provided is: "+t.fall+"\n Fallback used: "+t.fallUsed+"\n "),e(t.err.target)},i=function(){return new Promise(function(t){window.requestIdleCallback(function(){t()},{timeout:2e3})})},n=function(t,o,a,u){void 0===u&&(u=0);try{function l(){return Promise.resolve(i()).then(function(){n(t,o,a,c)})}var c=u+1,s=t[u];if(!s)return a(),Promise.resolve();var d=s.order,f=d.dataBlock||d.dataPriorityBlock,m=function(){if(f){var i=t.filter(function(t){return t.order.dataBlock===f||t.order.dataPriorityBlock===f});return Promise.resolve(function(t,i){return new Promise(function(n){for(var o=[],a=0,u=t;a<u.length;a+=1)o.push(e(u[a],i).catch(r));Promise.all(o).then(function(){return n()})})}(i,o)).then(function(){})}return Promise.resolve(e(s,o).catch(r)).then(function(){})}();return Promise.resolve(m&&m.then?m.then(l):l())}catch(t){return Promise.reject(t)}},o=function(t,e){return new Promise(function(r){return n(t,e,r)})};return function(e){void 0===e&&(e={});var r=document.querySelectorAll("["+(e.flag||"data-flag")+"]"),i=function(e,r){var i=[];return e.forEach(function(e,n){var o=e.attributes;i.push({el:e,key:n,timestamp:r.timestamp,timeout:void 0!==r.timeout?r.timeout:1e3,priority:Number(t(o,"data-priority")||t(o,"data-priority-block"))||null,order:{dataPriority:t(o,"data-priority"),dataPriorityBlock:t(o,"data-priority-block"),dataBlock:t(o,"data-block")},src:{initial:t(o,"src"),default:t(o,"data-src"),medium:t(o,"data-src-medium"),slow:t(o,"data-src-slow"),fall:t(o,"data-src-fall")},callback:r.callback||null})}),i}(r,e),n=function(){if(void 0===navigator.connection)return{string:"default",ref:"data-src"};var t,e,r=navigator.connection.effectiveType.split("g")[0],i=Number(r.match(/\d/)[0]);return i<3?(t="slow",e="data-src-slow"):i<4?(t="medium",e="data-src-medium"):(t="default",e="data-src"),{num:i,string:t,ref:e}}();!function(t,e){void 0===e&&(e="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="),t.forEach(function(t){var r=t.el;r.src&&""!==r.src||(r.style.visibility="hidden",r.src=e)})}(i,e.string),window.addEventListener("load",function(){e.loadIntersections&&function(t){var e=Object.keys(t).map(function(e){return t[e]}),r=new IntersectionObserver(function(t){t.forEach(function(t){if(t.isIntersecting&&!t.target.attributes["data-is-loaded"]){var e=t.target;e.style.visibility="visible",e.src=e.attributes["data-src"].value,e.setAttribute("data-is-loaded",!0)}})},{root:null,rootMargin:"0px",threshold:.2});e.forEach(function(t){r.observe(t)})}(r),window.requestIdleCallback(function(){try{var t=function(t){return{withPriority:t.filter(function(t){return t.order.dataPriority||t.order.dataPriorityBlock}).sort(function(t,e){return t.priority-e.priority}),others:t.filter(function(t){return!t.priority})}}(i);return Promise.resolve(o(t.withPriority,n)).then(function(){return Promise.resolve(o(t.others,n)).then(function(){})})}catch(t){return Promise.reject(t)}},{timeout:2e3})})}});