first commit

This commit is contained in:
monjack
2025-06-20 18:01:48 +08:00
commit 6daa6d65c1
24611 changed files with 2512443 additions and 0 deletions

23
app_vue/node_modules/bonjour-service/LICENSE generated vendored Normal file
View File

@ -0,0 +1,23 @@
The MIT License (MIT)
Copyright (https://github.com/onlxltd/bonjour-service) (c) 2021 ON LX Limited
Portions Copyright (Bonjour - https://github.com/watson/bonjour) (c) 2015-2016 Thomas Watson Steen
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

202
app_vue/node_modules/bonjour-service/README.md generated vendored Normal file
View File

@ -0,0 +1,202 @@
# bonjour-service
![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/onlxltd/bonjour-service/publish-release.yml?style=flat-square) ![npm bundle size](https://img.shields.io/bundlephobia/min/bonjour-service?style=flat-square) ![GitHub Release Date](https://img.shields.io/github/release-date/onlxltd/bonjour-service?style=flat-square) ![npm](https://img.shields.io/npm/dw/bonjour-service?color=%23888&style=flat-square) ![GitHub](https://img.shields.io/github/license/onlxltd/bonjour-service?style=flat-square) [![DeepScan grade](https://deepscan.io/api/teams/13435/projects/16430/branches/352351/badge/grade.svg?style=flat-square)](https://deepscan.io/dashboard#view=project&tid=13435&pid=16430&bid=352351)
A Bonjour/Zeroconf protocol implementation in TypeScript. Publish
services on the local network or discover existing services using
multicast DNS.
This is a rewrite of the project Bonjour (https://github.com/watson/bonjour) into modern TypeScript.
bonjour-service is supported by [ON LX Limited](https://onlx.ltd/?src=bonjour-service). Check out our projects such as [Ctrl Suite](https://onlx.ltd/ctrl-suite?src=bonjour-service) and [Ctrl for iPad](https://onlx.ltd/ctrl-for-ipad?src=bonjour-service).
## Installation
Add to your project dependencies using Yarn or NPM.
#### Install with Yarn
```
yarn add bonjour-service
```
#### Install with NPM
```
npm install bonjour-service
```
## Usage
```js
import { Bonjour } from 'bonjour-service'
const instance = new Bonjour()
// advertise an HTTP server on port 3000
instance.publish({ name: 'My Web Server', type: 'http', port: 3000 })
// browse for all http services
instance.find({ type: 'http' }, function (service) {
console.log('Found an HTTP server:', service)
})
```
## API
### Initializing
```js
var instance = new Bonjour({ options }, errorCallback)
```
The `options` are optional and will be used when initializing the
underlying multicast-dns server. For details see [the multicast-dns
documentation](https://github.com/mafintosh/multicast-dns#mdns--multicastdnsoptions).
`errorCallback` is an optional callback used to gracefully handle errors that would otherwise
crash the process. While not being strictly required, providing this is highly recommended
### Publishing
#### `var service = bonjour.publish(options)`
Publishes a new service.
Options are:
- `name` (string)
- `host` (string, optional) - defaults to local hostname
- `port` (number)
- `type` (string)
- `subtypes` (array of strings, optional)
- `protocol` (string, optional) - `udp` or `tcp` (default)
- `txt` (object, optional) - a key/value object to broadcast as the TXT
record
- `disableIPv6` (boolean, optional) disble IPv6 addresses
IANA maintains a [list of official service types and port
numbers](http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml).
#### `bonjour.unpublishAll([callback])`
Unpublish all services. The optional `callback` will be called when the
services have been unpublished.
#### `bonjour.destroy()`
Destroy the mdns instance. Closes the udp socket.
### Browser
#### `var browser = bonjour.find(options[, onup])`
Listen for services advertised on the network. An optional callback can
be provided as the 2nd argument and will be added as an event listener
for the `up` event.
Options (all optional):
- `type` (string)
- `subtypes` (array of strings)
- `protocol` (string) - defaults to `tcp`
- `txt` (object) - passed into [dns-txt
module](https://github.com/watson/dns-txt) contructor. Set to `{
binary: true }` if you want to keep the TXT records in binary
#### `var browser = bonjour.findOne(options[, callback])`
Listen for and call the `callback` with the first instance of a service
matching the `options`. If no `callback` is given, it's expected that
you listen for the `up` event. The returned `browser` will automatically
stop it self after the first matching service.
Options are the same as given in the `browser.find` function.
#### `Event: up`
Emitted every time a new service is found that matches the browser.
#### `Event: down`
Emitted every time an existing service emmits a goodbye message.
#### `Event: txt-update`
Emitted every time an existing service does a new announcement with an updated TXT record.
#### `browser.services()`
An array of services known by the browser to be online.
#### `browser.start()`
Start looking for matching services.
#### `browser.stop()`
Stop looking for matching services.
#### `browser.update()`
Broadcast the query again.
### Service
#### `Event: up`
Emitted when the service is up.
#### `Event: error`
Emitted if an error occurrs while publishing the service.
#### `service.stop([callback])`
Unpublish the service. The optional `callback` will be called when the
service have been unpublished.
#### `service.start()`
Publish the service.
#### `service.name`
The name of the service, e.g. `Apple TV`.
#### `service.type`
The type of the service, e.g. `http`.
#### `service.subtypes`
An array of subtypes. Note that this property might be `null`.
#### `service.protocol`
The protocol used by the service, e.g. `tcp`.
#### `service.host`
The hostname or ip address where the service resides.
#### `service.port`
The port on which the service listens, e.g. `5000`.
#### `service.fqdn`
The fully qualified domain name of the service. E.g. if given the name
`Foo Bar`, the type `http` and the protocol `tcp`, the `service.fqdn`
property will be `Foo Bar._http._tcp.local`.
#### `service.txt`
The TXT record advertised by the service (a key/value object). Note that
this property might be `null`.
#### `service.published`
A boolean indicating if the service is currently published.
## License
MIT

14
app_vue/node_modules/bonjour-service/dist/index.d.ts generated vendored Normal file
View File

@ -0,0 +1,14 @@
import Browser, { BrowserConfig } from './lib/browser';
import Service, { ServiceConfig, ServiceReferer } from './lib/service';
export declare class Bonjour {
private server;
private registry;
constructor(opts?: Partial<ServiceConfig>, errorCallback?: Function | undefined);
publish(opts: ServiceConfig): Service;
unpublishAll(callback?: CallableFunction | undefined): void;
find(opts?: BrowserConfig | null, onup?: (service: Service) => void): Browser;
findOne(opts?: BrowserConfig | null, timeout?: number, callback?: CallableFunction): Browser;
destroy(callback?: CallableFunction): void;
}
export { Service, ServiceReferer, ServiceConfig, Browser, BrowserConfig };
export default Bonjour;

51
app_vue/node_modules/bonjour-service/dist/index.js generated vendored Normal file
View File

@ -0,0 +1,51 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Browser = exports.Service = exports.Bonjour = void 0;
const registry_1 = __importDefault(require("./lib/registry"));
const mdns_server_1 = __importDefault(require("./lib/mdns-server"));
const browser_1 = __importDefault(require("./lib/browser"));
exports.Browser = browser_1.default;
const service_1 = __importDefault(require("./lib/service"));
exports.Service = service_1.default;
class Bonjour {
constructor(opts = {}, errorCallback) {
this.server = new mdns_server_1.default(opts, errorCallback);
this.registry = new registry_1.default(this.server);
}
publish(opts) {
return this.registry.publish(opts);
}
unpublishAll(callback) {
return this.registry.unpublishAll(callback);
}
find(opts = null, onup) {
return new browser_1.default(this.server.mdns, opts, onup);
}
findOne(opts = null, timeout = 10000, callback) {
const browser = new browser_1.default(this.server.mdns, opts);
var timer;
browser.once('up', (service) => {
if (timer !== undefined)
clearTimeout(timer);
browser.stop();
if (callback)
callback(service);
});
timer = setTimeout(() => {
browser.stop();
if (callback)
callback(null);
}, timeout);
return browser;
}
destroy(callback) {
this.registry.destroy();
this.server.mdns.destroy(callback);
}
}
exports.Bonjour = Bonjour;
exports.default = Bonjour;
//# sourceMappingURL=index.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AACA,8DAAyE;AACzE,oEAA4E;AAC5E,4DAAwE;AA+EvB,kBA/E1C,iBAAO,CA+E0C;AA9ExD,4DAAwE;AA8E/D,kBA9EF,iBAAO,CA8EE;AA5EhB,MAAa,OAAO;IAUhB,YAAY,OAA+B,EAAE,EAAE,aAAoC;QAC/E,IAAI,CAAC,MAAM,GAAO,IAAI,qBAAM,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;QACjD,IAAI,CAAC,QAAQ,GAAK,IAAI,kBAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC/C,CAAC;IAOM,OAAO,CAAC,IAAmB;QAC9B,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IACtC,CAAC;IAOM,YAAY,CAAC,QAAuC;QACvD,OAAO,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;IAC/C,CAAC;IAQM,IAAI,CAAC,OAA6B,IAAI,EAAE,IAAiC;QAC5E,OAAO,IAAI,iBAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;IACpD,CAAC;IASM,OAAO,CAAC,OAA6B,IAAI,EAAE,OAAO,GAAG,KAAK,EAAE,QAA2B;QAC1F,MAAM,OAAO,GAAY,IAAI,iBAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAC5D,IAAI,KAAqB,CAAA;QACzB,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,OAAgB,EAAE,EAAE;YACpC,IAAG,KAAK,KAAK,SAAS;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAA;YAC3C,OAAO,CAAC,IAAI,EAAE,CAAA;YACd,IAAG,QAAQ;gBAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;QAClC,CAAC,CAAC,CAAA;QACF,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YACpB,OAAO,CAAC,IAAI,EAAE,CAAA;YACd,IAAG,QAAQ;gBAAE,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC/B,CAAC,EAAE,OAAO,CAAC,CAAA;QACX,OAAO,OAAO,CAAA;IAClB,CAAC;IAMM,OAAO,CAAC,QAA2B;QACtC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAA;QACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IACtC,CAAC;CAEJ;AA1ED,0BA0EC;AAID,kBAAe,OAAO,CAAA"}

View File

@ -0,0 +1,4 @@
type KeyValue = {
[key: string]: any;
};
export default KeyValue;

View File

@ -0,0 +1,3 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=KeyValue.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"KeyValue.js","sourceRoot":"","sources":["../../src/lib/KeyValue.ts"],"names":[],"mappings":""}

View File

@ -0,0 +1,32 @@
import KeyValue from './KeyValue';
import { EventEmitter } from 'events';
import Service from './service';
export interface BrowserConfig {
type: string;
name?: string;
protocol?: 'tcp' | 'udp';
subtypes?: string[];
txt?: KeyValue;
}
export type BrowserOnUp = (service: Service) => void;
export declare class Browser extends EventEmitter {
private mdns;
private onresponse;
private serviceMap;
private txt;
private name?;
private txtQuery;
private wildcard;
private _services;
constructor(mdns: any, opts: BrowserConfig | BrowserOnUp | null, onup?: BrowserOnUp);
start(): void;
stop(): void;
update(): void;
get services(): Service[];
private addService;
private updateService;
private removeService;
private goodbyes;
private buildServicesFor;
}
export default Browser;

View File

@ -0,0 +1,179 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Browser = void 0;
const dns_txt_1 = __importDefault(require("./dns-txt"));
const dns_equal_1 = __importDefault(require("./utils/dns-equal"));
const events_1 = require("events");
const service_types_1 = require("./service-types");
const filter_service_1 = __importDefault(require("./utils/filter-service"));
const filter_txt_1 = __importDefault(require("./utils/filter-txt"));
const equal_txt_1 = __importDefault(require("./utils/equal-txt"));
const TLD = '.local';
const WILDCARD = '_services._dns-sd._udp' + TLD;
class Browser extends events_1.EventEmitter {
constructor(mdns, opts, onup) {
super();
this.onresponse = undefined;
this.serviceMap = {};
this.wildcard = false;
this._services = [];
if (typeof opts === 'function')
return new Browser(mdns, null, opts);
this.mdns = mdns;
this.txt = new dns_txt_1.default(opts !== null && opts.txt != null ? opts.txt : undefined);
if (opts === null || opts.type === undefined) {
this.name = WILDCARD;
this.wildcard = true;
}
else {
this.name = (0, service_types_1.toString)({ name: opts.type, protocol: opts.protocol || 'tcp' }) + TLD;
if (opts.name)
this.name = opts.name + '.' + this.name;
this.wildcard = false;
}
if (opts != null && opts.txt !== undefined)
this.txtQuery = (0, filter_txt_1.default)(opts.txt);
if (onup)
this.on('up', onup);
this.start();
}
start() {
if (this.onresponse || this.name === undefined)
return;
var self = this;
var nameMap = {};
if (!this.wildcard)
nameMap[this.name] = true;
this.onresponse = (packet, rinfo) => {
if (self.wildcard) {
packet.answers.forEach((answer) => {
if (answer.type !== 'PTR' || answer.name !== self.name || answer.name in nameMap)
return;
nameMap[answer.data] = true;
self.mdns.query(answer.data, 'PTR');
});
}
Object.keys(nameMap).forEach(function (name) {
self.goodbyes(name, packet).forEach(self.removeService.bind(self));
var matches = self.buildServicesFor(name, packet, self.txt, rinfo);
if (matches.length === 0)
return;
matches.forEach((service) => {
if (self.serviceMap[service.fqdn]) {
self.updateService(service);
return;
}
self.addService(service);
});
});
};
this.mdns.on('response', this.onresponse);
this.update();
}
stop() {
if (!this.onresponse)
return;
this.mdns.removeListener('response', this.onresponse);
this.onresponse = undefined;
}
update() {
this.mdns.query(this.name, 'PTR');
}
get services() {
return this._services;
}
addService(service) {
if ((0, filter_service_1.default)(service, this.txtQuery) === false)
return;
this._services.push(service);
this.serviceMap[service.fqdn] = true;
this.emit('up', service);
}
updateService(service) {
var _a;
if ((0, equal_txt_1.default)(service.txt, ((_a = this._services.find((s) => (0, dns_equal_1.default)(s.fqdn, service.fqdn))) === null || _a === void 0 ? void 0 : _a.txt) || {}))
return;
if (!(0, filter_service_1.default)(service, this.txtQuery)) {
this.removeService(service.fqdn);
return;
}
this._services = this._services.map(function (s) {
if (!(0, dns_equal_1.default)(s.fqdn, service.fqdn))
return s;
return service;
});
this.emit('txt-update', service);
}
removeService(fqdn) {
var service, index;
this._services.some(function (s, i) {
if ((0, dns_equal_1.default)(s.fqdn, fqdn)) {
service = s;
index = i;
return true;
}
});
if (!service || index === undefined)
return;
this._services.splice(index, 1);
delete this.serviceMap[fqdn];
this.emit('down', service);
}
goodbyes(name, packet) {
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);
}
buildServicesFor(name, packet, txt, referer) {
var records = packet.answers.concat(packet.additionals).filter((rr) => rr.ttl > 0);
return records
.filter((rr) => rr.type === 'PTR' && (0, dns_equal_1.default)(rr.name, name))
.map((ptr) => {
const service = {
addresses: [],
subtypes: []
};
records.filter((rr) => {
return (rr.type === 'PTR' && (0, dns_equal_1.default)(rr.data, ptr.data) && rr.name.includes('._sub'));
}).forEach((rr) => {
const types = (0, service_types_1.toType)(rr.name);
service.subtypes.push(types.subtype);
});
records
.filter((rr) => {
return (rr.type === 'SRV' || rr.type === 'TXT') && (0, dns_equal_1.default)(rr.name, ptr.data);
})
.forEach((rr) => {
if (rr.type === 'SRV') {
var parts = rr.name.split('.');
var name = parts[0];
var types = (0, service_types_1.toType)(parts.slice(1, -1).join('.'));
service.name = name;
service.fqdn = rr.name;
service.host = rr.data.target;
service.referer = referer;
service.port = rr.data.port;
service.type = types.name;
service.protocol = types.protocol;
}
else if (rr.type === 'TXT') {
service.rawTxt = rr.data;
service.txt = this.txt.decodeAll(rr.data);
}
});
if (!service.name)
return;
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));
return service;
})
.filter((rr) => !!rr);
}
}
exports.Browser = Browser;
exports.default = Browser;
//# sourceMappingURL=browser.js.map

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,9 @@
import KeyValue from './KeyValue';
export declare class DnsTxt {
private binary;
constructor(opts?: KeyValue);
encode(data?: KeyValue): Buffer[];
decode(buffer: Buffer): KeyValue;
decodeAll(buffer: Array<Buffer>): KeyValue;
}
export default DnsTxt;

View File

@ -0,0 +1,42 @@
'use strict';
Object.defineProperty(exports, "__esModule", { value: true });
exports.DnsTxt = void 0;
class DnsTxt {
constructor(opts = {}) {
this.binary = opts ? opts.binary : false;
}
encode(data = {}) {
return Object.entries(data)
.map(([key, value]) => {
let item = `${key}=${value}`;
return Buffer.from(item);
});
}
decode(buffer) {
var data = {};
try {
let format = buffer.toString();
let parts = format.split(/=(.+)/);
let key = parts[0];
let value = parts[1];
data[key] = value;
}
catch (_) { }
return data;
}
decodeAll(buffer) {
return buffer
.filter(i => i.length > 1)
.map(i => this.decode(i))
.reduce((prev, curr) => {
var obj = prev;
let [key] = Object.keys(curr);
let [value] = Object.values(curr);
obj[key] = value;
return obj;
}, {});
}
}
exports.DnsTxt = DnsTxt;
exports.default = DnsTxt;
//# sourceMappingURL=dns-txt.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"dns-txt.js","sourceRoot":"","sources":["../../src/lib/dns-txt.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;;;AAIZ,MAAa,MAAM;IAIf,YAAY,OAAiB,EAAE;QAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAA;IAC5C,CAAC;IAOM,MAAM,CAAC,OAAiB,EAAE;QAC7B,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;aAC1B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YAClB,IAAI,IAAI,GAAW,GAAG,GAAG,IAAI,KAAK,EAAE,CAAA;YACpC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC5B,CAAC,CAAC,CAAA;IACN,CAAC;IAOM,MAAM,CAAC,MAAc;QACxB,IAAI,IAAI,GAAa,EAAE,CAAA;QAEvB,IAAI,CAAC;YACD,IAAI,MAAM,GAAoB,MAAM,CAAC,QAAQ,EAAE,CAAA;YAC/C,IAAI,KAAK,GAAqB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YACnD,IAAI,GAAG,GAAuB,KAAK,CAAC,CAAC,CAAC,CAAA;YACtC,IAAI,KAAK,GAAqB,KAAK,CAAC,CAAC,CAAC,CAAA;YACtC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;QACrB,CAAC;QAAC,OAAM,CAAC,EAAE,CAAC,CAAA,CAAC;QAEb,OAAO,IAAI,CAAA;IACf,CAAC;IAOM,SAAS,CAAC,MAAqB;QAClC,OAAO,MAAM;aACZ,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;aACzB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;aACxB,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;YACnB,IAAI,GAAG,GAAW,IAAI,CAAA;YACtB,IAAI,CAAC,GAAG,CAAC,GAAS,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACnC,IAAI,CAAC,KAAK,CAAC,GAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YACrC,GAAG,CAAC,GAAG,CAAC,GAAU,KAAK,CAAA;YACvB,OAAO,GAAG,CAAA;QACd,CAAC,EAAE,EAAE,CAAC,CAAA;IACV,CAAC;CAEJ;AA1DD,wBA0DC;AAED,kBAAe,MAAM,CAAA"}

View File

@ -0,0 +1,14 @@
import { ServiceConfig, ServiceRecord } from './service';
export declare class Server {
mdns: any;
private registry;
private errorCallback;
constructor(opts: Partial<ServiceConfig>, errorCallback?: Function | undefined);
register(records: Array<ServiceRecord> | ServiceRecord): void;
unregister(records: Array<ServiceRecord> | ServiceRecord): void;
private respondToQuery;
private recordsFor;
private isDuplicateRecord;
private unique;
}
export default Server;

View File

@ -0,0 +1,119 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Server = void 0;
const multicast_dns_1 = __importDefault(require("multicast-dns"));
const es6_1 = __importDefault(require("fast-deep-equal/es6"));
const dns_equal_1 = __importDefault(require("./utils/dns-equal"));
class Server {
constructor(opts, errorCallback) {
this.registry = {};
this.mdns = (0, multicast_dns_1.default)(opts);
this.mdns.setMaxListeners(0);
this.mdns.on('query', this.respondToQuery.bind(this));
this.errorCallback = errorCallback !== null && errorCallback !== void 0 ? errorCallback : function (err) { throw err; };
}
register(records) {
const shouldRegister = (record) => {
var subRegistry = this.registry[record.type];
if (!subRegistry) {
subRegistry = this.registry[record.type] = [];
}
else if (subRegistry.some(this.isDuplicateRecord(record))) {
return;
}
subRegistry.push(record);
};
if (Array.isArray(records)) {
records.forEach(shouldRegister);
}
else {
shouldRegister(records);
}
}
unregister(records) {
const shouldUnregister = (record) => {
let type = record.type;
if (!(type in this.registry)) {
return;
}
this.registry[type] = this.registry[type].filter((i) => i.name !== record.name);
};
if (Array.isArray(records)) {
records.forEach(shouldUnregister);
}
else {
shouldUnregister(records);
}
}
respondToQuery(query) {
let self = this;
query.questions.forEach((question) => {
var type = question.type;
var name = question.name;
var answers = type === 'ANY'
? Object.keys(self.registry).map(self.recordsFor.bind(self, name)).flat(1)
: self.recordsFor(name, type);
if (answers.length === 0)
return;
var additionals = [];
if (type !== 'ANY') {
answers.forEach((answer) => {
if (answer.type !== 'PTR')
return;
additionals = additionals
.concat(self.recordsFor(answer.data, 'SRV'))
.concat(self.recordsFor(answer.data, 'TXT'));
});
additionals
.filter(function (record) {
return record.type === 'SRV';
})
.map(function (record) {
return record.data.target;
})
.filter(this.unique())
.forEach(function (target) {
additionals = additionals
.concat(self.recordsFor(target, 'A'))
.concat(self.recordsFor(target, 'AAAA'));
});
}
self.mdns.respond({ answers: answers, additionals: additionals }, (err) => {
if (err) {
this.errorCallback(err);
}
});
});
}
recordsFor(name, type) {
if (!(type in this.registry)) {
return [];
}
return this.registry[type].filter((record) => {
var _name = ~name.indexOf('.') ? record.name : record.name.split('.')[0];
return (0, dns_equal_1.default)(_name, name);
});
}
isDuplicateRecord(a) {
return (b) => {
return a.type === b.type &&
a.name === b.name &&
(0, es6_1.default)(a.data, b.data);
};
}
unique() {
var set = [];
return (obj) => {
if (~set.indexOf(obj))
return false;
set.push(obj);
return true;
};
}
}
exports.Server = Server;
exports.default = Server;
//# sourceMappingURL=mdns-server.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"mdns-server.js","sourceRoot":"","sources":["../../src/lib/mdns-server.ts"],"names":[],"mappings":"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"}

View File

@ -0,0 +1,14 @@
import Server from './mdns-server';
import Service, { ServiceConfig } from './service';
export declare class Registry {
private server;
private services;
constructor(server: Server);
publish(config: ServiceConfig): Service;
unpublishAll(callback: CallableFunction | undefined): void;
destroy(): void;
private probe;
private announce;
private teardown;
}
export default Registry;

View File

@ -0,0 +1,143 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Registry = void 0;
const dns_equal_1 = __importDefault(require("./utils/dns-equal"));
const service_1 = __importDefault(require("./service"));
const REANNOUNCE_MAX_MS = 60 * 60 * 1000;
const REANNOUNCE_FACTOR = 3;
const noop = function () { };
class Registry {
constructor(server) {
this.services = [];
this.server = server;
}
publish(config) {
function start(service, registry, opts) {
if (service.activated)
return;
service.activated = true;
registry.services.push(service);
if (!(service instanceof service_1.default))
return;
if (opts === null || opts === void 0 ? void 0 : opts.probe) {
registry.probe(registry.server.mdns, service, (exists) => {
if (exists) {
if (service.stop !== undefined)
service.stop();
console.log(new Error('Service name is already in use on the network'));
return;
}
registry.announce(registry.server, service);
});
}
else {
registry.announce(registry.server, service);
}
}
function stop(service, registry, callback) {
if (!callback)
callback = noop;
if (!service.activated)
return process.nextTick(callback);
if (!(service instanceof service_1.default))
return process.nextTick(callback);
registry.teardown(registry.server, service, callback);
const index = registry.services.indexOf(service);
if (index !== -1)
registry.services.splice(index, 1);
}
const service = new service_1.default(config);
service.start = start.bind(null, service, this);
service.stop = stop.bind(null, service, this);
service.start({ probe: config.probe !== false });
return service;
}
unpublishAll(callback) {
this.teardown(this.server, this.services, callback);
this.services = [];
}
destroy() {
this.services.map(service => service.destroyed = true);
}
probe(mdns, service, callback) {
var sent = false;
var retries = 0;
var timer;
const send = () => {
if (!service.activated || service.destroyed)
return;
mdns.query(service.fqdn, 'ANY', function () {
sent = true;
timer = setTimeout(++retries < 3 ? send : done, 250);
timer.unref();
});
};
const onresponse = (packet) => {
if (!sent)
return;
if (packet.answers.some(matchRR) || packet.additionals.some(matchRR))
done(true);
};
const matchRR = (rr) => {
return (0, dns_equal_1.default)(rr.name, service.fqdn);
};
const done = (exists) => {
mdns.removeListener('response', onresponse);
clearTimeout(timer);
callback(!!exists);
};
mdns.on('response', onresponse);
setTimeout(send, Math.random() * 250);
}
announce(server, service) {
var delay = 1000;
var packet = service.records();
server.register(packet);
const broadcast = () => {
if (!service.activated || service.destroyed)
return;
server.mdns.respond(packet, function () {
if (!service.published) {
service.activated = true;
service.published = true;
service.emit('up');
}
delay = delay * REANNOUNCE_FACTOR;
if (delay < REANNOUNCE_MAX_MS && !service.destroyed) {
setTimeout(broadcast, delay).unref();
}
});
};
broadcast();
}
teardown(server, services, callback) {
if (!Array.isArray(services))
services = [services];
services = services.filter((service) => service.activated);
var records = services.flatMap(function (service) {
service.activated = false;
var records = service.records();
records.forEach((record) => {
record.ttl = 0;
});
return records;
});
if (records.length === 0)
return callback && process.nextTick(callback);
server.unregister(records);
server.mdns.respond(records, function () {
services.forEach(function (service) {
service.published = false;
});
if (typeof callback === "function") {
callback.apply(null, arguments);
}
});
}
}
exports.Registry = Registry;
exports.default = Registry;
//# sourceMappingURL=registry.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/lib/registry.ts"],"names":[],"mappings":"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"}

View File

@ -0,0 +1,7 @@
export interface ServiceType {
name?: string;
protocol?: 'tcp' | 'udp' | string | null | undefined;
subtype?: string | undefined;
}
export declare const toString: (data: ServiceType) => any;
export declare const toType: (string: string) => ServiceType;

View File

@ -0,0 +1,53 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.toType = exports.toString = void 0;
const Prefix = (name) => {
return '_' + name;
};
const AllowedProp = (key) => {
let keys = ['name', 'protocol', 'subtype'];
return keys.includes(key);
};
const toString = (data) => {
let formatted = {
name: data.name,
protocol: data.protocol,
subtype: data.subtype
};
let entries = Object.entries(formatted);
return entries
.filter(([key, val]) => AllowedProp(key) && val !== undefined)
.reduce((prev, [key, val]) => {
switch (typeof val) {
case 'object':
val.map((i) => prev.push(Prefix(i)));
break;
default:
prev.push(Prefix(val));
break;
}
return prev;
}, [])
.join('.');
};
exports.toString = toString;
const toType = (string) => {
let parts = string.split('.');
let subtype;
for (let i in parts) {
if (parts[i][0] !== '_')
continue;
parts[i] = parts[i].slice(1);
}
if (parts.includes('sub')) {
subtype = parts.shift();
parts.shift();
}
return {
name: parts.shift(),
protocol: parts.shift() || null,
subtype: subtype
};
};
exports.toType = toType;
//# sourceMappingURL=service-types.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"service-types.js","sourceRoot":"","sources":["../../src/lib/service-types.ts"],"names":[],"mappings":";;;AAcA,MAAM,MAAM,GAAG,CAAC,IAAY,EAAU,EAAE;IACpC,OAAO,GAAG,GAAG,IAAI,CAAA;AACrB,CAAC,CAAA;AAOD,MAAM,WAAW,GAAG,CAAC,GAAW,EAAW,EAAE;IACzC,IAAI,IAAI,GAAkB,CAAC,MAAM,EAAC,UAAU,EAAC,SAAS,CAAC,CAAA;IACvD,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AAC7B,CAAC,CAAA;AAOM,MAAM,QAAQ,GAAG,CAAC,IAAiB,EAAO,EAAE;IAE/C,IAAI,SAAS,GAAgB;QACzB,IAAI,EAAU,IAAI,CAAC,IAAI;QACvB,QAAQ,EAAM,IAAI,CAAC,QAAQ;QAC3B,OAAO,EAAM,IAAI,CAAC,OAAO;KAC5B,CAAA;IAED,IAAI,OAAO,GAAe,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IACnD,OAAO,OAAO;SACT,MAAM,CAAC,CAAC,CAAC,GAAG,EAAC,GAAG,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,SAAS,CAAC;SAC5D,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,EAAC,GAAG,CAAC,EAAE,EAAE;QACxB,QAAO,OAAO,GAAG,EAAE,CAAC;YAChB,KAAK,QAAQ;gBACT,GAAG,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;gBAC5C,MAAK;YACT;gBACI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;gBACtB,MAAK;QACb,CAAC;QACD,OAAO,IAAI,CAAA;IACf,CAAC,EAAC,EAAE,CAAC;SACJ,IAAI,CAAC,GAAG,CAAC,CAAA;AAClB,CAAC,CAAA;AAvBY,QAAA,QAAQ,YAuBpB;AAOM,MAAM,MAAM,GAAG,CAAC,MAAc,EAAe,EAAE;IAElD,IAAI,KAAK,GAAkB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC5C,IAAI,OAA2B,CAAC;IAGhC,KAAI,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;QACjB,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG;YAAE,SAAQ;QACjC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAChC,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QACxB,KAAK,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;IAGD,OAAO;QACH,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE;QACnB,QAAQ,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,IAAI;QAC/B,OAAO,EAAE,OAAO;KACnB,CAAA;AACL,CAAC,CAAA;AAtBY,QAAA,MAAM,UAsBlB"}

View File

@ -0,0 +1,55 @@
import KeyValue from './KeyValue';
import { EventEmitter } from 'events';
export interface ServiceConfig {
name: string;
type: string;
port: number;
protocol?: 'tcp' | 'udp';
host?: string;
fqdn?: string;
subtypes?: Array<string>;
txt?: KeyValue;
probe?: boolean;
disableIPv6?: boolean;
}
export interface ServiceRecord {
name: string;
type: 'PTR' | 'SRV' | 'TXT' | 'A' | 'AAAA';
ttl: number;
data: KeyValue | string | any;
}
export interface ServiceReferer {
address: string;
family: 'IPv4' | 'IPv6';
port: number;
size: number;
}
export declare class Service extends EventEmitter {
name: string;
type: string;
protocol: 'tcp' | 'udp';
port: number;
host: string;
fqdn: string;
txt?: any;
subtypes?: Array<string>;
addresses?: Array<string>;
referer?: ServiceReferer;
disableIPv6: boolean;
probe: boolean;
published: boolean;
activated: boolean;
destroyed: boolean;
start?: CallableFunction;
stop?: CallableFunction;
private txtService;
constructor(config: ServiceConfig);
records(): Array<ServiceRecord>;
private RecordPTR;
private RecordSubtypePTR;
private RecordSRV;
private RecordTXT;
private RecordA;
private RecordAAAA;
}
export default Service;

View File

@ -0,0 +1,115 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Service = void 0;
const os_1 = __importDefault(require("os"));
const dns_txt_1 = __importDefault(require("./dns-txt"));
const events_1 = require("events");
const service_types_1 = require("./service-types");
const TLD = '.local';
class Service extends events_1.EventEmitter {
constructor(config) {
super();
this.probe = true;
this.published = false;
this.activated = false;
this.destroyed = false;
this.txtService = new dns_txt_1.default();
if (!config.name)
throw new Error('ServiceConfig requires `name` property to be set');
if (!config.type)
throw new Error('ServiceConfig requires `type` property to be set');
if (!config.port)
throw new Error('ServiceConfig requires `port` property to be set');
this.name = config.name.split('.').join('-');
this.protocol = config.protocol || 'tcp';
this.type = (0, service_types_1.toString)({ name: config.type, protocol: this.protocol });
this.port = config.port;
this.host = config.host || os_1.default.hostname();
this.fqdn = `${this.name}.${this.type}${TLD}`;
this.txt = config.txt;
this.subtypes = config.subtypes;
this.disableIPv6 = !!config.disableIPv6;
}
records() {
var records = [this.RecordPTR(this), this.RecordSRV(this), this.RecordTXT(this)];
for (let subtype of this.subtypes || []) {
records.push(this.RecordSubtypePTR(this, subtype));
}
let ifaces = Object.values(os_1.default.networkInterfaces());
for (let iface of ifaces) {
let addrs = iface;
for (let addr of addrs) {
if (addr.internal || addr.mac === '00:00:00:00:00:00')
continue;
switch (addr.family) {
case 'IPv4':
records.push(this.RecordA(this, addr.address));
break;
case 'IPv6':
if (this.disableIPv6)
break;
records.push(this.RecordAAAA(this, addr.address));
break;
}
}
}
return records;
}
RecordPTR(service) {
return {
name: `${service.type}${TLD}`,
type: 'PTR',
ttl: 28800,
data: service.fqdn
};
}
RecordSubtypePTR(service, subtype) {
return {
name: `_${subtype}._sub.${service.type}${TLD}`,
type: 'PTR',
ttl: 28800,
data: `${service.name}.${service.type}${TLD}`
};
}
RecordSRV(service) {
return {
name: service.fqdn,
type: 'SRV',
ttl: 120,
data: {
port: service.port,
target: service.host
}
};
}
RecordTXT(service) {
return {
name: service.fqdn,
type: 'TXT',
ttl: 4500,
data: this.txtService.encode(service.txt)
};
}
RecordA(service, ip) {
return {
name: service.host,
type: 'A',
ttl: 120,
data: ip
};
}
RecordAAAA(service, ip) {
return {
name: service.host,
type: 'AAAA',
ttl: 120,
data: ip
};
}
}
exports.Service = Service;
exports.default = Service;
//# sourceMappingURL=service.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/lib/service.ts"],"names":[],"mappings":"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"}

View File

@ -0,0 +1 @@
export default function dnsEqual(a: string, b: string): boolean;

View File

@ -0,0 +1,13 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = dnsEqual;
const capitalLetterRegex = /[A-Z]/g;
function toLowerCase(input) {
return input.toLowerCase();
}
function dnsEqual(a, b) {
const aFormatted = a.replace(capitalLetterRegex, toLowerCase);
const bFormatted = b.replace(capitalLetterRegex, toLowerCase);
return aFormatted === bFormatted;
}
//# sourceMappingURL=dns-equal.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"dns-equal.js","sourceRoot":"","sources":["../../../src/lib/utils/dns-equal.ts"],"names":[],"mappings":";;AAOA,2BAKC;AAXD,MAAM,kBAAkB,GAAY,QAAQ,CAAA;AAE5C,SAAS,WAAW,CAAC,KAAa;IAC9B,OAAO,KAAK,CAAC,WAAW,EAAE,CAAA;AAC9B,CAAC;AAED,SAAwB,QAAQ,CAAC,CAAS,EAAE,CAAS;IACjD,MAAM,UAAU,GAAG,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,WAAW,CAAC,CAAA;IAC7D,MAAM,UAAU,GAAG,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,WAAW,CAAC,CAAA;IAE7D,OAAO,UAAU,KAAK,UAAU,CAAA;AACpC,CAAC"}

View File

@ -0,0 +1 @@
export default function equalTxt(a: Record<string, string>, b: Record<string, string>): boolean;

View File

@ -0,0 +1,17 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = equalTxt;
function equalTxt(a, b) {
if (a === undefined || b === undefined)
return false;
let aKeys = Object.keys(a);
let bKeys = Object.keys(b);
if (aKeys.length != bKeys.length)
return false;
for (let key of aKeys) {
if (a[key] != b[key])
return false;
}
return true;
}
//# sourceMappingURL=equal-txt.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"equal-txt.js","sourceRoot":"","sources":["../../../src/lib/utils/equal-txt.ts"],"names":[],"mappings":";;AAAA,2BASC;AATD,SAAwB,QAAQ,CAAC,CAAyB,EAAE,CAAyB;IACjF,IAAG,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,KAAK,CAAA;IACnD,IAAI,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC1B,IAAI,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC1B,IAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IAC7C,KAAI,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;QACnB,IAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAA;IACrC,CAAC;IACD,OAAO,IAAI,CAAA;AACf,CAAC"}

View File

@ -0,0 +1,4 @@
import KeyValue from '../KeyValue';
import Service from '../service';
declare const _default: (service: Service, txtQuery: KeyValue | undefined) => boolean;
export default _default;

View File

@ -0,0 +1,22 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = (service, txtQuery) => {
if (txtQuery === undefined)
return true;
let serviceTxt = service.txt;
let query = Object.entries(txtQuery)
.map(([key, value]) => {
let queryValue = serviceTxt[key];
if (queryValue === undefined)
return false;
if (value != queryValue)
return false;
return true;
});
if (query.length == 0)
return true;
if (query.includes(false))
return false;
return true;
};
//# sourceMappingURL=filter-service.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"filter-service.js","sourceRoot":"","sources":["../../../src/lib/utils/filter-service.ts"],"names":[],"mappings":";;AAOA,kBAAe,CAAC,OAAgB,EAAE,QAA8B,EAAW,EAAE;IACzE,IAAG,QAAQ,KAAK,SAAS;QAAE,OAAO,IAAI,CAAA;IACtC,IAAI,UAAU,GAAG,OAAO,CAAC,GAAG,CAAA;IAC5B,IAAI,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;SAC/B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QAClB,IAAI,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAA;QAChC,IAAG,UAAU,KAAK,SAAS;YAAE,OAAO,KAAK,CAAA;QACzC,IAAG,KAAK,IAAI,UAAU;YAAE,OAAO,KAAK,CAAA;QACpC,OAAO,IAAI,CAAA;IACf,CAAC,CAAC,CAAA;IACN,IAAG,KAAK,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IACjC,IAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IACtC,OAAO,IAAI,CAAA;AACf,CAAC,CAAA"}

View File

@ -0,0 +1,3 @@
import KeyValue from '../KeyValue';
declare const _default: (data: KeyValue) => {};
export default _default;

View File

@ -0,0 +1,6 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = (data) => Object.keys(data)
.filter((key) => !key.includes('binary'))
.reduce((cur, key) => { return Object.assign(cur, { [key]: data[key] }); }, {});
//# sourceMappingURL=filter-txt.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"filter-txt.js","sourceRoot":"","sources":["../../../src/lib/utils/filter-txt.ts"],"names":[],"mappings":";;AAMA,kBAAe,CAAC,IAAc,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;KACnD,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;KACxC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA,CAAA,CAAC,EAAE,EAAE,CAAC,CAAA"}

52
app_vue/node_modules/bonjour-service/package.json generated vendored Normal file
View File

@ -0,0 +1,52 @@
{
"name": "bonjour-service",
"version": "1.3.0",
"description": "A Bonjour/Zeroconf implementation in TypeScript",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
"dependencies": {
"fast-deep-equal": "^3.1.3",
"multicast-dns": "^7.2.5"
},
"devDependencies": {
"@types/node": "^22.9.0",
"@typescript-eslint/eslint-plugin": "^5.62.0",
"@typescript-eslint/parser": "^5.62.0",
"after-all": "^2.0.2",
"eslint": "^8.57.1",
"standard": "^17.1.2",
"tape": "^5.9.0",
"ts-node-dev": "^2.0.0",
"typescript": "^5.6.3"
},
"scripts": {
"test": "standard --fix && tape test/*.js",
"build": "tsc --removeComments true",
"dev": "ts-node-dev --respawn --transpile-only ./src/index.ts",
"example:simple": "node examples/simple"
},
"repository": {
"type": "git",
"url": "https://github.com/onlxltd/bonjour-service.git"
},
"keywords": [
"bonjour",
"zeroconf",
"zero",
"configuration",
"mdns",
"dns",
"service",
"discovery",
"multicast",
"broadcast",
"dns-sd"
],
"author": "ON LX Lited <team@onlx.ltd> (https://onlx.ltd)",
"license": "MIT",
"bugs": {
"url": "https://github.com/onlxltd/bonjour-service/issues"
},
"homepage": "https://github.com/onlxltd/bonjour-service",
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
}

View File

@ -0,0 +1,4 @@
declare module 'multicast-dns' {
function init(opts: { [key: string]: any })
export = init
}