opfsql 0.0.2

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 (270) hide show
  1. package/LICENSE +19 -0
  2. package/README.md +198 -0
  3. package/dist/binder/core/context.d.ts +15 -0
  4. package/dist/binder/core/errors.d.ts +4 -0
  5. package/dist/binder/core/helpers.d.ts +6 -0
  6. package/dist/binder/core/operators.d.ts +12 -0
  7. package/dist/binder/core/plan-utils.d.ts +4 -0
  8. package/dist/binder/core/scope.d.ts +34 -0
  9. package/dist/binder/core/type-check.d.ts +5 -0
  10. package/dist/binder/core/type-map.d.ts +8 -0
  11. package/dist/binder/core/utils/eval-constant.d.ts +4 -0
  12. package/dist/binder/core/utils/extract-columns.d.ts +4 -0
  13. package/dist/binder/core/utils/find-column.d.ts +4 -0
  14. package/dist/binder/core/utils/require-table.d.ts +3 -0
  15. package/dist/binder/expression/aggregate.d.ts +11 -0
  16. package/dist/binder/expression/between.d.ts +5 -0
  17. package/dist/binder/expression/case.d.ts +5 -0
  18. package/dist/binder/expression/cast.d.ts +5 -0
  19. package/dist/binder/expression/column-ref.d.ts +5 -0
  20. package/dist/binder/expression/comparison.d.ts +5 -0
  21. package/dist/binder/expression/conjunction.d.ts +5 -0
  22. package/dist/binder/expression/constant.d.ts +3 -0
  23. package/dist/binder/expression/function.d.ts +5 -0
  24. package/dist/binder/expression/index.d.ts +5 -0
  25. package/dist/binder/expression/operator.d.ts +5 -0
  26. package/dist/binder/expression/parameter.d.ts +4 -0
  27. package/dist/binder/expression/same-expression.d.ts +3 -0
  28. package/dist/binder/expression/star.d.ts +5 -0
  29. package/dist/binder/expression/subquery.d.ts +5 -0
  30. package/dist/binder/index.d.ts +30 -0
  31. package/dist/binder/statement/alter-table.d.ts +4 -0
  32. package/dist/binder/statement/create-index.d.ts +4 -0
  33. package/dist/binder/statement/create-table.d.ts +4 -0
  34. package/dist/binder/statement/cte.d.ts +16 -0
  35. package/dist/binder/statement/delete.d.ts +4 -0
  36. package/dist/binder/statement/drop.d.ts +3 -0
  37. package/dist/binder/statement/insert.d.ts +4 -0
  38. package/dist/binder/statement/query-node.d.ts +5 -0
  39. package/dist/binder/statement/select.d.ts +5 -0
  40. package/dist/binder/statement/set-operation.d.ts +5 -0
  41. package/dist/binder/statement/update.d.ts +4 -0
  42. package/dist/binder/table-ref/base-table.d.ts +5 -0
  43. package/dist/binder/table-ref/index.d.ts +5 -0
  44. package/dist/binder/table-ref/join.d.ts +6 -0
  45. package/dist/binder/table-ref/subquery.d.ts +5 -0
  46. package/dist/binder/tests/aggregates.test.d.ts +1 -0
  47. package/dist/binder/tests/binder.test.d.ts +1 -0
  48. package/dist/binder/tests/cte.test.d.ts +1 -0
  49. package/dist/binder/tests/ddl.test.d.ts +1 -0
  50. package/dist/binder/tests/dml.test.d.ts +1 -0
  51. package/dist/binder/tests/expressions.test.d.ts +1 -0
  52. package/dist/binder/tests/join.test.d.ts +1 -0
  53. package/dist/binder/tests/misc.test.d.ts +1 -0
  54. package/dist/binder/tests/select.test.d.ts +1 -0
  55. package/dist/binder/tests/subquery.test.d.ts +1 -0
  56. package/dist/binder/tests/test_helpers.d.ts +14 -0
  57. package/dist/binder/tests/union.test.d.ts +1 -0
  58. package/dist/binder/tests/utils.test.d.ts +1 -0
  59. package/dist/binder/types.d.ts +401 -0
  60. package/dist/engine/engine.d.ts +23 -0
  61. package/dist/engine/explain.d.ts +3 -0
  62. package/dist/engine/index.d.ts +3 -0
  63. package/dist/engine/session.d.ts +43 -0
  64. package/dist/engine/tests/engine.test.d.ts +1 -0
  65. package/dist/engine/tests/explain-format.test.d.ts +1 -0
  66. package/dist/engine/tests/explain.test.d.ts +1 -0
  67. package/dist/engine/tests/session.test.d.ts +1 -0
  68. package/dist/engine/types.d.ts +19 -0
  69. package/dist/executor/ddl/alter-drop.d.ts +5 -0
  70. package/dist/executor/ddl/create.d.ts +5 -0
  71. package/dist/executor/ddl/index.d.ts +2 -0
  72. package/dist/executor/ddl.d.ts +8 -0
  73. package/dist/executor/dml/delete.d.ts +5 -0
  74. package/dist/executor/dml/index.d.ts +3 -0
  75. package/dist/executor/dml/insert.d.ts +5 -0
  76. package/dist/executor/dml/update.d.ts +5 -0
  77. package/dist/executor/dml/utils/coerce.d.ts +3 -0
  78. package/dist/executor/dml/utils/index-maintenance.d.ts +5 -0
  79. package/dist/executor/dml/utils/scan.d.ts +16 -0
  80. package/dist/executor/dml.d.ts +8 -0
  81. package/dist/executor/errors.d.ts +4 -0
  82. package/dist/executor/evaluate/aggregate.d.ts +4 -0
  83. package/dist/executor/evaluate/between.d.ts +5 -0
  84. package/dist/executor/evaluate/case.d.ts +5 -0
  85. package/dist/executor/evaluate/cast.d.ts +5 -0
  86. package/dist/executor/evaluate/column-ref.d.ts +5 -0
  87. package/dist/executor/evaluate/comparison.d.ts +5 -0
  88. package/dist/executor/evaluate/compile.d.ts +11 -0
  89. package/dist/executor/evaluate/conjunction.d.ts +5 -0
  90. package/dist/executor/evaluate/context.d.ts +9 -0
  91. package/dist/executor/evaluate/function.d.ts +5 -0
  92. package/dist/executor/evaluate/functions/md5.d.ts +1 -0
  93. package/dist/executor/evaluate/functions/normalize-json.d.ts +8 -0
  94. package/dist/executor/evaluate/helpers.d.ts +14 -0
  95. package/dist/executor/evaluate/index.d.ts +6 -0
  96. package/dist/executor/evaluate/json-access.d.ts +7 -0
  97. package/dist/executor/evaluate/operator.d.ts +5 -0
  98. package/dist/executor/evaluate/parameter.d.ts +4 -0
  99. package/dist/executor/evaluate/subquery.d.ts +5 -0
  100. package/dist/executor/evaluate/utils/cast.d.ts +7 -0
  101. package/dist/executor/evaluate/utils/compare.d.ts +8 -0
  102. package/dist/executor/evaluate/utils/like.d.ts +2 -0
  103. package/dist/executor/evaluate/utils/serialize.d.ts +3 -0
  104. package/dist/executor/execute/index.d.ts +4 -0
  105. package/dist/executor/execute/result.d.ts +5 -0
  106. package/dist/executor/execute/select.d.ts +8 -0
  107. package/dist/executor/executor.d.ts +5 -0
  108. package/dist/executor/index.d.ts +3 -0
  109. package/dist/executor/operators/aggregate.d.ts +22 -0
  110. package/dist/executor/operators/cte.d.ts +37 -0
  111. package/dist/executor/operators/filter.d.ts +13 -0
  112. package/dist/executor/operators/index-min-max.d.ts +18 -0
  113. package/dist/executor/operators/index-scan.d.ts +22 -0
  114. package/dist/executor/operators/index-union-scan.d.ts +22 -0
  115. package/dist/executor/operators/join.d.ts +36 -0
  116. package/dist/executor/operators/limit.d.ts +13 -0
  117. package/dist/executor/operators/projection.d.ts +14 -0
  118. package/dist/executor/operators/scan.d.ts +29 -0
  119. package/dist/executor/operators/set.d.ts +22 -0
  120. package/dist/executor/operators/sort.d.ts +18 -0
  121. package/dist/executor/operators/utils.d.ts +10 -0
  122. package/dist/executor/planner/index.d.ts +5 -0
  123. package/dist/executor/planner/plan-aggregate.d.ts +5 -0
  124. package/dist/executor/planner/plan-cte.d.ts +6 -0
  125. package/dist/executor/planner/plan-filter.d.ts +4 -0
  126. package/dist/executor/planner/plan-get.d.ts +6 -0
  127. package/dist/executor/planner/plan-join.d.ts +5 -0
  128. package/dist/executor/planner/plan-limit.d.ts +4 -0
  129. package/dist/executor/planner/plan-order-by.d.ts +4 -0
  130. package/dist/executor/planner/plan-projection.d.ts +4 -0
  131. package/dist/executor/planner/plan-set.d.ts +5 -0
  132. package/dist/executor/planner/types.d.ts +12 -0
  133. package/dist/executor/planner.d.ts +5 -0
  134. package/dist/executor/resolve.d.ts +3 -0
  135. package/dist/executor/tests/compile.test.d.ts +1 -0
  136. package/dist/executor/tests/ddl-dml.test.d.ts +1 -0
  137. package/dist/executor/tests/evaluate.test.d.ts +1 -0
  138. package/dist/executor/tests/executor.test.d.ts +1 -0
  139. package/dist/executor/tests/functions.test.d.ts +1 -0
  140. package/dist/executor/tests/helpers.d.ts +34 -0
  141. package/dist/executor/tests/index-min-max.test.d.ts +1 -0
  142. package/dist/executor/tests/index-scan.test.d.ts +1 -0
  143. package/dist/executor/tests/index-union-scan.test.d.ts +1 -0
  144. package/dist/executor/tests/operators.test.d.ts +1 -0
  145. package/dist/executor/tests/planner.test.d.ts +1 -0
  146. package/dist/executor/tests/scan.test.d.ts +1 -0
  147. package/dist/executor/types.d.ts +39 -0
  148. package/dist/index.d.ts +3 -0
  149. package/dist/index.js +5 -0
  150. package/dist/optimizer/build_probe_side.d.ts +2 -0
  151. package/dist/optimizer/decorrelate_exists.d.ts +2 -0
  152. package/dist/optimizer/expression_rewriter.d.ts +2 -0
  153. package/dist/optimizer/filter_combiner.d.ts +13 -0
  154. package/dist/optimizer/filter_pullup.d.ts +2 -0
  155. package/dist/optimizer/filter_pushdown.d.ts +2 -0
  156. package/dist/optimizer/in_clause_rewriter.d.ts +2 -0
  157. package/dist/optimizer/index.d.ts +15 -0
  158. package/dist/optimizer/index_selection.d.ts +3 -0
  159. package/dist/optimizer/join_order.d.ts +2 -0
  160. package/dist/optimizer/limit_pushdown.d.ts +2 -0
  161. package/dist/optimizer/remove_unused_columns.d.ts +2 -0
  162. package/dist/optimizer/reorder_filter.d.ts +4 -0
  163. package/dist/optimizer/tests/build_probe_side.test.d.ts +1 -0
  164. package/dist/optimizer/tests/decorrelate_exists.test.d.ts +1 -0
  165. package/dist/optimizer/tests/expression_rewriter.test.d.ts +1 -0
  166. package/dist/optimizer/tests/filter_combiner.test.d.ts +1 -0
  167. package/dist/optimizer/tests/filter_pullup.test.d.ts +1 -0
  168. package/dist/optimizer/tests/filter_pushdown.test.d.ts +1 -0
  169. package/dist/optimizer/tests/full_pipeline.test.d.ts +1 -0
  170. package/dist/optimizer/tests/in_clause_rewriter.test.d.ts +1 -0
  171. package/dist/optimizer/tests/index_selection.test.d.ts +1 -0
  172. package/dist/optimizer/tests/join_order.test.d.ts +1 -0
  173. package/dist/optimizer/tests/limit_pushdown.test.d.ts +1 -0
  174. package/dist/optimizer/tests/optimizer.test.d.ts +1 -0
  175. package/dist/optimizer/tests/remove_unused_columns.test.d.ts +1 -0
  176. package/dist/optimizer/tests/reorder_filter.test.d.ts +1 -0
  177. package/dist/optimizer/tests/test_helpers.d.ts +27 -0
  178. package/dist/optimizer/tests/utils.test.d.ts +1 -0
  179. package/dist/optimizer/utils/collect_column_refs.d.ts +2 -0
  180. package/dist/optimizer/utils/expression_key.d.ts +7 -0
  181. package/dist/optimizer/utils/expression_references_table.d.ts +2 -0
  182. package/dist/optimizer/utils/expressions_equal.d.ts +1 -0
  183. package/dist/optimizer/utils/flatten_conjunction.d.ts +2 -0
  184. package/dist/optimizer/utils/flip_comparison.d.ts +2 -0
  185. package/dist/optimizer/utils/get_expression_tables.d.ts +2 -0
  186. package/dist/optimizer/utils/get_operator_tables.d.ts +2 -0
  187. package/dist/optimizer/utils/index.d.ts +23 -0
  188. package/dist/optimizer/utils/is_column_ref.d.ts +2 -0
  189. package/dist/optimizer/utils/is_comparison.d.ts +2 -0
  190. package/dist/optimizer/utils/is_conjunction.d.ts +2 -0
  191. package/dist/optimizer/utils/is_constant.d.ts +2 -0
  192. package/dist/optimizer/utils/is_foldable.d.ts +2 -0
  193. package/dist/optimizer/utils/is_numeric_type.d.ts +2 -0
  194. package/dist/optimizer/utils/is_operator.d.ts +2 -0
  195. package/dist/optimizer/utils/is_parameter.d.ts +2 -0
  196. package/dist/optimizer/utils/make_bool_constant.d.ts +2 -0
  197. package/dist/optimizer/utils/make_conjunction.d.ts +2 -0
  198. package/dist/optimizer/utils/make_constant.d.ts +2 -0
  199. package/dist/optimizer/utils/make_null_constant.d.ts +2 -0
  200. package/dist/optimizer/utils/map_expression.d.ts +2 -0
  201. package/dist/optimizer/utils/map_operator_expressions.d.ts +2 -0
  202. package/dist/optimizer/utils/negate_comparison.d.ts +2 -0
  203. package/dist/parser/index.d.ts +3 -0
  204. package/dist/parser/lexer.d.ts +24 -0
  205. package/dist/parser/parser/base.d.ts +17 -0
  206. package/dist/parser/parser/ddl.d.ts +5 -0
  207. package/dist/parser/parser/dml.d.ts +5 -0
  208. package/dist/parser/parser/expressions.d.ts +5 -0
  209. package/dist/parser/parser/index.d.ts +7 -0
  210. package/dist/parser/parser/select.d.ts +3 -0
  211. package/dist/parser/parser/tcl.d.ts +3 -0
  212. package/dist/parser/parser/type-parser.d.ts +3 -0
  213. package/dist/parser/tests/lexer.test.d.ts +1 -0
  214. package/dist/parser/tests/parser.test.d.ts +1 -0
  215. package/dist/parser/types.d.ts +482 -0
  216. package/dist/store/backend/memory-storage.d.ts +16 -0
  217. package/dist/store/backend/node-storage.d.ts +33 -0
  218. package/dist/store/backend/opfs-storage.d.ts +39 -0
  219. package/dist/store/btree/btree.d.ts +48 -0
  220. package/dist/store/btree/compare.d.ts +13 -0
  221. package/dist/store/btree/search-bounds.d.ts +15 -0
  222. package/dist/store/btree/types.d.ts +33 -0
  223. package/dist/store/cache.d.ts +17 -0
  224. package/dist/store/catalog.d.ts +24 -0
  225. package/dist/store/errors.d.ts +5 -0
  226. package/dist/store/index-btree/compare.d.ts +3 -0
  227. package/dist/store/index-btree/index-btree.d.ts +53 -0
  228. package/dist/store/index-btree/search-bounds.d.ts +7 -0
  229. package/dist/store/index-btree/types.d.ts +27 -0
  230. package/dist/store/index-expression.d.ts +5 -0
  231. package/dist/store/index-manager.d.ts +23 -0
  232. package/dist/store/index.d.ts +10 -0
  233. package/dist/store/memory-storage.d.ts +13 -0
  234. package/dist/store/opfs/opfs-storage.d.ts +15 -0
  235. package/dist/store/opfs-storage.d.ts +44 -0
  236. package/dist/store/page-manager.d.ts +19 -0
  237. package/dist/store/row-manager.d.ts +15 -0
  238. package/dist/store/session-store.d.ts +20 -0
  239. package/dist/store/storage/memory-storage.d.ts +11 -0
  240. package/dist/store/storage/opfs-storage.d.ts +15 -0
  241. package/dist/store/storage.d.ts +28 -0
  242. package/dist/store/table-btree.d.ts +48 -0
  243. package/dist/store/table-manager.d.ts +17 -0
  244. package/dist/store/tests/btree.test.d.ts +1 -0
  245. package/dist/store/tests/catalog.test.d.ts +1 -0
  246. package/dist/store/tests/compare.test.d.ts +1 -0
  247. package/dist/store/tests/index-btree.test.d.ts +1 -0
  248. package/dist/store/tests/index-expression.test.d.ts +1 -0
  249. package/dist/store/tests/index-manager.test.d.ts +1 -0
  250. package/dist/store/tests/lru-cache.test.d.ts +1 -0
  251. package/dist/store/tests/memory-storage.d.ts +15 -0
  252. package/dist/store/tests/opfs-storage.test.d.ts +1 -0
  253. package/dist/store/tests/page-manager.test.d.ts +1 -0
  254. package/dist/store/tests/row-manager.test.d.ts +1 -0
  255. package/dist/store/tests/search-bounds.test.d.ts +1 -0
  256. package/dist/store/tests/storage.test.d.ts +1 -0
  257. package/dist/store/tests/table-btree.test.d.ts +1 -0
  258. package/dist/store/tests/vacuum.test.d.ts +1 -0
  259. package/dist/store/tests/wal-storage.test.d.ts +1 -0
  260. package/dist/store/types.d.ts +75 -0
  261. package/dist/store/vacuum.d.ts +12 -0
  262. package/dist/store/wal/crc32.d.ts +1 -0
  263. package/dist/store/wal/file-handle.d.ts +34 -0
  264. package/dist/store/wal/wal-storage.d.ts +50 -0
  265. package/dist/types.d.ts +87 -0
  266. package/dist/worker/client.d.ts +36 -0
  267. package/dist/worker/index.d.ts +1 -0
  268. package/dist/worker/protocol.d.ts +59 -0
  269. package/dist/worker/worker.d.ts +1 -0
  270. package/package.json +55 -0
