Persistent storage adapters for [mtgo] Telegram clients — session data, peer cache, and conversation state.
- Six built-in backends: SQLite (pure-Go, no CGO), PostgreSQL, MongoDB, Redis, GORM, SQLC-generated
- In-memory adapter:
storage.NewMemory()for testing and short-lived clients - Conformance test suite: verify custom adapters with
internal/suite - Conversation plugin support: optional
ConversationStoreinterface - Portable session strings: export sessions in Telethon/Pyrogram/Kurigram format
- Update state and dedup: durable update queue with retry tracking
go get github.com/mtgo-labs/storageInstall only the backend you need:
go get github.com/mtgo-labs/storage/sqlite
# or
go get github.com/mtgo-labs/storage/postgres
# or
go get github.com/mtgo-labs/storage/mongodbext, err := sqlite.Open("session.db")
if err != nil {
log.Fatal(err)
}
defer ext.Close()
client, err := tg.NewClient(mustAtoi(apiID), apiHash, &tg.Config{
BotToken: botToken,
SessionName: "storage_bot",
SavePeers: true,
Storage: storage.NewAdapter(ext),
})ext, err := postgres.Open(postgres.Config{
Host: "localhost",
Port: 5432,
User: "mtgo",
Password: "secret",
Database: "mtgo",
SSLMode: "require",
})
if err != nil {
log.Fatal(err)
}
defer ext.Close()
client, err := tg.NewClient(mustAtoi(apiID), apiHash, &tg.Config{
BotToken: botToken,
SessionName: "storage_bot",
SavePeers: true,
Storage: storage.NewAdapter(ext),
})ext, err := mongodb.Open(ctx, mongodb.Config{
URI: "mongodb://localhost:27017",
Database: "mtgo",
})
if err != nil {
log.Fatal(err)
}
defer ext.Close()
client, err := tg.NewClient(mustAtoi(apiID), apiHash, &tg.Config{
BotToken: botToken,
SessionName: "storage_bot",
SavePeers: true,
Storage: storage.NewAdapter(ext),
})Note: Backends implement storage.Adapter (SessionStore + PeerStore + Close). The storage.NewAdapter wrapper bridges that interface into the client's Storage interface.
str, err := sqlite.ExportSessionString(sess)Implement the storage.Adapter interface (SessionStore + PeerStore + Close). For conversation plugin support, also implement ConversationStore.
A complete JSON-file example is in examples/custom_storage/.
func TestMyAdapter(t *testing.T) {
a := myadapter.Open()
suite.Run(t, a)
}Individual sub-suites are also available: suite.RunSession, suite.RunPeers, suite.RunConversations.
storage.go — interfaces and domain types (Session, Peer, Conversation, UpdateState)
adapter.go — wraps Adapter into the client's Storage interface
memory.go — in-memory adapter (NewMemory) for testing
sqlite/ — SQLite adapter (pure-Go via modernc.org/sqlite)
postgres/ — PostgreSQL adapter (lib/pq)
mongodb/ — MongoDB adapter (mongo-driver/v2)
redis/ — Redis adapter
gorm/ — GORM adapter
sqlc/ — SQLC schema and generated queries for sqlite/postgres
internal/suite/ — conformance test suite for custom adapters
examples/ — custom adapter examples
Contributions are welcome! Please open an issue or pull request.
go test ./...Licensed under the Apache License, Version 2.0. See LICENSE for details.