UNPKG

1.49 kBJavaScriptView Raw
1/*
2 MIT License http://www.opensource.org/licenses/mit-license.php
3 Author Tobias Koppers @sokra
4*/
5
6"use strict";
7
8/** @typedef {import("../Cache").Etag} Etag */
9
10class MergedEtag {
11 /**
12 * @param {Etag} a first
13 * @param {Etag} b second
14 */
15 constructor(a, b) {
16 this.a = a;
17 this.b = b;
18 }
19
20 toString() {
21 return `${this.a.toString()}|${this.b.toString()}`;
22 }
23}
24
25const dualObjectMap = new WeakMap();
26const objectStringMap = new WeakMap();
27
28/**
29 * @param {Etag} a first
30 * @param {Etag} b second
31 * @returns {Etag} result
32 */
33const mergeEtags = (a, b) => {
34 if (typeof a === "string") {
35 if (typeof b === "string") {
36 return `${a}|${b}`;
37 } else {
38 const temp = b;
39 b = a;
40 a = temp;
41 }
42 } else {
43 if (typeof b !== "string") {
44 // both a and b are objects
45 let map = dualObjectMap.get(a);
46 if (map === undefined) {
47 dualObjectMap.set(a, (map = new WeakMap()));
48 }
49 const mergedEtag = map.get(b);
50 if (mergedEtag === undefined) {
51 const newMergedEtag = new MergedEtag(a, b);
52 map.set(b, newMergedEtag);
53 return newMergedEtag;
54 } else {
55 return mergedEtag;
56 }
57 }
58 }
59 // a is object, b is string
60 let map = objectStringMap.get(a);
61 if (map === undefined) {
62 objectStringMap.set(a, (map = new Map()));
63 }
64 const mergedEtag = map.get(b);
65 if (mergedEtag === undefined) {
66 const newMergedEtag = new MergedEtag(a, b);
67 map.set(b, newMergedEtag);
68 return newMergedEtag;
69 } else {
70 return mergedEtag;
71 }
72};
73
74module.exports = mergeEtags;