Skip to content

Commit d33f226

Browse files
committed
upd
1 parent 05bffd9 commit d33f226

File tree

20 files changed

+744
-269
lines changed

20 files changed

+744
-269
lines changed

discoverer/.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
node_modules
2+
package-lock.json
3+
dist

discoverer/package.json

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
{
2+
"name": "app_name",
3+
"title": "App name",
4+
"descr": "App description",
5+
"theme_color": "#478be6",
6+
"background_color": "#1C2128",
7+
"version": "1.0.0",
8+
"main": "index.js",
9+
"scripts": {
10+
"build": "webpack --config ./webpack.single.config.js & webpack --config ./webpack.host.config.js",
11+
"dev": "webpack serve --config ./webpack.dev.config.js & webpack --config ./webpack.dev.config.js"
12+
},
13+
"keywords": [],
14+
"author": "",
15+
"license": "ISC",
16+
"description": "",
17+
"devDependencies": {
18+
"copy-webpack-plugin": "^12.0.2",
19+
"css-loader": "^7.1.2",
20+
"css-minimizer-webpack-plugin": "^7.0.0",
21+
"cyrillic-to-translit-js": "^3.2.1",
22+
"html-inline-css-webpack-plugin": "^1.11.2",
23+
"html-inline-script-webpack-plugin": "^3.2.1",
24+
"html-webpack-plugin": "^5.6.0",
25+
"mini-css-extract-plugin": "^2.9.0",
26+
"replace-hash-in-file-webpack-plugin": "^1.0.8",
27+
"style-loader": "^4.0.0",
28+
"webpack": "^5.93.0",
29+
"webpack-cli": "^5.1.4",
30+
"webpack-dev-server": "^5.0.4"
31+
},
32+
"dependencies": {
33+
"@alexgyver/component": "^1.0.26"
34+
}
35+
}

discoverer/src/assets/favicon.svg

Lines changed: 23 additions & 0 deletions
Loading

discoverer/src/assets/icon.png

3.85 KB
Loading
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"theme_color": "@theme_color",
3+
"background_color": "@background_color",
4+
"display": "standalone",
5+
"start_url": ".",
6+
"name": "@name",
7+
"short_name": "@name",
8+
"description": "@descr",
9+
"orientation": "portrait",
10+
"icons": [
11+
{
12+
"src": "icon.png",
13+
"sizes": "512x512",
14+
"type": "image/png",
15+
"purpose": "any maskable"
16+
}
17+
]
18+
}

discoverer/src/assets/sw.js

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
const CACHE_NAME = 'cache_@cachename';
2+
3+
const CACHED_URLS = [
4+
'/',
5+
'favicon.svg',
6+
'index.html',
7+
'script.js',
8+
'style.css',
9+
]
10+
11+
self.addEventListener('install', event => {
12+
event.waitUntil(async function () {
13+
const cache = await caches.open(CACHE_NAME);
14+
await cache.addAll(CACHED_URLS);
15+
}());
16+
});
17+
18+
self.addEventListener('fetch', event => {
19+
const { request } = event;
20+
//if (!request.destination.length) return;
21+
if (!request.url.startsWith(self.location.href)) return;
22+
if (request.cache === 'only-if-cached' && request.mode !== 'same-origin') return;
23+
24+
event.respondWith(async function () {
25+
const cache = await caches.open(CACHE_NAME);
26+
const cachedResponsePromise = await cache.match(request);
27+
const networkResponsePromise = fetch(request);
28+
if (request.url.startsWith(self.location.origin)) {
29+
event.waitUntil(async function () {
30+
const networkResponse = await networkResponsePromise;
31+
await cache.put(request, networkResponse.clone());
32+
}());
33+
}
34+
return cachedResponsePromise || networkResponsePromise;
35+
}());
36+
});
37+
38+
self.addEventListener('activate', event => {
39+
event.waitUntil(async function () {
40+
const cacheNames = await caches.keys()
41+
await Promise.all(
42+
cacheNames.filter((cacheName) => {
43+
const deleteThisCache = cacheName !== CACHE_NAME;
44+
return deleteThisCache;
45+
}).map(cacheName => caches.delete(cacheName))
46+
)
47+
}());
48+
});

discoverer/src/index.css

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
html,
2+
body {
3+
width: 100%;
4+
height: 100%;
5+
padding: 0;
6+
margin: 0;
7+
}

discoverer/src/index.html

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
4+
<head>
5+
<meta charset="UTF-8">
6+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
7+
<title><%= htmlWebpackPlugin.options.title %> v<%= htmlWebpackPlugin.options.version %></title>
8+
<%= htmlWebpackPlugin.options.manifest %>
9+
</head>
10+
11+
<body></body>
12+
13+
</html>

