Infrastructure Modules
Infrastructure Modules
A family of lightweight node packs you drop into any Redelay app to get generic infrastructure operations as FlowDSL nodes — Redis GET/SET, Mongo find/insert, HTTP request, file read/write, SMS send, FTP upload, and more. Each pack is either a framework-internal subpackage (no extra dep) or its own Go module in its own repository, so you pull in only what you actually use.
Register(engine, client) at bootstrap, and the nodes are available in every flow.At a glance
| Module | Location | Deps | Nodes | Factory |
|---|---|---|---|---|
| core | go-flowdsl/nodes/core (own submodule) | stdlib | 39 | core-flowdsl |
| events | go-flowdsl/nodes (own submodule) | framework | 6 | events-flowdsl |
| redisops | go-framework/modules/redisops/flowdsl | go-redis (already in framework) | 10 | redisops-flowdsl |
| mongoops | go-framework/modules/mongoops/flowdsl | mongo-driver (already in framework) | 6 | mongoops-flowdsl |
| storage (S3) | go-modules/storage/flowdsl | minio-go | 8 | storage-flowdsl |
| http | github.com/redelay/go-module-http | stdlib only | 5 | http-flowdsl |
| filesys | github.com/redelay/go-module-filesys | stdlib only | 5 | filesys-flowdsl |
| clickhouse | github.com/redelay/go-module-clickhouse | clickhouse-go v2 | 3 | clickhouse-flowdsl |
| postgres | github.com/redelay/go-module-postgres | pgx/v5 | 4 | postgres-flowdsl |
| rabbitmq | github.com/redelay/go-module-rabbitmq | amqp091-go | 3 | rabbitmq-flowdsl |
| sms | github.com/redelay/go-module-sms | stdlib (Twilio REST) | 1 | sms-flowdsl |
| ftp | github.com/redelay/go-module-ftp | jlaffaye/ftp + pkg/sftp | 6 | ftp-flowdsl |
Wiring pattern
All packs follow the same two-step wiring.
1. Blank-import the manifest so the module registers itself with the framework registry. This makes nodes discoverable from the /modules browser and the FlowDSL Studio:
import (
_ "github.com/redelay/go-framework/modules/redisops/flowdsl"
_ "github.com/redelay/go-framework/modules/mongoops/flowdsl"
_ "github.com/redelay/go-module-http/flowdsl"
_ "github.com/redelay/go-module-filesys/flowdsl"
_ "github.com/redelay/go-module-clickhouse/flowdsl"
_ "github.com/redelay/go-module-postgres/flowdsl"
_ "github.com/redelay/go-module-rabbitmq/flowdsl"
_ "github.com/redelay/go-module-sms/flowdsl"
_ "github.com/redelay/go-module-ftp/flowdsl"
)
2. Register runtime handlers against the flowexec engine, passing whatever client that pack needs. This is what binds a node ID (redisops/set, postgres/query, …) to its Go handler. Do it once at bootstrap:
import (
redisflow "github.com/redelay/go-framework/modules/redisops/flowdsl"
mongoflow "github.com/redelay/go-framework/modules/mongoops/flowdsl"
httpflow "github.com/redelay/go-module-http/flowdsl"
fsflow "github.com/redelay/go-module-filesys/flowdsl"
chflow "github.com/redelay/go-module-clickhouse/flowdsl"
pgflow "github.com/redelay/go-module-postgres/flowdsl"
rmqflow "github.com/redelay/go-module-rabbitmq/flowdsl"
smsflow "github.com/redelay/go-module-sms/flowdsl"
ftpflow "github.com/redelay/go-module-ftp/flowdsl"
coreflow "github.com/redelay/go-flowdsl/nodes/core"
nodesflow "github.com/redelay/go-flowdsl/nodes"
)
eng := flowexecmod.Current().Engine()
coreflow.Register(eng) // stdlib primitives — no client
redisflow.Register(eng, deps.Redis)
mongoflow.Register(eng, deps.DB)
nodesflow.RegisterPublishers(eng, deps.EventBus) // kafka/nats/redis-stream publish
httpflow.Register(eng) // stdlib http.Client
fsflow.Register(eng, os.Getenv("FILESYS_ROOT"))
chflow.Register(eng, chConn) // clickhouse.Conn
pgflow.Register(eng, pool) // pgxpool.Pool
rmqflow.Register(eng, amqpConn) // amqp.Connection
smsflow.Register(eng, smsflow.Config{
AccountSID: os.Getenv("TWILIO_ACCOUNT_SID"),
AuthToken: os.Getenv("TWILIO_AUTH_TOKEN"),
FromNumber: os.Getenv("TWILIO_FROM"),
})
ftpflow.Register(eng, ftpflow.Config{
Host: "ftp.example.com", User: "me", Password: os.Getenv("FTP_PASS"),
})
Skip any module you don't need — the pattern is always the same.
core
Package: go-flowdsl/nodes/core (own Go submodule under go-flowdsl) · Factory: core-flowdsl · 39 nodes
Pure, stdlib-only primitives. No I/O, no client, no credentials.
| Category | Nodes |
|---|---|
| Transform (11) | core/jsonpath-extract, core/json-merge, core/template-render, core/regex-extract, core/string-ops, core/math, core/datetime, core/type-cast, core/array-ops, core/object-pick, core/object-omit |
| Control flow (8) | core/if, core/switch, core/foreach, core/delay, core/parallel, core/merge, core/throttle, core/timeout |
| Validation (3) | core/json-schema-validate, core/assert, core/require-fields |
| Observability (4) | core/log, core/audit-emit, core/metric-counter, core/metric-gauge |
| Error handling (3) | core/catch, core/rethrow, core/dead-letter |
| Debug (3) | core/inspect, core/mock, core/noop |
| Composition (3) | core/subflow-invoke, core/return, core/raise |
| Business helpers (4) | core/webhook-respond, core/signature-verify, core/idempotency-key, core/rate-limit-check |
Extension context keys (wire sinks from your app):
core.AuditSinkKey— custom audit writercore.MetricSinkKey— Prometheus/OTel bridgecore.DeadLetterKey— DLQ sinkcore.KVStoreKey— backing store foridempotency-keyandrate-limit-check(a Redis-backed adapter is a ~30-line wrapper)core.WebhookResponderKey—http.ResponseWriterforwarded intocore/webhook-respond
events
Package: go-flowdsl/nodes (own Go submodule) · Factory: events-flowdsl · 6 nodes
Event-bus bridges: ingest JSON from any stream, map to typed events, publish over any transport.
| Node | Kind | Purpose |
|---|---|---|
redelay/event-source | source | Subscribe to any declared event — dropdown populated at runtime |
redelay/json-stream-source | source | Ingest JSON from HTTP webhook, NDJSON, Kafka-raw, NATS, Redis stream |
redelay/json-to-event | transform | Map arbitrary JSON to a declared event with JSONPath field mappings |
redelay/kafka-produce | action | Publish to a Kafka topic via the event bus |
redelay/nats-publish | action | Publish to a NATS subject via the event bus |
redelay/redis-stream-publish | action | Append to a Redis Stream via the event bus |
The publish handlers are thin wrappers around EventBus.Publish — the wiring transport (Kafka / NATS / Redis / memory) is picked at bootstrap via TRANSPORT env.
redisops
Package: go-framework/modules/redisops/flowdsl · Factory: redisops-flowdsl · 10 nodes
| Node | Kind |
|---|---|
redisops/get | router (found/missing) |
redisops/set | action (TTL + NX) |
redisops/del | action |
redisops/expire | action |
redisops/incr | transform |
redisops/lpush / redisops/lpop | action / router |
redisops/hget / redisops/hset | router / action |
redisops/publish | action |
Reuses ModuleDeps.Redis — zero extra config if you already run Redis.
mongoops
Package: go-framework/modules/mongoops/flowdsl · Factory: mongoops-flowdsl · 6 nodes
| Node | Kind |
|---|---|
mongoops/find | transform |
mongoops/find-one | router (found/missing) |
mongoops/insert | action (one or many) |
mongoops/update | action (one/many, upsert) |
mongoops/delete | action (one/many) |
mongoops/aggregate | transform |
Collection name is per-node via settings. Reuses ModuleDeps.DB.
storage (S3)
Package: go-modules/storage/flowdsl · Factory: storage-flowdsl · 8 nodes
Existing storage-upload, storage-download, storage-delete, storage-presign-url plus:
| Node | Kind | Purpose |
|---|---|---|
redelay/s3-list-objects | transform | List objects with optional prefix |
redelay/s3-head-object | router (found/missing) | Fetch object metadata |
redelay/s3-copy-object | action | Server-side copy (cross-bucket supported) |
redelay/s3-delete-many | action | Batch delete (up to 1000 keys) |
Backed by MinIO client — works against AWS S3, Cloudflare R2, MinIO, Backblaze B2, etc.
http
Package: github.com/redelay/go-module-http · Factory: http-flowdsl · 5 nodes · stdlib only
| Node | Kind | Purpose |
|---|---|---|
http/request | transform | Generic HTTP — any method, headers, body, bearer/basic auth, timeout |
http/get | transform | Convenience GET |
http/post | action | Convenience POST with JSON body |
http/put | action | Convenience PUT with JSON body |
http/delete | action | Convenience DELETE |
import httpflow "github.com/redelay/go-module-http/flowdsl"
httpflow.Register(eng)
filesys
Package: github.com/redelay/go-module-filesys · Factory: filesys-flowdsl · 5 nodes · stdlib only
| Node | Kind |
|---|---|
filesys/read | router (found/missing) |
filesys/write | action |
filesys/list | transform |
filesys/delete | action |
filesys/stat | router (found/missing) |
All paths are sandboxed to the root passed into Register(eng, root) (or FILESYS_ROOT). Escapes via .. are rejected.
clickhouse
Package: github.com/redelay/go-module-clickhouse · Factory: clickhouse-flowdsl · 3 nodes
| Node | Kind | Purpose |
|---|---|---|
clickhouse/query | transform | SELECT → rows under items |
clickhouse/insert | action | Batched INSERT INTO … VALUES using PrepareBatch |
clickhouse/exec | action | Any DDL or DML statement |
import chflow "github.com/redelay/go-module-clickhouse/flowdsl"
conn, _ := clickhouse.Open(&clickhouse.Options{Addr: []string{chHost}})
chflow.Register(eng, conn)
postgres
Package: github.com/redelay/go-module-postgres · Factory: postgres-flowdsl · 4 nodes
| Node | Kind | Purpose |
|---|---|---|
postgres/query | transform | SELECT → rows under items |
postgres/exec | action | INSERT / UPDATE / DELETE with rows_affected |
postgres/transaction | action | Atomic multi-statement tx (BEGIN / COMMIT / ROLLBACK) |
postgres/copy-from | action | Bulk COPY FROM STDIN |
Uses jackc/pgx/v5 pgxpool. Pass a pool created once at bootstrap.
rabbitmq
Package: github.com/redelay/go-module-rabbitmq · Factory: rabbitmq-flowdsl · 3 nodes
| Node | Kind | Purpose |
|---|---|---|
rabbitmq/publish | action | Publish to an exchange with routing key + persistence |
rabbitmq/declare | action | Declare queue and optional binding |
rabbitmq/consume | source | Subscribe to a queue — one packet per delivery |
Uses rabbitmq/amqp091-go. Pass an open amqp.Connection.
sms
Package: github.com/redelay/go-module-sms · Factory: sms-flowdsl · 1 node · stdlib only
| Node | Kind | Purpose |
|---|---|---|
sms/send | action | Send via Twilio REST API — no SDK, pure net/http |
Credentials passed once through smsflow.Config{AccountSID, AuthToken, FromNumber}. Per-node fromOverride supported.
ftp
Package: github.com/redelay/go-module-ftp · Factory: ftp-flowdsl · 6 nodes
| Node | Kind | Purpose |
|---|---|---|
ftp/upload | action | Upload file contents to remote FTP path |
ftp/download | transform | Download — utf8 or base64 |
ftp/list | transform | List remote directory |
ftp/delete | action | Delete file on FTP server |
sftp/upload | action | Upload over SFTP (SSH) |
sftp/download | transform | Download over SFTP |
Uses jlaffaye/ftp for FTP and pkg/sftp with golang.org/x/crypto/ssh for SFTP. Both flavours share a single Config{Host, User, Password, SSHPrivateKey} — supply SSHPrivateKey to use key auth on SFTP.
Regenerating the node catalog
Every page under /docs/nodes is auto-generated from the live flowdsl/module.yaml manifests. Regenerate after adding nodes:
make gen-docs
This walks the monorepo for flowdsl/module.yaml files and emits one page per node with a settings table, inputs/outputs, and an example YAML snippet.
go-ai — LLM Providers, Guard, Ledger
Provider-agnostic LLM access for Redelay — chat, streaming, embeddings, tool-use, safety classification, and cost ledger. Includes openai, ollama, anthropic, gemini, and ovh providers, a Guard abstraction backed by Qwen3Guard, and FlowDSL nodes for all of it.
Flow Templates
Contributing starter flows from a Go module — the TemplateProvider interface, JSON document shape, and lifecycle.