Skip to main content

at_client 4.0.0 copy "at_client: ^4.0.0" to clipboard
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.pqReady or pqActive): 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 still PqPosture.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 sets pqActive; a client configured lower logs a warning and is raised to the floor, on its own copy of the preference, which getPreferences() and setPreferences() reach. A raised client seeds no namespace keys and mints no signing root that its configured posture would not.
  • feat: NotificationService.droppedEvents reports 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 configure pqReady or above for later ones.
  • feat: sealToNamespace with no cryptoProviderId seals with the namespace-key provider, so a pqReady program no longer names it; a client whose config lacks it, as at PqPosture.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, its CollectionOpException<T> carries the item written as item, so the share is retried with updateSharedWith(e.item!, ...) rather than a second create.
  • 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.open refuses keys a denial, a cancel or an expiry left with no credential at once, with AtNoCredentialException saying 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 AtStorageInUseException naming the store's location, rather than with Hive's raw lock failure.
  • fix: a collection record this device cannot read yet fails getItems() with a CItemReadException naming the record and the error its read failed with, rather than a string; getItemsAsStream() with an onError handler lists the rest.
  • note: an envelope's signature is verified with the strongest algorithm the envelope and its signer's _apsk both carry, against the key the signature names, and a key the _apsk lists as retired still 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 _apsk stay 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 wait client or awaitApproval is in, which throws AtEnrollmentCancelledException once 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, which Atsign.resumeEnrollment picks 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, and PendingEnrollment.approved says whether an approval reached the key store before a stop or cancel. Once stop() or cancel() 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.copyWith builds 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: AtKeysFormatException comes through at_client, so an app tells a keyfile that is not a JSON object by its reason and position without importing at_auth.
  • docs: Upgrading to at_client 4.0 takes an app from at_client 3 to 4.
  • breaking: LocalSecondary.atChopsKeys is removed; a client signs with the keys it is given.
  • breaking: AtClient.notify, notifyChange, notifyAll and startMonitor are removed; send through notificationService, one notify per recipient. startCompactionJob and stopCompactionJob, which did nothing, are removed too.
  • breaking: NotificationParams.forText and NotificationParams.messageType are removed: every notification is a key notification, the kind atServers accept.
  • breaking: NotificationService.send requires idAndNamespace; its namespace: spelling is removed.
  • breaking: AtClientManager.syncService and notificationService are removed; use the client's own, client.syncService and client.notificationService.
  • breaking: SyncService.sync takes no onDone, and setOnDone is removed; a SyncProgressListener hears how each sync went.
  • breaking: SyncService.sync takes no onError, and SyncRequest has no onError; a SyncProgressListener hears 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.atClient is removed, and the factory's notificationService and syncService take only the client. AtClientImpl.create and SyncServiceImpl.create take no atClientManager.
  • breaking: AtClientPreference.syncStrategy and SyncStrategy, which nothing read, are removed.
  • breaking: AtClientManager.secondaryAddressFinder and setSecondaryAddressFinder are removed; a client asks only the secondaryAddressFinder it is built with.
  • breaking: Atsign.enroll refuses an rsa2048 request under the pq key exchange before sending it, and a PqPosture refuses rsa2048 authentication 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 CollectionOpException lists each recipient's copy as OpNotAttempted.
  • fix: at pqActive, a collection in a dotted namespace such as todos.demos writes 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, and sealToNamespace on NotificationParams.forUpdate, NotificationService.send and AtClientBindings.notify, seal a share to the recipient's key in one namespace only; CryptoRuntime.canSealTo says 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 with askOnReadMiss off.
  • fix: ensureReachable no longer answers failed for a namespace whose key it has just published, when a revocation lands during the mint.
  • feat: namespace-key rotation follows the atServer's lastKeyHolderRevokedAt where it answers one, so a revocation of an enrollment that never held a key package no longer triggers a rotation.
  • fix: EnrollmentDirectory.lastRevokedAt throws AtValueException for an enroll:infons answer 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, ensureReachable answers AtReachability.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 tryAcquireServerMutex writes 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 with AtSigningVerificationException, and an envelope sent through a namespace no atKey can carry is not delivered. A secret request whose requestId is not an id is answered as an unsolicited delivery.
  • breaking: AtClient.telemetry is removed, with AtClientTelemetryService, AtClientTelemetryConsumer and SyncTelemetryEvent.
  • breaking: AtClientUtil.findSecondary is removed. Use RemoteSecondary.findSecondaryUrl.
  • breaking: Atsign.authenticatesAs no longer takes atLookUp; it takes a required lookUps and secondaryAddressFinder, which choose how it connects.
  • breaking: AtClient.atChops and RemoteSecondary.atChops are removed, with the atChops parameter of AtClientImpl.create. Hand a client its keys as an AtKeysIo.
  • 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.publicSigningKey and privateSigningKey are removed; sign with signingKeys.
  • breaking: Query.fetch is removed; use get().
  • breaking: LocalSecondary.getPrivateKey and getPublicKey are removed; use getPkamPrivateKey and getPkamPublicKey.
  • breaking: EncryptionUtil.decryptKey is removed; decrypt with at_chops' RsaEncryptionAlgo.
  • breaking: AtClient.stream and sendStreamAck are removed, as are EncryptionService.encryptStream, decryptStream and getSharedKeyForDecryption: atServers refuse the stream: command from 3.12.0. Encrypt for another atSign with put or notify.
  • breaking: AtClient.persistenceBundle is removed; read the keystore from the AtClientStorage the client was given.
  • breaking: the legacy collection API (AtCollectionModel, AtJsonCollectionModel and their factories) is removed; use AtClient.collection.
  • breaking: the isDedicated parameter of put, get, delete, notify, getMeta and notifyList is removed; it was ignored.
  • breaking: the sync parameter of executeVerb and RemoteSecondary.executeAndParse is removed; it was ignored.
  • breaking: RemoteSecondary.isAvailable is removed; at_lookup's checkAtSignServer says whether an atSign's atServer is reachable.
  • breaking: RemoteSecondary.authenticateCram is removed; Atsign.activate takes the CRAM secret.
  • breaking: AtClientPreference.atProtocolEmitted is removed; it was ignored.
  • breaking: the file-transfer API is removed: uploadFile, downloadFile, reuploadFiles, shareFiles, FileTransferObject, FileStatus, EncryptionService.encryptFileInChunks and decryptFileInChunks, and AtClientPreference.downloadPath. File transfer belongs in the app.
  • breaking: ConnectivityListener is removed; use a connectivity package of the app's choice.
  • breaking: RemoteSecondary.addStreamData is removed.
  • breaking: AtClientPreference's commitLogPath, keyStoreSecret and outboundConnectionTimeout are removed; nothing read them.
  • breaking: AtClientPreference's decryptPackets, tlsKeysSavePath and pathToCerts are removed; set them on the SecureSocketConfig of the lookUps you pass, secureSocketLookUps(config: ...).
  • breaking: AtClientPreference.enforceNamespace is removed: every key but a local: one needs a namespace.
  • breaking: EncryptionUtil is no longer exported; use at_chops' AESEncryptionAlgo and RsaEncryptionAlgo.
  • breaking: AtClientManager.setCurrentAtSign and fromAuthSession are removed: open a client with Atsign(atSign).open(...) and make it current with AtClientManager.getInstance().use(client), which does not stop the previous one.
  • breaking: AtClientImpl.holdsClientFor is removed.
  • breaking: every call that builds a client (Atsign.open and activate, PendingEnrollment.client, buildAtClient, selfRetrofit, pqNativeOnboard, AtClientImpl.create) takes a required storage. at_client no longer opens a store under hiveStoragePath: to keep using that store, pass HiveAtClientStorage(atSign: ..., storagePath: <that path>, closedByClient: true).
  • breaking: AtClientImpl.create's localSecondaryKeyStore is removed; pass a storage.
  • breaking: LocalSecondary takes a required syncQueue, the one the client's storage holds.
  • breaking: AtClientImpl.create and buildAtClient take a required atKeysIo, and a client no longer signs with a PKAM key its local store holds: pass the atSign's keyfile, such as FileAtKeysIo().
  • fix: AtClientImpl.create throws a StateError for a client of the same atSign and enrollment whose stop() is still running, rather than restarting it.
  • fix: a stopped client's collection() and service getters throw StoppedException, like its other calls.
  • breaking: AtClientImpl.create keeps 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: false hands it the one enrolled client already cached instead.
  • fix: AtClientImpl.setPreferences throws the ArgumentError for a preference naming different rollout axes at the call, rather than as an unhandled asynchronous error.
  • breaking: AtReachability.noKeySource is removed, since every client has a key source.
  • breaking: FileAtKeysIo, secureSocketLookUps and CacheableSecondaryAddressFinder come from the new at_client_io.dart; at_client.dart no longer exports them, and builds for the web.
  • breaking: every call that builds a client, enroll and resumeEnrollment take a required lookUps and secondaryAddressFinder, as do authenticatesAs and retrofitIdentity, and RemoteSecondary a required lookUps. secureSocketLookUps() and CacheableSecondaryAddressFinder(preference.rootDomain, preference.rootPort) connect as at_client 3 did.
  • feat: InMemoryAtClientStorage is pure Dart and needs no native library. A SQLite database held in memory is still SqliteAtClientStorage(..., dbPath: SqliteAtClientStorage.inMemoryPath).
  • chore: AtClientPreference.hiveStoragePath is 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.signingKeys throws AtKeyNotFoundException when 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 _apsk that names no active signing key is not published.
  • breaking: AtClientPreference.isLocalStoreRequired, privateKey, useAtChops, signingAlgoType and hashingAlgoType are removed. A client is given its storage, and signs with the keys in its AtKeysIo, which name the algorithm.
  • breaking: at_client.dart no longer exports LocalSecondary or RemoteSecondary, which an app should not need; getLocalSecondary() and getRemoteSecondary() remain, not for application use.
  • breaking: AtClientPreference.syncIntervalMins is removed; it set nothing, and sync's fallback timer runs every 30 seconds.
  • breaking: RemoteSecondary's signingAlgoType parameter and PutRequestOptions.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.anchoring says 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: Enrollment carries the enrollment's authentication public key, as apkamPublicKey.
  • feat: a denied enrollment is refused with the new cause AtConnectionCause.enrollmentDenied, and enrollmentNotApproved means one not yet approved. AtCredentialRefusedException says which.
  • breaking: PqStartupGates.publishChainLink is removed, PqStartupGates.publishRootLink is renamed anchorOwnKeys, and PqSigningChain's methods are replaced.
  • fix: selfRetrofit closes the atLookUp it 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: selfRetrofit given no atLookUp submits through the secondaryAddressFinder it is given, as the client it opens does.
  • fix: AtRpc and AtRpcClient log 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 keyEstablishmentAlgorithms stops naming an algorithm, the client treats that algorithm's key as retired at once, not from its next start. AtClientSecretSharing.heldStatuses gives 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 __manage key is reachable, and every enrollment reads __atserver and 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 carry enroll: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: Enrollment reports the key expiry a request asked for, as apkamKeysExpiryDuration (zero or less for none, null when the atServer does not say), and when its record expires, as expiresAt.
  • feat: client.enrollments.approve returns the approved enrollment as the atServer now holds it, including when it expires.

