From 98ca0f0f178cdc5aab36c00a60e0eaeabf7f53f1 Mon Sep 17 00:00:00 2001 From: Pablo Fernandez Date: Tue, 24 Sep 2024 08:01:36 -0500 Subject: [PATCH] add NIP-78 interface --- ndk/src/app-settings/index.ts | 75 +++++++++++++++++++++++++++++++++++ ndk/src/index.ts | 2 + 2 files changed, 77 insertions(+) create mode 100644 ndk/src/app-settings/index.ts diff --git a/ndk/src/app-settings/index.ts b/ndk/src/app-settings/index.ts new file mode 100644 index 00000000..80d6c2d4 --- /dev/null +++ b/ndk/src/app-settings/index.ts @@ -0,0 +1,75 @@ +import { NDKKind } from "../events/kinds"; +import { NDKEvent, type NostrEvent } from "../events/index.js"; +import type { NDK } from "../ndk"; +import { NDKRelaySet } from "../relay/sets"; + +/** + * Implements NIP-78 App Settings + * + * @example + * const appSettings = new NDKAppSettings(ndk) + * appSettings.appName = "My App"; + * appSettings.set("my_key", "my_value"); + * await appSettings.save(); + * + * @example + * const appSettings = NDKAppSettings.from(event); + * appSettings.appName = "My App"; + * console.log(appSettings.get("my_key")); + * + * @group Kind Wrapper + * + * @see https://github.com/nostr-protocol/nips/blob/master/78.md + */ +export class NDKAppSettings extends NDKEvent { + public appName: string | undefined; + public settings: Record = {}; + + constructor(ndk: NDK | undefined, rawEvent?: NostrEvent | NDKEvent) { + super(ndk, rawEvent); + this.kind ??= NDKKind.AppSpecificData; + this.dTag ??= this.appName; + + if (this.content.length > 0) { + try { + this.settings = JSON.parse(this.content); + } catch (error) { + console.error("Error parsing app settings", error); + } + } + } + + static from(event: NDKEvent) { + return new NDKAppSettings(event.ndk, event); + } + + /** + * Set a value for a given key. + * + * @param key + * @param value + */ + set(key: string, value: unknown) { + this.settings[key] = value; + } + + /** + * Get a value for a given key. + * + * @param key + * @returns + */ + get(key: string) { + return this.settings[key]; + } + + public async publishReplaceable( + relaySet?: NDKRelaySet, + timeoutMs?: number, + requiredRelayCount?: number + ) { + this.content = JSON.stringify(this.settings); + + return super.publishReplaceable(relaySet, timeoutMs, requiredRelayCount); + } +} diff --git a/ndk/src/index.ts b/ndk/src/index.ts index ddcc9a5a..db414393 100644 --- a/ndk/src/index.ts +++ b/ndk/src/index.ts @@ -30,6 +30,8 @@ export * from "./events/kinds/simple-group/index.js"; export * from "./events/kinds/simple-group/metadata.js"; export * from "./events/kinds/simple-group/member-list.js"; +export * from "./app-settings/index.js"; + export * from "./relay/index.js"; export * from "./relay/auth-policies.js"; export * from "./relay/sets/index.js";