// STRYKE-AZURE — ENGINEERING REPORT

Opt-in stryke connector package · cdylib libstryke_azure (publish=false) · namespace Azure · JSON-in/JSON-out FFI over dlopen

>_EXECUTIVE SUMMARY

stryke-azure is an opt-in connector package in the stryke ecosystem — the Azure counterpart to stryke-aws. It exposes Blob Storage, Storage Queues, Cosmos DB, Key Vault Secrets and Keys, and Entra identity as the typed data plane, plus an Azure Resource Manager management plane (Virtual Machines, Storage-account management, Service Bus, Monitor, Container Instances / AKS, Resource Groups, Subscriptions) — all under the Azure package. The data plane is built on the official Azure SDK for Rust (GA 1.0.0; Cosmos on the 0.35.0 preview).

The SDK pulls in tokio, hyper, rustls, reqwest, and the typespec client-core plus per-service generated models — a dependency tree that ships once, on demand, as an opt-in package. stryke core is never linked against it. The management plane has no GA typed Rust SDK crate, so those ops reach ARM over REST — reusing the same shared Entra credential and the same azure_core HTTP client the typed data-plane clients use.

89
FFI exports
13
Packages (Azure + 12)
cdylib
Load model (dlopen)
v0.18.0
Package version

~ARCHITECTURE

A single in-process cdylib. The stryke side is a thin .stk library; the heavy SDK code lives in libstryke_azure and is dlopened on first use Azure. No sidecar process, no fork per call.

LayerImplementation
stryke library (lib/*.stk)Thin wrappers exposing typed functions; serialize args to JSON, decode responses, die on an {error} payload
cdylib (libstryke_azure)Rust async (tokio); each azure__* export takes a JSON string and returns a JSON string
Persistent stateOne shared tokio runtime + one DeveloperToolsCredential as Arc<dyn TokenCredential>, reused across every service client
FFI safetyHandler errors and panics are caught and surfaced as {"error": ...}; a panic never crosses the C ABI into the host shell
BuildCargo crate-type = ["cdylib"], publish = false; ships via s pkg install -g .
TestsRust unit tests under src/ (endpoint construction + FFI-safety pins, offline) plus surface tests under t/
CIGitHub Actions .github/workflows/ci.yml — check, fmt, clippy -D warnings, test (ubuntu + macos), doc, release-build on three targets

~SERVICE MAPPING

The surface tracks stryke-aws, remapped onto Azure's GA Rust SDK for the data plane and onto Azure Resource Manager REST for the management plane. The typed crate versions below are the ones pinned in Cargo.lock.

AWSAzureBacking crate / transport
S3Blob Storageazure_storage_blob 1.0.0
SQSStorage Queuesazure_storage_queue 1.0.0
DynamoDBCosmos DB (NoSQL)azure_data_cosmos 0.35.0 (preview; Cargo.lock pins the exact build)
Secrets Manager / SSMKey Vault Secretsazure_security_keyvault_secrets 1.0.0
KMSKey Vault Keysazure_security_keyvault_keys 1.0.0
STSEntra identity tokenazure_identity 1.0.0
EC2Virtual MachinesARM REST (via azure_core 1.0.0)
ECS / EKSContainer Instances / AKSARM REST
SNS / SQS (enterprise)Service BusARM + data-plane REST
CloudWatchAzure Monitor metricsARM REST
(account mgmt)Storage account managementARM REST
(resource mgmt)Resource Groups / SubscriptionsARM REST

The data-plane services come from the GA typed crates. The management plane has no GA typed Rust SDK crate; rather than shipping an untyped second SDK or a separate process, those ops issue ARM REST calls through the azure_core HTTP pipeline already linked for the typed clients — one auth path, one runtime, one HTTP stack.


~SURFACE

89 FFI exports, surfaced through the flat Azure namespace plus twelve typed sub-packages. The Azure namespace also carries the pure helpers and the version / ping convenience wrappers.

PackagePlaneSurface
Azure::Blobdatals, get, put, head, rm, containers, create_container, delete_container, set_metadata
Azure::Queuedatals, send, receive, delete, clear, count, create, drop, pump
Azure::Cosmosdatadatabases, containers, put, get, delete, query, replace, create_database, create_container, delete_database, delete_container
Azure::Secretsdataget, set, ls, rm, versions, backup + param_get / param_put / param_delete aliases
Azure::Keysdataencrypt, decrypt, ls, get
Azure::Computemgmtls, get, start, stop, deallocate, restart, status, skus
Azure::Containersmgmtgroups, group, clusters, cluster, node_pools
Azure::Storagemgmtls, get, keys
Azure::ResourceGroupsmgmtls, get, create, rm, resources
Azure::ServiceBusmgmt + dataqueues, topics, namespaces, send, receive
Azure::Subscriptionsmgmtls, locations
Azure::Monitormgmtmetrics
Azure helperspureparse_resource_id, resource_id_parent, build_resource_id, parse_connection_string, build_connection_string, redact_connection_string, parse_blob_uri, build_blob_uri, storage_endpoint, parse_storage_endpoint, and the valid_* / normalize_guid / format_guid validators

$WHY OPT-IN (NOT BUILTIN)

The Azure SDK for Rust crates pull in tokio, hyper, rustls, and reqwest, plus a chain of typespec / generated-model support code. The core stryke binary stays slim precisely because each connector ships separately. Daily-driver work — one-liners, awk replacement, data scripting — doesn't need an Azure SDK, a Cosmos driver, or a Key Vault client linked in.


&FFI PROTOCOL

JSON in, JSON out, over a C ABI. Each request is a JSON object of op-specific args. Each response is a JSON object; errors carry an error field with a verbatim message. The C string returned by every export is freed through the shared stryke_free_cstring symbol.

# every export resolves the shared credential, builds a per-call
# service client, and runs on the shared tokio runtime
azure__blob_get('{"container":"data","name":"hello.txt","account":"acme"}')
  -> {"container":"data","name":"hello.txt","body":"hi","content_length":2}

# handler errors are surfaced, never thrown across the ABI
azure__blob_get('{}')  ->  {"error":"missing container"}

/SCOPE

See the README's service map and usage sections for the authoritative scope. The package is intentionally narrower than the underlying SDK — the goal is "useful from a shell pipeline", not "complete API coverage". Cosmos queries are single-partition (an SDK constraint); live, credential-backed round-trips are exercised manually against a real subscription.


#PROJECT METADATA

ItemValue
LicenseMIT
AuthorMenkeTechnologies
Repositorygithub.com/MenkeTechnologies/stryke-azure
Parent languagestrykelang
Meta umbrellaMenkeTechnologiesMeta
Issuesgithub.com/MenkeTechnologies/stryke-azure/issues