@lowentry/utils 1.6.3 → 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 (3) hide show
  1. package/LeTypes.js +5 -2
  2. package/LeUtils.js +126 -0
  3. package/package.json +1 -1
package/LeTypes.js CHANGED
@@ -1,3 +1,6 @@
1
+ const REGEX_ALL_NON_FLOAT_CHARACTERS = /[^0-9.\-]/g;
2
+
3
+
1
4
  /**
2
5
  * Returns true if the value is set (not undefined and not null).
3
6
  *
@@ -152,7 +155,7 @@ export const INT_LAX_ANY = (...values) => Math.round(FLOAT_LAX_ANY(...values));
152
155
  */
153
156
  export const FLOAT_LAX = (value) =>
154
157
  {
155
- const v = parseFloat(value);
158
+ const v = (typeof value === 'number') ? value : parseFloat((value + '').replace(REGEX_ALL_NON_FLOAT_CHARACTERS, ''));
156
159
  if(!isNaN(v))
157
160
  {
158
161
  return v;
@@ -173,7 +176,7 @@ export const FLOAT_LAX_ANY = (...values) =>
173
176
  {
174
177
  if(value !== null)
175
178
  {
176
- const v = parseFloat(value);
179
+ const v = (typeof value === 'number') ? value : parseFloat((value + '').replace(REGEX_ALL_NON_FLOAT_CHARACTERS, ''));
177
180
  if(!isNaN(v))
178
181
  {
179
182
  return v;
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.6.3",
3
+ "version": "1.8.1",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Provides utilities for general JavaScript development.",