web: fix web app not working on safari

This commit is contained in:
Abdullah Atta
2024-05-15 15:40:57 +05:00
committed by Abdullah Atta
parent 8de98d98ab
commit 62d677f9ad
3 changed files with 11 additions and 4 deletions

View File

@@ -83,7 +83,7 @@ export class SharedService<T extends object> extends EventTarget {
}
activate(
portProviderFunc: () => MessagePort | Promise<MessagePort>,
portProviderFunc: () => Promise<{ port: MessagePort; onclose: () => void }>,
onClientConnected: () => Promise<void>
) {
if (this.#onDeactivate) return;
@@ -97,7 +97,7 @@ export class SharedService<T extends object> extends EventTarget {
navigator.locks
.request(LOCK_NAME, { signal: this.#onDeactivate.signal }, async () => {
// Get the port to request client ports.
const port = await portProviderFunc();
const { port, onclose } = await portProviderFunc();
port.start();
// Listen for client requests. A separate BroadcastChannel
@@ -159,6 +159,7 @@ export class SharedService<T extends object> extends EventTarget {
// Release the lock only on user abort or context destruction.
return new Promise((_, reject) => {
this.#onDeactivate?.signal.addEventListener("abort", () => {
onclose();
broadcastChannel.close();
reject(this.#onDeactivate?.signal.reason);
});

View File

@@ -233,6 +233,8 @@ addEventListener("message", async (event) => {
await worker.open(event.data.dbName, event.data.async, event.data.uri);
const providerPort = createSharedServicePort(worker);
postMessage(null, [providerPort]);
self.addEventListener("beforeunload", () => worker.close());
}
});

View File

@@ -72,14 +72,18 @@ export class WaSqliteWorkerDriver implements Driver {
service.activate(
() =>
new Promise<MessagePort>((resolve) => {
new Promise<{ port: MessagePort; onclose: () => void }>((resolve) => {
console.log("initializing worker");
this.needsInitialization = true;
const worker = new Worker();
worker.addEventListener(
"message",
(event) => resolve(event.ports[0]),
(event) =>
resolve({
port: event.ports[0],
onclose: () => worker.terminate()
}),
{ once: true }
);
worker.postMessage({