@jait/gateway 0.1.72 → 0.1.73
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/dist/lib/network-scan.d.ts +9 -0
- package/dist/lib/network-scan.d.ts.map +1 -0
- package/dist/lib/network-scan.js +373 -0
- package/dist/lib/network-scan.js.map +1 -0
- package/dist/routes/network.d.ts.map +1 -1
- package/dist/routes/network.js +16 -270
- package/dist/routes/network.js.map +1 -1
- package/dist/tools/network-tools.d.ts.map +1 -1
- package/dist/tools/network-tools.js +24 -255
- package/dist/tools/network-tools.js.map +1 -1
- package/package.json +1 -1
- package/web-dist/assets/{index-BvzxRIUF.js → index-C5gs8pTm.js} +61 -61
- package/web-dist/dist/assets/{index-BvzxRIUF.js → index-C5gs8pTm.js} +61 -61
- package/web-dist/dist/index.html +1 -1
- package/web-dist/index.html +1 -1
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { NetworkScanResult } from "@jait/shared";
|
|
2
|
+
export interface NetworkScanOptions {
|
|
3
|
+
subnet?: string;
|
|
4
|
+
deep?: boolean;
|
|
5
|
+
includeIps?: string[];
|
|
6
|
+
}
|
|
7
|
+
export declare function getLocalSubnets(): string[];
|
|
8
|
+
export declare function scanNetwork(options?: NetworkScanOptions): Promise<NetworkScanResult>;
|
|
9
|
+
//# sourceMappingURL=network-scan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network-scan.d.ts","sourceRoot":"","sources":["../../src/lib/network-scan.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAe,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAOnE,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAQD,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAc1C;AAoPD,wBAAsB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAyI9F"}
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
import { exec } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
import { platform, networkInterfaces } from "node:os";
|
|
4
|
+
import { createConnection } from "node:net";
|
|
5
|
+
const execAsync = promisify(exec);
|
|
6
|
+
const QUICK_DISCOVERY_PORTS = [53, 80, 139, 443, 445, 554, 8000, 8080, 22];
|
|
7
|
+
const DETAIL_PROBE_PORTS = [22, 53, 80, 139, 443, 445, 554, 8000, 8080];
|
|
8
|
+
export function getLocalSubnets() {
|
|
9
|
+
const ifaces = networkInterfaces();
|
|
10
|
+
const subnets = [];
|
|
11
|
+
for (const entries of Object.values(ifaces)) {
|
|
12
|
+
if (!entries)
|
|
13
|
+
continue;
|
|
14
|
+
for (const entry of entries) {
|
|
15
|
+
if (entry.family === "IPv4" && !entry.internal) {
|
|
16
|
+
if (entry.address.startsWith("169.254."))
|
|
17
|
+
continue;
|
|
18
|
+
const parts = entry.address.split(".");
|
|
19
|
+
subnets.push(parts.slice(0, 3).join("."));
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return [...new Set(subnets)];
|
|
24
|
+
}
|
|
25
|
+
function normalizeSubnetPrefix(value) {
|
|
26
|
+
const trimmed = value.trim();
|
|
27
|
+
const cidrMatch = /^(\d{1,3}\.\d{1,3}\.\d{1,3})\.\d{1,3}\/24$/.exec(trimmed);
|
|
28
|
+
if (cidrMatch)
|
|
29
|
+
return cidrMatch[1];
|
|
30
|
+
const fullIpMatch = /^(\d{1,3}\.\d{1,3}\.\d{1,3})\.\d{1,3}$/.exec(trimmed);
|
|
31
|
+
if (fullIpMatch)
|
|
32
|
+
return fullIpMatch[1];
|
|
33
|
+
if (/^\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(trimmed)) {
|
|
34
|
+
return trimmed;
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
function isValidIpv4(ip) {
|
|
39
|
+
const parts = ip.split(".");
|
|
40
|
+
if (parts.length !== 4)
|
|
41
|
+
return false;
|
|
42
|
+
return parts.every((part) => {
|
|
43
|
+
if (!/^\d{1,3}$/.test(part))
|
|
44
|
+
return false;
|
|
45
|
+
const n = Number(part);
|
|
46
|
+
return n >= 0 && n <= 255;
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
function normalizeIps(ips) {
|
|
50
|
+
if (!ips?.length)
|
|
51
|
+
return [];
|
|
52
|
+
return [...new Set(ips
|
|
53
|
+
.map((ip) => ip.trim())
|
|
54
|
+
.filter((ip) => ip.length > 0 && isValidIpv4(ip)))];
|
|
55
|
+
}
|
|
56
|
+
function parseArpTable(output) {
|
|
57
|
+
const results = [];
|
|
58
|
+
const lineRegex = /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+(?:at\s+)?([0-9a-fA-F]{2}[:-][0-9a-fA-F]{2}[:-][0-9a-fA-F]{2}[:-][0-9a-fA-F]{2}[:-][0-9a-fA-F]{2}[:-][0-9a-fA-F]{2})/;
|
|
59
|
+
const ignoredMacs = new Set(["ff:ff:ff:ff:ff:ff", "00:00:00:00:00:00"]);
|
|
60
|
+
for (const line of output.split("\n")) {
|
|
61
|
+
const match = lineRegex.exec(line);
|
|
62
|
+
if (!match)
|
|
63
|
+
continue;
|
|
64
|
+
const mac = match[2].replace(/-/g, ":").toLowerCase();
|
|
65
|
+
if (ignoredMacs.has(mac))
|
|
66
|
+
continue;
|
|
67
|
+
const firstOctet = parseInt(mac.slice(0, 2), 16);
|
|
68
|
+
if (firstOctet & 1)
|
|
69
|
+
continue;
|
|
70
|
+
results.push({ ip: match[1], mac, responsive: true });
|
|
71
|
+
}
|
|
72
|
+
return results;
|
|
73
|
+
}
|
|
74
|
+
async function sleep(ms) {
|
|
75
|
+
await new Promise((resolve) => setTimeout(resolve, ms));
|
|
76
|
+
}
|
|
77
|
+
async function mapConcurrent(items, concurrency, fn) {
|
|
78
|
+
const results = new Array(items.length);
|
|
79
|
+
let index = 0;
|
|
80
|
+
const run = async () => {
|
|
81
|
+
while (index < items.length) {
|
|
82
|
+
const current = index++;
|
|
83
|
+
results[current] = await fn(items[current]);
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
await Promise.all(Array.from({ length: Math.min(concurrency, items.length) }, () => run()));
|
|
87
|
+
return results;
|
|
88
|
+
}
|
|
89
|
+
function probePort(ip, port, timeoutMs = 2000) {
|
|
90
|
+
return new Promise((resolve) => {
|
|
91
|
+
const socket = createConnection({ host: ip, port, timeout: timeoutMs });
|
|
92
|
+
socket.once("connect", () => { socket.destroy(); resolve(true); });
|
|
93
|
+
socket.once("timeout", () => { socket.destroy(); resolve(false); });
|
|
94
|
+
socket.once("error", () => { socket.destroy(); resolve(false); });
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
async function probeAnyPort(ip, ports, timeoutMs) {
|
|
98
|
+
for (const port of ports) {
|
|
99
|
+
if (await probePort(ip, port, timeoutMs)) {
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
async function pingHost(ip, timeoutMs = 1000) {
|
|
106
|
+
try {
|
|
107
|
+
const command = platform() === "win32"
|
|
108
|
+
? `ping -n 1 -w ${timeoutMs} ${ip} > nul 2>&1`
|
|
109
|
+
: `ping -c 1 -W ${Math.max(1, Math.ceil(timeoutMs / 1000))} ${ip} >/dev/null 2>&1`;
|
|
110
|
+
await execAsync(command, platform() === "win32"
|
|
111
|
+
? { timeout: timeoutMs + 1500 }
|
|
112
|
+
: { timeout: timeoutMs + 1500, shell: "/bin/bash" });
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async function reverseResolve(ip) {
|
|
120
|
+
try {
|
|
121
|
+
const cmd = platform() === "win32"
|
|
122
|
+
? `nslookup ${ip} 2>nul`
|
|
123
|
+
: `host ${ip} 2>/dev/null || true`;
|
|
124
|
+
const { stdout } = await execAsync(cmd, { timeout: 3000 });
|
|
125
|
+
const winMatch = /Name:\s+(\S+)/i.exec(stdout);
|
|
126
|
+
if (winMatch)
|
|
127
|
+
return winMatch[1];
|
|
128
|
+
const linMatch = /pointer\s+(\S+)/i.exec(stdout);
|
|
129
|
+
if (linMatch)
|
|
130
|
+
return linMatch[1].replace(/\.$/, "");
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async function detectOsVersion(ip, sshReachable, agentStatus) {
|
|
138
|
+
if (agentStatus === "running") {
|
|
139
|
+
try {
|
|
140
|
+
const res = await fetch(`http://${ip}:8000/health`, { signal: AbortSignal.timeout(2000) });
|
|
141
|
+
if (res.ok) {
|
|
142
|
+
const health = (await res.json());
|
|
143
|
+
if (health.osVersion)
|
|
144
|
+
return health.osVersion;
|
|
145
|
+
if (health.os)
|
|
146
|
+
return health.os;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
catch { }
|
|
150
|
+
}
|
|
151
|
+
if (sshReachable) {
|
|
152
|
+
try {
|
|
153
|
+
const banner = await new Promise((resolve) => {
|
|
154
|
+
const socket = createConnection({ host: ip, port: 22, timeout: 3000 });
|
|
155
|
+
let data = "";
|
|
156
|
+
socket.on("data", (chunk) => { data += String(chunk); socket.destroy(); resolve(data); });
|
|
157
|
+
socket.on("timeout", () => { socket.destroy(); resolve(""); });
|
|
158
|
+
socket.on("error", () => { socket.destroy(); resolve(""); });
|
|
159
|
+
});
|
|
160
|
+
if (banner) {
|
|
161
|
+
const trimmed = banner.trim().slice(0, 200);
|
|
162
|
+
if (/ubuntu/i.test(trimmed)) {
|
|
163
|
+
const match = /Ubuntu[\s-]*(\S*)/i.exec(trimmed);
|
|
164
|
+
return match ? `Ubuntu ${match[1]}` : "Ubuntu";
|
|
165
|
+
}
|
|
166
|
+
if (/debian/i.test(trimmed))
|
|
167
|
+
return "Debian";
|
|
168
|
+
if (/windows/i.test(trimmed))
|
|
169
|
+
return "Windows";
|
|
170
|
+
if (/raspbian/i.test(trimmed))
|
|
171
|
+
return "Raspbian";
|
|
172
|
+
if (trimmed.startsWith("SSH-"))
|
|
173
|
+
return trimmed;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
catch { }
|
|
177
|
+
}
|
|
178
|
+
return null;
|
|
179
|
+
}
|
|
180
|
+
async function runSubnetPingSweep(subnets) {
|
|
181
|
+
for (const subnet of subnets) {
|
|
182
|
+
if (platform() === "win32") {
|
|
183
|
+
const batchSize = 25;
|
|
184
|
+
const batches = [];
|
|
185
|
+
for (let i = 1; i <= 254; i += batchSize) {
|
|
186
|
+
const end = Math.min(i + batchSize - 1, 254);
|
|
187
|
+
const commands = Array.from({ length: end - i + 1 }, (_, offset) => `ping -n 1 -w 500 ${subnet}.${i + offset} > nul 2>&1`).join(" & ");
|
|
188
|
+
batches.push(commands);
|
|
189
|
+
}
|
|
190
|
+
await Promise.all(batches.map((command) => execAsync(command, { timeout: 45000 }).catch(() => { })));
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
const pingCmd = `for i in $(seq 1 254); do ping -c 1 -W 1 ${subnet}.$i & done; wait`;
|
|
194
|
+
await execAsync(pingCmd, { timeout: 30000, shell: "/bin/bash" }).catch(() => { });
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
async function readArpEntries() {
|
|
198
|
+
try {
|
|
199
|
+
const { stdout } = await execAsync("arp -a", { timeout: 10000 });
|
|
200
|
+
return parseArpTable(stdout);
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
return [];
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
async function readWindowsNeighborEntries(subnets) {
|
|
207
|
+
if (platform() !== "win32")
|
|
208
|
+
return [];
|
|
209
|
+
try {
|
|
210
|
+
const { stdout } = await execAsync('powershell -NoProfile -Command "Get-NetNeighbor -AddressFamily IPv4 | Where-Object { $_.State -ne \'Unreachable\' -and $_.LinkLayerAddress -ne \'\' -and $_.LinkLayerAddress -ne \'00-00-00-00-00-00\' } | Select-Object IPAddress,LinkLayerAddress | ConvertTo-Csv -NoTypeInformation"', { timeout: 15000 });
|
|
211
|
+
const entries = [];
|
|
212
|
+
for (const line of stdout.split("\n")) {
|
|
213
|
+
const match = /"(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})"\s*,\s*"([0-9a-fA-F]{2}-[0-9a-fA-F]{2}-[0-9a-fA-F]{2}-[0-9a-fA-F]{2}-[0-9a-fA-F]{2}-[0-9a-fA-F]{2})"/.exec(line);
|
|
214
|
+
if (!match)
|
|
215
|
+
continue;
|
|
216
|
+
const ip = match[1];
|
|
217
|
+
if (!subnets.some((subnet) => ip.startsWith(`${subnet}.`)))
|
|
218
|
+
continue;
|
|
219
|
+
entries.push({ ip, mac: match[2].replace(/-/g, ":").toLowerCase(), responsive: true });
|
|
220
|
+
}
|
|
221
|
+
return entries;
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
return [];
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
function mergeEntries(entries) {
|
|
228
|
+
const merged = new Map();
|
|
229
|
+
for (const entry of entries) {
|
|
230
|
+
const existing = merged.get(entry.ip);
|
|
231
|
+
if (!existing) {
|
|
232
|
+
merged.set(entry.ip, entry);
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
merged.set(entry.ip, {
|
|
236
|
+
ip: entry.ip,
|
|
237
|
+
mac: existing.mac ?? entry.mac,
|
|
238
|
+
responsive: existing.responsive || entry.responsive,
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
return [...merged.values()];
|
|
242
|
+
}
|
|
243
|
+
function buildSubnetCandidates(subnets) {
|
|
244
|
+
const candidates = [];
|
|
245
|
+
for (const subnet of subnets) {
|
|
246
|
+
for (let host = 1; host <= 254; host += 1) {
|
|
247
|
+
candidates.push(`${subnet}.${host}`);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return candidates;
|
|
251
|
+
}
|
|
252
|
+
export async function scanNetwork(options = {}) {
|
|
253
|
+
const requestedSubnet = options.subnet ? normalizeSubnetPrefix(options.subnet) : null;
|
|
254
|
+
const subnets = requestedSubnet ? [requestedSubnet] : getLocalSubnets();
|
|
255
|
+
if (subnets.length === 0) {
|
|
256
|
+
throw new Error("No active IPv4 subnets found");
|
|
257
|
+
}
|
|
258
|
+
const includeIps = normalizeIps(options.includeIps);
|
|
259
|
+
const includeIpSet = new Set(includeIps);
|
|
260
|
+
const start = Date.now();
|
|
261
|
+
const deepScan = options.deep !== false;
|
|
262
|
+
let entries = mergeEntries([
|
|
263
|
+
...(await readArpEntries()),
|
|
264
|
+
...(await readWindowsNeighborEntries(subnets)),
|
|
265
|
+
]);
|
|
266
|
+
await runSubnetPingSweep(subnets);
|
|
267
|
+
await sleep(2500);
|
|
268
|
+
entries = mergeEntries([
|
|
269
|
+
...entries,
|
|
270
|
+
...(await readArpEntries()),
|
|
271
|
+
...(await readWindowsNeighborEntries(subnets)),
|
|
272
|
+
]);
|
|
273
|
+
if (deepScan) {
|
|
274
|
+
const knownIps = new Set(entries.map((entry) => entry.ip));
|
|
275
|
+
const candidates = [...new Set([
|
|
276
|
+
...buildSubnetCandidates(subnets),
|
|
277
|
+
...includeIps,
|
|
278
|
+
])].filter((ip) => !knownIps.has(ip));
|
|
279
|
+
const discovered = await mapConcurrent(candidates, 64, async (ip) => {
|
|
280
|
+
if (await pingHost(ip, 900)) {
|
|
281
|
+
return { ip, mac: null, responsive: true };
|
|
282
|
+
}
|
|
283
|
+
if (await probeAnyPort(ip, QUICK_DISCOVERY_PORTS, 250)) {
|
|
284
|
+
return { ip, mac: null, responsive: true };
|
|
285
|
+
}
|
|
286
|
+
return null;
|
|
287
|
+
});
|
|
288
|
+
const discoveredEntries = discovered.filter((entry) => entry !== null);
|
|
289
|
+
entries = mergeEntries([
|
|
290
|
+
...entries,
|
|
291
|
+
...discoveredEntries,
|
|
292
|
+
]);
|
|
293
|
+
await sleep(1000);
|
|
294
|
+
entries = mergeEntries([
|
|
295
|
+
...entries,
|
|
296
|
+
...(await readArpEntries()),
|
|
297
|
+
...(await readWindowsNeighborEntries(subnets)),
|
|
298
|
+
]);
|
|
299
|
+
}
|
|
300
|
+
const scopedEntries = mergeEntries([
|
|
301
|
+
...entries.filter((entry) => includeIpSet.has(entry.ip) || subnets.some((subnet) => entry.ip.startsWith(`${subnet}.`))),
|
|
302
|
+
...includeIps
|
|
303
|
+
.filter((ip) => !entries.some((entry) => entry.ip === ip))
|
|
304
|
+
.map((ip) => ({ ip, mac: null, responsive: false })),
|
|
305
|
+
]);
|
|
306
|
+
const hosts = await mapConcurrent(scopedEntries, 20, async (entry) => {
|
|
307
|
+
const portResults = await Promise.all(DETAIL_PROBE_PORTS.map(async (port) => ({
|
|
308
|
+
port,
|
|
309
|
+
open: await probePort(entry.ip, port, 1500),
|
|
310
|
+
})));
|
|
311
|
+
const openPorts = portResults.filter((result) => result.open).map((result) => result.port);
|
|
312
|
+
const hostname = await reverseResolve(entry.ip);
|
|
313
|
+
let agentStatus = "not-installed";
|
|
314
|
+
let providers;
|
|
315
|
+
if (openPorts.includes(8000)) {
|
|
316
|
+
try {
|
|
317
|
+
const res = await fetch(`http://${entry.ip}:8000/health`, { signal: AbortSignal.timeout(2000) });
|
|
318
|
+
if (res.ok) {
|
|
319
|
+
const health = (await res.json());
|
|
320
|
+
if (health.name === "jait-gateway") {
|
|
321
|
+
agentStatus = "running";
|
|
322
|
+
try {
|
|
323
|
+
const topologyRes = await fetch(`http://${entry.ip}:8000/api/network/topology`, {
|
|
324
|
+
signal: AbortSignal.timeout(2000),
|
|
325
|
+
});
|
|
326
|
+
if (topologyRes.ok) {
|
|
327
|
+
const topology = (await topologyRes.json());
|
|
328
|
+
const allProviders = new Set();
|
|
329
|
+
for (const device of topology.devices ?? []) {
|
|
330
|
+
for (const provider of device.providers ?? []) {
|
|
331
|
+
allProviders.add(provider);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
if (allProviders.size > 0) {
|
|
335
|
+
providers = [...allProviders];
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
catch { }
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
catch { }
|
|
344
|
+
}
|
|
345
|
+
const alive = entry.responsive || openPorts.length > 0;
|
|
346
|
+
const sshReachable = openPorts.includes(22);
|
|
347
|
+
return {
|
|
348
|
+
ip: entry.ip,
|
|
349
|
+
mac: entry.mac,
|
|
350
|
+
hostname,
|
|
351
|
+
vendor: null,
|
|
352
|
+
alive,
|
|
353
|
+
openPorts,
|
|
354
|
+
sshReachable,
|
|
355
|
+
agentStatus,
|
|
356
|
+
osVersion: await detectOsVersion(entry.ip, sshReachable, agentStatus),
|
|
357
|
+
providers,
|
|
358
|
+
lastSeen: new Date().toISOString(),
|
|
359
|
+
};
|
|
360
|
+
});
|
|
361
|
+
hosts.sort((a, b) => {
|
|
362
|
+
const aNum = a.ip.split(".").map(Number).reduce((sum, value) => sum * 256 + value, 0);
|
|
363
|
+
const bNum = b.ip.split(".").map(Number).reduce((sum, value) => sum * 256 + value, 0);
|
|
364
|
+
return aNum - bNum;
|
|
365
|
+
});
|
|
366
|
+
return {
|
|
367
|
+
subnet: subnets.map((subnet) => `${subnet}.0/24`).join(", "),
|
|
368
|
+
hosts,
|
|
369
|
+
scannedAt: new Date().toISOString(),
|
|
370
|
+
durationMs: Date.now() - start,
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
//# sourceMappingURL=network-scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network-scan.js","sourceRoot":"","sources":["../../src/lib/network-scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../src/routes/network.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAO/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../src/routes/network.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAO/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AA2G3D,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,EAAE,EAAE,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,cAAc,EAAE,gBAAgB,CAAC,EAAE,OAAO,0BAA0B,EAAE,gBAAgB,QA8V/K"}
|