oceanex-slanger 0.7.1.4 → 0.7.3.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: 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: []