@bobfrankston/miscassists 1.0.7 → 1.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/checkaddress.js +137 -0
- package/checkaddress.js.map +1 -0
- package/checkaddress.ts +158 -0
- package/dnsassist.js +5 -2
- package/dnsassist.js.map +1 -1
- package/dnsassist.ts +5 -2
- package/package.json +1 -1
- package/ports.js +4 -0
- package/ports.js.map +1 -1
- package/ports.ts +4 -0
package/checkaddress.js
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
// From y:\dev\homecontrol\Others\LifX\Apps\lzlan\lants-address.ts
|
|
2
|
+
// import { isIPv6 } from 'net';
|
|
3
|
+
import os, { networkInterfaces } from 'os';
|
|
4
|
+
// Quck hack - using namespace to hid this until we debug and integrate it for v6 support
|
|
5
|
+
var hidden;
|
|
6
|
+
(function (hidden) {
|
|
7
|
+
const NetworkInterfaces = []; // Need to fix this signature
|
|
8
|
+
function assureNetworkInterfaces() {
|
|
9
|
+
// Note we don't detect changes to the interfaces
|
|
10
|
+
if (networkInterfaces.length > 0)
|
|
11
|
+
return;
|
|
12
|
+
const netifs = os.networkInterfaces();
|
|
13
|
+
for (const dev in netifs) {
|
|
14
|
+
netifs[dev].forEach((info) => {
|
|
15
|
+
let family = info.family;
|
|
16
|
+
if (typeof family == "number")
|
|
17
|
+
family = `IPv${family}`; // Strange change work-around
|
|
18
|
+
if (family !== 'IPv4' || info.internal === true) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
// let info4 = info as os.NetworkInterfaceInfoIPv4;
|
|
22
|
+
// (<any>info)['broadcast'] = _getBroadcastAddress(info4);
|
|
23
|
+
const mask = ipToUnsignedInt(info.netmask);
|
|
24
|
+
const address = ipToUnsignedInt(info.address) & mask;
|
|
25
|
+
const ni = { ...info, ints: { mask, address } };
|
|
26
|
+
NetworkInterfaces.push(ni);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
return NetworkInterfaces;
|
|
30
|
+
}
|
|
31
|
+
hidden.assureNetworkInterfaces = assureNetworkInterfaces;
|
|
32
|
+
;
|
|
33
|
+
function isLocalIp4Address(ip4Address) {
|
|
34
|
+
if (ip4Address == '127.0.0.1')
|
|
35
|
+
return true;
|
|
36
|
+
const ipa = ipToUnsignedInt(ip4Address);
|
|
37
|
+
assureNetworkInterfaces();
|
|
38
|
+
return NetworkInterfaces.some((ni) => (ni.ints.address & ni.ints.mask) === (ipa & ni.ints.mask));
|
|
39
|
+
}
|
|
40
|
+
hidden.isLocalIp4Address = isLocalIp4Address;
|
|
41
|
+
function ipToUnsignedInt(ipAddress) {
|
|
42
|
+
const parts = ipAddress.split('.');
|
|
43
|
+
if (parts.length !== 4) {
|
|
44
|
+
throw new Error('Invalid IP address format');
|
|
45
|
+
}
|
|
46
|
+
const num = parts.map((part) => parseInt(part, 10));
|
|
47
|
+
if (num.some((part) => isNaN(part) || part < 0 || part > 255)) {
|
|
48
|
+
throw new Error(`Invalid IP address ${ipAddress}`);
|
|
49
|
+
}
|
|
50
|
+
const signed = (num[0] << 24) + (num[1] << 16) + (num[2] << 8) + num[3];
|
|
51
|
+
const unsigned = signed >>> 0;
|
|
52
|
+
return unsigned;
|
|
53
|
+
}
|
|
54
|
+
let pretendRemote = false;
|
|
55
|
+
function isLocalIpAddress(ipAddress) {
|
|
56
|
+
// '::ffff:172.20.3.39'
|
|
57
|
+
if (pretendRemote)
|
|
58
|
+
return false;
|
|
59
|
+
ipAddress = ipAddress.toLowerCase(); // Safety
|
|
60
|
+
if (ipAddress.startsWith('fe80:'))
|
|
61
|
+
return true; // Link local
|
|
62
|
+
if (ipAddress == "::1")
|
|
63
|
+
return true;
|
|
64
|
+
ipAddress = ipAddress.replace(/^::ffff:/, ''); // If it's like V5
|
|
65
|
+
if (/^[0-9.]+$/.test(ipAddress))
|
|
66
|
+
return isLocalIp4Address(ipAddress);
|
|
67
|
+
return isIPv6LocalAddress(ipAddress);
|
|
68
|
+
// const localIps = getLocalAddresses();
|
|
69
|
+
// for (const localIp of localIps) {
|
|
70
|
+
// const range = new AddressInfo(localIp);
|
|
71
|
+
// if (range.family === 'IPv4' && net.isIPv4(ipAddress)) {
|
|
72
|
+
// if (range.address === ipAddress) {
|
|
73
|
+
// return true;
|
|
74
|
+
// }
|
|
75
|
+
// } else if (range.family === 'IPv6' && net.isIPv6(ipAddress)) {
|
|
76
|
+
// if (range.address === ipAddress) {
|
|
77
|
+
// return true;
|
|
78
|
+
// }
|
|
79
|
+
// }
|
|
80
|
+
// }
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
hidden.isLocalIpAddress = isLocalIpAddress;
|
|
84
|
+
// function isIPv6LocalAddress(ipv6Address: string): boolean {
|
|
85
|
+
// const interfaces = networkInterfaces();
|
|
86
|
+
// for (const interfaceName of Object.keys(interfaces)) {
|
|
87
|
+
// const addresses = interfaces[interfaceName].filter(
|
|
88
|
+
// (iface) => iface.family === 'IPv6'
|
|
89
|
+
// );
|
|
90
|
+
// for (const iface of addresses) {
|
|
91
|
+
// if (iface.address === ipv6Address) {
|
|
92
|
+
// return true;
|
|
93
|
+
// }
|
|
94
|
+
// }
|
|
95
|
+
// }
|
|
96
|
+
// return false;
|
|
97
|
+
// }
|
|
98
|
+
function isIPv6LocalAddress(ipv6Address) {
|
|
99
|
+
const interfaces = networkInterfaces();
|
|
100
|
+
for (const interfaceName of Object.keys(interfaces)) {
|
|
101
|
+
const addresses = interfaces[interfaceName].filter((iface) => iface.family === 'IPv6');
|
|
102
|
+
for (const iface of addresses) {
|
|
103
|
+
if (iface.cidr) {
|
|
104
|
+
const [ifaceAddress, networkMask] = iface.cidr.split('/');
|
|
105
|
+
if (isSameNetwork(ipv6Address, networkMask, ifaceAddress)) {
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
function isSameNetwork(ipv6Address, networkMaskLength, ifaceAddress) {
|
|
114
|
+
const maskLength = parseInt(networkMaskLength, 10);
|
|
115
|
+
const bufferLength = Math.ceil(maskLength / 8);
|
|
116
|
+
const addressBuffer = Buffer.from(ipv6Address.split(':').map((part) => parseInt(part, 16)));
|
|
117
|
+
const ifaceBuffer = Buffer.from(ifaceAddress.split(':').map((part) => parseInt(part, 16)));
|
|
118
|
+
for (let i = 0; i < bufferLength; i++) {
|
|
119
|
+
const maskBits = Math.min(maskLength - i * 8, 8);
|
|
120
|
+
const mask = (0xff00 >> maskBits) & 0xff;
|
|
121
|
+
if ((addressBuffer[i] & mask) !== ifaceBuffer[i]) {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
// Example usage
|
|
128
|
+
// const ipv6AddressToCheck = 'fdb7:3df3:9615:193e:3743:1a24:69e8:127a';
|
|
129
|
+
// const isLocalAddress = isIPv6LocalAddress(ipv6AddressToCheck);
|
|
130
|
+
// console.log(`Is IPv6 Address ${ipv6AddressToCheck} on the same local network? ${isLocalAddress}`);
|
|
131
|
+
// // Example usage
|
|
132
|
+
// const ipv6AddressToCheck = 'fdb7:3df3:9615:193e:3743:1a24:69e8:127a';
|
|
133
|
+
// const networkMask = 'ffff:ffff:ffff:ffff::'; // Replace with the actual subnet mask
|
|
134
|
+
// const isLocalAddress = isIPv6LocalAddress(ipv6AddressToCheck, networkMask);
|
|
135
|
+
// console.log(`Is IPv6 Address ${ipv6AddressToCheck} on the same local network? ${isLocalAddress}`);
|
|
136
|
+
})(hidden || (hidden = {}));
|
|
137
|
+
//# sourceMappingURL=checkaddress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkaddress.js","sourceRoot":"","sources":["checkaddress.ts"],"names":[],"mappings":"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"}
|
package/checkaddress.ts
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
// From y:\dev\homecontrol\Others\LifX\Apps\lzlan\lants-address.ts
|
|
2
|
+
|
|
3
|
+
// import { isIPv6 } from 'net';
|
|
4
|
+
import os, { networkInterfaces } from 'os';
|
|
5
|
+
|
|
6
|
+
// Quck hack - using namespace to hid this until we debug and integrate it for v6 support
|
|
7
|
+
namespace hidden {
|
|
8
|
+
type netinfo = os.NetworkInterfaceInfo & { ints: { address: number, mask: number } }
|
|
9
|
+
|
|
10
|
+
const NetworkInterfaces: netinfo[] = []; // Need to fix this signature
|
|
11
|
+
|
|
12
|
+
export function assureNetworkInterfaces() {
|
|
13
|
+
// Note we don't detect changes to the interfaces
|
|
14
|
+
if (networkInterfaces.length > 0) return;
|
|
15
|
+
|
|
16
|
+
const netifs = os.networkInterfaces();
|
|
17
|
+
for (const dev in netifs) {
|
|
18
|
+
netifs[dev].forEach((info) => {
|
|
19
|
+
|
|
20
|
+
let family = info.family;
|
|
21
|
+
|
|
22
|
+
if (typeof family == "number")
|
|
23
|
+
family = `IPv${family}`; // Strange change work-around
|
|
24
|
+
|
|
25
|
+
if (family !== 'IPv4' || info.internal === true) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
// let info4 = info as os.NetworkInterfaceInfoIPv4;
|
|
29
|
+
// (<any>info)['broadcast'] = _getBroadcastAddress(info4);
|
|
30
|
+
|
|
31
|
+
const mask = ipToUnsignedInt(info.netmask);
|
|
32
|
+
const address = ipToUnsignedInt(info.address) & mask;
|
|
33
|
+
const ni = { ...info, ints: { mask, address } };
|
|
34
|
+
NetworkInterfaces.push(ni);
|
|
35
|
+
})
|
|
36
|
+
}
|
|
37
|
+
return NetworkInterfaces;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export function isLocalIp4Address(ip4Address: string) {
|
|
41
|
+
if (ip4Address == '127.0.0.1')
|
|
42
|
+
return true;
|
|
43
|
+
const ipa = ipToUnsignedInt(ip4Address);
|
|
44
|
+
assureNetworkInterfaces();
|
|
45
|
+
return NetworkInterfaces.some((ni) => (ni.ints.address & ni.ints.mask) === (ipa & ni.ints.mask));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function ipToUnsignedInt(ipAddress: string): number {
|
|
49
|
+
const parts = ipAddress.split('.');
|
|
50
|
+
if (parts.length !== 4) {
|
|
51
|
+
throw new Error('Invalid IP address format');
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const num = parts.map((part) => parseInt(part, 10));
|
|
55
|
+
if (num.some((part) => isNaN(part) || part < 0 || part > 255)) {
|
|
56
|
+
throw new Error(`Invalid IP address ${ipAddress}`);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const signed = (num[0] << 24) + (num[1] << 16) + (num[2] << 8) + num[3];
|
|
60
|
+
const unsigned = signed >>> 0;
|
|
61
|
+
return unsigned;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
let pretendRemote = false;
|
|
65
|
+
|
|
66
|
+
export function isLocalIpAddress(ipAddress: string) {
|
|
67
|
+
// '::ffff:172.20.3.39'
|
|
68
|
+
if (pretendRemote) return false;
|
|
69
|
+
ipAddress = ipAddress.toLowerCase(); // Safety
|
|
70
|
+
if (ipAddress.startsWith('fe80:'))
|
|
71
|
+
return true; // Link local
|
|
72
|
+
if (ipAddress == "::1")
|
|
73
|
+
return true;
|
|
74
|
+
ipAddress = ipAddress.replace(/^::ffff:/, ''); // If it's like V5
|
|
75
|
+
|
|
76
|
+
if (/^[0-9.]+$/.test(ipAddress))
|
|
77
|
+
return isLocalIp4Address(ipAddress)
|
|
78
|
+
return isIPv6LocalAddress(ipAddress);
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
// const localIps = getLocalAddresses();
|
|
82
|
+
|
|
83
|
+
// for (const localIp of localIps) {
|
|
84
|
+
// const range = new AddressInfo(localIp);
|
|
85
|
+
|
|
86
|
+
// if (range.family === 'IPv4' && net.isIPv4(ipAddress)) {
|
|
87
|
+
// if (range.address === ipAddress) {
|
|
88
|
+
// return true;
|
|
89
|
+
// }
|
|
90
|
+
// } else if (range.family === 'IPv6' && net.isIPv6(ipAddress)) {
|
|
91
|
+
// if (range.address === ipAddress) {
|
|
92
|
+
// return true;
|
|
93
|
+
// }
|
|
94
|
+
// }
|
|
95
|
+
// }
|
|
96
|
+
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// function isIPv6LocalAddress(ipv6Address: string): boolean {
|
|
101
|
+
// const interfaces = networkInterfaces();
|
|
102
|
+
// for (const interfaceName of Object.keys(interfaces)) {
|
|
103
|
+
// const addresses = interfaces[interfaceName].filter(
|
|
104
|
+
// (iface) => iface.family === 'IPv6'
|
|
105
|
+
// );
|
|
106
|
+
// for (const iface of addresses) {
|
|
107
|
+
// if (iface.address === ipv6Address) {
|
|
108
|
+
// return true;
|
|
109
|
+
// }
|
|
110
|
+
// }
|
|
111
|
+
// }
|
|
112
|
+
// return false;
|
|
113
|
+
// }
|
|
114
|
+
|
|
115
|
+
function isIPv6LocalAddress(ipv6Address: string): boolean {
|
|
116
|
+
const interfaces = networkInterfaces();
|
|
117
|
+
for (const interfaceName of Object.keys(interfaces)) {
|
|
118
|
+
const addresses = interfaces[interfaceName].filter((iface) => iface.family === 'IPv6');
|
|
119
|
+
for (const iface of addresses) {
|
|
120
|
+
if (iface.cidr) {
|
|
121
|
+
const [ifaceAddress, networkMask] = iface.cidr.split('/');
|
|
122
|
+
if (isSameNetwork(ipv6Address, networkMask, ifaceAddress)) {
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function isSameNetwork(ipv6Address: string, networkMaskLength: string, ifaceAddress: string): boolean {
|
|
132
|
+
const maskLength = parseInt(networkMaskLength, 10);
|
|
133
|
+
const bufferLength = Math.ceil(maskLength / 8);
|
|
134
|
+
const addressBuffer = Buffer.from(ipv6Address.split(':').map((part) => parseInt(part, 16)));
|
|
135
|
+
const ifaceBuffer = Buffer.from(ifaceAddress.split(':').map((part) => parseInt(part, 16)));
|
|
136
|
+
|
|
137
|
+
for (let i = 0; i < bufferLength; i++) {
|
|
138
|
+
const maskBits = Math.min(maskLength - i * 8, 8);
|
|
139
|
+
const mask = (0xff00 >> maskBits) & 0xff;
|
|
140
|
+
if ((addressBuffer[i] & mask) !== ifaceBuffer[i]) {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return true;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Example usage
|
|
148
|
+
// const ipv6AddressToCheck = 'fdb7:3df3:9615:193e:3743:1a24:69e8:127a';
|
|
149
|
+
// const isLocalAddress = isIPv6LocalAddress(ipv6AddressToCheck);
|
|
150
|
+
// console.log(`Is IPv6 Address ${ipv6AddressToCheck} on the same local network? ${isLocalAddress}`);
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
// // Example usage
|
|
154
|
+
// const ipv6AddressToCheck = 'fdb7:3df3:9615:193e:3743:1a24:69e8:127a';
|
|
155
|
+
// const networkMask = 'ffff:ffff:ffff:ffff::'; // Replace with the actual subnet mask
|
|
156
|
+
// const isLocalAddress = isIPv6LocalAddress(ipv6AddressToCheck, networkMask);
|
|
157
|
+
// console.log(`Is IPv6 Address ${ipv6AddressToCheck} on the same local network? ${isLocalAddress}`);
|
|
158
|
+
}
|
package/dnsassist.js
CHANGED
|
@@ -5,7 +5,7 @@ import os from 'os';
|
|
|
5
5
|
*/
|
|
6
6
|
export const default_fqdn = 'aaz.lt'; // For now
|
|
7
7
|
export async function resolve4(name, local) {
|
|
8
|
-
if (!name
|
|
8
|
+
if (!name?.includes('.'))
|
|
9
9
|
name += '.' + default_fqdn; // FQDN Hack
|
|
10
10
|
return new Promise((resolve, reject) => dns.resolve4(name, (err, ips) => {
|
|
11
11
|
if (err)
|
|
@@ -24,6 +24,7 @@ export async function resolveLocal4(name) {
|
|
|
24
24
|
;
|
|
25
25
|
export let localIPAndMasks = null;
|
|
26
26
|
function ipv4ToInt(ip) {
|
|
27
|
+
ip = ip.replace('::ffff:', ''); // Convert IPv4-mapped IPv6 addresses to their IPv4 representation
|
|
27
28
|
const octets = ip.split(".").map(o => parseInt(o));
|
|
28
29
|
// let z8 = octets.reduce((acc, octet) => (acc << 8) + octet);
|
|
29
30
|
let x8 = arrayToUint32(octets.reverse());
|
|
@@ -54,6 +55,8 @@ function assureLocalV4Address() {
|
|
|
54
55
|
return localIPAndMasks;
|
|
55
56
|
}
|
|
56
57
|
export function isLocalIP(ip) {
|
|
58
|
+
if (isThisMachine(ip))
|
|
59
|
+
return true; // It handles special cases better
|
|
57
60
|
const ipn = ipv4ToInt(ip);
|
|
58
61
|
for (var ipm of assureLocalV4Address()) {
|
|
59
62
|
if ((ipn & ipm.mask) === ipm.ipn)
|
|
@@ -83,7 +86,7 @@ export function isThisMachine(ip) {
|
|
|
83
86
|
// Convert IPv4-mapped IPv6 addresses to their IPv4 representation
|
|
84
87
|
ip = ip.replace('::ffff:', '');
|
|
85
88
|
// Handling the case where IP is ::1 (localhost in IPv6)
|
|
86
|
-
if (ip === '::1') {
|
|
89
|
+
if (ip === '::1' || ip == '127.0.0.1') {
|
|
87
90
|
return true;
|
|
88
91
|
}
|
|
89
92
|
const localIPs = assureLocalV4Address().map(ipm => ipm.s.ip);
|
package/dnsassist.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dnsassist.js","sourceRoot":"","sources":["dnsassist.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,MAAM,IAAI,CAAA;AAEnB;;GAEG;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAE,UAAU;AAEjD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,KAAe;IACxD,IAAI,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"dnsassist.js","sourceRoot":"","sources":["dnsassist.ts"],"names":[],"mappings":"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"}
|
package/dnsassist.ts
CHANGED
|
@@ -8,7 +8,7 @@ import os from 'os'
|
|
|
8
8
|
export const default_fqdn = 'aaz.lt'; // For now
|
|
9
9
|
|
|
10
10
|
export async function resolve4(name: string, local?: boolean): Promise<string> {
|
|
11
|
-
if (!name
|
|
11
|
+
if (!name?.includes('.')) name += '.' + default_fqdn; // FQDN Hack
|
|
12
12
|
|
|
13
13
|
return new Promise((resolve, reject) => dns.resolve4(name,
|
|
14
14
|
(err, ips) => {
|
|
@@ -36,6 +36,7 @@ interface localIPAndMask { ipn: number, mask: number, s: { ip: string, mask: str
|
|
|
36
36
|
export let localIPAndMasks: localIPAndMask[] = null;
|
|
37
37
|
|
|
38
38
|
function ipv4ToInt(ip: string): number {
|
|
39
|
+
ip = ip.replace('::ffff:', ''); // Convert IPv4-mapped IPv6 addresses to their IPv4 representation
|
|
39
40
|
const octets = ip.split(".").map(o => parseInt(o));
|
|
40
41
|
// let z8 = octets.reduce((acc, octet) => (acc << 8) + octet);
|
|
41
42
|
let x8 = arrayToUint32(octets.reverse());
|
|
@@ -68,6 +69,8 @@ function assureLocalV4Address() {
|
|
|
68
69
|
}
|
|
69
70
|
|
|
70
71
|
export function isLocalIP(ip: string) {
|
|
72
|
+
if (isThisMachine(ip))
|
|
73
|
+
return true; // It handles special cases better
|
|
71
74
|
const ipn = ipv4ToInt(ip);
|
|
72
75
|
for (var ipm of assureLocalV4Address()) {
|
|
73
76
|
if ((ipn & ipm.mask) === ipm.ipn) return true;
|
|
@@ -101,7 +104,7 @@ export function isThisMachine(ip: string) {
|
|
|
101
104
|
ip = ip.replace('::ffff:', '');
|
|
102
105
|
|
|
103
106
|
// Handling the case where IP is ::1 (localhost in IPv6)
|
|
104
|
-
if (ip === '::1') {
|
|
107
|
+
if (ip === '::1' || ip == '127.0.0.1') {
|
|
105
108
|
return true;
|
|
106
109
|
}
|
|
107
110
|
|
package/package.json
CHANGED
package/ports.js
CHANGED
package/ports.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ports.js","sourceRoot":"","sources":["ports.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,KAAK,GAAG;IACjB,OAAO,EAAG,KAAK;IACf,QAAQ,EAAE,KAAK;IAEf,SAAS,EAAE,IAAI;IACf,QAAQ,EAAE,IAAI;IAEd,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,IAAI;IAEd,OAAO,EAAE,IAAI;IACb,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,IAAI;IAEd,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,IAAI;IAEX,MAAM,EAAE,IAAI;IACZ,OAAO,EAAE,IAAI;IAEb,MAAM,EAAE,IAAI;IACZ,OAAO,EAAE,IAAI;IAEb,SAAS,EAAE,IAAI;IAEf,QAAQ,EAAE,IAAI;IACd,SAAS,EAAE,IAAI;IAEf,QAAQ,EAAE,IAAI;IACd,QAAQ,EAAE,IAAI;IAEd,MAAM,EAAE,IAAI;IAEZ,MAAM,EAAE,IAAI;IACZ,MAAM,EAAE,IAAI;IACZ,SAAS,EAAE,IAAI;IAEf,GAAG,EAAE,IAAI;IACT,MAAM,EAAE,IAAI;IACZ,SAAS,EAAE,IAAI;IAEf,MAAM,EAAE,IAAI;IAEZ,MAAM,EAAE,IAAI;IAEZ,KAAK,EAAE,KAAK,CAAY,sGAAsG;CAEjI,CAAA;AAED,MAAM,CAAC,MAAM,IAAI,GAAG;IAChB,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,IAAI;IACV,KAAK,EAAE;QACH,GAAG,EAAE,KAAK;QACV,SAAS,EAAE;YACP,OAAO,EAAE,SAAS;SACrB;KACJ;CAEJ,CAAA;AAED,iEAAiE;AACjE,2CAA2C;AAC3C,+DAA+D;AAC/D,uEAAuE;AACvE,4DAA4D;AAC5D,4CAA4C;AAC5C,2DAA2D;AAC3D,uCAAuC;AACvC,qDAAqD;AACrD,oDAAoD;AACpD,2DAA2D;AAC3D,6CAA6C;AAC7C,sCAAsC;AACtC,wDAAwD;AACxD,oDAAoD;AACpD,6DAA6D;AAC7D,uCAAuC;AACvC,yCAAyC;AACzC,uCAAuC;AACvC,8CAA8C;AAC9C,gDAAgD;AAChD,EAAE"}
|
|
1
|
+
{"version":3,"file":"ports.js","sourceRoot":"","sources":["ports.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,KAAK,GAAG;IACjB,OAAO,EAAG,KAAK;IACf,QAAQ,EAAE,KAAK;IAEf,SAAS,EAAE,IAAI;IACf,QAAQ,EAAE,IAAI;IAEd,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,IAAI;IAEd,OAAO,EAAE,IAAI;IACb,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,IAAI;IAEd,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,IAAI;IAEX,MAAM,EAAE,IAAI;IACZ,OAAO,EAAE,IAAI;IAEb,MAAM,EAAE,IAAI;IACZ,OAAO,EAAE,IAAI;IAEb,SAAS,EAAE,IAAI;IAEf,QAAQ,EAAE,IAAI;IACd,SAAS,EAAE,IAAI;IAEf,QAAQ,EAAE,IAAI;IACd,QAAQ,EAAE,IAAI;IAEd,MAAM,EAAE,IAAI;IAEZ,MAAM,EAAE,IAAI;IACZ,MAAM,EAAE,IAAI;IACZ,SAAS,EAAE,IAAI;IAEf,GAAG,EAAE,IAAI;IACT,MAAM,EAAE,IAAI;IACZ,SAAS,EAAE,IAAI;IAEf,MAAM,EAAE,IAAI;IAEZ,MAAM,EAAE,IAAI;IAEZ,KAAK,EAAE,KAAK,CAAY,sGAAsG;CAEjI,CAAA;AAED,MAAM,CAAC,MAAM,IAAI,GAAG;IAChB,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,IAAI;IACV,KAAK,EAAE;QACH,GAAG,EAAE,KAAK;QACV,SAAS,EAAE;YACP,OAAO,EAAE,SAAS;SACrB;QACD,MAAM,EAAE;YACJ,GAAG,EAAE,KAAK;YACV,GAAG,EAAE,QAAQ;SAChB;KACJ;CAEJ,CAAA;AAED,iEAAiE;AACjE,2CAA2C;AAC3C,+DAA+D;AAC/D,uEAAuE;AACvE,4DAA4D;AAC5D,4CAA4C;AAC5C,2DAA2D;AAC3D,uCAAuC;AACvC,qDAAqD;AACrD,oDAAoD;AACpD,2DAA2D;AAC3D,6CAA6C;AAC7C,sCAAsC;AACtC,wDAAwD;AACxD,oDAAoD;AACpD,6DAA6D;AAC7D,uCAAuC;AACvC,yCAAyC;AACzC,uCAAuC;AACvC,8CAA8C;AAC9C,gDAAgD;AAChD,EAAE"}
|