code: func (n *NetworkServerAPI) StreamFrameLogsForGateway(req *ns.StreamFrameLogsForGatewayRequest, srv ns.NetworkServerService_StreamFrameLogsForGatewayServer) error {
  	frameLogChan := make(chan framelog.FrameLog)
  	var id lorawan.EUI64
  	copy(id[:], req.GatewayId)
  
  	go func() {
  		err := framelog.GetFrameLogForGateway(srv.Context(), storage.RedisPool(), id, frameLogChan)
  		if err != nil {
  			log.WithError(err).Error("get frame-log for gateway error")
  		}
  		close(frameLogChan)
  	}()
  
  	for fl := range frameLogChan {
  		resp := ns.StreamFrameLogsForGatewayResponse{}
  
  		if fl.UplinkFrame != nil {
  			resp.Frame = &ns.StreamFrameLogsForGatewayResponse_UplinkFrameSet{
  				UplinkFrameSet: fl.UplinkFrame,
  			}
  		}
  
  		if fl.DownlinkFrame != nil {
  			resp.Frame = &ns.StreamFrameLogsForGatewayResponse_DownlinkFrame{
  				DownlinkFrame: fl.DownlinkFrame,
  			}
  		}
  
  		if err := srv.Send(&resp); err != nil {
  			log.WithError(err).Error("error sending frame-log response")
  		}
  	}
  
  	return nil
  }
docs: // StreamFrameLogsForGateway returns a stream of frames seen by the given gateway.