Отправка данных из лямбда-выражения в AWS Websocket клиенту на JS

#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 (но сейчас я застрял). 🙂