33// SPDX-License-Identifier: Apache-2.0
44
55use anyhow:: { Context , Result } ;
6+ use dstack_types:: EventLogVersion ;
67use fs_err as fs;
78use scale:: { Decode , Encode } ;
89use serde:: { Deserialize , Serialize } ;
@@ -30,13 +31,13 @@ pub struct RuntimeEvent {
3031 /// Event payload
3132 #[ serde( with = "base64" ) ]
3233 pub payload : Vec < u8 > ,
33- /// Event log version (0 or absent = v1, 2 = v2 JSON canonical)
34+ /// Event log version
3435 #[ serde( default , skip_serializing) ]
35- pub version : u32 ,
36+ pub version : EventLogVersion ,
3637}
3738
3839impl RuntimeEvent {
39- pub fn new ( event : String , payload : Vec < u8 > , version : u32 ) -> Self {
40+ pub fn new ( event : String , payload : Vec < u8 > , version : EventLogVersion ) -> Self {
4041 Self {
4142 event,
4243 payload,
@@ -109,45 +110,29 @@ impl RuntimeEvent {
109110
110111 /// Compute the digest of the event.
111112 ///
112- /// For v1 (version 0 or 1) : `SHA(event_type_le || ":" || event_name || ":" || payload)`
113- /// For v2 (version 2) : `SHA(canonical_json({"event":"...","event_type":134217730,"payload":"hex..."}))`
113+ /// - V1 : `SHA(event_type_le || ":" || event_name || ":" || payload)`
114+ /// - V2 : `SHA(canonical_json({"event":"...","event_type":134217730,"payload":"hex..."}))`
114115 pub fn digest < H : Hasher > ( & self ) -> H :: Output {
115- if self . is_v2 ( ) {
116- self . digest_v2 :: < H > ( )
117- } else {
118- self . digest_v1 :: < H > ( )
116+ match self . version {
117+ EventLogVersion :: V1 => H :: hash ( [
118+ & DSTACK_RUNTIME_EVENT_TYPE . to_ne_bytes ( ) [ ..] ,
119+ b":" ,
120+ self . event . as_bytes ( ) ,
121+ b":" ,
122+ & self . payload ,
123+ ] ) ,
124+ EventLogVersion :: V2 => {
125+ let canonical =
126+ canonical_event_json ( & self . event , DSTACK_RUNTIME_EVENT_TYPE_V2 , & self . payload ) ;
127+ H :: hash ( [ canonical. as_bytes ( ) ] )
128+ }
119129 }
120130 }
121131
122- fn digest_v1 < H : Hasher > ( & self ) -> H :: Output {
123- H :: hash ( [
124- & DSTACK_RUNTIME_EVENT_TYPE . to_ne_bytes ( ) [ ..] ,
125- b":" ,
126- self . event . as_bytes ( ) ,
127- b":" ,
128- & self . payload ,
129- ] )
130- }
131-
132- /// Compute the v2 digest using JCS (RFC 8785) canonical JSON.
133- ///
134- /// The canonical JSON has keys sorted alphabetically:
135- /// `{"event":"<name>","event_type":134217730,"payload":"<hex>"}`
136- fn digest_v2 < H : Hasher > ( & self ) -> H :: Output {
137- let canonical =
138- canonical_event_json ( & self . event , DSTACK_RUNTIME_EVENT_TYPE_V2 , & self . payload ) ;
139- H :: hash ( [ canonical. as_bytes ( ) ] )
140- }
141-
142- pub fn is_v2 ( & self ) -> bool {
143- self . version == 2
144- }
145-
146132 pub fn cc_event_type ( & self ) -> u32 {
147- if self . is_v2 ( ) {
148- DSTACK_RUNTIME_EVENT_TYPE_V2
149- } else {
150- DSTACK_RUNTIME_EVENT_TYPE
133+ match self . version {
134+ EventLogVersion :: V1 => DSTACK_RUNTIME_EVENT_TYPE ,
135+ EventLogVersion :: V2 => DSTACK_RUNTIME_EVENT_TYPE_V2 ,
151136 }
152137 }
153138}
@@ -189,7 +174,11 @@ mod tests {
189174
190175 #[ test]
191176 fn v1_digest_unchanged ( ) {
192- let event = RuntimeEvent :: new ( "app-id" . to_string ( ) , vec ! [ 0xde , 0xad , 0xbe , 0xef ] , 1 ) ;
177+ let event = RuntimeEvent :: new (
178+ "app-id" . to_string ( ) ,
179+ vec ! [ 0xde , 0xad , 0xbe , 0xef ] ,
180+ EventLogVersion :: V1 ,
181+ ) ;
193182 let digest = event. digest :: < Sha384 > ( ) ;
194183 let expected = Sha384 :: hash ( [
195184 & DSTACK_RUNTIME_EVENT_TYPE . to_ne_bytes ( ) [ ..] ,
@@ -203,7 +192,11 @@ mod tests {
203192
204193 #[ test]
205194 fn v2_digest_is_canonical_json_hash ( ) {
206- let event = RuntimeEvent :: new ( "compose-hash" . to_string ( ) , vec ! [ 0xab , 0xcd ] , 2 ) ;
195+ let event = RuntimeEvent :: new (
196+ "compose-hash" . to_string ( ) ,
197+ vec ! [ 0xab , 0xcd ] ,
198+ EventLogVersion :: V2 ,
199+ ) ;
207200 let canonical =
208201 canonical_event_json ( & event. event , DSTACK_RUNTIME_EVENT_TYPE_V2 , & event. payload ) ;
209202 assert_eq ! (
@@ -217,8 +210,8 @@ mod tests {
217210
218211 #[ test]
219212 fn v2_digest_differs_from_v1 ( ) {
220- let v1 = RuntimeEvent :: new ( "test" . to_string ( ) , vec ! [ 1 , 2 , 3 ] , 1 ) ;
221- let v2 = RuntimeEvent :: new ( "test" . to_string ( ) , vec ! [ 1 , 2 , 3 ] , 2 ) ;
213+ let v1 = RuntimeEvent :: new ( "test" . to_string ( ) , vec ! [ 1 , 2 , 3 ] , EventLogVersion :: V1 ) ;
214+ let v2 = RuntimeEvent :: new ( "test" . to_string ( ) , vec ! [ 1 , 2 , 3 ] , EventLogVersion :: V2 ) ;
222215 assert_ne ! (
223216 v1. digest:: <Sha384 >( ) ,
224217 v2. digest:: <Sha384 >( ) ,
@@ -228,29 +221,28 @@ mod tests {
228221
229222 #[ test]
230223 fn v1_event_type ( ) {
231- let event = RuntimeEvent :: new ( "test" . to_string ( ) , vec ! [ ] , 1 ) ;
224+ let event = RuntimeEvent :: new ( "test" . to_string ( ) , vec ! [ ] , EventLogVersion :: V1 ) ;
232225 assert_eq ! ( event. cc_event_type( ) , DSTACK_RUNTIME_EVENT_TYPE ) ;
233226 }
234227
235228 #[ test]
236229 fn v2_event_type ( ) {
237- let event = RuntimeEvent :: new ( "test" . to_string ( ) , vec ! [ ] , 2 ) ;
230+ let event = RuntimeEvent :: new ( "test" . to_string ( ) , vec ! [ ] , EventLogVersion :: V2 ) ;
238231 assert_eq ! ( event. cc_event_type( ) , DSTACK_RUNTIME_EVENT_TYPE_V2 ) ;
239232 }
240233
241234 #[ test]
242235 fn deserialize_v1_without_version_field ( ) {
243236 let json = r#"{"event":"app-id","payload":"AQID"}"# ;
244237 let event: RuntimeEvent = serde_json:: from_str ( json) . unwrap ( ) ;
245- assert_eq ! ( event. version, 0 ) ;
246- assert ! ( !event. is_v2( ) ) ;
238+ assert_eq ! ( event. version, EventLogVersion :: V1 ) ;
247239 assert_eq ! ( event. cc_event_type( ) , DSTACK_RUNTIME_EVENT_TYPE ) ;
248240 }
249241
250242 #[ test]
251243 fn serialize_omits_version ( ) {
252- let v1 = RuntimeEvent :: new ( "test" . to_string ( ) , vec ! [ 1 ] , 1 ) ;
253- let v2 = RuntimeEvent :: new ( "test" . to_string ( ) , vec ! [ 1 ] , 2 ) ;
244+ let v1 = RuntimeEvent :: new ( "test" . to_string ( ) , vec ! [ 1 ] , EventLogVersion :: V1 ) ;
245+ let v2 = RuntimeEvent :: new ( "test" . to_string ( ) , vec ! [ 1 ] , EventLogVersion :: V2 ) ;
254246 let json_v1 = serde_json:: to_string ( & v1) . unwrap ( ) ;
255247 let json_v2 = serde_json:: to_string ( & v2) . unwrap ( ) ;
256248 assert ! (
0 commit comments