1 /*
2  * MsgTrans - Message Transport Framework for DLang. Based on TCP, WebSocket, UDP transmission protocol.
3  *
4  * Copyright (C) 2019 HuntLabs
5  *
6  * Website: https://www.msgtrans.org
7  *
8  * Licensed under the Apache-2.0 License.
9  *
10  */
11 
12 module msgtrans.MessageTransportServer;
13 
14 import msgtrans.channel.ServerChannel;
15 import msgtrans.MessageTransport;
16 import msgtrans.SessionManager;
17 import msgtrans.DefaultSessionManager;
18 import msgtrans.TransportContext;
19 import msgtrans.executor;
20 import msgtrans.ee2e.crypto;
21 
22 import hunt.logging.ConsoleLogger;
23 
24 __gshared MessageTransportServer[string] messageTransportServers;
25 
26 /**
27  *
28  */
29 class MessageTransportServer : MessageTransport {
30     private string _name;
31     private AcceptHandler _acceptHandler;
32     private CloseHandler  _closeHandler;
33     private ExecutorInfo[uint] _executors;
34     __gshared bool isEE2E ;
35     private ServerChannel[string] _transportChannel;
36     private SessionManager _sessionManager;
37 
38     __gshared ownkey_s   s_server_key;
39     //static peerkey_s     s_client_key;
40 
41     shared static this()
42     {
43         s_server_key = new ownkey_s;
44         isEE2E = false;
45     }
46 
47     this(string name, bool ee2e = false) {
48         super(SERVER_NAME_PREFIX ~ name);
49         if(ee2e)
50         {
51             generate_ecdh_keys(s_server_key.ec_pub_key, s_server_key.ec_priv_key);
52             rand_salt(s_server_key.salt,CRYPTO_SALT_LEN);
53             isEE2E = true;
54         }
55     }
56 
57     MessageTransportServer addChannel(ServerChannel channel) {
58         string name = channel.name();
59         if (name in _transportChannel) {
60             string msg = "Server exists already: " ~ name;
61             warning(msg);
62             throw new Exception(msg);
63         }
64 
65         version (HUNT_DEBUG) {
66             tracef("Registing channel: %s, type: %s", name, typeid(cast(Object) channel));
67         }
68 
69         _transportChannel[name] = channel;
70         return this;
71     }
72 
73     void acceptor(AcceptHandler handler) {
74         _acceptHandler = handler;
75     }
76 
77     void closer(CloseHandler handler) {
78         _closeHandler = handler;
79     }
80 
81     MessageTransportServer sessionManager(SessionManager manager) {
82         _sessionManager = manager;
83 
84         return this;
85     }
86 
87     override SessionManager sessionManager() {
88         if (_sessionManager is null) {
89             _sessionManager = new DefaultSessionManager();
90         }
91 
92         return _sessionManager;
93     }
94 
95 
96     void start() {
97         foreach (ServerChannel t; _transportChannel) {
98             t.set(this);
99             t.onAccept(_acceptHandler);
100             t.onClose(_closeHandler);
101             t.start();
102         }
103     }
104 }