WEB-21991 New Node.js debug protocol incompatibilities
[idea/community.git] / platform / built-in-server / src / org / jetbrains / io / webSocket / MessageChannelHandler.java
1 package org.jetbrains.io.webSocket;
2
3 import io.netty.channel.Channel;
4 import io.netty.channel.ChannelHandler;
5 import io.netty.channel.ChannelHandlerContext;
6 import io.netty.handler.codec.http.websocketx.CloseWebSocketFrame;
7 import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
8 import org.jetbrains.annotations.NotNull;
9 import org.jetbrains.io.ChannelBufferToString;
10 import org.jetbrains.io.jsonRpc.Client;
11 import org.jetbrains.io.jsonRpc.ClientManager;
12 import org.jetbrains.io.jsonRpc.ClientManagerKt;
13 import org.jetbrains.io.jsonRpc.MessageServer;
14
15 @ChannelHandler.Sharable
16 final class MessageChannelHandler extends WebSocketProtocolHandler {
17   private final ClientManager clientManager;
18   private final MessageServer messageServer;
19
20   MessageChannelHandler(@NotNull ClientManager clientManager, @NotNull MessageServer messageServer) {
21     this.clientManager = clientManager;
22     this.messageServer = messageServer;
23   }
24
25   @Override
26   protected void closeFrameReceived(@NotNull Channel channel, @NotNull CloseWebSocketFrame message) {
27     WebSocketClient client = (WebSocketClient)channel.attr(ClientManagerKt.getCLIENT()).get();
28     if (client == null) {
29       super.closeFrameReceived(channel, message);
30     }
31     else {
32       try {
33         clientManager.disconnectClient(channel, client, false);
34       }
35       finally {
36         client.disconnect(message);
37       }
38     }
39   }
40
41   @Override
42   protected void textFrameReceived(@NotNull Channel channel, @NotNull TextWebSocketFrame message) {
43     WebSocketClient client = (WebSocketClient)channel.attr(ClientManagerKt.getCLIENT()).get();
44     CharSequence chars;
45     try {
46       chars = ChannelBufferToString.readChars(message.content());
47     }
48     catch (Throwable e) {
49       try {
50         message.release();
51       }
52       finally {
53         clientManager.getExceptionHandler().exceptionCaught(e);
54       }
55       return;
56     }
57
58     try {
59       messageServer.messageReceived(client, chars);
60     }
61     catch (Throwable e) {
62       clientManager.getExceptionHandler().exceptionCaught(e);
63     }
64   }
65
66   @Override
67   public void channelInactive(ChannelHandlerContext context) throws Exception {
68     Client client = context.channel().attr(ClientManagerKt.getCLIENT()).get();
69     // if null, so, has already been explicitly removed
70     if (client != null) {
71       clientManager.disconnectClient(context.channel(), client, false);
72     }
73   }
74
75   @Override
76   public void exceptionCaught(@NotNull ChannelHandlerContext context, @NotNull Throwable cause) {
77     try {
78       clientManager.getExceptionHandler().exceptionCaught(cause);
79     }
80     finally {
81       super.exceptionCaught(context, cause);
82     }
83   }
84 }