refactor(api): l'app nomme une personne ou un document, jamais une adresse d'inbox
L'app d'exemple a servi de juge, et elle a immédiatement montré ce que l'inventaire ne montrait pas : pour partager une note elle résolvait l'inbox du destinataire, pour lire ses messages elle résolvait l'adresse de la sienne. Deux gestes qu'aucune application n'aura à faire une fois la chose native — donc deux gestes qu'elle ne doit pas apprendre. - `shareCap(cap, toUser)` remplace `shareCap(cap, toInbox)`. Partager est un acte envers quelqu'un ; où est son inbox regarde la bibliothèque. - `inbox.readForDocument(doc)` : le propriétaire lit ses messages en nommant la note, comme le déposant la nomme pour en laisser un. - `storeRegistry.userInbox` et `documentInboxAddress` sortent de la surface publiée. Ils restent joignables en interne, où le shim en a besoin. Sortent aussi de `/polyfill`, chacun parce qu'une app qui code contre apprend ce qu'il faudra désapprendre : - `getCaps` / `CapRegistry` — la salle des machines. La question du consommateur est `capFor(doc)` : est-ce que je le détiens ? Le registre n'a ni successeur ni forme inerte ; ce qui s'appuie dessus sera à réécrire, pas à laisser en place. - `getCurrentUser` — une app sait qui elle a connecté ; le redemander à la bibliothèque est une commodité du wallet partagé. - `virtualUsers` / `IdentityStore` — se souvenir d'une identité entre deux sessions est aussi le travail de l'app en amont. L'écran d'accès persiste ce dont IL a besoin ; rien d'autre n'a à être exposé. Reste sur `/polyfill` ce qu'une app appelle vraiment : `configure` et `setCurrentUser`. Le reste y est du test ou de l'injection interne. 170 tests unitaires, e2e 42/42 contre le broker, typecheck vert sur la bibliothèque, l'exemple et le harnais.
This commit is contained in:
@@ -134,12 +134,17 @@ async function readSharedNote(link: string): Promise<Note | null> {
|
||||
};
|
||||
}
|
||||
|
||||
/** Hand a reader the key to one of my notes, addressed to their inbox. */
|
||||
/**
|
||||
* Hand a reader the key to one of my notes.
|
||||
*
|
||||
* Names the PERSON. Where their inbox is, and whether they have one yet, is the
|
||||
* library's business — an application will never handle an inbox address once this is
|
||||
* native, so it does not handle one now.
|
||||
*/
|
||||
async function shareNote(doc: Nuri, withUser: string): Promise<void> {
|
||||
const cap = capFor(doc);
|
||||
if (!cap) throw new Error("this note is not mine to share");
|
||||
const theirInbox = await storeRegistry.userInbox(withUser, "protected");
|
||||
await inbox.shareCap(cap, theirInbox);
|
||||
await inbox.shareCap(cap, withUser);
|
||||
}
|
||||
|
||||
/** Open a note for messages — only its owner can, and only they will read them. */
|
||||
@@ -152,11 +157,9 @@ async function leaveMessage(doc: Nuri, text: string): Promise<void> {
|
||||
await inbox.postToDocument(doc, { payload: { text } });
|
||||
}
|
||||
|
||||
/** The messages left on one of my notes. */
|
||||
/** The messages left on one of my notes — named by the note, like leaving one. */
|
||||
async function messagesOn(doc: Nuri): Promise<string[]> {
|
||||
const address = await storeRegistry.documentInboxAddress(doc);
|
||||
if (!address) return [];
|
||||
const deposits = await inbox.read(address);
|
||||
const deposits = await inbox.readForDocument(doc);
|
||||
return deposits.map((d) => String((d.payload as { text?: string })?.text ?? ""));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user