{"id":48495539,"url":"https://github.com/stivo182/oscript-resilience","last_synced_at":"2026-04-07T12:02:35.628Z","repository":{"id":348797813,"uuid":"1198959142","full_name":"Stivo182/oscript-resilience","owner":"Stivo182","description":"Resilience-библиотека для OneScript, предоставляющая набор стратегий: Retry, Timeout, Rate Limiter, Circuit Breaker, Bulkhead и Fallback","archived":false,"fork":false,"pushed_at":"2026-04-03T07:27:15.000Z","size":213,"stargazers_count":5,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-03T08:51:36.777Z","etag":null,"topics":["onescript","oscript","resilience"],"latest_commit_sha":null,"homepage":"","language":"1C Enterprise","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Stivo182.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-04-01T23:39:13.000Z","updated_at":"2026-04-03T07:27:19.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Stivo182/oscript-resilience","commit_stats":null,"previous_names":["stivo182/oscript-resilience"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/Stivo182/oscript-resilience","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Stivo182%2Foscript-resilience","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Stivo182%2Foscript-resilience/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Stivo182%2Foscript-resilience/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Stivo182%2Foscript-resilience/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Stivo182","download_url":"https://codeload.github.com/Stivo182/oscript-resilience/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Stivo182%2Foscript-resilience/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31511785,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T03:10:19.677Z","status":"ssl_error","status_checked_at":"2026-04-07T03:10:13.982Z","response_time":105,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["onescript","oscript","resilience"],"created_at":"2026-04-07T12:02:20.127Z","updated_at":"2026-04-07T12:02:35.582Z","avatar_url":"https://github.com/Stivo182.png","language":"1C Enterprise","funding_links":[],"categories":[],"sub_categories":[],"readme":"# resilience\n\n\u003cdiv\u003e\n\t\u003ca href=\"docs/README.md\"\u003eДокументация\u003c/a\u003e\n\t\u003cspan\u003e · \u003c/span\u003e\n\t\u003ca href=\"samples\"\u003eПримеры\u003c/a\u003e\n\u003c/div\u003e\n\u003c/br\u003e\n\nResilience-библиотека для повышения отказоустойчивости вызовов в OneScript.\n\nПозволяет применять к пользовательскому `Действие` или лямбда-выражению стратегии повтора, предохранителя, ограничения параллелизма, таймаута, ограничения вызовов и запасного сценария (Fallback) в составе пайплайна.\n\n## Что есть в пакете\n\n**Пайплайн:**\n- [`ПайплайнОтказоустойчивости`](docs/ПайплайнОтказоустойчивости.md) — собирает стратегии в цепочку выполнения\n\n**Стратегии:**\n- [`СтратегияПовтора`](docs/СтратегияПовтора.md) (`Retry`) — повторяет операцию при ошибке\n- [`СтратегияПредохранителя`](docs/СтратегияПредохранителя.md) (`Circuit Breaker`) — блокирует вызовы после серии сбоев\n- [`СтратегияОграниченияПараллелизма`](docs/СтратегияОграниченияПараллелизма.md) (`Bulkhead`) — ограничивает количество одновременно выполняющихся операций и размер очереди ожидания\n- [`СтратегияТаймаута`](docs/СтратегияТаймаута.md) (`Timeout`) — ограничивает время выполнения\n- [`СтратегияОграниченияВызовов`](docs/СтратегияОграниченияВызовов.md) (`Rate Limiter`) — ограничивает частоту вызовов\n- [`СтратегияЗапасногоСценария`](docs/СтратегияЗапасногоСценария.md) (`Fallback`) — возвращает запасной результат при ошибке\n\n**Расширение:**\n- [Кастомные стратегии](docs/КастомныеСтратегии.md) — позволяют подключать собственные стратегии через `ДобавитьСтратегию(...)`\n\n## Когда использовать\n\n- когда внешние вызовы могут временно завершаться ошибкой и нужны повторные попытки;\n- когда нужно ограничить время выполнения, параллелизм или частоту вызовов;\n- когда важно собрать несколько стратегий отказоустойчивости в один пайплайн с предсказуемым порядком выполнения.\n\n## Установка\n\n```bash\nopm install resilience\n```\n\n## Быстрый старт\n\nНиже показан минимальный пример запуска пользовательского `Действие` через пайплайн отказоустойчивости.\nПайплайн включает предохранитель, ограничение вызовов и повторные попытки.\n\n```bsl\n#Использовать resilience\n\nСервис = Новый МойНестабильныйСервис();\n\nПайплайн = Новый ПайплайнОтказоустойчивости()\n    .ДобавитьПредохранитель(2, 500)\n    .ДобавитьОграничениеВызовов(5, 1000)\n    .ДобавитьПовтор(3, 50);\n\nОперация = Новый Действие(Сервис, \"ПолучитьДанные\");\n\nРезультат = Пайплайн.Запустить(Операция);\n```\n\nВместо `Действие` можно передать и лямбда-выражение:\n\n```bsl\nПараметрыОперации = Новый Массив();\nПараметрыОперации.Добавить(\"left\");\nПараметрыОперации.Добавить(\"right\");\n\nРезультат = Пайплайн.Запустить(\n    \"(ПервыйПараметр, ВторойПараметр) -\u003e СтрШаблон(\"\"%1:%2\"\", ПервыйПараметр, ВторойПараметр)\",\n    ПараметрыОперации\n);\n```\n\nПодробности о лямбда-выражениях и передаче параметров см. в [отдельном руководстве](docs/ЛямбдаВыражения.md).\n\n## Асинхронный запуск\n\nПайплайн можно запускать асинхронно через `ЗапуститьАсинх()`. Метод возвращает `Обещание` из библиотеки [async](https://github.com/sfaqer/async/).\n\n```bsl\n#Использовать resilience\n\nСервис = Новый МойНестабильныйСервис();\nОперация = Новый Действие(Сервис, \"ПолучитьДанные\");\n\nПайплайн = Новый ПайплайнОтказоустойчивости()\n    .ДобавитьПовтор(2, 50)\n    .ДобавитьТаймаут(1000);\n\nОбещание = Пайплайн.ЗапуститьАсинх(Операция);\nРезультат = Обещание.Получить();\n```\n\nЛямбда-выражение можно использовать и в асинхронном запуске:\n\n```bsl\nОбещание = Пайплайн.ЗапуститьАсинх(\n    \"(Имя) -\u003e СтрШаблон(\"\"Привет, %1!\"\", Имя)\",\n    \"Мир\"\n);\n\nРезультат = Обещание.Получить();\n```\n\n## Сборка пайплайна из готовых стратегий\n\nЭтот вариант удобен, когда стратегии нужно переиспользовать, хранить отдельно или настраивать по шагам перед добавлением в пайплайн.\n\n\u003e [!NOTE]\n\u003e Порядок важен: первая добавленная стратегия становится внешней оберткой для следующих.\n\nВ этом примере операция выполняется внутри `Таймаут`, `Таймаут` — внутри `Предохранитель`, `Предохранитель` — внутри `Повтор`, а вся цепочка обернута `ЗапаснойСценарий`.\n\n```bsl\n#Использовать resilience\n\nСервис = Новый МойНестабильныйСервис();\n\n// Настройка стратегий\nПовтор = Новый СтратегияПовтора()\n    .УстановитьМаксимумПовторов(3)\n    .УстановитьЗадержку(50);\n\nПредохранитель = Новый СтратегияПредохранителя()\n    .УстановитьПорогОшибок(2)\n    .УстановитьДлительностьРазмыкания(500);\n\nТаймаут = Новый СтратегияТаймаута(1500);\n\nЗапаснойСценарий = Новый СтратегияЗапасногоСценария(\n    \"(КонтекстОшибки) -\u003e \"\"Резервный результат\"\"\"\n);\n\n// Сборка пайплайна\nПайплайн = Новый ПайплайнОтказоустойчивости()\n    .ДобавитьСтратегию(ЗапаснойСценарий)\n    .ДобавитьСтратегию(Повтор)\n    .ДобавитьСтратегию(Предохранитель)\n    .ДобавитьСтратегию(Таймаут);\n\n// Запуск операции\nОперация = Новый Действие(Сервис, \"ПолучитьДанные\");\nРезультат = Пайплайн.Запустить(Операция);\n```\n\n## Кастомные стратегии\n\nПайплайн поддерживает не только встроенные, но и пользовательские стратегии.\nРекомендованный контракт и пример реализации см. в [документации по кастомным стратегиям](docs/КастомныеСтратегии.md).","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstivo182%2Foscript-resilience","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstivo182%2Foscript-resilience","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstivo182%2Foscript-resilience/lists"}