oceanex-slanger 0.7.1.4 → 0.7.3.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: b8d982e2c189e52f3905e70cdcb0b4c9c00cbbe2cc7b173769ad547cecc58773
4
- data.tar.gz: 8e045a72b30957002c11ba9015d5dc9fd06dbfe0b29274bbbd03cd67fa6a457e
3
+ metadata.gz: c29aabb135c13b3f60f650980b9472e0c14658d64e54054727fef3c14939d886
4
+ data.tar.gz: 512bc1d00c219b385cacf852d023eca1f52aa6b18eded305729ac832399917db
5
5
  SHA512:
6
- metadata.gz: 883726b3449fa3f622aa9dbf5a380e7cfc7688bf660d6420d5bdeefdd8247049e958943ac0442d2d17591eca06993f77d1c532189b9bd5f520ef2839ee58e70d
7
- data.tar.gz: ca574e7bec766e86e5d3ef783c46f7cfaa558e7be5b0fed6a81f6985859d222ab21a907537c04f7b5ed322f79c456e8c5cca3cb0dc6fddb2dabc6868ef3a0f4a
6
+ metadata.gz: bcdd9a96fc8de94b85bf9f8b438146127b474464c8a5e6bb235c85e5c76af2b05bd6ffa5ab92ab16257afed4a065fdc3e47e74b486903ba2e7ca44f6c6887b3b
7
+ data.tar.gz: e3b06bcc9e8fd6540f058be92c91f9027b205dd227fdd87afd896d6bf0bc52cc4ae55fa6a0a416ce74ec499cd6e48b5f57f1fe3cfbb2db00a36c0263d482790f
data/README.md CHANGED
@@ -18,7 +18,7 @@ OceanEx Slanger is a standalone server ruby implementation of the Pusher protoco
18
18
 
19
19
  ## Requirements
20
20
 
21
- - Ruby 2.6.3 or greater
21
+ - Ruby 3.0.1 or greater
22
22
  - Redis
23
23
 
24
24
  ## Server setup
@@ -218,8 +218,9 @@ OceanEx Slanger supports several configuration options, which can be supplied as
218
218
  # Current Core Team and Contributor
219
219
  - Joblee
220
220
  - Steve
221
- - Yao
222
221
  - Meng
222
+ - Sniper
223
+ - Jiayu
223
224
 
224
225
 
225
- © 2020 a OceanEx joint.
226
+ © 2021 a OceanEx joint.
@@ -17,8 +17,8 @@ module Slanger
17
17
  set :raise_errors, lambda { false }
18
18
  set :show_exceptions, false
19
19
 
20
- error(Signature::AuthenticationError) { |e| halt 401, "401 UNAUTHORIZED" }
21
- error(Slanger::Api::InvalidRequest) { |c| halt 400, "400 Bad Request" }
20
+ error(Signature::AuthenticationError) { |_| halt 401, "401 UNAUTHORIZED" }
21
+ error(Slanger::Api::InvalidRequest) { |_| halt 400, "400 Bad Request" }
22
22
 
23
23
  before do
24
24
  valid_request
@@ -32,7 +32,7 @@ module Slanger
32
32
  EventPublisher.publish(valid_request.channels, event)
33
33
 
34
34
  status 202
35
- return Oj.dump({}, mode: :compat)
35
+ Oj.dump({}, mode: :compat)
36
36
  end
37
37
 
38
38
  post "/apps/:app_id/channels/:channel_id/events" do
@@ -42,7 +42,7 @@ module Slanger
42
42
  EventPublisher.publish(valid_request.channels, event)
43
43
 
44
44
  status 202
45
- return Oj.dump({}, mode: :compat)
45
+ Oj.dump({}, mode: :compat)
46
46
  end
47
47
 
48
48
  def valid_request
@@ -12,7 +12,8 @@ require "oj"
12
12
  module Slanger
13
13
  class Channel
14
14
  extend Forwardable
15
-
15
+ CHANNEL_SUBSCRIBER_COUNT_KEY = "channel_subscriber_count"
16
+ CHANNEL_VACATED_DICT = "channel_vacated_dict"
16
17
  def_delegators :channel, :push
17
18
  attr_reader :channel_id
18
19
 
