diff --git a/src/lib/db.js b/src/lib/db.js
index 9c7a181..7681a14 100644
--- a/src/lib/db.js
+++ b/src/lib/db.js
@@ -73,16 +73,73 @@ export const userBoards = derived([user, boards], ([$user, $boards]) => {
export const db = writable({
user: null,
- ndk: initNDK(),
currentBoardId: null
});
-async function initNDK() {
- const ndk = new NDK({
- explicitRelayUrls: ['ws://localhost:10547']
- });
- await ndk.connect();
+// Create a writable store for the NDK instance
+const createNDKStore = () => {
+ const { subscribe, set, update } = writable(null);
+ return {
+ subscribe,
+ init: async (
+ // FIXME use a defualt relay list from config
+ relayUrls = [
+ // 'wss://relay.damus.io'
+ // 'wss://relay.nostr.band',
+ // 'wss://nos.lol',
+ // 'ws://localhost:10547'
+ 'wss://relay-k12.edufeed.org'
+ // Add more default relays here
+ ]
+ ) => {
+ try {
+ const ndk = new NDK({
+ explicitRelayUrls: relayUrls,
+ autoConnectUserRelays: true
+ });
+
+ // Connect to relays
+ await ndk.connect();
+ console.log('NDK Connected to relays');
+
+ // Update the store with the connected instance
+ set(ndk);
+ return ndk;
+ } catch (error) {
+ console.error('Failed to initialize NDK:', error);
+ throw error;
+ }
+ }
+
+ // // Method to sign in with extension (NIP-07)
+ // signInWithExtension: async () => {
+ // return update((ndk) => {
+ // if (!ndk) throw new Error('NDK not initialized');
+
+ // const signer = new NDKNip07Signer();
+ // ndk.signer = signer;
+ // return ndk;
+ // });
+ // },
+
+ // // Method to disconnect/cleanup
+ // disconnect: () => {
+ // update((ndk) => {
+ // if (ndk) {
+ // // Perform any cleanup if needed
+ // }
+ // return null;
+ // });
+ // }
+ };
+};
+
+// Export the NDK store
+export const ndkStore = createNDKStore();
+
+export async function initNDK() {
+ const ndk = get(ndkStore);
const sub = ndk.subscribe({ kinds: [30043, 30044, 30045] }); // listen for boards, columns indexes
sub.on('event', async (event) => {
events.update((events) => [...events, event]);
diff --git a/src/lib/ndk.js b/src/lib/ndk.js
index cdd796e..5b8a278 100644
--- a/src/lib/ndk.js
+++ b/src/lib/ndk.js
@@ -7,12 +7,13 @@ import {
currentBoardAddress,
currentBoard,
selectedColumn,
- user as userStore
+ user as userStore,
+ ndkStore
} from '$lib/db';
export async function login(method) {
const nip07signer = new NDKNip07Signer();
- const ndk = get(db).ndk;
+ const ndk = get(ndkStore);
ndk.signer = nip07signer;
let user = {};
@@ -29,8 +30,12 @@ export async function login(method) {
}
}
+function getNdk() {
+ return get(ndkStore);
+}
+
export function addBoard(board) {
- const ndk = get(db).ndk;
+ const ndk = get(ndkStore);
const event = new NDKEvent(ndk, { kind: 30043, content: 'Board Event' });
const tags = [['title', board.title]];
event.tags = tags;
@@ -38,7 +43,7 @@ export function addBoard(board) {
}
export async function addColumn(column) {
- const ndk = get(db).ndk;
+ const ndk = getNdk();
const user = get(userStore);
const columnEvent = new NDKEvent(ndk, { kind: 30044, content: 'Column Event' });
columnEvent.tags = [['title', column.title]];
@@ -58,7 +63,7 @@ export async function addColumn(column) {
}
export async function addCard(card) {
- const ndk = get(db).ndk;
+ const ndk = getNdk();
const cardEvent = new NDKEvent(ndk, { kind: 30045, content: card.title });
await cardEvent.publish();
@@ -72,7 +77,7 @@ export async function addCard(card) {
}
async function eventTagToCard(eventTag) {
- const ndk = get(db).ndk;
+ const ndk = getNdk();
const [kind, pubkey, d] = eventTag.split(':');
const event = await ndk.fetchEvent({
kinds: [30045],
@@ -83,7 +88,7 @@ async function eventTagToCard(eventTag) {
}
async function eventTagToColumn(eventTag) {
- const ndk = get(db).ndk;
+ const ndk = getNdk();
const [kind, pubkey, d] = eventTag.split(':');
const event = await ndk.fetchEvent({
kind,
@@ -129,7 +134,7 @@ async function eventToBoard(event) {
}
export async function getBoards() {
- const ndk = get(db).ndk;
+ const ndk = get(ndkStore);
const sub = ndk.subscribe({ kinds: [30043, 30044, 30045] }); // listen for boards, columns indexes
sub.on('event', async (event) => {
eventStore.update((events) => [...events, event]);
@@ -147,7 +152,7 @@ export function columnAddressesFromBoard(board) {
/* @param {NDKEvent} event
*/
async function addressedEvents(event) {
- const ndk = get(db).ndk;
+ const ndk = getNdk();
let columnAddresses = columnAddressesFromBoard(event);
const cols = await Promise.all(
columnAddresses.map(async (c) => {
@@ -168,7 +173,7 @@ async function addressedEvents(event) {
}
export async function publishBoard(board) {
- const ndk = get(db).ndk;
+ const ndk = getNdk();
console.log(get(currentBoardAddress));
const existingBoard = get(currentBoard);
// const existingBoard = await ndk.fetchEvent({
@@ -188,7 +193,7 @@ export async function publishBoard(board) {
}
export async function publishCards(column) {
- const ndk = get(db).ndk;
+ const ndk = getNdk();
const existingColumn = await ndk.fetchEvent({
kinds: [30044],
// authors: [column.pubkey],
@@ -224,7 +229,7 @@ function forkTags(tags, pubkey) {
* @param {NDKEvent} board
*/
export async function forkBoard(board) {
- const ndk = get(db).ndk;
+ const ndk = getNdk();
const user = get(userStore);
const userBoard = new NDKEvent(ndk, {
@@ -272,6 +277,6 @@ export async function forkBoard(board) {
* @param {NDKEvent} board
*/
export async function deleteBoard(board) {
- const ndk = get(db).ndk;
+ const ndk = getNdk();
await new NDKEvent(ndk, board).delete('user said so', true);
}
diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte
index 34b24e4..9be7588 100644
--- a/src/routes/+layout.svelte
+++ b/src/routes/+layout.svelte
@@ -2,6 +2,20 @@
import '../app.css';
import Navbar from '$lib/components/Navbar.svelte';
let { children } = $props();
+
+ import { onMount } from 'svelte';
+ import { ndkStore, initNDK } from '$lib/db';
+
+ onMount(async () => {
+ try {
+ await ndkStore.init();
+ // You could auto-sign in here if you have stored credentials
+ // or let the user explicitly sign in from a component
+ initNDK();
+ } catch (error) {
+ console.error('Failed to initialize NDK:', error);
+ }
+ });