diff --git a/packages/drivers/file-system/src/actor.ts b/packages/core/src/drivers/file-system/actor.ts similarity index 96% rename from packages/drivers/file-system/src/actor.ts rename to packages/core/src/drivers/file-system/actor.ts index c762ad799..1791809f8 100644 --- a/packages/drivers/file-system/src/actor.ts +++ b/packages/core/src/drivers/file-system/actor.ts @@ -1,7 +1,7 @@ import type { ActorDriver, AnyActorInstance, -} from "@rivetkit/core/driver-helpers"; +} from "@/driver-helpers/mod"; import type { FileSystemGlobalState } from "./global-state"; export type ActorDriverContext = Record; diff --git a/packages/drivers/file-system/src/global-state.ts b/packages/core/src/drivers/file-system/global-state.ts similarity index 98% rename from packages/drivers/file-system/src/global-state.ts rename to packages/core/src/drivers/file-system/global-state.ts index ccc5f5225..7c4da9118 100644 --- a/packages/drivers/file-system/src/global-state.ts +++ b/packages/core/src/drivers/file-system/global-state.ts @@ -1,7 +1,7 @@ import * as fs from "node:fs/promises"; import * as fsSync from "node:fs"; import * as path from "node:path"; -import type { ActorKey } from "@rivetkit/core"; +import type { ActorKey } from "@/actor/mod"; import { logger } from "./log"; import { getStoragePath, @@ -10,6 +10,7 @@ import { ensureDirectoryExistsSync, } from "./utils"; import invariant from "invariant"; +import { serializeEmptyPersistData } from "@/driver-helpers/mod"; /** * Interface representing a actor's state diff --git a/packages/drivers/file-system/src/log.ts b/packages/core/src/drivers/file-system/log.ts similarity index 68% rename from packages/drivers/file-system/src/log.ts rename to packages/core/src/drivers/file-system/log.ts index e583896a8..6e27c6dc8 100644 --- a/packages/drivers/file-system/src/log.ts +++ b/packages/core/src/drivers/file-system/log.ts @@ -1,4 +1,4 @@ -import { getLogger } from "@rivetkit/core/log"; +import { getLogger } from "@/common/log"; export const LOGGER_NAME = "driver-fs"; diff --git a/packages/drivers/file-system/src/manager.ts b/packages/core/src/drivers/file-system/manager.ts similarity index 92% rename from packages/drivers/file-system/src/manager.ts rename to packages/core/src/drivers/file-system/manager.ts index 7b037b932..643cb59f8 100644 --- a/packages/drivers/file-system/src/manager.ts +++ b/packages/core/src/drivers/file-system/manager.ts @@ -6,12 +6,12 @@ import type { ManagerDriver, ActorOutput, CreateInput, -} from "@rivetkit/core/driver-helpers"; -import { ActorAlreadyExists } from "@rivetkit/core/errors"; +} from "@/driver-helpers/mod"; +import { ActorAlreadyExists } from "@/actor/errors"; import { logger } from "./log"; import type { FileSystemGlobalState } from "./global-state"; import { ActorState } from "./global-state"; -import type { Registry } from "@rivetkit/core"; +import type { Registry } from "@/registry/mod"; export class FileSystemManagerDriver implements ManagerDriver { #state: FileSystemGlobalState; @@ -22,7 +22,6 @@ export class FileSystemManagerDriver implements ManagerDriver { // }); constructor( - private readonly registry: Registry, state: FileSystemGlobalState, ) { this.#state = state; diff --git a/packages/core/src/drivers/file-system/mod.ts b/packages/core/src/drivers/file-system/mod.ts new file mode 100644 index 000000000..1ef1f64d7 --- /dev/null +++ b/packages/core/src/drivers/file-system/mod.ts @@ -0,0 +1,18 @@ +import { DriverConfig } from "@/registry/run-config"; +import { FileSystemActorDriver } from "./actor"; +import { FileSystemGlobalState } from "./global-state"; +import { FileSystemManagerDriver } from "./manager"; + +export { getStoragePath } from "./utils"; +export { FileSystemActorDriver } from "./actor"; +export { FileSystemManagerDriver } from "./manager"; +export { FileSystemGlobalState } from "./global-state"; + +export function createFileSystemDriver(): DriverConfig { + const state = new FileSystemGlobalState(); + return { + topology: "standalone", + manager: new FileSystemManagerDriver(state), + actor: new FileSystemActorDriver(state), + }; +} diff --git a/packages/drivers/file-system/src/utils.ts b/packages/core/src/drivers/file-system/utils.ts similarity index 69% rename from packages/drivers/file-system/src/utils.ts rename to packages/core/src/drivers/file-system/utils.ts index cdfd5baa5..8c9d3d960 100644 --- a/packages/drivers/file-system/src/utils.ts +++ b/packages/core/src/drivers/file-system/utils.ts @@ -2,10 +2,10 @@ import * as fs from "fs/promises"; import * as fsSync from "fs"; import * as path from "path"; import * as crypto from "crypto"; -import envPaths from "env-paths"; +import * as os from "os"; // Get platform-specific data directory -const paths = envPaths("rivetkit", { suffix: "" }); +const paths = { data: getDataPath("rivetkit") }; /** * Create a hash for a path, normalizing it first @@ -13,17 +13,17 @@ const paths = envPaths("rivetkit", { suffix: "" }); function createHashForPath(dirPath: string): string { // Normalize the path first const normalizedPath = path.normalize(dirPath); - + // Extract the last path component for readability const lastComponent = path.basename(normalizedPath); - + // Create SHA-256 hash const hash = crypto .createHash("sha256") .update(normalizedPath) .digest("hex") .substring(0, 8); // Take first 8 characters for brevity - + return `${lastComponent}-${hash}`; } @@ -58,8 +58,10 @@ export async function pathExists(path: string): Promise { /** * Ensure a directory exists, creating it if necessary */ -export async function ensureDirectoryExists(directoryPath: string): Promise { - if (!await pathExists(directoryPath)) { +export async function ensureDirectoryExists( + directoryPath: string, +): Promise { + if (!(await pathExists(directoryPath))) { await fs.mkdir(directoryPath, { recursive: true }); } } @@ -74,3 +76,25 @@ export function ensureDirectoryExistsSync(directoryPath: string): void { } } +/** + * Returns platform-specific data directory + */ +function getDataPath(appName: string): string { + const platform = process.platform; + const homeDir = os.homedir(); + + switch (platform) { + case "win32": + return path.join( + process.env.APPDATA || path.join(homeDir, "AppData", "Roaming"), + appName, + ); + case "darwin": + return path.join(homeDir, "Library", "Application Support", appName); + default: // linux and others + return path.join( + process.env.XDG_DATA_HOME || path.join(homeDir, ".local", "share"), + appName, + ); + } +} diff --git a/packages/core/src/utils.ts b/packages/core/src/utils.ts index 7db7488ac..bd89a2022 100644 --- a/packages/core/src/utils.ts +++ b/packages/core/src/utils.ts @@ -7,6 +7,7 @@ import { logger } from "./actor/log"; import { createMemoryDriver } from "./drivers/memory/mod"; import { createRivetManagerDriver } from "./drivers/rivet/mod"; import { type DriverConfig, UserError } from "./mod"; +import { createFileSystemDriver } from "./drivers/file-system/mod"; export const VERSION = pkgJson.version; @@ -39,8 +40,10 @@ export type UpgradeWebSocket = ( */ export function createDefaultDriver(): DriverConfig { const driver = getEnvUniversal("RIVETKIT_DRIVER"); - console.log("driver", driver); - if (!driver || driver === "memory") { + if (!driver || driver === "file-system") { + logger().info("using default file system driver"); + return createFileSystemDriver(); + } else if (driver === "memory") { logger().info("using default memory driver"); return createMemoryDriver(); } else if (driver === "rivet") { diff --git a/packages/drivers/file-system/package.json b/packages/drivers/file-system/package.json deleted file mode 100644 index a80dea00c..000000000 --- a/packages/drivers/file-system/package.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "@rivetkit/file-system", - "version": "0.9.0-rc.1", - "keywords": ["rivetkit", "driver", "filesystem", "storage", "development", "persistence"], - "files": [ - "src", - "dist", - "package.json" - ], - "type": "module", - "exports": { - "import": { - "types": "./dist/mod.d.ts", - "default": "./dist/mod.js" - }, - "require": { - "types": "./dist/mod.d.cts", - "default": "./dist/mod.cjs" - } - }, - "sideEffects": false, - "scripts": { - "build": "tsup src/mod.ts", - "check-types": "tsc --noEmit", - "test": "vitest run" - }, - "peerDependencies": { - "@rivetkit/core": "*" - }, - "devDependencies": { - "@types/invariant": "^2", - "@types/node": "^22.14.0", - "@rivetkit/core": "workspace:*", - "tsup": "^8.4.0", - "typescript": "^5.5.2", - "vitest": "^3.1.1" - }, - "dependencies": { - "env-paths": "^3.0.0", - "hono": "^4.7.0", - "invariant": "^2.2.4" - }, - "stableVersion": "0.8.0" -} diff --git a/packages/drivers/file-system/src/mod.ts b/packages/drivers/file-system/src/mod.ts deleted file mode 100644 index aea1f1c21..000000000 --- a/packages/drivers/file-system/src/mod.ts +++ /dev/null @@ -1,5 +0,0 @@ -export { getStoragePath } from "./utils"; -export { FileSystemActorDriver } from "./actor"; -export { FileSystemManagerDriver } from "./manager"; -export { FileSystemGlobalState } from "./global-state"; - diff --git a/packages/drivers/file-system/tests/driver-tests.test.ts b/packages/drivers/file-system/tests/driver-tests.test.ts deleted file mode 100644 index 02c479157..000000000 --- a/packages/drivers/file-system/tests/driver-tests.test.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { - runDriverTests, - createTestRuntime, -} from "@rivetkit/core/driver-test-suite"; -import { - FileSystemActorDriver, - FileSystemManagerDriver, - FileSystemGlobalState, -} from "../src/mod"; -import * as os from "node:os"; -import * as path from "node:path"; -import * as fs from "node:fs/promises"; - -runDriverTests({ - async start(appPath: string) { - return await createTestRuntime(appPath, async (registry) => { - // Create a unique temp directory for each test - const testDir = path.join( - os.tmpdir(), - `rivetkit-test-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`, - ); - await fs.mkdir(testDir, { recursive: true }); - - const fileSystemState = new FileSystemGlobalState(testDir); - return { - actorDriver: new FileSystemActorDriver(fileSystemState), - managerDriver: new FileSystemManagerDriver(registry, fileSystemState), - async cleanup() { - await fs.rmdir(testDir, { recursive: true }); - - } - }; - }); - }, -}); diff --git a/packages/drivers/file-system/tsconfig.json b/packages/drivers/file-system/tsconfig.json deleted file mode 100644 index d4b580089..000000000 --- a/packages/drivers/file-system/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../../tsconfig.base.json", - "compilerOptions": { - "paths": { - "@/*": ["./src/*"] - } - }, - "include": ["src/**/*", "test/**/*"] -} diff --git a/packages/drivers/file-system/tsup.config.ts b/packages/drivers/file-system/tsup.config.ts deleted file mode 100644 index 677cffb7b..000000000 --- a/packages/drivers/file-system/tsup.config.ts +++ /dev/null @@ -1,4 +0,0 @@ -import defaultConfig from "../../../tsup.base.ts"; -import { defineConfig } from "tsup"; - -export default defineConfig(defaultConfig); diff --git a/packages/drivers/file-system/turbo.json b/packages/drivers/file-system/turbo.json deleted file mode 100644 index 95960709b..000000000 --- a/packages/drivers/file-system/turbo.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "$schema": "https://turbo.build/schema.json", - "extends": ["//"] -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a2a8f2d7c..b3c78ed21 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -518,37 +518,6 @@ importers: specifier: ^3.1.1 version: 3.2.4(@types/node@24.0.4)(tsx@4.20.3)(yaml@2.8.0) - packages/drivers/file-system: - dependencies: - env-paths: - specifier: ^3.0.0 - version: 3.0.0 - hono: - specifier: ^4.7.0 - version: 4.8.0 - invariant: - specifier: ^2.2.4 - version: 2.2.4 - devDependencies: - '@rivetkit/core': - specifier: workspace:* - version: link:../../core - '@types/invariant': - specifier: ^2 - version: 2.2.37 - '@types/node': - specifier: ^22.14.0 - version: 22.15.32 - tsup: - specifier: ^8.4.0 - version: 8.5.0(@microsoft/api-extractor@7.52.8(@types/node@22.15.32))(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0) - typescript: - specifier: ^5.5.2 - version: 5.8.3 - vitest: - specifier: ^3.1.1 - version: 3.2.4(@types/node@22.15.32)(@vitest/ui@3.1.1)(tsx@4.20.3)(yaml@2.8.0) - packages/drivers/redis: dependencies: '@types/node': @@ -2629,10 +2598,6 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - env-paths@3.0.0: - resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -5900,8 +5865,6 @@ snapshots: entities@4.5.0: {} - env-paths@3.0.0: {} - es-define-property@1.0.1: {} es-errors@1.3.0: {}