API de l’extension
L’extension expose window.nostr pour l’identité, la signature d’événements et le chiffrement des messages NIP-04/NIP-44.
Installez l’extension, sélectionnez un compte et connectez votre site à l’invite. La signature et le chiffrement nécessitent un compte capable de signer et peuvent demander le déverrouillage du coffre. Lire une clé publique connue ne nécessite pas de le déverrouiller.
Configuration
Vérifiez la présence de la méthode voulue avant de l’appeler. La présence du fournisseur ne signifie pas que le site est connecté ou qu’une requête est autorisée.
// Feature detection
function hasNostr() {
return typeof window !== "undefined" &&
typeof window.nostr?.getPublicKey === "function";
}
// Wait for the extension to load
async function waitForNostr(timeout = 3000) {
const start = Date.now();
while (!hasNostr() && Date.now() - start < timeout) {
await new Promise(r => setTimeout(r, 100));
}
return hasNostr();
}API de signature NIP-07
L’extension implémente l’API de signature NIP-07 via window.nostr.
getPublicKey()
Renvoie la clé publique hexadécimale du compte actif. Nécessite la connexion du site et l’accès à l’identité.
Retour
Promise<string>
Exemple
const pubkey = await window.nostr.getPublicKey();
console.log(pubkey); // "3bf0c63f..."signEvent(event)
Signe l’événement et ajoute id, pubkey et sig. Fournissez created_at ; le signataire conserve cet horodatage. Si vous fournissez pubkey, elle doit correspondre au compte actif. Signer ne publie pas l’événement.
Paramètres
| Nom | Type | Description |
|---|---|---|
event | UnsignedEvent | Événement contenant kind, content, tags et created_at (temps Unix en secondes) |
Retour
Promise<SignedEvent>
Exemple
const signed = await window.nostr.signEvent({
kind: 1,
content: "Hello Nostr!",
tags: [],
created_at: Math.floor(Date.now() / 1000),
});
console.log(signed.sig); // schnorr signaturenip04.encrypt(pubkey, plaintext)
Chiffre un message avec NIP-04, l’ancien format de chiffrement des messages directs.
Paramètres
| Nom | Type | Description |
|---|---|---|
pubkey | string | Clé publique du destinataire, composée de 64 caractères hexadécimaux |
plaintext | string | Message à chiffrer |
Retour
Promise<string>
Exemple
const encrypted = await window.nostr.nip04.encrypt(
recipientPubkey,
"Secret message"
);nip04.decrypt(pubkey, ciphertext)
Déchiffre un message NIP-04.
Paramètres
| Nom | Type | Description |
|---|---|---|
pubkey | string | Clé publique de l’expéditeur, composée de 64 caractères hexadécimaux |
ciphertext | string | Chaîne du message chiffré |
Retour
Promise<string>
Exemple
const plaintext = await window.nostr.nip04.decrypt(
senderPubkey,
ciphertext
);
console.log(plaintext); // "Secret message"nip44.encrypt(pubkey, plaintext)
Chiffre un message avec NIP-44. Cet exemple utilise l’appel standard à deux arguments.
Paramètres
| Nom | Type | Description |
|---|---|---|
pubkey | string | Clé publique du destinataire, composée de 64 caractères hexadécimaux |
plaintext | string | Message à chiffrer |
Retour
Promise<string>
Exemple
const encrypted = await window.nostr.nip44.encrypt(
recipientPubkey,
"Secret message"
);nip44.decrypt(pubkey, ciphertext)
Déchiffre un message NIP-44.
Paramètres
| Nom | Type | Description |
|---|---|---|
pubkey | string | Clé publique de l’expéditeur, composée de 64 caractères hexadécimaux |
ciphertext | string | Chaîne du message chiffré |
Retour
Promise<string>
Exemple
const plaintext = await window.nostr.nip44.decrypt(
senderPubkey,
ciphertext
);
console.log(plaintext); // "Secret message"getRelays()
Renvoie les URL des relais configurés dans l’extension. Chaque entrée contient read: true et write: true. Cette méthode ne récupère pas les politiques de relais NIP-65 du compte et peut renvoyer un objet vide.
Retour
Promise<Record<string, { read: boolean; write: boolean }>>
Exemple
const relays = await window.nostr.getRelays();
// {
// "wss://relay.damus.io": { read: true, write: true },
// "wss://nos.lol": { read: true, write: true }
// }Connexion, permissions et erreurs
Les appels renvoient des promesses et peuvent échouer si l’utilisateur refuse, si le site est déconnecté, si l’accès à l’identité est désactivé ou si le délai expire. Les comptes en lecture seule ne peuvent ni signer ni chiffrer.
Un changement de compte peut invalider une requête en attente. Les appels depuis la page expirent après 120 secondes, attente de connexion, de permission ou de déverrouillage comprise. Interceptez les erreurs et permettez de réessayer ; les messages d’erreur ne sont pas des codes stables destinés au traitement automatique.
async function signNote(content) {
const provider = window.nostr;
if (typeof provider?.getPublicKey !== "function" ||
typeof provider?.signEvent !== "function") {
return { ok: false, reason: "provider-unavailable" };
}
try {
const pubkey = await provider.getPublicKey();
if (!pubkey) return { ok: false, reason: "no-active-account" };
const event = await provider.signEvent({
pubkey,
kind: 1,
content,
tags: [],
created_at: Math.floor(Date.now() / 1000),
});
return { ok: true, event };
} catch (error) {
return { ok: false, reason: "request-failed", error };
}
}Utilisez le SDK pour interroger le graphe des abonnements et l’API WoT Oracle pour consulter les mises en sourdine publiques. Ces informations sont distinctes de la distance dans le graphe et ne produisent pas de score de confiance combiné. L’extension fournit l’identité et la signature.