549e41a92839

More work from streaming
[view raw] [browse files]
author Steve Losh <steve@stevelosh.com>
date Wed, 16 Sep 2015 20:46:36 +0000
parents 81c5342870b6
children 090434678b84
branches/tags (none)
files nrepl.lisp sender.py

Changes

--- a/nrepl.lisp	Wed Sep 16 18:37:10 2015 +0000
+++ b/nrepl.lisp	Wed Sep 16 20:46:36 2015 +0000
@@ -51,6 +51,7 @@
   "Fire up a server thread that will listen for connections."
   (format t "Starting server...~%")
   (let ((socket (usocket:socket-listen address port :reuse-address t)))
+    (build-handler)
     (setf *server-thread*
           (bt:make-thread
             (lambda ()
@@ -91,6 +92,7 @@
 
 (defun wrap-time (h)
   (lambda (message)
+    (format t "In wrap-time...~%")
     (handle-op
       message "time?" h
       (respond message (make-hash "status" "done"
@@ -98,6 +100,7 @@
 
 (defun wrap-eval (h)
   (lambda (message)
+    (format t "In wrap-eval...~%")
     (handle-op
       message "eval" h
       (let ((code (gethash "code" message)))
@@ -105,12 +108,20 @@
                  (make-hash "status" "done"
                             "result" (eval (read-from-string code))))))))
 
-(defparameter *handler*
-  (wrap-eval (wrap-time #'handle-base)))
+(defparameter *middleware*
+  (list
+    #'wrap-eval
+    #'wrap-time))
+
+(defun build-handler (base middleware)
+  (if middleware
+    (funcall (car middleware)
+             (build-handler base (cdr middleware)))
+    base))
 
 (defun handle (message)
   (format t "Handling message:~%~A~%~%" message)
-  (funcall *handler* message))
+  (funcall (build-handler #'handle-base *middleware*) message))
 
 (defun handle-message ()
   (let ((message (read-object)))
@@ -125,3 +136,26 @@
 ; (connect)
 ; (handle-message)
 ; (start-server "localhost" 8675)
+; (stop-server)
+
+; > (first (list 1 2))
+; Message:
+; 'd2:ns4:user7:session36:37b0fdb1-5d6d-4646-aa68-22af41e172bb5:value1:1e'
+; {'ns': 'user', 'session': '37b0fdb1-5d6d-4646-aa68-22af41e172bb', 'value': '1'}
+; >
+; Message:
+; 'd7:session36:37b0fdb1-5d6d-4646-aa68-22af41e172bb6:statusl4:doneee'
+; {'session': '37b0fdb1-5d6d-4646-aa68-22af41e172bb', 'status': ['done']}
+
+; TODO
+; * Implement middleware metadata
+; * Implement middleware linearization
+; * Implement sessions
+; * Implement Fireplace workarounds
+;
+;   * Look for what ops fireplace needs
+;   * Look into how fireplace handles clojure namespaces
+;   * Implement a minimal amount of fireplace ops (eval, reload, doc)
+;   * Implement a minimal amount of fireplace workarounds
+;
+; * Implement other nrepl default ops
--- a/sender.py	Wed Sep 16 18:37:10 2015 +0000
+++ b/sender.py	Wed Sep 16 20:46:36 2015 +0000
@@ -1,10 +1,15 @@
 from __future__ import print_function
 import bencode
 import socket
+import pprint
+import sys
 
 
 ADDRESS = '127.0.0.1'
-PORT = 8675
+PORT = int(sys.argv[1])
+
+def build_eval(data):
+    return {"op": "eval", "code": data.strip()}
 
 def repl():
     sock = socket.socket()
@@ -14,12 +19,18 @@
     while True:
         data = raw_input("> ")
         if data.strip():
-            sock.send(bencode.bencode(eval(data)))
+            if data.startswith('\\'):
+                sock.send(bencode.bencode(eval(data[1:])))
+            else:
+                sock.send(bencode.bencode(build_eval(data)))
 
         try:
             incoming = sock.recv(4096)
             if incoming:
-                print(bencode.bdecode(incoming))
+                print("Message:")
+                print(repr(incoming))
+                pprint.pprint(bencode.bdecode(incoming))
+                print()
         except socket.timeout:
             pass