Skip to content

feat!: support DIDWW API 2026-10-22 - #68

Merged
Skumring merged 2 commits into
prereleasefrom
feat/next-api-version
Oct 25, 2026
Merged

Skumring merged 2 commits into
prereleasefrom
feat/next-api-version

Conversation

@Skumring

Copy link
Copy Markdown
Contributor

Support for DIDWW API version 2026-10-22. This release of the SDK becomes 5.0.0; applications on API 2026-04-16 stay on 4.x (release-4.1).

This PR targets prerelease, which collects the work for the new API version until it is released. prerelease is merged into main and tagged on the release day of the API.

What changed

  • Authentication. Every request carries Authorization: Bearer <token>. The SDK mints the token from the API key with POST /token on auth.didww.com (sandbox auth-sandbox.didww.com): one token per audience, minted on first use, cached in a TokenStore (one MemoryTokenStore per process by default; implement TokenStore to share tokens between processes). Concurrent callers share one mint. A 401 replaces the token once and retries the request once; a 403 is returned as is; a 429 holds further mints until Retry-After; 5xx answers, connection failures and timeouts are retried with jittered exponential backoff; a TLS failure is raised at once. Api-Key is sent only to the token service, and X-DIDWW-API-Version is no longer sent. DidwwClient.Builder gains apiVersion, scope, tokenStore, logger (java.lang.System.Logger, silent by default), authUrl and the three prices URLs.
  • Prices. voiceInPrices(), voiceOutPrices(), smsOutA2pPrices(), smsOutP2pPrices(), smsOutOtpPrices() and smsInPrices(), on the api-vin, api-vout and api-sms hosts: lookups with filters checked before the request and typed rows (BigDecimal money), and the gzipped price files written unchanged, dated with Last-Modified and fetched with If-Modified-Since; PriceFileReader reads a downloaded file as a Stream of rows.
  • SMS. SmsTrunk (configurations sms_to_email, http_in, http_out, smpp_esme, smpp_smsc, plus GenericSmsTrunkConfiguration), SmsTrunkGroup, SmsTrunkRegenerateCredential, the sms_trunk / sms_trunk_group relationships of Did, sms_in / sms_out exports with their filters, and SenderIdVerification (list, read, and update of the name and the SMS trunk).
  • Other resources. number_type on DID groups, requirements and emergency calling services, DidGroup#getIsDemo(), Identity companyWebsite. DidGroupType and Pop resources are removed; VoiceInTrunk pop is an enum attribute. Read-only relationships are not sent back on update.
  • Errors. The abstract DidwwException is the base of DidwwApiException, DidwwClientException, and the new DidwwAuthException / AuthErrorKind and DidwwPricesException / PricesErrorKind. The SDK's own exceptions and toString() output carry neither the API key nor a token.
  • Hardening. Export downloads stream to the destination, accept only 200, follow no redirects and only reach the origin of the base URL or of the environment; a Path destination is replaced only once the file is complete; uploadEncryptedFile goes through the configured client with the token; error bodies are bounded in size and time; Generic SMS configurations and SmsTrunk mask their values in toString(); the wait after a price file 503 and the token 429 window add a small random delay.
  • Docs. README sections on authentication, logging, SDK design decisions, prices, SMS trunks, exports, error handling and migrating from 4.x; FILTERS.md; new examples.
  • CI. The examples are compiled too.

Compatibility

