cog

module
v0.0.0-...-5662ddb Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 18, 2026 License: MIT

README

Cog Engine

Cog is a small typed plugin engine for Go. Plugins communicate through events, commands, and locked resources; the kernel owns registration, scheduling, and error handling.

Why Cog

  • Safe parallelism by construction. Ready event subscribers and independent tasks run concurrently whenever their resource access does not conflict. Handlers declare access by binding typed read and write handles; the scheduler acquires the resulting lock set atomically and prevents races over engine-managed state.
  • No lock bookkeeping to keep in sync. The same binding that gives a handler access to a resource declares its lock. When one command uses another, Cog computes the transitive resource set at composition time, so callers stay decoupled from the callee's implementation details.
  • A small, highly decoupled microkernel. Plugins depend on typed commands, events, and resources rather than concrete plugin implementations. Features can be added, removed, or replaced at the composition root without a central application object accumulating subsystem knowledge.
  • Declarative scenes without asset plumbing. Build each frame from UI element values and canvas draw declarations that reference images and fonts by path. Canvas loads and caches assets lazily, packs sprites and glyphs into atlases, and manages their GPU resources; explicit unloading remains available when an application needs tighter residency control.
  • Invalid architectures fail before startup. Cog validates plugin dependencies, unique ownership, required resources, command usage, and event ordering while composing the engine instead of discovering structural mistakes during play.
  • Deterministic lifecycle and event ordering. Explicit dependencies govern startup and shutdown, while event subscribers can declare ordering only where it matters and remain parallel everywhere else.
  • Typed contracts without generated glue. Exact Go types identify commands, events, and resources, preserving compile-time request and response types across plugin boundaries.
  • Low-allocation frame loops. Handler factories run once during registration, synchronous command dispatch avoids per-call allocations, warmed UI processing is allocation-free, and canvas queues retain their backing storage between frames.
  • One operational boundary. Context propagation, asynchronous errors, cancellation, and orderly shutdown converge in the kernel, and the finalized plugin and contract graph is available for runtime introspection.

Packages

  • kernel: plugin lifecycle, typed registry, scheduler, resources, and errors.
  • app: the application loop — lifecycle, fixed-step update and render events, quit, and time control with pause, step and a hold that makes several observations describe one tick — over a platform MainLoop.
  • input: input state, discrete events, the driver-facing apply command, and scripted input.
  • anim: timelines of eased value tracks and one-tick cues, advanced every fixed step.
  • ecs: entities, components, the sparse-set stores they live in, and systems as plain funcs whose parameter types are their lock set.
  • storage: layered read filesystems and one permanent writable filesystem, which a platform Adapter provides.
  • diskstorage and jsstorage: storage's permanent filesystem Adapters, a directory under the user's data directory on desktop and localStorage in a browser.
  • m: immutable vectors, rectangles, colors, matrices, quaternions, scalar helpers, and splines. Angles use radians.
  • gfx: driver-neutral rendering queues, resources, viewport, backend contract, frame capture, and per-tick snapshots.
  • canvas: layered 2D sprites, text, primitives, and custom triangles over gfx, with a snapshot of what a tick recorded.
  • scene: declarative 3D cameras, glTF models, buffer-built meshes, punctual lights, and debug shapes over gfx.
  • ecsscene: the ecs↔scene binding — components holding scene's own types, and the one system that records them into scene.
  • ui: immediate-mode layout, interaction, canvas-backed visual processing, and a snapshot of what layout resolved.
  • gogpu: window, input, frame timing and WebGPU system driver, and app's platform MainLoop.
  • mcp: the agent-facing extension point — typed capabilities a plugin offers, collected through a Port from every plugin's Provider by a broker that serves them to an agent over MCP.

Plugin Kinds

Every plugin is one kind, and its directory says which:

  • Slots (slots/) cannot work until an Adapter fills a Port they require, and composition fails without one: app, gfx, storage.
  • Extensions (extensions/) provide Adapters for Slots and declare no API: gogpu, diskstorage, jsstorage.
  • Bundles (bundles/) are every other plugin. They require no Port, and may collect Adapters or contribute them.
  • Libraries (libs/) define no plugin and import only other Libraries and the kernel, and kernel imports nothing else in cog.

