skyfall 0.2.5 → 0.3.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: 965eb9da488c1af0a4ea4573de3677572f6acdfab64497ce65bf0f3ba11ac015
4
- data.tar.gz: 0fa130b4da079e253de127813e245a5851eaa9c83651e955099b070a65a7396e
3
+ metadata.gz: 34e2166dc123a74140ce5cae67d3c000c1f88972d15cbe8a2550bde11ba4034d
4
+ data.tar.gz: 334f4b8b0ddce03b2258a0266e01e08cac9528924ac13380e91b66a0bb1217b8
5
5
  SHA512:
6
- metadata.gz: c0a2f258e2a96d0fb6e9f1206df3dadcad9543bf5898fdc3702e74e097c3f5758b7a6c33d8b3dbfaa437b4718122e2a4c199b70d2e9c12ea5686645cbcd414b7
7
- data.tar.gz: 417f34ff64333390397a91e6cbc9364b858b015a000759a6beccfed3bf81b448b8261c4fdfeed7ae3ebadaa995f380837b6cc543aceec83342884e8ff8e48b11
6
+ metadata.gz: f56ab132941d80a577e5f3ba630b58d6f99548d0cde398fdb4f15e7c24d9557c3b0243d64a3940c18bf370afb219df3282c935300fc0359b6b0e00915b7002ca
7
+ data.tar.gz: 4bd7672a9450d8b1ec80ec679b69e6ba4242c4a6554865e296e7a347769795239b99a95539fe0b637407c2736b0716dfc8d1c3a9dea2d8d7a9654b47158262c9
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ ## [0.3.0] - 2024-03-21
2
+
3
+ - added support for labeller firehose, served by labeller services at the `com.atproto.label.subscribeLabels` endpoint (aliased as `:subscribe_labels`)
4
+ - the `#labels` messages from the labeller firehose are parsed into a `LabelsMessage`, which includes a `labels` array of `Label` objects
5
+ - `Stream` callbacks can now also be assigned via setters, e.g. `stream.on_message = proc { ... }`
6
+ - added default error handler to `Stream` which logs the error to `$stdout` - set `stream.on_error = nil` to disable
7
+ - added Ruby stdlib dependencies explicitly to the gemspec - fixes a warning in Ruby 3.3 when requiring `base64`, which will be extracted as an optional gem in 3.4
8
+
1
9
  ## [0.2.5] - 2024-03-14
2
10
 
3
11
  - added `:bsky_labeler` record type symbol & collection constant
@@ -0,0 +1,63 @@
1
+ require_relative 'errors'
2
+ require 'time'
3
+
4
+ module Skyfall
5
+ class Label
6
+ attr_reader :data
7
+
8
+ def initialize(data)
9
+ @data = data
10
+
11
+ raise DecodeError.new("Missing version: #{data}") unless data.has_key?('ver')
12
+ raise DecodeError.new("Invalid version: #{ver}") unless ver.is_a?(Integer) && ver >= 1
13
+ raise UnsupportedError.new("Unsupported version: #{ver}") unless ver == 1
14
+
15
+ raise DecodeError.new("Missing source: #{data}") unless data.has_key?('src')
16
+ raise DecodeError.new("Invalid source: #{src}") unless src.is_a?(String) && src.start_with?('did:')
17
+
18
+ raise DecodeError.new("Missing uri: #{data}") unless data.has_key?('uri')
19
+ raise DecodeError.new("Invalid uri: #{uri}") unless uri.is_a?(String)
20
+ raise DecodeError.new("Invalid uri: #{uri}") unless uri.start_with?('at://') || uri.start_with?('did:')
21
+ end
22
+
23
+ def version
24
+ @data['ver']
25
+ end
26
+
27
+ def authority
28
+ @data['src']
29
+ end
30
+
31
+ def subject
32
+ @data['uri']
33
+ end
34
+
35
+ def cid
36
+ @cid ||= @data['cid'] && CID.from_json(@data['cid'])
37
+ end
38
+
39
+ def value
40
+ @data['val']
41
+ end
42
+
43
+ def negation?
44
+ !!@data['neg']
45
+ end
46
+
47
+ def created_at
48
+ @created_at ||= Time.parse(@data['cts'])
49
+ end
50
+
51
+ def expires_at
52
+ @expires_at ||= @data['exp'] && Time.parse(@data['exp'])
53
+ end
54
+
55
+ alias ver version
56
+ alias src authority
57
+ alias uri subject
58
+ alias val value
59
+ alias neg negation?
60
+ alias cts created_at
61
+ alias exp expires_at
62
+ end
63
+ end
@@ -0,0 +1,23 @@
1
+ require_relative 'websocket_message'
2
+ require_relative '../label'
3
+
4
+ module Skyfall
5
+ class LabelsMessage
6
+ using Skyfall::Extensions
7
+
8
+ attr_reader :type_object, :data_object
9
+ attr_reader :type, :seq
10
+
11
+ def initialize(type_object, data_object)
12
+ @type_object = type_object
13
+ @data_object = data_object
14
+
15
+ @type = @type_object['t'][1..-1].to_sym
16
+ @seq = @data_object['seq']
17
+ end
18
+
19
+ def labels
20
+ @labels ||= @data_object['labels'].map { |x| Label.new(x) }
21
+ end
22
+ end
23
+ end
@@ -12,6 +12,7 @@ module Skyfall
12
12
  require_relative 'handle_message'
