dd-trace 5.54.0 → 5.56.0
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/LICENSE-3rdparty.csv +1 -0
- package/ci/cypress/plugin.js +8 -0
- package/ci/cypress/polyfills.js +23 -0
- package/ci/init.js +8 -7
- package/initialize.mjs +2 -2
- package/package.json +10 -9
- package/packages/datadog-code-origin/index.js +22 -4
- package/packages/datadog-core/src/utils/src/kebabcase.js +3 -3
- package/packages/datadog-core/src/utils/src/set.js +8 -10
- package/packages/datadog-instrumentations/src/cassandra-driver.js +5 -6
- package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +2 -3
- package/packages/datadog-instrumentations/src/cookie-parser.js +1 -1
- package/packages/datadog-instrumentations/src/couchbase.js +3 -6
- package/packages/datadog-instrumentations/src/cucumber.js +21 -28
- package/packages/datadog-instrumentations/src/dns.js +4 -4
- package/packages/datadog-instrumentations/src/elasticsearch.js +9 -10
- package/packages/datadog-instrumentations/src/fastify.js +7 -9
- package/packages/datadog-instrumentations/src/google-cloud-pubsub.js +14 -16
- package/packages/datadog-instrumentations/src/hapi.js +10 -11
- package/packages/datadog-instrumentations/src/helpers/fetch.js +4 -5
- package/packages/datadog-instrumentations/src/helpers/hook.js +1 -2
- package/packages/datadog-instrumentations/src/helpers/register.js +6 -5
- package/packages/datadog-instrumentations/src/jest.js +421 -376
- package/packages/datadog-instrumentations/src/koa.js +2 -3
- package/packages/datadog-instrumentations/src/mariadb.js +11 -4
- package/packages/datadog-instrumentations/src/mocha/main.js +79 -75
- package/packages/datadog-instrumentations/src/mocha.js +3 -1
- package/packages/datadog-instrumentations/src/mysql.js +11 -2
- package/packages/datadog-instrumentations/src/nyc.js +2 -1
- package/packages/datadog-instrumentations/src/openai.js +2 -2
- package/packages/datadog-instrumentations/src/otel-sdk-trace.js +4 -3
- package/packages/datadog-instrumentations/src/pg.js +2 -3
- package/packages/datadog-instrumentations/src/playwright.js +19 -22
- package/packages/datadog-instrumentations/src/protobufjs.js +3 -4
- package/packages/datadog-instrumentations/src/redis.js +1 -1
- package/packages/datadog-instrumentations/src/restify.js +9 -13
- package/packages/datadog-instrumentations/src/router.js +12 -11
- package/packages/datadog-instrumentations/src/tedious.js +1 -2
- package/packages/datadog-instrumentations/src/vitest.js +15 -29
- package/packages/datadog-plugin-avsc/src/schema_iterator.js +12 -12
- package/packages/datadog-plugin-aws-sdk/src/base.js +12 -8
- package/packages/datadog-plugin-aws-sdk/src/services/cloudwatchlogs.js +3 -5
- package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +12 -20
- package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +4 -5
- package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +3 -5
- package/packages/datadog-plugin-aws-sdk/src/services/redshift.js +3 -5
- package/packages/datadog-plugin-aws-sdk/src/services/s3.js +3 -5
- package/packages/datadog-plugin-aws-sdk/src/services/sns.js +1 -2
- package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +7 -10
- package/packages/datadog-plugin-azure-functions/src/index.js +5 -4
- package/packages/datadog-plugin-cucumber/src/index.js +3 -2
- package/packages/datadog-plugin-cypress/src/cypress-plugin.js +2 -1
- package/packages/datadog-plugin-dd-trace-api/src/index.js +2 -1
- package/packages/datadog-plugin-elasticsearch/src/index.js +1 -1
- package/packages/datadog-plugin-google-cloud-vertexai/src/tracing.js +1 -1
- package/packages/datadog-plugin-graphql/src/index.js +3 -2
- package/packages/datadog-plugin-graphql/src/resolve.js +17 -10
- package/packages/datadog-plugin-http/src/client.js +5 -6
- package/packages/datadog-plugin-http2/src/client.js +7 -8
- package/packages/datadog-plugin-jest/src/index.js +3 -2
- package/packages/datadog-plugin-mocha/src/index.js +6 -1
- package/packages/datadog-plugin-mongodb-core/src/index.js +2 -1
- package/packages/datadog-plugin-mysql/src/index.js +11 -0
- package/packages/datadog-plugin-next/src/index.js +1 -1
- package/packages/datadog-plugin-openai/src/tracing.js +2 -4
- package/packages/datadog-plugin-oracledb/src/index.js +2 -1
- package/packages/datadog-plugin-playwright/src/index.js +3 -2
- package/packages/datadog-plugin-protobufjs/src/schema_iterator.js +8 -9
- package/packages/datadog-plugin-redis/src/index.js +1 -3
- package/packages/datadog-plugin-vitest/src/index.js +5 -4
- package/packages/dd-trace/src/appsec/iast/analyzers/analyzers.js +0 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-password-rules.js +0 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secret-rules.js +0 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secrets-rules.js +0 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/missing-header-analyzer.js +1 -2
- package/packages/dd-trace/src/appsec/iast/analyzers/sql-injection-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/security-controls/index.js +12 -13
- package/packages/dd-trace/src/appsec/iast/taint-tracking/operations-taint-object.js +44 -1
- package/packages/dd-trace/src/appsec/iast/taint-tracking/operations.js +2 -1
- package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +8 -3
- package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +2 -1
- package/packages/dd-trace/src/appsec/iast/telemetry/span-tags.js +1 -1
- package/packages/dd-trace/src/appsec/iast/telemetry/verbosity.js +1 -2
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/range-utils.js +10 -11
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +0 -4
- package/packages/dd-trace/src/appsec/iast/vulnerabilities.js +0 -1
- package/packages/dd-trace/src/appsec/index.js +16 -5
- package/packages/dd-trace/src/appsec/reporter.js +11 -11
- package/packages/dd-trace/src/appsec/sdk/set_user.js +2 -2
- package/packages/dd-trace/src/appsec/sdk/track_event.js +3 -3
- package/packages/dd-trace/src/appsec/telemetry/index.js +31 -1
- package/packages/dd-trace/src/appsec/waf/waf_context_wrapper.js +6 -2
- package/packages/dd-trace/src/azure_metadata.js +8 -3
- package/packages/dd-trace/src/baggage.js +2 -2
- package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +8 -7
- package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +2 -1
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +2 -1
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +2 -1
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +2 -1
- package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +4 -3
- package/packages/dd-trace/src/ci-visibility/exporters/test-worker/index.js +7 -6
- package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +2 -1
- package/packages/dd-trace/src/ci-visibility/log-submission/log-submission-plugin.js +4 -3
- package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +4 -3
- package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +2 -1
- package/packages/dd-trace/src/config-helper.js +89 -0
- package/packages/dd-trace/src/config.js +120 -115
- package/packages/dd-trace/src/config_stable.js +7 -4
- package/packages/dd-trace/src/datastreams/fnv.js +1 -1
- package/packages/dd-trace/src/datastreams/schemas/schema_builder.js +6 -6
- package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +1 -2
- package/packages/dd-trace/src/debugger/devtools_client/condition.js +1 -2
- package/packages/dd-trace/src/debugger/devtools_client/index.js +2 -1
- package/packages/dd-trace/src/debugger/devtools_client/send.js +8 -3
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/collector.js +1 -2
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +3 -4
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/redaction.js +1 -1
- package/packages/dd-trace/src/debugger/devtools_client/status.js +5 -1
- package/packages/dd-trace/src/debugger/index.js +1 -0
- package/packages/dd-trace/src/dogstatsd.js +2 -2
- package/packages/dd-trace/src/encode/0.4.js +5 -2
- package/packages/dd-trace/src/encode/0.5.js +3 -5
- package/packages/dd-trace/src/encode/agentless-ci-visibility.js +5 -5
- package/packages/dd-trace/src/exporter.js +2 -1
- package/packages/dd-trace/src/exporters/agent/writer.js +3 -1
- package/packages/dd-trace/src/exporters/common/docker.js +3 -2
- package/packages/dd-trace/src/exporters/common/request.js +4 -1
- package/packages/dd-trace/src/exporters/common/util.js +3 -1
- package/packages/dd-trace/src/id.js +3 -3
- package/packages/dd-trace/src/index.js +4 -3
- package/packages/dd-trace/src/lambda/handler.js +2 -1
- package/packages/dd-trace/src/lambda/index.js +2 -1
- package/packages/dd-trace/src/lambda/runtime/patch.js +3 -2
- package/packages/dd-trace/src/lambda/runtime/ritm.js +3 -2
- package/packages/dd-trace/src/llmobs/constants/tags.js +1 -0
- package/packages/dd-trace/src/llmobs/index.js +21 -5
- package/packages/dd-trace/src/llmobs/noop.js +18 -20
- package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/index.js +11 -13
- package/packages/dd-trace/src/llmobs/plugins/openai.js +1 -2
- package/packages/dd-trace/src/llmobs/sdk.js +2 -1
- package/packages/dd-trace/src/llmobs/span_processor.js +1 -1
- package/packages/dd-trace/src/llmobs/tagger.js +19 -6
- package/packages/dd-trace/src/llmobs/writers/base.js +1 -1
- package/packages/dd-trace/src/log/index.js +5 -4
- package/packages/dd-trace/src/log/writer.js +1 -2
- package/packages/dd-trace/src/msgpack/encoder.js +3 -3
- package/packages/dd-trace/src/noop/span.js +1 -1
- package/packages/dd-trace/src/opentelemetry/tracer.js +1 -1
- package/packages/dd-trace/src/opentracing/propagation/log.js +4 -5
- package/packages/dd-trace/src/opentracing/propagation/text_map.js +35 -42
- package/packages/dd-trace/src/opentracing/span.js +7 -6
- package/packages/dd-trace/src/payload-tagging/config/index.js +17 -21
- package/packages/dd-trace/src/plugin_manager.js +4 -3
- package/packages/dd-trace/src/plugins/ci_plugin.js +25 -1
- package/packages/dd-trace/src/plugins/plugin.js +1 -1
- package/packages/dd-trace/src/plugins/util/ci.js +7 -7
- package/packages/dd-trace/src/plugins/util/git.js +1 -1
- package/packages/dd-trace/src/plugins/util/llm.js +2 -2
- package/packages/dd-trace/src/plugins/util/stacktrace.js +8 -1
- package/packages/dd-trace/src/plugins/util/test.js +4 -3
- package/packages/dd-trace/src/plugins/util/user-provided-git.js +2 -1
- package/packages/dd-trace/src/plugins/util/web.js +3 -4
- package/packages/dd-trace/src/priority_sampler.js +46 -35
- package/packages/dd-trace/src/profiling/config.js +12 -32
- package/packages/dd-trace/src/profiling/exporter_cli.js +20 -20
- package/packages/dd-trace/src/profiling/exporters/agent.js +1 -1
- package/packages/dd-trace/src/profiling/exporters/event_serializer.js +2 -1
- package/packages/dd-trace/src/profiling/index.js +2 -1
- package/packages/dd-trace/src/profiling/profiler.js +7 -4
- package/packages/dd-trace/src/profiling/profilers/events.js +10 -2
- package/packages/dd-trace/src/profiling/ssi-telemetry-mock-profiler.js +3 -1
- package/packages/dd-trace/src/profiling/tagger.js +22 -12
- package/packages/dd-trace/src/proxy.js +2 -1
- package/packages/dd-trace/src/ritm.js +4 -4
- package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +3 -2
- package/packages/dd-trace/src/sampler.js +10 -2
- package/packages/dd-trace/src/serverless.js +11 -4
- package/packages/dd-trace/src/span_processor.js +2 -1
- package/packages/dd-trace/src/standalone/tracesource.js +1 -2
- package/packages/dd-trace/src/standalone/tracesource_priority_sampler.js +1 -2
- package/packages/dd-trace/src/startup-log.js +5 -17
- package/packages/dd-trace/src/supported-configurations.json +440 -0
- package/packages/dd-trace/src/telemetry/dependencies.js +62 -57
- package/packages/dd-trace/src/telemetry/send-data.js +7 -6
- package/packages/dd-trace/src/telemetry/telemetry.js +16 -26
- package/packages/dd-trace/src/tracer.js +3 -7
- package/packages/dd-trace/src/util.js +0 -5
- package/packages/datadog-core/src/utils/src/get.js +0 -11
- package/packages/datadog-core/src/utils/src/has.js +0 -14
- package/packages/dd-trace/src/appsec/iast/analyzers/header-injection-analyzer.js +0 -120
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/header-sensitive-analyzer.js +0 -20
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const { channel, addHook
|
|
3
|
+
const { channel, addHook } = require('./helpers/instrument')
|
|
4
4
|
|
|
5
5
|
const shimmer = require('../../datadog-shimmer')
|
|
6
6
|
|
|
7
7
|
const commandAddCh = channel('apm:mariadb:command:add')
|
|
8
|
+
const connectionStartCh = channel('apm:mariadb:connection:start')
|
|
9
|
+
const connectionFinishCh = channel('apm:mariadb:connection:finish')
|
|
8
10
|
const startCh = channel('apm:mariadb:query:start')
|
|
9
11
|
const finishCh = channel('apm:mariadb:query:finish')
|
|
10
12
|
const errorCh = channel('apm:mariadb:query:error')
|
|
@@ -82,7 +84,7 @@ function createWrapQueryCallback (options) {
|
|
|
82
84
|
const ctx = { sql, conf: options }
|
|
83
85
|
|
|
84
86
|
if (typeof cb !== 'function') {
|
|
85
|
-
arguments.length
|
|
87
|
+
arguments.length += 1
|
|
86
88
|
}
|
|
87
89
|
|
|
88
90
|
arguments[arguments.length - 1] = shimmer.wrapFunction(cb, cb => function (err) {
|
|
@@ -135,8 +137,13 @@ function wrapPoolGetConnectionMethod (getConnection) {
|
|
|
135
137
|
const cb = arguments[arguments.length - 1]
|
|
136
138
|
if (typeof cb !== 'function') return getConnection.apply(this, arguments)
|
|
137
139
|
|
|
138
|
-
const
|
|
139
|
-
|
|
140
|
+
const ctx = {}
|
|
141
|
+
|
|
142
|
+
arguments[arguments.length - 1] = function () {
|
|
143
|
+
return connectionFinishCh.runStores(ctx, cb, this, ...arguments)
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
connectionStartCh.publish(ctx)
|
|
140
147
|
|
|
141
148
|
return getConnection.apply(this, arguments)
|
|
142
149
|
}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
3
|
const { createCoverageMap } = require('istanbul-lib-coverage')
|
|
4
|
-
const { addHook, channel
|
|
4
|
+
const { addHook, channel } = require('../helpers/instrument')
|
|
5
5
|
const shimmer = require('../../../datadog-shimmer')
|
|
6
6
|
const { isMarkedAsUnskippable } = require('../../../datadog-plugin-jest/src/util')
|
|
7
7
|
const log = require('../../../dd-trace/src/log')
|
|
8
|
+
const { getEnvironmentVariable } = require('../../../dd-trace/src/config-helper')
|
|
8
9
|
const {
|
|
9
10
|
getTestSuitePath,
|
|
10
11
|
MOCHA_WORKER_TRACE_PAYLOAD_CODE,
|
|
@@ -37,7 +38,6 @@ const {
|
|
|
37
38
|
|
|
38
39
|
require('./common')
|
|
39
40
|
|
|
40
|
-
const testSessionAsyncResource = new AsyncResource('bound-anonymous-fn')
|
|
41
41
|
const patched = new WeakSet()
|
|
42
42
|
|
|
43
43
|
const unskippableSuites = []
|
|
@@ -65,6 +65,8 @@ const testSuiteCodeCoverageCh = channel('ci:mocha:test-suite:code-coverage')
|
|
|
65
65
|
const libraryConfigurationCh = channel('ci:mocha:library-configuration')
|
|
66
66
|
const knownTestsCh = channel('ci:mocha:known-tests')
|
|
67
67
|
const skippableSuitesCh = channel('ci:mocha:test-suite:skippable')
|
|
68
|
+
const mochaGlobalRunCh = channel('ci:mocha:global:run')
|
|
69
|
+
|
|
68
70
|
const testManagementTestsCh = channel('ci:mocha:test-management-tests')
|
|
69
71
|
const impactedTestsCh = channel('ci:mocha:modified-tests')
|
|
70
72
|
const workerReportTraceCh = channel('ci:mocha:worker-report:trace')
|
|
@@ -100,18 +102,18 @@ function getFilteredSuites (originalSuites) {
|
|
|
100
102
|
}
|
|
101
103
|
|
|
102
104
|
function getOnStartHandler (isParallel, frameworkVersion) {
|
|
103
|
-
return
|
|
105
|
+
return function () {
|
|
104
106
|
const processArgv = process.argv.slice(2).join(' ')
|
|
105
107
|
const command = `mocha ${processArgv}`
|
|
106
108
|
testSessionStartCh.publish({ command, frameworkVersion })
|
|
107
109
|
if (!isParallel && skippedSuites.length) {
|
|
108
110
|
itrSkippedSuitesCh.publish({ skippedSuites, frameworkVersion })
|
|
109
111
|
}
|
|
110
|
-
}
|
|
112
|
+
}
|
|
111
113
|
}
|
|
112
114
|
|
|
113
115
|
function getOnEndHandler (isParallel) {
|
|
114
|
-
return
|
|
116
|
+
return function () {
|
|
115
117
|
let status = 'pass'
|
|
116
118
|
let error
|
|
117
119
|
if (this.stats) {
|
|
@@ -196,47 +198,12 @@ function getOnEndHandler (isParallel) {
|
|
|
196
198
|
isTestManagementEnabled: config.isTestManagementTestsEnabled,
|
|
197
199
|
isParallel
|
|
198
200
|
})
|
|
199
|
-
}
|
|
201
|
+
}
|
|
200
202
|
}
|
|
201
203
|
|
|
202
204
|
function getExecutionConfiguration (runner, isParallel, onFinishRequest) {
|
|
203
|
-
const
|
|
204
|
-
|
|
205
|
-
const onReceivedTestManagementTests = ({ err, testManagementTests: receivedTestManagementTests }) => {
|
|
206
|
-
if (err) {
|
|
207
|
-
config.testManagementTests = {}
|
|
208
|
-
config.isTestManagementTestsEnabled = false
|
|
209
|
-
config.testManagementAttemptToFixRetries = 0
|
|
210
|
-
} else {
|
|
211
|
-
config.testManagementTests = receivedTestManagementTests
|
|
212
|
-
}
|
|
213
|
-
if (config.isImpactedTestsEnabled) {
|
|
214
|
-
impactedTestsCh.publish({
|
|
215
|
-
onDone: mochaRunAsyncResource.bind(onReceivedImpactedTests)
|
|
216
|
-
})
|
|
217
|
-
} else if (config.isSuitesSkippingEnabled) {
|
|
218
|
-
skippableSuitesCh.publish({
|
|
219
|
-
onDone: mochaRunAsyncResource.bind(onReceivedSkippableSuites)
|
|
220
|
-
})
|
|
221
|
-
} else {
|
|
222
|
-
onFinishRequest()
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
const onReceivedImpactedTests = ({ err, modifiedTests: receivedModifiedTests }) => {
|
|
227
|
-
if (err) {
|
|
228
|
-
config.modifiedTests = []
|
|
229
|
-
config.isImpactedTestsEnabled = false
|
|
230
|
-
} else {
|
|
231
|
-
config.modifiedTests = receivedModifiedTests
|
|
232
|
-
}
|
|
233
|
-
if (config.isSuitesSkippingEnabled) {
|
|
234
|
-
skippableSuitesCh.publish({
|
|
235
|
-
onDone: mochaRunAsyncResource.bind(onReceivedSkippableSuites)
|
|
236
|
-
})
|
|
237
|
-
} else {
|
|
238
|
-
onFinishRequest()
|
|
239
|
-
}
|
|
205
|
+
const ctx = {
|
|
206
|
+
isParallel
|
|
240
207
|
}
|
|
241
208
|
|
|
242
209
|
const onReceivedSkippableSuites = ({ err, skippableSuites, itrCorrelationId: responseItrCorrelationId }) => {
|
|
@@ -260,7 +227,47 @@ function getExecutionConfiguration (runner, isParallel, onFinishRequest) {
|
|
|
260
227
|
|
|
261
228
|
skippedSuites = [...filteredSuites.skippedSuites]
|
|
262
229
|
|
|
263
|
-
|
|
230
|
+
mochaGlobalRunCh.runStores(ctx, () => {
|
|
231
|
+
onFinishRequest()
|
|
232
|
+
})
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
const onReceivedImpactedTests = ({ err, modifiedTests: receivedModifiedTests }) => {
|
|
236
|
+
if (err) {
|
|
237
|
+
config.modifiedTests = []
|
|
238
|
+
config.isImpactedTestsEnabled = false
|
|
239
|
+
} else {
|
|
240
|
+
config.modifiedTests = receivedModifiedTests
|
|
241
|
+
}
|
|
242
|
+
if (config.isSuitesSkippingEnabled) {
|
|
243
|
+
ctx.onDone = onReceivedSkippableSuites
|
|
244
|
+
skippableSuitesCh.runStores(ctx, () => {})
|
|
245
|
+
} else {
|
|
246
|
+
mochaGlobalRunCh.runStores(ctx, () => {
|
|
247
|
+
onFinishRequest()
|
|
248
|
+
})
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
const onReceivedTestManagementTests = ({ err, testManagementTests: receivedTestManagementTests }) => {
|
|
253
|
+
if (err) {
|
|
254
|
+
config.testManagementTests = {}
|
|
255
|
+
config.isTestManagementTestsEnabled = false
|
|
256
|
+
config.testManagementAttemptToFixRetries = 0
|
|
257
|
+
} else {
|
|
258
|
+
config.testManagementTests = receivedTestManagementTests
|
|
259
|
+
}
|
|
260
|
+
if (config.isImpactedTestsEnabled) {
|
|
261
|
+
ctx.onDone = onReceivedImpactedTests
|
|
262
|
+
impactedTestsCh.runStores(ctx, () => {})
|
|
263
|
+
} else if (config.isSuitesSkippingEnabled) {
|
|
264
|
+
ctx.onDone = onReceivedSkippableSuites
|
|
265
|
+
skippableSuitesCh.runStores(ctx, () => {})
|
|
266
|
+
} else {
|
|
267
|
+
mochaGlobalRunCh.runStores(ctx, () => {
|
|
268
|
+
onFinishRequest()
|
|
269
|
+
})
|
|
270
|
+
}
|
|
264
271
|
}
|
|
265
272
|
|
|
266
273
|
const onReceivedKnownTests = ({ err, knownTests }) => {
|
|
@@ -272,27 +279,27 @@ function getExecutionConfiguration (runner, isParallel, onFinishRequest) {
|
|
|
272
279
|
config.knownTests = knownTests
|
|
273
280
|
}
|
|
274
281
|
if (config.isTestManagementTestsEnabled) {
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
})
|
|
282
|
+
ctx.onDone = onReceivedTestManagementTests
|
|
283
|
+
testManagementTestsCh.runStores(ctx, () => {})
|
|
278
284
|
} if (config.isImpactedTestsEnabled) {
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
})
|
|
285
|
+
ctx.onDone = onReceivedImpactedTests
|
|
286
|
+
impactedTestsCh.runStores(ctx, () => {})
|
|
282
287
|
} else if (config.isSuitesSkippingEnabled) {
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
})
|
|
288
|
+
ctx.onDone = onReceivedSkippableSuites
|
|
289
|
+
skippableSuitesCh.runStores(ctx, () => {})
|
|
286
290
|
} else {
|
|
287
|
-
|
|
291
|
+
mochaGlobalRunCh.runStores(ctx, () => {
|
|
292
|
+
onFinishRequest()
|
|
293
|
+
})
|
|
288
294
|
}
|
|
289
295
|
}
|
|
290
296
|
|
|
291
297
|
const onReceivedConfiguration = ({ err, libraryConfig }) => {
|
|
292
298
|
if (err || !skippableSuitesCh.hasSubscribers || !knownTestsCh.hasSubscribers) {
|
|
293
|
-
return
|
|
299
|
+
return mochaGlobalRunCh.runStores(ctx, () => {
|
|
300
|
+
onFinishRequest()
|
|
301
|
+
})
|
|
294
302
|
}
|
|
295
|
-
|
|
296
303
|
config.isEarlyFlakeDetectionEnabled = libraryConfig.isEarlyFlakeDetectionEnabled
|
|
297
304
|
config.earlyFlakeDetectionNumRetries = libraryConfig.earlyFlakeDetectionNumRetries
|
|
298
305
|
config.earlyFlakeDetectionFaultyThreshold = libraryConfig.earlyFlakeDetectionFaultyThreshold
|
|
@@ -306,30 +313,27 @@ function getExecutionConfiguration (runner, isParallel, onFinishRequest) {
|
|
|
306
313
|
config.flakyTestRetriesCount = !isParallel && libraryConfig.flakyTestRetriesCount
|
|
307
314
|
|
|
308
315
|
if (config.isKnownTestsEnabled) {
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
})
|
|
316
|
+
ctx.onDone = onReceivedKnownTests
|
|
317
|
+
knownTestsCh.runStores(ctx, () => {})
|
|
312
318
|
} else if (config.isTestManagementTestsEnabled) {
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
})
|
|
319
|
+
ctx.onDone = onReceivedTestManagementTests
|
|
320
|
+
testManagementTestsCh.runStores(ctx, () => {})
|
|
316
321
|
} else if (config.isImpactedTestsEnabled) {
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
})
|
|
322
|
+
ctx.onDone = onReceivedImpactedTests
|
|
323
|
+
impactedTestsCh.runStores(ctx, () => {})
|
|
320
324
|
} else if (config.isSuitesSkippingEnabled) {
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
})
|
|
325
|
+
ctx.onDone = onReceivedSkippableSuites
|
|
326
|
+
skippableSuitesCh.runStores(ctx, () => {})
|
|
324
327
|
} else {
|
|
325
|
-
|
|
328
|
+
mochaGlobalRunCh.runStores(ctx, () => {
|
|
329
|
+
onFinishRequest()
|
|
330
|
+
})
|
|
326
331
|
}
|
|
327
332
|
}
|
|
328
333
|
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
})
|
|
334
|
+
ctx.onDone = onReceivedConfiguration
|
|
335
|
+
|
|
336
|
+
libraryConfigurationCh.runStores(ctx, () => {})
|
|
333
337
|
}
|
|
334
338
|
|
|
335
339
|
// In this hook we delay the execution with options.delay to grab library configuration,
|
|
@@ -342,7 +346,7 @@ addHook({
|
|
|
342
346
|
}, (Mocha) => {
|
|
343
347
|
shimmer.wrap(Mocha.prototype, 'run', run => function () {
|
|
344
348
|
// Workers do not need to request any data, just run the tests
|
|
345
|
-
if (!testFinishCh.hasSubscribers ||
|
|
349
|
+
if (!testFinishCh.hasSubscribers || getEnvironmentVariable('MOCHA_WORKER_ID') || this.options.parallel) {
|
|
346
350
|
return run.apply(this, arguments)
|
|
347
351
|
}
|
|
348
352
|
|
|
@@ -517,7 +521,7 @@ addHook({
|
|
|
517
521
|
if (ctx) {
|
|
518
522
|
testSuiteFinishCh.publish({ status, ...ctx.currentStore }, () => {})
|
|
519
523
|
} else {
|
|
520
|
-
log.warn(() => `No
|
|
524
|
+
log.warn(() => `No ctx found for suite ${suite.file}`)
|
|
521
525
|
}
|
|
522
526
|
})
|
|
523
527
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const { channel, addHook
|
|
3
|
+
const { channel, addHook } = require('./helpers/instrument')
|
|
4
4
|
const shimmer = require('../../datadog-shimmer')
|
|
5
5
|
|
|
6
6
|
addHook({ name: 'mysql', file: 'lib/Connection.js', versions: ['>=2'] }, Connection => {
|
|
@@ -57,11 +57,20 @@ addHook({ name: 'mysql', file: 'lib/Connection.js', versions: ['>=2'] }, Connect
|
|
|
57
57
|
})
|
|
58
58
|
|
|
59
59
|
addHook({ name: 'mysql', file: 'lib/Pool.js', versions: ['>=2'] }, Pool => {
|
|
60
|
+
const connectionStartCh = channel('apm:mysql:connection:start')
|
|
61
|
+
const connectionFinishCh = channel('apm:mysql:connection:finish')
|
|
60
62
|
const startPoolQueryCh = channel('datadog:mysql:pool:query:start')
|
|
61
63
|
const finishPoolQueryCh = channel('datadog:mysql:pool:query:finish')
|
|
62
64
|
|
|
63
65
|
shimmer.wrap(Pool.prototype, 'getConnection', getConnection => function (cb) {
|
|
64
|
-
arguments[0] =
|
|
66
|
+
arguments[0] = function () {
|
|
67
|
+
return connectionFinishCh.runStores(ctx, cb, this, ...arguments)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const ctx = {}
|
|
71
|
+
|
|
72
|
+
connectionStartCh.publish(ctx)
|
|
73
|
+
|
|
65
74
|
return getConnection.apply(this, arguments)
|
|
66
75
|
})
|
|
67
76
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const { addHook, channel } = require('./helpers/instrument')
|
|
2
2
|
const shimmer = require('../../datadog-shimmer')
|
|
3
|
+
const { getEnvironmentVariable } = require('../../dd-trace/src/config-helper')
|
|
3
4
|
|
|
4
5
|
const codeCoverageWrapCh = channel('ci:nyc:wrap')
|
|
5
6
|
|
|
@@ -11,7 +12,7 @@ addHook({
|
|
|
11
12
|
shimmer.wrap(nycPackage.prototype, 'wrap', wrap => function () {
|
|
12
13
|
// Only relevant if the config `all` is set to true
|
|
13
14
|
try {
|
|
14
|
-
if (JSON.parse(
|
|
15
|
+
if (JSON.parse(getEnvironmentVariable('NYC_CONFIG')).all) {
|
|
15
16
|
codeCoverageWrapCh.publish(this)
|
|
16
17
|
}
|
|
17
18
|
} catch {
|
|
@@ -187,12 +187,12 @@ function addStreamedChunk (content, chunk) {
|
|
|
187
187
|
}
|
|
188
188
|
}
|
|
189
189
|
|
|
190
|
-
function convertBufferstoObjects (chunks
|
|
190
|
+
function convertBufferstoObjects (chunks) {
|
|
191
191
|
return Buffer
|
|
192
192
|
.concat(chunks) // combine the buffers
|
|
193
193
|
.toString() // stringify
|
|
194
194
|
.split(/(?=data:)/) // split on "data:"
|
|
195
|
-
.map(chunk => chunk.
|
|
195
|
+
.map(chunk => chunk.replaceAll('\n', '').slice(6)) // remove newlines and 'data: ' from the front
|
|
196
196
|
.slice(0, -1) // remove the last [DONE] message
|
|
197
197
|
.map(JSON.parse) // parse all of the returned objects
|
|
198
198
|
}
|
|
@@ -3,10 +3,11 @@
|
|
|
3
3
|
const { addHook } = require('./helpers/instrument')
|
|
4
4
|
const shimmer = require('../../datadog-shimmer')
|
|
5
5
|
const tracer = require('../../dd-trace')
|
|
6
|
+
const { getEnvironmentVariable } = require('../../dd-trace/src/config-helper')
|
|
6
7
|
|
|
7
|
-
const otelSdkEnabled =
|
|
8
|
-
|
|
9
|
-
? !
|
|
8
|
+
const otelSdkEnabled = getEnvironmentVariable('DD_TRACE_OTEL_ENABLED') ||
|
|
9
|
+
getEnvironmentVariable('OTEL_SDK_DISABLED')
|
|
10
|
+
? !getEnvironmentVariable('OTEL_SDK_DISABLED')
|
|
10
11
|
: undefined
|
|
11
12
|
|
|
12
13
|
if (otelSdkEnabled) {
|
|
@@ -178,9 +178,8 @@ function wrapPoolQuery (query) {
|
|
|
178
178
|
cb(error)
|
|
179
179
|
|
|
180
180
|
return
|
|
181
|
-
} else {
|
|
182
|
-
return Promise.reject(error)
|
|
183
181
|
}
|
|
182
|
+
return Promise.reject(error)
|
|
184
183
|
}
|
|
185
184
|
|
|
186
185
|
if (typeof cb === 'function') {
|
|
@@ -192,7 +191,7 @@ function wrapPoolQuery (query) {
|
|
|
192
191
|
|
|
193
192
|
const retval = query.apply(this, arguments)
|
|
194
193
|
|
|
195
|
-
if (retval
|
|
194
|
+
if (retval?.then) {
|
|
196
195
|
retval.then(() => {
|
|
197
196
|
finish()
|
|
198
197
|
}).catch(() => {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const satisfies = require('semifies')
|
|
2
2
|
|
|
3
|
-
const { addHook, channel
|
|
3
|
+
const { addHook, channel } = require('./helpers/instrument')
|
|
4
4
|
const shimmer = require('../../datadog-shimmer')
|
|
5
5
|
const {
|
|
6
6
|
parseAnnotations,
|
|
@@ -33,7 +33,6 @@ const testSuiteToCtx = new Map()
|
|
|
33
33
|
const testSuiteToTestStatuses = new Map()
|
|
34
34
|
const testSuiteToErrors = new Map()
|
|
35
35
|
const testsToTestStatuses = new Map()
|
|
36
|
-
const testSessionAsyncResource = new AsyncResource('bound-anonymous-fn')
|
|
37
36
|
|
|
38
37
|
let applyRepeatEachIndex = null
|
|
39
38
|
|
|
@@ -109,7 +108,12 @@ function deepCloneSuite (suite, filterTest, tags = []) {
|
|
|
109
108
|
|
|
110
109
|
function getTestsBySuiteFromTestGroups (testGroups) {
|
|
111
110
|
return testGroups.reduce((acc, { requireFile, tests }) => {
|
|
112
|
-
|
|
111
|
+
if (acc[requireFile]) {
|
|
112
|
+
acc[requireFile].push(...tests)
|
|
113
|
+
} else {
|
|
114
|
+
// Copy the tests, otherwise we modify the original tests
|
|
115
|
+
acc[requireFile] = [...tests]
|
|
116
|
+
}
|
|
113
117
|
return acc
|
|
114
118
|
}, {})
|
|
115
119
|
}
|
|
@@ -238,9 +242,7 @@ function getTestByTestId (dispatcher, testId) {
|
|
|
238
242
|
|
|
239
243
|
function getChannelPromise (channelToPublishTo, params) {
|
|
240
244
|
return new Promise(resolve => {
|
|
241
|
-
|
|
242
|
-
channelToPublishTo.publish({ onDone: resolve, ...params })
|
|
243
|
-
})
|
|
245
|
+
channelToPublishTo.publish({ onDone: resolve, ...params })
|
|
244
246
|
})
|
|
245
247
|
}
|
|
246
248
|
|
|
@@ -417,7 +419,7 @@ function dispatcherRunWrapperNew (run) {
|
|
|
417
419
|
// Not available from >=1.44.0
|
|
418
420
|
this._ddAllTests = testGroups.flatMap(g => g.tests)
|
|
419
421
|
}
|
|
420
|
-
remainingTestsByFile = getTestsBySuiteFromTestGroups(
|
|
422
|
+
remainingTestsByFile = getTestsBySuiteFromTestGroups(testGroups)
|
|
421
423
|
return run.apply(this, arguments)
|
|
422
424
|
}
|
|
423
425
|
}
|
|
@@ -511,9 +513,7 @@ function runnerHook (runnerExport, playwrightVersion) {
|
|
|
511
513
|
|
|
512
514
|
const processArgv = process.argv.slice(2).join(' ')
|
|
513
515
|
const command = `playwright ${processArgv}`
|
|
514
|
-
|
|
515
|
-
testSessionStartCh.publish({ command, frameworkVersion: playwrightVersion, rootDir })
|
|
516
|
-
})
|
|
516
|
+
testSessionStartCh.publish({ command, frameworkVersion: playwrightVersion, rootDir })
|
|
517
517
|
|
|
518
518
|
try {
|
|
519
519
|
const { err, libraryConfig } = await getChannelPromise(libraryConfigurationCh)
|
|
@@ -630,13 +630,11 @@ function runnerHook (runnerExport, playwrightVersion) {
|
|
|
630
630
|
const flushWait = new Promise(resolve => {
|
|
631
631
|
onDone = resolve
|
|
632
632
|
})
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
onDone
|
|
639
|
-
})
|
|
633
|
+
testSessionFinishCh.publish({
|
|
634
|
+
status: STATUS_TO_TEST_STATUS[sessionStatus],
|
|
635
|
+
isEarlyFlakeDetectionEnabled,
|
|
636
|
+
isTestManagementTestsEnabled,
|
|
637
|
+
onDone
|
|
640
638
|
})
|
|
641
639
|
await flushWait
|
|
642
640
|
|
|
@@ -754,8 +752,7 @@ addHook({
|
|
|
754
752
|
}
|
|
755
753
|
|
|
756
754
|
if (isImpactedTestsEnabled) {
|
|
757
|
-
|
|
758
|
-
const isNew = isKnownTestsEnabled && isNewTest(test)
|
|
755
|
+
await Promise.all(allTests.map(async (test) => {
|
|
759
756
|
const { isModified } = await getChannelPromise(isModifiedCh, {
|
|
760
757
|
filePath: test._requireFile,
|
|
761
758
|
modifiedTests
|
|
@@ -764,6 +761,7 @@ addHook({
|
|
|
764
761
|
test._ddIsModified = true
|
|
765
762
|
}
|
|
766
763
|
if (isEarlyFlakeDetectionEnabled && test.expectedStatus !== 'skipped') {
|
|
764
|
+
const isNew = isKnownTestsEnabled && isNewTest(test)
|
|
767
765
|
const fileSuite = getSuiteType(test, 'file')
|
|
768
766
|
const projectSuite = getSuiteType(test, 'project')
|
|
769
767
|
// If something change in the file, all tests in the file are impacted
|
|
@@ -778,7 +776,7 @@ addHook({
|
|
|
778
776
|
projectSuite._addSuite(copyFileSuite)
|
|
779
777
|
}
|
|
780
778
|
}
|
|
781
|
-
}
|
|
779
|
+
}))
|
|
782
780
|
}
|
|
783
781
|
|
|
784
782
|
if (isKnownTestsEnabled) {
|
|
@@ -939,9 +937,8 @@ addHook({
|
|
|
939
937
|
if (window.DD_RUM && window.DD_RUM.stopSession) {
|
|
940
938
|
window.DD_RUM.stopSession()
|
|
941
939
|
return true
|
|
942
|
-
} else {
|
|
943
|
-
return false
|
|
944
940
|
}
|
|
941
|
+
return false
|
|
945
942
|
})
|
|
946
943
|
|
|
947
944
|
if (isRumActive) {
|
|
@@ -102,11 +102,10 @@ addHook({
|
|
|
102
102
|
wrapProtobufClasses(root)
|
|
103
103
|
return root
|
|
104
104
|
})
|
|
105
|
-
} else {
|
|
106
|
-
// If result is not a promise, directly wrap the protobuf classes
|
|
107
|
-
wrapProtobufClasses(result)
|
|
108
|
-
return result
|
|
109
105
|
}
|
|
106
|
+
// If result is not a promise, directly wrap the protobuf classes
|
|
107
|
+
wrapProtobufClasses(result)
|
|
108
|
+
return result
|
|
110
109
|
})
|
|
111
110
|
|
|
112
111
|
shimmer.wrap(protobuf.Root.prototype, 'loadSync', original => function () {
|
|
@@ -45,7 +45,7 @@ function wrapCommandQueueClass (cls) {
|
|
|
45
45
|
try {
|
|
46
46
|
const parsed = new URL(createClientUrl)
|
|
47
47
|
if (parsed) {
|
|
48
|
-
this._url = { host: parsed.hostname, port:
|
|
48
|
+
this._url = { host: parsed.hostname, port: Number(parsed.port) || 6379 }
|
|
49
49
|
}
|
|
50
50
|
} catch {
|
|
51
51
|
// ignore
|
|
@@ -20,25 +20,21 @@ function wrapSetupRequest (setupRequest) {
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
function wrapMethod (method) {
|
|
23
|
-
return function (path, ...
|
|
24
|
-
const
|
|
23
|
+
return function (path, ...middlewares) {
|
|
24
|
+
const wrappedMiddlewares = middlewares.map(wrapFn)
|
|
25
25
|
|
|
26
|
-
return method.apply(this, [path]
|
|
26
|
+
return method.apply(this, [path, ...wrappedMiddlewares])
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
function wrapHandler (method) {
|
|
31
|
-
return function () {
|
|
32
|
-
return method.apply(this,
|
|
31
|
+
return function (...middlewares) {
|
|
32
|
+
return method.apply(this, middlewares.map(wrapFn))
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
function wrapMiddleware (middleware) {
|
|
37
|
-
return Array.prototype.map.call(middleware, wrapFn)
|
|
38
|
-
}
|
|
39
|
-
|
|
40
36
|
function wrapFn (fn) {
|
|
41
|
-
if (Array.isArray(fn)) return
|
|
37
|
+
if (Array.isArray(fn)) return fn.map(wrapFn)
|
|
42
38
|
|
|
43
39
|
return shimmer.wrapFunction(fn, fn => function (req, res, next) {
|
|
44
40
|
if (typeof next === 'function') {
|
|
@@ -51,11 +47,11 @@ function wrapFn (fn) {
|
|
|
51
47
|
|
|
52
48
|
try {
|
|
53
49
|
const result = fn.apply(this, arguments)
|
|
54
|
-
if (
|
|
55
|
-
return result.then(function () {
|
|
50
|
+
if (typeof result?.then === 'function') {
|
|
51
|
+
return result.then(function (result) {
|
|
56
52
|
nextChannel.publish({ req })
|
|
57
53
|
finishChannel.publish({ req })
|
|
58
|
-
return
|
|
54
|
+
return result
|
|
59
55
|
}).catch(function (error) {
|
|
60
56
|
errorChannel.publish({ req, error })
|
|
61
57
|
nextChannel.publish({ req })
|
|
@@ -13,10 +13,6 @@ function isFastSlash (layer, matchers) {
|
|
|
13
13
|
return layer.regexp?.fast_slash ?? matchers.some(matcher => matcher.path === '/')
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
function flatten (arr) {
|
|
17
|
-
return arr.reduce((acc, val) => Array.isArray(val) ? acc.concat(flatten(val)) : acc.concat(val), [])
|
|
18
|
-
}
|
|
19
|
-
|
|
20
16
|
// TODO: Move this function to a shared file between Express and Router
|
|
21
17
|
function createWrapRouterMethod (name) {
|
|
22
18
|
const enterChannel = channel(`apm:${name}:middleware:enter`)
|
|
@@ -74,8 +70,8 @@ function createWrapRouterMethod (name) {
|
|
|
74
70
|
})
|
|
75
71
|
}
|
|
76
72
|
|
|
77
|
-
function wrapStack (
|
|
78
|
-
|
|
73
|
+
function wrapStack (layers, matchers) {
|
|
74
|
+
for (const layer of layers) {
|
|
79
75
|
if (layer.__handle) { // express-async-errors
|
|
80
76
|
layer.__handle = wrapLayerHandle(layer, layer.__handle)
|
|
81
77
|
} else {
|
|
@@ -93,7 +89,7 @@ function createWrapRouterMethod (name) {
|
|
|
93
89
|
layer.route[method] = wrapMethod(layer.route[method])
|
|
94
90
|
})
|
|
95
91
|
}
|
|
96
|
-
}
|
|
92
|
+
}
|
|
97
93
|
}
|
|
98
94
|
|
|
99
95
|
function wrapNext (req, next) {
|
|
@@ -110,7 +106,7 @@ function createWrapRouterMethod (name) {
|
|
|
110
106
|
}
|
|
111
107
|
|
|
112
108
|
function extractMatchers (fn) {
|
|
113
|
-
const arg =
|
|
109
|
+
const arg = Array.isArray(fn) ? fn : [fn]
|
|
114
110
|
|
|
115
111
|
if (typeof arg[0] === 'function') {
|
|
116
112
|
return []
|
|
@@ -139,7 +135,10 @@ function createWrapRouterMethod (name) {
|
|
|
139
135
|
|
|
140
136
|
function wrapMethod (original) {
|
|
141
137
|
return shimmer.wrapFunction(original, original => function methodWithTrace (fn) {
|
|
142
|
-
|
|
138
|
+
let offset = 0
|
|
139
|
+
if (this.stack) {
|
|
140
|
+
offset = Array.isArray(this.stack) ? this.stack.length : 1
|
|
141
|
+
}
|
|
143
142
|
const router = original.apply(this, arguments)
|
|
144
143
|
|
|
145
144
|
if (typeof this.stack === 'function') {
|
|
@@ -150,7 +149,9 @@ function createWrapRouterMethod (name) {
|
|
|
150
149
|
routeAddedChannel.publish({ topOfStackFunc: methodWithTrace, layer: this.stack[0] })
|
|
151
150
|
}
|
|
152
151
|
|
|
153
|
-
|
|
152
|
+
if (this.stack.length > offset) {
|
|
153
|
+
wrapStack(this.stack.slice(offset), extractMatchers(fn))
|
|
154
|
+
}
|
|
154
155
|
|
|
155
156
|
return router
|
|
156
157
|
})
|
|
@@ -204,7 +205,7 @@ const visitedParams = new WeakSet()
|
|
|
204
205
|
|
|
205
206
|
function wrapHandleRequest (original) {
|
|
206
207
|
return function wrappedHandleRequest (req, res, next) {
|
|
207
|
-
if (routerParamStartCh.hasSubscribers &&
|
|
208
|
+
if (routerParamStartCh.hasSubscribers && !visitedParams.has(req.params) && Object.keys(req.params).length) {
|
|
208
209
|
visitedParams.add(req.params)
|
|
209
210
|
|
|
210
211
|
const abortController = new AbortController()
|