salesforce_streamer 1.1.3 → 1.2.0

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
  SHA256:
3
- metadata.gz: e012e8556497f5507f2623d8894c61461185bd3204188ed5ad0a7aaf452a74de
4
- data.tar.gz: 1049dc30fa1244441e763cbd90229fe8788b269ea4b387a3fad22f256cbaea68
3
+ metadata.gz: 2174b14554d0de8cd9d40a4ed7d85323316a363915a7030dba34f392bfb7cf66
4
+ data.tar.gz: d841e9dca629409c5c0572267da8246d5f21e301c5c7c85d6f0f44cac32ca664
5
5
  SHA512:
6
- metadata.gz: ae36d194ebebaa1bd0b85009d84b6689ab1047e8c019617fd1d61dc50d412f6a46e06724948836ec7943516596e39c4cee0a3f0906e9cc53c21dc8010677f47d
7
- data.tar.gz: 456bb39dc8fc06b879b6611e6b2abab2b396f988b9daa0e7d191a38823698850267a653909b1471e0c99cdf01a43f00fc49d610cb1978107a8ff5433875cc120
6
+ metadata.gz: 11f4e6a58005ab86abbe38816e1b511bb2201bd4cdb66bfb90d918e9e7e8123158780b32f937106d39f70d987d9527ef25007aecd104063e647f3119bf601ab3
7
+ data.tar.gz: 951a5316f531b860f52c0c7198542414209a4384c9361a2e28f10f33ae92406c29def1e79d23f79ea987d04176a896e0186385b4ad1a3db64cf7a330ec9eabf9
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- salesforce_streamer (1.1.3)
4
+ salesforce_streamer (1.2.0)
5
5
  faye (= 0.8.9)
6
6
  restforce (~> 4.2)
7
7
 
@@ -11,7 +11,7 @@ GEM
11
11
  addressable (2.7.0)
12
12
  public_suffix (>= 2.0.2, < 5.0)
13
13
  ast (2.4.0)
14
- byebug (11.1.1)
14
+ byebug (11.1.3)
15
15
  codecov (0.1.16)
16
16
  json
17
17
  simplecov
@@ -49,9 +49,9 @@ GEM
49
49
  jwt (2.2.1)
50
50
  multipart-post (2.1.1)
51
51
  parallel (1.19.1)
52
- parser (2.7.0.5)
52
+ parser (2.7.1.2)
53
53
  ast (~> 2.4.0)
54
- public_suffix (4.0.3)
54
+ public_suffix (4.0.4)
55
55
  rack (2.2.2)
56
56
  rainbow (3.0.0)
57
57
  rake (13.0.1)
@@ -66,16 +66,16 @@ GEM
66
66
  rspec-core (~> 3.9.0)
67
67
  rspec-expectations (~> 3.9.0)
68
68
  rspec-mocks (~> 3.9.0)
69
- rspec-core (3.9.1)
70
- rspec-support (~> 3.9.1)
71
- rspec-expectations (3.9.1)
69
+ rspec-core (3.9.2)
70
+ rspec-support (~> 3.9.3)
71
+ rspec-expectations (3.9.2)
72
72
  diff-lcs (>= 1.2.0, < 2.0)
73
73
  rspec-support (~> 3.9.0)
74
74
  rspec-mocks (3.9.1)
75
75
  diff-lcs (>= 1.2.0, < 2.0)
76
76
  rspec-support (~> 3.9.0)
77
- rspec-support (3.9.2)
78
- rubocop (0.81.0)
77
+ rspec-support (3.9.3)
78
+ rubocop (0.82.0)
79
79
  jaro_winkler (~> 1.5.1)
80
80
  parallel (~> 1.10)
81
81
  parser (>= 2.7.0.1)
@@ -85,7 +85,7 @@ GEM
85
85
  unicode-display_width (>= 1.4.0, < 2.0)
86
86
  rubocop-performance (1.5.2)
87
87
  rubocop (>= 0.71.0)
88
- rubocop-rspec (1.38.1)
88
+ rubocop-rspec (1.39.0)
89
89
  rubocop (>= 0.68.1)
90
90
  ruby-progressbar (1.10.1)
91
91
  simplecov (0.18.5)
data/README.md CHANGED
@@ -20,6 +20,26 @@ And then execute:
20
20
 
21
21
  ## Usage
22
22
 
23
+ ### Middleware
24
+
25
+ You can initialize the streamer server with any number of middleware classes.
26
+ When a message is received by a PushTopic subscription, the chain of middleware
27
+ classes are executed before the message handler is called.
28
+
29
+ ```ruby
30
+ # config/initializers/streamer.rb
31
+ class MySimpleMiddleware
32
+ def initialize(handler)
33
+ @handler = handler
34
+ end
35
+ def call(message)
36
+ @handler.call(message)
37
+ end
38
+ end
39
+
40
+ SalesforceStreamer.config.use_middleware MySimpleMiddleware
41
+ ```
42
+
23
43
  ### Configure Push Topics
24
44
 
25
45
  Create a YAML file to configure your server subscriptions. The configuration
@@ -1,7 +1,8 @@
1
1
  module SalesforceStreamer
2
2
  # Manages server configuration.
3
3
  class Configuration
