message_channel 1.0.1 → 1.1.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 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
-