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:
Wilson Silva
2023-02-25 12:40:19 +07:00
parent 0e8b38bf6e
commit 97037e6e30
7 changed files with 117 additions and 233 deletions

View File

@@ -2,7 +2,65 @@
module Nostr
# 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.
# 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)
@@ -12,7 +70,7 @@ module Nostr
# @example Getting the event id
# event.id # => 'ccf9fdf3e1466d7c20969c71ec98defcf5f54aee088513e1b73ccb7bd770d460'
#
# @return [String]
# @return [String|nil]
#
attr_reader :id
@@ -24,7 +82,7 @@ module Nostr
# @example Getting the event signature
# event.sig # => ''
#
# @return [String]
# @return [String|nil]
#
attr_reader :sig
@@ -44,16 +102,52 @@ module Nostr
# 937c6d6e9855477638f5655c5d89c9aa5501ea9b578a66aced4f1cd7b3'
# )
#
#
# @param id [String] 32-bytes sha256 of the the serialized event data.
# @param sig [String] 64-bytes signature of the sha256 hash of the serialized event data, which is
# @param id [String|nil] 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
# 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)
super(**kwargs)
def initialize(
pubkey:,
kind:,
content:,
created_at: Time.now.to_i,
tags: [],
id: nil,
sig: nil
)
@id = id
@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
# Converts the event to a hash

View File

@@ -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