@plane31/blind-relay 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/README.md +29 -1
  2. package/dist/adapters/index.d.ts +4 -0
  3. package/dist/adapters/index.d.ts.map +1 -1
  4. package/dist/adapters/index.js +5 -0
  5. package/dist/adapters/index.js.map +1 -1
  6. package/dist/client.d.ts +33 -1
  7. package/dist/client.d.ts.map +1 -1
  8. package/dist/client.js +76 -13
  9. package/dist/client.js.map +1 -1
  10. package/dist/crypto/sodium.d.ts.map +1 -1
  11. package/dist/crypto/sodium.js +3 -33
  12. package/dist/crypto/sodium.js.map +1 -1
  13. package/dist/crypto/sodiumLike.d.ts +39 -0
  14. package/dist/crypto/sodiumLike.d.ts.map +1 -0
  15. package/dist/crypto/sodiumLike.js +142 -0
  16. package/dist/crypto/sodiumLike.js.map +1 -0
  17. package/dist/errors.d.ts +6 -2
  18. package/dist/errors.d.ts.map +1 -1
  19. package/dist/errors.js +5 -1
  20. package/dist/errors.js.map +1 -1
  21. package/dist/inbox.d.ts +4 -0
  22. package/dist/inbox.d.ts.map +1 -1
  23. package/dist/inbox.js +22 -14
  24. package/dist/inbox.js.map +1 -1
  25. package/dist/index.d.ts +1 -1
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js.map +1 -1
  28. package/dist/outbox.d.ts +5 -0
  29. package/dist/outbox.d.ts.map +1 -1
  30. package/dist/outbox.js +6 -3
  31. package/dist/outbox.js.map +1 -1
  32. package/dist/testing/faults.d.ts +5 -0
  33. package/dist/testing/faults.d.ts.map +1 -1
  34. package/dist/testing/faults.js +13 -0
  35. package/dist/testing/faults.js.map +1 -1
  36. package/package.json +1 -1
  37. package/src/adapters/index.ts +6 -0
  38. package/src/client.ts +107 -13
  39. package/src/crypto/sodium.ts +4 -33
  40. package/src/crypto/sodiumLike.ts +169 -0
  41. package/src/errors.ts +6 -1
  42. package/src/inbox.ts +24 -13
  43. package/src/index.ts +2 -1
  44. package/src/outbox.ts +9 -3
  45. package/src/testing/faults.ts +17 -0
package/README.md CHANGED
@@ -13,10 +13,38 @@ pnpm add @plane31/blind-relay
13
13
  - `@plane31/blind-relay`: `open` and the `Client` with `enqueue`, `newest`, `historyPage`, `sync`, the circles API, `subscribe` and `inspect`; the `KindDeclaration` and `RetentionPolicy` a product passes to `open`; `KavachError` and `ErrorCode`; the `RecoveryProvider` contract; `toHex`, `fromHex` and `equalBytes`.
14
14
  - `@plane31/blind-relay/adapters`: the `Store`, `Tx`, `SecretStore`, `Transport`, `Directory` and `Relay` contracts an adapter or host implements, with the table and row types; `MemoryStore` and `MemorySecretStore` as the behavioural reference; the signed-document codec a host verifies with; `buildResetKeyList` and `buildResetReceipt` for a host's key tooling.
15
15
  - `@plane31/blind-relay/testing`: the fault harness (a fake host, a crashing store, a malicious transport, the crash and lost-response sweeps) and the fixtures a test builds protocol state with.
16
- - `@plane31/blind-relay/sodium`: the optional libsodium backend for Node; the default backend is portable JavaScript, which is what Hermes needs.
16
+ - `@plane31/blind-relay/sodium`: the optional libsodium backend for Node (wasm). The default backend is portable JavaScript; `sodiumBackend(sodium)` from the adapters entry builds the libsodium backend over any object with libsodium's API, which is how a phone runs the cipher suite natively (`@plane31/blind-relay-expo` wires `react-native-libsodium` through `openKavach`'s `crypto` option).
17
17
 
18
18
  Randomness comes from the Web Crypto global. A runtime without one (Hermes) installs it first; `@plane31/blind-relay-expo` does that from `expo-crypto`.
19
19
 
