diff --git a/cloudevent.go b/cloudevent.go index 5c8c9ad..74af95c 100644 --- a/cloudevent.go +++ b/cloudevent.go @@ -2,8 +2,14 @@ package cloudevent import ( + "encoding/base64" "encoding/json" + "fmt" + "mime" + "strings" "time" + + "github.com/tidwall/sjson" ) const ( @@ -95,10 +101,90 @@ type CloudEvent[A any] struct { CloudEventHeader // Data contains domain-specific information about the event. Data A `json:"data"` + + DataBase64 string `json:"data_base64,omitempty"` } // RawEvent is a cloudevent with a json.RawMessage data field. -type RawEvent = CloudEvent[json.RawMessage] +// It supports both "data" and "data_base64" (CloudEvents JSON spec). +type RawEvent struct { + CloudEventHeader + Data json.RawMessage `json:"data,omitempty"` + + // DataBase64 is the raw "data_base64" string when the event was received with + // data_base64 (CloudEvents spec). When set, MarshalJSON emits data_base64 for + // round-trip; otherwise wire form is chosen from DataContentType and Data. + DataBase64 string `json:"data_base64,omitempty"` +} + +// BytesForSignature returns the bytes that were signed (wire form of data or data_base64). +// Use for signature verification; not the same as Data when the CE used data_base64. +func (r RawEvent) BytesForSignature() []byte { + if r.DataBase64 != "" { + return []byte(r.DataBase64) + } + return r.Data +} + +// UnmarshalJSON implements json.Unmarshaler so that both "data" and "data_base64" +// are supported; Data is always set to the resolved payload bytes. +func (r *RawEvent) UnmarshalJSON(data []byte) error { + var dataRaw json.RawMessage + var dataBase64 string + header, err := unmarshalCloudEventWithPayload(data, func(d json.RawMessage, b64 string) error { + dataRaw = d + dataBase64 = b64 + return nil + }) + if err != nil { + return err + } + r.CloudEventHeader = header + if dataRaw != nil && dataBase64 != "" { + return fmt.Errorf("cloudevent: both \"data\" and \"data_base64\" present; only one allowed") + } + if dataBase64 != "" { + decoded, err := base64.StdEncoding.DecodeString(dataBase64) + if err != nil { + return err + } + r.Data = decoded + r.DataBase64 = dataBase64 + } else { + r.Data = dataRaw + r.DataBase64 = "" + } + return nil +} + +// IsJSONDataContentType returns true if the MIME type indicates a JSON payload. +// Matches "application/json" and any "+json" suffix type (e.g. "application/cloudevents+json"). +func IsJSONDataContentType(ct string) bool { + parsed, _, err := mime.ParseMediaType(strings.TrimSpace(ct)) + return err == nil && (parsed == "application/json" || strings.HasSuffix(parsed, "+json")) +} + +// MarshalJSON implements json.Marshaler. Uses DataContentType to choose wire form: +// application/json -> "data"; otherwise -> "data_base64" (CloudEvents spec). +func (r RawEvent) MarshalJSON() ([]byte, error) { + data, err := json.Marshal(r.CloudEventHeader) + if err != nil { + return nil, err + } + if len(r.Data) > 0 || r.DataBase64 != "" { + if r.DataBase64 != "" { + data, err = sjson.SetBytes(data, "data_base64", r.DataBase64) + } else if IsJSONDataContentType(r.DataContentType) || (r.DataContentType == "" && json.Valid(r.Data)) { + data, err = sjson.SetRawBytes(data, "data", r.Data) + } else { + data, err = sjson.SetBytes(data, "data_base64", base64.StdEncoding.EncodeToString(r.Data)) + } + if err != nil { + return nil, err + } + } + return data, nil +} // Equals returns true if the two CloudEventHeaders share the same IndexKey. func (c *CloudEventHeader) Equals(other CloudEventHeader) bool { diff --git a/cloudevent_json.go b/cloudevent_json.go index 84dec80..2644cac 100644 --- a/cloudevent_json.go +++ b/cloudevent_json.go @@ -2,31 +2,56 @@ package cloudevent import ( "encoding/json" + "fmt" "reflect" "strings" "github.com/tidwall/sjson" ) -var definedCloudeEventHdrFields = getJSONFieldNames(reflect.TypeOf(CloudEventHeader{})) +var definedCloudeEventHdrFields = getJSONFieldNames(reflect.TypeFor[CloudEventHeader]()) type cloudEventHeader CloudEventHeader // UnmarshalJSON implements custom JSON unmarshaling for CloudEvent. +// It transparently handles both "data" and "data_base64" wire formats. func (c *CloudEvent[A]) UnmarshalJSON(data []byte) error { - var err error - c.CloudEventHeader, err = unmarshalCloudEvent(data, c.setDataField) - return err + var dataRaw json.RawMessage + var dataBase64 string + header, err := unmarshalCloudEventWithPayload(data, func(d json.RawMessage, b64 string) error { + dataRaw = d + dataBase64 = b64 + return nil + }) + if err != nil { + return err + } + c.CloudEventHeader = header + if dataRaw != nil && dataBase64 != "" { + return fmt.Errorf("cloudevent: both \"data\" and \"data_base64\" present; only one allowed") + } + if dataBase64 != "" { + c.DataBase64 = dataBase64 + } else if dataRaw != nil { + if err := json.Unmarshal(dataRaw, &c.Data); err != nil { + return err + } + } + return nil } -// MarshalJSON implements custom JSON marshaling for CloudEventHeader. +// MarshalJSON implements custom JSON marshaling for CloudEvent[A]. +// When DataBase64 is set, emits "data_base64"; otherwise emits "data". func (c CloudEvent[A]) MarshalJSON() ([]byte, error) { - // Marshal the base struct data, err := json.Marshal(c.CloudEventHeader) if err != nil { return nil, err } - data, err = sjson.SetBytes(data, "data", c.Data) + if c.DataBase64 != "" { + data, err = sjson.SetBytes(data, "data_base64", c.DataBase64) + } else { + data, err = sjson.SetBytes(data, "data", c.Data) + } if err != nil { return nil, err } @@ -42,21 +67,18 @@ func (c *CloudEventHeader) UnmarshalJSON(data []byte) error { // MarshalJSON implements custom JSON marshaling for CloudEventHeader. func (c CloudEventHeader) MarshalJSON() ([]byte, error) { - // Marshal the base struct aux := (cloudEventHeader)(c) aux.SpecVersion = SpecVersion data, err := json.Marshal(aux) if err != nil { return nil, err } - // Add all extras using sjson] for k, v := range c.Extras { data, err = sjson.SetBytes(data, k, v) if err != nil { return nil, err } } - return data, nil } @@ -90,30 +112,48 @@ func getJSONFieldNames(t reflect.Type) map[string]struct{} { // unmarshalCloudEvent unmarshals the CloudEventHeader and data field. func unmarshalCloudEvent(data []byte, dataFunc func(json.RawMessage) error) (CloudEventHeader, error) { - c := CloudEventHeader{} - aux := cloudEventHeader{} - // Unmarshal known fields directly into the struct - if err := json.Unmarshal(data, &aux); err != nil { + return unmarshalCloudEventWithPayload(data, func(dataRaw json.RawMessage, _ string) error { + return dataFunc(dataRaw) + }) +} + +// unmarshalCloudEventWithPayload unmarshals the CloudEventHeader and returns both +// "data" and "data_base64" for RawEvent. +func unmarshalCloudEventWithPayload(data []byte, payloadFunc func(dataRaw json.RawMessage, dataBase64 string) error) (CloudEventHeader, error) { + // Unmarshal known header fields via the type alias (no custom UnmarshalJSON). + var c CloudEventHeader + if err := json.Unmarshal(data, (*cloudEventHeader)(&c)); err != nil { return c, err } - aux.SpecVersion = SpecVersion - c = (CloudEventHeader)(aux) - // Create a map to hold all JSON fields + c.SpecVersion = SpecVersion + + // Second pass into raw map to extract data, data_base64, and extras. rawFields := make(map[string]json.RawMessage) if err := json.Unmarshal(data, &rawFields); err != nil { return c, err } - // Separate known and unknown fields + var dataRaw json.RawMessage + var dataBase64 string + if raw, ok := rawFields["data_base64"]; ok && len(raw) > 0 { + if err := json.Unmarshal(raw, &dataBase64); err != nil { + return c, err + } + } + if raw, ok := rawFields["data"]; ok { + dataRaw = raw + } + if dataRaw != nil || dataBase64 != "" { + if err := payloadFunc(dataRaw, dataBase64); err != nil { + return c, err + } + } + for key, rawValue := range rawFields { if _, ok := definedCloudeEventHdrFields[key]; ok { - // Skip defined fields continue } - if key == "data" { - if err := dataFunc(rawValue); err != nil { - return c, err - } + if key == "data" || key == "data_base64" { continue } if c.Extras == nil { @@ -131,9 +171,3 @@ func unmarshalCloudEvent(data []byte, dataFunc func(json.RawMessage) error) (Clo // ignoreDataField is a function that ignores the data field. // It is used when unmarshalling the CloudEventHeader so that the data field is not added to the Extras map. func ignoreDataField(json.RawMessage) error { return nil } - -// setDataField is a function that sets the data field. -// It is used to unmarshal the data field into the CloudEvent[A].Data field. -func (c *CloudEvent[A]) setDataField(data json.RawMessage) error { - return json.Unmarshal(data, &c.Data) -} diff --git a/cloudevent_test.go b/cloudevent_test.go index e73bd34..4f0cc42 100644 --- a/cloudevent_test.go +++ b/cloudevent_test.go @@ -345,3 +345,322 @@ func TestCloudEventHeader_UnmarshalJSON(t *testing.T) { }) } } + +func TestCloudEvent_UnmarshalJSON_DataBase64(t *testing.T) { + t.Parallel() + now := time.Now().UTC().Truncate(time.Millisecond) + + // base64 of `{"message":"hello","count":42}` + jsonStr := `{ + "id": "b64-1", + "source": "test-source", + "producer": "test-producer", + "subject": "test-subject", + "time": "` + now.Format(time.RFC3339Nano) + `", + "type": "dimo.status", + "data_base64": "eyJtZXNzYWdlIjoiaGVsbG8iLCJjb3VudCI6NDJ9" + }` + var ev cloudevent.CloudEvent[TestData] + err := json.Unmarshal([]byte(jsonStr), &ev) + require.NoError(t, err) + assert.Equal(t, "b64-1", ev.ID) + assert.Equal(t, TestData{}, ev.Data, "Data should not be populated from data_base64") + assert.Equal(t, "eyJtZXNzYWdlIjoiaGVsbG8iLCJjb3VudCI6NDJ9", ev.DataBase64) +} + +func TestCloudEvent_MarshalJSON_DataBase64(t *testing.T) { + t.Parallel() + now := time.Now().UTC().Truncate(time.Millisecond) + ev := cloudevent.CloudEvent[TestData]{ + CloudEventHeader: cloudevent.CloudEventHeader{ + ID: "b64-m", + Source: "test-source", + Producer: "test-producer", + Subject: "test-subject", + Time: now, + Type: cloudevent.TypeStatus, + }, + Data: TestData{Message: "hello", Count: 42}, + DataBase64: "eyJtZXNzYWdlIjoiaGVsbG8iLCJjb3VudCI6NDJ9", + } + out, err := json.Marshal(ev) + require.NoError(t, err) + + var m map[string]any + require.NoError(t, json.Unmarshal(out, &m)) + assert.Equal(t, "eyJtZXNzYWdlIjoiaGVsbG8iLCJjb3VudCI6NDJ9", m["data_base64"]) + assert.Nil(t, m["data"], "data field should not be present when data_base64 is set") +} + +func TestCloudEvent_UnmarshalJSON_BothDataAndDataBase64(t *testing.T) { + t.Parallel() + jsonStr := `{"id":"1","source":"s","type":"t","data":{"message":"hi","count":1},"data_base64":"Zm9v"}` + var ev cloudevent.CloudEvent[TestData] + err := json.Unmarshal([]byte(jsonStr), &ev) + require.Error(t, err, "expected error when both data and data_base64 are present") + assert.Contains(t, err.Error(), "both") +} + +func TestCloudEvent_UnmarshalJSON_InvalidBase64(t *testing.T) { + t.Parallel() + jsonStr := `{"id":"1","source":"s","type":"t","data_base64":"$$not-base64$$"}` + var ev cloudevent.CloudEvent[TestData] + err := json.Unmarshal([]byte(jsonStr), &ev) + require.NoError(t, err, "CloudEvent[A] should not validate base64 encoding") + assert.Equal(t, "$$not-base64$$", ev.DataBase64) + assert.Equal(t, TestData{}, ev.Data) +} + +func TestCloudEvent_DataBase64_RoundTrip(t *testing.T) { + t.Parallel() + input := `{ + "id": "rt-1", + "source": "s", + "producer": "p", + "subject": "sub", + "time": "2025-01-01T00:00:00Z", + "type": "dimo.status", + "data_base64": "eyJtZXNzYWdlIjoicnQiLCJjb3VudCI6N30=" + }` + var ev cloudevent.CloudEvent[TestData] + require.NoError(t, json.Unmarshal([]byte(input), &ev)) + assert.Equal(t, TestData{}, ev.Data, "Data should not be populated from data_base64") + assert.Equal(t, "eyJtZXNzYWdlIjoicnQiLCJjb3VudCI6N30=", ev.DataBase64) + + out, err := json.Marshal(ev) + require.NoError(t, err) + + var m map[string]any + require.NoError(t, json.Unmarshal(out, &m)) + assert.Equal(t, "eyJtZXNzYWdlIjoicnQiLCJjb3VudCI6N30=", m["data_base64"]) + assert.Nil(t, m["data"]) +} + +// --- RawEvent positive tests --- + +func TestRawEvent_UnmarshalJSON_DataField(t *testing.T) { + t.Parallel() + input := `{ + "id":"r1","source":"s","producer":"p","subject":"sub", + "time":"2025-06-01T00:00:00Z","type":"dimo.status", + "data":{"temp":72} + }` + var ev cloudevent.RawEvent + require.NoError(t, json.Unmarshal([]byte(input), &ev)) + + assert.Equal(t, "r1", ev.ID) + assert.JSONEq(t, `{"temp":72}`, string(ev.Data)) + assert.Empty(t, ev.DataBase64, "DataBase64 should be empty when data field is used") +} + +func TestRawEvent_UnmarshalJSON_DataBase64Field(t *testing.T) { + t.Parallel() + // base64("hello world") = "aGVsbG8gd29ybGQ=" + input := `{ + "id":"r2","source":"s","producer":"p","subject":"sub", + "time":"2025-06-01T00:00:00Z","type":"dimo.status", + "data_base64":"aGVsbG8gd29ybGQ=" + }` + var ev cloudevent.RawEvent + require.NoError(t, json.Unmarshal([]byte(input), &ev)) + + assert.Equal(t, "r2", ev.ID) + assert.Equal(t, []byte("hello world"), []byte(ev.Data)) + assert.Equal(t, "aGVsbG8gd29ybGQ=", ev.DataBase64) +} + +func TestRawEvent_UnmarshalJSON_DataBase64_WithExtras(t *testing.T) { + t.Parallel() + input := `{ + "id":"r3","source":"s","producer":"p","subject":"sub", + "time":"2025-06-01T00:00:00Z","type":"dimo.status", + "data_base64":"Zm9v", + "customfield":"bar" + }` + var ev cloudevent.RawEvent + require.NoError(t, json.Unmarshal([]byte(input), &ev)) + + assert.Equal(t, "Zm9v", ev.DataBase64) + assert.Equal(t, []byte("foo"), []byte(ev.Data)) + require.Contains(t, ev.Extras, "customfield") + assert.Equal(t, "bar", ev.Extras["customfield"]) +} + +func TestRawEvent_RoundTrip_DataBase64(t *testing.T) { + t.Parallel() + input := `{ + "id":"rt","source":"s","producer":"p","subject":"sub", + "time":"2025-06-01T00:00:00Z","type":"dimo.status", + "data_base64":"aGVsbG8gd29ybGQ=" + }` + var ev cloudevent.RawEvent + require.NoError(t, json.Unmarshal([]byte(input), &ev)) + + out, err := json.Marshal(ev) + require.NoError(t, err) + + var m map[string]any + require.NoError(t, json.Unmarshal(out, &m)) + assert.Equal(t, "aGVsbG8gd29ybGQ=", m["data_base64"]) + assert.Nil(t, m["data"], "data should not be present when round-tripping data_base64") +} + +func TestRawEvent_RoundTrip_DataJSON(t *testing.T) { + t.Parallel() + input := `{ + "id":"rt2","source":"s","producer":"p","subject":"sub", + "time":"2025-06-01T00:00:00Z","type":"dimo.status", + "data":{"key":"value"} + }` + var ev cloudevent.RawEvent + require.NoError(t, json.Unmarshal([]byte(input), &ev)) + + out, err := json.Marshal(ev) + require.NoError(t, err) + + var m map[string]any + require.NoError(t, json.Unmarshal(out, &m)) + assert.Nil(t, m["data_base64"], "data_base64 should not be present when data is JSON") + assert.Equal(t, map[string]any{"key": "value"}, m["data"]) +} + +func TestRawEvent_MarshalJSON_NonJSONData_EmitsBase64(t *testing.T) { + t.Parallel() + ev := cloudevent.RawEvent{ + CloudEventHeader: cloudevent.CloudEventHeader{ + ID: "nj1", + Source: "s", + Producer: "p", + Subject: "sub", + Time: time.Date(2025, 6, 1, 0, 0, 0, 0, time.UTC), + Type: cloudevent.TypeStatus, + DataContentType: "application/octet-stream", + }, + Data: []byte("binary\x00data"), + } + out, err := json.Marshal(ev) + require.NoError(t, err) + + var m map[string]any + require.NoError(t, json.Unmarshal(out, &m)) + assert.Nil(t, m["data"], "non-JSON content type should not emit data field") + assert.NotEmpty(t, m["data_base64"]) +} + +func TestRawEvent_MarshalJSON_ExplicitJSONContentType(t *testing.T) { + t.Parallel() + ev := cloudevent.RawEvent{ + CloudEventHeader: cloudevent.CloudEventHeader{ + ID: "jct", + Source: "s", + Producer: "p", + Subject: "sub", + Time: time.Date(2025, 6, 1, 0, 0, 0, 0, time.UTC), + Type: cloudevent.TypeStatus, + DataContentType: "application/json", + }, + Data: json.RawMessage(`{"ok":true}`), + } + out, err := json.Marshal(ev) + require.NoError(t, err) + + var m map[string]any + require.NoError(t, json.Unmarshal(out, &m)) + assert.Equal(t, map[string]any{"ok": true}, m["data"]) + assert.Nil(t, m["data_base64"]) +} + +func TestRawEvent_MarshalJSON_DataBase64TakesPrecedence(t *testing.T) { + t.Parallel() + ev := cloudevent.RawEvent{ + CloudEventHeader: cloudevent.CloudEventHeader{ + ID: "bp", + Source: "s", + Subject: "sub", + Time: time.Date(2025, 6, 1, 0, 0, 0, 0, time.UTC), + Type: cloudevent.TypeStatus, + }, + Data: json.RawMessage(`{"ignored":true}`), + DataBase64: "cHJlc2V0", + } + out, err := json.Marshal(ev) + require.NoError(t, err) + + var m map[string]any + require.NoError(t, json.Unmarshal(out, &m)) + assert.Equal(t, "cHJlc2V0", m["data_base64"]) + assert.Nil(t, m["data"], "data_base64 should take precedence over data") +} + +func TestRawEvent_BytesForSignature_DataBase64(t *testing.T) { + t.Parallel() + ev := cloudevent.RawEvent{ + Data: []byte("decoded payload"), + DataBase64: "b3JpZ2luYWw=", + } + assert.Equal(t, []byte("b3JpZ2luYWw="), ev.BytesForSignature()) +} + +func TestRawEvent_BytesForSignature_DataOnly(t *testing.T) { + t.Parallel() + ev := cloudevent.RawEvent{ + Data: json.RawMessage(`{"sig":"data"}`), + } + assert.Equal(t, json.RawMessage(`{"sig":"data"}`), json.RawMessage(ev.BytesForSignature())) +} + +// --- IsJSONDataContentType tests --- + +func TestIsJSONDataContentType(t *testing.T) { + t.Parallel() + tests := []struct { + ct string + expected bool + }{ + {"application/json", true}, + {"application/json; charset=utf-8", true}, + {"application/cloudevents+json", true}, + {"application/vnd.custom+json", true}, + {"application/octet-stream", false}, + {"text/plain", false}, + {"", false}, + } + for _, tt := range tests { + assert.Equal(t, tt.expected, cloudevent.IsJSONDataContentType(tt.ct), "content type: %q", tt.ct) + } +} + +func TestRawEvent_UnmarshalJSON_InvalidBase64(t *testing.T) { + t.Parallel() + jsonStr := `{"id":"1","source":"s","type":"t","data_base64":"$$not-base64$$"}` + var ev cloudevent.RawEvent + err := json.Unmarshal([]byte(jsonStr), &ev) + require.Error(t, err, "expected error for invalid base64 in data_base64") +} + +func TestRawEvent_UnmarshalJSON_BothDataAndDataBase64(t *testing.T) { + t.Parallel() + jsonStr := `{"id":"1","source":"s","type":"t","data":{"x":1},"data_base64":"Zm9v"}` + var ev cloudevent.RawEvent + err := json.Unmarshal([]byte(jsonStr), &ev) + require.Error(t, err, "expected error when both data and data_base64 are present") + assert.Contains(t, err.Error(), "both") +} + +func TestCloudEvent_UnmarshalJSON_InvalidTime(t *testing.T) { + t.Parallel() + jsonStr := `{"id":"1","source":"s","type":"t","time":12345,"data":{"message":"hi","count":1}}` + var ev cloudevent.CloudEvent[TestData] + err := json.Unmarshal([]byte(jsonStr), &ev) + require.Error(t, err, "expected error for invalid time field type") +} + +func TestCloudEvent_UnmarshalJSON_NoDataField(t *testing.T) { + t.Parallel() + jsonStr := `{"id":"1","source":"s","type":"t","subject":"sub","time":"2025-01-01T00:00:00Z"}` + var ev cloudevent.CloudEvent[TestData] + err := json.Unmarshal([]byte(jsonStr), &ev) + require.NoError(t, err, "CloudEvent without data field should succeed") + assert.Equal(t, "1", ev.ID) + assert.Equal(t, TestData{}, ev.Data) +} diff --git a/go.mod b/go.mod index 260ff4d..729e478 100644 --- a/go.mod +++ b/go.mod @@ -1,22 +1,22 @@ module github.com/DIMO-Network/cloudevent -go 1.24 +go 1.24.1 require ( - github.com/ClickHouse/clickhouse-go/v2 v2.40.1 - github.com/DIMO-Network/clickhouse-infra v0.0.5 - github.com/DIMO-Network/model-garage v0.7.2 + github.com/ClickHouse/clickhouse-go/v2 v2.43.0 + github.com/DIMO-Network/clickhouse-infra v0.0.7 + github.com/DIMO-Network/model-garage v0.8.12 github.com/cespare/xxhash/v2 v2.3.0 - github.com/ethereum/go-ethereum v1.16.3 + github.com/ethereum/go-ethereum v1.16.4 github.com/stretchr/testify v1.11.1 github.com/tidwall/sjson v1.2.5 ) require ( - dario.cat/mergo v1.0.1 // indirect + dario.cat/mergo v1.0.2 // indirect filippo.io/edwards25519 v1.1.0 // indirect github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect - github.com/ClickHouse/ch-go v0.67.0 // indirect + github.com/ClickHouse/ch-go v0.71.0 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/andybalholm/brotli v1.2.0 // indirect github.com/antlr4-go/antlr/v4 v4.13.1 // indirect @@ -29,7 +29,7 @@ require ( github.com/cpuguy83/dockercfg v0.3.2 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/distribution/reference v0.6.0 // indirect - github.com/docker/docker v28.3.3+incompatible // indirect + github.com/docker/docker v28.5.2+incompatible // indirect github.com/docker/go-connections v0.6.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect @@ -43,7 +43,6 @@ require ( github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-sql-driver/mysql v1.9.2 // indirect - github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.2 // indirect github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect github.com/golang-sql/sqlexp v0.1.0 // indirect @@ -55,7 +54,7 @@ require ( github.com/jackc/puddle/v2 v2.2.2 // indirect github.com/joho/godotenv v1.5.1 // indirect github.com/jonboulle/clockwork v0.5.0 // indirect - github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/compress v1.18.3 // indirect github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect github.com/magiconair/properties v1.8.10 // indirect github.com/mattn/go-isatty v0.0.20 // indirect @@ -74,20 +73,20 @@ require ( github.com/ncruces/go-strftime v0.1.9 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.1 // indirect - github.com/paulmach/orb v0.11.1 // indirect - github.com/pierrec/lz4/v4 v4.1.22 // indirect + github.com/paulmach/orb v0.12.0 // indirect + github.com/pierrec/lz4/v4 v4.1.25 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect github.com/pressly/goose/v3 v3.24.3 // indirect github.com/prometheus/procfs v0.16.1 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect - github.com/segmentio/asm v1.2.0 // indirect + github.com/segmentio/asm v1.2.1 // indirect github.com/sethvargo/go-retry v0.3.0 // indirect - github.com/shirou/gopsutil/v4 v4.25.5 // indirect + github.com/shirou/gopsutil/v4 v4.25.6 // indirect github.com/shopspring/decimal v1.4.0 // indirect github.com/sirupsen/logrus v1.9.3 // indirect - github.com/testcontainers/testcontainers-go v0.38.0 // indirect + github.com/testcontainers/testcontainers-go v0.40.0 // indirect github.com/testcontainers/testcontainers-go/modules/clickhouse v0.38.0 // indirect github.com/tidwall/gjson v1.18.0 // indirect github.com/tidwall/match v1.1.1 // indirect @@ -100,27 +99,28 @@ require ( github.com/ydb-platform/ydb-go-sdk/v3 v3.108.1 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect github.com/ziutek/mymysql v1.5.4 // indirect - go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect - go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel v1.39.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0 // indirect - go.opentelemetry.io/otel/metric v1.37.0 // indirect - go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.opentelemetry.io/otel/metric v1.39.0 // indirect + go.opentelemetry.io/otel/trace v1.39.0 // indirect go.opentelemetry.io/proto/otlp v1.5.0 // indirect go.uber.org/mock v0.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.41.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/crypto v0.47.0 // indirect golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect - golang.org/x/mod v0.27.0 // indirect - golang.org/x/net v0.43.0 // indirect - golang.org/x/sync v0.16.0 // indirect - golang.org/x/sys v0.35.0 // indirect - golang.org/x/text v0.28.0 // indirect - golang.org/x/tools v0.36.0 // indirect + golang.org/x/mod v0.31.0 // indirect + golang.org/x/net v0.49.0 // indirect + golang.org/x/sync v0.19.0 // indirect + golang.org/x/sys v0.40.0 // indirect + golang.org/x/text v0.33.0 // indirect + golang.org/x/tools v0.40.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250106144421-5f5ef82da422 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463 // indirect google.golang.org/grpc v1.71.0 // indirect - google.golang.org/protobuf v1.36.7 // indirect + google.golang.org/protobuf v1.36.10 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect howett.net/plist v1.0.1 // indirect modernc.org/libc v1.65.0 // indirect diff --git a/go.sum b/go.sum index a753105..4fa4d98 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= -dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= +dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 h1:He8afgbRMd7mFxO99hRNu+6tazq8nFF9lIwo9JFroBk= @@ -21,14 +21,14 @@ github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg6 github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/ClickHouse/ch-go v0.67.0 h1:18MQF6vZHj+4/hTRaK7JbS/TIzn4I55wC+QzO24uiqc= -github.com/ClickHouse/ch-go v0.67.0/go.mod h1:2MSAeyVmgt+9a2k2SQPPG1b4qbTPzdGDpf1+bcHh+18= -github.com/ClickHouse/clickhouse-go/v2 v2.40.1 h1:PbwsHBgqXRydU7jKULD1C8CHmifczffvQqmFvltM2W4= -github.com/ClickHouse/clickhouse-go/v2 v2.40.1/go.mod h1:GDzSBLVhladVm8V01aEB36IoBOVLLICfyeuiIp/8Ezc= -github.com/DIMO-Network/clickhouse-infra v0.0.5 h1:zY1STwb9+vovpYXdjaeakE29pgZPIJLogJA+h3+IrbM= -github.com/DIMO-Network/clickhouse-infra v0.0.5/go.mod h1:XS80lhSJNWBWGgZ+m4j7++zFj1wAXfmtV2gJfhGlabQ= -github.com/DIMO-Network/model-garage v0.7.2 h1:leh4L4ct1cvHT//vD/hGyOaMYk0npYNZioQnzMlzhI4= -github.com/DIMO-Network/model-garage v0.7.2/go.mod h1:D9Dz+6+lh1k/z1oUQ9W6S60al9d4yKCide37nOQnznc= +github.com/ClickHouse/ch-go v0.71.0 h1:bUdZ/EZj/LcVHsMqaRUP2holqygrPWQKeMjc6nZoyRM= +github.com/ClickHouse/ch-go v0.71.0/go.mod h1:NwbNc+7jaqfY58dmdDUbG4Jl22vThgx1cYjBw0vtgXw= +github.com/ClickHouse/clickhouse-go/v2 v2.43.0 h1:fUR05TrF1GyvLDa/mAQjkx7KbgwdLRffs2n9O3WobtE= +github.com/ClickHouse/clickhouse-go/v2 v2.43.0/go.mod h1:o6jf7JM/zveWC/PP277BLxjHy5KjnGX/jfljhM4s34g= +github.com/DIMO-Network/clickhouse-infra v0.0.7 h1:TAsjkFFKu3D5Xg6dwBcRBryjCVSlXsNjVbTwJ4UDlTg= +github.com/DIMO-Network/clickhouse-infra v0.0.7/go.mod h1:XS80lhSJNWBWGgZ+m4j7++zFj1wAXfmtV2gJfhGlabQ= +github.com/DIMO-Network/model-garage v0.8.12 h1:8Nz2vXZBBw75VmXNdmL74yoWPP0vwuSq7zfE5kwqGNM= +github.com/DIMO-Network/model-garage v0.8.12/go.mod h1:goE7y2N58G8CDUym/RqaAEH0E0w6+gzdUSprWItqmyU= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= @@ -69,8 +69,8 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/docker v28.3.3+incompatible h1:Dypm25kh4rmk49v1eiVbsAtpAsYURjYkaKubwuBdxEI= -github.com/docker/docker v28.3.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v28.5.2+incompatible h1:DBX0Y0zAjZbSrm1uzOkdr1onVghKaftjlSWt4AFexzM= +github.com/docker/docker v28.5.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.6.0 h1:LlMG9azAe1TqfR7sO+NJttz1gy6KO7VJBh+pMmjSD94= github.com/docker/go-connections v0.6.0/go.mod h1:AahvXYshr6JgfUJGdDCs2b5EZG/vmaMAntpSFH5BFKE= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -91,8 +91,8 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum/go-ethereum v1.16.3 h1:nDoBSrmsrPbrDIVLTkDQCy1U9KdHN+F2PzvMbDoS42Q= -github.com/ethereum/go-ethereum v1.16.3/go.mod h1:Lrsc6bt9Gm9RyvhfFK53vboCia8kpF9nv+2Ukntnl+8= +github.com/ethereum/go-ethereum v1.16.4 h1:H6dU0r2p/amA7cYg6zyG9Nt2JrKKH6oX2utfcqrSpkQ= +github.com/ethereum/go-ethereum v1.16.4/go.mod h1:P7551slMFbjn2zOQaKrJShZVN/d8bGxp4/I6yZVlb5w= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -110,7 +110,6 @@ github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-sql-driver/mysql v1.9.2 h1:4cNKDYQ1I84SXslGddlsrMhc8k4LeDVj6Ad6WRjiHuU= github.com/go-sql-driver/mysql v1.9.2/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= @@ -176,8 +175,8 @@ github.com/jonboulle/clockwork v0.5.0/go.mod h1:3mZlmanh0g2NDKO5TWZVJAfofYk64M7X github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= -github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/compress v1.18.3 h1:9PJRvfbmTabkOX8moIpXPbMMbYN60bWImDDU7L+/6zw= +github.com/klauspost/compress v1.18.3/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -226,11 +225,11 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= -github.com/paulmach/orb v0.11.1 h1:3koVegMC4X/WeiXYz9iswopaTwMem53NzTJuTF20JzU= -github.com/paulmach/orb v0.11.1/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/EnuLaLU= +github.com/paulmach/orb v0.12.0 h1:z+zOwjmG3MyEEqzv92UN49Lg1JFYx0L9GpGKNVDKk1s= +github.com/paulmach/orb v0.12.0/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/EnuLaLU= github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY= -github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= -github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.25 h1:kocOqRffaIbU5djlIBr7Wh+cx82C0vtFb0fOurZHqD0= +github.com/pierrec/lz4/v4 v4.1.25/go.mod h1:EoQMVJgeeEOMsCqCzqFm2O0cJvljX2nGZjcRIPL34O4= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -253,12 +252,12 @@ github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qq github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= -github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys= -github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= +github.com/segmentio/asm v1.2.1 h1:DTNbBqs57ioxAD4PrArqftgypG4/qNpXoJx8TVXxPR0= +github.com/segmentio/asm v1.2.1/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= github.com/sethvargo/go-retry v0.3.0 h1:EEt31A35QhrcRZtrYFDTBg91cqZVnFL2navjDrah2SE= github.com/sethvargo/go-retry v0.3.0/go.mod h1:mNX17F0C/HguQMyMyJxcnU471gOZGxCLyYaFyAZraas= -github.com/shirou/gopsutil/v4 v4.25.5 h1:rtd9piuSMGeU8g1RMXjZs9y9luK5BwtnG7dZaQUJAsc= -github.com/shirou/gopsutil/v4 v4.25.5/go.mod h1:PfybzyydfZcN+JMMjkF6Zb8Mq1A/VcogFFg7hj50W9c= +github.com/shirou/gopsutil/v4 v4.25.6 h1:kLysI2JsKorfaFPcYmcJqbzROzsBWEOAtw6A7dIfqXs= +github.com/shirou/gopsutil/v4 v4.25.6/go.mod h1:PfybzyydfZcN+JMMjkF6Zb8Mq1A/VcogFFg7hj50W9c= github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= @@ -272,8 +271,8 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -github.com/testcontainers/testcontainers-go v0.38.0 h1:d7uEapLcv2P8AvH8ahLqDMMxda2W9gQN1nRbHS28HBw= -github.com/testcontainers/testcontainers-go v0.38.0/go.mod h1:C52c9MoHpWO+C4aqmgSU+hxlR5jlEayWtgYrb8Pzz1w= +github.com/testcontainers/testcontainers-go v0.40.0 h1:pSdJYLOVgLE8YdUY2FHQ1Fxu+aMnb6JfVz1mxk7OeMU= +github.com/testcontainers/testcontainers-go v0.40.0/go.mod h1:FSXV5KQtX2HAMlm7U3APNyLkkap35zNLxukw9oBi/MY= github.com/testcontainers/testcontainers-go/modules/clickhouse v0.38.0 h1:T+2MT0BvN3FAohAtOwm9HYH5gcjKv2mccaDKaMqW8jo= github.com/testcontainers/testcontainers-go/modules/clickhouse v0.38.0/go.mod h1:4YCEhJkDA1L1GF8ndOf2RVXtdxY1Po30nmtwvDOb+8Q= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= @@ -312,24 +311,24 @@ github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQ github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs= github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= go.mongodb.org/mongo-driver v1.11.4/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g= -go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= -go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ= -go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= -go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48= +go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0 h1:1fTNlAIJZGWLP5FVu0fikVry1IsiUnXjf7QFvoNN3Xw= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0/go.mod h1:zjPK58DtkqQFn+YUMbx0M2XV3QgKU0gS9LeGohREyK4= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 h1:IeMeyr1aBvBiPVYihXIaeIZba6b8E1bYp7lbdxK8CQg= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0/go.mod h1:oVdCUtjq9MK9BlS7TtucsQwUcXcymNiEDjgDD2jMtZU= -go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= -go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= -go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= -go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0= +go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs= +go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18= +go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE= go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o= go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w= -go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= -go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI= +go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= @@ -337,12 +336,14 @@ go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= -golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= +golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8= +golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI= golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ= @@ -351,8 +352,8 @@ golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvx golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ= -golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc= +golang.org/x/mod v0.31.0 h1:HaW9xtz0+kOcWKwli0ZXy79Ix+UW/vOfmWI5QVd2tgI= +golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -364,8 +365,8 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= -golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= +golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o= +golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -375,8 +376,8 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= -golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -393,17 +394,17 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= -golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= +golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4= -golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw= +golang.org/x/term v0.39.0 h1:RclSuaJf32jOqZz74CkPA9qFuVTX7vhLlpfj/IGWlqY= +golang.org/x/term v0.39.0/go.mod h1:yxzUCTP/U+FzoxfdKmLaA0RV1WgE0VY7hXBwKtY/4ww= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= -golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= +golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE= +golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8= golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY= golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -414,8 +415,8 @@ golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg= -golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s= +golang.org/x/tools v0.40.0 h1:yLkxfA+Qnul4cs9QA3KnlFu0lVmd8JJfoq+E41uSutA= +golang.org/x/tools v0.40.0/go.mod h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -452,8 +453,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= -google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= +google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=