javascript-solid-server 0.0.80 → 0.0.81

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/README.md CHANGED
@@ -1047,7 +1047,7 @@ Minimal dependencies for a fast, secure server:
1047
1047
  - **oidc-provider** - OpenID Connect Identity Provider (only when IdP enabled)
1048
1048
  - **bcryptjs** - Password hashing (only when IdP enabled)
1049
1049
  - **microfed** - ActivityPub primitives (only when activitypub enabled)
1050
- - **better-sqlite3** - SQLite storage for federation data
1050
+ - **sql.js** - SQLite storage for federation data (WASM, cross-platform)
1051
1051
 
1052
1052
  ## License
1053
1053
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "javascript-solid-server",
3
- "version": "0.0.80",
3
+ "version": "0.0.81",
4
4
  "description": "A minimal, fast Solid server",
5
5
  "main": "src/index.js",
6
6
  "type": "module",
@@ -28,7 +28,6 @@
28
28
  "@fastify/websocket": "^8.3.1",
29
29
  "@simplewebauthn/server": "^13.2.2",
30
30
  "bcryptjs": "^3.0.3",
31
- "better-sqlite3": "^12.5.0",
32
31
  "commander": "^14.0.2",
33
32
  "fastify": "^4.29.1",
34
33
  "fs-extra": "^11.2.0",
package/src/ap/store.js CHANGED
@@ -2,8 +2,8 @@
2
2
  * ActivityPub SQLite Storage
3
3
  * Persistence layer for federation data
4
4
  *
5
- * Uses better-sqlite3 when available (native, fast)
6
- * Falls back to sql.js on Android/platforms without native builds
5
+ * Uses sql.js (WASM) for cross-platform compatibility
6
+ * Works on Android/Termux, Windows, and all platforms
7
7
  */
8
8
 
9
9
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'
@@ -11,7 +11,6 @@ import { dirname } from 'path'
11
11
 
12
12
  let db = null
13
13
  let dbPath = null
14
- let usingSqlJs = false
15
14
 
16
15
  // SQL schema
17
16
  const SCHEMA = `
@@ -59,7 +58,7 @@ const SCHEMA = `
59
58
 
60
59
  /**
61
60
  * Initialize the database
62
- * Tries better-sqlite3 first, falls back to sql.js
61
+ * Uses sql.js (WASM) for cross-platform compatibility
63
62
  * @param {string} path - Path to SQLite file
64
63
  */
65
64
  export async function initStore(path = 'data/activitypub.db') {
@@ -71,43 +70,31 @@ export async function initStore(path = 'data/activitypub.db') {
71
70
 
72
71
  dbPath = path
73
72
 
74
- // Try better-sqlite3 first (fast, native)
75
- try {
76
- const Database = (await import('better-sqlite3')).default
77
- db = new Database(path)
78
- db.exec(SCHEMA)
79
- usingSqlJs = false
80
- return db
81
- } catch (e) {
82
- // Fall back to sql.js (WASM, works everywhere)
83
- console.log('ActivityPub: Using sql.js (WASM) for SQLite storage')
84
-
85
- const initSqlJs = (await import('sql.js')).default
86
- const SQL = await initSqlJs()
87
-
88
- // Load existing database if it exists
89
- if (existsSync(path)) {
90
- const buffer = readFileSync(path)
91
- db = new SQL.Database(buffer)
92
- } else {
93
- db = new SQL.Database()
94
- }
95
-
96
- db.run(SCHEMA)
97
- usingSqlJs = true
98
-
99
- // Save initial database
100
- saveDatabase()
101
-
102
- return db
73
+ // Use sql.js (WASM, works everywhere)
74
+ const initSqlJs = (await import('sql.js')).default
75
+ const SQL = await initSqlJs()
76
+
77
+ // Load existing database if it exists
78
+ if (existsSync(path)) {
79
+ const buffer = readFileSync(path)
80
+ db = new SQL.Database(buffer)
81
+ } else {
82
+ db = new SQL.Database()
103
83
  }
84
+
85
+ db.run(SCHEMA)
86
+
87
+ // Save initial database
88
+ saveDatabase()
89
+
90
+ return db
104
91
  }
105
92
 
106
93
  /**
107
94
  * Save sql.js database to disk
108
95
  */
109
96
  function saveDatabase() {
110
- if (usingSqlJs && db && dbPath) {
97
+ if (db && dbPath) {
111
98
  const data = db.export()
112
99
  const buffer = Buffer.from(data)
113
100
  writeFileSync(dbPath, buffer)
@@ -124,45 +111,33 @@ export function getStore() {
124
111
  return db
125
112
  }
126
113
 
127
- // Helper to run prepared statements across both implementations
114
+ // Helper functions for sql.js API
128
115
  function runStmt(sql, params = []) {
129
- if (usingSqlJs) {
130
- db.run(sql, params)
131
- saveDatabase()
132
- } else {
133
- db.prepare(sql).run(...params)
134
- }
116
+ db.run(sql, params)
117
+ saveDatabase()
135
118
  }
136
119
 
137
120
  function getOne(sql, params = []) {
138
- if (usingSqlJs) {
139
- const stmt = db.prepare(sql)
140
- stmt.bind(params)
141
- if (stmt.step()) {
142
- const row = stmt.getAsObject()
143
- stmt.free()
144
- return row
145
- }
121
+ const stmt = db.prepare(sql)
122
+ stmt.bind(params)
123
+ if (stmt.step()) {
124
+ const row = stmt.getAsObject()
146
125
  stmt.free()
147
- return null
148
- } else {
149
- return db.prepare(sql).get(...params)
126
+ return row
150
127
  }
128
+ stmt.free()
129
+ return null
151
130
  }
152
131
 
153
132
  function getAll(sql, params = []) {
154
- if (usingSqlJs) {
155
- const results = []
156
- const stmt = db.prepare(sql)
157
- stmt.bind(params)
158
- while (stmt.step()) {
159
- results.push(stmt.getAsObject())
160
- }
161
- stmt.free()
162
- return results
163
- } else {
164
- return db.prepare(sql).all(...params)
133
+ const results = []
134
+ const stmt = db.prepare(sql)
135
+ stmt.bind(params)
136
+ while (stmt.step()) {
137
+ results.push(stmt.getAsObject())
165
138
  }
139
+ stmt.free()
140
+ return results
166
141
  }
167
142
 
168
143
  // Followers