91 lines
1.6 KiB
JavaScript
91 lines
1.6 KiB
JavaScript
|
const ITEM_LIMIT = 5;
|
||
|
|
||
|
class Storage {
|
||
|
#items;
|
||
|
|
||
|
constructor() {
|
||
|
this.#items = new Map();
|
||
|
}
|
||
|
|
||
|
get length() {
|
||
|
return this.#items.size;
|
||
|
}
|
||
|
|
||
|
key(index) {
|
||
|
let i = 0;
|
||
|
for (const k of this.#items.keys()) {
|
||
|
if (i === index) {
|
||
|
return k;
|
||
|
}
|
||
|
|
||
|
++i;
|
||
|
}
|
||
|
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
getItem(k) {
|
||
|
return this.#items.get(k) || null;
|
||
|
}
|
||
|
|
||
|
setItem(k, v) {
|
||
|
if (this.#items.size === ITEM_LIMIT) {
|
||
|
throw new Error("Full!");
|
||
|
}
|
||
|
|
||
|
this.#items.set(k, v);
|
||
|
}
|
||
|
|
||
|
removeItem(k) {
|
||
|
this.#items.delete(k);
|
||
|
}
|
||
|
|
||
|
clear() {
|
||
|
this.#items.clear();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function getter(type) {
|
||
|
return new Storage();
|
||
|
}
|
||
|
|
||
|
export function runWithMockStorage(callback) {
|
||
|
const oldStorage = globalThis.Storage;
|
||
|
const oldLocal = globalThis.localStorage;
|
||
|
const oldSession = globalThis.sessionStorage;
|
||
|
|
||
|
Object.defineProperty(globalThis, "Storage", {
|
||
|
value: Storage,
|
||
|
configurable: true,
|
||
|
});
|
||
|
Object.defineProperty(globalThis, "localStorage", {
|
||
|
get() {
|
||
|
return getter("localStorage");
|
||
|
},
|
||
|
configurable: true,
|
||
|
});
|
||
|
Object.defineProperty(globalThis, "sessionStorage", {
|
||
|
get() {
|
||
|
return getter("sessionStorage");
|
||
|
},
|
||
|
configurable: true,
|
||
|
});
|
||
|
|
||
|
try {
|
||
|
callback();
|
||
|
} finally {
|
||
|
Object.defineProperty(globalThis, "Storage", {
|
||
|
value: oldStorage,
|
||
|
configurable: true,
|
||
|
});
|
||
|
Object.defineProperty(globalThis, "localStorage", {
|
||
|
value: oldLocal,
|
||
|
configurable: true,
|
||
|
});
|
||
|
Object.defineProperty(globalThis, "sessionStorage", {
|
||
|
value: oldSession,
|
||
|
configurable: true,
|
||
|
});
|
||
|
}
|
||
|
}
|