3.15.0-rc7 #

  • feat: tryAcquireServerMutex takes 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 with enableRequestMutex handles no requests.
  • fix: PublishedNskeyKeyRing and PqSigningRoot refuse a lockTtl over 15 minutes when built.
  • feat: each storage backend has its own import: HiveAtClientStorage comes from package:at_client/hive.dart and InMemoryAtClientStorage from package:at_client/memory.dart, no longer from at_client.dart and sqlite.dart.
  • fix: a client with isLocalStoreRequired false and no storage is refused, as the flag's deprecation says; pass one such as InMemoryAtClientStorage. Storage an app passes is now always used.
  • fix: a client built on the deprecated localSecondaryKeyStore with no hiveStoragePath is refused; set the path, or pass a storage. With the path set it is built whatever isLocalStoreRequired says.
  • fix: a client passed neither storage nor hiveStoragePath is refused with the same ArgumentError as the other cases.
  • fix: AtClientManager.setCurrentAtSign refuses 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 a StateError instead of sharing it, which could hang an open or close the other client's queue.
  • fix: Atsign.activate and PendingEnrollment.client refuse 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 localSecondaryKeyStore closes 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's localSecondaryKeyStore and AtClient.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.app under app.
  • 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). rotateCkAfterOneWeek and neverRotateNskey remain 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 shouldDecrypt each receive notifications as they asked; the second no longer shares the first one's stream and setting.
  • fix: AtRpc answers 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: get decrypts data that at_client 3.0.10 to 3.2.1 wrote, which from 3.13.0 came back still encrypted.
  • fix: a get, put or notification whose shared key does not unwrap under this atSign's key throws an AtException, as other decryption failures do, not an ArgumentError.
  • 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, checkAtSignServer and AtSignLogger come through package: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 the AtKey that read it can still be read. A device a 3.15.0 prerelease left in that state recovers, except for an app's own local: 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.init itself.
  • fix: after an upgrade from 3.14.0, Atsign.open refused 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 AtChops and no key source, as at_onboarding_cli 1.x builds one, uses the keys that AtChops holds 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: readBy and wasMarkedReadByMe count a read receipt this client sent before a restart, so markReadByMe no 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 a ttr or 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.awaitApproval on 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 the cryptoProviderId of NotificationService.send or AtClientBindings.notify (new there), lets an app answer in the scheme it was asked in. A class that overrides AtClientBindings.notify must add the parameter.
  • feat: an AtRpc request can name its cryptoProviderId, and an AtRpc server answers each request in the scheme it arrived in.
  • fix: an AtRpc reply 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 AtRpc requests, from one client or several, no longer share a request id, which could drop one or hand a caller another's response.
  • fix: an AtKey reused for several puts or notifications carries nothing over from one to the next.
  • fix: a value an app encrypts itself and puts with shouldEncrypt: false is stored as given and treated as plain: the put drops isEncrypted, ivNonce and the other encryption fields an app sets on the key's metadata.
  • fix: a provider id set in a key's appMetadata no longer chooses the provider for a notification the SDK encrypts; pass cryptoProviderId.
  • fix: a noCommit put 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 logs Heartbeat 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: AtClientInvitations in at_client_mixins.dart, also as the Invitations mixin. 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 remoteLocalPref sends to the atServer now sends its content key there too, so the atSign's other clients can read it.
  • fix: listing an AtCollection that 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.publicKeyCacheSettings no longer takes resetOnLookup; 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 showHiddenKeys lists them.
  • fix: a read of a record whose name ends in the app's namespace no longer reads a different record.
  • fix: ensureReachable on a client with no AtKeysIo no longer publishes a key only that process could open. It answers AtReachability.noKeySource, which an exhaustive switch must now handle.

3.15.0-rc1 #

  • feat (experimental): post-quantum cryptography, chosen by AtClientPreference.posture (PqPosture.legacy, the default, pqReady or pqActive): 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) and authenticatesAs. client.enrollments lists, approves, denies and revokes, and issues OTPs and SPPs. buildAtClient(...) builds a client, and AtClientManager.getInstance().use(client) makes it current.
  • feat: pluggable local storage: AtClientStorage, defaulting to HiveAtClientStorage, with SqliteAtClientStorage and InMemoryAtClientStorage in package:at_client/sqlite.dart.
  • feat: client.connection reports online, offline or refused; attempt() and awaitOnline() 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 throws ArgumentError for a name with no dot; namespace is deprecated in favour of idAndNamespace.
  • 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 appMetadata and immutable, expired records are reclaimed, and AtCollection no longer duplicates, misses or deletes live items.
  • fix: authenticated connections send clientConfig again, AtClientImpl.create refuses a storage its cached client doesn't hold, and closing a storage no longer races a concurrent attach.
  • deprecated, to be removed in 4.0: AtClientManager.setCurrentAtSign and fromAuthSession; AtClient.atChops; AtClientPreference.decryptPackets, tlsKeysSavePath, pathToCerts, hiveStoragePath and commitLogPath.
  • build: requires at_auth ^4.0.0-rc2, at_lookup ^3.7.0-rc2, at_commons ^5.18.0, at_chops ^3.6.0 and at_persistence_secondary_server ^5.3.0.

