summaryrefslogtreecommitdiffstats
path: root/netwerk/protocol/http/HPKEConfigManager.sys.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'netwerk/protocol/http/HPKEConfigManager.sys.mjs')
-rw-r--r--netwerk/protocol/http/HPKEConfigManager.sys.mjs42
1 files changed, 42 insertions, 0 deletions
diff --git a/netwerk/protocol/http/HPKEConfigManager.sys.mjs b/netwerk/protocol/http/HPKEConfigManager.sys.mjs
new file mode 100644
index 0000000000..b08cc892c5
--- /dev/null
+++ b/netwerk/protocol/http/HPKEConfigManager.sys.mjs
@@ -0,0 +1,42 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+let knownConfigs = new Map();
+
+export class HPKEConfigManager {
+ static async get(aURL, aOptions = {}) {
+ try {
+ let config = await this.#getInternal(aURL, aOptions);
+ return new Uint8Array(config);
+ } catch (ex) {
+ console.error(ex);
+ return null;
+ }
+ }
+
+ static async #getInternal(aURL, aOptions = {}) {
+ let { maxAge = -1 } = aOptions;
+ let knownConfig = knownConfigs.get(aURL);
+ if (
+ knownConfig &&
+ (maxAge < 0 || Date.now() - knownConfig.fetchDate < maxAge)
+ ) {
+ return knownConfig.config;
+ }
+ return this.fetchAndStore(aURL, aOptions);
+ }
+
+ static async fetchAndStore(aURL, aOptions = {}) {
+ let fetchDate = Date.now();
+ let resp = await fetch(aURL, { signal: aOptions.abortSignal });
+ if (!resp?.ok) {
+ throw new Error(
+ `Fetching HPKE config from ${aURL} failed with error ${resp.status}`
+ );
+ }
+ let config = await resp.blob().then(b => b.arrayBuffer());
+ knownConfigs.set(aURL, { config, fetchDate });
+ return config;
+ }
+}