const (
    MaxMessageSubjectLen = 128
    MaxMessageTextLen    = 1024
    MaxMessageDepth      = 1024
    MinMessagePostDelay  = 1 * time.Minute
)
			
				
				const (
    OperationTypeRemoveMessageStr string = "RemoveMessage"
    OperationTypeBanUserStr       string = "BanUser"
)
			
				
				const (
    OperationReasonProtocolViolationStr string = "ProtocolViolation"
    OperationReasonSpamStr              string = "SPAM"
    OperationReasonOfftopicStr          string = "Offtopic"
    OperationReasonAbuseStr             string = "Abuse"
    OperationReasonDuplicateStr         string = "Duplicate"
)
			
				
				const (
    MaxOperationCommentLen int = 1024
    MinOperationPostDelay      = 1 * time.Minute
)
			
				
				const (
    MaxUsernameLen = 64
    EpochTimestamp = 1546300800000000000 // 2019 Jan 01
)
			
		
		
			var (
    Epoch = time.Unix(0, EpochTimestamp)
)
			
		
		
			
			
			func IsNicknameValid(nickname string) bool
type Descriptor struct {
    Type Type `json:"type"`
    ID   ID   `json:"id"`
}
			
			
			
			
			
			
			
		
			
			
			Entity is a logical unit of data for communication between peers.
type Entity interface {
    Type() Type
    ID() *ID
    ShortID() string
    String() string
}
			
			
			
			
			
			
			
		
			
			
			type EntityProvider interface {
    AttachObserver(c chan<- Entity)
    DetachObserver(c chan<- Entity)
}
			
			
			
			
			
			
			
		
			
			
			type ID [32]byte
var ZeroID ID
func NewID(data []byte) ID
func (i *ID) IsZero() bool
func (i ID) MarshalJSON() ([]byte, error)
func (i *ID) ParseSlice(s []byte) error
func (i *ID) ParseString(s string) error
func (i *ID) Shorten() string
func (i *ID) String() string
func (i *ID) UnmarshalJSON(b []byte) error
Message is some text information published by a user.
type Message struct {
    UnsignedMessage
    Sig crypto.Signature
}
			
			
			
			
			
			
				
				func EmergeMessage(
    subject string,
    text string,
    authorID *ID,
    parentID *ID,
    signer *crypto.Signer,
    topic subs.Topic,
) (*Message, error)
				EmergeMessage creates a new message. It should be called when owner wants to post a new message. Signature will be created using the provided signer.
func NewMessage(
    subject string,
    text string,
    authorID *ID,
    parentID *ID,
    dateWritten time.Time,
    sig crypto.Signature,
    topic subs.Topic,
) (*Message, error)
				NewMessage composes a new message entity object from the specified data.
func (m *Message) Copy() *Message
func (m *Message) IsReply() bool
func (m *Message) IsSigValid(pubKey *crypto.PublicKey) bool
func (m *Message) IsUnsignedPartValid() bool
func (m *Message) IsValid(pubKey *crypto.PublicKey) bool
You have either Topic or ParentID, never both.
type MessageContent struct {
    Subject     string
    Text        string
    AuthorID    ID
    ParentID    ID
    DateWritten time.Time
    Topic       subs.Topic
}
			
			
			
			
			
			
			
				
				func (mc *MessageContent) ToID() *ID
Operation is an action performed on a user or a message.
type Operation struct {
    UnsignedOperation
    Sig crypto.Signature
}
			
			
			
			
			
			
				
				func EmergeOperation(
    typ OperationType,
    reason OperationReason,
    comment string,
    authorID *ID,
    objectID *ID,
    signer *crypto.Signer,
) (*Operation, error)
				EmergeOperation creates a new operation. It will be called when owner wants to perform a new operation and automatically by the protocol implementation (for example, for blocking malicious peers). Signature will be created using the provided signer.
