{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-markus/src/client/persistence.js"],"names":["preferences","focalStorage","debounce","scriptManager","Connection","moment","ViewNav","isCurrentlyCloning","sessionStorage","Persistence","constructor","saveDelay","saveLivelyContent","showMutationIndicator","style","backgroundColor","backupStep","running","lively","persistence","current","ensureLivelyContentBackups","setTimeout","window","lively4persistence","obj","enable","disable","start","stop","observeHTMLChanges","list","backupIntervals","reverse","i","ea","previous","ensureLivelyContentBackup","undefined","mutationObserver","disconnect","urlToKey","urlString","replace","defaultTarget","document","body","defaultURL","location","protocol","hostname","pathname","getLivelyContentForURL","url","content","getItem","toString","elementSource","files","loadFile","lively4url","html","parseHTML","innerHTML","e","error","setLivelyContentForURL","source","setItem","loadLivelyContentForURL","target","loadLivelyContent","div","createElement","topLevel","Array","from","querySelectorAll","objs","childNodes","zIndexMap","Map","forEach","set","zIndex","map","classList","contains","ele","remove","appendChild","components","loadUnresolved","sleep","then","get","initLivelyObject","findLively4Script","livelyLoad","deserializeFromObjectIfNeeded","showError","interval","previousInterval","force","key","datePrefix","sourcePrefix","dateFormat","dateString","lastBackupDate","Number","isNaN","warn","today","diff","minutesForBackupInterval","backupDate","format","previousBackupKey","loadLivelyContentBackup","notify","storeLivelyContentForURL","isPersisting","getGlobalSource","lastSaved","Date","now","self","__gs_sources__","saveOpenWindows","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","Error","restoreBackupContextMenuItems","result","push","restoreBackupContextMenuItem","time","s","label","evt","scrollPane","ui","contents","length","win","setGlobalPosition","getPosition"],"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'\nimport moment from 'src/external/moment.js'\nimport ViewNav from 'src/client/viewnav.js'\n\nexport function isCurrentlyCloning() {\n    return sessionStorage[\"lively.persistenceCurrentlyCloning\"] === 'true';\n}\n\n\nexport default class Persistence {\n  \n  \n  \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  backupStep() {\n    if (this.running && lively.persistence.current === this) {\n      this.ensureLivelyContentBackups()\n      setTimeout(() => this.backupStep(), 60 * 1000)\n    } else {\n      // stop silently\n    }\n    \n  }\n  \n  \n  // work around non static 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() // #TODO this only works with one module... and breaks when we have many....\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.running = true\n    this.ensureLivelyContentBackups();\n    this.observeHTMLChanges()\n    this.backupStep()\n  }\n \n  ensureLivelyContentBackups() {\n    var list = Persistence.backupIntervals().reverse()\n    for(let i in list) {\n      var ea = list[i]\n      var previous = list[i + 1]\n      this.ensureLivelyContentBackup(undefined, ea, previous)      \n    }\n  }\n\n  stop() {\n    if (this.mutationObserver) this.mutationObserver.disconnect()\n    this.running = false\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    return this.loadLivelyContent(source, target)\n  }\n  \n  async loadLivelyContent(source, target) {\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  \n  \n  async ensureLivelyContentBackup(url=this.defaultURL(), interval=\"yesterday\", previousInterval, force) {\n    var key = this.urlToKey(url.toString())\n    const datePrefix = `backup_${interval}_date_` \n    const sourcePrefix = `backup_${interval}_source_` \n    const dateFormat = \"YYYY-MM-DD HH:mm:ss\"\n    \n    var dateString = await focalStorage.getItem(datePrefix+ key)  \n    var lastBackupDate = moment(dateString, dateFormat)\n    if (Number.isNaN(0+lastBackupDate)) {\n      lively.warn(\"[backup] Currupt date string\", dateString)\n      dateString = undefined // handle corrupt date string\n    }\n    \n    var today = moment()  \n    // lively.notify(\"minutes since \"  + interval + \" \"  + today + \" \" + lastBackupDate + \" \" + this.minutesForBackupInterval(interval))\n    if (force || !dateString ||  today.diff(lastBackupDate, \"minutes\") > this.minutesForBackupInterval(interval)) {\n      var backupDate =  today.format(dateFormat)\n      var previousBackupKey = key\n      if (previousInterval) {\n        previousBackupKey = `backup_${previousInterval}_source_` + key\n        backupDate =  await focalStorage.getItem(`backup_${previousInterval}_date_` + key) \n        if (!moment(backupDate, dateFormat) ) {\n          backupDate = moment().format(dateFormat) // handle corrupt date string\n        }\n        \n      }\n      var source = await focalStorage.getItem(previousBackupKey) // get current source ... @onsetsu or should we use current world?\n\n      await focalStorage.setItem(datePrefix + key, backupDate)\n      await focalStorage.setItem(sourcePrefix + key, source)\n      // lively.notify(`Ensured ${interval} backup! ` + backupDate)\n    } else {\n      // lively.notify(`Last ${interval} backup is not old enough`)\n    }\n  }\n\n  async loadLivelyContentBackup(url=this.defaultURL(), interval=\"yesterday\", target=this.defaultTarget()) {\n    var key = this.urlToKey(url.toString())\n    const sourcePrefix = `backup_${interval}_source_` \n    var source = await focalStorage.getItem(sourcePrefix + key)    \n    if (source) {\n      this.loadLivelyContent(source, target)\n      lively.notify(`load ${interval} backup!`)\n    } else {\n      lively.notify(`could not load ${interval} backup!`)\n    }\n  }\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    if (self.__gs_sources__) {\n      self.__gs_sources__.saveOpenWindows()\n    }\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  minutesForBackupInterval(interval) {\n    // #TODO refactor... this duplication does not look nice\n    if (interval === \"lastminute\") {\n      return 1\n    }\n    if (interval === \"someminutes\") {\n      return 2\n    }\n    if (interval === \"yesterday\") {\n      return 1 * 24 * 60\n    }\n    if (interval === \"hour\") {\n      return  1 * 60\n    }\n    if (interval === \"twohours\") {\n      return  2 * 60\n    }\n    if (interval === \"week\") {\n      return  7 * 24 * 60\n    }\n    if (interval === \"month\") {\n      return  31 * 7 * 24 * 60\n    }\n    throw new Error(interval + \" not supported\")\n  }\n   \n  static backupIntervals() {\n    return [\"lastminute\", \"someminutes\", \"hour\", \"twohours\", \"yesterday\", \"week\", \"month\"]\n  }\n  \n  static restoreBackupContextMenuItems() {\n    var result = []\n    for(let ea of this.backupIntervals()) {\n      result.push(this.restoreBackupContextMenuItem(ea))\n    }\n    return result\n  }\n  \n  static restoreBackupContextMenuItem(interval) {\n    let time = <span></span>\n    let key = `backup_${interval}_date_` + this.current.urlToKey(this.current.defaultURL())\n    focalStorage.getItem(key).then(s => {\n      time.innerHTML = \"\" + s\n    })\n    var label = <span style=\"\">{time} {interval}</span>\n\n                         \n    return [label, async (evt) => {\n          // #TODO refactor into component so that behavior is persistent\n          var target = <div id=\"contentRoot\"></div>\n          var scrollPane = <div style=\"background-color: gray; position:relative; width:100%; height:100%; overflow:scroll\">{target}</div>\n\n          ViewNav.enable(target)\n          var ui = <div>{scrollPane}\n                <div style=\"position:absolute; top:0px; left:0px\">\n                <button click={() => {\n\n                      var contents = Array.from(target.childNodes)\n                      document.body.innerHTML = \"\"\n                      for(let ea of contents) {\n                        document.body.appendChild(ea)\n                      }\n\n                      lively.notify(\"would restore \" + contents.length + \" elements\" )\n\n                  }}>restore</button>\n                </div></div>\n          var win = await (<lively-window title={\"Restore \" + interval}>{ui}</lively-window>)\n          document.body.appendChild(win)\n          lively.setGlobalPosition(win, lively.getPosition(evt))\n          lively.persistence.current.loadLivelyContentBackup(undefined, interval, target)\n        }\n      ]\n  }\n  \n}\n\n\nif (self.lively) {\n  if (lively.persistence) lively.persistence.disable()\n  lively.persistence = Persistence\n  Persistence.enable()\n}\n\n"]}