Compare commits
	
		
			44 Commits
		
	
	
		
			v0.12.0
			...
			c9c2c457fc
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| c9c2c457fc | |||
| 3e5f407402 | |||
| 37b91aa9a7 | |||
| ba7f1292f9 | |||
| 23138f4e06 | |||
| 13c6b4345f | |||
| 1722fa82f8 | |||
| be752a59e0 | |||
| 0c9b20d47f | |||
| 1e33734ab1 | |||
| 0c6e90e644 | |||
| 3d5a4a1482 | |||
| a0b561237a | |||
| ad1e06229f | |||
| e99a8dbcd6 | |||
| d3513ae4fa | |||
| 99264c6715 | |||
| 3c70ad2377 | |||
| af451c08b8 | |||
| 75fd09620c | |||
| 8fa8153ba6 | |||
| 2da7c8a4c1 | |||
| be7b2bf15e | |||
| b5406b1451 | |||
| bbf89b2f08 | |||
| eada7e8911 | |||
| 3bc6282168 | |||
| 7a9cd55fb2 | |||
| 0185a00836 | |||
| 4d7668c9ff | |||
| e65d101476 | |||
| 0ce7678c21 | |||
| c08b4bf90d | |||
| 74e88e62d5 | |||
| 55275db618 | |||
| a72c860511 | |||
| 2ba0097a06 | |||
| ad8514cf0f | |||
| 2415f59f7f | |||
| a3a57b9380 | |||
| 03d8049803 | |||
| 55488a023e | |||
| e8b94f4329 | |||
| ca965f7d07 | 
							
								
								
									
										99
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										99
									
								
								go.mod
									
									
									
									
									
								
							| @@ -1,48 +1,48 @@ | ||||
