File size: 1,793 Bytes
43203b4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
(in-package :cl-user)
(defpackage clack.socket
  (:use :cl)
  (:export :read-callback
           :close-socket
           :write-sequence-to-socket
           :write-byte-to-socket
           :write-sequence-to-socket-buffer
           :write-byte-to-socket-buffer
           :flush-socket-buffer
           :socket-async-p
           :socket-stream))
(in-package :clack.socket)

;; required
(defgeneric read-callback (socket))

;; required
(defgeneric (setf read-callback) (callback socket))

;; required
(defgeneric close-socket (socket))

;; required.
(defgeneric write-sequence-to-socket (socket data &key callback))

;; optional. fallback to write-sequence-to-socket
(defgeneric write-byte-to-socket (socket byte &key callback)
  (:method (socket byte &key callback)
    (write-sequence-to-socket socket
                              (make-array 1 :element-type '(unsigned-byte 8)
                                            :initial-contents (list byte))
                              :callback callback)))

;; optional. fallback to synchronous version
(defgeneric write-sequence-to-socket-buffer (socket data)
  (:method (socket data)
    (write-sequence-to-socket socket data)))

;; optional. fallback to synchronous version
(defgeneric write-byte-to-socket-buffer (socket byte)
  (:method (socket byte)
    (write-byte-to-socket socket byte)))

;; optional.
(defgeneric flush-socket-buffer (socket &key callback)
  (:method (socket &key callback)
    (write-sequence-to-socket socket
                              #.(make-array 0 :element-type '(unsigned-byte 8))
                              :callback callback)))

;; optional
(defgeneric socket-async-p (socket)
  (:method (socket)
    t))

;; optional
;: required if socket-async-p returns nil
(defgeneric socket-stream (socket))