<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Bun + Temporal API: надежные scheduler-приложения на TypeScript в 2026]]></title><description><![CDATA[<p dir="auto"><img src="/assets/uploads/files/05/c2/99/1774091378654-generated_1774091353251.webp" alt="Обложка: Как интегрировать Bun с Temporal API для создания надежных scheduler-приложений на TypeScript: гайд 2026" class=" img-fluid img-markdown" /></p>
<p dir="auto">Хочешь строить scheduler-приложения, которые не падают от сбоев? Bun с Temporal API - это комбо для TypeScript-проектов, где задачи выполняются надежно, даже если сервак перезагружается. Разберем, как их интегрировать шаг за шагом.</p>
<p dir="auto">Temporal API наконец-то в ES2026 - никаких больше мук с Date, который путает часовые пояса и летние переходы. А Bun уже экспериментально тянет эту фичу через JSC-флаг. Получится scheduler, который планирует задачи, retry-ит фейлы и держит состояние вечно.</p>
<h2>Почему Bun и Temporal - идеал для scheduler’ов</h2>
<p dir="auto">Bun - это молниеносный рантайм на JavaScriptCore, который в 2026 уже обгоняет Node по скорости. Temporal API добавляет точную работу с датами: PlainDate, ZonedDateTime, Instant - все immutable и без багов. Вместе они решают типичные боли scheduler’ов: дедлайны в разных таймзонах, retry при сбоях, распределенные задачи.</p>
<p dir="auto">Представь: бот отправляет рассылки по расписанию. Без Temporal Date сломается на DST, без оркестрации типа Temporal задачи потеряются при рестарте. Bun дает скорость, Temporal - надежность. Тесты показывают: с флагом BUN_JSC_useTemporal тесты Temporal летают за 0.8с, против 228с на полифиллах.</p>
<ul>
<li><strong>Скорость</strong>: Bun запускает scheduler в разы быстрее Node, особенно с Temporal.</li>
<li><strong>Надежность</strong>: Workflows Temporal держат состояние, детерминированы.</li>
<li><strong>TypeScript-friendly</strong>: Полная типизация из коробки в Bun и Temporal SDK.</li>
<li><strong>Экспериментальная фича</strong>: Включи <code>BUN_JSC_useTemporal=1</code> - и Temporal работает нативно.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Сравнение рантаймов для Temporal</th>
</tr>
</thead>
<tbody>
<tr>
<td>Рантайм</td>
<td>Pass Rate</td>
<td>Время тестов</td>
<td>Примечание</td>
</tr>
<tr>
<td>---------</td>
<td>-----------</td>
<td>--------------</td>
<td>------------</td>
</tr>
<tr>
<td>Bun (JSC)</td>
<td>40%</td>
<td>0.8с</td>
<td>Блитц-скорость</td>
</tr>
<tr>
<td>temporal-polyfill</td>
<td>88%</td>
<td>6с</td>
<td>Медленнее</td>
</tr>
<tr>
<td>@js-temporal/polyfill</td>
<td>84%</td>
<td>228с</td>
<td>Тормозит</td>
</tr>
</tbody>
</table>
<h2>Установка и базовый сетап в Bun</h2>
<p dir="auto">Сначала ставим Bun - <code>curl -fsSL https://bun.sh/install | bash</code>. Temporal SDK для TypeScript тянется через <code>bun add @temporalio/client @temporalio/worker</code>. Не забудь флаг для Temporal API: экспортируй <code>BUN_JSC_useTemporal=1</code> в .env или терминале. Это включает нативную поддержку в JSC, без полифиллов.</p>
<p dir="auto">Запускаем Temporal сервер локально - docker compose из их доков. В TypeScript пишем workflow: функция, которая детерминировано планирует задачи. Activity - реальная логика, типа отправки email. Bun компилит TS в runtime быстрее всех, так что dev-сервер летает.</p>
<p dir="auto">Вот базовый пример scheduler’а для ежедневных задач:</p>
<pre><code class="language-typescript">import { defineWorkflow, defineActivity } from '@temporalio/workflow';

const sendReport = defineActivity({
  async fn(date: Temporal.PlainDate) {
    // Логика отправки
    console.log(`Report for ${date.toString()}`);
  }
});

export const dailyScheduler = defineWorkflow({
  async fn(start: string) {
    const startDate = Temporal.PlainDate.from(start);
    while (true) {
      await sendReport(startDate);
      startDate.add({ days: 1 });
      await proxyActivities.sleep('1d');
    }
  }
});
</code></pre>
<ul>
<li><strong>Workflow</strong>: Детерминированная логика, Temporal сам retry-ит.</li>
<li><em>Нюанс</em>: Используй <code>proxyActivities</code> для таймаутов - не свои setTimeout.</li>
<li><strong>Activity</strong>: Stateful код, прокидывай Temporal.PlainDate для дат.</li>
<li><strong>Запуск</strong>: <code>bun run workflow.ts</code> с worker’ом.</li>
</ul>
<h2>Интеграция с реальным проектом: пример scheduler’а</h2>
<p dir="auto">Допустим, строим API для тасков с дедлайнами. Bun-сервер на <code>Bun.serve</code>, Temporal worker в фоне. Клиент SDK стартует workflow с <code>Temporal.ZonedDateTime</code>. При сбое сервера Temporal Cloud или self-hosted кластер подхватит выполнение - zero downtime.</p>
<p dir="auto">В Docker: multi-stage build с oven/bun:1-alpine. Проблема с protobufjs в alpine фиксится патчем или сменой на non-alpine. В 2026 Bun уже дошлифовал совместимость с Temporal client - коннект в контейнере без танцев.</p>
<pre><code class="language-typescript">// bunfig.toml
[env]
BUN_JSC_useTemporal = "1"

// server.ts
import { Connection } from '@temporalio/client';
const connection = await Connection.connect();
</code></pre>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Компоненты стека</th>
<th>Роль</th>
</tr>
</thead>
<tbody>
<tr>
<td>Bun</td>
<td>Runtime + сервер</td>
</tr>
<tr>
<td>Temporal SDK</td>
<td>Workflows/Activities</td>
</tr>
<tr>
<td>Temporal.PlainDate</td>
<td>Даты без багов</td>
</tr>
<tr>
<td>TypeScript 6.0</td>
<td>Нативная поддержка Temporal</td>
</tr>
</tbody>
</table>
<ul>
<li><strong>Масштаб</strong>: Worker’ы горизонтально, Temporal балансирует.</li>
<li><em>Внимание</em>: Детерминизм - никаких random, Date.now() в workflows.</li>
<li><strong>Мониторинг</strong>: Веб-UI Temporal показывает все executions.</li>
</ul>
<h2>Продвинутые фичи: cron, retries и signals</h2>
<p dir="auto">Temporal workflows тянут cron-стиль: <code>schedule(cron('0 9 * * *'))</code>. С Temporal API cron вычисляется точно, с учетом зон. Retries настраиваются в activity options: backoff, max attempts. Signals позволяют менять workflow на лету - отменить задачу из API.</p>
<p dir="auto">Пример с retry и signal:</p>
<pre><code class="language-typescript">const options = {
  retry: { maximumAttempts: 5, backoffCoefficient: 2 }
};
await proxyActivities(sendReport, options)(date);
</code></pre>
<ul>
<li><strong>Cron</strong>: Интеграция с Temporal scheduler API.</li>
<li><strong>Signals/Queries</strong>: Изменяй состояние живого workflow.</li>
<li><em>Хак</em>: Для сложных дат комбинируй Instant + ZonedDateTime.</li>
</ul>
<h2>Scheduler в продакшене: что реально работает</h2>
<p dir="auto">В 2026 Bun с Temporal - стандарт для надежных таскеров на TS. Масштабируй на кластер, добавь Nexus для cross-namespace. Остается докрутить интеграцию с date pickers - стандарт пока не доделан, но полифиллы рулят. Подумай над tracing через OpenTelemetry для дебагов в проде.</p>
]]></description><link>https://forum.exlends.ru/topic/1804/bun-temporal-api-nadezhnye-scheduler-prilozheniya-na-typescript-v-2026</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 03:07:41 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/1804.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 21 Mar 2026 11:09:44 GMT</pubDate><ttl>60</ttl></channel></rss>