git.fiddlerwoaroof.com
raytracing_in_one_weekend/canvas-server.lisp
38ff817c
 (in-package :fwoar.lisp-sandbox.canvas-server)
 
 (defvar *ws-servers* (make-array 10 :fill-pointer 0 :adjustable t))
 (defvar *stopped* ())
 
 (defun send-update (color pos)
   (wsd:send
    (elt *ws-servers* (1- (length *ws-servers*)))
    (with-output-to-string (s)
      (yason:encode (list color
                          pos)
                    s))))
 
 (defparameter *app*
   (lambda (env)
     (cond ((string= "/ws" (getf env :request-uri))
            (let* ((ws (wsd:make-server env))
                   (idx (if *stopped*
                            (setf (aref *ws-servers*
                                        (pop *stopped*))
                                  ws)
                            (vector-push-extend ws *ws-servers*))))
              idx
              (lambda (responder)
                responder
                (wsd:start-connection ws))))
           (t
            (format *trace-output* "~&~s~%" env)
            (list 200 '(:content-type "text/html")
                  (list
                   (spinneret:with-html-string
                     (:html
                      (:body
9c02b840
                       (:canvas#out :width 2000 :height 2000)
38ff817c
                       (:script
                        (ps:ps
                          (let* ((canvas (ps:chain document
                                                   (query-selector "canvas#out")))
                                 (context (ps:chain canvas
                                                    (get-context "2d")))
                                 (i-d (ps:chain context
                                                (create-image-data 1 1)))
1824614e
                                 (ws (ps:new (-web-socket (+ "ws://"
                                                             (ps:@ location host)
c73cb503
                                                             "/ws")))))
38ff817c
                            (ps:chain ws
                                      (add-event-listener
                                       "message"
                                       (lambda (evt)
                                         (let ((data (ps:@ i-d data)))
                                           (destructuring-bind ((r g b)
                                                                (x y))
                                               (ps:chain -j-s-o-n
                                                         (parse (ps:@ evt data)))
                                             (setf (aref data 0) r
                                                   (aref data 1) g
                                                   (aref data 2) b
                                                   (aref data 3) 255)
                                             (ps:chain context
                                                       (put-image-data
                                                        i-d x y))
                                             (values))))))))))))))
            #+qwer
            (lambda )))))
 (defun setup ()
   (lambda (env)
     (funcall *app* env)))