Coverage report: /development/source/library/org/datagraph/spocq-shard/src/spocq-server/server-side-event-stream/classes.lisp

KindCoveredAll%
expression288 2.3
branch06 0.0
Key
Not instrumented
Conditionalized out
Executed
Not executed
 
Both branches taken
One branch taken
Neither branch taken
1
 ;;; -*- Mode: lisp; Syntax: ansi-common-lisp; Base: 10; Package: org.datagraph.spocq.implementation; -*-
2
 
3
 (in-package :spocq.si)
4
 
5
 (defclass event-stream (SB-GRAY:FUNDAMENTAL-STREAM)
6
   ((stream :initarg :stream
7
            :reader event-stream-stream)
8
    (eol :initform t :accessor event-stream-eol)))
9
 
10
 (defmethod stream-fresh-line ((stream event-stream))
11
   (setf (event-stream-eol stream) nil)
12
   (stream-fresh-line (event-stream-stream stream)))
13
 
14
 (defmethod stream-terpri ((stream event-stream))
15
   (stream-write-char stream #\newline))
16
 
17
 (defmethod stream-write-header ((stream event-stream) name value)
18
   (unless (event-stream-eol stream)
19
     (stream-write-char stream #\newline))
20
   (format (event-stream-stream stream) "~a: ~a~c~c"
21
           name value #\return #\linefeed)
22
   (setf (event-stream-eol stream) #\linefeed))
23
 
24
 (defmethod stream-write-string ((stream event-stream) string  &optional (start 0) (end nil))
25
   (loop with stream-stream = (event-stream-stream stream)
26
     with limit = (or end (length string))
27
     for i from 0 below limit
28
     for char across string
29
     when (>= i start)
30
     do (case char
31
          ((#\return #\linefeed) (stream-write-char stream char))
32
          (t (stream-write-char stream-stream char)))))
33
 
34
 (defmethod stream-write-char ((stream event-stream) char)
35
   ;; nt true
36
   (stream-write-byte stream (char-code char)))
37
 
38
 (defmethod stream-write-byte ((stream event-stream) byte)
39
   (when (event-stream-eol stream)
40
     (setf (event-stream-eol stream) nil)
41
     (write-string "data: " (event-stream-stream stream)))
42
   (case (event-stream-eol stream)
43
     (#.(char-code #\linefeed)
44
       (case byte
45
         (#.(char-code #\linefeed)
46
           (stream-fresh-line stream)
47
           (setf (event-stream-eol stream) byte))
48
         (#.(char-code #\return)
49
           (setf (event-stream-eol stream) byte))
50
         (t
51
          (stream-fresh-line stream)
52
          (setf (event-stream-eol stream) nil))))
53
     (#.(char-code #\return)
54
       (case byte
55
         (#.(char-code #\return)
56
           (stream-fresh-line stream)
57
           (setf (event-stream-eol stream) byte))
58
         (#.(char-code #\linefeed)
59
           (setf (event-stream-eol stream) byte))
60
         (t
61
          (stream-fresh-line stream)
62
          (setf (event-stream-eol stream) nil))))
63
     (t
64
      (case byte
65
         ((#.(char-code #\return) #.(char-code #\linefeed))
66
           (setf (event-stream-eol stream) byte)))))
67
   (stream-write-byte (event-stream-stream stream) byte))
68
 
69
 (defun call-with-event-stream (function base-stream)
70
   (let ((event-stream (make-instance 'event-stream :stream base-stream)))
71
     (funcall function event-stream)))
72
 
73
 (defmacro with-event-stream ((stream base-stream) &body body)
74
   `(flet ((event-stream-function (,stream) ,@body))
75
      (call-with-event-stream #'event-stream-function ,base-stream)))
76
 
77
 
78
 
79
 
80
 
81
 
82