@psavelis/enterprise-blockchain 0.1.0 → 1.1.1

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 (296) hide show
  1. package/README.md +15 -2
  2. package/dist/aid-settlement/application/reconciler.d.ts +13 -0
  3. package/dist/aid-settlement/application/reconciler.d.ts.map +1 -0
  4. package/dist/aid-settlement/application/reconciler.js +77 -0
  5. package/dist/aid-settlement/domain/entities.d.ts +24 -0
  6. package/dist/aid-settlement/domain/entities.d.ts.map +1 -0
  7. package/dist/aid-settlement/domain/entities.js +1 -0
  8. package/dist/aid-settlement/domain/ports.d.ts +10 -0
  9. package/dist/aid-settlement/domain/ports.d.ts.map +1 -0
  10. package/dist/aid-settlement/domain/ports.js +1 -0
  11. package/dist/aid-settlement/index.d.ts +19 -0
  12. package/dist/aid-settlement/index.d.ts.map +1 -0
  13. package/dist/aid-settlement/index.js +23 -0
  14. package/dist/aid-settlement/infrastructure/in-memory-store.d.ts +12 -0
  15. package/dist/aid-settlement/infrastructure/in-memory-store.d.ts.map +1 -0
  16. package/dist/aid-settlement/infrastructure/in-memory-store.js +17 -0
  17. package/dist/credentialing/application/clearance-evaluator.d.ts +10 -0
  18. package/dist/credentialing/application/clearance-evaluator.d.ts.map +1 -0
  19. package/dist/credentialing/application/clearance-evaluator.js +63 -0
  20. package/dist/credentialing/domain/entities.d.ts +28 -0
  21. package/dist/credentialing/domain/entities.d.ts.map +1 -0
  22. package/dist/credentialing/domain/entities.js +1 -0
  23. package/dist/credentialing/domain/ports.d.ts +9 -0
  24. package/dist/credentialing/domain/ports.d.ts.map +1 -0
  25. package/dist/credentialing/domain/ports.js +1 -0
  26. package/dist/credentialing/index.d.ts +19 -0
  27. package/dist/credentialing/index.d.ts.map +1 -0
  28. package/dist/credentialing/index.js +23 -0
  29. package/dist/credentialing/infrastructure/in-memory-store.d.ts +11 -0
  30. package/dist/credentialing/infrastructure/in-memory-store.d.ts.map +1 -0
  31. package/dist/credentialing/infrastructure/in-memory-store.js +14 -0
  32. package/dist/hsm/application/asymmetric-key-service.d.ts +23 -0
  33. package/dist/hsm/application/asymmetric-key-service.d.ts.map +1 -0
  34. package/dist/hsm/application/asymmetric-key-service.js +109 -0
  35. package/dist/hsm/application/envelope-encryption-service.d.ts +18 -0
  36. package/dist/hsm/application/envelope-encryption-service.d.ts.map +1 -0
  37. package/dist/hsm/application/envelope-encryption-service.js +59 -0
  38. package/dist/hsm/application/symmetric-key-service.d.ts +34 -0
  39. package/dist/hsm/application/symmetric-key-service.d.ts.map +1 -0
  40. package/dist/hsm/application/symmetric-key-service.js +107 -0
  41. package/dist/hsm/domain/entities.d.ts +104 -0
  42. package/dist/hsm/domain/entities.d.ts.map +1 -0
  43. package/dist/hsm/domain/entities.js +10 -0
  44. package/dist/hsm/domain/ports.d.ts +20 -0
  45. package/dist/hsm/domain/ports.d.ts.map +1 -0
  46. package/dist/hsm/domain/ports.js +1 -0
  47. package/dist/hsm/index.d.ts +48 -0
  48. package/dist/hsm/index.d.ts.map +1 -0
  49. package/dist/hsm/index.js +97 -0
  50. package/dist/hsm/infrastructure/audit-log-factory.d.ts +59 -0
  51. package/dist/hsm/infrastructure/audit-log-factory.d.ts.map +1 -0
  52. package/dist/hsm/infrastructure/audit-log-factory.js +95 -0
  53. package/dist/hsm/infrastructure/audit-log.d.ts +8 -0
  54. package/dist/hsm/infrastructure/audit-log.d.ts.map +1 -0
  55. package/dist/hsm/infrastructure/audit-log.js +18 -0
  56. package/dist/hsm/infrastructure/file-audit-log.d.ts +55 -0
  57. package/dist/hsm/infrastructure/file-audit-log.d.ts.map +1 -0
  58. package/dist/hsm/infrastructure/file-audit-log.js +128 -0
  59. package/dist/hsm/infrastructure/key-store.d.ts +9 -0
  60. package/dist/hsm/infrastructure/key-store.d.ts.map +1 -0
  61. package/dist/hsm/infrastructure/key-store.js +12 -0
  62. package/dist/hsm/infrastructure/syslog-audit-log.d.ts +64 -0
  63. package/dist/hsm/infrastructure/syslog-audit-log.d.ts.map +1 -0
  64. package/dist/hsm/infrastructure/syslog-audit-log.js +167 -0
  65. package/dist/index.d.ts +22 -0
  66. package/dist/index.d.ts.map +1 -0
  67. package/dist/index.js +37 -0
  68. package/dist/integrations/besu-client/error-mapper.d.ts +9 -0
  69. package/dist/integrations/besu-client/error-mapper.d.ts.map +1 -0
  70. package/dist/integrations/besu-client/error-mapper.js +22 -0
  71. package/dist/integrations/besu-client/index.d.ts +65 -0
  72. package/dist/integrations/besu-client/index.d.ts.map +1 -0
  73. package/dist/integrations/besu-client/index.js +276 -0
  74. package/dist/integrations/besu-client/ports.d.ts +44 -0
  75. package/dist/integrations/besu-client/ports.d.ts.map +1 -0
  76. package/dist/integrations/besu-client/ports.js +1 -0
  77. package/dist/integrations/corda-gateway/index.d.ts +37 -0
  78. package/dist/integrations/corda-gateway/index.d.ts.map +1 -0
  79. package/dist/integrations/corda-gateway/index.js +234 -0
  80. package/dist/integrations/corda-gateway/ports.d.ts +33 -0
  81. package/dist/integrations/corda-gateway/ports.d.ts.map +1 -0
  82. package/dist/integrations/corda-gateway/ports.js +1 -0
  83. package/dist/integrations/fabric-gateway/index.d.ts +78 -0
  84. package/dist/integrations/fabric-gateway/index.d.ts.map +1 -0
  85. package/dist/integrations/fabric-gateway/index.js +214 -0
  86. package/dist/integrations/fabric-gateway/ports.d.ts +50 -0
  87. package/dist/integrations/fabric-gateway/ports.d.ts.map +1 -0
  88. package/dist/integrations/fabric-gateway/ports.js +1 -0
  89. package/dist/integrations/index.d.ts +19 -0
  90. package/dist/integrations/index.d.ts.map +1 -0
  91. package/dist/integrations/index.js +19 -0
  92. package/dist/integrations/shared/env.d.ts +4 -0
  93. package/dist/integrations/shared/env.d.ts.map +1 -0
  94. package/dist/integrations/shared/env.js +24 -0
  95. package/dist/integrations/shared/retry.d.ts +79 -0
  96. package/dist/integrations/shared/retry.d.ts.map +1 -0
  97. package/dist/integrations/shared/retry.js +315 -0
  98. package/dist/mpc/adapters.d.ts +36 -0
  99. package/dist/mpc/adapters.d.ts.map +1 -0
  100. package/dist/mpc/adapters.js +46 -0
  101. package/dist/mpc/crypto.d.ts +2 -0
  102. package/dist/mpc/crypto.d.ts.map +1 -0
  103. package/dist/mpc/crypto.js +2 -0
  104. package/dist/mpc/dsa.d.ts +134 -0
  105. package/dist/mpc/dsa.d.ts.map +1 -0
  106. package/dist/mpc/dsa.js +127 -0
  107. package/dist/mpc/field.d.ts +127 -0
  108. package/dist/mpc/field.d.ts.map +1 -0
  109. package/dist/mpc/field.js +209 -0
  110. package/dist/mpc/hybrid-kem.d.ts +96 -0
  111. package/dist/mpc/hybrid-kem.d.ts.map +1 -0
  112. package/dist/mpc/hybrid-kem.js +136 -0
  113. package/dist/mpc/index.d.ts +135 -0
  114. package/dist/mpc/index.d.ts.map +1 -0
  115. package/dist/mpc/index.js +348 -0
  116. package/dist/mpc/kyber.d.ts +134 -0
  117. package/dist/mpc/kyber.d.ts.map +1 -0
  118. package/dist/mpc/kyber.js +143 -0
  119. package/dist/mpc/ports.d.ts +67 -0
  120. package/dist/mpc/ports.d.ts.map +1 -0
  121. package/dist/mpc/ports.js +9 -0
  122. package/dist/mpc/quantum.d.ts +80 -0
  123. package/dist/mpc/quantum.d.ts.map +1 -0
  124. package/dist/mpc/quantum.js +180 -0
  125. package/dist/p2mr/adapters.d.ts +31 -0
  126. package/dist/p2mr/adapters.d.ts.map +1 -0
  127. package/dist/p2mr/adapters.js +35 -0
  128. package/dist/p2mr/index.d.ts +63 -0
  129. package/dist/p2mr/index.d.ts.map +1 -0
  130. package/dist/p2mr/index.js +59 -0
  131. package/dist/p2mr/merkle-tree.d.ts +109 -0
  132. package/dist/p2mr/merkle-tree.d.ts.map +1 -0
  133. package/dist/p2mr/merkle-tree.js +239 -0
  134. package/dist/p2mr/p2mr-output.d.ts +142 -0
  135. package/dist/p2mr/p2mr-output.d.ts.map +1 -0
  136. package/dist/p2mr/p2mr-output.js +150 -0
  137. package/dist/p2mr/ports.d.ts +52 -0
  138. package/dist/p2mr/ports.d.ts.map +1 -0
  139. package/dist/p2mr/ports.js +9 -0
  140. package/dist/p2mr/script-interpreter.d.ts +92 -0
  141. package/dist/p2mr/script-interpreter.d.ts.map +1 -0
  142. package/dist/p2mr/script-interpreter.js +535 -0
  143. package/dist/p2mr/script-leaf.d.ts +70 -0
  144. package/dist/p2mr/script-leaf.d.ts.map +1 -0
  145. package/dist/p2mr/script-leaf.js +203 -0
  146. package/dist/p2mr/spend-proof.d.ts +95 -0
  147. package/dist/p2mr/spend-proof.d.ts.map +1 -0
  148. package/dist/p2mr/spend-proof.js +358 -0
  149. package/dist/p2mr/types.d.ts +209 -0
  150. package/dist/p2mr/types.d.ts.map +1 -0
  151. package/dist/p2mr/types.js +9 -0
  152. package/dist/privacy/application/view-projector.d.ts +13 -0
  153. package/dist/privacy/application/view-projector.d.ts.map +1 -0
  154. package/dist/privacy/application/view-projector.js +85 -0
  155. package/dist/privacy/domain/entities.d.ts +26 -0
  156. package/dist/privacy/domain/entities.d.ts.map +1 -0
  157. package/dist/privacy/domain/entities.js +1 -0
  158. package/dist/privacy/domain/ports.d.ts +7 -0
  159. package/dist/privacy/domain/ports.d.ts.map +1 -0
  160. package/dist/privacy/domain/ports.js +1 -0
  161. package/dist/privacy/index.d.ts +21 -0
  162. package/dist/privacy/index.d.ts.map +1 -0
  163. package/dist/privacy/index.js +25 -0
  164. package/dist/privacy/infrastructure/in-memory-store.d.ts +8 -0
  165. package/dist/privacy/infrastructure/in-memory-store.d.ts.map +1 -0
  166. package/dist/privacy/infrastructure/in-memory-store.js +7 -0
  167. package/dist/protocols/besu-port.d.ts +80 -0
  168. package/dist/protocols/besu-port.d.ts.map +1 -0
  169. package/dist/protocols/besu-port.js +1 -0
  170. package/dist/protocols/corda-port.d.ts +103 -0
  171. package/dist/protocols/corda-port.d.ts.map +1 -0
  172. package/dist/protocols/corda-port.js +9 -0
  173. package/dist/protocols/credentialing-port.d.ts +11 -0
  174. package/dist/protocols/credentialing-port.d.ts.map +1 -0
  175. package/dist/protocols/credentialing-port.js +1 -0
  176. package/dist/protocols/fabric-port.d.ts +89 -0
  177. package/dist/protocols/fabric-port.d.ts.map +1 -0
  178. package/dist/protocols/fabric-port.js +9 -0
  179. package/dist/protocols/index.d.ts +14 -0
  180. package/dist/protocols/index.d.ts.map +1 -0
  181. package/dist/protocols/index.js +7 -0
  182. package/dist/protocols/p2mr-port.d.ts +159 -0
  183. package/dist/protocols/p2mr-port.d.ts.map +1 -0
  184. package/dist/protocols/p2mr-port.js +12 -0
  185. package/dist/protocols/privacy-port.d.ts +9 -0
  186. package/dist/protocols/privacy-port.d.ts.map +1 -0
  187. package/dist/protocols/privacy-port.js +1 -0
  188. package/dist/protocols/traceability-port.d.ts +12 -0
  189. package/dist/protocols/traceability-port.d.ts.map +1 -0
  190. package/dist/protocols/traceability-port.js +1 -0
  191. package/dist/shared/collection-store.d.ts +12 -0
  192. package/dist/shared/collection-store.d.ts.map +1 -0
  193. package/dist/shared/collection-store.js +26 -0
  194. package/dist/shared/commit.d.ts +24 -0
  195. package/dist/shared/commit.d.ts.map +1 -0
  196. package/dist/shared/commit.js +50 -0
  197. package/dist/shared/crypto.d.ts +2 -0
  198. package/dist/shared/crypto.d.ts.map +1 -0
  199. package/dist/shared/crypto.js +4 -0
  200. package/dist/shared/date.d.ts +2 -0
  201. package/dist/shared/date.d.ts.map +1 -0
  202. package/dist/shared/date.js +3 -0
  203. package/dist/shared/index.d.ts +9 -0
  204. package/dist/shared/index.d.ts.map +1 -0
  205. package/dist/shared/index.js +11 -0
  206. package/dist/shared/logger.d.ts +37 -0
  207. package/dist/shared/logger.d.ts.map +1 -0
  208. package/dist/shared/logger.js +45 -0
  209. package/dist/shared/store.d.ts +25 -0
  210. package/dist/shared/store.d.ts.map +1 -0
  211. package/dist/shared/store.js +18 -0
  212. package/dist/shared/telemetry-sdk.d.ts +26 -0
  213. package/dist/shared/telemetry-sdk.d.ts.map +1 -0
  214. package/dist/shared/telemetry-sdk.js +97 -0
  215. package/dist/shared/telemetry.d.ts +86 -0
  216. package/dist/shared/telemetry.d.ts.map +1 -0
  217. package/dist/shared/telemetry.js +137 -0
  218. package/dist/stark-settlement/application/aggregator-service.d.ts +112 -0
  219. package/dist/stark-settlement/application/aggregator-service.d.ts.map +1 -0
  220. package/dist/stark-settlement/application/aggregator-service.js +256 -0
  221. package/dist/stark-settlement/application/ledger-service.d.ts +114 -0
  222. package/dist/stark-settlement/application/ledger-service.d.ts.map +1 -0
  223. package/dist/stark-settlement/application/ledger-service.js +318 -0
  224. package/dist/stark-settlement/application/settlement-service.d.ts +104 -0
  225. package/dist/stark-settlement/application/settlement-service.d.ts.map +1 -0
  226. package/dist/stark-settlement/application/settlement-service.js +251 -0
  227. package/dist/stark-settlement/domain/entities.d.ts +365 -0
  228. package/dist/stark-settlement/domain/entities.d.ts.map +1 -0
  229. package/dist/stark-settlement/domain/entities.js +29 -0
  230. package/dist/stark-settlement/domain/ports.d.ts +485 -0
  231. package/dist/stark-settlement/domain/ports.d.ts.map +1 -0
  232. package/dist/stark-settlement/domain/ports.js +14 -0
  233. package/dist/stark-settlement/domain/value-objects.d.ts +268 -0
  234. package/dist/stark-settlement/domain/value-objects.d.ts.map +1 -0
  235. package/dist/stark-settlement/domain/value-objects.js +500 -0
  236. package/dist/stark-settlement/index.d.ts +172 -0
  237. package/dist/stark-settlement/index.d.ts.map +1 -0
  238. package/dist/stark-settlement/index.js +193 -0
  239. package/dist/stark-settlement/infrastructure/adapters/audit-adapter.d.ts +52 -0
  240. package/dist/stark-settlement/infrastructure/adapters/audit-adapter.d.ts.map +1 -0
  241. package/dist/stark-settlement/infrastructure/adapters/audit-adapter.js +154 -0
  242. package/dist/stark-settlement/infrastructure/adapters/bitcoin-adapter.d.ts +88 -0
  243. package/dist/stark-settlement/infrastructure/adapters/bitcoin-adapter.d.ts.map +1 -0
  244. package/dist/stark-settlement/infrastructure/adapters/bitcoin-adapter.js +187 -0
  245. package/dist/stark-settlement/infrastructure/adapters/clock-adapter.d.ts +59 -0
  246. package/dist/stark-settlement/infrastructure/adapters/clock-adapter.d.ts.map +1 -0
  247. package/dist/stark-settlement/infrastructure/adapters/clock-adapter.js +85 -0
  248. package/dist/stark-settlement/infrastructure/adapters/dilithium-adapter.d.ts +60 -0
  249. package/dist/stark-settlement/infrastructure/adapters/dilithium-adapter.d.ts.map +1 -0
  250. package/dist/stark-settlement/infrastructure/adapters/dilithium-adapter.js +104 -0
  251. package/dist/stark-settlement/infrastructure/adapters/event-emitter-adapter.d.ts +115 -0
  252. package/dist/stark-settlement/infrastructure/adapters/event-emitter-adapter.d.ts.map +1 -0
  253. package/dist/stark-settlement/infrastructure/adapters/event-emitter-adapter.js +191 -0
  254. package/dist/stark-settlement/infrastructure/adapters/fiat-adapter.d.ts +65 -0
  255. package/dist/stark-settlement/infrastructure/adapters/fiat-adapter.d.ts.map +1 -0
  256. package/dist/stark-settlement/infrastructure/adapters/fiat-adapter.js +207 -0
  257. package/dist/stark-settlement/infrastructure/adapters/mock-stark-adapter.d.ts +73 -0
  258. package/dist/stark-settlement/infrastructure/adapters/mock-stark-adapter.d.ts.map +1 -0
  259. package/dist/stark-settlement/infrastructure/adapters/mock-stark-adapter.js +287 -0
  260. package/dist/stark-settlement/infrastructure/adapters/solana-adapter.d.ts +78 -0
  261. package/dist/stark-settlement/infrastructure/adapters/solana-adapter.d.ts.map +1 -0
  262. package/dist/stark-settlement/infrastructure/adapters/solana-adapter.js +172 -0
  263. package/dist/stark-settlement/infrastructure/adapters/starknet-proof-adapter.d.ts +56 -0
  264. package/dist/stark-settlement/infrastructure/adapters/starknet-proof-adapter.d.ts.map +1 -0
  265. package/dist/stark-settlement/infrastructure/adapters/starknet-proof-adapter.js +261 -0
  266. package/dist/stark-settlement/infrastructure/adapters/stone-proof-adapter.d.ts +125 -0
  267. package/dist/stark-settlement/infrastructure/adapters/stone-proof-adapter.d.ts.map +1 -0
  268. package/dist/stark-settlement/infrastructure/adapters/stone-proof-adapter.js +416 -0
  269. package/dist/stark-settlement/infrastructure/persistence/ledger-store.d.ts +68 -0
  270. package/dist/stark-settlement/infrastructure/persistence/ledger-store.d.ts.map +1 -0
  271. package/dist/stark-settlement/infrastructure/persistence/ledger-store.js +238 -0
  272. package/dist/stark-settlement/infrastructure/persistence/offset-store.d.ts +30 -0
  273. package/dist/stark-settlement/infrastructure/persistence/offset-store.d.ts.map +1 -0
  274. package/dist/stark-settlement/infrastructure/persistence/offset-store.js +57 -0
  275. package/dist/stark-settlement/infrastructure/persistence/outbox-store.d.ts +45 -0
  276. package/dist/stark-settlement/infrastructure/persistence/outbox-store.d.ts.map +1 -0
  277. package/dist/stark-settlement/infrastructure/persistence/outbox-store.js +171 -0
  278. package/dist/traceability/application/recall-assessor.d.ts +13 -0
  279. package/dist/traceability/application/recall-assessor.d.ts.map +1 -0
  280. package/dist/traceability/application/recall-assessor.js +74 -0
  281. package/dist/traceability/domain/entities.d.ts +23 -0
  282. package/dist/traceability/domain/entities.d.ts.map +1 -0
  283. package/dist/traceability/domain/entities.js +1 -0
  284. package/dist/traceability/domain/ports.d.ts +23 -0
  285. package/dist/traceability/domain/ports.d.ts.map +1 -0
  286. package/dist/traceability/domain/ports.js +1 -0
  287. package/dist/traceability/domain/recall.d.ts +12 -0
  288. package/dist/traceability/domain/recall.d.ts.map +1 -0
  289. package/dist/traceability/domain/recall.js +1 -0
  290. package/dist/traceability/index.d.ts +22 -0
  291. package/dist/traceability/index.d.ts.map +1 -0
  292. package/dist/traceability/index.js +26 -0
  293. package/dist/traceability/infrastructure/in-memory-store.d.ts +13 -0
  294. package/dist/traceability/infrastructure/in-memory-store.d.ts.map +1 -0
  295. package/dist/traceability/infrastructure/in-memory-store.js +24 -0
  296. package/package.json +12 -9
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Clock Adapters
3
+ *
4
+ * Implementations of ClockPort for time and UUID operations.
5
+ * Enables deterministic testing with fixed timestamps.
6
+ *
7
+ * @see domain/ports.ts for ClockPort interface
8
+ */
9
+ import type { ClockPort } from "../../domain/ports.js";
10
+ /**
11
+ * Real clock adapter using system time.
12
+ */
13
+ export declare class SystemClock implements ClockPort {
14
+ now(): number;
15
+ uuid(): string;
16
+ }
17
+ /**
18
+ * Fixed clock adapter for deterministic testing.
19
+ *
20
+ * Time advances manually or by a fixed increment per call.
21
+ */
22
+ export declare class FixedClock implements ClockPort {
23
+ private currentTime;
24
+ private uuidCounter;
25
+ private readonly uuidPrefix;
26
+ private readonly autoAdvanceMs;
27
+ constructor(initialTime?: number, // 2024-01-01T00:00:00Z
28
+ options?: {
29
+ uuidPrefix?: string;
30
+ autoAdvanceMs?: number;
31
+ });
32
+ now(): number;
33
+ uuid(): string;
34
+ /**
35
+ * Manually advance time by the specified milliseconds.
36
+ */
37
+ advance(ms: number): void;
38
+ /**
39
+ * Set time to a specific value.
40
+ */
41
+ setTime(time: number): void;
42
+ /**
43
+ * Get the current time without advancing.
44
+ */
45
+ peek(): number;
46
+ /**
47
+ * Reset the clock to initial state.
48
+ */
49
+ reset(initialTime?: number): void;
50
+ /**
51
+ * Get the next UUID that will be generated (for assertions).
52
+ */
53
+ peekNextUuid(): string;
54
+ }
55
+ /**
56
+ * Default clock instance (system clock).
57
+ */
58
+ export declare const defaultClock: ClockPort;
59
+ //# sourceMappingURL=clock-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clock-adapter.d.ts","sourceRoot":"","sources":["../../../../src/stark-settlement/infrastructure/adapters/clock-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEvD;;GAEG;AACH,qBAAa,WAAY,YAAW,SAAS;IAC3C,GAAG,IAAI,MAAM;IAIb,IAAI,IAAI,MAAM;CAGf;AAED;;;;GAIG;AACH,qBAAa,UAAW,YAAW,SAAS;IAC1C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;gBAGrC,WAAW,GAAE,MAAsB,EAAE,uBAAuB;IAC5D,OAAO,GAAE;QACP,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,aAAa,CAAC,EAAE,MAAM,CAAC;KACnB;IAOR,GAAG,IAAI,MAAM;IAQb,IAAI,IAAI,MAAM;IAMd;;OAEG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAIzB;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI3B;;OAEG;IACH,IAAI,IAAI,MAAM;IAId;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IAKjC;;OAEG;IACH,YAAY,IAAI,MAAM;CAIvB;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,SAA6B,CAAC"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Clock Adapters
3
+ *
4
+ * Implementations of ClockPort for time and UUID operations.
5
+ * Enables deterministic testing with fixed timestamps.
6
+ *
7
+ * @see domain/ports.ts for ClockPort interface
8
+ */
9
+ import { randomUUID } from "node:crypto";
10
+ /**
11
+ * Real clock adapter using system time.
12
+ */
13
+ export class SystemClock {
14
+ now() {
15
+ return Date.now();
16
+ }
17
+ uuid() {
18
+ return randomUUID();
19
+ }
20
+ }
21
+ /**
22
+ * Fixed clock adapter for deterministic testing.
23
+ *
24
+ * Time advances manually or by a fixed increment per call.
25
+ */
26
+ export class FixedClock {
27
+ currentTime;
28
+ uuidCounter = 0;
29
+ uuidPrefix;
30
+ autoAdvanceMs;
31
+ constructor(initialTime = 1704067200000, // 2024-01-01T00:00:00Z
32
+ options = {}) {
33
+ this.currentTime = initialTime;
34
+ this.uuidPrefix = options.uuidPrefix ?? "00000000-0000-0000-0000";
35
+ this.autoAdvanceMs = options.autoAdvanceMs ?? 0;
36
+ }
37
+ now() {
38
+ const time = this.currentTime;
39
+ if (this.autoAdvanceMs > 0) {
40
+ this.currentTime += this.autoAdvanceMs;
41
+ }
42
+ return time;
43
+ }
44
+ uuid() {
45
+ const counter = this.uuidCounter++;
46
+ const suffix = counter.toString(16).padStart(12, "0");
47
+ return `${this.uuidPrefix}-${suffix}`;
48
+ }
49
+ /**
50
+ * Manually advance time by the specified milliseconds.
51
+ */
52
+ advance(ms) {
53
+ this.currentTime += ms;
54
+ }
55
+ /**
56
+ * Set time to a specific value.
57
+ */
58
+ setTime(time) {
59
+ this.currentTime = time;
60
+ }
61
+ /**
62
+ * Get the current time without advancing.
63
+ */
64
+ peek() {
65
+ return this.currentTime;
66
+ }
67
+ /**
68
+ * Reset the clock to initial state.
69
+ */
70
+ reset(initialTime) {
71
+ this.currentTime = initialTime ?? 1704067200000;
72
+ this.uuidCounter = 0;
73
+ }
74
+ /**
75
+ * Get the next UUID that will be generated (for assertions).
76
+ */
77
+ peekNextUuid() {
78
+ const suffix = this.uuidCounter.toString(16).padStart(12, "0");
79
+ return `${this.uuidPrefix}-${suffix}`;
80
+ }
81
+ }
82
+ /**
83
+ * Default clock instance (system clock).
84
+ */
85
+ export const defaultClock = new SystemClock();
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Dilithium (ML-DSA-65) Signing Adapter
3
+ *
4
+ * Wraps the existing MPC module's ML-DSA-65 implementation.
5
+ * Provides post-quantum signatures for transaction authentication.
6
+ *
7
+ * @see modules/mpc/src/dsa.ts for underlying implementation
8
+ * @see domain/ports.ts for DilithiumSigningPort interface
9
+ */
10
+ import type { DilithiumSigningPort, TransactionSigningPort } from "../../domain/ports.js";
11
+ import type { TransactionPayload } from "../../domain/entities.js";
12
+ /**
13
+ * Adapter for ML-DSA-65 signing operations.
14
+ *
15
+ * Uses the existing MlDsaSigner from the MPC module.
16
+ */
17
+ export declare class DilithiumSigningAdapter implements DilithiumSigningPort {
18
+ private readonly signer;
19
+ private readonly params;
20
+ constructor();
21
+ generateKeyPair(): {
22
+ publicKey: Uint8Array;
23
+ secretKey: Uint8Array;
24
+ };
25
+ sign(message: Uint8Array, secretKey: Uint8Array): Uint8Array;
26
+ verify(message: Uint8Array, signature: Uint8Array, publicKey: Uint8Array): boolean;
27
+ hashPublicKey(publicKey: Uint8Array): string;
28
+ }
29
+ /**
30
+ * Transaction signing adapter that combines payload serialization with ML-DSA-65 signing.
31
+ */
32
+ export declare class TransactionSigningAdapter implements TransactionSigningPort {
33
+ private readonly dilithium;
34
+ constructor(dilithium: DilithiumSigningPort);
35
+ signPayload(payload: TransactionPayload, secretKey: Uint8Array): Uint8Array;
36
+ verifyPayload(payload: TransactionPayload, signature: Uint8Array, publicKey: Uint8Array): boolean;
37
+ serializePayload(payload: TransactionPayload): Uint8Array;
38
+ }
39
+ /**
40
+ * Mock Dilithium adapter for testing without crypto overhead.
41
+ */
42
+ export declare class MockDilithiumAdapter implements DilithiumSigningPort {
43
+ private keyPairCounter;
44
+ generateKeyPair(): {
45
+ publicKey: Uint8Array;
46
+ secretKey: Uint8Array;
47
+ };
48
+ sign(message: Uint8Array, secretKey: Uint8Array): Uint8Array;
49
+ verify(_message: Uint8Array, signature: Uint8Array, _publicKey: Uint8Array): boolean;
50
+ hashPublicKey(publicKey: Uint8Array): string;
51
+ }
52
+ /**
53
+ * Default Dilithium adapter instance.
54
+ */
55
+ export declare const defaultDilithiumAdapter: DilithiumSigningPort;
56
+ /**
57
+ * Create a transaction signing adapter with the default Dilithium adapter.
58
+ */
59
+ export declare function createTransactionSigningAdapter(): TransactionSigningPort;
60
+ //# sourceMappingURL=dilithium-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dilithium-adapter.d.ts","sourceRoot":"","sources":["../../../../src/stark-settlement/infrastructure/adapters/dilithium-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EACV,oBAAoB,EACpB,sBAAsB,EACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEnE;;;;GAIG;AACH,qBAAa,uBAAwB,YAAW,oBAAoB;IAClE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;;IAM/C,eAAe,IAAI;QAAE,SAAS,EAAE,UAAU,CAAC;QAAC,SAAS,EAAE,UAAU,CAAA;KAAE;IAQnE,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,GAAG,UAAU;IAK5D,MAAM,CACJ,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,UAAU,EACrB,SAAS,EAAE,UAAU,GACpB,OAAO;IAIV,aAAa,CAAC,SAAS,EAAE,UAAU,GAAG,MAAM;CAG7C;AAED;;GAEG;AACH,qBAAa,yBAA0B,YAAW,sBAAsB;IAC1D,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,oBAAoB;IAE5D,WAAW,CAAC,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,UAAU,GAAG,UAAU;IAK3E,aAAa,CACX,OAAO,EAAE,kBAAkB,EAC3B,SAAS,EAAE,UAAU,EACrB,SAAS,EAAE,UAAU,GACpB,OAAO;IAKV,gBAAgB,CAAC,OAAO,EAAE,kBAAkB,GAAG,UAAU;CAK1D;AAED;;GAEG;AACH,qBAAa,oBAAqB,YAAW,oBAAoB;IAC/D,OAAO,CAAC,cAAc,CAAK;IAE3B,eAAe,IAAI;QAAE,SAAS,EAAE,UAAU,CAAC;QAAC,SAAS,EAAE,UAAU,CAAA;KAAE;IAcnE,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,GAAG,UAAU;IAQ5D,MAAM,CACJ,QAAQ,EAAE,UAAU,EACpB,SAAS,EAAE,UAAU,EACrB,UAAU,EAAE,UAAU,GACrB,OAAO;IAKV,aAAa,CAAC,SAAS,EAAE,UAAU,GAAG,MAAM;CAG7C;AAED;;GAEG;AACH,eAAO,MAAM,uBAAuB,EAAE,oBACP,CAAC;AAEhC;;GAEG;AACH,wBAAgB,+BAA+B,IAAI,sBAAsB,CAExE"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Dilithium (ML-DSA-65) Signing Adapter
3
+ *
4
+ * Wraps the existing MPC module's ML-DSA-65 implementation.
5
+ * Provides post-quantum signatures for transaction authentication.
6
+ *
7
+ * @see modules/mpc/src/dsa.ts for underlying implementation
8
+ * @see domain/ports.ts for DilithiumSigningPort interface
9
+ */
10
+ /* eslint-disable @typescript-eslint/no-unused-vars */
11
+ import { createHash } from "node:crypto";
12
+ import { MlDsaSigner } from "../../../mpc/dsa.js";
13
+ /**
14
+ * Adapter for ML-DSA-65 signing operations.
15
+ *
16
+ * Uses the existing MlDsaSigner from the MPC module.
17
+ */
18
+ export class DilithiumSigningAdapter {
19
+ signer;
20
+ params = "ml-dsa-65";
21
+ constructor() {
22
+ this.signer = new MlDsaSigner();
23
+ }
24
+ generateKeyPair() {
25
+ const keypair = this.signer.generateKeyPair(this.params);
26
+ return {
27
+ publicKey: keypair.publicKey,
28
+ secretKey: keypair.secretKey,
29
+ };
30
+ }
31
+ sign(message, secretKey) {
32
+ const result = this.signer.sign(message, secretKey, this.params);
33
+ return result.signature;
34
+ }
35
+ verify(message, signature, publicKey) {
36
+ return this.signer.verify(message, signature, publicKey, this.params);
37
+ }
38
+ hashPublicKey(publicKey) {
39
+ return createHash("sha256").update(publicKey).digest("hex");
40
+ }
41
+ }
42
+ /**
43
+ * Transaction signing adapter that combines payload serialization with ML-DSA-65 signing.
44
+ */
45
+ export class TransactionSigningAdapter {
46
+ dilithium;
47
+ constructor(dilithium) {
48
+ this.dilithium = dilithium;
49
+ }
50
+ signPayload(payload, secretKey) {
51
+ const serialized = this.serializePayload(payload);
52
+ return this.dilithium.sign(serialized, secretKey);
53
+ }
54
+ verifyPayload(payload, signature, publicKey) {
55
+ const serialized = this.serializePayload(payload);
56
+ return this.dilithium.verify(serialized, signature, publicKey);
57
+ }
58
+ serializePayload(payload) {
59
+ // Canonical JSON serialization (sorted keys, no whitespace)
60
+ const canonical = JSON.stringify(payload, Object.keys(payload).sort());
61
+ return new TextEncoder().encode(canonical);
62
+ }
63
+ }
64
+ /**
65
+ * Mock Dilithium adapter for testing without crypto overhead.
66
+ */
67
+ export class MockDilithiumAdapter {
68
+ keyPairCounter = 0;
69
+ generateKeyPair() {
70
+ const id = this.keyPairCounter++;
71
+ const publicKey = new Uint8Array(32);
72
+ const secretKey = new Uint8Array(32);
73
+ // Fill with deterministic pattern
74
+ for (let i = 0; i < 32; i++) {
75
+ publicKey[i] = (id + i) & 0xff;
76
+ secretKey[i] = (id + i + 128) & 0xff;
77
+ }
78
+ return { publicKey, secretKey };
79
+ }
80
+ sign(message, secretKey) {
81
+ // Mock signature: hash of message + secretKey
82
+ const hash = createHash("sha256");
83
+ hash.update(message);
84
+ hash.update(secretKey);
85
+ return new Uint8Array(hash.digest());
86
+ }
87
+ verify(_message, signature, _publicKey) {
88
+ // Mock verification: signature must be 32 bytes
89
+ return signature.length === 32;
90
+ }
91
+ hashPublicKey(publicKey) {
92
+ return createHash("sha256").update(publicKey).digest("hex");
93
+ }
94
+ }
95
+ /**
96
+ * Default Dilithium adapter instance.
97
+ */
98
+ export const defaultDilithiumAdapter = new DilithiumSigningAdapter();
99
+ /**
100
+ * Create a transaction signing adapter with the default Dilithium adapter.
101
+ */
102
+ export function createTransactionSigningAdapter() {
103
+ return new TransactionSigningAdapter(defaultDilithiumAdapter);
104
+ }
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Event Emitter Adapter
3
+ *
4
+ * Implements EventEmitterPort for domain event publication.
5
+ * Uses a simple synchronous pub/sub pattern.
6
+ *
7
+ * @see domain/ports.ts for EventEmitterPort interface
8
+ */
9
+ import type { Logger } from "../../../shared/logger.js";
10
+ import type { SettlementEvent, EventEmitterPort } from "../../domain/ports.js";
11
+ type EventHandler = (event: SettlementEvent) => void;
12
+ type ErrorCallback = (error: unknown, event: SettlementEvent) => void;
13
+ /**
14
+ * Configuration options for InMemoryEventEmitter.
15
+ */
16
+ export interface EventEmitterOptions {
17
+ /** Maximum number of events to retain in history. Default: 1000 */
18
+ maxHistorySize?: number;
19
+ /** Logger for error reporting. Default: noopLogger (silent) */
20
+ logger?: Logger;
21
+ /** Optional callback for handler errors. Called instead of/in addition to logging. */
22
+ onHandlerError?: ErrorCallback;
23
+ }
24
+ /**
25
+ * In-memory event emitter for domain events.
26
+ *
27
+ * Handler errors are routed through an injected Logger instead of console.error,
28
+ * allowing library consumers to control logging behavior.
29
+ */
30
+ export declare class InMemoryEventEmitter implements EventEmitterPort {
31
+ private readonly handlers;
32
+ private readonly typeHandlers;
33
+ private readonly eventHistory;
34
+ private readonly maxHistorySize;
35
+ private readonly logger;
36
+ private readonly onHandlerError;
37
+ constructor(options?: EventEmitterOptions);
38
+ emit(event: SettlementEvent): void;
39
+ /**
40
+ * Safely invoke a handler, routing errors through logger/callback.
41
+ */
42
+ private safeInvoke;
43
+ subscribe(handler: EventHandler): {
44
+ unsubscribe: () => void;
45
+ };
46
+ on<T extends SettlementEvent["type"]>(eventType: T, handler: (event: Extract<SettlementEvent, {
47
+ type: T;
48
+ }>) => void): {
49
+ unsubscribe: () => void;
50
+ };
51
+ /**
52
+ * Get all events of a specific type from history.
53
+ */
54
+ getEvents<T extends SettlementEvent["type"]>(eventType: T): Extract<SettlementEvent, {
55
+ type: T;
56
+ }>[];
57
+ /**
58
+ * Get all events from history.
59
+ */
60
+ getAllEvents(): readonly SettlementEvent[];
61
+ /**
62
+ * Get the count of subscribers.
63
+ */
64
+ getSubscriberCount(): {
65
+ general: number;
66
+ byType: Map<string, number>;
67
+ };
68
+ /**
69
+ * Clear all handlers and history.
70
+ */
71
+ clear(): void;
72
+ /**
73
+ * Clear only history, keep handlers.
74
+ */
75
+ clearHistory(): void;
76
+ }
77
+ /**
78
+ * Configuration options for AsyncEventEmitter.
79
+ */
80
+ export interface AsyncEventEmitterOptions {
81
+ /** Logger for error reporting. Default: noopLogger (silent) */
82
+ logger?: Logger;
83
+ /** Optional callback for handler errors. */
84
+ onHandlerError?: ErrorCallback;
85
+ }
86
+ /**
87
+ * Async event emitter that handles async handlers.
88
+ *
89
+ * Handler errors are routed through an injected Logger instead of console.error,
90
+ * allowing library consumers to control logging behavior.
91
+ */
92
+ export declare class AsyncEventEmitter implements EventEmitterPort {
93
+ private readonly handlers;
94
+ private readonly typeHandlers;
95
+ private readonly logger;
96
+ private readonly onHandlerError;
97
+ constructor(options?: AsyncEventEmitterOptions);
98
+ emit(event: SettlementEvent): void;
99
+ emitAsync(event: SettlementEvent): Promise<void>;
100
+ subscribe(handler: (event: SettlementEvent) => void | Promise<void>): {
101
+ unsubscribe: () => void;
102
+ };
103
+ on<T extends SettlementEvent["type"]>(eventType: T, handler: (event: Extract<SettlementEvent, {
104
+ type: T;
105
+ }>) => void | Promise<void>): {
106
+ unsubscribe: () => void;
107
+ };
108
+ }
109
+ /**
110
+ * Default event emitter instance.
111
+ * Uses noopLogger by default for library-friendly silent behavior.
112
+ */
113
+ export declare const defaultEventEmitter: InMemoryEventEmitter;
114
+ export {};
115
+ //# sourceMappingURL=event-emitter-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-emitter-adapter.d.ts","sourceRoot":"","sources":["../../../../src/stark-settlement/infrastructure/adapters/event-emitter-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Event Emitter Adapter
3
+ *
4
+ * Implements EventEmitterPort for domain event publication.
5
+ * Uses a simple synchronous pub/sub pattern.
6
+ *
7
+ * @see domain/ports.ts for EventEmitterPort interface
8
+ */
9
+ import { noopLogger } from "../../../shared/logger.js";
10
+ /**
11
+ * In-memory event emitter for domain events.
12
+ *
13
+ * Handler errors are routed through an injected Logger instead of console.error,
14
+ * allowing library consumers to control logging behavior.
15
+ */
16
+ export class InMemoryEventEmitter {
17
+ handlers = new Set();
18
+ typeHandlers = new Map();
19
+ eventHistory = [];
20
+ maxHistorySize;
21
+ logger;
22
+ onHandlerError;
23
+ constructor(options = {}) {
24
+ this.maxHistorySize = options.maxHistorySize ?? 1000;
25
+ this.logger = options.logger ?? noopLogger;
26
+ this.onHandlerError = options.onHandlerError;
27
+ }
28
+ emit(event) {
29
+ // Store in history
30
+ this.eventHistory.push(event);
31
+ if (this.eventHistory.length > this.maxHistorySize) {
32
+ this.eventHistory.shift();
33
+ }
34
+ // Notify general handlers
35
+ for (const handler of this.handlers) {
36
+ this.safeInvoke(handler, event);
37
+ }
38
+ // Notify type-specific handlers
39
+ const typeSet = this.typeHandlers.get(event.type);
40
+ if (typeSet) {
41
+ for (const handler of typeSet) {
42
+ this.safeInvoke(handler, event);
43
+ }
44
+ }
45
+ }
46
+ /**
47
+ * Safely invoke a handler, routing errors through logger/callback.
48
+ */
49
+ safeInvoke(handler, event) {
50
+ try {
51
+ handler(event);
52
+ }
53
+ catch (error) {
54
+ // Route error through injected logger instead of console.error
55
+ this.logger.error("Event handler error", {
56
+ eventType: event.type,
57
+ error: error instanceof Error ? error.message : String(error),
58
+ });
59
+ // Also invoke callback if provided
60
+ if (this.onHandlerError) {
61
+ this.onHandlerError(error, event);
62
+ }
63
+ }
64
+ }
65
+ subscribe(handler) {
66
+ this.handlers.add(handler);
67
+ return {
68
+ unsubscribe: () => {
69
+ this.handlers.delete(handler);
70
+ },
71
+ };
72
+ }
73
+ on(eventType, handler) {
74
+ if (!this.typeHandlers.has(eventType)) {
75
+ this.typeHandlers.set(eventType, new Set());
76
+ }
77
+ const wrappedHandler = handler;
78
+ this.typeHandlers.get(eventType).add(wrappedHandler);
79
+ return {
80
+ unsubscribe: () => {
81
+ this.typeHandlers.get(eventType)?.delete(wrappedHandler);
82
+ },
83
+ };
84
+ }
85
+ // ─── Utilities ──────────────────────────────────────────────────────────
86
+ /**
87
+ * Get all events of a specific type from history.
88
+ */
89
+ getEvents(eventType) {
90
+ return this.eventHistory.filter((e) => e.type === eventType);
91
+ }
92
+ /**
93
+ * Get all events from history.
94
+ */
95
+ getAllEvents() {
96
+ return [...this.eventHistory];
97
+ }
98
+ /**
99
+ * Get the count of subscribers.
100
+ */
101
+ getSubscriberCount() {
102
+ const byType = new Map();
103
+ for (const [type, handlers] of this.typeHandlers) {
104
+ byType.set(type, handlers.size);
105
+ }
106
+ return {
107
+ general: this.handlers.size,
108
+ byType,
109
+ };
110
+ }
111
+ /**
112
+ * Clear all handlers and history.
113
+ */
114
+ clear() {
115
+ this.handlers.clear();
116
+ this.typeHandlers.clear();
117
+ this.eventHistory.length = 0;
118
+ }
119
+ /**
120
+ * Clear only history, keep handlers.
121
+ */
122
+ clearHistory() {
123
+ this.eventHistory.length = 0;
124
+ }
125
+ }
126
+ /**
127
+ * Async event emitter that handles async handlers.
128
+ *
129
+ * Handler errors are routed through an injected Logger instead of console.error,
130
+ * allowing library consumers to control logging behavior.
131
+ */
132
+ export class AsyncEventEmitter {
133
+ handlers = new Set();
134
+ typeHandlers = new Map();
135
+ logger;
136
+ onHandlerError;
137
+ constructor(options = {}) {
138
+ this.logger = options.logger ?? noopLogger;
139
+ this.onHandlerError = options.onHandlerError;
140
+ }
141
+ emit(event) {
142
+ // Fire and forget for async handlers
143
+ this.emitAsync(event).catch((error) => {
144
+ this.logger.error("Async event emission error", {
145
+ eventType: event.type,
146
+ error: error instanceof Error ? error.message : String(error),
147
+ });
148
+ if (this.onHandlerError) {
149
+ this.onHandlerError(error, event);
150
+ }
151
+ });
152
+ }
153
+ async emitAsync(event) {
154
+ const promises = [];
155
+ for (const handler of this.handlers) {
156
+ promises.push(Promise.resolve(handler(event)));
157
+ }
158
+ const typeSet = this.typeHandlers.get(event.type);
159
+ if (typeSet) {
160
+ for (const handler of typeSet) {
161
+ promises.push(Promise.resolve(handler(event)));
162
+ }
163
+ }
164
+ await Promise.all(promises);
165
+ }
166
+ subscribe(handler) {
167
+ this.handlers.add(handler);
168
+ return {
169
+ unsubscribe: () => {
170
+ this.handlers.delete(handler);
171
+ },
172
+ };
173
+ }
174
+ on(eventType, handler) {
175
+ if (!this.typeHandlers.has(eventType)) {
176
+ this.typeHandlers.set(eventType, new Set());
177
+ }
178
+ const wrappedHandler = handler;
179
+ this.typeHandlers.get(eventType).add(wrappedHandler);
180
+ return {
181
+ unsubscribe: () => {
182
+ this.typeHandlers.get(eventType)?.delete(wrappedHandler);
183
+ },
184
+ };
185
+ }
186
+ }
187
+ /**
188
+ * Default event emitter instance.
189
+ * Uses noopLogger by default for library-friendly silent behavior.
190
+ */
191
+ export const defaultEventEmitter = new InMemoryEventEmitter();