kalebr-pusher 0.6.1

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.
@@ -0,0 +1,53 @@
1
+ module Slanger
2
+ class Subscription
3
+ attr_accessor :connection, :socket
4
+ delegate :send_payload, :send_message, :error, :socket_id, to: :connection
5
+
6
+ def initialize socket, socket_id, msg
7
+ @connection = Connection.new socket, socket_id
8
+ @msg = msg
9
+ end
10
+
11
+ def subscribe
12
+ send_payload channel_id, 'pusher_internal:subscription_succeeded'
13
+
14
+ channel.subscribe { |m| send_message m }
15
+ end
16
+
17
+ private
18
+
19
+ def channel
20
+ Channel.from channel_id
21
+ end
22
+
23
+ def channel_id
24
+ @msg['data']['channel']
25
+ end
26
+
27
+ def token(channel_id, params=nil)
28
+ to_sign = [socket_id, channel_id, params].compact.join ':'
29
+
30
+ digest = OpenSSL::Digest::SHA256.new
31
+ OpenSSL::HMAC.hexdigest digest, Slanger::Config.secret, to_sign
32
+ end
33
+
34
+ def invalid_signature?
35
+ token(channel_id, data) != auth.split(':')[1]
36
+ end
37
+
38
+ def auth
39
+ @msg['data']['auth']
40
+ end
41
+
42
+ def data
43
+ @msg['data']['channel_data']
44
+ end
45
+
46
+ def handle_invalid_signature
47
+ message = "Invalid signature: Expected HMAC SHA256 hex digest of "
48
+ message << "#{socket_id}:#{channel_id}, but got #{auth}"
49
+
50
+ error({ message: message})
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,3 @@
1
+ module Slanger
2
+ VERSION = '0.6.1'
3
+ end
@@ -0,0 +1,3 @@
1
+ module Slanger
2
+ VERSION = '0.6.0'
3
+ end
@@ -0,0 +1,37 @@
1
+ require 'eventmachine'
2
+ require 'em-websocket'
3
+
4
+ module Slanger
5
+ module WebSocketServer
6
+ def run
7
+ case
8
+ when EM.epoll? then EM.epoll
9
+ when EM.kqueue? then EM.kqueue
10
+ end
11
+
12
+ EM.run do
13
+ options = {
14
+ host: Slanger::Config[:websocket_host],
15
+ port: Slanger::Config[:websocket_port],
16
+ debug: Slanger::Config[:debug],
17
+ app_key: Slanger::Config[:app_key]
18
+ }
19
+
20
+ if Slanger::Config[:tls_options]
21
+ options.merge! secure: true,
22
+ tls_options: Slanger::Config[:tls_options]
23
+ end
24
+
25
+ EM::WebSocket.start options do |ws|
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 }
28
+ # Delegate connection management to handler instance.
29
+ ws.onopen { |handshake| ws.connection_handler = Slanger::Config.socket_handler.new ws, handshake }
30
+ ws.onmessage { |msg| ws.connection_handler.onmessage msg }
31
+ ws.onclose { ws.connection_handler.onclose }
32
+ end
33
+ end
34
+ end
35
+ extend self
36
+ end
37
+ end
@@ -0,0 +1,31 @@
1
+ require 'fiber'
2
+ require 'em-http-request'
3
+ require 'oj'
4
+
5
+ module Slanger
6
+ module Webhook
7
+ def post payload
8
+ return unless Slanger::Config.webhook_url
9
+
10
+ payload ={
11
+ time_ms: Time.now.strftime('%s%L'), events: [payload]
12
+ }
13
+
14
+ payload = Oj.dump(payload, mode: :compat)
15
+
16
+ digest = OpenSSL::Digest::SHA256.new
17
+ hmac = OpenSSL::HMAC.hexdigest(digest, Slanger::Config.secret, payload)
18
+ content_type = 'application/json'
19
+
20
+ EM::HttpRequest.new(Slanger::Config.webhook_url).
21
+ post(body: payload, head: {
22
+ "X-Pusher-Key" => Slanger::Config.app_key,
23
+ "X-Pusher-Signature" => hmac,
24
+ "Content-Type" => content_type
25
+ })
26
+ # TODO: Exponentially backed off retries for errors
27
+ end
28
+
29
+ extend self
30
+ end
31
+ end
data/pusher.rb ADDED
@@ -0,0 +1,23 @@
1
+ # encoding: utf-8
2
+ require 'eventmachine'
3
+ require 'em-hiredis'
4
+ require 'rack'
5
+ require 'active_support/core_ext/string'
6
+ require File.join(File.dirname(__FILE__), 'lib', 'slanger', 'version')
7
+
8
+ module Slanger; end
9
+
10
+ case
11
+ when EM.epoll? then EM.epoll
12
+ when EM.kqueue? then EM.kqueue
13
+ end
14
+
15
+ File.tap do |f|
16
+ Dir[f.expand_path(f.join(f.dirname(__FILE__),'lib', 'slanger', '*.rb'))].each do |file|
17
+ Slanger.autoload File.basename(file, '.rb').camelize, file
18
+ end
19
+
20
+ Dir[f.expand_path(f.join(f.dirname(__FILE__),'lib', 'slanger', 'api', '*.rb'))].each do |file|
21
+ Slanger::Api.autoload File.basename(file, '.rb').camelize, file
22
+ end
23
+ end
metadata ADDED
@@ -0,0 +1,427 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kalebr-pusher
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.6.1
5
+ platform: ruby
6
+ authors:
7
+ - Nilanga Saluwadana
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-08-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: eventmachine
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.0.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '1.0'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.0.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: em-hiredis
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: 0.2.0
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: 0.2.0
47
+ - !ruby/object:Gem::Dependency
48
+ name: em-websocket
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: 0.5.1
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: 0.5.1
61
+ - !ruby/object:Gem::Dependency
62
+ name: rack
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '1.4'
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: 1.4.5
71
+ type: :runtime
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - "~>"
76
+ - !ruby/object:Gem::Version
77
+ version: '1.4'
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: 1.4.5
81
+ - !ruby/object:Gem::Dependency
82
+ name: rack-fiber_pool
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: 0.9.2
88
+ type: :runtime
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: 0.9.2
95
+ - !ruby/object:Gem::Dependency
96
+ name: signature
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - "~>"
100
+ - !ruby/object:Gem::Version
101
+ version: 0.1.6
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: 0.1.6
109
+ - !ruby/object:Gem::Dependency
110
+ name: activesupport
111
+ requirement: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - "~>"
114
+ - !ruby/object:Gem::Version
115
+ version: '4.2'
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: 4.2.1
119
+ type: :runtime
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - "~>"
124
+ - !ruby/object:Gem::Version
125
+ version: '4.2'
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: 4.2.1
129
+ - !ruby/object:Gem::Dependency
130
+ name: sinatra
131
+ requirement: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - "~>"
134
+ - !ruby/object:Gem::Version
135
+ version: '1.4'
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: 1.4.4
139
+ type: :runtime
140
+ prerelease: false
141
+ version_requirements: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '1.4'
146
+ - - ">="
147
+ - !ruby/object:Gem::Version
148
+ version: 1.4.4
149
+ - !ruby/object:Gem::Dependency
150
+ name: thin
151
+ requirement: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - "~>"
154
+ - !ruby/object:Gem::Version
155
+ version: '1.6'
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: 1.6.0
159
+ type: :runtime
160
+ prerelease: false
161
+ version_requirements: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - "~>"
164
+ - !ruby/object:Gem::Version
165
+ version: '1.6'
166
+ - - ">="
167
+ - !ruby/object:Gem::Version
168
+ version: 1.6.0
169
+ - !ruby/object:Gem::Dependency
170
+ name: em-http-request
171
+ requirement: !ruby/object:Gem::Requirement
172
+ requirements:
173
+ - - "~>"
174
+ - !ruby/object:Gem::Version
175
+ version: 0.3.0
176
+ type: :runtime
177
+ prerelease: false
178
+ version_requirements: !ruby/object:Gem::Requirement
179
+ requirements:
180
+ - - "~>"
181
+ - !ruby/object:Gem::Version
182
+ version: 0.3.0
183
+ - !ruby/object:Gem::Dependency
184
+ name: oj
185
+ requirement: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - "~>"
188
+ - !ruby/object:Gem::Version
189
+ version: '2.12'
190
+ - - ">="
191
+ - !ruby/object:Gem::Version
192
+ version: 2.12.9
193
+ type: :runtime
194
+ prerelease: false
195
+ version_requirements: !ruby/object:Gem::Requirement
196
+ requirements:
197
+ - - "~>"
198
+ - !ruby/object:Gem::Version
199
+ version: '2.12'
200
+ - - ">="
201
+ - !ruby/object:Gem::Version
202
+ version: 2.12.9
203
+ - !ruby/object:Gem::Dependency
204
+ name: rspec
205
+ requirement: !ruby/object:Gem::Requirement
206
+ requirements:
207
+ - - "~>"
208
+ - !ruby/object:Gem::Version
209
+ version: '2.12'
210
+ - - ">="
211
+ - !ruby/object:Gem::Version
212
+ version: 2.12.0
213
+ type: :development
214
+ prerelease: false
215
+ version_requirements: !ruby/object:Gem::Requirement
216
+ requirements:
217
+ - - "~>"
218
+ - !ruby/object:Gem::Version
219
+ version: '2.12'
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: 2.12.0
223
+ - !ruby/object:Gem::Dependency
224
+ name: pusher
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - "~>"
228
+ - !ruby/object:Gem::Version
229
+ version: 0.14.2
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - "~>"
235
+ - !ruby/object:Gem::Version
236
+ version: 0.14.2
237
+ - !ruby/object:Gem::Dependency
238
+ name: haml
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - "~>"
242
+ - !ruby/object:Gem::Version
243
+ version: '3.1'
244
+ - - ">="
245
+ - !ruby/object:Gem::Version
246
+ version: 3.1.2
247
+ type: :development
248
+ prerelease: false
249
+ version_requirements: !ruby/object:Gem::Requirement
250
+ requirements:
251
+ - - "~>"
252
+ - !ruby/object:Gem::Version
253
+ version: '3.1'
254
+ - - ">="
255
+ - !ruby/object:Gem::Version
256
+ version: 3.1.2
257
+ - !ruby/object:Gem::Dependency
258
+ name: timecop
259
+ requirement: !ruby/object:Gem::Requirement
260
+ requirements:
261
+ - - "~>"
262
+ - !ruby/object:Gem::Version
263
+ version: 0.3.5
264
+ type: :development
265
+ prerelease: false
266
+ version_requirements: !ruby/object:Gem::Requirement
267
+ requirements:
268
+ - - "~>"
269
+ - !ruby/object:Gem::Version
270
+ version: 0.3.5
271
+ - !ruby/object:Gem::Dependency
272
+ name: webmock
273
+ requirement: !ruby/object:Gem::Requirement
274
+ requirements:
275
+ - - "~>"
276
+ - !ruby/object:Gem::Version
277
+ version: '1.8'
278
+ - - ">="
279
+ - !ruby/object:Gem::Version
280
+ version: 1.8.7
281
+ type: :development
282
+ prerelease: false
283
+ version_requirements: !ruby/object:Gem::Requirement
284
+ requirements:
285
+ - - "~>"
286
+ - !ruby/object:Gem::Version
287
+ version: '1.8'
288
+ - - ">="
289
+ - !ruby/object:Gem::Version
290
+ version: 1.8.7
291
+ - !ruby/object:Gem::Dependency
292
+ name: mocha
293
+ requirement: !ruby/object:Gem::Requirement
294
+ requirements:
295
+ - - "~>"
296
+ - !ruby/object:Gem::Version
297
+ version: 0.13.2
298
+ type: :development
299
+ prerelease: false
300
+ version_requirements: !ruby/object:Gem::Requirement
301
+ requirements:
302
+ - - "~>"
303
+ - !ruby/object:Gem::Version
304
+ version: 0.13.2
305
+ - !ruby/object:Gem::Dependency
306
+ name: pry
307
+ requirement: !ruby/object:Gem::Requirement
308
+ requirements:
309
+ - - "~>"
310
+ - !ruby/object:Gem::Version
311
+ version: 0.10.1
312
+ type: :development
313
+ prerelease: false
314
+ version_requirements: !ruby/object:Gem::Requirement
315
+ requirements:
316
+ - - "~>"
317
+ - !ruby/object:Gem::Version
318
+ version: 0.10.1
319
+ - !ruby/object:Gem::Dependency
320
+ name: pry-byebug
321
+ requirement: !ruby/object:Gem::Requirement
322
+ requirements:
323
+ - - "~>"
324
+ - !ruby/object:Gem::Version
325
+ version: '2.0'
326
+ - - ">="
327
+ - !ruby/object:Gem::Version
328
+ version: 2.0.0
329
+ type: :development
330
+ prerelease: false
331
+ version_requirements: !ruby/object:Gem::Requirement
332
+ requirements:
333
+ - - "~>"
334
+ - !ruby/object:Gem::Version
335
+ version: '2.0'
336
+ - - ">="
337
+ - !ruby/object:Gem::Version
338
+ version: 2.0.0
339
+ - !ruby/object:Gem::Dependency
340
+ name: bundler
341
+ requirement: !ruby/object:Gem::Requirement
342
+ requirements:
343
+ - - "~>"
344
+ - !ruby/object:Gem::Version
345
+ version: '1.5'
346
+ type: :development
347
+ prerelease: false
348
+ version_requirements: !ruby/object:Gem::Requirement
349
+ requirements:
350
+ - - "~>"
351
+ - !ruby/object:Gem::Version
352
+ version: '1.5'
353
+ - !ruby/object:Gem::Dependency
354
+ name: rake
355
+ requirement: !ruby/object:Gem::Requirement
356
+ requirements:
357
+ - - "~>"
358
+ - !ruby/object:Gem::Version
359
+ version: '10.4'
360
+ - - ">="
361
+ - !ruby/object:Gem::Version
362
+ version: 10.4.2
363
+ type: :development
364
+ prerelease: false
365
+ version_requirements: !ruby/object:Gem::Requirement
366
+ requirements:
367
+ - - "~>"
368
+ - !ruby/object:Gem::Version
369
+ version: '10.4'
370
+ - - ">="
371
+ - !ruby/object:Gem::Version
372
+ version: 10.4.2
373
+ description: A websocket service compatible with Pusher libraries
374
+ email: nilanga89@gmail.com
375
+ executables:
376
+ - kalebr-pusher
377
+ extensions: []
378
+ extra_rdoc_files: []
379
+ files:
380
+ - README.md
381
+ - bin/kalebr-pusher
382
+ - lib/slanger/api.rb
383
+ - lib/slanger/api/event.rb
384
+ - lib/slanger/api/event_publisher.rb
385
+ - lib/slanger/api/request_validation.rb
386
+ - lib/slanger/api/server.rb
387
+ - lib/slanger/channel.rb
388
+ - lib/slanger/config.rb
389
+ - lib/slanger/connection.rb
390
+ - lib/slanger/handler.rb
391
+ - lib/slanger/logger.rb
392
+ - lib/slanger/presence_channel.rb
393
+ - lib/slanger/presence_subscription.rb
394
+ - lib/slanger/private_subscription.rb
395
+ - lib/slanger/redis.rb
396
+ - lib/slanger/service.rb
397
+ - lib/slanger/subscription.rb
398
+ - lib/slanger/version.rb
399
+ - lib/slanger/version.rb~
400
+ - lib/slanger/web_socket_server.rb
401
+ - lib/slanger/webhook.rb
402
+ - pusher.rb
403
+ homepage: https://github.com/vusaalab
404
+ licenses:
405
+ - MIT
406
+ metadata: {}
407
+ post_install_message: Thanks for installing!
408
+ rdoc_options: []
409
+ require_paths:
410
+ - "."
411
+ required_ruby_version: !ruby/object:Gem::Requirement
412
+ requirements:
413
+ - - ">="
414
+ - !ruby/object:Gem::Version
415
+ version: 2.0.0
416
+ required_rubygems_version: !ruby/object:Gem::Requirement
417
+ requirements:
418
+ - - ">="
419
+ - !ruby/object:Gem::Version
420
+ version: '0'
421
+ requirements: []
422
+ rubyforge_project:
423
+ rubygems_version: 2.5.1
424
+ signing_key:
425
+ specification_version: 4
426
+ summary: A websocket service compatible with Pusher libraries
427
+ test_files: []