joopjs 2.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 (259) hide show
  1. package/CHANGELOG.md +678 -0
  2. package/README.md +583 -0
  3. package/dist/a11y.service-C-DQQfgO.d.mts +143 -0
  4. package/dist/a11y.service-CauEJrJe.d.ts +143 -0
  5. package/dist/adapters-B6slG6hQ.d.mts +84 -0
  6. package/dist/adapters-B6slG6hQ.d.ts +84 -0
  7. package/dist/aes.service-CkoupAww.d.mts +95 -0
  8. package/dist/aes.service-CkoupAww.d.ts +95 -0
  9. package/dist/ai/index.d.mts +99 -0
  10. package/dist/ai/index.d.ts +99 -0
  11. package/dist/ai/index.js +307 -0
  12. package/dist/ai/index.js.map +1 -0
  13. package/dist/ai/index.mjs +304 -0
  14. package/dist/ai/index.mjs.map +1 -0
  15. package/dist/analytics/index.d.mts +42 -0
  16. package/dist/analytics/index.d.ts +42 -0
  17. package/dist/analytics/index.js +139 -0
  18. package/dist/analytics/index.js.map +1 -0
  19. package/dist/analytics/index.mjs +136 -0
  20. package/dist/analytics/index.mjs.map +1 -0
  21. package/dist/angular/index.d.mts +148 -0
  22. package/dist/angular/index.d.ts +148 -0
  23. package/dist/angular/index.js +122 -0
  24. package/dist/angular/index.js.map +1 -0
  25. package/dist/angular/index.mjs +101 -0
  26. package/dist/angular/index.mjs.map +1 -0
  27. package/dist/api/index.d.mts +128 -0
  28. package/dist/api/index.d.ts +128 -0
  29. package/dist/api/index.js +1358 -0
  30. package/dist/api/index.js.map +1 -0
  31. package/dist/api/index.mjs +1332 -0
  32. package/dist/api/index.mjs.map +1 -0
  33. package/dist/auth/index.d.mts +105 -0
  34. package/dist/auth/index.d.ts +105 -0
  35. package/dist/auth/index.js +989 -0
  36. package/dist/auth/index.js.map +1 -0
  37. package/dist/auth/index.mjs +979 -0
  38. package/dist/auth/index.mjs.map +1 -0
  39. package/dist/auth.service-DNVB-L4U.d.mts +16 -0
  40. package/dist/auth.service-PjUUSUIt.d.ts +16 -0
  41. package/dist/banking/index.d.mts +1530 -0
  42. package/dist/banking/index.d.ts +1530 -0
  43. package/dist/banking/index.js +4739 -0
  44. package/dist/banking/index.js.map +1 -0
  45. package/dist/banking/index.mjs +4661 -0
  46. package/dist/banking/index.mjs.map +1 -0
  47. package/dist/cache/index.d.mts +40 -0
  48. package/dist/cache/index.d.ts +40 -0
  49. package/dist/cache/index.js +174 -0
  50. package/dist/cache/index.js.map +1 -0
  51. package/dist/cache/index.mjs +172 -0
  52. package/dist/cache/index.mjs.map +1 -0
  53. package/dist/client-profile.service-BuPeXVp5.d.mts +28 -0
  54. package/dist/client-profile.service-D5bRRYQp.d.ts +28 -0
  55. package/dist/config.models-Cqg04fAQ.d.mts +84 -0
  56. package/dist/config.models-Cqg04fAQ.d.ts +84 -0
  57. package/dist/config.service-CrCvI-JS.d.ts +31 -0
  58. package/dist/config.service-Cz4QQLlf.d.mts +31 -0
  59. package/dist/core/index.d.mts +4 -0
  60. package/dist/core/index.d.ts +4 -0
  61. package/dist/core/index.js +631 -0
  62. package/dist/core/index.js.map +1 -0
  63. package/dist/core/index.mjs +619 -0
  64. package/dist/core/index.mjs.map +1 -0
  65. package/dist/crypto-utils-DriNhLdx.d.mts +30 -0
  66. package/dist/crypto-utils-DriNhLdx.d.ts +30 -0
  67. package/dist/data-storage.service-DT6xaTxE.d.ts +51 -0
  68. package/dist/data-storage.service-LvhGRCmw.d.mts +51 -0
  69. package/dist/deeplink/index.d.mts +39 -0
  70. package/dist/deeplink/index.d.ts +39 -0
  71. package/dist/deeplink/index.js +268 -0
  72. package/dist/deeplink/index.js.map +1 -0
  73. package/dist/deeplink/index.mjs +265 -0
  74. package/dist/deeplink/index.mjs.map +1 -0
  75. package/dist/deeplink.service-Ctd5u243.d.mts +35 -0
  76. package/dist/deeplink.service-uUuTnY9_.d.ts +35 -0
  77. package/dist/dev/index.d.mts +20 -0
  78. package/dist/dev/index.d.ts +20 -0
  79. package/dist/dev/index.js +51 -0
  80. package/dist/dev/index.js.map +1 -0
  81. package/dist/dev/index.mjs +49 -0
  82. package/dist/dev/index.mjs.map +1 -0
  83. package/dist/device/index.d.mts +108 -0
  84. package/dist/device/index.d.ts +108 -0
  85. package/dist/device/index.js +960 -0
  86. package/dist/device/index.js.map +1 -0
  87. package/dist/device/index.mjs +951 -0
  88. package/dist/device/index.mjs.map +1 -0
  89. package/dist/differential-privacy-BcAv1G80.d.mts +210 -0
  90. package/dist/differential-privacy-C8mAUjZr.d.ts +210 -0
  91. package/dist/encryption/index.d.mts +75 -0
  92. package/dist/encryption/index.d.ts +75 -0
  93. package/dist/encryption/index.js +605 -0
  94. package/dist/encryption/index.js.map +1 -0
  95. package/dist/encryption/index.mjs +598 -0
  96. package/dist/encryption/index.mjs.map +1 -0
  97. package/dist/form-validator-3tkmzr_o.d.mts +72 -0
  98. package/dist/form-validator-3tkmzr_o.d.ts +72 -0
  99. package/dist/forms/index.d.mts +59 -0
  100. package/dist/forms/index.d.ts +59 -0
  101. package/dist/forms/index.js +446 -0
  102. package/dist/forms/index.js.map +1 -0
  103. package/dist/forms/index.mjs +442 -0
  104. package/dist/forms/index.mjs.map +1 -0
  105. package/dist/i18n/index.d.mts +37 -0
  106. package/dist/i18n/index.d.ts +37 -0
  107. package/dist/i18n/index.js +147 -0
  108. package/dist/i18n/index.js.map +1 -0
  109. package/dist/i18n/index.mjs +145 -0
  110. package/dist/i18n/index.mjs.map +1 -0
  111. package/dist/idempotency.service-_6LqhivP.d.mts +372 -0
  112. package/dist/idempotency.service-eOKoISRD.d.ts +372 -0
  113. package/dist/index-B_ksKpS1.d.mts +202 -0
  114. package/dist/index-CqDKWTUP.d.mts +28 -0
  115. package/dist/index-CqDKWTUP.d.ts +28 -0
  116. package/dist/index-DFqEoX_l.d.ts +202 -0
  117. package/dist/index-Dz0gOur2.d.mts +36 -0
  118. package/dist/index-Dz0gOur2.d.ts +36 -0
  119. package/dist/index.d.mts +1336 -0
  120. package/dist/index.d.ts +1336 -0
  121. package/dist/index.js +19464 -0
  122. package/dist/index.js.map +1 -0
  123. package/dist/index.mjs +19155 -0
  124. package/dist/index.mjs.map +1 -0
  125. package/dist/india/index.d.mts +75 -0
  126. package/dist/india/index.d.ts +75 -0
  127. package/dist/india/index.js +325 -0
  128. package/dist/india/index.js.map +1 -0
  129. package/dist/india/index.mjs +303 -0
  130. package/dist/india/index.mjs.map +1 -0
  131. package/dist/joop-Bx7Iwj5p.d.mts +155 -0
  132. package/dist/joop-CA3DMeOO.d.ts +155 -0
  133. package/dist/native-bridge/index.d.mts +27 -0
  134. package/dist/native-bridge/index.d.ts +27 -0
  135. package/dist/native-bridge/index.js +98 -0
  136. package/dist/native-bridge/index.js.map +1 -0
  137. package/dist/native-bridge/index.mjs +96 -0
  138. package/dist/native-bridge/index.mjs.map +1 -0
  139. package/dist/network/index.d.mts +85 -0
  140. package/dist/network/index.d.ts +85 -0
  141. package/dist/network/index.js +454 -0
  142. package/dist/network/index.js.map +1 -0
  143. package/dist/network/index.mjs +451 -0
  144. package/dist/network/index.mjs.map +1 -0
  145. package/dist/network-monitor-BIwPSXme.d.mts +179 -0
  146. package/dist/network-monitor-Bqp2hvZr.d.ts +179 -0
  147. package/dist/notification.service-Dm4fvfZf.d.mts +25 -0
  148. package/dist/notification.service-tEMKatWJ.d.ts +25 -0
  149. package/dist/observability/index.d.mts +179 -0
  150. package/dist/observability/index.d.ts +179 -0
  151. package/dist/observability/index.js +559 -0
  152. package/dist/observability/index.js.map +1 -0
  153. package/dist/observability/index.mjs +552 -0
  154. package/dist/observability/index.mjs.map +1 -0
  155. package/dist/oidc-client-DIJcClmB.d.mts +190 -0
  156. package/dist/oidc-client-DxhyE59t.d.ts +190 -0
  157. package/dist/platform/index.d.mts +73 -0
  158. package/dist/platform/index.d.ts +73 -0
  159. package/dist/platform/index.js +127 -0
  160. package/dist/platform/index.js.map +1 -0
  161. package/dist/platform/index.mjs +125 -0
  162. package/dist/platform/index.mjs.map +1 -0
  163. package/dist/pwa/index.d.mts +31 -0
  164. package/dist/pwa/index.d.ts +31 -0
  165. package/dist/pwa/index.js +247 -0
  166. package/dist/pwa/index.js.map +1 -0
  167. package/dist/pwa/index.mjs +244 -0
  168. package/dist/pwa/index.mjs.map +1 -0
  169. package/dist/react/index.d.mts +133 -0
  170. package/dist/react/index.d.ts +133 -0
  171. package/dist/react/index.js +632 -0
  172. package/dist/react/index.js.map +1 -0
  173. package/dist/react/index.mjs +630 -0
  174. package/dist/react/index.mjs.map +1 -0
  175. package/dist/router/index.d.mts +39 -0
  176. package/dist/router/index.d.ts +39 -0
  177. package/dist/router/index.js +168 -0
  178. package/dist/router/index.js.map +1 -0
  179. package/dist/router/index.mjs +166 -0
  180. package/dist/router/index.mjs.map +1 -0
  181. package/dist/security/index.d.mts +206 -0
  182. package/dist/security/index.d.ts +206 -0
  183. package/dist/security/index.js +1297 -0
  184. package/dist/security/index.js.map +1 -0
  185. package/dist/security/index.mjs +1285 -0
  186. package/dist/security/index.mjs.map +1 -0
  187. package/dist/session/index.d.mts +115 -0
  188. package/dist/session/index.d.ts +115 -0
  189. package/dist/session/index.js +297 -0
  190. package/dist/session/index.js.map +1 -0
  191. package/dist/session/index.mjs +292 -0
  192. package/dist/session/index.mjs.map +1 -0
  193. package/dist/state/index.d.mts +43 -0
  194. package/dist/state/index.d.ts +43 -0
  195. package/dist/state/index.js +156 -0
  196. package/dist/state/index.js.map +1 -0
  197. package/dist/state/index.mjs +152 -0
  198. package/dist/state/index.mjs.map +1 -0
  199. package/dist/statement-parser-BHQtXwCM.d.ts +260 -0
  200. package/dist/statement-parser-C2qNmb49.d.mts +260 -0
  201. package/dist/storage/index.d.mts +40 -0
  202. package/dist/storage/index.d.ts +40 -0
  203. package/dist/storage/index.js +256 -0
  204. package/dist/storage/index.js.map +1 -0
  205. package/dist/storage/index.mjs +252 -0
  206. package/dist/storage/index.mjs.map +1 -0
  207. package/dist/sync/index.d.mts +69 -0
  208. package/dist/sync/index.d.ts +69 -0
  209. package/dist/sync/index.js +330 -0
  210. package/dist/sync/index.js.map +1 -0
  211. package/dist/sync/index.mjs +323 -0
  212. package/dist/sync/index.mjs.map +1 -0
  213. package/dist/sync-engine-DCIMRG5s.d.ts +61 -0
  214. package/dist/sync-engine-DZqyKHkK.d.mts +61 -0
  215. package/dist/theme/index.d.mts +53 -0
  216. package/dist/theme/index.d.ts +53 -0
  217. package/dist/theme/index.js +169 -0
  218. package/dist/theme/index.js.map +1 -0
  219. package/dist/theme/index.mjs +167 -0
  220. package/dist/theme/index.mjs.map +1 -0
  221. package/dist/ui/index.d.mts +66 -0
  222. package/dist/ui/index.d.ts +66 -0
  223. package/dist/ui/index.js +811 -0
  224. package/dist/ui/index.js.map +1 -0
  225. package/dist/ui/index.mjs +803 -0
  226. package/dist/ui/index.mjs.map +1 -0
  227. package/dist/utilities/index.d.mts +199 -0
  228. package/dist/utilities/index.d.ts +199 -0
  229. package/dist/utilities/index.js +1991 -0
  230. package/dist/utilities/index.js.map +1 -0
  231. package/dist/utilities/index.mjs +1923 -0
  232. package/dist/utilities/index.mjs.map +1 -0
  233. package/dist/validation/index.d.mts +60 -0
  234. package/dist/validation/index.d.ts +60 -0
  235. package/dist/validation/index.js +460 -0
  236. package/dist/validation/index.js.map +1 -0
  237. package/dist/validation/index.mjs +455 -0
  238. package/dist/validation/index.mjs.map +1 -0
  239. package/dist/vue/index.d.mts +135 -0
  240. package/dist/vue/index.d.ts +135 -0
  241. package/dist/vue/index.js +621 -0
  242. package/dist/vue/index.js.map +1 -0
  243. package/dist/vue/index.mjs +619 -0
  244. package/dist/vue/index.mjs.map +1 -0
  245. package/dist/watermark.service-Detur5tq.d.ts +235 -0
  246. package/dist/watermark.service-QNegMeQZ.d.mts +235 -0
  247. package/dist/workers/index.d.mts +42 -0
  248. package/dist/workers/index.d.ts +42 -0
  249. package/dist/workers/index.js +359 -0
  250. package/dist/workers/index.js.map +1 -0
  251. package/dist/workers/index.mjs +356 -0
  252. package/dist/workers/index.mjs.map +1 -0
  253. package/dist/workflow/index.d.mts +99 -0
  254. package/dist/workflow/index.d.ts +99 -0
  255. package/dist/workflow/index.js +282 -0
  256. package/dist/workflow/index.js.map +1 -0
  257. package/dist/workflow/index.mjs +279 -0
  258. package/dist/workflow/index.mjs.map +1 -0
  259. package/package.json +226 -0
