feat(status-js): add membership update message
This commit is contained in:
parent
df52940211
commit
75d4415b5c
|
@ -0,0 +1,43 @@
|
||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
import "chat-message.proto";
|
||||||
|
import "emoji-reaction.proto";
|
||||||
|
|
||||||
|
message MembershipUpdateEvent {
|
||||||
|
// Lamport timestamp of the event
|
||||||
|
uint64 clock = 1;
|
||||||
|
// List of public keys of objects of the action
|
||||||
|
repeated string members = 2;
|
||||||
|
// Name of the chat for the CHAT_CREATED/NAME_CHANGED event types
|
||||||
|
string name = 3;
|
||||||
|
// The type of the event
|
||||||
|
EventType type = 4;
|
||||||
|
|
||||||
|
enum EventType {
|
||||||
|
UNKNOWN = 0;
|
||||||
|
CHAT_CREATED = 1;
|
||||||
|
NAME_CHANGED = 2;
|
||||||
|
MEMBERS_ADDED = 3;
|
||||||
|
MEMBER_JOINED = 4;
|
||||||
|
MEMBER_REMOVED = 5;
|
||||||
|
ADMINS_ADDED = 6;
|
||||||
|
ADMIN_REMOVED = 7;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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.
|
||||||
|
message MembershipUpdateMessage {
|
||||||
|
// The chat id of the private group chat
|
||||||
|
string chat_id = 1;
|
||||||
|
// A list of events for this group chat, first x bytes are the signature, then is a
|
||||||
|
// protobuf encoded MembershipUpdateEvent
|
||||||
|
repeated bytes events = 2;
|
||||||
|
|
||||||
|
// An optional chat message
|
||||||
|
oneof chat_entity {
|
||||||
|
ChatMessage message = 3;
|
||||||
|
EmojiReaction emoji_reaction = 4;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,413 @@
|
||||||
|
/* eslint-disable import/export */
|
||||||
|
/* eslint-disable @typescript-eslint/no-namespace */
|
||||||
|
|
||||||
|
import { enumeration, encodeMessage, decodeMessage, message, uint64, string, bytes, int32, bool } from 'protons-runtime'
|
||||||
|
import type { Codec } from 'protons-runtime'
|
||||||
|
|
||||||
|
export interface MembershipUpdateEvent {
|
||||||
|
clock: bigint
|
||||||
|
members: string[]
|
||||||
|
name: string
|
||||||
|
type: MembershipUpdateEvent.EventType
|
||||||
|
}
|
||||||
|
|
||||||
|
export namespace MembershipUpdateEvent {
|
||||||
|
export enum EventType {
|
||||||
|
UNKNOWN = 'UNKNOWN',
|
||||||
|
CHAT_CREATED = 'CHAT_CREATED',
|
||||||
|
NAME_CHANGED = 'NAME_CHANGED',
|
||||||
|
MEMBERS_ADDED = 'MEMBERS_ADDED',
|
||||||
|
MEMBER_JOINED = 'MEMBER_JOINED',
|
||||||
|
MEMBER_REMOVED = 'MEMBER_REMOVED',
|
||||||
|
ADMINS_ADDED = 'ADMINS_ADDED',
|
||||||
|
ADMIN_REMOVED = 'ADMIN_REMOVED'
|
||||||
|
}
|
||||||
|
|
||||||
|
enum __EventTypeValues {
|
||||||
|
UNKNOWN = 0,
|
||||||
|
CHAT_CREATED = 1,
|
||||||
|
NAME_CHANGED = 2,
|
||||||
|
MEMBERS_ADDED = 3,
|
||||||
|
MEMBER_JOINED = 4,
|
||||||
|
MEMBER_REMOVED = 5,
|
||||||
|
ADMINS_ADDED = 6,
|
||||||
|
ADMIN_REMOVED = 7
|
||||||
|
}
|
||||||
|
|
||||||
|
export namespace EventType {
|
||||||
|
export const codec = () => {
|
||||||
|
return enumeration<typeof EventType>(__EventTypeValues)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const codec = (): Codec<MembershipUpdateEvent> => {
|
||||||
|
return message<MembershipUpdateEvent>({
|
||||||
|
1: { name: 'clock', codec: uint64 },
|
||||||
|
2: { name: 'members', codec: string, repeats: true },
|
||||||
|
3: { name: 'name', codec: string },
|
||||||
|
4: { name: 'type', codec: MembershipUpdateEvent.EventType.codec() }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export const encode = (obj: MembershipUpdateEvent): Uint8Array => {
|
||||||
|
return encodeMessage(obj, MembershipUpdateEvent.codec())
|
||||||
|
}
|
||||||
|
|
||||||
|
export const decode = (buf: Uint8Array): MembershipUpdateEvent => {
|
||||||
|
return decodeMessage(buf, MembershipUpdateEvent.codec())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface MembershipUpdateMessage {
|
||||||
|
chatId: string
|
||||||
|
events: Uint8Array[]
|
||||||
|
message: ChatMessage
|
||||||
|
emojiReaction: EmojiReaction
|
||||||
|
}
|
||||||
|
|
||||||
|
export namespace MembershipUpdateMessage {
|
||||||
|
export const codec = (): Codec<MembershipUpdateMessage> => {
|
||||||
|
return message<MembershipUpdateMessage>({
|
||||||
|
1: { name: 'chatId', codec: string },
|
||||||
|
2: { name: 'events', codec: bytes, repeats: true },
|
||||||
|
3: { name: 'message', codec: ChatMessage.codec() },
|
||||||
|
4: { name: 'emojiReaction', codec: EmojiReaction.codec() }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export const encode = (obj: MembershipUpdateMessage): Uint8Array => {
|
||||||
|
return encodeMessage(obj, MembershipUpdateMessage.codec())
|
||||||
|
}
|
||||||
|
|
||||||
|
export const decode = (buf: Uint8Array): MembershipUpdateMessage => {
|
||||||
|
return decodeMessage(buf, MembershipUpdateMessage.codec())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface StickerMessage {
|
||||||
|
hash: string
|
||||||
|
pack: number
|
||||||
|
}
|
||||||
|
|
||||||
|
export namespace StickerMessage {
|
||||||
|
export const codec = (): Codec<StickerMessage> => {
|
||||||
|
return message<StickerMessage>({
|
||||||
|
1: { name: 'hash', codec: string },
|
||||||
|
2: { name: 'pack', codec: int32 }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export const encode = (obj: StickerMessage): Uint8Array => {
|
||||||
|
return encodeMessage(obj, StickerMessage.codec())
|
||||||
|
}
|
||||||
|
|
||||||
|
export const decode = (buf: Uint8Array): StickerMessage => {
|
||||||
|
return decodeMessage(buf, StickerMessage.codec())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ImageMessage {
|
||||||
|
payload: Uint8Array
|
||||||
|
type: ImageType
|
||||||
|
}
|
||||||
|
|
||||||
|
export namespace ImageMessage {
|
||||||
|
export const codec = (): Codec<ImageMessage> => {
|
||||||
|
return message<ImageMessage>({
|
||||||
|
1: { name: 'payload', codec: bytes },
|
||||||
|
2: { name: 'type', codec: ImageType.codec() }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export const encode = (obj: ImageMessage): Uint8Array => {
|
||||||
|
return encodeMessage(obj, ImageMessage.codec())
|
||||||
|
}
|
||||||
|
|
||||||
|
export const decode = (buf: Uint8Array): ImageMessage => {
|
||||||
|
return decodeMessage(buf, ImageMessage.codec())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface AudioMessage {
|
||||||
|
payload: Uint8Array
|
||||||
|
type: AudioMessage.AudioType
|
||||||
|
durationMs: bigint
|
||||||
|
}
|
||||||
|
|
||||||
|
export namespace AudioMessage {
|
||||||
|
export enum AudioType {
|
||||||
|
UNKNOWN_AUDIO_TYPE = 'UNKNOWN_AUDIO_TYPE',
|
||||||
|
AAC = 'AAC',
|
||||||
|
AMR = 'AMR'
|
||||||
|
}
|
||||||
|
|
||||||
|
enum __AudioTypeValues {
|
||||||
|
UNKNOWN_AUDIO_TYPE = 0,
|
||||||
|
AAC = 1,
|
||||||
|
AMR = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
export namespace AudioType {
|
||||||
|
export const codec = () => {
|
||||||
|
return enumeration<typeof AudioType>(__AudioTypeValues)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const codec = (): Codec<AudioMessage> => {
|
||||||
|
return message<AudioMessage>({
|
||||||
|
1: { name: 'payload', codec: bytes },
|
||||||
|
2: { name: 'type', codec: AudioMessage.AudioType.codec() },
|
||||||
|
3: { name: 'durationMs', codec: uint64 }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export const encode = (obj: AudioMessage): Uint8Array => {
|
||||||
|
return encodeMessage(obj, AudioMessage.codec())
|
||||||
|
}
|
||||||
|
|
||||||
|
export const decode = (buf: Uint8Array): AudioMessage => {
|
||||||
|
return decodeMessage(buf, AudioMessage.codec())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface EditMessage {
|
||||||
|
clock: bigint
|
||||||
|
text: string
|
||||||
|
chatId: string
|
||||||
|
messageId: string
|
||||||
|
grant: Uint8Array
|
||||||
|
messageType: MessageType
|
||||||
|
}
|
||||||
|
|
||||||
|
export namespace EditMessage {
|
||||||
|
export const codec = (): Codec<EditMessage> => {
|
||||||
|
return message<EditMessage>({
|
||||||
|
1: { name: 'clock', codec: uint64 },
|
||||||
|
2: { name: 'text', codec: string },
|
||||||
|
3: { name: 'chatId', codec: string },
|
||||||
|
4: { name: 'messageId', codec: string },
|
||||||
|
5: { name: 'grant', codec: bytes },
|
||||||
|
6: { name: 'messageType', codec: MessageType.codec() }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export const encode = (obj: EditMessage): Uint8Array => {
|
||||||
|
return encodeMessage(obj, EditMessage.codec())
|
||||||
|
}
|
||||||
|
|
||||||
|
export const decode = (buf: Uint8Array): EditMessage => {
|
||||||
|
return decodeMessage(buf, EditMessage.codec())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface DeleteMessage {
|
||||||
|
clock: bigint
|
||||||
|
chatId: string
|
||||||
|
messageId: string
|
||||||
|
grant: Uint8Array
|
||||||
|
messageType: MessageType
|
||||||
|
}
|
||||||
|
|
||||||
|
export namespace DeleteMessage {
|
||||||
|
export const codec = (): Codec<DeleteMessage> => {
|
||||||
|
return message<DeleteMessage>({
|
||||||
|
1: { name: 'clock', codec: uint64 },
|
||||||
|
2: { name: 'chatId', codec: string },
|
||||||
|
3: { name: 'messageId', codec: string },
|
||||||
|
4: { name: 'grant', codec: bytes },
|
||||||
|
5: { name: 'messageType', codec: MessageType.codec() }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export const encode = (obj: DeleteMessage): Uint8Array => {
|
||||||
|
return encodeMessage(obj, DeleteMessage.codec())
|
||||||
|
}
|
||||||
|
|
||||||
|
export const decode = (buf: Uint8Array): DeleteMessage => {
|
||||||
|
return decodeMessage(buf, DeleteMessage.codec())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ChatMessage {
|
||||||
|
clock: bigint
|
||||||
|
timestamp: bigint
|
||||||
|
text: string
|
||||||
|
responseTo: string
|
||||||
|
ensName: string
|
||||||
|
chatId: string
|
||||||
|
messageType: MessageType
|
||||||
|
contentType: ChatMessage.ContentType
|
||||||
|
sticker: StickerMessage
|
||||||
|
image: ImageMessage
|
||||||
|
audio: AudioMessage
|
||||||
|
community: Uint8Array
|
||||||
|
grant: Uint8Array
|
||||||
|
displayName: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export namespace ChatMessage {
|
||||||
|
export enum ContentType {
|
||||||
|
UNKNOWN_CONTENT_TYPE = 'UNKNOWN_CONTENT_TYPE',
|
||||||
|
TEXT_PLAIN = 'TEXT_PLAIN',
|
||||||
|
STICKER = 'STICKER',
|
||||||
|
STATUS = 'STATUS',
|
||||||
|
EMOJI = 'EMOJI',
|
||||||
|
TRANSACTION_COMMAND = 'TRANSACTION_COMMAND',
|
||||||
|
SYSTEM_MESSAGE_CONTENT_PRIVATE_GROUP = 'SYSTEM_MESSAGE_CONTENT_PRIVATE_GROUP',
|
||||||
|
IMAGE = 'IMAGE',
|
||||||
|
AUDIO = 'AUDIO',
|
||||||
|
COMMUNITY = 'COMMUNITY',
|
||||||
|
SYSTEM_MESSAGE_GAP = 'SYSTEM_MESSAGE_GAP'
|
||||||
|
}
|
||||||
|
|
||||||
|
enum __ContentTypeValues {
|
||||||
|
UNKNOWN_CONTENT_TYPE = 0,
|
||||||
|
TEXT_PLAIN = 1,
|
||||||
|
STICKER = 2,
|
||||||
|
STATUS = 3,
|
||||||
|
EMOJI = 4,
|
||||||
|
TRANSACTION_COMMAND = 5,
|
||||||
|
SYSTEM_MESSAGE_CONTENT_PRIVATE_GROUP = 6,
|
||||||
|
IMAGE = 7,
|
||||||
|
AUDIO = 8,
|
||||||
|
COMMUNITY = 9,
|
||||||
|
SYSTEM_MESSAGE_GAP = 10
|
||||||
|
}
|
||||||
|
|
||||||
|
export namespace ContentType {
|
||||||
|
export const codec = () => {
|
||||||
|
return enumeration<typeof ContentType>(__ContentTypeValues)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const codec = (): Codec<ChatMessage> => {
|
||||||
|
return message<ChatMessage>({
|
||||||
|
1: { name: 'clock', codec: uint64 },
|
||||||
|
2: { name: 'timestamp', codec: uint64 },
|
||||||
|
3: { name: 'text', codec: string },
|
||||||
|
4: { name: 'responseTo', codec: string },
|
||||||
|
5: { name: 'ensName', codec: string },
|
||||||
|
6: { name: 'chatId', codec: string },
|
||||||
|
7: { name: 'messageType', codec: MessageType.codec() },
|
||||||
|
8: { name: 'contentType', codec: ChatMessage.ContentType.codec() },
|
||||||
|
9: { name: 'sticker', codec: StickerMessage.codec() },
|
||||||
|
10: { name: 'image', codec: ImageMessage.codec() },
|
||||||
|
11: { name: 'audio', codec: AudioMessage.codec() },
|
||||||
|
12: { name: 'community', codec: bytes },
|
||||||
|
13: { name: 'grant', codec: bytes },
|
||||||
|
14: { name: 'displayName', codec: string }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export const encode = (obj: ChatMessage): Uint8Array => {
|
||||||
|
return encodeMessage(obj, ChatMessage.codec())
|
||||||
|
}
|
||||||
|
|
||||||
|
export const decode = (buf: Uint8Array): ChatMessage => {
|
||||||
|
return decodeMessage(buf, ChatMessage.codec())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export enum MessageType {
|
||||||
|
UNKNOWN_MESSAGE_TYPE = 'UNKNOWN_MESSAGE_TYPE',
|
||||||
|
ONE_TO_ONE = 'ONE_TO_ONE',
|
||||||
|
PUBLIC_GROUP = 'PUBLIC_GROUP',
|
||||||
|
PRIVATE_GROUP = 'PRIVATE_GROUP',
|
||||||
|
SYSTEM_MESSAGE_PRIVATE_GROUP = 'SYSTEM_MESSAGE_PRIVATE_GROUP',
|
||||||
|
COMMUNITY_CHAT = 'COMMUNITY_CHAT',
|
||||||
|
SYSTEM_MESSAGE_GAP = 'SYSTEM_MESSAGE_GAP'
|
||||||
|
}
|
||||||
|
|
||||||
|
enum __MessageTypeValues {
|
||||||
|
UNKNOWN_MESSAGE_TYPE = 0,
|
||||||
|
ONE_TO_ONE = 1,
|
||||||
|
PUBLIC_GROUP = 2,
|
||||||
|
PRIVATE_GROUP = 3,
|
||||||
|
SYSTEM_MESSAGE_PRIVATE_GROUP = 4,
|
||||||
|
COMMUNITY_CHAT = 5,
|
||||||
|
SYSTEM_MESSAGE_GAP = 6
|
||||||
|
}
|
||||||
|
|
||||||
|
export namespace MessageType {
|
||||||
|
export const codec = () => {
|
||||||
|
return enumeration<typeof MessageType>(__MessageTypeValues)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export enum ImageType {
|
||||||
|
UNKNOWN_IMAGE_TYPE = 'UNKNOWN_IMAGE_TYPE',
|
||||||
|
PNG = 'PNG',
|
||||||
|
JPEG = 'JPEG',
|
||||||
|
WEBP = 'WEBP',
|
||||||
|
GIF = 'GIF'
|
||||||
|
}
|
||||||
|
|
||||||
|
enum __ImageTypeValues {
|
||||||
|
UNKNOWN_IMAGE_TYPE = 0,
|
||||||
|
PNG = 1,
|
||||||
|
JPEG = 2,
|
||||||
|
WEBP = 3,
|
||||||
|
GIF = 4
|
||||||
|
}
|
||||||
|
|
||||||
|
export namespace ImageType {
|
||||||
|
export const codec = () => {
|
||||||
|
return enumeration<typeof ImageType>(__ImageTypeValues)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export interface EmojiReaction {
|
||||||
|
clock: bigint
|
||||||
|
chatId: string
|
||||||
|
messageId: string
|
||||||
|
messageType: MessageType
|
||||||
|
type: EmojiReaction.Type
|
||||||
|
retracted: boolean
|
||||||
|
grant: Uint8Array
|
||||||
|
}
|
||||||
|
|
||||||
|
export namespace EmojiReaction {
|
||||||
|
export enum Type {
|
||||||
|
UNKNOWN_EMOJI_REACTION_TYPE = 'UNKNOWN_EMOJI_REACTION_TYPE',
|
||||||
|
LOVE = 'LOVE',
|
||||||
|
THUMBS_UP = 'THUMBS_UP',
|
||||||
|
THUMBS_DOWN = 'THUMBS_DOWN',
|
||||||
|
LAUGH = 'LAUGH',
|
||||||
|
SAD = 'SAD',
|
||||||
|
ANGRY = 'ANGRY'
|
||||||
|
}
|
||||||
|
|
||||||
|
enum __TypeValues {
|
||||||
|
UNKNOWN_EMOJI_REACTION_TYPE = 0,
|
||||||
|
LOVE = 1,
|
||||||
|
THUMBS_UP = 2,
|
||||||
|
THUMBS_DOWN = 3,
|
||||||
|
LAUGH = 4,
|
||||||
|
SAD = 5,
|
||||||
|
ANGRY = 6
|
||||||
|
}
|
||||||
|
|
||||||
|
export namespace Type {
|
||||||
|
export const codec = () => {
|
||||||
|
return enumeration<typeof Type>(__TypeValues)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const codec = (): Codec<EmojiReaction> => {
|
||||||
|
return message<EmojiReaction>({
|
||||||
|
1: { name: 'clock', codec: uint64 },
|
||||||
|
2: { name: 'chatId', codec: string },
|
||||||
|
3: { name: 'messageId', codec: string },
|
||||||
|
4: { name: 'messageType', codec: MessageType.codec() },
|
||||||
|
5: { name: 'type', codec: EmojiReaction.Type.codec() },
|
||||||
|
6: { name: 'retracted', codec: bool },
|
||||||
|
7: { name: 'grant', codec: bytes }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export const encode = (obj: EmojiReaction): Uint8Array => {
|
||||||
|
return encodeMessage(obj, EmojiReaction.codec())
|
||||||
|
}
|
||||||
|
|
||||||
|
export const decode = (buf: Uint8Array): EmojiReaction => {
|
||||||
|
return decodeMessage(buf, EmojiReaction.codec())
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue