@azure/msal-browser 2.16.1 → 2.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 (163) hide show
  1. package/CHANGELOG.json +283 -0
  2. package/{changelog.md → CHANGELOG.md} +73 -1
  3. package/README.md +12 -4
  4. package/dist/_virtual/_tslib.js +1 -1
  5. package/dist/app/ClientApplication.d.ts +35 -137
  6. package/dist/app/ClientApplication.d.ts.map +1 -1
  7. package/dist/app/ClientApplication.js +178 -883
  8. package/dist/app/ClientApplication.js.map +1 -1
  9. package/dist/app/IPublicClientApplication.d.ts +8 -0
  10. package/dist/app/IPublicClientApplication.d.ts.map +1 -1
  11. package/dist/app/IPublicClientApplication.js +16 -1
  12. package/dist/app/IPublicClientApplication.js.map +1 -1
  13. package/dist/app/PublicClientApplication.d.ts.map +1 -1
  14. package/dist/app/PublicClientApplication.js +35 -41
  15. package/dist/app/PublicClientApplication.js.map +1 -1
  16. package/dist/cache/AsyncMemoryStorage.d.ts +46 -0
  17. package/dist/cache/AsyncMemoryStorage.d.ts.map +1 -0
  18. package/dist/cache/AsyncMemoryStorage.js +195 -0
  19. package/dist/cache/AsyncMemoryStorage.js.map +1 -0
  20. package/dist/cache/BrowserCacheManager.d.ts +19 -2
  21. package/dist/cache/BrowserCacheManager.d.ts.map +1 -1
  22. package/dist/cache/BrowserCacheManager.js +104 -15
  23. package/dist/cache/BrowserCacheManager.js.map +1 -1
  24. package/dist/cache/BrowserStorage.d.ts +1 -1
  25. package/dist/cache/BrowserStorage.d.ts.map +1 -1
  26. package/dist/cache/BrowserStorage.js +1 -1
  27. package/dist/cache/BrowserStorage.js.map +1 -1
  28. package/dist/cache/DatabaseStorage.d.ts +29 -4
  29. package/dist/cache/DatabaseStorage.d.ts.map +1 -1
  30. package/dist/cache/DatabaseStorage.js +151 -45
  31. package/dist/cache/DatabaseStorage.js.map +1 -1
  32. package/dist/cache/IAsyncMemoryStorage.d.ts +28 -0
  33. package/dist/cache/IAsyncMemoryStorage.d.ts.map +1 -0
  34. package/dist/cache/ITokenCache.d.ts +8 -0
  35. package/dist/cache/ITokenCache.d.ts.map +1 -0
  36. package/dist/cache/IWindowStorage.d.ts +3 -3
  37. package/dist/cache/IWindowStorage.d.ts.map +1 -1
  38. package/dist/cache/MemoryStorage.d.ts +3 -3
  39. package/dist/cache/MemoryStorage.d.ts.map +1 -1
  40. package/dist/cache/MemoryStorage.js +1 -1
  41. package/dist/cache/MemoryStorage.js.map +1 -1
  42. package/dist/cache/TokenCache.d.ts +48 -0
  43. package/dist/cache/TokenCache.d.ts.map +1 -0
  44. package/dist/cache/TokenCache.js +124 -0
  45. package/dist/cache/TokenCache.js.map +1 -0
  46. package/dist/config/Configuration.js +1 -1
  47. package/dist/crypto/BrowserCrypto.d.ts +3 -1
  48. package/dist/crypto/BrowserCrypto.d.ts.map +1 -1
  49. package/dist/crypto/BrowserCrypto.js +3 -2
  50. package/dist/crypto/BrowserCrypto.js.map +1 -1
  51. package/dist/crypto/CryptoOps.d.ts +21 -6
  52. package/dist/crypto/CryptoOps.d.ts.map +1 -1
  53. package/dist/crypto/CryptoOps.js +67 -15
  54. package/dist/crypto/CryptoOps.js.map +1 -1
  55. package/dist/crypto/GuidGenerator.js +1 -1
  56. package/dist/crypto/PkceGenerator.js +1 -1
  57. package/dist/crypto/SignedHttpRequest.d.ts +31 -0
  58. package/dist/crypto/SignedHttpRequest.d.ts.map +1 -0
  59. package/dist/crypto/SignedHttpRequest.js +70 -0
  60. package/dist/crypto/SignedHttpRequest.js.map +1 -0
  61. package/dist/encode/Base64Decode.js +1 -1
  62. package/dist/encode/Base64Encode.js +1 -1
  63. package/dist/error/BrowserAuthError.d.ts +36 -4
  64. package/dist/error/BrowserAuthError.d.ts.map +1 -1
  65. package/dist/error/BrowserAuthError.js +51 -11
  66. package/dist/error/BrowserAuthError.js.map +1 -1
  67. package/dist/error/BrowserConfigurationAuthError.js +1 -1
  68. package/dist/event/EventHandler.d.ts +13 -0
  69. package/dist/event/EventHandler.d.ts.map +1 -1
  70. package/dist/event/EventHandler.js +66 -1
  71. package/dist/event/EventHandler.js.map +1 -1
  72. package/dist/event/EventMessage.d.ts +4 -3
  73. package/dist/event/EventMessage.d.ts.map +1 -1
  74. package/dist/event/EventMessage.js +24 -5
  75. package/dist/event/EventMessage.js.map +1 -1
  76. package/dist/event/EventType.d.ts +5 -0
  77. package/dist/event/EventType.d.ts.map +1 -1
  78. package/dist/event/EventType.js +6 -1
  79. package/dist/event/EventType.js.map +1 -1
  80. package/dist/index.cjs.js +4678 -2996
  81. package/dist/index.cjs.js.map +1 -1
  82. package/dist/index.d.ts +6 -2
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +4 -2
  85. package/dist/index.js.map +1 -1
  86. package/dist/interaction_client/BaseInteractionClient.d.ts +42 -0
  87. package/dist/interaction_client/BaseInteractionClient.d.ts.map +1 -0
  88. package/dist/interaction_client/BaseInteractionClient.js +131 -0
  89. package/dist/interaction_client/BaseInteractionClient.js.map +1 -0
  90. package/dist/interaction_client/HybridSpaAuthorizationCodeClient.d.ts +5 -0
  91. package/dist/interaction_client/HybridSpaAuthorizationCodeClient.d.ts.map +1 -0
  92. package/dist/interaction_client/HybridSpaAuthorizationCodeClient.js +21 -0
  93. package/dist/interaction_client/HybridSpaAuthorizationCodeClient.js.map +1 -0
  94. package/dist/interaction_client/PopupClient.d.ts +37 -0
  95. package/dist/interaction_client/PopupClient.d.ts.map +1 -0
  96. package/dist/interaction_client/PopupClient.js +234 -0
  97. package/dist/interaction_client/PopupClient.js.map +1 -0
  98. package/dist/interaction_client/RedirectClient.d.ts +42 -0
  99. package/dist/interaction_client/RedirectClient.d.ts.map +1 -0
  100. package/dist/interaction_client/RedirectClient.js +301 -0
  101. package/dist/interaction_client/RedirectClient.js.map +1 -0
  102. package/dist/interaction_client/SilentAuthCodeClient.d.ts +22 -0
  103. package/dist/interaction_client/SilentAuthCodeClient.d.ts.map +1 -0
  104. package/dist/interaction_client/SilentAuthCodeClient.js +80 -0
  105. package/dist/interaction_client/SilentAuthCodeClient.js.map +1 -0
  106. package/dist/interaction_client/SilentCacheClient.d.ts +22 -0
  107. package/dist/interaction_client/SilentCacheClient.d.ts.map +1 -0
  108. package/dist/interaction_client/SilentCacheClient.js +85 -0
  109. package/dist/interaction_client/SilentCacheClient.js.map +1 -0
  110. package/dist/interaction_client/SilentIframeClient.d.ts +29 -0
  111. package/dist/interaction_client/SilentIframeClient.d.ts.map +1 -0
  112. package/dist/interaction_client/SilentIframeClient.js +107 -0
  113. package/dist/interaction_client/SilentIframeClient.js.map +1 -0
  114. package/dist/interaction_client/SilentRefreshClient.d.ts +20 -0
  115. package/dist/interaction_client/SilentRefreshClient.d.ts.map +1 -0
  116. package/dist/interaction_client/SilentRefreshClient.js +76 -0
  117. package/dist/interaction_client/SilentRefreshClient.js.map +1 -0
  118. package/dist/interaction_client/StandardInteractionClient.d.ts +66 -0
  119. package/dist/interaction_client/StandardInteractionClient.d.ts.map +1 -0
  120. package/dist/interaction_client/StandardInteractionClient.js +249 -0
  121. package/dist/interaction_client/StandardInteractionClient.js.map +1 -0
  122. package/dist/interaction_handler/InteractionHandler.d.ts +11 -2
  123. package/dist/interaction_handler/InteractionHandler.d.ts.map +1 -1
  124. package/dist/interaction_handler/InteractionHandler.js +36 -10
  125. package/dist/interaction_handler/InteractionHandler.js.map +1 -1
  126. package/dist/interaction_handler/PopupHandler.d.ts +2 -0
  127. package/dist/interaction_handler/PopupHandler.d.ts.map +1 -1
  128. package/dist/interaction_handler/PopupHandler.js +3 -4
  129. package/dist/interaction_handler/PopupHandler.js.map +1 -1
  130. package/dist/interaction_handler/RedirectHandler.d.ts +1 -1
  131. package/dist/interaction_handler/RedirectHandler.d.ts.map +1 -1
  132. package/dist/interaction_handler/RedirectHandler.js +7 -6
  133. package/dist/interaction_handler/RedirectHandler.js.map +1 -1
  134. package/dist/interaction_handler/SilentHandler.js +1 -1
  135. package/dist/navigation/NavigationClient.js +1 -1
  136. package/dist/network/FetchClient.js +1 -1
  137. package/dist/network/XhrClient.js +1 -1
  138. package/dist/packageMetadata.d.ts +1 -1
  139. package/dist/packageMetadata.js +2 -2
  140. package/dist/packageMetadata.js.map +1 -1
  141. package/dist/request/AuthorizationCodeRequest.d.ts +8 -0
  142. package/dist/request/AuthorizationCodeRequest.d.ts.map +1 -0
  143. package/dist/request/EndSessionPopupRequest.d.ts +3 -0
  144. package/dist/request/EndSessionPopupRequest.d.ts.map +1 -1
  145. package/dist/request/PopupRequest.d.ts +3 -0
  146. package/dist/request/PopupRequest.d.ts.map +1 -1
  147. package/dist/request/RedirectRequest.d.ts.map +1 -1
  148. package/dist/utils/BrowserConstants.d.ts +13 -1
  149. package/dist/utils/BrowserConstants.d.ts.map +1 -1
  150. package/dist/utils/BrowserConstants.js +17 -3
  151. package/dist/utils/BrowserConstants.js.map +1 -1
  152. package/dist/utils/BrowserProtocolUtils.js +1 -1
  153. package/dist/utils/BrowserStringUtils.js +1 -1
  154. package/dist/utils/BrowserUtils.js +1 -1
  155. package/dist/utils/MathUtils.js +1 -1
  156. package/dist/utils/PopupUtils.d.ts +26 -2
  157. package/dist/utils/PopupUtils.d.ts.map +1 -1
  158. package/dist/utils/PopupUtils.js +42 -15
  159. package/dist/utils/PopupUtils.js.map +1 -1
  160. package/lib/msal-browser.js +4678 -2996
  161. package/lib/msal-browser.js.map +1 -1
  162. package/lib/msal-browser.min.js +32 -32
  163. package/package.json +9 -2
