@supabase/gotrue-js 2.79.1-canary.2 → 2.80.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -17
- package/dist/main/AuthAdminApi.js +2 -4
- package/dist/main/AuthAdminApi.js.map +1 -1
- package/dist/main/AuthClient.js +2 -4
- package/dist/main/AuthClient.js.map +1 -1
- package/dist/main/GoTrueAdminApi.d.ts +7 -0
- package/dist/main/GoTrueAdminApi.d.ts.map +1 -1
- package/dist/main/GoTrueAdminApi.js +28 -15
- package/dist/main/GoTrueAdminApi.js.map +1 -1
- package/dist/main/GoTrueClient.d.ts +38 -1
- package/dist/main/GoTrueClient.d.ts.map +1 -1
- package/dist/main/GoTrueClient.js +293 -152
- package/dist/main/GoTrueClient.js.map +1 -1
- package/dist/main/index.js +7 -23
- package/dist/main/index.js.map +1 -1
- package/dist/main/lib/error-codes.d.ts +1 -1
- package/dist/main/lib/fetch.js +2 -12
- package/dist/main/lib/fetch.js.map +1 -1
- package/dist/main/lib/helpers.d.ts +11 -0
- package/dist/main/lib/helpers.d.ts.map +1 -1
- package/dist/main/lib/helpers.js +39 -42
- package/dist/main/lib/helpers.js.map +1 -1
- package/dist/main/lib/types.d.ts +145 -3
- package/dist/main/lib/types.d.ts.map +1 -1
- package/dist/main/lib/types.js.map +1 -1
- package/dist/main/lib/version.d.ts +1 -1
- package/dist/main/lib/version.d.ts.map +1 -1
- package/dist/main/lib/version.js +1 -1
- package/dist/main/lib/version.js.map +1 -1
- package/dist/main/lib/webauthn.js +3 -13
- package/dist/main/lib/webauthn.js.map +1 -1
- package/dist/module/GoTrueAdminApi.d.ts +7 -0
- package/dist/module/GoTrueAdminApi.d.ts.map +1 -1
- package/dist/module/GoTrueAdminApi.js +27 -14
- package/dist/module/GoTrueAdminApi.js.map +1 -1
- package/dist/module/GoTrueClient.d.ts +38 -1
- package/dist/module/GoTrueClient.d.ts.map +1 -1
- package/dist/module/GoTrueClient.js +292 -149
- package/dist/module/GoTrueClient.js.map +1 -1
- package/dist/module/lib/error-codes.d.ts +1 -1
- package/dist/module/lib/fetch.js +1 -11
- package/dist/module/lib/fetch.js.map +1 -1
- package/dist/module/lib/helpers.d.ts +11 -0
- package/dist/module/lib/helpers.d.ts.map +1 -1
- package/dist/module/lib/helpers.js +38 -9
- package/dist/module/lib/helpers.js.map +1 -1
- package/dist/module/lib/types.d.ts +145 -3
- package/dist/module/lib/types.d.ts.map +1 -1
- package/dist/module/lib/types.js.map +1 -1
- package/dist/module/lib/version.d.ts +1 -1
- package/dist/module/lib/version.d.ts.map +1 -1
- package/dist/module/lib/version.js +1 -1
- package/dist/module/lib/version.js.map +1 -1
- package/dist/module/lib/webauthn.js +1 -11
- package/dist/module/lib/webauthn.js.map +1 -1
- package/dist/tsconfig.module.tsbuildinfo +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +9 -10
- package/src/GoTrueAdminApi.ts +38 -15
- package/src/GoTrueClient.ts +356 -150
- package/src/lib/error-codes.ts +1 -1
- package/src/lib/helpers.ts +46 -8
- package/src/lib/types.ts +159 -2
- package/src/lib/version.ts +1 -1
|
@@ -2,7 +2,7 @@ import GoTrueAdminApi from './GoTrueAdminApi';
|
|
|
2
2
|
import { AUTO_REFRESH_TICK_DURATION_MS, AUTO_REFRESH_TICK_THRESHOLD, DEFAULT_HEADERS, EXPIRY_MARGIN_MS, GOTRUE_URL, JWKS_TTL, STORAGE_KEY, } from './lib/constants';
|
|
3
3
|
import { AuthImplicitGrantRedirectError, AuthInvalidCredentialsError, AuthInvalidJwtError, AuthInvalidTokenResponseError, AuthPKCEGrantCodeExchangeError, AuthSessionMissingError, AuthUnknownError, isAuthApiError, isAuthError, isAuthImplicitGrantRedirectError, isAuthRetryableFetchError, isAuthSessionMissingError, } from './lib/errors';
|
|
4
4
|
import { _request, _sessionResponse, _sessionResponsePassword, _ssoResponse, _userResponse, } from './lib/fetch';
|
|
5
|
-
import { decodeJWT, deepClone, Deferred, getAlgorithm, getCodeChallengeAndMethod, getItemAsync, isBrowser, parseParametersFromURL, removeItemAsync, resolveFetch, retryable, setItemAsync, sleep, supportsLocalStorage, userNotAvailableProxy, uuid, validateExp, } from './lib/helpers';
|
|
5
|
+
import { decodeJWT, deepClone, Deferred, getAlgorithm, getCodeChallengeAndMethod, getItemAsync, insecureUserWarningProxy, isBrowser, parseParametersFromURL, removeItemAsync, resolveFetch, retryable, setItemAsync, sleep, supportsLocalStorage, userNotAvailableProxy, uuid, validateExp, } from './lib/helpers';
|
|
6
6
|
import { memoryLocalStorageAdapter } from './lib/local-storage';
|
|
7
7
|
import { LockAcquireTimeoutError, navigatorLock } from './lib/locks';
|
|
8
8
|
import { polyfillGlobalThis } from './lib/polyfills';
|
|
@@ -21,6 +21,7 @@ const DEFAULT_OPTIONS = {
|
|
|
21
21
|
flowType: 'implicit',
|
|
22
22
|
debug: false,
|
|
23
23
|
hasCustomAuthorizationHeader: false,
|
|
24
|
+
throwOnError: false,
|
|
24
25
|
};
|
|
25
26
|
async function lockNoOp(name, acquireTimeout, fn) {
|
|
26
27
|
return await fn();
|
|
@@ -56,7 +57,7 @@ class GoTrueClient {
|
|
|
56
57
|
* Create a new client for use in the browser.
|
|
57
58
|
*/
|
|
58
59
|
constructor(options) {
|
|
59
|
-
var _a, _b;
|
|
60
|
+
var _a, _b, _c;
|
|
60
61
|
/**
|
|
61
62
|
* @experimental
|
|
62
63
|
*/
|
|
@@ -83,18 +84,22 @@ class GoTrueClient {
|
|
|
83
84
|
*/
|
|
84
85
|
this.broadcastChannel = null;
|
|
85
86
|
this.logger = console.log;
|
|
86
|
-
this.instanceID = GoTrueClient.nextInstanceID;
|
|
87
|
-
GoTrueClient.nextInstanceID += 1;
|
|
88
|
-
if (this.instanceID > 0 && isBrowser()) {
|
|
89
|
-
console.warn('Multiple GoTrueClient instances detected in the same browser context. It is not an error, but this should be avoided as it may produce undefined behavior when used concurrently under the same storage key.');
|
|
90
|
-
}
|
|
91
87
|
const settings = Object.assign(Object.assign({}, DEFAULT_OPTIONS), options);
|
|
88
|
+
this.storageKey = settings.storageKey;
|
|
89
|
+
this.instanceID = (_a = GoTrueClient.nextInstanceID[this.storageKey]) !== null && _a !== void 0 ? _a : 0;
|
|
90
|
+
GoTrueClient.nextInstanceID[this.storageKey] = this.instanceID + 1;
|
|
92
91
|
this.logDebugMessages = !!settings.debug;
|
|
93
92
|
if (typeof settings.debug === 'function') {
|
|
94
93
|
this.logger = settings.debug;
|
|
95
94
|
}
|
|
95
|
+
if (this.instanceID > 0 && isBrowser()) {
|
|
96
|
+
const message = `${this._logPrefix()} Multiple GoTrueClient instances detected in the same browser context. It is not an error, but this should be avoided as it may produce undefined behavior when used concurrently under the same storage key.`;
|
|
97
|
+
console.warn(message);
|
|
98
|
+
if (this.logDebugMessages) {
|
|
99
|
+
console.trace(message);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
96
102
|
this.persistSession = settings.persistSession;
|
|
97
|
-
this.storageKey = settings.storageKey;
|
|
98
103
|
this.autoRefreshToken = settings.autoRefreshToken;
|
|
99
104
|
this.admin = new GoTrueAdminApi({
|
|
100
105
|
url: settings.url,
|
|
@@ -108,10 +113,11 @@ class GoTrueClient {
|
|
|
108
113
|
this.detectSessionInUrl = settings.detectSessionInUrl;
|
|
109
114
|
this.flowType = settings.flowType;
|
|
110
115
|
this.hasCustomAuthorizationHeader = settings.hasCustomAuthorizationHeader;
|
|
116
|
+
this.throwOnError = settings.throwOnError;
|
|
111
117
|
if (settings.lock) {
|
|
112
118
|
this.lock = settings.lock;
|
|
113
119
|
}
|
|
114
|
-
else if (isBrowser() && ((
|
|
120
|
+
else if (isBrowser() && ((_b = globalThis === null || globalThis === void 0 ? void 0 : globalThis.navigator) === null || _b === void 0 ? void 0 : _b.locks)) {
|
|
115
121
|
this.lock = navigatorLock;
|
|
116
122
|
}
|
|
117
123
|
else {
|
|
@@ -131,6 +137,11 @@ class GoTrueClient {
|
|
|
131
137
|
getAuthenticatorAssuranceLevel: this._getAuthenticatorAssuranceLevel.bind(this),
|
|
132
138
|
webauthn: new WebAuthnApi(this),
|
|
133
139
|
};
|
|
140
|
+
this.oauth = {
|
|
141
|
+
getAuthorizationDetails: this._getAuthorizationDetails.bind(this),
|
|
142
|
+
approveAuthorization: this._approveAuthorization.bind(this),
|
|
143
|
+
denyAuthorization: this._denyAuthorization.bind(this),
|
|
144
|
+
};
|
|
134
145
|
if (this.persistSession) {
|
|
135
146
|
if (settings.storage) {
|
|
136
147
|
this.storage = settings.storage;
|
|
@@ -159,16 +170,37 @@ class GoTrueClient {
|
|
|
159
170
|
catch (e) {
|
|
160
171
|
console.error('Failed to create a new BroadcastChannel, multi-tab state changes will not be available', e);
|
|
161
172
|
}
|
|
162
|
-
(
|
|
173
|
+
(_c = this.broadcastChannel) === null || _c === void 0 ? void 0 : _c.addEventListener('message', async (event) => {
|
|
163
174
|
this._debug('received broadcast notification from other tab or client', event);
|
|
164
175
|
await this._notifyAllSubscribers(event.data.event, event.data.session, false); // broadcast = false so we don't get an endless loop of messages
|
|
165
176
|
});
|
|
166
177
|
}
|
|
167
178
|
this.initialize();
|
|
168
179
|
}
|
|
180
|
+
/**
|
|
181
|
+
* Returns whether error throwing mode is enabled for this client.
|
|
182
|
+
*/
|
|
183
|
+
isThrowOnErrorEnabled() {
|
|
184
|
+
return this.throwOnError;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Centralizes return handling with optional error throwing. When `throwOnError` is enabled
|
|
188
|
+
* and the provided result contains a non-nullish error, the error is thrown instead of
|
|
189
|
+
* being returned. This ensures consistent behavior across all public API methods.
|
|
190
|
+
*/
|
|
191
|
+
_returnResult(result) {
|
|
192
|
+
if (this.throwOnError && result && result.error) {
|
|
193
|
+
throw result.error;
|
|
194
|
+
}
|
|
195
|
+
return result;
|
|
196
|
+
}
|
|
197
|
+
_logPrefix() {
|
|
198
|
+
return ('GoTrueClient@' +
|
|
199
|
+
`${this.storageKey}:${this.instanceID} (${version}) ${new Date().toISOString()}`);
|
|
200
|
+
}
|
|
169
201
|
_debug(...args) {
|
|
170
202
|
if (this.logDebugMessages) {
|
|
171
|
-
this.logger(
|
|
203
|
+
this.logger(this._logPrefix(), ...args);
|
|
172
204
|
}
|
|
173
205
|
return this;
|
|
174
206
|
}
|
|
@@ -197,13 +229,16 @@ class GoTrueClient {
|
|
|
197
229
|
async _initialize() {
|
|
198
230
|
var _a;
|
|
199
231
|
try {
|
|
200
|
-
|
|
232
|
+
let params = {};
|
|
201
233
|
let callbackUrlType = 'none';
|
|
202
|
-
if (
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
234
|
+
if (isBrowser()) {
|
|
235
|
+
params = parseParametersFromURL(window.location.href);
|
|
236
|
+
if (this._isImplicitGrantCallback(params)) {
|
|
237
|
+
callbackUrlType = 'implicit';
|
|
238
|
+
}
|
|
239
|
+
else if (await this._isPKCECallback(params)) {
|
|
240
|
+
callbackUrlType = 'pkce';
|
|
241
|
+
}
|
|
207
242
|
}
|
|
208
243
|
/**
|
|
209
244
|
* Attempt to get the session from the URL only if these conditions are fulfilled
|
|
@@ -247,11 +282,11 @@ class GoTrueClient {
|
|
|
247
282
|
}
|
|
248
283
|
catch (error) {
|
|
249
284
|
if (isAuthError(error)) {
|
|
250
|
-
return { error };
|
|
285
|
+
return this._returnResult({ error });
|
|
251
286
|
}
|
|
252
|
-
return {
|
|
287
|
+
return this._returnResult({
|
|
253
288
|
error: new AuthUnknownError('Unexpected error during initialization', error),
|
|
254
|
-
};
|
|
289
|
+
});
|
|
255
290
|
}
|
|
256
291
|
finally {
|
|
257
292
|
await this._handleVisibilityChange();
|
|
@@ -276,7 +311,7 @@ class GoTrueClient {
|
|
|
276
311
|
});
|
|
277
312
|
const { data, error } = res;
|
|
278
313
|
if (error || !data) {
|
|
279
|
-
return { data: { user: null, session: null }, error: error };
|
|
314
|
+
return this._returnResult({ data: { user: null, session: null }, error: error });
|
|
280
315
|
}
|
|
281
316
|
const session = data.session;
|
|
282
317
|
const user = data.user;
|
|
@@ -284,11 +319,11 @@ class GoTrueClient {
|
|
|
284
319
|
await this._saveSession(data.session);
|
|
285
320
|
await this._notifyAllSubscribers('SIGNED_IN', session);
|
|
286
321
|
}
|
|
287
|
-
return { data: { user, session }, error: null };
|
|
322
|
+
return this._returnResult({ data: { user, session }, error: null });
|
|
288
323
|
}
|
|
289
324
|
catch (error) {
|
|
290
325
|
if (isAuthError(error)) {
|
|
291
|
-
return { data: { user: null, session: null }, error };
|
|
326
|
+
return this._returnResult({ data: { user: null, session: null }, error });
|
|
292
327
|
}
|
|
293
328
|
throw error;
|
|
294
329
|
}
|
|
@@ -348,7 +383,7 @@ class GoTrueClient {
|
|
|
348
383
|
}
|
|
349
384
|
const { data, error } = res;
|
|
350
385
|
if (error || !data) {
|
|
351
|
-
return { data: { user: null, session: null }, error: error };
|
|
386
|
+
return this._returnResult({ data: { user: null, session: null }, error: error });
|
|
352
387
|
}
|
|
353
388
|
const session = data.session;
|
|
354
389
|
const user = data.user;
|
|
@@ -356,11 +391,11 @@ class GoTrueClient {
|
|
|
356
391
|
await this._saveSession(data.session);
|
|
357
392
|
await this._notifyAllSubscribers('SIGNED_IN', session);
|
|
358
393
|
}
|
|
359
|
-
return { data: { user, session }, error: null };
|
|
394
|
+
return this._returnResult({ data: { user, session }, error: null });
|
|
360
395
|
}
|
|
361
396
|
catch (error) {
|
|
362
397
|
if (isAuthError(error)) {
|
|
363
|
-
return { data: { user: null, session: null }, error };
|
|
398
|
+
return this._returnResult({ data: { user: null, session: null }, error });
|
|
364
399
|
}
|
|
365
400
|
throw error;
|
|
366
401
|
}
|
|
@@ -405,23 +440,24 @@ class GoTrueClient {
|
|
|
405
440
|
}
|
|
406
441
|
const { data, error } = res;
|
|
407
442
|
if (error) {
|
|
408
|
-
return { data: { user: null, session: null }, error };
|
|
443
|
+
return this._returnResult({ data: { user: null, session: null }, error });
|
|
409
444
|
}
|
|
410
445
|
else if (!data || !data.session || !data.user) {
|
|
411
|
-
|
|
446
|
+
const invalidTokenError = new AuthInvalidTokenResponseError();
|
|
447
|
+
return this._returnResult({ data: { user: null, session: null }, error: invalidTokenError });
|
|
412
448
|
}
|
|
413
449
|
if (data.session) {
|
|
414
450
|
await this._saveSession(data.session);
|
|
415
451
|
await this._notifyAllSubscribers('SIGNED_IN', data.session);
|
|
416
452
|
}
|
|
417
|
-
return {
|
|
453
|
+
return this._returnResult({
|
|
418
454
|
data: Object.assign({ user: data.user, session: data.session }, (data.weak_password ? { weakPassword: data.weak_password } : null)),
|
|
419
455
|
error,
|
|
420
|
-
};
|
|
456
|
+
});
|
|
421
457
|
}
|
|
422
458
|
catch (error) {
|
|
423
459
|
if (isAuthError(error)) {
|
|
424
|
-
return { data: { user: null, session: null }, error };
|
|
460
|
+
return this._returnResult({ data: { user: null, session: null }, error });
|
|
425
461
|
}
|
|
426
462
|
throw error;
|
|
427
463
|
}
|
|
@@ -553,20 +589,18 @@ class GoTrueClient {
|
|
|
553
589
|
throw error;
|
|
554
590
|
}
|
|
555
591
|
if (!data || !data.session || !data.user) {
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
error: new AuthInvalidTokenResponseError(),
|
|
559
|
-
};
|
|
592
|
+
const invalidTokenError = new AuthInvalidTokenResponseError();
|
|
593
|
+
return this._returnResult({ data: { user: null, session: null }, error: invalidTokenError });
|
|
560
594
|
}
|
|
561
595
|
if (data.session) {
|
|
562
596
|
await this._saveSession(data.session);
|
|
563
597
|
await this._notifyAllSubscribers('SIGNED_IN', data.session);
|
|
564
598
|
}
|
|
565
|
-
return { data: Object.assign({}, data), error };
|
|
599
|
+
return this._returnResult({ data: Object.assign({}, data), error });
|
|
566
600
|
}
|
|
567
601
|
catch (error) {
|
|
568
602
|
if (isAuthError(error)) {
|
|
569
|
-
return { data: { user: null, session: null }, error };
|
|
603
|
+
return this._returnResult({ data: { user: null, session: null }, error });
|
|
570
604
|
}
|
|
571
605
|
throw error;
|
|
572
606
|
}
|
|
@@ -693,20 +727,18 @@ class GoTrueClient {
|
|
|
693
727
|
throw error;
|
|
694
728
|
}
|
|
695
729
|
if (!data || !data.session || !data.user) {
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
error: new AuthInvalidTokenResponseError(),
|
|
699
|
-
};
|
|
730
|
+
const invalidTokenError = new AuthInvalidTokenResponseError();
|
|
731
|
+
return this._returnResult({ data: { user: null, session: null }, error: invalidTokenError });
|
|
700
732
|
}
|
|
701
733
|
if (data.session) {
|
|
702
734
|
await this._saveSession(data.session);
|
|
703
735
|
await this._notifyAllSubscribers('SIGNED_IN', data.session);
|
|
704
736
|
}
|
|
705
|
-
return { data: Object.assign({}, data), error };
|
|
737
|
+
return this._returnResult({ data: Object.assign({}, data), error });
|
|
706
738
|
}
|
|
707
739
|
catch (error) {
|
|
708
740
|
if (isAuthError(error)) {
|
|
709
|
-
return { data: { user: null, session: null }, error };
|
|
741
|
+
return this._returnResult({ data: { user: null, session: null }, error });
|
|
710
742
|
}
|
|
711
743
|
throw error;
|
|
712
744
|
}
|
|
@@ -728,20 +760,24 @@ class GoTrueClient {
|
|
|
728
760
|
throw error;
|
|
729
761
|
}
|
|
730
762
|
if (!data || !data.session || !data.user) {
|
|
731
|
-
|
|
763
|
+
const invalidTokenError = new AuthInvalidTokenResponseError();
|
|
764
|
+
return this._returnResult({
|
|
732
765
|
data: { user: null, session: null, redirectType: null },
|
|
733
|
-
error:
|
|
734
|
-
};
|
|
766
|
+
error: invalidTokenError,
|
|
767
|
+
});
|
|
735
768
|
}
|
|
736
769
|
if (data.session) {
|
|
737
770
|
await this._saveSession(data.session);
|
|
738
771
|
await this._notifyAllSubscribers('SIGNED_IN', data.session);
|
|
739
772
|
}
|
|
740
|
-
return { data: Object.assign(Object.assign({}, data), { redirectType: redirectType !== null && redirectType !== void 0 ? redirectType : null }), error };
|
|
773
|
+
return this._returnResult({ data: Object.assign(Object.assign({}, data), { redirectType: redirectType !== null && redirectType !== void 0 ? redirectType : null }), error });
|
|
741
774
|
}
|
|
742
775
|
catch (error) {
|
|
743
776
|
if (isAuthError(error)) {
|
|
744
|
-
return {
|
|
777
|
+
return this._returnResult({
|
|
778
|
+
data: { user: null, session: null, redirectType: null },
|
|
779
|
+
error,
|
|
780
|
+
});
|
|
745
781
|
}
|
|
746
782
|
throw error;
|
|
747
783
|
}
|
|
@@ -766,23 +802,21 @@ class GoTrueClient {
|
|
|
766
802
|
});
|
|
767
803
|
const { data, error } = res;
|
|
768
804
|
if (error) {
|
|
769
|
-
return { data: { user: null, session: null }, error };
|
|
805
|
+
return this._returnResult({ data: { user: null, session: null }, error });
|
|
770
806
|
}
|
|
771
807
|
else if (!data || !data.session || !data.user) {
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
error: new AuthInvalidTokenResponseError(),
|
|
775
|
-
};
|
|
808
|
+
const invalidTokenError = new AuthInvalidTokenResponseError();
|
|
809
|
+
return this._returnResult({ data: { user: null, session: null }, error: invalidTokenError });
|
|
776
810
|
}
|
|
777
811
|
if (data.session) {
|
|
778
812
|
await this._saveSession(data.session);
|
|
779
813
|
await this._notifyAllSubscribers('SIGNED_IN', data.session);
|
|
780
814
|
}
|
|
781
|
-
return { data, error };
|
|
815
|
+
return this._returnResult({ data, error });
|
|
782
816
|
}
|
|
783
817
|
catch (error) {
|
|
784
818
|
if (isAuthError(error)) {
|
|
785
|
-
return { data: { user: null, session: null }, error };
|
|
819
|
+
return this._returnResult({ data: { user: null, session: null }, error });
|
|
786
820
|
}
|
|
787
821
|
throw error;
|
|
788
822
|
}
|
|
@@ -827,7 +861,7 @@ class GoTrueClient {
|
|
|
827
861
|
},
|
|
828
862
|
redirectTo: options === null || options === void 0 ? void 0 : options.emailRedirectTo,
|
|
829
863
|
});
|
|
830
|
-
return { data: { user: null, session: null }, error };
|
|
864
|
+
return this._returnResult({ data: { user: null, session: null }, error });
|
|
831
865
|
}
|
|
832
866
|
if ('phone' in credentials) {
|
|
833
867
|
const { phone, options } = credentials;
|
|
@@ -841,13 +875,16 @@ class GoTrueClient {
|
|
|
841
875
|
channel: (_e = options === null || options === void 0 ? void 0 : options.channel) !== null && _e !== void 0 ? _e : 'sms',
|
|
842
876
|
},
|
|
843
877
|
});
|
|
844
|
-
return {
|
|
878
|
+
return this._returnResult({
|
|
879
|
+
data: { user: null, session: null, messageId: data === null || data === void 0 ? void 0 : data.message_id },
|
|
880
|
+
error,
|
|
881
|
+
});
|
|
845
882
|
}
|
|
846
883
|
throw new AuthInvalidCredentialsError('You must provide either an email or phone number.');
|
|
847
884
|
}
|
|
848
885
|
catch (error) {
|
|
849
886
|
if (isAuthError(error)) {
|
|
850
|
-
return { data: { user: null, session: null }, error };
|
|
887
|
+
return this._returnResult({ data: { user: null, session: null }, error });
|
|
851
888
|
}
|
|
852
889
|
throw error;
|
|
853
890
|
}
|
|
@@ -874,7 +911,8 @@ class GoTrueClient {
|
|
|
874
911
|
throw error;
|
|
875
912
|
}
|
|
876
913
|
if (!data) {
|
|
877
|
-
|
|
914
|
+
const tokenVerificationError = new Error('An error occurred on token verification.');
|
|
915
|
+
throw tokenVerificationError;
|
|
878
916
|
}
|
|
879
917
|
const session = data.session;
|
|
880
918
|
const user = data.user;
|
|
@@ -882,11 +920,11 @@ class GoTrueClient {
|
|
|
882
920
|
await this._saveSession(session);
|
|
883
921
|
await this._notifyAllSubscribers(params.type == 'recovery' ? 'PASSWORD_RECOVERY' : 'SIGNED_IN', session);
|
|
884
922
|
}
|
|
885
|
-
return { data: { user, session }, error: null };
|
|
923
|
+
return this._returnResult({ data: { user, session }, error: null });
|
|
886
924
|
}
|
|
887
925
|
catch (error) {
|
|
888
926
|
if (isAuthError(error)) {
|
|
889
|
-
return { data: { user: null, session: null }, error };
|
|
927
|
+
return this._returnResult({ data: { user: null, session: null }, error });
|
|
890
928
|
}
|
|
891
929
|
throw error;
|
|
892
930
|
}
|
|
@@ -914,17 +952,18 @@ class GoTrueClient {
|
|
|
914
952
|
;
|
|
915
953
|
[codeChallenge, codeChallengeMethod] = await getCodeChallengeAndMethod(this.storage, this.storageKey);
|
|
916
954
|
}
|
|
917
|
-
|
|
955
|
+
const result = await _request(this.fetch, 'POST', `${this.url}/sso`, {
|
|
918
956
|
body: Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, ('providerId' in params ? { provider_id: params.providerId } : null)), ('domain' in params ? { domain: params.domain } : null)), { redirect_to: (_b = (_a = params.options) === null || _a === void 0 ? void 0 : _a.redirectTo) !== null && _b !== void 0 ? _b : undefined }), (((_c = params === null || params === void 0 ? void 0 : params.options) === null || _c === void 0 ? void 0 : _c.captchaToken)
|
|
919
957
|
? { gotrue_meta_security: { captcha_token: params.options.captchaToken } }
|
|
920
958
|
: null)), { skip_http_redirect: true, code_challenge: codeChallenge, code_challenge_method: codeChallengeMethod }),
|
|
921
959
|
headers: this.headers,
|
|
922
960
|
xform: _ssoResponse,
|
|
923
961
|
});
|
|
962
|
+
return this._returnResult(result);
|
|
924
963
|
}
|
|
925
964
|
catch (error) {
|
|
926
965
|
if (isAuthError(error)) {
|
|
927
|
-
return { data: null, error };
|
|
966
|
+
return this._returnResult({ data: null, error });
|
|
928
967
|
}
|
|
929
968
|
throw error;
|
|
930
969
|
}
|
|
@@ -951,12 +990,12 @@ class GoTrueClient {
|
|
|
951
990
|
headers: this.headers,
|
|
952
991
|
jwt: session.access_token,
|
|
953
992
|
});
|
|
954
|
-
return { data: { user: null, session: null }, error };
|
|
993
|
+
return this._returnResult({ data: { user: null, session: null }, error });
|
|
955
994
|
});
|
|
956
995
|
}
|
|
957
996
|
catch (error) {
|
|
958
997
|
if (isAuthError(error)) {
|
|
959
|
-
return { data: { user: null, session: null }, error };
|
|
998
|
+
return this._returnResult({ data: { user: null, session: null }, error });
|
|
960
999
|
}
|
|
961
1000
|
throw error;
|
|
962
1001
|
}
|
|
@@ -978,7 +1017,7 @@ class GoTrueClient {
|
|
|
978
1017
|
},
|
|
979
1018
|
redirectTo: options === null || options === void 0 ? void 0 : options.emailRedirectTo,
|
|
980
1019
|
});
|
|
981
|
-
return { data: { user: null, session: null }, error };
|
|
1020
|
+
return this._returnResult({ data: { user: null, session: null }, error });
|
|
982
1021
|
}
|
|
983
1022
|
else if ('phone' in credentials) {
|
|
984
1023
|
const { phone, type, options } = credentials;
|
|
@@ -990,13 +1029,16 @@ class GoTrueClient {
|
|
|
990
1029
|
gotrue_meta_security: { captcha_token: options === null || options === void 0 ? void 0 : options.captchaToken },
|
|
991
1030
|
},
|
|
992
1031
|
});
|
|
993
|
-
return {
|
|
1032
|
+
return this._returnResult({
|
|
1033
|
+
data: { user: null, session: null, messageId: data === null || data === void 0 ? void 0 : data.message_id },
|
|
1034
|
+
error,
|
|
1035
|
+
});
|
|
994
1036
|
}
|
|
995
1037
|
throw new AuthInvalidCredentialsError('You must provide either an email or phone number and a type');
|
|
996
1038
|
}
|
|
997
1039
|
catch (error) {
|
|
998
1040
|
if (isAuthError(error)) {
|
|
999
|
-
return { data: { user: null, session: null }, error };
|
|
1041
|
+
return this._returnResult({ data: { user: null, session: null }, error });
|
|
1000
1042
|
}
|
|
1001
1043
|
throw error;
|
|
1002
1044
|
}
|
|
@@ -1139,28 +1181,25 @@ class GoTrueClient {
|
|
|
1139
1181
|
currentSession.user = userNotAvailableProxy();
|
|
1140
1182
|
}
|
|
1141
1183
|
}
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
},
|
|
1154
|
-
});
|
|
1155
|
-
currentSession = proxySession;
|
|
1184
|
+
// Wrap the user object with a warning proxy on the server
|
|
1185
|
+
// This warns when properties of the user are accessed, not when session.user itself is accessed
|
|
1186
|
+
if (this.storage.isServer &&
|
|
1187
|
+
currentSession.user &&
|
|
1188
|
+
!currentSession.user.__isUserNotAvailableProxy) {
|
|
1189
|
+
const suppressWarningRef = { value: this.suppressGetSessionWarning };
|
|
1190
|
+
currentSession.user = insecureUserWarningProxy(currentSession.user, suppressWarningRef);
|
|
1191
|
+
// Update the client-level suppression flag when the proxy suppresses the warning
|
|
1192
|
+
if (suppressWarningRef.value) {
|
|
1193
|
+
this.suppressGetSessionWarning = true;
|
|
1194
|
+
}
|
|
1156
1195
|
}
|
|
1157
1196
|
return { data: { session: currentSession }, error: null };
|
|
1158
1197
|
}
|
|
1159
1198
|
const { data: session, error } = await this._callRefreshToken(currentSession.refresh_token);
|
|
1160
1199
|
if (error) {
|
|
1161
|
-
return { data: { session: null }, error };
|
|
1200
|
+
return this._returnResult({ data: { session: null }, error });
|
|
1162
1201
|
}
|
|
1163
|
-
return { data: { session }, error: null };
|
|
1202
|
+
return this._returnResult({ data: { session }, error: null });
|
|
1164
1203
|
}
|
|
1165
1204
|
finally {
|
|
1166
1205
|
this._debug('#__loadSession()', 'end');
|
|
@@ -1217,7 +1256,7 @@ class GoTrueClient {
|
|
|
1217
1256
|
await this._removeSession();
|
|
1218
1257
|
await removeItemAsync(this.storage, `${this.storageKey}-code-verifier`);
|
|
1219
1258
|
}
|
|
1220
|
-
return { data: { user: null }, error };
|
|
1259
|
+
return this._returnResult({ data: { user: null }, error });
|
|
1221
1260
|
}
|
|
1222
1261
|
throw error;
|
|
1223
1262
|
}
|
|
@@ -1255,17 +1294,18 @@ class GoTrueClient {
|
|
|
1255
1294
|
jwt: session.access_token,
|
|
1256
1295
|
xform: _userResponse,
|
|
1257
1296
|
});
|
|
1258
|
-
if (userError)
|
|
1297
|
+
if (userError) {
|
|
1259
1298
|
throw userError;
|
|
1299
|
+
}
|
|
1260
1300
|
session.user = data.user;
|
|
1261
1301
|
await this._saveSession(session);
|
|
1262
1302
|
await this._notifyAllSubscribers('USER_UPDATED', session);
|
|
1263
|
-
return { data: { user: session.user }, error: null };
|
|
1303
|
+
return this._returnResult({ data: { user: session.user }, error: null });
|
|
1264
1304
|
});
|
|
1265
1305
|
}
|
|
1266
1306
|
catch (error) {
|
|
1267
1307
|
if (isAuthError(error)) {
|
|
1268
|
-
return { data: { user: null }, error };
|
|
1308
|
+
return this._returnResult({ data: { user: null }, error });
|
|
1269
1309
|
}
|
|
1270
1310
|
throw error;
|
|
1271
1311
|
}
|
|
@@ -1298,7 +1338,7 @@ class GoTrueClient {
|
|
|
1298
1338
|
if (hasExpired) {
|
|
1299
1339
|
const { data: refreshedSession, error } = await this._callRefreshToken(currentSession.refresh_token);
|
|
1300
1340
|
if (error) {
|
|
1301
|
-
return { data: { user: null, session: null }, error: error };
|
|
1341
|
+
return this._returnResult({ data: { user: null, session: null }, error: error });
|
|
1302
1342
|
}
|
|
1303
1343
|
if (!refreshedSession) {
|
|
1304
1344
|
return { data: { user: null, session: null }, error: null };
|
|
@@ -1321,11 +1361,11 @@ class GoTrueClient {
|
|
|
1321
1361
|
await this._saveSession(session);
|
|
1322
1362
|
await this._notifyAllSubscribers('SIGNED_IN', session);
|
|
1323
1363
|
}
|
|
1324
|
-
return { data: { user: session.user, session }, error: null };
|
|
1364
|
+
return this._returnResult({ data: { user: session.user, session }, error: null });
|
|
1325
1365
|
}
|
|
1326
1366
|
catch (error) {
|
|
1327
1367
|
if (isAuthError(error)) {
|
|
1328
|
-
return { data: { session: null, user: null }, error };
|
|
1368
|
+
return this._returnResult({ data: { session: null, user: null }, error });
|
|
1329
1369
|
}
|
|
1330
1370
|
throw error;
|
|
1331
1371
|
}
|
|
@@ -1358,17 +1398,17 @@ class GoTrueClient {
|
|
|
1358
1398
|
}
|
|
1359
1399
|
const { data: session, error } = await this._callRefreshToken(currentSession.refresh_token);
|
|
1360
1400
|
if (error) {
|
|
1361
|
-
return { data: { user: null, session: null }, error: error };
|
|
1401
|
+
return this._returnResult({ data: { user: null, session: null }, error: error });
|
|
1362
1402
|
}
|
|
1363
1403
|
if (!session) {
|
|
1364
|
-
return { data: { user: null, session: null }, error: null };
|
|
1404
|
+
return this._returnResult({ data: { user: null, session: null }, error: null });
|
|
1365
1405
|
}
|
|
1366
|
-
return { data: { user: session.user, session }, error: null };
|
|
1406
|
+
return this._returnResult({ data: { user: session.user, session }, error: null });
|
|
1367
1407
|
});
|
|
1368
1408
|
}
|
|
1369
1409
|
catch (error) {
|
|
1370
1410
|
if (isAuthError(error)) {
|
|
1371
|
-
return { data: { user: null, session: null }, error };
|
|
1411
|
+
return this._returnResult({ data: { user: null, session: null }, error });
|
|
1372
1412
|
}
|
|
1373
1413
|
throw error;
|
|
1374
1414
|
}
|
|
@@ -1454,11 +1494,11 @@ class GoTrueClient {
|
|
|
1454
1494
|
// Remove tokens from URL
|
|
1455
1495
|
window.location.hash = '';
|
|
1456
1496
|
this._debug('#_getSessionFromURL()', 'clearing window.location.hash');
|
|
1457
|
-
return { data: { session, redirectType: params.type }, error: null };
|
|
1497
|
+
return this._returnResult({ data: { session, redirectType: params.type }, error: null });
|
|
1458
1498
|
}
|
|
1459
1499
|
catch (error) {
|
|
1460
1500
|
if (isAuthError(error)) {
|
|
1461
|
-
return { data: { session: null, redirectType: null }, error };
|
|
1501
|
+
return this._returnResult({ data: { session: null, redirectType: null }, error });
|
|
1462
1502
|
}
|
|
1463
1503
|
throw error;
|
|
1464
1504
|
}
|
|
@@ -1495,7 +1535,7 @@ class GoTrueClient {
|
|
|
1495
1535
|
var _a;
|
|
1496
1536
|
const { data, error: sessionError } = result;
|
|
1497
1537
|
if (sessionError) {
|
|
1498
|
-
return { error: sessionError };
|
|
1538
|
+
return this._returnResult({ error: sessionError });
|
|
1499
1539
|
}
|
|
1500
1540
|
const accessToken = (_a = data.session) === null || _a === void 0 ? void 0 : _a.access_token;
|
|
1501
1541
|
if (accessToken) {
|
|
@@ -1505,7 +1545,7 @@ class GoTrueClient {
|
|
|
1505
1545
|
// ignore 401s since an invalid or expired JWT should sign out the current session
|
|
1506
1546
|
if (!(isAuthApiError(error) &&
|
|
1507
1547
|
(error.status === 404 || error.status === 401 || error.status === 403))) {
|
|
1508
|
-
return { error };
|
|
1548
|
+
return this._returnResult({ error });
|
|
1509
1549
|
}
|
|
1510
1550
|
}
|
|
1511
1551
|
}
|
|
@@ -1513,7 +1553,7 @@ class GoTrueClient {
|
|
|
1513
1553
|
await this._removeSession();
|
|
1514
1554
|
await removeItemAsync(this.storage, `${this.storageKey}-code-verifier`);
|
|
1515
1555
|
}
|
|
1516
|
-
return { error: null };
|
|
1556
|
+
return this._returnResult({ error: null });
|
|
1517
1557
|
});
|
|
1518
1558
|
}
|
|
1519
1559
|
onAuthStateChange(callback) {
|
|
@@ -1582,7 +1622,7 @@ class GoTrueClient {
|
|
|
1582
1622
|
}
|
|
1583
1623
|
catch (error) {
|
|
1584
1624
|
if (isAuthError(error)) {
|
|
1585
|
-
return { data: null, error };
|
|
1625
|
+
return this._returnResult({ data: null, error });
|
|
1586
1626
|
}
|
|
1587
1627
|
throw error;
|
|
1588
1628
|
}
|
|
@@ -1596,11 +1636,11 @@ class GoTrueClient {
|
|
|
1596
1636
|
const { data, error } = await this.getUser();
|
|
1597
1637
|
if (error)
|
|
1598
1638
|
throw error;
|
|
1599
|
-
return { data: { identities: (_a = data.user.identities) !== null && _a !== void 0 ? _a : [] }, error: null };
|
|
1639
|
+
return this._returnResult({ data: { identities: (_a = data.user.identities) !== null && _a !== void 0 ? _a : [] }, error: null });
|
|
1600
1640
|
}
|
|
1601
1641
|
catch (error) {
|
|
1602
1642
|
if (isAuthError(error)) {
|
|
1603
|
-
return { data: null, error };
|
|
1643
|
+
return this._returnResult({ data: null, error });
|
|
1604
1644
|
}
|
|
1605
1645
|
throw error;
|
|
1606
1646
|
}
|
|
@@ -1635,11 +1675,14 @@ class GoTrueClient {
|
|
|
1635
1675
|
if (isBrowser() && !((_a = credentials.options) === null || _a === void 0 ? void 0 : _a.skipBrowserRedirect)) {
|
|
1636
1676
|
window.location.assign(data === null || data === void 0 ? void 0 : data.url);
|
|
1637
1677
|
}
|
|
1638
|
-
return {
|
|
1678
|
+
return this._returnResult({
|
|
1679
|
+
data: { provider: credentials.provider, url: data === null || data === void 0 ? void 0 : data.url },
|
|
1680
|
+
error: null,
|
|
1681
|
+
});
|
|
1639
1682
|
}
|
|
1640
1683
|
catch (error) {
|
|
1641
1684
|
if (isAuthError(error)) {
|
|
1642
|
-
return { data: { provider: credentials.provider, url: null }, error };
|
|
1685
|
+
return this._returnResult({ data: { provider: credentials.provider, url: null }, error });
|
|
1643
1686
|
}
|
|
1644
1687
|
throw error;
|
|
1645
1688
|
}
|
|
@@ -1667,23 +1710,23 @@ class GoTrueClient {
|
|
|
1667
1710
|
});
|
|
1668
1711
|
const { data, error } = res;
|
|
1669
1712
|
if (error) {
|
|
1670
|
-
return { data: { user: null, session: null }, error };
|
|
1713
|
+
return this._returnResult({ data: { user: null, session: null }, error });
|
|
1671
1714
|
}
|
|
1672
1715
|
else if (!data || !data.session || !data.user) {
|
|
1673
|
-
return {
|
|
1716
|
+
return this._returnResult({
|
|
1674
1717
|
data: { user: null, session: null },
|
|
1675
1718
|
error: new AuthInvalidTokenResponseError(),
|
|
1676
|
-
};
|
|
1719
|
+
});
|
|
1677
1720
|
}
|
|
1678
1721
|
if (data.session) {
|
|
1679
1722
|
await this._saveSession(data.session);
|
|
1680
1723
|
await this._notifyAllSubscribers('USER_UPDATED', data.session);
|
|
1681
1724
|
}
|
|
1682
|
-
return { data, error };
|
|
1725
|
+
return this._returnResult({ data, error });
|
|
1683
1726
|
}
|
|
1684
1727
|
catch (error) {
|
|
1685
1728
|
if (isAuthError(error)) {
|
|
1686
|
-
return { data: { user: null, session: null }, error };
|
|
1729
|
+
return this._returnResult({ data: { user: null, session: null }, error });
|
|
1687
1730
|
}
|
|
1688
1731
|
throw error;
|
|
1689
1732
|
}
|
|
@@ -1708,7 +1751,7 @@ class GoTrueClient {
|
|
|
1708
1751
|
}
|
|
1709
1752
|
catch (error) {
|
|
1710
1753
|
if (isAuthError(error)) {
|
|
1711
|
-
return { data: null, error };
|
|
1754
|
+
return this._returnResult({ data: null, error });
|
|
1712
1755
|
}
|
|
1713
1756
|
throw error;
|
|
1714
1757
|
}
|
|
@@ -1744,7 +1787,7 @@ class GoTrueClient {
|
|
|
1744
1787
|
catch (error) {
|
|
1745
1788
|
this._debug(debugName, 'error', error);
|
|
1746
1789
|
if (isAuthError(error)) {
|
|
1747
|
-
return { data: { session: null, user: null }, error };
|
|
1790
|
+
return this._returnResult({ data: { session: null, user: null }, error });
|
|
1748
1791
|
}
|
|
1749
1792
|
throw error;
|
|
1750
1793
|
}
|
|
@@ -2229,7 +2272,7 @@ class GoTrueClient {
|
|
|
2229
2272
|
var _a;
|
|
2230
2273
|
const { data: sessionData, error: sessionError } = result;
|
|
2231
2274
|
if (sessionError) {
|
|
2232
|
-
return { data: null, error: sessionError };
|
|
2275
|
+
return this._returnResult({ data: null, error: sessionError });
|
|
2233
2276
|
}
|
|
2234
2277
|
return await _request(this.fetch, 'DELETE', `${this.url}/factors/${params.factorId}`, {
|
|
2235
2278
|
headers: this.headers,
|
|
@@ -2239,7 +2282,7 @@ class GoTrueClient {
|
|
|
2239
2282
|
}
|
|
2240
2283
|
catch (error) {
|
|
2241
2284
|
if (isAuthError(error)) {
|
|
2242
|
-
return { data: null, error };
|
|
2285
|
+
return this._returnResult({ data: null, error });
|
|
2243
2286
|
}
|
|
2244
2287
|
throw error;
|
|
2245
2288
|
}
|
|
@@ -2250,7 +2293,7 @@ class GoTrueClient {
|
|
|
2250
2293
|
var _a, _b;
|
|
2251
2294
|
const { data: sessionData, error: sessionError } = result;
|
|
2252
2295
|
if (sessionError) {
|
|
2253
|
-
return { data: null, error: sessionError };
|
|
2296
|
+
return this._returnResult({ data: null, error: sessionError });
|
|
2254
2297
|
}
|
|
2255
2298
|
const body = Object.assign({ friendly_name: params.friendlyName, factor_type: params.factorType }, (params.factorType === 'phone'
|
|
2256
2299
|
? { phone: params.phone }
|
|
@@ -2263,17 +2306,17 @@ class GoTrueClient {
|
|
|
2263
2306
|
jwt: (_a = sessionData === null || sessionData === void 0 ? void 0 : sessionData.session) === null || _a === void 0 ? void 0 : _a.access_token,
|
|
2264
2307
|
}));
|
|
2265
2308
|
if (error) {
|
|
2266
|
-
return { data: null, error };
|
|
2309
|
+
return this._returnResult({ data: null, error });
|
|
2267
2310
|
}
|
|
2268
2311
|
if (params.factorType === 'totp' && data.type === 'totp' && ((_b = data === null || data === void 0 ? void 0 : data.totp) === null || _b === void 0 ? void 0 : _b.qr_code)) {
|
|
2269
2312
|
data.totp.qr_code = `data:image/svg+xml;utf-8,${data.totp.qr_code}`;
|
|
2270
2313
|
}
|
|
2271
|
-
return { data, error: null };
|
|
2314
|
+
return this._returnResult({ data, error: null });
|
|
2272
2315
|
});
|
|
2273
2316
|
}
|
|
2274
2317
|
catch (error) {
|
|
2275
2318
|
if (isAuthError(error)) {
|
|
2276
|
-
return { data: null, error };
|
|
2319
|
+
return this._returnResult({ data: null, error });
|
|
2277
2320
|
}
|
|
2278
2321
|
throw error;
|
|
2279
2322
|
}
|
|
@@ -2285,7 +2328,7 @@ class GoTrueClient {
|
|
|
2285
2328
|
var _a;
|
|
2286
2329
|
const { data: sessionData, error: sessionError } = result;
|
|
2287
2330
|
if (sessionError) {
|
|
2288
|
-
return { data: null, error: sessionError };
|
|
2331
|
+
return this._returnResult({ data: null, error: sessionError });
|
|
2289
2332
|
}
|
|
2290
2333
|
const body = Object.assign({ challenge_id: params.challengeId }, ('webauthn' in params
|
|
2291
2334
|
? {
|
|
@@ -2300,16 +2343,16 @@ class GoTrueClient {
|
|
|
2300
2343
|
jwt: (_a = sessionData === null || sessionData === void 0 ? void 0 : sessionData.session) === null || _a === void 0 ? void 0 : _a.access_token,
|
|
2301
2344
|
});
|
|
2302
2345
|
if (error) {
|
|
2303
|
-
return { data: null, error };
|
|
2346
|
+
return this._returnResult({ data: null, error });
|
|
2304
2347
|
}
|
|
2305
2348
|
await this._saveSession(Object.assign({ expires_at: Math.round(Date.now() / 1000) + data.expires_in }, data));
|
|
2306
2349
|
await this._notifyAllSubscribers('MFA_CHALLENGE_VERIFIED', data);
|
|
2307
|
-
return { data, error };
|
|
2350
|
+
return this._returnResult({ data, error });
|
|
2308
2351
|
});
|
|
2309
2352
|
}
|
|
2310
2353
|
catch (error) {
|
|
2311
2354
|
if (isAuthError(error)) {
|
|
2312
|
-
return { data: null, error };
|
|
2355
|
+
return this._returnResult({ data: null, error });
|
|
2313
2356
|
}
|
|
2314
2357
|
throw error;
|
|
2315
2358
|
}
|
|
@@ -2322,7 +2365,7 @@ class GoTrueClient {
|
|
|
2322
2365
|
var _a;
|
|
2323
2366
|
const { data: sessionData, error: sessionError } = result;
|
|
2324
2367
|
if (sessionError) {
|
|
2325
|
-
return { data: null, error: sessionError };
|
|
2368
|
+
return this._returnResult({ data: null, error: sessionError });
|
|
2326
2369
|
}
|
|
2327
2370
|
const response = (await _request(this.fetch, 'POST', `${this.url}/factors/${params.factorId}/challenge`, {
|
|
2328
2371
|
body: params,
|
|
@@ -2352,7 +2395,7 @@ class GoTrueClient {
|
|
|
2352
2395
|
}
|
|
2353
2396
|
catch (error) {
|
|
2354
2397
|
if (isAuthError(error)) {
|
|
2355
|
-
return { data: null, error };
|
|
2398
|
+
return this._returnResult({ data: null, error });
|
|
2356
2399
|
}
|
|
2357
2400
|
throw error;
|
|
2358
2401
|
}
|
|
@@ -2368,7 +2411,7 @@ class GoTrueClient {
|
|
|
2368
2411
|
factorId: params.factorId,
|
|
2369
2412
|
});
|
|
2370
2413
|
if (challengeError) {
|
|
2371
|
-
return { data: null, error: challengeError };
|
|
2414
|
+
return this._returnResult({ data: null, error: challengeError });
|
|
2372
2415
|
}
|
|
2373
2416
|
return await this._verify({
|
|
2374
2417
|
factorId: params.factorId,
|
|
@@ -2409,33 +2452,133 @@ class GoTrueClient {
|
|
|
2409
2452
|
* {@see GoTrueMFAApi#getAuthenticatorAssuranceLevel}
|
|
2410
2453
|
*/
|
|
2411
2454
|
async _getAuthenticatorAssuranceLevel() {
|
|
2412
|
-
|
|
2455
|
+
var _a, _b;
|
|
2456
|
+
const { data: { session }, error: sessionError, } = await this.getSession();
|
|
2457
|
+
if (sessionError) {
|
|
2458
|
+
return this._returnResult({ data: null, error: sessionError });
|
|
2459
|
+
}
|
|
2460
|
+
if (!session) {
|
|
2461
|
+
return {
|
|
2462
|
+
data: { currentLevel: null, nextLevel: null, currentAuthenticationMethods: [] },
|
|
2463
|
+
error: null,
|
|
2464
|
+
};
|
|
2465
|
+
}
|
|
2466
|
+
const { payload } = decodeJWT(session.access_token);
|
|
2467
|
+
let currentLevel = null;
|
|
2468
|
+
if (payload.aal) {
|
|
2469
|
+
currentLevel = payload.aal;
|
|
2470
|
+
}
|
|
2471
|
+
let nextLevel = currentLevel;
|
|
2472
|
+
const verifiedFactors = (_b = (_a = session.user.factors) === null || _a === void 0 ? void 0 : _a.filter((factor) => factor.status === 'verified')) !== null && _b !== void 0 ? _b : [];
|
|
2473
|
+
if (verifiedFactors.length > 0) {
|
|
2474
|
+
nextLevel = 'aal2';
|
|
2475
|
+
}
|
|
2476
|
+
const currentAuthenticationMethods = payload.amr || [];
|
|
2477
|
+
return { data: { currentLevel, nextLevel, currentAuthenticationMethods }, error: null };
|
|
2478
|
+
}
|
|
2479
|
+
/**
|
|
2480
|
+
* Retrieves details about an OAuth authorization request.
|
|
2481
|
+
* Only relevant when the OAuth 2.1 server is enabled in Supabase Auth.
|
|
2482
|
+
*
|
|
2483
|
+
* Returns authorization details including client info, scopes, and user information.
|
|
2484
|
+
* If the API returns a redirect_uri, it means consent was already given - the caller
|
|
2485
|
+
* should handle the redirect manually if needed.
|
|
2486
|
+
*/
|
|
2487
|
+
async _getAuthorizationDetails(authorizationId) {
|
|
2488
|
+
try {
|
|
2413
2489
|
return await this._useSession(async (result) => {
|
|
2414
|
-
var _a, _b;
|
|
2415
2490
|
const { data: { session }, error: sessionError, } = result;
|
|
2416
2491
|
if (sessionError) {
|
|
2417
|
-
return { data: null, error: sessionError };
|
|
2492
|
+
return this._returnResult({ data: null, error: sessionError });
|
|
2418
2493
|
}
|
|
2419
2494
|
if (!session) {
|
|
2420
|
-
return {
|
|
2421
|
-
|
|
2422
|
-
|
|
2423
|
-
|
|
2424
|
-
|
|
2425
|
-
|
|
2426
|
-
|
|
2427
|
-
if (payload.aal) {
|
|
2428
|
-
currentLevel = payload.aal;
|
|
2429
|
-
}
|
|
2430
|
-
let nextLevel = currentLevel;
|
|
2431
|
-
const verifiedFactors = (_b = (_a = session.user.factors) === null || _a === void 0 ? void 0 : _a.filter((factor) => factor.status === 'verified')) !== null && _b !== void 0 ? _b : [];
|
|
2432
|
-
if (verifiedFactors.length > 0) {
|
|
2433
|
-
nextLevel = 'aal2';
|
|
2434
|
-
}
|
|
2435
|
-
const currentAuthenticationMethods = payload.amr || [];
|
|
2436
|
-
return { data: { currentLevel, nextLevel, currentAuthenticationMethods }, error: null };
|
|
2495
|
+
return this._returnResult({ data: null, error: new AuthSessionMissingError() });
|
|
2496
|
+
}
|
|
2497
|
+
return await _request(this.fetch, 'GET', `${this.url}/oauth/authorizations/${authorizationId}`, {
|
|
2498
|
+
headers: this.headers,
|
|
2499
|
+
jwt: session.access_token,
|
|
2500
|
+
xform: (data) => ({ data, error: null }),
|
|
2501
|
+
});
|
|
2437
2502
|
});
|
|
2438
|
-
}
|
|
2503
|
+
}
|
|
2504
|
+
catch (error) {
|
|
2505
|
+
if (isAuthError(error)) {
|
|
2506
|
+
return this._returnResult({ data: null, error });
|
|
2507
|
+
}
|
|
2508
|
+
throw error;
|
|
2509
|
+
}
|
|
2510
|
+
}
|
|
2511
|
+
/**
|
|
2512
|
+
* Approves an OAuth authorization request.
|
|
2513
|
+
* Only relevant when the OAuth 2.1 server is enabled in Supabase Auth.
|
|
2514
|
+
*/
|
|
2515
|
+
async _approveAuthorization(authorizationId, options) {
|
|
2516
|
+
try {
|
|
2517
|
+
return await this._useSession(async (result) => {
|
|
2518
|
+
const { data: { session }, error: sessionError, } = result;
|
|
2519
|
+
if (sessionError) {
|
|
2520
|
+
return this._returnResult({ data: null, error: sessionError });
|
|
2521
|
+
}
|
|
2522
|
+
if (!session) {
|
|
2523
|
+
return this._returnResult({ data: null, error: new AuthSessionMissingError() });
|
|
2524
|
+
}
|
|
2525
|
+
const response = await _request(this.fetch, 'POST', `${this.url}/oauth/authorizations/${authorizationId}/consent`, {
|
|
2526
|
+
headers: this.headers,
|
|
2527
|
+
jwt: session.access_token,
|
|
2528
|
+
body: { action: 'approve' },
|
|
2529
|
+
xform: (data) => ({ data, error: null }),
|
|
2530
|
+
});
|
|
2531
|
+
if (response.data && response.data.redirect_url) {
|
|
2532
|
+
// Automatically redirect in browser unless skipBrowserRedirect is true
|
|
2533
|
+
if (isBrowser() && !(options === null || options === void 0 ? void 0 : options.skipBrowserRedirect)) {
|
|
2534
|
+
window.location.assign(response.data.redirect_url);
|
|
2535
|
+
}
|
|
2536
|
+
}
|
|
2537
|
+
return response;
|
|
2538
|
+
});
|
|
2539
|
+
}
|
|
2540
|
+
catch (error) {
|
|
2541
|
+
if (isAuthError(error)) {
|
|
2542
|
+
return this._returnResult({ data: null, error });
|
|
2543
|
+
}
|
|
2544
|
+
throw error;
|
|
2545
|
+
}
|
|
2546
|
+
}
|
|
2547
|
+
/**
|
|
2548
|
+
* Denies an OAuth authorization request.
|
|
2549
|
+
* Only relevant when the OAuth 2.1 server is enabled in Supabase Auth.
|
|
2550
|
+
*/
|
|
2551
|
+
async _denyAuthorization(authorizationId, options) {
|
|
2552
|
+
try {
|
|
2553
|
+
return await this._useSession(async (result) => {
|
|
2554
|
+
const { data: { session }, error: sessionError, } = result;
|
|
2555
|
+
if (sessionError) {
|
|
2556
|
+
return this._returnResult({ data: null, error: sessionError });
|
|
2557
|
+
}
|
|
2558
|
+
if (!session) {
|
|
2559
|
+
return this._returnResult({ data: null, error: new AuthSessionMissingError() });
|
|
2560
|
+
}
|
|
2561
|
+
const response = await _request(this.fetch, 'POST', `${this.url}/oauth/authorizations/${authorizationId}/consent`, {
|
|
2562
|
+
headers: this.headers,
|
|
2563
|
+
jwt: session.access_token,
|
|
2564
|
+
body: { action: 'deny' },
|
|
2565
|
+
xform: (data) => ({ data, error: null }),
|
|
2566
|
+
});
|
|
2567
|
+
if (response.data && response.data.redirect_url) {
|
|
2568
|
+
// Automatically redirect in browser unless skipBrowserRedirect is true
|
|
2569
|
+
if (isBrowser() && !(options === null || options === void 0 ? void 0 : options.skipBrowserRedirect)) {
|
|
2570
|
+
window.location.assign(response.data.redirect_url);
|
|
2571
|
+
}
|
|
2572
|
+
}
|
|
2573
|
+
return response;
|
|
2574
|
+
});
|
|
2575
|
+
}
|
|
2576
|
+
catch (error) {
|
|
2577
|
+
if (isAuthError(error)) {
|
|
2578
|
+
return this._returnResult({ data: null, error });
|
|
2579
|
+
}
|
|
2580
|
+
throw error;
|
|
2581
|
+
}
|
|
2439
2582
|
}
|
|
2440
2583
|
async fetchJwk(kid, jwks = { keys: [] }) {
|
|
2441
2584
|
// try fetching from the supplied jwks
|
|
@@ -2491,7 +2634,7 @@ class GoTrueClient {
|
|
|
2491
2634
|
if (!token) {
|
|
2492
2635
|
const { data, error } = await this.getSession();
|
|
2493
2636
|
if (error || !data.session) {
|
|
2494
|
-
return { data: null, error };
|
|
2637
|
+
return this._returnResult({ data: null, error });
|
|
2495
2638
|
}
|
|
2496
2639
|
token = data.session.access_token;
|
|
2497
2640
|
}
|
|
@@ -2544,12 +2687,12 @@ class GoTrueClient {
|
|
|
2544
2687
|
}
|
|
2545
2688
|
catch (error) {
|
|
2546
2689
|
if (isAuthError(error)) {
|
|
2547
|
-
return { data: null, error };
|
|
2690
|
+
return this._returnResult({ data: null, error });
|
|
2548
2691
|
}
|
|
2549
2692
|
throw error;
|
|
2550
2693
|
}
|
|
2551
2694
|
}
|
|
2552
2695
|
}
|
|
2553
|
-
GoTrueClient.nextInstanceID =
|
|
2696
|
+
GoTrueClient.nextInstanceID = {};
|
|
2554
2697
|
export default GoTrueClient;
|
|
2555
2698
|
//# sourceMappingURL=GoTrueClient.js.map
|