Class: Nostrb::Relay
- Inherits:
-
Object
- Object
- Nostrb::Relay
- Defined in:
- lib/nostrb/relay.rb
Class Method Summary collapse
- .closed(sid, msg) ⇒ Object
- .eose(sid) ⇒ Object
- .error(e) ⇒ Object
- .event(sid, event) ⇒ Object
- .message(excp) ⇒ Object
- .notice(msg) ⇒ Object
- .ok(eid, msg = "", ok: true) ⇒ Object
Instance Method Summary collapse
-
#handle_close(sid) ⇒ Object
single response.
-
#handle_event(hsh) ⇒ Object
return a single response.
-
#handle_req(sid, *filters) ⇒ Object
run filter2 just like filter1 the result set is the union of filter1 and filter2.
-
#ingest(json) ⇒ Object
accepts a single json array returns a ruby array of response strings (json array).
-
#initialize(db_filename = nil, storage: :sqlite) ⇒ Relay
constructor
A new instance of Relay.
Constructor Details
#initialize(db_filename = nil, storage: :sqlite) ⇒ Relay
Returns a new instance of Relay.
31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/nostrb/relay.rb', line 31 def initialize(db_filename = nil, storage: :sqlite) case storage when :sqlite mod = Nostrb::SQLite when :sequel require 'nostrb/sequel' mod = Nostrb::Sequel else raise "unexpected: #{storage.inspect}" end db_filename ||= mod::Storage::FILENAME @reader = mod::Reader.new(db_filename) @writer = mod::Writer.new(db_filename) end |
Class Method Details
.closed(sid, msg) ⇒ Object
23 |
# File 'lib/nostrb/relay.rb', line 23 def self.closed(sid, msg) = ["CLOSED", Nostrb.sid!(sid), Nostrb.help!(msg)] |
.eose(sid) ⇒ Object
22 |
# File 'lib/nostrb/relay.rb', line 22 def self.eose(sid) = ["EOSE", Nostrb.sid!(sid)] |
.error(e) ⇒ Object
25 |
# File 'lib/nostrb/relay.rb', line 25 def self.error(e) = notice((e)) |
.event(sid, event) ⇒ Object
18 |
# File 'lib/nostrb/relay.rb', line 18 def self.event(sid, event) = ["EVENT", Nostrb.sid!(sid), event.to_h] |
.message(excp) ⇒ Object
27 28 29 |
# File 'lib/nostrb/relay.rb', line 27 def self.(excp) format("%s: %s", excp.class.name.split('::').last, excp.) end |
Instance Method Details
#handle_close(sid) ⇒ Object
single response
138 139 140 |
# File 'lib/nostrb/relay.rb', line 138 def handle_close(sid) Relay.closed(sid, "reason: CLOSE requested") end |
#handle_event(hsh) ⇒ Object
return a single response
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
# File 'lib/nostrb/relay.rb', line 69 def handle_event(hsh) begin hsh = SignedEvent.validate!(hsh) rescue Nostrb::Error, KeyError, RuntimeError => e return Relay.error(e) end eid = hsh.fetch('id') begin hsh = SignedEvent.verify(hsh) case hsh['kind'] when 1, (4..44), (1000..9999) # regular, store all @writer.add_event(hsh) when 0, 3, (10_000..19_999) # replaceable, store latest (pubkey, kind) @writer.add_r_event(hsh) when 20_000..29_999 # ephemeral, don't store when 30_000..30_999 # parameterized replaceable, store latest (pubkey, kind, dtag) # TODO: implement dtag stuff @writer.add_r_event(hsh) else raise(SignedEvent::Error, "kind: #{hsh['kind']}") end Relay.ok(eid) rescue SignedEvent::Error => e Relay.ok(eid, Relay.(e), ok: false) rescue Nostrb::Error, KeyError, RuntimeError => e Relay.error(e) end end |
#handle_req(sid, *filters) ⇒ Object
run filter2 just like filter1 the result set is the union of filter1 and filter2
122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
# File 'lib/nostrb/relay.rb', line 122 def handle_req(sid, *filters) responses = Set.new filters.each { |f| @reader.process_events(f).each { |h| responses << Relay.event(sid, h) if f.match? h } @reader.process_r_events(f).each { |h| responses << Relay.event(sid, h) if f.match? h } } responses = responses.to_a responses << Relay.eose(sid) end |
#ingest(json) ⇒ Object
accepts a single json array returns a ruby array of response strings (json array)
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
# File 'lib/nostrb/relay.rb', line 48 def ingest(json) begin a = Nostrb.ary!(Nostrb.parse(json)) case a[0] when 'EVENT' [handle_event(Nostrb.check!(a[1], Hash))] when 'REQ' sid = Nostrb.sid!(a[1]) filters = a[2..-1].map { |f| Filter.ingest(f) } handle_req(sid, *filters) when 'CLOSE' [handle_close(Nostrb.sid!(a[1]))] else [Relay.notice("unexpected: #{a[0].inspect}")] end rescue StandardError => e [Relay.error(e)] end end |