Files
omnivore/apple/Sources/SafariExtension/Resources/scripts/background.js
2022-07-16 12:25:51 -07:00

1 line
9.2 KiB
JavaScript

(()=>{"use strict";var e,t=new Uint8Array(16);function n(){if(!e&&!(e="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return e(t)}const o=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,s=function(e){return"string"==typeof e&&o.test(e)};for(var r=[],a=0;a<256;++a)r.push((a+256).toString(16).substr(1));const i=function(e,t,o){var a=(e=e||{}).random||(e.rng||n)();if(a[6]=15&a[6]|64,a[8]=63&a[8]|128,t){o=o||0;for(var i=0;i<16;++i)t[o+i]=a[i];return t}return function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=(r[e[t+0]]+r[e[t+1]]+r[e[t+2]]+r[e[t+3]]+"-"+r[e[t+4]]+r[e[t+5]]+"-"+r[e[t+6]]+r[e[t+7]]+"-"+r[e[t+8]]+r[e[t+9]]+"-"+r[e[t+10]]+r[e[t+11]]+r[e[t+12]]+r[e[t+13]]+r[e[t+14]]+r[e[t+15]]).toLowerCase();if(!s(n))throw TypeError("Stringified UUID is invalid");return n}(a)};let u;const c="https://omnivore.app",d="https://api-prod.omnivore.app/api/";function l(e){return new Promise((t=>{browserApi.storage.local.get(e,(n=>{const o=n&&n[e]||null;t(o)}))}))}function p(e){return new Promise((t=>{browserApi.storage.local.set(e,t)}))}function f(e){return new Promise((t=>{browserApi.storage.local.remove(e,t)}))}function g(e){e.setRequestHeader("Content-Type","application/json"),u&&e.setRequestHeader("Authorization",u)}function b(){l("postInstallClickComplete").then((e=>{e&&f("postInstallClickComplete")}))}async function w(e,t,n,o){return browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{type:"loading",text:"Saving..."}}),new Promise(((s,r)=>{const a=new XMLHttpRequest;a.open("POST",d+"graphql",!0),g(a),a.onerror=e=>{r(e)},a.onload=()=>{try{const t=function(e,t,n){if(4===n.readyState){if(200===n.status){const{data:o}=JSON.parse(n.response),s=o[t];if(!s)return;if("errorCodes"in s){const t={text:descriptions[o.createArticle.errorCodes[0]]||"Unable to save page",type:"error"};return"UNAUTHORIZED"===s.errorCodes[0]&&(t.errorCode=401,t.url=c,b()),void browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:t})}const r=s.url;return browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{text:"Saved to Omnivore",link:r??c+"/home",linkText:"Read Now",type:"success"}}),s}if(400===n.status)return void browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{text:"Unable to save page",type:"error"}})}}(e,n,a);if(!t)return r();s(t)}catch(e){r(e)}};const i=JSON.stringify({query:t,variables:{input:o}});a.send(i)})).catch((t=>{console.log("error saving page",t),browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{text:"Unable to save page",type:"error"}})}))}function y(e){browserApi.tabs.sendMessage(e.id,{action:ACTIONS.GetContent},(async t=>{if(!t||"object"!=typeof t)return;const n=i(),{type:o,pageInfo:s,doc:r,uploadContentObjUrl:a}=t;switch(o){case"html":await w(e,SAVE_PAGE_QUERY,"savePage",{source:"extension",clientRequestId:n,originalContent:r,title:s.title,url:encodeURI(e.url)});break;case"url":await w(e,SAVE_URL_QUERY,"saveUrl",{source:"extension",clientRequestId:n,url:encodeURI(e.url)});break;case"pdf":{const t=await function(e,t,n,o){return new Promise((s=>{const r=new XMLHttpRequest;r.onreadystatechange=async function(){if(4===r.readyState){if(200===r.status){const{data:t}=JSON.parse(r.response);if("errorCodes"in t.uploadFileRequest&&"UNAUTHORIZED"===t.uploadFileRequest.errorCodes[0]&&(b(),browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{text:"Unable to save page",type:"error",errorCode:401,url:c}})),t.uploadFileRequest&&t.uploadFileRequest.id&&t.uploadFileRequest.createdPageId&&!("errorCodes"in t.uploadFileRequest)){const r=await function({id:e,uploadSignedUrl:t},n,o){return fetch(o).then((e=>e.blob())).then((o=>new Promise((s=>{const r=new XMLHttpRequest;r.open("PUT",t,!0),r.setRequestHeader("Content-Type",n),r.onerror=()=>{s(void 0)},r.onload=()=>{s({id:e})},r.send(o)})))).catch((e=>{console.error("error uploading file",e)}))}(t.uploadFileRequest,n,o);if(URL.revokeObjectURL(o),!r)return;const a=t.uploadFileRequest.createdPageId,i=c+"/article/sr/"+a;return browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{text:"Saved to Omnivore",link:i,linkText:"Read Now",type:"success"}}),s(t.uploadFileRequest)}browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{text:"Unable to save page",type:"error"}})}else 400===r.status&&browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{text:"Unable to save page",type:"error"}});s(!1)}};const a=JSON.stringify({query:"mutation UploadFileRequest($input: UploadFileRequestInput!) {\n uploadFileRequest(input:$input) {\n ... on UploadFileRequestError {\n errorCodes\n }\n ... on UploadFileRequestSuccess {\n id\n createdPageId\n uploadSignedUrl\n }\n }\n }",variables:{input:{url:t,contentType:n,createPageEntry:!0}}});r.open("POST",d+"graphql",!0),g(r),r.send(a)}))}(e,encodeURI(e.url),s.contentType,a);if(!t||!t.id)return void await w(e,SAVE_URL_QUERY,"saveUrl",{source:"extension",clientRequestId:n,url:encodeURI(e.url)});break}}}))}async function A(e){const t=await l(e+"_saveInProgress");if(!t)return;clearInterval(t);const n=await l(e+"_saveInProgressTimeoutId_"+t);n&&clearTimeout(n)}function h(e){return l("postInstallClickComplete").then((async t=>{if(t)return!0;if("undefined"!=typeof browser&&browser.runtime&&browser.runtime.sendNativeMessage){const e=await browser.runtime.sendNativeMessage("omnivore",{message:ACTIONS.GetAuthToken});e.authToken&&(u=e.authToken)}return new Promise((t=>{const n=new XMLHttpRequest;n.onreadystatechange=function(){if(4===n.readyState&&200===n.status){const{data:o}=JSON.parse(n.response);o.me?(p({postInstallClickComplete:!0}),t(!0)):(browserApi.tabs.sendMessage(e,{action:ACTIONS.ShowMessage,payload:{type:"loading",text:"Loading..."}}),browserApi.tabs.sendMessage(e,{action:ACTIONS.ShowMessage,payload:{text:"",type:"error",errorCode:401,url:c}}),t(null))}};const o=JSON.stringify({query:"{me{id}}"});n.open("POST",d+"graphql",!0),g(n),n.send(o)}))}))}function S(e){new Promise((e=>{browserApi.tabs.query({active:!0,currentWindow:!0},(function(t){e(t[0]||null)}))})).then((t=>{browserApi.tabs.sendMessage(t.id,{action:ACTIONS.Ping},(async function(n){if(n&&n.pong)await h(t.id)&&e(t);else{const n=browserApi.runtime.getManifest().content_scripts,o=[...n[0].js,...n[1].js];!function(n,o,s){function r(e,t,n){return function(){browserScriptingApi.executeScript(e,t,n)}}let a=async function(){await h(t.id)&&e(t)};for(let e=o.length-1;e>=0;--e)a=r(n,{file:o[e]},a);null!==a&&a()}(t.id,o)}}))}))}function v(e,t){let n="/images/toolbar/icon";if(ENV_IS_FIREFOX?n+="_firefox":ENV_IS_EDGE&&(n+="_edge"),e||(n+="_inactive"),("boolean"==typeof t?t:window.matchMedia("(prefers-color-scheme: dark)").matches)&&(n+="_dark"),ENV_IS_FIREFOX)return n+".svg";const o=["16","24","32","48"];ENV_IS_EDGE||o.push("19","38");const s={};for(let e=0;e<o.length;e++){const t=o[e];s[t]=n+"-"+t+".png"}return s}function m(e,t,n){browserActionApi.setIcon({path:v(t,n),tabId:e})}function I(e){const t=e&&e.id;t&&m(t,function(e){if("complete"!==e.status)return!1;const t=e.pendingUrl||e.url;return!(!t||!t.startsWith("https://")&&!t.startsWith("http://")||t.startsWith("https://omnivore.app/")&&t.startsWith("https://dev.omnivore.app/"))}(e))}browserApi.tabs.onActivated.addListener((({tabId:e})=>{!function t(){browserApi.tabs.get(e,(function(e){browserApi.runtime.lastError&&setTimeout(t,150),I(e)}))}()})),browserApi.tabs.onUpdated.addListener(((e,t,n)=>{t.status&&n&&n.active&&I(n)})),browserApi.tabs.onRemoved.addListener((e=>{!function(e){new Promise((e=>{browserApi.storage.local.get(null,(t=>{e(t||{})}))})).then((function(t){const n=[],o=Object.keys(t),s=e+"_saveInProgress";for(let e=0;e<o.length;e++){const t=o[e];t.startsWith(s)&&n.push(t)}0!==n.length&&f(n)}))}(e)})),browserActionApi.onClicked.addListener((function(){S((function(e){!function(e){function t(t,n){browserApi.tabs.get(e,(e=>{"complete"!==e.status?(browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{type:"loading",text:"Page loading..."}}),n&&"function"==typeof n&&n()):(t&&"function"==typeof t&&t(),y(e))}))}A(e),t(null,(()=>{!function(e,t,n,o=1e3,s=10500){const r=setInterval(e,o),a=setTimeout((()=>{clearInterval(r),t()}),s);n&&"function"==typeof n&&n(r,a)}((()=>{t((()=>{A(e)}))}),(()=>{A(e),browserApi.tabs.get(e,(e=>{y(e)}))}),((t,n)=>{const o={};o[e+"_saveInProgress"]=t,o[e+"_saveInProgressTimeoutId_"+t]=n,p(o)}))}))}(e.id)}))})),browserApi.runtime.onMessage.addListener(((e,t,n)=>{if(e.forwardToTab)return delete e.forwardToTab,void browserApi.tabs.sendRequest(t.tab.id,e);e.action===ACTIONS.RefreshDarkMode&&m(t.tab.id,e.payload.value)})),browserActionApi.setIcon({path:v(!0)}),browserApi.contextMenus.create({id:"save-selection",title:"Save to Omnivore",contexts:["link"],onclick:async function(e){S((async function(t){await async function(e,t){const n=i();await w(e,SAVE_URL_QUERY,"saveUrl",{source:"extension",clientRequestId:n,url:encodeURI(t)})}(t,e.linkUrl)}))}})})();