| ... | ... | @@ -588,11 +588,12 @@ fn buildClientWasm(ws: *WebServer, arena: Allocator, optimize: std.builtin.Optim |
| 588 | 588 | }); |
| 589 | 589 | defer child.kill(io); |
| 590 | 590 | |
| 591 | | var poller = Io.poll(gpa, enum { stdout, stderr }, .{ |
| 592 | | .stdout = child.stdout.?, |
| 593 | | .stderr = child.stderr.?, |
| 594 | | }); |
| 595 | | defer poller.deinit(); |
| 591 | var stderr_task = try io.concurrent(readStreamAlloc, .{ gpa, io, child.stderr.?, .unlimited }); |
| 592 | defer if (stderr_task.cancel(io)) |slice| gpa.free(slice) else |_| {}; |
| 593 | |
| 594 | var stdout_buffer: [512]u8 = undefined; |
| 595 | var stdout_reader: Io.File.Reader = .initStreaming(child.stdout.?, io, &stdout_buffer); |
| 596 | const stdout = &stdout_reader.interface; |
| 596 | 597 | |
| 597 | 598 | try child.stdin.?.writeStreamingAll(io, @ptrCast(@as([]const std.zig.Client.Message.Header, &.{ |
| 598 | 599 | .{ .tag = .update, .bytes_len = 0 }, |
| ... | ... | @@ -600,16 +601,17 @@ fn buildClientWasm(ws: *WebServer, arena: Allocator, optimize: std.builtin.Optim |
| 600 | 601 | }))); |
| 601 | 602 | |
| 602 | 603 | const Header = std.zig.Server.Message.Header; |
| 604 | |
| 603 | 605 | var result: ?Cache.Path = null; |
| 604 | 606 | var result_error_bundle = std.zig.ErrorBundle.empty; |
| 607 | var body_buffer: std.ArrayList(u8) = .empty; |
| 608 | defer body_buffer.deinit(gpa); |
| 605 | 609 | |
| 606 | | const stdout = poller.reader(.stdout); |
| 607 | | |
| 608 | | poll: while (true) { |
| 609 | | while (stdout.buffered().len < @sizeOf(Header)) if (!(try poller.poll())) break :poll; |
| 610 | | const header = stdout.takeStruct(Header, .little) catch unreachable; |
| 611 | | while (stdout.buffered().len < header.bytes_len) if (!try poller.poll()) break :poll; |
| 612 | | const body = stdout.take(header.bytes_len) catch unreachable; |
| 610 | while (true) { |
| 611 | const header = try stdout.takeStruct(Header, .little); |
| 612 | body_buffer.clearRetainingCapacity(); |
| 613 | try stdout.appendExact(gpa, &body_buffer, header.bytes_len); |
| 614 | const body = body_buffer.items; |
| 613 | 615 | |
| 614 | 616 | switch (header.tag) { |
| 615 | 617 | .zig_version => { |
| ... | ... | @@ -636,7 +638,7 @@ fn buildClientWasm(ws: *WebServer, arena: Allocator, optimize: std.builtin.Optim |
| 636 | 638 | } |
| 637 | 639 | } |
| 638 | 640 | |
| 639 | | const stderr_contents = try poller.toOwnedSlice(.stderr); |
| 641 | const stderr_contents = try stderr_task.await(io); |
| 640 | 642 | if (stderr_contents.len > 0) { |
| 641 | 643 | std.debug.print("{s}", .{stderr_contents}); |
| 642 | 644 | } |
| ... | ... | @@ -697,6 +699,14 @@ fn buildClientWasm(ws: *WebServer, arena: Allocator, optimize: std.builtin.Optim |
| 697 | 699 | return base_path.join(arena, bin_name); |
| 698 | 700 | } |
| 699 | 701 | |
| 702 | fn readStreamAlloc(gpa: Allocator, io: Io, file: Io.File, limit: Io.Limit) ![]u8 { |
| 703 | var file_reader: Io.File.Reader = .initStreaming(file, io, &.{}); |
| 704 | return file_reader.interface.allocRemaining(gpa, limit) catch |err| switch (err) { |
| 705 | error.ReadFailed => return file_reader.err.?, |
| 706 | else => |e| return e, |
| 707 | }; |
| 708 | } |
| 709 | |
| 700 | 710 | pub fn updateTimeReportCompile(ws: *WebServer, opts: struct { |
| 701 | 711 | compile: *Build.Step.Compile, |
| 702 | 712 | |