Breaking:

  • API versions earlier than 2026-10-22, and API keys or service URLs that cannot be used, are rejected by build();
  • HTTP defaults: connect 10 s, read and write 60 s, no call timeout, no redirects, no cookies; the cache and Authenticator of your builder are not used;
  • decimal numbers in untyped maps (ApiResponse#getMeta(), error source/meta, Export#getFilters(), generic attributes) are BigDecimal;
  • export download errors: other statuses throw DidwwApiException, an unwritable destination file throws UncheckedIOException;
  • Pop, DidGroupType, client.pops(), client.didGroupTypes() and the public ApiKeyInterceptor are removed.

No new dependencies.

Checks

./gradlew clean test javadoc compileExamplesJava passes locally on JDK 11 (642 tests).

Authentication
- Every request carries a short-lived bearer token minted from the API key
  with POST /token on the token service of the environment. The API key is
  sent only to the token service; X-DIDWW-API-Version is no longer sent, the
  version is requested in the token.
- One token per audience (api, api-vin, api-vout, api-sms), minted on first
  use and cached in a TokenStore (one MemoryTokenStore per process by
  default); concurrent callers of a client share one mint.
- A 401 re-mints once and retries the request once; a 403 is returned as is.
- Token service errors throw DidwwAuthException with an AuthErrorKind; 429
  opens a Retry-After window, 5xx and timeouts back off with jitter, TLS
  failures are not retried.
- DidwwClient.Builder gains apiVersion, scope, tokenStore, logger
  (java.lang.System.Logger, silent by default), authUrl and the three prices
  URLs.

Prices
- voiceInPrices(), voiceOutPrices(), smsOutA2pPrices(), smsOutP2pPrices(),
  smsOutOtpPrices() and smsInPrices() with lookup(), head(), download(),
  downloadToFile() and fetch(), typed rows with BigDecimal money,
  DidwwPricesException with a PricesErrorKind, and PriceFileReader to read a
  downloaded file. Price files are written gzipped as served.

Resources
- New: SmsTrunk (five configuration types, Generic for unknown ones),
  SmsTrunkGroup, SmsTrunkRegenerateCredential, SenderIdVerification.
- Did: sms_trunk and sms_trunk_group relationships.
- DidGroup, AddressRequirement, EmergencyRequirement, EmergencyCallingService:
  number_type replaces the did_group_type relationship; DidGroup#getIsDemo().
- VoiceInTrunk pop is an enum attribute; Identity company_website; export
  types sms_in and sms_out with their filters.
- Read-only relationships are not sent back on update.
- Removed: Pop and DidGroupType resources.

Behaviour changes
- build() validates the API key, API version (2026-10-22 or later), scope
  and service URLs and throws IllegalArgumentException on invalid values.
- HTTP defaults: connect 10 s, read and write 60 s, no call timeout, no
  redirects, no cookies; the cache and Authenticator of a user builder are
  not used.
- Decimal numbers in untyped maps are read as BigDecimal.
- Export downloads stream to the destination, accept only 200, follow no
  redirects and only reach the origin of the base URL or of the environment;
  a Path destination is replaced only once the file is complete.
  uploadEncryptedFile() goes through the configured client.
- DidwwException is the new base of DidwwApiException, DidwwClientException,
  DidwwAuthException and DidwwPricesException. The SDK's exceptions carry
  neither the API key nor a token.

CI also compiles the examples.
@Skumring Skumring self-assigned this Oct 25, 2026
@Skumring
Skumring requested a balanced review from Copilot October 25, 2026 14:46
@Skumring

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Oct 25, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: a0623700-941b-417d-b23c-1b01004b6dd5

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai

coderabbitai Bot commented Oct 25, 2026 •

Copy link
Copy Markdown
⚠️ Action not completed

Review skipped: 245 files exceed the limit of 100.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

The unresolved moderate gzip-validation issue can silently truncate pricing data and decompressed exports.

1 open issue
What changed in this PR

Migrates the SDK to DIDWW API 2026-10-22 and SDK 5.0.0, introducing breaking authentication and resource-model changes.

Changes:

  • Adds bearer-token authentication, token caching, service URLs, and structured errors.
  • Adds pricing and SMS support; updates DID number types, voice POPs, exports, and identity attributes.
  • Updates fixtures, tests, examples, build settings, and CI example compilation.

Unresolved issue — moderate: src/main/java/com/didww/sdk/internal/MultiMemberGzipInputStream.java:32 silently accepts a truncated header in a later gzip member. This can omit price rows or replace an existing decompressed export with incomplete output, even when the HTTP body is complete. Subsequent member headers must be validated and incomplete headers rejected.

File Description
src/​test/​resources/​fixtures/​voice_in_trunks/​update_sip.json Moves POP into attributes.
src/​test/​resources/​fixtures/​voice_in_trunks/​update_pstn.json Moves POP into attributes.
src/​test/​resources/​fixtures/​voice_in_trunks/​update_clear_pop_request.json Covers explicit POP clearing.
src/​test/​resources/​fixtures/​voice_in_trunks/​index.json Uses enum-valued POP attributes.
src/​test/​resources/​fixtures/​voice_in_trunks/​create.json Updates POP response shape.
src/​test/​resources/​fixtures/​voice_in_trunks/​create_with_pop.json Adds explicit POP response.
src/​test/​resources/​fixtures/​voice_in_trunks/​create_with_pop_request.json Adds explicit POP request.
src/​test/​resources/​fixtures/​voice_in_trunks/​create_sip_with_rerouting.json Updates POP response shape.
src/​test/​resources/​fixtures/​voice_in_trunk_groups/​index.json Updates included trunk POPs.
src/​test/​resources/​fixtures/​voice_in_trunk_groups/​create.json Updates included trunk POPs.
src/​test/​resources/​fixtures/​token/​server_error.json Adds token-service failure response.
src/​test/​resources/​fixtures/​token/​rate_limit_exceeded.json Adds token rate-limit response.
src/​test/​resources/​fixtures/​token/​invalid_scope.json Adds invalid-scope response.
src/​test/​resources/​fixtures/​token/​invalid_client.json Adds authentication rejection response.
src/​test/​resources/​fixtures/​token/​create.json Adds bearer-token grant response.
src/​test/​resources/​fixtures/​token/​create_request.json Adds audience/version request.
src/​test/​resources/​fixtures/​token/​create_request_read_scope.json Adds read-scope request.
src/​test/​resources/​fixtures/​sms_trunks/​update_unknown_configuration_request.json Covers unknown configuration updates.
src/​test/​resources/​fixtures/​sms_trunks/​update_http_out.json Adds HTTP OUT update response.
src/​test/​resources/​fixtures/​sms_trunks/​update_http_out_request.json Omits generated HTTP credentials.
src/​test/​resources/​fixtures/​sms_trunks/​update_http_in.json Adds HTTP IN update response.
src/​test/​resources/​fixtures/​sms_trunks/​update_http_in_request.json Covers partial configuration updates.
src/​test/​resources/​fixtures/​sms_trunks/​update_generic_nulls_request.json Covers explicit configuration nulls.
src/​test/​resources/​fixtures/​sms_trunks/​update_clear_relationships_request.json Covers clearing SMS relationships.
src/​test/​resources/​fixtures/​sms_trunks/​show.json Adds HTTP OUT resource response.
src/​test/​resources/​fixtures/​sms_trunks/​show_with_outgoing_dids.json Adds included outgoing DIDs.
src/​test/​resources/​fixtures/​sms_trunks/​show_unknown_configuration.json Covers unknown types and exact numbers.
src/​test/​resources/​fixtures/​sms_trunks/​show_allow_any_did_as_source.json Covers unrestricted DID sources.
src/​test/​resources/​fixtures/​sms_trunks/​not_found.json Adds missing-trunk error.
src/​test/​resources/​fixtures/​sms_trunks/​delete_error.json Adds in-use deletion error.
src/​test/​resources/​fixtures/​sms_trunks/​create_with_relationships_request.json Adds trunk creation relationships.
src/​test/​resources/​fixtures/​sms_trunks/​create_sms_to_email.json Adds email configuration response.
src/​test/​resources/​fixtures/​sms_trunks/​create_sms_to_email_request.json Adds email configuration request.
src/​test/​resources/​fixtures/​sms_trunks/​create_smpp_smsc.json Adds SMPP SMSC response.
src/​test/​resources/​fixtures/​sms_trunks/​create_smpp_smsc_request.json Adds SMPP SMSC request.
src/​test/​resources/​fixtures/​sms_trunks/​create_smpp_esme.json Adds generated ESME credentials.
src/​test/​resources/​fixtures/​sms_trunks/​create_smpp_esme_request.json Omits generated ESME credentials.
src/​test/​resources/​fixtures/​sms_trunks/​create_http_out.json Adds HTTP OUT creation response.
src/​test/​resources/​fixtures/​sms_trunks/​create_http_out_request.json Adds HTTP OUT creation request.
src/​test/​resources/​fixtures/​sms_trunks/​create_http_in.json Adds HTTP IN creation response.
src/​test/​resources/​fixtures/​sms_trunks/​create_http_in_request.json Adds webhook configuration request.
src/​test/​resources/​fixtures/​sms_trunks/​create_error.json Adds configuration validation error.
src/​test/​resources/​fixtures/​sms_trunks/​create_error_request.json Adds invalid creation request.
src/​test/​resources/​fixtures/​sms_trunk_regenerate_credentials/​create.json Adds credential-rotation response.
src/​test/​resources/​fixtures/​sms_trunk_regenerate_credentials/​create_request.json Adds credential-rotation request.
src/​test/​resources/​fixtures/​sms_trunk_regenerate_credentials/​create_error.json Adds unsupported-rotation error.
src/​test/​resources/​fixtures/​sms_trunk_groups/​update_sms_trunks.json Adds membership update response.
src/​test/​resources/​fixtures/​sms_trunk_groups/​update_sms_trunks_request.json Adds membership replacement request.
src/​test/​resources/​fixtures/​sms_trunk_groups/​update_external_reference_id.json Adds reference update response.
src/​test/​resources/​fixtures/​sms_trunk_groups/​update_external_reference_id_request.json Adds reference update request.
src/​test/​resources/​fixtures/​sms_trunk_groups/​update_clear_sms_trunks_request.json Covers clearing group membership.
src/​test/​resources/​fixtures/​sms_trunk_groups/​not_found.json Adds missing-group error.
src/​test/​resources/​fixtures/​sms_trunk_groups/​index.json Adds group listing response.
src/​test/​resources/​fixtures/​sms_trunk_groups/​delete_error.json Adds in-use group error.
src/​test/​resources/​fixtures/​sms_trunk_groups/​create.json Adds group creation response.
src/​test/​resources/​fixtures/​sms_trunk_groups/​create_request.json Adds group creation request.
src/​test/​resources/​fixtures/​sender_id_verifications/​update_name.json Adds verification update response.
src/​test/​resources/​fixtures/​sender_id_verifications/​update_name_request.json Adds verification rename request.
src/​test/​resources/​fixtures/​sender_id_verifications/​update_closed_error.json Adds closed-verification error.
src/​test/​resources/​fixtures/​sender_id_verifications/​unassign_sms_trunk_request.json Covers trunk unassignment.
src/​test/​resources/​fixtures/​sender_id_verifications/​assign_sms_trunk_request.json Covers trunk assignment.
src/​test/​resources/​fixtures/​prices/​voice_out/​lookup/​200.json Adds outbound voice pricing rows.
src/​test/​resources/​fixtures/​prices/​voice_in/​lookup/​200.json Adds inbound voice pricing rows.
src/​test/​resources/​fixtures/​prices/​sms_out/​lookup/​200.json Adds outbound SMS pricing rows.
src/​test/​resources/​fixtures/​prices/​sms_in/​lookup/​200.json Adds inbound SMS pricing rows.
src/​test/​resources/​fixtures/​prices/​errors/​serving_failure.json Adds unavailable-price-file error.
src/​test/​resources/​fixtures/​prices/​errors/​price_plan_not_assigned.json Adds missing-plan error.
src/​test/​resources/​fixtures/​prices/​errors/​price_not_found.json Adds unmatched-price error.
src/​test/​resources/​fixtures/​prices/​errors/​filter_not_allowed.json Adds rejected-filter error.
src/​test/​resources/​fixtures/​pops/​index.json Removes obsolete POP fixture.
src/​test/​resources/​fixtures/​identities/​update_company_website.json Adds company-website response.
src/​test/​resources/​fixtures/​identities/​update_company_website_request.json Adds company-website request.
src/​test/​resources/​fixtures/​exports/​create_sms_out.json Adds outbound SMS export response.
src/​test/​resources/​fixtures/​exports/​create_sms_out_request.json Adds outbound SMS export filters.
src/​test/​resources/​fixtures/​exports/​create_sms_in.json Adds inbound SMS export response.
src/​test/​resources/​fixtures/​exports/​create_sms_in_request.json Adds inbound SMS export filters.
src/​test/​resources/​fixtures/​emergency_requirements/​show.json Replaces group type with number type.
src/​test/​resources/​fixtures/​emergency_requirements/​index.json Migrates requirement number types.
src/​test/​resources/​fixtures/​emergency_calling_services/​show.json Migrates service number type.
src/​test/​resources/​fixtures/​emergency_calling_services/​index.json Migrates listed service number types.
src/​test/​resources/​fixtures/​dids/​update_unassign_sms_trunk_request.json Covers SMS trunk clearing.
src/​test/​resources/​fixtures/​dids/​update_unassign_sms_trunk_group_request.json Covers SMS group clearing.
src/​test/​resources/​fixtures/​dids/​update_unassign_sms_request.json Covers clearing both SMS routes.
src/​test/​resources/​fixtures/​dids/​update_success.json Adds DID update response.
src/​test/​resources/​fixtures/​dids/​update_assign_sms_trunk_request.json Covers direct SMS routing.
src/​test/​resources/​fixtures/​dids/​update_assign_sms_trunk_group_request.json Covers grouped SMS routing.
src/​test/​resources/​fixtures/​dids/​show_with_address_verification_and_did_group.json Migrates included DID-group attributes.
src/​test/​resources/​fixtures/​did_reservations/​show.json Migrates reserved DID-group attributes.
src/​test/​resources/​fixtures/​did_groups/​show.json Adds number type and demo flag.
src/​test/​resources/​fixtures/​did_groups/​show_with_requirement.json Migrates group and requirement schemas.
src/​test/​resources/​fixtures/​did_groups/​index.json Migrates listed DID groups.
src/​test/​resources/​fixtures/​did_group_types/​show.json Removes obsolete type fixture.
src/​test/​resources/​fixtures/​did_group_types/​index.json Removes obsolete type listing.
src/​test/​resources/​fixtures/​available_dids/​show.json Migrates included DID-group metadata.
src/​test/​resources/​fixtures/​address_requirements/​show.json Replaces group-type relationship.
src/​test/​java/​com/​didww/​sdk/​support/​InterruptingBody.java Adds interrupted-download test helper.
src/​test/​java/​com/​didww/​sdk/​resource/​VoiceInTrunkTest.java Tests enum POP creation and clearing.
src/​test/​java/​com/​didww/​sdk/​resource/​SmsTrunkRegenerateCredentialTest.java Tests credential rotation and errors.
src/​test/​java/​com/​didww/​sdk/​resource/​PublicKeyTest.java Verifies unauthenticated public-key requests.
src/​test/​java/​com/​didww/​sdk/​resource/​PopTest.java Removes obsolete POP tests.
src/​test/​java/​com/​didww/​sdk/​resource/​IdentityTest.java Tests company-website serialization.
src/​test/​java/​com/​didww/​sdk/​resource/​EmergencyRequirementTest.java Verifies requirement number types.
src/​test/​java/​com/​didww/​sdk/​resource/​EmergencyCallingServiceTest.java Verifies service number types.
src/​test/​java/​com/​didww/​sdk/​resource/​DidGroupTypeTest.java Removes obsolete group-type tests.
src/​test/​java/​com/​didww/​sdk/​resource/​DidGroupTest.java Tests number type and demo flag.
src/​test/​java/​com/​didww/​sdk/​resource/​AddressRequirementTest.java Tests replacement number-type attribute.
src/​test/​java/​com/​didww/​sdk/​repository/​RepositoryTest.java Tests bounded error-body reads.
src/​test/​java/​com/​didww/​sdk/​prices/​PriceFileUmaskTest.java Tests downloaded-file permissions.
src/​test/​java/​com/​didww/​sdk/​prices/​HttpDatesTest.java Tests strict HTTP-date handling.
src/​test/​java/​com/​didww/​sdk/​http/​ApiKeyInterceptorTest.java Removes legacy interceptor tests.
src/​test/​java/​com/​didww/​sdk/​auth/​RecordingLogger.java Adds synchronized logging test helper.
src/​test/​java/​com/​didww/​sdk/​auth/​MemoryTokenStoreTest.java Tests token expiry and masking.
src/​main/​java/​com/​didww/​sdk/​resource/​VoiceInTrunk.java Converts POP relationship to attribute.
src/​main/​java/​com/​didww/​sdk/​resource/​SmsTrunkRegenerateCredential.java Adds credential-rotation resource.
src/​main/​java/​com/​didww/​sdk/​resource/​SmsTrunkGroup.java Adds SMS group resource.
src/​main/​java/​com/​didww/​sdk/​resource/​smstrunkconfiguration/​SmsTrunkConfiguration.java Defines SMS configuration base type.
src/​main/​java/​com/​didww/​sdk/​resource/​smstrunkconfiguration/​SmsToEmailConfiguration.java Adds email delivery configuration.
src/​main/​java/​com/​didww/​sdk/​resource/​smstrunkconfiguration/​SmppSmscConfiguration.java Adds customer SMSC configuration.
src/​main/​java/​com/​didww/​sdk/​resource/​smstrunkconfiguration/​SmppEsmeConfiguration.java Adds ESME configuration and credentials.
src/​main/​java/​com/​didww/​sdk/​resource/​smstrunkconfiguration/​package-info.java Documents update and null semantics.
src/​main/​java/​com/​didww/​sdk/​resource/​smstrunkconfiguration/​HttpOutConfiguration.java Adds outbound HTTP configuration.
src/​main/​java/​com/​didww/​sdk/​resource/​smstrunkconfiguration/​HttpInConfiguration.java Adds inbound webhook configuration.
src/​main/​java/​com/​didww/​sdk/​resource/​smstrunkconfiguration/​GenericSmsTrunkConfiguration.java Preserves arbitrary configuration attributes.
src/​main/​java/​com/​didww/​sdk/​resource/​Pop.java Removes legacy POP resource.
src/​main/​java/​com/​didww/​sdk/​resource/​Identity.java Adds company-website attribute.
src/​main/​java/​com/​didww/​sdk/​resource/​Export.java Documents expanded export filters.
src/​main/​java/​com/​didww/​sdk/​resource/​enums/​SmsServerLocation.java Defines SMPP server locations.
src/​main/​java/​com/​didww/​sdk/​resource/​enums/​SmsHttpMethod.java Defines webhook HTTP methods.
src/​main/​java/​com/​didww/​sdk/​resource/​enums/​SmsBodyType.java Defines webhook body encodings.
src/​main/​java/​com/​didww/​sdk/​resource/​enums/​SenderType.java Defines sender categories.
src/​main/​java/​com/​didww/​sdk/​resource/​enums/​SenderIdVerificationStatus.java Defines verification lifecycle states.
src/​main/​java/​com/​didww/​sdk/​resource/​enums/​Pop.java Defines POP attribute values.
src/​main/​java/​com/​didww/​sdk/​resource/​enums/​NumberType.java Defines replacement number types.
src/​main/​java/​com/​didww/​sdk/​resource/​enums/​ExportType.java Adds SMS export types.
src/​main/​java/​com/​didww/​sdk/​resource/​enums/​ExportTrunkType.java Defines inbound SMS export filters.
src/​main/​java/​com/​didww/​sdk/​resource/​EmergencyRequirement.java Replaces group type with number type.
src/​main/​java/​com/​didww/​sdk/​resource/​EmergencyCallingService.java Adds read-only number type.
src/​main/​java/​com/​didww/​sdk/​resource/​DidGroupType.java Removes obsolete resource type.
src/​main/​java/​com/​didww/​sdk/​resource/​DidGroup.java Adds number type and demo flag.
src/​main/​java/​com/​didww/​sdk/​resource/​Did.java Adds mutually exclusive SMS routes.
src/​main/​java/​com/​didww/​sdk/​resource/​AddressRequirement.java Replaces group-type relationship.
src/​main/​java/​com/​didww/​sdk/​repository/​ReadOnlyRepository.java Bounds error-body size and duration.
src/​main/​java/​com/​didww/​sdk/​prices/​VoiceOutPriceCategory.java Defines outbound voice price categories.
src/​main/​java/​com/​didww/​sdk/​prices/​VoiceOutPrice.java Models outbound voice pricing.
src/​main/​java/​com/​didww/​sdk/​prices/​VoiceInPrice.java Models inbound voice pricing.
src/​main/​java/​com/​didww/​sdk/​prices/​SmsOutPrice.java Models outbound SMS pricing.
src/​main/​java/​com/​didww/​sdk/​prices/​SmsInPrice.java Models inbound SMS pricing.
src/​main/​java/​com/​didww/​sdk/​prices/​PriceLookup.java Wraps typed lookup results.
src/​main/​java/​com/​didww/​sdk/​prices/​PriceFile.java Exposes downloaded-file metadata.
src/​main/​java/​com/​didww/​sdk/​prices/​HttpDates.java Formats and parses IMF-fixdate.
src/​main/​java/​com/​didww/​sdk/​internal/​Urls.java Adds service-URL and origin helpers.
src/​main/​java/​com/​didww/​sdk/​internal/​Streams.java Separates read and write failures.
src/​main/​java/​com/​didww/​sdk/​internal/​Sleeper.java Abstracts retry waiting.
src/​main/​java/​com/​didww/​sdk/​internal/​ProbingInputStream.java Probes for later gzip members.
src/​main/​java/​com/​didww/​sdk/​internal/​MultiMemberGzipInputStream.java Adds multi-member gzip handling; truncated-header issue remains.
src/​main/​java/​com/​didww/​sdk/​internal/​Jitter.java Adds randomized retry delays.
src/​main/​java/​com/​didww/​sdk/​internal/​Hex.java Adds hexadecimal and digest helpers.
src/​main/​java/​com/​didww/​sdk/​internal/​Bodies.java Adds bounded response-body reads.
src/​main/​java/​com/​didww/​sdk/​http/​ApiKeyInterceptor.java Removes legacy authentication interceptor.
src/​main/​java/​com/​didww/​sdk/​exception/​PricesErrorKind.java Classifies pricing failures.
src/​main/​java/​com/​didww/​sdk/​exception/​DidwwException.java Introduces common exception base.
src/​main/​java/​com/​didww/​sdk/​exception/​DidwwClientException.java Adopts common exception base.
src/​main/​java/​com/​didww/​sdk/​exception/​DidwwAuthException.java Exposes token-service failure details.
src/​main/​java/​com/​didww/​sdk/​exception/​DidwwApiException.java Adopts common exception base.
src/​main/​java/​com/​didww/​sdk/​exception/​AuthErrorKind.java Classifies authentication failures.
src/​main/​java/​com/​didww/​sdk/​DidwwEnvironment.java Adds authentication and pricing URLs.
src/​main/​java/​com/​didww/​sdk/​DidwwCredentials.java Masks API keys in string output.
src/​main/​java/​com/​didww/​sdk/​converter/​SmsTrunkConfigurationSerializer.java Serializes configurations and omits generated credentials.
src/​main/​java/​com/​didww/​sdk/​converter/​SmsTrunkConfigurationDeserializer.java Dispatches known and generic configurations.
src/​main/​java/​com/​didww/​sdk/​converter/​DidwwResourceConverter.java Registers resources and preserves decimals.
src/​main/​java/​com/​didww/​sdk/​auth/​TokenStore.java Defines concurrent token-cache contract.
src/​main/​java/​com/​didww/​sdk/​auth/​MemoryTokenStore.java Adds expiring in-memory token storage.
src/​main/​java/​com/​didww/​sdk/​auth/​DidwwScope.java Defines read and full scopes.
src/​main/​java/​com/​didww/​sdk/​auth/​BearerTokenInterceptor.java Adds audience authentication and 401 retry.
src/​main/​java/​com/​didww/​sdk/​auth/​Audience.java Defines service authentication audiences.
examples/​src/​main/​java/​com/​didww/​examples/​ExportsExample.java Calculates export bounds in UTC.
examples/​src/​main/​java/​com/​didww/​examples/​EnumWire.java Converts enums to filter wire values.
examples/​src/​main/​java/​com/​didww/​examples/​EmergencyRequirementValidationsExample.java Removes obsolete relationship include.
examples/​src/​main/​java/​com/​didww/​examples/​EmergencyRequirementsExample.java Demonstrates number-type filtering.
examples/​src/​main/​java/​com/​didww/​examples/​EmergencyCallingServicesExample.java Displays replacement number type.
examples/​src/​main/​java/​com/​didww/​examples/​DidGroupsExample.java Displays number type and demo flag.
build.gradle.kts Sets version 5.0.0 and UTF-8 encoding.
.github/​workflows/​ci.yml Adds example compilation to CI.

Review effort: Balanced

- MultiMemberGzipInputStream raises an EOFException (ZipException for a
  corrupt header) when the data after the last member starts another gzip
  member that is cut short; other trailing data is still ignored. Covers
  PriceFileReader and downloadAndDecompressExport.
- The SMS export example reads the export in memory instead of a temp file.
- Long methods split into helpers, repeated literals as constants,
  ProbingInputStream overrides read(byte[], int, int), the errors of
  DidwwApiException and DidwwPricesException are transient.
@sonarqubecloud

Copy link
Copy Markdown

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

The breaking API migration and security-sensitive authentication changes require final human review; tests were not executed during review.

No open issues 🎉

1 resolved since last review

Review effort: Balanced

@Skumring
Skumring merged commit 60a6eb4 into prerelease Oct 25, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants