@supabase/auth-js 2.80.1-canary.1 → 2.80.1-canary.3

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 (65) hide show
  1. package/README.md +37 -19
  2. package/dist/main/AuthAdminApi.js +2 -4
  3. package/dist/main/AuthAdminApi.js.map +1 -1
  4. package/dist/main/AuthClient.js +2 -4
  5. package/dist/main/AuthClient.js.map +1 -1
  6. package/dist/main/GoTrueAdminApi.d.ts +48 -1
  7. package/dist/main/GoTrueAdminApi.d.ts.map +1 -1
  8. package/dist/main/GoTrueAdminApi.js +162 -12
  9. package/dist/main/GoTrueAdminApi.js.map +1 -1
  10. package/dist/main/GoTrueClient.d.ts +58 -2
  11. package/dist/main/GoTrueClient.d.ts.map +1 -1
  12. package/dist/main/GoTrueClient.js +293 -156
  13. package/dist/main/GoTrueClient.js.map +1 -1
  14. package/dist/main/index.js +7 -23
  15. package/dist/main/index.js.map +1 -1
  16. package/dist/main/lib/error-codes.d.ts +1 -1
  17. package/dist/main/lib/fetch.js +2 -12
  18. package/dist/main/lib/fetch.js.map +1 -1
  19. package/dist/main/lib/helpers.d.ts +11 -0
  20. package/dist/main/lib/helpers.d.ts.map +1 -1
  21. package/dist/main/lib/helpers.js +39 -42
  22. package/dist/main/lib/helpers.js.map +1 -1
  23. package/dist/main/lib/types.d.ts +283 -2
  24. package/dist/main/lib/types.d.ts.map +1 -1
  25. package/dist/main/lib/types.js.map +1 -1
  26. package/dist/main/lib/version.d.ts +1 -1
  27. package/dist/main/lib/version.js +1 -1
  28. package/dist/main/lib/webauthn.d.ts +7 -5
  29. package/dist/main/lib/webauthn.d.ts.map +1 -1
  30. package/dist/main/lib/webauthn.js +5 -15
  31. package/dist/main/lib/webauthn.js.map +1 -1
  32. package/dist/module/GoTrueAdminApi.d.ts +48 -1
  33. package/dist/module/GoTrueAdminApi.d.ts.map +1 -1
  34. package/dist/module/GoTrueAdminApi.js +161 -11
  35. package/dist/module/GoTrueAdminApi.js.map +1 -1
  36. package/dist/module/GoTrueClient.d.ts +58 -2
  37. package/dist/module/GoTrueClient.d.ts.map +1 -1
  38. package/dist/module/GoTrueClient.js +292 -153
  39. package/dist/module/GoTrueClient.js.map +1 -1
  40. package/dist/module/lib/error-codes.d.ts +1 -1
  41. package/dist/module/lib/fetch.js +1 -11
  42. package/dist/module/lib/fetch.js.map +1 -1
  43. package/dist/module/lib/helpers.d.ts +11 -0
  44. package/dist/module/lib/helpers.d.ts.map +1 -1
  45. package/dist/module/lib/helpers.js +38 -9
  46. package/dist/module/lib/helpers.js.map +1 -1
  47. package/dist/module/lib/types.d.ts +283 -2
  48. package/dist/module/lib/types.d.ts.map +1 -1
  49. package/dist/module/lib/types.js.map +1 -1
  50. package/dist/module/lib/version.d.ts +1 -1
  51. package/dist/module/lib/version.js +1 -1
  52. package/dist/module/lib/webauthn.d.ts +7 -5
  53. package/dist/module/lib/webauthn.d.ts.map +1 -1
  54. package/dist/module/lib/webauthn.js +3 -13
  55. package/dist/module/lib/webauthn.js.map +1 -1
  56. package/dist/tsconfig.module.tsbuildinfo +1 -0
  57. package/dist/tsconfig.tsbuildinfo +1 -0
  58. package/package.json +12 -13
  59. package/src/GoTrueAdminApi.ts +186 -0
  60. package/src/GoTrueClient.ts +378 -150
  61. package/src/lib/error-codes.ts +1 -1
  62. package/src/lib/helpers.ts +46 -8
  63. package/src/lib/types.ts +307 -1
  64. package/src/lib/version.ts +1 -1
  65. package/src/lib/webauthn.ts +12 -8