| module git.bvbej.com/bvbej/base-golang | ||||
| module gitea.bvbej.com/bvbej/base-golang | ||||
|  | ||||
| go 1.22.4 | ||||
| go 1.23.4 | ||||
|  | ||||
| require ( | ||||
| 	github.com/apolloconfig/agollo/v4 v4.4.0 | ||||
| 	github.com/gin-contrib/pprof v1.5.0 | ||||
| 	github.com/gin-contrib/pprof v1.5.2 | ||||
| 	github.com/gin-gonic/gin v1.10.0 | ||||
| 	github.com/go-playground/validator/v10 v10.22.0 | ||||
| 	github.com/golang-jwt/jwt/v4 v4.5.0 | ||||
| 	github.com/go-playground/validator/v10 v10.23.0 | ||||
| 	github.com/golang-jwt/jwt/v5 v5.2.1 | ||||
| 	github.com/google/uuid v1.6.0 | ||||
| 	github.com/gorilla/websocket v1.5.3 | ||||
| 	github.com/jinzhu/now v1.1.5 | ||||
| 	github.com/json-iterator/go v1.1.12 | ||||
| 	github.com/mojocn/base64Captcha v1.3.6 | ||||
| 	github.com/mojocn/base64Captcha v1.3.8 | ||||
| 	github.com/mritd/chinaid v1.0.4 | ||||
| 	github.com/panjf2000/ants/v2 v2.10.0 | ||||
| 	github.com/prometheus/client_golang v1.19.1 | ||||
| 	github.com/qiniu/go-sdk/v7 v7.21.1 | ||||
| 	github.com/redis/go-redis/v9 v9.5.3 | ||||
| 	github.com/prometheus/client_golang v1.20.5 | ||||
| 	github.com/qiniu/go-sdk/v7 v7.25.1 | ||||
| 	github.com/redis/go-redis/v9 v9.7.0 | ||||
| 	github.com/robfig/cron/v3 v3.0.1 | ||||
| 	github.com/rs/cors v1.11.0 | ||||
| 	github.com/rs/cors/wrapper/gin v0.0.0-20240515105523-1562b1715b35 | ||||
| 	github.com/rs/cors v1.11.1 | ||||
| 	github.com/rs/cors/wrapper/gin v0.0.0-20240830163046-1084d89a1692 | ||||
| 	github.com/speps/go-hashids v2.0.0+incompatible | ||||
| 	github.com/spf13/cast v1.6.0 | ||||
| 	github.com/spf13/cast v1.7.1 | ||||
| 	github.com/spf13/viper v1.19.0 | ||||
| 	github.com/stretchr/testify v1.9.0 | ||||
| 	github.com/tidwall/buntdb v1.3.1 | ||||
| 	github.com/tidwall/gjson v1.17.1 | ||||
| 	github.com/stretchr/testify v1.10.0 | ||||
| 	github.com/tidwall/buntdb v1.3.2 | ||||
| 	github.com/tidwall/gjson v1.18.0 | ||||
| 	github.com/tus/tusd v1.13.0 | ||||
| 	github.com/xuri/excelize/v2 v2.8.1 | ||||
| 	go.mongodb.org/mongo-driver v1.15.1 | ||||
| 	github.com/xuri/excelize/v2 v2.9.0 | ||||
| 	go.mongodb.org/mongo-driver v1.17.2 | ||||
| 	go.uber.org/atomic v1.11.0 | ||||
| 	go.uber.org/multierr v1.11.0 | ||||
| 	go.uber.org/zap v1.27.0 | ||||
| 	golang.org/x/crypto v0.24.0 | ||||
| 	golang.org/x/net v0.26.0 | ||||
| 	golang.org/x/sync v0.7.0 | ||||
| 	golang.org/x/time v0.5.0 | ||||
| 	google.golang.org/grpc v1.64.0 | ||||
| 	google.golang.org/protobuf v1.34.2 | ||||
| 	golang.org/x/crypto v0.32.0 | ||||
| 	golang.org/x/net v0.34.0 | ||||
| 	golang.org/x/sync v0.10.0 | ||||
| 	golang.org/x/time v0.9.0 | ||||
| 	google.golang.org/grpc v1.69.2 | ||||
| 	google.golang.org/protobuf v1.36.2 | ||||
| 	gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df | ||||
| 	gopkg.in/natefinch/lumberjack.v2 v2.2.1 | ||||
| 	gorm.io/driver/mysql v1.5.7 | ||||
| 	gorm.io/gorm v1.25.10 | ||||
| 	gorm.io/gorm v1.25.12 | ||||
| ) | ||||
|  | ||||
| require ( | ||||
| @@ -50,43 +50,48 @@ require ( | ||||
| 	github.com/alex-ant/gomath v0.0.0-20160516115720-89013a210a82 // indirect | ||||
| 	github.com/beorn7/perks v1.0.1 // indirect | ||||
| 	github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40 // indirect | ||||
| 	github.com/bytedance/sonic v1.11.6 // indirect | ||||
| 	github.com/bytedance/sonic/loader v0.1.1 // indirect | ||||
| 	github.com/cespare/xxhash/v2 v2.2.0 // indirect | ||||
| 	github.com/bytedance/sonic v1.12.6 // indirect | ||||
| 	github.com/bytedance/sonic/loader v0.2.1 // indirect | ||||
| 	github.com/cespare/xxhash/v2 v2.3.0 // indirect | ||||
| 	github.com/cloudwego/base64x v0.1.4 // indirect | ||||
| 	github.com/cloudwego/iasm v0.2.0 // indirect | ||||
| 	github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect | ||||
| 	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect | ||||
| 	github.com/elastic/go-sysinfo v1.0.2 // indirect | ||||
| 	github.com/elastic/go-windows v1.0.0 // indirect | ||||
| 	github.com/fsnotify/fsnotify v1.7.0 // indirect | ||||
| 	github.com/gabriel-vasile/mimetype v1.4.3 // indirect | ||||
| 	github.com/gabriel-vasile/mimetype v1.4.7 // indirect | ||||
| 	github.com/gammazero/toposort v0.1.1 // indirect | ||||
| 	github.com/gin-contrib/sse v0.1.0 // indirect | ||||
| 	github.com/go-playground/locales v0.14.1 // indirect | ||||
| 	github.com/go-playground/universal-translator v0.18.1 // indirect | ||||
| 	github.com/go-sql-driver/mysql v1.7.0 // indirect | ||||
| 	github.com/goccy/go-json v0.10.2 // indirect | ||||
| 	github.com/goccy/go-json v0.10.4 // indirect | ||||
| 	github.com/gofrs/flock v0.8.1 // indirect | ||||
| 	github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect | ||||
| 	github.com/golang/snappy v0.0.4 // indirect | ||||
| 	github.com/hashicorp/hcl v1.0.0 // indirect | ||||
| 	github.com/jinzhu/inflection v1.0.0 // indirect | ||||
| 	github.com/klauspost/compress v1.17.2 // indirect | ||||
| 	github.com/klauspost/cpuid/v2 v2.2.7 // indirect | ||||
| 	github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 // indirect | ||||
| 	github.com/klauspost/compress v1.17.9 // indirect | ||||
| 	github.com/klauspost/cpuid/v2 v2.2.9 // indirect | ||||
| 	github.com/leodido/go-urn v1.4.0 // indirect | ||||
| 	github.com/magiconair/properties v1.8.7 // indirect | ||||
| 	github.com/matishsiao/goInfo v0.0.0-20210923090445-da2e3fa8d45f // indirect | ||||
| 	github.com/mattn/go-isatty v0.0.20 // indirect | ||||
| 	github.com/mitchellh/mapstructure v1.5.0 // indirect | ||||
| 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect | ||||
| 	github.com/modern-go/reflect2 v1.0.2 // indirect | ||||
| 	github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect | ||||
| 	github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect | ||||
| 	github.com/pelletier/go-toml/v2 v2.2.2 // indirect | ||||
| 	github.com/montanaflynn/stats v0.7.1 // indirect | ||||
| 	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect | ||||
| 	github.com/pelletier/go-toml/v2 v2.2.3 // indirect | ||||
| 	github.com/pkg/errors v0.9.1 // indirect | ||||
| 	github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect | ||||
| 	github.com/prometheus/client_model v0.5.0 // indirect | ||||
| 	github.com/prometheus/common v0.48.0 // indirect | ||||
| 	github.com/prometheus/procfs v0.12.0 // indirect | ||||
| 	github.com/prometheus/client_model v0.6.1 // indirect | ||||
| 	github.com/prometheus/common v0.55.0 // indirect | ||||
| 	github.com/prometheus/procfs v0.15.1 // indirect | ||||
| 	github.com/richardlehane/mscfb v1.0.4 // indirect | ||||
| 	github.com/richardlehane/msoleps v1.0.3 // indirect | ||||
| 	github.com/richardlehane/msoleps v1.0.4 // indirect | ||||
| 	github.com/sagikazarmark/locafero v0.4.0 // indirect | ||||
| 	github.com/sagikazarmark/slog-shim v0.1.0 // indirect | ||||
| 	github.com/sourcegraph/conc v0.3.0 // indirect | ||||
| @@ -104,16 +109,18 @@ require ( | ||||
| 	github.com/xdg-go/pbkdf2 v1.0.0 // indirect | ||||
| 	github.com/xdg-go/scram v1.1.2 // indirect | ||||
| 	github.com/xdg-go/stringprep v1.0.4 // indirect | ||||
| 	github.com/xuri/efp v0.0.0-20231025114914-d1ff6096ae53 // indirect | ||||
| 	github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05 // indirect | ||||
| 	github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect | ||||
| 	golang.org/x/arch v0.8.0 // indirect | ||||
| 	github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d // indirect | ||||
| 	github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7 // indirect | ||||
| 	github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect | ||||
| 	golang.org/x/arch v0.12.0 // indirect | ||||
| 	golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect | ||||
| 	golang.org/x/image v0.14.0 // indirect | ||||
| 	golang.org/x/sys v0.21.0 // indirect | ||||
| 	golang.org/x/text v0.16.0 // indirect | ||||
| 	google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect | ||||
| 	golang.org/x/image v0.23.0 // indirect | ||||
| 	golang.org/x/sys v0.29.0 // indirect | ||||
| 	golang.org/x/text v0.21.0 // indirect | ||||
| 	google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53 // indirect | ||||
| 	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect | ||||
| 	gopkg.in/ini.v1 v1.67.0 // indirect | ||||
| 	gopkg.in/yaml.v3 v3.0.1 // indirect | ||||
| 	howett.net/plist v0.0.0-20181124034731-591f970eefbb // indirect | ||||
| 	modernc.org/fileutil v1.0.0 // indirect | ||||
| ) | ||||
|   | ||||
							
								
								
									
										236
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										236
									
								
								go.sum
									
									
									
									
									
								
							| @@ -811,18 +811,20 @@ github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= | ||||
| github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= | ||||
| github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= | ||||
| github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= | ||||
| github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0= | ||||
| github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= | ||||
| github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM= | ||||
| github.com/bytedance/sonic v1.12.6 h1:/isNmCUF2x3Sh8RAp/4mh4ZGkcFAX/hLrzrK3AvpRzk= | ||||
| github.com/bytedance/sonic v1.12.6/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk= | ||||
| github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= | ||||
| github.com/bytedance/sonic/loader v0.2.1 h1:1GgorWTqf12TA8mma4DDSbaQigE2wOgQo7iCjjJv3+E= | ||||
| github.com/bytedance/sonic/loader v0.2.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= | ||||
| github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= | ||||
| github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= | ||||
| github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= | ||||
| github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= | ||||
| github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= | ||||
| github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= | ||||
| github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= | ||||
| github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= | ||||
| github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= | ||||
| github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= | ||||
| github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= | ||||
| github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= | ||||
| github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= | ||||
| @@ -858,6 +860,10 @@ github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cu | ||||
| github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= | ||||
| github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= | ||||
| github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= | ||||
| github.com/elastic/go-sysinfo v1.0.2 h1:Wq1bOgnSz7Obl7DbMjbn0tzx1bE5G8Cfy3MVFa6C1Cc= | ||||
| github.com/elastic/go-sysinfo v1.0.2/go.mod h1:O/D5m1VpYLwGjCYzEt63g3Z1uO3jXfwyzzjiW90t8cY= | ||||
| github.com/elastic/go-windows v1.0.0 h1:qLURgZFkkrYyTTkvYpsZIgf83AUsdIHfvlJaqaZ7aSY= | ||||
| github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU= | ||||
| github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= | ||||
| github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= | ||||
| github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= | ||||
| @@ -884,11 +890,13 @@ github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7z | ||||
| github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= | ||||
| github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= | ||||
| github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= | ||||
| github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= | ||||
| github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= | ||||
| github.com/gabriel-vasile/mimetype v1.4.7 h1:SKFKl7kD0RiPdbht0s7hFtjl489WcQ1VyPW8ZzUMYCA= | ||||
| github.com/gabriel-vasile/mimetype v1.4.7/go.mod h1:GDlAgAyIRT27BhFl53XNAFtfjzOkLaF35JdEG0P7LtU= | ||||
| github.com/gammazero/toposort v0.1.1 h1:OivGxsWxF3U3+U80VoLJ+f50HcPU1MIqE1JlKzoJ2Eg= | ||||
| github.com/gammazero/toposort v0.1.1/go.mod h1:H2cozTnNpMw0hg2VHAYsAxmkHXBYroNangj2NTBQDvw= | ||||
| github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= | ||||
| github.com/gin-contrib/pprof v1.5.0 h1:E/Oy7g+kNw94KfdCy3bZxQFtyDnAX2V7axRS7sNYVrU= | ||||
| github.com/gin-contrib/pprof v1.5.0/go.mod h1:GqFL6LerKoCQ/RSWnkYczkTJ+tOAUVN/8sbnEtaqOKs= | ||||
| github.com/gin-contrib/pprof v1.5.2 h1:Kcq5W2bA2PBcVtF0MqkQjpvCpwJr+pd7zxcQh2csg7E= | ||||
| github.com/gin-contrib/pprof v1.5.2/go.mod h1:a1W4CDXwAPm2zql2AKdnT7OVCJdV/oFPhJXVOrDs5Ns= | ||||
| github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= | ||||
| github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= | ||||
| github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= | ||||
| @@ -912,6 +920,10 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 | ||||
| github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= | ||||
| github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= | ||||
| github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= | ||||
| github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= | ||||
| github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= | ||||
| github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= | ||||
| github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= | ||||
| github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= | ||||
| github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= | ||||
| github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= | ||||
| @@ -925,22 +937,22 @@ github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+ | ||||
| github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= | ||||
| github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= | ||||
| github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= | ||||
| github.com/go-playground/validator/v10 v10.8.0/go.mod h1:9JhgTzTaE31GZDpH/HSvHiRJrJ3iKAgqqH0Bl/Ocjdk= | ||||
| github.com/go-playground/validator/v10 v10.22.0 h1:k6HsTZ0sTnROkhS//R0O+55JgM8C4Bx7ia+JlgcnOao= | ||||
| github.com/go-playground/validator/v10 v10.22.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= | ||||
| github.com/go-playground/validator/v10 v10.7.0/go.mod h1:xm76BBt941f7yWdGnI2DVPFFg1UK3YY04qifoXU3lOk= | ||||
| github.com/go-playground/validator/v10 v10.23.0 h1:/PwmTwZhS0dPkav3cdK9kV1FsAmrL8sThn8IHr/sO+o= | ||||
| github.com/go-playground/validator/v10 v10.23.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= | ||||
| github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= | ||||
| github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= | ||||
| github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= | ||||
| github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= | ||||
| github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= | ||||
| github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= | ||||
| github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= | ||||
| github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= | ||||
| github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= | ||||
| github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= | ||||
| github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= | ||||
| github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= | ||||
| github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= | ||||
| github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= | ||||
| github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= | ||||
| github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= | ||||
| github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= | ||||
| github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= | ||||
| github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= | ||||
| github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= | ||||
| @@ -978,6 +990,8 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS | ||||
| github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= | ||||
| github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= | ||||
| github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= | ||||
| github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= | ||||
| github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= | ||||
| github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= | ||||
| github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= | ||||
| github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= | ||||
| @@ -1058,6 +1072,8 @@ github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qK | ||||
| github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= | ||||
| github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= | ||||
| github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= | ||||
| github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= | ||||
| github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= | ||||
| github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= | ||||
| github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= | ||||
| github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= | ||||
| @@ -1090,12 +1106,15 @@ github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47 | ||||
| github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= | ||||
| github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= | ||||
| github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= | ||||
| github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= | ||||
| github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= | ||||
| github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= | ||||
| github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= | ||||
| github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= | ||||
| github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= | ||||
| github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= | ||||
| github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4= | ||||
| github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= | ||||
| github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= | ||||
| github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= | ||||
| github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= | ||||
| @@ -1114,11 +1133,11 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI | ||||
| github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= | ||||
| github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= | ||||
| github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= | ||||
| github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4= | ||||
| github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= | ||||
| github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= | ||||
| github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= | ||||
| github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= | ||||
| github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= | ||||
| github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= | ||||
| github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= | ||||
| github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= | ||||
| github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= | ||||
| github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= | ||||
| github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= | ||||
| @@ -1133,6 +1152,9 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= | ||||
| github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= | ||||
| github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= | ||||
| github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= | ||||
| github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= | ||||
| github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= | ||||
| github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= | ||||
| github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= | ||||
| github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= | ||||
| github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= | ||||
| @@ -1142,8 +1164,6 @@ github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WV | ||||
| github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= | ||||
| github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= | ||||
| github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= | ||||
| github.com/matishsiao/goInfo v0.0.0-20210923090445-da2e3fa8d45f h1:B0OD7nYl2FPQEVrw8g2uyc1lGEzNbvrKh7fspGZcbvY= | ||||
| github.com/matishsiao/goInfo v0.0.0-20210923090445-da2e3fa8d45f/go.mod h1:aEt7p9Rvh67BYApmZwNDPpgircTO2kgdmDUoF/1QmwA= | ||||
| github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= | ||||
| github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= | ||||
| github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= | ||||
| @@ -1178,12 +1198,14 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G | ||||
| github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= | ||||
| github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= | ||||
| github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= | ||||
| github.com/mojocn/base64Captcha v1.3.6 h1:gZEKu1nsKpttuIAQgWHO+4Mhhls8cAKyiV2Ew03H+Tw= | ||||
| github.com/mojocn/base64Captcha v1.3.6/go.mod h1:i5CtHvm+oMbj1UzEPXaA8IH/xHFZ3DGY3Wh3dBpZ28E= | ||||
| github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0= | ||||
| github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= | ||||
| github.com/mojocn/base64Captcha v1.3.8 h1:rrN9BhCwXKS8ht1e21kvR3iTaMgf4qPC9sRoV52bqEg= | ||||
| github.com/mojocn/base64Captcha v1.3.8/go.mod h1:QFZy927L8HVP3+VV5z2b1EAEiv1KxVJKZbAucVgLUy4= | ||||
| github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= | ||||
| github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= | ||||
| github.com/mritd/chinaid v1.0.4 h1:jneCudUdOVZTgeVCezL/MeJZHoMLRpnav3STJp59ySU= | ||||
| github.com/mritd/chinaid v1.0.4/go.mod h1:oEIvdY3QZd08MxyfEtdQ71DdQWOcALYqkiK0aHgAPIU= | ||||
| github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= | ||||
| github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= | ||||
| github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= | ||||
| github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= | ||||
| github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms= | ||||
| @@ -1192,8 +1214,8 @@ github.com/panjf2000/ants/v2 v2.10.0 h1:zhRg1pQUtkyRiOFo2Sbqwjp0GfBNo9cUY2/Grpx1 | ||||
| github.com/panjf2000/ants/v2 v2.10.0/go.mod h1:7ZxyxsqE4vvW0M7LSD8aI3cKwgFhBHbxnlN8mDqHa1I= | ||||
| github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= | ||||
| github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= | ||||
| github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= | ||||
| github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= | ||||
| github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= | ||||
| github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= | ||||
| github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= | ||||
| github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= | ||||
| github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= | ||||
| @@ -1201,6 +1223,7 @@ github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFu | ||||
| github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= | ||||
| github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | ||||
| github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | ||||
| github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= | ||||
| github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | ||||
| github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= | ||||
| github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= | ||||
| @@ -1215,45 +1238,46 @@ github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqr | ||||
| github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= | ||||
| github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= | ||||
| github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= | ||||
| github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= | ||||
| github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= | ||||
| github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= | ||||
| github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= | ||||
| github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= | ||||
| github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= | ||||
| github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= | ||||
| github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= | ||||
| github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= | ||||
| github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= | ||||
| github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= | ||||
| github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= | ||||
| github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= | ||||
| github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= | ||||
| github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= | ||||
| github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= | ||||
| github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= | ||||
| github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= | ||||
| github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= | ||||
| github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE= | ||||
| github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= | ||||
| github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= | ||||
| github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= | ||||
| github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= | ||||
| github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= | ||||
| github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= | ||||
| github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= | ||||
| github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= | ||||
| github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= | ||||
| github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= | ||||
| github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= | ||||
| github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= | ||||
| github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= | ||||
| github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= | ||||
| github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= | ||||
| github.com/qiniu/dyn v1.3.0/go.mod h1:E8oERcm8TtwJiZvkQPbcAh0RL8jO1G0VXJMW3FAWdkk= | ||||
| github.com/qiniu/go-sdk/v7 v7.21.1 h1:D/IjVOlg5pTw0jeDjqTo6H5QM73Obb1AYfPOHmIFN+Q= | ||||
| github.com/qiniu/go-sdk/v7 v7.21.1/go.mod h1:8EM2awITynlem2VML2dXGHkMYP2UyECsGLOdp6yMpco= | ||||
| github.com/qiniu/go-sdk/v7 v7.25.1 h1:fynXKE2RP9XYkispAI3YI+eML39JFEx2+PLYP46ephA= | ||||
| github.com/qiniu/go-sdk/v7 v7.25.1/go.mod h1:uZE85Pi0ftIHT/UNLShosdzwsovqpdas0LwAGO7cPao= | ||||
| github.com/qiniu/x v1.10.5/go.mod h1:03Ni9tj+N2h2aKnAz+6N0Xfl8FwMEDRC2PAlxekASDs= | ||||
| github.com/redis/go-redis/v9 v9.5.3 h1:fOAp1/uJG+ZtcITgZOfYFmTKPE7n4Vclj1wZFgRciUU= | ||||
| github.com/redis/go-redis/v9 v9.5.3/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M= | ||||
| github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E= | ||||
| github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw= | ||||
| github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= | ||||
| github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= | ||||
| github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM= | ||||
| github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk= | ||||
| github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= | ||||
| github.com/richardlehane/msoleps v1.0.3 h1:aznSZzrwYRl3rLKRT3gUk9am7T/mLNSnJINvN0AQoVM= | ||||
| github.com/richardlehane/msoleps v1.0.3/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= | ||||
| github.com/richardlehane/msoleps v1.0.4 h1:WuESlvhX3gH2IHcd8UqyCuFY5yiq/GR/yqaSM/9/g00= | ||||
| github.com/richardlehane/msoleps v1.0.4/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= | ||||
| github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= | ||||
| github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= | ||||
| github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= | ||||
| @@ -1263,10 +1287,10 @@ github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6po | ||||
| github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= | ||||
| github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= | ||||
| github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= | ||||
| github.com/rs/cors v1.11.0 h1:0B9GE/r9Bc2UxRMMtymBkHTenPkHDv0CW4Y98GBY+po= | ||||
| github.com/rs/cors v1.11.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= | ||||
| github.com/rs/cors/wrapper/gin v0.0.0-20240515105523-1562b1715b35 h1:YI8KKdUmi/l2NWArtFPEY6qFM7h6+V2kYj5kz81WSHs= | ||||
| github.com/rs/cors/wrapper/gin v0.0.0-20240515105523-1562b1715b35/go.mod h1:742Ialb8SOs5yB2PqRDzFcyND3280PoaS5/wcKQUQKE= | ||||
| github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= | ||||
| github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= | ||||
| github.com/rs/cors/wrapper/gin v0.0.0-20240830163046-1084d89a1692 h1:lwzJgPw5Y6pvC8mwbedX9HfdywUKcpNdcviftZsb1uY= | ||||
| github.com/rs/cors/wrapper/gin v0.0.0-20240830163046-1084d89a1692/go.mod h1:742Ialb8SOs5yB2PqRDzFcyND3280PoaS5/wcKQUQKE= | ||||
| github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= | ||||
| github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= | ||||
| github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= | ||||
| @@ -1292,8 +1316,8 @@ github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcD | ||||
| github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= | ||||
| github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= | ||||
| github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= | ||||
| github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= | ||||
| github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= | ||||
| github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= | ||||
| github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= | ||||
| github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= | ||||
| github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= | ||||
| github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= | ||||
| @@ -1304,7 +1328,6 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ | ||||
| github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||
| github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= | ||||
| github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= | ||||
| github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= | ||||
| github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= | ||||
| github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= | ||||
| github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= | ||||
| @@ -1317,8 +1340,8 @@ github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o | ||||
| github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= | ||||
| github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= | ||||
| github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= | ||||
| github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= | ||||
| github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= | ||||
| github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= | ||||
| github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= | ||||
| github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= | ||||
| github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= | ||||
| github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= | ||||
| @@ -1328,11 +1351,11 @@ github.com/tidwall/assert v0.1.0 h1:aWcKyRBUAdLoVebxo95N7+YZVTFF/ASTr7BN4sLP6XI= | ||||
| github.com/tidwall/assert v0.1.0/go.mod h1:QLYtGyeqse53vuELQheYl9dngGCJQ+mTtlxcktb+Kj8= | ||||
| github.com/tidwall/btree v1.4.2 h1:PpkaieETJMUxYNADsjgtNRcERX7mGc/GP2zp/r5FM3g= | ||||
| github.com/tidwall/btree v1.4.2/go.mod h1:LGm8L/DZjPLmeWGjv5kFrY8dL4uVhMmzmmLYmsObdKE= | ||||
| github.com/tidwall/buntdb v1.3.1 h1:HKoDF01/aBhl9RjYtbaLnvX9/OuenwvQiC3OP1CcL4o= | ||||
| github.com/tidwall/buntdb v1.3.1/go.mod h1:lZZrZUWzlyDJKlLQ6DKAy53LnG7m5kHyrEHvvcDmBpU= | ||||
| github.com/tidwall/buntdb v1.3.2 h1:qd+IpdEGs0pZci37G4jF51+fSKlkuUTMXuHhXL1AkKg= | ||||
| github.com/tidwall/buntdb v1.3.2/go.mod h1:lZZrZUWzlyDJKlLQ6DKAy53LnG7m5kHyrEHvvcDmBpU= | ||||
| github.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= | ||||
| github.com/tidwall/gjson v1.17.1 h1:wlYEnwqAHgzmhNUFfw7Xalt2JzQvsMx2Se4PcoFCT/U= | ||||
| github.com/tidwall/gjson v1.17.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= | ||||
| github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= | ||||
| github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= | ||||
| github.com/tidwall/grect v0.1.4 h1:dA3oIgNgWdSspFzn1kS4S/RDpZFLrIxAZOdJKjYapOg= | ||||
| github.com/tidwall/grect v0.1.4/go.mod h1:9FBsaYRaR0Tcy4UwefBX/UDcDcDy9V5jUcxHzv2jd5Q= | ||||
| github.com/tidwall/lotsa v1.0.2 h1:dNVBH5MErdaQ/xd9s769R31/n2dXavsQ0Yf4TMEHHw8= | ||||
| @@ -1359,14 +1382,14 @@ github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3k | ||||
| github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= | ||||
| github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= | ||||
| github.com/xhit/go-str2duration v1.2.0/go.mod h1:3cPSlfZlUHVlneIVfePFWcJZsuwf+P1v2SRTV4cUmp4= | ||||
| github.com/xuri/efp v0.0.0-20231025114914-d1ff6096ae53 h1:Chd9DkqERQQuHpXjR/HSV1jLZA6uaoiwwH3vSuF3IW0= | ||||
| github.com/xuri/efp v0.0.0-20231025114914-d1ff6096ae53/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI= | ||||
| github.com/xuri/excelize/v2 v2.8.1 h1:pZLMEwK8ep+CLIUWpWmvW8IWE/yxqG0I1xcN6cVMGuQ= | ||||
| github.com/xuri/excelize/v2 v2.8.1/go.mod h1:oli1E4C3Pa5RXg1TBXn4ENCXDV5JUMlBluUhG7c+CEE= | ||||
| github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05 h1:qhbILQo1K3mphbwKh1vNm4oGezE1eF9fQWmNiIpSfI4= | ||||
| github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ= | ||||
| github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= | ||||
| github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= | ||||
| github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d h1:llb0neMWDQe87IzJLS4Ci7psK/lVsjIS2otl+1WyRyY= | ||||
| github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI= | ||||
| github.com/xuri/excelize/v2 v2.9.0 h1:1tgOaEq92IOEumR1/JfYS/eR0KHOCsRv/rYXXh6YJQE= | ||||
| github.com/xuri/excelize/v2 v2.9.0/go.mod h1:uqey4QBZ9gdMeWApPLdhm9x+9o2lq4iVmjiLfBS5hdE= | ||||
| github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7 h1:hPVCafDV85blFTabnqKgNhDCkJX25eik94Si9cTER4A= | ||||
| github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ= | ||||
| github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM= | ||||
| github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= | ||||
| github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||||
| github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||||
| github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||||
| @@ -1379,8 +1402,8 @@ github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaD | ||||
| go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= | ||||
| go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= | ||||
| go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= | ||||
| go.mongodb.org/mongo-driver v1.15.1 h1:l+RvoUOoMXFmADTLfYDm7On9dRm7p4T80/lEQM+r7HU= | ||||
| go.mongodb.org/mongo-driver v1.15.1/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= | ||||
| go.mongodb.org/mongo-driver v1.17.2 h1:gvZyk8352qSfzyZ2UMWcpDpMSGEr1eqE4T793SqyhzM= | ||||
| go.mongodb.org/mongo-driver v1.17.2/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ= | ||||
| go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= | ||||
| go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= | ||||
| go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= | ||||
| @@ -1389,6 +1412,16 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= | ||||
| go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= | ||||
| go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= | ||||
| go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= | ||||
| go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= | ||||
| go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= | ||||
| go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE= | ||||
| go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= | ||||
| go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk= | ||||
| go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= | ||||
| go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= | ||||
| go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= | ||||
| go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys= | ||||
| go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= | ||||
| go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= | ||||
| go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= | ||||
| go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= | ||||
| @@ -1405,9 +1438,8 @@ go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= | ||||
| go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= | ||||
| go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= | ||||
| go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= | ||||
| golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= | ||||
| golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc= | ||||
| golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= | ||||
| golang.org/x/arch v0.12.0 h1:UsYJhbzPYGsT0HbEdmYcqtCv8UNGvnaL561NnIUvaKg= | ||||
| golang.org/x/arch v0.12.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= | ||||
| golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | ||||
| golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | ||||
| golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | ||||
| @@ -1418,7 +1450,6 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U | ||||
| golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||
| golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||
| golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= | ||||
| golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | ||||
| golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | ||||
| golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | ||||
| golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= | ||||
| @@ -1428,8 +1459,11 @@ golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0 | ||||
| golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= | ||||
| golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= | ||||
| golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= | ||||
| golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= | ||||
| golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= | ||||
| golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= | ||||
| golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= | ||||
| golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= | ||||
| golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= | ||||
| golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= | ||||
| golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | ||||
| golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | ||||
| golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | ||||
| @@ -1460,9 +1494,8 @@ golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeap | ||||
| golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= | ||||
| golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= | ||||
| golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= | ||||
| golang.org/x/image v0.13.0/go.mod h1:6mmbMOeV28HuMTgA6OSRkdXKYw/t5W9Uwn2Yv1r3Yxk= | ||||
| golang.org/x/image v0.14.0 h1:tNgSxAFe3jC4uYqvZdTr84SZoM1KfwdC9SKIFrLjFn4= | ||||
| golang.org/x/image v0.14.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= | ||||
| golang.org/x/image v0.23.0 h1:HseQ7c2OpPKTPVzNjG5fwJsOTCiiwS4QdsYi5XU6H68= | ||||
| golang.org/x/image v0.23.0/go.mod h1:wJJBTdLfCCf3tiHa1fNxpZmUI4mmoZvwMCPP0ddoNKY= | ||||
| golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= | ||||
| golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= | ||||
| golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= | ||||
| @@ -1493,6 +1526,9 @@ golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= | ||||
| golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= | ||||
| golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= | ||||
| golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= | ||||
| golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= | ||||
| golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= | ||||
| golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= | ||||
| 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-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| @@ -1561,8 +1597,11 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= | ||||
| golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= | ||||
| golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= | ||||
| golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= | ||||
| golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= | ||||
| golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= | ||||
| golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= | ||||
| golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= | ||||
| golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= | ||||
| golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= | ||||
| golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= | ||||
| golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | ||||
| golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | ||||
| golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | ||||
| @@ -1614,8 +1653,10 @@ golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJ | ||||
| golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= | ||||
| golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= | ||||
| golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= | ||||
| golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= | ||||
| golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= | ||||
| golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= | ||||
| golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| @@ -1625,6 +1666,7 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h | ||||
| golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190425145619-16072639606e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| @@ -1715,8 +1757,11 @@ golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= | ||||
| golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= | ||||
| golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= | ||||
| golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= | ||||
| golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= | ||||
| golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= | ||||
| golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= | ||||
| golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= | ||||
| golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= | ||||
| golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= | ||||
| @@ -1730,6 +1775,9 @@ golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= | ||||
| golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= | ||||
| golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= | ||||
| golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= | ||||
| golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= | ||||
| golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= | ||||
| golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= | ||||
| golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||
| golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||
| golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||
| @@ -1750,16 +1798,18 @@ golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= | ||||
| golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= | ||||
| golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= | ||||
| golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= | ||||
| golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= | ||||
| golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= | ||||
| golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= | ||||
| golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= | ||||
| golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= | ||||
| golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= | ||||
| golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||
| golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||
| golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||
| golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||
| golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||
| golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||
| golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= | ||||
| golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= | ||||
| 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-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| @@ -1827,6 +1877,8 @@ golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= | ||||
| golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= | ||||
| golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= | ||||
| golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= | ||||
| golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= | ||||
| golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= | ||||
| 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= | ||||
| @@ -2077,8 +2129,8 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go. | ||||
| google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= | ||||
| google.golang.org/genproto/googleapis/rpc v0.0.0-20230731190214-cbb8c96f2d6d/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= | ||||
| google.golang.org/genproto/googleapis/rpc v0.0.0-20230807174057-1744710a1577/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= | ||||
| google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= | ||||
| google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= | ||||
| google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53 h1:X58yt85/IXCx0Y3ZwN6sEIKZzQtDEYaBWrDvErdXrRE= | ||||
| google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= | ||||
| google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= | ||||
| google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= | ||||
| google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= | ||||
| @@ -2124,8 +2176,8 @@ google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGO | ||||
| google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= | ||||
| google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= | ||||
| google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= | ||||
| google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= | ||||
| google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= | ||||
| google.golang.org/grpc v1.69.2 h1:U3S9QEtbXC0bYNvRtcoklF3xGtLViumSYxWykJS+7AU= | ||||
| google.golang.org/grpc v1.69.2/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= | ||||
| google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= | ||||
| google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= | ||||
| google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= | ||||
| @@ -2145,8 +2197,8 @@ google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw | ||||
| google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= | ||||
| google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= | ||||
| google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= | ||||
| google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= | ||||
| google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= | ||||
| google.golang.org/protobuf v1.36.2 h1:R8FeyR1/eLmkutZOM5CWghmo5itiG9z0ktFlTVLuTmU= | ||||
| google.golang.org/protobuf v1.36.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= | ||||
| gopkg.in/Acconut/lockfile.v1 v1.1.0/go.mod h1:6UCz3wJ8tSFUsPR6uP/j8uegEtDuEEqFxlpi0JI4Umw= | ||||
| gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= | ||||
| gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk= | ||||
| @@ -2180,8 +2232,8 @@ gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | ||||
| gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo= | ||||
| gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM= | ||||
| gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= | ||||
| gorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s= | ||||
| gorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= | ||||
| gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8= | ||||
| gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ= | ||||
| honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | ||||
| honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | ||||
| honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | ||||
| @@ -2190,6 +2242,8 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt | ||||
| honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= | ||||
| honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= | ||||
| honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= | ||||
| howett.net/plist v0.0.0-20181124034731-591f970eefbb h1:jhnBjNi9UFpfpl8YZhA9CrOqpnJdvzuiHsl/dnxl11M= | ||||
| howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= | ||||
| lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= | ||||
| lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= | ||||
| modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= | ||||
| @@ -2207,6 +2261,8 @@ modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJD | ||||
| modernc.org/ccgo/v3 v3.16.13-0.20221017192402-261537637ce8/go.mod h1:fUB3Vn0nVPReA+7IG7yZDfjv1TMWjhQP8gCxrFAtL5g= | ||||
| modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= | ||||
| modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= | ||||
| modernc.org/fileutil v1.0.0 h1:Z1AFLZwl6BO8A5NldQg/xTSjGLetp+1Ubvl4alfGx8w= | ||||
| modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8= | ||||
| modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= | ||||
| modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= | ||||
| modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= | ||||
|   | ||||
| @@ -4,7 +4,7 @@ import ( | ||||
| 	"archive/zip" | ||||
| 	"bytes" | ||||
| 	"fmt" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/android_binary" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/android_binary" | ||||
| 	"image" | ||||
| 	"io" | ||||
| 	"os" | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| package apk | ||||
|  | ||||
| import "git.bvbej.com/bvbej/base-golang/pkg/android_binary" | ||||
| import "gitea.bvbej.com/bvbej/base-golang/pkg/android_binary" | ||||
|  | ||||
| // Instrumentation is an application instrumentation code. | ||||
| type Instrumentation struct { | ||||
|   | ||||
| @@ -3,7 +3,7 @@ package ants | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/ticker" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/ticker" | ||||
| 	"github.com/panjf2000/ants/v2" | ||||
| 	"go.uber.org/zap" | ||||
| 	"runtime/debug" | ||||
|   | ||||
| @@ -3,7 +3,7 @@ package apollo | ||||
| import ( | ||||
| 	"fmt" | ||||
|  | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/env" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/env" | ||||
| 	"github.com/apolloconfig/agollo/v4" | ||||
| 	"github.com/apolloconfig/agollo/v4/component/log" | ||||
| 	apolloConfig "github.com/apolloconfig/agollo/v4/env/config" | ||||
|   | ||||
| @@ -6,7 +6,7 @@ import ( | ||||
| 	"strings" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/golang-jwt/jwt/v4" | ||||
| 	"github.com/golang-jwt/jwt/v5" | ||||
| 	"github.com/google/uuid" | ||||
| ) | ||||
|  | ||||
|   | ||||
							
								
								
									
										4
									
								
								pkg/cache/redis.go
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								pkg/cache/redis.go
									
									
									
									
										vendored
									
									
								
							| @@ -6,8 +6,8 @@ import ( | ||||
| 	"fmt" | ||||
| 	"time" | ||||
|  | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/time_parse" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/trace" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/time_parse" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/trace" | ||||
| 	"github.com/redis/go-redis/v9" | ||||
| ) | ||||
|  | ||||
|   | ||||
| @@ -2,7 +2,7 @@ package captcha | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/cache" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/cache" | ||||
| 	"github.com/mojocn/base64Captcha" | ||||
| 	"go.uber.org/zap" | ||||
| 	"strings" | ||||
|   | ||||
| @@ -7,8 +7,8 @@ import ( | ||||
| 	"os" | ||||
| 	"time" | ||||
|  | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/time_parse" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/trace" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/time_parse" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/trace" | ||||
| 	"gorm.io/driver/mysql" | ||||
| 	"gorm.io/gorm" | ||||
| 	"gorm.io/gorm/logger" | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| package database | ||||
|  | ||||
| import "git.bvbej.com/bvbej/base-golang/pkg/trace" | ||||
| import "gitea.bvbej.com/bvbej/base-golang/pkg/trace" | ||||
|  | ||||
| type Trace = trace.T | ||||
|  | ||||
|   | ||||
							
								
								
									
										23
									
								
								pkg/downloader/base/constants.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								pkg/downloader/base/constants.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| package base | ||||
|  | ||||
| type Status int | ||||
|  | ||||
| const ( | ||||
| 	DownloadStatusReady Status = iota | ||||
| 	DownloadStatusStart | ||||
| 	DownloadStatusPause | ||||
| 	DownloadStatusError | ||||
| 	DownloadStatusDone | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	HttpCodeOK             = 200 | ||||
| 	HttpCodePartialContent = 206 | ||||
|  | ||||
| 	HttpHeaderRange              = "Range" | ||||
| 	HttpHeaderContentLength      = "Content-Length" | ||||
| 	HttpHeaderContentRange       = "Content-Range" | ||||
| 	HttpHeaderContentDisposition = "Content-Disposition" | ||||
|  | ||||
| 	HttpHeaderRangeFormat = "bytes=%d-%d" | ||||
| ) | ||||
							
								
								
									
										37
									
								
								pkg/downloader/base/model.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								pkg/downloader/base/model.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| package base | ||||
|  | ||||
| // Request 下载请求 | ||||
| type Request struct { | ||||
| 	// 下载链接 | ||||
| 	URL string | ||||
| 	// 附加信息 | ||||
| 	Extra any | ||||
| } | ||||
|  | ||||
| // Resource 资源信息 | ||||
| type Resource struct { | ||||
| 	Req *Request | ||||
| 	// 资源总大小 | ||||
| 	TotalSize int64 | ||||
| 	// 是否支持断点下载 | ||||
| 	Range bool | ||||
| 	// 资源所包含的文件列表 | ||||
| 	Files []*FileInfo | ||||
| } | ||||
|  | ||||
| // FileInfo 文件信息 | ||||
| type FileInfo struct { | ||||
| 	Name string | ||||
| 	Path string | ||||
| 	Size int64 | ||||
| } | ||||
|  | ||||
| // Options 下载选项 | ||||
| type Options struct { | ||||
| 	// 保存文件名 | ||||
| 	Name string | ||||
| 	// 保存目录 | ||||
| 	Path string | ||||
| 	// 并发连接数 | ||||
| 	Connections int | ||||
| } | ||||
							
								
								
									
										184
									
								
								pkg/downloader/controller/controller.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										184
									
								
								pkg/downloader/controller/controller.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,184 @@ | ||||
| package controller | ||||
|  | ||||
| import ( | ||||
| 	"golang.org/x/net/proxy" | ||||
| 	"net" | ||||
| 	"net/http" | ||||
| 	"net/url" | ||||
| 	"os" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| type Controller interface { | ||||
| 	Touch(name string, size int64) (file *os.File, err error) | ||||
| 	Open(name string) (file *os.File, err error) | ||||
| 	Write(name string, offset int64, buf []byte) (int, error) | ||||
| 	Close(name string) error | ||||
| 	ContextDialer() (proxy.Dialer, error) | ||||
| 	ContextCookie() http.CookieJar | ||||
| 	ContextTimeout() time.Duration | ||||
| 	ContextInsecureSkipVerify() bool | ||||
| 	ContextProxy() func(*http.Request) (*url.URL, error) | ||||
| } | ||||
|  | ||||
| type Option func(*option) | ||||
|  | ||||
| type option struct { | ||||
| 	CookieJar          http.CookieJar | ||||
| 	Timeout            time.Duration | ||||
| 	Dialer             proxy.Dialer | ||||
| 	InsecureSkipVerify bool | ||||
| 	Proxy              func(*http.Request) (*url.URL, error) | ||||
| } | ||||
|  | ||||
| func WithCookie(cookieJar http.CookieJar) Option { | ||||
| 	return func(opt *option) { | ||||
| 		opt.CookieJar = cookieJar | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func WithTimeout(timeout time.Duration) Option { | ||||
| 	return func(opt *option) { | ||||
| 		opt.Timeout = timeout | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func WithDialer(dialer proxy.Dialer) Option { | ||||
| 	return func(opt *option) { | ||||
| 		opt.Dialer = dialer | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func WithProxy(fn func(*http.Request) (*url.URL, error)) Option { | ||||
| 	return func(opt *option) { | ||||
| 		opt.Proxy = fn | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func WithInsecureSkipVerify(insecure bool) Option { | ||||
| 	return func(opt *option) { | ||||
| 		opt.InsecureSkipVerify = insecure | ||||
| 	} | ||||
| } | ||||
|  | ||||
| type DefaultController struct { | ||||
| 	*option | ||||
| 	Files map[string]*os.File | ||||
| } | ||||
|  | ||||
| func NewController(options ...Option) *DefaultController { | ||||
| 	opt := new(option) | ||||
| 	for _, f := range options { | ||||
| 		f(opt) | ||||
| 	} | ||||
| 	if opt.Timeout == 0 { | ||||
| 		opt.Timeout = time.Second * 30 | ||||
| 	} | ||||
| 	if opt.Dialer == nil { | ||||
| 		opt.Dialer = proxy.FromEnvironment() | ||||
| 	} | ||||
| 	return &DefaultController{ | ||||
| 		Files:  make(map[string]*os.File), | ||||
| 		option: opt, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (c *DefaultController) Touch(name string, size int64) (file *os.File, err error) { | ||||
| 	file, err = os.Create(name) | ||||
| 	if size > 0 { | ||||
| 		err = os.Truncate(name, size) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 	} | ||||
| 	if err == nil { | ||||
| 		c.Files[name] = file | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func (c *DefaultController) Open(name string) (file *os.File, err error) { | ||||
| 	file, err = os.OpenFile(name, os.O_RDWR, os.ModePerm) | ||||
| 	if err == nil { | ||||
| 		c.Files[name] = file | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func (c *DefaultController) Write(name string, offset int64, buf []byte) (int, error) { | ||||
| 	return c.Files[name].WriteAt(buf, offset) | ||||
| } | ||||
|  | ||||
| func (c *DefaultController) Close(name string) error { | ||||
| 	err := c.Files[name].Close() | ||||
| 	delete(c.Files, name) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| func (c *DefaultController) ContextDialer() (proxy.Dialer, error) { | ||||
| 	return &DialerWarp{dialer: c.Dialer}, nil | ||||
| } | ||||
|  | ||||
| func (c *DefaultController) ContextCookie() http.CookieJar { | ||||
| 	return c.CookieJar | ||||
| } | ||||
|  | ||||
| func (c *DefaultController) ContextTimeout() time.Duration { | ||||
| 	return c.Timeout | ||||
| } | ||||
|  | ||||
| func (c *DefaultController) ContextInsecureSkipVerify() bool { | ||||
| 	return c.InsecureSkipVerify | ||||
| } | ||||
|  | ||||
| func (c *DefaultController) ContextProxy() func(*http.Request) (*url.URL, error) { | ||||
| 	return c.Proxy | ||||
| } | ||||
|  | ||||
| type DialerWarp struct { | ||||
| 	dialer proxy.Dialer | ||||
| } | ||||
|  | ||||
| type ConnWarp struct { | ||||
| 	conn net.Conn | ||||
| } | ||||
|  | ||||
| func (c *ConnWarp) Read(b []byte) (n int, err error) { | ||||
| 	return c.conn.Read(b) | ||||
| } | ||||
|  | ||||
| func (c *ConnWarp) Write(b []byte) (n int, err error) { | ||||
| 	return c.conn.Write(b) | ||||
| } | ||||
|  | ||||
| func (c *ConnWarp) Close() error { | ||||
| 	return c.conn.Close() | ||||
| } | ||||
|  | ||||
| func (c *ConnWarp) LocalAddr() net.Addr { | ||||
| 	return c.conn.LocalAddr() | ||||
| } | ||||
|  | ||||
| func (c *ConnWarp) RemoteAddr() net.Addr { | ||||
| 	return c.conn.RemoteAddr() | ||||
| } | ||||
|  | ||||
| func (c *ConnWarp) SetDeadline(t time.Time) error { | ||||
| 	return c.conn.SetDeadline(t) | ||||
| } | ||||
|  | ||||
| func (c *ConnWarp) SetReadDeadline(t time.Time) error { | ||||
| 	return c.conn.SetReadDeadline(t) | ||||
| } | ||||
|  | ||||
| func (c *ConnWarp) SetWriteDeadline(t time.Time) error { | ||||
| 	return c.conn.SetWriteDeadline(t) | ||||
| } | ||||
|  | ||||
| func (d *DialerWarp) Dial(network, addr string) (c net.Conn, err error) { | ||||
| 	conn, err := d.dialer.Dial(network, addr) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return &ConnWarp{conn: conn}, nil | ||||
| } | ||||
| @@ -2,11 +2,11 @@ package downloader | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/downloader/base" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/downloader/controller" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/downloader/fetcher" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/downloader/protocol/http" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/downloader/util" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/downloader/base" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/downloader/controller" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/downloader/fetcher" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/downloader/protocol/http" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/downloader/util" | ||||
| 	"github.com/google/uuid" | ||||
| 	"net/url" | ||||
| 	"strings" | ||||
|   | ||||
| @@ -2,9 +2,9 @@ package downloader | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/downloader/base" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/downloader/controller" | ||||
| 	"git.bvbej.com/bvbej/base-golang/tool" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/downloader/base" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/downloader/controller" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/tool" | ||||
| 	"golang.org/x/net/proxy" | ||||
| 	"net/http" | ||||
| 	"net/url" | ||||
| @@ -24,6 +24,7 @@ func TestNewDownloader(t *testing.T) { | ||||
| 		controller.WithCookie(nil), | ||||
| 		controller.WithProxy(http.ProxyURL(parse)), // todo: use http client proxy | ||||
| 		controller.WithTimeout(time.Second*3), | ||||
| 		controller.WithInsecureSkipVerify(true), | ||||
| 	).URL("http://10.0.1.34/com.tencent.tmgp.jxqy.apk"). | ||||
| 		Listener(func(event *Event) { | ||||
| 			if event.Key == EventKeyFinally { | ||||
|   | ||||
							
								
								
									
										52
									
								
								pkg/downloader/fetcher/fetcher.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								pkg/downloader/fetcher/fetcher.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,52 @@ | ||||
| package fetcher | ||||
|  | ||||
| import ( | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/downloader/base" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/downloader/controller" | ||||
| ) | ||||
|  | ||||
| // Fetcher 对应协议的下载支持 | ||||
| type Fetcher interface { | ||||
| 	// Setup 设置文件相关信息 | ||||
| 	Setup(ctl controller.Controller) | ||||
| 	// Resolve 解析请求 | ||||
| 	Resolve(req *base.Request) (res *base.Resource, err error) | ||||
| 	// Create 创建任务 | ||||
| 	Create(res *base.Resource, opts *base.Options) (err error) | ||||
| 	// Start 开始 | ||||
| 	Start() (err error) | ||||
| 	// Pause 暂停 | ||||
| 	Pause() (err error) | ||||
| 	// Continue 继续 | ||||
| 	Continue() (err error) | ||||
| 	// Progress 获取任务各个文件下载进度 | ||||
| 	Progress() Progress | ||||
| 	// Wait 该方法会一直阻塞,直到任务下载结束 | ||||
| 	Wait() (err error) | ||||
| } | ||||
|  | ||||
| type DefaultFetcher struct { | ||||
| 	Ctl    controller.Controller | ||||
| 	DoneCh chan error | ||||
| } | ||||
|  | ||||
| func (f *DefaultFetcher) Setup(ctl controller.Controller) { | ||||
| 	f.Ctl = ctl | ||||
| 	f.DoneCh = make(chan error, 1) | ||||
| } | ||||
|  | ||||
| func (f *DefaultFetcher) Wait() (err error) { | ||||
| 	return <-f.DoneCh | ||||
| } | ||||
|  | ||||
| // Progress 获取任务中各个文件的已下载字节数 | ||||
| type Progress []int64 | ||||
|  | ||||
| // TotalDownloaded 获取任务总下载字节数 | ||||
| func (p Progress) TotalDownloaded() int64 { | ||||
| 	total := int64(0) | ||||
| 	for _, d := range p { | ||||
| 		total += d | ||||
| 	} | ||||
| 	return total | ||||
| } | ||||
							
								
								
									
										413
									
								
								pkg/downloader/protocol/http/fetcher.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										413
									
								
								pkg/downloader/protocol/http/fetcher.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,413 @@ | ||||
| package http | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"context" | ||||
| 	"crypto/tls" | ||||
| 	"fmt" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/downloader/base" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/downloader/fetcher" | ||||
| 	"golang.org/x/sync/errgroup" | ||||
| 	"io" | ||||
| 	"mime" | ||||
| 	"net" | ||||
| 	"net/http" | ||||
| 	"net/url" | ||||
| 	"path" | ||||
| 	"path/filepath" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| type RequestError struct { | ||||
| 	Code int | ||||
| 	Msg  string | ||||
| } | ||||
|  | ||||
| func NewRequestError(code int, msg string) *RequestError { | ||||
| 	return &RequestError{Code: code, Msg: msg} | ||||
| } | ||||
|  | ||||
| func (re *RequestError) Error() string { | ||||
| 	return fmt.Sprintf("http request fail,code:%d", re.Code) | ||||
| } | ||||
|  | ||||
| type Fetcher struct { | ||||
| 	*fetcher.DefaultFetcher | ||||
|  | ||||
| 	res     *base.Resource | ||||
| 	opts    *base.Options | ||||
| 	status  base.Status | ||||
| 	clients []*http.Response | ||||
| 	chunks  []*Chunk | ||||
|  | ||||
| 	ctx     context.Context | ||||
| 	cancel  context.CancelFunc | ||||
| 	pauseCh chan any | ||||
| } | ||||
|  | ||||
| func NewFetcher() *Fetcher { | ||||
| 	return &Fetcher{ | ||||
| 		DefaultFetcher: new(fetcher.DefaultFetcher), | ||||
| 		pauseCh:        make(chan any), | ||||
| 	} | ||||
| } | ||||
|  | ||||
| var protocols = []string{"HTTP", "HTTPS"} | ||||
|  | ||||
| func FetcherBuilder() ([]string, func() fetcher.Fetcher) { | ||||
| 	return protocols, func() fetcher.Fetcher { | ||||
| 		return NewFetcher() | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (f *Fetcher) Resolve(req *base.Request) (*base.Resource, error) { | ||||
| 	httpReq, err := f.buildRequest(nil, req) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	client, err := f.buildClient() | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	// 只访问一个字节,测试资源是否支持Range请求 | ||||
| 	httpReq.Header.Set(base.HttpHeaderRange, fmt.Sprintf(base.HttpHeaderRangeFormat, 0, 0)) | ||||
| 	httpResp, err := client.Do(httpReq) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	// 拿到响应头就关闭,不用加defer | ||||
| 	_ = httpResp.Body.Close() | ||||
| 	res := &base.Resource{ | ||||
| 		Req:   req, | ||||
| 		Range: false, | ||||
| 		Files: []*base.FileInfo{}, | ||||
| 	} | ||||
| 	if base.HttpCodePartialContent == httpResp.StatusCode { | ||||
| 		// 返回206响应码表示支持断点下载 | ||||
| 		res.Range = true | ||||
| 		// 解析资源大小: bytes 0-1000/1001 => 1001 | ||||
| 		contentTotal := path.Base(httpResp.Header.Get(base.HttpHeaderContentRange)) | ||||
| 		if contentTotal != "" { | ||||
| 			parse, err := strconv.ParseInt(contentTotal, 10, 64) | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			res.TotalSize = parse | ||||
| 		} | ||||
| 	} else if base.HttpCodeOK == httpResp.StatusCode { | ||||
| 		// 返回200响应码,不支持断点下载,通过Content-Length头获取文件大小,获取不到的话可能是chunked编码 | ||||
| 		contentLength := httpResp.Header.Get(base.HttpHeaderContentLength) | ||||
| 		if contentLength != "" { | ||||
| 			parse, err := strconv.ParseInt(contentLength, 10, 64) | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			res.TotalSize = parse | ||||
| 		} | ||||
| 	} else { | ||||
| 		return nil, NewRequestError(httpResp.StatusCode, httpResp.Status) | ||||
| 	} | ||||
| 	file := &base.FileInfo{ | ||||
| 		Size: res.TotalSize, | ||||
| 	} | ||||
| 	contentDisposition := httpResp.Header.Get(base.HttpHeaderContentDisposition) | ||||
| 	if contentDisposition != "" { | ||||
| 		_, params, _ := mime.ParseMediaType(contentDisposition) | ||||
| 		filename := params["filename"] | ||||
| 		if filename != "" { | ||||
| 			file.Name = filename | ||||
| 		} | ||||
| 	} | ||||
| 	// Get file filename by URL | ||||
| 	if file.Name == "" && strings.Count(req.URL, "/") > 2 { | ||||
| 		file.Name = filepath.Base(req.URL) | ||||
| 	} | ||||
| 	// unknown file filename | ||||
| 	if file.Name == "" { | ||||
| 		file.Name = "unknown" | ||||
| 	} | ||||
| 	res.Files = append(res.Files, file) | ||||
| 	return res, nil | ||||
| } | ||||
|  | ||||
| func (f *Fetcher) Create(res *base.Resource, opts *base.Options) error { | ||||
| 	f.res = res | ||||
| 	f.opts = opts | ||||
| 	f.status = base.DownloadStatusReady | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (f *Fetcher) Start() (err error) { | ||||
| 	// 创建文件 | ||||
| 	name := f.filename() | ||||
| 	_, err = f.Ctl.Touch(name, f.res.TotalSize) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	f.status = base.DownloadStatusStart | ||||
| 	if f.res.Range { | ||||
| 		// 每个连接平均需要下载的分块大小 | ||||
| 		chunkSize := f.res.TotalSize / int64(f.opts.Connections) | ||||
| 		f.chunks = make([]*Chunk, f.opts.Connections) | ||||
| 		f.clients = make([]*http.Response, f.opts.Connections) | ||||
| 		for i := 0; i < f.opts.Connections; i++ { | ||||
| 			var ( | ||||
| 				begin = chunkSize * int64(i) | ||||
| 				end   int64 | ||||
| 			) | ||||
| 			if i == f.opts.Connections-1 { | ||||
| 				// 最后一个分块需要保证把文件下载完 | ||||
| 				end = f.res.TotalSize - 1 | ||||
| 			} else { | ||||
| 				end = begin + chunkSize - 1 | ||||
| 			} | ||||
| 			chunk := NewChunk(begin, end) | ||||
| 			f.chunks[i] = chunk | ||||
| 		} | ||||
| 	} else { | ||||
| 		// 只支持单连接下载 | ||||
| 		f.chunks = make([]*Chunk, 1) | ||||
| 		f.clients = make([]*http.Response, 1) | ||||
| 		f.chunks[0] = NewChunk(0, 0) | ||||
| 	} | ||||
| 	f.fetch() | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func (f *Fetcher) Pause() (err error) { | ||||
| 	if base.DownloadStatusStart != f.status { | ||||
| 		return | ||||
| 	} | ||||
| 	f.status = base.DownloadStatusPause | ||||
| 	f.cancel() | ||||
| 	<-f.pauseCh | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func (f *Fetcher) Continue() (err error) { | ||||
| 	if base.DownloadStatusStart == f.status || base.DownloadStatusDone == f.status { | ||||
| 		return | ||||
| 	} | ||||
| 	f.status = base.DownloadStatusStart | ||||
| 	var name = f.filename() | ||||
| 	_, err = f.Ctl.Open(name) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	f.fetch() | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func (f *Fetcher) Progress() fetcher.Progress { | ||||
| 	p := make(fetcher.Progress, 0) | ||||
| 	if len(f.chunks) > 0 { | ||||
| 		total := int64(0) | ||||
| 		for _, chunk := range f.chunks { | ||||
| 			total += chunk.Downloaded | ||||
| 		} | ||||
| 		p = append(p, total) | ||||
| 	} | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| func (f *Fetcher) filename() string { | ||||
| 	// 创建文件 | ||||
| 	var filename = f.opts.Name | ||||
| 	if filename == "" { | ||||
| 		filename = f.res.Files[0].Name | ||||
| 	} | ||||
| 	return filepath.Join(f.opts.Path, filename) | ||||
| } | ||||
|  | ||||
| func (f *Fetcher) fetch() { | ||||
| 	f.ctx, f.cancel = context.WithCancel(context.Background()) | ||||
| 	eg, _ := errgroup.WithContext(f.ctx) | ||||
| 	for i := 0; i < f.opts.Connections; i++ { | ||||
| 		eg.Go(func() error { | ||||
| 			return f.fetchChunk(i) | ||||
| 		}) | ||||
| 	} | ||||
|  | ||||
| 	go func() { | ||||
| 		err := eg.Wait() | ||||
| 		// 下载停止,关闭文件句柄 | ||||
| 		_ = f.Ctl.Close(f.filename()) | ||||
| 		if f.status == base.DownloadStatusPause { | ||||
| 			f.pauseCh <- nil | ||||
| 		} else { | ||||
| 			if err != nil { | ||||
| 				f.status = base.DownloadStatusError | ||||
| 			} else { | ||||
| 				f.status = base.DownloadStatusDone | ||||
| 			} | ||||
| 			f.DoneCh <- err | ||||
| 		} | ||||
| 	}() | ||||
| } | ||||
|  | ||||
| func (f *Fetcher) fetchChunk(index int) (err error) { | ||||
| 	filename := f.filename() | ||||
| 	chunk := f.chunks[index] | ||||
|  | ||||
| 	httpReq, err := f.buildRequest(f.ctx, f.res.Req) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	client, err := f.buildClient() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	var buf = make([]byte, 64*1024) // 64KB | ||||
|  | ||||
| 	// 重试10次 | ||||
| 	for i := 0; i < 10; i++ { | ||||
| 		// 如果下载完成直接返回 | ||||
| 		if chunk.Status == base.DownloadStatusDone { | ||||
| 			return | ||||
| 		} | ||||
| 		// 如果已暂停直接跳出 | ||||
| 		if f.status == base.DownloadStatusPause { | ||||
| 			break | ||||
| 		} | ||||
| 		var ( | ||||
| 			resp  *http.Response | ||||
| 			retry bool | ||||
| 		) | ||||
| 		if f.res.Range { | ||||
| 			httpReq.Header.Set(base.HttpHeaderRange, | ||||
| 				fmt.Sprintf(base.HttpHeaderRangeFormat, chunk.Begin+chunk.Downloaded, chunk.End)) | ||||
| 		} else { | ||||
| 			chunk.Downloaded = 0 | ||||
| 		} | ||||
| 		err = func() error { | ||||
| 			resp, err = client.Do(httpReq) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			f.clients[index] = resp | ||||
| 			if resp.StatusCode != base.HttpCodeOK && resp.StatusCode != base.HttpCodePartialContent { | ||||
| 				err = NewRequestError(resp.StatusCode, resp.Status) | ||||
| 				return err | ||||
| 			} | ||||
| 			return nil | ||||
| 		}() | ||||
| 		if err != nil { | ||||
| 			//请求失败3s后重试 | ||||
| 			time.Sleep(time.Second * 3) | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		// 请求成功就重置错误次数,连续失败10次才终止 | ||||
| 		i = 0 | ||||
|  | ||||
| 		retry, err = func() (bool, error) { | ||||
| 			defer func() { | ||||
| 				_ = resp.Body.Close() | ||||
| 			}() | ||||
| 			var n int | ||||
| 			for { | ||||
| 				n, err = resp.Body.Read(buf) | ||||
| 				if n > 0 { | ||||
| 					_, err = f.Ctl.Write(filename, chunk.Begin+chunk.Downloaded, buf[:n]) | ||||
| 					if err != nil { | ||||
| 						return false, err | ||||
| 					} | ||||
| 					chunk.Downloaded += int64(n) | ||||
| 				} | ||||
| 				if err != nil { | ||||
| 					if err != io.EOF { | ||||
| 						return true, err | ||||
| 					} | ||||
| 					break | ||||
| 				} | ||||
| 			} | ||||
| 			return false, nil | ||||
| 		}() | ||||
| 		if !retry { | ||||
| 			// 下载成功,跳出重试 | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if f.status == base.DownloadStatusPause { | ||||
| 		chunk.Status = base.DownloadStatusPause | ||||
| 	} else if chunk.Downloaded >= chunk.End-chunk.Begin+1 { | ||||
| 		chunk.Status = base.DownloadStatusDone | ||||
| 	} else { | ||||
| 		if err != nil { | ||||
| 			chunk.Status = base.DownloadStatusError | ||||
| 		} else { | ||||
| 			chunk.Status = base.DownloadStatusDone | ||||
| 		} | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func (f *Fetcher) buildClient() (*http.Client, error) { | ||||
| 	dialer, err := f.Ctl.ContextDialer() | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	transport := &http.Transport{ | ||||
| 		DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { | ||||
| 			return dialer.Dial(network, addr) | ||||
| 		}, | ||||
| 		TLSClientConfig: &tls.Config{ | ||||
| 			InsecureSkipVerify: f.Ctl.ContextInsecureSkipVerify(), | ||||
| 		}, | ||||
| 	} | ||||
| 	if f.Ctl.ContextProxy() != nil { | ||||
| 		transport.Proxy = f.Ctl.ContextProxy() | ||||
| 	} | ||||
| 	return &http.Client{ | ||||
| 		Jar:       f.Ctl.ContextCookie(), | ||||
| 		Timeout:   f.Ctl.ContextTimeout(), | ||||
| 		Transport: transport, | ||||
| 	}, nil | ||||
| } | ||||
|  | ||||
| func (f *Fetcher) buildRequest(ctx context.Context, req *base.Request) (httpReq *http.Request, err error) { | ||||
| 	reqUrl, err := url.Parse(req.URL) | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	var ( | ||||
| 		method string | ||||
| 		body   io.Reader | ||||
| 	) | ||||
| 	headers := make(map[string][]string) | ||||
| 	if req.Extra == nil { | ||||
| 		method = http.MethodGet | ||||
| 	} else { | ||||
| 		extra := req.Extra.(Extra) | ||||
| 		if extra.Method != "" { | ||||
| 			method = extra.Method | ||||
| 		} else { | ||||
| 			method = http.MethodGet | ||||
| 		} | ||||
| 		if len(extra.Header) > 0 { | ||||
| 			for k, v := range extra.Header { | ||||
| 				headers[k] = []string{v} | ||||
| 			} | ||||
| 		} | ||||
| 		if extra.Body != "" { | ||||
| 			body = io.NopCloser(bytes.NewBufferString(extra.Body)) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if ctx != nil { | ||||
| 		httpReq, err = http.NewRequestWithContext(ctx, method, reqUrl.String(), body) | ||||
| 	} else { | ||||
| 		httpReq, err = http.NewRequest(method, reqUrl.String(), body) | ||||
| 	} | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
| 	httpReq.Header = headers | ||||
| 	return httpReq, nil | ||||
| } | ||||
							
								
								
									
										24
									
								
								pkg/downloader/protocol/http/model.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								pkg/downloader/protocol/http/model.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | ||||
| package http | ||||
|  | ||||
| import "gitea.bvbej.com/bvbej/base-golang/pkg/downloader/base" | ||||
|  | ||||
| type Chunk struct { | ||||
| 	Status     base.Status | ||||
| 	Begin      int64 | ||||
| 	End        int64 | ||||
| 	Downloaded int64 | ||||
| } | ||||
|  | ||||
| func NewChunk(begin int64, end int64) *Chunk { | ||||
| 	return &Chunk{ | ||||
| 		Status: base.DownloadStatusReady, | ||||
| 		Begin:  begin, | ||||
| 		End:    end, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| type Extra struct { | ||||
| 	Method string | ||||
| 	Header map[string]string | ||||
| 	Body   string | ||||
| } | ||||
							
								
								
									
										25
									
								
								pkg/downloader/util/timer.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								pkg/downloader/util/timer.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| package util | ||||
|  | ||||
| import "time" | ||||
|  | ||||
| // Timer 计时器 | ||||
| type Timer struct { | ||||
| 	t    int64 | ||||
| 	used int64 | ||||
| } | ||||
|  | ||||
| func (t *Timer) Start() { | ||||
| 	t.t = time.Now().UnixNano() | ||||
| } | ||||
|  | ||||
| func (t *Timer) Pause() { | ||||
| 	t.used += time.Now().UnixNano() - t.t | ||||
| } | ||||
|  | ||||
| func (t *Timer) Continue() { | ||||
| 	t.t = time.Now().UnixNano() | ||||
| } | ||||
|  | ||||
| func (t *Timer) Used() int64 { | ||||
| 	return (time.Now().UnixNano() - t.t) + t.used | ||||
| } | ||||
| @@ -10,7 +10,7 @@ import ( | ||||
| 	httpURL "net/url" | ||||
| 	"time" | ||||
|  | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/trace" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/trace" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
|   | ||||
| @@ -4,7 +4,7 @@ import ( | ||||
| 	"sync" | ||||
| 	"time" | ||||
|  | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/trace" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/trace" | ||||
|  | ||||
| 	"go.uber.org/zap" | ||||
| ) | ||||
|   | ||||
| @@ -11,7 +11,7 @@ import ( | ||||
| 	"net/url" | ||||
| 	"time" | ||||
|  | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/trace" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/trace" | ||||
| 	"go.uber.org/zap" | ||||
| ) | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| package limiter | ||||
|  | ||||
| import ( | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/ticker" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/ticker" | ||||
| 	"golang.org/x/time/rate" | ||||
| 	"sync" | ||||
| 	"time" | ||||
|   | ||||
| @@ -9,8 +9,8 @@ import ( | ||||
| 	"strings" | ||||
| 	"sync" | ||||
|  | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/errno" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/trace" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/errno" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/trace" | ||||
|  | ||||
| 	"github.com/gin-gonic/gin" | ||||
| 	"github.com/gin-gonic/gin/binding" | ||||
|   | ||||
| @@ -8,12 +8,12 @@ import ( | ||||
| 	"runtime/debug" | ||||
| 	"time" | ||||
|  | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/color" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/env" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/errno" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/limiter" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/trace" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/validator" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/color" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/env" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/errno" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/limiter" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/trace" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/validator" | ||||
| 	"github.com/gin-contrib/pprof" | ||||
| 	"github.com/gin-gonic/gin" | ||||
| 	"github.com/gin-gonic/gin/binding" | ||||
|   | ||||
| @@ -4,7 +4,7 @@ import ( | ||||
| 	"fmt" | ||||
| 	"time" | ||||
|  | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/trace" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/trace" | ||||
| ) | ||||
|  | ||||
| type Option func(*option) | ||||
|   | ||||
| @@ -4,10 +4,15 @@ import ( | ||||
| 	"context" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/md5" | ||||
| 	"git.bvbej.com/bvbej/base-golang/tool" | ||||
| 	"github.com/qiniu/go-sdk/v7/auth/qbox" | ||||
| 	"github.com/qiniu/go-sdk/v7/storage" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/md5" | ||||
| 	"github.com/qiniu/go-sdk/v7/auth" | ||||
| 	"github.com/qiniu/go-sdk/v7/cdn" | ||||
| 	"github.com/qiniu/go-sdk/v7/storagev2/credentials" | ||||
| 	"github.com/qiniu/go-sdk/v7/storagev2/downloader" | ||||
| 	"github.com/qiniu/go-sdk/v7/storagev2/http_client" | ||||
| 	"github.com/qiniu/go-sdk/v7/storagev2/objects" | ||||
| 	"github.com/qiniu/go-sdk/v7/storagev2/uploader" | ||||
| 	"github.com/qiniu/go-sdk/v7/storagev2/uptoken" | ||||
| 	"github.com/tidwall/gjson" | ||||
| 	"io" | ||||
| 	"net/http" | ||||
| @@ -17,33 +22,37 @@ import ( | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| type Qhash string | ||||
|  | ||||
| const ( | ||||
| 	QSha1   Qhash = "sha1" | ||||
| 	QSha256 Qhash = "sha256" | ||||
| ) | ||||
|  | ||||
| var _ QiNiu = (*qiNiu)(nil) | ||||
|  | ||||
| type QiNiu interface { | ||||
| 	i() | ||||
| 	SetDefaultUploadTokenTTL(ttl uint64) | ||||
| 	GetCallbackUploadToken(ttl uint64, callbackURL string) string | ||||
| 	GetUploadToken(ttl uint64) string | ||||
| 	GetPrivateURL(key string, ttl uint64) string | ||||
| 	SetDefaultUploadTokenTTL(duration time.Duration) | ||||
| 	GetUploadToken() (string, error) | ||||
| 	GetCallbackUploadToken(callbackURL string) (string, error) | ||||
| 	TimestampSecuritySign(urlStr string, ttl time.Duration) (string, error) | ||||
| 	UploadFile(key, localFile, callbackURL string) (*PutRet, error) | ||||
| 	GetPrivateURL(key string, ttl time.Duration) (string, error) | ||||
| 	VerifyCallback(req *http.Request) (bool, error) | ||||
| 	UploadFile(key, localFile string) (*PutRet, error) | ||||
| 	ResumeUploadFile(key, localFile string) (*PutRet, error) | ||||
| 	GetFileInfo(key string) (*objects.ObjectDetails, error) | ||||
| 	DelFile(key string) error | ||||
| 	TimestampSecuritySign(path string, ttl time.Duration) string | ||||
| 	GetFileInfo(key string) *storage.FileInfo | ||||
| 	ListFiles(prefix, delimiter, marker string, limit int) (entries []storage.ListItem, commonPrefixes []string, nextMarker string, hasNext bool, err error) | ||||
| 	GetFileHash(path, qhash string) (hash string, err error) | ||||
| 	ListFiles(keyPrefix, marker string, limit uint64) ([]objects.ObjectDetails, error) | ||||
| 	GetFileHash(path string, qhash Qhash) (hash string, err error) | ||||
| } | ||||
|  | ||||
| type qiNiu struct { | ||||
| 	mac            *qbox.Mac | ||||
| 	bucketManager  *storage.BucketManager | ||||
| 	conf           *storage.Config | ||||
| 	bucket         string | ||||
| 	domain         string | ||||
| 	securityKey    string | ||||
| 	credentials    *auth.Credentials | ||||
| 	bucketManager  *objects.Bucket | ||||
| 	md5            md5.MD5 | ||||
| 	uploadTokenTTL uint64 | ||||
| 	uploadTokenTTL time.Duration | ||||
| } | ||||
|  | ||||
| type PutRet struct { | ||||
| @@ -57,166 +66,150 @@ type PutRet struct { | ||||
| } | ||||
|  | ||||
| func New(accessKey, secretKey, bucket, domain, securityKey string) QiNiu { | ||||
| 	region, _ := storage.GetRegion(accessKey, bucket) | ||||
| 	mac := qbox.NewMac(accessKey, secretKey) | ||||
| 	conf := &storage.Config{ | ||||
| 		Region:        region, //空间所在的存储区域 | ||||
| 		UseHTTPS:      true,   //是否使用https域名 | ||||
| 		UseCdnDomains: true,   //上传是否使用CDN上传加速 | ||||
| 	} | ||||
| 	cred := credentials.NewCredentials(accessKey, secretKey) | ||||
| 	objectsManager := objects.NewObjectsManager(&objects.ObjectsManagerOptions{ | ||||
| 		Options: http_client.Options{Credentials: cred}, | ||||
| 	}) | ||||
| 	return &qiNiu{ | ||||
| 		mac:            mac, | ||||
| 		bucketManager:  storage.NewBucketManager(mac, conf), | ||||
| 		bucket:         bucket, | ||||
| 		domain:         domain, | ||||
| 		securityKey:    securityKey, | ||||
| 		conf:           conf, | ||||
| 		credentials:    cred, | ||||
| 		bucketManager:  objectsManager.Bucket(bucket), | ||||
| 		md5:            md5.New(), | ||||
| 		uploadTokenTTL: 3600, | ||||
| 		uploadTokenTTL: time.Second * 3600, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (q *qiNiu) i() {} | ||||
|  | ||||
| func (q *qiNiu) SetDefaultUploadTokenTTL(ttl uint64) { | ||||
| 	q.uploadTokenTTL = ttl | ||||
| func (q *qiNiu) SetDefaultUploadTokenTTL(duration time.Duration) { | ||||
| 	q.uploadTokenTTL = duration | ||||
| } | ||||
|  | ||||
| func (q *qiNiu) GetUploadToken(ttl uint64) string { | ||||
| 	putPolicy := storage.PutPolicy{ | ||||
| 		Scope:   q.bucket, | ||||
| 		Expires: ttl, | ||||
| func (q *qiNiu) GetUploadToken() (string, error) { | ||||
| 	putPolicy, err := uptoken.NewPutPolicy(q.bucket, time.Now().Add(q.uploadTokenTTL)) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
| 	return putPolicy.UploadToken(q.mac) | ||||
| 	return uptoken.NewSigner(putPolicy, q.credentials).GetUpToken(context.Background()) | ||||
| } | ||||
|  | ||||
| func (q *qiNiu) GetCallbackUploadToken(ttl uint64, callbackURL string) string { | ||||
| 	putPolicy := storage.PutPolicy{ | ||||
| 		Scope:            q.bucket, | ||||
| 		CallbackURL:      callbackURL, | ||||
| 		CallbackBody:     `{"key":"$(key)","hash":"$(etag)","fname":"$(fname)","fsize":"$(fsize)","ext":"$(ext)","unique":"$(x:unique)","user":"$(x:user)"}`, | ||||
| 		CallbackBodyType: "application/json", | ||||
| 		Expires:          ttl, | ||||
| func (q *qiNiu) GetCallbackUploadToken(callbackURL string) (string, error) { | ||||
| 	putPolicy, err := uptoken.NewPutPolicy(q.bucket, time.Now().Add(q.uploadTokenTTL)) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
| 	return putPolicy.UploadToken(q.mac) | ||||
| 	putPolicy.SetCallbackUrl(callbackURL). | ||||
| 		SetCallbackBody(`{"key":"$(key)","hash":"$(etag)","fname":"$(fname)","fsize":"$(fsize)","ext":"$(ext)","unique":"$(x:unique)","user":"$(x:user)"}`). | ||||
| 		SetCallbackBodyType("application/json") | ||||
| 	return uptoken.NewSigner(putPolicy, q.credentials).GetUpToken(context.Background()) | ||||
| } | ||||
|  | ||||
| func (q *qiNiu) GetPrivateURL(key string, ttl uint64) string { | ||||
| 	deadline := time.Now().Add(time.Second * time.Duration(ttl)).Unix() | ||||
| 	return storage.MakePrivateURL(q.mac, q.domain, key, deadline) | ||||
| func (q *qiNiu) TimestampSecuritySign(urlStr string, ttl time.Duration) (string, error) { | ||||
| 	deadline := time.Now().Add(ttl).Unix() | ||||
| 	tUrl, err := cdn.CreateTimestampAntileechURL(urlStr, q.securityKey, deadline) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
| 	return tUrl, nil | ||||
| } | ||||
|  | ||||
| func (q *qiNiu) UploadFile(key, localFile, callbackURL string) (*PutRet, error) { | ||||
| 	putPolicy, err := uptoken.NewPutPolicy(q.bucket, time.Now().Add(q.uploadTokenTTL)) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	putPolicy.SetCallbackUrl(callbackURL). | ||||
| 		SetCallbackBody(`{"key":"$(key)","hash":"$(etag)","fname":"$(fname)","fsize":"$(fsize)","ext":"$(ext)","unique":"$(x:unique)","user":"$(x:user)"}`). | ||||
| 		SetCallbackBodyType("application/json") | ||||
|  | ||||
| 	ret := &PutRet{} | ||||
| 	filename := path.Base(key) | ||||
| 	fileSuffix := path.Ext(key) | ||||
| 	filePrefix := filename[0 : len(filename)-len(fileSuffix)] | ||||
| 	uploadManager := uploader.NewUploadManager(&uploader.UploadManagerOptions{}) | ||||
| 	err = uploadManager.UploadFile(context.Background(), localFile, &uploader.ObjectOptions{ | ||||
| 		UpToken:    uptoken.NewSigner(putPolicy, q.credentials), | ||||
| 		ObjectName: &key, | ||||
| 		CustomVars: map[string]string{ | ||||
| 			"unique": filePrefix, | ||||
| 			"user":   "api", | ||||
| 		}, | ||||
| 	}, ret) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	return ret, nil | ||||
| } | ||||
|  | ||||
| func (q *qiNiu) GetPrivateURL(key string, ttl time.Duration) (string, error) { | ||||
| 	urlsProvider := downloader.SignURLsProvider( | ||||
| 		downloader.NewStaticDomainBasedURLsProvider([]string{q.domain}), | ||||
| 		downloader.NewCredentialsSigner(q.credentials), | ||||
| 		&downloader.SignOptions{ | ||||
| 			TTL: ttl, | ||||
| 		}) | ||||
| 	iter, err := urlsProvider.GetURLsIter(context.Background(), key, &downloader.GenerateOptions{BucketName: q.bucket}) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
| 	res := url.URL{} | ||||
| 	peek, err := iter.Peek(&res) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
| 	if peek { | ||||
| 		return res.String(), nil | ||||
| 	} | ||||
| 	return "", errors.New("get private url false") | ||||
| } | ||||
|  | ||||
| func (q *qiNiu) VerifyCallback(req *http.Request) (bool, error) { | ||||
| 	return q.mac.VerifyCallback(req) | ||||
| 	return q.credentials.VerifyCallback(req) | ||||
| } | ||||
|  | ||||
| func (q *qiNiu) UploadFile(key, localFile string) (*PutRet, error) { | ||||
| 	upToken := q.GetUploadToken(q.uploadTokenTTL) | ||||
|  | ||||
| 	//构建表单上传的对象 | ||||
| 	formUploader := storage.NewFormUploader(q.conf) | ||||
|  | ||||
| 	//请求参数 | ||||
| 	filename := path.Base(key) | ||||
| 	fileSuffix := path.Ext(key) | ||||
| 	filePrefix := filename[0 : len(filename)-len(fileSuffix)] | ||||
| 	putExtra := &storage.PutExtra{ | ||||
| 		Params: map[string]string{ | ||||
| 			"x:unique": filePrefix, | ||||
| 			"x:user":   "-", | ||||
| 		}, | ||||
| 	} | ||||
|  | ||||
| 	//自定义返回body | ||||
| 	ret := new(PutRet) | ||||
|  | ||||
| 	err := formUploader.PutFile(context.Background(), ret, upToken, key, localFile, putExtra) | ||||
| func (q *qiNiu) GetFileInfo(key string) (*objects.ObjectDetails, error) { | ||||
| 	objectInfo, err := q.bucketManager.Object(key).Stat().Call(context.Background()) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	return ret, nil | ||||
| } | ||||
|  | ||||
| func (q *qiNiu) ResumeUploadFile(key, localFile string) (*PutRet, error) { | ||||
| 	upToken := q.GetUploadToken(q.uploadTokenTTL) | ||||
|  | ||||
| 	//构建分片上传的对象 | ||||
| 	resumeUploader := storage.NewResumeUploaderV2(q.conf) | ||||
|  | ||||
| 	//请求参数 | ||||
| 	filename := path.Base(key) | ||||
| 	fileSuffix := path.Ext(key) | ||||
| 	filePrefix := filename[0 : len(filename)-len(fileSuffix)] | ||||
| 	putExtra := &storage.RputV2Extra{ | ||||
| 		CustomVars: map[string]string{ | ||||
| 			"x:unique": filePrefix, | ||||
| 			"x:user":   "-", | ||||
| 		}, | ||||
| 	} | ||||
|  | ||||
| 	//自定义返回body | ||||
| 	ret := new(PutRet) | ||||
|  | ||||
| 	err := resumeUploader.PutFile(context.Background(), ret, upToken, key, localFile, putExtra) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	return ret, nil | ||||
| 	return objectInfo, nil | ||||
| } | ||||
|  | ||||
| func (q *qiNiu) DelFile(key string) error { | ||||
| 	err := q.bucketManager.Delete(q.bucket, key) | ||||
| 	err := q.bucketManager.Object(key).Delete().Call(context.Background()) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (q *qiNiu) TimestampSecuritySign(path string, ttl time.Duration) string { | ||||
| 	sep := "/" | ||||
| 	path = strings.Trim(path, sep) | ||||
| 	splits := strings.Split(path, sep) | ||||
| 	for i, split := range splits { | ||||
| 		splits[i] = url.QueryEscape(split) | ||||
| func (q *qiNiu) ListFiles(keyPrefix, marker string, limit uint64) ([]objects.ObjectDetails, error) { | ||||
| 	iter := q.bucketManager.List(context.Background(), &objects.ListObjectsOptions{ | ||||
| 		Limit:  &limit, | ||||
| 		Prefix: keyPrefix, | ||||
| 		Marker: marker, | ||||
| 	}) | ||||
| 	defer func() { | ||||
| 		_ = iter.Close() | ||||
| 	}() | ||||
| 	objectInfos := make([]objects.ObjectDetails, 0) | ||||
| 	var objectInfo objects.ObjectDetails | ||||
| 	for iter.Next(&objectInfo) { | ||||
| 		objectInfos = append(objectInfos, objectInfo) | ||||
| 	} | ||||
| 	path = sep + strings.Join(splits, sep) | ||||
|  | ||||
| 	unix := time.Now().Add(ttl).Unix() | ||||
| 	hex := fmt.Sprintf("%x", unix) | ||||
|  | ||||
| 	encrypt := q.md5.Encrypt(q.securityKey + path + hex) | ||||
|  | ||||
| 	param := make(url.Values) | ||||
| 	param.Set("sign", encrypt) | ||||
| 	param.Set("t", hex) | ||||
|  | ||||
| 	return param.Encode() | ||||
| 	if err := iter.Error(); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return objectInfos, nil | ||||
| } | ||||
|  | ||||
| func (q *qiNiu) GetFileInfo(key string) *storage.FileInfo { | ||||
| 	fileInfo, sErr := q.bucketManager.Stat(q.bucket, key) | ||||
| 	if sErr != nil { | ||||
| 		return nil | ||||
| func (q *qiNiu) GetFileHash(path string, qhash Qhash) (hash string, err error) { | ||||
| 	sign, err := q.TimestampSecuritySign(path, time.Second*5) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
|  | ||||
| 	return &fileInfo | ||||
| } | ||||
|  | ||||
| func (q *qiNiu) ListFiles(prefix, delimiter, marker string, limit int) (entries []storage.ListItem, | ||||
| 	commonPrefixes []string, nextMarker string, hasNext bool, err error) { | ||||
| 	return q.bucketManager.ListFiles(q.bucket, prefix, delimiter, marker, limit) | ||||
| } | ||||
|  | ||||
| func (q *qiNiu) GetFileHash(path, qhash string) (hash string, err error) { | ||||
| 	if !tool.InArray(qhash, []string{"sha1", "md5", "sha256"}) { | ||||
| 		return "", errors.New("qhash invalid") | ||||
| 	} | ||||
|  | ||||
| 	sign := q.TimestampSecuritySign(path, time.Second*5) | ||||
| 	addr := fmt.Sprintf("https://cdn.mogume.com/%s?%s&qhash/%s", path, sign, qhash) | ||||
| 	addr := fmt.Sprintf("%s/%s?%s&qhash/%s", strings.TrimRight(q.domain, "/"), path, sign, qhash) | ||||
|  | ||||
| 	resp, err := http.Get(addr) | ||||
| 	if err != nil { | ||||
|   | ||||
| @@ -10,7 +10,7 @@ import ( | ||||
| 	"net/url" | ||||
| 	"strings" | ||||
|  | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/time_parse" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/time_parse" | ||||
| ) | ||||
|  | ||||
| // Generate | ||||
|   | ||||
| @@ -11,7 +11,7 @@ import ( | ||||
| 	"strings" | ||||
| 	"time" | ||||
|  | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/time_parse" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/time_parse" | ||||
| ) | ||||
|  | ||||
| func (s *signature) Verify(authorization, date string, path string, method string, params url.Values) (ok bool, err error) { | ||||
|   | ||||
| @@ -1,23 +1,27 @@ | ||||
| package sse | ||||
|  | ||||
| import ( | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/mux" | ||||
| 	"github.com/gin-gonic/gin" | ||||
| 	"io" | ||||
| 	"net/http" | ||||
| 	"sync" | ||||
| 	"sync/atomic" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| var _ Server = (*event)(nil) | ||||
|  | ||||
| type Server interface { | ||||
| 	HandlerFunc(auth func(c *gin.Context) (string, error)) gin.HandlerFunc | ||||
| 	Push(user, name, msg string) bool | ||||
| 	HandlerFunc() mux.HandlerFunc | ||||
| 	GinHandlerFunc(auth func(c *gin.Context) (string, error)) gin.HandlerFunc | ||||
| 	Push(user any, name, msg string) bool | ||||
| 	Broadcast(name, msg string) | ||||
| 	ClientCount() int32 | ||||
| } | ||||
|  | ||||
| type clientChan struct { | ||||
| 	User string | ||||
| 	User any | ||||
| 	Chan chan msgChan | ||||
| } | ||||
|  | ||||
| @@ -29,9 +33,8 @@ type msgChan struct { | ||||
| type event struct { | ||||
| 	SessionList sync.Map | ||||
| 	Count       atomic.Int32 | ||||
|  | ||||
| 	Register    chan clientChan | ||||
| 	Unregister chan string | ||||
| 	Unregister  chan any | ||||
| } | ||||
|  | ||||
| func NewServer() Server { | ||||
| @@ -39,7 +42,7 @@ func NewServer() Server { | ||||
| 		SessionList: sync.Map{}, | ||||
| 		Count:       atomic.Int32{}, | ||||
| 		Register:    make(chan clientChan), | ||||
| 		Unregister:  make(chan string), | ||||
| 		Unregister:  make(chan any), | ||||
| 	} | ||||
|  | ||||
| 	go e.listen() | ||||
| @@ -65,7 +68,44 @@ func (stream *event) listen() { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (stream *event) HandlerFunc(auth func(c *gin.Context) (string, error)) gin.HandlerFunc { | ||||
| func (stream *event) HandlerFunc() mux.HandlerFunc { | ||||
| 	return func(c mux.Context) { | ||||
| 		auth := c.Auth() | ||||
| 		if auth == nil { | ||||
| 			c.Context().AbortWithStatus(http.StatusBadRequest) | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		e := make(chan msgChan) | ||||
| 		client := clientChan{ | ||||
| 			User: auth, | ||||
| 			Chan: e, | ||||
| 		} | ||||
| 		stream.Register <- client | ||||
| 		defer func() { | ||||
| 			stream.Unregister <- auth | ||||
| 		}() | ||||
|  | ||||
| 		c.Context().Writer.Header().Set("Content-Type", "text/event-stream") | ||||
| 		c.Context().Writer.Header().Set("Cache-Control", "no-cache") | ||||
| 		c.Context().Writer.Header().Set("Connection", "keep-alive") | ||||
| 		c.Context().Writer.Header().Set("Transfer-Encoding", "chunked") | ||||
|  | ||||
| 		time.AfterFunc(time.Second, func() { | ||||
| 			e <- msgChan{Name: "message", Message: "success"} | ||||
| 		}) | ||||
|  | ||||
| 		c.Context().Stream(func(w io.Writer) bool { | ||||
| 			if msg, ok := <-e; ok { | ||||
| 				c.Context().SSEvent(msg.Name, msg.Message) | ||||
| 				return true | ||||
| 			} | ||||
| 			return false | ||||
| 		}) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (stream *event) GinHandlerFunc(auth func(c *gin.Context) (string, error)) gin.HandlerFunc { | ||||
| 	return func(c *gin.Context) { | ||||
| 		user, err := auth(c) | ||||
| 		if err != nil { | ||||
| @@ -88,6 +128,10 @@ func (stream *event) HandlerFunc(auth func(c *gin.Context) (string, error)) gin. | ||||
| 		c.Writer.Header().Set("Connection", "keep-alive") | ||||
| 		c.Writer.Header().Set("Transfer-Encoding", "chunked") | ||||
|  | ||||
| 		time.AfterFunc(time.Second, func() { | ||||
| 			e <- msgChan{Name: "message", Message: "success"} | ||||
| 		}) | ||||
|  | ||||
| 		c.Stream(func(w io.Writer) bool { | ||||
| 			if msg, ok := <-e; ok { | ||||
| 				c.SSEvent(msg.Name, msg.Message) | ||||
| @@ -95,12 +139,10 @@ func (stream *event) HandlerFunc(auth func(c *gin.Context) (string, error)) gin. | ||||
| 			} | ||||
| 			return false | ||||
| 		}) | ||||
|  | ||||
| 		c.Next() | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (stream *event) Push(user, name, msg string) bool { | ||||
| func (stream *event) Push(user any, name, msg string) bool { | ||||
| 	value, ok := stream.SessionList.Load(user) | ||||
| 	if ok { | ||||
| 		val := value.(chan msgChan) | ||||
| @@ -116,3 +158,7 @@ func (stream *event) Broadcast(name, msg string) { | ||||
| 		return true | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func (stream *event) ClientCount() int32 { | ||||
| 	return stream.Count.Load() | ||||
| } | ||||
|   | ||||
| @@ -4,7 +4,7 @@ import ( | ||||
| 	"net/url" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/golang-jwt/jwt/v4" | ||||
| 	"github.com/golang-jwt/jwt/v5" | ||||
| ) | ||||
|  | ||||
| var _ Token = (*token)(nil) | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| package token | ||||
|  | ||||
| import ( | ||||
| 	"github.com/golang-jwt/jwt/v4" | ||||
| 	"github.com/golang-jwt/jwt/v5" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
|   | ||||
| @@ -5,9 +5,9 @@ import ( | ||||
| 	"crypto/sha256" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/color" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/ticker" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/token" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/color" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/ticker" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/token" | ||||
| 	"github.com/rs/cors" | ||||
| 	"github.com/tus/tusd/pkg/filestore" | ||||
| 	tus "github.com/tus/tusd/pkg/handler" | ||||
|   | ||||
| @@ -3,12 +3,12 @@ package client | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/ticker" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/websocket/client/service" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/websocket/codec" | ||||
| 	_ "git.bvbej.com/bvbej/base-golang/pkg/websocket/codec/json" | ||||
| 	_ "git.bvbej.com/bvbej/base-golang/pkg/websocket/codec/protobuf" | ||||
| 	"git.bvbej.com/bvbej/base-golang/tool" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/ticker" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/websocket/client/service" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/websocket/codec" | ||||
| 	_ "gitea.bvbej.com/bvbej/base-golang/pkg/websocket/codec/json" | ||||
| 	_ "gitea.bvbej.com/bvbej/base-golang/pkg/websocket/codec/protobuf" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/tool" | ||||
| 	"github.com/gorilla/websocket" | ||||
| 	"go.uber.org/zap" | ||||
| 	"net/http" | ||||
|   | ||||
| @@ -2,8 +2,8 @@ package service | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/websocket/codec" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/websocket/util" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/websocket/codec" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/websocket/util" | ||||
| 	"reflect" | ||||
| 	"strings" | ||||
| ) | ||||
|   | ||||
| @@ -5,7 +5,7 @@ import ( | ||||
| 	"encoding/json" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/websocket/codec" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/websocket/codec" | ||||
| ) | ||||
|  | ||||
| type jsonCodec struct{} | ||||
|   | ||||
| @@ -4,8 +4,8 @@ import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
|  | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/websocket/codec" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/websocket/codec/protobuf/protocol" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/websocket/codec" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/websocket/codec/protobuf/protocol" | ||||
| 	"google.golang.org/protobuf/proto" | ||||
| ) | ||||
|  | ||||
|   | ||||
| @@ -4,14 +4,14 @@ import ( | ||||
| 	"context" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/mux" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/mux" | ||||
| 	"github.com/gin-gonic/gin" | ||||
| 	"go.uber.org/zap" | ||||
| 	"net/http" | ||||
| 	"net/url" | ||||
| 	"time" | ||||
|  | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/websocket/peer" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/websocket/peer" | ||||
| 	"github.com/gorilla/websocket" | ||||
| ) | ||||
|  | ||||
|   | ||||
| @@ -4,7 +4,7 @@ import ( | ||||
| 	"errors" | ||||
| 	"time" | ||||
|  | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/websocket/peer" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/websocket/peer" | ||||
| 	"github.com/gorilla/websocket" | ||||
| ) | ||||
|  | ||||
|   | ||||
| @@ -3,7 +3,7 @@ package service | ||||
| import ( | ||||
| 	"time" | ||||
|  | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/websocket/peer" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/websocket/peer" | ||||
| ) | ||||
|  | ||||
| type Component interface { | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| package service | ||||
|  | ||||
| import ( | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/websocket/peer" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/websocket/peer" | ||||
| 	"reflect" | ||||
| ) | ||||
|  | ||||
|   | ||||
| @@ -2,11 +2,11 @@ package service | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/websocket/util" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/websocket/util" | ||||
| 	"reflect" | ||||
| 	"strings" | ||||
|  | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/websocket/peer" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/websocket/peer" | ||||
| ) | ||||
|  | ||||
| type Handler struct { | ||||
|   | ||||
| @@ -2,9 +2,9 @@ package service | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/websocket/codec" | ||||
| 	_ "git.bvbej.com/bvbej/base-golang/pkg/websocket/codec/json" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/websocket/peer" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/websocket/codec" | ||||
| 	_ "gitea.bvbej.com/bvbej/base-golang/pkg/websocket/codec/json" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/websocket/peer" | ||||
| 	"go.uber.org/zap" | ||||
| ) | ||||
|  | ||||
|   | ||||
| @@ -6,7 +6,7 @@ import ( | ||||
| 	"strings" | ||||
| 	"time" | ||||
|  | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/websocket/peer" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/websocket/peer" | ||||
| ) | ||||
|  | ||||
| type callBackEntity struct{} | ||||
|   | ||||
| @@ -5,6 +5,7 @@ import ( | ||||
| 	"bytes" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"github.com/spf13/cast" | ||||
| 	"io" | ||||
| 	"math" | ||||
| 	"math/rand" | ||||
| @@ -33,7 +34,7 @@ func GetOrderNumber() string { | ||||
| // ByteFmt 格式化显示文件大小 | ||||
| func ByteFmt(size int64) string { | ||||
| 	var unitArr = []string{"B", "KB", "MB", "GB", "TB", "EB"} | ||||
| 	if size == 0 { | ||||
| 	if size <= 0 { | ||||
| 		return "unknown" | ||||
| 	} | ||||
| 	fs := float64(size) | ||||
| @@ -43,7 +44,7 @@ func ByteFmt(size int64) string { | ||||
| 	if frac > 0 { | ||||
| 		return fmt.Sprintf("%.1f%s", math.Floor(val*10)/10, unitArr[p]) | ||||
| 	} else { | ||||
| 		return fmt.Sprintf("%d%s", int(val), unitArr[p]) | ||||
| 		return fmt.Sprintf("%d%s", cast.ToInt(val), unitArr[p]) | ||||
| 	} | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -2,10 +2,10 @@ package tool | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/aes" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/hmac" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/httpclient" | ||||
| 	"git.bvbej.com/bvbej/base-golang/pkg/time_parse" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/aes" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/hmac" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/httpclient" | ||||
| 	"gitea.bvbej.com/bvbej/base-golang/pkg/time_parse" | ||||
| 	"github.com/tidwall/gjson" | ||||
| 	netUrl "net/url" | ||||
| 	"strconv" | ||||
|   | ||||
		Reference in New Issue
	
	Block a user