@distrohelena/canton-typescript-sdk 0.1.5 → 0.1.7

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 (246) hide show
  1. package/README.md +333 -1
  2. package/dist/client/canton-client-options.d.ts +3 -0
  3. package/dist/client/canton-client-options.js +2 -0
  4. package/dist/client/service-registry.js +3 -2
  5. package/dist/core/errors/grpc-transport-error.d.ts +14 -0
  6. package/dist/core/errors/grpc-transport-error.js +76 -0
  7. package/dist/core/signing/command-signer.interface.d.ts +2 -0
  8. package/dist/core/transports/transport.interface.d.ts +2 -2
  9. package/dist/core/types/canton-hash-purpose.d.ts +2 -1
  10. package/dist/core/types/canton-hash-purpose.js +1 -0
  11. package/dist/core/types/daml-numeric.d.ts +6 -0
  12. package/dist/core/types/daml-numeric.js +14 -0
  13. package/dist/core/types/daml-party.d.ts +6 -0
  14. package/dist/core/types/daml-party.js +14 -0
  15. package/dist/core/types/disclosed-contract.d.ts +13 -0
  16. package/dist/core/types/disclosed-contract.js +15 -0
  17. package/dist/core/types/requests/create-decentralized-party-request.d.ts +41 -0
  18. package/dist/core/types/requests/create-decentralized-party-request.js +82 -0
  19. package/dist/core/types/requests/create-external-party-request.d.ts +42 -0
  20. package/dist/core/types/requests/create-external-party-request.js +47 -0
  21. package/dist/core/types/requests/finalize-decentralized-party-request.d.ts +39 -0
  22. package/dist/core/types/requests/finalize-decentralized-party-request.js +42 -0
  23. package/dist/core/types/requests/get-active-contracts-page-request.d.ts +15 -2
  24. package/dist/core/types/requests/get-active-contracts-page-request.js +4 -0
  25. package/dist/core/types/requests/submit-command-request.d.ts +5 -0
  26. package/dist/core/types/requests/submit-command-request.js +4 -0
  27. package/dist/core/types/topology/topology-signature-format.d.ts +2 -1
  28. package/dist/core/types/topology/topology-signature-format.js +1 -0
  29. package/dist/daml-lf/container/dar-archive-entry.d.ts +8 -0
  30. package/dist/daml-lf/container/dar-archive-entry.js +8 -0
  31. package/dist/daml-lf/container/dar-archive-loader.js +14 -0
  32. package/dist/daml-lf/container/dar-archive.d.ts +6 -0
  33. package/dist/daml-lf/container/dar-archive.js +4 -0
  34. package/dist/daml-lf/container/dar-source-bundle-loader.d.ts +5 -0
  35. package/dist/daml-lf/container/dar-source-bundle-loader.js +33 -0
  36. package/dist/daml-lf/container/dar-source-bundle.d.ts +45 -0
  37. package/dist/daml-lf/container/dar-source-bundle.js +11 -0
  38. package/dist/daml-lf/container/dar-source-file-entry.d.ts +8 -0
  39. package/dist/daml-lf/container/dar-source-file-entry.js +8 -0
  40. package/dist/daml-lf/daml-lf-compilation.d.ts +12 -0
  41. package/dist/daml-lf/daml-lf-compilation.js +35 -0
  42. package/dist/daml-lf/index.d.ts +11 -0
  43. package/dist/daml-lf/index.js +10 -0
  44. package/dist/daml-lf/interpreter/daml-lf-builtin-dispatch.d.ts +43 -0
  45. package/dist/daml-lf/interpreter/daml-lf-builtin-dispatch.js +933 -0
  46. package/dist/daml-lf/interpreter/daml-lf-evaluator.d.ts +95 -0
  47. package/dist/daml-lf/interpreter/daml-lf-evaluator.js +1131 -0
  48. package/dist/daml-lf/interpreter/daml-lf-interpreter-scaffold.d.ts +3 -0
  49. package/dist/daml-lf/interpreter/daml-lf-interpreter-scaffold.js +6 -1
  50. package/dist/daml-lf/interpreter/daml-lf-lexical-scope.d.ts +13 -0
  51. package/dist/daml-lf/interpreter/daml-lf-lexical-scope.js +46 -0
  52. package/dist/daml-lf/interpreter/daml-lf-runtime-frame.d.ts +16 -0
  53. package/dist/daml-lf/interpreter/daml-lf-runtime-frame.js +15 -0
  54. package/dist/daml-lf/interpreter/daml-lf-runtime-value.d.ts +21 -0
  55. package/dist/daml-lf/interpreter/daml-lf-runtime-value.js +4 -1
  56. package/dist/daml-lf/interpreter/daml-lf-step-kind.d.ts +7 -0
  57. package/dist/daml-lf/interpreter/daml-lf-step-kind.js +8 -0
  58. package/dist/daml-lf/interpreter/daml-lf-trace-sink.interface.d.ts +30 -0
  59. package/dist/daml-lf/interpreter/daml-lf-trace-sink.interface.js +1 -0
  60. package/dist/daml-lf/model/daml-lf-builtin-type.d.ts +3 -0
  61. package/dist/daml-lf/model/daml-lf-builtin-type.js +3 -0
  62. package/dist/daml-lf/model/daml-lf-choice.d.ts +5 -0
  63. package/dist/daml-lf/model/daml-lf-choice.js +4 -0
  64. package/dist/daml-lf/model/daml-lf-expression-path.d.ts +2 -0
  65. package/dist/daml-lf/model/daml-lf-expression-path.js +81 -0
  66. package/dist/daml-lf/model/daml-lf-expression.d.ts +146 -0
  67. package/dist/daml-lf/model/daml-lf-expression.js +71 -0
  68. package/dist/daml-lf/model/daml-lf-template.d.ts +2 -0
  69. package/dist/daml-lf/model/daml-lf-template.js +2 -0
  70. package/dist/daml-lf/model/daml-lf-type.d.ts +2 -0
  71. package/dist/daml-lf/model/daml-lf-type.js +4 -0
  72. package/dist/daml-lf/model/lf-2-model-mapper.d.ts +5 -0
  73. package/dist/daml-lf/model/lf-2-model-mapper.js +445 -12
  74. package/dist/debugger/errors/replay-determinism.exception.d.ts +3 -0
  75. package/dist/debugger/errors/replay-determinism.exception.js +3 -0
  76. package/dist/debugger/errors/replay-missing-package.exception.d.ts +3 -0
  77. package/dist/debugger/errors/replay-missing-package.exception.js +3 -0
  78. package/dist/debugger/errors/replay-missing-source.exception.d.ts +3 -0
  79. package/dist/debugger/errors/replay-missing-source.exception.js +3 -0
  80. package/dist/debugger/errors/replay-source-map.exception.d.ts +3 -0
  81. package/dist/debugger/errors/replay-source-map.exception.js +3 -0
  82. package/dist/debugger/errors/replay-state-hydration.exception.d.ts +3 -0
  83. package/dist/debugger/errors/replay-state-hydration.exception.js +3 -0
  84. package/dist/debugger/errors/replay-unsupported-lf-construct.exception.d.ts +3 -0
  85. package/dist/debugger/errors/replay-unsupported-lf-construct.exception.js +3 -0
  86. package/dist/debugger/errors/replay-unsupported-update.exception.d.ts +3 -0
  87. package/dist/debugger/errors/replay-unsupported-update.exception.js +3 -0
  88. package/dist/debugger/index.d.ts +31 -0
  89. package/dist/debugger/index.js +31 -0
  90. package/dist/debugger/ledger-replay-debugger-client.d.ts +31 -0
  91. package/dist/debugger/ledger-replay-debugger-client.js +53 -0
  92. package/dist/debugger/replay/ledger-replay-environment-builder.d.ts +95 -0
  93. package/dist/debugger/replay/ledger-replay-environment-builder.js +249 -0
  94. package/dist/debugger/replay/ledger-replay-session-loader.d.ts +78 -0
  95. package/dist/debugger/replay/ledger-replay-session-loader.js +565 -0
  96. package/dist/debugger/replay/replay-artifact-resolver.d.ts +30 -0
  97. package/dist/debugger/replay/replay-artifact-resolver.js +210 -0
  98. package/dist/debugger/replay/replay-determinism-validator.d.ts +12 -0
  99. package/dist/debugger/replay/replay-determinism-validator.js +161 -0
  100. package/dist/debugger/replay/replay-entrypoint-definition-resolver.d.ts +40 -0
  101. package/dist/debugger/replay/replay-entrypoint-definition-resolver.js +337 -0
  102. package/dist/debugger/replay/replay-entrypoint.d.ts +22 -0
  103. package/dist/debugger/replay/replay-entrypoint.js +14 -0
  104. package/dist/debugger/replay/replay-ledger-value-normalizer.d.ts +7 -0
  105. package/dist/debugger/replay/replay-ledger-value-normalizer.js +194 -0
  106. package/dist/debugger/replay/replay-update-loader.d.ts +24 -0
  107. package/dist/debugger/replay/replay-update-loader.js +94 -0
  108. package/dist/debugger/replay/replay-update-visibility-validator.d.ts +19 -0
  109. package/dist/debugger/replay/replay-update-visibility-validator.js +19 -0
  110. package/dist/debugger/session/in-memory-replay-session-store.d.ts +27 -0
  111. package/dist/debugger/session/in-memory-replay-session-store.js +109 -0
  112. package/dist/debugger/session/replay-phase.d.ts +7 -0
  113. package/dist/debugger/session/replay-phase.js +8 -0
  114. package/dist/debugger/session/replay-scope.d.ts +10 -0
  115. package/dist/debugger/session/replay-scope.js +10 -0
  116. package/dist/debugger/session/replay-session-metadata.d.ts +10 -0
  117. package/dist/debugger/session/replay-session-metadata.js +10 -0
  118. package/dist/debugger/session/replay-session-request.d.ts +6 -0
  119. package/dist/debugger/session/replay-session-request.js +10 -0
  120. package/dist/debugger/session/replay-session.d.ts +12 -0
  121. package/dist/debugger/session/replay-session.js +10 -0
  122. package/dist/debugger/session/replay-source-location.d.ts +17 -0
  123. package/dist/debugger/session/replay-source-location.js +16 -0
  124. package/dist/debugger/session/replay-stack-frame.d.ts +8 -0
  125. package/dist/debugger/session/replay-stack-frame.js +8 -0
  126. package/dist/debugger/session/replay-state-delta.d.ts +29 -0
  127. package/dist/debugger/session/replay-state-delta.js +24 -0
  128. package/dist/debugger/session/replay-step-advance-result.d.ts +24 -0
  129. package/dist/debugger/session/replay-step-advance-result.js +16 -0
  130. package/dist/debugger/session/replay-step.d.ts +30 -0
  131. package/dist/debugger/session/replay-step.js +24 -0
  132. package/dist/debugger/session/replay-value-preview.d.ts +8 -0
  133. package/dist/debugger/session/replay-value-preview.js +15 -0
  134. package/dist/debugger/source/daml-source-mapper.d.ts +12 -0
  135. package/dist/debugger/source/daml-source-mapper.js +21 -0
  136. package/dist/debugger/source/dar-source-map-metadata.d.ts +26 -0
  137. package/dist/debugger/source/dar-source-map-metadata.js +10 -0
  138. package/dist/debugger/source/source-coverage-validator.d.ts +8 -0
  139. package/dist/debugger/source/source-coverage-validator.js +16 -0
  140. package/dist/debugger/source/source-indexed-compilation.d.ts +45 -0
  141. package/dist/debugger/source/source-indexed-compilation.js +110 -0
  142. package/dist/debugger/source/source-mapping-precision.d.ts +5 -0
  143. package/dist/debugger/source/source-mapping-precision.js +4 -0
  144. package/dist/index.d.ts +21 -0
  145. package/dist/index.js +13 -0
  146. package/dist/query/cache/memory-query-cache.d.ts +9 -0
  147. package/dist/query/cache/memory-query-cache.js +24 -0
  148. package/dist/query/cache/query-cache-store.d.ts +5 -0
  149. package/dist/query/cache/query-cache-store.js +1 -0
  150. package/dist/query/canton-manager-options.d.ts +17 -0
  151. package/dist/query/canton-manager-options.js +1 -0
  152. package/dist/query/canton-manager.d.ts +11 -0
  153. package/dist/query/canton-manager.js +42 -0
  154. package/dist/query/errors/pqs-query-error.d.ts +10 -0
  155. package/dist/query/errors/pqs-query-error.js +11 -0
  156. package/dist/query/errors/pqs-schema-profile-error.d.ts +3 -0
  157. package/dist/query/errors/pqs-schema-profile-error.js +3 -0
  158. package/dist/query/errors/query-capability-error.d.ts +7 -0
  159. package/dist/query/errors/query-capability-error.js +10 -0
  160. package/dist/query/grpc/grpc-contract-query-client.d.ts +32 -0
  161. package/dist/query/grpc/grpc-contract-query-client.js +126 -0
  162. package/dist/query/model-types.d.ts +258 -0
  163. package/dist/query/model-types.js +14 -0
  164. package/dist/query/pqs/pqs-pool.d.ts +13 -0
  165. package/dist/query/pqs/pqs-pool.js +18 -0
  166. package/dist/query/pqs/pqs-query-client.d.ts +49 -0
  167. package/dist/query/pqs/pqs-query-client.js +324 -0
  168. package/dist/query/pqs/pqs-schema-profile.d.ts +25 -0
  169. package/dist/query/pqs/pqs-schema-profile.js +120 -0
  170. package/dist/query/pqs/pqs-sql-compiler.d.ts +7 -0
  171. package/dist/query/pqs/pqs-sql-compiler.js +132 -0
  172. package/dist/query/pqs/read-only-sql.d.ts +1 -0
  173. package/dist/query/pqs/read-only-sql.js +35 -0
  174. package/dist/query/query-client.d.ts +61 -0
  175. package/dist/query/query-client.js +1 -0
  176. package/dist/query/query-source.d.ts +4 -0
  177. package/dist/query/query-source.js +5 -0
  178. package/dist/services/command/command-service-client.d.ts +2 -2
  179. package/dist/services/commands/command-submission-pipeline.d.ts +2 -2
  180. package/dist/services/party-management/decentralized-party-lifecycle.d.ts +6 -0
  181. package/dist/services/party-management/decentralized-party-lifecycle.js +82 -0
  182. package/dist/services/party-management/party-management-service-client.d.ts +16 -1
  183. package/dist/services/party-management/party-management-service-client.js +142 -1
  184. package/dist/services/topology-manager-write/topology-signed-transaction-assembler.js +4 -0
  185. package/dist/testing/campaign/campaign-artifact.d.ts +20 -0
  186. package/dist/testing/campaign/campaign-artifact.js +147 -0
  187. package/dist/testing/campaign/campaign-definition.d.ts +9 -0
  188. package/dist/testing/campaign/campaign-definition.js +78 -0
  189. package/dist/testing/campaign/campaign-metrics.d.ts +32 -0
  190. package/dist/testing/campaign/campaign-metrics.js +26 -0
  191. package/dist/testing/campaign/campaign-model.d.ts +11 -0
  192. package/dist/testing/campaign/campaign-model.js +21 -0
  193. package/dist/testing/campaign/campaign-runner.d.ts +99 -0
  194. package/dist/testing/campaign/campaign-runner.js +194 -0
  195. package/dist/testing/campaign/campaign-scheduler.d.ts +40 -0
  196. package/dist/testing/campaign/campaign-scheduler.js +75 -0
  197. package/dist/testing/campaign/campaign-types.d.ts +52 -0
  198. package/dist/testing/campaign/campaign-types.js +11 -0
  199. package/dist/testing/daml/daml-action-arbitrary.d.ts +13 -0
  200. package/dist/testing/daml/daml-action-arbitrary.js +24 -0
  201. package/dist/testing/daml/daml-choice-action-arbitrary.d.ts +18 -0
  202. package/dist/testing/daml/daml-choice-action-arbitrary.js +27 -0
  203. package/dist/testing/daml/daml-create-action-arbitrary.d.ts +19 -0
  204. package/dist/testing/daml/daml-create-action-arbitrary.js +34 -0
  205. package/dist/testing/daml/daml-testing-catalog.d.ts +38 -0
  206. package/dist/testing/daml/daml-testing-catalog.js +40 -0
  207. package/dist/testing/daml/daml-value-arbitrary.d.ts +8 -0
  208. package/dist/testing/daml/daml-value-arbitrary.js +43 -0
  209. package/dist/testing/daml/declarative-campaign-arbitrary.d.ts +15 -0
  210. package/dist/testing/daml/declarative-campaign-arbitrary.js +30 -0
  211. package/dist/testing/errors/invariant-campaign-failure.d.ts +24 -0
  212. package/dist/testing/errors/invariant-campaign-failure.js +37 -0
  213. package/dist/testing/errors/testing-configuration-error.d.ts +3 -0
  214. package/dist/testing/errors/testing-configuration-error.js +6 -0
  215. package/dist/testing/handlers/handler.d.ts +19 -0
  216. package/dist/testing/handlers/handler.js +31 -0
  217. package/dist/testing/index.d.ts +22 -0
  218. package/dist/testing/index.js +22 -0
  219. package/dist/testing/runtime/campaign-isolation.d.ts +14 -0
  220. package/dist/testing/runtime/campaign-isolation.js +23 -0
  221. package/dist/testing/runtime/canton-test-runtime.d.ts +58 -0
  222. package/dist/testing/runtime/canton-test-runtime.js +138 -0
  223. package/dist/testing/runtime/declarative-action-executor.d.ts +16 -0
  224. package/dist/testing/runtime/declarative-action-executor.js +41 -0
  225. package/dist/testing/targets/target.d.ts +49 -0
  226. package/dist/testing/targets/target.js +121 -0
  227. package/dist/transports/grpc/grpc-channel-factory.js +31 -1
  228. package/dist/transports/grpc/grpc-transport.d.ts +2 -2
  229. package/dist/transports/grpc/grpc-transport.js +11 -8
  230. package/dist/transports/grpc/mappers/commands-mapper.js +23 -2
  231. package/dist/transports/grpc/mappers/contracts-mapper.d.ts +3 -1
  232. package/dist/transports/grpc/mappers/contracts-mapper.js +16 -3
  233. package/dist/transports/grpc/mappers/interactive-command-mapper.d.ts +4 -1
  234. package/dist/transports/grpc/mappers/interactive-command-mapper.js +3 -8
  235. package/dist/transports/grpc/mappers/topology-manager-write-mapper.js +59 -1
  236. package/dist/transports/json/mappers/commands-mapper.js +20 -6
  237. package/node/.generated/start-local/additional-config.extra-participants.conf +37 -0
  238. package/node/.generated/start-local/additional-config.extra-validators.conf +35 -0
  239. package/node/.generated/start-local/compose-extra-participants.yaml +147 -0
  240. package/node/.generated/start-local/extra-participants.env +30 -0
  241. package/node/es256-jwt.mjs +177 -0
  242. package/node/start-local.sh +886 -0
  243. package/node/stop-local.sh +200 -0
  244. package/node/test-start-local.sh +354 -0
  245. package/node/test-stop-local.sh +112 -0
  246. package/package.json +21 -2
