# artifact Пакет `artifact` реализует кеш хранения артефактов и протокол для передачи артефактов между воркерами. Артефакт - это директория, содержащая в себе результат работы джоба. Артефакт может состоять из произвольного набора файлов и директорий. Основной тип `artifact.Cache` занимается хранением артефактов на диске и контролем одновременного доступа. Одна горутина может начать писать артефакт. Начало записи берёт лок на запись. Никто другой не может работать с артефактом, на который взят лок на запись. Горутина должна позвать `commit` или `abort` после того, как она закончила работать с артефактом. `commit` помечает артефакт в кеш. `abort` отменяет запись артефакта, удаляя все данные. Горутина может начать читать артефакт, позвав метод `Get`. Много горутин могут читать артефакт одновременно. Горутина должна позвать `unlock`, после того как она закончила работать с артефактом. ## Скачивание артефакта `*artifact.Handler` должен реализовывать один метод `GET /artifact?id=1234`. Хендлер отвечает на запрос содержимым артефакта в формате `tarstream`. Функция `Download` должна скачивать артефакт из удалённого кеша в локальный. Обратите внимание, что конструктор хендлера принимает `*zap.Logger`. Запишите в этот логгер интересные события, это поможет при отладке в следующих частях задачи.