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 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"