13
13
  require_relative 'identity_message'
14
14
  require_relative 'info_message'
15
+ require_relative 'labels_message'
15
16
  require_relative 'tombstone_message'
16
17
  require_relative 'unknown_message'
17
18
 
@@ -28,6 +29,7 @@ module Skyfall
28
29
  when '#handle' then HandleMessage
29
30
  when '#identity' then IdentityMessage
30
31
  when '#info' then InfoMessage
32
+ when '#labels' then LabelsMessage
31
33
  when '#tombstone' then TombstoneMessage
32
34
  else UnknownMessage
33
35
  end
@@ -7,11 +7,15 @@ require 'uri'
7
7
  module Skyfall
8
8
  class Stream
9
9
  SUBSCRIBE_REPOS = "com.atproto.sync.subscribeRepos"
10
+ SUBSCRIBE_LABELS = "com.atproto.label.subscribeLabels"
10
11
 
11
12
  NAMED_ENDPOINTS = {
12
- :subscribe_repos => SUBSCRIBE_REPOS
13
+ :subscribe_repos => SUBSCRIBE_REPOS,
14
+ :subscribe_labels => SUBSCRIBE_LABELS
13
15
  }
14
16
 
17
+ EVENTS = %w(message raw_message connecting connect disconnect reconnect error)
18
+
15
19
  MAX_RECONNECT_INTERVAL = 300
16
20
 
17
21
  attr_accessor :heartbeat_timeout, :heartbeat_interval, :cursor, :auto_reconnect
@@ -23,6 +27,8 @@ module Skyfall
23
27
  @handlers = {}
24
28
  @auto_reconnect = true
25
29
  @connection_attempts = 0
30
+
31
+ @handlers[:error] = proc { |e| puts "ERROR: #{e}" }
26
32
  end
27
33
 
28
34
  def connect
@@ -104,32 +110,14 @@ module Skyfall
104
110
 
105
111
  alias close disconnect
106
112
 
107
- def on_message(&block)
108
- @handlers[:message] = block
109
- end
110
-
111
- def on_raw_message(&block)
112
- @handlers[:raw_message] = block
113
- end
114
-
115
- def on_connecting(&block)
116
- @handlers[:connecting] = block
117
- end
118
-
119
- def on_connect(&block)
120
- @handlers[:connect] = block
121
- end
122
-
123
- def on_disconnect(&block)
124
- @handlers[:disconnect] = block
125
- end
126
-
127
- def on_error(&block)
128
- @handlers[:error] = block
129
- end
113
+ EVENTS.each do |event|
114
+ define_method "on_#{event}" do |&block|
115
+ @handlers[event.to_sym] = block
116
+ end
130
117
 
