websockethook 0.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 +7 -0
- data/lib/websockethook.rb +104 -0
- data/spec/spec_helper.rb +8 -0
- data/spec/websockethook_spec.rb +12 -0
- metadata +105 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a598958034d0bc23bffba798c4e79791c6101441
|
4
|
+
data.tar.gz: de4ba13cfc67d63f6fe9de5e07bfa995273b7d1c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6b6726ea1ce6af24499f6fc3fa09798de312c3a368e789e3b447df55f62c31c5ade4546f5240c2a8dcec81df54c30bb5dc35339aab183a4edc901831ab430d3e
|
7
|
+
data.tar.gz: 1ec3c17f5344aacdcb34d1a056e6b40b5084152d8a82053beed896ae3087cffc1001aa0b4eda7d06f1c74db638ce5f57aec1fb8ea666cea81ba279f214a3bd8d
|
@@ -0,0 +1,104 @@
|
|
1
|
+
require 'faye/websocket'
|
2
|
+
require 'json'
|
3
|
+
require 'eventmachine'
|
4
|
+
|
5
|
+
class WebSocketHook
|
6
|
+
DEFAULT_HOST = 'ws://web.sockethook.io'
|
7
|
+
|
8
|
+
def initialize(options = {})
|
9
|
+
@host = options[:host] || DEFAULT_HOST
|
10
|
+
@pause = options[:sleep] || 0.1
|
11
|
+
@stay_alive = options[:stay_alive] || true
|
12
|
+
@ping = options[:ping] || 20
|
13
|
+
hooks = options[:hooks] || []
|
14
|
+
@stopping = false
|
15
|
+
@hooks = []
|
16
|
+
|
17
|
+
raise 'Host (:host) must be a URL' unless @host.is_a?(String)
|
18
|
+
raise 'Pause (:pause) must be a float or integer' unless @pause.is_a?(Float) || @pause.is_a?(Integer)
|
19
|
+
raise 'Stay Alive (:stay_alive) must be a boolean (true/false)' unless @stay_alive == true || @stay_alive == false
|
20
|
+
raise 'Ping (:ping) must be an integer' unless @ping.is_a?(Integer)
|
21
|
+
raise 'Stopping (:stopping) must be boolean (true/false)' unless @stopping == true || @stopping == false
|
22
|
+
raise 'Hooks (:hooks) must be an array' unless hooks.is_a?(Array)
|
23
|
+
|
24
|
+
hooks.each {|hook| register(hook) }
|
25
|
+
end
|
26
|
+
|
27
|
+
def register(id)
|
28
|
+
raise "Hook id '#{id}' must be a String" unless id.is_a?(String)
|
29
|
+
raise "Hook id must only be alphanumeric, '_', '.', or '_'" unless /^[a-zA-Z0-9\-_\.]*$/ === id
|
30
|
+
@hooks << id unless @hooks.include?(id)
|
31
|
+
end
|
32
|
+
|
33
|
+
def unregister(id)
|
34
|
+
@hooks.delete(id)
|
35
|
+
end
|
36
|
+
|
37
|
+
def listen(&block)
|
38
|
+
raise 'Block must be provided' unless block && block.is_a?(Proc)
|
39
|
+
begin
|
40
|
+
@stopping = false
|
41
|
+
listener(&block)
|
42
|
+
restart = @stay_alive && !@stopping
|
43
|
+
if restart
|
44
|
+
block.call type:'restart', message:'restarting connection since it was lost'
|
45
|
+
sleep 5
|
46
|
+
end
|
47
|
+
end while restart
|
48
|
+
end
|
49
|
+
|
50
|
+
def stop
|
51
|
+
@stopping = true
|
52
|
+
stop_em
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def stop_em
|
58
|
+
begin
|
59
|
+
EM.stop
|
60
|
+
rescue
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def listener(&block)
|
65
|
+
EM.run do
|
66
|
+
ws_settings = {ping: @ping}
|
67
|
+
ws = Faye::WebSocket::Client.new(@host, nil, ws_settings)
|
68
|
+
|
69
|
+
ws.on :message do |message|
|
70
|
+
data = nil
|
71
|
+
begin
|
72
|
+
data = JSON.parse(message.data, symbolize_names:true)
|
73
|
+
rescue => ex
|
74
|
+
block.call type:'error', message: "Message received, but couldn't parse: #{ex.message}"
|
75
|
+
end
|
76
|
+
content = data.inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo }
|
77
|
+
block.call(content) if data && block
|
78
|
+
end
|
79
|
+
|
80
|
+
ws.on :open do
|
81
|
+
block.call(type:'open') if block
|
82
|
+
@hooks.each do |hook|
|
83
|
+
ws.send({type:'register', id:hook}.to_json)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
ws.on :close do
|
88
|
+
block.call(type:'close') if block
|
89
|
+
stop_em
|
90
|
+
end
|
91
|
+
|
92
|
+
ws.on :error do
|
93
|
+
block.call(type:'error') if block
|
94
|
+
stop_em
|
95
|
+
end
|
96
|
+
end
|
97
|
+
block.call(type:'stopped')
|
98
|
+
rescue => ex
|
99
|
+
block.call type:'error', message:ex.message
|
100
|
+
rescue Interrupt
|
101
|
+
stop
|
102
|
+
block.call(type:'stopped')
|
103
|
+
end
|
104
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: websockethook
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Maciej Skierkowski
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-04-13 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: faye-websocket
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.9.2
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.9.2
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 3.2.0
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 3.2.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: codeclimate-test-reporter
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.4.7
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.4.7
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 10.4.2
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 10.4.2
|
69
|
+
description: Listen for web hooks in your app without creating a web service.
|
70
|
+
email:
|
71
|
+
- maciej@factor.io
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- "./spec/spec_helper.rb"
|
77
|
+
- "./spec/websockethook_spec.rb"
|
78
|
+
- lib/websockethook.rb
|
79
|
+
homepage: http://web.sockethook.io/
|
80
|
+
licenses:
|
81
|
+
- MIT
|
82
|
+
metadata: {}
|
83
|
+
post_install_message:
|
84
|
+
rdoc_options: []
|
85
|
+
require_paths:
|
86
|
+
- lib
|
87
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - ">="
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0'
|
92
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
requirements: []
|
98
|
+
rubyforge_project:
|
99
|
+
rubygems_version: 2.4.6
|
100
|
+
signing_key:
|
101
|
+
specification_version: 4
|
102
|
+
summary: A library for use the free web.sockethook.io service
|
103
|
+
test_files:
|
104
|
+
- "./spec/spec_helper.rb"
|
105
|
+
- "./spec/websockethook_spec.rb"
|