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 }