dd-trace 5.53.0 → 5.54.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.
Files changed (319) hide show
  1. package/LICENSE-3rdparty.csv +2 -1
  2. package/index.d.ts +33 -16
  3. package/initialize.mjs +3 -4
  4. package/package.json +36 -34
  5. package/packages/datadog-core/src/utils/src/get.js +1 -1
  6. package/packages/datadog-core/src/utils/src/has.js +1 -1
  7. package/packages/datadog-core/src/utils/src/kebabcase.js +4 -6
  8. package/packages/datadog-core/src/utils/src/parse-tags.js +1 -1
  9. package/packages/datadog-core/src/utils/src/pick.js +2 -2
  10. package/packages/datadog-core/src/utils/src/set.js +1 -1
  11. package/packages/datadog-core/src/utils/src/uniq.js +1 -1
  12. package/packages/datadog-instrumentations/src/amqp10.js +19 -17
  13. package/packages/datadog-instrumentations/src/amqplib.js +52 -35
  14. package/packages/datadog-instrumentations/src/apollo.js +2 -2
  15. package/packages/datadog-instrumentations/src/aws-sdk.js +1 -1
  16. package/packages/datadog-instrumentations/src/cassandra-driver.js +5 -4
  17. package/packages/datadog-instrumentations/src/child_process.js +1 -2
  18. package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +88 -73
  19. package/packages/datadog-instrumentations/src/couchbase.js +3 -3
  20. package/packages/datadog-instrumentations/src/cucumber.js +87 -40
  21. package/packages/datadog-instrumentations/src/cypress.js +2 -1
  22. package/packages/datadog-instrumentations/src/dns.js +1 -1
  23. package/packages/datadog-instrumentations/src/fs.js +1 -1
  24. package/packages/datadog-instrumentations/src/google-cloud-pubsub.js +28 -34
  25. package/packages/datadog-instrumentations/src/graphql.js +7 -10
  26. package/packages/datadog-instrumentations/src/grpc/client.js +11 -23
  27. package/packages/datadog-instrumentations/src/grpc/server.js +7 -20
  28. package/packages/datadog-instrumentations/src/helpers/extract-package-and-module-path.js +16 -10
  29. package/packages/datadog-instrumentations/src/helpers/hook.js +1 -1
  30. package/packages/datadog-instrumentations/src/helpers/hooks.js +0 -1
  31. package/packages/datadog-instrumentations/src/helpers/instrument.js +1 -41
  32. package/packages/datadog-instrumentations/src/helpers/register.js +5 -7
  33. package/packages/datadog-instrumentations/src/http/client.js +14 -20
  34. package/packages/datadog-instrumentations/src/jest.js +137 -48
  35. package/packages/datadog-instrumentations/src/kafkajs.js +52 -44
  36. package/packages/datadog-instrumentations/src/knex.js +4 -4
  37. package/packages/datadog-instrumentations/src/ldapjs.js +3 -4
  38. package/packages/datadog-instrumentations/src/mariadb.js +38 -61
  39. package/packages/datadog-instrumentations/src/mocha/main.js +63 -24
  40. package/packages/datadog-instrumentations/src/mocha/utils.js +36 -12
  41. package/packages/datadog-instrumentations/src/mocha/worker.js +6 -0
  42. package/packages/datadog-instrumentations/src/mongodb-core.js +1 -1
  43. package/packages/datadog-instrumentations/src/mysql.js +20 -36
  44. package/packages/datadog-instrumentations/src/mysql2.js +53 -47
  45. package/packages/datadog-instrumentations/src/net.js +1 -1
  46. package/packages/datadog-instrumentations/src/next.js +1 -0
  47. package/packages/datadog-instrumentations/src/nyc.js +1 -1
  48. package/packages/datadog-instrumentations/src/openai.js +21 -23
  49. package/packages/datadog-instrumentations/src/oracledb.js +1 -1
  50. package/packages/datadog-instrumentations/src/pg.js +1 -2
  51. package/packages/datadog-instrumentations/src/playwright.js +112 -69
  52. package/packages/datadog-instrumentations/src/redis.js +3 -3
  53. package/packages/datadog-instrumentations/src/restify.js +2 -2
  54. package/packages/datadog-instrumentations/src/rhea.js +42 -54
  55. package/packages/datadog-instrumentations/src/router.js +22 -25
  56. package/packages/datadog-instrumentations/src/tedious.js +1 -1
  57. package/packages/datadog-instrumentations/src/vitest.js +77 -28
  58. package/packages/datadog-plugin-amqp10/src/consumer.js +7 -3
  59. package/packages/datadog-plugin-amqp10/src/producer.js +7 -3
  60. package/packages/datadog-plugin-amqplib/src/client.js +6 -2
  61. package/packages/datadog-plugin-amqplib/src/consumer.js +7 -3
  62. package/packages/datadog-plugin-amqplib/src/producer.js +7 -3
  63. package/packages/datadog-plugin-amqplib/src/util.js +1 -1
  64. package/packages/datadog-plugin-apollo/src/gateway/request.js +5 -6
  65. package/packages/datadog-plugin-apollo/src/gateway/validate.js +2 -3
  66. package/packages/datadog-plugin-aws-sdk/src/base.js +3 -2
  67. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/tracing.js +2 -2
  68. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/utils.js +13 -13
  69. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +24 -31
  70. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +2 -2
  71. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +6 -6
  72. package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +1 -1
  73. package/packages/datadog-plugin-aws-sdk/src/services/sns.js +1 -1
  74. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +4 -5
  75. package/packages/datadog-plugin-aws-sdk/src/services/stepfunctions.js +1 -1
  76. package/packages/datadog-plugin-aws-sdk/src/util.js +5 -6
  77. package/packages/datadog-plugin-cassandra-driver/src/index.js +1 -1
  78. package/packages/datadog-plugin-child_process/src/index.js +4 -4
  79. package/packages/datadog-plugin-child_process/src/scrub-cmd-params.js +23 -23
  80. package/packages/datadog-plugin-cucumber/src/index.js +57 -2
  81. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +97 -27
  82. package/packages/datadog-plugin-cypress/src/plugin.js +11 -1
  83. package/packages/datadog-plugin-cypress/src/support.js +24 -5
  84. package/packages/datadog-plugin-express/src/code_origin.js +30 -0
  85. package/packages/datadog-plugin-express/src/index.js +10 -12
  86. package/packages/datadog-plugin-express/src/tracing.js +19 -0
  87. package/packages/datadog-plugin-google-cloud-pubsub/src/client.js +7 -3
  88. package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +12 -7
  89. package/packages/datadog-plugin-google-cloud-pubsub/src/producer.js +6 -2
  90. package/packages/datadog-plugin-google-cloud-vertexai/src/tracing.js +26 -9
  91. package/packages/datadog-plugin-graphql/src/execute.js +2 -2
  92. package/packages/datadog-plugin-graphql/src/index.js +7 -6
  93. package/packages/datadog-plugin-graphql/src/resolve.js +2 -2
  94. package/packages/datadog-plugin-graphql/src/tools/index.js +1 -0
  95. package/packages/datadog-plugin-graphql/src/tools/signature.js +1 -0
  96. package/packages/datadog-plugin-graphql/src/tools/transforms.js +1 -0
  97. package/packages/datadog-plugin-grpc/src/client.js +2 -2
  98. package/packages/datadog-plugin-grpc/src/util.js +2 -2
  99. package/packages/datadog-plugin-http/src/client.js +18 -7
  100. package/packages/datadog-plugin-http2/src/client.js +20 -20
  101. package/packages/datadog-plugin-jest/src/index.js +23 -21
  102. package/packages/datadog-plugin-jest/src/util.js +8 -8
  103. package/packages/datadog-plugin-kafkajs/src/batch-consumer.js +3 -1
  104. package/packages/datadog-plugin-kafkajs/src/consumer.js +9 -5
  105. package/packages/datadog-plugin-kafkajs/src/producer.js +8 -3
  106. package/packages/datadog-plugin-kafkajs/src/utils.js +1 -1
  107. package/packages/datadog-plugin-langchain/src/handlers/chain.js +7 -7
  108. package/packages/datadog-plugin-langchain/src/handlers/embedding.js +2 -2
  109. package/packages/datadog-plugin-langchain/src/handlers/language_models/chat_model.js +6 -4
  110. package/packages/datadog-plugin-langchain/src/handlers/language_models/llm.js +5 -4
  111. package/packages/datadog-plugin-langchain/src/tracing.js +11 -10
  112. package/packages/datadog-plugin-mariadb/src/index.js +3 -9
  113. package/packages/datadog-plugin-mocha/src/index.js +33 -13
  114. package/packages/datadog-plugin-mongodb-core/src/index.js +1 -1
  115. package/packages/datadog-plugin-mysql/src/index.js +11 -9
  116. package/packages/datadog-plugin-mysql2/src/index.js +16 -0
  117. package/packages/datadog-plugin-net/src/tcp.js +1 -1
  118. package/packages/datadog-plugin-next/src/index.js +6 -5
  119. package/packages/datadog-plugin-openai/src/services.js +6 -10
  120. package/packages/datadog-plugin-openai/src/tracing.js +10 -14
  121. package/packages/datadog-plugin-oracledb/src/index.js +1 -1
  122. package/packages/datadog-plugin-playwright/src/index.js +22 -2
  123. package/packages/datadog-plugin-redis/src/index.js +1 -1
  124. package/packages/datadog-plugin-rhea/src/consumer.js +8 -6
  125. package/packages/datadog-plugin-rhea/src/producer.js +5 -2
  126. package/packages/datadog-plugin-router/src/index.js +1 -1
  127. package/packages/datadog-plugin-selenium/src/index.js +1 -6
  128. package/packages/datadog-plugin-vitest/src/index.js +47 -31
  129. package/packages/datadog-shimmer/src/shimmer.js +4 -8
  130. package/packages/dd-trace/src/appsec/api_security_sampler.js +2 -2
  131. package/packages/dd-trace/src/appsec/blocked_templates.js +1 -1
  132. package/packages/dd-trace/src/appsec/blocking.js +6 -20
  133. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-password-rules.js +1 -1
  134. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secret-rules.js +1 -1
  135. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secrets-rules.js +1 -1
  136. package/packages/dd-trace/src/appsec/iast/analyzers/header-injection-analyzer.js +4 -6
  137. package/packages/dd-trace/src/appsec/iast/analyzers/hsts-header-missing-analyzer.js +7 -12
  138. package/packages/dd-trace/src/appsec/iast/analyzers/missing-header-analyzer.js +4 -6
  139. package/packages/dd-trace/src/appsec/iast/analyzers/nosql-injection-mongodb-analyzer.js +4 -0
  140. package/packages/dd-trace/src/appsec/iast/analyzers/path-traversal-analyzer.js +9 -12
  141. package/packages/dd-trace/src/appsec/iast/analyzers/vulnerability-analyzer.js +5 -4
  142. package/packages/dd-trace/src/appsec/iast/context/context-plugin.js +2 -3
  143. package/packages/dd-trace/src/appsec/iast/iast-plugin.js +3 -3
  144. package/packages/dd-trace/src/appsec/iast/index.js +1 -0
  145. package/packages/dd-trace/src/appsec/iast/overhead-controller.js +102 -7
  146. package/packages/dd-trace/src/appsec/iast/path-line.js +7 -8
  147. package/packages/dd-trace/src/appsec/iast/security-controls/index.js +6 -13
  148. package/packages/dd-trace/src/appsec/iast/security-controls/parser.js +6 -6
  149. package/packages/dd-trace/src/appsec/iast/taint-tracking/filter.js +2 -2
  150. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations-taint-object.js +3 -3
  151. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations.js +4 -28
  152. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +1 -7
  153. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugins/kafka.js +3 -4
  154. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter-esm.mjs +1 -1
  155. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +5 -7
  156. package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +2 -2
  157. package/packages/dd-trace/src/appsec/iast/telemetry/span-tags.js +6 -6
  158. package/packages/dd-trace/src/appsec/iast/telemetry/verbosity.js +1 -1
  159. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/command-sensitive-analyzer.js +1 -1
  160. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/ldap-sensitive-analyzer.js +1 -1
  161. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/sql-sensitive-analyzer.js +7 -7
  162. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +23 -24
  163. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-regex.js +3 -3
  164. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/index.js +4 -4
  165. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +6 -11
  166. package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +9 -11
  167. package/packages/dd-trace/src/appsec/index.js +1 -1
  168. package/packages/dd-trace/src/appsec/rasp/index.js +15 -15
  169. package/packages/dd-trace/src/appsec/rasp/lfi.js +2 -1
  170. package/packages/dd-trace/src/appsec/reporter.js +233 -40
  171. package/packages/dd-trace/src/appsec/rule_manager.js +2 -2
  172. package/packages/dd-trace/src/appsec/stack_trace.js +2 -4
  173. package/packages/dd-trace/src/appsec/telemetry/rasp.js +3 -5
  174. package/packages/dd-trace/src/appsec/telemetry/waf.js +3 -5
  175. package/packages/dd-trace/src/appsec/user_tracking.js +3 -5
  176. package/packages/dd-trace/src/appsec/waf/waf_context_wrapper.js +2 -2
  177. package/packages/dd-trace/src/azure_metadata.js +2 -7
  178. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +1 -1
  179. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +2 -2
  180. package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +1 -1
  181. package/packages/dd-trace/src/ci-visibility/exporters/agent-proxy/index.js +3 -3
  182. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +1 -1
  183. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +1 -1
  184. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +1 -1
  185. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +6 -4
  186. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +2 -2
  187. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/writer.js +0 -2
  188. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +1 -1
  189. package/packages/dd-trace/src/ci-visibility/log-submission/log-submission-plugin.js +1 -1
  190. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +8 -5
  191. package/packages/dd-trace/src/ci-visibility/telemetry.js +4 -0
  192. package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +1 -1
  193. package/packages/dd-trace/src/config.js +82 -51
  194. package/packages/dd-trace/src/config_stable.js +3 -3
  195. package/packages/dd-trace/src/datastreams/encoding.js +9 -9
  196. package/packages/dd-trace/src/datastreams/fnv.js +1 -1
  197. package/packages/dd-trace/src/datastreams/pathway.js +4 -4
  198. package/packages/dd-trace/src/datastreams/processor.js +5 -7
  199. package/packages/dd-trace/src/datastreams/schemas/schema_builder.js +1 -1
  200. package/packages/dd-trace/src/datastreams/schemas/schema_sampler.js +4 -6
  201. package/packages/dd-trace/src/datastreams/size.js +1 -1
  202. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +74 -67
  203. package/packages/dd-trace/src/debugger/devtools_client/condition.js +6 -8
  204. package/packages/dd-trace/src/debugger/devtools_client/defaults.js +1 -1
  205. package/packages/dd-trace/src/debugger/devtools_client/index.js +7 -1
  206. package/packages/dd-trace/src/debugger/devtools_client/remote_config.js +18 -38
  207. package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +1 -1
  208. package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +8 -10
  209. package/packages/dd-trace/src/debugger/devtools_client/snapshot/redaction.js +3 -3
  210. package/packages/dd-trace/src/debugger/devtools_client/source-maps.js +2 -10
  211. package/packages/dd-trace/src/debugger/devtools_client/state.js +10 -3
  212. package/packages/dd-trace/src/dogstatsd.js +5 -4
  213. package/packages/dd-trace/src/encode/0.4.js +9 -9
  214. package/packages/dd-trace/src/encode/0.5.js +1 -1
  215. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +3 -3
  216. package/packages/dd-trace/src/encode/coverage-ci-visibility.js +1 -1
  217. package/packages/dd-trace/src/encode/tags-processors.js +1 -1
  218. package/packages/dd-trace/src/exporter.js +6 -6
  219. package/packages/dd-trace/src/exporters/agent/writer.js +1 -5
  220. package/packages/dd-trace/src/exporters/common/docker.js +1 -1
  221. package/packages/dd-trace/src/exporters/common/form-data.js +6 -4
  222. package/packages/dd-trace/src/exporters/common/request.js +1 -1
  223. package/packages/dd-trace/src/exporters/common/util.js +1 -1
  224. package/packages/dd-trace/src/external-logger/src/index.js +5 -5
  225. package/packages/dd-trace/src/flare/file.js +1 -5
  226. package/packages/dd-trace/src/format.js +1 -1
  227. package/packages/dd-trace/src/git_properties.js +1 -1
  228. package/packages/dd-trace/src/id.js +12 -6
  229. package/packages/dd-trace/src/iitm.js +10 -22
  230. package/packages/dd-trace/src/lambda/handler.js +6 -6
  231. package/packages/dd-trace/src/lambda/runtime/patch.js +4 -4
  232. package/packages/dd-trace/src/lambda/runtime/ritm.js +1 -1
  233. package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +6 -6
  234. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chain.js +2 -6
  235. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chat_model.js +3 -3
  236. package/packages/dd-trace/src/llmobs/plugins/langchain/index.js +6 -6
  237. package/packages/dd-trace/src/llmobs/plugins/openai.js +1 -1
  238. package/packages/dd-trace/src/llmobs/sdk.js +2 -2
  239. package/packages/dd-trace/src/llmobs/tagger.js +110 -96
  240. package/packages/dd-trace/src/llmobs/util.js +9 -9
  241. package/packages/dd-trace/src/llmobs/writers/base.js +1 -1
  242. package/packages/dd-trace/src/llmobs/writers/util.js +1 -1
  243. package/packages/dd-trace/src/log/index.js +4 -4
  244. package/packages/dd-trace/src/log/log.js +1 -1
  245. package/packages/dd-trace/src/log/writer.js +2 -2
  246. package/packages/dd-trace/src/msgpack/chunk.js +3 -3
  247. package/packages/dd-trace/src/msgpack/encoder.js +28 -28
  248. package/packages/dd-trace/src/noop/dogstatsd.js +6 -6
  249. package/packages/dd-trace/src/noop/span.js +3 -5
  250. package/packages/dd-trace/src/noop/tracer.js +1 -2
  251. package/packages/dd-trace/src/opentelemetry/span_processor.js +2 -2
  252. package/packages/dd-trace/src/opentelemetry/tracer.js +6 -5
  253. package/packages/dd-trace/src/opentracing/propagation/log.js +6 -8
  254. package/packages/dd-trace/src/opentracing/propagation/text_map.js +27 -23
  255. package/packages/dd-trace/src/opentracing/propagation/tracestate.js +8 -4
  256. package/packages/dd-trace/src/opentracing/span.js +9 -14
  257. package/packages/dd-trace/src/opentracing/tracer.js +9 -6
  258. package/packages/dd-trace/src/payload-tagging/index.js +1 -1
  259. package/packages/dd-trace/src/payload-tagging/tagging.js +6 -6
  260. package/packages/dd-trace/src/pkg.js +1 -1
  261. package/packages/dd-trace/src/plugins/ci_plugin.js +62 -10
  262. package/packages/dd-trace/src/plugins/consumer.js +2 -2
  263. package/packages/dd-trace/src/plugins/inbound.js +5 -1
  264. package/packages/dd-trace/src/plugins/index.js +0 -1
  265. package/packages/dd-trace/src/plugins/outbound.js +4 -5
  266. package/packages/dd-trace/src/plugins/plugin.js +1 -1
  267. package/packages/dd-trace/src/plugins/producer.js +2 -2
  268. package/packages/dd-trace/src/plugins/storage.js +2 -2
  269. package/packages/dd-trace/src/plugins/util/ci.js +23 -15
  270. package/packages/dd-trace/src/plugins/util/git.js +165 -11
  271. package/packages/dd-trace/src/plugins/util/inferred_proxy.js +1 -1
  272. package/packages/dd-trace/src/plugins/util/ip_extractor.js +1 -1
  273. package/packages/dd-trace/src/plugins/util/llm.js +27 -10
  274. package/packages/dd-trace/src/plugins/util/stacktrace.js +1 -1
  275. package/packages/dd-trace/src/plugins/util/test.js +311 -48
  276. package/packages/dd-trace/src/plugins/util/url.js +1 -1
  277. package/packages/dd-trace/src/plugins/util/urlfilter.js +13 -17
  278. package/packages/dd-trace/src/plugins/util/user-provided-git.js +12 -3
  279. package/packages/dd-trace/src/plugins/util/web.js +5 -4
  280. package/packages/dd-trace/src/priority_sampler.js +22 -22
  281. package/packages/dd-trace/src/profiling/config.js +44 -8
  282. package/packages/dd-trace/src/profiling/exporters/event_serializer.js +5 -5
  283. package/packages/dd-trace/src/profiling/exporters/file.js +2 -1
  284. package/packages/dd-trace/src/profiling/profiler.js +37 -2
  285. package/packages/dd-trace/src/profiling/profilers/events.js +14 -17
  286. package/packages/dd-trace/src/profiling/profilers/shared.js +6 -1
  287. package/packages/dd-trace/src/profiling/profilers/space.js +3 -3
  288. package/packages/dd-trace/src/profiling/profilers/wall.js +6 -7
  289. package/packages/dd-trace/src/profiling/ssi-heuristics.js +3 -5
  290. package/packages/dd-trace/src/profiling/tagger.js +3 -5
  291. package/packages/dd-trace/src/profiling/webspan-utils.js +1 -1
  292. package/packages/dd-trace/src/proxy.js +7 -9
  293. package/packages/dd-trace/src/random_sampler.js +40 -0
  294. package/packages/dd-trace/src/rate_limiter.js +4 -4
  295. package/packages/dd-trace/src/remote_config/index.js +3 -7
  296. package/packages/dd-trace/src/remote_config/manager.js +25 -13
  297. package/packages/dd-trace/src/require-package-json.js +1 -1
  298. package/packages/dd-trace/src/ritm.js +4 -4
  299. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +2 -2
  300. package/packages/dd-trace/src/sampler.js +33 -4
  301. package/packages/dd-trace/src/sampling_rule.js +12 -3
  302. package/packages/dd-trace/src/scope.js +1 -1
  303. package/packages/dd-trace/src/service-naming/schemas/util.js +1 -1
  304. package/packages/dd-trace/src/service-naming/schemas/v0/web.js +2 -3
  305. package/packages/dd-trace/src/span_processor.js +3 -3
  306. package/packages/dd-trace/src/span_sampler.js +4 -1
  307. package/packages/dd-trace/src/standalone/tracesource.js +1 -1
  308. package/packages/dd-trace/src/startup-log.js +2 -2
  309. package/packages/dd-trace/src/telemetry/dependencies.js +4 -4
  310. package/packages/dd-trace/src/telemetry/logs/log-collector.js +9 -10
  311. package/packages/dd-trace/src/telemetry/metrics.js +10 -5
  312. package/packages/dd-trace/src/telemetry/send-data.js +1 -1
  313. package/packages/dd-trace/src/telemetry/telemetry.js +23 -24
  314. package/packages/dd-trace/src/util.js +1 -1
  315. package/version.js +1 -0
  316. package/packages/datadog-instrumentations/src/paperplane.js +0 -77
  317. package/packages/datadog-plugin-paperplane/src/index.js +0 -25
  318. package/packages/datadog-plugin-paperplane/src/logger.js +0 -11
  319. package/packages/datadog-plugin-paperplane/src/server.js +0 -24