func NewOperation(
    typ OperationType,
    reason OperationReason,
    comment string,
    authorID *ID,
    objectID *ID,
    datePerformed time.Time,
    sig crypto.Signature,
) (*Operation, error)
				NewOperation composes a new operation entity object from the specified data.
func (o *Operation) IsSigValid(pubKey *crypto.PublicKey) bool
func (o *Operation) IsUnsignedPartValid() bool
func (o *Operation) IsValid(pubKey *crypto.PublicKey) bool
type OperationContent struct {
    Type          OperationType
    Reason        OperationReason
    Comment       string
    AuthorID      ID
    ObjectID      ID
    DatePerformed time.Time
}
			
			
			
			
			
			
			
				
				func (oc *OperationContent) ToID() *ID
type OperationReason int
const (
    OperationReasonProtocolViolation OperationReason = iota
    OperationReasonSpam
    OperationReasonOfftopic
    OperationReasonAbuse
    OperationReasonDuplicate
)
			
			
			
			
			
			
			
				
				func (or *OperationReason) ParseString(s string) error
func (or OperationReason) String() string
type OperationType int
const (
    OperationTypeRemoveMessage OperationType = iota
    OperationTypeBanUser
)
			
			
			
			
			
			
			
				
				func (ot OperationType) String() string
type StoredMessage struct {
    M      *Message
    Stored time.Time
}
			
			
			
			
			
			
			
		
			
			
			type StoredOperation struct {
    O      *Operation
    Stored time.Time
}
			
			
			
			
			
			
			
		
			
			
			type StoredUser struct {
    U      *User
    Stored time.Time
}
			
			
			
			
			
			
			
		
			
			
			type Type int
const (
    // User registers, post messages and performs operations.
    TypeUser Type = iota
    // Some information published by a user.
    TypeMessage
    // An action performed on a user or a message.
    TypeOperation
)
			
			
			
			
			
			
			
		
			
			
			type UnsignedMessage struct {
    Descriptor
    MessageContent
}
			
			
			
			
			
			
			
				
				func (um *UnsignedMessage) ID() *ID
func (um *UnsignedMessage) ShortID() string
func (um *UnsignedMessage) String() string
func (um *UnsignedMessage) Type() Type
type UnsignedOperation struct {
    Descriptor
    OperationContent
}
			
			
			
			
			
			
			
				
				func (uo *UnsignedOperation) ID() *ID
func (uo *UnsignedOperation) OperationType() OperationType
func (uo *UnsignedOperation) ShortID() string
func (uo *UnsignedOperation) String() string
func (uo *UnsignedOperation) Type() Type
type UnsignedUser struct {
    Descriptor
    UserContent
}
			
			
			
			
			
			
			
				
				func (uu *UnsignedUser) String() string
User identifies and describes a user. It's suitable for sending to the network. Implements Entity interface.
type User struct {
    UnsignedUser
    Sig crypto.Signature
}
			
			
			
			
			
			
				
				func EmergeUser(
    nickname string,
    info string,
    proof crypto.ProofOfWork,
    signer *crypto.Signer,
) (*User, error)
				EmergeUser creates a new user entity. It should only be called when signature is not known yet. Signature will be created using the provided signer.
func NewUser(
    nickname string,
    info string,
    pubkey *crypto.PublicKey,
    proof crypto.ProofOfWork,
    regdate time.Time,
    sig crypto.Signature,
) *User
				
				
				
			
			
				
				func (u *User) Dump() string
func (u *User) ID() *ID
func (u *User) IsValid() bool
func (u *User) ShortID() string
func (u *User) Type() Type
type UserContent struct {
    PubKey   crypto.PublicKey
    Proof    crypto.ProofOfWork
    Nickname string
    Info     string
    RegDate  time.Time
}
			
			
			
			
			
			
			
				
				func (uc *UserContent) ToID() *ID
type UserHistory struct {
    ID           *ID
    Disconnected time.Time
    Subs         subs.Subscriptions
}