Changeset View
Changeset View
Standalone View
Standalone View
keyserver/src/responders/message-responders.js
Show First 20 Lines • Show All 54 Lines • ▼ Show 20 Lines | import { | ||||
fetchMediaFromMediaMessageContent, | fetchMediaFromMediaMessageContent, | ||||
} from '../fetchers/upload-fetchers.js'; | } from '../fetchers/upload-fetchers.js'; | ||||
import { fetchKnownUserInfos } from '../fetchers/user-fetchers.js'; | import { fetchKnownUserInfos } from '../fetchers/user-fetchers.js'; | ||||
import type { Viewer } from '../session/viewer.js'; | import type { Viewer } from '../session/viewer.js'; | ||||
import { | import { | ||||
assignImages, | assignImages, | ||||
assignMessageContainerToMedia, | assignMessageContainerToMedia, | ||||
} from '../updaters/upload-updaters.js'; | } from '../updaters/upload-updaters.js'; | ||||
import { validateInput } from '../utils/validation-utils.js'; | import { validateInput, validateOutput } from '../utils/validation-utils.js'; | ||||
const sendTextMessageRequestInputValidator = tShape({ | const sendTextMessageRequestInputValidator = tShape({ | ||||
threadID: t.String, | threadID: t.String, | ||||
localID: t.maybe(t.String), | localID: t.maybe(t.String), | ||||
text: t.String, | text: t.String, | ||||
sidebarCreation: t.maybe(t.Boolean), | sidebarCreation: t.maybe(t.Boolean), | ||||
}); | }); | ||||
▲ Show 20 Lines • Show All 41 Lines • ▼ Show 20 Lines | if (numMessages === 2) { | ||||
// attempt to create a sidebar at the same time, then both clients will | // attempt to create a sidebar at the same time, then both clients will | ||||
// attempt to set sidebarCreation here, but we only want to suppress | // attempt to set sidebarCreation here, but we only want to suppress | ||||
// notifs for the client that won the race. | // notifs for the client that won the race. | ||||
messageData = { ...messageData, sidebarCreation }; | messageData = { ...messageData, sidebarCreation }; | ||||
} | } | ||||
} | } | ||||
const rawMessageInfos = await createMessages(viewer, [messageData]); | const rawMessageInfos = await createMessages(viewer, [messageData]); | ||||
return { newMessageInfo: rawMessageInfos[0] }; | const response = { newMessageInfo: rawMessageInfos[0] }; | ||||
return validateOutput(viewer, sendMessageResponseValidator, response); | |||||
} | } | ||||
const fetchMessageInfosRequestInputValidator = tShape({ | const fetchMessageInfosRequestInputValidator = tShape({ | ||||
cursors: t.dict(t.String, t.maybe(t.String)), | cursors: t.dict(t.String, t.maybe(t.String)), | ||||
numberPerThread: t.maybe(t.Number), | numberPerThread: t.maybe(t.Number), | ||||
}); | }); | ||||
export const fetchMessageInfosResponseValidator: TInterface<FetchMessageInfosResponse> = | export const fetchMessageInfosResponseValidator: TInterface<FetchMessageInfosResponse> = | ||||
Show All 9 Lines | |||||
): Promise<FetchMessageInfosResponse> { | ): Promise<FetchMessageInfosResponse> { | ||||
const request: FetchMessageInfosRequest = input; | const request: FetchMessageInfosRequest = input; | ||||
await validateInput(viewer, fetchMessageInfosRequestInputValidator, request); | await validateInput(viewer, fetchMessageInfosRequestInputValidator, request); | ||||
const response = await fetchMessageInfos( | const response = await fetchMessageInfos( | ||||
viewer, | viewer, | ||||
{ threadCursors: request.cursors }, | { threadCursors: request.cursors }, | ||||
request.numberPerThread ? request.numberPerThread : defaultNumberPerThread, | request.numberPerThread ? request.numberPerThread : defaultNumberPerThread, | ||||
); | ); | ||||
return { ...response, userInfos: {} }; | return validateOutput(viewer, fetchMessageInfosResponseValidator, { | ||||
...response, | |||||
userInfos: {}, | |||||
}); | |||||
} | } | ||||
const sendMultimediaMessageRequestInputValidator = t.union([ | const sendMultimediaMessageRequestInputValidator = t.union([ | ||||
// This option is only used for messageTypes.IMAGES | // This option is only used for messageTypes.IMAGES | ||||
tShape({ | tShape({ | ||||
threadID: t.String, | threadID: t.String, | ||||
localID: t.String, | localID: t.String, | ||||
sidebarCreation: t.maybe(t.Boolean), | sidebarCreation: t.maybe(t.Boolean), | ||||
▲ Show 20 Lines • Show All 78 Lines • ▼ Show 20 Lines | if (request.mediaIDs) { | ||||
await assignMessageContainerToMedia( | await assignMessageContainerToMedia( | ||||
viewer, | viewer, | ||||
request.mediaMessageContents, | request.mediaMessageContents, | ||||
id, | id, | ||||
threadID, | threadID, | ||||
); | ); | ||||
} | } | ||||
return { newMessageInfo }; | const response = { newMessageInfo }; | ||||
return validateOutput(viewer, sendMessageResponseValidator, response); | |||||
} | } | ||||
const sendReactionMessageRequestInputValidator = tShape({ | const sendReactionMessageRequestInputValidator = tShape({ | ||||
threadID: t.String, | threadID: t.String, | ||||
localID: t.maybe(t.String), | localID: t.maybe(t.String), | ||||
targetMessageID: t.String, | targetMessageID: t.String, | ||||
reaction: tRegex(onlyOneEmojiRegex), | reaction: tRegex(onlyOneEmojiRegex), | ||||
action: t.enums.of(['add_reaction', 'remove_reaction']), | action: t.enums.of(['add_reaction', 'remove_reaction']), | ||||
▲ Show 20 Lines • Show All 57 Lines • ▼ Show 20 Lines | let messageData: ReactionMessageData = { | ||||
action, | action, | ||||
}; | }; | ||||
if (localID) { | if (localID) { | ||||
messageData = { ...messageData, localID }; | messageData = { ...messageData, localID }; | ||||
} | } | ||||
const rawMessageInfos = await createMessages(viewer, [messageData]); | const rawMessageInfos = await createMessages(viewer, [messageData]); | ||||
return { newMessageInfo: rawMessageInfos[0] }; | const response = { newMessageInfo: rawMessageInfos[0] }; | ||||
return validateOutput(viewer, sendMessageResponseValidator, response); | |||||
} | } | ||||
const editMessageRequestInputValidator = tShape({ | const editMessageRequestInputValidator = tShape({ | ||||
targetMessageID: t.String, | targetMessageID: t.String, | ||||
text: t.String, | text: t.String, | ||||
}); | }); | ||||
export const sendEditMessageResponseValidator: TInterface<SendEditMessageResponse> = | export const sendEditMessageResponseValidator: TInterface<SendEditMessageResponse> = | ||||
▲ Show 20 Lines • Show All 73 Lines • ▼ Show 20 Lines | if (sidebarThreadValue && sidebarThreadValue.id) { | ||||
text: text, | text: text, | ||||
}; | }; | ||||
messagesData.push(messageData); | messagesData.push(messageData); | ||||
} | } | ||||
} | } | ||||
const newMessageInfos = await createMessages(viewer, messagesData); | const newMessageInfos = await createMessages(viewer, messagesData); | ||||
return { newMessageInfos }; | const response = { newMessageInfos }; | ||||
return validateOutput(viewer, sendEditMessageResponseValidator, response); | |||||
} | } | ||||
const fetchPinnedMessagesResponderInputValidator = tShape({ | const fetchPinnedMessagesResponderInputValidator = tShape({ | ||||
threadID: t.String, | threadID: t.String, | ||||
}); | }); | ||||
export const fetchPinnedMessagesResultValidator: TInterface<FetchPinnedMessagesResult> = | export const fetchPinnedMessagesResultValidator: TInterface<FetchPinnedMessagesResult> = | ||||
tShape<FetchPinnedMessagesResult>({ | tShape<FetchPinnedMessagesResult>({ | ||||
pinnedMessages: t.list(rawMessageInfoValidator), | pinnedMessages: t.list(rawMessageInfoValidator), | ||||
}); | }); | ||||
async function fetchPinnedMessagesResponder( | async function fetchPinnedMessagesResponder( | ||||
viewer: Viewer, | viewer: Viewer, | ||||
input: any, | input: any, | ||||
): Promise<FetchPinnedMessagesResult> { | ): Promise<FetchPinnedMessagesResult> { | ||||
const request: FetchPinnedMessagesRequest = input; | const request: FetchPinnedMessagesRequest = input; | ||||
await validateInput( | await validateInput( | ||||
viewer, | viewer, | ||||
fetchPinnedMessagesResponderInputValidator, | fetchPinnedMessagesResponderInputValidator, | ||||
input, | input, | ||||
); | ); | ||||
return await fetchPinnedMessageInfos(viewer, request); | const response = await fetchPinnedMessageInfos(viewer, request); | ||||
return validateOutput(viewer, fetchPinnedMessagesResultValidator, response); | |||||
} | } | ||||
export { | export { | ||||
textMessageCreationResponder, | textMessageCreationResponder, | ||||
messageFetchResponder, | messageFetchResponder, | ||||
multimediaMessageCreationResponder, | multimediaMessageCreationResponder, | ||||
reactionMessageCreationResponder, | reactionMessageCreationResponder, | ||||
editMessageCreationResponder, | editMessageCreationResponder, | ||||
fetchPinnedMessagesResponder, | fetchPinnedMessagesResponder, | ||||
}; | }; |