131
- def on_reconnect(&block)
132
- @handlers[:reconnect] = block
118
+ define_method "on_#{event}=" do |block|
119
+ @handlers[event.to_sym] = block
120
+ end
133
121
  end
134
122
 
135
123
  def inspectable_variables
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Skyfall
4
- VERSION = "0.2.5"
4
+ VERSION = "0.3.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: skyfall
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kuba Suder
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-03-14 00:00:00.000000000 Z
11
+ date: 2024-03-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: base32
@@ -50,20 +50,96 @@ dependencies:
50
50
  - - ">="
51
51
  - !ruby/object:Gem::Version
52
52
  version: 0.5.9.6
53
+ - !ruby/object:Gem::Dependency
54
+ name: eventmachine
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '1.2'
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 1.2.7
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '1.2'
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: 1.2.7
53
73
  - !ruby/object:Gem::Dependency
54
74
  name: faye-websocket
55
75
  requirement: !ruby/object:Gem::Requirement
56
76
  requirements:
57
77
  - - "~>"
58
78
  - !ruby/object:Gem::Version
59
- version: 0.11.2
79
+ version: '0.11'
80
+ type: :runtime
81
+ prerelease: false
82
+ version_requirements: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - "~>"
85
+ - !ruby/object:Gem::Version
86
+ version: '0.11'
87
+ - !ruby/object:Gem::Dependency
88
+ name: base64
89
+ requirement: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - "~>"
92
+ - !ruby/object:Gem::Version
93
+ version: '0.1'
94
+ type: :runtime
95
+ prerelease: false
96
+ version_requirements: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - "~>"
99
+ - !ruby/object:Gem::Version
100
+ version: '0.1'
101
+ - !ruby/object:Gem::Dependency
102
+ name: stringio
103
+ requirement: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - "~>"
106
+ - !ruby/object:Gem::Version
107
+ version: '3.0'
108
+ type: :runtime
109
+ prerelease: false
110
+ version_requirements: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - "~>"
113
+ - !ruby/object:Gem::Version
114
+ version: '3.0'
115
+ - !ruby/object:Gem::Dependency
116
+ name: time
117
+ requirement: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - "~>"
120
+ - !ruby/object:Gem::Version
121
+ version: '0.3'
122
+ type: :runtime
123
+ prerelease: false
124
+ version_requirements: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - "~>"
127
+ - !ruby/object:Gem::Version
128
+ version: '0.3'
129
+ - !ruby/object:Gem::Dependency
130
+ name: uri
131
+ requirement: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - "~>"
134
+ - !ruby/object:Gem::Version
135
+ version: '0.13'
60
136
  type: :runtime
61
137
  prerelease: false
62
138
  version_requirements: !ruby/object:Gem::Requirement
63
139
  requirements:
64
140
  - - "~>"
65
141
  - !ruby/object:Gem::Version
66
- version: 0.11.2
142
+ version: '0.13'
67
143
  description: "\n Skyfall is a Ruby library for connecting to the \"firehose\" of
68
144
  the Bluesky social network, i.e. a websocket which\n streams all new posts and
69
145
  everything else happening on the Bluesky network in real time. The code connects
@@ -89,10 +165,12 @@ files:
89
165
  - lib/skyfall/collection.rb
90
166
  - lib/skyfall/errors.rb
91
167
  - lib/skyfall/extensions.rb
168
+ - lib/skyfall/label.rb
92
169
  - lib/skyfall/messages/commit_message.rb
93
170
  - lib/skyfall/messages/handle_message.rb
94
171
  - lib/skyfall/messages/identity_message.rb
95
172
  - lib/skyfall/messages/info_message.rb
173
+ - lib/skyfall/messages/labels_message.rb
96
174
  - lib/skyfall/messages/tombstone_message.rb
97
175
  - lib/skyfall/messages/unknown_message.rb
98
176
  - lib/skyfall/messages/websocket_message.rb