@Override
  @SuppressWarnings("unchecked")
  public void handleWebSocketReceive(String connectionId, Object data) {
    Map<String, Object> message = (Map<String, Object>) data;

    String command = (String) message.get(MasterApiMessage.MASTER_API_MESSAGE_ENVELOPE_TYPE);
    Map<String, Object> commandArgs =
        (Map<String, Object>) message.get(MasterApiMessage.MASTER_API_MESSAGE_ENVELOPE_DATA);

    String requestId =
        (String) message.get(MasterApiMessage.MASTER_API_MESSAGE_ENVELOPE_REQUEST_ID);

    try {
      if (command.startsWith(MasterApiMessage.MASTER_API_COMMAND_EXTENSION_PREFIX)) {
        String extensionName =
            command.substring(MasterApiMessage.MASTER_API_COMMAND_EXTENSION_PREFIX.length());
        Map<String, Object> responseMessage =
            extensionManager.evaluateApiExtension(extensionName, commandArgs);
        responseMessage.put("command", command);
        responseMessage.put(
            MasterApiMessage.MASTER_API_MESSAGE_ENVELOPE_TYPE,
            MasterApiMessage.MASTER_API_MESSAGE_TYPE_COMMAND_RESPONSE);
        potentiallyAddRequestId(responseMessage, requestId);

        webSocketFactory.sendJson(connectionId, responseMessage);
      } else {
        MasterApiWebSocketCommandHandler handler = commandHandlers.get(command);
        if (handler != null) {
          Map<String, Object> responseMessage = handler.execute(commandArgs);
          responseMessage.put(
              MasterApiMessage.MASTER_API_MESSAGE_ENVELOPE_TYPE,
              MasterApiMessage.MASTER_API_MESSAGE_TYPE_COMMAND_RESPONSE);
          potentiallyAddRequestId(responseMessage, requestId);
          webSocketFactory.sendJson(connectionId, responseMessage);
        } else {
          spaceEnvironment
              .getLog()
              .error(
                  String.format("Master API websocket connection got unknown command %s", command));
        }
      }
    } catch (Exception e) {
      spaceEnvironment
          .getLog()
          .error(
              String.format("Error while performing Master API websocket command %s", command), e);
    }
  }
 /**
  * Register a command handler with the manager.
  *
  * @param handler the command handler
  */
 private void registerMasterApiHandler(MasterApiWebSocketCommandHandler handler) {
   commandHandlers.put(handler.getCommandName(), handler);
 }