diff --git a/logger.go b/logger.go new file mode 100644 index 000000000..bdb7e64bc --- /dev/null +++ b/logger.go @@ -0,0 +1,41 @@ +package shell + +import ( + "context" + "encoding/json" + "io" +) + +// Logger is used to handle incoming logs from the ipfs node +type Logger struct { + resp io.ReadCloser + dec *json.Decoder +} + +// Next is used to retrieve the next event from the logging system +func (l Logger) Next() (map[string]interface{}, error) { + var out map[string]interface{} + return out, l.dec.Decode(&out) +} + +// Close is used to close our reader +func (l Logger) Close() error { + return l.resp.Close() +} + +// GetLogs is used to retrieve a parsable logger object +func (s *Shell) GetLogs(ctx context.Context) (Logger, error) { + resp, err := s.Request("log/tail").Send(ctx) + if err != nil { + return Logger{}, err + } + if resp.Error != nil { + resp.Output.Close() + return Logger{}, resp.Error + } + return newLogger(resp.Output), nil +} + +func newLogger(resp io.ReadCloser) Logger { + return Logger{resp, json.NewDecoder(resp)} +} diff --git a/logger_test.go b/logger_test.go new file mode 100644 index 000000000..28250efd1 --- /dev/null +++ b/logger_test.go @@ -0,0 +1,26 @@ +package shell + +import ( + "context" + "testing" +) + +func TestLogger(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + sh := NewShell(shellUrl) + logger, err := sh.GetLogs(ctx) + if err != nil { + t.Fatal(err) + } + defer func() { + if err := logger.Close(); err != nil { + t.Fatal(err) + } + }() + if l, err := logger.Next(); err != nil { + t.Fatal(err) + } else if l == nil { + t.Fatal("no logs found") + } +}