!include once #1015699 // websocket sbool webSocketOnMessage_withIdler_verbose; static WebSocketClient webSocketOnMessage_withIdler(S url, final VF1 onMessage, double idleInterval) { ret webSocketOnMessage_withIdler(url, onMessage, idleInterval, null); } static WebSocketClient webSocketOnMessage_withIdler(S url, final VF1 onMessage, final double idleInterval, fS initialMessage, fO... args) ctex { WebSocketClient client = new WebSocketClient(new URI(url)) { java.util.Timer idler; public void onMessage(S s) { if (!licensed()) ret with close(); // program exit s = dropTrailingNullChars(s); pcallF(onMessage, s); } public void onOpen(ServerHandshake handshake) { if (webSocketOnMessage_withIdler_verbose) print("WebSocket connected."); if (nempty(initialMessage)) send(format(initialMessage, args)); idler = doEvery(idleInterval, r { if (webSocketOnMessage_withIdler_verbose) print("websocket idling"); send(""); }); } public void onClose(int code, S reason, bool remote) { cancelTimer(idler); idler = null; } public void onError(Exception e) { printStackTrace(e); } }; if (webSocketOnMessage_withIdler_verbose) print("Connecting to WebSocket: " + url); client.connect(); ret client; }