{"version":3,"sources":["https://lively-kernel.org/lively4S2/lively4-markus/src/components/tools/lively-services.js"],"names":["Morph","pt","mountURL","mountEndpoint","isLocalHost","document","location","hostname","indexOf","localBaseURL","remoteBaseURL","servicesRootURL","servicesURL","Services","initialize","windowTitle","pid","logType","services","serviceTop","getSubmorph","entryPoint","serviceList","addEventListener","evt","itemClick","addButton","addButtonClick","bind","removeButton","removeButtonClick","editButton","editButtonClick","cloneButton","cloneButtonClick","settingsButton","settingsButtonClick","startButton","startButtonClick","stopButton","stopButtonClick","debugButton","debugButtonClick","stdoutButton","stderrButton","stdoutButtonClick","stderrButtonClick","logEditor","refreshServiceList","refreshInterval","window","setInterval","logInterval","detachedCallback","unload","clearInterval","unselectAll","item","composedPath","find","ea","localName","classList","add","target","getAttribute","showService","lively","openComponentInWindow","then","browser","path","setGlobalPosition","parentElement","getGlobalPosition","addPt","setMainAction","url","relativePath","toString","replace","removeAttribute","value","focus","onCloseButtonClicked","console","log","post","id","res","openBrowser","comp","serverURL","userInput","prompt","mountRemoteServices","data","component","debuggerPort","debugPort","setURL","remove","refreshLog","endpoint","success","fetch","method","body","JSON","stringify","headers","resp","status","respData","json","handleAjaxError","jqXHR","textStatus","errorThrown","removeAllItems","showMessageInServiceList","children","i","length","selectedPID","firstChild","contains","removeChild","listServices","Object","keys","now","Date","getTime","service","create","setAttribute","title","innerHTML","statusText","since","kill","msToString","uptime","start","appendChild","msg","createElement","milliseconds","ending","number","seconds","Math","floor","years","days","hours","minutes","ensureRemoteServicesMounted","r","mounts","mounted","forEach","mount"],"mappings":"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","file":"lively-services.js","sourcesContent":["import Morph from 'src/components/widgets/lively-morph.js';\nimport { pt } from 'src/client/graphics.js';\n\nconst mountURL = 'https://lively4/sys/fs/mount';\nconst mountEndpoint = '/services';\nconst isLocalHost = document.location.hostname.indexOf('localhost') > -1;\nconst localBaseURL = 'http://localhost:9007/';\nconst remoteBaseURL = 'https://lively-kernel.org/lively4services';\nconst servicesRootURL = remoteBaseURL + \"/mount/\"\n\n// 'https://lively-kernel.org/lively4/lively4-services/services';\n\nvar servicesURL = isLocalHost ? localBaseURL : (remoteBaseURL + \"/\");\n\n\nexport default class Services extends Morph {\n\n  initialize() {\n    this.windowTitle = 'Services';\n    this.pid = null;\n    this.logType = 'stdout';\n    this.services = {};\n\n    this.serviceTop = this.getSubmorph('#service-top');\n    this.entryPoint = this.getSubmorph('#entryPoint');\n\n    this.serviceList = this.getSubmorph('.items');\n    this.serviceList.addEventListener('click', evt => {\n      // 'lively-services-item',  \n      this.itemClick(evt)\n    });\n    \n    this.addButton = this.getSubmorph('#addButton');\n    this.addButton.addEventListener('click', this.addButtonClick.bind(this));\n    this.removeButton = this.getSubmorph('#removeButton');\n    this.removeButton.addEventListener('click', this.removeButtonClick.bind(this));\n    this.editButton = this.getSubmorph('#editButton');\n    this.editButton.addEventListener('click', this.editButtonClick.bind(this));\n    this.cloneButton = this.getSubmorph('#cloneButton');\n    this.cloneButton.addEventListener('click', this.cloneButtonClick.bind(this));\n    this.settingsButton = this.getSubmorph('#settingsButton');\n    this.settingsButton.addEventListener('click', this.settingsButtonClick.bind(this));\n    this.startButton = this.getSubmorph('#startButton');\n    this.startButton.addEventListener('click', this.startButtonClick.bind(this));\n    this.stopButton = this.getSubmorph('#stopButton');\n    this.stopButton.addEventListener('click', this.stopButtonClick.bind(this));\n    this.debugButton = this.getSubmorph('#debugButton');\n    this.debugButton.addEventListener('click', this.debugButtonClick.bind(this));\n    this.stdoutButton = this.getSubmorph('#stdoutButton');\n    this.stderrButton = this.getSubmorph('#stderrButton');\n    this.stdoutButton.addEventListener('click', this.stdoutButtonClick.bind(this));\n    this.stderrButton.addEventListener('click', this.stderrButtonClick.bind(this));\n\n    this.logEditor = this.getSubmorph('#log');\n    if (this.logEditor) { // editor is not initialized during testing\n      // this.logEditor.setReadOnly(true);\n    }\n\n    this.refreshServiceList();\n    this.refreshInterval = window.setInterval(() => {\n      this.refreshServiceList();\n    }, 5000);\n    this.logInterval = null;\n\n    this.detachedCallback = this.unload;\n    // if (!this.isInTesting) this.ensureRemoteServicesMounted(); // will block with confirmation\n  }\n\n  unload() {\n    window.clearInterval(this.refreshInterval);\n    window.clearInterval(this.logInterval);\n  }\n\n  /*\n   * Event handlers\n   */\n  itemClick(evt) {\n    this.unselectAll();\n    var item = evt.composedPath().find(ea => ea.localName == 'lively-services-item')\n    item.getSubmorph('.item').classList.add('selected');\n    this.pid = evt.target.getAttribute('data-id');\n    this.showService();\n  }\n\n  addButtonClick(evt) {\n    lively.openComponentInWindow('lively-file-browser').then(browser => {\n      browser.path = servicesURL + 'mount/';\n      lively.setGlobalPosition(browser.parentElement, lively.getGlobalPosition(this.parentElement).addPt(pt(30,\n        30)))\n      browser.setMainAction((url) => {\n        const relativePath = url.toString().replace(servicesURL + 'mount' + '/', '');\n\n        this.serviceTop.removeAttribute('data-id');\n        this.entryPoint.value = relativePath;\n        this.entryPoint.focus();\n        this.logEditor.value = '';\n        this.unselectAll();\n\n        this.startButtonClick(relativePath);\n        browser.parentElement.onCloseButtonClicked();\n      });\n    });\n  }\n\n  removeButtonClick() {\n    if (this.pid === null) {\n      console.log('Nothing to remove');\n      return;\n    }\n    this.post('remove', { id: this.pid }, (res) => {\n      this.pid = null;\n      console.log(res);\n      this.refreshServiceList();\n    });\n  }\n\n  editButtonClick() {\n    lively.openBrowser(servicesURL + 'mount/');\n  }\n\n  cloneButtonClick() {\n    lively.openComponentInWindow(\"lively-sync\").then(comp => {\n      comp.serverURL = servicesURL + 'mount/'\n    });\n    // var gitURL = window.prompt('Please enter a GitHub link to clone:');\n    // if (gitURL === null) return;\n    // this.post('clone', { url: gitURL });\n  }\n\n  settingsButtonClick() {\n    var userInput;\n    userInput = window.prompt('Please enter a URL to a lively4-services instance:', servicesURL);\n    if (userInput === null) return;\n    servicesURL = userInput;\n    this.mountRemoteServices();\n  }\n\n  startButtonClick(entryPoint) {\n    var data;\n    if (this.pid !== null) {\n      data = { id: this.pid };\n    } else {\n      data = { entryPoint: entryPoint || this.entryPoint.value };\n    }\n    this.post('start', data, (res) => {\n      console.log(res);\n      this.pid = res.pid;\n      this.refreshServiceList().then(() => this.showService());\n    });\n  }\n\n  stopButtonClick(evt) {\n    this.post('stop', { id: this.pid }, (res) => {\n      console.log(res);\n      this.refreshServiceList();\n      window.clearInterval(this.logInterval);\n      this.logInterval = null;\n    });\n  }\n\n  debugButtonClick(evt) {\n    lively.openComponentInWindow('lively-iframe').then(component => {\n      if (!(this.pid in this.services)) {\n        console.log('Nothing to debug');\n        return;\n      }\n      var debuggerPort = this.services[this.pid].debugPort;\n      component.setURL(servicesURL + 'debug/?port=' + debuggerPort);\n    });\n  }\n\n  stdoutButtonClick(evt) {\n    this.stdoutButton.classList.add('active');\n    this.stderrButton.classList.remove('active');\n    this.logType = 'stdout';\n    this.refreshLog();\n  }\n\n  stderrButtonClick(evt) {\n    this.stderrButton.classList.add('active');\n    this.stdoutButton.classList.remove('active');\n    this.logType = 'stderr';\n    this.refreshLog();\n  }\n\n  /*\n   * Helper functions\n   */\n  post(endpoint, data, success) {\n    fetch(servicesURL + endpoint, {\n      method: 'POST',\n      body: JSON.stringify(data),\n      headers: {\n        \"content-type\": \"application/json\"\n      }\n    }).then(async (resp) => {\n      if (resp.status == 200) {\n        var respData = await resp.json()\n        console.log(\"services data \" + respData);\n        if (success) {\n          success(respData);\n        }\n      } else {\n        this.handleAjaxError(resp)\n      }\n    })\n  }\n\n  handleAjaxError(jqXHR, textStatus, errorThrown) {\n    console.log(errorThrown);\n    this.removeAllItems();\n    this.showMessageInServiceList('Cannot connect to server.');\n  }\n\n  unselectAll() {\n    var children = this.serviceList.children;\n    for (var i = 0; i < children.length - 1; i++) {\n      children[i].getSubmorph('.item').classList.remove('selected');\n    }\n    this.pid = null;\n  }\n\n  removeAllItems() {\n    var selectedPID = null;\n    while (this.serviceList.firstChild) {\n      var item = this.serviceList.firstChild;\n      if (selectedPID === null && !item.classList.contains('empty') &&\n        item.getSubmorph('.item').classList.contains('selected')) {\n        selectedPID = item.getAttribute('data-id');\n      }\n      this.serviceList.removeChild(this.serviceList.firstChild);\n    }\n    return selectedPID;\n  }\n\n  showService() {\n    this.entryPoint.value = this.services[this.pid].entryPoint;\n    this.refreshLog();\n    if (this.logInterval === null) {\n      this.logInterval = window.setInterval(() => {\n        this.refreshLog();\n      }, 2000);\n    }\n  }\n\n  async listServices(services) {\n    this.services = services;\n    var item;\n    var selectedPID = this.removeAllItems();\n    // Check if any service running\n    if (Object.keys(services).length === 0) {\n      this.showMessageInServiceList('No services available yet.');\n      return;\n    }\n    // List all services\n    var now = new Date().getTime();\n    for (var id in services) {\n      var service = services[id];\n      item = await lively.create('lively-services-item');\n      item.setAttribute('data-id', id);\n      if (id == selectedPID) {\n        item.getSubmorph('.item').classList.add('selected');\n      }\n      var title = service.entryPoint + ' (#' + id + ')';\n      item.getSubmorph('h1').innerHTML = title;\n\n      var status = 'unkown';\n      var statusText = 'unkown';\n      if (service.status === 0) {\n        status = 'not-running';\n        var since = (now - service.kill);\n        statusText = 'not running (' + this.msToString(since) + ')';\n      } else if (service.status === 1) {\n        status = 'running';\n        var uptime = (now - service.start);\n        statusText = 'running (' + this.msToString(uptime) + ')';\n      }\n\n      item.getSubmorph('.status').classList.add(status);\n      item.getSubmorph('small').innerHTML = statusText;\n      this.serviceList.appendChild(item);\n    }\n  }\n\n  showMessageInServiceList(msg) {\n    var item = document.createElement('div');\n    item.classList.add('empty');\n    item.innerHTML = msg;\n    this.serviceList.appendChild(item);\n  }\n\n  msToString(milliseconds) {\n    var ending = (number) => { return (number > 1) ? 's' : ''; };\n    var seconds = Math.floor(milliseconds / 1000);\n    var years = Math.floor(seconds / 31536000);\n    if (years) { return years + ' year' + ending(years); }\n    var days = Math.floor((seconds %= 31536000) / 86400);\n    if (days) { return days + ' day' + ending(days); }\n    var hours = Math.floor((seconds %= 86400) / 3600);\n    if (hours) { return hours + ' hour' + ending(hours); }\n    var minutes = Math.floor((seconds %= 3600) / 60);\n    if (minutes) { return minutes + ' minute' + ending(minutes); }\n    seconds = seconds % 60;\n    if (seconds) { return seconds + ' second' + ending(seconds); }\n    return 'just now';\n  }\n\n  ensureRemoteServicesMounted() {\n    fetch(\"https://lively4/sys/mounts\").then(r => r.json()).then((mounts) => {\n      var mounted = false;\n      mounts.forEach(ea => {\n        if (ea.path === mountEndpoint) {\n          mounted = true;\n        }\n      });\n      if (!mounted) {\n        this.settingsButtonClick();\n      }\n    });\n  }\n\n  mountRemoteServices() {\n    var mount = {\n      'path': mountEndpoint,\n      'name': 'http',\n      'options': {\n        'base': servicesURL + 'mount/'\n      }\n    };\n\n    fetch(mountURL, {\n      method: 'PUT',\n      body: JSON.stringify(mount)\n    }).then(resp => {\n      if (resp.status == 200) {\n        console.log('Mounted ' + mountEndpoint);\n      } else {\n        console.log('Could not mount ' + mountEndpoint + ' ' + resp);\n      }\n    })\n  }\n\n  /*\n   * Refresh functions\n   */\n  refreshServiceList() {\n    return fetch(servicesURL + 'list').then(async resp => {\n      if (resp.status == 200) {\n        this.listServices(await resp.json())\n      } else {\n        this.handleAjaxError(resp)\n      }\n    });\n  }\n\n  refreshLog() {\n    if (this.pid === null) {\n      this.logEditor.value = '';\n      this.entryPoint.value = '';\n      return;\n    }\n    this.post('get', { id: this.pid }, (res) => {\n      this.logEditor.value = res[this.logType];\n      // this.logEditor.gotoPageDown();\n    });\n  }\n}\n"]}