@@ -8,6 +8,7 @@ const {
8
8
  PLAYWRIGHT_WORKER_TRACE_PAYLOAD_CODE
9
9
  } = require('../../dd-trace/src/plugins/util/test')
10
10
  const log = require('../../dd-trace/src/log')
11
+ const { DD_MAJOR } = require('../../../version')
11
12
 
12
13
  const testStartCh = channel('ci:playwright:test:start')
13
14
  const testFinishCh = channel('ci:playwright:test:finish')
@@ -18,6 +19,8 @@ const testSessionFinishCh = channel('ci:playwright:session:finish')
18
19
  const libraryConfigurationCh = channel('ci:playwright:library-configuration')
19
20
  const knownTestsCh = channel('ci:playwright:known-tests')
20
21
  const testManagementTestsCh = channel('ci:playwright:test-management-tests')
22
+ const impactedTestsCh = channel('ci:playwright:modified-tests')
23
+ const isModifiedCh = channel('ci:playwright:test:is-modified')
21
24
 
22
25
  const testSuiteStartCh = channel('ci:playwright:test-suite:start')
23
26
  const testSuiteFinishCh = channel('ci:playwright:test-suite:finish')
@@ -53,9 +56,11 @@ let knownTests = {}
53
56
  let isTestManagementTestsEnabled = false
