feat: add map with peers to info page (#398)

* feat: fetch and process map data DB

* feat: add map

* feat: nodes-db should be sorted alphabetically by key
This commit is contained in:
Vojtech Simetka authored and GitHub committed 2022-06-20 11:16:00 +02:00
1 parent 0f0d72e7c5
commit 2be9735e0c
6 files changed
+9633 -3

No files matched your search

+110
View File
@@ -23,6 +23,7 @@
"buffer": "^6.0.3", "buffer": "^6.0.3",
"crypto": "npm:crypto-browserify", "crypto": "npm:crypto-browserify",
"crypto-browserify": "^3.12.0", "crypto-browserify": "^3.12.0",
"dotted-map": "^2.2.3",
"ethers": "^5.6.4", "ethers": "^5.6.4",
"file-saver": "^2.0.5", "file-saver": "^2.0.5",
"formik": "2.2.9", "formik": "2.2.9",
@@ -4702,6 +4703,37 @@
"integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==",
"dev": true "dev": true
}, },
"node_modules/@turf/boolean-point-in-polygon": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/@turf/boolean-point-in-polygon/-/boolean-point-in-polygon-6.5.0.tgz",
"integrity": "sha512-DtSuVFB26SI+hj0SjrvXowGTUCHlgevPAIsukssW6BG5MlNSBQAo70wpICBNJL6RjukXg8d2eXaAWuD/CqL00A==",
"dependencies": {
"@turf/helpers": "^6.5.0",
"@turf/invariant": "^6.5.0"
},
"funding": {
"url": "https://opencollective.com/turf"
}
},
"node_modules/@turf/helpers": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz",
"integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==",
"funding": {
"url": "https://opencollective.com/turf"
}
},
"node_modules/@turf/invariant": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz",
"integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==",
"dependencies": {
"@turf/helpers": "^6.5.0"
},
"funding": {
"url": "https://opencollective.com/turf"
}
},
"node_modules/@types/aria-query": { "node_modules/@types/aria-query": {
"version": "4.2.2", "version": "4.2.2",
"resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz",
@@ -8635,6 +8667,15 @@
"integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==",
"dev": true "dev": true
}, },
"node_modules/dotted-map": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/dotted-map/-/dotted-map-2.2.3.tgz",
"integrity": "sha512-8hyOOHHLLVCcCisM3yb9hqp+3bJ7TSMcr1SfrUw8Wxp5UMqih35jIvUyagweCooJbz/EH1nC9GGuPysh7+YlAg==",
"dependencies": {
"@turf/boolean-point-in-polygon": "^6.0.1",
"proj4": "^2.6.1"
}
},
"node_modules/duplexer": { "node_modules/duplexer": {
"version": "0.1.2", "version": "0.1.2",
"resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
@@ -13913,6 +13954,11 @@
"node": ">= 0.6" "node": ">= 0.6"
} }
}, },
"node_modules/mgrs": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/mgrs/-/mgrs-1.0.0.tgz",
"integrity": "sha512-awNbTOqCxK1DBGjalK3xqWIstBZgN6fxsMSiXLs9/spqWkF2pAhb2rrYCFSsr1/tT7PhcDGjZndG8SWYn0byYA=="
},
"node_modules/micromatch": { "node_modules/micromatch": {
"version": "4.0.4", "version": "4.0.4",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
@@ -16307,6 +16353,15 @@
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
}, },
"node_modules/proj4": {
"version": "2.8.0",
"resolved": "https://registry.npmjs.org/proj4/-/proj4-2.8.0.tgz",
"integrity": "sha512-baC+YcD4xsSqJ+CpCZljj2gcQDhlKb+J+Zjv/2KSBwWNjk4M0pafgQsE+mWurd84tflMIsP+7j7mtIpFDHzQfQ==",
"dependencies": {
"mgrs": "1.0.0",
"wkt-parser": "^1.3.1"
}
},
"node_modules/promise": { "node_modules/promise": {
"version": "8.1.0", "version": "8.1.0",
"resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz",
@@ -19965,6 +20020,11 @@
"integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==",
"dev": true "dev": true
}, },
"node_modules/wkt-parser": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/wkt-parser/-/wkt-parser-1.3.2.tgz",
"integrity": "sha512-A26BOOo7sHAagyxG7iuRhnKMO7Q3mEOiOT4oGUmohtN/Li5wameeU4S6f8vWw6NADTVKljBs8bzA8JPQgSEMVQ=="
},
"node_modules/word-wrap": { "node_modules/word-wrap": {
"version": "1.2.3", "version": "1.2.3",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
@@ -23491,6 +23551,28 @@
"integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==",
"dev": true "dev": true
}, },
"@turf/boolean-point-in-polygon": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/@turf/boolean-point-in-polygon/-/boolean-point-in-polygon-6.5.0.tgz",
"integrity": "sha512-DtSuVFB26SI+hj0SjrvXowGTUCHlgevPAIsukssW6BG5MlNSBQAo70wpICBNJL6RjukXg8d2eXaAWuD/CqL00A==",
"requires": {
"@turf/helpers": "^6.5.0",
"@turf/invariant": "^6.5.0"
}
},
"@turf/helpers": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz",
"integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw=="
},
"@turf/invariant": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz",
"integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==",
"requires": {
"@turf/helpers": "^6.5.0"
}
},
"@types/aria-query": { "@types/aria-query": {
"version": "4.2.2", "version": "4.2.2",
"resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz",
@@ -26622,6 +26704,15 @@
"integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==",
"dev": true "dev": true
}, },
"dotted-map": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/dotted-map/-/dotted-map-2.2.3.tgz",
"integrity": "sha512-8hyOOHHLLVCcCisM3yb9hqp+3bJ7TSMcr1SfrUw8Wxp5UMqih35jIvUyagweCooJbz/EH1nC9GGuPysh7+YlAg==",
"requires": {
"@turf/boolean-point-in-polygon": "^6.0.1",
"proj4": "^2.6.1"
}
},
"duplexer": { "duplexer": {
"version": "0.1.2", "version": "0.1.2",
"resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
@@ -30564,6 +30655,11 @@
"integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
"dev": true "dev": true
}, },
"mgrs": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/mgrs/-/mgrs-1.0.0.tgz",
"integrity": "sha512-awNbTOqCxK1DBGjalK3xqWIstBZgN6fxsMSiXLs9/spqWkF2pAhb2rrYCFSsr1/tT7PhcDGjZndG8SWYn0byYA=="
},
"micromatch": { "micromatch": {
"version": "4.0.4", "version": "4.0.4",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
@@ -32170,6 +32266,15 @@
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
}, },
"proj4": {
"version": "2.8.0",
"resolved": "https://registry.npmjs.org/proj4/-/proj4-2.8.0.tgz",
"integrity": "sha512-baC+YcD4xsSqJ+CpCZljj2gcQDhlKb+J+Zjv/2KSBwWNjk4M0pafgQsE+mWurd84tflMIsP+7j7mtIpFDHzQfQ==",
"requires": {
"mgrs": "1.0.0",
"wkt-parser": "^1.3.1"
}
},
"promise": { "promise": {
"version": "8.1.0", "version": "8.1.0",
"resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz",
@@ -34945,6 +35050,11 @@
"integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==",
"dev": true "dev": true
}, },
"wkt-parser": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/wkt-parser/-/wkt-parser-1.3.2.tgz",
"integrity": "sha512-A26BOOo7sHAagyxG7iuRhnKMO7Q3mEOiOT4oGUmohtN/Li5wameeU4S6f8vWw6NADTVKljBs8bzA8JPQgSEMVQ=="
},
"word-wrap": { "word-wrap": {
"version": "1.2.3", "version": "1.2.3",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+3 -1
View File
@@ -40,6 +40,7 @@
"buffer": "^6.0.3", "buffer": "^6.0.3",
"crypto": "npm:crypto-browserify", "crypto": "npm:crypto-browserify",
"crypto-browserify": "^3.12.0", "crypto-browserify": "^3.12.0",
"dotted-map": "^2.2.3",
"ethers": "^5.6.4", "ethers": "^5.6.4",
"file-saver": "^2.0.5", "file-saver": "^2.0.5",
"formik": "2.2.9", "formik": "2.2.9",
@@ -132,7 +133,8 @@
"depcheck": "depcheck .", "depcheck": "depcheck .",
"lint": "eslint --fix \"src/**/*.ts\" \"src/**/*.tsx\" && prettier --write \"src/**/*.ts\" \"src/**/*.tsx\"", "lint": "eslint --fix \"src/**/*.ts\" \"src/**/*.tsx\" && prettier --write \"src/**/*.ts\" \"src/**/*.tsx\"",
"lint:check": "eslint \"src/**/*.ts\" \"src/**/*.tsx\" && prettier --check \"src/**/*.ts\" \"src/**/*.tsx\"", "lint:check": "eslint \"src/**/*.ts\" \"src/**/*.tsx\" && prettier --check \"src/**/*.ts\" \"src/**/*.tsx\"",
"check:types": "tsc --project tsconfig.lib.json" "check:types": "tsc --project tsconfig.lib.json",
"update-map-data": "node ./utils/update-map-data.js"
}, },
"files": [ "files": [
"lib", "lib",
+1
View File
@@ -0,0 +1 @@
"{\"points\":{\"6;0\":{\"x\":6.5,\"y\":0},\"16;0\":{\"x\":16.5,\"y\":0},\"18;0\":{\"x\":18.5,\"y\":0},\"19;0\":{\"x\":19.5,\"y\":0},\"20;0\":{\"x\":20.5,\"y\":0},\"21;0\":{\"x\":21.5,\"y\":0},\"24;0\":{\"x\":24.5,\"y\":0},\"26;0\":{\"x\":26.5,\"y\":0},\"27;0\":{\"x\":27.5,\"y\":0},\"28;0\":{\"x\":28.5,\"y\":0},\"29;0\":{\"x\":29.5,\"y\":0},\"30;0\":{\"x\":30.5,\"y\":0},\"31;0\":{\"x\":31.5,\"y\":0},\"37;0\":{\"x\":37.5,\"y\":0},\"38;0\":{\"x\":38.5,\"y\":0},\"39;0\":{\"x\":39.5,\"y\":0},\"40;0\":{\"x\":40.5,\"y\":0},\"41;0\":{\"x\":41.5,\"y\":0},\"42;0\":{\"x\":42.5,\"y\":0},\"43;0\":{\"x\":43.5,\"y\":0},\"44;0\":{\"x\":44.5,\"y\":0},\"45;0\":{\"x\":45.5,\"y\":0},\"60;0\":{\"x\":60.5,\"y\":0},\"68;0\":{\"x\":68.5,\"y\":0},\"72;0\":{\"x\":72.5,\"y\":0},\"73;0\":{\"x\":73.5,\"y\":0},\"74;0\":{\"x\":74.5,\"y\":0},\"75;0\":{\"x\":75.5,\"y\":0},\"76;0\":{\"x\":76.5,\"y\":0},\"77;0\":{\"x\":77.5,\"y\":0},\"78;0\":{\"x\":78.5,\"y\":0},\"79;0\":{\"x\":79.5,\"y\":0},\"80;0\":{\"x\":80.5,\"y\":0},\"81;0\":{\"x\":81.5,\"y\":0},\"82;0\":{\"x\":82.5,\"y\":0},\"83;0\":{\"x\":83.5,\"y\":0},\"84;0\":{\"x\":84.5,\"y\":0},\"85;0\":{\"x\":85.5,\"y\":0},\"86;0\":{\"x\":86.5,\"y\":0},\"87;0\":{\"x\":87.5,\"y\":0},\"88;0\":{\"x\":88.5,\"y\":0},\"89;0\":{\"x\":89.5,\"y\":0},\"90;0\":{\"x\":90.5,\"y\":0},\"91;0\":{\"x\":91.5,\"y\":0},\"92;0\":{\"x\":92.5,\"y\":0},\"93;0\":{\"x\":93.5,\"y\":0},\"94;0\":{\"x\":94.5,\"y\":0},\"95;0\":{\"x\":95.5,\"y\":0},\"96;0\":{\"x\":96.5,\"y\":0},\"98;0\":{\"x\":98.5,\"y\":0},\"5;1\":{\"x\":5,\"y\":0.8660254037844386},\"6;1\":{\"x\":6,\"y\":0.8660254037844386},\"7;1\":{\"x\":7,\"y\":0.8660254037844386},\"8;1\":{\"x\":8,\"y\":0.8660254037844386},\"9;1\":{\"x\":9,\"y\":0.8660254037844386},\"15;1\":{\"x\":15,\"y\":0.8660254037844386},\"16;1\":{\"x\":16,\"y\":0.8660254037844386},\"19;1\":{\"x\":19,\"y\":0.8660254037844386},\"20;1\":{\"x\":20,\"y\":0.8660254037844386},\"21;1\":{\"x\":21,\"y\":0.8660254037844386},\"22;1\":{\"x\":22,\"y\":0.8660254037844386},\"25;1\":{\"x\":25,\"y\":0.8660254037844386},\"28;1\":{\"x\":28,\"y\":0.8660254037844386},\"29;1\":{\"x\":29,\"y\":0.8660254037844386},\"30;1\":{\"x\":30,\"y\":0.8660254037844386},\"31;1\":{\"x\":31,\"y\":0.8660254037844386},\"32;1\":{\"x\":32,\"y\":0.8660254037844386},\"37;1\":{\"x\":37,\"y\":0.8660254037844386},\"38;1\":{\"x\":38,\"y\":0.8660254037844386},\"39;1\":{\"x\":39,\"y\":0.8660254037844386},\"40;1\":{\"x\":40,\"y\":0.8660254037844386},\"41;1\":{\"x\":41,\"y\":0.8660254037844386},\"42;1\":{\"x\":42,\"y\":0.8660254037844386},\"43;1\":{\"x\":43,\"y\":0.8660254037844386},\"44;1\":{\"x\":44,\"y\":0.8660254037844386},\"45;1\":{\"x\":45,\"y\":0.8660254037844386},\"59;1\":{\"x\":59,\"y\":0.8660254037844386},\"60;1\":{\"x\":60,\"y\":0.8660254037844386},\"61;1\":{\"x\":61,\"y\":0.8660254037844386},\"73;1\":{\"x\":73,\"y\":0.8660254037844386},\"75;1\":{\"x\":75,\"y\":0.8660254037844386},\"76;1\":{\"x\":76,\"y\":0.8660254037844386},\"77;1\":{\"x\":77,\"y\":0.8660254037844386},\"78;1\":{\"x\":78,\"y\":0.8660254037844386},\"79;1\":{\"x\":79,\"y\":0.8660254037844386},\"80;1\":{\"x\":80,\"y\":0.8660254037844386},\"81;1\":{\"x\":81,\"y\":0.8660254037844386},\"82;1\":{\"x\":82,\"y\":0.8660254037844386},\"83;1\":{\"x\":83,\"y\":0.8660254037844386},\"84;1\":{\"x\":84,\"y\":0.8660254037844386},\"85;1\":{\"x\":85,\"y\":0.8660254037844386},\"86;1\":{\"x\":86,\"y\":0.8660254037844386},\"87;1\":{\"x\":87,\"y\":0.8660254037844386},\"88;1\":{\"x\":88,\"y\":0.8660254037844386},\"89;1\":{\"x\":89,\"y\":0.8660254037844386},\"90;1\":{\"x\":90,\"y\":0.8660254037844386},\"91;1\":{\"x\":91,\"y\":0.8660254037844386},\"92;1\":{\"x\":92,\"y\":0.8660254037844386},\"93;1\":{\"x\":93,\"y\":0.8660254037844386},\"94;1\":{\"x\":94,\"y\":0.8660254037844386},\"95;1\":{\"x\":95,\"y\":0.8660254037844386},\"96;1\":{\"x\":96,\"y\":0.8660254037844386},\"97;1\":{\"x\":97,\"y\":0.8660254037844386},\"98;1\":{\"x\":98,\"y\":0.8660254037844386},\"99;1\":{\"x\":99,\"y\":0.8660254037844386},\"4;2\":{\"x\":4.5,\"y\":1.7320508075688772},\"5;2\":{\"x\":5.5,\"y\":1.7320508075688772},\"6;2\":{\"x\":6.5,\"y\":1.7320508075688772},\"7;2\":{\"x\":7.5,\"y\":1.7320508075688772},\"8;2\":{\"x\":8.5,\"y\":1.7320508075688772},\"9;2\":{\"x\":9.5,\"y\":1.7320508075688772},\"10;2\":{\"x\":10.5,\"y\":1.7320508075688772},\"11;2\":{\"x\":11.5,\"y\":1.7320508075688772},\"13;2\":{\"x\":13.5,\"y\":1.7320508075688772},\"14;2\":{\"x\":14.5,\"y\":1.7320508075688772},\"15;2\":{\"x\":15.5,\"y\":1.7320508075688772},\"16;2\":{\"x\":16.5,\"y\":1.7320508075688772},\"17;2\":{\"x\":17.5,\"y\":1.7320508075688772},\"19;2\":{\"x\":19.5,\"y\":1.7320508075688772},\"20;2\":{\"x\":20.5,\"y\":1.7320508075688772},\"22;2\":{\"x\":22.5,\"y\":1.7320508075688772},\"25;2\":{\"x\":25.5,\"y\":1.7320508075688772},\"27;2\":{\"x\":27.5,\"y\":1.7320508075688772},\"28;2\":{\"x\":28.5,\"y\":1.7320508075688772},\"30;2\":{\"x\":30.5,\"y\":1.7320508075688772},\"31;2\":{\"x\":31.5,\"y\":1.7320508075688772},\"32;2\":{\"x\":32.5,\"y\":1.7320508075688772},Line truncated
File diff suppressed because it is too large. Load diff
+79 -2
View File
@@ -1,9 +1,86 @@
import { ReactElement, CSSProperties } from 'react' import { ReactElement, CSSProperties, useContext, useState, useEffect } from 'react'
import type { Peer } from '@ethersphere/bee-js'
import DottedMap, { DottedMapWithoutCountriesLib } from 'dotted-map/without-countries'
import nodesDb from '../assets/data/nodes-db.json'
import { Context } from '../providers/Bee'
import mapData from '../assets/data/map-data.json'
interface Props { interface Props {
style?: CSSProperties style?: CSSProperties
} }
interface MapRecord {
lat: number
lng: number
}
type MapDB = Record<string, MapRecord>
const fullMapDb = nodesDb as unknown as MapDB
const deduplicatedRecords = deduplicate(fullMapDb)
function deduplicate(db: MapDB): MapRecord[] {
const noDuplicates: Record<string, MapRecord> = {}
Object.entries(fullMapDb).forEach(([key, record]) => {
noDuplicates[`${record.lat} ${record.lng}`] = record
})
return Object.values(noDuplicates)
}
function findIntersection(db: MapDB, peers: Peer[]): MapRecord[] {
const noDuplicates: Record<string, MapRecord> = {}
peers.forEach(({ address }) => {
const record = db[address]
if (record) noDuplicates[`${record.lat} ${record.lng}`] = record
})
return Object.values(noDuplicates)
}
function addPins(map: DottedMap, pins: MapRecord[], color: string) {
pins.forEach(({ lat, lng }) => {
map.addPin({ lat, lng, svgOptions: { color } })
})
}
const mapPrecomputed = new DottedMap({ map: JSON.parse(mapData) })
addPins(mapPrecomputed, deduplicatedRecords, '#dd7200')
const mapSvgOptions: DottedMapWithoutCountriesLib.SvgSettings = { shape: 'hexagon', radius: 0.21, color: '#dadada' }
export default function Card({ style }: Props): ReactElement { export default function Card({ style }: Props): ReactElement {
return <div style={Object.assign({}, style, { width: '100%', height: '380px', backgroundColor: '#f3f3f3' })}></div> const { peers } = useContext(Context)
const [map, setMap] = useState<string>(mapPrecomputed.getSVG(mapSvgOptions))
useEffect(() => {
if (!peers) return
const points = findIntersection(fullMapDb, peers)
const mapNew = Object.create(mapPrecomputed)
addPins(mapNew, points, '#67BE68')
setMap(mapNew.getSVG(mapSvgOptions))
}, [peers])
return (
<div
style={Object.assign({}, style, {
width: '100%',
height: '380px',
backgroundColor: '#f3f3f3',
overflow: 'hidden',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
})}
>
<img
alt="world map"
src={`data:image/svg+xml;utf8,${encodeURIComponent(map)}`}
style={{ maxWidth: '100%', maxHeight: '100%', objectFit: 'contain' }}
/>
</div>
)
} }
+54
View File
@@ -0,0 +1,54 @@
#!/usr/bin/env node
const axios = require('axios')
const fs = require('fs')
const getMapJSON = require('dotted-map').getMapJSON
const DATA_SOURCE = 'https://swarmscan-api.resenje.org/v1/network/dump'
const DATA_DESTINATION = './src/assets/data/nodes-db.json'
const MAP_HEIGHT = 50
const MAP_DESTINATION = './src/assets/data/map-data.json'
async function getData(url) {
const res = await axios.get(url)
return res.data
}
function processData(data) {
const db = new Map()
data.nodes.forEach(node => {
db.set(node.overlay, { lat: node.location.latitude, lng: node.location.longitude })
})
return Object.fromEntries([...db.entries()].sort())
}
function saveFile(db, path) {
return fs.writeFileSync(path, JSON.stringify(db, null, 2))
}
function preComputeMap() {
return getMapJSON({ height: MAP_HEIGHT, grid: 'diagonal' })
}
async function main() {
console.log('Fetching DB data')
const dataDump = await getData(DATA_SOURCE)
console.log('Processing DB data')
const db = processData(dataDump)
console.log('Saving DB data')
saveFile(db, DATA_DESTINATION)
console.log('Pre-computing the word map')
const map = preComputeMap()
console.log('Saving map data')
saveFile(map, MAP_DESTINATION)
console.log('Done')
}
main()