Reference

Infrastructure Modules

Generic FlowDSL node packs for Redis, MongoDB, ClickHouse, HTTP, filesystem, Postgres, RabbitMQ, SMS, FTP/SFTP, and the core stdlib primitives — compose any flow without hardcoding infrastructure calls.

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.

Everything on this page is production-ready, wire-it-up-in-minutes infrastructure. Blank-import the manifest (for the Studio), call Register(engine, client) at bootstrap, and the nodes are available in every flow.

At a glance

ModuleLocationDepsNodesFactory
corego-flowdsl/nodes/core (own submodule)stdlib39core-flowdsl
eventsgo-flowdsl/nodes (own submodule)framework6events-flowdsl
redisopsgo-framework/modules/redisops/flowdslgo-redis (already in framework)10redisops-flowdsl
mongoopsgo-framework/modules/mongoops/flowdslmongo-driver (already in framework)6mongoops-flowdsl
storage (S3)go-modules/storage/flowdslminio-go8storage-flowdsl
httpgithub.com/redelay/go-module-httpstdlib only5http-flowdsl
filesysgithub.com/redelay/go-module-filesysstdlib only5filesys-flowdsl
clickhousegithub.com/redelay/go-module-clickhouseclickhouse-go v23clickhouse-flowdsl
postgresgithub.com/redelay/go-module-postgrespgx/v54postgres-flowdsl
rabbitmqgithub.com/redelay/go-module-rabbitmqamqp091-go3rabbitmq-flowdsl
smsgithub.com/redelay/go-module-smsstdlib (Twilio REST)1sms-flowdsl
ftpgithub.com/redelay/go-module-ftpjlaffaye/ftp + pkg/sftp6ftp-flowdsl
Every node is catalogued page-by-page in the Node Catalog with full settings tables, inputs/outputs, and example YAML snippets.

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:

go
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:

go
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.

CategoryNodes
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 writer
  • core.MetricSinkKey — Prometheus/OTel bridge
  • core.DeadLetterKey — DLQ sink
  • core.KVStoreKey — backing store for idempotency-key and rate-limit-check (a Redis-backed adapter is a ~30-line wrapper)
  • core.WebhookResponderKey — http.ResponseWriter forwarded into core/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.

NodeKindPurpose
redelay/event-sourcesourceSubscribe to any declared event — dropdown populated at runtime
redelay/json-stream-sourcesourceIngest JSON from HTTP webhook, NDJSON, Kafka-raw, NATS, Redis stream
redelay/json-to-eventtransformMap arbitrary JSON to a declared event with JSONPath field mappings
redelay/kafka-produceactionPublish to a Kafka topic via the event bus
redelay/nats-publishactionPublish to a NATS subject via the event bus
redelay/redis-stream-publishactionAppend 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

NodeKind
redisops/getrouter (found/missing)
redisops/setaction (TTL + NX)
redisops/delaction
redisops/expireaction
redisops/incrtransform
redisops/lpush / redisops/lpopaction / router
redisops/hget / redisops/hsetrouter / action
redisops/publishaction

Reuses ModuleDeps.Redis — zero extra config if you already run Redis.


mongoops

Package: go-framework/modules/mongoops/flowdsl · Factory: mongoops-flowdsl · 6 nodes

NodeKind
mongoops/findtransform
mongoops/find-onerouter (found/missing)
mongoops/insertaction (one or many)
mongoops/updateaction (one/many, upsert)
mongoops/deleteaction (one/many)
mongoops/aggregatetransform

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:

NodeKindPurpose
redelay/s3-list-objectstransformList objects with optional prefix
redelay/s3-head-objectrouter (found/missing)Fetch object metadata
redelay/s3-copy-objectactionServer-side copy (cross-bucket supported)
redelay/s3-delete-manyactionBatch 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

NodeKindPurpose
http/requesttransformGeneric HTTP — any method, headers, body, bearer/basic auth, timeout
http/gettransformConvenience GET
http/postactionConvenience POST with JSON body
http/putactionConvenience PUT with JSON body
http/deleteactionConvenience DELETE
go
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

NodeKind
filesys/readrouter (found/missing)
filesys/writeaction
filesys/listtransform
filesys/deleteaction
filesys/statrouter (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

NodeKindPurpose
clickhouse/querytransformSELECT → rows under items
clickhouse/insertactionBatched INSERT INTO … VALUES using PrepareBatch
clickhouse/execactionAny DDL or DML statement
go
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

NodeKindPurpose
postgres/querytransformSELECT → rows under items
postgres/execactionINSERT / UPDATE / DELETE with rows_affected
postgres/transactionactionAtomic multi-statement tx (BEGIN / COMMIT / ROLLBACK)
postgres/copy-fromactionBulk 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

NodeKindPurpose
rabbitmq/publishactionPublish to an exchange with routing key + persistence
rabbitmq/declareactionDeclare queue and optional binding
rabbitmq/consumesourceSubscribe 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

NodeKindPurpose
sms/sendactionSend 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

NodeKindPurpose
ftp/uploadactionUpload file contents to remote FTP path
ftp/downloadtransformDownload — utf8 or base64
ftp/listtransformList remote directory
ftp/deleteactionDelete file on FTP server
sftp/uploadactionUpload over SFTP (SSH)
sftp/downloadtransformDownload 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:

shell
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.