@bodil/bdb 0.1.0
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.
- package/LICENCE.md +288 -0
- package/dist/backend.d.ts +34 -0
- package/dist/backend.js +97 -0
- package/dist/backend.js.map +1 -0
- package/dist/broadcast.d.ts +9 -0
- package/dist/broadcast.js +20 -0
- package/dist/broadcast.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.js +141 -0
- package/dist/index.test.js.map +1 -0
- package/dist/indices.d.ts +56 -0
- package/dist/indices.js +56 -0
- package/dist/indices.js.map +1 -0
- package/dist/query.d.ts +49 -0
- package/dist/query.js +148 -0
- package/dist/query.js.map +1 -0
- package/dist/serial.d.ts +6 -0
- package/dist/serial.js +92 -0
- package/dist/serial.js.map +1 -0
- package/dist/storage.d.ts +39 -0
- package/dist/storage.js +69 -0
- package/dist/storage.js.map +1 -0
- package/dist/table.d.ts +75 -0
- package/dist/table.js +223 -0
- package/dist/table.js.map +1 -0
- package/dist/types.d.ts +8 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +86 -0
- package/src/backend.ts +137 -0
- package/src/broadcast.ts +27 -0
- package/src/index.test.ts +200 -0
- package/src/index.ts +76 -0
- package/src/indices.ts +108 -0
- package/src/query.ts +233 -0
- package/src/serial.ts +92 -0
- package/src/storage.ts +83 -0
- package/src/table.ts +302 -0
- package/src/types.ts +16 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type BTree from "sorted-btree";
|
|
2
|
+
import type { ArrayIndexablesOf, CustomIndexablesOf, PrimitiveIndexablesOf } from "./types";
|
|
3
|
+
export declare abstract class Index<A extends object> {
|
|
4
|
+
readonly name: string;
|
|
5
|
+
readonly keyType: unknown;
|
|
6
|
+
readonly record: object;
|
|
7
|
+
abstract extractKeys(value: A): Array<typeof this.keyType>;
|
|
8
|
+
}
|
|
9
|
+
export declare abstract class UnitIndex<A extends object> extends Index<A> {
|
|
10
|
+
abstract extractKey(value: A): typeof this.keyType;
|
|
11
|
+
}
|
|
12
|
+
export declare class CustomIndex<A extends object, T, I extends CustomIndexablesOf<A, T>> implements Index<A>, UnitIndex<A> {
|
|
13
|
+
readonly index: I;
|
|
14
|
+
readonly makeIndex: () => BTree<A[I], Array<A>>;
|
|
15
|
+
readonly keyType: A[I];
|
|
16
|
+
readonly record: {
|
|
17
|
+
[K in I]: this;
|
|
18
|
+
};
|
|
19
|
+
constructor(index: I, makeIndex: () => BTree<A[I], Array<A>>);
|
|
20
|
+
get name(): I;
|
|
21
|
+
extractKey(value: A): A[I];
|
|
22
|
+
extractKeys(value: A): Array<A[I]>;
|
|
23
|
+
}
|
|
24
|
+
export declare class PrimitiveIndex<A extends object, I extends PrimitiveIndexablesOf<A>> implements Index<A>, UnitIndex<A> {
|
|
25
|
+
readonly index: I;
|
|
26
|
+
readonly keyType: A[I];
|
|
27
|
+
readonly record: {
|
|
28
|
+
[K in I]: this;
|
|
29
|
+
};
|
|
30
|
+
constructor(index: I);
|
|
31
|
+
get name(): I;
|
|
32
|
+
extractKey(value: A): A[I];
|
|
33
|
+
extractKeys(value: A): Array<A[I]>;
|
|
34
|
+
}
|
|
35
|
+
export declare class ArrayIndex<A extends object, I extends ArrayIndexablesOf<A>, L extends A[I] & Array<unknown>> implements Index<A> {
|
|
36
|
+
readonly index: I;
|
|
37
|
+
readonly name: `*${I}`;
|
|
38
|
+
readonly keyType: L[number];
|
|
39
|
+
readonly record: {
|
|
40
|
+
[K in `*${I}`]: this;
|
|
41
|
+
};
|
|
42
|
+
constructor(index: I);
|
|
43
|
+
extractKeys(value: A): L;
|
|
44
|
+
}
|
|
45
|
+
export declare class CompoundIndex<A extends object, I extends PrimitiveIndexablesOf<A>, J extends Exclude<PrimitiveIndexablesOf<A>, I>> implements Index<A>, UnitIndex<A> {
|
|
46
|
+
readonly leftIndex: I;
|
|
47
|
+
readonly rightIndex: J;
|
|
48
|
+
readonly name: `${I}&${J}`;
|
|
49
|
+
readonly keyType: [A[I], A[J]];
|
|
50
|
+
readonly record: {
|
|
51
|
+
[K in `${I}&${J}`]: this;
|
|
52
|
+
};
|
|
53
|
+
constructor(leftIndex: I, rightIndex: J);
|
|
54
|
+
extractKey(value: A): [A[I], A[J]];
|
|
55
|
+
extractKeys(value: A): Array<[A[I], A[J]]>;
|
|
56
|
+
}
|
package/dist/indices.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export class Index {
|
|
2
|
+
}
|
|
3
|
+
export class UnitIndex extends Index {
|
|
4
|
+
}
|
|
5
|
+
export class CustomIndex {
|
|
6
|
+
constructor(index, makeIndex) {
|
|
7
|
+
this.index = index;
|
|
8
|
+
this.makeIndex = makeIndex;
|
|
9
|
+
}
|
|
10
|
+
get name() {
|
|
11
|
+
return this.index;
|
|
12
|
+
}
|
|
13
|
+
extractKey(value) {
|
|
14
|
+
return value[this.index];
|
|
15
|
+
}
|
|
16
|
+
extractKeys(value) {
|
|
17
|
+
return [value[this.index]];
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export class PrimitiveIndex {
|
|
21
|
+
constructor(index) {
|
|
22
|
+
this.index = index;
|
|
23
|
+
}
|
|
24
|
+
get name() {
|
|
25
|
+
return this.index;
|
|
26
|
+
}
|
|
27
|
+
extractKey(value) {
|
|
28
|
+
return value[this.index];
|
|
29
|
+
}
|
|
30
|
+
extractKeys(value) {
|
|
31
|
+
return [value[this.index]];
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export class ArrayIndex {
|
|
35
|
+
constructor(index) {
|
|
36
|
+
this.index = index;
|
|
37
|
+
this.name = `*${index}`;
|
|
38
|
+
}
|
|
39
|
+
extractKeys(value) {
|
|
40
|
+
return value[this.index];
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export class CompoundIndex {
|
|
44
|
+
constructor(leftIndex, rightIndex) {
|
|
45
|
+
this.leftIndex = leftIndex;
|
|
46
|
+
this.rightIndex = rightIndex;
|
|
47
|
+
this.name = `${leftIndex}&${rightIndex}`;
|
|
48
|
+
}
|
|
49
|
+
extractKey(value) {
|
|
50
|
+
return [value[this.leftIndex], value[this.rightIndex]];
|
|
51
|
+
}
|
|
52
|
+
extractKeys(value) {
|
|
53
|
+
return [[value[this.leftIndex], value[this.rightIndex]]];
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=indices.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indices.js","sourceRoot":"","sources":["../src/indices.ts"],"names":[],"mappings":"AAIA,MAAM,OAAgB,KAAK;CAK1B;AAED,MAAM,OAAgB,SAA4B,SAAQ,KAAQ;CAEjE;AAED,MAAM,OAAO,WAAW;IAMpB,YACoB,KAAQ,EACR,SAAsC;QADtC,UAAK,GAAL,KAAK,CAAG;QACR,cAAS,GAAT,SAAS,CAA6B;IACvD,CAAC;IAEJ,IAAI,IAAI;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,UAAU,CAAC,KAAQ;QACf,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,WAAW,CAAC,KAAQ;QAChB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/B,CAAC;CACJ;AAED,MAAM,OAAO,cAAc;IAMvB,YAA4B,KAAQ;QAAR,UAAK,GAAL,KAAK,CAAG;IAAG,CAAC;IAExC,IAAI,IAAI;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,UAAU,CAAC,KAAQ;QACf,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,WAAW,CAAC,KAAQ;QAChB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/B,CAAC;CACJ;AAED,MAAM,OAAO,UAAU;IAWnB,YAAY,KAAQ;QAChB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,WAAW,CAAC,KAAQ;QAChB,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAM,CAAC;IAClC,CAAC;CACJ;AAED,MAAM,OAAO,aAAa;IAatB,YAAY,SAAY,EAAE,UAAa;QACnC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,GAAG,SAAS,IAAI,UAAU,EAAE,CAAC;IAC7C,CAAC;IAED,UAAU,CAAC,KAAQ;QACf,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,WAAW,CAAC,KAAQ;QAChB,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC;CACJ"}
|
package/dist/query.d.ts
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Option } from "@bodil/opt";
|
|
2
|
+
import { Signal } from "@bodil/signal";
|
|
3
|
+
import type { Index, UnitIndex } from "./indices";
|
|
4
|
+
import type { Table } from "./table";
|
|
5
|
+
export declare enum IteratorDirection {
|
|
6
|
+
Ascending = 0,
|
|
7
|
+
Descending = 1,
|
|
8
|
+
DescendingExclusive = 2
|
|
9
|
+
}
|
|
10
|
+
export declare abstract class Query<A extends object> implements Iterable<Readonly<A>> {
|
|
11
|
+
abstract [Symbol.iterator](): IterableIterator<Readonly<A>>;
|
|
12
|
+
abstract signal(): Signal.Computed<Array<Readonly<A>>>;
|
|
13
|
+
map<B>(mapFn: (item: Readonly<A>) => B): IterableIterator<B>;
|
|
14
|
+
forEach(action: (item: A) => void): void;
|
|
15
|
+
toArray(): Array<Readonly<A>>;
|
|
16
|
+
}
|
|
17
|
+
export declare abstract class TableQuery<A extends object, PI extends UnitIndex<A>, Ix extends object> extends Query<A> {
|
|
18
|
+
table: Table<A, PI, Ix>;
|
|
19
|
+
constructor(table: Table<A, PI, Ix>);
|
|
20
|
+
signal(): Signal.Computed<Array<Readonly<A>>>;
|
|
21
|
+
delete(): number;
|
|
22
|
+
filter(predicate: (item: Readonly<A>) => boolean): ChainQuery<A, PI, Ix>;
|
|
23
|
+
limit(count: number): ChainQuery<A, PI, Ix>;
|
|
24
|
+
}
|
|
25
|
+
export declare class IndexQuery<A extends object, PI extends UnitIndex<A>, I extends Index<A>, Ix extends object> extends TableQuery<A, PI, Ix> {
|
|
26
|
+
private readonly index;
|
|
27
|
+
private readonly indexTable?;
|
|
28
|
+
private readonly isPrimary;
|
|
29
|
+
private start?;
|
|
30
|
+
private direction;
|
|
31
|
+
constructor(table: Table<A, PI, Ix>, indexKey: keyof Ix & string, direction: IteratorDirection, start?: I["keyType"]);
|
|
32
|
+
[Symbol.iterator](): IterableIterator<Readonly<A>>;
|
|
33
|
+
reverse(): this;
|
|
34
|
+
equals(value: I["keyType"]): ArrayQuery<A, PI, Ix>;
|
|
35
|
+
below(value: I["keyType"]): this;
|
|
36
|
+
max(): Option<I["keyType"]>;
|
|
37
|
+
min(): Option<I["keyType"]>;
|
|
38
|
+
}
|
|
39
|
+
export declare class ChainQuery<A extends object, PI extends UnitIndex<A>, Ix extends object> extends TableQuery<A, PI, Ix> {
|
|
40
|
+
private readonly parent;
|
|
41
|
+
private readonly iterator;
|
|
42
|
+
constructor(table: Table<A, PI, Ix>, parent: Query<A>, iterator: (parentIterator: IterableIterator<Readonly<A>>) => IterableIterator<Readonly<A>>);
|
|
43
|
+
[Symbol.iterator](): IterableIterator<Readonly<A>>;
|
|
44
|
+
}
|
|
45
|
+
export declare class ArrayQuery<A extends object, PI extends UnitIndex<A>, Ix extends object> extends TableQuery<A, PI, Ix> {
|
|
46
|
+
private readonly values;
|
|
47
|
+
constructor(table: Table<A, PI, Ix>, values: Array<Readonly<A>>);
|
|
48
|
+
[Symbol.iterator](): IterableIterator<Readonly<A>>;
|
|
49
|
+
}
|
package/dist/query.js
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { assert } from "@bodil/core/assert";
|
|
2
|
+
import { Option } from "@bodil/opt";
|
|
3
|
+
import { Signal } from "@bodil/signal";
|
|
4
|
+
export var IteratorDirection;
|
|
5
|
+
(function (IteratorDirection) {
|
|
6
|
+
IteratorDirection[IteratorDirection["Ascending"] = 0] = "Ascending";
|
|
7
|
+
IteratorDirection[IteratorDirection["Descending"] = 1] = "Descending";
|
|
8
|
+
IteratorDirection[IteratorDirection["DescendingExclusive"] = 2] = "DescendingExclusive";
|
|
9
|
+
})(IteratorDirection || (IteratorDirection = {}));
|
|
10
|
+
function* indexIterator(table, direction, start) {
|
|
11
|
+
if (table.isEmpty) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
if (direction === IteratorDirection.Ascending) {
|
|
15
|
+
for (const items of table.values(start)) {
|
|
16
|
+
for (const item of items) {
|
|
17
|
+
yield item;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
for (const entry of table.entriesReversed(start, undefined, direction === IteratorDirection.DescendingExclusive)) {
|
|
23
|
+
for (const item of entry[1]) {
|
|
24
|
+
yield item;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function* primaryIndexIterator(table, direction, start) {
|
|
30
|
+
if (table.isEmpty) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
if (direction === IteratorDirection.Ascending) {
|
|
34
|
+
for (const item of table.values(start)) {
|
|
35
|
+
yield item;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
for (const entry of table.entriesReversed(start, undefined, direction === IteratorDirection.DescendingExclusive)) {
|
|
40
|
+
yield entry[1];
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export class Query {
|
|
45
|
+
map(mapFn) {
|
|
46
|
+
return Iterator.from(this).map(mapFn);
|
|
47
|
+
}
|
|
48
|
+
forEach(action) {
|
|
49
|
+
for (const item of this) {
|
|
50
|
+
action(item);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
toArray() {
|
|
54
|
+
return Array.from(this);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export class TableQuery extends Query {
|
|
58
|
+
constructor(table) {
|
|
59
|
+
super();
|
|
60
|
+
this.table = table;
|
|
61
|
+
}
|
|
62
|
+
signal() {
|
|
63
|
+
return Signal.computed(() => {
|
|
64
|
+
this.table.changed.get();
|
|
65
|
+
return Array.from(this);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
delete() {
|
|
69
|
+
return this.table.delete(...Array.from(this));
|
|
70
|
+
}
|
|
71
|
+
filter(predicate) {
|
|
72
|
+
return new ChainQuery(this.table, this, (iter) => Iterator.from(iter).filter(predicate));
|
|
73
|
+
}
|
|
74
|
+
limit(count) {
|
|
75
|
+
return new ChainQuery(this.table, this, (iter) => Iterator.from(iter).take(count));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
export class IndexQuery extends TableQuery {
|
|
79
|
+
constructor(table, indexKey, direction, start) {
|
|
80
|
+
super(table);
|
|
81
|
+
this.isPrimary = table.primaryIndex.name === indexKey;
|
|
82
|
+
if (this.isPrimary) {
|
|
83
|
+
this.index = table.primaryIndex;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
this.index = table.indices[indexKey];
|
|
87
|
+
assert(this.index !== undefined, `Undefined index "${indexKey}"`);
|
|
88
|
+
this.indexTable = table.indexTables[indexKey];
|
|
89
|
+
}
|
|
90
|
+
this.direction = direction;
|
|
91
|
+
this.start = start;
|
|
92
|
+
}
|
|
93
|
+
[Symbol.iterator]() {
|
|
94
|
+
return this.isPrimary
|
|
95
|
+
? primaryIndexIterator(this.table.primary, this.direction, this.start)
|
|
96
|
+
: indexIterator(this.indexTable, this.direction, this.start);
|
|
97
|
+
}
|
|
98
|
+
reverse() {
|
|
99
|
+
switch (this.direction) {
|
|
100
|
+
case IteratorDirection.Ascending:
|
|
101
|
+
this.direction = IteratorDirection.Descending;
|
|
102
|
+
return this;
|
|
103
|
+
case IteratorDirection.Descending:
|
|
104
|
+
this.direction = IteratorDirection.Ascending;
|
|
105
|
+
return this;
|
|
106
|
+
case IteratorDirection.DescendingExclusive:
|
|
107
|
+
throw new Error("not sure how to reverse IteratorDirection.DescendingExclusive");
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
equals(value) {
|
|
111
|
+
if (this.isPrimary) {
|
|
112
|
+
const item = this.table.get(value);
|
|
113
|
+
return new ArrayQuery(this.table, item === undefined ? [] : [item]);
|
|
114
|
+
}
|
|
115
|
+
return new ArrayQuery(this.table, this.indexTable.get(value) ?? []);
|
|
116
|
+
}
|
|
117
|
+
below(value) {
|
|
118
|
+
this.start = value;
|
|
119
|
+
this.direction = IteratorDirection.DescendingExclusive;
|
|
120
|
+
return this;
|
|
121
|
+
}
|
|
122
|
+
max() {
|
|
123
|
+
return Option.from(this.isPrimary ? this.table.primary.maxKey() : this.indexTable.maxKey());
|
|
124
|
+
}
|
|
125
|
+
min() {
|
|
126
|
+
return Option.from(this.isPrimary ? this.table.primary.minKey() : this.indexTable.minKey());
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
export class ChainQuery extends TableQuery {
|
|
130
|
+
constructor(table, parent, iterator) {
|
|
131
|
+
super(table);
|
|
132
|
+
this.parent = parent;
|
|
133
|
+
this.iterator = iterator;
|
|
134
|
+
}
|
|
135
|
+
[Symbol.iterator]() {
|
|
136
|
+
return this.iterator(this.parent[Symbol.iterator]());
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
export class ArrayQuery extends TableQuery {
|
|
140
|
+
constructor(table, values) {
|
|
141
|
+
super(table);
|
|
142
|
+
this.values = values;
|
|
143
|
+
}
|
|
144
|
+
[Symbol.iterator]() {
|
|
145
|
+
return this.values[Symbol.iterator]();
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
|
package/dist/serial.d.ts
ADDED
package/dist/serial.js
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
const primitives = new Set(["string", "number", "boolean", "undefined"]);
|
|
2
|
+
export function serialise(value) {
|
|
3
|
+
if (primitives.has(typeof value)) {
|
|
4
|
+
return { value: value };
|
|
5
|
+
}
|
|
6
|
+
else if (typeof value === "symbol") {
|
|
7
|
+
throw new TypeError(`don't know how to serialise a symbol: ${value.toString()}`);
|
|
8
|
+
}
|
|
9
|
+
else if (typeof value === "bigint") {
|
|
10
|
+
return { type: "bigint", value: value.toString() };
|
|
11
|
+
}
|
|
12
|
+
else if (value === null) {
|
|
13
|
+
return { type: "null" };
|
|
14
|
+
}
|
|
15
|
+
else if (Array.isArray(value)) {
|
|
16
|
+
return value.map(serialise);
|
|
17
|
+
}
|
|
18
|
+
else if (value instanceof Set) {
|
|
19
|
+
return { type: "set", value: value.keys().map(serialise).toArray() };
|
|
20
|
+
}
|
|
21
|
+
else if (value instanceof Map) {
|
|
22
|
+
return {
|
|
23
|
+
type: "map",
|
|
24
|
+
value: value
|
|
25
|
+
.entries()
|
|
26
|
+
.map(([k, v]) => [serialise(k), serialise(v)])
|
|
27
|
+
.toArray(),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
else if (value instanceof Temporal.Instant) {
|
|
31
|
+
return { type: "instant", value: value.toJSON() };
|
|
32
|
+
}
|
|
33
|
+
else if (value instanceof Temporal.Duration) {
|
|
34
|
+
return { type: "duration", value: value.toJSON() };
|
|
35
|
+
}
|
|
36
|
+
else if (value instanceof Temporal.PlainDate) {
|
|
37
|
+
return { type: "plaindate", value: value.toJSON() };
|
|
38
|
+
}
|
|
39
|
+
else if (value instanceof Temporal.ZonedDateTime) {
|
|
40
|
+
return { type: "zdt", value: value.toJSON() };
|
|
41
|
+
}
|
|
42
|
+
else if (value instanceof Date) {
|
|
43
|
+
throw new TypeError("serialise: Date objects are unsupported, please use Temporal.Instant instead");
|
|
44
|
+
}
|
|
45
|
+
else if (typeof value === "object") {
|
|
46
|
+
return {
|
|
47
|
+
type: "object",
|
|
48
|
+
value: Object.entries(value)
|
|
49
|
+
.filter(([k]) => typeof k !== "symbol")
|
|
50
|
+
.map(([k, v]) => [k, serialise(v)]),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
throw new TypeError(`serialise: don't know how to serialise this ${typeof value}: ${JSON.stringify(value)}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export function deserialise(record) {
|
|
58
|
+
if (Array.isArray(record)) {
|
|
59
|
+
return record.map(deserialise);
|
|
60
|
+
}
|
|
61
|
+
switch (record.type) {
|
|
62
|
+
case undefined:
|
|
63
|
+
return record.value;
|
|
64
|
+
case "null":
|
|
65
|
+
return null;
|
|
66
|
+
case "bigint":
|
|
67
|
+
return BigInt(record.value);
|
|
68
|
+
case "instant":
|
|
69
|
+
return Temporal.Instant.from(record.value);
|
|
70
|
+
case "duration":
|
|
71
|
+
return Temporal.Duration.from(record.value);
|
|
72
|
+
case "plaindate":
|
|
73
|
+
return Temporal.PlainDate.from(record.value);
|
|
74
|
+
case "zdt":
|
|
75
|
+
return Temporal.ZonedDateTime.from(record.value);
|
|
76
|
+
case "set":
|
|
77
|
+
return new Set(record.value.map(deserialise));
|
|
78
|
+
case "map":
|
|
79
|
+
return new Map(record.value.map(([k, v]) => [
|
|
80
|
+
deserialise(k),
|
|
81
|
+
deserialise(v),
|
|
82
|
+
]));
|
|
83
|
+
case "object":
|
|
84
|
+
return Object.fromEntries(record.value.map(([k, v]) => [
|
|
85
|
+
k,
|
|
86
|
+
deserialise(v),
|
|
87
|
+
]));
|
|
88
|
+
default:
|
|
89
|
+
throw new TypeError(`deserialise: can't deserialise type ${JSON.stringify(record.type)} value ${JSON.stringify(record.value)}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=serial.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serial.js","sourceRoot":"","sources":["../src/serial.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Emitter } from "@bodil/core/async";
|
|
2
|
+
import type { StorageBackend } from "./backend";
|
|
3
|
+
import type { UnitIndex } from "./indices";
|
|
4
|
+
import type { Table, TableEvent } from "./table";
|
|
5
|
+
export declare class TableStorage<A extends object, PI extends UnitIndex<A>> extends Emitter<TableEvent<A, PI["keyType"]>> implements Disposable {
|
|
6
|
+
#private;
|
|
7
|
+
store: StorageBackend;
|
|
8
|
+
name: string;
|
|
9
|
+
primaryKey: PI;
|
|
10
|
+
context: {
|
|
11
|
+
"__#private@#private": any;
|
|
12
|
+
dispose: () => void;
|
|
13
|
+
use(resource: null): null;
|
|
14
|
+
use(resource: undefined): undefined;
|
|
15
|
+
use(resource: import("@bodil/core/disposable").Disposifiable): Disposable;
|
|
16
|
+
use(resource: import("@bodil/core/disposable").Disposifiable | undefined): Disposable | undefined;
|
|
17
|
+
use(resource: import("@bodil/core/disposable").Disposifiable | null | undefined): Disposable | null | undefined;
|
|
18
|
+
adopt<A_1>(value: A_1, onDispose: (value: A_1) => void): A_1;
|
|
19
|
+
[Symbol.dispose](): void;
|
|
20
|
+
} | {
|
|
21
|
+
"__#private@#private": any;
|
|
22
|
+
dispose: () => void;
|
|
23
|
+
use(resource: null): null;
|
|
24
|
+
use(resource: undefined): undefined;
|
|
25
|
+
use(resource: import("@bodil/core/disposable").Disposifiable): Disposable;
|
|
26
|
+
use(resource: import("@bodil/core/disposable").Disposifiable | undefined): Disposable | undefined;
|
|
27
|
+
use(resource: import("@bodil/core/disposable").Disposifiable | null | undefined): Disposable | null | undefined;
|
|
28
|
+
adopt<A_1>(value: A_1, onDispose: (value: A_1) => void): A_1;
|
|
29
|
+
[Symbol.dispose](): void;
|
|
30
|
+
};
|
|
31
|
+
get ready(): Promise<void>;
|
|
32
|
+
constructor(store: StorageBackend, name: string, primaryKey: PI);
|
|
33
|
+
[Symbol.dispose](): void;
|
|
34
|
+
private onBroadcastMessage;
|
|
35
|
+
private readonly onTableEvent;
|
|
36
|
+
link<Ix extends object>(table: Table<A, PI, Ix>): Promise<void>;
|
|
37
|
+
private update;
|
|
38
|
+
private delete;
|
|
39
|
+
}
|
package/dist/storage.js
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { isNullish } from "@bodil/core/assert";
|
|
2
|
+
import { Emitter } from "@bodil/core/async";
|
|
3
|
+
import { DisposableContext } from "@bodil/core/disposable";
|
|
4
|
+
export class TableStorage extends Emitter {
|
|
5
|
+
#ready;
|
|
6
|
+
get ready() {
|
|
7
|
+
return this.#ready.promise;
|
|
8
|
+
}
|
|
9
|
+
constructor(store, name, primaryKey) {
|
|
10
|
+
super();
|
|
11
|
+
this.store = store;
|
|
12
|
+
this.name = name;
|
|
13
|
+
this.primaryKey = primaryKey;
|
|
14
|
+
this.#ready = Promise.withResolvers();
|
|
15
|
+
this.context = new DisposableContext();
|
|
16
|
+
this.onTableEvent = (event) => {
|
|
17
|
+
switch (event.type) {
|
|
18
|
+
case "update":
|
|
19
|
+
this.update(event.item);
|
|
20
|
+
break;
|
|
21
|
+
case "delete":
|
|
22
|
+
this.delete(event.key);
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
this.context.use(this.store.onBroadcast((message) => this.onBroadcastMessage(message)));
|
|
27
|
+
}
|
|
28
|
+
[Symbol.dispose]() {
|
|
29
|
+
super[Symbol.dispose]();
|
|
30
|
+
this.context.dispose();
|
|
31
|
+
}
|
|
32
|
+
onBroadcastMessage(message) {
|
|
33
|
+
if (message.table !== this.name) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
switch (message.event) {
|
|
37
|
+
case "update":
|
|
38
|
+
void this.store.get(this.name, message.key).then((row) => {
|
|
39
|
+
if (!isNullish(row)) {
|
|
40
|
+
this.emit({ type: "update", item: row });
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
break;
|
|
44
|
+
case "delete":
|
|
45
|
+
this.emit({ type: "delete", key: message.key });
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async link(table) {
|
|
50
|
+
let rows;
|
|
51
|
+
try {
|
|
52
|
+
rows = await this.store.getAll(this.name);
|
|
53
|
+
}
|
|
54
|
+
catch (e) {
|
|
55
|
+
this.#ready.reject(e);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
table.add(...rows);
|
|
59
|
+
this.context.use(table.on((event) => this.onTableEvent(event)));
|
|
60
|
+
this.#ready.resolve();
|
|
61
|
+
}
|
|
62
|
+
update(item) {
|
|
63
|
+
void this.store.update(this.name, this.primaryKey.extractKey(item), item);
|
|
64
|
+
}
|
|
65
|
+
delete(key) {
|
|
66
|
+
void this.store.delete(this.name, key);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
|
package/dist/table.d.ts
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { Emitter } from "@bodil/core/async";
|
|
2
|
+
import { Signal } from "@bodil/signal";
|
|
3
|
+
import { type Draft } from "immer";
|
|
4
|
+
import BTree from "sorted-btree";
|
|
5
|
+
import type { StorageBackend } from "./backend";
|
|
6
|
+
import { type Index, type UnitIndex } from "./indices";
|
|
7
|
+
import { IndexQuery } from "./query";
|
|
8
|
+
export type TableObserveOptions = {
|
|
9
|
+
includeCurrent: boolean;
|
|
10
|
+
};
|
|
11
|
+
export type TableEvent<A extends object, PK> = {
|
|
12
|
+
type: "update";
|
|
13
|
+
item: A;
|
|
14
|
+
} | {
|
|
15
|
+
type: "delete";
|
|
16
|
+
key: PK;
|
|
17
|
+
};
|
|
18
|
+
export declare class Table<A extends object, PI extends UnitIndex<A>, Ix extends object> extends Emitter<TableEvent<A, PI["keyType"]>> implements Disposable, Iterable<Readonly<A>> {
|
|
19
|
+
#private;
|
|
20
|
+
ready: Promise<void>;
|
|
21
|
+
readonly primaryIndex: PI;
|
|
22
|
+
readonly primary: BTree<PI["keyType"], Readonly<A>>;
|
|
23
|
+
readonly indices: {
|
|
24
|
+
[K in Exclude<keyof Ix & string, PI["name"]>]: Index<A>;
|
|
25
|
+
};
|
|
26
|
+
readonly indexTables: {
|
|
27
|
+
[K in Exclude<keyof Ix & string, PI["name"]>]: BTree<Ix[K], Array<A>>;
|
|
28
|
+
};
|
|
29
|
+
readonly changed: Signal.State<number>;
|
|
30
|
+
constructor(primaryIndex: PI);
|
|
31
|
+
[Symbol.dispose](): void;
|
|
32
|
+
withIndex<I extends Index<A>>(index: I): Table<A, PI, {
|
|
33
|
+
[K in keyof (Ix & I["record"])]: (Ix & I["record"])[K];
|
|
34
|
+
}>;
|
|
35
|
+
withStorage(backend: StorageBackend, name: string): this;
|
|
36
|
+
signal(primaryKey: PI["keyType"]): Signal.Computed<Readonly<A> | undefined>;
|
|
37
|
+
get(primaryKey: PI["keyType"]): Readonly<A> | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* Given a primary key, apply an update function to the value stored under
|
|
40
|
+
* that key. If there's no value, call the create function to create the
|
|
41
|
+
* value before passing it to the update function.
|
|
42
|
+
*/
|
|
43
|
+
createAndUpdate(primaryKey: PI["keyType"], create: () => A, update: (item: Draft<A>) => Draft<A> | void): Readonly<A>;
|
|
44
|
+
/**
|
|
45
|
+
* Given a primary key, apply an update function to the value stored under
|
|
46
|
+
* that key. If there's no value, call the create function to create a new
|
|
47
|
+
* value. In this case, the update function is not called.
|
|
48
|
+
*/
|
|
49
|
+
createOrUpdate(primaryKey: PI["keyType"], create: () => A, update: (item: Draft<A>) => Draft<A> | void): Readonly<A>;
|
|
50
|
+
/**
|
|
51
|
+
* Apply an update function to the value stored under the given primary key.
|
|
52
|
+
* If no value exists, the update function is not called and `undefined` is
|
|
53
|
+
* returned. Otherwise, the updated value is returned.
|
|
54
|
+
*/
|
|
55
|
+
update(primaryKey: PI["keyType"], update: (item: Draft<A>) => void | Draft<A>): Readonly<A> | undefined;
|
|
56
|
+
/**
|
|
57
|
+
* Add items to the table, overwriting any previous values under their
|
|
58
|
+
* primary keys.
|
|
59
|
+
*/
|
|
60
|
+
add(...items: Array<A>): void;
|
|
61
|
+
add(items: Iterable<A>): void;
|
|
62
|
+
/**
|
|
63
|
+
* Delete items from the table by their primary keys.
|
|
64
|
+
*/
|
|
65
|
+
delete(...primaryKeys: Array<PI["keyType"]>): number;
|
|
66
|
+
delete(primaryKeys: Iterable<PI["keyType"]>): number;
|
|
67
|
+
/**
|
|
68
|
+
* Delete all data from the table.
|
|
69
|
+
*/
|
|
70
|
+
clear(): void;
|
|
71
|
+
[Symbol.iterator](): IterableIterator<Readonly<A>>;
|
|
72
|
+
where<K extends keyof Ix & string, I extends Index<A> & Ix[K]>(index: K): IndexQuery<A, PI, I, Ix>;
|
|
73
|
+
orderBy<K extends keyof Ix & string, I extends Index<A> & Ix[K]>(index: K): IndexQuery<A, PI, I, Ix>;
|
|
74
|
+
size(): number;
|
|
75
|
+
}
|