{"version":3,"file":"index.mjs","sources":["../../../@hive/node-driver/dist/index.mjs"],"sourcesContent":["import { stat, access, mkdir, unlink, constants, rm } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { Driver } from '@hive/sdk/driver';\nimport { UnexpectedErrorEvent } from '@hive/sdk/events';\nimport { formatDuration } from '@hive/sdk/format';\nimport { Operation } from '@hive/sdk/operation';\nimport { SENSIBLE_DEFAULTS } from '@hive/sdk/sqlite';\nimport { mkdirSync, writeFileSync, createReadStream, accessSync } from 'node:fs';\nimport { DatabaseSync } from 'node:sqlite';\nimport { Readable } from 'node:stream';\nimport { Connection } from '@hive/sdk/connection';\nimport { StatementPreparationError, StatementExecutionError } from '@hive/sdk/errors';\nimport { ByteStream } from '@hive/streams';\n\nconst exists$1 = async (path) => access(path, constants.F_OK).then(() => true).catch(() => false);\nconst existsSync = (path) => {\n  try {\n    accessSync(path, constants.F_OK);\n    return true;\n  } catch {\n    return false;\n  }\n};\nclass NodeDatabaseConnection extends Connection {\n  /**\n   * Internal `DatabaseSync` (from `node:sqlite`) instance, facilitating\n   * native SQLite function bindings.\n   */\n  db;\n  /**\n   * Path on the source database file on disk. If the contents were provided\n   * in-memory, this will be a temporary file.\n   */\n  path;\n  /**\n   * Whether the database file is temporary and should be deleted on close.\n   * This is true when the database was created from in-memory contents.\n   */\n  isTemporary;\n  /**\n   * Path to the temporary directory for storing temporary files.\n   */\n  tmpDir;\n  /**\n   * Logger instance to use for logging.\n   */\n  logger = null;\n  /**\n   * Error handler to invoke with any errors which might occur during\n   * background tasks.\n   */\n  onError = null;\n  constructor(contents, opts) {\n    super();\n    this.logger = opts.logger ?? null;\n    this.onError = opts.onError ?? null;\n    this.tmpDir = opts.tmpDir;\n    if (typeof contents === \"string\") {\n      this.path = contents;\n      this.isTemporary = false;\n      this.db = new DatabaseSync(contents);\n    } else {\n      if (contents.length === 0) throw new Error(\"Provided contents must not be empty.\");\n      if (!existsSync(this.tmpDir)) mkdirSync(this.tmpDir, { recursive: true });\n      const tmpPath = resolve(this.tmpDir, `${crypto.randomUUID()}.db`);\n      writeFileSync(tmpPath, contents);\n      this.path = tmpPath;\n      this.isTemporary = true;\n      this.db = new DatabaseSync(tmpPath);\n    }\n  }\n  getSize = async () => {\n    const { size } = await stat(this.path);\n    return size;\n  };\n  getContents = async () => {\n    if (!await exists$1(this.tmpDir)) await mkdir(this.tmpDir, { recursive: true });\n    const tmpPath = resolve(this.tmpDir, `${crypto.randomUUID()}.tmp`);\n    const tmpDb = new DatabaseSync(this.path);\n    if (this.path !== \":memory:\") {\n      tmpDb.exec(\"PRAGMA wal_checkpoint(TRUNCATE);\");\n    }\n    const vacuumStmt = tmpDb.prepare(\"VACUUM INTO ?;\");\n    vacuumStmt.run(tmpPath);\n    tmpDb.close();\n    const { size } = await stat(tmpPath);\n    const nodeStream = createReadStream(tmpPath);\n    const webStream = Readable.toWeb(nodeStream);\n    const logger = this.logger;\n    const onError = this.onError;\n    const { readable, writable } = new TransformStream({\n      transform(chunk, controller) {\n        controller.enqueue(chunk);\n      },\n      flush() {\n        unlink(tmpPath).catch((err) => {\n          const error = new Error(\n            `Error cleaning up temporary file \\`${tmpPath}\\`: ${err instanceof Error ? err.message : String(err)}`\n          );\n          logger?.error(\"error cleaning up temporary file\", {\n            module: NodeDatabaseConnection.name,\n            trace: crypto.randomUUID(),\n            path: tmpPath,\n            error\n          });\n          onError?.(new UnexpectedErrorEvent({ error, trace: crypto.randomUUID() }));\n        });\n      }\n    });\n    webStream.pipeTo(writable).catch(() => {\n      unlink(tmpPath).catch((unlinkErr) => {\n        const error = new Error(\n          `Error cleaning up temporary file \\`${tmpPath}\\`: ${unlinkErr instanceof Error ? unlinkErr.message : String(unlinkErr)}`\n        );\n        logger?.error(\"error cleaning up temporary file\", {\n          module: NodeDatabaseConnection.name,\n          trace: crypto.randomUUID(),\n          path: tmpPath,\n          error\n        });\n        onError?.(new UnexpectedErrorEvent({ error, trace: crypto.randomUUID() }));\n      });\n    });\n    return new ByteStream(readable, {\n      length: size\n    });\n  };\n  query = (transaction) => {\n    const { statements, mode } = transaction;\n    const results = [];\n    return new Promise((resolve2, reject) => {\n      try {\n        if (mode) this.db.exec(`BEGIN ${mode} TRANSACTION;`);\n        for (const statement of statements) {\n          let prepared;\n          try {\n            prepared = typeof statement === \"string\" ? this.db.prepare(statement) : this.db.prepare(statement.sql);\n          } catch (err) {\n            const error = err instanceof Error ? err : new Error(String(err));\n            throw new StatementPreparationError(error.message, statement);\n          }\n          try {\n            const params = typeof statement !== \"string\" && statement.params ? Array.isArray(statement.params) ? statement.params : [statement.params] : [];\n            switch (statement.method) {\n              case \"all\": {\n                results.push({\n                  statement,\n                  rows: prepared.all(\n                    ...params\n                  )\n                });\n                break;\n              }\n              case \"get\": {\n                const result = prepared.get(...params);\n                results.push({\n                  statement,\n                  rows: [result ?? null]\n                });\n                break;\n              }\n              case \"values\": {\n                prepared.setReturnArrays(true);\n                results.push({\n                  statement,\n                  rows: prepared.all(...params)\n                });\n                break;\n              }\n              case \"run\": {\n                prepared.run(...params);\n                results.push({\n                  statement,\n                  rows: []\n                });\n                break;\n              }\n            }\n          } catch (err) {\n            const error = err instanceof Error ? err : new Error(String(err));\n            throw new StatementExecutionError(error.message, statement);\n          }\n        }\n        if (mode) this.db.exec(\"COMMIT;\");\n        resolve2(results);\n      } catch (err) {\n        if (mode) this.db.exec(\"ROLLBACK;\");\n        reject(err);\n      }\n    });\n  };\n  /**\n   * Close the `NodeDatabaseConnection` instance.\n   *\n   * @returns Promise resolving when the `NodeDatabaseConnection` instance has\n   * been closed.\n   */\n  close = async (_opts) => {\n    this.db.close();\n    if (this.isTemporary && await exists$1(this.path)) await unlink(this.path);\n    return Promise.resolve(this);\n  };\n}\n\nconst exists = async (path) => access(path, constants.F_OK).then(() => true).catch(() => false);\nclass NodeDriver extends Driver {\n  static name = \"node-driver\";\n  /**\n   * `Logger` instance to use for logging.\n   */\n  logger = null;\n  /**\n   * Error handler to invoke with any errors which might occur during\n   * background tasks.\n   */\n  onError = null;\n  /**\n   * List of Statements to provision a `Connection` with after opening it.\n   *\n   * Allows for applying custom SQLite default settings like WAL mode or a\n   * custom page size.\n   */\n  provision;\n  /**\n   * Path to the temporary directory for storing temporary database files.\n   *\n   * Directory is created lazily when needed and cleaned up on stop if it\n   * was created.\n   */\n  tmpDir;\n  constructor(config) {\n    super();\n    this.tmpDir = config?.tmpDir ?? resolve(\".tmp\", crypto.randomUUID());\n    this.provision = config?.provision ?? SENSIBLE_DEFAULTS;\n  }\n  start = async (opts) => {\n    const trace = opts?.trace ?? crypto.randomUUID();\n    const operation = new Operation({\n      trace\n    });\n    this.logger = opts?.logger ?? null;\n    this.onError = opts?.onError ?? null;\n    this.logger?.info(\"initialized driver instance\", {\n      module: NodeDriver.name,\n      trace,\n      dur: formatDuration(operation.duration)\n    });\n    return Promise.resolve(this);\n  };\n  stop = async (opts) => {\n    const trace = opts?.trace ?? crypto.randomUUID();\n    const operation = new Operation({\n      trace\n    });\n    if (await exists(this.tmpDir)) {\n      await rm(this.tmpDir, { recursive: true, force: true }).catch((err) => {\n        const error = new Error(\n          `Error cleaning up temporary directory \\`${this.tmpDir}\\`: ${err instanceof Error ? err.message : String(err)}`\n        );\n        this.logger?.error(\"error cleaning up temporary directory\", {\n          module: NodeDriver.name,\n          trace,\n          path: this.tmpDir,\n          error\n        });\n        throw error;\n      });\n    }\n    this.logger?.info(\"closed driver instance\", {\n      module: NodeDriver.name,\n      trace,\n      dur: formatDuration(operation.duration)\n    });\n    return Promise.resolve(this);\n  };\n  open = async (contents, opts) => {\n    const trace = opts?.trace ?? crypto.randomUUID();\n    const operation = new Operation({\n      trace\n    });\n    if (typeof contents === \"string\" && contents !== \":memory:\")\n      await access(contents, constants.F_OK).catch((err) => {\n        const error = new Error(\n          `Unable to open file \\`${contents}\\`: ${err instanceof Error ? err.message : String(err)}`\n        );\n        this.logger?.error(\"unable to open database file\", {\n          module: NodeDriver.name,\n          trace,\n          dur: formatDuration(operation.duration),\n          path: contents,\n          error\n        });\n        this.onError?.(new UnexpectedErrorEvent({ error, trace }));\n        throw error;\n      });\n    const connection = new NodeDatabaseConnection(contents, {\n      tmpDir: this.tmpDir,\n      logger: this.logger,\n      onError: this.onError\n    });\n    if (this.provision.length > 0)\n      await connection.query({\n        statements: (\n          // Ensure that, when opening the Database file in-memory, WAL mode is\n          // not enabled, since it is not supported.\n          typeof contents === \"string\" && contents !== \":memory:\" ? this.provision : this.provision.filter(\n            (statement) => !statement.sql.includes(\"journal_mode = WAL\")\n          )\n        ),\n        mode: false\n      });\n    this.logger?.debug(\"opened connection\", {\n      module: NodeDriver.name,\n      trace,\n      dur: formatDuration(operation.duration),\n      path: typeof contents === \"string\" ? contents : \":memory:\"\n    });\n    return connection;\n  };\n}\n\nexport { NodeDatabaseConnection, NodeDriver };\n"],"names":[],"mappings":"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"}