75 lines
1.5 KiB
JavaScript
75 lines
1.5 KiB
JavaScript
/*
|
|
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
Author Tobias Koppers @sokra
|
|
*/
|
|
|
|
"use strict";
|
|
|
|
/** @typedef {import("../Cache").Etag} Etag */
|
|
|
|
class MergedEtag {
|
|
/**
|
|
* @param {Etag} a first
|
|
* @param {Etag} b second
|
|
*/
|
|
constructor(a, b) {
|
|
this.a = a;
|
|
this.b = b;
|
|
}
|
|
|
|
toString() {
|
|
return `${this.a.toString()}|${this.b.toString()}`;
|
|
}
|
|
}
|
|
|
|
const dualObjectMap = new WeakMap();
|
|
const objectStringMap = new WeakMap();
|
|
|
|
/**
|
|
* @param {Etag} a first
|
|
* @param {Etag} b second
|
|
* @returns {Etag} result
|
|
*/
|
|
const mergeEtags = (a, b) => {
|
|
if (typeof a === "string") {
|
|
if (typeof b === "string") {
|
|
return `${a}|${b}`;
|
|
} else {
|
|
const temp = b;
|
|
b = a;
|
|
a = temp;
|
|
}
|
|
} else {
|
|
if (typeof b !== "string") {
|
|
// both a and b are objects
|
|
let map = dualObjectMap.get(a);
|
|
if (map === undefined) {
|
|
dualObjectMap.set(a, (map = new WeakMap()));
|
|
}
|
|
const mergedEtag = map.get(b);
|
|
if (mergedEtag === undefined) {
|
|
const newMergedEtag = new MergedEtag(a, b);
|
|
map.set(b, newMergedEtag);
|
|
return newMergedEtag;
|
|
} else {
|
|
return mergedEtag;
|
|
}
|
|
}
|
|
}
|
|
// a is object, b is string
|
|
let map = objectStringMap.get(a);
|
|
if (map === undefined) {
|
|
objectStringMap.set(a, (map = new Map()));
|
|
}
|
|
const mergedEtag = map.get(b);
|
|
if (mergedEtag === undefined) {
|
|
const newMergedEtag = new MergedEtag(a, b);
|
|
map.set(b, newMergedEtag);
|
|
return newMergedEtag;
|
|
} else {
|
|
return mergedEtag;
|
|
}
|
|
};
|
|
|
|
module.exports = mergeEtags;
|