dirigera
Version:
A TypeScript client for IKEA's DIRIGERA smart home hub
44 lines (43 loc) • 1.53 kB
JavaScript
import createMdnsServer from 'mdns-server';
const name = '_ihsp._tcp.local.';
export const discoverGatewayIP = async (timeoutMilliseconds = 10000) => {
const mdnsServer = createMdnsServer({
reuseAddr: true,
loopback: false,
noInit: true,
});
return new Promise((resolve, reject) => {
const timeout = setTimeout(() => {
rejectWithError(new Error('Gateway discovery timed out. Try specifying the gateway IP address explicitly.'));
}, timeoutMilliseconds);
const resolveWithValue = (value) => {
clearTimeout(timeout);
mdnsServer.destroy();
resolve(value);
};
const rejectWithError = (error) => {
clearTimeout(timeout);
mdnsServer.destroy();
reject(error);
};
mdnsServer.on('response', (response) => {
const ipv4 = response?.answers?.find((a) => a.type === 'A')?.data;
if (ipv4) {
return resolveWithValue(ipv4);
}
const ipv6 = response?.answers?.find((a) => a.type === 'AAAA')?.data;
if (ipv6) {
return resolveWithValue(`[${ipv6}]`);
}
});
mdnsServer.on('ready', () => {
mdnsServer.query([
{ name, type: 'A' },
{ name, type: 'AAAA' },
{ name, type: 'PTR' },
]);
});
mdnsServer.on('error', rejectWithError);
mdnsServer.initServer();
});
};