@@ -24,15 +25,17 @@ module Slanger
24
25
  end
25
26
 
26
27
  def lookup(channel_id)
27
- all.detect { |o| o.channel_id == channel_id }
28
+ all[channel_id]
28
29
  end
29
30
 
30
31
  def create(params = {})
31
- new(params).tap { |r| all << r }
32
+ new(params).tap do |channel|
33
+ all[channel.channel_id] = channel
34
+ end
32
35
  end
33
36
 
34
37
  def all
35
- @all ||= []
38
+ @all ||= {}
36
39
  end
37
40
 
38
41
  def unsubscribe(channel_id, subscription_id)
@@ -54,7 +57,7 @@ module Slanger
54
57
  end
55
58
 
56
59
  def subscribe(*a, &blk)
57
- Slanger::Redis.hincrby("channel_subscriber_count", channel_id, 1).
60
+ Slanger::Redis.channel_attend([CHANNEL_SUBSCRIBER_COUNT_KEY], [channel_id]).
58
61
  callback do |value|
59
62
  Slanger::Webhook.post name: "channel_occupied", channel: channel_id if value == 1
60
63
  end
@@ -63,9 +66,9 @@ module Slanger
63
66
  end
64
67
 
65
68
  def unsubscribe(*a, &blk)
66
- Slanger::Redis.hincrby("channel_subscriber_count", channel_id, -1).
69
+ Slanger::Redis.channel_leave([CHANNEL_SUBSCRIBER_COUNT_KEY], [channel_id]).
67
70
  callback do |value|
68
- Slanger::Webhook.post name: "channel_vacated", channel: channel_id if value == 0
71
+ Slanger::Webhook.post name: "channel_vacated", channel: channel_id if value == 1
69
72
  end
70
73
 
71
74
  channel.unsubscribe *a, &blk
@@ -93,7 +96,7 @@ module Slanger
93
96
  private
94
97
 
95
98
  def perform_client_webhook!(message)
96
- if (message["event"].start_with?("client-"))
99
+ if message["event"].start_with?("client-")
97
100
  event = message.merge({ "name" => "client_event" })
98
101
  event["data"] = Oj.dump(event["data"])
99
102
 
@@ -12,9 +12,15 @@ module Slanger
12
12
 
13
13
  def options
14
14
  @options ||= {
15
- api_host: "0.0.0.0", api_port: "4567", websocket_host: "0.0.0.0",
16
- websocket_port: "8080", debug: false, redis_address: "redis://0.0.0.0:6379/0",
17
- socket_handler: Slanger::Handler, require: [], activity_timeout: 120,
15
+ api_host: "0.0.0.0",
16
+ api_port: "4567",
17
+ websocket_host: "0.0.0.0",
18
+ websocket_port: "8080",
19
+ debug: false,
20
+ redis_address: "redis://0.0.0.0:6379/0",
21
+ socket_handler: Slanger::Handler,
22
+ require: [],
23
+ activity_timeout: 120,
18
24
  }
19
25
  end
20
26
 
@@ -22,7 +22,7 @@ module Slanger
22
22
  begin
23
23
  send_payload nil, "pusher:error", e
24
24
  rescue EventMachine::WebSocket::WebSocketError
25
- # Raised if connecection already closed. Only seen with Thor load testing tool
25
+ # Raised if connection already closed. Only seen with Thor load testing tool
26
26
  end
27
27
  end
28
28
 
@@ -59,7 +59,7 @@ module Slanger
59
59
  error({ code: 4007, message: "Unsupported protocol version" })
60
60
  @socket.close_websocket
61
61
  else
62
- return connection.establish
62
+ connection.establish
63
63
  end
64
64
  end
65
65
 
@@ -0,0 +1,9 @@
1
+ local key = KEYS[1]
2
+ local filed = ARGV[1]
3
+ local number = redis.call('hincrby', key, filed, 1)
4
+ if number <= 0 then
5
+ redis.call('hset', key, filed, 1)
6
+ return 1
7
+ else
8
+ return number
9
+ end
@@ -0,0 +1,8 @@
1
+ local key = KEYS[1]
2
+ local filed = ARGV[1]
3
+ local number = redis.call('hincrby', key, filed, -1)
4
+ if number <= 0 then
5
+ return redis.call('hdel', key, filed)
6
+ else
7
+ return 0
8
+ end
@@ -65,7 +65,7 @@ module Slanger
65
65
  end
