|  | // 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 | 
|  | } |