#javascript #python #amazon-web-services #websocket #aws-lambda
#javascript #python #amazon-веб-сервисы #websocket #aws-lambda
Вопрос:
Следуя этому руководству, я работаю над AWS Websocket с клиентами, которые могут подключаться и отключаться. Я связал добавление и удаление их идентификатора с dynamodb.
Проблема: я не могу заставить их общаться друг с другом. Я использую пользовательский маршрут, заставляя клиента говорить {"action" : "onMessage" , "message" : "Hello everyone"}
, но я никогда не вижу журналы вызовов.
Лямбда-файлы пользовательского маршрута onMessage
:
index.js
const AWS = require('aws-sdk');
const ddb = new AWS.DynamoDB.DocumentClient();
require('./patch.js');
let send = undefined;
function init(event) {
console.log(event)
const apigwManagementApi = new AWS.ApiGatewayManagementApi({
apiVersion: '2018-11-29', endpoint: event.requestContext.domainName '/' event.requestContext.stage
});
send = async (connectionId, data) => {
await apigwManagementApi.postToConnection({
ConnectionId: connectionId, Data: `Echo: ${data}`
}).promise();
}}
function getConnections(){
return ddb.scan({
TableName: 'Chat',
}).promise();
}
exports.handler = (event, context, callback) => {
init(event);
let message = JSON.parse(event.body).message
getConnections().then((data) => {
console.log(data.Items);
data.Items.forEach(function(connection) {
console.log("Connection " connection.connectionid)
send(connection.connectionid, message);
});
});
return {}
};
patch.js
require('aws-sdk/lib/node_loader');
var AWS = require('aws-sdk/lib/core');
var Service = AWS.Service;
var apiLoader = AWS.apiLoader;
apiLoader.services['apigatewaymanagementapi'] = {};
AWS.ApiGatewayManagementApi = Service.defineService('apigatewaymanagementapi', ['2018-11-29']);
Object.defineProperty(
apiLoader.services['apigatewaymanagementapi'], '2018-11-29',
{
get: function get() {
var model = {
"metadata": {
"apiVersion": "2018-11-29",
"endpointPrefix": "execute-api",
"signingName": "execute-api",
"serviceFullName": "AmazonApiGatewayManagementApi",
"serviceId": "ApiGatewayManagementApi", "protocol": "rest-json",
"jsonVersion": "1.1", "uid": "apigatewaymanagementapi-2018-11-29",
"signatureVersion": "v4"
},
"operations": {
"PostToConnection": {
"http": {
"requestUri": "/@connections/{connectionId}",
"responseCode": 200
},
"input": {
"type": "structure",
"members": {
"Data": {
"type": "blob"
},
"ConnectionId": {
"location": "uri",
"locationName": "connectionId"
}
},
"required": ["ConnectionId", "Data"],
"payload": "Data"
}
}
},
"shapes": {}
}
model.paginators = {"pagination": {}}
return model;
},
enumerable: true,
configurable: true
}
);
module.exports = AWS.ApiGatewayManagementApi;
Я не очень хорошо разбираюсь в JS, поэтому ищу эквивалент python, чтобы упростить его отладку. Если вы знаете проблему и имеете объяснение, я бы с удовольствием продолжил в JS (но сейчас я застрял). 🙂