@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.
- package/LeTypes.js +5 -2
- package/LeUtils.js +126 -0
- 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
|
};
|