vrom-js-demo / dist /embed-worker.js
philipp-zettl's picture
Add dist/embed-worker.js
d8a1dba verified
Raw
History Blame Contribute Delete
2.86 kB
import { pipeline } from "https://cdn.jsdelivr.net/npm/@huggingface/transformers@3";
//#region src/embed-worker.ts
/**
* embed-worker.ts — Background Web Worker for transformers.js ONNX embedding.
*
* Supports model diffing: if the requested model is already loaded, skips reload.
* All outgoing messages are tagged with `source: 'vecdb'` to avoid collisions
* with transformers.js internal events.
*/
const MSG_TAG = "vecdb";
let extractor = null;
let currentModel = null;
let currentDtype = null;
let currentDim = null;
function send(msg) {
self.postMessage({
...msg,
source: MSG_TAG
});
}
function sendTransfer(msg, transfer) {
self.postMessage({
...msg,
source: MSG_TAG
}, transfer);
}
self.addEventListener("message", async (event) => {
const { type, id } = event.data;
try {
switch (type) {
case "load": {
const { modelId, dtype } = event.data;
if (extractor && currentModel === modelId && currentDtype === dtype && currentDim) {
send({
status: "ready",
dim: currentDim,
modelId,
dtype,
cached: true
});
break;
}
if (extractor) {
try {
await extractor.dispose();
} catch {}
extractor = null;
}
currentModel = modelId;
currentDtype = dtype;
currentDim = null;
extractor = await pipeline("feature-extraction", modelId, {
dtype,
progress_callback: (p) => {
if (p.status === "progress" && p.total > 0) send({
status: "dl-progress",
file: p.file,
loaded: p.loaded,
total: p.total
});
}
});
currentDim = (await extractor(["test"], {
pooling: "mean",
normalize: true
})).dims[1];
send({
status: "ready",
dim: currentDim,
modelId,
dtype,
cached: false
});
break;
}
case "embed": {
if (!extractor) {
send({
status: "error",
id,
message: "Model not loaded"
});
return;
}
const { texts } = event.data;
const output = await extractor(texts, {
pooling: "mean",
normalize: true
});
const float32 = new Float32Array(output.data);
sendTransfer({
status: "result",
id,
embeddings: float32,
dims: output.dims
}, [float32.buffer]);
break;
}
case "unload":
if (extractor) {
try {
await extractor.dispose();
} catch {}
extractor = null;
}
currentModel = null;
currentDtype = null;
currentDim = null;
send({ status: "unloaded" });
break;
case "get-model":
send({
status: "model-info",
modelId: currentModel,
dtype: currentDtype,
dim: currentDim,
loaded: !!extractor
});
break;
}
} catch (err) {
send({
status: "error",
id,
message: err.message || String(err)
});
}
});
//#endregion
//# sourceMappingURL=embed-worker.js.map