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 +1 -1
- package/package.json +1 -2
- package/src/ap/store.js +38 -63
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
|
-
- **
|
|
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.
|
|
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
|
|
6
|
-
*
|
|
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
|
-
*
|
|
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
|
-
//
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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 (
|
|
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
|
|
114
|
+
// Helper functions for sql.js API
|
|
128
115
|
function runStmt(sql, params = []) {
|
|
129
|
-
|
|
130
|
-
|
|
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
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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
|
|
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
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
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
|