streamforce 0.1.0 → 0.1.1
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 +4 -4
- data/README.md +5 -28
- data/lib/streamforce/extension/logging.rb +22 -26
- data/lib/streamforce/message.rb +18 -6
- data/lib/streamforce/version.rb +1 -1
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 39b60e818f6a705ee63949e7ff6a48858565917a737691cb6a94c109e37f7342
|
4
|
+
data.tar.gz: ca563677771ec54e9fbef2a3ddf4de157d59d3e879ad9f7ad8841269da02bed3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1491f1d6772bf34b393879dfdec8b18b6310e28fcfcafe6f8136994b9c7667c09e07221a8dd52f032e9d746771802f80b87356534b65f33b2ba1a33290520f9a
|
7
|
+
data.tar.gz: fde46e8c412e01be566741d5474216ea55ea3e77f83cf29f19a3cd417017d646c64f9140cf153bd727a88997e9698fc7f54decf906cf0581b586e6c21c77e226
|
data/README.md
CHANGED
@@ -1,45 +1,22 @@
|
|
1
1
|
# Streamforce
|
2
2
|
|
3
|
-
In most cases,
|
3
|
+
In most cases, consuming events received from the Salesforce Streaming API can be
|
4
4
|
broken down into three very specific steps:
|
5
5
|
|
6
|
-
1. Connecting to the Salesforce API and listening for
|
6
|
+
1. Connecting to the Salesforce API and listening for messages
|
7
7
|
2. Ingesting received messages into some sort of internal event bus (e.g. RabbitMQ,
|
8
8
|
Kafka, Redis, etc)
|
9
9
|
3. Processing the stored messages
|
10
10
|
|
11
|
-
Streamforce aims to
|
12
|
-
|
13
|
-
[Restforce](https://github.com/restforce/restforce) provides a simple API to connect
|
14
|
-
to the Streaming API and consume messages:
|
15
|
-
|
16
|
-
```ruby
|
17
|
-
# Restforce uses faye as the underlying implementation for CometD.
|
18
|
-
require 'faye'
|
19
|
-
|
20
|
-
# Initialize a client with your username/password/oauth token/etc.
|
21
|
-
client = Restforce.new(username: 'foo',
|
22
|
-
password: 'bar',
|
23
|
-
security_token: 'security token',
|
24
|
-
client_id: 'client_id',
|
25
|
-
client_secret: 'client_secret')
|
26
|
-
|
27
|
-
EM.run do
|
28
|
-
# Subscribe to the PushTopic.
|
29
|
-
client.subscription '/topic/AllAccounts' do |message|
|
30
|
-
puts message.inspect
|
31
|
-
end
|
32
|
-
end
|
33
|
-
```
|
34
|
-
|
35
|
-
However, the above code is usable in a production environment because:
|
11
|
+
Streamforce aims to be an abstraction for the first step, by implementing some of the
|
12
|
+
common tasks that need to be performed by any well-behaved client:
|
36
13
|
|
37
14
|
* The interactions with the Streaming API need to be logged using the correct severity
|
38
15
|
(e.g. handshakes should use `Logger::DEBUG` while subscription errors should use
|
39
16
|
`Logger::ERROR` for better visibility)
|
40
17
|
* Replay IDs need to be stored using a persistent storage like Redis and not in-memory
|
41
18
|
|
42
|
-
|
19
|
+
As an alternative, checkout [Restforce](https://github.com/restforce/restforce).
|
43
20
|
|
44
21
|
## Usage
|
45
22
|
|
@@ -5,36 +5,36 @@ class Streamforce::Extension::Logging
|
|
5
5
|
|
6
6
|
def incoming(payload, callback)
|
7
7
|
message = Streamforce::Message.new(payload)
|
8
|
-
|
8
|
+
|
9
|
+
case message.channel
|
10
|
+
when "/meta/handshake"
|
11
|
+
log_incoming_handshake(message)
|
12
|
+
when "/meta/connect"
|
13
|
+
log_incoming_connect(message)
|
14
|
+
when "/meta/subscribe"
|
15
|
+
log_incoming_subscribe(message)
|
16
|
+
else
|
17
|
+
@logger.debug "[#{message.channel}] #{message.data}"
|
18
|
+
end
|
9
19
|
|
10
20
|
callback.call(payload)
|
11
21
|
end
|
12
22
|
|
13
23
|
def outgoing(payload, callback)
|
14
24
|
message = Streamforce::Message.new(payload)
|
15
|
-
log_outgoing_message(message)
|
16
|
-
|
17
|
-
callback.call(payload)
|
18
|
-
end
|
19
|
-
|
20
|
-
def log_incoming_message(message)
|
21
|
-
if message.channel_type == "meta"
|
22
|
-
public_send("log_incoming_#{message.channel_name}", message)
|
23
|
-
else
|
24
|
-
@logger.debug "[#{message.channel_name}] #{message.data}"
|
25
|
-
end
|
26
|
-
end
|
27
25
|
|
28
|
-
|
29
|
-
|
30
|
-
|
26
|
+
case message.channel
|
27
|
+
when "/meta/handshake"
|
28
|
+
@logger.debug "[Client] Handshake requested..."
|
29
|
+
when "/meta/connect"
|
30
|
+
debug message, "Sending connection request"
|
31
|
+
when "/meta/subscribe"
|
32
|
+
log_outgoing_subscribe(message)
|
31
33
|
else
|
32
|
-
@logger.debug "[#{message.
|
34
|
+
@logger.debug "[#{message.channel}] #{message.data}"
|
33
35
|
end
|
34
|
-
end
|
35
36
|
|
36
|
-
|
37
|
-
@logger.debug "[Client] Handshake requested..."
|
37
|
+
callback.call(payload)
|
38
38
|
end
|
39
39
|
|
40
40
|
def log_incoming_handshake(message)
|
@@ -45,10 +45,6 @@ class Streamforce::Extension::Logging
|
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
|
-
def log_outgoing_connect(message)
|
49
|
-
debug message, "Sending connection request"
|
50
|
-
end
|
51
|
-
|
52
48
|
def log_incoming_connect(message)
|
53
49
|
if message.success?
|
54
50
|
debug message, "Connection successful!"
|
@@ -60,9 +56,9 @@ class Streamforce::Extension::Logging
|
|
60
56
|
def log_outgoing_subscribe(message)
|
61
57
|
replay_id = message.replay_id
|
62
58
|
|
63
|
-
replay_info = if
|
59
|
+
replay_info = if message.no_replay?
|
64
60
|
"for all new messages"
|
65
|
-
elsif
|
61
|
+
elsif message.replay_available_messages?
|
66
62
|
"and requesting all stored messages"
|
67
63
|
else
|
68
64
|
"and requesting all messages newer than ##{replay_id}"
|
data/lib/streamforce/message.rb
CHANGED
@@ -3,8 +3,8 @@ class Streamforce::Message
|
|
3
3
|
@payload = payload
|
4
4
|
end
|
5
5
|
|
6
|
-
def
|
7
|
-
@payload["
|
6
|
+
def client_id
|
7
|
+
@payload["clientId"]
|
8
8
|
end
|
9
9
|
|
10
10
|
def id
|
@@ -19,10 +19,6 @@ class Streamforce::Message
|
|
19
19
|
@payload["channel"]
|
20
20
|
end
|
21
21
|
|
22
|
-
def client_id
|
23
|
-
@payload["clientId"]
|
24
|
-
end
|
25
|
-
|
26
22
|
def channel_type
|
27
23
|
channel.split("/")[1]
|
28
24
|
end
|
@@ -31,6 +27,10 @@ class Streamforce::Message
|
|
31
27
|
channel.split("/")[2]
|
32
28
|
end
|
33
29
|
|
30
|
+
def success?
|
31
|
+
@payload["successful"]
|
32
|
+
end
|
33
|
+
|
34
34
|
def data
|
35
35
|
@payload["data"]
|
36
36
|
end
|
@@ -43,6 +43,18 @@ class Streamforce::Message
|
|
43
43
|
channel == "/meta/subscribe"
|
44
44
|
end
|
45
45
|
|
46
|
+
def replay_from_message?
|
47
|
+
replay_id && replay_id != -1 && replay_id != -2
|
48
|
+
end
|
49
|
+
|
50
|
+
def replay_available_messages?
|
51
|
+
replay_id == -2
|
52
|
+
end
|
53
|
+
|
54
|
+
def no_replay?
|
55
|
+
replay_id.nil? || replay_id == -1
|
56
|
+
end
|
57
|
+
|
46
58
|
def error_message
|
47
59
|
@payload["error"]
|
48
60
|
end
|
data/lib/streamforce/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: streamforce
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrei Maxim
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-06-
|
11
|
+
date: 2024-06-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: zeitwerk
|
@@ -108,7 +108,7 @@ dependencies:
|
|
108
108
|
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
|
-
description:
|
111
|
+
description:
|
112
112
|
email:
|
113
113
|
- andrei@andreimaxim.ro
|
114
114
|
executables: []
|
@@ -133,7 +133,7 @@ metadata:
|
|
133
133
|
homepage_uri: https://github.com/andreimaxim/streamforce
|
134
134
|
source_code_uri: https://github.com/andreimaxim/streamforce
|
135
135
|
changelog_uri: https://github.com/andreimaxim/streamforce/blob/main/CHANGELOG.md
|
136
|
-
post_install_message:
|
136
|
+
post_install_message:
|
137
137
|
rdoc_options: []
|
138
138
|
require_paths:
|
139
139
|
- lib
|
@@ -149,7 +149,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
149
149
|
version: '0'
|
150
150
|
requirements: []
|
151
151
|
rubygems_version: 3.5.9
|
152
|
-
signing_key:
|
152
|
+
signing_key:
|
153
153
|
specification_version: 4
|
154
154
|
summary: Small wrapper over the Salesforce Streaming API
|
155
155
|
test_files: []
|