@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,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OxyServices Base Class
|
|
3
|
+
*
|
|
4
|
+
* Contains core infrastructure, HTTP client, request management, and error handling
|
|
5
|
+
*/
|
|
6
|
+
import { jwtDecode } from 'jwt-decode';
|
|
7
|
+
import { handleHttpError } from './utils/errorUtils';
|
|
8
|
+
import { HttpService } from './HttpService';
|
|
9
|
+
import { OxyAuthenticationError, OxyAuthenticationTimeoutError } from './OxyServices.errors';
|
|
10
|
+
/**
|
|
11
|
+
* Base class for OxyServices with core infrastructure
|
|
12
|
+
*/
|
|
13
|
+
export class OxyServicesBase {
|
|
14
|
+
constructor(...args) {
|
|
15
|
+
const config = args[0];
|
|
16
|
+
if (!config || typeof config !== 'object') {
|
|
17
|
+
throw new Error('OxyConfig is required');
|
|
18
|
+
}
|
|
19
|
+
this.config = config;
|
|
20
|
+
this.cloudURL = config.cloudURL || 'https://cloud.oxy.so';
|
|
21
|
+
// Initialize unified HTTP service (handles auth, caching, deduplication, queuing, retry)
|
|
22
|
+
this.httpService = new HttpService(config);
|
|
23
|
+
}
|
|
24
|
+
// Test-only utility to reset global tokens between jest tests
|
|
25
|
+
static __resetTokensForTests() {
|
|
26
|
+
HttpService.__resetTokensForTests();
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Make a request with all performance optimizations
|
|
30
|
+
* This is the main method for all API calls - ensures authentication and performance features
|
|
31
|
+
*/
|
|
32
|
+
async makeRequest(method, url, data, options = {}) {
|
|
33
|
+
return this.httpService.request({
|
|
34
|
+
method,
|
|
35
|
+
url,
|
|
36
|
+
data: method !== 'GET' ? data : undefined,
|
|
37
|
+
params: method === 'GET' ? data : undefined,
|
|
38
|
+
...options,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
// ============================================================================
|
|
42
|
+
// CORE METHODS (HTTP Client, Token Management, Error Handling)
|
|
43
|
+
// ============================================================================
|
|
44
|
+
/**
|
|
45
|
+
* Get the configured Oxy API base URL
|
|
46
|
+
*/
|
|
47
|
+
getBaseURL() {
|
|
48
|
+
return this.httpService.getBaseURL();
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Get the HTTP service instance
|
|
52
|
+
* Useful for advanced use cases where direct access to the HTTP service is needed
|
|
53
|
+
*/
|
|
54
|
+
getClient() {
|
|
55
|
+
return this.httpService;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Get performance metrics
|
|
59
|
+
*/
|
|
60
|
+
getMetrics() {
|
|
61
|
+
return this.httpService.getMetrics();
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Clear request cache
|
|
65
|
+
*/
|
|
66
|
+
clearCache() {
|
|
67
|
+
this.httpService.clearCache();
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Clear specific cache entry
|
|
71
|
+
*/
|
|
72
|
+
clearCacheEntry(key) {
|
|
73
|
+
this.httpService.clearCacheEntry(key);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Get cache statistics
|
|
77
|
+
*/
|
|
78
|
+
getCacheStats() {
|
|
79
|
+
return this.httpService.getCacheStats();
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get the configured Oxy Cloud (file storage/CDN) URL
|
|
83
|
+
*/
|
|
84
|
+
getCloudURL() {
|
|
85
|
+
return this.cloudURL;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Set authentication tokens
|
|
89
|
+
*/
|
|
90
|
+
setTokens(accessToken, refreshToken = '') {
|
|
91
|
+
this.httpService.setTokens(accessToken, refreshToken);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Clear stored authentication tokens
|
|
95
|
+
*/
|
|
96
|
+
clearTokens() {
|
|
97
|
+
this.httpService.clearTokens();
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Get the current user ID from the access token
|
|
101
|
+
*/
|
|
102
|
+
getCurrentUserId() {
|
|
103
|
+
const accessToken = this.httpService.getAccessToken();
|
|
104
|
+
if (!accessToken) {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
try {
|
|
108
|
+
const decoded = jwtDecode(accessToken);
|
|
109
|
+
return decoded.userId || decoded.id || null;
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Check if the client has a valid access token (public method)
|
|
117
|
+
*/
|
|
118
|
+
hasValidToken() {
|
|
119
|
+
return this.httpService.hasAccessToken();
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Get the raw access token (for constructing anchor URLs when needed)
|
|
123
|
+
*/
|
|
124
|
+
getAccessToken() {
|
|
125
|
+
return this.httpService.getAccessToken();
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Wait for authentication to be ready
|
|
129
|
+
*
|
|
130
|
+
* Optimized for high-scale usage with immediate synchronous check and adaptive polling.
|
|
131
|
+
* Returns immediately if token is already available (0ms delay), otherwise uses
|
|
132
|
+
* adaptive polling that starts fast (50ms) and gradually increases to reduce CPU usage.
|
|
133
|
+
*
|
|
134
|
+
* @param timeoutMs Maximum time to wait in milliseconds (default: 5000ms)
|
|
135
|
+
* @returns Promise that resolves to true if authentication is ready, false if timeout
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* ```typescript
|
|
139
|
+
* const isReady = await oxyServices.waitForAuth(3000);
|
|
140
|
+
* if (isReady) {
|
|
141
|
+
* // Proceed with authenticated operations
|
|
142
|
+
* }
|
|
143
|
+
* ```
|
|
144
|
+
*/
|
|
145
|
+
async waitForAuth(timeoutMs = 5000) {
|
|
146
|
+
// Immediate synchronous check - no delay if token is ready
|
|
147
|
+
if (this.httpService.hasAccessToken()) {
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
const startTime = performance.now();
|
|
151
|
+
const maxTime = startTime + timeoutMs;
|
|
152
|
+
// Adaptive polling: start fast, then slow down to reduce CPU usage
|
|
153
|
+
let pollInterval = 50; // Start with 50ms
|
|
154
|
+
while (performance.now() < maxTime) {
|
|
155
|
+
await new Promise(resolve => setTimeout(resolve, pollInterval));
|
|
156
|
+
if (this.httpService.hasAccessToken()) {
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
// Increase interval after first few checks (adaptive polling)
|
|
160
|
+
// This reduces CPU usage for long waits while maintaining responsiveness
|
|
161
|
+
if (pollInterval < 200) {
|
|
162
|
+
pollInterval = Math.min(pollInterval * 1.5, 200);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Execute a function with automatic authentication retry logic
|
|
169
|
+
* This handles the common case where API calls are made before authentication completes
|
|
170
|
+
*/
|
|
171
|
+
async withAuthRetry(operation, operationName, options = {}) {
|
|
172
|
+
const { maxRetries = 2, retryDelay = 1000, authTimeoutMs = 5000 } = options;
|
|
173
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
174
|
+
try {
|
|
175
|
+
// First attempt: check if we have a token
|
|
176
|
+
if (!this.httpService.hasAccessToken()) {
|
|
177
|
+
if (attempt === 0) {
|
|
178
|
+
// On first attempt, wait briefly for authentication to complete
|
|
179
|
+
const authReady = await this.waitForAuth(authTimeoutMs);
|
|
180
|
+
if (!authReady) {
|
|
181
|
+
throw new OxyAuthenticationTimeoutError(operationName, authTimeoutMs);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
// On retry attempts, fail immediately if no token
|
|
186
|
+
throw new OxyAuthenticationError(`Authentication required: ${operationName} requires a valid access token.`, 'AUTH_REQUIRED');
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// Execute the operation
|
|
190
|
+
return await operation();
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
const isLastAttempt = attempt === maxRetries;
|
|
194
|
+
const errorObj = error && typeof error === 'object' ? error : null;
|
|
195
|
+
const isAuthError = errorObj?.response?.status === 401 ||
|
|
196
|
+
errorObj?.code === 'MISSING_TOKEN' ||
|
|
197
|
+
errorObj?.message?.includes('Authentication') ||
|
|
198
|
+
error instanceof OxyAuthenticationError;
|
|
199
|
+
if (isAuthError && !isLastAttempt && !(error instanceof OxyAuthenticationTimeoutError)) {
|
|
200
|
+
await new Promise(resolve => setTimeout(resolve, retryDelay));
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
// If it's not an auth error, or it's the last attempt, throw the error
|
|
204
|
+
if (error instanceof OxyAuthenticationError) {
|
|
205
|
+
throw error;
|
|
206
|
+
}
|
|
207
|
+
throw this.handleError(error);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// This should never be reached, but TypeScript requires it
|
|
211
|
+
throw new OxyAuthenticationError(`${operationName} failed after ${maxRetries + 1} attempts`);
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Validate the current access token with the server
|
|
215
|
+
*/
|
|
216
|
+
async validate() {
|
|
217
|
+
if (!this.hasValidToken()) {
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
try {
|
|
221
|
+
const res = await this.makeRequest('GET', '/api/auth/validate', undefined, {
|
|
222
|
+
cache: false,
|
|
223
|
+
retry: false,
|
|
224
|
+
});
|
|
225
|
+
return res.valid === true;
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Centralized error handling
|
|
233
|
+
*/
|
|
234
|
+
handleError(error) {
|
|
235
|
+
const api = handleHttpError(error);
|
|
236
|
+
// Ensure we always have a non-empty message
|
|
237
|
+
const message = api.message?.trim() || 'An unexpected error occurred';
|
|
238
|
+
const err = new Error(message);
|
|
239
|
+
err.code = api.code;
|
|
240
|
+
err.status = api.status;
|
|
241
|
+
err.details = api.details;
|
|
242
|
+
return err;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Health check endpoint
|
|
246
|
+
*/
|
|
247
|
+
async healthCheck() {
|
|
248
|
+
try {
|
|
249
|
+
return await this.makeRequest('GET', '/health', undefined, {
|
|
250
|
+
cache: false,
|
|
251
|
+
retry: false,
|
|
252
|
+
timeout: 5000
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
throw this.handleError(error);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom error types for better error handling
|
|
3
|
+
*/
|
|
4
|
+
export class OxyAuthenticationError extends Error {
|
|
5
|
+
constructor(message, code = 'AUTH_ERROR', status = 401) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = 'OxyAuthenticationError';
|
|
8
|
+
this.code = code;
|
|
9
|
+
this.status = status;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export class OxyAuthenticationTimeoutError extends OxyAuthenticationError {
|
|
13
|
+
constructor(operationName, timeoutMs) {
|
|
14
|
+
super(`Authentication timeout (${timeoutMs}ms): ${operationName} requires user authentication. Please ensure the user is logged in before calling this method.`, 'AUTH_TIMEOUT', 408);
|
|
15
|
+
this.name = 'OxyAuthenticationTimeoutError';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { OxyAuthenticationError, OxyAuthenticationTimeoutError } from './OxyServices.errors';
|
|
2
|
+
// Import mixin composition helper
|
|
3
|
+
import { composeOxyServices } from './mixins';
|
|
4
|
+
/**
|
|
5
|
+
* OxyServices - Unified client library for interacting with the Oxy API
|
|
6
|
+
*
|
|
7
|
+
* This class provides all API functionality in one simple, easy-to-use interface.
|
|
8
|
+
*
|
|
9
|
+
* ## Architecture
|
|
10
|
+
* - **HttpService**: Unified HTTP service handling authentication, caching, deduplication, queuing, and retry
|
|
11
|
+
* - **OxyServices**: Provides high-level API methods
|
|
12
|
+
*
|
|
13
|
+
* ## Mixin Composition
|
|
14
|
+
* The class is composed using TypeScript mixins for better code organization:
|
|
15
|
+
* - **Base**: Core infrastructure (HTTP client, request management, error handling)
|
|
16
|
+
* - **Auth**: Authentication and session management
|
|
17
|
+
* - **User**: User profiles, follow, notifications
|
|
18
|
+
* - **Privacy**: Blocked and restricted users
|
|
19
|
+
* - **Language**: Language detection and metadata
|
|
20
|
+
* - **Payment**: Payment processing
|
|
21
|
+
* - **Karma**: Karma system
|
|
22
|
+
* - **Assets**: File upload and asset management
|
|
23
|
+
* - **Developer**: Developer API management
|
|
24
|
+
* - **Location**: Location-based features
|
|
25
|
+
* - **Analytics**: Analytics tracking
|
|
26
|
+
* - **Devices**: Device management
|
|
27
|
+
* - **Utility**: Utility methods and Express middleware
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* const oxy = new OxyServices({
|
|
32
|
+
* baseURL: 'https://api.oxy.so',
|
|
33
|
+
* cloudURL: 'https://cloud.oxy.so'
|
|
34
|
+
* });
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
// Compose all mixins into the final OxyServices class
|
|
38
|
+
const OxyServicesComposed = composeOxyServices();
|
|
39
|
+
// Export as a named class to avoid TypeScript issues with anonymous class types
|
|
40
|
+
export class OxyServices extends OxyServicesComposed {
|
|
41
|
+
constructor(config) {
|
|
42
|
+
super(config);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Re-export error classes for convenience
|
|
46
|
+
export { OxyAuthenticationError, OxyAuthenticationTimeoutError };
|
|
47
|
+
/**
|
|
48
|
+
* Export the default Oxy Cloud URL (for backward compatibility)
|
|
49
|
+
*/
|
|
50
|
+
export const OXY_CLOUD_URL = 'https://cloud.oxy.so';
|
|
51
|
+
/**
|
|
52
|
+
* Export the default Oxy API URL (for documentation)
|
|
53
|
+
*/
|
|
54
|
+
export const OXY_API_URL = (typeof process !== 'undefined' && process.env && process.env.OXY_API_URL) || 'https://api.oxy.so';
|
|
55
|
+
/**
|
|
56
|
+
* Pre-configured client instance for easy import
|
|
57
|
+
* Uses OXY_API_URL as baseURL and OXY_CLOUD_URL as cloudURL
|
|
58
|
+
*/
|
|
59
|
+
export const oxyClient = new OxyServices({ baseURL: OXY_API_URL, cloudURL: OXY_CLOUD_URL });
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Package version and metadata constants
|
|
3
|
+
* This file is auto-generated to avoid runtime dependency on package.json
|
|
4
|
+
*/
|
|
5
|
+
export const packageInfo = {
|
|
6
|
+
name: "@oxyhq/services",
|
|
7
|
+
version: "5.2.1",
|
|
8
|
+
description: "Reusable OxyHQ module to handle authentication, user management, karma system and more 🚀",
|
|
9
|
+
main: "lib/commonjs/node/index.js",
|
|
10
|
+
module: "lib/module/node/index.js",
|
|
11
|
+
types: "lib/typescript/node/index.d.ts"
|
|
12
|
+
};
|
|
13
|
+
export const { name, version, description } = packageInfo;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Oxy Crypto Module
|
|
3
|
+
*
|
|
4
|
+
* Provides cryptographic identity management for the Oxy ecosystem.
|
|
5
|
+
* Handles key generation, secure storage, digital signatures, and recovery phrases.
|
|
6
|
+
*/
|
|
7
|
+
// Import polyfills first - this ensures Buffer is available for bip39 and other libraries
|
|
8
|
+
import './polyfill';
|
|
9
|
+
export { KeyManager } from './keyManager';
|
|
10
|
+
export { SignatureService } from './signatureService';
|
|
11
|
+
export { RecoveryPhraseService } from './recoveryPhrase';
|
|
12
|
+
// Re-export for convenience
|
|
13
|
+
export { KeyManager as default } from './keyManager';
|