mirror of
https://github.com/fiatjaf/khatru.git
synced 2025-03-27 10:12:54 +01:00
100 lines
3.3 KiB
Go
100 lines
3.3 KiB
Go
package relayer
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
|
|
"github.com/nbd-wtf/go-nostr"
|
|
"github.com/nbd-wtf/go-nostr/nip11"
|
|
)
|
|
|
|
// Relay is the main interface for implementing a nostr relay.
|
|
type Relay interface {
|
|
// Name is used as the "name" field in NIP-11 and as a prefix in default Server logging.
|
|
// For other NIP-11 fields, see [Informationer].
|
|
Name() string
|
|
// Init is called at the very beginning by [Server.Start], allowing a relay
|
|
// to initialize its internal resources.
|
|
// Also see [Storage.Init].
|
|
Init() error
|
|
// OnInitialized is called by [Server.Start] right before starting to serve HTTP requests.
|
|
// It is passed the server to allow callers make final adjustments, such as custom routing.
|
|
OnInitialized(*Server)
|
|
// AcceptEvent is called for every nostr event received by the server.
|
|
// If the returned value is true, the event is passed on to [Storage.SaveEvent].
|
|
// Otherwise, the server responds with a negative and "blocked" message as described
|
|
// in NIP-20.
|
|
AcceptEvent(*nostr.Event) bool
|
|
// Storage returns the relay storage implementation.
|
|
Storage() Storage
|
|
}
|
|
|
|
// Auther is the interface for implementing NIP-42.
|
|
// ServiceURL() returns the URL used to verify the "AUTH" event from clients.
|
|
type Auther interface {
|
|
ServiceURL() string
|
|
}
|
|
|
|
type Injector interface {
|
|
InjectEvents() chan nostr.Event
|
|
}
|
|
|
|
// Informationer is called to compose NIP-11 response to an HTTP request
|
|
// with application/nostr+json mime type.
|
|
// See also [Relay.Name].
|
|
type Informationer interface {
|
|
GetNIP11InformationDocument() nip11.RelayInformationDocument
|
|
}
|
|
|
|
// CustomWebSocketHandler, if implemented, is passed nostr message types unrecognized
|
|
// by the server.
|
|
// The server handles "EVENT", "REQ" and "CLOSE" messages, as described in NIP-01.
|
|
type CustomWebSocketHandler interface {
|
|
HandleUnknownType(ws *WebSocket, typ string, request []json.RawMessage)
|
|
}
|
|
|
|
// ShutdownAware is called during the server shutdown.
|
|
// See [Server.Shutdown] for details.
|
|
type ShutdownAware interface {
|
|
OnShutdown(context.Context)
|
|
}
|
|
|
|
// Logger is what [Server] uses to log messages.
|
|
type Logger interface {
|
|
Infof(format string, v ...any)
|
|
Warningf(format string, v ...any)
|
|
Errorf(format string, v ...any)
|
|
}
|
|
|
|
// Storage is a persistence layer for nostr events handled by a relay.
|
|
type Storage interface {
|
|
// Init is called at the very beginning by [Server.Start], after [Relay.Init],
|
|
// allowing a storage to initialize its internal resources.
|
|
Init() error
|
|
|
|
// QueryEvents is invoked upon a client's REQ as described in NIP-01.
|
|
QueryEvents(filter *nostr.Filter) (events []nostr.Event, err error)
|
|
// DeleteEvent is used to handle deletion events, as per NIP-09.
|
|
DeleteEvent(id string, pubkey string) error
|
|
// SaveEvent is called once Relay.AcceptEvent reports true.
|
|
SaveEvent(event *nostr.Event) error
|
|
}
|
|
|
|
// AdvancedQuerier methods are called before and after [Storage.QueryEvents].
|
|
type AdvancedQuerier interface {
|
|
BeforeQuery(*nostr.Filter)
|
|
AfterQuery([]nostr.Event, *nostr.Filter)
|
|
}
|
|
|
|
// AdvancedDeleter methods are called before and after [Storage.DeleteEvent].
|
|
type AdvancedDeleter interface {
|
|
BeforeDelete(id string, pubkey string)
|
|
AfterDelete(id string, pubkey string)
|
|
}
|
|
|
|
// AdvancedSaver methods are called before and after [Storage.SaveEvent].
|
|
type AdvancedSaver interface {
|
|
BeforeSave(*nostr.Event)
|
|
AfterSave(*nostr.Event)
|
|
}
|