perf(web-db): stop re-encrypting records on read

This commit is contained in:
2026-04-08 00:17:40 +08:00
parent e5948cd346
commit 7a7624866f
4 changed files with 4 additions and 55 deletions
+1 -12
View File
@@ -2,8 +2,7 @@ import { localDb, type LocalAiChatSessionRecord } from "@/services/local-db";
import type { WebAiChannel } from "@/services/ai-api"; import type { WebAiChannel } from "@/services/ai-api";
import { import {
decryptAiChatSessionRecord, decryptAiChatSessionRecord,
encryptAiChatSessionRecord, encryptAiChatSessionRecord
shouldEncryptAiChatSessionRecord
} from "@/services/local-sensitive-codec"; } from "@/services/local-sensitive-codec";
export type LocalAiChatMessageRecord = { export type LocalAiChatMessageRecord = {
@@ -69,16 +68,6 @@ export async function listLocalAiChatSessions(
userId: string userId: string
): Promise<LocalAiChatSessionSnapshot[]> { ): Promise<LocalAiChatSessionSnapshot[]> {
const records = await localDb.aiChatSessions.where("userId").equals(userId).toArray(); const records = await localDb.aiChatSessions.where("userId").equals(userId).toArray();
const encryptedRecords = await Promise.all(
records
.filter(shouldEncryptAiChatSessionRecord)
.map((record) => encryptAiChatSessionRecord(record))
);
if (encryptedRecords.length > 0) {
await localDb.aiChatSessions.bulkPut(encryptedRecords);
}
const decryptedRecords = await Promise.all( const decryptedRecords = await Promise.all(
records.map((record) => decryptAiChatSessionRecord(record)) records.map((record) => decryptAiChatSessionRecord(record))
); );
+1 -20
View File
@@ -7,10 +7,7 @@
import { import {
decryptOpLogRecord, decryptOpLogRecord,
decryptSyncInboxRecord, decryptSyncInboxRecord,
encryptOpLogRecord, encryptSyncInboxRecord
encryptSyncInboxRecord,
shouldEncryptOpLogRecord,
shouldEncryptSyncInboxRecord
} from "@/services/local-sensitive-codec"; } from "@/services/local-sensitive-codec";
import type { SyncPullItem } from "@/services/sync-api"; import type { SyncPullItem } from "@/services/sync-api";
@@ -18,14 +15,6 @@ export const MAX_SYNC_RETRY_COUNT = 5;
export async function listPendingSyncOperations(limit = 20): Promise<LocalOpLogRecord[]> { export async function listPendingSyncOperations(limit = 20): Promise<LocalOpLogRecord[]> {
const records = await localDb.opLogs.orderBy("clientTs").toArray(); const records = await localDb.opLogs.orderBy("clientTs").toArray();
const encryptedRecords = await Promise.all(
records.filter(shouldEncryptOpLogRecord).map((record) => encryptOpLogRecord(record))
);
if (encryptedRecords.length > 0) {
await localDb.opLogs.bulkPut(encryptedRecords);
}
const pendingRecords = records const pendingRecords = records
.filter((record) => record.syncedAt === null && record.retryCount < MAX_SYNC_RETRY_COUNT) .filter((record) => record.syncedAt === null && record.retryCount < MAX_SYNC_RETRY_COUNT)
.slice(0, limit); .slice(0, limit);
@@ -144,14 +133,6 @@ export async function listPendingRemoteOperations(
limit = 100 limit = 100
): Promise<LocalSyncInboxRecord[]> { ): Promise<LocalSyncInboxRecord[]> {
const records = await localDb.syncInbox.where("userId").equals(userId).toArray(); const records = await localDb.syncInbox.where("userId").equals(userId).toArray();
const encryptedRecords = await Promise.all(
records.filter(shouldEncryptSyncInboxRecord).map((record) => encryptSyncInboxRecord(record))
);
if (encryptedRecords.length > 0) {
await localDb.syncInbox.bulkPut(encryptedRecords);
}
const pendingRecords = records const pendingRecords = records
.filter((record) => record.appliedAt === null) .filter((record) => record.appliedAt === null)
.sort((left, right) => { .sort((left, right) => {
@@ -1,9 +1,5 @@
import { localDb, type LocalTaskDraftRecord } from "@/services/local-db"; import { localDb, type LocalTaskDraftRecord } from "@/services/local-db";
import { import { decryptTaskDraftRecord, encryptTaskDraftRecord } from "@/services/local-sensitive-codec";
decryptTaskDraftRecord,
encryptTaskDraftRecord,
shouldEncryptTaskDraft
} from "@/services/local-sensitive-codec";
export type SaveLocalTaskDraftInput = { export type SaveLocalTaskDraftInput = {
taskId: string; taskId: string;
@@ -22,10 +18,6 @@ export async function getLocalTaskDraft(taskId: string): Promise<LocalTaskDraftR
return undefined; return undefined;
} }
if (shouldEncryptTaskDraft(draft)) {
await localDb.taskDrafts.put(await encryptTaskDraftRecord(draft));
}
return decryptTaskDraftRecord(draft); return decryptTaskDraftRecord(draft);
} }
+1 -14
View File
@@ -9,8 +9,7 @@
import { import {
decryptTaskRecord, decryptTaskRecord,
encryptOpLogRecord, encryptOpLogRecord,
encryptTaskRecord, encryptTaskRecord
shouldEncryptTaskRecord
} from "@/services/local-sensitive-codec"; } from "@/services/local-sensitive-codec";
const DEVICE_ID_STORAGE_KEY = "todolist.web.device-id"; const DEVICE_ID_STORAGE_KEY = "todolist.web.device-id";
@@ -89,14 +88,6 @@ function createSyncTaskPayload(payload: SyncTaskPayload): string {
export async function listLocalTasksByUser(userId: string): Promise<LocalTaskRecord[]> { export async function listLocalTasksByUser(userId: string): Promise<LocalTaskRecord[]> {
const tasks = await localDb.tasks.where("userId").equals(userId).toArray(); const tasks = await localDb.tasks.where("userId").equals(userId).toArray();
const encryptedTasks = await Promise.all(
tasks.filter(shouldEncryptTaskRecord).map((task) => encryptTaskRecord(task))
);
if (encryptedTasks.length > 0) {
await localDb.tasks.bulkPut(encryptedTasks);
}
const decryptedTasks = await Promise.all(tasks.map((task) => decryptTaskRecord(task))); const decryptedTasks = await Promise.all(tasks.map((task) => decryptTaskRecord(task)));
return decryptedTasks return decryptedTasks
.filter((task) => task.deletedAt === null) .filter((task) => task.deletedAt === null)
@@ -109,10 +100,6 @@ export async function getLocalTaskById(id: string): Promise<LocalTaskRecord | un
return undefined; return undefined;
} }
if (shouldEncryptTaskRecord(task)) {
await localDb.tasks.put(await encryptTaskRecord(task));
}
return decryptTaskRecord(task); return decryptTaskRecord(task);
} }