telesink 1.1.0 → 1.2.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 +4 -4
- data/CHANGELOG.md +7 -1
- data/README.md +19 -26
- data/lib/telesink/version.rb +1 -1
- data/lib/telesink.rb +23 -74
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a79d264813b7ba665cc3deff43aa4fed213cb7b12f213c0646619033d4cd5947
|
|
4
|
+
data.tar.gz: f78cee29a3575b63b8a2cefcef05c1acf48f65a583827b43fb5c66eed885cbc7
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8c4ac33341bbb7e543811df49080fc0a09584287d904e4efe7e29775e19e025e6a2e35d1b27058b3e308c406aa1683761c43f2aac311db34f34daf95dd032c42
|
|
7
|
+
data.tar.gz: 227787e27f4cadf87ddfd8b80799c6f06fc1c3e55f2f00779a334145599abe440e5ffb3777fa84fc4ae0f41d343a4ec6bd38bf2addacc4d54fa77976e17e9ae9
|
data/CHANGELOG.md
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Telesink Changelog
|
|
2
2
|
|
|
3
3
|
## master
|
|
4
4
|
|
|
5
|
+
## 1.2.0 - 2026-04-19
|
|
6
|
+
|
|
7
|
+
- Replaced `Telesink.configure` block with `Telesink.init` for simpler setup.
|
|
8
|
+
- Removed `Config` class. Options are now set directly on the module.
|
|
9
|
+
- Added the `TELESINK_DISABLED` environment variable.
|
|
10
|
+
|
|
5
11
|
## 1.1.0 - 2026-04-19
|
|
6
12
|
|
|
7
13
|
- Merged `TELESINK_BASE_URL` and `TELESINK_TOKEN` into `TELESINK_ENDPOINT`.
|
data/README.md
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# Telesink SDK for Ruby
|
|
2
2
|
|
|
3
|
-
Official Ruby client for [telesink.com](https://telesink.com) - real-time event
|
|
3
|
+
Official Ruby client for [telesink.com](https://telesink.com) - real-time event
|
|
4
|
+
tracking.
|
|
4
5
|
|
|
5
6
|
## Requirements
|
|
6
7
|
|
|
@@ -10,7 +11,7 @@ Official Ruby client for [telesink.com](https://telesink.com) - real-time event
|
|
|
10
11
|
|
|
11
12
|
### Install
|
|
12
13
|
|
|
13
|
-
Add
|
|
14
|
+
Add to your `Gemfile`:
|
|
14
15
|
|
|
15
16
|
```ruby
|
|
16
17
|
gem "telesink"
|
|
@@ -24,27 +25,16 @@ bundle install
|
|
|
24
25
|
|
|
25
26
|
### Configuration
|
|
26
27
|
|
|
27
|
-
|
|
28
|
+
Set the environment variable:
|
|
28
29
|
|
|
29
30
|
```sh
|
|
30
|
-
export
|
|
31
|
-
# Optional:
|
|
32
|
-
# export TELESINK_BASE_URL=https://custom.telesink.com
|
|
31
|
+
export TELESINK_ENDPOINT=https://app.telesink.com/api/v1/sinks/your_sink_token_here/events
|
|
33
32
|
```
|
|
34
33
|
|
|
35
|
-
|
|
34
|
+
To disable tracking (e.g. in test/dev):
|
|
36
35
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
```rb
|
|
40
|
-
require "telesink"
|
|
41
|
-
|
|
42
|
-
Telesink.configure do |config|
|
|
43
|
-
config.token = <sink-token> # required
|
|
44
|
-
config.base_url = "https://telesink.com" # default
|
|
45
|
-
config.enabled = true # default
|
|
46
|
-
config.logger = Logger.new(STDERR)
|
|
47
|
-
end
|
|
36
|
+
```sh
|
|
37
|
+
export TELESINK_DISABLED=true
|
|
48
38
|
```
|
|
49
39
|
|
|
50
40
|
### Usage
|
|
@@ -53,23 +43,26 @@ end
|
|
|
53
43
|
Telesink.track(
|
|
54
44
|
event: "user.signed.up",
|
|
55
45
|
text: "New user registered",
|
|
56
|
-
emoji: "
|
|
57
|
-
properties: {
|
|
58
|
-
|
|
59
|
-
|
|
46
|
+
emoji: "👤",
|
|
47
|
+
properties: {
|
|
48
|
+
plan: "pro",
|
|
49
|
+
source: "landing_page",
|
|
50
|
+
},
|
|
51
|
+
occurred_at: Time.now, # optional, defaults to now
|
|
52
|
+
idempotency_key: "my-key", # optional, defaults to random UUID
|
|
60
53
|
)
|
|
61
54
|
```
|
|
62
55
|
|
|
63
56
|
#### Returns
|
|
64
57
|
|
|
65
|
-
- `true`
|
|
66
|
-
- `false`
|
|
58
|
+
- `true` — event sent successfully
|
|
59
|
+
- `false` — disabled, missing endpoint, or network error
|
|
67
60
|
|
|
68
|
-
|
|
61
|
+
Errors are never raised. They are logged to STDERR and fail silently.
|
|
69
62
|
|
|
70
63
|
### Testing
|
|
71
64
|
|
|
72
|
-
```
|
|
65
|
+
```sh
|
|
73
66
|
bundle exec rake test
|
|
74
67
|
```
|
|
75
68
|
|
data/lib/telesink/version.rb
CHANGED
data/lib/telesink.rb
CHANGED
|
@@ -9,95 +9,44 @@ require "logger"
|
|
|
9
9
|
require_relative "telesink/version"
|
|
10
10
|
|
|
11
11
|
module Telesink
|
|
12
|
-
|
|
13
|
-
attr_accessor :endpoint, :enabled, :logger
|
|
14
|
-
|
|
15
|
-
def initialize
|
|
16
|
-
@endpoint = ENV["TELESINK_ENDPOINT"]
|
|
17
|
-
@enabled = true
|
|
18
|
-
@logger = ::Logger.new(STDERR)
|
|
19
|
-
end
|
|
20
|
-
end
|
|
12
|
+
LOG = ::Logger.new(STDERR)
|
|
21
13
|
|
|
22
14
|
class << self
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
def config
|
|
26
|
-
@config ||= Config.new
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def configure
|
|
30
|
-
yield config
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def track(
|
|
34
|
-
event:,
|
|
35
|
-
text:,
|
|
36
|
-
emoji: nil,
|
|
37
|
-
properties: {},
|
|
38
|
-
occurred_at: nil,
|
|
39
|
-
idempotency_key: nil
|
|
40
|
-
)
|
|
41
|
-
return false unless config.enabled
|
|
42
|
-
return false if config.endpoint.to_s.empty?
|
|
43
|
-
|
|
44
|
-
occurred_at = (occurred_at || Time.now).utc.iso8601
|
|
45
|
-
idempotency_key = (idempotency_key.to_s.empty? ? SecureRandom.uuid : idempotency_key)
|
|
15
|
+
def track(event:, text:, emoji: nil, properties: {}, occurred_at: nil, idempotency_key: nil)
|
|
16
|
+
return false unless enabled? && endpoint
|
|
46
17
|
|
|
47
18
|
payload = {
|
|
48
19
|
event: event,
|
|
49
20
|
text: text,
|
|
50
21
|
emoji: emoji,
|
|
51
22
|
properties: properties,
|
|
52
|
-
occurred_at: occurred_at,
|
|
53
|
-
idempotency_key: idempotency_key,
|
|
54
|
-
sdk: {
|
|
55
|
-
name: "telesink.ruby",
|
|
56
|
-
version: VERSION
|
|
57
|
-
}
|
|
23
|
+
occurred_at: (occurred_at || Time.now).utc.iso8601,
|
|
24
|
+
idempotency_key: idempotency_key || SecureRandom.uuid,
|
|
25
|
+
sdk: { name: "telesink.ruby", version: VERSION }
|
|
58
26
|
}.compact
|
|
59
27
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
28
|
+
uri = URI(endpoint)
|
|
29
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
|
30
|
+
http.use_ssl = uri.scheme == "https"
|
|
31
|
+
http.open_timeout = http.read_timeout = 3
|
|
32
|
+
http.write_timeout = 3 if http.respond_to?(:write_timeout)
|
|
63
33
|
|
|
64
|
-
|
|
34
|
+
req = Net::HTTP::Post.new(uri)
|
|
35
|
+
req["Content-Type"] = "application/json"
|
|
36
|
+
req["User-Agent"] = "telesink.ruby/#{VERSION}"
|
|
37
|
+
req["Idempotency-Key"] = payload[:idempotency_key]
|
|
38
|
+
req.body = payload.to_json
|
|
65
39
|
|
|
66
|
-
|
|
67
|
-
send_event(payload, idempotency_key)
|
|
68
|
-
rescue Net::OpenTimeout,
|
|
69
|
-
Net::ReadTimeout,
|
|
70
|
-
Net::WriteTimeout,
|
|
71
|
-
SocketError,
|
|
72
|
-
SystemCallError,
|
|
73
|
-
IOError,
|
|
74
|
-
Errno::ECONNREFUSED,
|
|
75
|
-
Errno::ECONNRESET => e
|
|
76
|
-
config.logger.error("[Telesink] Network error sending '#{payload[:event]}': #{e.class} - #{e.message}")
|
|
40
|
+
http.request(req).is_a?(Net::HTTPSuccess)
|
|
77
41
|
rescue => e
|
|
78
|
-
|
|
42
|
+
logger.error("[Telesink] #{e.class}: #{e.message}")
|
|
43
|
+
false
|
|
79
44
|
end
|
|
80
45
|
|
|
81
|
-
|
|
82
|
-
uri = URI(config.endpoint)
|
|
83
|
-
http = Net::HTTP.new(uri.host, uri.port)
|
|
84
|
-
http.use_ssl = true
|
|
85
|
-
http.open_timeout = 3
|
|
86
|
-
http.read_timeout = 3
|
|
87
|
-
http.write_timeout = 3 if http.respond_to?(:write_timeout)
|
|
88
|
-
|
|
89
|
-
request = Net::HTTP::Post.new(uri)
|
|
90
|
-
request["Content-Type"] = "application/json"
|
|
91
|
-
request["User-Agent"] = "telesink.ruby/#{VERSION}"
|
|
92
|
-
request["Idempotency-Key"] = idempotency_key
|
|
93
|
-
|
|
94
|
-
request.body = payload.to_json
|
|
95
|
-
response = http.request(request)
|
|
46
|
+
private
|
|
96
47
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
response
|
|
101
|
-
end
|
|
48
|
+
def endpoint = ENV["TELESINK_ENDPOINT"]
|
|
49
|
+
def enabled? = ENV["TELESINK_DISABLED"].to_s.empty?
|
|
50
|
+
def logger = LOG
|
|
102
51
|
end
|
|
103
52
|
end
|