// Copyright 2022 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package diameter type Runnable interface { Run() } // RunnableFunc is converter which converts function to Runnable interface type RunnableFunc func() // Run is Runnable.Run func (r RunnableFunc) Run() { r() } type Executor interface { ExecuteUnsafe(runnable Runnable) } type Promise[T any] interface { Future() Future[T] Success(value T) bool Failure(err error) bool IsCompleted() bool Complete(result Try[T]) bool } type Future[T any] interface { OnFailure(cb func(err error), ctx ...Executor) OnSuccess(cb func(success T), ctx ...Executor) Foreach(f func(v T), ctx ...Executor) OnComplete(cb func(try Try[T]), ctx ...Executor) IsCompleted() bool // Value() Option[Try[T]] Failed() Future[error] Recover(f func(err error) T, ctx ...Executor) Future[T] RecoverWith(f func(err error) Future[T], ctx ...Executor) Future[T] } type Try[T any] struct { v *T err error } func (r Try[T]) IsSuccess() bool { return r.v != nil } type ByteBuffer struct { pos int buf []byte underflow error } // InboundHandler is extends of uclient.NetInboundHandler type InboundHandler interface { OriginHost() string OriginRealm() string } type transactionID struct { hopID uint32 endID uint32 } type roundTripper struct { promise map[transactionID]Promise[*ByteBuffer] host string realm string } func (r *roundTripper) OriginHost() string { return r.host } func (r *roundTripper) OriginRealm() string { return r.realm } func NewInboundHandler(host string, realm string, productName string) InboundHandler { ret := &roundTripper{promise: make(map[transactionID]Promise[*ByteBuffer]), host: host, realm: realm} return ret }