Make easier to use demos, change to boot.js in further prep for long polling as an option

This commit is contained in:
David Botton 2021-01-31 19:58:19 -05:00
parent 18e617648f
commit 5237b518d4
8 changed files with 62 additions and 24 deletions

View file

@ -57,7 +57,7 @@ To load this package and work through tutorials (assuming you
have Quicklisp configured): have Quicklisp configured):
1. Start emacs then M-x slime 1. Start emacs then M-x slime
2. In the REPL, run: 2. In the REPL, run (tutorials current 1 - 18):
``` ```
CL-USER> (ql:quickload :clog) CL-USER> (ql:quickload :clog)
@ -70,11 +70,11 @@ To see where the source files are:
CL-USER> (clog:clog-install-dir) CL-USER> (clog:clog-install-dir)
``` ```
You can the load the demos with: You can the run the demos with (currently 1 or 2):
``` ```
CL-USER> (load "path to clog/demos/01-snake.lisp") CL-USER> (ql:quickload :clog)
CL-USER> (clog-user:start-demo) CL-USER> (clog-user:run-demo 1)
``` ```
To open a browser with the CLOG manual: To open a browser with the CLOG manual:
@ -164,8 +164,8 @@ Tutorial Summary
Demo Summary Demo Summary
- 01-snake-game.lisp - Sparkey the Snake Game - 01-demo.lisp - Sparkey the Snake Game
- 02-chat.lisp - Chat - Private instant messenger - 02-demo.lisp - Chat - Private instant messenger
Enhancements underway: Enhancements underway:

View file