20
+ ## Using it well
21
+
22
+ **A heartbeat is an empty record of a slot kind.** To say "still here" without publishing anything, declare a kind with `queue: "latestWins"`, `history: false`, `newest: true` and `headerClass: 2` (silent: no notification, no wake-up), and enqueue it with an empty payload. It is still end-to-end encrypted and peer-authenticated, costs about 160 bytes on the wire, collapses in the outbox when several are queued, is kept as one slot row per author on the reader with no history, and is deleted by the relay once every reader has it. There is no separate presence primitive, on purpose: anything peers could not authenticate would be the first such thing in the protocol.
23
+
24
+ **High-frequency transient signals are slot kinds too.** Live position, speed, heading, battery: declare the kind `latestWins` with `history: false`, and only the newest frame per author is stored; the relay keeps a frame only until every reader has it. Nothing in the host needs to overwrite records in place, and nothing could, since the relay cannot open them or know who already holds one. The record counter stays monotonic because replay protection depends on it; it costs nothing.
25
+
26
+ **Short background windows.** `sync({ catchUp: { maxRecords, maxMs }, skipMaintenance: true })` reads within a budget and leaves the retention purge, the periodic reset-key-list re-check and the recovery-key re-save to the next foreground sync (`report.maintenance` says which). `syncUntilDrained({ maxRounds, maxMs, skipMaintenance })` runs rounds within a soft time bound and says why it stopped. `report.timings` gives wall-clock milliseconds per phase and the bytes moved, so a budget overrun can be attributed. Opening the encrypted store in a fresh background context is the platform's cost, not the SDK's; measure it separately.
27
+
28
+ **What to do on each error.** `KavachError.code` is a closed union and `retryable` says whether the same call may succeed later unchanged; `stage` is for logs, never for branching.
29
+
30
+ | Code | Meaning | What the app does |
31
+ | --- | --- | --- |
32
+ | `NETWORK` | The host could not be reached or did not answer in time | Nothing now; retry on the next wake |
33
+ | `RATE_LIMITED` | The host asked for a pause; `retryAfterMs` says how long when it said | Back off at least that long |
34
+ | `LOCKED` | Another context holds the store, or a background task found no storage key yet | Retry later; the foreground provisions the key |
35
+ | `CLOSED` | The client was closed | Open a new one |
36
+ | `SUPERSEDED_DEVICE` | Another phone is the account's device now; the state is `retired` | Sign the user out of this phone; offer to set it up again |
37
+ | `ACCOUNT_RECOVERY_REQUIRED` | No account on this device, or recovery found nothing | Enroll, restore (continuity) or replace (recovery) |
38
+ | `AUTHORIZATION_REQUIRED` | The host refused the replacement authorization | Obtain a fresh one for the same proposal (`replaceDevice` does this) |
39
+ | `REPLACEMENT_CONFLICT` | The account moved under the proposal | Fresh sign-in, then `replaceDevice` again |
40
+ | `SUCCESSION_PENDING` | The replacement's outcome is unknown | Call again with the same proposal |
41
+ | `METADATA_REQUIRED`, `KEY_PENDING`, `RESET_KEYS_REQUIRED` | Something the host has not served yet | Nothing; the next sync retries |
42
+ | `ROTATION_REQUIRED`, `QUEUE_FULL` | The outbox cannot take this record now | Sync, then enqueue again |
43
+ | `EQUIVOCATION`, `ROLLBACK`, `BAD_SIGNATURE`, `ACCOUNT_KEY_CHANGED` | The host or a peer served something that does not verify | Show the security notice the profile defines; do not retry blindly |
44
+ | `RECOVERY_REQUIRED` | The local store and the secret store no longer match | Erase the account from the device and set it up again |
45
+
46
+ Waiting on another person is not an error: `ClientState.waitingFor` lists authors whose current epoch has not reached this device yet, and the `waiting` event fires as it happens.
47
+
20
48
  ## Development
21
49
 
