-
REST (BREAKING):
RestErrornow carries the full requesturl(including the query string) alongside the existingpath, so a caller can see the exact endpoint that failed. TheRestErrorconstructor gained aurlparameter (RestError(statusCode, method, path, url, responseBody)) and agetUrl()accessor; the error message now prints the full url instead of the bare path. Callers constructingRestErrordirectly must pass the url. This mirrors the reference decision that an error envelope carries the full url, not a path. -
REST:
RestErrornow captures the failing response's headers and exposesgetHeaders()+getRequestId()(the platform request id fromx-request-id/x-signalwire-request-id/request-id/x-amzn-requestid, case-insensitive), appended to the error message — client-side observability with no wire change, so a caller can correlate a failure against SignalWire's own request id. Transport errors carry empty headers / no request id. -
REST: transport-level failures (connection refused, DNS failure, reset, TLS error) that never reach an HTTP response are now wrapped in the typed
SignalWireRestTransportError(aRestErrorsubclass) instead of leaking a bareIOException. A singlecatch (RestError)now handles both an HTTP-error response and a transport failure;getStatusCode()returns0(the port's sentinel for "no HTTP status") and the underlying transport exception is preserved as the cause. Mirrors the referenceSignalWireRestTransportError. -
RELAY (fix): a
java.net.http.HttpClient.send()InterruptedExceptionin the REST layer now restores the thread interrupt status before rethrowing, instead of swallowing the cancellation. -
RELAY (fix):
Action.waitForCompletion()(and its timeout overload) no longer swallow anInterruptedException— the thread's interrupt status is re-asserted so a cancelled wait propagates up the stack. -
RELAY:
RelayClientnow honors theRELAY_MAX_ACTIVE_CALLSenv var and amaxActiveCalls(int)builder option — inbound calls past the cap are logged and dropped, matching the referenceClient(max_active_calls=...). -
REST: added the
Messagesresource (client.messages()) — send and redact messages over/api/messaging/messages(create→ POST,update→ PATCH/{message_id}for redaction), with generated typed request shapes (builder +extrasdoor) and wire tests covering each route (success and error) against the shared mock. Distinct from the message logs namespace (client.logs().messages()). -
REST: added the
Projectsresource (client.projects()) — full CRUD over/api/projects(list/get/create/update/delete) plusrotateSigningKey, with generated typed request/response shapes and wire tests covering each route (success and error) against the shared mock. Distinct from the singularprojecttoken namespace (client.project()). -
REST: the client's resource surface is now fully generated from the shared SignalWire OpenAPI specs, replacing the hand-written resource classes — every resource, route, and typed request/response shape derives from the canonical wire spec, with generated wire tests covering each route (success and error) against the shared mock.
-
REST:
list()on paginated resources wires the paginator into an iterator-protocol paginator so callers can page through all results (followslinks.next). -
REST errors carry the full
(status, body, url, method)envelope and are raised on any>= 400response. -
Wave-1/2/3 hardening: error-envelope, pagination-wired, and dead-public-error parity gates; documentation-truth gates (env-var coverage, numeric-count claims, accessor references); and package/release-readiness gates (SemVer floor, ignore-ledger strict, publish-gated-on-CI, metadata consistency).