@salesforce/pwa-kit-react-sdk 3.12.0 → 3.13.0-nightly-20250909080205

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## v3.13.0-nightly-20250909080205 (Sep 09, 2025)
2
+ ## v3.13.0-dev (Sep 04, 2025)
3
+ - Opentelemetry integration for SSR tracing [#3133](https://github.com/SalesforceCommerceCloud/pwa-kit/pull/3133)
4
+
1
5
  ## v3.12.0 (Sep 04, 2025)
2
6
  - Add support for environment level base paths on /mobify routes [#2892](https://github.com/SalesforceCommerceCloud/pwa-kit/pull/2892)
3
7
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salesforce/pwa-kit-react-sdk",
3
- "version": "3.12.0",
3
+ "version": "3.13.0-nightly-20250909080205",
4
4
  "description": "A library that supports the isomorphic React rendering pipeline for Commerce Cloud Managed Runtime apps",
5
5
  "homepage": "https://github.com/SalesforceCommerceCloud/pwa-kit/tree/develop/packages/pwa-kit-react-sdk#readme",
6
6
  "bugs": {
@@ -37,7 +37,13 @@
37
37
  "@loadable/babel-plugin": "^5.15.3",
38
38
  "@loadable/server": "^5.15.3",
39
39
  "@loadable/webpack-plugin": "^5.15.2",
40
- "@salesforce/pwa-kit-runtime": "3.12.0",
40
+ "@opentelemetry/api": "^1.4.1",
41
+ "@opentelemetry/core": "^1.15.1",
42
+ "@opentelemetry/propagator-b3": "^1.15.1",
43
+ "@opentelemetry/resources": "^1.15.1",
44
+ "@opentelemetry/sdk-trace-base": "^1.15.1",
45
+ "@opentelemetry/sdk-trace-node": "^1.15.1",
46
+ "@salesforce/pwa-kit-runtime": "3.13.0-nightly-20250909080205",
41
47
  "@tanstack/react-query": "^4.28.0",
42
48
  "cross-env": "^5.2.1",
43
49
  "event-emitter": "^0.3.5",
@@ -50,11 +56,11 @@
50
56
  },
51
57
  "devDependencies": {
52
58
  "@loadable/component": "^5.15.3",
53
- "@salesforce/pwa-kit-dev": "3.12.0",
59
+ "@salesforce/pwa-kit-dev": "3.13.0-nightly-20250909080205",
54
60
  "@testing-library/jest-dom": "^5.16.5",
55
61
  "@testing-library/react": "^14.0.0",
56
62
  "@testing-library/user-event": "14.4.3",
57
- "internal-lib-build": "3.12.0",
63
+ "internal-lib-build": "3.13.0-nightly-20250909080205",
58
64
  "node-html-parser": "^3.3.6",
59
65
  "nodemon": "^2.0.22",
60
66
  "react": "^18.2.0",
@@ -79,5 +85,5 @@
79
85
  "publishConfig": {
80
86
  "directory": "dist"
81
87
  },
82
- "gitHead": "8fe2805d21aec09eb9ae86cce1e4ceeb828f61f1"
88
+ "gitHead": "6f1395801a36b95520095770165cb0124a1928fe"
83
89
  }
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.tracePerformance = exports.shutdownServerTracing = exports.isServerTracingInitialized = exports.initializeServerTracing = exports.getServerTracingProvider = void 0;
7
+ var _sdkTraceNode = require("@opentelemetry/sdk-trace-node");
8
+ var _sdkTraceBase = require("@opentelemetry/sdk-trace-base");
9
+ var _propagatorB = require("@opentelemetry/propagator-b3");
10
+ var _resources = require("@opentelemetry/resources");
11
+ var _api = require("@opentelemetry/api");
12
+ var _loggerInstance = _interopRequireDefault(require("../../utils/logger-instance"));
13
+ var _opentelemetryConfig = require("../../utils/opentelemetry-config");
14
+ var _opentelemetry = require("../../utils/opentelemetry");
15
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
+ function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
17
+ function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } /*
18
+ * Copyright (c) 2025, Salesforce, Inc.
19
+ * All rights reserved.
20
+ * SPDX-License-Identifier: BSD-3-Clause
21
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
22
+ */
23
+ let provider = null;
24
+
25
+ /**
26
+ * Initialize OpenTelemetry tracing for server-side rendering
27
+ * @param {Object} options
28
+ * @param {string} [options.serviceName]
29
+ * @param {string} [options.serviceVersion]
30
+ * @param {boolean} [options.enabled]
31
+ * @returns {NodeTracerProvider|null}
32
+ */
33
+ const initializeServerTracing = (options = {}) => {
34
+ const {
35
+ serviceName = options.serviceName || (0, _opentelemetryConfig.getServiceName)(),
36
+ serviceVersion,
37
+ enabled = (0, _opentelemetryConfig.getOTELConfig)().enabled
38
+ } = options;
39
+ // If tracing is disabled, return null without initializing
40
+ if (!enabled) {
41
+ return null;
42
+ }
43
+ try {
44
+ // Build resource attributes
45
+ const resourceAttributes = {
46
+ 'service.name': serviceName
47
+ };
48
+
49
+ // Add service version if provided
50
+ if (serviceVersion) {
51
+ resourceAttributes['service.version'] = serviceVersion;
52
+ }
53
+
54
+ // Initialize the tracer provider
55
+ provider = new _sdkTraceNode.NodeTracerProvider({
56
+ resource: new _resources.Resource(resourceAttributes),
57
+ spanProcessor: new _sdkTraceBase.SimpleSpanProcessor()
58
+ });
59
+
60
+ // Add B3 propagator
61
+ _api.propagation.setGlobalPropagator(new _propagatorB.B3Propagator());
62
+ provider.register();
63
+ return provider;
64
+ } catch (error) {
65
+ // Log errors from OpenTelemetry initialization
66
+ _loggerInstance.default.error('Failed to initialize OpenTelemetry provider', {
67
+ namespace: 'opentelemetry-server.initializeServerTracing',
68
+ additionalProperties: {
69
+ error: error.message
70
+ }
71
+ });
72
+ return null;
73
+ }
74
+ };
75
+
76
+ /**
77
+ * Shutdown OpenTelemetry tracing and clean up resources
78
+ * @returns {Promise<void>}
79
+ */
80
+ exports.initializeServerTracing = initializeServerTracing;
81
+ const shutdownServerTracing = exports.shutdownServerTracing = /*#__PURE__*/function () {
82
+ var _ref = _asyncToGenerator(function* () {
83
+ if (provider) {
84
+ try {
85
+ yield provider.shutdown();
86
+ provider = null; // Clean up after successful shutdown
87
+ } catch (error) {
88
+ _loggerInstance.default.warn('Failed to shutdown OpenTelemetry provider', {
89
+ namespace: 'opentelemetry-server.shutdownServerTracing',
90
+ additionalProperties: {
91
+ error: error.message
92
+ }
93
+ });
94
+ }
95
+ }
96
+ });
97
+ return function shutdownServerTracing() {
98
+ return _ref.apply(this, arguments);
99
+ };
100
+ }();
101
+
102
+ /**
103
+ * Get the current OpenTelemetry provider instance
104
+ * @returns {NodeTracerProvider|null} The current provider or null if not initialized
105
+ */
106
+ const getServerTracingProvider = () => {
107
+ return provider;
108
+ };
109
+
110
+ /**
111
+ * Check if OpenTelemetry tracing is currently initialized
112
+ * @returns {boolean} True if tracing is initialized, false otherwise
113
+ */
114
+ exports.getServerTracingProvider = getServerTracingProvider;
115
+ const isServerTracingInitialized = () => {
116
+ return provider !== null;
117
+ };
118
+
119
+ /**
120
+ * Creates a span for performance measurement
121
+ * @param {string} name - The name of the performance span
122
+ * @param {Function} fn - The function to measure
123
+ * @param {Object} res - The response object (optional)
124
+ * @returns {Promise<any>} The result of the function
125
+ */
126
+ exports.isServerTracingInitialized = isServerTracingInitialized;
127
+ const tracePerformance = exports.tracePerformance = /*#__PURE__*/function () {
128
+ var _ref2 = _asyncToGenerator(function* (name, fn, res = null, req = null) {
129
+ // Check if OpenTelemetry is properly configured
130
+ const otelConfig = (0, _opentelemetryConfig.getOTELConfig)();
131
+ let rootSpan = null;
132
+ let ctx = null;
133
+ const includeServerTimingHeader = '__server_timing' in req.query;
134
+ const shouldTrackPerformance = includeServerTimingHeader || process.env.SERVER_TIMING;
135
+ if (otelConfig.enabled && shouldTrackPerformance) {
136
+ // Initialize server tracing if needed for this request
137
+ if (shouldTrackPerformance && !isServerTracingInitialized()) {
138
+ initializeServerTracing();
139
+ }
140
+ const tracer = _api.trace.getTracer((0, _opentelemetryConfig.getServiceName)());
141
+ // Create the root span
142
+ rootSpan = tracer.startSpan(name, {
143
+ attributes: {
144
+ 'service.name': (0, _opentelemetryConfig.getServiceName)()
145
+ }
146
+ });
147
+
148
+ // Create a new context with the root span
149
+ ctx = _api.trace.setSpan(_api.context.active(), rootSpan);
150
+
151
+ // Inject B3 headers into response if available
152
+ if (res && (0, _opentelemetryConfig.getOTELConfig)().enabled && shouldTrackPerformance) {
153
+ res.setHeader('x-b3-traceid', rootSpan.spanContext().traceId);
154
+ res.setHeader('x-b3-spanid', rootSpan.spanContext().spanId);
155
+ res.setHeader('x-b3-sampled', '1');
156
+ }
157
+ }
158
+ try {
159
+ // Run the function within the context of the root span (if ctx exists)
160
+ const result = ctx ? yield _api.context.with(ctx, /*#__PURE__*/_asyncToGenerator(function* () {
161
+ try {
162
+ return yield fn();
163
+ } catch (error) {
164
+ rootSpan.setStatus({
165
+ code: _api.SpanStatusCode.ERROR,
166
+ message: error.message
167
+ });
168
+ throw error;
169
+ }
170
+ })) : yield fn();
171
+ if (otelConfig.enabled && shouldTrackPerformance) {
172
+ rootSpan.end();
173
+ (0, _opentelemetry.logSpanData)(rootSpan, 'end', res);
174
+ }
175
+ return result;
176
+ } catch (error) {
177
+ if (otelConfig.enabled && shouldTrackPerformance) {
178
+ rootSpan.end();
179
+ (0, _opentelemetry.logSpanData)(rootSpan, 'end', res);
180
+ }
181
+ throw error;
182
+ }
183
+ });
184
+ return function tracePerformance(_x, _x2) {
185
+ return _ref2.apply(this, arguments);
186
+ };
187
+ }();