Repository navigation
v5.0.0
-
Breaking: one rotation entry point publishes every due prekey in one
publication.SignalProtocolClient.rotatePreKeys()replaces
rotateEcSignedPreKey()androtateKyberPreKey(). It reads the prekey
inventory once per identity type, decides which keys are due (the EC signed
prekey and the Kyber last-resort prekey by the 2-day rule, the one-time sets
by the refill threshold of 10), and publishes every due key in one
uploadPreKeyscall. It returns aPreKeyRotationResult
(signedRotated,kyberRotated,oneTimeReplenished,errors).
rotateKeysHeadlessanduseKeyRotationcall the same entry point;
HeadlessRotationResultis gone. The relay contract gains
publishPlannedPreKeys(userId, deviceId, plan, identityType?)with the
PreKeyPublicationPlantype: the adapter reads the inventory, the plan
decides the uploads, and an empty plan publishes nothing. The
SignalProtocolRelayServermethodsuploadEcSignedPreKeyand
uploadKemLastResortPreKey, the Convex mutations of the same names, the
EcSignedPreKeyUploadandKemLastResortPreKeyUploadtypes, and the
rotateEcSignedPreKeyCore,rotateKyberPreKeyCore, and
replenishOneTimePreKeysCorefunctions are gone.checkRotationNeededand
the pre-sendensurePreKeysValidcheck read the inventory once. On the
hosted transport a rotation with nothing due makes one HTTP call (the status
read) and a rotation that publishes makes three (status, publish, status);
before, a full rotation made eight and a check with nothing due made two. -
A one-time prekey refill keeps retained private keys and refills each
set on its own count.replenishOneTimePreKeysCoreand the server sync
share one refill owner,client/one-time-prekey-refill.ts. It checks the EC
and KEM server counts separately against the threshold of 10, marks a set
replaced only when it makes a new batch of that type, starts every batch at
the highest local ID plus one (retained replaced keys included), and returns
both batches for one upload. Before, the rotation core checked only the EC
count, marked both sets replaced, uploaded no KEM keys, and generated every
EC batch at IDs 0 to 99, so each refill overwrote the private keys that a
peer could still address. The rotation cores androtateKeysHeadless
default to the active identity types (['aci']unless PNI keys are
enabled) instead of['aci', 'pni']. The Expo store rejects a one-time
prekey that reuses a stored ID instead of overwriting the row. -
Breaking: the SDK reports no device presence.
useConnectionPresence
and itshooks/use-connection-presencesubpath, the
SignalProtocolRelayServermethodsmarkDeviceConnected,
markDeviceDisconnected, andheartbeat, and theactiveandlastSeen
device fields are gone from every adapter, together with the Convex
deviceHeartbeatstable and thepresenceHeartbeatfunction. The hosted
mailbox subscription sends the text framepingevery 30 seconds while its
socket is open, treats the Relay'spongas no frame, and reconnects
through its normal path after two unanswered pings.getDeviceson the
hosted transport carrieslastSeenAt(Unix milliseconds, ornullbefore
the first connection) for the caller's own account. -
An ephemeral send no longer reports an offline recipient. The Relay
accepts anephemeraldelivery to a device with no live connection and
drops it, with the same response as an online delivery. The hosted
anonymous delivery path no longer classifiesRECIPIENT_OFFLINE; a Relay
that still answers it surfaces asDELIVERY_FAILED. No sender can learn
whether a recipient is connected from a delivery response. -
Documentation names
DefaultSignalProtocolClientfor class-only members.
JSDoc examples in the client configuration, theRemote object storage not configurederror text, and the media, safety, and package-surface documents
nameDefaultSignalProtocolClientforcreate,verify,media,receive,
andprocessIncomingEnvelopes, which exist on the class and not on the
SignalProtocolClientinterface. The generated API reference follows. -
A durable hosted send repeats one uncertain delivery. When the Relay
answers auser-visibleorbackground-syncdelivery with 503
DELIVERY_UNCERTAIN, the hosted transport and the anonymous delivery path
post the identical request once more under the same message identifier
before the error reaches the caller. Anephemeraldelivery is not
repeated.HostedRelayHttpErrorcarries the Relay'sretryablehint, and
its constructor takes{ data, retryable }options in place of a bare
dataargument.