Use `@bufbuild` (#337)

* remove old `communities.proto`

* fix `protos` npm script

* apply `protos` changes overwriting `Record<>` patches

* update proto files

* regenerate files

* update `protons*` packages

* regen files

* use `protons` generate communities

* add `@bufbuild*` packages

* update `buf` yaml files

* generate `@bufbuild` files

* use `@bufbuild` files

* format

* remove `protobufjs`

* remove `protons`

* resolve build errors

* fix image content type
This commit is contained in:
Felicio Mununga 2023-02-21 12:34:48 +01:00 committed by GitHub
parent 587a0786ad
commit 942146d0be
No known key found for this signature in database
GPG Key ID: 0EB8D75C775AB6F1
52 changed files with 3533 additions and 8816 deletions

View File

@ -1,6 +1,6 @@
version: v1beta1 version: v1
plugins: plugins:
- name: ts_proto - name: es
out: ./src/proto path: ./node_modules/.bin/protoc-gen-es
opt: grpc_js,esModuleInterop=true opt: target=ts
out: ./src/protos

View File

@ -27,18 +27,19 @@
"typegen": "tsc --noEmit false --emitDeclarationOnly || true", "typegen": "tsc --noEmit false --emitDeclarationOnly || true",
"lint": "eslint src", "lint": "eslint src",
"format": "prettier --write src", "format": "prettier --write src",
"protos": "protons protos/*.proto", "protos:list": "buf ls-files src/protos",
"protos:lint": "buf lint src/protos",
"protos": "buf generate src/protos",
"clean": "rm -rf dist node_modules .turbo" "clean": "rm -rf dist node_modules .turbo"
}, },
"dependencies": { "dependencies": {
"@bufbuild/protobuf": "^1.0.0",
"ethereum-cryptography": "^1.0.3", "ethereum-cryptography": "^1.0.3",
"js-waku": "^0.30.0", "js-waku": "^0.30.0",
"long": "^5.2.0", "long": "^5.2.0"
"protobufjs": "^6.11.3",
"protons-runtime": "^1.0.4"
}, },
"devDependencies": { "devDependencies": {
"protons": "^3.0.4" "@bufbuild/protoc-gen-es": "^1.0.0"
}, },
"files": [ "files": [
"dist/", "dist/",

View File

@ -1,80 +0,0 @@
syntax = "proto3";
package communities.v1;
import "communities/v1/chat_identity.proto";
message Grant {
bytes community_id = 1;
bytes member_id = 2;
string chat_id = 3;
uint64 clock = 4;
}
message CommunityMember {
enum Roles {
UNKNOWN_ROLE = 0;
ROLE_ALL = 1;
ROLE_MANAGE_USERS = 2;
}
repeated Roles roles = 1;
}
message CommunityPermissions {
enum Access {
UNKNOWN_ACCESS = 0;
NO_MEMBERSHIP = 1;
INVITATION_ONLY = 2;
ON_REQUEST = 3;
}
bool ens_only = 1;
// https://gitlab.matrix.org/matrix-org/olm/blob/master/docs/megolm.md is a candidate for the algorithm to be used in case we want to have private communityal chats, lighter than pairwise encryption using the DR, less secure, but more efficient for large number of participants
bool private = 2;
Access access = 3;
}
message CommunityDescription {
uint64 clock = 1;
map<string,CommunityMember> members = 2;
CommunityPermissions permissions = 3;
ChatIdentity identity = 5;
map<string,CommunityChat> chats = 6;
repeated string ban_list = 7;
map<string,CommunityCategory> categories = 8;
}
message CommunityChat {
map<string,CommunityMember> members = 1;
CommunityPermissions permissions = 2;
ChatIdentity identity = 3;
string category_id = 4;
int32 position = 5;
}
message CommunityCategory {
string category_id = 1;
string name = 2;
int32 position = 3;
}
message CommunityInvitation {
bytes community_description = 1;
bytes grant = 2;
string chat_id = 3;
bytes public_key = 4;
}
message CommunityRequestToJoin {
uint64 clock = 1;
string ens_name = 2;
string chat_id = 3;
bytes community_id = 4;
}
message CommunityRequestToJoinResponse {
uint64 clock = 1;
CommunityDescription community = 2;
bool accepted = 3;
bytes grant = 4;
}

View File

@ -1,88 +0,0 @@
syntax = "proto3";
message SignedPreKey {
bytes signed_pre_key = 1;
uint32 version = 2;
uint32 protocol_version = 3;
}
// X3DH prekey bundle
message Bundle {
// Identity key
bytes identity = 1;
// Installation id
map<string,SignedPreKey> signed_pre_keys = 2;
// Prekey signature
bytes signature = 4;
// When the bundle was created locally
int64 timestamp = 5;
}
message BundleContainer {
reserved 3;
// X3DH prekey bundle
Bundle bundle = 1;
// Private signed prekey
bytes private_signed_pre_key = 2;
}
message DRHeader {
// Current ratchet public key
bytes key = 1;
// Number of the message in the sending chain
uint32 n = 2;
// Length of the previous sending chain
uint32 pn = 3;
// Bundle ID
bytes id = 4;
}
message DHHeader {
// Compressed ephemeral public key
bytes key = 1;
}
message X3DHHeader {
reserved 3;
// Ephemeral key used
bytes key = 1;
// Used bundle's signed prekey
bytes id = 4;
}
// Hash Ratchet Header
message HRHeader {
// community key ID
uint32 key_id = 1;
// Community message number for this key_id
uint32 seq_no = 2;
// Community ID
string group_id = 3;
}
// Direct message value
message EncryptedMessageProtocol {
X3DHHeader x3dh_header = 1;
DRHeader dr_header = 2;
DHHeader dh_header = 101;
HRHeader hr_header = 102;
// Encrypted payload
bytes payload = 3;
}
// Top-level protocol message
message ProtocolMessage {
// The device id of the sender
string installation_id = 2;
// List of bundles
repeated Bundle bundles = 3;
// One to one message, encrypted, indexed by installation_id
// TODO map here is redundant in case of community messages
map<string,EncryptedMessageProtocol> encrypted_message = 101;
// Public chats, not encrypted
bytes public_message = 102;
}

View File

@ -2,28 +2,33 @@ import { PageDirection } from 'js-waku'
import { SymDecoder } from 'js-waku/lib/waku_message/version_1' import { SymDecoder } from 'js-waku/lib/waku_message/version_1'
import { containsOnlyEmoji } from '../helpers/contains-only-emoji' import { containsOnlyEmoji } from '../helpers/contains-only-emoji'
import { ApplicationMetadataMessage_Type } from '../protos/application-metadata-message_pb'
import { import {
AudioMessage,
ChatMessage as ChatMessageProto, ChatMessage as ChatMessageProto,
ChatMessage_ContentType,
DeleteMessage, DeleteMessage,
EditMessage, EditMessage,
ImageType, } from '../protos/chat-message_pb'
} from '../protos/chat-message' import { EmojiReaction, EmojiReaction_Type } from '../protos/emoji-reaction_pb'
import { EmojiReaction } from '../protos/emoji-reaction' import { MessageType } from '../protos/enums_pb'
import { generateKeyFromPassword } from '../utils/generate-key-from-password' import { generateKeyFromPassword } from '../utils/generate-key-from-password'
import { getNextClock } from '../utils/get-next-clock' import { getNextClock } from '../utils/get-next-clock'
import { idToContentTopic } from '../utils/id-to-content-topic' import { idToContentTopic } from '../utils/id-to-content-topic'
import { getReactions } from './community/get-reactions' import { getReactions } from './community/get-reactions'
import type { CommunityChat } from '../proto/communities/v1/communities' import type { ImageMessage } from '../protos/chat-message_pb'
import type { ImageMessage } from '../protos/chat-message' import type { CommunityChat as CommunityChatProto } from '../protos/communities_pb'
import type { MessageType } from '../protos/enums'
import type { Client } from './client' import type { Client } from './client'
import type { Community } from './community/community' import type { Community } from './community/community'
import type { Reactions } from './community/get-reactions' import type { Reactions } from './community/get-reactions'
import type { Member } from './member' import type { Member } from './member'
import type { PlainMessage } from '@bufbuild/protobuf'
export type ChatMessage = ChatMessageProto & { export { ChatMessage_ContentType as ChatMessageContentType } from '../protos/chat-message_pb'
export type CommunityChat = PlainMessage<CommunityChatProto>
export type ChatMessage = PlainMessage<ChatMessageProto> & {
messageId: string messageId: string
pinned: boolean pinned: boolean
reactions: Reactions reactions: Reactions
@ -453,11 +458,11 @@ export class Chat {
} }
const type = containsOnlyEmoji(text) const type = containsOnlyEmoji(text)
? ChatMessageProto.ContentType.EMOJI ? ChatMessage_ContentType.EMOJI
: ChatMessageProto.ContentType.TEXT_PLAIN : ChatMessage_ContentType.TEXT_PLAIN
// TODO: protos does not support optional fields :-( // TODO: protos does not support optional fields :-(
const payload = ChatMessageProto.encode({ const payload = new ChatMessageProto({
clock: this.setClock(this.#clock), clock: this.setClock(this.#clock),
timestamp: BigInt(Date.now()), timestamp: BigInt(Date.now()),
text, text,
@ -465,24 +470,13 @@ export class Chat {
ensName: '', ensName: '',
chatId: this.id, chatId: this.id,
contentType: type, contentType: type,
messageType: 'COMMUNITY_CHAT' as MessageType, messageType: MessageType.COMMUNITY_CHAT,
sticker: { hash: '', pack: 0 },
image: {
type: ImageType.JPEG,
payload: new Uint8Array([]),
},
audio: {
type: AudioMessage.AudioType.AAC,
payload: new Uint8Array([]),
durationMs: BigInt(0),
},
community: new Uint8Array([]),
grant: new Uint8Array([]), grant: new Uint8Array([]),
displayName: '', displayName: '',
}) }).toBinary()
await this.client.sendWakuMessage( await this.client.sendWakuMessage(
'TYPE_CHAT_MESSAGE', ApplicationMetadataMessage_Type.CHAT_MESSAGE,
payload, payload,
this.contentTopic, this.contentTopic,
this.symmetricKey this.symmetricKey
@ -490,32 +484,28 @@ export class Chat {
} }
public sendImageMessage = async (image: ImageMessage) => { public sendImageMessage = async (image: ImageMessage) => {
const payload = ChatMessageProto.encode({ const payload = new ChatMessageProto({
clock: this.setClock(this.#clock), clock: this.setClock(this.#clock),
timestamp: BigInt(Date.now()), timestamp: BigInt(Date.now()),
text: '', text: '',
responseTo: '', responseTo: '',
ensName: '', ensName: '',
chatId: this.id, chatId: this.id,
messageType: 'COMMUNITY_CHAT' as MessageType, messageType: MessageType.COMMUNITY_CHAT,
contentType: ChatMessageProto.ContentType.TEXT_PLAIN, contentType: ChatMessage_ContentType.IMAGE,
sticker: { hash: '', pack: 0 }, payload: {
image: { case: 'image',
value: {
type: image.type, type: image.type,
payload: image.payload, payload: image.payload,
}, },
audio: {
type: AudioMessage.AudioType.AAC,
payload: new Uint8Array([]),
durationMs: BigInt(0),
}, },
community: new Uint8Array([]),
grant: new Uint8Array([]), grant: new Uint8Array([]),
displayName: '', displayName: '',
}) }).toBinary()
await this.client.sendWakuMessage( await this.client.sendWakuMessage(
'TYPE_CHAT_MESSAGE', ApplicationMetadataMessage_Type.CHAT_MESSAGE,
payload, payload,
this.contentTopic, this.contentTopic,
this.symmetricKey this.symmetricKey
@ -541,17 +531,17 @@ export class Chat {
throw new Error('Text message cannot be empty') throw new Error('Text message cannot be empty')
} }
const payload = EditMessage.encode({ const payload = new EditMessage({
clock: this.setClock(this.#clock), clock: this.setClock(this.#clock),
text, text,
messageId, messageId,
chatId: this.id, chatId: this.id,
grant: new Uint8Array([]), grant: new Uint8Array([]),
messageType: 'COMMUNITY_CHAT' as MessageType, messageType: MessageType.COMMUNITY_CHAT,
}) }).toBinary()
await this.client.sendWakuMessage( await this.client.sendWakuMessage(
'TYPE_EDIT_MESSAGE', ApplicationMetadataMessage_Type.EDIT_MESSAGE,
payload, payload,
this.contentTopic, this.contentTopic,
this.symmetricKey this.symmetricKey
@ -575,16 +565,16 @@ export class Chat {
throw new Error('Text message can only be deleted by its author') throw new Error('Text message can only be deleted by its author')
} }
const payload = DeleteMessage.encode({ const payload = new DeleteMessage({
clock: this.setClock(this.#clock), clock: this.setClock(this.#clock),
messageId, messageId,
chatId: this.id, chatId: this.id,
grant: new Uint8Array([]), grant: new Uint8Array([]),
messageType: 'COMMUNITY_CHAT' as MessageType, messageType: MessageType.COMMUNITY_CHAT,
}) }).toBinary()
await this.client.sendWakuMessage( await this.client.sendWakuMessage(
'TYPE_DELETE_MESSAGE', ApplicationMetadataMessage_Type.DELETE_MESSAGE,
payload, payload,
this.contentTopic, this.contentTopic,
this.symmetricKey this.symmetricKey
@ -609,18 +599,18 @@ export class Chat {
`0x${this.client.account.publicKey}` `0x${this.client.account.publicKey}`
) )
const payload = EmojiReaction.encode({ const payload = new EmojiReaction({
clock: this.setClock(this.#clock), clock: this.setClock(this.#clock),
chatId: this.id, chatId: this.id,
messageType: 'COMMUNITY_CHAT' as MessageType, messageType: MessageType.COMMUNITY_CHAT,
messageId, messageId,
type: reaction as EmojiReaction.Type, type: EmojiReaction_Type[reaction],
retracted, retracted,
grant: new Uint8Array([]), grant: new Uint8Array([]),
}) }).toBinary()
await this.client.sendWakuMessage( await this.client.sendWakuMessage(
'TYPE_EMOJI_REACTION', ApplicationMetadataMessage_Type.EMOJI_REACTION,
payload, payload,
this.contentTopic, this.contentTopic,
this.symmetricKey this.symmetricKey

View File

@ -10,13 +10,14 @@ import { waitForRemotePeer } from 'js-waku/lib/wait_for_remote_peer'
import { SymEncoder } from 'js-waku/lib/waku_message/version_1' import { SymEncoder } from 'js-waku/lib/waku_message/version_1'
import { peers } from '../consts/peers' import { peers } from '../consts/peers'
import { ApplicationMetadataMessage } from '../protos/application-metadata-message' import { ApplicationMetadataMessage } from '../protos/application-metadata-message_pb'
import { Account } from './account' import { Account } from './account'
import { ActivityCenter } from './activityCenter' import { ActivityCenter } from './activityCenter'
import { Community } from './community/community' import { Community } from './community/community'
import { handleWakuMessage } from './community/handle-waku-message' import { handleWakuMessage } from './community/handle-waku-message'
import { LocalStorage } from './storage' import { LocalStorage } from './storage'
import type { ApplicationMetadataMessage_Type } from '../protos/application-metadata-message_pb'
import type { Storage } from './storage' import type { Storage } from './storage'
import type { WakuLight } from 'js-waku/lib/interfaces' import type { WakuLight } from 'js-waku/lib/interfaces'
import type { MessageV1 as WakuMessage } from 'js-waku/lib/waku_message/version_1' import type { MessageV1 as WakuMessage } from 'js-waku/lib/waku_message/version_1'
@ -238,7 +239,7 @@ class Client {
} }
public sendWakuMessage = async ( public sendWakuMessage = async (
type: keyof typeof ApplicationMetadataMessage.Type, type: ApplicationMetadataMessage_Type,
payload: Uint8Array, payload: Uint8Array,
contentTopic: string, contentTopic: string,
symKey: Uint8Array symKey: Uint8Array
@ -253,11 +254,11 @@ class Client {
const signature = await this.#account.sign(payload) const signature = await this.#account.sign(payload)
const message = ApplicationMetadataMessage.encode({ const message = new ApplicationMetadataMessage({
type: type as ApplicationMetadataMessage.Type, type: type,
signature, signature,
payload, payload,
}) }).toBinary()
await this.waku.lightPush.push( await this.waku.lightPush.push(
new SymEncoder( new SymEncoder(

View File

@ -3,8 +3,9 @@ import { SymDecoder } from 'js-waku/lib/waku_message/version_1'
import { getDifferenceByKeys } from '../../helpers/get-difference-by-keys' import { getDifferenceByKeys } from '../../helpers/get-difference-by-keys'
import { getObjectsDifference } from '../../helpers/get-objects-difference' import { getObjectsDifference } from '../../helpers/get-objects-difference'
import { CommunityRequestToJoin } from '../../protos/communities' import { ApplicationMetadataMessage_Type } from '../../protos/application-metadata-message_pb'
import { MessageType } from '../../protos/enums' import { CommunityRequestToJoin } from '../../protos/communities_pb'
import { MessageType } from '../../protos/enums_pb'
import { compressPublicKey } from '../../utils/compress-public-key' import { compressPublicKey } from '../../utils/compress-public-key'
import { generateKeyFromPassword } from '../../utils/generate-key-from-password' import { generateKeyFromPassword } from '../../utils/generate-key-from-password'
import { getNextClock } from '../../utils/get-next-clock' import { getNextClock } from '../../utils/get-next-clock'
@ -12,11 +13,12 @@ import { idToContentTopic } from '../../utils/id-to-content-topic'
import { Chat } from '../chat' import { Chat } from '../chat'
import { Member } from '../member' import { Member } from '../member'
import type { import type { CommunityDescription as CommunityDescriptionProto } from '../../protos/communities_pb'
CommunityChat, import type { CommunityChat } from '../chat'
CommunityDescription,
} from '../../proto/communities/v1/communities'
import type { Client } from '../client' import type { Client } from '../client'
import type { PlainMessage } from '@bufbuild/protobuf'
type CommunityDescription = PlainMessage<CommunityDescriptionProto>
export class Community { export class Community {
private client: Client private client: Client
@ -239,15 +241,15 @@ export class Community {
} }
public requestToJoin = async (chatId = '') => { public requestToJoin = async (chatId = '') => {
const payload = CommunityRequestToJoin.encode({ const payload = new CommunityRequestToJoin({
clock: this.setClock(this.#clock), clock: this.setClock(this.#clock),
chatId, chatId,
communityId: hexToBytes(this.id), communityId: hexToBytes(this.id),
ensName: '', ensName: '',
}) }).toBinary()
await this.client.sendWakuMessage( await this.client.sendWakuMessage(
'TYPE_COMMUNITY_REQUEST_TO_JOIN', ApplicationMetadataMessage_Type.COMMUNITY_REQUEST_TO_JOIN,
payload, payload,
this.contentTopic, this.contentTopic,
this.symmetricKey this.symmetricKey

View File

@ -1,6 +1,11 @@
import type { EmojiReaction } from '../../protos/emoji-reaction' import { EmojiReaction_Type } from '../../protos/emoji-reaction_pb'
type Reaction = Exclude<`${EmojiReaction.Type}`, 'UNKNOWN_EMOJI_REACTION_TYPE'> import type { EmojiReaction } from '../../protos/emoji-reaction_pb'
export type Reaction = Exclude<
keyof typeof EmojiReaction_Type,
'UNKNOWN_EMOJI_REACTION_TYPE'
>
export type Reactions = { export type Reactions = {
[key in Reaction]: Set<string> [key in Reaction]: Set<string>
@ -13,15 +18,17 @@ export function getReactions(
): Reactions { ): Reactions {
const { type, retracted } = reaction const { type, retracted } = reaction
if (type === 'UNKNOWN_EMOJI_REACTION_TYPE') { if (type === EmojiReaction_Type.UNKNOWN_EMOJI_REACTION_TYPE) {
return reactions return reactions
} }
const reactionName = EmojiReaction_Type[type] as Reaction
if (retracted) { if (retracted) {
reactions[type].delete(publicKey) reactions[reactionName].delete(publicKey)
} else { } else {
// Set handles that potentially multiple same reactions count as one // Set handles that potentially multiple same reactions count as one
reactions[type].add(publicKey) reactions[reactionName].add(publicKey)
} }
return reactions return reactions

View File

@ -1,16 +1,19 @@
import { bytesToHex } from 'ethereum-cryptography/utils' import { bytesToHex } from 'ethereum-cryptography/utils'
import { CommunityDescription } from '../../proto/communities/v1/communities' import {
import { ApplicationMetadataMessage } from '../../protos/application-metadata-message' ApplicationMetadataMessage,
ApplicationMetadataMessage_Type,
} from '../../protos/application-metadata-message_pb'
import { import {
ChatMessage, ChatMessage,
DeleteMessage, DeleteMessage,
EditMessage, EditMessage,
MessageType, } from '../../protos/chat-message_pb'
} from '../../protos/chat-message' import { CommunityDescription } from '../../protos/communities_pb'
import { EmojiReaction } from '../../protos/emoji-reaction' import { EmojiReaction } from '../../protos/emoji-reaction_pb'
import { PinMessage } from '../../protos/pin-message' import { MessageType } from '../../protos/enums_pb'
import { ProtocolMessage } from '../../protos/protocol-message' import { PinMessage } from '../../protos/pin-message_pb'
import { ProtocolMessage } from '../../protos/protocol-message_pb'
import { isClockValid } from '../../utils/is-clock-valid' import { isClockValid } from '../../utils/is-clock-valid'
import { payloadToId } from '../../utils/payload-to-id' import { payloadToId } from '../../utils/payload-to-id'
import { recoverPublicKey } from '../../utils/recover-public-key' import { recoverPublicKey } from '../../utils/recover-public-key'
@ -46,7 +49,7 @@ export function handleWakuMessage(
let messageToDecode = wakuMessage.payload let messageToDecode = wakuMessage.payload
let decodedProtocol let decodedProtocol
try { try {
decodedProtocol = ProtocolMessage.decode(messageToDecode) decodedProtocol = ProtocolMessage.fromBinary(messageToDecode)
if (decodedProtocol) { if (decodedProtocol) {
messageToDecode = decodedProtocol.publicMessage messageToDecode = decodedProtocol.publicMessage
} }
@ -54,7 +57,7 @@ export function handleWakuMessage(
// eslint-disable-next-line no-empty // eslint-disable-next-line no-empty
} }
const decodedMetadata = ApplicationMetadataMessage.decode(messageToDecode) const decodedMetadata = ApplicationMetadataMessage.fromBinary(messageToDecode)
if (!decodedMetadata.payload) { if (!decodedMetadata.payload) {
return return
} }
@ -82,9 +85,9 @@ export function handleWakuMessage(
try { try {
// decode, map and handle (events) // decode, map and handle (events)
switch (decodedMetadata.type) { switch (decodedMetadata.type) {
case ApplicationMetadataMessage.Type.TYPE_COMMUNITY_DESCRIPTION: { case ApplicationMetadataMessage_Type.COMMUNITY_DESCRIPTION: {
// decode // decode
const decodedPayload = CommunityDescription.decode(messageToDecode) const decodedPayload = CommunityDescription.fromBinary(messageToDecode)
// validate // validate
if (!isClockValid(BigInt(decodedPayload.clock), messageTimestamp)) { if (!isClockValid(BigInt(decodedPayload.clock), messageTimestamp)) {
@ -104,9 +107,9 @@ export function handleWakuMessage(
break break
} }
case ApplicationMetadataMessage.Type.TYPE_CHAT_MESSAGE: { case ApplicationMetadataMessage_Type.CHAT_MESSAGE: {
// decode // decode
const decodedPayload = ChatMessage.decode(messageToDecode) const decodedPayload = ChatMessage.fromBinary(messageToDecode)
if (!isClockValid(BigInt(decodedPayload.clock), messageTimestamp)) { if (!isClockValid(BigInt(decodedPayload.clock), messageTimestamp)) {
return return
@ -149,8 +152,8 @@ export function handleWakuMessage(
break break
} }
case ApplicationMetadataMessage.Type.TYPE_EDIT_MESSAGE: { case ApplicationMetadataMessage_Type.EDIT_MESSAGE: {
const decodedPayload = EditMessage.decode(messageToDecode) const decodedPayload = EditMessage.fromBinary(messageToDecode)
if (!isClockValid(BigInt(decodedPayload.clock), messageTimestamp)) { if (!isClockValid(BigInt(decodedPayload.clock), messageTimestamp)) {
return return
@ -189,8 +192,8 @@ export function handleWakuMessage(
break break
} }
case ApplicationMetadataMessage.Type.TYPE_DELETE_MESSAGE: { case ApplicationMetadataMessage_Type.DELETE_MESSAGE: {
const decodedPayload = DeleteMessage.decode(messageToDecode) const decodedPayload = DeleteMessage.fromBinary(messageToDecode)
if (!isClockValid(BigInt(decodedPayload.clock), messageTimestamp)) { if (!isClockValid(BigInt(decodedPayload.clock), messageTimestamp)) {
return return
@ -228,8 +231,8 @@ export function handleWakuMessage(
break break
} }
case ApplicationMetadataMessage.Type.TYPE_PIN_MESSAGE: { case ApplicationMetadataMessage_Type.PIN_MESSAGE: {
const decodedPayload = PinMessage.decode(messageToDecode) const decodedPayload = PinMessage.fromBinary(messageToDecode)
if (!isClockValid(BigInt(decodedPayload.clock), messageTimestamp)) { if (!isClockValid(BigInt(decodedPayload.clock), messageTimestamp)) {
return return
@ -267,8 +270,8 @@ export function handleWakuMessage(
break break
} }
case ApplicationMetadataMessage.Type.TYPE_EMOJI_REACTION: { case ApplicationMetadataMessage_Type.EMOJI_REACTION: {
const decodedPayload = EmojiReaction.decode(messageToDecode) const decodedPayload = EmojiReaction.fromBinary(messageToDecode)
if (!isClockValid(BigInt(decodedPayload.clock), messageTimestamp)) { if (!isClockValid(BigInt(decodedPayload.clock), messageTimestamp)) {
return return

View File

@ -1,4 +1,4 @@
import type { ChatMessage as ChatMessageProto } from '../../protos/chat-message' import type { ChatMessage as ChatMessageProto } from '../../protos/chat-message_pb'
import type { Chat, ChatMessage } from '../chat' import type { Chat, ChatMessage } from '../chat'
import type { Community } from './community' import type { Community } from './community'

View File

@ -5,8 +5,9 @@ export type {
Notification, Notification,
} from './client/activityCenter' } from './client/activityCenter'
export type { ChatMessage as Message } from './client/chat' export type { ChatMessage as Message } from './client/chat'
export { ChatMessageContentType as MessageContentType } from './client/chat'
export type { Client, ClientOptions } from './client/client' export type { Client, ClientOptions } from './client/client'
export { createClient } from './client/client' export { createClient } from './client/client'
export type { Community } from './client/community/community' export type { Community } from './client/community/community'
export type { Reactions } from './client/community/get-reactions' export type { Reaction, Reactions } from './client/community/get-reactions'
export type { Member } from './client/member' export type { Member } from './client/member'

View File

@ -1,526 +0,0 @@
/* eslint-disable */
import Long from 'long'
import _m0 from 'protobufjs/minimal'
import { ImageType, imageTypeFromJSON, imageTypeToJSON } from './enums'
export const protobufPackage = 'communities.v1'
/** ChatIdentity represents the user defined identity associated with their public chat key */
export interface ChatIdentity {
/** Lamport timestamp of the message */
clock: number
/** ens_name is the valid ENS name associated with the chat key */
ensName: string
/** images is a string indexed mapping of images associated with an identity */
images: { [key: string]: IdentityImage }
/** display name is the user set identity, valid only for organisations */
displayName: string
/** description is the user set description, valid only for organisations */
description: string
color: string
emoji: string
}
export interface ChatIdentity_ImagesEntry {
key: string
value: IdentityImage | undefined
}
/** ProfileImage represents data associated with a user's profile image */
export interface IdentityImage {
/**
* payload is a context based payload for the profile image data,
* context is determined by the `source_type`
*/
payload: Uint8Array
/** source_type signals the image payload source */
sourceType: IdentityImage_SourceType
/** image_type signals the image type and method of parsing the payload */
imageType: ImageType
}
/** SourceType are the predefined types of image source allowed */
export enum IdentityImage_SourceType {
UNKNOWN_SOURCE_TYPE = 0,
/** RAW_PAYLOAD - RAW_PAYLOAD image byte data */
RAW_PAYLOAD = 1,
/**
* ENS_AVATAR - ENS_AVATAR uses the ENS record's resolver get-text-data.avatar data
* The `payload` field will be ignored if ENS_AVATAR is selected
* The application will read and parse the ENS avatar data as image payload data, URLs will be ignored
* The parent `ChatMessageIdentity` must have a valid `ens_name` set
*/
ENS_AVATAR = 2,
UNRECOGNIZED = -1,
}
export function identityImage_SourceTypeFromJSON(
object: any
): IdentityImage_SourceType {
switch (object) {
case 0:
case 'UNKNOWN_SOURCE_TYPE':
return IdentityImage_SourceType.UNKNOWN_SOURCE_TYPE
case 1:
case 'RAW_PAYLOAD':
return IdentityImage_SourceType.RAW_PAYLOAD
case 2:
case 'ENS_AVATAR':
return IdentityImage_SourceType.ENS_AVATAR
case -1:
case 'UNRECOGNIZED':
default:
return IdentityImage_SourceType.UNRECOGNIZED
}
}
export function identityImage_SourceTypeToJSON(
object: IdentityImage_SourceType
): string {
switch (object) {
case IdentityImage_SourceType.UNKNOWN_SOURCE_TYPE:
return 'UNKNOWN_SOURCE_TYPE'
case IdentityImage_SourceType.RAW_PAYLOAD:
return 'RAW_PAYLOAD'
case IdentityImage_SourceType.ENS_AVATAR:
return 'ENS_AVATAR'
default:
return 'UNKNOWN'
}
}
const baseChatIdentity: object = {
clock: 0,
ensName: '',
displayName: '',
description: '',
color: '',
emoji: '',
}
export const ChatIdentity = {
encode(
message: ChatIdentity,
writer: _m0.Writer = _m0.Writer.create()
): _m0.Writer {
if (message.clock !== 0) {
writer.uint32(8).uint64(message.clock)
}
if (message.ensName !== '') {
writer.uint32(18).string(message.ensName)
}
Object.entries(message.images).forEach(([key, value]) => {
ChatIdentity_ImagesEntry.encode(
{ key: key as any, value },
writer.uint32(26).fork()
).ldelim()
})
if (message.displayName !== '') {
writer.uint32(34).string(message.displayName)
}
if (message.description !== '') {
writer.uint32(42).string(message.description)
}
if (message.color !== '') {
writer.uint32(50).string(message.color)
}
if (message.emoji !== '') {
writer.uint32(58).string(message.emoji)
}
return writer
},
decode(input: _m0.Reader | Uint8Array, length?: number): ChatIdentity {
const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input)
let end = length === undefined ? reader.len : reader.pos + length
const message = { ...baseChatIdentity } as ChatIdentity
message.images = {}
while (reader.pos < end) {
const tag = reader.uint32()
switch (tag >>> 3) {
case 1:
message.clock = longToNumber(reader.uint64() as Long)
break
case 2:
message.ensName = reader.string()
break
case 3:
const entry3 = ChatIdentity_ImagesEntry.decode(
reader,
reader.uint32()
)
if (entry3.value !== undefined) {
message.images[entry3.key] = entry3.value
}
break
case 4:
message.displayName = reader.string()
break
case 5:
message.description = reader.string()
break
case 6:
message.color = reader.string()
break
case 7:
message.emoji = reader.string()
break
default:
reader.skipType(tag & 7)
break
}
}
return message
},
fromJSON(object: any): ChatIdentity {
const message = { ...baseChatIdentity } as ChatIdentity
message.images = {}
if (object.clock !== undefined && object.clock !== null) {
message.clock = Number(object.clock)
} else {
message.clock = 0
}
if (object.ensName !== undefined && object.ensName !== null) {
message.ensName = String(object.ensName)
} else {
message.ensName = ''
}
if (object.images !== undefined && object.images !== null) {
Object.entries(object.images).forEach(([key, value]) => {
message.images[key] = IdentityImage.fromJSON(value)
})
}
if (object.displayName !== undefined && object.displayName !== null) {
message.displayName = String(object.displayName)
} else {
message.displayName = ''
}
if (object.description !== undefined && object.description !== null) {
message.description = String(object.description)
} else {
message.description = ''
}
if (object.color !== undefined && object.color !== null) {
message.color = String(object.color)
} else {
message.color = ''
}
if (object.emoji !== undefined && object.emoji !== null) {
message.emoji = String(object.emoji)
} else {
message.emoji = ''
}
return message
},
toJSON(message: ChatIdentity): unknown {
const obj: any = {}
message.clock !== undefined && (obj.clock = message.clock)
message.ensName !== undefined && (obj.ensName = message.ensName)
obj.images = {}
if (message.images) {
Object.entries(message.images).forEach(([k, v]) => {
obj.images[k] = IdentityImage.toJSON(v)
})
}
message.displayName !== undefined && (obj.displayName = message.displayName)
message.description !== undefined && (obj.description = message.description)
message.color !== undefined && (obj.color = message.color)
message.emoji !== undefined && (obj.emoji = message.emoji)
return obj
},
fromPartial(object: DeepPartial<ChatIdentity>): ChatIdentity {
const message = { ...baseChatIdentity } as ChatIdentity
message.images = {}
if (object.clock !== undefined && object.clock !== null) {
message.clock = object.clock
} else {
message.clock = 0
}
if (object.ensName !== undefined && object.ensName !== null) {
message.ensName = object.ensName
} else {
message.ensName = ''
}
if (object.images !== undefined && object.images !== null) {
Object.entries(object.images).forEach(([key, value]) => {
if (value !== undefined) {
message.images[key] = IdentityImage.fromPartial(value)
}
})
}
if (object.displayName !== undefined && object.displayName !== null) {
message.displayName = object.displayName
} else {
message.displayName = ''
}
if (object.description !== undefined && object.description !== null) {
message.description = object.description
} else {
message.description = ''
}
if (object.color !== undefined && object.color !== null) {
message.color = object.color
} else {
message.color = ''
}
if (object.emoji !== undefined && object.emoji !== null) {
message.emoji = object.emoji
} else {
message.emoji = ''
}
return message
},
}
const baseChatIdentity_ImagesEntry: object = { key: '' }
export const ChatIdentity_ImagesEntry = {
encode(
message: ChatIdentity_ImagesEntry,
writer: _m0.Writer = _m0.Writer.create()
): _m0.Writer {
if (message.key !== '') {
writer.uint32(10).string(message.key)
}
if (message.value !== undefined) {
IdentityImage.encode(message.value, writer.uint32(18).fork()).ldelim()
}
return writer
},
decode(
input: _m0.Reader | Uint8Array,
length?: number
): ChatIdentity_ImagesEntry {
const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input)
let end = length === undefined ? reader.len : reader.pos + length
const message = {
...baseChatIdentity_ImagesEntry,
} as ChatIdentity_ImagesEntry
while (reader.pos < end) {
const tag = reader.uint32()
switch (tag >>> 3) {
case 1:
message.key = reader.string()
break
case 2:
message.value = IdentityImage.decode(reader, reader.uint32())
break
default:
reader.skipType(tag & 7)
break
}
}
return message
},
fromJSON(object: any): ChatIdentity_ImagesEntry {
const message = {
...baseChatIdentity_ImagesEntry,
} as ChatIdentity_ImagesEntry
if (object.key !== undefined && object.key !== null) {
message.key = String(object.key)
} else {
message.key = ''
}
if (object.value !== undefined && object.value !== null) {
message.value = IdentityImage.fromJSON(object.value)
} else {
message.value = undefined
}
return message
},
toJSON(message: ChatIdentity_ImagesEntry): unknown {
const obj: any = {}
message.key !== undefined && (obj.key = message.key)
message.value !== undefined &&
(obj.value = message.value
? IdentityImage.toJSON(message.value)
: undefined)
return obj
},
fromPartial(
object: DeepPartial<ChatIdentity_ImagesEntry>
): ChatIdentity_ImagesEntry {
const message = {
...baseChatIdentity_ImagesEntry,
} as ChatIdentity_ImagesEntry
if (object.key !== undefined && object.key !== null) {
message.key = object.key
} else {
message.key = ''
}
if (object.value !== undefined && object.value !== null) {
message.value = IdentityImage.fromPartial(object.value)
} else {
message.value = undefined
}
return message
},
}
const baseIdentityImage: object = { sourceType: 0, imageType: 0 }
export const IdentityImage = {
encode(
message: IdentityImage,
writer: _m0.Writer = _m0.Writer.create()
): _m0.Writer {
if (message.payload.length !== 0) {
writer.uint32(10).bytes(message.payload)
}
if (message.sourceType !== 0) {
writer.uint32(16).int32(message.sourceType)
}
if (message.imageType !== 0) {
writer.uint32(24).int32(message.imageType)
}
return writer
},
decode(input: _m0.Reader | Uint8Array, length?: number): IdentityImage {
const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input)
let end = length === undefined ? reader.len : reader.pos + length
const message = { ...baseIdentityImage } as IdentityImage
message.payload = new Uint8Array()
while (reader.pos < end) {
const tag = reader.uint32()
switch (tag >>> 3) {
case 1:
message.payload = reader.bytes()
break
case 2:
message.sourceType = reader.int32() as any
break
case 3:
message.imageType = reader.int32() as any
break
default:
reader.skipType(tag & 7)
break
}
}
return message
},
fromJSON(object: any): IdentityImage {
const message = { ...baseIdentityImage } as IdentityImage
message.payload = new Uint8Array()
if (object.payload !== undefined && object.payload !== null) {
message.payload = bytesFromBase64(object.payload)
}
if (object.sourceType !== undefined && object.sourceType !== null) {
message.sourceType = identityImage_SourceTypeFromJSON(object.sourceType)
} else {
message.sourceType = 0
}
if (object.imageType !== undefined && object.imageType !== null) {
message.imageType = imageTypeFromJSON(object.imageType)
} else {
message.imageType = 0
}
return message
},
toJSON(message: IdentityImage): unknown {
const obj: any = {}
message.payload !== undefined &&
(obj.payload = base64FromBytes(
message.payload !== undefined ? message.payload : new Uint8Array()
))
message.sourceType !== undefined &&
(obj.sourceType = identityImage_SourceTypeToJSON(message.sourceType))
message.imageType !== undefined &&
(obj.imageType = imageTypeToJSON(message.imageType))
return obj
},
fromPartial(object: DeepPartial<IdentityImage>): IdentityImage {
const message = { ...baseIdentityImage } as IdentityImage
if (object.payload !== undefined && object.payload !== null) {
message.payload = object.payload
} else {
message.payload = new Uint8Array()
}
if (object.sourceType !== undefined && object.sourceType !== null) {
message.sourceType = object.sourceType
} else {
message.sourceType = 0
}
if (object.imageType !== undefined && object.imageType !== null) {
message.imageType = object.imageType
} else {
message.imageType = 0
}
return message
},
}
declare var self: any | undefined
declare var window: any | undefined
declare var global: any | undefined
var globalThis: any = (() => {
if (typeof globalThis !== 'undefined') return globalThis
if (typeof self !== 'undefined') return self
if (typeof window !== 'undefined') return window
if (typeof global !== 'undefined') return global
throw 'Unable to locate global object'
})()
const atob: (b64: string) => string =
globalThis.atob ||
(b64 => globalThis.Buffer.from(b64, 'base64').toString('binary'))
function bytesFromBase64(b64: string): Uint8Array {
const bin = atob(b64)
const arr = new Uint8Array(bin.length)
for (let i = 0; i < bin.length; ++i) {
arr[i] = bin.charCodeAt(i)
}
return arr
}
const btoa: (bin: string) => string =
globalThis.btoa ||
(bin => globalThis.Buffer.from(bin, 'binary').toString('base64'))
function base64FromBytes(arr: Uint8Array): string {
const bin: string[] = []
for (const byte of arr) {
bin.push(String.fromCharCode(byte))
}
return btoa(bin.join(''))
}
type Builtin =
| Date
| Function
| Uint8Array
| string
| number
| boolean
| undefined
export type DeepPartial<T> = T extends Builtin
? T
: T extends Array<infer U>
? Array<DeepPartial<U>>
: T extends ReadonlyArray<infer U>
? ReadonlyArray<DeepPartial<U>>
: T extends {}
? { [K in keyof T]?: DeepPartial<T[K]> }
: Partial<T>
function longToNumber(long: Long): number {
if (long.gt(Number.MAX_SAFE_INTEGER)) {
throw new globalThis.Error('Value is larger than Number.MAX_SAFE_INTEGER')
}
return long.toNumber()
}
if (_m0.util.Long !== Long) {
_m0.util.Long = Long as any
_m0.configure()
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,324 +0,0 @@
/* eslint-disable */
import Long from 'long'
import _m0 from 'protobufjs/minimal'
import { MessageType, messageTypeFromJSON, messageTypeToJSON } from './enums'
export const protobufPackage = 'communities.v1'
export interface EmojiReaction {
/** clock Lamport timestamp of the chat message */
clock: number
/**
* chat_id the ID of the chat the message belongs to, for query efficiency the chat_id is stored in the db even though the
* target message also stores the chat_id
*/
chatId: string
/** message_id the ID of the target message that the user wishes to react to */
messageId: string
/** message_type is (somewhat confusingly) the ID of the type of chat the message belongs to */
messageType: MessageType
/** type the ID of the emoji the user wishes to react with */
type: EmojiReaction_Type
/** whether this is a rectraction of a previously sent emoji */
retracted: boolean
/** Grant for organisation chat messages */
grant: Uint8Array
}
export enum EmojiReaction_Type {
UNKNOWN_EMOJI_REACTION_TYPE = 0,
LOVE = 1,
THUMBS_UP = 2,
THUMBS_DOWN = 3,
LAUGH = 4,
SAD = 5,
ANGRY = 6,
UNRECOGNIZED = -1,
}
export function emojiReaction_TypeFromJSON(object: any): EmojiReaction_Type {
switch (object) {
case 0:
case 'UNKNOWN_EMOJI_REACTION_TYPE':
return EmojiReaction_Type.UNKNOWN_EMOJI_REACTION_TYPE
case 1:
case 'LOVE':
return EmojiReaction_Type.LOVE
case 2:
case 'THUMBS_UP':
return EmojiReaction_Type.THUMBS_UP
case 3:
case 'THUMBS_DOWN':
return EmojiReaction_Type.THUMBS_DOWN
case 4:
case 'LAUGH':
return EmojiReaction_Type.LAUGH
case 5:
case 'SAD':
return EmojiReaction_Type.SAD
case 6:
case 'ANGRY':
return EmojiReaction_Type.ANGRY
case -1:
case 'UNRECOGNIZED':
default:
return EmojiReaction_Type.UNRECOGNIZED
}
}
export function emojiReaction_TypeToJSON(object: EmojiReaction_Type): string {
switch (object) {
case EmojiReaction_Type.UNKNOWN_EMOJI_REACTION_TYPE:
return 'UNKNOWN_EMOJI_REACTION_TYPE'
case EmojiReaction_Type.LOVE:
return 'LOVE'
case EmojiReaction_Type.THUMBS_UP:
return 'THUMBS_UP'
case EmojiReaction_Type.THUMBS_DOWN:
return 'THUMBS_DOWN'
case EmojiReaction_Type.LAUGH:
return 'LAUGH'
case EmojiReaction_Type.SAD:
return 'SAD'
case EmojiReaction_Type.ANGRY:
return 'ANGRY'
default:
return 'UNKNOWN'
}
}
const baseEmojiReaction: object = {
clock: 0,
chatId: '',
messageId: '',
messageType: 0,
type: 0,
retracted: false,
}
export const EmojiReaction = {
encode(
message: EmojiReaction,
writer: _m0.Writer = _m0.Writer.create()
): _m0.Writer {
if (message.clock !== 0) {
writer.uint32(8).uint64(message.clock)
}
if (message.chatId !== '') {
writer.uint32(18).string(message.chatId)
}
if (message.messageId !== '') {
writer.uint32(26).string(message.messageId)
}
if (message.messageType !== 0) {
writer.uint32(32).int32(message.messageType)
}
if (message.type !== 0) {
writer.uint32(40).int32(message.type)
}
if (message.retracted === true) {
writer.uint32(48).bool(message.retracted)
}
if (message.grant.length !== 0) {
writer.uint32(58).bytes(message.grant)
}
return writer
},
decode(input: _m0.Reader | Uint8Array, length?: number): EmojiReaction {
const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input)
let end = length === undefined ? reader.len : reader.pos + length
const message = { ...baseEmojiReaction } as EmojiReaction
message.grant = new Uint8Array()
while (reader.pos < end) {
const tag = reader.uint32()
switch (tag >>> 3) {
case 1:
message.clock = longToNumber(reader.uint64() as Long)
break
case 2:
message.chatId = reader.string()
break
case 3:
message.messageId = reader.string()
break
case 4:
message.messageType = reader.int32() as any
break
case 5:
message.type = reader.int32() as any
break
case 6:
message.retracted = reader.bool()
break
case 7:
message.grant = reader.bytes()
break
default:
reader.skipType(tag & 7)
break
}
}
return message
},
fromJSON(object: any): EmojiReaction {
const message = { ...baseEmojiReaction } as EmojiReaction
message.grant = new Uint8Array()
if (object.clock !== undefined && object.clock !== null) {
message.clock = Number(object.clock)
} else {
message.clock = 0
}
if (object.chatId !== undefined && object.chatId !== null) {
message.chatId = String(object.chatId)
} else {
message.chatId = ''
}
if (object.messageId !== undefined && object.messageId !== null) {
message.messageId = String(object.messageId)
} else {
message.messageId = ''
}
if (object.messageType !== undefined && object.messageType !== null) {
message.messageType = messageTypeFromJSON(object.messageType)
} else {
message.messageType = 0
}
if (object.type !== undefined && object.type !== null) {
message.type = emojiReaction_TypeFromJSON(object.type)
} else {
message.type = 0
}
if (object.retracted !== undefined && object.retracted !== null) {
message.retracted = Boolean(object.retracted)
} else {
message.retracted = false
}
if (object.grant !== undefined && object.grant !== null) {
message.grant = bytesFromBase64(object.grant)
}
return message
},
toJSON(message: EmojiReaction): unknown {
const obj: any = {}
message.clock !== undefined && (obj.clock = message.clock)
message.chatId !== undefined && (obj.chatId = message.chatId)
message.messageId !== undefined && (obj.messageId = message.messageId)
message.messageType !== undefined &&
(obj.messageType = messageTypeToJSON(message.messageType))
message.type !== undefined &&
(obj.type = emojiReaction_TypeToJSON(message.type))
message.retracted !== undefined && (obj.retracted = message.retracted)
message.grant !== undefined &&
(obj.grant = base64FromBytes(
message.grant !== undefined ? message.grant : new Uint8Array()
))
return obj
},
fromPartial(object: DeepPartial<EmojiReaction>): EmojiReaction {
const message = { ...baseEmojiReaction } as EmojiReaction
if (object.clock !== undefined && object.clock !== null) {
message.clock = object.clock
} else {
message.clock = 0
}
if (object.chatId !== undefined && object.chatId !== null) {
message.chatId = object.chatId
} else {
message.chatId = ''
}
if (object.messageId !== undefined && object.messageId !== null) {
message.messageId = object.messageId
} else {
message.messageId = ''
}
if (object.messageType !== undefined && object.messageType !== null) {
message.messageType = object.messageType
} else {
message.messageType = 0
}
if (object.type !== undefined && object.type !== null) {
message.type = object.type
} else {
message.type = 0
}
if (object.retracted !== undefined && object.retracted !== null) {
message.retracted = object.retracted
} else {
message.retracted = false
}
if (object.grant !== undefined && object.grant !== null) {
message.grant = object.grant
} else {
message.grant = new Uint8Array()
}
return message
},
}
declare var self: any | undefined
declare var window: any | undefined
declare var global: any | undefined
var globalThis: any = (() => {
if (typeof globalThis !== 'undefined') return globalThis
if (typeof self !== 'undefined') return self
if (typeof window !== 'undefined') return window
if (typeof global !== 'undefined') return global
throw 'Unable to locate global object'
})()
const atob: (b64: string) => string =
globalThis.atob ||
(b64 => globalThis.Buffer.from(b64, 'base64').toString('binary'))
function bytesFromBase64(b64: string): Uint8Array {
const bin = atob(b64)
const arr = new Uint8Array(bin.length)
for (let i = 0; i < bin.length; ++i) {
arr[i] = bin.charCodeAt(i)
}
return arr
}
const btoa: (bin: string) => string =
globalThis.btoa ||
(bin => globalThis.Buffer.from(bin, 'binary').toString('base64'))
function base64FromBytes(arr: Uint8Array): string {
const bin: string[] = []
for (const byte of arr) {
bin.push(String.fromCharCode(byte))
}
return btoa(bin.join(''))
}
type Builtin =
| Date
| Function
| Uint8Array
| string
| number
| boolean
| undefined
export type DeepPartial<T> = T extends Builtin
? T
: T extends Array<infer U>
? Array<DeepPartial<U>>
: T extends ReadonlyArray<infer U>
? ReadonlyArray<DeepPartial<U>>
: T extends {}
? { [K in keyof T]?: DeepPartial<T[K]> }
: Partial<T>
function longToNumber(long: Long): number {
if (long.gt(Number.MAX_SAFE_INTEGER)) {
throw new globalThis.Error('Value is larger than Number.MAX_SAFE_INTEGER')
}
return long.toNumber()
}
if (_m0.util.Long !== Long) {
_m0.util.Long = Long as any
_m0.configure()
}

View File

@ -1,125 +0,0 @@
/* eslint-disable */
import Long from 'long'
import _m0 from 'protobufjs/minimal'
export const protobufPackage = 'communities.v1'
export enum MessageType {
MESSAGE_TYPE_UNKNOWN_UNSPECIFIED = 0,
MESSAGE_TYPE_ONE_TO_ONE = 1,
MESSAGE_TYPE_MESSAGE_TYPE_PUBLIC_GROUP = 2,
MESSAGE_TYPE_PRIVATE_GROUP = 3,
/** MESSAGE_TYPE_SYSTEM_MESSAGE_PRIVATE_GROUP - Only local */
MESSAGE_TYPE_SYSTEM_MESSAGE_PRIVATE_GROUP = 4,
MESSAGE_TYPE_COMMUNITY_CHAT = 5,
/** MESSAGE_TYPE_SYSTEM_MESSAGE_GAP - Only local */
MESSAGE_TYPE_SYSTEM_MESSAGE_GAP = 6,
UNRECOGNIZED = -1,
}
export function messageTypeFromJSON(object: any): MessageType {
switch (object) {
case 0:
case 'MESSAGE_TYPE_UNKNOWN_UNSPECIFIED':
return MessageType.MESSAGE_TYPE_UNKNOWN_UNSPECIFIED
case 1:
case 'MESSAGE_TYPE_ONE_TO_ONE':
return MessageType.MESSAGE_TYPE_ONE_TO_ONE
case 2:
case 'MESSAGE_TYPE_MESSAGE_TYPE_PUBLIC_GROUP':
return MessageType.MESSAGE_TYPE_MESSAGE_TYPE_PUBLIC_GROUP
case 3:
case 'MESSAGE_TYPE_PRIVATE_GROUP':
return MessageType.MESSAGE_TYPE_PRIVATE_GROUP
case 4:
case 'MESSAGE_TYPE_SYSTEM_MESSAGE_PRIVATE_GROUP':
return MessageType.MESSAGE_TYPE_SYSTEM_MESSAGE_PRIVATE_GROUP
case 5:
case 'MESSAGE_TYPE_COMMUNITY_CHAT':
return MessageType.MESSAGE_TYPE_COMMUNITY_CHAT
case 6:
case 'MESSAGE_TYPE_SYSTEM_MESSAGE_GAP':
return MessageType.MESSAGE_TYPE_SYSTEM_MESSAGE_GAP
case -1:
case 'UNRECOGNIZED':
default:
return MessageType.UNRECOGNIZED
}
}
export function messageTypeToJSON(object: MessageType): string {
switch (object) {
case MessageType.MESSAGE_TYPE_UNKNOWN_UNSPECIFIED:
return 'MESSAGE_TYPE_UNKNOWN_UNSPECIFIED'
case MessageType.MESSAGE_TYPE_ONE_TO_ONE:
return 'MESSAGE_TYPE_ONE_TO_ONE'
case MessageType.MESSAGE_TYPE_MESSAGE_TYPE_PUBLIC_GROUP:
return 'MESSAGE_TYPE_MESSAGE_TYPE_PUBLIC_GROUP'
case MessageType.MESSAGE_TYPE_PRIVATE_GROUP:
return 'MESSAGE_TYPE_PRIVATE_GROUP'
case MessageType.MESSAGE_TYPE_SYSTEM_MESSAGE_PRIVATE_GROUP:
return 'MESSAGE_TYPE_SYSTEM_MESSAGE_PRIVATE_GROUP'
case MessageType.MESSAGE_TYPE_COMMUNITY_CHAT:
return 'MESSAGE_TYPE_COMMUNITY_CHAT'
case MessageType.MESSAGE_TYPE_SYSTEM_MESSAGE_GAP:
return 'MESSAGE_TYPE_SYSTEM_MESSAGE_GAP'
default:
return 'UNKNOWN'
}
}
export enum ImageType {
IMAGE_TYPE_UNKNOWN_UNSPECIFIED = 0,
/** IMAGE_TYPE_PNG - Raster image files is payload data that can be read as a raster image */
IMAGE_TYPE_PNG = 1,
IMAGE_TYPE_JPEG = 2,
IMAGE_TYPE_WEBP = 3,
IMAGE_TYPE_GIF = 4,
UNRECOGNIZED = -1,
}
export function imageTypeFromJSON(object: any): ImageType {
switch (object) {
case 0:
case 'IMAGE_TYPE_UNKNOWN_UNSPECIFIED':
return ImageType.IMAGE_TYPE_UNKNOWN_UNSPECIFIED
case 1:
case 'IMAGE_TYPE_PNG':
return ImageType.IMAGE_TYPE_PNG
case 2:
case 'IMAGE_TYPE_JPEG':
return ImageType.IMAGE_TYPE_JPEG
case 3:
case 'IMAGE_TYPE_WEBP':
return ImageType.IMAGE_TYPE_WEBP
case 4:
case 'IMAGE_TYPE_GIF':
return ImageType.IMAGE_TYPE_GIF
case -1:
case 'UNRECOGNIZED':
default:
return ImageType.UNRECOGNIZED
}
}
export function imageTypeToJSON(object: ImageType): string {
switch (object) {
case ImageType.IMAGE_TYPE_UNKNOWN_UNSPECIFIED:
return 'IMAGE_TYPE_UNKNOWN_UNSPECIFIED'
case ImageType.IMAGE_TYPE_PNG:
return 'IMAGE_TYPE_PNG'
case ImageType.IMAGE_TYPE_JPEG:
return 'IMAGE_TYPE_JPEG'
case ImageType.IMAGE_TYPE_WEBP:
return 'IMAGE_TYPE_WEBP'
case ImageType.IMAGE_TYPE_GIF:
return 'IMAGE_TYPE_GIF'
default:
return 'UNKNOWN'
}
}
if (_m0.util.Long !== Long) {
_m0.util.Long = Long as any
_m0.configure()
}

View File

@ -1,436 +0,0 @@
/* eslint-disable */
import Long from 'long'
import _m0 from 'protobufjs/minimal'
import { ChatMessage } from './chat_message'
import { EmojiReaction } from './emoji_reaction'
export const protobufPackage = 'communities.v1'
export interface MembershipUpdateEvent {
/** Lamport timestamp of the event */
clock: number
/** List of public keys of objects of the action */
members: string[]
/** Name of the chat for the CHAT_CREATED/NAME_CHANGED event types */
name: string
/** The type of the event */
type: MembershipUpdateEvent_EventType
}
export enum MembershipUpdateEvent_EventType {
UNKNOWN = 0,
CHAT_CREATED = 1,
NAME_CHANGED = 2,
MEMBERS_ADDED = 3,
MEMBER_JOINED = 4,
MEMBER_REMOVED = 5,
ADMINS_ADDED = 6,
ADMIN_REMOVED = 7,
UNRECOGNIZED = -1,
}
export function membershipUpdateEvent_EventTypeFromJSON(
object: any
): MembershipUpdateEvent_EventType {
switch (object) {
case 0:
case 'UNKNOWN':
return MembershipUpdateEvent_EventType.UNKNOWN
case 1:
case 'CHAT_CREATED':
return MembershipUpdateEvent_EventType.CHAT_CREATED
case 2:
case 'NAME_CHANGED':
return MembershipUpdateEvent_EventType.NAME_CHANGED
case 3:
case 'MEMBERS_ADDED':
return MembershipUpdateEvent_EventType.MEMBERS_ADDED
case 4:
case 'MEMBER_JOINED':
return MembershipUpdateEvent_EventType.MEMBER_JOINED
case 5:
case 'MEMBER_REMOVED':
return MembershipUpdateEvent_EventType.MEMBER_REMOVED
case 6:
case 'ADMINS_ADDED':
return MembershipUpdateEvent_EventType.ADMINS_ADDED
case 7:
case 'ADMIN_REMOVED':
return MembershipUpdateEvent_EventType.ADMIN_REMOVED
case -1:
case 'UNRECOGNIZED':
default:
return MembershipUpdateEvent_EventType.UNRECOGNIZED
}
}
export function membershipUpdateEvent_EventTypeToJSON(
object: MembershipUpdateEvent_EventType
): string {
switch (object) {
case MembershipUpdateEvent_EventType.UNKNOWN:
return 'UNKNOWN'
case MembershipUpdateEvent_EventType.CHAT_CREATED:
return 'CHAT_CREATED'
case MembershipUpdateEvent_EventType.NAME_CHANGED:
return 'NAME_CHANGED'
case MembershipUpdateEvent_EventType.MEMBERS_ADDED:
return 'MEMBERS_ADDED'
case MembershipUpdateEvent_EventType.MEMBER_JOINED:
return 'MEMBER_JOINED'
case MembershipUpdateEvent_EventType.MEMBER_REMOVED:
return 'MEMBER_REMOVED'
case MembershipUpdateEvent_EventType.ADMINS_ADDED:
return 'ADMINS_ADDED'
case MembershipUpdateEvent_EventType.ADMIN_REMOVED:
return 'ADMIN_REMOVED'
default:
return 'UNKNOWN'
}
}
/**
* 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.
*/
export interface MembershipUpdateMessage {
/** The chat id of the private group chat */
chatId: string
/**
* A list of events for this group chat, first x bytes are the signature, then is a
* protobuf encoded MembershipUpdateEvent
*/
events: Uint8Array[]
message: ChatMessage | undefined
emojiReaction: EmojiReaction | undefined
}
const baseMembershipUpdateEvent: object = {
clock: 0,
members: '',
name: '',
type: 0,
}
export const MembershipUpdateEvent = {
encode(
message: MembershipUpdateEvent,
writer: _m0.Writer = _m0.Writer.create()
): _m0.Writer {
if (message.clock !== 0) {
writer.uint32(8).uint64(message.clock)
}
for (const v of message.members) {
writer.uint32(18).string(v!)
}
if (message.name !== '') {
writer.uint32(26).string(message.name)
}
if (message.type !== 0) {
writer.uint32(32).int32(message.type)
}
return writer
},
decode(
input: _m0.Reader | Uint8Array,
length?: number
): MembershipUpdateEvent {
const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input)
let end = length === undefined ? reader.len : reader.pos + length
const message = { ...baseMembershipUpdateEvent } as MembershipUpdateEvent
message.members = []
while (reader.pos < end) {
const tag = reader.uint32()
switch (tag >>> 3) {
case 1:
message.clock = longToNumber(reader.uint64() as Long)
break
case 2:
message.members.push(reader.string())
break
case 3:
message.name = reader.string()
break
case 4:
message.type = reader.int32() as any
break
default:
reader.skipType(tag & 7)
break
}
}
return message
},
fromJSON(object: any): MembershipUpdateEvent {
const message = { ...baseMembershipUpdateEvent } as MembershipUpdateEvent
message.members = []
if (object.clock !== undefined && object.clock !== null) {
message.clock = Number(object.clock)
} else {
message.clock = 0
}
if (object.members !== undefined && object.members !== null) {
for (const e of object.members) {
message.members.push(String(e))
}
}
if (object.name !== undefined && object.name !== null) {
message.name = String(object.name)
} else {
message.name = ''
}
if (object.type !== undefined && object.type !== null) {
message.type = membershipUpdateEvent_EventTypeFromJSON(object.type)
} else {
message.type = 0
}
return message
},
toJSON(message: MembershipUpdateEvent): unknown {
const obj: any = {}
message.clock !== undefined && (obj.clock = message.clock)
if (message.members) {
obj.members = message.members.map(e => e)
} else {
obj.members = []
}
message.name !== undefined && (obj.name = message.name)
message.type !== undefined &&
(obj.type = membershipUpdateEvent_EventTypeToJSON(message.type))
return obj
},
fromPartial(
object: DeepPartial<MembershipUpdateEvent>
): MembershipUpdateEvent {
const message = { ...baseMembershipUpdateEvent } as MembershipUpdateEvent
message.members = []
if (object.clock !== undefined && object.clock !== null) {
message.clock = object.clock
} else {
message.clock = 0
}
if (object.members !== undefined && object.members !== null) {
for (const e of object.members) {
message.members.push(e)
}
}
if (object.name !== undefined && object.name !== null) {
message.name = object.name
} else {
message.name = ''
}
if (object.type !== undefined && object.type !== null) {
message.type = object.type
} else {
message.type = 0
}
return message
},
}
const baseMembershipUpdateMessage: object = { chatId: '' }
export const MembershipUpdateMessage = {
encode(
message: MembershipUpdateMessage,
writer: _m0.Writer = _m0.Writer.create()
): _m0.Writer {
if (message.chatId !== '') {
writer.uint32(10).string(message.chatId)
}
for (const v of message.events) {
writer.uint32(18).bytes(v!)
}
if (message.message !== undefined) {
ChatMessage.encode(message.message, writer.uint32(26).fork()).ldelim()
}
if (message.emojiReaction !== undefined) {
EmojiReaction.encode(
message.emojiReaction,
writer.uint32(34).fork()
).ldelim()
}
return writer
},
decode(
input: _m0.Reader | Uint8Array,
length?: number
): MembershipUpdateMessage {
const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input)
let end = length === undefined ? reader.len : reader.pos + length
const message = {
...baseMembershipUpdateMessage,
} as MembershipUpdateMessage
message.events = []
while (reader.pos < end) {
const tag = reader.uint32()
switch (tag >>> 3) {
case 1:
message.chatId = reader.string()
break
case 2:
message.events.push(reader.bytes())
break
case 3:
message.message = ChatMessage.decode(reader, reader.uint32())
break
case 4:
message.emojiReaction = EmojiReaction.decode(reader, reader.uint32())
break
default:
reader.skipType(tag & 7)
break
}
}
return message
},
fromJSON(object: any): MembershipUpdateMessage {
const message = {
...baseMembershipUpdateMessage,
} as MembershipUpdateMessage
message.events = []
if (object.chatId !== undefined && object.chatId !== null) {
message.chatId = String(object.chatId)
} else {
message.chatId = ''
}
if (object.events !== undefined && object.events !== null) {
for (const e of object.events) {
message.events.push(bytesFromBase64(e))
}
}
if (object.message !== undefined && object.message !== null) {
message.message = ChatMessage.fromJSON(object.message)
} else {
message.message = undefined
}
if (object.emojiReaction !== undefined && object.emojiReaction !== null) {
message.emojiReaction = EmojiReaction.fromJSON(object.emojiReaction)
} else {
message.emojiReaction = undefined
}
return message
},
toJSON(message: MembershipUpdateMessage): unknown {
const obj: any = {}
message.chatId !== undefined && (obj.chatId = message.chatId)
if (message.events) {
obj.events = message.events.map(e =>
base64FromBytes(e !== undefined ? e : new Uint8Array())
)
} else {
obj.events = []
}
message.message !== undefined &&
(obj.message = message.message
? ChatMessage.toJSON(message.message)
: undefined)
message.emojiReaction !== undefined &&
(obj.emojiReaction = message.emojiReaction
? EmojiReaction.toJSON(message.emojiReaction)
: undefined)
return obj
},
fromPartial(
object: DeepPartial<MembershipUpdateMessage>
): MembershipUpdateMessage {
const message = {
...baseMembershipUpdateMessage,
} as MembershipUpdateMessage
message.events = []
if (object.chatId !== undefined && object.chatId !== null) {
message.chatId = object.chatId
} else {
message.chatId = ''
}
if (object.events !== undefined && object.events !== null) {
for (const e of object.events) {
message.events.push(e)
}
}
if (object.message !== undefined && object.message !== null) {
message.message = ChatMessage.fromPartial(object.message)
} else {
message.message = undefined
}
if (object.emojiReaction !== undefined && object.emojiReaction !== null) {
message.emojiReaction = EmojiReaction.fromPartial(object.emojiReaction)
} else {
message.emojiReaction = undefined
}
return message
},
}
declare var self: any | undefined
declare var window: any | undefined
declare var global: any | undefined
var globalThis: any = (() => {
if (typeof globalThis !== 'undefined') return globalThis
if (typeof self !== 'undefined') return self
if (typeof window !== 'undefined') return window
if (typeof global !== 'undefined') return global
throw 'Unable to locate global object'
})()
const atob: (b64: string) => string =
globalThis.atob ||
(b64 => globalThis.Buffer.from(b64, 'base64').toString('binary'))
function bytesFromBase64(b64: string): Uint8Array {
const bin = atob(b64)
const arr = new Uint8Array(bin.length)
for (let i = 0; i < bin.length; ++i) {
arr[i] = bin.charCodeAt(i)
}
return arr
}
const btoa: (bin: string) => string =
globalThis.btoa ||
(bin => globalThis.Buffer.from(bin, 'binary').toString('base64'))
function base64FromBytes(arr: Uint8Array): string {
const bin: string[] = []
for (const byte of arr) {
bin.push(String.fromCharCode(byte))
}
return btoa(bin.join(''))
}
type Builtin =
| Date
| Function
| Uint8Array
| string
| number
| boolean
| undefined
export type DeepPartial<T> = T extends Builtin
? T
: T extends Array<infer U>
? Array<DeepPartial<U>>
: T extends ReadonlyArray<infer U>
? ReadonlyArray<DeepPartial<U>>
: T extends {}
? { [K in keyof T]?: DeepPartial<T[K]> }
: Partial<T>
function longToNumber(long: Long): number {
if (long.gt(Number.MAX_SAFE_INTEGER)) {
throw new globalThis.Error('Value is larger than Number.MAX_SAFE_INTEGER')
}
return long.toNumber()
}
if (_m0.util.Long !== Long) {
_m0.util.Long = Long as any
_m0.configure()
}

View File

@ -1,409 +0,0 @@
/* eslint-disable */
import Long from 'long'
import _m0 from 'protobufjs/minimal'
export const protobufPackage = 'status.v1'
export interface ApplicationMetadataMessage {
/** Signature of the payload field */
signature: Uint8Array
/** This is the encoded protobuf of the application level message, i.e ChatMessage */
payload: Uint8Array
/** The type of protobuf message sent */
type: ApplicationMetadataMessage_Type
}
export enum ApplicationMetadataMessage_Type {
TYPE_UNKNOWN_UNSPECIFIED = 0,
TYPE_CHAT_MESSAGE = 1,
TYPE_CONTACT_UPDATE = 2,
TYPE_MEMBERSHIP_UPDATE_MESSAGE = 3,
TYPE_PAIR_INSTALLATION = 4,
TYPE_SYNC_INSTALLATION = 5,
TYPE_REQUEST_ADDRESS_FOR_TRANSACTION = 6,
TYPE_ACCEPT_REQUEST_ADDRESS_FOR_TRANSACTION = 7,
TYPE_DECLINE_REQUEST_ADDRESS_FOR_TRANSACTION = 8,
TYPE_REQUEST_TRANSACTION = 9,
TYPE_SEND_TRANSACTION = 10,
TYPE_DECLINE_REQUEST_TRANSACTION = 11,
TYPE_SYNC_INSTALLATION_CONTACT = 12,
TYPE_SYNC_INSTALLATION_ACCOUNT = 13,
TYPE_SYNC_INSTALLATION_PUBLIC_CHAT = 14,
TYPE_CONTACT_CODE_ADVERTISEMENT = 15,
TYPE_PUSH_NOTIFICATION_REGISTRATION = 16,
TYPE_PUSH_NOTIFICATION_REGISTRATION_RESPONSE = 17,
TYPE_PUSH_NOTIFICATION_QUERY = 18,
TYPE_PUSH_NOTIFICATION_QUERY_RESPONSE = 19,
TYPE_PUSH_NOTIFICATION_REQUEST = 20,
TYPE_PUSH_NOTIFICATION_RESPONSE = 21,
TYPE_EMOJI_REACTION = 22,
TYPE_GROUP_CHAT_INVITATION = 23,
TYPE_CHAT_IDENTITY = 24,
TYPE_COMMUNITY_DESCRIPTION = 25,
TYPE_COMMUNITY_INVITATION = 26,
TYPE_COMMUNITY_REQUEST_TO_JOIN = 27,
TYPE_PIN_MESSAGE = 28,
TYPE_EDIT_MESSAGE = 29,
TYPE_STATUS_UPDATE = 30,
TYPE_DELETE_MESSAGE = 31,
TYPE_SYNC_INSTALLATION_COMMUNITY = 32,
TYPE_ANONYMOUS_METRIC_BATCH = 33,
UNRECOGNIZED = -1,
}
export function applicationMetadataMessage_TypeFromJSON(
object: any
): ApplicationMetadataMessage_Type {
switch (object) {
case 0:
case 'TYPE_UNKNOWN_UNSPECIFIED':
return ApplicationMetadataMessage_Type.TYPE_UNKNOWN_UNSPECIFIED
case 1:
case 'TYPE_CHAT_MESSAGE':
return ApplicationMetadataMessage_Type.TYPE_CHAT_MESSAGE
case 2:
case 'TYPE_CONTACT_UPDATE':
return ApplicationMetadataMessage_Type.TYPE_CONTACT_UPDATE
case 3:
case 'TYPE_MEMBERSHIP_UPDATE_MESSAGE':
return ApplicationMetadataMessage_Type.TYPE_MEMBERSHIP_UPDATE_MESSAGE
case 4:
case 'TYPE_PAIR_INSTALLATION':
return ApplicationMetadataMessage_Type.TYPE_PAIR_INSTALLATION
case 5:
case 'TYPE_SYNC_INSTALLATION':
return ApplicationMetadataMessage_Type.TYPE_SYNC_INSTALLATION
case 6:
case 'TYPE_REQUEST_ADDRESS_FOR_TRANSACTION':
return ApplicationMetadataMessage_Type.TYPE_REQUEST_ADDRESS_FOR_TRANSACTION
case 7:
case 'TYPE_ACCEPT_REQUEST_ADDRESS_FOR_TRANSACTION':
return ApplicationMetadataMessage_Type.TYPE_ACCEPT_REQUEST_ADDRESS_FOR_TRANSACTION
case 8:
case 'TYPE_DECLINE_REQUEST_ADDRESS_FOR_TRANSACTION':
return ApplicationMetadataMessage_Type.TYPE_DECLINE_REQUEST_ADDRESS_FOR_TRANSACTION
case 9:
case 'TYPE_REQUEST_TRANSACTION':
return ApplicationMetadataMessage_Type.TYPE_REQUEST_TRANSACTION
case 10:
case 'TYPE_SEND_TRANSACTION':
return ApplicationMetadataMessage_Type.TYPE_SEND_TRANSACTION
case 11:
case 'TYPE_DECLINE_REQUEST_TRANSACTION':
return ApplicationMetadataMessage_Type.TYPE_DECLINE_REQUEST_TRANSACTION
case 12:
case 'TYPE_SYNC_INSTALLATION_CONTACT':
return ApplicationMetadataMessage_Type.TYPE_SYNC_INSTALLATION_CONTACT
case 13:
case 'TYPE_SYNC_INSTALLATION_ACCOUNT':
return ApplicationMetadataMessage_Type.TYPE_SYNC_INSTALLATION_ACCOUNT
case 14:
case 'TYPE_SYNC_INSTALLATION_PUBLIC_CHAT':
return ApplicationMetadataMessage_Type.TYPE_SYNC_INSTALLATION_PUBLIC_CHAT
case 15:
case 'TYPE_CONTACT_CODE_ADVERTISEMENT':
return ApplicationMetadataMessage_Type.TYPE_CONTACT_CODE_ADVERTISEMENT
case 16:
case 'TYPE_PUSH_NOTIFICATION_REGISTRATION':
return ApplicationMetadataMessage_Type.TYPE_PUSH_NOTIFICATION_REGISTRATION
case 17:
case 'TYPE_PUSH_NOTIFICATION_REGISTRATION_RESPONSE':
return ApplicationMetadataMessage_Type.TYPE_PUSH_NOTIFICATION_REGISTRATION_RESPONSE
case 18:
case 'TYPE_PUSH_NOTIFICATION_QUERY':
return ApplicationMetadataMessage_Type.TYPE_PUSH_NOTIFICATION_QUERY
case 19:
case 'TYPE_PUSH_NOTIFICATION_QUERY_RESPONSE':
return ApplicationMetadataMessage_Type.TYPE_PUSH_NOTIFICATION_QUERY_RESPONSE
case 20:
case 'TYPE_PUSH_NOTIFICATION_REQUEST':
return ApplicationMetadataMessage_Type.TYPE_PUSH_NOTIFICATION_REQUEST
case 21:
case 'TYPE_PUSH_NOTIFICATION_RESPONSE':
return ApplicationMetadataMessage_Type.TYPE_PUSH_NOTIFICATION_RESPONSE
case 22:
case 'TYPE_EMOJI_REACTION':
return ApplicationMetadataMessage_Type.TYPE_EMOJI_REACTION
case 23:
case 'TYPE_GROUP_CHAT_INVITATION':
return ApplicationMetadataMessage_Type.TYPE_GROUP_CHAT_INVITATION
case 24:
case 'TYPE_CHAT_IDENTITY':
return ApplicationMetadataMessage_Type.TYPE_CHAT_IDENTITY
case 25:
case 'TYPE_COMMUNITY_DESCRIPTION':
return ApplicationMetadataMessage_Type.TYPE_COMMUNITY_DESCRIPTION
case 26:
case 'TYPE_COMMUNITY_INVITATION':
return ApplicationMetadataMessage_Type.TYPE_COMMUNITY_INVITATION
case 27:
case 'TYPE_COMMUNITY_REQUEST_TO_JOIN':
return ApplicationMetadataMessage_Type.TYPE_COMMUNITY_REQUEST_TO_JOIN
case 28:
case 'TYPE_PIN_MESSAGE':
return ApplicationMetadataMessage_Type.TYPE_PIN_MESSAGE
case 29:
case 'TYPE_EDIT_MESSAGE':
return ApplicationMetadataMessage_Type.TYPE_EDIT_MESSAGE
case 30:
case 'TYPE_STATUS_UPDATE':
return ApplicationMetadataMessage_Type.TYPE_STATUS_UPDATE
case 31:
case 'TYPE_DELETE_MESSAGE':
return ApplicationMetadataMessage_Type.TYPE_DELETE_MESSAGE
case 32:
case 'TYPE_SYNC_INSTALLATION_COMMUNITY':
return ApplicationMetadataMessage_Type.TYPE_SYNC_INSTALLATION_COMMUNITY
case 33:
case 'TYPE_ANONYMOUS_METRIC_BATCH':
return ApplicationMetadataMessage_Type.TYPE_ANONYMOUS_METRIC_BATCH
case -1:
case 'UNRECOGNIZED':
default:
return ApplicationMetadataMessage_Type.UNRECOGNIZED
}
}
export function applicationMetadataMessage_TypeToJSON(
object: ApplicationMetadataMessage_Type
): string {
switch (object) {
case ApplicationMetadataMessage_Type.TYPE_UNKNOWN_UNSPECIFIED:
return 'TYPE_UNKNOWN_UNSPECIFIED'
case ApplicationMetadataMessage_Type.TYPE_CHAT_MESSAGE:
return 'TYPE_CHAT_MESSAGE'
case ApplicationMetadataMessage_Type.TYPE_CONTACT_UPDATE:
return 'TYPE_CONTACT_UPDATE'
case ApplicationMetadataMessage_Type.TYPE_MEMBERSHIP_UPDATE_MESSAGE:
return 'TYPE_MEMBERSHIP_UPDATE_MESSAGE'
case ApplicationMetadataMessage_Type.TYPE_PAIR_INSTALLATION:
return 'TYPE_PAIR_INSTALLATION'
case ApplicationMetadataMessage_Type.TYPE_SYNC_INSTALLATION:
return 'TYPE_SYNC_INSTALLATION'
case ApplicationMetadataMessage_Type.TYPE_REQUEST_ADDRESS_FOR_TRANSACTION:
return 'TYPE_REQUEST_ADDRESS_FOR_TRANSACTION'
case ApplicationMetadataMessage_Type.TYPE_ACCEPT_REQUEST_ADDRESS_FOR_TRANSACTION:
return 'TYPE_ACCEPT_REQUEST_ADDRESS_FOR_TRANSACTION'
case ApplicationMetadataMessage_Type.TYPE_DECLINE_REQUEST_ADDRESS_FOR_TRANSACTION:
return 'TYPE_DECLINE_REQUEST_ADDRESS_FOR_TRANSACTION'
case ApplicationMetadataMessage_Type.TYPE_REQUEST_TRANSACTION:
return 'TYPE_REQUEST_TRANSACTION'
case ApplicationMetadataMessage_Type.TYPE_SEND_TRANSACTION:
return 'TYPE_SEND_TRANSACTION'
case ApplicationMetadataMessage_Type.TYPE_DECLINE_REQUEST_TRANSACTION:
return 'TYPE_DECLINE_REQUEST_TRANSACTION'
case ApplicationMetadataMessage_Type.TYPE_SYNC_INSTALLATION_CONTACT:
return 'TYPE_SYNC_INSTALLATION_CONTACT'
case ApplicationMetadataMessage_Type.TYPE_SYNC_INSTALLATION_ACCOUNT:
return 'TYPE_SYNC_INSTALLATION_ACCOUNT'
case ApplicationMetadataMessage_Type.TYPE_SYNC_INSTALLATION_PUBLIC_CHAT:
return 'TYPE_SYNC_INSTALLATION_PUBLIC_CHAT'
case ApplicationMetadataMessage_Type.TYPE_CONTACT_CODE_ADVERTISEMENT:
return 'TYPE_CONTACT_CODE_ADVERTISEMENT'
case ApplicationMetadataMessage_Type.TYPE_PUSH_NOTIFICATION_REGISTRATION:
return 'TYPE_PUSH_NOTIFICATION_REGISTRATION'
case ApplicationMetadataMessage_Type.TYPE_PUSH_NOTIFICATION_REGISTRATION_RESPONSE:
return 'TYPE_PUSH_NOTIFICATION_REGISTRATION_RESPONSE'
case ApplicationMetadataMessage_Type.TYPE_PUSH_NOTIFICATION_QUERY:
return 'TYPE_PUSH_NOTIFICATION_QUERY'
case ApplicationMetadataMessage_Type.TYPE_PUSH_NOTIFICATION_QUERY_RESPONSE:
return 'TYPE_PUSH_NOTIFICATION_QUERY_RESPONSE'
case ApplicationMetadataMessage_Type.TYPE_PUSH_NOTIFICATION_REQUEST:
return 'TYPE_PUSH_NOTIFICATION_REQUEST'
case ApplicationMetadataMessage_Type.TYPE_PUSH_NOTIFICATION_RESPONSE:
return 'TYPE_PUSH_NOTIFICATION_RESPONSE'
case ApplicationMetadataMessage_Type.TYPE_EMOJI_REACTION:
return 'TYPE_EMOJI_REACTION'
case ApplicationMetadataMessage_Type.TYPE_GROUP_CHAT_INVITATION:
return 'TYPE_GROUP_CHAT_INVITATION'
case ApplicationMetadataMessage_Type.TYPE_CHAT_IDENTITY:
return 'TYPE_CHAT_IDENTITY'
case ApplicationMetadataMessage_Type.TYPE_COMMUNITY_DESCRIPTION:
return 'TYPE_COMMUNITY_DESCRIPTION'
case ApplicationMetadataMessage_Type.TYPE_COMMUNITY_INVITATION:
return 'TYPE_COMMUNITY_INVITATION'
case ApplicationMetadataMessage_Type.TYPE_COMMUNITY_REQUEST_TO_JOIN:
return 'TYPE_COMMUNITY_REQUEST_TO_JOIN'
case ApplicationMetadataMessage_Type.TYPE_PIN_MESSAGE:
return 'TYPE_PIN_MESSAGE'
case ApplicationMetadataMessage_Type.TYPE_EDIT_MESSAGE:
return 'TYPE_EDIT_MESSAGE'
case ApplicationMetadataMessage_Type.TYPE_STATUS_UPDATE:
return 'TYPE_STATUS_UPDATE'
case ApplicationMetadataMessage_Type.TYPE_DELETE_MESSAGE:
return 'TYPE_DELETE_MESSAGE'
case ApplicationMetadataMessage_Type.TYPE_SYNC_INSTALLATION_COMMUNITY:
return 'TYPE_SYNC_INSTALLATION_COMMUNITY'
case ApplicationMetadataMessage_Type.TYPE_ANONYMOUS_METRIC_BATCH:
return 'TYPE_ANONYMOUS_METRIC_BATCH'
default:
return 'UNKNOWN'
}
}
const baseApplicationMetadataMessage: object = { type: 0 }
export const ApplicationMetadataMessage = {
encode(
message: ApplicationMetadataMessage,
writer: _m0.Writer = _m0.Writer.create()
): _m0.Writer {
if (message.signature.length !== 0) {
writer.uint32(10).bytes(message.signature)
}
if (message.payload.length !== 0) {
writer.uint32(18).bytes(message.payload)
}
if (message.type !== 0) {
writer.uint32(24).int32(message.type)
}
return writer
},
decode(
input: _m0.Reader | Uint8Array,
length?: number
): ApplicationMetadataMessage {
const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input)
let end = length === undefined ? reader.len : reader.pos + length
const message = {
...baseApplicationMetadataMessage,
} as ApplicationMetadataMessage
message.signature = new Uint8Array()
message.payload = new Uint8Array()
while (reader.pos < end) {
const tag = reader.uint32()
switch (tag >>> 3) {
case 1:
message.signature = reader.bytes()
break
case 2:
message.payload = reader.bytes()
break
case 3:
message.type = reader.int32() as any
break
default:
reader.skipType(tag & 7)
break
}
}
return message
},
fromJSON(object: any): ApplicationMetadataMessage {
const message = {
...baseApplicationMetadataMessage,
} as ApplicationMetadataMessage
message.signature = new Uint8Array()
message.payload = new Uint8Array()
if (object.signature !== undefined && object.signature !== null) {
message.signature = bytesFromBase64(object.signature)
}
if (object.payload !== undefined && object.payload !== null) {
message.payload = bytesFromBase64(object.payload)
}
if (object.type !== undefined && object.type !== null) {
message.type = applicationMetadataMessage_TypeFromJSON(object.type)
} else {
message.type = 0
}
return message
},
toJSON(message: ApplicationMetadataMessage): unknown {
const obj: any = {}
message.signature !== undefined &&
(obj.signature = base64FromBytes(
message.signature !== undefined ? message.signature : new Uint8Array()
))
message.payload !== undefined &&
(obj.payload = base64FromBytes(
message.payload !== undefined ? message.payload : new Uint8Array()
))
message.type !== undefined &&
(obj.type = applicationMetadataMessage_TypeToJSON(message.type))
return obj
},
fromPartial(
object: DeepPartial<ApplicationMetadataMessage>
): ApplicationMetadataMessage {
const message = {
...baseApplicationMetadataMessage,
} as ApplicationMetadataMessage
if (object.signature !== undefined && object.signature !== null) {
message.signature = object.signature
} else {
message.signature = new Uint8Array()
}
if (object.payload !== undefined && object.payload !== null) {
message.payload = object.payload
} else {
message.payload = new Uint8Array()
}
if (object.type !== undefined && object.type !== null) {
message.type = object.type
} else {
message.type = 0
}
return message
},
}
declare var self: any | undefined
declare var window: any | undefined
declare var global: any | undefined
var globalThis: any = (() => {
if (typeof globalThis !== 'undefined') return globalThis
if (typeof self !== 'undefined') return self
if (typeof window !== 'undefined') return window
if (typeof global !== 'undefined') return global
throw 'Unable to locate global object'
})()
const atob: (b64: string) => string =
globalThis.atob ||
(b64 => globalThis.Buffer.from(b64, 'base64').toString('binary'))
function bytesFromBase64(b64: string): Uint8Array {
const bin = atob(b64)
const arr = new Uint8Array(bin.length)
for (let i = 0; i < bin.length; ++i) {
arr[i] = bin.charCodeAt(i)
}
return arr
}
const btoa: (bin: string) => string =
globalThis.btoa ||
(bin => globalThis.Buffer.from(bin, 'binary').toString('base64'))
function base64FromBytes(arr: Uint8Array): string {
const bin: string[] = []
for (const byte of arr) {
bin.push(String.fromCharCode(byte))
}
return btoa(bin.join(''))
}
type Builtin =
| Date
| Function
| Uint8Array
| string
| number
| boolean
| undefined
export type DeepPartial<T> = T extends Builtin
? T
: T extends Array<infer U>
? Array<DeepPartial<U>>
: T extends ReadonlyArray<infer U>
? ReadonlyArray<DeepPartial<U>>
: T extends {}
? { [K in keyof T]?: DeepPartial<T[K]> }
: Partial<T>
if (_m0.util.Long !== Long) {
_m0.util.Long = Long as any
_m0.configure()
}

File diff suppressed because it is too large Load Diff

View File

@ -1,109 +0,0 @@
/* eslint-disable import/export */
/* eslint-disable @typescript-eslint/no-namespace */
import { enumeration, encodeMessage, decodeMessage, message, bytes } from 'protons-runtime'
import type { Codec } from 'protons-runtime'
export interface ApplicationMetadataMessage {
signature: Uint8Array
payload: Uint8Array
type: ApplicationMetadataMessage.Type
}
export namespace ApplicationMetadataMessage {
export enum Type {
TYPE_UNKNOWN_UNSPECIFIED = 'TYPE_UNKNOWN_UNSPECIFIED',
TYPE_CHAT_MESSAGE = 'TYPE_CHAT_MESSAGE',
TYPE_CONTACT_UPDATE = 'TYPE_CONTACT_UPDATE',
TYPE_MEMBERSHIP_UPDATE_MESSAGE = 'TYPE_MEMBERSHIP_UPDATE_MESSAGE',
TYPE_PAIR_INSTALLATION = 'TYPE_PAIR_INSTALLATION',
TYPE_SYNC_INSTALLATION = 'TYPE_SYNC_INSTALLATION',
TYPE_REQUEST_ADDRESS_FOR_TRANSACTION = 'TYPE_REQUEST_ADDRESS_FOR_TRANSACTION',
TYPE_ACCEPT_REQUEST_ADDRESS_FOR_TRANSACTION = 'TYPE_ACCEPT_REQUEST_ADDRESS_FOR_TRANSACTION',
TYPE_DECLINE_REQUEST_ADDRESS_FOR_TRANSACTION = 'TYPE_DECLINE_REQUEST_ADDRESS_FOR_TRANSACTION',
TYPE_REQUEST_TRANSACTION = 'TYPE_REQUEST_TRANSACTION',
TYPE_SEND_TRANSACTION = 'TYPE_SEND_TRANSACTION',
TYPE_DECLINE_REQUEST_TRANSACTION = 'TYPE_DECLINE_REQUEST_TRANSACTION',
TYPE_SYNC_INSTALLATION_CONTACT = 'TYPE_SYNC_INSTALLATION_CONTACT',
TYPE_SYNC_INSTALLATION_ACCOUNT = 'TYPE_SYNC_INSTALLATION_ACCOUNT',
TYPE_SYNC_INSTALLATION_PUBLIC_CHAT = 'TYPE_SYNC_INSTALLATION_PUBLIC_CHAT',
TYPE_CONTACT_CODE_ADVERTISEMENT = 'TYPE_CONTACT_CODE_ADVERTISEMENT',
TYPE_PUSH_NOTIFICATION_REGISTRATION = 'TYPE_PUSH_NOTIFICATION_REGISTRATION',
TYPE_PUSH_NOTIFICATION_REGISTRATION_RESPONSE = 'TYPE_PUSH_NOTIFICATION_REGISTRATION_RESPONSE',
TYPE_PUSH_NOTIFICATION_QUERY = 'TYPE_PUSH_NOTIFICATION_QUERY',
TYPE_PUSH_NOTIFICATION_QUERY_RESPONSE = 'TYPE_PUSH_NOTIFICATION_QUERY_RESPONSE',
TYPE_PUSH_NOTIFICATION_REQUEST = 'TYPE_PUSH_NOTIFICATION_REQUEST',
TYPE_PUSH_NOTIFICATION_RESPONSE = 'TYPE_PUSH_NOTIFICATION_RESPONSE',
TYPE_EMOJI_REACTION = 'TYPE_EMOJI_REACTION',
TYPE_GROUP_CHAT_INVITATION = 'TYPE_GROUP_CHAT_INVITATION',
TYPE_CHAT_IDENTITY = 'TYPE_CHAT_IDENTITY',
TYPE_COMMUNITY_DESCRIPTION = 'TYPE_COMMUNITY_DESCRIPTION',
TYPE_COMMUNITY_INVITATION = 'TYPE_COMMUNITY_INVITATION',
TYPE_COMMUNITY_REQUEST_TO_JOIN = 'TYPE_COMMUNITY_REQUEST_TO_JOIN',
TYPE_PIN_MESSAGE = 'TYPE_PIN_MESSAGE',
TYPE_EDIT_MESSAGE = 'TYPE_EDIT_MESSAGE',
TYPE_STATUS_UPDATE = 'TYPE_STATUS_UPDATE',
TYPE_DELETE_MESSAGE = 'TYPE_DELETE_MESSAGE',
TYPE_SYNC_INSTALLATION_COMMUNITY = 'TYPE_SYNC_INSTALLATION_COMMUNITY',
TYPE_ANONYMOUS_METRIC_BATCH = 'TYPE_ANONYMOUS_METRIC_BATCH'
}
enum __TypeValues {
TYPE_UNKNOWN_UNSPECIFIED = 0,
TYPE_CHAT_MESSAGE = 1,
TYPE_CONTACT_UPDATE = 2,
TYPE_MEMBERSHIP_UPDATE_MESSAGE = 3,
TYPE_PAIR_INSTALLATION = 4,
TYPE_SYNC_INSTALLATION = 5,
TYPE_REQUEST_ADDRESS_FOR_TRANSACTION = 6,
TYPE_ACCEPT_REQUEST_ADDRESS_FOR_TRANSACTION = 7,
TYPE_DECLINE_REQUEST_ADDRESS_FOR_TRANSACTION = 8,
TYPE_REQUEST_TRANSACTION = 9,
TYPE_SEND_TRANSACTION = 10,
TYPE_DECLINE_REQUEST_TRANSACTION = 11,
TYPE_SYNC_INSTALLATION_CONTACT = 12,
TYPE_SYNC_INSTALLATION_ACCOUNT = 13,
TYPE_SYNC_INSTALLATION_PUBLIC_CHAT = 14,
TYPE_CONTACT_CODE_ADVERTISEMENT = 15,
TYPE_PUSH_NOTIFICATION_REGISTRATION = 16,
TYPE_PUSH_NOTIFICATION_REGISTRATION_RESPONSE = 17,
TYPE_PUSH_NOTIFICATION_QUERY = 18,
TYPE_PUSH_NOTIFICATION_QUERY_RESPONSE = 19,
TYPE_PUSH_NOTIFICATION_REQUEST = 20,
TYPE_PUSH_NOTIFICATION_RESPONSE = 21,
TYPE_EMOJI_REACTION = 22,
TYPE_GROUP_CHAT_INVITATION = 23,
TYPE_CHAT_IDENTITY = 24,
TYPE_COMMUNITY_DESCRIPTION = 25,
TYPE_COMMUNITY_INVITATION = 26,
TYPE_COMMUNITY_REQUEST_TO_JOIN = 27,
TYPE_PIN_MESSAGE = 28,
TYPE_EDIT_MESSAGE = 29,
TYPE_STATUS_UPDATE = 30,
TYPE_DELETE_MESSAGE = 31,
TYPE_SYNC_INSTALLATION_COMMUNITY = 32,
TYPE_ANONYMOUS_METRIC_BATCH = 33
}
export namespace Type {
export const codec = () => {
return enumeration<typeof Type>(__TypeValues)
}
}
export const codec = (): Codec<ApplicationMetadataMessage> => {
return message<ApplicationMetadataMessage>({
1: { name: 'signature', codec: bytes },
2: { name: 'payload', codec: bytes },
3: { name: 'type', codec: ApplicationMetadataMessage.Type.codec() }
})
}
export const encode = (obj: ApplicationMetadataMessage): Uint8Array => {
return encodeMessage(obj, ApplicationMetadataMessage.codec())
}
export const decode = (buf: Uint8Array): ApplicationMetadataMessage => {
return decodeMessage(buf, ApplicationMetadataMessage.codec())
}
}

View File

@ -0,0 +1,275 @@
// @generated by protoc-gen-es v1.0.0 with parameter "target=ts"
// @generated from file application-metadata-message.proto (syntax proto3)
/* eslint-disable */
// @ts-nocheck
import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf";
import { Message, proto3 } from "@bufbuild/protobuf";
/**
* @generated from message ApplicationMetadataMessage
*/
export class ApplicationMetadataMessage extends Message<ApplicationMetadataMessage> {
/**
* Signature of the payload field
*
* @generated from field: bytes signature = 1;
*/
signature = new Uint8Array(0);
/**
* This is the encoded protobuf of the application level message, i.e ChatMessage
*
* @generated from field: bytes payload = 2;
*/
payload = new Uint8Array(0);
/**
* The type of protobuf message sent
*
* @generated from field: ApplicationMetadataMessage.Type type = 3;
*/
type = ApplicationMetadataMessage_Type.UNKNOWN_UNSPECIFIED;
constructor(data?: PartialMessage<ApplicationMetadataMessage>) {
super();
proto3.util.initPartial(data, this);
}
static readonly runtime = proto3;
static readonly typeName = "ApplicationMetadataMessage";
static readonly fields: FieldList = proto3.util.newFieldList(() => [
{ no: 1, name: "signature", kind: "scalar", T: 12 /* ScalarType.BYTES */ },
{ no: 2, name: "payload", kind: "scalar", T: 12 /* ScalarType.BYTES */ },
{ no: 3, name: "type", kind: "enum", T: proto3.getEnumType(ApplicationMetadataMessage_Type) },
]);
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): ApplicationMetadataMessage {
return new ApplicationMetadataMessage().fromBinary(bytes, options);
}
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): ApplicationMetadataMessage {
return new ApplicationMetadataMessage().fromJson(jsonValue, options);
}
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): ApplicationMetadataMessage {
return new ApplicationMetadataMessage().fromJsonString(jsonString, options);
}
static equals(a: ApplicationMetadataMessage | PlainMessage<ApplicationMetadataMessage> | undefined, b: ApplicationMetadataMessage | PlainMessage<ApplicationMetadataMessage> | undefined): boolean {
return proto3.util.equals(ApplicationMetadataMessage, a, b);
}
}
/**
* @generated from enum ApplicationMetadataMessage.Type
*/
export enum ApplicationMetadataMessage_Type {
/**
* @generated from enum value: TYPE_UNKNOWN_UNSPECIFIED = 0;
*/
UNKNOWN_UNSPECIFIED = 0,
/**
* @generated from enum value: TYPE_CHAT_MESSAGE = 1;
*/
CHAT_MESSAGE = 1,
/**
* @generated from enum value: TYPE_CONTACT_UPDATE = 2;
*/
CONTACT_UPDATE = 2,
/**
* @generated from enum value: TYPE_MEMBERSHIP_UPDATE_MESSAGE = 3;
*/
MEMBERSHIP_UPDATE_MESSAGE = 3,
/**
* @generated from enum value: TYPE_PAIR_INSTALLATION = 4;
*/
PAIR_INSTALLATION = 4,
/**
* @generated from enum value: TYPE_SYNC_INSTALLATION = 5;
*/
SYNC_INSTALLATION = 5,
/**
* @generated from enum value: TYPE_REQUEST_ADDRESS_FOR_TRANSACTION = 6;
*/
REQUEST_ADDRESS_FOR_TRANSACTION = 6,
/**
* @generated from enum value: TYPE_ACCEPT_REQUEST_ADDRESS_FOR_TRANSACTION = 7;
*/
ACCEPT_REQUEST_ADDRESS_FOR_TRANSACTION = 7,
/**
* @generated from enum value: TYPE_DECLINE_REQUEST_ADDRESS_FOR_TRANSACTION = 8;
*/
DECLINE_REQUEST_ADDRESS_FOR_TRANSACTION = 8,
/**
* @generated from enum value: TYPE_REQUEST_TRANSACTION = 9;
*/
REQUEST_TRANSACTION = 9,
/**
* @generated from enum value: TYPE_SEND_TRANSACTION = 10;
*/
SEND_TRANSACTION = 10,
/**
* @generated from enum value: TYPE_DECLINE_REQUEST_TRANSACTION = 11;
*/
DECLINE_REQUEST_TRANSACTION = 11,
/**
* @generated from enum value: TYPE_SYNC_INSTALLATION_CONTACT = 12;
*/
SYNC_INSTALLATION_CONTACT = 12,
/**
* @generated from enum value: TYPE_SYNC_INSTALLATION_ACCOUNT = 13;
*/
SYNC_INSTALLATION_ACCOUNT = 13,
/**
* @generated from enum value: TYPE_SYNC_INSTALLATION_PUBLIC_CHAT = 14;
*/
SYNC_INSTALLATION_PUBLIC_CHAT = 14,
/**
* @generated from enum value: TYPE_CONTACT_CODE_ADVERTISEMENT = 15;
*/
CONTACT_CODE_ADVERTISEMENT = 15,
/**
* @generated from enum value: TYPE_PUSH_NOTIFICATION_REGISTRATION = 16;
*/
PUSH_NOTIFICATION_REGISTRATION = 16,
/**
* @generated from enum value: TYPE_PUSH_NOTIFICATION_REGISTRATION_RESPONSE = 17;
*/
PUSH_NOTIFICATION_REGISTRATION_RESPONSE = 17,
/**
* @generated from enum value: TYPE_PUSH_NOTIFICATION_QUERY = 18;
*/
PUSH_NOTIFICATION_QUERY = 18,
/**
* @generated from enum value: TYPE_PUSH_NOTIFICATION_QUERY_RESPONSE = 19;
*/
PUSH_NOTIFICATION_QUERY_RESPONSE = 19,
/**
* @generated from enum value: TYPE_PUSH_NOTIFICATION_REQUEST = 20;
*/
PUSH_NOTIFICATION_REQUEST = 20,
/**
* @generated from enum value: TYPE_PUSH_NOTIFICATION_RESPONSE = 21;
*/
PUSH_NOTIFICATION_RESPONSE = 21,
/**
* @generated from enum value: TYPE_EMOJI_REACTION = 22;
*/
EMOJI_REACTION = 22,
/**
* @generated from enum value: TYPE_GROUP_CHAT_INVITATION = 23;
*/
GROUP_CHAT_INVITATION = 23,
/**
* @generated from enum value: TYPE_CHAT_IDENTITY = 24;
*/
CHAT_IDENTITY = 24,
/**
* @generated from enum value: TYPE_COMMUNITY_DESCRIPTION = 25;
*/
COMMUNITY_DESCRIPTION = 25,
/**
* @generated from enum value: TYPE_COMMUNITY_INVITATION = 26;
*/
COMMUNITY_INVITATION = 26,
/**
* @generated from enum value: TYPE_COMMUNITY_REQUEST_TO_JOIN = 27;
*/
COMMUNITY_REQUEST_TO_JOIN = 27,
/**
* @generated from enum value: TYPE_PIN_MESSAGE = 28;
*/
PIN_MESSAGE = 28,
/**
* @generated from enum value: TYPE_EDIT_MESSAGE = 29;
*/
EDIT_MESSAGE = 29,
/**
* @generated from enum value: TYPE_STATUS_UPDATE = 30;
*/
STATUS_UPDATE = 30,
/**
* @generated from enum value: TYPE_DELETE_MESSAGE = 31;
*/
DELETE_MESSAGE = 31,
/**
* @generated from enum value: TYPE_SYNC_INSTALLATION_COMMUNITY = 32;
*/
SYNC_INSTALLATION_COMMUNITY = 32,
/**
* @generated from enum value: TYPE_ANONYMOUS_METRIC_BATCH = 33;
*/
ANONYMOUS_METRIC_BATCH = 33,
}
// Retrieve enum metadata with: proto3.getEnumType(ApplicationMetadataMessage_Type)
proto3.util.setEnumType(ApplicationMetadataMessage_Type, "ApplicationMetadataMessage.Type", [
{ no: 0, name: "TYPE_UNKNOWN_UNSPECIFIED" },
{ no: 1, name: "TYPE_CHAT_MESSAGE" },
{ no: 2, name: "TYPE_CONTACT_UPDATE" },
{ no: 3, name: "TYPE_MEMBERSHIP_UPDATE_MESSAGE" },
{ no: 4, name: "TYPE_PAIR_INSTALLATION" },
{ no: 5, name: "TYPE_SYNC_INSTALLATION" },
{ no: 6, name: "TYPE_REQUEST_ADDRESS_FOR_TRANSACTION" },
{ no: 7, name: "TYPE_ACCEPT_REQUEST_ADDRESS_FOR_TRANSACTION" },
{ no: 8, name: "TYPE_DECLINE_REQUEST_ADDRESS_FOR_TRANSACTION" },
{ no: 9, name: "TYPE_REQUEST_TRANSACTION" },
{ no: 10, name: "TYPE_SEND_TRANSACTION" },
{ no: 11, name: "TYPE_DECLINE_REQUEST_TRANSACTION" },
{ no: 12, name: "TYPE_SYNC_INSTALLATION_CONTACT" },
{ no: 13, name: "TYPE_SYNC_INSTALLATION_ACCOUNT" },
{ no: 14, name: "TYPE_SYNC_INSTALLATION_PUBLIC_CHAT" },
{ no: 15, name: "TYPE_CONTACT_CODE_ADVERTISEMENT" },
{ no: 16, name: "TYPE_PUSH_NOTIFICATION_REGISTRATION" },
{ no: 17, name: "TYPE_PUSH_NOTIFICATION_REGISTRATION_RESPONSE" },
{ no: 18, name: "TYPE_PUSH_NOTIFICATION_QUERY" },
{ no: 19, name: "TYPE_PUSH_NOTIFICATION_QUERY_RESPONSE" },
{ no: 20, name: "TYPE_PUSH_NOTIFICATION_REQUEST" },
{ no: 21, name: "TYPE_PUSH_NOTIFICATION_RESPONSE" },
{ no: 22, name: "TYPE_EMOJI_REACTION" },
{ no: 23, name: "TYPE_GROUP_CHAT_INVITATION" },
{ no: 24, name: "TYPE_CHAT_IDENTITY" },
{ no: 25, name: "TYPE_COMMUNITY_DESCRIPTION" },
{ no: 26, name: "TYPE_COMMUNITY_INVITATION" },
{ no: 27, name: "TYPE_COMMUNITY_REQUEST_TO_JOIN" },
{ no: 28, name: "TYPE_PIN_MESSAGE" },
{ no: 29, name: "TYPE_EDIT_MESSAGE" },
{ no: 30, name: "TYPE_STATUS_UPDATE" },
{ no: 31, name: "TYPE_DELETE_MESSAGE" },
{ no: 32, name: "TYPE_SYNC_INSTALLATION_COMMUNITY" },
{ no: 33, name: "TYPE_ANONYMOUS_METRIC_BATCH" },
]);

View File

@ -1,9 +1,10 @@
version: v1beta1 version: v1
breaking:
build: use:
roots: - FILE
- ./proto
lint: lint:
use:
- DEFAULT
except: except:
- ENUM_ZERO_VALUE_SUFFIX - ENUM_ZERO_VALUE_SUFFIX
- ENUM_VALUE_PREFIX - ENUM_VALUE_PREFIX

View File

@ -16,12 +16,19 @@ message ChatIdentity {
// display name is the user set identity // display name is the user set identity
string display_name = 4; string display_name = 4;
// description is the user set description, valid only for organisations // description is the user set description
string description = 5; string description = 5;
string color = 6; string color = 6;
string emoji = 7; string emoji = 7;
repeated SocialLink social_links = 8;
// first known message timestamp in seconds (valid only for community chats for now)
// 0 - unknown
// 1 - no messages
uint32 first_message_timestamp = 9;
} }
// ProfileImage represents data associated with a user's profile image // ProfileImage represents data associated with a user's profile image
@ -57,3 +64,9 @@ message IdentityImage {
ENS_AVATAR = 2; ENS_AVATAR = 2;
} }
} }
// SocialLinks represents social link assosiated with given chat identity (personal/community)
message SocialLink {
string text = 1;
string url = 2;
}

View File

@ -1,130 +0,0 @@
/* eslint-disable import/export */
/* eslint-disable @typescript-eslint/no-namespace */
import { encodeMessage, decodeMessage, message, uint64, string, enumeration, bytes, bool } from 'protons-runtime'
import type { Codec } from 'protons-runtime'
export interface ChatIdentity {
clock: bigint
ensName: string
images: IdentityImage
displayName: string
description: string
color: string
emoji: string
}
export namespace ChatIdentity {
export const codec = (): Codec<ChatIdentity> => {
return message<ChatIdentity>({
1: { name: 'clock', codec: uint64 },
2: { name: 'ensName', codec: string },
3: { name: 'images', codec: IdentityImage.codec() },
4: { name: 'displayName', codec: string },
5: { name: 'description', codec: string },
6: { name: 'color', codec: string },
7: { name: 'emoji', codec: string }
})
}
export const encode = (obj: ChatIdentity): Uint8Array => {
return encodeMessage(obj, ChatIdentity.codec())
}
export const decode = (buf: Uint8Array): ChatIdentity => {
return decodeMessage(buf, ChatIdentity.codec())
}
}
export interface IdentityImage {
payload: Uint8Array
sourceType: IdentityImage.SourceType
imageType: ImageType
encryptionKeys: Uint8Array[]
encrypted: boolean
}
export namespace IdentityImage {
export enum SourceType {
UNKNOWN_SOURCE_TYPE = 'UNKNOWN_SOURCE_TYPE',
RAW_PAYLOAD = 'RAW_PAYLOAD',
ENS_AVATAR = 'ENS_AVATAR'
}
enum __SourceTypeValues {
UNKNOWN_SOURCE_TYPE = 0,
RAW_PAYLOAD = 1,
ENS_AVATAR = 2
}
export namespace SourceType {
export const codec = () => {
return enumeration<typeof SourceType>(__SourceTypeValues)
}
}
export const codec = (): Codec<IdentityImage> => {
return message<IdentityImage>({
1: { name: 'payload', codec: bytes },
2: { name: 'sourceType', codec: IdentityImage.SourceType.codec() },
3: { name: 'imageType', codec: ImageType.codec() },
4: { name: 'encryptionKeys', codec: bytes, repeats: true },
5: { name: 'encrypted', codec: bool }
})
}
export const encode = (obj: IdentityImage): Uint8Array => {
return encodeMessage(obj, IdentityImage.codec())
}
export const decode = (buf: Uint8Array): IdentityImage => {
return decodeMessage(buf, IdentityImage.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)
}
}

View File

@ -0,0 +1,264 @@
// @generated by protoc-gen-es v1.0.0 with parameter "target=ts"
// @generated from file chat-identity.proto (syntax proto3)
/* eslint-disable */
// @ts-nocheck
import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf";
import { Message, proto3, protoInt64 } from "@bufbuild/protobuf";
import { ImageType } from "./enums_pb.js";
/**
* ChatIdentity represents the user defined identity associated with their public chat key
*
* @generated from message ChatIdentity
*/
export class ChatIdentity extends Message<ChatIdentity> {
/**
* Lamport timestamp of the message
*
* @generated from field: uint64 clock = 1;
*/
clock = protoInt64.zero;
/**
* ens_name is the valid ENS name associated with the chat key
*
* @generated from field: string ens_name = 2;
*/
ensName = "";
/**
* images is a string indexed mapping of images associated with an identity
*
* @generated from field: map<string, IdentityImage> images = 3;
*/
images: { [key: string]: IdentityImage } = {};
/**
* display name is the user set identity
*
* @generated from field: string display_name = 4;
*/
displayName = "";
/**
* description is the user set description
*
* @generated from field: string description = 5;
*/
description = "";
/**
* @generated from field: string color = 6;
*/
color = "";
/**
* @generated from field: string emoji = 7;
*/
emoji = "";
/**
* @generated from field: repeated SocialLink social_links = 8;
*/
socialLinks: SocialLink[] = [];
/**
* first known message timestamp in seconds (valid only for community chats for now)
* 0 - unknown
* 1 - no messages
*
* @generated from field: uint32 first_message_timestamp = 9;
*/
firstMessageTimestamp = 0;
constructor(data?: PartialMessage<ChatIdentity>) {
super();
proto3.util.initPartial(data, this);
}
static readonly runtime = proto3;
static readonly typeName = "ChatIdentity";
static readonly fields: FieldList = proto3.util.newFieldList(() => [
{ no: 1, name: "clock", kind: "scalar", T: 4 /* ScalarType.UINT64 */ },
{ no: 2, name: "ens_name", kind: "scalar", T: 9 /* ScalarType.STRING */ },
{ no: 3, name: "images", kind: "map", K: 9 /* ScalarType.STRING */, V: {kind: "message", T: IdentityImage} },
{ no: 4, name: "display_name", kind: "scalar", T: 9 /* ScalarType.STRING */ },
{ no: 5, name: "description", kind: "scalar", T: 9 /* ScalarType.STRING */ },
{ no: 6, name: "color", kind: "scalar", T: 9 /* ScalarType.STRING */ },
{ no: 7, name: "emoji", kind: "scalar", T: 9 /* ScalarType.STRING */ },
{ no: 8, name: "social_links", kind: "message", T: SocialLink, repeated: true },
{ no: 9, name: "first_message_timestamp", kind: "scalar", T: 13 /* ScalarType.UINT32 */ },
]);
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): ChatIdentity {
return new ChatIdentity().fromBinary(bytes, options);
}
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): ChatIdentity {
return new ChatIdentity().fromJson(jsonValue, options);
}
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): ChatIdentity {
return new ChatIdentity().fromJsonString(jsonString, options);
}
static equals(a: ChatIdentity | PlainMessage<ChatIdentity> | undefined, b: ChatIdentity | PlainMessage<ChatIdentity> | undefined): boolean {
return proto3.util.equals(ChatIdentity, a, b);
}
}
/**
* ProfileImage represents data associated with a user's profile image
*
* @generated from message IdentityImage
*/
export class IdentityImage extends Message<IdentityImage> {
/**
* payload is a context based payload for the profile image data,
* context is determined by the `source_type`
*
* @generated from field: bytes payload = 1;
*/
payload = new Uint8Array(0);
/**
* source_type signals the image payload source
*
* @generated from field: IdentityImage.SourceType source_type = 2;
*/
sourceType = IdentityImage_SourceType.UNKNOWN_SOURCE_TYPE;
/**
* image_type signals the image type and method of parsing the payload
*
* @generated from field: ImageType image_type = 3;
*/
imageType = ImageType.UNKNOWN_IMAGE_TYPE;
/**
* encryption_keys is a list of encrypted keys that can be used to decrypted an encrypted payload
*
* @generated from field: repeated bytes encryption_keys = 4;
*/
encryptionKeys: Uint8Array[] = [];
/**
* encrypted signals the encryption state of the payload, default is false.
*
* @generated from field: bool encrypted = 5;
*/
encrypted = false;
constructor(data?: PartialMessage<IdentityImage>) {
super();
proto3.util.initPartial(data, this);
}
static readonly runtime = proto3;
static readonly typeName = "IdentityImage";
static readonly fields: FieldList = proto3.util.newFieldList(() => [
{ no: 1, name: "payload", kind: "scalar", T: 12 /* ScalarType.BYTES */ },
{ no: 2, name: "source_type", kind: "enum", T: proto3.getEnumType(IdentityImage_SourceType) },
{ no: 3, name: "image_type", kind: "enum", T: proto3.getEnumType(ImageType) },
{ no: 4, name: "encryption_keys", kind: "scalar", T: 12 /* ScalarType.BYTES */, repeated: true },
{ no: 5, name: "encrypted", kind: "scalar", T: 8 /* ScalarType.BOOL */ },
]);
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): IdentityImage {
return new IdentityImage().fromBinary(bytes, options);
}
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): IdentityImage {
return new IdentityImage().fromJson(jsonValue, options);
}
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): IdentityImage {
return new IdentityImage().fromJsonString(jsonString, options);
}
static equals(a: IdentityImage | PlainMessage<IdentityImage> | undefined, b: IdentityImage | PlainMessage<IdentityImage> | undefined): boolean {
return proto3.util.equals(IdentityImage, a, b);
}
}
/**
* SourceType are the predefined types of image source allowed
*
* @generated from enum IdentityImage.SourceType
*/
export enum IdentityImage_SourceType {
/**
* @generated from enum value: UNKNOWN_SOURCE_TYPE = 0;
*/
UNKNOWN_SOURCE_TYPE = 0,
/**
* RAW_PAYLOAD image byte data
*
* @generated from enum value: RAW_PAYLOAD = 1;
*/
RAW_PAYLOAD = 1,
/**
* ENS_AVATAR uses the ENS record's resolver get-text-data.avatar data
* The `payload` field will be ignored if ENS_AVATAR is selected
* The application will read and parse the ENS avatar data as image payload data, URLs will be ignored
* The parent `ChatMessageIdentity` must have a valid `ens_name` set
*
* @generated from enum value: ENS_AVATAR = 2;
*/
ENS_AVATAR = 2,
}
// Retrieve enum metadata with: proto3.getEnumType(IdentityImage_SourceType)
proto3.util.setEnumType(IdentityImage_SourceType, "IdentityImage.SourceType", [
{ no: 0, name: "UNKNOWN_SOURCE_TYPE" },
{ no: 1, name: "RAW_PAYLOAD" },
{ no: 2, name: "ENS_AVATAR" },
]);
/**
* SocialLinks represents social link assosiated with given chat identity (personal/community)
*
* @generated from message SocialLink
*/
export class SocialLink extends Message<SocialLink> {
/**
* @generated from field: string text = 1;
*/
text = "";
/**
* @generated from field: string url = 2;
*/
url = "";
constructor(data?: PartialMessage<SocialLink>) {
super();
proto3.util.initPartial(data, this);
}
static readonly runtime = proto3;
static readonly typeName = "SocialLink";
static readonly fields: FieldList = proto3.util.newFieldList(() => [
{ no: 1, name: "text", kind: "scalar", T: 9 /* ScalarType.STRING */ },
{ no: 2, name: "url", kind: "scalar", T: 9 /* ScalarType.STRING */ },
]);
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): SocialLink {
return new SocialLink().fromBinary(bytes, options);
}
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): SocialLink {
return new SocialLink().fromJson(jsonValue, options);
}
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): SocialLink {
return new SocialLink().fromJsonString(jsonString, options);
}
static equals(a: SocialLink | PlainMessage<SocialLink> | undefined, b: SocialLink | PlainMessage<SocialLink> | undefined): boolean {
return proto3.util.equals(SocialLink, a, b);
}
}

View File

@ -1,276 +0,0 @@
/* eslint-disable import/export */
/* eslint-disable @typescript-eslint/no-namespace */
import { encodeMessage, decodeMessage, message, string, int32, bytes, enumeration, uint64 } from 'protons-runtime'
import type { Codec } from 'protons-runtime'
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)
}
}

View File

@ -0,0 +1,534 @@
// @generated by protoc-gen-es v1.0.0 with parameter "target=ts"
// @generated from file chat-message.proto (syntax proto3)
/* eslint-disable */
// @ts-nocheck
import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf";
import { Message, proto3, protoInt64 } from "@bufbuild/protobuf";
import { ImageType, MessageType } from "./enums_pb.js";
/**
* @generated from message StickerMessage
*/
export class StickerMessage extends Message<StickerMessage> {
/**
* @generated from field: string hash = 1;
*/
hash = "";
/**
* @generated from field: int32 pack = 2;
*/
pack = 0;
constructor(data?: PartialMessage<StickerMessage>) {
super();
proto3.util.initPartial(data, this);
}
static readonly runtime = proto3;
static readonly typeName = "StickerMessage";
static readonly fields: FieldList = proto3.util.newFieldList(() => [
{ no: 1, name: "hash", kind: "scalar", T: 9 /* ScalarType.STRING */ },
{ no: 2, name: "pack", kind: "scalar", T: 5 /* ScalarType.INT32 */ },
]);
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): StickerMessage {
return new StickerMessage().fromBinary(bytes, options);
}
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): StickerMessage {
return new StickerMessage().fromJson(jsonValue, options);
}
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): StickerMessage {
return new StickerMessage().fromJsonString(jsonString, options);
}
static equals(a: StickerMessage | PlainMessage<StickerMessage> | undefined, b: StickerMessage | PlainMessage<StickerMessage> | undefined): boolean {
return proto3.util.equals(StickerMessage, a, b);
}
}
/**
* @generated from message ImageMessage
*/
export class ImageMessage extends Message<ImageMessage> {
/**
* @generated from field: bytes payload = 1;
*/
payload = new Uint8Array(0);
/**
* @generated from field: ImageType type = 2;
*/
type = ImageType.UNKNOWN_IMAGE_TYPE;
constructor(data?: PartialMessage<ImageMessage>) {
super();
proto3.util.initPartial(data, this);
}
static readonly runtime = proto3;
static readonly typeName = "ImageMessage";
static readonly fields: FieldList = proto3.util.newFieldList(() => [
{ no: 1, name: "payload", kind: "scalar", T: 12 /* ScalarType.BYTES */ },
{ no: 2, name: "type", kind: "enum", T: proto3.getEnumType(ImageType) },
]);
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): ImageMessage {
return new ImageMessage().fromBinary(bytes, options);
}
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): ImageMessage {
return new ImageMessage().fromJson(jsonValue, options);
}
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): ImageMessage {
return new ImageMessage().fromJsonString(jsonString, options);
}
static equals(a: ImageMessage | PlainMessage<ImageMessage> | undefined, b: ImageMessage | PlainMessage<ImageMessage> | undefined): boolean {
return proto3.util.equals(ImageMessage, a, b);
}
}
/**
* @generated from message AudioMessage
*/
export class AudioMessage extends Message<AudioMessage> {
/**
* @generated from field: bytes payload = 1;
*/
payload = new Uint8Array(0);
/**
* @generated from field: AudioMessage.AudioType type = 2;
*/
type = AudioMessage_AudioType.UNKNOWN_AUDIO_TYPE;
/**
* @generated from field: uint64 duration_ms = 3;
*/
durationMs = protoInt64.zero;
constructor(data?: PartialMessage<AudioMessage>) {
super();
proto3.util.initPartial(data, this);
}
static readonly runtime = proto3;
static readonly typeName = "AudioMessage";
static readonly fields: FieldList = proto3.util.newFieldList(() => [
{ no: 1, name: "payload", kind: "scalar", T: 12 /* ScalarType.BYTES */ },
{ no: 2, name: "type", kind: "enum", T: proto3.getEnumType(AudioMessage_AudioType) },
{ no: 3, name: "duration_ms", kind: "scalar", T: 4 /* ScalarType.UINT64 */ },
]);
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): AudioMessage {
return new AudioMessage().fromBinary(bytes, options);
}
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): AudioMessage {
return new AudioMessage().fromJson(jsonValue, options);
}
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): AudioMessage {
return new AudioMessage().fromJsonString(jsonString, options);
}
static equals(a: AudioMessage | PlainMessage<AudioMessage> | undefined, b: AudioMessage | PlainMessage<AudioMessage> | undefined): boolean {
return proto3.util.equals(AudioMessage, a, b);
}
}
/**
* @generated from enum AudioMessage.AudioType
*/
export enum AudioMessage_AudioType {
/**
* @generated from enum value: UNKNOWN_AUDIO_TYPE = 0;
*/
UNKNOWN_AUDIO_TYPE = 0,
/**
* @generated from enum value: AAC = 1;
*/
AAC = 1,
/**
* @generated from enum value: AMR = 2;
*/
AMR = 2,
}
// Retrieve enum metadata with: proto3.getEnumType(AudioMessage_AudioType)
proto3.util.setEnumType(AudioMessage_AudioType, "AudioMessage.AudioType", [
{ no: 0, name: "UNKNOWN_AUDIO_TYPE" },
{ no: 1, name: "AAC" },
{ no: 2, name: "AMR" },
]);
/**
* @generated from message EditMessage
*/
export class EditMessage extends Message<EditMessage> {
/**
* @generated from field: uint64 clock = 1;
*/
clock = protoInt64.zero;
/**
* Text of the message
*
* @generated from field: string text = 2;
*/
text = "";
/**
* @generated from field: string chat_id = 3;
*/
chatId = "";
/**
* @generated from field: string message_id = 4;
*/
messageId = "";
/**
* Grant for community edit messages
*
* @generated from field: bytes grant = 5;
*/
grant = new Uint8Array(0);
/**
* The type of message (public/one-to-one/private-group-chat)
*
* @generated from field: MessageType message_type = 6;
*/
messageType = MessageType.UNKNOWN_MESSAGE_TYPE;
constructor(data?: PartialMessage<EditMessage>) {
super();
proto3.util.initPartial(data, this);
}
static readonly runtime = proto3;
static readonly typeName = "EditMessage";
static readonly fields: FieldList = proto3.util.newFieldList(() => [
{ no: 1, name: "clock", kind: "scalar", T: 4 /* ScalarType.UINT64 */ },
{ no: 2, name: "text", kind: "scalar", T: 9 /* ScalarType.STRING */ },
{ no: 3, name: "chat_id", kind: "scalar", T: 9 /* ScalarType.STRING */ },
{ no: 4, name: "message_id", kind: "scalar", T: 9 /* ScalarType.STRING */ },
{ no: 5, name: "grant", kind: "scalar", T: 12 /* ScalarType.BYTES */ },
{ no: 6, name: "message_type", kind: "enum", T: proto3.getEnumType(MessageType) },
]);
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): EditMessage {
return new EditMessage().fromBinary(bytes, options);
}
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): EditMessage {
return new EditMessage().fromJson(jsonValue, options);
}
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): EditMessage {
return new EditMessage().fromJsonString(jsonString, options);
}
static equals(a: EditMessage | PlainMessage<EditMessage> | undefined, b: EditMessage | PlainMessage<EditMessage> | undefined): boolean {
return proto3.util.equals(EditMessage, a, b);
}
}
/**
* @generated from message DeleteMessage
*/
export class DeleteMessage extends Message<DeleteMessage> {
/**
* @generated from field: uint64 clock = 1;
*/
clock = protoInt64.zero;
/**
* @generated from field: string chat_id = 2;
*/
chatId = "";
/**
* @generated from field: string message_id = 3;
*/
messageId = "";
/**
* Grant for community delete messages
*
* @generated from field: bytes grant = 4;
*/
grant = new Uint8Array(0);
/**
* The type of message (public/one-to-one/private-group-chat)
*
* @generated from field: MessageType message_type = 5;
*/
messageType = MessageType.UNKNOWN_MESSAGE_TYPE;
constructor(data?: PartialMessage<DeleteMessage>) {
super();
proto3.util.initPartial(data, this);
}
static readonly runtime = proto3;
static readonly typeName = "DeleteMessage";
static readonly fields: FieldList = proto3.util.newFieldList(() => [
{ no: 1, name: "clock", kind: "scalar", T: 4 /* ScalarType.UINT64 */ },
{ no: 2, name: "chat_id", kind: "scalar", T: 9 /* ScalarType.STRING */ },
{ no: 3, name: "message_id", kind: "scalar", T: 9 /* ScalarType.STRING */ },
{ no: 4, name: "grant", kind: "scalar", T: 12 /* ScalarType.BYTES */ },
{ no: 5, name: "message_type", kind: "enum", T: proto3.getEnumType(MessageType) },
]);
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): DeleteMessage {
return new DeleteMessage().fromBinary(bytes, options);
}
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): DeleteMessage {
return new DeleteMessage().fromJson(jsonValue, options);
}
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): DeleteMessage {
return new DeleteMessage().fromJsonString(jsonString, options);
}
static equals(a: DeleteMessage | PlainMessage<DeleteMessage> | undefined, b: DeleteMessage | PlainMessage<DeleteMessage> | undefined): boolean {
return proto3.util.equals(DeleteMessage, a, b);
}
}
/**
* @generated from message ChatMessage
*/
export class ChatMessage extends Message<ChatMessage> {
/**
* Lamport timestamp of the chat message
*
* @generated from field: uint64 clock = 1;
*/
clock = protoInt64.zero;
/**
* Unix timestamps in milliseconds, currently not used as we use whisper as more reliable, but here
* so that we don't rely on it
*
* @generated from field: uint64 timestamp = 2;
*/
timestamp = protoInt64.zero;
/**
* Text of the message
*
* @generated from field: string text = 3;
*/
text = "";
/**
* Id of the message that we are replying to
*
* @generated from field: string response_to = 4;
*/
responseTo = "";
/**
* Ens name of the sender
*
* @generated from field: string ens_name = 5;
*/
ensName = "";
/**
* Chat id, this field is symmetric for public-chats and private group chats,
* but asymmetric in case of one-to-ones, as the sender will use the chat-id
* of the received, while the receiver will use the chat-id of the sender.
* Probably should be the concatenation of sender-pk & receiver-pk in alphabetical order
*
* @generated from field: string chat_id = 6;
*/
chatId = "";
/**
* The type of message (public/one-to-one/private-group-chat)
*
* @generated from field: MessageType message_type = 7;
*/
messageType = MessageType.UNKNOWN_MESSAGE_TYPE;
/**
* The type of the content of the message
*
* @generated from field: ChatMessage.ContentType content_type = 8;
*/
contentType = ChatMessage_ContentType.UNKNOWN_CONTENT_TYPE;
/**
* @generated from oneof ChatMessage.payload
*/
payload: {
/**
* @generated from field: StickerMessage sticker = 9;
*/
value: StickerMessage;
case: "sticker";
} | {
/**
* @generated from field: ImageMessage image = 10;
*/
value: ImageMessage;
case: "image";
} | {
/**
* @generated from field: AudioMessage audio = 11;
*/
value: AudioMessage;
case: "audio";
} | {
/**
* @generated from field: bytes community = 12;
*/
value: Uint8Array;
case: "community";
} | { case: undefined; value?: undefined } = { case: undefined };
/**
* Grant for community chat messages
*
* @generated from field: bytes grant = 13;
*/
grant = new Uint8Array(0);
/**
* Message author's display name, introduced in version 1
*
* @generated from field: string display_name = 14;
*/
displayName = "";
constructor(data?: PartialMessage<ChatMessage>) {
super();
proto3.util.initPartial(data, this);
}
static readonly runtime = proto3;
static readonly typeName = "ChatMessage";
static readonly fields: FieldList = proto3.util.newFieldList(() => [
{ no: 1, name: "clock", kind: "scalar", T: 4 /* ScalarType.UINT64 */ },
{ no: 2, name: "timestamp", kind: "scalar", T: 4 /* ScalarType.UINT64 */ },
{ no: 3, name: "text", kind: "scalar", T: 9 /* ScalarType.STRING */ },
{ no: 4, name: "response_to", kind: "scalar", T: 9 /* ScalarType.STRING */ },
{ no: 5, name: "ens_name", kind: "scalar", T: 9 /* ScalarType.STRING */ },
{ no: 6, name: "chat_id", kind: "scalar", T: 9 /* ScalarType.STRING */ },
{ no: 7, name: "message_type", kind: "enum", T: proto3.getEnumType(MessageType) },
{ no: 8, name: "content_type", kind: "enum", T: proto3.getEnumType(ChatMessage_ContentType) },
{ no: 9, name: "sticker", kind: "message", T: StickerMessage, oneof: "payload" },
{ no: 10, name: "image", kind: "message", T: ImageMessage, oneof: "payload" },
{ no: 11, name: "audio", kind: "message", T: AudioMessage, oneof: "payload" },
{ no: 12, name: "community", kind: "scalar", T: 12 /* ScalarType.BYTES */, oneof: "payload" },
{ no: 13, name: "grant", kind: "scalar", T: 12 /* ScalarType.BYTES */ },
{ no: 14, name: "display_name", kind: "scalar", T: 9 /* ScalarType.STRING */ },
]);
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): ChatMessage {
return new ChatMessage().fromBinary(bytes, options);
}
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): ChatMessage {
return new ChatMessage().fromJson(jsonValue, options);
}
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): ChatMessage {
return new ChatMessage().fromJsonString(jsonString, options);
}
static equals(a: ChatMessage | PlainMessage<ChatMessage> | undefined, b: ChatMessage | PlainMessage<ChatMessage> | undefined): boolean {
return proto3.util.equals(ChatMessage, a, b);
}
}
/**
* @generated from enum ChatMessage.ContentType
*/
export enum ChatMessage_ContentType {
/**
* @generated from enum value: UNKNOWN_CONTENT_TYPE = 0;
*/
UNKNOWN_CONTENT_TYPE = 0,
/**
* @generated from enum value: TEXT_PLAIN = 1;
*/
TEXT_PLAIN = 1,
/**
* @generated from enum value: STICKER = 2;
*/
STICKER = 2,
/**
* @generated from enum value: STATUS = 3;
*/
STATUS = 3,
/**
* @generated from enum value: EMOJI = 4;
*/
EMOJI = 4,
/**
* @generated from enum value: TRANSACTION_COMMAND = 5;
*/
TRANSACTION_COMMAND = 5,
/**
* Only local
*
* @generated from enum value: SYSTEM_MESSAGE_CONTENT_PRIVATE_GROUP = 6;
*/
SYSTEM_MESSAGE_CONTENT_PRIVATE_GROUP = 6,
/**
* @generated from enum value: IMAGE = 7;
*/
IMAGE = 7,
/**
* @generated from enum value: AUDIO = 8;
*/
AUDIO = 8,
/**
* @generated from enum value: COMMUNITY = 9;
*/
COMMUNITY = 9,
/**
* Only local
*
* @generated from enum value: SYSTEM_MESSAGE_GAP = 10;
*/
SYSTEM_MESSAGE_GAP = 10,
}
// Retrieve enum metadata with: proto3.getEnumType(ChatMessage_ContentType)
proto3.util.setEnumType(ChatMessage_ContentType, "ChatMessage.ContentType", [
{ no: 0, name: "UNKNOWN_CONTENT_TYPE" },
{ no: 1, name: "TEXT_PLAIN" },
{ no: 2, name: "STICKER" },
{ no: 3, name: "STATUS" },
{ no: 4, name: "EMOJI" },
{ no: 5, name: "TRANSACTION_COMMAND" },
{ no: 6, name: "SYSTEM_MESSAGE_CONTENT_PRIVATE_GROUP" },
{ no: 7, name: "IMAGE" },
{ no: 8, name: "AUDIO" },
{ no: 9, name: "COMMUNITY" },
{ no: 10, name: "SYSTEM_MESSAGE_GAP" },
]);

View File

@ -1,78 +0,0 @@
syntax = "proto3";
import "chat-identity.proto";
message Grant {
bytes community_id = 1;
bytes member_id = 2;
string chat_id = 3;
uint64 clock = 4;
}
message CommunityMember {
enum Roles {
UNKNOWN_ROLE = 0;
ROLE_ALL = 1;
ROLE_MANAGE_USERS = 2;
}
repeated Roles roles = 1;
}
message CommunityPermissions {
enum Access {
UNKNOWN_ACCESS = 0;
NO_MEMBERSHIP = 1;
INVITATION_ONLY = 2;
ON_REQUEST = 3;
}
bool ens_only = 1;
// https://gitlab.matrix.org/matrix-org/olm/blob/master/docs/megolm.md is a candidate for the algorithm to be used in case we want to have private communityal chats, lighter than pairwise encryption using the DR, less secure, but more efficient for large number of participants
bool private = 2;
Access access = 3;
}
message CommunityDescription {
uint64 clock = 1;
map<string,CommunityMember> members = 2;
CommunityPermissions permissions = 3;
ChatIdentity identity = 5;
map<string,CommunityChat> chats = 6;
repeated string ban_list = 7;
map<string,CommunityCategory> categories = 8;
}
message CommunityChat {
map<string,CommunityMember> members = 1;
CommunityPermissions permissions = 2;
ChatIdentity identity = 3;
string category_id = 4;
int32 position = 5;
}
message CommunityCategory {
string category_id = 1;
string name = 2;
int32 position = 3;
}
message CommunityInvitation {
bytes community_description = 1;
bytes grant = 2;
string chat_id = 3;
bytes public_key = 4;
}
message CommunityRequestToJoin {
uint64 clock = 1;
string ens_name = 2;
string chat_id = 3;
bytes community_id = 4;
}
message CommunityRequestToJoinResponse {
uint64 clock = 1;
CommunityDescription community = 2;
bool accepted = 3;
bytes grant = 4;
}

View File

@ -1,400 +0,0 @@
/* eslint-disable import/export */
/* eslint-disable @typescript-eslint/no-namespace */
import { encodeMessage, decodeMessage, message, bytes, string, uint64, enumeration, bool, int32 } from 'protons-runtime'
import type { Codec } from 'protons-runtime'
export interface Grant {
communityId: Uint8Array
memberId: Uint8Array
chatId: string
clock: bigint
}
export namespace Grant {
export const codec = (): Codec<Grant> => {
return message<Grant>({
1: { name: 'communityId', codec: bytes },
2: { name: 'memberId', codec: bytes },
3: { name: 'chatId', codec: string },
4: { name: 'clock', codec: uint64 }
})
}
export const encode = (obj: Grant): Uint8Array => {
return encodeMessage(obj, Grant.codec())
}
export const decode = (buf: Uint8Array): Grant => {
return decodeMessage(buf, Grant.codec())
}
}
export interface CommunityMember {
roles: CommunityMember.Roles[]
}
export namespace CommunityMember {
export enum Roles {
UNKNOWN_ROLE = 'UNKNOWN_ROLE',
ROLE_ALL = 'ROLE_ALL',
ROLE_MANAGE_USERS = 'ROLE_MANAGE_USERS'
}
enum __RolesValues {
UNKNOWN_ROLE = 0,
ROLE_ALL = 1,
ROLE_MANAGE_USERS = 2
}
export namespace Roles {
export const codec = () => {
return enumeration<typeof Roles>(__RolesValues)
}
}
export const codec = (): Codec<CommunityMember> => {
return message<CommunityMember>({
1: { name: 'roles', codec: CommunityMember.Roles.codec() }
})
}
export const encode = (obj: CommunityMember): Uint8Array => {
return encodeMessage(obj, CommunityMember.codec())
}
export const decode = (buf: Uint8Array): CommunityMember => {
return decodeMessage(buf, CommunityMember.codec())
}
}
export interface CommunityPermissions {
ensOnly: boolean
private: boolean
access: CommunityPermissions.Access
}
export namespace CommunityPermissions {
export enum Access {
UNKNOWN_ACCESS = 'UNKNOWN_ACCESS',
NO_MEMBERSHIP = 'NO_MEMBERSHIP',
INVITATION_ONLY = 'INVITATION_ONLY',
ON_REQUEST = 'ON_REQUEST'
}
enum __AccessValues {
UNKNOWN_ACCESS = 0,
NO_MEMBERSHIP = 1,
INVITATION_ONLY = 2,
ON_REQUEST = 3
}
export namespace Access {
export const codec = () => {
return enumeration<typeof Access>(__AccessValues)
}
}
export const codec = (): Codec<CommunityPermissions> => {
return message<CommunityPermissions>({
1: { name: 'ensOnly', codec: bool },
2: { name: 'private', codec: bool },
3: { name: 'access', codec: CommunityPermissions.Access.codec() }
})
}
export const encode = (obj: CommunityPermissions): Uint8Array => {
return encodeMessage(obj, CommunityPermissions.codec())
}
export const decode = (buf: Uint8Array): CommunityPermissions => {
return decodeMessage(buf, CommunityPermissions.codec())
}
}
export interface CommunityDescription {
clock: bigint
members: CommunityMember
permissions: CommunityPermissions
identity: ChatIdentity
chats: CommunityChat
banList: string[]
categories: CommunityCategory
}
export namespace CommunityDescription {
export const codec = (): Codec<CommunityDescription> => {
return message<CommunityDescription>({
1: { name: 'clock', codec: uint64 },
2: { name: 'members', codec: CommunityMember.codec() },
3: { name: 'permissions', codec: CommunityPermissions.codec() },
5: { name: 'identity', codec: ChatIdentity.codec() },
6: { name: 'chats', codec: CommunityChat.codec() },
7: { name: 'banList', codec: string, repeats: true },
8: { name: 'categories', codec: CommunityCategory.codec() }
})
}
export const encode = (obj: CommunityDescription): Uint8Array => {
return encodeMessage(obj, CommunityDescription.codec())
}
export const decode = (buf: Uint8Array): CommunityDescription => {
return decodeMessage(buf, CommunityDescription.codec())
}
}
export interface CommunityChat {
members: CommunityMember
permissions: CommunityPermissions
identity: ChatIdentity
categoryId: string
position: number
}
export namespace CommunityChat {
export const codec = (): Codec<CommunityChat> => {
return message<CommunityChat>({
1: { name: 'members', codec: CommunityMember.codec() },
2: { name: 'permissions', codec: CommunityPermissions.codec() },
3: { name: 'identity', codec: ChatIdentity.codec() },
4: { name: 'categoryId', codec: string },
5: { name: 'position', codec: int32 }
})
}
export const encode = (obj: CommunityChat): Uint8Array => {
return encodeMessage(obj, CommunityChat.codec())
}
export const decode = (buf: Uint8Array): CommunityChat => {
return decodeMessage(buf, CommunityChat.codec())
}
}
export interface CommunityCategory {
categoryId: string
name: string
position: number
}
export namespace CommunityCategory {
export const codec = (): Codec<CommunityCategory> => {
return message<CommunityCategory>({
1: { name: 'categoryId', codec: string },
2: { name: 'name', codec: string },
3: { name: 'position', codec: int32 }
})
}
export const encode = (obj: CommunityCategory): Uint8Array => {
return encodeMessage(obj, CommunityCategory.codec())
}
export const decode = (buf: Uint8Array): CommunityCategory => {
return decodeMessage(buf, CommunityCategory.codec())
}
}
export interface CommunityInvitation {
communityDescription: Uint8Array
grant: Uint8Array
chatId: string
publicKey: Uint8Array
}
export namespace CommunityInvitation {
export const codec = (): Codec<CommunityInvitation> => {
return message<CommunityInvitation>({
1: { name: 'communityDescription', codec: bytes },
2: { name: 'grant', codec: bytes },
3: { name: 'chatId', codec: string },
4: { name: 'publicKey', codec: bytes }
})
}
export const encode = (obj: CommunityInvitation): Uint8Array => {
return encodeMessage(obj, CommunityInvitation.codec())
}
export const decode = (buf: Uint8Array): CommunityInvitation => {
return decodeMessage(buf, CommunityInvitation.codec())
}
}
export interface CommunityRequestToJoin {
clock: bigint
ensName: string
chatId: string
communityId: Uint8Array
}
export namespace CommunityRequestToJoin {
export const codec = (): Codec<CommunityRequestToJoin> => {
return message<CommunityRequestToJoin>({
1: { name: 'clock', codec: uint64 },
2: { name: 'ensName', codec: string },
3: { name: 'chatId', codec: string },
4: { name: 'communityId', codec: bytes }
})
}
export const encode = (obj: CommunityRequestToJoin): Uint8Array => {
return encodeMessage(obj, CommunityRequestToJoin.codec())
}
export const decode = (buf: Uint8Array): CommunityRequestToJoin => {
return decodeMessage(buf, CommunityRequestToJoin.codec())
}
}
export interface CommunityRequestToJoinResponse {
clock: bigint
community: CommunityDescription
accepted: boolean
grant: Uint8Array
}
export namespace CommunityRequestToJoinResponse {
export const codec = (): Codec<CommunityRequestToJoinResponse> => {
return message<CommunityRequestToJoinResponse>({
1: { name: 'clock', codec: uint64 },
2: { name: 'community', codec: CommunityDescription.codec() },
3: { name: 'accepted', codec: bool },
4: { name: 'grant', codec: bytes }
})
}
export const encode = (obj: CommunityRequestToJoinResponse): Uint8Array => {
return encodeMessage(obj, CommunityRequestToJoinResponse.codec())
}
export const decode = (buf: Uint8Array): CommunityRequestToJoinResponse => {
return decodeMessage(buf, CommunityRequestToJoinResponse.codec())
}
}
export interface ChatIdentity {
clock: bigint
ensName: string
images: IdentityImage
displayName: string
description: string
color: string
emoji: string
}
export namespace ChatIdentity {
export const codec = (): Codec<ChatIdentity> => {
return message<ChatIdentity>({
1: { name: 'clock', codec: uint64 },
2: { name: 'ensName', codec: string },
3: { name: 'images', codec: IdentityImage.codec() },
4: { name: 'displayName', codec: string },
5: { name: 'description', codec: string },
6: { name: 'color', codec: string },
7: { name: 'emoji', codec: string }
})
}
export const encode = (obj: ChatIdentity): Uint8Array => {
return encodeMessage(obj, ChatIdentity.codec())
}
export const decode = (buf: Uint8Array): ChatIdentity => {
return decodeMessage(buf, ChatIdentity.codec())
}
}
export interface IdentityImage {
payload: Uint8Array
sourceType: IdentityImage.SourceType
imageType: ImageType
encryptionKeys: Uint8Array[]
encrypted: boolean
}
export namespace IdentityImage {
export enum SourceType {
UNKNOWN_SOURCE_TYPE = 'UNKNOWN_SOURCE_TYPE',
RAW_PAYLOAD = 'RAW_PAYLOAD',
ENS_AVATAR = 'ENS_AVATAR'
}
enum __SourceTypeValues {
UNKNOWN_SOURCE_TYPE = 0,
RAW_PAYLOAD = 1,
ENS_AVATAR = 2
}
export namespace SourceType {
export const codec = () => {
return enumeration<typeof SourceType>(__SourceTypeValues)
}
}
export const codec = (): Codec<IdentityImage> => {
return message<IdentityImage>({
1: { name: 'payload', codec: bytes },
2: { name: 'sourceType', codec: IdentityImage.SourceType.codec() },
3: { name: 'imageType', codec: ImageType.codec() },
4: { name: 'encryptionKeys', codec: bytes, repeats: true },
5: { name: 'encrypted', codec: bool }
})
}
export const encode = (obj: IdentityImage): Uint8Array => {
return encodeMessage(obj, IdentityImage.codec())
}
export const decode = (buf: Uint8Array): IdentityImage => {
return decodeMessage(buf, IdentityImage.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)
}
}

View File

@ -14,6 +14,7 @@ message CommunityMember {
UNKNOWN_ROLE = 0; UNKNOWN_ROLE = 0;
ROLE_ALL = 1; ROLE_ALL = 1;
ROLE_MANAGE_USERS = 2; ROLE_MANAGE_USERS = 2;
ROLE_MODERATE_CONTENT = 3;
} }
repeated Roles roles = 1; repeated Roles roles = 1;
} }
@ -42,6 +43,10 @@ message CommunityDescription {
map<string,CommunityCategory> categories = 8; map<string,CommunityCategory> categories = 8;
uint64 archive_magnetlink_clock = 9; uint64 archive_magnetlink_clock = 9;
CommunityAdminSettings admin_settings = 10; CommunityAdminSettings admin_settings = 10;
string intro_message = 11;
string outro_message = 12;
bool encrypted = 13;
repeated string tags = 14;
} }
message CommunityAdminSettings { message CommunityAdminSettings {
@ -74,6 +79,15 @@ message CommunityRequestToJoin {
string ens_name = 2; string ens_name = 2;
string chat_id = 3; string chat_id = 3;
bytes community_id = 4; bytes community_id = 4;
string display_name = 5;
}
message CommunityCancelRequestToJoin {
uint64 clock = 1;
string ens_name = 2;
string chat_id = 3;
bytes community_id = 4;
string display_name = 5;
} }
message CommunityRequestToJoinResponse { message CommunityRequestToJoinResponse {
@ -81,6 +95,13 @@ message CommunityRequestToJoinResponse {
CommunityDescription community = 2; CommunityDescription community = 2;
bool accepted = 3; bool accepted = 3;
bytes grant = 4; bytes grant = 4;
bytes community_id = 5;
string magnet_uri = 6;
}
message CommunityRequestToLeave {
uint64 clock = 1;
bytes community_id = 2;
} }
message CommunityMessageArchiveMagnetlink { message CommunityMessageArchiveMagnetlink {
@ -95,6 +116,7 @@ message WakuMessage {
bytes payload = 4; bytes payload = 4;
bytes padding = 5; bytes padding = 5;
bytes hash = 6; bytes hash = 6;
string thirdPartyId = 7;
} }
message WakuMessageArchiveMetadata { message WakuMessageArchiveMetadata {

View File

@ -1,574 +0,0 @@
/* eslint-disable import/export */
/* eslint-disable @typescript-eslint/no-namespace */
import { encodeMessage, decodeMessage, message, bytes, string, uint64, enumeration, bool, int32, uint32 } from 'protons-runtime'
import type { Codec } from 'protons-runtime'
export interface Grant {
communityId: Uint8Array
memberId: Uint8Array
chatId: string
clock: bigint
}
export namespace Grant {
export const codec = (): Codec<Grant> => {
return message<Grant>({
1: { name: 'communityId', codec: bytes },
2: { name: 'memberId', codec: bytes },
3: { name: 'chatId', codec: string },
4: { name: 'clock', codec: uint64 }
})
}
export const encode = (obj: Grant): Uint8Array => {
return encodeMessage(obj, Grant.codec())
}
export const decode = (buf: Uint8Array): Grant => {
return decodeMessage(buf, Grant.codec())
}
}
export interface CommunityMember {
roles: CommunityMember.Roles[]
}
export namespace CommunityMember {
export enum Roles {
UNKNOWN_ROLE = 'UNKNOWN_ROLE',
ROLE_ALL = 'ROLE_ALL',
ROLE_MANAGE_USERS = 'ROLE_MANAGE_USERS'
}
enum __RolesValues {
UNKNOWN_ROLE = 0,
ROLE_ALL = 1,
ROLE_MANAGE_USERS = 2
}
export namespace Roles {
export const codec = () => {
return enumeration<typeof Roles>(__RolesValues)
}
}
export const codec = (): Codec<CommunityMember> => {
return message<CommunityMember>({
1: { name: 'roles', codec: CommunityMember.Roles.codec(), repeats: true }
})
}
export const encode = (obj: CommunityMember): Uint8Array => {
return encodeMessage(obj, CommunityMember.codec())
}
export const decode = (buf: Uint8Array): CommunityMember => {
return decodeMessage(buf, CommunityMember.codec())
}
}
export interface CommunityPermissions {
ensOnly: boolean
private: boolean
access: CommunityPermissions.Access
}
export namespace CommunityPermissions {
export enum Access {
UNKNOWN_ACCESS = 'UNKNOWN_ACCESS',
NO_MEMBERSHIP = 'NO_MEMBERSHIP',
INVITATION_ONLY = 'INVITATION_ONLY',
ON_REQUEST = 'ON_REQUEST'
}
enum __AccessValues {
UNKNOWN_ACCESS = 0,
NO_MEMBERSHIP = 1,
INVITATION_ONLY = 2,
ON_REQUEST = 3
}
export namespace Access {
export const codec = () => {
return enumeration<typeof Access>(__AccessValues)
}
}
export const codec = (): Codec<CommunityPermissions> => {
return message<CommunityPermissions>({
1: { name: 'ensOnly', codec: bool },
2: { name: 'private', codec: bool },
3: { name: 'access', codec: CommunityPermissions.Access.codec() }
})
}
export const encode = (obj: CommunityPermissions): Uint8Array => {
return encodeMessage(obj, CommunityPermissions.codec())
}
export const decode = (buf: Uint8Array): CommunityPermissions => {
return decodeMessage(buf, CommunityPermissions.codec())
}
}
export interface CommunityDescription {
clock: bigint
members: Record<string, CommunityMember>
permissions: CommunityPermissions
identity: ChatIdentity
chats: Record<string, CommunityChat>
banList: string[]
categories: Record<string, CommunityCategory>
archiveMagnetlinkClock: bigint
adminSettings: CommunityAdminSettings
}
export namespace CommunityDescription {
export const codec = (): Codec<CommunityDescription> => {
return message<CommunityDescription>({
1: { name: 'clock', codec: uint64 },
2: { name: 'members', codec: CommunityMember.codec() },
3: { name: 'permissions', codec: CommunityPermissions.codec() },
5: { name: 'identity', codec: ChatIdentity.codec() },
6: { name: 'chats', codec: CommunityChat.codec() },
7: { name: 'banList', codec: string, repeats: true },
8: { name: 'categories', codec: CommunityCategory.codec() },
9: { name: 'archiveMagnetlinkClock', codec: uint64 },
10: { name: 'adminSettings', codec: CommunityAdminSettings.codec() }
})
}
export const encode = (obj: CommunityDescription): Uint8Array => {
return encodeMessage(obj, CommunityDescription.codec())
}
export const decode = (buf: Uint8Array): CommunityDescription => {
return decodeMessage(buf, CommunityDescription.codec())
}
}
export interface CommunityAdminSettings {
pinMessageAllMembersEnabled: boolean
}
export namespace CommunityAdminSettings {
export const codec = (): Codec<CommunityAdminSettings> => {
return message<CommunityAdminSettings>({
1: { name: 'pinMessageAllMembersEnabled', codec: bool }
})
}
export const encode = (obj: CommunityAdminSettings): Uint8Array => {
return encodeMessage(obj, CommunityAdminSettings.codec())
}
export const decode = (buf: Uint8Array): CommunityAdminSettings => {
return decodeMessage(buf, CommunityAdminSettings.codec())
}
}
export interface CommunityChat {
members: CommunityMember
permissions: CommunityPermissions
identity: ChatIdentity
categoryId: string
position: number
}
export namespace CommunityChat {
export const codec = (): Codec<CommunityChat> => {
return message<CommunityChat>({
1: { name: 'members', codec: CommunityMember.codec() },
2: { name: 'permissions', codec: CommunityPermissions.codec() },
3: { name: 'identity', codec: ChatIdentity.codec() },
4: { name: 'categoryId', codec: string },
5: { name: 'position', codec: int32 }
})
}
export const encode = (obj: CommunityChat): Uint8Array => {
return encodeMessage(obj, CommunityChat.codec())
}
export const decode = (buf: Uint8Array): CommunityChat => {
return decodeMessage(buf, CommunityChat.codec())
}
}
export interface CommunityCategory {
categoryId: string
name: string
position: number
}
export namespace CommunityCategory {
export const codec = (): Codec<CommunityCategory> => {
return message<CommunityCategory>({
1: { name: 'categoryId', codec: string },
2: { name: 'name', codec: string },
3: { name: 'position', codec: int32 }
})
}
export const encode = (obj: CommunityCategory): Uint8Array => {
return encodeMessage(obj, CommunityCategory.codec())
}
export const decode = (buf: Uint8Array): CommunityCategory => {
return decodeMessage(buf, CommunityCategory.codec())
}
}
export interface CommunityInvitation {
communityDescription: Uint8Array
grant: Uint8Array
chatId: string
publicKey: Uint8Array
}
export namespace CommunityInvitation {
export const codec = (): Codec<CommunityInvitation> => {
return message<CommunityInvitation>({
1: { name: 'communityDescription', codec: bytes },
2: { name: 'grant', codec: bytes },
3: { name: 'chatId', codec: string },
4: { name: 'publicKey', codec: bytes }
})
}
export const encode = (obj: CommunityInvitation): Uint8Array => {
return encodeMessage(obj, CommunityInvitation.codec())
}
export const decode = (buf: Uint8Array): CommunityInvitation => {
return decodeMessage(buf, CommunityInvitation.codec())
}
}
export interface CommunityRequestToJoin {
clock: bigint
ensName: string
chatId: string
communityId: Uint8Array
}
export namespace CommunityRequestToJoin {
export const codec = (): Codec<CommunityRequestToJoin> => {
return message<CommunityRequestToJoin>({
1: { name: 'clock', codec: uint64 },
2: { name: 'ensName', codec: string },
3: { name: 'chatId', codec: string },
4: { name: 'communityId', codec: bytes }
})
}
export const encode = (obj: CommunityRequestToJoin): Uint8Array => {
return encodeMessage(obj, CommunityRequestToJoin.codec())
}
export const decode = (buf: Uint8Array): CommunityRequestToJoin => {
return decodeMessage(buf, CommunityRequestToJoin.codec())
}
}
export interface CommunityRequestToJoinResponse {
clock: bigint
community: CommunityDescription
accepted: boolean
grant: Uint8Array
}
export namespace CommunityRequestToJoinResponse {
export const codec = (): Codec<CommunityRequestToJoinResponse> => {
return message<CommunityRequestToJoinResponse>({
1: { name: 'clock', codec: uint64 },
2: { name: 'community', codec: CommunityDescription.codec() },
3: { name: 'accepted', codec: bool },
4: { name: 'grant', codec: bytes }
})
}
export const encode = (obj: CommunityRequestToJoinResponse): Uint8Array => {
return encodeMessage(obj, CommunityRequestToJoinResponse.codec())
}
export const decode = (buf: Uint8Array): CommunityRequestToJoinResponse => {
return decodeMessage(buf, CommunityRequestToJoinResponse.codec())
}
}
export interface CommunityMessageArchiveMagnetlink {
clock: bigint
magnetUri: string
}
export namespace CommunityMessageArchiveMagnetlink {
export const codec = (): Codec<CommunityMessageArchiveMagnetlink> => {
return message<CommunityMessageArchiveMagnetlink>({
1: { name: 'clock', codec: uint64 },
2: { name: 'magnetUri', codec: string }
})
}
export const encode = (obj: CommunityMessageArchiveMagnetlink): Uint8Array => {
return encodeMessage(obj, CommunityMessageArchiveMagnetlink.codec())
}
export const decode = (buf: Uint8Array): CommunityMessageArchiveMagnetlink => {
return decodeMessage(buf, CommunityMessageArchiveMagnetlink.codec())
}
}
export interface WakuMessage {
sig: Uint8Array
timestamp: bigint
topic: Uint8Array
payload: Uint8Array
padding: Uint8Array
hash: Uint8Array
}
export namespace WakuMessage {
export const codec = (): Codec<WakuMessage> => {
return message<WakuMessage>({
1: { name: 'sig', codec: bytes },
2: { name: 'timestamp', codec: uint64 },
3: { name: 'topic', codec: bytes },
4: { name: 'payload', codec: bytes },
5: { name: 'padding', codec: bytes },
6: { name: 'hash', codec: bytes }
})
}
export const encode = (obj: WakuMessage): Uint8Array => {
return encodeMessage(obj, WakuMessage.codec())
}
export const decode = (buf: Uint8Array): WakuMessage => {
return decodeMessage(buf, WakuMessage.codec())
}
}
export interface WakuMessageArchiveMetadata {
version: number
from: bigint
to: bigint
contentTopic: Uint8Array[]
}
export namespace WakuMessageArchiveMetadata {
export const codec = (): Codec<WakuMessageArchiveMetadata> => {
return message<WakuMessageArchiveMetadata>({
1: { name: 'version', codec: uint32 },
2: { name: 'from', codec: uint64 },
3: { name: 'to', codec: uint64 },
4: { name: 'contentTopic', codec: bytes, repeats: true }
})
}
export const encode = (obj: WakuMessageArchiveMetadata): Uint8Array => {
return encodeMessage(obj, WakuMessageArchiveMetadata.codec())
}
export const decode = (buf: Uint8Array): WakuMessageArchiveMetadata => {
return decodeMessage(buf, WakuMessageArchiveMetadata.codec())
}
}
export interface WakuMessageArchive {
version: number
metadata: WakuMessageArchiveMetadata
messages: WakuMessage[]
}
export namespace WakuMessageArchive {
export const codec = (): Codec<WakuMessageArchive> => {
return message<WakuMessageArchive>({
1: { name: 'version', codec: uint32 },
2: { name: 'metadata', codec: WakuMessageArchiveMetadata.codec() },
3: { name: 'messages', codec: WakuMessage.codec(), repeats: true }
})
}
export const encode = (obj: WakuMessageArchive): Uint8Array => {
return encodeMessage(obj, WakuMessageArchive.codec())
}
export const decode = (buf: Uint8Array): WakuMessageArchive => {
return decodeMessage(buf, WakuMessageArchive.codec())
}
}
export interface WakuMessageArchiveIndexMetadata {
version: number
metadata: WakuMessageArchiveMetadata
offset: bigint
size: bigint
padding: bigint
}
export namespace WakuMessageArchiveIndexMetadata {
export const codec = (): Codec<WakuMessageArchiveIndexMetadata> => {
return message<WakuMessageArchiveIndexMetadata>({
1: { name: 'version', codec: uint32 },
2: { name: 'metadata', codec: WakuMessageArchiveMetadata.codec() },
3: { name: 'offset', codec: uint64 },
4: { name: 'size', codec: uint64 },
5: { name: 'padding', codec: uint64 }
})
}
export const encode = (obj: WakuMessageArchiveIndexMetadata): Uint8Array => {
return encodeMessage(obj, WakuMessageArchiveIndexMetadata.codec())
}
export const decode = (buf: Uint8Array): WakuMessageArchiveIndexMetadata => {
return decodeMessage(buf, WakuMessageArchiveIndexMetadata.codec())
}
}
export interface WakuMessageArchiveIndex {
archives: WakuMessageArchiveIndexMetadata
}
export namespace WakuMessageArchiveIndex {
export const codec = (): Codec<WakuMessageArchiveIndex> => {
return message<WakuMessageArchiveIndex>({
1: { name: 'archives', codec: WakuMessageArchiveIndexMetadata.codec() }
})
}
export const encode = (obj: WakuMessageArchiveIndex): Uint8Array => {
return encodeMessage(obj, WakuMessageArchiveIndex.codec())
}
export const decode = (buf: Uint8Array): WakuMessageArchiveIndex => {
return decodeMessage(buf, WakuMessageArchiveIndex.codec())
}
}
export interface ChatIdentity {
clock: bigint
ensName: string
images: IdentityImage
displayName: string
description: string
color: string
emoji: string
}
export namespace ChatIdentity {
export const codec = (): Codec<ChatIdentity> => {
return message<ChatIdentity>({
1: { name: 'clock', codec: uint64 },
2: { name: 'ensName', codec: string },
3: { name: 'images', codec: IdentityImage.codec() },
4: { name: 'displayName', codec: string },
5: { name: 'description', codec: string },
6: { name: 'color', codec: string },
7: { name: 'emoji', codec: string }
})
}
export const encode = (obj: ChatIdentity): Uint8Array => {
return encodeMessage(obj, ChatIdentity.codec())
}
export const decode = (buf: Uint8Array): ChatIdentity => {
return decodeMessage(buf, ChatIdentity.codec())
}
}
export interface IdentityImage {
payload: Uint8Array
sourceType: IdentityImage.SourceType
imageType: ImageType
encryptionKeys: Uint8Array[]
encrypted: boolean
}
export namespace IdentityImage {
export enum SourceType {
UNKNOWN_SOURCE_TYPE = 'UNKNOWN_SOURCE_TYPE',
RAW_PAYLOAD = 'RAW_PAYLOAD',
ENS_AVATAR = 'ENS_AVATAR'
}
enum __SourceTypeValues {
UNKNOWN_SOURCE_TYPE = 0,
RAW_PAYLOAD = 1,
ENS_AVATAR = 2
}
export namespace SourceType {
export const codec = () => {
return enumeration<typeof SourceType>(__SourceTypeValues)
}
}
export const codec = (): Codec<IdentityImage> => {
return message<IdentityImage>({
1: { name: 'payload', codec: bytes },
2: { name: 'sourceType', codec: IdentityImage.SourceType.codec() },
3: { name: 'imageType', codec: ImageType.codec() },
4: { name: 'encryptionKeys', codec: bytes, repeats: true },
5: { name: 'encrypted', codec: bool }
})
}
export const encode = (obj: IdentityImage): Uint8Array => {
return encodeMessage(obj, IdentityImage.codec())
}
export const decode = (buf: Uint8Array): IdentityImage => {
return decodeMessage(buf, IdentityImage.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)
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,110 +0,0 @@
/* eslint-disable import/export */
/* eslint-disable @typescript-eslint/no-namespace */
import { enumeration, encodeMessage, decodeMessage, message, uint64, string, bool, bytes } from 'protons-runtime'
import type { Codec } from 'protons-runtime'
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())
}
}
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)
}
}

View File

@ -0,0 +1,147 @@
// @generated by protoc-gen-es v1.0.0 with parameter "target=ts"
// @generated from file emoji-reaction.proto (syntax proto3)
/* eslint-disable */
// @ts-nocheck
import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf";
import { Message, proto3, protoInt64 } from "@bufbuild/protobuf";
import { MessageType } from "./enums_pb.js";
/**
* @generated from message EmojiReaction
*/
export class EmojiReaction extends Message<EmojiReaction> {
/**
* clock Lamport timestamp of the chat message
*
* @generated from field: uint64 clock = 1;
*/
clock = protoInt64.zero;
/**
* chat_id the ID of the chat the message belongs to, for query efficiency the chat_id is stored in the db even though the
* target message also stores the chat_id
*
* @generated from field: string chat_id = 2;
*/
chatId = "";
/**
* message_id the ID of the target message that the user wishes to react to
*
* @generated from field: string message_id = 3;
*/
messageId = "";
/**
* message_type is (somewhat confusingly) the ID of the type of chat the message belongs to
*
* @generated from field: MessageType message_type = 4;
*/
messageType = MessageType.UNKNOWN_MESSAGE_TYPE;
/**
* type the ID of the emoji the user wishes to react with
*
* @generated from field: EmojiReaction.Type type = 5;
*/
type = EmojiReaction_Type.UNKNOWN_EMOJI_REACTION_TYPE;
/**
* whether this is a rectraction of a previously sent emoji
*
* @generated from field: bool retracted = 6;
*/
retracted = false;
/**
* Grant for organisation chat messages
*
* @generated from field: bytes grant = 7;
*/
grant = new Uint8Array(0);
constructor(data?: PartialMessage<EmojiReaction>) {
super();
proto3.util.initPartial(data, this);
}
static readonly runtime = proto3;
static readonly typeName = "EmojiReaction";
static readonly fields: FieldList = proto3.util.newFieldList(() => [
{ no: 1, name: "clock", kind: "scalar", T: 4 /* ScalarType.UINT64 */ },
{ no: 2, name: "chat_id", kind: "scalar", T: 9 /* ScalarType.STRING */ },
{ no: 3, name: "message_id", kind: "scalar", T: 9 /* ScalarType.STRING */ },
{ no: 4, name: "message_type", kind: "enum", T: proto3.getEnumType(MessageType) },
{ no: 5, name: "type", kind: "enum", T: proto3.getEnumType(EmojiReaction_Type) },
{ no: 6, name: "retracted", kind: "scalar", T: 8 /* ScalarType.BOOL */ },
{ no: 7, name: "grant", kind: "scalar", T: 12 /* ScalarType.BYTES */ },
]);
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): EmojiReaction {
return new EmojiReaction().fromBinary(bytes, options);
}
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): EmojiReaction {
return new EmojiReaction().fromJson(jsonValue, options);
}
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): EmojiReaction {
return new EmojiReaction().fromJsonString(jsonString, options);
}
static equals(a: EmojiReaction | PlainMessage<EmojiReaction> | undefined, b: EmojiReaction | PlainMessage<EmojiReaction> | undefined): boolean {
return proto3.util.equals(EmojiReaction, a, b);
}
}
/**
* @generated from enum EmojiReaction.Type
*/
export enum EmojiReaction_Type {
/**
* @generated from enum value: UNKNOWN_EMOJI_REACTION_TYPE = 0;
*/
UNKNOWN_EMOJI_REACTION_TYPE = 0,
/**
* @generated from enum value: LOVE = 1;
*/
LOVE = 1,
/**
* @generated from enum value: THUMBS_UP = 2;
*/
THUMBS_UP = 2,
/**
* @generated from enum value: THUMBS_DOWN = 3;
*/
THUMBS_DOWN = 3,
/**
* @generated from enum value: LAUGH = 4;
*/
LAUGH = 4,
/**
* @generated from enum value: SAD = 5;
*/
SAD = 5,
/**
* @generated from enum value: ANGRY = 6;
*/
ANGRY = 6,
}
// Retrieve enum metadata with: proto3.getEnumType(EmojiReaction_Type)
proto3.util.setEnumType(EmojiReaction_Type, "EmojiReaction.Type", [
{ no: 0, name: "UNKNOWN_EMOJI_REACTION_TYPE" },
{ no: 1, name: "LOVE" },
{ no: 2, name: "THUMBS_UP" },
{ no: 3, name: "THUMBS_DOWN" },
{ no: 4, name: "LAUGH" },
{ no: 5, name: "SAD" },
{ no: 6, name: "ANGRY" },
]);

View File

@ -1,51 +0,0 @@
/* eslint-disable import/export */
/* eslint-disable @typescript-eslint/no-namespace */
import { enumeration } from 'protons-runtime'
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)
}
}

View File

@ -0,0 +1,101 @@
// @generated by protoc-gen-es v1.0.0 with parameter "target=ts"
// @generated from file enums.proto (syntax proto3)
/* eslint-disable */
// @ts-nocheck
import { proto3 } from "@bufbuild/protobuf";
/**
* @generated from enum MessageType
*/
export enum MessageType {
/**
* @generated from enum value: UNKNOWN_MESSAGE_TYPE = 0;
*/
UNKNOWN_MESSAGE_TYPE = 0,
/**
* @generated from enum value: ONE_TO_ONE = 1;
*/
ONE_TO_ONE = 1,
/**
* @generated from enum value: PUBLIC_GROUP = 2;
*/
PUBLIC_GROUP = 2,
/**
* @generated from enum value: PRIVATE_GROUP = 3;
*/
PRIVATE_GROUP = 3,
/**
* Only local
*
* @generated from enum value: SYSTEM_MESSAGE_PRIVATE_GROUP = 4;
*/
SYSTEM_MESSAGE_PRIVATE_GROUP = 4,
/**
* @generated from enum value: COMMUNITY_CHAT = 5;
*/
COMMUNITY_CHAT = 5,
/**
* Only local
*
* @generated from enum value: SYSTEM_MESSAGE_GAP = 6;
*/
SYSTEM_MESSAGE_GAP = 6,
}
// Retrieve enum metadata with: proto3.getEnumType(MessageType)
proto3.util.setEnumType(MessageType, "MessageType", [
{ no: 0, name: "UNKNOWN_MESSAGE_TYPE" },
{ no: 1, name: "ONE_TO_ONE" },
{ no: 2, name: "PUBLIC_GROUP" },
{ no: 3, name: "PRIVATE_GROUP" },
{ no: 4, name: "SYSTEM_MESSAGE_PRIVATE_GROUP" },
{ no: 5, name: "COMMUNITY_CHAT" },
{ no: 6, name: "SYSTEM_MESSAGE_GAP" },
]);
/**
* @generated from enum ImageType
*/
export enum ImageType {
/**
* @generated from enum value: UNKNOWN_IMAGE_TYPE = 0;
*/
UNKNOWN_IMAGE_TYPE = 0,
/**
* Raster image files is payload data that can be read as a raster image
*
* @generated from enum value: PNG = 1;
*/
PNG = 1,
/**
* @generated from enum value: JPEG = 2;
*/
JPEG = 2,
/**
* @generated from enum value: WEBP = 3;
*/
WEBP = 3,
/**
* @generated from enum value: GIF = 4;
*/
GIF = 4,
}
// Retrieve enum metadata with: proto3.getEnumType(ImageType)
proto3.util.setEnumType(ImageType, "ImageType", [
{ no: 0, name: "UNKNOWN_IMAGE_TYPE" },
{ no: 1, name: "PNG" },
{ no: 2, name: "JPEG" },
{ no: 3, name: "WEBP" },
{ no: 4, name: "GIF" },
]);

View File

@ -1,413 +0,0 @@
/* 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())
}
}

View File

@ -0,0 +1,202 @@
// @generated by protoc-gen-es v1.0.0 with parameter "target=ts"
// @generated from file membership-update-message.proto (syntax proto3)
/* eslint-disable */
// @ts-nocheck
import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf";
import { Message, proto3, protoInt64 } from "@bufbuild/protobuf";
import { ChatMessage } from "./chat-message_pb.js";
import { EmojiReaction } from "./emoji-reaction_pb.js";
/**
* @generated from message MembershipUpdateEvent
*/
export class MembershipUpdateEvent extends Message<MembershipUpdateEvent> {
/**
* Lamport timestamp of the event
*
* @generated from field: uint64 clock = 1;
*/
clock = protoInt64.zero;
/**
* List of public keys of objects of the action
*
* @generated from field: repeated string members = 2;
*/
members: string[] = [];
/**
* Name of the chat for the CHAT_CREATED/NAME_CHANGED event types
*
* @generated from field: string name = 3;
*/
name = "";
/**
* The type of the event
*
* @generated from field: MembershipUpdateEvent.EventType type = 4;
*/
type = MembershipUpdateEvent_EventType.UNKNOWN;
constructor(data?: PartialMessage<MembershipUpdateEvent>) {
super();
proto3.util.initPartial(data, this);
}
static readonly runtime = proto3;
static readonly typeName = "MembershipUpdateEvent";
static readonly fields: FieldList = proto3.util.newFieldList(() => [
{ no: 1, name: "clock", kind: "scalar", T: 4 /* ScalarType.UINT64 */ },
{ no: 2, name: "members", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true },
{ no: 3, name: "name", kind: "scalar", T: 9 /* ScalarType.STRING */ },
{ no: 4, name: "type", kind: "enum", T: proto3.getEnumType(MembershipUpdateEvent_EventType) },
]);
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): MembershipUpdateEvent {
return new MembershipUpdateEvent().fromBinary(bytes, options);
}
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): MembershipUpdateEvent {
return new MembershipUpdateEvent().fromJson(jsonValue, options);
}
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): MembershipUpdateEvent {
return new MembershipUpdateEvent().fromJsonString(jsonString, options);
}
static equals(a: MembershipUpdateEvent | PlainMessage<MembershipUpdateEvent> | undefined, b: MembershipUpdateEvent | PlainMessage<MembershipUpdateEvent> | undefined): boolean {
return proto3.util.equals(MembershipUpdateEvent, a, b);
}
}
/**
* @generated from enum MembershipUpdateEvent.EventType
*/
export enum MembershipUpdateEvent_EventType {
/**
* @generated from enum value: UNKNOWN = 0;
*/
UNKNOWN = 0,
/**
* @generated from enum value: CHAT_CREATED = 1;
*/
CHAT_CREATED = 1,
/**
* @generated from enum value: NAME_CHANGED = 2;
*/
NAME_CHANGED = 2,
/**
* @generated from enum value: MEMBERS_ADDED = 3;
*/
MEMBERS_ADDED = 3,
/**
* @generated from enum value: MEMBER_JOINED = 4;
*/
MEMBER_JOINED = 4,
/**
* @generated from enum value: MEMBER_REMOVED = 5;
*/
MEMBER_REMOVED = 5,
/**
* @generated from enum value: ADMINS_ADDED = 6;
*/
ADMINS_ADDED = 6,
/**
* @generated from enum value: ADMIN_REMOVED = 7;
*/
ADMIN_REMOVED = 7,
}
// Retrieve enum metadata with: proto3.getEnumType(MembershipUpdateEvent_EventType)
proto3.util.setEnumType(MembershipUpdateEvent_EventType, "MembershipUpdateEvent.EventType", [
{ no: 0, name: "UNKNOWN" },
{ no: 1, name: "CHAT_CREATED" },
{ no: 2, name: "NAME_CHANGED" },
{ no: 3, name: "MEMBERS_ADDED" },
{ no: 4, name: "MEMBER_JOINED" },
{ no: 5, name: "MEMBER_REMOVED" },
{ no: 6, name: "ADMINS_ADDED" },
{ no: 7, name: "ADMIN_REMOVED" },
]);
/**
* 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.
*
* @generated from message MembershipUpdateMessage
*/
export class MembershipUpdateMessage extends Message<MembershipUpdateMessage> {
/**
* The chat id of the private group chat
*
* @generated from field: string chat_id = 1;
*/
chatId = "";
/**
* A list of events for this group chat, first x bytes are the signature, then is a
* protobuf encoded MembershipUpdateEvent
*
* @generated from field: repeated bytes events = 2;
*/
events: Uint8Array[] = [];
/**
* An optional chat message
*
* @generated from oneof MembershipUpdateMessage.chat_entity
*/
chatEntity: {
/**
* @generated from field: ChatMessage message = 3;
*/
value: ChatMessage;
case: "message";
} | {
/**
* @generated from field: EmojiReaction emoji_reaction = 4;
*/
value: EmojiReaction;
case: "emojiReaction";
} | { case: undefined; value?: undefined } = { case: undefined };
constructor(data?: PartialMessage<MembershipUpdateMessage>) {
super();
proto3.util.initPartial(data, this);
}
static readonly runtime = proto3;
static readonly typeName = "MembershipUpdateMessage";
static readonly fields: FieldList = proto3.util.newFieldList(() => [
{ no: 1, name: "chat_id", kind: "scalar", T: 9 /* ScalarType.STRING */ },
{ no: 2, name: "events", kind: "scalar", T: 12 /* ScalarType.BYTES */, repeated: true },
{ no: 3, name: "message", kind: "message", T: ChatMessage, oneof: "chat_entity" },
{ no: 4, name: "emoji_reaction", kind: "message", T: EmojiReaction, oneof: "chat_entity" },
]);
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): MembershipUpdateMessage {
return new MembershipUpdateMessage().fromBinary(bytes, options);
}
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): MembershipUpdateMessage {
return new MembershipUpdateMessage().fromJson(jsonValue, options);
}
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): MembershipUpdateMessage {
return new MembershipUpdateMessage().fromJsonString(jsonString, options);
}
static equals(a: MembershipUpdateMessage | PlainMessage<MembershipUpdateMessage> | undefined, b: MembershipUpdateMessage | PlainMessage<MembershipUpdateMessage> | undefined): boolean {
return proto3.util.equals(MembershipUpdateMessage, a, b);
}
}

View File

@ -1,80 +0,0 @@
/* eslint-disable import/export */
/* eslint-disable @typescript-eslint/no-namespace */
import { encodeMessage, decodeMessage, message, uint64, string, bool, enumeration } from 'protons-runtime'
import type { Codec } from 'protons-runtime'
export interface PinMessage {
clock: bigint
messageId: string
chatId: string
pinned: boolean
messageType: MessageType
}
export namespace PinMessage {
export const codec = (): Codec<PinMessage> => {
return message<PinMessage>({
1: { name: 'clock', codec: uint64 },
2: { name: 'messageId', codec: string },
3: { name: 'chatId', codec: string },
4: { name: 'pinned', codec: bool },
5: { name: 'messageType', codec: MessageType.codec() }
})
}
export const encode = (obj: PinMessage): Uint8Array => {
return encodeMessage(obj, PinMessage.codec())
}
export const decode = (buf: Uint8Array): PinMessage => {
return decodeMessage(buf, PinMessage.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)
}
}

View File

@ -0,0 +1,72 @@
// @generated by protoc-gen-es v1.0.0 with parameter "target=ts"
// @generated from file pin-message.proto (syntax proto3)
/* eslint-disable */
// @ts-nocheck
import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf";
import { Message, proto3, protoInt64 } from "@bufbuild/protobuf";
import { MessageType } from "./enums_pb.js";
/**
* @generated from message PinMessage
*/
export class PinMessage extends Message<PinMessage> {
/**
* @generated from field: uint64 clock = 1;
*/
clock = protoInt64.zero;
/**
* @generated from field: string message_id = 2;
*/
messageId = "";
/**
* @generated from field: string chat_id = 3;
*/
chatId = "";
/**
* @generated from field: bool pinned = 4;
*/
pinned = false;
/**
* The type of message (public/one-to-one/private-group-chat)
*
* @generated from field: MessageType message_type = 5;
*/
messageType = MessageType.UNKNOWN_MESSAGE_TYPE;
constructor(data?: PartialMessage<PinMessage>) {
super();
proto3.util.initPartial(data, this);
}
static readonly runtime = proto3;
static readonly typeName = "PinMessage";
static readonly fields: FieldList = proto3.util.newFieldList(() => [
{ no: 1, name: "clock", kind: "scalar", T: 4 /* ScalarType.UINT64 */ },
{ no: 2, name: "message_id", kind: "scalar", T: 9 /* ScalarType.STRING */ },
{ no: 3, name: "chat_id", kind: "scalar", T: 9 /* ScalarType.STRING */ },
{ no: 4, name: "pinned", kind: "scalar", T: 8 /* ScalarType.BOOL */ },
{ no: 5, name: "message_type", kind: "enum", T: proto3.getEnumType(MessageType) },
]);
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): PinMessage {
return new PinMessage().fromBinary(bytes, options);
}
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): PinMessage {
return new PinMessage().fromJson(jsonValue, options);
}
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): PinMessage {
return new PinMessage().fromJsonString(jsonString, options);
}
static equals(a: PinMessage | PlainMessage<PinMessage> | undefined, b: PinMessage | PlainMessage<PinMessage> | undefined): boolean {
return proto3.util.equals(PinMessage, a, b);
}
}

