Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/tasty-birds-lay.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@powersync/web': minor
---

Added `temporaryStorage` option to `WebSQLOpenFactoryOptions`. The `temp_store` value will now defaults to "MEMORY".
12 changes: 11 additions & 1 deletion packages/web/src/db/adapters/wa-sqlite/WASQLiteDBAdapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import Logger, { type ILogger } from 'js-logger';
import type { DBFunctionsInterface, OpenDB } from '../../../shared/types';
import { _openDB } from '../../../shared/open-db';
import { getWorkerDatabaseOpener, resolveWorkerDatabasePortFactory } from '../../../worker/db/open-worker-database';
import { ResolvedWebSQLOpenOptions, resolveWebSQLFlags, WebSQLFlags } from '../web-sql-flags';
import { ResolvedWebSQLOpenOptions, resolveWebSQLFlags, TemporaryStorageOption, WebSQLFlags } from '../web-sql-flags';
import { getNavigatorLocks } from '../../../shared/navigator';

/**
Expand All @@ -32,6 +32,8 @@ export interface WASQLiteDBAdapterOptions extends Omit<PowerSyncOpenFactoryOptio
workerPort?: MessagePort;

worker?: string | URL | ((options: ResolvedWebSQLOpenOptions) => Worker | SharedWorker);

temporaryStorage?: TemporaryStorageOption;
}

/**
Expand Down Expand Up @@ -86,6 +88,12 @@ export class WASQLiteDBAdapter extends BaseObserver<DBAdapterListener> implement
this.logger.warn('Multiple tabs are not enabled in this browser');
}

let tempStorePragma = 'PRAGMA temp_store = memory;';

if (this.options.temporaryStorage === TemporaryStorageOption.FILESYSTEM) {
tempStorePragma = 'PRAGMA temp_store = file;';
}

if (useWebWorker) {
const optionsDbWorker = this.options.worker;

Expand All @@ -103,6 +111,7 @@ export class WASQLiteDBAdapter extends BaseObserver<DBAdapterListener> implement
: getWorkerDatabaseOpener(this.options.dbFilename, enableMultiTabs, optionsDbWorker);

this.methods = await dbOpener(this.options.dbFilename);
await this.methods?.execute(tempStorePragma);
this.methods.registerOnTableChange(
Comlink.proxy((event) => {
this.iterateListeners((cb) => cb.tablesUpdated?.(event));
Expand All @@ -112,6 +121,7 @@ export class WASQLiteDBAdapter extends BaseObserver<DBAdapterListener> implement
return;
}
this.methods = await _openDB(this.options.dbFilename, { useWebWorker: false });
await this.methods?.execute(tempStorePragma);
this.methods.registerOnTableChange((event) => {
this.iterateListeners((cb) => cb.tablesUpdated?.(event));
});
Expand Down
10 changes: 10 additions & 0 deletions packages/web/src/db/adapters/web-sql-flags.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,11 @@ export interface ResolvedWebSQLOpenOptions extends SQLOpenOptions {
flags: ResolvedWebSQLFlags;
}

export enum TemporaryStorageOption {
MEMORY = 'MEMORY',
FILESYSTEM = 'FILESYSTEM'
}

/**
* Options for opening a Web SQL connection
*/
Expand All @@ -55,6 +60,11 @@ export interface WebSQLOpenFactoryOptions extends SQLOpenOptions {
* or a factory method that returns a worker.
*/
worker?: string | URL | ((options: ResolvedWebSQLOpenOptions) => Worker | SharedWorker);

/**
* Where to store SQLite temporary files. Defaults to 'MEMORY'.
*/
temporaryStorage?: TemporaryStorageOption;
}

export function isServerSide() {
Expand Down
Loading