da_funk 0.28.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +2 -2
- data/RELEASE_NOTES.md +17 -0
- data/Rakefile +25 -26
- data/lib/{device → da_funk}/application.rb +39 -19
- data/lib/da_funk/engine.rb +0 -1
- data/lib/da_funk/file_parameter.rb +30 -12
- data/lib/da_funk/helper.rb +8 -8
- data/lib/da_funk/notification.rb +38 -0
- data/lib/{device → da_funk}/notification_callback.rb +1 -1
- data/lib/da_funk/notification_event.rb +27 -0
- data/lib/{device → da_funk}/params_dat.rb +17 -17
- data/lib/{device → da_funk}/transaction/download.rb +2 -2
- data/lib/{device → da_funk}/transaction/iso.rb +1 -1
- data/lib/da_funk/version.rb +1 -1
- data/lib/da_funk.rb +34 -19
- data/lib/device/io.rb +1 -1
- data/lib/device/runtime.rb +1 -7
- data/lib/device/setting.rb +2 -2
- data/out/da_funk.mrb +0 -0
- data/test/integration/mrb_eval_test.rb +3 -3
- data/test/integration/notification_test.rb +6 -6
- data/test/integration/params_dat_test.rb +2 -2
- data/test/unit/device/application_test.rb +3 -3
- data/test/unit/device/notification_event_test.rb +3 -3
- data/test/unit/device/notification_test.rb +1 -1
- data/test/unit/params_dat_test.rb +2 -2
- metadata +9 -16
- data/lib/device/helper.rb +0 -5
- data/lib/device/notification.rb +0 -173
- data/lib/device/notification_event.rb +0 -39
- data/lib/device/transaction/emv.rb +0 -45
- data/lib/serfx/commands.rb +0 -193
- data/lib/serfx/connection.rb +0 -165
- data/lib/serfx/exceptions.rb +0 -5
- data/lib/serfx/response.rb +0 -28
- data/lib/serfx.rb +0 -27
data/lib/serfx/connection.rb
DELETED
@@ -1,165 +0,0 @@
|
|
1
|
-
module Serfx
|
2
|
-
# This class wraps the low level msgpack data transformation and tcp
|
3
|
-
# communication for the RPC session. methods in this module are used to
|
4
|
-
# implement the actual RPC commands available via [Commands]
|
5
|
-
class Connection
|
6
|
-
MAX_MESSAGE_SIZE = 1024
|
7
|
-
DEFAULT_TIMEOUT = 5
|
8
|
-
COMMANDS = {
|
9
|
-
handshake: [:header],
|
10
|
-
auth: [:header],
|
11
|
-
event: [:header],
|
12
|
-
force_leave: [:header],
|
13
|
-
join: [:header, :body],
|
14
|
-
members: [:header, :body],
|
15
|
-
members_filtered: [:header, :body],
|
16
|
-
tags: [:header],
|
17
|
-
stream: [:header],
|
18
|
-
monitor: [:header],
|
19
|
-
stop: [:header],
|
20
|
-
leave: [:header],
|
21
|
-
query: [:header],
|
22
|
-
respond: [:header],
|
23
|
-
install_key: [:header, :body],
|
24
|
-
use_key: [:header, :body],
|
25
|
-
remove_key: [:header, :body],
|
26
|
-
list_keys: [:header, :body],
|
27
|
-
stats: [:header, :body]
|
28
|
-
}
|
29
|
-
|
30
|
-
include Serfx::Commands
|
31
|
-
|
32
|
-
attr_reader :host, :port, :seq, :socket, :socket_block, :timeout, :stream_timeout
|
33
|
-
|
34
|
-
def close
|
35
|
-
@socket.close
|
36
|
-
end
|
37
|
-
|
38
|
-
def closed?
|
39
|
-
@socket.closed?
|
40
|
-
end
|
41
|
-
|
42
|
-
# @param opts [Hash] Specify the RPC connection details
|
43
|
-
# @option opts [SSL] :socket Socket SSL or normal tcp socket
|
44
|
-
# @option opts [Fixnum] :timeout Timeout in seconds to wait for a event and return Fiber
|
45
|
-
# @option opts [Symbol] :authkey encryption key for RPC communication
|
46
|
-
# @option opts [Block] :socket_block Callback to create socket if socket was closed, should return [socket]
|
47
|
-
def initialize(opts = {})
|
48
|
-
if @socket_block = opts[:socket_block]
|
49
|
-
@socket = @socket_block.call(true)
|
50
|
-
else
|
51
|
-
@socket = opts[:socket]
|
52
|
-
end
|
53
|
-
@timeout = opts[:timeout] || DEFAULT_TIMEOUT
|
54
|
-
@stream_timeout = opts[:stream_timeout] || DEFAULT_TIMEOUT
|
55
|
-
@seq = 0
|
56
|
-
@authkey = opts[:authkey]
|
57
|
-
@requests = {}
|
58
|
-
@responses = {}
|
59
|
-
end
|
60
|
-
|
61
|
-
# read data from tcp socket and pipe it through msgpack unpacker for
|
62
|
-
# deserialization
|
63
|
-
#
|
64
|
-
# @return [Hash]
|
65
|
-
def read_data(read_timeout = self.timeout)
|
66
|
-
buf = read_buffer(read_timeout)
|
67
|
-
return {'Error' => "Socket closed"} if buf.nil?
|
68
|
-
return if buf.empty?
|
69
|
-
parse_package(buf)
|
70
|
-
end
|
71
|
-
|
72
|
-
def parse_package(buf)
|
73
|
-
object = MessagePack.unpack(buf)
|
74
|
-
check = MessagePack.pack(object)
|
75
|
-
if check.size == buf.size
|
76
|
-
[object, nil]
|
77
|
-
else
|
78
|
-
[object, MessagePack.unpack(buf[check.size..-1])]
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
def read_buffer(read_timeout)
|
83
|
-
time_timeout = Time.now + read_timeout
|
84
|
-
loop do
|
85
|
-
bytes = socket.bytes_available
|
86
|
-
return socket.recv_nonblock(bytes) if bytes > 0
|
87
|
-
break unless time_timeout > Time.now
|
88
|
-
usleep 200_000
|
89
|
-
end
|
90
|
-
""
|
91
|
-
end
|
92
|
-
|
93
|
-
# takes raw RPC command name and an optional request body
|
94
|
-
# and convert them to msgpack encoded data and then send
|
95
|
-
# over tcp
|
96
|
-
#
|
97
|
-
# @param command [String] RPC command name
|
98
|
-
# @param body [Hash] request body of the RPC command
|
99
|
-
#
|
100
|
-
# @return [Integer]
|
101
|
-
def tcp_send(command, body = nil)
|
102
|
-
@seq += 1
|
103
|
-
header = {
|
104
|
-
'Command' => command.to_s.gsub('_', '-'),
|
105
|
-
'Seq' => seq
|
106
|
-
}
|
107
|
-
|
108
|
-
buff = ""
|
109
|
-
buff << header.to_msgpack
|
110
|
-
buff << body.to_msgpack unless body.nil?
|
111
|
-
|
112
|
-
res = socket.write(buff) unless buff.empty?
|
113
|
-
@requests[seq] = { header: header, ack?: false }
|
114
|
-
seq
|
115
|
-
end
|
116
|
-
|
117
|
-
# checks if the RPC response header has `error` field popular or not
|
118
|
-
# raises [RPCError] exception if error string is not empty
|
119
|
-
#
|
120
|
-
# @param header [Hash] RPC response header as hash
|
121
|
-
def check_rpc_error!(header, must_return = false)
|
122
|
-
if header
|
123
|
-
raise RPCError, header['Error'] unless header['Error'].empty?
|
124
|
-
else
|
125
|
-
raise RPCError, "Socket Closed" if must_return
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
# read data from the tcp socket. and convert it to a [Response] object
|
130
|
-
#
|
131
|
-
# @param command [String] RPC command name for which response will be read
|
132
|
-
# @return [Response]
|
133
|
-
def read_response(command, read_timeout = self.timeout)
|
134
|
-
header, body = read_data(read_timeout)
|
135
|
-
check_rpc_error!(header, true)
|
136
|
-
if COMMANDS[command].include?(:body)
|
137
|
-
Response.new(header, body)
|
138
|
-
else
|
139
|
-
Response.new(header)
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
# make an RPC request against the serf agent
|
144
|
-
#
|
145
|
-
# @param command [String] name of the RPC command
|
146
|
-
# @param body [Hash] an optional request body for the RPC command
|
147
|
-
# @return [Response]
|
148
|
-
def request(command, body = nil, read_timeout = self.timeout)
|
149
|
-
tcp_send(command, body)
|
150
|
-
read_response(command, read_timeout)
|
151
|
-
end
|
152
|
-
|
153
|
-
def fiber_yield!(ev)
|
154
|
-
if Fiber.yield(ev) == "close"
|
155
|
-
self.close
|
156
|
-
false
|
157
|
-
elsif self.closed?
|
158
|
-
false
|
159
|
-
else
|
160
|
-
true
|
161
|
-
end
|
162
|
-
end
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
data/lib/serfx/exceptions.rb
DELETED
data/lib/serfx/response.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
module Serfx
|
2
|
-
# Store agent rpc response data
|
3
|
-
# All RPC responses in Serf composed of an header and an optional
|
4
|
-
# body.
|
5
|
-
#
|
6
|
-
class Response
|
7
|
-
# Header is composed of two sub-parts
|
8
|
-
# - Seq : an integer representing the original request
|
9
|
-
# - Error: a string that represent whether the request made, was
|
10
|
-
# successfull or no. For all successful RPC requests, Error should
|
11
|
-
# be an empty string
|
12
|
-
#
|
13
|
-
# `{"Seq": 0, "Error": ""}`
|
14
|
-
#
|
15
|
-
Header = DaFunk::Struct.klass(:seq, :error)
|
16
|
-
attr_reader :header, :body
|
17
|
-
|
18
|
-
# Constructs a response object from a given header and body.
|
19
|
-
#
|
20
|
-
# @param header [Hash] header of the response as hash
|
21
|
-
# @param body [Hash] body of the response as hash
|
22
|
-
def initialize(header, body = nil)
|
23
|
-
@header = Header.call(header['Seq'], header['Error']) if header
|
24
|
-
@body = body
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
data/lib/serfx.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
|
2
|
-
module Serfx
|
3
|
-
# Creates a serf rpc connection, performs handshake and auth
|
4
|
-
# (if authkey is supplied). If a block is provided, the connection
|
5
|
-
# object will be yield-ed and the connection will be closed after
|
6
|
-
# the block's execution, otherwise the connection will be returned
|
7
|
-
# Params:
|
8
|
-
# +opts+:: An optional hash which can have following keys:
|
9
|
-
# * host => Serf host's rpc bind address (127.0.0.1 by default)
|
10
|
-
# * port => Serf host's rpc port (7373 by default)
|
11
|
-
# * authkey => Encryption key for RPC communiction
|
12
|
-
#
|
13
|
-
# @return value of the block evaluation or the connection object
|
14
|
-
def self.connect(opts = {})
|
15
|
-
conn = Serfx::Connection.new(opts)
|
16
|
-
conn.handshake
|
17
|
-
conn.auth if opts.key?(:authkey)
|
18
|
-
res = nil
|
19
|
-
if block_given?
|
20
|
-
res = yield conn
|
21
|
-
conn.close unless conn.closed?
|
22
|
-
res
|
23
|
-
else
|
24
|
-
conn
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|