@sqlrooms/duckdb 0.29.0-rc.8 → 0.29.0-rc.9

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.
@@ -1 +1 @@
1
- {"version":3,"file":"DuckDbSlice.js","sourceRoot":"","sources":["../src/DuckDbSlice.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createDbSchemaTrees,\n DataTable,\n DbSchemaNode,\n DuckDbConnector,\n escapeVal,\n getColValAsNumber,\n isQualifiedTableName,\n joinStatements,\n makeQualifiedTableName,\n parseQualifiedSqlIdentifier,\n QualifiedTableName,\n QueryHandle,\n SchemaWithTables,\n separateLastStatement,\n} from '@sqlrooms/duckdb-core';\nimport {\n BaseRoomStoreState,\n createSlice,\n registerCommandsForOwner,\n RoomCommand,\n unregisterCommandsForOwner,\n useBaseRoomStore,\n} from '@sqlrooms/room-store';\nimport * as arrow from 'apache-arrow';\nimport deepEquals from 'fast-deep-equal';\nimport {produce} from 'immer';\nimport {z} from 'zod';\nimport {StateCreator} from 'zustand';\nimport {createWasmDuckDbConnector} from './connectors/createDuckDbConnector';\nimport {\n loadSchemaCatalog,\n LoadSchemaCatalogFilterFunction,\n loadTableSchemas,\n LoadTableSchemasFilter,\n LoadTableSchemasFilterFunction,\n} from './loadTableSchemas';\n\nconst DUCKDB_COMMAND_OWNER = '@sqlrooms/duckdb';\nconst INTERNAL_SQLROOMS_PREFIX = '__sqlrooms';\n\n/** DuckDB's temporary database catalog; never show in the default data source tree. */\nconst DUCKDB_TEMP_DATABASE = 'temp';\n\n/**\n * Default predicate: which tables/schemas/databases appear in the data source panel.\n * Hides `__sqlrooms_*` names and DuckDB's `temp` database.\n */\nexport const defaultLoadTableSchemasFilter: LoadTableSchemasFilterFunction = (\n table: QualifiedTableName,\n): boolean => {\n if (\n table.table?.startsWith(INTERNAL_SQLROOMS_PREFIX) ||\n table.database?.startsWith(INTERNAL_SQLROOMS_PREFIX) ||\n table.schema?.startsWith(INTERNAL_SQLROOMS_PREFIX)\n ) {\n return false;\n }\n if (table.database === DUCKDB_TEMP_DATABASE) {\n return false;\n }\n return true;\n};\n\n/**\n * Factory returning {@link defaultLoadTableSchemasFilter}.\n * Hides `__sqlrooms_*` names and DuckDB's `temp` database.\n * Apps can pass {@link CreateDuckDbSliceProps.loadTableSchemasFilter} to add more rules.\n */\nexport function createDefaultLoadTableSchemasFilter(): LoadTableSchemasFilterFunction {\n return defaultLoadTableSchemasFilter;\n}\n\n/**\n * Default catalog visibility predicate for the data source panel.\n * Hides SQLRooms internal objects and DuckDB's temporary database catalog.\n */\nexport const defaultLoadSchemaCatalogFilter: LoadSchemaCatalogFilterFunction = (\n entry,\n): boolean => {\n switch (entry.type) {\n case 'database':\n return (\n !entry.database.startsWith(INTERNAL_SQLROOMS_PREFIX) &&\n entry.database !== DUCKDB_TEMP_DATABASE\n );\n case 'schema':\n return (\n !entry.database.startsWith(INTERNAL_SQLROOMS_PREFIX) &&\n entry.database !== DUCKDB_TEMP_DATABASE &&\n !entry.schema.startsWith(INTERNAL_SQLROOMS_PREFIX)\n );\n case 'table':\n return defaultLoadTableSchemasFilter(entry.table);\n }\n};\n\nconst DropTableCommandInput = z.object({\n tableName: z.string().describe('Name of the table to drop.'),\n});\ntype DropTableCommandInput = z.infer<typeof DropTableCommandInput>;\n\nconst CreateTableFromQueryCommandInput = z.object({\n tableName: z.string().describe('Name of the table or view to create.'),\n query: z.string().describe('SQL query used to populate the table/view.'),\n replace: z\n .boolean()\n .optional()\n .default(true)\n .describe('Whether to replace existing table/view with the same name.'),\n view: z\n .boolean()\n .optional()\n .default(false)\n .describe('Whether to create a view instead of a table.'),\n temp: z\n .boolean()\n .optional()\n .default(false)\n .describe('Whether to create a temporary object.'),\n allowMultipleStatements: z\n .boolean()\n .optional()\n .default(false)\n .describe('Allow multiple SQL statements where the final one is SELECT.'),\n});\n\ntype CreateTableFromQueryCommandInput = z.infer<\n typeof CreateTableFromQueryCommandInput\n>;\n\n/**\n * State and actions for the DuckDB slice\n */\nexport type DuckDbSliceState = {\n db: {\n /**\n * The DuckDB connector instance\n */\n connector: DuckDbConnector;\n /**\n * @deprecated We shouldn't limit the schema to a single one.\n */\n schema: string;\n\n currentSchema: string | undefined;\n currentDatabase: string | undefined;\n\n /**\n * Cache of refreshed table schemas\n */\n tables: DataTable[];\n /**\n * Cache of row counts for tables\n */\n tableRowCounts: {[tableName: string]: number};\n /**\n * Cache of schema trees for tables\n */\n schemaTrees?: DbSchemaNode[];\n /**\n * Cache of currently running query handles.\n * This is only used for running queries to deduplicate them (especially for useSql),\n * the cache is cleared when the query is completed.\n */\n queryCache: {[key: string]: QueryHandle};\n /**\n * Whether the table schemas are being refreshed\n */\n isRefreshingTableSchemas: boolean;\n\n /**\n * Set a new DuckDB connector\n */\n setConnector: (connector: DuckDbConnector) => void;\n\n /**\n * Initialize the connector (creates a WasmDuckDbConnector if none exists)\n */\n initialize: () => Promise<void>;\n\n /**\n * Close and clean up the connector\n */\n destroy: () => Promise<void>;\n\n /**\n * Add a table to the room.\n * @param tableName - The name of the table to add.\n * @param data - The data to add to the table: an arrow table or an array of records.\n * @returns A promise that resolves to the table that was added.\n */\n addTable(\n tableName: string | QualifiedTableName,\n data: arrow.Table | Record<string, unknown>[],\n ): Promise<DataTable>;\n\n /**\n * Load the schemas of the tables in the database.\n */\n loadTableSchemas(filter?: LoadTableSchemasFilter): Promise<DataTable[]>;\n\n /**\n * @deprecated Use findTable instead\n */\n getTable(tableName: string): DataTable | undefined;\n\n /**\n * @internal Avoid using this directly, it's for internal use.\n */\n setTableRowCount(\n tableName: string | QualifiedTableName,\n rowCount: number,\n ): void;\n\n /**\n * Find a table by reference in the last refreshed table schemas.\n * String references are parsed as SQL identifiers, so dots separate\n * database/schema/table segments unless quoted. If no schema or database is\n * provided, the table is resolved in the current schema and database from\n * the last schema refresh.\n * @param tableName - The table reference to find.\n * @returns The table or undefined if not found.\n */\n findTable(tableName: string | QualifiedTableName): DataTable | undefined;\n\n /**\n * @deprecated Use findTable instead\n */\n findTableByName(\n tableName: string | QualifiedTableName,\n ): DataTable | undefined;\n\n /**\n * Refresh table schemas from the database.\n * @returns A promise that resolves to the updated tables.\n */\n refreshTableSchemas(): Promise<DataTable[]>;\n /**\n * Get the connector. If it's not initialized, it will be initialized.\n */\n getConnector: () => Promise<DuckDbConnector>;\n\n /**\n * @deprecated Use .loadTableRowCount() instead\n */\n getTableRowCount: (table: string, schema?: string) => Promise<number>;\n\n /**\n * Load the row count of a table\n */\n loadTableRowCount: (\n tableName: string | QualifiedTableName,\n ) => Promise<number>;\n\n /**\n * Execute a query with query handle (not result) caching and deduplication\n * @param query - The SQL query to execute\n * @returns The QueryHandle for the query or null if disabled\n */\n executeSql: (\n query: string,\n version?: number,\n ) => Promise<QueryHandle | null>;\n\n /**\n * @deprecated Use .tables or .loadTableSchemas() instead\n */\n getTables: (schema?: string) => Promise<string[]>;\n\n /**\n * @deprecated Use .loadTableSchemas() instead\n */\n getTableSchema: (\n tableName: string,\n schema?: string,\n ) => Promise<DataTable | undefined>;\n\n /**\n * @deprecated Use .tables or .loadTableSchemas() instead\n */\n getTableSchemas: (schema?: string) => Promise<DataTable[]>;\n\n /**\n * Check if a table exists\n */\n checkTableExists: (\n tableName: string | QualifiedTableName,\n ) => Promise<boolean>;\n\n /**\n * Delete a table or view with optional schema and database.\n * @param tableName - The name of the relation to delete (qualified or plain)\n */\n dropRelation: (tableName: string | QualifiedTableName) => Promise<void>;\n\n /**\n * Delete a table with optional schema and database.\n * @param tableName - The name of the table to delete (qualified or plain)\n */\n dropTable: (tableName: string | QualifiedTableName) => Promise<void>;\n\n /**\n * Create a table or view from a query.\n * @param tableName - The name of the table/view to create.\n * @param query - The query to create the table/view from.\n * @param options - Creation options.\n * @returns The table/view name and rowCount (undefined for views).\n */\n createTableFromQuery: (\n tableName: string | QualifiedTableName,\n query: string,\n options?: {\n replace?: boolean;\n temp?: boolean;\n view?: boolean;\n allowMultipleStatements?: boolean;\n abortSignal?: AbortSignal;\n },\n ) => Promise<{\n tableName: string | QualifiedTableName;\n rowCount: number | undefined;\n }>;\n\n /**\n * Parse a SQL SELECT statement to JSON\n * @param sql - The SQL SELECT statement to parse.\n * @returns A promise that resolves to the parsed JSON.\n */\n sqlSelectToJson: (sql: string) => Promise<\n | {\n error: true;\n error_type: string;\n error_message: string;\n error_subtype: string;\n position: string;\n }\n | {\n error: false;\n statements: {\n node: {\n from_table: {\n alias: string;\n show_type: string;\n table_name: string;\n };\n select_list: Record<string, unknown>[];\n type: string;\n };\n }[];\n }\n >;\n };\n};\n\nexport type CreateDuckDbSliceProps = {\n connector?: DuckDbConnector;\n /**\n * Optional table visibility filter.\n * Defaults to {@link createDefaultLoadTableSchemasFilter}.\n */\n loadTableSchemasFilter?: LoadTableSchemasFilterFunction | null;\n /**\n * Optional catalog visibility filter for the data source panel.\n * Defaults to {@link defaultLoadSchemaCatalogFilter}. When omitted, custom\n * table filters still apply to table entries while schemas/databases use the default.\n */\n loadSchemaCatalogFilter?: LoadSchemaCatalogFilterFunction | null;\n};\n\n/**\n * Create a DuckDB slice for managing the connector\n */\nexport function createDuckDbSlice({\n connector = createWasmDuckDbConnector(),\n loadTableSchemasFilter = defaultLoadTableSchemasFilter,\n loadSchemaCatalogFilter,\n}: CreateDuckDbSliceProps = {}): StateCreator<DuckDbSliceState> {\n let refreshPromise: Promise<DataTable[]> | null = null;\n let pendingSchemaRefresh = false;\n const effectiveSchemaCatalogFilter =\n loadSchemaCatalogFilter ??\n (loadTableSchemasFilter === null\n ? null\n : (((entry) => {\n if (entry.type === 'table') {\n return loadTableSchemasFilter\n ? loadTableSchemasFilter(entry.table)\n : true;\n }\n return defaultLoadSchemaCatalogFilter(entry);\n }) satisfies LoadSchemaCatalogFilterFunction));\n return createSlice<DuckDbSliceState, BaseRoomStoreState & DuckDbSliceState>(\n (set, get, store) => {\n /**\n * Internal helper to load a table schema by exact name, bypassing the visibility filter.\n * Used when performing exact lookups (e.g., checking if a specific table exists).\n */\n const loadTableSchemaByName = async (\n tableName: string | QualifiedTableName,\n ): Promise<DataTable | undefined> => {\n const qualifiedName = isQualifiedTableName(tableName)\n ? tableName\n : makeQualifiedTableName({table: tableName});\n const connector = await get().db.getConnector();\n const [table] = await loadTableSchemas(connector, qualifiedName);\n return table;\n };\n\n return {\n db: {\n connector, // Will be initialized during init\n schema: 'main', // TODO: remove schema, we should not limit the schema to a single one.\n currentSchema: undefined,\n currentDatabase: undefined,\n isRefreshingTableSchemas: false,\n tables: [],\n tableRowCounts: {},\n schemaTrees: undefined,\n queryCache: {},\n\n setConnector: (connector: DuckDbConnector) => {\n set(\n produce((state) => {\n state.config.dataSources = [];\n state.db.connector = connector;\n }),\n );\n },\n\n initialize: async () => {\n await get().db.connector.initialize();\n // No await here, we want to continue initializing the room even\n // if the table schemas are not refreshed yet\n get().db.refreshTableSchemas();\n registerCommandsForOwner(\n store,\n DUCKDB_COMMAND_OWNER,\n createDuckDbCommands(),\n );\n },\n\n getConnector: async () => {\n await get().db.connector.initialize();\n return get().db.connector;\n },\n\n destroy: async () => {\n unregisterCommandsForOwner(store, DUCKDB_COMMAND_OWNER);\n // Wait for any in-flight refreshTableSchemas() to finish before\n // destroying the connector. initialize() fires it without await,\n // so it may still be querying the native DuckDB instance; tearing\n // that down mid-flight causes a use-after-free segfault.\n if (refreshPromise) {\n try {\n await refreshPromise;\n } catch {\n // ignore – we're shutting down\n }\n }\n try {\n if (get().db.connector) {\n await get().db.connector.destroy();\n }\n } catch (err) {\n console.error('Error during DuckDB shutdown:', err);\n }\n },\n\n /**\n * Creates a table or view from a SQL query.\n * @param tableName - Name of the table/view to create\n * @param query - SQL query (must be a SELECT statement, or multiple statements ending with a SELECT when allowMultipleStatements is true)\n * @param options - Creation options\n * @param options.replace - If true, uses CREATE OR REPLACE (default: true)\n * @param options.temp - If true, creates a temporary table/view (default: false)\n * @param options.view - If true, creates a view instead of a table (default: false)\n * @param options.allowMultipleStatements - If true, allows multiple statements where preceding statements are executed first and the final SELECT is wrapped in CREATE TABLE/VIEW (default: false)\n * @returns Object with tableName and rowCount (rowCount is undefined for views)\n */\n async createTableFromQuery(\n tableName: string | QualifiedTableName,\n query: string,\n options?: {\n replace?: boolean;\n temp?: boolean;\n view?: boolean;\n allowMultipleStatements?: boolean;\n abortSignal?: AbortSignal;\n },\n ) {\n const {\n replace = true,\n temp = false,\n view = false,\n allowMultipleStatements = false,\n abortSignal,\n } = options || {};\n\n // For temp tables/views, DuckDB requires the \"temp\" database\n const baseQualifiedName = isQualifiedTableName(tableName)\n ? tableName\n : makeQualifiedTableName({table: tableName});\n\n const qualifiedName = temp\n ? makeQualifiedTableName({\n table: baseQualifiedName.table,\n schema: baseQualifiedName.schema,\n database: 'temp',\n })\n : baseQualifiedName;\n\n const connector = await get().db.getConnector();\n\n const {precedingStatements, lastStatement} =\n separateLastStatement(query);\n\n if (!allowMultipleStatements && precedingStatements.length > 0) {\n throw new Error(\n 'Query must contain exactly one statement (set allowMultipleStatements: true to execute multiple statements)',\n );\n }\n\n // The last statement must be a SELECT\n const parsedQuery = await get().db.sqlSelectToJson(lastStatement);\n if (parsedQuery.error) {\n throw new Error(\n 'Final statement must be a valid SELECT statement',\n );\n }\n\n // Build CREATE statement with options\n const createKeyword = [\n 'CREATE',\n replace ? 'OR REPLACE' : '',\n temp ? 'TEMP' : '',\n view ? 'VIEW' : 'TABLE',\n ]\n .filter(Boolean)\n .join(' ');\n\n const createStatement = `${createKeyword} ${qualifiedName} AS (\n ${lastStatement}\n )`;\n\n const fullQuery = joinStatements(\n precedingStatements,\n createStatement,\n );\n const result = await connector.query(fullQuery, {\n signal: abortSignal,\n });\n // Views don't have a row count, only tables do\n const rowCount = view ? undefined : getColValAsNumber(result);\n return {tableName, rowCount};\n },\n\n /**\n * @deprecated Use .tables or .loadTableSchemas() instead\n */\n async getTables(schema) {\n const tableSchemas = await get().db.loadTableSchemas({schema});\n return tableSchemas.map((t) => t.table.table);\n },\n\n /**\n * @deprecated Use .loadTableSchemas() instead\n */\n async getTableSchema(tableName: string, schema = 'main') {\n const newLocal = await get().db.loadTableSchemas({\n schema,\n table: tableName,\n });\n return newLocal[0];\n },\n\n /**\n * @deprecated Use .loadTableRowCount() instead\n */\n async getTableRowCount(table, schema = 'main') {\n return get().db.loadTableRowCount({table, schema});\n },\n\n async loadTableRowCount(tableName: string | QualifiedTableName) {\n const {schema, database, table} =\n typeof tableName === 'string'\n ? {table: tableName}\n : tableName || {};\n const connector = await get().db.getConnector();\n const result = await connector.query(\n `SELECT COUNT(*) FROM ${makeQualifiedTableName({\n schema,\n database,\n table,\n })}`,\n );\n return getColValAsNumber(result);\n },\n\n /**\n * @deprecated Use .loadTableSchemas() instead\n */\n async getTableSchemas(schema) {\n return await get().db.loadTableSchemas({schema});\n },\n\n async loadTableSchemas(\n filter?: LoadTableSchemasFilter,\n ): Promise<DataTable[]> {\n const connector = await get().db.getConnector();\n return loadTableSchemas(connector, {\n ...filter,\n filterFunction: loadTableSchemasFilter,\n });\n },\n\n async checkTableExists(tableName: string | QualifiedTableName) {\n const table = await loadTableSchemaByName(tableName);\n return Boolean(table);\n },\n\n async dropRelation(tableName): Promise<void> {\n const connector = await get().db.getConnector();\n const qualifiedTable = isQualifiedTableName(tableName)\n ? tableName\n : makeQualifiedTableName({table: tableName});\n const table =\n get().db.findTable(qualifiedTable) ??\n (await loadTableSchemaByName(qualifiedTable));\n const isView = table?.isView;\n if (isView) {\n await connector.query(`DROP VIEW IF EXISTS ${qualifiedTable};`);\n } else {\n await connector.query(`DROP TABLE IF EXISTS ${qualifiedTable};`);\n }\n get().db.refreshTableSchemas();\n },\n\n async dropTable(tableName): Promise<void> {\n const connector = await get().db.getConnector();\n const qualifiedTable = isQualifiedTableName(tableName)\n ? tableName\n : makeQualifiedTableName({table: tableName});\n const table =\n get().db.findTable(qualifiedTable) ??\n (await loadTableSchemaByName(qualifiedTable));\n\n if (table?.isView) {\n throw new Error(\n `\"${qualifiedTable}\" is a view. Use dropRelation() to remove views.`,\n );\n }\n\n await connector.query(`DROP TABLE IF EXISTS ${qualifiedTable};`);\n get().db.refreshTableSchemas();\n },\n\n async addTable(tableName, data) {\n const qualifiedName = isQualifiedTableName(tableName)\n ? tableName\n : makeQualifiedTableName({table: tableName});\n\n const {db} = get();\n if (data instanceof arrow.Table) {\n // TODO: make sure the table is replaced\n await db.connector.loadArrow(data, qualifiedName.toString());\n } else {\n await db.connector.loadObjects(data, qualifiedName.toString(), {\n replace: true,\n });\n }\n const newTable = await loadTableSchemaByName(qualifiedName);\n if (!newTable) {\n throw new Error('Failed to add table');\n }\n set((state) =>\n produce(state, (draft) => {\n draft.db.tables.push(newTable);\n }),\n );\n get().db.refreshTableSchemas();\n return newTable;\n },\n\n async setTableRowCount(tableName, rowCount) {\n const qualifiedName = isQualifiedTableName(tableName)\n ? tableName\n : makeQualifiedTableName({table: tableName});\n set((state) =>\n produce(state, (draft) => {\n draft.db.tableRowCounts[qualifiedName.toString()] = rowCount;\n }),\n );\n },\n\n getTable(tableName) {\n return get().db.findTable(tableName);\n },\n\n findTable(tableName: string | QualifiedTableName) {\n const {currentSchema, currentDatabase, tables} = get().db;\n const findMatchingTable = ({\n table,\n schema,\n database,\n }: Partial<QualifiedTableName>) =>\n table\n ? tables.find(\n (t) =>\n t.table.table === table &&\n (!schema || t.table.schema === schema) &&\n (!database || t.table.database === database),\n )\n : undefined;\n\n const {table, schema, database} = {\n schema: currentSchema,\n database: currentDatabase,\n ...(typeof tableName === 'string'\n ? (parseQualifiedSqlIdentifier(tableName) ?? {})\n : tableName),\n };\n return findMatchingTable({table, schema, database});\n },\n\n findTableByName(tableName: string | QualifiedTableName) {\n return get().db.findTable(tableName);\n },\n\n async refreshTableSchemas(): Promise<DataTable[]> {\n if (refreshPromise) {\n pendingSchemaRefresh = true;\n return refreshPromise;\n }\n set((state) =>\n produce(state, (draft) => {\n draft.db.isRefreshingTableSchemas = true;\n }),\n );\n refreshPromise = (async () => {\n try {\n let schemasWithTables: SchemaWithTables[] = [];\n do {\n pendingSchemaRefresh = false;\n const connector = await get().db.getConnector();\n const result = await connector.query(\n `SELECT current_schema() AS schema, current_database() AS database`,\n );\n set((state) =>\n produce(state, (draft) => {\n draft.db.currentSchema = result\n .getChild('schema')\n ?.get(0);\n draft.db.currentDatabase = result\n .getChild('database')\n ?.get(0);\n }),\n );\n schemasWithTables = await loadSchemaCatalog(connector, {\n filterFunction: effectiveSchemaCatalogFilter,\n });\n } while (pendingSchemaRefresh);\n\n const newTables = schemasWithTables.flatMap((s) => s.tables);\n const currentTables = get().db.tables;\n const currentSchemaTrees = get().db.schemaTrees;\n const newSchemaTrees = createDbSchemaTrees(schemasWithTables);\n\n if (\n !deepEquals(newTables, currentTables) ||\n !deepEquals(newSchemaTrees, currentSchemaTrees)\n ) {\n set((state) =>\n produce(state, (draft) => {\n draft.db.tables = newTables;\n draft.db.schemaTrees = newSchemaTrees;\n }),\n );\n }\n return newTables;\n } catch (err) {\n get().room.captureException(err);\n return [];\n } finally {\n refreshPromise = null;\n set((state) =>\n produce(state, (draft) => {\n draft.db.isRefreshingTableSchemas = false;\n }),\n );\n }\n })();\n return refreshPromise;\n },\n\n async sqlSelectToJson(sql: string) {\n const connector = await get().db.getConnector();\n const parsedQuery = (\n await connector.query(\n `SELECT json_serialize_sql(${escapeVal(sql)})`,\n )\n )\n .getChildAt(0)\n ?.get(0);\n return JSON.parse(parsedQuery);\n },\n\n async executeSql(query: string): Promise<QueryHandle | null> {\n // Create a unique key for this query\n const queryKey = `${query}`;\n const connector = await get().db.getConnector();\n\n // Check if we already have a cached query for this key\n const existingQuery = get().db.queryCache[queryKey];\n if (existingQuery) {\n return existingQuery;\n }\n\n const queryHandle = connector.query(query);\n // Cache the query handle immediately\n set((state) =>\n produce(state, (draft) => {\n draft.db.queryCache[queryKey] = queryHandle;\n }),\n );\n\n queryHandle.result.finally(() => {\n // remove from cache after completion\n set((state) =>\n produce(state, (draft) => {\n delete draft.db.queryCache[queryKey];\n }),\n );\n });\n\n return queryHandle;\n },\n },\n };\n },\n );\n}\n\ntype DuckDbCommandStoreState = BaseRoomStoreState & DuckDbSliceState;\n\nfunction createDuckDbCommands(): RoomCommand<DuckDbCommandStoreState>[] {\n return [\n {\n id: 'db.refresh-table-schemas',\n name: 'Refresh table schemas',\n description: 'Reload table and schema metadata from DuckDB',\n group: 'Database',\n keywords: ['duckdb', 'database', 'refresh', 'tables', 'schemas'],\n metadata: {\n readOnly: true,\n idempotent: true,\n riskLevel: 'low',\n },\n isEnabled: ({getState}) => !getState().db.isRefreshingTableSchemas,\n execute: async ({getState}) => {\n await getState().db.refreshTableSchemas();\n return {\n success: true,\n commandId: 'db.refresh-table-schemas',\n message: 'Table schemas refreshed.',\n };\n },\n },\n {\n id: 'db.drop-table',\n name: 'Drop relation',\n description: 'Drop a table or view from DuckDB by name',\n group: 'Database',\n keywords: [\n 'duckdb',\n 'database',\n 'drop',\n 'table',\n 'view',\n 'relation',\n 'delete',\n ],\n inputSchema: DropTableCommandInput,\n inputDescription: 'Provide a tableName to remove from DuckDB.',\n metadata: {\n readOnly: false,\n idempotent: true,\n riskLevel: 'high',\n requiresConfirmation: true,\n },\n validateInput: async (input, {getState}) => {\n const {tableName} = input as DropTableCommandInput;\n const exists = await getState().db.checkTableExists(tableName);\n if (!exists) {\n throw new Error(`Table \"${tableName}\" does not exist.`);\n }\n },\n execute: async ({getState}, input) => {\n const {tableName} = input as DropTableCommandInput;\n await getState().db.dropRelation(tableName);\n return {\n success: true,\n commandId: 'db.drop-table',\n message: `Dropped relation \"${tableName}\".`,\n };\n },\n },\n {\n id: 'db.create-table-from-query',\n name: 'Create table from query',\n description: 'Create a table or view from a SQL query',\n group: 'Database',\n keywords: ['duckdb', 'database', 'create', 'table', 'view', 'query'],\n inputSchema: CreateTableFromQueryCommandInput,\n inputDescription:\n 'Provide tableName and query, with optional replace/view/temp flags.',\n metadata: {\n readOnly: false,\n idempotent: false,\n riskLevel: 'medium',\n },\n validateInput: (input) => {\n const {query} = input as CreateTableFromQueryCommandInput;\n if (!query.trim()) {\n throw new Error('Query cannot be empty.');\n }\n },\n execute: async ({getState}, input) => {\n const {tableName, query, replace, view, temp, allowMultipleStatements} =\n input as CreateTableFromQueryCommandInput;\n const result = await getState().db.createTableFromQuery(\n tableName,\n query,\n {\n replace,\n view,\n temp,\n allowMultipleStatements,\n },\n );\n await getState().db.refreshTableSchemas();\n return {\n success: true,\n commandId: 'db.create-table-from-query',\n message: `Created ${view ? 'view' : 'table'} \"${tableName}\".`,\n data: result,\n };\n },\n },\n ];\n}\n\n/**\n * @internal\n * Select values from the room store that includes the DuckDB slice.\n *\n * This is a typed wrapper around `useBaseRoomStore` that narrows the\n * state to `RoomStateWithDuckDb` so selectors can access `db` safely.\n *\n * @typeParam T - The selected slice of state returned by the selector\n * @param selector - Function that selects a value from the store state\n * @returns The selected value of type `T`\n */\nexport function useStoreWithDuckDb<T>(\n selector: (state: BaseRoomStoreState & DuckDbSliceState) => T,\n): T {\n return useBaseRoomStore<DuckDbSliceState, T>((state) => selector(state));\n}\n"]}
1
+ {"version":3,"file":"DuckDbSlice.js","sourceRoot":"","sources":["../src/DuckDbSlice.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createDbSchemaTrees,\n DataTable,\n DbSchemaNode,\n DuckDbConnector,\n escapeVal,\n getColValAsNumber,\n isQualifiedTableName,\n joinStatements,\n makeQualifiedTableName,\n parseQualifiedSqlIdentifier,\n QualifiedTableName,\n QueryHandle,\n SchemaWithTables,\n separateLastStatement,\n} from '@sqlrooms/duckdb-core';\nimport {\n BaseRoomStoreState,\n createSlice,\n registerCommandsForOwner,\n RoomCommand,\n unregisterCommandsForOwner,\n useBaseRoomStore,\n} from '@sqlrooms/room-store';\nimport * as arrow from 'apache-arrow';\nimport deepEquals from 'fast-deep-equal';\nimport {produce} from 'immer';\nimport {z} from 'zod';\nimport {StateCreator} from 'zustand';\nimport {createWasmDuckDbConnector} from './connectors/createDuckDbConnector';\nimport {\n loadSchemaCatalog,\n LoadSchemaCatalogFilterFunction,\n loadTableSchemas,\n LoadTableSchemasFilter,\n LoadTableSchemasFilterFunction,\n} from './loadTableSchemas';\n\nconst DUCKDB_COMMAND_OWNER = '@sqlrooms/duckdb';\nconst INTERNAL_SQLROOMS_PREFIX = '__sqlrooms';\n\n/** DuckDB's temporary database catalog; never show in the default data source tree. */\nconst DUCKDB_TEMP_DATABASE = 'temp';\n\n/**\n * Default predicate: which tables/schemas/databases appear in the data source panel.\n * Hides `__sqlrooms_*` names and DuckDB's `temp` database.\n */\nexport const defaultLoadTableSchemasFilter: LoadTableSchemasFilterFunction = (\n table: QualifiedTableName,\n): boolean => {\n if (\n table.table.startsWith(INTERNAL_SQLROOMS_PREFIX) ||\n table.database?.startsWith(INTERNAL_SQLROOMS_PREFIX) ||\n table.schema?.startsWith(INTERNAL_SQLROOMS_PREFIX)\n ) {\n return false;\n }\n if (table.database === DUCKDB_TEMP_DATABASE) {\n return false;\n }\n return true;\n};\n\n/**\n * Factory returning {@link defaultLoadTableSchemasFilter}.\n * Hides `__sqlrooms_*` names and DuckDB's `temp` database.\n * Apps can pass {@link CreateDuckDbSliceProps.loadTableSchemasFilter} to add more rules.\n */\nexport function createDefaultLoadTableSchemasFilter(): LoadTableSchemasFilterFunction {\n return defaultLoadTableSchemasFilter;\n}\n\n/**\n * Default catalog visibility predicate for the data source panel.\n * Hides SQLRooms internal objects and DuckDB's temporary database catalog.\n */\nexport const defaultLoadSchemaCatalogFilter: LoadSchemaCatalogFilterFunction = (\n entry,\n): boolean => {\n switch (entry.type) {\n case 'database':\n return (\n !entry.database.startsWith(INTERNAL_SQLROOMS_PREFIX) &&\n entry.database !== DUCKDB_TEMP_DATABASE\n );\n case 'schema':\n return (\n !entry.database.startsWith(INTERNAL_SQLROOMS_PREFIX) &&\n entry.database !== DUCKDB_TEMP_DATABASE &&\n !entry.schema.startsWith(INTERNAL_SQLROOMS_PREFIX)\n );\n case 'table':\n return defaultLoadTableSchemasFilter(entry.table);\n }\n};\n\nconst DropTableCommandInput = z.object({\n tableName: z.string().describe('Name of the table to drop.'),\n});\ntype DropTableCommandInput = z.infer<typeof DropTableCommandInput>;\n\nconst CreateTableFromQueryCommandInput = z.object({\n tableName: z.string().describe('Name of the table or view to create.'),\n query: z.string().describe('SQL query used to populate the table/view.'),\n replace: z\n .boolean()\n .optional()\n .default(true)\n .describe('Whether to replace existing table/view with the same name.'),\n view: z\n .boolean()\n .optional()\n .default(false)\n .describe('Whether to create a view instead of a table.'),\n temp: z\n .boolean()\n .optional()\n .default(false)\n .describe('Whether to create a temporary object.'),\n allowMultipleStatements: z\n .boolean()\n .optional()\n .default(false)\n .describe('Allow multiple SQL statements where the final one is SELECT.'),\n});\n\ntype CreateTableFromQueryCommandInput = z.infer<\n typeof CreateTableFromQueryCommandInput\n>;\n\n/**\n * State and actions for the DuckDB slice\n */\nexport type DuckDbSliceState = {\n db: {\n /**\n * The DuckDB connector instance\n */\n connector: DuckDbConnector;\n /**\n * @deprecated We shouldn't limit the schema to a single one.\n */\n schema: string;\n\n currentSchema: string | undefined;\n currentDatabase: string | undefined;\n\n /**\n * Create a context-aware qualified table name.\n *\n * String inputs are treated as table identifier names, not SQL references;\n * use findTable() when resolving an existing table reference.\n */\n qualifyTableName(\n tableName: string | QualifiedTableNameInput,\n ): QualifiedTableName;\n\n /**\n * Cache of refreshed table schemas\n */\n tables: DataTable[];\n /**\n * Cache of row counts for tables\n */\n tableRowCounts: {[tableName: string]: number};\n /**\n * Cache of schema trees for tables\n */\n schemaTrees?: DbSchemaNode[];\n /**\n * Cache of currently running query handles.\n * This is only used for running queries to deduplicate them (especially for useSql),\n * the cache is cleared when the query is completed.\n */\n queryCache: {[key: string]: QueryHandle};\n /**\n * Whether the table schemas are being refreshed\n */\n isRefreshingTableSchemas: boolean;\n\n /**\n * Set a new DuckDB connector\n */\n setConnector: (connector: DuckDbConnector) => void;\n\n /**\n * Initialize the connector (creates a WasmDuckDbConnector if none exists)\n */\n initialize: () => Promise<void>;\n\n /**\n * Close and clean up the connector\n */\n destroy: () => Promise<void>;\n\n /**\n * Add a table to the room.\n * @param tableName - The name of the table to add.\n * @param data - The data to add to the table: an arrow table or an array of records.\n * @returns A promise that resolves to the table that was added.\n */\n addTable(\n tableName: string | QualifiedTableName,\n data: arrow.Table | Record<string, unknown>[],\n ): Promise<DataTable>;\n\n /**\n * Load the schemas of the tables in the database.\n */\n loadTableSchemas(filter?: LoadTableSchemasFilter): Promise<DataTable[]>;\n\n /**\n * @deprecated Use findTable instead\n */\n getTable(tableName: string): DataTable | undefined;\n\n /**\n * @internal Avoid using this directly, it's for internal use.\n */\n setTableRowCount(\n tableName: string | QualifiedTableName,\n rowCount: number,\n ): void;\n\n /**\n * Find a table by reference in the last refreshed table schemas.\n * String references are parsed as SQL identifiers, so dots separate\n * database/schema/table segments unless quoted. If no schema or database is\n * provided, the table is resolved in the current schema and database from\n * the last schema refresh.\n * @param tableName - The table reference to find.\n * @returns The table or undefined if not found.\n */\n findTable(tableName: string | QualifiedTableName): DataTable | undefined;\n\n /**\n * @deprecated Use findTable instead\n */\n findTableByName(\n tableName: string | QualifiedTableName,\n ): DataTable | undefined;\n\n /**\n * Refresh table schemas from the database.\n * @returns A promise that resolves to the updated tables.\n */\n refreshTableSchemas(): Promise<DataTable[]>;\n /**\n * Get the connector. If it's not initialized, it will be initialized.\n */\n getConnector: () => Promise<DuckDbConnector>;\n\n /**\n * @deprecated Use .loadTableRowCount() instead\n */\n getTableRowCount: (table: string, schema?: string) => Promise<number>;\n\n /**\n * Load the row count of a table\n */\n loadTableRowCount: (\n tableName: string | QualifiedTableName,\n ) => Promise<number>;\n\n /**\n * Execute a query with query handle (not result) caching and deduplication\n * @param query - The SQL query to execute\n * @returns The QueryHandle for the query or null if disabled\n */\n executeSql: (\n query: string,\n version?: number,\n ) => Promise<QueryHandle | null>;\n\n /**\n * @deprecated Use .tables or .loadTableSchemas() instead\n */\n getTables: (schema?: string) => Promise<string[]>;\n\n /**\n * @deprecated Use .loadTableSchemas() instead\n */\n getTableSchema: (\n tableName: string,\n schema?: string,\n ) => Promise<DataTable | undefined>;\n\n /**\n * @deprecated Use .tables or .loadTableSchemas() instead\n */\n getTableSchemas: (schema?: string) => Promise<DataTable[]>;\n\n /**\n * Check if a table exists\n */\n checkTableExists: (\n tableName: string | QualifiedTableName,\n ) => Promise<boolean>;\n\n /**\n * Delete a table or view with optional schema and database.\n * @param tableName - The name of the relation to delete (qualified or plain)\n */\n dropRelation: (tableName: string | QualifiedTableName) => Promise<void>;\n\n /**\n * Delete a table with optional schema and database.\n * @param tableName - The name of the table to delete (qualified or plain)\n */\n dropTable: (tableName: string | QualifiedTableName) => Promise<void>;\n\n /**\n * Create a table or view from a query.\n * @param tableName - The name of the table/view to create.\n * @param query - The query to create the table/view from.\n * @param options - Creation options.\n * @returns The table/view name and rowCount (undefined for views).\n */\n createTableFromQuery: (\n tableName: string | QualifiedTableName,\n query: string,\n options?: {\n replace?: boolean;\n temp?: boolean;\n view?: boolean;\n allowMultipleStatements?: boolean;\n abortSignal?: AbortSignal;\n },\n ) => Promise<{\n tableName: string | QualifiedTableName;\n rowCount: number | undefined;\n }>;\n\n /**\n * Parse a SQL SELECT statement to JSON\n * @param sql - The SQL SELECT statement to parse.\n * @returns A promise that resolves to the parsed JSON.\n */\n sqlSelectToJson: (sql: string) => Promise<\n | {\n error: true;\n error_type: string;\n error_message: string;\n error_subtype: string;\n position: string;\n }\n | {\n error: false;\n statements: {\n node: {\n from_table: {\n alias: string;\n show_type: string;\n table_name: string;\n };\n select_list: Record<string, unknown>[];\n type: string;\n };\n }[];\n }\n >;\n };\n};\n\ntype QualifiedTableNameInput = Pick<\n QualifiedTableName,\n 'database' | 'schema' | 'table' | 'defaultDatabase'\n>;\n\nexport type CreateDuckDbSliceProps = {\n connector?: DuckDbConnector;\n /**\n * Optional table visibility filter.\n * Defaults to {@link createDefaultLoadTableSchemasFilter}.\n */\n loadTableSchemasFilter?: LoadTableSchemasFilterFunction | null;\n /**\n * Optional catalog visibility filter for the data source panel.\n * Defaults to {@link defaultLoadSchemaCatalogFilter}. When omitted, custom\n * table filters still apply to table entries while schemas/databases use the default.\n */\n loadSchemaCatalogFilter?: LoadSchemaCatalogFilterFunction | null;\n};\n\n/**\n * Create a DuckDB slice for managing the connector\n */\nexport function createDuckDbSlice({\n connector = createWasmDuckDbConnector(),\n loadTableSchemasFilter = defaultLoadTableSchemasFilter,\n loadSchemaCatalogFilter,\n}: CreateDuckDbSliceProps = {}): StateCreator<DuckDbSliceState> {\n let refreshPromise: Promise<DataTable[]> | null = null;\n let pendingSchemaRefresh = false;\n const effectiveSchemaCatalogFilter =\n loadSchemaCatalogFilter ??\n (loadTableSchemasFilter === null\n ? null\n : (((entry) => {\n if (entry.type === 'table') {\n return loadTableSchemasFilter\n ? loadTableSchemasFilter(entry.table)\n : true;\n }\n return defaultLoadSchemaCatalogFilter(entry);\n }) satisfies LoadSchemaCatalogFilterFunction));\n return createSlice<DuckDbSliceState, BaseRoomStoreState & DuckDbSliceState>(\n (set, get, store) => {\n const parseTableReferenceParts = (\n tableName: string,\n ): QualifiedTableNameInput => {\n const parsed = parseQualifiedSqlIdentifier(tableName);\n return parsed?.table\n ? {\n database: parsed.database,\n schema: parsed.schema,\n table: parsed.table,\n }\n : {table: tableName};\n };\n\n /**\n * Internal helper to load a table schema by exact name, bypassing the visibility filter.\n * Used when performing exact lookups (e.g., checking if a specific table exists).\n */\n const loadTableSchemaByName = async (\n tableName: string | QualifiedTableName,\n ): Promise<DataTable | undefined> => {\n const tableNameParts =\n typeof tableName === 'string'\n ? parseTableReferenceParts(tableName)\n : tableName;\n const qualifiedName = get().db.qualifyTableName(tableNameParts);\n const connector = await get().db.getConnector();\n const [table] = await loadTableSchemas(connector, {\n database: qualifiedName.database,\n schema: qualifiedName.schema,\n table: qualifiedName.table,\n defaultDatabase: get().db.currentDatabase,\n });\n return table &&\n table.table.table === qualifiedName.table &&\n (!qualifiedName.schema ||\n table.table.schema === qualifiedName.schema) &&\n (!qualifiedName.database ||\n table.table.database === qualifiedName.database)\n ? table\n : undefined;\n };\n\n const throwIfUnresolvedExplicitDatabaseReference = (\n tableName: string | QualifiedTableName,\n table: DataTable | undefined,\n ) => {\n if (table) {\n return;\n }\n const database =\n typeof tableName === 'string'\n ? parseTableReferenceParts(tableName).database\n : tableName.database;\n if (!database) {\n return;\n }\n const qualifiedName = isQualifiedTableName(tableName)\n ? get().db.qualifyTableName(tableName)\n : get().db.qualifyTableName(parseTableReferenceParts(tableName));\n throw new Error(`Relation \"${qualifiedName}\" not found.`);\n };\n\n return {\n db: {\n connector, // Will be initialized during init\n schema: 'main', // TODO: remove schema, we should not limit the schema to a single one.\n currentSchema: undefined,\n currentDatabase: undefined,\n isRefreshingTableSchemas: false,\n tables: [],\n tableRowCounts: {},\n schemaTrees: undefined,\n queryCache: {},\n\n qualifyTableName(tableName) {\n const {currentDatabase, currentSchema} = get().db;\n const parts =\n typeof tableName === 'string' ? {table: tableName} : tableName;\n return makeQualifiedTableName({\n database: parts.database ?? currentDatabase,\n schema: parts.schema ?? currentSchema,\n table: parts.table,\n defaultDatabase: parts.defaultDatabase ?? currentDatabase,\n });\n },\n\n setConnector: (connector: DuckDbConnector) => {\n set(\n produce((state) => {\n state.config.dataSources = [];\n state.db.connector = connector;\n }),\n );\n },\n\n initialize: async () => {\n await get().db.connector.initialize();\n // No await here, we want to continue initializing the room even\n // if the table schemas are not refreshed yet\n get().db.refreshTableSchemas();\n registerCommandsForOwner(\n store,\n DUCKDB_COMMAND_OWNER,\n createDuckDbCommands(),\n );\n },\n\n getConnector: async () => {\n await get().db.connector.initialize();\n return get().db.connector;\n },\n\n destroy: async () => {\n unregisterCommandsForOwner(store, DUCKDB_COMMAND_OWNER);\n // Wait for any in-flight refreshTableSchemas() to finish before\n // destroying the connector. initialize() fires it without await,\n // so it may still be querying the native DuckDB instance; tearing\n // that down mid-flight causes a use-after-free segfault.\n if (refreshPromise) {\n try {\n await refreshPromise;\n } catch {\n // ignore – we're shutting down\n }\n }\n try {\n if (get().db.connector) {\n await get().db.connector.destroy();\n }\n } catch (err) {\n console.error('Error during DuckDB shutdown:', err);\n }\n },\n\n /**\n * Creates a table or view from a SQL query.\n * @param tableName - Name of the table/view to create\n * @param query - SQL query (must be a SELECT statement, or multiple statements ending with a SELECT when allowMultipleStatements is true)\n * @param options - Creation options\n * @param options.replace - If true, uses CREATE OR REPLACE (default: true)\n * @param options.temp - If true, creates a temporary table/view (default: false)\n * @param options.view - If true, creates a view instead of a table (default: false)\n * @param options.allowMultipleStatements - If true, allows multiple statements where preceding statements are executed first and the final SELECT is wrapped in CREATE TABLE/VIEW (default: false)\n * @returns Object with tableName and rowCount (rowCount is undefined for views)\n */\n async createTableFromQuery(\n tableName: string | QualifiedTableName,\n query: string,\n options?: {\n replace?: boolean;\n temp?: boolean;\n view?: boolean;\n allowMultipleStatements?: boolean;\n abortSignal?: AbortSignal;\n },\n ) {\n const {\n replace = true,\n temp = false,\n view = false,\n allowMultipleStatements = false,\n abortSignal,\n } = options || {};\n\n // For temp tables/views, DuckDB requires the \"temp\" database\n const baseQualifiedName = get().db.qualifyTableName(tableName);\n\n const qualifiedName = temp\n ? makeQualifiedTableName({\n table: baseQualifiedName.table,\n schema: baseQualifiedName.schema,\n database: 'temp',\n defaultDatabase: get().db.currentDatabase,\n })\n : baseQualifiedName;\n\n const connector = await get().db.getConnector();\n\n const {precedingStatements, lastStatement} =\n separateLastStatement(query);\n\n if (!allowMultipleStatements && precedingStatements.length > 0) {\n throw new Error(\n 'Query must contain exactly one statement (set allowMultipleStatements: true to execute multiple statements)',\n );\n }\n\n // The last statement must be a SELECT\n const parsedQuery = await get().db.sqlSelectToJson(lastStatement);\n if (parsedQuery.error) {\n throw new Error(\n 'Final statement must be a valid SELECT statement',\n );\n }\n\n // Build CREATE statement with options\n const createKeyword = [\n 'CREATE',\n replace ? 'OR REPLACE' : '',\n temp ? 'TEMP' : '',\n view ? 'VIEW' : 'TABLE',\n ]\n .filter(Boolean)\n .join(' ');\n\n const createStatement = `${createKeyword} ${qualifiedName} AS (\n ${lastStatement}\n )`;\n\n const fullQuery = joinStatements(\n precedingStatements,\n createStatement,\n );\n const result = await connector.query(fullQuery, {\n signal: abortSignal,\n });\n // Views don't have a row count, only tables do\n const rowCount = view ? undefined : getColValAsNumber(result);\n return {tableName, rowCount};\n },\n\n /**\n * @deprecated Use .tables or .loadTableSchemas() instead\n */\n async getTables(schema) {\n const tableSchemas = await get().db.loadTableSchemas({schema});\n return tableSchemas.map((t) => t.table.table);\n },\n\n /**\n * @deprecated Use .loadTableSchemas() instead\n */\n async getTableSchema(tableName: string, schema = 'main') {\n const newLocal = await get().db.loadTableSchemas({\n schema,\n table: tableName,\n });\n return newLocal[0];\n },\n\n /**\n * @deprecated Use .loadTableRowCount() instead\n */\n async getTableRowCount(table, schema = 'main') {\n return get().db.loadTableRowCount(\n get().db.qualifyTableName({table, schema}),\n );\n },\n\n async loadTableRowCount(tableName: string | QualifiedTableName) {\n const {schema, database, table} =\n typeof tableName === 'string'\n ? get().db.qualifyTableName(parseTableReferenceParts(tableName))\n : get().db.qualifyTableName(tableName);\n const connector = await get().db.getConnector();\n const result = await connector.query(\n `SELECT COUNT(*) FROM ${get().db.qualifyTableName({\n schema,\n database,\n table,\n })}`,\n );\n return getColValAsNumber(result);\n },\n\n /**\n * @deprecated Use .loadTableSchemas() instead\n */\n async getTableSchemas(schema) {\n return await get().db.loadTableSchemas({schema});\n },\n\n async loadTableSchemas(\n filter?: LoadTableSchemasFilter,\n ): Promise<DataTable[]> {\n const connector = await get().db.getConnector();\n return loadTableSchemas(connector, {\n ...filter,\n filterFunction: loadTableSchemasFilter,\n defaultDatabase: get().db.currentDatabase,\n });\n },\n\n async checkTableExists(tableName: string | QualifiedTableName) {\n const table =\n get().db.findTable(tableName) ??\n (await loadTableSchemaByName(tableName));\n return Boolean(table);\n },\n\n async dropRelation(tableName): Promise<void> {\n const connector = await get().db.getConnector();\n const table =\n get().db.findTable(tableName) ??\n (await loadTableSchemaByName(tableName));\n throwIfUnresolvedExplicitDatabaseReference(tableName, table);\n const qualifiedTable =\n table?.table ??\n (isQualifiedTableName(tableName)\n ? get().db.qualifyTableName(tableName)\n : get().db.qualifyTableName(\n parseTableReferenceParts(tableName),\n ));\n const isView = table?.isView;\n if (isView) {\n await connector.query(`DROP VIEW IF EXISTS ${qualifiedTable};`);\n } else {\n await connector.query(`DROP TABLE IF EXISTS ${qualifiedTable};`);\n }\n get().db.refreshTableSchemas();\n },\n\n async dropTable(tableName): Promise<void> {\n const connector = await get().db.getConnector();\n const table =\n get().db.findTable(tableName) ??\n (await loadTableSchemaByName(tableName));\n throwIfUnresolvedExplicitDatabaseReference(tableName, table);\n const qualifiedTable =\n table?.table ??\n (isQualifiedTableName(tableName)\n ? get().db.qualifyTableName(tableName)\n : get().db.qualifyTableName(\n parseTableReferenceParts(tableName),\n ));\n\n if (table?.isView) {\n throw new Error(\n `\"${qualifiedTable}\" is a view. Use dropRelation() to remove views.`,\n );\n }\n\n await connector.query(`DROP TABLE IF EXISTS ${qualifiedTable};`);\n get().db.refreshTableSchemas();\n },\n\n async addTable(tableName, data) {\n const qualifiedName = get().db.qualifyTableName(tableName);\n\n const {db} = get();\n if (data instanceof arrow.Table) {\n // TODO: make sure the table is replaced\n await db.connector.loadArrow(data, qualifiedName.toString());\n } else {\n await db.connector.loadObjects(data, qualifiedName.toString(), {\n replace: true,\n });\n }\n const newTable = await loadTableSchemaByName(qualifiedName);\n if (!newTable) {\n throw new Error('Failed to add table');\n }\n set((state) =>\n produce(state, (draft) => {\n draft.db.tables.push(newTable);\n }),\n );\n get().db.refreshTableSchemas();\n return newTable;\n },\n\n async setTableRowCount(tableName, rowCount) {\n const qualifiedName = get().db.qualifyTableName(tableName);\n set((state) =>\n produce(state, (draft) => {\n draft.db.tableRowCounts[qualifiedName.toString()] = rowCount;\n }),\n );\n },\n\n getTable(tableName) {\n return get().db.findTable(tableName);\n },\n\n findTable(tableName: string | QualifiedTableName) {\n const {currentSchema, currentDatabase, tables} = get().db;\n const findMatchingTable = ({\n table,\n schema,\n database,\n }: Partial<QualifiedTableName>) =>\n table\n ? tables.find(\n (t) =>\n t.table.table === table &&\n (!schema || t.table.schema === schema) &&\n (!database || t.table.database === database),\n )\n : undefined;\n const findUniqueMatchingTable = ({\n table,\n schema,\n }: Partial<QualifiedTableName>) => {\n if (!table) return undefined;\n const matches = tables.filter(\n (t) =>\n t.table.table === table &&\n (!schema || t.table.schema === schema),\n );\n return matches.length === 1 ? matches[0] : undefined;\n };\n\n const resolvedTableName =\n typeof tableName === 'string'\n ? (parseQualifiedSqlIdentifier(tableName) ?? {})\n : tableName;\n const {table, schema, database, defaultDatabase} = {\n schema: currentSchema,\n database: currentDatabase,\n ...resolvedTableName,\n };\n const exactMatch = findMatchingTable({table, schema, database});\n if (exactMatch) return exactMatch;\n const isStaleDefaultDatabaseReference =\n typeof tableName !== 'string' &&\n database &&\n defaultDatabase &&\n database === defaultDatabase &&\n database !== currentDatabase;\n if (isStaleDefaultDatabaseReference) {\n return findUniqueMatchingTable({table, schema});\n }\n return undefined;\n },\n\n findTableByName(tableName: string | QualifiedTableName) {\n return get().db.findTable(tableName);\n },\n\n async refreshTableSchemas(): Promise<DataTable[]> {\n if (refreshPromise) {\n pendingSchemaRefresh = true;\n return refreshPromise;\n }\n set((state) =>\n produce(state, (draft) => {\n draft.db.isRefreshingTableSchemas = true;\n }),\n );\n refreshPromise = (async () => {\n try {\n let schemasWithTables: SchemaWithTables[] = [];\n do {\n pendingSchemaRefresh = false;\n const connector = await get().db.getConnector();\n const result = await connector.query(\n `SELECT current_schema() AS schema, current_database() AS database`,\n );\n const currentSchemaValue = result.getChild('schema')?.get(0);\n const currentDatabaseValue = result\n .getChild('database')\n ?.get(0);\n const currentSchema =\n currentSchemaValue == null\n ? undefined\n : String(currentSchemaValue);\n const currentDatabase =\n currentDatabaseValue == null\n ? undefined\n : String(currentDatabaseValue);\n set((state) =>\n produce(state, (draft) => {\n draft.db.currentSchema = currentSchema;\n draft.db.currentDatabase = currentDatabase;\n }),\n );\n schemasWithTables = await loadSchemaCatalog(connector, {\n filterFunction: effectiveSchemaCatalogFilter,\n defaultDatabase: currentDatabase,\n });\n } while (pendingSchemaRefresh);\n\n const newTables = schemasWithTables.flatMap((s) => s.tables);\n const currentTables = get().db.tables;\n const currentSchemaTrees = get().db.schemaTrees;\n const newSchemaTrees = createDbSchemaTrees(schemasWithTables);\n\n if (\n !deepEquals(newTables, currentTables) ||\n !deepEquals(newSchemaTrees, currentSchemaTrees)\n ) {\n set((state) =>\n produce(state, (draft) => {\n draft.db.tables = newTables;\n draft.db.schemaTrees = newSchemaTrees;\n }),\n );\n }\n return newTables;\n } catch (err) {\n get().room.captureException(err);\n return [];\n } finally {\n refreshPromise = null;\n set((state) =>\n produce(state, (draft) => {\n draft.db.isRefreshingTableSchemas = false;\n }),\n );\n }\n })();\n return refreshPromise;\n },\n\n async sqlSelectToJson(sql: string) {\n const connector = await get().db.getConnector();\n const parsedQuery = (\n await connector.query(\n `SELECT json_serialize_sql(${escapeVal(sql)})`,\n )\n )\n .getChildAt(0)\n ?.get(0);\n return JSON.parse(parsedQuery);\n },\n\n async executeSql(query: string): Promise<QueryHandle | null> {\n // Create a unique key for this query\n const queryKey = `${query}`;\n const connector = await get().db.getConnector();\n\n // Check if we already have a cached query for this key\n const existingQuery = get().db.queryCache[queryKey];\n if (existingQuery) {\n return existingQuery;\n }\n\n const queryHandle = connector.query(query);\n // Cache the query handle immediately\n set((state) =>\n produce(state, (draft) => {\n draft.db.queryCache[queryKey] = queryHandle;\n }),\n );\n\n queryHandle.result\n .catch(() => {\n // Prevent unhandled promise rejection warnings.\n // Callers handle errors via await/try-catch.\n })\n .finally(() => {\n // remove from cache after completion\n set((state) =>\n produce(state, (draft) => {\n delete draft.db.queryCache[queryKey];\n }),\n );\n });\n\n return queryHandle;\n },\n },\n };\n },\n );\n}\n\ntype DuckDbCommandStoreState = BaseRoomStoreState & DuckDbSliceState;\n\nfunction createDuckDbCommands(): RoomCommand<DuckDbCommandStoreState>[] {\n return [\n {\n id: 'db.refresh-table-schemas',\n name: 'Refresh table schemas',\n description: 'Reload table and schema metadata from DuckDB',\n group: 'Database',\n keywords: ['duckdb', 'database', 'refresh', 'tables', 'schemas'],\n metadata: {\n readOnly: true,\n idempotent: true,\n riskLevel: 'low',\n },\n isEnabled: ({getState}) => !getState().db.isRefreshingTableSchemas,\n execute: async ({getState}) => {\n await getState().db.refreshTableSchemas();\n return {\n success: true,\n commandId: 'db.refresh-table-schemas',\n message: 'Table schemas refreshed.',\n };\n },\n },\n {\n id: 'db.drop-table',\n name: 'Drop relation',\n description: 'Drop a table or view from DuckDB by name',\n group: 'Database',\n keywords: [\n 'duckdb',\n 'database',\n 'drop',\n 'table',\n 'view',\n 'relation',\n 'delete',\n ],\n inputSchema: DropTableCommandInput,\n inputDescription: 'Provide a tableName to remove from DuckDB.',\n metadata: {\n readOnly: false,\n idempotent: true,\n riskLevel: 'high',\n requiresConfirmation: true,\n },\n validateInput: async (input, {getState}) => {\n const {tableName} = input as DropTableCommandInput;\n const exists = await getState().db.checkTableExists(tableName);\n if (!exists) {\n throw new Error(`Table \"${tableName}\" does not exist.`);\n }\n },\n execute: async ({getState}, input) => {\n const {tableName} = input as DropTableCommandInput;\n await getState().db.dropRelation(tableName);\n return {\n success: true,\n commandId: 'db.drop-table',\n message: `Dropped relation \"${tableName}\".`,\n };\n },\n },\n {\n id: 'db.create-table-from-query',\n name: 'Create table from query',\n description: 'Create a table or view from a SQL query',\n group: 'Database',\n keywords: ['duckdb', 'database', 'create', 'table', 'view', 'query'],\n inputSchema: CreateTableFromQueryCommandInput,\n inputDescription:\n 'Provide tableName and query, with optional replace/view/temp flags.',\n metadata: {\n readOnly: false,\n idempotent: false,\n riskLevel: 'medium',\n },\n validateInput: (input) => {\n const {query} = input as CreateTableFromQueryCommandInput;\n if (!query.trim()) {\n throw new Error('Query cannot be empty.');\n }\n },\n execute: async ({getState}, input) => {\n const {tableName, query, replace, view, temp, allowMultipleStatements} =\n input as CreateTableFromQueryCommandInput;\n const result = await getState().db.createTableFromQuery(\n tableName,\n query,\n {\n replace,\n view,\n temp,\n allowMultipleStatements,\n },\n );\n await getState().db.refreshTableSchemas();\n return {\n success: true,\n commandId: 'db.create-table-from-query',\n message: `Created ${view ? 'view' : 'table'} \"${tableName}\".`,\n data: result,\n };\n },\n },\n ];\n}\n\n/**\n * @internal\n * Select values from the room store that includes the DuckDB slice.\n *\n * This is a typed wrapper around `useBaseRoomStore` that narrows the\n * state to `RoomStateWithDuckDb` so selectors can access `db` safely.\n *\n * @typeParam T - The selected slice of state returned by the selector\n * @param selector - Function that selects a value from the store state\n * @returns The selected value of type `T`\n */\nexport function useStoreWithDuckDb<T>(\n selector: (state: BaseRoomStoreState & DuckDbSliceState) => T,\n): T {\n return useBaseRoomStore<DuckDbSliceState, T>((state) => selector(state));\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"WasmDuckDbConnector.d.ts","sourceRoot":"","sources":["../../src/connectors/WasmDuckDbConnector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,qBAAqB,CAAC;AAE9C,OAAO,EAEL,eAAe,EAMhB,MAAM,uBAAuB,CAAC;AAS/B,MAAM,WAAW,0BAA2B,SAAQ,MAAM,CAAC,YAAY;IACrE,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,aAAa,CAAC;CAChC;AAED,MAAM,WAAW,mBAAoB,SAAQ,eAAe;IAC1D,KAAK,IAAI,MAAM,CAAC,WAAW,CAAC;IAC5B,aAAa,IAAI,MAAM,CAAC,qBAAqB,CAAC;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,yBAAyB,CACvC,OAAO,GAAE,0BAA+B,GACvC,mBAAmB,CAkRrB"}
1
+ {"version":3,"file":"WasmDuckDbConnector.d.ts","sourceRoot":"","sources":["../../src/connectors/WasmDuckDbConnector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,qBAAqB,CAAC;AAE9C,OAAO,EAEL,eAAe,EAMhB,MAAM,uBAAuB,CAAC;AAS/B,MAAM,WAAW,0BAA2B,SAAQ,MAAM,CAAC,YAAY;IACrE,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,aAAa,CAAC;CAChC;AAED,MAAM,WAAW,mBAAoB,SAAQ,eAAe;IAC1D,KAAK,IAAI,MAAM,CAAC,WAAW,CAAC;IAC5B,aAAa,IAAI,MAAM,CAAC,qBAAqB,CAAC;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,yBAAyB,CACvC,OAAO,GAAE,0BAA+B,GACvC,mBAAmB,CAwRrB"}
@@ -159,6 +159,14 @@ export function createWasmDuckDbConnector(options = {}) {
159
159
  if (opts && isSpatialLoadFileOptions(opts)) {
160
160
  await conn.query(loadSpatial(tableName, fileName, opts));
161
161
  }
162
+ else if (!opts?.method && /\.geojson$/i.test(fileName)) {
163
+ try {
164
+ await conn.query(loadSpatial(tableName, fileName, opts ?? {}));
165
+ }
166
+ catch {
167
+ await conn.query(load('auto', tableName, fileName, opts));
168
+ }
169
+ }
162
170
  else {
163
171
  await conn.query(load(opts?.method ?? 'auto', tableName, fileName, opts));
164
172
  }
@@ -1 +1 @@
1
- {"version":3,"file":"WasmDuckDbConnector.js","sourceRoot":"","sources":["../../src/connectors/WasmDuckDbConnector.ts"],"names":[],"mappings":"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","sourcesContent":["import * as duckdb from '@duckdb/duckdb-wasm';\nimport {DuckDBDataProtocol} from '@duckdb/duckdb-wasm';\nimport {\n BaseDuckDbConnectorImpl,\n DuckDbConnector,\n createBaseDuckDbConnector,\n getSqlErrorWithPointer,\n load,\n loadObjects as loadObjectsSql,\n loadSpatial,\n} from '@sqlrooms/duckdb-core';\nimport {\n LoadFileOptions,\n StandardLoadOptions,\n isSpatialLoadFileOptions,\n} from '@sqlrooms/room-config';\nimport {safeJsonParse, splitFilePath} from '@sqlrooms/utils';\nimport * as arrow from 'apache-arrow';\n\nexport interface WasmDuckDbConnectorOptions extends duckdb.DuckDBConfig {\n /** @deprecated use `path` instead */\n dbPath?: string;\n initializationQuery?: string;\n logging?: boolean;\n /**\n * DuckDB bundles to use. Defaults to jsDelivr bundles. To use locally\n * bundled files, you will need to import them in your app and construct a\n * `DuckDBBundles` object.\n */\n bundles?: duckdb.DuckDBBundles;\n}\n\nexport interface WasmDuckDbConnector extends DuckDbConnector {\n getDb(): duckdb.AsyncDuckDB;\n getConnection(): duckdb.AsyncDuckDBConnection;\n readonly type: 'wasm';\n}\n\nexport function createWasmDuckDbConnector(\n options: WasmDuckDbConnectorOptions = {},\n): WasmDuckDbConnector {\n const {\n logging = false,\n initializationQuery = '',\n dbPath = ':memory:',\n bundles = duckdb.getJsDelivrBundles(),\n ...restConfig\n } = options;\n\n let db: duckdb.AsyncDuckDB | null = null;\n let conn: duckdb.AsyncDuckDBConnection | null = null;\n let worker: Worker | null = null;\n\n const impl: BaseDuckDbConnectorImpl = {\n async initializeInternal() {\n if (!globalThis.Worker) {\n throw new Error('No Worker support in this environment');\n }\n try {\n const allBundles = bundles;\n const bestBundle = await duckdb.selectBundle(allBundles);\n if (!bestBundle.mainWorker) {\n throw new Error('No best bundle found for DuckDB worker');\n }\n const workerScriptUrl = new URL(\n bestBundle.mainWorker,\n globalThis.location.origin,\n ).href;\n const workerUrl = URL.createObjectURL(\n new Blob([`importScripts(\"${workerScriptUrl}\");`], {\n type: 'text/javascript',\n }),\n );\n\n worker = new window.Worker(workerUrl);\n const logger = logging ? new duckdb.ConsoleLogger() : {log: () => {}};\n\n db = new (class extends duckdb.AsyncDuckDB {\n onError(event: ErrorEvent) {\n super.onError(event);\n console.error('DuckDB worker error:', event);\n }\n })(logger, worker);\n\n const mainModule = new URL(\n bestBundle.mainModule,\n globalThis.location.origin,\n ).href;\n const pthreadWorker = bestBundle.pthreadWorker\n ? new URL(bestBundle.pthreadWorker, globalThis.location.origin).href\n : undefined;\n await db.instantiate(mainModule, pthreadWorker);\n URL.revokeObjectURL(workerUrl);\n\n await db.open({\n ...restConfig,\n path: restConfig.path ?? dbPath,\n });\n\n conn = await db.connect();\n } catch (err) {\n if (conn) {\n try {\n await conn.close();\n } catch {\n /* best-effort */\n }\n }\n if (db) {\n try {\n await db.terminate();\n } catch {\n /* best-effort */\n }\n } else if (worker) {\n worker.terminate();\n }\n db = null;\n conn = null;\n worker = null;\n throw err;\n }\n },\n\n async destroyInternal() {\n if (conn) {\n await conn.close();\n conn = null;\n }\n if (db) {\n await db.terminate();\n db = null;\n }\n if (worker) {\n worker.terminate();\n worker = null;\n }\n },\n\n async executeQueryInternal<T extends arrow.TypeMap = any>(\n query: string,\n signal: AbortSignal,\n ): Promise<arrow.Table<T>> {\n if (!db) {\n throw new Error('DuckDB not initialized');\n }\n\n if (signal.aborted) {\n throw new Error('Query aborted before execution');\n }\n\n const localConn = await db.connect();\n const streamPromise = localConn.send<T>(query, true);\n let reader: arrow.RecordBatchReader<T> | null = null;\n\n const buildTable = async () => {\n reader = await streamPromise;\n const batches: arrow.RecordBatch<T>[] = [];\n let rowCount = 0;\n for await (const batch of reader) {\n if (batch.numRows === 0) continue;\n batches.push(batch);\n rowCount += batch.numRows;\n }\n if (rowCount === 0) {\n return arrow.tableFromArrays({}) as unknown as arrow.Table<T>;\n }\n return new arrow.Table(batches);\n };\n\n let abortHandler: (() => void) | undefined;\n const abortPromise = new Promise<never>((_, reject) => {\n abortHandler = () => {\n localConn.cancelSent().catch(() => {});\n reader?.cancel?.();\n reject(new Error('Query cancelled'));\n };\n signal.addEventListener('abort', abortHandler);\n });\n\n try {\n return await Promise.race([buildTable(), abortPromise]);\n } catch (e) {\n // Some errors are returned as JSON, so we try to parse them\n if (e instanceof Error) {\n const parsed: any = safeJsonParse(e.message);\n if (\n parsed !== null &&\n typeof parsed === 'object' &&\n 'exception_message' in parsed\n ) {\n throw new Error(\n `${parsed.exception_type} ${parsed.error_subtype}: ${parsed.exception_message}` +\n `\\n${getSqlErrorWithPointer(query, Number(parsed.position)).formatted}`,\n );\n }\n }\n throw e;\n } finally {\n if (abortHandler) {\n signal.removeEventListener('abort', abortHandler);\n }\n await localConn.close();\n }\n },\n\n async cancelQueryInternal() {\n if (conn) {\n try {\n await conn.cancelSent();\n } catch (err) {\n console.warn('DuckDB cancelSent failed:', err);\n }\n }\n },\n\n async loadFileInternal(\n file: string | File,\n tableName: string,\n opts?: LoadFileOptions,\n ) {\n if (!conn) {\n throw new Error('DuckDB connection not initialized');\n }\n await withTempRegisteredFile(file, async (fileName) => {\n if (opts && isSpatialLoadFileOptions(opts)) {\n await conn!.query(loadSpatial(tableName, fileName, opts));\n } else {\n await conn!.query(\n load(opts?.method ?? 'auto', tableName, fileName, opts),\n );\n }\n });\n },\n\n async loadArrowInternal(\n file: arrow.Table | Uint8Array,\n tableName: string,\n opts?: {schema?: string},\n ) {\n if (!conn) {\n throw new Error('DuckDB connection not initialized');\n }\n const options = {name: tableName, schema: opts?.schema};\n if (file instanceof arrow.Table) {\n await conn.insertArrowTable(file, options);\n } else {\n await conn.insertArrowFromIPCStream(file, options);\n }\n },\n\n async loadObjectsInternal(\n file: Record<string, unknown>[],\n tableName: string,\n opts?: StandardLoadOptions,\n ) {\n if (!conn) {\n throw new Error('DuckDB connection not initialized');\n }\n await conn.query(loadObjectsSql(tableName, file, opts));\n },\n };\n\n const base = createBaseDuckDbConnector({dbPath, initializationQuery}, impl);\n\n async function withTempRegisteredFile(\n file: string | File,\n action: (fileName: string) => Promise<void>,\n ) {\n if (!conn || !db) {\n throw new Error('DuckDB connection not initialized');\n }\n let fileName: string;\n let tempFileName: string | undefined = undefined;\n if (file instanceof File) {\n const {ext} = splitFilePath(file.name);\n tempFileName = `${Math.random().toString(36).substring(2, 15)}${ext ? `.${ext}` : ''}`;\n fileName = tempFileName;\n await db.registerFileHandle(\n fileName,\n file,\n DuckDBDataProtocol.BROWSER_FILEREADER,\n true,\n );\n } else {\n fileName = file;\n }\n try {\n await action(fileName);\n } finally {\n if (tempFileName) {\n await db!.dropFile(tempFileName);\n }\n }\n }\n\n return {\n ...base,\n getDb() {\n if (!db) {\n throw new Error('DuckDB not initialized');\n }\n return db;\n },\n getConnection() {\n if (!conn) {\n throw new Error('DuckDB connection not initialized');\n }\n return conn;\n },\n get type() {\n return 'wasm' as const;\n },\n };\n}\n"]}
1
+ {"version":3,"file":"WasmDuckDbConnector.js","sourceRoot":"","sources":["../../src/connectors/WasmDuckDbConnector.ts"],"names":[],"mappings":"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","sourcesContent":["import * as duckdb from '@duckdb/duckdb-wasm';\nimport {DuckDBDataProtocol} from '@duckdb/duckdb-wasm';\nimport {\n BaseDuckDbConnectorImpl,\n DuckDbConnector,\n createBaseDuckDbConnector,\n getSqlErrorWithPointer,\n load,\n loadObjects as loadObjectsSql,\n loadSpatial,\n} from '@sqlrooms/duckdb-core';\nimport {\n LoadFileOptions,\n StandardLoadOptions,\n isSpatialLoadFileOptions,\n} from '@sqlrooms/room-config';\nimport {safeJsonParse, splitFilePath} from '@sqlrooms/utils';\nimport * as arrow from 'apache-arrow';\n\nexport interface WasmDuckDbConnectorOptions extends duckdb.DuckDBConfig {\n /** @deprecated use `path` instead */\n dbPath?: string;\n initializationQuery?: string;\n logging?: boolean;\n /**\n * DuckDB bundles to use. Defaults to jsDelivr bundles. To use locally\n * bundled files, you will need to import them in your app and construct a\n * `DuckDBBundles` object.\n */\n bundles?: duckdb.DuckDBBundles;\n}\n\nexport interface WasmDuckDbConnector extends DuckDbConnector {\n getDb(): duckdb.AsyncDuckDB;\n getConnection(): duckdb.AsyncDuckDBConnection;\n readonly type: 'wasm';\n}\n\nexport function createWasmDuckDbConnector(\n options: WasmDuckDbConnectorOptions = {},\n): WasmDuckDbConnector {\n const {\n logging = false,\n initializationQuery = '',\n dbPath = ':memory:',\n bundles = duckdb.getJsDelivrBundles(),\n ...restConfig\n } = options;\n\n let db: duckdb.AsyncDuckDB | null = null;\n let conn: duckdb.AsyncDuckDBConnection | null = null;\n let worker: Worker | null = null;\n\n const impl: BaseDuckDbConnectorImpl = {\n async initializeInternal() {\n if (!globalThis.Worker) {\n throw new Error('No Worker support in this environment');\n }\n try {\n const allBundles = bundles;\n const bestBundle = await duckdb.selectBundle(allBundles);\n if (!bestBundle.mainWorker) {\n throw new Error('No best bundle found for DuckDB worker');\n }\n const workerScriptUrl = new URL(\n bestBundle.mainWorker,\n globalThis.location.origin,\n ).href;\n const workerUrl = URL.createObjectURL(\n new Blob([`importScripts(\"${workerScriptUrl}\");`], {\n type: 'text/javascript',\n }),\n );\n\n worker = new window.Worker(workerUrl);\n const logger = logging ? new duckdb.ConsoleLogger() : {log: () => {}};\n\n db = new (class extends duckdb.AsyncDuckDB {\n onError(event: ErrorEvent) {\n super.onError(event);\n console.error('DuckDB worker error:', event);\n }\n })(logger, worker);\n\n const mainModule = new URL(\n bestBundle.mainModule,\n globalThis.location.origin,\n ).href;\n const pthreadWorker = bestBundle.pthreadWorker\n ? new URL(bestBundle.pthreadWorker, globalThis.location.origin).href\n : undefined;\n await db.instantiate(mainModule, pthreadWorker);\n URL.revokeObjectURL(workerUrl);\n\n await db.open({\n ...restConfig,\n path: restConfig.path ?? dbPath,\n });\n\n conn = await db.connect();\n } catch (err) {\n if (conn) {\n try {\n await conn.close();\n } catch {\n /* best-effort */\n }\n }\n if (db) {\n try {\n await db.terminate();\n } catch {\n /* best-effort */\n }\n } else if (worker) {\n worker.terminate();\n }\n db = null;\n conn = null;\n worker = null;\n throw err;\n }\n },\n\n async destroyInternal() {\n if (conn) {\n await conn.close();\n conn = null;\n }\n if (db) {\n await db.terminate();\n db = null;\n }\n if (worker) {\n worker.terminate();\n worker = null;\n }\n },\n\n async executeQueryInternal<T extends arrow.TypeMap = any>(\n query: string,\n signal: AbortSignal,\n ): Promise<arrow.Table<T>> {\n if (!db) {\n throw new Error('DuckDB not initialized');\n }\n\n if (signal.aborted) {\n throw new Error('Query aborted before execution');\n }\n\n const localConn = await db.connect();\n const streamPromise = localConn.send<T>(query, true);\n let reader: arrow.RecordBatchReader<T> | null = null;\n\n const buildTable = async () => {\n reader = await streamPromise;\n const batches: arrow.RecordBatch<T>[] = [];\n let rowCount = 0;\n for await (const batch of reader) {\n if (batch.numRows === 0) continue;\n batches.push(batch);\n rowCount += batch.numRows;\n }\n if (rowCount === 0) {\n return arrow.tableFromArrays({}) as unknown as arrow.Table<T>;\n }\n return new arrow.Table(batches);\n };\n\n let abortHandler: (() => void) | undefined;\n const abortPromise = new Promise<never>((_, reject) => {\n abortHandler = () => {\n localConn.cancelSent().catch(() => {});\n reader?.cancel?.();\n reject(new Error('Query cancelled'));\n };\n signal.addEventListener('abort', abortHandler);\n });\n\n try {\n return await Promise.race([buildTable(), abortPromise]);\n } catch (e) {\n // Some errors are returned as JSON, so we try to parse them\n if (e instanceof Error) {\n const parsed: any = safeJsonParse(e.message);\n if (\n parsed !== null &&\n typeof parsed === 'object' &&\n 'exception_message' in parsed\n ) {\n throw new Error(\n `${parsed.exception_type} ${parsed.error_subtype}: ${parsed.exception_message}` +\n `\\n${getSqlErrorWithPointer(query, Number(parsed.position)).formatted}`,\n );\n }\n }\n throw e;\n } finally {\n if (abortHandler) {\n signal.removeEventListener('abort', abortHandler);\n }\n await localConn.close();\n }\n },\n\n async cancelQueryInternal() {\n if (conn) {\n try {\n await conn.cancelSent();\n } catch (err) {\n console.warn('DuckDB cancelSent failed:', err);\n }\n }\n },\n\n async loadFileInternal(\n file: string | File,\n tableName: string,\n opts?: LoadFileOptions,\n ) {\n if (!conn) {\n throw new Error('DuckDB connection not initialized');\n }\n await withTempRegisteredFile(file, async (fileName) => {\n if (opts && isSpatialLoadFileOptions(opts)) {\n await conn!.query(loadSpatial(tableName, fileName, opts));\n } else if (!opts?.method && /\\.geojson$/i.test(fileName)) {\n try {\n await conn!.query(loadSpatial(tableName, fileName, opts ?? {}));\n } catch {\n await conn!.query(load('auto', tableName, fileName, opts));\n }\n } else {\n await conn!.query(\n load(opts?.method ?? 'auto', tableName, fileName, opts),\n );\n }\n });\n },\n\n async loadArrowInternal(\n file: arrow.Table | Uint8Array,\n tableName: string,\n opts?: {schema?: string},\n ) {\n if (!conn) {\n throw new Error('DuckDB connection not initialized');\n }\n const options = {name: tableName, schema: opts?.schema};\n if (file instanceof arrow.Table) {\n await conn.insertArrowTable(file, options);\n } else {\n await conn.insertArrowFromIPCStream(file, options);\n }\n },\n\n async loadObjectsInternal(\n file: Record<string, unknown>[],\n tableName: string,\n opts?: StandardLoadOptions,\n ) {\n if (!conn) {\n throw new Error('DuckDB connection not initialized');\n }\n await conn.query(loadObjectsSql(tableName, file, opts));\n },\n };\n\n const base = createBaseDuckDbConnector({dbPath, initializationQuery}, impl);\n\n async function withTempRegisteredFile(\n file: string | File,\n action: (fileName: string) => Promise<void>,\n ) {\n if (!conn || !db) {\n throw new Error('DuckDB connection not initialized');\n }\n let fileName: string;\n let tempFileName: string | undefined = undefined;\n if (file instanceof File) {\n const {ext} = splitFilePath(file.name);\n tempFileName = `${Math.random().toString(36).substring(2, 15)}${ext ? `.${ext}` : ''}`;\n fileName = tempFileName;\n await db.registerFileHandle(\n fileName,\n file,\n DuckDBDataProtocol.BROWSER_FILEREADER,\n true,\n );\n } else {\n fileName = file;\n }\n try {\n await action(fileName);\n } finally {\n if (tempFileName) {\n await db!.dropFile(tempFileName);\n }\n }\n }\n\n return {\n ...base,\n getDb() {\n if (!db) {\n throw new Error('DuckDB not initialized');\n }\n return db;\n },\n getConnection() {\n if (!conn) {\n throw new Error('DuckDB connection not initialized');\n }\n return conn;\n },\n get type() {\n return 'wasm' as const;\n },\n };\n}\n"]}
@@ -13,13 +13,36 @@ export interface WebSocketDuckDbConnectorOptions {
13
13
  initializationQuery?: string;
14
14
  /** Optional handler for server notifications `{ type: 'notify', payload }` */
15
15
  onNotification?: (payload: any) => void;
16
+ /** Optional handler for persistent WebSocket connection lifecycle changes. */
17
+ onConnectionStatusChange?: (status: WebSocketDuckDbConnectionStatus) => void;
16
18
  /** Optional list of channels to subscribe to upon (re)connect */
17
19
  subscribeChannels?: string[];
18
20
  /** Optional bearer token to authenticate with the server */
19
21
  authToken?: string;
20
22
  }
23
+ /**
24
+ * Persistent WebSocket connection lifecycle status.
25
+ *
26
+ * @public
27
+ */
28
+ export type WebSocketDuckDbConnectionStatus = 'idle' | 'connecting' | 'connected' | 'disconnected';
21
29
  export interface WebSocketDuckDbConnector extends DuckDbConnector {
22
30
  readonly type: 'ws';
31
+ /**
32
+ * Current persistent WebSocket connection status.
33
+ */
34
+ readonly connectionStatus: WebSocketDuckDbConnectionStatus;
35
+ /**
36
+ * Subscribe to persistent WebSocket connection lifecycle changes.
37
+ *
38
+ * @returns Unsubscribe callback.
39
+ */
40
+ subscribeConnectionStatus(listener: (status: WebSocketDuckDbConnectionStatus) => void): () => void;
41
+ /**
42
+ * Reopen the persistent WebSocket and rerun connector initialization SQL
43
+ * without destroying the connector instance.
44
+ */
45
+ reconnect(): Promise<void>;
23
46
  }
24
47
  /**
25
48
  * Create a DuckDB connector that talks to a WebSocket backend.
@@ -1 +1 @@
1
- {"version":3,"file":"WebSocketDuckDbConnector.d.ts","sourceRoot":"","sources":["../../src/connectors/WebSocketDuckDbConnector.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,eAAe,EAEhB,MAAM,uBAAuB,CAAC;AAW/B;;;;GAIG;AACH,MAAM,WAAW,+BAA+B;IAC9C;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,sCAAsC;IACtC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B,8EAA8E;IAC9E,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IAExC,iEAAiE;IACjE,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE7B,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,wBAAyB,SAAQ,eAAe;IAC/D,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;CACrB;AAED;;;;;;;;;;;GAWG;AACH;;;;GAIG;AACH,wBAAgB,8BAA8B,CAC5C,OAAO,GAAE,+BAAoC,GAC5C,wBAAwB,CA0Y1B"}
1
+ {"version":3,"file":"WebSocketDuckDbConnector.d.ts","sourceRoot":"","sources":["../../src/connectors/WebSocketDuckDbConnector.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,eAAe,EAEhB,MAAM,uBAAuB,CAAC;AAW/B;;;;GAIG;AACH,MAAM,WAAW,+BAA+B;IAC9C;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,sCAAsC;IACtC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B,8EAA8E;IAC9E,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IAExC,8EAA8E;IAC9E,wBAAwB,CAAC,EAAE,CAAC,MAAM,EAAE,+BAA+B,KAAK,IAAI,CAAC;IAE7E,iEAAiE;IACjE,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE7B,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,MAAM,+BAA+B,GACvC,MAAM,GACN,YAAY,GACZ,WAAW,GACX,cAAc,CAAC;AAEnB,MAAM,WAAW,wBAAyB,SAAQ,eAAe;IAC/D,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IAEpB;;OAEG;IACH,QAAQ,CAAC,gBAAgB,EAAE,+BAA+B,CAAC;IAE3D;;;;OAIG;IACH,yBAAyB,CACvB,QAAQ,EAAE,CAAC,MAAM,EAAE,+BAA+B,KAAK,IAAI,GAC1D,MAAM,IAAI,CAAC;IAEd;;;OAGG;IACH,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED;;;;;;;;;;;GAWG;AACH;;;;GAIG;AACH,wBAAgB,8BAA8B,CAC5C,OAAO,GAAE,+BAAoC,GAC5C,wBAAwB,CAwc1B"}
@@ -25,6 +25,9 @@ export function createWebSocketDuckDbConnector(options = {}) {
25
25
  // Persistent socket and per-query waiters
26
26
  let socket = null;
27
27
  let opening = null;
28
+ let intentionalClose = false;
29
+ let connectionStatus = 'idle';
30
+ const connectionStatusListeners = new Set();
28
31
  const lastSubscribedChannels = subscribeChannels;
29
32
  const pending = new Map();
30
33
  const pendingUploads = new Map();
@@ -46,6 +49,23 @@ export function createWebSocketDuckDbConnector(options = {}) {
46
49
  pendingUploads.delete(qid);
47
50
  }
48
51
  };
52
+ const setConnectionStatus = (status) => {
53
+ if (connectionStatus === status)
54
+ return;
55
+ connectionStatus = status;
56
+ try {
57
+ options.onConnectionStatusChange?.(status);
58
+ // eslint-disable-next-line no-empty
59
+ }
60
+ catch { }
61
+ for (const listener of connectionStatusListeners) {
62
+ try {
63
+ listener(status);
64
+ // eslint-disable-next-line no-empty
65
+ }
66
+ catch { }
67
+ }
68
+ };
49
69
  // Guard to avoid duplicate subscribe sends on open + initialize
50
70
  const resubscribe = () => {
51
71
  if (!socket || socket.readyState !== WebSocket.OPEN)
@@ -65,10 +85,12 @@ export function createWebSocketDuckDbConnector(options = {}) {
65
85
  return Promise.resolve();
66
86
  if (opening)
67
87
  return opening;
88
+ setConnectionStatus('connecting');
68
89
  opening = new Promise((resolve, reject) => {
69
90
  try {
70
91
  const ws = new WebSocket(wsUrl);
71
92
  socket = ws;
93
+ intentionalClose = false;
72
94
  ws.binaryType = 'arraybuffer';
73
95
  let authAcked = !authToken;
74
96
  ws.onopen = () => {
@@ -85,6 +107,7 @@ export function createWebSocketDuckDbConnector(options = {}) {
85
107
  // No auth required; resolve immediately
86
108
  opening = null;
87
109
  resubscribe();
110
+ setConnectionStatus('connected');
88
111
  resolve();
89
112
  }
90
113
  // eslint-disable-next-line no-empty
@@ -108,12 +131,20 @@ export function createWebSocketDuckDbConnector(options = {}) {
108
131
  opening = null;
109
132
  // Subscribe once authed
110
133
  resubscribe();
134
+ setConnectionStatus('connected');
111
135
  resolve();
112
136
  }
113
137
  else if (t === 'error') {
114
138
  const msg = parsed?.error || 'Unauthorized';
115
139
  opening = null;
140
+ setConnectionStatus('disconnected');
116
141
  reject(new Error(msg));
142
+ try {
143
+ ws.close();
144
+ // eslint-disable-next-line no-empty
145
+ }
146
+ catch { }
147
+ socket = null;
117
148
  }
118
149
  return;
119
150
  }
@@ -233,6 +264,7 @@ export function createWebSocketDuckDbConnector(options = {}) {
233
264
  // eslint-disable-next-line no-empty
234
265
  }
235
266
  catch { }
267
+ setConnectionStatus('disconnected');
236
268
  };
237
269
  ws.onclose = () => {
238
270
  if (opening) {
@@ -241,10 +273,13 @@ export function createWebSocketDuckDbConnector(options = {}) {
241
273
  }
242
274
  closeAndRejectAll('WebSocket closed');
243
275
  socket = null;
276
+ setConnectionStatus(intentionalClose ? 'idle' : 'disconnected');
277
+ intentionalClose = false;
244
278
  };
245
279
  }
246
280
  catch (e) {
247
281
  opening = null;
282
+ setConnectionStatus('disconnected');
248
283
  reject(e);
249
284
  }
250
285
  });
@@ -258,11 +293,13 @@ export function createWebSocketDuckDbConnector(options = {}) {
258
293
  },
259
294
  async destroyInternal() {
260
295
  try {
296
+ intentionalClose = true;
261
297
  socket?.close();
262
298
  // eslint-disable-next-line no-empty
263
299
  }
264
300
  catch { }
265
301
  socket = null;
302
+ setConnectionStatus('idle');
266
303
  },
267
304
  async executeQueryInternal(query, signal, queryId) {
268
305
  if (signal.aborted) {
@@ -335,6 +372,16 @@ export function createWebSocketDuckDbConnector(options = {}) {
335
372
  if (opts && isSpatialLoadFileOptions(opts)) {
336
373
  sql = loadSpatial(tableName, filePath, opts);
337
374
  }
375
+ else if (!opts?.method && /\.geojson$/i.test(filePath)) {
376
+ sql = loadSpatial(tableName, filePath, opts ?? {});
377
+ try {
378
+ await impl.executeQueryInternal?.(sql, new AbortController().signal);
379
+ return;
380
+ }
381
+ catch {
382
+ sql = load('auto', tableName, filePath, opts);
383
+ }
384
+ }
338
385
  else {
339
386
  sql = load(opts?.method ?? 'auto', tableName, filePath, opts);
340
387
  }
@@ -378,6 +425,21 @@ export function createWebSocketDuckDbConnector(options = {}) {
378
425
  get type() {
379
426
  return 'ws';
380
427
  },
428
+ get connectionStatus() {
429
+ return connectionStatus;
430
+ },
431
+ subscribeConnectionStatus(listener) {
432
+ connectionStatusListeners.add(listener);
433
+ return () => {
434
+ connectionStatusListeners.delete(listener);
435
+ };
436
+ },
437
+ async reconnect() {
438
+ await ensureSocket();
439
+ if (initializationQuery) {
440
+ await impl.executeQueryInternal(initializationQuery, new AbortController().signal);
441
+ }
442
+ },
381
443
  };
382
444
  }
383
445
  //# sourceMappingURL=WebSocketDuckDbConnector.js.map