discoverer/src/index.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import './index.css'
2+
import { getIPs, getLocalIP, getMaskList } from './script/network';
3+
4+
document.addEventListener("DOMContentLoaded", async () => {
5+
let ip = await getLocalIP();
6+
console.log(ip);
7+
console.log(getMaskList());
8+
console.log(getIPs(ip, 24));
9+
10+
const ips = getIPs(ip, 24);
11+
const delay = 100;
12+
for (let ip in ips) {
13+
discover(ips[ip], delay * ip).then(res => {
14+
if (res) console.log(res, ips[ip]);
15+
});
16+
}
17+
});
18+
19+
function discover(ip, delay, timeout = 2000) {
20+
return new Promise((resolve) => {
21+
setTimeout(async () => {
22+
try {
23+
let res = await fetch(`http://${ip}/settings?action=discover`, { signal: AbortSignal.timeout(timeout) });
24+
if (res && res.ok) {
25+
res = await res.json();
26+
resolve(res);
27+
}
28+
} catch { }
29+
resolve(null);
30+
}, delay);
31+
});
32+
}

discoverer/src/script/network.js

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
export function getLocalIP() {
2+
return new Promise(res => {
3+
const RTCPeerConnection = window.RTCPeerConnection || window.webkitRTCPeerConnection || window.mozRTCPeerConnection;
4+
if (!RTCPeerConnection) res(null);
5+
6+
const rtc = new RTCPeerConnection({ iceServers: [] });
7+
rtc.createDataChannel('', { reliable: false });
8+
9+
rtc.addEventListener("icecandidate", evt => {
10+
if (evt.candidate && evt.candidate.address) {
11+
if (evt.candidate.address.endsWith('.local')) {
12+
alert(`Disable WEB RTC anonymizer: ${browser()}:/` + `/flags/#enable-webrtc-hide-local-ips-with-mdns`);
13+
} else {
14+
res(evt.candidate.address);
15+
}
16+
}
17+
res(null);
18+
});
19+
20+
rtc.createOffer().then(offerDesc => rtc.setLocalDescription(offerDesc));
21+
});
22+
}
23+
24+
export function getIPs(ip, netmask = 24) {
25+
let ip_a = ip.split('.');
26+
let sum_ip = (ip_a[0] << 24) | (ip_a[1] << 16) | (ip_a[2] << 8) | ip_a[3];
27+
let cidr = Number(netmask);
28+
let mask = ~(0xffffffff >>> cidr);
29+
let network = 0, broadcast = 0, start_ip = 0, end_ip = 0;
30+
if (cidr === 32) {
31+
network = sum_ip;
32+
broadcast = network;
33+
start_ip = network;
34+
end_ip = network;
35+
} else {
36+
network = sum_ip & mask;
37+
broadcast = network + (~mask);
38+
if (cidr === 31) {
39+
start_ip = network;
40+
end_ip = broadcast;
41+
} else {
42+
start_ip = network + 1;
43+
end_ip = broadcast - 1;
44+
}
45+
}
46+
let ips = ['192.168.4.1']; // esp
47+
for (let ip = start_ip; ip <= end_ip; ip++) {
48+
ips.push(`${(ip >>> 24) & 0xff}.${(ip >>> 16) & 0xff}.${(ip >>> 8) & 0xff}.${ip & 0xff}`);
49+
}
50+
return ips;
51+
}
52+
53+
export function getMaskList() {
54+
const list = [];
55+
for (let i = 0; i < 33; i++) {
56+
let imask;
57+
if (i == 32) imask = 0xffffffff;
58+
else imask = ~(0xffffffff >>> i);
59+
list.push(`${(imask >>> 24) & 0xff}.${(imask >>> 16) & 0xff}.${(imask >>> 8) & 0xff}.${imask & 0xff}`);
60+
}
61+
return list;
62+
}
63+
64+
export function browser() {
65+
if (navigator.userAgent.includes("Opera") || navigator.userAgent.includes('OPR')) return 'opera';
66+
else if (navigator.userAgent.includes("Edg")) return 'edge';
67+
else if (navigator.userAgent.includes("Chrome")) return 'chrome';
68+
else if (navigator.userAgent.includes("Safari")) return 'safari';
69+
else if (navigator.userAgent.includes("Firefox")) return 'firefox';
70+
else if ((navigator.userAgent.includes("MSIE")) || (!!document.documentMode == true)) return 'IE';
71+
else return 'unknown';
72+
}

0 commit comments

Comments
 (0)