public APIGatewayV2WebSocketResponse handleRequest()

in src/main/java/com/amazonaws/kvstranscribestreaming/lambda/TranscriptionWebSocketIntegrationLambda.java [54:155]


    public APIGatewayV2WebSocketResponse handleRequest(APIGatewayV2WebSocketEvent requestEvent, Context context) {
        try {
            logger.info(LAMBDA_KEY_PREFIX + " received request : " + objectMapper.writeValueAsString(requestEvent));
        } catch (JsonProcessingException e) {
            logger.error(LAMBDA_KEY_PREFIX + " Error happened where serializing the event", e);
        }
        logger.info(LAMBDA_KEY_PREFIX + " received context: " + context.toString());

        APIGatewayV2WebSocketResponse responseEvent = new APIGatewayV2WebSocketResponse();
        try {
            String routeKey = requestEvent.getRequestContext().getRouteKey(), connectionId = requestEvent.getRequestContext().getConnectionId();

            if (!routeKey.equals(DISCONNECT_ROUTE_KEY) && !routeKey.equals(TRANSCRIBE_ROUTE_KEY)) {
                generateResponse(responseEvent, 200, "Success");
                return responseEvent;
            }

            Table mappingTable = dynamoDB.getTable(WEB_SOCKET_MAPPING_TABLE);
            Table connectionTable = dynamoDB.getTable(WEB_SOCKET_CONNECTION_TABLE);

            // Release all resources when client calls disconnect.
            if (routeKey.equals(DISCONNECT_ROUTE_KEY)) {
                GetItemSpec spec = new GetItemSpec()
                        .withPrimaryKey(WebsocketConnectionDDBConstants.CONNECTION_ID, connectionId)
                        .withConsistentRead(true);

                Item item = dynamoDB.getTable(WEB_SOCKET_CONNECTION_TABLE).getItem(spec);
                DeleteItemSpec deleteNumberSpec;

                if(item.hasAttribute(WebsocketConnectionDDBConstants.ASSOCIATED_NUMBERS)) {
                    Set<String> numbers = (Set) item.get(WebsocketConnectionDDBConstants.ASSOCIATED_NUMBERS);

                    // Remove number mappings from the mapping table.
                    for(String n : numbers) {
                        deleteNumberSpec = new DeleteItemSpec().withPrimaryKey(WebSocketMappingDDBConstants.NUMBER, n);
                        mappingTable.deleteItem(deleteNumberSpec);
                    }
                }

                // Remove the connection from the connection table.
                deleteNumberSpec = new DeleteItemSpec().withPrimaryKey(WebsocketConnectionDDBConstants.CONNECTION_ID, connectionId);
                connectionTable.deleteItem(deleteNumberSpec);

                generateResponse(responseEvent, 200, "Web socket connection " + connectionId + " with route key " + routeKey + " has been disconnected");
            }

            // Put DDB resources when client is ready to receive transcription
            if (routeKey.equals(TRANSCRIBE_ROUTE_KEY)) {
                if(requestEvent.getBody() == null) {
                    generateResponse(responseEvent, 400, "Must specify body");
                    return responseEvent;
                }

                Map<String, String> eventBodyMap = objectMapper.readValue(requestEvent.getBody(), Map.class);
                if(eventBodyMap.get("from") == null && eventBodyMap.get("to") == null) {
                    generateResponse(responseEvent, 400, "Must specify from or to numbers");
                    return responseEvent;
                }

                String fromNumber = eventBodyMap.get("from"), toNumber = eventBodyMap.get("to");
                Item numberItem, connectionItem;
                Set<String> numbers = new HashSet<>();

                if(fromNumber != null) {
                    numbers.add(fromNumber);

                    numberItem = new Item()
                            .withPrimaryKey(WebSocketMappingDDBConstants.NUMBER, fromNumber)
                            .withString(WebSocketMappingDDBConstants.CONNECTION_ID, connectionId)
                            .withString(WebSocketMappingDDBConstants.UPDATE_TIME, Instant.now().toString());

                    mappingTable.putItem(numberItem);
                }

                if(toNumber != null) {
                    numbers.add(toNumber);

                    numberItem = new Item()
                            .withPrimaryKey(WebSocketMappingDDBConstants.NUMBER, toNumber)
                            .withString(WebSocketMappingDDBConstants.CONNECTION_ID, connectionId)
                            .withString(WebSocketMappingDDBConstants.UPDATE_TIME, Instant.now().toString());

                    mappingTable.putItem(numberItem);
                }

                connectionItem = new Item()
                        .withPrimaryKey(WebsocketConnectionDDBConstants.CONNECTION_ID, connectionId)
                        .withStringSet(WebsocketConnectionDDBConstants.ASSOCIATED_NUMBERS, numbers);
                connectionTable.putItem(connectionItem);

                generateResponse(responseEvent, 200,
                        "Web socket connection " + connectionId + " with route key " + routeKey + " associated with numbers " + numbers.toString() + " has been established");
            }

        } catch (Exception e) {
            logger.error("{} transcription integration failed. Reason: {}", LAMBDA_KEY_PREFIX, e.getMessage(), e);
            generateResponse(responseEvent, 500, "Must specify from and to numbers");
        }

        logger.info("{} response event {}", LAMBDA_KEY_PREFIX, responseEvent);
        return responseEvent;
    }