{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-xray/src/client/persistence.js"],"names":["preferences","focalStorage","debounce","scriptManager","Connection","isCurrentlyCloning","sessionStorage","Persistence","constructor","saveDelay","saveLivelyContent","showMutationIndicator","style","backgroundColor","current","window","lively4persistence","obj","enable","disable","start","stop","observeHTMLChanges","mutationObserver","disconnect","urlToKey","urlString","replace","defaultTarget","document","body","defaultURL","location","protocol","hostname","pathname","getLivelyContentForURL","url","content","getItem","toString","elementSource","lively","files","loadFile","lively4url","html","parseHTML","innerHTML","e","error","setLivelyContentForURL","source","setItem","loadLivelyContentForURL","target","div","createElement","topLevel","Array","from","querySelectorAll","objs","childNodes","zIndexMap","Map","forEach","ea","set","zIndex","map","classList","contains","ele","remove","appendChild","components","loadUnresolved","sleep","then","get","initLivelyObject","findLively4Script","livelyLoad","deserializeFromObjectIfNeeded","showError","storeLivelyContentForURL","isPersisting","getGlobalSource","setTimeout","lastSaved","Date","now","hasDoNotPersistTag","node","donotperist","attributes","hasOwnProperty","parentElement","isBlacklisted","mutation","tagName","id","getAttribute","indicator","querySelector","position","right","top","width","height","pointerEvents","onMutation","mutations","observer","filter","record","MutationObserver","observe","childList","subtree","characterData"],"mappings":"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","file":"persistence.js","sourcesContent":["import preferences from './preferences.js';\nimport focalStorage from 'src/external/focalStorage.js'\nimport {debounce} from \"utils\"\nimport scriptManager from  \"src/client/script-manager.js\";\nimport Connection from 'src/components/halo/Connection.js'\n\nexport function isCurrentlyCloning() {\n    return sessionStorage[\"lively.persistenceCurrentlyCloning\"] === 'true';\n}\n\n\nexport default class Persistence {\n  \n  constructor() {\n    this.saveDelay = (() => {\n        this.saveLivelyContent();\n        this.showMutationIndicator().style.backgroundColor = \"rgba(10,10,10,0.3)\"\n    })::debounce(3000) // save the world 3seconds after a change\n  }\n\n  // work around non stavle module global state\n  static get current() {\n    if (!window.lively4persistence) {\n      window.lively4persistence = new Persistence()\n    }\n    return window.lively4persistence\n  }\n  static set current(obj) {\n    window.lively4persistence = obj\n  }\n\n  static enable() {\n    this.disable()\n    this.current = new Persistence()\n    this.current.start()\n  }\n  \n  static disable() {\n    if (this.current) {\n      this.current.stop()\n    }\n  }\n  \n  start() {\n    this.observeHTMLChanges()\n  }\n  \n  stop() {\n    if (this.mutationObserver) this.mutationObserver.disconnect()\n  }\n  \n  urlToKey(urlString) {\n    urlString = \"\" + urlString\n    return \"livelyWindows_\"+urlString.replace(/^https?:\\/\\//,\"\").replace(/[^A-Za-z0-9]/,\"_\")\n  }\n\n  defaultTarget() {\n    return document.body\n  }\n\n  defaultURL() {\n    return (document.location.protocol + \"//\" + document.location.hostname + document.location.pathname) \n  }\n\n  async getLivelyContentForURL(url) {\n    url = url || this.defaultURL()   \n    var content = await focalStorage.getItem(this.urlToKey(url.toString()))\n    if (!content) {\n      try {\n        var elementSource = await lively.files.loadFile(lively4url + \"/src/parts/initial-content.html\")\n        content = lively.html.parseHTML(elementSource)[0].innerHTML\n      } catch(e) {\n        lively.error(\"Could not load default desktop conent for lively\", e)\n      }\n    }\n    return content\n  }\n  \n  \n  setLivelyContentForURL(url, source) {\n    url = url || this.defaultURL()   \n    return focalStorage.setItem(this.urlToKey(url.toString()), source)\n  }\n\n  async loadLivelyContentForURL(url, target) {\n    var source = await this.getLivelyContentForURL(url) \n    target = target || this.defaultTarget()\n    var div = document.createElement(\"div\")\n    div.innerHTML = source\n    var topLevel = Array.from(div.querySelectorAll(\":scope > *\"))\n    var objs = Array.from(div.childNodes)\n    \n    // somehow zIndex gets lost...\n    var zIndexMap = new Map()\n    topLevel.forEach(ea => {\n       zIndexMap.set(ea, ea.style.zIndex)\n    })\n    \n    objs.map(ea => {\n      if(ea.classList && ea.classList.contains('lively-preferences')) {\n        target.querySelectorAll('div.lively-preferences').forEach(ele => ele.remove());\n      }\n      target.appendChild(ea);\n    });\n    await lively.components.loadUnresolved(target, true, \"loadLivelyContentForURL\", true)\n    \n    // restore zIndex in an Async way... it seems focus is responsible for it #Hack\n    lively.sleep(0).then(() => {\n      topLevel.forEach(ea => {\n        ea.style.zIndex = zIndexMap.get(ea)\n      })\n    })\n    \n    objs.map(ea => { Persistence.initLivelyObject(ea)})\n    return \n  }\n  \n  static initLivelyObject(obj) {\n    if (!obj) return;\n    try {\n      scriptManager.findLively4Script(obj, false);\n      if (obj.livelyLoad) obj.livelyLoad()\n      Connection.deserializeFromObjectIfNeeded(obj)\n      if (!obj.querySelectorAll) return;\n      obj.querySelectorAll(\"*\").forEach(ea => {\n        if (ea.livelyLoad) ea.livelyLoad()\n        Connection.deserializeFromObjectIfNeeded(ea)\n      })       \n    } catch(e) {\n      lively.showError(e)\n    }\n  }\n\n  async storeLivelyContentForURL(url, target) {\n    target = target || this.defaultTarget()\n    this.isPersisting = true\n    var source = lively.html.getGlobalSource(target)\n    this.setLivelyContentForURL(url, source)\n    setTimeout(() => {\n      this.isPersisting = false\n    }, 0) // the mutation events triggered are still pending here...\n    return source\n  }\n  \n  async saveLivelyContent() {\n    // console.log(\"[peristence] save after \" + \n    //   (Date.now() - this.lastSaved) +\"ms\")\n    this.lastSaved = Date.now()   \n    await this.storeLivelyContentForURL()\n    // console.log(\"[peristence] saved lively content into focalStorage \" + \n    //   (Date.now() - this.lastSaved) +\"ms\")\n  }\n  \n  \n  hasDoNotPersistTag(node,) {\n    var donotperist =  node.attributes && \n      node.attributes.hasOwnProperty('data-lively4-donotpersist');\n    if (donotperist) return true\n    if (!node.parentElement) return false\n    return this.hasDoNotPersistTag(node.parentElement)\n  }\n  \n  isBlacklisted(mutation) {\n    if (mutation.target.tagName == \"BODY\") return true\n    if (mutation.target.tagName == \"LIVELY-MENU\") return true\n    if (mutation.target.tagName == \"LIVELY-SELECTION\") return true\n    if (mutation.target.tagName == \"LIVELY-HAND\") return true\n    if (mutation.target.tagName == \"LIVELY-HALO\") return true\n    if (mutation.target.tagName == \"LIVELY-NOTIFICATION-LIST\") return true\n    if (mutation.target.id == \"mutationIndicator\") return true\n    if (mutation.target.getAttribute && mutation.target.getAttribute(\"data-is-meta\")) return true\n    if (this.hasDoNotPersistTag(mutation.target)) return true\n    return false\n  }\n  \n  showMutationIndicator() {\n    var indicator = document.body.querySelector(\"#mutationIndicator\")\n    if (!indicator)  {\n      var div = document.createElement(\"div\")\n      div.id = \"mutationIndicator\"\n      document.body.appendChild(div)\n      div.style.position = \"fixed\"\n      div.style.right = \"0px\"\n      div.style.top = \"0px\"\n      div.style.width = \"10px\"\n      div.style.height = \"10px\"\n      div.style.backgroundColor = \"blue\"\n      div.style.pointerEvents = \"none\"\n      div.style.zIndex = 2000\n      \n      indicator = div\n    }\n    return indicator\n  }\n  \n  \n  onMutation(mutations, observer) {\n    if (this.isPersisting) {\n      // console.log(\"ignore mutation \", mutations)\n      return // we mutate while persisting \n    }\n    \n    mutations.filter(ea => !this.isBlacklisted(ea)).forEach(record => {\n      this.showMutationIndicator().style.backgroundColor = \"rgba(200,0,0,0.5)\"\n      this.saveDelay()\n    })  \n  }\n  \n  observeHTMLChanges(target) {\n    target = target || this.defaultTarget()\n    if (this.mutationObserver) this.mutationObserver.disconnect()\n    this.mutationObserver = new MutationObserver((mutations, observer) => {\n        this.onMutation(mutations, observer)\n    });\n    this.mutationObserver.observe(target, {\n      childList: true, \n      subtree: true, \n      characterData: true, \n      attributes: true});\n  }\n  \n  \n  \n  \n}\n"]}