@oxyhq/core 1.0.0
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/README.md +50 -0
- package/dist/cjs/AuthManager.js +361 -0
- package/dist/cjs/CrossDomainAuth.js +258 -0
- package/dist/cjs/HttpService.js +618 -0
- package/dist/cjs/OxyServices.base.js +263 -0
- package/dist/cjs/OxyServices.errors.js +22 -0
- package/dist/cjs/OxyServices.js +63 -0
- package/dist/cjs/constants/version.js +16 -0
- package/dist/cjs/crypto/index.js +20 -0
- package/dist/cjs/crypto/keyManager.js +887 -0
- package/dist/cjs/crypto/polyfill.js +64 -0
- package/dist/cjs/crypto/recoveryPhrase.js +169 -0
- package/dist/cjs/crypto/signatureService.js +296 -0
- package/dist/cjs/i18n/index.js +73 -0
- package/dist/cjs/i18n/locales/ar-SA.json +120 -0
- package/dist/cjs/i18n/locales/ca-ES.json +120 -0
- package/dist/cjs/i18n/locales/de-DE.json +120 -0
- package/dist/cjs/i18n/locales/en-US.json +956 -0
- package/dist/cjs/i18n/locales/es-ES.json +944 -0
- package/dist/cjs/i18n/locales/fr-FR.json +120 -0
- package/dist/cjs/i18n/locales/it-IT.json +120 -0
- package/dist/cjs/i18n/locales/ja-JP.json +119 -0
- package/dist/cjs/i18n/locales/ko-KR.json +120 -0
- package/dist/cjs/i18n/locales/locales/ar-SA.json +120 -0
- package/dist/cjs/i18n/locales/locales/ca-ES.json +120 -0
- package/dist/cjs/i18n/locales/locales/de-DE.json +120 -0
- package/dist/cjs/i18n/locales/locales/en-US.json +956 -0
- package/dist/cjs/i18n/locales/locales/es-ES.json +944 -0
- package/dist/cjs/i18n/locales/locales/fr-FR.json +120 -0
- package/dist/cjs/i18n/locales/locales/it-IT.json +120 -0
- package/dist/cjs/i18n/locales/locales/ja-JP.json +119 -0
- package/dist/cjs/i18n/locales/locales/ko-KR.json +120 -0
- package/dist/cjs/i18n/locales/locales/pt-PT.json +120 -0
- package/dist/cjs/i18n/locales/locales/zh-CN.json +120 -0
- package/dist/cjs/i18n/locales/pt-PT.json +120 -0
- package/dist/cjs/i18n/locales/zh-CN.json +120 -0
- package/dist/cjs/index.js +153 -0
- package/dist/cjs/mixins/OxyServices.analytics.js +49 -0
- package/dist/cjs/mixins/OxyServices.assets.js +380 -0
- package/dist/cjs/mixins/OxyServices.auth.js +259 -0
- package/dist/cjs/mixins/OxyServices.developer.js +97 -0
- package/dist/cjs/mixins/OxyServices.devices.js +116 -0
- package/dist/cjs/mixins/OxyServices.features.js +309 -0
- package/dist/cjs/mixins/OxyServices.fedcm.js +435 -0
- package/dist/cjs/mixins/OxyServices.karma.js +108 -0
- package/dist/cjs/mixins/OxyServices.language.js +154 -0
- package/dist/cjs/mixins/OxyServices.location.js +43 -0
- package/dist/cjs/mixins/OxyServices.payment.js +158 -0
- package/dist/cjs/mixins/OxyServices.popup.js +371 -0
- package/dist/cjs/mixins/OxyServices.privacy.js +162 -0
- package/dist/cjs/mixins/OxyServices.redirect.js +345 -0
- package/dist/cjs/mixins/OxyServices.security.js +81 -0
- package/dist/cjs/mixins/OxyServices.user.js +355 -0
- package/dist/cjs/mixins/OxyServices.utility.js +156 -0
- package/dist/cjs/mixins/index.js +79 -0
- package/dist/cjs/mixins/mixinHelpers.js +53 -0
- package/dist/cjs/models/interfaces.js +20 -0
- package/dist/cjs/models/session.js +2 -0
- package/dist/cjs/shared/index.js +70 -0
- package/dist/cjs/shared/utils/colorUtils.js +153 -0
- package/dist/cjs/shared/utils/debugUtils.js +73 -0
- package/dist/cjs/shared/utils/errorUtils.js +183 -0
- package/dist/cjs/shared/utils/index.js +49 -0
- package/dist/cjs/shared/utils/networkUtils.js +183 -0
- package/dist/cjs/shared/utils/themeUtils.js +106 -0
- package/dist/cjs/utils/apiUtils.js +61 -0
- package/dist/cjs/utils/asyncUtils.js +194 -0
- package/dist/cjs/utils/cache.js +226 -0
- package/dist/cjs/utils/deviceManager.js +205 -0
- package/dist/cjs/utils/errorUtils.js +154 -0
- package/dist/cjs/utils/index.js +26 -0
- package/dist/cjs/utils/languageUtils.js +165 -0
- package/dist/cjs/utils/loggerUtils.js +126 -0
- package/dist/cjs/utils/platform.js +144 -0
- package/dist/cjs/utils/requestUtils.js +209 -0
- package/dist/cjs/utils/sessionUtils.js +181 -0
- package/dist/cjs/utils/validationUtils.js +173 -0
- package/dist/esm/AuthManager.js +356 -0
- package/dist/esm/CrossDomainAuth.js +253 -0
- package/dist/esm/HttpService.js +614 -0
- package/dist/esm/OxyServices.base.js +259 -0
- package/dist/esm/OxyServices.errors.js +17 -0
- package/dist/esm/OxyServices.js +59 -0
- package/dist/esm/constants/version.js +13 -0
- package/dist/esm/crypto/index.js +13 -0
- package/dist/esm/crypto/keyManager.js +850 -0
- package/dist/esm/crypto/polyfill.js +61 -0
- package/dist/esm/crypto/recoveryPhrase.js +132 -0
- package/dist/esm/crypto/signatureService.js +259 -0
- package/dist/esm/i18n/index.js +69 -0
- package/dist/esm/i18n/locales/ar-SA.json +120 -0
- package/dist/esm/i18n/locales/ca-ES.json +120 -0
- package/dist/esm/i18n/locales/de-DE.json +120 -0
- package/dist/esm/i18n/locales/en-US.json +956 -0
- package/dist/esm/i18n/locales/es-ES.json +944 -0
- package/dist/esm/i18n/locales/fr-FR.json +120 -0
- package/dist/esm/i18n/locales/it-IT.json +120 -0
- package/dist/esm/i18n/locales/ja-JP.json +119 -0
- package/dist/esm/i18n/locales/ko-KR.json +120 -0
- package/dist/esm/i18n/locales/locales/ar-SA.json +120 -0
- package/dist/esm/i18n/locales/locales/ca-ES.json +120 -0
- package/dist/esm/i18n/locales/locales/de-DE.json +120 -0
- package/dist/esm/i18n/locales/locales/en-US.json +956 -0
- package/dist/esm/i18n/locales/locales/es-ES.json +944 -0
- package/dist/esm/i18n/locales/locales/fr-FR.json +120 -0
- package/dist/esm/i18n/locales/locales/it-IT.json +120 -0
- package/dist/esm/i18n/locales/locales/ja-JP.json +119 -0
- package/dist/esm/i18n/locales/locales/ko-KR.json +120 -0
- package/dist/esm/i18n/locales/locales/pt-PT.json +120 -0
- package/dist/esm/i18n/locales/locales/zh-CN.json +120 -0
- package/dist/esm/i18n/locales/pt-PT.json +120 -0
- package/dist/esm/i18n/locales/zh-CN.json +120 -0
- package/dist/esm/index.js +55 -0
- package/dist/esm/mixins/OxyServices.analytics.js +46 -0
- package/dist/esm/mixins/OxyServices.assets.js +377 -0
- package/dist/esm/mixins/OxyServices.auth.js +256 -0
- package/dist/esm/mixins/OxyServices.developer.js +94 -0
- package/dist/esm/mixins/OxyServices.devices.js +113 -0
- package/dist/esm/mixins/OxyServices.features.js +306 -0
- package/dist/esm/mixins/OxyServices.fedcm.js +433 -0
- package/dist/esm/mixins/OxyServices.karma.js +105 -0
- package/dist/esm/mixins/OxyServices.language.js +118 -0
- package/dist/esm/mixins/OxyServices.location.js +40 -0
- package/dist/esm/mixins/OxyServices.payment.js +155 -0
- package/dist/esm/mixins/OxyServices.popup.js +369 -0
- package/dist/esm/mixins/OxyServices.privacy.js +159 -0
- package/dist/esm/mixins/OxyServices.redirect.js +343 -0
- package/dist/esm/mixins/OxyServices.security.js +78 -0
- package/dist/esm/mixins/OxyServices.user.js +352 -0
- package/dist/esm/mixins/OxyServices.utility.js +153 -0
- package/dist/esm/mixins/index.js +76 -0
- package/dist/esm/mixins/mixinHelpers.js +48 -0
- package/dist/esm/models/interfaces.js +17 -0
- package/dist/esm/models/session.js +1 -0
- package/dist/esm/shared/index.js +31 -0
- package/dist/esm/shared/utils/colorUtils.js +143 -0
- package/dist/esm/shared/utils/debugUtils.js +65 -0
- package/dist/esm/shared/utils/errorUtils.js +170 -0
- package/dist/esm/shared/utils/index.js +15 -0
- package/dist/esm/shared/utils/networkUtils.js +173 -0
- package/dist/esm/shared/utils/themeUtils.js +98 -0
- package/dist/esm/utils/apiUtils.js +55 -0
- package/dist/esm/utils/asyncUtils.js +179 -0
- package/dist/esm/utils/cache.js +218 -0
- package/dist/esm/utils/deviceManager.js +168 -0
- package/dist/esm/utils/errorUtils.js +146 -0
- package/dist/esm/utils/index.js +7 -0
- package/dist/esm/utils/languageUtils.js +158 -0
- package/dist/esm/utils/loggerUtils.js +115 -0
- package/dist/esm/utils/platform.js +102 -0
- package/dist/esm/utils/requestUtils.js +203 -0
- package/dist/esm/utils/sessionUtils.js +171 -0
- package/dist/esm/utils/validationUtils.js +153 -0
- package/dist/types/AuthManager.d.ts +143 -0
- package/dist/types/CrossDomainAuth.d.ts +160 -0
- package/dist/types/HttpService.d.ts +163 -0
- package/dist/types/OxyServices.base.d.ts +126 -0
- package/dist/types/OxyServices.d.ts +81 -0
- package/dist/types/OxyServices.errors.d.ts +11 -0
- package/dist/types/constants/version.d.ts +13 -0
- package/dist/types/crypto/index.d.ts +11 -0
- package/dist/types/crypto/keyManager.d.ts +189 -0
- package/dist/types/crypto/polyfill.d.ts +11 -0
- package/dist/types/crypto/recoveryPhrase.d.ts +58 -0
- package/dist/types/crypto/signatureService.d.ts +86 -0
- package/dist/types/i18n/index.d.ts +3 -0
- package/dist/types/index.d.ts +50 -0
- package/dist/types/mixins/OxyServices.analytics.d.ts +66 -0
- package/dist/types/mixins/OxyServices.assets.d.ts +135 -0
- package/dist/types/mixins/OxyServices.auth.d.ts +186 -0
- package/dist/types/mixins/OxyServices.developer.d.ts +99 -0
- package/dist/types/mixins/OxyServices.devices.d.ts +96 -0
- package/dist/types/mixins/OxyServices.features.d.ts +228 -0
- package/dist/types/mixins/OxyServices.fedcm.d.ts +200 -0
- package/dist/types/mixins/OxyServices.karma.d.ts +85 -0
- package/dist/types/mixins/OxyServices.language.d.ts +81 -0
- package/dist/types/mixins/OxyServices.location.d.ts +64 -0
- package/dist/types/mixins/OxyServices.payment.d.ts +111 -0
- package/dist/types/mixins/OxyServices.popup.d.ts +205 -0
- package/dist/types/mixins/OxyServices.privacy.d.ts +122 -0
- package/dist/types/mixins/OxyServices.redirect.d.ts +245 -0
- package/dist/types/mixins/OxyServices.security.d.ts +78 -0
- package/dist/types/mixins/OxyServices.user.d.ts +182 -0
- package/dist/types/mixins/OxyServices.utility.d.ts +93 -0
- package/dist/types/mixins/index.d.ts +30 -0
- package/dist/types/mixins/mixinHelpers.d.ts +31 -0
- package/dist/types/models/interfaces.d.ts +415 -0
- package/dist/types/models/session.d.ts +27 -0
- package/dist/types/shared/index.d.ts +28 -0
- package/dist/types/shared/utils/colorUtils.d.ts +104 -0
- package/dist/types/shared/utils/debugUtils.d.ts +48 -0
- package/dist/types/shared/utils/errorUtils.d.ts +97 -0
- package/dist/types/shared/utils/index.d.ts +13 -0
- package/dist/types/shared/utils/networkUtils.d.ts +139 -0
- package/dist/types/shared/utils/themeUtils.d.ts +90 -0
- package/dist/types/utils/apiUtils.d.ts +53 -0
- package/dist/types/utils/asyncUtils.d.ts +58 -0
- package/dist/types/utils/cache.d.ts +127 -0
- package/dist/types/utils/deviceManager.d.ts +65 -0
- package/dist/types/utils/errorUtils.d.ts +46 -0
- package/dist/types/utils/index.d.ts +6 -0
- package/dist/types/utils/languageUtils.d.ts +37 -0
- package/dist/types/utils/loggerUtils.d.ts +48 -0
- package/dist/types/utils/platform.d.ts +40 -0
- package/dist/types/utils/requestUtils.d.ts +123 -0
- package/dist/types/utils/sessionUtils.d.ts +54 -0
- package/dist/types/utils/validationUtils.d.ts +85 -0
- package/package.json +84 -0
- package/src/AuthManager.ts +436 -0
- package/src/CrossDomainAuth.ts +307 -0
- package/src/HttpService.ts +752 -0
- package/src/OxyServices.base.ts +334 -0
- package/src/OxyServices.errors.ts +26 -0
- package/src/OxyServices.ts +129 -0
- package/src/constants/version.ts +15 -0
- package/src/crypto/index.ts +25 -0
- package/src/crypto/keyManager.ts +962 -0
- package/src/crypto/polyfill.ts +70 -0
- package/src/crypto/recoveryPhrase.ts +166 -0
- package/src/crypto/signatureService.ts +323 -0
- package/src/i18n/index.ts +75 -0
- package/src/i18n/locales/ar-SA.json +120 -0
- package/src/i18n/locales/ca-ES.json +120 -0
- package/src/i18n/locales/de-DE.json +120 -0
- package/src/i18n/locales/en-US.json +956 -0
- package/src/i18n/locales/es-ES.json +944 -0
- package/src/i18n/locales/fr-FR.json +120 -0
- package/src/i18n/locales/it-IT.json +120 -0
- package/src/i18n/locales/ja-JP.json +119 -0
- package/src/i18n/locales/ko-KR.json +120 -0
- package/src/i18n/locales/pt-PT.json +120 -0
- package/src/i18n/locales/zh-CN.json +120 -0
- package/src/index.ts +153 -0
- package/src/mixins/OxyServices.analytics.ts +53 -0
- package/src/mixins/OxyServices.assets.ts +412 -0
- package/src/mixins/OxyServices.auth.ts +358 -0
- package/src/mixins/OxyServices.developer.ts +114 -0
- package/src/mixins/OxyServices.devices.ts +119 -0
- package/src/mixins/OxyServices.features.ts +428 -0
- package/src/mixins/OxyServices.fedcm.ts +494 -0
- package/src/mixins/OxyServices.karma.ts +111 -0
- package/src/mixins/OxyServices.language.ts +127 -0
- package/src/mixins/OxyServices.location.ts +46 -0
- package/src/mixins/OxyServices.payment.ts +163 -0
- package/src/mixins/OxyServices.popup.ts +443 -0
- package/src/mixins/OxyServices.privacy.ts +182 -0
- package/src/mixins/OxyServices.redirect.ts +397 -0
- package/src/mixins/OxyServices.security.ts +103 -0
- package/src/mixins/OxyServices.user.ts +392 -0
- package/src/mixins/OxyServices.utility.ts +191 -0
- package/src/mixins/index.ts +91 -0
- package/src/mixins/mixinHelpers.ts +69 -0
- package/src/models/interfaces.ts +511 -0
- package/src/models/session.ts +30 -0
- package/src/shared/index.ts +82 -0
- package/src/shared/utils/colorUtils.ts +155 -0
- package/src/shared/utils/debugUtils.ts +73 -0
- package/src/shared/utils/errorUtils.ts +181 -0
- package/src/shared/utils/index.ts +59 -0
- package/src/shared/utils/networkUtils.ts +248 -0
- package/src/shared/utils/themeUtils.ts +115 -0
- package/src/types/bip39.d.ts +32 -0
- package/src/types/buffer.d.ts +97 -0
- package/src/types/color.d.ts +20 -0
- package/src/types/elliptic.d.ts +62 -0
- package/src/utils/apiUtils.ts +88 -0
- package/src/utils/asyncUtils.ts +252 -0
- package/src/utils/cache.ts +264 -0
- package/src/utils/deviceManager.ts +198 -0
- package/src/utils/errorUtils.ts +216 -0
- package/src/utils/index.ts +21 -0
- package/src/utils/languageUtils.ts +174 -0
- package/src/utils/loggerUtils.ts +153 -0
- package/src/utils/platform.ts +117 -0
- package/src/utils/requestUtils.ts +237 -0
- package/src/utils/sessionUtils.ts +206 -0
- package/src/utils/validationUtils.ts +174 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme Utility Functions
|
|
3
|
+
*
|
|
4
|
+
* Consolidated theme utilities for normalizing and handling color schemes
|
|
5
|
+
* across the OxyServices ecosystem.
|
|
6
|
+
*
|
|
7
|
+
* @module shared/utils/themeUtils
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Valid theme values in the Oxy ecosystem.
|
|
12
|
+
*/
|
|
13
|
+
export type ThemeValue = 'light' | 'dark';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Normalizes a theme value to ensure it's always 'light' or 'dark'.
|
|
17
|
+
*
|
|
18
|
+
* @param theme - Theme value (may be 'light' | 'dark' | string | undefined)
|
|
19
|
+
* @returns Normalized 'light' | 'dark' theme (defaults to 'light')
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* normalizeTheme('dark'); // 'dark'
|
|
24
|
+
* normalizeTheme('light'); // 'light'
|
|
25
|
+
* normalizeTheme('unknown'); // 'light'
|
|
26
|
+
* normalizeTheme(undefined); // 'light'
|
|
27
|
+
* normalizeTheme(null); // 'light'
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export const normalizeTheme = (theme?: string | null): ThemeValue =>
|
|
31
|
+
theme === 'light' || theme === 'dark' ? theme : 'light';
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Normalizes a color scheme value with optional fallback chain.
|
|
35
|
+
*
|
|
36
|
+
* Handles null/undefined cases from React Native's useColorScheme() hook
|
|
37
|
+
* with a proper fallback chain.
|
|
38
|
+
*
|
|
39
|
+
* @param colorScheme - The color scheme from useColorScheme() hook (may be null/undefined)
|
|
40
|
+
* @param theme - Optional theme prop as fallback
|
|
41
|
+
* @returns Normalized 'light' | 'dark' color scheme
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```ts
|
|
45
|
+
* // In a React Native component:
|
|
46
|
+
* const systemScheme = useColorScheme(); // might be null
|
|
47
|
+
* const colorScheme = normalizeColorScheme(systemScheme, props.theme);
|
|
48
|
+
*
|
|
49
|
+
* normalizeColorScheme('dark', 'light'); // 'dark'
|
|
50
|
+
* normalizeColorScheme(null, 'dark'); // 'dark'
|
|
51
|
+
* normalizeColorScheme(undefined, undefined); // 'light'
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export const normalizeColorScheme = (
|
|
55
|
+
colorScheme?: string | null,
|
|
56
|
+
theme?: string
|
|
57
|
+
): ThemeValue => {
|
|
58
|
+
if (colorScheme === 'light' || colorScheme === 'dark') {
|
|
59
|
+
return colorScheme;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (theme === 'light' || theme === 'dark') {
|
|
63
|
+
return theme;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return 'light';
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Gets the opposite theme value.
|
|
71
|
+
*
|
|
72
|
+
* @param theme - Current theme value
|
|
73
|
+
* @returns The opposite theme ('light' → 'dark', 'dark' → 'light')
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```ts
|
|
77
|
+
* getOppositeTheme('light'); // 'dark'
|
|
78
|
+
* getOppositeTheme('dark'); // 'light'
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
export const getOppositeTheme = (theme: ThemeValue): ThemeValue =>
|
|
82
|
+
theme === 'light' ? 'dark' : 'light';
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Checks if the system prefers dark mode.
|
|
86
|
+
*
|
|
87
|
+
* This function only works in browser environments.
|
|
88
|
+
* Returns false in non-browser environments (Node.js, React Native).
|
|
89
|
+
*
|
|
90
|
+
* @returns true if system prefers dark mode, false otherwise
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* ```ts
|
|
94
|
+
* if (systemPrefersDarkMode()) {
|
|
95
|
+
* setTheme('dark');
|
|
96
|
+
* }
|
|
97
|
+
* ```
|
|
98
|
+
*/
|
|
99
|
+
export const systemPrefersDarkMode = (): boolean => {
|
|
100
|
+
if (typeof window === 'undefined') return false;
|
|
101
|
+
return window.matchMedia?.('(prefers-color-scheme: dark)').matches ?? false;
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Gets the system's preferred color scheme.
|
|
106
|
+
*
|
|
107
|
+
* @returns 'dark' if system prefers dark mode, 'light' otherwise
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* ```ts
|
|
111
|
+
* const theme = getSystemColorScheme();
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
export const getSystemColorScheme = (): ThemeValue =>
|
|
115
|
+
systemPrefersDarkMode() ? 'dark' : 'light';
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
declare module 'bip39' {
|
|
2
|
+
export interface Wordlist {
|
|
3
|
+
[index: number]: string;
|
|
4
|
+
length: number;
|
|
5
|
+
getWord(index: number): string;
|
|
6
|
+
getWordIndex(word: string): number;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const wordlists: {
|
|
10
|
+
english: string[];
|
|
11
|
+
chinese_simplified: string[];
|
|
12
|
+
chinese_traditional: string[];
|
|
13
|
+
french: string[];
|
|
14
|
+
italian: string[];
|
|
15
|
+
japanese: string[];
|
|
16
|
+
korean: string[];
|
|
17
|
+
spanish: string[];
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// Use Uint8Array instead of Buffer for React Native compatibility
|
|
21
|
+
// In Node.js, Buffer extends Uint8Array so this is compatible
|
|
22
|
+
export function generateMnemonic(strength?: number, rng?: (size: number) => Uint8Array, wordlist?: string[]): string;
|
|
23
|
+
export function mnemonicToSeed(mnemonic: string, passphrase?: string): Promise<Uint8Array>;
|
|
24
|
+
export function mnemonicToSeedSync(mnemonic: string, passphrase?: string): Uint8Array;
|
|
25
|
+
export function mnemonicToEntropy(mnemonic: string, wordlist?: string[]): string;
|
|
26
|
+
export function entropyToMnemonic(entropy: string, wordlist?: string[]): string;
|
|
27
|
+
export function validateMnemonic(mnemonic: string, wordlist?: string[]): boolean;
|
|
28
|
+
export function mnemonicToSeedHex(mnemonic: string, passphrase?: string): Promise<string>;
|
|
29
|
+
export function mnemonicToSeedHexSync(mnemonic: string, passphrase?: string): string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
declare module 'buffer' {
|
|
2
|
+
export class Buffer extends Uint8Array {
|
|
3
|
+
constructor(str: string, encoding?: string);
|
|
4
|
+
constructor(size: number);
|
|
5
|
+
constructor(array: Uint8Array);
|
|
6
|
+
constructor(arrayBuffer: ArrayBuffer);
|
|
7
|
+
constructor(array: ReadonlyArray<number>);
|
|
8
|
+
constructor(buffer: Buffer);
|
|
9
|
+
|
|
10
|
+
static from(arrayBuffer: ArrayBuffer, byteOffset?: number, length?: number): Buffer;
|
|
11
|
+
static from(data: Uint8Array | ReadonlyArray<number>): Buffer;
|
|
12
|
+
static from(str: string, encoding?: BufferEncoding): Buffer;
|
|
13
|
+
static from(object: { valueOf(): string | object } | { [Symbol.toPrimitive](hint: 'string'): string }, offsetOrEncoding?: number | string, length?: number): Buffer;
|
|
14
|
+
|
|
15
|
+
static alloc(size: number, fill?: string | Buffer | number, encoding?: BufferEncoding): Buffer;
|
|
16
|
+
static allocUnsafe(size: number): Buffer;
|
|
17
|
+
static allocUnsafeSlow(size: number): Buffer;
|
|
18
|
+
|
|
19
|
+
static isBuffer(obj: unknown): obj is Buffer;
|
|
20
|
+
static isEncoding(encoding: string): encoding is BufferEncoding;
|
|
21
|
+
static byteLength(string: string | Buffer | ArrayBuffer | SharedArrayBuffer, encoding?: BufferEncoding): number;
|
|
22
|
+
static concat(list: ReadonlyArray<Uint8Array>, totalLength?: number): Buffer;
|
|
23
|
+
static compare(buf1: Uint8Array, buf2: Uint8Array): number;
|
|
24
|
+
|
|
25
|
+
write(string: string, encoding?: BufferEncoding): number;
|
|
26
|
+
write(string: string, offset: number, encoding?: BufferEncoding): number;
|
|
27
|
+
write(string: string, offset: number, length: number, encoding?: BufferEncoding): number;
|
|
28
|
+
|
|
29
|
+
toString(encoding?: BufferEncoding, start?: number, end?: number): string;
|
|
30
|
+
toJSON(): { type: 'Buffer'; data: number[] };
|
|
31
|
+
|
|
32
|
+
equals(otherBuffer: Uint8Array): boolean;
|
|
33
|
+
compare(target: Uint8Array, targetStart?: number, targetEnd?: number, sourceStart?: number, sourceEnd?: number): number;
|
|
34
|
+
copy(target: Uint8Array, targetStart?: number, sourceStart?: number, sourceEnd?: number): number;
|
|
35
|
+
|
|
36
|
+
slice(start?: number, end?: number): Buffer;
|
|
37
|
+
subarray(start?: number, end?: number): Buffer;
|
|
38
|
+
|
|
39
|
+
readBigInt64BE(offset?: number): bigint;
|
|
40
|
+
readBigInt64LE(offset?: number): bigint;
|
|
41
|
+
readBigUInt64BE(offset?: number): bigint;
|
|
42
|
+
readBigUInt64LE(offset?: number): bigint;
|
|
43
|
+
readDoubleBE(offset?: number): number;
|
|
44
|
+
readDoubleLE(offset?: number): number;
|
|
45
|
+
readFloatBE(offset?: number): number;
|
|
46
|
+
readFloatLE(offset?: number): number;
|
|
47
|
+
readInt8(offset?: number): number;
|
|
48
|
+
readInt16BE(offset?: number): number;
|
|
49
|
+
readInt16LE(offset?: number): number;
|
|
50
|
+
readInt32BE(offset?: number): number;
|
|
51
|
+
readInt32LE(offset?: number): number;
|
|
52
|
+
readIntBE(offset: number, byteLength: number): number;
|
|
53
|
+
readIntLE(offset: number, byteLength: number): number;
|
|
54
|
+
readUInt8(offset?: number): number;
|
|
55
|
+
readUInt16BE(offset?: number): number;
|
|
56
|
+
readUInt16LE(offset?: number): number;
|
|
57
|
+
readUInt32BE(offset?: number): number;
|
|
58
|
+
readUInt32LE(offset?: number): number;
|
|
59
|
+
readUIntBE(offset: number, byteLength: number): number;
|
|
60
|
+
readUIntLE(offset: number, byteLength: number): number;
|
|
61
|
+
|
|
62
|
+
swap16(): Buffer;
|
|
63
|
+
swap32(): Buffer;
|
|
64
|
+
swap64(): Buffer;
|
|
65
|
+
|
|
66
|
+
writeBigInt64BE(value: bigint, offset?: number): number;
|
|
67
|
+
writeBigInt64LE(value: bigint, offset?: number): number;
|
|
68
|
+
writeBigUInt64BE(value: bigint, offset?: number): number;
|
|
69
|
+
writeBigUInt64LE(value: bigint, offset?: number): number;
|
|
70
|
+
writeDoubleBE(value: number, offset?: number): number;
|
|
71
|
+
writeDoubleLE(value: number, offset?: number): number;
|
|
72
|
+
writeFloatBE(value: number, offset?: number): number;
|
|
73
|
+
writeFloatLE(value: number, offset?: number): number;
|
|
74
|
+
writeInt8(value: number, offset?: number): number;
|
|
75
|
+
writeInt16BE(value: number, offset?: number): number;
|
|
76
|
+
writeInt16LE(value: number, offset?: number): number;
|
|
77
|
+
writeInt32BE(value: number, offset?: number): number;
|
|
78
|
+
writeInt32LE(value: number, offset?: number): number;
|
|
79
|
+
writeIntBE(value: number, offset: number, byteLength: number): number;
|
|
80
|
+
writeIntLE(value: number, offset: number, byteLength: number): number;
|
|
81
|
+
writeUInt8(value: number, offset?: number): number;
|
|
82
|
+
writeUInt16BE(value: number, offset?: number): number;
|
|
83
|
+
writeUInt16LE(value: number, offset?: number): number;
|
|
84
|
+
writeUInt32BE(value: number, offset?: number): number;
|
|
85
|
+
writeUInt32LE(value: number, offset?: number): number;
|
|
86
|
+
writeUIntBE(value: number, offset: number, byteLength: number): number;
|
|
87
|
+
writeUIntLE(value: number, offset: number, byteLength: number): number;
|
|
88
|
+
|
|
89
|
+
fill(value: string | Uint8Array | number, offset?: number, end?: number, encoding?: BufferEncoding): this;
|
|
90
|
+
indexOf(value: string | number | Uint8Array, byteOffset?: number, encoding?: BufferEncoding): number;
|
|
91
|
+
lastIndexOf(value: string | number | Uint8Array, byteOffset?: number, encoding?: BufferEncoding): number;
|
|
92
|
+
includes(value: string | number | Buffer, byteOffset?: number, encoding?: BufferEncoding): boolean;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
type BufferEncoding = 'ascii' | 'utf8' | 'utf-8' | 'utf16le' | 'ucs2' | 'ucs-2' | 'base64' | 'base64url' | 'latin1' | 'binary' | 'hex';
|
|
96
|
+
}
|
|
97
|
+
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
declare module 'color' {
|
|
2
|
+
interface Color {
|
|
3
|
+
(color: string | Color | undefined, model?: string): Color;
|
|
4
|
+
rgb(): Color;
|
|
5
|
+
rgba(): Color;
|
|
6
|
+
alpha(): number;
|
|
7
|
+
alpha(val: number): Color;
|
|
8
|
+
fade(val: number): Color;
|
|
9
|
+
lighten(val: number): Color;
|
|
10
|
+
darken(val: number): Color;
|
|
11
|
+
string(): string;
|
|
12
|
+
hex(): string;
|
|
13
|
+
toString(): string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function color(color: string | Color | undefined, model?: string): Color;
|
|
17
|
+
export default color;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
declare module 'elliptic' {
|
|
2
|
+
export interface KeyPair {
|
|
3
|
+
getPrivate(enc?: 'hex' | 'array' | 'bn'): string | number[] | any;
|
|
4
|
+
getPublic(enc?: 'hex'): string;
|
|
5
|
+
getPublic(enc?: 'array'): number[];
|
|
6
|
+
getPublic(compressed: boolean, enc?: 'hex'): string;
|
|
7
|
+
getPublic(compressed: boolean, enc?: 'array'): number[];
|
|
8
|
+
sign(msg: string | number[]): Signature;
|
|
9
|
+
verify(msg: string | number[], signature: Signature | string | { r: string | number[]; s: string | number[] }): boolean;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface Signature {
|
|
13
|
+
r: any;
|
|
14
|
+
s: any;
|
|
15
|
+
recoveryParam: number | null;
|
|
16
|
+
toDER(enc?: 'hex'): string;
|
|
17
|
+
toCompact(enc?: 'hex', param?: number): string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface Curve {
|
|
21
|
+
n: any;
|
|
22
|
+
red: any;
|
|
23
|
+
g: Point;
|
|
24
|
+
decodePoint(bytes: string | number[], enc?: string): Point;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface Point {
|
|
28
|
+
x: any;
|
|
29
|
+
y: any;
|
|
30
|
+
inf: boolean;
|
|
31
|
+
getX(): any;
|
|
32
|
+
getY(): any;
|
|
33
|
+
encode(enc?: string, compressed?: boolean): string | number[];
|
|
34
|
+
add(p: Point): Point;
|
|
35
|
+
mul(k: any): Point;
|
|
36
|
+
eq(p: Point): boolean;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export class EC {
|
|
40
|
+
constructor(curve: string | Curve);
|
|
41
|
+
keyFromPrivate(priv: string | number[], enc?: string): KeyPair;
|
|
42
|
+
keyFromPublic(pub: string | number[] | Point, enc?: string): KeyPair;
|
|
43
|
+
genKeyPair(opts?: { entropy?: string | number[]; pers?: string | number[] }): KeyPair;
|
|
44
|
+
keyPair(opts?: { priv?: string | number[]; pub?: string | number[] | Point; privEnc?: string; pubEnc?: string }): KeyPair;
|
|
45
|
+
curve: Curve;
|
|
46
|
+
n: any;
|
|
47
|
+
nh: any;
|
|
48
|
+
g: Point;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export type ECKeyPair = KeyPair;
|
|
52
|
+
|
|
53
|
+
// ec can be called as a function or used as a constructor
|
|
54
|
+
export interface ECConstructor {
|
|
55
|
+
new (curve: string | Curve): EC;
|
|
56
|
+
(curve: string | Curve): EC;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export const ec: ECConstructor;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for common API patterns
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Build URL search parameters from an object
|
|
7
|
+
* @param params Object with parameter key-value pairs
|
|
8
|
+
* @returns URLSearchParams instance
|
|
9
|
+
*/
|
|
10
|
+
export function buildSearchParams(params: Record<string, any>): URLSearchParams {
|
|
11
|
+
const searchParams = new URLSearchParams();
|
|
12
|
+
|
|
13
|
+
for (const [key, value] of Object.entries(params)) {
|
|
14
|
+
if (value !== undefined && value !== null) {
|
|
15
|
+
searchParams.append(key, value.toString());
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
return searchParams;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Build URL with search parameters
|
|
24
|
+
* @param baseUrl Base URL
|
|
25
|
+
* @param params Object with parameter key-value pairs
|
|
26
|
+
* @returns Complete URL with search parameters
|
|
27
|
+
*/
|
|
28
|
+
export function buildUrl(baseUrl: string, params?: Record<string, any>): string {
|
|
29
|
+
if (!params) return baseUrl;
|
|
30
|
+
|
|
31
|
+
const searchParams = buildSearchParams(params);
|
|
32
|
+
const queryString = searchParams.toString();
|
|
33
|
+
|
|
34
|
+
return queryString ? `${baseUrl}?${queryString}` : baseUrl;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Common pagination parameters
|
|
39
|
+
*/
|
|
40
|
+
export interface PaginationParams {
|
|
41
|
+
limit?: number;
|
|
42
|
+
offset?: number;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Build pagination search parameters
|
|
47
|
+
* @param params Pagination parameters
|
|
48
|
+
* @returns URLSearchParams with pagination
|
|
49
|
+
*/
|
|
50
|
+
export function buildPaginationParams(params: PaginationParams): URLSearchParams {
|
|
51
|
+
return buildSearchParams(params);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Common API response wrapper
|
|
56
|
+
*/
|
|
57
|
+
export interface ApiResponse<T = any> {
|
|
58
|
+
data: T;
|
|
59
|
+
message?: string;
|
|
60
|
+
success?: boolean;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Common error response wrapper
|
|
65
|
+
*/
|
|
66
|
+
export interface ErrorResponse {
|
|
67
|
+
message: string;
|
|
68
|
+
code: string;
|
|
69
|
+
status: number;
|
|
70
|
+
details?: any;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Safe JSON parsing with error handling
|
|
75
|
+
* @param data Data to parse
|
|
76
|
+
* @param fallback Fallback value if parsing fails
|
|
77
|
+
* @returns Parsed data or fallback
|
|
78
|
+
*/
|
|
79
|
+
export function safeJsonParse<T>(data: any, fallback: T): T {
|
|
80
|
+
if (typeof data === 'string') {
|
|
81
|
+
try {
|
|
82
|
+
return JSON.parse(data);
|
|
83
|
+
} catch {
|
|
84
|
+
return fallback;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return data as T;
|
|
88
|
+
}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Async utilities for common asynchronous patterns and error handling
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { TTLCache, registerCacheForCleanup } from './cache';
|
|
6
|
+
import { logger } from './loggerUtils';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Wrapper for async operations with automatic error handling
|
|
10
|
+
* Returns null on error instead of throwing
|
|
11
|
+
*/
|
|
12
|
+
export async function withErrorHandling<T>(
|
|
13
|
+
operation: () => Promise<T>,
|
|
14
|
+
errorHandler?: (error: any) => void,
|
|
15
|
+
context?: string
|
|
16
|
+
): Promise<T | null> {
|
|
17
|
+
try {
|
|
18
|
+
return await operation();
|
|
19
|
+
} catch (error) {
|
|
20
|
+
if (errorHandler) {
|
|
21
|
+
errorHandler(error);
|
|
22
|
+
} else {
|
|
23
|
+
logger.error(`Error in ${context || 'operation'}`, error instanceof Error ? error : new Error(String(error)), {
|
|
24
|
+
component: 'asyncUtils',
|
|
25
|
+
method: 'withErrorHandling',
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Execute multiple async operations in parallel with error handling
|
|
34
|
+
*/
|
|
35
|
+
export async function parallelWithErrorHandling<T>(
|
|
36
|
+
operations: (() => Promise<T>)[],
|
|
37
|
+
errorHandler?: (error: any, index: number) => void
|
|
38
|
+
): Promise<(T | null)[]> {
|
|
39
|
+
const results = await Promise.allSettled(
|
|
40
|
+
operations.map((op, index) =>
|
|
41
|
+
withErrorHandling(op, error => errorHandler?.(error, index))
|
|
42
|
+
)
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
return results.map(result =>
|
|
46
|
+
result.status === 'fulfilled' ? result.value : null
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Retry an async operation with exponential backoff
|
|
52
|
+
*
|
|
53
|
+
* By default, does not retry on 4xx errors (client errors).
|
|
54
|
+
* Use shouldRetry callback to customize retry behavior.
|
|
55
|
+
*/
|
|
56
|
+
export async function retryAsync<T>(
|
|
57
|
+
operation: () => Promise<T>,
|
|
58
|
+
maxRetries = 3,
|
|
59
|
+
baseDelay = 1000,
|
|
60
|
+
shouldRetry?: (error: any) => boolean
|
|
61
|
+
): Promise<T> {
|
|
62
|
+
let lastError: any;
|
|
63
|
+
|
|
64
|
+
// Default shouldRetry: don't retry on 4xx errors
|
|
65
|
+
const defaultShouldRetry = (error: any): boolean => {
|
|
66
|
+
// Don't retry on 4xx errors (client errors)
|
|
67
|
+
if (error?.response?.status >= 400 && error?.response?.status < 500) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
return true;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
const retryCheck = shouldRetry || defaultShouldRetry;
|
|
74
|
+
|
|
75
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
76
|
+
try {
|
|
77
|
+
return await operation();
|
|
78
|
+
} catch (error) {
|
|
79
|
+
lastError = error;
|
|
80
|
+
|
|
81
|
+
if (attempt === maxRetries) {
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (!retryCheck(error)) {
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Calculate delay with exponential backoff and jitter
|
|
90
|
+
const delay = baseDelay * Math.pow(2, attempt) + Math.random() * 1000;
|
|
91
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
throw lastError;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Debounce async function calls
|
|
100
|
+
*/
|
|
101
|
+
export function debounceAsync<T extends (...args: any[]) => Promise<any>>(
|
|
102
|
+
func: T,
|
|
103
|
+
delay: number
|
|
104
|
+
): (...args: Parameters<T>) => Promise<ReturnType<T>> {
|
|
105
|
+
let timeoutId: ReturnType<typeof setTimeout>;
|
|
106
|
+
const lastPromise: Promise<ReturnType<T>> | null = null;
|
|
107
|
+
|
|
108
|
+
return (...args: Parameters<T>): Promise<ReturnType<T>> => {
|
|
109
|
+
return new Promise((resolve, reject) => {
|
|
110
|
+
clearTimeout(timeoutId);
|
|
111
|
+
|
|
112
|
+
timeoutId = setTimeout(async () => {
|
|
113
|
+
try {
|
|
114
|
+
const result = await func(...args);
|
|
115
|
+
resolve(result);
|
|
116
|
+
} catch (error) {
|
|
117
|
+
reject(error);
|
|
118
|
+
}
|
|
119
|
+
}, delay);
|
|
120
|
+
});
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Throttle async function calls
|
|
126
|
+
*/
|
|
127
|
+
export function throttleAsync<T extends (...args: any[]) => Promise<any>>(
|
|
128
|
+
func: T,
|
|
129
|
+
limit: number,
|
|
130
|
+
interval: number
|
|
131
|
+
): (...args: Parameters<T>) => Promise<ReturnType<T>> {
|
|
132
|
+
let inThrottle = false;
|
|
133
|
+
let lastPromise: Promise<ReturnType<T>> | null = null;
|
|
134
|
+
|
|
135
|
+
return (...args: Parameters<T>): Promise<ReturnType<T>> => {
|
|
136
|
+
if (inThrottle) {
|
|
137
|
+
return lastPromise!;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
inThrottle = true;
|
|
141
|
+
lastPromise = func(...args);
|
|
142
|
+
|
|
143
|
+
setTimeout(() => {
|
|
144
|
+
inThrottle = false;
|
|
145
|
+
}, interval);
|
|
146
|
+
|
|
147
|
+
return lastPromise;
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Execute async operations sequentially with progress tracking
|
|
153
|
+
*/
|
|
154
|
+
export async function sequentialWithProgress<T>(
|
|
155
|
+
operations: (() => Promise<T>)[],
|
|
156
|
+
onProgress?: (completed: number, total: number) => void
|
|
157
|
+
): Promise<T[]> {
|
|
158
|
+
const results: T[] = [];
|
|
159
|
+
|
|
160
|
+
for (let i = 0; i < operations.length; i++) {
|
|
161
|
+
const result = await operations[i]();
|
|
162
|
+
results.push(result);
|
|
163
|
+
onProgress?.(i + 1, operations.length);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
return results;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Batch async operations
|
|
171
|
+
*/
|
|
172
|
+
export async function batchAsync<T>(
|
|
173
|
+
items: T[],
|
|
174
|
+
batchSize: number,
|
|
175
|
+
processor: (batch: T[]) => Promise<void>
|
|
176
|
+
): Promise<void> {
|
|
177
|
+
for (let i = 0; i < items.length; i += batchSize) {
|
|
178
|
+
const batch = items.slice(i, i + batchSize);
|
|
179
|
+
await processor(batch);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Create a cancellable async operation
|
|
185
|
+
*/
|
|
186
|
+
export function createCancellableAsync<T>(
|
|
187
|
+
operation: (signal: AbortSignal) => Promise<T>
|
|
188
|
+
): { execute: () => Promise<T>; cancel: () => void } {
|
|
189
|
+
let abortController: AbortController | null = null;
|
|
190
|
+
|
|
191
|
+
return {
|
|
192
|
+
execute: async () => {
|
|
193
|
+
abortController = new AbortController();
|
|
194
|
+
return await operation(abortController.signal);
|
|
195
|
+
},
|
|
196
|
+
cancel: () => {
|
|
197
|
+
abortController?.abort();
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Timeout wrapper for async operations
|
|
204
|
+
*/
|
|
205
|
+
export async function withTimeout<T>(
|
|
206
|
+
operation: Promise<T>,
|
|
207
|
+
timeoutMs: number,
|
|
208
|
+
timeoutMessage?: string
|
|
209
|
+
): Promise<T> {
|
|
210
|
+
const timeoutPromise = new Promise<never>((_, reject) => {
|
|
211
|
+
setTimeout(() => {
|
|
212
|
+
reject(new Error(timeoutMessage || `Operation timed out after ${timeoutMs}ms`));
|
|
213
|
+
}, timeoutMs);
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
return Promise.race([operation, timeoutPromise]);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Execute async operation with loading state
|
|
221
|
+
*/
|
|
222
|
+
export async function withLoadingState<T>(
|
|
223
|
+
operation: () => Promise<T>,
|
|
224
|
+
setLoading: (loading: boolean) => void
|
|
225
|
+
): Promise<T> {
|
|
226
|
+
setLoading(true);
|
|
227
|
+
try {
|
|
228
|
+
return await operation();
|
|
229
|
+
} finally {
|
|
230
|
+
setLoading(false);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Create a promise that resolves after a delay
|
|
236
|
+
*/
|
|
237
|
+
export const delay = (ms: number): Promise<void> =>
|
|
238
|
+
new Promise(resolve => setTimeout(resolve, ms));
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Execute async operation with retry on specific errors
|
|
242
|
+
*/
|
|
243
|
+
export async function retryOnError<T>(
|
|
244
|
+
operation: () => Promise<T>,
|
|
245
|
+
retryableErrors: (string | number)[],
|
|
246
|
+
maxRetries = 3
|
|
247
|
+
): Promise<T> {
|
|
248
|
+
return retryAsync(operation, maxRetries, 1000, (error) => {
|
|
249
|
+
const errorCode = error?.code || error?.status || error?.message;
|
|
250
|
+
return retryableErrors.includes(errorCode);
|
|
251
|
+
});
|
|
252
|
+
}
|