-
-
Notifications
You must be signed in to change notification settings - Fork 28
/
Copy pathbrowser.js
73 lines (57 loc) · 1.5 KB
/
browser.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/* eslint-env browser */
import {pEvent} from 'p-event';
import {isIPv4, isIPv6} from 'is-ip';
async function tryGetIp() {
try {
const peerConnection = new RTCPeerConnection({iceServers: []});
peerConnection.createDataChannel('');
const offer = await peerConnection.createOffer();
await peerConnection.setLocalDescription(offer);
const {candidate} = await pEvent(peerConnection, 'icecandidate', {
timeout: 10_000,
});
peerConnection.close();
if (!candidate?.candidate) {
return;
}
const result = candidate.candidate.split(' ')[4];
if (!result.endsWith('.local')) {
return result;
}
} catch {}
}
async function getIp() {
const ip = await tryGetIp();
if (ip) {
return ip;
}
const inputDevices = await navigator.mediaDevices.enumerateDevices();
const inputDeviceTypes = new Set(inputDevices.map(({kind}) => kind));
const constraints = {};
if (inputDeviceTypes.has('audioinput')) {
constraints.audio = true;
} else if (inputDeviceTypes.has('videoinput')) {
constraints.video = true;
} else {
return;
}
const mediaStream = await navigator.mediaDevices.getUserMedia(constraints);
for (const track of mediaStream.getTracks()) {
track.stop();
}
return tryGetIp();
}
export async function internalIpV6() {
const result = await getIp();
if (isIPv6(result)) {
return result;
}
}
export async function internalIpV4() {
const result = await getIp();
if (isIPv4(result)) {
return result;
}
}
export function internalIpV6Sync() {}
export function internalIpV4Sync() {}