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;
}