View File

@ -1,223 +0,0 @@
/* eslint-disable import/export */
/* eslint-disable @typescript-eslint/no-namespace */
import { encodeMessage, decodeMessage, message, bytes, uint32, int64, string } from 'protons-runtime'
import type { Codec } from 'protons-runtime'
export interface SignedPreKey {
signedPreKey: Uint8Array
version: number
protocolVersion: number
}
export namespace SignedPreKey {
export const codec = (): Codec<SignedPreKey> => {
return message<SignedPreKey>({
1: { name: 'signedPreKey', codec: bytes },
2: { name: 'version', codec: uint32 },
3: { name: 'protocolVersion', codec: uint32 }
})
}
export const encode = (obj: SignedPreKey): Uint8Array => {
return encodeMessage(obj, SignedPreKey.codec())
}
export const decode = (buf: Uint8Array): SignedPreKey => {
return decodeMessage(buf, SignedPreKey.codec())
}
}
export interface Bundle {
identity: Uint8Array
signedPreKeys: SignedPreKey
signature: Uint8Array
timestamp: bigint
}
export namespace Bundle {
export const codec = (): Codec<Bundle> => {
return message<Bundle>({
1: { name: 'identity', codec: bytes },
2: { name: 'signedPreKeys', codec: SignedPreKey.codec() },
4: { name: 'signature', codec: bytes },
5: { name: 'timestamp', codec: int64 }
})
}
export const encode = (obj: Bundle): Uint8Array => {
return encodeMessage(obj, Bundle.codec())
}
export const decode = (buf: Uint8Array): Bundle => {
return decodeMessage(buf, Bundle.codec())
}
}
export interface BundleContainer {
bundle: Bundle
privateSignedPreKey: Uint8Array
}
export namespace BundleContainer {
export const codec = (): Codec<BundleContainer> => {
return message<BundleContainer>({
1: { name: 'bundle', codec: Bundle.codec() },
2: { name: 'privateSignedPreKey', codec: bytes }
})
}
export const encode = (obj: BundleContainer): Uint8Array => {
return encodeMessage(obj, BundleContainer.codec())
}
export const decode = (buf: Uint8Array): BundleContainer => {
return decodeMessage(buf, BundleContainer.codec())
}
}
export interface DRHeader {
key: Uint8Array
n: number
pn: number
id: Uint8Array
}
export namespace DRHeader {
export const codec = (): Codec<DRHeader> => {
return message<DRHeader>({
1: { name: 'key', codec: bytes },
2: { name: 'n', codec: uint32 },
3: { name: 'pn', codec: uint32 },
4: { name: 'id', codec: bytes }
})
}
export const encode = (obj: DRHeader): Uint8Array => {
return encodeMessage(obj, DRHeader.codec())
}
export const decode = (buf: Uint8Array): DRHeader => {
return decodeMessage(buf, DRHeader.codec())
}
}
export interface DHHeader {
key: Uint8Array
}
export namespace DHHeader {
export const codec = (): Codec<DHHeader> => {
return message<DHHeader>({
1: { name: 'key', codec: bytes }
})
}
export const encode = (obj: DHHeader): Uint8Array => {
return encodeMessage(obj, DHHeader.codec())
}
export const decode = (buf: Uint8Array): DHHeader => {
return decodeMessage(buf, DHHeader.codec())
}
}
export interface X3DHHeader {
key: Uint8Array
id: Uint8Array
}
export namespace X3DHHeader {
export const codec = (): Codec<X3DHHeader> => {
return message<X3DHHeader>({
1: { name: 'key', codec: bytes },
4: { name: 'id', codec: bytes }
})
}
export const encode = (obj: X3DHHeader): Uint8Array => {
return encodeMessage(obj, X3DHHeader.codec())
}
export const decode = (buf: Uint8Array): X3DHHeader => {
return decodeMessage(buf, X3DHHeader.codec())
}
}
export interface HRHeader {
keyId: number
seqNo: number
groupId: string
}
export namespace HRHeader {
export const codec = (): Codec<HRHeader> => {
return message<HRHeader>({
1: { name: 'keyId', codec: uint32 },
2: { name: 'seqNo', codec: uint32 },
3: { name: 'groupId', codec: string }
})
}
export const encode = (obj: HRHeader): Uint8Array => {
return encodeMessage(obj, HRHeader.codec())
}
export const decode = (buf: Uint8Array): HRHeader => {
return decodeMessage(buf, HRHeader.codec())
}
}
export interface EncryptedMessageProtocol {
X3DHHeader: X3DHHeader
DRHeader: DRHeader
DHHeader: DHHeader
HRHeader: HRHeader
payload: Uint8Array
}
export namespace EncryptedMessageProtocol {
export const codec = (): Codec<EncryptedMessageProtocol> => {
return message<EncryptedMessageProtocol>({
1: { name: 'X3DHHeader', codec: X3DHHeader.codec() },
2: { name: 'DRHeader', codec: DRHeader.codec() },
101: { name: 'DHHeader', codec: DHHeader.codec() },
102: { name: 'HRHeader', codec: HRHeader.codec() },
3: { name: 'payload', codec: bytes }
})
}
export const encode = (obj: EncryptedMessageProtocol): Uint8Array => {
return encodeMessage(obj, EncryptedMessageProtocol.codec())
}
export const decode = (buf: Uint8Array): EncryptedMessageProtocol => {
return decodeMessage(buf, EncryptedMessageProtocol.codec())
}
}
export interface ProtocolMessage {
installationId: string
bundles: Bundle[]
encryptedMessage: EncryptedMessageProtocol
publicMessage: Uint8Array
}
export namespace ProtocolMessage {
export const codec = (): Codec<ProtocolMessage> => {
return message<ProtocolMessage>({
2: { name: 'installationId', codec: string },
3: { name: 'bundles', codec: Bundle.codec(), repeats: true },
101: { name: 'encryptedMessage', codec: EncryptedMessageProtocol.codec() },
102: { name: 'publicMessage', codec: bytes }
})
}
export const encode = (obj: ProtocolMessage): Uint8Array => {
return encodeMessage(obj, ProtocolMessage.codec())
}
export const decode = (buf: Uint8Array): ProtocolMessage => {
return decodeMessage(buf, ProtocolMessage.codec())
}
}

