Skip to content

Invoker Middlewares

MTGo provides an invoker middleware system that intercepts outgoing RPC calls to Telegram. Unlike handler middleware (which wraps update processing), invoker middleware wraps the actual RPC invocation — perfect for rate limiting, flood wait handling, logging, and retries.

InvokerMiddleware Type

go
type InvokerMiddleware func(next tg.Invoker) tg.Invoker

Where tg.Invoker is:

go
type Invoker interface {
    RPCInvoke(ctx context.Context, input tg.TLObject, decode func(io.Reader) (tg.TLObject, error)) (tg.TLObject, error)
}

Registering Middleware

go
client.UseInvokerMiddleware(myMiddleware)

Multiple middleware are composed in registration order: the first registered wraps all subsequent ones.

Official Middlewares

MiddlewareDescription
Flood WaitAuto-handles FLOOD_WAIT errors with sleep and retry
Rate LimitToken-bucket rate limiter for outgoing RPC calls

Composing Middleware

Register multiple middleware to build a processing pipeline:

go
// Rate limit runs first (outermost), then flood wait handles any bursts that get through
limiter := ratelimit.New(30, 10)
waiter := floodwait.New()

client.UseInvokerMiddleware(limiter.Middleware())
client.UseInvokerMiddleware(waiter.Middleware())

Custom Invoker Middleware

Use the middleware template to create custom invoker middleware:

go
package mymiddleware

import (
    "context"
    "io"
    "log"
    "time"

    "github.com/mtgo-labs/mtgo/tg"
)

func Middleware() func(next tg.Invoker) tg.Invoker {
    return func(next tg.Invoker) tg.Invoker {
        return tg.InvokerFunc(func(ctx context.Context, input tg.TLObject, decode func(io.Reader) (tg.TLObject, error)) (tg.TLObject, error) {
            start := time.Now()
            log.Printf("RPC: %T", input)

            result, err := next.RPCInvoke(ctx, input, decode)

            log.Printf("RPC: %T done in %v (err=%v)", input, time.Since(start), err)
            return result, err
        })
    }
}

Usage:

go
client.UseInvokerMiddleware(mymiddleware.Middleware())

Handler Middleware vs Invoker Middleware

FeatureHandler MiddlewareInvoker Middleware
ScopeIncoming updatesOutgoing RPC calls
Registrationclient.UseMiddleware(mw)client.UseInvokerMiddleware(mw)
Use casesAuth, logging, i18nRate limiting, flood wait, retries
PrioritySupports priority parameterRegistration order

Middleware Template

The middlewares-template repository provides a starting point:

bash
cp -r middlewares-template/ middlewares/my-middleware

See Middleware Template for the full guide.

Released under the Apache-2.0 License.