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 }