Changeset View
Changeset View
Standalone View
Standalone View
web/database/worker/db-worker.js
Show First 20 Lines • Show All 101 Lines • ▼ Show 20 Lines | return { | ||||
messages: [], | messages: [], | ||||
threads: [], | threads: [], | ||||
}; | }; | ||||
} | } | ||||
async function processAppRequest( | async function processAppRequest( | ||||
message: WorkerRequestMessage, | message: WorkerRequestMessage, | ||||
): Promise<?WorkerResponseMessage> { | ): Promise<?WorkerResponseMessage> { | ||||
// non-database operations | |||||
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) { | |||||
await initDatabase(message.sqljsFilePath, message.sqljsFilename); | |||||
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); | |||||
} | } | ||||
// database operations | |||||
if (message.type === workerRequestMessageTypes.INIT) { | |||||
await initDatabase(message.sqljsFilePath, message.sqljsFilename); | |||||
return; | return; | ||||
} else if (message.type === workerRequestMessageTypes.GET_CLIENT_STORE) { | } | ||||
if (!sqliteDb) { | |||||
throw new Error('Database not initialized'); | |||||
} | |||||
// read-only operations | |||||
if (message.type === workerRequestMessageTypes.GET_CLIENT_STORE) { | |||||
return { | return { | ||||
type: workerResponseMessageTypes.CLIENT_STORE, | type: workerResponseMessageTypes.CLIENT_STORE, | ||||
store: getClientStore(), | store: getClientStore(), | ||||
}; | }; | ||||
} else if (message.type === workerRequestMessageTypes.SET_CURRENT_USER_ID) { | |||||
if (!sqliteDb) { | |||||
throw new Error('Database not initialized'); | |||||
} | |||||
setMetadata(sqliteDb, CURRENT_USER_ID_KEY, message.userID); | |||||
return; | |||||
} else if (message.type === workerRequestMessageTypes.GET_CURRENT_USER_ID) { | } else if (message.type === workerRequestMessageTypes.GET_CURRENT_USER_ID) { | ||||
if (!sqliteDb) { | |||||
throw new Error('Database not initialized'); | |||||
} | |||||
const userID = getMetadata(sqliteDb, CURRENT_USER_ID_KEY); | |||||
return { | return { | ||||
type: workerResponseMessageTypes.GET_CURRENT_USER_ID, | type: workerResponseMessageTypes.GET_CURRENT_USER_ID, | ||||
userID, | userID: getMetadata(sqliteDb, CURRENT_USER_ID_KEY), | ||||
}; | }; | ||||
} else if ( | } else if ( | ||||
message.type === workerRequestMessageTypes.GET_PERSIST_STORAGE_ITEM | message.type === workerRequestMessageTypes.GET_PERSIST_STORAGE_ITEM | ||||
) { | ) { | ||||
if (!sqliteDb) { | |||||
throw new Error('Database not initialized'); | |||||
} | |||||
return { | return { | ||||
type: workerResponseMessageTypes.GET_PERSIST_STORAGE_ITEM, | type: workerResponseMessageTypes.GET_PERSIST_STORAGE_ITEM, | ||||
item: getPersistStorageItem(sqliteDb, message.key), | item: getPersistStorageItem(sqliteDb, message.key), | ||||
}; | }; | ||||
} | |||||
// write operations | |||||
if (message.type === workerRequestMessageTypes.PROCESS_STORE_OPERATIONS) { | |||||
const { draftStoreOperations } = message.storeOperations; | |||||
if (draftStoreOperations) { | |||||
processDraftStoreOperations(draftStoreOperations); | |||||
} | |||||
return; | |||||
} else if (message.type === workerRequestMessageTypes.SET_CURRENT_USER_ID) { | |||||
setMetadata(sqliteDb, CURRENT_USER_ID_KEY, message.userID); | |||||
return; | |||||
} else if ( | } else if ( | ||||
message.type === workerRequestMessageTypes.SET_PERSIST_STORAGE_ITEM | message.type === workerRequestMessageTypes.SET_PERSIST_STORAGE_ITEM | ||||
) { | ) { | ||||
if (!sqliteDb) { | |||||
throw new Error('Database not initialized'); | |||||
} | |||||
setPersistStorageItem(sqliteDb, message.key, message.item); | setPersistStorageItem(sqliteDb, message.key, message.item); | ||||
return; | return; | ||||
} else if ( | } else if ( | ||||
message.type === workerRequestMessageTypes.REMOVE_PERSIST_STORAGE_ITEM | message.type === workerRequestMessageTypes.REMOVE_PERSIST_STORAGE_ITEM | ||||
) { | ) { | ||||
if (!sqliteDb) { | |||||
throw new Error('Database not initialized'); | |||||
} | |||||
removePersistStorageItem(sqliteDb, message.key); | removePersistStorageItem(sqliteDb, message.key); | ||||
return; | return; | ||||
} | } | ||||
throw new Error('Request type not supported'); | throw new Error('Request type not supported'); | ||||
} | } | ||||
function connectHandler(event: SharedWorkerMessageEvent) { | function connectHandler(event: SharedWorkerMessageEvent) { | ||||
Show All 32 Lines |