66
66
 
67
67
  def unsubscribe(public_subscription_id)
68
- # Unsubcribe from EM::Channel
68
+ # Unsubscribe from EM::Channel
69
69
  channel.unsubscribe(internal_subscription_table.delete(public_subscription_id)) # if internal_subscription_table[public_subscription_id]
70
70
  # Remove subscription data from Redis
71
71
  roster_remove public_subscription_id
data/lib/slanger/redis.rb CHANGED
@@ -34,6 +34,14 @@ module Slanger
34
34
  send_command :hdel, *arg
35
35
  end
36
36
 
37
+ def channel_leave(*arg)
38
+ send_command :channel_leave, *arg
39
+ end
40
+
41
+ def channel_attend(*arg)
42
+ send_command :channel_attend, *arg
43
+ end
44
+
37
45
  def hgetall(*arg)
38
46
  send_command :hgetall, *arg
39
47
  end
@@ -1,3 +1,3 @@
1
1
  module Slanger
2
- VERSION = "0.7.1.4"
2
+ VERSION = "0.7.3.0"
3
3
  end
@@ -1,3 +1,5 @@
1
+ $:.unshift(File.expand_path('../../lib', __FILE__))
2
+ require 'em-hiredis'
1
3
  require "eventmachine"
2
4
  require "em-websocket"
3
5
 
@@ -10,6 +12,8 @@ module Slanger
10
12
  end
11
13
 
12
14
  EM.run do
