Schema Types & Capabilities

Supported schema types, capabilities, compatibility modes, and protocol metadata

FARP supports a wide range of API protocols and schema types. Each schema type has a corresponding provider that can generate schemas from your application code.

Schema Types

type SchemaType string

const (
    SchemaTypeOpenAPI  SchemaType = "openapi"   // OpenAPI 3.x specifications
    SchemaTypeAsyncAPI SchemaType = "asyncapi"  // AsyncAPI 2.x/3.x specifications
    SchemaTypeGRPC     SchemaType = "grpc"      // gRPC / Protocol Buffers
    SchemaTypeGraphQL  SchemaType = "graphql"   // GraphQL SDL
    SchemaTypeORPC     SchemaType = "orpc"      // oRPC (OpenAPI-based RPC)
    SchemaTypeThrift   SchemaType = "thrift"    // Apache Thrift IDL
    SchemaTypeAvro     SchemaType = "avro"      // Apache Avro schemas
    SchemaTypeCustom   SchemaType = "custom"    // Custom/proprietary protocols
)

Use SchemaType.IsValid() to check if a schema type is recognized by the protocol.


Capabilities

Capabilities declare the transport protocols a service supports. They are reported in the manifest's capabilities array and help gateways decide how to route traffic:

type Capability string

const (
    CapabilityREST      Capability = "rest"
    CapabilityGRPC      Capability = "grpc"
    CapabilityWebSocket Capability = "websocket"
    CapabilitySSE       Capability = "sse"
    CapabilityGraphQL   Capability = "graphql"
    CapabilityMQTT      Capability = "mqtt"
    CapabilityAMQP      Capability = "amqp"
)

Example

manifest.AddCapability("rest")
manifest.AddCapability("grpc")
manifest.AddCapability("websocket")

if manifest.HasCapability("grpc") {
    // Configure gRPC proxy
}

Schema Compatibility

The SchemaCompatibility struct tracks compatibility guarantees between schema versions. Gateways and consumers use this to make safe deployment decisions:

type SchemaCompatibility struct {
    Mode             CompatibilityMode `json:"mode"`
    PreviousVersions []string          `json:"previous_versions,omitempty"`
    BreakingChanges  []BreakingChange  `json:"breaking_changes,omitempty"`
    Deprecations     []Deprecation     `json:"deprecations,omitempty"`
}

Compatibility Modes

ModeDescription
backwardNew schema can read data written by old schema
forwardOld schema can read data written by new schema
fullBoth backward and forward compatible
noneBreaking changes, no compatibility guaranteed
backward_transitiveBackward compatible across N versions
forward_transitiveForward compatible across N versions

Breaking Changes

Track specific breaking changes between versions:

type BreakingChange struct {
    Type        ChangeType     `json:"type"`
    Path        string         `json:"path"`        // e.g., "/paths/users/get"
    Description string         `json:"description"`
    Severity    ChangeSeverity `json:"severity"`
    Migration   string         `json:"migration,omitempty"`
}

Change types: field_removed, field_type_changed, field_required, endpoint_removed, endpoint_changed, enum_value_removed, method_removed

Severity levels: critical (immediate breakage), high (likely breakage), medium (possible breakage), low (minimal risk)

Deprecations

Track deprecated fields and endpoints with migration guidance:

type Deprecation struct {
    Path         string `json:"path"`
    DeprecatedAt string `json:"deprecated_at"`  // ISO 8601
    RemovalDate  string `json:"removal_date,omitempty"`
    Replacement  string `json:"replacement,omitempty"`
    Migration    string `json:"migration,omitempty"`
    Reason       string `json:"reason,omitempty"`
}

Example

descriptor.Compatibility = &farp.SchemaCompatibility{
    Mode: farp.CompatibilityBackward,
    PreviousVersions: []string{"v1.1.0", "v1.0.0"},
    BreakingChanges: []farp.BreakingChange{
        {
            Type:        farp.ChangeTypeFieldRemoved,
            Path:        "/paths/users/get/parameters/legacy_id",
            Description: "Removed legacy_id parameter",
            Severity:    farp.SeverityMedium,
            Migration:   "Use 'id' parameter instead",
        },
    },
    Deprecations: []farp.Deprecation{
        {
            Path:         "/paths/users/get",
            DeprecatedAt: "2024-01-15T00:00:00Z",
            RemovalDate:  "2024-07-15T00:00:00Z",
            Replacement:  "/paths/v2/users/get",
            Reason:       "Migrating to v2 API",
        },
    },
}

Protocol Metadata

Protocol-specific metadata extends the schema descriptor with type-specific information. This enables gateways to handle protocol-specific features:

type ProtocolMetadata struct {
    GraphQL  *GraphQLMetadata  `json:"graphql,omitempty"`
    GRPC     *GRPCMetadata     `json:"grpc,omitempty"`
    OpenAPI  *OpenAPIMetadata  `json:"openapi,omitempty"`
    AsyncAPI *AsyncAPIMetadata `json:"asyncapi,omitempty"`
    ORPC     *ORPCMetadata     `json:"orpc,omitempty"`
}

GraphQL Metadata

type GraphQLMetadata struct {
    Federation           *GraphQLFederation `json:"federation,omitempty"`
    SubscriptionsEnabled bool               `json:"subscriptions_enabled,omitempty"`
    SubscriptionProtocol string             `json:"subscription_protocol,omitempty"`
    ComplexityLimit      int                `json:"complexity_limit,omitempty"`
    DepthLimit           int                `json:"depth_limit,omitempty"`
}

Supports Apollo Federation configuration with @key directives, extended types, and federated query planning.

gRPC Metadata

type GRPCMetadata struct {
    Services          []GRPCServiceInfo `json:"services,omitempty"`
    ReflectionEnabled bool              `json:"reflection_enabled,omitempty"`
    UseTLS            bool              `json:"use_tls,omitempty"`
    MaxMessageSize    int64             `json:"max_message_size,omitempty"`
}

OpenAPI Metadata

Includes composition configuration for schema merging:

type OpenAPIMetadata struct {
    Composition *CompositionConfig `json:"composition,omitempty"`
}

type CompositionConfig struct {
    IncludeInMerged   bool             `json:"include_in_merged"`
    ConflictStrategy  ConflictStrategy `json:"conflict_strategy,omitempty"`
    ComponentPrefix   string           `json:"component_prefix,omitempty"`
    TagPrefix         string           `json:"tag_prefix,omitempty"`
    OperationIDPrefix string           `json:"operation_id_prefix,omitempty"`
}

Webhook Events

FARP defines standard event types for bidirectional communication between services and gateways:

Service → Gateway Events

EventDescription
schema.updatedSchema was updated
health.changedHealth status changed
instance.scalingInstance scaling event
maintenance.modeEntering/leaving maintenance

Gateway → Service Events

EventDescription
ratelimit.changedRate limit configuration changed
circuit.breaker.openCircuit breaker tripped
circuit.breaker.closedCircuit breaker recovered
config.updatedConfiguration was updated
traffic.shiftTraffic routing changed

How is this guide?

On this page