3.14.0 #

  • feat (experimental): per-APKAM same-atSign secret-sharing substrate — AtClientSecretSharing / PairwiseSecretSharing (mixins KeyPackageRegistration, EnvelopeSigning), SecretStore, KeyPackage, SecretEnvelope, and the EnrollmentDirectory seam. Secrets travel in X-Wing-sealed (pqSeal), APKAM-signed __ssenv envelopes addressed by kpid; key packages are enrollment-internal (conveyed via enroll:request, discovered via the gated enroll:listns verb) and never published. The whole surface is @experimental — the wire shape is subject to change pending the atServer verb work — and requires at_chops ^3.3.0 (pqSeal/pqOpen).

3.13.0 #

  • feat: add AtClientPreference.networkTimeout — when set on the preference used to create an AtClient, 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 misnamed outboundConnectionTimeout (a socket idle time). Requires at_commons ^5.13.0 (#1923).
  • chore(deps): at_lookup: ^3.6.0, at_auth: ^3.2.0 — the bounded socket connects and the deadline-driven validateAtServer live in those versions; with older ones resolved, networkTimeout would set a policy nothing reads.
  • refactor: migrate the local keystore to at_persistence_secondary_server 5.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's nextExpiresAt / peekNewlyAvailable surface. Requires at_persistence_secondary_server ^5.0.0.
  • deprecated: AtClient.startCompactionJob and AtClient.stopCompactionJob are 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: FileTransferService and FileTransferObject are now marked @Deprecated. The SDK file-sharing API (uploadFile / downloadFile / shareFiles / reuploadFiles) has moved to the app layer and will be removed, along with the archive dependency, in the next major version (#1113).
  • chore(deps): remove the unused cron dependency — it was only used by the commit-log compaction that the at_persistence_secondary_server 5.0.0 migration removed, and nothing in the client imports it (#1378). uuid is 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) notify method.
  • feat: added factory AtRpc.server to make it much simpler to create AtRpc servers.
  • feat: added preference-time crypto provider configuration via AtClientPreference.crypto, CryptoConfig, and CryptoProvider.
  • feat: added CryptoStorage to provider context for provider-owned local / remote state, plus CryptoPolicy.onProviderNotFound for 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 CSubItemUpdated events that surfaced under EventSource.notifs (and EventSource.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 atClientManager param 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-start serverCommitId snapshot 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 @experimental annotation from AtRpc and AtCollection
  • chore: added // ignore: experimental_member_use for 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 enableRequestMutex flag that controls it.

3.8.0 #

  • feat: add optional useRemoteAtServer flag to AtClient getKeys and getAtKeys so that apps can ask to fetch directly from atServer rather than the local datastore.
  • fix: set isClient to true and isServer to 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 ProtocolEmitted and 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 notify requests aren't messed up by multipart namespaces in AtClientPreference (e.g. namespace of foo.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 atLookUp parameter 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:publickey of 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 in AtCollectionQueryOperationsImpl
  • 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 local key, 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 data e.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 encryptValue to 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 allowAll flag (defaults to false) to AtRpc

3.1.0 #

  • feat: add useRemoteAtServer flag to GetRequestOptions to allow clients to fetch directly from the atServer rather than the client-side synced cache. This flag was added to PutRequestOptions and DeleteRequestOptions in version 3.0.60
  • fix: Ensure that NotificationResponseTransformer does not attempt to decrypt when atNotification.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

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 useRemoteAtServer to PutRequestOptions. When set, the update request will be sent directly to the remote atServer
  • feat: Introduce DeleteRequestOptions
    • Add new optional named parameter deleteRequestOptions to AtClient.delete
    • Add useRemoteAtServer to DeleteRequestOptions. When set, the delete request will be sent directly to the remote atServer
  • 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.dart to provide access to the RequestOptions and GetRequestOptions classes.

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._checkConflict method 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
13
likes
160
points
16.7k
downloads

Documentation

Documentation
API reference

Publisher

verified publisheratsign.org

Weekly Downloads

The at_client library is the non-platform specific Client SDK which provides the essential methods for building an app using the atProtocol.

Homepage
Repository (GitHub)
View/report issues
Contributing

License

BSD-3-Clause (license)

Dependencies

at_auth, at_base2e15, at_chops, at_commons, at_lookup, at_persistence_secondary_server, at_utils, collection, crypto, crypton, encrypt, hive, meta, mutex, path, uuid

More

Packages that depend on at_client