builder / lib /vfs /adapters /factory.ts
Leon4gr45's picture
Upload folder using huggingface_hub (part 3)
94193b5 verified
Raw
History Blame Contribute Delete
1.74 kB
/**
* Adapter Factory
*
* Creates the appropriate storage adapter based on environment configuration.
* Browser mode: IndexedDBAdapter with default database name
* Server mode (with workspace): IndexedDBAdapter with workspace-scoped database name
*/
import { StorageAdapter } from './types';
import { IndexedDBAdapter } from './indexeddb-adapter';
/**
* Read the workspace ID from the osw_workspace cookie (client-side).
* Returns undefined if not in a browser or no workspace cookie set.
*/
function getWorkspaceId(): string | undefined {
if (typeof document === 'undefined') return undefined;
const match = document.cookie.match(/(?:^|;\s*)osw_workspace=([^;]+)/);
return match?.[1] || undefined;
}
/**
* Create storage adapter for client-side usage.
* In server mode with a workspace cookie, uses a workspace-scoped IndexedDB (osw-studio-{workspaceId}).
* In browser mode, always uses the default database (osw-studio-db) regardless of stale cookies.
*/
export function createClientAdapter(): StorageAdapter {
const isServerMode = process.env.NEXT_PUBLIC_SERVER_MODE === 'true';
const workspaceId = isServerMode ? getWorkspaceId() : undefined;
const dbName = workspaceId ? `osw-studio-${workspaceId}` : undefined;
return new IndexedDBAdapter(dbName);
}
/**
* Create storage adapter for server-side usage (Server mode only)
* Returns SQLiteAdapter configured to use data/osws.sqlite
*
* NOTE: This function uses dynamic import to avoid bundling sqlite in client code
*/
export async function createServerAdapter(): Promise<StorageAdapter> {
// Dynamic import to avoid bundling server-only code in client
const { SQLiteAdapter } = await import('./sqlite-adapter');
return new SQLiteAdapter();
}