Changelog

May 25, 2026 · View on GitHub

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[0.1.27] - 2026-05-25

Changed

  • Bumped duroxide-pg dependency0.1.330.1.34 while keeping duroxide at 0.1.29.
  • PostgreSQL provider initialization compatibility — native bindings now construct ProviderConfig::url(...) / ProviderConfig::entra(...) and call the single-argument PostgresProvider::new_with_config(config) API introduced by duroxide-pg 0.1.34. No JavaScript API changes.

[0.1.26] - 2026-05-13

Fixed

  • Entra HTTPS token acquisition — picks up the upstream native-TLS fix in duroxide-pg 0.1.33 (microsoft/duroxide-pg#8). Released duroxide-pg 0.1.32 pulled reqwest transitively without a TLS connector compiled in, which caused every HTTPS call (including AAD token acquisition for connectWithEntra / connectWithSchemaAndEntra) to fail with error sending request / invalid URL, scheme is not http. No public API changes.

Changed

  • Bumped duroxide-pg dependency0.1.320.1.33.

[0.1.25] - 2026-05-09

Added

  • Microsoft Entra ID authenticationPostgresProvider.connectWithEntra(host, port, database, user, options?) and PostgresProvider.connectWithSchemaAndEntra(host, port, database, user, schema, options?) connect to Azure Database for PostgreSQL Flexible Server via Entra access tokens. Credentials are resolved via the default chain (WorkloadIdentityCredential → ManagedIdentityCredential → DeveloperToolsCredential). A background task refreshes the token before expiry. All connections use PgSslMode::VerifyFull.
  • PostgresEntraOptions interface — optional tunables: audience, maxConnections, acquireTimeoutMs, refreshIntervalMs. All fields default to sensible Azure public-cloud values.

Changed

  • Bumped duroxide dependency0.1.280.1.29
  • Bumped duroxide-pg dependency0.1.300.1.32

Added

  • Linux ARM64 GNU package - Publish duroxide-linux-arm64-gnu for aarch64-unknown-linux-gnu and include it as an optional dependency so linux/arm64 Node.js containers load the native binding.
  • Linux ARM64 CI smoke - Build, pack, publish, and smoke-test Linux ARM64 on ubuntu-24.04-arm.

[0.1.23] - 2026-04-23

Fixed

  • Windows packagingindex.js was regenerated by napi build during the 0.1.22 release and lost the manual require('duroxide-windows-x64') patch from #13, falling back to the (non-existent) napi-default name duroxide-win32-x64-msvc. Re-apply the fix; 0.1.22 was never published because the cross-platform smoke test (windows-latest) caught it.

[0.1.22] - 2026-04-23

Changed

  • Bumped duroxide dependency0.1.270.1.28 (drops transitive ring crate via SQLx native-tls upstream)
  • Bumped duroxide-pg dependency0.1.290.1.30 (same ring-drop cascade)
  • No source changes in the Node SDK; pure dependency uplift

⚠️ Do not use 0.1.22 — npm publish was skipped due to a Windows packaging regression. Use 0.1.23 instead.

[0.1.21] - 2026-04-17

Fixed

  • npm install duroxide now correctly pulls the duroxide-windows-x64 optional dependency. In 0.1.20 the published optionalDependencies in the main package were rewritten by napi-rs's prepublish step back to the default duroxide-win32-x64-msvc name, which does not exist on npm post-rename, so Windows installs failed with MODULE_NOT_FOUND. Caught by the new post-publish registry smoke. CI now publishes the main package with --ignore-scripts to preserve our manifest exactly.

[0.1.20] - 2026-04-17

Fixed

  • Windows dispatcher now resolves the correct platform subpackage (duroxide-windows-x64). Previously require('duroxide-win32-x64-msvc') in index.js threw MODULE_NOT_FOUND, making duroxide@0.1.19 unusable on Windows (microsoft/duroxide#13).

Added

  • Cross-platform packaging smoke tests in ci/smoke/ that install from local tarballs on ubuntu, macos-14, macos-13, and windows-latest, plus post-publish registry smoke. Publish is gated on all-platform smoke success — partial platform releases are no longer possible.

[0.1.19] - 2026-04-06

Changed

  • Bumped duroxide-pg from 0.1.28 to 0.1.29.
  • Fixes migration race condition on concurrent startup (microsoft/duroxide#10).
  • Cached plan invalidation (0A000) now retryable.

[0.1.18] - 2026-04-04

Added

  • client.getOrchestrationStats(instanceId) exposing per-instance SystemStats history/KV usage introspection.
  • Node admin tests and TypeScript declarations for orchestration stats.

Changed

  • Bumped local validation deps to duroxide 0.1.27 and duroxide-pg 0.1.28.
  • Updated exported KV limits to MAX_KV_KEYS = 150 and MAX_KV_VALUE_BYTES = 65536.

[0.1.17] - 2026-03-15

Changed

  • Bumped duroxide to 0.1.26, duroxide-pg to 0.1.27.
  • KV delta table support: fixes read-modify-write replay poisoning by separating current-execution mutations from prior-execution snapshots.

Added

  • KV read-modify-write counter e2e test (sample_kv_read_modify_write_counter).

[0.1.16] - 2026-03-14

Changed

  • Bumped duroxide from 0.1.24 to 0.1.25.
  • Updated Rust bindings to call the renamed KV APIs (set_kv_value, get_kv_value, clear_kv_value, clear_all_kv_values, get_kv_value_from_instance, wait_for_kv_value).
  • Raised exported MAX_KV_KEYS from 10 to 100.

Added

  • ctx.getKvAllValues(), ctx.getKvAllKeys(), ctx.getKvLength(), and ctx.pruneKvValuesUpdatedBefore(cutoffMs).
  • client.getKvAllValues(instanceId) for bulk KV reads.
  • KV tests covering snapshot, pruning, and the updated key limit.

[0.1.15] - 2026-03-13

  • KV store support: Durable key-value store for per-instance state
    • OrchestrationContext: setValue(), getValue(), clearValue(), clearAllValues()
    • Client: getValue(), waitForValue()
    • Constants: MAX_KV_KEYS, MAX_KV_VALUE_BYTES
  • Added KV e2e tests (kv_store.test.js)
  • Bumped duroxide to 0.1.24, duroxide-pg to 0.1.25

[0.1.14] - 2026-03-08

Added

  • 5 new e2e tests: heterogeneous workers pipeline, starvation-safe tagged activity fallback, dual runtime tag cooperation, nested error handling propagation, error recovery with logging.
  • MAX_WORKER_TAGS (5) and MAX_TAG_NAME_BYTES (256) constants exported.

Changed

  • Bumped duroxide core from 0.1.22 to 0.1.23 (activity tag ack validation test).
  • Bumped duroxide-pg from local path to published 0.1.24 (tag routing + migration fixes).

[0.1.10] - 2026-02-28

Added

  • Typed APIs parity pass: typed scheduling/wait/event/dequeue variants and typed-path tests.
  • Async block and advanced-feature parity suites integrated into default test scripts.

Changed

  • Unified schedule/whenAll/whenAny terminology across docs and examples.
  • Refactored .NET/Java parity alignment and cross-SDK test consistency.

[0.1.9] - 2026-02-21

Added

  • getCustomStatus() — read the current custom status value from within an orchestration. Returns the status string or null if none has been set. Reflects all setCustomStatus/resetCustomStatus calls, including across turn boundaries and continue-as-new.

Changed

  • Upgraded duroxide to 0.1.20, duroxide-pg to 0.1.22

[0.1.7] - 2026-02-20

Added

  • Custom Status API: ctx.setCustomStatus(status) and ctx.resetCustomStatus() — set/clear custom status from orchestrations (fire-and-forget, no yield needed)
  • Custom Status on OrchestrationStatus: customStatus and customStatusVersion fields on status objects returned by getStatus(), waitForOrchestration(), etc.
  • Custom Status Polling: client.waitForStatusChange(instanceId, lastSeenVersion, pollIntervalMs, timeoutMs) — poll for custom status changes
  • Event Queue API (Context): ctx.dequeueEvent(queueName) — dequeue from a named FIFO mailbox (survives continue-as-new)
  • Event Queue API (Client): client.enqueueEvent(instanceId, queueName, data) — enqueue to an instance's event queue
  • Retry with Session: ctx.scheduleActivityWithRetryOnSession(name, input, retry, sessionId) — retry with session affinity
  • scheduleActivityWithRetry now respects sessionId when present
  • EventKind support for QueueSubscribed, QueueEventDelivered, QueueSubscriptionCancelled

Changed

  • Upgraded duroxide to 0.1.19, duroxide-pg to 0.1.21

Deprecated

  • client.raiseEvent() for persistent messaging — use client.enqueueEvent() instead
  • ctx.waitForEvent() for persistent subscriptions — use ctx.dequeueEvent() instead

[0.1.5] - 2026-02-13

Added

  • initTracing({ logFile, logLevel?, logFormat? }) — install a file-based tracing subscriber before runtime.start(). Uses first-writer-wins (try_init) so the runtime's built-in subscriber silently no-ops if one is already installed. Supports "json", "pretty", and "compact" (default) log formats.
  • 3 new tests for initTracing: export check, file write, invalid path error

[0.1.3] - 2026-02-12

Added

  • data field on history events (readExecutionHistory) — exposes activity results, inputs, errors, timer fire times, and all event-specific content as JSON strings
  • Management API section in README with usage examples
  • New test: includes data field with event-specific content

[0.1.2] - 2026-02-10

Added

  • ctx.getClient() on ActivityContext — activities can now start orchestrations, raise events, etc.
  • runtime.metricsSnapshot() — get runtime metric counters (orchestration starts/completions, activity results, provider errors)
  • Observability options on RuntimeOptions: logLevel, logFormat, serviceName, serviceVersion
  • 2 new e2e tests: activity getClient, metrics snapshot

[0.1.1] - 2026-02-10

Fixed

  • README doc links now use absolute GitHub URLs so they work on npmjs.com

[0.1.0] - 2026-02-10

Added

  • Core SDK — Node.js wrapper around the Rust duroxide runtime via napi-rs

    • Generator-based orchestrations (function* + yield) for deterministic replay
    • Async activities (async function + await) for side effects
    • Structured tracing delegated to Rust (auto-suppressed during replay)
  • Orchestration Context API

    • scheduleActivity(), scheduleActivityWithRetry() — activity scheduling with optional retry policies
    • scheduleTimer() — durable delays that survive restarts
    • waitForEvent() — pause for external signals
    • scheduleSubOrchestration(), scheduleSubOrchestrationWithId() — child workflows
    • startOrchestration() — fire-and-forget orchestration launches
    • all() — parallel fan-out/fan-in supporting all task types (activities, timers, waits, sub-orchestrations)
    • race() — first-to-complete between 2 tasks, supporting all task types
    • utcNow(), newGuid() — deterministic values for replay safety
    • continueAsNew() — restart orchestrations with fresh history
    • Nested all()/race() rejection with clear error messages
  • Activity Context API

    • isCancelled() — cooperative cancellation (detects when orchestration no longer needs the result)
    • traceInfo(), traceWarn(), traceError(), traceDebug() — structured tracing with full metadata
    • Context fields: instanceId, executionId, orchestrationName, activityName, workerId
  • Runtime Options

    • orchestrationConcurrency, workerConcurrency, dispatcherPollInterval
    • workerLockTimeoutMs — controls activity cancellation detection latency
    • observability — log level, service name, gauge polling interval
  • Client API

    • startOrchestration(), startOrchestrationVersioned() — launch workflows
    • waitForOrchestration() — poll until completion with timeout
    • raiseEvent() — send external events to waiting orchestrations
    • cancelInstance() — cancel running orchestrations
    • getOrchestrationStatus() — query status without waiting
    • deleteInstance() — remove completed instances
    • getSystemMetrics(), getQueueDepths() — observability
    • listAllInstances() — admin listing
  • Storage Providers

    • SQLite (SqliteProvider) — file-backed or in-memory, good for development/testing
    • PostgreSQL (PostgresProvider) — production multi-node deployments with schema isolation
  • VersioningregisterOrchestrationVersioned() for safe rolling upgrades

  • 50 tests across 4 test suites

    • e2e.test.js — 23 PostgreSQL e2e tests + 1 SQLite smoketest
    • races.test.js — 7 tests for ctx.all() and ctx.race() with mixed task types + cooperative cancellation
    • admin_api.test.js — 14 admin/management API tests
    • scenarios/toygres-node.test.js — 6 scenario tests modeling real-world patterns