{"version":3,"sources":["https://lively-kernel.org/lively4/swd21-croquet/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","getItem","toString","setLivelyContentForURL","source","setItem","loadLivelyContentForURL","target","div","createElement","innerHTML","topLevel","Array","from","querySelectorAll","objs","childNodes","zIndexMap","Map","forEach","ea","set","zIndex","map","classList","contains","ele","remove","appendChild","lively","components","loadUnresolved","sleep","then","get","initLivelyObject","findLively4Script","livelyLoad","deserializeFromObjectIfNeeded","e","showError","storeLivelyContentForURL","isPersisting","html","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  getLivelyContentForURL(url) {\n    url = url || this.defaultURL()   \n    return focalStorage.getItem(this.urlToKey(url.toString()))\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"]}