somod-chat-service
Version:
Serverless Chat Service from SOMOD
40 lines (39 loc) • 1.61 kB
JavaScript
import { DynamoDBClient, QueryCommand } from "@aws-sdk/client-dynamodb";
import { convertToAttr, unmarshall } from "@aws-sdk/util-dynamodb";
import { ApiGatewayManagementApiClient, PostToConnectionCommand } from "@aws-sdk/client-apigatewaymanagementapi";
const dynamodb = new DynamoDBClient();
const apiGwManagementApi = new ApiGatewayManagementApiClient({
endpoint: process.env.CONNECTIONS_ENDPOINT
});
const notifyMessage = async (connectionId, message) => {
const data = JSON.stringify(message);
try {
await apiGwManagementApi.send(new PostToConnectionCommand({ ConnectionId: connectionId, Data: data }));
}
catch (e) {
// eslint-disable-next-line no-console
console.error(e);
}
};
const WebsocketNotifyMessage = async (event) => {
const userId = event.Records[0]?.Sns.MessageAttributes["userId"]?.Value;
const message = JSON.parse(event.Records[0]?.Sns.Message);
if (userId && message) {
const connections = await dynamodb.send(new QueryCommand({
TableName: process.env.CONNECTIONS_TABLE_NAME + "",
IndexName: "ByUserId",
KeyConditionExpression: "#userId = :userId",
ExpressionAttributeNames: {
"#userId": "userId"
},
ExpressionAttributeValues: {
":userId": convertToAttr(userId)
}
}));
await Promise.all((connections.Items || []).map(async (item) => {
const conn = unmarshall(item);
await notifyMessage(conn.id, message);
}));
}
};
export default WebsocketNotifyMessage;