atproto relay implementation in zig
zlay.waow.tech
1const std = @import("std");
2
3pub fn build(b: *std.Build) void {
4 const target = b.standardTargetOptions(.{});
5 const optimize = b.standardOptimizeOption(.{});
6
7 const zat = b.dependency("zat", .{
8 .target = target,
9 .optimize = optimize,
10 });
11 const websocket = b.dependency("websocket", .{
12 .target = target,
13 .optimize = optimize,
14 });
15 const pg = b.dependency("pg", .{
16 .target = target,
17 .optimize = optimize,
18 });
19 const rocksdb = b.dependency("rocksdb", .{
20 .target = target,
21 .optimize = optimize,
22 });
23
24 const imports: []const std.Build.Module.Import = &.{
25 .{ .name = "zat", .module = zat.module("zat") },
26 .{ .name = "websocket", .module = websocket.module("websocket") },
27 .{ .name = "pg", .module = pg.module("pg") },
28 .{ .name = "rocksdb", .module = rocksdb.module("bindings") },
29 };
30
31 // embed build info (git SHA + optimize mode) for canary metric
32 const build_options = b.addOptions();
33 build_options.addOption([]const u8, "git_sha", git_sha: {
34 var code: u8 = 0;
35 const result = b.runAllowFail(&.{ "git", "rev-parse", "--short", "HEAD" }, &code, .ignore);
36 if (result) |output| {
37 break :git_sha std.mem.trimEnd(u8, output, "\n \t");
38 } else |_| {
39 break :git_sha "unknown";
40 }
41 });
42 build_options.addOption([]const u8, "optimize", @tagName(optimize));
43 const use_gpa = b.option(bool, "use_gpa", "use GeneralPurposeAllocator for leak detection (slow)") orelse false;
44 build_options.addOption(bool, "use_gpa", use_gpa);
45
46 // relay executable
47 const relay_mod = b.createModule(.{
48 .root_source_file = b.path("src/main.zig"),
49 .target = target,
50 .optimize = optimize,
51 .imports = imports,
52 });
53 relay_mod.addImport("build_options", build_options.createModule());
54 relay_mod.link_libc = true;
55 relay_mod.link_libcpp = true;
56 const relay = b.addExecutable(.{
57 .name = "zlay",
58 .root_module = relay_mod,
59 });
60 b.installArtifact(relay);
61
62 const run_relay = b.addRunArtifact(relay);
63 if (b.args) |args| run_relay.addArgs(args);
64 const run_step = b.step("run", "run the relay");
65 run_step.dependOn(&run_relay.step);
66
67 // tests
68 const test_step = b.step("test", "run unit tests");
69 const test_files = .{
70 "src/lru.zig",
71 "src/api.zig",
72 "src/broadcaster.zig",
73 "src/validator.zig",
74 "src/subscriber.zig",
75 "src/event_log.zig",
76 "src/slurper.zig",
77 "src/collection_index.zig",
78 "src/backfill.zig",
79 "src/thread_pool.zig",
80 "src/frame_worker.zig",
81 };
82 inline for (test_files) |file| {
83 const test_mod = b.createModule(.{
84 .root_source_file = b.path(file),
85 .target = target,
86 .optimize = optimize,
87 .imports = imports,
88 });
89 test_mod.addImport("build_options", build_options.createModule());
90 test_mod.link_libc = true;
91 test_mod.link_libcpp = true;
92 const t = b.addTest(.{
93 .root_module = test_mod,
94 });
95 test_step.dependOn(&b.addRunArtifact(t).step);
96 }
97}