spa(task 14): nip-07-signer-wrapper
window.nostr-Proxy für Alby/nos2x/Flamingo-Extensions. Fehlertolerant: bei fehlender Extension ODER User-Ablehnung returnen die Helper null, damit UI klar "bitte Extension installieren"-Hinweise zeigen kann statt zu crashen. UnsignedEvent/SignedEvent als explizite Types — werden ab Task 29 (ReplyComposer) für NIP-07-signierte kind:1-Kommentare genutzt. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
f470732c2c
commit
dcef74e75c
|
|
@ -0,0 +1,50 @@
|
|||
/**
|
||||
* NIP-07-Wrapper für Browser-Extension-Signer (Alby, nos2x, Flamingo).
|
||||
*
|
||||
* `window.nostr` ist optional — wenn die Extension fehlt, liefern die Helper
|
||||
* null zurück und der Aufrufer zeigt einen Hinweis an.
|
||||
*/
|
||||
|
||||
declare global {
|
||||
interface Window {
|
||||
nostr?: {
|
||||
getPublicKey(): Promise<string>;
|
||||
signEvent(event: UnsignedEvent): Promise<SignedEvent>;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
export interface UnsignedEvent {
|
||||
kind: number;
|
||||
tags: string[][];
|
||||
content: string;
|
||||
created_at: number;
|
||||
pubkey: string;
|
||||
}
|
||||
|
||||
export interface SignedEvent extends UnsignedEvent {
|
||||
id: string;
|
||||
sig: string;
|
||||
}
|
||||
|
||||
export function hasNip07(): boolean {
|
||||
return typeof window !== 'undefined' && !!window.nostr;
|
||||
}
|
||||
|
||||
export async function getPublicKey(): Promise<string | null> {
|
||||
if (!hasNip07()) return null;
|
||||
try {
|
||||
return await window.nostr!.getPublicKey();
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
export async function signEvent(event: UnsignedEvent): Promise<SignedEvent | null> {
|
||||
if (!hasNip07()) return null;
|
||||
try {
|
||||
return await window.nostr!.signEvent(event);
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue