/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.ide.websocket; import org.eclipse.che.ide.websocket.events.ConnectionClosedHandler; import org.eclipse.che.ide.websocket.events.ConnectionErrorHandler; import org.eclipse.che.ide.websocket.events.ConnectionOpenedHandler; import org.eclipse.che.ide.websocket.events.MessageReceivedHandler; import com.google.gwt.core.client.JavaScriptObject; /** * Class that wraps native JavaScript WebSocket object. * * @author Artem Zatsarynnyi */ public class WebSocket extends JavaScriptObject { protected WebSocket() { } /** * Creates a new WebSocket instance. * WebSocket attempt to connect to their URL immediately upon creation. * * @param url * WebSocket server URL * @return the created {@link WebSocket} object */ public static native WebSocket create(String url) /*-{ return new WebSocket(url); }-*/; /** * Creates a WebSocket object. * WebSocket attempt to connect to their URL immediately upon creation. * * @param url * WebSocket server URL * @param protocol * subprotocol name * @return the created {@link WebSocket} object */ public static native WebSocket create(String url, String protocol) /*-{ return new WebSocket(url, protocol); }-*/; /** * Closes the WebSocket connection. If the connection state * is already {@link MessageBus.ReadyState#CLOSED}, this method does nothing. */ public final native void close() /*-{ this.close(); }-*/; /** * Method can be used to detect WebSocket support in the current browser. * * @return <code>true</code> if WebSockets are supported; * <code>false</code> if they are not. */ public static native boolean isSupported() /*-{ return !!window.WebSocket; }-*/; /** * Returns the state of the WebSocket connection. * * @return ready-state value */ public final native short getReadyState() /*-{ return this.readyState; }-*/; /** * Represents the number of bytes of UTF-8 text * that have been queued using send() method. * * @return the number of queued bytes */ public final native int getBufferedAmount() /*-{ return this.bufferedAmount; }-*/; /** * Transmits data to the server over the WebSocket connection. * * @param data * the data to be sent to the server */ public final native void send(String data) /*-{ this.send(data); }-*/; /** * Sets the {@link org.eclipse.che.ide.websocket.events.ConnectionOpenedHandler} to be notified when the WebSocket connection established. * * @param handler * WebSocket open handler */ public final native void setOnOpenHandler(ConnectionOpenedHandler handler) /*-{ this.onopen = function () { handler.@org.eclipse.che.ide.websocket.events.ConnectionOpenedHandler::onOpen()(); }; }-*/; /** * Sets the {@link ConnectionClosedHandler} to be notified when the WebSocket close. * * @param handler * WebSocket close handler */ public final native void setOnCloseHandler(ConnectionClosedHandler handler) /*-{ this.onclose = function (event) { var webSocketClosedEventInstance = @org.eclipse.che.ide.websocket.events.WebSocketClosedEvent::new(ILjava/lang/String;Z)(event .code, event.reason, event.wasClean); handler.@org.eclipse.che.ide.websocket.events.ConnectionClosedHandler::onClose(Lorg/eclipse/che/ide/websocket/events/WebSocketClosedEvent;)(webSocketClosedEventInstance); }; }-*/; /** * Sets the {@link org.eclipse.che.ide.websocket.events.ConnectionErrorHandler} to be notified when there is any error in communication. * * @param handler * WebSocket error handler */ public final native void setOnErrorHandler(ConnectionErrorHandler handler) /*-{ this.onerror = function (event) { handler.@org.eclipse.che.ide.websocket.events.ConnectionErrorHandler::onError()(); }; }-*/; /** * Sets the {@link org.eclipse.che.ide.websocket.events.MessageReceivedHandler} to be notified when * client receives data from the WebSocket server. * * @param handler * WebSocket message handler */ public final native void setOnMessageHandler(MessageReceivedHandler handler) /*-{ this.onmessage = function (event) { if (event.data instanceof Blob) { var reader = new FileReader(); reader.onloadend = function() { var e = @org.eclipse.che.ide.websocket.events.MessageReceivedEvent::new(Ljava/lang/String;)(reader.result); handler.@org.eclipse.che.ide.websocket.events.MessageReceivedHandler::onMessageReceived(Lorg/eclipse/che/ide/websocket/events/MessageReceivedEvent;)(e); }; //reader.readAsBinaryString(event.data); reader.readAsText(event.data); } else { var webSocketMessageEventInstance = @org.eclipse.che.ide.websocket.events.MessageReceivedEvent::new(Ljava/lang/String;)(event.data); handler.@org.eclipse.che.ide.websocket.events.MessageReceivedHandler::onMessageReceived(Lorg/eclipse/che/ide/websocket/events/MessageReceivedEvent;)(webSocketMessageEventInstance); } }; }-*/; }