Class: Async::Redis::Protocol::RESP
- Inherits:
-
IO::Protocol::Line
- Object
- IO::Protocol::Line
- Async::Redis::Protocol::RESP
- Defined in:
- lib/async/redis/protocol/resp.rb
Instance Method Summary collapse
- #closed? ⇒ Boolean
-
#initialize(stream) ⇒ RESP
constructor
A new instance of RESP.
-
#read_object ⇒ Object
(also: #read_response)
def write_lines(*args) puts “write_lines(#argsargs.inspect)” super end.
- #write_object(object) ⇒ Object
-
#write_request(arguments) ⇒ Object
The redis server doesn’t want actual objects (e.g. integers) but only bulk strings.
Constructor Details
Instance Method Details
#closed? ⇒ Boolean
40 41 42 |
# File 'lib/async/redis/protocol/resp.rb', line 40 def closed? @stream.closed? end |
#read_object ⇒ Object Also known as: read_response
def write_lines(*args) puts “write_lines(#Async::Redis::Protocol::RESP.argsargs.inspect)” super end
def read_line result = super puts “read_line #result”
return result end
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
# File 'lib/async/redis/protocol/resp.rb', line 82 def read_object token = @stream.read(1) case token when '$' length = read_line.to_i if length == -1 return nil else buffer = @stream.read(length) # Eat trailing whitespace because length does not include the CRLF: read_line return buffer end when '*' count = read_line.to_i # Null array (https://redis.io/topics/protocol#resp-arrays): return nil if count == -1 array = Array.new(count) {read_object} return array when ':' return read_line.to_i when '-' raise ServerError.new(read_line) when '+' return read_line else @stream.flush raise NotImplementedError, "Implementation for token #{token} missing" end end |
#write_object(object) ⇒ Object
57 58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/async/redis/protocol/resp.rb', line 57 def write_object(object) case object when String write_lines("$#{object.bytesize}", object) when Array write_array(object) when Integer write_lines(":#{object}") else write_object(object.to_redis) end end |
#write_request(arguments) ⇒ Object
The redis server doesn’t want actual objects (e.g. integers) but only bulk strings. So, we inline it for performance.
45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/async/redis/protocol/resp.rb', line 45 def write_request(arguments) write_lines("*#{arguments.count}") arguments.each do |argument| string = argument.to_s write_lines("$#{string.bytesize}", string) end @stream.flush end |