cloudflare-kv-binding_DMly_2Gl.mjs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. globalThis.process ??= {}; globalThis.process.env ??= {};
  2. function defineDriver(factory) {
  3. return factory;
  4. }
  5. function normalizeKey(key, sep = ":") {
  6. if (!key) {
  7. return "";
  8. }
  9. return key.replace(/[:/\\]/g, sep).replace(/^[:/\\]|[:/\\]$/g, "");
  10. }
  11. function joinKeys(...keys) {
  12. return keys.map((key) => normalizeKey(key)).filter(Boolean).join(":");
  13. }
  14. function createError(driver, message, opts) {
  15. const err = new Error(`[unstorage] [${driver}] ${message}`, opts);
  16. if (Error.captureStackTrace) {
  17. Error.captureStackTrace(err, createError);
  18. }
  19. return err;
  20. }
  21. function getBinding(binding) {
  22. let bindingName = "[binding]";
  23. if (typeof binding === "string") {
  24. bindingName = binding;
  25. binding = globalThis[bindingName] || globalThis.__env__?.[bindingName];
  26. }
  27. if (!binding) {
  28. throw createError(
  29. "cloudflare",
  30. `Invalid binding \`${bindingName}\`: \`${binding}\``
  31. );
  32. }
  33. for (const key of ["get", "put", "delete"]) {
  34. if (!(key in binding)) {
  35. throw createError(
  36. "cloudflare",
  37. `Invalid binding \`${bindingName}\`: \`${key}\` key is missing`
  38. );
  39. }
  40. }
  41. return binding;
  42. }
  43. function getKVBinding(binding = "STORAGE") {
  44. return getBinding(binding);
  45. }
  46. const DRIVER_NAME = "cloudflare-kv-binding";
  47. const cloudflareKvBinding = defineDriver((opts) => {
  48. const r = (key = "") => opts.base ? joinKeys(opts.base, key) : key;
  49. async function getKeys(base = "") {
  50. base = r(base);
  51. const binding = getKVBinding(opts.binding);
  52. const keys = [];
  53. let cursor = void 0;
  54. do {
  55. const kvList = await binding.list({ prefix: base || void 0, cursor });
  56. keys.push(...kvList.keys);
  57. cursor = kvList.list_complete ? void 0 : kvList.cursor;
  58. } while (cursor);
  59. return keys.map((key) => key.name);
  60. }
  61. return {
  62. name: DRIVER_NAME,
  63. options: opts,
  64. getInstance: () => getKVBinding(opts.binding),
  65. async hasItem(key) {
  66. key = r(key);
  67. const binding = getKVBinding(opts.binding);
  68. return await binding.get(key) !== null;
  69. },
  70. getItem(key) {
  71. key = r(key);
  72. const binding = getKVBinding(opts.binding);
  73. return binding.get(key);
  74. },
  75. setItem(key, value, topts) {
  76. key = r(key);
  77. const binding = getKVBinding(opts.binding);
  78. return binding.put(
  79. key,
  80. value,
  81. topts ? {
  82. expirationTtl: topts?.ttl ? Math.max(topts.ttl, opts.minTTL ?? 60) : void 0,
  83. ...topts
  84. } : void 0
  85. );
  86. },
  87. removeItem(key) {
  88. key = r(key);
  89. const binding = getKVBinding(opts.binding);
  90. return binding.delete(key);
  91. },
  92. getKeys(base) {
  93. return getKeys(base).then(
  94. (keys) => keys.map((key) => opts.base ? key.slice(opts.base.length) : key)
  95. );
  96. },
  97. async clear(base) {
  98. const binding = getKVBinding(opts.binding);
  99. const keys = await getKeys(base);
  100. await Promise.all(keys.map((key) => binding.delete(key)));
  101. }
  102. };
  103. });
  104. export { cloudflareKvBinding as default };