@edge-base/web 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +352 -0
- package/dist/analytics.d.ts +60 -0
- package/dist/analytics.d.ts.map +1 -0
- package/dist/analytics.js +146 -0
- package/dist/analytics.js.map +1 -0
- package/dist/auth-refresh.d.ts +5 -0
- package/dist/auth-refresh.d.ts.map +1 -0
- package/dist/auth-refresh.js +26 -0
- package/dist/auth-refresh.js.map +1 -0
- package/dist/auth.d.ts +314 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +518 -0
- package/dist/auth.js.map +1 -0
- package/dist/browser-storage.d.ts +7 -0
- package/dist/browser-storage.d.ts.map +1 -0
- package/dist/browser-storage.js +43 -0
- package/dist/browser-storage.js.map +1 -0
- package/dist/client.d.ts +145 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +310 -0
- package/dist/client.js.map +1 -0
- package/dist/database-live.d.ts +65 -0
- package/dist/database-live.d.ts.map +1 -0
- package/dist/database-live.js +486 -0
- package/dist/database-live.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/match-filter.d.ts +30 -0
- package/dist/match-filter.d.ts.map +1 -0
- package/dist/match-filter.js +86 -0
- package/dist/match-filter.js.map +1 -0
- package/dist/room-realtime-media.d.ts +96 -0
- package/dist/room-realtime-media.d.ts.map +1 -0
- package/dist/room-realtime-media.js +418 -0
- package/dist/room-realtime-media.js.map +1 -0
- package/dist/room.d.ts +450 -0
- package/dist/room.d.ts.map +1 -0
- package/dist/room.js +1506 -0
- package/dist/room.js.map +1 -0
- package/dist/token-manager.d.ts +73 -0
- package/dist/token-manager.d.ts.map +1 -0
- package/dist/token-manager.js +378 -0
- package/dist/token-manager.js.map +1 -0
- package/dist/turnstile.d.ts +56 -0
- package/dist/turnstile.d.ts.map +1 -0
- package/dist/turnstile.js +191 -0
- package/dist/turnstile.js.map +1 -0
- package/llms.txt +549 -0
- package/package.json +50 -0
package/dist/auth.js
ADDED
|
@@ -0,0 +1,518 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth client for user authentication
|
|
3
|
+
*: onAuthStateChange
|
|
4
|
+
*: signInAnonymously
|
|
5
|
+
*: signUp with data
|
|
6
|
+
*/
|
|
7
|
+
import { resolveCaptchaToken } from './turnstile.js';
|
|
8
|
+
function getDefaultBrowserOAuthRedirectUrl() {
|
|
9
|
+
if (typeof window === 'undefined')
|
|
10
|
+
return '';
|
|
11
|
+
const origin = window.location?.origin;
|
|
12
|
+
if (!origin || origin === 'null')
|
|
13
|
+
return '';
|
|
14
|
+
return `${origin}/auth/callback`;
|
|
15
|
+
}
|
|
16
|
+
function resolveOAuthRedirectUrl(options) {
|
|
17
|
+
return options?.redirectUrl ?? options?.redirectTo ?? getDefaultBrowserOAuthRedirectUrl();
|
|
18
|
+
}
|
|
19
|
+
function toTokenUser(user) {
|
|
20
|
+
if (!user || typeof user !== 'object')
|
|
21
|
+
return null;
|
|
22
|
+
const source = user;
|
|
23
|
+
const id = source.id ?? source.sub;
|
|
24
|
+
if (typeof id !== 'string' && typeof id !== 'number')
|
|
25
|
+
return null;
|
|
26
|
+
const custom = source.custom && typeof source.custom === 'object'
|
|
27
|
+
? source.custom
|
|
28
|
+
: source.customClaims && typeof source.customClaims === 'object'
|
|
29
|
+
? source.customClaims
|
|
30
|
+
: undefined;
|
|
31
|
+
return {
|
|
32
|
+
id: String(id),
|
|
33
|
+
email: typeof source.email === 'string' ? source.email : undefined,
|
|
34
|
+
displayName: typeof source.displayName === 'string' ? source.displayName : undefined,
|
|
35
|
+
avatarUrl: typeof source.avatarUrl === 'string' ? source.avatarUrl : undefined,
|
|
36
|
+
role: typeof source.role === 'string' ? source.role : undefined,
|
|
37
|
+
isAnonymous: typeof source.isAnonymous === 'boolean' ? source.isAnonymous : undefined,
|
|
38
|
+
emailVisibility: typeof source.emailVisibility === 'string' ? source.emailVisibility : undefined,
|
|
39
|
+
custom,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export class AuthClient {
|
|
43
|
+
client;
|
|
44
|
+
tokenManager;
|
|
45
|
+
core;
|
|
46
|
+
corePublic;
|
|
47
|
+
baseUrl;
|
|
48
|
+
constructor(client, tokenManager, core, corePublic) {
|
|
49
|
+
this.client = client;
|
|
50
|
+
this.tokenManager = tokenManager;
|
|
51
|
+
this.core = core;
|
|
52
|
+
this.corePublic = corePublic;
|
|
53
|
+
this.baseUrl = client.getBaseUrl();
|
|
54
|
+
}
|
|
55
|
+
syncAuthResult(result) {
|
|
56
|
+
const normalizedUser = result.user ? toTokenUser(result.user) : null;
|
|
57
|
+
const mergedUser = normalizedUser
|
|
58
|
+
? {
|
|
59
|
+
...(this.tokenManager.getCurrentUser() ?? {}),
|
|
60
|
+
...normalizedUser,
|
|
61
|
+
}
|
|
62
|
+
: undefined;
|
|
63
|
+
if (result.accessToken && result.refreshToken) {
|
|
64
|
+
this.tokenManager.setTokens({
|
|
65
|
+
accessToken: result.accessToken,
|
|
66
|
+
refreshToken: result.refreshToken,
|
|
67
|
+
}, mergedUser);
|
|
68
|
+
return this.tokenManager.getCurrentUser();
|
|
69
|
+
}
|
|
70
|
+
if (result.accessToken) {
|
|
71
|
+
this.tokenManager.setAccessToken(result.accessToken, mergedUser);
|
|
72
|
+
return this.tokenManager.getCurrentUser();
|
|
73
|
+
}
|
|
74
|
+
if (mergedUser) {
|
|
75
|
+
this.tokenManager.setCurrentUser(mergedUser);
|
|
76
|
+
return mergedUser;
|
|
77
|
+
}
|
|
78
|
+
return this.tokenManager.getCurrentUser();
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Register a new user with email and password.
|
|
82
|
+
* Optionally include user metadata (displayName, avatarUrl).
|
|
83
|
+
*
|
|
84
|
+
*/
|
|
85
|
+
async signUp(options) {
|
|
86
|
+
const body = {
|
|
87
|
+
email: options.email,
|
|
88
|
+
password: options.password,
|
|
89
|
+
};
|
|
90
|
+
if (options.data) {
|
|
91
|
+
body.data = options.data;
|
|
92
|
+
}
|
|
93
|
+
if (options.locale) {
|
|
94
|
+
body.locale = options.locale;
|
|
95
|
+
}
|
|
96
|
+
//: auto-acquire captcha token if not manually provided
|
|
97
|
+
const captchaToken = await resolveCaptchaToken(this.baseUrl, 'signup', options.captchaToken);
|
|
98
|
+
if (captchaToken) {
|
|
99
|
+
body.captchaToken = captchaToken;
|
|
100
|
+
}
|
|
101
|
+
const result = await this.corePublic.authSignup(body);
|
|
102
|
+
this.syncAuthResult(result);
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
/** Sign in with email and password. Returns MfaRequiredResult if MFA is enabled. */
|
|
106
|
+
async signIn(options) {
|
|
107
|
+
const body = {
|
|
108
|
+
email: options.email,
|
|
109
|
+
password: options.password,
|
|
110
|
+
};
|
|
111
|
+
//: auto-acquire captcha token if not manually provided
|
|
112
|
+
const captchaToken = await resolveCaptchaToken(this.baseUrl, 'signin', options.captchaToken);
|
|
113
|
+
if (captchaToken) {
|
|
114
|
+
body.captchaToken = captchaToken;
|
|
115
|
+
}
|
|
116
|
+
const result = await this.corePublic.authSignin(body);
|
|
117
|
+
if ('mfaRequired' in result && result.mfaRequired) {
|
|
118
|
+
return result;
|
|
119
|
+
}
|
|
120
|
+
const authResult = result;
|
|
121
|
+
this.syncAuthResult(authResult);
|
|
122
|
+
return authResult;
|
|
123
|
+
}
|
|
124
|
+
/** Sign out (revokes current session) */
|
|
125
|
+
async signOut() {
|
|
126
|
+
try {
|
|
127
|
+
const refreshToken = this.tokenManager.getRefreshToken();
|
|
128
|
+
if (refreshToken) {
|
|
129
|
+
await this.core.authSignout({ refreshToken });
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
// Continue even if server call fails
|
|
134
|
+
}
|
|
135
|
+
this.tokenManager.clearTokens();
|
|
136
|
+
}
|
|
137
|
+
/** Refresh the current session using the stored refresh token. */
|
|
138
|
+
async refreshSession() {
|
|
139
|
+
const refreshToken = this.tokenManager.getRefreshToken();
|
|
140
|
+
if (!refreshToken) {
|
|
141
|
+
throw new Error('No refresh token available.');
|
|
142
|
+
}
|
|
143
|
+
const result = await this.corePublic.authRefresh({ refreshToken });
|
|
144
|
+
this.syncAuthResult(result);
|
|
145
|
+
return result;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Start OAuth sign-in flow.
|
|
149
|
+
* Constructs the OAuth redirect URL and navigates to it in browser.
|
|
150
|
+
* Returns the OAuth URL for manual handling in non-browser environments.
|
|
151
|
+
*: captchaToken is passed as query parameter for GET requests.
|
|
152
|
+
*
|
|
153
|
+
* NOTE: Not delegated to Generated Core — this is URL construction + redirect, not a standard HTTP call.
|
|
154
|
+
*/
|
|
155
|
+
signInWithOAuth(providerOrOptions, options) {
|
|
156
|
+
const provider = typeof providerOrOptions === 'string'
|
|
157
|
+
? providerOrOptions
|
|
158
|
+
: providerOrOptions.provider;
|
|
159
|
+
const resolvedOptions = typeof providerOrOptions === 'string'
|
|
160
|
+
? options
|
|
161
|
+
: providerOrOptions;
|
|
162
|
+
let url = `${this.client.getBaseUrl()}/api/auth/oauth/${encodeURIComponent(provider)}`;
|
|
163
|
+
const redirectUrl = resolveOAuthRedirectUrl(resolvedOptions);
|
|
164
|
+
// Append captcha token as query parameter
|
|
165
|
+
if (resolvedOptions?.captchaToken) {
|
|
166
|
+
url += `?captcha_token=${encodeURIComponent(resolvedOptions.captchaToken)}`;
|
|
167
|
+
}
|
|
168
|
+
if (redirectUrl) {
|
|
169
|
+
const sep = url.includes('?') ? '&' : '?';
|
|
170
|
+
url += `${sep}redirect_url=${encodeURIComponent(redirectUrl)}`;
|
|
171
|
+
}
|
|
172
|
+
// Auto-redirect in browser
|
|
173
|
+
if (typeof window !== 'undefined' && resolvedOptions?.navigate !== false) {
|
|
174
|
+
window.location.href = url;
|
|
175
|
+
}
|
|
176
|
+
return { url };
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Handle an OAuth callback URL, persist tokens, and update auth state.
|
|
180
|
+
* When called without arguments in the browser, it reads from window.location.href.
|
|
181
|
+
*/
|
|
182
|
+
async handleOAuthCallback(url) {
|
|
183
|
+
const callbackUrl = url
|
|
184
|
+
?? (typeof window !== 'undefined' ? window.location.href : '');
|
|
185
|
+
if (!callbackUrl)
|
|
186
|
+
return null;
|
|
187
|
+
try {
|
|
188
|
+
const parsed = new URL(callbackUrl, typeof window !== 'undefined' ? window.location.origin : 'http://localhost');
|
|
189
|
+
const accessToken = parsed.searchParams.get('access_token');
|
|
190
|
+
const refreshToken = parsed.searchParams.get('refresh_token');
|
|
191
|
+
if (!accessToken || !refreshToken)
|
|
192
|
+
return null;
|
|
193
|
+
const user = this.syncAuthResult({ accessToken, refreshToken });
|
|
194
|
+
if (!user)
|
|
195
|
+
return null;
|
|
196
|
+
if (!url && typeof window !== 'undefined' && typeof window.history?.replaceState === 'function') {
|
|
197
|
+
parsed.searchParams.delete('access_token');
|
|
198
|
+
parsed.searchParams.delete('refresh_token');
|
|
199
|
+
parsed.searchParams.delete('error');
|
|
200
|
+
parsed.searchParams.delete('error_description');
|
|
201
|
+
const nextUrl = `${parsed.pathname}${parsed.search}${parsed.hash}`;
|
|
202
|
+
window.history.replaceState({}, document.title, nextUrl);
|
|
203
|
+
}
|
|
204
|
+
return { user, accessToken, refreshToken };
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/** Sign in anonymously */
|
|
211
|
+
async signInAnonymously(options) {
|
|
212
|
+
//: auto-acquire captcha token if not manually provided
|
|
213
|
+
const captchaToken = await resolveCaptchaToken(this.baseUrl, 'anonymous', options?.captchaToken);
|
|
214
|
+
const body = captchaToken
|
|
215
|
+
? { captchaToken }
|
|
216
|
+
: undefined;
|
|
217
|
+
const result = await this.corePublic.authSigninAnonymous(body);
|
|
218
|
+
this.syncAuthResult(result);
|
|
219
|
+
return result;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Send a magic link (passwordless login) email.
|
|
223
|
+
* If the email is not registered and autoCreate is enabled (server config), a new account is created.
|
|
224
|
+
*/
|
|
225
|
+
async signInWithMagicLink(options) {
|
|
226
|
+
const body = { email: options.email };
|
|
227
|
+
const captchaToken = await resolveCaptchaToken(this.baseUrl, 'magic-link', options.captchaToken);
|
|
228
|
+
if (captchaToken) {
|
|
229
|
+
body.captchaToken = captchaToken;
|
|
230
|
+
}
|
|
231
|
+
if (options.redirectUrl)
|
|
232
|
+
body.redirectUrl = options.redirectUrl;
|
|
233
|
+
if (options.state)
|
|
234
|
+
body.state = options.state;
|
|
235
|
+
await this.client.postPublic('/api/auth/signin/magic-link', body);
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Verify a magic link token and sign in.
|
|
239
|
+
* Called after user clicks the link from their email.
|
|
240
|
+
*/
|
|
241
|
+
async verifyMagicLink(token) {
|
|
242
|
+
const result = await this.corePublic.authVerifyMagicLink({ token });
|
|
243
|
+
this.syncAuthResult(result);
|
|
244
|
+
return result;
|
|
245
|
+
}
|
|
246
|
+
// ─── Phone / SMS Auth ───
|
|
247
|
+
/**
|
|
248
|
+
* Send an SMS verification code to the given phone number.
|
|
249
|
+
* If the phone is not registered and autoCreate is enabled (server config), a new account is created on verify.
|
|
250
|
+
*/
|
|
251
|
+
async signInWithPhone(options) {
|
|
252
|
+
const body = { phone: options.phone };
|
|
253
|
+
const captchaToken = await resolveCaptchaToken(this.baseUrl, 'phone', options.captchaToken);
|
|
254
|
+
if (captchaToken) {
|
|
255
|
+
body.captchaToken = captchaToken;
|
|
256
|
+
}
|
|
257
|
+
await this.corePublic.authSigninPhone(body);
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Verify the SMS code and sign in.
|
|
261
|
+
* Called after user receives the code from signInWithPhone.
|
|
262
|
+
*/
|
|
263
|
+
async verifyPhone(options) {
|
|
264
|
+
const result = await this.corePublic.authVerifyPhone({
|
|
265
|
+
phone: options.phone,
|
|
266
|
+
code: options.code,
|
|
267
|
+
});
|
|
268
|
+
this.syncAuthResult(result);
|
|
269
|
+
return result;
|
|
270
|
+
}
|
|
271
|
+
/** Link current account with a phone number. Sends an SMS code. */
|
|
272
|
+
async linkWithPhone(options) {
|
|
273
|
+
await this.core.authLinkPhone({ phone: options.phone });
|
|
274
|
+
}
|
|
275
|
+
/** Verify phone link code. Completes phone linking for the current account. */
|
|
276
|
+
async verifyLinkPhone(options) {
|
|
277
|
+
await this.core.authVerifyLinkPhone({
|
|
278
|
+
phone: options.phone,
|
|
279
|
+
code: options.code,
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
/** Link anonymous account to email/password */
|
|
283
|
+
async linkWithEmail(options) {
|
|
284
|
+
const result = await this.core.authLinkEmail({
|
|
285
|
+
email: options.email,
|
|
286
|
+
password: options.password,
|
|
287
|
+
});
|
|
288
|
+
this.syncAuthResult(result);
|
|
289
|
+
return result;
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Link the current account to an OAuth provider.
|
|
293
|
+
*
|
|
294
|
+
* NOTE: Not delegated — Generated Core's oauthLinkStart(provider) takes no body,
|
|
295
|
+
* but we need to pass redirect and state options.
|
|
296
|
+
*/
|
|
297
|
+
async linkWithOAuth(providerOrOptions, options) {
|
|
298
|
+
const provider = typeof providerOrOptions === 'string'
|
|
299
|
+
? providerOrOptions
|
|
300
|
+
: providerOrOptions.provider;
|
|
301
|
+
const resolvedOptions = typeof providerOrOptions === 'string'
|
|
302
|
+
? options
|
|
303
|
+
: providerOrOptions;
|
|
304
|
+
const redirectUrl = resolveOAuthRedirectUrl(resolvedOptions);
|
|
305
|
+
const body = { redirectUrl };
|
|
306
|
+
if (resolvedOptions?.state) {
|
|
307
|
+
body.state = resolvedOptions.state;
|
|
308
|
+
}
|
|
309
|
+
const result = await this.client.post(`/api/auth/oauth/link/${encodeURIComponent(provider)}`, body);
|
|
310
|
+
if (typeof window !== 'undefined' && resolvedOptions?.navigate !== false) {
|
|
311
|
+
window.location.href = result.redirectUrl;
|
|
312
|
+
}
|
|
313
|
+
return result;
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Subscribe to authentication state changes.
|
|
317
|
+
* Callback fires immediately with current state, then on each change.
|
|
318
|
+
*
|
|
319
|
+
* @returns Unsubscribe function
|
|
320
|
+
*/
|
|
321
|
+
onAuthStateChange(callback) {
|
|
322
|
+
return this.tokenManager.onAuthStateChange(callback);
|
|
323
|
+
}
|
|
324
|
+
/** List active sessions */
|
|
325
|
+
async listSessions() {
|
|
326
|
+
const result = await this.core.authGetSessions();
|
|
327
|
+
return result.sessions;
|
|
328
|
+
}
|
|
329
|
+
/** Revoke a specific session */
|
|
330
|
+
async revokeSession(sessionId) {
|
|
331
|
+
await this.core.authDeleteSession(sessionId);
|
|
332
|
+
}
|
|
333
|
+
/** List linked sign-in identities for the current user. */
|
|
334
|
+
async listIdentities() {
|
|
335
|
+
return this.client.get('/api/auth/identities');
|
|
336
|
+
}
|
|
337
|
+
/** Unlink a linked OAuth identity by its identity ID. */
|
|
338
|
+
async unlinkIdentity(identityId) {
|
|
339
|
+
return this.client.delete(`/api/auth/identities/${encodeURIComponent(identityId)}`);
|
|
340
|
+
}
|
|
341
|
+
/** Get the current authenticated user (from cached JWT) */
|
|
342
|
+
get currentUser() {
|
|
343
|
+
return this.tokenManager.getCurrentUser();
|
|
344
|
+
}
|
|
345
|
+
/** Update current user's profile */
|
|
346
|
+
async updateProfile(data) {
|
|
347
|
+
const result = await this.core.authUpdateProfile(data);
|
|
348
|
+
return this.syncAuthResult(result);
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Update the user's preferred locale. Future auth emails will be sent in this language.
|
|
352
|
+
*
|
|
353
|
+
* @param locale - BCP 47 language tag (e.g. 'ko', 'ja', 'fr', 'en')
|
|
354
|
+
* @returns Updated user object
|
|
355
|
+
*
|
|
356
|
+
* @example
|
|
357
|
+
* await client.auth.updateLocale('ko'); // switch to Korean
|
|
358
|
+
*/
|
|
359
|
+
async updateLocale(locale) {
|
|
360
|
+
const result = await this.core.authUpdateProfile({ locale });
|
|
361
|
+
return this.syncAuthResult(result);
|
|
362
|
+
}
|
|
363
|
+
// ─── Email Verification & Password Reset (M14,) ───
|
|
364
|
+
/** Verify email address with token */
|
|
365
|
+
async verifyEmail(token) {
|
|
366
|
+
await this.corePublic.authVerifyEmail({ token });
|
|
367
|
+
}
|
|
368
|
+
/** Request a verification email for the current user. */
|
|
369
|
+
async requestEmailVerification(options) {
|
|
370
|
+
const body = {};
|
|
371
|
+
if (options?.redirectUrl)
|
|
372
|
+
body.redirectUrl = options.redirectUrl;
|
|
373
|
+
if (options?.state)
|
|
374
|
+
body.state = options.state;
|
|
375
|
+
await this.core.authRequestEmailVerification(body);
|
|
376
|
+
}
|
|
377
|
+
/** Request password reset email */
|
|
378
|
+
async requestPasswordReset(email, options) {
|
|
379
|
+
const body = { email };
|
|
380
|
+
//: auto-acquire captcha token if not manually provided
|
|
381
|
+
const captchaToken = await resolveCaptchaToken(this.baseUrl, 'password-reset', options?.captchaToken);
|
|
382
|
+
if (captchaToken) {
|
|
383
|
+
body.captchaToken = captchaToken;
|
|
384
|
+
}
|
|
385
|
+
if (options?.redirectUrl)
|
|
386
|
+
body.redirectUrl = options.redirectUrl;
|
|
387
|
+
if (options?.state)
|
|
388
|
+
body.state = options.state;
|
|
389
|
+
await this.client.postPublic('/api/auth/request-password-reset', body);
|
|
390
|
+
}
|
|
391
|
+
/** Reset password with token */
|
|
392
|
+
async resetPassword(token, newPassword) {
|
|
393
|
+
await this.corePublic.authResetPassword({ token, newPassword });
|
|
394
|
+
}
|
|
395
|
+
/** Change password for authenticated user */
|
|
396
|
+
async changePassword(options) {
|
|
397
|
+
const result = await this.core.authChangePassword({
|
|
398
|
+
currentPassword: options.currentPassword,
|
|
399
|
+
newPassword: options.newPassword,
|
|
400
|
+
});
|
|
401
|
+
this.syncAuthResult(result);
|
|
402
|
+
return result;
|
|
403
|
+
}
|
|
404
|
+
// ─── Email OTP Auth ───
|
|
405
|
+
/**
|
|
406
|
+
* Send an email OTP code for sign-in.
|
|
407
|
+
* If the email is not registered and autoCreate is enabled (server config), a new account is created on verify.
|
|
408
|
+
*/
|
|
409
|
+
async signInWithEmailOtp(options) {
|
|
410
|
+
await this.corePublic.authSigninEmailOtp({ email: options.email });
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Verify the email OTP code and sign in.
|
|
414
|
+
* Called after user receives the code from signInWithEmailOtp.
|
|
415
|
+
*/
|
|
416
|
+
async verifyEmailOtp(options) {
|
|
417
|
+
const result = await this.corePublic.authVerifyEmailOtp({
|
|
418
|
+
email: options.email,
|
|
419
|
+
code: options.code,
|
|
420
|
+
});
|
|
421
|
+
this.syncAuthResult(result);
|
|
422
|
+
return result;
|
|
423
|
+
}
|
|
424
|
+
// ─── Email Change ───
|
|
425
|
+
/**
|
|
426
|
+
* Request an email change. Sends a verification email to the new address.
|
|
427
|
+
* Requires the user's current password for confirmation.
|
|
428
|
+
*/
|
|
429
|
+
async changeEmail(options) {
|
|
430
|
+
const body = {
|
|
431
|
+
newEmail: options.newEmail,
|
|
432
|
+
password: options.password,
|
|
433
|
+
};
|
|
434
|
+
if (options.redirectUrl)
|
|
435
|
+
body.redirectUrl = options.redirectUrl;
|
|
436
|
+
if (options.state)
|
|
437
|
+
body.state = options.state;
|
|
438
|
+
await this.client.post('/api/auth/change-email', body);
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* Verify email change with token from the verification email.
|
|
442
|
+
*/
|
|
443
|
+
async verifyEmailChange(token) {
|
|
444
|
+
await this.corePublic.authVerifyEmailChange({ token });
|
|
445
|
+
}
|
|
446
|
+
// ─── Passkeys / WebAuthn REST layer ───
|
|
447
|
+
/** Generate WebAuthn registration options for the current authenticated user. */
|
|
448
|
+
async passkeysRegisterOptions() {
|
|
449
|
+
return this.core.authPasskeysRegisterOptions();
|
|
450
|
+
}
|
|
451
|
+
/** Verify and store a passkey registration response from the platform credential API. */
|
|
452
|
+
async passkeysRegister(response) {
|
|
453
|
+
return this.core.authPasskeysRegister({ response });
|
|
454
|
+
}
|
|
455
|
+
/** Generate WebAuthn authentication options. */
|
|
456
|
+
async passkeysAuthOptions(options) {
|
|
457
|
+
return this.corePublic.authPasskeysAuthOptions(options ?? {});
|
|
458
|
+
}
|
|
459
|
+
/** Verify a WebAuthn assertion and establish a session. */
|
|
460
|
+
async passkeysAuthenticate(response) {
|
|
461
|
+
const result = await this.corePublic.authPasskeysAuthenticate({ response });
|
|
462
|
+
this.syncAuthResult(result);
|
|
463
|
+
return result;
|
|
464
|
+
}
|
|
465
|
+
/** List registered passkeys for the current authenticated user. */
|
|
466
|
+
async passkeysList() {
|
|
467
|
+
return this.core.authPasskeysList();
|
|
468
|
+
}
|
|
469
|
+
/** Delete a registered passkey by credential ID. */
|
|
470
|
+
async passkeysDelete(credentialId) {
|
|
471
|
+
return this.core.authPasskeysDelete(credentialId);
|
|
472
|
+
}
|
|
473
|
+
// ─── MFA / TOTP ───
|
|
474
|
+
/** MFA sub-namespace for TOTP enrollment, verification, and management. */
|
|
475
|
+
get mfa() {
|
|
476
|
+
const client = this.client;
|
|
477
|
+
const core = this.core;
|
|
478
|
+
const corePublic = this.corePublic;
|
|
479
|
+
const syncAuthResult = this.syncAuthResult.bind(this);
|
|
480
|
+
return {
|
|
481
|
+
/** Enroll TOTP — returns secret, QR code URI, and recovery codes. */
|
|
482
|
+
async enrollTotp() {
|
|
483
|
+
return core.authMfaTotpEnroll();
|
|
484
|
+
},
|
|
485
|
+
/** Verify TOTP enrollment with factorId and a TOTP code. */
|
|
486
|
+
async verifyTotpEnrollment(factorId, code) {
|
|
487
|
+
return core.authMfaTotpVerify({ factorId, code });
|
|
488
|
+
},
|
|
489
|
+
/** Verify TOTP code during MFA challenge (after signIn returns mfaRequired). */
|
|
490
|
+
async verifyTotp(mfaTicket, code) {
|
|
491
|
+
const result = await corePublic.authMfaVerify({
|
|
492
|
+
mfaTicket,
|
|
493
|
+
code,
|
|
494
|
+
});
|
|
495
|
+
syncAuthResult(result);
|
|
496
|
+
return result;
|
|
497
|
+
},
|
|
498
|
+
/** Use a recovery code during MFA challenge. */
|
|
499
|
+
async useRecoveryCode(mfaTicket, recoveryCode) {
|
|
500
|
+
const result = await corePublic.authMfaRecovery({
|
|
501
|
+
mfaTicket,
|
|
502
|
+
recoveryCode,
|
|
503
|
+
});
|
|
504
|
+
syncAuthResult(result);
|
|
505
|
+
return result;
|
|
506
|
+
},
|
|
507
|
+
/** Disable TOTP for the current user. Requires password or TOTP code. */
|
|
508
|
+
async disableTotp(options) {
|
|
509
|
+
return core.authMfaTotpDelete(options ?? {});
|
|
510
|
+
},
|
|
511
|
+
/** List enrolled MFA factors for the current user. */
|
|
512
|
+
async listFactors() {
|
|
513
|
+
return core.authMfaFactors();
|
|
514
|
+
},
|
|
515
|
+
};
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface BrowserStorageAdapter {
|
|
2
|
+
getItem(key: string): string | null;
|
|
3
|
+
setItem(key: string, value: string): void;
|
|
4
|
+
removeItem(key: string): void;
|
|
5
|
+
}
|
|
6
|
+
export declare function createBrowserStorage(): BrowserStorageAdapter;
|
|
7
|
+
//# sourceMappingURL=browser-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-storage.d.ts","sourceRoot":"","sources":["../src/browser-storage.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACpC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AA2CD,wBAAgB,oBAAoB,IAAI,qBAAqB,CAG5D"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
function isBrowserStorageAdapter(value) {
|
|
2
|
+
return Boolean(value)
|
|
3
|
+
&& typeof value.getItem === 'function'
|
|
4
|
+
&& typeof value.setItem === 'function'
|
|
5
|
+
&& typeof value.removeItem === 'function';
|
|
6
|
+
}
|
|
7
|
+
function resolveBrowserStorageCandidate() {
|
|
8
|
+
if (typeof window === 'undefined') {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
try {
|
|
12
|
+
const globalStorage = globalThis.localStorage;
|
|
13
|
+
if (isBrowserStorageAdapter(globalStorage)) {
|
|
14
|
+
return globalStorage;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
return window.localStorage;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function createMemoryStorage() {
|
|
28
|
+
const store = new Map();
|
|
29
|
+
return {
|
|
30
|
+
getItem: (key) => store.get(key) ?? null,
|
|
31
|
+
setItem: (key, value) => {
|
|
32
|
+
store.set(key, value);
|
|
33
|
+
},
|
|
34
|
+
removeItem: (key) => {
|
|
35
|
+
store.delete(key);
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export function createBrowserStorage() {
|
|
40
|
+
const candidate = resolveBrowserStorageCandidate();
|
|
41
|
+
return isBrowserStorageAdapter(candidate) ? candidate : createMemoryStorage();
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=browser-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-storage.js","sourceRoot":"","sources":["../src/browser-storage.ts"],"names":[],"mappings":"AAMA,SAAS,uBAAuB,CAAC,KAAc;IAC7C,OAAO,OAAO,CAAC,KAAK,CAAC;WAChB,OAAQ,KAA+B,CAAC,OAAO,KAAK,UAAU;WAC9D,OAAQ,KAA+B,CAAC,OAAO,KAAK,UAAU;WAC9D,OAAQ,KAA+B,CAAC,UAAU,KAAK,UAAU,CAAC;AACzE,CAAC;AAED,SAAS,8BAA8B;IACrC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,aAAa,GAAI,UAAyC,CAAC,YAAY,CAAC;QAC9E,IAAI,uBAAuB,CAAC,aAAa,CAAC,EAAE,CAAC;YAC3C,OAAO,aAAa,CAAC;QACvB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,OAAQ,MAA8C,CAAC,YAAY,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB;IAC1B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,OAAO;QACL,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI;QACxC,OAAO,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YACtB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACxB,CAAC;QACD,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE;YAClB,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,MAAM,SAAS,GAAG,8BAA8B,EAAE,CAAC;IACnD,OAAO,uBAAuB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC;AAChF,CAAC"}
|