in packages/chat-stateful-client/src/StatefulChatThreadClient.ts [21:164]
public get<P extends keyof ChatThreadClient>(chatThreadClient: ChatThreadClient, prop: P): any {
switch (prop) {
case 'listMessages': {
return createDecoratedListMessages(chatThreadClient, this._context);
}
case 'getMessage': {
return this._context.withAsyncErrorTeedToState(async (...args: Parameters<ChatThreadClient['getMessage']>) => {
const message = await chatThreadClient.getMessage(...args);
this._context.setChatMessage(chatThreadClient.threadId, convertChatMessage(message));
return message;
}, 'ChatThreadClient.getMessage');
}
case 'sendMessage': {
return this._context.withAsyncErrorTeedToState(async (...args: Parameters<ChatThreadClient['sendMessage']>) => {
// Retry logic?
const [request, options] = args;
const { content } = request;
const clientMessageId = nanoid(); // Generate a local short uuid for message
const newMessage: ChatMessageWithStatus = {
content: { message: content },
clientMessageId,
id: '',
type: options?.type ?? 'text',
sequenceId: '',
version: '',
createdOn: new Date(),
status: 'sending',
senderDisplayName: this._context.getState().displayName,
sender: this._context.getState().userId,
metadata: options?.metadata
};
this._context.setChatMessage(chatThreadClient.threadId, newMessage);
let result: SendChatMessageResult | undefined = undefined;
try {
result = await chatThreadClient.sendMessage(...args);
} catch (e) {
this._context.setChatMessage(chatThreadClient.threadId, { ...newMessage, status: 'failed' });
throw e;
}
if (result?.id) {
this._context.batch(() => {
if (!result) {
return;
}
this._context.setChatMessage(chatThreadClient.threadId, {
...newMessage,
clientMessageId: undefined,
status: 'delivered',
id: result.id
});
this._context.deleteLocalMessage(chatThreadClient.threadId, clientMessageId);
});
}
return result;
}, 'ChatThreadClient.sendMessage');
}
case 'addParticipants': {
return this._context.withAsyncErrorTeedToState(
async (...args: Parameters<ChatThreadClient['addParticipants']>) => {
const result = await chatThreadClient.addParticipants(...args);
const [addRequest] = args;
const participantsToAdd = addRequest.participants;
this._context.setParticipants(chatThreadClient.threadId, participantsToAdd);
return result;
},
'ChatThreadClient.addParticipants'
);
}
case 'deleteMessage': {
return this._context.withAsyncErrorTeedToState(
async (...args: Parameters<ChatThreadClient['deleteMessage']>) => {
// DeleteMessage is able to either delete local one(for failed message) or synced message
const [messageId] = args;
if (this._context.deleteLocalMessage(chatThreadClient.threadId, messageId)) {
return {};
}
const result = await chatThreadClient.deleteMessage(...args);
this._context.deleteMessage(chatThreadClient.threadId, messageId);
return result;
},
'ChatThreadClient.deleteMessage'
);
}
case 'listParticipants': {
return createDecoratedListParticipants(chatThreadClient, this._context);
}
case 'listReadReceipts': {
return createDecoratedListReadReceipts(chatThreadClient, this._context);
}
case 'sendTypingNotification': {
return this._context.withAsyncErrorTeedToState(
async (...args: Parameters<ChatThreadClient['sendTypingNotification']>) => {
return await chatThreadClient.sendTypingNotification(...args);
},
'ChatThreadClient.sendTypingNotification'
);
}
case 'removeParticipant': {
return this._context.withAsyncErrorTeedToState(
async (...args: Parameters<ChatThreadClient['removeParticipant']>) => {
const result = await chatThreadClient.removeParticipant(...args);
const [removeIdentifier] = args;
this._context.deleteParticipant(chatThreadClient.threadId, getIdentifierKind(removeIdentifier));
return result;
},
'ChatThreadClient.removeParticipant'
);
}
case 'updateMessage': {
return this._context.withAsyncErrorTeedToState(
async (...args: Parameters<ChatThreadClient['updateMessage']>) => {
const result = await chatThreadClient.updateMessage(...args);
const [messageId, updateOption] = args;
this._context.updateChatMessageContent(chatThreadClient.threadId, messageId, updateOption?.content);
return result;
},
'ChatThreadClient.updateMessage'
);
}
case 'updateTopic': {
return this._context.withAsyncErrorTeedToState(async (...args: Parameters<ChatThreadClient['updateTopic']>) => {
const result = await chatThreadClient.updateTopic(...args);
const [topic] = args;
this._context.updateThreadTopic(chatThreadClient.threadId, topic);
return result;
}, 'ChatThreadClient.updateTopic');
}
case 'getProperties': {
return this._context.withAsyncErrorTeedToState(
async (...args: Parameters<ChatThreadClient['getProperties']>) => {
const result = await chatThreadClient.getProperties(...args);
this._context.updateThread(chatThreadClient.threadId, result);
return result;
},
'ChatThreadClient.getProperties'
);
}
default:
return Reflect.get(chatThreadClient, prop);
}
}