fix(inbox): une inbox appartient à un document, jamais à plusieurs
Retour sur l'adresse par défaut livrée en 8a382f2, qui faisait pointer tout
document vers l'inbox de son propriétaire. C'était acheter le coût au prix de
la forme — le mauvais arbitrage pour cette bibliothèque.
Vérifié en amont : le verifier route un message entrant par
`inboxes: PubKey → RepoId` (`engine/verifier/src/verifier.rs:1677,1928`) et le
déchiffre avec la moitié privée de CE repo. Et `InboxMsgBody`
(`engine/net/src/types.rs:4265`) ne porte aucun document cible — il n'en a pas
besoin : l'adresse EST l'identification. Une inbox appartient donc à exactement
un repo, et faire tenir plusieurs documents derrière une inbox émule une
relation que le modèle ne peut pas exprimer.
Conséquences :
- `createEntityDoc` ne publie plus rien. Un document neuf n'a pas d'inbox et
`documentInboxAddress` rend `undefined`.
- Une inbox s'ouvre par `openDocumentInbox(doc)`, sur décision du propriétaire.
C'est aussi ce qui règle le coût sans toucher à la forme : seuls les
documents destinés à RECEVOIR en paient une — l'app le sait, la bibliothèque
non.
- `inbox.postToDocument(doc, { payload })` : l'app nomme le DOCUMENT, jamais une
inbox. Lève quand le document n'en a pas, au lieu de rendre la main
silencieusement — un dépôt qui disparaît sans erreur est exactement le bug que
ce chemin traînait.
- Pas de champ « document cible » sur un dépôt. Ce serait une invention que les
apps devraient désapprendre à la migration.
README, principe de conception : les deux moitiés sont contraignantes, et c'est
la seconde qu'on brade. La surface doit être au plus près du futur SDK, mais
l'IMPLÉMENTATION aussi doit être au plus près de ce que NextGraph prévoit, sans
exception. Ce qui est connu vaut spécification. La pression à dévier ne se
présente jamais comme une déviation : elle arrive comme un coût, une latence,
une gêne d'ergonomie — bien réels. Deux cas déjà rencontrés sont consignés, avec
le signal commun : un choix qui ferait apprendre au consommateur quelque chose
qu'il devra DÉSAPPRENDRE.
157 tests unitaires, e2e 40/40 contre le broker en ligne.
This commit is contained in:
@@ -239,18 +239,23 @@ Consequences a consumer must internalize:
|
||||
are this library's, not the engine's: upstream only the public and protected store
|
||||
repos carry one (`engine/verifier/src/site.rs:128,149`).*
|
||||
|
||||
Depositing into a document you do not own is two calls, and the first is the one that
|
||||
makes it possible at all:
|
||||
Depositing into a document you do not own is **one** call, and it names the document:
|
||||
|
||||
```ts
|
||||
const where = await storeRegistry.documentInboxAddress(doc); // Nuri | undefined
|
||||
if (where) await inbox.post(where, { payload: { signingUp: true } });
|
||||
await inbox.postToDocument(doc, { payload: { signingUp: true } });
|
||||
```
|
||||
|
||||
You need the **document** (its cap), nothing else — the address rides on it and is
|
||||
published from creation. `undefined` means you cannot read the document, not that the
|
||||
owner is unreachable. Reading that inbox is a different right, and it stays the
|
||||
owner's (`inbox.read` refuses otherwise).
|
||||
You need the **document** (its cap), nothing else — the address rides on it. It
|
||||
**throws** if the document has no inbox: its owner opens one with
|
||||
`storeRegistry.openDocumentInbox(doc)` for documents meant to receive, so a fresh
|
||||
document has none. When "no inbox" is an expected case, check first with
|
||||
`storeRegistry.documentInboxAddress(doc)` (→ `Nuri | undefined`).
|
||||
|
||||
A deposit carries no target document, deliberately — one inbox belongs to one
|
||||
document, so the address already identifies it, exactly as upstream (`inboxes:
|
||||
PubKey → RepoId`). Do not encode the document in your payload; you would have to
|
||||
unlearn it. Reading that inbox is a different right, and it stays the owner's
|
||||
(`inbox.read` refuses otherwise).
|
||||
|
||||
The consumer asks the SDK for what it needs and trusts the result; it does not
|
||||
construct NURIs, pick union-vs-anchor, or reason about caps. The domain-shaped list
|
||||
|
||||
Reference in New Issue
Block a user