message_channel 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7e76774a75506f2c670888b319bf69ee3abf09fa5ed509e56549d8bccda8ea26
4
- data.tar.gz: b1bbe6889b83970a86a7405d7ce3ee6a1e95438445fa1bad7539c0bcb15162ef
3
+ metadata.gz: e8dc94c4562b42f2714eda4846834fc1751a8d023aa0e2279e384e1084c37f82
4
+ data.tar.gz: e339c8ce08b1e8ba82a93e746808c5b5251bffa6ee794d3ad6d61ed51bca08bd
5
5
  SHA512:
6
- metadata.gz: f793f863eccdde06bed75405f2268159aeaa286bd4d612fc82e656dfacb4b23917030978ce153613499dcc0f17760246b7a6d916b50b749243f8b274213dee03
7
- data.tar.gz: fadae6f9289d7307cf939f0818db11008f1aa4270dff733d7639aa12e5703fe0be7f41030c988faa561bb9c10f824cbd923a91bc27a84b5e1edb65d8c3b83aec
6
+ metadata.gz: 78ba1bb8386cea8cb9e2909f49c6745d9f9710d3b37c8a9870faa83fe09d177af62e963b915457d77a12ce08a5aba3c98a3085ff1c360829fe32d9eabad41518
7
+ data.tar.gz: bd995e964b92d39ff297953ec4d7eedf6ddabc45b5c1f3b1f7533c3704b6dab53a4e79a5fe94f2304c4ac9e2d7334275d3cdee8f4c8e158f2a4ac94a848cbfd8
data/README.adoc CHANGED
@@ -1,14 +1,14 @@
1
1
  = MessageChannel
2
2
 
3
- Yet another observer pattern library via Observable, DRb, MQTT, Redis and Mongo.
3
+ Yet another observer pattern library via Observable, DRb, MQTT, Redis.
4
4
 
5
5
  == Features
6
6
 
7
7
  * Thread based observer pattern library.
8
- * Implemented as a wrapper for Obserbable, DRb, MQTT, Redis and Mongo.
8
+ * Implemented as a wrapper for Obserbable, DRb, MQTT, Redis.
9
9
  * Observer can communicate without using sockets.
10
10
  * DRb can communicate between processes without using an external server.
11
- * MQTT, Redis, and Mongo can create apps that can communicate in other languages.
11
+ * MQTT and Redis can create apps that can communicate in other languages.
12
12
  * Distribute topic as a character string and data as a JSON-encoded character string.
13
13
 
14
14
  == Installation
@@ -89,7 +89,7 @@ sleep
89
89
 
90
90
  [source,ruby]
91
91
  ----
92
- MessageChannel.new( uri = nil, type: nil, host: nil, port: nil, db: nil, size: nil, name: nil )
92
+ MessageChannel.new( uri = nil, type: nil, host: nil, port: nil, db: nil )
93
93
  ----
94
94
 
95
95
  * Result:
@@ -101,18 +101,14 @@ MessageChannel.new( uri = nil, type: nil, host: nil, port: nil, db: nil, size: n
101
101
  *** "druby://127.0.0.1:8787"
102
102
  *** "mqtt://127.0.0.1:1883"
103
103
  *** "redis://127.0.0.1:6379/0"
104
- *** "mongodb://127.0.0.1:27017/test?size=4000&name=_event_queue"
105
104
  ** type: Channel type. (default: "observer")
106
105
  *** "observer"
107
106
  *** "druby"
108
107
  *** "mqtt"
109
108
  *** "redis"
110
- *** "mongodb"
111
109
  ** host: Service host. (default: nil)
112
110
  ** port: Service port. (default: nil)
113
- ** db: Database name. (default: "test")
114
- ** size: Queue Size. (default: 4000)
115
- ** name: Queue Name. (default: "_event_queue")
111
+ ** db: Database. (default: nil)
116
112
 
117
113
  === Notify through the channel.
118
114
 
@@ -122,7 +118,6 @@ MessageChannel::Observer#notify( topic, **items )
122
118
  MessageChannel::Druby#notify( topic, **items )
123
119
  MessageChannel::Mqtt#notify( topic, **items )
124
120
  MessageChannel::Redis#notify( topic, **items )
125
- MessageChannel::Mongodb#notify( topic, **items )
126
121
  ----
127
122
 
128
123
  * Result:
@@ -136,26 +131,32 @@ MessageChannel::Mongodb#notify( topic, **items )
136
131
 
137
132
  [source,ruby]
138
133
  ----
139
- MessageChannel::Observer#listen( *patterns, &block )
140
- MessageChannel::Druby#listen( *patterns, &block )
141
- MessageChannel::Mqtt#listen( *patterns, &block )
142
- MessageChannel::Redis#listen( *patterns, &block )
143
- MessageChannel::Mongodb#listen( *patterns, &block )
134
+ MessageChannel::Observer#listen( *patterns, timeout: nil, &block )
135
+ MessageChannel::Druby#listen( *patterns, timeout: nil, &block )
136
+ MessageChannel::Mqtt#listen( *patterns, timeout: nil, &block )
137
+ MessageChannel::Redis#listen( *patterns, timeout: nil, &block )
144
138
  ----
145
139
 
146
- * Result:
147
- ** with block: (Non-blocing Mode)
140
+ * with block: (async)
141
+ ** Result:
148
142
  *** nil.
149
- ** without block: (Blocking Mode)
143
+
144
+ ** Parameter:
145
+ *** patterns: mask patterns.
146
+
147
+ * without block: (await)
148
+ ** Result:
149
+ return nil if timeout.
150
150
  *** topic: a notified topic.
151
151
  *** items: notified items.
152
152
 
153
- * Parameter:
154
- ** patterns: mask patterns.
153
+ ** Parameter:
154
+ *** patterns: mask patterns.
155
+ *** timeout: nil or wait second.
155
156
 
156
- * Block Parameter:
157
- ** topic: a notified topic.
158
- ** items: notified items.
157
+ ** Block Parameter:
158
+ *** topic: a notified topic.
159
+ *** items: notified items.
159
160
 
160
161
  === Unlisten to notification.
161
162
 
@@ -165,7 +166,6 @@ MessageChannel::Observer#unlisten( *patterns )
165
166
  MessageChannel::Druby#unlisten( *patterns )
166
167
  MessageChannel::Mqtt#unlisten( *patterns )
167
168
  MessageChannel::Redis#unlisten( *patterns )
168
- MessageChannel::Mongodb#unlisten( *patterns )
169
169
  ----
170
170
 
171
171
  * Result:
data/README.ja.adoc CHANGED
@@ -1,14 +1,14 @@
1
1
  = MessageChannel
2
2
 
3
- オブザーバパターンライブラリのひとつ. Observable, DRb, MQTT, Redis, Mongo を用いる.
3
+ オブザーバパターンライブラリのひとつ. Observable, DRb, MQTT, Redis を用いる.
4
4
 
5
5
  == 特徴
6
6
 
7
7
  * スレッドベースのオブザーバパターンライブラリ.
8
- * Obserbable, DRb, MQTT, Redis および Mongo のラッパーとして実装.
8
+ * Obserbable, DRb, MQTT, Redis のラッパーとして実装.
9
9
  * Observer はソケットを使わずに通信できる.
10
10
  * DRb は外部サーバを使わずにプロセス間通信できる.
11
- * MQTT, Redis, Mongo は通信できるアプリを他言語でも作成できる.
11
+ * MQTT Redis は通信できるアプリを他言語でも作成できる.
12
12
  * トピックは文字列として、データは JSON 化した文字列として配信する.
13
13
 
14
14
  == 導入
@@ -89,7 +89,7 @@ sleep
89
89
 
90
90
  [source,ruby]
91
91
  ----
92
- MessageChannel.new( uri = nil, type: nil, host: nil, port: nil, db: nil, size: nil, name: nil )
92
+ MessageChannel.new( uri = nil, type: nil, host: nil, port: nil, db: nil )
93
93
  ----
94
94
 
95
95
  * Result:
@@ -101,18 +101,14 @@ MessageChannel.new( uri = nil, type: nil, host: nil, port: nil, db: nil, size: n
101
101
  *** "druby://127.0.0.1:8787"
102
102
  *** "mqtt://127.0.0.1:1883"
103
103
  *** "redis://127.0.0.1:6379/0"
104
- *** "mongodb://127.0.0.1:27017/test?size=4000&name=_event_queue"
105
104
  ** type: Channel type. (default: "observer")
106
105
  *** "observer"
107
106
  *** "druby"
108
107
  *** "mqtt"
109
108
  *** "redis"
110
- *** "mongodb"
111
109
  ** host: サービスホスト. (default: nil)
112
110
  ** port: サービスポート. (default: nil)
113
- ** db: データベース名. (default: "test")
114
- ** size: キューサイズ. (default: 4000)
115
- ** name: キュー名. (default: "_event_queue")
111
+ ** db: データベース. (default: nil)
116
112
 
117
113
  === チャネル経由で通知.
118
114
 
@@ -122,7 +118,6 @@ MessageChannel::Observer#notify( topic, **items )
122
118
  MessageChannel::Druby#notify( topic, **items )
123
119
  MessageChannel::Mqtt#notify( topic, **items )
124
120
  MessageChannel::Redis#notify( topic, **items )
125
- MessageChannel::Mongodb#notify( topic, **items )
126
121
  ----
127
122
 
128
123
  * Result:
@@ -136,26 +131,32 @@ MessageChannel::Mongodb#notify( topic, **items )
136
131
 
137
132
  [source,ruby]
138
133
  ----
139
- MessageChannel::Observer#listen( *patterns, &block )
140
- MessageChannel::Druby#listen( *patterns, &block )
141
- MessageChannel::Mqtt#listen( *patterns, &block )
142
- MessageChannel::Redis#listen( *patterns, &block )
143
- MessageChannel::Mongodb#listen( *patterns, &block )
134
+ MessageChannel::Observer#listen( *patterns, timeout: nil, &block )
135
+ MessageChannel::Druby#listen( *patterns, timeout: nil, &block )
136
+ MessageChannel::Mqtt#listen( *patterns, timeout: nil, &block )
137
+ MessageChannel::Redis#listen( *patterns, timeout: nil, &block )
144
138
  ----
145
139
 
146
- * Result:
147
- ** ブロック引数あり: (Non-blocing Mode)
140
+ * ブロック引数あり: (非同期)
141
+ ** Result:
148
142
  *** nil.
149
- ** ブロック引数なし: (Blocking Mode)
143
+
144
+ ** Parameter:
145
+ *** patterns: マスクパターンの配列.
146
+
147
+ * ブロック引数なし: (待機)
148
+ ** Result:
149
+ タイムアウトなら nil を返す.
150
150
  *** topic: 通知トピック.
151
151
  *** items: 通知アイテム.
152
152
 
153
- * Parameter:
154
- ** patterns: マスクパターンの配列.
153
+ ** Parameter:
154
+ *** patterns: マスクパターンの配列.
155
+ *** timeout: nil または待機秒数.
155
156
 
156
- * Block Parameter:
157
- ** topic: 通知トピック.
158
- ** items: 通知アイテム.
157
+ ** Block Parameter:
158
+ *** topic: 通知トピック.
159
+ *** items: 通知アイテム.
159
160
 
160
161
  === 通知待機を解除.
161
162
 
@@ -165,7 +166,6 @@ MessageChannel::Observer#unlisten( *patterns )
165
166
  MessageChannel::Druby#unlisten( *patterns )
166
167
  MessageChannel::Mqtt#unlisten( *patterns )
167
168
  MessageChannel::Redis#unlisten( *patterns )
168
- MessageChannel::Mongodb#unlisten( *patterns )
169
169
  ----
170
170
 
171
171
  * Result:
@@ -13,6 +13,5 @@ module MessageChannel
13
13
  autoload :Druby, "message_channel/druby"
14
14
  autoload :Mqtt, "message_channel/mqtt"
15
15
  autoload :Redis, "message_channel/redis"
16
- autoload :Mongodb, "message_channel/mongodb"
17
16
  end
18
17
 
@@ -6,9 +6,8 @@ module MessageChannel
6
6
  # "druby://127.0.0.1:8787"
7
7
  # "mqtt://127.0.0.1:1883"
8
8
  # "redis://127.0.0.1:6379/0"
9
- # "mongodb://127.0.0.1:27017/test?size=4000&name=_event_queue"
10
9
 
11
- def new( uri = nil, type: nil, host: nil, port: nil, db: nil, size: nil, name: nil )
10
+ def new( uri = nil, type: nil, host: nil, port: nil, db: nil )
12
11
  if uri
13
12
  uris = URI.parse( uri )
14
13
  if uris.scheme.nil? && uris.host.nil? && uris.port.nil? && uris.path
@@ -20,8 +19,6 @@ module MessageChannel
20
19
  port = uris.port || port
21
20
  params = uris.path.gsub(/^\//, "").split('/')
22
21
  query = Hash[ URI::decode_www_form(uris.query) ] rescue {}
23
- size = query[:size] || size
24
- name = query[:name] || name
25
22
  end
26
23
  else
27
24
  parans = []
@@ -39,11 +36,6 @@ module MessageChannel
39
36
  when "redis"
40
37
  options[:db] = params.shift || db
41
38
  MessageChannel::Redis.new( **options )
42
- when "mongodb"
43
- options[:db] = params.shift || db
44
- options[:size] = size
45
- options[:name] = name
46
- MessageChannel::Mongodb.new( **options )
47
39
  end
48
40
  end
49
41
 
@@ -1,5 +1,6 @@
1
1
  require "drb/drb"
2
2
  require "json"
3
+ require "timeout"
3
4
 
4
5
  module MessageChannel
5
6
 
@@ -155,17 +156,27 @@ module MessageChannel
155
156
  end
156
157
  end
157
158
 
158
- def listen( *patterns, &block )
159
- if block.nil?
160
- listen_once( *patterns )
161
- else
159
+ def listen( *patterns, timeout: nil, &block )
160
+ if block_given?
162
161
  listen_each( *patterns ) do |topic, items|
163
162
  block.call( topic, items )
164
163
  end
164
+ return nil
165
+ end
166
+ if timeout.nil? || ( timeout.is_a?( Numeric ) && timeout >= 0 )
167
+ begin
168
+ Timeout.timeout( timeout ) do
169
+ listen_once( *patterns )
170
+ end
171
+ rescue Timeout::Error
172
+ return nil
173
+ end
174
+ else
175
+ raise ArgumentError, "timeout: %s" % timeout
165
176
  end
166
177
  end
167
178
 
168
- def unlisten( **patterns )
179
+ def unlisten( *patterns )
169
180
  patterns.each do |pattern|
170
181
  @agent.unlisten( pattern )
171
182
  @threads.delete( pattern )
@@ -1,5 +1,6 @@
1
1
  require "mqtt"
2
2
  require "json"
3
+ require "timeout"
3
4
 
4
5
  module MessageChannel
5
6
  class Mqtt
@@ -53,17 +54,27 @@ module MessageChannel
53
54
  end
54
55
  end
55
56
 
56
- def listen( *patterns, &block )
57
- if block.nil?
58
- listen_once( *patterns )
59
- else
57
+ def listen( *patterns, timeout: nil, &block )
58
+ if block_given?
60
59
  listen_each( *patterns ) do |topic, items|
61
60
  block.call( topic, items )
62
61
  end
62
+ return nil
63
+ end
64
+ if timeout.nil? || ( timeout.is_a?( Numeric ) && timeout >= 0 )
65
+ begin
66
+ Timeout.timeout( timeout ) do
67
+ listen_once( *patterns )
68
+ end
69
+ rescue Timeout::Error
70
+ return nil
71
+ end
72
+ else
73
+ raise ArgumentError, "timeout: %s" % timeout
63
74
  end
64
75
  end
65
76
 
66
- def unlisten( **patterns )
77
+ def unlisten( *patterns )
67
78
  patterns.each do |pattern|
68
79
  @threads[pattern].kill rescue nil
69
80
  @threads.delete( pattern ) rescue nil
@@ -1,5 +1,6 @@
1
1
  require "observer"
2
2
  require "json"
3
+ require "timeout"
3
4
 
4
5
  module MessageChannel
5
6
 
@@ -54,17 +55,27 @@ module MessageChannel
54
55
  end
55
56
  end
56
57
 
57
- def listen( *patterns, &block )
58
- if block.nil?
59
- listen_once( *patterns )
60
- else
58
+ def listen( *patterns, timeout: nil, &block )
59
+ if block_given?
61
60
  listen_each( *patterns ) do |topic, items|
62
61
  block.call( topic, items )
63
62
  end
63
+ return nil
64
+ end
65
+ if timeout.nil? || ( timeout.is_a?( Numeric ) && timeout >= 0 )
66
+ begin
67
+ Timeout.timeout( timeout ) do
68
+ listen_once( *patterns )
69
+ end
70
+ rescue Timeout::Error
71
+ return nil
72
+ end
73
+ else
74
+ raise ArgumentError, "timeout: %s" % timeout
64
75
  end
65
76
  end
66
77
 
67
- def unlisten( **patterns )
78
+ def unlisten( *patterns )
68
79
  patterns.each do |pattern|
69
80
  if ( action = @asyncs[pattern] )
70
81
  @asyncs.delete( pattern )
@@ -1,5 +1,6 @@
1
1
  require "redis"
2
2
  require "json"
3
+ require "timeout"
3
4
 
4
5
  module MessageChannel
5
6
  class Redis
@@ -62,17 +63,27 @@ module MessageChannel
62
63
  end
63
64
  end
64
65
 
65
- def listen( *patterns, &block )
66
- if block.nil?
67
- listen_once( *patterns )
68
- else
66
+ def listen( *patterns, timeout: nil, &block )
67
+ if block_given?
69
68
  listen_each( *patterns ) do |topic, items|
70
69
  block.call( topic, items )
71
70
  end
71
+ return nil
72
+ end
73
+ if timeout.nil? || ( timeout.is_a?( Numeric ) && timeout >= 0 )
74
+ begin
75
+ Timeout.timeout( timeout ) do
76
+ listen_once( *patterns )
77
+ end
78
+ rescue Timeout::Error
79
+ return nil
80
+ end
81
+ else
82
+ raise ArgumentError, "timeout: %s" % timeout
72
83
  end
73
84
  end
74
85
 
75
- def unlisten( **patterns )
86
+ def unlisten( *patterns )
76
87
  patterns.each do |pattern|
77
88
  @threads[pattern].kill rescue nil
78
89
  @threads.delete( pattern ) rescue nil
@@ -1,3 +1,3 @@
1
1
  module MessageChannel
2
- VERSION = "1.0.1"
2
+ VERSION = "1.1.0"
3
3
  end
@@ -7,7 +7,7 @@ Gem::Specification.new do |spec|
7
7
  spec.email = ["arima.yasuhiro@gmail.com"]
8
8
 
9
9
  spec.summary = %q{ Wrapper library for publish/subscribe pattern. }
10
- spec.description = %q{ Yet another observer pattern wrapper library via Observable, DRb, MQTT, Redis or Mongo. }
10
+ spec.description = %q{ Yet another observer pattern wrapper library via Observable, DRb, MQTT, Redis. }
11
11
  spec.homepage = "https://github.com/arimay/message_channel"
12
12
  spec.license = "MIT"
13
13
 
@@ -23,7 +23,6 @@ Gem::Specification.new do |spec|
23
23
  spec.add_development_dependency "mqtt"
24
24
  spec.add_development_dependency "redis"
25
25
  spec.add_development_dependency "msgpack"
26
- spec.add_development_dependency "mongo"
27
26
 
28
27
  spec.add_development_dependency "rake"
29
28
  spec.add_development_dependency "rspec"
data/sample/all_1.rb CHANGED
@@ -4,7 +4,6 @@ ObserverChannel = MessageChannel.new( "observer" )
4
4
  DrubyChannel = MessageChannel.new( "druby" )
5
5
  MqttChannel = MessageChannel.new( "mqtt" )
6
6
  RedisChannel = MessageChannel.new( "redis" )
7
- MongodbChannel = MessageChannel.new( "mongodb" )
8
7
 
9
8
  Signal.trap( :INT ) do
10
9
  exit
@@ -30,11 +29,6 @@ RedisChannel.listen( mask4 ) do |topic, items|
30
29
  p [:redis___, mask4, topic, items]
31
30
  end
32
31
 
33
- mask5 = "mongodb_/*"
34
- MongodbChannel.listen( mask5 ) do |topic, items|
35
- p [:mongodb_, mask5, topic, items]
36
- end
37
-
38
32
  i = 0
39
33
  while true
40
34
  sleep 1
@@ -44,5 +38,4 @@ while true
44
38
  DrubyChannel.notify "druby___/#{i}", at: now
45
39
  MqttChannel.notify "mqtt____/#{i}", at: now
46
40
  RedisChannel.notify "redis___/#{i}", at: now
47
- MongodbChannel.notify "mongodb_/#{i}", at: now
48
41
  end
data/sample/sample.txt CHANGED
@@ -21,11 +21,3 @@ URI defailt params for message_channel.
21
21
  "redis://127.0.0.1:6379"
22
22
  "redis://127.0.0.1:6379/1"
23
23
 
24
- "mongodb"
25
- "mongodb://127.0.0.1"
26
- "mongodb://127.0.0.1:27017"
27
- "mongodb://127.0.0.1:27017/test"
28
- "mongodb://127.0.0.1:27017/test?size=8000"
29
- "mongodb://127.0.0.1:27017/test?name=_event_queue"
30
- "mongodb://127.0.0.1:27017/test?size=8000&name=_event_queue"
31
-
@@ -0,0 +1,31 @@
1
+ require "message_channel"
2
+
3
+ p uri = ARGV.shift
4
+ p Channel = MessageChannel.new( uri )
5
+
6
+ Signal.trap( :INT ) do
7
+ exit
8
+ end
9
+
10
+ Channel.listen( "hello", "world" ) do |topic, items|
11
+ p [:async, topic, items]
12
+ end
13
+
14
+ Thread.start do
15
+ while true
16
+ topic, items = Channel.listen( "hello", "world", timeout: rand )
17
+ p [:await, topic, items]
18
+ end
19
+ end
20
+
21
+ Thread.start do
22
+ while true
23
+ Channel.notify( "hello", at: Time.now.to_s )
24
+ sleep 1
25
+ Channel.notify( "world", at: Time.now.to_s )
26
+ sleep 1
27
+ end
28
+ end
29
+
30
+ sleep
31
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: message_channel
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - arimay
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-02-03 00:00:00.000000000 Z
11
+ date: 2021-03-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mqtt
@@ -52,20 +52,6 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: mongo
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
55
  - !ruby/object:Gem::Dependency
70
56
  name: rake
71
57
  requirement: !ruby/object:Gem::Requirement
@@ -95,7 +81,7 @@ dependencies:
95
81
  - !ruby/object:Gem::Version
96
82
  version: '0'
97
83
  description: " Yet another observer pattern wrapper library via Observable, DRb, MQTT,
98
- Redis or Mongo. "
84
+ Redis. "
99
85
  email:
100
86
  - arima.yasuhiro@gmail.com
101
87
  executables: []
@@ -105,7 +91,6 @@ files:
105
91
  - ".gitignore"
106
92
  - ".rspec"
107
93
  - ".rubocop.yml"
108
- - ".travis.yml"
109
94
  - Gemfile
110
95
  - README.adoc
111
96
  - README.ja.adoc
@@ -115,7 +100,6 @@ files:
115
100
  - lib/message_channel.rb
116
101
  - lib/message_channel/base.rb
117
102
  - lib/message_channel/druby.rb
118
- - lib/message_channel/mongodb.rb
119
103
  - lib/message_channel/mqtt.rb
120
104
  - lib/message_channel/observer.rb
121
105
  - lib/message_channel/redis.rb
@@ -126,6 +110,7 @@ files:
126
110
  - sample/sample_1.rb
127
111
  - sample/sample_2.rb
128
112
  - sample/sample_3.rb
113
+ - sample/sample_4.rb
129
114
  homepage: https://github.com/arimay/message_channel
130
115
  licenses:
131
116
  - MIT
data/.travis.yml DELETED
@@ -1,6 +0,0 @@
1
- ---
2
- language: ruby
3
- cache: bundler
4
- rvm:
5
- - 2.7.1
6
- before_install: gem install bundler -v 2.1.4
@@ -1,133 +0,0 @@
1
- require "mongo"
2
- require "json"
3
-
4
- ::Mongo::Logger.logger.level = Logger::ERROR
5
-
6
- module MessageChannel
7
- class Mongodb
8
- SIZE = 8000
9
- NAME = "_event_queue"
10
-
11
- def initialize( host: nil, port: nil, db: nil, size: nil, name: nil )
12
- @host = host || "127.0.0.1"
13
- @port = ( port || 27017 ).to_i
14
- @db = db || "test"
15
- @size = ( size || SIZE ).to_i
16
- @name = name || NAME
17
-
18
- @url = "mongodb://#{ @host }:#{ @port }/#{ @db }"
19
- @client = ::Mongo::Client.new( @url )
20
-
21
- @threads = {}
22
- @mutex = Mutex.new
23
-
24
- @event_queue = get_event_queue
25
- end
26
-
27
- def get_event_queue
28
- event_queue = @mutex.synchronize do
29
- if @client.database.collection_names.include?( @name )
30
- event_queue = @client[ @name ]
31
- else
32
- event_queue = @client[ @name, capped: true, size: @size ]
33
- event_queue.create
34
- now = Time.now
35
- doc = {
36
- topic: "reset",
37
- at: now.strftime("%Y%m%d.%H%M%S.%6L"),
38
- }
39
- event_queue.insert_one( doc )
40
- event_queue
41
- end
42
- end
43
- end
44
-
45
- def get_event_tail( event_queue )
46
- filter = {}
47
- if ( enum = event_queue.find( {}, { sort: { "$natural" => -1 } } ).to_enum )
48
- if ( doc = enum.next rescue nil )
49
- filter = { "_id"=>{ "$gt"=>doc["_id"] } }
50
- end
51
- end
52
- event_tail = event_queue.find( filter, { cursor_type: :tailable_await } ).to_enum
53
- end
54
-
55
- def listen_once( *patterns )
56
- queue = Queue.new
57
- threads = {}
58
- patterns.each do |pattern|
59
- threads[pattern] = ::Thread.start( pattern ) do |pttrn|
60
- event_queue = get_event_queue
61
- event_tail = get_event_tail( event_queue )
62
- begin
63
- while ( doc = event_tail.next )
64
- items = JSON.parse( doc.to_json, symbolize_names: true )
65
- topic = items[:topic]
66
- if File.fnmatch( pttrn, topic, File::FNM_PATHNAME )
67
- items.delete( :_id )
68
- items.delete( :topic )
69
- queue.push [topic, items]
70
- end
71
- end
72
- rescue => e
73
- nil
74
- end
75
- end
76
- end
77
-
78
- topic, items = queue.pop
79
- patterns.each do |pattern|
80
- threads[pattern].kill rescue nil
81
- threads.delete( pattern ) rescue nil
82
- end
83
- [topic, items]
84
- end
85
-
86
- def listen_each( *patterns, &block )
87
- patterns.each do |pattern|
88
- @threads[pattern] = ::Thread.start( pattern ) do |pttrn|
89
- begin
90
- event_queue = get_event_queue
91
- event_tail = get_event_tail( event_queue )
92
- while ( doc = event_tail.next )
93
- items = JSON.parse( doc.to_json, symbolize_names: true )
94
- topic = items[:topic]
95
- if File.fnmatch( pttrn, topic, File::FNM_PATHNAME )
96
- items.delete( :_id )
97
- items.delete( :topic )
98
- block.call( topic, items )
99
- end
100
- end
101
- rescue => e
102
- nil
103
- end
104
- end
105
- end
106
- end
107
-
108
- def listen( *patterns, &block )
109
- if block.nil?
110
- listen_once( *patterns )
111
- else
112
- listen_each( *patterns ) do |topic, items|
113
- block.call( topic, items )
114
- end
115
- end
116
- end
117
-
118
- def unlisten( **patterns )
119
- patterns.each do |pattern|
120
- @threads[pattern].kill rescue nil
121
- @threads.delete( pattern ) rescue nil
122
- end
123
- end
124
-
125
- def notify( topic, **items )
126
- items[:topic] = topic
127
- @event_queue.insert_one( items )
128
- end
129
-
130
- end
131
-
132
- end
133
-