Repository navigation
v2.0.0
connect-library 2.0.0, attachment-receiver 2.0.0
Major version: API failures now arrive as one typed, value-free exception, the session validates every login against /v1/me and renews in both credential modes, the V2 direct-delivery attachment client ships, and the attachment-receiver module is published for the first time. Runtime unchanged from 1.0.0: Spring Boot 4.1, Jackson 3, JDK 21.
Breaking changes for consumers
ConnectApiExceptionreplaces Spring's exceptions. Every failure the API answers, and every transport failure, is thrown ascom.tsanet.api.ConnectApiException(unchecked, not aRestClientException).kind()isPROBLEM(an RFC 7807 body; the library sendsAccept: application/json, application/problem+jsonon every call),LEGACY(the API's{"message"}body, classified by content),CONNECTIVITY(unreachable;detail()names only the failure's class) orOTHER.status()is the status the API asserted (a problem body's own status when present).type(),title(),detail(),instance()andisProblem("case-update-error")replace body parsing. The message is value-free by construction: never the URL, a header or a token. Acatch (HttpClientErrorException | RestClientResponseException | ResourceAccessException)around library calls compiles and no longer matches; sweep for it. The generated client's own retry loop, which caughtHttpServerErrorException, is inert for the same reason; retries belong in the caller that knows the operation is idempotent.- Interface additions.
TsaNetApiSessiongainedattachmentsV2();AuthFacadegainedcurrentUserContext(). Implementers and decorators must add them; callers are unaffected. - Login semantics. Every successful
authenticate()orlogin()now ends with a/v1/mecall; if it fails, the login fails and the session stays logged out (an unattendedauthenticate()retries connectivity failures three times, under a second). Password sessions with configured credentials trackexpiresInand renew transparently, before expiry and once after a 401; a password typed intologin(username, password)is never retained, so that session is not renewed and its next call after expiry fails with a classified 401. attachment-receiveris published at this version from this release on (see below). Its four adapter dependencies are required, not optional: about 170 runtime artifacts across the AWS, Azure and Google Cloud SDKs.- The always-test
createRequestshims are removed. The four-argument and five-argument overloads that silently passedtestSubmission=true, deprecatedforRemovalsince 0.1.0, are gone; both forms take the explicit per-call flag. A caller that passed no flag fails at compile; a consumer that bumps the version without recompiling fails at the call withNoSuchMethodError, since removing adefaultinterface method breaks binary compatibility too. (TheCollaborationRequestStatusDtocompatibility constructor from beforetestCaseexisted stays, deprecated, with 3.0.0 as its removal target.)
New
- V2 direct-delivery attachment client (
session.attachmentsV2(), #77):grant,upload,complete,abandonand a one-callsend. Executes the grant's upload plan verbatim (single, multipart, resumable, relay), streaming from disk one part at a time with exact content lengths; bounded per-part retries; relay retries connect failures only. The outcome is the platform's recorded status (DELIVERED,DELIVERED_UNVERIFIED,FAILED,EXPIRED), never the client's own evidence. Built against the draft grant/complete contract intsanetgit/Connect-API-Code#147; the platform endpoint is not live yet, and the hand-written request and result types will be replaced by generated ones when the contract lands in the spec. Member-facing walkthrough:docs/attachments-v2-client.md. The demo has a "Deliver directly (V2)" action with live progress; the console hasdeliver-attachment. - Connection hardening (#78, #80): the exception above;
AuthFacade.currentUserContext(); renewal in both modes with concurrent callers sharing one renewal; an atomic session store; a 2xx whose body fails mid-read classified as connectivity instead of surfacing a URL-bearing exception;ConnectApiBaseUrl.requireHttps(baseUrl, allowInsecure, baseUrlSetting, optOutSetting), a pure helper the console, the scripted demo and the demo-ui call at startup (the library's own paths never do). - Apps refuse plain http at startup. The console and scripted demo (
tsanet.api.allow-insecure-http) and the demo-ui (tsanet.demo.allow-insecure-http) ship https defaults and refuse a plain-http base URL unless opted in for a local mock. - attachment-receiver: Azure Blob Storage adapter, container-scoped, alongside Azure Files (#72, #74); GCS adapter and the concrete
RegisteringStorageFactory(#68); the ambiguous-finish case (upload completed on the store, confirmation lost) resolved by attempt identity, not size, in S3 and GCS (#75); the go-live verifier validates read and write on every backend. The stalehttpclient5override is gone; the Boot 4 parent's 5.6.x satisfies the AWS SDK's 5.4 floor, and the factory test that constructs a realS3Clientproves it.
Unchanged
CacheRetention.sweep()and the storage schema. Webhook signature verification. The OAuth client-credentials flow. Every V1 facade signature apart from the two additions above.- Runtime line: Spring Boot 4.1.1, Jackson 3, JDK 21. Consumers on Jackson 2 stay on 0.2.0.
Consuming the artifacts
com.tsanet:connect-library:2.0.0 and com.tsanet:attachment-receiver:2.0.0 from https://maven.pkg.github.com/tsanetgit/Connect_SDK (a read:packages token is required even for public packages). The receiver is a plain library jar with no main class; its intended consumer is the gateway's attachments-only profile (tsanetgit/Connect_Gateway#35). It does not depend on connect-library.
Known consumers
tsanetgit/Connect_Gateway(gateway-engine): on 2.0.0 since 2026-09-08 (tsanetgit/Connect_Gateway#37, merged as PR #39). Its engine runs the generated APIs on its own HTTP client, so operation errors still arrive as Spring's types there; the migration classified a failed login (the one path that now throwsConnectApiException) and moved that login outside the operation's wall-clock budget.tsanetgit/Fin-Intercom_Appconsumesgateway-engine, not the library directly; it follows the gateway's migration. Its own SDK-facing code (SdkCacheRetentionSweep) is unaffected.
Verification
Whole reactor at 3fd5f0e, then connect-library again at d667ab9 after the shim removal (181 tests, one fewer by design), and the cut itself at 42bd3a5 (docs only): connect-library 182 then 181 tests, attachment-receiver 182 (40 environment-gated live tests skipped in CI; the S3 and Azure Blob adapters were proven live during their PRs), demo-ui 19, console 37, scripted demo 8, zero failures. Every PR in this release (#68, #70, #72, #74, #75, #77, #78, #80, #83, #84) carried an independent separate-session QA review before merge, each round dispositioned on the PR. Not live-verified: the V2 client end to end (no platform endpoint yet) and the GCS adapter (no credentials; env-gated mirror test ready).