/** Registers the session. */ private CompletableFuture<Void> register() { context.checkThread(); CompletableFuture<Void> future = new CompletableFuture<>(); RegisterRequest request = RegisterRequest.builder().withClient(clientId).build(); this.<RegisterRequest, RegisterResponse>request(request, new CompletableFuture<>(), false, true) .whenComplete( (response, error) -> { if (error == null) { if (response.status() == Response.Status.OK) { setMembers(response.members()); setTimeout(response.timeout()); onOpen(response.session()); setupConnection(connection) .whenComplete((setupResult, setupError) -> future.complete(null)); resetMembers() .keepAlive( Duration.ofMillis(Math.round(response.timeout() * KEEP_ALIVE_RATIO))); } else { future.completeExceptionally(response.error().createException()); } } else { future.completeExceptionally(error); } }); return future; }