Skip to content

Conversation

@chris-olszewski
Copy link
Member

@chris-olszewski chris-olszewski commented Oct 28, 2025

What was changed

Mark @temporalio/* peer dependencies as optional when they are not required in all cases.

@temporalio/common is still a required peer dep as all interceptors require it.

Only special handling of @temporalio/workflow is needed as the rest of the peer dependencies are only used for types and do not actually get loaded at runtime. If any of the workflow interceptors are constructed without the dependency, it will rethrow the original module resolution error.

It should be noted that this approach only works due to the fact we're producing CJS. If we want to produce both CJS and ESM we will need to change our approach.

Why?

If workers/clients are split up into different packages, the client package does not need a dependency on @temporalio/workflow in order to properly use the client only OTEL interceptors.

Checklist

  1. Closes [Bug] Remove peer dependencies from @temporalio/interceptors-opentelemetry #1785

  2. How was this tested:
    Made a quick example project without @temporalio/workflow as a peer dep:

olszewski@mac testing-miss % cat package.json
{
  "name": "testing-miss",
  "packageManager": "yarn@4.9.2",
  "scripts": {
    "test": "node index.js"
  },
  "dependencies": {
    "@temporalio/common": "1.13.1",
    "@temporalio/interceptors-opentelemetry": "file:/Users/olszewski/code/temporal/sdk/typescript/packages/interceptors-opentelemetry"
  }
}
olszewski@mac testing-miss % cat index.js
const interceptors = require('@temporalio/interceptors-opentelemetry');

// Works
const client = new interceptors.OpenTelemetryWorkflowClientInterceptor();
const workerInbound = new interceptors.OpenTelemetryActivityInboundInterceptor();
const workerOutbound = new interceptors.OpenTelemetryActivityOutboundInterceptor();

// Fails
try {
  new interceptors.OpenTelemetryInboundInterceptor();
} catch (e) {
  console.error(e);
}
try {
  new interceptors.OpenTelemetryOutboundInterceptor();
} catch (e) {
  console.error(e);
}
olszewski@mac testing-miss % yarn run test
Error: @temporalio/interceptors-opentelemetry tried to access @temporalio/workflow (a peer dependency) but it isn't provided by your application; this makes the require call ambiguous and unsound.

Required package: @temporalio/workflow
Required by: @temporalio/interceptors-opentelemetry@virtual:d0b6f3e03798694ff830afb20651862d44b8beb2f7c2472aed63f2218979b633b08a0a029d4f8bc4ef1dd84f94de2b4d8d63b5d652b1d05f928760d8e12a9ea0#file:/Users/olszewski/code/temporal/sdk/typescript/packages/interceptors-opentelemetry#/Users/olszewski/code/temporal/sdk/typescript/packages/interceptors-opentelemetry::hash=53ed96&locator=testing-miss%40workspace%3A. (via /private/tmp/testing-miss/.yarn/__virtual__/@temporalio-interceptors-opentelemetry-virtual-91e69a0ad9/4/Users/olszewski/.yarn/berry/cache/@temporalio-interceptors-opentelemetry-file-ec02482c63-10c0.zip/node_modules/@temporalio/interceptors-opentelemetry/lib/workflow/)
Ancestor breaking the chain: testing-miss@workspace:.


Require stack:
- /private/tmp/testing-miss/.yarn/__virtual__/@temporalio-interceptors-opentelemetry-virtual-91e69a0ad9/4/Users/olszewski/.yarn/berry/cache/@temporalio-interceptors-opentelemetry-file-ec02482c63-10c0.zip/node_modules/@temporalio/interceptors-opentelemetry/lib/workflow/workflow-module-loader.js
- /private/tmp/testing-miss/.yarn/__virtual__/@temporalio-interceptors-opentelemetry-virtual-91e69a0ad9/4/Users/olszewski/.yarn/berry/cache/@temporalio-interceptors-opentelemetry-file-ec02482c63-10c0.zip/node_modules/@temporalio/interceptors-opentelemetry/lib/workflow/runtime.js
- /private/tmp/testing-miss/.yarn/__virtual__/@temporalio-interceptors-opentelemetry-virtual-91e69a0ad9/4/Users/olszewski/.yarn/berry/cache/@temporalio-interceptors-opentelemetry-file-ec02482c63-10c0.zip/node_modules/@temporalio/interceptors-opentelemetry/lib/workflow/index.js
- /private/tmp/testing-miss/.yarn/__virtual__/@temporalio-interceptors-opentelemetry-virtual-91e69a0ad9/4/Users/olszewski/.yarn/berry/cache/@temporalio-interceptors-opentelemetry-file-ec02482c63-10c0.zip/node_modules/@temporalio/interceptors-opentelemetry/lib/index.js
- /private/tmp/testing-miss/index.js
    at require$$0.Module._resolveFilename (/private/tmp/testing-miss/.pnp.cjs:6248:13)
    at defaultResolveImpl (node:internal/modules/cjs/loader:1025:19)
    at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1030:22)
    at Function.<anonymous> (node:internal/modules/cjs/loader:1192:37)
    at require$$0.Module._load (/private/tmp/testing-miss/.pnp.cjs:6139:31)
    at TracingChannel.traceSync (node:diagnostics_channel:322:14)
    at wrapModuleLoad (node:internal/modules/cjs/loader:237:24)
    at Module.require (node:internal/modules/cjs/loader:1463:12)
    at require (node:internal/modules/helpers:147:16)
    at Object.<anonymous> (/private/tmp/testing-miss/.yarn/__virtual__/@temporalio-interceptors-opentelemetry-virtual-91e69a0ad9/4/Users/olszewski/.yarn/berry/cache/@temporalio-interceptors-opentelemetry-file-ec02482c63-10c0.zip/node_modules/@temporalio/interceptors-opentelemetry/lib/workflow/workflow-module-loader.js:13:22)
Error: @temporalio/interceptors-opentelemetry tried to access @temporalio/workflow (a peer dependency) but it isn't provided by your application; this makes the require call ambiguous and unsound.

Required package: @temporalio/workflow
Required by: @temporalio/interceptors-opentelemetry@virtual:d0b6f3e03798694ff830afb20651862d44b8beb2f7c2472aed63f2218979b633b08a0a029d4f8bc4ef1dd84f94de2b4d8d63b5d652b1d05f928760d8e12a9ea0#file:/Users/olszewski/code/temporal/sdk/typescript/packages/interceptors-opentelemetry#/Users/olszewski/code/temporal/sdk/typescript/packages/interceptors-opentelemetry::hash=53ed96&locator=testing-miss%40workspace%3A. (via /private/tmp/testing-miss/.yarn/__virtual__/@temporalio-interceptors-opentelemetry-virtual-91e69a0ad9/4/Users/olszewski/.yarn/berry/cache/@temporalio-interceptors-opentelemetry-file-ec02482c63-10c0.zip/node_modules/@temporalio/interceptors-opentelemetry/lib/workflow/)
Ancestor breaking the chain: testing-miss@workspace:.


Require stack:
- /private/tmp/testing-miss/.yarn/__virtual__/@temporalio-interceptors-opentelemetry-virtual-91e69a0ad9/4/Users/olszewski/.yarn/berry/cache/@temporalio-interceptors-opentelemetry-file-ec02482c63-10c0.zip/node_modules/@temporalio/interceptors-opentelemetry/lib/workflow/workflow-module-loader.js
- /private/tmp/testing-miss/.yarn/__virtual__/@temporalio-interceptors-opentelemetry-virtual-91e69a0ad9/4/Users/olszewski/.yarn/berry/cache/@temporalio-interceptors-opentelemetry-file-ec02482c63-10c0.zip/node_modules/@temporalio/interceptors-opentelemetry/lib/workflow/runtime.js
- /private/tmp/testing-miss/.yarn/__virtual__/@temporalio-interceptors-opentelemetry-virtual-91e69a0ad9/4/Users/olszewski/.yarn/berry/cache/@temporalio-interceptors-opentelemetry-file-ec02482c63-10c0.zip/node_modules/@temporalio/interceptors-opentelemetry/lib/workflow/index.js
- /private/tmp/testing-miss/.yarn/__virtual__/@temporalio-interceptors-opentelemetry-virtual-91e69a0ad9/4/Users/olszewski/.yarn/berry/cache/@temporalio-interceptors-opentelemetry-file-ec02482c63-10c0.zip/node_modules/@temporalio/interceptors-opentelemetry/lib/index.js
- /private/tmp/testing-miss/index.js
    at require$$0.Module._resolveFilename (/private/tmp/testing-miss/.pnp.cjs:6248:13)
    at defaultResolveImpl (node:internal/modules/cjs/loader:1025:19)
    at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1030:22)
    at Function.<anonymous> (node:internal/modules/cjs/loader:1192:37)
    at require$$0.Module._load (/private/tmp/testing-miss/.pnp.cjs:6139:31)
    at TracingChannel.traceSync (node:diagnostics_channel:322:14)
    at wrapModuleLoad (node:internal/modules/cjs/loader:237:24)
    at Module.require (node:internal/modules/cjs/loader:1463:12)
    at require (node:internal/modules/helpers:147:16)
    at Object.<anonymous> (/private/tmp/testing-miss/.yarn/__virtual__/@temporalio-interceptors-opentelemetry-virtual-91e69a0ad9/4/Users/olszewski/.yarn/berry/cache/@temporalio-interceptors-opentelemetry-file-ec02482c63-10c0.zip/node_modules/@temporalio/interceptors-opentelemetry/lib/workflow/workflow-module-loader.js:13:22)

Adding the dependency:

olszewski@mac testing-miss % yarn add @temporalio/workflow
➤ YN0000: · Yarn 4.9.2
➤ YN0000: ┌ Resolution step
➤ YN0085: │ + @temporalio/interceptors-opentelemetry@file:/Users/olszewski/code/temporal/sdk/typescript/packages/interceptors-opentelemetry#/Users/olszewski/code/temporal/sdk/typescript/packages/interceptors-opentelemetry::hash=e2f942&locator=testing-miss%40workspace%3A., @temporalio/workflow@npm:1.13.1
➤ YN0085: │ - @temporalio/interceptors-opentelemetry@file:/Users/olszewski/code/temporal/sdk/typescript/packages/interceptors-opentelemetry#/Users/olszewski/code/temporal/sdk/typescript/packages/interceptors-opentelemetry::hash=53ed96&locator=testing-miss%40workspace%3A.
➤ YN0000: └ Completed
➤ YN0000: ┌ Fetch step
➤ YN0013: │ A package was added to the project (+ 229.47 KiB).
➤ YN0000: └ Completed
➤ YN0000: ┌ Link step
➤ YN0000: │ ESM support for PnP uses the experimental loader API and is therefore experimental
➤ YN0000: └ Completed
➤ YN0000: · Done with warnings in 0s 85ms
olszewski@mac testing-miss % yarn run test
# No errors
  1. Any docs updates needed?
    Updated doc comments for workflow interceptors.

@chris-olszewski chris-olszewski marked this pull request as ready for review October 28, 2025 18:34
@chris-olszewski chris-olszewski requested a review from a team as a code owner October 28, 2025 18:34
@chris-olszewski chris-olszewski merged commit 92fa55d into main Oct 29, 2025
48 of 52 checks passed
@chris-olszewski chris-olszewski deleted the olszewski/gh_1744 branch October 29, 2025 17:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] Remove peer dependencies from @temporalio/interceptors-opentelemetry

3 participants