@xnetjs/sqlite 0.0.2 → 0.0.3
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/{adapter-I7yAV6iu.d.ts → adapter-t2aqQ__n.d.ts} +27 -1
- package/dist/adapters/electron.d.ts +7 -3
- package/dist/adapters/electron.js +50 -6
- package/dist/adapters/expo.d.ts +2 -2
- package/dist/adapters/expo.js +27 -6
- package/dist/adapters/memory.d.ts +2 -2
- package/dist/adapters/memory.js +1 -1
- package/dist/adapters/web-proxy.d.ts +19 -3
- package/dist/adapters/web-proxy.js +118 -6
- package/dist/adapters/web-worker.d.ts +12 -1
- package/dist/adapters/web-worker.js +27 -3
- package/dist/adapters/web.d.ts +11 -3
- package/dist/adapters/web.js +7 -4
- package/dist/browser-support.d.ts +56 -1
- package/dist/browser-support.js +11 -3
- package/dist/{chunk-ZRR5D2OD.js → chunk-2OK46ZBU.js} +118 -0
- package/dist/chunk-CBU263LI.js +30 -0
- package/dist/chunk-DCY4LAUD.js +494 -0
- package/dist/chunk-NVD7G7DZ.js +406 -0
- package/dist/index.d.ts +26 -7
- package/dist/index.js +188 -128
- package/dist/schema-BEgIA-rZ.d.ts +35 -0
- package/dist/types-DMrj3K4o.d.ts +132 -0
- package/package.json +1 -1
- package/dist/chunk-BXYZU3OL.js +0 -245
- package/dist/chunk-HIREU5S5.js +0 -193
- package/dist/schema-CjkXTqxn.d.ts +0 -35
- package/dist/types-C_aHfRDF.d.ts +0 -42
package/dist/chunk-BXYZU3OL.js
DELETED
|
@@ -1,245 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
SCHEMA_DDL,
|
|
3
|
-
SCHEMA_VERSION
|
|
4
|
-
} from "./chunk-HIREU5S5.js";
|
|
5
|
-
|
|
6
|
-
// src/adapters/web.ts
|
|
7
|
-
function isDebugEnabled() {
|
|
8
|
-
return typeof self !== "undefined" && typeof localStorage !== "undefined" && localStorage.getItem("xnet:sqlite:debug") === "true";
|
|
9
|
-
}
|
|
10
|
-
function log(...args) {
|
|
11
|
-
if (isDebugEnabled()) {
|
|
12
|
-
console.log(...args);
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
var WebSQLiteAdapter = class {
|
|
16
|
-
sqlite3 = null;
|
|
17
|
-
db = null;
|
|
18
|
-
poolUtil = null;
|
|
19
|
-
_config = null;
|
|
20
|
-
inTransaction = false;
|
|
21
|
-
storageMode = "memory";
|
|
22
|
-
async open(config) {
|
|
23
|
-
if (this.db !== null) {
|
|
24
|
-
throw new Error("Database already open. Call close() first.");
|
|
25
|
-
}
|
|
26
|
-
log("[WebSQLiteAdapter] Starting open()...");
|
|
27
|
-
log("[WebSQLiteAdapter] Importing sqlite-wasm...");
|
|
28
|
-
const sqlite3InitModule = (await import("@sqlite.org/sqlite-wasm")).default;
|
|
29
|
-
log("[WebSQLiteAdapter] sqlite-wasm imported");
|
|
30
|
-
log("[WebSQLiteAdapter] Initializing sqlite3 module...");
|
|
31
|
-
this.sqlite3 = await sqlite3InitModule();
|
|
32
|
-
log("[WebSQLiteAdapter] sqlite3 module initialized");
|
|
33
|
-
try {
|
|
34
|
-
log("[WebSQLiteAdapter] Installing OPFS-SAHPool VFS...");
|
|
35
|
-
this.poolUtil = await this.sqlite3.installOpfsSAHPoolVfs({
|
|
36
|
-
name: "opfs-sahpool",
|
|
37
|
-
directory: ".xnet-sqlite",
|
|
38
|
-
initialCapacity: 10,
|
|
39
|
-
// Support ~3-4 databases with journals
|
|
40
|
-
clearOnInit: false
|
|
41
|
-
});
|
|
42
|
-
log("[WebSQLiteAdapter] OPFS-SAHPool VFS installed");
|
|
43
|
-
log("[WebSQLiteAdapter] Reserving capacity...");
|
|
44
|
-
await this.poolUtil.reserveMinimumCapacity(10);
|
|
45
|
-
log("[WebSQLiteAdapter] Capacity reserved");
|
|
46
|
-
const dbPath = config.path.startsWith("/") ? config.path : `/${config.path}`;
|
|
47
|
-
log("[WebSQLiteAdapter] Opening database at", dbPath);
|
|
48
|
-
this.db = new this.poolUtil.OpfsSAHPoolDb(dbPath, "c");
|
|
49
|
-
this.storageMode = "opfs";
|
|
50
|
-
log("[WebSQLiteAdapter] Database opened with OPFS-SAHPool");
|
|
51
|
-
} catch (err) {
|
|
52
|
-
console.warn("[WebSQLiteAdapter] OPFS-SAHPool not available, trying OPFS direct mode:", err);
|
|
53
|
-
const dbPath = config.path.startsWith("/") ? config.path : `/${config.path}`;
|
|
54
|
-
const opfsDbCtor = this.sqlite3?.oo1?.OpfsDb;
|
|
55
|
-
if (typeof opfsDbCtor === "function") {
|
|
56
|
-
try {
|
|
57
|
-
this.db = new opfsDbCtor(dbPath, "c");
|
|
58
|
-
this.storageMode = "opfs";
|
|
59
|
-
log("[WebSQLiteAdapter] Database opened with OPFS direct mode");
|
|
60
|
-
} catch (opfsErr) {
|
|
61
|
-
console.warn(
|
|
62
|
-
"[WebSQLiteAdapter] OPFS direct mode not available, using in-memory database:",
|
|
63
|
-
opfsErr
|
|
64
|
-
);
|
|
65
|
-
this.db = new this.sqlite3.oo1.DB(":memory:", "c");
|
|
66
|
-
this.storageMode = "memory";
|
|
67
|
-
log("[WebSQLiteAdapter] In-memory database opened");
|
|
68
|
-
}
|
|
69
|
-
} else {
|
|
70
|
-
console.warn("[WebSQLiteAdapter] OPFS direct mode unavailable, using in-memory database");
|
|
71
|
-
this.db = new this.sqlite3.oo1.DB(":memory:", "c");
|
|
72
|
-
this.storageMode = "memory";
|
|
73
|
-
log("[WebSQLiteAdapter] In-memory database opened");
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
this._config = config;
|
|
77
|
-
if (config.foreignKeys !== false) {
|
|
78
|
-
this.execSync("PRAGMA foreign_keys = ON");
|
|
79
|
-
}
|
|
80
|
-
if (config.busyTimeout) {
|
|
81
|
-
this.execSync(`PRAGMA busy_timeout = ${config.busyTimeout}`);
|
|
82
|
-
} else {
|
|
83
|
-
this.execSync("PRAGMA busy_timeout = 5000");
|
|
84
|
-
}
|
|
85
|
-
this.execSync("PRAGMA synchronous = NORMAL");
|
|
86
|
-
this.execSync("PRAGMA cache_size = -64000");
|
|
87
|
-
this.execSync("PRAGMA temp_store = MEMORY");
|
|
88
|
-
}
|
|
89
|
-
async close() {
|
|
90
|
-
if (this.db) {
|
|
91
|
-
this.db.close();
|
|
92
|
-
this.db = null;
|
|
93
|
-
}
|
|
94
|
-
this.sqlite3 = null;
|
|
95
|
-
this.poolUtil = null;
|
|
96
|
-
this._config = null;
|
|
97
|
-
}
|
|
98
|
-
isOpen() {
|
|
99
|
-
return this.db !== null;
|
|
100
|
-
}
|
|
101
|
-
getStorageMode() {
|
|
102
|
-
return this.storageMode;
|
|
103
|
-
}
|
|
104
|
-
async query(sql, params) {
|
|
105
|
-
this.ensureOpen();
|
|
106
|
-
const rows = [];
|
|
107
|
-
this.db.exec({
|
|
108
|
-
sql,
|
|
109
|
-
bind: params,
|
|
110
|
-
rowMode: "object",
|
|
111
|
-
callback: (row) => {
|
|
112
|
-
rows.push(row);
|
|
113
|
-
}
|
|
114
|
-
});
|
|
115
|
-
return rows;
|
|
116
|
-
}
|
|
117
|
-
async queryOne(sql, params) {
|
|
118
|
-
const rows = await this.query(sql, params);
|
|
119
|
-
return rows[0] ?? null;
|
|
120
|
-
}
|
|
121
|
-
async run(sql, params) {
|
|
122
|
-
this.ensureOpen();
|
|
123
|
-
this.db.exec({
|
|
124
|
-
sql,
|
|
125
|
-
bind: params
|
|
126
|
-
});
|
|
127
|
-
return {
|
|
128
|
-
changes: this.sqlite3.capi.sqlite3_changes(this.db.pointer),
|
|
129
|
-
lastInsertRowid: this.sqlite3.capi.sqlite3_last_insert_rowid(this.db.pointer)
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
async exec(sql) {
|
|
133
|
-
this.ensureOpen();
|
|
134
|
-
this.execSync(sql);
|
|
135
|
-
}
|
|
136
|
-
execSync(sql) {
|
|
137
|
-
this.db.exec({ sql });
|
|
138
|
-
}
|
|
139
|
-
async transaction(fn) {
|
|
140
|
-
await this.beginTransaction();
|
|
141
|
-
try {
|
|
142
|
-
const result = await fn();
|
|
143
|
-
await this.commit();
|
|
144
|
-
return result;
|
|
145
|
-
} catch (err) {
|
|
146
|
-
await this.rollback();
|
|
147
|
-
throw err;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
async beginTransaction() {
|
|
151
|
-
if (this.inTransaction) {
|
|
152
|
-
throw new Error("Transaction already in progress");
|
|
153
|
-
}
|
|
154
|
-
this.execSync("BEGIN IMMEDIATE");
|
|
155
|
-
this.inTransaction = true;
|
|
156
|
-
}
|
|
157
|
-
async commit() {
|
|
158
|
-
if (!this.inTransaction) {
|
|
159
|
-
throw new Error("No transaction in progress");
|
|
160
|
-
}
|
|
161
|
-
this.execSync("COMMIT");
|
|
162
|
-
this.inTransaction = false;
|
|
163
|
-
}
|
|
164
|
-
async rollback() {
|
|
165
|
-
if (!this.inTransaction) {
|
|
166
|
-
return;
|
|
167
|
-
}
|
|
168
|
-
this.execSync("ROLLBACK");
|
|
169
|
-
this.inTransaction = false;
|
|
170
|
-
}
|
|
171
|
-
async prepare(sql) {
|
|
172
|
-
return {
|
|
173
|
-
query: async (params) => {
|
|
174
|
-
return this.query(sql, params);
|
|
175
|
-
},
|
|
176
|
-
queryOne: async (params) => {
|
|
177
|
-
return this.queryOne(sql, params);
|
|
178
|
-
},
|
|
179
|
-
run: async (params) => {
|
|
180
|
-
return this.run(sql, params);
|
|
181
|
-
},
|
|
182
|
-
finalize: async () => {
|
|
183
|
-
}
|
|
184
|
-
};
|
|
185
|
-
}
|
|
186
|
-
async getSchemaVersion() {
|
|
187
|
-
try {
|
|
188
|
-
const row = await this.queryOne(
|
|
189
|
-
"SELECT version FROM _schema_version ORDER BY version DESC LIMIT 1"
|
|
190
|
-
);
|
|
191
|
-
return row?.version ?? 0;
|
|
192
|
-
} catch {
|
|
193
|
-
return 0;
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
async setSchemaVersion(version) {
|
|
197
|
-
await this.run("INSERT INTO _schema_version (version, applied_at) VALUES (?, ?)", [
|
|
198
|
-
version,
|
|
199
|
-
Date.now()
|
|
200
|
-
]);
|
|
201
|
-
}
|
|
202
|
-
async applySchema(version, sql) {
|
|
203
|
-
const currentVersion = await this.getSchemaVersion();
|
|
204
|
-
if (currentVersion >= version) {
|
|
205
|
-
return false;
|
|
206
|
-
}
|
|
207
|
-
await this.transaction(async () => {
|
|
208
|
-
await this.exec(sql);
|
|
209
|
-
await this.setSchemaVersion(version);
|
|
210
|
-
});
|
|
211
|
-
return true;
|
|
212
|
-
}
|
|
213
|
-
async getDatabaseSize() {
|
|
214
|
-
try {
|
|
215
|
-
const row = await this.queryOne(
|
|
216
|
-
"SELECT page_count * page_size as size FROM pragma_page_count(), pragma_page_size()"
|
|
217
|
-
);
|
|
218
|
-
return row?.size ?? 0;
|
|
219
|
-
} catch {
|
|
220
|
-
return 0;
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
async vacuum() {
|
|
224
|
-
await this.exec("VACUUM");
|
|
225
|
-
}
|
|
226
|
-
async checkpoint() {
|
|
227
|
-
return 0;
|
|
228
|
-
}
|
|
229
|
-
ensureOpen() {
|
|
230
|
-
if (!this.db || !this.sqlite3) {
|
|
231
|
-
throw new Error("Database not open. Call open() first.");
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
};
|
|
235
|
-
async function createWebSQLiteAdapter(config) {
|
|
236
|
-
const adapter = new WebSQLiteAdapter();
|
|
237
|
-
await adapter.open(config);
|
|
238
|
-
await adapter.applySchema(SCHEMA_VERSION, SCHEMA_DDL);
|
|
239
|
-
return adapter;
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
export {
|
|
243
|
-
WebSQLiteAdapter,
|
|
244
|
-
createWebSQLiteAdapter
|
|
245
|
-
};
|
package/dist/chunk-HIREU5S5.js
DELETED
|
@@ -1,193 +0,0 @@
|
|
|
1
|
-
// src/schema.ts
|
|
2
|
-
var SCHEMA_VERSION = 1;
|
|
3
|
-
var SCHEMA_DDL_CORE = `
|
|
4
|
-
-- ============================================
|
|
5
|
-
-- Schema Version Tracking
|
|
6
|
-
-- ============================================
|
|
7
|
-
|
|
8
|
-
CREATE TABLE IF NOT EXISTS _schema_version (
|
|
9
|
-
version INTEGER PRIMARY KEY,
|
|
10
|
-
applied_at INTEGER NOT NULL
|
|
11
|
-
);
|
|
12
|
-
|
|
13
|
-
-- ============================================
|
|
14
|
-
-- Core Tables
|
|
15
|
-
-- ============================================
|
|
16
|
-
|
|
17
|
-
-- All nodes (Pages, Databases, Rows, Comments, etc.)
|
|
18
|
-
CREATE TABLE IF NOT EXISTS nodes (
|
|
19
|
-
id TEXT PRIMARY KEY,
|
|
20
|
-
schema_id TEXT NOT NULL,
|
|
21
|
-
created_at INTEGER NOT NULL,
|
|
22
|
-
updated_at INTEGER NOT NULL,
|
|
23
|
-
created_by TEXT NOT NULL,
|
|
24
|
-
deleted_at INTEGER
|
|
25
|
-
);
|
|
26
|
-
|
|
27
|
-
-- Node properties (LWW per-property)
|
|
28
|
-
CREATE TABLE IF NOT EXISTS node_properties (
|
|
29
|
-
node_id TEXT NOT NULL,
|
|
30
|
-
property_key TEXT NOT NULL,
|
|
31
|
-
value BLOB,
|
|
32
|
-
lamport_time INTEGER NOT NULL,
|
|
33
|
-
updated_by TEXT NOT NULL,
|
|
34
|
-
updated_at INTEGER NOT NULL,
|
|
35
|
-
|
|
36
|
-
PRIMARY KEY (node_id, property_key),
|
|
37
|
-
FOREIGN KEY (node_id) REFERENCES nodes(id) ON DELETE CASCADE
|
|
38
|
-
);
|
|
39
|
-
|
|
40
|
-
-- Change log (event sourcing)
|
|
41
|
-
CREATE TABLE IF NOT EXISTS changes (
|
|
42
|
-
hash TEXT PRIMARY KEY,
|
|
43
|
-
node_id TEXT NOT NULL,
|
|
44
|
-
payload BLOB NOT NULL,
|
|
45
|
-
lamport_time INTEGER NOT NULL,
|
|
46
|
-
lamport_peer TEXT NOT NULL,
|
|
47
|
-
wall_time INTEGER NOT NULL,
|
|
48
|
-
author TEXT NOT NULL,
|
|
49
|
-
parent_hash TEXT,
|
|
50
|
-
batch_id TEXT,
|
|
51
|
-
signature BLOB NOT NULL,
|
|
52
|
-
|
|
53
|
-
FOREIGN KEY (node_id) REFERENCES nodes(id) ON DELETE CASCADE
|
|
54
|
-
);
|
|
55
|
-
|
|
56
|
-
-- Y.Doc binary state (for nodes with collaborative content)
|
|
57
|
-
CREATE TABLE IF NOT EXISTS yjs_state (
|
|
58
|
-
node_id TEXT PRIMARY KEY,
|
|
59
|
-
state BLOB NOT NULL,
|
|
60
|
-
updated_at INTEGER NOT NULL,
|
|
61
|
-
|
|
62
|
-
FOREIGN KEY (node_id) REFERENCES nodes(id) ON DELETE CASCADE
|
|
63
|
-
);
|
|
64
|
-
|
|
65
|
-
-- Y.Doc incremental updates (for sync)
|
|
66
|
-
CREATE TABLE IF NOT EXISTS yjs_updates (
|
|
67
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
68
|
-
node_id TEXT NOT NULL,
|
|
69
|
-
update_data BLOB NOT NULL,
|
|
70
|
-
timestamp INTEGER NOT NULL,
|
|
71
|
-
origin TEXT,
|
|
72
|
-
|
|
73
|
-
FOREIGN KEY (node_id) REFERENCES nodes(id) ON DELETE CASCADE
|
|
74
|
-
);
|
|
75
|
-
|
|
76
|
-
-- Yjs snapshots (for document time travel)
|
|
77
|
-
CREATE TABLE IF NOT EXISTS yjs_snapshots (
|
|
78
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
79
|
-
node_id TEXT NOT NULL,
|
|
80
|
-
timestamp INTEGER NOT NULL,
|
|
81
|
-
snapshot BLOB NOT NULL,
|
|
82
|
-
doc_state BLOB NOT NULL,
|
|
83
|
-
byte_size INTEGER NOT NULL,
|
|
84
|
-
|
|
85
|
-
FOREIGN KEY (node_id) REFERENCES nodes(id) ON DELETE CASCADE
|
|
86
|
-
);
|
|
87
|
-
|
|
88
|
-
-- Blobs (content-addressed)
|
|
89
|
-
CREATE TABLE IF NOT EXISTS blobs (
|
|
90
|
-
cid TEXT PRIMARY KEY,
|
|
91
|
-
data BLOB NOT NULL,
|
|
92
|
-
mime_type TEXT,
|
|
93
|
-
size INTEGER NOT NULL,
|
|
94
|
-
created_at INTEGER NOT NULL,
|
|
95
|
-
reference_count INTEGER DEFAULT 1
|
|
96
|
-
);
|
|
97
|
-
|
|
98
|
-
-- Documents (for @xnetjs/storage compatibility)
|
|
99
|
-
CREATE TABLE IF NOT EXISTS documents (
|
|
100
|
-
id TEXT PRIMARY KEY,
|
|
101
|
-
content BLOB NOT NULL,
|
|
102
|
-
metadata TEXT NOT NULL,
|
|
103
|
-
version INTEGER NOT NULL DEFAULT 1
|
|
104
|
-
);
|
|
105
|
-
|
|
106
|
-
-- Signed updates (for @xnetjs/storage compatibility)
|
|
107
|
-
CREATE TABLE IF NOT EXISTS updates (
|
|
108
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
109
|
-
doc_id TEXT NOT NULL,
|
|
110
|
-
update_hash TEXT NOT NULL,
|
|
111
|
-
update_data TEXT NOT NULL,
|
|
112
|
-
created_at INTEGER DEFAULT (strftime('%s', 'now') * 1000),
|
|
113
|
-
UNIQUE(doc_id, update_hash)
|
|
114
|
-
);
|
|
115
|
-
|
|
116
|
-
-- Snapshots (for @xnetjs/storage compatibility)
|
|
117
|
-
CREATE TABLE IF NOT EXISTS snapshots (
|
|
118
|
-
doc_id TEXT PRIMARY KEY,
|
|
119
|
-
snapshot_data TEXT NOT NULL,
|
|
120
|
-
created_at INTEGER DEFAULT (strftime('%s', 'now') * 1000)
|
|
121
|
-
);
|
|
122
|
-
|
|
123
|
-
-- Sync metadata
|
|
124
|
-
CREATE TABLE IF NOT EXISTS sync_state (
|
|
125
|
-
key TEXT PRIMARY KEY,
|
|
126
|
-
value TEXT NOT NULL
|
|
127
|
-
);
|
|
128
|
-
|
|
129
|
-
-- ============================================
|
|
130
|
-
-- Indexes
|
|
131
|
-
-- ============================================
|
|
132
|
-
|
|
133
|
-
CREATE INDEX IF NOT EXISTS idx_nodes_schema ON nodes(schema_id);
|
|
134
|
-
CREATE INDEX IF NOT EXISTS idx_nodes_updated ON nodes(updated_at);
|
|
135
|
-
CREATE INDEX IF NOT EXISTS idx_nodes_created_by ON nodes(created_by);
|
|
136
|
-
CREATE INDEX IF NOT EXISTS idx_nodes_deleted ON nodes(deleted_at);
|
|
137
|
-
|
|
138
|
-
CREATE INDEX IF NOT EXISTS idx_properties_node ON node_properties(node_id);
|
|
139
|
-
CREATE INDEX IF NOT EXISTS idx_properties_lamport ON node_properties(lamport_time);
|
|
140
|
-
|
|
141
|
-
CREATE INDEX IF NOT EXISTS idx_changes_node ON changes(node_id);
|
|
142
|
-
CREATE INDEX IF NOT EXISTS idx_changes_lamport ON changes(lamport_time);
|
|
143
|
-
CREATE INDEX IF NOT EXISTS idx_changes_wall_time ON changes(wall_time);
|
|
144
|
-
CREATE INDEX IF NOT EXISTS idx_changes_batch ON changes(batch_id);
|
|
145
|
-
|
|
146
|
-
CREATE INDEX IF NOT EXISTS idx_yjs_state_updated ON yjs_state(updated_at);
|
|
147
|
-
CREATE INDEX IF NOT EXISTS idx_yjs_updates_node ON yjs_updates(node_id);
|
|
148
|
-
CREATE INDEX IF NOT EXISTS idx_yjs_snapshots_node ON yjs_snapshots(node_id);
|
|
149
|
-
CREATE INDEX IF NOT EXISTS idx_yjs_snapshots_timestamp ON yjs_snapshots(node_id, timestamp);
|
|
150
|
-
|
|
151
|
-
CREATE INDEX IF NOT EXISTS idx_updates_doc ON updates(doc_id);
|
|
152
|
-
CREATE INDEX IF NOT EXISTS idx_updates_created ON updates(created_at);
|
|
153
|
-
`;
|
|
154
|
-
var SCHEMA_DDL_FTS = `
|
|
155
|
-
-- ============================================
|
|
156
|
-
-- Full-Text Search (FTS5)
|
|
157
|
-
-- ============================================
|
|
158
|
-
|
|
159
|
-
-- FTS index for searchable node content
|
|
160
|
-
CREATE VIRTUAL TABLE IF NOT EXISTS nodes_fts USING fts5(
|
|
161
|
-
node_id,
|
|
162
|
-
title,
|
|
163
|
-
content,
|
|
164
|
-
tokenize='porter unicode61'
|
|
165
|
-
);
|
|
166
|
-
|
|
167
|
-
-- Triggers to keep FTS in sync will be managed by application layer
|
|
168
|
-
-- since the searchable content is derived from node properties
|
|
169
|
-
`;
|
|
170
|
-
var SCHEMA_DDL = SCHEMA_DDL_CORE + SCHEMA_DDL_FTS;
|
|
171
|
-
var SCHEMA_MIGRATIONS = {
|
|
172
|
-
// Version 2 migrations would go here
|
|
173
|
-
// 2: `ALTER TABLE nodes ADD COLUMN ...`
|
|
174
|
-
};
|
|
175
|
-
function getMigrationSQL(fromVersion, toVersion) {
|
|
176
|
-
const statements = [];
|
|
177
|
-
for (let v = fromVersion + 1; v <= toVersion; v++) {
|
|
178
|
-
const migration = SCHEMA_MIGRATIONS[v];
|
|
179
|
-
if (migration) {
|
|
180
|
-
statements.push(migration);
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
return statements.join("\n");
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
export {
|
|
187
|
-
SCHEMA_VERSION,
|
|
188
|
-
SCHEMA_DDL_CORE,
|
|
189
|
-
SCHEMA_DDL_FTS,
|
|
190
|
-
SCHEMA_DDL,
|
|
191
|
-
SCHEMA_MIGRATIONS,
|
|
192
|
-
getMigrationSQL
|
|
193
|
-
};
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @xnetjs/sqlite - Unified SQLite schema for xNet
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Current schema version.
|
|
6
|
-
* Increment this when making schema changes.
|
|
7
|
-
*/
|
|
8
|
-
declare const SCHEMA_VERSION = 1;
|
|
9
|
-
/**
|
|
10
|
-
* Core SQLite schema for xNet (without FTS5).
|
|
11
|
-
* This schema works on all platforms including sql.js.
|
|
12
|
-
*/
|
|
13
|
-
declare const SCHEMA_DDL_CORE = "\n-- ============================================\n-- Schema Version Tracking\n-- ============================================\n\nCREATE TABLE IF NOT EXISTS _schema_version (\n version INTEGER PRIMARY KEY,\n applied_at INTEGER NOT NULL\n);\n\n-- ============================================\n-- Core Tables\n-- ============================================\n\n-- All nodes (Pages, Databases, Rows, Comments, etc.)\nCREATE TABLE IF NOT EXISTS nodes (\n id TEXT PRIMARY KEY,\n schema_id TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL,\n created_by TEXT NOT NULL,\n deleted_at INTEGER\n);\n\n-- Node properties (LWW per-property)\nCREATE TABLE IF NOT EXISTS node_properties (\n node_id TEXT NOT NULL,\n property_key TEXT NOT NULL,\n value BLOB,\n lamport_time INTEGER NOT NULL,\n updated_by TEXT NOT NULL,\n updated_at INTEGER NOT NULL,\n\n PRIMARY KEY (node_id, property_key),\n FOREIGN KEY (node_id) REFERENCES nodes(id) ON DELETE CASCADE\n);\n\n-- Change log (event sourcing)\nCREATE TABLE IF NOT EXISTS changes (\n hash TEXT PRIMARY KEY,\n node_id TEXT NOT NULL,\n payload BLOB NOT NULL,\n lamport_time INTEGER NOT NULL,\n lamport_peer TEXT NOT NULL,\n wall_time INTEGER NOT NULL,\n author TEXT NOT NULL,\n parent_hash TEXT,\n batch_id TEXT,\n signature BLOB NOT NULL,\n\n FOREIGN KEY (node_id) REFERENCES nodes(id) ON DELETE CASCADE\n);\n\n-- Y.Doc binary state (for nodes with collaborative content)\nCREATE TABLE IF NOT EXISTS yjs_state (\n node_id TEXT PRIMARY KEY,\n state BLOB NOT NULL,\n updated_at INTEGER NOT NULL,\n\n FOREIGN KEY (node_id) REFERENCES nodes(id) ON DELETE CASCADE\n);\n\n-- Y.Doc incremental updates (for sync)\nCREATE TABLE IF NOT EXISTS yjs_updates (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n node_id TEXT NOT NULL,\n update_data BLOB NOT NULL,\n timestamp INTEGER NOT NULL,\n origin TEXT,\n\n FOREIGN KEY (node_id) REFERENCES nodes(id) ON DELETE CASCADE\n);\n\n-- Yjs snapshots (for document time travel)\nCREATE TABLE IF NOT EXISTS yjs_snapshots (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n node_id TEXT NOT NULL,\n timestamp INTEGER NOT NULL,\n snapshot BLOB NOT NULL,\n doc_state BLOB NOT NULL,\n byte_size INTEGER NOT NULL,\n\n FOREIGN KEY (node_id) REFERENCES nodes(id) ON DELETE CASCADE\n);\n\n-- Blobs (content-addressed)\nCREATE TABLE IF NOT EXISTS blobs (\n cid TEXT PRIMARY KEY,\n data BLOB NOT NULL,\n mime_type TEXT,\n size INTEGER NOT NULL,\n created_at INTEGER NOT NULL,\n reference_count INTEGER DEFAULT 1\n);\n\n-- Documents (for @xnetjs/storage compatibility)\nCREATE TABLE IF NOT EXISTS documents (\n id TEXT PRIMARY KEY,\n content BLOB NOT NULL,\n metadata TEXT NOT NULL,\n version INTEGER NOT NULL DEFAULT 1\n);\n\n-- Signed updates (for @xnetjs/storage compatibility)\nCREATE TABLE IF NOT EXISTS updates (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n doc_id TEXT NOT NULL,\n update_hash TEXT NOT NULL,\n update_data TEXT NOT NULL,\n created_at INTEGER DEFAULT (strftime('%s', 'now') * 1000),\n UNIQUE(doc_id, update_hash)\n);\n\n-- Snapshots (for @xnetjs/storage compatibility)\nCREATE TABLE IF NOT EXISTS snapshots (\n doc_id TEXT PRIMARY KEY,\n snapshot_data TEXT NOT NULL,\n created_at INTEGER DEFAULT (strftime('%s', 'now') * 1000)\n);\n\n-- Sync metadata\nCREATE TABLE IF NOT EXISTS sync_state (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\n\n-- ============================================\n-- Indexes\n-- ============================================\n\nCREATE INDEX IF NOT EXISTS idx_nodes_schema ON nodes(schema_id);\nCREATE INDEX IF NOT EXISTS idx_nodes_updated ON nodes(updated_at);\nCREATE INDEX IF NOT EXISTS idx_nodes_created_by ON nodes(created_by);\nCREATE INDEX IF NOT EXISTS idx_nodes_deleted ON nodes(deleted_at);\n\nCREATE INDEX IF NOT EXISTS idx_properties_node ON node_properties(node_id);\nCREATE INDEX IF NOT EXISTS idx_properties_lamport ON node_properties(lamport_time);\n\nCREATE INDEX IF NOT EXISTS idx_changes_node ON changes(node_id);\nCREATE INDEX IF NOT EXISTS idx_changes_lamport ON changes(lamport_time);\nCREATE INDEX IF NOT EXISTS idx_changes_wall_time ON changes(wall_time);\nCREATE INDEX IF NOT EXISTS idx_changes_batch ON changes(batch_id);\n\nCREATE INDEX IF NOT EXISTS idx_yjs_state_updated ON yjs_state(updated_at);\nCREATE INDEX IF NOT EXISTS idx_yjs_updates_node ON yjs_updates(node_id);\nCREATE INDEX IF NOT EXISTS idx_yjs_snapshots_node ON yjs_snapshots(node_id);\nCREATE INDEX IF NOT EXISTS idx_yjs_snapshots_timestamp ON yjs_snapshots(node_id, timestamp);\n\nCREATE INDEX IF NOT EXISTS idx_updates_doc ON updates(doc_id);\nCREATE INDEX IF NOT EXISTS idx_updates_created ON updates(created_at);\n";
|
|
14
|
-
/**
|
|
15
|
-
* FTS5 schema for full-text search.
|
|
16
|
-
* This is applied separately because sql.js doesn't support FTS5.
|
|
17
|
-
*/
|
|
18
|
-
declare const SCHEMA_DDL_FTS = "\n-- ============================================\n-- Full-Text Search (FTS5)\n-- ============================================\n\n-- FTS index for searchable node content\nCREATE VIRTUAL TABLE IF NOT EXISTS nodes_fts USING fts5(\n node_id,\n title,\n content,\n tokenize='porter unicode61'\n);\n\n-- Triggers to keep FTS in sync will be managed by application layer\n-- since the searchable content is derived from node properties\n";
|
|
19
|
-
/**
|
|
20
|
-
* Unified SQLite schema for xNet.
|
|
21
|
-
* This schema is shared across all platforms (with FTS5).
|
|
22
|
-
* Use SCHEMA_DDL_CORE for platforms without FTS5 support (sql.js).
|
|
23
|
-
*/
|
|
24
|
-
declare const SCHEMA_DDL: string;
|
|
25
|
-
/**
|
|
26
|
-
* Schema for future versions (migrations).
|
|
27
|
-
* Each key is the version number, value is the upgrade SQL.
|
|
28
|
-
*/
|
|
29
|
-
declare const SCHEMA_MIGRATIONS: Record<number, string>;
|
|
30
|
-
/**
|
|
31
|
-
* Get the SQL to upgrade from one version to another.
|
|
32
|
-
*/
|
|
33
|
-
declare function getMigrationSQL(fromVersion: number, toVersion: number): string;
|
|
34
|
-
|
|
35
|
-
export { SCHEMA_VERSION as S, SCHEMA_DDL as a, SCHEMA_DDL_CORE as b, SCHEMA_DDL_FTS as c, SCHEMA_MIGRATIONS as d, getMigrationSQL as g };
|
package/dist/types-C_aHfRDF.d.ts
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @xnetjs/sqlite - Type definitions for unified SQLite adapter
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* SQL parameter types that can be bound to statements.
|
|
6
|
-
*/
|
|
7
|
-
type SQLValue = string | number | bigint | Uint8Array | null;
|
|
8
|
-
/**
|
|
9
|
-
* Row type for query results.
|
|
10
|
-
*/
|
|
11
|
-
type SQLRow = Record<string, SQLValue>;
|
|
12
|
-
/**
|
|
13
|
-
* Result of a mutation query (INSERT, UPDATE, DELETE).
|
|
14
|
-
*/
|
|
15
|
-
interface RunResult {
|
|
16
|
-
/** Number of rows affected by the query */
|
|
17
|
-
changes: number;
|
|
18
|
-
/** Last inserted row ID (for INSERT with AUTOINCREMENT) */
|
|
19
|
-
lastInsertRowid: bigint;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Configuration options for SQLite database.
|
|
23
|
-
*/
|
|
24
|
-
interface SQLiteConfig {
|
|
25
|
-
/** Database file path or name */
|
|
26
|
-
path: string;
|
|
27
|
-
/** Enable WAL mode (default: true) */
|
|
28
|
-
walMode?: boolean;
|
|
29
|
-
/** Enable foreign keys (default: true) */
|
|
30
|
-
foreignKeys?: boolean;
|
|
31
|
-
/** Busy timeout in milliseconds (default: 5000) */
|
|
32
|
-
busyTimeout?: number;
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Schema version information.
|
|
36
|
-
*/
|
|
37
|
-
interface SchemaVersion {
|
|
38
|
-
version: number;
|
|
39
|
-
appliedAt: number;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export type { RunResult as R, SQLValue as S, SQLRow as a, SQLiteConfig as b, SchemaVersion as c };
|