{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-petrinet/src/components/tools/lively-xterm.js"],"names":["Terminal","ContextMenu","attach","fit","Morph","debounce","LivelyXterm","initialize","windowTitle","setup","force","lively","removeEventListener","addEventListener","evt","onContextMenu","call","onExtentChanged","url","preferences","get","cwd","open","session","newSession","connectSession","lastPointerUp","Date","now","stopPropagation","preventDefault","shiftKey","menu","reconnect","startPython","changeTerminalURL","changeTerminalSecret","changeTerminalCWD","openIn","document","body","defaultValue","newValue","prompt","set","notify","term","focus","getAttribute","s","setAttribute","container","innerHTML","apply","secret","fetch","replace","method","headers","then","r","text","parseInt","warn","baseWebSocketURL","socketURL","socket","WebSocket","parentElement","classList","add","__sendData","livelyMigrate","other","livelyInspect","contentNode","inspector","livelyPrepareSave","livelyExample"],"mappings":"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","file":"lively-xterm.js","sourcesContent":["import Terminal from \"src/external/xterm.js/xterm.js\"\nimport ContextMenu from 'src/client/contextmenu.js';\nimport {attach} from \"src/external/xterm.js/addons/attach.js\"\nimport * as fit from \"src/external/xterm.js/addons/fit.js\"\n\nimport Morph from 'src/components/widgets/lively-morph.js';\n\n/*\n  lively.preferences.set(\"PiTerminalURL\", \"https://lively-kernel.org/boardpi_term/\")\n*/\n\n/* Apache Config for Terminal Proxy (https + wss)\n\n  ProxyPass               /boardpi_term/terminal ws://localhost:8008/terminal\n  ProxyPassReverse        /boardpi_term/terminal ws://localhost:8008/terminal\n  ProxyPass               /boardpi_term http://localhost:8008\n  ProxyPassReverse        /boardpi_term http://localhost:8008\n  <Proxy http://localhost:8008/*>\n          Allow from all\n  </Proxy>\n*/\n\n\nimport {debounce} from \"utils\"\n\nexport default class LivelyXterm extends Morph {\n  async initialize() {\n    this.windowTitle = \"Lively XTerm.js\";\n    \n    this.setup()\n  }\n  \n  async setup(force) {\n    lively.removeEventListener(\"xterm\", this)\n    lively.addEventListener(\"xterm\", this, 'contextmenu',  evt => this.onContextMenu(evt), false);\n    lively.addEventListener(\"xterm\", this, 'extent-changed', debounce.call(evt => { this.onExtentChanged(evt); }, 500));\n    if (!this.url) {\n      this.url = lively.preferences.get(\"PiTerminalURL\")\n    }\n    \n    if (!this.cwd) {\n      this.cwd = lively.preferences.get(\"PiTerminalCWD\")\n    }\n\n    await this.open()\n    if (force || !this.session) {\n      await this.newSession()\n    }\n    await this.connectSession()\n  \n  }\n  \n  \n  onContextMenu(evt) {\n    if (this.lastPointerUp && (Date.now() - this.lastPointerUp < 1000)) {\n      evt.stopPropagation();\n      evt.preventDefault();\n      return; // #HACK custom prevent default....\n    }\n\n    if (!evt.shiftKey) {\n      evt.stopPropagation();\n      evt.preventDefault();\n\n      var menu = new ContextMenu(this, [\n            [\"reconnect\", () => this.reconnect()],\n            [\"python shell\", () => this.startPython()],\n            [\"change terminal url\", () => this.changeTerminalURL()],\n            [\"change terminal key\", () => this.changeTerminalSecret()],\n            [\"change terminal working directory\", () => this.changeTerminalCWD()],\n          ]);\n      menu.openIn(document.body, evt, this);\n      return true;\n    }    \n  }\n  \n  async reconnect() {\n    this.setup(true)\n  }\n\n  async changeTerminalURL() {\n    var defaultValue = lively.preferences.get(\"PiTerminalURL\")\n    var newValue = await lively.prompt(\"set new PiTerminal URL\", defaultValue)\n    if (newValue) {\n      lively.preferences.set(\"PiTerminalURL\", newValue)\n      this.url = newValue\n      lively.notify(\"new termianl url: \" + newValue)\n      \n      await this.setup(true)\n      this.term.focus()\n    }\n  }\n  \n  async changeTerminalSecret() {\n    var defaultValue = lively.preferences.get(\"PiTerminalSecret\")\n    var newValue = await lively.prompt(\"set new PiTerminal Secret\", defaultValue)\n    if (newValue) {\n      lively.preferences.set(\"PiTerminalSecret\", newValue)\n      await this.setup(true)\n      this.term.focus()\n    }\n  }\n  \n  \n  async changeTerminalCWD() {\n    var defaultValue = lively.preferences.get(\"PiTerminalCWD\")\n    var newValue = await lively.prompt(\"set new PiTerminal working directory\", defaultValue)\n    if (newValue) {\n      lively.preferences.set(\"PiTerminalCWD\", newValue)\n      this.cwd = newValue\n      lively.notify(\"new termianl cwd: \" + newValue)\n      \n      await this.setup(true)\n      this.term.focus()\n    }\n  }\n\n  get url() {\n    return this.getAttribute(\"url\")\n  }\n  \n  set url(s) {\n    return this.setAttribute(\"url\", s)\n  }\n\n  get cwd() {\n    return this.getAttribute(\"cwd\")\n  }\n  \n  set cwd(s) {\n    return this.setAttribute(\"cwd\", s)\n  }\n\n  get session() {\n    return this.getAttribute(\"session\")\n  }\n  \n  set session(s) {\n    return this.setAttribute(\"session\", s)\n  }\n  \n  async open() {\n    var container = this.get(\"#container\")\n    container.innerHTML = \"\"\n    this.term = new Terminal();\n    this.term.open(container)\n    \n    fit.apply(Terminal)\n    // Terminal.applyAddon(fit);  // Apply the `fit` addon\n    this.term.fit()\n  }\n\n  async newSession() {\n    var secret  = lively.preferences.get(\"PiTerminalSecret\")\n    \n    var session  = await fetch(`${this.url.replace(/\\/$/,\"\")}/create?cols=88&rows=24`, {\n      method: \"POST\", \n      headers: {\n        secret: secret,\n        cwd: this.cwd,\n      }\n    }).then(r => r.text()) \n    \n    if (parseInt(session) > 0) {\n      this.session = session\n    } else {\n      lively.warn(\"could not get session, because \" + session)\n    }\n    \n  }\n  \n  async connectSession() {\n    var baseWebSocketURL = this.url.replace(/http/,\"ws\")\n    var socketURL = `${baseWebSocketURL.replace(/\\/$/,\"\")}/terminal/${this.session}`\n    this.socket = new WebSocket(socketURL)\n    attach(this.term, this.socket, true)\n  }\n  \n  startPython() {\n    this.parentElement.setAttribute(\"title\", \"Python\")\n    this.classList.add(\"python\")\n    this.term.__sendData(`python\\n`)\n  }\n  \n  \n  livelyMigrate(other) {\n    \n  }\n  \n  livelyInspect(contentNode, inspector) {\n    // do nothing\n  }\n  \n  livelyPrepareSave() {\n    \n  } \n  \n  onExtentChanged() {\n    if (this.term) {\n      this.term.fit()\n    }\n  }\n  \n  async livelyExample() {\n  \n  }\n}"]}