perf: move PouchDB/IndexedDB operations to a Web Worker
All database reads and writes now run off the main thread via a dedicated worker, eliminating IndexedDB overhead from the frame budget. - Create data.worker.ts exposing the Data class via Comlink - Refactor data.ts to export a Comlink-wrapped proxy and a standalone generateId() pure function (workers can't expose sync methods cleanly) - Update all 10 call sites to import generateId directly instead of calling data.generateId() Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -4,7 +4,7 @@ import { useAsyncState } from "@vueuse/core"
|
||||
import { addDays, isAfter } from "date-fns"
|
||||
import { computed, nextTick, watch } from "vue"
|
||||
|
||||
import { data } from "@/data/data"
|
||||
import { data, generateId } from "@/data/data"
|
||||
import { DataType } from "@/data/DataType.enum"
|
||||
import { useFile } from "@/hooks/useFile.hook"
|
||||
import { useLinks } from "@/hooks/useLinks.hook"
|
||||
@@ -51,7 +51,7 @@ export const useSpacedRepetitionCards = () => {
|
||||
const repetition = await data.getOrCreate<
|
||||
DataType.RepetitionCard,
|
||||
RepetitionCard
|
||||
>(data.generateId(DataType.RepetitionCard, cardFile.path), {
|
||||
>(generateId(DataType.RepetitionCard, cardFile.path), {
|
||||
$type: DataType.RepetitionCard,
|
||||
level: 1,
|
||||
repeatDate: new Date(),
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
import { useAsyncState } from "@vueuse/core"
|
||||
import { computed } from "vue"
|
||||
|
||||
import { data } from "@/data/data"
|
||||
import { data, generateId } from "@/data/data"
|
||||
import { DataType } from "@/data/DataType.enum"
|
||||
import { History } from "@/data/models/History"
|
||||
|
||||
const HISTORY_ID = data.generateId(DataType.History, "history")
|
||||
const HISTORY_ID = generateId(DataType.History, "history")
|
||||
|
||||
export const useLastVisitedRepos = () => {
|
||||
const history = useAsyncState(
|
||||
() =>
|
||||
data.get<DataType.History, History>(
|
||||
data.generateId(DataType.History, "history")
|
||||
generateId(DataType.History, "history")
|
||||
),
|
||||
null
|
||||
)
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import { Ref, toValue } from "vue"
|
||||
|
||||
import { data } from "@/data/data"
|
||||
import { data, generateId } from "@/data/data"
|
||||
import { DataType } from "@/data/DataType.enum"
|
||||
import { History } from "@/data/models/History"
|
||||
|
||||
const HISTORY_ID = data.generateId(DataType.History, "history")
|
||||
const HISTORY_ID = generateId(DataType.History, "history")
|
||||
const MAX_REPO_HISTORY = 10
|
||||
|
||||
export const useVisitRepo = (newRepo: {
|
||||
|
||||
6
src/modules/note/cache/prepareNoteCache.ts
vendored
6
src/modules/note/cache/prepareNoteCache.ts
vendored
@@ -1,4 +1,4 @@
|
||||
import { data } from "@/data/data"
|
||||
import { data, generateId } from "@/data/data"
|
||||
import { DataType } from "@/data/DataType.enum"
|
||||
import { Note } from "@/modules/note/models/Note"
|
||||
import { useUserRepoStore } from "@/modules/repo/store/userRepo.store"
|
||||
@@ -14,8 +14,8 @@ type NoteCacheResult =
|
||||
export const prepareNoteCache = (sha: string, path?: string) => {
|
||||
const store = useUserRepoStore()
|
||||
|
||||
const noteId = data.generateId(DataType.Note, sha)
|
||||
const notePath = path ? data.generateId(DataType.Note, path) : null
|
||||
const noteId = generateId(DataType.Note, sha)
|
||||
const notePath = path ? generateId(DataType.Note, path) : null
|
||||
const getCachedNote = async (): Promise<NoteCacheResult> => {
|
||||
const note = await data.get<DataType.Note, Note>(noteId)
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { computed, onMounted, ref } from "vue"
|
||||
|
||||
import { data } from "@/data/data"
|
||||
import { data, generateId } from "@/data/data"
|
||||
import { DataType } from "@/data/DataType.enum"
|
||||
import { useRepos } from "@/hooks/useRepos.hook"
|
||||
import { RepoBase } from "@/modules/repo/interfaces/RepoBase"
|
||||
@@ -27,7 +27,7 @@ export const useFavoriteRepos = () => {
|
||||
|
||||
const toggleFavorite = async (repo: RepoBase, isFavorite: boolean) => {
|
||||
const favorite: FavoriteRepo = {
|
||||
_id: data.generateId(DataType.FavoriteRepo, repo.id),
|
||||
_id: generateId(DataType.FavoriteRepo, repo.id),
|
||||
$type: DataType.FavoriteRepo,
|
||||
isFavorite,
|
||||
name: repo.name,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { defineStore } from "pinia"
|
||||
|
||||
import { data } from "@/data/data"
|
||||
import { data, generateId } from "@/data/data"
|
||||
import { DataType } from "@/data/DataType.enum"
|
||||
import { RepoFile } from "@/modules/repo/interfaces/RepoFile"
|
||||
import { UserSettings } from "@/modules/repo/interfaces/UserSettings"
|
||||
@@ -39,7 +39,7 @@ export const useUserRepoStore = defineStore("USER_REPO_STATE", {
|
||||
this.user = user
|
||||
this.repo = repo
|
||||
|
||||
const savedRepoId = data.generateId(DataType.SavedRepo, `${user}-${repo}`)
|
||||
const savedRepoId = generateId(DataType.SavedRepo, `${user}-${repo}`)
|
||||
const userSettingsId = `UserSetting-${user}-${repo}`
|
||||
|
||||
const [cachedSavedRepo, cachedUserSettings] = await Promise.all([
|
||||
@@ -131,7 +131,7 @@ export const useUserRepoStore = defineStore("USER_REPO_STATE", {
|
||||
return
|
||||
}
|
||||
|
||||
const savedRepoId = data.generateId(
|
||||
const savedRepoId = generateId(
|
||||
DataType.SavedRepo,
|
||||
`${this.user}-${this.repo}`
|
||||
)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { Octokit } from "@octokit/rest"
|
||||
import { addMinutes, addSeconds, isBefore } from "date-fns"
|
||||
|
||||
import { data } from "@/data/data"
|
||||
import { data, generateId } from "@/data/data"
|
||||
import { DataType } from "@/data/DataType.enum"
|
||||
import { GithubAccessToken } from "@/data/models/GithubAccessToken"
|
||||
import { GithubToken } from "@/modules/user/interfaces/GithubToken"
|
||||
@@ -26,7 +26,7 @@ export const needToRefreshToken = async () => {
|
||||
const accessToken = await data.get<
|
||||
DataType.GithubAccessToken,
|
||||
GithubAccessToken
|
||||
>(data.generateId(DataType.GithubAccessToken, personalTokenId))
|
||||
>(generateId(DataType.GithubAccessToken, personalTokenId))
|
||||
|
||||
if (!accessToken) {
|
||||
return false
|
||||
@@ -42,7 +42,7 @@ export const refreshToken = async () => {
|
||||
const accessToken = await data.get<
|
||||
DataType.GithubAccessToken,
|
||||
GithubAccessToken
|
||||
>(data.generateId(DataType.GithubAccessToken, personalTokenId))
|
||||
>(generateId(DataType.GithubAccessToken, personalTokenId))
|
||||
|
||||
if (!accessToken) {
|
||||
return null
|
||||
@@ -74,7 +74,7 @@ export const getAccessToken = async () => {
|
||||
const response = await data.get<
|
||||
DataType.GithubAccessToken,
|
||||
GithubAccessToken
|
||||
>(data.generateId(DataType.GithubAccessToken, personalTokenId))
|
||||
>(generateId(DataType.GithubAccessToken, personalTokenId))
|
||||
|
||||
return response
|
||||
}
|
||||
@@ -94,7 +94,7 @@ export const saveAccessToken = async (githubToken: GithubToken) => {
|
||||
|
||||
const accessToken: GithubAccessToken = {
|
||||
...actualPAT,
|
||||
_id: data.generateId(DataType.GithubAccessToken, personalTokenId),
|
||||
_id: generateId(DataType.GithubAccessToken, personalTokenId),
|
||||
$type: DataType.GithubAccessToken,
|
||||
token: githubToken.access_token,
|
||||
expiresIn: githubToken.expires_in,
|
||||
|
||||
Reference in New Issue
Block a user