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 { | |||||
ClientDBDraftStoreOperation, | |||||
DraftStoreOperation, | |||||
} from 'lib/types/draft-types.js'; | |||||
import { | import { | ||||
type SharedWorkerMessageEvent, | type SharedWorkerMessageEvent, | ||||
type WorkerRequestMessage, | type WorkerRequestMessage, | ||||
type WorkerResponseMessage, | type WorkerResponseMessage, | ||||
workerRequestMessageTypes, | workerRequestMessageTypes, | ||||
workerResponseMessageTypes, | workerResponseMessageTypes, | ||||
type WorkerRequestProxyMessage, | type WorkerRequestProxyMessage, | ||||
} from '../../types/worker-types.js'; | } from '../../types/worker-types.js'; | ||||
import { getSQLiteDBVersion, setupSQLiteDB } from '../queries/db-queries.js'; | import { getSQLiteDBVersion, setupSQLiteDB } from '../queries/db-queries.js'; | ||||
import { | |||||
moveDraft, | |||||
removeAllDrafts, | |||||
updateDraft, | |||||
} from '../queries/draft-queries.js'; | |||||
import { SQLITE_CONTENT, SQLITE_ENCRYPTION_KEY } from '../utils/constants.js'; | import { SQLITE_CONTENT, SQLITE_ENCRYPTION_KEY } from '../utils/constants.js'; | ||||
import { generateDatabaseCryptoKey } from '../utils/worker-crypto-utils.js'; | import { generateDatabaseCryptoKey } from '../utils/worker-crypto-utils.js'; | ||||
const localforageConfig: PartialConfig = { | const localforageConfig: PartialConfig = { | ||||
driver: localforage.INDEXEDDB, | driver: localforage.INDEXEDDB, | ||||
name: 'comm', | name: 'comm', | ||||
storeName: 'commStorage', | storeName: 'commStorage', | ||||
description: 'Comm encrypted database storage', | description: 'Comm encrypted database storage', | ||||
Show All 22 Lines | if (content) { | ||||
sqliteDb = new SQL.Database(); | sqliteDb = new SQL.Database(); | ||||
setupSQLiteDB(sqliteDb); | setupSQLiteDB(sqliteDb); | ||||
} | } | ||||
const dbVersion = getSQLiteDBVersion(sqliteDb); | const dbVersion = getSQLiteDBVersion(sqliteDb); | ||||
console.info(`Db version: ${dbVersion}`); | console.info(`Db version: ${dbVersion}`); | ||||
} | } | ||||
function processDraftStoreOperations( | |||||
operations: $ReadOnlyArray<ClientDBDraftStoreOperation>, | |||||
) { | |||||
if (!sqliteDb) { | |||||
throw new Error('Database not initialized'); | |||||
} | |||||
for (const operation: DraftStoreOperation of operations) { | |||||
if (operation.type === 'remove_all') { | |||||
removeAllDrafts(sqliteDb); | |||||
} else if (operation.type === 'update') { | |||||
const { key, text } = operation.payload; | |||||
updateDraft(sqliteDb, key, text); | |||||
} else if (operation.type === 'move') { | |||||
const { oldKey, newKey } = operation.payload; | |||||
moveDraft(sqliteDb, oldKey, newKey); | |||||
} else { | |||||
throw new Error('Unsupported draft operation'); | |||||
} | |||||
} | |||||
} | |||||
async function processAppRequest( | async function processAppRequest( | ||||
message: WorkerRequestMessage, | message: WorkerRequestMessage, | ||||
): Promise<?WorkerResponseMessage> { | ): Promise<?WorkerResponseMessage> { | ||||
if (message.type === workerRequestMessageTypes.PING) { | if (message.type === workerRequestMessageTypes.PING) { | ||||
return { | return { | ||||
type: workerResponseMessageTypes.PONG, | type: workerResponseMessageTypes.PONG, | ||||
text: 'PONG', | text: 'PONG', | ||||
}; | }; | ||||
} else if (message.type === workerRequestMessageTypes.INIT) { | } else if (message.type === workerRequestMessageTypes.INIT) { | ||||
await initDatabase(message.sqljsFilePath, message.sqljsFilename); | await initDatabase(message.sqljsFilePath, message.sqljsFilename); | ||||
return; | return; | ||||
} else if ( | } else if ( | ||||
message.type === workerRequestMessageTypes.GENERATE_DATABASE_ENCRYPTION_KEY | message.type === workerRequestMessageTypes.GENERATE_DATABASE_ENCRYPTION_KEY | ||||
) { | ) { | ||||
const cryptoKey = await generateDatabaseCryptoKey(); | const cryptoKey = await generateDatabaseCryptoKey(); | ||||
await localforage.setItem(SQLITE_ENCRYPTION_KEY, cryptoKey); | await localforage.setItem(SQLITE_ENCRYPTION_KEY, cryptoKey); | ||||
return; | return; | ||||
} else if ( | |||||
message.type === workerRequestMessageTypes.PROCESS_STORE_OPERATIONS | |||||
) { | |||||
const { draftStoreOperations } = message.storeOperations; | |||||
if (draftStoreOperations) { | |||||
processDraftStoreOperations(draftStoreOperations); | |||||
} | |||||
return; | |||||
} | } | ||||
throw new Error('Request type not supported'); | throw new Error('Request type not supported'); | ||||
} | } | ||||
function connectHandler(event: SharedWorkerMessageEvent) { | function connectHandler(event: SharedWorkerMessageEvent) { | ||||
if (!event.ports.length) { | if (!event.ports.length) { | ||||
return; | return; | ||||
Show All 30 Lines |