docs: @Local
      public CompletableFuture<Integer> broadcastMessage(final WebSocketRange wsrange, final Convert convert, final Object message0, final boolean last) {
          if (message0 instanceof CompletableFuture) return ((CompletableFuture) message0).thenApply(msg -> broadcastMessage(wsrange, convert, msg, last));
          final Object message = (convert == null || message0 instanceof WebSocketPacket) ? message0 : ((convert instanceof TextConvert) ? new WebSocketPacket(((TextConvert) convert).convertTo(message0), last) : new WebSocketPacket(((BinaryConvert) convert).convertTo(message0), last));
          if (this.localEngine != null && this.sncpNodeAddresses == null) { //本地模式且没有分布式
              return this.localEngine.broadcastLocalMessage(wsrange, message, last);
          }
          final Object remoteMessage = formatRemoteMessage(message);
          CompletableFuture<Integer> localFuture = this.localEngine == null ? null : this.localEngine.broadcastLocalMessage(wsrange, message, last);
          tryAcquireSemaphore();
          CompletableFuture<Collection<InetSocketAddress>> addrsFuture = sncpNodeAddresses.getCollectionAsync(SOURCE_SNCP_ADDRS_KEY, InetSocketAddress.class);
          if (semaphore != null) addrsFuture.whenComplete((r, e) -> releaseSemaphore());
          CompletableFuture<Integer> remoteFuture = addrsFuture.thenCompose((Collection<InetSocketAddress> addrs) -> {
              if (logger.isLoggable(Level.FINEST)) logger.finest("websocket broadcast message (" + remoteMessage + ") on " + addrs);
              if (addrs == null || addrs.isEmpty()) return CompletableFuture.completedFuture(0);
              CompletableFuture<Integer> future = null;
              for (InetSocketAddress addr : addrs) {
                  if (addr == null || addr.equals(localSncpAddress)) continue;
                  future = future == null ? remoteNode.broadcastMessage(addr, wsrange, remoteMessage, last)
                      : future.thenCombine(remoteNode.broadcastMessage(addr, wsrange, remoteMessage, last), (a, b) -> a | b);
              }
              return future == null ? CompletableFuture.completedFuture(0) : future;
          });
          return localFuture == null ? remoteFuture : localFuture.thenCombine(remoteFuture, (a, b) -> a | b);
      }