Merge EventFragment into Event
Treating Event as a Value Object in the strictest sense requires additional abstractions and internal complexity that the gem could do without, at least for now.
This commit is contained in:
parent
0e8b38bf6e
commit
97037e6e30
@ -31,6 +31,9 @@ Metrics/BlockLength:
|
|||||||
- '**/*_spec.rb'
|
- '**/*_spec.rb'
|
||||||
- nostr.gemspec
|
- nostr.gemspec
|
||||||
|
|
||||||
|
Metrics/ParameterLists:
|
||||||
|
CountKeywordArgs: false
|
||||||
|
|
||||||
# ----------------------- RSpec -----------------------
|
# ----------------------- RSpec -----------------------
|
||||||
|
|
||||||
RSpec/ExampleLength:
|
RSpec/ExampleLength:
|
||||||
|
@ -8,7 +8,6 @@ require_relative 'nostr/subscription'
|
|||||||
require_relative 'nostr/relay'
|
require_relative 'nostr/relay'
|
||||||
require_relative 'nostr/key_pair'
|
require_relative 'nostr/key_pair'
|
||||||
require_relative 'nostr/event_kind'
|
require_relative 'nostr/event_kind'
|
||||||
require_relative 'nostr/event_fragment'
|
|
||||||
require_relative 'nostr/event'
|
require_relative 'nostr/event'
|
||||||
require_relative 'nostr/client'
|
require_relative 'nostr/client'
|
||||||
require_relative 'nostr/user'
|
require_relative 'nostr/user'
|
||||||
|
@ -2,7 +2,65 @@
|
|||||||
|
|
||||||
module Nostr
|
module Nostr
|
||||||
# The only object type that exists in Nostr is an event. Events are immutable.
|
# The only object type that exists in Nostr is an event. Events are immutable.
|
||||||
class Event < EventFragment
|
class Event
|
||||||
|
# 32-bytes hex-encoded public key of the event creator
|
||||||
|
#
|
||||||
|
# @api public
|
||||||
|
#
|
||||||
|
# @example
|
||||||
|
# event.pubkey # => '48df4af6e240ac5f7c5de89bf5941b249880be0e87d03685b178ccb1a315f52e'
|
||||||
|
#
|
||||||
|
# @return [String]
|
||||||
|
#
|
||||||
|
attr_reader :pubkey
|
||||||
|
|
||||||
|
# Date of the creation of the vent. A UNIX timestamp, in seconds
|
||||||
|
#
|
||||||
|
# @api public
|
||||||
|
#
|
||||||
|
# @example
|
||||||
|
# event.created_at # => 1230981305
|
||||||
|
#
|
||||||
|
# @return [Integer]
|
||||||
|
#
|
||||||
|
attr_reader :created_at
|
||||||
|
|
||||||
|
# The kind of the event. An integer from 0 to 3
|
||||||
|
#
|
||||||
|
# @api public
|
||||||
|
#
|
||||||
|
# @example
|
||||||
|
# event.kind # => 1
|
||||||
|
#
|
||||||
|
# @return [Integer]
|
||||||
|
#
|
||||||
|
attr_reader :kind
|
||||||
|
|
||||||
|
# An array of tags. Each tag is an array of strings
|
||||||
|
#
|
||||||
|
# @api public
|
||||||
|
#
|
||||||
|
# @example Tags referencing an event
|
||||||
|
# event.tags #=> [["e", "event_id", "relay URL"]]
|
||||||
|
#
|
||||||
|
# @example Tags referencing a key
|
||||||
|
# event.tags #=> [["p", "event_id", "relay URL"]]
|
||||||
|
#
|
||||||
|
# @return [Array<Array>]
|
||||||
|
#
|
||||||
|
attr_reader :tags
|
||||||
|
|
||||||
|
# An arbitrary string
|
||||||
|
#
|
||||||
|
# @api public
|
||||||
|
#
|
||||||
|
# @example
|
||||||
|
# event.content # => 'Your feedback is appreciated, now pay $8'
|
||||||
|
#
|
||||||
|
# @return [String]
|
||||||
|
#
|
||||||
|
attr_reader :content
|
||||||
|
|
||||||
# 32-bytes sha256 of the the serialized event data.
|
# 32-bytes sha256 of the the serialized event data.
|
||||||
# To obtain the event.id, we sha256 the serialized event. The serialization is done over the UTF-8 JSON-serialized
|
# To obtain the event.id, we sha256 the serialized event. The serialization is done over the UTF-8 JSON-serialized
|
||||||
# string (with no white space or line breaks)
|
# string (with no white space or line breaks)
|
||||||
@ -12,7 +70,7 @@ module Nostr
|
|||||||
# @example Getting the event id
|
# @example Getting the event id
|
||||||
# event.id # => 'ccf9fdf3e1466d7c20969c71ec98defcf5f54aee088513e1b73ccb7bd770d460'
|
# event.id # => 'ccf9fdf3e1466d7c20969c71ec98defcf5f54aee088513e1b73ccb7bd770d460'
|
||||||
#
|
#
|
||||||
# @return [String]
|
# @return [String|nil]
|
||||||
#
|
#
|
||||||
attr_reader :id
|
attr_reader :id
|
||||||
|
|
||||||
@ -24,7 +82,7 @@ module Nostr
|
|||||||
# @example Getting the event signature
|
# @example Getting the event signature
|
||||||
# event.sig # => ''
|
# event.sig # => ''
|
||||||
#
|
#
|
||||||
# @return [String]
|
# @return [String|nil]
|
||||||
#
|
#
|
||||||
attr_reader :sig
|
attr_reader :sig
|
||||||
|
|
||||||
@ -44,16 +102,52 @@ module Nostr
|
|||||||
# 937c6d6e9855477638f5655c5d89c9aa5501ea9b578a66aced4f1cd7b3'
|
# 937c6d6e9855477638f5655c5d89c9aa5501ea9b578a66aced4f1cd7b3'
|
||||||
# )
|
# )
|
||||||
#
|
#
|
||||||
#
|
# @param id [String|nil] 32-bytes sha256 of the the serialized event data.
|
||||||
# @param id [String] 32-bytes sha256 of the the serialized event data.
|
# @param sig [String|nil] 64-bytes signature of the sha256 hash of the serialized event data, which is
|
||||||
# @param sig [String] 64-bytes signature of the sha256 hash of the serialized event data, which is
|
|
||||||
# the same as the "id" field
|
# the same as the "id" field
|
||||||
|
# @param pubkey [String] 32-bytes hex-encoded public key of the event creator.
|
||||||
|
# @param created_at [Integer] Date of the creation of the vent. A UNIX timestamp, in seconds.
|
||||||
|
# @param kind [Integer] The kind of the event. An integer from 0 to 3.
|
||||||
|
# @param tags [Array<Array>] An array of tags. Each tag is an array of strings.
|
||||||
|
# @param content [String] Arbitrary string.
|
||||||
#
|
#
|
||||||
def initialize(id:, sig:, **kwargs)
|
def initialize(
|
||||||
super(**kwargs)
|
pubkey:,
|
||||||
|
kind:,
|
||||||
|
content:,
|
||||||
|
created_at: Time.now.to_i,
|
||||||
|
tags: [],
|
||||||
|
id: nil,
|
||||||
|
sig: nil
|
||||||
|
)
|
||||||
|
|
||||||
@id = id
|
@id = id
|
||||||
@sig = sig
|
@sig = sig
|
||||||
|
@pubkey = pubkey
|
||||||
|
@created_at = created_at
|
||||||
|
@kind = kind
|
||||||
|
@tags = tags
|
||||||
|
@content = content
|
||||||
|
end
|
||||||
|
|
||||||
|
# Serializes the event, to obtain a SHA256 digest of it
|
||||||
|
#
|
||||||
|
# @api public
|
||||||
|
#
|
||||||
|
# @example Converting the event to a digest
|
||||||
|
# event.serialize
|
||||||
|
#
|
||||||
|
# @return [Array] The event as an array.
|
||||||
|
#
|
||||||
|
def serialize
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
pubkey,
|
||||||
|
created_at,
|
||||||
|
kind,
|
||||||
|
tags,
|
||||||
|
content
|
||||||
|
]
|
||||||
end
|
end
|
||||||
|
|
||||||
# Converts the event to a hash
|
# Converts the event to a hash
|
||||||
|
@ -1,111 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Nostr
|
|
||||||
# Part of an +Event+. A complete +Event+ must have an +id+ and a +sig+.
|
|
||||||
class EventFragment
|
|
||||||
# 32-bytes hex-encoded public key of the event creator
|
|
||||||
#
|
|
||||||
# @api public
|
|
||||||
#
|
|
||||||
# @example
|
|
||||||
# event.pubkey # => '48df4af6e240ac5f7c5de89bf5941b249880be0e87d03685b178ccb1a315f52e'
|
|
||||||
#
|
|
||||||
# @return [String]
|
|
||||||
#
|
|
||||||
attr_reader :pubkey
|
|
||||||
|
|
||||||
# Date of the creation of the vent. A UNIX timestamp, in seconds
|
|
||||||
#
|
|
||||||
# @api public
|
|
||||||
#
|
|
||||||
# @example
|
|
||||||
# event.created_at # => 1230981305
|
|
||||||
#
|
|
||||||
# @return [Integer]
|
|
||||||
#
|
|
||||||
attr_reader :created_at
|
|
||||||
|
|
||||||
# The kind of the event. An integer from 0 to 3
|
|
||||||
#
|
|
||||||
# @api public
|
|
||||||
#
|
|
||||||
# @example
|
|
||||||
# event.kind # => 1
|
|
||||||
#
|
|
||||||
# @return [Integer]
|
|
||||||
#
|
|
||||||
attr_reader :kind
|
|
||||||
|
|
||||||
# An array of tags. Each tag is an array of strings
|
|
||||||
#
|
|
||||||
# @api public
|
|
||||||
#
|
|
||||||
# @example Tags referencing an event
|
|
||||||
# event.tags #=> [["e", "event_id", "relay URL"]]
|
|
||||||
#
|
|
||||||
# @example Tags referencing a key
|
|
||||||
# event.tags #=> [["p", "event_id", "relay URL"]]
|
|
||||||
#
|
|
||||||
# @return [Array<Array>]
|
|
||||||
#
|
|
||||||
attr_reader :tags
|
|
||||||
|
|
||||||
# An arbitrary string
|
|
||||||
#
|
|
||||||
# @api public
|
|
||||||
#
|
|
||||||
# @example
|
|
||||||
# event.content # => 'Your feedback is appreciated, now pay $8'
|
|
||||||
#
|
|
||||||
# @return [String]
|
|
||||||
#
|
|
||||||
attr_reader :content
|
|
||||||
|
|
||||||
# Instantiates a new EventFragment
|
|
||||||
#
|
|
||||||
# @api public
|
|
||||||
#
|
|
||||||
# @example
|
|
||||||
# Nostr::EventFragment.new(
|
|
||||||
# pubkey: 'ccf9fdf3e1466d7c20969c71ec98defcf5f54aee088513e1b73ccb7bd770d460',
|
|
||||||
# created_at: 1230981305,
|
|
||||||
# kind: 1,
|
|
||||||
# tags: [['e', '189df012cfff8a075785b884bd702025f4a7a37710f581c4ac9d33e24b585408']],
|
|
||||||
# content: 'Your feedback is appreciated, now pay $8'
|
|
||||||
# )
|
|
||||||
#
|
|
||||||
# @param pubkey [String] 32-bytes hex-encoded public key of the event creator.
|
|
||||||
# @param created_at [Integer] Date of the creation of the vent. A UNIX timestamp, in seconds.
|
|
||||||
# @param kind [Integer] The kind of the event. An integer from 0 to 3.
|
|
||||||
# @param tags [Array<Array>] An array of tags. Each tag is an array of strings.
|
|
||||||
# @param content [String] Arbitrary string.
|
|
||||||
#
|
|
||||||
def initialize(pubkey:, kind:, content:, created_at: Time.now.to_i, tags: [])
|
|
||||||
@pubkey = pubkey
|
|
||||||
@created_at = created_at
|
|
||||||
@kind = kind
|
|
||||||
@tags = tags
|
|
||||||
@content = content
|
|
||||||
end
|
|
||||||
|
|
||||||
# Serializes the event fragment, to obtain a SHA256 hash of it
|
|
||||||
#
|
|
||||||
# @api public
|
|
||||||
#
|
|
||||||
# @example Converting the event to a hash
|
|
||||||
# event_fragment.serialize
|
|
||||||
#
|
|
||||||
# @return [Array] The event fragment as an array.
|
|
||||||
#
|
|
||||||
def serialize
|
|
||||||
[
|
|
||||||
0,
|
|
||||||
pubkey,
|
|
||||||
created_at,
|
|
||||||
kind,
|
|
||||||
tags,
|
|
||||||
content
|
|
||||||
]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
@ -1,23 +1,24 @@
|
|||||||
module Nostr
|
module Nostr
|
||||||
class Event < EventFragment
|
class Event
|
||||||
attr_reader id: String
|
attr_reader pubkey: String
|
||||||
attr_reader sig: String
|
attr_reader created_at: Integer
|
||||||
|
attr_reader kind: Integer
|
||||||
|
attr_reader tags: Array[String]
|
||||||
|
attr_reader content: String
|
||||||
|
attr_reader id: String?|nil
|
||||||
|
attr_reader sig: String?|nil
|
||||||
|
|
||||||
def initialize: (id: String, sig: String,
|
def initialize: (pubkey: String, kind: Integer, content: String, ?created_at: Integer, ?tags: Array[String], ?id: String|nil, ?sig: String|nil) -> void
|
||||||
created_at: Integer,
|
def serialize: -> [Integer, String, Integer, Integer, Array[String], String]
|
||||||
kind: Integer,
|
|
||||||
tags: Array[String],
|
|
||||||
content: String,
|
|
||||||
) -> void
|
|
||||||
|
|
||||||
def to_h: -> {
|
def to_h: -> {
|
||||||
id: String,
|
id: String?|nil,
|
||||||
pubkey: String,
|
pubkey: String,
|
||||||
created_at: Integer,
|
created_at: Integer,
|
||||||
kind: Integer,
|
kind: Integer,
|
||||||
tags: Array[String],
|
tags: Array[String],
|
||||||
content: String,
|
content: String,
|
||||||
sig: String
|
sig: String?|nil
|
||||||
}
|
}
|
||||||
def ==: (Event other) -> bool
|
def ==: (Event other) -> bool
|
||||||
end
|
end
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
module Nostr
|
|
||||||
class EventFragment
|
|
||||||
attr_reader pubkey: String
|
|
||||||
attr_reader created_at: Integer
|
|
||||||
attr_reader kind: Integer
|
|
||||||
attr_reader tags: Array[String]
|
|
||||||
attr_reader content: String
|
|
||||||
|
|
||||||
def initialize: (pubkey: String, kind: Integer, content: String, ?created_at: Integer, ?tags: Array[String]) -> void
|
|
||||||
def serialize: -> [Integer, String, Integer, Integer, Array[String], String]
|
|
||||||
end
|
|
||||||
end
|
|
@ -1,90 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
require 'spec_helper'
|
|
||||||
|
|
||||||
RSpec.describe Nostr::EventFragment do
|
|
||||||
let(:event_fragment) do
|
|
||||||
described_class.new(
|
|
||||||
pubkey: 'ccf9fdf3e1466d7c20969c71ec98defcf5f54aee088513e1b73ccb7bd770d460',
|
|
||||||
created_at: 1_230_981_305,
|
|
||||||
kind: 1,
|
|
||||||
tags: [
|
|
||||||
%w[e 189df012cfff8a075785b884bd702025f4a7a37710f581c4ac9d33e24b585408],
|
|
||||||
%w[p 472f440f29ef996e92a186b8d320ff180c855903882e59d50de1b8bd5669301e]
|
|
||||||
],
|
|
||||||
content: 'Your feedback is appreciated, now pay $8'
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
describe '.new' do
|
|
||||||
it 'creates an instance of an event fragment' do
|
|
||||||
event_fragment = described_class.new(
|
|
||||||
pubkey: 'ccf9fdf3e1466d7c20969c71ec98defcf5f54aee088513e1b73ccb7bd770d460',
|
|
||||||
created_at: 1_230_981_305,
|
|
||||||
kind: 1,
|
|
||||||
tags: [
|
|
||||||
%w[e 189df012cfff8a075785b884bd702025f4a7a37710f581c4ac9d33e24b585408],
|
|
||||||
%w[p 472f440f29ef996e92a186b8d320ff180c855903882e59d50de1b8bd5669301e]
|
|
||||||
],
|
|
||||||
content: 'Your feedback is appreciated, now pay $8'
|
|
||||||
)
|
|
||||||
|
|
||||||
expect(event_fragment).to be_an_instance_of(described_class)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe '#content' do
|
|
||||||
it 'exposes the event fragment content' do
|
|
||||||
expect(event_fragment.content).to eq('Your feedback is appreciated, now pay $8')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe '#created_at' do
|
|
||||||
it 'exposes the event fragment creation date' do
|
|
||||||
expect(event_fragment.created_at).to eq(1_230_981_305)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe '#kind' do
|
|
||||||
it 'exposes the event fragment kind' do
|
|
||||||
expect(event_fragment.kind).to eq(1)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe '#pubkey' do
|
|
||||||
it 'exposes the event fragment pubkey' do
|
|
||||||
expect(event_fragment.pubkey).to eq('ccf9fdf3e1466d7c20969c71ec98defcf5f54aee088513e1b73ccb7bd770d460')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe '#serialize' do
|
|
||||||
it 'serializes the event fragment according to NIP-01' do
|
|
||||||
serialized_event_fragment = event_fragment.serialize
|
|
||||||
|
|
||||||
expect(serialized_event_fragment).to eq(
|
|
||||||
[
|
|
||||||
0,
|
|
||||||
'ccf9fdf3e1466d7c20969c71ec98defcf5f54aee088513e1b73ccb7bd770d460',
|
|
||||||
1_230_981_305,
|
|
||||||
1,
|
|
||||||
[
|
|
||||||
%w[e 189df012cfff8a075785b884bd702025f4a7a37710f581c4ac9d33e24b585408],
|
|
||||||
%w[p 472f440f29ef996e92a186b8d320ff180c855903882e59d50de1b8bd5669301e]
|
|
||||||
],
|
|
||||||
'Your feedback is appreciated, now pay $8'
|
|
||||||
]
|
|
||||||
)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe '#tags' do
|
|
||||||
it 'exposes the event fragment tags' do
|
|
||||||
expect(event_fragment.tags).to eq(
|
|
||||||
[
|
|
||||||
%w[e 189df012cfff8a075785b884bd702025f4a7a37710f581c4ac9d33e24b585408],
|
|
||||||
%w[p 472f440f29ef996e92a186b8d320ff180c855903882e59d50de1b8bd5669301e]
|
|
||||||
]
|
|
||||||
)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
Loading…
x
Reference in New Issue
Block a user