@@ -8,7 +8,7 @@ const uuidv4 = @import("../id.zig").uuidv4;
88const RunMode = @import ("../app.zig" ).RunMode ;
99
1010const log = std .log .scoped (.telemetry );
11- const ID_FILE = "lightpanda.id " ;
11+ const IID_FILE = "iid " ;
1212
1313pub const Telemetry = TelemetryT (blk : {
1414 if (builtin .mode == .Debug or builtin .is_test ) break :blk NoopProvider ;
@@ -29,7 +29,7 @@ fn TelemetryT(comptime P: type) type {
2929
3030 const Self = @This ();
3131
32- pub fn init (allocator : Allocator , run_mode : RunMode ) Self {
32+ pub fn init (allocator : Allocator , run_mode : RunMode , app_dir_path : ? [] const u8 ) Self {
3333 const disabled = std .process .hasEnvVarConstant ("LIGHTPANDA_DISABLE_TELEMETRY" );
3434 if (builtin .mode != .Debug and builtin .is_test == false ) {
3535 log .info ("telemetry {s}" , .{if (disabled ) "disabled" else "enabled" });
@@ -39,7 +39,7 @@ fn TelemetryT(comptime P: type) type {
3939 .disabled = disabled ,
4040 .run_mode = run_mode ,
4141 .provider = try P .init (allocator ),
42- .iid = if (disabled ) null else getOrCreateId (),
42+ .iid = if (disabled ) null else getOrCreateId (app_dir_path ),
4343 };
4444 }
4545
@@ -59,9 +59,17 @@ fn TelemetryT(comptime P: type) type {
5959 };
6060}
6161
62- fn getOrCreateId () ? [36 ]u8 {
62+ fn getOrCreateId (app_dir_path_ : ? []const u8 ) ? [36 ]u8 {
63+ const app_dir_path = app_dir_path_ orelse return null ;
64+
6365 var buf : [37 ]u8 = undefined ;
64- const data = std .fs .cwd ().readFile (ID_FILE , & buf ) catch | err | switch (err ) {
66+ var dir = std .fs .openDirAbsolute (app_dir_path , .{}) catch | err | {
67+ log .warn ("failed to open data directory '{s}': {}" , .{ app_dir_path , err });
68+ return null ;
69+ };
70+ defer dir .close ();
71+
72+ const data = dir .readFile (IID_FILE , & buf ) catch | err | switch (err ) {
6573 error .FileNotFound = > &.{},
6674 else = > {
6775 log .warn ("failed to open id file: {}" , .{err });
@@ -76,7 +84,7 @@ fn getOrCreateId() ?[36]u8 {
7684 }
7785
7886 uuidv4 (& id );
79- std . fs . cwd (). writeFile (.{ .sub_path = ID_FILE , .data = & id }) catch | err | {
87+ dir . writeFile (.{ .sub_path = IID_FILE , .data = & id }) catch | err | {
8088 log .warn ("failed to write to id file: {}" , .{err });
8189 return null ;
8290 };
@@ -115,30 +123,27 @@ test "telemetry: disabled by environment" {
115123 }
116124 };
117125
118- var telemetry = TelemetryT (FailingProvider ).init (testing .allocator , .serve );
126+ var telemetry = TelemetryT (FailingProvider ).init (testing .allocator , .serve , null );
119127 defer telemetry .deinit ();
120128 telemetry .record (.{ .run = {} });
121129}
122130
123131test "telemetry: getOrCreateId" {
124- defer std .fs .cwd ().deleteFile (ID_FILE ) catch {};
132+ defer std .fs .cwd ().deleteFile ("/tmp/" ++ IID_FILE ) catch {};
125133
126- std .fs .cwd ().deleteFile (ID_FILE ) catch {};
134+ std .fs .cwd ().deleteFile ("/tmp/" ++ IID_FILE ) catch {};
127135
128- const id1 = getOrCreateId ().? ;
129- const id2 = getOrCreateId ().? ;
136+ const id1 = getOrCreateId ("/tmp/" ).? ;
137+ const id2 = getOrCreateId ("/tmp/" ).? ;
130138 try testing .expectEqualStrings (& id1 , & id2 );
131139
132- std .fs .cwd ().deleteFile (ID_FILE ) catch {};
133- const id3 = getOrCreateId ().? ;
140+ std .fs .cwd ().deleteFile ("/tmp/" ++ IID_FILE ) catch {};
141+ const id3 = getOrCreateId ("/tmp/" ).? ;
134142 try testing .expectEqual (false , std .mem .eql (u8 , & id1 , & id3 ));
135143}
136144
137145test "telemetry: sends event to provider" {
138- defer std .fs .cwd ().deleteFile (ID_FILE ) catch {};
139- std .fs .cwd ().deleteFile (ID_FILE ) catch {};
140-
141- var telemetry = TelemetryT (MockProvider ).init (testing .allocator , .serve );
146+ var telemetry = TelemetryT (MockProvider ).init (testing .allocator , .serve , "/tmp/" );
142147 defer telemetry .deinit ();
143148 const mock = & telemetry .provider ;
144149
0 commit comments