@firebase/auth 0.19.12 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/auth-public.d.ts +30 -0
  3. package/dist/auth.d.ts +38 -1
  4. package/dist/cordova/index.js +2 -2
  5. package/dist/cordova/internal/index.d.ts +1 -0
  6. package/dist/cordova/internal.js +3 -2
  7. package/dist/cordova/internal.js.map +1 -1
  8. package/dist/cordova/{popup_redirect-fd81f644.js → popup_redirect-1228b67a.js} +203 -43
  9. package/dist/cordova/popup_redirect-1228b67a.js.map +1 -0
  10. package/dist/cordova/src/core/auth/auth_impl.d.ts +3 -1
  11. package/dist/cordova/src/core/auth/middleware.d.ts +25 -0
  12. package/dist/cordova/src/core/auth/middleware.test.d.ts +17 -0
  13. package/dist/cordova/src/core/errors.d.ts +7 -1
  14. package/dist/cordova/src/core/index.d.ts +11 -0
  15. package/dist/cordova/src/core/strategies/redirect.d.ts +1 -0
  16. package/dist/cordova/src/model/popup_redirect.d.ts +2 -0
  17. package/dist/cordova/src/model/public_types.d.ts +10 -0
  18. package/dist/cordova/test/integration/flows/middleware_test_generator.d.ts +18 -0
  19. package/dist/cordova/test/integration/webdriver/util/functions.d.ts +4 -0
  20. package/dist/esm2017/{index-7078a255.js → index-815f1b87.js} +143 -18
  21. package/dist/esm2017/index-815f1b87.js.map +1 -0
  22. package/dist/esm2017/index.js +1 -1
  23. package/dist/esm2017/internal/index.d.ts +1 -0
  24. package/dist/esm2017/internal.js +3 -2
  25. package/dist/esm2017/internal.js.map +1 -1
  26. package/dist/esm2017/src/core/auth/auth_impl.d.ts +3 -1
  27. package/dist/esm2017/src/core/auth/middleware.d.ts +25 -0
  28. package/dist/esm2017/src/core/auth/middleware.test.d.ts +17 -0
  29. package/dist/esm2017/src/core/errors.d.ts +7 -1
  30. package/dist/esm2017/src/core/index.d.ts +11 -0
  31. package/dist/esm2017/src/core/strategies/redirect.d.ts +1 -0
  32. package/dist/esm2017/src/model/popup_redirect.d.ts +2 -0
  33. package/dist/esm2017/src/model/public_types.d.ts +10 -0
  34. package/dist/esm2017/test/integration/flows/middleware_test_generator.d.ts +18 -0
  35. package/dist/esm2017/test/integration/webdriver/util/functions.d.ts +4 -0
  36. package/dist/esm5/{index-7a476dcd.js → index-dc27d95e.js} +203 -43
  37. package/dist/esm5/index-dc27d95e.js.map +1 -0
  38. package/dist/esm5/index.js +1 -1
  39. package/dist/esm5/internal/index.d.ts +1 -0
  40. package/dist/esm5/internal.js +3 -2
  41. package/dist/esm5/internal.js.map +1 -1
  42. package/dist/esm5/src/core/auth/auth_impl.d.ts +3 -1
  43. package/dist/esm5/src/core/auth/middleware.d.ts +25 -0
  44. package/dist/esm5/src/core/auth/middleware.test.d.ts +17 -0
  45. package/dist/esm5/src/core/errors.d.ts +7 -1
  46. package/dist/esm5/src/core/index.d.ts +11 -0
  47. package/dist/esm5/src/core/strategies/redirect.d.ts +1 -0
  48. package/dist/esm5/src/model/popup_redirect.d.ts +2 -0
  49. package/dist/esm5/src/model/public_types.d.ts +10 -0
  50. package/dist/esm5/test/integration/flows/middleware_test_generator.d.ts +18 -0
  51. package/dist/esm5/test/integration/webdriver/util/functions.d.ts +4 -0
  52. package/dist/index.webworker.esm5.js +198 -42
  53. package/dist/index.webworker.esm5.js.map +1 -1
  54. package/dist/internal/index.d.ts +1 -0
  55. package/dist/node/{index-eabd3e6c.js → index-ec34877a.js} +199 -42
  56. package/dist/node/index-ec34877a.js.map +1 -0
  57. package/dist/node/index.js +2 -1
  58. package/dist/node/index.js.map +1 -1
  59. package/dist/node/internal/index.d.ts +1 -0
  60. package/dist/node/internal.js +7 -1
  61. package/dist/node/internal.js.map +1 -1
  62. package/dist/node/src/core/auth/auth_impl.d.ts +3 -1
  63. package/dist/node/src/core/auth/middleware.d.ts +25 -0
  64. package/dist/node/src/core/auth/middleware.test.d.ts +17 -0
  65. package/dist/node/src/core/errors.d.ts +7 -1
  66. package/dist/node/src/core/index.d.ts +11 -0
  67. package/dist/node/src/core/strategies/redirect.d.ts +1 -0
  68. package/dist/node/src/model/popup_redirect.d.ts +2 -0
  69. package/dist/node/src/model/public_types.d.ts +10 -0
  70. package/dist/node/test/integration/flows/middleware_test_generator.d.ts +18 -0
  71. package/dist/node/test/integration/webdriver/util/functions.d.ts +4 -0
  72. package/dist/node-esm/{index-d709908a.js → index-c85cf380.js} +139 -18
  73. package/dist/node-esm/index-c85cf380.js.map +1 -0
  74. package/dist/node-esm/index.js +1 -1
  75. package/dist/node-esm/internal/index.d.ts +1 -0
  76. package/dist/node-esm/internal.js +7 -3
  77. package/dist/node-esm/internal.js.map +1 -1
  78. package/dist/node-esm/src/core/auth/auth_impl.d.ts +3 -1
  79. package/dist/node-esm/src/core/auth/middleware.d.ts +25 -0
  80. package/dist/node-esm/src/core/auth/middleware.test.d.ts +17 -0
  81. package/dist/node-esm/src/core/errors.d.ts +7 -1
  82. package/dist/node-esm/src/core/index.d.ts +11 -0
  83. package/dist/node-esm/src/core/strategies/redirect.d.ts +1 -0
  84. package/dist/node-esm/src/model/popup_redirect.d.ts +2 -0
  85. package/dist/node-esm/src/model/public_types.d.ts +10 -0
  86. package/dist/node-esm/test/integration/flows/middleware_test_generator.d.ts +18 -0
  87. package/dist/node-esm/test/integration/webdriver/util/functions.d.ts +4 -0
  88. package/dist/rn/index.js +2 -1
  89. package/dist/rn/index.js.map +1 -1
  90. package/dist/rn/internal/index.d.ts +1 -0
  91. package/dist/rn/internal.js +8 -1
  92. package/dist/rn/internal.js.map +1 -1
  93. package/dist/rn/{phone-eec7f987.js → phone-ae029e3c.js} +199 -42
  94. package/dist/rn/phone-ae029e3c.js.map +1 -0
  95. package/dist/rn/src/core/auth/auth_impl.d.ts +3 -1
  96. package/dist/rn/src/core/auth/middleware.d.ts +25 -0
  97. package/dist/rn/src/core/auth/middleware.test.d.ts +17 -0
  98. package/dist/rn/src/core/errors.d.ts +7 -1
  99. package/dist/rn/src/core/index.d.ts +11 -0
  100. package/dist/rn/src/core/strategies/redirect.d.ts +1 -0
  101. package/dist/rn/src/model/popup_redirect.d.ts +2 -0
  102. package/dist/rn/src/model/public_types.d.ts +10 -0
  103. package/dist/rn/test/integration/flows/middleware_test_generator.d.ts +18 -0
  104. package/dist/rn/test/integration/webdriver/util/functions.d.ts +4 -0
  105. package/dist/src/core/auth/auth_impl.d.ts +3 -1
  106. package/dist/src/core/auth/middleware.d.ts +25 -0
  107. package/dist/src/core/auth/middleware.test.d.ts +17 -0
  108. package/dist/src/core/errors.d.ts +7 -1
  109. package/dist/src/core/index.d.ts +11 -0
  110. package/dist/src/core/strategies/redirect.d.ts +1 -0
  111. package/dist/src/model/popup_redirect.d.ts +2 -0
  112. package/dist/src/model/public_types.d.ts +10 -0
  113. package/dist/test/integration/flows/middleware_test_generator.d.ts +18 -0
  114. package/dist/test/integration/webdriver/util/functions.d.ts +4 -0
  115. package/package.json +6 -6
  116. package/dist/cordova/popup_redirect-fd81f644.js.map +0 -1
  117. package/dist/esm2017/index-7078a255.js.map +0 -1
  118. package/dist/esm5/index-7a476dcd.js.map +0 -1
  119. package/dist/node/index-eabd3e6c.js.map +0 -1
  120. package/dist/node-esm/index-d709908a.js.map +0 -1
  121. package/dist/rn/phone-eec7f987.js.map +0 -1