@@ -0,0 +1,565 @@
1
+ import { ReplayPhase } from "../session/replay-phase.js";
2
+ import { ReplayScope } from "../session/replay-scope.js";
3
+ import { ReplaySourceLocation } from "../session/replay-source-location.js";
4
+ import { ReplaySessionMetadata } from "../session/replay-session-metadata.js";
5
+ import { ReplayStackFrame } from "../session/replay-stack-frame.js";
6
+ import { ReplayStateDelta } from "../session/replay-state-delta.js";
7
+ import { ReplayStep } from "../session/replay-step.js";
8
+ import { ReplayValuePreview } from "../session/replay-value-preview.js";
9
+ import { SourceMappingPrecision, } from "../source/source-mapping-precision.js";
10
+ import { attachReplayRecordId } from "./replay-ledger-value-normalizer.js";
11
+ export class LedgerReplaySessionLoader {
12
+ dependencies;
13
+ constructor(dependencies) {
14
+ this.dependencies = dependencies;
15
+ }
16
+ async loadOrThrowAsync(request) {
17
+ const snapshot = await this.dependencies.updateLoader.loadOrThrowAsync(request.offset);
18
+ const environment = await this.dependencies.environmentBuilder.buildOrThrowAsync(snapshot);
19
+ const definition = this.dependencies.definitionResolver.resolveEntrypointDefinitionOrThrow(snapshot.entrypoint);
20
+ const traceSteps = [];
21
+ const evaluation = this.dependencies.evaluator.evaluateReplayEntrypointOrThrow(definition.definition, {
22
+ ...environment,
23
+ observedCreateContractIds: snapshot.events.flatMap((event) => event.event?.oneofKind === "created"
24
+ && event.event.created?.contractId !== undefined
25
+ ? [event.event.created.contractId]
26
+ : []),
27
+ entrypoint: {
28
+ ...environment.entrypoint,
29
+ argument: definition.entrypointArgumentRecordId === undefined
30
+ ? environment.entrypoint.argument
31
+ : attachReplayRecordId(environment.entrypoint.argument, definition.entrypointArgumentRecordId),
32
+ },
33
+ definitionResolver: this.dependencies.definitionResolver,
34
+ entrypointExpression: definition.replayExpression,
35
+ entrypointBindingMode: definition.replayBindingMode,
36
+ }, {
37
+ onStep: (step) => {
38
+ traceSteps.push(step);
39
+ },
40
+ });
41
+ this.dependencies.determinismValidator.validateOrThrow(snapshot, evaluation.effects);
42
+ const sessionId = this.dependencies.sessionIdFactory?.() ?? crypto.randomUUID();
43
+ const projectedSteps = this.projectReplaySteps(traceSteps, environment);
44
+ const steps = projectedSteps.map((item) => item.step);
45
+ return {
46
+ sessionId,
47
+ metadata: new ReplaySessionMetadata({
48
+ sessionId,
49
+ offset: snapshot.offset,
50
+ stepCount: steps.length,
51
+ }),
52
+ steps,
53
+ scopesByStep: projectedSteps.map((item) => item.scopes),
54
+ currentStepIndex: 0,
55
+ };
56
+ }
57
+ projectReplaySteps(traceSteps, environment) {
58
+ const rawSteps = this.projectRawReplaySteps(traceSteps, environment);
59
+ if (this.dependencies.sourceMapper === undefined) {
60
+ return rawSteps;
61
+ }
62
+ return this.projectNavigableReplaySteps(rawSteps);
63
+ }
64
+ projectRawReplaySteps(traceSteps, environment) {
65
+ const activeFrames = [];
66
+ const frameScopes = new Map();
67
+ const frameExpressionDepth = new Map();
68
+ const frameCallDepth = new Map();
69
+ const contractTypeById = this.createContractTypeIndex(environment.contracts);
70
+ let eventOrdinal = 0;
71
+ return traceSteps.map((traceStep, stepIndex) => {
72
+ this.rememberFrameScope(frameScopes, traceStep, contractTypeById);
73
+ this.prepareStackForStep(traceStep, activeFrames, frameExpressionDepth, frameCallDepth);
74
+ const stackFrames = activeFrames.map((frame) => new ReplayStackFrame({
75
+ frameId: frame.frameId,
76
+ name: frame.name,
77
+ }));
78
+ const scopes = stackFrames.map((frame) => this.cloneScope(frameScopes.get(frame.frameId ?? "") ?? new ReplayScope({
79
+ frameId: frame.frameId,
80
+ name: frame.name,
81
+ variables: [],
82
+ })));
83
+ const currentScope = scopes.find((scope) => scope.frameId === traceStep.frame.frameId);
84
+ const projectedStep = new ReplayStep({
85
+ stepId: `step-${stepIndex}`,
86
+ stepIndex,
87
+ phase: this.toReplayPhase(traceStep),
88
+ stackFrames,
89
+ scopes,
90
+ locals: currentScope?.variables ?? [],
91
+ arguments: traceStep.stateEffect?.argument === undefined
92
+ ? []
93
+ : [traceStep.stateEffect.argument],
94
+ valuePreview: this.createValuePreview(traceStep),
95
+ stateDelta: traceStep.stateEffect === undefined
96
+ ? undefined
97
+ : this.createStateDelta(traceStep.stateEffect, eventOrdinal),
98
+ sourceLocation: this.createSourceLocation(traceStep),
99
+ });
100
+ if (traceStep.stateEffect !== undefined) {
101
+ this.rememberStateEffectContractType(traceStep.stateEffect, contractTypeById);
102
+ eventOrdinal += 1;
103
+ }
104
+ this.finalizeStackForStep(traceStep, activeFrames, frameExpressionDepth, frameCallDepth);
105
+ return {
106
+ step: projectedStep,
107
+ scopes,
108
+ traceStep,
109
+ };
110
+ });
111
+ }
112
+ projectNavigableReplaySteps(rawSteps) {
113
+ const navigableSteps = [];
114
+ let previousVisibleExpressionKey;
115
+ for (const rawStep of rawSteps) {
116
+ const { step, traceStep } = rawStep;
117
+ if (step.phase === ReplayPhase.stateEffect) {
118
+ previousVisibleExpressionKey = undefined;
119
+ navigableSteps.push(rawStep);
120
+ continue;
121
+ }
122
+ if (step.sourceLocation?.precision
123
+ !== SourceMappingPrecision.exact) {
124
+ continue;
125
+ }
126
+ if (step.phase === ReplayPhase.call
127
+ || step.phase === ReplayPhase.return) {
128
+ if (!this.shouldRetainDefinitionTransition(step, traceStep)) {
129
+ continue;
130
+ }
131
+ previousVisibleExpressionKey = undefined;
132
+ navigableSteps.push(rawStep);
133
+ continue;
134
+ }
135
+ if (traceStep.kind !== "enterExpression"
136
+ && traceStep.kind !== "exitExpression") {
137
+ continue;
138
+ }
139
+ const previousStep = navigableSteps.at(-1)?.step;
140
+ if (!this.shouldRetainExpressionStep(step, traceStep, previousStep)) {
141
+ continue;
142
+ }
143
+ const visibleExpressionKey = this.createVisibleExpressionKey(step);
144
+ if (visibleExpressionKey === previousVisibleExpressionKey) {
145
+ continue;
146
+ }
147
+ previousVisibleExpressionKey = visibleExpressionKey;
148
+ navigableSteps.push(rawStep);
149
+ }
150
+ return navigableSteps.map((item, stepIndex) => ({
151
+ ...item,
152
+ step: new ReplayStep({
153
+ stepId: item.step.stepId,
154
+ stepIndex,
155
+ phase: item.step.phase,
156
+ stackFrames: item.step.stackFrames,
157
+ scopes: item.step.scopes,
158
+ locals: item.step.locals,
159
+ arguments: item.step.arguments,
160
+ sourceLocation: item.step.sourceLocation,
161
+ valuePreview: item.step.valuePreview,
162
+ stateDelta: item.step.stateDelta,
163
+ }),
164
+ }));
165
+ }
166
+ createSourceLocationKey(source) {
167
+ return [
168
+ source.path,
169
+ source.startLine,
170
+ source.startColumn,
171
+ source.endLine,
172
+ source.endColumn,
173
+ ].join(":");
174
+ }
175
+ createVisibleExpressionKey(step) {
176
+ const source = step.sourceLocation;
177
+ return [
178
+ source === undefined
179
+ ? "no-source"
180
+ : [
181
+ source.path,
182
+ source.startLine,
183
+ source.endLine,
184
+ ].join(":"),
185
+ step.stackFrames.map((frame) => frame.frameId ?? frame.name ?? "?").join(">"),
186
+ JSON.stringify(step.locals),
187
+ ].join("|");
188
+ }
189
+ shouldRetainDefinitionTransition(step, traceStep) {
190
+ return this.isMeaningfulDefinitionExpression(traceStep.frame.definition.expression)
191
+ || this.hasVisibleLocalsChange(undefined, step);
192
+ }
193
+ shouldRetainExpressionStep(step, traceStep, previousStep) {
194
+ if (this.hasVisibleLocalsChange(previousStep, step)) {
195
+ return true;
196
+ }
197
+ return this.isMeaningfulDebuggerExpression(traceStep.expression);
198
+ }
199
+ hasVisibleLocalsChange(previousStep, currentStep) {
200
+ return JSON.stringify(previousStep?.locals ?? [])
201
+ !== JSON.stringify(currentStep.locals);
202
+ }
203
+ isMeaningfulDebuggerExpression(expression) {
204
+ if (expression.application !== undefined
205
+ || expression.letExpression !== undefined
206
+ || expression.caseExpression !== undefined
207
+ || expression.updateExpression !== undefined
208
+ || expression.lambda !== undefined) {
209
+ return true;
210
+ }
211
+ if (expression.valueReference !== undefined
212
+ && this.dependencies.sourceMapper !== undefined) {
213
+ try {
214
+ const referencedDefinition = this.dependencies.sourceMapper.getValueDefinitionOrThrow(expression.valueReference.packageId, expression.valueReference.moduleName, expression.valueReference.definitionName);
215
+ return this.isMeaningfulDefinitionExpression(referencedDefinition.expression);
216
+ }
217
+ catch {
218
+ return false;
219
+ }
220
+ }
221
+ return false;
222
+ }
223
+ isMeaningfulDefinitionExpression(expression) {
224
+ return (expression.application !== undefined
225
+ || expression.letExpression !== undefined
226
+ || expression.caseExpression !== undefined
227
+ || expression.updateExpression !== undefined
228
+ || expression.lambda !== undefined);
229
+ }
230
+ toReplayPhase(traceStep) {
231
+ switch (traceStep.kind) {
232
+ case "stateEffect":
233
+ return ReplayPhase.stateEffect;
234
+ case "call":
235
+ return ReplayPhase.call;
236
+ case "return":
237
+ return ReplayPhase.return;
238
+ case "enterExpression":
239
+ return ReplayPhase.enterExpression;
240
+ case "exitExpression":
241
+ return ReplayPhase.exitExpression;
242
+ default:
243
+ return ReplayPhase.enterExpression;
244
+ }
245
+ }
246
+ createValuePreview(traceStep) {
247
+ if (traceStep.stateEffect !== undefined) {
248
+ const display = traceStep.stateEffect.contractId
249
+ ?? traceStep.stateEffect.choice
250
+ ?? traceStep.stateEffect.kind;
251
+ return new ReplayValuePreview({
252
+ kind: traceStep.stateEffect.kind,
253
+ display,
254
+ });
255
+ }
256
+ if (traceStep.value === undefined) {
257
+ return undefined;
258
+ }
259
+ return new ReplayValuePreview({
260
+ kind: traceStep.value.kind,
261
+ display: this.stringifyRuntimeValue(traceStep.value),
262
+ });
263
+ }
264
+ createStateDelta(effect, eventOrdinal) {
265
+ const common = {
266
+ kind: effect.kind,
267
+ eventOrdinal,
268
+ comparisonKey: `event-${eventOrdinal}`,
269
+ };
270
+ switch (effect.kind) {
271
+ case "create":
272
+ return new ReplayStateDelta({
273
+ ...common,
274
+ createdContractId: effect.contractId,
275
+ templateId: effect.templateId,
276
+ payload: effect.payload,
277
+ });
278
+ case "exercise":
279
+ return new ReplayStateDelta({
280
+ ...common,
281
+ targetContractId: effect.contractId,
282
+ templateId: effect.templateId,
283
+ choice: effect.choice,
284
+ choiceArgument: effect.argument,
285
+ payload: effect.payload,
286
+ });
287
+ case "archive":
288
+ return new ReplayStateDelta({
289
+ ...common,
290
+ targetContractId: effect.contractId,
291
+ templateId: effect.templateId,
292
+ });
293
+ default:
294
+ return new ReplayStateDelta(common);
295
+ }
296
+ }
297
+ stringifyRuntimeValue(value) {
298
+ if ("value" in value && typeof value.value === "string") {
299
+ return value.value.length > 0 ? value.value : "\"\"";
300
+ }
301
+ if ("value" in value) {
302
+ try {
303
+ const serialized = JSON.stringify(value.value);
304
+ if (typeof serialized === "string" && serialized.length > 0) {
305
+ return serialized;
306
+ }
307
+ }
308
+ catch {
309
+ // Fall through to a lossy scalar representation when preview
310
+ // values are not JSON-serializable.
311
+ }
312
+ if (value.value === undefined) {
313
+ return "undefined";
314
+ }
315
+ if (value.value === null) {
316
+ return "null";
317
+ }
318
+ return String(value.value);
319
+ }
320
+ return typeof value.kind === "string" ? value.kind : "value";
321
+ }
322
+ rememberFrameScope(frameScopes, traceStep, contractTypeById) {
323
+ const frameName = this.resolveFrameName(traceStep);
324
+ frameScopes.set(traceStep.frame.frameId, new ReplayScope({
325
+ frameId: traceStep.frame.frameId,
326
+ name: frameName,
327
+ variables: traceStep.locals.map((local) => ({
328
+ name: local.name,
329
+ kind: local.value.kind,
330
+ value: this.stringifyRuntimeValue(local.value),
331
+ contractType: this.resolveRuntimeValueContractType(local.value, contractTypeById),
332
+ })),
333
+ }));
334
+ }
335
+ createContractTypeIndex(contracts) {
336
+ const index = new Map();
337
+ for (const [contractId, contract] of contracts.entries()) {
338
+ const contractType = this.formatTemplateType(contract.templateId);
339
+ if (contractType !== undefined) {
340
+ index.set(contractId, contractType);
341
+ }
342
+ }
343
+ return index;
344
+ }
345
+ rememberStateEffectContractType(effect, contractTypeById) {
346
+ if (effect.kind !== "create" || effect.contractId === undefined) {
347
+ return;
348
+ }
349
+ const contractType = this.formatTemplateType(effect.templateId);
350
+ if (contractType !== undefined) {
351
+ contractTypeById.set(effect.contractId, contractType);
352
+ }
353
+ }
354
+ resolveRuntimeValueContractType(value, contractTypeById) {
355
+ if (value.kind === "contractId"
356
+ && "value" in value
357
+ && typeof value.value === "string") {
358
+ return contractTypeById.get(value.value);
359
+ }
360
+ if (value.kind === "contractId[]"
361
+ && "value" in value
362
+ && Array.isArray(value.value)) {
363
+ for (const contractId of value.value) {
364
+ if (typeof contractId !== "string") {
365
+ continue;
366
+ }
367
+ const contractType = contractTypeById.get(contractId);
368
+ if (contractType !== undefined) {
369
+ return contractType;
370
+ }
371
+ }
372
+ }
373
+ return undefined;
374
+ }
375
+ formatTemplateType(templateId) {
376
+ if (templateId?.moduleName !== undefined
377
+ && templateId.entityName !== undefined) {
378
+ return `${templateId.moduleName}:${templateId.entityName}`;
379
+ }
380
+ return templateId?.entityName;
381
+ }
382
+ prepareStackForStep(traceStep, activeFrames, frameExpressionDepth, frameCallDepth) {
383
+ const frame = new ReplayStackFrame({
384
+ frameId: traceStep.frame.frameId,
385
+ name: this.resolveFrameName(traceStep),
386
+ });
387
+ if (traceStep.kind === "call") {
388
+ this.pushFrameIfMissing(activeFrames, frame);
389
+ frameCallDepth.set(traceStep.frame.frameId, (frameCallDepth.get(traceStep.frame.frameId) ?? 0) + 1);
390
+ return;
391
+ }
392
+ this.pushFrameIfMissing(activeFrames, frame);
393
+ if (traceStep.kind === "enterExpression") {
394
+ frameExpressionDepth.set(traceStep.frame.frameId, (frameExpressionDepth.get(traceStep.frame.frameId) ?? 0) + 1);
395
+ }
396
+ }
397
+ finalizeStackForStep(traceStep, activeFrames, frameExpressionDepth, frameCallDepth) {
398
+ if (traceStep.kind === "exitExpression") {
399
+ const nextDepth = (frameExpressionDepth.get(traceStep.frame.frameId) ?? 1) - 1;
400
+ if (nextDepth <= 0) {
401
+ frameExpressionDepth.delete(traceStep.frame.frameId);
402
+ if ((frameCallDepth.get(traceStep.frame.frameId) ?? 0) === 0) {
403
+ this.popFrameIfTop(activeFrames, traceStep.frame.frameId);
404
+ }
405
+ }
406
+ else {
407
+ frameExpressionDepth.set(traceStep.frame.frameId, nextDepth);
408
+ }
409
+ return;
410
+ }
411
+ if (traceStep.kind === "return") {
412
+ const nextCallDepth = (frameCallDepth.get(traceStep.frame.frameId) ?? 1) - 1;
413
+ if (nextCallDepth <= 0) {
414
+ frameCallDepth.delete(traceStep.frame.frameId);
415
+ }
416
+ else {
417
+ frameCallDepth.set(traceStep.frame.frameId, nextCallDepth);
418
+ }
419
+ this.popFrameIfTop(activeFrames, traceStep.frame.frameId);
420
+ }
421
+ }
422
+ pushFrameIfMissing(activeFrames, frame) {
423
+ const activeIndex = activeFrames.findIndex((candidate) => candidate.frameId === frame.frameId);
424
+ if (activeIndex >= 0) {
425
+ activeFrames.splice(activeIndex + 1);
426
+ return;
427
+ }
428
+ activeFrames.push(frame);
429
+ }
430
+ popFrameIfTop(activeFrames, frameId) {
431
+ if (activeFrames.at(-1)?.frameId === frameId) {
432
+ activeFrames.pop();
433
+ }
434
+ }
435
+ cloneScope(scope) {
436
+ return new ReplayScope({
437
+ frameId: scope.frameId,
438
+ name: scope.name,
439
+ variables: [...scope.variables],
440
+ });
441
+ }
442
+ resolveFrameName(traceStep) {
443
+ const definitionName = traceStep.frame.definition.name;
444
+ const generatedHelper = this.isGeneratedHelperDefinitionName(definitionName);
445
+ if (this.dependencies.sourceMapper === undefined) {
446
+ return generatedHelper
447
+ ? this.formatGeneratedHelperLabel(definitionName)
448
+ : definitionName;
449
+ }
450
+ try {
451
+ const source = this.dependencies.sourceMapper.getDefinitionSourceOrThrow(traceStep.frame.packageId, traceStep.frame.moduleName, definitionName);
452
+ const label = this.formatExecutableFrameLabel(source);
453
+ if (label !== undefined) {
454
+ return generatedHelper
455
+ ? this.formatGeneratedHelperLabel(label)
456
+ : label;
457
+ }
458
+ }
459
+ catch {
460
+ // Fall through to source-span and effect-based resolution when the
461
+ // current frame definition has no executable metadata of its own.
462
+ }
463
+ const sourceLocation = this.createSourceLocation(traceStep);
464
+ if (sourceLocation?.path !== undefined
465
+ && sourceLocation.startLine !== undefined
466
+ && sourceLocation.startColumn !== undefined) {
467
+ const enclosingSource = this.dependencies.sourceMapper.findExecutableSourceAt(sourceLocation.path, sourceLocation.startLine, sourceLocation.startColumn);
468
+ const label = enclosingSource === undefined
469
+ ? undefined
470
+ : this.formatExecutableFrameLabel(enclosingSource);
471
+ if (label !== undefined) {
472
+ return generatedHelper
473
+ ? this.formatGeneratedHelperLabel(label)
474
+ : label;
475
+ }
476
+ }
477
+ const effectLabel = this.formatReplayEffectFrameLabel(traceStep.stateEffect);
478
+ if (effectLabel !== undefined) {
479
+ return generatedHelper
480
+ ? this.formatGeneratedHelperLabel(effectLabel)
481
+ : effectLabel;
482
+ }
483
+ return generatedHelper
484
+ ? this.formatGeneratedHelperLabel(definitionName)
485
+ : definitionName;
486
+ }
487
+ isGeneratedHelperDefinitionName(definitionName) {
488
+ return /^\$+/.test(definitionName);
489
+ }
490
+ formatGeneratedHelperLabel(context) {
491
+ return `generated helper from ${context}`;
492
+ }
493
+ formatExecutableFrameLabel(source) {
494
+ if (source.entrypointKind === "exercise"
495
+ && source.templateName !== undefined
496
+ && source.choiceName !== undefined) {
497
+ return `${source.templateName}.${source.choiceName}`;
498
+ }
499
+ if (source.entrypointKind === "create"
500
+ && source.templateName !== undefined) {
501
+ return `${source.templateName}.create`;
502
+ }
503
+ return undefined;
504
+ }
505
+ formatReplayEffectFrameLabel(effect) {
506
+ if (effect?.templateId?.entityName === undefined) {
507
+ return undefined;
508
+ }
509
+ if (effect.kind === "create") {
510
+ return `${effect.templateId.entityName}.create`;
511
+ }
512
+ if (effect.kind === "exercise"
513
+ && effect.choice !== undefined) {
514
+ return `${effect.templateId.entityName}.${effect.choice}`;
515
+ }
516
+ return undefined;
517
+ }
518
+ createSourceLocation(traceStep) {
519
+ if (this.dependencies.sourceMapper === undefined) {
520
+ return undefined;
521
+ }
522
+ try {
523
+ const compilerExpressionSource = this.dependencies.sourceMapper.getExpressionSource(traceStep.expression);
524
+ if (compilerExpressionSource !== undefined) {
525
+ return new ReplaySourceLocation({
526
+ path: compilerExpressionSource.path,
527
+ startLine: compilerExpressionSource.startLine + 1,
528
+ startColumn: compilerExpressionSource.startColumn + 1,
529
+ endLine: compilerExpressionSource.endLine + 1,
530
+ endColumn: compilerExpressionSource.endColumn + 1,
531
+ precision: SourceMappingPrecision.exact,
532
+ });
533
+ }
534
+ const expressionSource = traceStep.expression.sourceLocation;
535
+ if (expressionSource !== undefined) {
536
+ const packageId = expressionSource.packageId ?? traceStep.frame.packageId;
537
+ const moduleName = expressionSource.moduleName ?? traceStep.frame.moduleName;
538
+ const moduleSource = this.dependencies.sourceMapper.getModuleSourceOrThrow(packageId, moduleName);
539
+ return new ReplaySourceLocation({
540
+ path: moduleSource.path,
541
+ startLine: expressionSource.startLine + 1,
542
+ startColumn: expressionSource.startColumn + 1,
543
+ endLine: expressionSource.endLine + 1,
544
+ endColumn: expressionSource.endColumn + 1,
545
+ precision: SourceMappingPrecision.exact,
546
+ });
547
+ }
548
+ if (traceStep.stateEffect === undefined) {
549
+ return undefined;
550
+ }
551
+ const source = this.dependencies.sourceMapper.getDefinitionSourceOrThrow(traceStep.frame.packageId, traceStep.frame.moduleName, traceStep.frame.definition.name);
552
+ return new ReplaySourceLocation({
553
+ path: source.path,
554
+ startLine: source.startLine,
555
+ startColumn: source.startColumn,
556
+ endLine: source.endLine,
557
+ endColumn: source.endColumn,
558
+ precision: source.precision,
559
+ });
560
+ }
561
+ catch {
562
+ return undefined;
563
+ }
564
+ }
565
+ }
@@ -0,0 +1,30 @@
1
+ import { GetDarRequest } from "../../core/types/requests/get-dar-request.js";
2
+ import { GetPackageReferencesRequest } from "../../core/types/requests/get-package-references-request.js";
3
+ import { ParticipantDarDescription } from "../../core/types/participant-dar-description.js";
4
+ interface IParticipantPackageReadService {
5
+ getPackageReferencesAsync(request: GetPackageReferencesRequest): Promise<{
6
+ dars: ParticipantDarDescription[];
7
+ }>;
8
+ getDarAsync(request: GetDarRequest): Promise<{
9
+ payload: Uint8Array;
10
+ }>;
11
+ }
12
+ export declare class ReplayArtifactResolver {
13
+ private readonly dependencies;
14
+ private readonly archiveLoader;
15
+ private readonly packageLoader;
16
+ private readonly sourceBundleLoader;
17
+ constructor(dependencies: {
18
+ participantPackageService: IParticipantPackageReadService;
19
+ });
20
+ resolveAsync(requiredPackageIds: readonly string[]): Promise<{
21
+ dars: readonly ParticipantDarDescription[];
22
+ packageIds: readonly string[];
23
+ }>;
24
+ private static createFingerprint;
25
+ private resolveSourceMappedDarCandidateOrThrowAsync;
26
+ private readPackageGraph;
27
+ private readImportedPackageIds;
28
+ private tryResolveImportedPackageId;
29
+ }
30
+ export {};