4
- attr_accessor :environment, :logger, :require_path, :config_file, :manage_topics, :server, :exception_adapter, :persistence_adapter, :redis_connection
4
+ attr_accessor :environment, :logger, :require_path, :config_file, :manage_topics,
5
+ :server, :exception_adapter, :persistence_adapter, :redis_connection, :middleware
5
6
 
6
7
  class << self
7
8
  attr_writer :instance
@@ -19,12 +20,21 @@ module SalesforceStreamer
19
20
  @manage_topics = false
20
21
  @config_file = './config/streamer.yml'
21
22
  @require_path = './config/environment'
23
+ @middleware = []
22
24
  end
23
25
 
24
26
  def manage_topics?
25
27
  @manage_topics
26
28
  end
27
29
 
30
+ def use_middleware(klass, *args, &block)
31
+ middleware << proc { |app| klass.new(app, *args, &block) }
32
+ end
33
+
34
+ def middleware_chain_for(app)
35
+ middleware.reduce(app) { |memo, middleware| middleware.call(memo) }
36
+ end
37
+
28
38
  def push_topic_data
29
39
  return @push_topic_data if @push_topic_data
30
40
 
@@ -20,6 +20,14 @@ module SalesforceStreamer
20
20
  ReplayPersistence.retrieve(name) || @static_replay
21
21
  end
22
22
 
23
+ def handle(message)
24
+ handle_chain.call(message)
25
+ ReplayPersistence.record @name, message.dig('event', 'replayId')
26
+ rescue StandardError => e
27
+ Log.error e
28
+ Configuration.instance.exception_adapter.call e
29
+ end
30
+
23
31
  def to_s
24
32
  "PushTopic id=#{id} name=#{name} handler=#{handler} " \
25
33
  "replay=#{replay} notify_for_fields=#{notify_for_fields} " \
@@ -38,6 +46,18 @@ module SalesforceStreamer
38
46
  raise(PushTopicHandlerMissingError, message)
39
47
  end
40
48
 
49
+ def handle_chain
50
+ Configuration.instance.middleware_chain_for(handler_proc)
51
+ end
52
+
53
+ def handler_proc
54
+ if handler_constant.respond_to? :perform_async
55
+ proc { |message| handler_constant.perform_async message }
56
+ else
57
+ handler_constant
58
+ end
59
+ end
60
+
41
61
  def strip_spaces(str)
42
62
  fail(NilQueryError, @name) unless str
43
63
 
@@ -34,9 +34,11 @@ module SalesforceStreamer
34
34
  def start_em
35
35
  EM.run do
36
36
  @push_topics.map do |topic|
37
- client.subscribe topic.name, replay: topic.replay.to_i do |msg|
38
- Log.info "Message received from topic #{topic.name}"
39
- MessageReceiver.call topic.name, topic.handler_constant, msg
37
+ client.subscribe topic.name, replay: topic.replay.to_i do |message|
38
+ replay_id = message.dig('event', 'replayId')
39
+ Log.info "Message #{replay_id} received from topic #{topic.name}"
40
+ topic.handle message
41
+ topic.id = replay_id
40
42
  end
41
43
  end
42
44
  end
@@ -1,3 +1,3 @@
1
1
  module SalesforceStreamer
2
- VERSION = '1.1.3'.freeze
2
+ VERSION = '1.2.0'.freeze
3
3
  end
@@ -14,7 +14,6 @@ require 'salesforce_streamer/topic_manager'
14
14
  require 'salesforce_streamer/salesforce_client'
15
15
  require 'salesforce_streamer/replay_persistence'
16
16
  require 'salesforce_streamer/redis_replay'
17
- require 'salesforce_streamer/message_receiver'
18
17
  require 'salesforce_streamer/server'
19
18
  require 'salesforce_streamer/version'
20
19
  require 'salesforce_streamer/launcher'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: salesforce_streamer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.3
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Scott Serok
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2020-04-03 00:00:00.000000000 Z
12
+ date: 2020-05-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: faye
@@ -163,7 +163,6 @@ files:
163
163
  - lib/salesforce_streamer/errors.rb
164
164
  - lib/salesforce_streamer/launcher.rb
165
165
  - lib/salesforce_streamer/log.rb
166
- - lib/salesforce_streamer/message_receiver.rb
167
166
  - lib/salesforce_streamer/push_topic.rb
168
167
  - lib/salesforce_streamer/redis_replay.rb
169
168
  - lib/salesforce_streamer/replay_id_error_extension.rb
@@ -194,7 +193,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
194
193
  - !ruby/object:Gem::Version
195
194
  version: '0'
196
195
  requirements: []
197
- rubygems_version: 3.1.2
196
+ rubygems_version: 3.0.6
198
197
  signing_key:
199
198
  specification_version: 4
200
199
  summary: A wrapper around the Restforce Streaming API with a built-in PushTopic manager.
@@ -1,19 +0,0 @@
1
- module SalesforceStreamer
2
- class MessageReceiver
3
- class << self
4
- # @param topic [String] The unique Salesforce Topic name
5
- # @param handler [Object] An object that responds to .call(message)
6
- # @param message [Hash] The event payload
7
- def call(topic, handler, message)
8
- if handler.respond_to? :perform_async
9
- handler.perform_async message
10
- else
11
- handler.call message
12
- end
13
- ReplayPersistence.record topic, message.dig('event', 'replayId')
14
- rescue StandardError => e
15
- Configuration.instance.exception_adapter.call e
16
- end
17
- end
18
- end
19
- end