@ effect- vfs/ core (帮助)
@effect-vfs/core 使用字节保存路径、有明确权限的呼叫者、配额、,
手表 固定装置 还有手提快照 它不访问主机文件系统 .
需要直接控制共享音量或字节导向路径时使用核心. 对于 Effect 的标准
FileSystem 服务, 使用 @effect-vfs/memory。 。 。 .
该套件执行一个有文件记载的POSIX行为子集. 它没有声称POSIX完全符合规定。 见 已执行配置文件 精确的许可,路径,时间戳,配额,和原子学规则.
安装
npm install @effect-vfs/core@latest
软件包宣布其精确的Effect版本为对等依赖. 卷构造器和快照三角洲函数需要 Effect's Crypto 服务。 在节点上安装匹配
供应商和供应 NodeCrypto.layer 当运行这些效果时 :
npm install "@effect/platform-node-shared@$(npm view @effect-vfs/core peerDependencies.effect)"
创建孤立的工作空间
拥有文件的一卷. 一个呼叫者提供身份,权限,和一个工作目录. 范围控件关闭时 影响范围结束。 这个例子让一个没有特权的调用者访问一个受限卷中的一个目录.
import { VirtualFileSystem as Vfs } from "@effect-vfs/core"
import * as NodeCrypto from "@effect/platform-node-shared/NodeCrypto"
import { ByteSize, Effect } from "effect"
const utf8 = new TextEncoder()
const program = Effect.scoped(Effect.gen(function*() {
const volume = yield* Vfs.make({
maxEntries: 100,
maxBytes: ByteSize.megabytes(1),
maxFileBytes: ByteSize.kilobytes(100)
})
const admin = yield* volume.caller()
yield* admin.mkdir("/workspace", { mode: 0o770 })
yield* admin.chown("/workspace", { uid: 1000, gid: 1000 })
const developer = yield* volume.caller({
identity: { uid: 1000, gid: 1000, groups: [], privileged: false },
umask: 0o027
})
yield* developer.writeFile(
"/workspace/config.json",
utf8.encode(JSON.stringify({ feature: "preview" })),
{ access: "write", create: "exclusive", mode: 0o666 }
)
const file = yield* developer.open("/workspace/config.json", { access: "read" })
const contents = yield* file.read(100_000)
const metadata = yield* file.stat
return {
config: JSON.parse(new TextDecoder().decode(contents)),
mode: metadata.mode.toString(8)
}
}))
const result = await Effect.runPromise(program.pipe(Effect.provide(NodeCrypto.layer)))
console.log(result) // { config: { feature: "preview" }, mode: "640" }
Root caller默认享有特权. 特权是明确的:设置 uid 改为 0 不给予它。 新建根
调用器默认为 umask 0o022; 开发商的 0o027 掩码会转换请求的文件模式 0o666 输入 0o640。 。 。 .
根包出口 VirtualFileSystem 作为命名空间。 等同的直接模块导入为
import * as Vfs from "@effect-vfs/core/VirtualFileSystem"。 。 。 .
将调用者绑入目录
caller.withRoot(path) 创建一个范围化的呼叫者 / 是一个目录。 绝对连锁和 .. 留下来
入于根内. 重命名根保留访问权限; 删除它会永久使调用者无效 .
保持呼叫者范围开放,仅传递消费者需要的能力. 现有的硬链接可以共享
文件内容横跨根。 见 关闭工作空间
以 Effect 的完整示例 FileSystem 服务和禁闭限制.
指南和参考
- 固定和快照 覆盖被种子的树木,可解码器,以及可移植的三角洲.
- 重叠工作空间 覆盖独立的编辑和
mergeSnapshotDeltas冲突. - 快照搜索 覆盖文件名词汇、内容匹配和定界结果.
- 文件系统模型 解释呼叫者、 控件、 权限和字节路径 .
- API 参考 列出构造器、服务和操作.
限制
包裹是实验性的. 公共API在小版本之间可能会有变化.
路径保存任意的非 NUL 字节 。 组件被限制在255字节上,而同义链接转录到40个链接. 卷选项绑定条目,文件大小,待定操作,并监视队列. 记忆卷没有提供主机或 崩溃耐久性。 见 兼容性和限制 整个合同.