Every plugin X has one shape:

  • The root, X/, holds declarations only: commands, events, resources, Ports, Adapters, types, config, errors and Name, each in its own fixed file. An Extension's root holds only Name, config, its Adapters and errors.
  • Its functions are forwarders. They live in utils.go, and each one is a single call into X/internal/types passing its parameters through. A Slot's forwarders name no other plugin's types.
  • X/internal/types holds the concrete types the root aliases, for performance or because code there names them, and X/internal/ holds the implementation.
  • The constructor package, X/Xplugin, exports only New().
package may import
root libs, kernel, other plugins' roots, its own internal/types
internal/types libs, kernel, other plugins' roots
internal/ libs, kernel, any root, its own internal/ and internal/types
constructor kernel, its own internal/

Nothing in cog imports a constructor package or another plugin's internals, except tests. Games and examples are composition roots and import freely.

This shape supersedes the one ADR 0001 decided. The kinds, the file allowlists, where new code goes and the full import table are in .github/instructions/architecture.instructions.md, and go test ./kernel/archtest enforces them.

Plugin Layout

Plugin file layout, handler structure, and resource-scope rules are enforced conventions; see .github/instructions/kernel.instructions.md.

Each package's documents live under <package>/docs/. <package>/docs/README.md is its API, and design records live under <package>/docs/specs/: the package's general spec is <package>.md (for example bundles/scene/docs/specs/scene.md) and a spec covering one focused mechanism takes that mechanism's name.

Lifecycle

config := map[kernel.PluginName]any{
    storage.Name: storage.Config{}.
        WithReadFS("res", storage.DefaultReadPriority, os.DirFS("res")),
    diskstorage.Name: diskstorage.Config{AppId: "my-app"},
    gogpu.Name: gogpu.Config{}.WithTitle("My App"),
}

plugins := []kernel.Plugin{
    storageplugin.New(),
    diskstorageplugin.New(), // provides storage's PermanentFS Adapter
    inputplugin.New(),
    appplugin.New(),
    gfxplugin.New(),
    gogpuplugin.New(), // provides app's MainLoop and gfx's Backend Adapters
    ...
}

kernel.New(config).
    WithPlugins(plugins...).
    Run(ctx)

kernel.New returns an *Engine: the composition root that owns the plugin set, registry, scheduler, and lifetime. WithPlugins validates and topologically orders dependencies, calls every Register, then finalizes ownership and subscription DAGs. Run calls optional PluginStarter implementations in dependency order, calls the optional PluginHost on the calling thread, and invokes optional PluginStopper implementations in reverse order. Unrelated plugins retain caller order.

At runtime plugins receive a kernel.Kernel: a small per-dispatch value carrying the engine, the invocation context, and the locks its caller holds.

Communication At A Glance

Plugins talk through three mechanisms, all identified by exact Go type:

  • Commands are synchronous and return a result. Identity is a distinct defined factory type: type LoadCmd kernel.Command[LoadRequest, LoadResponse].
  • Events are asynchronous and need no registration. Zero or more subscriptions may react: type updateHandler kernel.Subscription[app.UpdateEvent].
  • Resources are shared state whose access the scheduler serializes. A handler binds a Read[T] or Write[T] handle once, and binding is what declares the lock.

A handler is a factory returning a Lock that binds handles and a body that runs per invocation. The factory runs once, at registration.

See kernel/docs/README.md for the full API and .github/instructions/kernel.instructions.md for the rules that keep usage correct — particularly that values read from a handle are valid only while the handler holds its lock.

Errors and Shutdown

All command and subscription handler errors flow through the engine's serialized ErrorHandler. Returning true terminates the engine; returning false allows recovery where possible. The default handler logs and terminates. Context cancellation and the host returning both shut down the runtime.

Directories

