@aztec-labs/kv-store 6.0.0-nightly.20260829

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. package/README.md +19 -0
  2. package/dest/bench/shared_map_bench.d.ts +19 -0
  3. package/dest/bench/shared_map_bench.d.ts.map +1 -0
  4. package/dest/bench/shared_map_bench.js +91 -0
  5. package/dest/deprecated/indexeddb/array.d.ts +22 -0
  6. package/dest/deprecated/indexeddb/array.d.ts.map +1 -0
  7. package/dest/deprecated/indexeddb/array.js +121 -0
  8. package/dest/deprecated/indexeddb/index.d.ts +7 -0
  9. package/dest/deprecated/indexeddb/index.d.ts.map +1 -0
  10. package/dest/deprecated/indexeddb/index.js +8 -0
  11. package/dest/deprecated/indexeddb/map.d.ts +38 -0
  12. package/dest/deprecated/indexeddb/map.d.ts.map +1 -0
  13. package/dest/deprecated/indexeddb/map.js +121 -0
  14. package/dest/deprecated/indexeddb/multi_map.d.ts +14 -0
  15. package/dest/deprecated/indexeddb/multi_map.d.ts.map +1 -0
  16. package/dest/deprecated/indexeddb/multi_map.js +108 -0
  17. package/dest/deprecated/indexeddb/set.d.ts +17 -0
  18. package/dest/deprecated/indexeddb/set.d.ts.map +1 -0
  19. package/dest/deprecated/indexeddb/set.js +24 -0
  20. package/dest/deprecated/indexeddb/singleton.d.ts +17 -0
  21. package/dest/deprecated/indexeddb/singleton.d.ts.map +1 -0
  22. package/dest/deprecated/indexeddb/singleton.js +41 -0
  23. package/dest/deprecated/indexeddb/store.d.ts +98 -0
  24. package/dest/deprecated/indexeddb/store.d.ts.map +1 -0
  25. package/dest/deprecated/indexeddb/store.js +171 -0
  26. package/dest/interfaces/array.d.ts +81 -0
  27. package/dest/interfaces/array.d.ts.map +1 -0
  28. package/dest/interfaces/array.js +1 -0
  29. package/dest/interfaces/array_test_suite.d.ts +3 -0
  30. package/dest/interfaces/array_test_suite.d.ts.map +1 -0
  31. package/dest/interfaces/array_test_suite.js +103 -0
  32. package/dest/interfaces/common.d.ts +25 -0
  33. package/dest/interfaces/common.d.ts.map +1 -0
  34. package/dest/interfaces/common.js +8 -0
  35. package/dest/interfaces/counter.d.ts +59 -0
  36. package/dest/interfaces/counter.d.ts.map +1 -0
  37. package/dest/interfaces/counter.js +1 -0
  38. package/dest/interfaces/index.d.ts +10 -0
  39. package/dest/interfaces/index.d.ts.map +1 -0
  40. package/dest/interfaces/index.js +8 -0
  41. package/dest/interfaces/map.d.ts +106 -0
  42. package/dest/interfaces/map.d.ts.map +1 -0
  43. package/dest/interfaces/map.js +3 -0
  44. package/dest/interfaces/map_test_suite.d.ts +3 -0
  45. package/dest/interfaces/map_test_suite.d.ts.map +1 -0
  46. package/dest/interfaces/map_test_suite.js +261 -0
  47. package/dest/interfaces/multi_map.d.ts +41 -0
  48. package/dest/interfaces/multi_map.d.ts.map +1 -0
  49. package/dest/interfaces/multi_map.js +3 -0
  50. package/dest/interfaces/multi_map_test_suite.d.ts +3 -0
  51. package/dest/interfaces/multi_map_test_suite.d.ts.map +1 -0
  52. package/dest/interfaces/multi_map_test_suite.js +363 -0
  53. package/dest/interfaces/set.d.ts +44 -0
  54. package/dest/interfaces/set.d.ts.map +1 -0
  55. package/dest/interfaces/set.js +1 -0
  56. package/dest/interfaces/set_test_suite.d.ts +3 -0
  57. package/dest/interfaces/set_test_suite.d.ts.map +1 -0
  58. package/dest/interfaces/set_test_suite.js +95 -0
  59. package/dest/interfaces/singleton.d.ts +29 -0
  60. package/dest/interfaces/singleton.d.ts.map +1 -0
  61. package/dest/interfaces/singleton.js +4 -0
  62. package/dest/interfaces/singleton_test_suite.d.ts +3 -0
  63. package/dest/interfaces/singleton_test_suite.d.ts.map +1 -0
  64. package/dest/interfaces/singleton_test_suite.js +29 -0
  65. package/dest/interfaces/store.d.ts +120 -0
  66. package/dest/interfaces/store.d.ts.map +1 -0
  67. package/dest/interfaces/store.js +1 -0
  68. package/dest/interfaces/utils.d.ts +18 -0
  69. package/dest/interfaces/utils.d.ts.map +1 -0
  70. package/dest/interfaces/utils.js +18 -0
  71. package/dest/lmdb/array.d.ts +24 -0
  72. package/dest/lmdb/array.d.ts.map +1 -0
  73. package/dest/lmdb/array.js +119 -0
  74. package/dest/lmdb/counter.d.ts +19 -0
  75. package/dest/lmdb/counter.d.ts.map +1 -0
  76. package/dest/lmdb/counter.js +50 -0
  77. package/dest/lmdb/index.d.ts +12 -0
  78. package/dest/lmdb/index.d.ts.map +1 -0
  79. package/dest/lmdb/index.js +25 -0
  80. package/dest/lmdb/map.d.ts +40 -0
  81. package/dest/lmdb/map.d.ts.map +1 -0
  82. package/dest/lmdb/map.js +156 -0
  83. package/dest/lmdb/multi_map.d.ts +13 -0
  84. package/dest/lmdb/multi_map.d.ts.map +1 -0
  85. package/dest/lmdb/multi_map.js +44 -0
  86. package/dest/lmdb/set.d.ts +18 -0
  87. package/dest/lmdb/set.d.ts.map +1 -0
  88. package/dest/lmdb/set.js +32 -0
  89. package/dest/lmdb/singleton.d.ts +14 -0
  90. package/dest/lmdb/singleton.d.ts.map +1 -0
  91. package/dest/lmdb/singleton.js +26 -0
  92. package/dest/lmdb/store.d.ts +94 -0
  93. package/dest/lmdb/store.d.ts.map +1 -0
  94. package/dest/lmdb/store.js +200 -0
  95. package/dest/lmdb-v2/array.d.ts +19 -0
  96. package/dest/lmdb-v2/array.d.ts.map +1 -0
  97. package/dest/lmdb-v2/array.js +103 -0
  98. package/dest/lmdb-v2/factory.d.ts +35 -0
  99. package/dest/lmdb-v2/factory.d.ts.map +1 -0
  100. package/dest/lmdb-v2/factory.js +126 -0
  101. package/dest/lmdb-v2/index.d.ts +3 -0
  102. package/dest/lmdb-v2/index.d.ts.map +1 -0
  103. package/dest/lmdb-v2/index.js +2 -0
  104. package/dest/lmdb-v2/map.d.ts +53 -0
  105. package/dest/lmdb-v2/map.d.ts.map +1 -0
  106. package/dest/lmdb-v2/map.js +106 -0
  107. package/dest/lmdb-v2/message.d.ts +131 -0
  108. package/dest/lmdb-v2/message.d.ts.map +1 -0
  109. package/dest/lmdb-v2/message.js +20 -0
  110. package/dest/lmdb-v2/multi_map.d.ts +52 -0
  111. package/dest/lmdb-v2/multi_map.d.ts.map +1 -0
  112. package/dest/lmdb-v2/multi_map.js +123 -0
  113. package/dest/lmdb-v2/read_transaction.d.ts +16 -0
  114. package/dest/lmdb-v2/read_transaction.d.ts.map +1 -0
  115. package/dest/lmdb-v2/read_transaction.js +137 -0
  116. package/dest/lmdb-v2/set.d.ts +15 -0
  117. package/dest/lmdb-v2/set.d.ts.map +1 -0
  118. package/dest/lmdb-v2/set.js +23 -0
  119. package/dest/lmdb-v2/singleton.d.ts +12 -0
  120. package/dest/lmdb-v2/singleton.d.ts.map +1 -0
  121. package/dest/lmdb-v2/singleton.js +31 -0
  122. package/dest/lmdb-v2/store.d.ts +43 -0
  123. package/dest/lmdb-v2/store.d.ts.map +1 -0
  124. package/dest/lmdb-v2/store.js +171 -0
  125. package/dest/lmdb-v2/tx-helpers.d.ts +6 -0
  126. package/dest/lmdb-v2/tx-helpers.d.ts.map +1 -0
  127. package/dest/lmdb-v2/tx-helpers.js +21 -0
  128. package/dest/lmdb-v2/utils.d.ts +8 -0
  129. package/dest/lmdb-v2/utils.d.ts.map +1 -0
  130. package/dest/lmdb-v2/utils.js +32 -0
  131. package/dest/lmdb-v2/write_transaction.d.ts +17 -0
  132. package/dest/lmdb-v2/write_transaction.d.ts.map +1 -0
  133. package/dest/lmdb-v2/write_transaction.js +258 -0
  134. package/dest/sqlite-opfs/array.d.ts +21 -0
  135. package/dest/sqlite-opfs/array.d.ts.map +1 -0
  136. package/dest/sqlite-opfs/array.js +128 -0
  137. package/dest/sqlite-opfs/errors.d.ts +54 -0
  138. package/dest/sqlite-opfs/errors.d.ts.map +1 -0
  139. package/dest/sqlite-opfs/errors.js +77 -0
  140. package/dest/sqlite-opfs/index.d.ts +14 -0
  141. package/dest/sqlite-opfs/index.d.ts.map +1 -0
  142. package/dest/sqlite-opfs/index.js +16 -0
  143. package/dest/sqlite-opfs/internal/ordered-binary-browser.d.ts +32 -0
  144. package/dest/sqlite-opfs/internal/ordered-binary-browser.d.ts.map +1 -0
  145. package/dest/sqlite-opfs/internal/ordered-binary-browser.js +448 -0
  146. package/dest/sqlite-opfs/manage.d.ts +22 -0
  147. package/dest/sqlite-opfs/manage.d.ts.map +1 -0
  148. package/dest/sqlite-opfs/manage.js +38 -0
  149. package/dest/sqlite-opfs/map.d.ts +35 -0
  150. package/dest/sqlite-opfs/map.d.ts.map +1 -0
  151. package/dest/sqlite-opfs/map.js +163 -0
  152. package/dest/sqlite-opfs/messages.d.ts +66 -0
  153. package/dest/sqlite-opfs/messages.d.ts.map +1 -0
  154. package/dest/sqlite-opfs/messages.js +5 -0
  155. package/dest/sqlite-opfs/multi_map.d.ts +16 -0
  156. package/dest/sqlite-opfs/multi_map.d.ts.map +1 -0
  157. package/dest/sqlite-opfs/multi_map.js +67 -0
  158. package/dest/sqlite-opfs/pool_integrity.d.ts +20 -0
  159. package/dest/sqlite-opfs/pool_integrity.d.ts.map +1 -0
  160. package/dest/sqlite-opfs/pool_integrity.js +282 -0
  161. package/dest/sqlite-opfs/pool_lock.d.ts +8 -0
  162. package/dest/sqlite-opfs/pool_lock.d.ts.map +1 -0
  163. package/dest/sqlite-opfs/pool_lock.js +47 -0
  164. package/dest/sqlite-opfs/set.d.ts +13 -0
  165. package/dest/sqlite-opfs/set.d.ts.map +1 -0
  166. package/dest/sqlite-opfs/set.js +19 -0
  167. package/dest/sqlite-opfs/singleton.d.ts +13 -0
  168. package/dest/sqlite-opfs/singleton.d.ts.map +1 -0
  169. package/dest/sqlite-opfs/singleton.js +48 -0
  170. package/dest/sqlite-opfs/store.d.ts +84 -0
  171. package/dest/sqlite-opfs/store.d.ts.map +1 -0
  172. package/dest/sqlite-opfs/store.js +318 -0
  173. package/dest/sqlite-opfs/worker.d.ts +2 -0
  174. package/dest/sqlite-opfs/worker.d.ts.map +1 -0
  175. package/dest/sqlite-opfs/worker.js +275 -0
  176. package/dest/stores/index.d.ts +3 -0
  177. package/dest/stores/index.d.ts.map +1 -0
  178. package/dest/stores/index.js +2 -0
  179. package/dest/stores/l2_tips_store.d.ts +23 -0
  180. package/dest/stores/l2_tips_store.d.ts.map +1 -0
  181. package/dest/stores/l2_tips_store.js +64 -0
  182. package/dest/utils.d.ts +15 -0
  183. package/dest/utils.d.ts.map +1 -0
  184. package/dest/utils.js +59 -0
  185. package/package.json +108 -0
  186. package/src/bench/shared_map_bench.ts +111 -0
  187. package/src/deprecated/indexeddb/array.ts +122 -0
  188. package/src/deprecated/indexeddb/index.ts +12 -0
  189. package/src/deprecated/indexeddb/map.ts +137 -0
  190. package/src/deprecated/indexeddb/multi_map.ts +106 -0
  191. package/src/deprecated/indexeddb/set.ts +37 -0
  192. package/src/deprecated/indexeddb/singleton.ts +52 -0
  193. package/src/deprecated/indexeddb/store.ts +214 -0
  194. package/src/interfaces/array.ts +92 -0
  195. package/src/interfaces/array_test_suite.ts +128 -0
  196. package/src/interfaces/common.ts +31 -0
  197. package/src/interfaces/counter.ts +65 -0
  198. package/src/interfaces/index.ts +9 -0
  199. package/src/interfaces/map.ts +117 -0
  200. package/src/interfaces/map_test_suite.ts +198 -0
  201. package/src/interfaces/multi_map.ts +45 -0
  202. package/src/interfaces/multi_map_test_suite.ts +372 -0
  203. package/src/interfaces/set.ts +48 -0
  204. package/src/interfaces/set_test_suite.ts +79 -0
  205. package/src/interfaces/singleton.ts +29 -0
  206. package/src/interfaces/singleton_test_suite.ts +44 -0
  207. package/src/interfaces/store.ts +142 -0
  208. package/src/interfaces/utils.ts +23 -0
  209. package/src/lmdb/array.ts +140 -0
  210. package/src/lmdb/counter.ts +67 -0
  211. package/src/lmdb/index.ts +41 -0
  212. package/src/lmdb/map.ts +177 -0
  213. package/src/lmdb/multi_map.ts +51 -0
  214. package/src/lmdb/set.ts +45 -0
  215. package/src/lmdb/singleton.ts +35 -0
  216. package/src/lmdb/store.ts +242 -0
  217. package/src/lmdb-v2/array.ts +120 -0
  218. package/src/lmdb-v2/factory.ts +184 -0
  219. package/src/lmdb-v2/index.ts +2 -0
  220. package/src/lmdb-v2/map.ts +136 -0
  221. package/src/lmdb-v2/message.ts +169 -0
  222. package/src/lmdb-v2/multi_map.ts +150 -0
  223. package/src/lmdb-v2/read_transaction.ts +156 -0
  224. package/src/lmdb-v2/set.ts +33 -0
  225. package/src/lmdb-v2/singleton.ts +38 -0
  226. package/src/lmdb-v2/store.ts +220 -0
  227. package/src/lmdb-v2/tx-helpers.ts +29 -0
  228. package/src/lmdb-v2/utils.ts +32 -0
  229. package/src/lmdb-v2/write_transaction.ts +315 -0
  230. package/src/sqlite-opfs/array.ts +124 -0
  231. package/src/sqlite-opfs/errors.ts +94 -0
  232. package/src/sqlite-opfs/index.ts +27 -0
  233. package/src/sqlite-opfs/internal/ordered-binary-browser.js +465 -0
  234. package/src/sqlite-opfs/manage.ts +46 -0
  235. package/src/sqlite-opfs/map.ts +163 -0
  236. package/src/sqlite-opfs/messages.ts +39 -0
  237. package/src/sqlite-opfs/multi_map.ts +74 -0
  238. package/src/sqlite-opfs/pool_integrity.ts +327 -0
  239. package/src/sqlite-opfs/pool_lock.ts +62 -0
  240. package/src/sqlite-opfs/set.ts +29 -0
  241. package/src/sqlite-opfs/singleton.ts +48 -0
  242. package/src/sqlite-opfs/store.ts +331 -0
  243. package/src/sqlite-opfs/worker.ts +259 -0
  244. package/src/stores/index.ts +3 -0
  245. package/src/stores/l2_tips_store.ts +67 -0
  246. package/src/utils.ts +98 -0
