@@ -33,6 +33,8 @@ import {cdn} from "./require.js";
3333// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3434// POSSIBILITY OF SUCH DAMAGE.
3535
36+ let promise ;
37+
3638export class DuckDBClient {
3739 constructor ( db ) {
3840 Object . defineProperties ( this , {
@@ -126,6 +128,9 @@ export class DuckDBClient {
126128 if ( config . query ?. castTimestampToDate === undefined ) {
127129 config = { ...config , query : { ...config . query , castTimestampToDate : true } } ;
128130 }
131+ if ( config . query ?. castBigIntToDouble === undefined ) {
132+ config = { ...config , query : { ...config . query , castBigIntToDouble : true } } ;
133+ }
129134 await db . open ( config ) ;
130135 await Promise . all (
131136 Object . entries ( sources ) . map ( async ( [ name , source ] ) => {
@@ -166,7 +171,7 @@ async function insertFile(database, name, file, options) {
166171 const buffer = await file . arrayBuffer ( ) ;
167172 await database . registerFileBuffer ( file . name , new Uint8Array ( buffer ) ) ;
168173 } else {
169- await database . registerFileURL ( file . name , url ) ;
174+ await database . registerFileURL ( file . name , url , 4 ) ; // duckdb.DuckDBDataProtocol.HTTP
170175 }
171176 const connection = await database . connect ( ) ;
172177 try {
@@ -179,7 +184,7 @@ async function insertFile(database, name, file, options) {
179184 ...options
180185 } ) . catch ( async ( error ) => {
181186 // 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.
183188 if ( error . toString ( ) . includes ( "Could not convert" ) ) {
184189 return await insertUntypedCSV ( connection , file , name ) ;
185190 }
@@ -247,9 +252,9 @@ async function insertArray(database, name, array, options) {
247252 return await insertArrowTable ( database , name , table , options ) ;
248253}
249254
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 ( {
253258 mvp : {
254259 mainModule : `${ cdn } ${ duckdb . resolve ( "dist/duckdb-mvp.wasm" ) } ` ,
255260 mainWorker : `${ cdn } ${ duckdb . resolve ( "dist/duckdb-browser-mvp.worker.js" ) } `
@@ -259,9 +264,15 @@ async function createDuckDB() {
259264 mainWorker : `${ cdn } ${ duckdb . resolve ( "dist/duckdb-browser-eh.worker.js" ) } `
260265 }
261266 } ) ;
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 ) ;
265276 await db . instantiate ( bundle . mainModule ) ;
266277 return db ;
267278}
0 commit comments