gateway: Index | Files | Directories

package gateway

import ""


Package Files

cache.go execute.go gateway.go graphiql.go http.go internal.go logging.go merge.go middlewares.go plan.go


const MessageMissingCachedQuery = "PersistedQueryNotFound"

MessageMissingCachedQuery is the string that the server sends when the user assumes that the server knows about a caches query plan

type AutomaticQueryPlanCache Uses

type AutomaticQueryPlanCache struct {
    // contains filtered or unexported fields

AutomaticQueryPlanCache is a QueryPlanCache that will use the hash if it points to a known query plan, otherwise it will compute the plan and save it for later, to be referenced by the designated hash.

func NewAutomaticQueryPlanCache Uses

func NewAutomaticQueryPlanCache() *AutomaticQueryPlanCache

NewAutomaticQueryPlanCache returns a fresh instance of

func (*AutomaticQueryPlanCache) Retrieve Uses

func (c *AutomaticQueryPlanCache) Retrieve(ctx *PlanningContext, hash *string, planner QueryPlanner) (QueryPlanList, error)

Retrieve follows the "automatic query persistance" technique. If the hash is known, it will use the referenced query plan. If the hash is not know but the query is provided, it will compute the plan, return it, and save it for later use. If the hash is not known and the query is not provided, it will return with an error prompting the client to provide the hash and query

func (*AutomaticQueryPlanCache) WithCacheTTL Uses

func (c *AutomaticQueryPlanCache) WithCacheTTL(duration time.Duration) *AutomaticQueryPlanCache

WithCacheTTL updates and returns the cache with the new cache lifetime. Queries that haven't been used in that long are cleaned up on the next query.

type ErrExecutor Uses

type ErrExecutor struct {
    Error error

ErrExecutor always returnes the internal error.

func (*ErrExecutor) Execute Uses

func (e *ErrExecutor) Execute(ctx *ExecutionContext) (map[string]interface{}, error)

Execute returns the internet error

type ExecutionContext Uses

type ExecutionContext struct {
    Plan               *QueryPlan
    Variables          map[string]interface{}
    RequestContext     context.Context
    RequestMiddlewares []graphql.NetworkMiddleware

ExecutionContext is a well-type alternative to context.Context and provides the context for a particular execution.

type ExecutionMiddleware Uses

type ExecutionMiddleware interface {

ExecutionMiddleware are things that interject in the execution process

type Executor Uses

type Executor interface {
    Execute(ctx *ExecutionContext) (map[string]interface{}, error)

Executor is responsible for executing a query plan against the remote schemas and returning the result

type ExecutorFunc Uses

type ExecutorFunc func(ctx *ExecutionContext) (map[string]interface{}, error)

ExecutorFunc wraps a function to be used as an executor.

func (ExecutorFunc) Execute Uses

func (e ExecutorFunc) Execute(ctx *ExecutionContext) (map[string]interface{}, error)

Execute invokes and returns the internal function

type FieldURLMap Uses

type FieldURLMap map[string][]string

FieldURLMap holds the intformation for retrieving the valid locations one can find the value for the field

func (FieldURLMap) Concat Uses

func (m FieldURLMap) Concat(other FieldURLMap) FieldURLMap

Concat returns a new field map url whose entries are the union of both maps

func (FieldURLMap) RegisterURL Uses

func (m FieldURLMap) RegisterURL(parent string, field string, locations ...string)

RegisterURL adds a new location to the list of possible places to find the value for parent.field

func (FieldURLMap) URLFor Uses

func (m FieldURLMap) URLFor(parent string, field string) ([]string, error)

URLFor returns the list of locations one can find parent.field.

type Gateway Uses

type Gateway struct {
    // contains filtered or unexported fields

Gateway is the top level entry for interacting with a gateway. It is responsible for merging a list of remote schemas into one, generating a query plan to execute based on an incoming request, and following that plan

func New Uses

func New(sources []*graphql.RemoteSchema, configs ...Option) (*Gateway, error)

New instantiates a new schema with the required stuffs.

func (*Gateway) Execute Uses

func (g *Gateway) Execute(ctx *RequestContext, plans QueryPlanList) (map[string]interface{}, error)

Execute takes a query string, executes it, and returns the response

func (*Gateway) GetPlans Uses

func (g *Gateway) GetPlans(ctx *RequestContext) (QueryPlanList, error)

func (*Gateway) GraphQLHandler Uses

func (g *Gateway) GraphQLHandler(w http.ResponseWriter, r *http.Request)

GraphQLHandler returns a http.HandlerFunc that should be used as the primary endpoint for the gateway API. The endpoint will respond to queries on both GET and POST requests. POST requests can either be a single object with { query, variables, operationName } or a list of that object.

func (*Gateway) PlaygroundHandler Uses

func (g *Gateway) PlaygroundHandler(w http.ResponseWriter, r *http.Request)

PlaygroundHandler returns a http.HandlerFunc which on GET requests shows the user an interface that they can use to interact with the API. On POSTs the endpoint executes the designated query

func (*Gateway) Query Uses

func (g *Gateway) Query(ctx context.Context, input *graphql.QueryInput, receiver interface{}) error

Query takes a query definition and writes the result to the receiver

type HTTPOperation Uses

type HTTPOperation struct {
    Query         string                 `json:"query"`
    Variables     map[string]interface{} `json:"variables"`
    OperationName string                 `json:"operationName"`
    Extensions    struct {
        QueryPlanCache *PersistedQuerySpecification `json:"persistedQuery"`
    }   `json:"extensions"`

HTTPOperation is the incoming payload when sending POST requests to the gateway

type Logger Uses

type Logger struct {
    // contains filtered or unexported fields

Logger handles the logging in the gateway library

func (*Logger) Debug Uses

func (l *Logger) Debug(args ...interface{})

Debug should be used for any logging that would be useful for debugging

func (*Logger) Info Uses

func (l *Logger) Info(args ...interface{})

Info should be used for any logging that doesn't necessarily need attention but is nice to see by default

func (*Logger) QueryPlanStep Uses

func (l *Logger) QueryPlanStep(step *QueryPlanStep)

QueryPlanStep formats and logs a query plan step for human consumption

func (*Logger) Warn Uses

func (l *Logger) Warn(args ...interface{})

Warn should be used for logging that needs attention

func (*Logger) WithFields Uses

func (l *Logger) WithFields(fields LoggerFields) *Logger

WithFields adds the provided fields to the Log

type LoggerFields Uses

type LoggerFields map[string]interface{}

LoggerFields is a wrapper over a map of key,value pairs to associate with the log

type Merger Uses

type Merger interface {
    Merge([]*ast.Schema) (*ast.Schema, error)

Merger is an interface for structs that are capable of taking a list of schemas and returning something that resembles a "merge" of those schemas.

type MergerFunc Uses

type MergerFunc func([]*ast.Schema) (*ast.Schema, error)

MergerFunc is a wrapper of a function of the same signature as Merger.Merge

func (MergerFunc) Merge Uses

func (m MergerFunc) Merge(sources []*ast.Schema) (*ast.Schema, error)

Merge invokes and returns the wrapped function

type Middleware Uses

type Middleware interface {

Middleware are things that can modify a gateway normal execution

type MiddlewareList Uses

type MiddlewareList []Middleware

MiddlewareList is a list of Middlewares

type MinQueriesPlanner Uses

type MinQueriesPlanner struct {
    LocationPriorities []string

MinQueriesPlanner does the most basic level of query planning

func (*MinQueriesPlanner) Plan Uses

func (p *MinQueriesPlanner) Plan(ctx *PlanningContext) (QueryPlanList, error)

Plan computes the nested selections that will need to be performed

func (*MinQueriesPlanner) WithLocationPriorities Uses

func (p *MinQueriesPlanner) WithLocationPriorities(priorities []string) QueryPlanner

func (*MinQueriesPlanner) WithQueryerFactory Uses

func (p *MinQueriesPlanner) WithQueryerFactory(factory *QueryerFactory) QueryPlanner

WithQueryerFactory returns a version of the planner with the factory set

type MockErrPlanner Uses

type MockErrPlanner struct {
    Err error

MockErrPlanner always returns the provided error. Useful in testing.

func (*MockErrPlanner) Plan Uses

func (p *MockErrPlanner) Plan(*PlanningContext) (QueryPlanList, error)

type MockExecutor Uses

type MockExecutor struct {
    Value map[string]interface{}

MockExecutor always returns a success with the provided value

func (*MockExecutor) Execute Uses

func (e *MockExecutor) Execute(ctx *ExecutionContext) (map[string]interface{}, error)

Execute returns the provided value

type MockPlanner Uses

type MockPlanner struct {
    Plans QueryPlanList

MockPlanner always returns the provided list of plans. Useful in testing.

func (*MockPlanner) Plan Uses

func (p *MockPlanner) Plan(*PlanningContext) (QueryPlanList, error)

type NoQueryPlanCache Uses

type NoQueryPlanCache struct{}

NoQueryPlanCache will always compute the plan for a query, regardless of the value passed as `hash`

func (*NoQueryPlanCache) Retrieve Uses

func (p *NoQueryPlanCache) Retrieve(ctx *PlanningContext, hash *string, planner QueryPlanner) (QueryPlanList, error)

Retrieve just computes the query plan

type Option Uses

type Option func(*Gateway)

Option is a function to be passed to New that configures the resulting schema

func WithAutomaticQueryPlanCache Uses

func WithAutomaticQueryPlanCache() Option

WithAutomaticQueryPlanCache enables the "automatic persisted query" technique

func WithExecutor Uses

func WithExecutor(e Executor) Option

WithExecutor returns an Option that sets the executor of the gateway

func WithLocationPriorities Uses

func WithLocationPriorities(priorities []string) Option

func WithMerger Uses

func WithMerger(m Merger) Option

WithMerger returns an Option that sets the merger of the gateway

func WithMiddlewares Uses

func WithMiddlewares(middlewares ...Middleware) Option

WithMiddlewares returns an Option that adds middlewares to the gateway

func WithNoQueryPlanCache Uses

func WithNoQueryPlanCache() Option

WithNoQueryPlanCache is the default option and disables any persisted query behavior

func WithPlanner Uses

func WithPlanner(p QueryPlanner) Option

WithPlanner returns an Option that sets the planner of the gateway

func WithQueryFields Uses

func WithQueryFields(fields ...*QueryField) Option

WithQueryFields returns an Option that adds the given query fields to the gateway

func WithQueryPlanCache Uses

func WithQueryPlanCache(p QueryPlanCache) Option

WithQueryPlanCache sets the query plan cache that the gateway will use

func WithQueryerFactory Uses

func WithQueryerFactory(factory *QueryerFactory) Option

WithQueryerFactory returns an Option that changes the queryer used by the planner when generating plans that interact with remote services.

type ParallelExecutor Uses

type ParallelExecutor struct{}

ParallelExecutor executes the given query plan by starting at the root of the plan and walking down the path stitching the results together

func (*ParallelExecutor) Execute Uses

func (executor *ParallelExecutor) Execute(ctx *ExecutionContext) (map[string]interface{}, error)

Execute returns the result of the query plan

type PersistedQuerySpecification Uses

type PersistedQuerySpecification struct {
    Version int    `json:"version"`
    Hash    string `json:"sha256Hash"`

type Planner Uses

type Planner struct {
    QueryerFactory *QueryerFactory
    // contains filtered or unexported fields

Planner is meant to be embedded in other QueryPlanners to share configuration

func (*Planner) GetQueryer Uses

func (p *Planner) GetQueryer(ctx *PlanningContext, url string) graphql.Queryer

GetQueryer returns the queryer that should be used to resolve the plan

type PlannerWithLocationPriorities Uses

type PlannerWithLocationPriorities interface {
    WithLocationPriorities(priorities []string) QueryPlanner

PlannerWithLocationFactory is an interface for planners with configurable location priorities

type PlannerWithQueryerFactory Uses

type PlannerWithQueryerFactory interface {
    WithQueryerFactory(*QueryerFactory) QueryPlanner

PlannerWithQueryerFactory is an interface for planners with configurable queryer factories

type PlanningContext Uses

type PlanningContext struct {
    Query     string
    Schema    *ast.Schema
    Locations FieldURLMap
    Gateway   *Gateway

PlanningContext is the input struct to the Plan method

type QueryField Uses

type QueryField struct {
    Name      string
    Type      *ast.Type
    Arguments ast.ArgumentDefinitionList
    Resolver  func(context.Context, map[string]interface{}) (string, error)

QueryField is a hook to add gateway-level fields to a gateway. Limited to only being able to resolve an id of an already existing type in order to keep business logic out of the gateway.

type QueryPlan Uses

type QueryPlan struct {
    Operation           *ast.OperationDefinition
    RootStep            *QueryPlanStep
    FragmentDefinitions ast.FragmentDefinitionList
    FieldsToScrub       map[string][][]string

QueryPlan is the full plan to resolve a particular query

type QueryPlanCache Uses

type QueryPlanCache interface {
    Retrieve(ctx *PlanningContext, hash *string, planner QueryPlanner) (QueryPlanList, error)

QueryPlanCache decides when to compute a plan

type QueryPlanList Uses

type QueryPlanList []*QueryPlan

QueryPlanList is a list of plans which can be indexed by operation name

func (QueryPlanList) ForOperation Uses

func (l QueryPlanList) ForOperation(name string) (*QueryPlan, error)

ForOperation returns the query plan meant to satisfy the given operation name

type QueryPlanStep Uses

type QueryPlanStep struct {
    // execution meta data
    InsertionPoint []string
    Then           []*QueryPlanStep

    // required info to generate the query
    Queryer      graphql.Queryer
    ParentType   string
    ParentID     string
    SelectionSet ast.SelectionSet

    // pre-generated query stuff
    QueryDocument       *ast.QueryDocument
    QueryString         string
    FragmentDefinitions ast.FragmentDefinitionList
    Variables           Set

QueryPlanStep represents a step in the plan required to fulfill a query.

type QueryPlanner Uses

type QueryPlanner interface {
    Plan(*PlanningContext) (QueryPlanList, error)

QueryPlanner is responsible for taking a string with a graphql query and returns the steps to fulfill it

type QueryerFactory Uses

type QueryerFactory func(ctx *PlanningContext, url string) graphql.Queryer

QueryerFactory is a function that returns the queryer to use depending on the context

type RequestContext Uses

type RequestContext struct {
    Context       context.Context
    Query         string
    OperationName string
    Variables     map[string]interface{}
    CacheKey      string

RequestContext holds all of the information required to satisfy the user's query

type RequestMiddleware Uses

type RequestMiddleware graphql.NetworkMiddleware

RequestMiddleware is a middleware that can modify outbound requests to services

func (RequestMiddleware) Middleware Uses

func (p RequestMiddleware) Middleware()

Middleware marks RequestMiddleware as a valid middleware

type ResponseMiddleware Uses

type ResponseMiddleware func(ctx *ExecutionContext, response map[string]interface{}) error

ResponseMiddleware is a middleware that can modify the response before it is serialized and sent to the user

func (ResponseMiddleware) ExecutionMiddleware Uses

func (p ResponseMiddleware) ExecutionMiddleware()

ExecutionMiddleware marks ResponseMiddleware as a valid execution middleware

func (ResponseMiddleware) Middleware Uses

func (p ResponseMiddleware) Middleware()

Middleware marks ResponseMiddleware as a valid middleware

type Set Uses

type Set map[string]bool

Set is a set

func (Set) Add Uses

func (set Set) Add(k string)

Add adds the item to the set

func (Set) Has Uses

func (set Set) Has(k string) bool

Has returns wether or not the string is in the set

func (Set) Remove Uses

func (set Set) Remove(k string)

Remove removes the item from the set



Package gateway imports 18 packages (graph) and is imported by 2 packages. Updated 2020-09-23. Refresh now. Tools for package owners.