oceanex-slanger 0.7.1.1 → 0.7.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +85 -90
- data/lib/slanger/api/server.rb +4 -4
- data/lib/slanger/channel.rb +6 -4
- data/lib/slanger/config.rb +9 -3
- data/lib/slanger/connection.rb +1 -1
- data/lib/slanger/handler.rb +1 -1
- data/lib/slanger/presence_channel.rb +1 -1
- data/lib/slanger/version.rb +1 -1
- data/lib/slanger/web_socket_server.rb +1 -1
- data/spec/integration/replaced_handler_spec.rb +1 -1
- metadata +42 -38
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fd9b25eb92c9c65e280f5c95abacbd2017839495426d90c6bfcad80edb2eacb1
|
4
|
+
data.tar.gz: 347ccd8a7b564ae37bcce1ee0b42450f475c16a04516a4e32d2e884c3c956c40
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 202ffef21123fa3a76eccb2ba95332ce2c7412162dd46abf24bc599259f12988223ef2e458d9e9c8c0583459a1e44d10a0c4729842bd42ca0f455e3d280d6cb1
|
7
|
+
data.tar.gz: fe7251ce34692a9a57ab8b65d746324753860de89ec3f60e982b53f1ba85157ebf4c0471554b9b4edbe75690e8db8d985ee2acad900ee6d5a60ec219f9c8c901
|
data/README.md
CHANGED
@@ -1,59 +1,24 @@
|
|
1
|
-
# Slanger
|
1
|
+
# OceanEx Slanger
|
2
|
+
[![Gem Version](https://badge.fury.io/rb/oceanex-slanger.svg)](https://badge.fury.io/rb/oceanex-slanger) [![Build Status](https://travis-ci.com/jobleeyoui/slanger.svg?branch=master)](https://travis-ci.com/jobleeyoui/slanger)
|
2
3
|
|
3
|
-
|
4
|
-
This is the most important reason I decide to continue to maintain slanger. The maintenance will continue until future notice or better option comes out.
|
4
|
+
The OceanEx Slanger inherits from the unmaintained Slanger. The project is backed by OceanEx dev team.
|
5
5
|
|
6
|
-
|
6
|
+
We will do regularly bug fixes and security updates.
|
7
7
|
|
8
|
-
|
8
|
+
We might further add more features or provide performance improvements for OceanEx Slanger. The maintenance will continue until we find better option.
|
9
9
|
|
10
|
-
|
10
|
+
Feel free to log any issue or contribute to the code base.
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
redis-server &> /dev/null &
|
15
|
-
|
16
|
-
slanger --app_key 765ec374ae0a69f4ce44 --secret your-pusher-secret
|
17
|
-
```
|
18
|
-
|
19
|
-
Slanger is a standalone server ruby implementation of the Pusher protocol. It
|
20
|
-
is not designed to run inside a Rails or sinatra app, but it can be easily
|
21
|
-
installed as a gem.
|
22
|
-
|
23
|
-
Bundler has multiple purposes, one of which is useful for installation.
|
24
|
-
|
25
|
-
## About
|
12
|
+
**Important! OceanEx Slanger is not supposed to be included in your Gemfile. RubyGems is used as a distribution mechanism. If you include it in your app, you will likely get dependency conflicts.
|
13
|
+
PRs updating dependencies for compatibility with your app will be closed!**
|
26
14
|
|
27
|
-
Slanger is
|
28
|
-
in Ruby. It is designed to scale horizontally across N nodes and to be agnostic
|
29
|
-
as to which Slanger node a subscriber is connected to, i.e subscribers to the
|
30
|
-
same channel are NOT required to be connected to the same Slanger node.
|
31
|
-
Multiple Slanger nodes can sit behind a load balancer with no special
|
32
|
-
configuration. In essence it was designed to be very easy to scale.
|
33
|
-
|
34
|
-
Presence channel state is shared using Redis. Channels are lazily instantiated
|
35
|
-
internally within a given Slanger node when the first subscriber connects. When
|
36
|
-
a presence channel is instantiated within a Slanger node, it queries Redis for
|
37
|
-
the global state across all nodes within the system for that channel, and then
|
38
|
-
copies that state internally. Afterwards, when subscribers connect or
|
39
|
-
disconnect the node publishes a presence message to all interested nodes, i.e.
|
40
|
-
all nodes with at least one subscriber interested in the given channel.
|
41
|
-
|
42
|
-
Slanger is smart enough to know if a new channel subscription belongs to the
|
43
|
-
same user. It will not send presence messages to subscribers in this case. This
|
44
|
-
happens when the user has multiple browser tabs open for example. Using a chat
|
45
|
-
room backed by presence channels as a real example, one would not want
|
46
|
-
"Barrington" to show up N times in the presence roster because Barrington
|
47
|
-
has the chat room open in N browser tabs.
|
48
|
-
|
49
|
-
Slanger was designed to be highly available and partition tolerant with
|
50
|
-
eventual consistency, which in practise is instantaneous.
|
15
|
+
OceanEx Slanger is a standalone server ruby implementation of the Pusher protocol. It is not designed to run inside a Rails or sinatra app, but it can be easily installed as a gem.
|
51
16
|
|
52
17
|
# How to use it
|
53
18
|
|
54
19
|
## Requirements
|
55
20
|
|
56
|
-
- Ruby
|
21
|
+
- Ruby 3.0.1 or greater
|
57
22
|
- Redis
|
58
23
|
|
59
24
|
## Server setup
|
@@ -77,19 +42,60 @@ If you want to run multiple slanger instances in a cluster, one option will be t
|
|
77
42
|
A basic config can be found in the folder `examples`.
|
78
43
|
Haproxy can be also used for SSL termination, leaving slanger to not have to deal with SSL checks and so on, making it lighter.
|
79
44
|
|
45
|
+
## Installation instruction
|
46
|
+
|
47
|
+
The OceanEx Slanger depends on ruby 2.6.3 and above, please install ruby 2.6.3 first before install the OceanEx Slanger.
|
48
|
+
It could also run perfectly on the latest 2.7.1. If you want to align with the latest ruby, you might clone the source
|
49
|
+
code and compile yourself.
|
50
|
+
|
51
|
+
### Linux(Ubuntu)
|
52
|
+
|
53
|
+
You could install the right version of ruby via rbenv
|
54
|
+
|
55
|
+
```
|
56
|
+
sudo apt-get install rbenv
|
57
|
+
rbenv install 2.6.3
|
58
|
+
rbenv global 2.6.3
|
59
|
+
```
|
60
|
+
|
61
|
+
Then install the OceanEx Slanger
|
62
|
+
|
63
|
+
```
|
64
|
+
gem install oceanex-slanger
|
65
|
+
```
|
66
|
+
|
67
|
+
### Mac
|
68
|
+
|
69
|
+
Install the ruby version via home brew
|
80
70
|
|
81
|
-
|
71
|
+
```
|
72
|
+
brew install ruby
|
73
|
+
```
|
82
74
|
|
83
|
-
|
75
|
+
You might also install via rbenv
|
76
|
+
```
|
77
|
+
brew install rbenv
|
78
|
+
rbenv install 2.6.3
|
79
|
+
rbenv global 2.6.3
|
80
|
+
```
|
84
81
|
|
85
|
-
|
82
|
+
Installation might fail when some dependent gems builds their native extension. This is due to the c compiler converts the warning to error when do so.
|
86
83
|
|
87
|
-
|
88
|
-
$ gem install slanger
|
84
|
+
If you see installation fails due to `implicit-function-declaration`, you could try the following step to suppress the warning.
|
89
85
|
|
90
|
-
|
86
|
+
```
|
87
|
+
gem install oceanex-slanger -- --with-cflags="-Wno-error=implicit-function-declaration"
|
88
|
+
```
|
89
|
+
|
90
|
+
## Start the OceanEx Slanger in local environment
|
91
|
+
|
92
|
+
Both the app key and app secret are just random string, you could choose any string. However, it is recommended to be long
|
93
|
+
enough to keep secure.
|
94
|
+
|
95
|
+
Oceanex Slanger also depends on redis service, specify the redis url when launching the OceanEx Slanger.
|
91
96
|
|
92
|
-
|
97
|
+
```
|
98
|
+
slanger --app_key $APP_KEY --secret $APP_SECRET -r $REDIS_URL
|
93
99
|
```
|
94
100
|
|
95
101
|
If all went to plan you should see the following output to STDOUT
|
@@ -113,31 +119,31 @@ Slanger API server listening on port 4567
|
|
113
119
|
Slanger WebSocket server listening on port 8080
|
114
120
|
```
|
115
121
|
|
116
|
-
##
|
122
|
+
## Start the OceanEx Slanger in Docker environment
|
123
|
+
|
124
|
+
The OceanEx Slanger supports running in docker environment and such approach is already encapsulated in the make command.
|
125
|
+
The dependent Redis docker image is also automatically downloaded and started.
|
117
126
|
|
118
|
-
|
119
|
-
|
127
|
+
For the app key and app secret, please check `docker-compose.yaml` and modify as needed.
|
128
|
+
|
129
|
+
### Build the docker image
|
120
130
|
```
|
121
|
-
|
122
|
-
stop on runlevel [016]
|
123
|
-
respawn
|
124
|
-
script
|
125
|
-
LANG=en_US.UTF-8 /usr/local/rvm/gems/ruby-RUBY_VERISON/wrappers/slanger --app_key KEY --secret SECRET --redis_address redis://REDIS_IP:REDIS_PORT/REDIS_DB
|
126
|
-
end script
|
131
|
+
make build
|
127
132
|
```
|
128
|
-
This example assumes you're using rvm and a custom redis configuration
|
129
133
|
|
130
|
-
|
134
|
+
### Start the OceanEx slanger
|
131
135
|
```
|
132
|
-
|
133
|
-
service slanger stop
|
136
|
+
make up
|
134
137
|
```
|
135
138
|
|
139
|
+
### Stop the service
|
140
|
+
```
|
141
|
+
make down
|
142
|
+
```
|
136
143
|
|
137
|
-
## Modifying your application code to use the Slanger service
|
138
|
-
|
139
|
-
Once you have a Slanger instance listening for incoming connections you need to alter you application code to use the Slanger endpoint instead of Pusher. Fortunately this is very simple, unobtrusive, easily reversable, and very painless.
|
144
|
+
## Modifying your application code to use the OceanEx Slanger service
|
140
145
|
|
146
|
+
Once you have a OceanEx Slanger instance listening for incoming connections you need to alter you application code to use the OceanEx Slanger endpoint instead of Pusher. Fortunately this is very simple, unobtrusive, easily reversable, and very painless.
|
141
147
|
|
142
148
|
First you will need to add code to your server side component that publishes events to the Pusher HTTP REST API, usually this means telling the Pusher client to use a different host and port, e.g. consider this Ruby example
|
143
149
|
|
@@ -165,7 +171,7 @@ Of course you could proxy all requests to `ws.example.com` to port 8080 of your
|
|
165
171
|
|
166
172
|
# Configuration Options
|
167
173
|
|
168
|
-
Slanger supports several configuration options, which can be supplied as command line arguments at invocation. You can also supply a yaml file containing config options. If you use the config file in combination with other configuration options, the values passed on the command line will win. Allows running multiple instances with only a few differences easy.
|
174
|
+
OceanEx Slanger supports several configuration options, which can be supplied as command line arguments at invocation. You can also supply a yaml file containing config options. If you use the config file in combination with other configuration options, the values passed on the command line will win. Allows running multiple instances with only a few differences easy.
|
169
175
|
|
170
176
|
```
|
171
177
|
-k or --app_key This is the Pusher app key you want to use. This is a required argument on command line or in optional config file
|
@@ -193,39 +199,28 @@ Slanger supports several configuration options, which can be supplied as command
|
|
193
199
|
--pid_file The path to a file you want slanger to write it's PID to. Optional.
|
194
200
|
```
|
195
201
|
|
196
|
-
#
|
197
|
-
|
198
|
-
There a few reasons you might want to use Slanger instead of Pusher, e.g.
|
199
|
-
|
200
|
-
- You operate in a heavily regulated industry and are worried about sending data to 3rd parties, and it is an organisational requirement that you own your own infrastructure.
|
201
|
-
- You might be travelling on an airplane without internet connectivity as I am right now. Airplane rides are very good times to get a lot done, unfortunately external services are also usually unreachable. Remove internet connectivity as a dependency of your development envirionment by running a local Slanger instance in development and Pusher in production.
|
202
|
-
- Remove the network dependency from your test suite.
|
203
|
-
- You want to extend the Pusher protocol or have some special requirement. If this applies to you, chances are you are out of luck as Pusher is unlikely to implement something to suit your special use case, and rightly so. With Slanger you are free to modify and extend its behavior anyway that suits your purpose.
|
204
|
-
|
205
|
-
# Why did you write Slanger
|
206
|
-
|
207
|
-
I wanted to write a non-trivial evented app. I also want to write a book on evented programming in Ruby as I feel there is scant good information available on the topic and this project is handy to show publishers.
|
208
|
-
|
209
|
-
Pusher is an awesome service, very reasonably priced, and run by an awesome crew. Give them a spin on your next project.
|
210
|
-
|
211
|
-
# Author
|
202
|
+
# Original Author
|
212
203
|
|
213
204
|
- Stevie Graham
|
214
205
|
|
215
|
-
# Core Team
|
206
|
+
# Original Core Team
|
216
207
|
|
217
208
|
- Stevie Graham
|
218
209
|
- Mark Burns
|
219
210
|
|
220
|
-
# Contributors
|
211
|
+
# Original Contributors
|
221
212
|
|
222
213
|
- Stevie Graham
|
223
214
|
- Mark Burns
|
224
215
|
- Florian Gilcher
|
225
216
|
- Claudio Poli
|
226
217
|
|
227
|
-
#
|
228
|
-
-
|
218
|
+
# Current Core Team and Contributor
|
219
|
+
- Joblee
|
220
|
+
- Steve
|
221
|
+
- Meng
|
222
|
+
- Sniper
|
223
|
+
- Jiayu
|
229
224
|
|
230
225
|
|
231
|
-
©
|
226
|
+
© 2021 a OceanEx joint.
|
data/lib/slanger/api/server.rb
CHANGED
@@ -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) { |
|
21
|
-
error(Slanger::Api::InvalidRequest) { |
|
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
|
-
|
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
|
-
|
45
|
+
Oj.dump({}, mode: :compat)
|
46
46
|
end
|
47
47
|
|
48
48
|
def valid_request
|
data/lib/slanger/channel.rb
CHANGED
@@ -24,15 +24,17 @@ module Slanger
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def lookup(channel_id)
|
27
|
-
all
|
27
|
+
all[channel_id]
|
28
28
|
end
|
29
29
|
|
30
30
|
def create(params = {})
|
31
|
-
new(params).tap
|
31
|
+
new(params).tap do |channel|
|
32
|
+
all[channel.channel_id] = channel
|
33
|
+
end
|
32
34
|
end
|
33
35
|
|
34
36
|
def all
|
35
|
-
@all ||=
|
37
|
+
@all ||= {}
|
36
38
|
end
|
37
39
|
|
38
40
|
def unsubscribe(channel_id, subscription_id)
|
@@ -93,7 +95,7 @@ module Slanger
|
|
93
95
|
private
|
94
96
|
|
95
97
|
def perform_client_webhook!(message)
|
96
|
-
if
|
98
|
+
if message["event"].start_with?("client-")
|
97
99
|
event = message.merge({ "name" => "client_event" })
|
98
100
|
event["data"] = Oj.dump(event["data"])
|
99
101
|
|
data/lib/slanger/config.rb
CHANGED
@@ -12,9 +12,15 @@ module Slanger
|
|
12
12
|
|
13
13
|
def options
|
14
14
|
@options ||= {
|
15
|
-
api_host: "0.0.0.0",
|
16
|
-
|
17
|
-
|
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
|
|
data/lib/slanger/connection.rb
CHANGED
@@ -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
|
25
|
+
# Raised if connection already closed. Only seen with Thor load testing tool
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
data/lib/slanger/handler.rb
CHANGED
@@ -65,7 +65,7 @@ module Slanger
|
|
65
65
|
end
|
66
66
|
|
67
67
|
def unsubscribe(public_subscription_id)
|
68
|
-
#
|
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/version.rb
CHANGED
@@ -24,7 +24,7 @@ module Slanger
|
|
24
24
|
|
25
25
|
EM::WebSocket.start options do |ws|
|
26
26
|
# 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 }
|
27
|
+
ws.class.class_eval { attr_accessor :connection_handler } unless ws.respond_to?(:connection_handler)
|
28
28
|
# Delegate connection management to handler instance.
|
29
29
|
ws.onopen { |handshake| ws.connection_handler = Slanger::Config.socket_handler.new ws, handshake }
|
30
30
|
ws.onmessage { |msg| ws.connection_handler.onmessage msg }
|
metadata
CHANGED
@@ -1,14 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oceanex-slanger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- Joblee
|
8
|
+
- Steve
|
9
|
+
- Meng
|
10
|
+
- Sniper
|
11
|
+
- Jiayu
|
8
12
|
autorequire:
|
9
13
|
bindir: bin
|
10
14
|
cert_chain: []
|
11
|
-
date:
|
15
|
+
date: 2021-06-15 00:00:00.000000000 Z
|
12
16
|
dependencies:
|
13
17
|
- !ruby/object:Gem::Dependency
|
14
18
|
name: eventmachine
|
@@ -44,28 +48,28 @@ dependencies:
|
|
44
48
|
requirements:
|
45
49
|
- - "~>"
|
46
50
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.5.
|
51
|
+
version: 0.5.2
|
48
52
|
type: :runtime
|
49
53
|
prerelease: false
|
50
54
|
version_requirements: !ruby/object:Gem::Requirement
|
51
55
|
requirements:
|
52
56
|
- - "~>"
|
53
57
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.5.
|
58
|
+
version: 0.5.2
|
55
59
|
- !ruby/object:Gem::Dependency
|
56
60
|
name: rack
|
57
61
|
requirement: !ruby/object:Gem::Requirement
|
58
62
|
requirements:
|
59
63
|
- - "~>"
|
60
64
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
65
|
+
version: 2.2.3
|
62
66
|
type: :runtime
|
63
67
|
prerelease: false
|
64
68
|
version_requirements: !ruby/object:Gem::Requirement
|
65
69
|
requirements:
|
66
70
|
- - "~>"
|
67
71
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
72
|
+
version: 2.2.3
|
69
73
|
- !ruby/object:Gem::Dependency
|
70
74
|
name: rack-fiber_pool
|
71
75
|
requirement: !ruby/object:Gem::Requirement
|
@@ -100,14 +104,14 @@ dependencies:
|
|
100
104
|
requirements:
|
101
105
|
- - "~>"
|
102
106
|
- !ruby/object:Gem::Version
|
103
|
-
version: 6.
|
107
|
+
version: 6.1.3.2
|
104
108
|
type: :runtime
|
105
109
|
prerelease: false
|
106
110
|
version_requirements: !ruby/object:Gem::Requirement
|
107
111
|
requirements:
|
108
112
|
- - "~>"
|
109
113
|
- !ruby/object:Gem::Version
|
110
|
-
version: 6.
|
114
|
+
version: 6.1.3.2
|
111
115
|
- !ruby/object:Gem::Dependency
|
112
116
|
name: sinatra
|
113
117
|
requirement: !ruby/object:Gem::Requirement
|
@@ -128,126 +132,126 @@ dependencies:
|
|
128
132
|
requirements:
|
129
133
|
- - "~>"
|
130
134
|
- !ruby/object:Gem::Version
|
131
|
-
version: 1.
|
135
|
+
version: 1.8.1
|
132
136
|
type: :runtime
|
133
137
|
prerelease: false
|
134
138
|
version_requirements: !ruby/object:Gem::Requirement
|
135
139
|
requirements:
|
136
140
|
- - "~>"
|
137
141
|
- !ruby/object:Gem::Version
|
138
|
-
version: 1.
|
142
|
+
version: 1.8.1
|
139
143
|
- !ruby/object:Gem::Dependency
|
140
144
|
name: em-http-request
|
141
145
|
requirement: !ruby/object:Gem::Requirement
|
142
146
|
requirements:
|
143
147
|
- - "~>"
|
144
148
|
- !ruby/object:Gem::Version
|
145
|
-
version: 1.1.
|
149
|
+
version: 1.1.7
|
146
150
|
type: :runtime
|
147
151
|
prerelease: false
|
148
152
|
version_requirements: !ruby/object:Gem::Requirement
|
149
153
|
requirements:
|
150
154
|
- - "~>"
|
151
155
|
- !ruby/object:Gem::Version
|
152
|
-
version: 1.1.
|
156
|
+
version: 1.1.7
|
153
157
|
- !ruby/object:Gem::Dependency
|
154
158
|
name: oj
|
155
159
|
requirement: !ruby/object:Gem::Requirement
|
156
160
|
requirements:
|
157
161
|
- - "~>"
|
158
162
|
- !ruby/object:Gem::Version
|
159
|
-
version: 3.
|
163
|
+
version: 3.11.6
|
160
164
|
type: :runtime
|
161
165
|
prerelease: false
|
162
166
|
version_requirements: !ruby/object:Gem::Requirement
|
163
167
|
requirements:
|
164
168
|
- - "~>"
|
165
169
|
- !ruby/object:Gem::Version
|
166
|
-
version: 3.
|
170
|
+
version: 3.11.6
|
167
171
|
- !ruby/object:Gem::Dependency
|
168
172
|
name: rspec
|
169
173
|
requirement: !ruby/object:Gem::Requirement
|
170
174
|
requirements:
|
171
175
|
- - "~>"
|
172
176
|
- !ruby/object:Gem::Version
|
173
|
-
version: 3.
|
177
|
+
version: 3.10.0
|
174
178
|
type: :development
|
175
179
|
prerelease: false
|
176
180
|
version_requirements: !ruby/object:Gem::Requirement
|
177
181
|
requirements:
|
178
182
|
- - "~>"
|
179
183
|
- !ruby/object:Gem::Version
|
180
|
-
version: 3.
|
184
|
+
version: 3.10.0
|
181
185
|
- !ruby/object:Gem::Dependency
|
182
186
|
name: pusher
|
183
187
|
requirement: !ruby/object:Gem::Requirement
|
184
188
|
requirements:
|
185
189
|
- - "~>"
|
186
190
|
- !ruby/object:Gem::Version
|
187
|
-
version:
|
191
|
+
version: 2.0.1
|
188
192
|
type: :development
|
189
193
|
prerelease: false
|
190
194
|
version_requirements: !ruby/object:Gem::Requirement
|
191
195
|
requirements:
|
192
196
|
- - "~>"
|
193
197
|
- !ruby/object:Gem::Version
|
194
|
-
version:
|
198
|
+
version: 2.0.1
|
195
199
|
- !ruby/object:Gem::Dependency
|
196
200
|
name: haml
|
197
201
|
requirement: !ruby/object:Gem::Requirement
|
198
202
|
requirements:
|
199
203
|
- - "~>"
|
200
204
|
- !ruby/object:Gem::Version
|
201
|
-
version: 5.1
|
205
|
+
version: 5.2.1
|
202
206
|
type: :development
|
203
207
|
prerelease: false
|
204
208
|
version_requirements: !ruby/object:Gem::Requirement
|
205
209
|
requirements:
|
206
210
|
- - "~>"
|
207
211
|
- !ruby/object:Gem::Version
|
208
|
-
version: 5.1
|
212
|
+
version: 5.2.1
|
209
213
|
- !ruby/object:Gem::Dependency
|
210
214
|
name: timecop
|
211
215
|
requirement: !ruby/object:Gem::Requirement
|
212
216
|
requirements:
|
213
217
|
- - "~>"
|
214
218
|
- !ruby/object:Gem::Version
|
215
|
-
version: 0.9.
|
219
|
+
version: 0.9.4
|
216
220
|
type: :development
|
217
221
|
prerelease: false
|
218
222
|
version_requirements: !ruby/object:Gem::Requirement
|
219
223
|
requirements:
|
220
224
|
- - "~>"
|
221
225
|
- !ruby/object:Gem::Version
|
222
|
-
version: 0.9.
|
226
|
+
version: 0.9.4
|
223
227
|
- !ruby/object:Gem::Dependency
|
224
228
|
name: webmock
|
225
229
|
requirement: !ruby/object:Gem::Requirement
|
226
230
|
requirements:
|
227
231
|
- - "~>"
|
228
232
|
- !ruby/object:Gem::Version
|
229
|
-
version: 3.
|
233
|
+
version: 3.13.0
|
230
234
|
type: :development
|
231
235
|
prerelease: false
|
232
236
|
version_requirements: !ruby/object:Gem::Requirement
|
233
237
|
requirements:
|
234
238
|
- - "~>"
|
235
239
|
- !ruby/object:Gem::Version
|
236
|
-
version: 3.
|
240
|
+
version: 3.13.0
|
237
241
|
- !ruby/object:Gem::Dependency
|
238
242
|
name: mocha
|
239
243
|
requirement: !ruby/object:Gem::Requirement
|
240
244
|
requirements:
|
241
245
|
- - "~>"
|
242
246
|
- !ruby/object:Gem::Version
|
243
|
-
version: 1.
|
247
|
+
version: 1.12.0
|
244
248
|
type: :development
|
245
249
|
prerelease: false
|
246
250
|
version_requirements: !ruby/object:Gem::Requirement
|
247
251
|
requirements:
|
248
252
|
- - "~>"
|
249
253
|
- !ruby/object:Gem::Version
|
250
|
-
version: 1.
|
254
|
+
version: 1.12.0
|
251
255
|
- !ruby/object:Gem::Dependency
|
252
256
|
name: pry
|
253
257
|
requirement: !ruby/object:Gem::Requirement
|
@@ -282,29 +286,29 @@ dependencies:
|
|
282
286
|
requirements:
|
283
287
|
- - "~>"
|
284
288
|
- !ruby/object:Gem::Version
|
285
|
-
version: 2.
|
289
|
+
version: 2.2.20
|
286
290
|
type: :development
|
287
291
|
prerelease: false
|
288
292
|
version_requirements: !ruby/object:Gem::Requirement
|
289
293
|
requirements:
|
290
294
|
- - "~>"
|
291
295
|
- !ruby/object:Gem::Version
|
292
|
-
version: 2.
|
296
|
+
version: 2.2.20
|
293
297
|
- !ruby/object:Gem::Dependency
|
294
298
|
name: rake
|
295
299
|
requirement: !ruby/object:Gem::Requirement
|
296
300
|
requirements:
|
297
301
|
- - "~>"
|
298
302
|
- !ruby/object:Gem::Version
|
299
|
-
version: 13.0.
|
303
|
+
version: 13.0.3
|
300
304
|
type: :development
|
301
305
|
prerelease: false
|
302
306
|
version_requirements: !ruby/object:Gem::Requirement
|
303
307
|
requirements:
|
304
308
|
- - "~>"
|
305
309
|
- !ruby/object:Gem::Version
|
306
|
-
version: 13.0.
|
307
|
-
description: The
|
310
|
+
version: 13.0.3
|
311
|
+
description: The Oceanex Slanger inherits from unmaintained project Slanger and continue
|
308
312
|
to provide update and fixes
|
309
313
|
email:
|
310
314
|
- jobleeyoui@gmail.com
|
@@ -349,13 +353,13 @@ files:
|
|
349
353
|
- spec/unit/channel_spec.rb
|
350
354
|
- spec/unit/request_validation_spec.rb
|
351
355
|
- spec/unit/webhook_spec.rb
|
352
|
-
homepage: https://github.com/
|
356
|
+
homepage: https://github.com/OceanEx/slanger
|
353
357
|
licenses:
|
354
358
|
- MIT
|
355
359
|
metadata:
|
356
|
-
homepage_uri: https://github.com/
|
357
|
-
source_code_uri: https://github.com/
|
358
|
-
changelog_uri: https://github.com/
|
360
|
+
homepage_uri: https://github.com/OceanEx/slanger
|
361
|
+
source_code_uri: https://github.com/OceanEx/slanger/archive/v0.7.2.0.zip
|
362
|
+
changelog_uri: https://github.com/OceanEx/slanger/releases
|
359
363
|
post_install_message:
|
360
364
|
rdoc_options: []
|
361
365
|
require_paths:
|
@@ -364,14 +368,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
364
368
|
requirements:
|
365
369
|
- - ">="
|
366
370
|
- !ruby/object:Gem::Version
|
367
|
-
version:
|
371
|
+
version: 3.0.1
|
368
372
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
369
373
|
requirements:
|
370
374
|
- - ">="
|
371
375
|
- !ruby/object:Gem::Version
|
372
376
|
version: '0'
|
373
377
|
requirements: []
|
374
|
-
rubygems_version: 3.
|
378
|
+
rubygems_version: 3.2.20
|
375
379
|
signing_key:
|
376
380
|
specification_version: 4
|
377
381
|
summary: A websocket service compatible with Pusher libraries
|