{"version":3,"sources":["jsdelivr-header.js","/npm/fs-key-value@1.2.0/fs-key-value.js"],"names":[],"mappings":"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","file":"/npm/fs-key-value@1.2.0/fs-key-value.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/fs-key-value@1.2.0/fs-key-value.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","'use strict';\n\nconst fs = require('fs');\nconst fsp = require('fs/promises');\nconst fsExt = require('fs-ext');\nconst path = require('path');\nconst { promisify } = require('util');\n\nconst flock = promisify(fsExt.flock);\n\n/**\n * @callback ErrorCallback\n * @param {Error|null} err - Error if one occurred\n */\n\n/**\n * @callback GetCallback\n * @param {Error|null} err - Error if one occurred\n * @param {*} [value] - The retrieved value, or undefined if key doesn't exist\n */\n\n/**\n * @callback OpenCallback\n * @param {Error|null} err - Error if one occurred\n * @param {FsKeyValue} [instance] - The initialized FsKeyValue instance\n */\n\n/**\n * Filesystem-based key-value store with file locking.\n *\n * Stores values as JSON files in a directory, using POSIX file locks\n * for safe concurrent access.\n *\n * @constructor\n * @param {string} [directory] - Path to storage directory\n * @param {OpenCallback} [callback] - Called when initialization completes\n *\n * @example\n * var FsKeyValue = require('fs-key-value');\n * var store = new FsKeyValue('/tmp/mydb', function(err, db) {\n *   if (err) throw err;\n *   db.put('mykey', { foo: 'bar' }, function(err) {\n *     if (err) throw err;\n *     console.log('Value stored');\n *   });\n * });\n */\nfunction FsKeyValue(directory, callback) {\n  if (directory) {\n    this.open(directory, callback);\n  }\n}\n\n/**\n * The storage directory path.\n * @type {string}\n */\nFsKeyValue.prototype.directory = undefined;\n\n/**\n * Path to the directory lock file.\n * @type {string}\n */\nFsKeyValue.prototype.directoryLock = undefined;\n\n/**\n * Initialize the store with a directory.\n *\n * Creates the directory if it doesn't exist.\n *\n * @param {string} directory - Path to storage directory\n * @param {OpenCallback} [callback] - Called when initialization completes\n */\nFsKeyValue.prototype.open = function (directory, callback) {\n  if (typeof callback !== 'function') {\n    callback = function (err) {\n      if (err) {\n        throw err;\n      }\n    };\n  }\n\n  this.openAsync(directory)\n    .then(() => callback(null, this))\n    .catch((err) => callback(err));\n};\n\n/**\n * Initialize the store with a directory (async version).\n *\n * Creates the directory if it doesn't exist.\n *\n * @param {string} directory - Path to storage directory\n * @returns {Promise<void>}\n */\nFsKeyValue.prototype.openAsync = async function (directory) {\n  const exists = fs.existsSync(directory);\n  if (!exists) {\n    await fsp.mkdir(directory, { mode: 0o777 });\n  }\n  this.directory = directory;\n  this.directoryLock = path.join(directory, '.lock');\n};\n\n/**\n * Retrieve a value by key.\n *\n * Uses a shared lock on the key file for safe concurrent reads.\n *\n * @param {string} key - The key to retrieve\n * @param {GetCallback} [callback] - Called with the value or undefined if not found\n */\nFsKeyValue.prototype.get = function (key, callback) {\n  if (typeof callback !== 'function') {\n    callback = function (err) {\n      if (err) {\n        throw err;\n      }\n    };\n  }\n\n  this.getAsync(key)\n    .then((value) => {\n      if (value === undefined) {\n        // Preserve original behavior: callback() with no args for missing keys\n        callback();\n      } else {\n        callback(null, value);\n      }\n    })\n    .catch((err) => callback(err));\n};\n\n/**\n * Retrieve a value by key (async version).\n *\n * Uses a shared lock on the key file for safe concurrent reads.\n *\n * @param {string} key - The key to retrieve\n * @returns {Promise<*>} The value, or undefined if key doesn't exist\n */\nFsKeyValue.prototype.getAsync = async function (key) {\n  const filename = path.join(this.directory, key);\n  let dirlock = null;\n  let keyfile = null;\n\n  try {\n    // Open and lock directory\n    dirlock = fs.openSync(this.directoryLock, 'a', 0o666);\n    await flock(dirlock, 'sh');\n\n    // Check if key exists\n    const exists = fs.existsSync(filename);\n    if (!exists) {\n      return undefined;\n    }\n\n    // Open and lock key file\n    keyfile = fs.openSync(filename, 'a+', 0o666);\n    await flock(keyfile, 'sh');\n\n    // Read value\n    const data = await fsp.readFile(filename, { encoding: 'utf8' });\n    return JSON.parse(data);\n  } finally {\n    // Release locks and close files\n    if (keyfile !== null) {\n      try {\n        await flock(keyfile, 'un');\n      } catch {\n        /* ignore */\n      }\n      try {\n        fs.closeSync(keyfile);\n      } catch {\n        /* ignore */\n      }\n    }\n    if (dirlock !== null) {\n      try {\n        await flock(dirlock, 'un');\n      } catch {\n        /* ignore */\n      }\n      try {\n        fs.closeSync(dirlock);\n      } catch {\n        /* ignore */\n      }\n    }\n  }\n};\n\n/**\n * Store a value by key.\n *\n * Uses an exclusive lock on the key file for safe writes.\n * The value is serialized to JSON.\n *\n * @param {string} key - The key to store\n * @param {*} value - The value to store (must be JSON-serializable)\n * @param {ErrorCallback} [callback] - Called when write completes\n */\nFsKeyValue.prototype.put = function (key, value, callback) {\n  if (typeof callback !== 'function') {\n    callback = function (err) {\n      if (err) {\n        throw err;\n      }\n    };\n  }\n\n  this.putAsync(key, value)\n    .then(() => callback(null))\n    .catch((err) => callback(err));\n};\n\n/**\n * Store a value by key (async version).\n *\n * Uses an exclusive lock on the key file for safe writes.\n * The value is serialized to JSON.\n *\n * @param {string} key - The key to store\n * @param {*} value - The value to store (must be JSON-serializable)\n * @returns {Promise<void>}\n */\nFsKeyValue.prototype.putAsync = async function (key, value) {\n  const filename = path.join(this.directory, key);\n  let dirlock = null;\n  let keyfile = null;\n\n  try {\n    // Open and lock directory (shared lock for puts)\n    dirlock = fs.openSync(this.directoryLock, 'a', 0o666);\n    await flock(dirlock, 'sh');\n\n    // Open and lock key file (exclusive lock for write)\n    keyfile = fs.openSync(filename, 'a', 0o666);\n    await flock(keyfile, 'ex');\n\n    // Write value\n    await fsp.writeFile(filename, JSON.stringify(value), { encoding: 'utf8' });\n  } finally {\n    // Release locks and close files\n    if (keyfile !== null) {\n      try {\n        await flock(keyfile, 'un');\n      } catch {\n        /* ignore */\n      }\n      try {\n        fs.closeSync(keyfile);\n      } catch {\n        /* ignore */\n      }\n    }\n    if (dirlock !== null) {\n      try {\n        await flock(dirlock, 'un');\n      } catch {\n        /* ignore */\n      }\n      try {\n        fs.closeSync(dirlock);\n      } catch {\n        /* ignore */\n      }\n    }\n  }\n};\n\n/**\n * Delete a key from the store.\n *\n * Uses an exclusive lock on the directory for safe deletion.\n * Does nothing if the key doesn't exist.\n *\n * @param {string} key - The key to delete\n * @param {ErrorCallback} [callback] - Called when deletion completes\n */\nFsKeyValue.prototype.delete = function (key, callback) {\n  if (typeof callback !== 'function') {\n    callback = function (err) {\n      if (err) {\n        throw err;\n      }\n    };\n  }\n\n  this.deleteAsync(key)\n    .then(() => callback(null))\n    .catch((err) => callback(err));\n};\n\n/**\n * Delete a key from the store (async version).\n *\n * Uses an exclusive lock on the directory for safe deletion.\n * Does nothing if the key doesn't exist.\n *\n * @param {string} key - The key to delete\n * @returns {Promise<void>}\n */\nFsKeyValue.prototype.deleteAsync = async function (key) {\n  const filename = path.join(this.directory, key);\n  let dirlock = null;\n\n  try {\n    // Open and lock directory (exclusive lock for delete)\n    dirlock = fs.openSync(this.directoryLock, 'a', 0o666);\n    await flock(dirlock, 'ex');\n\n    // Delete if exists\n    const exists = fs.existsSync(filename);\n    if (exists) {\n      await fsp.unlink(filename);\n    }\n  } finally {\n    // Release lock and close file\n    if (dirlock !== null) {\n      try {\n        await flock(dirlock, 'un');\n      } catch {\n        /* ignore */\n      }\n      try {\n        fs.closeSync(dirlock);\n      } catch {\n        /* ignore */\n      }\n    }\n  }\n};\n\nmodule.exports = FsKeyValue;\n"]}