@dynamic-labs/utils 0.18.28 → 0.18.30
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/CHANGELOG.md +16 -0
- package/package.json +3 -3
- package/src/index.cjs +3 -0
- package/src/index.d.ts +1 -0
- package/src/index.js +1 -0
- package/src/isMobile.cjs +3 -1
- package/src/isMobile.js +3 -1
- package/src/retryableFn.cjs +53 -0
- package/src/retryableFn.d.ts +14 -0
- package/src/retryableFn.js +48 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,4 +1,20 @@
|
|
|
1
1
|
|
|
2
|
+
### [0.18.30](https://github.com/dynamic-labs/DynamicAuth/compare/v0.18.29...v0.18.30) (2023-11-27)
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
### Bug Fixes
|
|
6
|
+
|
|
7
|
+
* handle origin_check message from authWindow ([#3992](https://github.com/dynamic-labs/DynamicAuth/issues/3992)) ([1f35594](https://github.com/dynamic-labs/DynamicAuth/commit/1f35594fa3b0e10d3e1c6102b82606117a2265e1))
|
|
8
|
+
* null safe check to window object ([#3886](https://github.com/dynamic-labs/DynamicAuth/issues/3886)) ([37b4d36](https://github.com/dynamic-labs/DynamicAuth/commit/37b4d361b61f1045b7a0dc42359eb6cc1ce1b659))
|
|
9
|
+
|
|
10
|
+
### [0.18.29](https://github.com/dynamic-labs/DynamicAuth/compare/v0.18.28...v0.18.29) (2023-11-13)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Bug Fixes
|
|
14
|
+
|
|
15
|
+
* **bridge:** disconnect mm when locked offsite ([#3872](https://github.com/dynamic-labs/DynamicAuth/issues/3872)) ([4a34492](https://github.com/dynamic-labs/DynamicAuth/commit/4a344926d2987cd31123b9a5ac9c3dbf1efccbe0))
|
|
16
|
+
* only process oauth message coming from the expected origin ([#3805](https://github.com/dynamic-labs/DynamicAuth/issues/3805)) ([970003c](https://github.com/dynamic-labs/DynamicAuth/commit/970003c81cc101dcca2c4a56c48095303377d8ef))
|
|
17
|
+
|
|
2
18
|
### [0.18.28](https://github.com/dynamic-labs/DynamicAuth/compare/v0.18.27...v0.18.28) (2023-10-30)
|
|
3
19
|
|
|
4
20
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dynamic-labs/utils",
|
|
3
|
-
"version": "0.18.
|
|
3
|
+
"version": "0.18.30",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/dynamic-labs/DynamicAuth.git",
|
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
"./package.json": "./package.json"
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@dynamic-labs/logger": "0.18.
|
|
30
|
-
"@dynamic-labs/types": "0.18.
|
|
29
|
+
"@dynamic-labs/logger": "0.18.30",
|
|
30
|
+
"@dynamic-labs/types": "0.18.30"
|
|
31
31
|
},
|
|
32
32
|
"peerDependencies": {}
|
|
33
33
|
}
|
package/src/index.cjs
CHANGED
|
@@ -25,6 +25,7 @@ var isMobile = require('./isMobile.cjs');
|
|
|
25
25
|
var localStorageAsync = require('./localStorageAsync.cjs');
|
|
26
26
|
var bufferToBase64 = require('./bufferToBase64.cjs');
|
|
27
27
|
var last = require('./last.cjs');
|
|
28
|
+
var retryableFn = require('./retryableFn.cjs');
|
|
28
29
|
|
|
29
30
|
|
|
30
31
|
|
|
@@ -59,3 +60,5 @@ exports.removeItemAsync = localStorageAsync.removeItemAsync;
|
|
|
59
60
|
exports.setItemAsync = localStorageAsync.setItemAsync;
|
|
60
61
|
exports.bufferToBase64 = bufferToBase64.bufferToBase64;
|
|
61
62
|
exports.last = last.last;
|
|
63
|
+
exports.FALLBACK_UNDEFINED = retryableFn.FALLBACK_UNDEFINED;
|
|
64
|
+
exports.retryableFn = retryableFn.retryableFn;
|
package/src/index.d.ts
CHANGED
package/src/index.js
CHANGED
|
@@ -21,3 +21,4 @@ export { isAndroid, isIOS, isIPad, isIPhone, isLegacySafari, isMobile, isSamsung
|
|
|
21
21
|
export { getItemAsync, removeItemAsync, setItemAsync } from './localStorageAsync.js';
|
|
22
22
|
export { bufferToBase64 } from './bufferToBase64.js';
|
|
23
23
|
export { last } from './last.js';
|
|
24
|
+
export { FALLBACK_UNDEFINED, retryableFn } from './retryableFn.js';
|
package/src/isMobile.cjs
CHANGED
|
@@ -44,7 +44,9 @@ const isAndroid = () => isMobile() && !isIOS();
|
|
|
44
44
|
const isLegacySafari = () => {
|
|
45
45
|
// We need to check if window.CSS exists and if it has supports function.
|
|
46
46
|
// We can use it only in browsers. This prevents customer tests from failing because of that.
|
|
47
|
-
if (
|
|
47
|
+
if (typeof window === 'undefined' ||
|
|
48
|
+
!window.CSS ||
|
|
49
|
+
typeof window.CSS.supports !== 'function') {
|
|
48
50
|
return false;
|
|
49
51
|
}
|
|
50
52
|
// Older versions of Safari <15 are not supporting aspect-ratio css property.
|
package/src/isMobile.js
CHANGED
|
@@ -40,7 +40,9 @@ const isAndroid = () => isMobile() && !isIOS();
|
|
|
40
40
|
const isLegacySafari = () => {
|
|
41
41
|
// We need to check if window.CSS exists and if it has supports function.
|
|
42
42
|
// We can use it only in browsers. This prevents customer tests from failing because of that.
|
|
43
|
-
if (
|
|
43
|
+
if (typeof window === 'undefined' ||
|
|
44
|
+
!window.CSS ||
|
|
45
|
+
typeof window.CSS.supports !== 'function') {
|
|
44
46
|
return false;
|
|
45
47
|
}
|
|
46
48
|
// Older versions of Safari <15 are not supporting aspect-ratio css property.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var _tslib = require('../_virtual/_tslib.cjs');
|
|
6
|
+
|
|
7
|
+
const FALLBACK_UNDEFINED = 'FALLBACK_UNDEFINED';
|
|
8
|
+
const retryableFn = (fn, options = {}) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
|
|
9
|
+
const { maxRetries = 3, currentRetry = 0, timeoutMs = 100, fallbackValue = new Error('Max retries reached'), retryStrategy = 'timeout-only', } = options;
|
|
10
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
11
|
+
setTimeout(() => {
|
|
12
|
+
reject(new Error('Timeout'));
|
|
13
|
+
}, timeoutMs);
|
|
14
|
+
});
|
|
15
|
+
try {
|
|
16
|
+
const result = yield Promise.race([fn(), timeoutPromise]);
|
|
17
|
+
return result;
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
if (currentRetry >= maxRetries) {
|
|
21
|
+
if (fallbackValue instanceof Error) {
|
|
22
|
+
throw fallbackValue;
|
|
23
|
+
}
|
|
24
|
+
else if (fallbackValue === FALLBACK_UNDEFINED) {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
return fallbackValue;
|
|
28
|
+
}
|
|
29
|
+
const isTimeout = err.message === 'Timeout';
|
|
30
|
+
const shouldRetry = retryStrategy === 'timeout-and-rejection' ||
|
|
31
|
+
(retryStrategy === 'timeout-only' && isTimeout) ||
|
|
32
|
+
(retryStrategy === 'rejection-only' && !isTimeout);
|
|
33
|
+
if (!shouldRetry) {
|
|
34
|
+
if (fallbackValue instanceof Error) {
|
|
35
|
+
throw err;
|
|
36
|
+
}
|
|
37
|
+
else if (fallbackValue === FALLBACK_UNDEFINED) {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
return fallbackValue;
|
|
41
|
+
}
|
|
42
|
+
return retryableFn(fn, {
|
|
43
|
+
currentRetry: currentRetry + 1,
|
|
44
|
+
fallbackValue,
|
|
45
|
+
maxRetries,
|
|
46
|
+
retryStrategy,
|
|
47
|
+
timeoutMs,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
exports.FALLBACK_UNDEFINED = FALLBACK_UNDEFINED;
|
|
53
|
+
exports.retryableFn = retryableFn;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const FALLBACK_UNDEFINED = "FALLBACK_UNDEFINED";
|
|
2
|
+
export type RetryableFnOptions<T> = {
|
|
3
|
+
/** Maximum number of retry attempts before returning fallbackValue */
|
|
4
|
+
maxRetries?: number;
|
|
5
|
+
/** Internal only. Do not use */
|
|
6
|
+
currentRetry?: number;
|
|
7
|
+
/** Timeout in ms to wait before executing retryStrategy */
|
|
8
|
+
timeoutMs?: number;
|
|
9
|
+
/** The value to fallback to when function rejects or times out */
|
|
10
|
+
fallbackValue?: T | Error | typeof FALLBACK_UNDEFINED;
|
|
11
|
+
/** Configure whether the fn should be retried only on timeout, only on rejection, or both */
|
|
12
|
+
retryStrategy?: 'timeout-only' | 'rejection-only' | 'timeout-and-rejection';
|
|
13
|
+
};
|
|
14
|
+
export declare const retryableFn: <T>(fn: () => Promise<T>, options?: RetryableFnOptions<T>) => Promise<T>;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { __awaiter } from '../_virtual/_tslib.js';
|
|
2
|
+
|
|
3
|
+
const FALLBACK_UNDEFINED = 'FALLBACK_UNDEFINED';
|
|
4
|
+
const retryableFn = (fn, options = {}) => __awaiter(void 0, void 0, void 0, function* () {
|
|
5
|
+
const { maxRetries = 3, currentRetry = 0, timeoutMs = 100, fallbackValue = new Error('Max retries reached'), retryStrategy = 'timeout-only', } = options;
|
|
6
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
7
|
+
setTimeout(() => {
|
|
8
|
+
reject(new Error('Timeout'));
|
|
9
|
+
}, timeoutMs);
|
|
10
|
+
});
|
|
11
|
+
try {
|
|
12
|
+
const result = yield Promise.race([fn(), timeoutPromise]);
|
|
13
|
+
return result;
|
|
14
|
+
}
|
|
15
|
+
catch (err) {
|
|
16
|
+
if (currentRetry >= maxRetries) {
|
|
17
|
+
if (fallbackValue instanceof Error) {
|
|
18
|
+
throw fallbackValue;
|
|
19
|
+
}
|
|
20
|
+
else if (fallbackValue === FALLBACK_UNDEFINED) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
return fallbackValue;
|
|
24
|
+
}
|
|
25
|
+
const isTimeout = err.message === 'Timeout';
|
|
26
|
+
const shouldRetry = retryStrategy === 'timeout-and-rejection' ||
|
|
27
|
+
(retryStrategy === 'timeout-only' && isTimeout) ||
|
|
28
|
+
(retryStrategy === 'rejection-only' && !isTimeout);
|
|
29
|
+
if (!shouldRetry) {
|
|
30
|
+
if (fallbackValue instanceof Error) {
|
|
31
|
+
throw err;
|
|
32
|
+
}
|
|
33
|
+
else if (fallbackValue === FALLBACK_UNDEFINED) {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
return fallbackValue;
|
|
37
|
+
}
|
|
38
|
+
return retryableFn(fn, {
|
|
39
|
+
currentRetry: currentRetry + 1,
|
|
40
|
+
fallbackValue,
|
|
41
|
+
maxRetries,
|
|
42
|
+
retryStrategy,
|
|
43
|
+
timeoutMs,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
export { FALLBACK_UNDEFINED, retryableFn };
|