Ruby gem for ingesting ATProto repo data from a Tap service (extension of Skyfall gem)
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

connecting to the websocket and streaming events

+183
+1
lib/tapfall.rb
··· 1 1 # frozen_string_literal: true 2 2 3 + require_relative 'tapfall/stream' 3 4 require_relative 'tapfall/version' 4 5 5 6 module Tapfall
+4
lib/tapfall/errors.rb
··· 1 + module Tapfall 2 + class DecodeError < StandardError 3 + end 4 + end
+30
lib/tapfall/messages/identity_message.rb
··· 1 + require_relative '../errors' 2 + require_relative 'operation' 3 + require_relative 'tap_message' 4 + 5 + module Tapfall 6 + class IdentityMessage < TapMessage 7 + def initialize(json) 8 + raise DecodeError.new("Missing event details") if json['identity'].nil? 9 + @identity = json['identity'] 10 + 11 + super 12 + end 13 + 14 + def did 15 + @identity['did'] 16 + end 17 + 18 + def handle 19 + @identity['handle'] 20 + end 21 + 22 + def active? 23 + @identity['isActive'] 24 + end 25 + 26 + def status 27 + @identity['status']&.to_sym 28 + end 29 + end 30 + end
+56
lib/tapfall/messages/operation.rb
··· 1 + require 'skyfall/cid' 2 + require 'skyfall/collection' 3 + 4 + module Tapfall 5 + class Operation 6 + def initialize(json) 7 + @json = json 8 + end 9 + 10 + def live? 11 + @json['live'] 12 + end 13 + 14 + def did 15 + @json['did'] 16 + end 17 + 18 + alias repo did 19 + 20 + def rev 21 + @json['rev'] 22 + end 23 + 24 + def path 25 + @json['collection'] + '/' + @json['rkey'] 26 + end 27 + 28 + def action 29 + @json['action'].to_sym 30 + end 31 + 32 + def collection 33 + @json['collection'] 34 + end 35 + 36 + def rkey 37 + @json['rkey'] 38 + end 39 + 40 + def uri 41 + "at://#{repo}/#{collection}/#{rkey}" 42 + end 43 + 44 + def cid 45 + @cid ||= @json['cid'] && Skyfall::CID.from_json(@json['cid']) 46 + end 47 + 48 + def raw_record 49 + @json['record'] 50 + end 51 + 52 + def type 53 + Skyfall::Collection.short_code(collection) 54 + end 55 + end 56 + end
+15
lib/tapfall/messages/record_message.rb
··· 1 + require_relative '../errors' 2 + require_relative 'operation' 3 + 4 + module Tapfall 5 + class RecordMessage < TapMessage 6 + def initialize(json) 7 + raise DecodeError.new("Missing record details") if json['record'].nil? 8 + super 9 + end 10 + 11 + def operations 12 + @operations ||= [Operation.new(json['record'])] 13 + end 14 + end 15 + end
+44
lib/tapfall/messages/tap_message.rb
··· 1 + require 'json' 2 + require_relative '../errors' 3 + 4 + module Tapfall 5 + class TapMessage 6 + attr_reader :id, :type 7 + alias seq id 8 + 9 + # :nodoc: - consider this as semi-private API 10 + attr_reader :json 11 + 12 + def self.new(data) 13 + require_relative 'identity_message' 14 + require_relative 'record_message' 15 + require_relative 'unknown_message' 16 + 17 + json = JSON.parse(data) 18 + 19 + message_class = case json['type'] 20 + when 'record' then RecordMessage 21 + when 'identity' then IdentityMessage 22 + else UnknownMessage 23 + end 24 + 25 + message = message_class.allocate 26 + message.send(:initialize, json) 27 + message 28 + end 29 + 30 + def initialize(json) 31 + @json = json 32 + @type = @json['type'].to_sym 33 + @id = @json['id'] 34 + end 35 + 36 + def unknown? 37 + self.is_a?(UnknownMessage) 38 + end 39 + 40 + def operations 41 + [] 42 + end 43 + end 44 + end
+4
lib/tapfall/messages/unknown_message.rb
··· 1 + module Tapfall 2 + class UnknownMessage < TapMessage 3 + end 4 + end
+27
lib/tapfall/stream.rb
··· 1 + require 'skyfall/stream' 2 + require_relative 'version' 3 + require_relative 'messages/tap_message' 4 + 5 + class Tapfall::Stream < Skyfall::Stream 6 + def initialize(server) 7 + super(server) 8 + 9 + @root_url = ensure_empty_path(@root_url) 10 + end 11 + 12 + def handle_message(msg) 13 + data = msg.data 14 + @handlers[:raw_message]&.call(data) 15 + 16 + if @handlers[:message] 17 + tap_message = Tapfall::TapMessage.new(data) 18 + @handlers[:message].call(tap_message) 19 + end 20 + end 21 + 22 + private 23 + 24 + def build_websocket_url 25 + @root_url + "/channel" 26 + end 27 + end
+2
tapfall.gemspec
··· 24 24 end 25 25 26 26 spec.require_paths = ["lib"] 27 + 28 + spec.add_dependency 'skyfall', '~> 0.6' 27 29 end