| /* eslint-disable no-restricted-globals */ | |
| import { pipeline } from "@huggingface/transformers"; | |
| class PipelineFactory { | |
| static task = null; | |
| static model = null; | |
| static instance = null; | |
| static async getInstance(progress_callback = null) { | |
| if (this.instance === null) { | |
| this.instance = pipeline(this.task, this.model, { | |
| progress_callback, | |
| }); | |
| } | |
| return this.instance; | |
| } | |
| } | |
| // Listen for messages from the main thread | |
| self.addEventListener("message", async (event) => { | |
| const { task, model, input } = event.data; | |
| PipelineFactory.task = task; | |
| PipelineFactory.model = model; | |
| // Retrieve the pipeline. When called for the first time, | |
| // this will load the pipeline and save it for future use. | |
| const pipe = await PipelineFactory.getInstance((x) => { | |
| // We also add a progress callback to the pipeline so that we can | |
| // track model loading. | |
| self.postMessage({ status: "progress", data: x }); | |
| }); | |
| // Run the pipeline | |
| const output = await pipe(...input); | |
| // Send the output back to the main thread | |
| self.postMessage({ status: "output", output }); | |
| // Send the output back to the main thread | |
| self.postMessage({ status: "complete" }); | |
| }); | |