@lobehub/chat 1.47.3 → 1.47.4
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/CHANGELOG.md +17 -0
- package/changelog/v1.json +5 -0
- package/next.config.ts +2 -2
- package/package.json +1 -1
- package/src/database/client/db.ts +42 -11
- package/src/database/client/pglite.ts +17 -0
- package/src/database/client/pglite.worker.ts +25 -0
- package/src/database/client/type.ts +6 -0
package/CHANGELOG.md
CHANGED
@@ -2,6 +2,23 @@
|
|
2
2
|
|
3
3
|
# Changelog
|
4
4
|
|
5
|
+
### [Version 1.47.4](https://github.com/lobehub/lobe-chat/compare/v1.47.3...v1.47.4)
|
6
|
+
|
7
|
+
<sup>Released on **2025-01-18**</sup>
|
8
|
+
|
9
|
+
<br/>
|
10
|
+
|
11
|
+
<details>
|
12
|
+
<summary><kbd>Improvements and Fixes</kbd></summary>
|
13
|
+
|
14
|
+
</details>
|
15
|
+
|
16
|
+
<div align="right">
|
17
|
+
|
18
|
+
[](#readme-top)
|
19
|
+
|
20
|
+
</div>
|
21
|
+
|
5
22
|
### [Version 1.47.3](https://github.com/lobehub/lobe-chat/compare/v1.47.2...v1.47.3)
|
6
23
|
|
7
24
|
<sup>Released on **2025-01-18**</sup>
|
package/changelog/v1.json
CHANGED
package/next.config.ts
CHANGED
@@ -165,8 +165,8 @@ const nextConfig: NextConfig = {
|
|
165
165
|
source: '/welcome',
|
166
166
|
},
|
167
167
|
],
|
168
|
-
|
169
|
-
|
168
|
+
// when external packages in dev mode with turbopack, this config will lead to bundle error
|
169
|
+
serverExternalPackages: isProd ? ['@electric-sql/pglite'] : undefined,
|
170
170
|
transpilePackages: ['pdfjs-dist', 'mermaid'],
|
171
171
|
|
172
172
|
webpack(config) {
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@lobehub/chat",
|
3
|
-
"version": "1.47.
|
3
|
+
"version": "1.47.4",
|
4
4
|
"description": "Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.",
|
5
5
|
"keywords": [
|
6
6
|
"framework",
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import
|
1
|
+
import { PgliteDatabase, drizzle } from 'drizzle-orm/pglite';
|
2
2
|
import { Md5 } from 'ts-md5';
|
3
3
|
|
4
4
|
import { ClientDBLoadingProgress, DatabaseLoadingState } from '@/types/clientDB';
|
@@ -28,6 +28,12 @@ export class DatabaseManager {
|
|
28
28
|
private static WASM_CDN_URL =
|
29
29
|
'https://registry.npmmirror.com/@electric-sql/pglite/0.2.13/files/dist/postgres.wasm';
|
30
30
|
|
31
|
+
private static FSBUNDLER_CDN_URL =
|
32
|
+
'https://registry.npmmirror.com/@electric-sql/pglite/0.2.13/files/dist/postgres.data';
|
33
|
+
|
34
|
+
private static VECTOR_CDN_URL =
|
35
|
+
'https://registry.npmmirror.com/@electric-sql/pglite/0.2.13/files/dist/vector.tar.gz';
|
36
|
+
|
31
37
|
private constructor() {}
|
32
38
|
|
33
39
|
static getInstance() {
|
@@ -88,6 +94,12 @@ export class DatabaseManager {
|
|
88
94
|
return WebAssembly.compile(wasmBytes);
|
89
95
|
}
|
90
96
|
|
97
|
+
private fetchFsBundle = async () => {
|
98
|
+
const res = await fetch(DatabaseManager.FSBUNDLER_CDN_URL);
|
99
|
+
|
100
|
+
return await res.blob();
|
101
|
+
};
|
102
|
+
|
91
103
|
// 异步加载 PGlite 相关依赖
|
92
104
|
private async loadDependencies() {
|
93
105
|
const start = Date.now();
|
@@ -100,7 +112,7 @@ export class DatabaseManager {
|
|
100
112
|
PGlite: m.PGlite,
|
101
113
|
})),
|
102
114
|
import('@electric-sql/pglite/vector'),
|
103
|
-
|
115
|
+
this.fetchFsBundle(),
|
104
116
|
];
|
105
117
|
|
106
118
|
let loaded = 0;
|
@@ -125,9 +137,9 @@ export class DatabaseManager {
|
|
125
137
|
});
|
126
138
|
|
127
139
|
// @ts-ignore
|
128
|
-
const [{ PGlite, IdbFs, MemoryFS }, { vector },
|
140
|
+
const [{ PGlite, IdbFs, MemoryFS }, { vector }, fsBundle] = results;
|
129
141
|
|
130
|
-
return { IdbFs, MemoryFS, PGlite,
|
142
|
+
return { IdbFs, MemoryFS, PGlite, fsBundle, vector };
|
131
143
|
}
|
132
144
|
|
133
145
|
// 数据库迁移方法
|
@@ -177,17 +189,34 @@ export class DatabaseManager {
|
|
177
189
|
this.callbacks?.onStateChange?.(DatabaseLoadingState.Initializing);
|
178
190
|
|
179
191
|
// 加载依赖
|
180
|
-
const {
|
192
|
+
const { fsBundle, PGlite, MemoryFS, IdbFs, vector } = await this.loadDependencies();
|
181
193
|
|
182
194
|
// 加载并编译 WASM 模块
|
183
195
|
const wasmModule = await this.loadWasmModule();
|
184
196
|
|
185
|
-
const
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
197
|
+
const { initPgliteWorker } = await import('./pglite');
|
198
|
+
|
199
|
+
let db: typeof PGlite;
|
200
|
+
|
201
|
+
const dbName = 'lobechat';
|
202
|
+
|
203
|
+
// make db as web worker if worker is available
|
204
|
+
if (typeof Worker !== 'undefined') {
|
205
|
+
db = await initPgliteWorker({
|
206
|
+
dbName,
|
207
|
+
fsBundle: fsBundle as Blob,
|
208
|
+
vectorBundlePath: DatabaseManager.VECTOR_CDN_URL,
|
209
|
+
wasmModule,
|
210
|
+
});
|
211
|
+
} else {
|
212
|
+
// in edge runtime or test runtime, we don't have worker
|
213
|
+
db = new PGlite({
|
214
|
+
extensions: { vector },
|
215
|
+
fs: typeof window === 'undefined' ? new MemoryFS(dbName) : new IdbFs(dbName),
|
216
|
+
relaxedDurability: true,
|
217
|
+
wasmModule,
|
218
|
+
});
|
219
|
+
}
|
191
220
|
|
192
221
|
this.dbInstance = drizzle({ client: db, schema });
|
193
222
|
|
@@ -210,6 +239,8 @@ export class DatabaseManager {
|
|
210
239
|
name: error.name,
|
211
240
|
stack: error.stack,
|
212
241
|
});
|
242
|
+
|
243
|
+
console.error(error);
|
213
244
|
throw error;
|
214
245
|
}
|
215
246
|
})();
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import { PGliteWorker } from '@electric-sql/pglite/worker';
|
2
|
+
|
3
|
+
import { InitMeta } from './type';
|
4
|
+
|
5
|
+
export const initPgliteWorker = async (meta: InitMeta) => {
|
6
|
+
const worker = await PGliteWorker.create(
|
7
|
+
new Worker(new URL('pglite.worker.ts', import.meta.url)),
|
8
|
+
{ meta },
|
9
|
+
);
|
10
|
+
|
11
|
+
// 监听 worker 状态变化
|
12
|
+
worker.onLeaderChange(() => {
|
13
|
+
console.log('Worker leader changed, isLeader:', worker?.isLeader);
|
14
|
+
});
|
15
|
+
|
16
|
+
return worker as PGliteWorker;
|
17
|
+
};
|
@@ -0,0 +1,25 @@
|
|
1
|
+
import { worker } from '@electric-sql/pglite/worker';
|
2
|
+
|
3
|
+
import { InitMeta } from './type';
|
4
|
+
|
5
|
+
worker({
|
6
|
+
async init(options) {
|
7
|
+
const { wasmModule, fsBundle, vectorBundlePath, dbName } = options.meta as InitMeta;
|
8
|
+
const { PGlite } = await import('@electric-sql/pglite');
|
9
|
+
|
10
|
+
return new PGlite({
|
11
|
+
dataDir: `idb://${dbName}`,
|
12
|
+
extensions: {
|
13
|
+
vector: {
|
14
|
+
name: 'pgvector',
|
15
|
+
setup: async (pglite, options) => {
|
16
|
+
return { bundlePath: new URL(vectorBundlePath), options };
|
17
|
+
},
|
18
|
+
},
|
19
|
+
},
|
20
|
+
fsBundle,
|
21
|
+
relaxedDurability: true,
|
22
|
+
wasmModule,
|
23
|
+
});
|
24
|
+
},
|
25
|
+
});
|