{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-drawio/src/client/reactive/utils/caching-fetch.js"],"names":["sha256","str","buffer","TextEncoder","encode","crypto","subtle","digest","then","hash","hex","hexCodes","view","DataView","i","byteLength","value","getUint32","stringValue","toString","padding","paddedValue","slice","length","push","join","CachingFetch","constructor","cache","trace","f","originalFetch","window","fetch","result","undefined","self","request","options","rest","requestCacheKey","hasOwnProperty","promise","updatedAt","cachedRequest","time","Date","getTime","apply","response","Promise","resolve","clone","hasTraced","Object","keys","args","requestToString","input","forEach","attribute","JSON","stringify","body","FormData","formDataAsObject","entry","entries"],"mappings":"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","file":"caching-fetch.js","sourcesContent":["// taken from https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest\nfunction sha256(str) {\n  // We transform the string into an arraybuffer.\n  var buffer = new TextEncoder(\"utf-8\").encode(str);\n  return crypto.subtle.digest(\"SHA-256\", buffer).then(function (hash) {\n    return hex(hash);\n  });\n}\n\nfunction hex(buffer) {\n  var hexCodes = [];\n  var view = new DataView(buffer);\n  for (var i = 0; i < view.byteLength; i += 4) {\n    // Using getUint32 reduces the number of iterations needed (we process 4 bytes each time)\n    var value = view.getUint32(i)\n    // toString(16) will give the hex representation of the number without padding\n    var stringValue = value.toString(16)\n    // We use concatenation and slice for padding\n    var padding = '00000000'\n    var paddedValue = (padding + stringValue).slice(-padding.length)\n    hexCodes.push(paddedValue);\n  }\n\n  // Join all the hex strings into one\n  return hexCodes.join(\"\");\n}\n\nexport default class CachingFetch {\n  constructor() {\n    this.cache = {};\n  }\n\n  trace(f) {\n    let originalFetch = window.fetch;\n    var result = undefined;\n\n    try {\n      let self = this;\n      window.fetch = async function(request, options, ...rest) {\n        return self.requestCacheKey(request, options || {}).then(digest => {\n          if(!self.cache.hasOwnProperty(digest)) {\n            self.cache[digest] = {\n              promise: undefined,\n              updatedAt: 0,\n              request: undefined\n            };\n          }\n          let cachedRequest = self.cache[digest];\n          let time = new Date().getTime();\n          if((time - cachedRequest.updatedAt) > 5000) {\n            cachedRequest.request = request;\n            cachedRequest.updatedAt = time;\n            let promise = originalFetch.apply(window, [request, options, ...rest]).then(response => {\n              cachedRequest.promise = Promise.resolve(response);\n              return response;\n            });\n            if(typeof cachedRequest.promise === 'undefined') {\n              cachedRequest.promise = promise;\n            }\n          }\n\n          return cachedRequest.promise.then(response => response.clone());\n        })\n      };\n      result = f();\n    } finally {\n      window.fetch = originalFetch;\n    }\n\n    return result;\n  }\n\n  hasTraced() {\n    return Object.keys(this.cache).length > 0;\n  }\n\n  requestCacheKey(...args) {\n    return sha256(this.requestToString(...args));\n  }\n\n  requestToString(request, options) {\n    var input = `request:${request}`;\n\n    // For all keys with string values, just add them\n    [\n      'method',\n      'mode',\n      'credentials',\n      'cache',\n      'redirect',\n      'referrer',\n      'referrerPolicy',\n      'integrity',\n      'keepalive'\n    ].forEach(attribute => {\n      let value = options[attribute]\n      if(typeof value !== 'undefined') {\n        input += `\\n${attribute}:${value}`\n      }\n    });\n\n    // Serialize the headers to JSON\n    if(typeof options['headers'] !== 'undefined') {\n      input += `\\nheaders:${JSON.stringify(options['headers'])}`\n    }\n\n    if(typeof options['body'] !== 'undefined') {\n      let body = options['body']\n      if(body instanceof FormData) {\n        // convert FormData to object and serialize to JSON\n        let formDataAsObject = {};\n        for(var entry of body.entries()) {\n          formDataAsObject[entry[0]] = entry[1];\n        }\n        input += `\\nbody:${JSON.stringify(formDataAsObject)}`\n      } else {\n        input += `\\nbody:${body}`\n      }\n    }\n\n    return input;\n  }\n}\n"]}