@welshman/store 0.14.0-pre4 → 0.14.0-pre5
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/dist/store/src/{repository.d.ts → derive.d.ts} +33 -41
- package/dist/store/src/derive.d.ts.map +1 -0
- package/dist/store/src/derive.js +706 -0
- package/dist/store/src/derive.js.map +1 -0
- package/dist/store/src/index.d.ts +9 -1
- package/dist/store/src/index.d.ts.map +1 -1
- package/dist/store/src/index.js +9 -1
- package/dist/store/src/index.js.map +1 -1
- package/dist/store/src/misc.d.ts +2 -7
- package/dist/store/src/misc.d.ts.map +1 -1
- package/dist/store/src/misc.js +1 -1
- package/dist/store/src/misc.js.map +1 -1
- package/dist/{net/src/repository.d.ts → store/src/repository/adapters/memory.d.ts} +22 -30
- package/dist/store/src/repository/adapters/memory.d.ts.map +1 -0
- package/dist/{net/src/repository.js → store/src/repository/adapters/memory.js} +96 -106
- package/dist/store/src/repository/adapters/memory.js.map +1 -0
- package/dist/store/src/repository/adapters/sqlite/engine.d.ts +65 -0
- package/dist/store/src/repository/adapters/sqlite/engine.d.ts.map +1 -0
- package/dist/store/src/repository/adapters/sqlite/engine.js +420 -0
- package/dist/store/src/repository/adapters/sqlite/engine.js.map +1 -0
- package/dist/store/src/repository/adapters/sqlite/leader.d.ts +8 -0
- package/dist/store/src/repository/adapters/sqlite/leader.d.ts.map +1 -0
- package/dist/store/src/repository/adapters/sqlite/leader.js +222 -0
- package/dist/store/src/repository/adapters/sqlite/leader.js.map +1 -0
- package/dist/store/src/repository/adapters/sqlite/protocol.d.ts +52 -0
- package/dist/store/src/repository/adapters/sqlite/protocol.d.ts.map +1 -0
- package/dist/store/src/repository/adapters/sqlite/protocol.js +52 -0
- package/dist/store/src/repository/adapters/sqlite/protocol.js.map +1 -0
- package/dist/store/src/repository/adapters/sqlite/repository.d.ts +54 -0
- package/dist/store/src/repository/adapters/sqlite/repository.d.ts.map +1 -0
- package/dist/store/src/repository/adapters/sqlite/repository.js +238 -0
- package/dist/store/src/repository/adapters/sqlite/repository.js.map +1 -0
- package/dist/store/src/repository/adapters/sqlite/serve.d.ts +4 -0
- package/dist/store/src/repository/adapters/sqlite/serve.d.ts.map +1 -0
- package/dist/store/src/repository/adapters/sqlite/serve.js +39 -0
- package/dist/store/src/repository/adapters/sqlite/serve.js.map +1 -0
- package/dist/store/src/repository/adapters/sqlite/wasm.d.ts +7 -0
- package/dist/store/src/repository/adapters/sqlite/wasm.d.ts.map +1 -0
- package/dist/store/src/repository/adapters/sqlite/wasm.js +61 -0
- package/dist/store/src/repository/adapters/sqlite/wasm.js.map +1 -0
- package/dist/store/src/repository/adapters/sqlite/worker.d.ts +2 -0
- package/dist/store/src/repository/adapters/sqlite/worker.d.ts.map +1 -0
- package/dist/store/src/repository/adapters/sqlite/worker.js +4 -0
- package/dist/store/src/repository/adapters/sqlite/worker.js.map +1 -0
- package/dist/store/src/repository/core.d.ts +68 -0
- package/dist/store/src/repository/core.d.ts.map +1 -0
- package/dist/store/src/repository/core.js +123 -0
- package/dist/store/src/repository/core.js.map +1 -0
- package/dist/store/src/svelte.d.ts +22 -0
- package/dist/store/src/svelte.d.ts.map +1 -0
- package/dist/store/src/svelte.js +100 -0
- package/dist/store/src/svelte.js.map +1 -0
- package/dist/store/src/synced.d.ts +1 -1
- package/dist/store/src/synced.d.ts.map +1 -1
- package/dist/store/src/synced.js +1 -1
- package/dist/store/src/synced.js.map +1 -1
- package/dist/store/src/throttle.d.ts +1 -1
- package/dist/store/src/throttle.d.ts.map +1 -1
- package/dist/{net → store}/src/tracker.d.ts +2 -0
- package/dist/store/src/tracker.d.ts.map +1 -0
- package/dist/{net → store}/src/tracker.js +8 -4
- package/dist/store/src/tracker.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/util/src/Command.d.ts +1 -1
- package/dist/util/src/Command.d.ts.map +1 -1
- package/dist/util/src/Command.js +12 -5
- package/dist/util/src/Command.js.map +1 -1
- package/dist/util/src/Events.d.ts +3 -2
- package/dist/util/src/Events.d.ts.map +1 -1
- package/dist/util/src/Events.js.map +1 -1
- package/dist/util/src/Kinds.d.ts +1 -0
- package/dist/util/src/Kinds.d.ts.map +1 -1
- package/dist/util/src/Kinds.js +1 -0
- package/dist/util/src/Kinds.js.map +1 -1
- package/dist/util/src/RelaySelection.d.ts +5 -0
- package/dist/util/src/RelaySelection.d.ts.map +1 -1
- package/dist/util/src/RelaySelection.js.map +1 -1
- package/dist/util/src/Tags.d.ts +5 -0
- package/dist/util/src/Tags.d.ts.map +1 -1
- package/dist/util/src/Tags.js +3 -0
- package/dist/util/src/Tags.js.map +1 -1
- package/dist/util/src/index.d.ts +1 -0
- package/dist/util/src/index.d.ts.map +1 -1
- package/dist/util/src/index.js +1 -0
- package/dist/util/src/index.js.map +1 -1
- package/package.json +31 -12
- package/dist/net/src/adapter.d.ts +0 -47
- package/dist/net/src/adapter.d.ts.map +0 -1
- package/dist/net/src/adapter.js +0 -139
- package/dist/net/src/adapter.js.map +0 -1
- package/dist/net/src/auth.d.ts +0 -40
- package/dist/net/src/auth.d.ts.map +0 -1
- package/dist/net/src/auth.js +0 -131
- package/dist/net/src/auth.js.map +0 -1
- package/dist/net/src/context.d.ts +0 -10
- package/dist/net/src/context.d.ts.map +0 -1
- package/dist/net/src/context.js +0 -2
- package/dist/net/src/context.js.map +0 -1
- package/dist/net/src/count.d.ts +0 -30
- package/dist/net/src/count.d.ts.map +0 -1
- package/dist/net/src/count.js +0 -97
- package/dist/net/src/count.js.map +0 -1
- package/dist/net/src/diff.d.ts +0 -57
- package/dist/net/src/diff.d.ts.map +0 -1
- package/dist/net/src/diff.js +0 -169
- package/dist/net/src/diff.js.map +0 -1
- package/dist/net/src/index.d.ts +0 -17
- package/dist/net/src/index.d.ts.map +0 -1
- package/dist/net/src/index.js +0 -17
- package/dist/net/src/index.js.map +0 -1
- package/dist/net/src/message.d.ts +0 -106
- package/dist/net/src/message.d.ts.map +0 -1
- package/dist/net/src/message.js +0 -98
- package/dist/net/src/message.js.map +0 -1
- package/dist/net/src/multiplex.d.ts +0 -14
- package/dist/net/src/multiplex.d.ts.map +0 -1
- package/dist/net/src/multiplex.js +0 -219
- package/dist/net/src/multiplex.js.map +0 -1
- package/dist/net/src/negentropy.d.ts +0 -48
- package/dist/net/src/negentropy.d.ts.map +0 -1
- package/dist/net/src/negentropy.js +0 -528
- package/dist/net/src/negentropy.js.map +0 -1
- package/dist/net/src/policy.d.ts +0 -63
- package/dist/net/src/policy.d.ts.map +0 -1
- package/dist/net/src/policy.js +0 -388
- package/dist/net/src/policy.js.map +0 -1
- package/dist/net/src/pool.d.ts +0 -15
- package/dist/net/src/pool.d.ts.map +0 -1
- package/dist/net/src/pool.js +0 -51
- package/dist/net/src/pool.js.map +0 -1
- package/dist/net/src/publish.d.ts +0 -47
- package/dist/net/src/publish.d.ts.map +0 -1
- package/dist/net/src/publish.js +0 -112
- package/dist/net/src/publish.js.map +0 -1
- package/dist/net/src/repository.d.ts.map +0 -1
- package/dist/net/src/repository.js.map +0 -1
- package/dist/net/src/request.d.ts +0 -38
- package/dist/net/src/request.d.ts.map +0 -1
- package/dist/net/src/request.js +0 -220
- package/dist/net/src/request.js.map +0 -1
- package/dist/net/src/socket.d.ts +0 -52
- package/dist/net/src/socket.d.ts.map +0 -1
- package/dist/net/src/socket.js +0 -134
- package/dist/net/src/socket.js.map +0 -1
- package/dist/net/src/tracker.d.ts.map +0 -1
- package/dist/net/src/tracker.js.map +0 -1
- package/dist/net/src/util.d.ts +0 -18
- package/dist/net/src/util.d.ts.map +0 -1
- package/dist/net/src/util.js +0 -25
- package/dist/net/src/util.js.map +0 -1
- package/dist/net/src/wrapManager.d.ts +0 -34
- package/dist/net/src/wrapManager.d.ts.map +0 -1
- package/dist/net/src/wrapManager.js +0 -79
- package/dist/net/src/wrapManager.js.map +0 -1
- package/dist/store/src/repository.d.ts.map +0 -1
- package/dist/store/src/repository.js +0 -580
- package/dist/store/src/repository.js.map +0 -1
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { Filter, TrustedEvent } from "@welshman/util";
|
|
2
|
+
import type { DeleteRecord, QueryOptions } from "../../core.js";
|
|
3
|
+
export type SqlValue = string | number | null | Uint8Array;
|
|
4
|
+
/** The synchronous slice of a SQLite connection the engine needs, so any binding can back it. */
|
|
5
|
+
export interface SqliteDatabase {
|
|
6
|
+
exec(sql: string): void;
|
|
7
|
+
run(sql: string, params?: SqlValue[]): void;
|
|
8
|
+
all<T>(sql: string, params?: SqlValue[]): T[];
|
|
9
|
+
/** Define a deterministic SQL function of one argument on this connection. */
|
|
10
|
+
define(name: string, f: (value: SqlValue) => SqlValue): void;
|
|
11
|
+
}
|
|
12
|
+
/** One step of a write batch. A publish carries whether its signature was checked. */
|
|
13
|
+
export type WriteOp = ["publish", TrustedEvent, boolean] | ["remove", string] | ["track", string, string] | ["untrack", string, string];
|
|
14
|
+
/** An event as stored, and whether its signature was checked before it was. */
|
|
15
|
+
export type StoredEvent = {
|
|
16
|
+
json: string;
|
|
17
|
+
verified: boolean;
|
|
18
|
+
};
|
|
19
|
+
/** A change to the deletes, which a client mirroring `DeleteIndex` applies in order. */
|
|
20
|
+
export type DeleteChange = ["add", string, DeleteRecord] | ["withdraw", string];
|
|
21
|
+
/** What a batch changed, with `restored` carrying the events the caller didn't pass in. */
|
|
22
|
+
export type WriteResult = {
|
|
23
|
+
added: string[];
|
|
24
|
+
restored: StoredEvent[];
|
|
25
|
+
relays: [string, string[]][];
|
|
26
|
+
removed: string[];
|
|
27
|
+
deletes: DeleteChange[];
|
|
28
|
+
};
|
|
29
|
+
/** Events as stored, with every relay each was seen on. */
|
|
30
|
+
export type QueryResult = {
|
|
31
|
+
events: StoredEvent[];
|
|
32
|
+
relays: [string, string[]][];
|
|
33
|
+
};
|
|
34
|
+
/** The repository's semantics in SQL, answering every query as `MemoryRepository` does. */
|
|
35
|
+
export declare class SqliteEngine {
|
|
36
|
+
readonly db: SqliteDatabase;
|
|
37
|
+
constructor(db: SqliteDatabase);
|
|
38
|
+
migrate: () => void;
|
|
39
|
+
query: (filters: Filter[], options?: QueryOptions) => QueryResult;
|
|
40
|
+
count: (filters: Filter[], options?: QueryOptions) => number;
|
|
41
|
+
countTags: (name: string) => [string, number][];
|
|
42
|
+
getEvent: (idOrAddress: string) => QueryResult;
|
|
43
|
+
getDeletes: () => [string, DeleteRecord][];
|
|
44
|
+
write: (ops: WriteOp[]) => WriteResult;
|
|
45
|
+
/** Drop every event matching `filters` outright, with nothing restored in its place. */
|
|
46
|
+
evict: (filters: Filter[]) => WriteResult;
|
|
47
|
+
/** Drop what has expired and provenance left without an event, which only grow otherwise. */
|
|
48
|
+
prune: () => WriteResult;
|
|
49
|
+
clear: () => void;
|
|
50
|
+
private transaction;
|
|
51
|
+
private batch;
|
|
52
|
+
private selectFilter;
|
|
53
|
+
private getRelays;
|
|
54
|
+
private getRow;
|
|
55
|
+
private isVisible;
|
|
56
|
+
private isDeleted;
|
|
57
|
+
private addDelete;
|
|
58
|
+
private drop;
|
|
59
|
+
private evictEvent;
|
|
60
|
+
private hiddenBy;
|
|
61
|
+
private uncover;
|
|
62
|
+
private publish;
|
|
63
|
+
private remove;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../../../../src/repository/adapters/sqlite/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
import { equals, now, pushToMapKey } from "@welshman/lib";
|
|
2
|
+
import { DELETE, compareEventsDesc, getAddress, getExpiration, isReplaceable } from "@welshman/util";
|
|
3
|
+
const SCHEMA = `
|
|
4
|
+
CREATE TABLE IF NOT EXISTS events (
|
|
5
|
+
id TEXT PRIMARY KEY,
|
|
6
|
+
pubkey TEXT NOT NULL,
|
|
7
|
+
kind INTEGER NOT NULL,
|
|
8
|
+
created_at INTEGER NOT NULL,
|
|
9
|
+
address TEXT,
|
|
10
|
+
current INTEGER NOT NULL,
|
|
11
|
+
replaced TEXT,
|
|
12
|
+
expires_at INTEGER,
|
|
13
|
+
verified INTEGER NOT NULL,
|
|
14
|
+
json TEXT NOT NULL
|
|
15
|
+
);
|
|
16
|
+
CREATE INDEX IF NOT EXISTS events_created_at ON events (created_at, id);
|
|
17
|
+
CREATE INDEX IF NOT EXISTS events_kind ON events (kind, created_at);
|
|
18
|
+
CREATE INDEX IF NOT EXISTS events_pubkey ON events (pubkey, kind, created_at);
|
|
19
|
+
CREATE INDEX IF NOT EXISTS events_address ON events (address, current);
|
|
20
|
+
CREATE INDEX IF NOT EXISTS events_expires_at ON events (expires_at) WHERE expires_at IS NOT NULL;
|
|
21
|
+
CREATE TABLE IF NOT EXISTS tags (
|
|
22
|
+
event_id TEXT NOT NULL,
|
|
23
|
+
name TEXT NOT NULL,
|
|
24
|
+
value TEXT NOT NULL,
|
|
25
|
+
created_at INTEGER NOT NULL
|
|
26
|
+
);
|
|
27
|
+
CREATE INDEX IF NOT EXISTS tags_value ON tags (name, value, created_at);
|
|
28
|
+
CREATE INDEX IF NOT EXISTS tags_event_id ON tags (event_id);
|
|
29
|
+
CREATE TABLE IF NOT EXISTS deletes (
|
|
30
|
+
key TEXT NOT NULL,
|
|
31
|
+
id TEXT NOT NULL,
|
|
32
|
+
pubkey TEXT NOT NULL,
|
|
33
|
+
created_at INTEGER NOT NULL
|
|
34
|
+
);
|
|
35
|
+
CREATE INDEX IF NOT EXISTS deletes_key ON deletes (key);
|
|
36
|
+
CREATE INDEX IF NOT EXISTS deletes_id ON deletes (id);
|
|
37
|
+
CREATE TABLE IF NOT EXISTS relays (
|
|
38
|
+
event_id TEXT NOT NULL,
|
|
39
|
+
url TEXT NOT NULL,
|
|
40
|
+
PRIMARY KEY (event_id, url)
|
|
41
|
+
) WITHOUT ROWID;
|
|
42
|
+
CREATE INDEX IF NOT EXISTS relays_url ON relays (url, event_id);
|
|
43
|
+
`;
|
|
44
|
+
// Lists bind as one json parameter, so a statement's text depends only on the filter's shape
|
|
45
|
+
const json = (values) => JSON.stringify(values);
|
|
46
|
+
const IN = "(SELECT value FROM json_each(?))";
|
|
47
|
+
const NOT_DELETED = `
|
|
48
|
+
NOT EXISTS (SELECT 1 FROM deletes d WHERE d.key = e.id AND d.pubkey = e.pubkey)
|
|
49
|
+
AND NOT EXISTS (
|
|
50
|
+
SELECT 1 FROM deletes d WHERE d.key = e.address AND d.pubkey = e.pubkey AND d.created_at > e.created_at
|
|
51
|
+
)`;
|
|
52
|
+
const NOT_EXPIRED = "(e.expires_at IS NULL OR e.expires_at >= ?)";
|
|
53
|
+
const VISIBLE = `e.current = 1 AND ${NOT_DELETED} AND ${NOT_EXPIRED}`;
|
|
54
|
+
// The same event can come back serialized with its keys in another order
|
|
55
|
+
const isSameJson = (a, b) => a === b || equals(JSON.parse(a), JSON.parse(b));
|
|
56
|
+
const toStored = (row) => ({
|
|
57
|
+
json: row.json,
|
|
58
|
+
verified: row.verified === 1,
|
|
59
|
+
});
|
|
60
|
+
/** What a batch has changed so far, with a later change to an event overriding an earlier one. */
|
|
61
|
+
class BatchChanges {
|
|
62
|
+
// Each event added, with what's stored for it when the caller didn't hand it in
|
|
63
|
+
added = new Map();
|
|
64
|
+
removed = new Set();
|
|
65
|
+
deletes = [];
|
|
66
|
+
add = (id, restored) => {
|
|
67
|
+
this.added.set(id, restored);
|
|
68
|
+
this.removed.delete(id);
|
|
69
|
+
};
|
|
70
|
+
remove = (id) => {
|
|
71
|
+
this.removed.add(id);
|
|
72
|
+
this.added.delete(id);
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/** The repository's semantics in SQL, answering every query as `MemoryRepository` does. */
|
|
76
|
+
export class SqliteEngine {
|
|
77
|
+
db;
|
|
78
|
+
constructor(db) {
|
|
79
|
+
this.db = db;
|
|
80
|
+
// SQLite's lower() folds only ASCII, so search lowers content the way matchFilter does
|
|
81
|
+
db.define("unicode_lower", value => (typeof value === "string" ? value.toLowerCase() : value));
|
|
82
|
+
}
|
|
83
|
+
migrate = () => this.db.exec(SCHEMA);
|
|
84
|
+
// Reads
|
|
85
|
+
query = (filters, options = {}) => {
|
|
86
|
+
const rows = new Map();
|
|
87
|
+
for (const filter of filters) {
|
|
88
|
+
for (const row of this.selectFilter(filter, options, "e.id, e.created_at, e.verified, e.json")) {
|
|
89
|
+
rows.set(row.id, row);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const sorted = Array.from(rows.values()).sort(compareEventsDesc);
|
|
93
|
+
return {
|
|
94
|
+
events: sorted.map(toStored),
|
|
95
|
+
relays: this.getRelays(sorted.map(row => row.id)),
|
|
96
|
+
};
|
|
97
|
+
};
|
|
98
|
+
count = (filters, options = {}) => {
|
|
99
|
+
const ids = new Set();
|
|
100
|
+
for (const filter of filters) {
|
|
101
|
+
for (const row of this.selectFilter(filter, options, "e.id")) {
|
|
102
|
+
ids.add(row.id);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return ids.size;
|
|
106
|
+
};
|
|
107
|
+
countTags = (name) => this.db
|
|
108
|
+
.all(`SELECT t.value, COUNT(DISTINCT t.event_id) AS count FROM tags t
|
|
109
|
+
JOIN events e ON e.id = t.event_id
|
|
110
|
+
WHERE t.name = ? AND ${VISIBLE}
|
|
111
|
+
GROUP BY t.value`, [name, now()])
|
|
112
|
+
.map(({ value, count }) => [value, count]);
|
|
113
|
+
getEvent = (idOrAddress) => {
|
|
114
|
+
const row = this.getRow(idOrAddress);
|
|
115
|
+
return row
|
|
116
|
+
? { events: [toStored(row)], relays: this.getRelays([row.id]) }
|
|
117
|
+
: { events: [], relays: [] };
|
|
118
|
+
};
|
|
119
|
+
getDeletes = () => this.db
|
|
120
|
+
.all("SELECT key, id, pubkey, created_at FROM deletes")
|
|
121
|
+
.map(({ key, ...record }) => [key, record]);
|
|
122
|
+
// Writes
|
|
123
|
+
write = (ops) => this.batch(changes => {
|
|
124
|
+
for (const op of ops) {
|
|
125
|
+
switch (op[0]) {
|
|
126
|
+
case "publish":
|
|
127
|
+
this.publish(op[1], op[2], changes);
|
|
128
|
+
break;
|
|
129
|
+
case "remove":
|
|
130
|
+
this.remove(op[1], changes);
|
|
131
|
+
break;
|
|
132
|
+
case "track":
|
|
133
|
+
this.db.run("INSERT OR IGNORE INTO relays (event_id, url) VALUES (?, ?)", [
|
|
134
|
+
op[1],
|
|
135
|
+
op[2],
|
|
136
|
+
]);
|
|
137
|
+
break;
|
|
138
|
+
case "untrack":
|
|
139
|
+
this.db.run("DELETE FROM relays WHERE event_id = ? AND url = ?", [op[1], op[2]]);
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
/** Drop every event matching `filters` outright, with nothing restored in its place. */
|
|
145
|
+
evict = (filters) => this.batch(changes => {
|
|
146
|
+
const options = { includeDeleted: true, includeExpired: true };
|
|
147
|
+
for (const filter of filters) {
|
|
148
|
+
for (const { id } of this.selectFilter(filter, options, "e.id", true)) {
|
|
149
|
+
this.evictEvent(id, changes);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
/** Drop what has expired and provenance left without an event, which only grow otherwise. */
|
|
154
|
+
prune = () => this.batch(changes => {
|
|
155
|
+
const expired = this.db.all("SELECT id FROM events WHERE expires_at IS NOT NULL AND expires_at < ?", [now()]);
|
|
156
|
+
for (const { id } of expired) {
|
|
157
|
+
this.evictEvent(id, changes);
|
|
158
|
+
}
|
|
159
|
+
this.db.run("DELETE FROM relays WHERE event_id NOT IN (SELECT id FROM events)");
|
|
160
|
+
});
|
|
161
|
+
clear = () => this.transaction(() => {
|
|
162
|
+
for (const table of ["events", "tags", "deletes", "relays"]) {
|
|
163
|
+
this.db.run(`DELETE FROM ${table}`);
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
// Utilities
|
|
167
|
+
transaction = (f) => {
|
|
168
|
+
this.db.exec("BEGIN");
|
|
169
|
+
try {
|
|
170
|
+
f();
|
|
171
|
+
this.db.exec("COMMIT");
|
|
172
|
+
}
|
|
173
|
+
catch (e) {
|
|
174
|
+
this.db.exec("ROLLBACK");
|
|
175
|
+
throw e;
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
// Run `f` in a transaction, reporting anything added but hidden by the end of it as removed
|
|
179
|
+
batch = (f) => {
|
|
180
|
+
const changes = new BatchChanges();
|
|
181
|
+
this.transaction(() => {
|
|
182
|
+
f(changes);
|
|
183
|
+
for (const id of Array.from(changes.added.keys())) {
|
|
184
|
+
if (!this.isVisible(id)) {
|
|
185
|
+
changes.remove(id);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
const result = {
|
|
190
|
+
added: [],
|
|
191
|
+
restored: [],
|
|
192
|
+
relays: this.getRelays(Array.from(changes.added.keys())),
|
|
193
|
+
removed: Array.from(changes.removed),
|
|
194
|
+
deletes: changes.deletes,
|
|
195
|
+
};
|
|
196
|
+
for (const [id, restored] of changes.added) {
|
|
197
|
+
if (restored) {
|
|
198
|
+
result.restored.push(restored);
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
result.added.push(id);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return result;
|
|
205
|
+
};
|
|
206
|
+
selectFilter = (filter, { includeDeleted, includeExpired, relay }, columns,
|
|
207
|
+
// Evicting reaches superseded versions too, and isn't paged
|
|
208
|
+
evicting = false) => {
|
|
209
|
+
const where = [];
|
|
210
|
+
const params = [];
|
|
211
|
+
// A superseded version is only reachable by id, as in MemoryRepository's indexes
|
|
212
|
+
if (filter.ids) {
|
|
213
|
+
where.push(`e.id IN ${IN}`);
|
|
214
|
+
params.push(json(filter.ids));
|
|
215
|
+
}
|
|
216
|
+
else if (!evicting) {
|
|
217
|
+
where.push("e.current = 1");
|
|
218
|
+
}
|
|
219
|
+
if (filter.authors) {
|
|
220
|
+
where.push(`e.pubkey IN ${IN}`);
|
|
221
|
+
params.push(json(filter.authors));
|
|
222
|
+
}
|
|
223
|
+
if (filter.kinds) {
|
|
224
|
+
where.push(`e.kind IN ${IN}`);
|
|
225
|
+
params.push(json(filter.kinds));
|
|
226
|
+
}
|
|
227
|
+
if (filter.since !== undefined) {
|
|
228
|
+
where.push("e.created_at >= ?");
|
|
229
|
+
params.push(filter.since);
|
|
230
|
+
}
|
|
231
|
+
if (filter.until !== undefined) {
|
|
232
|
+
where.push("e.created_at <= ?");
|
|
233
|
+
params.push(filter.until);
|
|
234
|
+
}
|
|
235
|
+
for (const [key, values] of Object.entries(filter)) {
|
|
236
|
+
if (key.startsWith("#") && key.length === 2 && Array.isArray(values)) {
|
|
237
|
+
where.push(`e.id IN (SELECT event_id FROM tags WHERE name = ? AND value IN ${IN})`);
|
|
238
|
+
params.push(key[1], json(values));
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// As in matchFilter, only the first term counts
|
|
242
|
+
if (filter.search) {
|
|
243
|
+
where.push("instr(unicode_lower(json_extract(e.json, '$.content')), ?) > 0");
|
|
244
|
+
params.push(filter.search.toLowerCase().split(/\s+/g)[0]);
|
|
245
|
+
}
|
|
246
|
+
if (!includeDeleted) {
|
|
247
|
+
where.push(NOT_DELETED);
|
|
248
|
+
}
|
|
249
|
+
if (!includeExpired) {
|
|
250
|
+
where.push(NOT_EXPIRED);
|
|
251
|
+
params.push(now());
|
|
252
|
+
}
|
|
253
|
+
if (relay) {
|
|
254
|
+
where.push("EXISTS (SELECT 1 FROM relays r WHERE r.event_id = e.id AND r.url = ?)");
|
|
255
|
+
params.push(relay);
|
|
256
|
+
}
|
|
257
|
+
let sql = `SELECT ${columns} FROM events e WHERE ${where.join(" AND ") || "1"}`;
|
|
258
|
+
sql += " ORDER BY e.created_at DESC, e.id DESC";
|
|
259
|
+
if (!evicting && filter.limit !== undefined) {
|
|
260
|
+
sql += " LIMIT ?";
|
|
261
|
+
params.push(filter.limit);
|
|
262
|
+
}
|
|
263
|
+
return this.db.all(sql, params);
|
|
264
|
+
};
|
|
265
|
+
getRelays = (ids) => {
|
|
266
|
+
const relaysById = new Map();
|
|
267
|
+
if (ids.length > 0) {
|
|
268
|
+
const rows = this.db.all(`SELECT event_id, url FROM relays WHERE event_id IN ${IN}`, [json(ids)]);
|
|
269
|
+
for (const { event_id, url } of rows) {
|
|
270
|
+
pushToMapKey(relaysById, event_id, url);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return Array.from(relaysById.entries());
|
|
274
|
+
};
|
|
275
|
+
getRow = (idOrAddress) => {
|
|
276
|
+
const [row] = idOrAddress.includes(":")
|
|
277
|
+
? this.db.all("SELECT * FROM events WHERE address = ? AND current = 1", [
|
|
278
|
+
idOrAddress,
|
|
279
|
+
])
|
|
280
|
+
: this.db.all("SELECT * FROM events WHERE id = ?", [idOrAddress]);
|
|
281
|
+
return row;
|
|
282
|
+
};
|
|
283
|
+
isVisible = (id) => this.db.all(`SELECT 1 FROM events e WHERE e.id = ? AND ${VISIBLE}`, [id, now()]).length > 0;
|
|
284
|
+
isDeleted = (id) => this.db.all(`SELECT 1 FROM events e WHERE e.id = ? AND NOT (${NOT_DELETED})`, [id]).length > 0;
|
|
285
|
+
addDelete = (event, key, changes) => {
|
|
286
|
+
const record = { id: event.id, pubkey: event.pubkey, created_at: event.created_at };
|
|
287
|
+
this.db.run("INSERT INTO deletes (key, id, pubkey, created_at) VALUES (?, ?, ?, ?)", [
|
|
288
|
+
key,
|
|
289
|
+
record.id,
|
|
290
|
+
record.pubkey,
|
|
291
|
+
record.created_at,
|
|
292
|
+
]);
|
|
293
|
+
changes.deletes.push(["add", key, record]);
|
|
294
|
+
};
|
|
295
|
+
drop = (id, changes) => {
|
|
296
|
+
this.db.run("DELETE FROM events WHERE id = ?", [id]);
|
|
297
|
+
this.db.run("DELETE FROM tags WHERE event_id = ?", [id]);
|
|
298
|
+
this.db.run("DELETE FROM relays WHERE event_id = ?", [id]);
|
|
299
|
+
this.db.run("DELETE FROM deletes WHERE id = ?", [id]);
|
|
300
|
+
changes.deletes.push(["withdraw", id]);
|
|
301
|
+
};
|
|
302
|
+
// Drop an event with nothing restored, taking a current version's kept-back one with it
|
|
303
|
+
evictEvent = (id, changes) => {
|
|
304
|
+
const row = this.getRow(id);
|
|
305
|
+
if (row) {
|
|
306
|
+
const hidden = this.hiddenBy(row.id);
|
|
307
|
+
this.drop(row.id, changes);
|
|
308
|
+
// A superseded version was already hidden from readers
|
|
309
|
+
if (row.current) {
|
|
310
|
+
changes.remove(row.id);
|
|
311
|
+
if (row.replaced) {
|
|
312
|
+
this.drop(row.replaced, changes);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
this.uncover(hidden, changes);
|
|
316
|
+
}
|
|
317
|
+
};
|
|
318
|
+
// The events hidden by deletes that `id` asserted, each once even if named twice
|
|
319
|
+
hiddenBy = (id) => {
|
|
320
|
+
const hidden = new Map();
|
|
321
|
+
for (const { key } of this.db.all("SELECT key FROM deletes WHERE id = ?", [id])) {
|
|
322
|
+
const target = this.getRow(key);
|
|
323
|
+
if (target && !this.isVisible(target.id)) {
|
|
324
|
+
hidden.set(target.id, target);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return hidden;
|
|
328
|
+
};
|
|
329
|
+
uncover = (hidden, changes) => {
|
|
330
|
+
for (const target of hidden.values()) {
|
|
331
|
+
if (this.isVisible(target.id)) {
|
|
332
|
+
changes.add(target.id, toStored(target));
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
};
|
|
336
|
+
publish = (event, verified, changes) => {
|
|
337
|
+
// One malformed event mustn't take the rest of its batch down with it
|
|
338
|
+
if (!event?.id) {
|
|
339
|
+
console.warn("Attempted to publish invalid event to repository", event);
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
const eventJson = JSON.stringify(event);
|
|
343
|
+
const [existing] = this.db.all("SELECT json, verified FROM events WHERE id = ?", [event.id]);
|
|
344
|
+
// An event we hold can come back changed, most often an unsigned one carrying its signature
|
|
345
|
+
if (existing) {
|
|
346
|
+
if (!isSameJson(existing.json, eventJson)) {
|
|
347
|
+
this.db.run("UPDATE events SET json = ?, verified = ? WHERE id = ?", [
|
|
348
|
+
eventJson,
|
|
349
|
+
verified ? 1 : 0,
|
|
350
|
+
event.id,
|
|
351
|
+
]);
|
|
352
|
+
changes.add(event.id);
|
|
353
|
+
}
|
|
354
|
+
else if (verified && !existing.verified) {
|
|
355
|
+
this.db.run("UPDATE events SET verified = 1 WHERE id = ?", [event.id]);
|
|
356
|
+
}
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
const address = isReplaceable(event) ? getAddress(event) : undefined;
|
|
360
|
+
const [duplicate] = address
|
|
361
|
+
? this.db.all("SELECT * FROM events WHERE address = ? AND current = 1", [address])
|
|
362
|
+
: [];
|
|
363
|
+
if (duplicate) {
|
|
364
|
+
if (event.created_at < duplicate.created_at) {
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
// Keep one version back, so removing this one can restore it; anything older goes
|
|
368
|
+
if (duplicate.replaced) {
|
|
369
|
+
this.drop(duplicate.replaced, changes);
|
|
370
|
+
}
|
|
371
|
+
this.addDelete(event, duplicate.id, changes);
|
|
372
|
+
this.db.run("UPDATE events SET current = 0 WHERE id = ?", [duplicate.id]);
|
|
373
|
+
changes.remove(duplicate.id);
|
|
374
|
+
}
|
|
375
|
+
this.db.run(`INSERT INTO events (id, pubkey, kind, created_at, address, current, replaced, expires_at, verified, json)
|
|
376
|
+
VALUES (?, ?, ?, ?, ?, 1, ?, ?, ?, ?)`, [
|
|
377
|
+
event.id,
|
|
378
|
+
event.pubkey,
|
|
379
|
+
event.kind,
|
|
380
|
+
event.created_at,
|
|
381
|
+
address ?? null,
|
|
382
|
+
duplicate?.id ?? null,
|
|
383
|
+
getExpiration(event) ?? null,
|
|
384
|
+
verified ? 1 : 0,
|
|
385
|
+
eventJson,
|
|
386
|
+
]);
|
|
387
|
+
// As in MemoryRepository and matchFilter, a tag without a value has nothing to match
|
|
388
|
+
for (const [name, value] of event.tags) {
|
|
389
|
+
if (name?.length === 1 && value !== undefined) {
|
|
390
|
+
this.db.run("INSERT INTO tags (event_id, name, value, created_at) VALUES (?, ?, ?, ?)", [
|
|
391
|
+
event.id,
|
|
392
|
+
name,
|
|
393
|
+
value,
|
|
394
|
+
event.created_at,
|
|
395
|
+
]);
|
|
396
|
+
if (event.kind === DELETE && ["a", "e"].includes(name) && value) {
|
|
397
|
+
this.addDelete(event, value, changes);
|
|
398
|
+
const target = this.getRow(value);
|
|
399
|
+
if (target && this.isDeleted(target.id)) {
|
|
400
|
+
changes.remove(target.id);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
changes.add(event.id);
|
|
406
|
+
};
|
|
407
|
+
remove = (idOrAddress, changes) => {
|
|
408
|
+
const row = this.getRow(idOrAddress);
|
|
409
|
+
if (row) {
|
|
410
|
+
const hidden = this.hiddenBy(row.id);
|
|
411
|
+
this.drop(row.id, changes);
|
|
412
|
+
changes.remove(row.id);
|
|
413
|
+
if (row.current && row.replaced) {
|
|
414
|
+
this.db.run("UPDATE events SET current = 1 WHERE id = ?", [row.replaced]);
|
|
415
|
+
}
|
|
416
|
+
this.uncover(hidden, changes);
|
|
417
|
+
}
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../../../../src/repository/adapters/sqlite/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SqliteConnection, SqliteExtension } from "./protocol.js";
|
|
2
|
+
export type ConnectSqliteOptions = {
|
|
3
|
+
name: string;
|
|
4
|
+
createWorker: () => Worker;
|
|
5
|
+
};
|
|
6
|
+
/** Connect to sqlite database `name` through the tab that holds its lock and runs the worker. */
|
|
7
|
+
export declare const connectSqlite: <M extends SqliteExtension = Record<never, never>>({ name, createWorker, }: ConnectSqliteOptions) => SqliteConnection<M>;
|
|
8
|
+
//# sourceMappingURL=leader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leader.d.ts","sourceRoot":"","sources":["../../../../../../src/repository/adapters/sqlite/leader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,gBAAgB,EAChB,eAAe,EAMhB,MAAM,eAAe,CAAA;AAEtB,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,MAAM,CAAA;IAEZ,YAAY,EAAE,MAAM,MAAM,CAAA;CAC3B,CAAA;AAwBD,iGAAiG;AACjG,eAAO,MAAM,aAAa,GAAI,CAAC,SAAS,eAAe,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,yBAG7E,oBAAoB,KAAG,gBAAgB,CAAC,CAAC,CAwP3C,CAAA"}
|