Skip to content

Commit 2f56765

Browse files
committed
feat: optimize fake session storage
1 parent 53d5135 commit 2f56765

File tree

2 files changed

+55
-24
lines changed

2 files changed

+55
-24
lines changed

scripts/release.mjs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -174,14 +174,8 @@ async function main() {
174174
await axios.patch(
175175
`${gitHubBaseURL}/releases/${releaseId}`,
176176
{
177-
owner: gitName[0],
178-
repo: gitName[1],
179-
release_id: tagName,
180177
tag_name: tagName,
181178
name: version,
182-
body: assets
183-
.map(item => `> ${item.name} SHA256: ${item.hash} \n`)
184-
.join('\n'),
185179
draft: false,
186180
prerelease: false,
187181
},

src/share/core/storage.ts

Lines changed: 55 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -22,42 +22,79 @@ export function getLocal() {
2222
return browser.storage.local;
2323
}
2424

25-
export function getSession() {
26-
if ('session' in browser.storage) {
27-
return browser.storage.session;
28-
}
29-
25+
function createFakeSession() {
3026
const mapKey = (key: string) => `sess_${key}`;
3127

32-
const session = new Proxy(getLocal(), {
28+
const local = getLocal();
29+
30+
const fakeSessionOnChange = new Map<CallableFunction, any>();
31+
32+
const mapKeys = (keys: string | string[]) =>
33+
Array.isArray(keys) ? keys.map(mapKey) : mapKey(keys);
34+
35+
const onChange = {
36+
addListener(callback: CallableFunction) {
37+
const wrappedCallback = (changes: Record<string, any>) => {
38+
const newChanges = Object.fromEntries(
39+
Object.entries(changes)
40+
.filter(([key]) => key.startsWith('sess_'))
41+
.map(([key, value]) => [key.replace(/^sess_/, ''), value]),
42+
);
43+
if (Object.keys(newChanges).length > 0) {
44+
callback(newChanges);
45+
}
46+
};
47+
fakeSessionOnChange.set(callback, wrappedCallback);
48+
local.onChanged.addListener(wrappedCallback);
49+
},
50+
removeEventListener(callback: CallableFunction) {
51+
const wrappedCallback = fakeSessionOnChange.get(callback);
52+
if (wrappedCallback) {
53+
local.onChanged.removeListener(wrappedCallback);
54+
fakeSessionOnChange.delete(callback);
55+
}
56+
},
57+
hasEventListener(callback: CallableFunction) {
58+
return fakeSessionOnChange.has(callback);
59+
},
60+
};
61+
62+
const session = new Proxy(local, {
3363
get(target, prop) {
3464
if (prop === 'set') {
3565
return (items: Record<string, any>) => {
3666
target.set(
3767
Object.fromEntries(
38-
Object.entries(items).map(([key, value]) => [
39-
mapKey(key),
40-
{ value },
41-
]),
68+
Object.entries(items).map(([key, value]) => [mapKey(key), value]),
4269
),
4370
);
4471
};
4572
}
4673
if (prop === 'get') {
47-
return (keys: string | string[]) => {
48-
return target.get(
49-
Array.isArray(keys) ? keys.map(mapKey) : mapKey(keys),
50-
);
51-
};
74+
return (keys: string | string[]) => target.get(mapKeys(keys));
5275
}
5376
if (prop === 'remove') {
54-
return (keys: string | string[]) => {
55-
target.remove(Array.isArray(keys) ? keys.map(mapKey) : mapKey(keys));
56-
};
77+
return (keys: string | string[]) => target.remove(mapKeys(keys));
78+
}
79+
if (prop === 'onChanged') {
80+
return onChange;
5781
}
5882
return Reflect.get(target, prop);
5983
},
6084
});
6185

6286
return session;
6387
}
88+
89+
let fakeSessionStorage: ReturnType<typeof createFakeSession> | undefined;
90+
export function getSession() {
91+
if ('session' in browser.storage) {
92+
return browser.storage.session;
93+
}
94+
95+
if (!fakeSessionStorage) {
96+
fakeSessionStorage = createFakeSession();
97+
}
98+
99+
return fakeSessionStorage;
100+
}

0 commit comments

Comments
 (0)