Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: expose underlying client instance #446

Merged
merged 13 commits into from
May 16, 2024
1 change: 1 addition & 0 deletions src/drivers/azure-app-configuration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ export default defineDriver((opts: AzureAppConfigurationOptions = {}) => {
return {
name: DRIVER_NAME,
options: opts,
getInstance: getClient,
async hasItem(key) {
try {
await getClient().getConfigurationSetting({
Expand Down
1 change: 1 addition & 0 deletions src/drivers/azure-cosmos.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ export default defineDriver((opts: AzureCosmosOptions) => {
return {
name: DRIVER_NAME,
options: opts,
getInstance: getCosmosClient,
async hasItem(key) {
const item = await (await getCosmosClient())
.item(key)
Expand Down
1 change: 1 addition & 0 deletions src/drivers/azure-key-vault.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ export default defineDriver((opts: AzureKeyVaultOptions) => {
return {
name: DRIVER_NAME,
options: opts,
getInstance: getKeyVaultClient,
async hasItem(key) {
try {
await getKeyVaultClient().getSecret(encode(key));
Expand Down
1 change: 1 addition & 0 deletions src/drivers/azure-storage-blob.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ export default defineDriver((opts: AzureStorageBlobOptions) => {
return {
name: DRIVER_NAME,
options: opts,
getInstance: getContainerClient,
async hasItem(key) {
return await getContainerClient().getBlockBlobClient(key).exists();
},
Expand Down
1 change: 1 addition & 0 deletions src/drivers/azure-storage-table.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ export default defineDriver((opts: AzureStorageTableOptions) => {
return {
name: DRIVER_NAME,
options: opts,
getInstance: getClient,
async hasItem(key) {
try {
await getClient().getEntity(partitionKey, key);
Expand Down
6 changes: 5 additions & 1 deletion src/drivers/capacitor-preferences.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,17 @@ export interface CapacitorPreferencesOptions {
base?: string;
}

export default defineDriver<CapacitorPreferencesOptions>((opts) => {
export default defineDriver<
CapacitorPreferencesOptions,
() => typeof Preferences
pi0 marked this conversation as resolved.
Show resolved Hide resolved
>((opts) => {
const base = normalizeKey(opts?.base || "");
const resolveKey = (key: string) => joinKeys(base, key);

return {
name: DRIVER_NAME,
options: opts,
getInstance: () => Preferences,
hasItem(key) {
return Preferences.keys().then((r) => r.keys.includes(resolveKey(key)));
},
Expand Down
1 change: 1 addition & 0 deletions src/drivers/cloudflare-kv-binding.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ export default defineDriver((opts: KVOptions) => {
return {
name: DRIVER_NAME,
options: opts,
getInstance: () => getKVBinding(opts.binding),
async hasItem(key) {
key = r(key);
const binding = getKVBinding(opts.binding);
Expand Down
1 change: 1 addition & 0 deletions src/drivers/cloudflare-r2-binding.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ export default defineDriver((opts: CloudflareR2Options = {}) => {
return {
name: DRIVER_NAME,
options: opts,
getInstance: () => getR2Binding(opts.binding),
async hasItem(key) {
key = r(key);
const binding = getR2Binding(opts.binding);
Expand Down
1 change: 1 addition & 0 deletions src/drivers/localstorage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ export default defineDriver((opts: LocalStorageOptions = {}) => {
return {
name: DRIVER_NAME,
options: opts,
getInstance: () => opts.localStorage!,
hasItem(key) {
return Object.prototype.hasOwnProperty.call(opts.localStorage!, r(key));
},
Expand Down
1 change: 1 addition & 0 deletions src/drivers/lru-cache.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ export default defineDriver((opts: LRUDriverOptions = {}) => {
return {
name: DRIVER_NAME,
options: opts,
getInstance: () => cache,
hasItem(key) {
return cache.has(key);
},
Expand Down
3 changes: 2 additions & 1 deletion src/drivers/memory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@ import { defineDriver } from "./utils";

const DRIVER_NAME = "memory";

export default defineDriver<void>(() => {
export default defineDriver<void, () => Map<string, any>>(() => {
const data = new Map<string, any>();

return {
name: DRIVER_NAME,
getInstance: () => data,
options: {},
hasItem(key) {
return data.has(key);
Expand Down
1 change: 1 addition & 0 deletions src/drivers/mongodb.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ export default defineDriver((opts: MongoDbOptions) => {
return {
name: DRIVER_NAME,
options: opts,
getInstance: getMongoCollection,
async hasItem(key) {
const result = await getMongoCollection().findOne({ key });
return !!result;
Expand Down
1 change: 1 addition & 0 deletions src/drivers/netlify-blobs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ export default defineDriver(
return {
name: DRIVER_NAME,
options: {},
getInstance: getClient,
async hasItem(key) {
return getClient().getMetadata(key).then(Boolean);
},
Expand Down
1 change: 1 addition & 0 deletions src/drivers/planetscale.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ export default defineDriver((opts: PlanetscaleDriverOptions = {}) => {
return {
name: DRIVER_NAME,
options: opts,
getInstance: getConnection,
hasItem: async (key) => {
const res = await getConnection().execute(
`SELECT EXISTS (SELECT 1 FROM ${opts.table} WHERE id = :key) as value;`,
Expand Down
3 changes: 2 additions & 1 deletion src/drivers/redis.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export interface RedisOptions extends _RedisOptions {

const DRIVER_NAME = "redis";

export default defineDriver((opts: RedisOptions = {}) => {
export default defineDriver<RedisOptions, () => Redis | Cluster>((opts) => {
let redisClient: Redis | Cluster;
const getRedisClient = () => {
if (redisClient) {
Expand All @@ -58,6 +58,7 @@ export default defineDriver((opts: RedisOptions = {}) => {
return {
name: DRIVER_NAME,
options: opts,
getInstance: getRedisClient,
async hasItem(key) {
return Boolean(await getRedisClient().exists(p(key)));
},
Expand Down
1 change: 1 addition & 0 deletions src/drivers/session-storage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ export default defineDriver((opts: SessionStorageOptions = {}) => {
return {
name: DRIVER_NAME,
options: opts,
getInstance: () => opts.sessionStorage!,
hasItem(key) {
return Object.prototype.hasOwnProperty.call(opts.sessionStorage, r(key));
},
Expand Down
8 changes: 4 additions & 4 deletions src/drivers/utils/index.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import type { Driver } from "../..";

type DriverFactory<T> = (opts: T) => Driver;
type DriverFactory<Opts, Instance> = (opts: Opts) => Driver<Instance>;
interface ErrorOptions {}

export function defineDriver<T = any>(
factory: DriverFactory<T>
): DriverFactory<T> {
export function defineDriver<Opts = any, Instance = undefined>(
factory: DriverFactory<Opts, Instance>
): DriverFactory<Opts, Instance> {
return factory;
}

Expand Down
3 changes: 2 additions & 1 deletion src/drivers/vercel-kv.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ export interface VercelKVOptions extends Partial<RedisConfigNodejs> {

const DRIVER_NAME = "vercel-kv";

export default defineDriver<VercelKVOptions>((opts) => {
export default defineDriver<VercelKVOptions, () => VercelKV>((opts) => {
const base = normalizeKey(opts?.base);
const r = (...keys: string[]) => joinKeys(base, ...keys);

Expand Down Expand Up @@ -63,6 +63,7 @@ export default defineDriver<VercelKVOptions>((opts) => {

return {
name: DRIVER_NAME,
getInstance: getClient,
hasItem(key) {
return getClient().exists(r(key)).then(Boolean);
},
Expand Down
10 changes: 5 additions & 5 deletions src/storage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,19 +13,19 @@ import { asyncCall, deserializeRaw, serializeRaw, stringify } from "./_utils";
import { normalizeKey, normalizeBaseKey, joinKeys } from "./utils";

interface StorageCTX {
mounts: Record<string, Driver>;
mounts: Record<string, Driver<any>>;
mountpoints: string[];
watching: boolean;
unwatch: Record<string, Unwatch>;
watchListeners: ((event: WatchEvent, key: string) => void)[];
}

export interface CreateStorageOptions {
driver?: Driver;
export interface CreateStorageOptions<Instance = undefined> {
driver?: Driver<Instance>;
}

export function createStorage<T extends StorageValue>(
options: CreateStorageOptions = {}
export function createStorage<T extends StorageValue, Instance = undefined>(
options: CreateStorageOptions<Instance> = {}
): Storage<T> {
const context: StorageCTX = {
mounts: { "": options.driver || memory() },
Expand Down
3 changes: 2 additions & 1 deletion src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,10 @@ export interface StorageMeta {

export type TransactionOptions = Record<string, any>;

export interface Driver {
export interface Driver<T = undefined> {
pi0 marked this conversation as resolved.
Show resolved Hide resolved
name?: string;
options?: any;
getInstance?: T;
hasItem: (key: string, opts: TransactionOptions) => MaybePromise<boolean>;
getItem: (
key: string,
Expand Down
18 changes: 12 additions & 6 deletions test/drivers/redis.test.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
import { describe, vi, it, expect } from "vitest";
import * as ioredis from "ioredis-mock";
import driver from "../../src/drivers/redis";
import redisDriver from "../../src/drivers/redis";
import { testDriver } from "./utils";

vi.mock("ioredis", () => ioredis);

describe("drivers: redis", () => {
const driver = redisDriver({
base: "test:",
url: "ioredis://localhost:6379/0",
lazyConnect: false,
});

testDriver({
driver: driver({
base: "test:",
url: "ioredis://localhost:6379/0",
lazyConnect: false,
}),
driver,
additionalTests() {
it("verify stored keys", async () => {
const client = new ioredis.default("ioredis://localhost:6379/0");
Expand All @@ -38,6 +40,10 @@ describe("drivers: redis", () => {
`);
await client.disconnect();
});

it("exposes instance", () => {
expect(driver.getInstance()).toBeInstanceOf(ioredis.default);
});
},
});
});
2 changes: 1 addition & 1 deletion test/drivers/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ export interface TestContext {
}

export interface TestOptions {
driver: Driver;
driver: Driver<any>;
xuzuodong marked this conversation as resolved.
Show resolved Hide resolved
additionalTests?: (ctx: TestContext) => void;
}

Expand Down