Namespace Kuestenlogik.Bowire
Classes
- BowireEndpointRouteBuilderExtensions
ASP.NET routing extensions for mounting the Bowire multi-protocol API workbench onto an IEndpointRouteBuilder.
- BowireOptions
Runtime configuration for a Bowire instance.
- BowirePluginSetting
Describes a single setting that a protocol plugin contributes to the Bowire Settings dialog. The UI renders a control (toggle, text, number, select) based on the Type and persists the value in localStorage under
bowire_plugin_{pluginId}_{Key}.
- BowirePluginSettingOption
Option entry for a "select" type plugin setting.
- BowireProtocolRegistry
Registry of discovered protocol plugins. Scans loaded assemblies for IBowireProtocol implementations.
- BowireServerUrl
Parses Bowire's optional
hint@urlform for server URLs. A plugin hint tells the discovery + invoke endpoints which protocol plugin to consult — without one Bowire still probes every plugin in turn, which is fine in practice but slow when one of them needs a long network round-trip to discover that the URL isn't theirs (e.g. the gRPC plugin opens an HTTP/2 channel against an HTTP/1.1 GraphQL server and waits for the handshake to time out).Examples:
grpc@https://api.example.com:443→ hint=grpc, url=https://api.example.com:443signalr@https://api.example.com/hubs/chat→ hint=signalr, url=https://api.example.com/hubs/chathttps://alice:pwd@host.com→ no hint, url stays intact (the@is URI userinfo)https://api.example.com→ no hint, url stays intactudp://239.0.13.37:8137→ no hint, the URL scheme itself already routes the plugin
- BowireServiceCollectionExtensions
DI-container extensions that wire Bowire and its installed protocol plugins into an ASP.NET application.
- InvokeResult
Result of a protocol invocation (unary or client-streaming).
- OpenApiUploadStore
In-memory store for OpenAPI / Swagger documents uploaded via the UI. The REST plugin reads from this store during discovery and merges the parsed services with whatever it finds via embedded discovery or URL fetching.
The store keeps raw document text only — parsing happens in the REST plugin because Kuestenlogik.Bowire core can't take a dependency on the OpenAPI reader package without dragging it into every host that uses Bowire.
- ProtoSource
Source for proto file definitions. Used to provide service schemas when gRPC Server Reflection is not available.
- StreamFrame
One frame yielded by a server-streaming call that exposes wire bytes.
Jsonis the display / recording form;Binaryis what the mock server replays on the wire.
- UploadedDoc
A single uploaded OpenAPI/Swagger document with its raw content.
Interfaces
- IBowireChannel
Interactive bidirectional channel for duplex/client-streaming protocols.
- IBowireProtocol
Protocol plugin for Bowire. Implement this to add support for a new protocol. Discovered automatically via assembly scanning.
- IBowireProtocolServices
Optional extension of IBowireProtocol that allows a protocol plugin to register required services and map discovery endpoints automatically.
When a user calls
builder.Services.AddBowire(), Bowire scans loaded assemblies for IBowireProtocol implementations that also implement this interface and calls ConfigureServices(IServiceCollection) on each one. Similarly,app.MapBowire()calls MapDiscoveryEndpoints(IEndpointRouteBuilder).This eliminates the need for protocol-specific boilerplate. For example, the gRPC plugin uses this to call
AddGrpcReflection()andMapGrpcReflectionService()automatically — but only when the gRPC protocol package is actually referenced.
- IBowireStreamingWithWireBytes
Optional extension for IBowireProtocol implementations that can expose the raw wire bytes of each server-streamed frame alongside the JSON rendering. Implemented by protocol plugins whose wire format is binary and distinct from their JSON representation (gRPC today); the JSON-only InvokeStreamAsync(string, string, string, List<string>, bool, Dictionary<string, string>?, CancellationToken) stays the default path for everyone else.
- IInlineHttpInvoker
Optional capability surface for protocol plugins that can dispatch a generic BowireMethodInfo as an HTTP request — i.e. plugins that know how to bucket fields by their Source (path / query / header / body), substitute path placeholders, build a request body, and parse the response.
The REST plugin implements this so that the gRPC plugin's HTTP-transcoding discovery (which produces BowireMethodInfo instances with HttpMethod + HttpPath set) can be invoked over HTTP without core taking on any HTTP-specific dependencies. If a Bowire build doesn't include the REST plugin, FindHttpInvoker() returns null and the /api/invoke endpoint refuses HTTP transcoding requests with a clear error.
- IInlineSseSubscriber
Optional capability surface for protocol plugins that can subscribe to a remote Server-Sent Events stream and yield each event as it arrives.
The SSE plugin implements this so that other plugins (MCP for server-side notifications, GraphQL for the graphql-sse subscription transport) can reuse the SSE event-stream parser without taking a hard dependency on
Kuestenlogik.Bowire.Protocol.Sseat compile time. If the SSE plugin isn't loaded, FindSseSubscriber() returns null and the consuming plugin should fall back to a clear "install the SSE plugin" error.
- IInlineWebSocketChannel
Optional capability surface for protocol plugins that can open a raw WebSocket channel — used by plugins that need to ride on top of a WebSocket transport (e.g. the GraphQL plugin's graphql-transport-ws subscription support) without taking a compile-time dependency on
Kuestenlogik.Bowire.Protocol.WebSocket.Implementers should honour the
subProtocolsparameter by passing it toClientWebSocket.Options.AddSubProtocol(...)before the handshake — that's how WebSocket sub-protocols likegraphql-transport-wsare negotiated. Headers go on the upgrade request viaSetRequestHeaderso the existing auth-helper pipeline keeps working unchanged.
Enums
- BowireMode
Bowire UI operating mode — chooses between in-process discovery (embedded) and user-driven URL entry (standalone).
- BowireTheme
Initial colour theme for the Bowire UI. Users can always override this from the theme toggle in the header; the selected theme is persisted per browser in
localStorage.