Files
x/ctx/value.go
T
2025-08-03 10:15:53 +08:00

156 lines
2.8 KiB
Go

package ctx
import (
"bytes"
"context"
"net"
"github.com/go-gost/core/logger"
)
type ClientAddr string
func (a ClientAddr) String() string {
return string(a)
}
// clientAddrKey saves the client address.
type clientAddrKey struct{}
var keyClientAddr clientAddrKey
func ContextWithClientAddr(ctx context.Context, addr ClientAddr) context.Context {
return context.WithValue(ctx, keyClientAddr, addr)
}
func ClientAddrFromContext(ctx context.Context) ClientAddr {
v, _ := ctx.Value(keyClientAddr).(ClientAddr)
return v
}
type (
srcAddrKey struct{}
dstAddrKey struct{}
)
var (
keySrcAddr srcAddrKey
keyDstAddr dstAddrKey
)
func ContextWithSrcAddr(ctx context.Context, addr net.Addr) context.Context {
return context.WithValue(ctx, keySrcAddr, addr)
}
func SrcAddrFromContext(ctx context.Context) net.Addr {
v, _ := ctx.Value(keySrcAddr).(net.Addr)
return v
}
func ContextWithDstAddr(ctx context.Context, addr net.Addr) context.Context {
return context.WithValue(ctx, keyDstAddr, addr)
}
func DstAddrFromContext(ctx context.Context) net.Addr {
v, _ := ctx.Value(keyDstAddr).(net.Addr)
return v
}
type (
Sid string
// sidKey saves the session ID.
sidKey struct{}
)
func (s Sid) String() string {
return string(s)
}
var (
keySid sidKey
)
func ContextWithSid(ctx context.Context, sid Sid) context.Context {
return context.WithValue(ctx, keySid, sid)
}
func SidFromContext(ctx context.Context) Sid {
v, _ := ctx.Value(keySid).(Sid)
return v
}
type (
// hashKey saves the hash source for Selector.
hashKey struct{}
Hash struct {
Source string
}
)
var (
clientHashKey = &hashKey{}
)
func ContextWithHash(ctx context.Context, hash *Hash) context.Context {
return context.WithValue(ctx, clientHashKey, hash)
}
func HashFromContext(ctx context.Context) *Hash {
if v, _ := ctx.Value(clientHashKey).(*Hash); v != nil {
return v
}
return nil
}
type (
ClientID string
clientIDKey struct{}
)
func (s ClientID) String() string {
return string(s)
}
var (
keyClientID = &clientIDKey{}
)
func ContextWithClientID(ctx context.Context, clientID ClientID) context.Context {
return context.WithValue(ctx, keyClientID, clientID)
}
func ClientIDFromContext(ctx context.Context) ClientID {
v, _ := ctx.Value(keyClientID).(ClientID)
return v
}
type bufferKey struct{}
var (
keyBuffer = &bufferKey{}
)
func ContextWithBuffer(ctx context.Context, buffer *bytes.Buffer) context.Context {
return context.WithValue(ctx, keyBuffer, buffer)
}
func BufferFromContext(ctx context.Context) *bytes.Buffer {
v, _ := ctx.Value(keyBuffer).(*bytes.Buffer)
return v
}
type loggerKey struct{}
var (
keyLogger = &loggerKey{}
)
func ContextWithLogger(ctx context.Context, log logger.Logger) context.Context {
return context.WithValue(ctx, keyLogger, log)
}
func LoggerFromContext(ctx context.Context) logger.Logger {
v, _ := ctx.Value(keyLogger).(logger.Logger)
return v
}