View File

@ -0,0 +1,506 @@
// @generated by protoc-gen-es v1.0.0 with parameter "target=ts"
// @generated from file protocol-message.proto (syntax proto3)
/* eslint-disable */
// @ts-nocheck
import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf";
import { Message, proto3, protoInt64 } from "@bufbuild/protobuf";
/**
* @generated from message SignedPreKey
*/
export class SignedPreKey extends Message<SignedPreKey> {
/**
* @generated from field: bytes signed_pre_key = 1;
*/
signedPreKey = new Uint8Array(0);
/**
* @generated from field: uint32 version = 2;
*/
version = 0;
/**
* @generated from field: uint32 protocol_version = 3;
*/
protocolVersion = 0;
constructor(data?: PartialMessage<SignedPreKey>) {
super();
proto3.util.initPartial(data, this);
}
static readonly runtime = proto3;
static readonly typeName = "SignedPreKey";
static readonly fields: FieldList = proto3.util.newFieldList(() => [
{ no: 1, name: "signed_pre_key", kind: "scalar", T: 12 /* ScalarType.BYTES */ },
{ no: 2, name: "version", kind: "scalar", T: 13 /* ScalarType.UINT32 */ },
{ no: 3, name: "protocol_version", kind: "scalar", T: 13 /* ScalarType.UINT32 */ },
]);
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): SignedPreKey {
return new SignedPreKey().fromBinary(bytes, options);
}
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): SignedPreKey {
return new SignedPreKey().fromJson(jsonValue, options);
}
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): SignedPreKey {
return new SignedPreKey().fromJsonString(jsonString, options);
}
static equals(a: SignedPreKey | PlainMessage<SignedPreKey> | undefined, b: SignedPreKey | PlainMessage<SignedPreKey> | undefined): boolean {
return proto3.util.equals(SignedPreKey, a, b);
}
}
/**
* X3DH prekey bundle
*
* @generated from message Bundle
*/
export class Bundle extends Message<Bundle> {
/**
* Identity key
*
* @generated from field: bytes identity = 1;
*/
identity = new Uint8Array(0);
/**
* Installation id
*
* @generated from field: map<string, SignedPreKey> signed_pre_keys = 2;
*/
signedPreKeys: { [key: string]: SignedPreKey } = {};
/**
* Prekey signature
*
* @generated from field: bytes signature = 4;
*/
signature = new Uint8Array(0);
/**
* When the bundle was created locally
*
* @generated from field: int64 timestamp = 5;
*/
timestamp = protoInt64.zero;
constructor(data?: PartialMessage<Bundle>) {
super();
proto3.util.initPartial(data, this);
}
static readonly runtime = proto3;
static readonly typeName = "Bundle";
static readonly fields: FieldList = proto3.util.newFieldList(() => [
{ no: 1, name: "identity", kind: "scalar", T: 12 /* ScalarType.BYTES */ },
{ no: 2, name: "signed_pre_keys", kind: "map", K: 9 /* ScalarType.STRING */, V: {kind: "message", T: SignedPreKey} },
{ no: 4, name: "signature", kind: "scalar", T: 12 /* ScalarType.BYTES */ },
{ no: 5, name: "timestamp", kind: "scalar", T: 3 /* ScalarType.INT64 */ },
]);
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): Bundle {
return new Bundle().fromBinary(bytes, options);
}
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): Bundle {
return new Bundle().fromJson(jsonValue, options);
}
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): Bundle {
return new Bundle().fromJsonString(jsonString, options);
}
static equals(a: Bundle | PlainMessage<Bundle> | undefined, b: Bundle | PlainMessage<Bundle> | undefined): boolean {
return proto3.util.equals(Bundle, a, b);
}
}
/**
* @generated from message BundleContainer
*/
export class BundleContainer extends Message<BundleContainer> {
/**
* X3DH prekey bundle
*
* @generated from field: Bundle bundle = 1;
*/
bundle?: Bundle;
/**
* Private signed prekey
*
* @generated from field: bytes private_signed_pre_key = 2;
*/
privateSignedPreKey = new Uint8Array(0);
constructor(data?: PartialMessage<BundleContainer>) {
super();
proto3.util.initPartial(data, this);
}
static readonly runtime = proto3;
static readonly typeName = "BundleContainer";
static readonly fields: FieldList = proto3.util.newFieldList(() => [
{ no: 1, name: "bundle", kind: "message", T: Bundle },
{ no: 2, name: "private_signed_pre_key", kind: "scalar", T: 12 /* ScalarType.BYTES */ },
]);
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): BundleContainer {
return new BundleContainer().fromBinary(bytes, options);
}
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): BundleContainer {
return new BundleContainer().fromJson(jsonValue, options);
}
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): BundleContainer {
return new BundleContainer().fromJsonString(jsonString, options);
}
static equals(a: BundleContainer | PlainMessage<BundleContainer> | undefined, b: BundleContainer | PlainMessage<BundleContainer> | undefined): boolean {
return proto3.util.equals(BundleContainer, a, b);
}
}
/**
* @generated from message DRHeader
*/
export class DRHeader extends Message<DRHeader> {
/**
* Current ratchet public key
*
* @generated from field: bytes key = 1;
*/
key = new Uint8Array(0);
/**
* Number of the message in the sending chain
*
* @generated from field: uint32 n = 2;
*/
n = 0;
/**
* Length of the previous sending chain
*
* @generated from field: uint32 pn = 3;
*/
pn = 0;
/**
* Bundle ID
*
* @generated from field: bytes id = 4;
*/
id = new Uint8Array(0);
constructor(data?: PartialMessage<DRHeader>) {
super();
proto3.util.initPartial(data, this);
}
static readonly runtime = proto3;
static readonly typeName = "DRHeader";
static readonly fields: FieldList = proto3.util.newFieldList(() => [
{ no: 1, name: "key", kind: "scalar", T: 12 /* ScalarType.BYTES */ },
{ no: 2, name: "n", kind: "scalar", T: 13 /* ScalarType.UINT32 */ },
{ no: 3, name: "pn", kind: "scalar", T: 13 /* ScalarType.UINT32 */ },
{ no: 4, name: "id", kind: "scalar", T: 12 /* ScalarType.BYTES */ },
]);
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): DRHeader {
return new DRHeader().fromBinary(bytes, options);
}
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): DRHeader {
return new DRHeader().fromJson(jsonValue, options);
}
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): DRHeader {
return new DRHeader().fromJsonString(jsonString, options);
}
static equals(a: DRHeader | PlainMessage<DRHeader> | undefined, b: DRHeader | PlainMessage<DRHeader> | undefined): boolean {
return proto3.util.equals(DRHeader, a, b);
}
}
/**
* @generated from message DHHeader
*/
export class DHHeader extends Message<DHHeader> {
/**
* Compressed ephemeral public key
*
* @generated from field: bytes key = 1;
*/
key = new Uint8Array(0);
constructor(data?: PartialMessage<DHHeader>) {
super();
proto3.util.initPartial(data, this);
}
static readonly runtime = proto3;
static readonly typeName = "DHHeader";
static readonly fields: FieldList = proto3.util.newFieldList(() => [
{ no: 1, name: "key", kind: "scalar", T: 12 /* ScalarType.BYTES */ },
]);
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): DHHeader {
return new DHHeader().fromBinary(bytes, options);
}
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): DHHeader {
return new DHHeader().fromJson(jsonValue, options);
}
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): DHHeader {
return new DHHeader().fromJsonString(jsonString, options);
}
static equals(a: DHHeader | PlainMessage<DHHeader> | undefined, b: DHHeader | PlainMessage<DHHeader> | undefined): boolean {
return proto3.util.equals(DHHeader, a, b);
}
}
/**
* @generated from message X3DHHeader
*/
export class X3DHHeader extends Message<X3DHHeader> {
/**
* Ephemeral key used
*
* @generated from field: bytes key = 1;
*/
key = new Uint8Array(0);
/**
* Used bundle's signed prekey
*
* @generated from field: bytes id = 4;
*/
id = new Uint8Array(0);
constructor(data?: PartialMessage<X3DHHeader>) {
super();
proto3.util.initPartial(data, this);
}
static readonly runtime = proto3;
static readonly typeName = "X3DHHeader";
static readonly fields: FieldList = proto3.util.newFieldList(() => [
{ no: 1, name: "key", kind: "scalar", T: 12 /* ScalarType.BYTES */ },
{ no: 4, name: "id", kind: "scalar", T: 12 /* ScalarType.BYTES */ },
]);
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): X3DHHeader {
return new X3DHHeader().fromBinary(bytes, options);
}
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): X3DHHeader {
return new X3DHHeader().fromJson(jsonValue, options);
}
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): X3DHHeader {
return new X3DHHeader().fromJsonString(jsonString, options);
}
static equals(a: X3DHHeader | PlainMessage<X3DHHeader> | undefined, b: X3DHHeader | PlainMessage<X3DHHeader> | undefined): boolean {
return proto3.util.equals(X3DHHeader, a, b);
}
}
/**
* Hash Ratchet Header
*
* @generated from message HRHeader
*/
export class HRHeader extends Message<HRHeader> {
/**
* community key ID
*
* @generated from field: uint32 key_id = 1;
*/
keyId = 0;
/**
* Community message number for this key_id
*
* @generated from field: uint32 seq_no = 2;
*/
seqNo = 0;
/**
* Community ID
*
* @generated from field: string group_id = 3;
*/
groupId = "";
constructor(data?: PartialMessage<HRHeader>) {
super();
proto3.util.initPartial(data, this);
}
static readonly runtime = proto3;
static readonly typeName = "HRHeader";
static readonly fields: FieldList = proto3.util.newFieldList(() => [
{ no: 1, name: "key_id", kind: "scalar", T: 13 /* ScalarType.UINT32 */ },
{ no: 2, name: "seq_no", kind: "scalar", T: 13 /* ScalarType.UINT32 */ },
{ no: 3, name: "group_id", kind: "scalar", T: 9 /* ScalarType.STRING */ },
]);
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): HRHeader {
return new HRHeader().fromBinary(bytes, options);
}
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): HRHeader {
return new HRHeader().fromJson(jsonValue, options);
}
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): HRHeader {
return new HRHeader().fromJsonString(jsonString, options);
}
static equals(a: HRHeader | PlainMessage<HRHeader> | undefined, b: HRHeader | PlainMessage<HRHeader> | undefined): boolean {
return proto3.util.equals(HRHeader, a, b);
}
}
/**
* Direct message value
*
* @generated from message EncryptedMessageProtocol
*/
export class EncryptedMessageProtocol extends Message<EncryptedMessageProtocol> {
/**
* @generated from field: X3DHHeader X3DH_header = 1;
*/
X3DHHeader?: X3DHHeader;
/**
* @generated from field: DRHeader DR_header = 2;
*/
DRHeader?: DRHeader;
/**
* @generated from field: DHHeader DH_header = 101;
*/
DHHeader?: DHHeader;
/**
* @generated from field: HRHeader HR_header = 102;
*/
HRHeader?: HRHeader;
/**
* Encrypted payload
*
* @generated from field: bytes payload = 3;
*/
payload = new Uint8Array(0);
constructor(data?: PartialMessage<EncryptedMessageProtocol>) {
super();
proto3.util.initPartial(data, this);
}
static readonly runtime = proto3;
static readonly typeName = "EncryptedMessageProtocol";
static readonly fields: FieldList = proto3.util.newFieldList(() => [
{ no: 1, name: "X3DH_header", kind: "message", T: X3DHHeader },
{ no: 2, name: "DR_header", kind: "message", T: DRHeader },
{ no: 101, name: "DH_header", kind: "message", T: DHHeader },
{ no: 102, name: "HR_header", kind: "message", T: HRHeader },
{ no: 3, name: "payload", kind: "scalar", T: 12 /* ScalarType.BYTES */ },
]);
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): EncryptedMessageProtocol {
return new EncryptedMessageProtocol().fromBinary(bytes, options);
}
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): EncryptedMessageProtocol {
return new EncryptedMessageProtocol().fromJson(jsonValue, options);
}
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): EncryptedMessageProtocol {
return new EncryptedMessageProtocol().fromJsonString(jsonString, options);
}
static equals(a: EncryptedMessageProtocol | PlainMessage<EncryptedMessageProtocol> | undefined, b: EncryptedMessageProtocol | PlainMessage<EncryptedMessageProtocol> | undefined): boolean {
return proto3.util.equals(EncryptedMessageProtocol, a, b);
}
}
/**
* Top-level protocol message
*
* @generated from message ProtocolMessage
*/
export class ProtocolMessage extends Message<ProtocolMessage> {
/**
* The device id of the sender
*
* @generated from field: string installation_id = 2;
*/
installationId = "";
/**
* List of bundles
*
* @generated from field: repeated Bundle bundles = 3;
*/
bundles: Bundle[] = [];
/**
* One to one message, encrypted, indexed by installation_id
* TODO map here is redundant in case of community messages
*
* @generated from field: map<string, EncryptedMessageProtocol> encrypted_message = 101;
*/
encryptedMessage: { [key: string]: EncryptedMessageProtocol } = {};
/**
* Public chats, not encrypted
*
* @generated from field: bytes public_message = 102;
*/
publicMessage = new Uint8Array(0);
constructor(data?: PartialMessage<ProtocolMessage>) {
super();
proto3.util.initPartial(data, this);
}
static readonly runtime = proto3;
static readonly typeName = "ProtocolMessage";
static readonly fields: FieldList = proto3.util.newFieldList(() => [
{ no: 2, name: "installation_id", kind: "scalar", T: 9 /* ScalarType.STRING */ },
{ no: 3, name: "bundles", kind: "message", T: Bundle, repeated: true },
{ no: 101, name: "encrypted_message", kind: "map", K: 9 /* ScalarType.STRING */, V: {kind: "message", T: EncryptedMessageProtocol} },
{ no: 102, name: "public_message", kind: "scalar", T: 12 /* ScalarType.BYTES */ },
]);
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): ProtocolMessage {
return new ProtocolMessage().fromBinary(bytes, options);
}
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): ProtocolMessage {
return new ProtocolMessage().fromJson(jsonValue, options);
}
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): ProtocolMessage {
return new ProtocolMessage().fromJsonString(jsonString, options);
}
static equals(a: ProtocolMessage | PlainMessage<ProtocolMessage> | undefined, b: ProtocolMessage | PlainMessage<ProtocolMessage> | undefined): boolean {
return proto3.util.equals(ProtocolMessage, a, b);
}
}

