matrix_sdk 2.1.2 → 2.1.3
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/CHANGELOG.md +8 -0
- data/lib/matrix_sdk/api.rb +43 -32
- data/lib/matrix_sdk/client.rb +15 -6
- data/lib/matrix_sdk/room.rb +53 -23
- data/lib/matrix_sdk/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 550080056a38ee354ff8e633069d71f207e1927a567fcaed4f7ed9792bcbb79a
|
4
|
+
data.tar.gz: ae8909f5a1092873453c4b7a876315efd29882cee353252d9bd92f069ce3c4ac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5838b47c8ea7df7becdb7dadcb07e57c31526c8c3cdd025a18cc2add7db9e9da9f0aff62a16ed4a3a5306566785f941e7cdba90e664f2b872959c7774b4ec4bc
|
7
|
+
data.tar.gz: 3fcad5ea834b2dd0e6d68e55a8e88e5a88b444d07491f381420c4749ca1ff5375030f3a7c4b1b535ff947422caf7c4b86f81633d425614a05e5577aa9a4963ff
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
## 2.1.3 - 2020-09-18
|
2
|
+
|
3
|
+
- Adds separate state event handler as Client#on_state_event
|
4
|
+
- Changes Client sync interval to by-default run at full speed
|
5
|
+
- Fixes state events being sent twice if included in both timeline and state of a sync
|
6
|
+
- Improves error reporting of broken 200 responses
|
7
|
+
- Improves event handlers for rooms, to not depend on a specific room object instance anymore
|
8
|
+
|
1
9
|
## 2.1.2 - 2020-09-10
|
2
10
|
|
3
11
|
- Adds method for reading complete member lists for rooms, improves the CS spec adherence
|
data/lib/matrix_sdk/api.rb
CHANGED
@@ -101,30 +101,30 @@ module MatrixSdk
|
|
101
101
|
elsif target == :server
|
102
102
|
# Attempt SRV record discovery
|
103
103
|
target_uri = begin
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
104
|
+
require 'resolv'
|
105
|
+
resolver = Resolv::DNS.new
|
106
|
+
srv = "_matrix._tcp.#{domain}"
|
107
|
+
logger.debug "Trying DNS #{srv}..."
|
108
|
+
d = resolver.getresource(srv, Resolv::DNS::Resource::IN::SRV)
|
109
|
+
d
|
110
|
+
rescue StandardError => e
|
111
|
+
logger.debug "DNS lookup failed with #{e.class}: #{e.message}"
|
112
|
+
nil
|
113
|
+
end
|
114
114
|
|
115
115
|
if target_uri.nil?
|
116
116
|
# Attempt .well-known discovery for server-to-server
|
117
117
|
well_known = begin
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
118
|
+
wk_uri = URI("https://#{domain}/.well-known/matrix/server")
|
119
|
+
logger.debug "Trying #{wk_uri}..."
|
120
|
+
data = Net::HTTP.start(wk_uri.host, wk_uri.port, use_ssl: true, open_timeout: 5, read_timeout: 5, write_timeout: 5) do |http|
|
121
|
+
http.get(wk_uri.path).body
|
122
|
+
end
|
123
|
+
JSON.parse(data)
|
124
|
+
rescue StandardError => e
|
125
|
+
logger.debug "Well-known failed with #{e.class}: #{e.message}"
|
126
|
+
nil
|
127
|
+
end
|
128
128
|
|
129
129
|
target_uri = well_known['m.server'] if well_known&.key?('m.server')
|
130
130
|
else
|
@@ -133,16 +133,16 @@ module MatrixSdk
|
|
133
133
|
elsif %i[client identity].include? target
|
134
134
|
# Attempt .well-known discovery
|
135
135
|
well_known = begin
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
136
|
+
wk_uri = URI("https://#{domain}/.well-known/matrix/client")
|
137
|
+
logger.debug "Trying #{wk_uri}..."
|
138
|
+
data = Net::HTTP.start(wk_uri.host, wk_uri.port, use_ssl: true, open_timeout: 5, read_timeout: 5, write_timeout: 5) do |http|
|
139
|
+
http.get(wk_uri.path).body
|
140
|
+
end
|
141
|
+
JSON.parse(data)
|
142
|
+
rescue StandardError => e
|
143
|
+
logger.debug "Well-known failed with #{e.class}: #{e.message}"
|
144
|
+
nil
|
145
|
+
end
|
146
146
|
|
147
147
|
if well_known
|
148
148
|
key = 'm.homeserver'
|
@@ -304,7 +304,12 @@ module MatrixSdk
|
|
304
304
|
end
|
305
305
|
print_http(response, duration: duration, id: req_id)
|
306
306
|
|
307
|
-
|
307
|
+
begin
|
308
|
+
data = JSON.parse(response.body, symbolize_names: true)
|
309
|
+
rescue JSON::JSONError => e
|
310
|
+
logger.debug "#{e.class} error when parsing response. #{e}"
|
311
|
+
data = nil
|
312
|
+
end
|
308
313
|
|
309
314
|
if response.is_a? Net::HTTPTooManyRequests
|
310
315
|
raise MatrixRequestError.new_by_code(data, response.code) unless autoretry
|
@@ -315,7 +320,13 @@ module MatrixSdk
|
|
315
320
|
next
|
316
321
|
end
|
317
322
|
|
318
|
-
|
323
|
+
if response.is_a? Net::HTTPSuccess
|
324
|
+
unless data
|
325
|
+
logger.error "Received non-parsable data in 200 response; #{response.body.inspect}"
|
326
|
+
raise MatrixConnectionError, response
|
327
|
+
end
|
328
|
+
return MatrixSdk::Response.new self, data
|
329
|
+
end
|
319
330
|
raise MatrixRequestError.new_by_code(data, response.code) if data
|
320
331
|
|
321
332
|
raise MatrixConnectionError.class_by_code(response.code), response
|
data/lib/matrix_sdk/client.rb
CHANGED
@@ -23,7 +23,7 @@ module MatrixSdk
|
|
23
23
|
attr_reader :api, :next_batch
|
24
24
|
attr_accessor :cache, :sync_filter
|
25
25
|
|
26
|
-
events :error, :event, :presence_event, :invite_event, :leave_event, :ephemeral_event
|
26
|
+
events :error, :event, :presence_event, :invite_event, :leave_event, :ephemeral_event, :state_event
|
27
27
|
ignore_inspect :api,
|
28
28
|
:on_event, :on_presence_event, :on_invite_event, :on_leave_event, :on_ephemeral_event
|
29
29
|
|
@@ -70,8 +70,6 @@ module MatrixSdk
|
|
70
70
|
@api = Api.new hs_url, params
|
71
71
|
end
|
72
72
|
|
73
|
-
@rooms = {}
|
74
|
-
@users = {}
|
75
73
|
@cache = client_cache
|
76
74
|
@identity_server = nil
|
77
75
|
|
@@ -79,7 +77,6 @@ module MatrixSdk
|
|
79
77
|
@sync_thread = nil
|
80
78
|
@sync_filter = { room: { timeline: { limit: params.fetch(:sync_filter_limit, 20) }, state: { lazy_load_members: true } } }
|
81
79
|
|
82
|
-
@should_listen = false
|
83
80
|
@next_batch = nil
|
84
81
|
|
85
82
|
@bad_sync_timeout_limit = 60 * 60
|
@@ -88,6 +85,11 @@ module MatrixSdk
|
|
88
85
|
instance_variable_set("@#{k}", v) if instance_variable_defined? "@#{k}"
|
89
86
|
end
|
90
87
|
|
88
|
+
@rooms = {}
|
89
|
+
@room_handlers = {}
|
90
|
+
@users = {}
|
91
|
+
@should_listen = false
|
92
|
+
|
91
93
|
raise ArgumentError, 'Cache value must be one of of [:all, :some, :none]' unless %i[all some none].include? @cache
|
92
94
|
|
93
95
|
return unless params[:user_id]
|
@@ -524,7 +526,7 @@ module MatrixSdk
|
|
524
526
|
end
|
525
527
|
end
|
526
528
|
|
527
|
-
def listen_forever(timeout: 30, bad_sync_timeout: 5, sync_interval:
|
529
|
+
def listen_forever(timeout: 30, bad_sync_timeout: 5, sync_interval: 0, **params)
|
528
530
|
orig_bad_sync_timeout = bad_sync_timeout + 0
|
529
531
|
while @should_listen
|
530
532
|
begin
|
@@ -560,6 +562,8 @@ module MatrixSdk
|
|
560
562
|
def handle_state(room_id, state_event)
|
561
563
|
return unless state_event.key? :type
|
562
564
|
|
565
|
+
on_state_event.fire(MatrixEvent.new(self, state_event), state_event[:type])
|
566
|
+
|
563
567
|
room = ensure_room(room_id)
|
564
568
|
room.send :put_state_event, state_event
|
565
569
|
content = state_event[:content]
|
@@ -618,7 +622,12 @@ module MatrixSdk
|
|
618
622
|
|
619
623
|
join[:timeline][:events].each do |event|
|
620
624
|
event[:room_id] = room_id.to_s
|
621
|
-
|
625
|
+
# Avoid sending two identical state events if it's both in state and timeline
|
626
|
+
if event.key?(:state_key)
|
627
|
+
state_event = join.dig(:state, :events).find { |ev| ev[:event_id] == event[:event_id] }
|
628
|
+
|
629
|
+
handle_state(room_id, event) unless event == state_event
|
630
|
+
end
|
622
631
|
room.send :put_event, event
|
623
632
|
|
624
633
|
fire_event(MatrixEvent.new(self, event), event[:type])
|
data/lib/matrix_sdk/room.rb
CHANGED
@@ -42,19 +42,11 @@ module MatrixSdk
|
|
42
42
|
# The timeline events are what will end up in here
|
43
43
|
attr_reader :id, :client, :topic, :aliases, :members, :events
|
44
44
|
|
45
|
-
# @!attribute [r] on_event
|
46
|
-
# @return [EventHandlerArray] The list of event handlers for all events
|
47
|
-
# @!attribute [r] on_state_event
|
48
|
-
# @return [EventHandlerArray] The list of event handlers for only state events
|
49
|
-
# @!attribute [r] on_ephemeral_event
|
50
|
-
# @return [EventHandlerArray] The list of event handlers for only ephemeral events
|
51
|
-
events :event, :state_event, :ephemeral_event
|
52
45
|
# @!method inspect
|
53
46
|
# An inspect method that skips a handful of instance variables to avoid
|
54
47
|
# flooding the terminal with debug data.
|
55
48
|
# @return [String] a regular inspect string without the data for some variables
|
56
|
-
ignore_inspect :client, :members, :events, :prev_batch, :logger
|
57
|
-
:on_event, :on_state_event, :on_ephemeral_event
|
49
|
+
ignore_inspect :client, :members, :events, :prev_batch, :logger
|
58
50
|
|
59
51
|
alias room_id id
|
60
52
|
|
@@ -85,8 +77,6 @@ module MatrixSdk
|
|
85
77
|
room_id = MXID.new room_id unless room_id.is_a?(MXID)
|
86
78
|
raise ArgumentError, 'room_id must be a valid Room ID' unless room_id.room_id?
|
87
79
|
|
88
|
-
event_initialize
|
89
|
-
|
90
80
|
@name = nil
|
91
81
|
@topic = nil
|
92
82
|
@canonical_alias = nil
|
@@ -114,6 +104,30 @@ module MatrixSdk
|
|
114
104
|
logger.debug "Created room #{room_id}"
|
115
105
|
end
|
116
106
|
|
107
|
+
|
108
|
+
#
|
109
|
+
# Event handlers
|
110
|
+
#
|
111
|
+
|
112
|
+
# @!attribute [r] on_event
|
113
|
+
# @return [EventHandlerArray] The list of event handlers for all events
|
114
|
+
def on_event
|
115
|
+
ensure_room_handlers[:event]
|
116
|
+
end
|
117
|
+
|
118
|
+
# @!attribute [r] on_state_event
|
119
|
+
# @return [EventHandlerArray] The list of event handlers for only state events
|
120
|
+
def on_state_event
|
121
|
+
ensure_room_handlers[:state_event]
|
122
|
+
end
|
123
|
+
|
124
|
+
# @!attribute [r] on_ephemeral_event
|
125
|
+
# @return [EventHandlerArray] The list of event handlers for only ephemeral events
|
126
|
+
def on_ephemeral_event
|
127
|
+
ensure_room_handlers[:ephemeral_event]
|
128
|
+
end
|
129
|
+
|
130
|
+
|
117
131
|
#
|
118
132
|
# State readers
|
119
133
|
#
|
@@ -523,10 +537,10 @@ module MatrixSdk
|
|
523
537
|
# @return [Boolean] if the name was changed or not
|
524
538
|
def reload_name!
|
525
539
|
data = begin
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
540
|
+
client.api.get_room_name(id)
|
541
|
+
rescue MatrixNotFoundError
|
542
|
+
nil
|
543
|
+
end
|
530
544
|
changed = data[:name] != @name
|
531
545
|
@name = data[:name] if changed
|
532
546
|
changed
|
@@ -546,10 +560,10 @@ module MatrixSdk
|
|
546
560
|
# @return [Boolean] if the topic was changed or not
|
547
561
|
def reload_topic!
|
548
562
|
data = begin
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
563
|
+
client.api.get_room_topic(id)
|
564
|
+
rescue MatrixNotFoundError
|
565
|
+
nil
|
566
|
+
end
|
553
567
|
changed = data[:topic] != @topic
|
554
568
|
@topic = data[:topic] if changed
|
555
569
|
changed
|
@@ -681,19 +695,35 @@ module MatrixSdk
|
|
681
695
|
members << member unless members.any? { |m| m.id == member.id }
|
682
696
|
end
|
683
697
|
|
698
|
+
def room_handlers?
|
699
|
+
client.instance_variable_get(:@room_handlers).key? id
|
700
|
+
end
|
701
|
+
|
702
|
+
def ensure_room_handlers
|
703
|
+
client.instance_variable_get(:@room_handlers)[id] ||= {
|
704
|
+
event: MatrixSdk::EventHandlerArray.new,
|
705
|
+
state_event: MatrixSdk::EventHandlerArray.new,
|
706
|
+
ephemeral_event: MatrixSdk::EventHandlerArray.new
|
707
|
+
}
|
708
|
+
end
|
709
|
+
|
684
710
|
def put_event(event)
|
711
|
+
ensure_room_handlers[:event].fire(MatrixEvent.new(self, event), event[:type]) if room_handlers?
|
712
|
+
|
685
713
|
@events.push event
|
686
714
|
@events.shift if @events.length > @event_history_limit
|
687
|
-
|
688
|
-
fire_event MatrixEvent.new(self, event)
|
689
715
|
end
|
690
716
|
|
691
717
|
def put_ephemeral_event(event)
|
692
|
-
|
718
|
+
return unless room_handlers?
|
719
|
+
|
720
|
+
ensure_room_handlers[:ephemeral_event].fire(MatrixEvent.new(self, event), event[:type])
|
693
721
|
end
|
694
722
|
|
695
723
|
def put_state_event(event)
|
696
|
-
|
724
|
+
return unless room_handlers?
|
725
|
+
|
726
|
+
ensure_room_handlers[:state_event].fire(MatrixEvent.new(self, event), event[:type])
|
697
727
|
end
|
698
728
|
end
|
699
729
|
end
|
data/lib/matrix_sdk/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: matrix_sdk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.
|
4
|
+
version: 2.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexander Olofsson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-09-
|
11
|
+
date: 2020-09-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mocha
|