websockethook 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,8 @@
1
+ require "codeclimate-test-reporter"
2
+ require 'rspec'
3
+
4
+ CodeClimate::TestReporter.start if ENV['CODECLIMATE_REPO_TOKEN']
5
+
6
+ RSpec.configure do |c|
7
+
8
+ end
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+
3
+ require 'websockethook'
4
+
5
+ describe WebSocketHook do
6
+
7
+ it 'can initialize' do
8
+ expect {
9
+ ws = WebSocketHook.new
10
+ }.to_not raise_error
11
+ end
12
+ end
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"