1 module neton.client.config.ConfigService; 2 3 import neton.protocol.neton; 4 import neton.protocol.neton; 5 import neton.protocol.netonrpc; 6 import neton.client.Listener; 7 import neton.client.WatchFactory; 8 import neton.client.Watcher; 9 import grpc; 10 import hunt.logging; 11 12 class ConfigService 13 { 14 private 15 { 16 ConfigClient _client; 17 Watcher _watcher; 18 } 19 20 public this(Channel chanel) 21 { 22 _client = new ConfigClient(chanel); 23 _watcher = WatchFactory.createConfigWatcher(chanel, "/config"); 24 } 25 26 public string getConfig(string config, long timeoutMs = 0) 27 { 28 logInfo("getConfig : ",config); 29 try 30 { 31 RangeRequest request = new RangeRequest(); 32 request.key = cast(ubyte[]) config; 33 // ubyte[] end = cast(ubyte[]) config.dup; 34 // end[$ - 1] += 1; 35 // request.rangeEnd = end; 36 assert(request.key.length != 0); 37 RangeResponse response = _client.Range(request); 38 if (response is null) 39 { 40 logError("response is null"); 41 return string.init; 42 } 43 string[] values; 44 foreach (v; response.kvs) 45 { 46 values ~= cast(string) v.value; 47 } 48 49 return values.length > 0 ? values[0] : string.init; 50 } 51 catch (Throwable e) 52 { 53 logError("ConfigService : ", e.msg); 54 return string.init; 55 } 56 } 57 58 public bool publishConfig(string config, string content) 59 { 60 logInfo("publishConfig : ",config); 61 62 try 63 { 64 PutRequest request = new PutRequest(); 65 request.key = cast(ubyte[]) config; 66 request.value = cast(ubyte[]) content; 67 request.lease = 0; 68 assert(request.key.length != 0); 69 PutResponse response = _client.Put(request); 70 if (response is null) 71 { 72 logError("response is null"); 73 return false; 74 } 75 return true; 76 } 77 catch (Throwable e) 78 { 79 logError("ConfigService : ", e.msg); 80 return false; 81 } 82 83 } 84 85 public bool removeConfig(string config) 86 { 87 logInfo("removeConfig : ",config); 88 try 89 { 90 DeleteRangeRequest request = new DeleteRangeRequest(); 91 request.key = cast(ubyte[]) config; 92 assert(request.key.length != 0); 93 94 DeleteRangeResponse response = _client.DeleteRange(request); 95 if (response is null) 96 { 97 logError("response is null"); 98 return false; 99 } 100 return true; 101 } 102 catch (Throwable e) 103 { 104 logError("ConfigService : ", e.msg); 105 return false; 106 } 107 } 108 109 public void addListener(string config, Listener listener) 110 { 111 synchronized (this) 112 { 113 _watcher.watch(config, listener); 114 } 115 } 116 117 public void removeListener(string config, Listener l) 118 { 119 synchronized (this) 120 { 121 _watcher.cancel(config, l); 122 } 123 } 124 }