atproto_core 2.2.0
atproto_core: ^2.2.0 copied to clipboard
Core library for clients and tools. This package is mainly used by https://atprotodart.com packages.
Release Note #
2.2.0 #
- feat: added
computeRecordCid, which returns the CID a PDS will assign to a record by canonically DAG-CBOR-encoding it and hashing to a CIDv1. This lets a caller reference a record before it is written — for example to chain reply references across records submitted in onecom.atproto.repo.applyWritesbatch. - chore: widen
at_primitivesto^1.2.0,multiformatsto^1.3.0, andxrpcto^1.1.3.
2.1.0 #
- feat: added
ServiceContext.onSessionUpdated, a broadcast stream that emits the refreshedSessioneach time an expired access token is renewed.sessionalready reflected the new credentials, but nothing told the caller to read it back — and because refresh tokens are single-use, a caller that kept persisting the session it originally passed in stored a spent refresh token, so the next run restored a session that could no longer be refreshed. MirrorsOAuthSessionManager.onSessionUpdatedfor the legacy (app-password) path; it stays silent on OAuth-backed contexts. Concurrent requests that share one deduplicated refresh emit exactly one event.
2.0.1 #
- docs: rewrite the README to document the actual public API —
Session/OAuthSession, JWT decoding (decodeJwt/Jwt), the pluggable retry engine (RetryStrategy,RetryConfig,RetryContext,RetryReason,RetryEvent,Jitter),BaseHttpService/ServiceContext,Blob/BlobRef,decodeCar,isValidAppPassword, and thexrpc/multiformats/cborre-exports — and frame the package as the shared core layeratproto/blueskybuild on. - docs: replace the placeholder
example/example.mdwith a runnableexample/example.dartcoveringRetryConfig/customRetryStrategy, JWT decoding,Blobserialization, and app-password validation. - chore: bump
xrpcto^1.1.2,at_primitivesto^1.1.1, andatproto_oauthto^0.5.1.
2.0.0 #
- feat!: OAuth requests are now driven by
OAuthSessionManager;ServiceContexttakesoAuthSessionManagerinstead ofoAuthSession, enabling transparent OAuth token auto-refresh. OAuth tokens are never JWT-decoded.restoreOAuthSession/OauthSessionExtensionremoved (opaque tokens). Legacy password-authSessionis unaffected. - fix: OAuth requests target the session's PDS even when the
OAuthSessionManagerrestores its session lazily — previously every request defaulted tobsky.social, causing spurious 401s. - fix: a caller-supplied
Authorizationheader (e.g. a service-auth Bearer token) is preserved instead of being overwritten by the session/DPoP token, fixing service-auth flows such as video upload. - fix: concurrent expired requests now share a single legacy-session refresh instead of issuing a refresh stampede.
- feat:
stream()accepts aserviceoverride and achannelFactory, and honors the configured protocol; theuse_dpop_nonceretry awaits the nonce write before retrying. - fix: a failing user-supplied DPoP nonce-cache write on the request success path is now contained instead of escaping as an uncaught asynchronous error, so a storage failure in
DPoPNonceCache.setcan no longer crash the app. - fix: the rate-limit retry wait now parses the HTTP-date form of
Retry-After(previously only delta-seconds was honored; a date silently degraded to plain backoff and could retry too early). - perf:
ServiceContext.servicecaches the resolved PDS endpoint per access JWT instead of base64/JSON-decoding the access token on every request when the did document has no#atproto_pdsservice. - feat: retries are now driven by a pluggable
RetryStrategy(FutureOr<Duration?> nextDelay(RetryContext)).RetryContextexposes the attempt count, failureRetryReason, request kind (query vs procedure), NSID, status code, and the server-providedRetry-After. ImplementRetryStrategyfor full control over backoff and which failures retry; the defaultRetryConfignow implements it. - fix: by default a procedure (
POST) is no longer retried after an ambiguous failure the server may already have applied (a timeout after the request was sent, a5xx, or an inconclusive connection reset), preventing duplicate writes. Queries (GET) and subscriptions still retry as before, and429/pre-connection network failures still retry for procedures. SetRetryConfig(retryProcedureOnAmbiguousFailure: true)to restore the previous unconditional behavior.
1.3.0 #
- feat: automatic access-token refresh —
Challengenow retries once after refreshing on a genuine401, with a pre-emptive refresh when the token is within 30s of expiry (theuse_dpop_noncepath is unchanged). - fix:
Challengenow retries429(respectingratelimit-reset/Retry-After),SocketException, andClientException, and preserves theXRPCResponse<T>type — previously onlyTimeoutExceptionand500were retried and the type was erased. - fix:
car_decoderhandles variable-length multihash CIDs and raises a typedCarExceptionon truncated input; tag-42 CID links are normalized to{$link: <cid>}so downstream keeps type info, and the triplejsonEncode/jsonDecoderound-trip is gone. - fix:
decodeCarnow normalizes plain (non-tagged) CBOR byte strings to{$bytes: <base64>}(standard base64, RFC 4648 section 4, no padding) per the atproto data model, instead of returning rawUint8List. - fix:
atprotoPdsEndpointkeeps an explicit port, falls back to the JWTaudwhen the did document has no#atproto_pds, and guards malformed did documents. - fix: caller-supplied headers can no longer override
Authorization/DPoP;dpop-noncelookup is case-insensitive. - fix: empty
$unknownmaps are stripped from the wire JSON. - fix: unify on the validating
NsidConverter; the non-validatingNSIDConverteralias is deprecated. - chore: bump
xrpcto^1.1.0,at_primitivesto^1.1.0,multiformatsto^1.1.0, andatproto_oauthto^0.4.0.
1.2.2 #
- fix: redact
accessJwt/refreshJwtinSession.toString()so credentials are not leaked through logs or crash reporters. - fix: forward the
headersargument inBaseHttpService.post(previously dropped). - fix: retry jitter is now inclusive
[min, max]and no longer throws aRangeErrorwhenmaxInSecondsis0. - chore: bump
atproto_oauthandmultiformats.
1.2.1 #
- chore: bump atproto_oauth.
1.1.0 #
- Add optional $service parameter to video service methods (getJobStatus, getUploadLimits, uploadVideo).
- Export nanoid and @Protected annotation from atproto_core/internals.dart.
1.0.7 #
- MIGRATION: Updated to use the consolidated
at_primitivespackage for all primitive AT Protocol types. - IMPROVEMENT: Simplified dependency management by adopting unified primitive types from
at_primitives.
1.0.6 #
- fix: Drop
universal_iofor WASM compatibility.
1.0.5 #
- chore: fix
WARNING: The annotation 'JsonSerializable.new' can only be used on classes..
1.0.4 #
- chore: optimized structures.
1.0.3 #
- chore: Removed outdated processes.
1.0.2 #
- Fix SDK constraint to '">=3.8.0 <4.0.0"'.
1.0.1 #
- chore: optimized docs.
0.11.2 #
- Bump
xrpc.
0.11.1 #
- Retry if a DPoP nonce error occurs during the execution of
OAuthClient.refresh. - Add
restoreOAuthSessionfunction.
0.11.0 #
- Expose
atproto_oauthpackage. - Add
.oAuthSessionparameter onServiceContext. - Rename
AuthTokentoJwt.- Change type of
scopefrom enum toString - Rename
subjecttosub - Rename
expiresAttoexp - Rename
issuedAttoiat
- Change type of
- Rename extended getters on
Session- From
accessTokentoaccessTokenJwt - From
refreshTokentorefreshTokenJwt
- From
0.10.5 #
- Expose
NsidConverter. - Add
clientparameter for.getand.postonServiceContext.
0.10.4 #
- Expose
.atprotoPdsEndpointfrom as an extension ofSession. You can get specific pds endpoint based on did document.
0.10.3 #
- Change the type
.collectionproperty fromStringtoNSIDonAtUri. You need to do.collection.toString()when you want a string of collection. (#1551)
0.10.2 #
- The
serviceis automatically resolved from the DID Document of the givenSession. (#1543)- If no authentication is performed and no
Sessionis passed, the defaultbsky.socialis used. - If the user passes a specific
service, it always respects the value of the user'sservice. - If something wrong happens for some reason, it uses
bsky.socialas default.
- If no authentication is performed and no
0.10.1 #
- Fixed a bug that prevented toJson on freezed objects.
0.10.0 #
- Add
.activeand.statusproperties onSessionobject. (#1516) - Move
BlobConverter,Blob,BlobReffromatprotopackage toatproto_core.
0.9.10 #
- Don't include Auth headers in
.headers.
0.9.9 #
- Add
appPassPrivilegedonAuthScope. (#1501) - Add
.headersproperty. Returns the merged headers with global headers and auth header.
0.9.8 #
0.9.4 #
- Improved redundant error messages. Now it shows like
GET https://bsky.social/xrpc/com.atproto.identity.resolveHandle 400 Error: Params must have the property "handle". (#1253) - Exposed
.serviceand.relayServiceproperties onServiceContext. (#1254) - Added
parametersarg and you can pass bytes tobodyarg on.postmethod. (#1252) - BugFix: Made sure to check if the subscribeRepos blocks can be decoded. (#1239)
0.8.1 #
- Upgraded
xrpc.
0.8.0 #
0.7.0 #
- Removed
AuthTypeandClientResolver. Let the server handle whether authentication is required or not. (#1102)
0.6.1 #
- Added
BaseHttpService.post. (#999) - Fixed a bug that service names were not specified correctly when using stream endpoints.
0.5.8 #
- Upgraded
xrpcpackage.
0.5.6 #
- Upgraded
xrpcpackage. Fixed field names for rate limit.
0.5.4 #
- Added
.accessTokenand.refreshTokenproperties onSessionobject. You can get decoded token objects based on JWT tokens. Also you can decode JWT token withdecodeJwtfunction. (#787)
0.5.2 #
- Moved
Sessionobject andcreateSessionfunction fromatproto. And exposedrefreshSessionas a function. (#686)
0.5.0 #
- Drop support for null unsafe Dart, bump SDK constraint to '^3.0.0'. (#599)
- Dart3 modifier applied.
0.4.6 #
0.4.3 #
- Fixed parameter type of
uploadandsubscribeinBaseServicefromNSIDtoString.
0.4.1 #
- Fixed to throw
UnsupportedErrorwhen an anonymous user tries to access an endpoint that requires authentication. (#564)
0.4.0 #
0.3.5 #
- Added
adaptorparameter ingetandsubscribe, and removeddecoderandconverter. (#495) - Added
progress_status.dart.
0.3.4 #
- Improved generation of
CIDhash codes, allowing CID objects to be specified as keys for Maps, etc. (#490)
0.3.3 #
- Fixed
subscribeRepoUpdates.
0.2.10 #
- The retry algorithm has been modified to retry when an InternalServerError occurs as a result of XRPC communication. (#358)
0.1.0 #
- Added core objects. (#70)
BaseServiceEmptyATProtoResponseATProtoRequestATProtoExceptionForbiddenException
0.0.2 #
- Exposed
client_context.dart.
0.0.1 #
- First Release!