@@ -101,6 +101,7 @@ function _debugErrorMap() {
101
101
  'Please fix by going to the Auth email templates section in the Firebase Console.',
102
102
  _a["invalid-verification-id" /* INVALID_SESSION_INFO */] = 'The verification ID used to create the phone auth credential is invalid.',
103
103
  _a["invalid-tenant-id" /* INVALID_TENANT_ID */] = "The Auth instance's tenant ID is invalid.",
104
+ _a["login-blocked" /* LOGIN_BLOCKED */] = "Login blocked by user-provided method: {$originalMessage}",
104
105
  _a["missing-android-pkg-name" /* MISSING_ANDROID_PACKAGE_NAME */] = 'An Android Package Name must be provided if the Android App is required to be installed.',
105
106
  _a["auth-domain-config-required" /* MISSING_AUTH_DOMAIN */] = 'Be sure to include authDomain when calling firebase.initializeApp(), ' +
106
107
  'by following the instructions in the Firebase console.',
@@ -522,7 +523,7 @@ function _initializeAuthInstance(auth, deps) {
522
523
  }
523
524
 
524
525
  var name = "@firebase/auth";
525
- var version = "0.19.12";
526
+ var version = "0.20.0";
526
527
 
527
528
  /**
528
529
  * @license
@@ -2321,6 +2322,104 @@ var PersistenceUserManager = /** @class */ (function () {
2321
2322
  return PersistenceUserManager;
2322
2323
  }());
2323
2324
 
2325
+ /**
2326
+ * @license
2327
+ * Copyright 2022 Google LLC
2328
+ *
2329
+ * Licensed under the Apache License, Version 2.0 (the "License");
2330
+ * you may not use this file except in compliance with the License.
2331
+ * You may obtain a copy of the License at
2332
+ *
2333
+ * http://www.apache.org/licenses/LICENSE-2.0
2334
+ *
2335
+ * Unless required by applicable law or agreed to in writing, software
2336
+ * distributed under the License is distributed on an "AS IS" BASIS,
2337
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2338
+ * See the License for the specific language governing permissions and
2339
+ * limitations under the License.
2340
+ */
2341
+ var AuthMiddlewareQueue = /** @class */ (function () {
2342
+ function AuthMiddlewareQueue(auth) {
2343
+ this.auth = auth;
2344
+ this.queue = [];
2345
+ }
2346
+ AuthMiddlewareQueue.prototype.pushCallback = function (callback, onAbort) {
2347
+ var _this = this;
2348
+ // The callback could be sync or async. Wrap it into a
2349
+ // function that is always async.
2350
+ var wrappedCallback = function (user) { return new Promise(function (resolve, reject) {
2351
+ try {
2352
+ var result = callback(user);
2353
+ // Either resolve with existing promise or wrap a non-promise
2354
+ // return value into a promise.
2355
+ resolve(result);
2356
+ }
2357
+ catch (e) {
2358
+ // Sync callback throws.
2359
+ reject(e);
2360
+ }
2361
+ }); };
2362
+ // Attach the onAbort if present
2363
+ wrappedCallback.onAbort = onAbort;
2364
+ this.queue.push(wrappedCallback);
2365
+ var index = this.queue.length - 1;
2366
+ return function () {
2367
+ // Unsubscribe. Replace with no-op. Do not remove from array, or it will disturb
2368
+ // indexing of other elements.
2369
+ _this.queue[index] = function () { return Promise.resolve(); };
2370
+ };
2371
+ };
2372
+ AuthMiddlewareQueue.prototype.runMiddleware = function (nextUser) {
2373
+ return __awaiter(this, void 0, void 0, function () {
2374
+ var onAbortStack, _i, _a, beforeStateCallback, e_1, _b, onAbortStack_1, onAbort;
2375
+ return __generator(this, function (_c) {
2376
+ switch (_c.label) {
2377
+ case 0:
2378
+ if (this.auth.currentUser === nextUser) {
2379
+ return [2 /*return*/];
2380
+ }
2381
+ onAbortStack = [];
2382
+ _c.label = 1;
2383
+ case 1:
2384
+ _c.trys.push([1, 6, , 7]);
2385
+ _i = 0, _a = this.queue;
2386
+ _c.label = 2;
2387
+ case 2:
2388
+ if (!(_i < _a.length)) return [3 /*break*/, 5];
2389
+ beforeStateCallback = _a[_i];
2390
+ return [4 /*yield*/, beforeStateCallback(nextUser)];
2391
+ case 3:
2392
+ _c.sent();
2393
+ // Only push the onAbort if the callback succeeds
2394
+ if (beforeStateCallback.onAbort) {
2395
+ onAbortStack.push(beforeStateCallback.onAbort);
2396
+ }
2397
+ _c.label = 4;
2398
+ case 4:
2399
+ _i++;
2400
+ return [3 /*break*/, 2];
2401
+ case 5: return [3 /*break*/, 7];
2402
+ case 6:
2403
+ e_1 = _c.sent();
2404
+ // Run all onAbort, with separate try/catch to ignore any errors and
2405
+ // continue
2406
+ onAbortStack.reverse();
2407
+ for (_b = 0, onAbortStack_1 = onAbortStack; _b < onAbortStack_1.length; _b++) {
2408
+ onAbort = onAbortStack_1[_b];
2409
+ try {
2410
+ onAbort();
2411
+ }
2412
+ catch (_) { /* swallow error */ }
2413
+ }
2414
+ throw this.auth._errorFactory.create("login-blocked" /* LOGIN_BLOCKED */, { originalMessage: e_1.message });
2415
+ case 7: return [2 /*return*/];
2416
+ }
2417
+ });
2418
+ });
2419
+ };
2420
+ return AuthMiddlewareQueue;
2421
+ }());
2422
+
2324
2423
  /**
2325
2424
  * @license
2326
2425
  * Copyright 2020 Google LLC
@@ -2347,6 +2446,7 @@ var AuthImpl = /** @class */ (function () {
2347
2446
  this.operations = Promise.resolve();
2348
2447
  this.authStateSubscription = new Subscription(this);
2349
2448
  this.idTokenSubscription = new Subscription(this);
2449
+ this.beforeStateQueue = new AuthMiddlewareQueue(this);
2350
2450
  this.redirectUser = null;
2351
2451
  this.isProactiveRefreshEnabled = false;
2352
2452
  // Any network calls will set this to true and prevent subsequent emulator
@@ -2448,9 +2548,11 @@ var AuthImpl = /** @class */ (function () {
2448
2548
  return [2 /*return*/];
2449
2549
  case 3:
2450
2550
  // Update current Auth state. Either a new login or logout.
2451
- return [4 /*yield*/, this._updateCurrentUser(user)];
2551
+ // Skip blocking callbacks, they should not apply to a change in another tab.
2552
+ return [4 /*yield*/, this._updateCurrentUser(user, /* skipBeforeStateCallbacks */ true)];
2452
2553
  case 4:
2453
2554
  // Update current Auth state. Either a new login or logout.
2555
+ // Skip blocking callbacks, they should not apply to a change in another tab.
2454
2556
  _a.sent();
2455
2557
  return [2 /*return*/];
2456
2558
  }
@@ -2460,18 +2562,20 @@ var AuthImpl = /** @class */ (function () {
2460
2562
  AuthImpl.prototype.initializeCurrentUser = function (popupRedirectResolver) {
2461
2563
  var _a;
2462
2564
  return __awaiter(this, void 0, void 0, function () {
2463
- var storedUser, redirectUserEventId, storedUserEventId, result;
2565
+ var previouslyStoredUser, futureCurrentUser, needsTocheckMiddleware, redirectUserEventId, storedUserEventId, result, e_2;
2464
2566
  return __generator(this, function (_b) {
2465
2567
  switch (_b.label) {
2466
2568
  case 0: return [4 /*yield*/, this.assertedPersistence.getCurrentUser()];
2467
2569
  case 1:
2468
- storedUser = (_b.sent());
2570
+ previouslyStoredUser = (_b.sent());
2571
+ futureCurrentUser = previouslyStoredUser;
2572
+ needsTocheckMiddleware = false;
2469
2573
  if (!(popupRedirectResolver && this.config.authDomain)) return [3 /*break*/, 4];
2470
2574
  return [4 /*yield*/, this.getOrInitRedirectPersistenceManager()];
2471
2575
  case 2:
2472
2576
  _b.sent();
2473
2577
  redirectUserEventId = (_a = this.redirectUser) === null || _a === void 0 ? void 0 : _a._redirectEventId;
2474
- storedUserEventId = storedUser === null || storedUser === void 0 ? void 0 : storedUser._redirectEventId;
2578
+ storedUserEventId = futureCurrentUser === null || futureCurrentUser === void 0 ? void 0 : futureCurrentUser._redirectEventId;
2475
2579
  return [4 /*yield*/, this.tryRedirectSignIn(popupRedirectResolver)];
2476
2580
  case 3:
2477
2581
  result = _b.sent();
@@ -2481,32 +2585,51 @@ var AuthImpl = /** @class */ (function () {
2481
2585
  // TODO(samgho): More thoroughly test all of this
2482
2586
  if ((!redirectUserEventId || redirectUserEventId === storedUserEventId) &&
2483
2587
  (result === null || result === void 0 ? void 0 : result.user)) {
2484
- storedUser = result.user;
2588
+ futureCurrentUser = result.user;
2589
+ needsTocheckMiddleware = true;
2485
2590
  }
2486
2591
  _b.label = 4;
2487
2592
  case 4:
2488
2593
  // If no user in persistence, there is no current user. Set to null.
2489
- if (!storedUser) {
2594
+ if (!futureCurrentUser) {
2490
2595
  return [2 /*return*/, this.directlySetCurrentUser(null)];
2491
2596
  }
2492
- if (!storedUser._redirectEventId) {
2493
- // This isn't a redirect user, we can reload and bail
2494
- // This will also catch the redirected user, if available, as that method
2495
- // strips the _redirectEventId
2496
- return [2 /*return*/, this.reloadAndSetCurrentUserOrClear(storedUser)];
2597
+ if (!!futureCurrentUser._redirectEventId) return [3 /*break*/, 9];
2598
+ if (!needsTocheckMiddleware) return [3 /*break*/, 8];
2599
+ _b.label = 5;
2600
+ case 5:
2601
+ _b.trys.push([5, 7, , 8]);
2602
+ return [4 /*yield*/, this.beforeStateQueue.runMiddleware(futureCurrentUser)];
2603
+ case 6:
2604
+ _b.sent();
2605
+ return [3 /*break*/, 8];
2606
+ case 7:
2607
+ e_2 = _b.sent();
2608
+ futureCurrentUser = previouslyStoredUser;
2609
+ // We know this is available since the bit is only set when the
2610
+ // resolver is available
2611
+ this._popupRedirectResolver._overrideRedirectResult(this, function () { return Promise.reject(e_2); });
2612
+ return [3 /*break*/, 8];
2613
+ case 8:
2614
+ if (futureCurrentUser) {
2615
+ return [2 /*return*/, this.reloadAndSetCurrentUserOrClear(futureCurrentUser)];
2616
+ }
2617
+ else {
2618
+ return [2 /*return*/, this.directlySetCurrentUser(null)];
2497
2619
  }
2620
+ case 9:
2498
2621
  _assert(this._popupRedirectResolver, this, "argument-error" /* ARGUMENT_ERROR */);
2499
2622
  return [4 /*yield*/, this.getOrInitRedirectPersistenceManager()];
2500
- case 5:
2623
+ case 10:
2501
2624
  _b.sent();
2502
2625
  // If the redirect user's event ID matches the current user's event ID,
2503
2626
  // DO NOT reload the current user, otherwise they'll be cleared from storage.
2504
2627
  // This is important for the reauthenticateWithRedirect() flow.
2505
2628
  if (this.redirectUser &&
2506
- this.redirectUser._redirectEventId === storedUser._redirectEventId) {
2507
- return [2 /*return*/, this.directlySetCurrentUser(storedUser)];
2629
+ this.redirectUser._redirectEventId === futureCurrentUser._redirectEventId) {
2630
+ return [2 /*return*/, this.directlySetCurrentUser(futureCurrentUser)];
2508
2631
  }
2509
- return [2 /*return*/, this.reloadAndSetCurrentUserOrClear(storedUser)];
2632
+ return [2 /*return*/, this.reloadAndSetCurrentUserOrClear(futureCurrentUser)];
2510
2633
  }
2511
2634
  });
2512
2635
  });
@@ -2544,7 +2667,7 @@ var AuthImpl = /** @class */ (function () {
2544
2667
  };
2545
2668
  AuthImpl.prototype.reloadAndSetCurrentUserOrClear = function (user) {
2546
2669
  return __awaiter(this, void 0, void 0, function () {
2547
- var e_3;
2670
+ var e_4;
2548
2671
  return __generator(this, function (_a) {
2549
2672
  switch (_a.label) {
2550
2673
  case 0:
@@ -2554,8 +2677,8 @@ var AuthImpl = /** @class */ (function () {
2554
2677
  _a.sent();
2555
2678
  return [3 /*break*/, 3];
2556
2679
  case 2:
2557
- e_3 = _a.sent();
2558
- if (e_3.code !== "auth/" + "network-request-failed" /* NETWORK_REQUEST_FAILED */) {
2680
+ e_4 = _a.sent();
2681
+ if (e_4.code !== "auth/" + "network-request-failed" /* NETWORK_REQUEST_FAILED */) {
2559
2682
  // Something's wrong with the user's token. Log them out and remove
2560
2683
  // them from storage
2561
2684
  return [2 /*return*/, this.directlySetCurrentUser(null)];
@@ -2591,27 +2714,36 @@ var AuthImpl = /** @class */ (function () {
2591
2714
  });
2592
2715
  });
2593
2716
  };
2594
- AuthImpl.prototype._updateCurrentUser = function (user) {
2717
+ AuthImpl.prototype._updateCurrentUser = function (user, skipBeforeStateCallbacks) {
2718
+ if (skipBeforeStateCallbacks === void 0) { skipBeforeStateCallbacks = false; }
2595
2719
  return __awaiter(this, void 0, void 0, function () {
2596
2720
  var _this = this;
2597
2721
  return __generator(this, function (_a) {
2598
- if (this._deleted) {
2599
- return [2 /*return*/];
2600
- }
2601
- if (user) {
2602
- _assert(this.tenantId === user.tenantId, this, "tenant-id-mismatch" /* TENANT_ID_MISMATCH */);
2722
+ switch (_a.label) {
2723
+ case 0:
2724
+ if (this._deleted) {
2725
+ return [2 /*return*/];
2726
+ }
2727
+ if (user) {
2728
+ _assert(this.tenantId === user.tenantId, this, "tenant-id-mismatch" /* TENANT_ID_MISMATCH */);
2729
+ }
2730
+ if (!!skipBeforeStateCallbacks) return [3 /*break*/, 2];
2731
+ return [4 /*yield*/, this.beforeStateQueue.runMiddleware(user)];
2732
+ case 1:
2733
+ _a.sent();
2734
+ _a.label = 2;
2735
+ case 2: return [2 /*return*/, this.queue(function () { return __awaiter(_this, void 0, void 0, function () {
2736
+ return __generator(this, function (_a) {
2737
+ switch (_a.label) {
2738
+ case 0: return [4 /*yield*/, this.directlySetCurrentUser(user)];
2739
+ case 1:
2740
+ _a.sent();
2741
+ this.notifyAuthListeners();
2742
+ return [2 /*return*/];
2743
+ }
2744
+ });
2745
+ }); })];
2603
2746
  }
2604
- return [2 /*return*/, this.queue(function () { return __awaiter(_this, void 0, void 0, function () {
2605
- return __generator(this, function (_a) {
2606
- switch (_a.label) {
2607
- case 0: return [4 /*yield*/, this.directlySetCurrentUser(user)];
2608
- case 1:
2609
- _a.sent();
2610
- this.notifyAuthListeners();
2611
- return [2 /*return*/];
2612
- }
2613
- });
2614
- }); })];
2615
2747
  });
2616
2748
  });
2617
2749
  };
@@ -2619,13 +2751,21 @@ var AuthImpl = /** @class */ (function () {
2619
2751
  return __awaiter(this, void 0, void 0, function () {
2620
2752
  return __generator(this, function (_a) {
2621
2753
  switch (_a.label) {
2622
- case 0:
2623
- if (!(this.redirectPersistenceManager || this._popupRedirectResolver)) return [3 /*break*/, 2];
2624
- return [4 /*yield*/, this._setRedirectUser(null)];
2754
+ case 0:
2755
+ // Run first, to block _setRedirectUser() if any callbacks fail.
2756
+ return [4 /*yield*/, this.beforeStateQueue.runMiddleware(null)];
2625
2757
  case 1:
2758
+ // Run first, to block _setRedirectUser() if any callbacks fail.
2626
2759
  _a.sent();
2627
- _a.label = 2;
2628
- case 2: return [2 /*return*/, this._updateCurrentUser(null)];
2760
+ if (!(this.redirectPersistenceManager || this._popupRedirectResolver)) return [3 /*break*/, 3];
2761
+ return [4 /*yield*/, this._setRedirectUser(null)];
2762
+ case 2:
2763
+ _a.sent();
2764
+ _a.label = 3;
2765
+ case 3:
2766
+ // Prevent callbacks from being called again in _updateCurrentUser, as
2767
+ // they were already called in the first line.
2768
+ return [2 /*return*/, this._updateCurrentUser(null, /* skipBeforeStateCallbacks */ true)];
2629
2769
  }
2630
2770
  });
2631
2771
  });
@@ -2652,6 +2792,9 @@ var AuthImpl = /** @class */ (function () {
2652
2792
  AuthImpl.prototype.onAuthStateChanged = function (nextOrObserver, error, completed) {
2653
2793
  return this.registerStateListener(this.authStateSubscription, nextOrObserver, error, completed);
2654
2794
  };
2795
+ AuthImpl.prototype.beforeAuthStateChanged = function (callback, onAbort) {
2796
+ return this.beforeStateQueue.pushCallback(callback, onAbort);
2797
+ };
2655
2798
  AuthImpl.prototype.onIdTokenChanged = function (nextOrObserver, error, completed) {
2656
2799
  return this.registerStateListener(this.idTokenSubscription, nextOrObserver, error, completed);
2657
2800
  };
@@ -7551,6 +7694,19 @@ function setPersistence(auth, persistence) {
7551
7694
  function onIdTokenChanged(auth, nextOrObserver, error, completed) {
7552
7695
  return getModularInstance(auth).onIdTokenChanged(nextOrObserver, error, completed);
7553
7696
  }
7697
+ /**
7698
+ * Adds a blocking callback that runs before an auth state change
7699
+ * sets a new user.
7700
+ *
7701
+ * @param auth - The {@link Auth} instance.
7702
+ * @param callback - callback triggered before new user value is set.
7703
+ * If this throws, it blocks the user from being set.
7704
+ * @param onAbort - callback triggered if a later `beforeAuthStateChanged()`
7705
+ * callback throws, allowing you to undo any side effects.
7706
+ */
7707
+ function beforeAuthStateChanged(auth, callback, onAbort) {
7708
+ return getModularInstance(auth).beforeAuthStateChanged(callback, onAbort);
7709
+ }
7554
7710
  /**
7555
7711
  * Adds an observer for changes to the user's sign-in state.
7556
7712
  *
@@ -7944,5 +8100,5 @@ function getAuth(app) {
7944
8100
  return auth;
7945
8101
  }
7946
8102
 
7947
- export { ActionCodeOperation, ActionCodeURL, AuthCredential, AUTH_ERROR_CODES_MAP_DO_NOT_USE_INTERNALLY as AuthErrorCodes, EmailAuthCredential, EmailAuthProvider, FacebookAuthProvider, FactorId, GithubAuthProvider, GoogleAuthProvider, OAuthCredential, OAuthProvider, OperationType, PhoneAuthCredential, ProviderId, SAMLAuthProvider, SignInMethod, TwitterAuthProvider, applyActionCode, checkActionCode, confirmPasswordReset, connectAuthEmulator, createUserWithEmailAndPassword, debugErrorMap, deleteUser, fetchSignInMethodsForEmail, getAdditionalUserInfo, getAuth, getIdToken, getIdTokenResult, getMultiFactorResolver, inMemoryPersistence, indexedDBLocalPersistence, initializeAuth, isSignInWithEmailLink, linkWithCredential, multiFactor, onAuthStateChanged, onIdTokenChanged, parseActionCodeURL, prodErrorMap, reauthenticateWithCredential, reload, sendEmailVerification, sendPasswordResetEmail, sendSignInLinkToEmail, setPersistence, signInAnonymously, signInWithCredential, signInWithCustomToken, signInWithEmailAndPassword, signInWithEmailLink, signOut, unlink, updateCurrentUser, updateEmail, updatePassword, updateProfile, useDeviceLanguage, verifyBeforeUpdateEmail, verifyPasswordResetCode };
8103
+ export { ActionCodeOperation, ActionCodeURL, AuthCredential, AUTH_ERROR_CODES_MAP_DO_NOT_USE_INTERNALLY as AuthErrorCodes, EmailAuthCredential, EmailAuthProvider, FacebookAuthProvider, FactorId, GithubAuthProvider, GoogleAuthProvider, OAuthCredential, OAuthProvider, OperationType, PhoneAuthCredential, ProviderId, SAMLAuthProvider, SignInMethod, TwitterAuthProvider, applyActionCode, beforeAuthStateChanged, checkActionCode, confirmPasswordReset, connectAuthEmulator, createUserWithEmailAndPassword, debugErrorMap, deleteUser, fetchSignInMethodsForEmail, getAdditionalUserInfo, getAuth, getIdToken, getIdTokenResult, getMultiFactorResolver, inMemoryPersistence, indexedDBLocalPersistence, initializeAuth, isSignInWithEmailLink, linkWithCredential, multiFactor, onAuthStateChanged, onIdTokenChanged, parseActionCodeURL, prodErrorMap, reauthenticateWithCredential, reload, sendEmailVerification, sendPasswordResetEmail, sendSignInLinkToEmail, setPersistence, signInAnonymously, signInWithCredential, signInWithCustomToken, signInWithEmailAndPassword, signInWithEmailLink, signOut, unlink, updateCurrentUser, updateEmail, updatePassword, updateProfile, useDeviceLanguage, verifyBeforeUpdateEmail, verifyPasswordResetCode };
7948
8104
  //# sourceMappingURL=index.webworker.esm5.js.map