Path Synopsis
bundles
anim
Package anim declares timelines of eased value tracks and one-tick cues.
Package anim declares timelines of eased value tracks and one-tick cues.
anim/animplugin
Package animplugin constructs the anim plugin.
Package animplugin constructs the anim plugin.
anim/internal
Package internal is the anim plugin: New, and the handler behind anim's AdvanceOnUpdate subscription that advances every timeline each tick.
Package internal is the anim plugin: New, and the handler behind anim's AdvanceOnUpdate subscription that advances every timeline each tick.
anim/internal/types
Package types declares the concrete types anim's root aliases: Timelines and Timeline, whose unexported state the plugin advances, and everything those refer to or a track is built from (Params, State, Easing, Sequence, Lerp and Flipbook), with the easings, the Lerp constructors and Over that the root forwards to.
Package types declares the concrete types anim's root aliases: Timelines and Timeline, whose unexported state the plugin advances, and everything those refer to or a track is built from (Params, State, Easing, Sequence, Lerp and Flipbook), with the easings, the Lerp constructors and Over that the root forwards to.
canvas
Package canvas declares the 2D drawing Bundle: layered sprites, text, primitives and custom triangles recorded into a frame-local queue, and sprites and text measured through a persistent lookup.
Package canvas declares the 2D drawing Bundle: layered sprites, text, primitives and custom triangles recorded into a frame-local queue, and sprites and text measured through a persistent lookup.
canvas/canvasplugin
Package canvasplugin constructs the canvas plugin.
Package canvasplugin constructs the canvas plugin.
canvas/internal
Package internal is the canvas plugin: New, the resolution of canvas.Config, the flush that turns a tick's recorded canvas.OpQueue into gfx draws through the sprite and triangle batchers, the draw-snapshot slot behind canvas.ArmDrawsCmd, the Start mount of the built-in shaders and default font, and the mcp Provider offering canvas_draws.
Package internal is the canvas plugin: New, the resolution of canvas.Config, the flush that turns a tick's recorded canvas.OpQueue into gfx draws through the sprite and triangle batchers, the draw-snapshot slot behind canvas.ArmDrawsCmd, the Start mount of the built-in shaders and default font, and the mcp Provider offering canvas_draws.
canvas/internal/types
Package types declares the concrete types canvas's root aliases, and the machinery behind them: the recording vocabulary and the two resources, OpQueue and Lookup, with their recording and measuring methods; the consume side of the queue; the sprite and glyph atlases, the font store and inline-text parsing; Config, which the atlases hold; the halo profile; and the built-in materials.
Package types declares the concrete types canvas's root aliases, and the machinery behind them: the recording vocabulary and the two resources, OpQueue and Lookup, with their recording and measuring methods; the consume side of the queue; the sprite and glyph atlases, the font store and inline-text parsing; Config, which the atlases hold; the halo profile; and the built-in materials.
ecs
Package ecs describes things in the world as Entities carrying Components.
Package ecs describes things in the world as Entities carrying Components.
ecs/ecsplugin
Package ecsplugin constructs the ecs plugin.
Package ecsplugin constructs the ecs plugin.
ecs/internal
Package internal is the ecs plugin: New, the resolution of ecs.Config, and the registration that publishes the id authority, *ecs.Entities, as the resource every System holds for read and every structural change holds for write.
Package internal is the ecs plugin: New, the resolution of ecs.Config, and the registration that publishes the id authority, *ecs.Entities, as the resource every System holds for read and every structural change holds for write.
ecs/internal/types
Package types declares the concrete types ecs's root aliases, and the machinery behind them: the Entity handle and the id authority, Entities; the Store and component registration; the System parameters (Query, Spawn, WriteableEntities, Get, Set, Remove, Read, Write, In and Resp) with the Query fill and the handler builders ToHandler and ToExecute; the filters; List; and validation mode.
Package types declares the concrete types ecs's root aliases, and the machinery behind them: the Entity handle and the id authority, Entities; the Store and component registration; the System parameters (Query, Spawn, WriteableEntities, Get, Set, Remove, Read, Write, In and Resp) with the Query fill and the handler builders ToHandler and ToExecute; the filters; List; and validation mode.
ecsphysics2d
Package ecsphysics2d gives an app 2D rigid-body physics on a plane.
Package ecsphysics2d gives an app 2D rigid-body physics on a plane.
ecsphysics2d/ecsphysics2dplugin
Package ecsphysics2dplugin constructs the physics plugin.
Package ecsphysics2dplugin constructs the physics plugin.
ecsphysics2d/internal
Package internal is the physics plugin itself: the Components it registers, the four Systems the step is, and the settings resolved at registration.
Package internal is the physics plugin itself: the Components it registers, the four Systems the step is, and the settings resolved at registration.
ecsphysics2d/internal/types
Package types declares the concrete types ecsphysics2d's root aliases, and the plain functions its forwarders call.
Package types declares the concrete types ecsphysics2d's root aliases, and the plain functions its forwarders call.
ecsscene
Package ecsscene records Entities into scene.
Package ecsscene records Entities into scene.
ecsscene/ecssceneplugin
Package ecssceneplugin constructs the ecsscene plugin.
Package ecssceneplugin constructs the ecsscene plugin.
ecsscene/internal
Package internal is the ecsscene plugin: New, the registration of every Component ecsscene's root declares, the recording scratch, and the one System, subscribed as ecsscene.RecordOnUpdate, that copies every matching Entity into scene's op queue once a tick.
Package internal is the ecsscene plugin: New, the registration of every Component ecsscene's root declares, the recording scratch, and the one System, subscribed as ecsscene.RecordOnUpdate, that copies every matching Entity into scene's op queue once a tick.
input
Package input declares the driver-agnostic input Bundle: a unified Key space (keyboard keys AND mouse buttons), a polled State resource, discrete input events, and the Apply command a driver uses to feed input changes.
Package input declares the driver-agnostic input Bundle: a unified Key space (keyboard keys AND mouse buttons), a polled State resource, discrete input events, and the Apply command a driver uses to feed input changes.
input/inputplugin
Package inputplugin constructs the input plugin.
Package inputplugin constructs the input plugin.
input/internal
Package internal is the input plugin: New, the handlers behind input's commands and its AdvanceOnUpdate subscription, and the mcp Provider offering input_send and input_state.
Package internal is the input plugin: New, the handlers behind input's commands and its AdvanceOnUpdate subscription, and the mcp Provider offering input_send and input_state.
input/internal/types
Package types declares the concrete types input's root aliases: Key with its name table, Mods, Pos, Change and State, whose unexported state the plugin reads or writes, and the consume side of State — folding a change in and advancing the per-tick edges.
Package types declares the concrete types input's root aliases: Key with its name table, Mods, Pos, Change and State, whose unexported state the plugin reads or writes, and the consume side of State — folding a change in and advancing the per-tick edges.
mcp
Package mcp declares the agent-facing Bundle: how a plugin offers typed capabilities to an agent, and nothing about how those capabilities reach one.
Package mcp declares the agent-facing Bundle: how a plugin offers typed capabilities to an agent, and nothing about how those capabilities reach one.
mcp/internal
Package internal is the mcp broker: the one plugin that collects every mcp.Provider Adapter in the engine and serves their capabilities to an agent over the Model Context Protocol.
Package internal is the mcp broker: the one plugin that collects every mcp.Provider Adapter in the engine and serves their capabilities to an agent over the Model Context Protocol.
mcp/internal/types
Package types declares the concrete types mcp's root aliases: Capability, whose unexported fields only its two constructors, Command and Func, may set, and Option, which writes to capability settings no other package can reach.
Package types declares the concrete types mcp's root aliases: Capability, whose unexported fields only its two constructors, Command and Func, may set, and Option, which writes to capability settings no other package can reach.
mcp/mcpplugin
Package mcpplugin constructs the mcp broker plugin.
Package mcpplugin constructs the mcp broker plugin.
scene
Package scene declares the 3D Bundle: declarative frames - cameras and their passes, glTF models, buffer-built meshes, punctual lights and debug shapes - recorded into a frame-local queue, and models loaded, queried and unloaded through a persistent lookup.
Package scene declares the 3D Bundle: declarative frames - cameras and their passes, glTF models, buffer-built meshes, punctual lights and debug shapes - recorded into a frame-local queue, and models loaded, queried and unloaded through a persistent lookup.
scene/internal
Package internal is the scene plugin: New, the resolution of scene.Config, the flush that turns a tick's recorded scene.OpQueue into gfx passes and draws - model expansion, light selection, culling, sorting, material interning and instance packing - the handlers of the two-hop model load, and the Start mount of the bundled shaders.
Package internal is the scene plugin: New, the resolution of scene.Config, the flush that turns a tick's recorded scene.OpQueue into gfx passes and draws - model expansion, light selection, culling, sorting, material interning and instance packing - the handlers of the two-hop model load, and the Start mount of the bundled shaders.
scene/internal/types
Package types declares the concrete types scene's root aliases, and the machinery behind them: the recording vocabulary and the two resources with the recording methods of OpQueue and the queries and mutations of LookupAccess; the consume side of the queue; Config, which the Lookup holds; the model table with its residency, unloads and the glTF loader behind it; the mesh table; the bundled PBR material; the vertex, morph and animation packing; and the camera maths the flush and the coordinate helpers both build on.
Package types declares the concrete types scene's root aliases, and the machinery behind them: the recording vocabulary and the two resources with the recording methods of OpQueue and the queries and mutations of LookupAccess; the consume side of the queue; Config, which the Lookup holds; the model table with its residency, unloads and the glTF loader behind it; the mesh table; the bundled PBR material; the vertex, morph and animation packing; and the camera maths the flush and the coordinate helpers both build on.
scene/sceneplugin
Package sceneplugin constructs the scene plugin.
Package sceneplugin constructs the scene plugin.
ui
Package ui declares the immediate-mode layout and interaction Bundle: a consumer declares a tree of Elements into the Frame every update tick, and ui measures and arranges it, hit-tests the pointer, records the visuals into canvas and publishes what was interacted with in Interactions.
Package ui declares the immediate-mode layout and interaction Bundle: a consumer declares a tree of Elements into the Frame every update tick, and ui measures and arranges it, hit-tests the pointer, records the visuals into canvas and publishes what was interacted with in Interactions.
ui/internal
Package internal is the ui plugin: New, the processing behind ui.ProcessOnUpdate that lays out the tick's ui.Frame, resolves the pointer into ui.Interactions and records into canvas, the private layout resource it keeps across ticks, the layout-snapshot slot behind ui.ArmLayoutCmd, and the mcp Provider offering ui_layout.
Package internal is the ui plugin: New, the processing behind ui.ProcessOnUpdate that lays out the tick's ui.Frame, resolves the pointer into ui.Interactions and records into canvas, the private layout resource it keeps across ticks, the layout-snapshot slot behind ui.ArmLayoutCmd, and the mcp Provider offering ui_layout.
ui/internal/types
Package types declares the concrete types ui's root aliases, and the machinery behind them: the Element and Modifier vocabulary, the built-in visuals and containers, the Frame and Interactions resources, HoverTracker, the layout engine (Processor) that both Measure and the plugin run, and the rendering of a resolved tree into the layout-snapshot views.
Package types declares the concrete types ui's root aliases, and the machinery behind them: the Element and Modifier vocabulary, the built-in visuals and containers, the Frame and Interactions resources, HoverTracker, the layout engine (Processor) that both Measure and the plugin run, and the rendering of a resolved tree into the layout-snapshot views.
ui/uiplugin
Package uiplugin constructs the ui plugin.
Package uiplugin constructs the ui plugin.
docs
research/ecs-go-mechanics-bench/store
Package store is a throwaway stand-in for an ECS component store living in a DIFFERENT package from the loop that ranges over it.
Package store is a throwaway stand-in for an ECS component store living in a DIFFERENT package from the loop that ranges over it.
extensions
diskstorage
Package diskstorage declares the desktop Extension of storage: a plugin that provides storage.PermanentFS as a directory confined under the user's data directory, named by the application id.
Package diskstorage declares the desktop Extension of storage: a plugin that provides storage.PermanentFS as a directory confined under the user's data directory, named by the application id.
diskstorage/diskstorageplugin
Package diskstorageplugin constructs the diskstorage plugin.
Package diskstorageplugin constructs the diskstorage plugin.
diskstorage/internal
Package internal is the diskstorage plugin: New, the application id and data directory resolution, and the confined directory it provides as storage's PermanentFS.
Package internal is the diskstorage plugin: New, the application id and data directory resolution, and the confined directory it provides as storage's PermanentFS.
gogpu
Package gogpu declares cog's window, input, frame timing and WebGPU driver, built on, and named for, the gogpu library (github.com/gogpu/gogpu): the one kernel.PluginHost.
Package gogpu declares cog's window, input, frame timing and WebGPU driver, built on, and named for, the gogpu library (github.com/gogpu/gogpu): the one kernel.PluginHost.
gogpu/gogpuplugin
Package gogpuplugin constructs the gogpu plugin.
Package gogpuplugin constructs the gogpu plugin.
gogpu/internal
Package internal is the gogpu plugin: New, the kernel.PluginHost that owns the gogpu library's main loop, the app.MainLoop and gfx.Backend it provides, and the input bridge.
Package internal is the gogpu plugin: New, the kernel.PluginHost that owns the gogpu library's main loop, the app.MainLoop and gfx.Backend it provides, and the input bridge.
jsstorage
Package jsstorage declares the browser Extension of storage: a plugin that provides storage.PermanentFS backed by the page's localStorage, under the key cog.storage.<AppId>.
Package jsstorage declares the browser Extension of storage: a plugin that provides storage.PermanentFS backed by the page's localStorage, under the key cog.storage.<AppId>.
jsstorage/internal
Package internal is the jsstorage plugin: New, the application id check, and the localStorage-backed filesystem it provides as storage's PermanentFS.
Package internal is the jsstorage plugin: New, the application id check, and the localStorage-backed filesystem it provides as storage's PermanentFS.
jsstorage/jsstorageplugin
Package jsstorageplugin constructs the jsstorage plugin.
Package jsstorageplugin constructs the jsstorage plugin.
Package kernel is a small microkernel: plugins register resources, commands, and event subscriptions, then communicate through them.
Package kernel is a small microkernel: plugins register resources, commands, and event subscriptions, then communicate through them.
archtest/internal
Package internal holds the fixture types kernel.TypeName's table test renders: named types declared in a package whose import path ends in internal, which is the shape every Bundle's and Port's internal/ package has.
Package internal holds the fixture types kernel.TypeName's table test renders: named types declared in a package whose import path ends in internal, which is the shape every Bundle's and Port's internal/ package has.
libs
m
Package m provides immutable value-style mathematics for Cog.
Package m provides immutable value-style mathematics for Cog.
slots
app
Package app declares the app Slot: the platform-agnostic application loop.
Package app declares the app Slot: the platform-agnostic application loop.
app/appplugin
Package appplugin constructs the app plugin.
Package appplugin constructs the app plugin.
app/internal
Package internal is the app plugin: New, the Loop a MainLoop drives, the tick source behind app.TimeCmd, the QuitCmd and TimeCmd handlers, and its mcp provider.
Package internal is the app plugin: New, the Loop a MainLoop drives, the tick source behind app.TimeCmd, the QuitCmd and TimeCmd handlers, and its mcp provider.
gfx
Package gfx declares the gfx Slot, cog's driver-agnostic high-level renderer (renderer v2).
Package gfx declares the gfx Slot, cog's driver-agnostic high-level renderer (renderer v2).
gfx/gfxplugin
Package gfxplugin constructs the gfx plugin.
Package gfxplugin constructs the gfx plugin.
gfx/internal
Package internal is the gfx plugin: New, the handlers behind gfx's commands and subscriptions, the translator from recorded queues to a gfx.Queue, and the capture and frame-snapshot slots.
Package internal is the gfx plugin: New, the handlers behind gfx's commands and subscriptions, the translator from recorded queues to a gfx.Queue, and the capture and frame-snapshot slots.
gfx/internal/types
Package types declares the concrete types gfx's root aliases: the recording types whose unexported state the renderer reads - OpQueue, ResourceQueue and the descriptors - with their recording methods and the consume side of the queues; the GPU vocabulary they carry in their fields, from IDs and formats to the backend Queue and its sinks; the view types snapshots share; and the shader preprocessor.
Package types declares the concrete types gfx's root aliases: the recording types whose unexported state the renderer reads - OpQueue, ResourceQueue and the descriptors - with their recording methods and the consume side of the queues; the GPU vocabulary they carry in their fields, from IDs and formats to the backend Queue and its sinks; the view types snapshots share; and the shader preprocessor.
storage
Package storage declares the storage Slot: one kernel resource, FileSystem, a prioritized read-only overlay over every mounted filesystem, including the single permanent one that writes land in.
Package storage declares the storage Slot: one kernel resource, FileSystem, a prioritized read-only overlay over every mounted filesystem, including the single permanent one that writes land in.
storage/internal
Package internal is the storage plugin: New and the handlers behind storage's commands.
Package internal is the storage plugin: New and the handlers behind storage's commands.
storage/internal/types
Package types declares the concrete types storage's root aliases: FileSystem, WriteFS, Values and the value requests, whose unexported state the plugin's handlers read, and the types those refer to, PermanentFS included.
Package types declares the concrete types storage's root aliases: FileSystem, WriteFS, Values and the value requests, whose unexported state the plugin's handlers read, and the types those refer to, PermanentFS included.
storage/storageplugin
Package storageplugin constructs the storage plugin.
Package storageplugin constructs the storage plugin.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL