88914f50ae
Les 25 modules étaient à plat, nommés d'après ce qu'ils font mécaniquement (`store-registry`, `read-model`, `reach`, `caps`). Rien dans l'arborescence ne disait lesquels DEVIENDRONT le vrai SDK, lesquels tiennent lieu du travail que le verifier fera nativement, et lesquels n'existent que parce qu'un wallet est partagé — trois destins sans rapport. Quatre dossiers, les deux fichiers d'entrée restant à la racine pour que l'`exports` du paquet et le code du consommateur ne bougent pas : - `model/` — le modèle d'adressage de la cible, transcrit : vocabulaire pur, pas d'I/O. Survit comme connaissance. - `surface/` — ce que l'app touche, chaque symbole ayant un pendant cible documenté. Supprimé quand l'alias bascule ; le code de l'app est inchangé. - `emulated-verifier/` — les doublures de ce que le verifier fait nativement : possession, dépôt des caps, frontière, non-livraison, traitement des inbox, registres de branche, ouverture de repo. **C'est le dossier où diverger du modèle est possible.** Le préfixe `emulated-` porte le sens : tient lieu de, jamais est — cette bibliothèque ne réside dans aucune couche de la cible, elle les référence. - `shared-wallet/` — n'existe que parce qu'un wallet héberge toutes les identités. Aucun pendant, rien sur quoi s'aligner ; sa seule loi est de rester invisible depuis `surface/`. S'évapore, remplacé par rien. `store-registry-api.ts` devient `surface/placement.ts` : il faisait déjà à la main ce que la frontière de dossier fait structurellement — c'est la meilleure preuve interne du bien-fondé de ce rangement. Ce commit ne fait que déplacer et recâbler les imports (src, test, e2e). Les scissions des modules à cheval suivent. 157 tests unitaires, typecheck src/test/e2e vert.
52 lines
2.2 KiB
TypeScript
52 lines
2.2 KiB
TypeScript
/**
|
|
* The reserved-namespace predicate, in isolation.
|
|
*
|
|
* It is one `startsWith`, but it is the seam that keeps the polyfill's emulated
|
|
* branches out of the consumer's data (see `machinery.ts`), so its edges are worth
|
|
* pinning: get it wrong in one direction and machinery leaks into domain properties;
|
|
* wrong in the other and real data silently disappears from reads.
|
|
*/
|
|
import { test, expect } from "bun:test";
|
|
import { MACHINERY_NS, isMachinerySubject } from "../src/emulated-verifier/machinery";
|
|
|
|
test("the emulated branch subjects are all machinery", () => {
|
|
// The four compartments store-registry emulates, verbatim.
|
|
for (const s of [
|
|
"urn:ng-eventually:shim:index",
|
|
"urn:ng-eventually:shim:storeBranch",
|
|
"urn:ng-eventually:shim:userBranch",
|
|
"urn:ng-eventually:shim:headerBranch",
|
|
]) {
|
|
expect(isMachinerySubject(s)).toBe(true);
|
|
}
|
|
});
|
|
|
|
test("inbox deposits are machinery too — a second prefix under the same namespace", () => {
|
|
expect(isMachinerySubject("urn:ng-eventually:inbox:deposit:1700:abc")).toBe(true);
|
|
});
|
|
|
|
test("consumer subjects are not machinery — including a NURI, which is what entities use", () => {
|
|
expect(isMachinerySubject("did:ng:o:doc1")).toBe(false);
|
|
expect(isMachinerySubject("urn:e2e:secret")).toBe(false);
|
|
expect(isMachinerySubject("http://example.org/thing")).toBe(false);
|
|
});
|
|
|
|
test("a look-alike prefix is NOT machinery — the boundary is exact, not fuzzy", () => {
|
|
// Anything that merely resembles the namespace must fall on the data side, or a
|
|
// consumer's own vocabulary could vanish from its reads.
|
|
expect(isMachinerySubject("urn:ng-eventuallyX:thing")).toBe(false);
|
|
expect(isMachinerySubject("urn:ng-event:thing")).toBe(false);
|
|
expect(isMachinerySubject("x-urn:ng-eventually:shim:index")).toBe(false);
|
|
});
|
|
|
|
test("an absent subject is not machinery — read paths hand bindings straight in", () => {
|
|
expect(isMachinerySubject(undefined)).toBe(false);
|
|
expect(isMachinerySubject("")).toBe(false);
|
|
});
|
|
|
|
test("the namespace is the prefix both writers actually use", () => {
|
|
// Guards against the constant drifting away from store-registry/inbox.
|
|
expect("urn:ng-eventually:shim".startsWith(MACHINERY_NS)).toBe(true);
|
|
expect("urn:ng-eventually:inbox".startsWith(MACHINERY_NS)).toBe(true);
|
|
});
|