Skip to content

Commit 2ae92ba

Browse files
share worker for OPFS
1 parent e06f3a9 commit 2ae92ba

File tree

6 files changed

+24
-9
lines changed

6 files changed

+24
-9
lines changed

packages/web/src/db/adapters/WorkerDBAdapter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ export interface WorkerDBAdapter extends DBAdapter {
44
/**
55
* Get a MessagePort which can be used to share the internals of this connection.
66
*/
7-
getMessagePort(): MessagePort | Worker;
7+
getMessagePort(): Promise<MessagePort>;
88
}

packages/web/src/db/adapters/WorkerLockedAsyncDatabaseAdapter.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import * as Comlink from 'comlink';
12
import { LockedAsyncDatabaseAdapter, LockedAsyncDatabaseAdapterOptions } from './LockedAsyncDatabaseAdapter';
23
import { ProxiedAsyncDatabaseConnection } from './ProxiedAsyncDatabaseConnection';
34
import { WorkerDBAdapter } from './WorkerDBAdapter';
@@ -25,7 +26,16 @@ export class WorkerLockedAsyncDatabaseAdapter extends LockedAsyncDatabaseAdapter
2526
this._messagePort = options.messagePort;
2627
}
2728

28-
getMessagePort(): MessagePort | Worker {
29+
async getMessagePort(): Promise<MessagePort> {
30+
if (this._messagePort instanceof Worker) {
31+
// We can't transfer a Worker instance, need a MessagePort
32+
// Comlink provides a nice utility for exposing a MessagePort
33+
// from a Worker
34+
const temp = Comlink.wrap(this._messagePort);
35+
const newPort = await temp[Comlink.createEndpoint]();
36+
return newPort;
37+
}
38+
2939
return this._messagePort;
3040
}
3141
}

packages/web/src/db/sync/SharedWebStreamingSyncImplementation.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,14 @@ class SharedSyncClientProvider extends AbstractSharedSyncClientProvider {
2121
constructor(
2222
protected options: WebStreamingSyncImplementationOptions,
2323
public statusChanged: (status: SyncStatusOptions) => void,
24-
protected dbWorkerPort: MessagePort | Worker
24+
protected dbWorkerPort: Promise<MessagePort>
2525
) {
2626
super();
2727
}
2828

29-
async getDBWorkerPort(): Promise<MessagePort | Worker> {
29+
async getDBWorkerPort(): Promise<MessagePort> {
3030
// FIXME type error
31-
const port = this.dbWorkerPort as MessagePort;
31+
const port = (await this.dbWorkerPort) as MessagePort;
3232

3333
// TODO this can only be done once. Throw an error if multiple attempts are made
3434
return Comlink.transfer(port, [port]);

packages/web/src/worker/sync/AbstractSharedSyncClientProvider.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export abstract class AbstractSharedSyncClientProvider {
77
abstract fetchCredentials(): Promise<PowerSyncCredentials | null>;
88
abstract uploadCrud(): Promise<void>;
99
abstract statusChanged(status: SyncStatusOptions): void;
10-
abstract getDBWorkerPort(): Promise<MessagePort | Worker>;
10+
abstract getDBWorkerPort(): Promise<MessagePort>;
1111

1212
abstract trace(...x: any[]): void;
1313
abstract debug(...x: any[]): void;

packages/web/src/worker/sync/SharedSyncImplementation.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,6 @@ export class SharedSyncImplementation
279279
// Ask for a new DB worker port handler
280280
const lastClient = this.ports[this.ports.length - 1];
281281
const workerPort = await lastClient.clientProvider.getDBWorkerPort();
282-
283282
const locked = new LockedAsyncDatabaseAdapter({
284283
name: this.syncParams?.dbName!,
285284
openConnection: async () => {

packages/web/vitest.config.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
1-
import wasm from 'vite-plugin-wasm';
2-
import topLevelAwait from 'vite-plugin-top-level-await';
31
import path from 'path';
2+
import topLevelAwait from 'vite-plugin-top-level-await';
3+
import wasm from 'vite-plugin-wasm';
44
import { defineConfig, UserConfigExport } from 'vitest/config';
55

66
const config: UserConfigExport = {
7+
server: {
8+
headers: {
9+
'Cross-Origin-Opener-Policy': 'same-origin',
10+
'Cross-Origin-Embedder-Policy': 'require-corp'
11+
}
12+
},
713
// This is only needed for local tests to resolve the package name correctly
814
resolve: {
915
alias: {

0 commit comments

Comments
 (0)