View File

@ -1,51 +0,0 @@
/* eslint-disable import/export */
/* eslint-disable @typescript-eslint/no-namespace */
import { enumeration, encodeMessage, decodeMessage, message, uint64, string } from 'protons-runtime'
import type { Codec } from 'protons-runtime'
export interface StatusUpdate {
clock: bigint
statusType: StatusUpdate.StatusType
customText: string
}
export namespace StatusUpdate {
export enum StatusType {
UNKNOWN_STATUS_TYPE = 'UNKNOWN_STATUS_TYPE',
AUTOMATIC = 'AUTOMATIC',
DO_NOT_DISTURB = 'DO_NOT_DISTURB',
ALWAYS_ONLINE = 'ALWAYS_ONLINE',
INACTIVE = 'INACTIVE'
}
enum __StatusTypeValues {
UNKNOWN_STATUS_TYPE = 0,
AUTOMATIC = 1,
DO_NOT_DISTURB = 2,
ALWAYS_ONLINE = 3,
INACTIVE = 4
}
export namespace StatusType {
export const codec = () => {
return enumeration<typeof StatusType>(__StatusTypeValues)
}
}
export const codec = (): Codec<StatusUpdate> => {
return message<StatusUpdate>({
1: { name: 'clock', codec: uint64 },
2: { name: 'statusType', codec: StatusUpdate.StatusType.codec() },
3: { name: 'customText', codec: string }
})
}
export const encode = (obj: StatusUpdate): Uint8Array => {
return encodeMessage(obj, StatusUpdate.codec())
}
export const decode = (buf: Uint8Array): StatusUpdate => {
return decodeMessage(buf, StatusUpdate.codec())
}
}

