mirror of
https://github.com/openimsdk/open-im-server.git
synced 2025-04-25 02:58:26 +08:00
gateway update
This commit is contained in:
parent
37d04c9fa0
commit
52e03b0149
@ -1 +1 @@
|
|||||||
Subproject commit 1667b0f4e205fc4ed7c690ab55b662087d61c277
|
Subproject commit 48fd66a6eea7ff4c5ccacddd7929bf8d7b5b40fa
|
@ -8,6 +8,7 @@ import (
|
|||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"sync"
|
"sync"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@ -25,7 +26,16 @@ func main() {
|
|||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
fmt.Println("start rpc/msg_gateway server, port: ", *rpcPort, *wsPort, *prometheusPort, ", OpenIM version: ", constant.CurrentVersion, "\n")
|
fmt.Println("start rpc/msg_gateway server, port: ", *rpcPort, *wsPort, *prometheusPort, ", OpenIM version: ", constant.CurrentVersion, "\n")
|
||||||
msggateway.Init(*rpcPort, *wsPort)
|
longServer, err := msggateway.NewWsServer(
|
||||||
msggateway.Run(*prometheusPort)
|
msggateway.WithPort(*wsPort),
|
||||||
|
msggateway.WithMaxConnNum(int64(config.Config.LongConnSvr.WebsocketMaxConnNum)),
|
||||||
|
msggateway.WithHandshakeTimeout(time.Duration(config.Config.LongConnSvr.WebsocketTimeOut)*time.Second),
|
||||||
|
msggateway.WithMessageMaxMsgLength(config.Config.LongConnSvr.WebsocketMaxMsgLen))
|
||||||
|
if err != nil {
|
||||||
|
panic(err.Error())
|
||||||
|
}
|
||||||
|
hubServer := msggateway.NewServer(*rpcPort, longServer)
|
||||||
|
go hubServer.Start()
|
||||||
|
go hubServer.LongConnServer.Run()
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
}
|
}
|
||||||
|
74
go.sum
74
go.sum
@ -26,7 +26,6 @@ cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+Y
|
|||||||
cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4=
|
cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4=
|
||||||
cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc=
|
cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc=
|
||||||
cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA=
|
cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA=
|
||||||
cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U=
|
|
||||||
cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A=
|
cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A=
|
||||||
cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc=
|
cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc=
|
||||||
cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU=
|
cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU=
|
||||||
@ -39,7 +38,6 @@ cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp
|
|||||||
cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE=
|
cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE=
|
||||||
cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw=
|
cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw=
|
||||||
cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY=
|
cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY=
|
||||||
cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg=
|
|
||||||
cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI=
|
cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI=
|
||||||
cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4=
|
cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4=
|
||||||
cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk=
|
cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk=
|
||||||
@ -82,7 +80,6 @@ cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4g
|
|||||||
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
|
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
|
||||||
cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA=
|
cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA=
|
||||||
cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw=
|
cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw=
|
||||||
cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc=
|
|
||||||
cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY=
|
cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY=
|
||||||
cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s=
|
cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s=
|
||||||
cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI=
|
cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI=
|
||||||
@ -145,7 +142,6 @@ cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4c
|
|||||||
cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA=
|
cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA=
|
||||||
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
|
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
|
||||||
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
|
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
|
||||||
cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM=
|
|
||||||
cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo=
|
cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo=
|
||||||
cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ=
|
cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ=
|
||||||
cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g=
|
cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g=
|
||||||
@ -167,7 +163,6 @@ cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1
|
|||||||
cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg=
|
cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg=
|
||||||
cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk=
|
cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk=
|
||||||
cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w=
|
cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w=
|
||||||
cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU=
|
|
||||||
cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI=
|
cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI=
|
||||||
cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8=
|
cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8=
|
||||||
cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc=
|
cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc=
|
||||||
@ -195,7 +190,6 @@ cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZ
|
|||||||
cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc=
|
cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc=
|
||||||
cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM=
|
cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM=
|
||||||
cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o=
|
cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o=
|
||||||
cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c=
|
|
||||||
cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY=
|
cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY=
|
||||||
cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc=
|
cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc=
|
||||||
cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc=
|
cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc=
|
||||||
@ -208,7 +202,6 @@ cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+
|
|||||||
cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY=
|
cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY=
|
||||||
cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs=
|
cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs=
|
||||||
cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g=
|
cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g=
|
||||||
cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA=
|
|
||||||
cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg=
|
cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg=
|
||||||
cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0=
|
cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0=
|
||||||
cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic=
|
cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic=
|
||||||
@ -217,13 +210,11 @@ cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiP
|
|||||||
cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8=
|
cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8=
|
||||||
cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8=
|
cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8=
|
||||||
cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08=
|
cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08=
|
||||||
cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw=
|
|
||||||
cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE=
|
cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE=
|
||||||
cloud.google.com/go/longrunning v0.3.0 h1:NjljC+FYPV3uh5/OwWT6pVU+doBqMg2x/rZlE+CamDs=
|
cloud.google.com/go/longrunning v0.3.0 h1:NjljC+FYPV3uh5/OwWT6pVU+doBqMg2x/rZlE+CamDs=
|
||||||
cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc=
|
cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc=
|
||||||
cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE=
|
cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE=
|
||||||
cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM=
|
cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM=
|
||||||
cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI=
|
|
||||||
cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4=
|
cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4=
|
||||||
cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w=
|
cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w=
|
||||||
cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE=
|
cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE=
|
||||||
@ -272,9 +263,6 @@ cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2k
|
|||||||
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
|
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
|
||||||
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
|
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
|
||||||
cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
|
cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
|
||||||
cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI=
|
|
||||||
cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0=
|
|
||||||
cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg=
|
|
||||||
cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4=
|
cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4=
|
||||||
cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o=
|
cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o=
|
||||||
cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk=
|
cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk=
|
||||||
@ -329,7 +317,6 @@ cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5
|
|||||||
cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU=
|
cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU=
|
||||||
cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4=
|
cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4=
|
||||||
cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw=
|
cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw=
|
||||||
cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos=
|
|
||||||
cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM=
|
cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM=
|
||||||
cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ=
|
cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ=
|
||||||
cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0=
|
cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0=
|
||||||
@ -370,7 +357,6 @@ cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb
|
|||||||
cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E=
|
cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E=
|
||||||
cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE=
|
cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE=
|
||||||
cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g=
|
cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g=
|
||||||
cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208=
|
|
||||||
cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w=
|
cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w=
|
||||||
cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8=
|
cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8=
|
||||||
cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE=
|
cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE=
|
||||||
@ -389,8 +375,8 @@ firebase.google.com/go v3.13.0+incompatible/go.mod h1:xlah6XbEyW6tbfSklcfe5FHJIw
|
|||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
||||||
github.com/OpenIMSDK/openKeeper v0.0.1 h1:JOz2nEcM/C7PeTnPnfIoYoaFA1X9BVt9W5OWNCDrNlo=
|
github.com/OpenIMSDK/openKeeper v0.0.2 h1:TlYBlWcNPO9vWK65jjoI0R3cgpY3bfgHJiDUhdb3Qxk=
|
||||||
github.com/OpenIMSDK/openKeeper v0.0.1/go.mod h1:RvyRXEcvWbonkmHLtT8KxGSCNlXY7OfDohhu53E6INU=
|
github.com/OpenIMSDK/openKeeper v0.0.2/go.mod h1:RvyRXEcvWbonkmHLtT8KxGSCNlXY7OfDohhu53E6INU=
|
||||||
github.com/OpenIMSDK/open_utils v1.0.8 h1:IopxWgJwEF5ZAPsRuiZZOfcxNOQOCt/p8VDENcHN9r4=
|
github.com/OpenIMSDK/open_utils v1.0.8 h1:IopxWgJwEF5ZAPsRuiZZOfcxNOQOCt/p8VDENcHN9r4=
|
||||||
github.com/OpenIMSDK/open_utils v1.0.8/go.mod h1:FLoaQblWUVKQgqt2LrNzfSZLT6D3DICBn1kcOMDLUOI=
|
github.com/OpenIMSDK/open_utils v1.0.8/go.mod h1:FLoaQblWUVKQgqt2LrNzfSZLT6D3DICBn1kcOMDLUOI=
|
||||||
github.com/Shopify/sarama v1.29.0 h1:ARid8o8oieau9XrHI55f/L3EoRAhm9px6sonbD7yuUE=
|
github.com/Shopify/sarama v1.29.0 h1:ARid8o8oieau9XrHI55f/L3EoRAhm9px6sonbD7yuUE=
|
||||||
@ -413,8 +399,6 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r
|
|||||||
github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0=
|
github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0=
|
||||||
github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE=
|
github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE=
|
||||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
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/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
|
|
||||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
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.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
|
github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
|
||||||
@ -463,13 +447,10 @@ github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8
|
|||||||
github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
|
github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
|
||||||
github.com/frankban/quicktest v1.11.3 h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebPhedY=
|
github.com/frankban/quicktest v1.11.3 h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebPhedY=
|
||||||
github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
|
github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
|
||||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
|
||||||
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
|
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
|
||||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
|
||||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||||
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
|
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-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
|
||||||
github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk=
|
|
||||||
github.com/gin-gonic/gin v1.8.2 h1:UzKToD9/PoFj/V4rvlKqTRKnQYyz8Sc1MJlv4JHPtvY=
|
github.com/gin-gonic/gin v1.8.2 h1:UzKToD9/PoFj/V4rvlKqTRKnQYyz8Sc1MJlv4JHPtvY=
|
||||||
github.com/gin-gonic/gin v1.8.2/go.mod h1:qw5AYuDrzRTnhvusDsrov+fDIxp9Dleuu12h8nfB398=
|
github.com/gin-gonic/gin v1.8.2/go.mod h1:qw5AYuDrzRTnhvusDsrov+fDIxp9Dleuu12h8nfB398=
|
||||||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
||||||
@ -492,7 +473,6 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o
|
|||||||
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
|
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
|
||||||
github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho=
|
github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho=
|
||||||
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.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA=
|
||||||
github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos=
|
|
||||||
github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ=
|
github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ=
|
||||||
github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU=
|
github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU=
|
||||||
github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI=
|
github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI=
|
||||||
@ -502,11 +482,8 @@ github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfC
|
|||||||
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||||
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
|
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
|
||||||
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=
|
||||||
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
|
|
||||||
github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg=
|
github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg=
|
||||||
github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw=
|
github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw=
|
||||||
github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
|
|
||||||
github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
|
|
||||||
github.com/goccy/go-json v0.10.0 h1:mXKd9Qw4NuzShiRlOXKews24ufknHO7gx30lsDyokKA=
|
github.com/goccy/go-json v0.10.0 h1:mXKd9Qw4NuzShiRlOXKews24ufknHO7gx30lsDyokKA=
|
||||||
github.com/goccy/go-json v0.10.0/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
|
github.com/goccy/go-json v0.10.0/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
|
||||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||||
@ -585,12 +562,10 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe
|
|||||||
github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||||
github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||||
github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||||
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
|
||||||
github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||||
github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||||
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
|
||||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
|
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
|
||||||
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
@ -610,7 +585,6 @@ github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMd
|
|||||||
github.com/googleapis/gax-go/v2 v2.7.0 h1:IcsPKeInNvYi7eqSaDjiZqDDKu5rsmunY0Y1YupQSSQ=
|
github.com/googleapis/gax-go/v2 v2.7.0 h1:IcsPKeInNvYi7eqSaDjiZqDDKu5rsmunY0Y1YupQSSQ=
|
||||||
github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8=
|
github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8=
|
||||||
github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4=
|
github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4=
|
||||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
|
||||||
github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4=
|
github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4=
|
||||||
github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM=
|
github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM=
|
||||||
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
|
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
|
||||||
@ -622,7 +596,6 @@ github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2I
|
|||||||
github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
||||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
|
||||||
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
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/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||||
github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc=
|
github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc=
|
||||||
@ -660,13 +633,11 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr
|
|||||||
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
||||||
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
||||||
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
|
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
|
||||||
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
|
||||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||||
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
|
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
|
||||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
github.com/klauspost/compress v1.12.2/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
|
github.com/klauspost/compress v1.12.2/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
|
||||||
github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
|
|
||||||
github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc=
|
github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc=
|
||||||
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
|
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
|
||||||
github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
|
github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
|
||||||
@ -695,8 +666,6 @@ github.com/lithammer/shortuuid v3.0.0+incompatible h1:NcD0xWW/MZYXEHa6ITy6kaXN5n
|
|||||||
github.com/lithammer/shortuuid v3.0.0+incompatible/go.mod h1:FR74pbAuElzOUuenUHTK2Tciko1/vKuIKS9dSkDrA4w=
|
github.com/lithammer/shortuuid v3.0.0+incompatible/go.mod h1:FR74pbAuElzOUuenUHTK2Tciko1/vKuIKS9dSkDrA4w=
|
||||||
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
|
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
|
||||||
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
||||||
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
|
|
||||||
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
|
||||||
github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=
|
github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=
|
||||||
github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
|
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
|
||||||
@ -725,24 +694,12 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW
|
|||||||
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||||
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
|
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
|
||||||
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
|
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
|
||||||
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
|
||||||
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
|
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
|
||||||
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
|
|
||||||
github.com/olivere/elastic/v7 v7.0.23 h1:b7tjMogDMhf2CisGI+L02LXLVa0ZyE82Z15XfW1e8t8=
|
github.com/olivere/elastic/v7 v7.0.23 h1:b7tjMogDMhf2CisGI+L02LXLVa0ZyE82Z15XfW1e8t8=
|
||||||
github.com/olivere/elastic/v7 v7.0.23/go.mod h1:OuWmD2DiuYhddWegBKPWQuelVKBLrW0fa/VUYgxuGTY=
|
github.com/olivere/elastic/v7 v7.0.23/go.mod h1:OuWmD2DiuYhddWegBKPWQuelVKBLrW0fa/VUYgxuGTY=
|
||||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
|
||||||
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
|
|
||||||
github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
|
|
||||||
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
|
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
|
||||||
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
|
|
||||||
github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
|
|
||||||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
|
||||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
|
||||||
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
|
|
||||||
github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE=
|
github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE=
|
||||||
github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs=
|
|
||||||
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
|
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
|
||||||
github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo=
|
|
||||||
github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU=
|
github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU=
|
||||||
github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek=
|
github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek=
|
||||||
github.com/pierrec/lz4 v2.6.0+incompatible h1:Ix9yFKn1nSPBLFl/yZknTp8TU5G4Ps0JDmguYK6iH1A=
|
github.com/pierrec/lz4 v2.6.0+incompatible h1:Ix9yFKn1nSPBLFl/yZknTp8TU5G4Ps0JDmguYK6iH1A=
|
||||||
@ -797,13 +754,10 @@ github.com/samuel/go-zookeeper v0.0.0-20201211165307-7117e9ea2414/go.mod h1:gi+0
|
|||||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||||
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
|
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
|
||||||
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
|
||||||
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
|
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
|
||||||
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
||||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
|
||||||
github.com/smartystreets/assertions v1.1.1/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
|
github.com/smartystreets/assertions v1.1.1/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
|
||||||
github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM=
|
github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM=
|
||||||
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
|
||||||
github.com/smartystreets/gunit v1.4.2/go.mod h1:ZjM1ozSIMJlAz/ay4SG8PeKF00ckUp+zMHZXV9/bvak=
|
github.com/smartystreets/gunit v1.4.2/go.mod h1:ZjM1ozSIMJlAz/ay4SG8PeKF00ckUp+zMHZXV9/bvak=
|
||||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
||||||
github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA=
|
github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA=
|
||||||
@ -828,9 +782,6 @@ github.com/tencentyun/qcloud-cos-sts-sdk v0.0.0-20210325043845-84a0811633ca h1:G
|
|||||||
github.com/tencentyun/qcloud-cos-sts-sdk v0.0.0-20210325043845-84a0811633ca/go.mod h1:b18KQa4IxHbxeseW1GcZox53d7J0z39VNONTxvvlkXw=
|
github.com/tencentyun/qcloud-cos-sts-sdk v0.0.0-20210325043845-84a0811633ca/go.mod h1:b18KQa4IxHbxeseW1GcZox53d7J0z39VNONTxvvlkXw=
|
||||||
github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
|
github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
|
||||||
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
|
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
|
||||||
github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo=
|
|
||||||
github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M=
|
|
||||||
github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY=
|
|
||||||
github.com/ugorji/go/codec v1.2.8 h1:sgBJS6COt0b/P40VouWKdseidkDgHxYGm0SAglUHfP0=
|
github.com/ugorji/go/codec v1.2.8 h1:sgBJS6COt0b/P40VouWKdseidkDgHxYGm0SAglUHfP0=
|
||||||
github.com/ugorji/go/codec v1.2.8/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
|
github.com/ugorji/go/codec v1.2.8/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
|
||||||
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
|
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
|
||||||
@ -870,7 +821,6 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
|
|||||||
golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
||||||
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
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-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||||
golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE=
|
golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE=
|
||||||
@ -887,7 +837,6 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH
|
|||||||
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
|
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
|
||||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||||
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||||
golang.org/x/image v0.0.0-20220902085622-e7cb96979f69/go.mod h1:doUCurBvlfPMKfmIpRIywoHmhN3VyhnoFDbvIEWF4hY=
|
|
||||||
golang.org/x/image v0.3.0 h1:HTDXbdK9bjfSWkPzDJIw89W8CAtfFGduujWs33NLLsg=
|
golang.org/x/image v0.3.0 h1:HTDXbdK9bjfSWkPzDJIw89W8CAtfFGduujWs33NLLsg=
|
||||||
golang.org/x/image v0.3.0/go.mod h1:fXd9211C/0VTlYuAcOhW8dY/RtEJqODXOWBDpmYBf+A=
|
golang.org/x/image v0.3.0/go.mod h1:fXd9211C/0VTlYuAcOhW8dY/RtEJqODXOWBDpmYBf+A=
|
||||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||||
@ -916,7 +865,6 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
|||||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
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-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
@ -939,7 +887,6 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/
|
|||||||
golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
|
||||||
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||||
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||||
@ -953,7 +900,6 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v
|
|||||||
golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
|
golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
|
||||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||||
golang.org/x/net v0.0.0-20210427231257-85d9c07bbe3a/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
|
golang.org/x/net v0.0.0-20210427231257-85d9c07bbe3a/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
|
||||||
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
|
|
||||||
golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
@ -1016,7 +962,6 @@ golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
|
|||||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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=
|
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
@ -1027,11 +972,8 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
@ -1055,7 +997,6 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
@ -1100,7 +1041,6 @@ golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXR
|
|||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
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.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA=
|
golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA=
|
||||||
golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ=
|
|
||||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
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.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
@ -1118,7 +1058,6 @@ golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
|||||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
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-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-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 h1:xYY+Bajn2a7VBmTM5GikTmnK8ZuX8YgnQCqZpbBNtmA=
|
golang.org/x/time v0.1.0 h1:xYY+Bajn2a7VBmTM5GikTmnK8ZuX8YgnQCqZpbBNtmA=
|
||||||
golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
@ -1127,7 +1066,6 @@ golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3
|
|||||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
|
||||||
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
@ -1168,7 +1106,6 @@ golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82u
|
|||||||
golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
|
||||||
golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
|
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
|
||||||
@ -1350,10 +1287,7 @@ google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz
|
|||||||
google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s=
|
google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s=
|
||||||
google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s=
|
google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s=
|
||||||
google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo=
|
google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo=
|
||||||
google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
|
|
||||||
google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
|
|
||||||
google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
|
google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
|
||||||
google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
|
|
||||||
google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f h1:BWUVssLB0HVOSY78gIdvk1dTVYtT1y8SBWtPYuTJ/6w=
|
google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f h1:BWUVssLB0HVOSY78gIdvk1dTVYtT1y8SBWtPYuTJ/6w=
|
||||||
google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
|
google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
|
||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||||
@ -1391,7 +1325,6 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu
|
|||||||
google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
|
google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
|
||||||
google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
|
google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
|
||||||
google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
|
google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
|
||||||
google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww=
|
|
||||||
google.golang.org/grpc v1.52.3 h1:pf7sOysg4LdgBqduXveGKrcEwbStiK2rtfghdzlUYDQ=
|
google.golang.org/grpc v1.52.3 h1:pf7sOysg4LdgBqduXveGKrcEwbStiK2rtfghdzlUYDQ=
|
||||||
google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY=
|
google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY=
|
||||||
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=
|
||||||
@ -1418,12 +1351,9 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8
|
|||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
|
||||||
gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
|
||||||
gopkg.in/ini.v1 v1.66.2 h1:XfR1dOYubytKy4Shzc2LHrrGhU0lDCfDGG1yLPmpgsI=
|
gopkg.in/ini.v1 v1.66.2 h1:XfR1dOYubytKy4Shzc2LHrrGhU0lDCfDGG1yLPmpgsI=
|
||||||
gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
|
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
|
||||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
|
||||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
@ -1,108 +0,0 @@
|
|||||||
package msggateway
|
|
||||||
|
|
||||||
import (
|
|
||||||
"OpenIM/pkg/common/log"
|
|
||||||
pbChat "OpenIM/pkg/proto/msg"
|
|
||||||
sdkws "OpenIM/pkg/proto/sdkws"
|
|
||||||
"OpenIM/pkg/utils"
|
|
||||||
"context"
|
|
||||||
"google.golang.org/grpc"
|
|
||||||
)
|
|
||||||
|
|
||||||
var MaxPullMsgNum = 100
|
|
||||||
|
|
||||||
func (r *RPCServer) GenPullSeqList(currentSeq uint32, operationID string, userID string) ([]uint32, error) {
|
|
||||||
maxSeq, err := db.DB.GetUserMaxSeq(userID)
|
|
||||||
if err != nil {
|
|
||||||
log.Error(operationID, "GetUserMaxSeq failed ", userID, err.Error())
|
|
||||||
return nil, utils.Wrap(err, "")
|
|
||||||
}
|
|
||||||
|
|
||||||
var seqList []uint32
|
|
||||||
num := 0
|
|
||||||
for i := currentSeq + 1; i < uint32(maxSeq); i++ {
|
|
||||||
seqList = append(seqList, i)
|
|
||||||
num++
|
|
||||||
if num == MaxPullMsgNum {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
log.Info(operationID, "GenPullSeqList ", seqList, "current seq", currentSeq)
|
|
||||||
return seqList, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *RPCServer) GetSingleUserMsgForPushPlatforms(operationID string, msgData *sdkws.MsgData, pushToUserID string, platformIDList []int) map[int]*sdkws.MsgDataList {
|
|
||||||
user2PushMsg := make(map[int]*sdkws.MsgDataList, 0)
|
|
||||||
for _, v := range platformIDList {
|
|
||||||
user2PushMsg[v] = r.GetSingleUserMsgForPush(operationID, msgData, pushToUserID, v)
|
|
||||||
//log.Info(operationID, "GetSingleUserMsgForPush", msgData.Seq, pushToUserID, v, "len:", len(user2PushMsg[v]))
|
|
||||||
}
|
|
||||||
return user2PushMsg
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *RPCServer) GetSingleUserMsgForPush(operationID string, msgData *sdkws.MsgData, pushToUserID string, platformID int) *sdkws.MsgDataList {
|
|
||||||
//msgData.MsgDataList = nil
|
|
||||||
return &sdkws.MsgDataList{MsgDataList: []*sdkws.MsgData{msgData}}
|
|
||||||
|
|
||||||
//userConn := ws.getUserConn(pushToUserID, platformID)
|
|
||||||
//if userConn == nil {
|
|
||||||
// log.Debug(operationID, "userConn == nil")
|
|
||||||
// return []*sdkws.MsgData{msgData}
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//if msgData.Seq <= userConn.PushedMaxSeq {
|
|
||||||
// log.Debug(operationID, "msgData.Seq <= userConn.PushedMaxSeq", msgData.Seq, userConn.PushedMaxSeq)
|
|
||||||
// return nil
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//msgList := r.GetSingleUserMsg(operationID, msgData.Seq, pushToUserID)
|
|
||||||
//if msgList == nil {
|
|
||||||
// log.Debug(operationID, "GetSingleUserMsg msgList == nil", msgData.Seq, userConn.PushedMaxSeq)
|
|
||||||
// userConn.PushedMaxSeq = msgData.Seq
|
|
||||||
// return []*sdkws.MsgData{msgData}
|
|
||||||
//}
|
|
||||||
//msgList = append(msgList, msgData)
|
|
||||||
//
|
|
||||||
//for _, v := range msgList {
|
|
||||||
// if v.Seq > userConn.PushedMaxSeq {
|
|
||||||
// userConn.PushedMaxSeq = v.Seq
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
//log.Debug(operationID, "GetSingleUserMsg msgList len ", len(msgList), userConn.PushedMaxSeq)
|
|
||||||
//return msgList
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *RPCServer) GetSingleUserMsg(operationID string, currentMsgSeq uint32, userID string) []*sdkws.MsgData {
|
|
||||||
seqs, err := r.GenPullSeqList(currentMsgSeq, operationID, userID)
|
|
||||||
if err != nil {
|
|
||||||
log.Error(operationID, "GenPullSeqList failed ", err.Error(), currentMsgSeq, userID)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
if len(seqs) == 0 {
|
|
||||||
log.Error(operationID, "GenPullSeqList len == 0 ", currentMsgSeq, userID)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
rpcReq := sdkws.PullMessageBySeqsReq{}
|
|
||||||
//rpcReq.Seqs = seqs
|
|
||||||
rpcReq.UserID = userID
|
|
||||||
var grpcConn *grpc.ClientConn
|
|
||||||
|
|
||||||
msgClient := pbChat.NewMsgClient(grpcConn)
|
|
||||||
reply, err := msgClient.PullMessageBySeqs(context.Background(), &rpcReq)
|
|
||||||
if err != nil {
|
|
||||||
log.Error(operationID, "PullMessageBySeqList failed ", err.Error(), rpcReq.String())
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
if len(reply.List) == 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return reply.List
|
|
||||||
}
|
|
||||||
|
|
||||||
//func (r *RPCServer) GetBatchUserMsgForPush(operationID string, msgData *sdkws.MsgData, pushToUserIDList []string, platformID int) map[string][]*sdkws.MsgData {
|
|
||||||
// user2PushMsg := make(map[string][]*sdkws.MsgData, 0)
|
|
||||||
// for _, v := range pushToUserIDList {
|
|
||||||
// user2PushMsg[v] = r.GetSingleUserMsgForPush(operationID, msgData, v, platformID)
|
|
||||||
// }
|
|
||||||
// return user2PushMsg
|
|
||||||
//}
|
|
@ -1,12 +1,11 @@
|
|||||||
package new
|
package msggateway
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"OpenIM/pkg/common/constant"
|
"OpenIM/pkg/proto/sdkws"
|
||||||
"OpenIM/pkg/utils"
|
"OpenIM/pkg/utils"
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/go-playground/validator/v10"
|
|
||||||
"runtime/debug"
|
"runtime/debug"
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
@ -39,45 +38,30 @@ type Client struct {
|
|||||||
isBackground bool
|
isBackground bool
|
||||||
connID string
|
connID string
|
||||||
onlineAt int64 // 上线时间戳(毫秒)
|
onlineAt int64 // 上线时间戳(毫秒)
|
||||||
handler MessageHandler
|
longConnServer LongConnServer
|
||||||
unregisterChan chan *Client
|
|
||||||
compressor Compressor
|
|
||||||
encoder Encoder
|
|
||||||
validate *validator.Validate
|
|
||||||
closed bool
|
closed bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func newClient(ctx *UserConnContext, conn LongConn, isCompress bool, compressor Compressor, encoder Encoder,
|
func newClient(ctx *UserConnContext, conn LongConn, isCompress bool) *Client {
|
||||||
handler MessageHandler, unregisterChan chan *Client, validate *validator.Validate) *Client {
|
|
||||||
return &Client{
|
return &Client{
|
||||||
w: new(sync.Mutex),
|
w: new(sync.Mutex),
|
||||||
conn: conn,
|
conn: conn,
|
||||||
platformID: utils.StringToInt(ctx.GetPlatformID()),
|
platformID: utils.StringToInt(ctx.GetPlatformID()),
|
||||||
isCompress: isCompress,
|
isCompress: isCompress,
|
||||||
userID: ctx.GetUserID(),
|
userID: ctx.GetUserID(),
|
||||||
compressor: compressor,
|
|
||||||
encoder: encoder,
|
|
||||||
connID: ctx.GetConnID(),
|
connID: ctx.GetConnID(),
|
||||||
onlineAt: utils.GetCurrentTimestampByMill(),
|
onlineAt: utils.GetCurrentTimestampByMill(),
|
||||||
handler: handler,
|
|
||||||
unregisterChan: unregisterChan,
|
|
||||||
validate: validate,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func (c *Client) ResetClient(ctx *UserConnContext, conn LongConn, isCompress bool, compressor Compressor, encoder Encoder,
|
func (c *Client) ResetClient(ctx *UserConnContext, conn LongConn, isCompress bool, longConnServer LongConnServer) {
|
||||||
handler MessageHandler, unregisterChan chan *Client, validate *validator.Validate) {
|
|
||||||
c.w = new(sync.Mutex)
|
c.w = new(sync.Mutex)
|
||||||
c.conn = conn
|
c.conn = conn
|
||||||
c.platformID = utils.StringToInt(ctx.GetPlatformID())
|
c.platformID = utils.StringToInt(ctx.GetPlatformID())
|
||||||
c.isCompress = isCompress
|
c.isCompress = isCompress
|
||||||
c.userID = ctx.GetUserID()
|
c.userID = ctx.GetUserID()
|
||||||
c.compressor = compressor
|
|
||||||
c.encoder = encoder
|
|
||||||
c.connID = ctx.GetConnID()
|
c.connID = ctx.GetConnID()
|
||||||
c.onlineAt = utils.GetCurrentTimestampByMill()
|
c.onlineAt = utils.GetCurrentTimestampByMill()
|
||||||
c.handler = handler
|
c.longConnServer = longConnServer
|
||||||
c.unregisterChan = unregisterChan
|
|
||||||
c.validate = validate
|
|
||||||
}
|
}
|
||||||
func (c *Client) readMessage() {
|
func (c *Client) readMessage() {
|
||||||
defer func() {
|
defer func() {
|
||||||
@ -117,41 +101,41 @@ func (c *Client) readMessage() {
|
|||||||
func (c *Client) handleMessage(message []byte) error {
|
func (c *Client) handleMessage(message []byte) error {
|
||||||
if c.isCompress {
|
if c.isCompress {
|
||||||
var decompressErr error
|
var decompressErr error
|
||||||
message, decompressErr = c.compressor.DeCompress(message)
|
message, decompressErr = c.longConnServer.DeCompress(message)
|
||||||
if decompressErr != nil {
|
if decompressErr != nil {
|
||||||
return utils.Wrap(decompressErr, "")
|
return utils.Wrap(decompressErr, "")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var binaryReq Req
|
var binaryReq Req
|
||||||
err := c.encoder.Decode(message, &binaryReq)
|
err := c.longConnServer.Decode(message, &binaryReq)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return utils.Wrap(err, "")
|
return utils.Wrap(err, "")
|
||||||
}
|
}
|
||||||
if err := c.validate.Struct(binaryReq); err != nil {
|
if err := c.longConnServer.Validate(binaryReq); err != nil {
|
||||||
return utils.Wrap(err, "")
|
return utils.Wrap(err, "")
|
||||||
}
|
}
|
||||||
if binaryReq.SendID != c.userID {
|
if binaryReq.SendID != c.userID {
|
||||||
return errors.New("exception conn userID not same to req userID")
|
return errors.New("exception conn userID not same to req userID")
|
||||||
}
|
}
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
ctx = context.WithValue(ctx, CONN_ID, c.connID)
|
ctx = context.WithValue(ctx, ConnID, c.connID)
|
||||||
ctx = context.WithValue(ctx, OPERATION_ID, binaryReq.OperationID)
|
ctx = context.WithValue(ctx, OperationID, binaryReq.OperationID)
|
||||||
ctx = context.WithValue(ctx, COMMON_USERID, binaryReq.SendID)
|
ctx = context.WithValue(ctx, CommonUserID, binaryReq.SendID)
|
||||||
ctx = context.WithValue(ctx, PLATFORM_ID, c.platformID)
|
ctx = context.WithValue(ctx, PlatformID, c.platformID)
|
||||||
var messageErr error
|
var messageErr error
|
||||||
var resp []byte
|
var resp []byte
|
||||||
switch binaryReq.ReqIdentifier {
|
switch binaryReq.ReqIdentifier {
|
||||||
case constant.WSGetNewestSeq:
|
case WSGetNewestSeq:
|
||||||
resp, messageErr = c.handler.GetSeq(ctx, binaryReq)
|
resp, messageErr = c.longConnServer.GetSeq(ctx, binaryReq)
|
||||||
case constant.WSSendMsg:
|
case WSSendMsg:
|
||||||
resp, messageErr = c.handler.SendMessage(ctx, binaryReq)
|
resp, messageErr = c.longConnServer.SendMessage(ctx, binaryReq)
|
||||||
case constant.WSSendSignalMsg:
|
case WSSendSignalMsg:
|
||||||
resp, messageErr = c.handler.SendSignalMessage(ctx, binaryReq)
|
resp, messageErr = c.longConnServer.SendSignalMessage(ctx, binaryReq)
|
||||||
case constant.WSPullMsgBySeqList:
|
case WSPullMsgBySeqList:
|
||||||
resp, messageErr = c.handler.PullMessageBySeqList(ctx, binaryReq)
|
resp, messageErr = c.longConnServer.PullMessageBySeqList(ctx, binaryReq)
|
||||||
case constant.WsLogoutMsg:
|
case WsLogoutMsg:
|
||||||
resp, messageErr = c.handler.UserLogout(ctx, binaryReq)
|
resp, messageErr = c.longConnServer.UserLogout(ctx, binaryReq)
|
||||||
case constant.WsSetBackgroundStatus:
|
case WsSetBackgroundStatus:
|
||||||
resp, messageErr = c.setAppBackgroundStatus(ctx, binaryReq)
|
resp, messageErr = c.setAppBackgroundStatus(ctx, binaryReq)
|
||||||
default:
|
default:
|
||||||
return errors.New(fmt.Sprintf("ReqIdentifier failed,sendID:%d,msgIncr:%s,reqIdentifier:%s", binaryReq.SendID, binaryReq.MsgIncr, binaryReq.ReqIdentifier))
|
return errors.New(fmt.Sprintf("ReqIdentifier failed,sendID:%d,msgIncr:%s,reqIdentifier:%s", binaryReq.SendID, binaryReq.MsgIncr, binaryReq.ReqIdentifier))
|
||||||
@ -161,7 +145,7 @@ func (c *Client) handleMessage(message []byte) error {
|
|||||||
|
|
||||||
}
|
}
|
||||||
func (c *Client) setAppBackgroundStatus(ctx context.Context, req Req) ([]byte, error) {
|
func (c *Client) setAppBackgroundStatus(ctx context.Context, req Req) ([]byte, error) {
|
||||||
resp, isBackground, messageErr := c.handler.SetUserDeviceBackground(ctx, req)
|
resp, isBackground, messageErr := c.longConnServer.SetUserDeviceBackground(ctx, req)
|
||||||
if messageErr != nil {
|
if messageErr != nil {
|
||||||
return nil, messageErr
|
return nil, messageErr
|
||||||
}
|
}
|
||||||
@ -174,7 +158,7 @@ func (c *Client) close() {
|
|||||||
c.w.Lock()
|
c.w.Lock()
|
||||||
defer c.w.Unlock()
|
defer c.w.Unlock()
|
||||||
c.conn.Close()
|
c.conn.Close()
|
||||||
c.unregisterChan <- c
|
c.longConnServer.UnRegister(c)
|
||||||
|
|
||||||
}
|
}
|
||||||
func (c *Client) replyMessage(binaryReq *Req, err error, resp []byte) {
|
func (c *Client) replyMessage(binaryReq *Req, err error, resp []byte) {
|
||||||
@ -186,6 +170,13 @@ func (c *Client) replyMessage(binaryReq *Req, err error, resp []byte) {
|
|||||||
}
|
}
|
||||||
_ = c.writeMsg(mReply)
|
_ = c.writeMsg(mReply)
|
||||||
}
|
}
|
||||||
|
func (c *Client) PushMessage(ctx context.Context, msgData *sdkws.MsgData) error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) KickOnlineMessage(ctx context.Context) error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Client) writeMsg(resp Resp) error {
|
func (c *Client) writeMsg(resp Resp) error {
|
||||||
c.w.Lock()
|
c.w.Lock()
|
||||||
@ -195,14 +186,14 @@ func (c *Client) writeMsg(resp Resp) error {
|
|||||||
}
|
}
|
||||||
encodedBuf := bufferPool.Get().([]byte)
|
encodedBuf := bufferPool.Get().([]byte)
|
||||||
resultBuf := bufferPool.Get().([]byte)
|
resultBuf := bufferPool.Get().([]byte)
|
||||||
encodeBuf, err := c.encoder.Encode(resp)
|
encodeBuf, err := c.longConnServer.Encode(resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return utils.Wrap(err, "")
|
return utils.Wrap(err, "")
|
||||||
}
|
}
|
||||||
_ = c.conn.SetWriteTimeout(60)
|
_ = c.conn.SetWriteTimeout(60)
|
||||||
if c.isCompress {
|
if c.isCompress {
|
||||||
var compressErr error
|
var compressErr error
|
||||||
resultBuf, compressErr = c.compressor.Compress(encodeBuf)
|
resultBuf, compressErr = c.longConnServer.Compress(encodeBuf)
|
||||||
if compressErr != nil {
|
if compressErr != nil {
|
||||||
return utils.Wrap(compressErr, "")
|
return utils.Wrap(compressErr, "")
|
||||||
}
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package new
|
package msggateway
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"OpenIM/pkg/utils"
|
"OpenIM/pkg/utils"
|
27
internal/msggateway/constant.go
Normal file
27
internal/msggateway/constant.go
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
package msggateway
|
||||||
|
|
||||||
|
const (
|
||||||
|
WsUserID = "sendID"
|
||||||
|
CommonUserID = "userID"
|
||||||
|
PlatformID = "platformID"
|
||||||
|
ConnID = "connID"
|
||||||
|
Token = "token"
|
||||||
|
OperationID = "operationID"
|
||||||
|
Compression = "compression"
|
||||||
|
GzipCompressionProtocol = "gzip"
|
||||||
|
)
|
||||||
|
const (
|
||||||
|
WebSocket = iota + 1
|
||||||
|
)
|
||||||
|
const (
|
||||||
|
//Websocket Protocol
|
||||||
|
WSGetNewestSeq = 1001
|
||||||
|
WSPullMsgBySeqList = 1002
|
||||||
|
WSSendMsg = 1003
|
||||||
|
WSSendSignalMsg = 1004
|
||||||
|
WSPushMsg = 2001
|
||||||
|
WSKickOnlineMsg = 2002
|
||||||
|
WsLogoutMsg = 2003
|
||||||
|
WsSetBackgroundStatus = 2004
|
||||||
|
WSDataError = 3001
|
||||||
|
)
|
@ -1,4 +1,4 @@
|
|||||||
package new
|
package msggateway
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"OpenIM/pkg/utils"
|
"OpenIM/pkg/utils"
|
||||||
@ -47,8 +47,8 @@ func (c *UserConnContext) GetConnID() string {
|
|||||||
return c.RemoteAddr + "_" + strconv.Itoa(int(utils.GetCurrentTimestampByMill()))
|
return c.RemoteAddr + "_" + strconv.Itoa(int(utils.GetCurrentTimestampByMill()))
|
||||||
}
|
}
|
||||||
func (c *UserConnContext) GetUserID() string {
|
func (c *UserConnContext) GetUserID() string {
|
||||||
return c.Req.URL.Query().Get(WS_USERID)
|
return c.Req.URL.Query().Get(WsUserID)
|
||||||
}
|
}
|
||||||
func (c *UserConnContext) GetPlatformID() string {
|
func (c *UserConnContext) GetPlatformID() string {
|
||||||
return c.Req.URL.Query().Get(PLATFORM_ID)
|
return c.Req.URL.Query().Get(PlatformID)
|
||||||
}
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package new
|
package msggateway
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"OpenIM/pkg/utils"
|
"OpenIM/pkg/utils"
|
@ -1,4 +1,4 @@
|
|||||||
package new
|
package msggateway
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"OpenIM/pkg/errs"
|
"OpenIM/pkg/errs"
|
173
internal/msggateway/hub_server.go
Normal file
173
internal/msggateway/hub_server.go
Normal file
@ -0,0 +1,173 @@
|
|||||||
|
package msggateway
|
||||||
|
|
||||||
|
import (
|
||||||
|
"OpenIM/internal/common/network"
|
||||||
|
"OpenIM/pkg/common/config"
|
||||||
|
"OpenIM/pkg/common/constant"
|
||||||
|
"OpenIM/pkg/common/mw"
|
||||||
|
"OpenIM/pkg/common/prome"
|
||||||
|
"OpenIM/pkg/common/tokenverify"
|
||||||
|
"OpenIM/pkg/errs"
|
||||||
|
"OpenIM/pkg/proto/msggateway"
|
||||||
|
"OpenIM/pkg/utils"
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"github.com/OpenIMSDK/openKeeper"
|
||||||
|
grpcPrometheus "github.com/grpc-ecosystem/go-grpc-prometheus"
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
"net"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (s *Server) Start() error {
|
||||||
|
zkClient, err := openKeeper.NewClient(config.Config.Zookeeper.ZkAddr, config.Config.Zookeeper.Schema, 10, "", "")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer zkClient.Close()
|
||||||
|
registerIP, err := network.GetRpcRegisterIP(config.Config.RpcRegisterIP)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
listener, err := net.Listen("tcp", fmt.Sprintf("%s:%d", config.Config.ListenIP, s.rpcPort))
|
||||||
|
if err != nil {
|
||||||
|
panic("listening err:" + err.Error())
|
||||||
|
}
|
||||||
|
defer listener.Close()
|
||||||
|
var options []grpc.ServerOption
|
||||||
|
options = append(options, mw.GrpcServer()) // ctx 中间件
|
||||||
|
if config.Config.Prometheus.Enable {
|
||||||
|
prome.NewGrpcRequestCounter()
|
||||||
|
prome.NewGrpcRequestFailedCounter()
|
||||||
|
prome.NewGrpcRequestSuccessCounter()
|
||||||
|
options = append(options, []grpc.ServerOption{
|
||||||
|
//grpc.UnaryInterceptor(prome.UnaryServerInterceptorPrometheus),
|
||||||
|
grpc.StreamInterceptor(grpcPrometheus.StreamServerInterceptor),
|
||||||
|
grpc.UnaryInterceptor(grpcPrometheus.UnaryServerInterceptor),
|
||||||
|
}...)
|
||||||
|
}
|
||||||
|
srv := grpc.NewServer(options...)
|
||||||
|
defer srv.GracefulStop()
|
||||||
|
msggateway.RegisterMsgGatewayServer(srv, s)
|
||||||
|
err = zkClient.Register("", registerIP, s.rpcPort)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = srv.Serve(listener)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type Server struct {
|
||||||
|
rpcPort int
|
||||||
|
LongConnServer LongConnServer
|
||||||
|
pushTerminal []int
|
||||||
|
//rpcServer *RpcServer
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewServer(rpcPort int, longConnServer LongConnServer) *Server {
|
||||||
|
return &Server{rpcPort: rpcPort, LongConnServer: longConnServer, pushTerminal: []int{constant.IOSPlatformID, constant.AndroidPlatformID}}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Server) OnlinePushMsg(context context.Context, req *msggateway.OnlinePushMsgReq) (*msggateway.OnlinePushMsgResp, error) {
|
||||||
|
panic("implement me")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Server) GetUsersOnlineStatus(ctx context.Context, req *msggateway.GetUsersOnlineStatusReq) (*msggateway.GetUsersOnlineStatusResp, error) {
|
||||||
|
if !tokenverify.IsAppManagerUid(ctx) {
|
||||||
|
return nil, errs.ErrNoPermission.Wrap("only app manager")
|
||||||
|
}
|
||||||
|
var resp msggateway.GetUsersOnlineStatusResp
|
||||||
|
for _, userID := range req.UserIDs {
|
||||||
|
clients, ok := s.LongConnServer.GetUserAllCons(userID)
|
||||||
|
if !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
temp := new(msggateway.GetUsersOnlineStatusResp_SuccessResult)
|
||||||
|
temp.UserID = userID
|
||||||
|
for _, client := range clients {
|
||||||
|
if client != nil {
|
||||||
|
ps := new(msggateway.GetUsersOnlineStatusResp_SuccessDetail)
|
||||||
|
ps.Platform = constant.PlatformIDToName(client.platformID)
|
||||||
|
ps.Status = constant.OnlineStatus
|
||||||
|
ps.ConnID = client.connID
|
||||||
|
ps.IsBackground = client.isBackground
|
||||||
|
temp.Status = constant.OnlineStatus
|
||||||
|
temp.DetailPlatformStatus = append(temp.DetailPlatformStatus, ps)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if temp.Status == constant.OnlineStatus {
|
||||||
|
resp.SuccessResult = append(resp.SuccessResult, temp)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return &resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Server) OnlineBatchPushOneMsg(ctx context.Context, req *msggateway.OnlineBatchPushOneMsgReq) (*msggateway.OnlineBatchPushOneMsgResp, error) {
|
||||||
|
panic("implement me")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Server) SuperGroupOnlineBatchPushOneMsg(ctx context.Context, req *msggateway.OnlineBatchPushOneMsgReq) (*msggateway.OnlineBatchPushOneMsgResp, error) {
|
||||||
|
var singleUserResult []*msggateway.SingleMsgToUserResults
|
||||||
|
for _, v := range req.PushToUserIDs {
|
||||||
|
var resp []*msggateway.SingleMsgToUserPlatform
|
||||||
|
tempT := &msggateway.SingleMsgToUserResults{
|
||||||
|
UserID: v,
|
||||||
|
}
|
||||||
|
clients, ok := s.LongConnServer.GetUserAllCons(v)
|
||||||
|
if !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for _, client := range clients {
|
||||||
|
if client != nil {
|
||||||
|
temp := &msggateway.SingleMsgToUserPlatform{
|
||||||
|
RecvID: v,
|
||||||
|
RecvPlatFormID: int32(client.platformID),
|
||||||
|
}
|
||||||
|
if !client.isBackground {
|
||||||
|
err := client.PushMessage(ctx, req.MsgData)
|
||||||
|
if err != nil {
|
||||||
|
temp.ResultCode = -2
|
||||||
|
resp = append(resp, temp)
|
||||||
|
} else {
|
||||||
|
if utils.IsContainInt(client.platformID, s.pushTerminal) {
|
||||||
|
tempT.OnlinePush = true
|
||||||
|
prome.Inc(prome.MsgOnlinePushSuccessCounter)
|
||||||
|
resp = append(resp, temp)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
temp.ResultCode = -3
|
||||||
|
resp = append(resp, temp)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tempT.Resp = resp
|
||||||
|
singleUserResult = append(singleUserResult, tempT)
|
||||||
|
}
|
||||||
|
|
||||||
|
return &msggateway.OnlineBatchPushOneMsgResp{
|
||||||
|
SinglePushResult: singleUserResult,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Server) KickUserOffline(ctx context.Context, req *msggateway.KickUserOfflineReq) (*msggateway.KickUserOfflineResp, error) {
|
||||||
|
for _, v := range req.KickUserIDList {
|
||||||
|
|
||||||
|
if clients, _, ok := s.LongConnServer.GetUserPlatformCons(v, int(req.PlatformID)); ok {
|
||||||
|
for _, client := range clients {
|
||||||
|
err := client.KickOnlineMessage(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return &msggateway.KickUserOfflineResp{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Server) MultiTerminalLoginCheck(ctx context.Context, req *msggateway.MultiTerminalLoginCheckReq) (*msggateway.MultiTerminalLoginCheckResp, error) {
|
||||||
|
//TODO implement me
|
||||||
|
panic("implement me")
|
||||||
|
}
|
@ -1,48 +0,0 @@
|
|||||||
package msggateway
|
|
||||||
|
|
||||||
import (
|
|
||||||
"OpenIM/pkg/common/config"
|
|
||||||
"OpenIM/pkg/common/constant"
|
|
||||||
|
|
||||||
"OpenIM/pkg/statistics"
|
|
||||||
"fmt"
|
|
||||||
"sync"
|
|
||||||
|
|
||||||
prome "OpenIM/pkg/common/prome"
|
|
||||||
|
|
||||||
"github.com/go-playground/validator/v10"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
rwLock *sync.RWMutex
|
|
||||||
validate *validator.Validate
|
|
||||||
ws WServer
|
|
||||||
rpcSvr RPCServer
|
|
||||||
sendMsgAllCount uint64
|
|
||||||
sendMsgFailedCount uint64
|
|
||||||
sendMsgSuccessCount uint64
|
|
||||||
userCount uint64
|
|
||||||
|
|
||||||
sendMsgAllCountLock sync.RWMutex
|
|
||||||
)
|
|
||||||
|
|
||||||
func Init(rpcPort, wsPort int) {
|
|
||||||
rwLock = new(sync.RWMutex)
|
|
||||||
validate = validator.New()
|
|
||||||
statistics.NewStatistics(&sendMsgAllCount, config.Config.ModuleName.LongConnSvrName, fmt.Sprintf("%d second recv to msg_gateway sendMsgCount", constant.StatisticsTimeInterval), constant.StatisticsTimeInterval)
|
|
||||||
statistics.NewStatistics(&userCount, config.Config.ModuleName.LongConnSvrName, fmt.Sprintf("%d second add user conn", constant.StatisticsTimeInterval), constant.StatisticsTimeInterval)
|
|
||||||
ws.onInit(wsPort)
|
|
||||||
rpcSvr.onInit(rpcPort)
|
|
||||||
initPrometheus()
|
|
||||||
}
|
|
||||||
|
|
||||||
func Run(prometheusPort int) {
|
|
||||||
go ws.run()
|
|
||||||
go rpcSvr.run()
|
|
||||||
go func() {
|
|
||||||
err := prome.StartPrometheusSrv(prometheusPort)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
}
|
|
@ -1,404 +0,0 @@
|
|||||||
package msggateway
|
|
||||||
|
|
||||||
import (
|
|
||||||
"OpenIM/pkg/common/config"
|
|
||||||
"OpenIM/pkg/common/constant"
|
|
||||||
"OpenIM/pkg/common/log"
|
|
||||||
"OpenIM/pkg/common/prome"
|
|
||||||
pbChat "OpenIM/pkg/proto/msg"
|
|
||||||
push "OpenIM/pkg/proto/push"
|
|
||||||
pbRtc "OpenIM/pkg/proto/rtc"
|
|
||||||
"OpenIM/pkg/proto/sdkws"
|
|
||||||
"OpenIM/pkg/utils"
|
|
||||||
"bytes"
|
|
||||||
"context"
|
|
||||||
"encoding/gob"
|
|
||||||
"github.com/golang/protobuf/proto"
|
|
||||||
"github.com/gorilla/websocket"
|
|
||||||
"google.golang.org/grpc"
|
|
||||||
"runtime"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (ws *WServer) msgParse(conn *UserConn, binaryMsg []byte) {
|
|
||||||
b := bytes.NewBuffer(binaryMsg)
|
|
||||||
m := Req{}
|
|
||||||
dec := gob.NewDecoder(b)
|
|
||||||
err := dec.Decode(&m)
|
|
||||||
if err != nil {
|
|
||||||
log.NewError("", "ws Decode err", err.Error())
|
|
||||||
err = conn.Close()
|
|
||||||
if err != nil {
|
|
||||||
log.NewError("", "ws close err", err.Error())
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if err := validate.Struct(m); err != nil {
|
|
||||||
log.NewError("", "ws args validate err", err.Error())
|
|
||||||
ws.sendErrMsg(conn, 201, err.Error(), m.ReqIdentifier, m.MsgIncr, m.OperationID)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.NewInfo(m.OperationID, "Basic Info Authentication Success", m.SendID, m.MsgIncr, m.ReqIdentifier)
|
|
||||||
if m.SendID != conn.userID {
|
|
||||||
if err = conn.Close(); err != nil {
|
|
||||||
log.NewError(m.OperationID, "close ws conn failed", conn.userID, "send id", m.SendID, err.Error())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
switch m.ReqIdentifier {
|
|
||||||
case constant.WSGetNewestSeq:
|
|
||||||
log.NewInfo(m.OperationID, "getSeqReq ", m.SendID, m.MsgIncr, m.ReqIdentifier)
|
|
||||||
ws.getSeqReq(conn, &m)
|
|
||||||
prome.Inc(prome.GetNewestSeqTotalCounter)
|
|
||||||
case constant.WSSendMsg:
|
|
||||||
log.NewInfo(m.OperationID, "sendMsgReq ", m.SendID, m.MsgIncr, m.ReqIdentifier)
|
|
||||||
ws.sendMsgReq(conn, &m)
|
|
||||||
prome.Inc(prome.MsgRecvTotalCounter)
|
|
||||||
case constant.WSSendSignalMsg:
|
|
||||||
log.NewInfo(m.OperationID, "sendSignalMsgReq ", m.SendID, m.MsgIncr, m.ReqIdentifier)
|
|
||||||
ws.sendSignalMsgReq(conn, &m)
|
|
||||||
case constant.WSPullMsgBySeqList:
|
|
||||||
log.NewInfo(m.OperationID, "pullMsgBySeqListReq ", m.SendID, m.MsgIncr, m.ReqIdentifier)
|
|
||||||
ws.pullMsgBySeqListReq(conn, &m)
|
|
||||||
prome.Inc(prome.PullMsgBySeqListTotalCounter)
|
|
||||||
case constant.WsLogoutMsg:
|
|
||||||
log.NewInfo(m.OperationID, "conn.Close()", m.SendID, m.MsgIncr, m.ReqIdentifier)
|
|
||||||
ws.userLogoutReq(conn, &m)
|
|
||||||
case constant.WsSetBackgroundStatus:
|
|
||||||
log.NewInfo(m.OperationID, "WsSetBackgroundStatus", m.SendID, m.MsgIncr, m.ReqIdentifier)
|
|
||||||
ws.setUserDeviceBackground(conn, &m)
|
|
||||||
default:
|
|
||||||
log.Error(m.OperationID, "ReqIdentifier failed ", m.SendID, m.MsgIncr, m.ReqIdentifier)
|
|
||||||
}
|
|
||||||
log.NewInfo(m.OperationID, "goroutine num is ", runtime.NumGoroutine())
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ws *WServer) getSeqReq(conn *UserConn, m *Req) {
|
|
||||||
log.NewInfo(m.OperationID, "Ws call success to getNewSeq", m.MsgIncr, m.SendID, m.ReqIdentifier)
|
|
||||||
nReply := new(sdkws.GetMaxAndMinSeqResp)
|
|
||||||
isPass, errCode, errMsg, data := ws.argsValidate(m, constant.WSGetNewestSeq, m.OperationID)
|
|
||||||
log.Info(m.OperationID, "argsValidate ", isPass, errCode, errMsg)
|
|
||||||
if isPass {
|
|
||||||
rpcReq := sdkws.GetMaxAndMinSeqReq{}
|
|
||||||
rpcReq.GroupIDs = data.(sdkws.GetMaxAndMinSeqReq).GroupIDs
|
|
||||||
rpcReq.UserID = m.SendID
|
|
||||||
log.Debug(m.OperationID, "Ws call success to getMaxAndMinSeq", m.SendID, m.ReqIdentifier, m.MsgIncr, data.(sdkws.GetMaxAndMinSeqReq).GroupIDs)
|
|
||||||
var grpcConn *grpc.ClientConn
|
|
||||||
msgClient := pbChat.NewMsgClient(grpcConn)
|
|
||||||
rpcReply, err := msgClient.GetMaxAndMinSeq(context.Background(), &rpcReq)
|
|
||||||
if err != nil {
|
|
||||||
ws.getSeqResp(conn, m, nReply)
|
|
||||||
} else {
|
|
||||||
ws.getSeqResp(conn, m, rpcReply)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
log.Error(m.OperationID, "argsValidate failed send resp: ", nReply.String())
|
|
||||||
ws.getSeqResp(conn, m, nReply)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ws *WServer) getSeqResp(conn *UserConn, m *Req, pb *sdkws.GetMaxAndMinSeqResp) {
|
|
||||||
|
|
||||||
b, _ := proto.Marshal(pb)
|
|
||||||
mReply := Resp{
|
|
||||||
ReqIdentifier: m.ReqIdentifier,
|
|
||||||
MsgIncr: m.MsgIncr,
|
|
||||||
OperationID: m.OperationID,
|
|
||||||
Data: b,
|
|
||||||
}
|
|
||||||
log.Debug(m.OperationID, "getSeqResp come here req: ", pb.String(), "send resp: ",
|
|
||||||
mReply.ReqIdentifier, mReply.MsgIncr, mReply.ErrCode, mReply.ErrMsg)
|
|
||||||
ws.sendMsg(conn, mReply)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ws *WServer) pullMsgBySeqListReq(conn *UserConn, m *Req) {
|
|
||||||
log.NewInfo(m.OperationID, "Ws call success to pullMsgBySeqListReq start", m.SendID, m.ReqIdentifier, m.MsgIncr, string(m.Data))
|
|
||||||
nReply := new(sdkws.PullMessageBySeqsResp)
|
|
||||||
isPass, _, _, data := ws.argsValidate(m, constant.WSPullMsgBySeqList, m.OperationID)
|
|
||||||
if isPass {
|
|
||||||
rpcReq := sdkws.PullMessageBySeqsReq{}
|
|
||||||
rpcReq.Seqs = data.(sdkws.PullMessageBySeqsReq).Seqs
|
|
||||||
rpcReq.UserID = m.SendID
|
|
||||||
rpcReq.GroupSeqs = data.(sdkws.PullMessageBySeqsReq).GroupSeqs
|
|
||||||
log.NewInfo(m.OperationID, "Ws call success to pullMsgBySeqListReq middle", m.SendID, m.ReqIdentifier, m.MsgIncr, data.(sdkws.PullMessageBySeqsReq).Seqs)
|
|
||||||
var grpcConn *grpc.ClientConn
|
|
||||||
|
|
||||||
//grpcConn := rpc.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImMsgName, m.OperationID)
|
|
||||||
if grpcConn == nil {
|
|
||||||
ws.pullMsgBySeqListResp(conn, m, nReply)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
msgClient := pbChat.NewMsgClient(grpcConn)
|
|
||||||
maxSizeOption := grpc.MaxCallRecvMsgSize(1024 * 1024 * 20)
|
|
||||||
reply, err := msgClient.PullMessageBySeqs(context.Background(), &rpcReq, maxSizeOption)
|
|
||||||
if err != nil {
|
|
||||||
ws.pullMsgBySeqListResp(conn, m, nReply)
|
|
||||||
} else {
|
|
||||||
//log.NewInfo(rpcReq.OperationID, "rpc call success to pullMsgBySeqListReq", reply.String(), len(reply.List))
|
|
||||||
ws.pullMsgBySeqListResp(conn, m, reply)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ws.pullMsgBySeqListResp(conn, m, nReply)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
func (ws *WServer) pullMsgBySeqListResp(conn *UserConn, m *Req, pb *sdkws.PullMessageBySeqsResp) {
|
|
||||||
log.NewInfo(m.OperationID, "pullMsgBySeqListResp come here ", pb.String())
|
|
||||||
c, _ := proto.Marshal(pb)
|
|
||||||
mReply := Resp{
|
|
||||||
ReqIdentifier: m.ReqIdentifier,
|
|
||||||
MsgIncr: m.MsgIncr,
|
|
||||||
//ErrCode: pb.GetErrCode(),
|
|
||||||
//ErrMsg: pb.GetErrMsg(),
|
|
||||||
OperationID: m.OperationID,
|
|
||||||
Data: c,
|
|
||||||
}
|
|
||||||
log.NewInfo(m.OperationID, "pullMsgBySeqListResp all data is ", mReply.ReqIdentifier, mReply.MsgIncr, mReply.ErrCode, mReply.ErrMsg,
|
|
||||||
len(mReply.Data))
|
|
||||||
ws.sendMsg(conn, mReply)
|
|
||||||
}
|
|
||||||
func (ws *WServer) userLogoutReq(conn *UserConn, m *Req) {
|
|
||||||
log.NewInfo(m.OperationID, "Ws call success to userLogoutReq start", m.SendID, m.ReqIdentifier, m.MsgIncr, string(m.Data))
|
|
||||||
|
|
||||||
rpcReq := push.DelUserPushTokenReq{}
|
|
||||||
rpcReq.UserID = m.SendID
|
|
||||||
rpcReq.PlatformID = conn.PlatformID
|
|
||||||
//rpcReq.OperationID = m.OperationID
|
|
||||||
var grpcConn *grpc.ClientConn
|
|
||||||
|
|
||||||
//grpcConn := rpc.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImPushName, m.OperationID)
|
|
||||||
if grpcConn == nil {
|
|
||||||
//errMsg := rpcReq.OperationID + "getcdv3.GetDefaultConn == nil"
|
|
||||||
//log.NewError(rpcReq.OperationID, errMsg)
|
|
||||||
ws.userLogoutResp(conn, m)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
msgClient := push.NewPushMsgServiceClient(grpcConn)
|
|
||||||
_, err := msgClient.DelUserPushToken(context.Background(), &rpcReq)
|
|
||||||
if err != nil {
|
|
||||||
//log.NewError(rpcReq.OperationID, "DelUserPushToken err", err.Error())
|
|
||||||
|
|
||||||
ws.userLogoutResp(conn, m)
|
|
||||||
} else {
|
|
||||||
//log.NewInfo(rpcReq.OperationID, "rpc call success to DelUserPushToken", reply.String())
|
|
||||||
ws.userLogoutResp(conn, m)
|
|
||||||
}
|
|
||||||
ws.userLogoutResp(conn, m)
|
|
||||||
|
|
||||||
}
|
|
||||||
func (ws *WServer) userLogoutResp(conn *UserConn, m *Req) {
|
|
||||||
mReply := Resp{
|
|
||||||
ReqIdentifier: m.ReqIdentifier,
|
|
||||||
MsgIncr: m.MsgIncr,
|
|
||||||
OperationID: m.OperationID,
|
|
||||||
}
|
|
||||||
ws.sendMsg(conn, mReply)
|
|
||||||
_ = conn.Close()
|
|
||||||
}
|
|
||||||
func (ws *WServer) sendMsgReq(conn *UserConn, m *Req) {
|
|
||||||
sendMsgAllCountLock.Lock()
|
|
||||||
sendMsgAllCount++
|
|
||||||
sendMsgAllCountLock.Unlock()
|
|
||||||
log.NewInfo(m.OperationID, "Ws call success to sendMsgReq start", m.MsgIncr, m.ReqIdentifier, m.SendID)
|
|
||||||
|
|
||||||
nReply := new(pbChat.SendMsgResp)
|
|
||||||
isPass, _, _, pData := ws.argsValidate(m, constant.WSSendMsg, m.OperationID)
|
|
||||||
if isPass {
|
|
||||||
data := pData.(sdkws.MsgData)
|
|
||||||
pbData := pbChat.SendMsgReq{
|
|
||||||
//Token: m.Token,
|
|
||||||
//OperationID: m.OperationID,
|
|
||||||
MsgData: &data,
|
|
||||||
}
|
|
||||||
log.NewInfo(m.OperationID, "Ws call success to sendMsgReq middle", m.ReqIdentifier, m.SendID, m.MsgIncr, data.String())
|
|
||||||
var grpcConn *grpc.ClientConn
|
|
||||||
|
|
||||||
//etcdConn := rpc.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImMsgName, m.OperationID)
|
|
||||||
if grpcConn == nil {
|
|
||||||
errMsg := m.OperationID + "getcdv3.GetDefaultConn == nil"
|
|
||||||
//nReply.ErrCode = 500
|
|
||||||
//nReply.ErrMsg = errMsg
|
|
||||||
log.NewError(m.OperationID, errMsg)
|
|
||||||
ws.sendMsgResp(conn, m, nReply)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
client := pbChat.NewMsgClient(grpcConn)
|
|
||||||
reply, err := client.SendMsg(context.Background(), &pbData)
|
|
||||||
if err != nil {
|
|
||||||
//log.NewError(pbData.OperationID, "UserSendMsg err", err.Error())
|
|
||||||
//nReply.ErrCode = 200
|
|
||||||
//nReply.ErrMsg = err.Error()
|
|
||||||
ws.sendMsgResp(conn, m, nReply)
|
|
||||||
} else {
|
|
||||||
//log.NewInfo(pbData.OperationID, "rpc call success to sendMsgReq", reply.String())
|
|
||||||
ws.sendMsgResp(conn, m, reply)
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
//nReply.ErrCode = errCode
|
|
||||||
//nReply.ErrMsg = errMsg
|
|
||||||
ws.sendMsgResp(conn, m, nReply)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
func (ws *WServer) sendMsgResp(conn *UserConn, m *Req, pb *pbChat.SendMsgResp) {
|
|
||||||
var mReplyData sdkws.UserSendMsgResp
|
|
||||||
mReplyData.ClientMsgID = pb.GetClientMsgID()
|
|
||||||
mReplyData.ServerMsgID = pb.GetServerMsgID()
|
|
||||||
mReplyData.SendTime = pb.GetSendTime()
|
|
||||||
b, _ := proto.Marshal(&mReplyData)
|
|
||||||
mReply := Resp{
|
|
||||||
ReqIdentifier: m.ReqIdentifier,
|
|
||||||
MsgIncr: m.MsgIncr,
|
|
||||||
OperationID: m.OperationID,
|
|
||||||
Data: b,
|
|
||||||
}
|
|
||||||
ws.sendMsg(conn, mReply)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ws *WServer) sendSignalMsgReq(conn *UserConn, m *Req) {
|
|
||||||
log.NewInfo(m.OperationID, "Ws call success to sendSignalMsgReq start", m.MsgIncr, m.ReqIdentifier, m.SendID, string(m.Data))
|
|
||||||
//nReply := new(pbChat.SendMsgResp)
|
|
||||||
isPass, errCode, errMsg, pData := ws.argsValidate(m, constant.WSSendSignalMsg, m.OperationID)
|
|
||||||
if isPass {
|
|
||||||
signalResp := sdkws.SignalResp{}
|
|
||||||
var grpcConn *grpc.ClientConn
|
|
||||||
//etcdConn := rpc.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImRtcName, m.OperationID)
|
|
||||||
if grpcConn == nil {
|
|
||||||
errMsg := m.OperationID + "getcdv3.GetDefaultConn == nil"
|
|
||||||
log.NewError(m.OperationID, errMsg)
|
|
||||||
ws.sendSignalMsgResp(conn, 204, errMsg, m, &signalResp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
rtcClient := pbRtc.NewRtcServiceClient(grpcConn)
|
|
||||||
req := &pbRtc.SignalMessageAssembleReq{
|
|
||||||
SignalReq: pData.(*sdkws.SignalReq),
|
|
||||||
OperationID: m.OperationID,
|
|
||||||
}
|
|
||||||
respPb, err := rtcClient.SignalMessageAssemble(context.Background(), req)
|
|
||||||
if err != nil {
|
|
||||||
log.NewError(m.OperationID, utils.GetSelfFuncName(), "SignalMessageAssemble", err.Error(), config.Config.RpcRegisterName.OpenImRtcName)
|
|
||||||
ws.sendSignalMsgResp(conn, 204, "grpc SignalMessageAssemble failed: "+err.Error(), m, &signalResp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
signalResp.Payload = respPb.SignalResp.Payload
|
|
||||||
msgData := sdkws.MsgData{}
|
|
||||||
utils.CopyStructFields(&msgData, respPb.MsgData)
|
|
||||||
log.NewInfo(m.OperationID, utils.GetSelfFuncName(), respPb.String())
|
|
||||||
if respPb.IsPass {
|
|
||||||
pbData := pbChat.SendMsgReq{
|
|
||||||
//Token: m.Token,
|
|
||||||
//OperationID: m.OperationID,
|
|
||||||
MsgData: &msgData,
|
|
||||||
}
|
|
||||||
log.NewInfo(m.OperationID, utils.GetSelfFuncName(), "pbData: ", pbData)
|
|
||||||
log.NewInfo(m.OperationID, "Ws call success to sendSignalMsgReq middle", m.ReqIdentifier, m.SendID, m.MsgIncr, msgData)
|
|
||||||
var grpcConn *grpc.ClientConn
|
|
||||||
//etcdConn := rpc.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImMsgName, m.OperationID)
|
|
||||||
if grpcConn == nil {
|
|
||||||
errMsg := m.OperationID + "getcdv3.GetDefaultConn == nil"
|
|
||||||
log.NewError(m.OperationID, errMsg)
|
|
||||||
ws.sendSignalMsgResp(conn, 200, errMsg, m, &signalResp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
client := pbChat.NewMsgClient(grpcConn)
|
|
||||||
_, err := client.SendMsg(context.Background(), &pbData)
|
|
||||||
if err != nil {
|
|
||||||
//log.NewError(pbData.OperationID, utils.GetSelfFuncName(), "rpc sendMsg err", err.Error())
|
|
||||||
//nReply.ErrCode = 200
|
|
||||||
//nReply.ErrMsg = err.Error()
|
|
||||||
ws.sendSignalMsgResp(conn, 200, err.Error(), m, &signalResp)
|
|
||||||
} else {
|
|
||||||
//log.NewInfo(pbData.OperationID, "rpc call success to sendMsgReq", reply.String(), signalResp.String(), m)
|
|
||||||
ws.sendSignalMsgResp(conn, 0, "", m, &signalResp)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
//log.NewError(m.OperationID, utils.GetSelfFuncName(), respPb.IsPass, respPb.CommonResp.ErrCode, respPb.CommonResp.ErrMsg)
|
|
||||||
//ws.sendSignalMsgResp(conn, respPb.CommonResp.ErrCode, respPb.CommonResp.ErrMsg, m, &signalResp)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ws.sendSignalMsgResp(conn, errCode, errMsg, m, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
func (ws *WServer) sendSignalMsgResp(conn *UserConn, errCode int32, errMsg string, m *Req, pb *sdkws.SignalResp) {
|
|
||||||
// := make(map[string]interface{})
|
|
||||||
log.Debug(m.OperationID, "sendSignalMsgResp is", pb.String())
|
|
||||||
b, _ := proto.Marshal(pb)
|
|
||||||
mReply := Resp{
|
|
||||||
ReqIdentifier: m.ReqIdentifier,
|
|
||||||
MsgIncr: m.MsgIncr,
|
|
||||||
ErrCode: errCode,
|
|
||||||
ErrMsg: errMsg,
|
|
||||||
OperationID: m.OperationID,
|
|
||||||
Data: b,
|
|
||||||
}
|
|
||||||
ws.sendMsg(conn, mReply)
|
|
||||||
}
|
|
||||||
func (ws *WServer) sendMsg(conn *UserConn, mReply interface{}) {
|
|
||||||
var b bytes.Buffer
|
|
||||||
enc := gob.NewEncoder(&b)
|
|
||||||
err := enc.Encode(mReply)
|
|
||||||
if err != nil {
|
|
||||||
// uid, platform := ws.getUserUid(conn)
|
|
||||||
log.NewError(mReply.(Resp).OperationID, mReply.(Resp).ReqIdentifier, mReply.(Resp).ErrCode, mReply.(Resp).ErrMsg, "Encode Msg error", conn.RemoteAddr().String(), err.Error())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
err = ws.writeMsg(conn, websocket.BinaryMessage, b.Bytes())
|
|
||||||
if err != nil {
|
|
||||||
// uid, platform := ws.getUserUid(conn)
|
|
||||||
log.NewError(mReply.(Resp).OperationID, mReply.(Resp).ReqIdentifier, mReply.(Resp).ErrCode, mReply.(Resp).ErrMsg, "ws writeMsg error", conn.RemoteAddr().String(), err.Error())
|
|
||||||
} else {
|
|
||||||
log.Debug(mReply.(Resp).OperationID, mReply.(Resp).ReqIdentifier, mReply.(Resp).ErrCode, mReply.(Resp).ErrMsg, "ws write response success")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
func (ws *WServer) sendErrMsg(conn *UserConn, errCode int32, errMsg string, reqIdentifier int32, msgIncr string, operationID string) {
|
|
||||||
mReply := Resp{
|
|
||||||
ReqIdentifier: reqIdentifier,
|
|
||||||
MsgIncr: msgIncr,
|
|
||||||
ErrCode: errCode,
|
|
||||||
ErrMsg: errMsg,
|
|
||||||
OperationID: operationID,
|
|
||||||
}
|
|
||||||
ws.sendMsg(conn, mReply)
|
|
||||||
}
|
|
||||||
|
|
||||||
func SetTokenKicked(userID string, platformID int, operationID string) {
|
|
||||||
//m, err := db.DB.GetTokenMapByUidPid(userID, constant.PlatformIDToName(platformID))
|
|
||||||
//if err != nil {
|
|
||||||
// log.Error(operationID, "GetTokenMapByUidPid failed ", err.Error(), userID, constant.PlatformIDToName(platformID))
|
|
||||||
// return
|
|
||||||
//}
|
|
||||||
//for k, _ := range m {
|
|
||||||
// m[k] = constant.KickedToken
|
|
||||||
//}
|
|
||||||
//err = db.DB.SetTokenMapByUidPid(userID, platformID, m)
|
|
||||||
//if err != nil {
|
|
||||||
// log.Error(operationID, "SetTokenMapByUidPid failed ", err.Error(), userID, constant.PlatformIDToName(platformID))
|
|
||||||
// return
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ws *WServer) setUserDeviceBackground(conn *UserConn, m *Req) {
|
|
||||||
isPass, errCode, errMsg, pData := ws.argsValidate(m, constant.WsSetBackgroundStatus, m.OperationID)
|
|
||||||
if isPass {
|
|
||||||
req := pData.(*sdkws.SetAppBackgroundStatusReq)
|
|
||||||
conn.IsBackground = req.IsBackground
|
|
||||||
//callbackResp := callbackUserOnline(m.OperationID, conn.userID, int(conn.PlatformID), conn.token, conn.IsBackground, conn.connID)
|
|
||||||
//if callbackResp.ErrCode != 0 {
|
|
||||||
// log.NewError(m.OperationID, utils.GetSelfFuncName(), "callbackUserOffline failed", callbackResp)
|
|
||||||
//}
|
|
||||||
log.NewInfo(m.OperationID, "SetUserDeviceBackground", "success", *conn, req.IsBackground)
|
|
||||||
}
|
|
||||||
ws.setUserDeviceBackgroundResp(conn, m, errCode, errMsg)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ws *WServer) setUserDeviceBackgroundResp(conn *UserConn, m *Req, errCode int32, errMsg string) {
|
|
||||||
mReply := Resp{
|
|
||||||
ReqIdentifier: m.ReqIdentifier,
|
|
||||||
MsgIncr: m.MsgIncr,
|
|
||||||
OperationID: m.OperationID,
|
|
||||||
ErrCode: errCode,
|
|
||||||
ErrMsg: errMsg,
|
|
||||||
}
|
|
||||||
ws.sendMsg(conn, mReply)
|
|
||||||
}
|
|
@ -1,4 +1,4 @@
|
|||||||
package new
|
package msggateway
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/gorilla/websocket"
|
"github.com/gorilla/websocket"
|
@ -1,9 +1,8 @@
|
|||||||
package new
|
package msggateway
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"OpenIM/internal/common/notification"
|
"OpenIM/internal/common/notification"
|
||||||
"OpenIM/pkg/proto/msg"
|
"OpenIM/pkg/proto/msg"
|
||||||
pbRtc "OpenIM/pkg/proto/rtc"
|
|
||||||
"OpenIM/pkg/proto/sdkws"
|
"OpenIM/pkg/proto/sdkws"
|
||||||
"context"
|
"context"
|
||||||
"github.com/go-playground/validator/v10"
|
"github.com/go-playground/validator/v10"
|
||||||
@ -86,7 +85,7 @@ func (g GrpcHandler) SendMessage(context context.Context, data Req) ([]byte, err
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (g GrpcHandler) SendSignalMessage(context context.Context, data Req) ([]byte, error) {
|
func (g GrpcHandler) SendSignalMessage(context context.Context, data Req) ([]byte, error) {
|
||||||
signalReq := pbRtc.SignalReq{}
|
signalReq := sdkws.SignalReq{}
|
||||||
if err := proto.Unmarshal(data.Data, &signalReq); err != nil {
|
if err := proto.Unmarshal(data.Data, &signalReq); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -107,7 +106,7 @@ func (g GrpcHandler) SendSignalMessage(context context.Context, data Req) ([]byt
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (g GrpcHandler) PullMessageBySeqList(context context.Context, data Req) ([]byte, error) {
|
func (g GrpcHandler) PullMessageBySeqList(context context.Context, data Req) ([]byte, error) {
|
||||||
req := sdkws.PullMessageBySeqListReq{}
|
req := sdkws.PullMessageBySeqsReq{}
|
||||||
if err := proto.Unmarshal(data.Data, &req); err != nil {
|
if err := proto.Unmarshal(data.Data, &req); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
@ -1,55 +1,71 @@
|
|||||||
package new
|
package msggateway
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"OpenIM/pkg/common/constant"
|
|
||||||
"OpenIM/pkg/common/tokenverify"
|
"OpenIM/pkg/common/tokenverify"
|
||||||
"OpenIM/pkg/errs"
|
"OpenIM/pkg/errs"
|
||||||
"OpenIM/pkg/utils"
|
"OpenIM/pkg/utils"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/go-playground/validator/v10"
|
"github.com/go-playground/validator/v10"
|
||||||
"github.com/gorilla/websocket"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"sync"
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type LongConnServer interface {
|
||||||
|
Run() error
|
||||||
|
wsHandler(w http.ResponseWriter, r *http.Request)
|
||||||
|
GetUserAllCons(userID string) ([]*Client, bool)
|
||||||
|
GetUserPlatformCons(userID string, platform int) ([]*Client, bool, bool)
|
||||||
|
Validate(s interface{}) error
|
||||||
|
UnRegister(c *Client)
|
||||||
|
Compressor
|
||||||
|
Encoder
|
||||||
|
MessageHandler
|
||||||
|
}
|
||||||
|
|
||||||
var bufferPool = sync.Pool{
|
var bufferPool = sync.Pool{
|
||||||
New: func() interface{} {
|
New: func() interface{} {
|
||||||
return make([]byte, 1024)
|
return make([]byte, 1024)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
type LongConnServer interface {
|
|
||||||
Run() error
|
|
||||||
}
|
|
||||||
|
|
||||||
type Server struct {
|
|
||||||
rpcPort int
|
|
||||||
wsMaxConnNum int
|
|
||||||
longConnServer *LongConnServer
|
|
||||||
//rpcServer *RpcServer
|
|
||||||
}
|
|
||||||
type WsServer struct {
|
type WsServer struct {
|
||||||
port int
|
port int
|
||||||
wsMaxConnNum int64
|
wsMaxConnNum int64
|
||||||
wsUpGrader *websocket.Upgrader
|
|
||||||
registerChan chan *Client
|
registerChan chan *Client
|
||||||
unregisterChan chan *Client
|
unregisterChan chan *Client
|
||||||
clients *UserMap
|
clients *UserMap
|
||||||
clientPool sync.Pool
|
clientPool sync.Pool
|
||||||
onlineUserNum int64
|
onlineUserNum int64
|
||||||
onlineUserConnNum int64
|
onlineUserConnNum int64
|
||||||
gzipCompressor Compressor
|
|
||||||
encoder Encoder
|
|
||||||
handler MessageHandler
|
|
||||||
handshakeTimeout time.Duration
|
handshakeTimeout time.Duration
|
||||||
readBufferSize, WriteBufferSize int
|
readBufferSize, WriteBufferSize int
|
||||||
validate *validator.Validate
|
validate *validator.Validate
|
||||||
|
Compressor
|
||||||
|
Encoder
|
||||||
|
MessageHandler
|
||||||
}
|
}
|
||||||
|
|
||||||
func newWsServer(opts ...Option) (*WsServer, error) {
|
func (ws *WsServer) UnRegister(c *Client) {
|
||||||
|
ws.unregisterChan <- c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ws *WsServer) Validate(s interface{}) error {
|
||||||
|
//TODO implement me
|
||||||
|
panic("implement me")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ws *WsServer) GetUserAllCons(userID string) ([]*Client, bool) {
|
||||||
|
return ws.clients.GetAll(userID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ws *WsServer) GetUserPlatformCons(userID string, platform int) ([]*Client, bool, bool) {
|
||||||
|
return ws.clients.Get(userID, platform)
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewWsServer(opts ...Option) (*WsServer, error) {
|
||||||
var config configs
|
var config configs
|
||||||
for _, o := range opts {
|
for _, o := range opts {
|
||||||
o(&config)
|
o(&config)
|
||||||
@ -58,6 +74,7 @@ func newWsServer(opts ...Option) (*WsServer, error) {
|
|||||||
return nil, errors.New("port not allow to listen")
|
return nil, errors.New("port not allow to listen")
|
||||||
|
|
||||||
}
|
}
|
||||||
|
v := validator.New()
|
||||||
return &WsServer{
|
return &WsServer{
|
||||||
port: config.port,
|
port: config.port,
|
||||||
wsMaxConnNum: config.maxConnNum,
|
wsMaxConnNum: config.maxConnNum,
|
||||||
@ -68,8 +85,13 @@ func newWsServer(opts ...Option) (*WsServer, error) {
|
|||||||
return new(Client)
|
return new(Client)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
validate: validator.New(),
|
registerChan: make(chan *Client, 1000),
|
||||||
|
unregisterChan: make(chan *Client, 1000),
|
||||||
|
validate: v,
|
||||||
clients: newUserMap(),
|
clients: newUserMap(),
|
||||||
|
Compressor: NewGzipCompressor(),
|
||||||
|
Encoder: NewGobEncoder(),
|
||||||
|
MessageHandler: NewGrpcHandler(v, nil),
|
||||||
//handler: NewGrpcHandler(validate),
|
//handler: NewGrpcHandler(validate),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
@ -93,7 +115,7 @@ func (ws *WsServer) registerClient(client *Client) {
|
|||||||
var (
|
var (
|
||||||
userOK bool
|
userOK bool
|
||||||
clientOK bool
|
clientOK bool
|
||||||
cli *Client
|
cli []*Client
|
||||||
)
|
)
|
||||||
cli, userOK, clientOK = ws.clients.Get(client.userID, client.platformID)
|
cli, userOK, clientOK = ws.clients.Get(client.userID, client.platformID)
|
||||||
if !userOK {
|
if !userOK {
|
||||||
@ -116,10 +138,11 @@ func (ws *WsServer) registerClient(client *Client) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ws *WsServer) multiTerminalLoginChecker(client *Client) {
|
func (ws *WsServer) multiTerminalLoginChecker(client []*Client) {
|
||||||
|
|
||||||
}
|
}
|
||||||
func (ws *WsServer) unregisterClient(client *Client) {
|
func (ws *WsServer) unregisterClient(client *Client) {
|
||||||
|
defer ws.clientPool.Put(client)
|
||||||
isDeleteUser := ws.clients.delete(client.userID, client.platformID)
|
isDeleteUser := ws.clients.delete(client.userID, client.platformID)
|
||||||
if isDeleteUser {
|
if isDeleteUser {
|
||||||
atomic.AddInt64(&ws.onlineUserNum, -1)
|
atomic.AddInt64(&ws.onlineUserNum, -1)
|
||||||
@ -141,20 +164,19 @@ func (ws *WsServer) wsHandler(w http.ResponseWriter, r *http.Request) {
|
|||||||
platformID string
|
platformID string
|
||||||
exists bool
|
exists bool
|
||||||
compression bool
|
compression bool
|
||||||
compressor Compressor
|
|
||||||
)
|
)
|
||||||
|
|
||||||
token, exists = context.Query(TOKEN)
|
token, exists = context.Query(Token)
|
||||||
if !exists {
|
if !exists {
|
||||||
httpError(context, errs.ErrConnArgsErr)
|
httpError(context, errs.ErrConnArgsErr)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
userID, exists = context.Query(WS_USERID)
|
userID, exists = context.Query(WsUserID)
|
||||||
if !exists {
|
if !exists {
|
||||||
httpError(context, errs.ErrConnArgsErr)
|
httpError(context, errs.ErrConnArgsErr)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
platformID, exists = context.Query(PLATFORM_ID)
|
platformID, exists = context.Query(PlatformID)
|
||||||
if !exists {
|
if !exists {
|
||||||
httpError(context, errs.ErrConnArgsErr)
|
httpError(context, errs.ErrConnArgsErr)
|
||||||
return
|
return
|
||||||
@ -164,28 +186,26 @@ func (ws *WsServer) wsHandler(w http.ResponseWriter, r *http.Request) {
|
|||||||
httpError(context, err)
|
httpError(context, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
wsLongConn := newGWebSocket(constant.WebSocket, ws.handshakeTimeout, ws.readBufferSize)
|
wsLongConn := newGWebSocket(WebSocket, ws.handshakeTimeout, ws.readBufferSize)
|
||||||
err = wsLongConn.GenerateLongConn(w, r)
|
err = wsLongConn.GenerateLongConn(w, r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
httpError(context, err)
|
httpError(context, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
compressProtoc, exists := context.Query(COMPRESSION)
|
compressProtoc, exists := context.Query(Compression)
|
||||||
if exists {
|
if exists {
|
||||||
if compressProtoc == GZIP_COMPRESSION_PROTOCAL {
|
if compressProtoc == GzipCompressionProtocol {
|
||||||
compression = true
|
compression = true
|
||||||
compressor = ws.gzipCompressor
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
compressProtoc, exists = context.GetHeader(COMPRESSION)
|
compressProtoc, exists = context.GetHeader(Compression)
|
||||||
if exists {
|
if exists {
|
||||||
if compressProtoc == GZIP_COMPRESSION_PROTOCAL {
|
if compressProtoc == GzipCompressionProtocol {
|
||||||
compression = true
|
compression = true
|
||||||
compressor = ws.gzipCompressor
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
client := ws.clientPool.Get().(*Client)
|
client := ws.clientPool.Get().(*Client)
|
||||||
client.ResetClient(context, wsLongConn, compression, compressor, ws.encoder, ws.handler, ws.unregisterChan, ws.validate)
|
client.ResetClient(context, wsLongConn, compression, ws)
|
||||||
ws.registerChan <- client
|
ws.registerChan <- client
|
||||||
go client.readMessage()
|
go client.readMessage()
|
||||||
}
|
}
|
@ -1,12 +0,0 @@
|
|||||||
package new
|
|
||||||
|
|
||||||
const (
|
|
||||||
WS_USERID = "sendID"
|
|
||||||
COMMON_USERID = "userID"
|
|
||||||
PLATFORM_ID = "platformID"
|
|
||||||
CONN_ID = "connID"
|
|
||||||
TOKEN = "token"
|
|
||||||
OPERATION_ID = "operationID"
|
|
||||||
COMPRESSION = "compression"
|
|
||||||
GZIP_COMPRESSION_PROTOCAL = "gzip"
|
|
||||||
)
|
|
@ -1,4 +1,4 @@
|
|||||||
package new
|
package msggateway
|
||||||
|
|
||||||
import "time"
|
import "time"
|
||||||
|
|
@ -1,373 +0,0 @@
|
|||||||
package msggateway
|
|
||||||
|
|
||||||
import (
|
|
||||||
"OpenIM/pkg/common/config"
|
|
||||||
"OpenIM/pkg/common/constant"
|
|
||||||
"OpenIM/pkg/common/log"
|
|
||||||
"OpenIM/pkg/common/prome"
|
|
||||||
"OpenIM/pkg/common/tokenverify"
|
|
||||||
"OpenIM/pkg/proto/msggateway"
|
|
||||||
"OpenIM/pkg/proto/sdkws"
|
|
||||||
"OpenIM/pkg/utils"
|
|
||||||
"bytes"
|
|
||||||
"context"
|
|
||||||
"encoding/gob"
|
|
||||||
"github.com/golang/protobuf/proto"
|
|
||||||
"github.com/gorilla/websocket"
|
|
||||||
grpcPrometheus "github.com/grpc-ecosystem/go-grpc-prometheus"
|
|
||||||
"google.golang.org/grpc"
|
|
||||||
"net"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
type RPCServer struct {
|
|
||||||
rpcPort int
|
|
||||||
rpcRegisterName string
|
|
||||||
etcdSchema string
|
|
||||||
etcdAddr []string
|
|
||||||
platformList []int
|
|
||||||
pushTerminal []int
|
|
||||||
target string
|
|
||||||
}
|
|
||||||
|
|
||||||
func initPrometheus() {
|
|
||||||
prome.NewMsgRecvTotalCounter()
|
|
||||||
prome.NewGetNewestSeqTotalCounter()
|
|
||||||
prome.NewPullMsgBySeqListTotalCounter()
|
|
||||||
prome.NewMsgOnlinePushSuccessCounter()
|
|
||||||
prome.NewOnlineUserGauges()
|
|
||||||
//prome.NewSingleChatMsgRecvSuccessCounter()
|
|
||||||
//prome.NewGroupChatMsgRecvSuccessCounter()
|
|
||||||
//prome.NewWorkSuperGroupChatMsgRecvSuccessCounter()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *RPCServer) onInit(rpcPort int) {
|
|
||||||
r.rpcPort = rpcPort
|
|
||||||
r.rpcRegisterName = config.Config.RpcRegisterName.OpenImMessageGatewayName
|
|
||||||
r.platformList = genPlatformArray()
|
|
||||||
r.pushTerminal = []int{constant.IOSPlatformID, constant.AndroidPlatformID}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *RPCServer) run() {
|
|
||||||
listenIP := ""
|
|
||||||
if config.Config.ListenIP == "" {
|
|
||||||
listenIP = constant.LocalHost
|
|
||||||
} else {
|
|
||||||
listenIP = config.Config.ListenIP
|
|
||||||
}
|
|
||||||
address := listenIP + ":" + strconv.Itoa(r.rpcPort)
|
|
||||||
listener, err := net.Listen("tcp", address)
|
|
||||||
if err != nil {
|
|
||||||
panic("listening err:" + err.Error() + r.rpcRegisterName)
|
|
||||||
}
|
|
||||||
defer listener.Close()
|
|
||||||
var grpcOpts []grpc.ServerOption
|
|
||||||
if config.Config.Prometheus.Enable {
|
|
||||||
prome.NewGrpcRequestCounter()
|
|
||||||
prome.NewGrpcRequestFailedCounter()
|
|
||||||
prome.NewGrpcRequestSuccessCounter()
|
|
||||||
grpcOpts = append(grpcOpts, []grpc.ServerOption{
|
|
||||||
// grpc.UnaryInterceptor(prome.UnaryServerInterceptorProme),
|
|
||||||
grpc.StreamInterceptor(grpcPrometheus.StreamServerInterceptor),
|
|
||||||
grpc.UnaryInterceptor(grpcPrometheus.UnaryServerInterceptor),
|
|
||||||
}...)
|
|
||||||
}
|
|
||||||
srv := grpc.NewServer(grpcOpts...)
|
|
||||||
defer srv.GracefulStop()
|
|
||||||
msggateway.RegisterMsgGatewayServer(srv, r)
|
|
||||||
|
|
||||||
rpcRegisterIP := config.Config.RpcRegisterIP
|
|
||||||
if config.Config.RpcRegisterIP == "" {
|
|
||||||
rpcRegisterIP, err = utils.GetLocalIP()
|
|
||||||
if err != nil {
|
|
||||||
log.Error("", "GetLocalIP failed ", err.Error())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
err = rpc.RegisterEtcd4Unique(r.etcdSchema, strings.Join(r.etcdAddr, ","), rpcRegisterIP, r.rpcPort, r.rpcRegisterName, 10)
|
|
||||||
if err != nil {
|
|
||||||
log.Error("", "register push message rpc to etcd err", "", "err", err.Error(), r.etcdSchema, strings.Join(r.etcdAddr, ","), rpcRegisterIP, r.rpcPort, r.rpcRegisterName)
|
|
||||||
panic(utils.Wrap(err, "register msg_gataway module rpc to etcd err"))
|
|
||||||
}
|
|
||||||
r.target = rpc.GetTarget(r.etcdSchema, rpcRegisterIP, r.rpcPort, r.rpcRegisterName)
|
|
||||||
err = srv.Serve(listener)
|
|
||||||
if err != nil {
|
|
||||||
log.Error("", "push message rpc listening err", "", "err", err.Error())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
func (r *RPCServer) OnlinePushMsg(ctx context.Context, in *msggateway.OnlinePushMsgReq) (*msggateway.OnlinePushMsgResp, error) {
|
|
||||||
log.NewInfo(in.OperationID, "PushMsgToUser is arriving", in.String())
|
|
||||||
var resp []*msggateway.SingleMsgToUserPlatform
|
|
||||||
msgBytes, _ := proto.Marshal(in.MsgData)
|
|
||||||
mReply := Resp{
|
|
||||||
ReqIdentifier: constant.WSPushMsg,
|
|
||||||
OperationID: in.OperationID,
|
|
||||||
Data: msgBytes,
|
|
||||||
}
|
|
||||||
var replyBytes bytes.Buffer
|
|
||||||
enc := gob.NewEncoder(&replyBytes)
|
|
||||||
err := enc.Encode(mReply)
|
|
||||||
if err != nil {
|
|
||||||
log.NewError(in.OperationID, "data encode err", err.Error())
|
|
||||||
}
|
|
||||||
var tag bool
|
|
||||||
recvID := in.PushToUserID
|
|
||||||
for _, v := range r.platformList {
|
|
||||||
if conn := ws.getUserConn(recvID, v); conn != nil {
|
|
||||||
tag = true
|
|
||||||
resultCode := sendMsgToUser(conn, replyBytes.Bytes(), in, v, recvID)
|
|
||||||
temp := &msggateway.SingleMsgToUserPlatform{
|
|
||||||
ResultCode: resultCode,
|
|
||||||
RecvID: recvID,
|
|
||||||
RecvPlatFormID: int32(v),
|
|
||||||
}
|
|
||||||
resp = append(resp, temp)
|
|
||||||
} else {
|
|
||||||
temp := &msggateway.SingleMsgToUserPlatform{
|
|
||||||
ResultCode: -1,
|
|
||||||
RecvID: recvID,
|
|
||||||
RecvPlatFormID: int32(v),
|
|
||||||
}
|
|
||||||
resp = append(resp, temp)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if !tag {
|
|
||||||
log.NewDebug(in.OperationID, "push err ,no matched ws conn not in map", in.String())
|
|
||||||
}
|
|
||||||
return &msggateway.OnlinePushMsgResp{
|
|
||||||
Resp: resp,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
func (r *RPCServer) GetUsersOnlineStatus(_ context.Context, req *msggateway.GetUsersOnlineStatusReq) (*msggateway.GetUsersOnlineStatusResp, error) {
|
|
||||||
log.NewInfo(req.OperationID, "rpc GetUsersOnlineStatus arrived server", req.String())
|
|
||||||
if !tokenverify.IsManagerUserID(req.OpUserID) {
|
|
||||||
log.NewError(req.OperationID, "no permission GetUsersOnlineStatus ", req.OpUserID)
|
|
||||||
return &msggateway.GetUsersOnlineStatusResp{ErrCode: errs.ErrAccess.ErrCode, ErrMsg: errs.ErrAccess.ErrMsg}, nil
|
|
||||||
}
|
|
||||||
var resp msggateway.GetUsersOnlineStatusResp
|
|
||||||
for _, userID := range req.UserIDList {
|
|
||||||
temp := new(msggateway.GetUsersOnlineStatusResp_SuccessResult)
|
|
||||||
temp.UserID = userID
|
|
||||||
userConnMap := ws.getUserAllCons(userID)
|
|
||||||
for platform, userConn := range userConnMap {
|
|
||||||
if userConn != nil {
|
|
||||||
ps := new(msggateway.GetUsersOnlineStatusResp_SuccessDetail)
|
|
||||||
ps.Platform = constant.PlatformIDToName(platform)
|
|
||||||
ps.Status = constant.OnlineStatus
|
|
||||||
ps.ConnID = userConn.connID
|
|
||||||
ps.IsBackground = userConn.IsBackground
|
|
||||||
temp.Status = constant.OnlineStatus
|
|
||||||
temp.DetailPlatformStatus = append(temp.DetailPlatformStatus, ps)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if temp.Status == constant.OnlineStatus {
|
|
||||||
resp.SuccessResult = append(resp.SuccessResult, temp)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
log.NewInfo(req.OperationID, "GetUsersOnlineStatus rpc return ", resp.String())
|
|
||||||
return &resp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *RPCServer) SuperGroupOnlineBatchPushOneMsg(_ context.Context, req *msggateway.OnlineBatchPushOneMsgReq) (*msggateway.OnlineBatchPushOneMsgResp, error) {
|
|
||||||
log.NewInfo(req.OperationID, "BatchPushMsgToUser is arriving", req.String())
|
|
||||||
var singleUserResult []*msggateway.SingleMsgToUserResultList
|
|
||||||
//r.GetBatchMsgForPush(req.OperationID,req.MsgData,req.PushToUserIDList,)
|
|
||||||
msgBytes, _ := proto.Marshal(req.MsgData)
|
|
||||||
mReply := Resp{
|
|
||||||
ReqIdentifier: constant.WSPushMsg,
|
|
||||||
OperationID: req.OperationID,
|
|
||||||
Data: msgBytes,
|
|
||||||
}
|
|
||||||
var replyBytes bytes.Buffer
|
|
||||||
enc := gob.NewEncoder(&replyBytes)
|
|
||||||
err := enc.Encode(mReply)
|
|
||||||
if err != nil {
|
|
||||||
log.NewError(req.OperationID, "data encode err", err.Error())
|
|
||||||
}
|
|
||||||
for _, v := range req.PushToUserIDList {
|
|
||||||
var resp []*msggateway.SingleMsgToUserPlatform
|
|
||||||
tempT := &msggateway.SingleMsgToUserResultList{
|
|
||||||
UserID: v,
|
|
||||||
}
|
|
||||||
userConnMap := ws.getUserAllCons(v)
|
|
||||||
for platform, userConn := range userConnMap {
|
|
||||||
if userConn != nil {
|
|
||||||
temp := &msggateway.SingleMsgToUserPlatform{
|
|
||||||
RecvID: v,
|
|
||||||
RecvPlatFormID: int32(platform),
|
|
||||||
}
|
|
||||||
if !userConn.IsBackground {
|
|
||||||
resultCode := sendMsgBatchToUser(userConn, replyBytes.Bytes(), req, platform, v)
|
|
||||||
if resultCode == 0 && utils.IsContainInt(platform, r.pushTerminal) {
|
|
||||||
tempT.OnlinePush = true
|
|
||||||
prome.Inc(prome.MsgOnlinePushSuccessCounter)
|
|
||||||
log.Info(req.OperationID, "PushSuperMsgToUser is success By Ws", "args", req.String(), "recvPlatForm", constant.PlatformIDToName(platform), "recvID", v)
|
|
||||||
temp.ResultCode = resultCode
|
|
||||||
resp = append(resp, temp)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
temp.ResultCode = -2
|
|
||||||
resp = append(resp, temp)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tempT.Resp = resp
|
|
||||||
singleUserResult = append(singleUserResult, tempT)
|
|
||||||
}
|
|
||||||
|
|
||||||
return &msggateway.OnlineBatchPushOneMsgResp{
|
|
||||||
SinglePushResult: singleUserResult,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
func (r *RPCServer) OnlineBatchPushOneMsg(_ context.Context, req *msggateway.OnlineBatchPushOneMsgReq) (*msggateway.OnlineBatchPushOneMsgResp, error) {
|
|
||||||
log.NewInfo(req.OperationID, "BatchPushMsgToUser is arriving", req.String())
|
|
||||||
var singleUserResult []*msggateway.SingleMsgToUserResultList
|
|
||||||
|
|
||||||
for _, v := range req.PushToUserIDList {
|
|
||||||
var resp []*msggateway.SingleMsgToUserPlatform
|
|
||||||
tempT := &msggateway.SingleMsgToUserResultList{
|
|
||||||
UserID: v,
|
|
||||||
}
|
|
||||||
userConnMap := ws.getUserAllCons(v)
|
|
||||||
var platformList []int
|
|
||||||
for k, _ := range userConnMap {
|
|
||||||
platformList = append(platformList, k)
|
|
||||||
}
|
|
||||||
log.Debug(req.OperationID, "GetSingleUserMsgForPushPlatforms begin", req.MsgData.Seq, v, platformList, req.MsgData.String())
|
|
||||||
needPushMapList := r.GetSingleUserMsgForPushPlatforms(req.OperationID, req.MsgData, v, platformList)
|
|
||||||
log.Debug(req.OperationID, "GetSingleUserMsgForPushPlatforms end", req.MsgData.Seq, v, platformList, len(needPushMapList))
|
|
||||||
for platform, list := range needPushMapList {
|
|
||||||
if list != nil {
|
|
||||||
log.Debug(req.OperationID, "needPushMapList ", "userID: ", v, "platform: ", platform, "push msg num:")
|
|
||||||
//for _, v := range list {
|
|
||||||
// log.Debug(req.OperationID, "req.MsgData.MsgDataList begin", "len: ", len(req.MsgData.MsgDataList), v.String())
|
|
||||||
// req.MsgData.MsgDataList = append(req.MsgData.MsgDataList, v)
|
|
||||||
// log.Debug(req.OperationID, "req.MsgData.MsgDataList end", "len: ", len(req.MsgData.MsgDataList))
|
|
||||||
//}
|
|
||||||
msgBytes, err := proto.Marshal(list)
|
|
||||||
if err != nil {
|
|
||||||
log.Error(req.OperationID, "proto marshal err", err.Error())
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
req.MsgData.MsgDataList = msgBytes
|
|
||||||
//req.MsgData.MsgDataList = append(req.MsgData.MsgDataList, v)
|
|
||||||
log.Debug(req.OperationID, "r.encodeWsData no string")
|
|
||||||
//log.Debug(req.OperationID, "r.encodeWsData data0 list ", req.MsgData.MsgDataList[0].String())
|
|
||||||
|
|
||||||
log.Debug(req.OperationID, "r.encodeWsData ", req.MsgData.String())
|
|
||||||
replyBytes, err := r.encodeWsData(req.MsgData, req.OperationID)
|
|
||||||
if err != nil {
|
|
||||||
log.Error(req.OperationID, "encodeWsData failed ", req.MsgData.String())
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
log.Debug(req.OperationID, "encodeWsData", "len: ", replyBytes.Len())
|
|
||||||
resultCode := sendMsgBatchToUser(userConnMap[platform], replyBytes.Bytes(), req, platform, v)
|
|
||||||
if resultCode == 0 && utils.IsContainInt(platform, r.pushTerminal) {
|
|
||||||
tempT.OnlinePush = true
|
|
||||||
log.Info(req.OperationID, "PushSuperMsgToUser is success By Ws", "args", req.String(), "recv PlatForm", constant.PlatformIDToName(platform), "recvID", v)
|
|
||||||
temp := &msggateway.SingleMsgToUserPlatform{
|
|
||||||
ResultCode: resultCode,
|
|
||||||
RecvID: v,
|
|
||||||
RecvPlatFormID: int32(platform),
|
|
||||||
}
|
|
||||||
resp = append(resp, temp)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if utils.IsContainInt(platform, r.pushTerminal) {
|
|
||||||
tempT.OnlinePush = true
|
|
||||||
temp := &msggateway.SingleMsgToUserPlatform{
|
|
||||||
ResultCode: 0,
|
|
||||||
RecvID: v,
|
|
||||||
RecvPlatFormID: int32(platform),
|
|
||||||
}
|
|
||||||
resp = append(resp, temp)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tempT.Resp = resp
|
|
||||||
singleUserResult = append(singleUserResult, tempT)
|
|
||||||
}
|
|
||||||
return &msggateway.OnlineBatchPushOneMsgResp{
|
|
||||||
SinglePushResult: singleUserResult,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
func (r *RPCServer) encodeWsData(wsData *sdkws.MsgData, operationID string) (bytes.Buffer, error) {
|
|
||||||
log.Debug(operationID, "encodeWsData begin", wsData.String())
|
|
||||||
msgBytes, err := proto.Marshal(wsData)
|
|
||||||
if err != nil {
|
|
||||||
log.NewError(operationID, "Marshal", err.Error())
|
|
||||||
return bytes.Buffer{}, utils.Wrap(err, "")
|
|
||||||
}
|
|
||||||
log.Debug(operationID, "encodeWsData begin", wsData.String())
|
|
||||||
mReply := Resp{
|
|
||||||
ReqIdentifier: constant.WSPushMsg,
|
|
||||||
OperationID: operationID,
|
|
||||||
Data: msgBytes,
|
|
||||||
}
|
|
||||||
var replyBytes bytes.Buffer
|
|
||||||
enc := gob.NewEncoder(&replyBytes)
|
|
||||||
err = enc.Encode(mReply)
|
|
||||||
if err != nil {
|
|
||||||
log.NewError(operationID, "data encode err", err.Error())
|
|
||||||
return bytes.Buffer{}, utils.Wrap(err, "")
|
|
||||||
}
|
|
||||||
return replyBytes, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *RPCServer) KickUserOffline(_ context.Context, req *msggateway.KickUserOfflineReq) (*msggateway.KickUserOfflineResp, error) {
|
|
||||||
log.NewInfo(req.OperationID, "KickUserOffline is arriving", req.String())
|
|
||||||
for _, v := range req.KickUserIDList {
|
|
||||||
log.NewWarn(req.OperationID, "SetTokenKicked ", v, req.PlatformID, req.OperationID)
|
|
||||||
SetTokenKicked(v, int(req.PlatformID), req.OperationID)
|
|
||||||
oldConnMap := ws.getUserAllCons(v)
|
|
||||||
if conn, ok := oldConnMap[int(req.PlatformID)]; ok { // user->map[platform->conn]
|
|
||||||
log.NewWarn(req.OperationID, "send kick msg, close connection ", req.PlatformID, v)
|
|
||||||
ws.sendKickMsg(conn)
|
|
||||||
conn.Close()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return &msggateway.KickUserOfflineResp{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *RPCServer) MultiTerminalLoginCheck(ctx context.Context, req *msggateway.MultiTerminalLoginCheckReq) (*msggateway.MultiTerminalLoginCheckResp, error) {
|
|
||||||
|
|
||||||
ws.MultiTerminalLoginCheckerWithLock(req.UserID, int(req.PlatformID), req.Token, req.OperationID)
|
|
||||||
return &msggateway.MultiTerminalLoginCheckResp{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func sendMsgToUser(conn *UserConn, bMsg []byte, in *msggateway.OnlinePushMsgReq, RecvPlatForm int, RecvID string) (ResultCode int64) {
|
|
||||||
err := ws.writeMsg(conn, websocket.BinaryMessage, bMsg)
|
|
||||||
if err != nil {
|
|
||||||
log.NewError(in.OperationID, "PushMsgToUser is failed By Ws", "Addr", conn.RemoteAddr().String(),
|
|
||||||
"error", err, "senderPlatform", constant.PlatformIDToName(int(in.MsgData.SenderPlatformID)), "recvPlatform", RecvPlatForm, "args", in.String(), "recvID", RecvID)
|
|
||||||
ResultCode = -2
|
|
||||||
return ResultCode
|
|
||||||
} else {
|
|
||||||
log.NewDebug(in.OperationID, "PushMsgToUser is success By Ws", "args", in.String(), "recvPlatForm", RecvPlatForm, "recvID", RecvID)
|
|
||||||
ResultCode = 0
|
|
||||||
return ResultCode
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
func sendMsgBatchToUser(conn *UserConn, bMsg []byte, in *msggateway.OnlineBatchPushOneMsgReq, RecvPlatForm int, RecvID string) (ResultCode int64) {
|
|
||||||
err := ws.writeMsg(conn, websocket.BinaryMessage, bMsg)
|
|
||||||
if err != nil {
|
|
||||||
log.NewError(in.OperationID, "PushMsgToUser is failed By Ws", "Addr", conn.RemoteAddr().String(),
|
|
||||||
"error", err, "senderPlatform", constant.PlatformIDToName(int(in.MsgData.SenderPlatformID)), "recv Platform", RecvPlatForm, "args", in.String(), "recvID", RecvID)
|
|
||||||
ResultCode = -2
|
|
||||||
return ResultCode
|
|
||||||
} else {
|
|
||||||
log.NewDebug(in.OperationID, "PushMsgToUser is success By Ws", "args", in.String(), "recv PlatForm", RecvPlatForm, "recvID", RecvID)
|
|
||||||
ResultCode = 0
|
|
||||||
return ResultCode
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
func genPlatformArray() (array []int) {
|
|
||||||
for i := 1; i <= constant.LinuxPlatformID; i++ {
|
|
||||||
array = append(array, i)
|
|
||||||
}
|
|
||||||
return array
|
|
||||||
}
|
|
@ -1,4 +1,4 @@
|
|||||||
package new
|
package msggateway
|
||||||
|
|
||||||
import "sync"
|
import "sync"
|
||||||
|
|
||||||
@ -16,15 +16,20 @@ func (u *UserMap) GetAll(key string) ([]*Client, bool) {
|
|||||||
}
|
}
|
||||||
return nil, ok
|
return nil, ok
|
||||||
}
|
}
|
||||||
func (u *UserMap) Get(key string, platformID int) (*Client, bool, bool) {
|
func (u *UserMap) Get(key string, platformID int) ([]*Client, bool, bool) {
|
||||||
allClients, userExisted := u.m.Load(key)
|
allClients, userExisted := u.m.Load(key)
|
||||||
if userExisted {
|
if userExisted {
|
||||||
|
var clients []*Client
|
||||||
for _, client := range allClients.([]*Client) {
|
for _, client := range allClients.([]*Client) {
|
||||||
if client.platformID == platformID {
|
if client.platformID == platformID {
|
||||||
return client, userExisted, true
|
clients = append(clients, client)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil, userExisted, false
|
if len(clients) > 0 {
|
||||||
|
return clients, userExisted, true
|
||||||
|
|
||||||
|
}
|
||||||
|
return clients, userExisted, false
|
||||||
}
|
}
|
||||||
return nil, userExisted, false
|
return nil, userExisted, false
|
||||||
}
|
}
|
||||||
@ -35,7 +40,7 @@ func (u *UserMap) Set(key string, v *Client) {
|
|||||||
oldClients = append(oldClients, v)
|
oldClients = append(oldClients, v)
|
||||||
u.m.Store(key, oldClients)
|
u.m.Store(key, oldClients)
|
||||||
} else {
|
} else {
|
||||||
clients := make([]*Client, 3)
|
var clients []*Client
|
||||||
clients = append(clients, v)
|
clients = append(clients, v)
|
||||||
u.m.Store(key, clients)
|
u.m.Store(key, clients)
|
||||||
}
|
}
|
||||||
@ -44,7 +49,7 @@ func (u *UserMap) delete(key string, platformID int) (isDeleteUser bool) {
|
|||||||
allClients, existed := u.m.Load(key)
|
allClients, existed := u.m.Load(key)
|
||||||
if existed {
|
if existed {
|
||||||
oldClients := allClients.([]*Client)
|
oldClients := allClients.([]*Client)
|
||||||
a := make([]*Client, 3)
|
var a []*Client
|
||||||
for _, client := range oldClients {
|
for _, client := range oldClients {
|
||||||
if client.platformID != platformID {
|
if client.platformID != platformID {
|
||||||
a = append(a, client)
|
a = append(a, client)
|
@ -1,125 +0,0 @@
|
|||||||
/*
|
|
||||||
** description("").
|
|
||||||
** copyright('OpenIM,www.OpenIM.io').
|
|
||||||
** author("fg,Gordon@tuoyun.net").
|
|
||||||
** time(2021/5/21 15:29).
|
|
||||||
*/
|
|
||||||
package msggateway
|
|
||||||
|
|
||||||
import (
|
|
||||||
"OpenIM/pkg/common/constant"
|
|
||||||
"OpenIM/pkg/common/log"
|
|
||||||
pbRtc "OpenIM/pkg/proto/rtc"
|
|
||||||
sdkws "OpenIM/pkg/proto/sdkws"
|
|
||||||
"github.com/golang/protobuf/proto"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Req struct {
|
|
||||||
ReqIdentifier int32 `json:"reqIdentifier" validate:"required"`
|
|
||||||
Token string `json:"token" `
|
|
||||||
SendID string `json:"sendID" validate:"required"`
|
|
||||||
OperationID string `json:"operationID" validate:"required"`
|
|
||||||
MsgIncr string `json:"msgIncr" validate:"required"`
|
|
||||||
Data []byte `json:"data"`
|
|
||||||
}
|
|
||||||
type Resp struct {
|
|
||||||
ReqIdentifier int32 `json:"reqIdentifier"`
|
|
||||||
MsgIncr string `json:"msgIncr"`
|
|
||||||
OperationID string `json:"operationID"`
|
|
||||||
ErrCode int32 `json:"errCode"`
|
|
||||||
ErrMsg string `json:"errMsg"`
|
|
||||||
Data []byte `json:"data"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type SeqData struct {
|
|
||||||
SeqBegin int64 `mapstructure:"seqBegin" validate:"required"`
|
|
||||||
SeqEnd int64 `mapstructure:"seqEnd" validate:"required"`
|
|
||||||
}
|
|
||||||
type MsgData struct {
|
|
||||||
PlatformID int32 `mapstructure:"platformID" validate:"required"`
|
|
||||||
SessionType int32 `mapstructure:"sessionType" validate:"required"`
|
|
||||||
MsgFrom int32 `mapstructure:"msgFrom" validate:"required"`
|
|
||||||
ContentType int32 `mapstructure:"contentType" validate:"required"`
|
|
||||||
RecvID string `mapstructure:"recvID" validate:"required"`
|
|
||||||
ForceList []string `mapstructure:"forceList"`
|
|
||||||
Content string `mapstructure:"content" validate:"required"`
|
|
||||||
Options map[string]interface{} `mapstructure:"options" validate:"required"`
|
|
||||||
ClientMsgID string `mapstructure:"clientMsgID" validate:"required"`
|
|
||||||
OfflineInfo map[string]interface{} `mapstructure:"offlineInfo" validate:"required"`
|
|
||||||
Ext map[string]interface{} `mapstructure:"ext"`
|
|
||||||
}
|
|
||||||
type MaxSeqResp struct {
|
|
||||||
MaxSeq int64 `json:"maxSeq"`
|
|
||||||
}
|
|
||||||
type PullMessageResp struct {
|
|
||||||
}
|
|
||||||
type SeqListData struct {
|
|
||||||
SeqList []int64 `mapstructure:"seqList" validate:"required"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ws *WServer) argsValidate(m *Req, r int32, operationID string) (isPass bool, errCode int32, errMsg string, returnData interface{}) {
|
|
||||||
switch r {
|
|
||||||
case constant.WSGetNewestSeq:
|
|
||||||
data := sdkws.GetMaxAndMinSeqReq{}
|
|
||||||
if err := proto.Unmarshal(m.Data, &data); err != nil {
|
|
||||||
log.Error(operationID, "Decode Map struct err", err.Error(), r)
|
|
||||||
return false, 203, err.Error(), nil
|
|
||||||
}
|
|
||||||
if err := validate.Struct(data); err != nil {
|
|
||||||
log.Error(operationID, "data args validate err", err.Error(), r)
|
|
||||||
return false, 204, err.Error(), nil
|
|
||||||
|
|
||||||
}
|
|
||||||
return true, 0, "", data
|
|
||||||
case constant.WSSendMsg:
|
|
||||||
data := sdkws.MsgData{}
|
|
||||||
if err := proto.Unmarshal(m.Data, &data); err != nil {
|
|
||||||
log.Error(operationID, "Decode Map struct err", err.Error(), r)
|
|
||||||
return false, 203, err.Error(), nil
|
|
||||||
}
|
|
||||||
if err := validate.Struct(data); err != nil {
|
|
||||||
log.Error(operationID, "data args validate err", err.Error(), r)
|
|
||||||
return false, 204, err.Error(), nil
|
|
||||||
|
|
||||||
}
|
|
||||||
return true, 0, "", data
|
|
||||||
case constant.WSSendSignalMsg:
|
|
||||||
data := pbRtc.SignalReq{}
|
|
||||||
if err := proto.Unmarshal(m.Data, &data); err != nil {
|
|
||||||
log.Error(operationID, "Decode Map struct err", err.Error(), r)
|
|
||||||
return false, 203, err.Error(), nil
|
|
||||||
}
|
|
||||||
if err := validate.Struct(data); err != nil {
|
|
||||||
log.Error(operationID, "data args validate err", err.Error(), r)
|
|
||||||
return false, 204, err.Error(), nil
|
|
||||||
|
|
||||||
}
|
|
||||||
return true, 0, "", &data
|
|
||||||
case constant.WSPullMsgBySeqList:
|
|
||||||
data := sdkws.PullMessageBySeqListReq{}
|
|
||||||
if err := proto.Unmarshal(m.Data, &data); err != nil {
|
|
||||||
log.Error(operationID, "Decode Map struct err", err.Error(), r)
|
|
||||||
return false, 203, err.Error(), nil
|
|
||||||
}
|
|
||||||
if err := validate.Struct(data); err != nil {
|
|
||||||
log.Error(operationID, "data args validate err", err.Error(), r)
|
|
||||||
return false, 204, err.Error(), nil
|
|
||||||
|
|
||||||
}
|
|
||||||
return true, 0, "", data
|
|
||||||
case constant.WsSetBackgroundStatus:
|
|
||||||
data := sdkws.SetAppBackgroundStatusReq{}
|
|
||||||
if err := proto.Unmarshal(m.Data, &data); err != nil {
|
|
||||||
log.Error(operationID, "Decode Map struct err", err.Error(), r)
|
|
||||||
return false, 203, err.Error(), nil
|
|
||||||
}
|
|
||||||
if err := validate.Struct(data); err != nil {
|
|
||||||
log.Error(operationID, "data args validate err", err.Error(), r)
|
|
||||||
return false, 204, err.Error(), nil
|
|
||||||
|
|
||||||
}
|
|
||||||
return true, 0, "", &data
|
|
||||||
default:
|
|
||||||
}
|
|
||||||
return false, 204, "args err", nil
|
|
||||||
}
|
|
@ -1,514 +0,0 @@
|
|||||||
package msggateway
|
|
||||||
|
|
||||||
import (
|
|
||||||
"OpenIM/pkg/common/config"
|
|
||||||
"OpenIM/pkg/common/constant"
|
|
||||||
"OpenIM/pkg/common/log"
|
|
||||||
"OpenIM/pkg/common/prome"
|
|
||||||
"OpenIM/pkg/common/tokenverify"
|
|
||||||
"OpenIM/pkg/errs"
|
|
||||||
"OpenIM/pkg/proto/msggateway"
|
|
||||||
"OpenIM/pkg/utils"
|
|
||||||
"bytes"
|
|
||||||
"compress/gzip"
|
|
||||||
"context"
|
|
||||||
"encoding/gob"
|
|
||||||
"io/ioutil"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
go_redis "github.com/go-redis/redis/v8"
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
|
|
||||||
//"gopkg.in/errgo.v2/errors"
|
|
||||||
"net/http"
|
|
||||||
"sync"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/gorilla/websocket"
|
|
||||||
)
|
|
||||||
|
|
||||||
type UserConn struct {
|
|
||||||
*websocket.Conn
|
|
||||||
w *sync.Mutex
|
|
||||||
PlatformID int32
|
|
||||||
PushedMaxSeq uint32
|
|
||||||
IsCompress bool
|
|
||||||
userID string
|
|
||||||
IsBackground bool
|
|
||||||
token string
|
|
||||||
connID string
|
|
||||||
}
|
|
||||||
|
|
||||||
type WServer struct {
|
|
||||||
wsAddr string
|
|
||||||
wsMaxConnNum int
|
|
||||||
wsUpGrader *websocket.Upgrader
|
|
||||||
wsConnToUser map[*UserConn]map[int]string
|
|
||||||
wsUserToConn map[string]map[int]*UserConn
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ws *WServer) onInit(wsPort int) {
|
|
||||||
ws.wsAddr = ":" + utils.IntToString(wsPort)
|
|
||||||
ws.wsMaxConnNum = config.Config.LongConnSvr.WebsocketMaxConnNum
|
|
||||||
ws.wsConnToUser = make(map[*UserConn]map[int]string)
|
|
||||||
ws.wsUserToConn = make(map[string]map[int]*UserConn)
|
|
||||||
ws.wsUpGrader = &websocket.Upgrader{
|
|
||||||
HandshakeTimeout: time.Duration(config.Config.LongConnSvr.WebsocketTimeOut) * time.Second,
|
|
||||||
ReadBufferSize: config.Config.LongConnSvr.WebsocketMaxMsgLen,
|
|
||||||
CheckOrigin: func(r *http.Request) bool { return true },
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ws *WServer) run() {
|
|
||||||
http.HandleFunc("/", ws.wsHandler) //Get request from client to handle by wsHandler
|
|
||||||
err := http.ListenAndServe(ws.wsAddr, nil) //Start listening
|
|
||||||
if err != nil {
|
|
||||||
panic("Ws listening err:" + err.Error())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ws *WServer) wsHandler(w http.ResponseWriter, r *http.Request) {
|
|
||||||
query := r.URL.Query()
|
|
||||||
operationID := ""
|
|
||||||
if len(query[constant.OperationID]) != 0 {
|
|
||||||
operationID = query[constant.OperationID][0]
|
|
||||||
} else {
|
|
||||||
operationID = utils.OperationIDGenerator()
|
|
||||||
}
|
|
||||||
log.Debug(operationID, utils.GetSelfFuncName(), " args: ", query)
|
|
||||||
if isPass, compression := ws.headerCheck(w, r, operationID); isPass {
|
|
||||||
conn, err := ws.wsUpGrader.Upgrade(w, r, nil) //Conn is obtained through the upgraded escalator
|
|
||||||
if err != nil {
|
|
||||||
log.Error(operationID, "upgrade http conn err", err.Error(), query)
|
|
||||||
return
|
|
||||||
} else {
|
|
||||||
newConn := &UserConn{conn, new(sync.Mutex), utils.StringToInt32(query["platformID"][0]), 0, compression, query["sendID"][0], false, query["token"][0], conn.RemoteAddr().String() + "_" + strconv.Itoa(int(utils.GetCurrentTimestampByMill()))}
|
|
||||||
userCount++
|
|
||||||
ws.addUserConn(query["sendID"][0], utils.StringToInt(query["platformID"][0]), newConn, query["token"][0], newConn.connID, operationID)
|
|
||||||
go ws.readMsg(newConn)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
log.Error(operationID, "headerCheck failed ")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ws *WServer) readMsg(conn *UserConn) {
|
|
||||||
for {
|
|
||||||
messageType, msg, err := conn.ReadMessage()
|
|
||||||
if messageType == websocket.PingMessage {
|
|
||||||
log.NewInfo("", "this is a pingMessage")
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
log.NewWarn("", "WS ReadMsg error ", " userIP", conn.RemoteAddr().String(), "userUid", "platform", "error", err.Error())
|
|
||||||
userCount--
|
|
||||||
ws.delUserConn(conn)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.NewDebug("", "size", utils.ByteSize(uint64(len(msg))))
|
|
||||||
if conn.IsCompress {
|
|
||||||
buff := bytes.NewBuffer(msg)
|
|
||||||
reader, err := gzip.NewReader(buff)
|
|
||||||
if err != nil {
|
|
||||||
log.NewWarn("", "un gzip read failed")
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
msg, err = ioutil.ReadAll(reader)
|
|
||||||
if err != nil {
|
|
||||||
log.NewWarn("", "ReadAll failed")
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
err = reader.Close()
|
|
||||||
if err != nil {
|
|
||||||
log.NewWarn("", "reader close failed")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ws.msgParse(conn, msg)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ws *WServer) SetWriteTimeout(conn *UserConn, timeout int) {
|
|
||||||
conn.w.Lock()
|
|
||||||
defer conn.w.Unlock()
|
|
||||||
conn.SetWriteDeadline(time.Now().Add(time.Duration(timeout) * time.Second))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ws *WServer) writeMsg(conn *UserConn, a int, msg []byte) error {
|
|
||||||
conn.w.Lock()
|
|
||||||
defer conn.w.Unlock()
|
|
||||||
if conn.IsCompress {
|
|
||||||
var buffer bytes.Buffer
|
|
||||||
gz := gzip.NewWriter(&buffer)
|
|
||||||
if _, err := gz.Write(msg); err != nil {
|
|
||||||
return utils.Wrap(err, "")
|
|
||||||
}
|
|
||||||
if err := gz.Close(); err != nil {
|
|
||||||
return utils.Wrap(err, "")
|
|
||||||
}
|
|
||||||
msg = buffer.Bytes()
|
|
||||||
}
|
|
||||||
conn.SetWriteDeadline(time.Now().Add(time.Duration(60) * time.Second))
|
|
||||||
return conn.WriteMessage(a, msg)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ws *WServer) SetWriteTimeoutWriteMsg(conn *UserConn, a int, msg []byte, timeout int) error {
|
|
||||||
conn.w.Lock()
|
|
||||||
defer conn.w.Unlock()
|
|
||||||
conn.SetWriteDeadline(time.Now().Add(time.Duration(timeout) * time.Second))
|
|
||||||
return conn.WriteMessage(a, msg)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ws *WServer) MultiTerminalLoginRemoteChecker(userID string, platformID int32, token string, operationID string) {
|
|
||||||
grpcCons := rpc.GetDefaultGatewayConn4Unique(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), operationID)
|
|
||||||
log.NewInfo(operationID, utils.GetSelfFuncName(), "args grpcCons: ", userID, platformID, grpcCons)
|
|
||||||
for _, v := range grpcCons {
|
|
||||||
if v.Target() == rpcSvr.target {
|
|
||||||
log.Debug(operationID, "Filter out this node ", rpcSvr.target)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
log.Debug(operationID, "call this node ", v.Target(), rpcSvr.target)
|
|
||||||
client := msggateway.NewRelayClient(v)
|
|
||||||
req := &msggateway.MultiTerminalLoginCheckReq{OperationID: operationID, PlatformID: platformID, UserID: userID, Token: token}
|
|
||||||
log.NewInfo(operationID, "MultiTerminalLoginCheckReq ", client, req.String())
|
|
||||||
resp, err := client.MultiTerminalLoginCheck(context.Background(), req)
|
|
||||||
if err != nil {
|
|
||||||
log.Error(operationID, "MultiTerminalLoginCheck failed ", err.Error())
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if resp.ErrCode != 0 {
|
|
||||||
log.Error(operationID, "MultiTerminalLoginCheck errCode, errMsg: ", resp.ErrCode, resp.ErrMsg)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
log.Debug(operationID, "MultiTerminalLoginCheck resp ", resp.String())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ws *WServer) MultiTerminalLoginCheckerWithLock(uid string, platformID int, token string, operationID string) {
|
|
||||||
rwLock.Lock()
|
|
||||||
defer rwLock.Unlock()
|
|
||||||
log.NewInfo(operationID, utils.GetSelfFuncName(), " rpc args: ", uid, platformID, token)
|
|
||||||
switch config.Config.MultiLoginPolicy {
|
|
||||||
case constant.PCAndOther:
|
|
||||||
if constant.PlatformNameToClass(constant.PlatformIDToName(platformID)) == constant.TerminalPC {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
fallthrough
|
|
||||||
case constant.AllLoginButSameTermKick:
|
|
||||||
if oldConnMap, ok := ws.wsUserToConn[uid]; ok { // user->map[platform->conn]
|
|
||||||
if oldConn, ok := oldConnMap[platformID]; ok {
|
|
||||||
log.NewDebug(operationID, uid, platformID, "kick old conn")
|
|
||||||
m, err := db.DB.GetTokenMapByUidPid(uid, constant.PlatformIDToName(platformID))
|
|
||||||
if err != nil && err != go_redis.Nil {
|
|
||||||
log.NewError(operationID, "get token from redis err", err.Error(), uid, constant.PlatformIDToName(platformID))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if m == nil {
|
|
||||||
log.NewError(operationID, "get token from redis err", "m is nil", uid, constant.PlatformIDToName(platformID))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.NewDebug(operationID, "get token map is ", m, uid, constant.PlatformIDToName(platformID))
|
|
||||||
|
|
||||||
for k, _ := range m {
|
|
||||||
if k != token {
|
|
||||||
m[k] = constant.KickedToken
|
|
||||||
}
|
|
||||||
}
|
|
||||||
log.NewDebug(operationID, "set token map is ", m, uid, constant.PlatformIDToName(platformID))
|
|
||||||
err = db.DB.SetTokenMapByUidPid(uid, platformID, m)
|
|
||||||
if err != nil {
|
|
||||||
log.NewError(operationID, "SetTokenMapByUidPid err", err.Error(), uid, platformID, m)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
err = oldConn.Close()
|
|
||||||
//delete(oldConnMap, platformID)
|
|
||||||
ws.wsUserToConn[uid] = oldConnMap
|
|
||||||
if len(oldConnMap) == 0 {
|
|
||||||
delete(ws.wsUserToConn, uid)
|
|
||||||
}
|
|
||||||
delete(ws.wsConnToUser, oldConn)
|
|
||||||
if err != nil {
|
|
||||||
log.NewError(operationID, "conn close err", err.Error(), uid, platformID)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
log.NewWarn(operationID, "abnormal uid-conn ", uid, platformID, oldConnMap[platformID])
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
log.NewDebug(operationID, "no other conn", ws.wsUserToConn, uid, platformID)
|
|
||||||
}
|
|
||||||
case constant.SingleTerminalLogin:
|
|
||||||
case constant.WebAndOther:
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ws *WServer) MultiTerminalLoginChecker(uid string, platformID int, newConn *UserConn, token string, operationID string) {
|
|
||||||
switch config.Config.MultiLoginPolicy {
|
|
||||||
case constant.PCAndOther:
|
|
||||||
if constant.PlatformNameToClass(constant.PlatformIDToName(platformID)) == constant.TerminalPC {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
fallthrough
|
|
||||||
case constant.AllLoginButSameTermKick:
|
|
||||||
if oldConnMap, ok := ws.wsUserToConn[uid]; ok { // user->map[platform->conn]
|
|
||||||
if oldConn, ok := oldConnMap[platformID]; ok {
|
|
||||||
log.NewDebug(operationID, uid, platformID, "kick old conn")
|
|
||||||
ws.sendKickMsg(oldConn)
|
|
||||||
m, err := db.DB.GetTokenMapByUidPid(uid, constant.PlatformIDToName(platformID))
|
|
||||||
if err != nil && err != go_redis.Nil {
|
|
||||||
log.NewError(operationID, "get token from redis err", err.Error(), uid, constant.PlatformIDToName(platformID))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if m == nil {
|
|
||||||
log.NewError(operationID, "get token from redis err", "m is nil", uid, constant.PlatformIDToName(platformID))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.NewDebug(operationID, "get token map is ", m, uid, constant.PlatformIDToName(platformID))
|
|
||||||
|
|
||||||
for k, _ := range m {
|
|
||||||
if k != token {
|
|
||||||
m[k] = constant.KickedToken
|
|
||||||
}
|
|
||||||
}
|
|
||||||
log.NewDebug(operationID, "set token map is ", m, uid, constant.PlatformIDToName(platformID))
|
|
||||||
err = db.DB.SetTokenMapByUidPid(uid, platformID, m)
|
|
||||||
if err != nil {
|
|
||||||
log.NewError(operationID, "SetTokenMapByUidPid err", err.Error(), uid, platformID, m)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
err = oldConn.Close()
|
|
||||||
delete(oldConnMap, platformID)
|
|
||||||
ws.wsUserToConn[uid] = oldConnMap
|
|
||||||
if len(oldConnMap) == 0 {
|
|
||||||
delete(ws.wsUserToConn, uid)
|
|
||||||
}
|
|
||||||
delete(ws.wsConnToUser, oldConn)
|
|
||||||
if err != nil {
|
|
||||||
log.NewError(operationID, "conn close err", err.Error(), uid, platformID)
|
|
||||||
}
|
|
||||||
callbackResp := callbackUserKickOff(operationID, uid, platformID)
|
|
||||||
if callbackResp.ErrCode != 0 {
|
|
||||||
log.NewError(operationID, utils.GetSelfFuncName(), "callbackUserOffline failed", callbackResp)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
log.Debug(operationID, "normal uid-conn ", uid, platformID, oldConnMap[platformID])
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
log.NewDebug(operationID, "no other conn", ws.wsUserToConn, uid, platformID)
|
|
||||||
}
|
|
||||||
|
|
||||||
case constant.SingleTerminalLogin:
|
|
||||||
case constant.WebAndOther:
|
|
||||||
}
|
|
||||||
}
|
|
||||||
func (ws *WServer) sendKickMsg(oldConn *UserConn) {
|
|
||||||
mReply := Resp{
|
|
||||||
ReqIdentifier: constant.WSKickOnlineMsg,
|
|
||||||
ErrCode: int32(errs.ErrTokenInvalid.Code()),
|
|
||||||
ErrMsg: errs.ErrTokenInvalid.Msg(),
|
|
||||||
}
|
|
||||||
var b bytes.Buffer
|
|
||||||
enc := gob.NewEncoder(&b)
|
|
||||||
err := enc.Encode(mReply)
|
|
||||||
if err != nil {
|
|
||||||
log.NewError(mReply.OperationID, mReply.ReqIdentifier, mReply.ErrCode, mReply.ErrMsg, "Encode Msg error", oldConn.RemoteAddr().String(), err.Error())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
err = ws.writeMsg(oldConn, websocket.BinaryMessage, b.Bytes())
|
|
||||||
if err != nil {
|
|
||||||
log.NewError(mReply.OperationID, mReply.ReqIdentifier, mReply.ErrCode, mReply.ErrMsg, "sendKickMsg WS WriteMsg error", oldConn.RemoteAddr().String(), err.Error())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ws *WServer) addUserConn(uid string, platformID int, conn *UserConn, token string, connID, operationID string) {
|
|
||||||
rwLock.Lock()
|
|
||||||
defer rwLock.Unlock()
|
|
||||||
log.Info(operationID, utils.GetSelfFuncName(), " args: ", uid, platformID, conn, token, "ip: ", conn.RemoteAddr().String())
|
|
||||||
callbackResp := callbackUserOnline(operationID, uid, platformID, token, false, connID)
|
|
||||||
if callbackResp.ErrCode != 0 {
|
|
||||||
log.NewError(operationID, utils.GetSelfFuncName(), "callbackUserOnline resp:", callbackResp)
|
|
||||||
}
|
|
||||||
go ws.MultiTerminalLoginRemoteChecker(uid, int32(platformID), token, operationID)
|
|
||||||
ws.MultiTerminalLoginChecker(uid, platformID, conn, token, operationID)
|
|
||||||
if oldConnMap, ok := ws.wsUserToConn[uid]; ok {
|
|
||||||
oldConnMap[platformID] = conn
|
|
||||||
ws.wsUserToConn[uid] = oldConnMap
|
|
||||||
log.Debug(operationID, "user not first come in, add conn ", uid, platformID, conn, oldConnMap)
|
|
||||||
} else {
|
|
||||||
i := make(map[int]*UserConn)
|
|
||||||
i[platformID] = conn
|
|
||||||
ws.wsUserToConn[uid] = i
|
|
||||||
log.Debug(operationID, "user first come in, new user, conn", uid, platformID, conn, ws.wsUserToConn[uid])
|
|
||||||
}
|
|
||||||
if oldStringMap, ok := ws.wsConnToUser[conn]; ok {
|
|
||||||
oldStringMap[platformID] = uid
|
|
||||||
ws.wsConnToUser[conn] = oldStringMap
|
|
||||||
} else {
|
|
||||||
i := make(map[int]string)
|
|
||||||
i[platformID] = uid
|
|
||||||
ws.wsConnToUser[conn] = i
|
|
||||||
}
|
|
||||||
count := 0
|
|
||||||
for _, v := range ws.wsUserToConn {
|
|
||||||
count = count + len(v)
|
|
||||||
}
|
|
||||||
prome.GaugeInc(prome.OnlineUserGauge)
|
|
||||||
log.Debug(operationID, "WS Add operation", "", "wsUser added", ws.wsUserToConn, "connection_uid", uid, "connection_platform", constant.PlatformIDToName(platformID), "online_user_num", len(ws.wsUserToConn), "online_conn_num", count)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ws *WServer) delUserConn(conn *UserConn) {
|
|
||||||
rwLock.Lock()
|
|
||||||
defer rwLock.Unlock()
|
|
||||||
operationID := utils.OperationIDGenerator()
|
|
||||||
var uid string
|
|
||||||
var platform int
|
|
||||||
if oldStringMap, okg := ws.wsConnToUser[conn]; okg {
|
|
||||||
for k, v := range oldStringMap {
|
|
||||||
platform = k
|
|
||||||
uid = v
|
|
||||||
}
|
|
||||||
if oldConnMap, ok := ws.wsUserToConn[uid]; ok {
|
|
||||||
delete(oldConnMap, platform)
|
|
||||||
ws.wsUserToConn[uid] = oldConnMap
|
|
||||||
if len(oldConnMap) == 0 {
|
|
||||||
delete(ws.wsUserToConn, uid)
|
|
||||||
}
|
|
||||||
count := 0
|
|
||||||
for _, v := range ws.wsUserToConn {
|
|
||||||
count = count + len(v)
|
|
||||||
}
|
|
||||||
log.Debug(operationID, "WS delete operation", "", "wsUser deleted", ws.wsUserToConn, "disconnection_uid", uid, "disconnection_platform", platform, "online_user_num", len(ws.wsUserToConn), "online_conn_num", count)
|
|
||||||
} else {
|
|
||||||
log.Debug(operationID, "WS delete operation", "", "wsUser deleted", ws.wsUserToConn, "disconnection_uid", uid, "disconnection_platform", platform, "online_user_num", len(ws.wsUserToConn))
|
|
||||||
}
|
|
||||||
delete(ws.wsConnToUser, conn)
|
|
||||||
}
|
|
||||||
err := conn.Close()
|
|
||||||
if err != nil {
|
|
||||||
log.Error(operationID, " close err", "", "uid", uid, "platform", platform)
|
|
||||||
}
|
|
||||||
if conn.PlatformID == 0 || conn.connID == "" {
|
|
||||||
log.NewWarn(operationID, utils.GetSelfFuncName(), "PlatformID or connID is null", conn.PlatformID, conn.connID)
|
|
||||||
}
|
|
||||||
callbackResp := callbackUserOffline(operationID, conn.userID, int(conn.PlatformID), conn.connID)
|
|
||||||
if callbackResp.ErrCode != 0 {
|
|
||||||
log.NewError(operationID, utils.GetSelfFuncName(), "callbackUserOffline failed", callbackResp)
|
|
||||||
}
|
|
||||||
prome.GaugeDec(prome.OnlineUserGauge)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ws *WServer) getUserConn(uid string, platform int) *UserConn {
|
|
||||||
rwLock.RLock()
|
|
||||||
defer rwLock.RUnlock()
|
|
||||||
if connMap, ok := ws.wsUserToConn[uid]; ok {
|
|
||||||
if conn, flag := connMap[platform]; flag {
|
|
||||||
return conn
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
func (ws *WServer) getUserAllCons(uid string) map[int]*UserConn {
|
|
||||||
rwLock.RLock()
|
|
||||||
defer rwLock.RUnlock()
|
|
||||||
if connMap, ok := ws.wsUserToConn[uid]; ok {
|
|
||||||
newConnMap := make(map[int]*UserConn)
|
|
||||||
for k, v := range connMap {
|
|
||||||
newConnMap[k] = v
|
|
||||||
}
|
|
||||||
return newConnMap
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// func (ws *WServer) getUserUid(conn *UserConn) (uid string, platform int) {
|
|
||||||
// rwLock.RLock()
|
|
||||||
// defer rwLock.RUnlock()
|
|
||||||
//
|
|
||||||
// if stringMap, ok := ws.wsConnToUser[conn]; ok {
|
|
||||||
// for k, v := range stringMap {
|
|
||||||
// platform = k
|
|
||||||
// uid = v
|
|
||||||
// }
|
|
||||||
// return uid, platform
|
|
||||||
// }
|
|
||||||
// return "", 0
|
|
||||||
// }
|
|
||||||
|
|
||||||
func WsVerifyToken(token, uid string, platformID string, operationID string) (bool, error, string) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ws *WServer) headerCheck(w http.ResponseWriter, r *http.Request, operationID string) (isPass, compression bool) {
|
|
||||||
status := http.StatusUnauthorized
|
|
||||||
query := r.URL.Query()
|
|
||||||
if len(query["token"]) != 0 && len(query["sendID"]) != 0 && len(query["platformID"]) != 0 {
|
|
||||||
if ok, err, msg := tokenverify.WsVerifyToken(query["token"][0], query["sendID"][0], query["platformID"][0], operationID); !ok {
|
|
||||||
if errors.Is(err, errs.ErrTokenExpired) {
|
|
||||||
status = int(errs.ErrTokenExpired.ErrCode)
|
|
||||||
}
|
|
||||||
if errors.Is(err, errs.ErrTokenInvalid) {
|
|
||||||
status = int(errs.ErrTokenInvalid.ErrCode)
|
|
||||||
}
|
|
||||||
if errors.Is(err, errs.ErrTokenMalformed) {
|
|
||||||
status = int(errs.ErrTokenMalformed.ErrCode)
|
|
||||||
}
|
|
||||||
if errors.Is(err, errs.ErrTokenNotValidYet) {
|
|
||||||
status = int(errs.ErrTokenNotValidYet.ErrCode)
|
|
||||||
}
|
|
||||||
if errors.Is(err, errs.ErrTokenUnknown) {
|
|
||||||
status = int(errs.ErrTokenUnknown.ErrCode)
|
|
||||||
}
|
|
||||||
if errors.Is(err, errs.ErrTokenKicked) {
|
|
||||||
status = int(errs.ErrTokenKicked.ErrCode)
|
|
||||||
}
|
|
||||||
if errors.Is(err, errs.ErrTokenDifferentPlatformID) {
|
|
||||||
status = int(errs.ErrTokenDifferentPlatformID.ErrCode)
|
|
||||||
}
|
|
||||||
if errors.Is(err, errs.ErrTokenDifferentUserID) {
|
|
||||||
status = int(errs.ErrTokenDifferentUserID.ErrCode)
|
|
||||||
}
|
|
||||||
//switch errors.Cause(err) {
|
|
||||||
//case errs.ErrTokenExpired:
|
|
||||||
// status = int(errs.ErrTokenExpired.ErrCode)
|
|
||||||
//case errs.ErrTokenInvalid:
|
|
||||||
// status = int(errs.ErrTokenInvalid.ErrCode)
|
|
||||||
//case errs.ErrTokenMalformed:
|
|
||||||
// status = int(errs.ErrTokenMalformed.ErrCode)
|
|
||||||
//case errs.ErrTokenNotValidYet:
|
|
||||||
// status = int(errs.ErrTokenNotValidYet.ErrCode)
|
|
||||||
//case errs.ErrTokenUnknown:
|
|
||||||
// status = int(errs.ErrTokenUnknown.ErrCode)
|
|
||||||
//case errs.ErrTokenKicked:
|
|
||||||
// status = int(errs.ErrTokenKicked.ErrCode)
|
|
||||||
//case errs.ErrTokenDifferentPlatformID:
|
|
||||||
// status = int(errs.ErrTokenDifferentPlatformID.ErrCode)
|
|
||||||
//case errs.ErrTokenDifferentUserID:
|
|
||||||
// status = int(errs.ErrTokenDifferentUserID.ErrCode)
|
|
||||||
//}
|
|
||||||
|
|
||||||
log.Error(operationID, "Token verify failed ", "query ", query, msg, err.Error(), "status: ", status)
|
|
||||||
w.Header().Set("Sec-Websocket-Version", "13")
|
|
||||||
w.Header().Set("ws_err_msg", err.Error())
|
|
||||||
http.Error(w, err.Error(), status)
|
|
||||||
return false, false
|
|
||||||
} else {
|
|
||||||
if r.Header.Get("compression") == "gzip" {
|
|
||||||
compression = true
|
|
||||||
}
|
|
||||||
if len(query["compression"]) != 0 && query["compression"][0] == "gzip" {
|
|
||||||
compression = true
|
|
||||||
}
|
|
||||||
log.Info(operationID, "Connection Authentication Success", "", "token ", query["token"][0], "userID ", query["sendID"][0], "platformID ", query["platformID"][0], "compression", compression)
|
|
||||||
return true, compression
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
status = int(errs.ErrArgs.ErrCode)
|
|
||||||
log.Error(operationID, "Args err ", "query ", query)
|
|
||||||
w.Header().Set("Sec-Websocket-Version", "13")
|
|
||||||
errMsg := "args err, need token, sendID, platformID"
|
|
||||||
w.Header().Set("ws_err_msg", errMsg)
|
|
||||||
http.Error(w, errMsg, status)
|
|
||||||
return false, false
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,16 +1,6 @@
|
|||||||
package constant
|
package constant
|
||||||
|
|
||||||
const (
|
const (
|
||||||
//Websocket Protocol
|
|
||||||
WSGetNewestSeq = 1001
|
|
||||||
WSPullMsgBySeqList = 1002
|
|
||||||
WSSendMsg = 1003
|
|
||||||
WSSendSignalMsg = 1004
|
|
||||||
WSPushMsg = 2001
|
|
||||||
WSKickOnlineMsg = 2002
|
|
||||||
WsLogoutMsg = 2003
|
|
||||||
WsSetBackgroundStatus = 2004
|
|
||||||
WSDataError = 3001
|
|
||||||
|
|
||||||
///ContentType
|
///ContentType
|
||||||
//UserRelated
|
//UserRelated
|
||||||
|
@ -90,3 +90,6 @@ func ParseRedisInterfaceToken(redisToken interface{}) (*Claims, error) {
|
|||||||
func IsManagerUserID(opUserID string) bool {
|
func IsManagerUserID(opUserID string) bool {
|
||||||
return utils.IsContain(opUserID, config.Config.Manager.AppManagerUid)
|
return utils.IsContain(opUserID, config.Config.Manager.AppManagerUid)
|
||||||
}
|
}
|
||||||
|
func WsVerifyToken(token, userID, platformID string) error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user