opencharm 0.10.0 → 0.12.0
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/README.md +2 -2
- package/dist/main.mjs +2954 -24
- package/package.json +1 -1
- package/sim/charm_sim.wasm +0 -0
package/dist/main.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from "node:module";
|
|
3
3
|
import { chmodSync, createWriteStream, existsSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, realpathSync, renameSync, rmSync, statSync, unlinkSync, writeFileSync } from "node:fs";
|
|
4
|
-
import { homedir, tmpdir } from "node:os";
|
|
4
|
+
import { homedir, hostname, platform, tmpdir } from "node:os";
|
|
5
5
|
import { dirname, extname, isAbsolute, join, normalize, resolve, sep } from "node:path";
|
|
6
6
|
import { z } from "zod";
|
|
7
7
|
import { createConnection, createServer } from "node:net";
|
|
@@ -15,6 +15,9 @@ import { pipeline } from "node:stream/promises";
|
|
|
15
15
|
import * as acp from "@agentclientprotocol/sdk";
|
|
16
16
|
import OpusScript from "opusscript";
|
|
17
17
|
import { fileURLToPath } from "node:url";
|
|
18
|
+
//#region \0rolldown/runtime.js
|
|
19
|
+
var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).exports, mod), cb = null), mod.exports);
|
|
20
|
+
var __require = /* #__PURE__ */ (() => createRequire(import.meta.url))();
|
|
18
21
|
//#endregion
|
|
19
22
|
//#region ../design/src/faces-data.ts
|
|
20
23
|
const facesData = {
|
|
@@ -527,12 +530,22 @@ const answer = z.object({
|
|
|
527
530
|
id: askId,
|
|
528
531
|
yes: z.boolean()
|
|
529
532
|
});
|
|
533
|
+
const battery = z.object({
|
|
534
|
+
type: z.literal("charm"),
|
|
535
|
+
op: z.literal("battery"),
|
|
536
|
+
percent: z.number().int().min(0).max(100),
|
|
537
|
+
charging: z.boolean(),
|
|
538
|
+
usb: z.boolean()
|
|
539
|
+
});
|
|
530
540
|
const serverHello = z.object({
|
|
531
541
|
type: z.literal("hello"),
|
|
532
542
|
transport: z.literal("websocket"),
|
|
533
543
|
session_id: z.string().min(1).max(128),
|
|
534
544
|
audio_params: audioParams,
|
|
535
|
-
features: z.object({
|
|
545
|
+
features: z.object({
|
|
546
|
+
text: z.boolean().optional(),
|
|
547
|
+
battery: z.boolean().optional()
|
|
548
|
+
}).optional()
|
|
536
549
|
});
|
|
537
550
|
const stt = z.object({
|
|
538
551
|
session_id: sessionId,
|
|
@@ -619,7 +632,8 @@ const CLIENT_SCHEMAS = {
|
|
|
619
632
|
abort,
|
|
620
633
|
"charm:unlock": unlock,
|
|
621
634
|
"charm:answer": answer,
|
|
622
|
-
"charm:text": typed
|
|
635
|
+
"charm:text": typed,
|
|
636
|
+
"charm:battery": battery
|
|
623
637
|
};
|
|
624
638
|
const SERVER_SCHEMAS = {
|
|
625
639
|
hello: serverHello,
|
|
@@ -859,6 +873,11 @@ const schema = z.object({
|
|
|
859
873
|
publicUrl: z.url().optional(),
|
|
860
874
|
maxConnections: z.number().int().min(1).max(1024).default(16),
|
|
861
875
|
allowInsecureRemote: z.boolean().default(false),
|
|
876
|
+
network: z.object({
|
|
877
|
+
host: z.string().min(1).default("0.0.0.0"),
|
|
878
|
+
port: z.number().int().min(0).max(65535).default(8787)
|
|
879
|
+
}).optional(),
|
|
880
|
+
discoverable: z.boolean().default(true),
|
|
862
881
|
voice: voiceSchema.default({ provider: "fake" }),
|
|
863
882
|
agent: agentSchema.default({ adapter: "fake" }),
|
|
864
883
|
turnTimeoutSeconds: z.number().int().min(5).max(600).default(60),
|
|
@@ -946,6 +965,7 @@ function parseConfig(input, baseDir) {
|
|
|
946
965
|
throw new Error(`Invalid charmd config: ${problems}`);
|
|
947
966
|
}
|
|
948
967
|
const config = result.data;
|
|
968
|
+
if (config.network && !config.allowInsecureRemote) throw new Error(`Invalid charmd config: "network" listens beyond this computer; set "allowInsecureRemote": true for a trusted home network`);
|
|
949
969
|
if (!LOOPBACK.has(config.listen.host) && !config.allowInsecureRemote) throw new Error(`Invalid charmd config: listen.host ${config.listen.host} is not loopback; put Caddy in front, or set "allowInsecureRemote": true for a trusted LAN`);
|
|
950
970
|
const statePath = baseDir && !isAbsolute(config.statePath) ? resolve(baseDir, config.statePath) : config.statePath;
|
|
951
971
|
const base = baseDir ?? process.cwd();
|
|
@@ -966,6 +986,9 @@ function loadConfig(path, options = {}) {
|
|
|
966
986
|
const found = (options.searchPaths ?? DEFAULT_SEARCH_PATHS).find((p) => existsSync(p));
|
|
967
987
|
return found ? parseConfig(JSON.parse(readFileSync(found, "utf8")), dirname(found)) : parseConfig({});
|
|
968
988
|
}
|
|
989
|
+
function isLoopback(host) {
|
|
990
|
+
return LOOPBACK.has(host);
|
|
991
|
+
}
|
|
969
992
|
//#endregion
|
|
970
993
|
//#region ../charmd/src/admin/admin-client.ts
|
|
971
994
|
const MAX_REPLY_BYTES = 262144;
|
|
@@ -997,7 +1020,7 @@ function sendAdmin(socketPath, request) {
|
|
|
997
1020
|
}
|
|
998
1021
|
//#endregion
|
|
999
1022
|
//#region package.json
|
|
1000
|
-
var version = "0.
|
|
1023
|
+
var version = "0.12.0";
|
|
1001
1024
|
function channelToCube(value) {
|
|
1002
1025
|
if (value < 48) return 0;
|
|
1003
1026
|
if (value < 115) return 1;
|
|
@@ -1147,7 +1170,12 @@ const statusSchema = z.object({
|
|
|
1147
1170
|
state: z.string(),
|
|
1148
1171
|
blocked: z.boolean(),
|
|
1149
1172
|
failedTries: z.number(),
|
|
1150
|
-
build: charmBuild.optional().catch(void 0)
|
|
1173
|
+
build: charmBuild.optional().catch(void 0),
|
|
1174
|
+
battery: z.object({
|
|
1175
|
+
percent: z.number().int().min(0).max(100),
|
|
1176
|
+
charging: z.boolean(),
|
|
1177
|
+
usb: z.boolean()
|
|
1178
|
+
}).optional().catch(void 0)
|
|
1151
1179
|
}))
|
|
1152
1180
|
});
|
|
1153
1181
|
const DONE = {
|
|
@@ -1159,12 +1187,23 @@ function fail$2(ctx, message) {
|
|
|
1159
1187
|
ctx.err.write(`${message}\n`);
|
|
1160
1188
|
process.exitCode = 1;
|
|
1161
1189
|
}
|
|
1162
|
-
async function
|
|
1163
|
-
const
|
|
1164
|
-
if (
|
|
1165
|
-
fail$2(ctx, "
|
|
1190
|
+
async function chooseWaiting(ctx, deps) {
|
|
1191
|
+
const charms = ((await deps.send(deps.socket, { cmd: "waiting" })).charms ?? []).filter((c) => /^\d{6}$/.test(c.code));
|
|
1192
|
+
if (charms.length === 0) {
|
|
1193
|
+
fail$2(ctx, "No charm is waiting to pair. Turn it on and connect it to this charmd: its screen shows a 6-digit code. Then: opencharm pair [code]");
|
|
1194
|
+
return;
|
|
1195
|
+
}
|
|
1196
|
+
ctx.out.write(`${charms.length === 1 ? "A charm is" : `${charms.length} charms are`} waiting to pair${charms.some((c) => c.kind) ? ` (${charms.map((c) => c.kind ?? "?").join(", ")})` : ""}.\n`);
|
|
1197
|
+
const typed = (await deps.prompt("Type the code on your charm's screen: ")).replace(/\s/g, "");
|
|
1198
|
+
if (!charms.some((c) => c.code === typed)) {
|
|
1199
|
+
fail$2(ctx, "That code isn't one of them. Nothing was changed.");
|
|
1166
1200
|
return;
|
|
1167
1201
|
}
|
|
1202
|
+
return typed;
|
|
1203
|
+
}
|
|
1204
|
+
async function pair(ctx, args, deps) {
|
|
1205
|
+
const code = firstPositional(args) ?? await chooseWaiting(ctx, deps);
|
|
1206
|
+
if (!code) return;
|
|
1168
1207
|
const pin = await deps.prompt("Choose a PIN for the charm (4-12 digits): ");
|
|
1169
1208
|
if (pin !== await deps.prompt("Type it again: ")) {
|
|
1170
1209
|
fail$2(ctx, "The PINs didn't match. Nothing was changed.");
|
|
@@ -1243,7 +1282,13 @@ function printStatus(ctx, charms, charmd, starter, voice) {
|
|
|
1243
1282
|
return;
|
|
1244
1283
|
}
|
|
1245
1284
|
for (const charm of charms) {
|
|
1246
|
-
const
|
|
1285
|
+
const note = charm.blocked ? "blocked (opencharm unlock to clear)" : charm.failedTries > 0 ? `${charm.failedTries} wrong PIN(s)` : "";
|
|
1286
|
+
const build = charm.build ? `${charm.build.kind} ${charm.build.version} (${charm.build.commit})` : "";
|
|
1287
|
+
const details = [
|
|
1288
|
+
note,
|
|
1289
|
+
charm.battery ? `${charm.battery.percent}%` + (charm.battery.charging ? " charging" : charm.battery.usb ? " on USB" : "") : "",
|
|
1290
|
+
build
|
|
1291
|
+
].filter(Boolean).join(" ");
|
|
1247
1292
|
ctx.out.write(`${charm.name.padEnd(16)} ${charm.state.padEnd(10)} ${details}`.trimEnd() + "\n");
|
|
1248
1293
|
}
|
|
1249
1294
|
}
|
|
@@ -1496,7 +1541,7 @@ function runHelp(ctx) {
|
|
|
1496
1541
|
opencharm serve start charmd [--config <file>]
|
|
1497
1542
|
opencharm sim the emulator, for developing the charm [--url <ws>] [--port <n>]
|
|
1498
1543
|
opencharm voice the local voice's models [install: download them now]
|
|
1499
|
-
opencharm pair
|
|
1544
|
+
opencharm pair [code] pair the charm showing [code]; no code: the charms waiting [--name <name>]
|
|
1500
1545
|
opencharm status paired charms and their state
|
|
1501
1546
|
opencharm lock <charm> lock a charm now
|
|
1502
1547
|
opencharm unlock <charm> clear a block and unlock
|
|
@@ -1993,6 +2038,14 @@ function createAdminActions({ store, pairing, sessions, look, agentCanChangeLook
|
|
|
1993
2038
|
return { speak };
|
|
1994
2039
|
});
|
|
1995
2040
|
},
|
|
2041
|
+
waiting() {
|
|
2042
|
+
const live = new Map([...sessions()].map((s) => [s.connectionId, s]));
|
|
2043
|
+
return { charms: pairing.waiting().filter((w) => live.get(w.connectionId)?.state === "unpaired").map((w) => ({
|
|
2044
|
+
code: w.code,
|
|
2045
|
+
kind: live.get(w.connectionId)?.build?.kind,
|
|
2046
|
+
expiresIn: w.expiresIn
|
|
2047
|
+
})) };
|
|
2048
|
+
},
|
|
1996
2049
|
status() {
|
|
1997
2050
|
return {
|
|
1998
2051
|
charmd: identity ?? "unknown",
|
|
@@ -2007,7 +2060,8 @@ function createAdminActions({ store, pairing, sessions, look, agentCanChangeLook
|
|
|
2007
2060
|
failedTries: charm.failedTries,
|
|
2008
2061
|
connected: live !== void 0,
|
|
2009
2062
|
state: live?.state ?? "offline",
|
|
2010
|
-
build: live?.build
|
|
2063
|
+
build: live?.build,
|
|
2064
|
+
battery: live?.battery
|
|
2011
2065
|
};
|
|
2012
2066
|
})
|
|
2013
2067
|
};
|
|
@@ -2023,6 +2077,7 @@ const COMMANDS = [
|
|
|
2023
2077
|
"unlock",
|
|
2024
2078
|
"revoke",
|
|
2025
2079
|
"status",
|
|
2080
|
+
"waiting",
|
|
2026
2081
|
"devFace",
|
|
2027
2082
|
"devSay",
|
|
2028
2083
|
"devAsk",
|
|
@@ -2045,7 +2100,9 @@ function socketInUse(path) {
|
|
|
2045
2100
|
async function run$2(actions, request) {
|
|
2046
2101
|
const { cmd, ...args } = typeof request === "object" && request !== null ? request : {};
|
|
2047
2102
|
if (!isCommand(cmd)) throw new Error(`Unknown command ${JSON.stringify(cmd)}`);
|
|
2048
|
-
|
|
2103
|
+
if (cmd === "status") return actions.status();
|
|
2104
|
+
if (cmd === "waiting") return actions.waiting();
|
|
2105
|
+
return actions[cmd](args);
|
|
2049
2106
|
}
|
|
2050
2107
|
function handle(socket, actions) {
|
|
2051
2108
|
let buffer = "";
|
|
@@ -2182,11 +2239,2848 @@ var PairingRegistry = class {
|
|
|
2182
2239
|
this.#byCode.delete(code);
|
|
2183
2240
|
return pending.connectionId;
|
|
2184
2241
|
}
|
|
2242
|
+
waiting() {
|
|
2243
|
+
this.#prune();
|
|
2244
|
+
const now = this.#options.now();
|
|
2245
|
+
return [...this.#byCode.values()].map((p) => ({
|
|
2246
|
+
code: p.code,
|
|
2247
|
+
connectionId: p.connectionId,
|
|
2248
|
+
expiresIn: Math.max(0, Math.round((p.expiresAt - now) / 1e3))
|
|
2249
|
+
}));
|
|
2250
|
+
}
|
|
2185
2251
|
release(connectionId) {
|
|
2186
2252
|
for (const [code, pending] of this.#byCode) if (pending.connectionId === connectionId) this.#byCode.delete(code);
|
|
2187
2253
|
}
|
|
2188
2254
|
};
|
|
2189
2255
|
//#endregion
|
|
2256
|
+
//#region ../../node_modules/bonjour-service/dist/lib/utils/dns-equal.js
|
|
2257
|
+
var require_dns_equal = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
2258
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
2259
|
+
exports.default = dnsEqual;
|
|
2260
|
+
const capitalLetterRegex = /[A-Z]/g;
|
|
2261
|
+
function toLowerCase(input) {
|
|
2262
|
+
return input.toLowerCase();
|
|
2263
|
+
}
|
|
2264
|
+
function dnsEqual(a, b) {
|
|
2265
|
+
return a.replace(capitalLetterRegex, toLowerCase) === b.replace(capitalLetterRegex, toLowerCase);
|
|
2266
|
+
}
|
|
2267
|
+
}));
|
|
2268
|
+
//#endregion
|
|
2269
|
+
//#region ../../node_modules/bonjour-service/dist/lib/dns-txt.js
|
|
2270
|
+
var require_dns_txt = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
2271
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
2272
|
+
exports.DnsTxt = void 0;
|
|
2273
|
+
var DnsTxt = class {
|
|
2274
|
+
constructor(opts = {}) {
|
|
2275
|
+
this.binary = opts ? opts.binary : false;
|
|
2276
|
+
}
|
|
2277
|
+
encode(data = {}) {
|
|
2278
|
+
return Object.entries(data).map(([key, value]) => {
|
|
2279
|
+
let item = `${key}=${value}`;
|
|
2280
|
+
return Buffer.from(item);
|
|
2281
|
+
});
|
|
2282
|
+
}
|
|
2283
|
+
decode(buffer) {
|
|
2284
|
+
var data = {};
|
|
2285
|
+
try {
|
|
2286
|
+
let parts = buffer.toString().split(/=(.+)/);
|
|
2287
|
+
let key = parts[0];
|
|
2288
|
+
data[key] = parts[1];
|
|
2289
|
+
} catch (_) {}
|
|
2290
|
+
return data;
|
|
2291
|
+
}
|
|
2292
|
+
decodeAll(buffer) {
|
|
2293
|
+
return buffer.filter((i) => i.length > 1).map((i) => this.decode(i)).reduce((prev, curr) => {
|
|
2294
|
+
var obj = prev;
|
|
2295
|
+
let [key] = Object.keys(curr);
|
|
2296
|
+
let [value] = Object.values(curr);
|
|
2297
|
+
obj[key] = value;
|
|
2298
|
+
return obj;
|
|
2299
|
+
}, {});
|
|
2300
|
+
}
|
|
2301
|
+
};
|
|
2302
|
+
exports.DnsTxt = DnsTxt;
|
|
2303
|
+
exports.default = DnsTxt;
|
|
2304
|
+
}));
|
|
2305
|
+
//#endregion
|
|
2306
|
+
//#region ../../node_modules/bonjour-service/dist/lib/service-types.js
|
|
2307
|
+
var require_service_types = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
2308
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
2309
|
+
exports.toType = exports.toString = void 0;
|
|
2310
|
+
const Prefix = (name) => {
|
|
2311
|
+
return "_" + name;
|
|
2312
|
+
};
|
|
2313
|
+
const AllowedProp = (key) => {
|
|
2314
|
+
return [
|
|
2315
|
+
"name",
|
|
2316
|
+
"protocol",
|
|
2317
|
+
"subtype"
|
|
2318
|
+
].includes(key);
|
|
2319
|
+
};
|
|
2320
|
+
const toString = (data) => {
|
|
2321
|
+
let formatted = {
|
|
2322
|
+
name: data.name,
|
|
2323
|
+
protocol: data.protocol,
|
|
2324
|
+
subtype: data.subtype
|
|
2325
|
+
};
|
|
2326
|
+
return Object.entries(formatted).filter(([key, val]) => AllowedProp(key) && val !== void 0).reduce((prev, [key, val]) => {
|
|
2327
|
+
switch (typeof val) {
|
|
2328
|
+
case "object":
|
|
2329
|
+
val.map((i) => prev.push(Prefix(i)));
|
|
2330
|
+
break;
|
|
2331
|
+
default: prev.push(Prefix(val));
|
|
2332
|
+
}
|
|
2333
|
+
return prev;
|
|
2334
|
+
}, []).join(".");
|
|
2335
|
+
};
|
|
2336
|
+
exports.toString = toString;
|
|
2337
|
+
const toType = (string) => {
|
|
2338
|
+
let parts = string.split(".");
|
|
2339
|
+
let subtype;
|
|
2340
|
+
for (let i in parts) {
|
|
2341
|
+
if (parts[i][0] !== "_") continue;
|
|
2342
|
+
parts[i] = parts[i].slice(1);
|
|
2343
|
+
}
|
|
2344
|
+
if (parts.includes("sub")) {
|
|
2345
|
+
subtype = parts.shift();
|
|
2346
|
+
parts.shift();
|
|
2347
|
+
}
|
|
2348
|
+
return {
|
|
2349
|
+
name: parts.shift(),
|
|
2350
|
+
protocol: parts.shift() || null,
|
|
2351
|
+
subtype
|
|
2352
|
+
};
|
|
2353
|
+
};
|
|
2354
|
+
exports.toType = toType;
|
|
2355
|
+
}));
|
|
2356
|
+
//#endregion
|
|
2357
|
+
//#region ../../node_modules/bonjour-service/dist/lib/service.js
|
|
2358
|
+
var require_service = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
2359
|
+
var __importDefault = exports && exports.__importDefault || function(mod) {
|
|
2360
|
+
return mod && mod.__esModule ? mod : { "default": mod };
|
|
2361
|
+
};
|
|
2362
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
2363
|
+
exports.Service = void 0;
|
|
2364
|
+
const os_1 = __importDefault(__require("os"));
|
|
2365
|
+
const dns_txt_1 = __importDefault(require_dns_txt());
|
|
2366
|
+
const events_1$1 = __require("events");
|
|
2367
|
+
const service_types_1 = require_service_types();
|
|
2368
|
+
const TLD = ".local";
|
|
2369
|
+
var Service = class extends events_1$1.EventEmitter {
|
|
2370
|
+
constructor(config, start, stop) {
|
|
2371
|
+
super();
|
|
2372
|
+
this.start = start;
|
|
2373
|
+
this.stop = stop;
|
|
2374
|
+
this.probe = true;
|
|
2375
|
+
this.published = false;
|
|
2376
|
+
this.activated = false;
|
|
2377
|
+
this.destroyed = false;
|
|
2378
|
+
this.txtService = new dns_txt_1.default();
|
|
2379
|
+
if (!config.name) throw new Error("ServiceConfig requires `name` property to be set");
|
|
2380
|
+
if (!config.type) throw new Error("ServiceConfig requires `type` property to be set");
|
|
2381
|
+
if (!config.port) throw new Error("ServiceConfig requires `port` property to be set");
|
|
2382
|
+
this.name = config.name.split(".").join("-");
|
|
2383
|
+
this.protocol = config.protocol || "tcp";
|
|
2384
|
+
this.type = (0, service_types_1.toString)({
|
|
2385
|
+
name: config.type,
|
|
2386
|
+
protocol: this.protocol
|
|
2387
|
+
});
|
|
2388
|
+
this.port = config.port;
|
|
2389
|
+
this.host = config.host || os_1.default.hostname();
|
|
2390
|
+
this.fqdn = `${this.name}.${this.type}${TLD}`;
|
|
2391
|
+
this.txt = config.txt;
|
|
2392
|
+
this.subtypes = config.subtypes;
|
|
2393
|
+
this.disableIPv6 = !!config.disableIPv6;
|
|
2394
|
+
}
|
|
2395
|
+
records() {
|
|
2396
|
+
var records = [
|
|
2397
|
+
this.RecordPTR(this),
|
|
2398
|
+
this.RecordSRV(this),
|
|
2399
|
+
this.RecordTXT(this),
|
|
2400
|
+
this.RecordServicePTR(this)
|
|
2401
|
+
];
|
|
2402
|
+
for (let subtype of this.subtypes || []) records.push(this.RecordSubtypePTR(this, subtype));
|
|
2403
|
+
let ifaces = Object.values(os_1.default.networkInterfaces());
|
|
2404
|
+
for (let iface of ifaces) {
|
|
2405
|
+
let addrs = iface;
|
|
2406
|
+
for (let addr of addrs) {
|
|
2407
|
+
if (addr.internal || addr.mac === "00:00:00:00:00:00") continue;
|
|
2408
|
+
switch (addr.family) {
|
|
2409
|
+
case "IPv4":
|
|
2410
|
+
records.push(this.RecordA(this, addr.address));
|
|
2411
|
+
break;
|
|
2412
|
+
case "IPv6":
|
|
2413
|
+
if (this.disableIPv6) break;
|
|
2414
|
+
records.push(this.RecordAAAA(this, addr.address));
|
|
2415
|
+
}
|
|
2416
|
+
}
|
|
2417
|
+
}
|
|
2418
|
+
return records;
|
|
2419
|
+
}
|
|
2420
|
+
RecordPTR(service) {
|
|
2421
|
+
return {
|
|
2422
|
+
name: `${service.type}${TLD}`,
|
|
2423
|
+
type: "PTR",
|
|
2424
|
+
ttl: 28800,
|
|
2425
|
+
data: service.fqdn
|
|
2426
|
+
};
|
|
2427
|
+
}
|
|
2428
|
+
RecordServicePTR(service) {
|
|
2429
|
+
return {
|
|
2430
|
+
name: `_services._dns-sd._udp${TLD}`,
|
|
2431
|
+
type: "PTR",
|
|
2432
|
+
ttl: 120,
|
|
2433
|
+
data: `${service.type}${TLD}`
|
|
2434
|
+
};
|
|
2435
|
+
}
|
|
2436
|
+
RecordSubtypePTR(service, subtype) {
|
|
2437
|
+
return {
|
|
2438
|
+
name: `_${subtype}._sub.${service.type}${TLD}`,
|
|
2439
|
+
type: "PTR",
|
|
2440
|
+
ttl: 28800,
|
|
2441
|
+
data: `${service.name}.${service.type}${TLD}`
|
|
2442
|
+
};
|
|
2443
|
+
}
|
|
2444
|
+
RecordSRV(service) {
|
|
2445
|
+
return {
|
|
2446
|
+
name: service.fqdn,
|
|
2447
|
+
type: "SRV",
|
|
2448
|
+
ttl: 120,
|
|
2449
|
+
data: {
|
|
2450
|
+
port: service.port,
|
|
2451
|
+
target: service.host
|
|
2452
|
+
}
|
|
2453
|
+
};
|
|
2454
|
+
}
|
|
2455
|
+
RecordTXT(service) {
|
|
2456
|
+
return {
|
|
2457
|
+
name: service.fqdn,
|
|
2458
|
+
type: "TXT",
|
|
2459
|
+
ttl: 4500,
|
|
2460
|
+
data: this.txtService.encode(service.txt)
|
|
2461
|
+
};
|
|
2462
|
+
}
|
|
2463
|
+
RecordA(service, ip) {
|
|
2464
|
+
return {
|
|
2465
|
+
name: service.host,
|
|
2466
|
+
type: "A",
|
|
2467
|
+
ttl: 120,
|
|
2468
|
+
data: ip
|
|
2469
|
+
};
|
|
2470
|
+
}
|
|
2471
|
+
RecordAAAA(service, ip) {
|
|
2472
|
+
return {
|
|
2473
|
+
name: service.host,
|
|
2474
|
+
type: "AAAA",
|
|
2475
|
+
ttl: 120,
|
|
2476
|
+
data: ip
|
|
2477
|
+
};
|
|
2478
|
+
}
|
|
2479
|
+
};
|
|
2480
|
+
exports.Service = Service;
|
|
2481
|
+
exports.default = Service;
|
|
2482
|
+
}));
|
|
2483
|
+
//#endregion
|
|
2484
|
+
//#region ../../node_modules/bonjour-service/dist/lib/registry.js
|
|
2485
|
+
var require_registry = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
2486
|
+
var __importDefault = exports && exports.__importDefault || function(mod) {
|
|
2487
|
+
return mod && mod.__esModule ? mod : { "default": mod };
|
|
2488
|
+
};
|
|
2489
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
2490
|
+
exports.Registry = void 0;
|
|
2491
|
+
const dns_equal_1 = __importDefault(require_dns_equal());
|
|
2492
|
+
const service_1 = __importDefault(require_service());
|
|
2493
|
+
const REANNOUNCE_MAX_MS = 36e5;
|
|
2494
|
+
const REANNOUNCE_FACTOR = 3;
|
|
2495
|
+
const noop = function() {};
|
|
2496
|
+
var Registry = class {
|
|
2497
|
+
constructor(server) {
|
|
2498
|
+
this.services = [];
|
|
2499
|
+
this.server = server;
|
|
2500
|
+
}
|
|
2501
|
+
publish(config) {
|
|
2502
|
+
const configProbe = config.probe !== false;
|
|
2503
|
+
const service = new service_1.default(config, start.bind(null, this), stop.bind(null, this));
|
|
2504
|
+
function start(registry, { probe = configProbe } = {}) {
|
|
2505
|
+
if (service.activated) return;
|
|
2506
|
+
service.activated = true;
|
|
2507
|
+
registry.services.push(service);
|
|
2508
|
+
if (!(service instanceof service_1.default)) return;
|
|
2509
|
+
if (probe) registry.probe(registry.server.mdns, service, (exists) => {
|
|
2510
|
+
if (exists) {
|
|
2511
|
+
if (service.stop !== void 0) service.stop();
|
|
2512
|
+
console.log(/* @__PURE__ */ new Error("Service name is already in use on the network"));
|
|
2513
|
+
return;
|
|
2514
|
+
}
|
|
2515
|
+
registry.announce(registry.server, service);
|
|
2516
|
+
});
|
|
2517
|
+
else registry.announce(registry.server, service);
|
|
2518
|
+
}
|
|
2519
|
+
function stop(registry, callback) {
|
|
2520
|
+
if (!callback) callback = noop;
|
|
2521
|
+
if (!service.activated) return process.nextTick(callback);
|
|
2522
|
+
if (!(service instanceof service_1.default)) return process.nextTick(callback);
|
|
2523
|
+
registry.teardown(registry.server, service, callback);
|
|
2524
|
+
const index = registry.services.indexOf(service);
|
|
2525
|
+
if (index !== -1) registry.services.splice(index, 1);
|
|
2526
|
+
}
|
|
2527
|
+
service.start();
|
|
2528
|
+
return service;
|
|
2529
|
+
}
|
|
2530
|
+
unpublishAll(callback) {
|
|
2531
|
+
this.teardown(this.server, this.services, callback);
|
|
2532
|
+
this.services = [];
|
|
2533
|
+
}
|
|
2534
|
+
destroy() {
|
|
2535
|
+
this.services.map((service) => service.destroyed = true);
|
|
2536
|
+
}
|
|
2537
|
+
probe(mdns, service, callback) {
|
|
2538
|
+
var sent = false;
|
|
2539
|
+
var retries = 0;
|
|
2540
|
+
var timer;
|
|
2541
|
+
const send = () => {
|
|
2542
|
+
if (!service.activated || service.destroyed) return;
|
|
2543
|
+
mdns.query(service.fqdn, "ANY", function() {
|
|
2544
|
+
sent = true;
|
|
2545
|
+
timer = setTimeout(++retries < 3 ? send : done, 250);
|
|
2546
|
+
timer.unref();
|
|
2547
|
+
});
|
|
2548
|
+
};
|
|
2549
|
+
const onresponse = (packet) => {
|
|
2550
|
+
if (!sent) return;
|
|
2551
|
+
if (packet.answers.some(matchRR) || packet.additionals.some(matchRR)) done(true);
|
|
2552
|
+
};
|
|
2553
|
+
const matchRR = (rr) => {
|
|
2554
|
+
return (0, dns_equal_1.default)(rr.name, service.fqdn);
|
|
2555
|
+
};
|
|
2556
|
+
const done = (exists) => {
|
|
2557
|
+
mdns.removeListener("response", onresponse);
|
|
2558
|
+
clearTimeout(timer);
|
|
2559
|
+
callback(!!exists);
|
|
2560
|
+
};
|
|
2561
|
+
mdns.on("response", onresponse);
|
|
2562
|
+
setTimeout(send, Math.random() * 250);
|
|
2563
|
+
}
|
|
2564
|
+
announce(server, service) {
|
|
2565
|
+
var delay = 1e3;
|
|
2566
|
+
var packet = service.records();
|
|
2567
|
+
server.register(packet);
|
|
2568
|
+
const broadcast = () => {
|
|
2569
|
+
if (!service.activated || service.destroyed) return;
|
|
2570
|
+
server.mdns.respond(packet, function() {
|
|
2571
|
+
if (!service.published) {
|
|
2572
|
+
service.activated = true;
|
|
2573
|
+
service.published = true;
|
|
2574
|
+
service.emit("up");
|
|
2575
|
+
}
|
|
2576
|
+
delay = delay * REANNOUNCE_FACTOR;
|
|
2577
|
+
if (delay < REANNOUNCE_MAX_MS && !service.destroyed) setTimeout(broadcast, delay).unref();
|
|
2578
|
+
});
|
|
2579
|
+
};
|
|
2580
|
+
broadcast();
|
|
2581
|
+
}
|
|
2582
|
+
teardown(server, services, callback) {
|
|
2583
|
+
if (!Array.isArray(services)) services = [services];
|
|
2584
|
+
services = services.filter((service) => service.activated);
|
|
2585
|
+
var records = services.flatMap(function(service) {
|
|
2586
|
+
service.activated = false;
|
|
2587
|
+
var records = service.records();
|
|
2588
|
+
records.forEach((record) => {
|
|
2589
|
+
record.ttl = 0;
|
|
2590
|
+
});
|
|
2591
|
+
return records;
|
|
2592
|
+
});
|
|
2593
|
+
if (records.length === 0) return callback && process.nextTick(callback);
|
|
2594
|
+
server.unregister(records);
|
|
2595
|
+
server.mdns.respond(records, function() {
|
|
2596
|
+
services.forEach(function(service) {
|
|
2597
|
+
service.published = false;
|
|
2598
|
+
});
|
|
2599
|
+
if (typeof callback === "function") callback.apply(null, arguments);
|
|
2600
|
+
});
|
|
2601
|
+
}
|
|
2602
|
+
};
|
|
2603
|
+
exports.Registry = Registry;
|
|
2604
|
+
exports.default = Registry;
|
|
2605
|
+
}));
|
|
2606
|
+
//#endregion
|
|
2607
|
+
//#region ../../node_modules/dns-packet/types.js
|
|
2608
|
+
var require_types = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
2609
|
+
exports.toString = function(type) {
|
|
2610
|
+
switch (type) {
|
|
2611
|
+
case 1: return "A";
|
|
2612
|
+
case 10: return "NULL";
|
|
2613
|
+
case 28: return "AAAA";
|
|
2614
|
+
case 18: return "AFSDB";
|
|
2615
|
+
case 42: return "APL";
|
|
2616
|
+
case 257: return "CAA";
|
|
2617
|
+
case 60: return "CDNSKEY";
|
|
2618
|
+
case 59: return "CDS";
|
|
2619
|
+
case 37: return "CERT";
|
|
2620
|
+
case 5: return "CNAME";
|
|
2621
|
+
case 49: return "DHCID";
|
|
2622
|
+
case 32769: return "DLV";
|
|
2623
|
+
case 39: return "DNAME";
|
|
2624
|
+
case 48: return "DNSKEY";
|
|
2625
|
+
case 43: return "DS";
|
|
2626
|
+
case 55: return "HIP";
|
|
2627
|
+
case 13: return "HINFO";
|
|
2628
|
+
case 45: return "IPSECKEY";
|
|
2629
|
+
case 25: return "KEY";
|
|
2630
|
+
case 36: return "KX";
|
|
2631
|
+
case 29: return "LOC";
|
|
2632
|
+
case 15: return "MX";
|
|
2633
|
+
case 35: return "NAPTR";
|
|
2634
|
+
case 2: return "NS";
|
|
2635
|
+
case 47: return "NSEC";
|
|
2636
|
+
case 50: return "NSEC3";
|
|
2637
|
+
case 51: return "NSEC3PARAM";
|
|
2638
|
+
case 12: return "PTR";
|
|
2639
|
+
case 46: return "RRSIG";
|
|
2640
|
+
case 17: return "RP";
|
|
2641
|
+
case 24: return "SIG";
|
|
2642
|
+
case 6: return "SOA";
|
|
2643
|
+
case 99: return "SPF";
|
|
2644
|
+
case 33: return "SRV";
|
|
2645
|
+
case 44: return "SSHFP";
|
|
2646
|
+
case 32768: return "TA";
|
|
2647
|
+
case 249: return "TKEY";
|
|
2648
|
+
case 52: return "TLSA";
|
|
2649
|
+
case 250: return "TSIG";
|
|
2650
|
+
case 16: return "TXT";
|
|
2651
|
+
case 252: return "AXFR";
|
|
2652
|
+
case 251: return "IXFR";
|
|
2653
|
+
case 41: return "OPT";
|
|
2654
|
+
case 255: return "ANY";
|
|
2655
|
+
}
|
|
2656
|
+
return "UNKNOWN_" + type;
|
|
2657
|
+
};
|
|
2658
|
+
exports.toType = function(name) {
|
|
2659
|
+
switch (name.toUpperCase()) {
|
|
2660
|
+
case "A": return 1;
|
|
2661
|
+
case "NULL": return 10;
|
|
2662
|
+
case "AAAA": return 28;
|
|
2663
|
+
case "AFSDB": return 18;
|
|
2664
|
+
case "APL": return 42;
|
|
2665
|
+
case "CAA": return 257;
|
|
2666
|
+
case "CDNSKEY": return 60;
|
|
2667
|
+
case "CDS": return 59;
|
|
2668
|
+
case "CERT": return 37;
|
|
2669
|
+
case "CNAME": return 5;
|
|
2670
|
+
case "DHCID": return 49;
|
|
2671
|
+
case "DLV": return 32769;
|
|
2672
|
+
case "DNAME": return 39;
|
|
2673
|
+
case "DNSKEY": return 48;
|
|
2674
|
+
case "DS": return 43;
|
|
2675
|
+
case "HIP": return 55;
|
|
2676
|
+
case "HINFO": return 13;
|
|
2677
|
+
case "IPSECKEY": return 45;
|
|
2678
|
+
case "KEY": return 25;
|
|
2679
|
+
case "KX": return 36;
|
|
2680
|
+
case "LOC": return 29;
|
|
2681
|
+
case "MX": return 15;
|
|
2682
|
+
case "NAPTR": return 35;
|
|
2683
|
+
case "NS": return 2;
|
|
2684
|
+
case "NSEC": return 47;
|
|
2685
|
+
case "NSEC3": return 50;
|
|
2686
|
+
case "NSEC3PARAM": return 51;
|
|
2687
|
+
case "PTR": return 12;
|
|
2688
|
+
case "RRSIG": return 46;
|
|
2689
|
+
case "RP": return 17;
|
|
2690
|
+
case "SIG": return 24;
|
|
2691
|
+
case "SOA": return 6;
|
|
2692
|
+
case "SPF": return 99;
|
|
2693
|
+
case "SRV": return 33;
|
|
2694
|
+
case "SSHFP": return 44;
|
|
2695
|
+
case "TA": return 32768;
|
|
2696
|
+
case "TKEY": return 249;
|
|
2697
|
+
case "TLSA": return 52;
|
|
2698
|
+
case "TSIG": return 250;
|
|
2699
|
+
case "TXT": return 16;
|
|
2700
|
+
case "AXFR": return 252;
|
|
2701
|
+
case "IXFR": return 251;
|
|
2702
|
+
case "OPT": return 41;
|
|
2703
|
+
case "ANY": return 255;
|
|
2704
|
+
case "*": return 255;
|
|
2705
|
+
}
|
|
2706
|
+
if (name.toUpperCase().startsWith("UNKNOWN_")) return parseInt(name.slice(8));
|
|
2707
|
+
return 0;
|
|
2708
|
+
};
|
|
2709
|
+
}));
|
|
2710
|
+
//#endregion
|
|
2711
|
+
//#region ../../node_modules/dns-packet/rcodes.js
|
|
2712
|
+
var require_rcodes = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
2713
|
+
exports.toString = function(rcode) {
|
|
2714
|
+
switch (rcode) {
|
|
2715
|
+
case 0: return "NOERROR";
|
|
2716
|
+
case 1: return "FORMERR";
|
|
2717
|
+
case 2: return "SERVFAIL";
|
|
2718
|
+
case 3: return "NXDOMAIN";
|
|
2719
|
+
case 4: return "NOTIMP";
|
|
2720
|
+
case 5: return "REFUSED";
|
|
2721
|
+
case 6: return "YXDOMAIN";
|
|
2722
|
+
case 7: return "YXRRSET";
|
|
2723
|
+
case 8: return "NXRRSET";
|
|
2724
|
+
case 9: return "NOTAUTH";
|
|
2725
|
+
case 10: return "NOTZONE";
|
|
2726
|
+
case 11: return "RCODE_11";
|
|
2727
|
+
case 12: return "RCODE_12";
|
|
2728
|
+
case 13: return "RCODE_13";
|
|
2729
|
+
case 14: return "RCODE_14";
|
|
2730
|
+
case 15: return "RCODE_15";
|
|
2731
|
+
}
|
|
2732
|
+
return "RCODE_" + rcode;
|
|
2733
|
+
};
|
|
2734
|
+
exports.toRcode = function(code) {
|
|
2735
|
+
switch (code.toUpperCase()) {
|
|
2736
|
+
case "NOERROR": return 0;
|
|
2737
|
+
case "FORMERR": return 1;
|
|
2738
|
+
case "SERVFAIL": return 2;
|
|
2739
|
+
case "NXDOMAIN": return 3;
|
|
2740
|
+
case "NOTIMP": return 4;
|
|
2741
|
+
case "REFUSED": return 5;
|
|
2742
|
+
case "YXDOMAIN": return 6;
|
|
2743
|
+
case "YXRRSET": return 7;
|
|
2744
|
+
case "NXRRSET": return 8;
|
|
2745
|
+
case "NOTAUTH": return 9;
|
|
2746
|
+
case "NOTZONE": return 10;
|
|
2747
|
+
case "RCODE_11": return 11;
|
|
2748
|
+
case "RCODE_12": return 12;
|
|
2749
|
+
case "RCODE_13": return 13;
|
|
2750
|
+
case "RCODE_14": return 14;
|
|
2751
|
+
case "RCODE_15": return 15;
|
|
2752
|
+
}
|
|
2753
|
+
return 0;
|
|
2754
|
+
};
|
|
2755
|
+
}));
|
|
2756
|
+
//#endregion
|
|
2757
|
+
//#region ../../node_modules/dns-packet/opcodes.js
|
|
2758
|
+
var require_opcodes = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
2759
|
+
exports.toString = function(opcode) {
|
|
2760
|
+
switch (opcode) {
|
|
2761
|
+
case 0: return "QUERY";
|
|
2762
|
+
case 1: return "IQUERY";
|
|
2763
|
+
case 2: return "STATUS";
|
|
2764
|
+
case 3: return "OPCODE_3";
|
|
2765
|
+
case 4: return "NOTIFY";
|
|
2766
|
+
case 5: return "UPDATE";
|
|
2767
|
+
case 6: return "OPCODE_6";
|
|
2768
|
+
case 7: return "OPCODE_7";
|
|
2769
|
+
case 8: return "OPCODE_8";
|
|
2770
|
+
case 9: return "OPCODE_9";
|
|
2771
|
+
case 10: return "OPCODE_10";
|
|
2772
|
+
case 11: return "OPCODE_11";
|
|
2773
|
+
case 12: return "OPCODE_12";
|
|
2774
|
+
case 13: return "OPCODE_13";
|
|
2775
|
+
case 14: return "OPCODE_14";
|
|
2776
|
+
case 15: return "OPCODE_15";
|
|
2777
|
+
}
|
|
2778
|
+
return "OPCODE_" + opcode;
|
|
2779
|
+
};
|
|
2780
|
+
exports.toOpcode = function(code) {
|
|
2781
|
+
switch (code.toUpperCase()) {
|
|
2782
|
+
case "QUERY": return 0;
|
|
2783
|
+
case "IQUERY": return 1;
|
|
2784
|
+
case "STATUS": return 2;
|
|
2785
|
+
case "OPCODE_3": return 3;
|
|
2786
|
+
case "NOTIFY": return 4;
|
|
2787
|
+
case "UPDATE": return 5;
|
|
2788
|
+
case "OPCODE_6": return 6;
|
|
2789
|
+
case "OPCODE_7": return 7;
|
|
2790
|
+
case "OPCODE_8": return 8;
|
|
2791
|
+
case "OPCODE_9": return 9;
|
|
2792
|
+
case "OPCODE_10": return 10;
|
|
2793
|
+
case "OPCODE_11": return 11;
|
|
2794
|
+
case "OPCODE_12": return 12;
|
|
2795
|
+
case "OPCODE_13": return 13;
|
|
2796
|
+
case "OPCODE_14": return 14;
|
|
2797
|
+
case "OPCODE_15": return 15;
|
|
2798
|
+
}
|
|
2799
|
+
return 0;
|
|
2800
|
+
};
|
|
2801
|
+
}));
|
|
2802
|
+
//#endregion
|
|
2803
|
+
//#region ../../node_modules/dns-packet/classes.js
|
|
2804
|
+
var require_classes = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
2805
|
+
exports.toString = function(klass) {
|
|
2806
|
+
switch (klass) {
|
|
2807
|
+
case 1: return "IN";
|
|
2808
|
+
case 2: return "CS";
|
|
2809
|
+
case 3: return "CH";
|
|
2810
|
+
case 4: return "HS";
|
|
2811
|
+
case 255: return "ANY";
|
|
2812
|
+
}
|
|
2813
|
+
return "UNKNOWN_" + klass;
|
|
2814
|
+
};
|
|
2815
|
+
exports.toClass = function(name) {
|
|
2816
|
+
switch (name.toUpperCase()) {
|
|
2817
|
+
case "IN": return 1;
|
|
2818
|
+
case "CS": return 2;
|
|
2819
|
+
case "CH": return 3;
|
|
2820
|
+
case "HS": return 4;
|
|
2821
|
+
case "ANY": return 255;
|
|
2822
|
+
}
|
|
2823
|
+
return 0;
|
|
2824
|
+
};
|
|
2825
|
+
}));
|
|
2826
|
+
//#endregion
|
|
2827
|
+
//#region ../../node_modules/dns-packet/optioncodes.js
|
|
2828
|
+
var require_optioncodes = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
2829
|
+
exports.toString = function(type) {
|
|
2830
|
+
switch (type) {
|
|
2831
|
+
case 1: return "LLQ";
|
|
2832
|
+
case 2: return "UL";
|
|
2833
|
+
case 3: return "NSID";
|
|
2834
|
+
case 5: return "DAU";
|
|
2835
|
+
case 6: return "DHU";
|
|
2836
|
+
case 7: return "N3U";
|
|
2837
|
+
case 8: return "CLIENT_SUBNET";
|
|
2838
|
+
case 9: return "EXPIRE";
|
|
2839
|
+
case 10: return "COOKIE";
|
|
2840
|
+
case 11: return "TCP_KEEPALIVE";
|
|
2841
|
+
case 12: return "PADDING";
|
|
2842
|
+
case 13: return "CHAIN";
|
|
2843
|
+
case 14: return "KEY_TAG";
|
|
2844
|
+
case 26946: return "DEVICEID";
|
|
2845
|
+
}
|
|
2846
|
+
if (type < 0) return null;
|
|
2847
|
+
return `OPTION_${type}`;
|
|
2848
|
+
};
|
|
2849
|
+
exports.toCode = function(name) {
|
|
2850
|
+
if (typeof name === "number") return name;
|
|
2851
|
+
if (!name) return -1;
|
|
2852
|
+
switch (name.toUpperCase()) {
|
|
2853
|
+
case "OPTION_0": return 0;
|
|
2854
|
+
case "LLQ": return 1;
|
|
2855
|
+
case "UL": return 2;
|
|
2856
|
+
case "NSID": return 3;
|
|
2857
|
+
case "OPTION_4": return 4;
|
|
2858
|
+
case "DAU": return 5;
|
|
2859
|
+
case "DHU": return 6;
|
|
2860
|
+
case "N3U": return 7;
|
|
2861
|
+
case "CLIENT_SUBNET": return 8;
|
|
2862
|
+
case "EXPIRE": return 9;
|
|
2863
|
+
case "COOKIE": return 10;
|
|
2864
|
+
case "TCP_KEEPALIVE": return 11;
|
|
2865
|
+
case "PADDING": return 12;
|
|
2866
|
+
case "CHAIN": return 13;
|
|
2867
|
+
case "KEY_TAG": return 14;
|
|
2868
|
+
case "DEVICEID": return 26946;
|
|
2869
|
+
case "OPTION_65535": return 65535;
|
|
2870
|
+
}
|
|
2871
|
+
const m = name.match(/_(\d+)$/);
|
|
2872
|
+
if (m) return parseInt(m[1], 10);
|
|
2873
|
+
return -1;
|
|
2874
|
+
};
|
|
2875
|
+
}));
|
|
2876
|
+
//#endregion
|
|
2877
|
+
//#region ../../node_modules/@leichtgewicht/ip-codec/index.cjs
|
|
2878
|
+
var require_ip_codec = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
2879
|
+
var ipCodec = (function(exports$1) {
|
|
2880
|
+
"use strict";
|
|
2881
|
+
Object.defineProperty(exports$1, "__esModule", { value: true });
|
|
2882
|
+
exports$1.decode = decode;
|
|
2883
|
+
exports$1.encode = encode;
|
|
2884
|
+
exports$1.familyOf = familyOf;
|
|
2885
|
+
exports$1.name = void 0;
|
|
2886
|
+
exports$1.sizeOf = sizeOf;
|
|
2887
|
+
exports$1.v6 = exports$1.v4 = void 0;
|
|
2888
|
+
const v4Regex = /^(\d{1,3}\.){3,3}\d{1,3}$/;
|
|
2889
|
+
const v4Size = 4;
|
|
2890
|
+
const v6Regex = /^(::)?(((\d{1,3}\.){3}(\d{1,3}){1})?([0-9a-f]){0,4}:{0,2}){1,8}(::)?$/i;
|
|
2891
|
+
const v6Size = 16;
|
|
2892
|
+
const v4 = {
|
|
2893
|
+
name: "v4",
|
|
2894
|
+
size: v4Size,
|
|
2895
|
+
isFormat: (ip) => v4Regex.test(ip),
|
|
2896
|
+
encode(ip, buff, offset) {
|
|
2897
|
+
offset = ~~offset;
|
|
2898
|
+
buff = buff || new Uint8Array(offset + v4Size);
|
|
2899
|
+
const max = ip.length;
|
|
2900
|
+
let n = 0;
|
|
2901
|
+
for (let i = 0; i < max;) {
|
|
2902
|
+
const c = ip.charCodeAt(i++);
|
|
2903
|
+
if (c === 46) {
|
|
2904
|
+
buff[offset++] = n;
|
|
2905
|
+
n = 0;
|
|
2906
|
+
} else n = n * 10 + (c - 48);
|
|
2907
|
+
}
|
|
2908
|
+
buff[offset] = n;
|
|
2909
|
+
return buff;
|
|
2910
|
+
},
|
|
2911
|
+
decode(buff, offset) {
|
|
2912
|
+
offset = ~~offset;
|
|
2913
|
+
return `${buff[offset++]}.${buff[offset++]}.${buff[offset++]}.${buff[offset]}`;
|
|
2914
|
+
}
|
|
2915
|
+
};
|
|
2916
|
+
exports$1.v4 = v4;
|
|
2917
|
+
const v6 = {
|
|
2918
|
+
name: "v6",
|
|
2919
|
+
size: v6Size,
|
|
2920
|
+
isFormat: (ip) => ip.length > 0 && v6Regex.test(ip),
|
|
2921
|
+
encode(ip, buff, offset) {
|
|
2922
|
+
offset = ~~offset;
|
|
2923
|
+
let end = offset + v6Size;
|
|
2924
|
+
let fill = -1;
|
|
2925
|
+
let hexN = 0;
|
|
2926
|
+
let decN = 0;
|
|
2927
|
+
let prevColon = true;
|
|
2928
|
+
let useDec = false;
|
|
2929
|
+
buff = buff || new Uint8Array(offset + v6Size);
|
|
2930
|
+
for (let i = 0; i < ip.length; i++) {
|
|
2931
|
+
let c = ip.charCodeAt(i);
|
|
2932
|
+
if (c === 58) {
|
|
2933
|
+
if (prevColon) {
|
|
2934
|
+
if (fill !== -1) {
|
|
2935
|
+
if (offset < end) buff[offset] = 0;
|
|
2936
|
+
if (offset < end - 1) buff[offset + 1] = 0;
|
|
2937
|
+
offset += 2;
|
|
2938
|
+
} else if (offset < end) fill = offset;
|
|
2939
|
+
} else {
|
|
2940
|
+
if (useDec === true) {
|
|
2941
|
+
if (offset < end) buff[offset] = decN;
|
|
2942
|
+
offset++;
|
|
2943
|
+
} else {
|
|
2944
|
+
if (offset < end) buff[offset] = hexN >> 8;
|
|
2945
|
+
if (offset < end - 1) buff[offset + 1] = hexN & 255;
|
|
2946
|
+
offset += 2;
|
|
2947
|
+
}
|
|
2948
|
+
hexN = 0;
|
|
2949
|
+
decN = 0;
|
|
2950
|
+
}
|
|
2951
|
+
prevColon = true;
|
|
2952
|
+
useDec = false;
|
|
2953
|
+
} else if (c === 46) {
|
|
2954
|
+
if (offset < end) buff[offset] = decN;
|
|
2955
|
+
offset++;
|
|
2956
|
+
decN = 0;
|
|
2957
|
+
hexN = 0;
|
|
2958
|
+
prevColon = false;
|
|
2959
|
+
useDec = true;
|
|
2960
|
+
} else {
|
|
2961
|
+
prevColon = false;
|
|
2962
|
+
if (c >= 97) c -= 87;
|
|
2963
|
+
else if (c >= 65) c -= 55;
|
|
2964
|
+
else {
|
|
2965
|
+
c -= 48;
|
|
2966
|
+
decN = decN * 10 + c;
|
|
2967
|
+
}
|
|
2968
|
+
hexN = (hexN << 4) + c;
|
|
2969
|
+
}
|
|
2970
|
+
}
|
|
2971
|
+
if (prevColon === false) {
|
|
2972
|
+
if (useDec === true) {
|
|
2973
|
+
if (offset < end) buff[offset] = decN;
|
|
2974
|
+
offset++;
|
|
2975
|
+
} else {
|
|
2976
|
+
if (offset < end) buff[offset] = hexN >> 8;
|
|
2977
|
+
if (offset < end - 1) buff[offset + 1] = hexN & 255;
|
|
2978
|
+
offset += 2;
|
|
2979
|
+
}
|
|
2980
|
+
} else if (fill === 0) {
|
|
2981
|
+
if (offset < end) buff[offset] = 0;
|
|
2982
|
+
if (offset < end - 1) buff[offset + 1] = 0;
|
|
2983
|
+
offset += 2;
|
|
2984
|
+
} else if (fill !== -1) {
|
|
2985
|
+
offset += 2;
|
|
2986
|
+
for (let i = Math.min(offset - 1, end - 1); i >= fill + 2; i--) buff[i] = buff[i - 2];
|
|
2987
|
+
buff[fill] = 0;
|
|
2988
|
+
buff[fill + 1] = 0;
|
|
2989
|
+
fill = offset;
|
|
2990
|
+
}
|
|
2991
|
+
if (fill !== offset && fill !== -1) {
|
|
2992
|
+
if (offset > end - 2) offset = end - 2;
|
|
2993
|
+
while (end > fill) buff[--end] = offset < end && offset > fill ? buff[--offset] : 0;
|
|
2994
|
+
} else while (offset < end) buff[offset++] = 0;
|
|
2995
|
+
return buff;
|
|
2996
|
+
},
|
|
2997
|
+
decode(buff, offset) {
|
|
2998
|
+
offset = ~~offset;
|
|
2999
|
+
let result = "";
|
|
3000
|
+
for (let i = 0; i < v6Size; i += 2) {
|
|
3001
|
+
if (i !== 0) result += ":";
|
|
3002
|
+
result += (buff[offset + i] << 8 | buff[offset + i + 1]).toString(16);
|
|
3003
|
+
}
|
|
3004
|
+
return result.replace(/(^|:)0(:0)*:0(:|$)/, "$1::$3").replace(/:{3,4}/, "::");
|
|
3005
|
+
}
|
|
3006
|
+
};
|
|
3007
|
+
exports$1.v6 = v6;
|
|
3008
|
+
exports$1.name = "ip";
|
|
3009
|
+
function sizeOf(ip) {
|
|
3010
|
+
if (v4.isFormat(ip)) return v4.size;
|
|
3011
|
+
if (v6.isFormat(ip)) return v6.size;
|
|
3012
|
+
throw Error(`Invalid ip address: ${ip}`);
|
|
3013
|
+
}
|
|
3014
|
+
function familyOf(string) {
|
|
3015
|
+
return sizeOf(string) === v4.size ? 1 : 2;
|
|
3016
|
+
}
|
|
3017
|
+
function encode(ip, buff, offset) {
|
|
3018
|
+
offset = ~~offset;
|
|
3019
|
+
const size = sizeOf(ip);
|
|
3020
|
+
if (typeof buff === "function") buff = buff(offset + size);
|
|
3021
|
+
if (size === v4.size) return v4.encode(ip, buff, offset);
|
|
3022
|
+
return v6.encode(ip, buff, offset);
|
|
3023
|
+
}
|
|
3024
|
+
function decode(buff, offset, length) {
|
|
3025
|
+
offset = ~~offset;
|
|
3026
|
+
length = length || buff.length - offset;
|
|
3027
|
+
if (length === v4.size) return v4.decode(buff, offset, length);
|
|
3028
|
+
if (length === v6.size) return v6.decode(buff, offset, length);
|
|
3029
|
+
throw Error(`Invalid buffer size needs to be ${v4.size} for v4 or ${v6.size} for v6.`);
|
|
3030
|
+
}
|
|
3031
|
+
return "default" in exports$1 ? exports$1.default : exports$1;
|
|
3032
|
+
})({});
|
|
3033
|
+
if (typeof define === "function" && define.amd) define([], function() {
|
|
3034
|
+
return ipCodec;
|
|
3035
|
+
});
|
|
3036
|
+
else if (typeof module === "object" && typeof exports === "object") module.exports = ipCodec;
|
|
3037
|
+
}));
|
|
3038
|
+
//#endregion
|
|
3039
|
+
//#region ../../node_modules/dns-packet/index.js
|
|
3040
|
+
var require_dns_packet = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
3041
|
+
const Buffer$1 = __require("buffer").Buffer;
|
|
3042
|
+
const types = require_types();
|
|
3043
|
+
const rcodes = require_rcodes();
|
|
3044
|
+
const opcodes = require_opcodes();
|
|
3045
|
+
const classes = require_classes();
|
|
3046
|
+
const optioncodes = require_optioncodes();
|
|
3047
|
+
const ip = require_ip_codec();
|
|
3048
|
+
const QUERY_FLAG = 0;
|
|
3049
|
+
const RESPONSE_FLAG = 32768;
|
|
3050
|
+
const FLUSH_MASK = 32768;
|
|
3051
|
+
const NOT_FLUSH_MASK = -32769;
|
|
3052
|
+
const QU_MASK = 32768;
|
|
3053
|
+
const NOT_QU_MASK = -32769;
|
|
3054
|
+
const name = exports.name = {};
|
|
3055
|
+
name.encode = function(str, buf, offset, { mail = false } = {}) {
|
|
3056
|
+
if (!buf) buf = Buffer$1.alloc(name.encodingLength(str));
|
|
3057
|
+
if (!offset) offset = 0;
|
|
3058
|
+
const oldOffset = offset;
|
|
3059
|
+
const n = str.replace(/^\.|\.$/gm, "");
|
|
3060
|
+
if (n.length) {
|
|
3061
|
+
let list = [];
|
|
3062
|
+
if (mail) {
|
|
3063
|
+
let localPart = "";
|
|
3064
|
+
n.split(".").forEach((label) => {
|
|
3065
|
+
if (label.endsWith("\\")) localPart += (localPart.length ? "." : "") + label.slice(0, -1);
|
|
3066
|
+
else if (list.length === 0 && localPart.length) list.push(localPart + "." + label);
|
|
3067
|
+
else list.push(label);
|
|
3068
|
+
});
|
|
3069
|
+
} else list = n.split(".");
|
|
3070
|
+
for (let i = 0; i < list.length; i++) {
|
|
3071
|
+
const len = buf.write(list[i], offset + 1);
|
|
3072
|
+
buf[offset] = len;
|
|
3073
|
+
offset += len + 1;
|
|
3074
|
+
}
|
|
3075
|
+
}
|
|
3076
|
+
buf[offset++] = 0;
|
|
3077
|
+
name.encode.bytes = offset - oldOffset;
|
|
3078
|
+
return buf;
|
|
3079
|
+
};
|
|
3080
|
+
name.encode.bytes = 0;
|
|
3081
|
+
name.decode = function(buf, offset, { mail = false } = {}) {
|
|
3082
|
+
if (!offset) offset = 0;
|
|
3083
|
+
const list = [];
|
|
3084
|
+
let oldOffset = offset;
|
|
3085
|
+
let totalLength = 0;
|
|
3086
|
+
let consumedBytes = 0;
|
|
3087
|
+
let jumped = false;
|
|
3088
|
+
while (true) {
|
|
3089
|
+
if (offset >= buf.length) throw new Error("Cannot decode name (buffer overflow)");
|
|
3090
|
+
const len = buf[offset++];
|
|
3091
|
+
consumedBytes += jumped ? 0 : 1;
|
|
3092
|
+
if (len === 0) break;
|
|
3093
|
+
else if ((len & 192) === 0) {
|
|
3094
|
+
if (offset + len > buf.length) throw new Error("Cannot decode name (buffer overflow)");
|
|
3095
|
+
totalLength += len + 1;
|
|
3096
|
+
if (totalLength > 254) throw new Error("Cannot decode name (name too long)");
|
|
3097
|
+
let label = buf.toString("utf-8", offset, offset + len);
|
|
3098
|
+
if (mail) label = label.replace(/\./g, "\\.");
|
|
3099
|
+
list.push(label);
|
|
3100
|
+
offset += len;
|
|
3101
|
+
consumedBytes += jumped ? 0 : len;
|
|
3102
|
+
} else if ((len & 192) === 192) {
|
|
3103
|
+
if (offset + 1 > buf.length) throw new Error("Cannot decode name (buffer overflow)");
|
|
3104
|
+
const jumpOffset = buf.readUInt16BE(offset - 1) - 49152;
|
|
3105
|
+
if (jumpOffset >= oldOffset) throw new Error("Cannot decode name (bad pointer)");
|
|
3106
|
+
offset = jumpOffset;
|
|
3107
|
+
oldOffset = jumpOffset;
|
|
3108
|
+
consumedBytes += jumped ? 0 : 1;
|
|
3109
|
+
jumped = true;
|
|
3110
|
+
} else throw new Error("Cannot decode name (bad label)");
|
|
3111
|
+
}
|
|
3112
|
+
name.decode.bytes = consumedBytes;
|
|
3113
|
+
return list.length === 0 ? "." : list.join(".");
|
|
3114
|
+
};
|
|
3115
|
+
name.decode.bytes = 0;
|
|
3116
|
+
name.encodingLength = function(n) {
|
|
3117
|
+
if (n === "." || n === "..") return 1;
|
|
3118
|
+
return Buffer$1.byteLength(n.replace(/^\.|\.$/gm, "")) + 2;
|
|
3119
|
+
};
|
|
3120
|
+
const string = {};
|
|
3121
|
+
string.encode = function(s, buf, offset) {
|
|
3122
|
+
if (!buf) buf = Buffer$1.alloc(string.encodingLength(s));
|
|
3123
|
+
if (!offset) offset = 0;
|
|
3124
|
+
const len = buf.write(s, offset + 1);
|
|
3125
|
+
buf[offset] = len;
|
|
3126
|
+
string.encode.bytes = len + 1;
|
|
3127
|
+
return buf;
|
|
3128
|
+
};
|
|
3129
|
+
string.encode.bytes = 0;
|
|
3130
|
+
string.decode = function(buf, offset) {
|
|
3131
|
+
if (!offset) offset = 0;
|
|
3132
|
+
const len = buf[offset];
|
|
3133
|
+
const s = buf.toString("utf-8", offset + 1, offset + 1 + len);
|
|
3134
|
+
string.decode.bytes = len + 1;
|
|
3135
|
+
return s;
|
|
3136
|
+
};
|
|
3137
|
+
string.decode.bytes = 0;
|
|
3138
|
+
string.encodingLength = function(s) {
|
|
3139
|
+
return Buffer$1.byteLength(s) + 1;
|
|
3140
|
+
};
|
|
3141
|
+
const header = {};
|
|
3142
|
+
header.encode = function(h, buf, offset) {
|
|
3143
|
+
if (!buf) buf = header.encodingLength(h);
|
|
3144
|
+
if (!offset) offset = 0;
|
|
3145
|
+
const flags = (h.flags || 0) & 32767;
|
|
3146
|
+
const type = h.type === "response" ? RESPONSE_FLAG : QUERY_FLAG;
|
|
3147
|
+
buf.writeUInt16BE(h.id || 0, offset);
|
|
3148
|
+
buf.writeUInt16BE(flags | type, offset + 2);
|
|
3149
|
+
buf.writeUInt16BE(h.questions.length, offset + 4);
|
|
3150
|
+
buf.writeUInt16BE(h.answers.length, offset + 6);
|
|
3151
|
+
buf.writeUInt16BE(h.authorities.length, offset + 8);
|
|
3152
|
+
buf.writeUInt16BE(h.additionals.length, offset + 10);
|
|
3153
|
+
return buf;
|
|
3154
|
+
};
|
|
3155
|
+
header.encode.bytes = 12;
|
|
3156
|
+
header.decode = function(buf, offset) {
|
|
3157
|
+
if (!offset) offset = 0;
|
|
3158
|
+
if (buf.length < 12) throw new Error("Header must be 12 bytes");
|
|
3159
|
+
const flags = buf.readUInt16BE(offset + 2);
|
|
3160
|
+
return {
|
|
3161
|
+
id: buf.readUInt16BE(offset),
|
|
3162
|
+
type: flags & RESPONSE_FLAG ? "response" : "query",
|
|
3163
|
+
flags: flags & 32767,
|
|
3164
|
+
flag_qr: (flags >> 15 & 1) === 1,
|
|
3165
|
+
opcode: opcodes.toString(flags >> 11 & 15),
|
|
3166
|
+
flag_aa: (flags >> 10 & 1) === 1,
|
|
3167
|
+
flag_tc: (flags >> 9 & 1) === 1,
|
|
3168
|
+
flag_rd: (flags >> 8 & 1) === 1,
|
|
3169
|
+
flag_ra: (flags >> 7 & 1) === 1,
|
|
3170
|
+
flag_z: (flags >> 6 & 1) === 1,
|
|
3171
|
+
flag_ad: (flags >> 5 & 1) === 1,
|
|
3172
|
+
flag_cd: (flags >> 4 & 1) === 1,
|
|
3173
|
+
rcode: rcodes.toString(flags & 15),
|
|
3174
|
+
questions: new Array(buf.readUInt16BE(offset + 4)),
|
|
3175
|
+
answers: new Array(buf.readUInt16BE(offset + 6)),
|
|
3176
|
+
authorities: new Array(buf.readUInt16BE(offset + 8)),
|
|
3177
|
+
additionals: new Array(buf.readUInt16BE(offset + 10))
|
|
3178
|
+
};
|
|
3179
|
+
};
|
|
3180
|
+
header.decode.bytes = 12;
|
|
3181
|
+
header.encodingLength = function() {
|
|
3182
|
+
return 12;
|
|
3183
|
+
};
|
|
3184
|
+
const runknown = exports.unknown = {};
|
|
3185
|
+
runknown.encode = function(data, buf, offset) {
|
|
3186
|
+
if (!buf) buf = Buffer$1.alloc(runknown.encodingLength(data));
|
|
3187
|
+
if (!offset) offset = 0;
|
|
3188
|
+
buf.writeUInt16BE(data.length, offset);
|
|
3189
|
+
data.copy(buf, offset + 2);
|
|
3190
|
+
runknown.encode.bytes = data.length + 2;
|
|
3191
|
+
return buf;
|
|
3192
|
+
};
|
|
3193
|
+
runknown.encode.bytes = 0;
|
|
3194
|
+
runknown.decode = function(buf, offset) {
|
|
3195
|
+
if (!offset) offset = 0;
|
|
3196
|
+
const len = buf.readUInt16BE(offset);
|
|
3197
|
+
const data = buf.slice(offset + 2, offset + 2 + len);
|
|
3198
|
+
runknown.decode.bytes = len + 2;
|
|
3199
|
+
return data;
|
|
3200
|
+
};
|
|
3201
|
+
runknown.decode.bytes = 0;
|
|
3202
|
+
runknown.encodingLength = function(data) {
|
|
3203
|
+
return data.length + 2;
|
|
3204
|
+
};
|
|
3205
|
+
const rns = exports.ns = {};
|
|
3206
|
+
rns.encode = function(data, buf, offset) {
|
|
3207
|
+
if (!buf) buf = Buffer$1.alloc(rns.encodingLength(data));
|
|
3208
|
+
if (!offset) offset = 0;
|
|
3209
|
+
name.encode(data, buf, offset + 2);
|
|
3210
|
+
buf.writeUInt16BE(name.encode.bytes, offset);
|
|
3211
|
+
rns.encode.bytes = name.encode.bytes + 2;
|
|
3212
|
+
return buf;
|
|
3213
|
+
};
|
|
3214
|
+
rns.encode.bytes = 0;
|
|
3215
|
+
rns.decode = function(buf, offset) {
|
|
3216
|
+
if (!offset) offset = 0;
|
|
3217
|
+
const len = buf.readUInt16BE(offset);
|
|
3218
|
+
const dd = name.decode(buf, offset + 2);
|
|
3219
|
+
rns.decode.bytes = len + 2;
|
|
3220
|
+
return dd;
|
|
3221
|
+
};
|
|
3222
|
+
rns.decode.bytes = 0;
|
|
3223
|
+
rns.encodingLength = function(data) {
|
|
3224
|
+
return name.encodingLength(data) + 2;
|
|
3225
|
+
};
|
|
3226
|
+
const rsoa = exports.soa = {};
|
|
3227
|
+
rsoa.encode = function(data, buf, offset) {
|
|
3228
|
+
if (!buf) buf = Buffer$1.alloc(rsoa.encodingLength(data));
|
|
3229
|
+
if (!offset) offset = 0;
|
|
3230
|
+
const oldOffset = offset;
|
|
3231
|
+
offset += 2;
|
|
3232
|
+
name.encode(data.mname, buf, offset);
|
|
3233
|
+
offset += name.encode.bytes;
|
|
3234
|
+
name.encode(data.rname, buf, offset, { mail: true });
|
|
3235
|
+
offset += name.encode.bytes;
|
|
3236
|
+
buf.writeUInt32BE(data.serial || 0, offset);
|
|
3237
|
+
offset += 4;
|
|
3238
|
+
buf.writeUInt32BE(data.refresh || 0, offset);
|
|
3239
|
+
offset += 4;
|
|
3240
|
+
buf.writeUInt32BE(data.retry || 0, offset);
|
|
3241
|
+
offset += 4;
|
|
3242
|
+
buf.writeUInt32BE(data.expire || 0, offset);
|
|
3243
|
+
offset += 4;
|
|
3244
|
+
buf.writeUInt32BE(data.minimum || 0, offset);
|
|
3245
|
+
offset += 4;
|
|
3246
|
+
buf.writeUInt16BE(offset - oldOffset - 2, oldOffset);
|
|
3247
|
+
rsoa.encode.bytes = offset - oldOffset;
|
|
3248
|
+
return buf;
|
|
3249
|
+
};
|
|
3250
|
+
rsoa.encode.bytes = 0;
|
|
3251
|
+
rsoa.decode = function(buf, offset) {
|
|
3252
|
+
if (!offset) offset = 0;
|
|
3253
|
+
const oldOffset = offset;
|
|
3254
|
+
const data = {};
|
|
3255
|
+
offset += 2;
|
|
3256
|
+
data.mname = name.decode(buf, offset);
|
|
3257
|
+
offset += name.decode.bytes;
|
|
3258
|
+
data.rname = name.decode(buf, offset, { mail: true });
|
|
3259
|
+
offset += name.decode.bytes;
|
|
3260
|
+
data.serial = buf.readUInt32BE(offset);
|
|
3261
|
+
offset += 4;
|
|
3262
|
+
data.refresh = buf.readUInt32BE(offset);
|
|
3263
|
+
offset += 4;
|
|
3264
|
+
data.retry = buf.readUInt32BE(offset);
|
|
3265
|
+
offset += 4;
|
|
3266
|
+
data.expire = buf.readUInt32BE(offset);
|
|
3267
|
+
offset += 4;
|
|
3268
|
+
data.minimum = buf.readUInt32BE(offset);
|
|
3269
|
+
offset += 4;
|
|
3270
|
+
rsoa.decode.bytes = offset - oldOffset;
|
|
3271
|
+
return data;
|
|
3272
|
+
};
|
|
3273
|
+
rsoa.decode.bytes = 0;
|
|
3274
|
+
rsoa.encodingLength = function(data) {
|
|
3275
|
+
return 22 + name.encodingLength(data.mname) + name.encodingLength(data.rname);
|
|
3276
|
+
};
|
|
3277
|
+
const rtxt = exports.txt = {};
|
|
3278
|
+
rtxt.encode = function(data, buf, offset) {
|
|
3279
|
+
if (!Array.isArray(data)) data = [data];
|
|
3280
|
+
for (let i = 0; i < data.length; i++) {
|
|
3281
|
+
if (typeof data[i] === "string") data[i] = Buffer$1.from(data[i]);
|
|
3282
|
+
if (!Buffer$1.isBuffer(data[i])) throw new Error("Must be a Buffer");
|
|
3283
|
+
}
|
|
3284
|
+
if (!buf) buf = Buffer$1.alloc(rtxt.encodingLength(data));
|
|
3285
|
+
if (!offset) offset = 0;
|
|
3286
|
+
const oldOffset = offset;
|
|
3287
|
+
offset += 2;
|
|
3288
|
+
data.forEach(function(d) {
|
|
3289
|
+
buf[offset++] = d.length;
|
|
3290
|
+
d.copy(buf, offset, 0, d.length);
|
|
3291
|
+
offset += d.length;
|
|
3292
|
+
});
|
|
3293
|
+
buf.writeUInt16BE(offset - oldOffset - 2, oldOffset);
|
|
3294
|
+
rtxt.encode.bytes = offset - oldOffset;
|
|
3295
|
+
return buf;
|
|
3296
|
+
};
|
|
3297
|
+
rtxt.encode.bytes = 0;
|
|
3298
|
+
rtxt.decode = function(buf, offset) {
|
|
3299
|
+
if (!offset) offset = 0;
|
|
3300
|
+
const oldOffset = offset;
|
|
3301
|
+
let remaining = buf.readUInt16BE(offset);
|
|
3302
|
+
offset += 2;
|
|
3303
|
+
let data = [];
|
|
3304
|
+
while (remaining > 0) {
|
|
3305
|
+
const len = buf[offset++];
|
|
3306
|
+
--remaining;
|
|
3307
|
+
if (remaining < len) throw new Error("Buffer overflow");
|
|
3308
|
+
data.push(buf.slice(offset, offset + len));
|
|
3309
|
+
offset += len;
|
|
3310
|
+
remaining -= len;
|
|
3311
|
+
}
|
|
3312
|
+
rtxt.decode.bytes = offset - oldOffset;
|
|
3313
|
+
return data;
|
|
3314
|
+
};
|
|
3315
|
+
rtxt.decode.bytes = 0;
|
|
3316
|
+
rtxt.encodingLength = function(data) {
|
|
3317
|
+
if (!Array.isArray(data)) data = [data];
|
|
3318
|
+
let length = 2;
|
|
3319
|
+
data.forEach(function(buf) {
|
|
3320
|
+
if (typeof buf === "string") length += Buffer$1.byteLength(buf) + 1;
|
|
3321
|
+
else length += buf.length + 1;
|
|
3322
|
+
});
|
|
3323
|
+
return length;
|
|
3324
|
+
};
|
|
3325
|
+
const rnull = exports.null = {};
|
|
3326
|
+
rnull.encode = function(data, buf, offset) {
|
|
3327
|
+
if (!buf) buf = Buffer$1.alloc(rnull.encodingLength(data));
|
|
3328
|
+
if (!offset) offset = 0;
|
|
3329
|
+
if (typeof data === "string") data = Buffer$1.from(data);
|
|
3330
|
+
if (!data) data = Buffer$1.alloc(0);
|
|
3331
|
+
const oldOffset = offset;
|
|
3332
|
+
offset += 2;
|
|
3333
|
+
const len = data.length;
|
|
3334
|
+
data.copy(buf, offset, 0, len);
|
|
3335
|
+
offset += len;
|
|
3336
|
+
buf.writeUInt16BE(offset - oldOffset - 2, oldOffset);
|
|
3337
|
+
rnull.encode.bytes = offset - oldOffset;
|
|
3338
|
+
return buf;
|
|
3339
|
+
};
|
|
3340
|
+
rnull.encode.bytes = 0;
|
|
3341
|
+
rnull.decode = function(buf, offset) {
|
|
3342
|
+
if (!offset) offset = 0;
|
|
3343
|
+
const oldOffset = offset;
|
|
3344
|
+
const len = buf.readUInt16BE(offset);
|
|
3345
|
+
offset += 2;
|
|
3346
|
+
const data = buf.slice(offset, offset + len);
|
|
3347
|
+
offset += len;
|
|
3348
|
+
rnull.decode.bytes = offset - oldOffset;
|
|
3349
|
+
return data;
|
|
3350
|
+
};
|
|
3351
|
+
rnull.decode.bytes = 0;
|
|
3352
|
+
rnull.encodingLength = function(data) {
|
|
3353
|
+
if (!data) return 2;
|
|
3354
|
+
return (Buffer$1.isBuffer(data) ? data.length : Buffer$1.byteLength(data)) + 2;
|
|
3355
|
+
};
|
|
3356
|
+
const rhinfo = exports.hinfo = {};
|
|
3357
|
+
rhinfo.encode = function(data, buf, offset) {
|
|
3358
|
+
if (!buf) buf = Buffer$1.alloc(rhinfo.encodingLength(data));
|
|
3359
|
+
if (!offset) offset = 0;
|
|
3360
|
+
const oldOffset = offset;
|
|
3361
|
+
offset += 2;
|
|
3362
|
+
string.encode(data.cpu, buf, offset);
|
|
3363
|
+
offset += string.encode.bytes;
|
|
3364
|
+
string.encode(data.os, buf, offset);
|
|
3365
|
+
offset += string.encode.bytes;
|
|
3366
|
+
buf.writeUInt16BE(offset - oldOffset - 2, oldOffset);
|
|
3367
|
+
rhinfo.encode.bytes = offset - oldOffset;
|
|
3368
|
+
return buf;
|
|
3369
|
+
};
|
|
3370
|
+
rhinfo.encode.bytes = 0;
|
|
3371
|
+
rhinfo.decode = function(buf, offset) {
|
|
3372
|
+
if (!offset) offset = 0;
|
|
3373
|
+
const oldOffset = offset;
|
|
3374
|
+
const data = {};
|
|
3375
|
+
offset += 2;
|
|
3376
|
+
data.cpu = string.decode(buf, offset);
|
|
3377
|
+
offset += string.decode.bytes;
|
|
3378
|
+
data.os = string.decode(buf, offset);
|
|
3379
|
+
offset += string.decode.bytes;
|
|
3380
|
+
rhinfo.decode.bytes = offset - oldOffset;
|
|
3381
|
+
return data;
|
|
3382
|
+
};
|
|
3383
|
+
rhinfo.decode.bytes = 0;
|
|
3384
|
+
rhinfo.encodingLength = function(data) {
|
|
3385
|
+
return string.encodingLength(data.cpu) + string.encodingLength(data.os) + 2;
|
|
3386
|
+
};
|
|
3387
|
+
const rptr = exports.ptr = {};
|
|
3388
|
+
const rcname = exports.cname = rptr;
|
|
3389
|
+
const rdname = exports.dname = rptr;
|
|
3390
|
+
rptr.encode = function(data, buf, offset) {
|
|
3391
|
+
if (!buf) buf = Buffer$1.alloc(rptr.encodingLength(data));
|
|
3392
|
+
if (!offset) offset = 0;
|
|
3393
|
+
name.encode(data, buf, offset + 2);
|
|
3394
|
+
buf.writeUInt16BE(name.encode.bytes, offset);
|
|
3395
|
+
rptr.encode.bytes = name.encode.bytes + 2;
|
|
3396
|
+
return buf;
|
|
3397
|
+
};
|
|
3398
|
+
rptr.encode.bytes = 0;
|
|
3399
|
+
rptr.decode = function(buf, offset) {
|
|
3400
|
+
if (!offset) offset = 0;
|
|
3401
|
+
const data = name.decode(buf, offset + 2);
|
|
3402
|
+
rptr.decode.bytes = name.decode.bytes + 2;
|
|
3403
|
+
return data;
|
|
3404
|
+
};
|
|
3405
|
+
rptr.decode.bytes = 0;
|
|
3406
|
+
rptr.encodingLength = function(data) {
|
|
3407
|
+
return name.encodingLength(data) + 2;
|
|
3408
|
+
};
|
|
3409
|
+
const rsrv = exports.srv = {};
|
|
3410
|
+
rsrv.encode = function(data, buf, offset) {
|
|
3411
|
+
if (!buf) buf = Buffer$1.alloc(rsrv.encodingLength(data));
|
|
3412
|
+
if (!offset) offset = 0;
|
|
3413
|
+
buf.writeUInt16BE(data.priority || 0, offset + 2);
|
|
3414
|
+
buf.writeUInt16BE(data.weight || 0, offset + 4);
|
|
3415
|
+
buf.writeUInt16BE(data.port || 0, offset + 6);
|
|
3416
|
+
name.encode(data.target, buf, offset + 8);
|
|
3417
|
+
const len = name.encode.bytes + 6;
|
|
3418
|
+
buf.writeUInt16BE(len, offset);
|
|
3419
|
+
rsrv.encode.bytes = len + 2;
|
|
3420
|
+
return buf;
|
|
3421
|
+
};
|
|
3422
|
+
rsrv.encode.bytes = 0;
|
|
3423
|
+
rsrv.decode = function(buf, offset) {
|
|
3424
|
+
if (!offset) offset = 0;
|
|
3425
|
+
const len = buf.readUInt16BE(offset);
|
|
3426
|
+
const data = {};
|
|
3427
|
+
data.priority = buf.readUInt16BE(offset + 2);
|
|
3428
|
+
data.weight = buf.readUInt16BE(offset + 4);
|
|
3429
|
+
data.port = buf.readUInt16BE(offset + 6);
|
|
3430
|
+
data.target = name.decode(buf, offset + 8);
|
|
3431
|
+
rsrv.decode.bytes = len + 2;
|
|
3432
|
+
return data;
|
|
3433
|
+
};
|
|
3434
|
+
rsrv.decode.bytes = 0;
|
|
3435
|
+
rsrv.encodingLength = function(data) {
|
|
3436
|
+
return 8 + name.encodingLength(data.target);
|
|
3437
|
+
};
|
|
3438
|
+
const rcaa = exports.caa = {};
|
|
3439
|
+
rcaa.ISSUER_CRITICAL = 128;
|
|
3440
|
+
rcaa.encode = function(data, buf, offset) {
|
|
3441
|
+
const len = rcaa.encodingLength(data);
|
|
3442
|
+
if (!buf) buf = Buffer$1.alloc(rcaa.encodingLength(data));
|
|
3443
|
+
if (!offset) offset = 0;
|
|
3444
|
+
if (data.issuerCritical) data.flags = rcaa.ISSUER_CRITICAL;
|
|
3445
|
+
buf.writeUInt16BE(len - 2, offset);
|
|
3446
|
+
offset += 2;
|
|
3447
|
+
buf.writeUInt8(data.flags || 0, offset);
|
|
3448
|
+
offset += 1;
|
|
3449
|
+
string.encode(data.tag, buf, offset);
|
|
3450
|
+
offset += string.encode.bytes;
|
|
3451
|
+
buf.write(data.value, offset);
|
|
3452
|
+
offset += Buffer$1.byteLength(data.value);
|
|
3453
|
+
rcaa.encode.bytes = len;
|
|
3454
|
+
return buf;
|
|
3455
|
+
};
|
|
3456
|
+
rcaa.encode.bytes = 0;
|
|
3457
|
+
rcaa.decode = function(buf, offset) {
|
|
3458
|
+
if (!offset) offset = 0;
|
|
3459
|
+
const len = buf.readUInt16BE(offset);
|
|
3460
|
+
offset += 2;
|
|
3461
|
+
const oldOffset = offset;
|
|
3462
|
+
const data = {};
|
|
3463
|
+
data.flags = buf.readUInt8(offset);
|
|
3464
|
+
offset += 1;
|
|
3465
|
+
data.tag = string.decode(buf, offset);
|
|
3466
|
+
offset += string.decode.bytes;
|
|
3467
|
+
data.value = buf.toString("utf-8", offset, oldOffset + len);
|
|
3468
|
+
data.issuerCritical = !!(data.flags & rcaa.ISSUER_CRITICAL);
|
|
3469
|
+
rcaa.decode.bytes = len + 2;
|
|
3470
|
+
return data;
|
|
3471
|
+
};
|
|
3472
|
+
rcaa.decode.bytes = 0;
|
|
3473
|
+
rcaa.encodingLength = function(data) {
|
|
3474
|
+
return string.encodingLength(data.tag) + string.encodingLength(data.value) + 2;
|
|
3475
|
+
};
|
|
3476
|
+
const rmx = exports.mx = {};
|
|
3477
|
+
rmx.encode = function(data, buf, offset) {
|
|
3478
|
+
if (!buf) buf = Buffer$1.alloc(rmx.encodingLength(data));
|
|
3479
|
+
if (!offset) offset = 0;
|
|
3480
|
+
const oldOffset = offset;
|
|
3481
|
+
offset += 2;
|
|
3482
|
+
buf.writeUInt16BE(data.preference || 0, offset);
|
|
3483
|
+
offset += 2;
|
|
3484
|
+
name.encode(data.exchange, buf, offset);
|
|
3485
|
+
offset += name.encode.bytes;
|
|
3486
|
+
buf.writeUInt16BE(offset - oldOffset - 2, oldOffset);
|
|
3487
|
+
rmx.encode.bytes = offset - oldOffset;
|
|
3488
|
+
return buf;
|
|
3489
|
+
};
|
|
3490
|
+
rmx.encode.bytes = 0;
|
|
3491
|
+
rmx.decode = function(buf, offset) {
|
|
3492
|
+
if (!offset) offset = 0;
|
|
3493
|
+
const oldOffset = offset;
|
|
3494
|
+
const data = {};
|
|
3495
|
+
offset += 2;
|
|
3496
|
+
data.preference = buf.readUInt16BE(offset);
|
|
3497
|
+
offset += 2;
|
|
3498
|
+
data.exchange = name.decode(buf, offset);
|
|
3499
|
+
offset += name.decode.bytes;
|
|
3500
|
+
rmx.decode.bytes = offset - oldOffset;
|
|
3501
|
+
return data;
|
|
3502
|
+
};
|
|
3503
|
+
rmx.encodingLength = function(data) {
|
|
3504
|
+
return 4 + name.encodingLength(data.exchange);
|
|
3505
|
+
};
|
|
3506
|
+
const ra = exports.a = {};
|
|
3507
|
+
ra.encode = function(host, buf, offset) {
|
|
3508
|
+
if (!buf) buf = Buffer$1.alloc(ra.encodingLength(host));
|
|
3509
|
+
if (!offset) offset = 0;
|
|
3510
|
+
buf.writeUInt16BE(4, offset);
|
|
3511
|
+
offset += 2;
|
|
3512
|
+
ip.v4.encode(host, buf, offset);
|
|
3513
|
+
ra.encode.bytes = 6;
|
|
3514
|
+
return buf;
|
|
3515
|
+
};
|
|
3516
|
+
ra.encode.bytes = 0;
|
|
3517
|
+
ra.decode = function(buf, offset) {
|
|
3518
|
+
if (!offset) offset = 0;
|
|
3519
|
+
offset += 2;
|
|
3520
|
+
const host = ip.v4.decode(buf, offset);
|
|
3521
|
+
ra.decode.bytes = 6;
|
|
3522
|
+
return host;
|
|
3523
|
+
};
|
|
3524
|
+
ra.decode.bytes = 0;
|
|
3525
|
+
ra.encodingLength = function() {
|
|
3526
|
+
return 6;
|
|
3527
|
+
};
|
|
3528
|
+
const raaaa = exports.aaaa = {};
|
|
3529
|
+
raaaa.encode = function(host, buf, offset) {
|
|
3530
|
+
if (!buf) buf = Buffer$1.alloc(raaaa.encodingLength(host));
|
|
3531
|
+
if (!offset) offset = 0;
|
|
3532
|
+
buf.writeUInt16BE(16, offset);
|
|
3533
|
+
offset += 2;
|
|
3534
|
+
ip.v6.encode(host, buf, offset);
|
|
3535
|
+
raaaa.encode.bytes = 18;
|
|
3536
|
+
return buf;
|
|
3537
|
+
};
|
|
3538
|
+
raaaa.encode.bytes = 0;
|
|
3539
|
+
raaaa.decode = function(buf, offset) {
|
|
3540
|
+
if (!offset) offset = 0;
|
|
3541
|
+
offset += 2;
|
|
3542
|
+
const host = ip.v6.decode(buf, offset);
|
|
3543
|
+
raaaa.decode.bytes = 18;
|
|
3544
|
+
return host;
|
|
3545
|
+
};
|
|
3546
|
+
raaaa.decode.bytes = 0;
|
|
3547
|
+
raaaa.encodingLength = function() {
|
|
3548
|
+
return 18;
|
|
3549
|
+
};
|
|
3550
|
+
const roption = exports.option = {};
|
|
3551
|
+
roption.encode = function(option, buf, offset) {
|
|
3552
|
+
if (!buf) buf = Buffer$1.alloc(roption.encodingLength(option));
|
|
3553
|
+
if (!offset) offset = 0;
|
|
3554
|
+
const oldOffset = offset;
|
|
3555
|
+
const code = optioncodes.toCode(option.code);
|
|
3556
|
+
buf.writeUInt16BE(code, offset);
|
|
3557
|
+
offset += 2;
|
|
3558
|
+
if (option.data) {
|
|
3559
|
+
buf.writeUInt16BE(option.data.length, offset);
|
|
3560
|
+
offset += 2;
|
|
3561
|
+
option.data.copy(buf, offset);
|
|
3562
|
+
offset += option.data.length;
|
|
3563
|
+
} else switch (code) {
|
|
3564
|
+
case 8:
|
|
3565
|
+
const spl = option.sourcePrefixLength || 0;
|
|
3566
|
+
const fam = option.family || ip.familyOf(option.ip);
|
|
3567
|
+
const ipBuf = ip.encode(option.ip, Buffer$1.alloc);
|
|
3568
|
+
const ipLen = Math.ceil(spl / 8);
|
|
3569
|
+
buf.writeUInt16BE(ipLen + 4, offset);
|
|
3570
|
+
offset += 2;
|
|
3571
|
+
buf.writeUInt16BE(fam, offset);
|
|
3572
|
+
offset += 2;
|
|
3573
|
+
buf.writeUInt8(spl, offset++);
|
|
3574
|
+
buf.writeUInt8(option.scopePrefixLength || 0, offset++);
|
|
3575
|
+
ipBuf.copy(buf, offset, 0, ipLen);
|
|
3576
|
+
offset += ipLen;
|
|
3577
|
+
break;
|
|
3578
|
+
case 11:
|
|
3579
|
+
if (option.timeout) {
|
|
3580
|
+
buf.writeUInt16BE(2, offset);
|
|
3581
|
+
offset += 2;
|
|
3582
|
+
buf.writeUInt16BE(option.timeout, offset);
|
|
3583
|
+
offset += 2;
|
|
3584
|
+
} else {
|
|
3585
|
+
buf.writeUInt16BE(0, offset);
|
|
3586
|
+
offset += 2;
|
|
3587
|
+
}
|
|
3588
|
+
break;
|
|
3589
|
+
case 12:
|
|
3590
|
+
const len = option.length || 0;
|
|
3591
|
+
buf.writeUInt16BE(len, offset);
|
|
3592
|
+
offset += 2;
|
|
3593
|
+
buf.fill(0, offset, offset + len);
|
|
3594
|
+
offset += len;
|
|
3595
|
+
break;
|
|
3596
|
+
case 14:
|
|
3597
|
+
const tagsLen = option.tags.length * 2;
|
|
3598
|
+
buf.writeUInt16BE(tagsLen, offset);
|
|
3599
|
+
offset += 2;
|
|
3600
|
+
for (const tag of option.tags) {
|
|
3601
|
+
buf.writeUInt16BE(tag, offset);
|
|
3602
|
+
offset += 2;
|
|
3603
|
+
}
|
|
3604
|
+
break;
|
|
3605
|
+
default: throw new Error(`Unknown roption code: ${option.code}`);
|
|
3606
|
+
}
|
|
3607
|
+
roption.encode.bytes = offset - oldOffset;
|
|
3608
|
+
return buf;
|
|
3609
|
+
};
|
|
3610
|
+
roption.encode.bytes = 0;
|
|
3611
|
+
roption.decode = function(buf, offset) {
|
|
3612
|
+
if (!offset) offset = 0;
|
|
3613
|
+
const option = {};
|
|
3614
|
+
option.code = buf.readUInt16BE(offset);
|
|
3615
|
+
option.type = optioncodes.toString(option.code);
|
|
3616
|
+
offset += 2;
|
|
3617
|
+
const len = buf.readUInt16BE(offset);
|
|
3618
|
+
offset += 2;
|
|
3619
|
+
option.data = buf.slice(offset, offset + len);
|
|
3620
|
+
switch (option.code) {
|
|
3621
|
+
case 8:
|
|
3622
|
+
option.family = buf.readUInt16BE(offset);
|
|
3623
|
+
offset += 2;
|
|
3624
|
+
option.sourcePrefixLength = buf.readUInt8(offset++);
|
|
3625
|
+
option.scopePrefixLength = buf.readUInt8(offset++);
|
|
3626
|
+
const padded = Buffer$1.alloc(option.family === 1 ? 4 : 16);
|
|
3627
|
+
buf.copy(padded, 0, offset, offset + len - 4);
|
|
3628
|
+
option.ip = ip.decode(padded);
|
|
3629
|
+
break;
|
|
3630
|
+
case 11:
|
|
3631
|
+
if (len > 0) {
|
|
3632
|
+
option.timeout = buf.readUInt16BE(offset);
|
|
3633
|
+
offset += 2;
|
|
3634
|
+
}
|
|
3635
|
+
break;
|
|
3636
|
+
case 14:
|
|
3637
|
+
option.tags = [];
|
|
3638
|
+
for (let i = 0; i < len; i += 2) {
|
|
3639
|
+
option.tags.push(buf.readUInt16BE(offset));
|
|
3640
|
+
offset += 2;
|
|
3641
|
+
}
|
|
3642
|
+
}
|
|
3643
|
+
roption.decode.bytes = len + 4;
|
|
3644
|
+
return option;
|
|
3645
|
+
};
|
|
3646
|
+
roption.decode.bytes = 0;
|
|
3647
|
+
roption.encodingLength = function(option) {
|
|
3648
|
+
if (option.data) return option.data.length + 4;
|
|
3649
|
+
switch (optioncodes.toCode(option.code)) {
|
|
3650
|
+
case 8:
|
|
3651
|
+
const spl = option.sourcePrefixLength || 0;
|
|
3652
|
+
return Math.ceil(spl / 8) + 8;
|
|
3653
|
+
case 11: return typeof option.timeout === "number" ? 6 : 4;
|
|
3654
|
+
case 12: return option.length + 4;
|
|
3655
|
+
case 14: return 4 + option.tags.length * 2;
|
|
3656
|
+
}
|
|
3657
|
+
throw new Error(`Unknown roption code: ${option.code}`);
|
|
3658
|
+
};
|
|
3659
|
+
const ropt = exports.opt = {};
|
|
3660
|
+
ropt.encode = function(options, buf, offset) {
|
|
3661
|
+
if (!buf) buf = Buffer$1.alloc(ropt.encodingLength(options));
|
|
3662
|
+
if (!offset) offset = 0;
|
|
3663
|
+
const oldOffset = offset;
|
|
3664
|
+
const rdlen = encodingLengthList(options, roption);
|
|
3665
|
+
buf.writeUInt16BE(rdlen, offset);
|
|
3666
|
+
offset = encodeList(options, roption, buf, offset + 2);
|
|
3667
|
+
ropt.encode.bytes = offset - oldOffset;
|
|
3668
|
+
return buf;
|
|
3669
|
+
};
|
|
3670
|
+
ropt.encode.bytes = 0;
|
|
3671
|
+
ropt.decode = function(buf, offset) {
|
|
3672
|
+
if (!offset) offset = 0;
|
|
3673
|
+
const oldOffset = offset;
|
|
3674
|
+
const options = [];
|
|
3675
|
+
let rdlen = buf.readUInt16BE(offset);
|
|
3676
|
+
offset += 2;
|
|
3677
|
+
let o = 0;
|
|
3678
|
+
while (rdlen > 0) {
|
|
3679
|
+
options[o++] = roption.decode(buf, offset);
|
|
3680
|
+
offset += roption.decode.bytes;
|
|
3681
|
+
rdlen -= roption.decode.bytes;
|
|
3682
|
+
}
|
|
3683
|
+
ropt.decode.bytes = offset - oldOffset;
|
|
3684
|
+
return options;
|
|
3685
|
+
};
|
|
3686
|
+
ropt.decode.bytes = 0;
|
|
3687
|
+
ropt.encodingLength = function(options) {
|
|
3688
|
+
return 2 + encodingLengthList(options || [], roption);
|
|
3689
|
+
};
|
|
3690
|
+
const rdnskey = exports.dnskey = {};
|
|
3691
|
+
rdnskey.PROTOCOL_DNSSEC = 3;
|
|
3692
|
+
rdnskey.ZONE_KEY = 128;
|
|
3693
|
+
rdnskey.SECURE_ENTRYPOINT = 32768;
|
|
3694
|
+
rdnskey.encode = function(key, buf, offset) {
|
|
3695
|
+
if (!buf) buf = Buffer$1.alloc(rdnskey.encodingLength(key));
|
|
3696
|
+
if (!offset) offset = 0;
|
|
3697
|
+
const oldOffset = offset;
|
|
3698
|
+
const keydata = key.key;
|
|
3699
|
+
if (!Buffer$1.isBuffer(keydata)) throw new Error("Key must be a Buffer");
|
|
3700
|
+
offset += 2;
|
|
3701
|
+
buf.writeUInt16BE(key.flags, offset);
|
|
3702
|
+
offset += 2;
|
|
3703
|
+
buf.writeUInt8(rdnskey.PROTOCOL_DNSSEC, offset);
|
|
3704
|
+
offset += 1;
|
|
3705
|
+
buf.writeUInt8(key.algorithm, offset);
|
|
3706
|
+
offset += 1;
|
|
3707
|
+
keydata.copy(buf, offset, 0, keydata.length);
|
|
3708
|
+
offset += keydata.length;
|
|
3709
|
+
rdnskey.encode.bytes = offset - oldOffset;
|
|
3710
|
+
buf.writeUInt16BE(rdnskey.encode.bytes - 2, oldOffset);
|
|
3711
|
+
return buf;
|
|
3712
|
+
};
|
|
3713
|
+
rdnskey.encode.bytes = 0;
|
|
3714
|
+
rdnskey.decode = function(buf, offset) {
|
|
3715
|
+
if (!offset) offset = 0;
|
|
3716
|
+
const oldOffset = offset;
|
|
3717
|
+
var key = {};
|
|
3718
|
+
var length = buf.readUInt16BE(offset);
|
|
3719
|
+
offset += 2;
|
|
3720
|
+
key.flags = buf.readUInt16BE(offset);
|
|
3721
|
+
offset += 2;
|
|
3722
|
+
if (buf.readUInt8(offset) !== rdnskey.PROTOCOL_DNSSEC) throw new Error("Protocol must be 3");
|
|
3723
|
+
offset += 1;
|
|
3724
|
+
key.algorithm = buf.readUInt8(offset);
|
|
3725
|
+
offset += 1;
|
|
3726
|
+
key.key = buf.slice(offset, oldOffset + length + 2);
|
|
3727
|
+
offset += key.key.length;
|
|
3728
|
+
rdnskey.decode.bytes = offset - oldOffset;
|
|
3729
|
+
return key;
|
|
3730
|
+
};
|
|
3731
|
+
rdnskey.decode.bytes = 0;
|
|
3732
|
+
rdnskey.encodingLength = function(key) {
|
|
3733
|
+
return 6 + Buffer$1.byteLength(key.key);
|
|
3734
|
+
};
|
|
3735
|
+
const rrrsig = exports.rrsig = {};
|
|
3736
|
+
rrrsig.encode = function(sig, buf, offset) {
|
|
3737
|
+
if (!buf) buf = Buffer$1.alloc(rrrsig.encodingLength(sig));
|
|
3738
|
+
if (!offset) offset = 0;
|
|
3739
|
+
const oldOffset = offset;
|
|
3740
|
+
const signature = sig.signature;
|
|
3741
|
+
if (!Buffer$1.isBuffer(signature)) throw new Error("Signature must be a Buffer");
|
|
3742
|
+
offset += 2;
|
|
3743
|
+
buf.writeUInt16BE(types.toType(sig.typeCovered), offset);
|
|
3744
|
+
offset += 2;
|
|
3745
|
+
buf.writeUInt8(sig.algorithm, offset);
|
|
3746
|
+
offset += 1;
|
|
3747
|
+
buf.writeUInt8(sig.labels, offset);
|
|
3748
|
+
offset += 1;
|
|
3749
|
+
buf.writeUInt32BE(sig.originalTTL, offset);
|
|
3750
|
+
offset += 4;
|
|
3751
|
+
buf.writeUInt32BE(sig.expiration, offset);
|
|
3752
|
+
offset += 4;
|
|
3753
|
+
buf.writeUInt32BE(sig.inception, offset);
|
|
3754
|
+
offset += 4;
|
|
3755
|
+
buf.writeUInt16BE(sig.keyTag, offset);
|
|
3756
|
+
offset += 2;
|
|
3757
|
+
name.encode(sig.signersName, buf, offset);
|
|
3758
|
+
offset += name.encode.bytes;
|
|
3759
|
+
signature.copy(buf, offset, 0, signature.length);
|
|
3760
|
+
offset += signature.length;
|
|
3761
|
+
rrrsig.encode.bytes = offset - oldOffset;
|
|
3762
|
+
buf.writeUInt16BE(rrrsig.encode.bytes - 2, oldOffset);
|
|
3763
|
+
return buf;
|
|
3764
|
+
};
|
|
3765
|
+
rrrsig.encode.bytes = 0;
|
|
3766
|
+
rrrsig.decode = function(buf, offset) {
|
|
3767
|
+
if (!offset) offset = 0;
|
|
3768
|
+
const oldOffset = offset;
|
|
3769
|
+
var sig = {};
|
|
3770
|
+
var length = buf.readUInt16BE(offset);
|
|
3771
|
+
offset += 2;
|
|
3772
|
+
sig.typeCovered = types.toString(buf.readUInt16BE(offset));
|
|
3773
|
+
offset += 2;
|
|
3774
|
+
sig.algorithm = buf.readUInt8(offset);
|
|
3775
|
+
offset += 1;
|
|
3776
|
+
sig.labels = buf.readUInt8(offset);
|
|
3777
|
+
offset += 1;
|
|
3778
|
+
sig.originalTTL = buf.readUInt32BE(offset);
|
|
3779
|
+
offset += 4;
|
|
3780
|
+
sig.expiration = buf.readUInt32BE(offset);
|
|
3781
|
+
offset += 4;
|
|
3782
|
+
sig.inception = buf.readUInt32BE(offset);
|
|
3783
|
+
offset += 4;
|
|
3784
|
+
sig.keyTag = buf.readUInt16BE(offset);
|
|
3785
|
+
offset += 2;
|
|
3786
|
+
sig.signersName = name.decode(buf, offset);
|
|
3787
|
+
offset += name.decode.bytes;
|
|
3788
|
+
sig.signature = buf.slice(offset, oldOffset + length + 2);
|
|
3789
|
+
offset += sig.signature.length;
|
|
3790
|
+
rrrsig.decode.bytes = offset - oldOffset;
|
|
3791
|
+
return sig;
|
|
3792
|
+
};
|
|
3793
|
+
rrrsig.decode.bytes = 0;
|
|
3794
|
+
rrrsig.encodingLength = function(sig) {
|
|
3795
|
+
return 20 + name.encodingLength(sig.signersName) + Buffer$1.byteLength(sig.signature);
|
|
3796
|
+
};
|
|
3797
|
+
const rrp = exports.rp = {};
|
|
3798
|
+
rrp.encode = function(data, buf, offset) {
|
|
3799
|
+
if (!buf) buf = Buffer$1.alloc(rrp.encodingLength(data));
|
|
3800
|
+
if (!offset) offset = 0;
|
|
3801
|
+
const oldOffset = offset;
|
|
3802
|
+
offset += 2;
|
|
3803
|
+
name.encode(data.mbox || ".", buf, offset, { mail: true });
|
|
3804
|
+
offset += name.encode.bytes;
|
|
3805
|
+
name.encode(data.txt || ".", buf, offset);
|
|
3806
|
+
offset += name.encode.bytes;
|
|
3807
|
+
rrp.encode.bytes = offset - oldOffset;
|
|
3808
|
+
buf.writeUInt16BE(rrp.encode.bytes - 2, oldOffset);
|
|
3809
|
+
return buf;
|
|
3810
|
+
};
|
|
3811
|
+
rrp.encode.bytes = 0;
|
|
3812
|
+
rrp.decode = function(buf, offset) {
|
|
3813
|
+
if (!offset) offset = 0;
|
|
3814
|
+
const oldOffset = offset;
|
|
3815
|
+
const data = {};
|
|
3816
|
+
offset += 2;
|
|
3817
|
+
data.mbox = name.decode(buf, offset, { mail: true }) || ".";
|
|
3818
|
+
offset += name.decode.bytes;
|
|
3819
|
+
data.txt = name.decode(buf, offset) || ".";
|
|
3820
|
+
offset += name.decode.bytes;
|
|
3821
|
+
rrp.decode.bytes = offset - oldOffset;
|
|
3822
|
+
return data;
|
|
3823
|
+
};
|
|
3824
|
+
rrp.decode.bytes = 0;
|
|
3825
|
+
rrp.encodingLength = function(data) {
|
|
3826
|
+
return 2 + name.encodingLength(data.mbox || ".") + name.encodingLength(data.txt || ".");
|
|
3827
|
+
};
|
|
3828
|
+
const typebitmap = {};
|
|
3829
|
+
typebitmap.encode = function(typelist, buf, offset) {
|
|
3830
|
+
if (!buf) buf = Buffer$1.alloc(typebitmap.encodingLength(typelist));
|
|
3831
|
+
if (!offset) offset = 0;
|
|
3832
|
+
const oldOffset = offset;
|
|
3833
|
+
var typesByWindow = [];
|
|
3834
|
+
for (var i = 0; i < typelist.length; i++) {
|
|
3835
|
+
var typeid = types.toType(typelist[i]);
|
|
3836
|
+
if (typesByWindow[typeid >> 8] === void 0) typesByWindow[typeid >> 8] = [];
|
|
3837
|
+
typesByWindow[typeid >> 8][typeid >> 3 & 31] |= 1 << 7 - (typeid & 7);
|
|
3838
|
+
}
|
|
3839
|
+
for (i = 0; i < typesByWindow.length; i++) if (typesByWindow[i] !== void 0) {
|
|
3840
|
+
var windowBuf = Buffer$1.from(typesByWindow[i]);
|
|
3841
|
+
buf.writeUInt8(i, offset);
|
|
3842
|
+
offset += 1;
|
|
3843
|
+
buf.writeUInt8(windowBuf.length, offset);
|
|
3844
|
+
offset += 1;
|
|
3845
|
+
windowBuf.copy(buf, offset);
|
|
3846
|
+
offset += windowBuf.length;
|
|
3847
|
+
}
|
|
3848
|
+
typebitmap.encode.bytes = offset - oldOffset;
|
|
3849
|
+
return buf;
|
|
3850
|
+
};
|
|
3851
|
+
typebitmap.encode.bytes = 0;
|
|
3852
|
+
typebitmap.decode = function(buf, offset, length) {
|
|
3853
|
+
if (!offset) offset = 0;
|
|
3854
|
+
const oldOffset = offset;
|
|
3855
|
+
var typelist = [];
|
|
3856
|
+
while (offset - oldOffset < length) {
|
|
3857
|
+
var window = buf.readUInt8(offset);
|
|
3858
|
+
offset += 1;
|
|
3859
|
+
var windowLength = buf.readUInt8(offset);
|
|
3860
|
+
offset += 1;
|
|
3861
|
+
for (var i = 0; i < windowLength; i++) {
|
|
3862
|
+
var b = buf.readUInt8(offset + i);
|
|
3863
|
+
for (var j = 0; j < 8; j++) if (b & 1 << 7 - j) {
|
|
3864
|
+
var typeid = types.toString(window << 8 | i << 3 | j);
|
|
3865
|
+
typelist.push(typeid);
|
|
3866
|
+
}
|
|
3867
|
+
}
|
|
3868
|
+
offset += windowLength;
|
|
3869
|
+
}
|
|
3870
|
+
typebitmap.decode.bytes = offset - oldOffset;
|
|
3871
|
+
return typelist;
|
|
3872
|
+
};
|
|
3873
|
+
typebitmap.decode.bytes = 0;
|
|
3874
|
+
typebitmap.encodingLength = function(typelist) {
|
|
3875
|
+
var extents = [];
|
|
3876
|
+
for (var i = 0; i < typelist.length; i++) {
|
|
3877
|
+
var typeid = types.toType(typelist[i]);
|
|
3878
|
+
extents[typeid >> 8] = Math.max(extents[typeid >> 8] || 0, typeid & 255);
|
|
3879
|
+
}
|
|
3880
|
+
var len = 0;
|
|
3881
|
+
for (i = 0; i < extents.length; i++) if (extents[i] !== void 0) len += 2 + Math.ceil((extents[i] + 1) / 8);
|
|
3882
|
+
return len;
|
|
3883
|
+
};
|
|
3884
|
+
const rnsec = exports.nsec = {};
|
|
3885
|
+
rnsec.encode = function(record, buf, offset) {
|
|
3886
|
+
if (!buf) buf = Buffer$1.alloc(rnsec.encodingLength(record));
|
|
3887
|
+
if (!offset) offset = 0;
|
|
3888
|
+
const oldOffset = offset;
|
|
3889
|
+
offset += 2;
|
|
3890
|
+
name.encode(record.nextDomain, buf, offset);
|
|
3891
|
+
offset += name.encode.bytes;
|
|
3892
|
+
typebitmap.encode(record.rrtypes, buf, offset);
|
|
3893
|
+
offset += typebitmap.encode.bytes;
|
|
3894
|
+
rnsec.encode.bytes = offset - oldOffset;
|
|
3895
|
+
buf.writeUInt16BE(rnsec.encode.bytes - 2, oldOffset);
|
|
3896
|
+
return buf;
|
|
3897
|
+
};
|
|
3898
|
+
rnsec.encode.bytes = 0;
|
|
3899
|
+
rnsec.decode = function(buf, offset) {
|
|
3900
|
+
if (!offset) offset = 0;
|
|
3901
|
+
const oldOffset = offset;
|
|
3902
|
+
var record = {};
|
|
3903
|
+
var length = buf.readUInt16BE(offset);
|
|
3904
|
+
offset += 2;
|
|
3905
|
+
record.nextDomain = name.decode(buf, offset);
|
|
3906
|
+
offset += name.decode.bytes;
|
|
3907
|
+
record.rrtypes = typebitmap.decode(buf, offset, length - (offset - oldOffset));
|
|
3908
|
+
offset += typebitmap.decode.bytes;
|
|
3909
|
+
rnsec.decode.bytes = offset - oldOffset;
|
|
3910
|
+
return record;
|
|
3911
|
+
};
|
|
3912
|
+
rnsec.decode.bytes = 0;
|
|
3913
|
+
rnsec.encodingLength = function(record) {
|
|
3914
|
+
return 2 + name.encodingLength(record.nextDomain) + typebitmap.encodingLength(record.rrtypes);
|
|
3915
|
+
};
|
|
3916
|
+
const rnsec3 = exports.nsec3 = {};
|
|
3917
|
+
rnsec3.encode = function(record, buf, offset) {
|
|
3918
|
+
if (!buf) buf = Buffer$1.alloc(rnsec3.encodingLength(record));
|
|
3919
|
+
if (!offset) offset = 0;
|
|
3920
|
+
const oldOffset = offset;
|
|
3921
|
+
const salt = record.salt;
|
|
3922
|
+
if (!Buffer$1.isBuffer(salt)) throw new Error("salt must be a Buffer");
|
|
3923
|
+
const nextDomain = record.nextDomain;
|
|
3924
|
+
if (!Buffer$1.isBuffer(nextDomain)) throw new Error("nextDomain must be a Buffer");
|
|
3925
|
+
offset += 2;
|
|
3926
|
+
buf.writeUInt8(record.algorithm, offset);
|
|
3927
|
+
offset += 1;
|
|
3928
|
+
buf.writeUInt8(record.flags, offset);
|
|
3929
|
+
offset += 1;
|
|
3930
|
+
buf.writeUInt16BE(record.iterations, offset);
|
|
3931
|
+
offset += 2;
|
|
3932
|
+
buf.writeUInt8(salt.length, offset);
|
|
3933
|
+
offset += 1;
|
|
3934
|
+
salt.copy(buf, offset, 0, salt.length);
|
|
3935
|
+
offset += salt.length;
|
|
3936
|
+
buf.writeUInt8(nextDomain.length, offset);
|
|
3937
|
+
offset += 1;
|
|
3938
|
+
nextDomain.copy(buf, offset, 0, nextDomain.length);
|
|
3939
|
+
offset += nextDomain.length;
|
|
3940
|
+
typebitmap.encode(record.rrtypes, buf, offset);
|
|
3941
|
+
offset += typebitmap.encode.bytes;
|
|
3942
|
+
rnsec3.encode.bytes = offset - oldOffset;
|
|
3943
|
+
buf.writeUInt16BE(rnsec3.encode.bytes - 2, oldOffset);
|
|
3944
|
+
return buf;
|
|
3945
|
+
};
|
|
3946
|
+
rnsec3.encode.bytes = 0;
|
|
3947
|
+
rnsec3.decode = function(buf, offset) {
|
|
3948
|
+
if (!offset) offset = 0;
|
|
3949
|
+
const oldOffset = offset;
|
|
3950
|
+
var record = {};
|
|
3951
|
+
var length = buf.readUInt16BE(offset);
|
|
3952
|
+
offset += 2;
|
|
3953
|
+
record.algorithm = buf.readUInt8(offset);
|
|
3954
|
+
offset += 1;
|
|
3955
|
+
record.flags = buf.readUInt8(offset);
|
|
3956
|
+
offset += 1;
|
|
3957
|
+
record.iterations = buf.readUInt16BE(offset);
|
|
3958
|
+
offset += 2;
|
|
3959
|
+
const saltLength = buf.readUInt8(offset);
|
|
3960
|
+
offset += 1;
|
|
3961
|
+
record.salt = buf.slice(offset, offset + saltLength);
|
|
3962
|
+
offset += saltLength;
|
|
3963
|
+
const hashLength = buf.readUInt8(offset);
|
|
3964
|
+
offset += 1;
|
|
3965
|
+
record.nextDomain = buf.slice(offset, offset + hashLength);
|
|
3966
|
+
offset += hashLength;
|
|
3967
|
+
record.rrtypes = typebitmap.decode(buf, offset, length - (offset - oldOffset));
|
|
3968
|
+
offset += typebitmap.decode.bytes;
|
|
3969
|
+
rnsec3.decode.bytes = offset - oldOffset;
|
|
3970
|
+
return record;
|
|
3971
|
+
};
|
|
3972
|
+
rnsec3.decode.bytes = 0;
|
|
3973
|
+
rnsec3.encodingLength = function(record) {
|
|
3974
|
+
return 8 + record.salt.length + record.nextDomain.length + typebitmap.encodingLength(record.rrtypes);
|
|
3975
|
+
};
|
|
3976
|
+
const rds = exports.ds = {};
|
|
3977
|
+
rds.encode = function(digest, buf, offset) {
|
|
3978
|
+
if (!buf) buf = Buffer$1.alloc(rds.encodingLength(digest));
|
|
3979
|
+
if (!offset) offset = 0;
|
|
3980
|
+
const oldOffset = offset;
|
|
3981
|
+
const digestdata = digest.digest;
|
|
3982
|
+
if (!Buffer$1.isBuffer(digestdata)) throw new Error("Digest must be a Buffer");
|
|
3983
|
+
offset += 2;
|
|
3984
|
+
buf.writeUInt16BE(digest.keyTag, offset);
|
|
3985
|
+
offset += 2;
|
|
3986
|
+
buf.writeUInt8(digest.algorithm, offset);
|
|
3987
|
+
offset += 1;
|
|
3988
|
+
buf.writeUInt8(digest.digestType, offset);
|
|
3989
|
+
offset += 1;
|
|
3990
|
+
digestdata.copy(buf, offset, 0, digestdata.length);
|
|
3991
|
+
offset += digestdata.length;
|
|
3992
|
+
rds.encode.bytes = offset - oldOffset;
|
|
3993
|
+
buf.writeUInt16BE(rds.encode.bytes - 2, oldOffset);
|
|
3994
|
+
return buf;
|
|
3995
|
+
};
|
|
3996
|
+
rds.encode.bytes = 0;
|
|
3997
|
+
rds.decode = function(buf, offset) {
|
|
3998
|
+
if (!offset) offset = 0;
|
|
3999
|
+
const oldOffset = offset;
|
|
4000
|
+
var digest = {};
|
|
4001
|
+
var length = buf.readUInt16BE(offset);
|
|
4002
|
+
offset += 2;
|
|
4003
|
+
digest.keyTag = buf.readUInt16BE(offset);
|
|
4004
|
+
offset += 2;
|
|
4005
|
+
digest.algorithm = buf.readUInt8(offset);
|
|
4006
|
+
offset += 1;
|
|
4007
|
+
digest.digestType = buf.readUInt8(offset);
|
|
4008
|
+
offset += 1;
|
|
4009
|
+
digest.digest = buf.slice(offset, oldOffset + length + 2);
|
|
4010
|
+
offset += digest.digest.length;
|
|
4011
|
+
rds.decode.bytes = offset - oldOffset;
|
|
4012
|
+
return digest;
|
|
4013
|
+
};
|
|
4014
|
+
rds.decode.bytes = 0;
|
|
4015
|
+
rds.encodingLength = function(digest) {
|
|
4016
|
+
return 6 + Buffer$1.byteLength(digest.digest);
|
|
4017
|
+
};
|
|
4018
|
+
const rsshfp = exports.sshfp = {};
|
|
4019
|
+
rsshfp.getFingerprintLengthForHashType = function getFingerprintLengthForHashType(hashType) {
|
|
4020
|
+
switch (hashType) {
|
|
4021
|
+
case 1: return 20;
|
|
4022
|
+
case 2: return 32;
|
|
4023
|
+
}
|
|
4024
|
+
};
|
|
4025
|
+
rsshfp.encode = function encode(record, buf, offset) {
|
|
4026
|
+
if (!buf) buf = Buffer$1.alloc(rsshfp.encodingLength(record));
|
|
4027
|
+
if (!offset) offset = 0;
|
|
4028
|
+
const oldOffset = offset;
|
|
4029
|
+
offset += 2;
|
|
4030
|
+
buf[offset] = record.algorithm;
|
|
4031
|
+
offset += 1;
|
|
4032
|
+
buf[offset] = record.hash;
|
|
4033
|
+
offset += 1;
|
|
4034
|
+
const fingerprintBuf = Buffer$1.from(record.fingerprint.toUpperCase(), "hex");
|
|
4035
|
+
if (fingerprintBuf.length !== rsshfp.getFingerprintLengthForHashType(record.hash)) throw new Error("Invalid fingerprint length");
|
|
4036
|
+
fingerprintBuf.copy(buf, offset);
|
|
4037
|
+
offset += fingerprintBuf.byteLength;
|
|
4038
|
+
rsshfp.encode.bytes = offset - oldOffset;
|
|
4039
|
+
buf.writeUInt16BE(rsshfp.encode.bytes - 2, oldOffset);
|
|
4040
|
+
return buf;
|
|
4041
|
+
};
|
|
4042
|
+
rsshfp.encode.bytes = 0;
|
|
4043
|
+
rsshfp.decode = function decode(buf, offset) {
|
|
4044
|
+
if (!offset) offset = 0;
|
|
4045
|
+
const oldOffset = offset;
|
|
4046
|
+
const record = {};
|
|
4047
|
+
offset += 2;
|
|
4048
|
+
record.algorithm = buf[offset];
|
|
4049
|
+
offset += 1;
|
|
4050
|
+
record.hash = buf[offset];
|
|
4051
|
+
offset += 1;
|
|
4052
|
+
const fingerprintLength = rsshfp.getFingerprintLengthForHashType(record.hash);
|
|
4053
|
+
record.fingerprint = buf.slice(offset, offset + fingerprintLength).toString("hex").toUpperCase();
|
|
4054
|
+
offset += fingerprintLength;
|
|
4055
|
+
rsshfp.decode.bytes = offset - oldOffset;
|
|
4056
|
+
return record;
|
|
4057
|
+
};
|
|
4058
|
+
rsshfp.decode.bytes = 0;
|
|
4059
|
+
rsshfp.encodingLength = function(record) {
|
|
4060
|
+
return 4 + Buffer$1.from(record.fingerprint, "hex").byteLength;
|
|
4061
|
+
};
|
|
4062
|
+
const rnaptr = exports.naptr = {};
|
|
4063
|
+
rnaptr.encode = function(data, buf, offset) {
|
|
4064
|
+
if (!buf) buf = Buffer$1.alloc(rnaptr.encodingLength(data));
|
|
4065
|
+
if (!offset) offset = 0;
|
|
4066
|
+
const oldOffset = offset;
|
|
4067
|
+
offset += 2;
|
|
4068
|
+
buf.writeUInt16BE(data.order || 0, offset);
|
|
4069
|
+
offset += 2;
|
|
4070
|
+
buf.writeUInt16BE(data.preference || 0, offset);
|
|
4071
|
+
offset += 2;
|
|
4072
|
+
string.encode(data.flags, buf, offset);
|
|
4073
|
+
offset += string.encode.bytes;
|
|
4074
|
+
string.encode(data.services, buf, offset);
|
|
4075
|
+
offset += string.encode.bytes;
|
|
4076
|
+
string.encode(data.regexp, buf, offset);
|
|
4077
|
+
offset += string.encode.bytes;
|
|
4078
|
+
name.encode(data.replacement, buf, offset);
|
|
4079
|
+
offset += name.encode.bytes;
|
|
4080
|
+
rnaptr.encode.bytes = offset - oldOffset;
|
|
4081
|
+
buf.writeUInt16BE(rnaptr.encode.bytes - 2, oldOffset);
|
|
4082
|
+
return buf;
|
|
4083
|
+
};
|
|
4084
|
+
rnaptr.encode.bytes = 0;
|
|
4085
|
+
rnaptr.decode = function(buf, offset) {
|
|
4086
|
+
if (!offset) offset = 0;
|
|
4087
|
+
const oldOffset = offset;
|
|
4088
|
+
const data = {};
|
|
4089
|
+
offset += 2;
|
|
4090
|
+
data.order = buf.readUInt16BE(offset);
|
|
4091
|
+
offset += 2;
|
|
4092
|
+
data.preference = buf.readUInt16BE(offset);
|
|
4093
|
+
offset += 2;
|
|
4094
|
+
data.flags = string.decode(buf, offset);
|
|
4095
|
+
offset += string.decode.bytes;
|
|
4096
|
+
data.services = string.decode(buf, offset);
|
|
4097
|
+
offset += string.decode.bytes;
|
|
4098
|
+
data.regexp = string.decode(buf, offset);
|
|
4099
|
+
offset += string.decode.bytes;
|
|
4100
|
+
data.replacement = name.decode(buf, offset);
|
|
4101
|
+
offset += name.decode.bytes;
|
|
4102
|
+
rnaptr.decode.bytes = offset - oldOffset;
|
|
4103
|
+
return data;
|
|
4104
|
+
};
|
|
4105
|
+
rnaptr.decode.bytes = 0;
|
|
4106
|
+
rnaptr.encodingLength = function(data) {
|
|
4107
|
+
return string.encodingLength(data.flags) + string.encodingLength(data.services) + string.encodingLength(data.regexp) + name.encodingLength(data.replacement) + 6;
|
|
4108
|
+
};
|
|
4109
|
+
const rtlsa = exports.tlsa = {};
|
|
4110
|
+
rtlsa.encode = function(cert, buf, offset) {
|
|
4111
|
+
if (!buf) buf = Buffer$1.alloc(rtlsa.encodingLength(cert));
|
|
4112
|
+
if (!offset) offset = 0;
|
|
4113
|
+
const oldOffset = offset;
|
|
4114
|
+
const certdata = cert.certificate;
|
|
4115
|
+
if (!Buffer$1.isBuffer(certdata)) throw new Error("Certificate must be a Buffer");
|
|
4116
|
+
offset += 2;
|
|
4117
|
+
buf.writeUInt8(cert.usage, offset);
|
|
4118
|
+
offset += 1;
|
|
4119
|
+
buf.writeUInt8(cert.selector, offset);
|
|
4120
|
+
offset += 1;
|
|
4121
|
+
buf.writeUInt8(cert.matchingType, offset);
|
|
4122
|
+
offset += 1;
|
|
4123
|
+
certdata.copy(buf, offset, 0, certdata.length);
|
|
4124
|
+
offset += certdata.length;
|
|
4125
|
+
rtlsa.encode.bytes = offset - oldOffset;
|
|
4126
|
+
buf.writeUInt16BE(rtlsa.encode.bytes - 2, oldOffset);
|
|
4127
|
+
return buf;
|
|
4128
|
+
};
|
|
4129
|
+
rtlsa.encode.bytes = 0;
|
|
4130
|
+
rtlsa.decode = function(buf, offset) {
|
|
4131
|
+
if (!offset) offset = 0;
|
|
4132
|
+
const oldOffset = offset;
|
|
4133
|
+
const cert = {};
|
|
4134
|
+
const length = buf.readUInt16BE(offset);
|
|
4135
|
+
offset += 2;
|
|
4136
|
+
cert.usage = buf.readUInt8(offset);
|
|
4137
|
+
offset += 1;
|
|
4138
|
+
cert.selector = buf.readUInt8(offset);
|
|
4139
|
+
offset += 1;
|
|
4140
|
+
cert.matchingType = buf.readUInt8(offset);
|
|
4141
|
+
offset += 1;
|
|
4142
|
+
cert.certificate = buf.slice(offset, oldOffset + length + 2);
|
|
4143
|
+
offset += cert.certificate.length;
|
|
4144
|
+
rtlsa.decode.bytes = offset - oldOffset;
|
|
4145
|
+
return cert;
|
|
4146
|
+
};
|
|
4147
|
+
rtlsa.decode.bytes = 0;
|
|
4148
|
+
rtlsa.encodingLength = function(cert) {
|
|
4149
|
+
return 5 + Buffer$1.byteLength(cert.certificate);
|
|
4150
|
+
};
|
|
4151
|
+
const renc = exports.record = function(type) {
|
|
4152
|
+
switch (type.toUpperCase()) {
|
|
4153
|
+
case "A": return ra;
|
|
4154
|
+
case "PTR": return rptr;
|
|
4155
|
+
case "CNAME": return rcname;
|
|
4156
|
+
case "DNAME": return rdname;
|
|
4157
|
+
case "TXT": return rtxt;
|
|
4158
|
+
case "NULL": return rnull;
|
|
4159
|
+
case "AAAA": return raaaa;
|
|
4160
|
+
case "SRV": return rsrv;
|
|
4161
|
+
case "HINFO": return rhinfo;
|
|
4162
|
+
case "CAA": return rcaa;
|
|
4163
|
+
case "NS": return rns;
|
|
4164
|
+
case "SOA": return rsoa;
|
|
4165
|
+
case "MX": return rmx;
|
|
4166
|
+
case "OPT": return ropt;
|
|
4167
|
+
case "DNSKEY": return rdnskey;
|
|
4168
|
+
case "RRSIG": return rrrsig;
|
|
4169
|
+
case "RP": return rrp;
|
|
4170
|
+
case "NSEC": return rnsec;
|
|
4171
|
+
case "NSEC3": return rnsec3;
|
|
4172
|
+
case "SSHFP": return rsshfp;
|
|
4173
|
+
case "DS": return rds;
|
|
4174
|
+
case "NAPTR": return rnaptr;
|
|
4175
|
+
case "TLSA": return rtlsa;
|
|
4176
|
+
}
|
|
4177
|
+
return runknown;
|
|
4178
|
+
};
|
|
4179
|
+
const answer = exports.answer = {};
|
|
4180
|
+
answer.encode = function(a, buf, offset) {
|
|
4181
|
+
if (!buf) buf = Buffer$1.alloc(answer.encodingLength(a));
|
|
4182
|
+
if (!offset) offset = 0;
|
|
4183
|
+
const oldOffset = offset;
|
|
4184
|
+
name.encode(a.name, buf, offset);
|
|
4185
|
+
offset += name.encode.bytes;
|
|
4186
|
+
buf.writeUInt16BE(types.toType(a.type), offset);
|
|
4187
|
+
if (a.type.toUpperCase() === "OPT") {
|
|
4188
|
+
if (a.name !== ".") throw new Error("OPT name must be root.");
|
|
4189
|
+
buf.writeUInt16BE(a.udpPayloadSize || 4096, offset + 2);
|
|
4190
|
+
buf.writeUInt8(a.extendedRcode || 0, offset + 4);
|
|
4191
|
+
buf.writeUInt8(a.ednsVersion || 0, offset + 5);
|
|
4192
|
+
buf.writeUInt16BE(a.flags || 0, offset + 6);
|
|
4193
|
+
offset += 8;
|
|
4194
|
+
ropt.encode(a.options || [], buf, offset);
|
|
4195
|
+
offset += ropt.encode.bytes;
|
|
4196
|
+
} else {
|
|
4197
|
+
let klass = classes.toClass(a.class === void 0 ? "IN" : a.class);
|
|
4198
|
+
if (a.flush) klass |= FLUSH_MASK;
|
|
4199
|
+
buf.writeUInt16BE(klass, offset + 2);
|
|
4200
|
+
buf.writeUInt32BE(a.ttl || 0, offset + 4);
|
|
4201
|
+
offset += 8;
|
|
4202
|
+
const enc = renc(a.type);
|
|
4203
|
+
enc.encode(a.data, buf, offset);
|
|
4204
|
+
offset += enc.encode.bytes;
|
|
4205
|
+
}
|
|
4206
|
+
answer.encode.bytes = offset - oldOffset;
|
|
4207
|
+
return buf;
|
|
4208
|
+
};
|
|
4209
|
+
answer.encode.bytes = 0;
|
|
4210
|
+
answer.decode = function(buf, offset) {
|
|
4211
|
+
if (!offset) offset = 0;
|
|
4212
|
+
const a = {};
|
|
4213
|
+
const oldOffset = offset;
|
|
4214
|
+
a.name = name.decode(buf, offset);
|
|
4215
|
+
offset += name.decode.bytes;
|
|
4216
|
+
a.type = types.toString(buf.readUInt16BE(offset));
|
|
4217
|
+
if (a.type === "OPT") {
|
|
4218
|
+
a.udpPayloadSize = buf.readUInt16BE(offset + 2);
|
|
4219
|
+
a.extendedRcode = buf.readUInt8(offset + 4);
|
|
4220
|
+
a.ednsVersion = buf.readUInt8(offset + 5);
|
|
4221
|
+
a.flags = buf.readUInt16BE(offset + 6);
|
|
4222
|
+
a.flag_do = (a.flags >> 15 & 1) === 1;
|
|
4223
|
+
a.options = ropt.decode(buf, offset + 8);
|
|
4224
|
+
offset += 8 + ropt.decode.bytes;
|
|
4225
|
+
} else {
|
|
4226
|
+
const klass = buf.readUInt16BE(offset + 2);
|
|
4227
|
+
a.ttl = buf.readUInt32BE(offset + 4);
|
|
4228
|
+
a.class = classes.toString(klass & NOT_FLUSH_MASK);
|
|
4229
|
+
a.flush = !!(klass & FLUSH_MASK);
|
|
4230
|
+
const enc = renc(a.type);
|
|
4231
|
+
a.data = enc.decode(buf, offset + 8);
|
|
4232
|
+
offset += 8 + enc.decode.bytes;
|
|
4233
|
+
}
|
|
4234
|
+
answer.decode.bytes = offset - oldOffset;
|
|
4235
|
+
return a;
|
|
4236
|
+
};
|
|
4237
|
+
answer.decode.bytes = 0;
|
|
4238
|
+
answer.encodingLength = function(a) {
|
|
4239
|
+
const data = a.data !== null && a.data !== void 0 ? a.data : a.options;
|
|
4240
|
+
return name.encodingLength(a.name) + 8 + renc(a.type).encodingLength(data);
|
|
4241
|
+
};
|
|
4242
|
+
const question = exports.question = {};
|
|
4243
|
+
question.encode = function(q, buf, offset) {
|
|
4244
|
+
if (!buf) buf = Buffer$1.alloc(question.encodingLength(q));
|
|
4245
|
+
if (!offset) offset = 0;
|
|
4246
|
+
const oldOffset = offset;
|
|
4247
|
+
name.encode(q.name, buf, offset);
|
|
4248
|
+
offset += name.encode.bytes;
|
|
4249
|
+
buf.writeUInt16BE(types.toType(q.type), offset);
|
|
4250
|
+
offset += 2;
|
|
4251
|
+
buf.writeUInt16BE(classes.toClass(q.class === void 0 ? "IN" : q.class), offset);
|
|
4252
|
+
offset += 2;
|
|
4253
|
+
question.encode.bytes = offset - oldOffset;
|
|
4254
|
+
return q;
|
|
4255
|
+
};
|
|
4256
|
+
question.encode.bytes = 0;
|
|
4257
|
+
question.decode = function(buf, offset) {
|
|
4258
|
+
if (!offset) offset = 0;
|
|
4259
|
+
const oldOffset = offset;
|
|
4260
|
+
const q = {};
|
|
4261
|
+
q.name = name.decode(buf, offset);
|
|
4262
|
+
offset += name.decode.bytes;
|
|
4263
|
+
q.type = types.toString(buf.readUInt16BE(offset));
|
|
4264
|
+
offset += 2;
|
|
4265
|
+
q.class = classes.toString(buf.readUInt16BE(offset));
|
|
4266
|
+
offset += 2;
|
|
4267
|
+
if (!!(q.class & QU_MASK)) q.class &= NOT_QU_MASK;
|
|
4268
|
+
question.decode.bytes = offset - oldOffset;
|
|
4269
|
+
return q;
|
|
4270
|
+
};
|
|
4271
|
+
question.decode.bytes = 0;
|
|
4272
|
+
question.encodingLength = function(q) {
|
|
4273
|
+
return name.encodingLength(q.name) + 4;
|
|
4274
|
+
};
|
|
4275
|
+
exports.AUTHORITATIVE_ANSWER = 1024;
|
|
4276
|
+
exports.TRUNCATED_RESPONSE = 512;
|
|
4277
|
+
exports.RECURSION_DESIRED = 256;
|
|
4278
|
+
exports.RECURSION_AVAILABLE = 128;
|
|
4279
|
+
exports.AUTHENTIC_DATA = 32;
|
|
4280
|
+
exports.CHECKING_DISABLED = 16;
|
|
4281
|
+
exports.DNSSEC_OK = 32768;
|
|
4282
|
+
exports.encode = function(result, buf, offset) {
|
|
4283
|
+
const allocing = !buf;
|
|
4284
|
+
if (allocing) buf = Buffer$1.alloc(exports.encodingLength(result));
|
|
4285
|
+
if (!offset) offset = 0;
|
|
4286
|
+
const oldOffset = offset;
|
|
4287
|
+
if (!result.questions) result.questions = [];
|
|
4288
|
+
if (!result.answers) result.answers = [];
|
|
4289
|
+
if (!result.authorities) result.authorities = [];
|
|
4290
|
+
if (!result.additionals) result.additionals = [];
|
|
4291
|
+
header.encode(result, buf, offset);
|
|
4292
|
+
offset += header.encode.bytes;
|
|
4293
|
+
offset = encodeList(result.questions, question, buf, offset);
|
|
4294
|
+
offset = encodeList(result.answers, answer, buf, offset);
|
|
4295
|
+
offset = encodeList(result.authorities, answer, buf, offset);
|
|
4296
|
+
offset = encodeList(result.additionals, answer, buf, offset);
|
|
4297
|
+
exports.encode.bytes = offset - oldOffset;
|
|
4298
|
+
if (allocing && exports.encode.bytes !== buf.length) return buf.slice(0, exports.encode.bytes);
|
|
4299
|
+
return buf;
|
|
4300
|
+
};
|
|
4301
|
+
exports.encode.bytes = 0;
|
|
4302
|
+
exports.decode = function(buf, offset) {
|
|
4303
|
+
if (!offset) offset = 0;
|
|
4304
|
+
const oldOffset = offset;
|
|
4305
|
+
const result = header.decode(buf, offset);
|
|
4306
|
+
offset += header.decode.bytes;
|
|
4307
|
+
offset = decodeList(result.questions, question, buf, offset);
|
|
4308
|
+
offset = decodeList(result.answers, answer, buf, offset);
|
|
4309
|
+
offset = decodeList(result.authorities, answer, buf, offset);
|
|
4310
|
+
offset = decodeList(result.additionals, answer, buf, offset);
|
|
4311
|
+
exports.decode.bytes = offset - oldOffset;
|
|
4312
|
+
return result;
|
|
4313
|
+
};
|
|
4314
|
+
exports.decode.bytes = 0;
|
|
4315
|
+
exports.encodingLength = function(result) {
|
|
4316
|
+
return header.encodingLength(result) + encodingLengthList(result.questions || [], question) + encodingLengthList(result.answers || [], answer) + encodingLengthList(result.authorities || [], answer) + encodingLengthList(result.additionals || [], answer);
|
|
4317
|
+
};
|
|
4318
|
+
exports.streamEncode = function(result) {
|
|
4319
|
+
const buf = exports.encode(result);
|
|
4320
|
+
const sbuf = Buffer$1.alloc(2);
|
|
4321
|
+
sbuf.writeUInt16BE(buf.byteLength);
|
|
4322
|
+
const combine = Buffer$1.concat([sbuf, buf]);
|
|
4323
|
+
exports.streamEncode.bytes = combine.byteLength;
|
|
4324
|
+
return combine;
|
|
4325
|
+
};
|
|
4326
|
+
exports.streamEncode.bytes = 0;
|
|
4327
|
+
exports.streamDecode = function(sbuf) {
|
|
4328
|
+
const len = sbuf.readUInt16BE(0);
|
|
4329
|
+
if (sbuf.byteLength < len + 2) return null;
|
|
4330
|
+
const result = exports.decode(sbuf.slice(2));
|
|
4331
|
+
exports.streamDecode.bytes = exports.decode.bytes;
|
|
4332
|
+
return result;
|
|
4333
|
+
};
|
|
4334
|
+
exports.streamDecode.bytes = 0;
|
|
4335
|
+
function encodingLengthList(list, enc) {
|
|
4336
|
+
let len = 0;
|
|
4337
|
+
for (let i = 0; i < list.length; i++) len += enc.encodingLength(list[i]);
|
|
4338
|
+
return len;
|
|
4339
|
+
}
|
|
4340
|
+
function encodeList(list, enc, buf, offset) {
|
|
4341
|
+
for (let i = 0; i < list.length; i++) {
|
|
4342
|
+
enc.encode(list[i], buf, offset);
|
|
4343
|
+
offset += enc.encode.bytes;
|
|
4344
|
+
}
|
|
4345
|
+
return offset;
|
|
4346
|
+
}
|
|
4347
|
+
function decodeList(list, enc, buf, offset) {
|
|
4348
|
+
for (let i = 0; i < list.length; i++) {
|
|
4349
|
+
list[i] = enc.decode(buf, offset);
|
|
4350
|
+
offset += enc.decode.bytes;
|
|
4351
|
+
}
|
|
4352
|
+
return offset;
|
|
4353
|
+
}
|
|
4354
|
+
}));
|
|
4355
|
+
//#endregion
|
|
4356
|
+
//#region ../../node_modules/thunky/index.js
|
|
4357
|
+
var require_thunky = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
4358
|
+
var nextTick = nextTickArgs;
|
|
4359
|
+
process.nextTick(upgrade, 42);
|
|
4360
|
+
module.exports = thunky;
|
|
4361
|
+
function thunky(fn) {
|
|
4362
|
+
var state = run;
|
|
4363
|
+
return thunk;
|
|
4364
|
+
function thunk(callback) {
|
|
4365
|
+
state(callback || noop);
|
|
4366
|
+
}
|
|
4367
|
+
function run(callback) {
|
|
4368
|
+
var stack = [callback];
|
|
4369
|
+
state = wait;
|
|
4370
|
+
fn(done);
|
|
4371
|
+
function wait(callback) {
|
|
4372
|
+
stack.push(callback);
|
|
4373
|
+
}
|
|
4374
|
+
function done(err) {
|
|
4375
|
+
var args = arguments;
|
|
4376
|
+
state = isError(err) ? run : finished;
|
|
4377
|
+
while (stack.length) finished(stack.shift());
|
|
4378
|
+
function finished(callback) {
|
|
4379
|
+
nextTick(apply, callback, args);
|
|
4380
|
+
}
|
|
4381
|
+
}
|
|
4382
|
+
}
|
|
4383
|
+
}
|
|
4384
|
+
function isError(err) {
|
|
4385
|
+
return Object.prototype.toString.call(err) === "[object Error]";
|
|
4386
|
+
}
|
|
4387
|
+
function noop() {}
|
|
4388
|
+
function apply(callback, args) {
|
|
4389
|
+
callback.apply(null, args);
|
|
4390
|
+
}
|
|
4391
|
+
function upgrade(val) {
|
|
4392
|
+
if (val === 42) nextTick = process.nextTick;
|
|
4393
|
+
}
|
|
4394
|
+
function nextTickArgs(fn, a, b) {
|
|
4395
|
+
process.nextTick(function() {
|
|
4396
|
+
fn(a, b);
|
|
4397
|
+
});
|
|
4398
|
+
}
|
|
4399
|
+
}));
|
|
4400
|
+
//#endregion
|
|
4401
|
+
//#region ../../node_modules/multicast-dns/index.js
|
|
4402
|
+
var require_multicast_dns = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
4403
|
+
var packet = require_dns_packet();
|
|
4404
|
+
var dgram = __require("dgram");
|
|
4405
|
+
var thunky = require_thunky();
|
|
4406
|
+
var events = __require("events");
|
|
4407
|
+
var os = __require("os");
|
|
4408
|
+
var noop = function() {};
|
|
4409
|
+
module.exports = function(opts) {
|
|
4410
|
+
if (!opts) opts = {};
|
|
4411
|
+
var that = new events.EventEmitter();
|
|
4412
|
+
var port = typeof opts.port === "number" ? opts.port : 5353;
|
|
4413
|
+
var type = opts.type || "udp4";
|
|
4414
|
+
var ip = opts.ip || opts.host || (type === "udp4" ? "224.0.0.251" : null);
|
|
4415
|
+
var me = {
|
|
4416
|
+
address: ip,
|
|
4417
|
+
port
|
|
4418
|
+
};
|
|
4419
|
+
var memberships = {};
|
|
4420
|
+
var destroyed = false;
|
|
4421
|
+
var interval = null;
|
|
4422
|
+
if (type === "udp6" && (!ip || !opts.interface)) throw new Error("For IPv6 multicast you must specify `ip` and `interface`");
|
|
4423
|
+
var socket = opts.socket || dgram.createSocket({
|
|
4424
|
+
type,
|
|
4425
|
+
reuseAddr: opts.reuseAddr !== false,
|
|
4426
|
+
toString: function() {
|
|
4427
|
+
return type;
|
|
4428
|
+
}
|
|
4429
|
+
});
|
|
4430
|
+
socket.on("error", function(err) {
|
|
4431
|
+
if (err.code === "EACCES" || err.code === "EADDRINUSE") that.emit("error", err);
|
|
4432
|
+
else that.emit("warning", err);
|
|
4433
|
+
});
|
|
4434
|
+
socket.on("message", function(message, rinfo) {
|
|
4435
|
+
try {
|
|
4436
|
+
message = packet.decode(message);
|
|
4437
|
+
} catch (err) {
|
|
4438
|
+
that.emit("warning", err);
|
|
4439
|
+
return;
|
|
4440
|
+
}
|
|
4441
|
+
that.emit("packet", message, rinfo);
|
|
4442
|
+
if (message.type === "query") that.emit("query", message, rinfo);
|
|
4443
|
+
if (message.type === "response") that.emit("response", message, rinfo);
|
|
4444
|
+
});
|
|
4445
|
+
socket.on("listening", function() {
|
|
4446
|
+
if (!port) port = me.port = socket.address().port;
|
|
4447
|
+
if (opts.multicast !== false) {
|
|
4448
|
+
that.update();
|
|
4449
|
+
interval = setInterval(that.update, 5e3);
|
|
4450
|
+
socket.setMulticastTTL(opts.ttl || 255);
|
|
4451
|
+
socket.setMulticastLoopback(opts.loopback !== false);
|
|
4452
|
+
}
|
|
4453
|
+
});
|
|
4454
|
+
var bind = thunky(function(cb) {
|
|
4455
|
+
if (!port || opts.bind === false) return cb(null);
|
|
4456
|
+
socket.once("error", cb);
|
|
4457
|
+
socket.bind(port, opts.bind || opts.interface, function() {
|
|
4458
|
+
socket.removeListener("error", cb);
|
|
4459
|
+
cb(null);
|
|
4460
|
+
});
|
|
4461
|
+
});
|
|
4462
|
+
bind(function(err) {
|
|
4463
|
+
if (err) return that.emit("error", err);
|
|
4464
|
+
that.emit("ready");
|
|
4465
|
+
});
|
|
4466
|
+
that.send = function(value, rinfo, cb) {
|
|
4467
|
+
if (typeof rinfo === "function") return that.send(value, null, rinfo);
|
|
4468
|
+
if (!cb) cb = noop;
|
|
4469
|
+
if (!rinfo) rinfo = me;
|
|
4470
|
+
else if (!rinfo.host && !rinfo.address) rinfo.address = me.address;
|
|
4471
|
+
bind(onbind);
|
|
4472
|
+
function onbind(err) {
|
|
4473
|
+
if (destroyed) return cb();
|
|
4474
|
+
if (err) return cb(err);
|
|
4475
|
+
var message = packet.encode(value);
|
|
4476
|
+
socket.send(message, 0, message.length, rinfo.port, rinfo.address || rinfo.host, cb);
|
|
4477
|
+
}
|
|
4478
|
+
};
|
|
4479
|
+
that.response = that.respond = function(res, rinfo, cb) {
|
|
4480
|
+
if (Array.isArray(res)) res = { answers: res };
|
|
4481
|
+
res.type = "response";
|
|
4482
|
+
res.flags = (res.flags || 0) | packet.AUTHORITATIVE_ANSWER;
|
|
4483
|
+
that.send(res, rinfo, cb);
|
|
4484
|
+
};
|
|
4485
|
+
that.query = function(q, type, rinfo, cb) {
|
|
4486
|
+
if (typeof type === "function") return that.query(q, null, null, type);
|
|
4487
|
+
if (typeof type === "object" && type && type.port) return that.query(q, null, type, rinfo);
|
|
4488
|
+
if (typeof rinfo === "function") return that.query(q, type, null, rinfo);
|
|
4489
|
+
if (!cb) cb = noop;
|
|
4490
|
+
if (typeof q === "string") q = [{
|
|
4491
|
+
name: q,
|
|
4492
|
+
type: type || "ANY"
|
|
4493
|
+
}];
|
|
4494
|
+
if (Array.isArray(q)) q = {
|
|
4495
|
+
type: "query",
|
|
4496
|
+
questions: q
|
|
4497
|
+
};
|
|
4498
|
+
q.type = "query";
|
|
4499
|
+
that.send(q, rinfo, cb);
|
|
4500
|
+
};
|
|
4501
|
+
that.destroy = function(cb) {
|
|
4502
|
+
if (!cb) cb = noop;
|
|
4503
|
+
if (destroyed) return process.nextTick(cb);
|
|
4504
|
+
destroyed = true;
|
|
4505
|
+
clearInterval(interval);
|
|
4506
|
+
for (var iface in memberships) try {
|
|
4507
|
+
socket.dropMembership(ip, iface);
|
|
4508
|
+
} catch (e) {}
|
|
4509
|
+
memberships = {};
|
|
4510
|
+
socket.close(cb);
|
|
4511
|
+
};
|
|
4512
|
+
that.update = function() {
|
|
4513
|
+
var ifaces = opts.interface ? [].concat(opts.interface) : allInterfaces();
|
|
4514
|
+
var updated = false;
|
|
4515
|
+
for (var i = 0; i < ifaces.length; i++) {
|
|
4516
|
+
var addr = ifaces[i];
|
|
4517
|
+
if (memberships[addr]) continue;
|
|
4518
|
+
try {
|
|
4519
|
+
socket.addMembership(ip, addr);
|
|
4520
|
+
memberships[addr] = true;
|
|
4521
|
+
updated = true;
|
|
4522
|
+
} catch (err) {
|
|
4523
|
+
that.emit("warning", err);
|
|
4524
|
+
}
|
|
4525
|
+
}
|
|
4526
|
+
if (updated) {
|
|
4527
|
+
if (socket.setMulticastInterface) try {
|
|
4528
|
+
socket.setMulticastInterface(opts.interface || defaultInterface());
|
|
4529
|
+
} catch (err) {
|
|
4530
|
+
that.emit("warning", err);
|
|
4531
|
+
}
|
|
4532
|
+
that.emit("networkInterface");
|
|
4533
|
+
}
|
|
4534
|
+
};
|
|
4535
|
+
return that;
|
|
4536
|
+
};
|
|
4537
|
+
function defaultInterface() {
|
|
4538
|
+
var networks = os.networkInterfaces();
|
|
4539
|
+
var names = Object.keys(networks);
|
|
4540
|
+
for (var i = 0; i < names.length; i++) {
|
|
4541
|
+
var net = networks[names[i]];
|
|
4542
|
+
for (var j = 0; j < net.length; j++) {
|
|
4543
|
+
var iface = net[j];
|
|
4544
|
+
if (isIPv4(iface.family) && !iface.internal) {
|
|
4545
|
+
if (os.platform() === "darwin" && names[i] === "en0") return iface.address;
|
|
4546
|
+
return "0.0.0.0";
|
|
4547
|
+
}
|
|
4548
|
+
}
|
|
4549
|
+
}
|
|
4550
|
+
return "127.0.0.1";
|
|
4551
|
+
}
|
|
4552
|
+
function allInterfaces() {
|
|
4553
|
+
var networks = os.networkInterfaces();
|
|
4554
|
+
var names = Object.keys(networks);
|
|
4555
|
+
var res = [];
|
|
4556
|
+
for (var i = 0; i < names.length; i++) {
|
|
4557
|
+
var net = networks[names[i]];
|
|
4558
|
+
for (var j = 0; j < net.length; j++) {
|
|
4559
|
+
var iface = net[j];
|
|
4560
|
+
if (isIPv4(iface.family)) {
|
|
4561
|
+
res.push(iface.address);
|
|
4562
|
+
break;
|
|
4563
|
+
}
|
|
4564
|
+
}
|
|
4565
|
+
}
|
|
4566
|
+
return res;
|
|
4567
|
+
}
|
|
4568
|
+
function isIPv4(family) {
|
|
4569
|
+
return family === 4 || family === "IPv4";
|
|
4570
|
+
}
|
|
4571
|
+
}));
|
|
4572
|
+
//#endregion
|
|
4573
|
+
//#region ../../node_modules/fast-deep-equal/es6/index.js
|
|
4574
|
+
var require_es6 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
4575
|
+
module.exports = function equal(a, b) {
|
|
4576
|
+
if (a === b) return true;
|
|
4577
|
+
if (a && b && typeof a == "object" && typeof b == "object") {
|
|
4578
|
+
if (a.constructor !== b.constructor) return false;
|
|
4579
|
+
var length, i, keys;
|
|
4580
|
+
if (Array.isArray(a)) {
|
|
4581
|
+
length = a.length;
|
|
4582
|
+
if (length != b.length) return false;
|
|
4583
|
+
for (i = length; i-- !== 0;) if (!equal(a[i], b[i])) return false;
|
|
4584
|
+
return true;
|
|
4585
|
+
}
|
|
4586
|
+
if (a instanceof Map && b instanceof Map) {
|
|
4587
|
+
if (a.size !== b.size) return false;
|
|
4588
|
+
for (i of a.entries()) if (!b.has(i[0])) return false;
|
|
4589
|
+
for (i of a.entries()) if (!equal(i[1], b.get(i[0]))) return false;
|
|
4590
|
+
return true;
|
|
4591
|
+
}
|
|
4592
|
+
if (a instanceof Set && b instanceof Set) {
|
|
4593
|
+
if (a.size !== b.size) return false;
|
|
4594
|
+
for (i of a.entries()) if (!b.has(i[0])) return false;
|
|
4595
|
+
return true;
|
|
4596
|
+
}
|
|
4597
|
+
if (ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) {
|
|
4598
|
+
length = a.length;
|
|
4599
|
+
if (length != b.length) return false;
|
|
4600
|
+
for (i = length; i-- !== 0;) if (a[i] !== b[i]) return false;
|
|
4601
|
+
return true;
|
|
4602
|
+
}
|
|
4603
|
+
if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;
|
|
4604
|
+
if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();
|
|
4605
|
+
if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();
|
|
4606
|
+
keys = Object.keys(a);
|
|
4607
|
+
length = keys.length;
|
|
4608
|
+
if (length !== Object.keys(b).length) return false;
|
|
4609
|
+
for (i = length; i-- !== 0;) if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;
|
|
4610
|
+
for (i = length; i-- !== 0;) {
|
|
4611
|
+
var key = keys[i];
|
|
4612
|
+
if (!equal(a[key], b[key])) return false;
|
|
4613
|
+
}
|
|
4614
|
+
return true;
|
|
4615
|
+
}
|
|
4616
|
+
return a !== a && b !== b;
|
|
4617
|
+
};
|
|
4618
|
+
}));
|
|
4619
|
+
//#endregion
|
|
4620
|
+
//#region ../../node_modules/bonjour-service/dist/lib/mdns-server.js
|
|
4621
|
+
var require_mdns_server = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
4622
|
+
var __importDefault = exports && exports.__importDefault || function(mod) {
|
|
4623
|
+
return mod && mod.__esModule ? mod : { "default": mod };
|
|
4624
|
+
};
|
|
4625
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4626
|
+
exports.Server = void 0;
|
|
4627
|
+
const multicast_dns_1 = __importDefault(require_multicast_dns());
|
|
4628
|
+
const es6_1 = __importDefault(require_es6());
|
|
4629
|
+
const dns_equal_1 = __importDefault(require_dns_equal());
|
|
4630
|
+
var Server = class {
|
|
4631
|
+
constructor(opts, errorCallback) {
|
|
4632
|
+
this.registry = {};
|
|
4633
|
+
this.mdns = (0, multicast_dns_1.default)(opts);
|
|
4634
|
+
this.mdns.setMaxListeners(0);
|
|
4635
|
+
this.mdns.on("query", this.respondToQuery.bind(this));
|
|
4636
|
+
this.errorCallback = errorCallback !== null && errorCallback !== void 0 ? errorCallback : function(err) {
|
|
4637
|
+
throw err;
|
|
4638
|
+
};
|
|
4639
|
+
}
|
|
4640
|
+
register(records) {
|
|
4641
|
+
const shouldRegister = (record) => {
|
|
4642
|
+
var subRegistry = this.registry[record.type];
|
|
4643
|
+
if (!subRegistry) subRegistry = this.registry[record.type] = [];
|
|
4644
|
+
else if (subRegistry.some(this.isDuplicateRecord(record))) return;
|
|
4645
|
+
subRegistry.push(record);
|
|
4646
|
+
};
|
|
4647
|
+
if (Array.isArray(records)) records.forEach(shouldRegister);
|
|
4648
|
+
else shouldRegister(records);
|
|
4649
|
+
}
|
|
4650
|
+
unregister(records) {
|
|
4651
|
+
const shouldUnregister = (record) => {
|
|
4652
|
+
let type = record.type;
|
|
4653
|
+
if (!(type in this.registry)) return;
|
|
4654
|
+
this.registry[type] = this.registry[type].filter((i) => i.name !== record.name);
|
|
4655
|
+
};
|
|
4656
|
+
if (Array.isArray(records)) records.forEach(shouldUnregister);
|
|
4657
|
+
else shouldUnregister(records);
|
|
4658
|
+
}
|
|
4659
|
+
respondToQuery(query) {
|
|
4660
|
+
let self = this;
|
|
4661
|
+
query.questions.forEach((question) => {
|
|
4662
|
+
var type = question.type;
|
|
4663
|
+
var name = question.name;
|
|
4664
|
+
var answers = type === "ANY" ? Object.keys(self.registry).map(self.recordsFor.bind(self, name)).flat(1) : self.recordsFor(name, type);
|
|
4665
|
+
if (answers.length === 0) return;
|
|
4666
|
+
var additionals = [];
|
|
4667
|
+
if (type !== "ANY") {
|
|
4668
|
+
answers.forEach((answer) => {
|
|
4669
|
+
if (answer.type !== "PTR") return;
|
|
4670
|
+
additionals = additionals.concat(self.recordsFor(answer.data, "SRV")).concat(self.recordsFor(answer.data, "TXT"));
|
|
4671
|
+
});
|
|
4672
|
+
additionals.filter(function(record) {
|
|
4673
|
+
return record.type === "SRV";
|
|
4674
|
+
}).map(function(record) {
|
|
4675
|
+
return record.data.target;
|
|
4676
|
+
}).filter(this.unique()).forEach(function(target) {
|
|
4677
|
+
additionals = additionals.concat(self.recordsFor(target, "A")).concat(self.recordsFor(target, "AAAA"));
|
|
4678
|
+
});
|
|
4679
|
+
}
|
|
4680
|
+
self.mdns.respond({
|
|
4681
|
+
answers,
|
|
4682
|
+
additionals
|
|
4683
|
+
}, (err) => {
|
|
4684
|
+
if (err) this.errorCallback(err);
|
|
4685
|
+
});
|
|
4686
|
+
});
|
|
4687
|
+
}
|
|
4688
|
+
recordsFor(name, type) {
|
|
4689
|
+
if (!(type in this.registry)) return [];
|
|
4690
|
+
return this.registry[type].filter((record) => {
|
|
4691
|
+
var _name = ~name.indexOf(".") ? record.name : record.name.split(".")[0];
|
|
4692
|
+
return (0, dns_equal_1.default)(_name, name);
|
|
4693
|
+
});
|
|
4694
|
+
}
|
|
4695
|
+
isDuplicateRecord(a) {
|
|
4696
|
+
return (b) => {
|
|
4697
|
+
return a.type === b.type && a.name === b.name && (0, es6_1.default)(a.data, b.data);
|
|
4698
|
+
};
|
|
4699
|
+
}
|
|
4700
|
+
unique() {
|
|
4701
|
+
var set = [];
|
|
4702
|
+
return (obj) => {
|
|
4703
|
+
if (~set.indexOf(obj)) return false;
|
|
4704
|
+
set.push(obj);
|
|
4705
|
+
return true;
|
|
4706
|
+
};
|
|
4707
|
+
}
|
|
4708
|
+
};
|
|
4709
|
+
exports.Server = Server;
|
|
4710
|
+
exports.default = Server;
|
|
4711
|
+
}));
|
|
4712
|
+
//#endregion
|
|
4713
|
+
//#region ../../node_modules/bonjour-service/dist/lib/utils/filter-service.js
|
|
4714
|
+
var require_filter_service = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
4715
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4716
|
+
exports.default = (service, txtQuery) => {
|
|
4717
|
+
if (txtQuery === void 0) return true;
|
|
4718
|
+
let serviceTxt = service.txt;
|
|
4719
|
+
let query = Object.entries(txtQuery).map(([key, value]) => {
|
|
4720
|
+
let queryValue = serviceTxt[key];
|
|
4721
|
+
if (queryValue === void 0) return false;
|
|
4722
|
+
if (value != queryValue) return false;
|
|
4723
|
+
return true;
|
|
4724
|
+
});
|
|
4725
|
+
if (query.length == 0) return true;
|
|
4726
|
+
if (query.includes(false)) return false;
|
|
4727
|
+
return true;
|
|
4728
|
+
};
|
|
4729
|
+
}));
|
|
4730
|
+
//#endregion
|
|
4731
|
+
//#region ../../node_modules/bonjour-service/dist/lib/utils/filter-txt.js
|
|
4732
|
+
var require_filter_txt = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
4733
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4734
|
+
exports.default = (data) => Object.keys(data).filter((key) => !key.includes("binary")).reduce((cur, key) => {
|
|
4735
|
+
return Object.assign(cur, { [key]: data[key] });
|
|
4736
|
+
}, {});
|
|
4737
|
+
}));
|
|
4738
|
+
//#endregion
|
|
4739
|
+
//#region ../../node_modules/bonjour-service/dist/lib/utils/equal-txt.js
|
|
4740
|
+
var require_equal_txt = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
4741
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4742
|
+
exports.default = equalTxt;
|
|
4743
|
+
function equalTxt(a, b) {
|
|
4744
|
+
if (a === void 0 || b === void 0) return false;
|
|
4745
|
+
let aKeys = Object.keys(a);
|
|
4746
|
+
let bKeys = Object.keys(b);
|
|
4747
|
+
if (aKeys.length != bKeys.length) return false;
|
|
4748
|
+
for (let key of aKeys) if (a[key] != b[key]) return false;
|
|
4749
|
+
return true;
|
|
4750
|
+
}
|
|
4751
|
+
}));
|
|
4752
|
+
//#endregion
|
|
4753
|
+
//#region ../../node_modules/bonjour-service/dist/lib/browser.js
|
|
4754
|
+
var require_browser = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
4755
|
+
var __importDefault = exports && exports.__importDefault || function(mod) {
|
|
4756
|
+
return mod && mod.__esModule ? mod : { "default": mod };
|
|
4757
|
+
};
|
|
4758
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4759
|
+
exports.Browser = void 0;
|
|
4760
|
+
const dns_txt_1 = __importDefault(require_dns_txt());
|
|
4761
|
+
const dns_equal_1 = __importDefault(require_dns_equal());
|
|
4762
|
+
const events_1 = __require("events");
|
|
4763
|
+
const service_types_1 = require_service_types();
|
|
4764
|
+
const filter_service_1 = __importDefault(require_filter_service());
|
|
4765
|
+
const filter_txt_1 = __importDefault(require_filter_txt());
|
|
4766
|
+
const equal_txt_1 = __importDefault(require_equal_txt());
|
|
4767
|
+
const TLD = ".local";
|
|
4768
|
+
const WILDCARD = "_services._dns-sd._udp" + TLD;
|
|
4769
|
+
var Browser = class Browser extends events_1.EventEmitter {
|
|
4770
|
+
constructor(mdns, opts, onup) {
|
|
4771
|
+
super();
|
|
4772
|
+
this.onresponse = void 0;
|
|
4773
|
+
this.serviceMap = {};
|
|
4774
|
+
this.wildcard = false;
|
|
4775
|
+
this._services = [];
|
|
4776
|
+
if (typeof opts === "function") return new Browser(mdns, null, opts);
|
|
4777
|
+
this.mdns = mdns;
|
|
4778
|
+
this.txt = new dns_txt_1.default(opts !== null && opts.txt != null ? opts.txt : void 0);
|
|
4779
|
+
if (opts === null || opts.type === void 0) {
|
|
4780
|
+
this.name = WILDCARD;
|
|
4781
|
+
this.wildcard = true;
|
|
4782
|
+
} else {
|
|
4783
|
+
this.name = (0, service_types_1.toString)({
|
|
4784
|
+
name: opts.type,
|
|
4785
|
+
protocol: opts.protocol || "tcp"
|
|
4786
|
+
}) + TLD;
|
|
4787
|
+
if (opts.name) this.name = opts.name + "." + this.name;
|
|
4788
|
+
this.wildcard = false;
|
|
4789
|
+
}
|
|
4790
|
+
if (opts != null && opts.txt !== void 0) this.txtQuery = (0, filter_txt_1.default)(opts.txt);
|
|
4791
|
+
if (onup) this.on("up", onup);
|
|
4792
|
+
this.start();
|
|
4793
|
+
}
|
|
4794
|
+
start() {
|
|
4795
|
+
if (this.onresponse || this.name === void 0) return;
|
|
4796
|
+
var self = this;
|
|
4797
|
+
var nameMap = {};
|
|
4798
|
+
if (!this.wildcard) nameMap[this.name] = true;
|
|
4799
|
+
this.onresponse = (packet, rinfo) => {
|
|
4800
|
+
if (self.wildcard) packet.answers.forEach((answer) => {
|
|
4801
|
+
if (answer.type !== "PTR" || answer.name !== self.name || answer.name in nameMap) return;
|
|
4802
|
+
nameMap[answer.data] = true;
|
|
4803
|
+
self.mdns.query(answer.data, "PTR");
|
|
4804
|
+
});
|
|
4805
|
+
const receiveTime = Date.now();
|
|
4806
|
+
Object.keys(nameMap).forEach(function(name) {
|
|
4807
|
+
self.goodbyes(name, packet).forEach(self.removeService.bind(self));
|
|
4808
|
+
var matches = self.buildServicesFor(name, packet, self.txt, rinfo, receiveTime);
|
|
4809
|
+
if (matches.length === 0) return;
|
|
4810
|
+
matches.forEach((service) => {
|
|
4811
|
+
const existingService = self._services.find((s) => (0, dns_equal_1.default)(s.fqdn, service.fqdn));
|
|
4812
|
+
if (existingService) {
|
|
4813
|
+
self.updateServiceSrv(existingService, service);
|
|
4814
|
+
self.updateServiceTxt(existingService, service);
|
|
4815
|
+
return;
|
|
4816
|
+
}
|
|
4817
|
+
self.addService(service);
|
|
4818
|
+
});
|
|
4819
|
+
});
|
|
4820
|
+
};
|
|
4821
|
+
this.mdns.on("response", this.onresponse);
|
|
4822
|
+
this.update();
|
|
4823
|
+
}
|
|
4824
|
+
stop() {
|
|
4825
|
+
if (!this.onresponse) return;
|
|
4826
|
+
this.mdns.removeListener("response", this.onresponse);
|
|
4827
|
+
this.onresponse = void 0;
|
|
4828
|
+
}
|
|
4829
|
+
update() {
|
|
4830
|
+
this.mdns.query(this.name, "PTR");
|
|
4831
|
+
}
|
|
4832
|
+
expire() {
|
|
4833
|
+
const currentTime = Date.now();
|
|
4834
|
+
this._services = this._services.filter((service) => {
|
|
4835
|
+
if (!service.ttl || service.lastSeen === void 0) return true;
|
|
4836
|
+
if (service.lastSeen + service.ttl * 1e3 < currentTime) {
|
|
4837
|
+
this.emit("down", service);
|
|
4838
|
+
return false;
|
|
4839
|
+
}
|
|
4840
|
+
return true;
|
|
4841
|
+
});
|
|
4842
|
+
}
|
|
4843
|
+
get services() {
|
|
4844
|
+
return this._services;
|
|
4845
|
+
}
|
|
4846
|
+
addService(service) {
|
|
4847
|
+
if ((0, filter_service_1.default)(service, this.txtQuery) === false) return;
|
|
4848
|
+
this._services.push(service);
|
|
4849
|
+
this.serviceMap[service.fqdn] = true;
|
|
4850
|
+
this.emit("up", service);
|
|
4851
|
+
}
|
|
4852
|
+
updateServiceSrv(existingService, newService) {
|
|
4853
|
+
if (existingService.name !== newService.name || existingService.host !== newService.host || existingService.port !== newService.port || existingService.type !== newService.type || existingService.protocol !== newService.protocol) {
|
|
4854
|
+
this.replaceService(newService);
|
|
4855
|
+
this.emit("srv-update", newService, existingService);
|
|
4856
|
+
}
|
|
4857
|
+
}
|
|
4858
|
+
updateServiceTxt(existingService, service) {
|
|
4859
|
+
if ((0, equal_txt_1.default)(service.txt, (existingService === null || existingService === void 0 ? void 0 : existingService.txt) || {})) return;
|
|
4860
|
+
if (!(0, filter_service_1.default)(service, this.txtQuery)) {
|
|
4861
|
+
this.removeService(service.fqdn);
|
|
4862
|
+
return;
|
|
4863
|
+
}
|
|
4864
|
+
this.replaceService(service);
|
|
4865
|
+
this.emit("txt-update", service, existingService);
|
|
4866
|
+
}
|
|
4867
|
+
replaceService(service) {
|
|
4868
|
+
this._services = this._services.map((s) => {
|
|
4869
|
+
if (!(0, dns_equal_1.default)(s.fqdn, service.fqdn)) return s;
|
|
4870
|
+
return service;
|
|
4871
|
+
});
|
|
4872
|
+
}
|
|
4873
|
+
removeService(fqdn) {
|
|
4874
|
+
var service, index;
|
|
4875
|
+
this._services.some(function(s, i) {
|
|
4876
|
+
if ((0, dns_equal_1.default)(s.fqdn, fqdn)) {
|
|
4877
|
+
service = s;
|
|
4878
|
+
index = i;
|
|
4879
|
+
return true;
|
|
4880
|
+
}
|
|
4881
|
+
});
|
|
4882
|
+
if (!service || index === void 0) return;
|
|
4883
|
+
this._services.splice(index, 1);
|
|
4884
|
+
delete this.serviceMap[fqdn];
|
|
4885
|
+
this.emit("down", service);
|
|
4886
|
+
}
|
|
4887
|
+
goodbyes(name, packet) {
|
|
4888
|
+
return packet.answers.concat(packet.additionals).filter((rr) => rr.type === "PTR" && rr.ttl === 0 && (0, dns_equal_1.default)(rr.name, name)).map((rr) => rr.data);
|
|
4889
|
+
}
|
|
4890
|
+
buildServicesFor(name, packet, txt, referer, receiveTime) {
|
|
4891
|
+
var records = packet.answers.concat(packet.additionals).filter((rr) => rr.ttl > 0);
|
|
4892
|
+
return records.filter((rr) => rr.type === "PTR" && (0, dns_equal_1.default)(rr.name, name)).map((ptr) => {
|
|
4893
|
+
const service = {
|
|
4894
|
+
addresses: [],
|
|
4895
|
+
subtypes: [],
|
|
4896
|
+
ttl: ptr.ttl,
|
|
4897
|
+
lastSeen: receiveTime
|
|
4898
|
+
};
|
|
4899
|
+
records.filter((rr) => {
|
|
4900
|
+
return rr.type === "PTR" && (0, dns_equal_1.default)(rr.data, ptr.data) && rr.name.includes("._sub");
|
|
4901
|
+
}).forEach((rr) => {
|
|
4902
|
+
const types = (0, service_types_1.toType)(rr.name);
|
|
4903
|
+
service.subtypes.push(types.subtype);
|
|
4904
|
+
});
|
|
4905
|
+
records.filter((rr) => {
|
|
4906
|
+
return (rr.type === "SRV" || rr.type === "TXT") && (0, dns_equal_1.default)(rr.name, ptr.data);
|
|
4907
|
+
}).forEach((rr) => {
|
|
4908
|
+
if (rr.type === "SRV") {
|
|
4909
|
+
var parts = rr.name.split(".");
|
|
4910
|
+
var name = parts[0];
|
|
4911
|
+
var types = (0, service_types_1.toType)(parts.slice(1, -1).join("."));
|
|
4912
|
+
service.name = name;
|
|
4913
|
+
service.fqdn = rr.name;
|
|
4914
|
+
service.host = rr.data.target;
|
|
4915
|
+
service.referer = referer;
|
|
4916
|
+
service.port = rr.data.port;
|
|
4917
|
+
service.type = types.name;
|
|
4918
|
+
service.protocol = types.protocol;
|
|
4919
|
+
} else if (rr.type === "TXT") {
|
|
4920
|
+
service.rawTxt = rr.data;
|
|
4921
|
+
service.txt = this.txt.decodeAll(rr.data);
|
|
4922
|
+
}
|
|
4923
|
+
});
|
|
4924
|
+
if (!service.name) return;
|
|
4925
|
+
records.filter((rr) => (rr.type === "A" || rr.type === "AAAA") && (0, dns_equal_1.default)(rr.name, service.host)).forEach((rr) => service.addresses.push(rr.data));
|
|
4926
|
+
return service;
|
|
4927
|
+
}).filter((rr) => !!rr);
|
|
4928
|
+
}
|
|
4929
|
+
};
|
|
4930
|
+
exports.Browser = Browser;
|
|
4931
|
+
exports.default = Browser;
|
|
4932
|
+
}));
|
|
4933
|
+
//#endregion
|
|
4934
|
+
//#region ../../node_modules/bonjour-service/dist/lib/bonjour.js
|
|
4935
|
+
var require_bonjour = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
4936
|
+
var __importDefault = exports && exports.__importDefault || function(mod) {
|
|
4937
|
+
return mod && mod.__esModule ? mod : { "default": mod };
|
|
4938
|
+
};
|
|
4939
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4940
|
+
exports.Browser = exports.Service = void 0;
|
|
4941
|
+
const registry_1 = __importDefault(require_registry());
|
|
4942
|
+
const mdns_server_1 = __importDefault(require_mdns_server());
|
|
4943
|
+
const browser_1 = __importDefault(require_browser());
|
|
4944
|
+
exports.Browser = browser_1.default;
|
|
4945
|
+
exports.Service = __importDefault(require_service()).default;
|
|
4946
|
+
var Bonjour = class {
|
|
4947
|
+
constructor(opts = {}, errorCallback) {
|
|
4948
|
+
this.server = new mdns_server_1.default(opts, errorCallback);
|
|
4949
|
+
this.registry = new registry_1.default(this.server);
|
|
4950
|
+
}
|
|
4951
|
+
publish(opts) {
|
|
4952
|
+
return this.registry.publish(opts);
|
|
4953
|
+
}
|
|
4954
|
+
unpublishAll(callback) {
|
|
4955
|
+
return this.registry.unpublishAll(callback);
|
|
4956
|
+
}
|
|
4957
|
+
find(opts = null, onup) {
|
|
4958
|
+
return new browser_1.default(this.server.mdns, opts, onup);
|
|
4959
|
+
}
|
|
4960
|
+
findOne(opts = null, timeout = 1e4, callback) {
|
|
4961
|
+
const browser = new browser_1.default(this.server.mdns, opts);
|
|
4962
|
+
var timer;
|
|
4963
|
+
browser.once("up", (service) => {
|
|
4964
|
+
if (timer !== void 0) clearTimeout(timer);
|
|
4965
|
+
browser.stop();
|
|
4966
|
+
if (callback) callback(service);
|
|
4967
|
+
});
|
|
4968
|
+
timer = setTimeout(() => {
|
|
4969
|
+
browser.stop();
|
|
4970
|
+
if (callback) callback(null);
|
|
4971
|
+
}, timeout);
|
|
4972
|
+
return browser;
|
|
4973
|
+
}
|
|
4974
|
+
destroy(callback) {
|
|
4975
|
+
this.registry.destroy();
|
|
4976
|
+
this.server.mdns.destroy(callback);
|
|
4977
|
+
}
|
|
4978
|
+
};
|
|
4979
|
+
exports.default = Bonjour;
|
|
4980
|
+
}));
|
|
4981
|
+
//#endregion
|
|
4982
|
+
//#region ../charmd/src/device/announce.ts
|
|
4983
|
+
var import_dist = (/* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
4984
|
+
var __createBinding = exports && exports.__createBinding || (Object.create ? (function(o, m, k, k2) {
|
|
4985
|
+
if (k2 === void 0) k2 = k;
|
|
4986
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
4987
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) desc = {
|
|
4988
|
+
enumerable: true,
|
|
4989
|
+
get: function() {
|
|
4990
|
+
return m[k];
|
|
4991
|
+
}
|
|
4992
|
+
};
|
|
4993
|
+
Object.defineProperty(o, k2, desc);
|
|
4994
|
+
}) : (function(o, m, k, k2) {
|
|
4995
|
+
if (k2 === void 0) k2 = k;
|
|
4996
|
+
o[k2] = m[k];
|
|
4997
|
+
}));
|
|
4998
|
+
var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? (function(o, v) {
|
|
4999
|
+
Object.defineProperty(o, "default", {
|
|
5000
|
+
enumerable: true,
|
|
5001
|
+
value: v
|
|
5002
|
+
});
|
|
5003
|
+
}) : function(o, v) {
|
|
5004
|
+
o["default"] = v;
|
|
5005
|
+
});
|
|
5006
|
+
var __importStar = exports && exports.__importStar || (function() {
|
|
5007
|
+
var ownKeys = function(o) {
|
|
5008
|
+
ownKeys = Object.getOwnPropertyNames || function(o) {
|
|
5009
|
+
var ar = [];
|
|
5010
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
5011
|
+
return ar;
|
|
5012
|
+
};
|
|
5013
|
+
return ownKeys(o);
|
|
5014
|
+
};
|
|
5015
|
+
return function(mod) {
|
|
5016
|
+
if (mod && mod.__esModule) return mod;
|
|
5017
|
+
var result = {};
|
|
5018
|
+
if (mod != null) {
|
|
5019
|
+
for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
5020
|
+
}
|
|
5021
|
+
__setModuleDefault(result, mod);
|
|
5022
|
+
return result;
|
|
5023
|
+
};
|
|
5024
|
+
})();
|
|
5025
|
+
const bonjour_1 = (exports && exports.__importDefault || function(mod) {
|
|
5026
|
+
return mod && mod.__esModule ? mod : { "default": mod };
|
|
5027
|
+
})(require_bonjour());
|
|
5028
|
+
const imported = __importStar(require_bonjour());
|
|
5029
|
+
var Bonjour = class extends bonjour_1.default {};
|
|
5030
|
+
var BonjourClass = Bonjour;
|
|
5031
|
+
(function(Bonjour) {
|
|
5032
|
+
Bonjour.Bonjour = BonjourClass;
|
|
5033
|
+
Bonjour.Service = imported.Service;
|
|
5034
|
+
Bonjour.Browser = imported.Browser;
|
|
5035
|
+
})(Bonjour || (Bonjour = {}));
|
|
5036
|
+
Object.defineProperty(Bonjour, "default", {
|
|
5037
|
+
enumerable: true,
|
|
5038
|
+
value: Bonjour
|
|
5039
|
+
});
|
|
5040
|
+
module.exports.Bonjour = Bonjour;
|
|
5041
|
+
module.exports.Service = imported.Service;
|
|
5042
|
+
module.exports.Browser = imported.Browser;
|
|
5043
|
+
module.exports.default = Bonjour;
|
|
5044
|
+
module.exports = Bonjour;
|
|
5045
|
+
})))();
|
|
5046
|
+
function localHost() {
|
|
5047
|
+
let label = "";
|
|
5048
|
+
if (platform() === "darwin") try {
|
|
5049
|
+
label = execFileSync("scutil", ["--get", "LocalHostName"], {
|
|
5050
|
+
encoding: "utf8",
|
|
5051
|
+
timeout: 2e3
|
|
5052
|
+
}).trim();
|
|
5053
|
+
} catch {
|
|
5054
|
+
label = "";
|
|
5055
|
+
}
|
|
5056
|
+
if (!/^[A-Za-z0-9-]{1,63}$/.test(label)) label = hostname().split(".")[0] ?? "";
|
|
5057
|
+
return `${label}.local`;
|
|
5058
|
+
}
|
|
5059
|
+
const announceOnNetwork = (port) => {
|
|
5060
|
+
let warned = false;
|
|
5061
|
+
const bonjour = new import_dist.Bonjour({}, (error) => {
|
|
5062
|
+
if (warned) return;
|
|
5063
|
+
warned = true;
|
|
5064
|
+
console.error(`charmd: mDNS: ${String(error)}`);
|
|
5065
|
+
});
|
|
5066
|
+
const computer = hostname().replace(/\.local$/, "");
|
|
5067
|
+
bonjour.publish({
|
|
5068
|
+
name: `OpenCharm on ${computer}`,
|
|
5069
|
+
host: localHost(),
|
|
5070
|
+
type: "opencharm",
|
|
5071
|
+
port,
|
|
5072
|
+
txt: { path: "/charm" }
|
|
5073
|
+
}).on("error", (error) => {
|
|
5074
|
+
console.error(`charmd: couldn't announce itself on the network: ${String(error)}`);
|
|
5075
|
+
});
|
|
5076
|
+
return () => new Promise((resolve) => {
|
|
5077
|
+
bonjour.unpublishAll(() => {
|
|
5078
|
+
bonjour.destroy();
|
|
5079
|
+
resolve();
|
|
5080
|
+
});
|
|
5081
|
+
});
|
|
5082
|
+
};
|
|
5083
|
+
//#endregion
|
|
2190
5084
|
//#region ../charmd/src/device/ota.ts
|
|
2191
5085
|
function handleOta(res, websocketUrl) {
|
|
2192
5086
|
res.writeHead(200, { "content-type": "application/json" });
|
|
@@ -2276,6 +5170,7 @@ var Session = class {
|
|
|
2276
5170
|
#state = "awaiting_hello";
|
|
2277
5171
|
#charmId;
|
|
2278
5172
|
#build;
|
|
5173
|
+
#battery;
|
|
2279
5174
|
#queue = Promise.resolve();
|
|
2280
5175
|
#turn;
|
|
2281
5176
|
#asks = Promise.resolve();
|
|
@@ -2291,6 +5186,9 @@ var Session = class {
|
|
|
2291
5186
|
get build() {
|
|
2292
5187
|
return this.#build;
|
|
2293
5188
|
}
|
|
5189
|
+
get battery() {
|
|
5190
|
+
return this.#battery;
|
|
5191
|
+
}
|
|
2294
5192
|
get charmId() {
|
|
2295
5193
|
return this.#charmId;
|
|
2296
5194
|
}
|
|
@@ -2389,7 +5287,10 @@ var Session = class {
|
|
|
2389
5287
|
transport: "websocket",
|
|
2390
5288
|
session_id: this.sessionId,
|
|
2391
5289
|
audio_params: AUDIO_DOWN,
|
|
2392
|
-
|
|
5290
|
+
features: {
|
|
5291
|
+
battery: true,
|
|
5292
|
+
...this.#build?.kind === "desktop" ? { text: true } : {}
|
|
5293
|
+
}
|
|
2393
5294
|
});
|
|
2394
5295
|
const { token } = this.#deps;
|
|
2395
5296
|
if (token === void 0) {
|
|
@@ -2424,6 +5325,15 @@ var Session = class {
|
|
|
2424
5325
|
this.#sendLocked();
|
|
2425
5326
|
return;
|
|
2426
5327
|
}
|
|
5328
|
+
if (message.type === "charm" && message.op === "battery") {
|
|
5329
|
+
const { percent, charging, usb } = message;
|
|
5330
|
+
this.#battery = {
|
|
5331
|
+
percent,
|
|
5332
|
+
charging,
|
|
5333
|
+
usb
|
|
5334
|
+
};
|
|
5335
|
+
return;
|
|
5336
|
+
}
|
|
2427
5337
|
if (message.type === "charm" && message.op === "answer") {
|
|
2428
5338
|
if (this.#pendingAsk?.id === message.id) this.#pendingAsk.settle(message.yes);
|
|
2429
5339
|
return;
|
|
@@ -2569,6 +5479,7 @@ var Session = class {
|
|
|
2569
5479
|
this.#pendingAsk?.drop();
|
|
2570
5480
|
this.#endTurn();
|
|
2571
5481
|
this.#state = "locked";
|
|
5482
|
+
this.#battery = void 0;
|
|
2572
5483
|
this.#send({
|
|
2573
5484
|
type: "charm",
|
|
2574
5485
|
op: "locked",
|
|
@@ -4926,20 +7837,29 @@ async function startDaemon(config, options = {}) {
|
|
|
4926
7837
|
});
|
|
4927
7838
|
const adminServer = await startAdminServer(config.adminSocket, admin);
|
|
4928
7839
|
let websocketUrl = config.publicUrl ?? "";
|
|
4929
|
-
const
|
|
7840
|
+
const answerHttp = (onNetwork) => (req, res) => {
|
|
4930
7841
|
if (isOtaRequest(req)) {
|
|
4931
|
-
|
|
7842
|
+
const host = req.headers.host ?? "";
|
|
7843
|
+
handleOta(res, onNetwork && !config.publicUrl && /^[A-Za-z0-9.:[\]-]{1,255}$/.test(host) ? `ws://${host}/charm` : websocketUrl);
|
|
4932
7844
|
return;
|
|
4933
7845
|
}
|
|
4934
7846
|
res.writeHead(404).end();
|
|
4935
|
-
}
|
|
7847
|
+
};
|
|
7848
|
+
const http = createServer$1(answerHttp(false));
|
|
7849
|
+
const network = config.network ? createServer$1(answerHttp(true)) : void 0;
|
|
4936
7850
|
const wss = new WebSocketServer({
|
|
4937
|
-
|
|
4938
|
-
path: "/charm",
|
|
7851
|
+
noServer: true,
|
|
4939
7852
|
maxPayload: LIMITS.maxJsonBytes,
|
|
4940
7853
|
handleProtocols: (protocols) => protocols.has("opencharm") ? SUBPROTOCOL : false
|
|
4941
7854
|
});
|
|
4942
7855
|
wss.on("error", () => void 0);
|
|
7856
|
+
for (const server of [http, network]) server?.on("upgrade", (req, socket, head) => {
|
|
7857
|
+
if ((req.url ?? "").split("?")[0] !== "/charm") {
|
|
7858
|
+
socket.destroy();
|
|
7859
|
+
return;
|
|
7860
|
+
}
|
|
7861
|
+
wss.handleUpgrade(req, socket, head, (ws) => wss.emit("connection", ws, req));
|
|
7862
|
+
});
|
|
4943
7863
|
const answered = /* @__PURE__ */ new WeakSet();
|
|
4944
7864
|
const heartbeat = setInterval(() => {
|
|
4945
7865
|
for (const client of wss.clients) {
|
|
@@ -4997,18 +7917,25 @@ async function startDaemon(config, options = {}) {
|
|
|
4997
7917
|
});
|
|
4998
7918
|
ws.on("error", () => ws.terminate());
|
|
4999
7919
|
});
|
|
7920
|
+
const listen = (server, port, host) => new Promise((resolve, reject) => {
|
|
7921
|
+
server.once("error", reject);
|
|
7922
|
+
server.listen(port, host, resolve);
|
|
7923
|
+
});
|
|
5000
7924
|
try {
|
|
5001
|
-
await
|
|
5002
|
-
|
|
5003
|
-
http.listen(config.listen.port, config.listen.host, resolve);
|
|
5004
|
-
});
|
|
7925
|
+
await listen(http, config.listen.port, config.listen.host);
|
|
7926
|
+
if (network && config.network) await listen(network, config.network.port, config.network.host);
|
|
5005
7927
|
} catch (error) {
|
|
7928
|
+
http.close();
|
|
7929
|
+
network?.close();
|
|
5006
7930
|
clearInterval(heartbeat);
|
|
5007
7931
|
await new Promise((resolve) => adminServer.close(() => resolve()));
|
|
5008
7932
|
throw error;
|
|
5009
7933
|
}
|
|
5010
7934
|
const { port } = http.address();
|
|
5011
7935
|
const url = `ws://${config.listen.host.includes(":") ? `[${config.listen.host}]` : config.listen.host}:${port}/charm`;
|
|
7936
|
+
const networkPort = network ? network.address().port : void 0;
|
|
7937
|
+
const announced = networkPort ?? (isLoopback(config.listen.host) ? void 0 : port);
|
|
7938
|
+
const stopAnnouncing = config.discoverable && announced !== void 0 ? (options.announce ?? announceOnNetwork)(announced) : void 0;
|
|
5012
7939
|
websocketUrl = config.publicUrl ?? url;
|
|
5013
7940
|
if (!options.quiet) console.log([
|
|
5014
7941
|
"charmd",
|
|
@@ -5016,15 +7943,18 @@ async function startDaemon(config, options = {}) {
|
|
|
5016
7943
|
"listening on",
|
|
5017
7944
|
url
|
|
5018
7945
|
].filter(Boolean).join(" "));
|
|
7946
|
+
if (!options.quiet && networkPort !== void 0 && config.network) console.log(`Charms on this network: ws://${config.network.host}:${networkPort}/charm`);
|
|
5019
7947
|
return {
|
|
5020
7948
|
url,
|
|
5021
7949
|
admin,
|
|
5022
7950
|
close: async () => {
|
|
5023
7951
|
clearInterval(heartbeat);
|
|
7952
|
+
await stopAnnouncing?.();
|
|
5024
7953
|
for (const client of wss.clients) client.terminate();
|
|
5025
7954
|
agent.dispose?.();
|
|
5026
7955
|
await new Promise((resolve) => wss.close(() => resolve()));
|
|
5027
7956
|
await new Promise((resolve) => http.close(() => resolve()));
|
|
7957
|
+
if (network) await new Promise((resolve) => network.close(() => resolve()));
|
|
5028
7958
|
await new Promise((resolve) => adminServer.close(() => resolve()));
|
|
5029
7959
|
}
|
|
5030
7960
|
};
|
|
@@ -5056,7 +7986,7 @@ function formatIdentity(unit, version, commit) {
|
|
|
5056
7986
|
let cached;
|
|
5057
7987
|
function identity() {
|
|
5058
7988
|
if (cached) return cached;
|
|
5059
|
-
const commit = "
|
|
7989
|
+
const commit = "fe3cd5f";
|
|
5060
7990
|
cached = {
|
|
5061
7991
|
version: `cli@${version}`,
|
|
5062
7992
|
commit,
|