From 4fabe566373de1b6cffc5586e81d35b5f31edeaf Mon Sep 17 00:00:00 2001 From: Marcin Rataj Date: Mon, 19 Sep 2022 01:40:02 +0200 Subject: [PATCH] chore: switch to github actions License: MIT Signed-off-by: Marcin Rataj --- .github/workflows/main.yml | 72 ++++++++++++ .travis.yml | 53 --------- README.md | 24 ++-- circle.yml | 12 -- package-lock.json | 229 +++++++++++++++++++------------------ package.json | 13 ++- src/lookup.js | 34 ++++-- test/lookup.spec.js | 7 +- 8 files changed, 235 insertions(+), 209 deletions(-) create mode 100644 .github/workflows/main.yml delete mode 100644 .travis.yml delete mode 100644 circle.yml diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..d28495b --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,72 @@ +name: ci +on: + push: + branches: + - main + pull_request: + branches: + - main +env: + TEST: true + +jobs: + check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - run: npm install + - run: npx aegir lint + - run: npx aegir build + - run: npx aegir dep-check + - uses: ipfs/aegir/actions/bundle-size@master + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + test-node: + needs: check + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest] + node: ['lts/*', '*'] + fail-fast: false + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node }} + - run: npm install + - run: npx aegir test -t node --bail --cov + - uses: codecov/codecov-action@v1 + test-chrome: + needs: check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: microsoft/playwright-github-action@v1 + - run: npm install + - run: npx aegir test -t browser --bail --cov + - run: npx aegir test -t webworker --bail + - uses: codecov/codecov-action@v1 + test-firefox: + needs: check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: microsoft/playwright-github-action@v1 + - run: npm install + - run: npx aegir test -t browser -t webworker --bail -- --browser firefox + test-webkit: + needs: check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: microsoft/playwright-github-action@v1 + - run: npm install + - run: npx aegir test -t browser -t webworker --bail -- --browser webkit + test-electron-main: + needs: check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - run: npm install + - run: npx xvfb-maybe aegir test -t electron-main --bail diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 18afd48..0000000 --- a/.travis.yml +++ /dev/null @@ -1,53 +0,0 @@ -language: node_js -cache: npm -stages: - - check - - test - - cov - -node_js: - - '12' - - 'lts/*' - -os: - - linux - - osx - - windows - -script: npx nyc -s npm run test:node -- --bail --timeout 10000 -after_success: npx nyc report --reporter=text-lcov > coverage.lcov && npx codecov - -jobs: - include: - - stage: check - script: - - npx aegir commitlint --travis - - npx aegir dep-check - - npm run lint - - - stage: test - name: chrome - addons: - chrome: stable - script: npx aegir test --node -t browser -t webworker --timeout 10000 - - - stage: test - name: firefox - addons: - firefox: latest - script: npx aegir test --node -t browser -t webworker -- --browsers FirefoxHeadless - - - stage: test - name: electron-main - os: osx - script: - - npx aegir test -t electron-main --bail --timeout 10000 - - - stage: test - name: electron-renderer - os: osx - script: - - npx aegir test -t electron-renderer --bail --timeout 10000 - -notifications: - email: false diff --git a/README.md b/README.md index 26ae15f..a2b77d4 100644 --- a/README.md +++ b/README.md @@ -54,53 +54,53 @@ When using prebuilt bundle from CDN, `ipfs-geoip` will be exposed under `window. ## Usage -### With a public gateway (default) +### With public gateways (default) -If `ipfs` is `undefined` or a string with gateway URL, it will be used for -fetching data as [`application/vnd.ipld.raw`](https://www.iana.org/assignments/media-types/application/vnd.ipld.raw) -and parsing it as DAG-CBOR locally: +If `ipfs` is a string or array of strings with public gateway URLs, it will be used for +fetching IPFS blocks as [`application/vnd.ipld.raw`](https://www.iana.org/assignments/media-types/application/vnd.ipld.raw) +and parsing them as DAG-CBOR locally: ```js const geoip = require('ipfs-geoip') const exampleIp = '66.6.44.4' -const ipfsGateway = 'https://ipfs.io' +const ipfsGw = ['https://ipfs.io', 'https://dweb.link'] try { - const result = await geoip.lookup(ipfsGateway, exampleIp) + const result = await geoip.lookup(ipfsGw, exampleIp) console.log('Result: ', result) } catch (err) { console.log('Error: ' + err) } try { - const result = await geoip.lookupPretty(ipfs, '/ip4/' + exampleIp) + const result = await geoip.lookupPretty(ipfsGw, '/ip4/' + exampleIp) console.log('Pretty result: %s', result.formatted) } catch (err) { console.log('Error: ' + err) } ``` -### With JS-IPFS or Kubo RPC +### With custom block getter function -It is also possible to use it with local or remote IPFS node that exposes +It is also possible to use it with local or remote IPFS node by passing block getter function, e.g., one that exposes [`ipfs.block.get` Core JS API](https://github.com/ipfs/js-ipfs/blob/master/docs/core-api/BLOCK.md#ipfsblockgetcid-options): ```js const geoip = require('ipfs-geoip') const exampleIp = '66.6.44.4' -const ipfsApi = require('ipfs-http-client')() +const ipfs = require('ipfs-http-client')() try { - const result = await geoip.lookup(ipfsApi, exampleIp) + const getBlock = (cid) => ipfs.block.get(cid) + const result = await geoip.lookup(getBlock, exampleIp) console.log('Result: ', result) } catch (err) { console.log('Error: ' + err) } ``` - ## API ### `lookup(ipfs, ip)` diff --git a/circle.yml b/circle.yml deleted file mode 100644 index 434211a..0000000 --- a/circle.yml +++ /dev/null @@ -1,12 +0,0 @@ -machine: - node: - version: stable - -dependencies: - pre: - - google-chrome --version - - wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add - - - sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' - - sudo apt-get update - - sudo apt-get --only-upgrade install google-chrome-stable - - google-chrome --version diff --git a/package-lock.json b/package-lock.json index 795f24f..a6f2865 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,21 +10,22 @@ "license": "MIT", "dependencies": { "@ipld/dag-cbor": "^7.0.3", - "ip": "^1.1.8", + "bluebird": "^3.7.2", + "cross-fetch": "^3.1.5", + "ip": "^2.0.0", "it-concat": "^2.0.0", - "multiformats": "^9.8.1", + "lodash-es": "^4.17.21", + "multiformats": "^9.9.0", "p-memoize": "^7.1.0" }, "devDependencies": { "@ipld/car": "^4.1.5", - "aegir": "^37.5.3", - "bluebird": "^3.7.2", + "aegir": "^37.5.4", "chai": "^4.3.6", "chai-as-promised": "^7.1.1", "csv-parse": "^5.3.0", "gauge": "^4.0.4", - "ipfs-http-client": "^58.0.0", - "lodash-es": "^4.17.21", + "ipfs-http-client": "^58.0.1", "multihashes": "^4.0.3", "pre-commit": "^1.2.2", "uint8arrays": "^3.1.0" @@ -1686,14 +1687,14 @@ } }, "node_modules/@libp2p/interface-connection": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@libp2p/interface-connection/-/interface-connection-3.0.1.tgz", - "integrity": "sha512-x+Ws74EhxvSym2fTQMP8/xpV3p8A3ar8yOq4dq/44HSvEMMKcuQvEq2jShVK0aXEpg1ce/KHY83FgY1zToFM2A==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@libp2p/interface-connection/-/interface-connection-3.0.2.tgz", + "integrity": "sha512-38R2GQ6BCOtwMi5uWU5MLr+xfEpRmVK9gqOp7jNx+6T7TVn8ji4725XLXNfpzprbOrzZkqf2iER84s8+yX4pMA==", "dev": true, "dependencies": { "@libp2p/interface-peer-id": "^1.0.0", "@libp2p/interfaces": "^3.0.0", - "@multiformats/multiaddr": "^10.2.0", + "@multiformats/multiaddr": "^11.0.0", "it-stream-types": "^1.0.4", "uint8arraylist": "^2.1.1" }, @@ -1729,13 +1730,13 @@ } }, "node_modules/@libp2p/interface-peer-info": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@libp2p/interface-peer-info/-/interface-peer-info-1.0.2.tgz", - "integrity": "sha512-8dGBj8+6PdBDsMAASxX2sECnWhK7zAnv8iCFgYXY5Z6fbQwA+7iVAea9FdjgyLapdIzDarttPt3Gdou8tXZdGg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@libp2p/interface-peer-info/-/interface-peer-info-1.0.3.tgz", + "integrity": "sha512-QKybxfp/NmDGDMkgf/CTt4fU03ajZnldHr9TYg5wMkJrnVaaHbhDTYBg5YWt+iOH1mgR89/dpKv/Na0ZE5sPIA==", "dev": true, "dependencies": { "@libp2p/interface-peer-id": "^1.0.0", - "@multiformats/multiaddr": "^10.2.0" + "@multiformats/multiaddr": "^11.0.0" }, "engines": { "node": ">=16.0.0", @@ -1808,9 +1809,9 @@ "dev": true }, "node_modules/@multiformats/multiaddr": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-10.4.3.tgz", - "integrity": "sha512-yHhYKOnzvjxyF5xMwbHFI9hBi0xQIa6y0dnTlOUs+CKsJCn8NfwznCjXmW7HH0IIiFobJGgs3UNY0bWLWIrqWw==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-11.0.1.tgz", + "integrity": "sha512-6EAZPs0tvdSYogxnbA9M2y3YHUUFg3nJ+vDKmqodRoBMdT0cio67eE3WMAGUgRolijPFOORWcry/tX0srTnTPA==", "dev": true, "dependencies": { "dns-over-http-resolver": "^2.1.0", @@ -1826,12 +1827,16 @@ } }, "node_modules/@multiformats/multiaddr-to-uri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr-to-uri/-/multiaddr-to-uri-9.0.1.tgz", - "integrity": "sha512-kSyHZ2lKjoEzHu/TM4ZVwFj4AWV1B9qFBFJjYb/fK1NqrnrNb/M3uhoyckJvP7WZvpDsnEc7fUCpmPipDY6LMw==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr-to-uri/-/multiaddr-to-uri-9.0.2.tgz", + "integrity": "sha512-vrWmfFadmix5Ab9l//oRQdQ7O3J5bGJpJRMSm21bHlQB0XV4xtNU6vMZBVXeu3Su79LgflEp37cjTFE3yKf3Hw==", "dev": true, "dependencies": { - "@multiformats/multiaddr": "^10.1.1" + "@multiformats/multiaddr": "^11.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" } }, "node_modules/@nodelib/fs.scandir": { @@ -3225,9 +3230,9 @@ } }, "node_modules/aegir": { - "version": "37.5.3", - "resolved": "https://registry.npmjs.org/aegir/-/aegir-37.5.3.tgz", - "integrity": "sha512-Er3o5b640g7+zuwxBJyc1Cr5FCaN7oI+ui27L2tcuC17tyIhLd4ETA7963EYslWjyJDD4Dwdpa+69f0WSZ9o0A==", + "version": "37.5.4", + "resolved": "https://registry.npmjs.org/aegir/-/aegir-37.5.4.tgz", + "integrity": "sha512-i03Kc/sXpoWoBm70KpwktUmheZTTzSWGANXbMnfqRpAGNXEsIbUSBw7PbaZSG6+We1F+bcE0siYcaVveFObT5g==", "dev": true, "dependencies": { "@electron/get": "^2.0.0", @@ -3760,8 +3765,7 @@ "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "node_modules/boolean": { "version": "3.2.0", @@ -4929,6 +4933,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "dependencies": { + "node-fetch": "2.6.7" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -6221,7 +6233,7 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, + "devOptional": true, "dependencies": { "iconv-lite": "^0.6.2" } @@ -9214,7 +9226,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, + "devOptional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -9388,9 +9400,9 @@ } }, "node_modules/ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" }, "node_modules/ip-regex": { "version": "5.0.0", @@ -9405,9 +9417,9 @@ } }, "node_modules/ipfs-core-types": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/ipfs-core-types/-/ipfs-core-types-0.12.0.tgz", - "integrity": "sha512-nHxlkMSPAA3VS7CxHbbyQlQpXLr/l57Q8Jmf7WZDLa5AN6p4cnJRUpnNh14QYIhUNJdcphPdI4LmuXXiX97cIw==", + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/ipfs-core-types/-/ipfs-core-types-0.12.1.tgz", + "integrity": "sha512-MMCNlHN960kZ4Pxh85xmAGPzVkO2iVAdPQqHkxf/3179m6MwrMpaBdU8QGbjccRef4QKou2bIptKdweanvjmig==", "dev": true, "dependencies": { "@ipld/dag-pb": "^2.1.3", @@ -9415,7 +9427,7 @@ "@libp2p/interface-peer-id": "^1.0.4", "@libp2p/interface-peer-info": "^1.0.2", "@libp2p/interface-pubsub": "^2.0.0", - "@multiformats/multiaddr": "^10.4.0", + "@multiformats/multiaddr": "^11.0.0", "@types/node": "^18.0.0", "interface-datastore": "^7.0.0", "ipfs-unixfs": "^7.0.0", @@ -9433,19 +9445,19 @@ "dev": true }, "node_modules/ipfs-core-utils": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/ipfs-core-utils/-/ipfs-core-utils-0.16.0.tgz", - "integrity": "sha512-202+/h/oAfqxx+nzB3EPekdxXq3W9kk++UdGFl6KEiyiwPCh9V41P3S8y7H0SOqy+gLUIUfLTRpPvmJjgze75A==", + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ipfs-core-utils/-/ipfs-core-utils-0.16.1.tgz", + "integrity": "sha512-nRrOntMtjc6CoeAopIPyDRpwqwSJeMBYY5uq/TiS0V2MbBbD6kTtmsqdgjwXaQLQXdRyvy6/ohxP/btT4Xrg9Q==", "dev": true, "dependencies": { "@libp2p/logger": "^2.0.0", - "@multiformats/multiaddr": "^10.4.0", + "@multiformats/multiaddr": "^11.0.0", "@multiformats/multiaddr-to-uri": "^9.0.1", "any-signal": "^3.0.0", "blob-to-it": "^1.0.1", "browser-readablestream-to-it": "^1.0.1", "err-code": "^3.0.1", - "ipfs-core-types": "^0.12.0", + "ipfs-core-types": "^0.12.1", "ipfs-unixfs": "^7.0.0", "ipfs-utils": "^9.0.6", "it-all": "^1.0.4", @@ -9477,9 +9489,9 @@ } }, "node_modules/ipfs-http-client": { - "version": "58.0.0", - "resolved": "https://registry.npmjs.org/ipfs-http-client/-/ipfs-http-client-58.0.0.tgz", - "integrity": "sha512-8HD6wRb+czi6NW8P4n4H84mMefATHf/yWIBFal/DDqriFstrjim0BE5w7lfw7cFoueoH26kq4f70lbF95/ElKA==", + "version": "58.0.1", + "resolved": "https://registry.npmjs.org/ipfs-http-client/-/ipfs-http-client-58.0.1.tgz", + "integrity": "sha512-CTl0SDQT8zPevK1fC4fD2UzUbYklwRYct6SomGPexWWlCbI2Bu8ZoSOdqsj3GwkxmUuuCtCGoDK9HkkyNC5QlA==", "dev": true, "dependencies": { "@ipld/dag-cbor": "^7.0.0", @@ -9487,12 +9499,12 @@ "@ipld/dag-pb": "^2.1.3", "@libp2p/logger": "^2.0.0", "@libp2p/peer-id": "^1.1.10", - "@multiformats/multiaddr": "^10.4.0", + "@multiformats/multiaddr": "^11.0.0", "any-signal": "^3.0.0", "dag-jose": "^2.0.1", "err-code": "^3.0.1", - "ipfs-core-types": "^0.12.0", - "ipfs-core-utils": "^0.16.0", + "ipfs-core-types": "^0.12.1", + "ipfs-core-utils": "^0.16.1", "ipfs-utils": "^9.0.6", "it-first": "^1.0.6", "it-last": "^1.0.4", @@ -10920,8 +10932,7 @@ "node_modules/lodash-es": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "dev": true + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, "node_modules/lodash.capitalize": { "version": "4.2.1", @@ -12575,9 +12586,9 @@ } }, "node_modules/multiformats": { - "version": "9.8.1", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.8.1.tgz", - "integrity": "sha512-Cu7NfUYtCV+WN7w59WsRRF138S+um4tTo11ScYsWbNgWyCEGOu8wID1e5eMJs91gFZ0I7afodkkdxCF8NGkqZQ==" + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" }, "node_modules/multihashes": { "version": "4.0.3", @@ -12670,7 +12681,6 @@ "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -19174,7 +19184,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "devOptional": true }, "node_modules/semantic-release": { "version": "19.0.5", @@ -20849,8 +20859,7 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/traverse": { "version": "0.6.6", @@ -21467,14 +21476,12 @@ "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -23101,14 +23108,14 @@ } }, "@libp2p/interface-connection": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@libp2p/interface-connection/-/interface-connection-3.0.1.tgz", - "integrity": "sha512-x+Ws74EhxvSym2fTQMP8/xpV3p8A3ar8yOq4dq/44HSvEMMKcuQvEq2jShVK0aXEpg1ce/KHY83FgY1zToFM2A==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@libp2p/interface-connection/-/interface-connection-3.0.2.tgz", + "integrity": "sha512-38R2GQ6BCOtwMi5uWU5MLr+xfEpRmVK9gqOp7jNx+6T7TVn8ji4725XLXNfpzprbOrzZkqf2iER84s8+yX4pMA==", "dev": true, "requires": { "@libp2p/interface-peer-id": "^1.0.0", "@libp2p/interfaces": "^3.0.0", - "@multiformats/multiaddr": "^10.2.0", + "@multiformats/multiaddr": "^11.0.0", "it-stream-types": "^1.0.4", "uint8arraylist": "^2.1.1" } @@ -23132,13 +23139,13 @@ } }, "@libp2p/interface-peer-info": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@libp2p/interface-peer-info/-/interface-peer-info-1.0.2.tgz", - "integrity": "sha512-8dGBj8+6PdBDsMAASxX2sECnWhK7zAnv8iCFgYXY5Z6fbQwA+7iVAea9FdjgyLapdIzDarttPt3Gdou8tXZdGg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@libp2p/interface-peer-info/-/interface-peer-info-1.0.3.tgz", + "integrity": "sha512-QKybxfp/NmDGDMkgf/CTt4fU03ajZnldHr9TYg5wMkJrnVaaHbhDTYBg5YWt+iOH1mgR89/dpKv/Na0ZE5sPIA==", "dev": true, "requires": { "@libp2p/interface-peer-id": "^1.0.0", - "@multiformats/multiaddr": "^10.2.0" + "@multiformats/multiaddr": "^11.0.0" } }, "@libp2p/interface-pubsub": { @@ -23191,9 +23198,9 @@ "dev": true }, "@multiformats/multiaddr": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-10.4.3.tgz", - "integrity": "sha512-yHhYKOnzvjxyF5xMwbHFI9hBi0xQIa6y0dnTlOUs+CKsJCn8NfwznCjXmW7HH0IIiFobJGgs3UNY0bWLWIrqWw==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-11.0.1.tgz", + "integrity": "sha512-6EAZPs0tvdSYogxnbA9M2y3YHUUFg3nJ+vDKmqodRoBMdT0cio67eE3WMAGUgRolijPFOORWcry/tX0srTnTPA==", "dev": true, "requires": { "dns-over-http-resolver": "^2.1.0", @@ -23205,12 +23212,12 @@ } }, "@multiformats/multiaddr-to-uri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr-to-uri/-/multiaddr-to-uri-9.0.1.tgz", - "integrity": "sha512-kSyHZ2lKjoEzHu/TM4ZVwFj4AWV1B9qFBFJjYb/fK1NqrnrNb/M3uhoyckJvP7WZvpDsnEc7fUCpmPipDY6LMw==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@multiformats/multiaddr-to-uri/-/multiaddr-to-uri-9.0.2.tgz", + "integrity": "sha512-vrWmfFadmix5Ab9l//oRQdQ7O3J5bGJpJRMSm21bHlQB0XV4xtNU6vMZBVXeu3Su79LgflEp37cjTFE3yKf3Hw==", "dev": true, "requires": { - "@multiformats/multiaddr": "^10.1.1" + "@multiformats/multiaddr": "^11.0.0" } }, "@nodelib/fs.scandir": { @@ -24276,9 +24283,9 @@ "requires": {} }, "aegir": { - "version": "37.5.3", - "resolved": "https://registry.npmjs.org/aegir/-/aegir-37.5.3.tgz", - "integrity": "sha512-Er3o5b640g7+zuwxBJyc1Cr5FCaN7oI+ui27L2tcuC17tyIhLd4ETA7963EYslWjyJDD4Dwdpa+69f0WSZ9o0A==", + "version": "37.5.4", + "resolved": "https://registry.npmjs.org/aegir/-/aegir-37.5.4.tgz", + "integrity": "sha512-i03Kc/sXpoWoBm70KpwktUmheZTTzSWGANXbMnfqRpAGNXEsIbUSBw7PbaZSG6+We1F+bcE0siYcaVveFObT5g==", "dev": true, "requires": { "@electron/get": "^2.0.0", @@ -24699,8 +24706,7 @@ "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "boolean": { "version": "3.2.0", @@ -25541,6 +25547,14 @@ } } }, + "cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "requires": { + "node-fetch": "2.6.7" + } + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -26479,7 +26493,7 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, + "devOptional": true, "requires": { "iconv-lite": "^0.6.2" } @@ -28577,7 +28591,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, + "devOptional": true, "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" } @@ -28693,9 +28707,9 @@ } }, "ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" }, "ip-regex": { "version": "5.0.0", @@ -28704,9 +28718,9 @@ "dev": true }, "ipfs-core-types": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/ipfs-core-types/-/ipfs-core-types-0.12.0.tgz", - "integrity": "sha512-nHxlkMSPAA3VS7CxHbbyQlQpXLr/l57Q8Jmf7WZDLa5AN6p4cnJRUpnNh14QYIhUNJdcphPdI4LmuXXiX97cIw==", + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/ipfs-core-types/-/ipfs-core-types-0.12.1.tgz", + "integrity": "sha512-MMCNlHN960kZ4Pxh85xmAGPzVkO2iVAdPQqHkxf/3179m6MwrMpaBdU8QGbjccRef4QKou2bIptKdweanvjmig==", "dev": true, "requires": { "@ipld/dag-pb": "^2.1.3", @@ -28714,7 +28728,7 @@ "@libp2p/interface-peer-id": "^1.0.4", "@libp2p/interface-peer-info": "^1.0.2", "@libp2p/interface-pubsub": "^2.0.0", - "@multiformats/multiaddr": "^10.4.0", + "@multiformats/multiaddr": "^11.0.0", "@types/node": "^18.0.0", "interface-datastore": "^7.0.0", "ipfs-unixfs": "^7.0.0", @@ -28730,19 +28744,19 @@ } }, "ipfs-core-utils": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/ipfs-core-utils/-/ipfs-core-utils-0.16.0.tgz", - "integrity": "sha512-202+/h/oAfqxx+nzB3EPekdxXq3W9kk++UdGFl6KEiyiwPCh9V41P3S8y7H0SOqy+gLUIUfLTRpPvmJjgze75A==", + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ipfs-core-utils/-/ipfs-core-utils-0.16.1.tgz", + "integrity": "sha512-nRrOntMtjc6CoeAopIPyDRpwqwSJeMBYY5uq/TiS0V2MbBbD6kTtmsqdgjwXaQLQXdRyvy6/ohxP/btT4Xrg9Q==", "dev": true, "requires": { "@libp2p/logger": "^2.0.0", - "@multiformats/multiaddr": "^10.4.0", + "@multiformats/multiaddr": "^11.0.0", "@multiformats/multiaddr-to-uri": "^9.0.1", "any-signal": "^3.0.0", "blob-to-it": "^1.0.1", "browser-readablestream-to-it": "^1.0.1", "err-code": "^3.0.1", - "ipfs-core-types": "^0.12.0", + "ipfs-core-types": "^0.12.1", "ipfs-unixfs": "^7.0.0", "ipfs-utils": "^9.0.6", "it-all": "^1.0.4", @@ -28766,9 +28780,9 @@ } }, "ipfs-http-client": { - "version": "58.0.0", - "resolved": "https://registry.npmjs.org/ipfs-http-client/-/ipfs-http-client-58.0.0.tgz", - "integrity": "sha512-8HD6wRb+czi6NW8P4n4H84mMefATHf/yWIBFal/DDqriFstrjim0BE5w7lfw7cFoueoH26kq4f70lbF95/ElKA==", + "version": "58.0.1", + "resolved": "https://registry.npmjs.org/ipfs-http-client/-/ipfs-http-client-58.0.1.tgz", + "integrity": "sha512-CTl0SDQT8zPevK1fC4fD2UzUbYklwRYct6SomGPexWWlCbI2Bu8ZoSOdqsj3GwkxmUuuCtCGoDK9HkkyNC5QlA==", "dev": true, "requires": { "@ipld/dag-cbor": "^7.0.0", @@ -28776,12 +28790,12 @@ "@ipld/dag-pb": "^2.1.3", "@libp2p/logger": "^2.0.0", "@libp2p/peer-id": "^1.1.10", - "@multiformats/multiaddr": "^10.4.0", + "@multiformats/multiaddr": "^11.0.0", "any-signal": "^3.0.0", "dag-jose": "^2.0.1", "err-code": "^3.0.1", - "ipfs-core-types": "^0.12.0", - "ipfs-core-utils": "^0.16.0", + "ipfs-core-types": "^0.12.1", + "ipfs-core-utils": "^0.16.1", "ipfs-utils": "^9.0.6", "it-first": "^1.0.6", "it-last": "^1.0.4", @@ -29851,8 +29865,7 @@ "lodash-es": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "dev": true + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, "lodash.capitalize": { "version": "4.2.1", @@ -30991,9 +31004,9 @@ } }, "multiformats": { - "version": "9.8.1", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.8.1.tgz", - "integrity": "sha512-Cu7NfUYtCV+WN7w59WsRRF138S+um4tTo11ScYsWbNgWyCEGOu8wID1e5eMJs91gFZ0I7afodkkdxCF8NGkqZQ==" + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" }, "multihashes": { "version": "4.0.3", @@ -31076,7 +31089,6 @@ "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, "requires": { "whatwg-url": "^5.0.0" } @@ -35601,7 +35613,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "devOptional": true }, "semantic-release": { "version": "19.0.5", @@ -36895,8 +36907,7 @@ "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "traverse": { "version": "0.6.6", @@ -37359,14 +37370,12 @@ "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, "requires": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" diff --git a/package.json b/package.json index 75ab5e8..225e6df 100644 --- a/package.json +++ b/package.json @@ -33,21 +33,22 @@ }, "dependencies": { "@ipld/dag-cbor": "^7.0.3", - "ip": "^1.1.8", + "bluebird": "^3.7.2", + "cross-fetch": "^3.1.5", + "ip": "^2.0.0", "it-concat": "^2.0.0", - "multiformats": "^9.8.1", + "lodash-es": "^4.17.21", + "multiformats": "^9.9.0", "p-memoize": "^7.1.0" }, "devDependencies": { "@ipld/car": "^4.1.5", - "aegir": "^37.5.3", - "bluebird": "^3.7.2", + "aegir": "^37.5.4", "chai": "^4.3.6", "chai-as-promised": "^7.1.1", "csv-parse": "^5.3.0", "gauge": "^4.0.4", - "ipfs-http-client": "^58.0.0", - "lodash-es": "^4.17.21", + "ipfs-http-client": "^58.0.1", "multihashes": "^4.0.3", "pre-commit": "^1.2.2", "uint8arrays": "^3.1.0" diff --git a/src/lookup.js b/src/lookup.js index 573a59d..42a64eb 100644 --- a/src/lookup.js +++ b/src/lookup.js @@ -2,11 +2,12 @@ import { default as memoize } from 'p-memoize' import ip from 'ip' import * as dagCbor from '@ipld/dag-cbor' import { CID } from 'multiformats/cid' +import fetch from 'cross-fetch' import { formatData } from './format.js' export const GEOIP_ROOT = CID.parse('bafyreihpmffy4un3u3qstv5bskxmdekdzydujbbephdwhshrgbrecjnqme') // GeoLite2-City-CSV_20220628 -const defaultGateway = 'https://ipfs.io' +const defaultGateway = ['https://ipfs.io', 'https://dweb.link'] /** * @param {object|string} ipfs @@ -14,18 +15,27 @@ const defaultGateway = 'https://ipfs.io' * @returns {Promise} */ async function getRawBlock (ipfs, cid) { - // normalize to string - let gwUrl - try { - gwUrl = new URL(ipfs || defaultGateway) + if (typeof ipfs === 'function') { + return ipfs(cid) + } + if (typeof ipfs?.block?.get === 'function') { + // use Core JS API (https://github.com/ipfs/js-ipfs/blob/master/docs/core-api/BLOCK.md) + return ipfs.block.get(cid) + } + + // Assume ipfs is gateway url or a list of gateway urls to try in order + const gateways = Array.isArray(ipfs) ? ipfs : [ipfs] + for (const url of gateways) { // eslint-disable-line no-unreachable-loop + const gwUrl = new URL(url) gwUrl.pathname = `/ipfs/${cid.toString()}` gwUrl.search = '?format=raw' - const rawBlock = await fetch(gwUrl, { cache: 'force-cache' }) - return new Uint8Array(await rawBlock.arrayBuffer()) - } catch (_) { - // not a gateway URL, fallbck to using it as Core JS API - // (this is backward-compatibility for legacy users) - return await ipfs.block.get(cid) + try { + const res = await fetch(gwUrl, { cache: 'force-cache' }) + if (!res.ok) throw res + return new Uint8Array(await res.arrayBuffer()) + } catch (cause) { + throw new Error(`unable to fetch raw block for CID ${cid}`, { cause }) + } } } @@ -104,7 +114,7 @@ const memoizedLookup = memoize(_lookup, { * @param {string} ipstring * @returns {Promise} */ -export function lookup (ipfs, ipstring) { +export function lookup (ipfs = defaultGateway, ipstring) { return memoizedLookup(ipfs, GEOIP_ROOT, ip.toLong(ipstring)) } diff --git a/test/lookup.spec.js b/test/lookup.spec.js index 1b7cf12..02c8fe5 100644 --- a/test/lookup.spec.js +++ b/test/lookup.spec.js @@ -1,12 +1,11 @@ import { expect } from 'chai' import * as geoip from '../src/index.js' -// Use public gateway for fetching dag-cbor blocks -const ipfs = 'https://ipfs.io' - -describe('lookup', function () { +describe('lookup via HTTP Gateway supporting application/vnd.ipld.raw responses', function () { this.timeout(100 * 1000) + const ipfs = process.env.CI ? 'https://ipfs.io' : 'http://127.0.0.1:8080' + it('fails on 127.0.0.1', async () => { try { await geoip.lookup(ipfs, '127.0.0.1')