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-pgdependency —0.1.33→0.1.34while keepingduroxideat0.1.29. - PostgreSQL provider initialization compatibility — native bindings now
construct
ProviderConfig::url(...)/ProviderConfig::entra(...)and call the single-argumentPostgresProvider::new_with_config(config)API introduced byduroxide-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). Releasedduroxide-pg 0.1.32pulledreqwesttransitively without a TLS connector compiled in, which caused every HTTPS call (including AAD token acquisition forconnectWithEntra/connectWithSchemaAndEntra) to fail witherror sending request/invalid URL, scheme is not http. No public API changes.
Changed
- Bumped
duroxide-pgdependency —0.1.32→0.1.33.
[0.1.25] - 2026-05-09
Added
- Microsoft Entra ID authentication —
PostgresProvider.connectWithEntra(host, port, database, user, options?)andPostgresProvider.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 usePgSslMode::VerifyFull. PostgresEntraOptionsinterface — optional tunables:audience,maxConnections,acquireTimeoutMs,refreshIntervalMs. All fields default to sensible Azure public-cloud values.
Changed
- Bumped
duroxidedependency —0.1.28→0.1.29 - Bumped
duroxide-pgdependency —0.1.30→0.1.32
Added
- Linux ARM64 GNU package - Publish
duroxide-linux-arm64-gnuforaarch64-unknown-linux-gnuand include it as an optional dependency solinux/arm64Node.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 packaging —
index.jswas regenerated bynapi buildduring the 0.1.22 release and lost the manualrequire('duroxide-windows-x64')patch from #13, falling back to the (non-existent) napi-default nameduroxide-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
duroxidedependency —0.1.27→0.1.28(drops transitiveringcrate via SQLx native-tls upstream) - Bumped
duroxide-pgdependency —0.1.29→0.1.30(samering-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 duroxidenow correctly pulls theduroxide-windows-x64optional dependency. In0.1.20the publishedoptionalDependenciesin the main package were rewritten by napi-rs'sprepublishstep back to the defaultduroxide-win32-x64-msvcname, which does not exist on npm post-rename, so Windows installs failed withMODULE_NOT_FOUND. Caught by the new post-publish registry smoke. CI now publishes the main package with--ignore-scriptsto preserve our manifest exactly.
[0.1.20] - 2026-04-17
Fixed
- Windows dispatcher now resolves the correct platform subpackage (
duroxide-windows-x64). Previouslyrequire('duroxide-win32-x64-msvc')inindex.jsthrewMODULE_NOT_FOUND, makingduroxide@0.1.19unusable 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-pgfrom 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-instanceSystemStatshistory/KV usage introspection.- Node admin tests and TypeScript declarations for orchestration stats.
Changed
- Bumped local validation deps to
duroxide0.1.27 andduroxide-pg0.1.28. - Updated exported KV limits to
MAX_KV_KEYS = 150andMAX_KV_VALUE_BYTES = 65536.
[0.1.17] - 2026-03-15
Changed
- Bumped
duroxideto 0.1.26,duroxide-pgto 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
duroxidefrom 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_KEYSfrom 10 to 100.
Added
ctx.getKvAllValues(),ctx.getKvAllKeys(),ctx.getKvLength(), andctx.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) andMAX_TAG_NAME_BYTES(256) constants exported.
Changed
- Bumped
duroxidecore from 0.1.22 to 0.1.23 (activity tag ack validation test). - Bumped
duroxide-pgfrom 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 ornullif none has been set. Reflects allsetCustomStatus/resetCustomStatuscalls, 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)andctx.resetCustomStatus()— set/clear custom status from orchestrations (fire-and-forget, no yield needed) - Custom Status on OrchestrationStatus:
customStatusandcustomStatusVersionfields on status objects returned bygetStatus(),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 scheduleActivityWithRetrynow respectssessionIdwhen 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 — useclient.enqueueEvent()insteadctx.waitForEvent()for persistent subscriptions — usectx.dequeueEvent()instead
[0.1.5] - 2026-02-13
Added
initTracing({ logFile, logLevel?, logFormat? })— install a file-based tracing subscriber beforeruntime.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
datafield 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)
- Generator-based orchestrations (
-
Orchestration Context API
scheduleActivity(),scheduleActivityWithRetry()— activity scheduling with optional retry policiesscheduleTimer()— durable delays that survive restartswaitForEvent()— pause for external signalsscheduleSubOrchestration(),scheduleSubOrchestrationWithId()— child workflowsstartOrchestration()— fire-and-forget orchestration launchesall()— parallel fan-out/fan-in supporting all task types (activities, timers, waits, sub-orchestrations)race()— first-to-complete between 2 tasks, supporting all task typesutcNow(),newGuid()— deterministic values for replay safetycontinueAsNew()— 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,dispatcherPollIntervalworkerLockTimeoutMs— controls activity cancellation detection latencyobservability— log level, service name, gauge polling interval
-
Client API
startOrchestration(),startOrchestrationVersioned()— launch workflowswaitForOrchestration()— poll until completion with timeoutraiseEvent()— send external events to waiting orchestrationscancelInstance()— cancel running orchestrationsgetOrchestrationStatus()— query status without waitingdeleteInstance()— remove completed instancesgetSystemMetrics(),getQueueDepths()— observabilitylistAllInstances()— admin listing
-
Storage Providers
- SQLite (
SqliteProvider) — file-backed or in-memory, good for development/testing - PostgreSQL (
PostgresProvider) — production multi-node deployments with schema isolation
- SQLite (
-
Versioning —
registerOrchestrationVersioned()for safe rolling upgrades -
50 tests across 4 test suites
e2e.test.js— 23 PostgreSQL e2e tests + 1 SQLite smoketestraces.test.js— 7 tests forctx.all()andctx.race()with mixed task types + cooperative cancellationadmin_api.test.js— 14 admin/management API testsscenarios/toygres-node.test.js— 6 scenario tests modeling real-world patterns