@@ -33,6 +33,8 @@ import {cdn} from "./require.js";
33
33
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34
34
// POSSIBILITY OF SUCH DAMAGE.
35
35
36
+ let promise ;
37
+
36
38
export class DuckDBClient {
37
39
constructor ( db ) {
38
40
Object . defineProperties ( this , {
@@ -126,6 +128,9 @@ export class DuckDBClient {
126
128
if ( config . query ?. castTimestampToDate === undefined ) {
127
129
config = { ...config , query : { ...config . query , castTimestampToDate : true } } ;
128
130
}
131
+ if ( config . query ?. castBigIntToDouble === undefined ) {
132
+ config = { ...config , query : { ...config . query , castBigIntToDouble : true } } ;
133
+ }
129
134
await db . open ( config ) ;
130
135
await Promise . all (
131
136
Object . entries ( sources ) . map ( async ( [ name , source ] ) => {
@@ -166,7 +171,7 @@ async function insertFile(database, name, file, options) {
166
171
const buffer = await file . arrayBuffer ( ) ;
167
172
await database . registerFileBuffer ( file . name , new Uint8Array ( buffer ) ) ;
168
173
} else {
169
- await database . registerFileURL ( file . name , url ) ;
174
+ await database . registerFileURL ( file . name , url , 4 ) ; // duckdb.DuckDBDataProtocol.HTTP
170
175
}
171
176
const connection = await database . connect ( ) ;
172
177
try {
@@ -179,7 +184,7 @@ async function insertFile(database, name, file, options) {
179
184
...options
180
185
} ) . catch ( async ( error ) => {
181
186
// If initial attempt to insert CSV resulted in a conversion
182
- // error, try again, this time treating all columns as strings.
187
+ // error, try again, this time treating all columns as strings.
183
188
if ( error . toString ( ) . includes ( "Could not convert" ) ) {
184
189
return await insertUntypedCSV ( connection , file , name ) ;
185
190
}
@@ -247,9 +252,9 @@ async function insertArray(database, name, array, options) {
247
252
return await insertArrowTable ( database , name , table , options ) ;
248
253
}
249
254
250
- async function createDuckDB ( ) {
251
- const duck = await import ( `${ cdn } ${ duckdb . resolve ( ) } ` ) ;
252
- const bundle = await duck . selectBundle ( {
255
+ async function loadDuckDB ( ) {
256
+ const module = await import ( `${ cdn } ${ duckdb . resolve ( ) } ` ) ;
257
+ const bundle = await module . selectBundle ( {
253
258
mvp : {
254
259
mainModule : `${ cdn } ${ duckdb . resolve ( "dist/duckdb-mvp.wasm" ) } ` ,
255
260
mainWorker : `${ cdn } ${ duckdb . resolve ( "dist/duckdb-browser-mvp.worker.js" ) } `
@@ -259,9 +264,15 @@ async function createDuckDB() {
259
264
mainWorker : `${ cdn } ${ duckdb . resolve ( "dist/duckdb-browser-eh.worker.js" ) } `
260
265
}
261
266
} ) ;
262
- const logger = new duck . ConsoleLogger ( ) ;
263
- const worker = await duck . createWorker ( bundle . mainWorker ) ;
264
- const db = new duck . AsyncDuckDB ( logger , worker ) ;
267
+ const logger = new module . ConsoleLogger ( ) ;
268
+ return { module, bundle, logger} ;
269
+ }
270
+
271
+ async function createDuckDB ( ) {
272
+ if ( promise === undefined ) promise = loadDuckDB ( ) ;
273
+ const { module, bundle, logger} = await promise ;
274
+ const worker = await module . createWorker ( bundle . mainWorker ) ;
275
+ const db = new module . AsyncDuckDB ( logger , worker ) ;
265
276
await db . instantiate ( bundle . mainModule ) ;
266
277
return db ;
267
278
}
0 commit comments