da_funk 1.6.0 → 1.7.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 +3 -3
- data/RELEASE_NOTES.md +6 -0
- data/lib/da_funk/connection_management.rb +115 -0
- data/lib/da_funk/payment_channel.rb +164 -0
- data/lib/da_funk/transaction/download.rb +1 -1
- data/lib/da_funk/version.rb +1 -1
- data/lib/file_db.rb +4 -6
- data/out/da_funk.mrb +0 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7aefd3af4727577071949e1efd5aa5bcff0d6f38
|
4
|
+
data.tar.gz: 0141f8d60bf76607aff1da184eb0c87c15acdd8c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dccb52cb1b3a1205c7098458e376582bc46e460bdf42a43a4251be7010629265670958e638f4efa27b84d7f878fd659fd77c58124a552a2e44279d5da6e23dc9
|
7
|
+
data.tar.gz: 54f517cd5d93ac182153ae85c88aee12db40394cbebfd95ecbe1e527de3dec11e23d4744efe1bf6c5d403e5c79e2cc71f244ec45d114bf0d0418287f9839476b
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
da_funk (1.
|
4
|
+
da_funk (1.7.0)
|
5
5
|
archive-zip (~> 0.5)
|
6
6
|
bundler
|
7
7
|
cloudwalk_handshake
|
@@ -14,8 +14,8 @@ GEM
|
|
14
14
|
specs:
|
15
15
|
archive-zip (0.11.0)
|
16
16
|
io-like (~> 0.3.0)
|
17
|
-
ast (2.
|
18
|
-
cloudwalk (1.
|
17
|
+
ast (2.4.0)
|
18
|
+
cloudwalk (1.5.0)
|
19
19
|
bundler
|
20
20
|
rake
|
21
21
|
cloudwalk_handshake (0.12.0)
|
data/RELEASE_NOTES.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
# DaFunk
|
2
2
|
|
3
|
+
### 1.7.0 - 2018-02-09
|
4
|
+
|
5
|
+
- Adopt “w” for FileDb and Transaction::Download write operation and improve IO time.
|
6
|
+
- Implement ConnectionManagement class based on ParamsDat config.
|
7
|
+
- Implement PaymentChannel via websocket.
|
8
|
+
|
3
9
|
### 1.6.0 - 2018-02-01
|
4
10
|
|
5
11
|
- Implement Notification#reply.
|
@@ -0,0 +1,115 @@
|
|
1
|
+
module DaFunk
|
2
|
+
class ConnectionManagement
|
3
|
+
class << self
|
4
|
+
attr_accessor :drops, :primary_timeout
|
5
|
+
end
|
6
|
+
self.drops = 0
|
7
|
+
DEFAULT_DROP_LIMIT = 2
|
8
|
+
|
9
|
+
def self.fallback?
|
10
|
+
if ! Device::Network.connected? && self.fallback_valid? && self.conn_automatic_management? &&
|
11
|
+
Device::Setting.media_primary == Device::Setting.media
|
12
|
+
self.drops += 1
|
13
|
+
if self.drops >= self.conn_fallback_drops_limit
|
14
|
+
return true
|
15
|
+
end
|
16
|
+
end
|
17
|
+
false
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.conn_automatic_management?
|
21
|
+
DaFunk::ParamsDat.exists? && DaFunk::ParamsDat.file["connection_management"] != "0"
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.conn_fallback_drops_limit
|
25
|
+
value = DaFunk::ParamsDat.file["conn_fallback_drops_limit"]
|
26
|
+
if value && ! value.empty?
|
27
|
+
value.to_i
|
28
|
+
else
|
29
|
+
DEFAULT_DROP_LIMIT
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.conn_fallback_config
|
34
|
+
value = DaFunk::ParamsDat.file["conn_fallback_config"]
|
35
|
+
if value && !value.empty?
|
36
|
+
value
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.conn_fallback_timer
|
41
|
+
value = DaFunk::ParamsDat.file["conn_fallback_timer"]
|
42
|
+
if value && ! value.empty?
|
43
|
+
return value.to_i
|
44
|
+
end
|
45
|
+
0
|
46
|
+
end
|
47
|
+
|
48
|
+
class << self
|
49
|
+
alias :config :conn_fallback_config
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.primary_try?
|
53
|
+
if ! Device::Setting.media_primary.to_s.empty? && Device::Setting.media_primary != Device::Setting.media
|
54
|
+
if self.primary_timeout.nil?
|
55
|
+
self.schedule_primary_timeout
|
56
|
+
else
|
57
|
+
if Time.now > self.primary_timeout
|
58
|
+
self.schedule_primary_timeout
|
59
|
+
return true
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
false
|
64
|
+
end
|
65
|
+
|
66
|
+
def self.fallback_valid?
|
67
|
+
self.conn_fallback_config && self.conn_fallback_timer &&
|
68
|
+
(self.config.include?("WIFI") || self.config.include?("GPRS"))
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.recover_fallback
|
72
|
+
if self.fallback_valid?
|
73
|
+
self.schedule_primary_timeout
|
74
|
+
media, parameters = self.conn_fallback_config.to_s.split("|", 2)
|
75
|
+
|
76
|
+
if media == "WIFI"
|
77
|
+
# WIFI|uclwifinetwork|uclwifisecurity|uclwifichannel|uclwifikey
|
78
|
+
essid, authentication, channel, password = parameters.split("|")
|
79
|
+
configuration = {
|
80
|
+
:network_configured => "1",
|
81
|
+
:authentication => authentication,
|
82
|
+
:essid => essid,
|
83
|
+
:wifi_password => password,
|
84
|
+
:channel => channel,
|
85
|
+
:cipher => Device::Network::PARE_CIPHERS_TKIP,
|
86
|
+
:mode => Device::Network::MODE_STATION,
|
87
|
+
:media => Device::Network::MEDIA_WIFI
|
88
|
+
}
|
89
|
+
# elsif TODO # ETHERNET|DHCP
|
90
|
+
else
|
91
|
+
# GPRS|APN|USER|PASSWORD
|
92
|
+
apn, user, password = parameters.split("|")
|
93
|
+
configuration = {
|
94
|
+
:network_configured => "1",
|
95
|
+
:apn => apn,
|
96
|
+
:user => user,
|
97
|
+
:apn_password => password,
|
98
|
+
:media => Device::Network::MEDIA_GPRS
|
99
|
+
}
|
100
|
+
end
|
101
|
+
Device::Setting.update_attributes(configuration)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def self.recover_primary
|
106
|
+
Device::Setting.update_attributes({media: Device::Setting.media_primary})
|
107
|
+
end
|
108
|
+
|
109
|
+
private
|
110
|
+
def self.schedule_primary_timeout
|
111
|
+
self.primary_timeout = (Time.now + self.conn_fallback_timer)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
@@ -0,0 +1,164 @@
|
|
1
|
+
module DaFunk
|
2
|
+
class PaymentChannel
|
3
|
+
DEFAULT_HEARBEAT = "180"
|
4
|
+
|
5
|
+
class << self
|
6
|
+
attr_accessor :client
|
7
|
+
end
|
8
|
+
|
9
|
+
attr_accessor :handshake_response, :client, :host, :port
|
10
|
+
|
11
|
+
def self.ready?
|
12
|
+
Device::Network.connected? && self.configured?
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.configured?
|
16
|
+
DaFunk::ParamsDat.file["access_token"] &&
|
17
|
+
DaFunk::ParamsDat.file["payment_channel_enabled"] == "1" &&
|
18
|
+
Device::Setting.logical_number
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.handshake_message
|
22
|
+
{
|
23
|
+
"token" => DaFunk::ParamsDat.file["access_token"],
|
24
|
+
"id" => Device::Setting.logical_number.to_s,
|
25
|
+
"heartbeat" => Device::Setting.heartbeat || DEFAULT_HEARBEAT
|
26
|
+
}.to_json
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.handshake_success_message
|
30
|
+
{"token" => DaFunk::ParamsDat.file["access_token"]}.to_json
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.connect(display_message = true)
|
34
|
+
if self.dead? && self.ready?
|
35
|
+
self.print_info(I18n.t(:attach_attaching), display_message)
|
36
|
+
@client = PaymentChannel.new
|
37
|
+
self.print_info(I18n.t(:attach_authenticate), display_message)
|
38
|
+
@client.handshake
|
39
|
+
else
|
40
|
+
@client = nil
|
41
|
+
end
|
42
|
+
@client
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.error
|
46
|
+
if self.configured?
|
47
|
+
if ConnectionManagement.fallback?
|
48
|
+
:fallback_communication
|
49
|
+
elsif ConnectionManagement.conn_automatic_management?
|
50
|
+
:attach_registration_fail
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.check(display_message = true)
|
56
|
+
if self.dead?
|
57
|
+
PaymentChannel.connect(display_message)
|
58
|
+
if @client
|
59
|
+
self.print_info(I18n.t(:attach_waiting), display_message)
|
60
|
+
if message = @client.check || @client.handshake?
|
61
|
+
self.print_info(I18n.t(:attach_connected), display_message)
|
62
|
+
message
|
63
|
+
else
|
64
|
+
self.error
|
65
|
+
end
|
66
|
+
else
|
67
|
+
self.error
|
68
|
+
end
|
69
|
+
else
|
70
|
+
if @client
|
71
|
+
@client.check
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.dead?
|
77
|
+
! self.alive?
|
78
|
+
end
|
79
|
+
|
80
|
+
def self.alive?
|
81
|
+
a = Device::Network.connected?
|
82
|
+
a = Device::Network.connected?
|
83
|
+
b = @client if @client
|
84
|
+
c = @client.connected? if @client
|
85
|
+
ContextLog.info "a[#{a}] b[#{b}] c[#{c}]"
|
86
|
+
a && b && c
|
87
|
+
end
|
88
|
+
|
89
|
+
def self.close!
|
90
|
+
@client && @client.close && @client = nil
|
91
|
+
end
|
92
|
+
|
93
|
+
def self.print_info(message, display = true)
|
94
|
+
print_last(message) if display
|
95
|
+
end
|
96
|
+
|
97
|
+
def initialize(client = nil)
|
98
|
+
@host = Device::Setting.host
|
99
|
+
@port = (Device::Setting.apn == "gprsnac.com.br") ? 32304 : 443
|
100
|
+
@client = client || CwWebSocket::Client.new(@host, @port)
|
101
|
+
rescue SocketError, PolarSSL::SSL::Error => e
|
102
|
+
self.error(e)
|
103
|
+
end
|
104
|
+
|
105
|
+
def write(value)
|
106
|
+
@client.write(value)
|
107
|
+
end
|
108
|
+
|
109
|
+
def read
|
110
|
+
begin
|
111
|
+
@client.read
|
112
|
+
rescue SocketError, PolarSSL::SSL::Error => e
|
113
|
+
self.error(e)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def close
|
118
|
+
@client.close if @client
|
119
|
+
@client = nil
|
120
|
+
PaymentChannel.client = nil
|
121
|
+
end
|
122
|
+
|
123
|
+
def connected?
|
124
|
+
self.client && self.client.connected?
|
125
|
+
end
|
126
|
+
|
127
|
+
def handshake?
|
128
|
+
if self.connected? && ! @handshake_response
|
129
|
+
timeout = Time.now + Device::Setting.tcp_recv_timeout.to_i
|
130
|
+
loop do
|
131
|
+
break if @handshake_response = self.client.read
|
132
|
+
break if Time.now > timeout || getc(200) == Device::IO::CANCEL
|
133
|
+
end
|
134
|
+
end
|
135
|
+
!! @handshake_response
|
136
|
+
end
|
137
|
+
|
138
|
+
def check
|
139
|
+
if Device::Network.connected? && self.connected? && self.handshake?
|
140
|
+
message = self.read
|
141
|
+
end
|
142
|
+
if message.nil? && ConnectionManagement.primary_try?
|
143
|
+
return :primary_communication
|
144
|
+
end
|
145
|
+
message
|
146
|
+
end
|
147
|
+
|
148
|
+
private
|
149
|
+
def error(exception)
|
150
|
+
if Context.development?
|
151
|
+
ContextLog.exception(exception, exception.backtrace, "PaymentChannel error")
|
152
|
+
end
|
153
|
+
PaymentChannel.client = nil
|
154
|
+
@client = nil
|
155
|
+
end
|
156
|
+
|
157
|
+
def handshake
|
158
|
+
if self.connected?
|
159
|
+
@client.write(PaymentChannel.handshake_message)
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
data/lib/da_funk/version.rb
CHANGED
data/lib/file_db.rb
CHANGED
@@ -30,15 +30,13 @@ class FileDb
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def save
|
33
|
-
|
34
|
-
|
35
|
-
file_new.puts("#{line_key}=#{line_value}")
|
33
|
+
string = @hash.inject("") do |str, line| #|line_key, line_value|
|
34
|
+
str << "#{line[0]}=#{line[1]}\n"
|
36
35
|
end
|
36
|
+
File.open(@path, "w") {|f| f.write(string) }
|
37
37
|
true
|
38
|
-
rescue
|
38
|
+
rescue => e
|
39
39
|
false
|
40
|
-
ensure
|
41
|
-
file_new.close
|
42
40
|
end
|
43
41
|
|
44
42
|
def []=(key, value)
|
data/out/da_funk.mrb
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: da_funk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thiago Scalone
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-02-
|
11
|
+
date: 2018-02-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -154,6 +154,7 @@ files:
|
|
154
154
|
- lib/da_funk.rb
|
155
155
|
- lib/da_funk/application.rb
|
156
156
|
- lib/da_funk/callback_flow.rb
|
157
|
+
- lib/da_funk/connection_management.rb
|
157
158
|
- lib/da_funk/engine.rb
|
158
159
|
- lib/da_funk/event_handler.rb
|
159
160
|
- lib/da_funk/event_listener.rb
|
@@ -167,6 +168,7 @@ files:
|
|
167
168
|
- lib/da_funk/notification_callback.rb
|
168
169
|
- lib/da_funk/notification_event.rb
|
169
170
|
- lib/da_funk/params_dat.rb
|
171
|
+
- lib/da_funk/payment_channel.rb
|
170
172
|
- lib/da_funk/rake_task.rb
|
171
173
|
- lib/da_funk/screen.rb
|
172
174
|
- lib/da_funk/screen_flow.rb
|