@kruntime/kdrive 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +77 -0
- package/dist/index.d.ts +53 -0
- package/dist/index.js +141 -0
- package/dist/index.js.map +1 -0
- package/dist/node.d.ts +22 -0
- package/dist/node.js +421 -0
- package/dist/node.js.map +1 -0
- package/package.json +28 -0
package/README.md
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# @kruntime/kdrive
|
|
2
|
+
|
|
3
|
+
Reusable Drive factories for KRuntime.
|
|
4
|
+
|
|
5
|
+
K core defines the Drive contract and mount semantics. `@kruntime/kdrive`
|
|
6
|
+
contains adapters that turn application resources into file-shaped resources:
|
|
7
|
+
|
|
8
|
+
```ts
|
|
9
|
+
import { Komputer, ro, rw } from '@kruntime/komputer'
|
|
10
|
+
import { textFileDrive, directoryDrive } from '@kruntime/kdrive'
|
|
11
|
+
|
|
12
|
+
await computer.mount('/home/claw/SOUL.md', ro(textFileDrive({
|
|
13
|
+
name: `soul:${userId}`,
|
|
14
|
+
read: () => db.profile.soul(userId),
|
|
15
|
+
})))
|
|
16
|
+
|
|
17
|
+
await computer.mount('/home/claw/memory', rw(directoryDrive({
|
|
18
|
+
name: `memory:${userId}`,
|
|
19
|
+
readdir: path => appMemory.list(userId, path),
|
|
20
|
+
readText: path => appMemory.read(userId, path),
|
|
21
|
+
writeText: (path, text) => appMemory.write(userId, path, text),
|
|
22
|
+
})))
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
The mental model stays Unix:
|
|
26
|
+
|
|
27
|
+
```text
|
|
28
|
+
Drive resource implementation
|
|
29
|
+
mount where the resource appears in the Komputer
|
|
30
|
+
ro/rw Agent-facing mount authorization
|
|
31
|
+
stat('/') whether the mounted thing looks like file, dir, or symlink
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Drive factory options are intentionally application-owned. A database-backed
|
|
35
|
+
Drive can accept `tenantId`, `readonly`, `pool`, `cache`, `table`, or any other
|
|
36
|
+
configuration it needs. K only cares that the returned object satisfies the
|
|
37
|
+
Drive interface.
|
|
38
|
+
|
|
39
|
+
## Cross-platform Factories
|
|
40
|
+
|
|
41
|
+
- `textFileDrive(...)` exposes one text file.
|
|
42
|
+
- `jsonFileDrive(...)` exposes one JSON file.
|
|
43
|
+
- `directoryDrive(...)` wraps directory-shaped callbacks.
|
|
44
|
+
|
|
45
|
+
These factories do not import Node APIs and can run in browsers, workers, H5,
|
|
46
|
+
mini programs, Electron renderers, and server runtimes.
|
|
47
|
+
|
|
48
|
+
## Node Adapter
|
|
49
|
+
|
|
50
|
+
`@kruntime/kdrive/node` contains Node-only adapters:
|
|
51
|
+
|
|
52
|
+
```ts
|
|
53
|
+
import { localDirDrive, sqliteDirectoryDrive, sqliteTextFileDrive } from '@kruntime/kdrive/node'
|
|
54
|
+
|
|
55
|
+
await computer.mount('/workspace', localDirDrive('/srv/workspace', {
|
|
56
|
+
exposeRealPath: true,
|
|
57
|
+
}))
|
|
58
|
+
|
|
59
|
+
await computer.mount('/home/claw/SOUL.md', rw(sqliteTextFileDrive({
|
|
60
|
+
database: './tenant.db',
|
|
61
|
+
key: `/tenants/${userId}/SOUL.md`,
|
|
62
|
+
})))
|
|
63
|
+
|
|
64
|
+
await computer.mount('/home/claw/memory', rw(sqliteDirectoryDrive({
|
|
65
|
+
database: './tenant.db',
|
|
66
|
+
root: `/tenants/${userId}/memory`,
|
|
67
|
+
})))
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
`exposeRealPath` is opt-in because it allows remote shell adapters to receive
|
|
71
|
+
real machine paths. K still enforces mount `ro/rw`; ro real paths require a
|
|
72
|
+
remote with hard sandbox enforcement before they can be used by real shell
|
|
73
|
+
commands.
|
|
74
|
+
|
|
75
|
+
SQLite adapters use a filetree table. They are intentionally ordinary Drives:
|
|
76
|
+
the same `mount('/path', ro|rw(drive))` rule applies, and a reboot simply
|
|
77
|
+
creates fresh Drive objects against the same database.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { Drive, DriveMountContext, FileEntry, FileStat } from '@kruntime/komputer';
|
|
2
|
+
type Awaitable<T> = T | Promise<T>;
|
|
3
|
+
export interface TextFileDriveOptions {
|
|
4
|
+
name?: string;
|
|
5
|
+
read(): Awaitable<string>;
|
|
6
|
+
write?(text: string): Awaitable<void>;
|
|
7
|
+
exists?(): Awaitable<boolean>;
|
|
8
|
+
stat?(): Awaitable<Omit<FileStat, 'type'> & {
|
|
9
|
+
type?: 'file';
|
|
10
|
+
}>;
|
|
11
|
+
mount?(ctx: DriveMountContext): Awaitable<void>;
|
|
12
|
+
unmount?(): Awaitable<void>;
|
|
13
|
+
}
|
|
14
|
+
export interface JsonFileDriveOptions<T> {
|
|
15
|
+
name?: string;
|
|
16
|
+
read(): Awaitable<T>;
|
|
17
|
+
write?(value: T, text: string): Awaitable<void>;
|
|
18
|
+
exists?(): Awaitable<boolean>;
|
|
19
|
+
space?: number | string;
|
|
20
|
+
parse?(text: string): T;
|
|
21
|
+
stringify?(value: T): string;
|
|
22
|
+
stat?(): Awaitable<Omit<FileStat, 'type'> & {
|
|
23
|
+
type?: 'file';
|
|
24
|
+
}>;
|
|
25
|
+
mount?(ctx: DriveMountContext): Awaitable<void>;
|
|
26
|
+
unmount?(): Awaitable<void>;
|
|
27
|
+
}
|
|
28
|
+
export interface DirectoryDriveOptions {
|
|
29
|
+
name?: string;
|
|
30
|
+
mount?(ctx: DriveMountContext): Awaitable<void>;
|
|
31
|
+
unmount?(): Awaitable<void>;
|
|
32
|
+
readText(path: string): Awaitable<string>;
|
|
33
|
+
writeText?(path: string, text: string): Awaitable<void>;
|
|
34
|
+
exists?(path: string): Awaitable<boolean>;
|
|
35
|
+
readdir(path: string): Awaitable<FileEntry[]>;
|
|
36
|
+
stat?(path: string): Awaitable<FileStat>;
|
|
37
|
+
mkdir?(path: string): Awaitable<void>;
|
|
38
|
+
rm?(path: string, options?: {
|
|
39
|
+
recursive?: boolean;
|
|
40
|
+
force?: boolean;
|
|
41
|
+
}): Awaitable<void>;
|
|
42
|
+
rename?(from: string, to: string): Awaitable<void>;
|
|
43
|
+
symlink?(target: string, path: string): Awaitable<void>;
|
|
44
|
+
readLink?(path: string): Awaitable<string | undefined>;
|
|
45
|
+
chmod?(path: string, mode: number): Awaitable<void>;
|
|
46
|
+
utime?(path: string, mtime: string): Awaitable<void>;
|
|
47
|
+
realPath?(path: string): string | undefined;
|
|
48
|
+
}
|
|
49
|
+
export declare function textFileDrive(options: TextFileDriveOptions): Drive;
|
|
50
|
+
export declare function jsonFileDrive<T>(options: JsonFileDriveOptions<T>): Drive;
|
|
51
|
+
export declare function directoryDrive(options: DirectoryDriveOptions): Drive;
|
|
52
|
+
export declare function normalizeDrivePath(path: string): string;
|
|
53
|
+
export {};
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
export function textFileDrive(options) {
|
|
2
|
+
const drive = {
|
|
3
|
+
kind: 'drive',
|
|
4
|
+
name: options.name,
|
|
5
|
+
mount: options.mount,
|
|
6
|
+
unmount: options.unmount,
|
|
7
|
+
async readText(path) {
|
|
8
|
+
assertRootFilePath(path);
|
|
9
|
+
return options.read();
|
|
10
|
+
},
|
|
11
|
+
async exists(path) {
|
|
12
|
+
if (!isRootPath(path))
|
|
13
|
+
return false;
|
|
14
|
+
return options.exists ? options.exists() : true;
|
|
15
|
+
},
|
|
16
|
+
async readdir(path) {
|
|
17
|
+
assertRootFilePath(path);
|
|
18
|
+
throw new Error('not a directory: /');
|
|
19
|
+
},
|
|
20
|
+
async stat(path) {
|
|
21
|
+
assertRootFilePath(path);
|
|
22
|
+
const base = options.stat ? await options.stat() : {};
|
|
23
|
+
const size = base.size ?? new TextEncoder().encode(await options.read()).byteLength;
|
|
24
|
+
return { ...base, type: 'file', size };
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
if (options.write) {
|
|
28
|
+
drive.writeText = async (path, text) => {
|
|
29
|
+
assertRootFilePath(path);
|
|
30
|
+
await options.write?.(text);
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
return drive;
|
|
34
|
+
}
|
|
35
|
+
export function jsonFileDrive(options) {
|
|
36
|
+
const stringify = options.stringify ?? ((value) => `${JSON.stringify(value, null, options.space ?? 2)}\n`);
|
|
37
|
+
const parse = options.parse ?? ((text) => JSON.parse(text));
|
|
38
|
+
return textFileDrive({
|
|
39
|
+
name: options.name,
|
|
40
|
+
mount: options.mount,
|
|
41
|
+
unmount: options.unmount,
|
|
42
|
+
exists: options.exists,
|
|
43
|
+
stat: options.stat,
|
|
44
|
+
read: async () => stringify(await options.read()),
|
|
45
|
+
write: options.write
|
|
46
|
+
? async (text) => options.write?.(parse(text), text)
|
|
47
|
+
: undefined,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
export function directoryDrive(options) {
|
|
51
|
+
const drive = {
|
|
52
|
+
kind: 'drive',
|
|
53
|
+
name: options.name,
|
|
54
|
+
mount: options.mount,
|
|
55
|
+
unmount: options.unmount,
|
|
56
|
+
async readText(path) {
|
|
57
|
+
return options.readText(normalizeDrivePath(path));
|
|
58
|
+
},
|
|
59
|
+
async exists(path) {
|
|
60
|
+
const normalized = normalizeDrivePath(path);
|
|
61
|
+
if (options.exists)
|
|
62
|
+
return options.exists(normalized);
|
|
63
|
+
return existsByProbing(options, normalized);
|
|
64
|
+
},
|
|
65
|
+
async readdir(path) {
|
|
66
|
+
return options.readdir(normalizeDrivePath(path));
|
|
67
|
+
},
|
|
68
|
+
async stat(path) {
|
|
69
|
+
const normalized = normalizeDrivePath(path);
|
|
70
|
+
if (options.stat)
|
|
71
|
+
return options.stat(normalized);
|
|
72
|
+
if (normalized === '/')
|
|
73
|
+
return { type: 'dir' };
|
|
74
|
+
if (await existsByProbing(options, normalized))
|
|
75
|
+
return { type: 'file' };
|
|
76
|
+
throw new Error(`file not found: ${normalized}`);
|
|
77
|
+
},
|
|
78
|
+
realPath: options.realPath ? (path) => options.realPath?.(normalizeDrivePath(path)) : undefined,
|
|
79
|
+
};
|
|
80
|
+
if (options.writeText)
|
|
81
|
+
drive.writeText = async (path, text) => { await options.writeText?.(normalizeDrivePath(path), text); };
|
|
82
|
+
if (options.mkdir)
|
|
83
|
+
drive.mkdir = async (path) => { await options.mkdir?.(normalizeDrivePath(path)); };
|
|
84
|
+
if (options.rm)
|
|
85
|
+
drive.rm = async (path, opts) => { await options.rm?.(normalizeDrivePath(path), opts); };
|
|
86
|
+
if (options.rename)
|
|
87
|
+
drive.rename = async (from, to) => { await options.rename?.(normalizeDrivePath(from), normalizeDrivePath(to)); };
|
|
88
|
+
if (options.symlink)
|
|
89
|
+
drive.symlink = async (target, path) => { await options.symlink?.(target, normalizeDrivePath(path)); };
|
|
90
|
+
if (options.readLink)
|
|
91
|
+
drive.readLink = async (path) => options.readLink?.(normalizeDrivePath(path));
|
|
92
|
+
if (options.chmod)
|
|
93
|
+
drive.chmod = async (path, mode) => { await options.chmod?.(normalizeDrivePath(path), mode); };
|
|
94
|
+
if (options.utime)
|
|
95
|
+
drive.utime = async (path, mtime) => { await options.utime?.(normalizeDrivePath(path), mtime); };
|
|
96
|
+
return drive;
|
|
97
|
+
}
|
|
98
|
+
export function normalizeDrivePath(path) {
|
|
99
|
+
const raw = String(path || '/').replaceAll('\\', '/');
|
|
100
|
+
const parts = [];
|
|
101
|
+
for (const part of raw.split('/')) {
|
|
102
|
+
if (!part || part === '.')
|
|
103
|
+
continue;
|
|
104
|
+
if (part === '..') {
|
|
105
|
+
parts.pop();
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
parts.push(part);
|
|
109
|
+
}
|
|
110
|
+
return `/${parts.join('/')}` || '/';
|
|
111
|
+
}
|
|
112
|
+
function isRootPath(path) {
|
|
113
|
+
return normalizeDrivePath(path) === '/';
|
|
114
|
+
}
|
|
115
|
+
function assertRootFilePath(path) {
|
|
116
|
+
const normalized = normalizeDrivePath(path);
|
|
117
|
+
if (normalized !== '/')
|
|
118
|
+
throw new Error(`file not found: ${normalized}`);
|
|
119
|
+
}
|
|
120
|
+
async function existsByProbing(options, path) {
|
|
121
|
+
try {
|
|
122
|
+
if (options.stat) {
|
|
123
|
+
await options.stat(path);
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
if (path === '/')
|
|
127
|
+
return true;
|
|
128
|
+
await options.readText(path);
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
try {
|
|
133
|
+
await options.readdir(path);
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/kdrive/src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/node.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Drive } from '@kruntime/komputer';
|
|
2
|
+
import type { DatabaseSync } from 'node:sqlite';
|
|
3
|
+
export interface LocalDirDriveOptions {
|
|
4
|
+
name?: string;
|
|
5
|
+
exposeRealPath?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface SqliteDriveOptions {
|
|
8
|
+
name?: string;
|
|
9
|
+
database: string | DatabaseSync;
|
|
10
|
+
table?: string;
|
|
11
|
+
createTable?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface SqliteTextFileDriveOptions extends SqliteDriveOptions {
|
|
14
|
+
key: string;
|
|
15
|
+
seed?: string | (() => string);
|
|
16
|
+
}
|
|
17
|
+
export interface SqliteDirectoryDriveOptions extends SqliteDriveOptions {
|
|
18
|
+
root?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function localDirDrive(root: string, options?: LocalDirDriveOptions): Drive;
|
|
21
|
+
export declare function sqliteTextFileDrive(options: SqliteTextFileDriveOptions): Drive;
|
|
22
|
+
export declare function sqliteDirectoryDrive(options: SqliteDirectoryDriveOptions): Drive;
|
package/dist/node.js
ADDED
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
import { chmod, lstat, mkdir, readFile, readdir, readlink, realpath, rename as fsRename, rm, symlink, utimes, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { realpathSync } from 'node:fs';
|
|
3
|
+
import { createRequire } from 'node:module';
|
|
4
|
+
import { basename, dirname, resolve, sep } from 'node:path';
|
|
5
|
+
import { normalizeDrivePath } from "./index.js";
|
|
6
|
+
const require = createRequire(import.meta.url);
|
|
7
|
+
export function localDirDrive(root, options = {}) {
|
|
8
|
+
const rootPath = resolve(root);
|
|
9
|
+
let rootReal;
|
|
10
|
+
async function ensureRoot() {
|
|
11
|
+
rootReal ??= await realpath(rootPath);
|
|
12
|
+
return rootReal;
|
|
13
|
+
}
|
|
14
|
+
async function existingPath(path) {
|
|
15
|
+
const target = lexicalPath(rootPath, path);
|
|
16
|
+
const real = await realpath(target);
|
|
17
|
+
return ensureInside(await ensureRoot(), real);
|
|
18
|
+
}
|
|
19
|
+
async function writablePath(path) {
|
|
20
|
+
const target = lexicalPath(rootPath, path);
|
|
21
|
+
try {
|
|
22
|
+
await lstat(target);
|
|
23
|
+
return await existingPath(path);
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
if (!isNotFound(error))
|
|
27
|
+
throw error;
|
|
28
|
+
const parent = await realpath(dirname(target));
|
|
29
|
+
const safeParent = ensureInside(await ensureRoot(), parent);
|
|
30
|
+
return ensureInside(await ensureRoot(), resolve(safeParent, basename(target)));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function syncRealPath(path) {
|
|
34
|
+
if (!options.exposeRealPath)
|
|
35
|
+
return undefined;
|
|
36
|
+
try {
|
|
37
|
+
rootReal ??= realpathSync(rootPath);
|
|
38
|
+
const target = lexicalPath(rootPath, path);
|
|
39
|
+
try {
|
|
40
|
+
return ensureInside(rootReal, realpathSync(target));
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
const parent = ensureInside(rootReal, realpathSync(dirname(target)));
|
|
44
|
+
return ensureInside(rootReal, resolve(parent, basename(target)));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
kind: 'drive',
|
|
53
|
+
name: options.name ?? `local:${rootPath}`,
|
|
54
|
+
async readText(path) {
|
|
55
|
+
return readFile(await existingPath(path), 'utf8');
|
|
56
|
+
},
|
|
57
|
+
async writeText(path, text) {
|
|
58
|
+
await writeFile(await writablePath(path), text, 'utf8');
|
|
59
|
+
},
|
|
60
|
+
async exists(path) {
|
|
61
|
+
try {
|
|
62
|
+
await existingPath(path);
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
async readdir(path) {
|
|
70
|
+
const entries = await readdir(await existingPath(path), { withFileTypes: true });
|
|
71
|
+
return entries.map((entry) => ({
|
|
72
|
+
name: entry.name,
|
|
73
|
+
type: entry.isDirectory() ? 'dir' : entry.isSymbolicLink() ? 'symlink' : 'file',
|
|
74
|
+
}));
|
|
75
|
+
},
|
|
76
|
+
async stat(path) {
|
|
77
|
+
const info = await lstat(await existingPath(path));
|
|
78
|
+
return {
|
|
79
|
+
type: info.isDirectory() ? 'dir' : info.isSymbolicLink() ? 'symlink' : 'file',
|
|
80
|
+
size: info.size,
|
|
81
|
+
mode: info.mode & 0o777,
|
|
82
|
+
mtime: info.mtime.toISOString(),
|
|
83
|
+
};
|
|
84
|
+
},
|
|
85
|
+
async mkdir(path) {
|
|
86
|
+
await mkdir(await writablePath(path));
|
|
87
|
+
},
|
|
88
|
+
async rm(path, opts = {}) {
|
|
89
|
+
try {
|
|
90
|
+
await rm(await existingPath(path), { recursive: opts.recursive, force: opts.force });
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
if (opts.force && isNotFound(error))
|
|
94
|
+
return;
|
|
95
|
+
throw error;
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
async rename(from, to) {
|
|
99
|
+
await fsRename(await existingPath(from), await writablePath(to));
|
|
100
|
+
},
|
|
101
|
+
async symlink(target, path) {
|
|
102
|
+
await symlink(target, await writablePath(path));
|
|
103
|
+
},
|
|
104
|
+
async readLink(path) {
|
|
105
|
+
return readlink(lexicalPath(rootPath, path));
|
|
106
|
+
},
|
|
107
|
+
async chmod(path, mode) {
|
|
108
|
+
await chmod(await existingPath(path), mode);
|
|
109
|
+
},
|
|
110
|
+
async utime(path, mtime) {
|
|
111
|
+
const date = new Date(mtime);
|
|
112
|
+
if (!Number.isFinite(date.getTime()))
|
|
113
|
+
throw new Error(`invalid mtime: ${mtime}`);
|
|
114
|
+
await utimes(await existingPath(path), date, date);
|
|
115
|
+
},
|
|
116
|
+
realPath: options.exposeRealPath ? syncRealPath : undefined,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
export function sqliteTextFileDrive(options) {
|
|
120
|
+
const store = openSqliteStore(options);
|
|
121
|
+
const table = sqliteTableName(options.table);
|
|
122
|
+
const key = normalizeDrivePath(options.key);
|
|
123
|
+
return {
|
|
124
|
+
kind: 'drive',
|
|
125
|
+
name: options.name ?? `sqlite:file:${key}`,
|
|
126
|
+
async mount() {
|
|
127
|
+
ensureSqliteTable(store.db, table, options.createTable ?? true);
|
|
128
|
+
if (options.seed !== undefined && !sqliteGetNode(store.db, table, key)) {
|
|
129
|
+
sqlitePutFile(store.db, table, key, typeof options.seed === 'function' ? options.seed() : options.seed);
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
async unmount() {
|
|
133
|
+
store.close();
|
|
134
|
+
},
|
|
135
|
+
async readText(path) {
|
|
136
|
+
assertRoot(path);
|
|
137
|
+
const row = sqliteGetNode(store.db, table, key);
|
|
138
|
+
if (!row || row.type !== 'file')
|
|
139
|
+
throw new Error(`file not found: ${key}`);
|
|
140
|
+
return row.text ?? '';
|
|
141
|
+
},
|
|
142
|
+
async writeText(path, text) {
|
|
143
|
+
assertRoot(path);
|
|
144
|
+
sqlitePutFile(store.db, table, key, text);
|
|
145
|
+
},
|
|
146
|
+
async exists(path) {
|
|
147
|
+
return normalizeDrivePath(path) === '/' && sqliteGetNode(store.db, table, key)?.type === 'file';
|
|
148
|
+
},
|
|
149
|
+
async readdir(path) {
|
|
150
|
+
assertRoot(path);
|
|
151
|
+
throw new Error('not a directory: /');
|
|
152
|
+
},
|
|
153
|
+
async stat(path) {
|
|
154
|
+
assertRoot(path);
|
|
155
|
+
const row = sqliteGetNode(store.db, table, key);
|
|
156
|
+
if (!row || row.type !== 'file')
|
|
157
|
+
throw new Error(`file not found: ${key}`);
|
|
158
|
+
return sqliteStat(row);
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
export function sqliteDirectoryDrive(options) {
|
|
163
|
+
const store = openSqliteStore(options);
|
|
164
|
+
const table = sqliteTableName(options.table);
|
|
165
|
+
const root = normalizeSqliteRoot(options.root);
|
|
166
|
+
function key(path) {
|
|
167
|
+
return joinSqliteRoot(root, normalizeDrivePath(path));
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
kind: 'drive',
|
|
171
|
+
name: options.name ?? `sqlite:dir:${root || '/'}`,
|
|
172
|
+
async mount() {
|
|
173
|
+
ensureSqliteTable(store.db, table, options.createTable ?? true);
|
|
174
|
+
},
|
|
175
|
+
async unmount() {
|
|
176
|
+
store.close();
|
|
177
|
+
},
|
|
178
|
+
async readText(path) {
|
|
179
|
+
const row = sqliteGetNode(store.db, table, key(path));
|
|
180
|
+
if (!row || row.type !== 'file')
|
|
181
|
+
throw new Error(`file not found: ${normalizeDrivePath(path)}`);
|
|
182
|
+
return row.text ?? '';
|
|
183
|
+
},
|
|
184
|
+
async writeText(path, text) {
|
|
185
|
+
sqlitePutFile(store.db, table, key(path), text);
|
|
186
|
+
},
|
|
187
|
+
async mkdir(path) {
|
|
188
|
+
const nodeKey = key(path);
|
|
189
|
+
const row = sqliteGetNode(store.db, table, nodeKey);
|
|
190
|
+
if (row && row.type !== 'dir')
|
|
191
|
+
throw new Error(`file exists: ${normalizeDrivePath(path)}`);
|
|
192
|
+
sqlitePutDir(store.db, table, nodeKey);
|
|
193
|
+
},
|
|
194
|
+
async rm(path, opts = {}) {
|
|
195
|
+
const nodeKey = key(path);
|
|
196
|
+
const row = sqliteGetNode(store.db, table, nodeKey);
|
|
197
|
+
const descendantCount = sqliteDescendantCount(store.db, table, nodeKey);
|
|
198
|
+
if (!row && descendantCount === 0) {
|
|
199
|
+
if (opts.force)
|
|
200
|
+
return;
|
|
201
|
+
throw new Error(`file not found: ${normalizeDrivePath(path)}`);
|
|
202
|
+
}
|
|
203
|
+
if ((row?.type === 'dir' || descendantCount > 0) && !opts.recursive) {
|
|
204
|
+
throw new Error(`is a directory: ${normalizeDrivePath(path)}`);
|
|
205
|
+
}
|
|
206
|
+
sqliteDeleteTree(store.db, table, nodeKey);
|
|
207
|
+
},
|
|
208
|
+
async rename(from, to) {
|
|
209
|
+
sqliteRenameTree(store.db, table, key(from), key(to));
|
|
210
|
+
},
|
|
211
|
+
async symlink(target, path) {
|
|
212
|
+
sqlitePutSymlink(store.db, table, key(path), target);
|
|
213
|
+
},
|
|
214
|
+
async readLink(path) {
|
|
215
|
+
const row = sqliteGetNode(store.db, table, key(path));
|
|
216
|
+
return row?.type === 'symlink' ? row.target ?? '' : undefined;
|
|
217
|
+
},
|
|
218
|
+
async chmod(path, mode) {
|
|
219
|
+
if (!sqliteTouchMode(store.db, table, key(path), mode))
|
|
220
|
+
throw new Error(`file not found: ${normalizeDrivePath(path)}`);
|
|
221
|
+
},
|
|
222
|
+
async utime(path, mtime) {
|
|
223
|
+
if (!sqliteTouchMtime(store.db, table, key(path), mtime))
|
|
224
|
+
throw new Error(`file not found: ${normalizeDrivePath(path)}`);
|
|
225
|
+
},
|
|
226
|
+
async exists(path) {
|
|
227
|
+
const nodeKey = key(path);
|
|
228
|
+
if (nodeKey === root || normalizeDrivePath(path) === '/')
|
|
229
|
+
return true;
|
|
230
|
+
return Boolean(sqliteGetNode(store.db, table, nodeKey) || sqliteDescendantCount(store.db, table, nodeKey) > 0);
|
|
231
|
+
},
|
|
232
|
+
async readdir(path) {
|
|
233
|
+
return sqliteReadDir(store.db, table, key(path));
|
|
234
|
+
},
|
|
235
|
+
async stat(path) {
|
|
236
|
+
const nodeKey = key(path);
|
|
237
|
+
if (nodeKey === root || normalizeDrivePath(path) === '/')
|
|
238
|
+
return { type: 'dir' };
|
|
239
|
+
const row = sqliteGetNode(store.db, table, nodeKey);
|
|
240
|
+
if (row)
|
|
241
|
+
return sqliteStat(row);
|
|
242
|
+
if (sqliteDescendantCount(store.db, table, nodeKey) > 0)
|
|
243
|
+
return { type: 'dir' };
|
|
244
|
+
throw new Error(`file not found: ${normalizeDrivePath(path)}`);
|
|
245
|
+
},
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
function lexicalPath(root, path) {
|
|
249
|
+
const normalized = normalizeDrivePath(path);
|
|
250
|
+
const target = resolve(root, normalized.slice(1));
|
|
251
|
+
return ensureInside(root, target);
|
|
252
|
+
}
|
|
253
|
+
function ensureInside(root, target) {
|
|
254
|
+
if (target === root || target.startsWith(`${root}${sep}`))
|
|
255
|
+
return target;
|
|
256
|
+
throw new Error(`path escapes local drive root: ${target}`);
|
|
257
|
+
}
|
|
258
|
+
function isNotFound(error) {
|
|
259
|
+
return error instanceof Error && 'code' in error && error.code === 'ENOENT';
|
|
260
|
+
}
|
|
261
|
+
function openSqliteStore(options) {
|
|
262
|
+
if (typeof options.database === 'string') {
|
|
263
|
+
const { DatabaseSync: NodeDatabaseSync } = require('node:sqlite');
|
|
264
|
+
const db = new NodeDatabaseSync(options.database);
|
|
265
|
+
return { db, close: () => db.close() };
|
|
266
|
+
}
|
|
267
|
+
return { db: options.database, close: () => undefined };
|
|
268
|
+
}
|
|
269
|
+
function sqliteTableName(table = 'kdrive_nodes') {
|
|
270
|
+
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(table))
|
|
271
|
+
throw new Error(`invalid sqlite drive table name: ${table}`);
|
|
272
|
+
return `"${table}"`;
|
|
273
|
+
}
|
|
274
|
+
function ensureSqliteTable(db, table, create) {
|
|
275
|
+
if (!create)
|
|
276
|
+
return;
|
|
277
|
+
db.exec(`
|
|
278
|
+
CREATE TABLE IF NOT EXISTS ${table} (
|
|
279
|
+
path TEXT PRIMARY KEY,
|
|
280
|
+
type TEXT NOT NULL CHECK (type IN ('file', 'dir', 'symlink')),
|
|
281
|
+
text TEXT,
|
|
282
|
+
target TEXT,
|
|
283
|
+
mode INTEGER,
|
|
284
|
+
updated_at TEXT NOT NULL
|
|
285
|
+
)
|
|
286
|
+
`);
|
|
287
|
+
}
|
|
288
|
+
function sqliteGetNode(db, table, path) {
|
|
289
|
+
return db.prepare(`SELECT path, type, text, target, mode, updated_at FROM ${table} WHERE path = ?`).get(path);
|
|
290
|
+
}
|
|
291
|
+
function sqlitePutFile(db, table, path, text) {
|
|
292
|
+
db.prepare(`
|
|
293
|
+
INSERT INTO ${table} (path, type, text, target, mode, updated_at)
|
|
294
|
+
VALUES (?, 'file', ?, NULL, COALESCE((SELECT mode FROM ${table} WHERE path = ?), 420), ?)
|
|
295
|
+
ON CONFLICT(path) DO UPDATE SET
|
|
296
|
+
type = 'file',
|
|
297
|
+
text = excluded.text,
|
|
298
|
+
target = NULL,
|
|
299
|
+
updated_at = excluded.updated_at
|
|
300
|
+
`).run(path, text, path, nowIso());
|
|
301
|
+
}
|
|
302
|
+
function sqlitePutDir(db, table, path) {
|
|
303
|
+
db.prepare(`
|
|
304
|
+
INSERT INTO ${table} (path, type, text, target, mode, updated_at)
|
|
305
|
+
VALUES (?, 'dir', NULL, NULL, COALESCE((SELECT mode FROM ${table} WHERE path = ?), 493), ?)
|
|
306
|
+
ON CONFLICT(path) DO UPDATE SET
|
|
307
|
+
type = 'dir',
|
|
308
|
+
text = NULL,
|
|
309
|
+
target = NULL,
|
|
310
|
+
updated_at = excluded.updated_at
|
|
311
|
+
`).run(path, path, nowIso());
|
|
312
|
+
}
|
|
313
|
+
function sqlitePutSymlink(db, table, path, target) {
|
|
314
|
+
db.prepare(`
|
|
315
|
+
INSERT INTO ${table} (path, type, text, target, mode, updated_at)
|
|
316
|
+
VALUES (?, 'symlink', NULL, ?, 511, ?)
|
|
317
|
+
ON CONFLICT(path) DO UPDATE SET
|
|
318
|
+
type = 'symlink',
|
|
319
|
+
text = NULL,
|
|
320
|
+
target = excluded.target,
|
|
321
|
+
updated_at = excluded.updated_at
|
|
322
|
+
`).run(path, target, nowIso());
|
|
323
|
+
}
|
|
324
|
+
function sqliteReadDir(db, table, path) {
|
|
325
|
+
const prefix = withTrailingSlash(path);
|
|
326
|
+
const rows = db.prepare(`SELECT path, type FROM ${table} WHERE path LIKE ? ESCAPE '\\'`).all(`${escapeLike(prefix)}%`);
|
|
327
|
+
const entries = new Map();
|
|
328
|
+
for (const row of rows) {
|
|
329
|
+
const rest = row.path.slice(prefix.length);
|
|
330
|
+
if (!rest)
|
|
331
|
+
continue;
|
|
332
|
+
const [name, ...tail] = rest.split('/');
|
|
333
|
+
if (!name)
|
|
334
|
+
continue;
|
|
335
|
+
entries.set(name, tail.length ? 'dir' : row.type);
|
|
336
|
+
}
|
|
337
|
+
return [...entries.entries()].map(([name, type]) => ({ name, type })).sort((a, b) => a.name.localeCompare(b.name));
|
|
338
|
+
}
|
|
339
|
+
function sqliteDescendantCount(db, table, path) {
|
|
340
|
+
const prefix = withTrailingSlash(path);
|
|
341
|
+
const row = db.prepare(`SELECT COUNT(*) AS count FROM ${table} WHERE path LIKE ? ESCAPE '\\'`).get(`${escapeLike(prefix)}%`);
|
|
342
|
+
return Number(row.count);
|
|
343
|
+
}
|
|
344
|
+
function sqliteDeleteTree(db, table, path) {
|
|
345
|
+
const prefix = withTrailingSlash(path);
|
|
346
|
+
db.prepare(`DELETE FROM ${table} WHERE path = ? OR path LIKE ? ESCAPE '\\'`).run(path, `${escapeLike(prefix)}%`);
|
|
347
|
+
}
|
|
348
|
+
function sqliteRenameTree(db, table, from, to) {
|
|
349
|
+
if (sqliteGetNode(db, table, to) || sqliteDescendantCount(db, table, to) > 0)
|
|
350
|
+
throw new Error(`file exists: ${to}`);
|
|
351
|
+
const prefix = withTrailingSlash(from);
|
|
352
|
+
const rows = db.prepare(`
|
|
353
|
+
SELECT path, type, text, target, mode, updated_at FROM ${table}
|
|
354
|
+
WHERE path = ? OR path LIKE ? ESCAPE '\\'
|
|
355
|
+
ORDER BY path ASC
|
|
356
|
+
`).all(from, `${escapeLike(prefix)}%`);
|
|
357
|
+
if (rows.length === 0)
|
|
358
|
+
throw new Error(`file not found: ${from}`);
|
|
359
|
+
const insert = db.prepare(`
|
|
360
|
+
INSERT INTO ${table} (path, type, text, target, mode, updated_at)
|
|
361
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
362
|
+
`);
|
|
363
|
+
db.exec('BEGIN');
|
|
364
|
+
try {
|
|
365
|
+
sqliteDeleteTree(db, table, from);
|
|
366
|
+
for (const row of rows) {
|
|
367
|
+
const nextPath = row.path === from ? to : `${withTrailingSlash(to)}${row.path.slice(prefix.length)}`;
|
|
368
|
+
insert.run(nextPath, row.type, row.text, row.target, row.mode, nowIso());
|
|
369
|
+
}
|
|
370
|
+
db.exec('COMMIT');
|
|
371
|
+
}
|
|
372
|
+
catch (error) {
|
|
373
|
+
db.exec('ROLLBACK');
|
|
374
|
+
throw error;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
function sqliteTouchMode(db, table, path, mode) {
|
|
378
|
+
const result = db.prepare(`UPDATE ${table} SET mode = ?, updated_at = ? WHERE path = ?`).run(mode, nowIso(), path);
|
|
379
|
+
return Number(result.changes) > 0;
|
|
380
|
+
}
|
|
381
|
+
function sqliteTouchMtime(db, table, path, mtime) {
|
|
382
|
+
const date = new Date(mtime);
|
|
383
|
+
if (!Number.isFinite(date.getTime()))
|
|
384
|
+
throw new Error(`invalid mtime: ${mtime}`);
|
|
385
|
+
const result = db.prepare(`UPDATE ${table} SET updated_at = ? WHERE path = ?`).run(date.toISOString(), path);
|
|
386
|
+
return Number(result.changes) > 0;
|
|
387
|
+
}
|
|
388
|
+
function sqliteStat(row) {
|
|
389
|
+
return {
|
|
390
|
+
type: row.type,
|
|
391
|
+
size: row.type === 'file' ? Buffer.byteLength(row.text ?? '', 'utf8') : row.type === 'symlink' ? Buffer.byteLength(row.target ?? '', 'utf8') : undefined,
|
|
392
|
+
mode: row.mode ?? undefined,
|
|
393
|
+
mtime: row.updated_at,
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
function normalizeSqliteRoot(root) {
|
|
397
|
+
const normalized = normalizeDrivePath(root ?? '/');
|
|
398
|
+
return normalized === '/' ? '/' : normalized;
|
|
399
|
+
}
|
|
400
|
+
function joinSqliteRoot(root, path) {
|
|
401
|
+
if (root === '/')
|
|
402
|
+
return path;
|
|
403
|
+
if (path === '/')
|
|
404
|
+
return root;
|
|
405
|
+
return `${root}${path}`;
|
|
406
|
+
}
|
|
407
|
+
function withTrailingSlash(path) {
|
|
408
|
+
return path === '/' ? '/' : `${path.replace(/\/+$/, '')}/`;
|
|
409
|
+
}
|
|
410
|
+
function escapeLike(value) {
|
|
411
|
+
return value.replace(/[\\%_]/g, (char) => `\\${char}`);
|
|
412
|
+
}
|
|
413
|
+
function nowIso() {
|
|
414
|
+
return new Date().toISOString();
|
|
415
|
+
}
|
|
416
|
+
function assertRoot(path) {
|
|
417
|
+
const normalized = normalizeDrivePath(path);
|
|
418
|
+
if (normalized !== '/')
|
|
419
|
+
throw new Error(`file not found: ${normalized}`);
|
|
420
|
+
}
|
|
421
|
+
//# sourceMappingURL=node.js.map
|
package/dist/node.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../../../packages/kdrive/src/node.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kruntime/kdrive",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Reusable Drive adapters and factories for KRuntime Komputers.",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": {
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"import": "./dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"./node": {
|
|
12
|
+
"types": "./dist/node.d.ts",
|
|
13
|
+
"import": "./dist/node.js"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"README.md"
|
|
20
|
+
],
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@kruntime/komputer": "0.1.0"
|
|
23
|
+
},
|
|
24
|
+
"license": "UNLICENSED",
|
|
25
|
+
"publishConfig": {
|
|
26
|
+
"access": "public"
|
|
27
|
+
}
|
|
28
|
+
}
|