feat: 添加会话管理功能,优化已见代码的持久化和重置逻辑
This commit is contained in:
+46
-3
@@ -11,10 +11,22 @@ if (!isTopFrame) {
|
|||||||
} else {
|
} else {
|
||||||
|
|
||||||
let seenCodes = new Set();
|
let seenCodes = new Set();
|
||||||
|
let seenCodeSessionKey = '';
|
||||||
|
let seenCodesReadyPromise = null;
|
||||||
|
|
||||||
async function loadSeenCodes() {
|
async function loadSeenCodes() {
|
||||||
try {
|
try {
|
||||||
const data = await chrome.storage.session.get('seen2925Codes');
|
const data = await chrome.storage.session.get(['seen2925CodeState', 'seen2925Codes']);
|
||||||
|
const state = data?.seen2925CodeState || null;
|
||||||
|
if (state && typeof state === 'object') {
|
||||||
|
seenCodeSessionKey = String(state.sessionKey || '');
|
||||||
|
if (Array.isArray(state.codes)) {
|
||||||
|
seenCodes = new Set(state.codes);
|
||||||
|
}
|
||||||
|
console.log(MAIL2925_PREFIX, `Loaded ${seenCodes.size} seen codes for session ${seenCodeSessionKey || 'default'}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (data.seen2925Codes && Array.isArray(data.seen2925Codes)) {
|
if (data.seen2925Codes && Array.isArray(data.seen2925Codes)) {
|
||||||
seenCodes = new Set(data.seen2925Codes);
|
seenCodes = new Set(data.seen2925Codes);
|
||||||
console.log(MAIL2925_PREFIX, `Loaded ${seenCodes.size} previously seen codes`);
|
console.log(MAIL2925_PREFIX, `Loaded ${seenCodes.size} previously seen codes`);
|
||||||
@@ -24,16 +36,46 @@ async function loadSeenCodes() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
loadSeenCodes();
|
seenCodesReadyPromise = loadSeenCodes();
|
||||||
|
|
||||||
async function persistSeenCodes() {
|
async function persistSeenCodes() {
|
||||||
try {
|
try {
|
||||||
await chrome.storage.session.set({ seen2925Codes: [...seenCodes] });
|
await chrome.storage.session.set({
|
||||||
|
seen2925Codes: [...seenCodes],
|
||||||
|
seen2925CodeState: {
|
||||||
|
sessionKey: seenCodeSessionKey,
|
||||||
|
codes: [...seenCodes],
|
||||||
|
},
|
||||||
|
});
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.warn(MAIL2925_PREFIX, 'Could not persist seen codes, continuing in-memory only:', err?.message || err);
|
console.warn(MAIL2925_PREFIX, 'Could not persist seen codes, continuing in-memory only:', err?.message || err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function buildSeenCodeSessionKey(step, payload = {}) {
|
||||||
|
const timestamp = Number(payload?.filterAfterTimestamp);
|
||||||
|
if (Number.isFinite(timestamp) && timestamp > 0) {
|
||||||
|
return `${step}:${timestamp}`;
|
||||||
|
}
|
||||||
|
return `${step}:default`;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function ensureSeenCodesSession(step, payload = {}) {
|
||||||
|
if (seenCodesReadyPromise) {
|
||||||
|
await seenCodesReadyPromise;
|
||||||
|
seenCodesReadyPromise = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const nextSessionKey = buildSeenCodeSessionKey(step, payload);
|
||||||
|
if (seenCodeSessionKey === nextSessionKey) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
seenCodeSessionKey = nextSessionKey;
|
||||||
|
seenCodes = new Set();
|
||||||
|
await persistSeenCodes();
|
||||||
|
}
|
||||||
|
|
||||||
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
||||||
if (message.type === 'POLL_EMAIL') {
|
if (message.type === 'POLL_EMAIL') {
|
||||||
resetStopState();
|
resetStopState();
|
||||||
@@ -473,6 +515,7 @@ async function refreshInbox() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function handlePollEmail(step, payload) {
|
async function handlePollEmail(step, payload) {
|
||||||
|
await ensureSeenCodesSession(step, payload);
|
||||||
const {
|
const {
|
||||||
senderFilters,
|
senderFilters,
|
||||||
subjectFilters,
|
subjectFilters,
|
||||||
|
|||||||
@@ -116,6 +116,7 @@ async function openMailAndDeleteAfterRead(item) {
|
|||||||
return item.id === 'new' ? 'Your ChatGPT code is 654321' : 'No code here';
|
return item.id === 'new' ? 'Your ChatGPT code is 654321' : 'No code here';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function ensureSeenCodesSession() {}
|
||||||
function persistSeenCodes() {}
|
function persistSeenCodes() {}
|
||||||
function log() {}
|
function log() {}
|
||||||
|
|
||||||
@@ -199,6 +200,7 @@ async function openMailAndDeleteAfterRead(item) {
|
|||||||
return item.text;
|
return item.text;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function ensureSeenCodesSession() {}
|
||||||
function persistSeenCodes() {}
|
function persistSeenCodes() {}
|
||||||
function log() {}
|
function log() {}
|
||||||
|
|
||||||
@@ -224,6 +226,58 @@ return {
|
|||||||
assert.deepEqual(api.getReadAndDeleteCalls(), ['mail-1']);
|
assert.deepEqual(api.getReadAndDeleteCalls(), ['mail-1']);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('ensureSeenCodesSession resets tried codes only when a new verification step session starts', async () => {
|
||||||
|
const bundle = [
|
||||||
|
extractFunction('buildSeenCodeSessionKey'),
|
||||||
|
extractFunction('ensureSeenCodesSession'),
|
||||||
|
].join('\n');
|
||||||
|
|
||||||
|
const api = new Function(`
|
||||||
|
let seenCodes = new Set(['111111']);
|
||||||
|
let seenCodeSessionKey = '';
|
||||||
|
let seenCodesReadyPromise = Promise.resolve();
|
||||||
|
const persisted = [];
|
||||||
|
|
||||||
|
async function persistSeenCodes() {
|
||||||
|
persisted.push({
|
||||||
|
sessionKey: seenCodeSessionKey,
|
||||||
|
codes: [...seenCodes],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
${bundle}
|
||||||
|
|
||||||
|
return {
|
||||||
|
ensureSeenCodesSession,
|
||||||
|
getSeenCodes() {
|
||||||
|
return [...seenCodes];
|
||||||
|
},
|
||||||
|
getSessionKey() {
|
||||||
|
return seenCodeSessionKey;
|
||||||
|
},
|
||||||
|
getPersisted() {
|
||||||
|
return persisted.slice();
|
||||||
|
},
|
||||||
|
};
|
||||||
|
`)();
|
||||||
|
|
||||||
|
await api.ensureSeenCodesSession(4, { filterAfterTimestamp: 1000 });
|
||||||
|
assert.equal(api.getSessionKey(), '4:1000');
|
||||||
|
assert.deepEqual(api.getSeenCodes(), []);
|
||||||
|
|
||||||
|
await api.ensureSeenCodesSession(4, { filterAfterTimestamp: 1000 });
|
||||||
|
assert.deepEqual(api.getPersisted(), [
|
||||||
|
{ sessionKey: '4:1000', codes: [] },
|
||||||
|
]);
|
||||||
|
|
||||||
|
await api.ensureSeenCodesSession(8, { filterAfterTimestamp: 2000 });
|
||||||
|
assert.equal(api.getSessionKey(), '8:2000');
|
||||||
|
assert.deepEqual(api.getPersisted(), [
|
||||||
|
{ sessionKey: '4:1000', codes: [] },
|
||||||
|
{ sessionKey: '8:2000', codes: [] },
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
test('openMailAndGetMessageText always returns to inbox after opening a 2925 message', async () => {
|
test('openMailAndGetMessageText always returns to inbox after opening a 2925 message', async () => {
|
||||||
const bundle = [
|
const bundle = [
|
||||||
extractFunction('returnToInbox'),
|
extractFunction('returnToInbox'),
|
||||||
|
|||||||
Reference in New Issue
Block a user