omnivore/apple/Sources/SafariExtension/Resources/scripts/background.js
2023-05-24 17:42:32 +08:00

1 line
No EOL
9.2 KiB
JavaScript

(()=>{"use strict";var e,t=new Uint8Array(16);function a(){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 s=/^(?:[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;for(var n=[],o=0;o<256;++o)n.push((o+256).toString(16).substr(1));const r=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,a=(n[e[t+0]]+n[e[t+1]]+n[e[t+2]]+n[e[t+3]]+"-"+n[e[t+4]]+n[e[t+5]]+"-"+n[e[t+6]]+n[e[t+7]]+"-"+n[e[t+8]]+n[e[t+9]]+"-"+n[e[t+10]]+n[e[t+11]]+n[e[t+12]]+n[e[t+13]]+n[e[t+14]]+n[e[t+15]]).toLowerCase();if(!function(e){return"string"==typeof e&&s.test(e)}(a))throw TypeError("Stringified UUID is invalid");return a},i=function(e,t,s){var n=(e=e||{}).random||(e.rng||a)();if(n[6]=15&n[6]|64,n[8]=63&n[8]|128,t){s=s||0;for(var o=0;o<16;++o)t[s+o]=n[o];return t}return r(n)},d="https://omnivore.app",c="https://api-prod.omnivore.app/api/";let u=[],l={};async function p(e,t){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:e,contentType:t,createPageEntry:!0}}}),s="uploadFileRequest",n=await gqlRequest(c+"graphql",a);if(!n[s].errorCodes)return n.uploadFileRequest;"UNAUTHORIZED"===n[s].errorCodes[0]?(browserApi.tabs.sendMessage(currentTab.id,{action:ACTIONS.UpdateStatus,payload:{target:"logged_out",status:"logged_out",message:"You are not logged in.",ctx:toolbarCtx}}),g()):browserApi.tabs.sendMessage(currentTab.id,{action:ACTIONS.UpdateStatus,payload:{status:"failure",message:"Unable to save page.",ctx:toolbarCtx}})}function g(){getStorageItem("postInstallClickComplete").then((e=>{e&&removeStorage("postInstallClickComplete")}))}async function f(e,t){const a=i();await b(e,SAVE_URL_QUERY,"saveUrl",{source:"extension",clientRequestId:a,url:encodeURI(t)})}async function b(e,t,a,s){const n={omnivoreURL:d,originalURL:s.url,requestId:s.clientRequestId};l[n.requestId]=void 0;const o=JSON.stringify({query:t,variables:{input:s}});browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowToolbar,payload:{type:"loading",ctx:n}});try{const t=await gqlRequest(c+"graphql",o);if(t[a].errorCodes)return void("UNAUTHORIZED"===t[a].errorCodes[0]?(browserApi.tabs.sendMessage(e.id,{action:ACTIONS.UpdateStatus,payload:{target:"logged_out",status:"logged_out",message:"You are not logged in.",ctx:n}}),g()):browserApi.tabs.sendMessage(e.id,{action:ACTIONS.UpdateStatus,payload:{status:"failure",message:"Unable to save page.",ctx:n}}));const s=t[a]?t[a].url:void 0,r=t[a]?t[a].clientRequestId:void 0;browserApi.tabs.sendMessage(e.id,{action:ACTIONS.UpdateStatus,payload:{status:"success",target:"page",ctx:{readerURL:s,responseId:r,requestId:n.requestId}}}),l[n.requestId]={readerURL:s,responseId:r,requestId:n.requestId}}catch(e){console.log("error saving: ",e)}y(e.id)}function I(e,t,a,s){browserApi.tabs.sendMessage(e,{action:ACTIONS.UpdateStatus,payload:{target:t,status:a,message:s}})}async function y(e){u.filter((t=>t.tabId===e)).forEach((async t=>{let a=!1;const s=l[t.clientRequestId];if(s)switch(t.type){case"EDIT_TITLE":a=await async function(e,t,a){return updatePageTitle(c+"graphql",a.responseId,t.title).then((()=>(I(e,"title","success","Title updated."),!0))).catch((t=>(console.log("caught error updating title: ",t),I(e,"title","failure","Error updating title."),!0)))}(e,t,s);break;case"SET_LABELS":a=await async function(e,t,a){return setLabels(c+"graphql",a.responseId,t.labelIds).then((()=>(I(e,"labels","success","Labels updated."),!0))).catch((()=>(I(e,"labels","failure","Error updating labels."),!0)))}(e,t,s)}if(a){const e=u.findIndex((e=>t.id===e.id));e>-1&&u.splice(e,1)}}))}async function h(e){browserApi.tabs.sendMessage(e.id,{action:ACTIONS.GetContent},(async t=>{if(!t||"object"!=typeof t)return void await f(e,e.url);const a=i();var{type:s}=t;const{pageInfo:n,doc:o,uploadContentObjUrl:r}=t;switch("html"==s&&handleBackendUrl(e.url)&&(s="url"),s){case"html":await b(e,SAVE_PAGE_QUERY,"savePage",{source:"extension",clientRequestId:a,originalContent:o,title:n.title,url:encodeURI(e.url)});break;case"url":await b(e,SAVE_URL_QUERY,"saveUrl",{source:"extension",clientRequestId:a,url:encodeURI(e.url)});break;case"pdf":{const t=await async function(e,t,a,s,n){const o={omnivoreURL:d,originalURL:t,requestId:a};l[o.requestId]=void 0,browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowToolbar,payload:{type:"loading",ctx:o}});const r=await p(t,s);console.log("done uploading pdf",r);const i=await function({id:e,uploadSignedUrl:t},a,s){return fetch(s).then((e=>e.blob())).then((e=>fetch(t,{method:"PUT",headers:{"Content-Type":a},body:e}))).catch((e=>{console.error("error uploading file",e)}))}(r,s,n);return console.log(" uploadFileResult: ",i),URL.revokeObjectURL(n),i&&r.createdPageId&&(l[o.requestId]={requestId:o.requestId,responseId:r.createdPageId},browserApi.tabs.sendMessage(e.id,{action:ACTIONS.UpdateStatus,payload:{status:"success",target:"page",ctx:{requestId:o.requestId,responseId:r.createdPageId}}})),i}(e,encodeURI(e.url),a,n.contentType,r);if(!t||!t.id)return void await b(e,SAVE_URL_QUERY,"saveUrl",{source:"extension",clientRequestId:a,url:encodeURI(e.url)});break}}}))}async function w(e){const t=await getStorageItem(e+"_saveInProgress");if(!t)return;clearInterval(t);const a=await getStorageItem(e+"_saveInProgressTimeoutId_"+t);a&&clearTimeout(a)}function A(e){return getStorageItem("postInstallClickComplete").then((async e=>!0))}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(a){if(a&&a.pong)await A(t.id)&&e(t);else{const a=browserApi.runtime.getManifest().content_scripts,s=[...a[0].js,...a[1].js];!function(a,s,n){function o(e,t,a){return function(){browserScriptingApi.executeScript(e,t,a)}}let r=async function(){await A(t.id)&&e(t)};for(let e=s.length-1;e>=0;--e)r=o(a,{file:s[e]},r);null!==r&&r()}(t.id,s)}}))}))}function v(e,t){let a="/images/toolbar/icon";if(ENV_IS_FIREFOX?a+="_firefox":ENV_IS_EDGE&&(a+="_edge"),e||(a+="_inactive"),("boolean"==typeof t?t:window.matchMedia("(prefers-color-scheme: dark)").matches)&&(a+="_dark"),ENV_IS_FIREFOX)return a+".svg";const s=["16","24","32","48"];ENV_IS_EDGE||s.push("19","38");const n={};for(let e=0;e<s.length;e++){const t=s[e];n[t]=a+"-"+t+".png"}return n}function m(e,t,a){browserActionApi.setIcon({path:v(t,a),tabId:e})}function U(e){const t=e&&e.id;if(!t)return;const a=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);m(t,a)}browserApi.tabs.onActivated.addListener((({tabId:e})=>{!function t(){browserApi.tabs.get(e,(function(e){browserApi.runtime.lastError&&setTimeout(t,150),U(e)}))}()})),browserApi.tabs.onUpdated.addListener(((e,t,a)=>{t.status&&a&&a.active&&U(a)})),browserApi.tabs.onRemoved.addListener((e=>{!function(e){getStorage().then((function(t){const a=[],s=Object.keys(t),n=e+"_saveInProgress";for(let e=0;e<s.length;e++){const t=s[e];t.startsWith(n)&&a.push(t)}0!==a.length&&removeStorage(a)}))}(e)})),browserActionApi.onClicked.addListener((function(){S((function(e){!function(e){function t(t,a){browserApi.tabs.get(e,(async e=>{if("complete"!==e.status)browserApi.tabs.sendMessage(e.id,{action:ACTIONS.ShowMessage,payload:{type:"loading",text:"Page loading..."}}),a&&"function"==typeof a&&a();else{t&&"function"==typeof t&&t(),await h(e);try{await updateLabelsCache(c+"graphql",e),browserApi.tabs.sendMessage(e.id,{action:ACTIONS.LabelCacheUpdated,payload:{}})}catch(e){return void console.error("error fetching labels",e,c)}}}))}w(e),t(null,(()=>{!function(e,t,a,s=1e3,n=10500){const o=setInterval(e,s),r=setTimeout((()=>{clearInterval(o),t()}),n);a&&"function"==typeof a&&a(o,r)}((()=>{t((()=>{w(e)}))}),(()=>{w(e),browserApi.tabs.get(e,(async e=>{await h(e)}))}),((t,a)=>{const s={};s[e+"_saveInProgress"]=t,s[e+"_saveInProgressTimeoutId_"+t]=a,setStorage(s)}))}))}(e.id)}))})),browserApi.runtime.onMessage.addListener(((e,t,a)=>{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),e.action===ACTIONS.EditTitle&&(u.push({id:i(),type:"EDIT_TITLE",tabId:t.tab.id,title:e.payload.title,clientRequestId:e.payload.ctx.requestId}),y(t.tab.id)),e.action===ACTIONS.SetLabels&&(u.push({id:i(),type:"SET_LABELS",tabId:t.tab.id,labelIds:e.payload.labelIds,clientRequestId:e.payload.ctx.requestId}),y(t.tab.id))})),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 f(t,e.linkUrl)}))}})})();