View File

@ -0,0 +1,107 @@
// @generated by protoc-gen-es v1.0.0 with parameter "target=ts"
// @generated from file status-update.proto (syntax proto3)
/* eslint-disable */
// @ts-nocheck
import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf";
import { Message, proto3, protoInt64 } from "@bufbuild/protobuf";
/**
* Specs:
* :AUTOMATIC
* To Send - "AUTOMATIC" status ping every 5 minutes
* Display - Online for up to 5 minutes from the last clock, after that Offline
* :ALWAYS_ONLINE
* To Send - "ALWAYS_ONLINE" status ping every 5 minutes
* Display - Online for up to 2 weeks from the last clock, after that Offline
* :INACTIVE
* To Send - A single "INACTIVE" status ping
* Display - Offline forever
* Note: Only send pings if the user interacted with the app in the last x minutes.
*
* @generated from message StatusUpdate
*/
export class StatusUpdate extends Message<StatusUpdate> {
/**
* @generated from field: uint64 clock = 1;
*/
clock = protoInt64.zero;
/**
* @generated from field: StatusUpdate.StatusType status_type = 2;
*/
statusType = StatusUpdate_StatusType.UNKNOWN_STATUS_TYPE;
/**
* @generated from field: string custom_text = 3;
*/
customText = "";
constructor(data?: PartialMessage<StatusUpdate>) {
super();
proto3.util.initPartial(data, this);
}
static readonly runtime = proto3;
static readonly typeName = "StatusUpdate";
static readonly fields: FieldList = proto3.util.newFieldList(() => [
{ no: 1, name: "clock", kind: "scalar", T: 4 /* ScalarType.UINT64 */ },
{ no: 2, name: "status_type", kind: "enum", T: proto3.getEnumType(StatusUpdate_StatusType) },
{ no: 3, name: "custom_text", kind: "scalar", T: 9 /* ScalarType.STRING */ },
]);
static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): StatusUpdate {
return new StatusUpdate().fromBinary(bytes, options);
}
static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): StatusUpdate {
return new StatusUpdate().fromJson(jsonValue, options);
}
static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): StatusUpdate {
return new StatusUpdate().fromJsonString(jsonString, options);
}
static equals(a: StatusUpdate | PlainMessage<StatusUpdate> | undefined, b: StatusUpdate | PlainMessage<StatusUpdate> | undefined): boolean {
return proto3.util.equals(StatusUpdate, a, b);
}
}
/**
* @generated from enum StatusUpdate.StatusType
*/
export enum StatusUpdate_StatusType {
/**
* @generated from enum value: UNKNOWN_STATUS_TYPE = 0;
*/
UNKNOWN_STATUS_TYPE = 0,
/**
* @generated from enum value: AUTOMATIC = 1;
*/
AUTOMATIC = 1,
/**
* @generated from enum value: DO_NOT_DISTURB = 2;
*/
DO_NOT_DISTURB = 2,
/**
* @generated from enum value: ALWAYS_ONLINE = 3;
*/
ALWAYS_ONLINE = 3,
/**
* @generated from enum value: INACTIVE = 4;
*/
INACTIVE = 4,
}
// Retrieve enum metadata with: proto3.getEnumType(StatusUpdate_StatusType)
proto3.util.setEnumType(StatusUpdate_StatusType, "StatusUpdate.StatusType", [
{ no: 0, name: "UNKNOWN_STATUS_TYPE" },
{ no: 1, name: "AUTOMATIC" },
{ no: 2, name: "DO_NOT_DISTURB" },
{ no: 3, name: "ALWAYS_ONLINE" },
{ no: 4, name: "INACTIVE" },
]);

