80 lines
2.3 KiB
JavaScript
80 lines
2.3 KiB
JavaScript
"use strict";
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _kv = require("@vercel/kv");
|
|
var _utils = require("./utils/index.cjs");
|
|
const DRIVER_NAME = "vercel-kv";
|
|
module.exports = (0, _utils.defineDriver)(opts => {
|
|
const base = (0, _utils.normalizeKey)(opts?.base);
|
|
const r = (...keys) => (0, _utils.joinKeys)(base, ...keys);
|
|
let _client;
|
|
const getClient = () => {
|
|
if (!_client) {
|
|
const envPrefix = typeof process !== "undefined" && opts.env !== false ? `${opts.env || "KV"}_` : "";
|
|
if (!opts.url) {
|
|
const envName = envPrefix + "REST_API_URL";
|
|
if (envPrefix && process.env[envName]) {
|
|
opts.url = process.env[envName];
|
|
} else {
|
|
throw (0, _utils.createError)("vercel-kv", `missing required \`url\` option or '${envName}' env.`);
|
|
}
|
|
}
|
|
if (!opts.token) {
|
|
const envName = envPrefix + "REST_API_TOKEN";
|
|
if (envPrefix && process.env[envName]) {
|
|
opts.token = process.env[envName];
|
|
} else {
|
|
throw (0, _utils.createError)("vercel-kv", `missing required \`token\` option or '${envName}' env.`);
|
|
}
|
|
}
|
|
_client = (0, _kv.createClient)(opts);
|
|
}
|
|
return _client;
|
|
};
|
|
const scan = async pattern => {
|
|
const client = getClient();
|
|
const keys = [];
|
|
let cursor = "0";
|
|
do {
|
|
const [nextCursor, scanKeys] = await client.scan(cursor, {
|
|
match: pattern,
|
|
count: opts.scanCount
|
|
});
|
|
cursor = nextCursor;
|
|
keys.push(...scanKeys);
|
|
} while (cursor !== "0");
|
|
return keys;
|
|
};
|
|
return {
|
|
name: DRIVER_NAME,
|
|
getInstance: getClient,
|
|
hasItem(key) {
|
|
return getClient().exists(r(key)).then(Boolean);
|
|
},
|
|
getItem(key) {
|
|
return getClient().get(r(key));
|
|
},
|
|
setItem(key, value, tOptions) {
|
|
const ttl = tOptions?.ttl ?? opts.ttl;
|
|
return getClient().set(r(key), value, ttl ? {
|
|
ex: ttl
|
|
} : void 0).then(() => {});
|
|
},
|
|
removeItem(key) {
|
|
return getClient().unlink(r(key)).then(() => {});
|
|
},
|
|
getKeys(base2) {
|
|
return scan(r(base2, "*"));
|
|
},
|
|
async clear(base2) {
|
|
const keys = await scan(r(base2, "*"));
|
|
if (keys.length === 0) {
|
|
return;
|
|
}
|
|
return getClient().del(...keys).then(() => {});
|
|
}
|
|
};
|
|
}); |