somod-chat-service
Version:
Serverless Chat Service from SOMOD
52 lines (51 loc) • 2.1 kB
JavaScript
import { RouteBuilder } from "somod-websocket-extension";
import { putMessage, validateIncomingMessage } from "../../lib/message";
import { v1 as v1uuid } from "uuid";
import { handleSessionToken } from "../../lib/sessionUtil";
import { getUserIdFromEvent } from "../../lib/getUserIdFromEvent";
const builder = new RouteBuilder();
builder.add("$default", async (message, event) => {
const userId = getUserIdFromEvent(event);
const messageValidationError = await validateIncomingMessage(message.body, userId);
if (messageValidationError) {
return messageValidationError;
}
const sessionIdResult = await handleSessionToken(userId, message.body.threadId, message.body.type, message.body.action, message.body.sessionToken);
if (sessionIdResult.error) {
return {
statusCode: 400,
headers: { "Content-Type": "application/json; charset=utf-8" },
body: JSON.stringify({
message: sessionIdResult.error,
threadId: message.body.threadId,
sessionRequiredTill: sessionIdResult.sessionRequiredTill
})
};
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const { wsMsgId, sessionToken, ...msg } = message.body;
const actions = ["sessionStart", "sessionExtend", "sessionEnd"];
const messageResult = await putMessage(process.env.MESSAGE_BOX_TABLE_NAME + "", userId, {
...msg,
sessionId: sessionIdResult.sessionId,
from: userId,
id: v1uuid().split("-").join(""),
sentAt: Date.now(),
...(actions.includes(message.body.action)
? { sessionToken: sessionToken }
: {})
});
return {
statusCode: 200,
headers: { "Content-Type": "application/json; charset=utf-8" },
body: JSON.stringify({
wsMsgId,
type: "ack",
id: messageResult.id,
seqNo: messageResult.seqNo,
sentAt: messageResult.sentAt,
from: messageResult.from
})
};
});
export default builder.getHandler();