mirror of https://github.com/grafana/grafana.git
				
				
				
			Live: update centrifuge and the ChannelHandler api (#28843)
This commit is contained in:
		
							parent
							
								
									d736fcdd1d
								
							
						
					
					
						commit
						b91e9faccf
					
				
							
								
								
									
										2
									
								
								go.mod
								
								
								
								
							
							
						
						
									
										2
									
								
								go.mod
								
								
								
								
							|  | @ -19,7 +19,7 @@ require ( | |||
| 	github.com/beevik/etree v1.1.0 | ||||
| 	github.com/benbjohnson/clock v0.0.0-20161215174838-7dc76406b6d3 | ||||
| 	github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b | ||||
| 	github.com/centrifugal/centrifuge v0.11.0 | ||||
| 	github.com/centrifugal/centrifuge v0.13.0 | ||||
| 	github.com/crewjam/saml v0.4.1 | ||||
| 	github.com/davecgh/go-spew v1.1.1 | ||||
| 	github.com/deepmap/oapi-codegen v1.3.11 // indirect | ||||
|  |  | |||
							
								
								
									
										35
									
								
								go.sum
								
								
								
								
							
							
						
						
									
										35
									
								
								go.sum
								
								
								
								
							|  | @ -16,9 +16,7 @@ cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bP | |||
| cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= | ||||
| cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= | ||||
| cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= | ||||
| cloud.google.com/go v0.65.0 h1:Dg9iHVQfrhq82rUNu9ZxUDrJLaxFUe/HlCVaLyRruq8= | ||||
| cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= | ||||
| cloud.google.com/go v0.66.0 h1:DZeAkuQGQqnm9Xv36SbMJEU8aFBz4wL04UpMWPWwjzg= | ||||
| cloud.google.com/go v0.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0Ko= | ||||
| cloud.google.com/go v0.70.0 h1:ujhG1RejZYi+HYfJNlgBh3j/bVKD8DewM7AkJ5UPyBc= | ||||
| cloud.google.com/go v0.70.0/go.mod h1:/UTKYRQTWjVnSe7nGvoSzxEFUELzSI/yAYd0JQT6cRo= | ||||
|  | @ -40,9 +38,7 @@ cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiy | |||
| cloud.google.com/go/storage v1.3.0/go.mod h1:9IAwXhoyBJ7z9LcAwkj0/7NnPzYaPeZxxVp3zm+5IqA= | ||||
| cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= | ||||
| cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= | ||||
| cloud.google.com/go/storage v1.8.0 h1:86K1Gel7BQ9/WmNWn7dTKMvTLFzwtBe5FNqYbi9X35g= | ||||
| cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= | ||||
| cloud.google.com/go/storage v1.10.0 h1:STgFzyU5/8miMl0//zKh2aQeTyeaUH3WN9bSUiJ09bA= | ||||
| cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= | ||||
| cloud.google.com/go/storage v1.12.0 h1:4y3gHptW1EHVtcPAVE0eBBlFuGqEejTTG3KdIE0lUX4= | ||||
| cloud.google.com/go/storage v1.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= | ||||
|  | @ -153,7 +149,6 @@ github.com/aws/aws-sdk-go v1.25.48/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpi | |||
| github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= | ||||
| github.com/aws/aws-sdk-go v1.31.9/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= | ||||
| github.com/aws/aws-sdk-go v1.33.5/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= | ||||
| github.com/aws/aws-sdk-go v1.33.12 h1:eydMoSwfrSTD9PWKUJOiDL7+/UwDW8AjInUGVE5Llh4= | ||||
| github.com/aws/aws-sdk-go v1.33.12/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= | ||||
| github.com/aws/aws-sdk-go v1.35.5 h1:doSEOxC0UkirPcle20Rc+1kAhJ4Ip+GSEeZ3nKl7Qlk= | ||||
| github.com/aws/aws-sdk-go v1.35.5/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k= | ||||
|  | @ -187,8 +182,8 @@ github.com/cenkalti/backoff v1.0.0/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQ | |||
| github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= | ||||
| github.com/cenkalti/backoff/v4 v4.0.2/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg= | ||||
| github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= | ||||
| github.com/centrifugal/centrifuge v0.11.0 h1:aaG74PBO+rBmz3hE9W8bCGz8kofiam1LNE4EAVtiMaA= | ||||
| github.com/centrifugal/centrifuge v0.11.0/go.mod h1:jdFw/2dBFpME3OTisc5FVAC1ilqodnyMnQFjem0k0yg= | ||||
| github.com/centrifugal/centrifuge v0.13.0 h1:nfcpaa/TXoA56ba/xXs3rc2Vrj/UZTFS1iTQ9q2MSZE= | ||||
| github.com/centrifugal/centrifuge v0.13.0/go.mod h1:jdFw/2dBFpME3OTisc5FVAC1ilqodnyMnQFjem0k0yg= | ||||
| github.com/centrifugal/protocol v0.3.4 h1:9q22iSp4CQOdQahfopvfmWWxDbj1Lo7ERG2j56mAxkE= | ||||
| github.com/centrifugal/protocol v0.3.4/go.mod h1:2YbBCaDwQHl37ErRdMrKSj18X2yVvpkQYtSX6aVbe5A= | ||||
| github.com/cespare/xxhash v0.0.0-20181017004759-096ff4a8a059/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= | ||||
|  | @ -495,7 +490,6 @@ github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb | |||
| github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= | ||||
| github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= | ||||
| github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= | ||||
| github.com/golang/mock v1.4.3 h1:GV+pQPG/EUUbkh47niozDcADz6go/dUwhVzdUQHIVRw= | ||||
| github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= | ||||
| github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= | ||||
| github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= | ||||
|  | @ -512,7 +506,6 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU | |||
| github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= | ||||
| github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= | ||||
| github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= | ||||
| github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= | ||||
| github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= | ||||
| github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= | ||||
| github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= | ||||
|  | @ -534,7 +527,6 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw | |||
| github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= | ||||
| github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||
| github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||
| github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w= | ||||
| github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||
| github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||
| github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= | ||||
|  | @ -562,7 +554,6 @@ github.com/google/pprof v0.0.0-20201009210932-67992a1a5a35/go.mod h1:kpwsk12EmLe | |||
| github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= | ||||
| github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||
| github.com/google/uuid v1.1.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||
| github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= | ||||
| github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||
| github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= | ||||
| github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||
|  | @ -711,7 +702,6 @@ github.com/jhump/protoreflect v1.6.0 h1:h5jfMVslIg6l29nsMs0D8Wj17RDVdNYti0vDN/PZ | |||
| github.com/jhump/protoreflect v1.6.0/go.mod h1:eaTn3RZAmMBcV0fifFvlm6VHNz3wSkYyXYWUh7ymB74= | ||||
| github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= | ||||
| github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= | ||||
| github.com/jmespath/go-jmespath v0.3.0 h1:OS12ieG61fsCg5+qLJ+SsW9NicxNkg3b25OyT2yCeUc= | ||||
| github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= | ||||
| github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= | ||||
| github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= | ||||
|  | @ -719,7 +709,6 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGw | |||
| github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= | ||||
| github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= | ||||
| github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= | ||||
| github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= | ||||
| github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= | ||||
| github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= | ||||
| github.com/jonboulle/clockwork v0.2.1 h1:S/EaQvW6FpWMYAvYvY+OBDvpaM+izu0oiwo5y0MH7U0= | ||||
|  | @ -1049,7 +1038,6 @@ github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR | |||
| github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= | ||||
| github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= | ||||
| github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= | ||||
| github.com/russellhaering/goxmldsig v0.0.0-20180430223755-7acd5e4a6ef7 h1:J4AOUcOh/t1XbQcJfkEqhzgvMJ2tDxdCVvmHxW5QXao= | ||||
| github.com/russellhaering/goxmldsig v0.0.0-20180430223755-7acd5e4a6ef7/go.mod h1:Oz4y6ImuOQZxynhbSXk7btjEfNBtGlj2dcaOvXl2FSM= | ||||
| github.com/russellhaering/goxmldsig v0.0.0-20200902171629-2e1fbc2c5593 h1:wkyiSzH81tsd3tSoznvnXMIJo0cpHjbFuJhs/E9t/B8= | ||||
| github.com/russellhaering/goxmldsig v0.0.0-20200902171629-2e1fbc2c5593/go.mod h1:QK8GhXPB3+AfuCrfo0oRISa9NfzeCpWmxeGnqEpDF9o= | ||||
|  | @ -1064,7 +1052,6 @@ github.com/samuel/go-zookeeper v0.0.0-20200724154423-2164a8ac840e/go.mod h1:gi+0 | |||
| github.com/santhosh-tekuri/jsonschema v1.2.4/go.mod h1:TEAUOeZSmIxTTuHatJzrvARHiuO9LYd+cIxzgEHCQI4= | ||||
| github.com/satori/go.uuid v0.0.0-20160603004225-b111a074d5ef/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= | ||||
| github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= | ||||
| github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b h1:gQZ0qzfKHQIybLANtM3mBXNUtOfsCFXeTsnBqCsx1KM= | ||||
| github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= | ||||
| github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= | ||||
| github.com/segmentio/fasthash v0.0.0-20180216231524-a72b379d632e/go.mod h1:tm/wZFQ8e24NYaBGIlnO2WGCAi67re4HHuOm0sftE/M= | ||||
|  | @ -1124,7 +1111,6 @@ github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf | |||
| github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= | ||||
| github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= | ||||
| github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= | ||||
| github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= | ||||
| github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= | ||||
| github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= | ||||
| github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | ||||
|  | @ -1215,9 +1201,7 @@ go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= | |||
| go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= | ||||
| go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= | ||||
| go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= | ||||
| go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8= | ||||
| go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= | ||||
| go.opencensus.io v0.22.4 h1:LYy1Hy3MJdrCdMwwzxA/dRok4ejH+RwNGbuoD9fCjto= | ||||
| go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= | ||||
| go.opencensus.io v0.22.5 h1:dntmOdLpSpHlVqbW5Eay97DelsZHe+55D+xC6i0dDS0= | ||||
| go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= | ||||
|  | @ -1356,7 +1340,6 @@ golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81R | |||
| golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= | ||||
| golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= | ||||
| golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= | ||||
| golang.org/x/net v0.0.0-20201021035429-f5854403a974 h1:IX6qOQeG5uLjB/hjjwjedwfjND0hgjPMMyO1RoIXQNI= | ||||
| golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= | ||||
| golang.org/x/net v0.0.0-20201022231255-08b38378de70 h1:Z6x4N9mAi4oF0TbHweCsH618MO6OI6UFgV0FP5n0wBY= | ||||
| golang.org/x/net v0.0.0-20201022231255-08b38378de70/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= | ||||
|  | @ -1366,7 +1349,6 @@ golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4Iltr | |||
| golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | ||||
| golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | ||||
| golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | ||||
| golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= | ||||
| golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | ||||
| golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43 h1:ld7aEMNHoBnnDAX15v1T6z31v8HwR2A9FYOuAhWqkwc= | ||||
| golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= | ||||
|  | @ -1378,7 +1360,6 @@ golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJ | |||
| golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 h1:qwRHBd0NqMbJxfbotnDhm2ByMI1Shq4Y6oRJo21SGJA= | ||||
| golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9 h1:SQFwaSi55rU7vdNs9Yr0Z324VNlrF+0wMqRXT4St8ck= | ||||
| golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
|  | @ -1457,7 +1438,6 @@ golang.org/x/sys v0.0.0-20200724161237-0e2f3a69832c/go.mod h1:h1NjWce9XRLGQEsW7w | |||
| golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20200828194041-157a740278f4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA= | ||||
| golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20201022201747-fb209a7c41cd h1:WgqgiQvkiZWz7XLhphjt2GI2GcGCTIZs9jqXMWmH+oc= | ||||
| golang.org/x/sys v0.0.0-20201022201747-fb209a7c41cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
|  | @ -1545,13 +1525,11 @@ golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roY | |||
| golang.org/x/tools v0.0.0-20200603131246-cc40288be839/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= | ||||
| golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= | ||||
| golang.org/x/tools v0.0.0-20200710042808-f1c4188a97a1/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= | ||||
| golang.org/x/tools v0.0.0-20200725200936-102e7d357031 h1:VtIxiVHWPhnny2ZTi4f9/2diZKqyLaq3FUTuud5+khA= | ||||
| golang.org/x/tools v0.0.0-20200725200936-102e7d357031/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= | ||||
| golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= | ||||
| golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= | ||||
| golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= | ||||
| golang.org/x/tools v0.0.0-20200828161849-5deb26317202/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= | ||||
| golang.org/x/tools v0.0.0-20200904185747-39188db58858 h1:xLt+iB5ksWcZVxqc+g9K41ZHy+6MKWfXCDsjSThnsPA= | ||||
| golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= | ||||
| golang.org/x/tools v0.0.0-20200915173823-2db8f0ff891c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= | ||||
| golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= | ||||
|  | @ -1560,7 +1538,6 @@ golang.org/x/tools v0.0.0-20201023150057-2f4fa188d925 h1:iGGR3nU1TUd+WTF17QPTTSh | |||
| golang.org/x/tools v0.0.0-20201023150057-2f4fa188d925/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= | ||||
| golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= | ||||
| golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= | ||||
| golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
|  | @ -1587,7 +1564,6 @@ google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/ | |||
| google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= | ||||
| google.golang.org/api v0.26.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= | ||||
| google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= | ||||
| google.golang.org/api v0.29.0 h1:BaiDisFir8O4IJxvAabCGGkQ6yCJegNQqSVoYUNAnbk= | ||||
| google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= | ||||
| google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= | ||||
| google.golang.org/api v0.31.0/go.mod h1:CL+9IBCa2WWU6gRuBWaKqGWLFFwbEUXkfeMkHLQWYWo= | ||||
|  | @ -1602,7 +1578,6 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 | |||
| google.golang.org/appengine v1.6.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= | ||||
| google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= | ||||
| google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= | ||||
| google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc= | ||||
| google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= | ||||
| google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= | ||||
| google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= | ||||
|  | @ -1644,16 +1619,13 @@ google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEY | |||
| google.golang.org/genproto v0.0.0-20200603110839-e855014d5736/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= | ||||
| google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= | ||||
| google.golang.org/genproto v0.0.0-20200710124503-20a17af7bd0e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | ||||
| google.golang.org/genproto v0.0.0-20200724131911-43cab4749ae7 h1:AWgNCmk2V5HZp9AiCDRBExX/b9I0Ey9F8STHDZlhCC4= | ||||
| google.golang.org/genproto v0.0.0-20200724131911-43cab4749ae7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | ||||
| google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | ||||
| google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | ||||
| google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | ||||
| google.golang.org/genproto v0.0.0-20200831141814-d751682dd103/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | ||||
| google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d h1:92D1fum1bJLKSdr11OJ+54YeCMCGYIygTA7R/YZxH5M= | ||||
| google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | ||||
| google.golang.org/genproto v0.0.0-20200914193844-75d14daec038/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | ||||
| google.golang.org/genproto v0.0.0-20200921151605-7abf4a1a14d5 h1:B9nroC8SSX5GtbVvxPF9tYIVkaCpjhVLOrlAY8ONzm8= | ||||
| google.golang.org/genproto v0.0.0-20200921151605-7abf4a1a14d5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | ||||
| google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | ||||
| google.golang.org/genproto v0.0.0-20201022181438-0ff5f38871d5 h1:YejJbGvoWsTXHab4OKNrzk27Dr7s4lPLnewbHue1+gM= | ||||
|  | @ -1678,12 +1650,9 @@ google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8 | |||
| google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= | ||||
| google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= | ||||
| google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= | ||||
| google.golang.org/grpc v1.30.0 h1:M5a8xTlYTxwMn5ZFkwhRabsygDY5G8TYLyQDBxJNAxE= | ||||
| google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= | ||||
| google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= | ||||
| google.golang.org/grpc v1.31.1 h1:SfXqXS5hkufcdZ/mHtYCh53P2b+92WQq/DZcKLgsFRs= | ||||
| google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= | ||||
| google.golang.org/grpc v1.32.0 h1:zWTV+LMdc3kaiJMSTOFz2UgSBgx8RNQoTGiZu3fR9S0= | ||||
| google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= | ||||
| google.golang.org/grpc v1.33.1 h1:DGeFlSan2f+WEtCERJ4J9GJWk15TxUi8QGagfI87Xyc= | ||||
| google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= | ||||
|  |  | |||
|  | @ -7,15 +7,11 @@ type ChannelPublisher func(channel string, data []byte) error | |||
| 
 | ||||
| // ChannelHandler defines the core channel behavior
 | ||||
| type ChannelHandler interface { | ||||
| 	// This is called fast and often -- it must be synchrnozed
 | ||||
| 	GetChannelOptions(id string) centrifuge.ChannelOptions | ||||
| 	// OnSubscribe is called when a client wants to subscribe to a channel
 | ||||
| 	OnSubscribe(c *centrifuge.Client, e centrifuge.SubscribeEvent) (centrifuge.SubscribeReply, error) | ||||
| 
 | ||||
| 	// Called when a client wants to subscribe to a channel
 | ||||
| 	OnSubscribe(c *centrifuge.Client, e centrifuge.SubscribeEvent) error | ||||
| 
 | ||||
| 	// AllowBroadcast is called when a client writes a message to the channel websocket.
 | ||||
| 	// Returning an error will cancel the broadcast.
 | ||||
| 	AllowBroadcast(c *centrifuge.Client, e centrifuge.PublishEvent) error | ||||
| 	// OnPublish is called when a client writes a message to the channel websocket.
 | ||||
| 	OnPublish(c *centrifuge.Client, e centrifuge.PublishEvent) (centrifuge.PublishReply, error) | ||||
| } | ||||
| 
 | ||||
| // ChannelHandlerFactory should be implemented by all core features.
 | ||||
|  |  | |||
|  | @ -1,32 +1,38 @@ | |||
| package features | ||||
| 
 | ||||
| import ( | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/centrifugal/centrifuge" | ||||
| 	"github.com/grafana/grafana/pkg/models" | ||||
| ) | ||||
| 
 | ||||
| // BroadcastRunner will simply broadcast all events to `grafana/broadcast/*` channels
 | ||||
| // This assumes that data is a JSON object
 | ||||
| type BroadcastRunner struct { | ||||
| } | ||||
| type BroadcastRunner struct{} | ||||
| 
 | ||||
| // GetHandlerForPath called on init
 | ||||
| func (b *BroadcastRunner) GetHandlerForPath(path string) (models.ChannelHandler, error) { | ||||
| 	return b, nil // for now all channels share config
 | ||||
| 	return b, nil // all dashboards share the same handler
 | ||||
| } | ||||
| 
 | ||||
| // GetChannelOptions called fast and often
 | ||||
| func (b *BroadcastRunner) GetChannelOptions(id string) centrifuge.ChannelOptions { | ||||
| 	return centrifuge.ChannelOptions{} | ||||
| // OnSubscribe will let anyone connect to the path
 | ||||
| func (b *BroadcastRunner) OnSubscribe(c *centrifuge.Client, e centrifuge.SubscribeEvent) (centrifuge.SubscribeReply, error) { | ||||
| 	return centrifuge.SubscribeReply{ | ||||
| 		Options: centrifuge.SubscribeOptions{ | ||||
| 			Presence:  true, | ||||
| 			JoinLeave: true, | ||||
| 			Recover:   true, // loads the saved value from history
 | ||||
| 		}, | ||||
| 	}, nil | ||||
| } | ||||
| 
 | ||||
| // OnSubscribe for now allows anyone to subscribe to any dashboard
 | ||||
| func (b *BroadcastRunner) OnSubscribe(c *centrifuge.Client, e centrifuge.SubscribeEvent) error { | ||||
| 	// anyone can subscribe
 | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // AllowBroadcast checks if a message can be broadcast on this channel
 | ||||
| func (b *BroadcastRunner) AllowBroadcast(c *centrifuge.Client, e centrifuge.PublishEvent) error { | ||||
| 	return nil | ||||
| // OnPublish is called when a client wants to broadcast on the websocket
 | ||||
| func (b *BroadcastRunner) OnPublish(c *centrifuge.Client, e centrifuge.PublishEvent) (centrifuge.PublishReply, error) { | ||||
| 	return centrifuge.PublishReply{ | ||||
| 		Options: centrifuge.PublishOptions{ | ||||
| 			HistorySize: 1, // The last message is saved for 10 mins
 | ||||
| 			HistoryTTL:  10 * time.Minute, | ||||
| 		}, | ||||
| 	}, nil | ||||
| } | ||||
|  |  | |||
|  | @ -21,42 +21,39 @@ type DashboardHandler struct { | |||
| } | ||||
| 
 | ||||
| // GetHandlerForPath called on init
 | ||||
| func (g *DashboardHandler) GetHandlerForPath(path string) (models.ChannelHandler, error) { | ||||
| 	return g, nil // all dashboards share the same handler
 | ||||
| } | ||||
| 
 | ||||
| // GetChannelOptions called fast and often
 | ||||
| func (g *DashboardHandler) GetChannelOptions(id string) centrifuge.ChannelOptions { | ||||
| 	return centrifuge.ChannelOptions{ | ||||
| 		Presence:  true, | ||||
| 		JoinLeave: true, // if enterprise?
 | ||||
| 	} | ||||
| func (h *DashboardHandler) GetHandlerForPath(path string) (models.ChannelHandler, error) { | ||||
| 	return h, nil // all dashboards share the same handler
 | ||||
| } | ||||
| 
 | ||||
| // OnSubscribe for now allows anyone to subscribe to any dashboard
 | ||||
| func (g *DashboardHandler) OnSubscribe(c *centrifuge.Client, e centrifuge.SubscribeEvent) error { | ||||
| 	// TODO? check authentication
 | ||||
| 	return nil | ||||
| func (h *DashboardHandler) OnSubscribe(c *centrifuge.Client, e centrifuge.SubscribeEvent) (centrifuge.SubscribeReply, error) { | ||||
| 	return centrifuge.SubscribeReply{ | ||||
| 		Options: centrifuge.SubscribeOptions{ | ||||
| 			Presence:  true, | ||||
| 			JoinLeave: true, | ||||
| 		}, | ||||
| 	}, nil | ||||
| } | ||||
| 
 | ||||
| // AllowBroadcast checks if a message from the websocket can be broadcast on this channel
 | ||||
| // currently messages are sent when a dashboard starts editing
 | ||||
| func (g *DashboardHandler) AllowBroadcast(c *centrifuge.Client, e centrifuge.PublishEvent) error { | ||||
| 	return nil | ||||
| // OnPublish is called when someone begins to edit a dashoard
 | ||||
| func (h *DashboardHandler) OnPublish(c *centrifuge.Client, e centrifuge.PublishEvent) (centrifuge.PublishReply, error) { | ||||
| 	return centrifuge.PublishReply{ | ||||
| 		Options: centrifuge.PublishOptions{}, | ||||
| 	}, nil | ||||
| } | ||||
| 
 | ||||
| // DashboardSaved should broadcast to the appropriate stream
 | ||||
| func (g *DashboardHandler) publish(event dashboardEvent) error { | ||||
| func (h *DashboardHandler) publish(event dashboardEvent) error { | ||||
| 	msg, err := json.Marshal(event) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return g.Publisher("grafana/dashboard/"+event.UID, msg) | ||||
| 	return h.Publisher("grafana/dashboard/"+event.UID, msg) | ||||
| } | ||||
| 
 | ||||
| // DashboardSaved will broadcast to all connected dashboards
 | ||||
| func (g *DashboardHandler) DashboardSaved(uid string, userID int64) error { | ||||
| 	return g.publish(dashboardEvent{ | ||||
| func (h *DashboardHandler) DashboardSaved(uid string, userID int64) error { | ||||
| 	return h.publish(dashboardEvent{ | ||||
| 		UID:    uid, | ||||
| 		Action: "saved", | ||||
| 		UserID: userID, | ||||
|  | @ -64,8 +61,8 @@ func (g *DashboardHandler) DashboardSaved(uid string, userID int64) error { | |||
| } | ||||
| 
 | ||||
| // DashboardDeleted will broadcast to all connected dashboards
 | ||||
| func (g *DashboardHandler) DashboardDeleted(uid string, userID int64) error { | ||||
| 	return g.publish(dashboardEvent{ | ||||
| func (h *DashboardHandler) DashboardDeleted(uid string, userID int64) error { | ||||
| 	return h.publish(dashboardEvent{ | ||||
| 		UID:    uid, | ||||
| 		Action: "deleted", | ||||
| 		UserID: userID, | ||||
|  |  | |||
|  | @ -21,20 +21,15 @@ func (m *MeasurementsRunner) GetHandlerForPath(path string) (models.ChannelHandl | |||
| 	return m, nil // for now all channels share config
 | ||||
| } | ||||
| 
 | ||||
| // GetChannelOptions gets channel options.
 | ||||
| // It gets called fast and often.
 | ||||
| func (m *MeasurementsRunner) GetChannelOptions(id string) centrifuge.ChannelOptions { | ||||
| 	return centrifuge.ChannelOptions{} | ||||
| // OnSubscribe will let anyone connect to the path
 | ||||
| func (m *MeasurementsRunner) OnSubscribe(c *centrifuge.Client, e centrifuge.SubscribeEvent) (centrifuge.SubscribeReply, error) { | ||||
| 	return centrifuge.SubscribeReply{}, nil | ||||
| } | ||||
| 
 | ||||
| // OnSubscribe for now allows anyone to subscribe to any dashboard.
 | ||||
| func (m *MeasurementsRunner) OnSubscribe(c *centrifuge.Client, e centrifuge.SubscribeEvent) error { | ||||
| 	// anyone can subscribe
 | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // AllowBroadcast checks if a message from the websocket can be broadcast on this channel
 | ||||
| // OnPublish is called when a client wants to broadcast on the websocket
 | ||||
| // Currently this sends measurements over websocket -- should be replaced with the HTTP interface
 | ||||
| func (m *MeasurementsRunner) AllowBroadcast(c *centrifuge.Client, e centrifuge.PublishEvent) error { | ||||
| 	return nil | ||||
| func (m *MeasurementsRunner) OnPublish(c *centrifuge.Client, e centrifuge.PublishEvent) (centrifuge.PublishReply, error) { | ||||
| 	return centrifuge.PublishReply{ | ||||
| 		Options: centrifuge.PublishOptions{}, | ||||
| 	}, nil | ||||
| } | ||||
|  |  | |||
|  | @ -27,12 +27,12 @@ type TestDataSupplier struct { | |||
| 
 | ||||
| // GetHandlerForPath gets the channel handler for a path.
 | ||||
| // Called on init.
 | ||||
| func (g *TestDataSupplier) GetHandlerForPath(path string) (models.ChannelHandler, error) { | ||||
| func (s *TestDataSupplier) GetHandlerForPath(path string) (models.ChannelHandler, error) { | ||||
| 	channel := "grafana/testdata/" + path | ||||
| 
 | ||||
| 	if path == "random-2s-stream" { | ||||
| 		return &testDataRunner{ | ||||
| 			publisher:   g.Publisher, | ||||
| 			publisher:   s.Publisher, | ||||
| 			running:     false, | ||||
| 			speedMillis: 2000, | ||||
| 			dropPercent: 0, | ||||
|  | @ -43,7 +43,7 @@ func (g *TestDataSupplier) GetHandlerForPath(path string) (models.ChannelHandler | |||
| 
 | ||||
| 	if path == "random-flakey-stream" { | ||||
| 		return &testDataRunner{ | ||||
| 			publisher:   g.Publisher, | ||||
| 			publisher:   s.Publisher, | ||||
| 			running:     false, | ||||
| 			speedMillis: 400, | ||||
| 			dropPercent: .6, | ||||
|  | @ -54,39 +54,32 @@ func (g *TestDataSupplier) GetHandlerForPath(path string) (models.ChannelHandler | |||
| 	return nil, fmt.Errorf("unknown channel") | ||||
| } | ||||
| 
 | ||||
| // GetChannelOptions gets channel options.
 | ||||
| // Called fast and often.
 | ||||
| func (g *testDataRunner) GetChannelOptions(id string) centrifuge.ChannelOptions { | ||||
| 	return centrifuge.ChannelOptions{} | ||||
| } | ||||
| 
 | ||||
| // OnSubscribe for now allows anyone to subscribe to any dashboard.
 | ||||
| func (g *testDataRunner) OnSubscribe(c *centrifuge.Client, e centrifuge.SubscribeEvent) error { | ||||
| 	if !g.running { | ||||
| 		g.running = true | ||||
| // OnSubscribe will let anyone connect to the path
 | ||||
| func (r *testDataRunner) OnSubscribe(c *centrifuge.Client, e centrifuge.SubscribeEvent) (centrifuge.SubscribeReply, error) { | ||||
| 	if !r.running { | ||||
| 		r.running = true | ||||
| 
 | ||||
| 		// Run in the background
 | ||||
| 		go g.runRandomCSV() | ||||
| 		go r.runRandomCSV() | ||||
| 	} | ||||
| 
 | ||||
| 	// TODO? check authentication
 | ||||
| 	return nil | ||||
| 	return centrifuge.SubscribeReply{}, nil | ||||
| } | ||||
| 
 | ||||
| // AllowBroadcast checks if a message from the websocket can be broadcast on this channel
 | ||||
| func (g *testDataRunner) AllowBroadcast(c *centrifuge.Client, e centrifuge.PublishEvent) error { | ||||
| 	return fmt.Errorf("can not publish to testdata") | ||||
| // OnPublish checks if a message from the websocket can be broadcast on this channel
 | ||||
| func (r *testDataRunner) OnPublish(c *centrifuge.Client, e centrifuge.PublishEvent) (centrifuge.PublishReply, error) { | ||||
| 	return centrifuge.PublishReply{}, fmt.Errorf("can not publish to testdata") | ||||
| } | ||||
| 
 | ||||
| // runRandomCSV is just for an example.
 | ||||
| func (g *testDataRunner) runRandomCSV() { | ||||
| func (r *testDataRunner) runRandomCSV() { | ||||
| 	spread := 50.0 | ||||
| 
 | ||||
| 	walker := rand.Float64() * 100 | ||||
| 	ticker := time.NewTicker(time.Duration(g.speedMillis) * time.Millisecond) | ||||
| 	ticker := time.NewTicker(time.Duration(r.speedMillis) * time.Millisecond) | ||||
| 
 | ||||
| 	measurement := models.Measurement{ | ||||
| 		Name:   g.name, | ||||
| 		Name:   r.name, | ||||
| 		Time:   0, | ||||
| 		Values: make(map[string]interface{}, 5), | ||||
| 	} | ||||
|  | @ -95,7 +88,7 @@ func (g *testDataRunner) runRandomCSV() { | |||
| 	} | ||||
| 
 | ||||
| 	for t := range ticker.C { | ||||
| 		if rand.Float64() <= g.dropPercent { | ||||
| 		if rand.Float64() <= r.dropPercent { | ||||
| 			continue | ||||
| 		} | ||||
| 		delta := rand.Float64() - 0.5 | ||||
|  | @ -112,9 +105,9 @@ func (g *testDataRunner) runRandomCSV() { | |||
| 			continue | ||||
| 		} | ||||
| 
 | ||||
| 		err = g.publisher(g.channel, bytes) | ||||
| 		err = r.publisher(r.channel, bytes) | ||||
| 		if err != nil { | ||||
| 			logger.Warn("write", "channel", g.channel, "measurement", measurement) | ||||
| 			logger.Warn("write", "channel", r.channel, "measurement", measurement) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -74,20 +74,6 @@ func (g *GrafanaLive) Init() error { | |||
| 	// cfg.LogLevel = centrifuge.LogLevelDebug
 | ||||
| 	cfg.LogHandler = handleLog | ||||
| 
 | ||||
| 	// This function is called fast and often -- it must be sychronized
 | ||||
| 	cfg.ChannelOptionsFunc = func(channel string) (centrifuge.ChannelOptions, bool, error) { | ||||
| 		handler, err := g.GetChannelHandler(channel) | ||||
| 		if err != nil { | ||||
| 			logger.Error("ChannelOptionsFunc", "channel", channel, "err", err) | ||||
| 			if err.Error() == "404" { // ????
 | ||||
| 				return centrifuge.ChannelOptions{}, false, nil | ||||
| 			} | ||||
| 			return centrifuge.ChannelOptions{}, true, err | ||||
| 		} | ||||
| 		opts := handler.GetChannelOptions(channel) | ||||
| 		return opts, true, nil | ||||
| 	} | ||||
| 
 | ||||
| 	// Node is the core object in Centrifuge library responsible for many useful
 | ||||
| 	// things. For example Node allows to publish messages to channels from server
 | ||||
| 	// side with its Publish method, but in this example we will publish messages
 | ||||
|  | @ -115,57 +101,29 @@ func (g *GrafanaLive) Init() error { | |||
| 	// inside handler must be synchronized since it will be called concurrently from
 | ||||
| 	// different goroutines (belonging to different client connections). This is also
 | ||||
| 	// true for other event handlers.
 | ||||
| 	node.OnConnect(func(c *centrifuge.Client) { | ||||
| 		// In our example transport will always be Websocket but it can also be SockJS.
 | ||||
| 		transportName := c.Transport().Name() | ||||
| 	node.OnConnect(func(client *centrifuge.Client) { | ||||
| 		logger.Debug("Client connected", "user", client.UserID()) | ||||
| 
 | ||||
| 		// In our example clients connect with JSON protocol but it can also be Protobuf.
 | ||||
| 		transportEncoding := c.Transport().Encoding() | ||||
| 		logger.Debug("client connected", "transport", transportName, "encoding", transportEncoding) | ||||
| 	}) | ||||
| 		client.OnSubscribe(func(e centrifuge.SubscribeEvent, cb centrifuge.SubscribeCallback) { | ||||
| 			handler, err := g.GetChannelHandler(e.Channel) | ||||
| 			if err != nil { | ||||
| 				cb(centrifuge.SubscribeReply{}, err) | ||||
| 			} else { | ||||
| 				cb(handler.OnSubscribe(client, e)) | ||||
| 			} | ||||
| 		}) | ||||
| 
 | ||||
| 	// Set Disconnect handler to react on client disconnect events.
 | ||||
| 	node.OnDisconnect(func(c *centrifuge.Client, e centrifuge.DisconnectEvent) { | ||||
| 		logger.Info("client disconnected") | ||||
| 	}) | ||||
| 
 | ||||
| 	// Set SubscribeHandler to react on every channel subscription attempt
 | ||||
| 	// initiated by client. Here you can theoretically return an error or
 | ||||
| 	// disconnect client from server if needed. But now we just accept
 | ||||
| 	// all subscriptions to all channels. In real life you may use a more
 | ||||
| 	// complex permission check here.
 | ||||
| 	node.OnSubscribe(func(c *centrifuge.Client, e centrifuge.SubscribeEvent) (centrifuge.SubscribeReply, error) { | ||||
| 		reply := centrifuge.SubscribeReply{} | ||||
| 
 | ||||
| 		handler, err := g.GetChannelHandler(e.Channel) | ||||
| 		if err != nil { | ||||
| 			return reply, err | ||||
| 		} | ||||
| 
 | ||||
| 		err = handler.OnSubscribe(c, e) | ||||
| 		if err != nil { | ||||
| 			return reply, err | ||||
| 		} | ||||
| 
 | ||||
| 		return reply, nil | ||||
| 	}) | ||||
| 
 | ||||
| 	node.OnUnsubscribe(func(c *centrifuge.Client, e centrifuge.UnsubscribeEvent) { | ||||
| 		logger.Debug("unsubscribe from channel", "channel", e.Channel, "user", c.UserID()) | ||||
| 	}) | ||||
| 
 | ||||
| 	// Called when a client writes to the websocket channel.
 | ||||
| 	// In general, we should prefer writing to the HTTP API, but this
 | ||||
| 	// allows some simple prototypes to work quickly
 | ||||
| 	node.OnPublish(func(c *centrifuge.Client, e centrifuge.PublishEvent) (centrifuge.PublishReply, error) { | ||||
| 		reply := centrifuge.PublishReply{} | ||||
| 		handler, err := g.GetChannelHandler(e.Channel) | ||||
| 		if err != nil { | ||||
| 			return reply, err | ||||
| 		} | ||||
| 
 | ||||
| 		err = handler.AllowBroadcast(c, e) | ||||
| 		return centrifuge.PublishReply{}, err | ||||
| 		// Called when a client writes to the websocket channel.
 | ||||
| 		// In general, we should prefer writing to the HTTP API, but this
 | ||||
| 		// allows some simple prototypes to work quickly
 | ||||
| 		client.OnPublish(func(e centrifuge.PublishEvent, cb centrifuge.PublishCallback) { | ||||
| 			handler, err := g.GetChannelHandler(e.Channel) | ||||
| 			if err != nil { | ||||
| 				cb(centrifuge.PublishReply{}, err) | ||||
| 			} else { | ||||
| 				cb(handler.OnPublish(client, e)) | ||||
| 			} | ||||
| 		}) | ||||
| 	}) | ||||
| 
 | ||||
| 	// Run node. This method does not block.
 | ||||
|  |  | |||
|  | @ -12,21 +12,16 @@ type PluginHandler struct { | |||
| } | ||||
| 
 | ||||
| // GetHandlerForPath called on init
 | ||||
| func (g *PluginHandler) GetHandlerForPath(path string) (models.ChannelHandler, error) { | ||||
| 	return g, nil // all dashboards share the same handler
 | ||||
| func (h *PluginHandler) GetHandlerForPath(path string) (models.ChannelHandler, error) { | ||||
| 	return h, nil // all dashboards share the same handler
 | ||||
| } | ||||
| 
 | ||||
| // GetChannelOptions called fast and often
 | ||||
| func (g *PluginHandler) GetChannelOptions(id string) centrifuge.ChannelOptions { | ||||
| 	return centrifuge.ChannelOptions{} | ||||
| // OnSubscribe for now allows anyone to subscribe
 | ||||
| func (h *PluginHandler) OnSubscribe(c *centrifuge.Client, e centrifuge.SubscribeEvent) (centrifuge.SubscribeReply, error) { | ||||
| 	return centrifuge.SubscribeReply{}, nil | ||||
| } | ||||
| 
 | ||||
| // OnSubscribe for now allows anyone to subscribe to any dashboard
 | ||||
| func (g *PluginHandler) OnSubscribe(c *centrifuge.Client, e centrifuge.SubscribeEvent) error { | ||||
| 	return nil // anyone can subscribe
 | ||||
| } | ||||
| 
 | ||||
| // AllowBroadcast checks if a message from the websocket can be broadcast on this channel
 | ||||
| func (g *PluginHandler) AllowBroadcast(c *centrifuge.Client, e centrifuge.PublishEvent) error { | ||||
| 	return nil // broadcast any event
 | ||||
| // OnPublish checks if a message from the websocket can be broadcast on this channel
 | ||||
| func (h *PluginHandler) OnPublish(c *centrifuge.Client, e centrifuge.PublishEvent) (centrifuge.PublishReply, error) { | ||||
| 	return centrifuge.PublishReply{}, nil // broadcast any event
 | ||||
| } | ||||
|  |  | |||
|  | @ -55,19 +55,13 @@ func (s *LogQueryRunnerSupplier) GetHandlerForPath(path string) (models.ChannelH | |||
| 	}, nil | ||||
| } | ||||
| 
 | ||||
| // GetChannelOptions gets channel options.
 | ||||
| // It's called fast and often.
 | ||||
| func (r *logQueryRunner) GetChannelOptions(id string) centrifuge.ChannelOptions { | ||||
| 	return centrifuge.ChannelOptions{} | ||||
| } | ||||
| 
 | ||||
| // OnSubscribe publishes results from the corresponding CloudWatch Logs query to the provided channel
 | ||||
| func (r *logQueryRunner) OnSubscribe(c *centrifuge.Client, e centrifuge.SubscribeEvent) error { | ||||
| func (r *logQueryRunner) OnSubscribe(c *centrifuge.Client, e centrifuge.SubscribeEvent) (centrifuge.SubscribeReply, error) { | ||||
| 	r.runningMu.Lock() | ||||
| 	defer r.runningMu.Unlock() | ||||
| 
 | ||||
| 	if _, ok := r.running[e.Channel]; ok { | ||||
| 		return nil | ||||
| 		return centrifuge.SubscribeReply{}, nil | ||||
| 	} | ||||
| 
 | ||||
| 	r.running[e.Channel] = true | ||||
|  | @ -77,12 +71,12 @@ func (r *logQueryRunner) OnSubscribe(c *centrifuge.Client, e centrifuge.Subscrib | |||
| 		} | ||||
| 	}() | ||||
| 
 | ||||
| 	return nil | ||||
| 	return centrifuge.SubscribeReply{}, nil | ||||
| } | ||||
| 
 | ||||
| // AllowBroadcast checks if a message from the websocket can be broadcast on this channel
 | ||||
| func (r *logQueryRunner) AllowBroadcast(c *centrifuge.Client, e centrifuge.PublishEvent) error { | ||||
| 	return fmt.Errorf("can not publish") | ||||
| // OnPublish checks if a message from the websocket can be broadcast on this channel
 | ||||
| func (r *logQueryRunner) OnPublish(c *centrifuge.Client, e centrifuge.PublishEvent) (centrifuge.PublishReply, error) { | ||||
| 	return centrifuge.PublishReply{}, fmt.Errorf("can not publish") | ||||
| } | ||||
| 
 | ||||
| func (r *logQueryRunner) publishResults(channelName string) error { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue