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)))
|