private static async Task SendWorkspace(IServerStreamWriter <RunBuildCommand> responseStream, IRunnableJob runnableJob, CancellationToken cancellationToken) { var workspacePipe = new Pipe(); var workspaceTask = Task.Run(async() => { await using var stream = workspacePipe.Writer.AsStream(); await runnableJob.WriteWorkspace(stream, cancellationToken); }); await using (var stream = workspacePipe.Reader.AsStream()) { var buffer = new byte[4096]; int bytesRead; while ((bytesRead = await stream.ReadAsync(buffer.AsMemory(), cancellationToken)) > 0) { await responseStream.WriteAsync(new RunBuildCommand { WorkspaceContent = ByteString.CopyFrom(buffer, 0, bytesRead), }); } } await workspaceTask; await responseStream.WriteAsync(new RunBuildCommand { WorkspaceEnd = new Empty(), }); }
private static async Task <JobResult> ProcessBuildOutput(IAsyncStreamReader <BuildStatusUpdate> requestStream, CancellationToken cancellationToken, IRunnableJob runnableJob) { while (await requestStream.MoveNext(cancellationToken)) { var update = requestStream.Current; switch (update.PayloadCase) { case BuildStatusUpdate.PayloadOneofCase.BuildOutput: await runnableJob.JobStatus.AppendOutput(update.BuildOutput.ToByteArray(), cancellationToken); break; case BuildStatusUpdate.PayloadOneofCase.JobFinished: return(update.JobFinished); default: throw new Exception("Unexpected update type (expected BuildOutput or JobFinished): " + update.PayloadCase); } } throw new Exception("Unexpected end of stream (expected BuildOutput or JobFinished)"); }