15 Commits

Author SHA1 Message Date
23138f4e06 Merge pull request '[🚀] 七牛云SDK大改' (#18) from dev into main
Reviewed-on: #18
2024-09-29 10:26:43 +08:00
13c6b4345f [🚀] 七牛云SDK大改 2024-09-29 10:25:28 +08:00
1722fa82f8 Merge pull request '[🚀] version' (#17) from dev into main
Reviewed-on: #17
2024-09-27 15:27:00 +08:00
be752a59e0 [🚀] version 2024-09-27 15:26:28 +08:00
0c9b20d47f Merge pull request '[🚀] ClientCount' (#16) from dev into main
Reviewed-on: #16
2024-09-07 17:13:43 +08:00
1e33734ab1 [🚀] ClientCount 2024-09-07 17:13:43 +08:00
0c6e90e644 Merge pull request '[🚀] message' (#15) from dev into main
Reviewed-on: #15
2024-09-07 16:00:42 +08:00
3d5a4a1482 [🚀] message 2024-09-07 16:00:30 +08:00
a0b561237a Merge pull request 'dev' (#14) from dev into main
Reviewed-on: #14
2024-09-07 15:55:29 +08:00
ad1e06229f [🚀] message 2024-09-07 15:55:14 +08:00
e99a8dbcd6 [🚀] message 2024-09-07 15:53:46 +08:00
d3513ae4fa Merge pull request '[🚀] Ticker' (#13) from dev into main
Reviewed-on: #13
2024-09-07 15:44:39 +08:00
99264c6715 [🚀] Ticker 2024-09-07 15:44:13 +08:00
3c70ad2377 Merge pull request '[🚀] SSE FUN' (#12) from dev into main
Reviewed-on: #12
2024-09-07 15:13:47 +08:00
af451c08b8 [🚀] SSE FUN 2024-09-07 15:13:38 +08:00
4 changed files with 239 additions and 202 deletions

20
go.mod
View File

@ -1,12 +1,12 @@
module gitea.bvbej.com/bvbej/base-golang module gitea.bvbej.com/bvbej/base-golang
go 1.23.0 go 1.23.1
require ( require (
github.com/apolloconfig/agollo/v4 v4.4.0 github.com/apolloconfig/agollo/v4 v4.4.0
github.com/gin-contrib/pprof v1.5.0 github.com/gin-contrib/pprof v1.5.0
github.com/gin-gonic/gin v1.10.0 github.com/gin-gonic/gin v1.10.0
github.com/go-playground/validator/v10 v10.22.0 github.com/go-playground/validator/v10 v10.22.1
github.com/golang-jwt/jwt/v4 v4.5.0 github.com/golang-jwt/jwt/v4 v4.5.0
github.com/google/uuid v1.6.0 github.com/google/uuid v1.6.0
github.com/gorilla/websocket v1.5.3 github.com/gorilla/websocket v1.5.3
@ -15,8 +15,8 @@ require (
github.com/mojocn/base64Captcha v1.3.6 github.com/mojocn/base64Captcha v1.3.6
github.com/mritd/chinaid v1.0.4 github.com/mritd/chinaid v1.0.4
github.com/panjf2000/ants/v2 v2.10.0 github.com/panjf2000/ants/v2 v2.10.0
github.com/prometheus/client_golang v1.20.3 github.com/prometheus/client_golang v1.20.4
github.com/qiniu/go-sdk/v7 v7.22.0 github.com/qiniu/go-sdk/v7 v7.23.0
github.com/redis/go-redis/v9 v9.6.1 github.com/redis/go-redis/v9 v9.6.1
github.com/robfig/cron/v3 v3.0.1 github.com/robfig/cron/v3 v3.0.1
github.com/rs/cors v1.11.1 github.com/rs/cors v1.11.1
@ -25,11 +25,11 @@ require (
github.com/spf13/cast v1.7.0 github.com/spf13/cast v1.7.0
github.com/spf13/viper v1.19.0 github.com/spf13/viper v1.19.0
github.com/stretchr/testify v1.9.0 github.com/stretchr/testify v1.9.0
github.com/tidwall/buntdb v1.3.1 github.com/tidwall/buntdb v1.3.2
github.com/tidwall/gjson v1.17.3 github.com/tidwall/gjson v1.17.3
github.com/tus/tusd v1.13.0 github.com/tus/tusd v1.13.0
github.com/xuri/excelize/v2 v2.8.1 github.com/xuri/excelize/v2 v2.8.1
go.mongodb.org/mongo-driver v1.16.1 go.mongodb.org/mongo-driver v1.17.0
go.uber.org/atomic v1.11.0 go.uber.org/atomic v1.11.0
go.uber.org/multierr v1.11.0 go.uber.org/multierr v1.11.0
go.uber.org/zap v1.27.0 go.uber.org/zap v1.27.0
@ -37,12 +37,12 @@ require (
golang.org/x/net v0.29.0 golang.org/x/net v0.29.0
golang.org/x/sync v0.8.0 golang.org/x/sync v0.8.0
golang.org/x/time v0.6.0 golang.org/x/time v0.6.0
google.golang.org/grpc v1.66.0 google.golang.org/grpc v1.67.0
google.golang.org/protobuf v1.34.2 google.golang.org/protobuf v1.34.2
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
gopkg.in/natefinch/lumberjack.v2 v2.2.1 gopkg.in/natefinch/lumberjack.v2 v2.2.1
gorm.io/driver/mysql v1.5.7 gorm.io/driver/mysql v1.5.7
gorm.io/gorm v1.25.11 gorm.io/gorm v1.25.12
) )
require ( require (
@ -111,13 +111,13 @@ require (
github.com/xdg-go/stringprep v1.0.4 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect
github.com/xuri/efp v0.0.0-20231025114914-d1ff6096ae53 // indirect github.com/xuri/efp v0.0.0-20231025114914-d1ff6096ae53 // indirect
github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05 // indirect github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05 // indirect
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect
golang.org/x/arch v0.8.0 // indirect golang.org/x/arch v0.8.0 // indirect
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect
golang.org/x/image v0.14.0 // indirect golang.org/x/image v0.14.0 // indirect
golang.org/x/sys v0.25.0 // indirect golang.org/x/sys v0.25.0 // indirect
golang.org/x/text v0.18.0 // indirect golang.org/x/text v0.18.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect

36
go.sum
View File

@ -933,8 +933,8 @@ github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= 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/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
github.com/go-playground/validator/v10 v10.7.0/go.mod h1:xm76BBt941f7yWdGnI2DVPFFg1UK3YY04qifoXU3lOk= github.com/go-playground/validator/v10 v10.7.0/go.mod h1:xm76BBt941f7yWdGnI2DVPFFg1UK3YY04qifoXU3lOk=
github.com/go-playground/validator/v10 v10.22.0 h1:k6HsTZ0sTnROkhS//R0O+55JgM8C4Bx7ia+JlgcnOao= github.com/go-playground/validator/v10 v10.22.1 h1:40JcKH+bBNGFczGuoBYgX4I6m/i27HYW8P9FDk5PbgA=
github.com/go-playground/validator/v10 v10.22.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/go-playground/validator/v10 v10.22.1/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 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=
github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= 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/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
@ -1232,8 +1232,8 @@ 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.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.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.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc=
github.com/prometheus/client_golang v1.20.3 h1:oPksm4K8B+Vt35tUhw6GbSNSgVlVSBH0qELP/7u83l4= github.com/prometheus/client_golang v1.20.4 h1:Tgh3Yr67PaOv/uTqloMsCEdeuFTatm5zIq5+qNN23vI=
github.com/prometheus/client_golang v1.20.3/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_golang v1.20.4/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-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-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.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
@ -1260,8 +1260,8 @@ github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPH
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= 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/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/dyn v1.3.0/go.mod h1:E8oERcm8TtwJiZvkQPbcAh0RL8jO1G0VXJMW3FAWdkk=
github.com/qiniu/go-sdk/v7 v7.22.0 h1:NiRj6+beSkKsPBr4XN9OdjPJQKhERtOwOwu3HJtzcWQ= github.com/qiniu/go-sdk/v7 v7.23.0 h1:4wYB4EGE6MBhvjtE/FZH/mIUt/VH6WjzBucU3VfPwhg=
github.com/qiniu/go-sdk/v7 v7.22.0/go.mod h1:44lnyCs6gflCxMUV1yTBlZhPEB4ZO6LIDHkMV8Rofms= github.com/qiniu/go-sdk/v7 v7.23.0/go.mod h1:OXsAVU5YrLLtVi4iPFpP80jzb3SRBAczrGkcqQmWhcY=
github.com/qiniu/x v1.10.5/go.mod h1:03Ni9tj+N2h2aKnAz+6N0Xfl8FwMEDRC2PAlxekASDs= github.com/qiniu/x v1.10.5/go.mod h1:03Ni9tj+N2h2aKnAz+6N0Xfl8FwMEDRC2PAlxekASDs=
github.com/redis/go-redis/v9 v9.6.1 h1:HHDteefn6ZkTtY5fGUE8tj8uy85AHk6zP7CpzIAM0y4= github.com/redis/go-redis/v9 v9.6.1 h1:HHDteefn6ZkTtY5fGUE8tj8uy85AHk6zP7CpzIAM0y4=
github.com/redis/go-redis/v9 v9.6.1/go.mod h1:0C0c6ycQsdpVNQpxb1njEQIqkx5UcsM8FJCQLgE9+RA= github.com/redis/go-redis/v9 v9.6.1/go.mod h1:0C0c6ycQsdpVNQpxb1njEQIqkx5UcsM8FJCQLgE9+RA=
@ -1346,8 +1346,8 @@ 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/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 h1:PpkaieETJMUxYNADsjgtNRcERX7mGc/GP2zp/r5FM3g=
github.com/tidwall/btree v1.4.2/go.mod h1:LGm8L/DZjPLmeWGjv5kFrY8dL4uVhMmzmmLYmsObdKE= 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.2 h1:qd+IpdEGs0pZci37G4jF51+fSKlkuUTMXuHhXL1AkKg=
github.com/tidwall/buntdb v1.3.1/go.mod h1:lZZrZUWzlyDJKlLQ6DKAy53LnG7m5kHyrEHvvcDmBpU= 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.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
github.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94= github.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94=
github.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
@ -1383,8 +1383,8 @@ github.com/xuri/excelize/v2 v2.8.1 h1:pZLMEwK8ep+CLIUWpWmvW8IWE/yxqG0I1xcN6cVMGu
github.com/xuri/excelize/v2 v2.8.1/go.mod h1:oli1E4C3Pa5RXg1TBXn4ENCXDV5JUMlBluUhG7c+CEE= 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 h1:qhbILQo1K3mphbwKh1vNm4oGezE1eF9fQWmNiIpSfI4=
github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ= 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-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM=
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= 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.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.27/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= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
@ -1397,8 +1397,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/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/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.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=
go.mongodb.org/mongo-driver v1.16.1 h1:rIVLL3q0IHM39dvE+z2ulZLp9ENZKThVfuvN/IiN4l8= go.mongodb.org/mongo-driver v1.17.0 h1:Hp4q2MCjvY19ViwimTs00wHi7G4yzxh4/2+nTx8r40k=
go.mongodb.org/mongo-driver v1.16.1/go.mod h1:oB6AhJQvFQL4LEHyXi6aJzQJtBiTQHiAd83l0GdFaiw= go.mongodb.org/mongo-driver v1.17.0/go.mod h1:wwWm/+BuOddhcq3n68LKRmgk2wXzmF6s0SFOa0GINL4=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= 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.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
@ -2095,8 +2095,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-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-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-20230807174057-1744710a1577/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 h1:1GBuWVLM/KMVUv1t1En5Gs+gFZCNd360GGb4sSxtrhU= google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= 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.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
@ -2142,8 +2142,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.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s=
google.golang.org/grpc v1.56.2/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.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo=
google.golang.org/grpc v1.66.0 h1:DibZuoBznOxbDQxRINckZcUvnCEvrW9pcWIE2yF9r1c= google.golang.org/grpc v1.67.0 h1:IdH9y6PF5MPSdAntIcpjQ+tXO41pcQsfZV2RxtQgVcw=
google.golang.org/grpc v1.66.0/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= google.golang.org/grpc v1.67.0/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA=
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= 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-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
@ -2198,8 +2198,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 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo=
gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM= 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.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
gorm.io/gorm v1.25.11 h1:/Wfyg1B/je1hnDx3sMkX+gAlxrlZpn6X0BXRlwXlvHg= gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8=
gorm.io/gorm v1.25.11/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ= 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-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-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=

View File

@ -5,9 +5,14 @@ import (
"errors" "errors"
"fmt" "fmt"
"gitea.bvbej.com/bvbej/base-golang/pkg/md5" "gitea.bvbej.com/bvbej/base-golang/pkg/md5"
"gitea.bvbej.com/bvbej/base-golang/tool" "github.com/qiniu/go-sdk/v7/auth"
"github.com/qiniu/go-sdk/v7/auth/qbox" "github.com/qiniu/go-sdk/v7/cdn"
"github.com/qiniu/go-sdk/v7/storage" "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" "github.com/tidwall/gjson"
"io" "io"
"net/http" "net/http"
@ -17,33 +22,37 @@ import (
"time" "time"
) )
type Qhash string
const (
QSha1 Qhash = "sha1"
QSha256 Qhash = "sha256"
)
var _ QiNiu = (*qiNiu)(nil) var _ QiNiu = (*qiNiu)(nil)
type QiNiu interface { type QiNiu interface {
i() SetDefaultUploadTokenTTL(duration time.Duration)
SetDefaultUploadTokenTTL(ttl uint64) GetUploadToken() (string, error)
GetCallbackUploadToken(ttl uint64, callbackURL string) string GetCallbackUploadToken(callbackURL string) (string, error)
GetUploadToken(ttl uint64) string TimestampSecuritySign(urlStr string, ttl time.Duration) (string, error)
GetPrivateURL(key string, ttl uint64) string UploadFile(key, localFile, callbackURL string) (*PutRet, error)
GetPrivateURL(key string, ttl time.Duration) (string, error)
VerifyCallback(req *http.Request) (bool, error) VerifyCallback(req *http.Request) (bool, error)
UploadFile(key, localFile string) (*PutRet, error) GetFileInfo(key string) (*objects.ObjectDetails, error)
ResumeUploadFile(key, localFile string) (*PutRet, error)
DelFile(key string) error DelFile(key string) error
TimestampSecuritySign(path string, ttl time.Duration) string ListFiles(keyPrefix, marker string, limit uint64) ([]objects.ObjectDetails, error)
GetFileInfo(key string) *storage.FileInfo GetFileHash(path string, qhash Qhash) (hash string, err error)
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)
} }
type qiNiu struct { type qiNiu struct {
mac *qbox.Mac
bucketManager *storage.BucketManager
conf *storage.Config
bucket string bucket string
domain string domain string
securityKey string securityKey string
credentials *auth.Credentials
bucketManager *objects.Bucket
md5 md5.MD5 md5 md5.MD5
uploadTokenTTL uint64 uploadTokenTTL time.Duration
} }
type PutRet struct { type PutRet struct {
@ -57,163 +66,149 @@ type PutRet struct {
} }
func New(accessKey, secretKey, bucket, domain, securityKey string) QiNiu { func New(accessKey, secretKey, bucket, domain, securityKey string) QiNiu {
mac := qbox.NewMac(accessKey, secretKey) cred := credentials.NewCredentials(accessKey, secretKey)
conf := &storage.Config{ objectsManager := objects.NewObjectsManager(&objects.ObjectsManagerOptions{
UseHTTPS: true, //是否使用https域名 Options: http_client.Options{Credentials: cred},
UseCdnDomains: false, //上传是否使用CDN上传加速 })
}
return &qiNiu{ return &qiNiu{
mac: mac,
bucketManager: storage.NewBucketManager(mac, conf),
bucket: bucket, bucket: bucket,
domain: domain, domain: domain,
securityKey: securityKey, securityKey: securityKey,
conf: conf, credentials: cred,
bucketManager: objectsManager.Bucket(bucket),
md5: md5.New(), md5: md5.New(),
uploadTokenTTL: 3600, uploadTokenTTL: time.Second * 3600,
} }
} }
func (q *qiNiu) i() {} func (q *qiNiu) SetDefaultUploadTokenTTL(duration time.Duration) {
q.uploadTokenTTL = duration
func (q *qiNiu) SetDefaultUploadTokenTTL(ttl uint64) {
q.uploadTokenTTL = ttl
} }
func (q *qiNiu) GetUploadToken(ttl uint64) string { func (q *qiNiu) GetUploadToken() (string, error) {
putPolicy := storage.PutPolicy{ putPolicy, err := uptoken.NewPutPolicy(q.bucket, time.Now().Add(q.uploadTokenTTL))
Scope: q.bucket, if err != nil {
Expires: ttl, 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 { func (q *qiNiu) GetCallbackUploadToken(callbackURL string) (string, error) {
putPolicy := storage.PutPolicy{ putPolicy, err := uptoken.NewPutPolicy(q.bucket, time.Now().Add(q.uploadTokenTTL))
Scope: q.bucket, if err != nil {
CallbackURL: callbackURL, return "", err
CallbackBody: `{"key":"$(key)","hash":"$(etag)","fname":"$(fname)","fsize":"$(fsize)","ext":"$(ext)","unique":"$(x:unique)","user":"$(x:user)"}`,
CallbackBodyType: "application/json",
Expires: ttl,
} }
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 { func (q *qiNiu) TimestampSecuritySign(urlStr string, ttl time.Duration) (string, error) {
deadline := time.Now().Add(time.Second * time.Duration(ttl)).Unix() deadline := time.Now().Add(ttl).Unix()
return storage.MakePrivateURL(q.mac, q.domain, key, deadline) 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) { 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) { func (q *qiNiu) GetFileInfo(key string) (*objects.ObjectDetails, error) {
upToken := q.GetUploadToken(q.uploadTokenTTL) objectInfo, err := q.bucketManager.Object(key).Stat().Call(context.Background())
//构建表单上传的对象
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)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return objectInfo, nil
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
} }
func (q *qiNiu) DelFile(key string) error { 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 { if err != nil {
return err return err
} }
return nil return nil
} }
func (q *qiNiu) TimestampSecuritySign(path string, ttl time.Duration) string { func (q *qiNiu) ListFiles(keyPrefix, marker string, limit uint64) ([]objects.ObjectDetails, error) {
sep := "/" iter := q.bucketManager.List(context.Background(), &objects.ListObjectsOptions{
path = strings.Trim(path, sep) Limit: &limit,
splits := strings.Split(path, sep) Prefix: keyPrefix,
for i, split := range splits { Marker: marker,
splits[i] = url.QueryEscape(split) })
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) if err := iter.Error(); err != nil {
return nil, err
unix := time.Now().Add(ttl).Unix() }
hex := fmt.Sprintf("%x", unix) return objectInfos, nil
encrypt := q.md5.Encrypt(q.securityKey + path + hex)
param := make(url.Values)
param.Set("sign", encrypt)
param.Set("t", hex)
return param.Encode()
} }
func (q *qiNiu) GetFileInfo(key string) *storage.FileInfo { func (q *qiNiu) GetFileHash(path string, qhash Qhash) (hash string, err error) {
fileInfo, sErr := q.bucketManager.Stat(q.bucket, key) sign, err := q.TimestampSecuritySign(path, time.Second*5)
if sErr != nil { if err != nil {
return 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("%s/%s?%s&qhash/%s", strings.TrimRight(q.domain, "/"), path, sign, qhash) addr := fmt.Sprintf("%s/%s?%s&qhash/%s", strings.TrimRight(q.domain, "/"), path, sign, qhash)
resp, err := http.Get(addr) resp, err := http.Get(addr)

View File

@ -7,15 +7,17 @@ import (
"net/http" "net/http"
"sync" "sync"
"sync/atomic" "sync/atomic"
"time"
) )
var _ Server = (*event)(nil) var _ Server = (*event)(nil)
type Server interface { type Server interface {
GinHandle(ctx *gin.Context, user any)
HandlerFunc() mux.HandlerFunc HandlerFunc() mux.HandlerFunc
GinHandlerFunc(auth func(c *gin.Context) (string, error)) gin.HandlerFunc
Push(user any, name, msg string) bool Push(user any, name, msg string) bool
Broadcast(name, msg string) Broadcast(name, msg string)
ClientCount() int32
} }
type clientChan struct { type clientChan struct {
@ -31,7 +33,6 @@ type msgChan struct {
type event struct { type event struct {
SessionList sync.Map SessionList sync.Map
Count atomic.Int32 Count atomic.Int32
Register chan clientChan Register chan clientChan
Unregister chan any Unregister chan any
} }
@ -67,11 +68,51 @@ func (stream *event) listen() {
} }
} }
func (stream *event) GinHandle(ctx *gin.Context, user any) { func (stream *event) HandlerFunc() mux.HandlerFunc {
if user == nil { return func(c mux.Context) {
ctx.AbortWithStatus(http.StatusUnauthorized) auth := c.Auth()
if auth == nil {
c.Context().AbortWithStatus(http.StatusBadRequest)
return 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 {
c.AbortWithStatus(http.StatusBadRequest)
return
}
e := make(chan msgChan) e := make(chan msgChan)
client := clientChan{ client := clientChan{
User: user, User: user,
@ -82,25 +123,22 @@ func (stream *event) GinHandle(ctx *gin.Context, user any) {
stream.Unregister <- user stream.Unregister <- user
}() }()
ctx.Writer.Header().Set("Content-Type", "text/event-stream") c.Writer.Header().Set("Content-Type", "text/event-stream")
ctx.Writer.Header().Set("Cache-Control", "no-cache") c.Writer.Header().Set("Cache-Control", "no-cache")
ctx.Writer.Header().Set("Connection", "keep-alive") c.Writer.Header().Set("Connection", "keep-alive")
ctx.Writer.Header().Set("Transfer-Encoding", "chunked") c.Writer.Header().Set("Transfer-Encoding", "chunked")
ctx.Stream(func(w io.Writer) bool { time.AfterFunc(time.Second, func() {
e <- msgChan{Name: "message", Message: "success"}
})
c.Stream(func(w io.Writer) bool {
if msg, ok := <-e; ok { if msg, ok := <-e; ok {
ctx.SSEvent(msg.Name, msg.Message) c.SSEvent(msg.Name, msg.Message)
return true return true
} }
return false return false
}) })
ctx.Next()
}
func (stream *event) HandlerFunc() mux.HandlerFunc {
return func(c mux.Context) {
stream.GinHandle(c.Context(), c.Auth())
} }
} }
@ -120,3 +158,7 @@ func (stream *event) Broadcast(name, msg string) {
return true return true
}) })
} }
func (stream *event) ClientCount() int32 {
return stream.Count.Load()
}