mirror of
https://github.com/PR0M3TH3AN/bitgate.git
synced 2026-11-02 11:31:00 +00:00
feat(nostr): outbox-model fetching, private mutes, contacts, NIP-56 vocabulary
Closes the four spec gaps from the audit, verified against the NIPs repo. NIP-65 (kind 10002) — the one that was actually breaking things. Mute lists are published by each contact to their own write relays, so querying a fixed relay set finds only the subset who happen to write where this deployment reads. The trust graph was silently under-fed and counts came out low, which looks like "nobody muted them" rather than like a bug. Adds a relay-list codec, per-author grouping with a fallback for accounts that have published no list, and on-demand relay connections in the transport so an outbox query can reach relays that were never configured. NIP-51 private entries — the viewer's own private mutes are now decrypted through their signer (NIP-44) and applied as viewer mutes. Someone who mutes privately previously got no effect at all. The privacy boundary is asymmetric and enforced at the codec: another account's private list is never decoded, and the check lives there rather than in the caller's discipline. NIP-02 (kind 3) — the runtime can build the trust graph itself, so <bitgate-provider> no longer needs a host to supply a follow list. Set trust="manual" to opt out. NIP-56 vocabulary — SOCIAL_POLICY declared thresholds for "harassment", which is not a NIP-56 type, so no standard client could ever trigger it. Replaced with the defined vocabulary and asserted in tests. Commerce keeps its marketplace-specific categories, now documented as deliberate, with defaults so unclassified reports are never silently dropped. Two bugs found by the new tests: - checkout had no default threshold, so a flood of "other" reports did nothing at the one place money changes hands. Now earns review, never auto-denial. - describe() spread diagnostics after a derived field, so a stale zero shadowed the live relay-list count. Adds docs/nips.md recording coverage, deliberate choices, and remaining gaps — NIP-32 labelling being the largest. 811 tests.
This commit is contained in:
1 parent
015f9c3ad4
commit
7a45f1cf3e
15 files changed
+1399
-17
No files matched your search
@@ -35,7 +35,7 @@ export function requestContext(element) {
|
||||
|
||||
export class BitGateProvider extends globalThis.HTMLElement {
|
||||
static get observedAttributes() {
|
||||
return ["relays", "root", "policy", "profile", "application", "namespace", "viewer"];
|
||||
return ["relays", "root", "policy", "profile", "application", "namespace", "viewer", "trust"];
|
||||
}
|
||||
|
||||
constructor() {
|
||||
@@ -157,6 +157,15 @@ export class BitGateProvider extends globalThis.HTMLElement {
|
||||
);
|
||||
|
||||
await this.runtime.loadAdministrativeState();
|
||||
|
||||
// With a viewer known, build the trust graph without the host having to:
|
||||
// fetch their follow list, then read each contact's mute list from that
|
||||
// contact's own write relays.
|
||||
if (this.runtime.viewerPubkey && this.getAttribute("trust") !== "manual") {
|
||||
await this.runtime.loadContacts();
|
||||
await this.runtime.loadTrustedMuteLists();
|
||||
}
|
||||
|
||||
this.dispatchEvent(new CustomEvent("bitgate:loaded", { bubbles: true, composed: true }));
|
||||
} catch (error) {
|
||||
this.error = /** @type {Error} */ (error);
|
||||
@@ -205,6 +214,12 @@ export class BitGateProvider extends globalThis.HTMLElement {
|
||||
this.runtime.signer = signer;
|
||||
const pubkey = await signer.getPublicKey();
|
||||
this.runtime.setViewer(pubkey);
|
||||
|
||||
if (this.getAttribute("trust") !== "manual") {
|
||||
await this.runtime.loadContacts();
|
||||
await this.runtime.loadTrustedMuteLists();
|
||||
}
|
||||
|
||||
return pubkey;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user