import { Effect } from "effect"; import type { StorageFailure } from "./fuma-runtime"; import type { ScopeId } from "./ids"; export interface PluginStorageKeyInput { readonly collection: string; readonly key: string; } export interface PluginStorageScopedKeyInput extends PluginStorageKeyInput { readonly scope: ScopeId | string; } export interface PluginStorageListInput { readonly collection: string; readonly keyPrefix?: string; } export interface PluginStoragePutInput extends PluginStorageScopedKeyInput { readonly data: unknown; } export interface PluginStorageEntry { readonly id: string; readonly scopeId: ScopeId | string; readonly pluginId: string; readonly collection: string; readonly key: string; readonly data: T; readonly createdAt: Date; readonly updatedAt: Date; } export interface PluginStorageFacade { readonly get: ( input: PluginStorageKeyInput, ) => Effect.Effect | null, StorageFailure>; readonly getAtScope: ( input: PluginStorageScopedKeyInput, ) => Effect.Effect | null, StorageFailure>; readonly list: ( input: PluginStorageListInput, ) => Effect.Effect[], StorageFailure>; readonly put: ( input: PluginStoragePutInput, ) => Effect.Effect, StorageFailure>; readonly remove: (input: PluginStorageScopedKeyInput) => Effect.Effect; } export const pluginStorageId = (input: { readonly pluginId: string; readonly collection: string; readonly key: string; }): string => JSON.stringify([input.pluginId, input.collection, input.key]);