@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,205 @@
1
+ import type { OxyServicesBase } from '../OxyServices.base';
2
+ import type { SessionLoginResponse } from '../models/session';
3
+ export interface PopupAuthOptions {
4
+ width?: number;
5
+ height?: number;
6
+ timeout?: number;
7
+ mode?: 'login' | 'signup';
8
+ }
9
+ export interface SilentAuthOptions {
10
+ timeout?: number;
11
+ }
12
+ /**
13
+ * Popup-based Cross-Domain Authentication Mixin
14
+ *
15
+ * Implements OAuth2-style authentication using popup windows and postMessage.
16
+ * This is the primary authentication method for modern browsers, providing a
17
+ * Google-like experience without full page redirects.
18
+ *
19
+ * Flow:
20
+ * 1. Opens small popup window to auth.oxy.so
21
+ * 2. User signs in (auth.oxy.so sets its own first-party cookie)
22
+ * 3. auth.oxy.so sends token back via postMessage
23
+ * 4. Popup closes, parent app has the session
24
+ *
25
+ * Features:
26
+ * - No full page redirect (preserves app state)
27
+ * - Works across different domains (homiio.com, mention.earth, etc.)
28
+ * - Silent refresh using hidden iframe for seamless SSO
29
+ * - CSRF protection via state parameter
30
+ * - XSS protection via origin validation
31
+ *
32
+ * Browser Support: All modern browsers (IE11+)
33
+ */
34
+ export declare function OxyServicesPopupAuthMixin<T extends typeof OxyServicesBase>(Base: T): {
35
+ new (...args: any[]): {
36
+ /**
37
+ * Sign in using popup window
38
+ *
39
+ * Opens a centered popup window to auth.oxy.so where the user can sign in.
40
+ * The popup automatically closes after successful authentication and the
41
+ * session is returned to the parent window.
42
+ *
43
+ * @param options - Popup configuration options
44
+ * @returns Session with access token and user data
45
+ * @throws {OxyAuthenticationError} If popup is blocked or auth fails
46
+ *
47
+ * @example
48
+ * ```typescript
49
+ * const handleSignIn = async () => {
50
+ * try {
51
+ * const session = await oxyServices.signInWithPopup();
52
+ * console.log('Signed in:', session.user);
53
+ * } catch (error) {
54
+ * if (error.message.includes('blocked')) {
55
+ * alert('Please allow popups for this site');
56
+ * }
57
+ * }
58
+ * };
59
+ * ```
60
+ */
61
+ signInWithPopup(options?: PopupAuthOptions): Promise<SessionLoginResponse>;
62
+ /**
63
+ * Sign up using popup window
64
+ *
65
+ * Same as signInWithPopup but opens the signup page by default.
66
+ *
67
+ * @param options - Popup configuration options
68
+ * @returns Session with access token and user data
69
+ */
70
+ signUpWithPopup(options?: PopupAuthOptions): Promise<SessionLoginResponse>;
71
+ /**
72
+ * Silent sign-in using hidden iframe
73
+ *
74
+ * Attempts to automatically re-authenticate the user without any UI.
75
+ * This is what enables seamless SSO across all Oxy domains.
76
+ *
77
+ * How it works:
78
+ * 1. Creates hidden iframe pointing to auth.oxy.so/silent-auth
79
+ * 2. If user has valid session at auth.oxy.so, it sends token via postMessage
80
+ * 3. If not, iframe responds with null (no error thrown)
81
+ *
82
+ * This should be called on app startup to check for existing sessions.
83
+ *
84
+ * @param options - Silent auth options
85
+ * @returns Session if user is signed in, null otherwise
86
+ *
87
+ * @example
88
+ * ```typescript
89
+ * useEffect(() => {
90
+ * const checkAuth = async () => {
91
+ * const session = await oxyServices.silentSignIn();
92
+ * if (session) {
93
+ * setUser(session.user);
94
+ * }
95
+ * };
96
+ * checkAuth();
97
+ * }, []);
98
+ * ```
99
+ */
100
+ silentSignIn(options?: SilentAuthOptions): Promise<SessionLoginResponse | null>;
101
+ /**
102
+ * Open a centered popup window
103
+ *
104
+ * @private
105
+ */
106
+ openCenteredPopup(url: string, title: string, width: number, height: number): Window | null;
107
+ /**
108
+ * Wait for authentication response from popup
109
+ *
110
+ * @private
111
+ */
112
+ waitForPopupAuth(popup: Window, expectedState: string, timeout: number): Promise<SessionLoginResponse>;
113
+ /**
114
+ * Wait for authentication response from iframe
115
+ *
116
+ * @private
117
+ */
118
+ waitForIframeAuth(iframe: HTMLIFrameElement, timeout: number, expectedOrigin: string): Promise<SessionLoginResponse | null>;
119
+ /**
120
+ * Build authentication URL with query parameters
121
+ *
122
+ * @private
123
+ */
124
+ buildAuthUrl(params: {
125
+ mode: string;
126
+ state: string;
127
+ nonce: string;
128
+ clientId: string;
129
+ redirectUri: string;
130
+ }): string;
131
+ /**
132
+ * Generate cryptographically secure state for CSRF protection
133
+ *
134
+ * @private
135
+ */
136
+ generateState(): string;
137
+ /**
138
+ * Generate nonce for replay attack prevention
139
+ *
140
+ * @private
141
+ */
142
+ generateNonce(): string;
143
+ /**
144
+ * Store auth state in session storage
145
+ *
146
+ * @private
147
+ */
148
+ storeAuthState(state: string, nonce: string): void;
149
+ /**
150
+ * Clear auth state from session storage
151
+ *
152
+ * @private
153
+ */
154
+ clearAuthState(state: string): void;
155
+ httpService: import("../HttpService").HttpService;
156
+ cloudURL: string;
157
+ config: import("../OxyServices.base").OxyConfig;
158
+ makeRequest<T_1>(method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE", url: string, data?: any, options?: import("../HttpService").RequestOptions): Promise<T_1>;
159
+ getBaseURL(): string;
160
+ getClient(): import("../HttpService").HttpService;
161
+ getMetrics(): {
162
+ totalRequests: number;
163
+ successfulRequests: number;
164
+ failedRequests: number;
165
+ cacheHits: number;
166
+ cacheMisses: number;
167
+ averageResponseTime: number;
168
+ };
169
+ clearCache(): void;
170
+ clearCacheEntry(key: string): void;
171
+ getCacheStats(): {
172
+ size: number;
173
+ hits: number;
174
+ misses: number;
175
+ hitRate: number;
176
+ };
177
+ getCloudURL(): string;
178
+ setTokens(accessToken: string, refreshToken?: string): void;
179
+ clearTokens(): void;
180
+ getCurrentUserId(): string | null;
181
+ hasValidToken(): boolean;
182
+ getAccessToken(): string | null;
183
+ waitForAuth(timeoutMs?: number): Promise<boolean>;
184
+ withAuthRetry<T_1>(operation: () => Promise<T_1>, operationName: string, options?: {
185
+ maxRetries?: number;
186
+ retryDelay?: number;
187
+ authTimeoutMs?: number;
188
+ }): Promise<T_1>;
189
+ validate(): Promise<boolean>;
190
+ handleError(error: unknown): Error;
191
+ healthCheck(): Promise<{
192
+ status: string;
193
+ users?: number;
194
+ timestamp?: string;
195
+ [key: string]: any;
196
+ }>;
197
+ };
198
+ readonly AUTH_URL: "https://auth.oxy.so";
199
+ readonly POPUP_WIDTH: 500;
200
+ readonly POPUP_HEIGHT: 700;
201
+ readonly POPUP_TIMEOUT: 60000;
202
+ readonly SILENT_TIMEOUT: 5000;
203
+ __resetTokensForTests(): void;
204
+ } & T;
205
+ export { OxyServicesPopupAuthMixin as PopupAuthMixin };
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Privacy Methods Mixin (Blocked & Restricted Users)
3
+ */
4
+ import type { BlockedUser, RestrictedUser } from '../models/interfaces';
5
+ import type { OxyServicesBase } from '../OxyServices.base';
6
+ export declare function OxyServicesPrivacyMixin<T extends typeof OxyServicesBase>(Base: T): {
7
+ new (...args: any[]): {
8
+ /**
9
+ * Extract user ID from blocked/restricted user object
10
+ */
11
+ extractUserId(userIdField: string | {
12
+ _id: string;
13
+ username?: string;
14
+ avatar?: string;
15
+ }): string;
16
+ /**
17
+ * Check if a user is in a list (blocked or restricted)
18
+ */
19
+ isUserInList<T_1 extends BlockedUser | RestrictedUser>(userId: string, getUserList: () => Promise<T_1[]>, getIdField: (item: T_1) => string | {
20
+ _id: string;
21
+ username?: string;
22
+ avatar?: string;
23
+ }): Promise<boolean>;
24
+ /**
25
+ * Get list of blocked users
26
+ * @returns Array of blocked users
27
+ */
28
+ getBlockedUsers(): Promise<BlockedUser[]>;
29
+ /**
30
+ * Block a user
31
+ * @param userId - The user ID to block
32
+ * @returns Success message
33
+ */
34
+ blockUser(userId: string): Promise<{
35
+ message: string;
36
+ }>;
37
+ /**
38
+ * Unblock a user
39
+ * @param userId - The user ID to unblock
40
+ * @returns Success message
41
+ */
42
+ unblockUser(userId: string): Promise<{
43
+ message: string;
44
+ }>;
45
+ /**
46
+ * Check if a user is blocked
47
+ * @param userId - The user ID to check
48
+ * @returns True if the user is blocked, false otherwise
49
+ */
50
+ isUserBlocked(userId: string): Promise<boolean>;
51
+ /**
52
+ * Get list of restricted users
53
+ * @returns Array of restricted users
54
+ */
55
+ getRestrictedUsers(): Promise<RestrictedUser[]>;
56
+ /**
57
+ * Restrict a user (limit their interactions without fully blocking)
58
+ * @param userId - The user ID to restrict
59
+ * @returns Success message
60
+ */
61
+ restrictUser(userId: string): Promise<{
62
+ message: string;
63
+ }>;
64
+ /**
65
+ * Unrestrict a user
66
+ * @param userId - The user ID to unrestrict
67
+ * @returns Success message
68
+ */
69
+ unrestrictUser(userId: string): Promise<{
70
+ message: string;
71
+ }>;
72
+ /**
73
+ * Check if a user is restricted
74
+ * @param userId - The user ID to check
75
+ * @returns True if the user is restricted, false otherwise
76
+ */
77
+ isUserRestricted(userId: string): Promise<boolean>;
78
+ httpService: import("../HttpService").HttpService;
79
+ cloudURL: string;
80
+ config: import("../OxyServices.base").OxyConfig;
81
+ makeRequest<T_1>(method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE", url: string, data?: any, options?: import("../HttpService").RequestOptions): Promise<T_1>;
82
+ getBaseURL(): string;
83
+ getClient(): import("../HttpService").HttpService;
84
+ getMetrics(): {
85
+ totalRequests: number;
86
+ successfulRequests: number;
87
+ failedRequests: number;
88
+ cacheHits: number;
89
+ cacheMisses: number;
90
+ averageResponseTime: number;
91
+ };
92
+ clearCache(): void;
93
+ clearCacheEntry(key: string): void;
94
+ getCacheStats(): {
95
+ size: number;
96
+ hits: number;
97
+ misses: number;
98
+ hitRate: number;
99
+ };
100
+ getCloudURL(): string;
101
+ setTokens(accessToken: string, refreshToken?: string): void;
102
+ clearTokens(): void;
103
+ getCurrentUserId(): string | null;
104
+ hasValidToken(): boolean;
105
+ getAccessToken(): string | null;
106
+ waitForAuth(timeoutMs?: number): Promise<boolean>;
107
+ withAuthRetry<T_1>(operation: () => Promise<T_1>, operationName: string, options?: {
108
+ maxRetries?: number;
109
+ retryDelay?: number;
110
+ authTimeoutMs?: number;
111
+ }): Promise<T_1>;
112
+ validate(): Promise<boolean>;
113
+ handleError(error: unknown): Error;
114
+ healthCheck(): Promise<{
115
+ status: string;
116
+ users?: number;
117
+ timestamp?: string;
118
+ [key: string]: any;
119
+ }>;
120
+ };
121
+ __resetTokensForTests(): void;
122
+ } & T;
@@ -0,0 +1,245 @@
1
+ import type { OxyServicesBase } from '../OxyServices.base';
2
+ import type { SessionLoginResponse } from '../models/session';
3
+ export interface RedirectAuthOptions {
4
+ redirectUri?: string;
5
+ mode?: 'login' | 'signup';
6
+ preserveUrl?: boolean;
7
+ }
8
+ /**
9
+ * Redirect-based Cross-Domain Authentication Mixin
10
+ *
11
+ * Implements traditional OAuth2 redirect flow as a fallback when popup or
12
+ * FedCM are not available or fail (e.g., mobile browsers, popup blockers).
13
+ *
14
+ * Flow:
15
+ * 1. Save current URL
16
+ * 2. Redirect to auth.oxy.so/login
17
+ * 3. User signs in
18
+ * 4. Redirect back with token in URL
19
+ * 5. Extract token, restore session, clean URL
20
+ *
21
+ * Features:
22
+ * - Works on all browsers (including old mobile browsers)
23
+ * - Automatic URL cleanup after auth
24
+ * - State preservation option
25
+ * - CSRF protection via state parameter
26
+ *
27
+ * Trade-offs:
28
+ * - Loses JavaScript app state (full page navigation)
29
+ * - Visible redirect (user sees navigation)
30
+ * - Slower perceived performance
31
+ */
32
+ export declare function OxyServicesRedirectAuthMixin<T extends typeof OxyServicesBase>(Base: T): {
33
+ new (...args: any[]): {
34
+ /**
35
+ * Sign in using full page redirect
36
+ *
37
+ * Redirects the user to auth.oxy.so for authentication. After successful
38
+ * sign-in, the user will be redirected back to the current page (or custom
39
+ * redirect URI) with authentication tokens in the URL.
40
+ *
41
+ * Call handleAuthCallback() on app startup to complete the flow.
42
+ *
43
+ * @param options - Redirect configuration options
44
+ *
45
+ * @example
46
+ * ```typescript
47
+ * // Initiate sign-in
48
+ * const handleSignIn = () => {
49
+ * oxyServices.signInWithRedirect();
50
+ * };
51
+ *
52
+ * // Handle callback on app startup
53
+ * useEffect(() => {
54
+ * const session = oxyServices.handleAuthCallback();
55
+ * if (session) {
56
+ * setUser(session.user);
57
+ * }
58
+ * }, []);
59
+ * ```
60
+ */
61
+ signInWithRedirect(options?: RedirectAuthOptions): void;
62
+ /**
63
+ * Sign up using full page redirect
64
+ *
65
+ * Same as signInWithRedirect but opens the signup page by default.
66
+ */
67
+ signUpWithRedirect(options?: RedirectAuthOptions): void;
68
+ /**
69
+ * Handle authentication callback
70
+ *
71
+ * Call this on app startup to check if the current page load is a
72
+ * redirect back from the authentication server. If it is, this method
73
+ * will extract the tokens, store them, and clean up the URL.
74
+ *
75
+ * @returns Session data if this is a callback, null otherwise
76
+ * @throws {OxyAuthenticationError} If state validation fails (CSRF attack)
77
+ *
78
+ * @example
79
+ * ```typescript
80
+ * // In your app's root component or startup logic
81
+ * useEffect(() => {
82
+ * try {
83
+ * const session = oxyServices.handleAuthCallback();
84
+ * if (session) {
85
+ * console.log('Logged in:', session.user);
86
+ * setUser(session.user);
87
+ * } else {
88
+ * // Not a callback, check for existing session
89
+ * const restored = oxyServices.restoreSession();
90
+ * if (!restored) {
91
+ * // No session, show login button
92
+ * }
93
+ * }
94
+ * } catch (error) {
95
+ * console.error('Auth callback failed:', error);
96
+ * }
97
+ * }, []);
98
+ * ```
99
+ */
100
+ handleAuthCallback(): SessionLoginResponse | null;
101
+ /**
102
+ * Restore session from storage
103
+ *
104
+ * Attempts to restore a previously authenticated session from localStorage.
105
+ * Call this on app startup if handleAuthCallback() returns null.
106
+ *
107
+ * @returns True if session was restored, false otherwise
108
+ *
109
+ * @example
110
+ * ```typescript
111
+ * useEffect(() => {
112
+ * const session = oxyServices.handleAuthCallback();
113
+ * if (!session) {
114
+ * const restored = oxyServices.restoreSession();
115
+ * if (!restored) {
116
+ * // No session, user needs to sign in
117
+ * setShowLogin(true);
118
+ * }
119
+ * }
120
+ * }, []);
121
+ * ```
122
+ */
123
+ restoreSession(): boolean;
124
+ /**
125
+ * Clear stored session
126
+ *
127
+ * Removes all authentication data from storage. Call this on logout.
128
+ */
129
+ clearStoredSession(): void;
130
+ /**
131
+ * Get stored session ID
132
+ */
133
+ getStoredSessionId(): string | null;
134
+ /**
135
+ * Build authentication URL with query parameters
136
+ *
137
+ * @private
138
+ */
139
+ buildAuthUrl(params: {
140
+ mode: string;
141
+ redirectUri: string;
142
+ state: string;
143
+ nonce: string;
144
+ clientId: string;
145
+ }): string;
146
+ /**
147
+ * Store tokens in localStorage
148
+ *
149
+ * @private
150
+ */
151
+ storeTokens(accessToken: string, sessionId: string): void;
152
+ /**
153
+ * Generate cryptographically secure state for CSRF protection
154
+ *
155
+ * @private
156
+ */
157
+ generateState(): string;
158
+ /**
159
+ * Generate nonce for replay attack prevention
160
+ *
161
+ * @private
162
+ */
163
+ generateNonce(): string;
164
+ /**
165
+ * Store auth state in session storage
166
+ *
167
+ * @private
168
+ */
169
+ storeAuthState(state: string, nonce: string): void;
170
+ /**
171
+ * Get stored state
172
+ *
173
+ * @private
174
+ */
175
+ getStoredState(): string | null;
176
+ /**
177
+ * Clear auth state from storage
178
+ *
179
+ * @private
180
+ */
181
+ clearAuthState(): void;
182
+ /**
183
+ * Save pre-authentication URL to restore later
184
+ *
185
+ * @private
186
+ */
187
+ savePreAuthUrl(url: string): void;
188
+ /**
189
+ * Clean authentication parameters from URL
190
+ *
191
+ * @private
192
+ */
193
+ cleanAuthCallbackUrl(url: URL): void;
194
+ httpService: import("../HttpService").HttpService;
195
+ cloudURL: string;
196
+ config: import("../OxyServices.base").OxyConfig;
197
+ makeRequest<T_1>(method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE", url: string, data?: any, options?: import("../HttpService").RequestOptions): Promise<T_1>;
198
+ getBaseURL(): string;
199
+ getClient(): import("../HttpService").HttpService;
200
+ getMetrics(): {
201
+ totalRequests: number;
202
+ successfulRequests: number;
203
+ failedRequests: number;
204
+ cacheHits: number;
205
+ cacheMisses: number;
206
+ averageResponseTime: number;
207
+ };
208
+ clearCache(): void;
209
+ clearCacheEntry(key: string): void;
210
+ getCacheStats(): {
211
+ size: number;
212
+ hits: number;
213
+ misses: number;
214
+ hitRate: number;
215
+ };
216
+ getCloudURL(): string;
217
+ setTokens(accessToken: string, refreshToken?: string): void;
218
+ clearTokens(): void;
219
+ getCurrentUserId(): string | null;
220
+ hasValidToken(): boolean;
221
+ getAccessToken(): string | null;
222
+ waitForAuth(timeoutMs?: number): Promise<boolean>;
223
+ withAuthRetry<T_1>(operation: () => Promise<T_1>, operationName: string, options?: {
224
+ maxRetries?: number;
225
+ retryDelay?: number;
226
+ authTimeoutMs?: number;
227
+ }): Promise<T_1>;
228
+ validate(): Promise<boolean>;
229
+ handleError(error: unknown): Error;
230
+ healthCheck(): Promise<{
231
+ status: string;
232
+ users?: number;
233
+ timestamp?: string;
234
+ [key: string]: any;
235
+ }>;
236
+ };
237
+ readonly AUTH_URL: "https://auth.oxy.so";
238
+ readonly TOKEN_STORAGE_KEY: "oxy_access_token";
239
+ readonly SESSION_STORAGE_KEY: "oxy_session_id";
240
+ readonly STATE_STORAGE_KEY: "oxy_auth_state";
241
+ readonly PRE_AUTH_URL_KEY: "oxy_pre_auth_url";
242
+ readonly NONCE_STORAGE_KEY: "oxy_auth_nonce";
243
+ __resetTokensForTests(): void;
244
+ } & T;
245
+ export { OxyServicesRedirectAuthMixin as RedirectAuthMixin };
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Security Methods Mixin
3
+ */
4
+ import type { OxyServicesBase } from '../OxyServices.base';
5
+ import type { SecurityActivity, SecurityActivityResponse, SecurityEventType } from '../models/interfaces';
6
+ export declare function OxyServicesSecurityMixin<T extends typeof OxyServicesBase>(Base: T): {
7
+ new (...args: any[]): {
8
+ /**
9
+ * Get user's security activity with pagination
10
+ * @param limit - Number of results (default: 50, max: 100)
11
+ * @param offset - Pagination offset (default: 0)
12
+ * @param eventType - Optional filter by event type
13
+ * @returns Security activity response with pagination
14
+ */
15
+ getSecurityActivity(limit?: number, offset?: number, eventType?: SecurityEventType): Promise<SecurityActivityResponse>;
16
+ /**
17
+ * Get recent security activity (convenience method)
18
+ * @param limit - Number of recent events to fetch (default: 10)
19
+ * @returns Array of recent security activities
20
+ */
21
+ getRecentSecurityActivity(limit?: number): Promise<SecurityActivity[]>;
22
+ /**
23
+ * Log private key exported event
24
+ * @param deviceId - Optional device ID for tracking
25
+ * @returns Promise that resolves when event is logged
26
+ */
27
+ logPrivateKeyExported(deviceId?: string): Promise<void>;
28
+ /**
29
+ * Log backup created event
30
+ * @param deviceId - Optional device ID for tracking
31
+ * @returns Promise that resolves when event is logged
32
+ */
33
+ logBackupCreated(deviceId?: string): Promise<void>;
34
+ httpService: import("../HttpService").HttpService;
35
+ cloudURL: string;
36
+ config: import("../OxyServices.base").OxyConfig;
37
+ makeRequest<T_1>(method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE", url: string, data?: any, options?: import("../HttpService").RequestOptions): Promise<T_1>;
38
+ getBaseURL(): string;
39
+ getClient(): import("../HttpService").HttpService;
40
+ getMetrics(): {
41
+ totalRequests: number;
42
+ successfulRequests: number;
43
+ failedRequests: number;
44
+ cacheHits: number;
45
+ cacheMisses: number;
46
+ averageResponseTime: number;
47
+ };
48
+ clearCache(): void;
49
+ clearCacheEntry(key: string): void;
50
+ getCacheStats(): {
51
+ size: number;
52
+ hits: number;
53
+ misses: number;
54
+ hitRate: number;
55
+ };
56
+ getCloudURL(): string;
57
+ setTokens(accessToken: string, refreshToken?: string): void;
58
+ clearTokens(): void;
59
+ getCurrentUserId(): string | null;
60
+ hasValidToken(): boolean;
61
+ getAccessToken(): string | null;
62
+ waitForAuth(timeoutMs?: number): Promise<boolean>;
63
+ withAuthRetry<T_1>(operation: () => Promise<T_1>, operationName: string, options?: {
64
+ maxRetries?: number;
65
+ retryDelay?: number;
66
+ authTimeoutMs?: number;
67
+ }): Promise<T_1>;
68
+ validate(): Promise<boolean>;
69
+ handleError(error: unknown): Error;
70
+ healthCheck(): Promise<{
71
+ status: string;
72
+ users?: number;
73
+ timestamp?: string;
74
+ [key: string]: any;
75
+ }>;
76
+ };
77
+ __resetTokensForTests(): void;
78
+ } & T;