homebridge-hikvision-local
Version:
Homebridge plugin that connects to your HikVision DVR via a local connection and exposes your cameras in Homebridge. The plugin is heavily based on excellent [homebridge-camera-ffmpeg](https://github.com/Sunoo/homebridge-camera-ffmpeg) and the various hom
54 lines • 2.33 kB
JavaScript
import DigestFetch from 'digest-fetch';
export function createLoggedDigestFetch(username, password, options, log) {
const client = new DigestFetch(username, password, options);
const getClient = client.getClient.bind(client);
const logHeaders = (headers) => {
if (!headers) {
return '{}';
}
const headerObj = headers instanceof Headers
? Object.fromEntries(headers.entries())
: { ...headers };
return JSON.stringify(headerObj);
};
const logRequest = (tag, method, url, headers) => {
log(`${tag} ${method} ${url} | HEADERS: ${logHeaders(headers)}`);
};
const logResponse = (tag, method, url, res) => {
const headers = Object.fromEntries(res.headers.entries());
log(`${tag} ${method} ${url} -> ${res.status} | HEADERS: ${logHeaders(headers)}`);
};
client.fetch = async function (url, requestOptions = {}) {
const fetch = await getClient();
const method = requestOptions.method || 'GET';
// First request with empty or stale auth
const firstOpts = client.addAuth(url, requestOptions);
logRequest('➡️ Initial', method, url, firstOpts.headers);
const res = await fetch(url, firstOpts);
if (res.status === 401 || (res.status === client.statusCode && client.statusCode)) {
logResponse('⬅️ Challenge', method, url, res);
client.hasAuth = false;
client.parseAuth(res.headers.get('www-authenticate'));
if (client.hasAuth) {
const finalOpts = client.addAuth(url, requestOptions);
logRequest('🔁 Digest', method, url, finalOpts.headers);
const finalRes = await fetch(url, finalOpts);
logResponse('⬅️ Final', method, url, finalRes);
if (finalRes.status === 401 || finalRes.status === client.statusCode) {
client.hasAuth = false;
}
else {
client.digest.nc++;
}
return finalRes;
}
}
else {
client.digest.nc++;
}
logResponse('⬅️ Response', method, url, res);
return res;
};
return client;
}
//# sourceMappingURL=loggedDigestFetch.js.map