@lowentry/utils 1.7.1 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/LeUtils.js +126 -0
  2. package/package.json +1 -1
package/LeUtils.js CHANGED
@@ -2765,4 +2765,130 @@ export const LeUtils = {
2765
2765
  }
2766
2766
  return transactionalValue.changes[transactionalValue.changes.length - 1].value;
2767
2767
  },
2768
+
2769
+ /**
2770
+ * Creates a worker thread. Workers have to be stored at /workers/{workerName}.worker.js for this to work.
2771
+ *
2772
+ * Example of a worker file:
2773
+ *
2774
+ * ```js
2775
+ * onmessage = (message) =>
2776
+ * {
2777
+ * postMessage({
2778
+ * ...message.data,
2779
+ * results: ['...some expensive calculation involving message.data...'],
2780
+ * });
2781
+ * };
2782
+ * ```
2783
+ *
2784
+ * Usage:
2785
+ *
2786
+ * ```js
2787
+ * const {results} = await (async () =>
2788
+ * {
2789
+ * try
2790
+ * {
2791
+ * return await LeUtils.sendWorkerMessage('my-worker', {someData:[1, 2, 3, 4, 5]});
2792
+ * }
2793
+ * catch(error)
2794
+ * {
2795
+ * console.error('MyWorker: ', error);
2796
+ * return {results:[]};
2797
+ * }
2798
+ * })();
2799
+ * ```
2800
+ *
2801
+ * or, if you want more control over the number of threads you have (the above example will only create 1 thread per worker):
2802
+ *
2803
+ * ```js
2804
+ * const myWorker1 = LeUtils.createWorkerThread('my-worker'); // creates a thread, you can create multiple worker threads of the same worker, to run multiple instances in parallel
2805
+ * const myWorker2 = LeUtils.createWorkerThread('my-worker'); // same worker, another thread
2806
+ * const {results} = await (async () =>
2807
+ * {
2808
+ * try
2809
+ * {
2810
+ * return await myWorker1.sendMessage({someData:[1, 2, 3, 4, 5]});
2811
+ * }
2812
+ * catch(error)
2813
+ * {
2814
+ * console.error('MyWorker: ', error);
2815
+ * return {results:[]};
2816
+ * }
2817
+ * })();
2818
+ * ```
2819
+ */
2820
+ createWorkerThread:
2821
+ (name) =>
2822
+ {
2823
+ const worker = new Worker('/workers/' + name + '.worker.js');
2824
+ let listeners = {};
2825
+
2826
+ const addListener = (id, callback) =>
2827
+ {
2828
+ listeners[id] = callback;
2829
+ };
2830
+
2831
+ const removeListener = (id) =>
2832
+ {
2833
+ delete listeners[id];
2834
+ };
2835
+
2836
+ const sendMessage = (data, options) =>
2837
+ {
2838
+ return new Promise((resolve, reject) =>
2839
+ {
2840
+ const id = LeUtils.uniqueId();
2841
+ addListener(id, resolve);
2842
+ setTimeout(() =>
2843
+ {
2844
+ removeListener(id);
2845
+ reject('timeout');
2846
+ }, options?.timeout ?? 10000);
2847
+
2848
+ worker.postMessage({
2849
+ id,
2850
+ ...data,
2851
+ });
2852
+ });
2853
+ };
2854
+
2855
+ worker.onerror = (error) =>
2856
+ {
2857
+ console.error('Worker ' + name + ':', error);
2858
+ };
2859
+ worker.onmessage = (message) =>
2860
+ {
2861
+ const data = message.data;
2862
+ if(data?.id)
2863
+ {
2864
+ const callback = listeners[data.id];
2865
+ if(callback)
2866
+ {
2867
+ removeListener(data.id);
2868
+ callback(data);
2869
+ }
2870
+ }
2871
+ };
2872
+
2873
+ return {worker, sendMessage};
2874
+ },
2875
+
2876
+ /**
2877
+ * Sends a message to the given worker. Creates a worker thread for this worker if it doesn't exist yet.
2878
+ *
2879
+ * See {@link LeUtils#createWorkerThread} for more info on how to use workers.
2880
+ */
2881
+ sendWorkerMessage:
2882
+ (() =>
2883
+ {
2884
+ const workers = {};
2885
+ return (workerName, data, options) =>
2886
+ {
2887
+ if(!workers[workerName])
2888
+ {
2889
+ workers[workerName] = LeUtils.createWorkerThread(workerName);
2890
+ }
2891
+ return workers[workerName].sendMessage(data, options);
2892
+ };
2893
+ })(),
2768
2894
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lowentry/utils",
3
- "version": "1.7.1",
3
+ "version": "1.8.1",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Provides utilities for general JavaScript development.",