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";