aboutsummaryrefslogtreecommitdiffstats
path: root/app/scripts/lib/ens-ipfs/setup.js
diff options
context:
space:
mode:
authorkumavis <aaron@kumavis.me>2018-10-26 10:24:30 +0800
committerkumavis <aaron@kumavis.me>2018-10-26 10:24:30 +0800
commit9b42416fc0d92662d1a21759db357e7f439d7a7b (patch)
tree4fb658d739a7127d4c18a22b4abe556bfc3a194e /app/scripts/lib/ens-ipfs/setup.js
parent9b501b7c42ebebb61ac3130d1e84d36efcac9b7e (diff)
parent55c66b0d988fac6b2ed5948cf4dcd20fd486070e (diff)
downloadtangerine-wallet-browser-9b42416fc0d92662d1a21759db357e7f439d7a7b.tar
tangerine-wallet-browser-9b42416fc0d92662d1a21759db357e7f439d7a7b.tar.gz
tangerine-wallet-browser-9b42416fc0d92662d1a21759db357e7f439d7a7b.tar.bz2
tangerine-wallet-browser-9b42416fc0d92662d1a21759db357e7f439d7a7b.tar.lz
tangerine-wallet-browser-9b42416fc0d92662d1a21759db357e7f439d7a7b.tar.xz
tangerine-wallet-browser-9b42416fc0d92662d1a21759db357e7f439d7a7b.tar.zst
tangerine-wallet-browser-9b42416fc0d92662d1a21759db357e7f439d7a7b.zip
Merge branch 'develop' of github.com:MetaMask/metamask-extension into HowardBraham-develop
Diffstat (limited to 'app/scripts/lib/ens-ipfs/setup.js')
-rw-r--r--app/scripts/lib/ens-ipfs/setup.js63
1 files changed, 63 insertions, 0 deletions
diff --git a/app/scripts/lib/ens-ipfs/setup.js b/app/scripts/lib/ens-ipfs/setup.js
new file mode 100644
index 000000000..45eb1ce14
--- /dev/null
+++ b/app/scripts/lib/ens-ipfs/setup.js
@@ -0,0 +1,63 @@
+const urlUtil = require('url')
+const extension = require('extensionizer')
+const resolveEnsToIpfsContentId = require('./resolver.js')
+
+const supportedTopLevelDomains = ['eth']
+
+module.exports = setupEnsIpfsResolver
+
+function setupEnsIpfsResolver({ provider }) {
+
+ // install listener
+ const urlPatterns = supportedTopLevelDomains.map(tld => `*://*.${tld}/*`)
+ extension.webRequest.onErrorOccurred.addListener(webRequestDidFail, { urls: urlPatterns })
+
+ // return api object
+ return {
+ // uninstall listener
+ remove () {
+ extension.webRequest.onErrorOccurred.removeListener(webRequestDidFail)
+ },
+ }
+
+ async function webRequestDidFail (details) {
+ const { tabId, url } = details
+ // ignore requests that are not associated with tabs
+ if (tabId === -1) return
+ // parse ens name
+ const urlData = urlUtil.parse(url)
+ const { hostname: name, path, search } = urlData
+ const domainParts = name.split('.')
+ const topLevelDomain = domainParts[domainParts.length - 1]
+ // if unsupported TLD, abort
+ if (!supportedTopLevelDomains.includes(topLevelDomain)) return
+ // otherwise attempt resolve
+ attemptResolve({ tabId, name, path, search })
+ }
+
+ async function attemptResolve({ tabId, name, path, search }) {
+ extension.tabs.update(tabId, { url: `loading.html` })
+ try {
+ const ipfsContentId = await resolveEnsToIpfsContentId({ provider, name })
+ let url = `https://gateway.ipfs.io/ipfs/${ipfsContentId}${path}${search || ''}`
+ try {
+ // check if ipfs gateway has result
+ const response = await fetch(url, { method: 'HEAD' })
+ // if failure, redirect to 404 page
+ if (response.status !== 200) {
+ extension.tabs.update(tabId, { url: '404.html' })
+ return
+ }
+ // otherwise redirect to the correct page
+ extension.tabs.update(tabId, { url })
+ } catch (err) {
+ console.warn(err)
+ // if HEAD fetch failed, redirect so user can see relevant error page
+ extension.tabs.update(tabId, { url })
+ }
+ } catch (err) {
+ console.warn(err)
+ extension.tabs.update(tabId, { url: `error.html?name=${name}` })
+ }
+ }
+}