Dreamine.Communication.Core 1.0.2
Dreamine.Communication.Core 통신 기능과 관련 API를 제공합니다.
로딩중...
검색중...
일치하는것 없음
RawJsonProtocolAdapter.cs
이 파일의 문서화 페이지로 가기
1using System.Text;
2using System.Text.Json;
3using Dreamine.Communication.Abstractions.Interfaces;
4using Dreamine.Communication.Abstractions.Models;
5
7
16public sealed class RawJsonProtocolAdapter : IMessageProtocolAdapter
17{
26 private readonly Encoding _encoding;
35 private readonly string _defaultRoute;
44 private readonly string _defaultName;
45
55 : this(new RawJsonProtocolOptions())
56 {
57 }
58
91 public RawJsonProtocolAdapter(string defaultRoute, string defaultName)
92 : this(new RawJsonProtocolOptions
93 {
94 DefaultRoute = defaultRoute,
95 DefaultName = defaultName
96 })
97 {
98 }
99
149 Encoding encoding,
150 string defaultRoute,
151 string defaultName)
152 : this(new RawJsonProtocolOptions
153 {
154 Encoding = encoding ?? throw new ArgumentNullException(nameof(encoding)),
155 DefaultRoute = defaultRoute,
156 DefaultName = defaultName
157 })
158 {
159 }
160
194 {
195 ArgumentNullException.ThrowIfNull(options);
196 ArgumentException.ThrowIfNullOrWhiteSpace(options.DefaultRoute);
197 ArgumentException.ThrowIfNullOrWhiteSpace(options.DefaultName);
198
199 _encoding = options.Encoding ?? throw new ArgumentNullException(nameof(options.Encoding));
200 _defaultRoute = options.DefaultRoute;
201 _defaultName = options.DefaultName;
203 }
204
213 public bool NormalizePayloadToUtf8 { get; }
214
255 public MessageEnvelope Decode(byte[] payload)
256 {
257 ArgumentNullException.ThrowIfNull(payload);
258
259 var json = _encoding.GetString(payload);
260 string route;
261 string name;
262
263 using (var document = JsonDocument.Parse(json))
264 {
265 var root = document.RootElement;
266
267 route = TryGetString(root, "route")
268 ?? TryGetString(root, "Route")
269 ?? TryGetString(root, "routingKey")
270 ?? TryGetString(root, "topic")
271 ?? TryGetString(root, "type")
272 ?? TryGetString(root, "cmd")
273 ?? _defaultRoute;
274
275 name = TryGetString(root, "name")
276 ?? TryGetString(root, "Name")
277 ?? TryGetString(root, "type")
278 ?? TryGetString(root, "cmd")
279 ?? _defaultName;
280 }
281
282 return new MessageEnvelope
283 {
284 Name = name,
285 Route = route,
286 Payload = NormalizePayloadToUtf8
287 ? Encoding.UTF8.GetBytes(json)
288 : _encoding.GetBytes(json),
289 Headers = new Dictionary<string, string>
290 {
291 ["ContentType"] = "application/json",
292 ["Protocol"] = "RawJson",
293 ["ExternalEncoding"] = _encoding.WebName
294 }
295 };
296 }
297
330 public byte[] Encode(MessageEnvelope message)
331 {
332 ArgumentNullException.ThrowIfNull(message);
333
334 if (message.Payload.Length > 0)
335 {
336 var json = Encoding.UTF8.GetString(message.Payload);
337 return _encoding.GetBytes(json);
338 }
339
340 var generatedJson = JsonSerializer.Serialize(new
341 {
342 name = message.Name,
343 route = message.Route
344 });
345
346 return _encoding.GetBytes(generatedJson);
347 }
348
381 private static string? TryGetString(JsonElement root, string propertyName)
382 {
383 if (!root.TryGetProperty(propertyName, out var property))
384 {
385 return null;
386 }
387
388 return property.ValueKind == JsonValueKind.String
389 ? property.GetString()
390 : property.ToString();
391 }
392}
static ? string TryGetString(JsonElement root, string propertyName)
RawJsonProtocolAdapter(Encoding encoding, string defaultRoute, string defaultName)
RawJsonProtocolAdapter(string defaultRoute, string defaultName)