@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.
Files changed (277) hide show
  1. package/README.md +50 -0
  2. package/dist/cjs/AuthManager.js +361 -0
  3. package/dist/cjs/CrossDomainAuth.js +258 -0
  4. package/dist/cjs/HttpService.js +618 -0
  5. package/dist/cjs/OxyServices.base.js +263 -0
  6. package/dist/cjs/OxyServices.errors.js +22 -0
  7. package/dist/cjs/OxyServices.js +63 -0
  8. package/dist/cjs/constants/version.js +16 -0
  9. package/dist/cjs/crypto/index.js +20 -0
  10. package/dist/cjs/crypto/keyManager.js +887 -0
  11. package/dist/cjs/crypto/polyfill.js +64 -0
  12. package/dist/cjs/crypto/recoveryPhrase.js +169 -0
  13. package/dist/cjs/crypto/signatureService.js +296 -0
  14. package/dist/cjs/i18n/index.js +73 -0
  15. package/dist/cjs/i18n/locales/ar-SA.json +120 -0
  16. package/dist/cjs/i18n/locales/ca-ES.json +120 -0
  17. package/dist/cjs/i18n/locales/de-DE.json +120 -0
  18. package/dist/cjs/i18n/locales/en-US.json +956 -0
  19. package/dist/cjs/i18n/locales/es-ES.json +944 -0
  20. package/dist/cjs/i18n/locales/fr-FR.json +120 -0
  21. package/dist/cjs/i18n/locales/it-IT.json +120 -0
  22. package/dist/cjs/i18n/locales/ja-JP.json +119 -0
  23. package/dist/cjs/i18n/locales/ko-KR.json +120 -0
  24. package/dist/cjs/i18n/locales/locales/ar-SA.json +120 -0
  25. package/dist/cjs/i18n/locales/locales/ca-ES.json +120 -0
  26. package/dist/cjs/i18n/locales/locales/de-DE.json +120 -0
  27. package/dist/cjs/i18n/locales/locales/en-US.json +956 -0
  28. package/dist/cjs/i18n/locales/locales/es-ES.json +944 -0
  29. package/dist/cjs/i18n/locales/locales/fr-FR.json +120 -0
  30. package/dist/cjs/i18n/locales/locales/it-IT.json +120 -0
  31. package/dist/cjs/i18n/locales/locales/ja-JP.json +119 -0
  32. package/dist/cjs/i18n/locales/locales/ko-KR.json +120 -0
  33. package/dist/cjs/i18n/locales/locales/pt-PT.json +120 -0
  34. package/dist/cjs/i18n/locales/locales/zh-CN.json +120 -0
  35. package/dist/cjs/i18n/locales/pt-PT.json +120 -0
  36. package/dist/cjs/i18n/locales/zh-CN.json +120 -0
  37. package/dist/cjs/index.js +153 -0
  38. package/dist/cjs/mixins/OxyServices.analytics.js +49 -0
  39. package/dist/cjs/mixins/OxyServices.assets.js +380 -0
  40. package/dist/cjs/mixins/OxyServices.auth.js +259 -0
  41. package/dist/cjs/mixins/OxyServices.developer.js +97 -0
  42. package/dist/cjs/mixins/OxyServices.devices.js +116 -0
  43. package/dist/cjs/mixins/OxyServices.features.js +309 -0
  44. package/dist/cjs/mixins/OxyServices.fedcm.js +435 -0
  45. package/dist/cjs/mixins/OxyServices.karma.js +108 -0
  46. package/dist/cjs/mixins/OxyServices.language.js +154 -0
  47. package/dist/cjs/mixins/OxyServices.location.js +43 -0
  48. package/dist/cjs/mixins/OxyServices.payment.js +158 -0
  49. package/dist/cjs/mixins/OxyServices.popup.js +371 -0
  50. package/dist/cjs/mixins/OxyServices.privacy.js +162 -0
  51. package/dist/cjs/mixins/OxyServices.redirect.js +345 -0
  52. package/dist/cjs/mixins/OxyServices.security.js +81 -0
  53. package/dist/cjs/mixins/OxyServices.user.js +355 -0
  54. package/dist/cjs/mixins/OxyServices.utility.js +156 -0
  55. package/dist/cjs/mixins/index.js +79 -0
  56. package/dist/cjs/mixins/mixinHelpers.js +53 -0
  57. package/dist/cjs/models/interfaces.js +20 -0
  58. package/dist/cjs/models/session.js +2 -0
  59. package/dist/cjs/shared/index.js +70 -0
  60. package/dist/cjs/shared/utils/colorUtils.js +153 -0
  61. package/dist/cjs/shared/utils/debugUtils.js +73 -0
  62. package/dist/cjs/shared/utils/errorUtils.js +183 -0
  63. package/dist/cjs/shared/utils/index.js +49 -0
  64. package/dist/cjs/shared/utils/networkUtils.js +183 -0
  65. package/dist/cjs/shared/utils/themeUtils.js +106 -0
  66. package/dist/cjs/utils/apiUtils.js +61 -0
  67. package/dist/cjs/utils/asyncUtils.js +194 -0
  68. package/dist/cjs/utils/cache.js +226 -0
  69. package/dist/cjs/utils/deviceManager.js +205 -0
  70. package/dist/cjs/utils/errorUtils.js +154 -0
  71. package/dist/cjs/utils/index.js +26 -0
  72. package/dist/cjs/utils/languageUtils.js +165 -0
  73. package/dist/cjs/utils/loggerUtils.js +126 -0
  74. package/dist/cjs/utils/platform.js +144 -0
  75. package/dist/cjs/utils/requestUtils.js +209 -0
  76. package/dist/cjs/utils/sessionUtils.js +181 -0
  77. package/dist/cjs/utils/validationUtils.js +173 -0
  78. package/dist/esm/AuthManager.js +356 -0
  79. package/dist/esm/CrossDomainAuth.js +253 -0
  80. package/dist/esm/HttpService.js +614 -0
  81. package/dist/esm/OxyServices.base.js +259 -0
  82. package/dist/esm/OxyServices.errors.js +17 -0
  83. package/dist/esm/OxyServices.js +59 -0
  84. package/dist/esm/constants/version.js +13 -0
  85. package/dist/esm/crypto/index.js +13 -0
  86. package/dist/esm/crypto/keyManager.js +850 -0
  87. package/dist/esm/crypto/polyfill.js +61 -0
  88. package/dist/esm/crypto/recoveryPhrase.js +132 -0
  89. package/dist/esm/crypto/signatureService.js +259 -0
  90. package/dist/esm/i18n/index.js +69 -0
  91. package/dist/esm/i18n/locales/ar-SA.json +120 -0
  92. package/dist/esm/i18n/locales/ca-ES.json +120 -0
  93. package/dist/esm/i18n/locales/de-DE.json +120 -0
  94. package/dist/esm/i18n/locales/en-US.json +956 -0
  95. package/dist/esm/i18n/locales/es-ES.json +944 -0
  96. package/dist/esm/i18n/locales/fr-FR.json +120 -0
  97. package/dist/esm/i18n/locales/it-IT.json +120 -0
  98. package/dist/esm/i18n/locales/ja-JP.json +119 -0
  99. package/dist/esm/i18n/locales/ko-KR.json +120 -0
  100. package/dist/esm/i18n/locales/locales/ar-SA.json +120 -0
  101. package/dist/esm/i18n/locales/locales/ca-ES.json +120 -0
  102. package/dist/esm/i18n/locales/locales/de-DE.json +120 -0
  103. package/dist/esm/i18n/locales/locales/en-US.json +956 -0
  104. package/dist/esm/i18n/locales/locales/es-ES.json +944 -0
  105. package/dist/esm/i18n/locales/locales/fr-FR.json +120 -0
  106. package/dist/esm/i18n/locales/locales/it-IT.json +120 -0
  107. package/dist/esm/i18n/locales/locales/ja-JP.json +119 -0
  108. package/dist/esm/i18n/locales/locales/ko-KR.json +120 -0
  109. package/dist/esm/i18n/locales/locales/pt-PT.json +120 -0
  110. package/dist/esm/i18n/locales/locales/zh-CN.json +120 -0
  111. package/dist/esm/i18n/locales/pt-PT.json +120 -0
  112. package/dist/esm/i18n/locales/zh-CN.json +120 -0
  113. package/dist/esm/index.js +55 -0
  114. package/dist/esm/mixins/OxyServices.analytics.js +46 -0
  115. package/dist/esm/mixins/OxyServices.assets.js +377 -0
  116. package/dist/esm/mixins/OxyServices.auth.js +256 -0
  117. package/dist/esm/mixins/OxyServices.developer.js +94 -0
  118. package/dist/esm/mixins/OxyServices.devices.js +113 -0
  119. package/dist/esm/mixins/OxyServices.features.js +306 -0
  120. package/dist/esm/mixins/OxyServices.fedcm.js +433 -0
  121. package/dist/esm/mixins/OxyServices.karma.js +105 -0
  122. package/dist/esm/mixins/OxyServices.language.js +118 -0
  123. package/dist/esm/mixins/OxyServices.location.js +40 -0
  124. package/dist/esm/mixins/OxyServices.payment.js +155 -0
  125. package/dist/esm/mixins/OxyServices.popup.js +369 -0
  126. package/dist/esm/mixins/OxyServices.privacy.js +159 -0
  127. package/dist/esm/mixins/OxyServices.redirect.js +343 -0
  128. package/dist/esm/mixins/OxyServices.security.js +78 -0
  129. package/dist/esm/mixins/OxyServices.user.js +352 -0
  130. package/dist/esm/mixins/OxyServices.utility.js +153 -0
  131. package/dist/esm/mixins/index.js +76 -0
  132. package/dist/esm/mixins/mixinHelpers.js +48 -0
  133. package/dist/esm/models/interfaces.js +17 -0
  134. package/dist/esm/models/session.js +1 -0
  135. package/dist/esm/shared/index.js +31 -0
  136. package/dist/esm/shared/utils/colorUtils.js +143 -0
  137. package/dist/esm/shared/utils/debugUtils.js +65 -0
  138. package/dist/esm/shared/utils/errorUtils.js +170 -0
  139. package/dist/esm/shared/utils/index.js +15 -0
  140. package/dist/esm/shared/utils/networkUtils.js +173 -0
  141. package/dist/esm/shared/utils/themeUtils.js +98 -0
  142. package/dist/esm/utils/apiUtils.js +55 -0
  143. package/dist/esm/utils/asyncUtils.js +179 -0
  144. package/dist/esm/utils/cache.js +218 -0
  145. package/dist/esm/utils/deviceManager.js +168 -0
  146. package/dist/esm/utils/errorUtils.js +146 -0
  147. package/dist/esm/utils/index.js +7 -0
  148. package/dist/esm/utils/languageUtils.js +158 -0
  149. package/dist/esm/utils/loggerUtils.js +115 -0
  150. package/dist/esm/utils/platform.js +102 -0
  151. package/dist/esm/utils/requestUtils.js +203 -0
  152. package/dist/esm/utils/sessionUtils.js +171 -0
  153. package/dist/esm/utils/validationUtils.js +153 -0
  154. package/dist/types/AuthManager.d.ts +143 -0
  155. package/dist/types/CrossDomainAuth.d.ts +160 -0
  156. package/dist/types/HttpService.d.ts +163 -0
  157. package/dist/types/OxyServices.base.d.ts +126 -0
  158. package/dist/types/OxyServices.d.ts +81 -0
  159. package/dist/types/OxyServices.errors.d.ts +11 -0
  160. package/dist/types/constants/version.d.ts +13 -0
  161. package/dist/types/crypto/index.d.ts +11 -0
  162. package/dist/types/crypto/keyManager.d.ts +189 -0
  163. package/dist/types/crypto/polyfill.d.ts +11 -0
  164. package/dist/types/crypto/recoveryPhrase.d.ts +58 -0
  165. package/dist/types/crypto/signatureService.d.ts +86 -0
  166. package/dist/types/i18n/index.d.ts +3 -0
  167. package/dist/types/index.d.ts +50 -0
  168. package/dist/types/mixins/OxyServices.analytics.d.ts +66 -0
  169. package/dist/types/mixins/OxyServices.assets.d.ts +135 -0
  170. package/dist/types/mixins/OxyServices.auth.d.ts +186 -0
  171. package/dist/types/mixins/OxyServices.developer.d.ts +99 -0
  172. package/dist/types/mixins/OxyServices.devices.d.ts +96 -0
  173. package/dist/types/mixins/OxyServices.features.d.ts +228 -0
  174. package/dist/types/mixins/OxyServices.fedcm.d.ts +200 -0
  175. package/dist/types/mixins/OxyServices.karma.d.ts +85 -0
  176. package/dist/types/mixins/OxyServices.language.d.ts +81 -0
  177. package/dist/types/mixins/OxyServices.location.d.ts +64 -0
  178. package/dist/types/mixins/OxyServices.payment.d.ts +111 -0
  179. package/dist/types/mixins/OxyServices.popup.d.ts +205 -0
  180. package/dist/types/mixins/OxyServices.privacy.d.ts +122 -0
  181. package/dist/types/mixins/OxyServices.redirect.d.ts +245 -0
  182. package/dist/types/mixins/OxyServices.security.d.ts +78 -0
  183. package/dist/types/mixins/OxyServices.user.d.ts +182 -0
  184. package/dist/types/mixins/OxyServices.utility.d.ts +93 -0
  185. package/dist/types/mixins/index.d.ts +30 -0
  186. package/dist/types/mixins/mixinHelpers.d.ts +31 -0
  187. package/dist/types/models/interfaces.d.ts +415 -0
  188. package/dist/types/models/session.d.ts +27 -0
  189. package/dist/types/shared/index.d.ts +28 -0
  190. package/dist/types/shared/utils/colorUtils.d.ts +104 -0
  191. package/dist/types/shared/utils/debugUtils.d.ts +48 -0
  192. package/dist/types/shared/utils/errorUtils.d.ts +97 -0
  193. package/dist/types/shared/utils/index.d.ts +13 -0
  194. package/dist/types/shared/utils/networkUtils.d.ts +139 -0
  195. package/dist/types/shared/utils/themeUtils.d.ts +90 -0
  196. package/dist/types/utils/apiUtils.d.ts +53 -0
  197. package/dist/types/utils/asyncUtils.d.ts +58 -0
  198. package/dist/types/utils/cache.d.ts +127 -0
  199. package/dist/types/utils/deviceManager.d.ts +65 -0
  200. package/dist/types/utils/errorUtils.d.ts +46 -0
  201. package/dist/types/utils/index.d.ts +6 -0
  202. package/dist/types/utils/languageUtils.d.ts +37 -0
  203. package/dist/types/utils/loggerUtils.d.ts +48 -0
  204. package/dist/types/utils/platform.d.ts +40 -0
  205. package/dist/types/utils/requestUtils.d.ts +123 -0
  206. package/dist/types/utils/sessionUtils.d.ts +54 -0
  207. package/dist/types/utils/validationUtils.d.ts +85 -0
  208. package/package.json +84 -0
  209. package/src/AuthManager.ts +436 -0
  210. package/src/CrossDomainAuth.ts +307 -0
  211. package/src/HttpService.ts +752 -0
  212. package/src/OxyServices.base.ts +334 -0
  213. package/src/OxyServices.errors.ts +26 -0
  214. package/src/OxyServices.ts +129 -0
  215. package/src/constants/version.ts +15 -0
  216. package/src/crypto/index.ts +25 -0
  217. package/src/crypto/keyManager.ts +962 -0
  218. package/src/crypto/polyfill.ts +70 -0
  219. package/src/crypto/recoveryPhrase.ts +166 -0
  220. package/src/crypto/signatureService.ts +323 -0
  221. package/src/i18n/index.ts +75 -0
  222. package/src/i18n/locales/ar-SA.json +120 -0
  223. package/src/i18n/locales/ca-ES.json +120 -0
  224. package/src/i18n/locales/de-DE.json +120 -0
  225. package/src/i18n/locales/en-US.json +956 -0
  226. package/src/i18n/locales/es-ES.json +944 -0
  227. package/src/i18n/locales/fr-FR.json +120 -0
  228. package/src/i18n/locales/it-IT.json +120 -0
  229. package/src/i18n/locales/ja-JP.json +119 -0
  230. package/src/i18n/locales/ko-KR.json +120 -0
  231. package/src/i18n/locales/pt-PT.json +120 -0
  232. package/src/i18n/locales/zh-CN.json +120 -0
  233. package/src/index.ts +153 -0
  234. package/src/mixins/OxyServices.analytics.ts +53 -0
  235. package/src/mixins/OxyServices.assets.ts +412 -0
  236. package/src/mixins/OxyServices.auth.ts +358 -0
  237. package/src/mixins/OxyServices.developer.ts +114 -0
  238. package/src/mixins/OxyServices.devices.ts +119 -0
  239. package/src/mixins/OxyServices.features.ts +428 -0
  240. package/src/mixins/OxyServices.fedcm.ts +494 -0
  241. package/src/mixins/OxyServices.karma.ts +111 -0
  242. package/src/mixins/OxyServices.language.ts +127 -0
  243. package/src/mixins/OxyServices.location.ts +46 -0
  244. package/src/mixins/OxyServices.payment.ts +163 -0
  245. package/src/mixins/OxyServices.popup.ts +443 -0
  246. package/src/mixins/OxyServices.privacy.ts +182 -0
  247. package/src/mixins/OxyServices.redirect.ts +397 -0
  248. package/src/mixins/OxyServices.security.ts +103 -0
  249. package/src/mixins/OxyServices.user.ts +392 -0
  250. package/src/mixins/OxyServices.utility.ts +191 -0
  251. package/src/mixins/index.ts +91 -0
  252. package/src/mixins/mixinHelpers.ts +69 -0
  253. package/src/models/interfaces.ts +511 -0
  254. package/src/models/session.ts +30 -0
  255. package/src/shared/index.ts +82 -0
  256. package/src/shared/utils/colorUtils.ts +155 -0
  257. package/src/shared/utils/debugUtils.ts +73 -0
  258. package/src/shared/utils/errorUtils.ts +181 -0
  259. package/src/shared/utils/index.ts +59 -0
  260. package/src/shared/utils/networkUtils.ts +248 -0
  261. package/src/shared/utils/themeUtils.ts +115 -0
  262. package/src/types/bip39.d.ts +32 -0
  263. package/src/types/buffer.d.ts +97 -0
  264. package/src/types/color.d.ts +20 -0
  265. package/src/types/elliptic.d.ts +62 -0
  266. package/src/utils/apiUtils.ts +88 -0
  267. package/src/utils/asyncUtils.ts +252 -0
  268. package/src/utils/cache.ts +264 -0
  269. package/src/utils/deviceManager.ts +198 -0
  270. package/src/utils/errorUtils.ts +216 -0
  271. package/src/utils/index.ts +21 -0
  272. package/src/utils/languageUtils.ts +174 -0
  273. package/src/utils/loggerUtils.ts +153 -0
  274. package/src/utils/platform.ts +117 -0
  275. package/src/utils/requestUtils.ts +237 -0
  276. package/src/utils/sessionUtils.ts +206 -0
  277. 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';