View File

@ -2,10 +2,13 @@ import { bytesToHex, utf8ToBytes } from 'ethereum-cryptography/utils'
import { expect, test } from 'vitest' import { expect, test } from 'vitest'
import { Account } from '../client/account' import { Account } from '../client/account'
import {
ApplicationMetadataMessage,
ApplicationMetadataMessage_Type,
} from '../protos/application-metadata-message_pb'
import { recoverPublicKey } from './recover-public-key' import { recoverPublicKey } from './recover-public-key'
import type { Client } from '../client/client' import type { Client } from '../client/client'
import type { ApplicationMetadataMessage } from '../protos/application-metadata-message'
test('should recover public key', async () => { test('should recover public key', async () => {
const payload = utf8ToBytes('hello') const payload = utf8ToBytes('hello')
@ -20,8 +23,8 @@ test('should recover public key', async () => {
}) })
test('should recover public key from fixture', async () => { test('should recover public key from fixture', async () => {
const metadataFixture: ApplicationMetadataMessage = { const metadataFixture = new ApplicationMetadataMessage({
type: 'TYPE_EMOJI_REACTION' as ApplicationMetadataMessage.Type, type: ApplicationMetadataMessage_Type.EMOJI_REACTION,
signature: new Uint8Array([ signature: new Uint8Array([
250, 132, 234, 119, 159, 124, 98, 93, 197, 108, 99, 52, 186, 234, 142, 250, 132, 234, 119, 159, 124, 98, 93, 197, 108, 99, 52, 186, 234, 142,
101, 147, 180, 50, 190, 102, 61, 219, 189, 95, 124, 29, 74, 43, 46, 106, 101, 147, 180, 50, 190, 102, 61, 219, 189, 95, 124, 29, 74, 43, 46, 106,
@ -42,7 +45,7 @@ test('should recover public key from fixture', async () => {
55, 97, 55, 99, 48, 97, 53, 101, 98, 97, 53, 102, 97, 57, 100, 52, 100, 55, 97, 55, 99, 48, 97, 53, 101, 98, 97, 53, 102, 97, 57, 100, 52, 100,
57, 49, 98, 97, 56, 32, 5, 40, 2, 57, 49, 98, 97, 56, 32, 5, 40, 2,
]), ]),
} })
const publicKeySnapshot = new Uint8Array([ const publicKeySnapshot = new Uint8Array([
4, 172, 65, 157, 172, 154, 139, 187, 88, 130, 90, 60, 222, 96, 238, 240, 4, 172, 65, 157, 172, 154, 139, 187, 88, 130, 90, 60, 222, 96, 238, 240,

View File

@ -1,27 +1,42 @@
import type { ChatMessage } from '../protos/chat-message' import {
AudioMessage_AudioType,
ChatMessage_ContentType,
} from '../protos/chat-message_pb'
import { ImageType, MessageType } from '../protos/enums_pb'
import type {
AudioMessage,
ChatMessage,
ImageMessage,
} from '../protos/chat-message_pb'
// TODO?: maybe this should normalize the message? // TODO?: maybe this should normalize the message?
export function validateMessage(message: ChatMessage): boolean { export function validateMessage(message: ChatMessage): boolean {
if (message.messageType !== 'COMMUNITY_CHAT') { if (message.messageType !== MessageType.COMMUNITY_CHAT) {
return false return false
} }
switch (message.contentType) { switch (message.contentType) {
case 'TEXT_PLAIN': { case ChatMessage_ContentType.TEXT_PLAIN: {
return message.text !== '' return message.text !== ''
} }
case 'IMAGE': { case ChatMessage_ContentType.IMAGE: {
if (message.image.type === 'UNKNOWN_IMAGE_TYPE') { // fixme?
const payload = message.payload.value as ImageMessage
if (payload.type === ImageType.UNKNOWN_IMAGE_TYPE) {
return false return false
} }
return message.image.payload.length !== 0 return payload.payload.length !== 0
} }
case 'AUDIO': { case ChatMessage_ContentType.AUDIO: {
if (message.audio.type === 'UNKNOWN_AUDIO_TYPE') { const payload = message.payload.value as AudioMessage
if (payload.type === AudioMessage_AudioType.UNKNOWN_AUDIO_TYPE) {
return false return false
} }
return message.audio.payload.length !== 0 return payload.payload.length !== 0
} }
} }

View File

@ -7,6 +7,7 @@ export { useChat } from './use-chat'
export type { Member } from './use-members' export type { Member } from './use-members'
export { useMembers } from './use-members' export { useMembers } from './use-members'
export type { Message, Reaction, Reactions } from './use-messages' export type { Message, Reaction, Reactions } from './use-messages'
export { MessageContentType } from './use-messages'
export { useMessages } from './use-messages' export { useMessages } from './use-messages'
export { useProtocol } from './use-protocol' export { useProtocol } from './use-protocol'
export { useSortedChats } from './use-sorted-chats' export { useSortedChats } from './use-sorted-chats'

View File

@ -1,12 +1,11 @@
import { useEffect, useState } from 'react' import { useEffect, useState } from 'react'
import { MessageContentType } from '@status-im/js'
import sub from 'date-fns/sub' import sub from 'date-fns/sub'
import { useProtocol } from './use-protocol' import { useProtocol } from './use-protocol'
import type { Message, Reactions } from '@status-im/js' import type { Message, Reaction, Reactions } from '@status-im/js'
type Reaction = keyof Reactions
interface Result { interface Result {
data: Message[] data: Message[]
@ -52,3 +51,4 @@ export const useMessages = (chatId: string): Result => {
} }
export type { Message, Reaction, Reactions } export type { Message, Reaction, Reactions }
export { MessageContentType }

View File

@ -2,6 +2,7 @@ import React from 'react'
import { useChatContext } from '../../../../contexts/chat-context' import { useChatContext } from '../../../../contexts/chat-context'
import { CrossIcon } from '../../../../icons/cross-icon' import { CrossIcon } from '../../../../icons/cross-icon'
import { MessageContentType } from '../../../../protocol'
import { styled } from '../../../../styles/config' import { styled } from '../../../../styles/config'
import { Flex, IconButton, Text } from '../../../../system' import { Flex, IconButton, Text } from '../../../../system'
@ -34,7 +35,7 @@ export const InputReply = (props: Props) => {
<CrossIcon /> <CrossIcon />
</IconButton> </IconButton>
</Flex> </Flex>
{message.contentType === 'TEXT_PLAIN' && ( {message.contentType === MessageContentType.TEXT_PLAIN && (
<Flex> <Flex>
<Text size="13" truncate> <Text size="13" truncate>
{message.text} {message.text}

View File

@ -6,7 +6,11 @@ import { useMatch } from 'react-router-dom'
import { useChatContext } from '../../../../contexts/chat-context' import { useChatContext } from '../../../../contexts/chat-context'
// import { BellIcon } from '../../../../icons/bell-icon' // import { BellIcon } from '../../../../icons/bell-icon'
// import { PinIcon } from '../../../../icons/pin-icon' // import { PinIcon } from '../../../../icons/pin-icon'
import { useAccount, useProtocol } from '../../../../protocol' import {
MessageContentType,
useAccount,
useProtocol,
} from '../../../../protocol'
import { keyframes, styled } from '../../../../styles/config' import { keyframes, styled } from '../../../../styles/config'
import { import {
Avatar, Avatar,
@ -134,7 +138,7 @@ export const ChatMessage = (props: Props) => {
} }
switch (contentType) { switch (contentType) {
case 'TEXT_PLAIN': { case MessageContentType.TEXT_PLAIN: {
// <AlertDialogTrigger> // <AlertDialogTrigger>
// <MessageLink href="https://specs.status.im/spec"> // <MessageLink href="https://specs.status.im/spec">
// https://specs.status.im/spec // https://specs.status.im/spec
@ -147,15 +151,22 @@ export const ChatMessage = (props: Props) => {
// </AlertDialogTrigger>{' '} // </AlertDialogTrigger>{' '}
return <Text>{message.text}</Text> return <Text>{message.text}</Text>
} }
case 'EMOJI': { case MessageContentType.EMOJI: {
return ( return (
<Text css={{ fontSize: '3rem', lineHeight: 1.1, letterSpacing: -2 }}> <Text css={{ fontSize: '3rem', lineHeight: 1.1, letterSpacing: -2 }}>
{message.text} {message.text}
</Text> </Text>
) )
} }
case 'IMAGE': { case MessageContentType.IMAGE: {
const blob = new Blob([message.image.payload], { type: 'image/jpeg' }) // fixme?
const image = message.payload.value as {
payload: Uint8Array
type: number
}
const blob = new Blob([image.payload], {
type: 'image/jpeg',
})
// TODO?: call URL.revokeObjectURL() // TODO?: call URL.revokeObjectURL()
return ( return (

View File

@ -1,6 +1,6 @@
import React from 'react' import React from 'react'
import { useProtocol } from '../../../../protocol' import { MessageContentType, useProtocol } from '../../../../protocol'
import { styled } from '../../../../styles/config' import { styled } from '../../../../styles/config'
import { Avatar, Box, Flex, Image, Text } from '../../../../system' import { Avatar, Box, Flex, Image, Text } from '../../../../system'
@ -36,21 +36,21 @@ export const MessageReply = (props: Props) => {
{member.username} {member.username}
</Text> </Text>
</Flex> </Flex>
{contentType === 'TEXT_PLAIN' && ( {contentType === MessageContentType.TEXT_PLAIN && (
<Flex> <Flex>
<Text color="gray" size="13" truncate> <Text color="gray" size="13" truncate>
{text} {text}
</Text> </Text>
</Flex> </Flex>
)} )}
{contentType === 'EMOJI' && ( {contentType === MessageContentType.EMOJI && (
<Flex> <Flex>
<Text color="gray" size="13" truncate> <Text color="gray" size="13" truncate>
{text} {text}
</Text> </Text>
</Flex> </Flex>
)} )}
{contentType === 'IMAGE' && ( {contentType === MessageContentType.IMAGE && (
<Box css={{ paddingTop: '$1' }}> <Box css={{ paddingTop: '$1' }}>
<Image <Image
src="TODO" src="TODO"

208
yarn.lock
View File

@ -445,6 +445,27 @@
"@babel/helper-validator-identifier" "^7.19.1" "@babel/helper-validator-identifier" "^7.19.1"
to-fast-properties "^2.0.0" to-fast-properties "^2.0.0"
"@bufbuild/protobuf@1.0.0", "@bufbuild/protobuf@^1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@bufbuild/protobuf/-/protobuf-1.0.0.tgz#b25c045f8554f92c3723d5bb28e3a2538662f51b"
integrity sha512-oH3jHBrZ6to8Qf4zLg7O8KqSY42kQZNBRXJRMp5uSi0mqE4L8NbyMnZHeOsbXmTb0xpptRyH11LfS+KeVhXzAA==
"@bufbuild/protoc-gen-es@^1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@bufbuild/protoc-gen-es/-/protoc-gen-es-1.0.0.tgz#9afa22d6296a741f8b512a5fcf0846d948ce7f65"
integrity sha512-3NZzjw2hbeO7JFUZ70W4UOkaMyOC6hJfJP4uDczyWWTXoCr2TPDfPyLE2U8DBpKufneLS1YBhFJPPv4QvJkiPA==
dependencies:
"@bufbuild/protoplugin" "1.0.0"
"@bufbuild/protoplugin@1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@bufbuild/protoplugin/-/protoplugin-1.0.0.tgz#58708ccbb2710be7d4a69607e2b039ac62cd5665"
integrity sha512-L7z2/4MgP36QGEAh8T4OYrdMRv//LAw4gGpL8D3cziE21uP6FLzLKpIxJ4aJBoUyHyS53tpZMpb0djbxYDecFA==
dependencies:
"@bufbuild/protobuf" "1.0.0"
"@typescript/vfs" "^1.4.0"
typescript "4.5.2"
"@chainsafe/libp2p-gossipsub@^4.1.1": "@chainsafe/libp2p-gossipsub@^4.1.1":
version "4.1.1" version "4.1.1"
resolved "https://registry.yarnpkg.com/@chainsafe/libp2p-gossipsub/-/libp2p-gossipsub-4.1.1.tgz#804dbbd262900fd730339c40c46013ff854240af" resolved "https://registry.yarnpkg.com/@chainsafe/libp2p-gossipsub/-/libp2p-gossipsub-4.1.1.tgz#804dbbd262900fd730339c40c46013ff854240af"
@ -2401,7 +2422,7 @@
resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9"
integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==
"@types/minimist@^1.2.0", "@types/minimist@^1.2.2": "@types/minimist@^1.2.0":
version "1.2.2" version "1.2.2"
resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c"
integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==
@ -2582,6 +2603,13 @@
"@typescript-eslint/types" "5.12.1" "@typescript-eslint/types" "5.12.1"
eslint-visitor-keys "^3.0.0" eslint-visitor-keys "^3.0.0"
"@typescript/vfs@^1.4.0":
version "1.4.0"
resolved "https://registry.yarnpkg.com/@typescript/vfs/-/vfs-1.4.0.tgz#2d22985c7666c9d4ce26eb025405e6f156aa32b0"
integrity sha512-Pood7yv5YWMIX+yCHo176OnF8WUlKGImFG7XlsuH14Zb1YN5+dYD3uUtS7lqZtsH7tAveNUi2NzdpQCN0yRbaw==
dependencies:
debug "^4.1.1"
"@vitejs/plugin-react@^1.3.2": "@vitejs/plugin-react@^1.3.2":
version "1.3.2" version "1.3.2"
resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-1.3.2.tgz#2fcf0b6ce9bcdcd4cec5c760c199779d5657ece1" resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-1.3.2.tgz#2fcf0b6ce9bcdcd4cec5c760c199779d5657ece1"
@ -2883,26 +2911,11 @@ camelcase-keys@^6.2.2:
map-obj "^4.0.0" map-obj "^4.0.0"
quick-lru "^4.0.1" quick-lru "^4.0.1"
camelcase-keys@^7.0.0:
version "7.0.2"
resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-7.0.2.tgz#d048d8c69448745bb0de6fc4c1c52a30dfbe7252"
integrity sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==
dependencies:
camelcase "^6.3.0"
map-obj "^4.1.0"
quick-lru "^5.1.1"
type-fest "^1.2.1"
camelcase@^5.0.0, camelcase@^5.3.1: camelcase@^5.0.0, camelcase@^5.3.1:
version "5.3.1" version "5.3.1"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
camelcase@^6.3.0:
version "6.3.0"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001406: caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001406:
version "1.0.30001418" version "1.0.30001418"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001418.tgz#5f459215192a024c99e3e3a53aac310fc7cf24e6" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001418.tgz#5f459215192a024c99e3e3a53aac310fc7cf24e6"
@ -3216,11 +3229,6 @@ decamelize@^1.1.0, decamelize@^1.2.0:
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
decamelize@^5.0.0:
version "5.0.1"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-5.0.1.tgz#db11a92e58c741ef339fb0a2868d8a06a9a7b1e9"
integrity sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==
deep-eql@^3.0.1: deep-eql@^3.0.1:
version "3.0.1" version "3.0.1"
resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df"
@ -4410,13 +4418,6 @@ hosted-git-info@^2.1.4:
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==
hosted-git-info@^4.0.1:
version "4.1.0"
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224"
integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==
dependencies:
lru-cache "^6.0.0"
html-entities@^2.3.2: html-entities@^2.3.2:
version "2.3.2" version "2.3.2"
resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.2.tgz#760b404685cb1d794e4f4b744332e3b00dcfe488" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.2.tgz#760b404685cb1d794e4f4b744332e3b00dcfe488"
@ -4496,11 +4497,6 @@ indent-string@^4.0.0:
resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
indent-string@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5"
integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==
inflight@^1.0.4: inflight@^1.0.4:
version "1.0.6" version "1.0.6"
resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
@ -4605,7 +4601,7 @@ is-core-module@^2.2.0, is-core-module@^2.8.0, is-core-module@^2.8.1:
dependencies: dependencies:
has "^1.0.3" has "^1.0.3"
is-core-module@^2.5.0, is-core-module@^2.9.0: is-core-module@^2.9.0:
version "2.9.0" version "2.9.0"
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69"
integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==
@ -5297,29 +5293,11 @@ map-obj@^1.0.0:
resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=
map-obj@^4.0.0, map-obj@^4.1.0: map-obj@^4.0.0:
version "4.3.0" version "4.3.0"
resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a"
integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==
meow@^10.1.2:
version "10.1.2"
resolved "https://registry.yarnpkg.com/meow/-/meow-10.1.2.tgz#62951cb69afa69594142c8250806bc30a3912e4d"
integrity sha512-zbuAlN+V/sXlbGchNS9WTWjUzeamwMt/BApKCJi7B0QyZstZaMx0n4Unll/fg0njGtMdC9UP5SAscvOCLYdM+Q==
dependencies:
"@types/minimist" "^1.2.2"
camelcase-keys "^7.0.0"
decamelize "^5.0.0"
decamelize-keys "^1.1.0"
hard-rejection "^2.1.0"
minimist-options "4.1.0"
normalize-package-data "^3.0.2"
read-pkg-up "^8.0.0"
redent "^4.0.0"
trim-newlines "^4.0.2"
type-fest "^1.2.2"
yargs-parser "^20.2.9"
meow@^6.0.0: meow@^6.0.0:
version "6.1.1" version "6.1.1"
resolved "https://registry.yarnpkg.com/meow/-/meow-6.1.1.tgz#1ad64c4b76b2a24dfb2f635fddcadf320d251467" resolved "https://registry.yarnpkg.com/meow/-/meow-6.1.1.tgz#1ad64c4b76b2a24dfb2f635fddcadf320d251467"
@ -5387,7 +5365,7 @@ mimic-fn@^2.1.0:
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
min-indent@^1.0.0, min-indent@^1.0.1: min-indent@^1.0.0:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869"
integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==
@ -5399,7 +5377,7 @@ minimatch@^3.0.4:
dependencies: dependencies:
brace-expansion "^1.1.7" brace-expansion "^1.1.7"
minimist-options@4.1.0, minimist-options@^4.0.2: minimist-options@^4.0.2:
version "4.1.0" version "4.1.0"
resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619"
integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==
@ -5546,16 +5524,6 @@ normalize-package-data@^2.5.0:
semver "2 || 3 || 4 || 5" semver "2 || 3 || 4 || 5"
validate-npm-package-license "^3.0.1" validate-npm-package-license "^3.0.1"
normalize-package-data@^3.0.2:
version "3.0.3"
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e"
integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==
dependencies:
hosted-git-info "^4.0.1"
is-core-module "^2.5.0"
semver "^7.3.4"
validate-npm-package-license "^3.0.1"
normalize-path@^3.0.0: normalize-path@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
@ -5832,7 +5800,7 @@ parse-cache-control@^1.0.1:
resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e" resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e"
integrity sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg== integrity sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==
parse-json@^5.0.0, parse-json@^5.2.0: parse-json@^5.0.0:
version "5.2.0" version "5.2.0"
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
@ -6021,25 +5989,6 @@ protobufjs@^6.11.2:
"@types/node" ">=13.7.0" "@types/node" ">=13.7.0"
long "^4.0.0" long "^4.0.0"
protobufjs@^6.11.3:
version "6.11.3"
resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.3.tgz#637a527205a35caa4f3e2a9a4a13ddffe0e7af74"
integrity sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==
dependencies:
"@protobufjs/aspromise" "^1.1.2"
"@protobufjs/base64" "^1.1.2"
"@protobufjs/codegen" "^2.0.4"
"@protobufjs/eventemitter" "^1.1.0"
"@protobufjs/fetch" "^1.1.0"
"@protobufjs/float" "^1.0.2"
"@protobufjs/inquire" "^1.1.0"
"@protobufjs/path" "^1.1.2"
"@protobufjs/pool" "^1.1.0"
"@protobufjs/utf8" "^1.1.0"
"@types/long" "^4.0.1"
"@types/node" ">=13.7.0"
long "^4.0.0"
protobufjs@^7.0.0: protobufjs@^7.0.0:
version "7.1.0" version "7.1.0"
resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.1.0.tgz#5174b5f96fad4f7dea7dd4abd594042ac360e665" resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.1.0.tgz#5174b5f96fad4f7dea7dd4abd594042ac360e665"
@ -6058,14 +6007,6 @@ protobufjs@^7.0.0:
"@types/node" ">=13.7.0" "@types/node" ">=13.7.0"
long "^5.0.0" long "^5.0.0"
protons-runtime@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/protons-runtime/-/protons-runtime-1.0.4.tgz#85db97f82fb03a1205eafb591904736ba34e2972"
integrity sha512-DSKWjAgwaXhtYO5Jo/MrU8n/75I/P2IhxU0Fk/lSrXx6Gxl5DH+I6cHcbGAYFmAlOBmU4QRa0mvVme8VXlDeUg==
dependencies:
uint8arraylist "^1.4.0"
uint8arrays "^3.0.0"
protons-runtime@^3.0.1, protons-runtime@^3.1.0: protons-runtime@^3.0.1, protons-runtime@^3.1.0:
version "3.1.0" version "3.1.0"
resolved "https://registry.yarnpkg.com/protons-runtime/-/protons-runtime-3.1.0.tgz#500918da4a2d97aa28007f30c3f2f7021e05c0b2" resolved "https://registry.yarnpkg.com/protons-runtime/-/protons-runtime-3.1.0.tgz#500918da4a2d97aa28007f30c3f2f7021e05c0b2"
@ -6074,14 +6015,6 @@ protons-runtime@^3.0.1, protons-runtime@^3.1.0:
protobufjs "^7.0.0" protobufjs "^7.0.0"
uint8arraylist "^2.3.2" uint8arraylist "^2.3.2"
protons@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/protons/-/protons-3.0.4.tgz#29fbcbb2e43952e6a3e072e240b4d94d43778b09"
integrity sha512-R0X/4pCfpXo3X2CVMmhDLHnHRqVg202N32p8qESKc1Vh8cD7Lqj6DBB/Z6yk6lgrH2UEneCHmHYzqonRl+l+pg==
dependencies:
meow "^10.1.2"
protobufjs "^6.11.2"
pseudomap@^1.0.2: pseudomap@^1.0.2:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
@ -6114,11 +6047,6 @@ quick-lru@^4.0.1:
resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f"
integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==
quick-lru@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932"
integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==
react-content-loader@^6.2.0: react-content-loader@^6.2.0:
version "6.2.0" version "6.2.0"
resolved "https://registry.yarnpkg.com/react-content-loader/-/react-content-loader-6.2.0.tgz#cd8fee8160b8fda6610d0c69ce5aee7b8094cba6" resolved "https://registry.yarnpkg.com/react-content-loader/-/react-content-loader-6.2.0.tgz#cd8fee8160b8fda6610d0c69ce5aee7b8094cba6"
@ -6213,15 +6141,6 @@ read-pkg-up@^7.0.1:
read-pkg "^5.2.0" read-pkg "^5.2.0"
type-fest "^0.8.1" type-fest "^0.8.1"
read-pkg-up@^8.0.0:
version "8.0.0"
resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-8.0.0.tgz#72f595b65e66110f43b052dd9af4de6b10534670"
integrity sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==
dependencies:
find-up "^5.0.0"
read-pkg "^6.0.0"
type-fest "^1.0.1"
read-pkg@^5.2.0: read-pkg@^5.2.0:
version "5.2.0" version "5.2.0"
resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc"
@ -6232,16 +6151,6 @@ read-pkg@^5.2.0:
parse-json "^5.0.0" parse-json "^5.0.0"
type-fest "^0.6.0" type-fest "^0.6.0"
read-pkg@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-6.0.0.tgz#a67a7d6a1c2b0c3cd6aa2ea521f40c458a4a504c"
integrity sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==
dependencies:
"@types/normalize-package-data" "^2.4.0"
normalize-package-data "^3.0.2"
parse-json "^5.2.0"
type-fest "^1.0.1"
read-yaml-file@^1.1.0: read-yaml-file@^1.1.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/read-yaml-file/-/read-yaml-file-1.1.0.tgz#9362bbcbdc77007cc8ea4519fe1c0b821a7ce0d8" resolved "https://registry.yarnpkg.com/read-yaml-file/-/read-yaml-file-1.1.0.tgz#9362bbcbdc77007cc8ea4519fe1c0b821a7ce0d8"
@ -6280,14 +6189,6 @@ redent@^3.0.0:
indent-string "^4.0.0" indent-string "^4.0.0"
strip-indent "^3.0.0" strip-indent "^3.0.0"
redent@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/redent/-/redent-4.0.0.tgz#0c0ba7caabb24257ab3bb7a4fd95dd1d5c5681f9"
integrity sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==
dependencies:
indent-string "^5.0.0"
strip-indent "^4.0.0"
regenerator-runtime@^0.13.4: regenerator-runtime@^0.13.4:
version "0.13.9" version "0.13.9"
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52"
@ -6464,13 +6365,6 @@ semver@^6.3.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
semver@^7.3.4:
version "7.3.7"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f"
integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==
dependencies:
lru-cache "^6.0.0"
semver@^7.3.5: semver@^7.3.5:
version "7.3.5" version "7.3.5"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
@ -6744,13 +6638,6 @@ strip-indent@^3.0.0:
dependencies: dependencies:
min-indent "^1.0.0" min-indent "^1.0.0"
strip-indent@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-4.0.0.tgz#b41379433dd06f5eae805e21d631e07ee670d853"
integrity sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==
dependencies:
min-indent "^1.0.1"
strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
version "3.1.1" version "3.1.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
@ -6916,11 +6803,6 @@ trim-newlines@^3.0.0:
resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144"
integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==
trim-newlines@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-4.0.2.tgz#d6aaaf6a0df1b4b536d183879a6b939489808c7c"
integrity sha512-GJtWyq9InR/2HRiLZgpIKv+ufIKrVrvjQWEj7PxAXNc5dwbNJkqhAUoAGgzRmULAnoOM5EIpveYd3J2VeSAIew==
truncate-utf8-bytes@^1.0.0: truncate-utf8-bytes@^1.0.0:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b"
@ -7100,16 +6982,16 @@ type-fest@^0.8.1:
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
type-fest@^1.0.1, type-fest@^1.2.1, type-fest@^1.2.2:
version "1.4.0"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1"
integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==
typedarray@^0.0.6: typedarray@^0.0.6:
version "0.0.6" version "0.0.6"
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==
typescript@4.5.2:
version "4.5.2"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.2.tgz#8ac1fba9f52256fdb06fb89e4122fa6a346c2998"
integrity sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==
typescript@^4.5.5: typescript@^4.5.5:
version "4.5.5" version "4.5.5"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.5.tgz#d8c953832d28924a9e3d37c73d729c846c5896f3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.5.tgz#d8c953832d28924a9e3d37c73d729c846c5896f3"
@ -7130,13 +7012,6 @@ uint8-varint@^1.0.1, uint8-varint@^1.0.2:
uint8arraylist "^2.0.0" uint8arraylist "^2.0.0"
uint8arrays "^3.1.0" uint8arrays "^3.1.0"
uint8arraylist@^1.4.0:
version "1.5.1"
resolved "https://registry.yarnpkg.com/uint8arraylist/-/uint8arraylist-1.5.1.tgz#b8b325865b65b62b4cec773bc568cdd03c691d08"
integrity sha512-UpPGcVlTVc7Brtwt4W2MfTqvJQsr8owHMKBnICsueSImiarVAHf8NGMjhMklFtgbCZN1/9S9oW5k1JwlalGHoA==
dependencies:
uint8arrays "^3.0.0"
uint8arraylist@^2.0.0, uint8arraylist@^2.1.0, uint8arraylist@^2.1.1, uint8arraylist@^2.3.1, uint8arraylist@^2.3.2: uint8arraylist@^2.0.0, uint8arraylist@^2.1.0, uint8arraylist@^2.1.1, uint8arraylist@^2.3.1, uint8arraylist@^2.3.2:
version "2.3.2" version "2.3.2"
resolved "https://registry.yarnpkg.com/uint8arraylist/-/uint8arraylist-2.3.2.tgz#d301f6cb570828b456ef09655c0a4d3b0929ef06" resolved "https://registry.yarnpkg.com/uint8arraylist/-/uint8arraylist-2.3.2.tgz#d301f6cb570828b456ef09655c0a4d3b0929ef06"
@ -7477,11 +7352,6 @@ yargs-parser@^18.1.2, yargs-parser@^18.1.3:
camelcase "^5.0.0" camelcase "^5.0.0"
decamelize "^1.2.0" decamelize "^1.2.0"
yargs-parser@^20.2.9:
version "20.2.9"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
yargs-parser@^21.0.0: yargs-parser@^21.0.0:
version "21.0.1" version "21.0.1"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35"