1
- import type { PgliteDatabase } from 'drizzle-orm/pglite' ;
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
- import ( 'drizzle-orm/pglite' ) ,
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 } , { drizzle } ] = results ;
140
+ const [ { PGlite, IdbFs, MemoryFS } , { vector } , fsBundle ] = results ;
129
141
130
- return { IdbFs, MemoryFS, PGlite, drizzle , vector } ;
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 { PGlite , vector , drizzle , IdbFs, MemoryFS } = await this . loadDependencies ( ) ;
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 db = new PGlite ( {
186
- extensions : { vector } ,
187
- fs : typeof window === 'undefined' ? new MemoryFS ( 'lobechat' ) : new IdbFs ( 'lobechat' ) ,
188
- relaxedDurability : true ,
189
- wasmModule,
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 commit comments