activehook 0.1.4 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +48 -38
- data/activehook.gemspec +2 -2
- data/bin/activehook-server +1 -1
- data/lib/activehook/{app/base.rb → app.rb} +2 -0
- data/lib/activehook/{client/base.rb → client.rb} +2 -0
- data/lib/activehook/client/config.rb +3 -2
- data/lib/activehook/client/recieve.rb +43 -10
- data/lib/activehook/config.rb +3 -2
- data/lib/activehook/hook.rb +8 -6
- data/lib/activehook/{server/base.rb → server.rb} +1 -0
- data/lib/activehook/server/manager.rb +3 -4
- data/lib/activehook/server/queue.rb +1 -1
- data/lib/activehook/server/retry.rb +16 -24
- data/lib/activehook/server/send.rb +9 -5
- data/lib/activehook/version.rb +1 -1
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 55b81e64e33c0af62107fd2c389333b28faa81d0
|
4
|
+
data.tar.gz: 743442e1f3890a4da4f211b3e353faa86db9fc9b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a80cc6ad62c7e317f6806c6c37673187448be63b8005d571d7a80566e7673def1e8a9398b9184240742f59144d404f5aca75d1de46411b7acf499cd15962118c
|
7
|
+
data.tar.gz: e09951cc388ce943b6a854d5d236b2d919c0980b1a4c1e981b2f0ddafa46cf60c63113f51e26891b95038ff391df460488d3560470c27c1deff64062aad3b5b0
|
data/README.md
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# ActiveHook
|
2
|
-
|
2
|
+
[![Code Climate](https://codeclimate.com/github/nsweeting/activehook/badges/gpa.svg)](https://codeclimate.com/github/nsweeting/activehook) [![Gem Version](https://badge.fury.io/rb/activehook.svg)](https://badge.fury.io/rb/activehook)
|
3
3
|
|
4
4
|
Fast and simple webhook delivery microservice for Ruby. **Please consider it under development at the moment.**
|
5
5
|
|
@@ -7,7 +7,7 @@ ActiveHook provides a scalable solution to your applications webhook sending nee
|
|
7
7
|
|
8
8
|
- A server for the purpose of sending webhooks. With support for retry attempts.
|
9
9
|
- A client-side mixin module for the purpose of recieving and validating webhooks.
|
10
|
-
- A piece of Rack middleware for
|
10
|
+
- A piece of Rack middleware for providing server-side validation.
|
11
11
|
|
12
12
|
## Installation
|
13
13
|
|
@@ -29,39 +29,39 @@ Or install it yourself as:
|
|
29
29
|
|
30
30
|
Before starting, ensure you have a functioning Redis server available.
|
31
31
|
|
32
|
-
ActiveHook can be
|
32
|
+
ActiveHook can be operated in a few different ways.
|
33
33
|
|
34
|
-
#### Server
|
34
|
+
#### The Server
|
35
35
|
|
36
|
-
In order to send webhooks, we
|
36
|
+
In order to send webhooks, we run the ActiveHook server. This is a seperate service beyond your web application (Rails, Sinatra, etc). To start the server simply type the following in your console.
|
37
37
|
|
38
38
|
$ bundle exec activehook-server -c config/activehook.rb
|
39
39
|
|
40
|
-
By providing a path to a configuration file, we can setup ActiveHook with plain old ruby. Below is a list of currently available server options:
|
40
|
+
By providing a path to a configuration file, we can setup ActiveHook with plain old ruby. In a rails application, this should be placed in your config folder. Below is a list of currently available server options:
|
41
41
|
|
42
42
|
```ruby
|
43
43
|
# ActiveHook server configuration
|
44
44
|
ActiveHook.configure do |config|
|
45
|
-
#Your redis server url
|
45
|
+
# Your redis server url
|
46
46
|
config.redis_url = ENV['REDIS_URL']
|
47
|
-
#The number of redis connections to provide
|
47
|
+
# The number of redis connections to provide
|
48
48
|
config.redis_pool = 10
|
49
|
-
#The number of forked workers to create for the server
|
49
|
+
# The number of forked workers to create for the server
|
50
50
|
config.workers = 2
|
51
|
-
#The number of queue threads to provide for each worker
|
51
|
+
# The number of queue threads to provide for each worker
|
52
52
|
config.queue_threads = 2
|
53
|
-
#The number of retry threads to provide for each worker
|
53
|
+
# The number of retry threads to provide for each worker
|
54
54
|
config.retry_threads = 1
|
55
55
|
end
|
56
56
|
```
|
57
57
|
|
58
|
-
####
|
58
|
+
#### Your Application
|
59
59
|
|
60
|
-
|
60
|
+
Before we can create webhooks within our application, we will need to do some setup. With Rails, we should place this configuration with your initializers. Below is a list of currently available application options:
|
61
61
|
|
62
62
|
```ruby
|
63
63
|
#IMPORTANT!
|
64
|
-
require 'activehook/app
|
64
|
+
require 'activehook/app'
|
65
65
|
|
66
66
|
# ActiveHook app configuration
|
67
67
|
ActiveHook.configure do |config|
|
@@ -69,41 +69,50 @@ ActiveHook.configure do |config|
|
|
69
69
|
config.redis_url = ENV['REDIS_URL']
|
70
70
|
#The number of redis connections to provide
|
71
71
|
config.redis_pool = 5
|
72
|
-
#The route to
|
72
|
+
#The route to the webhook validator if you want to enable server-side validation
|
73
73
|
config.validation_path = '/hooks/validate'
|
74
74
|
end
|
75
75
|
```
|
76
76
|
|
77
|
+
To provide webhooks to your users, you will also need to allow them to specify a URI and token. In Rails, we can do this by creating a migration like below:
|
78
|
+
|
79
|
+
```ruby
|
80
|
+
add_column :users, :webhook_uri, :string
|
81
|
+
add_column :users, :webhook_token, :string
|
82
|
+
```
|
83
|
+
|
77
84
|
With our app setup, we can create webhooks for processing. From within our application, all we have to do is:
|
78
85
|
|
79
86
|
```ruby
|
80
|
-
ActiveHook::Hook.new(uri:
|
87
|
+
ActiveHook::Hook.new(token: webhook_token, uri: webhook_uri, payload: { msg: 'My first webhook!' })
|
81
88
|
```
|
82
89
|
|
83
|
-
That's it! We provide a valid string URI, as well hash payload. ActiveHooks server will then attempt to send the webhook. If the webhook fails to be delivered, it will be sent to the retry queue. Delivery will be reattempted at the specified intervals, and eventually dropped if all attempts fail.
|
90
|
+
That's it! We provide a valid string token and URI, as well hash payload. ActiveHooks server will then attempt to send the webhook. If the webhook fails to be delivered, it will be sent to the retry queue. Delivery will be reattempted at the specified intervals, and eventually dropped if all attempts fail.
|
84
91
|
|
85
92
|
The default setting for failed webhooks is 3 more attempts at an interval of 3600 seconds (1 hour). You can change these values by including them in your hook initialization.
|
86
93
|
|
87
94
|
```ruby
|
88
|
-
ActiveHook::Hook.new(uri:
|
95
|
+
ActiveHook::Hook.new(token: webhook_token, uri: webhook_uri, payload: { msg: 'My first webhook!' }, retry_max: 3, retry_time: 3600)
|
89
96
|
```
|
90
97
|
|
91
|
-
|
92
|
-
|
93
|
-
#### Client Mode
|
98
|
+
#### Recieving
|
94
99
|
|
95
100
|
ActiveHook provides a class as well as mixin module for the purposes of recieving webhooks and performing validation on them. The class should be used for personal projects and testing, while the mixin module can be integrated with other application gems.
|
96
101
|
|
97
|
-
Using the class
|
102
|
+
Using the class or mixin, we are able to perform both client-side and server-side validation.
|
103
|
+
|
104
|
+
Using the class is easy. We should first add the following config:
|
98
105
|
|
99
106
|
```ruby
|
100
107
|
#IMPORTANT!
|
101
|
-
require 'activehook/client
|
108
|
+
require 'activehook/client'
|
102
109
|
|
103
110
|
# ActiveHook client configuration
|
104
111
|
ActiveHook.configure do |config|
|
105
|
-
#Your validation uri
|
112
|
+
# Your validation uri for server-side validation
|
106
113
|
config.validation_uri = 'http://localhost:3000/hooks/validate'
|
114
|
+
# Your validation token for client-side validation
|
115
|
+
config.validation_token = ENV['WEBHOOK_TOKEN']
|
107
116
|
end
|
108
117
|
```
|
109
118
|
|
@@ -113,29 +122,30 @@ If we were using Rails we could then do the following:
|
|
113
122
|
class WebhooksController < ApplicationController
|
114
123
|
|
115
124
|
def create
|
116
|
-
@webhook = ActiveHook::Recieve.new(
|
117
|
-
if @webhook.
|
125
|
+
@webhook = ActiveHook::Recieve.new(request: request)
|
126
|
+
if @webhook.signature_valid?
|
118
127
|
#We can now do stuff with the Hash @webhook.payload
|
119
128
|
end
|
120
129
|
end
|
130
|
+
end
|
131
|
+
```
|
121
132
|
|
122
|
-
|
133
|
+
The signature_valid? method will perform client-side validation. We can also perform server-side validation by doing the following:
|
123
134
|
|
124
|
-
|
125
|
-
|
126
|
-
end
|
127
|
-
end
|
135
|
+
```ruby
|
136
|
+
@webhook.server_valid?
|
128
137
|
```
|
129
138
|
|
130
139
|
Using the mixin module for our own classes would go like this:
|
131
140
|
|
132
141
|
```ruby
|
133
|
-
require 'activehook/client
|
142
|
+
require 'activehook/client'
|
134
143
|
|
135
144
|
module MyApp
|
136
145
|
class Webhook
|
137
146
|
include ActiveHook::Client::Recieve
|
138
147
|
|
148
|
+
VALIDATION_TOKEN = ENV['WEBHOOK_TOKEN']
|
139
149
|
#IMPORTANT! We will go over running the validation server next.
|
140
150
|
VALIDATION_URI = 'http://myapp.com/hooks/validate'
|
141
151
|
end
|
@@ -145,19 +155,19 @@ end
|
|
145
155
|
This would allow us to perform the same validation actions as in our Rails example, except we could use:
|
146
156
|
|
147
157
|
```ruby
|
148
|
-
@webhook = MyApp::Webhook.new(
|
149
|
-
if @webhook.
|
158
|
+
@webhook = MyApp::Webhook.new(request: request)
|
159
|
+
if @webhook.signature_valid?
|
150
160
|
#We can now do stuff with the Hash @webhook.payload
|
151
161
|
end
|
152
162
|
```
|
153
163
|
|
154
|
-
####
|
164
|
+
#### Server Validation
|
155
165
|
|
156
|
-
|
166
|
+
Along with client-side validation, ActiveHook also allows you to setup server-side validation. This utilizes a piece of Rack middleware.
|
157
167
|
|
158
|
-
|
168
|
+
When a client attempts to validate a webhook, they are sending a message back to your server. The message includes the hooks ID as well as key. These are are then cross-referenced with the server records. If they match, we provide the AOK.
|
159
169
|
|
160
|
-
We set the address that the middleware uses from our config file (
|
170
|
+
We set the address that the middleware uses from our config file (application config described above):
|
161
171
|
|
162
172
|
```ruby
|
163
173
|
config.validation_path = '/hooks/validate'
|
data/activehook.gemspec
CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = ActiveHook::VERSION
|
9
9
|
spec.authors = ["Nicholas Sweeting"]
|
10
10
|
spec.email = ["nsweeting@gmail.com"]
|
11
|
-
spec.summary = "Fast and simple webhook microservice for Ruby."
|
12
|
-
spec.description = "Fast and simple webhook microservice for Ruby."
|
11
|
+
spec.summary = "Fast and simple webhook delivery microservice for Ruby."
|
12
|
+
spec.description = "Fast and simple webhook delivery microservice for Ruby."
|
13
13
|
spec.homepage = "https://github.com/nsweeting/activehook"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
data/bin/activehook-server
CHANGED
@@ -2,10 +2,11 @@ module ActiveHook
|
|
2
2
|
module Client
|
3
3
|
class Config < ActiveHook::BaseConfig
|
4
4
|
OTHER_DEFAULTS = {
|
5
|
-
validation_uri: '
|
5
|
+
validation_uri: '',
|
6
|
+
validation_token: ''
|
6
7
|
}.freeze
|
7
8
|
|
8
|
-
attr_accessor :validation_uri
|
9
|
+
attr_accessor :validation_uri, :validation_token
|
9
10
|
|
10
11
|
def initialize
|
11
12
|
super
|
@@ -8,31 +8,56 @@ module ActiveHook
|
|
8
8
|
"User-Agent" => "ActiveHook/#{ActiveHook::VERSION}"
|
9
9
|
}.freeze
|
10
10
|
|
11
|
-
attr_accessor :
|
12
|
-
attr_reader :payload
|
11
|
+
attr_accessor :request
|
13
12
|
|
14
|
-
def
|
15
|
-
|
13
|
+
def initialize(options = {})
|
14
|
+
options.each { |key, value| send("#{key}=", value) }
|
16
15
|
end
|
17
16
|
|
18
|
-
def
|
19
|
-
@
|
17
|
+
def signature_valid?
|
18
|
+
@signature_valid ||= validate_signature
|
19
|
+
end
|
20
|
+
|
21
|
+
def server_valid?
|
22
|
+
@server_valid ||= validate_server
|
23
|
+
end
|
24
|
+
|
25
|
+
def payload
|
26
|
+
parsed_body['payload']
|
20
27
|
rescue
|
21
28
|
nil
|
22
29
|
end
|
23
30
|
|
24
31
|
def validated_payload
|
25
|
-
raise StandardError, 'Webhook is invalid.' unless
|
32
|
+
raise StandardError, 'Webhook is invalid.' unless signature_valid?
|
26
33
|
@payload
|
27
34
|
end
|
28
35
|
|
29
36
|
private
|
30
37
|
|
38
|
+
def parsed_body
|
39
|
+
@parsed_body ||= JSON.parse(request.body.read)
|
40
|
+
rescue
|
41
|
+
{}
|
42
|
+
end
|
43
|
+
|
44
|
+
def hook_id
|
45
|
+
parsed_body['hook_id']
|
46
|
+
end
|
47
|
+
|
48
|
+
def hook_key
|
49
|
+
parsed_body['hook_key']
|
50
|
+
end
|
51
|
+
|
31
52
|
def hook_uri
|
32
53
|
@hook_uri ||= URI.parse(self.class::VALIDATION_URI)
|
33
54
|
end
|
34
55
|
|
35
|
-
def
|
56
|
+
def hook_signature
|
57
|
+
@request.env['HTTP_X-Webhook-Signature']
|
58
|
+
end
|
59
|
+
|
60
|
+
def validate_server
|
36
61
|
http = Net::HTTP.new(hook_uri.host, hook_uri.port)
|
37
62
|
response = http.post(hook_uri.path, hook_json, REQUEST_HEADERS)
|
38
63
|
response.code.to_i == 200 ? true : false
|
@@ -40,9 +65,16 @@ module ActiveHook
|
|
40
65
|
false
|
41
66
|
end
|
42
67
|
|
68
|
+
def validate_signature
|
69
|
+
signature = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha1'), self.class::VALIDATION_TOKEN, payload)
|
70
|
+
Rack::Utils.secure_compare(signature, hook_signature)
|
71
|
+
rescue
|
72
|
+
false
|
73
|
+
end
|
74
|
+
|
43
75
|
def hook_json
|
44
|
-
{ id:
|
45
|
-
key:
|
76
|
+
{ id: hook_id,
|
77
|
+
key: hook_key }.to_json
|
46
78
|
end
|
47
79
|
end
|
48
80
|
end
|
@@ -51,5 +83,6 @@ module ActiveHook
|
|
51
83
|
include ActiveHook::Client::Recieve
|
52
84
|
|
53
85
|
VALIDATION_URI = (ActiveHook.config.validation_uri).freeze
|
86
|
+
VALIDATION_TOKEN = (ActiveHook.config.validation_token).freeze
|
54
87
|
end
|
55
88
|
end
|
data/lib/activehook/config.rb
CHANGED
@@ -28,10 +28,11 @@ module ActiveHook
|
|
28
28
|
class BaseConfig
|
29
29
|
BASE_DEFAULTS = {
|
30
30
|
redis_url: ENV['REDIS_URL'],
|
31
|
-
redis_pool: 5
|
31
|
+
redis_pool: 5,
|
32
|
+
signature_header: 'X-Webhook-Signature'
|
32
33
|
}.freeze
|
33
34
|
|
34
|
-
attr_accessor :redis_url, :redis_pool
|
35
|
+
attr_accessor :redis_url, :redis_pool, :signature_header
|
35
36
|
|
36
37
|
def initialize
|
37
38
|
BASE_DEFAULTS.each { |key, value| send("#{key}=", value) }
|
data/lib/activehook/hook.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
|
-
require 'securerandom'
|
2
|
-
|
3
1
|
module ActiveHook
|
4
2
|
class Hook
|
5
|
-
attr_accessor :uri, :payload, :id, :key, :retry_max, :retry_time, :created_at
|
3
|
+
attr_accessor :token, :uri, :payload, :id, :key, :retry_max, :retry_time, :created_at
|
6
4
|
|
7
5
|
def initialize(options = {})
|
8
6
|
options = defaults.merge(options)
|
@@ -37,6 +35,7 @@ module ActiveHook
|
|
37
35
|
def to_json
|
38
36
|
{ id: @id,
|
39
37
|
key: @key,
|
38
|
+
token: @token,
|
40
39
|
created_at: @created_at,
|
41
40
|
retry_time: @retry_time,
|
42
41
|
retry_max: @retry_max,
|
@@ -44,14 +43,16 @@ module ActiveHook
|
|
44
43
|
payload: @payload }.to_json
|
45
44
|
end
|
46
45
|
|
47
|
-
def
|
46
|
+
def final_payload
|
48
47
|
{ hook_id: @id,
|
49
48
|
hook_key: @key,
|
49
|
+
hook_time: @created_at,
|
50
|
+
hook_signature: ActiveHook.config.signature_header,
|
50
51
|
payload: @payload }.to_json
|
51
52
|
end
|
52
53
|
|
53
|
-
def
|
54
|
-
|
54
|
+
def signature
|
55
|
+
OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha1'), @token, final_payload)
|
55
56
|
end
|
56
57
|
|
57
58
|
private
|
@@ -64,6 +65,7 @@ module ActiveHook
|
|
64
65
|
end
|
65
66
|
|
66
67
|
def validate!
|
68
|
+
raise Errors::Hook, 'Token must be a String.' unless @token.is_a?(String)
|
67
69
|
raise Errors::Hook, 'Payload must be a Hash.' unless @payload.is_a?(Hash)
|
68
70
|
raise Errors::Hook, 'URI is not a valid format.' unless @uri =~ /\A#{URI::regexp}\z/
|
69
71
|
raise Errors::Hook, 'Created at must be an Integer.' unless @created_at.is_a?(Integer)
|
@@ -21,15 +21,14 @@ module ActiveHook
|
|
21
21
|
validate!
|
22
22
|
start_messages
|
23
23
|
create_workers
|
24
|
-
|
24
|
+
Process.wait
|
25
25
|
end
|
26
26
|
|
27
27
|
# Shutsdown our Worker processes.
|
28
28
|
#
|
29
29
|
def shutdown
|
30
|
-
@forks.each { |w| Process.kill('
|
31
|
-
Process.kill('
|
32
|
-
exit
|
30
|
+
@forks.each { |w| Process.kill('SIGINT', w[:pid].to_i) }
|
31
|
+
Process.kill('SIGINT', @master)
|
33
32
|
end
|
34
33
|
|
35
34
|
private
|
@@ -7,8 +7,12 @@ module ActiveHook
|
|
7
7
|
|
8
8
|
def start
|
9
9
|
until @done
|
10
|
-
|
11
|
-
|
10
|
+
ActiveHook.redis.with do |conn|
|
11
|
+
conn.watch('ah:retry') do
|
12
|
+
retries = retrieve_retries(conn)
|
13
|
+
update_retries(conn, retries)
|
14
|
+
end
|
15
|
+
end
|
12
16
|
sleep 2
|
13
17
|
end
|
14
18
|
end
|
@@ -19,32 +23,20 @@ module ActiveHook
|
|
19
23
|
|
20
24
|
private
|
21
25
|
|
22
|
-
def retrieve_retries
|
23
|
-
|
24
|
-
conn.zrangebyscore('ah:retry', 0, Time.now.to_i)
|
25
|
-
end
|
26
|
+
def retrieve_retries(conn)
|
27
|
+
conn.zrangebyscore('ah:retry', 0, Time.now.to_i)
|
26
28
|
end
|
27
29
|
|
28
|
-
def
|
29
|
-
|
30
|
-
conn.
|
31
|
-
|
32
|
-
|
30
|
+
def update_retries(conn, retries)
|
31
|
+
if retries.any?
|
32
|
+
conn.multi do |multi|
|
33
|
+
multi.incrby('ah:total_retries', retries.count)
|
34
|
+
multi.zrem('ah:retry', retries)
|
35
|
+
multi.lpush('ah:queue', retries)
|
33
36
|
end
|
37
|
+
else
|
38
|
+
conn.unwatch
|
34
39
|
end
|
35
|
-
retries.each { |r| RetryRunner.new(r) }
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
class RetryRunner
|
40
|
-
def initialize(json)
|
41
|
-
@json = json
|
42
|
-
@hook = Hook.new(JSON.parse(@json))
|
43
|
-
start
|
44
|
-
end
|
45
|
-
|
46
|
-
def start
|
47
|
-
@hook.perform
|
48
40
|
end
|
49
41
|
end
|
50
42
|
end
|
@@ -7,8 +7,8 @@ module ActiveHook
|
|
7
7
|
|
8
8
|
module Server
|
9
9
|
class Send
|
10
|
-
attr_accessor :
|
11
|
-
attr_reader :response_time, :
|
10
|
+
attr_accessor :hook
|
11
|
+
attr_reader :response_time, :status, :response
|
12
12
|
|
13
13
|
def initialize(options = {})
|
14
14
|
options.each { |key, value| send("#{key}=", value) }
|
@@ -19,8 +19,8 @@ module ActiveHook
|
|
19
19
|
log_status
|
20
20
|
end
|
21
21
|
|
22
|
-
def uri
|
23
|
-
@uri
|
22
|
+
def uri
|
23
|
+
@uri ||= URI.parse(@hook.uri)
|
24
24
|
end
|
25
25
|
|
26
26
|
def success?
|
@@ -32,7 +32,7 @@ module ActiveHook
|
|
32
32
|
def post_hook
|
33
33
|
http = Net::HTTP.new(uri.host, uri.port)
|
34
34
|
measure_response_time do
|
35
|
-
@response = http.post(uri.path,
|
35
|
+
@response = http.post(uri.path, @hook.final_payload, final_headers)
|
36
36
|
end
|
37
37
|
response_status(@response)
|
38
38
|
rescue
|
@@ -65,6 +65,10 @@ module ActiveHook
|
|
65
65
|
ActiveHook.log.err(msg)
|
66
66
|
end
|
67
67
|
end
|
68
|
+
|
69
|
+
def final_headers
|
70
|
+
{ "X-Hook-Signature" => @hook.signature }.merge(REQUEST_HEADERS)
|
71
|
+
end
|
68
72
|
end
|
69
73
|
end
|
70
74
|
end
|
data/lib/activehook/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activehook
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nicholas Sweeting
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-06-
|
11
|
+
date: 2016-06-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|
@@ -136,7 +136,7 @@ dependencies:
|
|
136
136
|
- - "~>"
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0.5'
|
139
|
-
description: Fast and simple webhook microservice for Ruby.
|
139
|
+
description: Fast and simple webhook delivery microservice for Ruby.
|
140
140
|
email:
|
141
141
|
- nsweeting@gmail.com
|
142
142
|
executables:
|
@@ -159,12 +159,12 @@ files:
|
|
159
159
|
- bin/console
|
160
160
|
- bin/setup
|
161
161
|
- lib/activehook.rb
|
162
|
-
- lib/activehook/app
|
162
|
+
- lib/activehook/app.rb
|
163
163
|
- lib/activehook/app/config.rb
|
164
164
|
- lib/activehook/app/config.ru
|
165
165
|
- lib/activehook/app/launcher.rb
|
166
166
|
- lib/activehook/app/middleware.rb
|
167
|
-
- lib/activehook/client
|
167
|
+
- lib/activehook/client.rb
|
168
168
|
- lib/activehook/client/config.rb
|
169
169
|
- lib/activehook/client/recieve.rb
|
170
170
|
- lib/activehook/config.rb
|
@@ -172,7 +172,7 @@ files:
|
|
172
172
|
- lib/activehook/hook.rb
|
173
173
|
- lib/activehook/log.rb
|
174
174
|
- lib/activehook/redis.rb
|
175
|
-
- lib/activehook/server
|
175
|
+
- lib/activehook/server.rb
|
176
176
|
- lib/activehook/server/config.rb
|
177
177
|
- lib/activehook/server/launcher.rb
|
178
178
|
- lib/activehook/server/manager.rb
|
@@ -205,5 +205,5 @@ rubyforge_project:
|
|
205
205
|
rubygems_version: 2.5.0
|
206
206
|
signing_key:
|
207
207
|
specification_version: 4
|
208
|
-
summary: Fast and simple webhook microservice for Ruby.
|
208
|
+
summary: Fast and simple webhook delivery microservice for Ruby.
|
209
209
|
test_files: []
|