(define (read/write-socket socket request-id type . args) (if type (let ((messages (read-socket socket request-id))) (write-socket socket request-id type args) messages) (begin (thread-wait-for-i/o! (socket-fileno socket) #:input) (read-socket socket request-id)))) (define (write-socket socket request-id type args) (define (write-record header content) (assert (blob? content)) (let ((size (blob-size content))) (let loop ((start 0)) (let ((end (+ start (min (- size start) 65535)))) (send-packet socket header content start end) ;(printf "Wrote ~a record of ~a bytes\n" type (- end start)) (if (< end size) (loop end)))))) (let* ((header (make-header type request-id)) (encoder (get-ws->app type)) (content (if (eqv? (car args) 'close-stream) (make-blob 0) (apply encoder args)))) (cond ((list? content) (map (cut write-record header <>) content)) (else (write-record header content))))) ;(define (read-socket socket request-id) ; (let loop ((messages '())) ; (if (socket-receive-ready? socket) ; (receive (type req-id content) (recv-packet socket) ; (pp (conc ":" content)) ; (assert (= request-id req-id)) ; (let* ((decoder (get-app->ws type)) ; (content (decoder content)) ; (msg (or (alist-ref type messages) '()))) ; (loop (alist-update! type (cons content msg) messages)))) ; (map (lambda (msg) ; (cons (car msg) (reverse (cdr msg)))) ; messages)))) (define (read-socket socket request-id) (if (socket-receive-ready? socket) (receive (type req-id content) (recv-packet socket) (assert (= request-id req-id)) (let* ((decoder (get-app->ws type)) (content (decoder content))) (alist-update! type (list content) '()))) '()))