at_client 4.0.0
at_client: ^4.0.0 copied to clipboard
The at_client library is the non-platform specific Client SDK which provides the essential methods for building an app using the atProtocol.
4.0.0 #
- feat: the first release with post-quantum cryptography, chosen by
AtClientPreference.posture(PqPosture.pqReadyorpqActive): ML-DSA-65 signing, X-Wing and ML-KEM-1024 key establishment, per-namespace keys, a signing root, secret conveyance between an atSign's enrollments, and key rotation. The default posture is stillPqPosture.legacy, which runs none of it unless a keyfile's own post-quantum key material raises the client to its floor. - feat: a client never runs below its posture floor: a keyfile holding a
namespace key's private sets
pqReady, and an ML-DSA-65 data signing key setspqActive; a client configured lower logs a warning and is raised to the floor, on its own copy of the preference, whichgetPreferences()andsetPreferences()reach. A raised client seeds no namespace keys and mints no signing root that its configured posture would not. - feat:
NotificationService.droppedEventsreports each notification a client gives up on, such as one it cannot decrypt, with the reason it logs at warning. A client whose posture reads no post-quantum data says so when it drops one sealed post-quantum, that it is lost, and to configurepqReadyor above for later ones. - feat:
sealToNamespacewith nocryptoProviderIdseals with the namespace-key provider, so apqReadyprogram no longer names it; a client whose config lacks it, as atPqPosture.legacy, is refused with an error naming its posture or config. - feat: when
create's own copy is written and a recipient's is not, itsCollectionOpException<T>carries the item written asitem, so the share is retried withupdateSharedWith(e.item!, ...)rather than a secondcreate. - fix: a collection item keeps its own copy of the recipient set it is given,
so a share that fails leaves the app's set as it was, and
updateSharedWith(item, item.sharedWith)no longer empties the item's set. - feat:
Atsign.openrefuses keys a denial, a cancel or an expiry left with no credential at once, withAtNoCredentialExceptionsaying to enroll again, rather than failing a minute later as unreachable. - feat: a second process opening a Hive store another process holds is
refused with
AtStorageInUseExceptionnaming the store's location, rather than with Hive's raw lock failure. - fix: a collection record this device cannot read yet fails
getItems()with aCItemReadExceptionnaming the record and the error its read failed with, rather than a string;getItemsAsStream()with anonErrorhandler lists the rest. - note: an envelope's signature is verified with the strongest algorithm the
envelope and its signer's
_apskboth carry, against the key the signature names, and a key the_apsklists asretiredstill verifies, so what an enrollment signed before a rotation stays valid. A later release re-signs what an enrollment publishes under its active key, and then withdraws the retired one. - fix: a client whose data signing set names only algorithms weaker than a
client data signing key its enrollment holds keeps signing with that key
and mints no weaker one, so its keyfile and
_apskstay as they were. - feat: a namespace key's private is conveyed, before the key is published, to every enrollment listed for its namespace that has a key package. An enrollment the conveyance misses first looks for an envelope addressed to it, then asks the others.
- fix: a device that re-enrolled itself after a namespace key was rotated reads what its atSign wrote before the rotation, once an enrollment still holding the older key is online to answer its ask.
- feat:
PendingEnrollment.cancel()ends the waitclientorawaitApprovalis in, which throwsAtEnrollmentCancelledExceptiononce the enrollment's pending keys are removed;cancel()throws when the key store cannot remove them, and a later call tries again. The request stays on the atServer until the atSign's manager decides it. A cancelled request cannot be resumed, even from the copy a file store keeps beside its keyfile; enroll again. - feat:
PendingEnrollment.stop()ends the wait and keeps the request, whichAtsign.resumeEnrollmentpicks up again, with no app or device when the store holds one pending enrollment. A request that expires has its pending keys removed, as a denied one does, andPendingEnrollment.approvedsays whether an approval reached the key store before a stop or cancel. Oncestop()orcancel()returns, the atSign can be opened again at once on an approval that landed just before. - fix: a write that needs a fresh content key no longer waits for the client's cleanup of unused ones, which held it up while the atServer was slow or unreachable.
- feat:
PqPosture.copyWithbuilds a posture from a named stage, changing only the axes given:PqPosture.pqActive.copyWith(disallowLegacyEncryption: false)writes post-quantum and still allows legacy encryption. - feat:
AtKeysFormatExceptioncomes through at_client, so an app tells a keyfile that is not a JSON object by itsreasonandpositionwithout importing at_auth. - docs: Upgrading to at_client 4.0 takes an app from at_client 3 to 4.
- breaking:
LocalSecondary.atChopsKeysis removed; a client signs with the keys it is given. - breaking:
AtClient.notify,notifyChange,notifyAllandstartMonitorare removed; send throughnotificationService, onenotifyper recipient.startCompactionJobandstopCompactionJob, which did nothing, are removed too. - breaking:
NotificationParams.forTextandNotificationParams.messageTypeare removed: every notification is a key notification, the kind atServers accept. - breaking:
NotificationService.sendrequiresidAndNamespace; itsnamespace:spelling is removed. - breaking:
AtClientManager.syncServiceandnotificationServiceare removed; use the client's own,client.syncServiceandclient.notificationService. - breaking:
SyncService.synctakes noonDone, andsetOnDoneis removed; aSyncProgressListenerhears how each sync went. - breaking:
SyncService.synctakes noonError, andSyncRequesthas noonError; aSyncProgressListenerhears each sync that fails. - fix: a
sync()called while a sync is running runs once that one ends, so a write made meanwhile no longer waits for the next periodic sync. - breaking:
AtServiceFactory.atClientis removed, and the factory'snotificationServiceandsyncServicetake only the client.AtClientImpl.createandSyncServiceImpl.createtake noatClientManager. - breaking:
AtClientPreference.syncStrategyandSyncStrategy, which nothing read, are removed. - breaking:
AtClientManager.secondaryAddressFinderandsetSecondaryAddressFinderare removed; a client asks only thesecondaryAddressFinderit is built with. - breaking:
Atsign.enrollrefuses anrsa2048request under the pq key exchange before sending it, and aPqPosturerefusesrsa2048authentication with the pq key exchange, or seeding namespace keys without it. Each refusal names both settings. - fix: a collection's items are the records its atSign writes and the shares addressed to it; a public record in its namespace is never one.
- fix: a collection item whose own copy cannot be written is not shared
either, so no recipient holds an item its owner cannot list; the
CollectionOpExceptionlists each recipient's copy asOpNotAttempted. - fix: at
pqActive, a collection in a dotted namespace such astodos.demoswrites and shares its records. - feat: at
pqActive, a write to the client's own atSign made right after it opens waits up to 30 seconds for the client to publish its namespace key, instead of failing. - feat: a write made while the client's start-up is yet to ask, or is asking, the atSign's other enrollments for its namespace key's private waits up to 30 seconds in all for the answer, instead of failing at once.
- feat: at
pqActive, a share is sealed to the most specific namespace key the recipient advertises for the key's whole name, and no longer waits for the writer's start-up. - feat:
PutRequestOptions.sealToNamespace, andsealToNamespaceonNotificationParams.forUpdate,NotificationService.sendandAtClientBindings.notify, seal a share to the recipient's key in one namespace only;CryptoRuntime.canSealTosays whether the recipient advertises one there, and answers false, with a warning, when it cannot tell. - fix: a write or read no longer fails while the namespace private conveyed to the client is already waiting on the atServer. When none has been conveyed yet, the error says so.
- fix: a client that holds a namespace key goes on writing in that namespace after a restart with no atServer, once it has verified the key online. A write that cannot go ahead offline names the namespace key it lacks.
- fix: a read that lacks a namespace key's private goes to the atServer only
for a key this atSign has published, with one request for it at a time,
and not at all under
PqStartupGates.inert()or withaskOnReadMissoff. - fix:
ensureReachableno longer answersfailedfor a namespace whose key it has just published, when a revocation lands during the mint. - feat: namespace-key rotation follows the atServer's
lastKeyHolderRevokedAtwhere it answers one, so a revocation of an enrollment that never held a key package no longer triggers a rotation. - fix:
EnrollmentDirectory.lastRevokedAtthrowsAtValueExceptionfor anenroll:infonsanswer that names no revocation moment, rather than reading it as no revocation. - feat: an enrollment with a key package holds a namespace key from the
moment it is published. Only such a client mints one; on the atSign's own
credential,
ensureReachableanswersAtReachability.noKeyPackage. - fix: an enrollment created under the legacy key exchange can open what its other enrollments convey to it, without waiting for a restart.
- fix: when no namespace key is published, a client retires any it holds and mints and publishes a fresh one.
- fix: two processes of one enrollment no longer both mint a namespace key. A process restarted after stopping mid-mint waits until the mint lock expires.
- fix: the record
tryAcquireServerMutexwrites holds the enrollment id followed by a nonce drawn once per isolate. - fix: a read refuses a record whose metadata names a namespace or key id that no atKey can carry.
- fix: a namespace key's private that arrives before its generation is published is kept only if it is that generation's.
- fix: a client replaces its own atSign's nskey advertisement only when that
advertisement does not verify or its signer has no
_apsk. One it cannot fetch, or one that verifies but offers no key it can use, is left in place, and the error is thrown. - fix:
getApkamPublicKey, and so verifying a signature, refuses a signer that is not an enrollment id withAtSigningVerificationException, and an envelope sent through a namespace no atKey can carry is not delivered. A secret request whoserequestIdis not an id is answered as an unsolicited delivery. - breaking:
AtClient.telemetryis removed, withAtClientTelemetryService,AtClientTelemetryConsumerandSyncTelemetryEvent. - breaking:
AtClientUtil.findSecondaryis removed. UseRemoteSecondary.findSecondaryUrl. - breaking:
Atsign.authenticatesAsno longer takesatLookUp; it takes a requiredlookUpsandsecondaryAddressFinder, which choose how it connects. - breaking:
AtClient.atChopsandRemoteSecondary.atChopsare removed, with theatChopsparameter ofAtClientImpl.create. Hand a client its keys as anAtKeysIo. - fix: after a denial, a keyfile's flat APKAM symmetric key is cleared only when its flat enrollment id names the denied enrollment; a keyfile whose flat id names another enrollment keeps both.
- breaking:
ApkamSigning.publicSigningKeyandprivateSigningKeyare removed; sign withsigningKeys. - breaking:
Query.fetchis removed; useget(). - breaking:
LocalSecondary.getPrivateKeyandgetPublicKeyare removed; usegetPkamPrivateKeyandgetPkamPublicKey. - breaking:
EncryptionUtil.decryptKeyis removed; decrypt with at_chops'RsaEncryptionAlgo. - breaking:
AtClient.streamandsendStreamAckare removed, as areEncryptionService.encryptStream,decryptStreamandgetSharedKeyForDecryption: atServers refuse thestream:command from 3.12.0. Encrypt for another atSign withputornotify. - breaking:
AtClient.persistenceBundleis removed; read the keystore from theAtClientStoragethe client was given. - breaking: the legacy collection API (
AtCollectionModel,AtJsonCollectionModeland their factories) is removed; useAtClient.collection. - breaking: the
isDedicatedparameter ofput,get,delete,notify,getMetaandnotifyListis removed; it was ignored. - breaking: the
syncparameter ofexecuteVerbandRemoteSecondary.executeAndParseis removed; it was ignored. - breaking:
RemoteSecondary.isAvailableis removed; at_lookup'scheckAtSignServersays whether an atSign's atServer is reachable. - breaking:
RemoteSecondary.authenticateCramis removed;Atsign.activatetakes the CRAM secret. - breaking:
AtClientPreference.atProtocolEmittedis removed; it was ignored. - breaking: the file-transfer API is removed:
uploadFile,downloadFile,reuploadFiles,shareFiles,FileTransferObject,FileStatus,EncryptionService.encryptFileInChunksanddecryptFileInChunks, andAtClientPreference.downloadPath. File transfer belongs in the app. - breaking:
ConnectivityListeneris removed; use a connectivity package of the app's choice. - breaking:
RemoteSecondary.addStreamDatais removed. - breaking:
AtClientPreference'scommitLogPath,keyStoreSecretandoutboundConnectionTimeoutare removed; nothing read them. - breaking:
AtClientPreference'sdecryptPackets,tlsKeysSavePathandpathToCertsare removed; set them on theSecureSocketConfigof thelookUpsyou pass,secureSocketLookUps(config: ...). - breaking:
AtClientPreference.enforceNamespaceis removed: every key but alocal:one needs a namespace. - breaking:
EncryptionUtilis no longer exported; use at_chops'AESEncryptionAlgoandRsaEncryptionAlgo. - breaking:
AtClientManager.setCurrentAtSignandfromAuthSessionare removed: open a client withAtsign(atSign).open(...)and make it current withAtClientManager.getInstance().use(client), which does not stop the previous one. - breaking:
AtClientImpl.holdsClientForis removed. - breaking: every call that builds a client (
Atsign.openandactivate,PendingEnrollment.client,buildAtClient,selfRetrofit,pqNativeOnboard,AtClientImpl.create) takes a requiredstorage. at_client no longer opens a store underhiveStoragePath: to keep using that store, passHiveAtClientStorage(atSign: ..., storagePath: <that path>, closedByClient: true). - breaking:
AtClientImpl.create'slocalSecondaryKeyStoreis removed; pass astorage. - breaking:
LocalSecondarytakes a requiredsyncQueue, the one the client's storage holds. - breaking:
AtClientImpl.createandbuildAtClienttake a requiredatKeysIo, and a client no longer signs with a PKAM key its local store holds: pass the atSign's keyfile, such asFileAtKeysIo(). - fix:
AtClientImpl.createthrows aStateErrorfor a client of the same atSign and enrollment whosestop()is still running, rather than restarting it. - fix: a stopped client's
collection()and service getters throwStoppedException, like its other calls. - breaking:
AtClientImpl.createkeeps one client per atSign and enrollment rather than one per atSign. A caller naming no enrollment, whose keys name none, gets the client for the primary enrollment;exactEnrollment: falsehands it the one enrolled client already cached instead. - fix:
AtClientImpl.setPreferencesthrows theArgumentErrorfor a preference naming different rollout axes at the call, rather than as an unhandled asynchronous error. - breaking:
AtReachability.noKeySourceis removed, since every client has a key source. - breaking:
FileAtKeysIo,secureSocketLookUpsandCacheableSecondaryAddressFindercome from the newat_client_io.dart;at_client.dartno longer exports them, and builds for the web. - breaking: every call that builds a client,
enrollandresumeEnrollmenttake a requiredlookUpsandsecondaryAddressFinder, as doauthenticatesAsandretrofitIdentity, andRemoteSecondarya requiredlookUps.secureSocketLookUps()andCacheableSecondaryAddressFinder(preference.rootDomain, preference.rootPort)connect as at_client 3 did. - feat:
InMemoryAtClientStorageis pure Dart and needs no native library. A SQLite database held in memory is stillSqliteAtClientStorage(..., dbPath: SqliteAtClientStorage.inMemoryPath). - chore:
AtClientPreference.hiveStoragePathis read by nothing in at_client, and goes in 5.0.0. - build: at_client no longer depends on archive, http, internet_connection_checker or async.
- fix: only a missing keyfile counts as holding no keys.
ApkamSigning.signingKeysthrowsAtKeyNotFoundExceptionwhen there is no key to sign with, and a keyfile that cannot be read throws its read's error, so no signing key or key package is published from it. An_apskthat names no active signing key is not published. - breaking:
AtClientPreference.isLocalStoreRequired,privateKey,useAtChops,signingAlgoTypeandhashingAlgoTypeare removed. A client is given its storage, and signs with the keys in itsAtKeysIo, which name the algorithm. - breaking:
at_client.dartno longer exportsLocalSecondaryorRemoteSecondary, which an app should not need;getLocalSecondary()andgetRemoteSecondary()remain, not for application use. - breaking:
AtClientPreference.syncIntervalMinsis removed; it set nothing, and sync's fallback timer runs every 30 seconds. - breaking:
RemoteSecondary'ssigningAlgoTypeparameter andPutRequestOptions.storeSharedKeyEncryptedMetadata, which had no effect, are removed. - feat: an approval by an enrollment that holds the atSign's signing root, or
a key anchored to it, anchors the enrollment it approves at once, and adding
or retiring a key no longer undoes that. It needs an atServer with
enroll:link; without one nothing is anchored, and everything else works as before. - feat:
client.enrollments.anchoringsays whether an enrollment's keys are anchored to the atSign's signing root, and names a key that is not. - feat: at a post-quantum posture, a fully privileged client whose atSign publishes no signing root mints one when it starts.
- feat:
Enrollmentcarries the enrollment's authentication public key, asapkamPublicKey. - feat: a denied enrollment is refused with the new cause
AtConnectionCause.enrollmentDenied, andenrollmentNotApprovedmeans one not yet approved.AtCredentialRefusedExceptionsays which. - breaking:
PqStartupGates.publishChainLinkis removed,PqStartupGates.publishRootLinkis renamedanchorOwnKeys, andPqSigningChain's methods are replaced. - fix:
selfRetrofitcloses theatLookUpit is given once the retrofit is submitted, so the client it returns logs in as the new enrollment. A command needing authentication on that lookup in between fails rather than logging in as the old one. - fix:
selfRetrofitgiven noatLookUpsubmits through thesecondaryAddressFinderit is given, as the client it opens does. - fix:
AtRpcandAtRpcClientlog request and response payloads at finest only; at INFO and in their warnings a request is named by its id, and a response by its type and request id. - fix: on the first start after
keyEstablishmentAlgorithmsstops naming an algorithm, the client treats that algorithm's key as retired at once, not from its next start.AtClientSecretSharing.heldStatusesgives the status of each key it holds. - fix: an app enrolled with a dotted namespace, such as the todos
example's
todos.demos, reads, writes and syncs its own records on the device rather than being refused for insufficient privilege. As on the atServer, a grant naming a namespace wins over*, a public key is readable whatever the grant, no__managekey is reachable, and every enrollment reads__atserverand reads and writes its own per-enrollment records. - fix: an enrollment granted read-only access to a namespace stores the records sync brings it, rather than refusing them. Its own writes there are still refused.
- fix: sync acts only on the atServer's stats notification for the client's own atSign.
- fix: sync stops retrying a queued write the atServer refuses for good (unauthorized, an immutable record, an invalid key, an illegal argument, invalid syntax, or a code at_commons does not list), so the writes behind it still reach the atServer. It logs the write at severe, and the device keeps its own copy. Because a code at_commons does not list counts as a refusal for good, a write refused with a code that a newer atServer adds is dropped too, rather than held.
- note: a write the atServer refuses with any other code stays queued, logged at warning, and is sent again with each batch. Held writes that fill a batch at the head of the queue hold up every write behind them, and a queued write this device cannot read back stops each round before anything is pushed.
- build: requires
at_commons^5.23.0, the first to carryenroll:link. - build: requires
at_auth^4.0.0. - build: requires
at_lookup^4.0.0. - build: requires
at_persistence_secondary_server^5.4.0. - chore: constructing
InMemoryAtKeysIo, which at_client re-exports, outside a test draws an analyzer warning: the store a client runs on must be durable, since a client may file the atSign's signing root into it.
3.15.0-rc8 #
- feat:
Enrollmentreports the key expiry a request asked for, asapkamKeysExpiryDuration(zero or less for none, null when the atServer does not say), and when its record expires, asexpiresAt. - feat:
client.enrollments.approvereturns the approved enrollment as the atServer now holds it, including when it expires.
3.15.0-rc7 #
- feat:
tryAcquireServerMutextakes a short-lived lock that every client of the atSign shares, held on the atServer for at most 15 minutes; before c3.16.2 and p3.16.5 an expired lock blocks until the atServer's expiry sweep, up to about ten and a half minutes. It needs an atServer from p3.13.0, and from c3.16.3 and p3.16.5 the lock records no commit. - fix:
AtRpc's request mutex records no commit on an atServer from c3.16.3 or p3.16.5, so it no longer leaves an entry behind for every client of the atSign to sync. It now needs an atServer from p3.13.0: on an older one, a responder withenableRequestMutexhandles no requests. - fix:
PublishedNskeyKeyRingandPqSigningRootrefuse alockTtlover 15 minutes when built. - feat: each storage backend has its own import:
HiveAtClientStoragecomes frompackage:at_client/hive.dartandInMemoryAtClientStoragefrompackage:at_client/memory.dart, no longer fromat_client.dartandsqlite.dart. - fix: a client with
isLocalStoreRequiredfalse and no storage is refused, as the flag's deprecation says; pass one such asInMemoryAtClientStorage. Storage an app passes is now always used. - fix: a client built on the deprecated
localSecondaryKeyStorewith nohiveStoragePathis refused; set the path, or pass a storage. With the path set it is built whateverisLocalStoreRequiredsays. - fix: a client passed neither storage nor
hiveStoragePathis refused with the sameArgumentErroras the other cases. - fix:
AtClientManager.setCurrentAtSignrefuses a client it could not build for want of storage before it stops the current one, which stays current. - fix: a storage, or a sync queue under one
hiveStoragePath, is held by one client at a time: a second client asking for it meanwhile is refused with aStateErrorinstead of sharing it, which could hang an open or close the other client's queue. - fix:
Atsign.activateandPendingEnrollment.clientrefuse a client that would have no local storage before the CRAM secret is spent or the approval is waited for. - fix: a stopped client built on the deprecated
localSecondaryKeyStorecloses the sync queue it opened. - fix: a Hive store whose sync queue fails to open closes the keystore it had opened, so a retry opens cleanly.
- deprecated, to be removed in 4.0:
AtClientImpl.create'slocalSecondaryKeyStoreandAtClient.persistenceBundle; pass storage instead. - deprecated, to be removed in 4.0:
AtClientPreference.keyStoreSecret, which nothing reads. - fix: local storage the client cannot open, such as a file it may not read, fails with an exception the app can catch, and no longer also ends a command-line program with an unhandled error.
- fix: a secret shared between an atSign's own clients is filed under the namespace it was sent through, and credited to the client that sent it.
- fix: each post-quantum value is encrypted under a key of its own, so a content key can encrypt any number of values.
- fix: a client writes post-quantum data in its own namespace once it holds
that namespace's private key; until the key arrives the write throws
NskeyPrivateNotHeldException. - fix: once an atSign's namespace key rotates, including after a revocation, each content key its clients share with other atSigns is replaced by a fresh one sealed to the new key, on the client's first write after it holds that key.
- fix: revoking an enrollment rotates the namespace key of every namespace its
grants cover, including one nested under a granted namespace, such as
chat.appunderapp. - feat: by default a content key is replaced once it is a year old (it was a
week), and a namespace key once it was minted a year ago (it was never).
rotateCkAfterOneWeekandneverRotateNskeyremain for an app that wants the old behaviour. - feat: on macOS and Linux, where OpenSSL 3 is installed, post-quantum encryption uses it, and key exchange (which needs OpenSSL 3.5 or later) gets several times faster. Elsewhere it stays pure Dart.
- fix: two subscriptions with the same regex but different
shouldDecrypteach receive notifications as they asked; the second no longer shares the first one's stream and setting. - fix:
AtRpcanswers a request whose value it cannot parse with a NACK under the request's id, and keeps serving; an error from a request or response handler is logged and the listener carries on. - fix:
getdecrypts data that at_client 3.0.10 to 3.2.1 wrote, which from 3.13.0 came back still encrypted. - fix: a
get,putor notification whose shared key does not unwrap under this atSign's key throws anAtException, as other decryption failures do, not anArgumentError. - build: requires
at_chops^3.7.0.
3.15.0-rc6 #
- fix: an enrollment sent an ML-KEM-1024 namespace key can read that namespace, including one it received under an earlier 3.15.0 prerelease, and a namespace key that doesn't match what its atSign publishes for that key is refused.
- fix: a link vouching for an enrollment's signing key is published as soon as it arrives, and one that can't be published yet is tried again at the next start.
- fix: two operations that need the client's keys at the same moment, such as two notifications to the client's own atSign, no longer fail with "Self encryption key is not set for current atSign".
3.15.0-rc5 #
- feat:
AtSignServerCheck,AtSignServerState,checkAtSignServerandAtSignLoggercome throughpackage:at_client/at_client.dart, so an app no longer needs at_lookup or at_utils for them.
3.15.0-rc4 #
- fix: after an upgrade from 3.14.0, sync no longer stops for good, a restart
no longer skips the notifications sent while the client was not running, and
a
local:record put back through theAtKeythat read it can still be read. A device a 3.15.0 prerelease left in that state recovers, except for an app's ownlocal:value shaped like ciphertext (base64 of a multiple of 16 bytes), which the app has to write again. - fix: after an upgrade from 3.14.0, writes not yet synced reach the atServer
once the app opens a store in the directory their queue was left in: as it
switches back to the other atSign when atSigns have separate directories,
or at once when the app had called
Hive.inititself. - fix: after an upgrade from 3.14.0,
Atsign.openrefused by the atServer on a device that has synced returns a client in the refused state rather than throwing. - fix: a client built with an
AtChopsand no key source, as at_onboarding_cli 1.x builds one, uses the keys thatAtChopsholds again. - fix: an enrolled client starting offline with no grants in its keyfile authorises from the grants at_onboarding_cli 1.x stored, as 3.14.0 did, rather than refusing the write.
- fix: writing a record again while its previous value is being pushed no longer logs a warning.
- note: a write that had not synced when an app moves from at_client 3.11 or earlier is not pushed, and has to be written again.
- fix:
readByandwasMarkedReadByMecount a read receipt this client sent before a restart, somarkReadByMeno longer sends it a second time. - fix: a content key that has been replaced is kept for 8 days
(
CryptoConfig.supersededCkGrace) before it is cleaned up, so a recipient can still open a notification sent under it just before the rotation. - feat: a notification can be ephemeral (
NotificationParams.forUpdate(..., ephemeral: true),send(..., ephemeral: true)): an atServer that supports it delivers it without storing it, for at most 2 minutes. It cannot carry attror be cached at the recipient. - feat: where the atServer supports it, a notification carries its exact
expiry rather than a relative
ttln, so it no longer drifts at each hop. - build: requires
at_commons^5.19.0. - build: requires
at_auth^4.0.0-rc4:PendingEnrollment.awaitApprovalon an expired or unknown enrollment fails at once, with the atServer's reason. - feat:
ensureReachable's result says whether this client can open what peers seal to the namespace (AtReachabilityResult.holdsPrivate). - fix: an approver whose client has only just started still hands a new
enrollment every namespace key it may read, under a
*grant too. - fix: a post-quantum enrollment granted only
*can be approved; it was refused for having no namespace to be sent its keys in. - fix: approving no longer throws when the approver may only read a namespace it holds a key for; the new enrollment gets that key from another holder.
- feat:
atClient.schemeOf(key)tells how a value another atSign shared was protected: legacy or post-quantum, and under which KEM.AtNotification.receivedUnder, passed as thecryptoProviderIdofNotificationService.sendorAtClientBindings.notify(new there), lets an app answer in the scheme it was asked in. A class that overridesAtClientBindings.notifymust add the parameter. - feat: an
AtRpcrequest can name itscryptoProviderId, and anAtRpcserver answers each request in the scheme it arrived in. - fix: an
AtRpcreply to a requester that cannot open a post-quantum answer goes out under the server's default scheme, and a reply that could not be sent is retried rather than dropped. - fix: the namespace key a client publishes at start is for the namespace it was built with, not one the app switches it to straight afterwards.
- fix: concurrent
AtRpcrequests, from one client or several, no longer share a request id, which could drop one or hand a caller another's response. - fix: an
AtKeyreused for several puts or notifications carries nothing over from one to the next. - fix: a value an app encrypts itself and puts with
shouldEncrypt: falseis stored as given and treated as plain: the put dropsisEncrypted,ivNonceand the other encryption fields an app sets on the key's metadata. - fix: a provider id set in a key's
appMetadatano longer chooses the provider for a notification the SDK encrypts; passcryptoProviderId. - fix: a
noCommitput that falls back to legacy encryption still asks the atServer not to record a commit.
3.15.0-rc3 #
- build: requires
at_auth^4.0.0-rc3, which releases a keyfile lock left behind by a process that stopped mid-write within 5 seconds. - build: requires
at_lookup^3.7.0-rc3, whose notification connection logsHeartbeat OK: lastReceipt <time>on each answered heartbeat again. - fix:
isInSync()answers true once a client with a sync regex, or on an enrollment limited to some namespaces, has pulled everything its filter admits, rather than staying false until the next write the filter admits.
3.15.0-rc2 #
- feat (experimental): invitations, including to someone with no atSign yet:
AtClientInvitationsinat_client_mixins.dart, also as theInvitationsmixin. An invitation is a link plus a separate code and can carry encrypted content; the invitee previews and accepts it, and the inviter decides it once. - fix: a post-quantum write that
remoteLocalPrefsends to the atServer now sends its content key there too, so the atSign's other clients can read it. - fix: listing an
AtCollectionthat holds an item this atSign shared post-quantum no longer fails. - fix: every enrollment of an atSign reads what its other enrollments shared, and a restart no longer writes a new key record for each peer it writes to.
- fix: key records nothing needs any more are deleted, rather than kept for the life of the atSign.
- fix: a recipient reads a post-quantum share while the sender's atServer is unreachable.
- fix: a namespace key a peer withdraws stops being used at once, and one it rotates within 15 minutes, including this atSign's own, rotated on another device.
- feat (experimental): a signature from a revoked or deleted enrollment is
refused with
WithdrawnSigningKeyException, which says which. - BREAKING (experimental):
EnvelopeSigning.publicKeyCacheSettingsno longer takesresetOnLookup; a fetched key is kept for a fixed time. - fix: application scans and notification subscriptions no longer see the
SDK's content-key records; a scan with
showHiddenKeyslists them. - fix: a read of a record whose name ends in the app's namespace no longer reads a different record.
- fix:
ensureReachableon a client with noAtKeysIono longer publishes a key only that process could open. It answersAtReachability.noKeySource, which an exhaustiveswitchmust now handle.
3.15.0-rc1 #
- feat (experimental): post-quantum cryptography, chosen by
AtClientPreference.posture(PqPosture.legacy, the default,pqReadyorpqActive): ML-DSA-65 signing, ML-KEM and X-Wing key establishment, per-namespace keys, a signing root, secret conveyance at enrollment approval, and key rotation. The default posture runs none of it. The 3.14.0 secret-sharing substrate changed shape. - feat:
Atsign('@alice')lifecycle verbs:activate,enroll/resumeEnrollment,open(serves local storage while offline) andauthenticatesAs.client.enrollmentslists, approves, denies and revokes, and issues OTPs and SPPs.buildAtClient(...)builds a client, andAtClientManager.getInstance().use(client)makes it current. - feat: pluggable local storage:
AtClientStorage, defaulting toHiveAtClientStorage, withSqliteAtClientStorageandInMemoryAtClientStorageinpackage:at_client/sqlite.dart. - feat:
client.connectionreportsonline,offlineorrefused;attempt()andawaitOnline()retry.monitorSilenceTimeout(default 60s) rebuilds a notification connection that has gone quiet. - fix:
AtClient.stop()ends everything the client started and releases its storage, so the process can exit. A stopped client cannot be restarted. - fix:
NotificationService.send()encrypts under the namespace the caller named and throwsArgumentErrorfor a name with no dot;namespaceis deprecated in favour ofidAndNamespace. - fix: sync and notifications. A write racing a sync push is no longer lost, a
monitor reconnect neither loses nor repeats notifications, the sync push
keeps
appMetadataandimmutable, expired records are reclaimed, andAtCollectionno longer duplicates, misses or deletes live items. - fix: authenticated connections send
clientConfigagain,AtClientImpl.createrefuses astorageits cached client doesn't hold, and closing a storage no longer races a concurrent attach. - deprecated, to be removed in 4.0:
AtClientManager.setCurrentAtSignandfromAuthSession;AtClient.atChops;AtClientPreference.decryptPackets,tlsKeysSavePath,pathToCerts,hiveStoragePathandcommitLogPath. - build: requires
at_auth^4.0.0-rc2,at_lookup^3.7.0-rc2,at_commons^5.18.0,at_chops^3.6.0 andat_persistence_secondary_server^5.3.0.
3.14.0 #
- feat (experimental): per-APKAM same-atSign secret-sharing substrate —
AtClientSecretSharing/PairwiseSecretSharing(mixinsKeyPackageRegistration,EnvelopeSigning),SecretStore,KeyPackage,SecretEnvelope, and theEnrollmentDirectoryseam. Secrets travel in X-Wing-sealed (pqSeal), APKAM-signed__ssenvenvelopes addressed bykpid; key packages are enrollment-internal (conveyed viaenroll:request, discovered via the gatedenroll:listnsverb) and never published. The whole surface is@experimental— the wire shape is subject to change pending the atServer verb work — and requiresat_chops ^3.3.0(pqSeal/pqOpen).
3.13.0 #
- feat: add
AtClientPreference.networkTimeout— when set on the preference used to create anAtClient, it becomes the process-wide network-timeout default (AtNetworkTimeouts.defaultTimeout, capped at 60s), bounding every atServer connect / atDirectory lookup / operation so a dead network can't hang the SDK. Supersedes the misnamedoutboundConnectionTimeout(a socket idle time). Requiresat_commons ^5.13.0(#1923). - chore(deps):
at_lookup: ^3.6.0,at_auth: ^3.2.0— the bounded socket connects and the deadline-drivenvalidateAtServerlive in those versions; with older ones resolved,networkTimeoutwould set a policy nothing reads. - refactor: migrate the local keystore to
at_persistence_secondary_server5.0.0 — the client is now commit-log-free. The client no longer maintains a local commit log or runs commit-log compaction; sync tracks its progress with a persisted pull cursor, and key-expiry processing is driven by the keystore'snextExpiresAt/peekNewlyAvailablesurface. Requiresat_persistence_secondary_server ^5.0.0. - deprecated:
AtClient.startCompactionJobandAtClient.stopCompactionJobare retained for source compatibility but are now no-ops (a commit-log-free client has no commit log to compact); they will be removed in a future major release. - deprecated:
FileTransferServiceandFileTransferObjectare now marked@Deprecated. The SDK file-sharing API (uploadFile/downloadFile/shareFiles/reuploadFiles) has moved to the app layer and will be removed, along with thearchivedependency, in the next major version (#1113). - chore(deps): remove the unused
crondependency — it was only used by the commit-log compaction that theat_persistence_secondary_server5.0.0 migration removed, and nothing in the client imports it (#1378).uuidis already on^4.0.0.
3.12.0 #
Several significant enhancements to the API to make it much easier to use.
- feat: New feature - Collections - a clean API for storing, sharing, unsharing and deleting objects in named collections, with sub-collections, event streams, built-in support for read receipts, live queries with incremental delta maintenance, and more. For detail, see the READMEs, dartdocs and examples
- feat: added a new method,
send, to NotificationService which is much easier to use than the old (still fine to use)notifymethod. - feat: added
factory AtRpc.serverto make it much simpler to create AtRpc servers. - feat: added preference-time crypto provider configuration via
AtClientPreference.crypto,CryptoConfig, andCryptoProvider. - feat: added
CryptoStorageto provider context for provider-owned local / remote state, plusCryptoPolicy.onProviderNotFoundfor lazy provider registration with a single retry. - fix(AtCollection): notification-path sub-item dispatch now recovers
ancestor owners directly from the decrypted notification payload
(which IS the envelope) instead of round-tripping through the local
keystore. Eliminates a class of null-owner
CSubItemUpdatedevents that surfaced underEventSource.notifs(andEventSource.both) when the keystore mirror landed under a key shape the readback couldn't resolve, or raced ahead of sync writing the bare key.
Major documentation uplift
- docs: Rewrote the main README
- docs: Added many examples in the example directory
And some tech debt cleanup
- feat: explicit AtClient lifecycle control — cleanly stop and resume atClients without re-initialising storage or keys
- feat: outgoing AtClient's sync and notification services will now be garbage collected
- chore: deprecated
atClientManagerparam in the factories of AtClient, NotificationService, and SyncService - fix: added null guards to AtClient service getters
- perf(SyncServiceImpl): when a
sync:from:request returns no entries because the entire(lastReceivedServerCommitId, serverCommitId]range was filtered out server-side (apkam namespace scope, syncRegex, or skipDeletesUntil), advance the persisted server-commit cursor to the sync-startserverCommitIdsnapshot instead of breaking out without advancing. Subsequent sync rounds no-op until the server actually advances past it, rather than re-probing the same filtered range every round. - perf(SyncServiceImpl): round 1 of fsync - push to server based on a simple queue mechanism. Also fixed a bunch of related bugs. Note that a follow-up PR will fully remove the use of the "Commit Log" part of the at_persistence package on the client side; commit log was never the appropriate vehicle mechanism to support client-side sync push
3.11.0 #
- chore(deps): at_auth ^3.0.0
- chore(deps): at_chops ^3.0.0
3.10.0 #
- build(deps): Updated archive dependency to ^4.0.7
- feat: Add RemoteLocalPref enum and AtClientPreference.remoteLocalPref field to enable apps to easily default to using the remote atServer
- fix: ensure AtRpcResp and AtRpcReq
.toString()methods are JSON serialized strings - feat: use responseJson variable so that log is consistent
- fix: fixed rare race condition caused by the handling of legacy shared symmetric keys
- feat: improved resilience of the notifications monitor to weird network conditions
3.9.2 #
- fix: AtRpc - prevent NACK/ACK race when handling request mutex acquisition
3.9.1 #
- chore: removed
@experimentalannotation from AtRpc and AtCollection - chore: added
// ignore: experimental_member_usefor usages of the still-experimental AtTelemetry
3.9.0 #
- feat: introduce single-responder mode in AtRpc enabling redundancy support in
request-response services relying on AtRpc. This feature is coupled with
enableRequestMutexflag that controls it.
3.8.0 #
- feat: add optional
useRemoteAtServerflag to AtClientgetKeysandgetAtKeysso that apps can ask to fetch directly from atServer rather than the local datastore. - fix: set
isClientto true andisServerto false in AtRpcClient, enabling same atSign communication of AtRpc clients and servers. - fix!: fixed a bug where at_rpc was adding the AtClientPreference's namespace to the notifications used by at_rpc (https://github.com/atsign-foundation/at_client_sdk/pull/1670).
3.7.0 #
- chore(deps): uuid ^4.0.0
- chore(deps): at_commons ^5.5.0
- chore(deps): at_persistence_secondary_server ^4.2.0
- chore(deps): http ^1.2.1
- chore(deps): remove unused dependencies
- chore(deps): move collection to dev_dependencies
3.6.0 #
- feat: deprecate the (misleadingly named)
AtClientPreference.Atsign ProtocolEmittedand change its default value from 1.5.0 to 2.0.0
3.5.3 #
- feat: fetch various atKeys keys from atChops if we have it (which we always do, now) instead of going to the keyStore
- refactor: some deprecations for readability / maintainability
3.5.2 #
- fix: ensure that namespaces in
notifyrequests aren't messed up by multipart namespaces in AtClientPreference (e.g. namespace offoo.bar)
3.5.1 #
- fix: ensure that namespace is preserved if it happens to be repeated in a
notification's key (e.g.
@bob:foo.my_app.my_app@alice)
3.5.0 #
- feat: add
atLookUpparameter to AtClientManager.setCurrentAtSign, AtClientImpl.create, etc. so we can inject an existing AtLookUp instance if we have one rather than having to create a new one and authenticate again
3.4.4 #
- fix[performance]: when fetching
public:publickeyof another atSign from atServer, cache it in local storage instead of depending on sync to take care of that (since programs can disable sync)
3.4.3 #
- build[deps]: update dependencies including at_persistence major version changes
- fix: tightened up code for handling
AtKeyNotFoundExceptions inAtCollectionQueryOperationsImpl - fix: Enable the same atSign to be used on both sides (client and server) of an AtRpc interaction
- fix: LocalSecondary.isEnrollmentAuthorizedForOperation now checks if the
key in question is a
localkey, in which case the answer is always yes.
3.4.2 #
- build[deps]: update dependencies (at_commons, at_lookup, at_auth)
3.4.1 #
- fix: potential bug handling atSigns which end in
datae.g.@foo_data
3.4.0 #
- feat: Allows clients to skip delete commits until a specific commitID during initial sync
3.3.1 #
- fix: isInSync bug fix for apkam connection
- fix: remove deprecated isPaginated param from SyncVerbBuilder in SyncServiceImpl
- build[deps]: Upgraded dependencies for the following packages:
- at_commons to v5.1.2
- feat: Introduce "publicKeyHash" which uses SHA hashing to verify change in the encryption public key
3.3.0 #
- feat: add the AtClientBindings mixin which was initially added to the noports_core package but has broader applicability.
3.2.2 #
- build[deps]: Upgraded dependencies for the following packages:
- at_commons to v5.0.0
- at_utils to v3.0.19
- at_lookup to v3.0.49
- at_auth to v2.0.7
- at_persistence_secondary_server to v3.0.64
- at_chops to v2.0.1
3.2.1 #
- feat: add optional param
encryptValueto notify method - build[deps]: Upgraded dependencies for the following packages:
- at_commons to v4.1.1
- at_utils to v3.0.18
- at_lookup to v3.0.48
- at_auth to v2.0.5
- at_persistence_secondary_server to v3.0.63
3.2.0 #
- feat: add
allowAllflag (defaults to false) to AtRpc
3.1.0 #
- feat: add
useRemoteAtServerflag toGetRequestOptionsto allow clients to fetch directly from the atServer rather than the client-side synced cache. This flag was added toPutRequestOptionsandDeleteRequestOptionsin version 3.0.60 - fix: Ensure that
NotificationResponseTransformerdoes not attempt to decrypt whenatNotification.isEncrypted == false
3.0.78 #
- chore: publish clean version 3.0.78
3.0.77+1 #
- fix: remove incorrect version 3.0.78 from changelog
3.0.77 #
- fix: Fix the keys expiry job not being triggered
- chore: deprecate NotificationParams.forText()
- feat: Store enrollment details in local key
- fix: Add "sharedKeyEnc" to the metadata
3.0.76 #
- feat: Introduce mechanism to identify and delete expired keys
- feat: Introduce enrollment service to support enrollment operations:
- Submit enrollment request(s)
- Approve, Deny and Revoke enrollment request(s)
3.0.75 #
- feat: Introduce feature to fetch enrollment requests from the server
3.0.74 #
- build[deps]: Upgraded dependencies for the following packages:
- at_chops to v2.0.0
- at_lookup to v3.0.45
3.0.73 #
- build[deps]: Upgraded dependencies for the following packages:
- at_commons to v4.0.0
- at_utils to v3.0.16
- at_lookup to v3.0.44
- at_chops to v1.0.7
- at_persistence_secondary_server to v3.0.60
- feat: Replace encryption methods from EncryptionUtils with AtChops method
3.0.72 #
- chore: Minor change to allow us to support dart versions both before and after 3.2.0 specifically for this Dart breaking change which was introduced in dart 3.2.0
3.0.71 #
- feat: Replace decryption methods from EncryptionUtil with AtChops methods
3.0.70 #
- build[deps]: Upgraded dependencies for the following packages:
- asn1lib:
>=1.4.1 <=1.5.0, crypton:>=2.1.0 <=2.2.1, encrypt:>=5.0.1 <=5.0.3, crypto:^3.0.3
- asn1lib:
3.0.69 #
- feat: Add AtRpcClient for a much cleaner developer experience for sending AtRpc requests
3.0.68 #
- feat: have AtRpc use ephemeral notifications
3.0.67 #
- feat: Make enrollment available to SyncService/NotificationService for authentication
3.0.66 #
- feat: make namespace NOT mandatory for local keys
- feat: deprecate useAtChops experimental flag and remove fallback code using private key from preferences/EncryptionUtil methods
- updated at_commons to
'3.0.57', at_chops to'1.0.5, at_persistence_secondary_server to'3.0.59'
3.0.65 #
- feat: apkam changes for at_onboarding_cli
- build: updated at_commons to
'3.0.55', at_chops to'1.0.4, at_lookup to'3.0.40'
3.0.64 #
- Made ConnectivityListener configurable, and removed some unnecessary network availability checks
- fix: wrap Monitor's call to
socket.listen()in a runZonedGuarded block
3.0.63 #
- fix: Fixed bug in AtRpc.sendRequest which was causing repeat sends of requests
3.0.62 #
- fix: skip reserved keys during sync conflict checking
- build: updated dependency on http package to
'>=0.13.5 <2.0.0'
3.0.61 #
- fix: ensure key exchange functions properly when the sync service is not being used
- feat: Add AtRpc - A simple rpc request-response API which uses Atsign Protocol notifications under the hood.
3.0.60 #
- feat: Add
useRemoteAtServerto PutRequestOptions. When set, the update request will be sent directly to the remote atServer - feat: Introduce DeleteRequestOptions
- Add new optional named parameter
deleteRequestOptionsto AtClient.delete - Add
useRemoteAtServerto DeleteRequestOptions. When set, the delete request will be sent directly to the remote atServer
- Add new optional named parameter
- fix: Incorrect commitId gets updated against commit entry when a sync-batch skips an entry
- fix: Sync/Monitor bug while running onboarding_cli with at_chops using pkam from secure element
3.0.59 #
- fix: Sync running into infinite loop when an invalid key is present in the entries to sync into client
- fix: Redundant logs generated for an internal key (lastReceivedNotification) while sending notifications
- chore: Reduced log_level of AtKey lower case enforcement message from INFO to FINER
- feat: Introduce clientId, appName, appVersion and platform to distinguish requests from several clients in server logs.
3.0.58 #
- chore: upgrade dependencies. at_commons to 3.0.43, at_utils to 3.0.12, at_lookup to 3.0.36 and at_chops to 1.0.3
3.0.57 #
- feat: Initial support of additional encryption metadata enabling encryption future-proofing
- fix: Expose priority, strategy, notifier, latestN and notificationExpiry in NotificationParams
- fix: Fixed issue where NotificationResponseTransformer would duplicate sharedWith and sharedBy
when logging
AtKeys
3.0.56 #
- fix: AtClient.put() throws null-check error when key's namespace is null
3.0.55 #
- fix: Amend Monitor's socket message handler so that it separates multiple 'simultaneous' responses correctly.
- fix: Sync to local fails to delete a cached key
- feat: Introduce CommitOp(CommitOperation) to the KeyInfo to describe key update or delete upon sync
- feat: consume changes in at_commons v3.0.35 that enforce lowercase on AtKey
- build: upgrade dependency at_persistence_secondary_server to v3.0.46
3.0.54 #
- fix: ensure forText notifications are decrypted successfully when using at_commons 3.0.35 or greater
3.0.53 #
- feat: Introduce commit log compaction to keep size of commit log thin
- fix: Fixed a bug where switch atSign event is notified multiple times
- fix: Add AtChops as optional argument to AtServiceFactory.atClient
3.0.52 #
- feat: Introduce AtServiceFactory to make AtClientManager more reusable and more testable
- feat: Make AtChops instance (if any) available everywhere that it can/should be used
3.0.51 #
- feat: Add atSign to AtSignLoggers' names when relevant, so that log messages are clearer
- feat: Made notificationService and syncService available via AtClient to enable cleaner simpler code elsewhere
- fix: Fixed clearing of sync progress listener while switching atsign.
- fix: Remove the inactive listeners from AtClientManager._changeListeners list.
- fix: Reverted back path,async packages to older version
3.0.50 #
- feat: Introduce commit log compaction to keep size of commit log thin
- feat: changes for at_chops uptake
- chore: upgrade at_persistence_spec, at_persistence_secondary_server, at_commons version
3.0.49 #
- fix: Enable AtKey.namespace overrides the namespace in AtClientPreference in AtClient delete method
- fix: Fixed a bug where initial notifications fails to decrypt - invalid pad block issue
3.0.48 #
- feat: Added
lib/src/client/request_options.dartto provide access to theRequestOptionsandGetRequestOptionsclasses.
3.0.47 #
- fix: Enable deletion of local keys
3.0.46 #
- fix: Ensure that we handle any and all exceptions related to sending heartbeat request
- feat: Made NotificationServiceImpl's retry delay into a public instance variable, so it can be set by application code
- feat: Changed NotificationServiceImpl's retry delay (from when monitorRetry() is called to when Monitor.start() is called) from 15 seconds to 5 seconds
- fix: Fixed a bug where client could 'miss' notifications while starting up
- fix: Ensure that exceptions related to sending heartbeat request are always caught correctly
- feat: Added experimental telemetry feature
3.0.45 #
- fix: Fix sync running into infinite loop when invalid keys does not sync into local storage
- fix: Upgrade persistence secondary to version 3.0.43 to fix empty batch request being sent to cloud secondary
3.0.44 #
- feat: Introduce fetch method to NotificationService to fetch the notification using id.
- fix: Replace latestNotificationId with local key to store/fetch last received notification
3.0.43 #
- chore: upgrade persistence secondary to version 3.0.42 and persistence spec to 2.0.9
3.0.42 #
- fix: Improved performance of getKeys (and getAtKeys) when sharedBy is specified, by using the existing RemoteSecondary connection rather than creating a new one
- fix: Do not try to decrypt empty or null serverEncryptedValue when generating SyncConflict info
- fix: put try-catch around most of the
SyncServiceImpl._checkConflictmethod so sync is not impeded if _checkConflict encounters an exception - fix: fix null pointer exception in monitorResponse due to delayed server response
- fix: Skip reserved keys from decryption in the notification callback
- fix: Update at_commons to 3.0.29 which fixes AtKey sharedWith attribute has incorrect value for public keys
3.0.41 #
- chore: upgrade persistence secondary to version 3.0.38 which reverts sync of signing keys and statsNotificationKey
3.0.40 #
- chore: upgrade at_commons to 3.0.26
- fix: check isEncrypted flag in sync conflict
- docs: Fixed broken links
3.0.39 #
- chore: upgrade 3rd party dependencies except hive
- chore: upgrade persistence secondary to version 3.0.36
3.0.38 #
- fix: Add client sending config changes to server
- fix: NotificationService.subscribe to return existing listener on same regex
3.0.37 #
- fix: Revert sending client config changes to server
3.0.36 #
- fix: Add metadata validation to put request on client SDK
- fix: Added unit tests for sync failure
- fix: Export SyncProgressListener to track the SyncProgress.
- fix: setCurrentAtsign() throws an exception when an invalid atsign is passed.
- feat: Encode new line characters in public-key value
- feat: Send clientConfig to the cloud secondary
3.0.35 #
- fix: Reverted dependency on 'meta' package to ^1.7.0 as flutter_test package requires 1.7.0
3.0.34 #
- fix: Ensure _syncFromServer rethrows caught exceptions once it's handled the exception chaining
- feat: Add enforceNamespace (default value true) to AtClientPreference
3.0.33 #
- feat: Upgrade lints version to 2.0.0
3.0.32 #
- fix: while syncing keys from server to local if there is an issue syncing a key, continue syncing rest of the keys
- fix: do not sync statsNotificationID from client to server
- feat: KeyStreams
- fix: do not create new instance of CacheableSecondaryAddressFinder in at lookup
- [optional] Users can set SecureSocket's securityContext and store current session TLS keys through AtClientPreferences
3.0.31 #
- Enhance notify text to send text message encrypted
- Upgrade at_persistence_secondary_server to v3.0.30
- Upgrade at_commons version to v3.0.20 for encrypt notify text message
- Upgrade at_lookup version to v3.0.28 for adding mutex to authenticate methods
- feat: Add to NotificationService.notify() signature:
- added new optional callback parameter, onSentToSecondary
- added new optional 'checkForFinalDeliveryStatus' parameter
- added new optional 'checkForFinalDeliveryStatus' parameter
- and updated code documentation for NotificationService.notify() method
3.0.30 #
- Added bypassCache option in get method
- Added sync conflict info to sync progress callback
- Added security policy
- Fix for skipping reserved keys while checking for sync conflict
- Upgrade at_lookup to v3.0.27 for outbound message listener timeout enhancement
3.0.29 #
- Added additional attributes in SyncProgress for improved sync observability
3.0.28 #
- Upgrading dependency at_persistence_secondary_server to version 3.0.29 to sync public hidden keys
- Upgrade at_commons to 3.0.18 to enable scan to display hidden keys when showHiddenKeys set to true
3.0.27 #
- Upgraded dependency at_persistence_secondary_server to version 3.0.28
3.0.26 #
- Uptake AtException hierarchy
- Introduce exception chaining
- Fix for Server stuck on old value even though syncing is happening. at_server Issue #721
- Export notification_service.dart file
3.0.25 #
- Fix for regex issue in notification service. Issue #523
- Fix for namespace issue in notify method.Issue #527
- Fix for handling empty sync responses from server. App issue #624
3.0.24 #
- Update the @platform logo
- Default the AtKey.sharedBy to currentAtSign
3.0.23 #
- Fix for at_client issue #508 - getLastNotificationTime bug while trying to decrypt old data
3.0.22 #
- Fix for getKeys in local secondary not returning keys
3.0.21 #
- Cache secondary url returned by root server
3.0.20 #
- Remove print statements
3.0.19 #
- Update at_commons,at_persistence and at_lookup version to remove print statements
3.0.18 #
- Generate Notification id in SDK
3.0.17 #
- Fix self encryption key not found
- Fix for _getLastNotificationTime method returning null
- Added heartbeats to Notifications Monitor to detect and recover from dead socket. Heartbeat interval is customizable via AtClientPreference
- Fix for os write permission issue: give app option to pass the path where the encrypted file will be saved on disk
3.0.16 #
- Decrypt notification value in SDK
- Support for shared key and public key checksum in notify
- Deprecated methods related to filebin
3.0.15 #
- Fix public key checksum in metadata does not sync to local.
3.0.14 #
- Support for shared key and public key checksum in metadata
- Chunk based encryption/decryption for files up to 1GB
- Change in pubspec to fetch the exact version of atsign packages
3.0.13 #
- Sync deleted cached keys to cloud secondary
- at_lookup version upgrade for increase in outbound connection timeout
3.0.12 #
- Fix automatic sync not working
3.0.11 #
- at_lookup version upgrade for outbound listener bug fix
- added functional test to verify outbound listener bug fix
3.0.10 #
- Uptake at_persistence_secondary_server changes
- Uptake at_lookup changes for AtTimeoutException
- Handle error responses from server
- Refactor put method to use request and response transformers
- Provide callback for sync progress
3.0.9 #
- Uptake at_persistence_secondary_server changes
- Refactor decryption service
- Introduce request response transformers
- Refactor get method to use request response transformers
3.0.8 #
- Updated readme and documentation improvements
3.0.7 #
- Uptake at_persistence_secondary_server changes
- Resolve dart analyzer issues
- Run dart formatter
3.0.6 #
- Uptake AtKey validations
3.0.5 #
- Uptake at_persistence_secondary_server changes
3.0.4 #
- Uptake Hive Lazy Box changes
3.0.3 #
- Sync pagination limit in preference
3.0.2 #
- Expose isSyncInProgress in SyncService
3.0.1 #
- Reduce wait time on monitor connection
- at_lookup version upgrade
3.0.0 #
- Resilient SDK changes and bug fixes
2.0.4 #
- Improve notification service
- Improve monitor
- sync on a dedicated connection
2.0.3 #
- at_commons version upgrade
2.0.2 #
- filebin upload changes
2.0.1 #
- at_commons version upgrade
2.0.0 #
- Null safety upgrade
1.0.1+10 #
- Provision to request for a new outbound connection.
- Minor bug in stream handlers
1.0.1+9 #
- Third party package dependency upgrade
- gitflow changes
- Auto restart monitor connection
- Stream encryption
- Bug fixes
1.0.1+8 #
- Delete cached keys
- Encrypt Stream data
1.0.1+7 #
- Self keys migration issue fix
1.0.1+6 #
- Notification sub system introduced
1.0.1+5 #
- Added automatic refresh of monitor connection
1.0.1+4 #
- Provided multiple atsign support in at client SDK. Introduced batch verb to improve sync performance
1.0.1+3 #
- onboarding changes for server activation and deactivation Backup keys implementation sync improvements
1.0.1+2 #
- sync improvements and at_utils, at_commons, at_lookup version changes
1.0.1+1 #
- Minor changes in at_persistence_spec and at_persistence_secondary_server
1.0.1 #
- pubspec dependencies version changes
1.0.0 #
- Initial version, created by Stagehand