@@ -1,7 +1,8 @@
1
- /*! @azure/msal-browser v2.16.1 2021-08-02 */
1
+ /*! @azure/msal-browser v2.20.0 2021-12-07 */
2
2
  'use strict';
3
3
  import { __awaiter, __generator } from '../_virtual/_tslib.js';
4
4
  import { BrowserAuthError } from '../error/BrowserAuthError.js';
5
+ import { DB_NAME, DB_VERSION, DB_TABLE_NAME } from '../utils/BrowserConstants.js';
5
6
 
6
7
  /*
7
8
  * Copyright (c) Microsoft Corporation. All rights reserved.
@@ -11,10 +12,10 @@ import { BrowserAuthError } from '../error/BrowserAuthError.js';
11
12
  * Storage wrapper for IndexedDB storage in browsers: https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API
12
13
  */
13
14
  var DatabaseStorage = /** @class */ (function () {
14
- function DatabaseStorage(dbName, tableName, version) {
15
- this.dbName = dbName;
16
- this.tableName = tableName;
17
- this.version = version;
15
+ function DatabaseStorage() {
16
+ this.dbName = DB_NAME;
17
+ this.version = DB_VERSION;
18
+ this.tableName = DB_TABLE_NAME;
18
19
  this.dbOpen = false;
19
20
  }
20
21
  /**
@@ -25,7 +26,6 @@ var DatabaseStorage = /** @class */ (function () {
25
26
  var _this = this;
26
27
  return __generator(this, function (_a) {
27
28
  return [2 /*return*/, new Promise(function (resolve, reject) {
28
- // TODO: Add timeouts?
29
29
  var openDB = window.indexedDB.open(_this.dbName, _this.version);
30
30
  openDB.addEventListener("upgradeneeded", function (e) {
31
31
  var event = e;
@@ -37,40 +37,53 @@ var DatabaseStorage = /** @class */ (function () {
37
37
  _this.dbOpen = true;
38
38
  resolve();
39
39
  });
40
- openDB.addEventListener("error", function (error) { return reject(error); });
40
+ openDB.addEventListener("error", function () { return reject(BrowserAuthError.createDatabaseUnavailableError()); });
41
41
  })];
42
42
  });
43
43
  });
44
44
  };
45
45
  /**
46
- * Retrieves item from IndexedDB instance.
47
- * @param key
46
+ * Opens database if it's not already open
48
47
  */
49
- DatabaseStorage.prototype.get = function (key) {
48
+ DatabaseStorage.prototype.validateDbIsOpen = function () {
50
49
  return __awaiter(this, void 0, void 0, function () {
51
- var _this = this;
52
50
  return __generator(this, function (_a) {
53
51
  switch (_a.label) {
54
52
  case 0:
55
53
  if (!!this.dbOpen) return [3 /*break*/, 2];
56
54
  return [4 /*yield*/, this.open()];
55
+ case 1: return [2 /*return*/, _a.sent()];
56
+ case 2: return [2 /*return*/];
57
+ }
58
+ });
59
+ });
60
+ };
61
+ /**
62
+ * Retrieves item from IndexedDB instance.
63
+ * @param key
64
+ */
65
+ DatabaseStorage.prototype.getItem = function (key) {
66
+ return __awaiter(this, void 0, void 0, function () {
67
+ var _this = this;
68
+ return __generator(this, function (_a) {
69
+ switch (_a.label) {
70
+ case 0: return [4 /*yield*/, this.validateDbIsOpen()];
57
71
  case 1:
58
72
  _a.sent();
59
- _a.label = 2;
60
- case 2: return [2 /*return*/, new Promise(function (resolve, reject) {
61
- // TODO: Add timeouts?
62
- if (!_this.db) {
63
- return reject(BrowserAuthError.createDatabaseNotOpenError());
64
- }
65
- var transaction = _this.db.transaction([_this.tableName], "readonly");
66
- var objectStore = transaction.objectStore(_this.tableName);
67
- var dbGet = objectStore.get(key);
68
- dbGet.addEventListener("success", function (e) {
69
- var event = e;
70
- resolve(event.target.result);
71
- });
72
- dbGet.addEventListener("error", function (e) { return reject(e); });
73
- })];
73
+ return [2 /*return*/, new Promise(function (resolve, reject) {
74
+ // TODO: Add timeouts?
75
+ if (!_this.db) {
76
+ return reject(BrowserAuthError.createDatabaseNotOpenError());
77
+ }
78
+ var transaction = _this.db.transaction([_this.tableName], "readonly");
79
+ var objectStore = transaction.objectStore(_this.tableName);
80
+ var dbGet = objectStore.get(key);
81
+ dbGet.addEventListener("success", function (e) {
82
+ var event = e;
83
+ resolve(event.target.result);
84
+ });
85
+ dbGet.addEventListener("error", function (e) { return reject(e); });
86
+ })];
74
87
  }
75
88
  });
76
89
  });
@@ -80,35 +93,128 @@ var DatabaseStorage = /** @class */ (function () {
80
93
  * @param key
81
94
  * @param payload
82
95
  */
83
- DatabaseStorage.prototype.put = function (key, payload) {
96
+ DatabaseStorage.prototype.setItem = function (key, payload) {
84
97
  return __awaiter(this, void 0, void 0, function () {
85
98
  var _this = this;
86
99
  return __generator(this, function (_a) {
87
100
  switch (_a.label) {
88
- case 0:
89
- if (!!this.dbOpen) return [3 /*break*/, 2];
90
- return [4 /*yield*/, this.open()];
101
+ case 0: return [4 /*yield*/, this.validateDbIsOpen()];
102
+ case 1:
103
+ _a.sent();
104
+ return [2 /*return*/, new Promise(function (resolve, reject) {
105
+ // TODO: Add timeouts?
106
+ if (!_this.db) {
107
+ return reject(BrowserAuthError.createDatabaseNotOpenError());
108
+ }
109
+ var transaction = _this.db.transaction([_this.tableName], "readwrite");
110
+ var objectStore = transaction.objectStore(_this.tableName);
111
+ var dbPut = objectStore.put(payload, key);
112
+ dbPut.addEventListener("success", function () { return resolve(); });
113
+ dbPut.addEventListener("error", function (e) { return reject(e); });
114
+ })];
115
+ }
116
+ });
117
+ });
118
+ };
119
+ /**
120
+ * Removes item from IndexedDB under given key
121
+ * @param key
122
+ */
123
+ DatabaseStorage.prototype.removeItem = function (key) {
124
+ return __awaiter(this, void 0, void 0, function () {
125
+ var _this = this;
126
+ return __generator(this, function (_a) {
127
+ switch (_a.label) {
128
+ case 0: return [4 /*yield*/, this.validateDbIsOpen()];
129
+ case 1:
130
+ _a.sent();
131
+ return [2 /*return*/, new Promise(function (resolve, reject) {
132
+ if (!_this.db) {
133
+ return reject(BrowserAuthError.createDatabaseNotOpenError());
134
+ }
135
+ var transaction = _this.db.transaction([_this.tableName], "readwrite");
136
+ var objectStore = transaction.objectStore(_this.tableName);
137
+ var dbDelete = objectStore.delete(key);
138
+ dbDelete.addEventListener("success", function () { return resolve(); });
139
+ dbDelete.addEventListener("error", function (e) { return reject(e); });
140
+ })];
141
+ }
142
+ });
143
+ });
144
+ };
145
+ /**
146
+ * Get all the keys from the storage object as an iterable array of strings.
147
+ */
148
+ DatabaseStorage.prototype.getKeys = function () {
149
+ return __awaiter(this, void 0, void 0, function () {
150
+ var _this = this;
151
+ return __generator(this, function (_a) {
152
+ switch (_a.label) {
153
+ case 0: return [4 /*yield*/, this.validateDbIsOpen()];
154
+ case 1:
155
+ _a.sent();
156
+ return [2 /*return*/, new Promise(function (resolve, reject) {
157
+ if (!_this.db) {
158
+ return reject(BrowserAuthError.createDatabaseNotOpenError());
159
+ }
160
+ var transaction = _this.db.transaction([_this.tableName], "readonly");
161
+ var objectStore = transaction.objectStore(_this.tableName);
162
+ var dbGetKeys = objectStore.getAllKeys();
163
+ dbGetKeys.addEventListener("success", function (e) {
164
+ var event = e;
165
+ resolve(event.target.result);
166
+ });
167
+ dbGetKeys.addEventListener("error", function (e) { return reject(e); });
168
+ })];
169
+ }
170
+ });
171
+ });
172
+ };
173
+ /**
174
+ *
175
+ * Checks whether there is an object under the search key in the object store
176
+ */
177
+ DatabaseStorage.prototype.containsKey = function (key) {
178
+ return __awaiter(this, void 0, void 0, function () {
179
+ var _this = this;
180
+ return __generator(this, function (_a) {
181
+ switch (_a.label) {
182
+ case 0: return [4 /*yield*/, this.validateDbIsOpen()];
91
183
  case 1:
92
184
  _a.sent();
93
- _a.label = 2;
94
- case 2: return [2 /*return*/, new Promise(function (resolve, reject) {
95
- // TODO: Add timeouts?
96
- if (!_this.db) {
97
- return reject(BrowserAuthError.createDatabaseNotOpenError());
98
- }
99
- var transaction = _this.db.transaction([_this.tableName], "readwrite");
100
- var objectStore = transaction.objectStore(_this.tableName);
101
- var dbPut = objectStore.put(payload, key);
102
- dbPut.addEventListener("success", function (e) {
103
- var event = e;
104
- resolve(event.target.result);
105
- });
106
- dbPut.addEventListener("error", function (e) { return reject(e); });
107
- })];
185
+ return [2 /*return*/, new Promise(function (resolve, reject) {
186
+ if (!_this.db) {
187
+ return reject(BrowserAuthError.createDatabaseNotOpenError());
188
+ }
189
+ var transaction = _this.db.transaction([_this.tableName], "readonly");
190
+ var objectStore = transaction.objectStore(_this.tableName);
191
+ var dbContainsKey = objectStore.count(key);
192
+ dbContainsKey.addEventListener("success", function (e) {
193
+ var event = e;
194
+ resolve(event.target.result === 1);
195
+ });
196
+ dbContainsKey.addEventListener("error", function (e) { return reject(e); });
197
+ })];
108
198
  }
109
199
  });
110
200
  });
111
201
  };
202
+ /**
203
+ * Deletes the MSAL database. The database is deleted rather than cleared to make it possible
204
+ * for client applications to downgrade to a previous MSAL version without worrying about forward compatibility issues
205
+ * with IndexedDB database versions.
206
+ */
207
+ DatabaseStorage.prototype.deleteDatabase = function () {
208
+ return __awaiter(this, void 0, void 0, function () {
209
+ return __generator(this, function (_a) {
210
+ return [2 /*return*/, new Promise(function (resolve, reject) {
211
+ var deleteDbRequest = window.indexedDB.deleteDatabase(DB_NAME);
212
+ deleteDbRequest.addEventListener("success", function () { return resolve(true); });
213
+ deleteDbRequest.addEventListener("error", function () { return reject(false); });
214
+ })];
215
+ });
216
+ });
217
+ };
112
218
  return DatabaseStorage;
113
219
  }());
114
220
 
@@ -1 +1 @@
1
- {"version":3,"file":"DatabaseStorage.js","sources":["../../src/cache/DatabaseStorage.ts"],"sourcesContent":["/*\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { BrowserAuthError } from \"../error/BrowserAuthError\";\n\ninterface IDBOpenDBRequestEvent extends Event {\n target: IDBOpenDBRequest & EventTarget;\n}\n\ninterface IDBOpenOnUpgradeNeededEvent extends IDBVersionChangeEvent {\n target: IDBOpenDBRequest & EventTarget;\n}\n\ninterface IDBRequestEvent extends Event {\n target: IDBRequest & EventTarget;\n}\n\n/**\n * Storage wrapper for IndexedDB storage in browsers: https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API\n */\nexport class DatabaseStorage<T>{\n private db: IDBDatabase|undefined;\n private dbName: string;\n private tableName: string;\n private version: number;\n private dbOpen: boolean;\n\n constructor(dbName: string, tableName: string, version: number) {\n this.dbName = dbName;\n this.tableName = tableName;\n this.version = version;\n this.dbOpen = false;\n }\n\n /**\n * Opens IndexedDB instance.\n */\n async open(): Promise<void> {\n return new Promise((resolve, reject) => {\n // TODO: Add timeouts?\n const openDB = window.indexedDB.open(this.dbName, this.version);\n openDB.addEventListener(\"upgradeneeded\", (e: IDBVersionChangeEvent) => {\n const event = e as IDBOpenOnUpgradeNeededEvent;\n event.target.result.createObjectStore(this.tableName);\n });\n openDB.addEventListener(\"success\", (e: Event) => {\n const event = e as IDBOpenDBRequestEvent;\n this.db = event.target.result;\n this.dbOpen = true;\n resolve();\n });\n\n openDB.addEventListener(\"error\", error => reject(error));\n });\n }\n\n /**\n * Retrieves item from IndexedDB instance.\n * @param key \n */\n async get(key: string): Promise<T> {\n if (!this.dbOpen) {\n await this.open();\n }\n\n return new Promise<T>((resolve, reject) => {\n // TODO: Add timeouts?\n if (!this.db) {\n return reject(BrowserAuthError.createDatabaseNotOpenError());\n }\n\n const transaction = this.db.transaction([this.tableName], \"readonly\");\n\n const objectStore = transaction.objectStore(this.tableName);\n const dbGet = objectStore.get(key);\n dbGet.addEventListener(\"success\", (e: Event) => {\n const event = e as IDBRequestEvent;\n resolve(event.target.result);\n });\n dbGet.addEventListener(\"error\", e => reject(e));\n });\n }\n\n /**\n * Adds item to IndexedDB under given key\n * @param key \n * @param payload \n */\n async put(key: string, payload: T): Promise<T> {\n if (!this.dbOpen) {\n await this.open();\n }\n\n return new Promise<T>((resolve: Function, reject: Function) => {\n // TODO: Add timeouts?\n if (!this.db) {\n return reject(BrowserAuthError.createDatabaseNotOpenError());\n }\n\n const transaction = this.db.transaction([this.tableName], \"readwrite\");\n const objectStore = transaction.objectStore(this.tableName);\n\n const dbPut = objectStore.put(payload, key);\n dbPut.addEventListener(\"success\", (e: Event) => {\n const event = e as IDBRequestEvent;\n resolve(event.target.result);\n });\n dbPut.addEventListener(\"error\", e => reject(e));\n });\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DatabaseStorage.js","sources":["../../src/cache/DatabaseStorage.ts"],"sourcesContent":["/*\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { BrowserAuthError } from \"../error/BrowserAuthError\";\nimport { DB_NAME, DB_TABLE_NAME, DB_VERSION } from \"../utils/BrowserConstants\";\nimport { IAsyncStorage } from \"./IAsyncMemoryStorage\";\n\ninterface IDBOpenDBRequestEvent extends Event {\n target: IDBOpenDBRequest & EventTarget;\n}\n\ninterface IDBOpenOnUpgradeNeededEvent extends IDBVersionChangeEvent {\n target: IDBOpenDBRequest & EventTarget;\n}\n\ninterface IDBRequestEvent extends Event {\n target: IDBRequest & EventTarget;\n}\n\n/**\n * Storage wrapper for IndexedDB storage in browsers: https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API\n */\nexport class DatabaseStorage<T> implements IAsyncStorage<T> {\n private db: IDBDatabase|undefined;\n private dbName: string;\n private tableName: string;\n private version: number;\n private dbOpen: boolean;\n\n constructor() {\n this.dbName = DB_NAME;\n this.version = DB_VERSION;\n this.tableName = DB_TABLE_NAME;\n this.dbOpen = false;\n }\n\n /**\n * Opens IndexedDB instance.\n */\n async open(): Promise<void> {\n return new Promise((resolve, reject) => {\n const openDB = window.indexedDB.open(this.dbName, this.version);\n openDB.addEventListener(\"upgradeneeded\", (e: IDBVersionChangeEvent) => {\n const event = e as IDBOpenOnUpgradeNeededEvent;\n event.target.result.createObjectStore(this.tableName);\n });\n openDB.addEventListener(\"success\", (e: Event) => {\n const event = e as IDBOpenDBRequestEvent;\n this.db = event.target.result;\n this.dbOpen = true;\n resolve();\n });\n openDB.addEventListener(\"error\", () => reject(BrowserAuthError.createDatabaseUnavailableError()));\n });\n }\n\n /**\n * Opens database if it's not already open\n */\n private async validateDbIsOpen(): Promise<void> {\n if (!this.dbOpen) {\n return await this.open();\n }\n }\n\n /**\n * Retrieves item from IndexedDB instance.\n * @param key \n */\n async getItem(key: string): Promise<T | null> {\n await this.validateDbIsOpen();\n\n return new Promise<T>((resolve, reject) => {\n // TODO: Add timeouts?\n if (!this.db) {\n return reject(BrowserAuthError.createDatabaseNotOpenError());\n }\n const transaction = this.db.transaction([this.tableName], \"readonly\");\n const objectStore = transaction.objectStore(this.tableName);\n const dbGet = objectStore.get(key);\n dbGet.addEventListener(\"success\", (e: Event) => {\n const event = e as IDBRequestEvent;\n resolve(event.target.result);\n });\n dbGet.addEventListener(\"error\", (e) => reject(e));\n });\n }\n\n /**\n * Adds item to IndexedDB under given key\n * @param key \n * @param payload \n */\n async setItem(key: string, payload: T): Promise<void> {\n await this.validateDbIsOpen();\n\n return new Promise<void>((resolve: Function, reject: Function) => {\n // TODO: Add timeouts?\n if (!this.db) {\n return reject(BrowserAuthError.createDatabaseNotOpenError());\n }\n const transaction = this.db.transaction([this.tableName], \"readwrite\");\n\n const objectStore = transaction.objectStore(this.tableName);\n\n const dbPut = objectStore.put(payload, key);\n\n dbPut.addEventListener(\"success\", () => resolve());\n dbPut.addEventListener(\"error\", (e) => reject(e));\n });\n }\n\n /**\n * Removes item from IndexedDB under given key\n * @param key\n */\n async removeItem(key: string): Promise<void> {\n await this.validateDbIsOpen();\n\n return new Promise<void>((resolve: Function, reject: Function) => {\n if (!this.db) {\n return reject(BrowserAuthError.createDatabaseNotOpenError());\n }\n const transaction = this.db.transaction([this.tableName], \"readwrite\");\n const objectStore = transaction.objectStore(this.tableName);\n const dbDelete = objectStore.delete(key);\n dbDelete.addEventListener(\"success\", () => resolve());\n dbDelete.addEventListener(\"error\", (e) => reject(e));\n });\n }\n\n /**\n * Get all the keys from the storage object as an iterable array of strings.\n */\n async getKeys(): Promise<string[]> {\n await this.validateDbIsOpen();\n\n return new Promise<string[]>((resolve: Function, reject: Function) => {\n if (!this.db) {\n return reject(BrowserAuthError.createDatabaseNotOpenError());\n }\n\n const transaction = this.db.transaction([this.tableName], \"readonly\");\n const objectStore = transaction.objectStore(this.tableName);\n const dbGetKeys = objectStore.getAllKeys();\n dbGetKeys.addEventListener(\"success\", (e: Event) => {\n const event = e as IDBRequestEvent;\n resolve(event.target.result);\n });\n dbGetKeys.addEventListener(\"error\", (e: Event) => reject(e));\n });\n }\n\n /**\n * \n * Checks whether there is an object under the search key in the object store\n */\n async containsKey(key: string): Promise<boolean> {\n await this.validateDbIsOpen();\n\n return new Promise<boolean>((resolve: Function, reject: Function) => {\n if (!this.db) {\n return reject(BrowserAuthError.createDatabaseNotOpenError());\n }\n const transaction = this.db.transaction([this.tableName], \"readonly\");\n const objectStore = transaction.objectStore(this.tableName);\n const dbContainsKey = objectStore.count(key);\n dbContainsKey.addEventListener(\"success\", (e: Event) => {\n const event = e as IDBRequestEvent;\n resolve(event.target.result === 1);\n });\n dbContainsKey.addEventListener(\"error\", (e: Event) => reject(e));\n });\n }\n\n /**\n * Deletes the MSAL database. The database is deleted rather than cleared to make it possible\n * for client applications to downgrade to a previous MSAL version without worrying about forward compatibility issues\n * with IndexedDB database versions.\n */\n async deleteDatabase(): Promise<boolean> {\n return new Promise<boolean>((resolve: Function, reject: Function) => {\n const deleteDbRequest = window.indexedDB.deleteDatabase(DB_NAME);\n deleteDbRequest.addEventListener(\"success\", () => resolve(true));\n deleteDbRequest.addEventListener(\"error\", () => reject(false));\n });\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export interface IAsyncStorage<T> {
2
+ /**
3
+ * Get the item from the asynchronous storage object matching the given key.
4
+ * @param key
5
+ */
6
+ getItem(key: string): Promise<T | null>;
7
+ /**
8
+ * Sets the item in the asynchronous storage object with the given key.
9
+ * @param key
10
+ * @param value
11
+ */
12
+ setItem(key: string, value: T): Promise<void>;
13
+ /**
14
+ * Removes the item in the asynchronous storage object matching the given key.
15
+ * @param key
16
+ */
17
+ removeItem(key: string): Promise<void>;
18
+ /**
19
+ * Get all the keys from the asynchronous storage object as an iterable array of strings.
20
+ */
21
+ getKeys(): Promise<string[]>;
22
+ /**
23
+ * Returns true or false if the given key is present in the cache.
24
+ * @param key
25
+ */
26
+ containsKey(key: string): Promise<boolean>;
27
+ }
28
+ //# sourceMappingURL=IAsyncMemoryStorage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IAsyncMemoryStorage.d.ts","sourceRoot":"","sources":["../../src/cache/IAsyncMemoryStorage.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa,CAAC,CAAC;IAC5B;;;OAGG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAExC;;;;OAIG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9C;;;OAGG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvC;;OAEG;IACH,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAE7B;;;OAGG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9C"}
@@ -0,0 +1,8 @@
1
+ import { ExternalTokenResponse } from "@azure/msal-common";
2
+ import { SilentRequest } from "../request/SilentRequest";
3
+ import { LoadTokenOptions } from "./TokenCache";
4
+ export interface ITokenCache {
5
+ /** API to side-load tokens to MSAL cache */
6
+ loadExternalTokens(request: SilentRequest, response: ExternalTokenResponse, options: LoadTokenOptions): void;
7
+ }
8
+ //# sourceMappingURL=ITokenCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ITokenCache.d.ts","sourceRoot":"","sources":["../../src/cache/ITokenCache.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,WAAW,WAAW;IAExB,4CAA4C;IAC5C,kBAAkB,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,qBAAqB,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAChH"}
@@ -1,15 +1,15 @@
1
- export interface IWindowStorage {
1
+ export interface IWindowStorage<T> {
2
2
  /**
3
3
  * Get the item from the window storage object matching the given key.
4
4
  * @param key
5
5
  */
6
- getItem(key: string): string | null;
6
+ getItem(key: string): T | null;
7
7
  /**
8
8
  * Sets the item in the window storage object with the given key.
9
9
  * @param key
10
10
  * @param value
11
11
  */
12
- setItem(key: string, value: string): void;
12
+ setItem(key: string, value: T): void;
13
13
  /**
14
14
  * Removes the item in the window storage object matching the given key.
15
15
  * @param key
@@ -1 +1 @@
1
- {"version":3,"file":"IWindowStorage.d.ts","sourceRoot":"","sources":["../../src/cache/IWindowStorage.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,cAAc;IAC3B;;;OAGG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAEpC;;;;OAIG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1C;;;OAGG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAE9B;;OAEG;IACH,OAAO,IAAI,MAAM,EAAE,CAAC;IAEpB;;;OAGG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACrC"}
1
+ {"version":3,"file":"IWindowStorage.d.ts","sourceRoot":"","sources":["../../src/cache/IWindowStorage.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,cAAc,CAAC,CAAC;IAC7B;;;OAGG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC;IAE/B;;;;OAIG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IAErC;;;OAGG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAE9B;;OAEG;IACH,OAAO,IAAI,MAAM,EAAE,CAAC;IAEpB;;;OAGG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACrC"}
@@ -1,9 +1,9 @@
1
1
  import { IWindowStorage } from "./IWindowStorage";
2
- export declare class MemoryStorage implements IWindowStorage {
2
+ export declare class MemoryStorage<T> implements IWindowStorage<T> {
3
3
  private cache;
4
4
  constructor();
5
- getItem(key: string): string | null;
6
- setItem(key: string, value: string): void;
5
+ getItem(key: string): T | null;
6
+ setItem(key: string, value: T): void;
7
7
  removeItem(key: string): void;
8
8
  getKeys(): string[];
9
9
  containsKey(key: string): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"MemoryStorage.d.ts","sourceRoot":"","sources":["../../src/cache/MemoryStorage.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,qBAAa,aAAc,YAAW,cAAc;IAEhD,OAAO,CAAC,KAAK,CAAsB;;IAMnC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAInC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAIzC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI7B,OAAO,IAAI,MAAM,EAAE;IAQnB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIjC,KAAK,IAAI,IAAI;CAGhB"}
1
+ {"version":3,"file":"MemoryStorage.d.ts","sourceRoot":"","sources":["../../src/cache/MemoryStorage.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,qBAAa,aAAa,CAAC,CAAC,CAAE,YAAW,cAAc,CAAC,CAAC,CAAC;IAEtD,OAAO,CAAC,KAAK,CAAiB;;IAM9B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI;IAI9B,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAIpC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI7B,OAAO,IAAI,MAAM,EAAE;IAQnB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIjC,KAAK,IAAI,IAAI;CAGhB"}
@@ -1,4 +1,4 @@
1
- /*! @azure/msal-browser v2.16.1 2021-08-02 */
1
+ /*! @azure/msal-browser v2.20.0 2021-12-07 */
2
2
  'use strict';
3
3
  /*
4
4
  * Copyright (c) Microsoft Corporation. All rights reserved.
@@ -1 +1 @@
1
- {"version":3,"file":"MemoryStorage.js","sources":["../../src/cache/MemoryStorage.ts"],"sourcesContent":["/*\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IWindowStorage } from \"./IWindowStorage\";\n\nexport class MemoryStorage implements IWindowStorage {\n\n private cache: Map<string, string>;\n\n constructor() {\n this.cache = new Map<string, string>();\n }\n\n getItem(key: string): string | null {\n return this.cache.get(key) || null;\n }\n\n setItem(key: string, value: string): void {\n this.cache.set(key, value);\n }\n\n removeItem(key: string): void {\n this.cache.delete(key);\n }\n\n getKeys(): string[] {\n const cacheKeys: string[] = [];\n this.cache.forEach((value: string, key: string) => {\n cacheKeys.push(key);\n });\n return cacheKeys;\n }\n\n containsKey(key: string): boolean {\n return this.cache.has(key);\n }\n\n clear() :void {\n this.cache.clear();\n }\n}\n"],"names":[],"mappings":";;AAAA;;;;;IAWI;QACI,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;KAC1C;IAED,+BAAO,GAAP,UAAQ,GAAW;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;KACtC;IAED,+BAAO,GAAP,UAAQ,GAAW,EAAE,KAAa;QAC9B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;KAC9B;IAED,kCAAU,GAAV,UAAW,GAAW;QAClB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;KAC1B;IAED,+BAAO,GAAP;QACI,IAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAC,KAAa,EAAE,GAAW;YAC1C,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SACvB,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;KACpB;IAED,mCAAW,GAAX,UAAY,GAAW;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;KAC9B;IAED,6BAAK,GAAL;QACI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;KACtB;IACL,oBAAC;AAAD,CAAC;;;;"}
1
+ {"version":3,"file":"MemoryStorage.js","sources":["../../src/cache/MemoryStorage.ts"],"sourcesContent":["/*\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IWindowStorage } from \"./IWindowStorage\";\n\nexport class MemoryStorage<T> implements IWindowStorage<T> {\n\n private cache: Map<string, T>;\n\n constructor() {\n this.cache = new Map<string, T>();\n }\n\n getItem(key: string): T | null {\n return this.cache.get(key) || null;\n }\n\n setItem(key: string, value: T): void {\n this.cache.set(key, value);\n }\n\n removeItem(key: string): void {\n this.cache.delete(key);\n }\n\n getKeys(): string[] {\n const cacheKeys: string[] = [];\n this.cache.forEach((value: T, key: string) => {\n cacheKeys.push(key);\n });\n return cacheKeys;\n }\n\n containsKey(key: string): boolean {\n return this.cache.has(key);\n }\n\n clear() :void {\n this.cache.clear();\n }\n}\n"],"names":[],"mappings":";;AAAA;;;;;IAWI;QACI,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAAa,CAAC;KACrC;IAED,+BAAO,GAAP,UAAQ,GAAW;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;KACtC;IAED,+BAAO,GAAP,UAAQ,GAAW,EAAE,KAAQ;QACzB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;KAC9B;IAED,kCAAU,GAAV,UAAW,GAAW;QAClB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;KAC1B;IAED,+BAAO,GAAP;QACI,IAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAC,KAAQ,EAAE,GAAW;YACrC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SACvB,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;KACpB;IAED,mCAAW,GAAX,UAAY,GAAW;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;KAC9B;IAED,6BAAK,GAAL;QACI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;KACtB;IACL,oBAAC;AAAD,CAAC;;;;"}
@@ -0,0 +1,48 @@
1
+ import { ICrypto, Logger, ExternalTokenResponse } from "@azure/msal-common";
2
+ import { BrowserConfiguration } from "../config/Configuration";
3
+ import { SilentRequest } from "../request/SilentRequest";
4
+ import { BrowserCacheManager } from "./BrowserCacheManager";
5
+ import { ITokenCache } from "./ITokenCache";
6
+ export declare type LoadTokenOptions = {
7
+ clientInfo?: string;
8
+ extendedExpiresOn?: number;
9
+ };
10
+ /**
11
+ * Token cache manager
12
+ */
13
+ export declare class TokenCache implements ITokenCache {
14
+ isBrowserEnvironment: boolean;
15
+ protected config: BrowserConfiguration;
16
+ private storage;
17
+ private logger;
18
+ private cryptoObj;
19
+ constructor(configuration: BrowserConfiguration, storage: BrowserCacheManager, logger: Logger, cryptoObj: ICrypto);
20
+ /**
21
+ * API to load tokens to msal-browser cache.
22
+ * @param request
23
+ * @param response
24
+ * @param options
25
+ */
26
+ loadExternalTokens(request: SilentRequest, response: ExternalTokenResponse, options: LoadTokenOptions): void;
27
+ /**
28
+ * Helper function to load id tokens to msal-browser cache
29
+ * @param idToken
30
+ * @param homeAccountId
31
+ * @param environment
32
+ * @param tenantId
33
+ * @param options
34
+ */
35
+ private loadIdToken;
36
+ /**
37
+ * Helper function to load access tokens to msal-browser cache
38
+ * @param request
39
+ * @param response
40
+ * @param options
41
+ * @param homeAccountId
42
+ * @param environment
43
+ * @param tenantId
44
+ * @returns
45
+ */
46
+ private loadAccessToken;
47
+ }
48
+ //# sourceMappingURL=TokenCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TokenCache.d.ts","sourceRoot":"","sources":["../../src/cache/TokenCache.ts"],"names":[],"mappings":"AAKA,OAAO,EAAqB,OAAO,EAAiB,MAAM,EAAyC,qBAAqB,EAA4B,MAAM,oBAAoB,CAAC;AAC/K,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,oBAAY,gBAAgB,GAAG;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC7B,CAAC;AAEF;;GAEG;AACH,qBAAa,UAAW,YAAW,WAAW;IAEnC,oBAAoB,EAAE,OAAO,CAAC;IAErC,SAAS,CAAC,MAAM,EAAE,oBAAoB,CAAC;IAEvC,OAAO,CAAC,OAAO,CAAsB;IAErC,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,SAAS,CAAU;gBAEf,aAAa,EAAE,oBAAoB,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO;IAUjH;;;;;OAKG;IACH,kBAAkB,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,qBAAqB,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAqC5G;;;;;;;OAOG;IACH,OAAO,CAAC,WAAW;IAiBnB;;;;;;;;;OASG;IACH,OAAO,CAAC,eAAe;CA4B1B"}
@@ -0,0 +1,124 @@
1
+ /*! @azure/msal-browser v2.20.0 2021-12-07 */
2
+ 'use strict';
3
+ import { Authority, IdTokenEntity, AuthToken, AccountEntity, ScopeSet, AccessTokenEntity } from '@azure/msal-common';
4
+ import { BrowserAuthError } from '../error/BrowserAuthError.js';
5
+
6
+ /*
7
+ * Copyright (c) Microsoft Corporation. All rights reserved.
8
+ * Licensed under the MIT License.
9
+ */
10
+ /**
11
+ * Token cache manager
12
+ */
13
+ var TokenCache = /** @class */ (function () {
14
+ function TokenCache(configuration, storage, logger, cryptoObj) {
15
+ this.isBrowserEnvironment = typeof window !== "undefined";
16
+ this.config = configuration;
17
+ this.storage = storage;
18
+ this.logger = logger;
19
+ this.cryptoObj = cryptoObj;
20
+ }
21
+ // Move getAllAccounts here and cache utility APIs
22
+ /**
23
+ * API to load tokens to msal-browser cache.
24
+ * @param request
25
+ * @param response
26
+ * @param options
27
+ */
28
+ TokenCache.prototype.loadExternalTokens = function (request, response, options) {
29
+ this.logger.info("TokenCache - loadExternalTokens called");
30
+ if (!response.id_token) {
31
+ throw BrowserAuthError.createUnableToLoadTokenError("Please ensure server response includes id token.");
32
+ }
33
+ if (request.account) {
34
+ this.loadIdToken(response.id_token, request.account.homeAccountId, request.account.environment, request.account.tenantId, options);
35
+ this.loadAccessToken(request, response, request.account.homeAccountId, request.account.environment, request.account.tenantId, options);
36
+ }
37
+ else if (request.authority) {
38
+ var authorityOptions = {
39
+ protocolMode: this.config.auth.protocolMode,
40
+ knownAuthorities: this.config.auth.knownAuthorities,
41
+ cloudDiscoveryMetadata: this.config.auth.cloudDiscoveryMetadata,
42
+ authorityMetadata: this.config.auth.authorityMetadata
43
+ };
44
+ var authority = new Authority(request.authority, this.config.system.networkClient, this.storage, authorityOptions);
45
+ // "clientInfo" from options takes precedence over "clientInfo" in response
46
+ if (options.clientInfo) {
47
+ this.logger.trace("TokenCache - homeAccountId from options");
48
+ this.loadIdToken(response.id_token, options.clientInfo, authority.hostnameAndPort, authority.tenant, options);
49
+ this.loadAccessToken(request, response, options.clientInfo, authority.hostnameAndPort, authority.tenant, options);
50
+ }
51
+ else if (response.client_info) {
52
+ this.logger.trace("TokenCache - homeAccountId from response");
53
+ this.loadIdToken(response.id_token, response.client_info, authority.hostnameAndPort, authority.tenant, options);
54
+ this.loadAccessToken(request, response, response.client_info, authority.hostnameAndPort, authority.tenant, options);
55
+ }
56
+ else {
57
+ throw BrowserAuthError.createUnableToLoadTokenError("Please provide clientInfo in the response or options.");
58
+ }
59
+ }
60
+ else {
61
+ throw BrowserAuthError.createUnableToLoadTokenError("Please provide a request with an account or a request with authority.");
62
+ }
63
+ };
64
+ /**
65
+ * Helper function to load id tokens to msal-browser cache
66
+ * @param idToken
67
+ * @param homeAccountId
68
+ * @param environment
69
+ * @param tenantId
70
+ * @param options
71
+ */
72
+ TokenCache.prototype.loadIdToken = function (idToken, homeAccountId, environment, tenantId, options) {
73
+ var idTokenEntity = IdTokenEntity.createIdTokenEntity(homeAccountId, environment, idToken, this.config.auth.clientId, tenantId);
74
+ var idAuthToken = new AuthToken(idToken, this.cryptoObj);
75
+ var accountEntity = options.clientInfo ?
76
+ AccountEntity.createAccount(options.clientInfo, homeAccountId, idAuthToken, undefined, undefined, undefined, undefined, environment) :
77
+ AccountEntity.createGenericAccount(homeAccountId, idAuthToken, undefined, undefined, undefined, undefined, environment);
78
+ if (this.isBrowserEnvironment) {
79
+ this.logger.verbose("TokenCache - loading id token");
80
+ this.storage.setAccount(accountEntity);
81
+ this.storage.setIdTokenCredential(idTokenEntity);
82
+ }
83
+ else {
84
+ throw BrowserAuthError.createUnableToLoadTokenError("loadExternalTokens is designed to work in browser environments only.");
85
+ }
86
+ };
87
+ /**
88
+ * Helper function to load access tokens to msal-browser cache
89
+ * @param request
90
+ * @param response
91
+ * @param options
92
+ * @param homeAccountId
93
+ * @param environment
94
+ * @param tenantId
95
+ * @returns
96
+ */
97
+ TokenCache.prototype.loadAccessToken = function (request, response, homeAccountId, environment, tenantId, options) {
98
+ if (!response.access_token) {
99
+ this.logger.verbose("TokenCache - No access token provided for caching");
100
+ return;
101
+ }
102
+ if (!response.expires_in) {
103
+ throw BrowserAuthError.createUnableToLoadTokenError("Please ensure server response includes expires_in value.");
104
+ }
105
+ if (!options.extendedExpiresOn) {
106
+ throw BrowserAuthError.createUnableToLoadTokenError("Please provide an extendedExpiresOn value in the options.");
107
+ }
108
+ var scopes = new ScopeSet(request.scopes).printScopes();
109
+ var expiresOn = response.expires_in;
110
+ var extendedExpiresOn = options.extendedExpiresOn;
111
+ var accessTokenEntity = AccessTokenEntity.createAccessTokenEntity(homeAccountId, environment, response.access_token, this.config.auth.clientId, tenantId, scopes, expiresOn, extendedExpiresOn, this.cryptoObj);
112
+ if (this.isBrowserEnvironment) {
113
+ this.logger.verbose("TokenCache - loading access token");
114
+ this.storage.setAccessTokenCredential(accessTokenEntity);
115
+ }
116
+ else {
117
+ throw BrowserAuthError.createUnableToLoadTokenError("loadExternalTokens is designed to work in browser environments only.");
118
+ }
119
+ };
120
+ return TokenCache;
121
+ }());
122
+
123
+ export { TokenCache };
124
+ //# sourceMappingURL=TokenCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TokenCache.js","sources":["../../src/cache/TokenCache.ts"],"sourcesContent":["/*\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { AccessTokenEntity, ICrypto, IdTokenEntity, Logger, ScopeSet, Authority, AuthorityOptions, ExternalTokenResponse, AccountEntity, AuthToken } from \"@azure/msal-common\";\nimport { BrowserConfiguration } from \"../config/Configuration\";\nimport { SilentRequest } from \"../request/SilentRequest\";\nimport { BrowserCacheManager } from \"./BrowserCacheManager\";\nimport { ITokenCache } from \"./ITokenCache\";\nimport { BrowserAuthError } from \"../error/BrowserAuthError\";\n\nexport type LoadTokenOptions = {\n clientInfo?: string,\n extendedExpiresOn?: number\n};\n\n/**\n * Token cache manager\n */\nexport class TokenCache implements ITokenCache {\n // Flag to indicate if in browser environment\n public isBrowserEnvironment: boolean;\n // Input configuration by developer/user\n protected config: BrowserConfiguration;\n // Browser cache storage\n private storage: BrowserCacheManager;\n // Logger\n private logger: Logger;\n // Crypto class\n private cryptoObj: ICrypto;\n\n constructor(configuration: BrowserConfiguration, storage: BrowserCacheManager, logger: Logger, cryptoObj: ICrypto) {\n this.isBrowserEnvironment = typeof window !== \"undefined\";\n this.config = configuration;\n this.storage = storage;\n this.logger = logger;\n this.cryptoObj = cryptoObj;\n }\n \n // Move getAllAccounts here and cache utility APIs\n\n /**\n * API to load tokens to msal-browser cache. \n * @param request \n * @param response\n * @param options\n */\n loadExternalTokens(request: SilentRequest, response: ExternalTokenResponse, options: LoadTokenOptions): void {\n this.logger.info(\"TokenCache - loadExternalTokens called\");\n\n if (!response.id_token) {\n throw BrowserAuthError.createUnableToLoadTokenError(\"Please ensure server response includes id token.\");\n }\n\n if (request.account) {\n this.loadIdToken(response.id_token, request.account.homeAccountId, request.account.environment, request.account.tenantId, options);\n this.loadAccessToken(request, response, request.account.homeAccountId, request.account.environment, request.account.tenantId, options);\n } else if (request.authority) {\n\n const authorityOptions: AuthorityOptions = {\n protocolMode: this.config.auth.protocolMode,\n knownAuthorities: this.config.auth.knownAuthorities,\n cloudDiscoveryMetadata: this.config.auth.cloudDiscoveryMetadata,\n authorityMetadata: this.config.auth.authorityMetadata\n };\n const authority = new Authority(request.authority, this.config.system.networkClient, this.storage, authorityOptions);\n\n // \"clientInfo\" from options takes precedence over \"clientInfo\" in response\n if (options.clientInfo) {\n this.logger.trace(\"TokenCache - homeAccountId from options\");\n this.loadIdToken(response.id_token, options.clientInfo, authority.hostnameAndPort, authority.tenant, options);\n this.loadAccessToken(request, response, options.clientInfo, authority.hostnameAndPort, authority.tenant, options);\n } else if (response.client_info) {\n this.logger.trace(\"TokenCache - homeAccountId from response\");\n this.loadIdToken(response.id_token, response.client_info, authority.hostnameAndPort, authority.tenant, options);\n this.loadAccessToken(request, response, response.client_info, authority.hostnameAndPort, authority.tenant, options);\n } else {\n throw BrowserAuthError.createUnableToLoadTokenError(\"Please provide clientInfo in the response or options.\");\n }\n } else {\n throw BrowserAuthError.createUnableToLoadTokenError(\"Please provide a request with an account or a request with authority.\");\n }\n }\n\n /**\n * Helper function to load id tokens to msal-browser cache\n * @param idToken \n * @param homeAccountId \n * @param environment \n * @param tenantId \n * @param options \n */\n private loadIdToken(idToken: string, homeAccountId: string, environment: string, tenantId: string, options: LoadTokenOptions): void {\n\n const idTokenEntity = IdTokenEntity.createIdTokenEntity(homeAccountId, environment, idToken, this.config.auth.clientId, tenantId);\n const idAuthToken = new AuthToken(idToken, this.cryptoObj);\n const accountEntity = options.clientInfo ?\n AccountEntity.createAccount(options.clientInfo, homeAccountId, idAuthToken, undefined, undefined, undefined, undefined, environment) :\n AccountEntity.createGenericAccount(homeAccountId, idAuthToken, undefined, undefined, undefined, undefined, environment);\n\n if (this.isBrowserEnvironment) {\n this.logger.verbose(\"TokenCache - loading id token\");\n this.storage.setAccount(accountEntity);\n this.storage.setIdTokenCredential(idTokenEntity);\n } else {\n throw BrowserAuthError.createUnableToLoadTokenError(\"loadExternalTokens is designed to work in browser environments only.\");\n }\n }\n\n /**\n * Helper function to load access tokens to msal-browser cache\n * @param request \n * @param response \n * @param options \n * @param homeAccountId \n * @param environment \n * @param tenantId \n * @returns \n */\n private loadAccessToken(request: SilentRequest, response: ExternalTokenResponse, homeAccountId: string, environment: string, tenantId: string, options: LoadTokenOptions): void {\n\n if (!response.access_token) {\n this.logger.verbose(\"TokenCache - No access token provided for caching\");\n return;\n }\n\n if (!response.expires_in) {\n throw BrowserAuthError.createUnableToLoadTokenError(\"Please ensure server response includes expires_in value.\");\n }\n\n if (!options.extendedExpiresOn) {\n throw BrowserAuthError.createUnableToLoadTokenError(\"Please provide an extendedExpiresOn value in the options.\");\n }\n \n const scopes = new ScopeSet(request.scopes).printScopes();\n const expiresOn = response.expires_in;\n const extendedExpiresOn = options.extendedExpiresOn;\n\n const accessTokenEntity = AccessTokenEntity.createAccessTokenEntity(homeAccountId, environment, response.access_token, this.config.auth.clientId, tenantId, scopes, expiresOn, extendedExpiresOn, this.cryptoObj);\n\n if (this.isBrowserEnvironment) {\n this.logger.verbose(\"TokenCache - loading access token\");\n this.storage.setAccessTokenCredential(accessTokenEntity);\n } else {\n throw BrowserAuthError.createUnableToLoadTokenError(\"loadExternalTokens is designed to work in browser environments only.\");\n }\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- /*! @azure/msal-browser v2.16.1 2021-08-02 */
1
+ /*! @azure/msal-browser v2.20.0 2021-12-07 */
2
2
  'use strict';
3
3
  import { __assign } from '../_virtual/_tslib.js';
4
4
  import { DEFAULT_SYSTEM_OPTIONS, StubbedNetworkModule, Constants, ProtocolMode, LogLevel } from '@azure/msal-common';