@optimystic/db-core 0.0.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 (345) hide show
  1. package/README.md +328 -0
  2. package/dist/index.min.js +18 -0
  3. package/dist/index.min.js.map +7 -0
  4. package/dist/src/blocks/block-store.d.ts +12 -0
  5. package/dist/src/blocks/block-store.d.ts.map +1 -0
  6. package/dist/src/blocks/block-store.js +2 -0
  7. package/dist/src/blocks/block-store.js.map +1 -0
  8. package/dist/src/blocks/block-types.d.ts +3 -0
  9. package/dist/src/blocks/block-types.d.ts.map +1 -0
  10. package/dist/src/blocks/block-types.js +9 -0
  11. package/dist/src/blocks/block-types.js.map +1 -0
  12. package/dist/src/blocks/helpers.d.ts +4 -0
  13. package/dist/src/blocks/helpers.d.ts.map +1 -0
  14. package/dist/src/blocks/helpers.js +12 -0
  15. package/dist/src/blocks/helpers.js.map +1 -0
  16. package/dist/src/blocks/index.d.ts +5 -0
  17. package/dist/src/blocks/index.d.ts.map +1 -0
  18. package/dist/src/blocks/index.js +5 -0
  19. package/dist/src/blocks/index.js.map +1 -0
  20. package/dist/src/blocks/structs.d.ts +14 -0
  21. package/dist/src/blocks/structs.d.ts.map +1 -0
  22. package/dist/src/blocks/structs.js +2 -0
  23. package/dist/src/blocks/structs.js.map +1 -0
  24. package/dist/src/btree/btree.d.ts +135 -0
  25. package/dist/src/btree/btree.d.ts.map +1 -0
  26. package/dist/src/btree/btree.js +727 -0
  27. package/dist/src/btree/btree.js.map +1 -0
  28. package/dist/src/btree/independent-trunk.d.ts +17 -0
  29. package/dist/src/btree/independent-trunk.d.ts.map +1 -0
  30. package/dist/src/btree/independent-trunk.js +41 -0
  31. package/dist/src/btree/independent-trunk.js.map +1 -0
  32. package/dist/src/btree/index.d.ts +6 -0
  33. package/dist/src/btree/index.d.ts.map +1 -0
  34. package/dist/src/btree/index.js +6 -0
  35. package/dist/src/btree/index.js.map +1 -0
  36. package/dist/src/btree/key-range.d.ts +13 -0
  37. package/dist/src/btree/key-range.d.ts.map +1 -0
  38. package/dist/src/btree/key-range.js +20 -0
  39. package/dist/src/btree/key-range.js.map +1 -0
  40. package/dist/src/btree/keyset.d.ts +4 -0
  41. package/dist/src/btree/keyset.d.ts.map +1 -0
  42. package/dist/src/btree/keyset.js +4 -0
  43. package/dist/src/btree/keyset.js.map +1 -0
  44. package/dist/src/btree/nodes.d.ts +16 -0
  45. package/dist/src/btree/nodes.d.ts.map +1 -0
  46. package/dist/src/btree/nodes.js +9 -0
  47. package/dist/src/btree/nodes.js.map +1 -0
  48. package/dist/src/btree/path.d.ts +22 -0
  49. package/dist/src/btree/path.d.ts.map +1 -0
  50. package/dist/src/btree/path.js +39 -0
  51. package/dist/src/btree/path.js.map +1 -0
  52. package/dist/src/btree/tree-block.d.ts +7 -0
  53. package/dist/src/btree/tree-block.d.ts.map +1 -0
  54. package/dist/src/btree/tree-block.js +5 -0
  55. package/dist/src/btree/tree-block.js.map +1 -0
  56. package/dist/src/btree/trunk.d.ts +13 -0
  57. package/dist/src/btree/trunk.d.ts.map +1 -0
  58. package/dist/src/btree/trunk.js +2 -0
  59. package/dist/src/btree/trunk.js.map +1 -0
  60. package/dist/src/chain/chain-nodes.d.ts +18 -0
  61. package/dist/src/chain/chain-nodes.d.ts.map +1 -0
  62. package/dist/src/chain/chain-nodes.js +10 -0
  63. package/dist/src/chain/chain-nodes.js.map +1 -0
  64. package/dist/src/chain/chain.d.ts +75 -0
  65. package/dist/src/chain/chain.d.ts.map +1 -0
  66. package/dist/src/chain/chain.js +268 -0
  67. package/dist/src/chain/chain.js.map +1 -0
  68. package/dist/src/chain/index.d.ts +2 -0
  69. package/dist/src/chain/index.d.ts.map +1 -0
  70. package/dist/src/chain/index.js +2 -0
  71. package/dist/src/chain/index.js.map +1 -0
  72. package/dist/src/cluster/i-cluster.d.ts +5 -0
  73. package/dist/src/cluster/i-cluster.d.ts.map +1 -0
  74. package/dist/src/cluster/i-cluster.js +2 -0
  75. package/dist/src/cluster/i-cluster.js.map +1 -0
  76. package/dist/src/cluster/index.d.ts +3 -0
  77. package/dist/src/cluster/index.d.ts.map +1 -0
  78. package/dist/src/cluster/index.js +3 -0
  79. package/dist/src/cluster/index.js.map +1 -0
  80. package/dist/src/cluster/structs.d.ts +47 -0
  81. package/dist/src/cluster/structs.d.ts.map +1 -0
  82. package/dist/src/cluster/structs.js +2 -0
  83. package/dist/src/cluster/structs.js.map +1 -0
  84. package/dist/src/collection/action.d.ts +26 -0
  85. package/dist/src/collection/action.d.ts.map +1 -0
  86. package/dist/src/collection/action.js +2 -0
  87. package/dist/src/collection/action.js.map +1 -0
  88. package/dist/src/collection/collection.d.ts +48 -0
  89. package/dist/src/collection/collection.d.ts.map +1 -0
  90. package/dist/src/collection/collection.js +175 -0
  91. package/dist/src/collection/collection.js.map +1 -0
  92. package/dist/src/collection/index.d.ts +4 -0
  93. package/dist/src/collection/index.d.ts.map +1 -0
  94. package/dist/src/collection/index.js +4 -0
  95. package/dist/src/collection/index.js.map +1 -0
  96. package/dist/src/collection/struct.d.ts +16 -0
  97. package/dist/src/collection/struct.d.ts.map +1 -0
  98. package/dist/src/collection/struct.js +2 -0
  99. package/dist/src/collection/struct.js.map +1 -0
  100. package/dist/src/collections/diary/diary.d.ts +9 -0
  101. package/dist/src/collections/diary/diary.d.ts.map +1 -0
  102. package/dist/src/collections/diary/diary.js +37 -0
  103. package/dist/src/collections/diary/diary.js.map +1 -0
  104. package/dist/src/collections/diary/index.d.ts +3 -0
  105. package/dist/src/collections/diary/index.d.ts.map +1 -0
  106. package/dist/src/collections/diary/index.js +3 -0
  107. package/dist/src/collections/diary/index.js.map +1 -0
  108. package/dist/src/collections/diary/struct.d.ts +2 -0
  109. package/dist/src/collections/diary/struct.d.ts.map +1 -0
  110. package/dist/src/collections/diary/struct.js +3 -0
  111. package/dist/src/collections/diary/struct.js.map +1 -0
  112. package/dist/src/collections/index.d.ts +3 -0
  113. package/dist/src/collections/index.d.ts.map +1 -0
  114. package/dist/src/collections/index.js +3 -0
  115. package/dist/src/collections/index.js.map +1 -0
  116. package/dist/src/collections/tree/collection-trunk.d.ts +11 -0
  117. package/dist/src/collections/tree/collection-trunk.d.ts.map +1 -0
  118. package/dist/src/collections/tree/collection-trunk.js +22 -0
  119. package/dist/src/collections/tree/collection-trunk.js.map +1 -0
  120. package/dist/src/collections/tree/index.d.ts +3 -0
  121. package/dist/src/collections/tree/index.d.ts.map +1 -0
  122. package/dist/src/collections/tree/index.js +3 -0
  123. package/dist/src/collections/tree/index.js.map +1 -0
  124. package/dist/src/collections/tree/struct.d.ts +12 -0
  125. package/dist/src/collections/tree/struct.d.ts.map +1 -0
  126. package/dist/src/collections/tree/struct.js +4 -0
  127. package/dist/src/collections/tree/struct.js.map +1 -0
  128. package/dist/src/collections/tree/tree.d.ts +34 -0
  129. package/dist/src/collections/tree/tree.d.ts.map +1 -0
  130. package/dist/src/collections/tree/tree.js +100 -0
  131. package/dist/src/collections/tree/tree.js.map +1 -0
  132. package/dist/src/index.d.ts +18 -0
  133. package/dist/src/index.d.ts.map +1 -0
  134. package/dist/src/index.js +18 -0
  135. package/dist/src/index.js.map +1 -0
  136. package/dist/src/log/index.d.ts +3 -0
  137. package/dist/src/log/index.d.ts.map +1 -0
  138. package/dist/src/log/index.js +3 -0
  139. package/dist/src/log/index.js.map +1 -0
  140. package/dist/src/log/log.d.ts +57 -0
  141. package/dist/src/log/log.d.ts.map +1 -0
  142. package/dist/src/log/log.js +131 -0
  143. package/dist/src/log/log.js.map +1 -0
  144. package/dist/src/log/struct.d.ts +36 -0
  145. package/dist/src/log/struct.d.ts.map +1 -0
  146. package/dist/src/log/struct.js +3 -0
  147. package/dist/src/log/struct.js.map +1 -0
  148. package/dist/src/network/i-key-network.d.ts +21 -0
  149. package/dist/src/network/i-key-network.d.ts.map +1 -0
  150. package/dist/src/network/i-key-network.js +2 -0
  151. package/dist/src/network/i-key-network.js.map +1 -0
  152. package/dist/src/network/i-peer-network.d.ts +8 -0
  153. package/dist/src/network/i-peer-network.d.ts.map +1 -0
  154. package/dist/src/network/i-peer-network.js +2 -0
  155. package/dist/src/network/i-peer-network.js.map +1 -0
  156. package/dist/src/network/i-repo.d.ts +17 -0
  157. package/dist/src/network/i-repo.d.ts.map +1 -0
  158. package/dist/src/network/i-repo.js +2 -0
  159. package/dist/src/network/i-repo.js.map +1 -0
  160. package/dist/src/network/index.d.ts +6 -0
  161. package/dist/src/network/index.d.ts.map +1 -0
  162. package/dist/src/network/index.js +6 -0
  163. package/dist/src/network/index.js.map +1 -0
  164. package/dist/src/network/repo-protocol.d.ts +19 -0
  165. package/dist/src/network/repo-protocol.d.ts.map +1 -0
  166. package/dist/src/network/repo-protocol.js +2 -0
  167. package/dist/src/network/repo-protocol.js.map +1 -0
  168. package/dist/src/network/struct.d.ts +115 -0
  169. package/dist/src/network/struct.d.ts.map +1 -0
  170. package/dist/src/network/struct.js +2 -0
  171. package/dist/src/network/struct.js.map +1 -0
  172. package/dist/src/transaction/actions-engine.d.ts +37 -0
  173. package/dist/src/transaction/actions-engine.d.ts.map +1 -0
  174. package/dist/src/transaction/actions-engine.js +67 -0
  175. package/dist/src/transaction/actions-engine.js.map +1 -0
  176. package/dist/src/transaction/context.d.ts +60 -0
  177. package/dist/src/transaction/context.d.ts.map +1 -0
  178. package/dist/src/transaction/context.js +91 -0
  179. package/dist/src/transaction/context.js.map +1 -0
  180. package/dist/src/transaction/coordinator.d.ts +118 -0
  181. package/dist/src/transaction/coordinator.d.ts.map +1 -0
  182. package/dist/src/transaction/coordinator.js +417 -0
  183. package/dist/src/transaction/coordinator.js.map +1 -0
  184. package/dist/src/transaction/index.d.ts +10 -0
  185. package/dist/src/transaction/index.d.ts.map +1 -0
  186. package/dist/src/transaction/index.js +7 -0
  187. package/dist/src/transaction/index.js.map +1 -0
  188. package/dist/src/transaction/session.d.ts +80 -0
  189. package/dist/src/transaction/session.d.ts.map +1 -0
  190. package/dist/src/transaction/session.js +161 -0
  191. package/dist/src/transaction/session.js.map +1 -0
  192. package/dist/src/transaction/transaction.d.ts +156 -0
  193. package/dist/src/transaction/transaction.d.ts.map +1 -0
  194. package/dist/src/transaction/transaction.js +31 -0
  195. package/dist/src/transaction/transaction.js.map +1 -0
  196. package/dist/src/transaction/validator.d.ts +46 -0
  197. package/dist/src/transaction/validator.d.ts.map +1 -0
  198. package/dist/src/transaction/validator.js +97 -0
  199. package/dist/src/transaction/validator.js.map +1 -0
  200. package/dist/src/transactor/index.d.ts +4 -0
  201. package/dist/src/transactor/index.d.ts.map +1 -0
  202. package/dist/src/transactor/index.js +4 -0
  203. package/dist/src/transactor/index.js.map +1 -0
  204. package/dist/src/transactor/network-transactor.d.ts +36 -0
  205. package/dist/src/transactor/network-transactor.d.ts.map +1 -0
  206. package/dist/src/transactor/network-transactor.js +297 -0
  207. package/dist/src/transactor/network-transactor.js.map +1 -0
  208. package/dist/src/transactor/transactor-source.d.ts +24 -0
  209. package/dist/src/transactor/transactor-source.d.ts.map +1 -0
  210. package/dist/src/transactor/transactor-source.js +62 -0
  211. package/dist/src/transactor/transactor-source.js.map +1 -0
  212. package/dist/src/transactor/transactor.d.ts +38 -0
  213. package/dist/src/transactor/transactor.d.ts.map +1 -0
  214. package/dist/src/transactor/transactor.js +2 -0
  215. package/dist/src/transactor/transactor.js.map +1 -0
  216. package/dist/src/transform/atomic.d.ts +8 -0
  217. package/dist/src/transform/atomic.d.ts.map +1 -0
  218. package/dist/src/transform/atomic.js +14 -0
  219. package/dist/src/transform/atomic.js.map +1 -0
  220. package/dist/src/transform/cache-source.d.ts +13 -0
  221. package/dist/src/transform/cache-source.d.ts.map +1 -0
  222. package/dist/src/transform/cache-source.js +52 -0
  223. package/dist/src/transform/cache-source.js.map +1 -0
  224. package/dist/src/transform/helpers.d.ts +25 -0
  225. package/dist/src/transform/helpers.d.ts.map +1 -0
  226. package/dist/src/transform/helpers.js +105 -0
  227. package/dist/src/transform/helpers.js.map +1 -0
  228. package/dist/src/transform/index.d.ts +6 -0
  229. package/dist/src/transform/index.d.ts.map +1 -0
  230. package/dist/src/transform/index.js +6 -0
  231. package/dist/src/transform/index.js.map +1 -0
  232. package/dist/src/transform/struct.d.ts +19 -0
  233. package/dist/src/transform/struct.d.ts.map +1 -0
  234. package/dist/src/transform/struct.js +2 -0
  235. package/dist/src/transform/struct.js.map +1 -0
  236. package/dist/src/transform/tracker.d.ts +22 -0
  237. package/dist/src/transform/tracker.d.ts.map +1 -0
  238. package/dist/src/transform/tracker.js +64 -0
  239. package/dist/src/transform/tracker.js.map +1 -0
  240. package/dist/src/utility/actor.d.ts +11 -0
  241. package/dist/src/utility/actor.d.ts.map +1 -0
  242. package/dist/src/utility/actor.js +39 -0
  243. package/dist/src/utility/actor.js.map +1 -0
  244. package/dist/src/utility/batch-coordinator.d.ts +56 -0
  245. package/dist/src/utility/batch-coordinator.d.ts.map +1 -0
  246. package/dist/src/utility/batch-coordinator.js +127 -0
  247. package/dist/src/utility/batch-coordinator.js.map +1 -0
  248. package/dist/src/utility/block-id-to-bytes.d.ts +3 -0
  249. package/dist/src/utility/block-id-to-bytes.d.ts.map +1 -0
  250. package/dist/src/utility/block-id-to-bytes.js +7 -0
  251. package/dist/src/utility/block-id-to-bytes.js.map +1 -0
  252. package/dist/src/utility/ensured.d.ts +3 -0
  253. package/dist/src/utility/ensured.d.ts.map +1 -0
  254. package/dist/src/utility/ensured.js +24 -0
  255. package/dist/src/utility/ensured.js.map +1 -0
  256. package/dist/src/utility/groupby.d.ts +8 -0
  257. package/dist/src/utility/groupby.d.ts.map +1 -0
  258. package/dist/src/utility/groupby.js +15 -0
  259. package/dist/src/utility/groupby.js.map +1 -0
  260. package/dist/src/utility/is-record-empty.d.ts +3 -0
  261. package/dist/src/utility/is-record-empty.d.ts.map +1 -0
  262. package/dist/src/utility/is-record-empty.js +7 -0
  263. package/dist/src/utility/is-record-empty.js.map +1 -0
  264. package/dist/src/utility/latches.d.ts +11 -0
  265. package/dist/src/utility/latches.d.ts.map +1 -0
  266. package/dist/src/utility/latches.js +36 -0
  267. package/dist/src/utility/latches.js.map +1 -0
  268. package/dist/src/utility/nameof.d.ts +3 -0
  269. package/dist/src/utility/nameof.d.ts.map +1 -0
  270. package/dist/src/utility/nameof.js +5 -0
  271. package/dist/src/utility/nameof.js.map +1 -0
  272. package/dist/src/utility/pending.d.ts +13 -0
  273. package/dist/src/utility/pending.d.ts.map +1 -0
  274. package/dist/src/utility/pending.js +37 -0
  275. package/dist/src/utility/pending.js.map +1 -0
  276. package/package.json +56 -0
  277. package/src/blocks/block-store.ts +13 -0
  278. package/src/blocks/block-types.ts +11 -0
  279. package/src/blocks/helpers.ts +13 -0
  280. package/src/blocks/index.ts +5 -0
  281. package/src/blocks/structs.ts +17 -0
  282. package/src/btree/btree.ts +804 -0
  283. package/src/btree/independent-trunk.ts +54 -0
  284. package/src/btree/index.ts +5 -0
  285. package/src/btree/key-range.ts +15 -0
  286. package/src/btree/keyset.ts +6 -0
  287. package/src/btree/nodes.ts +25 -0
  288. package/src/btree/path.ts +37 -0
  289. package/src/btree/tree-block.ts +11 -0
  290. package/src/btree/trunk.ts +14 -0
  291. package/src/chain/chain-nodes.ts +24 -0
  292. package/src/chain/chain.ts +324 -0
  293. package/src/chain/index.ts +2 -0
  294. package/src/cluster/i-cluster.ts +6 -0
  295. package/src/cluster/index.ts +2 -0
  296. package/src/cluster/structs.ts +46 -0
  297. package/src/collection/action.ts +31 -0
  298. package/src/collection/collection.ts +200 -0
  299. package/src/collection/index.ts +3 -0
  300. package/src/collection/struct.ts +20 -0
  301. package/src/collections/diary/diary.ts +43 -0
  302. package/src/collections/diary/index.ts +2 -0
  303. package/src/collections/diary/struct.ts +3 -0
  304. package/src/collections/index.ts +2 -0
  305. package/src/collections/tree/collection-trunk.ts +25 -0
  306. package/src/collections/tree/index.ts +2 -0
  307. package/src/collections/tree/readme.md +19 -0
  308. package/src/collections/tree/struct.ts +18 -0
  309. package/src/collections/tree/tree.ts +124 -0
  310. package/src/index.ts +17 -0
  311. package/src/log/index.ts +2 -0
  312. package/src/log/log.ts +155 -0
  313. package/src/log/struct.ts +40 -0
  314. package/src/network/i-key-network.ts +24 -0
  315. package/src/network/i-peer-network.ts +8 -0
  316. package/src/network/i-repo.ts +19 -0
  317. package/src/network/index.ts +5 -0
  318. package/src/network/repo-protocol.ts +12 -0
  319. package/src/network/struct.ts +137 -0
  320. package/src/transaction/actions-engine.ts +83 -0
  321. package/src/transaction/context.ts +103 -0
  322. package/src/transaction/coordinator.ts +583 -0
  323. package/src/transaction/index.ts +30 -0
  324. package/src/transaction/session.ts +182 -0
  325. package/src/transaction/transaction.ts +205 -0
  326. package/src/transaction/validator.ts +150 -0
  327. package/src/transactor/index.ts +4 -0
  328. package/src/transactor/network-transactor.ts +435 -0
  329. package/src/transactor/transactor-source.ts +65 -0
  330. package/src/transactor/transactor.ts +44 -0
  331. package/src/transform/atomic.ts +16 -0
  332. package/src/transform/cache-source.ts +57 -0
  333. package/src/transform/helpers.ts +117 -0
  334. package/src/transform/index.ts +5 -0
  335. package/src/transform/struct.ts +22 -0
  336. package/src/transform/tracker.ts +70 -0
  337. package/src/utility/actor.ts +62 -0
  338. package/src/utility/batch-coordinator.ts +174 -0
  339. package/src/utility/block-id-to-bytes.ts +8 -0
  340. package/src/utility/ensured.ts +32 -0
  341. package/src/utility/groupby.ts +18 -0
  342. package/src/utility/is-record-empty.ts +5 -0
  343. package/src/utility/latches.ts +42 -0
  344. package/src/utility/nameof.ts +7 -0
  345. package/src/utility/pending.ts +41 -0
@@ -0,0 +1,40 @@
1
+ import type { BlockId, CollectionId, ActionContext, ActionId, ActionRev } from "../index.js";
2
+
3
+ /** A log entry - either an action or a checkpoint */
4
+ export type LogEntry<TAction> = {
5
+ /** Linux timestamp of the entry */
6
+ readonly timestamp: number;
7
+ /** Revision number - monotonically increasing from the prior entry's rev. Starts at 1. */
8
+ readonly rev: number;
9
+ readonly action?: ActionEntry<TAction>;
10
+ readonly checkpoint?: CheckpointEntry;
11
+ };
12
+
13
+ /** An action entry represents a unit of work that is atomic */
14
+ export type ActionEntry<TAction> = {
15
+ /** Generated unique identifier for the action */
16
+ readonly actionId: ActionId;
17
+ /** Actions to be applied */
18
+ readonly actions: TAction[];
19
+ /** Block ids affected by the action - includes the log related blocks */
20
+ blockIds: BlockId[]; // NOTE: this is updated after being generated to include the log-related block transforms
21
+ /** Other collection ids affected by the action - this action is conditional on successful commit in all of these collections */
22
+ readonly collectionIds?: CollectionId[];
23
+ };
24
+
25
+ /** A checkpoint entry restates the currently uncheckpointed actions */
26
+ export type CheckpointEntry = {
27
+ /** The current set of pending action/revs
28
+ * - actions implicitly increase the set of pending Ids
29
+ * - this restates the entire current set
30
+ * - missing from the set are the implicitly checkpointed ones */
31
+ readonly pendings: ActionRev[];
32
+ };
33
+
34
+ export const LogDataBlockType = "LGD";
35
+ export const LogHeaderBlockType = "LGH";
36
+
37
+ export type GetFromResult<TAction> = {
38
+ context: ActionContext | undefined;
39
+ entries: ActionEntry<TAction>[];
40
+ };
@@ -0,0 +1,24 @@
1
+ import type { PeerId } from "@libp2p/interface";
2
+ import type { ClusterPeers } from "../cluster/structs.js";
3
+
4
+ export type FindCoordinatorOptions = {
5
+ /** Peers that have already been tried (and failed) */
6
+ excludedPeers?: PeerId[];
7
+ };
8
+
9
+
10
+ export type IKeyNetwork = {
11
+ /**
12
+ * Find a coordinator node responsible for a given key and establish connection
13
+ * @param key The key to find coordinator for
14
+ * @returns Promise resolving to ID of coordinator node
15
+ */
16
+ findCoordinator<T>(key: Uint8Array, options?: Partial<FindCoordinatorOptions>): Promise<PeerId>;
17
+
18
+ /**
19
+ * Find the peers in the cluster responsible for a given key
20
+ * @param key The key to find peers for
21
+ * @returns Promise resolving to the peers in the cluster
22
+ */
23
+ findCluster(key: Uint8Array): Promise<ClusterPeers>;
24
+ }
@@ -0,0 +1,8 @@
1
+ import type { AbortOptions, PeerId, Stream } from "@libp2p/interface";
2
+
3
+ export type IPeerNetwork = {
4
+ /**
5
+ * Dial a peer and establish a protocol stream
6
+ */
7
+ connect(peerId: PeerId, protocol: string, options?: AbortOptions): Promise<Stream>;
8
+ }
@@ -0,0 +1,19 @@
1
+ import type { ActionBlocks, CommitResult, GetBlockResults, PendResult, PendRequest, CommitRequest, BlockGets, BlockId, ActionId } from "../index.js";
2
+
3
+ export type MessageOptions = {
4
+ expiration?: number;
5
+ signal?: AbortSignal;
6
+ }
7
+
8
+ export type RepoCommitRequest = {
9
+ blockIds: BlockId[];
10
+ actionId: ActionId;
11
+ rev: number;
12
+ };
13
+
14
+ export type IRepo = {
15
+ get(blockGets: BlockGets, options?: MessageOptions): Promise<GetBlockResults>;
16
+ pend(request: PendRequest, options?: MessageOptions): Promise<PendResult>;
17
+ cancel(actionRef: ActionBlocks, options?: MessageOptions): Promise<void>;
18
+ commit(request: RepoCommitRequest, options?: MessageOptions): Promise<CommitResult>;
19
+ }
@@ -0,0 +1,5 @@
1
+ export * from "./i-key-network.js";
2
+ export * from "./i-peer-network.js";
3
+ export * from "./i-repo.js";
4
+ export * from "./repo-protocol.js";
5
+ export * from "./struct.js";
@@ -0,0 +1,12 @@
1
+ import type { ActionBlocks, PendRequest, CommitRequest, BlockGets } from "../index.js";
2
+
3
+ export type RepoMessage = {
4
+ operations: [
5
+ { get: BlockGets } |
6
+ { pend: PendRequest } |
7
+ { cancel: { actionRef: ActionBlocks } } |
8
+ { commit: CommitRequest }
9
+ ],
10
+ expiration?: number,
11
+ coordinatingBlockIds?: string[],
12
+ };
@@ -0,0 +1,137 @@
1
+ import type { CollectionId, BlockId, IBlock, ActionId, Transform, Transforms } from "../index.js";
2
+ import type { ActionContext, ActionRev } from "../collection/action.js";
3
+ import type { Transaction } from "../transaction/transaction.js";
4
+ import type { PeerId } from "@libp2p/interface";
5
+
6
+ export type ActionBlocks = {
7
+ blockIds: BlockId[];
8
+ actionId: ActionId;
9
+ };
10
+
11
+ export type ActionTransforms = {
12
+ actionId: ActionId;
13
+ rev?: number;
14
+ transforms: Transforms;
15
+ };
16
+
17
+ export type ActionTransform = {
18
+ actionId: ActionId;
19
+ rev?: number;
20
+ transform: Transform;
21
+ };
22
+
23
+ export type ActionPending = {
24
+ blockId: BlockId;
25
+ actionId: ActionId;
26
+ transform?: Transform;
27
+ };
28
+
29
+ export type PendRequest = ActionTransforms & {
30
+ /** What to do if there are any pending actions.
31
+ * 'c' is continue normally,
32
+ * 'f' is fail, returning the pending ActionIds,
33
+ * 'r' is return, which fails but returns the pending ActionIds and their transforms */
34
+ policy: 'c' | 'f' | 'r';
35
+ /** For multi-collection transactions: the full transaction for replay/validation */
36
+ transaction?: Transaction;
37
+ /** For multi-collection transactions: hash of ALL operations across all blocks */
38
+ operationsHash?: string;
39
+ /** For multi-collection transactions: supercluster nominees for consensus */
40
+ superclusterNominees?: PeerId[];
41
+ };
42
+
43
+ export type BlockActionStatus = ActionBlocks & {
44
+ statuses: ('pending' | 'committed' | 'checkpointed' | 'aborted')[];
45
+ };
46
+
47
+ export type PendSuccess = {
48
+ success: true;
49
+ /** List of already pending actions that were found on blocks touched by this pend */
50
+ pending: ActionPending[];
51
+ /** The affected blocks */
52
+ blockIds: BlockId[];
53
+ };
54
+
55
+ export type StaleFailure = {
56
+ success: false;
57
+ /** The reason for the failure */
58
+ reason?: string;
59
+ /** List of actions that have already been committed and are newer than our known revision */
60
+ missing?: ActionTransforms[];
61
+ /** List of actions that are pending on the blocks touched by this pend */
62
+ pending?: ActionPending[];
63
+ };
64
+
65
+ export type PendResult = PendSuccess | StaleFailure;
66
+
67
+ export type CommitRequest = ActionBlocks & {
68
+ /** The header block of the collection, if this is a new collection (commit first) */
69
+ headerId?: BlockId;
70
+ /** The tail block of the log (commit next) */
71
+ tailId: BlockId;
72
+ /** The new revision for the committed action */
73
+ rev: number;
74
+ };
75
+
76
+ export type CommitResult = CommitSuccess | StaleFailure;
77
+
78
+ export type CommitSuccess = {
79
+ success: true;
80
+ /** If present, the identified collection acts as the coordinator for the multi-collection transaction */
81
+ coordinatorId?: CollectionId;
82
+ };
83
+
84
+ export type BlockActionState = {
85
+ /** The latest action that has been committed */
86
+ latest?: ActionRev;
87
+ /** If present, the specified actions are pending */
88
+ pendings?: ActionId[];
89
+ };
90
+
91
+ export type BlockGets = {
92
+ blockIds: BlockId[];
93
+ context?: ActionContext; // Latest if this is omitted
94
+ };
95
+
96
+ export type GetBlockResult = {
97
+ /** The retrieved block - undefined if the block was deleted */
98
+ block?: IBlock;
99
+ /** The latest and pending states of the repo that retrieved the block */
100
+ state: BlockActionState;
101
+ };
102
+
103
+ export type GetBlockResults = Record<BlockId, GetBlockResult>;
104
+
105
+ /**
106
+ * Result of validating a transaction in a PendRequest.
107
+ */
108
+ export type PendValidationResult = {
109
+ /** Whether validation passed */
110
+ valid: boolean;
111
+ /** Reason for validation failure (if valid=false) */
112
+ reason?: string;
113
+ };
114
+
115
+ /**
116
+ * Hook for validating transactions in PendRequests.
117
+ *
118
+ * This hook is called by the storage layer when receiving a PendRequest
119
+ * that includes a transaction and operationsHash. If validation fails,
120
+ * the pend operation is rejected.
121
+ *
122
+ * If the hook is not provided, validation is skipped (storage-only nodes).
123
+ */
124
+ export type PendValidationHook = (
125
+ transaction: Transaction,
126
+ operationsHash: string
127
+ ) => Promise<PendValidationResult>;
128
+
129
+ // Backward compatibility aliases (deprecated - use Action* names)
130
+ /** @deprecated Use ActionBlocks instead */
131
+ export type TrxBlocks = ActionBlocks;
132
+ /** @deprecated Use ActionTransforms instead */
133
+ export type TrxTransforms = ActionTransforms;
134
+ /** @deprecated Use ActionTransform instead */
135
+ export type TrxTransform = ActionTransform;
136
+ /** @deprecated Use ActionPending instead */
137
+ export type TrxPending = ActionPending;
@@ -0,0 +1,83 @@
1
+ import type { ITransactionEngine, Transaction, ExecutionResult, CollectionActions } from './transaction.js';
2
+ import type { TransactionCoordinator } from './coordinator.js';
3
+
4
+ export const ACTIONS_ENGINE_ID = "actions@1.0.0";
5
+
6
+ /**
7
+ * Built-in action-based transaction engine for testing.
8
+ *
9
+ * This engine treats each statement as a JSON-encoded CollectionActions object.
10
+ * It's useful for testing the transaction infrastructure without needing SQL.
11
+ *
12
+ * Each statement format:
13
+ * ```json
14
+ * {
15
+ * "collectionId": "users",
16
+ * "actions": [
17
+ * { "type": "insert", "data": { "id": 1, "name": "Alice" } }
18
+ * ]
19
+ * }
20
+ * ```
21
+ */
22
+ export class ActionsEngine implements ITransactionEngine {
23
+ constructor(private coordinator: TransactionCoordinator) {}
24
+
25
+ async execute(transaction: Transaction): Promise<ExecutionResult> {
26
+ try {
27
+ // Parse each statement as a CollectionActions object
28
+ const allActions: CollectionActions[] = [];
29
+
30
+ for (const statement of transaction.statements) {
31
+ const collectionActions = JSON.parse(statement) as CollectionActions;
32
+
33
+ // Validate structure
34
+ if (!collectionActions.collectionId || typeof collectionActions.collectionId !== 'string') {
35
+ return {
36
+ success: false,
37
+ error: 'Invalid statement: missing collectionId'
38
+ };
39
+ }
40
+
41
+ if (!collectionActions.actions || !Array.isArray(collectionActions.actions)) {
42
+ return {
43
+ success: false,
44
+ error: `Invalid statement: collection ${collectionActions.collectionId} missing or invalid actions array`
45
+ };
46
+ }
47
+
48
+ allActions.push(collectionActions);
49
+
50
+ // Apply actions through coordinator (for validation/replay)
51
+ await this.coordinator.applyActions([collectionActions], transaction.stamp.id);
52
+ }
53
+
54
+ // Return success (actions already applied)
55
+ return {
56
+ success: true,
57
+ actions: allActions
58
+ };
59
+ } catch (error) {
60
+ return {
61
+ success: false,
62
+ error: `Failed to execute transaction: ${error instanceof Error ? error.message : String(error)}`
63
+ };
64
+ }
65
+ }
66
+ }
67
+
68
+ /**
69
+ * Statement format for the actions engine (array of CollectionActions).
70
+ * @deprecated Use CollectionActions[] directly
71
+ */
72
+ export type ActionsStatement = {
73
+ collections: CollectionActions[];
74
+ };
75
+
76
+ /**
77
+ * Helper to create an actions-based transaction statements array.
78
+ * Each CollectionActions becomes a separate statement.
79
+ */
80
+ export function createActionsStatements(collections: CollectionActions[]): string[] {
81
+ return collections.map(c => JSON.stringify(c));
82
+ }
83
+
@@ -0,0 +1,103 @@
1
+ import type { CollectionId, ActionId } from "../index.js";
2
+ import type { TransactionCoordinator } from "./coordinator.js";
3
+ import type { ReadDependency, ExecutionResult } from "./transaction.js";
4
+ import type { Action } from "../collection/action.js";
5
+
6
+ /**
7
+ * Transaction context for accumulating actions and reads.
8
+ *
9
+ * Usage:
10
+ * const txn = coordinator.begin();
11
+ * txn.addAction('users', { type: 'insert', data: {...} });
12
+ * txn.addAction('users', { type: 'get', data: { key: 1 } });
13
+ * const result = await txn.commit();
14
+ */
15
+ export class TransactionContext {
16
+ private readonly collectionActions: Map<CollectionId, Action<any>[]> = new Map();
17
+ private readonly reads: ReadDependency[] = [];
18
+
19
+ constructor(
20
+ private readonly coordinator: TransactionCoordinator,
21
+ public readonly transactionId: string,
22
+ public readonly engine: string
23
+ ) {}
24
+
25
+ /**
26
+ * Add an action to a collection.
27
+ *
28
+ * Actions are collection-specific:
29
+ * - Tree: 'insert', 'delete', 'get', 'scan'
30
+ * - Diary: 'append', 'read'
31
+ * - etc.
32
+ */
33
+ async addAction(collectionId: CollectionId, action: Action<any>): Promise<void> {
34
+ // Tag action with transaction reference
35
+ const taggedAction = {
36
+ ...action,
37
+ transaction: this.transactionId
38
+ };
39
+
40
+ // Get the collection and immediately execute the action to update local snapshot
41
+ const collection = this.coordinator['collections'].get(collectionId);
42
+ if (collection) {
43
+ // Execute through collection to update tracker and pending buffer
44
+ await collection.act(taggedAction);
45
+ }
46
+ // If no collection registered, just buffer the action (for testing or deferred collection creation)
47
+
48
+ // Record in transaction context
49
+ if (!this.collectionActions.has(collectionId)) {
50
+ this.collectionActions.set(collectionId, []);
51
+ }
52
+ this.collectionActions.get(collectionId)!.push(taggedAction);
53
+ }
54
+
55
+ /**
56
+ * Add a read dependency for optimistic concurrency control.
57
+ */
58
+ addRead(read: ReadDependency): void {
59
+ this.reads.push(read);
60
+ }
61
+
62
+ /**
63
+ * Commit the transaction.
64
+ *
65
+ * This executes all accumulated actions across all affected collections,
66
+ * coordinating with the network as needed.
67
+ */
68
+ async commit(): Promise<ExecutionResult> {
69
+ return await this.coordinator.commitTransaction(this);
70
+ }
71
+
72
+ /**
73
+ * Rollback the transaction (just discard accumulated state).
74
+ */
75
+ rollback(): void {
76
+ this.collectionActions.clear();
77
+ this.reads.length = 0;
78
+ }
79
+
80
+ /**
81
+ * Get all accumulated actions by collection.
82
+ * Used by coordinator during commit.
83
+ */
84
+ getCollectionActions(): Map<CollectionId, Action<any>[]> {
85
+ return this.collectionActions;
86
+ }
87
+
88
+ /**
89
+ * Get all accumulated read dependencies.
90
+ * Used by coordinator during commit.
91
+ */
92
+ getReads(): ReadDependency[] {
93
+ return this.reads;
94
+ }
95
+
96
+ /**
97
+ * Get the set of affected collection IDs.
98
+ */
99
+ getAffectedCollections(): Set<CollectionId> {
100
+ return new Set(this.collectionActions.keys());
101
+ }
102
+ }
103
+