feat(mindspace): enforce PostgreSQL user data delivery

This commit is contained in:
john
2026-07-13 15:29:29 +08:00
parent b33c943b69
commit a6620fb719
57 changed files with 2779 additions and 164 deletions
+24
View File
@@ -1,6 +1,7 @@
import fs from 'node:fs';
import path from 'node:path';
import { execFileSync } from 'node:child_process';
import { createPostgresUserDataSpaceService } from './postgres-user-data-space-service.mjs';
export const DATASET_REGISTRY_TABLE = '__page_data_datasets';
@@ -92,6 +93,23 @@ export function createUserDataSpaceService(options = {}) {
}
const userId = options.userId ? String(options.userId).trim() : null;
const isNodeTest = Boolean(process.env.NODE_TEST_CONTEXT);
const backend = String(
options.backend ?? process.env.MINDSPACE_USERDATA_BACKEND ?? (isNodeTest ? 'sqlite' : 'postgres'),
).trim().toLowerCase();
if (backend === 'sqlite' && !isNodeTest) {
throw Object.assign(
new Error('用户私有数据运行时已禁用 SQLite,只允许使用 PostgreSQL'),
{ code: 'sqlite_runtime_disabled' },
);
}
if (backend !== 'postgres' && backend !== 'sqlite') {
throw Object.assign(new Error(`不支持的用户数据后端:${backend}`), { code: 'invalid_userdata_backend' });
}
if (backend === 'postgres') {
if (!userId) throw new Error('PostgreSQL 用户数据空间要求 userId');
return createPostgresUserDataSpaceService({ ...options, userId });
}
const query = typeof options.query === 'function' ? options.query : null;
const sqliteBin = options.sqliteBin?.trim() || process.env.SQLITE_BIN?.trim() || 'sqlite3';
const maxBytes = Number(options.maxBytes ?? process.env.PRIVATE_DATA_MAX_BYTES ?? DEFAULT_MAX_BYTES);
@@ -111,6 +129,11 @@ export function createUserDataSpaceService(options = {}) {
return privateDataDb;
}
function ensureReady() {
ensurePrivateDataDb();
return getInfo();
}
function privateDataSize() {
let total = 0;
for (const file of fs.existsSync(privateDataDir) ? fs.readdirSync(privateDataDir) : []) {
@@ -750,6 +773,7 @@ export function createUserDataSpaceService(options = {}) {
workspaceRoot,
privateDataDir,
privateDataDb,
ensureReady,
ensurePrivateDataDb,
privateDataSize,
getInfo,