@matter/testing 0.17.9 → 0.18.0-alpha.0-20260812-4d7f2790e

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 (277) hide show
  1. package/dist/cjs/chai.js +4 -4
  2. package/dist/cjs/chai.js.map +2 -2
  3. package/dist/cjs/chip/cert/cert-context.d.ts +115 -0
  4. package/dist/cjs/chip/cert/cert-context.d.ts.map +1 -0
  5. package/dist/cjs/chip/cert/cert-context.js +22 -0
  6. package/dist/cjs/chip/cert/cert-context.js.map +6 -0
  7. package/dist/cjs/chip/cert/cert-dsl.d.ts +48 -0
  8. package/dist/cjs/chip/cert/cert-dsl.d.ts.map +1 -0
  9. package/dist/cjs/chip/cert/cert-dsl.js +308 -0
  10. package/dist/cjs/chip/cert/cert-dsl.js.map +6 -0
  11. package/dist/cjs/chip/cert/cert-test.d.ts +46 -0
  12. package/dist/cjs/chip/cert/cert-test.d.ts.map +1 -0
  13. package/dist/cjs/chip/cert/cert-test.js +250 -0
  14. package/dist/cjs/chip/cert/cert-test.js.map +6 -0
  15. package/dist/cjs/chip/cert/chip-app-subject.d.ts +80 -0
  16. package/dist/cjs/chip/cert/chip-app-subject.d.ts.map +1 -0
  17. package/dist/cjs/chip/cert/chip-app-subject.js +337 -0
  18. package/dist/cjs/chip/cert/chip-app-subject.js.map +6 -0
  19. package/dist/cjs/chip/cert/controller-adapter.d.ts +119 -0
  20. package/dist/cjs/chip/cert/controller-adapter.d.ts.map +1 -0
  21. package/dist/cjs/chip/cert/controller-adapter.js +45 -0
  22. package/dist/cjs/chip/cert/controller-adapter.js.map +6 -0
  23. package/dist/cjs/chip/cert/device-config.d.ts +15 -0
  24. package/dist/cjs/chip/cert/device-config.d.ts.map +1 -0
  25. package/dist/cjs/chip/cert/device-config.js +43 -0
  26. package/dist/cjs/chip/cert/device-config.js.map +6 -0
  27. package/dist/cjs/chip/cert/evidence.d.ts +70 -0
  28. package/dist/cjs/chip/cert/evidence.d.ts.map +1 -0
  29. package/dist/cjs/chip/cert/evidence.js +128 -0
  30. package/dist/cjs/chip/cert/evidence.js.map +6 -0
  31. package/dist/cjs/chip/cert/log-follower.d.ts +96 -0
  32. package/dist/cjs/chip/cert/log-follower.d.ts.map +1 -0
  33. package/dist/cjs/chip/cert/log-follower.js +209 -0
  34. package/dist/cjs/chip/cert/log-follower.js.map +6 -0
  35. package/dist/cjs/chip/cert/matterjs-subject-registry.d.ts +22 -0
  36. package/dist/cjs/chip/cert/matterjs-subject-registry.d.ts.map +1 -0
  37. package/dist/cjs/chip/cert/matterjs-subject-registry.js +40 -0
  38. package/dist/cjs/chip/cert/matterjs-subject-registry.js.map +6 -0
  39. package/dist/cjs/chip/cert/prompt-driven-python-test.d.ts +40 -0
  40. package/dist/cjs/chip/cert/prompt-driven-python-test.d.ts.map +1 -0
  41. package/dist/cjs/chip/cert/prompt-driven-python-test.js +77 -0
  42. package/dist/cjs/chip/cert/prompt-driven-python-test.js.map +6 -0
  43. package/dist/cjs/chip/chip-bins.d.ts +132 -0
  44. package/dist/cjs/chip/chip-bins.d.ts.map +1 -0
  45. package/dist/cjs/chip/chip-bins.js +232 -0
  46. package/dist/cjs/chip/chip-bins.js.map +6 -0
  47. package/dist/cjs/chip/chip-test-common.d.ts.map +1 -1
  48. package/dist/cjs/chip/chip-test-common.js +1 -1
  49. package/dist/cjs/chip/chip-test-common.js.map +1 -1
  50. package/dist/cjs/chip/chip.d.ts.map +1 -1
  51. package/dist/cjs/chip/chip.js +1 -1
  52. package/dist/cjs/chip/chip.js.map +1 -1
  53. package/dist/cjs/chip/config.d.ts +26 -0
  54. package/dist/cjs/chip/config.d.ts.map +1 -1
  55. package/dist/cjs/chip/config.js +11 -3
  56. package/dist/cjs/chip/config.js.map +1 -1
  57. package/dist/cjs/chip/index.d.ts +26 -0
  58. package/dist/cjs/chip/index.d.ts.map +1 -1
  59. package/dist/cjs/chip/index.js +49 -0
  60. package/dist/cjs/chip/index.js.map +2 -2
  61. package/dist/cjs/chip/pics/file.d.ts +8 -0
  62. package/dist/cjs/chip/pics/file.d.ts.map +1 -1
  63. package/dist/cjs/chip/pics/file.js +4 -1
  64. package/dist/cjs/chip/pics/file.js.map +1 -1
  65. package/dist/cjs/chip/pics/source.d.ts +8 -5
  66. package/dist/cjs/chip/pics/source.d.ts.map +1 -1
  67. package/dist/cjs/chip/pics/source.js +25 -17
  68. package/dist/cjs/chip/pics/source.js.map +1 -1
  69. package/dist/cjs/chip/python-test.d.ts +12 -0
  70. package/dist/cjs/chip/python-test.d.ts.map +1 -1
  71. package/dist/cjs/chip/python-test.js +6 -4
  72. package/dist/cjs/chip/python-test.js.map +1 -1
  73. package/dist/cjs/chip/state.d.ts.map +1 -1
  74. package/dist/cjs/chip/state.js +24 -7
  75. package/dist/cjs/chip/state.js.map +1 -1
  76. package/dist/cjs/chip/yaml-test.js +1 -1
  77. package/dist/cjs/chip/yaml-test.js.map +1 -1
  78. package/dist/cjs/cli.d.ts.map +1 -1
  79. package/dist/cjs/cli.js +33 -2
  80. package/dist/cjs/cli.js.map +1 -1
  81. package/dist/cjs/device/backchannel.d.ts.map +1 -1
  82. package/dist/cjs/device/subject.d.ts.map +1 -1
  83. package/dist/cjs/device/test.d.ts.map +1 -1
  84. package/dist/cjs/docker/container.d.ts.map +1 -1
  85. package/dist/cjs/docker/docker.d.ts.map +1 -1
  86. package/dist/cjs/docker/edit.d.ts.map +1 -1
  87. package/dist/cjs/docker/errors.d.ts.map +1 -1
  88. package/dist/cjs/docker/network.d.ts.map +1 -1
  89. package/dist/cjs/docker/terminal.d.ts.map +1 -1
  90. package/dist/cjs/failure-reporter.d.ts.map +1 -1
  91. package/dist/cjs/global-declarations.d.js +0 -1
  92. package/dist/cjs/global-declarations.d.js.map +1 -1
  93. package/dist/cjs/global-declarations.d.ts +2 -2
  94. package/dist/cjs/global-definitions.js +17 -4
  95. package/dist/cjs/global-definitions.js.map +2 -2
  96. package/dist/cjs/index.d.js +2 -0
  97. package/dist/cjs/index.d.js.map +1 -1
  98. package/dist/cjs/index.d.ts +3 -0
  99. package/dist/cjs/index.js +2 -0
  100. package/dist/cjs/index.js.map +1 -1
  101. package/dist/cjs/mocha.d.ts.map +1 -1
  102. package/dist/cjs/mocha.js +5 -0
  103. package/dist/cjs/mocha.js.map +1 -1
  104. package/dist/cjs/mocharc.cjs +4 -3
  105. package/dist/cjs/options.d.ts.map +1 -1
  106. package/dist/cjs/print-report.js +1 -1
  107. package/dist/cjs/print-report.js.map +1 -1
  108. package/dist/cjs/test-descriptor.d.ts +1 -1
  109. package/dist/cjs/test-descriptor.d.ts.map +1 -1
  110. package/dist/cjs/text-diff.d.ts.map +1 -1
  111. package/dist/cjs/util/async.d.ts +30 -0
  112. package/dist/cjs/util/async.d.ts.map +1 -0
  113. package/dist/cjs/util/async.js +85 -0
  114. package/dist/cjs/util/async.js.map +6 -0
  115. package/dist/cjs/util/trace-unhandled.d.ts.map +1 -1
  116. package/dist/cjs/util/wtf.d.ts.map +1 -1
  117. package/dist/cjs/util/wtf.js +1 -1
  118. package/dist/cjs/util/wtf.js.map +1 -1
  119. package/dist/cjs/web.d.ts.map +1 -1
  120. package/dist/cjs/web.js +5 -1
  121. package/dist/cjs/web.js.map +1 -1
  122. package/dist/esm/chai.js +1 -1
  123. package/dist/esm/chai.js.map +1 -1
  124. package/dist/esm/chip/cert/cert-context.d.ts +115 -0
  125. package/dist/esm/chip/cert/cert-context.d.ts.map +1 -0
  126. package/dist/esm/chip/cert/cert-context.js +6 -0
  127. package/dist/esm/chip/cert/cert-context.js.map +6 -0
  128. package/dist/esm/chip/cert/cert-dsl.d.ts +48 -0
  129. package/dist/esm/chip/cert/cert-dsl.d.ts.map +1 -0
  130. package/dist/esm/chip/cert/cert-dsl.js +288 -0
  131. package/dist/esm/chip/cert/cert-dsl.js.map +6 -0
  132. package/dist/esm/chip/cert/cert-test.d.ts +46 -0
  133. package/dist/esm/chip/cert/cert-test.d.ts.map +1 -0
  134. package/dist/esm/chip/cert/cert-test.js +230 -0
  135. package/dist/esm/chip/cert/cert-test.js.map +6 -0
  136. package/dist/esm/chip/cert/chip-app-subject.d.ts +80 -0
  137. package/dist/esm/chip/cert/chip-app-subject.d.ts.map +1 -0
  138. package/dist/esm/chip/cert/chip-app-subject.js +317 -0
  139. package/dist/esm/chip/cert/chip-app-subject.js.map +6 -0
  140. package/dist/esm/chip/cert/controller-adapter.d.ts +119 -0
  141. package/dist/esm/chip/cert/controller-adapter.d.ts.map +1 -0
  142. package/dist/esm/chip/cert/controller-adapter.js +25 -0
  143. package/dist/esm/chip/cert/controller-adapter.js.map +6 -0
  144. package/dist/esm/chip/cert/device-config.d.ts +15 -0
  145. package/dist/esm/chip/cert/device-config.d.ts.map +1 -0
  146. package/dist/esm/chip/cert/device-config.js +23 -0
  147. package/dist/esm/chip/cert/device-config.js.map +6 -0
  148. package/dist/esm/chip/cert/evidence.d.ts +70 -0
  149. package/dist/esm/chip/cert/evidence.d.ts.map +1 -0
  150. package/dist/esm/chip/cert/evidence.js +108 -0
  151. package/dist/esm/chip/cert/evidence.js.map +6 -0
  152. package/dist/esm/chip/cert/log-follower.d.ts +96 -0
  153. package/dist/esm/chip/cert/log-follower.d.ts.map +1 -0
  154. package/dist/esm/chip/cert/log-follower.js +189 -0
  155. package/dist/esm/chip/cert/log-follower.js.map +6 -0
  156. package/dist/esm/chip/cert/matterjs-subject-registry.d.ts +22 -0
  157. package/dist/esm/chip/cert/matterjs-subject-registry.d.ts.map +1 -0
  158. package/dist/esm/chip/cert/matterjs-subject-registry.js +20 -0
  159. package/dist/esm/chip/cert/matterjs-subject-registry.js.map +6 -0
  160. package/dist/esm/chip/cert/prompt-driven-python-test.d.ts +40 -0
  161. package/dist/esm/chip/cert/prompt-driven-python-test.d.ts.map +1 -0
  162. package/dist/esm/chip/cert/prompt-driven-python-test.js +57 -0
  163. package/dist/esm/chip/cert/prompt-driven-python-test.js.map +6 -0
  164. package/dist/esm/chip/chip-bins.d.ts +132 -0
  165. package/dist/esm/chip/chip-bins.d.ts.map +1 -0
  166. package/dist/esm/chip/chip-bins.js +212 -0
  167. package/dist/esm/chip/chip-bins.js.map +6 -0
  168. package/dist/esm/chip/chip-test-common.d.ts.map +1 -1
  169. package/dist/esm/chip/chip-test-common.js +1 -1
  170. package/dist/esm/chip/chip-test-common.js.map +1 -1
  171. package/dist/esm/chip/chip.d.ts.map +1 -1
  172. package/dist/esm/chip/chip.js +1 -1
  173. package/dist/esm/chip/chip.js.map +1 -1
  174. package/dist/esm/chip/config.d.ts +26 -0
  175. package/dist/esm/chip/config.d.ts.map +1 -1
  176. package/dist/esm/chip/config.js +11 -3
  177. package/dist/esm/chip/config.js.map +1 -1
  178. package/dist/esm/chip/index.d.ts +26 -0
  179. package/dist/esm/chip/index.d.ts.map +1 -1
  180. package/dist/esm/chip/index.js +60 -0
  181. package/dist/esm/chip/index.js.map +1 -1
  182. package/dist/esm/chip/pics/file.d.ts +8 -0
  183. package/dist/esm/chip/pics/file.d.ts.map +1 -1
  184. package/dist/esm/chip/pics/file.js +4 -1
  185. package/dist/esm/chip/pics/file.js.map +1 -1
  186. package/dist/esm/chip/pics/source.d.ts +8 -5
  187. package/dist/esm/chip/pics/source.d.ts.map +1 -1
  188. package/dist/esm/chip/pics/source.js +24 -16
  189. package/dist/esm/chip/pics/source.js.map +1 -1
  190. package/dist/esm/chip/python-test.d.ts +12 -0
  191. package/dist/esm/chip/python-test.d.ts.map +1 -1
  192. package/dist/esm/chip/python-test.js +6 -4
  193. package/dist/esm/chip/python-test.js.map +1 -1
  194. package/dist/esm/chip/state.d.ts.map +1 -1
  195. package/dist/esm/chip/state.js +25 -8
  196. package/dist/esm/chip/state.js.map +1 -1
  197. package/dist/esm/chip/yaml-test.js +1 -1
  198. package/dist/esm/chip/yaml-test.js.map +1 -1
  199. package/dist/esm/cli.d.ts.map +1 -1
  200. package/dist/esm/cli.js +33 -2
  201. package/dist/esm/cli.js.map +1 -1
  202. package/dist/esm/device/backchannel.d.ts.map +1 -1
  203. package/dist/esm/device/subject.d.ts.map +1 -1
  204. package/dist/esm/device/test.d.ts.map +1 -1
  205. package/dist/esm/docker/container.d.ts.map +1 -1
  206. package/dist/esm/docker/docker.d.ts.map +1 -1
  207. package/dist/esm/docker/edit.d.ts.map +1 -1
  208. package/dist/esm/docker/errors.d.ts.map +1 -1
  209. package/dist/esm/docker/network.d.ts.map +1 -1
  210. package/dist/esm/docker/terminal.d.ts.map +1 -1
  211. package/dist/esm/failure-reporter.d.ts.map +1 -1
  212. package/dist/esm/global-declarations.d.js +0 -1
  213. package/dist/esm/global-declarations.d.js.map +1 -1
  214. package/dist/esm/global-declarations.d.ts +2 -2
  215. package/dist/esm/global-definitions.js +16 -3
  216. package/dist/esm/global-definitions.js.map +1 -1
  217. package/dist/esm/index.d.js +2 -0
  218. package/dist/esm/index.d.js.map +1 -1
  219. package/dist/esm/index.d.ts +3 -0
  220. package/dist/esm/index.js +2 -0
  221. package/dist/esm/index.js.map +1 -1
  222. package/dist/esm/mocha.d.ts.map +1 -1
  223. package/dist/esm/mocha.js +5 -0
  224. package/dist/esm/mocha.js.map +1 -1
  225. package/dist/esm/mocharc.cjs +4 -3
  226. package/dist/esm/options.d.ts.map +1 -1
  227. package/dist/esm/print-report.js +1 -1
  228. package/dist/esm/print-report.js.map +1 -1
  229. package/dist/esm/test-descriptor.d.ts +1 -1
  230. package/dist/esm/test-descriptor.d.ts.map +1 -1
  231. package/dist/esm/text-diff.d.ts.map +1 -1
  232. package/dist/esm/util/async.d.ts +30 -0
  233. package/dist/esm/util/async.d.ts.map +1 -0
  234. package/dist/esm/util/async.js +65 -0
  235. package/dist/esm/util/async.js.map +6 -0
  236. package/dist/esm/util/trace-unhandled.d.ts.map +1 -1
  237. package/dist/esm/util/wtf.d.ts.map +1 -1
  238. package/dist/esm/util/wtf.js +1 -1
  239. package/dist/esm/util/wtf.js.map +1 -1
  240. package/dist/esm/web.d.ts.map +1 -1
  241. package/dist/esm/web.js +5 -1
  242. package/dist/esm/web.js.map +1 -1
  243. package/package.json +9 -9
  244. package/src/chai.ts +3 -3
  245. package/src/chip/cert/cert-context.ts +126 -0
  246. package/src/chip/cert/cert-dsl.ts +451 -0
  247. package/src/chip/cert/cert-test.ts +360 -0
  248. package/src/chip/cert/chip-app-subject.ts +457 -0
  249. package/src/chip/cert/controller-adapter.ts +142 -0
  250. package/src/chip/cert/device-config.ts +33 -0
  251. package/src/chip/cert/evidence.ts +170 -0
  252. package/src/chip/cert/log-follower.ts +266 -0
  253. package/src/chip/cert/matterjs-subject-registry.ts +33 -0
  254. package/src/chip/cert/prompt-driven-python-test.ts +104 -0
  255. package/src/chip/chip-bins.ts +401 -0
  256. package/src/chip/chip-test-common.ts +3 -1
  257. package/src/chip/chip.ts +1 -1
  258. package/src/chip/config.ts +28 -1
  259. package/src/chip/index.ts +67 -0
  260. package/src/chip/pics/file.ts +8 -0
  261. package/src/chip/pics/source.ts +39 -19
  262. package/src/chip/python-test.ts +5 -4
  263. package/src/chip/state.ts +39 -8
  264. package/src/chip/yaml-test.ts +1 -1
  265. package/src/cli.ts +40 -2
  266. package/src/global-declarations.d.ts +2 -2
  267. package/src/global-definitions.ts +27 -3
  268. package/src/index.d.ts +3 -0
  269. package/src/index.js +1 -0
  270. package/src/mocha.ts +13 -0
  271. package/src/mocharc.cjs +4 -3
  272. package/src/print-report.ts +1 -1
  273. package/src/test-descriptor.ts +1 -1
  274. package/src/util/async.ts +83 -0
  275. package/src/util/wtf.ts +3 -1
  276. package/src/web.ts +5 -1
  277. package/test/util/AsyncTest.ts +68 -0
