1 module hunt.imf.io.server;
2 
3 import hunt.net;
4 
5 import hunt.imf.core.dispatcher;
6 import hunt.imf.protocol.parser;
7 import hunt.imf.protocol.packet;
8 import hunt.imf.io.context;
9 
10 
11 
12 class Server
13 {
14     this(Dispatcher dispatcher , string ns = "")
15     {
16         _namespace = ns;
17         _dispatcher = dispatcher;
18         _server = NetUtil.createNetServer!(ServerThreadMode.Single)();
19     }
20 
21     void listen(int port , string host = "127.0.0.1")
22     {
23         alias Server = hunt.net.Server.Server;
24         _server.listen(host , port , (Result!Server result){
25             if(result.failed())
26                 throw result.cause();
27 
28         });
29         _server.connectionHandler((NetSocket sock){
30             auto tcp = cast(AsynchronousTcpSession)sock;
31             auto context = new Context(_namespace , sock);
32             tcp.attachObject(context);
33             if(_open !is null){
34                 _open(context);
35             }
36             sock.closeHandler((){
37                 if(_close !is null)
38                     _close(context);
39             });
40             sock.handler(
41                 (in ubyte[] data){
42                     auto context = cast(Context)tcp.getAttachment();
43                     auto list = context.parser.consume(cast(byte[])data);
44                     foreach(p ; list)
45                         _dispatcher.dispatch(context , p);
46                 }
47             );
48         });
49     }
50 
51     void stop() {
52         _server.stop();
53     }
54 
55     void setOpenHandler(OpenHandler handler)
56     {
57         _open = handler;
58     }
59 
60     void setCloseHandler(CloseHandler handler){
61         _close = handler;
62     }
63 
64 
65 private:
66     string             _namespace;
67     Dispatcher         _dispatcher;
68     AbstractServer     _server;
69     OpenHandler        _open;
70     CloseHandler       _close;
71 }