Temporal API с Bun и TypeScript: гайд по надежной автоматизации задач с датами в Node.js 2026
-

Temporal API наконец-то вышел из экспериментов и стал стандартом для работы с датами в JavaScript. Забудь про кривые Date - теперь есть immutable объекты, которые правильно парсят строки, учитывают часовые пояса и не ломаются на летнем времени. Это спасет твои скрипты от багов в проде, особенно когда задачи крутятся по расписанию.
С Bun как рантаймом и TypeScript для типизации получается быстрая и надежная автоматизация. Парсеры напоминаний, cron-джобы для отчетов или биллинг - все это летает без ошибок. В гайде разберем setup, workflows и реальные примеры для сервака на 2026 год.
Почему Temporal API меняет игру в задачах с датами
Temporal решает все боли стандартного Date: мутабельность, неоднозначный парсинг и игнор зон. Представь - ты пишешь парсер заказов, а DST ломает расписание. С Temporal.ZonedDateTime это в прошлом: объект знает контекст и сам считает разницу. Bun ускоряет запуск в 10 раз быстрее Node.js, а TypeScript ловит ошибки на этапе компиляции.
На Reddit уже пишут, что в 2026 это must-have для пет-проектов и продакшена. Без него рискуешь часами дебажить ‘почему дата сдвинулась на час’. С ним - просто создаешь duration и добавляешь к дате, все типобезопасно. Логично перейти к примерам: workflows для напоминаний или обработки подписок.
- Immutable по умолчанию: Меняешь дату - получаешь новую, старая не трогается.
- Парсинг из любой строки: ‘2026-03-21 09:00 UTC’ или ISO - Temporal разберет.
- Часовые пояса нативно: ZonedDateTime учитывает DST и переходы.
- Duration для расчетов: Добавь дни/часы без риска переполнения.
Проблема Date Решение Temporal Пример Мутабельность Immutable классы date.add(duration)возвращает новыйПарсинг ‘1/2/3’ Стандартизированный PlainDate.from('2026-03-21')DST-баги ZonedDateTime Автоучет сдвигов в ‘Europe/Moscow’ Разница дат until()/since() start.until(end).toString()Setup проекта: Bun + TypeScript + Temporal
Устанавливаем Bun - это дроп-ин замена Node.js, но быстрее и с встроенным bundler’ом.
bun initсоздает шаблон, добавляем@js-temporal/polyfillпока API не везде нативный. TypeScript конфигим через tsconfig.json с strict: true - типы для Temporal из polyfill.Запускаем воркер:
bun run worker.ts. Temporal SDK для TypeScript интегрируется через proxyActivities - детерминированные функции без фейлов. В 2026 Bun поддерживает ESM нативно, так что нет нужды в tsx или nodemon. Переходим к workflow’ам для задач с датами.bun add @js-temporal/polyfill temporaliobun add -D @types/bun typescript- Создай
temporal.config.tsдля коннекта к кластеру. bun tsc && bun run src/worker.ts
Код воркера:
import { Worker } from '@temporalio/worker'; import { NativeConnection } from '@temporalio/client'; async function run() { const connection = await NativeConnection.connect({ address: 'localhost:7233' }); const worker = await Worker.create({ connection, namespace: 'default', taskQueue: 'date-tasks', workflowsPath: './workflows', activities: { /* ... */ }, }); await worker.run(); } run();Нюанс: В Bun используй
NativeConnection- быстрее WebConnection на 30%.Workflow для автоматизации с датами: напоминания и биллинг
Workflow - это оркестратор: планирует activity, ждет сигналы, retry при фейлах. Для напоминаний создаем workflow, который проверяет дату через Temporal.Instant.now() и шлет нотифы. Activity - реальная работа: API-колл или email. TypeScript прокси обеспечивает типы end-to-end.
Пример подписки: workflow стартует ежемесячно, проверяет dueDate с ZonedDateTime, если просрочено - биллит. Сигналы позволяют отменить mid-way. Bun делает cold-start <10ms, идеально для serverless на Vercel или Deno Deploy. Теперь код.
// workflows.ts import { proxyActivities } from '@temporalio/workflow'; import { Temporal } from '@js-temporal/polyfill'; type Activities = typeof import('./activities'); const { sendReminder } = proxyActivities<Activities>({}); export async function reminderWorkflow(reminderTime: string): Promise<void> { const target = Temporal.ZonedDateTime.from(reminderTime); while (Temporal.Now.zonedDateTimeISO('UTC').until(target).total('seconds') > 0) { await Temporal.Duration.from({ seconds: 60 }).sleep(); } await sendReminder(); }Компонент Описание Таймаут Workflow Оркестрация дат Unlimited Activity API-call/email 5m Signal Отмена Instant Масштабирование: от пет-проекта к продакшену
В проде добавь метрики через Temporal Observability, tracing с OpenTelemetry. Bun с Temporal Nexus соединяет namespaces для микросервисов. Для AI-тасков интегрируй Vercel AI SDK - workflow ждет LLM-ответ, не теряя состояние при рестарте сервака.
Тестируй с
temporal test: симулирует фейлы, проверяет replay. Деплой на Temporal Cloud - zero-ops, плати за usage. В 2026 Bun runtime везде: Railway, Fly.io. Подумай о custom calendars для финансовых дат (settlement days).- Мониторинг: Web UI показывает event history.
- Retry policies: Exponential backoff на activity.
- Child workflows: Вложенные для сложных цепочек.
Фичи за кадром: что копать дальше
Temporal + Bun решает 90% задач с датами, но есть нюансы вроде custom calendars или интеграции с Kafka. Для high-load смотри sharding task queues. В экосистеме 2026 жди нативной поддержки Temporal API без полифилла.
Экспериментируй с Signals для user-input в workflows или Queries для статуса. Если задачи критичны - добавь Nexus для cross-namespace. Это база, надстрой свой стек под бизнес.
Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.
Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.
С вашими комментариями этот пост мог бы стать ещё лучше 💗
Зарегистрироваться Войти© 2024 - 2026 ExLends, Inc. Все права защищены.