@proto-kit/common 0.1.1-develop.211 → 0.1.1-develop.2137

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 (258) hide show
  1. package/dist/cache/CacheManifest.d.ts +11 -0
  2. package/dist/cache/CacheManifest.d.ts.map +1 -0
  3. package/dist/cache/CacheManifest.js +56 -0
  4. package/dist/cache/CacheManifest.js.map +1 -0
  5. package/dist/cache/ProxyCache.d.ts +13 -0
  6. package/dist/cache/ProxyCache.d.ts.map +1 -0
  7. package/dist/cache/ProxyCache.js +24 -0
  8. package/dist/cache/ProxyCache.js.map +1 -0
  9. package/dist/cache/RemoteCache.d.ts +8 -0
  10. package/dist/cache/RemoteCache.d.ts.map +1 -0
  11. package/dist/cache/RemoteCache.js +2 -0
  12. package/dist/cache/RemoteCache.js.map +1 -0
  13. package/dist/cache/RemoteCacheCompiler.d.ts +16 -0
  14. package/dist/cache/RemoteCacheCompiler.d.ts.map +1 -0
  15. package/dist/cache/RemoteCacheCompiler.js +104 -0
  16. package/dist/cache/RemoteCacheCompiler.js.map +1 -0
  17. package/dist/compiling/AtomicCompileHelper.d.ts +15 -0
  18. package/dist/compiling/AtomicCompileHelper.d.ts.map +1 -0
  19. package/dist/compiling/AtomicCompileHelper.js +61 -0
  20. package/dist/compiling/AtomicCompileHelper.js.map +1 -0
  21. package/dist/compiling/CompilableModule.d.ts +6 -0
  22. package/dist/compiling/CompilableModule.d.ts.map +1 -0
  23. package/dist/compiling/CompilableModule.js +2 -0
  24. package/dist/compiling/CompilableModule.js.map +1 -0
  25. package/dist/compiling/CompileRegistry.d.ts +25 -0
  26. package/dist/compiling/CompileRegistry.d.ts.map +1 -0
  27. package/dist/compiling/CompileRegistry.js +62 -0
  28. package/dist/compiling/CompileRegistry.js.map +1 -0
  29. package/dist/compiling/services/ChildVerificationKeyService.d.ts +10 -0
  30. package/dist/compiling/services/ChildVerificationKeyService.d.ts.map +1 -0
  31. package/dist/compiling/services/ChildVerificationKeyService.js +27 -0
  32. package/dist/compiling/services/ChildVerificationKeyService.js.map +1 -0
  33. package/dist/config/ChildContainerCreatable.d.ts +5 -0
  34. package/dist/config/ChildContainerCreatable.d.ts.map +1 -0
  35. package/dist/config/ChildContainerCreatable.js +2 -0
  36. package/dist/config/ChildContainerCreatable.js.map +1 -0
  37. package/dist/config/ChildContainerProvider.d.ts +5 -0
  38. package/dist/config/ChildContainerProvider.d.ts.map +1 -0
  39. package/dist/config/ChildContainerProvider.js +2 -0
  40. package/dist/config/ChildContainerProvider.js.map +1 -0
  41. package/dist/config/ConfigurableModule.d.ts +6 -2
  42. package/dist/config/ConfigurableModule.d.ts.map +1 -1
  43. package/dist/config/ConfigurableModule.js +5 -0
  44. package/dist/config/ConfigurableModule.js.map +1 -0
  45. package/dist/config/ModuleContainer.d.ts +70 -23
  46. package/dist/config/ModuleContainer.d.ts.map +1 -1
  47. package/dist/config/ModuleContainer.js +164 -31
  48. package/dist/config/ModuleContainer.js.map +1 -0
  49. package/dist/config/Startable.d.ts +4 -0
  50. package/dist/config/Startable.d.ts.map +1 -0
  51. package/dist/config/Startable.js +2 -0
  52. package/dist/config/Startable.js.map +1 -0
  53. package/dist/config/injectAlias.d.ts +18 -0
  54. package/dist/config/injectAlias.d.ts.map +1 -0
  55. package/dist/config/injectAlias.js +47 -0
  56. package/dist/config/injectAlias.js.map +1 -0
  57. package/dist/dependencyFactory/DependencyFactory.d.ts +14 -9
  58. package/dist/dependencyFactory/DependencyFactory.d.ts.map +1 -1
  59. package/dist/dependencyFactory/DependencyFactory.js +2 -96
  60. package/dist/dependencyFactory/DependencyFactory.js.map +1 -0
  61. package/dist/dependencyFactory/injectOptional.d.ts +16 -0
  62. package/dist/dependencyFactory/injectOptional.d.ts.map +1 -0
  63. package/dist/dependencyFactory/injectOptional.js +40 -0
  64. package/dist/dependencyFactory/injectOptional.js.map +1 -0
  65. package/dist/dummyVerificationKey.d.ts +3 -0
  66. package/dist/dummyVerificationKey.d.ts.map +1 -0
  67. package/dist/dummyVerificationKey.js +8 -0
  68. package/dist/dummyVerificationKey.js.map +1 -0
  69. package/dist/events/EventEmitter.d.ts +19 -0
  70. package/dist/events/EventEmitter.d.ts.map +1 -0
  71. package/dist/events/EventEmitter.js +35 -0
  72. package/dist/events/EventEmitter.js.map +1 -0
  73. package/dist/events/EventEmitterProxy.d.ts +18 -0
  74. package/dist/events/EventEmitterProxy.d.ts.map +1 -0
  75. package/dist/events/EventEmitterProxy.js +35 -0
  76. package/dist/events/EventEmitterProxy.js.map +1 -0
  77. package/dist/events/EventEmittingComponent.d.ts +9 -0
  78. package/dist/events/EventEmittingComponent.d.ts.map +1 -0
  79. package/dist/events/EventEmittingComponent.js +2 -0
  80. package/dist/events/EventEmittingComponent.js.map +1 -0
  81. package/dist/events/ReplayingSingleUseEventEmitter.d.ts +17 -0
  82. package/dist/events/ReplayingSingleUseEventEmitter.d.ts.map +1 -0
  83. package/dist/events/ReplayingSingleUseEventEmitter.js +34 -0
  84. package/dist/events/ReplayingSingleUseEventEmitter.js.map +1 -0
  85. package/dist/index.d.ts +27 -1
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +28 -2
  88. package/dist/index.js.map +1 -0
  89. package/dist/log.d.ts +37 -0
  90. package/dist/log.d.ts.map +1 -0
  91. package/dist/log.js +117 -0
  92. package/dist/log.js.map +1 -0
  93. package/dist/trees/InMemoryLinkedLeafStore.d.ts +21 -0
  94. package/dist/trees/InMemoryLinkedLeafStore.d.ts.map +1 -0
  95. package/dist/trees/InMemoryLinkedLeafStore.js +26 -0
  96. package/dist/trees/InMemoryLinkedLeafStore.js.map +1 -0
  97. package/dist/trees/InMemoryLinkedMerkleLeafStore.d.ts +7 -0
  98. package/dist/trees/InMemoryLinkedMerkleLeafStore.d.ts.map +1 -0
  99. package/dist/trees/InMemoryLinkedMerkleLeafStore.js +6 -0
  100. package/dist/trees/InMemoryLinkedMerkleLeafStore.js.map +1 -0
  101. package/dist/trees/InMemoryMerkleTreeStorage.d.ts +11 -0
  102. package/dist/trees/InMemoryMerkleTreeStorage.d.ts.map +1 -0
  103. package/dist/trees/InMemoryMerkleTreeStorage.js +13 -0
  104. package/dist/trees/InMemoryMerkleTreeStorage.js.map +1 -0
  105. package/dist/trees/LinkedMerkleTree.d.ts +345 -0
  106. package/dist/trees/LinkedMerkleTree.d.ts.map +1 -0
  107. package/dist/trees/LinkedMerkleTree.js +337 -0
  108. package/dist/trees/LinkedMerkleTree.js.map +1 -0
  109. package/dist/trees/LinkedMerkleTreeStore.d.ts +24 -0
  110. package/dist/trees/LinkedMerkleTreeStore.d.ts.map +1 -0
  111. package/dist/trees/LinkedMerkleTreeStore.js +2 -0
  112. package/dist/trees/LinkedMerkleTreeStore.js.map +1 -0
  113. package/dist/trees/MerkleTreeStore.d.ts +5 -0
  114. package/dist/trees/MerkleTreeStore.d.ts.map +1 -0
  115. package/dist/trees/MerkleTreeStore.js +2 -0
  116. package/dist/trees/MerkleTreeStore.js.map +1 -0
  117. package/dist/trees/MockAsyncMerkleStore.d.ts +9 -0
  118. package/dist/trees/MockAsyncMerkleStore.d.ts.map +1 -0
  119. package/dist/trees/MockAsyncMerkleStore.js +20 -0
  120. package/dist/trees/MockAsyncMerkleStore.js.map +1 -0
  121. package/dist/trees/RollupMerkleTree.d.ts +147 -0
  122. package/dist/trees/RollupMerkleTree.d.ts.map +1 -0
  123. package/dist/trees/RollupMerkleTree.js +218 -0
  124. package/dist/trees/RollupMerkleTree.js.map +1 -0
  125. package/dist/trees/VirtualMerkleTreeStore.d.ts +13 -0
  126. package/dist/trees/VirtualMerkleTreeStore.d.ts.map +1 -0
  127. package/dist/trees/VirtualMerkleTreeStore.js +18 -0
  128. package/dist/trees/VirtualMerkleTreeStore.js.map +1 -0
  129. package/dist/trees/lmt/AbstractLinkedMerkleTree.d.ts +288 -0
  130. package/dist/trees/lmt/AbstractLinkedMerkleTree.d.ts.map +1 -0
  131. package/dist/trees/lmt/AbstractLinkedMerkleTree.js +22 -0
  132. package/dist/trees/lmt/AbstractLinkedMerkleTree.js.map +1 -0
  133. package/dist/trees/lmt/InMemoryLinkedLeafStore.d.ts +21 -0
  134. package/dist/trees/lmt/InMemoryLinkedLeafStore.d.ts.map +1 -0
  135. package/dist/trees/lmt/InMemoryLinkedLeafStore.js +26 -0
  136. package/dist/trees/lmt/InMemoryLinkedLeafStore.js.map +1 -0
  137. package/dist/trees/lmt/InMemoryLinkedMerkleLeafStore.d.ts +7 -0
  138. package/dist/trees/lmt/InMemoryLinkedMerkleLeafStore.d.ts.map +1 -0
  139. package/dist/trees/lmt/InMemoryLinkedMerkleLeafStore.js +6 -0
  140. package/dist/trees/lmt/InMemoryLinkedMerkleLeafStore.js.map +1 -0
  141. package/dist/trees/lmt/LinkedLeafStore.d.ts +16 -0
  142. package/dist/trees/lmt/LinkedLeafStore.d.ts.map +1 -0
  143. package/dist/trees/lmt/LinkedLeafStore.js +2 -0
  144. package/dist/trees/lmt/LinkedLeafStore.js.map +1 -0
  145. package/dist/trees/lmt/LinkedLinkedStore.d.ts +16 -0
  146. package/dist/trees/lmt/LinkedLinkedStore.d.ts.map +1 -0
  147. package/dist/trees/lmt/LinkedLinkedStore.js +2 -0
  148. package/dist/trees/lmt/LinkedLinkedStore.js.map +1 -0
  149. package/dist/trees/lmt/LinkedMerkleTree.d.ts +11 -0
  150. package/dist/trees/lmt/LinkedMerkleTree.d.ts.map +1 -0
  151. package/dist/trees/lmt/LinkedMerkleTree.js +241 -0
  152. package/dist/trees/lmt/LinkedMerkleTree.js.map +1 -0
  153. package/dist/trees/lmt/LinkedMerkleTreeCircuitOps.d.ts +113 -0
  154. package/dist/trees/lmt/LinkedMerkleTreeCircuitOps.d.ts.map +1 -0
  155. package/dist/trees/lmt/LinkedMerkleTreeCircuitOps.js +113 -0
  156. package/dist/trees/lmt/LinkedMerkleTreeCircuitOps.js.map +1 -0
  157. package/dist/trees/lmt/LinkedMerkleTreeDatabase.d.ts +7 -0
  158. package/dist/trees/lmt/LinkedMerkleTreeDatabase.d.ts.map +1 -0
  159. package/dist/trees/lmt/LinkedMerkleTreeDatabase.js +2 -0
  160. package/dist/trees/lmt/LinkedMerkleTreeDatabase.js.map +1 -0
  161. package/dist/trees/lmt/LinkedMerkleTreeStore.d.ts +16 -0
  162. package/dist/trees/lmt/LinkedMerkleTreeStore.d.ts.map +1 -0
  163. package/dist/trees/lmt/LinkedMerkleTreeStore.js +2 -0
  164. package/dist/trees/lmt/LinkedMerkleTreeStore.js.map +1 -0
  165. package/dist/trees/lmt/LinkedMerkleTreeTypes.d.ts +74 -0
  166. package/dist/trees/lmt/LinkedMerkleTreeTypes.d.ts.map +1 -0
  167. package/dist/trees/lmt/LinkedMerkleTreeTypes.js +50 -0
  168. package/dist/trees/lmt/LinkedMerkleTreeTypes.js.map +1 -0
  169. package/dist/trees/sparse/InMemoryMerkleTreeStorage.d.ts +11 -0
  170. package/dist/trees/sparse/InMemoryMerkleTreeStorage.d.ts.map +1 -0
  171. package/dist/trees/sparse/InMemoryMerkleTreeStorage.js +13 -0
  172. package/dist/trees/sparse/InMemoryMerkleTreeStorage.js.map +1 -0
  173. package/dist/trees/sparse/MerkleTreeStore.d.ts +5 -0
  174. package/dist/trees/sparse/MerkleTreeStore.d.ts.map +1 -0
  175. package/dist/trees/sparse/MerkleTreeStore.js +2 -0
  176. package/dist/trees/sparse/MerkleTreeStore.js.map +1 -0
  177. package/dist/trees/sparse/MockAsyncMerkleStore.d.ts +9 -0
  178. package/dist/trees/sparse/MockAsyncMerkleStore.d.ts.map +1 -0
  179. package/dist/trees/sparse/MockAsyncMerkleStore.js +20 -0
  180. package/dist/trees/sparse/MockAsyncMerkleStore.js.map +1 -0
  181. package/dist/trees/sparse/RollupMerkleTree.d.ts +158 -0
  182. package/dist/trees/sparse/RollupMerkleTree.d.ts.map +1 -0
  183. package/dist/trees/sparse/RollupMerkleTree.js +330 -0
  184. package/dist/trees/sparse/RollupMerkleTree.js.map +1 -0
  185. package/dist/types.d.ts +62 -0
  186. package/dist/types.d.ts.map +1 -1
  187. package/dist/types.js +14 -1
  188. package/dist/types.js.map +1 -0
  189. package/dist/union/union.d.ts +177 -0
  190. package/dist/union/union.d.ts.map +1 -0
  191. package/dist/union/union.js +35 -0
  192. package/dist/union/union.js.map +1 -0
  193. package/dist/utils.d.ts +57 -2
  194. package/dist/utils.d.ts.map +1 -1
  195. package/dist/utils.js +153 -4
  196. package/dist/utils.js.map +1 -0
  197. package/dist/zkProgrammable/ProvableMethodExecutionContext.d.ts +4 -3
  198. package/dist/zkProgrammable/ProvableMethodExecutionContext.d.ts.map +1 -1
  199. package/dist/zkProgrammable/ProvableMethodExecutionContext.js +2 -3
  200. package/dist/zkProgrammable/ProvableMethodExecutionContext.js.map +1 -0
  201. package/dist/zkProgrammable/ZkProgrammable.d.ts +32 -11
  202. package/dist/zkProgrammable/ZkProgrammable.d.ts.map +1 -1
  203. package/dist/zkProgrammable/ZkProgrammable.js +36 -17
  204. package/dist/zkProgrammable/ZkProgrammable.js.map +1 -0
  205. package/dist/zkProgrammable/provableMethod.d.ts +7 -4
  206. package/dist/zkProgrammable/provableMethod.d.ts.map +1 -1
  207. package/dist/zkProgrammable/provableMethod.js +30 -14
  208. package/dist/zkProgrammable/provableMethod.js.map +1 -0
  209. package/jest.config.cjs +12 -1
  210. package/package.json +9 -7
  211. package/src/cache/CacheManifest.ts +57 -0
  212. package/src/cache/ProxyCache.ts +30 -0
  213. package/src/cache/RemoteCache.ts +9 -0
  214. package/src/cache/RemoteCacheCompiler.ts +131 -0
  215. package/src/compiling/AtomicCompileHelper.ts +71 -0
  216. package/src/compiling/CompilableModule.ts +6 -0
  217. package/src/compiling/CompileRegistry.ts +64 -0
  218. package/src/compiling/services/ChildVerificationKeyService.ts +26 -0
  219. package/src/config/ChildContainerCreatable.ts +5 -0
  220. package/src/config/ChildContainerProvider.ts +5 -0
  221. package/src/config/ConfigurableModule.ts +15 -2
  222. package/src/config/ModuleContainer.ts +286 -58
  223. package/src/config/Startable.ts +3 -0
  224. package/src/config/injectAlias.ts +70 -0
  225. package/src/dependencyFactory/DependencyFactory.ts +34 -109
  226. package/src/dummyVerificationKey.ts +10 -0
  227. package/src/events/EventEmitter.ts +61 -0
  228. package/src/events/EventEmitterProxy.ts +81 -0
  229. package/src/events/EventEmittingComponent.ts +11 -0
  230. package/src/events/ReplayingSingleUseEventEmitter.ts +42 -0
  231. package/src/index.ts +27 -2
  232. package/src/log.ts +145 -0
  233. package/src/trees/lmt/AbstractLinkedMerkleTree.ts +102 -0
  234. package/src/trees/lmt/InMemoryLinkedLeafStore.ts +42 -0
  235. package/src/trees/lmt/LinkedLeafStore.ts +13 -0
  236. package/src/trees/lmt/LinkedMerkleTree.ts +335 -0
  237. package/src/trees/lmt/LinkedMerkleTreeCircuitOps.ts +188 -0
  238. package/src/trees/lmt/LinkedMerkleTreeTypes.ts +53 -0
  239. package/src/trees/sparse/InMemoryMerkleTreeStorage.ts +17 -0
  240. package/src/trees/sparse/MerkleTreeStore.ts +5 -0
  241. package/src/trees/sparse/MockAsyncMerkleStore.ts +30 -0
  242. package/src/trees/sparse/RollupMerkleTree.ts +512 -0
  243. package/src/types.ts +53 -2
  244. package/src/utils.ts +281 -5
  245. package/src/zkProgrammable/ProvableMethodExecutionContext.ts +6 -6
  246. package/src/zkProgrammable/ZkProgrammable.ts +90 -35
  247. package/src/zkProgrammable/provableMethod.ts +50 -23
  248. package/test/config/ContainerEvents.test.ts +65 -0
  249. package/test/config/ModuleContainer.test.ts +146 -15
  250. package/test/config/injectAlias.test.ts +28 -0
  251. package/test/trees/LinkedMerkleTree.test.ts +124 -0
  252. package/test/trees/LinkedMerkleTreeCircuitOps.test.ts +147 -0
  253. package/test/trees/MerkleTree.test.ts +251 -0
  254. package/test/tsconfig.json +5 -2
  255. package/test/zkProgrammable/ZkProgrammable.test.ts +145 -119
  256. package/tsconfig.json +1 -1
  257. package/LICENSE.md +0 -201
  258. package/tsconfig.test.json +0 -9
@@ -1,24 +1,23 @@
1
- import { DependencyContainer, injectable, Lifecycle } from "tsyringe";
1
+ import {
2
+ ClassProvider,
3
+ FactoryProvider,
4
+ TokenProvider,
5
+ ValueProvider,
6
+ } from "tsyringe";
2
7
 
3
8
  import { TypedClass } from "../types";
9
+ import type { BaseModuleInstanceType } from "../config/ModuleContainer";
4
10
 
5
- const errors = {
6
- descriptorUndefined: () =>
7
- new Error("Descriptor of that dependency is undefined!"),
11
+ export type DependencyDeclaration<Dependency> =
12
+ | ClassProvider<Dependency>
13
+ | FactoryProvider<Dependency>
14
+ | TokenProvider<Dependency>
15
+ | ValueProvider<Dependency>;
8
16
 
9
- dependencyFactoryCalledDirectly: () =>
10
- new Error(
11
- "You cannot access the depdendency method directly, use container.resolve"
12
- ),
13
- };
14
-
15
- const globalFactoryDependencies = new Map<
17
+ export type DependencyRecord = Record<
16
18
  string,
17
- | {
18
- [key: string]: () => unknown;
19
- }
20
- | undefined
21
- >();
19
+ DependencyDeclaration<unknown> & { forceOverwrite?: boolean }
20
+ >;
22
21
 
23
22
  /**
24
23
  * This is an abstract class for creating DependencyFactories, a pattern
@@ -31,102 +30,28 @@ const globalFactoryDependencies = new Map<
31
30
  *
32
31
  * DependencyFactories are designed to only be used statically for sets of
33
32
  * deps that are necessary for the sequencer to work.
34
- *
35
- * Every Factory need the @dependencyFactory annotation (which basically
36
- * proxies @injectable()) and every method that returns a dependency has to be
37
- * of the format `() => Dependency` and be annotated with @dependency.
38
33
  */
39
- export abstract class DependencyFactory {
40
- public initDependencies(container: DependencyContainer) {
41
- const dependencies =
42
- globalFactoryDependencies.get(this.constructor.name) ?? {};
43
- globalFactoryDependencies.delete(this.constructor.name);
44
-
45
- for (const [key, useFactory] of Object.entries(dependencies)) {
46
- container.register(`${key}_singleton-prototype`, {
47
- useFactory: useFactory.bind(this),
48
- });
49
-
50
- const upperCaseKey = key.charAt(0).toUpperCase() + key.slice(1);
51
-
52
- container.register(
53
- upperCaseKey,
54
- {
55
- useToken: `${key}_singleton-prototype`,
56
- },
57
- { lifecycle: Lifecycle.ContainerScoped }
58
- );
59
- }
60
- }
34
+ export interface DependencyFactory {
35
+ dependencies: () => DependencyRecord;
61
36
  }
62
37
 
63
- // type DTypes = { [key: string]: TypedClass<unknown> }
64
- // type Factories<T extends DTypes> = {
65
- // [key in keyof T]: T[key] extends TypedClass<infer R> ? () => R : never
66
- // }
67
- //
68
- // export abstract class DF2<Types extends DTypes> {
69
- // public constructor(private factories: Factories<Types>) {
70
- //
71
- // }
72
- // generateDependencies(): Types {
73
- // let x = this.factories;
74
- // return {} as Types;
75
- // }
76
- // }
38
+ export type TypeFromDependencyDeclaration<
39
+ Declaration extends DependencyDeclaration<unknown>,
40
+ > =
41
+ Declaration extends DependencyDeclaration<infer Dependency>
42
+ ? Dependency
43
+ : never;
77
44
 
78
- // export function DF2C<T extends Types>(object: Factories<T>): T {
79
- // const c = class C extends DF2<T>{
80
- // generateDependencies(): T {
81
- // return undefined;
82
- // }
83
- // }
84
- // return new c();
85
- // }
45
+ export type CapitalizeAny<Key extends string | number | symbol> =
46
+ Key extends string ? Capitalize<Key> : Key;
86
47
 
87
- // class DF2I extends DF2<{x: typeof ConfigurableModule}> {
88
- // constructor() {
89
- // super({
90
- // x: this.x
91
- // });
92
- // }
93
- //
94
- // x(): ConfigurableModule<any> {
95
- // return {} as ConfigurableModule<any>;
96
- // }
97
- //
98
- // }
99
-
100
- export function dependency() {
101
- return function decorator<Target extends DependencyFactory, Dependency>(
102
- target: Target,
103
- key: string,
104
- descriptor: TypedPropertyDescriptor<() => Dependency>
105
- ) {
106
- if (descriptor.value !== undefined) {
107
- const className = target.constructor.name;
108
- if (!globalFactoryDependencies.has(className)) {
109
- globalFactoryDependencies.set(className, {});
110
- }
111
-
112
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
113
- globalFactoryDependencies.get(target.constructor.name)![key] =
114
- descriptor.value;
115
-
116
- descriptor.value = () => {
117
- throw errors.dependencyFactoryCalledDirectly();
118
- };
119
- } else {
120
- throw errors.descriptorUndefined();
121
- }
122
- return descriptor;
123
- };
124
- }
48
+ export type MapDependencyRecordToTypes<Record extends DependencyRecord> = {
49
+ [Key in keyof Record as CapitalizeAny<Key>]: TypedClass<
50
+ TypeFromDependencyDeclaration<Record[Key]>
51
+ >;
52
+ };
125
53
 
126
- export function dependencyFactory() {
127
- return function decorator<Target extends DependencyFactory>(
128
- target: TypedClass<Target>
129
- ) {
130
- injectable()(target);
131
- };
132
- }
54
+ export type InferDependencies<Class extends BaseModuleInstanceType> =
55
+ Class extends DependencyFactory
56
+ ? MapDependencyRecordToTypes<ReturnType<Class["dependencies"]>>
57
+ : never;
@@ -0,0 +1,10 @@
1
+ import { Field, VerificationKey } from "o1js";
2
+
3
+ export function dummyVerificationKey() {
4
+ return new VerificationKey({
5
+ hash: Field(
6
+ "3392518251768960475377392625298437850623664973002200885669375116181514017494"
7
+ ),
8
+ data: "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",
9
+ });
10
+ }
@@ -0,0 +1,61 @@
1
+ import { EventsRecord } from "./EventEmittingComponent";
2
+
3
+ type ListenersHolder<Events extends EventsRecord> = {
4
+ [key in keyof Events]?: ((...args: Events[key]) => void)[];
5
+ };
6
+
7
+ export class EventEmitter<Events extends EventsRecord> {
8
+ protected readonly listeners: ListenersHolder<Events> = {};
9
+
10
+ protected readonly wildcardListeners: ((
11
+ event: keyof Events,
12
+ args: Events[keyof Events]
13
+ ) => void)[] = [];
14
+
15
+ public emit<Key extends keyof Events>(
16
+ event: Key,
17
+ ...parameters: Events[Key]
18
+ ) {
19
+ const listeners = this.listeners[event];
20
+ if (listeners !== undefined) {
21
+ listeners.forEach((listener) => {
22
+ listener(...parameters);
23
+ });
24
+ }
25
+ this.wildcardListeners.forEach((wildcardListener) => {
26
+ wildcardListener(event, parameters);
27
+ });
28
+ }
29
+
30
+ public onAll(listener: (event: keyof Events, args: unknown[]) => void): void {
31
+ this.wildcardListeners.push(listener);
32
+ }
33
+
34
+ public on<Key extends keyof Events>(
35
+ event: Key,
36
+ listener: (...args: Events[Key]) => void
37
+ ) {
38
+ (this.listeners[event] ??= []).push(listener);
39
+ }
40
+
41
+ /**
42
+ * Primitive .off() with identity comparison for now.
43
+ * Could be replaced by returning an id in .on() and using that.
44
+ */
45
+ public off<Key extends keyof Events>(
46
+ event: Key,
47
+ listener: (...args: Events[Key]) => void
48
+ ) {
49
+ const events = this.listeners[event];
50
+ if (events !== undefined) {
51
+ this.listeners[event] = events.filter(
52
+ (candidate) => candidate !== listener
53
+ );
54
+ }
55
+ }
56
+ }
57
+
58
+ export type EventListenable<Events extends EventsRecord> = Pick<
59
+ EventEmitter<Events>,
60
+ "on" | "onAll" | "off"
61
+ >;
@@ -0,0 +1,81 @@
1
+ import type {
2
+ BaseModuleType,
3
+ ModuleContainer,
4
+ ModulesRecord,
5
+ } from "../config/ModuleContainer";
6
+ import { StringKeyOf, UnionToIntersection } from "../types";
7
+
8
+ import { EventEmitter } from "./EventEmitter";
9
+ import {
10
+ EventEmittingComponent,
11
+ EventEmittingContainer,
12
+ EventsRecord,
13
+ } from "./EventEmittingComponent";
14
+
15
+ export type CastToEventsRecord<Record> = Record extends EventsRecord
16
+ ? Record
17
+ : {};
18
+
19
+ export type ModuleEvents<ModuleType extends BaseModuleType> =
20
+ InstanceType<ModuleType> extends EventEmittingComponent<infer Events>
21
+ ? Events
22
+ : InstanceType<ModuleType> extends ModuleContainer<infer NestedModules>
23
+ ? CastToEventsRecord<ContainerEvents<NestedModules>>
24
+ : // &
25
+ // (InstanceType<ModuleType> extends EventEmittingContainer<
26
+ // infer ContainerEvents
27
+ // >
28
+ // ? ContainerEvents
29
+ // : {})
30
+ EventsRecord;
31
+
32
+ export type ContainerEvents<Modules extends ModulesRecord> = {
33
+ [Key in StringKeyOf<Modules>]: ModuleEvents<Modules[Key]>;
34
+ };
35
+
36
+ export type FlattenObject<Target extends Record<string, EventsRecord>> =
37
+ UnionToIntersection<Target[keyof Target]>;
38
+
39
+ export type FlattenedContainerEvents<Modules extends ModulesRecord> =
40
+ FlattenObject<ContainerEvents<Modules>>; // & FlattenObject<any>;
41
+
42
+ export class EventEmitterProxy<
43
+ Modules extends ModulesRecord,
44
+ > extends EventEmitter<CastToEventsRecord<FlattenedContainerEvents<Modules>>> {
45
+ public constructor(private readonly container: ModuleContainer<Modules>) {
46
+ super();
47
+ container.moduleNames.forEach((moduleName) => {
48
+ if (container.isValidModuleName(container.definition, moduleName)) {
49
+ const module = container.resolve(moduleName);
50
+ if (this.isEventEmitter(module)) {
51
+ module.events.onAll((events: any, args: any[]) => {
52
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
53
+ this.emit(events, ...args);
54
+ });
55
+ }
56
+ if (this.isEventEmittingContainer(module)) {
57
+ module.containerEvents.onAll((events: any, args: any[]) => {
58
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
59
+ this.emit(events, ...args);
60
+ });
61
+ }
62
+ }
63
+ });
64
+ }
65
+
66
+ private isEventEmittingContainer(
67
+ module: any
68
+ ): module is EventEmittingContainer<EventsRecord> {
69
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
70
+ const emitter = module.containerEvents;
71
+ return emitter !== undefined && emitter instanceof EventEmitter;
72
+ }
73
+
74
+ private isEventEmitter(
75
+ module: any
76
+ ): module is EventEmittingComponent<EventsRecord> {
77
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
78
+ const emitter = module.events;
79
+ return emitter !== undefined && emitter instanceof EventEmitter;
80
+ }
81
+ }
@@ -0,0 +1,11 @@
1
+ import type { EventEmitter } from "./EventEmitter";
2
+
3
+ export type EventsRecord = Record<string, unknown[]>;
4
+
5
+ export interface EventEmittingComponent<Events extends EventsRecord> {
6
+ events: EventEmitter<Events>;
7
+ }
8
+
9
+ export interface EventEmittingContainer<Events extends EventsRecord> {
10
+ containerEvents: EventEmitter<Events>;
11
+ }
@@ -0,0 +1,42 @@
1
+ import { EventsRecord } from "./EventEmittingComponent";
2
+ import { EventEmitter } from "./EventEmitter";
3
+
4
+ /**
5
+ * Event Emitter variant that emits a certain event only once to a registered listener.
6
+ * Additionally, if a listener registers to a event that has already been emitted, it
7
+ * re-emits it to said listener.
8
+ * This pattern is especially useful for listening for inclusions of transactions.
9
+ * Those events will only occur once, and listeners could come too late to the party,
10
+ * so we need to make sure they get notified as well in those cases.
11
+ */
12
+ export class ReplayingSingleUseEventEmitter<
13
+ Events extends EventsRecord,
14
+ > extends EventEmitter<Events> {
15
+ public emitted: Partial<Events> = {};
16
+
17
+ public emit<Key extends keyof Events>(
18
+ event: Key,
19
+ ...parameters: Events[Key]
20
+ ) {
21
+ super.emit(event, ...parameters);
22
+ this.emitted[event] = parameters;
23
+ this.listeners[event] = [];
24
+ }
25
+
26
+ public onAll(listener: (event: keyof Events, args: unknown[]) => void) {
27
+ Object.entries(this.emitted).forEach(([key, params]) => {
28
+ if (params !== undefined) listener(key, params);
29
+ });
30
+ super.onAll(listener);
31
+ }
32
+
33
+ public on<Key extends keyof Events>(
34
+ event: Key,
35
+ listener: (...args: Events[Key]) => void
36
+ ) {
37
+ if (this.emitted[event] !== undefined) {
38
+ listener(...this.emitted[event]!);
39
+ }
40
+ super.on(event, listener);
41
+ }
42
+ }
package/src/index.ts CHANGED
@@ -1,10 +1,35 @@
1
1
  export * from "./config/ModuleContainer";
2
2
  export * from "./config/ConfigurableModule";
3
+ export * from "./config/ChildContainerProvider";
4
+ export * from "./config/ChildContainerCreatable";
5
+ export * from "./config/injectAlias";
6
+ export * from "./config/Startable";
3
7
  export * from "./types";
4
8
  export * from "./zkProgrammable/ZkProgrammable";
5
9
  export * from "./zkProgrammable/ProvableMethodExecutionContext";
6
10
  export * from "./zkProgrammable/provableMethod";
7
11
  export * from "./utils";
8
12
  export * from "./dependencyFactory/DependencyFactory";
9
- // eslint-disable-next-line import/no-unused-modules
10
- export { default as log } from "loglevel";
13
+ export * from "./log";
14
+ export * from "./events/EventEmittingComponent";
15
+ export * from "./events/EventEmitter";
16
+ export * from "./trees/sparse/MerkleTreeStore";
17
+ export * from "./trees/sparse/InMemoryMerkleTreeStorage";
18
+ export * from "./trees/sparse/RollupMerkleTree";
19
+ export * from "./trees/lmt/LinkedLeafStore";
20
+ export * from "./trees/lmt/LinkedMerkleTree";
21
+ export * from "./trees/lmt/InMemoryLinkedLeafStore";
22
+ export * from "./trees/lmt/LinkedMerkleTreeCircuitOps";
23
+ export * from "./trees/lmt/AbstractLinkedMerkleTree";
24
+ export * from "./trees/lmt/LinkedMerkleTreeTypes";
25
+ export * from "./events/EventEmitterProxy";
26
+ export * from "./events/ReplayingSingleUseEventEmitter";
27
+ export * from "./trees/sparse/MockAsyncMerkleStore";
28
+ export * from "./compiling/AtomicCompileHelper";
29
+ export * from "./compiling/CompileRegistry";
30
+ export * from "./compiling/CompilableModule";
31
+ export * from "./compiling/services/ChildVerificationKeyService";
32
+ export * from "./cache/RemoteCache";
33
+ export * from "./cache/RemoteCacheCompiler";
34
+ export * from "./cache/CacheManifest";
35
+ export * from "./cache/ProxyCache";
package/src/log.ts ADDED
@@ -0,0 +1,145 @@
1
+ import loglevel, { LogLevelDesc, LogLevelNames } from "loglevel";
2
+ import { Provable } from "o1js";
3
+
4
+ /* eslint-disable @typescript-eslint/no-unsafe-argument */
5
+ function logProvable(
6
+ logFunction: (...args: unknown[]) => void,
7
+ ...args: any[]
8
+ ) {
9
+ Provable.asProver(() => {
10
+ const prettyArguments: string[] = [];
11
+
12
+ args.forEach((argument) => {
13
+ if (argument?.toPretty !== undefined) {
14
+ prettyArguments.push(argument.toPretty());
15
+ } else {
16
+ try {
17
+ prettyArguments.push(JSON.parse(JSON.stringify(argument)));
18
+ } catch {
19
+ prettyArguments.push(argument);
20
+ }
21
+ }
22
+ });
23
+ logFunction(...prettyArguments);
24
+ });
25
+ }
26
+ /* eslint-enable */
27
+
28
+ // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
29
+ if (process.env?.IN_CI ?? false) {
30
+ loglevel.setLevel("ERROR");
31
+ } else {
32
+ loglevel.setLevel("INFO");
33
+ }
34
+
35
+ const timeMap: Record<string, number> = {};
36
+
37
+ function time(label = "time") {
38
+ timeMap[label] = Date.now();
39
+ }
40
+
41
+ function timeLog(label = "time"): string {
42
+ const prev = timeMap[label];
43
+ if (prev === undefined) {
44
+ return "Label not found";
45
+ }
46
+ return `${label} took ${Date.now() - prev}ms`;
47
+ }
48
+
49
+ function timeEnd(label = "time"): string {
50
+ const str = timeLog(label);
51
+ delete timeMap[label];
52
+ return str;
53
+ }
54
+
55
+ export const log = {
56
+ provable: {
57
+ info: (...args: unknown[]) => {
58
+ logProvable(loglevel.info, ...args);
59
+ },
60
+
61
+ debug: (...args: unknown[]) => {
62
+ logProvable(loglevel.debug, ...args);
63
+ },
64
+
65
+ error: (...args: unknown[]) => {
66
+ logProvable(loglevel.error, ...args);
67
+ },
68
+
69
+ trace: (...args: unknown[]) => {
70
+ logProvable(log.trace, ...args);
71
+ },
72
+
73
+ warn: (...args: unknown[]) => {
74
+ logProvable(loglevel.warn, ...args);
75
+ },
76
+ },
77
+
78
+ time,
79
+
80
+ timeLog: {
81
+ info: (label?: string) => loglevel.info(timeLog(label)),
82
+ debug: (label?: string) => loglevel.debug(timeLog(label)),
83
+ error: (label?: string) => loglevel.error(timeLog(label)),
84
+ trace: (label?: string) => loglevel.trace(timeLog(label)),
85
+ warn: (label?: string) => loglevel.warn(timeLog(label)),
86
+ },
87
+
88
+ timeEnd: {
89
+ info: (label?: string) => loglevel.info(timeEnd(label)),
90
+ debug: (label?: string) => loglevel.debug(timeEnd(label)),
91
+ error: (label?: string) => loglevel.error(timeEnd(label)),
92
+ trace: (label?: string) => loglevel.trace(timeEnd(label)),
93
+ warn: (label?: string) => loglevel.warn(timeEnd(label)),
94
+ },
95
+
96
+ info: (...args: unknown[]) => {
97
+ loglevel.info(...args);
98
+ },
99
+
100
+ debug: (...args: unknown[]) => {
101
+ loglevel.debug(...args);
102
+ },
103
+
104
+ error: (...args: unknown[]) => {
105
+ loglevel.error(...args);
106
+ },
107
+
108
+ trace: (...args: unknown[]) => {
109
+ // Loglevel prints the stack trace by default. To still be able to use trace
110
+ // inside out application, we use the level, but call debug() under the hood
111
+ if (loglevel.getLevel() <= loglevel.levels.TRACE) {
112
+ loglevel.debug(...args);
113
+ }
114
+ },
115
+
116
+ warn: (...args: unknown[]) => {
117
+ loglevel.warn(...args);
118
+ },
119
+
120
+ setLevel: (level: LogLevelDesc) => {
121
+ // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
122
+ if (!(process.env?.IN_CI ?? false)) {
123
+ loglevel.setLevel(level);
124
+ }
125
+ },
126
+
127
+ get levels() {
128
+ return loglevel.levels;
129
+ },
130
+
131
+ getLevel: () => loglevel.getLevel(),
132
+ };
133
+
134
+ const validLogLevels = ["TRACE", "DEBUG", "INFO", "WARN", "ERROR", "SILENT"];
135
+
136
+ export function assertValidTextLogLevel(
137
+ level: string | number
138
+ ): asserts level is LogLevelNames {
139
+ if (
140
+ typeof level === "number" ||
141
+ !validLogLevels.includes(level.toUpperCase())
142
+ ) {
143
+ throw new Error(`${level} is not a valid loglevel`);
144
+ }
145
+ }
@@ -0,0 +1,102 @@
1
+ import { Bool, Field, Struct } from "o1js";
2
+
3
+ import { createMerkleTree, RollupMerkleTree } from "../sparse/RollupMerkleTree";
4
+ import { TypedClass } from "../../types";
5
+ import { MerkleTreeStore } from "../sparse/MerkleTreeStore";
6
+
7
+ import { LinkedLeafStore } from "./LinkedLeafStore";
8
+ import { LinkedLeafStruct } from "./LinkedMerkleTreeTypes";
9
+
10
+ class RollupMerkleTreeWitness extends createMerkleTree(40).WITNESS {}
11
+
12
+ type LinkedMerkleWitnessValue = {
13
+ leaf: LinkedLeafStruct;
14
+ merkleWitness: RollupMerkleTreeWitness;
15
+ checkMembership(root: Field, path: Field, value: Field): Bool;
16
+ };
17
+
18
+ // We use the RollupMerkleTreeWitness here, although we will actually implement
19
+ // the RollupMerkleTreeWitnessV2 defined below when instantiating the class.
20
+ class LinkedMerkleWitnessTemplate extends Struct({
21
+ leaf: LinkedLeafStruct,
22
+ merkleWitness: RollupMerkleTreeWitness,
23
+ }) {
24
+ public checkMembership(root: Field, path: Field, value: Field): Bool {
25
+ // Mock implementation for typing
26
+ return Bool(true);
27
+ }
28
+ }
29
+
30
+ type LinkedOperationWitnessValue = {
31
+ leafPrevious: LinkedMerkleWitnessValue;
32
+ leafCurrent: LinkedMerkleWitnessValue;
33
+ };
34
+
35
+ class LinkedOperationWitnessTemplate extends Struct({
36
+ leafPrevious: LinkedMerkleWitnessTemplate,
37
+ leafCurrent: LinkedMerkleWitnessTemplate,
38
+ }) {}
39
+
40
+ export interface AbstractLinkedMerkleTree {
41
+ leafStore: LinkedLeafStore;
42
+
43
+ tree: RollupMerkleTree;
44
+
45
+ /**
46
+ * Returns the root of the [Merkle Tree](https://en.wikipedia.org/wiki/Merkle_tree).
47
+ * @returns The root of the Merkle Tree.
48
+ */
49
+ getRoot(): Field;
50
+
51
+ /**
52
+ * Sets the value of a leaf node at a given index to a given value.
53
+ * @param path of the leaf node.
54
+ * @param value New value.
55
+ */
56
+ setLeaf(path: bigint, value?: bigint): LinkedOperationWitnessValue;
57
+
58
+ setLeaves(batch: { path: bigint; value: bigint }[]): void;
59
+
60
+ /**
61
+ * Returns a leaf which lives at a given path.
62
+ * Errors otherwise.
63
+ * @param path Index of the node.
64
+ * @returns The data of the leaf.
65
+ */
66
+ getLeaf(path: bigint): LinkedLeafStruct | undefined;
67
+
68
+ /**
69
+ * Returns the witness (also known as
70
+ * [Merkle Proof or Merkle Witness](https://computersciencewiki.org/index.php/Merkle_proof))
71
+ * for the leaf at the given path.
72
+ * @param path Position of the leaf node.
73
+ * @returns The witness that belongs to the leaf.
74
+ */
75
+ getReadWitness(path: bigint): LinkedMerkleWitnessValue;
76
+ }
77
+
78
+ export interface AbstractLinkedMerkleTreeClass {
79
+ new (
80
+ store: MerkleTreeStore,
81
+ leafStore: LinkedLeafStore
82
+ ): AbstractLinkedMerkleTree;
83
+
84
+ WITNESS: typeof LinkedOperationWitnessTemplate & {
85
+ fromReadWitness(
86
+ readWitness: LinkedMerkleWitnessTemplate
87
+ ): LinkedOperationWitnessTemplate;
88
+ };
89
+
90
+ READ_WITNESS: typeof LinkedMerkleWitnessTemplate &
91
+ TypedClass<{
92
+ checkMembership(root: Field, path: Field, value: Field): Bool;
93
+ }>;
94
+
95
+ HEIGHT: number;
96
+
97
+ EMPTY_ROOT: Field;
98
+
99
+ dummyWitness(): LinkedOperationWitnessValue;
100
+
101
+ dummyReadWitness(): LinkedMerkleWitnessValue;
102
+ }