File size: 2,287 Bytes
009fd18
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
console.info("[PocketBootstrap] worker module starting");

self.addEventListener("error", (event) => {
  console.error("[PocketBootstrap] error event", {
    message: event.message,
    filename: event.filename,
    lineno: event.lineno,
    colno: event.colno,
  });
});

self.addEventListener("unhandledrejection", (event) => {
  console.error("[PocketBootstrap] unhandled rejection", event.reason);
});

const postBootstrapError = (error: unknown) => {
  const message =
    error instanceof Error ? `${error.name}: ${error.message}` : String(error);

  self.postMessage({
    type: "error",
    error: `Pocket bootstrap failed: ${message}`,
  });
};

const queuedMessages: unknown[] = [];
let vendorMessageHandler:
  | ((event: MessageEvent) => void | Promise<void>)
  | null = null;

const forwardOrQueueMessage = (event: MessageEvent) => {
  if (vendorMessageHandler) {
    void vendorMessageHandler(event);
    return;
  }

  queuedMessages.push(event.data);
  console.info("[PocketBootstrap] queued message", {
    type:
      typeof event.data === "object" &&
      event.data !== null &&
      "type" in (event.data as Record<string, unknown>)
        ? (event.data as { type?: unknown }).type
        : "unknown",
  });
};

self.addEventListener("message", forwardOrQueueMessage);

void (async () => {
  try {
    const vendorWorkerUrl = new URL(
      "/pocket-tts/inference-worker.js",
      self.location.origin,
    ).toString();
    console.info("[PocketBootstrap] importing vendor worker");
    await import(/* @vite-ignore */ vendorWorkerUrl);
    console.info("[PocketBootstrap] vendor worker imported");

    if (typeof self.onmessage !== "function") {
      throw new Error("Vendor worker did not install a message handler.");
    }

    vendorMessageHandler = self.onmessage.bind(self);
    console.info("[PocketBootstrap] vendor handler ready", {
      queuedMessages: queuedMessages.length,
    });

    while (queuedMessages.length > 0) {
      const data = queuedMessages.shift();
      await vendorMessageHandler(
        new MessageEvent("message", {
          data,
        }),
      );
    }
  } catch (error) {
    console.error("[PocketBootstrap] vendor worker import failed", error);
    postBootstrapError(error);
    throw error;
  }
})();

export {};