54
57
  let testManagementAttemptToFixRetries = 0
55
58
  let testManagementTests = {}
59
+ let isImpactedTestsEnabled = false
60
+ let modifiedTests = {}
56
61
  const quarantinedOrDisabledTestsAttemptToFix = []
57
62
  let rootDir = ''
58
- const MINIMUM_SUPPORTED_VERSION_RANGE_EFD = '>=1.38.0'
63
+ const MINIMUM_SUPPORTED_VERSION_RANGE_EFD = '>=1.38.0' // TODO: remove this once we drop support for v5
59
64
 
60
65
  function getTestProperties (test) {
61
66
  const testName = getTestFullname(test)
@@ -104,11 +109,7 @@ function deepCloneSuite (suite, filterTest, tags = []) {
104
109
 
105
110
  function getTestsBySuiteFromTestGroups (testGroups) {
106
111
  return testGroups.reduce((acc, { requireFile, tests }) => {
107
- if (acc[requireFile]) {
108
- acc[requireFile] = acc[requireFile].concat(tests)
109
- } else {
110
- acc[requireFile] = tests
111
- }
112
+ acc[requireFile] = acc[requireFile] ? acc[requireFile].concat(tests) : tests
112
113
  return acc
113
114
  }, {})
114
115
  }
@@ -132,10 +133,10 @@ function getTestsBySuiteFromTestsById (testsById) {
132
133
  function getPlaywrightConfig (playwrightRunner) {
133
134
  try {
134
135
  return playwrightRunner._configLoader.fullConfig()
135
- } catch (e) {
136
+ } catch {
136
137
  try {
137
138
  return playwrightRunner._loader.fullConfig()
138
- } catch (e) {
139
+ } catch {
139
140
  return playwrightRunner._config || {}
140
141
  }
141
142
  }
@@ -235,14 +236,14 @@ function getTestByTestId (dispatcher, testId) {
235
236
  }
236
237
  }
237
238
 
238
- function getChannelPromise (channelToPublishTo) {
239
+ function getChannelPromise (channelToPublishTo, params) {
239
240
  return new Promise(resolve => {
240
241
  testSessionAsyncResource.runInAsyncScope(() => {
241
- channelToPublishTo.publish({ onDone: resolve })
242
+ channelToPublishTo.publish({ onDone: resolve, ...params })
242
243
  })
243
244
  })
244
245
  }
245
- // eslint-disable-next-line
246
+
246
247
  // Inspired by https://github.com/microsoft/playwright/blob/2b77ed4d7aafa85a600caa0b0d101b72c8437eeb/packages/playwright/src/reporters/base.ts#L293
247
248
  // We can't use test.outcome() directly because it's set on follow up handlers:
248
249
  // our `testEndHandler` is called before the outcome is set.
@@ -281,7 +282,7 @@ function testBeginHandler (test, browserName, isMainProcess) {
281
282
  startedSuites.push(testSuiteAbsolutePath)
282
283
  const testSuiteCtx = { testSuiteAbsolutePath }
283
284
  testSuiteToCtx.set(testSuiteAbsolutePath, testSuiteCtx)
284
- testSuiteStartCh.runStores(testSuiteCtx, () => { })
285
+ testSuiteStartCh.runStores(testSuiteCtx, () => {})
285
286
  }
286
287
 
287
288
  // We disable retries by default if attemptToFix is true
@@ -301,7 +302,7 @@ function testBeginHandler (test, browserName, isMainProcess) {
301
302
  }
302
303
  testToCtx.set(test, testCtx)
303
304
 
304
- testStartCh.runStores(testCtx, () => { })
305
+ testStartCh.runStores(testCtx, () => {})
305
306
  }
306
307
  }
307
308
 
@@ -333,7 +334,7 @@ function testEndHandler (test, annotations, testStatus, error, isTimeout, isMain
333
334
  }
334
335
 
335
336
  if (testStatuses.length === testManagementAttemptToFixRetries + 1) {
336
- if (testStatuses.some(status => status === 'fail')) {
337
+ if (testStatuses.includes('fail')) {
337
338
  test._ddHasFailedAttemptToFixRetries = true
338
339
  }
339
340
  if (testStatuses.every(status => status === 'fail')) {
@@ -345,7 +346,7 @@ function testEndHandler (test, annotations, testStatus, error, isTimeout, isMain
345
346
 
346
347
  // this handles tests that do not go through the worker process (because they're skipped)
347
348
  if (isMainProcess) {
348
- const testResult = results[results.length - 1]
349
+ const testResult = results.at(-1)
349
350
  const testCtx = testToCtx.get(test)
350
351
  const isAtrRetry = testResult?.retry > 0 &&
351
352
  isFlakyTestRetriesEnabled &&
@@ -366,6 +367,7 @@ function testEndHandler (test, annotations, testStatus, error, isTimeout, isMain
366
367
  hasPassedAttemptToFixRetries: test._ddHasPassedAttemptToFixRetries,
367
368
  hasFailedAttemptToFixRetries: test._ddHasFailedAttemptToFixRetries,
368
369
  isAtrRetry,
370
+ isModified: test._ddIsModified,
369
371
  ...testCtx.currentStore
370
372
  })
371
373
  }
@@ -389,7 +391,7 @@ function testEndHandler (test, annotations, testStatus, error, isTimeout, isMain
389
391
  if (!remainingTestsByFile[testSuiteAbsolutePath].length) {
390
392
  const testStatuses = testSuiteToTestStatuses.get(testSuiteAbsolutePath)
391
393
  let testSuiteStatus = 'pass'
392
- if (testStatuses.some(status => status === 'fail')) {
394
+ if (testStatuses.includes('fail')) {
393
395
  testSuiteStatus = 'fail'
394
396
  } else if (testStatuses.every(status => status === 'skip')) {
395
397
  testSuiteStatus = 'skip'
@@ -413,7 +415,7 @@ function dispatcherRunWrapperNew (run) {
413
415
  if (!this._allTests) {
414
416
  // Removed in https://github.com/microsoft/playwright/commit/1e52c37b254a441cccf332520f60225a5acc14c7
415
417
  // Not available from >=1.44.0
416
- this._ddAllTests = testGroups.map(g => g.tests).flat()
418
+ this._ddAllTests = testGroups.flatMap(g => g.tests)
417
419
  }
418
420
  remainingTestsByFile = getTestsBySuiteFromTestGroups(arguments[0])
419
421
  return run.apply(this, arguments)
@@ -435,7 +437,7 @@ function dispatcherHook (dispatcherExport) {
435
437
  const { test } = dispatcher._testById.get(params.testId)
436
438
 
437
439
  const { results } = test
438
- const testResult = results[results.length - 1]
440
+ const testResult = results.at(-1)
439
441
 
440
442
  const isTimeout = testResult.status === 'timedOut'
441
443
  testEndHandler(
@@ -471,7 +473,7 @@ function dispatcherHookNew (dispatcherExport, runWrapper) {
471
473
 
472
474
  const isTimeout = status === 'timedOut'
473
475
  testEndHandler(test, annotations, STATUS_TO_TEST_STATUS[status], errors && errors[0], isTimeout, false)
474
- const testResult = test.results[test.results.length - 1]
476
+ const testResult = test.results.at(-1)
475
477
  const isAtrRetry = testResult?.retry > 0 &&
476
478
  isFlakyTestRetriesEnabled &&
477
479
  !test._ddIsAttemptToFix &&
@@ -490,7 +492,8 @@ function dispatcherHookNew (dispatcherExport, runWrapper) {
490
492
  _ddHasFailedAllRetries: test._ddHasFailedAllRetries,
491
493
  _ddHasPassedAttemptToFixRetries: test._ddHasPassedAttemptToFixRetries,
492
494
  _ddHasFailedAttemptToFixRetries: test._ddHasFailedAttemptToFixRetries,
493
- _ddIsAtrRetry: isAtrRetry
495
+ _ddIsAtrRetry: isAtrRetry,
496
+ _ddIsModified: test._ddIsModified
494
497
  }
495
498
  })
496
499
  })
@@ -522,22 +525,24 @@ function runnerHook (runnerExport, playwrightVersion) {
522
525
  flakyTestRetriesCount = libraryConfig.flakyTestRetriesCount
523
526
  isTestManagementTestsEnabled = libraryConfig.isTestManagementEnabled
524
527
  testManagementAttemptToFixRetries = libraryConfig.testManagementAttemptToFixRetries
528
+ isImpactedTestsEnabled = libraryConfig.isImpactedTestsEnabled
525
529
  }
526
530
  } catch (e) {
527
531
  isEarlyFlakeDetectionEnabled = false
528
532
  isKnownTestsEnabled = false
529
533
  isTestManagementTestsEnabled = false
534
+ isImpactedTestsEnabled = false
530
535
  log.error('Playwright session start error', e)
531
536
  }
532
537
 
533
538
  if (isKnownTestsEnabled && satisfies(playwrightVersion, MINIMUM_SUPPORTED_VERSION_RANGE_EFD)) {
534
539
  try {
535
540
  const { err, knownTests: receivedKnownTests } = await getChannelPromise(knownTestsCh)
536
- if (!err) {
537
- knownTests = receivedKnownTests
538
- } else {
541
+ if (err) {
539
542
  isEarlyFlakeDetectionEnabled = false
540
543
  isKnownTestsEnabled = false
544
+ } else {
545
+ knownTests = receivedKnownTests
541
546
  }
542
547
  } catch (err) {
543
548
  isEarlyFlakeDetectionEnabled = false
@@ -549,10 +554,10 @@ function runnerHook (runnerExport, playwrightVersion) {
549
554
  if (isTestManagementTestsEnabled && satisfies(playwrightVersion, MINIMUM_SUPPORTED_VERSION_RANGE_EFD)) {
550
555
  try {
551
556
  const { err, testManagementTests: receivedTestManagementTests } = await getChannelPromise(testManagementTestsCh)
552
- if (!err) {
553
- testManagementTests = receivedTestManagementTests
554
- } else {
557
+ if (err) {
555
558
  isTestManagementTestsEnabled = false
559
+ } else {
560
+ testManagementTests = receivedTestManagementTests
556
561
  }
557
562
  } catch (err) {
558
563
  isTestManagementTestsEnabled = false
@@ -560,6 +565,20 @@ function runnerHook (runnerExport, playwrightVersion) {
560
565
  }
561
566
  }
562
567
 
568
+ if (isImpactedTestsEnabled && satisfies(playwrightVersion, MINIMUM_SUPPORTED_VERSION_RANGE_EFD)) {
569
+ try {
570
+ const { err, modifiedTests: receivedModifiedTests } = await getChannelPromise(impactedTestsCh)
571
+ if (err) {
572
+ isImpactedTestsEnabled = false
573
+ } else {
574
+ modifiedTests = receivedModifiedTests
575
+ }
576
+ } catch (err) {
577
+ isImpactedTestsEnabled = false
578
+ log.error('Playwright impacted tests error', err)
579
+ }
580
+ }
581
+
563
582
  const projects = getProjectsFromRunner(this)
564
583
 
565
584
  const shouldSetRetries = isFlakyTestRetriesEnabled &&
@@ -632,37 +651,38 @@ function runnerHook (runnerExport, playwrightVersion) {
632
651
  return runnerExport
633
652
  }
634
653
 
635
- addHook({
636
- name: '@playwright/test',
637
- file: 'lib/runner.js',
638
- versions: ['>=1.18.0 <=1.30.0']
639
- }, runnerHook)
640
-
641
- addHook({
642
- name: '@playwright/test',
643
- file: 'lib/dispatcher.js',
644
- versions: ['>=1.18.0 <1.30.0']
645
- }, dispatcherHook)
646
-
647
- addHook({
648
- name: '@playwright/test',
649
- file: 'lib/dispatcher.js',
650
- versions: ['>=1.30.0 <1.31.0']
651
- }, (dispatcher) => dispatcherHookNew(dispatcher, dispatcherRunWrapper))
652
-
653
- addHook({
654
- name: '@playwright/test',
655
- file: 'lib/runner/dispatcher.js',
656
- versions: ['>=1.31.0 <1.38.0']
657
- }, (dispatcher) => dispatcherHookNew(dispatcher, dispatcherRunWrapperNew))
658
-
659
- addHook({
660
- name: '@playwright/test',
661
- file: 'lib/runner/runner.js',
662
- versions: ['>=1.31.0 <1.38.0']
663
- }, runnerHook)
654
+ if (DD_MAJOR < 6) { // <1.38.0 is only supported up to version 5
655
+ addHook({
656
+ name: '@playwright/test',
657
+ file: 'lib/runner.js',
658
+ versions: ['>=1.18.0 <=1.30.0']
659
+ }, runnerHook)
660
+
661
+ addHook({
662
+ name: '@playwright/test',
663
+ file: 'lib/dispatcher.js',
664
+ versions: ['>=1.18.0 <1.30.0']
665
+ }, dispatcherHook)
666
+
667
+ addHook({
668
+ name: '@playwright/test',
669
+ file: 'lib/dispatcher.js',
670
+ versions: ['>=1.30.0 <1.31.0']
671
+ }, (dispatcher) => dispatcherHookNew(dispatcher, dispatcherRunWrapper))
672
+
673
+ addHook({
674
+ name: '@playwright/test',
675
+ file: 'lib/runner/dispatcher.js',
676
+ versions: ['>=1.31.0 <1.38.0']
677
+ }, (dispatcher) => dispatcherHookNew(dispatcher, dispatcherRunWrapperNew))
678
+
679
+ addHook({
680
+ name: '@playwright/test',
681
+ file: 'lib/runner/runner.js',
682
+ versions: ['>=1.31.0 <1.38.0']
683
+ }, runnerHook)
684
+ }
664
685
 
665
- // From >=1.38.0
666
686
  addHook({
667
687
  name: 'playwright',
668
688
  file: 'lib/runner/runner.js',
@@ -675,11 +695,10 @@ addHook({
675
695
  versions: ['>=1.38.0']
676
696
  }, (dispatcher) => dispatcherHookNew(dispatcher, dispatcherRunWrapperNew))
677
697
 
678
- // Hook used for early flake detection. EFD only works from >=1.38.0
679
698
  addHook({
680
699
  name: 'playwright',
681
700
  file: 'lib/common/suiteUtils.js',
682
- versions: [MINIMUM_SUPPORTED_VERSION_RANGE_EFD]
701
+ versions: ['>=1.38.0']
683
702
  }, suiteUtilsPackage => {
684
703
  // We grab `applyRepeatEachIndex` to use it later
685
704
  // `applyRepeatEachIndex` needs to be applied to a cloned suite
@@ -687,16 +706,15 @@ addHook({
687
706
  return suiteUtilsPackage
688
707
  })
689
708
 
690
- // Hook used for early flake detection. EFD only works from >=1.38.0
691
709
  addHook({
692
710
  name: 'playwright',
693
711
  file: 'lib/runner/loadUtils.js',
694
- versions: [MINIMUM_SUPPORTED_VERSION_RANGE_EFD]
712
+ versions: ['>=1.38.0']
695
713
  }, (loadUtilsPackage) => {
696
714
  const oldCreateRootSuite = loadUtilsPackage.createRootSuite
697
715
 
698
716
  async function newCreateRootSuite () {
699
- if (!isKnownTestsEnabled && !isTestManagementTestsEnabled) {
717
+ if (!isKnownTestsEnabled && !isTestManagementTestsEnabled && !isImpactedTestsEnabled) {
700
718
  return oldCreateRootSuite.apply(this, arguments)
701
719
  }
702
720
  const rootSuite = await oldCreateRootSuite.apply(this, arguments)
@@ -735,13 +753,41 @@ addHook({
735
753
  }
736
754
  }
737
755
 
756
+ if (isImpactedTestsEnabled) {
757
+ for (const test of allTests) {
758
+ const isNew = isKnownTestsEnabled && isNewTest(test)
759
+ const { isModified } = await getChannelPromise(isModifiedCh, {
760
+ filePath: test._requireFile,
761
+ modifiedTests
762
+ })
763
+ if (isModified) {
764
+ test._ddIsModified = true
765
+ }
766
+ if (isEarlyFlakeDetectionEnabled && test.expectedStatus !== 'skipped') {
767
+ const fileSuite = getSuiteType(test, 'file')
768
+ const projectSuite = getSuiteType(test, 'project')
769
+ // If something change in the file, all tests in the file are impacted
770
+ const isModifiedTest = () => isModified
771
+ for (let repeatEachIndex = 1; repeatEachIndex <= earlyFlakeDetectionNumRetries; repeatEachIndex++) {
772
+ const copyFileSuite = deepCloneSuite(fileSuite, isModifiedTest, [
773
+ isNew && '_ddIsNew',
774
+ '_ddIsModified',
775
+ '_ddIsEfdRetry'
776
+ ])
777
+ applyRepeatEachIndex(projectSuite._fullProject, copyFileSuite, repeatEachIndex + 1)
778
+ projectSuite._addSuite(copyFileSuite)
779
+ }
780
+ }
781
+ }
782
+ }
783
+
738
784
  if (isKnownTestsEnabled) {
739
785
  const newTests = allTests.filter(isNewTest)
740
786
 
741
787
  for (const newTest of newTests) {
742
788
  // No need to filter out attempt to fix tests here because attempt to fix tests are never new
743
789
  newTest._ddIsNew = true
744
- if (isEarlyFlakeDetectionEnabled && newTest.expectedStatus !== 'skipped') {
790
+ if (isEarlyFlakeDetectionEnabled && newTest.expectedStatus !== 'skipped' && !newTest._ddIsModified) {
745
791
  const fileSuite = getSuiteType(newTest, 'file')
746
792
  const projectSuite = getSuiteType(newTest, 'project')
747
793
  for (let repeatEachIndex = 1; repeatEachIndex <= earlyFlakeDetectionNumRetries; repeatEachIndex++) {
@@ -814,11 +860,7 @@ addHook({
814
860
  try {
815
861
  if (page) {
816
862
  const isRumActive = await page.evaluate(() => {
817
- if (window.DD_RUM && window.DD_RUM.getInternalContext) {
818
- return !!window.DD_RUM.getInternalContext()
819
- } else {
820
- return false
821
- }
863
+ return window.DD_RUM && window.DD_RUM.getInternalContext ? !!window.DD_RUM.getInternalContext() : false
822
864
  })
823
865
 
824
866
  if (isRumActive) {
@@ -828,7 +870,7 @@ addHook({
828
870
  })
829
871
  }
830
872
  }
831
- } catch (e) {
873
+ } catch {
832
874
  // ignore errors such as redirects, context destroyed, etc
833
875
  }
834
876
 
@@ -916,7 +958,7 @@ addHook({
916
958
  }
917
959
  }
918
960
  }
919
- } catch (e) {
961
+ } catch {
920
962
  // ignore errors
921
963
  }
922
964
  },
@@ -984,6 +1026,7 @@ addHook({
984
1026
  hasPassedAttemptToFixRetries: test._ddHasPassedAttemptToFixRetries,
985
1027
  hasFailedAttemptToFixRetries: test._ddHasFailedAttemptToFixRetries,
986
1028
  isAtrRetry: test._ddIsAtrRetry,
1029
+ isModified: test._ddIsModified,
987
1030
  onDone,
988
1031
  ...testCtx.currentStore
989
1032
  })
@@ -47,7 +47,7 @@ function wrapCommandQueueClass (cls) {
47
47
  if (parsed) {
48
48
  this._url = { host: parsed.hostname, port: +parsed.port || 6379 }
49
49
  }
50
- } catch (error) {
50
+ } catch {
51
51
  // ignore
52
52
  }
53
53
  }
@@ -130,8 +130,8 @@ addHook({ name: 'redis', versions: ['>=0.12 <2.6'] }, redis => {
130
130
  if (typeof callback === 'function') {
131
131
  const cb = callbackResource.bind(callback)
132
132
  arguments[2] = asyncResource.bind(wrapCallback(finishCh, errorCh, cb))
133
- } else if (Array.isArray(args) && typeof args[args.length - 1] === 'function') {
134
- const cb = callbackResource.bind(args[args.length - 1])
133
+ } else if (Array.isArray(args) && typeof args.at(-1) === 'function') {
134
+ const cb = callbackResource.bind(args.at(-1))
135
135
  args[args.length - 1] = asyncResource.bind(wrapCallback(finishCh, errorCh, cb))
136
136
  } else {
137
137
  arguments[2] = asyncResource.bind(wrapCallback(finishCh, errorCh))
@@ -20,8 +20,8 @@ function wrapSetupRequest (setupRequest) {
20
20
  }
21
21
 
22
22
  function wrapMethod (method) {
23
- return function (path) {
24
- const middleware = wrapMiddleware(Array.prototype.slice.call(arguments, 1))
23
+ return function (path, ...rest) {
24
+ const middleware = wrapMiddleware(rest)
25
25
 
26
26
  return method.apply(this, [path].concat(middleware))
27
27
  }
@@ -2,8 +2,7 @@
2
2
 
3
3
  const {
4
4
  channel,
5
- addHook,
6
- AsyncResource
5
+ addHook
7
6
  } = require('./helpers/instrument')
8
7
  const shimmer = require('../../datadog-shimmer')
9
8
 
@@ -49,21 +48,17 @@ addHook({ name: 'rhea', versions: ['>=1'], file: 'lib/link.js' }, obj => {
49
48
  ? this.options.target.address
50
49
  : undefined
51
50
 
52
- const asyncResource = new AsyncResource('bound-anonymous-fn')
53
- return asyncResource.runInAsyncScope(() => {
54
- startSendCh.publish({ targetAddress, host, port, msg })
51
+ const ctx = { targetAddress, host, port, msg, connection: this.connection }
52
+ return startSendCh.runStores(ctx, () => {
55
53
  const delivery = send.apply(this, arguments)
56
- const context = {
57
- asyncResource,
58
- connection: this.connection
59
- }
60
- contexts.set(delivery, context)
54
+ contexts.set(delivery, ctx)
61
55
 
62
56
  addToInFlightDeliveries(this.connection, delivery)
63
57
  try {
64
58
  return delivery
65
59
  } catch (err) {
66
- errorSendCh.publish(err)
60
+ ctx.error = err
61
+ errorSendCh.publish(ctx)
67
62
 
68
63
  throw err
69
64
  }
@@ -77,23 +72,18 @@ addHook({ name: 'rhea', versions: ['>=1'], file: 'lib/link.js' }, obj => {
77
72
  }
78
73
 
79
74
  if (eventName === 'message' && msgObj) {
80
- const asyncResource = new AsyncResource('bound-anonymous-fn')
81
- return asyncResource.runInAsyncScope(() => {
82
- startReceiveCh.publish({ msgObj, connection: this.connection })
83
-
75
+ const ctx = { msgObj, connection: this.connection }
76
+ return startReceiveCh.runStores(ctx, () => {
84
77
  if (msgObj.delivery) {
85
- const context = {
86
- asyncResource,
87
- connection: this.connection
88
- }
89
- contexts.set(msgObj.delivery, context)
78
+ contexts.set(msgObj.delivery, ctx)
90
79
  msgObj.delivery.update = wrapDeliveryUpdate(msgObj.delivery, msgObj.delivery.update)
91
80
  addToInFlightDeliveries(this.connection, msgObj.delivery)
92
81
  }
93
82
  try {
94
83
  return dispatch.apply(this, arguments)
95
84
  } catch (err) {
96
- errorReceiveCh.publish(err)
85
+ ctx.error = err
86
+ errorReceiveCh.publish(ctx)
97
87
 
98
88
  throw err
99
89
  }
@@ -111,16 +101,14 @@ addHook({ name: 'rhea', versions: ['>=1'], file: 'lib/connection.js' }, Connecti
111
101
  const error = obj.error || this.saved_error
112
102
  if (this[inFlightDeliveries]) {
113
103
  this[inFlightDeliveries].forEach(delivery => {
114
- const context = contexts.get(delivery)
115
- const asyncResource = context && context.asyncResource
104
+ const ctx = contexts.get(delivery)
116
105
 
117
- if (!asyncResource) return
106
+ if (!ctx) return
118
107
 
119
- asyncResource.runInAsyncScope(() => {
120
- errorReceiveCh.publish(error)
121
- exports.beforeFinish(delivery, null)
122
- finishReceiveCh.publish()
123
- })
108
+ ctx.error = error
109
+ errorReceiveCh.publish(ctx)
110
+ exports.beforeFinish(delivery, null)
111
+ finishReceiveCh.publish(ctx)
124
112
  })
125
113
  }
126
114
  }
@@ -149,15 +137,15 @@ function getHostAndPort (connection) {
149
137
  }
150
138
 
151
139
  function wrapDeliveryUpdate (obj, update) {
152
- const context = contexts.get(obj)
153
- const asyncResource = context.asyncResource
154
- if (obj && asyncResource) {
155
- const cb = asyncResource.bind(update)
156
- return shimmer.wrapFunction(cb, cb => AsyncResource.bind(function wrappedUpdate (settled, stateData) {
157
- const state = getStateFromData(stateData)
158
- dispatchReceiveCh.publish({ state })
159
- return cb.apply(this, arguments)
160
- }))
140
+ const ctx = contexts.get(obj)
141
+ if (obj && ctx) {
142
+ const cb = update
143
+ return shimmer.wrapFunction(cb, cb => function wrappedUpdate (settled, stateData) {
144
+ ctx.state = getStateFromData(stateData)
145
+ dispatchReceiveCh.runStores(ctx, () => {
146
+ return cb.apply(this, arguments)
147
+ })
148
+ })
161
149
  }
162
150
  return function wrappedUpdate (settled, stateData) {
163
151
  return update.apply(this, arguments)
@@ -167,7 +155,8 @@ function wrapDeliveryUpdate (obj, update) {
167
155
  function patchCircularBuffer (proto, Session) {
168
156
  Object.defineProperty(proto, 'outgoing', {
169
157
  configurable: true,
170
- get () { return undefined },
158
+ // eslint-disable-next-line getter-return
159
+ get () {},
171
160
  set (outgoing) {
172
161
  delete proto.outgoing // removes the setter on the prototype
173
162
  this.outgoing = outgoing // assigns on the instance, like normal
@@ -178,27 +167,25 @@ function patchCircularBuffer (proto, Session) {
178
167
  }
179
168
  if (CircularBuffer && !patched.has(CircularBuffer.prototype)) {
180
169
  shimmer.wrap(CircularBuffer.prototype, 'pop_if', popIf => function (fn) {
181
- arguments[0] = shimmer.wrapFunction(fn, fn => AsyncResource.bind(function (entry) {
182
- const context = contexts.get(entry)
183
- const asyncResource = context && context.asyncResource
170
+ arguments[0] = shimmer.wrapFunction(fn, fn => function (entry) {
171
+ const ctx = contexts.get(entry)
184
172
 
185
- if (!asyncResource) return fn(entry)
173
+ if (!ctx) return fn(entry)
186
174
 
187
- const shouldPop = asyncResource.runInAsyncScope(() => fn(entry))
175
+ const shouldPop = fn(entry)
188
176
 
189
177
  if (shouldPop) {
190
178
  const remoteState = entry.remote_state
191
179
  const state = remoteState && remoteState.constructor
192
180
  ? entry.remote_state.constructor.composite_type
193
181
  : undefined
194
- asyncResource.runInAsyncScope(() => {
195
- exports.beforeFinish(entry, state)
196
- finishSendCh.publish()
197
- })
182
+ ctx.state = state
183
+ exports.beforeFinish(entry, state)
184
+ finishSendCh.publish(ctx)
198
185
  }
199
186
 
200
187
  return shouldPop
201
- }))
188
+ })
202
189
  return popIf.apply(this, arguments)
203
190
  })
204
191
  patched.add(CircularBuffer.prototype)
@@ -222,13 +209,14 @@ function addToInFlightDeliveries (connection, delivery) {
222
209
  }
223
210
 
224
211
  function beforeFinish (delivery, state) {
225
- const context = contexts.get(delivery)
226
- if (context) {
212
+ const ctx = contexts.get(delivery)
213
+ if (ctx) {
227
214
  if (state) {
228
- dispatchReceiveCh.publish({ state })
215
+ ctx.state = state
216
+ dispatchReceiveCh.publish(ctx)
229
217
  }
230
- if (context.connection && context.connection[inFlightDeliveries]) {
231
- context.connection[inFlightDeliveries].delete(delivery)
218
+ if (ctx.connection && ctx.connection[inFlightDeliveries]) {
219
+ ctx.connection[inFlightDeliveries].delete(delivery)
232
220
  }
233
221
  }
234
222
  }