Documentation
¶
Index ¶
- Constants
- Variables
- func CalcMessageClock(lastObservedValue int64, timeInMs TimestampInMs) int64
- func EncodeMembershipUpdateMessage(value MembershipUpdateMessage) ([]byte, error)
- func EncodeMessage(value Message) ([]byte, error)
- func EncodePairMessage(value PairMessage) ([]byte, error)
- func MessageID(author *ecdsa.PublicKey, data []byte) protocol.HexBytes
- func NewMessageDecoder(r io.Reader) *transit.Decoder
- func NewMessageEncoder(w io.Writer) *transit.Encoder
- func WrapMessageV1(payload []byte, identity *ecdsa.PrivateKey) ([]byte, error)
- type Content
- type Flags
- type Group
- func (g Group) Admins() []string
- func (g Group) ChatID() string
- func (g Group) Joined() []string
- func (g Group) LastClockValue() int64
- func (g Group) Members() []string
- func (g Group) Name() string
- func (g Group) NextClockValue() int64
- func (g *Group) ProcessEvent(from *ecdsa.PublicKey, event MembershipUpdateEvent) error
- func (g *Group) ProcessEvents(from *ecdsa.PublicKey, events []MembershipUpdateEvent) error
- func (g Group) Updates() []MembershipUpdateFlat
- type MembershipUpdate
- type MembershipUpdateEvent
- func NewAdminRemovedEvent(admin string, clock int64) MembershipUpdateEvent
- func NewAdminsAddedEvent(admins []string, clock int64) MembershipUpdateEvent
- func NewChatCreatedEvent(name string, admin string, clock int64) MembershipUpdateEvent
- func NewMemberJoinedEvent(member string, clock int64) MembershipUpdateEvent
- func NewMemberRemovedEvent(member string, clock int64) MembershipUpdateEvent
- func NewMembersAddedEvent(members []string, clock int64) MembershipUpdateEvent
- func NewNameChangedEvent(name string, clock int64) MembershipUpdateEvent
- type MembershipUpdateFlat
- type MembershipUpdateMessage
- type Message
- type PairMessage
- type StatusMessage
- func (s *StatusMessage) Clone() (*StatusMessage, error)
- func (m *StatusMessage) HandleApplication() error
- func (m *StatusMessage) HandleApplicationMetadata() error
- func (m *StatusMessage) HandleDatasync(datasync *datasync.DataSync) ([]*StatusMessage, error)
- func (m *StatusMessage) HandleEncryption(myKey *ecdsa.PrivateKey, senderKey *ecdsa.PublicKey, enc *encryption.Protocol) error
- func (m *StatusMessage) HandleTransport(shhMessage *whispertypes.Message) error
- func (s *StatusMessage) SigPubKey() *ecdsa.PublicKey
- type StatusMessageT
- type StatusProtocolMessage
- func (*StatusProtocolMessage) Descriptor() ([]byte, []int)
- func (m *StatusProtocolMessage) GetPayload() []byte
- func (m *StatusProtocolMessage) GetSignature() []byte
- func (*StatusProtocolMessage) ProtoMessage()
- func (m *StatusProtocolMessage) Reset()
- func (m *StatusProtocolMessage) String() string
- func (m *StatusProtocolMessage) XXX_DiscardUnknown()
- func (m *StatusProtocolMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)
- func (m *StatusProtocolMessage) XXX_Merge(src proto.Message)
- func (m *StatusProtocolMessage) XXX_Size() int
- func (m *StatusProtocolMessage) XXX_Unmarshal(b []byte) error
- type TimestampInMs
Constants ¶
const ( MembershipUpdateChatCreated = "chat-created" MembershipUpdateNameChanged = "name-changed" MembershipUpdateMembersAdded = "members-added" MembershipUpdateMemberJoined = "member-joined" MembershipUpdateMemberRemoved = "member-removed" MembershipUpdateAdminsAdded = "admins-added" MembershipUpdateAdminRemoved = "admin-removed" )
const ( MessageTypePublicGroup = "public-group-user-message" MessageTypePrivate = "user-message" MessageTypePrivateGroup = "group-user-message" )
Message types.
const (
// ContentTypeTextPlain means that the message contains plain text.
ContentTypeTextPlain = "text/plain"
)
Variables ¶
var ( // ErrInvalidDecodedValue means that the decoded message is of wrong type. // This might mean that the status message serialization tag changed. ErrInvalidDecodedValue = errors.New("invalid decoded value type") )
Functions ¶
func CalcMessageClock ¶
func CalcMessageClock(lastObservedValue int64, timeInMs TimestampInMs) int64
CalcMessageClock calculates a new clock value for Message. It is used to properly sort messages and accomodate the fact that time might be different on each device.
func EncodeMembershipUpdateMessage ¶
func EncodeMembershipUpdateMessage(value MembershipUpdateMessage) ([]byte, error)
EncodeMembershipUpdateMessage encodes a MembershipUpdateMessage using Transit serialization.
func EncodeMessage ¶
EncodeMessage encodes a Message using Transit serialization.
func EncodePairMessage ¶
func EncodePairMessage(value PairMessage) ([]byte, error)
EncodePairMessage encodes a PairMessage using Transit serialization.
func MessageID ¶
MessageID calculates the messageID from author's compressed public key and not encrypted but encoded payload.
func NewMessageDecoder ¶
NewMessageDecoder returns a new Transit decoder that can deserialize Message structs. More about Transit: https://github.com/cognitect/transit-format
func NewMessageEncoder ¶
NewMessageEncoder returns a new Transit encoder that can encode Message values. More about Transit: https://github.com/cognitect/transit-format
func WrapMessageV1 ¶
func WrapMessageV1(payload []byte, identity *ecdsa.PrivateKey) ([]byte, error)
WrapMessageV1 wraps a payload into a protobuf message and signs it if an identity is provided
Types ¶
type Content ¶
type Content struct {
ChatID string `json:"chat_id"`
Text string `json:"text"`
ResponseTo string `json:"response-to"`
Name string `json:"name"` // the ENS name of the sender
ParsedText ast.Node `json:"parsedText"`
LineCount int `json:"lineCount"`
RTL bool `json:"rtl"`
}
Content contains the chat ID and the actual text of a message.
func PrepareContent ¶
PrepareContent return the parsed content of the message, the line-count and whether is a right-to-left message
type Group ¶
type Group struct {
// contains filtered or unexported fields
}
func NewGroupWithCreator ¶
func NewGroupWithCreator(name string, creator *ecdsa.PrivateKey) (*Group, error)
func NewGroupWithMembershipUpdates ¶
func NewGroupWithMembershipUpdates(chatID string, updates []MembershipUpdate) (*Group, error)
func (Group) LastClockValue ¶
func (Group) NextClockValue ¶
func (*Group) ProcessEvent ¶
func (g *Group) ProcessEvent(from *ecdsa.PublicKey, event MembershipUpdateEvent) error
func (*Group) ProcessEvents ¶
func (g *Group) ProcessEvents(from *ecdsa.PublicKey, events []MembershipUpdateEvent) error
func (Group) Updates ¶
func (g Group) Updates() []MembershipUpdateFlat
type MembershipUpdate ¶
type MembershipUpdate struct {
ChatID string `json:"chatId"`
Signature string `json:"signature"` // hex-encoded without 0x prefix
Events []MembershipUpdateEvent `json:"events"`
From string `json:"from"` // hex-encoded with 0x prefix
}
func (*MembershipUpdate) Flat ¶
func (u *MembershipUpdate) Flat() []MembershipUpdateFlat
func (*MembershipUpdate) Sign ¶
func (u *MembershipUpdate) Sign(identity *ecdsa.PrivateKey) error
Sign creates a signature from MembershipUpdateEvents and updates MembershipUpdate's signature. It follows the algorithm describe in the spec: https://github.com/status-im/specs/blob/master/status-group-chats-spec.md#signature.
type MembershipUpdateEvent ¶
type MembershipUpdateEvent struct {
Type string `json:"type"`
ClockValue int64 `json:"clockValue"`
Member string `json:"member,omitempty"` // in "member-joined", "member-removed" and "admin-removed" events
Members []string `json:"members,omitempty"` // in "members-added" and "admins-added" events
Name string `json:"name,omitempty"` // name of the group chat
}
MembershipUpdateEvent contains an event information. Member and Members are hex-encoded values with 0x prefix.
func NewAdminRemovedEvent ¶
func NewAdminRemovedEvent(admin string, clock int64) MembershipUpdateEvent
func NewAdminsAddedEvent ¶
func NewAdminsAddedEvent(admins []string, clock int64) MembershipUpdateEvent
func NewChatCreatedEvent ¶
func NewChatCreatedEvent(name string, admin string, clock int64) MembershipUpdateEvent
func NewMemberJoinedEvent ¶
func NewMemberJoinedEvent(member string, clock int64) MembershipUpdateEvent
func NewMemberRemovedEvent ¶
func NewMemberRemovedEvent(member string, clock int64) MembershipUpdateEvent
func NewMembersAddedEvent ¶
func NewMembersAddedEvent(members []string, clock int64) MembershipUpdateEvent
func NewNameChangedEvent ¶
func NewNameChangedEvent(name string, clock int64) MembershipUpdateEvent
func (MembershipUpdateEvent) Equal ¶
func (u MembershipUpdateEvent) Equal(update MembershipUpdateEvent) bool
type MembershipUpdateFlat ¶
type MembershipUpdateFlat struct {
MembershipUpdateEvent
ChatID string `json:"chatId"`
Signature string `json:"signature"`
From string `json:"from"`
}
func MergeFlatMembershipUpdates ¶
func MergeFlatMembershipUpdates(dest []MembershipUpdateFlat, src []MembershipUpdateFlat) []MembershipUpdateFlat
func (MembershipUpdateFlat) Equal ¶
func (u MembershipUpdateFlat) Equal(update MembershipUpdateFlat) bool
type MembershipUpdateMessage ¶
type MembershipUpdateMessage struct {
ChatID string `json:"chatId"` // UUID concatenated with hex-encoded public key of the creator for the chat
Updates []MembershipUpdate `json:"updates"`
Message *Message `json:"message"` // optional message
}
MembershipUpdateMessage is a message used to propagate information about group membership changes. For more information, see https://github.com/status-im/specs/blob/master/status-group-chats-spec.md.
func (*MembershipUpdateMessage) Verify ¶
func (m *MembershipUpdateMessage) Verify() error
Verify makes sure that the received update message has a valid signature. It also extracts public key from the signature available as From field. It does not verify the updates and their events. This should be done separately using Group struct.
type Message ¶
type Message struct {
Text string `json:"text"` // TODO: why is this duplicated?
ContentT string `json:"content_type"`
MessageT string `json:"message_type"`
Clock int64 `json:"clock"` // lamport timestamp; see CalcMessageClock for more details
Timestamp TimestampInMs `json:"timestamp"`
Content Content `json:"content"`
Flags Flags `json:"-"`
ID []byte `json:"-"`
SigPubKey *ecdsa.PublicKey `json:"-"`
ChatID string `json:"-"` // reference to Chat.ID; not connected to Content.ChatID which is set by sender
}
Message is a chat message sent by an user.
func CreatePrivateGroupTextMessage ¶
CreatePrivateGroupTextMessage creates a group message.
func CreatePrivateTextMessage ¶
CreatePrivateTextMessage creates a one-to-one message.
func CreatePublicTextMessage ¶
CreatePublicTextMessage creates a public text Message.
func (*Message) MarshalJSON ¶
type PairMessage ¶
type PairMessage struct {
InstallationID string `json:"installationId"`
// The type of the device
DeviceType string `json:"deviceType"`
// Name the user set name
Name string `json:"name"`
// The FCMToken for mobile platforms
FCMToken string `json:"fcmToken"`
// not protocol defined fields
ID []byte `json:"-"`
}
PairMessage contains all message details.
func CreatePairMessage ¶
func CreatePairMessage(installationID string, name string, deviceType string, fcmToken string) PairMessage
CreatePairMessage creates a PairMessage which is used to pair devices.
func DecodePairMessage ¶
func DecodePairMessage(data []byte) (message PairMessage, err error)
DecodePairMessage decodes a raw payload to Message struct.
func (*PairMessage) MarshalJSON ¶
func (m *PairMessage) MarshalJSON() ([]byte, error)
type StatusMessage ¶
type StatusMessage struct {
// TransportMessage is the parsed message received from the transport layer, i.e the input
TransportMessage *whispertypes.Message
// MessageType is the type of application message contained
MessageType StatusMessageT
// ParsedMessage is the parsed message by the application layer, i.e the output
ParsedMessage interface{}
// TransportPayload is the payload as received from the transport layer
TransportPayload []byte
// DecryptedPayload is the payload after having been processed by the encryption layer
DecryptedPayload []byte
// ID is the canonical ID of the message
ID protocol.HexBytes
// Hash is the transport layer hash
Hash []byte
// TransportLayerSigPubKey contains the public key provided by the transport layer
TransportLayerSigPubKey *ecdsa.PublicKey
// ApplicationMetadataLayerPubKey contains the public key provided by the application metadata layer
ApplicationMetadataLayerSigPubKey *ecdsa.PublicKey
}
StatusMessage is any Status Protocol message.
func (*StatusMessage) Clone ¶
func (s *StatusMessage) Clone() (*StatusMessage, error)
func (*StatusMessage) HandleApplication ¶
func (m *StatusMessage) HandleApplication() error
func (*StatusMessage) HandleApplicationMetadata ¶
func (m *StatusMessage) HandleApplicationMetadata() error
func (*StatusMessage) HandleDatasync ¶
func (m *StatusMessage) HandleDatasync(datasync *datasync.DataSync) ([]*StatusMessage, error)
HandleDatasync processes StatusMessage through data sync layer. This is optional and DataSync might be nil. In such a case, only one payload will be returned equal to DecryptedPayload.
func (*StatusMessage) HandleEncryption ¶
func (m *StatusMessage) HandleEncryption(myKey *ecdsa.PrivateKey, senderKey *ecdsa.PublicKey, enc *encryption.Protocol) error
func (*StatusMessage) HandleTransport ¶
func (m *StatusMessage) HandleTransport(shhMessage *whispertypes.Message) error
func (*StatusMessage) SigPubKey ¶
func (s *StatusMessage) SigPubKey() *ecdsa.PublicKey
SigPubKey returns the most important signature, from the application layer to transport
type StatusMessageT ¶
type StatusMessageT int
const ( MessageT StatusMessageT = iota + 1 MembershipUpdateMessageT PairMessageT )
type StatusProtocolMessage ¶
type StatusProtocolMessage struct {
Signature []byte `protobuf:"bytes,4001,opt,name=signature,proto3" json:"signature,omitempty"`
Payload []byte `protobuf:"bytes,4002,opt,name=payload,proto3" json:"payload,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (*StatusProtocolMessage) Descriptor ¶
func (*StatusProtocolMessage) Descriptor() ([]byte, []int)
func (*StatusProtocolMessage) GetPayload ¶
func (m *StatusProtocolMessage) GetPayload() []byte
func (*StatusProtocolMessage) GetSignature ¶
func (m *StatusProtocolMessage) GetSignature() []byte
func (*StatusProtocolMessage) ProtoMessage ¶
func (*StatusProtocolMessage) ProtoMessage()
func (*StatusProtocolMessage) Reset ¶
func (m *StatusProtocolMessage) Reset()
func (*StatusProtocolMessage) String ¶
func (m *StatusProtocolMessage) String() string
func (*StatusProtocolMessage) XXX_DiscardUnknown ¶
func (m *StatusProtocolMessage) XXX_DiscardUnknown()
func (*StatusProtocolMessage) XXX_Marshal ¶
func (m *StatusProtocolMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)
func (*StatusProtocolMessage) XXX_Merge ¶
func (m *StatusProtocolMessage) XXX_Merge(src proto.Message)
func (*StatusProtocolMessage) XXX_Size ¶
func (m *StatusProtocolMessage) XXX_Size() int
func (*StatusProtocolMessage) XXX_Unmarshal ¶
func (m *StatusProtocolMessage) XXX_Unmarshal(b []byte) error
type TimestampInMs ¶
type TimestampInMs int64
TimestampInMs is a timestamp in milliseconds.
func TimestampInMsFromTime ¶
func TimestampInMsFromTime(t time.Time) TimestampInMs
TimestampInMsFromTime returns a TimestampInMs from a time.Time instance.
func (TimestampInMs) Time ¶
func (t TimestampInMs) Time() time.Time
Time returns a time.Time instance.