@@ -0,0 +1,190 @@
1
+ import { J as JoopObservable } from './index-Dz0gOur2.mjs';
2
+ import { d as JoopStorageAdapter } from './adapters-B6slG6hQ.mjs';
3
+
4
+ interface JoopTokenPayload {
5
+ sub?: string;
6
+ exp?: number;
7
+ iat?: number;
8
+ jti?: string;
9
+ [key: string]: unknown;
10
+ }
11
+ declare class JoopTokenService {
12
+ private _access;
13
+ private _refresh;
14
+ private _refreshCb;
15
+ private _timer;
16
+ setTokens(accessToken: string, refreshToken: string): void;
17
+ getAccessToken(): string;
18
+ getRefreshToken(): string;
19
+ decode(token: string): JoopTokenPayload | null;
20
+ isExpired(token?: string): boolean;
21
+ expiresInMs(token?: string): number;
22
+ onRefreshNeeded(callback: (refreshToken: string) => Promise<string>): void;
23
+ refreshNow(): Promise<string>;
24
+ clear(): void;
25
+ private _scheduleRefresh;
26
+ }
27
+
28
+ interface JoopPKCEParams {
29
+ codeVerifier: string;
30
+ codeChallenge: string;
31
+ codeChallengeMethod: 'S256';
32
+ }
33
+ declare class JoopPKCEService {
34
+ private _verifier;
35
+ generate(): Promise<JoopPKCEParams>;
36
+ getVerifier(): string;
37
+ generateState(): string;
38
+ buildAuthUrl(baseUrl: string, params: {
39
+ clientId: string;
40
+ redirectUri: string;
41
+ scope: string;
42
+ state: string;
43
+ codeChallenge: string;
44
+ }): string;
45
+ private _base64url;
46
+ }
47
+
48
+ declare class JoopOtpService {
49
+ private readonly _period;
50
+ private readonly _digits;
51
+ generateTOTP(secretBase32: string, time?: number): Promise<string>;
52
+ verifyTOTP(token: string, secretBase32: string, window?: number): Promise<boolean>;
53
+ generateNumericOTP(length?: number): string;
54
+ generateAlphanumericOTP(length?: number): string;
55
+ private _hotp;
56
+ private _base32Decode;
57
+ }
58
+
59
+ declare class JoopBiometricService {
60
+ isSupported(): boolean;
61
+ isAvailable(): Promise<boolean>;
62
+ register(options: {
63
+ rpId: string;
64
+ rpName: string;
65
+ userId: string;
66
+ userName: string;
67
+ userDisplayName: string;
68
+ challenge: ArrayBuffer;
69
+ }): Promise<PublicKeyCredential>;
70
+ authenticate(options: {
71
+ rpId: string;
72
+ challenge: ArrayBuffer;
73
+ allowCredentials?: PublicKeyCredentialDescriptor[];
74
+ }): Promise<PublicKeyCredential>;
75
+ generateChallenge(): ArrayBuffer;
76
+ credentialIdToBase64(id: ArrayBuffer): string;
77
+ }
78
+
79
+ type JoopMfaChannel = 'totp' | 'sms' | 'email' | 'biometric' | 'backup';
80
+ interface JoopMfaChallenge {
81
+ id: string;
82
+ channel: JoopMfaChannel;
83
+ destination?: string;
84
+ expiresAt: number;
85
+ attempts: number;
86
+ maxAttempts: number;
87
+ verified: boolean;
88
+ }
89
+ interface JoopMfaVerifyResult {
90
+ success: boolean;
91
+ reason?: string;
92
+ attemptsLeft?: number;
93
+ }
94
+ interface JoopMfaTotpSetup {
95
+ secret: string;
96
+ uri: string;
97
+ backupCodes: string[];
98
+ }
99
+ declare class JoopMfaService {
100
+ private _otp;
101
+ private _bio;
102
+ private _challenges;
103
+ private _expired$;
104
+ generateTotpSecret(length?: number): string;
105
+ getTotpUri(secret: string, account: string, issuer?: string): string;
106
+ setupTotp(account: string, issuer?: string): Promise<JoopMfaTotpSetup>;
107
+ verifyTotp(token: string, secret: string, window?: number): Promise<boolean>;
108
+ createChallenge(destination: string, channel: 'sms' | 'email', ttlMs?: number, maxAttempts?: number): JoopMfaChallenge & {
109
+ _code: string;
110
+ };
111
+ /** Get the OTP code for a challenge (pass to your SMS/email sendFn) */
112
+ getChallengeOtp(challengeId: string): string | null;
113
+ verifyChallenge(challengeId: string, token: string): JoopMfaVerifyResult;
114
+ generateBackupCodes(count?: number, length?: number): string[];
115
+ hashBackupCodes(codes: string[]): Promise<string[]>;
116
+ verifyBackupCode(code: string, hashedCodes: string[]): Promise<{
117
+ valid: boolean;
118
+ remaining: string[];
119
+ }>;
120
+ isBiometricAvailable(): Promise<boolean>;
121
+ registerBiometric(userId: string, displayName?: string): Promise<PublicKeyCredential>;
122
+ verifyBiometric(credentialId: string): Promise<boolean>;
123
+ onChallengeExpired(handler: (id: string) => void): () => void;
124
+ clearExpiredChallenges(): number;
125
+ getChallenge(id: string): JoopMfaChallenge | null;
126
+ }
127
+
128
+ interface JoopOIDCConfig {
129
+ issuer: string;
130
+ clientId: string;
131
+ redirectUri: string;
132
+ scope?: string;
133
+ responseType?: string;
134
+ /**
135
+ * Storage for PKCE verifier, state, and tokens.
136
+ * Accepts any JoopStorageAdapter (localStorage, sessionStorage, MMKV, custom).
137
+ * Default: sessionStorage on web, JoopPlatform.getSessionStorage() on other platforms.
138
+ */
139
+ storage?: JoopStorageAdapter;
140
+ }
141
+ interface JoopOIDCMetadata {
142
+ authorizationEndpoint: string;
143
+ tokenEndpoint: string;
144
+ jwksUri: string;
145
+ userInfoEndpoint?: string;
146
+ endSessionEndpoint?: string;
147
+ }
148
+ interface JoopOIDCTokens {
149
+ accessToken: string;
150
+ idToken?: string;
151
+ refreshToken?: string;
152
+ expiresAt: number;
153
+ tokenType: string;
154
+ scope?: string;
155
+ }
156
+ interface JoopLoginOptions {
157
+ prompt?: 'none' | 'login' | 'consent' | 'select_account';
158
+ loginHint?: string;
159
+ state?: string;
160
+ nonce?: string;
161
+ extraParams?: Record<string, string>;
162
+ }
163
+ declare class JoopOIDCClient {
164
+ private _cfg;
165
+ private _metadata;
166
+ private _tokens$;
167
+ private _storage;
168
+ private _renewTimer;
169
+ private readonly _KEY;
170
+ private readonly _VER_KEY;
171
+ private readonly _STATE_KEY;
172
+ constructor(config: JoopOIDCConfig);
173
+ discover(): Promise<JoopOIDCMetadata>;
174
+ login(options?: JoopLoginOptions): Promise<void>;
175
+ /** Returns the authorization URL without redirecting (useful for React Native) */
176
+ buildLoginUrl(options?: JoopLoginOptions): Promise<string>;
177
+ handleCallback(url?: string): Promise<JoopOIDCTokens>;
178
+ refreshToken(): Promise<JoopOIDCTokens>;
179
+ getUserInfo(): Promise<Record<string, unknown>>;
180
+ logout(options?: {
181
+ redirectUri?: string;
182
+ }): Promise<void>;
183
+ silentRenew(renewBeforeMs?: number): void;
184
+ isAuthenticated(): boolean;
185
+ getTokens(): JoopOIDCTokens | null;
186
+ tokens$(): JoopObservable<JoopOIDCTokens | null>;
187
+ private _storeTokens;
188
+ }
189
+
190
+ export { JoopTokenService as J, JoopPKCEService as a, JoopOtpService as b, JoopBiometricService as c, JoopMfaService as d, JoopOIDCClient as e, type JoopLoginOptions as f, type JoopMfaChallenge as g, type JoopMfaTotpSetup as h, type JoopMfaVerifyResult as i, type JoopOIDCConfig as j, type JoopOIDCMetadata as k, type JoopOIDCTokens as l, type JoopPKCEParams as m, type JoopTokenPayload as n };
@@ -0,0 +1,190 @@
1
+ import { J as JoopObservable } from './index-Dz0gOur2.js';
2
+ import { d as JoopStorageAdapter } from './adapters-B6slG6hQ.js';
3
+
4
+ interface JoopTokenPayload {
5
+ sub?: string;
6
+ exp?: number;
7
+ iat?: number;
8
+ jti?: string;
9
+ [key: string]: unknown;
10
+ }
11
+ declare class JoopTokenService {
12
+ private _access;
13
+ private _refresh;
14
+ private _refreshCb;
15
+ private _timer;
16
+ setTokens(accessToken: string, refreshToken: string): void;
17
+ getAccessToken(): string;
18
+ getRefreshToken(): string;
19
+ decode(token: string): JoopTokenPayload | null;
20
+ isExpired(token?: string): boolean;
21
+ expiresInMs(token?: string): number;
22
+ onRefreshNeeded(callback: (refreshToken: string) => Promise<string>): void;
23
+ refreshNow(): Promise<string>;
24
+ clear(): void;
25
+ private _scheduleRefresh;
26
+ }
27
+
28
+ interface JoopPKCEParams {
29
+ codeVerifier: string;
30
+ codeChallenge: string;
31
+ codeChallengeMethod: 'S256';
32
+ }
33
+ declare class JoopPKCEService {
34
+ private _verifier;
35
+ generate(): Promise<JoopPKCEParams>;
36
+ getVerifier(): string;
37
+ generateState(): string;
38
+ buildAuthUrl(baseUrl: string, params: {
39
+ clientId: string;
40
+ redirectUri: string;
41
+ scope: string;
42
+ state: string;
43
+ codeChallenge: string;
44
+ }): string;
45
+ private _base64url;
46
+ }
47
+
48
+ declare class JoopOtpService {
49
+ private readonly _period;
50
+ private readonly _digits;
51
+ generateTOTP(secretBase32: string, time?: number): Promise<string>;
52
+ verifyTOTP(token: string, secretBase32: string, window?: number): Promise<boolean>;
53
+ generateNumericOTP(length?: number): string;
54
+ generateAlphanumericOTP(length?: number): string;
55
+ private _hotp;
56
+ private _base32Decode;
57
+ }
58
+
59
+ declare class JoopBiometricService {
60
+ isSupported(): boolean;
61
+ isAvailable(): Promise<boolean>;
62
+ register(options: {
63
+ rpId: string;
64
+ rpName: string;
65
+ userId: string;
66
+ userName: string;
67
+ userDisplayName: string;
68
+ challenge: ArrayBuffer;
69
+ }): Promise<PublicKeyCredential>;
70
+ authenticate(options: {
71
+ rpId: string;
72
+ challenge: ArrayBuffer;
73
+ allowCredentials?: PublicKeyCredentialDescriptor[];
74
+ }): Promise<PublicKeyCredential>;
75
+ generateChallenge(): ArrayBuffer;
76
+ credentialIdToBase64(id: ArrayBuffer): string;
77
+ }
78
+
79
+ type JoopMfaChannel = 'totp' | 'sms' | 'email' | 'biometric' | 'backup';
80
+ interface JoopMfaChallenge {
81
+ id: string;
82
+ channel: JoopMfaChannel;
83
+ destination?: string;
84
+ expiresAt: number;
85
+ attempts: number;
86
+ maxAttempts: number;
87
+ verified: boolean;
88
+ }
89
+ interface JoopMfaVerifyResult {
90
+ success: boolean;
91
+ reason?: string;
92
+ attemptsLeft?: number;
93
+ }
94
+ interface JoopMfaTotpSetup {
95
+ secret: string;
96
+ uri: string;
97
+ backupCodes: string[];
98
+ }
99
+ declare class JoopMfaService {
100
+ private _otp;
101
+ private _bio;
102
+ private _challenges;
103
+ private _expired$;
104
+ generateTotpSecret(length?: number): string;
105
+ getTotpUri(secret: string, account: string, issuer?: string): string;
106
+ setupTotp(account: string, issuer?: string): Promise<JoopMfaTotpSetup>;
107
+ verifyTotp(token: string, secret: string, window?: number): Promise<boolean>;
108
+ createChallenge(destination: string, channel: 'sms' | 'email', ttlMs?: number, maxAttempts?: number): JoopMfaChallenge & {
109
+ _code: string;
110
+ };
111
+ /** Get the OTP code for a challenge (pass to your SMS/email sendFn) */
112
+ getChallengeOtp(challengeId: string): string | null;
113
+ verifyChallenge(challengeId: string, token: string): JoopMfaVerifyResult;
114
+ generateBackupCodes(count?: number, length?: number): string[];
115
+ hashBackupCodes(codes: string[]): Promise<string[]>;
116
+ verifyBackupCode(code: string, hashedCodes: string[]): Promise<{
117
+ valid: boolean;
118
+ remaining: string[];
119
+ }>;
120
+ isBiometricAvailable(): Promise<boolean>;
121
+ registerBiometric(userId: string, displayName?: string): Promise<PublicKeyCredential>;
122
+ verifyBiometric(credentialId: string): Promise<boolean>;
123
+ onChallengeExpired(handler: (id: string) => void): () => void;
124
+ clearExpiredChallenges(): number;
125
+ getChallenge(id: string): JoopMfaChallenge | null;
126
+ }
127
+
128
+ interface JoopOIDCConfig {
129
+ issuer: string;
130
+ clientId: string;
131
+ redirectUri: string;
132
+ scope?: string;
133
+ responseType?: string;
134
+ /**
135
+ * Storage for PKCE verifier, state, and tokens.
136
+ * Accepts any JoopStorageAdapter (localStorage, sessionStorage, MMKV, custom).
137
+ * Default: sessionStorage on web, JoopPlatform.getSessionStorage() on other platforms.
138
+ */
139
+ storage?: JoopStorageAdapter;
140
+ }
141
+ interface JoopOIDCMetadata {
142
+ authorizationEndpoint: string;
143
+ tokenEndpoint: string;
144
+ jwksUri: string;
145
+ userInfoEndpoint?: string;
146
+ endSessionEndpoint?: string;
147
+ }
148
+ interface JoopOIDCTokens {
149
+ accessToken: string;
150
+ idToken?: string;
151
+ refreshToken?: string;
152
+ expiresAt: number;
153
+ tokenType: string;
154
+ scope?: string;
155
+ }
156
+ interface JoopLoginOptions {
157
+ prompt?: 'none' | 'login' | 'consent' | 'select_account';
158
+ loginHint?: string;
159
+ state?: string;
160
+ nonce?: string;
161
+ extraParams?: Record<string, string>;
162
+ }
163
+ declare class JoopOIDCClient {
164
+ private _cfg;
165
+ private _metadata;
166
+ private _tokens$;
167
+ private _storage;
168
+ private _renewTimer;
169
+ private readonly _KEY;
170
+ private readonly _VER_KEY;
171
+ private readonly _STATE_KEY;
172
+ constructor(config: JoopOIDCConfig);
173
+ discover(): Promise<JoopOIDCMetadata>;
174
+ login(options?: JoopLoginOptions): Promise<void>;
175
+ /** Returns the authorization URL without redirecting (useful for React Native) */
176
+ buildLoginUrl(options?: JoopLoginOptions): Promise<string>;
177
+ handleCallback(url?: string): Promise<JoopOIDCTokens>;
178
+ refreshToken(): Promise<JoopOIDCTokens>;
179
+ getUserInfo(): Promise<Record<string, unknown>>;
180
+ logout(options?: {
181
+ redirectUri?: string;
182
+ }): Promise<void>;
183
+ silentRenew(renewBeforeMs?: number): void;
184
+ isAuthenticated(): boolean;
185
+ getTokens(): JoopOIDCTokens | null;
186
+ tokens$(): JoopObservable<JoopOIDCTokens | null>;
187
+ private _storeTokens;
188
+ }
189
+
190
+ export { JoopTokenService as J, JoopPKCEService as a, JoopOtpService as b, JoopBiometricService as c, JoopMfaService as d, JoopOIDCClient as e, type JoopLoginOptions as f, type JoopMfaChallenge as g, type JoopMfaTotpSetup as h, type JoopMfaVerifyResult as i, type JoopOIDCConfig as j, type JoopOIDCMetadata as k, type JoopOIDCTokens as l, type JoopPKCEParams as m, type JoopTokenPayload as n };
@@ -0,0 +1,73 @@
1
+ import { n as JoopPlatformAdapterConfig, d as JoopStorageAdapter } from '../adapters-B6slG6hQ.mjs';
2
+ export { k as JoopCompressionAdapter, l as JoopCompressionFormat, m as JoopCryptoAdapter, o as JoopWorkerAdapter } from '../adapters-B6slG6hQ.mjs';
3
+
4
+ type JoopPlatformType = 'web' | 'react-native' | 'node' | 'unknown';
5
+ interface JoopCapabilities {
6
+ compression: boolean;
7
+ workers: boolean;
8
+ cryptoSubtle: boolean;
9
+ persistentStorage: boolean;
10
+ dom: boolean;
11
+ serviceWorker: boolean;
12
+ }
13
+ interface JoopPlatformConfig {
14
+ adapter?: JoopPlatformAdapterConfig;
15
+ /** Override auto-detection — useful in tests or SSR */
16
+ platform?: JoopPlatformType;
17
+ }
18
+ declare class JoopPlatform {
19
+ private static _type;
20
+ private static _adapter;
21
+ private static _memStorage;
22
+ /**
23
+ * Call once at app startup to configure adapters for your platform.
24
+ *
25
+ * Web (default — no call needed):
26
+ * JoopPlatform.init();
27
+ *
28
+ * React Native with react-native-mmkv:
29
+ * import { MMKV } from 'react-native-mmkv';
30
+ * const mmkv = new MMKV();
31
+ * JoopPlatform.init({ adapter: { storage: mmkv } });
32
+ *
33
+ * React Native with custom compression (fflate):
34
+ * import { gzip, ungzip } from 'fflate';
35
+ * JoopPlatform.init({
36
+ * adapter: {
37
+ * compression: {
38
+ * compress: (d, fmt) => new Promise((res, rej) => gzip(d, (e, r) => e ? rej(e) : res(r))),
39
+ * decompress: (d, fmt) => new Promise((res, rej) => ungzip(d, (e, r) => e ? rej(e) : res(r))),
40
+ * },
41
+ * },
42
+ * });
43
+ */
44
+ static init(config?: JoopPlatformConfig): void;
45
+ /** Current detected or overridden platform type */
46
+ static get type(): JoopPlatformType;
47
+ static is(type: JoopPlatformType): boolean;
48
+ static isMobile(): boolean;
49
+ static isWeb(): boolean;
50
+ static isNode(): boolean;
51
+ /** Raw adapter config registered via init() */
52
+ static getAdapter(): JoopPlatformAdapterConfig;
53
+ /**
54
+ * Returns the best available storage adapter:
55
+ * 1. Custom adapter registered via init()
56
+ * 2. localStorage (web)
57
+ * 3. In-memory fallback (Node / RN without adapter)
58
+ */
59
+ static getStorage(): JoopStorageAdapter;
60
+ /**
61
+ * Returns the best available session-scoped storage:
62
+ * 1. Custom adapter registered via init()
63
+ * 2. sessionStorage (web)
64
+ * 3. Shared in-memory fallback
65
+ */
66
+ static getSessionStorage(): JoopStorageAdapter;
67
+ /** What APIs are available in the current environment */
68
+ static capabilities(): JoopCapabilities;
69
+ /** Reset to auto-detected defaults — useful between tests */
70
+ static _reset(): void;
71
+ }
72
+
73
+ export { type JoopCapabilities, JoopPlatform, JoopPlatformAdapterConfig, type JoopPlatformConfig, type JoopPlatformType, JoopStorageAdapter };
@@ -0,0 +1,73 @@
1
+ import { n as JoopPlatformAdapterConfig, d as JoopStorageAdapter } from '../adapters-B6slG6hQ.js';
2
+ export { k as JoopCompressionAdapter, l as JoopCompressionFormat, m as JoopCryptoAdapter, o as JoopWorkerAdapter } from '../adapters-B6slG6hQ.js';
3
+
4
+ type JoopPlatformType = 'web' | 'react-native' | 'node' | 'unknown';
5
+ interface JoopCapabilities {
6
+ compression: boolean;
7
+ workers: boolean;
8
+ cryptoSubtle: boolean;
9
+ persistentStorage: boolean;
10
+ dom: boolean;
11
+ serviceWorker: boolean;
12
+ }
13
+ interface JoopPlatformConfig {
14
+ adapter?: JoopPlatformAdapterConfig;
15
+ /** Override auto-detection — useful in tests or SSR */
16
+ platform?: JoopPlatformType;
17
+ }
18
+ declare class JoopPlatform {
19
+ private static _type;
20
+ private static _adapter;
21
+ private static _memStorage;
22
+ /**
23
+ * Call once at app startup to configure adapters for your platform.
24
+ *
25
+ * Web (default — no call needed):
26
+ * JoopPlatform.init();
27
+ *
28
+ * React Native with react-native-mmkv:
29
+ * import { MMKV } from 'react-native-mmkv';
30
+ * const mmkv = new MMKV();
31
+ * JoopPlatform.init({ adapter: { storage: mmkv } });
32
+ *
33
+ * React Native with custom compression (fflate):
34
+ * import { gzip, ungzip } from 'fflate';
35
+ * JoopPlatform.init({
36
+ * adapter: {
37
+ * compression: {
38
+ * compress: (d, fmt) => new Promise((res, rej) => gzip(d, (e, r) => e ? rej(e) : res(r))),
39
+ * decompress: (d, fmt) => new Promise((res, rej) => ungzip(d, (e, r) => e ? rej(e) : res(r))),
40
+ * },
41
+ * },
42
+ * });
43
+ */
44
+ static init(config?: JoopPlatformConfig): void;
45
+ /** Current detected or overridden platform type */
46
+ static get type(): JoopPlatformType;
47
+ static is(type: JoopPlatformType): boolean;
48
+ static isMobile(): boolean;
49
+ static isWeb(): boolean;
50
+ static isNode(): boolean;
51
+ /** Raw adapter config registered via init() */
52
+ static getAdapter(): JoopPlatformAdapterConfig;
53
+ /**
54
+ * Returns the best available storage adapter:
55
+ * 1. Custom adapter registered via init()
56
+ * 2. localStorage (web)
57
+ * 3. In-memory fallback (Node / RN without adapter)
58
+ */
59
+ static getStorage(): JoopStorageAdapter;
60
+ /**
61
+ * Returns the best available session-scoped storage:
62
+ * 1. Custom adapter registered via init()
63
+ * 2. sessionStorage (web)
64
+ * 3. Shared in-memory fallback
65
+ */
66
+ static getSessionStorage(): JoopStorageAdapter;
67
+ /** What APIs are available in the current environment */
68
+ static capabilities(): JoopCapabilities;
69
+ /** Reset to auto-detected defaults — useful between tests */
70
+ static _reset(): void;
71
+ }
72
+
73
+ export { type JoopCapabilities, JoopPlatform, JoopPlatformAdapterConfig, type JoopPlatformConfig, type JoopPlatformType, JoopStorageAdapter };
@@ -0,0 +1,127 @@
1
+ 'use strict';
2
+
3
+ // src/platform/platform.ts
4
+ var _webStorage = (store) => ({
5
+ getItem: (k) => store.getItem(k),
6
+ setItem: (k, v) => store.setItem(k, v),
7
+ removeItem: (k) => store.removeItem(k),
8
+ clear: () => store.clear()
9
+ });
10
+ var _MemStorageImpl = class {
11
+ _m = /* @__PURE__ */ new Map();
12
+ getItem(k) {
13
+ return this._m.get(k) ?? null;
14
+ }
15
+ setItem(k, v) {
16
+ this._m.set(k, v);
17
+ }
18
+ removeItem(k) {
19
+ this._m.delete(k);
20
+ }
21
+ clear() {
22
+ this._m.clear();
23
+ }
24
+ };
25
+ function _detect() {
26
+ if (typeof navigator !== "undefined" && navigator.product === "ReactNative") return "react-native";
27
+ const _proc = globalThis["process"];
28
+ if (typeof window === "undefined" && _proc?.versions?.node) return "node";
29
+ if (typeof window !== "undefined") return "web";
30
+ return "unknown";
31
+ }
32
+ var JoopPlatform = class {
33
+ static _type = _detect();
34
+ static _adapter = {};
35
+ static _memStorage = null;
36
+ /**
37
+ * Call once at app startup to configure adapters for your platform.
38
+ *
39
+ * Web (default — no call needed):
40
+ * JoopPlatform.init();
41
+ *
42
+ * React Native with react-native-mmkv:
43
+ * import { MMKV } from 'react-native-mmkv';
44
+ * const mmkv = new MMKV();
45
+ * JoopPlatform.init({ adapter: { storage: mmkv } });
46
+ *
47
+ * React Native with custom compression (fflate):
48
+ * import { gzip, ungzip } from 'fflate';
49
+ * JoopPlatform.init({
50
+ * adapter: {
51
+ * compression: {
52
+ * compress: (d, fmt) => new Promise((res, rej) => gzip(d, (e, r) => e ? rej(e) : res(r))),
53
+ * decompress: (d, fmt) => new Promise((res, rej) => ungzip(d, (e, r) => e ? rej(e) : res(r))),
54
+ * },
55
+ * },
56
+ * });
57
+ */
58
+ static init(config = {}) {
59
+ if (config.platform) this._type = config.platform;
60
+ this._adapter = { ...this._adapter, ...config.adapter ?? {} };
61
+ }
62
+ /** Current detected or overridden platform type */
63
+ static get type() {
64
+ return this._type;
65
+ }
66
+ static is(type) {
67
+ return this._type === type;
68
+ }
69
+ static isMobile() {
70
+ return this._type === "react-native";
71
+ }
72
+ static isWeb() {
73
+ return this._type === "web";
74
+ }
75
+ static isNode() {
76
+ return this._type === "node";
77
+ }
78
+ /** Raw adapter config registered via init() */
79
+ static getAdapter() {
80
+ return this._adapter;
81
+ }
82
+ /**
83
+ * Returns the best available storage adapter:
84
+ * 1. Custom adapter registered via init()
85
+ * 2. localStorage (web)
86
+ * 3. In-memory fallback (Node / RN without adapter)
87
+ */
88
+ static getStorage() {
89
+ if (this._adapter.storage) return this._adapter.storage;
90
+ if (typeof localStorage !== "undefined") return _webStorage(localStorage);
91
+ if (!this._memStorage) this._memStorage = new _MemStorageImpl();
92
+ return this._memStorage;
93
+ }
94
+ /**
95
+ * Returns the best available session-scoped storage:
96
+ * 1. Custom adapter registered via init()
97
+ * 2. sessionStorage (web)
98
+ * 3. Shared in-memory fallback
99
+ */
100
+ static getSessionStorage() {
101
+ if (this._adapter.storage) return this._adapter.storage;
102
+ if (typeof sessionStorage !== "undefined") return _webStorage(sessionStorage);
103
+ if (!this._memStorage) this._memStorage = new _MemStorageImpl();
104
+ return this._memStorage;
105
+ }
106
+ /** What APIs are available in the current environment */
107
+ static capabilities() {
108
+ return {
109
+ compression: typeof CompressionStream !== "undefined" || !!this._adapter.compression,
110
+ workers: typeof Worker !== "undefined" || !!this._adapter.worker,
111
+ cryptoSubtle: !!(typeof globalThis !== "undefined" && globalThis.crypto?.subtle),
112
+ persistentStorage: typeof localStorage !== "undefined" || !!this._adapter.storage,
113
+ dom: typeof document !== "undefined",
114
+ serviceWorker: typeof navigator !== "undefined" && "serviceWorker" in navigator
115
+ };
116
+ }
117
+ /** Reset to auto-detected defaults — useful between tests */
118
+ static _reset() {
119
+ this._type = _detect();
120
+ this._adapter = {};
121
+ this._memStorage = null;
122
+ }
123
+ };
124
+
125
+ exports.JoopPlatform = JoopPlatform;
126
+ //# sourceMappingURL=index.js.map
127
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/platform/platform.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { JoopPlatformAdapterConfig, JoopStorageAdapter } from './adapters';\n\nexport type JoopPlatformType = 'web' | 'react-native' | 'node' | 'unknown';\n\nexport interface JoopCapabilities {\n compression: boolean;\n workers: boolean;\n cryptoSubtle: boolean;\n persistentStorage: boolean;\n dom: boolean;\n serviceWorker: boolean;\n}\n\nexport interface JoopPlatformConfig {\n adapter?: JoopPlatformAdapterConfig;\n /** Override auto-detection — useful in tests or SSR */\n platform?: JoopPlatformType;\n}\n\n// ---------------------------------------------------------------------------\n// Built-in storage adapters\n// ---------------------------------------------------------------------------\n\nconst _webStorage = (store: Storage): JoopStorageAdapter => ({\n getItem: (k) => store.getItem(k),\n setItem: (k, v) => store.setItem(k, v),\n removeItem: (k) => store.removeItem(k),\n clear: () => store.clear(),\n});\n\nclass _MemStorageImpl implements JoopStorageAdapter {\n private _m = new Map<string, string>();\n getItem(k: string) { return this._m.get(k) ?? null; }\n setItem(k: string, v: string) { this._m.set(k, v); }\n removeItem(k: string) { this._m.delete(k); }\n clear() { this._m.clear(); }\n}\n\n// ---------------------------------------------------------------------------\n// Platform detection\n// ---------------------------------------------------------------------------\n\nfunction _detect(): JoopPlatformType {\n // React Native sets navigator.product = 'ReactNative'\n if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') return 'react-native';\n // Node.js: no window, has globalThis.process.versions.node\n const _proc = (globalThis as Record<string, unknown>)['process'] as { versions?: { node?: string } } | undefined;\n if (typeof window === 'undefined' && _proc?.versions?.node) return 'node';\n // Browser\n if (typeof window !== 'undefined') return 'web';\n return 'unknown';\n}\n\n// ---------------------------------------------------------------------------\n// JoopPlatform\n// ---------------------------------------------------------------------------\n\nexport class JoopPlatform {\n private static _type: JoopPlatformType = _detect();\n private static _adapter: JoopPlatformAdapterConfig = {};\n private static _memStorage: JoopStorageAdapter | null = null;\n\n /**\n * Call once at app startup to configure adapters for your platform.\n *\n * Web (default — no call needed):\n * JoopPlatform.init();\n *\n * React Native with react-native-mmkv:\n * import { MMKV } from 'react-native-mmkv';\n * const mmkv = new MMKV();\n * JoopPlatform.init({ adapter: { storage: mmkv } });\n *\n * React Native with custom compression (fflate):\n * import { gzip, ungzip } from 'fflate';\n * JoopPlatform.init({\n * adapter: {\n * compression: {\n * compress: (d, fmt) => new Promise((res, rej) => gzip(d, (e, r) => e ? rej(e) : res(r))),\n * decompress: (d, fmt) => new Promise((res, rej) => ungzip(d, (e, r) => e ? rej(e) : res(r))),\n * },\n * },\n * });\n */\n static init(config: JoopPlatformConfig = {}): void {\n if (config.platform) this._type = config.platform;\n this._adapter = { ...this._adapter, ...(config.adapter ?? {}) };\n }\n\n /** Current detected or overridden platform type */\n static get type(): JoopPlatformType { return this._type; }\n\n static is(type: JoopPlatformType): boolean { return this._type === type; }\n static isMobile(): boolean { return this._type === 'react-native'; }\n static isWeb(): boolean { return this._type === 'web'; }\n static isNode(): boolean { return this._type === 'node'; }\n\n /** Raw adapter config registered via init() */\n static getAdapter(): JoopPlatformAdapterConfig { return this._adapter; }\n\n /**\n * Returns the best available storage adapter:\n * 1. Custom adapter registered via init()\n * 2. localStorage (web)\n * 3. In-memory fallback (Node / RN without adapter)\n */\n static getStorage(): JoopStorageAdapter {\n if (this._adapter.storage) return this._adapter.storage;\n if (typeof localStorage !== 'undefined') return _webStorage(localStorage);\n if (!this._memStorage) this._memStorage = new _MemStorageImpl();\n return this._memStorage;\n }\n\n /**\n * Returns the best available session-scoped storage:\n * 1. Custom adapter registered via init()\n * 2. sessionStorage (web)\n * 3. Shared in-memory fallback\n */\n static getSessionStorage(): JoopStorageAdapter {\n if (this._adapter.storage) return this._adapter.storage;\n if (typeof sessionStorage !== 'undefined') return _webStorage(sessionStorage);\n if (!this._memStorage) this._memStorage = new _MemStorageImpl();\n return this._memStorage;\n }\n\n /** What APIs are available in the current environment */\n static capabilities(): JoopCapabilities {\n return {\n compression: typeof CompressionStream !== 'undefined' || !!this._adapter.compression,\n workers: typeof Worker !== 'undefined' || !!this._adapter.worker,\n cryptoSubtle: !!(typeof globalThis !== 'undefined' && (globalThis as typeof globalThis & { crypto?: Crypto }).crypto?.subtle),\n persistentStorage: typeof localStorage !== 'undefined' || !!this._adapter.storage,\n dom: typeof document !== 'undefined',\n serviceWorker: typeof navigator !== 'undefined' && 'serviceWorker' in navigator,\n };\n }\n\n /** Reset to auto-detected defaults — useful between tests */\n static _reset(): void {\n this._type = _detect();\n this._adapter = {};\n this._memStorage = null;\n }\n}\n"]}