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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a9bdd9c58667318f072b3bb500d48e3595927593
4
- data.tar.gz: f715fdbb3226983ab489aa310166c58b8e922481
3
+ metadata.gz: 55b81e64e33c0af62107fd2c389333b28faa81d0
4
+ data.tar.gz: 743442e1f3890a4da4f211b3e353faa86db9fc9b
5
5
  SHA512:
6
- metadata.gz: dfa8fe137d40397d8f25ea78d86a48b9041fb24374aec759112efdc48eae8b27e4fccc459efca48c9b27db9a3b4767e8de28aa345e398beae4b58ba437cc2393
7
- data.tar.gz: 31772720c13d69ad9a4bb9445283eecab98af8294d1c487e8d74fdf31b757975a5ba80788c552b590dce004beb7ceff7d23f50de7ca7471de84a34dc066d5284
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 the purpose of performing validation.
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 run in a few different ways.
32
+ ActiveHook can be operated in a few different ways.
33
33
 
34
- #### Server Mode
34
+ #### The Server
35
35
 
36
- In order to send webhooks, we operate ActiveHook in server mode. This will be run as a seperate service beyond your web application (Rails, Sinatra, etc). To start the server simply type the following in your console.
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
- #### App Mode
58
+ #### Your Application
59
59
 
60
- In order to create webhooks, we operate ActiveHook in app mode. Like above, we need to provide information on Redis. We will also need to provide a path in our web application that can be used for validation. With Rails, we should place this configuration with our initializers.
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/base'
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 our webhook validator
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: 'http://example.com/webhook', payload: { msg: 'My first webhook!' })
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: 'http://example.com/webhook', payload: { msg: 'My first webhook!' }, retry_max: 3, retry_time: 3600)
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
- We will go over app webhook validation after the following section...
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 is easy. We should first add use the following config:
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/base'
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(webhook_params)
117
- if @webhook.hook_valid?
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
- private
133
+ The signature_valid? method will perform client-side validation. We can also perform server-side validation by doing the following:
123
134
 
124
- def webhook_params
125
- params.require(:hook_id, :hook_key, :payload)
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/base'
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(webhook_params)
149
- if @webhook.hook_valid?
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
- #### App Mode Validation
164
+ #### Server Validation
155
165
 
156
- Sending webhooks is one thing - ensuring they are from who we want is another.
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
- ActiveHook includes a piece of Rack middleware for the purpose of validation. 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.
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 (App mode config described above):
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
 
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require 'activehook'
4
- require 'activehook/server/base'
4
+ require 'activehook/server'
5
5
 
6
6
  server = ActiveHook::Server::Launcher.new(ARGV)
7
7
  server.start
@@ -4,6 +4,8 @@ require 'puma'
4
4
  require 'rack'
5
5
  require 'redis'
6
6
  require 'json'
7
+ require 'openssl'
8
+ require 'securerandom'
7
9
  require 'connection_pool'
8
10
  require 'activehook/config'
9
11
  require 'activehook/log'
@@ -3,6 +3,8 @@ ActiveHook.mode = :client
3
3
  require 'uri'
4
4
  require 'json'
5
5
  require 'net/http'
6
+ require 'openssl'
7
+ require 'rack'
6
8
  require 'activehook/config'
7
9
  require 'activehook/client/config'
8
10
  require 'activehook/client/recieve'
@@ -2,10 +2,11 @@ module ActiveHook
2
2
  module Client
3
3
  class Config < ActiveHook::BaseConfig
4
4
  OTHER_DEFAULTS = {
5
- validation_uri: 'http://localhost:3000/hooks/validate'
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 :hook_id, :hook_key
12
- attr_reader :payload
11
+ attr_accessor :request
13
12
 
14
- def hook_valid?
15
- @hook_valid ||= validate_hook
13
+ def initialize(options = {})
14
+ options.each { |key, value| send("#{key}=", value) }
16
15
  end
17
16
 
18
- def payload=(payload)
19
- @payload = JSON.parse(payload)
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 hook_valid?
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 validate_hook
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: @hook_id,
45
- key: @hook_key }.to_json
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
@@ -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) }
@@ -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 secure_payload
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 valid?
54
- HookValidator.new(id: @id, key: @key).server_valid?
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)
@@ -4,6 +4,7 @@ require 'redis'
4
4
  require 'json'
5
5
  require 'uri'
6
6
  require 'net/http'
7
+ require 'openssl'
7
8
  require 'connection_pool'
8
9
  require 'activehook/config'
9
10
  require 'activehook/redis'
@@ -21,15 +21,14 @@ module ActiveHook
21
21
  validate!
22
22
  start_messages
23
23
  create_workers
24
- sleep
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('SIGTERM', w[:pid].to_i) }
31
- Process.kill('SIGTERM', @master)
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
@@ -36,7 +36,7 @@ module ActiveHook
36
36
  class HookRunner
37
37
  def initialize(json)
38
38
  @hook = Hook.new(JSON.parse(json))
39
- @post = Send.new(uri: @hook.uri, payload: @hook.secure_payload)
39
+ @post = Send.new(hook: @hook)
40
40
  start
41
41
  end
42
42
 
@@ -7,8 +7,12 @@ module ActiveHook
7
7
 
8
8
  def start
9
9
  until @done
10
- retries = retrieve_retries
11
- update(retries) unless retries.empty?
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
- ActiveHook.redis.with do |conn|
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 update(retries)
29
- ActiveHook.redis.with do |conn|
30
- conn.pipelined do
31
- conn.zrem('ah:retry', retries)
32
- conn.incrby('ah:total_retries', retries.count)
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 :payload
11
- attr_reader :response_time, :uri, :status, :response
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=(uri)
23
- @uri = URI.parse(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, payload, REQUEST_HEADERS)
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
@@ -1,4 +1,4 @@
1
1
  module ActiveHook
2
- VERSION = '0.1.4'
2
+ VERSION = '0.1.5'
3
3
  CODENAME = 'Fat Sparrow'
4
4
  end
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
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-24 00:00:00.000000000 Z
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/base.rb
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/base.rb
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/base.rb
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: []