kysely dialect for wa-sqlite, run sql in worker, store data in OPFS or IndexedDB
npm install kysely-wasqlite-workerkysely dialect for @subframe7536/sqlite-wasm (use custom wa-sqlite under the hood), execute sql in Web Worker, store data in OPFS or IndexedDB
No need to set response header like official wasm
``shell`
pnpm add kysely kysely-wasqlite-worker @subframe7536/sqlite-wasm
`ts
import { WaSqliteWorkerDialect } from 'kysely-wasqlite-worker'
const dialect = new WaSqliteWorkerDialect({
fileName: 'test',
})
`
in worker.ts
`ts
import { customFunctionCore, exportDatabase } from '@subframe7536/sqlite-wasm'
import { createOnMessageCallback, defaultCreateDatabaseFn } from 'kysely-wasqlite-worker'
createOnMessageCallback(
async (...args) => {
const sqliteDB = await defaultCreateDatabaseFn(...args)
customFunctionCore(sqliteDB, 'customFunction', (a, b) => a + b)
return sqliteDB
},
([type, exec, data1, data2, data3]) => {
if (type === 'export') {
return exportDatabase(exec.db)
}
}
)
`
`ts`
export interface WaSqliteWorkerDialectConfig {
/**
* db file name
*/
fileName: string
/**
* prefer to store data in OPFS
* @default true
*/
preferOPFS?: boolean
/**
* wasqlite worker
*
* built-in: {@link useDefaultWorker}
* @param supportModuleWorker if support { type: 'module' } in worker options
* @example
* import { useDefaultWorker } from 'kysely-wasqlite-worker'
* @example
* (support) => support
* ? new Worker(
* new URL('kysely-wasqlite-worker/worker-module', import.meta.url),
* { type: 'module', credentials: 'same-origin' }
* )
* : new Worker(
* new URL('kysely-wasqlite-worker/worker-classic', import.meta.url),
* { type: 'classic', name: 'test' }
* )
*/
worker?: Worker | ((supportModuleWorker: boolean) => Worker)
/**
* wasm URL
*
* built-in: {@link useDefaultWasmURL}
* @param useAsyncWasm if need to use wa-sqlite-async.wasm
* @example
* import { useDefaultWasmURL } from 'kysely-wasqlite-worker'
* @example
* (useAsync) => useAsync
* ? 'https://cdn.jsdelivr.net/gh/rhashimoto/wa-sqlite@v0.9.9/dist/wa-sqlite-async.wasm'
* : new URL('kysely-wasqlite-worker/wasm-sync', import.meta.url).href
*/
url?: string | ((useAsyncWasm: boolean) => string)
/**
* Handle custom messages for event emitter
* @param mitt event emitter
*/
message?: (mitt: IGenericEventEmitter) => Promisable
onCreateConnection?: (connection: DatabaseConnection) => Promisable
}
see more in playground
if throw error when using Vite to build, add worker config
`ts``
export default defineConfig({
// ...
worker: {
format: 'es',
},
})
- minimal IndexedDB backend browser version
- minimal OPFS backend browser version
- only worked in secure environment, like:
- localhost
- https