da_funk 1.6.0 → 1.7.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|