@@ -0,0 +1,24 @@
1
+ import type { CatalogData, ICatalog, IndexDef, TableSchema } from "./types.js";
2
+ export declare class Catalog implements ICatalog {
3
+ private _version;
4
+ private tables;
5
+ private indexes;
6
+ get version(): number;
7
+ private key;
8
+ hasTable(name: string): boolean;
9
+ getTable(name: string): TableSchema | undefined;
10
+ addTable(schema: TableSchema): void;
11
+ removeTable(name: string): void;
12
+ updateTable(schema: TableSchema): void;
13
+ getAllTables(): TableSchema[];
14
+ hasIndex(name: string): boolean;
15
+ getIndex(name: string): IndexDef | undefined;
16
+ getTableIndexes(tableName: string): IndexDef[];
17
+ addIndex(index: IndexDef): void;
18
+ removeIndex(name: string): void;
19
+ prepareCommit(): CatalogData;
20
+ serialize(): CatalogData;
21
+ snapshot(): CatalogData;
22
+ clone(): Catalog;
23
+ static deserialize(data: CatalogData): Catalog;
24
+ }
@@ -0,0 +1,5 @@
1
+ export declare class StorageError extends Error {
2
+ readonly name = "StorageError";
3
+ constructor(message: string, cause?: unknown);
4
+ }
5
+ export declare function wrapStorageError(err: unknown): StorageError;
@@ -0,0 +1,3 @@
1
+ import type { IndexKey } from "./types.js";
2
+ export declare function compareIndexKeys(a: IndexKey, b: IndexKey): number;
3
+ export declare function keyHasNull(key: IndexKey): boolean;
@@ -0,0 +1,53 @@
1
+ import type { RowId, SyncIPageStore } from "../types.js";
2
+ import type { IndexKey, RangeOptions } from "./types.js";
3
+ export type { RangeOptions } from "./types.js";
4
+ export declare class SyncBTree {
5
+ private readonly metaPageNo;
6
+ private readonly pageStore;
7
+ private readonly unique;
8
+ constructor(metaPageNo: number, pageStore: SyncIPageStore, unique?: boolean);
9
+ insert(userKey: IndexKey, rowId: RowId): void;
10
+ delete(userKey: IndexKey, rowId: RowId): void;
11
+ lookup(userKey: IndexKey): RowId[];
12
+ range(opts?: RangeOptions): RowId[];
13
+ bulkLoad(entries: Array<{
14
+ key: IndexKey;
15
+ rowId: RowId;
16
+ }>): void;
17
+ drop(): void;
18
+ /** Return the entry with the smallest non-null key, or null if empty. */
19
+ first(): {
20
+ key: IndexKey;
21
+ rowId: RowId;
22
+ } | null;
23
+ /** Return the entry with the largest non-null key, or null if empty. */
24
+ last(): {
25
+ key: IndexKey;
26
+ rowId: RowId;
27
+ } | null;
28
+ private insertIntoLeaf;
29
+ private removeFromLeaf;
30
+ private existsWithPrefix;
31
+ private findLeftmostLeaf;
32
+ private findRightmostLeaf;
33
+ private collectRange;
34
+ private isBelowLower;
35
+ private isAboveUpper;
36
+ private checkUniqueSorted;
37
+ private buildLeaves;
38
+ private linkAndWriteLeaves;
39
+ private buildInternalLevels;
40
+ private splitLeaf;
41
+ private propagateSplit;
42
+ private splitInternal;
43
+ private createNewRoot;
44
+ private findLeafPath;
45
+ private bisectLeft;
46
+ private bisectRight;
47
+ private freeSubtree;
48
+ private readMeta;
49
+ private writeMeta;
50
+ private readNode;
51
+ private writeNode;
52
+ private createLeaf;
53
+ }
@@ -0,0 +1,7 @@
1
+ import type { IndexKeyValue, RangeOptions } from "./types.js";
2
+ export interface SearchPredicate {
3
+ columnPosition: number;
4
+ comparisonType: "EQUAL" | "LESS" | "GREATER" | "LESS_EQUAL" | "GREATER_EQUAL";
5
+ value: IndexKeyValue;
6
+ }
7
+ export declare function computeBounds(predicates: SearchPredicate[]): RangeOptions;
@@ -0,0 +1,27 @@
1
+ export type IndexKeyValue = string | number | boolean | null;
2
+ export type IndexKey = IndexKeyValue[];
3
+ export interface BTreeLeafNode {
4
+ kind: "leaf";
5
+ nodeId: number;
6
+ keys: IndexKey[];
7
+ nextLeafId: number | null;
8
+ }
9
+ export interface BTreeInternalNode {
10
+ kind: "internal";
11
+ nodeId: number;
12
+ keys: IndexKey[];
13
+ children: number[];
14
+ }
15
+ export type BTreeNode = BTreeLeafNode | BTreeInternalNode;
16
+ export interface BTreeMeta {
17
+ rootNodeId: number;
18
+ height: number;
19
+ size: number;
20
+ }
21
+ export interface RangeOptions {
22
+ lower?: IndexKey;
23
+ upper?: IndexKey;
24
+ lowerInclusive?: boolean;
25
+ upperInclusive?: boolean;
26
+ }
27
+ export declare const ORDER = 128;
@@ -0,0 +1,5 @@
1
+ import type { BoundExpression } from "../binder/types.js";
2
+ import type { IndexExpression, TableSchema } from "../types.js";
3
+ export declare function boundToIndexExpression(expr: BoundExpression, schema: TableSchema): IndexExpression;
4
+ export declare function bindIndexExpression(expr: IndexExpression, schema: TableSchema, tableIndex: number): BoundExpression;
5
+ export declare function getIndexColumns(expr: IndexExpression): string[];
@@ -0,0 +1,23 @@
1
+ import type { ICatalog, IndexKey, RowId, SearchPredicate, SyncIIndexManager, SyncIPageStore } from "./types.js";
2
+ export declare class SyncIndexManager implements SyncIIndexManager {
3
+ private readonly ps;
4
+ private readonly getCatalog;
5
+ constructor(ps: SyncIPageStore, getCatalog: () => ICatalog);
6
+ private tree;
7
+ insert(indexName: string, key: IndexKey, rowId: RowId): void;
8
+ delete(indexName: string, key: IndexKey, rowId: RowId): void;
9
+ search(indexName: string, predicates: SearchPredicate[]): RowId[];
10
+ bulkLoad(indexName: string, entries: Array<{
11
+ key: IndexKey;
12
+ rowId: RowId;
13
+ }>, unique: boolean): number;
14
+ dropIndex(indexName: string): void;
15
+ first(indexName: string): {
16
+ key: IndexKey;
17
+ rowId: RowId;
18
+ } | null;
19
+ last(indexName: string): {
20
+ key: IndexKey;
21
+ rowId: RowId;
22
+ } | null;
23
+ }
@@ -0,0 +1,10 @@
1
+ export { SyncBTree } from "./index-btree/index-btree.js";
2
+ export { SyncIndexManager } from "./index-manager.js";
3
+ export { OPFSSyncStorage } from "./backend/opfs-storage.js";
4
+ export { SessionStore } from "./session-store.js";
5
+ export { Storage } from "./storage.js";
6
+ export { SyncTableBTree } from "./table-btree.js";
7
+ export { SyncTableManager } from "./table-manager.js";
8
+ export { WalStorage } from "./wal/wal-storage.js";
9
+ export type { ISyncFileHandle } from "./wal/file-handle.js";
10
+ export type { CatalogData, ColumnDef, ICatalog, IndexDef, IndexKey, IndexKeyValue, LogicalType, Row, RowId, SearchPredicate, SyncIIndexManager, SyncIPageStore, SyncIPageStorage, SyncIRowManager, TableSchema, Value, } from "./types.js";
@@ -0,0 +1,13 @@
1
+ import type { SyncIStorage } from "./types.js";
2
+ /**
3
+ * Test-only in-memory SyncIStorage. Uses structuredClone to mimic real storage
4
+ * (no shared references between stored and returned values).
5
+ */
6
+ export declare class MemoryStorage implements SyncIStorage {
7
+ private data;
8
+ open(): Promise<void>;
9
+ close(): void;
10
+ get<T>(key: string): T | null;
11
+ putMany(entries: Array<[string, unknown]>): void;
12
+ getAllKeys(prefix: string): string[];
13
+ }
@@ -0,0 +1,15 @@
1
+ import type { IStorage } from '../types.js';
2
+ export declare class OPFSStorage implements IStorage {
3
+ private readonly dbName;
4
+ private dir;
5
+ constructor(dbName: string);
6
+ open(): Promise<void>;
7
+ close(): void;
8
+ get<T>(key: string): Promise<T | null>;
9
+ put(key: string, value: unknown): Promise<void>;
10
+ delete(key: string): Promise<void>;
11
+ putMany(entries: Array<[string, unknown]>): Promise<void>;
12
+ getAllKeys(prefix: string): Promise<string[]>;
13
+ private encodeKey;
14
+ private decodeKey;
15
+ }
@@ -0,0 +1,44 @@
1
+ import type { SyncIStorage } from './types.js';
2
+ interface FileSystemSyncAccessHandle {
3
+ getSize(): number;
4
+ read(buffer: Uint8Array, options?: {
5
+ at?: number;
6
+ }): number;
7
+ write(buffer: Uint8Array, options?: {
8
+ at?: number;
9
+ }): number;
10
+ truncate(size: number): void;
11
+ flush(): void;
12
+ close(): void;
13
+ }
14
+ declare global {
15
+ interface FileSystemFileHandle {
16
+ createSyncAccessHandle(): Promise<FileSystemSyncAccessHandle>;
17
+ }
18
+ }
19
+ export declare class OPFSSyncStorage implements SyncIStorage {
20
+ private readonly dbName;
21
+ private handle;
22
+ private pageSize;
23
+ private nextPageId;
24
+ private freeListHead;
25
+ private indexOffset;
26
+ private indexLength;
27
+ private index;
28
+ constructor(dbName: string);
29
+ open(): Promise<void>;
30
+ close(): void;
31
+ get<T>(key: string): T | null;
32
+ getAllKeys(prefix: string): string[];
33
+ putMany(entries: Array<[string, unknown]>): void;
34
+ private initNewFile;
35
+ private readHeader;
36
+ private writeHeader;
37
+ private readIndex;
38
+ private persistIndex;
39
+ private readPageData;
40
+ private writePageData;
41
+ private freePage;
42
+ private allocPage;
43
+ }
44
+ export {};
@@ -0,0 +1,19 @@
1
+ import type { SyncIPageStorage, SyncIPageStore } from "./types.js";
2
+ export declare class SyncPageStore implements SyncIPageStore {
3
+ private readonly storage;
4
+ private wal;
5
+ private cache;
6
+ private nextPageId;
7
+ private freeList;
8
+ private allocatorDirty;
9
+ private snapNextPageId;
10
+ private snapFreeList;
11
+ constructor(storage: SyncIPageStorage, nextPageId: number, freeList: number[], cacheSize?: number);
12
+ readPage<T>(pageNo: number): T | null;
13
+ writePage(pageNo: number, value: unknown): void;
14
+ allocPage(): number;
15
+ freePage(pageNo: number): void;
16
+ commit(): void;
17
+ rollback(): void;
18
+ private ensureSnapshot;
19
+ }
@@ -0,0 +1,15 @@
1
+ import type { IPageManager, IRowManager, Row, RowId } from './types.js';
2
+ export declare class RowManager implements IRowManager {
3
+ private readonly pm;
4
+ constructor(pm: IPageManager);
5
+ prepareInsert(tableId: string, row: Row): Promise<RowId>;
6
+ prepareUpdate(tableId: string, rowId: RowId, row: Row): Promise<RowId>;
7
+ prepareDelete(tableId: string, rowId: RowId): Promise<void>;
8
+ scanTable(tableId: string): AsyncGenerator<{
9
+ rowId: RowId;
10
+ row: Row;
11
+ }>;
12
+ readRow(tableId: string, rowId: RowId): Promise<Row | null>;
13
+ private liveRowCount;
14
+ private requirePage;
15
+ }
@@ -0,0 +1,20 @@
1
+ import type { Storage } from "./storage.js";
2
+ import type { CatalogData, SyncIPageStore } from "./types.js";
3
+ export declare class SessionStore implements SyncIPageStore {
4
+ private readonly storage;
5
+ private readonly catalogPageNo;
6
+ private buffer;
7
+ private allocatorDirty;
8
+ private snapNextPageId;
9
+ private snapFreeList;
10
+ constructor(storage: Storage, catalogPageNo: number);
11
+ readPage<T>(pageNo: number): T | null;
12
+ writePage(pageNo: number, value: unknown): void;
13
+ allocPage(): number;
14
+ freePage(pageNo: number): void;
15
+ commit(): void;
16
+ rollback(): void;
17
+ writeCatalog(data: CatalogData): void;
18
+ private ensureSnapshot;
19
+ private clearSnapshot;
20
+ }
@@ -0,0 +1,11 @@
1
+ import type { IStorage } from '../types.js';
2
+ export declare class MemoryStorage implements IStorage {
3
+ private data;
4
+ open(): Promise<void>;
5
+ close(): void;
6
+ get<T>(key: string): Promise<T | null>;
7
+ put(key: string, value: unknown): Promise<void>;
8
+ delete(key: string): Promise<void>;
9
+ putMany(entries: Array<[string, unknown]>): Promise<void>;
10
+ getAllKeys(prefix: string): Promise<string[]>;
11
+ }
@@ -0,0 +1,15 @@
1
+ import type { IStorage } from '../types.js';
2
+ export declare class OPFSStorage implements IStorage {
3
+ private readonly dbName;
4
+ private dir;
5
+ constructor(dbName: string);
6
+ open(): Promise<void>;
7
+ close(): void;
8
+ get<T>(key: string): Promise<T | null>;
9
+ put(key: string, value: unknown): Promise<void>;
10
+ delete(key: string): Promise<void>;
11
+ putMany(entries: Array<[string, unknown]>): Promise<void>;
12
+ getAllKeys(prefix: string): Promise<string[]>;
13
+ private encodeKey;
14
+ private decodeKey;
15
+ }
@@ -0,0 +1,28 @@
1
+ import { SessionStore } from "./session-store.js";
2
+ import type { CatalogData, SyncIPageStorage } from "./types.js";
3
+ export interface CatchUpResult {
4
+ catalog: boolean;
5
+ data: boolean;
6
+ }
7
+ export declare class Storage {
8
+ private readonly backend;
9
+ private nextPageId;
10
+ private freeList;
11
+ constructor(backend: SyncIPageStorage);
12
+ open(): Promise<void>;
13
+ createSession(): SessionStore;
14
+ readPage<T>(pageNo: number): T | null;
15
+ allocPage(): number;
16
+ freePage(pageNo: number): void;
17
+ snapshotAllocator(): {
18
+ nextPageId: number;
19
+ freeList: number[];
20
+ };
21
+ restoreAllocator(nextPageId: number, freeList: number[]): void;
22
+ commitPages(dirtyPages: Map<number, unknown>, allocatorDirty: boolean): void;
23
+ readCatalog(): CatalogData | null;
24
+ catchUp(): CatchUpResult | null;
25
+ checkpoint(): void;
26
+ close(): void;
27
+ private refreshFromStorage;
28
+ }
@@ -0,0 +1,48 @@
1
+ import type { Row, RowId, SyncIPageStore } from "./types.js";
2
+ export interface TableLeafNode {
3
+ kind: "leaf";
4
+ nodeId: number;
5
+ keys: number[];
6
+ values: Row[];
7
+ nextLeafId: number | null;
8
+ }
9
+ export interface TableInternalNode {
10
+ kind: "internal";
11
+ nodeId: number;
12
+ keys: number[];
13
+ children: number[];
14
+ }
15
+ export type TableNode = TableLeafNode | TableInternalNode;
16
+ export interface TableBTreeMeta {
17
+ rootNodeId: number;
18
+ height: number;
19
+ nextRowId: number;
20
+ size: number;
21
+ }
22
+ export declare class SyncTableBTree {
23
+ private readonly metaPageNo;
24
+ private readonly ps;
25
+ constructor(metaPageNo: number, ps: SyncIPageStore);
26
+ insert(row: Row): RowId;
27
+ get(rowId: RowId): Row | null;
28
+ update(rowId: RowId, row: Row): void;
29
+ delete(rowId: RowId): void;
30
+ scan(): Generator<{
31
+ rowId: RowId;
32
+ row: Row;
33
+ }>;
34
+ drop(): void;
35
+ private freeSubtree;
36
+ private splitLeaf;
37
+ private propagateSplit;
38
+ private splitInternal;
39
+ private createNewRoot;
40
+ private findLeafPath;
41
+ private findLeftmostLeaf;
42
+ private bisectLeft;
43
+ private bisectRight;
44
+ private readMeta;
45
+ private writeMeta;
46
+ private readNode;
47
+ private writeNode;
48
+ }
@@ -0,0 +1,17 @@
1
+ import type { ICatalog, Row, RowId, SyncIPageStore, SyncIRowManager } from "./types.js";
2
+ export declare class SyncTableManager implements SyncIRowManager {
3
+ private readonly ps;
4
+ private readonly getCatalog;
5
+ constructor(ps: SyncIPageStore, getCatalog: () => ICatalog);
6
+ private tree;
7
+ createTable(): number;
8
+ prepareInsert(tableId: string, row: Row): RowId;
9
+ prepareUpdate(tableId: string, rowId: RowId, row: Row): RowId;
10
+ prepareDelete(tableId: string, rowId: RowId): void;
11
+ scanTable(tableId: string): Generator<{
12
+ rowId: RowId;
13
+ row: Row;
14
+ }>;
15
+ readRow(tableId: string, rowId: RowId): Row | null;
16
+ deleteTableData(tableId: string): void;
17
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,15 @@
1
+ import type { IStorage } from '../types.js';
2
+ /**
3
+ * Test-only MemoryStorage that uses structuredClone to mimic real storage
4
+ * (no shared references between stored and returned values).
5
+ */
6
+ export declare class MemoryStorage implements IStorage {
7
+ private data;
8
+ open(): Promise<void>;
9
+ close(): void;
10
+ get<T>(key: string): Promise<T | null>;
11
+ put(key: string, value: unknown): Promise<void>;
12
+ delete(key: string): Promise<void>;
13
+ putMany(entries: Array<[string, unknown]>): Promise<void>;
14
+ getAllKeys(prefix: string): Promise<string[]>;
15
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,75 @@
1
+ export type { CatalogData, ColumnDef, IndexDef, IndexExpression, JsonValue, LogicalType, Row, RowId, TableSchema, Value, } from "../types.js";
2
+ export type { SearchPredicate } from "./index-btree/search-bounds.js";
3
+ export type { IndexKey, IndexKeyValue } from "./index-btree/types.js";
4
+ import type { CatalogData, IndexDef, Row, RowId, TableSchema } from "../types.js";
5
+ import type { SearchPredicate } from "./index-btree/search-bounds.js";
6
+ import type { IndexKey } from "./index-btree/types.js";
7
+ export interface ICatalog {
8
+ hasTable(name: string): boolean;
9
+ getTable(name: string): TableSchema | undefined;
10
+ addTable(schema: TableSchema): void;
11
+ removeTable(name: string): void;
12
+ updateTable(schema: TableSchema): void;
13
+ getAllTables(): TableSchema[];
14
+ hasIndex(name: string): boolean;
15
+ getIndex(name: string): IndexDef | undefined;
16
+ getTableIndexes(tableName: string): IndexDef[];
17
+ addIndex(index: IndexDef): void;
18
+ removeIndex(name: string): void;
19
+ serialize(): CatalogData;
20
+ }
21
+ export interface SyncIPageStorage {
22
+ open(): Promise<void>;
23
+ close(): void;
24
+ readPage<T>(pageNo: number): T | null;
25
+ writePage(pageNo: number, value: unknown): void;
26
+ getNextPageId(): number;
27
+ writeHeader(nextPageId: number): void;
28
+ flush(): void;
29
+ /** Shrink backing file to match nextPageId. Safe only after flush(). */
30
+ truncateToSize?(): void;
31
+ /** Catch up with changes made by other writers. Returns set of changed page numbers, or null if nothing changed. */
32
+ catchUp?(): Set<number> | null;
33
+ /** Merge WAL into main DB and reset WAL. */
34
+ checkpoint?(): void;
35
+ }
36
+ export interface SyncIPageStore {
37
+ readPage<T>(pageNo: number): T | null;
38
+ writePage(pageNo: number, value: unknown): void;
39
+ allocPage(): number;
40
+ freePage(pageNo: number): void;
41
+ commit(): void;
42
+ rollback(): void;
43
+ }
44
+ export interface SyncIRowManager {
45
+ createTable(): number;
46
+ prepareInsert(tableId: string, row: Row): RowId;
47
+ prepareUpdate(tableId: string, rowId: RowId, row: Row): RowId;
48
+ prepareDelete(tableId: string, rowId: RowId): void;
49
+ scanTable(tableId: string): Iterable<{
50
+ rowId: RowId;
51
+ row: Row;
52
+ }>;
53
+ readRow(tableId: string, rowId: RowId): Row | null;
54
+ deleteTableData(tableId: string): void;
55
+ }
56
+ export interface SyncIIndexManager {
57
+ insert(indexName: string, key: IndexKey, rowId: RowId): void;
58
+ delete(indexName: string, key: IndexKey, rowId: RowId): void;
59
+ search(indexName: string, predicates: SearchPredicate[]): RowId[];
60
+ bulkLoad(indexName: string, entries: Array<{
61
+ key: IndexKey;
62
+ rowId: RowId;
63
+ }>, unique: boolean): number;
64
+ dropIndex(indexName: string): void;
65
+ /** Smallest non-null key in the index, or null. */
66
+ first(indexName: string): {
67
+ key: IndexKey;
68
+ rowId: RowId;
69
+ } | null;
70
+ /** Largest non-null key in the index, or null. */
71
+ last(indexName: string): {
72
+ key: IndexKey;
73
+ rowId: RowId;
74
+ } | null;
75
+ }
@@ -0,0 +1,12 @@
1
+ import type { IPageManager, ICatalog, IVacuum } from './types.js';
2
+ import type { IIndexManager } from './index-manager.js';
3
+ export declare class Vacuum implements IVacuum {
4
+ private readonly pm;
5
+ catalog?: ICatalog;
6
+ indexManager?: IIndexManager;
7
+ constructor(pm: IPageManager);
8
+ shouldVacuum(tableId: string): Promise<boolean>;
9
+ vacuumTable(tableId: string): Promise<void>;
10
+ vacuumIfNeeded(tableId: string): Promise<void>;
11
+ private rebuildIndexes;
12
+ }
@@ -0,0 +1 @@
1
+ export declare function crc32(data: Uint8Array): number;
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Abstraction over FileSystemSyncAccessHandle for testability.
3
+ * In OPFS workers, the real handle is used directly.
4
+ * In tests, MemoryFileHandle provides an ArrayBuffer-backed implementation.
5
+ */
6
+ export interface ISyncFileHandle {
7
+ read(buffer: Uint8Array, options?: {
8
+ at?: number;
9
+ }): number;
10
+ write(buffer: Uint8Array, options?: {
11
+ at?: number;
12
+ }): number;
13
+ getSize(): number;
14
+ truncate(size: number): void;
15
+ flush(): void;
16
+ close(): void;
17
+ }
18
+ export declare class MemoryFileHandle implements ISyncFileHandle {
19
+ private buf;
20
+ private size;
21
+ constructor(initialCapacity?: number);
22
+ read(buffer: Uint8Array, options?: {
23
+ at?: number;
24
+ }): number;
25
+ write(buffer: Uint8Array, options?: {
26
+ at?: number;
27
+ }): number;
28
+ getSize(): number;
29
+ truncate(size: number): void;
30
+ flush(): void;
31
+ close(): void;
32
+ /** Test helper: return a copy of the underlying data. */
33
+ snapshot(): Uint8Array;
34
+ }