perf(web-db): stop re-encrypting records on read
This commit is contained in:
@@ -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))
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user