public CompletableFuture<Pair<Long, DeviceCommand>> sendSubscribeToUpdateRequest(final long commandId, final DeviceVO device, BiConsumer<DeviceCommand, Long> callback) {
CompletableFuture<Pair<Long, DeviceCommand>> future = new CompletableFuture<>();
final Long subscriptionId = idGenerator.generate();
Consumer<Response> responseConsumer = response -> {
Action resAction = response.getBody().getAction();
if (resAction.equals(Action.COMMAND_UPDATE_SUBSCRIBE_RESPONSE)) {
future.complete(Pair.of(response.getBody().cast(CommandUpdateSubscribeResponse.class).getSubscriptionId(), response.getBody().cast(CommandUpdateSubscribeResponse.class).getDeviceCommand()));
} else if (resAction.equals(COMMAND_UPDATE_EVENT)) {
callback.accept(response.getBody().cast(CommandUpdateEvent.class).getDeviceCommand(), subscriptionId);
} else {
logger.warn("Unknown action received from backend {}", resAction);
}
};
Filter filter = new Filter(device.getNetworkId(), device.getDeviceTypeId(), Long.toString(commandId), COMMAND_UPDATE_EVENT.name(), null);
rpcClient.call(Request.newBuilder()
.withBody(new CommandUpdateSubscribeRequest(commandId, device.getDeviceId(), subscriptionId, filter))
.build(), responseConsumer);
return future;
}