Skip to content

Commit

Permalink
Revert "reuse single worker"
Browse files Browse the repository at this point in the history
This reverts commit 236492f.
  • Loading branch information
davelopez committed Jan 23, 2025
1 parent c8db62f commit 484dfc5
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 92 deletions.
80 changes: 37 additions & 43 deletions client/src/composables/filter/filter.js
Original file line number Diff line number Diff line change
@@ -1,62 +1,56 @@
import { toValue } from "@vueuse/core";
import { onScopeDispose, ref, watchEffect } from "vue";
import { onScopeDispose, ref, watch } from "vue";

let worker;
let idCounter = 0;
let workerReferenceCount = 0;
export function useFilterObjectArray(array, filter, objectFields, asRegex = false) {
const worker = new Worker(new URL("./filter.worker.js", import.meta.url));

export function useFilterObjectArray(array, filter, objectFields) {
if (!worker) {
worker = new Worker(new URL("./filter.worker.js", import.meta.url));
}

workerReferenceCount += 1;
const id = idCounter++;
const filtered = ref([]);
filtered.value = toValue(array);

const post = (message) => {
worker.postMessage({ id, ...message });
worker.postMessage(message);
};

const filtered = ref([]);
filtered.value = toValue(array);
watch(
() => toValue(array),
(arr) => {
post({ type: "setArray", array: arr });
},
{
immediate: true,
}
);

watch(
() => toValue(filter),
(f) => {
post({ type: "setFilter", filter: f });
},
{
immediate: true,
}
);

watch(
() => toValue(objectFields),
(fields) => {
post({ type: "setFields", fields });
},
{
immediate: true,
}
);

const onMessage = (e) => {
worker.onmessage = (e) => {
const message = e.data;

// exit if message is not meant for this composable instance
if (message.id !== id) {
return;
}

if (message.type === "result") {
filtered.value = message.filtered;
} else {
post({ type: "clear" });
worker.removeEventListener("message", onMessage);
}
};

worker.addEventListener("message", onMessage);

watchEffect(() => {
post({ type: "setArray", array: toValue(array) });
});

watchEffect(() => {
post({ type: "setFilter", filter: toValue(filter) });
});

watchEffect(() => {
post({ type: "setFields", fields: toValue(objectFields) });
});

onScopeDispose(() => {
workerReferenceCount -= 1;

if (workerReferenceCount <= 0) {
worker.terminate();
worker = null;
}
worker.terminate();
});

return filtered;
Expand Down
61 changes: 12 additions & 49 deletions client/src/composables/filter/filter.worker.js
Original file line number Diff line number Diff line change
@@ -1,59 +1,22 @@
import { runFilter } from "@/composables/filter/filterFunction";

function createOptions() {
return {
array: [],
filter: "",
fields: [],
};
}

const optionsById = new Map();
const timerById = new Map();
let array = [];
let filter = "";
let fields = [];

self.addEventListener("message", (e) => {
const message = e.data;

if (!optionsById.has(message.id)) {
optionsById.set(message.id, createOptions());
}

const options = optionsById.get(message.id);

switch (message.type) {
case "setArray":
options.array = message.array;
break;

case "setFields":
options.fields = message.fields;
break;

case "setFilter":
options.filter = message.filter;
break;

case "clear":
optionsById.delete(message.id);
break;

default:
break;
if (message.type === "setArray") {
array = message.array;
} else if (message.type === "setFields") {
fields = message.fields;
} else if (message.type === "setFilter") {
filter = message.filter;
}

if (timerById.has(message.id)) {
clearTimeout(timerById.get(message.id));
if (array.length > 0 && fields.length > 0) {
const filtered = runFilter(filter, array, fields);
self.postMessage({ type: "result", filtered });
}

timerById.set(
message.id,
setTimeout(() => {
if (options.array.length > 0 && options.fields.length > 0) {
const filtered = runFilter(options.filter, options.array, options.fields);
self.postMessage({ type: "result", filtered });
}

timerById.delete(message.id);
}, 10)
);
});

0 comments on commit 484dfc5

Please sign in to comment.