22
50
  ```
@@ -9,6 +9,10 @@
9
9
  */
10
10
  export { Reader, Writer, compareBytes, concat, equalBytes, fromHex, toHex, u16, u32, u64 } from "../bytes.js";
11
11
  export { bodyHash, identityId, randomBytes, ready, recordId, signingKeypairFromSeed, streamId, type SigningKeypair } from "../crypto.js";
12
+ export { nobleBackend } from "../crypto/noble.js";
13
+ export { backendName } from "../crypto.js";
14
+ export { buildSodiumBackend, sodiumBackend, type SodiumBackendReport, type SodiumLike } from "../crypto/sodiumLike.js";
15
+ export type { CryptoBackend } from "../crypto/backend.js";
12
16
  export { KavachError, isKavachError, type ErrorCode } from "../errors.js";
13
17
  export { DocumentType, buildResetKeyList, buildResetReceipt, buildSuccession, expectType, parseDocument, parseVaultHeader, verifyDocument, type AccountDevice, type AccountResetReceipt, type AccountSuccession, type CircleSnapshot, type EncryptedRecord, type EpochManifest, type Parsed, type ResetKeyEntry, type ResetKeyList, type SignedDocument, type VaultHeader } from "../codec.js";
14
18
  export { MemorySecretStore, MemoryStore, invokeSync, type ActivationRow, type CertificateRow, type CircleRow, type ClockRow, type EpochRow, type EpochStatus, type HistoryRow, type NewestRow, type MemoryStoreOptions, type MetaRow, type OutboxRow, type OutboxStatus, type EnqueueKeyRow, type HistoryIndexRow, type SuccessionRow, type IdentityRow, type KeyChangeRow, type ReplacementRow, type PreferenceRow, type ChainProgressRow, type KeyRange, inKeyRange, type PendingResetRow, type PinRow, type QuarantineRow, type ReaderEpochRow, type ResetListRow, type ResetReceiptRow, type RevisionRow, type SecretName, type SecretStore, type SelfRow, type Store, type StoreState, type StreamRow, type SubscriptionRow, type TableName, type Tables, type Tx, type UnresolvedRow, type VaultRow } from "../store.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAG9G,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,sBAAsB,EAAE,QAAQ,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAGzI,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAG1E,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,MAAM,EACX,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,iBAAiB,EACjB,WAAW,EACX,UAAU,EACV,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,kBAAkB,EACvB,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,QAAQ,EACb,UAAU,EACV,KAAK,eAAe,EACpB,KAAK,MAAM,EACX,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,KAAK,KAAK,EACV,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,MAAM,EACX,KAAK,EAAE,EACP,KAAK,aAAa,EAClB,KAAK,QAAQ,EACd,MAAM,aAAa,CAAC;AAGrB,YAAY,EACV,aAAa,EACb,YAAY,EACZ,aAAa,EACb,UAAU,EACV,SAAS,EACT,WAAW,EACX,WAAW,EACX,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,KAAK,EACL,eAAe,EACf,cAAc,EACd,cAAc,EACd,SAAS,EACV,MAAM,iBAAiB,CAAC;AAGzB,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,cAAc,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG/I,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACpI,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAG9G,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,sBAAsB,EAAE,QAAQ,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAGzI,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,KAAK,mBAAmB,EAAE,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACvH,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAG1D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAG1E,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,MAAM,EACX,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,iBAAiB,EACjB,WAAW,EACX,UAAU,EACV,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,kBAAkB,EACvB,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,QAAQ,EACb,UAAU,EACV,KAAK,eAAe,EACpB,KAAK,MAAM,EACX,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,KAAK,KAAK,EACV,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,MAAM,EACX,KAAK,EAAE,EACP,KAAK,aAAa,EAClB,KAAK,QAAQ,EACd,MAAM,aAAa,CAAC;AAGrB,YAAY,EACV,aAAa,EACb,YAAY,EACZ,aAAa,EACb,UAAU,EACV,SAAS,EACT,WAAW,EACX,WAAW,EACX,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,KAAK,EACL,eAAe,EACf,cAAc,EACd,cAAc,EACd,SAAS,EACV,MAAM,iBAAiB,CAAC;AAGzB,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,cAAc,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG/I,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACpI,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
@@ -11,6 +11,11 @@
11
11
  export { Reader, Writer, compareBytes, concat, equalBytes, fromHex, toHex, u16, u32, u64 } from "../bytes.js";
12
12
  // Cipher suite: readiness, randomness and the identifiers a host derives --------------------------
13
13
  export { bodyHash, identityId, randomBytes, ready, recordId, signingKeypairFromSeed, streamId } from "../crypto.js";
14
+ // Cipher-suite backends: the portable one, and a libsodium one over any object with libsodium's API
15
+ // (a native binding on a phone). `setCryptoBackend` is on the main entry.
16
+ export { nobleBackend } from "../crypto/noble.js";
17
+ export { backendName } from "../crypto.js";
18
+ export { buildSodiumBackend, sodiumBackend } from "../crypto/sodiumLike.js";
14
19
  // Errors -------------------------------------------------------------------------------------------
15
20
  export { KavachError, isKavachError } from "../errors.js";
16
21
  // Signed documents, as a host or transport sees them ----------------------------------------------
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,qGAAqG;AACrG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAE9G,oGAAoG;AACpG,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,sBAAsB,EAAE,QAAQ,EAAuB,MAAM,cAAc,CAAC;AAEzI,qGAAqG;AACrG,OAAO,EAAE,WAAW,EAAE,aAAa,EAAkB,MAAM,cAAc,CAAC;AAE1E,oGAAoG;AACpG,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,cAAc,EAYf,MAAM,aAAa,CAAC;AAErB,qGAAqG;AACrG,OAAO,EACL,iBAAiB,EACjB,WAAW,EACX,UAAU,EAsBV,UAAU,EAoBX,MAAM,aAAa,CAAC;AAyBrB,oGAAoG;AACpG,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAuC,MAAM,oBAAoB,CAAC;AACpI,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,qGAAqG;AACrG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAE9G,oGAAoG;AACpG,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,sBAAsB,EAAE,QAAQ,EAAuB,MAAM,cAAc,CAAC;AACzI,oGAAoG;AACpG,0EAA0E;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAA6C,MAAM,yBAAyB,CAAC;AAGvH,qGAAqG;AACrG,OAAO,EAAE,WAAW,EAAE,aAAa,EAAkB,MAAM,cAAc,CAAC;AAE1E,oGAAoG;AACpG,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,cAAc,EAYf,MAAM,aAAa,CAAC;AAErB,qGAAqG;AACrG,OAAO,EACL,iBAAiB,EACjB,WAAW,EACX,UAAU,EAsBV,UAAU,EAoBX,MAAM,aAAa,CAAC;AAyBrB,oGAAoG;AACpG,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAuC,MAAM,oBAAoB,CAAC;AACpI,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
package/dist/client.d.ts CHANGED
@@ -268,6 +268,7 @@ export type ReplaceDeviceResult = {
268
268
  };
269
269
  export interface DrainOptions {
270
270
  readonly catchUp?: SyncOptions["catchUp"];
271
+ readonly skipMaintenance?: boolean;
271
272
  /** Rounds at most. Default 10. */
272
273
  readonly maxRounds?: number;
273
274
  /** A soft bound in milliseconds across every round: no round starts past it and each round's reading budget is the time left, but a transport call already in flight ends on its own timeout. Default 30,000. */
@@ -283,7 +284,9 @@ export type DrainStop =
283
284
  /** Progress needs an authorization or a sign-in (a prepared replacement, an account to recover). */
284
285
  | "authentication"
285
286
  /** Nothing more is reported, but a round could not read its inbox fully (discovery or a stream failed), so emptiness is not established. */
286
- | "incomplete" | "closed";
287
+ | "incomplete"
288
+ /** The host asked for a pause; `remaining.retryAfterMs` says how long, and the product schedules the next attempt. */
289
+ | "rateLimited" | "closed";
287
290
  /** The merged report of every round, with why the loop stopped and what remains. */
288
291
  export interface DrainReport extends SyncReport {
289
292
  readonly rounds: number;
@@ -297,6 +300,8 @@ export interface DrainReport extends SyncReport {
297
300
  readonly chainsIncomplete: number;
298
301
  /** Authors whose current epoch has not reached this device: nothing to do but wait for them. */
299
302
  readonly waitingFor: number;
303
+ /** On `rateLimited`: the longest wait the host asked for in the last round, when it said one. */
304
+ readonly retryAfterMs?: number;
300
305
  };
301
306
  }
302
307
  export interface SyncOptions {
@@ -310,6 +315,12 @@ export interface SyncOptions {
310
315
  readonly maxRecords?: number;
311
316
  readonly maxMs?: number;
312
317
  };
318
+ /**
319
+ * Leave the housekeeping to a later sync: the retention purge, the periodic re-check of the
320
+ * reset-key list (a stale list is still fetched, since verification needs it) and the
321
+ * recovery-key re-save. For a short background window; the report says `maintenance: "skipped"`.
322
+ */
323
+ readonly skipMaintenance?: boolean;
313
324
  }
314
325
  export declare const DEFAULT_CATCH_UP: {
315
326
  readonly maxRecords: 500;
@@ -342,14 +353,33 @@ export interface SyncReport {
342
353
  hasMore: boolean;
343
354
  };
344
355
  purged: number;
356
+ /** Whether this sync did its housekeeping (purge, list re-check, key re-save) or left it to a later one. */
357
+ maintenance: "done" | "skipped";
345
358
  /** Present while account recovery discovers circles through the host: pinned, pending and failed on this sync. */
346
359
  bootstrap?: {
347
360
  circles: number;
348
361
  pending: number;
349
362
  failed: number;
350
363
  };
364
+ /** Wall-clock milliseconds per phase and record bytes moved, for diagnostics (section 14: counts and durations only). */
365
+ timings: SyncTimings;
351
366
  errors: SyncError[];
352
367
  }
368
+ export interface SyncTimings {
369
+ resume: number;
370
+ bootstrap: number;
371
+ metadata: number;
372
+ preferences: number;
373
+ epoch: number;
374
+ outbox: number;
375
+ inbox: number;
376
+ maintenance: number;
377
+ total: number;
378
+ /** Record bytes handed to the relay. */
379
+ bytesSent: number;
380
+ /** Record bytes read from the relay. */
381
+ bytesReceived: number;
382
+ }
353
383
  /** What `prepareReplacement()` returns: everything the product hands to the host for authorization. All public. */
354
384
  export interface ReplacementProposal {
355
385
  readonly successionId: Uint8Array;
@@ -385,6 +415,8 @@ export interface SyncError {
385
415
  readonly authorIdentityId?: Uint8Array;
386
416
  /** On a `bootstrap` entry: the circle that could not be adopted on this sync; it is retried by the next. */
387
417
  readonly circleId?: Uint8Array;
418
+ /** On a `RATE_LIMITED` entry: the wait the host asked for, when it said. */
419
+ readonly retryAfterMs?: number;
388
420
  }
389
421
  export declare function open(options: OpenOptions): Promise<Client>;
390
422
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAOA,OAAO,EAA0G,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AACvJ,OAAO,EAA8I,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAGzL,OAAO,EAA8B,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAGzE,OAAO,EAA2I,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,KAAK,MAAM,EAAmB,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAC/Q,OAAO,EAA0D,KAAK,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAC7H,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,2GAA2G;AAC3G,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AACD,OAAO,EAA+D,KAAK,gBAAgB,EAAwB,MAAM,aAAa,CAAC;AACvI,OAAO,EAAc,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE/D,OAAO,KAAK,EAA0E,WAAW,EAAE,KAAK,EAAgB,MAAM,YAAY,CAAC;AAG3I,OAAO,KAAK,EAAmC,eAAe,EAAkB,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAClH,OAAO,EAAuG,KAAK,oBAAoB,EAAE,KAAK,gBAAgB,EAAmB,MAAM,YAAY,CAAC;AAEpM,kFAAkF;AAClF,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAqBjG,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,qBAAqB,GAAG,OAAO,GAAG,QAAQ,GAAG,yBAAyB,GAAG,mBAAmB,GAAG,SAAS,GAAG,QAAQ,GAAG,aAAa,CAAC;AACzK,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,CAAC;AAMrE,+GAA+G;AAC/G,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,eAAe,GAAG,UAAU,CAKhE;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;IACzC,6FAA6F;IAC7F,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,SAAS,CAAC;IAC5C,yFAAyF;IACzF,QAAQ,CAAC,aAAa,EAAE,UAAU,GAAG,SAAS,CAAC;IAC/C,QAAQ,CAAC,eAAe,EAAE,UAAU,GAAG,SAAS,CAAC;IACjD,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,mEAAmE;IACnE,QAAQ,CAAC,UAAU,EAAE,SAAS,UAAU,EAAE,CAAC;IAC3C,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;CAC5C;AAED,4FAA4F;AAC5F,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,SAAS,CAAC;IAC5C,QAAQ,CAAC,aAAa,EAAE,UAAU,GAAG,SAAS,CAAC;IAC/C,0EAA0E;IAC1E,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAC5C,2GAA2G;IAC3G,QAAQ,CAAC,WAAW,EAAE;QAAE,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC;QAAC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,GAAG,SAAS,CAAC;IACvL,yDAAyD;IACzD,QAAQ,CAAC,SAAS,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS,CAAC;IACpG,QAAQ,CAAC,eAAe,EAAE,UAAU,GAAG,SAAS,CAAC;IACjD,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,6DAA6D;IAC7D,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS,CAAC;CAC/G;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,UAAU,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IACvC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,UAAU,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE;AACvE,uIAAuI;GACrI;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,UAAU,CAAA;CAAE,GAChE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,UAAU,CAAA;CAAE;AAC5C,oHAAoH;GAClH;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,UAAU,EAAE,UAAU,CAAC;IAAC,gBAAgB,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GACvH;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,UAAU,EAAE,UAAU,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,UAAU,CAAC;IAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAC/E;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAA;CAAE,GAChG;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,GACxE;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,CAAC;AAEjD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,8MAA8M;IAC9M,QAAQ,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IAC7C,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,gHAAgH;IAChH,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;CACzE;AAED,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;IACjC,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC9D,iBAAiB,IAAI,OAAO,CAAC;QAAE,UAAU,EAAE,UAAU,CAAA;KAAE,CAAC,CAAC;IACzD,cAAc,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAChD,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAChC,cAAc,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,UAAU,EAAE,UAAU,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/F;;;;OAIG;IACH,kBAAkB,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACnD;;;;;OAKG;IACH,mBAAmB,CAAC,KAAK,EAAE;QAAE,YAAY,EAAE,UAAU,CAAC;QAAC,aAAa,EAAE,UAAU,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,UAAU,EAAE,UAAU,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7I,oFAAoF;IACpF,UAAU,CAAC,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,UAAU,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC5F;;;;;;;OAOG;IACH,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC3E;;;;;OAKG;IACH,gBAAgB,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAC/D,+GAA+G;IAC/G,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACjG,gJAAgJ;IAChJ,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACjD,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAClD,kDAAkD;IAClD,OAAO,CAAC,KAAK,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IACvD,2FAA2F;IAC3F,WAAW,CAAC,KAAK,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACxD,gGAAgG;IAChG,WAAW,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,kBAAkB,GAAG,MAAM,CAAC,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAAC;IACxG,oHAAoH;IACpH,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC9E,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE;QAChB,MAAM,IAAI,OAAO,CAAC;YAAE,QAAQ,EAAE,UAAU,CAAA;SAAE,CAAC,CAAC;QAC5C,WAAW,CAAC,QAAQ,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE;YAAE,eAAe,CAAC,EAAE,OAAO,CAAA;SAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACvH,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;YAAE,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAClF,MAAM,CAAC,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE,UAAU,GAAG,OAAO,CAAC;YAAE,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC1F,KAAK,CAAC,QAAQ,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3C,UAAU,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAClE,WAAW,CAAC,QAAQ,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,IAAI,OAAO,CAAC,SAAS,aAAa,EAAE,CAAC,CAAC;KAC3C,CAAC;IACF,YAAY,CAAC,OAAO,EAAE;QAAE,SAAS,EAAE,IAAI,CAAC;QAAC,WAAW,CAAC,EAAE,UAAU,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,UAAU,EAAE,UAAU,CAAA;KAAE,CAAC,CAAC;IAC1G;;;;;OAKG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,kIAAkI;IAClI,QAAQ,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,mBAAmB,KAAK,OAAO,CAAC,UAAU,GAAG,gBAAgB,CAAC,CAAC;IAC9F,6FAA6F;IAC7F,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,MAAM,mBAAmB,GAC3B;IAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE;AAChG,gGAAgG;GAC9F;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAA;CAAE;AACxE,wHAAwH;GACtH;IAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE;AACjF,mGAAmG;GACjG;IAAE,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAA;CAAE,CAAC;AAElF,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IAC1C,kCAAkC;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,iNAAiN;IACjN,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,SAAS;AACnB,mDAAmD;AACjD,SAAS,GACT,WAAW,GACX,OAAO;AACT,8EAA8E;GAC5E,YAAY;AACd,kGAAkG;GAChG,UAAU;AACZ,oGAAoG;GAClG,gBAAgB;AAClB,4IAA4I;GAC1I,YAAY,GACZ,QAAQ,CAAC;AAEb,oFAAoF;AACpF,MAAM,WAAW,WAAY,SAAQ,UAAU;IAC7C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,EAAE,SAAS,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE;QAClB,8HAA8H;QAC9H,QAAQ,CAAC,YAAY,EAAE,OAAO,GAAG,SAAS,CAAC;QAC3C,kEAAkE;QAClE,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;QACtC,2GAA2G;QAC3G,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;QAClC,gGAAgG;QAChG,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;KAC7B,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9E;AAED,eAAO,MAAM,gBAAgB;;;CAA6C,CAAC;AAE3E,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IACnI,KAAK,EAAE,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;IACvD,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9F,iHAAiH;IACjH,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IACjH,MAAM,EAAE,MAAM,CAAC;IACf,kHAAkH;IAClH,SAAS,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB;AAED,mHAAmH;AACnH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;IAC/B,QAAQ,CAAC,uBAAuB,EAAE,UAAU,CAAC;IAC7C,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;CAClC;AAED,wFAAwF;AACxF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,kBAAkB,EAAE,UAAU,CAAC;IACxC,QAAQ,CAAC,aAAa,EAAE,UAAU,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC;IACxC,QAAQ,CAAC,YAAY,EAAE,UAAU,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,wIAAwI;AACxI,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,oBAAoB,GAAG,YAAY,CAAC;IAC/D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC;IAC/B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,UAAU,CAAC;IACvC,4GAA4G;IAC5G,QAAQ,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC;CAChC;AAQD,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAOhE"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js CHANGED
@@ -50,8 +50,16 @@ export function resolvedAccountId(r) {
50
50
  return pinFromCertificate(doc).identityId;
51
51
  }
52
52
  export const DEFAULT_CATCH_UP = { maxRecords: 500, maxMs: 5_000 };
53
+ const emptyTimings = () => ({ resume: 0, bootstrap: 0, metadata: 0, preferences: 0, epoch: 0, outbox: 0, inbox: 0, maintenance: 0, total: 0, bytesSent: 0, bytesReceived: 0 });
54
+ /** A monotonic wall clock for durations; the protocol clock (`now`) is not used, since a test drives it by hand. */
55
+ const wall = () => {
56
+ const g = globalThis;
57
+ return typeof g.performance?.now === "function" ? g.performance.now() : Date.now();
58
+ };
53
59
  function syncError(operation, e, extra = {}) {
54
- return e instanceof KavachError ? { operation, code: e.code, stage: e.stage, retryable: e.retryable, ...extra } : { operation, code: "UNEXPECTED", stage: operation, retryable: false, ...extra };
60
+ return e instanceof KavachError
61
+ ? { operation, code: e.code, stage: e.stage, retryable: e.retryable, ...(e.retryAfterMs === undefined ? {} : { retryAfterMs: e.retryAfterMs }), ...extra }
62
+ : { operation, code: "UNEXPECTED", stage: operation, retryable: false, ...extra };
55
63
  }
56
64
  const RESET_LIST_RECHECK_MS = 86400000n;
57
65
  export async function open(options) {
@@ -718,6 +726,8 @@ class ClientImpl {
718
726
  outbox: { sent: 0, accepted: 0, cancelled: 0, unknown: 0, retry: 0 },
719
727
  inbox: { streams: 0, stored: 0, keyPending: 0, invalid: 0, acked: 0, hasMore: false },
720
728
  purged: 0,
729
+ maintenance: options.skipMaintenance ? "skipped" : "done",
730
+ timings: emptyTimings(),
721
731
  errors: []
722
732
  };
723
733
  let rounds = 0;
@@ -743,7 +753,7 @@ class ClientImpl {
743
753
  break;
744
754
  }
745
755
  const roundMs = Math.max(0, Math.min(remainingMs, options.catchUp?.maxMs ?? DEFAULT_CATCH_UP.maxMs));
746
- const r = await this.sync({ catchUp: { maxMs: roundMs, ...(options.catchUp?.maxRecords !== undefined ? { maxRecords: options.catchUp.maxRecords } : {}) } });
756
+ const r = await this.sync({ catchUp: { maxMs: roundMs, ...(options.catchUp?.maxRecords !== undefined ? { maxRecords: options.catchUp.maxRecords } : {}) }, ...(options.skipMaintenance ? { skipMaintenance: true } : {}) });
747
757
  rounds++;
748
758
  last = r;
749
759
  // The round's work counts whether or not it was the last: what it accepted, stored and failed
@@ -758,6 +768,8 @@ class ClientImpl {
758
768
  merged.inbox.invalid += r.inbox.invalid;
759
769
  merged.inbox.acked += r.inbox.acked;
760
770
  merged.purged += r.purged;
771
+ for (const k of Object.keys(merged.timings))
772
+ merged.timings[k] += r.timings[k];
761
773
  merged.epoch = r.epoch;
762
774
  merged.errors.push(...r.errors);
763
775
  if (r.bootstrap)
@@ -767,6 +779,11 @@ class ClientImpl {
767
779
  stop = "closed";
768
780
  break;
769
781
  }
782
+ if (r.errors.some((e) => e.code === "RATE_LIMITED")) {
783
+ // The host asked for a pause: no further round now; the wait goes back to the product.
784
+ stop = "rateLimited";
785
+ break;
786
+ }
770
787
  const bootstrapIncomplete = (await this.inspect()).bootstrap?.complete === false;
771
788
  const currentChains = await chains();
772
789
  const more = r.inbox.hasMore || bootstrapIncomplete || currentChains.size > 0;
@@ -801,18 +818,42 @@ class ClientImpl {
801
818
  const bootstrapIncomplete = this.closed ? false : (await this.inspect()).bootstrap?.complete === false;
802
819
  const chainsIncomplete = this.closed ? previousChains.size : (await chains()).size;
803
820
  const waitingFor = this.closed ? 0 : (await this.getState()).waitingFor.length;
804
- const inboxHasMore = !last || inboxUncertain(last) || stop === "closed" ? "unknown" : merged.inbox.hasMore;
805
- return { ...merged, rounds, stoppedBecause: stop, remaining: { inboxHasMore, bootstrapIncomplete, chainsIncomplete, waitingFor } };
821
+ const inboxHasMore = !last || inboxUncertain(last) || stop === "closed" || stop === "rateLimited" ? "unknown" : merged.inbox.hasMore;
822
+ const waits = (last?.errors ?? []).flatMap((e) => (e.code === "RATE_LIMITED" && e.retryAfterMs !== undefined ? [e.retryAfterMs] : []));
823
+ const retryAfterMs = waits.length ? Math.max(...waits) : undefined;
824
+ return { ...merged, rounds, stoppedBecause: stop, remaining: { inboxHasMore, bootstrapIncomplete, chainsIncomplete, waitingFor, ...(retryAfterMs === undefined ? {} : { retryAfterMs }) } };
806
825
  }
807
826
  async runSync(options) {
827
+ const started = wall();
808
828
  const report = {
809
829
  metadata: { certificates: 0, snapshots: 0, rotations: 0, quarantined: 0, resets: 0, successions: 0 },
810
830
  epoch: "unchanged",
811
831
  outbox: { sent: 0, accepted: 0, cancelled: 0, unknown: 0, retry: 0 },
812
832
  inbox: { streams: 0, stored: 0, keyPending: 0, invalid: 0, acked: 0, hasMore: false },
813
833
  purged: 0,
834
+ maintenance: options.skipMaintenance ? "skipped" : "done",
835
+ timings: emptyTimings(),
814
836
  errors: []
815
837
  };
838
+ const maintain = !options.skipMaintenance;
839
+ let mark = started;
840
+ const phase = (name) => {
841
+ const now = wall();
842
+ report.timings[name] += now - mark;
843
+ mark = now;
844
+ };
845
+ const finish = () => {
846
+ report.timings.total = wall() - started;
847
+ return report;
848
+ };
849
+ try {
850
+ return await this.runSyncPhases(options, report, maintain, phase);
851
+ }
852
+ finally {
853
+ finish();
854
+ }
855
+ }
856
+ async runSyncPhases(options, report, maintain, phase) {
816
857
  this.syncBudget = {
817
858
  remainingRecords: Math.max(1, Math.floor(options.catchUp?.maxRecords ?? DEFAULT_CATCH_UP.maxRecords)),
818
859
  deadline: this.now() + BigInt(Math.max(0, Math.floor(options.catchUp?.maxMs ?? DEFAULT_CATCH_UP.maxMs)))
@@ -832,6 +873,7 @@ class ClientImpl {
832
873
  }
833
874
  }
834
875
  }
876
+ phase("resume");
835
877
  if (!this.account || !this.selfPin)
836
878
  return report;
837
879
  const meta = await this.store.read((tx) => tx.get("meta", META));
@@ -862,7 +904,10 @@ class ClientImpl {
862
904
  }
863
905
  else if (meta.state !== "ACTIVE")
864
906
  return report;
865
- await this.ensureBackup();
907
+ phase("resume");
908
+ if (maintain)
909
+ await this.ensureBackup();
910
+ phase("maintenance");
866
911
  if (meta.bootstrap && !meta.bootstrap.complete) {
867
912
  try {
868
913
  report.bootstrap = await this.bootstrap(report, meta.bootstrap);
@@ -871,18 +916,21 @@ class ClientImpl {
871
916
  report.errors.push(syncError("bootstrap", e));
872
917
  }
873
918
  }
919
+ phase("bootstrap");
874
920
  try {
875
- await this.syncMetadata(report);
921
+ await this.syncMetadata(report, maintain);
876
922
  }
877
923
  catch (e) {
878
924
  report.errors.push(syncError("metadata", e));
879
925
  }
926
+ phase("metadata");
880
927
  try {
881
928
  await this.pushPreferences(report);
882
929
  }
883
930
  catch (e) {
884
931
  report.errors.push(syncError("preference", e));
885
932
  }
933
+ phase("preferences");
886
934
  const after = await this.store.read((tx) => tx.get("meta", META));
887
935
  if (after?.state === "RETIRED" || this.closed)
888
936
  return report;
@@ -892,14 +940,20 @@ class ClientImpl {
892
940
  catch (e) {
893
941
  report.errors.push(syncError("epoch", e));
894
942
  }
943
+ phase("epoch");
895
944
  if (this.closed)
896
945
  return report;
897
946
  try {
898
- report.outbox = await drain(this.outboxDeps());
947
+ const drained = await drain(this.outboxDeps());
948
+ report.outbox = { sent: drained.sent, accepted: drained.accepted, cancelled: drained.cancelled, unknown: drained.unknown, retry: drained.retry };
949
+ report.timings.bytesSent += drained.bytes;
950
+ if (drained.blocked)
951
+ report.errors.push(syncError("outbox", drained.blocked)); // the records stay queued
899
952
  }
900
953
  catch (e) {
901
954
  report.errors.push(syncError("outbox", e));
902
955
  }
956
+ phase("outbox");
903
957
  if (this.closed)
904
958
  return report;
905
959
  let subs = [];
@@ -923,10 +977,16 @@ class ClientImpl {
923
977
  if (!known)
924
978
  continue;
925
979
  const r = await syncStream(this.inboxDeps(), s.streamId, s.authorIdentityId, budget);
926
- report.inbox.streams++;
980
+ // What landed counts, whether or not the stream then failed; a failed stream is not synced.
927
981
  report.inbox.stored += r.stored;
928
982
  report.inbox.keyPending += r.keyPending;
929
983
  report.inbox.invalid += r.invalid;
984
+ report.timings.bytesReceived += r.bytes;
985
+ if (r.failure !== undefined) {
986
+ report.errors.push({ ...syncError("inbox", r.failure), streamId: s.streamId, authorIdentityId: s.authorIdentityId });
987
+ continue;
988
+ }
989
+ report.inbox.streams++;
930
990
  if (r.acked !== undefined)
931
991
  report.inbox.acked++;
932
992
  if (r.hasMore)
@@ -936,11 +996,14 @@ class ClientImpl {
936
996
  report.errors.push({ ...syncError("inbox", e), streamId: s.streamId, authorIdentityId: s.authorIdentityId });
937
997
  }
938
998
  }
939
- report.purged = (await purgeHistory(this.store, this.policy, this.now())) + (await purgeOutbox(this.store, this.policy, this.now()));
999
+ phase("inbox");
1000
+ if (maintain)
1001
+ report.purged = (await purgeHistory(this.store, this.policy, this.now())) + (await purgeOutbox(this.store, this.policy, this.now()));
1002
+ phase("maintenance");
940
1003
  await this.emitState();
941
1004
  return report;
942
1005
  }
943
- async syncMetadata(report) {
1006
+ async syncMetadata(report, maintain = true) {
944
1007
  const { pin } = this.requireAccount("sync");
945
1008
  // Own account: has this device been superseded?
946
1009
  const [me] = await this.transport.directory.resolveAccounts([this.accountName]);
@@ -963,9 +1026,9 @@ class ClientImpl {
963
1026
  return;
964
1027
  }
965
1028
  }
966
- // Reset-key list when due.
1029
+ // Reset-key list when due: always when stale (verification needs it), periodically unless maintenance is skipped.
967
1030
  const now = this.now();
968
- const due = !this.trust.fresh(now) || now - this.trust.state.timeHighWater >= RESET_LIST_RECHECK_MS;
1031
+ const due = !this.trust.fresh(now) || (maintain && now - this.trust.state.timeHighWater >= RESET_LIST_RECHECK_MS);
969
1032
  if (due) {
970
1033
  const wire = await this.transport.directory.getResetKeyList();
971
1034
  if (wire) {
@@ -1722,7 +1785,7 @@ class ClientImpl {
1722
1785
  const [resolved] = await this.transport.directory.resolveAccounts([accountName]);
1723
1786
  if (!resolved)
1724
1787
  throw new KavachError("METADATA_REQUIRED", "approve", "unknown account");
1725
- const report = { metadata: { certificates: 0, snapshots: 0, rotations: 0, quarantined: 0, resets: 0, successions: 0 }, epoch: "unchanged", outbox: { sent: 0, accepted: 0, cancelled: 0, unknown: 0, retry: 0 }, inbox: { streams: 0, stored: 0, keyPending: 0, invalid: 0, acked: 0, hasMore: false }, purged: 0, errors: [] };
1788
+ const report = { metadata: { certificates: 0, snapshots: 0, rotations: 0, quarantined: 0, resets: 0, successions: 0 }, epoch: "unchanged", outbox: { sent: 0, accepted: 0, cancelled: 0, unknown: 0, retry: 0 }, inbox: { streams: 0, stored: 0, keyPending: 0, invalid: 0, acked: 0, hasMore: false }, purged: 0, maintenance: "done", timings: emptyTimings(), errors: [] };
1726
1789
  await this.acceptMemberCertificate(resolved, report);
1727
1790
  const requester = resolvedAccountId(resolved);
1728
1791
  const pinned = await this.pinFor(requester);