Search in sources :

Example 1 with WebSocketRequestSink

use of org.dartlang.vm.service.internal.WebSocketRequestSink in project intellij-plugins by JetBrains.

the class VmServiceBase method connect.

/**
   * Connect to the VM observatory service via the specified URI
   *
   * @return an API object for interacting with the VM service (not {@code null}).
   */
public static VmService connect(final String url) throws IOException {
    // Validate URL
    URI uri;
    try {
        uri = new URI(url);
    } catch (URISyntaxException e) {
        throw new IOException("Invalid URL: " + url, e);
    }
    String wsScheme = uri.getScheme();
    if (!"ws".equals(wsScheme) && !"wss".equals(wsScheme)) {
        throw new IOException("Unsupported URL scheme: " + wsScheme);
    }
    // Create web socket and observatory
    WebSocket webSocket;
    try {
        webSocket = new WebSocket(uri);
    } catch (WebSocketException e) {
        throw new IOException("Failed to create websocket: " + url, e);
    }
    final VmService vmService = new VmService();
    // Setup event handler for forwarding responses
    webSocket.setEventHandler(new WebSocketEventHandler() {

        @Override
        public void onClose() {
            Logging.getLogger().logInformation("VM connection closed: " + url);
            vmService.connectionClosed();
        }

        @Override
        public void onMessage(WebSocketMessage message) {
            Logging.getLogger().logInformation("VM message: " + message.getText());
            try {
                vmService.processResponse(message.getText());
            } catch (Exception e) {
                Logging.getLogger().logError(e.getMessage(), e);
            }
        }

        @Override
        public void onOpen() {
            vmService.connectionOpened();
            Logging.getLogger().logInformation("VM connection open: " + url);
        }

        @Override
        public void onPing() {
        }

        @Override
        public void onPong() {
        }
    });
    // Establish WebSocket Connection
    try {
        webSocket.connect();
    } catch (WebSocketException e) {
        throw new IOException("Failed to connect: " + url, e);
    }
    vmService.requestSink = new WebSocketRequestSink(webSocket);
    // Check protocol version
    final CountDownLatch latch = new CountDownLatch(1);
    final String[] errMsg = new String[1];
    vmService.getVersion(new VersionConsumer() {

        @Override
        public void onError(RPCError error) {
            String msg = "Failed to determine protocol version: " + error.getCode() + "\n  message: " + error.getMessage() + "\n  details: " + error.getDetails();
            Logging.getLogger().logInformation(msg);
            errMsg[0] = msg;
        }

        @Override
        public void received(Version response) {
            int major = response.getMajor();
            int minor = response.getMinor();
            if (major != VmService.versionMajor || minor != VmService.versionMinor) {
                if (major == 2 || major == 3) {
                    Logging.getLogger().logInformation("Difference in protocol version: client=" + VmService.versionMajor + "." + VmService.versionMinor + " vm=" + major + "." + minor);
                } else {
                    String msg = "Incompatible protocol version: client=" + VmService.versionMajor + "." + VmService.versionMinor + " vm=" + major + "." + minor;
                    Logging.getLogger().logError(msg);
                    errMsg[0] = msg;
                }
            }
            latch.countDown();
        }
    });
    try {
        if (!latch.await(5, TimeUnit.SECONDS)) {
            throw new IOException("Failed to determine protocol version");
        }
        if (errMsg[0] != null) {
            throw new IOException(errMsg[0]);
        }
    } catch (InterruptedException e) {
        throw new RuntimeException("Interrupted while waiting for response", e);
    }
    return vmService;
}
Also used : WebSocketException(de.roderick.weberknecht.WebSocketException) RPCError(org.dartlang.vm.service.element.RPCError) URISyntaxException(java.net.URISyntaxException) IOException(java.io.IOException) WebSocketRequestSink(org.dartlang.vm.service.internal.WebSocketRequestSink) CountDownLatch(java.util.concurrent.CountDownLatch) URI(java.net.URI) WebSocketEventHandler(de.roderick.weberknecht.WebSocketEventHandler) URISyntaxException(java.net.URISyntaxException) WebSocketException(de.roderick.weberknecht.WebSocketException) IOException(java.io.IOException) WebSocket(de.roderick.weberknecht.WebSocket) Version(org.dartlang.vm.service.element.Version) WebSocketMessage(de.roderick.weberknecht.WebSocketMessage)

Aggregations

WebSocket (de.roderick.weberknecht.WebSocket)1 WebSocketEventHandler (de.roderick.weberknecht.WebSocketEventHandler)1 WebSocketException (de.roderick.weberknecht.WebSocketException)1 WebSocketMessage (de.roderick.weberknecht.WebSocketMessage)1 IOException (java.io.IOException)1 URI (java.net.URI)1 URISyntaxException (java.net.URISyntaxException)1 CountDownLatch (java.util.concurrent.CountDownLatch)1 RPCError (org.dartlang.vm.service.element.RPCError)1 Version (org.dartlang.vm.service.element.Version)1 WebSocketRequestSink (org.dartlang.vm.service.internal.WebSocketRequestSink)1