├── .devcontainer ├── Dockerfile └── devcontainer.json ├── .github ├── CODEOWNERS ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── report-inaccurate-data.md │ └── request-new-provider.md ├── dependabot.yml └── workflows │ ├── publish.yml │ ├── spotters.yml │ └── test.yml ├── .gitignore ├── .npmignore ├── .nvmrc ├── .vscode └── settings.json ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── banner.png ├── bun.lockb ├── data ├── iata-filtered.js ├── index.js └── providers │ ├── adaptive.js │ ├── alibaba.js │ ├── arubacloud.js │ ├── atlanticnet.js │ ├── azurecdn.js │ ├── azurevm.js │ ├── backblaze.js │ ├── bunnycdn.js │ ├── cachefly.js │ ├── cdn77.js │ ├── cloudflare.js │ ├── cloudfront.js │ ├── cloudsigma.js │ ├── deno.js │ ├── digitalocean.js │ ├── ec2.js │ ├── equinix.js │ ├── fastly.js │ ├── flexential.js │ ├── gcore.js │ ├── googlecdn.js │ ├── googlecompute.js │ ├── heroku.js │ ├── hetzner.js │ ├── hivelocity.js │ ├── hostwinds.js │ ├── imperva.js │ ├── ionos.js │ ├── kamatera.js │ ├── keycdn.js │ ├── leapswitch.js │ ├── lightsail.js │ ├── limelight.js │ ├── linode.js │ ├── mnx.js │ ├── netlify.js │ ├── ovh.js │ ├── packet.js │ ├── scaleway.js │ ├── stackpath.js │ ├── sucuri.js │ ├── upcloud.js │ ├── vercel.js │ ├── verizonmedia.js │ ├── vultr.js │ └── wasabi.js ├── dist └── bundle.js ├── examples └── example.js ├── main.d.ts ├── notebooks ├── data.csv └── pops.ipynb ├── package.json ├── pnpm-lock.yaml ├── rollup.config.js ├── sandworm ├── @adaptivelink-pops@0.5.4-dependencies.csv ├── @adaptivelink-pops@0.5.4-report.json ├── @adaptivelink-pops@0.5.4-tree.svg └── @adaptivelink-pops@0.5.4-treemap.svg ├── src └── main.js ├── test └── index.test.mjs └── tools ├── csv-generator.js ├── iata-filter.js ├── spotters ├── cdn77.js ├── cloudflare.js ├── deno.js ├── ec2.js ├── fastly.js ├── imperva.js ├── keycdn.js ├── lib │ └── telegram.js ├── lightsail.js ├── linode.js ├── stackpath.js ├── upcloud.js └── vultr.js └── validator.js /.devcontainer/Dockerfile: -------------------------------------------------------------------------------- 1 | # See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.187.0/containers/javascript-node/.devcontainer/base.Dockerfile 2 | 3 | # [Choice] Node.js version: 16, 14, 12 4 | ARG VARIANT="18-bullseye" 5 | FROM mcr.microsoft.com/vscode/devcontainers/javascript-node:0-${VARIANT} 6 | 7 | # [Optional] Uncomment this section to install additional OS packages. 8 | # RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ 9 | # && apt-get -y install --no-install-recommends 10 | 11 | # [Optional] Uncomment if you want to install an additional version of node using nvm 12 | # ARG EXTRA_NODE_VERSION=10 13 | # RUN su node -c "source /usr/local/share/nvm/nvm.sh && nvm install ${EXTRA_NODE_VERSION}" 14 | 15 | # [Optional] Uncomment if you want to install more global node modules 16 | # RUN su node -c "npm install -g " 17 | -------------------------------------------------------------------------------- /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | // For format details, see https://aka.ms/devcontainer.json. For config options, see the README at: 2 | // https://github.com/microsoft/vscode-dev-containers/tree/v0.187.0/containers/javascript-node 3 | { 4 | "name": "Node.js", 5 | "build": { 6 | "dockerfile": "Dockerfile", 7 | "args": { "VARIANT": "18" } 8 | }, 9 | 10 | // Set *default* container specific settings.json values on container create. 11 | "settings": {}, 12 | 13 | // Add the IDs of extensions you want installed when the container is created. 14 | "extensions": [ 15 | "dbaeumer.vscode-eslint", 16 | "eg2.vscode-npm-script", 17 | "bungcip.better-toml", 18 | "mkxml.vscode-filesize", 19 | "GitHub.copilot-nightly", 20 | "GitHub.copilot-labs" 21 | ], 22 | 23 | // Use 'forwardPorts' to make a list of ports inside the container available locally. 24 | // "forwardPorts": [], 25 | 26 | // Use 'postCreateCommand' to run commands after the container is created. 27 | "postCreateCommand": "yarn install", 28 | 29 | // Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root. 30 | "remoteUser": "node" 31 | } 32 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @adaptive -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: adaptive 4 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/report-inaccurate-data.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: "\U0001F50D Report Inaccurate Data" 3 | about: Create a report for inaccurate data 4 | title: "[DATA]" 5 | labels: '' 6 | assignees: 'adaptive' 7 | 8 | --- 9 | 10 | **Describe what is wrong** 11 | A clear and concise description of where the data is wrong. 12 | 13 | **Source of truth** 14 | What is your source of truth? (link) 15 | 16 | **Additional context** 17 | Add any other context about the problem here. 18 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/request-new-provider.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: "\U0001F4A1 Request New Provider" 3 | about: Create a request to add a new provider 4 | title: "[PROVIDER]" 5 | labels: '' 6 | assignees: 'adaptive' 7 | 8 | --- 9 | 10 | **Describe the provider** 11 | A clear and concise description of the new provider to add. 12 | 13 | **Number of Points of Presence locations** 14 | A rough estimate of PoPs locations (e.g. ~20) 15 | 16 | **Source of truth** 17 | Where is the source of truth? (e.g. link to network map, provider status page) 18 | 19 | **Additional context** 20 | Add any other context about the problem here. 21 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: npm 4 | directory: "/" 5 | schedule: 6 | interval: daily 7 | time: "07:24" 8 | open-pull-requests-limit: 10 9 | target-branch: main 10 | assignees: 11 | - adaptive 12 | - package-ecosystem: "github-actions" 13 | directory: "/" 14 | schedule: 15 | interval: "daily" 16 | time: "07:24" 17 | open-pull-requests-limit: 10 18 | target-branch: main 19 | assignees: 20 | - adaptive -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: NPM Publish 2 | 3 | on: 4 | release: 5 | types: [created] 6 | 7 | jobs: 8 | test: 9 | runs-on: ubuntu-latest 10 | permissions: 11 | contents: read 12 | id-token: write 13 | timeout-minutes: 5 14 | steps: 15 | - uses: actions/checkout@v4 16 | - uses: pnpm/action-setup@v4 17 | with: 18 | version: latest 19 | - uses: actions/setup-node@v4.4.0 20 | with: 21 | node-version: 18 22 | registry-url: https://registry.npmjs.org/ 23 | scope: "@adaptivelink" 24 | cache: 'pnpm' 25 | - name: Publish 26 | run: npm publish --provenance --access public 27 | env: 28 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} -------------------------------------------------------------------------------- /.github/workflows/spotters.yml: -------------------------------------------------------------------------------- 1 | name: Spotter 2 | 3 | on: 4 | schedule: 5 | - cron: '36 18 * * 1,3,5' 6 | 7 | jobs: 8 | engage: 9 | runs-on: ubuntu-latest 10 | timeout-minutes: 5 11 | steps: 12 | - uses: actions/checkout@v4 13 | - uses: pnpm/action-setup@v4 14 | with: 15 | version: latest 16 | - uses: actions/setup-node@v4.4.0 17 | with: 18 | node-version: 18 19 | cache: 'pnpm' 20 | - uses: microsoft/playwright-github-action@v1 21 | - name: NPM Install 22 | run: npm install 23 | - name: Engage 24 | run: npm run spotters 25 | env: 26 | TELEGRAM_USER: ${{ secrets.TELEGRAM_USER }} 27 | TELEGRAM_TOKEN: ${{ secrets.TELEGRAM_TOKEN }} -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Test 2 | 3 | on: [push] 4 | 5 | jobs: 6 | test: 7 | runs-on: ubuntu-latest 8 | timeout-minutes: 5 9 | strategy: 10 | matrix: 11 | node: [20, 22] 12 | steps: 13 | - uses: actions/checkout@v4 14 | - uses: pnpm/action-setup@v4 15 | with: 16 | version: 9.12.1 17 | - uses: actions/setup-node@v4.4.0 18 | with: 19 | node-version: ${{ matrix.node }} 20 | cache: 'pnpm' 21 | - name: PNPM Install 22 | run: pnpm install --no-frozen-lockfile 23 | - name: Pack and Unpack 24 | run: pnpm pack && tar -xvzf *.tgz 25 | - name: Test 26 | run: pnpm test 27 | - name: Delete /package and *.tgz 28 | run: rm -rf package && rm -rf *.tgz 29 | - name: Publish Dry Run 30 | run: pnpm publish --dry-run --no-git-checks 31 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | package -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .devcontainer 2 | .github 3 | .pnpm-lock.yaml 4 | .yarn 5 | .yarnrc.yml 6 | banner.png 7 | CODE_OF_CONDUCT.md 8 | CONTRIBUTING.md 9 | data 10 | examples 11 | notebooks 12 | rollup.config.js 13 | src 14 | test 15 | tools 16 | sandworm -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 21 -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "cody.useContext": "embeddings" 3 | } 4 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | We as members, contributors, and leaders pledge to make participation in our 6 | community a harassment-free experience for everyone, regardless of age, body 7 | size, visible or invisible disability, ethnicity, sex characteristics, gender 8 | identity and expression, level of experience, education, socio-economic status, 9 | nationality, personal appearance, race, caste, color, religion, or sexual 10 | identity and orientation. 11 | 12 | We pledge to act and interact in ways that contribute to an open, welcoming, 13 | diverse, inclusive, and healthy community. 14 | 15 | ## Our Standards 16 | 17 | Examples of behavior that contributes to a positive environment for our 18 | community include: 19 | 20 | * Demonstrating empathy and kindness toward other people 21 | * Being respectful of differing opinions, viewpoints, and experiences 22 | * Giving and gracefully accepting constructive feedback 23 | * Accepting responsibility and apologizing to those affected by our mistakes, 24 | and learning from the experience 25 | * Focusing on what is best not just for us as individuals, but for the overall 26 | community 27 | 28 | Examples of unacceptable behavior include: 29 | 30 | * The use of sexualized language or imagery, and sexual attention or advances of 31 | any kind 32 | * Trolling, insulting or derogatory comments, and personal or political attacks 33 | * Public or private harassment 34 | * Publishing others' private information, such as a physical or email address, 35 | without their explicit permission 36 | * Other conduct which could reasonably be considered inappropriate in a 37 | professional setting 38 | 39 | ## Enforcement Responsibilities 40 | 41 | Community leaders are responsible for clarifying and enforcing our standards of 42 | acceptable behavior and will take appropriate and fair corrective action in 43 | response to any behavior that they deem inappropriate, threatening, offensive, 44 | or harmful. 45 | 46 | Community leaders have the right and responsibility to remove, edit, or reject 47 | comments, commits, code, wiki edits, issues, and other contributions that are 48 | not aligned to this Code of Conduct, and will communicate reasons for moderation 49 | decisions when appropriate. 50 | 51 | ## Scope 52 | 53 | This Code of Conduct applies within all community spaces, and also applies when 54 | an individual is officially representing the community in public spaces. 55 | Examples of representing our community include using an official e-mail address, 56 | posting via an official social media account, or acting as an appointed 57 | representative at an online or offline event. 58 | 59 | ## Enforcement 60 | 61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 62 | reported to the community leaders responsible for enforcement at 63 | hugoromano@gmail.com. 64 | All complaints will be reviewed and investigated promptly and fairly. 65 | 66 | All community leaders are obligated to respect the privacy and security of the 67 | reporter of any incident. 68 | 69 | ## Enforcement Guidelines 70 | 71 | Community leaders will follow these Community Impact Guidelines in determining 72 | the consequences for any action they deem in violation of this Code of Conduct: 73 | 74 | ### 1. Correction 75 | 76 | **Community Impact**: Use of inappropriate language or other behavior deemed 77 | unprofessional or unwelcome in the community. 78 | 79 | **Consequence**: A private, written warning from community leaders, providing 80 | clarity around the nature of the violation and an explanation of why the 81 | behavior was inappropriate. A public apology may be requested. 82 | 83 | ### 2. Warning 84 | 85 | **Community Impact**: A violation through a single incident or series of 86 | actions. 87 | 88 | **Consequence**: A warning with consequences for continued behavior. No 89 | interaction with the people involved, including unsolicited interaction with 90 | those enforcing the Code of Conduct, for a specified period of time. This 91 | includes avoiding interactions in community spaces as well as external channels 92 | like social media. Violating these terms may lead to a temporary or permanent 93 | ban. 94 | 95 | ### 3. Temporary Ban 96 | 97 | **Community Impact**: A serious violation of community standards, including 98 | sustained inappropriate behavior. 99 | 100 | **Consequence**: A temporary ban from any sort of interaction or public 101 | communication with the community for a specified period of time. No public or 102 | private interaction with the people involved, including unsolicited interaction 103 | with those enforcing the Code of Conduct, is allowed during this period. 104 | Violating these terms may lead to a permanent ban. 105 | 106 | ### 4. Permanent Ban 107 | 108 | **Community Impact**: Demonstrating a pattern of violation of community 109 | standards, including sustained inappropriate behavior, harassment of an 110 | individual, or aggression toward or disparagement of classes of individuals. 111 | 112 | **Consequence**: A permanent ban from any sort of public interaction within the 113 | community. 114 | 115 | ## Attribution 116 | 117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 118 | version 2.1, available at 119 | [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. 120 | 121 | Community Impact Guidelines were inspired by 122 | [Mozilla's code of conduct enforcement ladder][Mozilla CoC]. 123 | 124 | For answers to common questions about this code of conduct, see the FAQ at 125 | [https://www.contributor-covenant.org/faq][FAQ]. Translations are available at 126 | [https://www.contributor-covenant.org/translations][translations]. 127 | 128 | [homepage]: https://www.contributor-covenant.org 129 | [v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html 130 | [Mozilla CoC]: https://github.com/mozilla/diversity 131 | [FAQ]: https://www.contributor-covenant.org/faq 132 | [translations]: https://www.contributor-covenant.org/translations 133 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to Transcriptase 2 | We love your input! We want to make contributing to this project as easy and transparent as possible, whether it's: 3 | 4 | - Reporting a bug 5 | - Discussing the current state of the code 6 | - Submitting a fix 7 | - Proposing new features 8 | - Becoming a maintainer 9 | 10 | ## We Develop with Github 11 | We use github to host code, to track issues and feature requests, as well as accept pull requests. 12 | 13 | ## We Use [Github Flow](https://guides.github.com/introduction/flow/index.html), So All Code Changes Happen Through Pull Requests 14 | Pull requests are the best way to propose changes to the codebase (we use [Github Flow](https://guides.github.com/introduction/flow/index.html)). We actively welcome your pull requests: 15 | 16 | 1. Fork the repo and create your branch from `master`. 17 | 2. If you've added code that should be tested, add tests. 18 | 3. If you've changed APIs, update the documentation. 19 | 4. Ensure the test suite passes. 20 | 5. Make sure your code lints. 21 | 6. Issue that pull request! 22 | 23 | ## Any contributions you make will be under the MIT Software License 24 | In short, when you submit code changes, your submissions are understood to be under the same [MIT License](http://choosealicense.com/licenses/mit/) that covers the project. Feel free to contact the maintainers if that's a concern. 25 | 26 | ## Report bugs using Github's [issues](https://github.com/briandk/transcriptase-atom/issues) 27 | We use GitHub issues to track public bugs. Report a bug by [opening a new issue](); it's that easy! 28 | 29 | ## Write bug reports with detail, background, and sample code 30 | [This is an example](http://stackoverflow.com/q/12488905/180626) of a bug report I wrote, and I think it's not a bad model. Here's [another example from Craig Hockenberry](http://www.openradar.me/11905408), an app developer whom I greatly respect. 31 | 32 | **Great Bug Reports** tend to have: 33 | 34 | - A quick summary and/or background 35 | - Steps to reproduce 36 | - Be specific! 37 | - Give sample code if you can. [My stackoverflow question](http://stackoverflow.com/q/12488905/180626) includes sample code that *anyone* with a base R setup can run to reproduce what I was seeing 38 | - What you expected would happen 39 | - What actually happens 40 | - Notes (possibly including why you think this might be happening, or stuff you tried that didn't work) 41 | 42 | People *love* thorough bug reports. I'm not even kidding. 43 | 44 | ## Use a Consistent Coding Style 45 | I'm again borrowing these from [Facebook's Guidelines](https://github.com/facebook/draft-js/blob/a9316a723f9e918afde44dea68b5f9f39b7d9b00/CONTRIBUTING.md) 46 | 47 | * 2 spaces for indentation rather than tabs 48 | * You can try running `npm run lint` for style unification 49 | 50 | ## License 51 | By contributing, you agree that your contributions will be licensed under its MIT License. -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Hugo Romano 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Points of Presence for CDNs 2 | 3 | ![Banner](/banner.png) 4 | 5 | [![npm](https://img.shields.io/npm/v/@adaptivelink/pops.svg)](https://www.npmjs.com/package/@adaptivelink/pops)   ![Test](https://github.com/adaptive/pops/workflows/Test/badge.svg?branch=main) 6 | 7 | ES Module with geolocation and IATA codes of Content Delivery Networks and hosting companies points of presence. Useful for plotting, planning and network measurements. 8 | 9 | ## 🔨 Install with `yarn` or `npm` 10 | 11 | ```bash 12 | yarn add @adaptivelink/pops 13 | ``` 14 | 15 | ```bash 16 | npm i @adaptivelink/pops 17 | ``` 18 | 19 | ## 🛠️ Usage 20 | 21 | ```javascript 22 | import PoPs from "@adaptivelink/pops"; 23 | 24 | /* Geolocation of Cloudflare PoPs */ 25 | console.log(PoPs.cloudflare.geo); 26 | 27 | /* IATA code of Fastly PoPs */ 28 | console.log(PoPs.fastly.code); 29 | 30 | /* Total of locations for AWS Lightsail Datacenters */ 31 | console.log(PoPs.fastly.code.length); 32 | 33 | /* Providers in Madrid */ 34 | console.log(PoPs.MAD.providers); 35 | 36 | /* Location of Lisbon */ 37 | console.log(PoPs.LIS.geo); 38 | 39 | /* All PoPs codes */ 40 | console.log(PoPs.all.code); 41 | 42 | /* All PoPs locations */ 43 | console.log(PoPs.all.geo); 44 | 45 | /* Providers */ 46 | ["alibaba", "arubacloud", "atlanticnet", "azurecdn", "azurevm", 47 | "backblaze", "bunnycdn", "cachefly", "cdn77", "cloudflare", 48 | "cloudfront", "cloudsigma", "deno", "digitalocean", "equinix", 49 | "ec2", "fastly", "flexential", "gcore", "googlecdn", "googlecompute", 50 | "heroku", "hetzner", "hostwinds", "imperva", "ionos", "kamatera", 51 | "keycdn", "leapswitch", "lightsail", "limelight", "linode", "mnx", 52 | "netlify", "ovh", "packet", "scaleway", "stackpath", "upcloud", 53 | "verizonmedia", "vercel", "vultr", "wasabi"] 54 | ``` 55 | 56 | ## 🌐 Supported CDNs and Hosting Providers 57 | 58 | * Alibaba ```alibaba``` 59 | * Arubacloud ```arubacloud``` 60 | * AWS Cloudfront ```cloudfront``` 61 | * AWS EC2 ```ec2``` 🕵️ 62 | * AWS Lightsail ```lightsail``` 🕵️ 63 | * Atlanticnet ```atlanticnet``` 🕵️ 64 | * Azure CDN ```azurecdn``` 65 | * Azure VM ```azurevm``` 66 | * Backblaze ```backblaze``` 67 | * Bunnycdn ```bunnycdn``` 68 | * CacheFly ```cachefly``` 69 | * CDN77 ```cdn77``` 🕵️ 70 | * Cloudflare ```cloudflare``` 🕵️ 71 | * CloudSigma ```cloudsigma``` 72 | * Deno Deploy ```deno``` 🕵️ 73 | * DigitalOcean ```digitalocean``` 🕵️ 74 | * Equinix ```equinix``` 75 | * Fastly ```fastly``` 🕵️ 76 | * Flexential ```flexential``` 77 | * G-Core Labs ```gcore``` 78 | * Google Cloud CDN ```googlecdn``` 79 | * Google Compute Engine ```googlecompute``` 80 | * Heroku ```heroku``` 81 | * Hetzner ```hetzner``` 82 | * Hostwinds ```hostwinds``` 83 | * Imperva ```imperva``` 🕵️ 84 | * Ionos ```ionos``` 85 | * Kamatera ```kamatera``` 86 | * KeyCDN ```keycdn``` 🕵️ 87 | * LeapSwitch ```leapswitch``` 88 | * Limelight Networks ```limelight``` 89 | * Linode ```linode``` 🕵️ 90 | * MNX ```mnx``` 91 | * Netlify ```netlify``` 92 | * OVH ```ovh``` 93 | * Packet ```packet``` 94 | * Scaleway ```scaleway``` 95 | * Stackpath ```stackpath``` 🕵️ 96 | * Upcloud ```upcloud``` 🕵️ 97 | * Verizon Media ```verizonmedia``` 98 | * Vercel ```vercel``` 🕵️ 99 | * Vultr ```vultr``` 🕵️ 100 | * Wasabi ```wasabi``` 101 | 102 | ## 🕵️ Spotters 103 | 104 | Spotters are scheduled GitHub Actions that continuously monitor CDNs and Hosting Providers points of presence locations and cross-reference with this module data. 105 | 106 | ## 🥰 Contribution 107 | 108 | Feel free to suggest or PR more networks and PoP locations. 109 | 110 | ## 💻 Codespaces 111 | 112 | This repo is configured for GitHub Codespaces. 113 | 114 | ## 📒 Jupyter Notebook 115 | 116 | A Jupyter Notebook is available at [Kaggle](https://www.kaggle.com/hugoromano/pops-notebook/), where providers rough coverage is simulated at ~5ms RTT. Source for this notebook in directory `notebooks`. -------------------------------------------------------------------------------- /banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adaptive/pops/e2fc8ba7e82b18e78a2e51bab53507da9143d4ec/banner.png -------------------------------------------------------------------------------- /bun.lockb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adaptive/pops/e2fc8ba7e82b18e78a2e51bab53507da9143d4ec/bun.lockb -------------------------------------------------------------------------------- /data/iata-filtered.js: -------------------------------------------------------------------------------- 1 | /** IATA airports location filtered*/ 2 | const iata = new Map([ 3 | ["AAE", [36.82, 7.81]], 4 | ["ABE", [40.65, -75.43]], 5 | ["ABJ", [5.25, -3.93]], 6 | ["ABQ", [35.05, -106.62]], 7 | ["ACC", [5.61, -0.17]], 8 | ["ADB", [38.29, 27.15]], 9 | ["ADL", [-34.94, 138.54]], 10 | ["AKL", [-37, 174.78]], 11 | ["ALA", [43.35, 77.01]], 12 | ["ALG", [36.7, 3.21]], 13 | ["AMD", [23.07, 72.62]], 14 | ["AMM", [31.72, 35.99]], 15 | ["AMS", [52.31, 4.76]], 16 | ["ANC", [61.17, -150]], 17 | ["ARI", [-18.35, -70.34]], 18 | ["ARN", [59.65, 17.93]], 19 | ["ARU", [-21.14, -50.43]], 20 | ["ASK", [6.82, -5.28]], 21 | ["ASU", [-25.24, -57.51]], 22 | ["ATH", [37.94, 23.95]], 23 | ["ATL", [33.64, -84.44]], 24 | ["AUH", [24.43, 54.65]], 25 | ["AUS", [30.2, -97.67]], 26 | ["AVL", [35.44, -82.54]], 27 | ["BAH", [26.27, 50.63]], 28 | ["BAQ", [10.89, -74.78]], 29 | ["BAX", [53.36, 83.55]], 30 | ["BBI", [20.25, 85.82]], 31 | ["BCN", [41.3, 2.08]], 32 | ["BEG", [44.82, 20.31]], 33 | ["BEL", [-1.39, -48.48]], 34 | ["BEY", [33.83, 35.49]], 35 | ["BGI", [13.08, -59.49]], 36 | ["BGR", [44.81, -68.82]], 37 | ["BGW", [33.28, 44.5]], 38 | ["BHY", [21.54, 109.29]], 39 | ["BKK", [13.69, 100.75]], 40 | ["BLR", [13.2, 77.71]], 41 | ["BMA", [59.36, 17.95]], 42 | ["BNA", [36.13, -86.67]], 43 | ["BNE", [-27.4, 153.11]], 44 | ["BNU", [-27, -49]], 45 | ["BOD", [44.83, -0.7]], 46 | ["BOG", [4.7, -74.14]], 47 | ["BOM", [19.1, 72.87]], 48 | ["BOS", [42.37, -71.02]], 49 | ["BRU", [50.9, 4.48]], 50 | ["BSB", [-15.87, -47.92]], 51 | ["BSR", [30.56, 47.79]], 52 | ["BTH", [1.12, 104.12]], 53 | ["BTS", [48.17, 17.2]], 54 | ["BUD", [47.43, 19.26]], 55 | ["BUF", [42.93, -78.73]], 56 | ["BUR", [34.2, -118.35]], 57 | ["BWN", [4.95, 114.93]], 58 | ["CAI", [30.12, 31.41]], 59 | ["CAN", [23.39, 113.3]], 60 | ["CAW", [-21.7, -41.3]], 61 | ["CBF", [41.26, -95.76]], 62 | ["CBR", [-35.31, 149.19]], 63 | ["CCU", [22.65, 88.44]], 64 | ["CDG", [49, 2.57]], 65 | ["CEB", [10.31, 123.98]], 66 | ["CFC", [-26.79, -50.94]], 67 | ["CGB", [-15.65, -56.12]], 68 | ["CGD", [28.92, 111.64]], 69 | ["CGH", [-23.63, -46.66]], 70 | ["CGK", [-6.13, 106.66]], 71 | ["CGO", [34.53, 113.84]], 72 | ["CGP", [22.25, 91.82]], 73 | ["CGY", [8.61, 124.46]], 74 | ["CHA", [35.04, -85.2]], 75 | ["CHC", [-43.49, 172.54]], 76 | ["CHI", [41.88, -87.77]], 77 | ["CHS", [32.88, -80.04]], 78 | ["CJR", [38.53, -77.86]], 79 | ["CKG", [29.72, 106.63]], 80 | ["CLE", [41.41, -81.84]], 81 | ["CLT", [35.22, -80.94]], 82 | ["CMB", [7.17, 79.89]], 83 | ["CMH", [40, -82.88]], 84 | ["CNF", [-19.63, -43.96]], 85 | ["CNN", [56.9, 124.88]], 86 | ["CNX", [18.77, 98.97]], 87 | ["COK", [10.16, 76.39]], 88 | ["COR", [-31.32, -64.21]], 89 | ["CPH", [55.63, 12.65]], 90 | ["CPM", [33.89, -118.24]], 91 | ["CPT", [-33.97, 18.6]], 92 | ["CRK", [15.18, 120.55]], 93 | ["CSX", [28.19, 113.21]], 94 | ["CTU", [30.58, 103.96]], 95 | ["CVG", [39.06, -84.66]], 96 | ["CWB", [-25.53, -49.18]], 97 | ["CWL", [51.4, -3.34]], 98 | ["CYS", [41.16, -104.82]], 99 | ["CZX", [31.91, 119.78]], 100 | ["DAC", [23.85, 90.41]], 101 | ["DAD", [16.06, 108.2]], 102 | ["DAL", [32.84, -96.85]], 103 | ["DAR", [-6.87, 39.2]], 104 | ["DCA", [38.85, -77.04]], 105 | ["DEL", [28.56, 77.1]], 106 | ["DEN", [39.85, -104.67]], 107 | ["DFW", [32.9, -97.04]], 108 | ["DKR", [14.74, -17.49]], 109 | ["DLC", [38.96, 121.54]], 110 | ["DLS", [45.62, -121.16]], 111 | ["DME", [55.41, 37.9]], 112 | ["DMM", [26.47, 49.8]], 113 | ["DOH", [25.27, 51.56]], 114 | ["DPS", [-8.75, 115.17]], 115 | ["DSM", [41.53, -93.65]], 116 | ["DTW", [42.21, -83.36]], 117 | ["DUB", [53.43, -6.24]], 118 | ["DUR", [-29.61, 31.12]], 119 | ["DUS", [51.28, 6.77]], 120 | ["DVN", [41.61, -90.59]], 121 | ["DXB", [25.25, 55.35]], 122 | ["EBB", [0.05, 32.44]], 123 | ["EBL", [36.24, 43.96]], 124 | ["EDI", [55.95, -3.36]], 125 | ["ENS", [52.27, 6.88]], 126 | ["ESB", [40.11, 32.99]], 127 | ["EVN", [40.15, 44.4]], 128 | ["EWR", [40.69, -74.18]], 129 | ["EZE", [-34.81, -58.54]], 130 | ["FCO", [41.79, 12.25]], 131 | ["FIH", [-4.39, 15.45]], 132 | ["FJR", [25.11, 56.33]], 133 | ["FLL", [26.07, -80.14]], 134 | ["FLN", [-27.66, -48.55]], 135 | ["FOC", [25.93, 119.67]], 136 | ["FOR", [-3.78, -38.54]], 137 | ["FRA", [50.05, 8.57]], 138 | ["FRU", [43.05, 74.47]], 139 | ["FSD", [43.58, -96.73]], 140 | ["FTY", [33.78, -84.52]], 141 | ["FUK", [33.58, 130.44]], 142 | ["FUO", [23.13, 113.28]], 143 | ["GBE", [-24.56, 25.92]], 144 | ["GDL", [20.53, -103.3]], 145 | ["GEO", [6.5, -58.25]], 146 | ["GIG", [-22.81, -43.25]], 147 | ["GND", [12, -61.79]], 148 | ["GNV", [29.69, -82.28]], 149 | ["GOJ", [56.22, 43.79]], 150 | ["GOT", [57.67, 12.29]], 151 | ["GRQ", [53.12, 6.58]], 152 | ["GRU", [-23.43, -46.48]], 153 | ["GUA", [14.59, -90.53]], 154 | ["GUM", [13.49, 144.8]], 155 | ["GVA", [46.23, 6.11]], 156 | ["GYD", [40.46, 50.05]], 157 | ["GYE", [-2.14, -79.88]], 158 | ["GYN", [-16.63, -49.23]], 159 | ["HAK", [19.94, 110.46]], 160 | ["HAM", [53.63, 10.01]], 161 | ["HAN", [21.21, 105.8]], 162 | ["HBA", [-42.84, 147.51]], 163 | ["HEF", [38.72, -77.52]], 164 | ["HEL", [60.32, 24.97]], 165 | ["HET", [40.85, 111.81]], 166 | ["HFA", [32.81, 35.04]], 167 | ["HFE", [31.99, 116.98]], 168 | ["HGH", [30.24, 120.43]], 169 | ["HHN", [49.95, 7.26]], 170 | ["HHP", [22.29, 114.15]], 171 | ["HIO", [45.54, -122.95]], 172 | ["HKG", [22.32, 113.94]], 173 | ["HND", [35.55, 139.78]], 174 | ["HNL", [21.33, -157.92]], 175 | ["HRE", [-17.92, 31.1]], 176 | ["HYD", [17.24, 78.43]], 177 | ["HYN", [28.56, 121.42]], 178 | ["IAD", [38.95, -77.45]], 179 | ["IAH", [29.98, -95.34]], 180 | ["ICN", [37.45, 126.45]], 181 | ["ICT", [37.65, -97.43]], 182 | ["IEV", [50.4, 30.45]], 183 | ["IND", [39.71, -86.3]], 184 | ["ISB", [33.61, 73.11]], 185 | ["IST", [40.98, 28.82]], 186 | ["ISU", [35.56, 45.31]], 187 | ["ITJ", [-26.88, -48.65]], 188 | ["ITM", [34.79, 135.44]], 189 | ["IXC", [30.67, 76.8]], 190 | ["JAX", [30.49, -81.68]], 191 | ["JDO", [-7.2, -39.32]], 192 | ["JED", [21.67, 39.15]], 193 | ["JFK", [40.64, -73.79]], 194 | ["JHB", [1.64, 103.67]], 195 | ["JIB", [11.55, 43.15]], 196 | ["JNB", [-26.13, 28.23]], 197 | ["JOG", [-7.79, 110.44]], 198 | ["JOI", [-26.23, -48.78]], 199 | ["JRS", [31.87, 35.21]], 200 | ["JSR", [23.18, 89.16]], 201 | ["KBP", [50.34, 30.9]], 202 | ["KEF", [64, -22.62]], 203 | ["KGL", [-1.96, 30.14]], 204 | ["KHH", [22.57, 120.35]], 205 | ["KHI", [24.9, 67.17]], 206 | ["KHN", [28.86, 115.91]], 207 | ["KHV", [48.52, 135.17]], 208 | ["KIN", [17.94, -76.78]], 209 | ["KIV", [46.94, 28.93]], 210 | ["KIX", [34.44, 135.24]], 211 | ["KJA", [56.18, 92.48]], 212 | ["KLD", [56.92, 35.92]], 213 | ["KMG", [25.1, 102.93]], 214 | ["KNU", [26.4, 80.41]], 215 | ["KTM", [27.7, 85.36]], 216 | ["KUF", [53.51, 50.15]], 217 | ["KUL", [2.76, 101.71]], 218 | ["KWE", [26.54, 106.8]], 219 | ["KWI", [29.24, 47.97]], 220 | ["KZN", [55.61, 49.3]], 221 | ["LAD", [-8.85, 13.23]], 222 | ["LAS", [36.09, -115.15]], 223 | ["LAX", [33.94, -118.41]], 224 | ["LCA", [34.88, 33.63]], 225 | ["LCK", [39.81, -82.93]], 226 | ["LCY", [51.5, 0.05]], 227 | ["LED", [59.81, 30.31]], 228 | ["LEE", [28.83, -81.81]], 229 | ["LGA", [40.77, -73.87]], 230 | ["LGW", [51.16, -0.16]], 231 | ["LHE", [31.52, 74.4]], 232 | ["LHR", [51.47, -0.45]], 233 | ["LHW", [36.51, 103.62]], 234 | ["LIM", [-12.02, -77.11]], 235 | ["LIN", [45.46, 9.28]], 236 | ["LIS", [38.77, -9.13]], 237 | ["LLA", [65.55, 22.12]], 238 | ["LLK", [38.75, 48.82]], 239 | ["LOS", [6.58, 3.32]], 240 | ["LPB", [-16.51, -68.18]], 241 | ["LPP", [61.05, 28.16]], 242 | ["LUX", [49.63, 6.21]], 243 | ["LYS", [45.72, 5.08]], 244 | ["MAA", [12.98, 80.16]], 245 | ["MAD", [40.47, -3.57]], 246 | ["MAN", [53.36, -2.27]], 247 | ["MAO", [-3.03, -60.05]], 248 | ["MBA", [-4.03, 39.6]], 249 | ["MCI", [39.29, -94.72]], 250 | ["MCO", [28.43, -81.31]], 251 | ["MCT", [23.59, 58.29]], 252 | ["MDE", [6.17, -75.43]], 253 | ["MDL", [21.94, 96.09]], 254 | ["MEB", [-37.74, 144.9]], 255 | ["MEL", [-37.67, 144.85]], 256 | ["MEM", [35.04, -89.98]], 257 | ["MEX", [19.44, -99.07]], 258 | ["MFE", [26.18, -98.24]], 259 | ["MFM", [22.16, 113.57]], 260 | ["MGM", [32.31, -86.39]], 261 | ["MIA", [25.8, -80.28]], 262 | ["MLE", [4.2, 73.52]], 263 | ["MNL", [14.51, 121.01]], 264 | ["MPM", [-25.92, 32.57]], 265 | ["MRN", [35.82, -81.61]], 266 | ["MRS", [43.44, 5.22]], 267 | ["MRU", [-20.43, 57.68]], 268 | ["MSP", [44.88, -93.21]], 269 | ["MSQ", [53.89, 28.03]], 270 | ["MTY", [25.78, -100.11]], 271 | ["MUC", [48.35, 11.79]], 272 | ["MXP", [45.63, 8.71]], 273 | ["NAG", [21.09, 79.06]], 274 | ["NAP", [40.89, 14.29]], 275 | ["NBO", [-1.32, 36.93]], 276 | ["NJF", [31.99, 44.4]], 277 | ["NNG", [22.61, 108.17]], 278 | ["NOU", [-22.02, 166.22]], 279 | ["NQN", [-38.95, -68.15]], 280 | ["NQZ", [51.03, 71.46]], 281 | ["NRT", [35.77, 140.39]], 282 | ["NUE", [49.49, 11.08]], 283 | ["NVT", [-26.87, -48.63]], 284 | ["OKA", [26.2, 127.65]], 285 | ["OKC", [35.4, -97.6]], 286 | ["OMA", [41.3, -95.9]], 287 | ["ORD", [41.98, -87.9]], 288 | ["ORF", [36.9, -76.21]], 289 | ["ORK", [51.85, -8.49]], 290 | ["ORN", [35.62, -0.61]], 291 | ["ORY", [48.73, 2.36]], 292 | ["OSL", [60.19, 11.1]], 293 | ["OTP", [44.57, 26.08]], 294 | ["OUA", [12.36, -1.51]], 295 | ["OVB", [55.01, 82.67]], 296 | ["OXR", [34.2, -119.21]], 297 | ["PAE", [47.91, -122.28]], 298 | ["PAO", [37.46, -122.11]], 299 | ["PAT", [25.59, 85.09]], 300 | ["PBC", [19.14, -98.37]], 301 | ["PBH", [27.43, 89.42]], 302 | ["PBM", [5.45, -55.19]], 303 | ["PDK", [33.88, -84.3]], 304 | ["PDX", [45.59, -122.59]], 305 | ["PEK", [40.08, 116.59]], 306 | ["PER", [-31.93, 115.96]], 307 | ["PES", [61.68, 34.33]], 308 | ["PHL", [39.88, -75.24]], 309 | ["PHX", [33.44, -112]], 310 | ["PIT", [40.5, -80.26]], 311 | ["PKV", [57.82, 28.3]], 312 | ["PKX", [39.51, 116.41]], 313 | ["PMO", [38.19, 13.1]], 314 | ["PMW", [-10.24, -48.35]], 315 | ["PNH", [11.55, 104.85]], 316 | ["PNQ", [18.58, 73.92]], 317 | ["PNS", [30.48, -87.19]], 318 | ["POA", [-29.99, -51.18]], 319 | ["POS", [10.6, -61.34]], 320 | ["POX", [49.05, 2.1]], 321 | ["PPT", [-17.56, -149.61]], 322 | ["PRG", [50.11, 14.27]], 323 | ["PTY", [9.07, -79.39]], 324 | ["PUS", [35.18, 128.95]], 325 | ["PWQ", [52.18, 77.07]], 326 | ["QHI", [13.23, 100.96]], 327 | ["QPG", [1.35, 103.9]], 328 | ["QRO", [20.6, -100.38]], 329 | ["QWJ", [-22.74, -47.33]], 330 | ["QZO", [43.46, 11.85]], 331 | ["RAO", [-21.14, -47.77]], 332 | ["RDU", [35.87, -78.79]], 333 | ["REC", [-8.13, -34.92]], 334 | ["RGN", [16.9, 96.13]], 335 | ["RHV", [37.33, -121.82]], 336 | ["RIC", [37.51, -77.32]], 337 | ["RIX", [56.92, 23.98]], 338 | ["RMQ", [24.26, 120.61]], 339 | ["ROV", [47.25, 39.75]], 340 | ["RTM", [51.95, 4.43]], 341 | ["RUH", [24.96, 46.7]], 342 | ["RUN", [-20.89, 55.51]], 343 | ["SAN", [32.73, -117.2]], 344 | ["SAT", [29.52, -98.47]], 345 | ["SBN", [41.7, -86.31]], 346 | ["SCL", [-33.4, -70.79]], 347 | ["SDF", [38.19, -85.74]], 348 | ["SDQ", [18.43, -69.68]], 349 | ["SDV", [32.1, 34.79]], 350 | ["SEA", [47.44, -122.3]], 351 | ["SFO", [37.62, -122.39]], 352 | ["SGN", [10.81, 106.66]], 353 | ["SHA", [31.2, 121.34]], 354 | ["SIN", [1.36, 103.99]], 355 | ["SJC", [37.37, -121.93]], 356 | ["SJK", [-23.18, -46.12]], 357 | ["SJO", [10, -84.2]], 358 | ["SJP", [-20.82, -49.42]], 359 | ["SJU", [18.44, -66]], 360 | ["SJW", [38.27, 114.69]], 361 | ["SKG", [40.52, 22.97]], 362 | ["SKP", [41.96, 21.63]], 363 | ["SLC", [40.79, -111.98]], 364 | ["SMF", [38.69, -121.59]], 365 | ["SOD", [-23.48, -47.45]], 366 | ["SOF", [42.69, 23.41]], 367 | ["SSA", [-12.91, -38.34]], 368 | ["STI", [19.4, -70.6]], 369 | ["STL", [38.74, -90.37]], 370 | ["STP", [44.93, -93.07]], 371 | ["STR", [48.69, 9.19]], 372 | ["SUV", [-18.05, 178.56]], 373 | ["SVQ", [37.42, -5.9]], 374 | ["SVX", [56.75, 60.8]], 375 | ["SYD", [-33.93, 151.18]], 376 | ["SZX", [22.64, 113.81]], 377 | ["TAO", [36.27, 120.38]], 378 | ["TAS", [41.26, 69.27]], 379 | ["TBS", [41.67, 44.96]], 380 | ["TGU", [14.06, -87.22]], 381 | ["TIA", [41.42, 19.71]], 382 | ["TIR", [13.64, 79.54]], 383 | ["TLH", [30.4, -84.34]], 384 | ["TLL", [59.42, 24.8]], 385 | ["TLV", [32, 34.87]], 386 | ["TNA", [36.86, 117.21]], 387 | ["TNR", [-18.8, 47.48]], 388 | ["TPA", [27.98, -82.54]], 389 | ["TPE", [25.08, 121.22]], 390 | ["TSN", [39.12, 117.34]], 391 | ["TUL", [36.19, -95.89]], 392 | ["TUN", [36.85, 10.22]], 393 | ["TXL", [52.55, 13.29]], 394 | ["TYN", [37.75, 112.63]], 395 | ["TYO", [35.55, 139.78]], 396 | ["UDI", [-18.88, -48.23]], 397 | ["UFA", [54.57, 55.88]], 398 | ["UIO", [-0.12, -78.36]], 399 | ["ULN", [47.85, 106.76]], 400 | ["URT", [9.13, 99.14]], 401 | ["VCP", [-23.01, -47.14]], 402 | ["VIE", [48.12, 16.56]], 403 | ["VIX", [-20.26, -40.29]], 404 | ["VNO", [54.64, 25.28]], 405 | ["VNY", [34.21, -118.49]], 406 | ["VOZ", [51.81, 39.23]], 407 | ["VTE", [17.98, 102.57]], 408 | ["VVO", [43.38, 132.14]], 409 | ["WAW", [52.17, 20.97]], 410 | ["WDH", [-22.49, 17.46]], 411 | ["WHU", [31.37, 118.37]], 412 | ["WLG", [-41.33, 174.81]], 413 | ["XAP", [-27.09, -52.63]], 414 | ["XFN", [32.15, 112.29]], 415 | ["XIY", [34.44, 108.76]], 416 | ["XNH", [30.94, 46.09]], 417 | ["XNN", [36.53, 102.04]], 418 | ["YHZ", [44.88, -63.51]], 419 | ["YOW", [45.32, -75.67]], 420 | ["YQB", [46.79, -71.38]], 421 | ["YUL", [45.46, -73.75]], 422 | ["YVR", [49.19, -123.18]], 423 | ["YWG", [49.9, -97.23]], 424 | ["YXE", [52.17, -106.69]], 425 | ["YYC", [51.13, -114.01]], 426 | ["YYZ", [43.68, -79.61]], 427 | ["ZAG", [45.73, 16.06]], 428 | ["ZDM", [32.27, 35.02]], 429 | ["ZGN", [22.52, 113.37]], 430 | ["ZHY", [37.57, 105.15]], 431 | ["ZPM", [49.01, 12.1]], 432 | ["ZQZ", [40.74, 114.93]], 433 | ["ZRH", [47.45, 8.56]] 434 | ]); 435 | 436 | export default iata; 437 | -------------------------------------------------------------------------------- /data/index.js: -------------------------------------------------------------------------------- 1 | import iata from "./iata-filtered.js"; 2 | import adaptive from "./providers/adaptive.js"; 3 | import alibaba from "./providers/alibaba.js"; 4 | import arubacloud from "./providers/arubacloud.js"; 5 | import atlanticnet from "./providers/atlanticnet.js"; 6 | import azurecdn from "./providers/azurecdn.js"; 7 | import azurevm from "./providers/azurevm.js"; 8 | import backblaze from "./providers/backblaze.js"; 9 | import bunnycdn from "./providers/bunnycdn.js"; 10 | import cachefly from "./providers/cachefly.js"; 11 | import cdn77 from "./providers/cdn77.js"; 12 | import cloudflare from "./providers/cloudflare.js"; 13 | import cloudfront from "./providers/cloudfront.js"; 14 | import cloudsigma from "./providers/cloudsigma.js"; 15 | import deno from "./providers/deno.js"; 16 | import digitalocean from "./providers/digitalocean.js"; 17 | import equinix from "./providers/equinix.js"; 18 | import ec2 from "./providers/ec2.js"; 19 | import fastly from "./providers/fastly.js"; 20 | import flexential from "./providers/flexential.js"; 21 | import gcore from "./providers/gcore.js"; 22 | import googlecdn from "./providers/googlecdn.js"; 23 | import googlecompute from "./providers/googlecompute.js"; 24 | import heroku from "./providers/heroku.js"; 25 | import hetzner from "./providers/hetzner.js"; 26 | import hivelocity from "./providers/hivelocity.js"; 27 | import hostwinds from "./providers/hostwinds.js"; 28 | import imperva from "./providers/imperva.js"; 29 | import ionos from "./providers/ionos.js"; 30 | import kamatera from "./providers/kamatera.js"; 31 | import keycdn from "./providers/keycdn.js"; 32 | import leapswitch from "./providers/leapswitch.js"; 33 | import lightsail from "./providers/lightsail.js"; 34 | import limelight from "./providers/limelight.js"; 35 | import linode from "./providers/linode.js"; 36 | import mnx from "./providers/mnx.js"; 37 | import netlify from "./providers/netlify.js"; 38 | import ovh from "./providers/ovh.js"; 39 | import packet from "./providers/packet.js"; 40 | import scaleway from "./providers/scaleway.js"; 41 | import stackpath from "./providers/stackpath.js"; 42 | import sucuri from "./providers/sucuri.js"; 43 | import upcloud from "./providers/upcloud.js"; 44 | import verizonmedia from "./providers/verizonmedia.js"; 45 | import vercel from "./providers/vercel.js"; 46 | import vultr from "./providers/vultr.js"; 47 | import wasabi from "./providers/wasabi.js"; 48 | 49 | const providers = { 50 | adaptive, 51 | alibaba, 52 | arubacloud, 53 | atlanticnet, 54 | azurecdn, 55 | azurevm, 56 | backblaze, 57 | bunnycdn, 58 | cachefly, 59 | cdn77, 60 | cloudflare, 61 | cloudfront, 62 | cloudsigma, 63 | deno, 64 | digitalocean, 65 | equinix, 66 | ec2, 67 | fastly, 68 | flexential, 69 | gcore, 70 | googlecdn, 71 | googlecompute, 72 | heroku, 73 | hetzner, 74 | hivelocity, 75 | hostwinds, 76 | imperva, 77 | ionos, 78 | kamatera, 79 | keycdn, 80 | leapswitch, 81 | lightsail, 82 | limelight, 83 | linode, 84 | mnx, 85 | netlify, 86 | ovh, 87 | packet, 88 | scaleway, 89 | stackpath, 90 | sucuri, 91 | upcloud, 92 | verizonmedia, 93 | vercel, 94 | vultr, 95 | wasabi 96 | }; 97 | 98 | const popsData = { 99 | iata, 100 | providers 101 | }; 102 | 103 | export default popsData; 104 | -------------------------------------------------------------------------------- /data/providers/adaptive.js: -------------------------------------------------------------------------------- 1 | const adaptive = { 2 | name: "Adaptive Link", 3 | url: "https://adaptive.link", 4 | pops: [ 5 | "AMS", // Amsterdam (Netherlands) 6 | "BOM", // Mumbai (India) 7 | "CDG", // Paris (France) 8 | "CMH", // Columbus (US) 9 | "DFW", // Dallas (US) 10 | "DUB", // Dublin (Ireland) 11 | "GRU", // Sao Paulo (Brazil) 12 | "HEL", // Helsinki (Finland) 13 | "ICN", // Seoul (South Korea) 14 | "JFK", // New York (US) 15 | "LHR", // London (UK) 16 | "MAD", // Madrid (Spain) 17 | "MEX", // Mexico City (Mexico) 18 | "MIA", // Miami (US) 19 | "NRT", // Tokyo (Japan) 20 | "NUE", // Nuremberg (Germany) 21 | "PDX", // Portland (US) 22 | "SFO", // San Francisco (US) 23 | "SIN", // Singapore (Singapore) 24 | "SYD", // Sydney (Australia) 25 | "YYZ" // Toronto (Canada) 26 | ] 27 | }; 28 | 29 | export default adaptive; 30 | -------------------------------------------------------------------------------- /data/providers/alibaba.js: -------------------------------------------------------------------------------- 1 | const alibaba = { 2 | name: "Alibaba Cloud", 3 | url: "https://www.alibabacloud.com/", 4 | pops: [ 5 | "BOM", 6 | "CGK", 7 | "CTU", 8 | "DXB", 9 | "FRA", 10 | "HET", 11 | "HGH", 12 | "HKG", 13 | "IAD", 14 | "KUL", 15 | "LHR", 16 | "NRT", 17 | "PEK", 18 | "SHA", 19 | "SIN", 20 | "SJC", 21 | "SYD", 22 | "SZX", 23 | "TAO", 24 | "ZQZ" 25 | ] 26 | }; 27 | 28 | export default alibaba; 29 | -------------------------------------------------------------------------------- /data/providers/arubacloud.js: -------------------------------------------------------------------------------- 1 | const arubacloud = { 2 | name: "Aruba Cloud", 3 | url: "https://www.arubacloud.com/", 4 | pops: [ 5 | "CDG", // Paris (France) 6 | "FRA", // Frankfurt (Germany) 7 | "LHR", // London (UK) 8 | "MXP", // Milan (Italy) 9 | "PRG", // Prague (Czech Republic) 10 | "QZO", // Arezzo (Italy) 11 | "WAW" // Warsaw (Poland) 12 | ] 13 | }; 14 | 15 | export default arubacloud; 16 | -------------------------------------------------------------------------------- /data/providers/atlanticnet.js: -------------------------------------------------------------------------------- 1 | const atlanticnet = { 2 | name: "Atlantic.Net", 3 | url: "https://www.atlantic.net/", 4 | pops: [ 5 | "DFW", // Dallas (US) 6 | "IAD", // Washington DC (US) 7 | "JFK", // New York (US) 8 | "LHR", // London (UK) 9 | "MCO", // Orlando (US) 10 | "SFO", // San Francisco (US) 11 | "SIN", // Singapore (Singapore) 12 | "YYZ" // Toronto (Canada) 13 | ] 14 | }; 15 | 16 | export default atlanticnet; 17 | -------------------------------------------------------------------------------- /data/providers/azurecdn.js: -------------------------------------------------------------------------------- 1 | const azurecdn = { 2 | name: "Azure CDN", 3 | url: "https://azure.microsoft.com/en-us/services/cdn/", 4 | pops: [ 5 | "AKL", 6 | "AMS", 7 | "ARN", 8 | "ATL", 9 | "BAQ", 10 | "BLR", 11 | "BOS", 12 | "BTH", 13 | "BUR", 14 | "CDG", 15 | "CGK", 16 | "CPH", 17 | "CPM", 18 | "DCA", 19 | "DEL", 20 | "DEN", 21 | "DFW", 22 | "EWR", 23 | "EZE", 24 | "FJR", 25 | "FLL", 26 | "FRA", 27 | "GIG", 28 | "GRU", 29 | "HEL", 30 | "HHP", 31 | "HKG", 32 | "HND", 33 | "IAD", 34 | "ICN", 35 | "ITM", 36 | "JFK", 37 | "JNB", 38 | "KHH", 39 | "KIX", 40 | "LAX", 41 | "LCY", 42 | "LGA", 43 | "LHR", 44 | "LIM", 45 | "MAA", 46 | "MAD", 47 | "MCT", 48 | "MDE", 49 | "MEB", 50 | "MEL", 51 | "MEX", 52 | "MIA", 53 | "MRS", 54 | "MXP", 55 | "NAG", 56 | "NRT", 57 | "ORD", 58 | "ORY", 59 | "OXR", 60 | "PAE", 61 | "PBC", 62 | "PHL", 63 | "PNQ", 64 | "POX", 65 | "QRO", 66 | "RHV", 67 | "RIX", 68 | "RTM", 69 | "SCL", 70 | "SEA", 71 | "SIN", 72 | "SJC", 73 | "SYD", 74 | "TIR", 75 | "UIO", 76 | "VIE", 77 | "VNY", 78 | "WAW" 79 | ] 80 | }; 81 | 82 | export default azurecdn; 83 | -------------------------------------------------------------------------------- /data/providers/azurevm.js: -------------------------------------------------------------------------------- 1 | const azurevm = { 2 | name: "Azure VM", 3 | url: "https://azure.microsoft.com/en-us/global-infrastructure/services/?products=virtual-machines", 4 | pops: [ 5 | "AMS", 6 | "BOM", 7 | "CBR", 8 | "CDG", 9 | "CHI", 10 | "CWL", 11 | "CYS", 12 | "DFW", 13 | "DSM", 14 | "DUB", 15 | "DXB", 16 | "FRA", 17 | "GRU", 18 | "HKG", 19 | "IAD", 20 | "ICN", 21 | "ITM", 22 | "JNB", 23 | "LAX", 24 | "LHR", 25 | "MAA", 26 | "MEL", 27 | "OSL", 28 | "PEK", 29 | "PHX", 30 | "PNQ", 31 | "PUS", 32 | "SAN", 33 | "SEA", 34 | "SHA", 35 | "SIN", 36 | "SJC", 37 | "SYD", 38 | "TYO", 39 | "YQB", 40 | "YYZ", 41 | "ZRH" 42 | ] 43 | }; 44 | 45 | export default azurevm; 46 | -------------------------------------------------------------------------------- /data/providers/backblaze.js: -------------------------------------------------------------------------------- 1 | const backblaze = { 2 | name: "Backblaze", 3 | url: "https://www.backblaze.com/", 4 | pops: [ 5 | "AMS", // Amsterdam (Netherlands) 6 | "PHX", // Phoenix (US) 7 | "SMF" // Sacramento (US) 8 | ] 9 | }; 10 | 11 | export default backblaze; 12 | -------------------------------------------------------------------------------- /data/providers/bunnycdn.js: -------------------------------------------------------------------------------- 1 | const bunnycdn = { 2 | name: "BunnyCDN", 3 | url: "https://bunnycdn.com/", 4 | pops: [ 5 | "ADL", 6 | "AKL", 7 | "AMS", 8 | "ATL", 9 | "BLR", 10 | "BNE", 11 | "BOM", 12 | "CDG", 13 | "DEN", 14 | "DFW", 15 | "DME", 16 | "FRA", 17 | "GRU", 18 | "HEL", 19 | "HKG", 20 | "IAD", 21 | "ICN", 22 | "IST", 23 | "JFK", 24 | "JNB", 25 | "LAX", 26 | "LHR", 27 | "LOS", 28 | "MAD", 29 | "MEL", 30 | "MIA", 31 | "MXP", 32 | "NRT", 33 | "ORD", 34 | "OSL", 35 | "OTP", 36 | "PER", 37 | "PRG", 38 | "SCL", 39 | "SEA", 40 | "SIN", 41 | "SJC", 42 | "SYD", 43 | "TLV", 44 | "VNO", 45 | "WAW", 46 | "YYZ" 47 | ] 48 | }; 49 | 50 | export default bunnycdn; 51 | -------------------------------------------------------------------------------- /data/providers/cachefly.js: -------------------------------------------------------------------------------- 1 | const cachefly = { 2 | name: "CacheFly", 3 | url: "https://www.cachefly.com/", 4 | pops: [ 5 | "AMS", 6 | "ARN", 7 | "ATL", 8 | "BKK", 9 | "BOG", 10 | "BOM", 11 | "BOS", 12 | "CDG", 13 | "CGK", 14 | "DEN", 15 | "DFW", 16 | "DME", 17 | "DOH", 18 | "DVN", 19 | "DXB", 20 | "EZE", 21 | "FOR", 22 | "FRA", 23 | "GIG", 24 | "GRU", 25 | "HEL", 26 | "HKG", 27 | "IAD", 28 | "ICN", 29 | "IST", 30 | "JFK", 31 | "JNB", 32 | "LAX", 33 | "LED", 34 | "LHR", 35 | "LIM", 36 | "LIS", 37 | "LPB", 38 | "MAD", 39 | "MEL", 40 | "MIA", 41 | "MXP", 42 | "NRT", 43 | "ORD", 44 | "OTP", 45 | "PEK", 46 | "PER", 47 | "PHX", 48 | "PRG", 49 | "QRO", 50 | "RUH", 51 | "SCL", 52 | "SEA", 53 | "SHA", 54 | "SIN", 55 | "SJC", 56 | "SJU", 57 | "SYD", 58 | "TLV", 59 | "VIE", 60 | "WAW", 61 | "YUL", 62 | "YYC", 63 | "YYZ", 64 | "ZRH" 65 | ] 66 | }; 67 | 68 | export default cachefly; 69 | -------------------------------------------------------------------------------- /data/providers/cdn77.js: -------------------------------------------------------------------------------- 1 | const cdn77 = { 2 | name: "CDN77", 3 | url: "https://www.cdn77.com/", 4 | pops: [ 5 | "AMS", // Amsterdam (Netherlands) 6 | "ARN", // Stockholm (Sweden) 7 | "ATL", // Atlanta (US) 8 | "BOG", // Bogota (Colombia) 9 | "BOM", // Mumbai (India) 10 | "BTS", // Bratislava (Slovakia) 11 | "CDG", // Paris (France) 12 | "CGK", // Jakarta (Indonesia) 13 | "CPT", // Cape Town (South Africa) 14 | "DEN", // Denver (US) 15 | "DFW", // Dallas (US) 16 | "DME", // Moscow (Russia) 17 | "EBL", // Erbil (Iraq) 18 | "EZE", // Buenos Aires (Argentina) 19 | "FJR", // Fujairah (United Arab Emirates) 20 | "FRA", // Frankfurt (Germany) 21 | "GRU", // Sao Paulo (Brazil) 22 | "GYE", // Guayaquil (Ecuador) 23 | "HKG", // Hong Kong (China) 24 | "IAD", // Washington (US) 25 | "IEV", // Kiev (Ukraine) 26 | "IST", // Istanbul (Turkey) 27 | "JED", // Jeddah (Saudi Arabia) 28 | "JFK", // New York (US) 29 | "KBP", // Kiev (Ukraine) 30 | "LAX", // Los Angeles (US) 31 | "LHR", // London (United Kingdom) 32 | "LIM", // Lima (Peru) 33 | "MAD", // Madrid (Spain) 34 | "MCT", // Muscat (Oman) 35 | "MIA", // Miami (US) 36 | "MRS", // Marseille (France) 37 | "MSQ", // Minsk (Belarus) 38 | "MXP", // Milan (Italy) 39 | "NRT", // Tokyo (Japan) 40 | "ORD", // Chicago (US) 41 | "OTP", // Bucharest (Romania) 42 | "PRG", // Prague (Czech Republic) 43 | "PTY", // Panama City (Panama) 44 | "QRO", // Queretaro (Mexico) 45 | "RUH", // Riyadh (Saudi Arabia) 46 | "SCL", // Santiago (Chile) 47 | "SEA", // Seattle (US) 48 | "SIN", // Singapore (Singapore) 49 | "SJC", // San Jose (US) 50 | "SOF", // Sofia (Bulgaria) 51 | "SYD", // Sydney (Australia) 52 | "TLV", // Tel Aviv (Israel) 53 | "TPE", // Taipei (Taiwan) 54 | "UIO", // Quito (Ecuador) 55 | "VIE", // Vienna (Austria) 56 | "WAW", // Warsaw (Poland) 57 | "YYZ", // Toronto (Canada) 58 | "ZAG", // Zagreb (Croatia) 59 | "ZRH" // Zurich (Switzerland) 60 | ] 61 | }; 62 | 63 | export default cdn77; 64 | -------------------------------------------------------------------------------- /data/providers/cloudflare.js: -------------------------------------------------------------------------------- 1 | const cloudflare = { 2 | name: "Cloudflare", 3 | url: "https://www.cloudflare.com", 4 | pops: [ 5 | "AAE", // Annaba (Algeria) 6 | "ABJ", // Abidjan (Ivory Coast) 7 | "ABQ", // Albuquerque (US) 8 | "ACC", // Accra (Ghana) 9 | "ADB", // Izmir (Turkey) 10 | "ADL", // Adelaide (Australia) 11 | "AKL", // Auckland (New Zealand) 12 | "ALA", // Almaty (Kazakhstan) 13 | "ALG", // Algiers (Algeria) 14 | "AMD", // Ahmedabad (India) 15 | "AMM", // Amman (Jordan) 16 | "AMS", // Amsterdam (Netherlands) 17 | "ANC", // Anchorage (US) 18 | "ARI", // Arica (Chile) 19 | "ARN", // Stockholm (Sweden) 20 | "ARU", // Aracaju (Brazil) 21 | "ASK", // Asahikawa (Japan) 22 | "ASU", // Asuncion (Paraguay) 23 | "ATH", // Athens (Greece) 24 | "ATL", // Atlanta (US) 25 | "AUS", // Austin (US) 26 | "BAH", // Bahrain (Bahrain) 27 | "BAQ", // Barranquilla (Colombia) 28 | "BBI", // Bhubaneswar (India) 29 | "BCN", // Barcelona (Spain) 30 | "BEG", // Belgrade (Serbia) 31 | "BEL", // Belem (Brazil) 32 | "BEY", // Beirut (Lebanon) 33 | "BGI", // Bridgetown (Barbados) 34 | "BGR", // Bangor (US) 35 | "BGW", // Baghdad (Iraq) 36 | "BHY", // Beihai (China) 37 | "BKK", // Bangkok (Thailand) 38 | "BLR", // Bangalore (India) 39 | "BNA", // Nashville (US) 40 | "BNE", // Brisbane (Australia) 41 | "BNU", // Blumenau (Brazil) 42 | "BOD", // Bordeaux (France) 43 | "BOG", // Bogota (Colombia) 44 | "BOM", // Mumbai (India) 45 | "BOS", // Boston (US) 46 | "BRU", // Brussels (Belgium) 47 | "BSB", // Brasilia (Brazil) 48 | "BSR", // Basra (Iraq) 49 | "BTS", // Bratislava (Slovakia) 50 | "BUD", // Budapest (Hungary) 51 | "BUF", // Buffalo (US) 52 | "BWN", // Bandar Seri Begawan (Brunei) 53 | "CAI", // Cairo (Egypt) 54 | "CAN", // Guangzhou (China) 55 | "CAW", // Campos (Brazil) 56 | "CBR", // Canberra (Australia) 57 | "CCU", // Calcutta (India) 58 | "CDG", // Paris (France) 59 | "CEB", // Cebu (Philippines) 60 | "CFC", // Cacador (Brazil) 61 | "CGB", // Cuiaba (Brazil) 62 | "CGD", // Changde (China) 63 | "CGK", // Jakarta (Indonesia) 64 | "CGO", // Zhengzhou (China) 65 | "CGP", // Chittagong (Bangladesh) 66 | "CGY", // Cagayan de Oro (Philippines) 67 | "CHC", // Christchurch (New Zealand) 68 | "CKG", // Chongqing (China) 69 | "CLE", // Cleveland (US) 70 | "CLT", // Charlotte (US) 71 | "CMB", // Colombo (Sri Lanka) 72 | "CMH", // Columbus (US) 73 | "CNF", // Belo Horizonte (Brazil) 74 | "CNN", // Kannur (India) 75 | "CNX", // Chiang Mai (Thailand) 76 | "COK", // Kochi (India) 77 | "COR", // Cordoba (Argentina) 78 | "CPH", // Copenhagen (Denmark) 79 | "CPT", // Cape Town (South Africa) 80 | "CRK", // Clark (Philippines) 81 | "CSX", // Changsha (China) 82 | "CTU", // Chengdu (China) 83 | "CWB", // Curitiba (Brazil) 84 | "CZX", // Changzhou (China) 85 | "DAC", // Dhaka (Bangladesh) 86 | "DAD", // Da Nang (Vietnam) 87 | "DAR", // Dar es Salaam (Tanzania) 88 | "DEL", // Delhi (India) 89 | "DEN", // Denver (US) 90 | "DFW", // Dallas (US) 91 | "DKR", // Dakar (Senegal) 92 | "DLC", // Dalian (China) 93 | "DME", // Moscow (Russia) 94 | "DMM", // Dammam (Saudi Arabia) 95 | "DOH", // Doha (Qatar) 96 | "DPS", // Denpasar (Indonesia) 97 | "DTW", // Detroit (US) 98 | "DUB", // Dublin (Ireland) 99 | "DUR", // Durban (South Africa) 100 | "DUS", // Dusseldorf (Germany) 101 | "DXB", // Dubai (United Arab Emirates) 102 | "EBB", // Entebbe (Uganda) 103 | "EBL", // Erbil (Iraq) 104 | "EDI", // Edinburgh (United Kingdom) 105 | "EVN", // Yerevan (Armenia) 106 | "EWR", // Newark (US) 107 | "EZE", // Buenos Aires (Argentina) 108 | "FCO", // Rome (Italy) 109 | "FIH", // Kinshasa (Congo) 110 | "FLN", // Florianopolis (Brazil) 111 | "FOC", // Fuzhou (China) 112 | "FOR", // Fortaleza (Brazil) 113 | "FRA", // Frankfurt (Germany) 114 | "FSD", // Sioux Falls (US) 115 | "FUK", // Fukuoka (Japan) 116 | "FUO", // Foshan (China) 117 | "GBE", // Gaborone (Botswana) 118 | "GDL", // Guadalajara (Mexico) 119 | "GEO", // Georgetown (Guyana) 120 | "GIG", // Rio de Janeiro (Brazil) 121 | "GND", // Grenada(Granada) 122 | "GOT", // Gothenburg (Sweden) 123 | "GRU", // Sao Paulo (Brazil) 124 | "GUA", // Guatemala City (Guatemala) 125 | "GUM", // Guam (Guam) 126 | "GVA", // Geneva (Switzerland) 127 | "GYD", // Baku (Azerbaijan) 128 | "GYE", // Guayaquil (Ecuador) 129 | "GYN", // Goiania (Brazil) 130 | "HAK", // Haikou (China) 131 | "HAM", // Hamburg (Germany) 132 | "HAN", // Hanoi (Vietnam) 133 | "HBA", // Hobart (Australia) 134 | "HEL", // Helsinki (Finland) 135 | "HFA", // Haifa (Israel) 136 | "HFE", // Hefei (China) 137 | "HGH", // Hangzhou (China) 138 | "HKG", // Hong Kong (China) 139 | "HNL", // Honolulu (US) 140 | "HRE", // Harare (Zimbabwe) 141 | "HYD", // Hyderabad (India) 142 | "HYN", // Huangyan (China) 143 | "IAD", // Washington, DC (US) 144 | "IAH", // Houston (US) 145 | "ICN", // Seoul (South Korea) 146 | "IND", // Indianapolis (US) 147 | "ISB", // Islamabad (Pakistan) 148 | "IST", // Istanbul (Turkey) 149 | "ISU", // Sulaymaniyah (Iraq) 150 | "ITJ", // Ito (Japan) 151 | "IXC", // Ixtepec (Mexico) 152 | "JAX", // Jacksonville (US) 153 | "JDO", // Juazeiro do Norte (Brazil) 154 | "JED", // Jeddah (Saudi Arabia) 155 | "JHB", // Johor Bahru (Malaysia) 156 | "JIB", // Djibouti (Djibouti) 157 | "JNB", // Johannesburg (South Africa) 158 | "JOG", // Yogyakarta (Indonesia) 159 | "JOI", // Joinville (Brazil) 160 | "JSR", // Jessore (Bangladesh) 161 | "JXG", // Jiaxing (China) 162 | "KBP", // Kiev (Ukraine) 163 | "KEF", // Reykjavik (Iceland) 164 | "KGL", // Kigali (Rwanda) 165 | "KHH", // Kaohsiung (Taiwan) 166 | "KHI", // Karachi (Pakistan) 167 | "KHN", // Nanchang (China) 168 | "KIN", // Kingston (Jamaica) 169 | "KIV", // Chisinau (Moldova) 170 | "KIX", // Osaka (Japan) 171 | "KJA", // Krasnoyarsk (Russia) 172 | "KLD", // Kaliningrad (Russia) 173 | "KMG", // Kunming (China) 174 | "KNU", // Kanpur (India) 175 | "KTM", // Kathmandu (Nepal) 176 | "KUL", // Kuala Lumpur (Malaysia) 177 | "KWE", // Guiyang (China) 178 | "KWI", // Kuwait (Kuwait) 179 | "LAD", // Luanda (Angola) 180 | "LAS", // Las Vegas (US) 181 | "LAX", // Los Angeles (US) 182 | "LCA", // Larnaca (Cyprus) 183 | "LED", // St. Petersburg (Russia) 184 | "LHE", // Lahore (Pakistan) 185 | "LHR", // London (United Kingdom) 186 | "LHW", // Lanzhou (China) 187 | "LIM", // Lima (Peru) 188 | "LIS", // Lisbon (Portugal) 189 | "LLK", // Lankaran (Azerbaijan) 190 | "LOS", // Lagos (Nigeria) 191 | "LPB", // La Paz (Bolivia) 192 | "LUX", // Luxembourg (Luxembourg) 193 | "LYS", // Lyon (France) 194 | "MAA", // Chennai (India) 195 | "MAD", // Madrid (Spain) 196 | "MAN", // Manchester (United Kingdom) 197 | "MAO", // Manaus (Brazil) 198 | "MBA", // Mombasa (Kenya) 199 | "MCI", // Kansas City (US) 200 | "MCT", // Muscat (Oman) 201 | "MDE", // Medellin (Colombia) 202 | "MDL", // Mandalay (Myanmar) 203 | "MEL", // Melbourne (Australia) 204 | "MEM", // Memphis (US) 205 | "MEX", // Mexico City (Mexico) 206 | "MFE", // Monterrey (Mexico) 207 | "MFM", // Macau (China) 208 | "MGM", // Montgomery (US) 209 | "MIA", // Miami (US) 210 | "MLE", // Malé (Maldives) 211 | "MNL", // Manila (Philippines) 212 | "MPM", // Maputo (Mozambique) 213 | "MRS", // Marseille (France) 214 | "MRU", // Port Louis (Mauritius) 215 | "MSP", // Minneapolis (US) 216 | "MSQ", // Minsk (Belarus) 217 | "MUC", // Munich (Germany) 218 | "MXP", // Milan (Italy) 219 | "NAG", // Nagpur (India) 220 | "NBO", // Nairobi (Kenya) 221 | "NJF", // Najaf (Iraq) 222 | "NNG", // Nanning (China) 223 | "NOU", // Noumea (New Caledonia) 224 | "NQN", // Neuquen (Argentina) 225 | "NQZ", // Astana (Kazakhstan) 226 | "NRT", // Tokyo (Japan) 227 | "NVT", // Navegantes (Brazil) 228 | "OKA", // Okinawa (Japan) 229 | "OKC", // Oklahoma City (US) 230 | "OMA", // Omaha (US) 231 | "ORD", // Chicago (US) 232 | "ORF", // Norfolk (US) 233 | "ORK", // Cork (Ireland) 234 | "ORN", // Oran (Algeria) 235 | "OSL", // Oslo (Norway) 236 | "OTP", // Bucharest (Romania) 237 | "OUA", // Ouagadougou (Burkina Faso) 238 | "PAT", // Patna (India) 239 | "PBH", // Paro (Bhutan) 240 | "PBM", // Paramaribo (Suriname) 241 | "PDX", // Portland (US) 242 | "PER", // Perth (Australia) 243 | "PHL", // Philadelphia (US) 244 | "PHX", // Phoenix (US) 245 | "PIT", // Pittsburgh (US) 246 | "PKX", // Petropavlovsk-Kamchatsky (Russia) 247 | "PMO", // Palermo (Italy) 248 | "PMW", // Palmas (Brazil) 249 | "PNH", // Phnom Penh (Cambodia) 250 | "POA", // Porto Alegre (Brazil) 251 | "POS", // Port of Spain (Trinidad and Tobago) 252 | "PPT", // Papeete (French Polynesia) 253 | "PRG", // Prague (Czech Republic) 254 | "PTY", // Panama City (Panama) 255 | "QRO", // Queretaro (Mexico) 256 | "QWJ", // Qingdao (China) 257 | "RAO", // Ribeirao Preto (Brazil) 258 | "RDU", // Raleigh (US) 259 | "REC", // Recife (Brazil) 260 | "RGN", // Yangon (Myanmar) 261 | "RIC", // Richmond (US) 262 | "RIX", // Riga (Latvia) 263 | "RUH", // Riyadh (Saudi Arabia) 264 | "RUN", // Reunion (France) 265 | "SAN", // San Diego (US) 266 | "SAT", // San Antonio (US) 267 | "SCL", // Santiago de Chile (Chile) 268 | "SDQ", // Santo Domingo (Dominican Republic) 269 | "SEA", // Seattle (US) 270 | "SFO", // San Francisco (US) 271 | "SGN", // Ho Chi Minh City (Vietnam) 272 | "SHA", // Shanghai (China) 273 | "SIN", // Singapore (Singapore) 274 | "SJC", // San Jose (US) 275 | "SJK", // Sao Jose dos Campos (Brazil) 276 | "SJO", // San Jose (Costa Rica) 277 | "SJP", // Sao Jose do Rio Preto (Brazil) 278 | "SJU", // San Juan (Puerto Rico) 279 | "SJW", // Shanghai (China) 280 | "SKG", // Thessaloniki (Greece) 281 | "SKP", // Skopje (North Macedonia) 282 | "SLC", // Salt Lake City (US) 283 | "SMF", // Sacramento (US) 284 | "SOD", // Sorocaba (Brazil) 285 | "SOF", // Sofia (Bulgaria) 286 | "SSA", // Salvador (Brazil) 287 | "STI", // Santiago (Dominican Republic) 288 | "STL", // St. Louis (US) 289 | "STR", // Stuttgart (Germany) 290 | "SUV", // Suva (Fiji) 291 | "SVX", // Yekaterinburg (Russia) 292 | "SYD", // Sydney (Australia) 293 | "SZX", // Shenzhen (China) 294 | "TAO", // Qingdao (China) 295 | "TAS", // Tashkent (Uzbekistan) 296 | "TBS", // Tbilisi (Georgia) 297 | "TGU", // Tegucigalpa (Honduras) 298 | "TIA", // Tirana (Albania) 299 | "TLH", // Tallahassee (US) 300 | "TLL", // Tallinn (Estonia) 301 | "TLV", // Tel Aviv 302 | "TNA", // Jinan (China) 303 | "TNR", // Antananarivo (Madagascar) 304 | "TPA", // Tampa (US) 305 | "TPE", // Taipei (Taiwan) 306 | "TSN", // Tianjin (China) 307 | "TUN", // Tunis (Tunisia) 308 | "TXL", // Berlin (Germany) 309 | "TYN", // Taiyuan (China) 310 | "UDI", // Uberlandia (Brazil) 311 | "UIO", // Quito (Ecuador) 312 | "ULN", // Ulaanbaatar (Mongolia) 313 | "URT", // Surat Thani (Thailand) 314 | "VCP", // Sao Paulo (Brazil) 315 | "VIE", // Vienna (Austria) 316 | "VIX", // Vitoria (Brazil) 317 | "VNO", // Vilnius (Lithuania) 318 | "VTE", // Vientiane (Laos) 319 | "WAW", // Warsaw (Poland) 320 | "WDH", // Windhoek (Namibia) 321 | "WHU", // Wuhan (China) 322 | "XAP", // Chapeco (Brazil) 323 | "XFN", // Xiangyang (China) 324 | "XIY", // Xi'an (China) 325 | "XNH", // Xining (China) 326 | "XNN", // Xining (China) 327 | "YHZ", // Halifax (Canada) 328 | "YOW", // Ottawa (Canada) 329 | "YUL", // Montreal (Canada) 330 | "YVR", // Vancouver (Canada) 331 | "YWG", // Winnipeg (Canada) 332 | "YXE", // Saskatoon (Canada) 333 | "YYC", // Calgary (Canada) 334 | "YYZ", // Toronto (Canada) 335 | "ZAG", // Zagreb (Croatia) 336 | "ZDM", // Zadar (Croatia) 337 | "ZGN", // Zhongshan (China) 338 | "ZRH" // Zurich (Switzerland) 339 | ] 340 | }; 341 | 342 | export default cloudflare; 343 | -------------------------------------------------------------------------------- /data/providers/cloudfront.js: -------------------------------------------------------------------------------- 1 | const cloudfront = { 2 | name: "AWS Cloudfront", 3 | url: "https://aws.amazon.com/cloudfront/", 4 | pops: [ 5 | "AKL", 6 | "AMS", 7 | "ARN", 8 | "ATH", 9 | "ATL", 10 | "BAH", 11 | "BKK", 12 | "BLR", 13 | "BOG", 14 | "BOM", 15 | "BOS", 16 | "BRU", 17 | "BUD", 18 | "CCU", 19 | "CDG", 20 | "CGK", 21 | "CPH", 22 | "CPT", 23 | "DEL", 24 | "DEN", 25 | "DFW", 26 | "DUB", 27 | "DUS", 28 | "DXB", 29 | "EWR", 30 | "EZE", 31 | "FCO", 32 | "FJR", 33 | "FRA", 34 | "GIG", 35 | "GRU", 36 | "HAM", 37 | "HEL", 38 | "HIO", 39 | "HKG", 40 | "HYD", 41 | "IAD", 42 | "IAH", 43 | "ICN", 44 | "IND", 45 | "JAX", 46 | "JFK", 47 | "JNB", 48 | "KIX", 49 | "KUL", 50 | "LAX", 51 | "LHR", 52 | "LIS", 53 | "MAA", 54 | "MAD", 55 | "MAN", 56 | "MEL", 57 | "MIA", 58 | "MNL", 59 | "MRS", 60 | "MSP", 61 | "MUC", 62 | "MXP", 63 | "NBO", 64 | "NRT", 65 | "ORD", 66 | "OSL", 67 | "OTP", 68 | "PEK", 69 | "PER", 70 | "PHL", 71 | "PHX", 72 | "PMO", 73 | "PRG", 74 | "QRO", 75 | "SCL", 76 | "SEA", 77 | "SFO", 78 | "SHA", 79 | "SIN", 80 | "SLC", 81 | "SOF", 82 | "SYD", 83 | "SZX", 84 | "TLV", 85 | "TPE", 86 | "TXL", 87 | "VIE", 88 | "WAW", 89 | "YUL", 90 | "YVR", 91 | "YYZ", 92 | "ZAG", 93 | "ZHY", 94 | "ZRH" 95 | ] 96 | }; 97 | 98 | export default cloudfront; 99 | -------------------------------------------------------------------------------- /data/providers/cloudsigma.js: -------------------------------------------------------------------------------- 1 | const cloudsigma = { 2 | name: "CloudSigma", 3 | url: "https://www.cloudsigma.com", 4 | pops: [ 5 | "CRK", // Clark (Philippines) 6 | "DUB", // Dublin (Ireland) 7 | "FRA", // Frankfurt (Germany) 8 | "GVA", // Geneva (Switzerland) 9 | "HNL", // Honolulu (US) 10 | "IAD", // Washington DC (US) 11 | "LLA", // Lulea (Sweden) 12 | "MEL", // Melbourne (Australia) 13 | "MNL", // Manila (Philippines) 14 | "NRT", // Tokyo (Japan) 15 | "PER", // Perth (Australia) 16 | "RUH", // Riyadh (Saudi Arabia) 17 | "SJC", // San Jose (US) 18 | "ZRH" // Zurich (Switzerland) 19 | ] 20 | }; 21 | 22 | export default cloudsigma; 23 | -------------------------------------------------------------------------------- /data/providers/deno.js: -------------------------------------------------------------------------------- 1 | const deno = { 2 | name: "Deno Deploy", 3 | url: "https://deno.com/deploy", 4 | pops: [ 5 | "AMS", // Amsterdam (Netherlands) 6 | "BOM", // Mumbai (India) 7 | "BRU", // Brussels (Belgium) 8 | "CDG", // Paris (France) 9 | "CGK", // Jakarta (Indonesia) 10 | "CHS", // Charleston (US) 11 | "CMH", // Columbus (US) 12 | "DEL", // Delhi (India) 13 | "DFW", // Dallas (US) 14 | "DSM", // Des Moines (US) 15 | "FRA", // Frankfurt (Germany) 16 | "GRU", // Sao Paulo (Brazil) 17 | "HEL", // Helsinki (Finland) 18 | "HKG", // Hong Kong (China) 19 | "IAD", // Washington DC (US) 20 | "ICN", // Seoul (South Korea) 21 | "KIX", // Osaka (Japan) 22 | "LAS", // Las Vegas (US) 23 | "LAX", // Los Angeles (US) 24 | "LHR", // London (UK) 25 | "MAD", // Madrid (Spain) 26 | "MEL", // Melbourne (Australia) 27 | "MXP", // Milan (Italy) 28 | "NRT", // Tokyo (Japan) 29 | "PDX", // Portland (US) 30 | "SCL", // Santiago de Chile (Chile) 31 | "SIN", // Singapore (Singapore) 32 | "SLC", // Salt Lake City (US) 33 | "SYD", // Sydney (Australia) 34 | "TLV", // Tel Aviv (Israel) 35 | "TPE", // Taipei (Taiwan) 36 | "WAW", // Warsaw (Poland) 37 | "YUL", // Montreal (Canada) 38 | "YYZ", // Toronto (Canada) 39 | "ZRH" // Zurich (Switzerland) 40 | ] 41 | }; 42 | 43 | export default deno; 44 | -------------------------------------------------------------------------------- /data/providers/digitalocean.js: -------------------------------------------------------------------------------- 1 | const digitalocean = { 2 | name: "DigitalOcean", 3 | url: "https://www.digitalocean.com", 4 | pops: [ 5 | "AMS", // Amsterdam (Netherlands) 6 | "BLR", // Bangalore (India) 7 | "FRA", // Frankfurt (Germany) 8 | "JFK", // New York (US) 9 | "LHR", // London (UK) 10 | "SFO", // San Francisco (US) 11 | "SIN", // Singapore (Singapore) 12 | "SYD", // Sydney (Australia) 13 | "YYZ" // Toronto (Canada) 14 | ] 15 | }; 16 | 17 | export default digitalocean; 18 | -------------------------------------------------------------------------------- /data/providers/ec2.js: -------------------------------------------------------------------------------- 1 | const lightsail = { 2 | name: "AWS EC2", 3 | url: "https://aws.amazon.com/ec2/", 4 | pops: [ 5 | "ARN", // Stockholm (Sweden) 6 | "AUH", // Abu Dhabi (United Arab Emirates) 7 | "BAH", // Bahrain (Bahrain) 8 | "BOM", // Mumbai (India) 9 | "CDG", // Paris (France) 10 | "CGK", // Jakarta (Indonesia) 11 | "CMH", // Columbus (US) 12 | "CPT", // Cape Town (South Africa) 13 | "DUB", // Dublin (Ireland) 14 | "FRA", // Frankfurt (Germany) 15 | "GRU", // Sao Paulo (Brazil) 16 | "HKG", // Hong Kong (Hong Kong) 17 | "HYD", // Hyderabad (India) 18 | "IAD", // Washington DC (US) 19 | "ICN", // Seoul (South Korea) 20 | "KIX", // Osaka (Japan) 21 | "LHR", // London (United Kingdom) 22 | "MAD", // Madrid (Spain) 23 | "MEL", // Melbourne (Australia) 24 | "MXP", // Milan (Italy) 25 | "NRT", // Tokyo (Japan) 26 | "PDX", // Portland (US) 27 | "SIN", // Singapore (Singapore) 28 | "SJC", // San Jose (US) 29 | "SYD", // Sydney (Australia) 30 | "TLV", // Tel Aviv (Israel) 31 | "YUL", // Montreal (Canada) 32 | "YYC", // Calgary (Canada) 33 | "ZRH" // Zurich (Switzerland) 34 | ] 35 | }; 36 | 37 | export default lightsail; 38 | -------------------------------------------------------------------------------- /data/providers/equinix.js: -------------------------------------------------------------------------------- 1 | const equinix = { 2 | name: "Equinix", 3 | url: "https://www.equinix.com/", 4 | pops: [ 5 | "ADL", 6 | "AMS", 7 | "ARN", 8 | "ATL", 9 | "AUH", 10 | "BCN", 11 | "BNE", 12 | "BOG", 13 | "BOS", 14 | "CBR", 15 | "CDG", 16 | "CGK", 17 | "CJR", 18 | "DEN", 19 | "DFW", 20 | "DUB", 21 | "DUS", 22 | "DXB", 23 | "ENS", 24 | "EWR", 25 | "FRA", 26 | "GIG", 27 | "GRQ", 28 | "GRU", 29 | "GVA", 30 | "HAM", 31 | "HEL", 32 | "HKG", 33 | "IAD", 34 | "IAH", 35 | "ICN", 36 | "IST", 37 | "KIX", 38 | "LAX", 39 | "LCY", 40 | "LHR", 41 | "LIS", 42 | "MAD", 43 | "MAN", 44 | "MCT", 45 | "MEL", 46 | "MEX", 47 | "MIA", 48 | "MTY", 49 | "MUC", 50 | "MXP", 51 | "NRT", 52 | "ORD", 53 | "PER", 54 | "PHL", 55 | "SEA", 56 | "SHA", 57 | "SIN", 58 | "SJC", 59 | "SOF", 60 | "SVQ", 61 | "SYD", 62 | "WAW", 63 | "YYZ", 64 | "ZRH" 65 | ] 66 | }; 67 | 68 | export default equinix; 69 | -------------------------------------------------------------------------------- /data/providers/fastly.js: -------------------------------------------------------------------------------- 1 | const fastly = { 2 | name: "Fastly", 3 | url: "https://www.fastly.com", 4 | pops: [ 5 | "ACC", // Accra (Ghana) 6 | "ADL", // Adelaide (Australia) 7 | "AKL", // Auckland (New Zealand) 8 | "AMS", // Amsterdam (Netherlands) 9 | "ATL", // Atlanta (US) 10 | "BKK", // Bangkok (Thailand) 11 | "BMA", // Stockholm (Sweden) 12 | "BNE", // Brisbane (Australia) 13 | "BOG", // Bogota (Colombia) 14 | "BOM", // Mumbai (India) 15 | "BOS", // Boston (US) 16 | "BRU", // Brussels (Belgium) 17 | "BUR", // Burbank (US) 18 | "CCU", // Kolkata (India) 19 | "CGH", // Sao Paulo (Brazil) 20 | "CHC", // Christchurch (New Zealand) 21 | "CHI", // Chicago (US) 22 | "CMH", // Columbus (US) 23 | "CPH", // Copenhagen (Denmark) 24 | "CPT", // Cape Town (South Africa) 25 | "CWB", // Curitiba (Brazil) 26 | "DAL", // Dallas (US) 27 | "DEL", // Delhi (India) 28 | "DEN", // Denver (US) 29 | "DFW", // Dallas (US) 30 | "DTW", // Detroit (US) 31 | "DUB", // Dublin (Ireland) 32 | "DXB", // Dubai (United Arab Emirates) 33 | "EWR", // Newark (US) 34 | "EZE", // Buenos Aires (Argentina) 35 | "FCO", // Rome (Italy) 36 | "FJR", // Fujairah (United Arab Emirates) 37 | "FOR", // Fortaleza (Brazil) 38 | "FRA", // Frankfurt (Germany) 39 | "FTY", // Atlanta (US) 40 | "GIG", // Rio de Janeiro (Brazil) 41 | "GNV", // Gainesville (US) 42 | "GRU", // Sao Paulo (Brazil) 43 | "HEL", // Helsinki (Finland) 44 | "HHN", // Frankfurt (Germany) 45 | "HKG", // Hong Kong (China) 46 | "HND", // Tokyo (Japan) 47 | "HNL", // Honolulu (US) 48 | "HYD", // Hyderabad (India) 49 | "IAD", // Washington DC (US) 50 | "IAH", // Houston (US) 51 | "ICN", // Seoul (South Korea) 52 | "ITM", // Osaka (Japan) 53 | "JFK", // New York (US) 54 | "JNB", // Johannesburg (South Africa) 55 | "KUL", // Kuala Lumpur (Malaysia) 56 | "LAX", // Los Angeles (US) 57 | "LCK", // Columbus (US) 58 | "LCY", // London (UK) 59 | "LEE", // Leesburg (US) 60 | "LGA", // New York (US) 61 | "LGW", // London (UK) 62 | "LHR", // London (UK) 63 | "LIM", // Lima (Peru) 64 | "LIN", // Milan (Italy) 65 | "LIS", // Lisbon (Portugal) 66 | "MAA", // Chennai (India) 67 | "MAD", // Madrid (Spain) 68 | "MAN", // Manchester (UK) 69 | "MCI", // Kansas City (US) 70 | "MEL", // Melbourne (Australia) 71 | "MIA", // Miami (US) 72 | "MNL", // Manila (Philippines) 73 | "MRS", // Marseille (France) 74 | "MSP", // Minneapolis (US) 75 | "MUC", // Munich (Germany) 76 | "MXP", // Milan (Italy) 77 | "NRT", // Tokyo (Japan) 78 | "ORY", // Paris (France) 79 | "OSL", // Oslo (Norway) 80 | "PAO", // Palo Alto (US) 81 | "PDK", // Atlanta (US) 82 | "PDX", // Portland (US) 83 | "PER", // Perth (Australia) 84 | "PHX", // Phoenix (US) 85 | "PMO", // Palermo (Italy) 86 | "QPG", // Singapore (Singapore) 87 | "SCL", // Santiago (Chile) 88 | "SEA", // Seattle (US) 89 | "SJC", // San Jose (US) 90 | "SOF", // Sofia (Bulgaria) 91 | "STL", // St. Louis (US) 92 | "STP", // St. Paul (US) 93 | "SYD", // Sydney (Australia) 94 | "TYO", // Tokyo (Japan) 95 | "VIE", // Vienna (Austria) 96 | "WLG", // Wellington (New Zealand) 97 | "YUL", // Montreal (Canada) 98 | "YVR", // Vancouver (Canada) 99 | "YYC", // Calgary (Canada) 100 | "YYZ" // Toronto (Canada) 101 | ] 102 | }; 103 | 104 | export default fastly; 105 | -------------------------------------------------------------------------------- /data/providers/flexential.js: -------------------------------------------------------------------------------- 1 | const flexential = { 2 | name: "Flexential", 3 | url: "https://www.flexential.com/", 4 | pops: [ 5 | "ABE", // Allentown (US) 6 | "ATL", // Atlanta (US) 7 | "BNA", // Nashville (US) 8 | "CLT", // Charlotte (US) 9 | "CVG", // Cincinnati (US) 10 | "DEN", // Denver (US) 11 | "DFW", // Dallas (US) 12 | "FLL", // Fort Lauderdale (US) 13 | "JAX", // Jacksonville (US) 14 | "LAS", // Las Vegas (US) 15 | "MSP", // Minneapolis (US) 16 | "PDX", // Portland (US) 17 | "PHL", // Philadelphia (US) 18 | "PHX", // Phoenix (US) 19 | "RDU", // Raleigh (US) 20 | "RIC", // Richmond (US) 21 | "SDF", // Louisville (US) 22 | "SLC", // Salt Lake City (US) 23 | "TPA" // Tampa (US) 24 | ] 25 | }; 26 | 27 | export default flexential; 28 | -------------------------------------------------------------------------------- /data/providers/gcore.js: -------------------------------------------------------------------------------- 1 | const gcore = { 2 | name: "G-Core Labs", 3 | url: "https://gcorelabs.com/cdn/", 4 | pops: [ 5 | "ALA", 6 | "AMS", 7 | "ARN", 8 | "ATL", 9 | "BAX", 10 | "BOG", 11 | "BOM", 12 | "CDG", 13 | "DEN", 14 | "DFW", 15 | "DME", 16 | "DXB", 17 | "EZE", 18 | "FRA", 19 | "FRU", 20 | "GOJ", 21 | "GRU", 22 | "HKG", 23 | "IAD", 24 | "ICN", 25 | "IST", 26 | "JFK", 27 | "JNB", 28 | "KBP", 29 | "KHV", 30 | "KJA", 31 | "KUF", 32 | "KZN", 33 | "LAX", 34 | "LED", 35 | "LHR", 36 | "LIM", 37 | "MAD", 38 | "MIA", 39 | "MSQ", 40 | "MXP", 41 | "NQZ", 42 | "NRT", 43 | "ORD", 44 | "OVB", 45 | "PES", 46 | "PKV", 47 | "PRG", 48 | "PWQ", 49 | "ROV", 50 | "SCL", 51 | "SEA", 52 | "SIN", 53 | "SJC", 54 | "SVX", 55 | "SYD", 56 | "TAS", 57 | "TLV", 58 | "UFA", 59 | "VOZ", 60 | "VVO", 61 | "WAW" 62 | ] 63 | }; 64 | 65 | export default gcore; 66 | -------------------------------------------------------------------------------- /data/providers/googlecdn.js: -------------------------------------------------------------------------------- 1 | /** 2 | * https://cloud.google.com/cdn/docs/locations 3 | */ 4 | const googlecdn = { 5 | name: "Google Cloud CDN", 6 | url: "https://cloud.google.com/cdn", 7 | pops: [ 8 | "AMS", 9 | "ARN", 10 | "ATL", 11 | "BOG", 12 | "BOM", 13 | "BRU", 14 | "BUD", 15 | "CBF", 16 | "CDG", 17 | "CGK", 18 | "CHS", 19 | "DEL", 20 | "DEN", 21 | "DFW", 22 | "DLS", 23 | "DUB", 24 | "EZE", 25 | "FJR", 26 | "FLL", 27 | "FRA", 28 | "GIG", 29 | "GRQ", 30 | "GRU", 31 | "HAM", 32 | "HKG", 33 | "IAD", 34 | "JFK", 35 | "JNB", 36 | "KIX", 37 | "KUL", 38 | "LAS", 39 | "LAX", 40 | "LGW", 41 | "LHR", 42 | "LOS", 43 | "LPP", 44 | "MAA", 45 | "MAD", 46 | "MBA", 47 | "MCT", 48 | "MIA", 49 | "MRN", 50 | "MRS", 51 | "MUC", 52 | "MXP", 53 | "NRT", 54 | "ORD", 55 | "PRG", 56 | "QRO", 57 | "RMQ", 58 | "SCL", 59 | "SEA", 60 | "SFO", 61 | "SIN", 62 | "SLC", 63 | "SOF", 64 | "SYD", 65 | "TPE", 66 | "TUL", 67 | "VNY", 68 | "WAW", 69 | "YUL", 70 | "YYZ", 71 | "ZRH" 72 | ] 73 | }; 74 | 75 | export default googlecdn; 76 | -------------------------------------------------------------------------------- /data/providers/googlecompute.js: -------------------------------------------------------------------------------- 1 | /** 2 | * https://cloud.google.com/cdn/docs/locations 3 | */ 4 | const googlecompute = { 5 | name: "Google Compute Engine", 6 | url: "https://cloud.google.com/compute", 7 | pops: [ 8 | "AMS", 9 | "BOM", 10 | "BRU", 11 | "CBF", 12 | "CGK", 13 | "CHA", 14 | "CHS", 15 | "FRA", 16 | "GRU", 17 | "HEL", 18 | "HKG", 19 | "IAD", 20 | "ICN", 21 | "KIX", 22 | "LAS", 23 | "LAX", 24 | "LHR", 25 | "NRT", 26 | "PDX", 27 | "SIN", 28 | "SLC", 29 | "SYD", 30 | "TPE", 31 | "YUL", 32 | "ZRH" 33 | ] 34 | }; 35 | 36 | export default googlecompute; 37 | -------------------------------------------------------------------------------- /data/providers/heroku.js: -------------------------------------------------------------------------------- 1 | const heroku = { 2 | name: "Heroku", 3 | url: "https://www.heroku.com/", 4 | pops: [ 5 | "DUB", // Dublin (Ireland) 6 | "FRA", // Frankfurt (Germany) 7 | "IAD", // Washington DC (US) 8 | "NRT", // Tokyo (Japan) 9 | "PDX", // Portland (US) 10 | "SYD" // Sydney (Australia) 11 | ] 12 | }; 13 | 14 | export default heroku; 15 | -------------------------------------------------------------------------------- /data/providers/hetzner.js: -------------------------------------------------------------------------------- 1 | const hetzner = { 2 | name: "Hetzner Cloud", 3 | url: "https://www.hetzner.com/cloud", 4 | pops: [ 5 | "HEL", // Helsinki (Finland) 6 | "HIO", // Portland (USA) 7 | "IAD", // Washington (USA) 8 | "NUE", // Nuremberg (Germany) 9 | "ZPM" // Potsdam (Germany) 10 | ] 11 | }; 12 | 13 | export default hetzner; 14 | -------------------------------------------------------------------------------- /data/providers/hivelocity.js: -------------------------------------------------------------------------------- 1 | const hivelocity = { 2 | name: "Hivelocity", 3 | url: "https://www.hivelocity.net/", 4 | pops: [ 5 | "AMS", // Amsterdam (Netherlands) 6 | "ATL", // Atlanta (US) 7 | "DFW", // Dallas (US) 8 | "FRA", // Frankfurt (Germany) 9 | "JFK", // New York (US) 10 | "LAX", // Los Angeles (US) 11 | "MIA", // Miami (US) 12 | "ORD", // Chicago (US) 13 | "SEA", // Seattle (US) 14 | "TPA" // Tampa (US) 15 | ] 16 | }; 17 | 18 | export default hivelocity; 19 | -------------------------------------------------------------------------------- /data/providers/hostwinds.js: -------------------------------------------------------------------------------- 1 | const hostwinds = { 2 | name: "Hostwinds", 3 | url: "https://www.hostwinds.com/", 4 | pops: [ 5 | "AMS", // Amsterdam (Netherlands) 6 | "DFW", // Dallas (US) 7 | "SEA" // Seattle (US) 8 | ] 9 | }; 10 | 11 | export default hostwinds; 12 | -------------------------------------------------------------------------------- /data/providers/imperva.js: -------------------------------------------------------------------------------- 1 | const imperva = { 2 | name: "Imperva", 3 | url: "https://www.imperva.com/", 4 | pops: [ 5 | "AKL", // Auckland (New Zealand) 6 | "AMS", // Amsterdam (Netherlands) 7 | "ARN", // Stockholm (Sweden) 8 | "ATL", // Atlanta (US) 9 | "BKK", // Bangkok (Thailand) 10 | "BOM", // Mumbai (Bombay) 11 | "CDG", // Paris (France) 12 | "CGK", // Jakarta (Indonesia) 13 | "CPH", // Copenhagen (Denmark) 14 | "DEL", // Delhi (India) 15 | "DFW", // Dallas (US) 16 | "DME", // Moscow (Russia) 17 | "DXB", // Dubai (United Arab Emirates) 18 | "EZE", // Buenos Aires (Argentina) 19 | "FRA", // Frankfurt (Germany) 20 | "GRU", // Sao Paulo (Brazil) 21 | "HKG", // Hong Kong (China) 22 | "IAD", // Washington DC (US) 23 | "ICN", // Seoul (South Korea) 24 | "IST", // Istanbul (Turkey) 25 | "JFK", // New York (US) 26 | "JNB", // Johannesburg (South Africa) 27 | "KIX", // Osaka (Japan) 28 | "KUL", // Kuala Lumpur (Malaysia) 29 | "LAX", // Los Angeles (US) 30 | "LHR", // London (UK) 31 | "MAD", // Madrid (Spain) 32 | "MEL", // Melbourne (Australia) 33 | "MEX", // Mexico City (Mexico) 34 | "MIA", // Miami (US) 35 | "MXP", // Milan (Italy) 36 | "NRT", // Tokyo (Japan) 37 | "ORD", // Chicago (US) 38 | "SEA", // Seattle (US) 39 | "SIN", // Singapore (Singapore) 40 | "SJC", // San Jose (US) 41 | "SYD", // Sydney (Australia) 42 | "TLV", // Tel Aviv (Israel) 43 | "TPE", // Taipei (Taiwan) 44 | "VIE", // Vienna (Austria) 45 | "WAW", // Warsaw (Poland) 46 | "YVR", // Vancouver (Canada) 47 | "YYZ", // Toronto (Canada) 48 | "ZRH" // Zurich (Switzerland) 49 | ] 50 | }; 51 | 52 | export default imperva; 53 | -------------------------------------------------------------------------------- /data/providers/ionos.js: -------------------------------------------------------------------------------- 1 | const ionos = { 2 | name: "Ionos Cloud Servers", 3 | url: "https://www.ionos.com/cloud/cloud-servers", 4 | pops: [ 5 | "EWR", // Newark (US) 6 | "FRA", // Frankfurt (Germany) 7 | "LAS", // Las Vegas (US) 8 | "LHR", // London (UK) 9 | "MAD" // Madrid (Spain) 10 | ] 11 | }; 12 | 13 | export default ionos; 14 | -------------------------------------------------------------------------------- /data/providers/kamatera.js: -------------------------------------------------------------------------------- 1 | const kamatera = { 2 | name: "Kamatera Express", 3 | url: "https://www.kamatera.com/express/", 4 | pops: [ 5 | "AMS", // Amsterdam (Netherlands) 6 | "DFW", // Dallas (US) 7 | "FRA", // Frankfurt (Germany) 8 | "HKG", // Hong Kong (Hong Kong) 9 | "JFK", // New York (US) 10 | "JRS", // Jerusalem (Israel) 11 | "LHR", // London (UK) 12 | "SDV", // Tel Aviv (Israel) 13 | "SJC", // San Jose (US) 14 | "TLV", // Tel Aviv (Israel) 15 | "YYZ" // Toronto (Canada) 16 | ] 17 | }; 18 | 19 | export default kamatera; 20 | -------------------------------------------------------------------------------- /data/providers/keycdn.js: -------------------------------------------------------------------------------- 1 | const keycdn = { 2 | name: "KeyCDN", 3 | url: "https://www.keycdn.com/", 4 | pops: [ 5 | "AKL", // Auckland (New Zealand) 6 | "ALA", // Almaty (Kazakhstan) 7 | "AMS", // Amsterdam (Netherlands) 8 | "ARN", // Stockholm (Sweden) 9 | "ATH", // Athens (Greece) 10 | "ATL", // Atlanta (US) 11 | "BLR", // Bangalore (India) 12 | "BNE", // Brisbane (Australia) 13 | "BOG", // Bogota (Colombia) 14 | "CDG", // Paris (France) 15 | "CPH", // Copenhagen (Denmark) 16 | "DEN", // Denver (US) 17 | "DFW", // Dallas (US) 18 | "DME", // Moscow (Russia) 19 | "DUB", // Dublin (Ireland) 20 | "DXB", // Dubai (United Arab Emirates) 21 | "EZE", // Buenos Aires (Argentina) 22 | "FRA", // Frankfurt (Germany) 23 | "GRU", // Sao Paulo (Brazil) 24 | "HEL", // Helsinki (Finland) 25 | "HKG", // Hong Kong (Hong Kong) 26 | "IST", // Istanbul (Turkey) 27 | "JFK", // New York (US) 28 | "JNB", // Johannesburg (South Africa) 29 | "KBP", // Kiev (Ukraine) 30 | "LAX", // Los Angeles (US) 31 | "LHR", // London (United Kingdom) 32 | "LIM", // Lima (Peru) 33 | "LIS", // Lisbon (Portugal) 34 | "LOS", // Lagos (Nigeria) 35 | "MAD", // Madrid (Spain) 36 | "MEL", // Melbourne (Australia) 37 | "MEX", // Mexico City (Mexico) 38 | "MIA", // Miami (US) 39 | "MXP", // Milan (Italy) 40 | "NRT", // Tokyo (Japan) 41 | "ORD", // Chicago (US) 42 | "OSL", // Oslo (Norway) 43 | "OTP", // Bucharest (Romania) 44 | "PER", // Perth (Australia) 45 | "SCL", // Santiago (Chile) 46 | "SEA", // Seattle (US) 47 | "SFO", // San Francisco (US) 48 | "SIN", // Singapore (Singapore) 49 | "SYD", // Sydney (Australia) 50 | "TLV", // Tel Aviv (Israel) 51 | "VIE", // Vienna (Austria) 52 | "WAW", // Warsaw (Poland) 53 | "YUL", // Montreal (Canada) 54 | "ZRH" // Zurich (Switzerland) 55 | ] 56 | }; 57 | 58 | export default keycdn; 59 | -------------------------------------------------------------------------------- /data/providers/leapswitch.js: -------------------------------------------------------------------------------- 1 | const leapswitch = { 2 | name: "LeapSwitch", 3 | url: "https://leapswitch.com/", 4 | pops: [ 5 | "AVL", // Asheville (US) 6 | "BCN", // Barcelona (Spain) 7 | "BOM", // Mumbai (India) 8 | "DFW", // Dallas (US) 9 | "FRA", // Frankfurt (Germany) 10 | "IEV", // Kiev (Ukraine) 11 | "LIS", // Lisbon (Portugal) 12 | "PNQ", // Pune (India) 13 | "SBN" // South Bend (US) 14 | ] 15 | }; 16 | 17 | export default leapswitch; 18 | -------------------------------------------------------------------------------- /data/providers/lightsail.js: -------------------------------------------------------------------------------- 1 | const lightsail = { 2 | name: "AWS Lightsail", 3 | url: "https://aws.amazon.com/lightsail/", 4 | pops: [ 5 | "ARN", // Stockholm (Sweden) 6 | "BOM", // Mumbai (India) 7 | "CDG", // Paris (France) 8 | "CMH", // Columbus (US) 9 | "DUB", // Dublin (Ireland) 10 | "FRA", // Frankfurt (Germany) 11 | "IAD", // Washington DC (US) 12 | "ICN", // Seoul (South Korea) 13 | "LHR", // London (UK) 14 | "NRT", // Tokyo (Japan) 15 | "PDX", // Portland (US) 16 | "SIN", // Singapore (Singapore) 17 | "SYD", // Sydney (Australia) 18 | "YUL" // Montreal 19 | ] 20 | }; 21 | 22 | export default lightsail; 23 | -------------------------------------------------------------------------------- /data/providers/limelight.js: -------------------------------------------------------------------------------- 1 | const limelight = { 2 | name: "Limelight Networks", 3 | url: "https://www.limelight.com/", 4 | pops: [ 5 | "ADB", 6 | "ARN", 7 | "ATL", 8 | "BEY", 9 | "BKK", 10 | "BOG", 11 | "BOM", 12 | "BOS", 13 | "BUR", 14 | "CDG", 15 | "CGK", 16 | "DCA", 17 | "DEL", 18 | "DEN", 19 | "DFW", 20 | "DOH", 21 | "DUS", 22 | "DXB", 23 | "ESB", 24 | "EWR", 25 | "EZE", 26 | "FCO", 27 | "FRA", 28 | "GRU", 29 | "HAN", 30 | "HKG", 31 | "IAD", 32 | "ICN", 33 | "IST", 34 | "JFK", 35 | "JNB", 36 | "KIX", 37 | "KUL", 38 | "KWI", 39 | "LAX", 40 | "LHR", 41 | "LOS", 42 | "MAA", 43 | "MAD", 44 | "MAN", 45 | "MCI", 46 | "MIA", 47 | "MNL", 48 | "MRS", 49 | "MRU", 50 | "MSP", 51 | "MXP", 52 | "NAP", 53 | "NRT", 54 | "ORD", 55 | "PAO", 56 | "PHL", 57 | "PHX", 58 | "PMO", 59 | "QHI", 60 | "SCL", 61 | "SEA", 62 | "SIN", 63 | "SJC", 64 | "SYD", 65 | "TLV", 66 | "VIE", 67 | "YHZ", 68 | "YUL", 69 | "YVR", 70 | "YYZ", 71 | "ZRH" 72 | ] 73 | }; 74 | 75 | export default limelight; 76 | -------------------------------------------------------------------------------- /data/providers/linode.js: -------------------------------------------------------------------------------- 1 | const linode = { 2 | name: "Linode", 3 | url: "https://www.linode.com/", 4 | pops: [ 5 | "ARN", // Stockholm (Sweden) 6 | "ATL", // Atlanta (US) 7 | "BOM", // Mumbai (India) 8 | "CDG", // Paris (France) 9 | "CGK", // Jakarta (Indonesia) 10 | "DFW", // Dallas (US) 11 | "EWR", // Newark (US) 12 | "FRA", // Frankfurt (Germany) 13 | "GRU", // Sao Paulo (Brazil) 14 | "IAD", // Washington (US) 15 | "ITM", // Osaka (Japan) 16 | "LAX", // Los Angeles (US) 17 | "LHR", // London (UK) 18 | "MAA", // Chennai (India) 19 | "MAD", // Madrid (Spain) 20 | "MEL", // Melbourne (Australia) 21 | "MIA", // Miami (US) 22 | "MXP", // Milan (Italy) 23 | "NRT", // Tokyo (Japan) 24 | "ORD", // Chicago (US) 25 | "SEA", // Seattle (US) 26 | "SIN", // Singapore (Singapore) 27 | "SJC", // San Jose (US) 28 | "SYD", // Sydney (Australia) 29 | "YYZ" // Toronto (Canada) 30 | ] 31 | }; 32 | 33 | export default linode; 34 | -------------------------------------------------------------------------------- /data/providers/mnx.js: -------------------------------------------------------------------------------- 1 | const mnx = { 2 | name: "MNX.io", 3 | url: "https://mnx.io/", 4 | pops: [ 5 | "ORD" // Chicago (US) 6 | ] 7 | }; 8 | 9 | export default mnx; 10 | -------------------------------------------------------------------------------- /data/providers/netlify.js: -------------------------------------------------------------------------------- 1 | /** 2 | * source: https://community.netlify.com/t/is-there-a-list-of-where-netlifys-cdn-pops-are-located/855 3 | */ 4 | const netlify = { 5 | name: "Netlify", 6 | url: "https://www.netlify.com/", 7 | pops: [ 8 | "BOM", // Mumbai (India) 9 | "CMH", // Columbus (US) 10 | "DME", // Moscow (Russia) 11 | "DSM", // Des Moines (US) 12 | "DUB", // Dublin (Ireland) 13 | "DXB", // Dubai (United Arab Emirates) 14 | "FRA", // Frankfurt (Germany) 15 | "GRU", // Sao Paulo (Brazil) 16 | "HEL", // Helsinki (Finland) 17 | "JFK", // New York (US) 18 | "JNB", // Johannesburg (South Africa) 19 | "LHR", // London (UK) 20 | "MAA", // Chennai (India) 21 | "NRT", // Tokyo (Japan) 22 | "PUS", // Busan (South Korea) 23 | "SFO", // San Francisco (US) 24 | "SIN", // Singapore (Singapore) 25 | "SYD", // Sydney (Australia) 26 | "YYZ" // Toronto (Canada) 27 | ] 28 | }; 29 | 30 | export default netlify; 31 | -------------------------------------------------------------------------------- /data/providers/ovh.js: -------------------------------------------------------------------------------- 1 | const ovh = { 2 | name: "OVH", 3 | url: "https://www.ovh.com/", 4 | pops: [ 5 | "CDG", // Paris (France) 6 | "FRA", // Frankfurt (Germany) 7 | "LHR", // London (UK) 8 | "SIN", // Singapore (Singapore) 9 | "SYD", // Sydney (Australia) 10 | "WAW" // Warsaw (Poland) 11 | ] 12 | }; 13 | 14 | export default ovh; 15 | -------------------------------------------------------------------------------- /data/providers/packet.js: -------------------------------------------------------------------------------- 1 | const packet = { 2 | name: "Packet", 3 | url: "https://www.packet.com", 4 | pops: [ 5 | "AMS", 6 | "ATL", 7 | "DFW", 8 | "DTW", 9 | "EWR", 10 | "FRA", 11 | "HKG", 12 | "IAD", 13 | "IAH", 14 | "LAX", 15 | "MCI", 16 | "MRS", 17 | "NRT", 18 | "ORD", 19 | "PHX", 20 | "PIT", 21 | "SEA", 22 | "SIN", 23 | "SJC", 24 | "SYD", 25 | "YYZ" 26 | ] 27 | }; 28 | 29 | export default packet; 30 | -------------------------------------------------------------------------------- /data/providers/scaleway.js: -------------------------------------------------------------------------------- 1 | const scaleway = { 2 | name: "Scaleway", 3 | url: "https://www.scaleway.com/", 4 | pops: [ 5 | "AMS", // Amsterdam (Netherlands) 6 | "CDG", // Paris (France) 7 | "WAW" // Warsaw (Poland) 8 | ] 9 | }; 10 | 11 | export default scaleway; 12 | -------------------------------------------------------------------------------- /data/providers/stackpath.js: -------------------------------------------------------------------------------- 1 | const stackpath = { 2 | name: "StackPath", 3 | url: "https://www.stackpath.com/", 4 | pops: [ 5 | "AMS", // Amsterdam (Netherlands) 6 | "ARN", // Stockholm (Sweden) 7 | "ATL", // Atlanta (US) 8 | "BOG", // Bogota (Colombia) 9 | "BOS", // Boston (US) 10 | "BRU", // Brussels (Belgium) 11 | "CDG", // Paris (France) 12 | "DCA", // Washington DC (US) 13 | "DEN", // Denver (US) 14 | "DFW", // Dallas (US) 15 | "DTW", // Detroit (US) 16 | "DXB", // Dubai (United Arab Emirates) 17 | "EZE", // Buenos Aires (Argentina) 18 | "FRA", // Frankfurt (Germany) 19 | "GIG", // Rio de Janeiro (Brazil) 20 | "GRU", // Sao Paulo (Brazil) 21 | "HKG", // Hong Kong (China) 22 | "ICN", // Seoul (South Korea) 23 | "ICT", // Wichita (US) 24 | "JFK", // New York (US) 25 | "JNB", // Johannesburg (South Africa) 26 | "KIX", // Osaka (Japan) 27 | "LAX", // Los Angeles (US) 28 | "LHR", // London (UK) 29 | "LIM", // Lima (Peru) 30 | "MAD", // Madrid (Spain) 31 | "MEL", // Melbourne (Australia) 32 | "MFE", // McAllen (US) 33 | "MIA", // Miami (US) 34 | "MRS", // Marseille (France) 35 | "MXP", // Milan (Italy) 36 | "NRT", // Tokyo (Japan) 37 | "ORD", // Chicago (US) 38 | "PHX", // Phoenix (US) 39 | "PNS", // Pensacola (US) 40 | "SCL", // Santiago de Chile (Chile) 41 | "SEA", // Seattle (US) 42 | "SFO", // San Francisco (US) 43 | "SIN", // Singapore (Singapore) 44 | "SJC", // San Jose (US) 45 | "STL", // St. Louis (US) 46 | "SYD", // Sydney (Australia) 47 | "WAW", // Warsaw (Poland) 48 | "YYZ" // Toronto (Canada) 49 | ] 50 | }; 51 | 52 | export default stackpath; 53 | -------------------------------------------------------------------------------- /data/providers/sucuri.js: -------------------------------------------------------------------------------- 1 | const sucuri = { 2 | name: "Sucuri", 3 | url: "https://sucuri.net/", 4 | pops: [ 5 | "AMS", // Amsterdam (Netherlands) 6 | "DFW", // Dallas (US) 7 | "FRA", // Frankfurt (Germany) 8 | "GRU", // Sao Paulo (Brazil) 9 | "IAD", // Washington DC (US) 10 | "LHR", // London (UK) 11 | "MIA", // Miami (US) 12 | "NRT", // Tokyo (Japan) 13 | "ORD", // Chicago (US) 14 | "SIN", // Singapore (Singapore) 15 | "SJC", // San Jose (US) 16 | "SOF", // Sofia (Bulgaria) 17 | "SYD" // Sydney (Australia) 18 | ] 19 | }; 20 | 21 | export default sucuri; 22 | -------------------------------------------------------------------------------- /data/providers/upcloud.js: -------------------------------------------------------------------------------- 1 | const upcloud = { 2 | name: "UpCloud", 3 | url: "https://upcloud.com/", 4 | pops: [ 5 | "AMS", // Amsterdam (Netherlands) 6 | "ARN", // Stockholm (Sweden) 7 | "FRA", // Frankfurt (Germany) 8 | "HEL", // Helsinki (Finland) 9 | "JFK", // New York (US) 10 | "LHR", // London (UK) 11 | "MAD", // Madrid (Spain) 12 | "ORD", // Chicago (US) 13 | "SIN", // Singapore (Singapore) 14 | "SJC", // San Jose (US) 15 | "SYD", // Sydney (Australia) 16 | "WAW" // Warsaw (Poland) 17 | ] 18 | }; 19 | 20 | export default upcloud; 21 | -------------------------------------------------------------------------------- /data/providers/vercel.js: -------------------------------------------------------------------------------- 1 | const vercel = { 2 | name: "Vercel", 3 | url: "https://vercel.com/", 4 | pops: [ 5 | "ARN", // Stockholm (Sweden) 6 | "BOM", // Mumbai (India) 7 | "CDG", // Paris (France) 8 | "CPT", // Cape Town (South Africa) 9 | "CLE", // Cleveland (US) 10 | "DUB", // Dublin (Ireland) 11 | "FRA", // Frankfurt (Germany) 12 | "GRU", // Sao Paulo (Brazil) 13 | "HKG", // Hong Kong (China) 14 | "HND", // Tokyo (Japan) 15 | "IAD", // Washington DC (US) 16 | "ICN", // Seoul (South Korea) 17 | "LHR", // London (UK) 18 | "KIX", // Osaka (Japan) 19 | "PDX", // Portland (US) 20 | "SFO", // San Francisco (US) 21 | "SIN", // Singapore (Singapore) 22 | "SYD" // Sydney (Australia) 23 | ] 24 | }; 25 | 26 | export default vercel; 27 | -------------------------------------------------------------------------------- /data/providers/verizonmedia.js: -------------------------------------------------------------------------------- 1 | const verizonmedia = { 2 | name: "Verizon Media", 3 | url: "https://www.verizondigitalmedia.com/", 4 | pops: [ 5 | "AKL", 6 | "AMS", 7 | "ARN", 8 | "ATL", 9 | "BAQ", 10 | "BKK", 11 | "BLR", 12 | "BOG", 13 | "BOM", 14 | "BOS", 15 | "BTH", 16 | "CDG", 17 | "CGK", 18 | "CPH", 19 | "DCA", 20 | "DEL", 21 | "DEN", 22 | "DFW", 23 | "DTW", 24 | "EWR", 25 | "EZE", 26 | "FJR", 27 | "FRA", 28 | "GDL", 29 | "GIG", 30 | "GRU", 31 | "HEL", 32 | "HKG", 33 | "IAD", 34 | "IAH", 35 | "ICN", 36 | "JFK", 37 | "JNB", 38 | "KHH", 39 | "KIX", 40 | "KWI", 41 | "LAS", 42 | "LAX", 43 | "LHR", 44 | "LIM", 45 | "LIS", 46 | "MAA", 47 | "MAD", 48 | "MAN", 49 | "MCT", 50 | "MDE", 51 | "MEL", 52 | "MEX", 53 | "MIA", 54 | "MNL", 55 | "MRS", 56 | "MUC", 57 | "MXP", 58 | "NBO", 59 | "NRT", 60 | "ORD", 61 | "OTP", 62 | "PHL", 63 | "PHX", 64 | "PIT", 65 | "RIX", 66 | "SCL", 67 | "SEA", 68 | "SIN", 69 | "SJC", 70 | "SOF", 71 | "SYD", 72 | "TPE", 73 | "UIO", 74 | "VIE", 75 | "WAW" 76 | ] 77 | }; 78 | 79 | export default verizonmedia; 80 | -------------------------------------------------------------------------------- /data/providers/vultr.js: -------------------------------------------------------------------------------- 1 | const vultr = { 2 | name: "Vultr", 3 | url: "https://www.vultr.com/", 4 | pops: [ 5 | "AMS", // Amsterdam (Netherlands) 6 | "ARN", // Stockholm (Sweden) 7 | "ATL", // Atlanta (US) 8 | "BLR", // Bangalore (India) 9 | "BOM", // Mumbai (India) 10 | "CDG", // Paris (France) 11 | "DEL", // Delhi (India) 12 | "DFW", // Dallas (US) 13 | "EWR", // Newark (US) 14 | "FRA", // Frankfurt (Germany) 15 | "GRU", // Sao Paulo (Brazil) 16 | "HNL", // Honolulu (US) 17 | "ICN", // Seoul (South Korea) 18 | "JNB", // Johannesburg (South Africa) 19 | "KIX", // Osaka (Japan) 20 | "LAX", // Los Angeles (US) 21 | "LHR", // London (UK) 22 | "MAD", // Madrid (Spain) 23 | "MAN", // Manchester (UK) 24 | "MEL", // Melbourne (Australia) 25 | "MEX", // Mexico City (Mexico) 26 | "MIA", // Miami (US) 27 | "NRT", // Tokyo (Japan) 28 | "ORD", // Chicago (US) 29 | "SCL", // Santiago (Chile) 30 | "SEA", // Seattle (US) 31 | "SIN", // Singapore (Singapore) 32 | "SJC", // San Jose (US) 33 | "SYD", // Sydney (Australia) 34 | "TLV", // Tel Aviv (Israel) 35 | "WAW", // Warsaw (Poland)" 36 | "YYZ" // Toronto (Canada) 37 | ] 38 | }; 39 | 40 | export default vultr; 41 | -------------------------------------------------------------------------------- /data/providers/wasabi.js: -------------------------------------------------------------------------------- 1 | const wasabi = { 2 | name: "Wasabi", 3 | url: "https://wasabi.com", 4 | pops: [ 5 | "AMS", // Amsterdam (Netherlands) 6 | "CDG", // Paris (France) 7 | "DFW", // Dallas (US) 8 | "FRA", // Frankfurt (Germany) 9 | "HEF", // Manassas (US) 10 | "HIO", // Portland (US) 11 | "IAD", // Washington (US) 12 | "KIX", // Osaka (Japan) 13 | "LHR", // London (UK) 14 | "NRT", // Tokyo (Japan) 15 | "YYZ" // Toronto (Canada) 16 | ] 17 | }; 18 | 19 | export default wasabi; 20 | -------------------------------------------------------------------------------- /dist/bundle.js: -------------------------------------------------------------------------------- 1 | const A={iata:new Map([["AAE",[36.82,7.81]],["ABE",[40.65,-75.43]],["ABJ",[5.25,-3.93]],["ABQ",[35.05,-106.62]],["ACC",[5.61,-.17]],["ADB",[38.29,27.15]],["ADL",[-34.94,138.54]],["AKL",[-37,174.78]],["ALA",[43.35,77.01]],["ALG",[36.7,3.21]],["AMD",[23.07,72.62]],["AMM",[31.72,35.99]],["AMS",[52.31,4.76]],["ANC",[61.17,-150]],["ARI",[-18.35,-70.34]],["ARN",[59.65,17.93]],["ARU",[-21.14,-50.43]],["ASK",[6.82,-5.28]],["ASU",[-25.24,-57.51]],["ATH",[37.94,23.95]],["ATL",[33.64,-84.44]],["AUH",[24.43,54.65]],["AUS",[30.2,-97.67]],["AVL",[35.44,-82.54]],["BAH",[26.27,50.63]],["BAQ",[10.89,-74.78]],["BAX",[53.36,83.55]],["BBI",[20.25,85.82]],["BCN",[41.3,2.08]],["BEG",[44.82,20.31]],["BEL",[-1.39,-48.48]],["BEY",[33.83,35.49]],["BGI",[13.08,-59.49]],["BGR",[44.81,-68.82]],["BGW",[33.28,44.5]],["BHY",[21.54,109.29]],["BKK",[13.69,100.75]],["BLR",[13.2,77.71]],["BMA",[59.36,17.95]],["BNA",[36.13,-86.67]],["BNE",[-27.4,153.11]],["BNU",[-27,-49]],["BOD",[44.83,-.7]],["BOG",[4.7,-74.14]],["BOM",[19.1,72.87]],["BOS",[42.37,-71.02]],["BRU",[50.9,4.48]],["BSB",[-15.87,-47.92]],["BSR",[30.56,47.79]],["BTH",[1.12,104.12]],["BTS",[48.17,17.2]],["BUD",[47.43,19.26]],["BUF",[42.93,-78.73]],["BUR",[34.2,-118.35]],["BWN",[4.95,114.93]],["CAI",[30.12,31.41]],["CAN",[23.39,113.3]],["CAW",[-21.7,-41.3]],["CBF",[41.26,-95.76]],["CBR",[-35.31,149.19]],["CCU",[22.65,88.44]],["CDG",[49,2.57]],["CEB",[10.31,123.98]],["CFC",[-26.79,-50.94]],["CGB",[-15.65,-56.12]],["CGD",[28.92,111.64]],["CGH",[-23.63,-46.66]],["CGK",[-6.13,106.66]],["CGO",[34.53,113.84]],["CGP",[22.25,91.82]],["CGY",[8.61,124.46]],["CHA",[35.04,-85.2]],["CHC",[-43.49,172.54]],["CHI",[41.88,-87.77]],["CHS",[32.88,-80.04]],["CJR",[38.53,-77.86]],["CKG",[29.72,106.63]],["CLE",[41.41,-81.84]],["CLT",[35.22,-80.94]],["CMB",[7.17,79.89]],["CMH",[40,-82.88]],["CNF",[-19.63,-43.96]],["CNN",[56.9,124.88]],["CNX",[18.77,98.97]],["COK",[10.16,76.39]],["COR",[-31.32,-64.21]],["CPH",[55.63,12.65]],["CPM",[33.89,-118.24]],["CPT",[-33.97,18.6]],["CRK",[15.18,120.55]],["CSX",[28.19,113.21]],["CTU",[30.58,103.96]],["CVG",[39.06,-84.66]],["CWB",[-25.53,-49.18]],["CWL",[51.4,-3.34]],["CYS",[41.16,-104.82]],["CZX",[31.91,119.78]],["DAC",[23.85,90.41]],["DAD",[16.06,108.2]],["DAL",[32.84,-96.85]],["DAR",[-6.87,39.2]],["DCA",[38.85,-77.04]],["DEL",[28.56,77.1]],["DEN",[39.85,-104.67]],["DFW",[32.9,-97.04]],["DKR",[14.74,-17.49]],["DLC",[38.96,121.54]],["DLS",[45.62,-121.16]],["DME",[55.41,37.9]],["DMM",[26.47,49.8]],["DOH",[25.27,51.56]],["DPS",[-8.75,115.17]],["DSM",[41.53,-93.65]],["DTW",[42.21,-83.36]],["DUB",[53.43,-6.24]],["DUR",[-29.61,31.12]],["DUS",[51.28,6.77]],["DVN",[41.61,-90.59]],["DXB",[25.25,55.35]],["EBB",[.05,32.44]],["EBL",[36.24,43.96]],["EDI",[55.95,-3.36]],["ENS",[52.27,6.88]],["ESB",[40.11,32.99]],["EVN",[40.15,44.4]],["EWR",[40.69,-74.18]],["EZE",[-34.81,-58.54]],["FCO",[41.79,12.25]],["FIH",[-4.39,15.45]],["FJR",[25.11,56.33]],["FLL",[26.07,-80.14]],["FLN",[-27.66,-48.55]],["FOC",[25.93,119.67]],["FOR",[-3.78,-38.54]],["FRA",[50.05,8.57]],["FRU",[43.05,74.47]],["FSD",[43.58,-96.73]],["FTY",[33.78,-84.52]],["FUK",[33.58,130.44]],["FUO",[23.13,113.28]],["GBE",[-24.56,25.92]],["GDL",[20.53,-103.3]],["GEO",[6.5,-58.25]],["GIG",[-22.81,-43.25]],["GND",[12,-61.79]],["GNV",[29.69,-82.28]],["GOJ",[56.22,43.79]],["GOT",[57.67,12.29]],["GRQ",[53.12,6.58]],["GRU",[-23.43,-46.48]],["GUA",[14.59,-90.53]],["GUM",[13.49,144.8]],["GVA",[46.23,6.11]],["GYD",[40.46,50.05]],["GYE",[-2.14,-79.88]],["GYN",[-16.63,-49.23]],["HAK",[19.94,110.46]],["HAM",[53.63,10.01]],["HAN",[21.21,105.8]],["HBA",[-42.84,147.51]],["HEF",[38.72,-77.52]],["HEL",[60.32,24.97]],["HET",[40.85,111.81]],["HFA",[32.81,35.04]],["HFE",[31.99,116.98]],["HGH",[30.24,120.43]],["HHN",[49.95,7.26]],["HHP",[22.29,114.15]],["HIO",[45.54,-122.95]],["HKG",[22.32,113.94]],["HND",[35.55,139.78]],["HNL",[21.33,-157.92]],["HRE",[-17.92,31.1]],["HYD",[17.24,78.43]],["HYN",[28.56,121.42]],["IAD",[38.95,-77.45]],["IAH",[29.98,-95.34]],["ICN",[37.45,126.45]],["ICT",[37.65,-97.43]],["IEV",[50.4,30.45]],["IND",[39.71,-86.3]],["ISB",[33.61,73.11]],["IST",[40.98,28.82]],["ISU",[35.56,45.31]],["ITJ",[-26.88,-48.65]],["ITM",[34.79,135.44]],["IXC",[30.67,76.8]],["JAX",[30.49,-81.68]],["JDO",[-7.2,-39.32]],["JED",[21.67,39.15]],["JFK",[40.64,-73.79]],["JHB",[1.64,103.67]],["JIB",[11.55,43.15]],["JNB",[-26.13,28.23]],["JOG",[-7.79,110.44]],["JOI",[-26.23,-48.78]],["JRS",[31.87,35.21]],["JSR",[23.18,89.16]],["KBP",[50.34,30.9]],["KEF",[64,-22.62]],["KGL",[-1.96,30.14]],["KHH",[22.57,120.35]],["KHI",[24.9,67.17]],["KHN",[28.86,115.91]],["KHV",[48.52,135.17]],["KIN",[17.94,-76.78]],["KIV",[46.94,28.93]],["KIX",[34.44,135.24]],["KJA",[56.18,92.48]],["KLD",[56.92,35.92]],["KMG",[25.1,102.93]],["KNU",[26.4,80.41]],["KTM",[27.7,85.36]],["KUF",[53.51,50.15]],["KUL",[2.76,101.71]],["KWE",[26.54,106.8]],["KWI",[29.24,47.97]],["KZN",[55.61,49.3]],["LAD",[-8.85,13.23]],["LAS",[36.09,-115.15]],["LAX",[33.94,-118.41]],["LCA",[34.88,33.63]],["LCK",[39.81,-82.93]],["LCY",[51.5,.05]],["LED",[59.81,30.31]],["LEE",[28.83,-81.81]],["LGA",[40.77,-73.87]],["LGW",[51.16,-.16]],["LHE",[31.52,74.4]],["LHR",[51.47,-.45]],["LHW",[36.51,103.62]],["LIM",[-12.02,-77.11]],["LIN",[45.46,9.28]],["LIS",[38.77,-9.13]],["LLA",[65.55,22.12]],["LLK",[38.75,48.82]],["LOS",[6.58,3.32]],["LPB",[-16.51,-68.18]],["LPP",[61.05,28.16]],["LUX",[49.63,6.21]],["LYS",[45.72,5.08]],["MAA",[12.98,80.16]],["MAD",[40.47,-3.57]],["MAN",[53.36,-2.27]],["MAO",[-3.03,-60.05]],["MBA",[-4.03,39.6]],["MCI",[39.29,-94.72]],["MCO",[28.43,-81.31]],["MCT",[23.59,58.29]],["MDE",[6.17,-75.43]],["MDL",[21.94,96.09]],["MEB",[-37.74,144.9]],["MEL",[-37.67,144.85]],["MEM",[35.04,-89.98]],["MEX",[19.44,-99.07]],["MFE",[26.18,-98.24]],["MFM",[22.16,113.57]],["MGM",[32.31,-86.39]],["MIA",[25.8,-80.28]],["MLE",[4.2,73.52]],["MNL",[14.51,121.01]],["MPM",[-25.92,32.57]],["MRN",[35.82,-81.61]],["MRS",[43.44,5.22]],["MRU",[-20.43,57.68]],["MSP",[44.88,-93.21]],["MSQ",[53.89,28.03]],["MTY",[25.78,-100.11]],["MUC",[48.35,11.79]],["MXP",[45.63,8.71]],["NAG",[21.09,79.06]],["NAP",[40.89,14.29]],["NBO",[-1.32,36.93]],["NJF",[31.99,44.4]],["NNG",[22.61,108.17]],["NOU",[-22.02,166.22]],["NQN",[-38.95,-68.15]],["NQZ",[51.03,71.46]],["NRT",[35.77,140.39]],["NUE",[49.49,11.08]],["NVT",[-26.87,-48.63]],["OKA",[26.2,127.65]],["OKC",[35.4,-97.6]],["OMA",[41.3,-95.9]],["ORD",[41.98,-87.9]],["ORF",[36.9,-76.21]],["ORK",[51.85,-8.49]],["ORN",[35.62,-.61]],["ORY",[48.73,2.36]],["OSL",[60.19,11.1]],["OTP",[44.57,26.08]],["OUA",[12.36,-1.51]],["OVB",[55.01,82.67]],["OXR",[34.2,-119.21]],["PAE",[47.91,-122.28]],["PAO",[37.46,-122.11]],["PAT",[25.59,85.09]],["PBC",[19.14,-98.37]],["PBH",[27.43,89.42]],["PBM",[5.45,-55.19]],["PDK",[33.88,-84.3]],["PDX",[45.59,-122.59]],["PEK",[40.08,116.59]],["PER",[-31.93,115.96]],["PES",[61.68,34.33]],["PHL",[39.88,-75.24]],["PHX",[33.44,-112]],["PIT",[40.5,-80.26]],["PKV",[57.82,28.3]],["PKX",[39.51,116.41]],["PMO",[38.19,13.1]],["PMW",[-10.24,-48.35]],["PNH",[11.55,104.85]],["PNQ",[18.58,73.92]],["PNS",[30.48,-87.19]],["POA",[-29.99,-51.18]],["POS",[10.6,-61.34]],["POX",[49.05,2.1]],["PPT",[-17.56,-149.61]],["PRG",[50.11,14.27]],["PTY",[9.07,-79.39]],["PUS",[35.18,128.95]],["PWQ",[52.18,77.07]],["QHI",[13.23,100.96]],["QPG",[1.35,103.9]],["QRO",[20.6,-100.38]],["QWJ",[-22.74,-47.33]],["QZO",[43.46,11.85]],["RAO",[-21.14,-47.77]],["RDU",[35.87,-78.79]],["REC",[-8.13,-34.92]],["RGN",[16.9,96.13]],["RHV",[37.33,-121.82]],["RIC",[37.51,-77.32]],["RIX",[56.92,23.98]],["RMQ",[24.26,120.61]],["ROV",[47.25,39.75]],["RTM",[51.95,4.43]],["RUH",[24.96,46.7]],["RUN",[-20.89,55.51]],["SAN",[32.73,-117.2]],["SAT",[29.52,-98.47]],["SBN",[41.7,-86.31]],["SCL",[-33.4,-70.79]],["SDF",[38.19,-85.74]],["SDQ",[18.43,-69.68]],["SDV",[32.1,34.79]],["SEA",[47.44,-122.3]],["SFO",[37.62,-122.39]],["SGN",[10.81,106.66]],["SHA",[31.2,121.34]],["SIN",[1.36,103.99]],["SJC",[37.37,-121.93]],["SJK",[-23.18,-46.12]],["SJO",[10,-84.2]],["SJP",[-20.82,-49.42]],["SJU",[18.44,-66]],["SJW",[38.27,114.69]],["SKG",[40.52,22.97]],["SKP",[41.96,21.63]],["SLC",[40.79,-111.98]],["SMF",[38.69,-121.59]],["SOD",[-23.48,-47.45]],["SOF",[42.69,23.41]],["SSA",[-12.91,-38.34]],["STI",[19.4,-70.6]],["STL",[38.74,-90.37]],["STP",[44.93,-93.07]],["STR",[48.69,9.19]],["SUV",[-18.05,178.56]],["SVQ",[37.42,-5.9]],["SVX",[56.75,60.8]],["SYD",[-33.93,151.18]],["SZX",[22.64,113.81]],["TAO",[36.27,120.38]],["TAS",[41.26,69.27]],["TBS",[41.67,44.96]],["TGU",[14.06,-87.22]],["TIA",[41.42,19.71]],["TIR",[13.64,79.54]],["TLH",[30.4,-84.34]],["TLL",[59.42,24.8]],["TLV",[32,34.87]],["TNA",[36.86,117.21]],["TNR",[-18.8,47.48]],["TPA",[27.98,-82.54]],["TPE",[25.08,121.22]],["TSN",[39.12,117.34]],["TUL",[36.19,-95.89]],["TUN",[36.85,10.22]],["TXL",[52.55,13.29]],["TYN",[37.75,112.63]],["TYO",[35.55,139.78]],["UDI",[-18.88,-48.23]],["UFA",[54.57,55.88]],["UIO",[-.12,-78.36]],["ULN",[47.85,106.76]],["URT",[9.13,99.14]],["VCP",[-23.01,-47.14]],["VIE",[48.12,16.56]],["VIX",[-20.26,-40.29]],["VNO",[54.64,25.28]],["VNY",[34.21,-118.49]],["VOZ",[51.81,39.23]],["VTE",[17.98,102.57]],["VVO",[43.38,132.14]],["WAW",[52.17,20.97]],["WDH",[-22.49,17.46]],["WHU",[31.37,118.37]],["WLG",[-41.33,174.81]],["XAP",[-27.09,-52.63]],["XFN",[32.15,112.29]],["XIY",[34.44,108.76]],["XNH",[30.94,46.09]],["XNN",[36.53,102.04]],["YHZ",[44.88,-63.51]],["YOW",[45.32,-75.67]],["YQB",[46.79,-71.38]],["YUL",[45.46,-73.75]],["YVR",[49.19,-123.18]],["YWG",[49.9,-97.23]],["YXE",[52.17,-106.69]],["YYC",[51.13,-114.01]],["YYZ",[43.68,-79.61]],["ZAG",[45.73,16.06]],["ZDM",[32.27,35.02]],["ZGN",[22.52,113.37]],["ZHY",[37.57,105.15]],["ZPM",[49.01,12.1]],["ZQZ",[40.74,114.93]],["ZRH",[47.45,8.56]]]),providers:{adaptive:{name:"Adaptive Link",url:"https://adaptive.link",pops:["AMS","BOM","CDG","CMH","DFW","DUB","GRU","HEL","ICN","JFK","LHR","MAD","MEX","MIA","NRT","NUE","PDX","SFO","SIN","SYD","YYZ"]},alibaba:{name:"Alibaba Cloud",url:"https://www.alibabacloud.com/",pops:["BOM","CGK","CTU","DXB","FRA","HET","HGH","HKG","IAD","KUL","LHR","NRT","PEK","SHA","SIN","SJC","SYD","SZX","TAO","ZQZ"]},arubacloud:{name:"Aruba Cloud",url:"https://www.arubacloud.com/",pops:["CDG","FRA","LHR","MXP","PRG","QZO","WAW"]},atlanticnet:{name:"Atlantic.Net",url:"https://www.atlantic.net/",pops:["DFW","IAD","JFK","LHR","MCO","SFO","SIN","YYZ"]},azurecdn:{name:"Azure CDN",url:"https://azure.microsoft.com/en-us/services/cdn/",pops:["AKL","AMS","ARN","ATL","BAQ","BLR","BOS","BTH","BUR","CDG","CGK","CPH","CPM","DCA","DEL","DEN","DFW","EWR","EZE","FJR","FLL","FRA","GIG","GRU","HEL","HHP","HKG","HND","IAD","ICN","ITM","JFK","JNB","KHH","KIX","LAX","LCY","LGA","LHR","LIM","MAA","MAD","MCT","MDE","MEB","MEL","MEX","MIA","MRS","MXP","NAG","NRT","ORD","ORY","OXR","PAE","PBC","PHL","PNQ","POX","QRO","RHV","RIX","RTM","SCL","SEA","SIN","SJC","SYD","TIR","UIO","VIE","VNY","WAW"]},azurevm:{name:"Azure VM",url:"https://azure.microsoft.com/en-us/global-infrastructure/services/?products=virtual-machines",pops:["AMS","BOM","CBR","CDG","CHI","CWL","CYS","DFW","DSM","DUB","DXB","FRA","GRU","HKG","IAD","ICN","ITM","JNB","LAX","LHR","MAA","MEL","OSL","PEK","PHX","PNQ","PUS","SAN","SEA","SHA","SIN","SJC","SYD","TYO","YQB","YYZ","ZRH"]},backblaze:{name:"Backblaze",url:"https://www.backblaze.com/",pops:["AMS","PHX","SMF"]},bunnycdn:{name:"BunnyCDN",url:"https://bunnycdn.com/",pops:["ADL","AKL","AMS","ATL","BLR","BNE","BOM","CDG","DEN","DFW","DME","FRA","GRU","HEL","HKG","IAD","ICN","IST","JFK","JNB","LAX","LHR","LOS","MAD","MEL","MIA","MXP","NRT","ORD","OSL","OTP","PER","PRG","SCL","SEA","SIN","SJC","SYD","TLV","VNO","WAW","YYZ"]},cachefly:{name:"CacheFly",url:"https://www.cachefly.com/",pops:["AMS","ARN","ATL","BKK","BOG","BOM","BOS","CDG","CGK","DEN","DFW","DME","DOH","DVN","DXB","EZE","FOR","FRA","GIG","GRU","HEL","HKG","IAD","ICN","IST","JFK","JNB","LAX","LED","LHR","LIM","LIS","LPB","MAD","MEL","MIA","MXP","NRT","ORD","OTP","PEK","PER","PHX","PRG","QRO","RUH","SCL","SEA","SHA","SIN","SJC","SJU","SYD","TLV","VIE","WAW","YUL","YYC","YYZ","ZRH"]},cdn77:{name:"CDN77",url:"https://www.cdn77.com/",pops:["AMS","ARN","ATL","BOG","BOM","BTS","CDG","CGK","CPT","DEN","DFW","DME","EBL","EZE","FJR","FRA","GRU","GYE","HKG","IAD","IEV","IST","JED","JFK","KBP","LAX","LHR","LIM","MAD","MCT","MIA","MRS","MSQ","MXP","NRT","ORD","OTP","PRG","PTY","QRO","RUH","SCL","SEA","SIN","SJC","SOF","SYD","TLV","TPE","UIO","VIE","WAW","YYZ","ZAG","ZRH"]},cloudflare:{name:"Cloudflare",url:"https://www.cloudflare.com",pops:["AAE","ABJ","ABQ","ACC","ADB","ADL","AKL","ALA","ALG","AMD","AMM","AMS","ANC","ARI","ARN","ARU","ASK","ASU","ATH","ATL","AUS","BAH","BAQ","BBI","BCN","BEG","BEL","BEY","BGI","BGR","BGW","BHY","BKK","BLR","BNA","BNE","BNU","BOD","BOG","BOM","BOS","BRU","BSB","BSR","BTS","BUD","BUF","BWN","CAI","CAN","CAW","CBR","CCU","CDG","CEB","CFC","CGB","CGD","CGK","CGO","CGP","CGY","CHC","CKG","CLE","CLT","CMB","CMH","CNF","CNN","CNX","COK","COR","CPH","CPT","CRK","CSX","CTU","CWB","CZX","DAC","DAD","DAR","DEL","DEN","DFW","DKR","DLC","DME","DMM","DOH","DPS","DTW","DUB","DUR","DUS","DXB","EBB","EBL","EDI","EVN","EWR","EZE","FCO","FIH","FLN","FOC","FOR","FRA","FSD","FUK","FUO","GBE","GDL","GEO","GIG","GND","GOT","GRU","GUA","GUM","GVA","GYD","GYE","GYN","HAK","HAM","HAN","HBA","HEL","HFA","HFE","HGH","HKG","HNL","HRE","HYD","HYN","IAD","IAH","ICN","IND","ISB","IST","ISU","ITJ","IXC","JAX","JDO","JED","JHB","JIB","JNB","JOG","JOI","JSR","JXG","KBP","KEF","KGL","KHH","KHI","KHN","KIN","KIV","KIX","KJA","KLD","KMG","KNU","KTM","KUL","KWE","KWI","LAD","LAS","LAX","LCA","LED","LHE","LHR","LHW","LIM","LIS","LLK","LOS","LPB","LUX","LYS","MAA","MAD","MAN","MAO","MBA","MCI","MCT","MDE","MDL","MEL","MEM","MEX","MFE","MFM","MGM","MIA","MLE","MNL","MPM","MRS","MRU","MSP","MSQ","MUC","MXP","NAG","NBO","NJF","NNG","NOU","NQN","NQZ","NRT","NVT","OKA","OKC","OMA","ORD","ORF","ORK","ORN","OSL","OTP","OUA","PAT","PBH","PBM","PDX","PER","PHL","PHX","PIT","PKX","PMO","PMW","PNH","POA","POS","PPT","PRG","PTY","QRO","QWJ","RAO","RDU","REC","RGN","RIC","RIX","RUH","RUN","SAN","SAT","SCL","SDQ","SEA","SFO","SGN","SHA","SIN","SJC","SJK","SJO","SJP","SJU","SJW","SKG","SKP","SLC","SMF","SOD","SOF","SSA","STI","STL","STR","SUV","SVX","SYD","SZX","TAO","TAS","TBS","TGU","TIA","TLH","TLL","TLV","TNA","TNR","TPA","TPE","TSN","TUN","TXL","TYN","UDI","UIO","ULN","URT","VCP","VIE","VIX","VNO","VTE","WAW","WDH","WHU","XAP","XFN","XIY","XNH","XNN","YHZ","YOW","YUL","YVR","YWG","YXE","YYC","YYZ","ZAG","ZDM","ZGN","ZRH"]},cloudfront:{name:"AWS Cloudfront",url:"https://aws.amazon.com/cloudfront/",pops:["AKL","AMS","ARN","ATH","ATL","BAH","BKK","BLR","BOG","BOM","BOS","BRU","BUD","CCU","CDG","CGK","CPH","CPT","DEL","DEN","DFW","DUB","DUS","DXB","EWR","EZE","FCO","FJR","FRA","GIG","GRU","HAM","HEL","HIO","HKG","HYD","IAD","IAH","ICN","IND","JAX","JFK","JNB","KIX","KUL","LAX","LHR","LIS","MAA","MAD","MAN","MEL","MIA","MNL","MRS","MSP","MUC","MXP","NBO","NRT","ORD","OSL","OTP","PEK","PER","PHL","PHX","PMO","PRG","QRO","SCL","SEA","SFO","SHA","SIN","SLC","SOF","SYD","SZX","TLV","TPE","TXL","VIE","WAW","YUL","YVR","YYZ","ZAG","ZHY","ZRH"]},cloudsigma:{name:"CloudSigma",url:"https://www.cloudsigma.com",pops:["CRK","DUB","FRA","GVA","HNL","IAD","LLA","MEL","MNL","NRT","PER","RUH","SJC","ZRH"]},deno:{name:"Deno Deploy",url:"https://deno.com/deploy",pops:["AMS","BOM","BRU","CDG","CGK","CHS","CMH","DEL","DFW","DSM","FRA","GRU","HEL","HKG","IAD","ICN","KIX","LAS","LAX","LHR","MAD","MEL","MXP","NRT","PDX","SCL","SIN","SLC","SYD","TLV","TPE","WAW","YUL","YYZ","ZRH"]},digitalocean:{name:"DigitalOcean",url:"https://www.digitalocean.com",pops:["AMS","BLR","FRA","JFK","LHR","SFO","SIN","SYD","YYZ"]},equinix:{name:"Equinix",url:"https://www.equinix.com/",pops:["ADL","AMS","ARN","ATL","AUH","BCN","BNE","BOG","BOS","CBR","CDG","CGK","CJR","DEN","DFW","DUB","DUS","DXB","ENS","EWR","FRA","GIG","GRQ","GRU","GVA","HAM","HEL","HKG","IAD","IAH","ICN","IST","KIX","LAX","LCY","LHR","LIS","MAD","MAN","MCT","MEL","MEX","MIA","MTY","MUC","MXP","NRT","ORD","PER","PHL","SEA","SHA","SIN","SJC","SOF","SVQ","SYD","WAW","YYZ","ZRH"]},ec2:{name:"AWS EC2",url:"https://aws.amazon.com/ec2/",pops:["ARN","AUH","BAH","BOM","CDG","CGK","CMH","CPT","DUB","FRA","GRU","HKG","HYD","IAD","ICN","KIX","LHR","MAD","MEL","MXP","NRT","PDX","SIN","SJC","SYD","TLV","YUL","YYC","ZRH"]},fastly:{name:"Fastly",url:"https://www.fastly.com",pops:["ACC","ADL","AKL","AMS","ATL","BKK","BMA","BNE","BOG","BOM","BOS","BRU","BUR","CCU","CGH","CHC","CHI","CMH","CPH","CPT","CWB","DAL","DEL","DEN","DFW","DTW","DUB","DXB","EWR","EZE","FCO","FJR","FOR","FRA","FTY","GIG","GNV","GRU","HEL","HHN","HKG","HND","HNL","HYD","IAD","IAH","ICN","ITM","JFK","JNB","KUL","LAX","LCK","LCY","LEE","LGA","LGW","LHR","LIM","LIN","LIS","MAA","MAD","MAN","MCI","MEL","MIA","MNL","MRS","MSP","MUC","MXP","NRT","ORY","OSL","PAO","PDK","PDX","PER","PHX","PMO","QPG","SCL","SEA","SJC","SOF","STL","STP","SYD","TYO","VIE","WLG","YUL","YVR","YYC","YYZ"]},flexential:{name:"Flexential",url:"https://www.flexential.com/",pops:["ABE","ATL","BNA","CLT","CVG","DEN","DFW","FLL","JAX","LAS","MSP","PDX","PHL","PHX","RDU","RIC","SDF","SLC","TPA"]},gcore:{name:"G-Core Labs",url:"https://gcorelabs.com/cdn/",pops:["ALA","AMS","ARN","ATL","BAX","BOG","BOM","CDG","DEN","DFW","DME","DXB","EZE","FRA","FRU","GOJ","GRU","HKG","IAD","ICN","IST","JFK","JNB","KBP","KHV","KJA","KUF","KZN","LAX","LED","LHR","LIM","MAD","MIA","MSQ","MXP","NQZ","NRT","ORD","OVB","PES","PKV","PRG","PWQ","ROV","SCL","SEA","SIN","SJC","SVX","SYD","TAS","TLV","UFA","VOZ","VVO","WAW"]},googlecdn:{name:"Google Cloud CDN",url:"https://cloud.google.com/cdn",pops:["AMS","ARN","ATL","BOG","BOM","BRU","BUD","CBF","CDG","CGK","CHS","DEL","DEN","DFW","DLS","DUB","EZE","FJR","FLL","FRA","GIG","GRQ","GRU","HAM","HKG","IAD","JFK","JNB","KIX","KUL","LAS","LAX","LGW","LHR","LOS","LPP","MAA","MAD","MBA","MCT","MIA","MRN","MRS","MUC","MXP","NRT","ORD","PRG","QRO","RMQ","SCL","SEA","SFO","SIN","SLC","SOF","SYD","TPE","TUL","VNY","WAW","YUL","YYZ","ZRH"]},googlecompute:{name:"Google Compute Engine",url:"https://cloud.google.com/compute",pops:["AMS","BOM","BRU","CBF","CGK","CHA","CHS","FRA","GRU","HEL","HKG","IAD","ICN","KIX","LAS","LAX","LHR","NRT","PDX","SIN","SLC","SYD","TPE","YUL","ZRH"]},heroku:{name:"Heroku",url:"https://www.heroku.com/",pops:["DUB","FRA","IAD","NRT","PDX","SYD"]},hetzner:{name:"Hetzner Cloud",url:"https://www.hetzner.com/cloud",pops:["HEL","HIO","IAD","NUE","ZPM"]},hivelocity:{name:"Hivelocity",url:"https://www.hivelocity.net/",pops:["AMS","ATL","DFW","FRA","JFK","LAX","MIA","ORD","SEA","TPA"]},hostwinds:{name:"Hostwinds",url:"https://www.hostwinds.com/",pops:["AMS","DFW","SEA"]},imperva:{name:"Imperva",url:"https://www.imperva.com/",pops:["AKL","AMS","ARN","ATL","BKK","BOM","CDG","CGK","CPH","DEL","DFW","DME","DXB","EZE","FRA","GRU","HKG","IAD","ICN","IST","JFK","JNB","KIX","KUL","LAX","LHR","MAD","MEL","MEX","MIA","MXP","NRT","ORD","SEA","SIN","SJC","SYD","TLV","TPE","VIE","WAW","YVR","YYZ","ZRH"]},ionos:{name:"Ionos Cloud Servers",url:"https://www.ionos.com/cloud/cloud-servers",pops:["EWR","FRA","LAS","LHR","MAD"]},kamatera:{name:"Kamatera Express",url:"https://www.kamatera.com/express/",pops:["AMS","DFW","FRA","HKG","JFK","JRS","LHR","SDV","SJC","TLV","YYZ"]},keycdn:{name:"KeyCDN",url:"https://www.keycdn.com/",pops:["AKL","ALA","AMS","ARN","ATH","ATL","BLR","BNE","BOG","CDG","CPH","DEN","DFW","DME","DUB","DXB","EZE","FRA","GRU","HEL","HKG","IST","JFK","JNB","KBP","LAX","LHR","LIM","LIS","LOS","MAD","MEL","MEX","MIA","MXP","NRT","ORD","OSL","OTP","PER","SCL","SEA","SFO","SIN","SYD","TLV","VIE","WAW","YUL","ZRH"]},leapswitch:{name:"LeapSwitch",url:"https://leapswitch.com/",pops:["AVL","BCN","BOM","DFW","FRA","IEV","LIS","PNQ","SBN"]},lightsail:{name:"AWS Lightsail",url:"https://aws.amazon.com/lightsail/",pops:["ARN","BOM","CDG","CMH","DUB","FRA","IAD","ICN","LHR","NRT","PDX","SIN","SYD","YUL"]},limelight:{name:"Limelight Networks",url:"https://www.limelight.com/",pops:["ADB","ARN","ATL","BEY","BKK","BOG","BOM","BOS","BUR","CDG","CGK","DCA","DEL","DEN","DFW","DOH","DUS","DXB","ESB","EWR","EZE","FCO","FRA","GRU","HAN","HKG","IAD","ICN","IST","JFK","JNB","KIX","KUL","KWI","LAX","LHR","LOS","MAA","MAD","MAN","MCI","MIA","MNL","MRS","MRU","MSP","MXP","NAP","NRT","ORD","PAO","PHL","PHX","PMO","QHI","SCL","SEA","SIN","SJC","SYD","TLV","VIE","YHZ","YUL","YVR","YYZ","ZRH"]},linode:{name:"Linode",url:"https://www.linode.com/",pops:["ARN","ATL","BOM","CDG","DFW","EWR","FRA","IAD","ITM","LHR","MXP","NRT","ORD","PAO","SEA","SIN","SJC","SYD","YYZ"]},mnx:{name:"MNX.io",url:"https://mnx.io/",pops:["ORD"]},netlify:{name:"Netlify",url:"https://www.netlify.com/",pops:["BOM","CMH","DME","DSM","DUB","DXB","FRA","GRU","HEL","JFK","JNB","LHR","MAA","NRT","PUS","SFO","SIN","SYD","YYZ"]},ovh:{name:"OVH",url:"https://www.ovh.com/",pops:["CDG","FRA","LHR","SIN","SYD","WAW"]},packet:{name:"Packet",url:"https://www.packet.com",pops:["AMS","ATL","DFW","DTW","EWR","FRA","HKG","IAD","IAH","LAX","MCI","MRS","NRT","ORD","PHX","PIT","SEA","SIN","SJC","SYD","YYZ"]},scaleway:{name:"Scaleway",url:"https://www.scaleway.com/",pops:["AMS","CDG","WAW"]},stackpath:{name:"StackPath",url:"https://www.stackpath.com/",pops:["AMS","ARN","ATL","BOG","BOS","BRU","CDG","DCA","DEN","DFW","DTW","DXB","EZE","FRA","GIG","GRU","HKG","ICN","ICT","JFK","JNB","KIX","LAX","LHR","LIM","MAD","MEL","MFE","MIA","MRS","MXP","NRT","ORD","PHX","PNS","SCL","SEA","SFO","SIN","SJC","STL","SYD","WAW","YYZ"]},sucuri:{name:"Sucuri",url:"https://sucuri.net/",pops:["AMS","DFW","FRA","GRU","IAD","LHR","MIA","NRT","ORD","SIN","SJC","SOF","SYD"]},upcloud:{name:"UpCloud",url:"https://upcloud.com/",pops:["AMS","ARN","FRA","HEL","JFK","LHR","MAD","ORD","SIN","SJC","SYD","WAW"]},verizonmedia:{name:"Verizon Media",url:"https://www.verizondigitalmedia.com/",pops:["AKL","AMS","ARN","ATL","BAQ","BKK","BLR","BOG","BOM","BOS","BTH","CDG","CGK","CPH","DCA","DEL","DEN","DFW","DTW","EWR","EZE","FJR","FRA","GDL","GIG","GRU","HEL","HKG","IAD","IAH","ICN","JFK","JNB","KHH","KIX","KWI","LAS","LAX","LHR","LIM","LIS","MAA","MAD","MAN","MCT","MDE","MEL","MEX","MIA","MNL","MRS","MUC","MXP","NBO","NRT","ORD","OTP","PHL","PHX","PIT","RIX","SCL","SEA","SIN","SJC","SOF","SYD","TPE","UIO","VIE","WAW"]},vercel:{name:"Vercel",url:"https://vercel.com/",pops:["ARN","BOM","CDG","CPT","CLE","DUB","FRA","GRU","HKG","HND","IAD","ICN","LHR","KIX","PDX","SFO","SIN","SYD"]},vultr:{name:"Vultr",url:"https://www.vultr.com/",pops:["AMS","ARN","ATL","BLR","BOM","CDG","DEL","DFW","EWR","FRA","GRU","HNL","ICN","JNB","KIX","LAX","LHR","MAD","MAN","MEL","MEX","MIA","NRT","ORD","SCL","SEA","SIN","SJC","SYD","TLV","WAW","YYZ"]},wasabi:{name:"Wasabi",url:"https://wasabi.com",pops:["AMS","CDG","DFW","FRA","HEF","HIO","IAD","KIX","LHR","NRT","YYZ"]}}},S=(()=>{const S={all:{code:Array.from(A.iata.keys()),geo:Array.from(A.iata.values())}};for(const[L,D]of A.iata)S[L]={geo:D,providers:[]};for(const L of Object.keys(A.providers)){const D=A.providers[L].pops;S[L]={code:[],geo:[]};for(const R of D){const D=A.iata.get(R);D&&(S[L].code.push(R),S[L].geo.push(D),S[R].providers.push(L))}S[L].code=[...new Set(S[L].code)].sort()}return S})();export{S as default}; -------------------------------------------------------------------------------- /examples/example.js: -------------------------------------------------------------------------------- 1 | import PoPs from "../dist/bundle.js"; 2 | 3 | /* Geolocation of Cloudflare PoPs */ 4 | console.log(PoPs.cloudflare.geo); 5 | 6 | /* IATA code of Fastly PoPs */ 7 | console.log(PoPs.fastly.code); 8 | 9 | /* Total of locations for AWS Lightsail Datacenters */ 10 | console.log(PoPs.fastly.code.length); 11 | 12 | /* Providers in Madrid */ 13 | console.log(PoPs.MAD); 14 | -------------------------------------------------------------------------------- /main.d.ts: -------------------------------------------------------------------------------- 1 | declare module "@adaptivelink/pops"; -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@adaptivelink/pops", 3 | "version": "0.5.9", 4 | "description": "Points of Presence geolocation", 5 | "main": "dist/bundle.js", 6 | "types": "main.d.ts", 7 | "type": "module", 8 | "publishConfig": { 9 | "registry": "https://registry.npmjs.org/" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "git+https://github.com/adaptive/pops.git" 14 | }, 15 | "bugs": { 16 | "url": "https://github.com/adaptive/pops/issues" 17 | }, 18 | "homepage": "https://github.com/adaptive/pops#readme", 19 | "author": "Hugo Romano ", 20 | "license": "MIT", 21 | "keywords": [ 22 | "cdn", 23 | "alibaba", 24 | "arubacloud", 25 | "atlanticnet", 26 | "aws", 27 | "azurecdn", 28 | "backblaze", 29 | "bunnycdn", 30 | "cachefly", 31 | "cdn77", 32 | "cloudflare", 33 | "cloudfront", 34 | "cloudsigma", 35 | "deno", 36 | "digitalocean", 37 | "equinix", 38 | "fastly", 39 | "flexential", 40 | "google", 41 | "heroku", 42 | "hetzner", 43 | "hivelocity", 44 | "hostwinds", 45 | "imperva", 46 | "ionos", 47 | "kamatera", 48 | "keycdn", 49 | "leapswitch", 50 | "lightsail", 51 | "limelight", 52 | "linode", 53 | "mnx", 54 | "netlify", 55 | "ovh", 56 | "scaleway", 57 | "stackpath", 58 | "sucuri", 59 | "upcloud", 60 | "verizonmedia", 61 | "vercel", 62 | "vultr", 63 | "wasabi" 64 | ], 65 | "devDependencies": { 66 | "@adaptivelink/iata": "0.1.4", 67 | "concurrently": "9.1.2", 68 | "isomorphic-fetch": "3.0.0", 69 | "lodash": "4.17.21", 70 | "prettier": "3.5.3", 71 | "puppeteer": "24.10.0", 72 | "rollup": "4.41.1", 73 | "@rollup/plugin-terser": "0.4.4" 74 | }, 75 | "scripts": { 76 | "build": "npx rollup -c", 77 | "bun": "bun build ./src/main.js --outfile ./dist/bundle.js --minify --target browser --format esm", 78 | "prebuild": "npx prettier --write '**/*.{js,json}' '!dist/**' --arrow-parens avoid --trailing-comma none", 79 | "iata": "node ./tools/iata-filter.js > ./data/iata-filtered-test.js && mv ./data/iata-filtered-test.js ./data/iata-filtered.js", 80 | "validate": "node ./tools/validator.js", 81 | "test": "node ./test/index.test.mjs", 82 | "csv": "node ./tools/csv-generator.js > ./notebooks/data.csv", 83 | "spotter-atlatincnet": "node ./tools/spotters/atlanticnet.js", 84 | "spotter-cdn77": "node ./tools/spotters/cdn77.js", 85 | "spotter-cloudflare": "node ./tools/spotters/cloudflare.js", 86 | "spotter-deno": "node ./tools/spotters/deno.js", 87 | "spotter-digitalocean": "node ./tools/spotters/digitalocean.js", 88 | "spotter-ec2": "node ./tools/spotters/ec2.js", 89 | "spotter-fastly": "node ./tools/spotters/fastly.js", 90 | "spotter-imperva": "node ./tools/spotters/imperva.js", 91 | "spotter-keycdn": "node ./tools/spotters/keycdn.js", 92 | "spotter-lightsail": "node ./tools/spotters/lightsail.js", 93 | "spotter-linode": "node ./tools/spotters/linode.js", 94 | "spotter-stackpath": "node ./tools/spotters/stackpath.js", 95 | "spotter-upcloud": "node ./tools/spotters/upcloud.js", 96 | "spotter-vercel": "node ./tools/spotters/vercel.js", 97 | "spotter-vultr": "node ./tools/spotters/vultr.js", 98 | "spotters": "concurrently \"yarn:spotter-*\"" 99 | }, 100 | "packageManager": "pnpm@9.15.1" 101 | } 102 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import terser from "@rollup/plugin-terser"; 2 | 3 | export default { 4 | input: "src/main.js", 5 | output: [ 6 | { 7 | file: "dist/bundle.js", 8 | format: "esm", 9 | plugins: [terser()] 10 | } 11 | ] 12 | }; 13 | -------------------------------------------------------------------------------- /sandworm/@adaptivelink-pops@0.5.4-dependencies.csv: -------------------------------------------------------------------------------- 1 | name,version,latestVersion,repository,published,publisher,size,license,isProd,isDev,isOptional,isPeer,isBundled,parents 2 | "@adaptivelink/pops","0.5.4","-","-","-","-","-","-",false,false,false,false,false,"" 3 | "@adaptivelink/iata","0.1.4","-","-","-","-","-","-",false,true,false,false,false,"@adaptivelink/pops@0.5.4" 4 | "@babel/code-frame","7.18.6","-","-","-","-","-","-",false,false,false,false,false,"parse-json@5.2.0" 5 | "@babel/helper-validator-identifier","7.19.1","-","-","-","-","-","-",false,false,false,false,false,"@babel/highlight@7.18.6" 6 | "@babel/highlight","7.18.6","-","-","-","-","-","-",false,false,false,false,false,"@babel/code-frame@7.18.6" 7 | "@jridgewell/gen-mapping","0.3.2","-","-","-","-","-","-",false,false,false,false,false,"@jridgewell/source-map@0.3.2" 8 | "@jridgewell/resolve-uri","3.1.0","-","-","-","-","-","-",false,false,false,false,false,"@jridgewell/trace-mapping@0.3.17" 9 | "@jridgewell/set-array","1.1.2","-","-","-","-","-","-",false,false,false,false,false,"@jridgewell/gen-mapping@0.3.2" 10 | "@jridgewell/source-map","0.3.2","-","-","-","-","-","-",false,false,false,false,false,"terser@5.16.1" 11 | "@jridgewell/sourcemap-codec","1.4.14","-","-","-","-","-","-",false,false,false,false,false,"@jridgewell/gen-mapping@0.3.2,@jridgewell/trace-mapping@0.3.17" 12 | "@jridgewell/trace-mapping","0.3.17","-","-","-","-","-","-",false,false,false,false,false,"@jridgewell/gen-mapping@0.3.2,@jridgewell/source-map@0.3.2" 13 | "@puppeteer/browsers","0.3.1","-","-","-","-","-","-",false,false,false,false,false,"puppeteer@19.8.2" 14 | "@types/node","18.11.8","-","-","-","-","-","-",false,false,false,false,false,"@types/yauzl@2.10.0" 15 | "@types/yauzl","2.10.0","-","-","-","-","-","-",false,false,false,false,false,"extract-zip@2.0.1" 16 | "acorn","8.8.1","-","-","-","-","-","-",false,false,false,false,false,"terser@5.16.1" 17 | "agent-base","6.0.2","-","-","-","-","-","-",false,false,false,false,false,"https-proxy-agent@5.0.1" 18 | "ansi-regex","5.0.1","-","-","-","-","-","-",false,true,false,false,false,"strip-ansi@6.0.1" 19 | "ansi-styles","3.2.1","-","-","-","-","-","-",false,false,false,false,false,"chalk@2.4.2" 20 | "ansi-styles","4.3.0","-","-","-","-","-","-",false,true,false,false,false,"chalk@4.1.2,wrap-ansi@7.0.0" 21 | "argparse","2.0.1","-","-","-","-","-","-",false,false,false,false,false,"js-yaml@4.1.0" 22 | "base64-js","1.5.1","-","-","-","-","-","-",false,false,false,false,false,"buffer@5.7.1" 23 | "bl","4.1.0","-","-","-","-","-","-",false,false,false,false,false,"tar-stream@2.2.0" 24 | "buffer-crc32","0.2.13","-","-","-","-","-","-",false,false,false,false,false,"yauzl@2.10.0" 25 | "buffer-from","1.1.2","-","-","-","-","-","-",false,false,false,false,false,"source-map-support@0.5.21" 26 | "buffer","5.7.1","-","-","-","-","-","-",false,false,false,false,false,"bl@4.1.0,unbzip2-stream@1.4.3" 27 | "callsites","3.1.0","-","-","-","-","-","-",false,false,false,false,false,"parent-module@1.0.1" 28 | "chalk","2.4.2","-","-","-","-","-","-",false,false,false,false,false,"@babel/highlight@7.18.6" 29 | "chalk","4.1.2","-","-","-","-","-","-",false,true,false,false,false,"concurrently@8.0.1" 30 | "chownr","1.1.4","-","-","-","-","-","-",false,false,false,false,false,"tar-fs@2.1.1" 31 | "chromium-bidi","0.4.6","-","-","-","-","-","-",false,false,false,false,false,"puppeteer-core@19.8.1" 32 | "cliui","8.0.1","-","-","-","-","-","-",false,true,false,false,false,"yargs@17.7.1" 33 | "color-convert","1.9.3","-","-","-","-","-","-",false,false,false,false,false,"ansi-styles@3.2.1" 34 | "color-convert","2.0.1","-","-","-","-","-","-",false,true,false,false,false,"ansi-styles@4.3.0" 35 | "color-name","1.1.3","-","-","-","-","-","-",false,false,false,false,false,"color-convert@1.9.3" 36 | "color-name","1.1.4","-","-","-","-","-","-",false,true,false,false,false,"color-convert@2.0.1" 37 | "commander","2.20.3","-","-","-","-","-","-",false,false,false,false,false,"terser@5.16.1" 38 | "concurrently","8.0.1","-","-","-","-","-","-",false,true,false,false,false,"@adaptivelink/pops@0.5.4" 39 | "cosmiconfig","8.1.3","-","-","-","-","-","-",false,false,false,false,false,"puppeteer@19.8.2" 40 | "cross-fetch","3.1.5","-","-","-","-","-","-",false,false,false,false,false,"puppeteer-core@19.8.1" 41 | "date-fns","2.29.3","-","-","-","-","-","-",false,true,false,false,false,"concurrently@8.0.1" 42 | "debug","4.3.4","-","-","-","-","-","-",false,false,false,false,false,"@puppeteer/browsers@0.3.1,agent-base@6.0.2,extract-zip@2.0.1,https-proxy-agent@5.0.1,puppeteer-core@19.8.1" 43 | "devtools-protocol","0.0.1107588","-","-","-","-","-","-",false,false,false,false,false,"chromium-bidi@0.4.6,puppeteer-core@19.8.1,chromium-bidi@0.4.6" 44 | "emoji-regex","8.0.0","-","-","-","-","-","-",false,true,false,false,false,"string-width@4.2.3" 45 | "end-of-stream","1.4.4","-","-","-","-","-","-",false,false,false,false,false,"pump@3.0.0,tar-stream@2.2.0" 46 | "error-ex","1.3.2","-","-","-","-","-","-",false,false,false,false,false,"parse-json@5.2.0" 47 | "escalade","3.1.1","-","-","-","-","-","-",false,true,false,false,false,"yargs@17.7.1" 48 | "escape-string-regexp","1.0.5","-","-","-","-","-","-",false,false,false,false,false,"chalk@2.4.2" 49 | "extract-zip","2.0.1","-","-","-","-","-","-",false,false,false,false,false,"@puppeteer/browsers@0.3.1,puppeteer-core@19.8.1" 50 | "fd-slicer","1.1.0","-","-","-","-","-","-",false,false,false,false,false,"yauzl@2.10.0" 51 | "fs-constants","1.0.0","-","-","-","-","-","-",false,false,false,false,false,"tar-stream@2.2.0" 52 | "fsevents","2.3.2","-","-","-","-","-","-",false,false,false,false,false,"rollup@3.20.2" 53 | "get-caller-file","2.0.5","-","-","-","-","-","-",false,true,false,false,false,"yargs@17.7.1" 54 | "get-stream","5.2.0","-","-","-","-","-","-",false,false,false,false,false,"extract-zip@2.0.1" 55 | "has-flag","3.0.0","-","-","-","-","-","-",false,false,false,false,false,"supports-color@5.5.0" 56 | "has-flag","4.0.0","-","-","-","-","-","-",false,true,false,false,false,"supports-color@8.1.1" 57 | "https-proxy-agent","5.0.1","-","-","-","-","-","-",false,false,false,false,false,"@puppeteer/browsers@0.3.1,puppeteer-core@19.8.1,puppeteer@19.8.2" 58 | "ieee754","1.2.1","-","-","-","-","-","-",false,false,false,false,false,"buffer@5.7.1" 59 | "import-fresh","3.3.0","-","-","-","-","-","-",false,false,false,false,false,"cosmiconfig@8.1.3" 60 | "inherits","2.0.4","-","-","-","-","-","-",false,false,false,false,false,"bl@4.1.0,readable-stream@3.6.0,tar-stream@2.2.0" 61 | "is-arrayish","0.2.1","-","-","-","-","-","-",false,false,false,false,false,"error-ex@1.3.2" 62 | "is-fullwidth-code-point","3.0.0","-","-","-","-","-","-",false,true,false,false,false,"string-width@4.2.3" 63 | "isomorphic-fetch","3.0.0","-","-","-","-","-","-",false,true,false,false,false,"@adaptivelink/pops@0.5.4" 64 | "js-tokens","4.0.0","-","-","-","-","-","-",false,false,false,false,false,"@babel/highlight@7.18.6" 65 | "js-yaml","4.1.0","-","-","-","-","-","-",false,false,false,false,false,"cosmiconfig@8.1.3" 66 | "json-parse-even-better-errors","2.3.1","-","-","-","-","-","-",false,false,false,false,false,"parse-json@5.2.0" 67 | "lines-and-columns","1.2.4","-","-","-","-","-","-",false,false,false,false,false,"parse-json@5.2.0" 68 | "lodash","4.17.21","-","-","-","-","-","-",false,true,false,false,false,"concurrently@8.0.1,@adaptivelink/pops@0.5.4" 69 | "mitt","3.0.0","-","-","-","-","-","-",false,false,false,false,false,"chromium-bidi@0.4.6" 70 | "mkdirp-classic","0.5.3","-","-","-","-","-","-",false,false,false,false,false,"tar-fs@2.1.1" 71 | "ms","2.1.2","-","-","-","-","-","-",false,false,false,false,false,"debug@4.3.4" 72 | "node-fetch","2.6.7","-","-","-","-","-","-",false,true,false,false,false,"cross-fetch@3.1.5,isomorphic-fetch@3.0.0" 73 | "once","1.4.0","-","-","-","-","-","-",false,false,false,false,false,"end-of-stream@1.4.4,pump@3.0.0" 74 | "parent-module","1.0.1","-","-","-","-","-","-",false,false,false,false,false,"import-fresh@3.3.0" 75 | "parse-json","5.2.0","-","-","-","-","-","-",false,false,false,false,false,"cosmiconfig@8.1.3" 76 | "path-type","4.0.0","-","-","-","-","-","-",false,false,false,false,false,"cosmiconfig@8.1.3" 77 | "pend","1.2.0","-","-","-","-","-","-",false,false,false,false,false,"fd-slicer@1.1.0" 78 | "progress","2.0.3","-","-","-","-","-","-",false,false,false,false,false,"@puppeteer/browsers@0.3.1,puppeteer@19.8.2" 79 | "proxy-from-env","1.1.0","-","-","-","-","-","-",false,false,false,false,false,"@puppeteer/browsers@0.3.1,puppeteer-core@19.8.1,puppeteer@19.8.2" 80 | "pump","3.0.0","-","-","-","-","-","-",false,false,false,false,false,"get-stream@5.2.0,tar-fs@2.1.1" 81 | "puppeteer-core","19.8.1","-","-","-","-","-","-",false,false,false,false,false,"puppeteer@19.8.2" 82 | "randombytes","2.1.0","-","-","-","-","-","-",false,false,false,false,false,"serialize-javascript@6.0.0" 83 | "readable-stream","3.6.0","-","-","-","-","-","-",false,false,false,false,false,"bl@4.1.0,tar-stream@2.2.0" 84 | "require-directory","2.1.1","-","-","-","-","-","-",false,true,false,false,false,"yargs@17.7.1" 85 | "resolve-from","4.0.0","-","-","-","-","-","-",false,false,false,false,false,"import-fresh@3.3.0" 86 | "rollup","3.20.2","-","-","-","-","-","-",false,false,false,false,false,"@rollup/plugin-terser@0.4.0,@rollup/plugin-terser@0.4.0" 87 | "rxjs","7.8.0","-","-","-","-","-","-",false,true,false,false,false,"concurrently@8.0.1" 88 | "safe-buffer","5.2.1","-","-","-","-","-","-",false,false,false,false,false,"randombytes@2.1.0,string_decoder@1.3.0" 89 | "serialize-javascript","6.0.0","-","-","-","-","-","-",false,false,false,false,false,"@rollup/plugin-terser@0.4.0" 90 | "shell-quote","1.8.0","-","-","-","-","-","-",false,true,false,false,false,"concurrently@8.0.1" 91 | "smob","0.0.6","-","-","-","-","-","-",false,false,false,false,false,"@rollup/plugin-terser@0.4.0" 92 | "source-map-support","0.5.21","-","-","-","-","-","-",false,false,false,false,false,"terser@5.16.1" 93 | "source-map","0.6.1","-","-","-","-","-","-",false,false,false,false,false,"source-map-support@0.5.21" 94 | "spawn-command","0.0.2-1","-","-","-","-","-","-",false,true,false,false,false,"concurrently@8.0.1" 95 | "string-width","4.2.3","-","-","-","-","-","-",false,true,false,false,false,"cliui@8.0.1,wrap-ansi@7.0.0,yargs@17.7.1" 96 | "string_decoder","1.3.0","-","-","-","-","-","-",false,false,false,false,false,"readable-stream@3.6.0" 97 | "strip-ansi","6.0.1","-","-","-","-","-","-",false,true,false,false,false,"cliui@8.0.1,string-width@4.2.3,wrap-ansi@7.0.0" 98 | "supports-color","5.5.0","-","-","-","-","-","-",false,false,false,false,false,"chalk@2.4.2,debug@4.3.4" 99 | "supports-color","7.2.0","-","-","-","-","-","-",false,true,false,false,false,"chalk@4.1.2" 100 | "supports-color","8.1.1","-","-","-","-","-","-",false,true,false,false,false,"concurrently@8.0.1" 101 | "tar-fs","2.1.1","-","-","-","-","-","-",false,false,false,false,false,"@puppeteer/browsers@0.3.1,puppeteer-core@19.8.1" 102 | "tar-stream","2.2.0","-","-","-","-","-","-",false,false,false,false,false,"tar-fs@2.1.1" 103 | "terser","5.16.1","-","-","-","-","-","-",false,false,false,false,false,"@rollup/plugin-terser@0.4.0" 104 | "through","2.3.8","-","-","-","-","-","-",false,false,false,false,false,"unbzip2-stream@1.4.3" 105 | "tr46","0.0.3","-","-","-","-","-","-",false,true,false,false,false,"whatwg-url@5.0.0" 106 | "tree-kill","1.2.2","-","-","-","-","-","-",false,true,false,false,false,"concurrently@8.0.1" 107 | "tslib","2.4.0","-","-","-","-","-","-",false,true,false,false,false,"rxjs@7.8.0" 108 | "unbzip2-stream","1.4.3","-","-","-","-","-","-",false,false,false,false,false,"@puppeteer/browsers@0.3.1,puppeteer-core@19.8.1" 109 | "util-deprecate","1.0.2","-","-","-","-","-","-",false,false,false,false,false,"readable-stream@3.6.0" 110 | "webidl-conversions","3.0.1","-","-","-","-","-","-",false,true,false,false,false,"whatwg-url@5.0.0" 111 | "whatwg-fetch","3.6.2","-","-","-","-","-","-",false,true,false,false,false,"isomorphic-fetch@3.0.0" 112 | "whatwg-url","5.0.0","-","-","-","-","-","-",false,true,false,false,false,"node-fetch@2.6.7" 113 | "wrap-ansi","7.0.0","-","-","-","-","-","-",false,true,false,false,false,"cliui@8.0.1" 114 | "wrappy","1.0.2","-","-","-","-","-","-",false,false,false,false,false,"once@1.4.0" 115 | "ws","8.13.0","-","-","-","-","-","-",false,false,false,false,false,"puppeteer-core@19.8.1" 116 | "y18n","5.0.8","-","-","-","-","-","-",false,true,false,false,false,"yargs@17.7.1" 117 | "yargs-parser","21.1.1","-","-","-","-","-","-",false,true,false,false,false,"yargs@17.7.1" 118 | "yargs","17.7.1","-","-","-","-","-","-",false,true,false,false,false,"@puppeteer/browsers@0.3.1,concurrently@8.0.1" 119 | "yauzl","2.10.0","-","-","-","-","-","-",false,false,false,false,false,"extract-zip@2.0.1" -------------------------------------------------------------------------------- /sandworm/@adaptivelink-pops@0.5.4-report.json: -------------------------------------------------------------------------------- 1 | { 2 | "createdAt": 1684276926678, 3 | "system": { 4 | "sandwormVersion": "1.35.0", 5 | "nodeVersion": "18.12.1", 6 | "lockfileVersion": 5.4, 7 | "packageManager": "pnpm", 8 | "packageManagerVersion": "8.5.1" 9 | }, 10 | "name": "@adaptivelink/pops", 11 | "version": "0.5.4", 12 | "rootVulnerabilities": [], 13 | "dependencyVulnerabilities": [], 14 | "licenseUsage": [], 15 | "licenseIssues": [], 16 | "metaIssues": [], 17 | "resolvedIssues": [], 18 | "errors": [] 19 | } 20 | -------------------------------------------------------------------------------- /sandworm/@adaptivelink-pops@0.5.4-tree.svg: -------------------------------------------------------------------------------- 1 | @adaptivelink/pops
-------------------------------------------------------------------------------- /sandworm/@adaptivelink-pops@0.5.4-treemap.svg: -------------------------------------------------------------------------------- 1 | @adaptivelink/pops1 B
-------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import popsData from "../data/index.js"; 2 | 3 | const PoPs = (() => { 4 | const output = { 5 | all: { 6 | code: Array.from(popsData.iata.keys()), 7 | geo: Array.from(popsData.iata.values()) 8 | } 9 | }; 10 | 11 | // Initialize location entries with geo data and empty providers array 12 | for (const [iataCode, geoData] of popsData.iata) { 13 | output[iataCode] = { 14 | geo: geoData, 15 | providers: [] 16 | }; 17 | } 18 | 19 | for (const providerKey of Object.keys(popsData.providers)) { 20 | const providerPops = popsData.providers[providerKey].pops; 21 | 22 | output[providerKey] = { code: [], geo: [] }; 23 | 24 | for (const iataCode of providerPops) { 25 | const geoData = popsData.iata.get(iataCode); 26 | if (geoData) { 27 | output[providerKey].code.push(iataCode); 28 | output[providerKey].geo.push(geoData); 29 | 30 | output[iataCode].providers.push(providerKey); 31 | } 32 | } 33 | 34 | // Remove duplicates and sort codes 35 | output[providerKey].code = [...new Set(output[providerKey].code)].sort(); 36 | } 37 | 38 | return output; 39 | })(); 40 | 41 | export default PoPs; 42 | -------------------------------------------------------------------------------- /test/index.test.mjs: -------------------------------------------------------------------------------- 1 | import PoPs from "../dist/bundle.js"; 2 | 3 | /* Geolocation of Cloudflare PoPs */ 4 | console.log(PoPs.cloudflare.geo); 5 | 6 | /* IATA code of Fastly PoPs */ 7 | console.log(PoPs.fastly.code); 8 | 9 | /* Total of locations for AWS Lightsail Datacenters */ 10 | console.log(PoPs.lightsail.code.length); 11 | 12 | /* Providers in Madrid */ 13 | console.log(PoPs.MAD.providers); 14 | 15 | /* Location of Lisbon */ 16 | console.log(PoPs.LIS.geo); 17 | 18 | /* All PoPs codes */ 19 | console.log(PoPs.all.code); 20 | 21 | /* All PoPs locations */ 22 | console.log(PoPs.all.geo); 23 | -------------------------------------------------------------------------------- /tools/csv-generator.js: -------------------------------------------------------------------------------- 1 | import popsData from "../data/index.js"; 2 | 3 | const providers = Object.keys(popsData.providers); 4 | 5 | console.log("provider,code,latitude,longitude"); 6 | 7 | for (const provider of providers) { 8 | const map = new Map( 9 | [...popsData.iata].filter(([k]) => 10 | popsData.providers[provider].pops.includes(k) 11 | ) 12 | ); 13 | 14 | for (let e of map.keys()) { 15 | console.log(`${provider},${e},${map.get(e)}`); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /tools/iata-filter.js: -------------------------------------------------------------------------------- 1 | import data from "../data/index.js"; 2 | import iata from "@adaptivelink/iata"; 3 | 4 | const keys = Object.keys(data.providers); 5 | let pops = []; 6 | for (const key of keys) { 7 | const map1 = new Map( 8 | [...iata.airports].filter(([k]) => data.providers[key].pops.includes(k)) 9 | ); 10 | 11 | for (let value of map1.keys()) { 12 | pops.push(value); 13 | } 14 | } 15 | let unique_pops = [...new Set(pops)].sort(); 16 | 17 | console.log(`/** IATA airports location filtered*/ 18 | const iata = new Map([`); 19 | for (let e of unique_pops) { 20 | let geo = iata.airports.get(e); 21 | let lat = Math.round(geo[0] * 100) / 100; 22 | let long = Math.round(geo[1] * 100) / 100; 23 | console.log(` ["${e}", [${lat}, ${long}]],`); 24 | } 25 | console.log(`]); 26 | 27 | export default iata;`); 28 | -------------------------------------------------------------------------------- /tools/spotters/cdn77.js: -------------------------------------------------------------------------------- 1 | import _ from "lodash"; 2 | import fetch from "isomorphic-fetch"; 3 | import toTelegram from "./lib/telegram.js"; 4 | import provider from "../../data/providers/cdn77.js"; 5 | 6 | const asset = "cdn77"; 7 | 8 | const spotter = async () => { 9 | await fetch(`https://client.cdn77.com/support/api/datacenter/status`, { 10 | method: "GET" 11 | }) 12 | .then(response => response.json()) 13 | .then(res => { 14 | if (res.length === provider.pops.length) { 15 | console.log(`${asset}:success`); 16 | } else { 17 | toTelegram(asset); 18 | console.log(`${asset}:fail`); 19 | } 20 | }); 21 | }; 22 | 23 | spotter(); 24 | -------------------------------------------------------------------------------- /tools/spotters/cloudflare.js: -------------------------------------------------------------------------------- 1 | import _ from "lodash"; 2 | import puppeteer from "puppeteer"; 3 | import toTelegram from "./lib/telegram.js"; 4 | import provider from "../../data/providers/cloudflare.js"; 5 | 6 | const asset = "cloudflare"; 7 | 8 | const spotter = async () => { 9 | const browser = await puppeteer.launch({ headless: "new" }); 10 | const page = await browser.newPage(); 11 | await page.goto("https://www.cloudflarestatus.com/"); 12 | const data = await page.$eval( 13 | "body > div.layout-content.status.status-index.starter > div.container > div.components-section.font-regular", 14 | e => e.innerHTML 15 | ); 16 | browser.close(); 17 | return data; 18 | }; 19 | 20 | spotter() 21 | .then(value => value.match(/\((.{3})\)/gm).map(x => x.slice(1, -1))) 22 | .then(a => a.filter(element => element !== "DEX")) 23 | .then(a => a.filter(element => element !== "DLP")) 24 | // .then(a => 25 | // a.map(x => { 26 | // hardcoding array due to Cloudflare Error 27 | // if (x === "NBG") return "NGB"; 28 | // else return x; 29 | // }) 30 | // ) 31 | .then(extracted => { 32 | if (_.isEqual(extracted.sort(), provider.pops)) { 33 | console.log(`${asset}:success`, extracted.length - provider.pops.length); 34 | } else { 35 | toTelegram(asset); 36 | console.log( 37 | `${asset}:fail`, 38 | extracted.filter(e => !provider.pops.includes(e)) 39 | ); 40 | console.log( 41 | `added`, 42 | extracted.filter(e => !provider.pops.includes(e)) 43 | ); 44 | console.log( 45 | `removed`, 46 | provider.pops.filter(e => !extracted.includes(e)) 47 | ); 48 | } 49 | }); 50 | -------------------------------------------------------------------------------- /tools/spotters/deno.js: -------------------------------------------------------------------------------- 1 | import _ from "lodash"; 2 | import puppeteer from "puppeteer"; 3 | import toTelegram from "./lib/telegram.js"; 4 | import provider from "../../data/providers/deno.js"; 5 | 6 | const asset = "deno"; 7 | 8 | const spotter = async () => { 9 | const browser = await puppeteer.launch({ headless: "new" }); 10 | const page = await browser.newPage(); 11 | await page.goto("https://deno.com/deploy/docs/regions"); 12 | const data = await page.$eval( 13 | "body > section > article > ol", 14 | e => e.innerHTML 15 | ); 16 | browser.close(); 17 | return data; 18 | }; 19 | 20 | spotter() 21 | .then(value => value.match(/
  • /g)) 22 | .then(extracted => { 23 | if (extracted.length === provider.pops.length) { 24 | console.log( 25 | `${asset}:success ${extracted.length - provider.pops.length}` 26 | ); 27 | } else { 28 | toTelegram(asset); 29 | console.log(`${asset}:fail`); 30 | } 31 | }); 32 | -------------------------------------------------------------------------------- /tools/spotters/ec2.js: -------------------------------------------------------------------------------- 1 | import _ from "lodash"; 2 | import puppeteer from "puppeteer"; 3 | import toTelegram from "./lib/telegram.js"; 4 | import provider from "../../data/providers/ec2.js"; 5 | 6 | const asset = "ec2"; 7 | 8 | const spotter = async () => { 9 | const browser = await puppeteer.launch({ headless: "new" }); 10 | const page = await browser.newPage(); 11 | await page.goto( 12 | "https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html" 13 | ); 14 | const data = await page.$eval( 15 | "#main-col-body > div.table-container", 16 | e => e.innerHTML 17 | ); 18 | browser.close(); 19 | return data; 20 | }; 21 | 22 | spotter() 23 | .then(value => value.match(/[a-z]{2}-[a-z]+-[1-9]{1}/gm)) 24 | .then(x => _.uniq(x)) 25 | .then(extracted => { 26 | if (extracted.length === provider.pops.length) { 27 | console.log(`${asset}:success`); 28 | } else { 29 | toTelegram(asset); 30 | console.log(`${asset}:fail ${extracted.length - provider.pops.length}`); 31 | } 32 | }); 33 | -------------------------------------------------------------------------------- /tools/spotters/fastly.js: -------------------------------------------------------------------------------- 1 | import _ from "lodash"; 2 | import fetch from "isomorphic-fetch"; 3 | import toTelegram from "./lib/telegram.js"; 4 | import provider from "../../data/providers/fastly.js"; 5 | 6 | const asset = "fastly"; 7 | 8 | const regex = /\((.{3,7})\)/gm; 9 | 10 | const spotter = async () => { 11 | await fetch(`https://www.fastlystatus.com/components.js`, { 12 | method: "GET" 13 | }) 14 | .then(response => response.text()) 15 | .then(value => value.match(/\((.{3})\)/gm).map(x => x.slice(1, 4))) 16 | .then(a => _.uniq(a)) 17 | .then(a => 18 | a.map(x => { 19 | // hardcoding LON to LGW 20 | if (x === "LON") return "LGW"; 21 | else return x; 22 | }) 23 | ) 24 | .then(a => 25 | a.map(x => { 26 | // hardcoding WDC to LEE 27 | if (x === "WDC") return "LEE"; 28 | else return x; 29 | }) 30 | ) 31 | .then(a => 32 | a.map(x => { 33 | // hardcoding BFI to SEA 34 | if (x === "BFI") return "SEA"; 35 | else return x; 36 | }) 37 | ) 38 | .then(a => 39 | a.map(x => { 40 | // hardcoding NYC to JFK 41 | if (x === "NYC") return "JFK"; 42 | else return x; 43 | }) 44 | ) 45 | .then(a => 46 | a.map(x => { 47 | // hardcoding LGB to LAX 48 | if (x === "LGB") return "LAX"; 49 | else return x; 50 | }) 51 | ) 52 | .then(a => 53 | a.map(x => { 54 | // hardcoding PAR to ORY 55 | if (x === "PAR") return "ORY"; 56 | else return x; 57 | }) 58 | ) 59 | .then(extracted => { 60 | if (_.isEqual(extracted.sort(), provider.pops)) { 61 | console.log( 62 | `${asset}:success`, 63 | extracted.length - provider.pops.length 64 | ); 65 | } else { 66 | toTelegram(asset); 67 | console.log(`${asset}:fail`, extracted.length - provider.pops.length); 68 | console.log( 69 | `added`, 70 | extracted.filter(e => !provider.pops.includes(e)) 71 | ); 72 | console.log( 73 | `removed`, 74 | provider.pops.filter(e => !extracted.includes(e)) 75 | ); 76 | } 77 | }); 78 | }; 79 | 80 | spotter(); 81 | -------------------------------------------------------------------------------- /tools/spotters/imperva.js: -------------------------------------------------------------------------------- 1 | import _ from "lodash"; 2 | import puppeteer from "puppeteer"; 3 | import toTelegram from "./lib/telegram.js"; 4 | import provider from "../../data/providers/imperva.js"; 5 | 6 | const asset = "imperva"; 7 | 8 | const spotter = async () => { 9 | const browser = await puppeteer.launch({ headless: "new" }); 10 | const page = await browser.newPage(); 11 | await page.goto("https://status.imperva.com/"); 12 | const data = await page.$eval( 13 | "body > div.layout-content.status.status-index.starter > div.container > div.components-section.font-regular", 14 | e => e.innerHTML 15 | ); 16 | browser.close(); 17 | return data; 18 | }; 19 | 20 | spotter() 21 | .then(value => value.match(/\((.{3})\)/gm).map(x => x.slice(1, -1))) 22 | .then(extracted => { 23 | if ((extracted.length, provider.pops.length)) { 24 | console.log(`${asset}:success`); 25 | } else { 26 | toTelegram(asset); 27 | console.log(`${asset}:fail`); 28 | } 29 | }); 30 | -------------------------------------------------------------------------------- /tools/spotters/keycdn.js: -------------------------------------------------------------------------------- 1 | import _ from "lodash"; 2 | import puppeteer from "puppeteer"; 3 | import toTelegram from "./lib/telegram.js"; 4 | import provider from "../../data/providers/keycdn.js"; 5 | 6 | const asset = "keycdn"; 7 | 8 | const spotter = async () => { 9 | const browser = await puppeteer.launch({ headless: "new" }); 10 | const page = await browser.newPage(); 11 | await page.goto("https://status.keycdn.com/"); 12 | const data = await page.$eval( 13 | "body > section.pt-6 > div > div", 14 | e => e.innerHTML 15 | ); 16 | browser.close(); 17 | return data; 18 | }; 19 | 20 | spotter() 21 | .then(value => value.match(/\b[a-z]{4}\b/gm)) 22 | .then(x => x.filter(e => !["span", "code", "text"].includes(e))) 23 | .then(x => { 24 | if (x.length === provider.pops.length) { 25 | console.log(`${asset}:success`); 26 | } else { 27 | toTelegram(asset); 28 | console.log(`${asset}:fail ${x.length - provider.pops.length}`); 29 | } 30 | }); 31 | -------------------------------------------------------------------------------- /tools/spotters/lib/telegram.js: -------------------------------------------------------------------------------- 1 | import fetch from "isomorphic-fetch"; 2 | 3 | const user = process.env.TELEGRAM_USER; 4 | const token = process.env.TELEGRAM_TOKEN; 5 | 6 | const toTelegram = asset => { 7 | fetch(`https://api.telegram.org/bot${token}/sendMessage`, { 8 | method: "POST", 9 | headers: { 10 | "Content-Type": "application/json" 11 | }, 12 | body: JSON.stringify({ 13 | chat_id: user, 14 | text: `🕵️ ${asset}` 15 | }) 16 | }); 17 | }; 18 | 19 | export default toTelegram; 20 | -------------------------------------------------------------------------------- /tools/spotters/lightsail.js: -------------------------------------------------------------------------------- 1 | import _ from "lodash"; 2 | import puppeteer from "puppeteer"; 3 | import toTelegram from "./lib/telegram.js"; 4 | import provider from "../../data/providers/lightsail.js"; 5 | 6 | const asset = "lightsail"; 7 | 8 | const spotter = async () => { 9 | const browser = await puppeteer.launch({ headless: "new" }); 10 | const page = await browser.newPage(); 11 | await page.goto( 12 | "https://lightsail.aws.amazon.com/ls/docs/en_us/articles/understanding-regions-and-availability-zones-in-amazon-lightsail" 13 | ); 14 | const data = await page.$eval("#container > div", e => e.innerHTML); 15 | browser.close(); 16 | return data; 17 | }; 18 | 19 | spotter() 20 | .then(value => value.match(/[a-z]{2}-[a-z]+-[1-9]{1}/gm)) 21 | .then(x => _.uniq(x)) 22 | .then(extracted => { 23 | if (extracted.length === provider.pops.length) { 24 | console.log(`${asset}:success`); 25 | } else { 26 | toTelegram(asset); 27 | console.log(`${asset}:fail`); 28 | } 29 | }); 30 | -------------------------------------------------------------------------------- /tools/spotters/linode.js: -------------------------------------------------------------------------------- 1 | import _ from "lodash"; 2 | import puppeteer from "puppeteer"; 3 | import toTelegram from "./lib/telegram.js"; 4 | import provider from "../../data/providers/linode.js"; 5 | 6 | const asset = "linode"; 7 | 8 | const spotter = async () => { 9 | const browser = await puppeteer.launch({ headless: "new" }); 10 | const page = await browser.newPage(); 11 | await page.goto("https://status.linode.com/"); 12 | const data = await page.$eval( 13 | "body > div.layout-content.status.status-index.starter > div.container > div.components-section.font-regular > div.components-container.one-column > div:nth-child(5)", 14 | e => e.innerHTML 15 | ); 16 | browser.close(); 17 | return data; 18 | }; 19 | 20 | spotter() 21 | .then(value => value.match(/\((?=[^\(]*$)[^\)]+\)/gm)) 22 | .then(x => { 23 | if (x.length === provider.pops.length) { 24 | console.log(`${asset}:success`); 25 | } else { 26 | toTelegram(asset); 27 | console.log(`${asset}:fail`); 28 | } 29 | }); 30 | -------------------------------------------------------------------------------- /tools/spotters/stackpath.js: -------------------------------------------------------------------------------- 1 | import _ from "lodash"; 2 | import puppeteer from "puppeteer"; 3 | import toTelegram from "./lib/telegram.js"; 4 | import provider from "../../data/providers/stackpath.js"; 5 | 6 | const asset = "stackpath"; 7 | 8 | const spotter = async () => { 9 | const browser = await puppeteer.launch({ headless: "new" }); 10 | const page = await browser.newPage(); 11 | await page.goto("https://status.stackpath.com/"); 12 | const data = await page.$eval( 13 | "body > div.layout-content.status.status-index.premium > div.container > div.components-section.font-regular > div.components-container.one-column", 14 | e => e.innerHTML 15 | ); 16 | browser.close(); 17 | return data; 18 | }; 19 | 20 | const translate = new Map([ 21 | [ 22 | ["AM", "AMS"], 23 | ["AT", "ATL"], 24 | ["BO", "BOG"], 25 | ["BS", "BOS"], 26 | ["BR", "BRU"], 27 | ["CH", "ORD"], 28 | ["DA", "DFW"], 29 | ["DB", "DXB"], 30 | ["DC", "DCA"], 31 | ["DE", "DEN"], 32 | ["DT", "DTW"], 33 | ["EZ", "EZE"], 34 | ["FR", "FRA"], 35 | ["GI", "GIG"], 36 | ["HK", "HKG"], 37 | ["JB", "JNB"], 38 | ["LA", "LAX"], 39 | ["LI", "LIM"], 40 | ["LO", "LHR"], 41 | ["MA", "MAD"], 42 | ["ME", "MEL"], 43 | ["MF", "MFE"], 44 | ["MI", "MIA"], 45 | ["ML", "MXP"], 46 | ["NY", "JFK"], 47 | ["OS", "KIX"], 48 | ["PA", "CDG"], 49 | ["PN", "PNS"], 50 | ["PH", "PHX"], 51 | ["SC", "SCL"], 52 | ["SE", "SEA"], 53 | ["SF", "SFO"], 54 | ["SI", "SIN"], 55 | ["SJ", "SJC"], 56 | ["SK", "ARN"], 57 | ["SL", "ICN"], 58 | ["SP", "GRU"], 59 | ["ST", "STL"], 60 | ["SY", "SYD"], 61 | ["TK", "NRT"], 62 | ["TR", "YYZ"], 63 | ["WA", "WAW"], 64 | ["WI", "ICT"] 65 | ] 66 | ]); 67 | 68 | const transalted = []; 69 | 70 | spotter() 71 | .then(value => value.match(/\b[A-Z]{2}\s[-]/gm)) 72 | .then(x => x.map(x => x.slice(0, 2))) 73 | .then(x => x.filter(x => !["NA", "EU"].includes(x))) 74 | .then(x => { 75 | if (x.length === provider.pops.length) { 76 | console.log(`${asset}:success`); 77 | } else { 78 | toTelegram(asset); 79 | console.log(`${asset}:fail`, x.length, x, provider.pops.length); 80 | } 81 | }); 82 | -------------------------------------------------------------------------------- /tools/spotters/upcloud.js: -------------------------------------------------------------------------------- 1 | import _ from "lodash"; 2 | import puppeteer from "puppeteer"; 3 | import toTelegram from "./lib/telegram.js"; 4 | import provider from "../../data/providers/upcloud.js"; 5 | 6 | const asset = "upcloud"; 7 | 8 | const spotter = async () => { 9 | const browser = await puppeteer.launch({ headless: "new" }); 10 | const page = await browser.newPage(); 11 | await page.goto("https://status.upcloud.com/"); 12 | const data = await page.$eval( 13 | "body > div.layout-content.status.status-index.starter > div.container > div.components-section.font-regular > div.components-container.one-column", 14 | e => e.innerHTML 15 | ); 16 | browser.close(); 17 | return data; 18 | }; 19 | 20 | spotter() 21 | .then(value => value.match(/\b[A-Z]{3}[1-3]{1}\b/gm).map(x => x.slice(0, -1))) 22 | .then(x => _.uniq(x)) 23 | .then(a => 24 | a.map(x => { 25 | // hardcoding 26 | if (x === "NYC") return "JFK"; 27 | else return x; 28 | }) 29 | ) 30 | .then(a => 31 | a.map(x => { 32 | // hardcoding 33 | if (x === "CHI") return "ORD"; 34 | else return x; 35 | }) 36 | ) 37 | .then(a => 38 | a.map(x => { 39 | // hardcoding 40 | if (x === "LON") return "LHR"; 41 | else return x; 42 | }) 43 | ) 44 | .then(a => 45 | a.map(x => { 46 | // hardcoding 47 | if (x === "SJO") return "SJC"; 48 | else return x; 49 | }) 50 | ) 51 | .then(a => 52 | a.map(x => { 53 | // hardcoding 54 | if (x === "STO") return "ARN"; 55 | else return x; 56 | }) 57 | ) 58 | .then(extracted => { 59 | if (_.isEqual(extracted.sort(), provider.pops)) { 60 | console.log(`${asset}:success`, extracted.length - provider.pops.length); 61 | } else { 62 | toTelegram(asset); 63 | console.log( 64 | `${asset}:fail`, 65 | extracted.filter(e => !provider.pops.includes(e)) 66 | ); 67 | } 68 | }); 69 | -------------------------------------------------------------------------------- /tools/spotters/vultr.js: -------------------------------------------------------------------------------- 1 | import _ from "lodash"; 2 | import puppeteer from "puppeteer"; 3 | import toTelegram from "./lib/telegram.js"; 4 | import provider from "../../data/providers/vultr.js"; 5 | 6 | const asset = "vultr"; 7 | 8 | const spotter = async () => { 9 | const browser = await puppeteer.launch({ headless: "new" }); 10 | const page = await browser.newPage(); 11 | await page.goto("https://status.vultr.com/"); 12 | const data = await page.$eval( 13 | "body > div.site > section > div > div.box.box--lg.box--table.m-w-md > div > div > table > tbody", 14 | e => e.innerHTML 15 | ); 16 | browser.close(); 17 | return data; 18 | }; 19 | 20 | spotter() 21 | .then(value => value.match(/dist\/img\/flags/gm)) 22 | .then(x => { 23 | if (x.length === provider.pops.length) { 24 | console.log(`${asset}:success`); 25 | } else { 26 | toTelegram(asset); 27 | console.log(`${asset}:fail`); 28 | } 29 | }); 30 | -------------------------------------------------------------------------------- /tools/validator.js: -------------------------------------------------------------------------------- 1 | import data from "../data/index.js"; 2 | import _ from "lodash"; 3 | 4 | const keys = Object.keys(data.providers); 5 | for (const key of keys) { 6 | const map1 = new Map( 7 | [...data.iata].filter(([k]) => data.providers[key].pops.includes(k)) 8 | ); 9 | let pops = []; 10 | for (let value of map1.keys()) { 11 | pops.push(value); 12 | } 13 | 14 | let unique_pops = [...new Set(pops)]; 15 | unique_pops = unique_pops.sort(); 16 | let missing = data.providers[key].pops.filter(e => !pops.includes(e)); 17 | console.log( 18 | key, 19 | data.providers[key].pops.length, 20 | _.isEqual(data.providers[key].pops, unique_pops) 21 | ); 22 | if (missing.length > 0) console.log(missing); 23 | if (unique_pops.length !== data.providers[key].pops.length) 24 | console.error(data.providers[key].pops.length - unique_pops.length); 25 | } 26 | --------------------------------------------------------------------------------