@@ -0,0 +1,209 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var log_follower_exports = {};
20
+ __export(log_follower_exports, {
21
+ CertLogClosedError: () => CertLogClosedError,
22
+ CertLogTimeoutError: () => CertLogTimeoutError,
23
+ LogFollower: () => LogFollower
24
+ });
25
+ module.exports = __toCommonJS(log_follower_exports);
26
+ var import_async = require("../../util/async.js");
27
+ var import_text = require("../../util/text.js");
28
+ /**
29
+ * @license
30
+ * Copyright 2022-2026 Matter.js Authors
31
+ * SPDX-License-Identifier: Apache-2.0
32
+ */
33
+ const DEFAULT_TIMEOUT_MS = 3e4;
34
+ class CertLogTimeoutError extends Error {
35
+ constructor(pattern, from, tail) {
36
+ super(
37
+ `Timed out waiting for ${pattern} (from index ${from}); last lines: ` + tail.slice(-20).map((line) => line.text).join("\n")
38
+ );
39
+ this.pattern = pattern;
40
+ this.from = from;
41
+ this.tail = tail;
42
+ }
43
+ pattern;
44
+ from;
45
+ tail;
46
+ }
47
+ class CertLogClosedError extends Error {
48
+ constructor(name) {
49
+ super(`Log follower "${name}" closed before a pending expect() matched`);
50
+ }
51
+ }
52
+ function patternFor(patterns, flavor) {
53
+ if (flavor.startsWith("chip")) {
54
+ return patterns.chip;
55
+ }
56
+ if (flavor === "matterjs") {
57
+ return patterns.matterjs;
58
+ }
59
+ return void 0;
60
+ }
61
+ function matchableCopy(pattern) {
62
+ return new RegExp(pattern.source, pattern.flags.replace(/[gy]/g, ""));
63
+ }
64
+ class LogFollower {
65
+ name;
66
+ #lines = new Array();
67
+ #lastMark = 0;
68
+ #closed = false;
69
+ #closeError;
70
+ #waiters = new Array();
71
+ #resolveCloseSignal;
72
+ #closeSignal;
73
+ #pump;
74
+ constructor(source, name) {
75
+ this.name = name;
76
+ this.#closeSignal = new Promise((resolve) => {
77
+ this.#resolveCloseSignal = resolve;
78
+ });
79
+ this.#pump = this.#consume(source);
80
+ }
81
+ /**
82
+ * Appends a synthetic line (e.g. a step-boundary banner) to the buffer at the current position,
83
+ * indexed like a real line but flagged so {@link expect} skips it. Lets a caller mark the
84
+ * chronologically right position in the evidence `.log` output without that marker ever
85
+ * satisfying a step's own pattern.
86
+ */
87
+ annotate(text) {
88
+ this.#lines.push({ index: this.#lines.length, at: /* @__PURE__ */ new Date(), text, synthetic: true });
89
+ this.#wake();
90
+ }
91
+ /**
92
+ * Sets the default cursor a subsequent {@link expect} call scans from when it doesn't specify
93
+ * `from` itself. Typically called once at the start of a step.
94
+ */
95
+ mark() {
96
+ this.#lastMark = this.#lines.length;
97
+ return this.#lastMark;
98
+ }
99
+ /**
100
+ * Every line seen so far, in arrival order. A fresh copy on each access — callers cannot
101
+ * mutate the follower's own buffer through it.
102
+ */
103
+ get lines() {
104
+ return [...this.#lines];
105
+ }
106
+ /**
107
+ * Waits for a line at or after the cursor (`options.from`, default: the last {@link mark})
108
+ * matching the pattern for `options.flavor`. Resolves `unverified` immediately if `patterns`
109
+ * has no entry for that flavor. Throws {@link CertLogTimeoutError} if the deadline passes
110
+ * first, or {@link CertLogClosedError} (or the source's own error) if the follower closes
111
+ * first.
112
+ */
113
+ async expect(patterns, options) {
114
+ const original = patternFor(patterns, options.flavor);
115
+ if (!original) {
116
+ return { verdict: "unverified", reason: "no-pattern-for-flavor" };
117
+ }
118
+ const pattern = matchableCopy(original);
119
+ const from = options.from ?? this.#lastMark;
120
+ const timeout = (0, import_async.delay)(options.timeoutMs ?? DEFAULT_TIMEOUT_MS);
121
+ try {
122
+ for (; ; ) {
123
+ const matched = this.#firstMatchFrom(pattern, from);
124
+ if (matched) {
125
+ return { verdict: "pass", matched, pattern: String(original) };
126
+ }
127
+ if (this.#closeError) {
128
+ throw this.#closeError;
129
+ }
130
+ if (this.#closed) {
131
+ throw new CertLogClosedError(this.name);
132
+ }
133
+ const outcome = await Promise.race([this.#waitForWake(), timeout.promise]);
134
+ if (outcome === "timeout") {
135
+ throw new CertLogTimeoutError(String(original), from, this.#lines.slice(from));
136
+ }
137
+ }
138
+ } finally {
139
+ timeout.cancel();
140
+ }
141
+ }
142
+ follow() {
143
+ return this.#replay();
144
+ }
145
+ async close() {
146
+ this.#resolveCloseSignal();
147
+ await this.#pump;
148
+ }
149
+ #firstMatchFrom(pattern, from) {
150
+ for (let i = from; i < this.#lines.length; i++) {
151
+ if (this.#lines[i].synthetic) {
152
+ continue;
153
+ }
154
+ if (pattern.test(this.#lines[i].text)) {
155
+ return this.#lines[i];
156
+ }
157
+ }
158
+ return void 0;
159
+ }
160
+ #waitForWake() {
161
+ return new Promise((resolve) => this.#waiters.push(() => resolve("activity")));
162
+ }
163
+ #wake() {
164
+ const waiters = this.#waiters;
165
+ this.#waiters = new Array();
166
+ for (const waiter of waiters) {
167
+ waiter();
168
+ }
169
+ }
170
+ async *#replay() {
171
+ let index = 0;
172
+ for (; ; ) {
173
+ while (index < this.#lines.length) {
174
+ yield this.#lines[index++].text;
175
+ }
176
+ if (this.#closed) {
177
+ return;
178
+ }
179
+ await new Promise((resolve) => this.#waiters.push(resolve));
180
+ }
181
+ }
182
+ // #closeSignal is a single reused promise, so close() ends the loop immediately without
183
+ // forcing the source's iterator closed (which could hang on a source parked mid-await).
184
+ // Never rethrows: failures land on #closeError for expect() to surface, so #pump always
185
+ // resolves and close() has nothing to catch.
186
+ async #consume(source) {
187
+ const iterator = source[Symbol.asyncIterator]();
188
+ try {
189
+ for (; ; ) {
190
+ const outcome = await Promise.race([
191
+ iterator.next().then((result) => ({ closed: false, result })),
192
+ this.#closeSignal.then(() => ({ closed: true }))
193
+ ]);
194
+ if (outcome.closed || outcome.result.done) {
195
+ return;
196
+ }
197
+ this.#lines.push({ index: this.#lines.length, at: /* @__PURE__ */ new Date(), text: (0, import_text.deansify)(outcome.result.value) });
198
+ this.#wake();
199
+ }
200
+ } catch (e) {
201
+ this.#closeError = e instanceof Error ? e : new Error(String(e));
202
+ console.warn(`Log follower "${this.name}" lost its source:`, this.#closeError);
203
+ } finally {
204
+ this.#closed = true;
205
+ this.#wake();
206
+ }
207
+ }
208
+ }
209
+ //# sourceMappingURL=log-follower.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/chip/cert/log-follower.ts"],
4
+ "mappings": "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",
5
+ "names": []
6
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2026 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { CertDeviceFactory } from "./cert-context.js";
7
+ /**
8
+ * Registers a {@link CertDeviceFactory} for the "matterjs" {@link DeviceFlavor}, keyed by
9
+ * chip-test-header app name.
10
+ *
11
+ * Kept separate from {@link Chip.subjectFor}'s app registry: that one is for the existing py/yaml
12
+ * harness's plain `Subject.Factory`s, which don't carry {@link CertDevice}'s extra fields
13
+ * (`log`/`flavor`/`exit`). Registering the same app name in both places is fine — they're
14
+ * independent maps — but a cert factory needs the matter.js `Logger` sink that only
15
+ * `support/chip-testing` (not this package) is allowed to depend on, so it registers here instead.
16
+ */
17
+ export declare function registerMatterJsCertSubject(app: string, factory: CertDeviceFactory): void;
18
+ /**
19
+ * Looks up a factory registered via {@link registerMatterJsCertSubject}.
20
+ */
21
+ export declare function matterJsCertSubjectFor(app: string): CertDeviceFactory | undefined;
22
+ //# sourceMappingURL=matterjs-subject-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matterjs-subject-registry.d.ts","sourceRoot":"","sources":["../../../../src/chip/cert/matterjs-subject-registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAI3D;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAKzF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAEjF"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var matterjs_subject_registry_exports = {};
20
+ __export(matterjs_subject_registry_exports, {
21
+ matterJsCertSubjectFor: () => matterJsCertSubjectFor,
22
+ registerMatterJsCertSubject: () => registerMatterJsCertSubject
23
+ });
24
+ module.exports = __toCommonJS(matterjs_subject_registry_exports);
25
+ /**
26
+ * @license
27
+ * Copyright 2022-2026 Matter.js Authors
28
+ * SPDX-License-Identifier: Apache-2.0
29
+ */
30
+ const subjects = /* @__PURE__ */ new Map();
31
+ function registerMatterJsCertSubject(app, factory) {
32
+ if (subjects.has(app)) {
33
+ throw new Error(`A matterjs cert subject is already registered for app "${app}"`);
34
+ }
35
+ subjects.set(app, factory);
36
+ }
37
+ function matterJsCertSubjectFor(app) {
38
+ return subjects.get(app);
39
+ }
40
+ //# sourceMappingURL=matterjs-subject-registry.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/chip/cert/matterjs-subject-registry.ts"],
4
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,MAAM,WAAW,oBAAI,IAA+B;AAY7C,SAAS,4BAA4B,KAAa,SAAkC;AACvF,MAAI,SAAS,IAAI,GAAG,GAAG;AACnB,UAAM,IAAI,MAAM,0DAA0D,GAAG,GAAG;AAAA,EACpF;AACA,WAAS,IAAI,KAAK,OAAO;AAC7B;AAKO,SAAS,uBAAuB,KAA4C;AAC/E,SAAO,SAAS,IAAI,GAAG;AAC3B;",
5
+ "names": []
6
+ }
@@ -0,0 +1,40 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2026 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { Subject } from "../../device/subject.js";
7
+ import type { Container } from "../../docker/container.js";
8
+ import type { TestFileDescriptor } from "../../test-descriptor.js";
9
+ import { PythonTest } from "../python-test.js";
10
+ import type { CertStepContext } from "./cert-context.js";
11
+ /**
12
+ * Reacts to one line of a python-wrapped CHIP test script's own stdout. `pattern` identifies a prompt
13
+ * line — see `MatterBaseTest.wait_for_user_input` in `connectedhomeip`'s
14
+ * `matter/testing/matter_testing.py`, which logs the prompt then blocks on a bare `input()` read — and
15
+ * `action` reacts to it (e.g. drives a {@link CertStepContext} controller through a commissioning
16
+ * attempt) and returns the text {@link PromptDrivenPythonTest} writes to the script's stdin to unblock
17
+ * it.
18
+ */
19
+ export interface PromptHandler {
20
+ pattern: RegExp;
21
+ action: (cx: CertStepContext, promptText: string) => Promise<string>;
22
+ }
23
+ /**
24
+ * Runs a CHIP python test script that drives its own multi-party scenario and prompts for out-of-band
25
+ * action instead of letting the harness commission/act on its behalf — see `TC_SC_3_5.py`'s
26
+ * `wait_for_user_input` calls, one per CASE-handshake attempt it wants a real commissioner to make.
27
+ *
28
+ * Reuses {@link PythonTest}'s command construction ({@link createCommand}, so the same argument/PICS
29
+ * rules apply) but keeps the container exec's stdin open and answers matching prompt lines through
30
+ * `handlers` instead of running fully unattended. Commissioning happens interactively, driven by
31
+ * `handlers` reacting to prompts, so there is no subject to pre-pair — {@link initializeSubject} is a
32
+ * no-op.
33
+ */
34
+ export declare class PromptDrivenPythonTest extends PythonTest {
35
+ #private;
36
+ constructor(descriptor: TestFileDescriptor, container: Container, handlers: PromptHandler[], cx: CertStepContext);
37
+ initializeSubject(_subject: Subject): Promise<void>;
38
+ invoke(subject: Subject, step: (title: string) => void, args: string[], uncommissioned: boolean): Promise<void>;
39
+ }
40
+ //# sourceMappingURL=prompt-driven-python-test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-driven-python-test.d.ts","sourceRoot":"","sources":["../../../../src/chip/cert/prompt-driven-python-test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAE3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAGnE,OAAO,EAAiB,UAAU,EAAU,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,CAAC,EAAE,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACxE;AAED;;;;;;;;;;GAUG;AACH,qBAAa,sBAAuB,SAAQ,UAAU;;IAIlD,YAAY,UAAU,EAAE,kBAAkB,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,EAAE,EAAE,eAAe,EAI/G;IAEc,iBAAiB,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAG;IAEtD,MAAM,CACjB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EAC7B,IAAI,EAAE,MAAM,EAAE,EACd,cAAc,EAAE,OAAO,GACxB,OAAO,CAAC,IAAI,CAAC,CA8Cf;CACJ"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var prompt_driven_python_test_exports = {};
20
+ __export(prompt_driven_python_test_exports, {
21
+ PromptDrivenPythonTest: () => PromptDrivenPythonTest
22
+ });
23
+ module.exports = __toCommonJS(prompt_driven_python_test_exports);
24
+ var import_terminal = require("../../docker/terminal.js");
25
+ var import_chip_test_common = require("../chip-test-common.js");
26
+ var import_container_command_pipe = require("../container-command-pipe.js");
27
+ var import_python_test = require("../python-test.js");
28
+ /**
29
+ * @license
30
+ * Copyright 2022-2026 Matter.js Authors
31
+ * SPDX-License-Identifier: Apache-2.0
32
+ */
33
+ class PromptDrivenPythonTest extends import_python_test.PythonTest {
34
+ #handlers;
35
+ #cx;
36
+ constructor(descriptor, container, handlers, cx) {
37
+ super(descriptor, container);
38
+ this.#handlers = handlers;
39
+ this.#cx = cx;
40
+ }
41
+ async initializeSubject(_subject) {
42
+ }
43
+ async invoke(subject, step, args, uncommissioned) {
44
+ await this.container.exec(["bash", "-c", `test -p ${import_container_command_pipe.FIFO_PATH} || mkfifo ${import_container_command_pipe.FIFO_PATH}`]);
45
+ const terminal = await this.container.exec(
46
+ await (0, import_python_test.createCommand)(this.descriptor, this.container, subject, args, uncommissioned),
47
+ import_terminal.Terminal.Line,
48
+ { cwd: "/tmp", stdin: true }
49
+ );
50
+ let passed = false;
51
+ try {
52
+ for await (let line of terminal) {
53
+ line = (0, import_chip_test_common.parseStep)(line, step);
54
+ const handler = this.#handlers.find((h) => h.pattern.test(line));
55
+ if (handler) {
56
+ const answer = await handler.action(this.#cx, line);
57
+ await terminal.write(answer);
58
+ }
59
+ if (line.indexOf("Final result: PASS") !== -1) {
60
+ passed = true;
61
+ } else if (line.match(/\[Test\]\s+\S+\s+PASS$/)) {
62
+ passed = true;
63
+ }
64
+ MockLogger.injectExternalMessage("CHIP", (0, import_python_test.spiffy)(line));
65
+ }
66
+ } catch (e) {
67
+ await terminal.close().catch((closeError) => {
68
+ console.warn("Error closing prompt-driven python test terminal:", closeError);
69
+ });
70
+ throw e;
71
+ }
72
+ if (!passed) {
73
+ throw new Error("Python test exited without error but did not indicate successful test");
74
+ }
75
+ }
76
+ }
77
+ //# sourceMappingURL=prompt-driven-python-test.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/chip/cert/prompt-driven-python-test.ts"],
4
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,sBAAyB;AAEzB,8BAA0B;AAC1B,oCAA0B;AAC1B,yBAAkD;AAZlD;AAAA;AAAA;AAAA;AAAA;AAuCO,MAAM,+BAA+B,8BAAW;AAAA,EACnD;AAAA,EACA;AAAA,EAEA,YAAY,YAAgC,WAAsB,UAA2B,IAAqB;AAC9G,UAAM,YAAY,SAAS;AAC3B,SAAK,YAAY;AACjB,SAAK,MAAM;AAAA,EACf;AAAA,EAEA,MAAe,kBAAkB,UAAkC;AAAA,EAAC;AAAA,EAEpE,MAAe,OACX,SACA,MACA,MACA,gBACa;AAIb,UAAM,KAAK,UAAU,KAAK,CAAC,QAAQ,MAAM,WAAW,uCAAS,cAAc,uCAAS,EAAE,CAAC;AAEvF,UAAM,WAAW,MAAM,KAAK,UAAU;AAAA,MAClC,UAAM,kCAAc,KAAK,YAAY,KAAK,WAAW,SAAS,MAAM,cAAc;AAAA,MAClF,yBAAS;AAAA,MACT,EAAE,KAAK,QAAQ,OAAO,KAAK;AAAA,IAC/B;AAEA,QAAI,SAAS;AACb,QAAI;AACA,qBAAe,QAAQ,UAAU;AAC7B,mBAAO,mCAAU,MAAM,IAAI;AAE3B,cAAM,UAAU,KAAK,UAAU,KAAK,OAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;AAC7D,YAAI,SAAS;AACT,gBAAM,SAAS,MAAM,QAAQ,OAAO,KAAK,KAAK,IAAI;AAClD,gBAAM,SAAS,MAAM,MAAM;AAAA,QAC/B;AAEA,YAAI,KAAK,QAAQ,oBAAoB,MAAM,IAAI;AAE3C,mBAAS;AAAA,QACb,WAAW,KAAK,MAAM,wBAAwB,GAAG;AAE7C,mBAAS;AAAA,QACb;AAEA,mBAAW,sBAAsB,YAAQ,2BAAO,IAAI,CAAC;AAAA,MACzD;AAAA,IACJ,SAAS,GAAG;AAIR,YAAM,SAAS,MAAM,EAAE,MAAM,gBAAc;AACvC,gBAAQ,KAAK,qDAAqD,UAAU;AAAA,MAChF,CAAC;AACD,YAAM;AAAA,IACV;AAEA,QAAI,CAAC,QAAQ;AACT,YAAM,IAAI,MAAM,uEAAuE;AAAA,IAC3F;AAAA,EACJ;AACJ;",
5
+ "names": []
6
+ }
@@ -0,0 +1,132 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2026 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Which build of CHIP example-app/chip-tool binaries a test run uses.
8
+ *
9
+ * `"matterjs"` is matter.js's own image/build (`ghcr.io/matter-js/chip*`, or a directory the user
10
+ * built themselves). `"cert-bins"` selects project-chip's official `connectedhomeip/chip-cert-bins`
11
+ * image — the same binaries the official Matter Test Harness certifies against.
12
+ */
13
+ export type ChipBinsSource = "matterjs" | "cert-bins";
14
+ /** Docker Hub repository publishing the official CHIP certification binaries. */
15
+ export declare const CERT_BINS_IMAGE = "connectedhomeip/chip-cert-bins";
16
+ /**
17
+ * Maintainer-vetted default tag: the connectedhomeip commit SHA `chip-cert-bins` publishes for
18
+ * Matter 1.6.1, verified pullable and `linux/arm64`-inventoried at the time this integration was
19
+ * built. Override with `MATTER_CHIP_BINS_TAG`.
20
+ */
21
+ export declare const DEFAULT_CERT_BINS_TAG = "df8bd0308caa0680e2a78cda724a959e5b385205";
22
+ /**
23
+ * `chip-cert-bins` publishes `linux/arm64` only, at every tag on Docker Hub (no `amd64` manifest
24
+ * has ever existed) — the official Test Harness targets Raspberry Pi hardware. Extraction always
25
+ * requests this platform regardless of host architecture; on non-arm64 hosts Docker runs it under
26
+ * emulation (QEMU), which is fine here since extraction only ever runs `cp`, never the app binaries
27
+ * themselves.
28
+ */
29
+ export declare const CERT_BINS_PLATFORM = "linux/arm64";
30
+ /**
31
+ * Whether a container platform string (as used for `Container.Configuration.platform`, e.g.
32
+ * `"linux/amd64"`) can run `chip-cert-bins` binaries bind-mounted into it. Verified directly: a
33
+ * platform mismatch doesn't fail at pull/extract time, only later at `exec` — `chip/state.ts`'s
34
+ * `configureContainer()` calls this up front so a mismatch fails fast with a clear error instead.
35
+ */
36
+ export declare function chipBinsPlatformSupported(platform: string): boolean;
37
+ /**
38
+ * Resolve which binary source a test run uses, from `MATTER_CHIP_BINS_SOURCE`. Unset (or empty)
39
+ * means unchanged default behavior: matter.js's own build.
40
+ */
41
+ export declare function resolveChipBinsSource(): ChipBinsSource;
42
+ /** The tag requested via `MATTER_CHIP_BINS_TAG`, before resolving a possible `"latest"`. */
43
+ export declare function requestedChipBinsTag(): string;
44
+ /** Base host directory under which `chip-cert-bins` binaries are extracted, one subdirectory per tag. */
45
+ export declare function chipBinsDir(): string;
46
+ /**
47
+ * Directory a given tag's binaries extract into and are cached under, one level below
48
+ * {@link chipBinsDir}. Scoping by tag means two runs against different tags can never clobber each
49
+ * other's `rm -rf`/`cp -a`/stamp-write, even sharing one `MATTER_CHIP_BINS_DIR` — each tag gets its own
50
+ * subtree, created fresh on first use.
51
+ *
52
+ * This does not make same-tag concurrency safe: two runs racing to extract the *same* tag into the
53
+ * same base directory at once can still interleave their `rm -rf`/`cp -a`/stamp-write (no cross-process
54
+ * lock exists). Point concurrent runs at different `MATTER_CHIP_BINS_DIR` values if they might extract
55
+ * the same tag at the same time — see the README's "Choosing a CHIP binary source" section.
56
+ */
57
+ export declare function chipBinsExtractionDir(tag: string, baseDir?: string): string;
58
+ /** Injectable so `"latest"` resolution is unit-testable without a network call. */
59
+ export type LatestTagResolver = () => Promise<string>;
60
+ interface DockerHubTag {
61
+ name: string;
62
+ tag_last_pushed: string;
63
+ }
64
+ /**
65
+ * Narrows Docker Hub's tags-list response to the shape this integration depends on
66
+ * (`{ results?: [{ name, tag_last_pushed }, ...] }`), so a shape drift on their end throws a clear,
67
+ * named error here instead of a `TypeError` from deep inside the later `.sort()`/`.name` access.
68
+ */
69
+ export declare function parseDockerHubTagsResponse(body: unknown): DockerHubTag[];
70
+ /**
71
+ * Resolve a requested tag to a concrete one. Anything other than the literal string `"latest"`
72
+ * passes through unchanged (a pinned SHA, or a maintainer-curated default) — reproducible, no
73
+ * network access. `"latest"` is a live lookup, gated behind this explicit opt-in rather than made
74
+ * the default so ordinary runs stay reproducible without depending on network access.
75
+ */
76
+ export declare function resolveChipBinsTag(requested: string, fetchLatest?: LatestTagResolver): Promise<string>;
77
+ /** The subset of {@link Docker} extraction needs, narrowed so tests can substitute a fake. */
78
+ export interface ChipBinsDockerHandle {
79
+ pull(imageRef: string, platform: string): Promise<void>;
80
+ extractApps(imageRef: string, platform: string, targetDir: string): Promise<void>;
81
+ }
82
+ export interface EnsureChipBinsResult {
83
+ tag: string;
84
+ dir: string;
85
+ /** False when the target directory already held this exact tag's binaries; extraction was skipped. */
86
+ extracted: boolean;
87
+ }
88
+ /**
89
+ * Thrown when `targetDir` is not writable by the host after a `chip-cert-bins` extraction
90
+ * otherwise succeeded — the extraction container's UID mapping left files the host user cannot
91
+ * write, most often on rootless Docker/Podman (see the message for what to do about it).
92
+ */
93
+ export declare class ChipBinsPermissionError extends Error {
94
+ }
95
+ /**
96
+ * Thrown when an existing chip-cert-bins extraction directory is owned by a different host user —
97
+ * on a multi-user host that user could have pre-created it and planted binaries this harness later
98
+ * spawns.
99
+ */
100
+ export declare class ChipBinsOwnershipError extends Error {
101
+ }
102
+ /**
103
+ * Refuse to trust an existing extraction directory this host user does not own, before any stamp
104
+ * read or extraction relies on its contents. Skipped when `process.getuid` is unavailable
105
+ * (Windows has no POSIX ownership) or when `MATTER_CHIP_BINS_DIR` was set explicitly — that
106
+ * directory is the caller's own responsibility.
107
+ */
108
+ export declare function assertChipBinsDirOwnership(dir: string): Promise<void>;
109
+ /**
110
+ * Ensure `targetDir` holds `chip-<app>-app`/`chip-tool` binaries extracted from
111
+ * `connectedhomeip/chip-cert-bins:<tag>`. Lazy and cached: if `targetDir`'s stamp file already
112
+ * records `tag`, this is a no-op. A stamp mismatch (different tag, or no stamp at all — including a
113
+ * prior extraction that crashed before writing one) triggers a fresh pull + extract, so a partial
114
+ * failure self-heals on the next call rather than wedging the cache.
115
+ */
116
+ export declare function ensureChipBins(tag: string, targetDir: string, docker?: ChipBinsDockerHandle): Promise<EnsureChipBinsResult>;
117
+ /**
118
+ * Resolve the configured tag and ensure it's extracted, memoized process-wide so the classic
119
+ * yaml/python harness (`chip/state.ts`) and cert-test `chip-local` subjects
120
+ * (`chip/cert/chip-app-subject.ts`) — both of which may call this once per process — share a single
121
+ * pull/extract rather than racing each other. `docker` is injectable for tests only; production
122
+ * callers always take the default.
123
+ *
124
+ * A failed attempt clears the memo so the next call retries instead of being stuck replaying the
125
+ * same rejection for the rest of the process — matching `ensureChipBins()`'s own self-healing
126
+ * behavior on a failed extraction.
127
+ */
128
+ export declare function prepareChipBins(docker?: ChipBinsDockerHandle): Promise<EnsureChipBinsResult>;
129
+ /** Test-only: clears the process-wide memoization so each test starts from a clean slate. */
130
+ export declare function resetChipBinsPrepareCacheForTesting(): void;
131
+ export {};
132
+ //# sourceMappingURL=chip-bins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chip-bins.d.ts","sourceRoot":"","sources":["../../../src/chip/chip-bins.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,WAAW,CAAC;AAEtD,iFAAiF;AACjF,eAAO,MAAM,eAAe,mCAAmC,CAAC;AAEhE;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,6CAA6C,CAAC;AAEhF;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,gBAAgB,CAAC;AAEhD;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEnE;AAaD;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,cAAc,CAYtD;AAED,4FAA4F;AAC5F,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAYD,yGAAyG;AACzG,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAcD;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,MAAsB,GAAG,MAAM,CAG1F;AAED,mFAAmF;AACnF,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;AAEtD,UAAU,YAAY;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;CAC3B;AAYD;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,EAAE,CAqBxE;AAqBD;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACpC,SAAS,EAAE,MAAM,EACjB,WAAW,GAAE,iBAA0C,GACxD,OAAO,CAAC,MAAM,CAAC,CAKjB;AAED,8FAA8F;AAC9F,MAAM,WAAW,oBAAoB;IACjC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrF;AAqCD,MAAM,WAAW,oBAAoB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,sGAAsG;IACtG,SAAS,EAAE,OAAO,CAAC;CACtB;AAcD;;;;GAIG;AACH,qBAAa,uBAAwB,SAAQ,KAAK;CAAG;AAqBrD;;;;GAIG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;CAAG;AAEpD;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB3E;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAChC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,oBAAiD,GAC1D,OAAO,CAAC,oBAAoB,CAAC,CAmB/B;AAID;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC3B,MAAM,GAAE,oBAAiD,GAC1D,OAAO,CAAC,oBAAoB,CAAC,CAc/B;AAED,6FAA6F;AAC7F,wBAAgB,mCAAmC,IAAI,IAAI,CAE1D"}