@ -58,25 +58,25 @@ script."
(defvar *verbose-output* nil "Verbose server output (default false)") (defvar *verbose-output* nil "Verbose server output (default false)")
(defvar *app* nil "Clack 'app' middle-ware") (defvar *app* nil "Clack 'app' middle-ware")
(defvar *client-handler* nil "Clack 'handler' for socket traffic") (defvar *client-handler* nil "Clack 'handler' for socket traffic")
(defvar *on-connect-handler* nil "New connection event handler.")
(defvar *new-id* 0 "Last issued connection or script IDs") (defvar *on-connect-handler* nil "New connection event handler.")
(defvar *connections* (make-hash-table) "Connections to IDs") (defvar *connections* (make-hash-table) "Connections to IDs")
(defvar *connection-ids* (make-hash-table) "IDs to connections") (defvar *connection-ids* (make-hash-table) "IDs to connections")
(defvar *connection-data* (make-hash-table) "Connection based data") (defvar *connection-data* (make-hash-table) "Connection based data")
(defvar *connection-lock* (bordeaux-threads:make-lock) (defvar *connection-lock* (bordeaux-threads:make-lock)
"Protect the connection hash tables") "Protect the connection hash tables")
(defvar *queries-lock* (bordeaux-threads:make-lock)
"Protect query hash tables") (defvar *new-id* 0 "Last issued connection or script IDs")
(defvar *id-lock* (bordeaux-threads:make-lock) (defvar *id-lock* (bordeaux-threads:make-lock)
"Protect new-id variable.") "Protect new-id variable.")
(defvar *queries* (make-hash-table) "Query ID to Answers") (defvar *queries* (make-hash-table) "Query ID to Answers")
(defvar *queries-sems* (make-hash-table) "Query ID to semiphores") (defvar *queries-sems* (make-hash-table) "Query ID to semiphores")
(defvar *queries-lock* (bordeaux-threads:make-lock)
"Protect query hash tables")
(defvar *query-time-out* 3 "Number of seconds to timeout waiting for a query") (defvar *query-time-out* 3 "Number of seconds to timeout waiting for a query")
(defvar *url-to-boot-file* (make-hash-table :test 'equalp) "URL to boot-file") (defvar *url-to-boot-file* (make-hash-table :test 'equalp) "URL to boot-file")
@ -87,7 +87,6 @@ script."
(defun generate-id () (defun generate-id ()
"Generate unique ids for use in connections and sripts." "Generate unique ids for use in connections and sripts."
;; needs mutex or atomic
(bordeaux-threads:with-lock-held (*id-lock*) (incf *new-id*))) (bordeaux-threads:with-lock-held (*id-lock*) (incf *new-id*)))
;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;
@ -207,7 +206,12 @@ the default answer. (Private)"
(let ((ws (websocket-driver:make-server env))) (let ((ws (websocket-driver:make-server env)))
(websocket-driver:on :open ws (websocket-driver:on :open ws
(lambda () (lambda ()
(let ((id (getf env :query-string))) (let* ((query (getf env :query-string))
(items (when query
(quri:url-decode-params query)))
(id (when items
(cdr (assoc "r" items
:test #'equalp)))))
(when (typep id 'string) (when (typep id 'string)
(setf id (parse-integer id :junk-allowed t))) (setf id (parse-integer id :junk-allowed t)))
(handle-new-connection ws id)))) (handle-new-connection ws id))))
@ -321,6 +325,8 @@ path by querying the browser. See PATH-NAME (CLOG-LOCATION)."
(defun set-clog-path (path boot-file) (defun set-clog-path (path boot-file)
(if boot-file (if boot-file
(setf (gethash path *url-to-boot-file*) (setf (gethash path *url-to-boot-file*)
;; Make clog-path into a relative path of
;; of site-root.
(if (eql (char boot-file 0) #\/) (if (eql (char boot-file 0) #\/)
(concatenate 'string "." boot-file) (concatenate 'string "." boot-file)
boot-file)) boot-file))

View file

@ -10,7 +10,7 @@
(defpackage #:clog-user (defpackage #:clog-user
(:use #:cl #:clog) (:use #:cl #:clog)
(:export start-tutorial)) (:export start-tutorial start-demo))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Implementation - CLOG Utilities ;; Implementation - CLOG Utilities
@ -41,12 +41,41 @@
(defun run-tutorial (num) (defun run-tutorial (num)
"Run tutorial NUM" "Run tutorial NUM"
(load-tutorial num)
(clog-user:start-tutorial))
;;;;;;;;;;;;;;;;;;;
;; load-tutorial ;;
;;;;;;;;;;;;;;;;;;;
(defun load-tutorial (num)
"Load tutorial NUM - use (clog-user:start-tutorial)"
(let ((p (merge-pathnames (format nil "./tutorial/~2,'0d-tutorial.lisp" num) (let ((p (merge-pathnames (format nil "./tutorial/~2,'0d-tutorial.lisp" num)
(asdf:system-source-directory :clog)))) (asdf:system-source-directory :clog))))
(load p) (load p)
(clog-user:start-tutorial)
(format t "~%~% ---- The tutorial src is located at: ~A~%" p))) (format t "~%~% ---- The tutorial src is located at: ~A~%" p)))
;;;;;;;;;;;;;;
;; run-demo ;;
;;;;;;;;;;;;;;
(defun run-demo (num)
"Run demo NUM"
(load-demo num)
(clog-user:start-demo))
;;;;;;;;;;;;;;;
;; load-demo ;;
;;;;;;;;;;;;;;;
(defun load-demo (num)
"Load demo NUM - use (clog-user:start-demo)"
(let ((p (merge-pathnames (format nil "./demos/~2,'0d-demo.lisp" num)
(asdf:system-source-directory :clog))))
(load p)
(format t "~%~% ---- The demo src is located at: ~A~%" p)))
;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;
;; load-world ;; ;; load-world ;;
;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;

View file

@ -742,6 +742,9 @@ embedded in a native template application.)"
(clog-install-dir function) (clog-install-dir function)
(open-manual function) (open-manual function)
(run-tutorial function) (run-tutorial function)
(load-tutorial function)
(run-demo function)
(load-demo function)
"Functions for Compilation and Documentation" "Functions for Compilation and Documentation"
(load-world function) (load-world function)

View file

@ -15,8 +15,8 @@ To load "clog":
Load the demo: Load the demo:
``` ```
CL-USER> (load "/Users/dbotton/common-lisp/clog/demos/01-hello.lisp") CL-USER> (load "/Users/dbotton/common-lisp/clog/demos/01-demo.lisp")
#P"/Users/dbotton/common-lisp/clog/demos/01-hello.lisp" #P"/Users/dbotton/common-lisp/clog/demos/01-demo.lisp"
``` ```
Start the demo: Start the demo:
@ -34,5 +34,5 @@ Most demos startup a browser, if not use http://127.0.0.1:8080
Demo Summary Demo Summary
- 01-snake-game.lisp - Sparkey the Snake Game - 01-demo.lisp - Sparkey the Snake Game
- 02-chat.lisp - Chat - Private instant messenger - 02-demo.lisp - Chat - Private instant messenger

View file

@ -42,7 +42,7 @@ function Setup_ws() {
ws.onerror = function (event) { ws.onerror = function (event) {
console.log ("onerror: reconnect"); console.log ("onerror: reconnect");
ws = null; ws = null;
ws = new WebSocket (adr + "?" + clog['connection_id']); ws = new WebSocket (adr + "?r=" + clog['connection_id']);
ws.onopen = function (event) { ws.onopen = function (event) {
console.log ("onerror: reconnect successful"); console.log ("onerror: reconnect successful");
Setup_ws(); Setup_ws();
@ -56,7 +56,7 @@ function Setup_ws() {
ws.onclose = function (event) { ws.onclose = function (event) {
console.log ("onclose: reconnect"); console.log ("onclose: reconnect");
ws = null; ws = null;
ws = new WebSocket (adr + "?" + clog['connection_id']); ws = new WebSocket (adr + "?r=" + clog['connection_id']);
ws.onopen = function (event) { ws.onopen = function (event) {
console.log ("onclose: reconnect successful"); console.log ("onclose: reconnect successful");
Setup_ws(); Setup_ws();