Skip to content

Commit 6ac5f7a

Browse files
cmaglieper1234
andauthored
[breaking] Fix gRPC streaming synchronization on close (should fix missing lines at the end of compile) (#1787)
* Correctly synchronize streams (Fix: some lines cut-off at the end of the output) * Updated docs * Fixed go-docs * Use pipes with channel buffering to smooth out communications * Update docs/UPGRADING.md Co-authored-by: per1234 <[email protected]> Co-authored-by: per1234 <[email protected]>
1 parent 9b6c9c4 commit 6ac5f7a

File tree

14 files changed

+205
-25
lines changed

14 files changed

+205
-25
lines changed
+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
---
2+
name: github.com/djherbis/buffer
3+
version: v1.1.0
4+
type: go
5+
summary: Package buffer implements a series of Buffers which can be composed to implement
6+
complicated buffering strategies
7+
homepage: https://pkg.go.dev/github.com/djherbis/buffer
8+
license: mit
9+
licenses:
10+
- sources: LICENSE.txt
11+
text: |
12+
The MIT License (MIT)
13+
14+
Copyright (c) 2015 Dustin H
15+
16+
Permission is hereby granted, free of charge, to any person obtaining a copy of
17+
this software and associated documentation files (the "Software"), to deal in
18+
the Software without restriction, including without limitation the rights to
19+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
20+
the Software, and to permit persons to whom the Software is furnished to do so,
21+
subject to the following conditions:
22+
23+
The above copyright notice and this permission notice shall be included in all
24+
copies or substantial portions of the Software.
25+
26+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
27+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
28+
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
29+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
30+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
31+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32+
notices: []
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
---
2+
name: github.com/djherbis/buffer/limio
3+
version: v1.1.0
4+
type: go
5+
summary:
6+
homepage: https://pkg.go.dev/github.com/djherbis/buffer/limio
7+
license: mit
8+
licenses:
9+
- sources: [email protected]/LICENSE.txt
10+
text: |
11+
The MIT License (MIT)
12+
13+
Copyright (c) 2015 Dustin H
14+
15+
Permission is hereby granted, free of charge, to any person obtaining a copy of
16+
this software and associated documentation files (the "Software"), to deal in
17+
the Software without restriction, including without limitation the rights to
18+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
19+
the Software, and to permit persons to whom the Software is furnished to do so,
20+
subject to the following conditions:
21+
22+
The above copyright notice and this permission notice shall be included in all
23+
copies or substantial portions of the Software.
24+
25+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
26+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
27+
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
28+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
29+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
30+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31+
notices: []
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
---
2+
name: github.com/djherbis/buffer/wrapio
3+
version: v1.1.0
4+
type: go
5+
summary:
6+
homepage: https://pkg.go.dev/github.com/djherbis/buffer/wrapio
7+
license: mit
8+
licenses:
9+
- sources: [email protected]/LICENSE.txt
10+
text: |
11+
The MIT License (MIT)
12+
13+
Copyright (c) 2015 Dustin H
14+
15+
Permission is hereby granted, free of charge, to any person obtaining a copy of
16+
this software and associated documentation files (the "Software"), to deal in
17+
the Software without restriction, including without limitation the rights to
18+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
19+
the Software, and to permit persons to whom the Software is furnished to do so,
20+
subject to the following conditions:
21+
22+
The above copyright notice and this permission notice shall be included in all
23+
copies or substantial portions of the Software.
24+
25+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
26+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
27+
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
28+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
29+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
30+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31+
notices: []
+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
---
2+
name: github.com/djherbis/nio/v3
3+
version: v3.0.1
4+
type: go
5+
summary: Package nio provides a few buffered io primitives.
6+
homepage: https://pkg.go.dev/github.com/djherbis/nio/v3
7+
license: mit
8+
licenses:
9+
- sources: LICENSE.txt
10+
text: |
11+
The MIT License (MIT)
12+
13+
Copyright (c) 2015 Dustin H
14+
15+
Permission is hereby granted, free of charge, to any person obtaining a copy of
16+
this software and associated documentation files (the "Software"), to deal in
17+
the Software without restriction, including without limitation the rights to
18+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
19+
the Software, and to permit persons to whom the Software is furnished to do so,
20+
subject to the following conditions:
21+
22+
The above copyright notice and this permission notice shall be included in all
23+
copies or substantial portions of the Software.
24+
25+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
26+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
27+
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
28+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
29+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
30+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31+
notices: []

Diff for: arduino/discovery/discovery_client/go.sum

+2
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3
7777
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
7878
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
7979
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
80+
github.com/djherbis/buffer v1.1.0/go.mod h1:VwN8VdFkMY0DCALdY8o00d3IZ6Amz/UNVMWcSaJT44o=
81+
github.com/djherbis/nio/v3 v3.0.1/go.mod h1:Ng4h80pbZFMla1yKzm61cF0tqqilXZYrogmWgZxOcmg=
8082
github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
8183
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
8284
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=

Diff for: arduino/utils/stream.go

+13-4
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,24 @@
1616
package utils
1717

1818
import (
19+
"context"
1920
"io"
2021
"time"
22+
23+
"github.com/djherbis/buffer"
24+
"github.com/djherbis/nio/v3"
2125
)
2226

2327
// FeedStreamTo creates a pipe to pass data to the writer function.
24-
// FeedStreamTo returns the io.Writer side of the pipe, on which the user can write data
25-
func FeedStreamTo(writer func(data []byte)) io.Writer {
26-
r, w := io.Pipe()
28+
// FeedStreamTo returns the io.WriteCloser side of the pipe, on which the user can write data.
29+
// The user must call Close() on the returned io.WriteCloser to release all the resources.
30+
// If needed, the context can be used to detect when all the data has been processed after
31+
// closing the writer.
32+
func FeedStreamTo(writer func(data []byte)) (io.WriteCloser, context.Context) {
33+
ctx, cancel := context.WithCancel(context.Background())
34+
r, w := nio.Pipe(buffer.New(32 * 1024))
2735
go func() {
36+
defer cancel()
2837
data := make([]byte, 16384)
2938
for {
3039
if n, err := r.Read(data); err == nil {
@@ -41,7 +50,7 @@ func FeedStreamTo(writer func(data []byte)) io.Writer {
4150
}
4251
}
4352
}()
44-
return w
53+
return w, ctx
4554
}
4655

4756
// ConsumeStreamFrom creates a pipe to consume data from the reader function.

Diff for: client_example/go.sum

+2
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7Do
7474
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
7575
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
7676
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
77+
github.com/djherbis/buffer v1.1.0/go.mod h1:VwN8VdFkMY0DCALdY8o00d3IZ6Amz/UNVMWcSaJT44o=
78+
github.com/djherbis/nio/v3 v3.0.1/go.mod h1:Ng4h80pbZFMla1yKzm61cF0tqqilXZYrogmWgZxOcmg=
7779
github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
7880
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
7981
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=

Diff for: commands/daemon/daemon.go

+28-18
Original file line numberDiff line numberDiff line change
@@ -266,15 +266,19 @@ func (s *ArduinoCoreServerImpl) LoadSketch(ctx context.Context, req *rpc.LoadSke
266266

267267
// Compile FIXMEDOC
268268
func (s *ArduinoCoreServerImpl) Compile(req *rpc.CompileRequest, stream rpc.ArduinoCoreService_CompileServer) error {
269+
outStream, outCtx := utils.FeedStreamTo(func(data []byte) { stream.Send(&rpc.CompileResponse{OutStream: data}) })
270+
errStream, errCtx := utils.FeedStreamTo(func(data []byte) { stream.Send(&rpc.CompileResponse{ErrStream: data}) })
269271
resp, err := compile.Compile(
270-
stream.Context(), req,
271-
utils.FeedStreamTo(func(data []byte) { stream.Send(&rpc.CompileResponse{OutStream: data}) }),
272-
utils.FeedStreamTo(func(data []byte) { stream.Send(&rpc.CompileResponse{ErrStream: data}) }),
272+
stream.Context(), req, outStream, errStream,
273273
func(p *rpc.TaskProgress) { stream.Send(&rpc.CompileResponse{Progress: p}) },
274274
false) // Set debug to false
275+
outStream.Close()
276+
errStream.Close()
275277
if err != nil {
276278
return convertErrorToRPCStatus(err)
277279
}
280+
<-outCtx.Done()
281+
<-errCtx.Done()
278282
return stream.Send(resp)
279283
}
280284

@@ -345,27 +349,31 @@ func (s *ArduinoCoreServerImpl) PlatformList(ctx context.Context, req *rpc.Platf
345349

346350
// Upload FIXMEDOC
347351
func (s *ArduinoCoreServerImpl) Upload(req *rpc.UploadRequest, stream rpc.ArduinoCoreService_UploadServer) error {
348-
resp, err := upload.Upload(
349-
stream.Context(), req,
350-
utils.FeedStreamTo(func(data []byte) { stream.Send(&rpc.UploadResponse{OutStream: data}) }),
351-
utils.FeedStreamTo(func(data []byte) { stream.Send(&rpc.UploadResponse{ErrStream: data}) }),
352-
)
352+
outStream, outCtx := utils.FeedStreamTo(func(data []byte) { stream.Send(&rpc.UploadResponse{OutStream: data}) })
353+
errStream, errCtx := utils.FeedStreamTo(func(data []byte) { stream.Send(&rpc.UploadResponse{ErrStream: data}) })
354+
resp, err := upload.Upload(stream.Context(), req, outStream, errStream)
355+
outStream.Close()
356+
errStream.Close()
353357
if err != nil {
354358
return convertErrorToRPCStatus(err)
355359
}
360+
<-outCtx.Done()
361+
<-errCtx.Done()
356362
return stream.Send(resp)
357363
}
358364

359365
// UploadUsingProgrammer FIXMEDOC
360366
func (s *ArduinoCoreServerImpl) UploadUsingProgrammer(req *rpc.UploadUsingProgrammerRequest, stream rpc.ArduinoCoreService_UploadUsingProgrammerServer) error {
361-
resp, err := upload.UsingProgrammer(
362-
stream.Context(), req,
363-
utils.FeedStreamTo(func(data []byte) { stream.Send(&rpc.UploadUsingProgrammerResponse{OutStream: data}) }),
364-
utils.FeedStreamTo(func(data []byte) { stream.Send(&rpc.UploadUsingProgrammerResponse{ErrStream: data}) }),
365-
)
367+
outStream, outCtx := utils.FeedStreamTo(func(data []byte) { stream.Send(&rpc.UploadUsingProgrammerResponse{OutStream: data}) })
368+
errStream, errCtx := utils.FeedStreamTo(func(data []byte) { stream.Send(&rpc.UploadUsingProgrammerResponse{ErrStream: data}) })
369+
resp, err := upload.UsingProgrammer(stream.Context(), req, outStream, errStream)
370+
outStream.Close()
371+
errStream.Close()
366372
if err != nil {
367373
return convertErrorToRPCStatus(err)
368374
}
375+
<-outCtx.Done()
376+
<-errCtx.Done()
369377
return stream.Send(resp)
370378
}
371379

@@ -377,14 +385,16 @@ func (s *ArduinoCoreServerImpl) SupportedUserFields(ctx context.Context, req *rp
377385

378386
// BurnBootloader FIXMEDOC
379387
func (s *ArduinoCoreServerImpl) BurnBootloader(req *rpc.BurnBootloaderRequest, stream rpc.ArduinoCoreService_BurnBootloaderServer) error {
380-
resp, err := upload.BurnBootloader(
381-
stream.Context(), req,
382-
utils.FeedStreamTo(func(data []byte) { stream.Send(&rpc.BurnBootloaderResponse{OutStream: data}) }),
383-
utils.FeedStreamTo(func(data []byte) { stream.Send(&rpc.BurnBootloaderResponse{ErrStream: data}) }),
384-
)
388+
outStream, outCtx := utils.FeedStreamTo(func(data []byte) { stream.Send(&rpc.BurnBootloaderResponse{OutStream: data}) })
389+
errStream, errCtx := utils.FeedStreamTo(func(data []byte) { stream.Send(&rpc.BurnBootloaderResponse{ErrStream: data}) })
390+
resp, err := upload.BurnBootloader(stream.Context(), req, outStream, errStream)
391+
outStream.Close()
392+
errStream.Close()
385393
if err != nil {
386394
return convertErrorToRPCStatus(err)
387395
}
396+
<-outCtx.Done()
397+
<-errCtx.Done()
388398
return stream.Send(resp)
389399
}
390400

Diff for: commands/daemon/debug.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ func (s *DebugService) Debug(stream dbg.DebugService_DebugServer) error {
5050
// Launch debug recipe attaching stdin and out to grpc streaming
5151
signalChan := make(chan os.Signal)
5252
defer close(signalChan)
53+
outStream, outCtx := utils.FeedStreamTo(func(data []byte) { stream.Send(&dbg.DebugResponse{Data: data}) })
5354
resp, debugErr := cmd.Debug(stream.Context(), req,
5455
utils.ConsumeStreamFrom(func() ([]byte, error) {
5556
command, err := stream.Recv()
@@ -58,13 +59,13 @@ func (s *DebugService) Debug(stream dbg.DebugService_DebugServer) error {
5859
}
5960
return command.GetData(), err
6061
}),
61-
utils.FeedStreamTo(func(data []byte) {
62-
stream.Send(&dbg.DebugResponse{Data: data})
63-
}),
62+
outStream,
6463
signalChan)
64+
outStream.Close()
6565
if debugErr != nil {
6666
return debugErr
6767
}
68+
<-outCtx.Done()
6869
return stream.Send(resp)
6970
}
7071

Diff for: docs/UPGRADING.md

+19
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,25 @@
22

33
Here you can find a list of migration guides to handle breaking changes between releases of the CLI.
44

5+
## 0.25.0
6+
7+
### go-lang function `github.com/arduino/arduino-cli/arduino/utils.FeedStreamTo` has been changed
8+
9+
The function `FeedStreamTo` has been changed from:
10+
11+
```go
12+
func FeedStreamTo(writer func(data []byte)) io.Writer
13+
```
14+
15+
to
16+
17+
```go
18+
func FeedStreamTo(writer func(data []byte)) (io.WriteCloser, context.Context)
19+
```
20+
21+
The user must call the `Close` method on the returned `io.WriteClose` to correctly dispose the streaming channel. The
22+
context `Done()` method may be used to wait for the internal subroutines to complete.
23+
524
## 0.24.0
625

726
### gRPC `Monitor` service and related gRPC calls have been removed

Diff for: docsgen/go.mod

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ require (
2121
github.com/codeclysm/extract/v3 v3.0.2 // indirect
2222
github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect
2323
github.com/creack/goselect v0.1.2 // indirect
24+
github.com/djherbis/buffer v1.1.0 // indirect
25+
github.com/djherbis/nio/v3 v3.0.1 // indirect
2426
github.com/emirpasic/gods v1.12.0 // indirect
2527
github.com/fatih/color v1.7.0 // indirect
2628
github.com/fluxio/iohelpers v0.0.0-20160419043813-3a4dd67a94d2 // indirect

Diff for: docsgen/go.sum

+4
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,10 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3
8888
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
8989
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
9090
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
91+
github.com/djherbis/buffer v1.1.0 h1:uGQ+DZDAMlfC2z3khbBtLcAHC0wyoNrX9lpOml3g3fg=
92+
github.com/djherbis/buffer v1.1.0/go.mod h1:VwN8VdFkMY0DCALdY8o00d3IZ6Amz/UNVMWcSaJT44o=
93+
github.com/djherbis/nio/v3 v3.0.1 h1:6wxhnuppteMa6RHA4L81Dq7ThkZH8SwnDzXDYy95vB4=
94+
github.com/djherbis/nio/v3 v3.0.1/go.mod h1:Ng4h80pbZFMla1yKzm61cF0tqqilXZYrogmWgZxOcmg=
9195
github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg=
9296
github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
9397
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=

Diff for: go.mod

+2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ require (
1414
github.com/cmaglie/pb v1.0.27
1515
github.com/codeclysm/cc v1.2.2 // indirect
1616
github.com/codeclysm/extract/v3 v3.0.2
17+
github.com/djherbis/buffer v1.1.0
18+
github.com/djherbis/nio/v3 v3.0.1
1719
github.com/fatih/color v1.7.0
1820
github.com/fluxio/iohelpers v0.0.0-20160419043813-3a4dd67a94d2 // indirect
1921
github.com/fluxio/multierror v0.0.0-20160419044231-9c68d39025e5 // indirect

Diff for: go.sum

+4
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,10 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3
9090
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
9191
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
9292
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
93+
github.com/djherbis/buffer v1.1.0 h1:uGQ+DZDAMlfC2z3khbBtLcAHC0wyoNrX9lpOml3g3fg=
94+
github.com/djherbis/buffer v1.1.0/go.mod h1:VwN8VdFkMY0DCALdY8o00d3IZ6Amz/UNVMWcSaJT44o=
95+
github.com/djherbis/nio/v3 v3.0.1 h1:6wxhnuppteMa6RHA4L81Dq7ThkZH8SwnDzXDYy95vB4=
96+
github.com/djherbis/nio/v3 v3.0.1/go.mod h1:Ng4h80pbZFMla1yKzm61cF0tqqilXZYrogmWgZxOcmg=
9397
github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg=
9498
github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
9599
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=

0 commit comments

Comments
 (0)