@@ -0,0 +1,126 @@
1
+ import { EthAddress } from '@aztec-labs/foundation/eth-address';
2
+ import { createLogger } from '@aztec-labs/foundation/log';
3
+ import { DatabaseVersionManager } from '@aztec-labs/stdlib/database-version/manager';
4
+ import { copyFile, mkdir, mkdtemp, rm } from 'fs/promises';
5
+ import { tmpdir } from 'os';
6
+ import { join } from 'path';
7
+ import { AztecLMDBStoreV2 } from './store.js';
8
+ const MAX_READERS = 16;
9
+ export async function createStore(name, schemaVersion, config, bindings, options = {}) {
10
+ const log = createLogger('kv-store:lmdb-v2:' + name, bindings);
11
+ const { dataDirectory, rollupAddress: rollupFromConfig } = config;
12
+ let store;
13
+ if (typeof dataDirectory !== 'undefined') {
14
+ // Get rollup address from contracts config, or use zero address
15
+ const subDir = join(dataDirectory, name);
16
+ await mkdir(subDir, {
17
+ recursive: true
18
+ });
19
+ const rollupAddress = rollupFromConfig ?? EthAddress.ZERO;
20
+ // Create a version manager
21
+ const versionManager = new DatabaseVersionManager({
22
+ schemaVersion,
23
+ rollupAddress,
24
+ dataDirectory: subDir,
25
+ onOpen: (dbDirectory)=>AztecLMDBStoreV2.new(dbDirectory, config.dataStoreMapSizeKb, MAX_READERS, ()=>Promise.resolve(), bindings),
26
+ onUpgrade: options.onUpgrade,
27
+ schemaVersionMismatchPolicy: options.schemaVersionMismatchPolicy,
28
+ versionFileReadFailurePolicy: options.versionFileReadFailurePolicy
29
+ });
30
+ log.info(`Creating ${name} data store at directory ${subDir} with map size ${config.dataStoreMapSizeKb} KB (LMDB v2)`);
31
+ [store] = await versionManager.open();
32
+ } else {
33
+ store = await openTmpStore(name, true, config.dataStoreMapSizeKb, MAX_READERS, bindings);
34
+ }
35
+ return store;
36
+ }
37
+ /**
38
+ * Open a persistent on-disk store rooted in OS tmpdir. Caller chooses whether to
39
+ * auto-remove the directory on close. Uses standard durable LMDB flags (fsync on
40
+ * every commit) — for full in-memory / NOSYNC semantics use `openEphemeralStore`.
41
+ */ export async function openTmpStore(name, cleanupTmpDir = true, dbMapSizeKb = 10 * 1_024 * 1_024, maxReaders = MAX_READERS, bindings) {
42
+ const log = createLogger('kv-store:lmdb-v2:' + name, bindings);
43
+ const dataDir = await mkdtemp(join(tmpdir(), name + '-'));
44
+ log.debug(`Created temporary data store at: ${dataDir} with size: ${dbMapSizeKb} KB (LMDB v2)`);
45
+ // pass a cleanup callback because process.on('beforeExit', cleanup) does not work under Jest
46
+ const cleanup = async ()=>{
47
+ if (cleanupTmpDir) {
48
+ try {
49
+ await rm(dataDir, {
50
+ recursive: true,
51
+ force: true,
52
+ maxRetries: 3
53
+ });
54
+ log.debug(`Deleted temporary data store: ${dataDir}`);
55
+ } catch (err) {
56
+ log.warn(`Failed to delete temporary data directory (LMDB v2) ${dataDir}: ${err}`);
57
+ }
58
+ } else {
59
+ log.debug(`Leaving temporary data store: ${dataDir}`);
60
+ }
61
+ };
62
+ return AztecLMDBStoreV2.new(dataDir, dbMapSizeKb, maxReaders, cleanup, bindings, false);
63
+ }
64
+ /**
65
+ * Open a fully-ephemeral store: a fresh tmpdir backing file, LMDB opened with
66
+ * MDB_NOSYNC | MDB_NOMETASYNC (no fsync, kernel-only writeback), and the directory
67
+ * unconditionally removed on close. Intended for tests and worker-local scratch
68
+ * stores where durability is explicitly not desired.
69
+ */ export async function openEphemeralStore(name, dbMapSizeKb = 10 * 1_024 * 1_024, maxReaders = MAX_READERS, bindings) {
70
+ const log = createLogger('kv-store:lmdb-v2:' + name, bindings);
71
+ const dataDir = await mkdtemp(join(tmpdir(), name + '-'));
72
+ log.debug(`Created ephemeral data store at: ${dataDir} with size: ${dbMapSizeKb} KB (LMDB v2)`);
73
+ const cleanup = async ()=>{
74
+ try {
75
+ await rm(dataDir, {
76
+ recursive: true,
77
+ force: true,
78
+ maxRetries: 3
79
+ });
80
+ log.debug(`Deleted ephemeral data store: ${dataDir}`);
81
+ } catch (err) {
82
+ log.warn(`Failed to delete ephemeral data directory (LMDB v2) ${dataDir}: ${err}`);
83
+ }
84
+ };
85
+ return AztecLMDBStoreV2.new(dataDir, dbMapSizeKb, maxReaders, cleanup, bindings, true);
86
+ }
87
+ export async function openStoreAt(dataDir, dbMapSizeKb = 10 * 1_024 * 1_024, maxReaders = MAX_READERS, bindings) {
88
+ const log = createLogger('kv-store:lmdb-v2', bindings);
89
+ log.debug(`Opening data store at: ${dataDir} with size: ${dbMapSizeKb} KB (LMDB v2)`);
90
+ return await AztecLMDBStoreV2.new(dataDir, dbMapSizeKb, maxReaders, undefined, bindings);
91
+ }
92
+ /**
93
+ * Open a fully-ephemeral store seeded from an existing `data.mdb` file. Creates a fresh tmpdir,
94
+ * copies `srcDataMdbPath` into it as `data.mdb`, opens with MDB_NOSYNC | MDB_NOMETASYNC, and
95
+ * removes the tmpdir on close. Intended for worker clones of a main-thread-built store — the
96
+ * source file is never written to.
97
+ */ export async function cloneEphemeralStoreFrom(srcDataMdbPath, name, dbMapSizeKb = 10 * 1_024 * 1_024, maxReaders = MAX_READERS, bindings) {
98
+ const log = createLogger('kv-store:lmdb-v2:' + name, bindings);
99
+ const dataDir = await mkdtemp(join(tmpdir(), name + '-'));
100
+ await copyFile(srcDataMdbPath, join(dataDir, 'data.mdb'));
101
+ log.debug(`Cloned ephemeral data store at: ${dataDir} from ${srcDataMdbPath} (LMDB v2)`);
102
+ const cleanup = async ()=>{
103
+ try {
104
+ await rm(dataDir, {
105
+ recursive: true,
106
+ force: true,
107
+ maxRetries: 3
108
+ });
109
+ log.debug(`Deleted ephemeral data store: ${dataDir}`);
110
+ } catch (err) {
111
+ log.warn(`Failed to delete ephemeral data directory (LMDB v2) ${dataDir}: ${err}`);
112
+ }
113
+ };
114
+ return AztecLMDBStoreV2.new(dataDir, dbMapSizeKb, maxReaders, cleanup, bindings, true);
115
+ }
116
+ export async function openVersionedStoreAt(dataDirectory, schemaVersion, rollupAddress, dbMapSizeKb = 10 * 1_024 * 1_024, maxReaders = MAX_READERS, bindings) {
117
+ const log = createLogger('kv-store:lmdb-v2', bindings);
118
+ log.debug(`Opening data store at: ${dataDirectory} with size: ${dbMapSizeKb} KB (LMDB v2)`);
119
+ const [store] = await new DatabaseVersionManager({
120
+ schemaVersion,
121
+ rollupAddress,
122
+ dataDirectory,
123
+ onOpen: (dataDir)=>AztecLMDBStoreV2.new(dataDir, dbMapSizeKb, maxReaders, undefined, bindings)
124
+ }).open();
125
+ return store;
126
+ }
@@ -0,0 +1,3 @@
1
+ export * from './store.js';
2
+ export * from './factory.js';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sbWRiLXYyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsY0FBYyxDQUFDIn0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lmdb-v2/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './store.js';
2
+ export * from './factory.js';
@@ -0,0 +1,53 @@
1
+ import type { Key, Range, Value } from '../interfaces/common.js';
2
+ import type { AztecAsyncMap } from '../interfaces/map.js';
3
+ import type { AztecLMDBStoreV2 } from './store.js';
4
+ export declare class LMDBMap<K extends Key, V extends Value> implements AztecAsyncMap<K, V> {
5
+ private store;
6
+ private prefix;
7
+ private encoder;
8
+ constructor(store: AztecLMDBStoreV2, name: string);
9
+ /**
10
+ * Sets the value at the given key.
11
+ * @param key - The key to set the value at
12
+ * @param val - The value to set
13
+ */
14
+ set(key: K, val: V): Promise<void>;
15
+ /**
16
+ * Sets the values at the given keys.
17
+ * @param entries - The entries to set
18
+ */
19
+ setMany(entries: {
20
+ key: K;
21
+ value: V;
22
+ }[]): Promise<void>;
23
+ /**
24
+ * Sets the value at the given key if it does not already exist.
25
+ * @param key - The key to set the value at
26
+ * @param val - The value to set
27
+ */
28
+ setIfNotExists(key: K, val: V): Promise<boolean>;
29
+ /**
30
+ * Deletes the value at the given key.
31
+ * @param key - The key to delete the value at
32
+ */
33
+ delete(key: K): Promise<void>;
34
+ getAsync(key: K): Promise<V | undefined>;
35
+ hasAsync(key: K): Promise<boolean>;
36
+ sizeAsync(): Promise<number>;
37
+ /**
38
+ * Iterates over the map's key-value entries in the key's natural order
39
+ * @param range - The range of keys to iterate over
40
+ */
41
+ entriesAsync(range?: Range<K>): AsyncIterableIterator<[K, V]>;
42
+ /**
43
+ * Iterates over the map's values in the key's natural order
44
+ * @param range - The range of keys to iterate over
45
+ */
46
+ valuesAsync(range?: Range<K>): AsyncIterableIterator<V>;
47
+ /**
48
+ * Iterates over the map's keys in the key's natural order
49
+ * @param range - The range of keys to iterate over
50
+ */
51
+ keysAsync(range?: Range<K>): AsyncIterableIterator<K>;
52
+ }
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbG1kYi12Mi9tYXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRSxPQUFPLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUxRCxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUluRCxxQkFBYSxPQUFPLENBQUMsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDLFNBQVMsS0FBSyxDQUFFLFlBQVcsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFLL0UsT0FBTyxDQUFDLEtBQUs7SUFKZixPQUFPLENBQUMsTUFBTSxDQUFTO0lBQ3ZCLE9BQU8sQ0FBQyxPQUFPLENBQWlCO0lBRWhDLFlBQ1UsS0FBSyxFQUFFLGdCQUFnQixFQUMvQixJQUFJLEVBQUUsTUFBTSxFQUdiO0lBQ0Q7Ozs7T0FJRztJQUNILEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUVqQztJQUVEOzs7T0FHRztJQUNHLE9BQU8sQ0FBQyxPQUFPLEVBQUU7UUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQTtLQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBTTVEO0lBRUQ7Ozs7T0FJRztJQUNILGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQVUvQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FFNUI7SUFFRCxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUt2QztJQUVELFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FFakM7SUFFRCxTQUFTLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUUzQjtJQUVEOzs7T0FHRztJQUNJLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcscUJBQXFCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0E4Qm5FO0lBRUQ7OztPQUdHO0lBQ0ksV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FJN0Q7SUFFRDs7O09BR0c7SUFDSSxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUkzRDtDQUNGIn0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../src/lmdb-v2/map.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAInD,qBAAa,OAAO,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,SAAS,KAAK,CAAE,YAAW,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;IAK/E,OAAO,CAAC,KAAK;IAJf,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAiB;IAEhC,YACU,KAAK,EAAE,gBAAgB,EAC/B,IAAI,EAAE,MAAM,EAGb;IACD;;;;OAIG;IACH,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjC;IAED;;;OAGG;IACG,OAAO,CAAC,OAAO,EAAE;QAAE,GAAG,EAAE,CAAC,CAAC;QAAC,KAAK,EAAE,CAAC,CAAA;KAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAM5D;IAED;;;;OAIG;IACH,cAAc,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAU/C;IAED;;;OAGG;IACH,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5B;IAED,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAKvC;IAED,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAEjC;IAED,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAE3B;IAED;;;OAGG;IACI,YAAY,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CA8BnE;IAED;;;OAGG;IACI,WAAW,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAI7D;IAED;;;OAGG;IACI,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAI3D;CACF"}
@@ -0,0 +1,106 @@
1
+ import { Encoder } from 'msgpackr';
2
+ import { execInReadTx, execInWriteTx } from './tx-helpers.js';
3
+ import { deserializeKey, maxKey, minKey, serializeKey } from './utils.js';
4
+ export class LMDBMap {
5
+ store;
6
+ prefix;
7
+ encoder;
8
+ constructor(store, name){
9
+ this.store = store;
10
+ this.encoder = new Encoder();
11
+ this.prefix = `map:${name}`;
12
+ }
13
+ /**
14
+ * Sets the value at the given key.
15
+ * @param key - The key to set the value at
16
+ * @param val - The value to set
17
+ */ set(key, val) {
18
+ return execInWriteTx(this.store, (tx)=>tx.set(serializeKey(this.prefix, key), this.encoder.pack(val)));
19
+ }
20
+ /**
21
+ * Sets the values at the given keys.
22
+ * @param entries - The entries to set
23
+ */ async setMany(entries) {
24
+ await execInWriteTx(this.store, async (tx)=>{
25
+ for (const { key, value } of entries){
26
+ await tx.set(serializeKey(this.prefix, key), this.encoder.pack(value));
27
+ }
28
+ });
29
+ }
30
+ /**
31
+ * Sets the value at the given key if it does not already exist.
32
+ * @param key - The key to set the value at
33
+ * @param val - The value to set
34
+ */ setIfNotExists(key, val) {
35
+ return execInWriteTx(this.store, async (tx)=>{
36
+ const strKey = serializeKey(this.prefix, key);
37
+ const exists = !!await tx.get(strKey);
38
+ if (!exists) {
39
+ await tx.set(strKey, this.encoder.pack(val));
40
+ return true;
41
+ }
42
+ return false;
43
+ });
44
+ }
45
+ /**
46
+ * Deletes the value at the given key.
47
+ * @param key - The key to delete the value at
48
+ */ delete(key) {
49
+ return execInWriteTx(this.store, (tx)=>tx.remove(serializeKey(this.prefix, key)));
50
+ }
51
+ getAsync(key) {
52
+ return execInReadTx(this.store, async (tx)=>{
53
+ const val = await tx.get(serializeKey(this.prefix, key));
54
+ return val ? this.encoder.unpack(val) : undefined;
55
+ });
56
+ }
57
+ hasAsync(key) {
58
+ return execInReadTx(this.store, async (tx)=>!!await tx.get(serializeKey(this.prefix, key)));
59
+ }
60
+ sizeAsync() {
61
+ return execInReadTx(this.store, (tx)=>tx.countEntries(minKey(this.prefix), maxKey(this.prefix), false));
62
+ }
63
+ /**
64
+ * Iterates over the map's key-value entries in the key's natural order
65
+ * @param range - The range of keys to iterate over
66
+ */ async *entriesAsync(range) {
67
+ const reverse = range?.reverse ?? false;
68
+ const startKey = range?.start !== undefined ? serializeKey(this.prefix, range.start) : minKey(this.prefix);
69
+ const endKey = range?.end !== undefined ? serializeKey(this.prefix, range.end) : reverse ? maxKey(this.prefix) : undefined;
70
+ let tx = this.store.getCurrentWriteTx();
71
+ const shouldClose = !tx;
72
+ tx ??= this.store.getReadTx();
73
+ try {
74
+ for await (const [key, val] of tx.iterate(reverse ? endKey : startKey, reverse ? startKey : endKey, reverse, range?.limit)){
75
+ const deserializedKey = deserializeKey(this.prefix, key);
76
+ if (deserializedKey === false) {
77
+ break;
78
+ }
79
+ yield [
80
+ deserializedKey,
81
+ this.encoder.unpack(val)
82
+ ];
83
+ }
84
+ } finally{
85
+ if (shouldClose) {
86
+ tx.close();
87
+ }
88
+ }
89
+ }
90
+ /**
91
+ * Iterates over the map's values in the key's natural order
92
+ * @param range - The range of keys to iterate over
93
+ */ async *valuesAsync(range) {
94
+ for await (const [_, value] of this.entriesAsync(range)){
95
+ yield value;
96
+ }
97
+ }
98
+ /**
99
+ * Iterates over the map's keys in the key's natural order
100
+ * @param range - The range of keys to iterate over
101
+ */ async *keysAsync(range) {
102
+ for await (const [key, _] of this.entriesAsync(range)){
103
+ yield key;
104
+ }
105
+ }
106
+ }
@@ -0,0 +1,131 @@
1
+ export declare enum Database {
2
+ DATA = "data",
3
+ INDEX = "index"
4
+ }
5
+ export declare const CURSOR_PAGE_SIZE = 10;
6
+ export declare enum LMDBMessageType {
7
+ OPEN_DATABASE = 100,
8
+ GET = 101,
9
+ HAS = 102,
10
+ START_CURSOR = 103,
11
+ ADVANCE_CURSOR = 104,
12
+ ADVANCE_CURSOR_COUNT = 105,
13
+ CLOSE_CURSOR = 106,
14
+ BATCH = 107,
15
+ STATS = 108,
16
+ CLOSE = 109,
17
+ COPY_STORE = 110
18
+ }
19
+ type Key = Uint8Array;
20
+ type Value = Uint8Array;
21
+ type OptionalValues = Array<Value[] | null>;
22
+ type KeyOptionalValues = [Key, null | Array<Value>];
23
+ type KeyValues = [Key, Value[]];
24
+ interface OpenDatabaseRequest {
25
+ db: string;
26
+ uniqueKeys?: boolean;
27
+ }
28
+ interface GetRequest {
29
+ keys: Key[];
30
+ db: string;
31
+ }
32
+ interface GetResponse {
33
+ values: OptionalValues;
34
+ }
35
+ interface HasRequest {
36
+ entries: KeyOptionalValues[];
37
+ db: string;
38
+ }
39
+ interface StartCursorRequest {
40
+ key: Key;
41
+ reverse: boolean;
42
+ count: number | null;
43
+ onePage: boolean | null;
44
+ db: string;
45
+ }
46
+ interface AdvanceCursorRequest {
47
+ cursor: number;
48
+ count: number | null;
49
+ }
50
+ interface AdvanceCursorCountRequest {
51
+ cursor: number;
52
+ endKey: Key;
53
+ }
54
+ interface CloseCursorRequest {
55
+ cursor: number;
56
+ }
57
+ interface CopyStoreRequest {
58
+ dstPath: string;
59
+ compact: boolean;
60
+ }
61
+ export interface Batch {
62
+ addEntries: Array<KeyValues>;
63
+ removeEntries: Array<KeyOptionalValues>;
64
+ }
65
+ interface BatchRequest {
66
+ batches: Map<string, Batch>;
67
+ }
68
+ export type LMDBRequestBody = {
69
+ [LMDBMessageType.OPEN_DATABASE]: OpenDatabaseRequest;
70
+ [LMDBMessageType.GET]: GetRequest;
71
+ [LMDBMessageType.HAS]: HasRequest;
72
+ [LMDBMessageType.START_CURSOR]: StartCursorRequest;
73
+ [LMDBMessageType.ADVANCE_CURSOR]: AdvanceCursorRequest;
74
+ [LMDBMessageType.ADVANCE_CURSOR_COUNT]: AdvanceCursorCountRequest;
75
+ [LMDBMessageType.CLOSE_CURSOR]: CloseCursorRequest;
76
+ [LMDBMessageType.BATCH]: BatchRequest;
77
+ [LMDBMessageType.STATS]: void;
78
+ [LMDBMessageType.CLOSE]: void;
79
+ [LMDBMessageType.COPY_STORE]: CopyStoreRequest;
80
+ };
81
+ interface GetResponse {
82
+ values: OptionalValues;
83
+ }
84
+ interface HasResponse {
85
+ exists: boolean[];
86
+ }
87
+ interface StartCursorResponse {
88
+ cursor: number | null;
89
+ entries: Array<KeyValues>;
90
+ }
91
+ interface AdvanceCursorResponse {
92
+ entries: Array<KeyValues>;
93
+ done: boolean;
94
+ }
95
+ interface AdvanceCursorCountResponse {
96
+ count: number;
97
+ done: boolean;
98
+ }
99
+ interface BatchResponse {
100
+ durationNs: number;
101
+ }
102
+ interface BoolResponse {
103
+ ok: true;
104
+ }
105
+ interface StatsResponse {
106
+ stats: Array<{
107
+ name: string;
108
+ numDataItems: bigint | number;
109
+ totalUsedSize: bigint | number;
110
+ }>;
111
+ dbMapSizeBytes: bigint | number;
112
+ dbPhysicalFileSizeBytes: bigint | number;
113
+ }
114
+ export type LMDBResponseBody = {
115
+ [LMDBMessageType.OPEN_DATABASE]: BoolResponse;
116
+ [LMDBMessageType.GET]: GetResponse;
117
+ [LMDBMessageType.HAS]: HasResponse;
118
+ [LMDBMessageType.START_CURSOR]: StartCursorResponse;
119
+ [LMDBMessageType.ADVANCE_CURSOR]: AdvanceCursorResponse;
120
+ [LMDBMessageType.ADVANCE_CURSOR_COUNT]: AdvanceCursorCountResponse;
121
+ [LMDBMessageType.CLOSE_CURSOR]: BoolResponse;
122
+ [LMDBMessageType.BATCH]: BatchResponse;
123
+ [LMDBMessageType.STATS]: StatsResponse;
124
+ [LMDBMessageType.CLOSE]: BoolResponse;
125
+ [LMDBMessageType.COPY_STORE]: BoolResponse;
126
+ };
127
+ export interface LMDBMessageChannel {
128
+ sendMessage<T extends LMDBMessageType>(msgType: T, body: LMDBRequestBody[T]): Promise<LMDBResponseBody[T]>;
129
+ }
130
+ export {};
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xtZGItdjIvbWVzc2FnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxvQkFBWSxRQUFRO0lBQ2xCLElBQUksU0FBUztJQUNiLEtBQUssVUFBVTtDQUNoQjtBQUVELGVBQU8sTUFBTSxnQkFBZ0IsS0FBSyxDQUFDO0FBRW5DLG9CQUFZLGVBQWU7SUFDekIsYUFBYSxNQUFNO0lBQ25CLEdBQUcsTUFBQTtJQUNILEdBQUcsTUFBQTtJQUVILFlBQVksTUFBQTtJQUNaLGNBQWMsTUFBQTtJQUNkLG9CQUFvQixNQUFBO0lBQ3BCLFlBQVksTUFBQTtJQUVaLEtBQUssTUFBQTtJQUVMLEtBQUssTUFBQTtJQUVMLEtBQUssTUFBQTtJQUNMLFVBQVUsTUFBQTtDQUNYO0FBRUQsS0FBSyxHQUFHLEdBQUcsVUFBVSxDQUFDO0FBQ3RCLEtBQUssS0FBSyxHQUFHLFVBQVUsQ0FBQztBQUN4QixLQUFLLGNBQWMsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDNUMsS0FBSyxpQkFBaUIsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDcEQsS0FBSyxTQUFTLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUVoQyxVQUFVLG1CQUFtQjtJQUMzQixFQUFFLEVBQUUsTUFBTSxDQUFDO0lBQ1gsVUFBVSxDQUFDLEVBQUUsT0FBTyxDQUFDO0NBQ3RCO0FBRUQsVUFBVSxVQUFVO0lBQ2xCLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNaLEVBQUUsRUFBRSxNQUFNLENBQUM7Q0FDWjtBQUVELFVBQVUsV0FBVztJQUNuQixNQUFNLEVBQUUsY0FBYyxDQUFDO0NBQ3hCO0FBRUQsVUFBVSxVQUFVO0lBQ2xCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxDQUFD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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/lmdb-v2/message.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export var Database = /*#__PURE__*/ function(Database) {
2
+ Database["DATA"] = "data";
3
+ Database["INDEX"] = "index";
4
+ return Database;
5
+ }({});
6
+ export const CURSOR_PAGE_SIZE = 10;
7
+ export var LMDBMessageType = /*#__PURE__*/ function(LMDBMessageType) {
8
+ LMDBMessageType[LMDBMessageType["OPEN_DATABASE"] = 100] = "OPEN_DATABASE";
9
+ LMDBMessageType[LMDBMessageType["GET"] = 101] = "GET";
10
+ LMDBMessageType[LMDBMessageType["HAS"] = 102] = "HAS";
11
+ LMDBMessageType[LMDBMessageType["START_CURSOR"] = 103] = "START_CURSOR";
12
+ LMDBMessageType[LMDBMessageType["ADVANCE_CURSOR"] = 104] = "ADVANCE_CURSOR";
13
+ LMDBMessageType[LMDBMessageType["ADVANCE_CURSOR_COUNT"] = 105] = "ADVANCE_CURSOR_COUNT";
14
+ LMDBMessageType[LMDBMessageType["CLOSE_CURSOR"] = 106] = "CLOSE_CURSOR";
15
+ LMDBMessageType[LMDBMessageType["BATCH"] = 107] = "BATCH";
16
+ LMDBMessageType[LMDBMessageType["STATS"] = 108] = "STATS";
17
+ LMDBMessageType[LMDBMessageType["CLOSE"] = 109] = "CLOSE";
18
+ LMDBMessageType[LMDBMessageType["COPY_STORE"] = 110] = "COPY_STORE";
19
+ return LMDBMessageType;
20
+ }({});
@@ -0,0 +1,52 @@
1
+ import type { Key, Range, Value } from '../interfaces/common.js';
2
+ import type { AztecAsyncMultiMap } from '../interfaces/multi_map.js';
3
+ import type { AztecLMDBStoreV2 } from './store.js';
4
+ export declare class LMDBMultiMap<K extends Key, V extends Value> implements AztecAsyncMultiMap<K, V> {
5
+ private store;
6
+ private prefix;
7
+ private encoder;
8
+ constructor(store: AztecLMDBStoreV2, name: string);
9
+ /**
10
+ * Sets the value at the given key.
11
+ * @param key - The key to set the value at
12
+ * @param val - The value to set
13
+ */
14
+ set(key: K, val: V): Promise<void>;
15
+ setMany(entries: {
16
+ key: K;
17
+ value: V;
18
+ }[]): Promise<void>;
19
+ /**
20
+ * Sets the value at the given key if it does not already exist.
21
+ * @param key - The key to set the value at
22
+ * @param val - The value to set
23
+ */
24
+ setIfNotExists(key: K, val: V): Promise<boolean>;
25
+ /**
26
+ * Deletes the value at the given key.
27
+ * @param key - The key to delete the value at
28
+ */
29
+ delete(key: K): Promise<void>;
30
+ getAsync(key: K): Promise<V | undefined>;
31
+ hasAsync(key: K): Promise<boolean>;
32
+ sizeAsync(): Promise<number>;
33
+ /**
34
+ * Iterates over the map's key-value entries in the key's natural order
35
+ * @param range - The range of keys to iterate over
36
+ */
37
+ entriesAsync(range?: Range<K>): AsyncIterableIterator<[K, V]>;
38
+ /**
39
+ * Iterates over the map's values in the key's natural order
40
+ * @param range - The range of keys to iterate over
41
+ */
42
+ valuesAsync(range?: Range<K>): AsyncIterableIterator<V>;
43
+ /**
44
+ * Iterates over the map's keys in the key's natural order
45
+ * @param range - The range of keys to iterate over
46
+ */
47
+ keysAsync(range?: Range<K>): AsyncIterableIterator<K>;
48
+ deleteValue(key: K, val: V | undefined): Promise<void>;
49
+ getValuesAsync(key: K): AsyncIterableIterator<V>;
50
+ getValueCountAsync(key: K): Promise<number>;
51
+ }
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlfbWFwLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbG1kYi12Mi9tdWx0aV9tYXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRSxPQUFPLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXJFLE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBSW5ELHFCQUFhLFlBQVksQ0FBQyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsU0FBUyxLQUFLLENBQUUsWUFBVyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBSXpGLE9BQU8sQ0FBQyxLQUFLO0lBSGYsT0FBTyxDQUFDLE1BQU0sQ0FBUztJQUN2QixPQUFPLENBQUMsT0FBTyxDQUFpQjtJQUNoQyxZQUNVLEtBQUssRUFBRSxnQkFBZ0IsRUFDL0IsSUFBSSxFQUFFLE1BQU0sRUFHYjtJQUVEOzs7O09BSUc7SUFDSCxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FFakM7SUFFSyxPQUFPLENBQUMsT0FBTyxFQUFFO1FBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUFDLEtBQUssRUFBRSxDQUFDLENBQUE7S0FBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQU01RDtJQUVEOzs7O09BSUc7SUFDSCxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FTL0M7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBRTVCO0lBRUQsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FLdkM7SUFFRCxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBRWpDO0lBRUQsU0FBUyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FFM0I7SUFFRDs7O09BR0c7SUFDSSxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBOEJuRTtJQUVEOzs7T0FHRztJQUNJLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBSTdEO0lBRUQ7OztPQUdHO0lBQ0ksU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FJM0Q7SUFFRCxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBRXJEO0lBRU0sY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBS3REO0lBRUQsa0JBQWtCLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBSzFDO0NBQ0YifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi_map.d.ts","sourceRoot":"","sources":["../../src/lmdb-v2/multi_map.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAErE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAInD,qBAAa,YAAY,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,SAAS,KAAK,CAAE,YAAW,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC;IAIzF,OAAO,CAAC,KAAK;IAHf,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAiB;IAChC,YACU,KAAK,EAAE,gBAAgB,EAC/B,IAAI,EAAE,MAAM,EAGb;IAED;;;;OAIG;IACH,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjC;IAEK,OAAO,CAAC,OAAO,EAAE;QAAE,GAAG,EAAE,CAAC,CAAC;QAAC,KAAK,EAAE,CAAC,CAAA;KAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAM5D;IAED;;;;OAIG;IACH,cAAc,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAS/C;IAED;;;OAGG;IACH,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5B;IAED,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAKvC;IAED,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAEjC;IAED,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAE3B;IAED;;;OAGG;IACI,YAAY,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CA8BnE;IAED;;;OAGG;IACI,WAAW,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAI7D;IAED;;;OAGG;IACI,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAI3D;IAED,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAErD;IAEM,cAAc,CAAC,GAAG,EAAE,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAKtD;IAED,kBAAkB,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAK1C;CACF"}
@@ -0,0 +1,123 @@
1
+ import { Encoder } from 'msgpackr/pack';
2
+ import { MAXIMUM_KEY, toBufferKey } from 'ordered-binary';
3
+ import { execInReadTx, execInWriteTx } from './tx-helpers.js';
4
+ import { deserializeKey, maxKey, minKey, serializeKey } from './utils.js';
5
+ export class LMDBMultiMap {
6
+ store;
7
+ prefix;
8
+ encoder;
9
+ constructor(store, name){
10
+ this.store = store;
11
+ this.encoder = new Encoder();
12
+ this.prefix = `multimap:${name}`;
13
+ }
14
+ /**
15
+ * Sets the value at the given key.
16
+ * @param key - The key to set the value at
17
+ * @param val - The value to set
18
+ */ set(key, val) {
19
+ return execInWriteTx(this.store, (tx)=>tx.setIndex(serializeKey(this.prefix, key), this.encoder.pack(val)));
20
+ }
21
+ async setMany(entries) {
22
+ await execInWriteTx(this.store, async (tx)=>{
23
+ for (const { key, value } of entries){
24
+ await tx.setIndex(serializeKey(this.prefix, key), this.encoder.pack(value));
25
+ }
26
+ });
27
+ }
28
+ /**
29
+ * Sets the value at the given key if it does not already exist.
30
+ * @param key - The key to set the value at
31
+ * @param val - The value to set
32
+ */ setIfNotExists(key, val) {
33
+ return execInWriteTx(this.store, async (tx)=>{
34
+ const exists = !!await this.getAsync(key);
35
+ if (!exists) {
36
+ await tx.setIndex(serializeKey(this.prefix, key), this.encoder.pack(val));
37
+ return true;
38
+ }
39
+ return false;
40
+ });
41
+ }
42
+ /**
43
+ * Deletes the value at the given key.
44
+ * @param key - The key to delete the value at
45
+ */ delete(key) {
46
+ return execInWriteTx(this.store, (tx)=>tx.removeIndex(serializeKey(this.prefix, key)));
47
+ }
48
+ getAsync(key) {
49
+ return execInReadTx(this.store, async (tx)=>{
50
+ const val = await tx.getIndex(serializeKey(this.prefix, key));
51
+ return val.length > 0 ? this.encoder.unpack(val[0]) : undefined;
52
+ });
53
+ }
54
+ hasAsync(key) {
55
+ return execInReadTx(this.store, async (tx)=>(await tx.getIndex(serializeKey(this.prefix, key))).length > 0);
56
+ }
57
+ sizeAsync() {
58
+ return execInReadTx(this.store, (tx)=>tx.countEntriesIndex(minKey(this.prefix), maxKey(this.prefix), false));
59
+ }
60
+ /**
61
+ * Iterates over the map's key-value entries in the key's natural order
62
+ * @param range - The range of keys to iterate over
63
+ */ async *entriesAsync(range) {
64
+ const reverse = range?.reverse ?? false;
65
+ const startKey = range?.start ? serializeKey(this.prefix, range.start) : minKey(this.prefix);
66
+ const endKey = range?.end ? serializeKey(this.prefix, range.end) : reverse ? maxKey(this.prefix) : undefined;
67
+ let tx = this.store.getCurrentWriteTx();
68
+ const shouldClose = !tx;
69
+ tx ??= this.store.getReadTx();
70
+ try {
71
+ for await (const [key, vals] of tx.iterateIndex(reverse ? endKey : startKey, reverse ? startKey : endKey, reverse, range?.limit)){
72
+ const deserializedKey = deserializeKey(this.prefix, key);
73
+ if (!deserializedKey) {
74
+ break;
75
+ }
76
+ for (const val of vals){
77
+ yield [
78
+ deserializedKey,
79
+ this.encoder.unpack(val)
80
+ ];
81
+ }
82
+ }
83
+ } finally{
84
+ if (shouldClose) {
85
+ tx.close();
86
+ }
87
+ }
88
+ }
89
+ /**
90
+ * Iterates over the map's values in the key's natural order
91
+ * @param range - The range of keys to iterate over
92
+ */ async *valuesAsync(range) {
93
+ for await (const [_, value] of this.entriesAsync(range)){
94
+ yield value;
95
+ }
96
+ }
97
+ /**
98
+ * Iterates over the map's keys in the key's natural order
99
+ * @param range - The range of keys to iterate over
100
+ */ async *keysAsync(range) {
101
+ for await (const [key, _] of this.entriesAsync(range)){
102
+ yield key;
103
+ }
104
+ }
105
+ deleteValue(key, val) {
106
+ return execInWriteTx(this.store, (tx)=>tx.removeIndex(serializeKey(this.prefix, key), this.encoder.pack(val)));
107
+ }
108
+ async *getValuesAsync(key) {
109
+ const values = await execInReadTx(this.store, (tx)=>tx.getIndex(serializeKey(this.prefix, key)));
110
+ for (const value of values){
111
+ yield this.encoder.unpack(value);
112
+ }
113
+ }
114
+ getValueCountAsync(key) {
115
+ const startKey = serializeKey(this.prefix, key);
116
+ const endKey = toBufferKey([
117
+ this.prefix,
118
+ key,
119
+ MAXIMUM_KEY
120
+ ]);
121
+ return execInReadTx(this.store, (tx)=>tx.countEntriesIndex(startKey, endKey, false));
122
+ }
123
+ }