[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] 114/119: dangerous example; web-socket comint shell buffer
From: |
Eric Schulte |
Subject: |
[elpa] 114/119: dangerous example; web-socket comint shell buffer |
Date: |
Mon, 10 Mar 2014 16:57:57 +0000 |
eschulte pushed a commit to branch master
in repository elpa.
commit c04c1f6265eb949db18473c4240e7dd3358fcfa9
Author: Eric Schulte <address@hidden>
Date: Tue Feb 25 22:56:17 2014 -0700
dangerous example; web-socket comint shell buffer
---
examples/018-web-shell.el | 61 +++++++++++++++++++++++++++++++++++++++++++
examples/018-web-shell.html | 15 ++++++++++
examples/018-web-shell.js | 22 +++++++++++++++
3 files changed, 98 insertions(+), 0 deletions(-)
diff --git a/examples/018-web-shell.el b/examples/018-web-shell.el
new file mode 100644
index 0000000..78814d1
--- /dev/null
+++ b/examples/018-web-shell.el
@@ -0,0 +1,61 @@
+;;; web-shell.el --- interact with a SHELL through a web interface
+
+;; Copyright (C) 2013 Eric Schulte <address@hidden>
+
+;;; Commentary:
+
+;; DO NOT RUN THIS EXAMPLE!
+
+;; At least not if anyone has network access to your computer.
+
+;; This example starts a local shell using the `shell' function. The
+;; resulting comint buffer is then exported using web sockets.
+;; Clients can run local shell commands and see their results through
+;; their browser.
+
+;; This example is included because it should be easily generalizable
+;; to build web interfaces to other comint buffers using web sockets.
+
+;;; Code:
+(defvar web-shell-port 9018)
+
+(defun web-shell-f-to-s (f)
+ (with-temp-buffer
+ (insert-file-contents-literally
+ (expand-file-name f
+ (file-name-directory
+ (or load-file-name buffer-file-name default-directory))))
+ (buffer-string)))
+
+(defvar web-shell-js (web-shell-f-to-s "018-web-shell.js"))
+
+(defvar web-shell-html (web-shell-f-to-s "018-web-shell.html"))
+
+(defvar web-shell-socket nil)
+
+(defun web-shell-socket-respond (string)
+ (when web-shell-socket
+ (process-send-string web-shell-socket (ws-web-socket-frame string))))
+
+(defun web-shell-socket-handler (process string)
+ (message "recieved %S" string)
+ (with-current-buffer "*shell*"
+ (goto-char (process-mark (get-buffer-process (current-buffer))))
+ (insert string)
+ (comint-send-input)))
+
+(defun web-shell-handler (request)
+ (with-slots (process headers) request
+ ;; if a web-socket request
+ (if (ws-web-socket-connect request 'web-shell-socket-handler)
+ ;; then connect and keep open
+ (prog1 :keep-alive
+ (setq web-shell-socket process)
+ (add-hook 'comint-output-filter-functions 'web-shell-socket-respond))
+ ;; otherwise send the html and javascript
+ (save-window-excursion (shell))
+ (ws-response-header process 200 '("Content-type" . "text/html"))
+ (process-send-string process
+ (format web-shell-html (format web-shell-js web-shell-port))))))
+
+(ws-start 'web-shell-handler 9018)
diff --git a/examples/018-web-shell.html b/examples/018-web-shell.html
new file mode 100644
index 0000000..56d5ae5
--- /dev/null
+++ b/examples/018-web-shell.html
@@ -0,0 +1,15 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+ <head>
+ <script type="text/javascript">
+%s
+ </script>
+ </head>
+<body>
+ <pre id="buffer"></pre>
+ <div>
+ <input type="text" id="mini-buffer" value="" />
+ <button onclick="connect();">connect</button>
+ <button onclick="ws.close();">close</button>
+ </div>
+</body>
+</html>
diff --git a/examples/018-web-shell.js b/examples/018-web-shell.js
new file mode 100644
index 0000000..295ff7c
--- /dev/null
+++ b/examples/018-web-shell.js
@@ -0,0 +1,22 @@
+var ws;
+
+function write(data){
+ var before = document.getElementById("buffer").innerHTML;
+ document.getElementById("buffer").innerHTML = before + data;
+ window.scrollTo(0,document.body.scrollHeight); }
+
+function read(){
+ var tmp = document.getElementById("mini-buffer").value;
+ document.getElementById("mini-buffer").value = "";
+ write(tmp + "\n");
+ return tmp; }
+
+function connect(){
+ ws = new WebSocket("ws://localhost:%d/");
+ ws.onopen = function() { write("<p><i>connected</i></p>"); };
+ ws.onmessage = function(msg) { write(msg.data); };
+ ws.onclose = function() { write("<p><i>closed</i></p>"); }; }
+
+window.onload = function(){
+ document.getElementById("mini-buffer").addEventListener(
+ "keyup", function(e){ if(e.keyCode == 13){ ws.send(read()); } }); }
- [elpa] 104/119: tweak notes, (continued)
- [elpa] 104/119: tweak notes, Eric Schulte, 2014/03/10
- [elpa] 108/119: test chunked/gzipped transfer/content encodings, Eric Schulte, 2014/03/10
- [elpa] 100/119: manual application of x-gzip content encoding, Eric Schulte, 2014/03/10
- [elpa] 101/119: manual application of chunked transfer encoding, Eric Schulte, 2014/03/10
- [elpa] 107/119: support for content and transfer encodings, Eric Schulte, 2014/03/10
- [elpa] 109/119: doc for new content/transfer encoding helpers, Eric Schulte, 2014/03/10
- [elpa] 110/119: automatically generate dir file w/install-info, Eric Schulte, 2014/03/10
- [elpa] 113/119: Fix WebSocket varint length encoding, Eric Schulte, 2014/03/10
- [elpa] 117/119: adding .elpaignore to keep extra file from package, Eric Schulte, 2014/03/10
- [elpa] 115/119: gnu elpa wants a "Maintainer:" pseudo-header, Eric Schulte, 2014/03/10
- [elpa] 114/119: dangerous example; web-socket comint shell buffer,
Eric Schulte <=
- [elpa] 105/119: mention `make check' in README, Eric Schulte, 2014/03/10
- [elpa] 116/119: assign copyright to FSF, Eric Schulte, 2014/03/10
- [elpa] 111/119: Emacs packaging support with "make package", Eric Schulte, 2014/03/10
- [elpa] 118/119: README and install instructions mention GNU ELPA, Eric Schulte, 2014/03/10
- [elpa] 112/119: add/use standard source headers, Eric Schulte, 2014/03/10
- [elpa] 119/119: Add 'packages/web-server/' from commit 'd0b6ae9df6014db2195da0081dc97cc8246f1fda', Eric Schulte, 2014/03/10