go-io/docs/index.md
Virgil c713bafd48
Some checks failed
CI / test (push) Failing after 3s
CI / auto-fix (push) Failing after 0s
CI / auto-merge (push) Failing after 0s
refactor(ax): align remaining AX examples and names
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-31 14:27:58 +00:00

4.1 KiB

title description
go-io Unified storage abstraction for Go with pluggable backends — local filesystem, S3, SQLite, in-memory, and key-value.

go-io

forge.lthn.ai/core/go-io is a storage abstraction library that provides a single Medium interface for reading and writing files across different backends. Write your code against Medium once, then swap between local disk, S3, SQLite, or in-memory storage without changing a line of business logic.

The library also includes sigil, a composable data-transformation pipeline for encoding, compression, hashing, and authenticated encryption.

Quick Start

import (
    io "forge.lthn.ai/core/go-io"
    "forge.lthn.ai/core/go-io/s3"
    "forge.lthn.ai/core/go-io/node"
)

content, _ := io.Local.Read("/etc/hostname")

sandboxMedium, _ := io.NewSandboxed("/var/data/myapp")
_ = sandboxMedium.Write("config.yaml", "key: value")

nodeTree := node.New()
nodeTree.AddData("hello.txt", []byte("world"))
tarball, _ := nodeTree.ToTar()

s3Medium, _ := s3.New(s3.Options{Bucket: "my-bucket", Client: awsClient, Prefix: "uploads/"})
_ = s3Medium.Write("photo.jpg", rawData)

Package Layout

Package Import Path Purpose
io (root) forge.lthn.ai/core/go-io Medium interface, helper functions, MemoryMedium for tests
local forge.lthn.ai/core/go-io/local Local filesystem backend with path sandboxing and symlink-escape protection
s3 forge.lthn.ai/core/go-io/s3 Amazon S3 / S3-compatible backend (Garage, MinIO, etc.)
sqlite forge.lthn.ai/core/go-io/sqlite SQLite-backed virtual filesystem (pure Go driver, no CGO)
node forge.lthn.ai/core/go-io/node In-memory filesystem implementing both Medium and fs.FS, with tar round-tripping
datanode forge.lthn.ai/core/go-io/datanode Thread-safe in-memory Medium backed by Borg's DataNode, with snapshot/restore
store forge.lthn.ai/core/go-io/store Group-namespaced key-value store (SQLite), with a Medium adapter and Go template rendering
sigil forge.lthn.ai/core/go-io/sigil Composable data transformations: encoding, compression, hashing, XChaCha20-Poly1305 encryption
workspace forge.lthn.ai/core/go-io/workspace Encrypted workspace service integrated with the Core DI container

The Medium Interface

Every storage backend implements the same 17-method interface:

type Medium interface {
    Read(path string) (string, error)
    Write(path, content string) error
    WriteMode(path, content string, mode fs.FileMode) error

    ReadStream(path string) (io.ReadCloser, error)
    WriteStream(path string) (io.WriteCloser, error)
    Open(path string) (fs.File, error)
    Create(path string) (io.WriteCloser, error)
    Append(path string) (io.WriteCloser, error)

    EnsureDir(path string) error
    List(path string) ([]fs.DirEntry, error)

    Stat(path string) (fs.FileInfo, error)
    Exists(path string) bool
    IsFile(path string) bool
    IsDir(path string) bool

    Delete(path string) error
    DeleteAll(path string) error
    Rename(oldPath, newPath string) error
}

All backends implement this interface fully. Backends where a method has no natural equivalent (e.g., EnsureDir on S3) provide a safe no-op.

Cross-Medium Operations

The root package provides helper functions that accept any Medium:

sourceMedium := io.Local
destinationMedium := io.NewMemoryMedium()
err := io.Copy(sourceMedium, "source.txt", destinationMedium, "dest.txt")

content, err := io.Read(destinationMedium, "path")
err = io.Write(destinationMedium, "path", "content")

Dependencies

Dependency Role
forge.lthn.ai/core/go-log Structured error helper (E())
forge.lthn.ai/Snider/Borg DataNode in-memory FS (used by datanode package)
github.com/aws/aws-sdk-go-v2 S3 client (used by s3 package)
golang.org/x/crypto BLAKE2, SHA-3, RIPEMD-160, XChaCha20-Poly1305 (used by sigil)
modernc.org/sqlite Pure Go SQLite driver (used by sqlite and store)
github.com/stretchr/testify Test assertions

Go version: 1.26.0

Licence: EUPL-1.2