public async ValueTask <IReadOnlyCollection <IMessage> > RouteAsync( RouteHierarchy routes, IMessage serializedMessage, bool publish, CancellationToken cancellation) { if (routes == null) { throw new ArgumentNullException(nameof(routes)); } if (routes.Any(p => p == null)) { throw new ArgumentException("The collection must not contain null values.", nameof(routes)); } if (serializedMessage == null) { throw new ArgumentNullException(nameof(serializedMessage)); } var idx = serializedMessage.FrameIndex; using (CheckDisposal(ref cancellation, out var disposal)) { try { try { EncodeRouteRequest(serializedMessage, routes, publish); var response = await SendInternalAsync(serializedMessage, cancellation); var result = await DecodeRouteResponseAsync(response, cancellation); return(result); } catch { Assert(serializedMessage.FrameIndex >= idx); while (serializedMessage.FrameIndex > idx) { serializedMessage.PopFrame(); } throw; } } catch (OperationCanceledException) when(disposal.IsCancellationRequested) { throw new ObjectDisposedException(GetType().FullName); } } }
private static void EncodeRouteRequest(IMessage message, RouteHierarchy routes, bool publish) { using (var stream = message.PushFrame().OpenStream()) using (var writer = new BinaryWriter(stream)) { writer.Write((short)MessageType.Route); writer.Write((short)0); // Padding writer.Write(routes.Count); for (var i = 0; i < routes.Count; i++) { var routeBytes = Encoding.UTF8.GetBytes(routes[i].ToString()); writer.Write(routeBytes.Length); writer.Write(routeBytes); } writer.Write(publish); } }