Sketch out some session stuff
author |
Steve Losh <steve@stevelosh.com> |
date |
Tue, 22 Sep 2015 15:39:59 +0000 |
parents |
ce9f7d2c2d6f
|
children |
a601ff5d948b
|
branches/tags |
(none) |
files |
nrepl.lisp |
Changes
--- a/nrepl.lisp Sat Sep 19 13:28:39 2015 +0000
+++ b/nrepl.lisp Tue Sep 22 15:39:59 2015 +0000
@@ -4,6 +4,7 @@
(ql:quickload "usocket")
(ql:quickload "flexi-streams")
(ql:quickload "bordeaux-threads")
+(ql:quickload "uuid")
(require 'sb-introspect)
@@ -54,6 +55,13 @@
(lambda (&rest args)
(apply fn (append curried-args args))))
+(defun random-uuid ()
+ (format nil "~a" (uuid:make-v4-uuid)))
+
+(defun hash-keys (h)
+ (loop for key being the hash-keys of h
+ collect key))
+
;;;; Sockets ------------------------------------------------------------------
(defun get-stream (sock)
@@ -87,9 +95,44 @@
;;; Sessions
-;;; Eval
+(defvar *sessions* (make-hash-table :test #'equal))
+
+(defun create-session! (id)
+ (setf (gethash id *sessions*)
+ (make-hash-table :test #'equal)))
+
+(defun get-session (id)
+ (gethash id *sessions*))
+
+(defun remove-session! (id)
+ (remhash id *sessions*))
+
+(defun get-sessions ()
+ (hash-keys *sessions*))
-;;; Handlers and Middleware
+(defun wrap-session-ls (h)
+ (lambda (message)
+ (handle-op
+ message "ls-sessions" h
+ (respond message
+ (make-hash "status" "done"
+ "session" (get-sessions))))))
+
+(defun wrap-session-close (h)
+ (lambda (message)
+ (handle-op
+ message "close" h
+ (remove-session! (gethash "session" message))
+ (respond message
+ (make-hash "status" "session-closed")))))
+
+
+;;; Eval
+(defclass evaluator ()
+ ((standard-input :initarg :in :reader in)
+ (standard-output :initarg :out :reader out)
+ (standard-error :initarg :err :reader err)))
+
(defun handle-base (message)
(respond message (make-hash "status" "unknown-op")))
@@ -114,11 +157,14 @@
(captured-out (flex:make-in-memory-output-stream))
(captured-err (flex:make-in-memory-output-stream))
(*standard-output*
- (flex:make-flexi-stream captured-out
- :external-format :utf-8))
+ (flex:make-flexi-stream captured-out :external-format :utf-8))
(*error-output*
- (flex:make-flexi-stream captured-err
- :external-format :utf-8)))
+ (flex:make-flexi-stream captured-err :external-format :utf-8))
+ (evaluator (make-instance 'evaluator
+ :in nil
+ :out captured-out
+ :err captured-err)))
+ (declare (ignore evaluator))
(unwind-protect
(progn
(bt:make-thread
@@ -179,6 +225,8 @@
"
(list
+ #'wrap-session-ls
+ #'wrap-session-close
#'wrap-eval
#'wrap-documentation))
@@ -247,6 +295,7 @@
(start-server "localhost" 8675)
(stop-server))
+
; TODO
; * Implement middleware metadata
; * Implement middleware linearization
@@ -269,3 +318,4 @@
(open-stream-p s)
(open-stream-p fs)
(flex:octets-to-string (flex:get-output-stream-sequence s) :external-format :utf-8))
+