Changeset View
Changeset View
Standalone View
Standalone View
web/database/worker/db-worker.js
// @flow | // @flow | ||||
import localforage from 'localforage'; | import localforage from 'localforage'; | ||||
import initSqlJs, { type SqliteDatabase } from 'sql.js'; | import initSqlJs, { type SqliteDatabase } from 'sql.js'; | ||||
import type { ClientDBReportStoreOperation } from 'lib/ops/report-store-ops.js'; | |||||
import type { | import type { | ||||
ClientDBDraftStoreOperation, | ClientDBDraftStoreOperation, | ||||
DraftStoreOperation, | DraftStoreOperation, | ||||
} from 'lib/types/draft-types.js'; | } from 'lib/types/draft-types.js'; | ||||
import type { ClientDBStore } from 'lib/types/store-ops-types.js'; | import type { ClientDBStore } from 'lib/types/store-ops-types.js'; | ||||
import { | import { | ||||
type SharedWorkerMessageEvent, | type SharedWorkerMessageEvent, | ||||
type WorkerRequestMessage, | type WorkerRequestMessage, | ||||
type WorkerResponseMessage, | type WorkerResponseMessage, | ||||
workerRequestMessageTypes, | workerRequestMessageTypes, | ||||
workerResponseMessageTypes, | workerResponseMessageTypes, | ||||
type WorkerRequestProxyMessage, | type WorkerRequestProxyMessage, | ||||
workerWriteRequests, | workerWriteRequests, | ||||
} from '../../types/worker-types.js'; | } from '../../types/worker-types.js'; | ||||
import { migrate, setupSQLiteDB } from '../queries/db-queries.js'; | import { migrate, setupSQLiteDB } from '../queries/db-queries.js'; | ||||
import { | import { | ||||
getAllDrafts, | getAllDrafts, | ||||
moveDraft, | moveDraft, | ||||
removeAllDrafts, | removeAllDrafts, | ||||
updateDraft, | updateDraft, | ||||
} from '../queries/draft-queries.js'; | } from '../queries/draft-queries.js'; | ||||
import { getMetadata, setMetadata } from '../queries/metadata-queries.js'; | import { getMetadata, setMetadata } from '../queries/metadata-queries.js'; | ||||
import { | import { | ||||
removeAllReports, | |||||
removeReports, | |||||
updateReport, | |||||
} from '../queries/report-queries.js'; | |||||
import { | |||||
getPersistStorageItem, | getPersistStorageItem, | ||||
removePersistStorageItem, | removePersistStorageItem, | ||||
setPersistStorageItem, | setPersistStorageItem, | ||||
} from '../queries/storage-engine-queries.js'; | } from '../queries/storage-engine-queries.js'; | ||||
import { | import { | ||||
CURRENT_USER_ID_KEY, | CURRENT_USER_ID_KEY, | ||||
SQLITE_CONTENT, | SQLITE_CONTENT, | ||||
SQLITE_ENCRYPTION_KEY, | SQLITE_ENCRYPTION_KEY, | ||||
▲ Show 20 Lines • Show All 77 Lines • ▼ Show 20 Lines | if (operation.type === 'remove_all') { | ||||
const { oldKey, newKey } = operation.payload; | const { oldKey, newKey } = operation.payload; | ||||
moveDraft(sqliteDb, oldKey, newKey); | moveDraft(sqliteDb, oldKey, newKey); | ||||
} else { | } else { | ||||
throw new Error('Unsupported draft operation'); | throw new Error('Unsupported draft operation'); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
function processReportStoreOperations( | |||||
operations: $ReadOnlyArray<ClientDBReportStoreOperation>, | |||||
) { | |||||
if (!sqliteDb) { | |||||
throw new Error('Database not initialized'); | |||||
} | |||||
for (const operation: ClientDBReportStoreOperation of operations) { | |||||
if (operation.type === 'remove_all_reports') { | |||||
removeAllReports(sqliteDb); | |||||
} else if (operation.type === 'remove_reports') { | |||||
const { ids } = operation.payload; | |||||
removeReports(sqliteDb, ids); | |||||
} else if (operation.type === 'replace_report') { | |||||
const { id, report } = operation.payload; | |||||
updateReport(sqliteDb, id, report); | |||||
} else { | |||||
throw new Error('Unsupported report operation'); | |||||
} | |||||
} | |||||
} | |||||
function getClientStore(): ClientDBStore { | function getClientStore(): ClientDBStore { | ||||
if (!sqliteDb) { | if (!sqliteDb) { | ||||
throw new Error('Database not initialized'); | throw new Error('Database not initialized'); | ||||
} | } | ||||
return { | return { | ||||
drafts: getAllDrafts(sqliteDb), | drafts: getAllDrafts(sqliteDb), | ||||
messages: [], | messages: [], | ||||
threads: [], | threads: [], | ||||
▲ Show 20 Lines • Show All 81 Lines • ▼ Show 20 Lines | ): Promise<?WorkerResponseMessage> { | ||||
} | } | ||||
// write operations | // write operations | ||||
if (!workerWriteRequests.includes(message.type)) { | if (!workerWriteRequests.includes(message.type)) { | ||||
throw new Error('Request type not supported'); | throw new Error('Request type not supported'); | ||||
} | } | ||||
if (message.type === workerRequestMessageTypes.PROCESS_STORE_OPERATIONS) { | if (message.type === workerRequestMessageTypes.PROCESS_STORE_OPERATIONS) { | ||||
const { draftStoreOperations } = message.storeOperations; | const { draftStoreOperations, reportStoreOperations } = | ||||
message.storeOperations; | |||||
if (draftStoreOperations) { | if (draftStoreOperations) { | ||||
processDraftStoreOperations(draftStoreOperations); | processDraftStoreOperations(draftStoreOperations); | ||||
} | } | ||||
if (reportStoreOperations) { | |||||
processReportStoreOperations(reportStoreOperations); | |||||
} | |||||
} else if (message.type === workerRequestMessageTypes.SET_CURRENT_USER_ID) { | } else if (message.type === workerRequestMessageTypes.SET_CURRENT_USER_ID) { | ||||
setMetadata(sqliteDb, CURRENT_USER_ID_KEY, message.userID); | setMetadata(sqliteDb, CURRENT_USER_ID_KEY, message.userID); | ||||
} else if ( | } else if ( | ||||
message.type === workerRequestMessageTypes.SET_PERSIST_STORAGE_ITEM | message.type === workerRequestMessageTypes.SET_PERSIST_STORAGE_ITEM | ||||
) { | ) { | ||||
setPersistStorageItem(sqliteDb, message.key, message.item); | setPersistStorageItem(sqliteDb, message.key, message.item); | ||||
} else if ( | } else if ( | ||||
message.type === workerRequestMessageTypes.REMOVE_PERSIST_STORAGE_ITEM | message.type === workerRequestMessageTypes.REMOVE_PERSIST_STORAGE_ITEM | ||||
▲ Show 20 Lines • Show All 45 Lines • Show Last 20 Lines |