@@ -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() && ((_a = globalThis === null || globalThis === void 0 ? void 0 : globalThis.navigator) === null || _a === void 0 ? void 0 : _a.locks)) {
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
- (_b = this.broadcastChannel) === null || _b === void 0 ? void 0 : _b.addEventListener('message', async (event) => {
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(`GoTrueClient@${this.instanceID} (${version}) ${new Date().toISOString()}`, ...args);
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
- const params = parseParametersFromURL(window.location.href);
232
+ let params = {};
201
233
  let callbackUrlType = 'none';
202
- if (this._isImplicitGrantCallback(params)) {
203
- callbackUrlType = 'implicit';
204
- }
205
- else if (await this._isPKCECallback(params)) {
206
- callbackUrlType = 'pkce';
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
- return { data: { user: null, session: null }, error: new AuthInvalidTokenResponseError() };
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
- return {
557
- data: { user: null, session: null },
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
- return {
697
- data: { user: null, session: null },
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
- return {
763
+ const invalidTokenError = new AuthInvalidTokenResponseError();
764
+ return this._returnResult({
732
765
  data: { user: null, session: null, redirectType: null },
733
- error: new AuthInvalidTokenResponseError(),
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 { data: { user: null, session: null, redirectType: null }, error };
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
- return {
773
- data: { user: null, session: null },
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 { data: { user: null, session: null, messageId: data === null || data === void 0 ? void 0 : data.message_id }, error };
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
- throw new Error('An error occurred on token verification.');
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
- return await _request(this.fetch, 'POST', `${this.url}/sso`, {
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 { data: { user: null, session: null, messageId: data === null || data === void 0 ? void 0 : data.message_id }, error };
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
- if (this.storage.isServer && currentSession.user) {
1143
- let suppressWarning = this.suppressGetSessionWarning;
1144
- const proxySession = new Proxy(currentSession, {
1145
- get: (target, prop, receiver) => {
1146
- if (!suppressWarning && prop === 'user') {
1147
- // only show warning when the user object is being accessed from the server
1148
- console.warn('Using the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.');
1149
- suppressWarning = true; // keeps this proxy instance from logging additional warnings
1150
- this.suppressGetSessionWarning = true; // keeps this client's future proxy instances from warning
1151
- }
1152
- return Reflect.get(target, prop, receiver);
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,13 +1553,9 @@ 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
- /**
1520
- * Receive a notification every time an auth event happens.
1521
- * @param callback A callback function to be invoked when an auth event happens.
1522
- */
1523
1559
  onAuthStateChange(callback) {
1524
1560
  const id = uuid();
1525
1561
  const subscription = {
@@ -1586,7 +1622,7 @@ class GoTrueClient {
1586
1622
  }
1587
1623
  catch (error) {
1588
1624
  if (isAuthError(error)) {
1589
- return { data: null, error };
1625
+ return this._returnResult({ data: null, error });
1590
1626
  }
1591
1627
  throw error;
1592
1628
  }
@@ -1600,11 +1636,11 @@ class GoTrueClient {
1600
1636
  const { data, error } = await this.getUser();
1601
1637
  if (error)
1602
1638
  throw error;
1603
- 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 });
1604
1640
  }
1605
1641
  catch (error) {
1606
1642
  if (isAuthError(error)) {
1607
- return { data: null, error };
1643
+ return this._returnResult({ data: null, error });
1608
1644
  }
1609
1645
  throw error;
1610
1646
  }
@@ -1639,11 +1675,14 @@ class GoTrueClient {
1639
1675
  if (isBrowser() && !((_a = credentials.options) === null || _a === void 0 ? void 0 : _a.skipBrowserRedirect)) {
1640
1676
  window.location.assign(data === null || data === void 0 ? void 0 : data.url);
1641
1677
  }
1642
- return { data: { provider: credentials.provider, url: data === null || data === void 0 ? void 0 : data.url }, error: null };
1678
+ return this._returnResult({
1679
+ data: { provider: credentials.provider, url: data === null || data === void 0 ? void 0 : data.url },
1680
+ error: null,
1681
+ });
1643
1682
  }
1644
1683
  catch (error) {
1645
1684
  if (isAuthError(error)) {
1646
- return { data: { provider: credentials.provider, url: null }, error };
1685
+ return this._returnResult({ data: { provider: credentials.provider, url: null }, error });
1647
1686
  }
1648
1687
  throw error;
1649
1688
  }
@@ -1671,23 +1710,23 @@ class GoTrueClient {
1671
1710
  });
1672
1711
  const { data, error } = res;
1673
1712
  if (error) {
1674
- return { data: { user: null, session: null }, error };
1713
+ return this._returnResult({ data: { user: null, session: null }, error });
1675
1714
  }
1676
1715
  else if (!data || !data.session || !data.user) {
1677
- return {
1716
+ return this._returnResult({
1678
1717
  data: { user: null, session: null },
1679
1718
  error: new AuthInvalidTokenResponseError(),
1680
- };
1719
+ });
1681
1720
  }
1682
1721
  if (data.session) {
1683
1722
  await this._saveSession(data.session);
1684
1723
  await this._notifyAllSubscribers('USER_UPDATED', data.session);
1685
1724
  }
1686
- return { data, error };
1725
+ return this._returnResult({ data, error });
1687
1726
  }
1688
1727
  catch (error) {
1689
1728
  if (isAuthError(error)) {
1690
- return { data: { user: null, session: null }, error };
1729
+ return this._returnResult({ data: { user: null, session: null }, error });
1691
1730
  }
1692
1731
  throw error;
1693
1732
  }
@@ -1712,7 +1751,7 @@ class GoTrueClient {
1712
1751
  }
1713
1752
  catch (error) {
1714
1753
  if (isAuthError(error)) {
1715
- return { data: null, error };
1754
+ return this._returnResult({ data: null, error });
1716
1755
  }
1717
1756
  throw error;
1718
1757
  }
@@ -1748,7 +1787,7 @@ class GoTrueClient {
1748
1787
  catch (error) {
1749
1788
  this._debug(debugName, 'error', error);
1750
1789
  if (isAuthError(error)) {
1751
- return { data: { session: null, user: null }, error };
1790
+ return this._returnResult({ data: { session: null, user: null }, error });
1752
1791
  }
1753
1792
  throw error;
1754
1793
  }
@@ -2233,7 +2272,7 @@ class GoTrueClient {
2233
2272
  var _a;
2234
2273
  const { data: sessionData, error: sessionError } = result;
2235
2274
  if (sessionError) {
2236
- return { data: null, error: sessionError };
2275
+ return this._returnResult({ data: null, error: sessionError });
2237
2276
  }
2238
2277
  return await _request(this.fetch, 'DELETE', `${this.url}/factors/${params.factorId}`, {
2239
2278
  headers: this.headers,
@@ -2243,7 +2282,7 @@ class GoTrueClient {
2243
2282
  }
2244
2283
  catch (error) {
2245
2284
  if (isAuthError(error)) {
2246
- return { data: null, error };
2285
+ return this._returnResult({ data: null, error });
2247
2286
  }
2248
2287
  throw error;
2249
2288
  }
@@ -2254,7 +2293,7 @@ class GoTrueClient {
2254
2293
  var _a, _b;
2255
2294
  const { data: sessionData, error: sessionError } = result;
2256
2295
  if (sessionError) {
2257
- return { data: null, error: sessionError };
2296
+ return this._returnResult({ data: null, error: sessionError });
2258
2297
  }
2259
2298
  const body = Object.assign({ friendly_name: params.friendlyName, factor_type: params.factorType }, (params.factorType === 'phone'
2260
2299
  ? { phone: params.phone }
@@ -2267,17 +2306,17 @@ class GoTrueClient {
2267
2306
  jwt: (_a = sessionData === null || sessionData === void 0 ? void 0 : sessionData.session) === null || _a === void 0 ? void 0 : _a.access_token,
2268
2307
  }));
2269
2308
  if (error) {
2270
- return { data: null, error };
2309
+ return this._returnResult({ data: null, error });
2271
2310
  }
2272
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)) {
2273
2312
  data.totp.qr_code = `data:image/svg+xml;utf-8,${data.totp.qr_code}`;
2274
2313
  }
2275
- return { data, error: null };
2314
+ return this._returnResult({ data, error: null });
2276
2315
  });
2277
2316
  }
2278
2317
  catch (error) {
2279
2318
  if (isAuthError(error)) {
2280
- return { data: null, error };
2319
+ return this._returnResult({ data: null, error });
2281
2320
  }
2282
2321
  throw error;
2283
2322
  }
@@ -2289,7 +2328,7 @@ class GoTrueClient {
2289
2328
  var _a;
2290
2329
  const { data: sessionData, error: sessionError } = result;
2291
2330
  if (sessionError) {
2292
- return { data: null, error: sessionError };
2331
+ return this._returnResult({ data: null, error: sessionError });
2293
2332
  }
2294
2333
  const body = Object.assign({ challenge_id: params.challengeId }, ('webauthn' in params
2295
2334
  ? {
@@ -2304,16 +2343,16 @@ class GoTrueClient {
2304
2343
  jwt: (_a = sessionData === null || sessionData === void 0 ? void 0 : sessionData.session) === null || _a === void 0 ? void 0 : _a.access_token,
2305
2344
  });
2306
2345
  if (error) {
2307
- return { data: null, error };
2346
+ return this._returnResult({ data: null, error });
2308
2347
  }
2309
2348
  await this._saveSession(Object.assign({ expires_at: Math.round(Date.now() / 1000) + data.expires_in }, data));
2310
2349
  await this._notifyAllSubscribers('MFA_CHALLENGE_VERIFIED', data);
2311
- return { data, error };
2350
+ return this._returnResult({ data, error });
2312
2351
  });
2313
2352
  }
2314
2353
  catch (error) {
2315
2354
  if (isAuthError(error)) {
2316
- return { data: null, error };
2355
+ return this._returnResult({ data: null, error });
2317
2356
  }
2318
2357
  throw error;
2319
2358
  }
@@ -2326,7 +2365,7 @@ class GoTrueClient {
2326
2365
  var _a;
2327
2366
  const { data: sessionData, error: sessionError } = result;
2328
2367
  if (sessionError) {
2329
- return { data: null, error: sessionError };
2368
+ return this._returnResult({ data: null, error: sessionError });
2330
2369
  }
2331
2370
  const response = (await _request(this.fetch, 'POST', `${this.url}/factors/${params.factorId}/challenge`, {
2332
2371
  body: params,
@@ -2356,7 +2395,7 @@ class GoTrueClient {
2356
2395
  }
2357
2396
  catch (error) {
2358
2397
  if (isAuthError(error)) {
2359
- return { data: null, error };
2398
+ return this._returnResult({ data: null, error });
2360
2399
  }
2361
2400
  throw error;
2362
2401
  }
@@ -2372,7 +2411,7 @@ class GoTrueClient {
2372
2411
  factorId: params.factorId,
2373
2412
  });
2374
2413
  if (challengeError) {
2375
- return { data: null, error: challengeError };
2414
+ return this._returnResult({ data: null, error: challengeError });
2376
2415
  }
2377
2416
  return await this._verify({
2378
2417
  factorId: params.factorId,
@@ -2413,33 +2452,133 @@ class GoTrueClient {
2413
2452
  * {@see GoTrueMFAApi#getAuthenticatorAssuranceLevel}
2414
2453
  */
2415
2454
  async _getAuthenticatorAssuranceLevel() {
2416
- return this._acquireLock(-1, async () => {
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 {
2417
2489
  return await this._useSession(async (result) => {
2418
- var _a, _b;
2419
2490
  const { data: { session }, error: sessionError, } = result;
2420
2491
  if (sessionError) {
2421
- return { data: null, error: sessionError };
2492
+ return this._returnResult({ data: null, error: sessionError });
2422
2493
  }
2423
2494
  if (!session) {
2424
- return {
2425
- data: { currentLevel: null, nextLevel: null, currentAuthenticationMethods: [] },
2426
- error: null,
2427
- };
2428
- }
2429
- const { payload } = decodeJWT(session.access_token);
2430
- let currentLevel = null;
2431
- if (payload.aal) {
2432
- currentLevel = payload.aal;
2433
- }
2434
- let nextLevel = currentLevel;
2435
- const verifiedFactors = (_b = (_a = session.user.factors) === null || _a === void 0 ? void 0 : _a.filter((factor) => factor.status === 'verified')) !== null && _b !== void 0 ? _b : [];
2436
- if (verifiedFactors.length > 0) {
2437
- nextLevel = 'aal2';
2438
- }
2439
- const currentAuthenticationMethods = payload.amr || [];
2440
- 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
+ });
2441
2502
  });
2442
- });
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
+ }
2443
2582
  }
2444
2583
  async fetchJwk(kid, jwks = { keys: [] }) {
2445
2584
  // try fetching from the supplied jwks
@@ -2495,7 +2634,7 @@ class GoTrueClient {
2495
2634
  if (!token) {
2496
2635
  const { data, error } = await this.getSession();
2497
2636
  if (error || !data.session) {
2498
- return { data: null, error };
2637
+ return this._returnResult({ data: null, error });
2499
2638
  }
2500
2639
  token = data.session.access_token;
2501
2640
  }
@@ -2548,12 +2687,12 @@ class GoTrueClient {
2548
2687
  }
2549
2688
  catch (error) {
2550
2689
  if (isAuthError(error)) {
2551
- return { data: null, error };
2690
+ return this._returnResult({ data: null, error });
2552
2691
  }
2553
2692
  throw error;
2554
2693
  }
2555
2694
  }
2556
2695
  }
2557
- GoTrueClient.nextInstanceID = 0;
2696
+ GoTrueClient.nextInstanceID = {};
2558
2697
  export default GoTrueClient;
2559
2698
  //# sourceMappingURL=GoTrueClient.js.map