@homebridge/ciao
Version:
ciao is a RFC 6763 compliant dns-sd library, advertising on multicast dns (RFC 6762) implemented in plain Typescript/JavaScript
72 lines • 2.93 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.TiebreakingResult = void 0;
exports.rrComparator = rrComparator;
exports.runTiebreaking = runTiebreaking;
function rrComparator(recordA, recordB) {
if (recordA.class !== recordB.class) {
return recordA.class - recordB.class;
}
if (recordA.type !== recordB.type) {
return recordA.type - recordB.type;
}
// now follows a raw comparison of the binary data
const aData = recordA.getRawData();
const bData = recordB.getRawData();
const maxLength = Math.max(aData.length, bData.length); // get the biggest length
for (let i = 0; i < maxLength; i++) {
if (i >= aData.length && i < bData.length) { // a ran out of data and b still holds data
return -1;
}
else if (i >= bData.length && i < aData.length) { // b ran out of data and a still hold data
return 1;
}
const aByte = aData.readUInt8(i);
const bByte = bData.readUInt8(i);
if (aByte !== bByte) {
return aByte < bByte ? -1 : 1;
}
}
// if we reach here we have a tie. both records represent the SAME data.
return 0;
}
var TiebreakingResult;
(function (TiebreakingResult) {
/**
* The opponent is considered the winner
*/
TiebreakingResult[TiebreakingResult["OPPONENT"] = -1] = "OPPONENT";
/**
* Both try to expose the exact same data
*/
TiebreakingResult[TiebreakingResult["TIE"] = 0] = "TIE";
/**
* The host is considered the winner
*/
TiebreakingResult[TiebreakingResult["HOST"] = 1] = "HOST";
})(TiebreakingResult || (exports.TiebreakingResult = TiebreakingResult = {}));
/**
* Runs the tiebreaking algorithm to resolve the race condition of simultaneous probing.
* The input sets MUST already be sorted.
*
* @param {ResourceRecord[]} host - sorted list of records the host wants to publish
* @param {ResourceRecord[]} opponent - sorted list of records the opponent wants to publish
* @returns the result {@see TiebreakingResult} of the tiebreaking algorithm
*/
function runTiebreaking(host, opponent) {
const maxLength = Math.max(host.length, opponent.length);
for (let i = 0; i < maxLength; i++) {
if (i >= host.length && i < opponent.length) { // host runs out of records and opponent still has some
return -1 /* TiebreakingResult.OPPONENT */; // opponent wins
}
else if (i >= opponent.length && i < host.length) { // opponent runs out of records and host still has some
return 1 /* TiebreakingResult.HOST */; // host wins
}
const recordComparison = rrComparator(host[i], opponent[i]);
if (recordComparison !== 0) {
return recordComparison;
}
}
return 0 /* TiebreakingResult.TIE */; // they expose the exact same data
}
//# sourceMappingURL=tiebreaking.js.map