@devioarts/capacitor-mdns 0.1.0 → 0.2.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/CHANGELOG.md +110 -0
- package/DevioartsCapacitorMdns.podspec +3 -3
- package/Package.swift +1 -1
- package/README.md +221 -37
- package/android/build.gradle +3 -9
- package/android/src/main/java/com/devioarts/capacitor/mdns/AndroidNsdBackend.kt +145 -0
- package/android/src/main/java/com/devioarts/capacitor/mdns/MdnsOptions.kt +32 -0
- package/android/src/main/java/com/devioarts/capacitor/mdns/MdnsValidation.kt +26 -0
- package/android/src/main/java/com/devioarts/capacitor/mdns/NsdBackend.kt +59 -0
- package/android/src/main/java/com/devioarts/capacitor/mdns/mDNS.kt +467 -243
- package/android/src/main/java/com/devioarts/capacitor/mdns/mDNSPlugin.kt +80 -57
- package/dist/docs.json +250 -14
- package/dist/esm/definitions.d.ts +64 -17
- package/dist/esm/definitions.js.map +1 -1
- package/dist/esm/index.js +22 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/web.d.ts +6 -1
- package/dist/esm/web.js +23 -0
- package/dist/esm/web.js.map +1 -1
- package/dist/plugin.cjs.js +45 -2
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +45 -2
- package/dist/plugin.js.map +1 -1
- package/docs/electron.md +29 -3
- package/docs/platform-setup.md +6 -0
- package/docs/playground.md +33 -2
- package/docs/runtime-behavior.md +68 -2
- package/electron/dist/plugin-settings.js +10 -3
- package/electron/dist/plugin-settings.js.map +1 -1
- package/electron/dist/plugin.cjs.js +519 -89
- package/electron/dist/plugin.cjs.js.map +1 -1
- package/electron/mdns-bridge.cjs +25 -2
- package/electron/mdns.ts +514 -81
- package/electron/rollup.config.mjs +1 -1
- package/electron/src/index.ts +1 -0
- package/electron/src/plugin-settings.ts +10 -3
- package/electron/types-public/index.d.ts +25 -3
- package/ios/Sources/mDNSPlugin/mDNS.swift +407 -117
- package/ios/Sources/mDNSPlugin/mDNSPlugin.swift +77 -24
- package/ios/Tests/mDNSPluginTests/BridgeTests.swift +46 -0
- package/ios/Tests/mDNSPluginTests/MDNSTests.swift +490 -0
- package/package.json +11 -4
- package/ios/Tests/mDNSPluginTests/mDNSPluginTests.swift +0 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.cjs.js","sources":["../build/electron/mdns.js"],"sourcesContent":["import Bonjour from 'bonjour-service';\nimport { ipcMain } from 'electron';\n/**\n * Electron main-process implementation of the mDNS/Bonjour functionality.\n *\n * Uses the `bonjour-service` package to:\n * - publish (advertise) a single service;\n * - discover services of a given type and normalize results to the shared schema;\n * - wire the API over Electron's ipcMain (see registerIpc/attachOnReady).\n *\n * Notes:\n * - Instance name matching is normalized and prefix-safe, mirroring iOS/Android behavior.\n * - TXT records are forwarded as strings when present.\n */\nexport class mDNS {\n constructor() {\n this.publishTimeoutMs = 5000;\n this.stopTimeoutMs = 3000;\n this.broadcastQueue = Promise.resolve();\n this.destroyed = false;\n //<editor-fold desc=\"Init/Destroy\">\n this.ipcRegistered = false;\n //</editor-fold>\n this.bonjour = new Bonjour();\n }\n registerIpc() {\n if (this.ipcRegistered)\n return;\n try {\n ipcMain.removeHandler('mdns:startBroadcast');\n ipcMain.removeHandler('mdns:stopBroadcast');\n ipcMain.removeHandler('mdns:discover');\n ipcMain.removeHandler('mdns:getPluginPlatform');\n }\n catch (_a) {\n /* ignore */\n }\n ipcMain.handle('mdns:startBroadcast', (_evt, o) => this.startBroadcast(o));\n ipcMain.handle('mdns:stopBroadcast', () => this.stopBroadcast());\n ipcMain.handle('mdns:discover', (_evt, o) => this.discover(o));\n ipcMain.handle('mdns:getPluginPlatform', () => this.getPluginPlatform());\n this.ipcRegistered = true;\n }\n unregisterIpc() {\n if (!this.ipcRegistered)\n return;\n try {\n ipcMain.removeHandler('mdns:startBroadcast');\n ipcMain.removeHandler('mdns:stopBroadcast');\n ipcMain.removeHandler('mdns:discover');\n ipcMain.removeHandler('mdns:getPluginPlatform');\n }\n catch (_a) {\n /* ignore */\n }\n this.ipcRegistered = false;\n }\n /** Manual IPC registration (if you set autoRegisterIpc: false). Idempotent. */\n init() {\n this.registerIpc();\n }\n async destroy() {\n this.destroyed = true;\n this.unregisterIpc();\n await this.withBroadcastLock(async () => {\n await this.stopBroadcastUnlocked();\n try {\n this.bonjour.destroy();\n }\n catch (err) {\n console.warn('[mDNS] bonjour.destroy error:', err);\n }\n });\n }\n // ----------------------------- utils -----------------------------\n toErr(err) {\n return err instanceof Error ? err.message : String(err);\n }\n validatePort(port) {\n return Number.isInteger(port) && typeof port === 'number' && port > 0 && port <= 65535\n ? null\n : 'Missing/invalid port';\n }\n isRecord(value) {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n }\n withBroadcastLock(work) {\n // Publish and stop share one Bonjour service; serializing them prevents orphaned advertisers.\n const run = this.broadcastQueue.catch(() => undefined).then(work);\n this.broadcastQueue = run.catch(() => undefined);\n return run;\n }\n normalize(name) {\n return name.replace(/ \\(\\d+\\)$/, '');\n }\n matchesTarget(candidate, target) {\n if (!target)\n return true;\n const c = this.normalize(candidate), t = this.normalize(target);\n return c === t || c.startsWith(t);\n }\n parseType(typeWithDot) {\n const raw = typeof typeWithDot === 'string' && typeWithDot.trim() ? typeWithDot.trim() : '_http._tcp.';\n const s = raw.replace(/\\.$/, '');\n const m = /^_([^.]+)\\._(tcp|udp)$/.exec(s);\n if (!m)\n return { type: 'http', protocol: 'tcp' };\n return { type: m[1], protocol: m[2] };\n }\n toFullType(type, protocol) {\n return `_${type}._${protocol}.`;\n }\n hasCbStop(x) {\n return !!x && typeof x.stop === 'function';\n }\n async safeStopService(svc) {\n if (!svc || !this.hasCbStop(svc))\n return;\n try {\n await new Promise((res) => {\n let settled = false;\n const done = () => {\n if (settled)\n return;\n settled = true;\n if (timeout)\n clearTimeout(timeout);\n res();\n };\n const timeout = setTimeout(done, this.stopTimeoutMs);\n try {\n svc.stop(done);\n }\n catch (e) {\n console.warn('[mDNS] service.stop threw:', e);\n done();\n }\n });\n }\n catch (err) {\n console.warn('[mDNS] service.stop error:', err);\n }\n }\n safeStopBrowser(b) {\n if (!b)\n return;\n try {\n b.stop();\n }\n catch (err) {\n console.warn('[mDNS] browser.stop error:', err);\n }\n }\n // ----------------------------- API -----------------------------\n /**\n * Return the Electron main-process implementation marker.\n */\n async getPluginPlatform() {\n return { platform: 'electron' };\n }\n /**\n * Publish (advertise) a single Bonjour/mDNS service via bonjour-service.\n * @param options See MdnsBroadcastOptions for type/name/port/txt.\n * @returns Result indicating whether publishing is active and the final name.\n */\n async startBroadcast(options) {\n return this.withBroadcastLock(async () => {\n const safeOptions = (options !== null && options !== void 0 ? options : {});\n const portError = this.validatePort(safeOptions.port);\n if (portError)\n return { publishing: false, name: '', error: true, errorMessage: portError };\n if (this.destroyed)\n return { publishing: false, name: '', error: true, errorMessage: 'mDNS instance is destroyed' };\n await this.stopBroadcastUnlocked();\n const { type, protocol } = this.parseType(safeOptions.type);\n return new Promise((resolve) => {\n let settled = false;\n let timeout = null;\n const safeResolve = (r) => {\n if (!settled) {\n settled = true;\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n resolve(r);\n }\n };\n try {\n const svc = this.bonjour.publish({\n name: typeof safeOptions.name === 'string' && safeOptions.name.trim()\n ? safeOptions.name.trim()\n : 'DevIOArtsMDNS',\n type,\n protocol,\n port: safeOptions.port,\n txt: this.isRecord(safeOptions.txt) ? this.normalizeTxt(safeOptions.txt) : undefined,\n });\n const cleanupListeners = () => {\n try {\n svc.removeListener('up', onUp);\n svc.removeListener('error', onError);\n }\n catch (_a) {\n /* ignore */\n }\n };\n const onUp = () => {\n cleanupListeners();\n safeResolve({ publishing: true, name: svc.name || '', error: false, errorMessage: null });\n };\n const onError = (err) => {\n cleanupListeners();\n void this.safeStopService(svc);\n if (this.advertiser === svc)\n this.advertiser = undefined;\n safeResolve({ publishing: false, name: '', error: true, errorMessage: this.toErr(err) });\n };\n const onTimeout = () => {\n cleanupListeners();\n void this.safeStopService(svc);\n if (this.advertiser === svc)\n this.advertiser = undefined;\n safeResolve({\n publishing: false,\n name: '',\n error: true,\n errorMessage: `Timed out waiting for service publish after ${this.publishTimeoutMs}ms`,\n });\n };\n svc.once('up', onUp);\n svc.once('error', onError);\n timeout = setTimeout(onTimeout, this.publishTimeoutMs);\n this.advertiser = svc;\n }\n catch (e) {\n safeResolve({ publishing: false, name: '', error: true, errorMessage: this.toErr(e) });\n }\n });\n });\n }\n /**\n * Stop advertising the current service if any and clear internal state.\n * @returns Result indicating whether the advertiser is active and error info.\n */\n async stopBroadcast() {\n return this.withBroadcastLock(() => this.stopBroadcastUnlocked());\n }\n async stopBroadcastUnlocked() {\n try {\n if (this.advertiser) {\n await this.safeStopService(this.advertiser);\n this.advertiser = undefined;\n }\n return { publishing: false, error: false, errorMessage: null };\n }\n catch (e) {\n return { publishing: false, error: true, errorMessage: this.toErr(e) };\n }\n }\n /**\n * Discover services of the given type and optionally filter by instance name.\n * Deduplicates by (name:port), collects IPv4/IPv6 addresses and TXT, and\n * resolves with either an early-exit match or after a timeout.\n * @param options See MdnsDiscoverOptions for type/name/timeout.\n */\n async discover(options = {}) {\n const safeOptions = (options !== null && options !== void 0 ? options : {});\n if (this.destroyed) {\n return { error: true, errorMessage: 'mDNS instance is destroyed', servicesFound: 0, services: [] };\n }\n const { type, protocol } = this.parseType(safeOptions.type);\n const targetId = typeof safeOptions.name === 'string' && safeOptions.name ? safeOptions.name : null;\n const timeoutMs = typeof safeOptions.timeout === 'number' ? safeOptions.timeout : 3000;\n let browser = null;\n const services = [];\n let hadError = false;\n let errMsg = null;\n return new Promise((resolve) => {\n let timer = null;\n let settled = false;\n const finish = () => {\n if (settled)\n return;\n settled = true;\n if (browser) {\n this.safeStopBrowser(browser);\n browser = null;\n }\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n resolve({\n error: hadError,\n errorMessage: errMsg,\n services,\n servicesFound: services.length,\n });\n };\n try {\n browser = this.bonjour.find({ type, protocol }, (s) => {\n var _a;\n if (!this.matchesTarget(s.name || '', targetId))\n return;\n const item = {\n name: s.name || '',\n type: this.toFullType(type, protocol),\n domain: 'local.',\n port: (_a = s.port) !== null && _a !== void 0 ? _a : 0,\n hosts: Array.isArray(s.addresses) ? s.addresses.slice() : [],\n txt: s.txt && Object.keys(s.txt).length ? this.normalizeTxt(s.txt) : undefined,\n };\n const key = `${item.name}:${item.port}`;\n if (!services.some((x) => `${x.name}:${x.port}` === key))\n services.push(item);\n if (targetId && this.matchesTarget(item.name, targetId))\n finish();\n });\n // Record error and let the timeout conclude; results will still be returned.\n const onBrowserError = (err) => {\n hadError = true;\n errMsg = this.toErr(err);\n };\n browser.on('error', onBrowserError);\n timer = setTimeout(finish, Math.max(0, timeoutMs));\n }\n catch (err) {\n hadError = true;\n errMsg = this.toErr(err);\n finish();\n }\n });\n }\n normalizeTxt(txt) {\n return Object.fromEntries(Object.entries(txt).map(([key, value]) => [key, Buffer.isBuffer(value) ? value.toString('utf8') : String(value)]));\n }\n}\n//# sourceMappingURL=mdns.js.map"],"names":["ipcMain"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin.cjs.js","sources":["../build/electron/mdns.js"],"sourcesContent":["import Bonjour from 'bonjour-service';\nimport { app, BrowserWindow, ipcMain } from 'electron';\nimport { isAbsolute, relative, sep } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { EventEmitter } from 'node:events';\nimport { isIPv4 } from 'node:net';\nconst DEFAULT_DISCOVER_TIMEOUT_MS = 3000;\n/** `setTimeout` treats delays above 2^31-1 as 1ms, so clamp. */\nconst MAX_TIMER_MS = 2147483647;\n/**\n * Electron main-process implementation of the mDNS/Bonjour functionality.\n *\n * Uses the `bonjour-service` package to:\n * - publish (advertise) a single service;\n * - discover services of a given type and normalize results to the shared schema;\n * - wire the API over Electron's ipcMain through init().\n *\n * Notes:\n * - Instance name matching is normalized and prefix-safe, mirroring iOS/Android behavior.\n * - TXT records are forwarded as strings when present.\n */\nexport class mDNS extends EventEmitter {\n constructor(bonjour, options = {}) {\n var _a, _b, _c;\n super();\n this.broadcastQueue = Promise.resolve();\n this.destroyed = false;\n /** Settle callbacks of in-flight discoveries, so destroy() can end them instead of leaving them waiting. */\n this.activeDiscoveries = new Set();\n this.stoppedBrowsers = new Set();\n this.deactivateBrowser = new Map();\n //<editor-fold desc=\"Init/Destroy\">\n this.ipcRegistered = false;\n this.onNetworkError = (err) => {\n var _a, _b, _c;\n this.networkError = this.toErr(err);\n (_a = this.pendingPublishError) === null || _a === void 0 ? void 0 : _a.call(this, err);\n const type = (_c = (_b = this.watch) === null || _b === void 0 ? void 0 : _b.types[0]) !== null && _c !== void 0 ? _c : '';\n const watching = !!this.watch;\n void this.stopWatching();\n for (const abort of [...this.activeDiscoveries])\n abort(this.toErr(err));\n if (watching)\n this.notify('watchError', { type, errorMessage: this.toErr(err), watching: false });\n else\n console.warn('[mDNS]', err);\n };\n this.trustedOrigins = new Set((_a = options.trustedOrigins) !== null && _a !== void 0 ? _a : []);\n if (bonjour)\n this.attachBonjour(bonjour);\n this.publishTimeoutMs = (_b = options.publishTimeoutMs) !== null && _b !== void 0 ? _b : 5000;\n this.stopTimeoutMs = (_c = options.stopTimeoutMs) !== null && _c !== void 0 ? _c : 3000;\n }\n attachBonjour(bonjour) {\n var _a, _b;\n this.bonjourInstance = bonjour;\n // shortcut: Bonjour 1.4 needs its internal transport for errors/TTL; recheck these tests on dependency upgrades.\n this.transport = (_a = bonjour.server) === null || _a === void 0 ? void 0 : _a.mdns;\n (_b = this.transport) === null || _b === void 0 ? void 0 : _b.on('error', this.onNetworkError);\n return bonjour;\n }\n get bonjour() {\n var _a;\n return ((_a = this.bonjourInstance) !== null && _a !== void 0 ? _a : this.attachBonjour(new Bonjour({}, (err) => console.warn('[mDNS] query response failed:', err))));\n }\n trustedUrl(raw) {\n try {\n const url = new URL(raw);\n // Capacitor Electron's default dev renderer; packaged apps require an explicit origin.\n if ((app === null || app === void 0 ? void 0 : app.isPackaged) === false && `${url.protocol}//${url.host}` === 'http://localhost:5173')\n return true;\n if (url.protocol === 'capacitor-electron:' &&\n url.hostname === 'localhost' &&\n !url.username &&\n !url.password &&\n !url.port)\n return true;\n if (url.protocol === 'file:') {\n const path = relative(app.getAppPath(), fileURLToPath(url));\n return path !== '..' && !path.startsWith(`..${sep}`) && !isAbsolute(path);\n }\n return this.trustedOrigins.has(`${url.protocol}//${url.host}`);\n }\n catch (_a) {\n return false;\n }\n }\n trustedSender(event) {\n return (!!event.senderFrame && event.senderFrame === event.sender.mainFrame && this.trustedUrl(event.senderFrame.url));\n }\n registerIpc() {\n if (this.ipcRegistered)\n return;\n try {\n ipcMain.removeHandler('mdns:startBroadcast');\n ipcMain.removeHandler('mdns:stopBroadcast');\n ipcMain.removeHandler('mdns:discover');\n ipcMain.removeHandler('mdns:getPluginPlatform');\n ipcMain.removeHandler('mdns:watchServices');\n ipcMain.removeHandler('mdns:stopWatching');\n }\n catch (_a) {\n /* ignore */\n }\n const handle = (channel, action) => {\n ipcMain.handle(channel, (event, options) => {\n if (!this.trustedSender(event))\n throw new Error('Untrusted mDNS IPC sender');\n return action(options);\n });\n };\n handle('mdns:startBroadcast', (o) => this.startBroadcast(o));\n handle('mdns:stopBroadcast', () => this.stopBroadcast());\n handle('mdns:discover', (o) => this.discover(o));\n handle('mdns:getPluginPlatform', () => this.getPluginPlatform());\n handle('mdns:watchServices', (o) => this.watchServices(o));\n handle('mdns:stopWatching', () => this.stopWatching());\n this.ipcRegistered = true;\n }\n unregisterIpc() {\n if (!this.ipcRegistered)\n return;\n try {\n ipcMain.removeHandler('mdns:startBroadcast');\n ipcMain.removeHandler('mdns:stopBroadcast');\n ipcMain.removeHandler('mdns:discover');\n ipcMain.removeHandler('mdns:getPluginPlatform');\n ipcMain.removeHandler('mdns:watchServices');\n ipcMain.removeHandler('mdns:stopWatching');\n }\n catch (_a) {\n /* ignore */\n }\n this.ipcRegistered = false;\n }\n /** Register manual IPC handlers. Idempotent. */\n init() {\n this.registerIpc();\n }\n async destroy() {\n var _a;\n this.destroyed = true;\n (_a = this.pendingPublishError) === null || _a === void 0 ? void 0 : _a.call(this, new Error('mDNS instance destroyed during publish'));\n await this.stopWatching();\n this.unregisterIpc();\n for (const abort of [...this.activeDiscoveries])\n abort('mDNS instance destroyed during discovery');\n await this.withBroadcastLock(async () => {\n var _a, _b;\n await this.stopBroadcastUnlocked();\n try {\n (_a = this.bonjourInstance) === null || _a === void 0 ? void 0 : _a.destroy();\n (_b = this.transport) === null || _b === void 0 ? void 0 : _b.removeListener('error', this.onNetworkError);\n this.advertiser = undefined;\n }\n catch (err) {\n console.warn('[mDNS] bonjour.destroy error:', err);\n }\n });\n }\n // ----------------------------- utils -----------------------------\n toErr(err) {\n return err instanceof Error ? err.message : String(err);\n }\n validatePort(port) {\n return Number.isInteger(port) && typeof port === 'number' && port > 0 && port <= 65535\n ? null\n : 'Missing/invalid port';\n }\n isRecord(value) {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n }\n withBroadcastLock(work) {\n // Publish and stop share one Bonjour service; serializing them prevents orphaned advertisers.\n const run = this.broadcastQueue.catch(() => undefined).then(work);\n this.broadcastQueue = run.catch(() => undefined);\n return run;\n }\n normalize(name) {\n return name.replace(/ \\(\\d+\\)$/, '').replace(/\\./g, '-');\n }\n matchesTarget(candidate, target) {\n if (!target)\n return true;\n const c = this.normalize(candidate), t = this.normalize(target);\n return c === t || c.startsWith(t);\n }\n /**\n * Parse a `_name._tcp.` style type. Absent/blank input means the default `_http._tcp.`;\n * anything malformed is rejected (null) rather than silently advertised as something else.\n */\n parseType(typeWithDot) {\n if (typeWithDot != null && typeof typeWithDot !== 'string')\n return null;\n const raw = typeof typeWithDot === 'string' && typeWithDot.trim() ? typeWithDot.trim() : '_http._tcp.';\n const m = /^_([a-z0-9](?:[a-z0-9-]{0,13}[a-z0-9])?)\\._(tcp|udp)\\.?$/i.exec(raw);\n return m && /[a-z]/i.test(m[1]) && !m[1].includes('--')\n ? { type: m[1].toLowerCase(), protocol: m[2].toLowerCase() }\n : null;\n }\n validateName(name) {\n return name != null &&\n (typeof name !== 'string' || Buffer.byteLength(name.trim(), 'utf8') > 63 || /[\\x00-\\x1f\\x7f]/.test(name))\n ? 'Invalid instance name (maximum 63 UTF-8 bytes, no control characters)'\n : null;\n }\n validateTxt(txt) {\n if (txt == null)\n return null;\n if (!this.isRecord(txt))\n return 'TXT must be an object of strings';\n const keys = new Set();\n let totalBytes = 0;\n for (const [key, value] of Object.entries(txt)) {\n if (!/^[\\x20-\\x7e]+$/.test(key) || key.includes('=') || keys.has(key.toLowerCase()))\n return 'Invalid or duplicate TXT key';\n if (typeof value !== 'string' || Buffer.byteLength(`${key}=${value}`, 'utf8') > 255)\n return 'TXT entries must be strings of at most 255 UTF-8 bytes including key=';\n totalBytes += Buffer.byteLength(`${key}=${value}`, 'utf8') + 1;\n if (totalBytes > 1300)\n return 'TXT record must fit in 1300 bytes including length prefixes';\n keys.add(key.toLowerCase());\n }\n return null;\n }\n invalidTypeMessage(typeWithDot) {\n return `Invalid service type: ${String(typeWithDot)} (expected e.g. \"_http._tcp.\")`;\n }\n normalizeTimeout(value) {\n if (typeof value !== 'number' || !Number.isFinite(value))\n return DEFAULT_DISCOVER_TIMEOUT_MS;\n return Math.min(Math.max(0, Math.trunc(value)), MAX_TIMER_MS);\n }\n toFullType(type, protocol) {\n return `_${type}._${protocol}.`;\n }\n async safeStopService(svc) {\n if (!svc)\n return;\n await new Promise((res, reject) => {\n let settled = false;\n const done = (error) => {\n if (settled)\n return;\n settled = true;\n if (timeout)\n clearTimeout(timeout);\n if (error)\n reject(error);\n else\n res();\n };\n const timeout = setTimeout(() => done(new Error(`Timed out waiting for service stop after ${this.stopTimeoutMs}ms`)), this.stopTimeoutMs);\n try {\n svc.stop(done);\n }\n catch (e) {\n done(e);\n }\n });\n }\n safeStopBrowser(b) {\n if (!b)\n return;\n try {\n b.stop();\n }\n catch (err) {\n console.warn('[mDNS] browser.stop error:', err);\n }\n }\n // ----------------------------- API -----------------------------\n /**\n * Return the Electron main-process implementation marker.\n */\n async getPluginPlatform() {\n return { platform: 'electron' };\n }\n /**\n * Publish (advertise) a single Bonjour/mDNS service via bonjour-service.\n * @param options See MdnsBroadcastOptions for type/name/port/txt.\n * @returns Result indicating whether publishing is active and the final name.\n */\n async startBroadcast(options) {\n return this.withBroadcastLock(async () => {\n var _a, _b;\n const safeOptions = (options !== null && options !== void 0 ? options : {});\n const portError = (_b = (_a = this.validatePort(safeOptions.port)) !== null && _a !== void 0 ? _a : this.validateName(safeOptions.name)) !== null && _b !== void 0 ? _b : this.validateTxt(safeOptions.txt);\n if (portError)\n return { publishing: !!this.advertiser, name: '', error: true, errorMessage: portError };\n if (this.destroyed)\n return { publishing: false, name: '', error: true, errorMessage: 'mDNS instance is destroyed' };\n if (this.networkError)\n return { publishing: !!this.advertiser, name: '', error: true, errorMessage: this.networkError };\n const parsed = this.parseType(safeOptions.type);\n if (!parsed) {\n return {\n publishing: !!this.advertiser,\n name: '',\n error: true,\n errorMessage: this.invalidTypeMessage(safeOptions.type),\n };\n }\n const { type, protocol } = parsed;\n const stopped = await this.stopBroadcastUnlocked();\n if (stopped.error)\n return Object.assign(Object.assign({}, stopped), { name: '' });\n return new Promise((resolve) => {\n let settled = false;\n let failing = false;\n let timeout = null;\n const safeResolve = (r) => {\n if (!settled) {\n settled = true;\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n this.pendingPublishError = undefined;\n resolve(r);\n }\n };\n try {\n const svc = this.bonjour.publish({\n name: typeof safeOptions.name === 'string' && safeOptions.name.trim()\n ? safeOptions.name.trim()\n : 'DevIOArtsMDNS',\n type,\n protocol,\n port: safeOptions.port,\n txt: this.isRecord(safeOptions.txt) ? this.normalizeTxt(safeOptions.txt) : undefined,\n });\n const cleanupListeners = () => {\n try {\n svc.removeListener('up', onUp);\n svc.removeListener('error', onError);\n }\n catch (_a) {\n /* ignore */\n }\n };\n const onUp = () => {\n if (failing || settled)\n return;\n cleanupListeners();\n safeResolve({ publishing: true, name: svc.name || '', error: false, errorMessage: null });\n };\n const onError = async (err) => {\n if (failing || settled)\n return;\n failing = true;\n if (timeout)\n clearTimeout(timeout);\n timeout = null;\n cleanupListeners();\n const stopped = await this.stopBroadcastUnlocked();\n safeResolve({\n publishing: stopped.publishing,\n name: '',\n error: true,\n errorMessage: [this.toErr(err), stopped.errorMessage].filter(Boolean).join('; '),\n });\n };\n const onTimeout = () => {\n void onError(new Error(svc.activated === false\n ? 'Service name is already in use on the network'\n : `Timed out waiting for service publish after ${this.publishTimeoutMs}ms`));\n };\n // shortcut: Bonjour 1.4 sends goodbye for conflicting probes; remove this hook when its probe teardown is fixed.\n const serviceRecords = svc.records;\n let announcementStarted = svc.published === true;\n svc.records = () => {\n if (svc.destroyed)\n return [];\n // Bonjour sets published only after the send callback, but records are already registered before it.\n announcementStarted = true;\n return serviceRecords.call(svc);\n };\n const stop = svc.stop.bind(svc);\n svc.stop = (callback) => {\n const announced = announcementStarted || svc.published === true;\n const conflict = !callback && svc.activated && !announced;\n const records = svc.records;\n if (!announced)\n svc.records = () => [];\n try {\n stop(callback);\n svc.destroyed = true;\n }\n finally {\n svc.records = records;\n }\n if (conflict)\n void onError(new Error('Service name is already in use on the network'));\n };\n svc.once('up', onUp);\n svc.once('error', onError);\n timeout = setTimeout(onTimeout, this.publishTimeoutMs);\n this.advertiser = svc;\n this.pendingPublishError = (error) => {\n void onError(error);\n };\n if (this.networkError)\n this.pendingPublishError(new Error(this.networkError));\n }\n catch (e) {\n safeResolve({ publishing: false, name: '', error: true, errorMessage: this.toErr(e) });\n }\n });\n });\n }\n /**\n * Stop advertising the current service if any and clear internal state.\n * @returns Result indicating whether the advertiser is active and error info.\n */\n async stopBroadcast() {\n return this.withBroadcastLock(() => this.stopBroadcastUnlocked());\n }\n async stopBroadcastUnlocked() {\n try {\n if (this.advertiser) {\n await this.safeStopService(this.advertiser);\n this.advertiser = undefined;\n }\n return { publishing: false, error: false, errorMessage: null };\n }\n catch (e) {\n return { publishing: !!this.advertiser, error: true, errorMessage: this.toErr(e) };\n }\n }\n /**\n * Discover services of the given type and optionally filter by instance name.\n * Deduplicates by (name:port), collects IPv4/IPv6 addresses and TXT, and\n * resolves with either an early-exit match or after a timeout.\n * @param options See MdnsDiscoverOptions for type/name/timeout.\n */\n async discover(options = {}) {\n var _a;\n const safeOptions = (options !== null && options !== void 0 ? options : {});\n if (this.destroyed) {\n return { error: true, errorMessage: 'mDNS instance is destroyed', servicesFound: 0, services: [] };\n }\n if (this.networkError)\n return { error: true, errorMessage: this.networkError, servicesFound: 0, services: [] };\n const parsed = this.parseType(safeOptions.type);\n if (!parsed) {\n return {\n error: true,\n errorMessage: this.invalidTypeMessage(safeOptions.type),\n servicesFound: 0,\n services: [],\n };\n }\n const inputError = (_a = this.validateName(safeOptions.name)) !== null && _a !== void 0 ? _a : (safeOptions.timeout != null && (typeof safeOptions.timeout !== 'number' || !Number.isFinite(safeOptions.timeout))\n ? 'Invalid timeout'\n : null);\n if (inputError)\n return { error: true, errorMessage: inputError, servicesFound: 0, services: [] };\n for (const abort of [...this.activeDiscoveries])\n abort('Discovery replaced by a new request');\n const { type, protocol } = parsed;\n const targetId = typeof safeOptions.name === 'string' && safeOptions.name.trim() ? safeOptions.name.trim() : null;\n const timeoutMs = this.normalizeTimeout(safeOptions.timeout);\n let browser = null;\n const services = [];\n let hadError = false;\n let errMsg = null;\n return new Promise((resolve) => {\n var _a;\n let timer = null;\n let settled = false;\n const finish = (abortMessage) => {\n var _a;\n if (settled)\n return;\n settled = true;\n this.activeDiscoveries.delete(finish);\n (_a = this.transport) === null || _a === void 0 ? void 0 : _a.removeListener('response', onResponse);\n if (abortMessage) {\n hadError = true;\n errMsg = abortMessage;\n }\n if (browser) {\n this.safeStopBrowser(browser);\n browser = null;\n }\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n resolve({\n error: hadError,\n errorMessage: errMsg,\n services: hadError ? [] : services.filter((s) => s.hosts.length > 0),\n servicesFound: hadError ? 0 : services.filter((s) => s.hosts.length > 0).length,\n });\n };\n const up = (s) => {\n if (settled)\n return;\n const item = this.serviceResult(s, this.toFullType(type, protocol));\n if (!this.matchesTarget(item.name, targetId))\n return;\n const previous = services.find((x) => x.name === item.name && x.port === item.port);\n if (previous)\n Object.assign(previous, item, { hosts: this.orderHosts([...previous.hosts, ...item.hosts]) });\n else\n services.push(item);\n if (targetId && item.hosts.length)\n finish();\n else if (!item.hosts.length && item.hostname) {\n this.queryAddresses(item.hostname);\n }\n };\n const onResponse = (packet) => {\n var _a, _b, _c;\n if (settled)\n return;\n const records = [...((_a = packet.answers) !== null && _a !== void 0 ? _a : []), ...((_b = packet.additionals) !== null && _b !== void 0 ? _b : [])];\n for (const item of services) {\n for (const record of records) {\n if ((record.type === 'A' || record.type === 'AAAA') &&\n record.ttl &&\n typeof record.data === 'string' &&\n record.name.toLowerCase() === ((_c = item.hostname) === null || _c === void 0 ? void 0 : _c.toLowerCase()) &&\n !item.hosts.includes(record.data))\n item.hosts = this.orderHosts([...item.hosts, record.data]);\n }\n }\n if (targetId && services.some((item) => item.hosts.length))\n finish();\n };\n this.activeDiscoveries.add(finish);\n try {\n const bonjour = this.bonjour;\n if (settled)\n return;\n (_a = this.transport) === null || _a === void 0 ? void 0 : _a.on('response', onResponse);\n browser = bonjour.find({ type, protocol }, up);\n if (settled) {\n this.safeStopBrowser(browser);\n browser = null;\n return;\n }\n browser.on('srv-update', up);\n browser.on('txt-update', up);\n // Record error and let the timeout conclude; results will still be returned.\n const onBrowserError = (err) => {\n hadError = true;\n errMsg = this.toErr(err);\n };\n browser.on('error', onBrowserError);\n timer = setTimeout(() => finish(), timeoutMs);\n }\n catch (err) {\n hadError = true;\n errMsg = this.toErr(err);\n finish();\n }\n });\n }\n normalizeTxt(txt) {\n return Object.fromEntries(Object.entries(txt).map(([key, value]) => [key, Buffer.isBuffer(value) ? value.toString('utf8') : String(value)]));\n }\n queryAddresses(hostname) {\n var _a, _b, _c, _d;\n try {\n (_b = (_a = this.transport) === null || _a === void 0 ? void 0 : _a.query) === null || _b === void 0 ? void 0 : _b.call(_a, hostname, 'A');\n (_d = (_c = this.transport) === null || _c === void 0 ? void 0 : _c.query) === null || _d === void 0 ? void 0 : _d.call(_c, hostname, 'AAAA');\n }\n catch (err) {\n this.onNetworkError(new Error(this.toErr(err)));\n }\n }\n orderHosts(hosts) {\n return [...new Set(hosts)].sort((a, b) => Number(isIPv4(b)) - Number(isIPv4(a)));\n }\n serviceResult(s, type) {\n var _a, _b;\n const suffix = `.${type}local`;\n const name = ((_a = s.fqdn) === null || _a === void 0 ? void 0 : _a.toLowerCase().endsWith(suffix.toLowerCase())) ? s.fqdn.slice(0, -suffix.length) : s.name || '';\n return Object.assign(Object.assign({ name,\n type, domain: 'local.', port: (_b = s.port) !== null && _b !== void 0 ? _b : 0, hosts: this.orderHosts(Array.isArray(s.addresses) ? s.addresses : []) }, (s.host ? { hostname: s.host } : {})), (s.txt && Object.keys(s.txt).length ? { txt: this.normalizeTxt(s.txt) } : {}));\n }\n notify(event, data) {\n var _a;\n this.emit(event, data);\n for (const win of (_a = BrowserWindow === null || BrowserWindow === void 0 ? void 0 : BrowserWindow.getAllWindows()) !== null && _a !== void 0 ? _a : []) {\n if (!win.isDestroyed() && !win.webContents.isDestroyed() && this.trustedUrl(win.webContents.getURL())) {\n win.webContents.send(`event-mDNS-${event}`, data);\n win.webContents.send(`mdns:event:${event}`, data);\n }\n }\n }\n /** Thanks to Idrimi for the original continuous discovery feature (PR #7). */\n async watchServices(options) {\n var _a;\n const failed = (message) => ({ error: true, errorMessage: message, watchersStarted: 0 });\n if (this.destroyed)\n return failed('mDNS instance is destroyed');\n if (this.networkError)\n return failed(this.networkError);\n if (!Array.isArray(options === null || options === void 0 ? void 0 : options.types) || !options.types.length)\n return failed(\"Missing or empty 'types' array\");\n const types = new Map();\n for (const raw of options.types) {\n const parsed = typeof raw === 'string' && raw.trim() ? this.parseType(raw) : null;\n if (!parsed)\n return failed(this.invalidTypeMessage(raw));\n types.set(this.toFullType(parsed.type, parsed.protocol), parsed);\n }\n const cleanup = this.stopWatch();\n if (cleanup)\n return failed(cleanup);\n const bonjour = this.bonjour;\n if (this.networkError)\n return failed(this.networkError);\n const watch = { types: [...types.keys()], browsers: [], services: new Map() };\n this.watch = watch;\n const addBrowser = (type, parsed) => {\n let active = true;\n const up = (s) => {\n var _a;\n if (this.watch !== watch || !active)\n return;\n const service = this.serviceResult(s, type);\n const key = `${type}|${service.name}`;\n const previous = watch.services.get(key);\n if (!service.hosts.length && (previous === null || previous === void 0 ? void 0 : previous.service.hostname) === service.hostname)\n service.hosts = [...((_a = previous === null || previous === void 0 ? void 0 : previous.service.hosts) !== null && _a !== void 0 ? _a : [])];\n const isNew = !(previous === null || previous === void 0 ? void 0 : previous.announced) && service.hosts.length > 0;\n watch.services.set(key, {\n service,\n fqdn: s.fqdn || `${service.name}.${type}local`,\n expires: s.ttl ? Date.now() + s.ttl * 1000 : Infinity,\n announced: !!(previous === null || previous === void 0 ? void 0 : previous.announced) || isNew,\n });\n if (!service.hosts.length && service.hostname)\n this.queryAddresses(service.hostname);\n if (isNew)\n this.notify('serviceFound', { service: structuredClone(service) });\n };\n const browser = bonjour.find(parsed, up);\n browser.on('down', (s) => {\n if (this.watch !== watch || !active)\n return;\n const key = `${type}|${this.serviceResult(s, type).name}`;\n const previous = watch.services.get(key);\n watch.services.delete(key);\n if (previous === null || previous === void 0 ? void 0 : previous.announced)\n this.notify('serviceLost', { service: structuredClone(previous.service) });\n });\n browser.on('srv-update', up);\n browser.on('txt-update', up);\n this.deactivateBrowser.set(browser, () => {\n active = false;\n });\n if (this.watch !== watch) {\n this.stopWatchBrowser(browser);\n return;\n }\n watch.browsers.push(browser);\n };\n try {\n for (const [type, parsed] of types)\n addBrowser(type, parsed);\n if (this.watch !== watch)\n return failed('Watch stopped during startup');\n watch.onResponse = (packet) => {\n var _a, _b;\n if (this.watch !== watch)\n return;\n const records = [...((_a = packet.answers) !== null && _a !== void 0 ? _a : []), ...((_b = packet.additionals) !== null && _b !== void 0 ? _b : [])];\n for (const item of watch.services.values()) {\n const ptr = records.find((r) => r.type === 'PTR' && String(r.data).toLowerCase() === item.fqdn.toLowerCase());\n if (ptr)\n item.expires = Date.now() + ptr.ttl * 1000;\n const addresses = records.filter((r) => { var _a; return (r.type === 'A' || r.type === 'AAAA') && r.name.toLowerCase() === ((_a = item.service.hostname) === null || _a === void 0 ? void 0 : _a.toLowerCase()); });\n for (const address of addresses) {\n if (typeof address.data !== 'string')\n continue;\n const hosts = item.service.hosts.filter((host) => host !== address.data);\n item.service.hosts = this.orderHosts(address.ttl ? [...hosts, address.data] : hosts);\n }\n if (!item.announced && item.service.hosts.length) {\n item.announced = true;\n this.notify('serviceFound', { service: structuredClone(item.service) });\n if (this.watch !== watch)\n return;\n }\n }\n };\n (_a = this.transport) === null || _a === void 0 ? void 0 : _a.on('response', watch.onResponse);\n let ticks = 0;\n watch.timer = setInterval(() => {\n var _a;\n if (this.watch !== watch)\n return;\n try {\n const expired = [...watch.services.entries()].filter(([, item]) => item.expires <= Date.now());\n for (const [key, item] of expired) {\n watch.services.delete(key);\n if (item.announced)\n this.notify('serviceLost', { service: structuredClone(item.service) });\n if (this.watch !== watch)\n return;\n }\n // A fresh Browser forgets expired entries retained by bonjour-service's internal cache.\n if (expired.length) {\n for (const browser of watch.browsers.splice(0))\n this.stopWatchBrowser(browser);\n for (const [type, parsed] of types)\n addBrowser(type, parsed);\n }\n else if (++ticks % 30 === 0) {\n for (const browser of watch.browsers)\n (_a = browser.update) === null || _a === void 0 ? void 0 : _a.call(browser);\n }\n }\n catch (err) {\n this.onNetworkError(err instanceof Error ? err : new Error(this.toErr(err)));\n }\n }, 1000);\n watch.timer.unref();\n return { error: false, errorMessage: null, watchersStarted: types.size };\n }\n catch (err) {\n this.stopWatch();\n return failed(this.toErr(err));\n }\n }\n stopWatchBrowser(browser) {\n var _a;\n (_a = this.deactivateBrowser.get(browser)) === null || _a === void 0 ? void 0 : _a();\n this.deactivateBrowser.delete(browser);\n try {\n browser.stop();\n this.stoppedBrowsers.delete(browser);\n }\n catch (err) {\n this.stoppedBrowsers.add(browser);\n throw err;\n }\n }\n stopWatch() {\n var _a, _b;\n const watch = this.watch;\n this.watch = undefined;\n if (watch === null || watch === void 0 ? void 0 : watch.timer)\n clearInterval(watch.timer);\n if (watch === null || watch === void 0 ? void 0 : watch.onResponse)\n (_a = this.transport) === null || _a === void 0 ? void 0 : _a.removeListener('response', watch.onResponse);\n const errors = [];\n for (const browser of new Set([...((_b = watch === null || watch === void 0 ? void 0 : watch.browsers) !== null && _b !== void 0 ? _b : []), ...this.stoppedBrowsers])) {\n try {\n this.stopWatchBrowser(browser);\n }\n catch (err) {\n errors.push(this.toErr(err));\n }\n }\n return errors.length ? errors.join('; ') : null;\n }\n async stopWatching() {\n const errorMessage = this.stopWatch();\n return { watching: false, error: !!errorMessage, errorMessage };\n }\n}\n//# sourceMappingURL=mdns.js.map"],"names":["EventEmitter","app","relative","fileURLToPath","sep","isAbsolute","ipcMain","isIPv4","BrowserWindow"],"mappings":"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"}
|
package/electron/mdns-bridge.cjs
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
// contextBridge.exposeInMainWorld('mDNS', createMDNSAPI({ ipcRenderer }))
|
|
5
5
|
// contextBridge.exposeInMainWorld('mdns', createMDNSAPI({ ipcRenderer })) // alias
|
|
6
6
|
module.exports.createMDNSAPI = ({ ipcRenderer }) => {
|
|
7
|
+
const subscriptions = new Set();
|
|
7
8
|
return {
|
|
8
9
|
/**
|
|
9
10
|
* Return the platform implementation that handled this call.
|
|
@@ -13,14 +14,14 @@ module.exports.createMDNSAPI = ({ ipcRenderer }) => {
|
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
16
|
* Start advertising a Bonjour/mDNS service.
|
|
16
|
-
* @param {{type?: string, name
|
|
17
|
+
* @param {{type?: string, name?: string, port: number, txt?: Record<string,string>}} options
|
|
17
18
|
* @returns {Promise<{publishing: boolean, name: string, error: boolean, errorMessage: string|null}>}
|
|
18
19
|
*/
|
|
19
20
|
startBroadcast: (options) => ipcRenderer.invoke('mdns:startBroadcast', options),
|
|
20
21
|
|
|
21
22
|
/**
|
|
22
23
|
* Stop advertising (no-op if not running).
|
|
23
|
-
* @returns {Promise<{publishing: boolean}>}
|
|
24
|
+
* @returns {Promise<{publishing: boolean, error: boolean, errorMessage: string|null}>}
|
|
24
25
|
*/
|
|
25
26
|
stopBroadcast: () => ipcRenderer.invoke('mdns:stopBroadcast'),
|
|
26
27
|
|
|
@@ -30,5 +31,27 @@ module.exports.createMDNSAPI = ({ ipcRenderer }) => {
|
|
|
30
31
|
* @returns {Promise<{error:boolean,errorMessage:string|null,servicesFound:number,services: Array<{name:string,type:string,domain:string,port:number,hosts:string[],txt?:Record<string,string>}>}>}
|
|
31
32
|
*/
|
|
32
33
|
discover: (options) => ipcRenderer.invoke('mdns:discover', options),
|
|
34
|
+
|
|
35
|
+
watchServices: (options) => ipcRenderer.invoke('mdns:watchServices', options),
|
|
36
|
+
stopWatching: () => ipcRenderer.invoke('mdns:stopWatching'),
|
|
37
|
+
addListener: async (eventName, handler) => {
|
|
38
|
+
if (!['serviceFound', 'serviceLost', 'watchError'].includes(eventName)) {
|
|
39
|
+
throw new Error(`Unknown mDNS event: ${eventName}`);
|
|
40
|
+
}
|
|
41
|
+
const channel = `mdns:event:${eventName}`;
|
|
42
|
+
const listener = (_event, data) => handler(data);
|
|
43
|
+
const subscription = {
|
|
44
|
+
remove: async () => {
|
|
45
|
+
ipcRenderer.removeListener(channel, listener);
|
|
46
|
+
subscriptions.delete(subscription);
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
subscriptions.add(subscription);
|
|
50
|
+
ipcRenderer.on(channel, listener);
|
|
51
|
+
return subscription;
|
|
52
|
+
},
|
|
53
|
+
removeAllListeners: async () => {
|
|
54
|
+
for (const subscription of [...subscriptions]) await subscription.remove();
|
|
55
|
+
},
|
|
33
56
|
}
|
|
34
57
|
}
|