diff --git a/api/message/json/codec.go b/api/message/json/codec.go index fb6b0f7..1921f88 100644 --- a/api/message/json/codec.go +++ b/api/message/json/codec.go @@ -7,17 +7,19 @@ import ( "github.com/eosswedenorg/thalos/api/message" ) -var ( - json_codec = jsontime.ConfigWithCustomTimeFormat - encoder = json_codec.Marshal - decoder = json_codec.Unmarshal -) +func createCodec() message.Codec { + json_codec := jsontime.ConfigWithCustomTimeFormat + + return message.Codec{ + Encoder: json_codec.Marshal, + Decoder: json_codec.Unmarshal, + } +} func init() { + // Set timeformat used by eos api. jsontime.SetDefaultTimeFormat("2006-01-02T15:04:05.000", time.UTC) - message.RegisterCodec("json", message.Codec{ - Encoder: encoder, - Decoder: decoder, - }) + // Register the json codec. + message.RegisterCodec("json", createCodec()) } diff --git a/api/message/json/codec_test.go b/api/message/json/codec_test.go index 074d7d5..b657eb4 100644 --- a/api/message/json/codec_test.go +++ b/api/message/json/codec_test.go @@ -45,7 +45,7 @@ func TestJson_EncodeActionTrace(t *testing.T) { expected := `{"tx_id":"ed3b8e853647971cf8296f004c3a1aeac255f082b2cb3c12cc3222e2d7c174ab","blocknum":267372365,"blocktimestamp":"2003-03-21T17:23:09.500","receipt":{"receiver":"account2","act_digest":"0a2c71dba327cf13a107d3a4f91c9c98f510a8fbbb483b233e222033f13a3e36","global_sequence":2329381932,"recv_sequence":22,"auth_sequence":[{"account":"account1","sequence":1382772}],"code_sequence":1122,"abi_sequence":12352},"name":"transfer","contract":"eosio","receiver":"account2","data":{"from":"account1","quantity":"1000.0000 WAX","to":"account2"},"authorization":[{"actor":"account1","permission":"active"}],"except":"errstr","error":2,"return":"3q2+7w=="}` - data, err := encoder(msg) + data, err := createCodec().Encoder(msg) assert.NoError(t, err) assert.Equal(t, expected, string(data)) } @@ -88,7 +88,7 @@ func TestJson_DecodeActionTrace(t *testing.T) { input := `{"tx_id":"952989f7464237b6cf9926e533ecd331df6794ed07564bd052bc368cbd65b4bc","blocknum":8723971,"blocktimestamp":"2024-06-21T08:08:26.500","receipt":{"receiver":"account2","act_digest":"f2f682847fd5bf00fb315b075dc00b4ff0ce18776758077b86a233dea49dc047","global_sequence":287328,"recv_sequence":42,"auth_sequence":[{"account":"account1","sequence":271877283}],"code_sequence":237823,"abi_sequence":68323},"name":"transfer","contract":"eosio","receiver":"account2","data":{"from":"account1","quantity":"1000.0000 WAX","to":"account2"},"authorization":[{"actor":"account1","permission":"active"}],"except":"errstr","error":2,"return":"3q2+7w=="}` msg := message.ActionTrace{} - err := decoder([]byte(input), &msg) + err := createCodec().Decoder([]byte(input), &msg) assert.NoError(t, err) assert.Equal(t, expected, msg) } @@ -155,7 +155,7 @@ func TestJson_EncodeTransactionTrace(t *testing.T) { expected := `{"id":"ed04516bdd1194aa5f0ab4c8c5445eec542c17f45a85bb3e9e4bc33e1a2486f8","blocknum":283781923,"blocktimestamp":"2029-02-08T15:10:05.500","status":"executed","cpu_usage_us":442,"net_usage_words":16,"elapsed":22,"net_usage":128,"scheduled":true,"action_traces":[{"tx_id":"ed04516bdd1194aa5f0ab4c8c5445eec542c17f45a85bb3e9e4bc33e1a2486f8","blocknum":283781923,"blocktimestamp":"2029-02-08T15:10:05.500","name":"mine","contract":"coolgame","receiver":"actor01","data":{"equipment_id":1234,"location_id":5445453},"authorization":[{"actor":"actor01","permission":"active"}],"except":"","error":0,"return":"CPE="},{"tx_id":"ed04516bdd1194aa5f0ab4c8c5445eec542c17f45a85bb3e9e4bc33e1a2486f8","blocknum":283781923,"blocktimestamp":"2029-02-08T15:10:05.500","name":"addpoints","contract":"coolgame","receiver":"coolgame","data":{"points":"1023.0423 SCAM"},"authorization":[{"actor":"coolgame","permission":"usrpoints"}],"except":"some error string","error":2,"return":"/wI="}],"except":"errstr","error":2}` - data, err := encoder(msg) + data, err := createCodec().Encoder(msg) assert.NoError(t, err) assert.Equal(t, expected, string(data)) } @@ -235,7 +235,7 @@ func TestJson_DecodeTransactionTrace(t *testing.T) { } msg := message.TransactionTrace{} - err := decoder([]byte(input), &msg) + err := createCodec().Decoder([]byte(input), &msg) assert.NoError(t, err) assert.Equal(t, expected, msg) } diff --git a/api/message/msgpack/codec.go b/api/message/msgpack/codec.go index 783635c..2e684a6 100644 --- a/api/message/msgpack/codec.go +++ b/api/message/msgpack/codec.go @@ -8,27 +8,28 @@ import ( "github.com/eosswedenorg/thalos/api/message" ) -var mh codec.MsgpackHandle - -func encode(a any) ([]byte, error) { - var b []byte - return b, codec.NewEncoderBytes(&b, &mh).Encode(a) -} - -func decode(b []byte, a any) error { - return codec.NewDecoderBytes(b, &mh).Decode(a) -} - -func init() { - mh.MapType = reflect.TypeOf(map[string]any(nil)) - mh.Canonical = true +func createCodec() message.Codec { + // Create handler. + handle := codec.MsgpackHandle{} + handle.MapType = reflect.TypeOf(map[string]any(nil)) + handle.Canonical = true // Wierd name but this is needed for the newest version of msgpack // that has support for time and string datatypes etc. - mh.WriteExt = true + handle.WriteExt = true - message.RegisterCodec("msgpack", message.Codec{ - Encoder: encode, - Decoder: decode, - }) + return message.Codec{ + Encoder: func(a any) ([]byte, error) { + var b []byte + return b, codec.NewEncoderBytes(&b, &handle).Encode(a) + }, + Decoder: func(b []byte, a any) error { + return codec.NewDecoderBytes(b, &handle).Decode(a) + }, + } +} + +func init() { + // Register codec. + message.RegisterCodec("msgpack", createCodec()) } diff --git a/api/message/msgpack/codec_test.go b/api/message/msgpack/codec_test.go index 2348257..71d47c7 100644 --- a/api/message/msgpack/codec_test.go +++ b/api/message/msgpack/codec_test.go @@ -51,7 +51,7 @@ func TestMsgpack_EncodeActionTrace(t *testing.T) { Return: []byte{0xde, 0xad, 0xbe, 0xef}, } - data, err := encode(msg) + data, err := createCodec().Encoder(msg) assert.NoError(t, err) expected := []byte{ @@ -177,7 +177,7 @@ func TestMsgpack_DecodeActionTrace(t *testing.T) { } res := message.ActionTrace{} - err := decode(data, &res) + err := createCodec().Decoder(data, &res) assert.NoError(t, err) assert.Equal(t, expected, res) @@ -190,7 +190,7 @@ func TestMsgpack_EncodeHeartbeat(t *testing.T) { LastIrreversibleBlockNum: 1236, } - data, err := encode(msg) + data, err := createCodec().Encoder(msg) assert.NoError(t, err) assert.Equal(t, data, []byte{0x83, 0xa8, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x6e, 0x75, 0x6d, 0xcd, 0x4, 0xd2, 0xad, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x6e, 0x75, 0x6d, 0xcd, 0x4, 0xd3, 0xba, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x72, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x6e, 0x75, 0x6d, 0xcd, 0x4, 0xd4}) @@ -206,7 +206,7 @@ func TestMsgpack_DecodeHeartbeat(t *testing.T) { } msg := message.HeartBeat{} - err := decode(data, &msg) + err := createCodec().Decoder(data, &msg) assert.NoError(t, err) assert.Equal(t, expected, msg) } @@ -265,7 +265,7 @@ func TestMsgpack_EncodeTransactionTrace(t *testing.T) { Error: 2, } - data, err := encode(msg) + data, err := createCodec().Encoder(msg) assert.NoError(t, err) expected := []byte{ @@ -406,7 +406,7 @@ func TestMsgpack_DecodeTransactionTrace(t *testing.T) { } res := message.TransactionTrace{} - err := decode(data, &res) + err := createCodec().Decoder(data, &res) assert.NoError(t, err) assert.Equal(t, expected, res)