// Copyright 2019 Drone.IO Inc. All rights reserved. // Use of this source code is governed by the Drone Non-Commercial License // that can be found in the LICENSE file. // +build !oss package livelog import ( "context" "errors" "sync" "github.com/drone/drone/core" ) // error returned when a stream is not registered with // the streamer. var errStreamNotFound = errors.New("stream: not found") type streamer struct { sync.Mutex streams map[int64]*stream } // New returns a new in-memory log streamer. func New() core.LogStream { return &streamer{ streams: make(map[int64]*stream), } } func (s *streamer) Create(ctx context.Context, id int64) error { s.Lock() s.streams[id] = newStream() s.Unlock() return nil } func (s *streamer) Delete(ctx context.Context, id int64) error { s.Lock() stream, ok := s.streams[id] if ok { delete(s.streams, id) } s.Unlock() if !ok { return errStreamNotFound } return stream.close() } func (s *streamer) Write(ctx context.Context, id int64, line *core.Line) error { s.Lock() stream, ok := s.streams[id] s.Unlock() if !ok { return errStreamNotFound } return stream.write(line) } func (s *streamer) Tail(ctx context.Context, id int64) (<-chan *core.Line, <-chan error) { s.Lock() stream, ok := s.streams[id] s.Unlock() if !ok { return nil, nil } return stream.subscribe(ctx) } func (s *streamer) Info(ctx context.Context) *core.LogStreamInfo { s.Lock() defer s.Unlock() info := &core.LogStreamInfo{ Streams: map[int64]int{}, } for id, stream := range s.streams { stream.Lock() info.Streams[id] = len(stream.list) stream.Unlock() } return info }