15
+ scripts_dir = File.expand_path("../lua", __FILE__)
16
+ EM::Hiredis::Client.load_scripts_from(scripts_dir)
13
17
  options = {
14
18
  host: Slanger::Config[:websocket_host],
15
19
  port: Slanger::Config[:websocket_port],
@@ -24,7 +28,7 @@ module Slanger
24
28
 
25
29
  EM::WebSocket.start options do |ws|
26
30
  # Keep track of handler instance in instance of EM::Connection to ensure a unique handler instance is used per connection.
27
- ws.class_eval { attr_accessor :connection_handler }
31
+ ws.class.class_eval { attr_accessor :connection_handler } unless ws.respond_to?(:connection_handler)
28
32
  # Delegate connection management to handler instance.
29
33
  ws.onopen { |handshake| ws.connection_handler = Slanger::Config.socket_handler.new ws, handshake }
30
34
  ws.onmessage { |msg| ws.connection_handler.onmessage msg }
@@ -8,7 +8,7 @@ class ReplacedHandler < Slanger::Handler
8
8
  end
9
9
  end
10
10
 
11
- describe "Replacable handler" do
11
+ describe "Replaceable handler" do
12
12
  it "says welcome" do
13
13
  start_slanger_with_options socket_handler: ReplacedHandler
14
14
 
metadata CHANGED
@@ -1,17 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oceanex-slanger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1.4
4
+ version: 0.7.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joblee
8
8
  - Steve
9
- - Yao
10
9
  - Meng
10
+ - Sniper
11
+ - Jiayu
11
12
  autorequire:
12
13
  bindir: bin
13
14
  cert_chain: []
14
- date: 2020-09-15 00:00:00.000000000 Z
15
+ date: 2022-03-16 00:00:00.000000000 Z
15
16
  dependencies:
16
17
  - !ruby/object:Gem::Dependency
17
18
  name: eventmachine
@@ -47,28 +48,28 @@ dependencies:
47
48
  requirements:
48
49
  - - "~>"
49
50
  - !ruby/object:Gem::Version
50
- version: 0.5.1
51
+ version: 0.5.2
51
52
  type: :runtime
52
53
  prerelease: false
53
54
  version_requirements: !ruby/object:Gem::Requirement
54
55
  requirements:
55
56
  - - "~>"
56
57
  - !ruby/object:Gem::Version
57
- version: 0.5.1
58
+ version: 0.5.2
58
59
  - !ruby/object:Gem::Dependency
59
60
  name: rack
60
61
  requirement: !ruby/object:Gem::Requirement
61
62
  requirements:
62
63
  - - "~>"
63
64
  - !ruby/object:Gem::Version
64
- version: '2.2'
65
+ version: 2.2.3
65
66
  type: :runtime
66
67
  prerelease: false
67
68
  version_requirements: !ruby/object:Gem::Requirement
68
69
  requirements:
69
70
  - - "~>"
70
71
  - !ruby/object:Gem::Version
71
- version: '2.2'
72
+ version: 2.2.3
72
73
  - !ruby/object:Gem::Dependency
73
74
  name: rack-fiber_pool
74
75
  requirement: !ruby/object:Gem::Requirement
@@ -103,14 +104,14 @@ dependencies:
103
104
  requirements:
104
105
  - - "~>"
105
106
  - !ruby/object:Gem::Version
106
- version: 6.0.3
107
+ version: 6.1.3.2
107
108
  type: :runtime
108
109
  prerelease: false
109
110
  version_requirements: !ruby/object:Gem::Requirement
110
111
  requirements:
111
112
  - - "~>"
112
113
  - !ruby/object:Gem::Version
113
- version: 6.0.3
114
+ version: 6.1.3.2
114
115
  - !ruby/object:Gem::Dependency
115
116
  name: sinatra
116
117
  requirement: !ruby/object:Gem::Requirement
@@ -131,14 +132,14 @@ dependencies:
131
132
  requirements:
132
133
  - - "~>"
133
134
  - !ruby/object:Gem::Version
134
- version: 1.7.2
135
+ version: 1.8.1
135
136
  type: :runtime
136
137
  prerelease: false
137
138
  version_requirements: !ruby/object:Gem::Requirement
138
139
  requirements:
139
140
  - - "~>"
140
141
  - !ruby/object:Gem::Version
141
- version: 1.7.2
142
+ version: 1.8.1
142
143
  - !ruby/object:Gem::Dependency
143
144
  name: em-http-request
144
145
  requirement: !ruby/object:Gem::Requirement
@@ -159,98 +160,98 @@ dependencies:
159
160
  requirements:
160
161
  - - "~>"
161
162
  - !ruby/object:Gem::Version
162
- version: 3.10.14
163
+ version: 3.11.6
163
164
  type: :runtime
164
165
  prerelease: false
165
166
  version_requirements: !ruby/object:Gem::Requirement
166
167
  requirements:
167
168
  - - "~>"
168
169
  - !ruby/object:Gem::Version
169
- version: 3.10.14
170
+ version: 3.11.6
170
171
  - !ruby/object:Gem::Dependency
171
172
  name: rspec
172
173
  requirement: !ruby/object:Gem::Requirement
173
174
  requirements:
174
175
  - - "~>"
175
176
  - !ruby/object:Gem::Version
176
- version: 3.9.0
177
+ version: 3.10.0
177
178
  type: :development
178
179
  prerelease: false
179
180
  version_requirements: !ruby/object:Gem::Requirement
180
181
  requirements:
181
182
  - - "~>"
182
183
  - !ruby/object:Gem::Version
183
- version: 3.9.0
184
+ version: 3.10.0
184
185
  - !ruby/object:Gem::Dependency
185
186
  name: pusher
186
187
  requirement: !ruby/object:Gem::Requirement
187
188
  requirements:
188
189
  - - "~>"
189
190
  - !ruby/object:Gem::Version
190
- version: 1.3.3
191
+ version: 2.0.1
191
192
  type: :development
192
193
  prerelease: false
193
194
  version_requirements: !ruby/object:Gem::Requirement
194
195
  requirements:
195
196
  - - "~>"
196
197
  - !ruby/object:Gem::Version
197
- version: 1.3.3
198
+ version: 2.0.1
198
199
  - !ruby/object:Gem::Dependency
199
200
  name: haml
200
201
  requirement: !ruby/object:Gem::Requirement
201
202
  requirements:
202
203
  - - "~>"
203
204
  - !ruby/object:Gem::Version
204
- version: 5.1.2
205
+ version: 5.2.1
205
206
  type: :development
206
207
  prerelease: false
207
208
  version_requirements: !ruby/object:Gem::Requirement
208
209
  requirements:
209
210
  - - "~>"
210
211
  - !ruby/object:Gem::Version
211
- version: 5.1.2
212
+ version: 5.2.1
212
213
  - !ruby/object:Gem::Dependency
213
214
  name: timecop
214
215
  requirement: !ruby/object:Gem::Requirement
215
216
  requirements:
216
217
  - - "~>"
217
218
  - !ruby/object:Gem::Version
218
- version: 0.9.1
219
+ version: 0.9.4
219
220
  type: :development
220
221
  prerelease: false
221
222
  version_requirements: !ruby/object:Gem::Requirement
222
223
  requirements:
223
224
  - - "~>"
224
225
  - !ruby/object:Gem::Version
225
- version: 0.9.1
226
+ version: 0.9.4
226
227
  - !ruby/object:Gem::Dependency
227
228
  name: webmock
228
229
  requirement: !ruby/object:Gem::Requirement
229
230
  requirements:
230
231
  - - "~>"
231
232
  - !ruby/object:Gem::Version
232
- version: 3.8.3
233
+ version: 3.13.0
233
234
  type: :development
234
235
  prerelease: false
235
236
  version_requirements: !ruby/object:Gem::Requirement
236
237
  requirements:
237
238
  - - "~>"
238
239
  - !ruby/object:Gem::Version
239
- version: 3.8.3
240
+ version: 3.13.0
240
241
  - !ruby/object:Gem::Dependency
241
242
  name: mocha
242
243
  requirement: !ruby/object:Gem::Requirement
243
244
  requirements:
244
245
  - - "~>"
245
246
  - !ruby/object:Gem::Version
246
- version: 1.11.2
247
+ version: 1.12.0
247
248
  type: :development
248
249
  prerelease: false
249
250
  version_requirements: !ruby/object:Gem::Requirement
250
251
  requirements:
251
252
  - - "~>"
252
253
  - !ruby/object:Gem::Version
253
- version: 1.11.2
254
+ version: 1.12.0
254
255
  - !ruby/object:Gem::Dependency
255
256
  name: pry
256
257
  requirement: !ruby/object:Gem::Requirement
@@ -285,28 +286,28 @@ dependencies:
285
286
  requirements:
286
287
  - - "~>"
287
288
  - !ruby/object:Gem::Version
288
- version: 2.1.4
289
+ version: 2.2.20
289
290
  type: :development
290
291
  prerelease: false
291
292
  version_requirements: !ruby/object:Gem::Requirement
292
293
  requirements:
293
294
  - - "~>"
294
295
  - !ruby/object:Gem::Version
295
- version: 2.1.4
296
+ version: 2.2.20
296
297
  - !ruby/object:Gem::Dependency
297
298
  name: rake
298
299
  requirement: !ruby/object:Gem::Requirement
299
300
  requirements:
300
301
  - - "~>"
301
302
  - !ruby/object:Gem::Version
302
- version: 13.0.1
303
+ version: 13.0.3
303
304
  type: :development
304
305
  prerelease: false
305
306
  version_requirements: !ruby/object:Gem::Requirement
306
307
  requirements:
307
308
  - - "~>"
308
309
  - !ruby/object:Gem::Version
309
- version: 13.0.1
310
+ version: 13.0.3
310
311
  description: The Oceanex Slanger inherits from unmaintained project Slanger and continue
311
312
  to provide update and fixes
312
313
  email:
@@ -328,6 +329,8 @@ files:
328
329
  - lib/slanger/connection.rb
329
330
  - lib/slanger/handler.rb
330
331
  - lib/slanger/logger.rb
332
+ - lib/slanger/lua/channel_attend.lua
333
+ - lib/slanger/lua/channel_leave.lua
331
334
  - lib/slanger/presence_channel.rb
332
335
  - lib/slanger/presence_subscription.rb
333
336
  - lib/slanger/private_subscription.rb
@@ -357,7 +360,7 @@ licenses:
357
360
  - MIT
358
361
  metadata:
359
362
  homepage_uri: https://github.com/OceanEx/slanger
360
- source_code_uri: https://github.com/OceanEx/slanger/archive/v0.7.1.4.zip
363
+ source_code_uri: https://github.com/OceanEx/slanger/archive/v0.7.3.0.zip
361
364
  changelog_uri: https://github.com/OceanEx/slanger/releases
362
365
  post_install_message:
363
366
  rdoc_options: []