Open
Description
Resources found:
- https://docs.aws.amazon.com/apigateway/latest/developerguide/websocket-api-chat-app.html
- https://docs.aws.amazon.com/apigateway/latest/developerguide/samples/ws-chat-app-starter.zip
connect handler
const { DynamoDBClient } = require("@aws-sdk/client-dynamodb");
const { DynamoDBDocumentClient, PutCommand } = require("@aws-sdk/lib-dynamodb");
exports.handler = async function (event) {
const client = new DynamoDBClient({});
const docClient = DynamoDBDocumentClient.from(client);
const command = new PutCommand({
TableName: process.env.TABLE_NAME,
Item: {
connectionId: event.requestContext.connectionId,
},
});
try {
await docClient.send(command);
} catch (err) {
console.log(err);
return {
statusCode: 500,
};
}
return {
statusCode: 200,
};
};
disconnect handler
const { DynamoDBClient } = require("@aws-sdk/client-dynamodb");
const {
DynamoDBDocumentClient,
DeleteCommand,
} = require("@aws-sdk/lib-dynamodb");
exports.handler = async function (event) {
const client = new DynamoDBClient({});
const docClient = DynamoDBDocumentClient.from(client);
const command = new DeleteCommand({
TableName: process.env.TABLE_NAME,
Key: {
connectionId: event.requestContext.connectionId,
},
});
try {
await docClient.send(command);
} catch (err) {
console.log(err);
return {
statusCode: 500,
};
}
return {
statusCode: 200,
};
};
send message handler
const { DynamoDBClient } = require("@aws-sdk/client-dynamodb");
const {
DynamoDBDocumentClient,
ScanCommand,
} = require("@aws-sdk/lib-dynamodb");
const {
ApiGatewayManagementApiClient,
PostToConnectionCommand,
} = require("@aws-sdk/client-apigatewaymanagementapi");
exports.handler = async function (event) {
const client = new DynamoDBClient({});
const docClient = DynamoDBDocumentClient.from(client);
const ddbcommand = new ScanCommand({
TableName: process.env.TABLE_NAME,
});
let connections;
try {
connections = await docClient.send(ddbcommand);
} catch (err) {
console.log(err);
return {
statusCode: 500,
};
}
const callbackAPI = new ApiGatewayManagementApiClient({
apiVersion: "2018-11-29",
endpoint:
"https://" +
event.requestContext.domainName +
"/" +
event.requestContext.stage,
});
const message = JSON.parse(event.body).message;
const sendMessages = connections.Items.map(async ({ connectionId }) => {
if (connectionId !== event.requestContext.connectionId) {
try {
await callbackAPI.send(
new PostToConnectionCommand({
ConnectionId: connectionId,
Data: message,
})
);
} catch (e) {
console.log(e);
}
}
});
try {
await Promise.all(sendMessages);
} catch (e) {
console.log(e);
return {
statusCode: 500,
};
}
return { statusCode: 200 };
};
default handler
const {
ApiGatewayManagementApiClient,
PostToConnectionCommand,
GetConnectionCommand,
} = require("@aws-sdk/client-apigatewaymanagementapi");
exports.handler = async function (event) {
let connectionInfo;
let connectionId = event.requestContext.connectionId;
const callbackAPI = new ApiGatewayManagementApiClient({
apiVersion: "2018-11-29",
endpoint:
"https://" +
event.requestContext.domainName +
"/" +
event.requestContext.stage,
});
try {
connectionInfo = await callbackAPI.send(
new GetConnectionCommand({
ConnectionId: event.requestContext.connectionId,
})
);
} catch (e) {
console.log(e);
}
connectionInfo.connectionID = connectionId;
await callbackAPI.send(
new PostToConnectionCommand({
ConnectionId: event.requestContext.connectionId,
Data:
"Use the sendmessage route to send a message. Your info:" +
JSON.stringify(connectionInfo),
})
);
return {
statusCode: 200,
};
};
Activity