From 5104448326ced1a84deb083befb22477d478b0ad Mon Sep 17 00:00:00 2001 From: Martti Malmi Date: Fri, 15 Sep 2023 15:35:19 +0300 Subject: [PATCH] snort/system --- package.json | 1 + src/js/nostr/PubSub.ts | 9 ++-- src/js/nostr/SnortSystem.ts | 52 ++++++++++++++++++++ yarn.lock | 97 +++++++++++++++++++++++++++++++++++-- 4 files changed, 152 insertions(+), 7 deletions(-) create mode 100644 src/js/nostr/SnortSystem.ts diff --git a/package.json b/package.json index fd7c913a..6df57db0 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "@fontsource/lato": "^5.0.11", "@heroicons/react": "^2.0.18", "@noble/hashes": "1.3.1", + "@snort/system": "^1.0.21", "@types/lodash": "^4.14.197", "bech32": "^2.0.0", "classnames": "^2.3.2", diff --git a/src/js/nostr/PubSub.ts b/src/js/nostr/PubSub.ts index 0d364c41..01bb1364 100644 --- a/src/js/nostr/PubSub.ts +++ b/src/js/nostr/PubSub.ts @@ -5,6 +5,7 @@ import EventDB from '@/nostr/EventDB'; import getRelayPool from '@/nostr/relayPool'; import Events from '../nostr/Events'; +import Snort from '../nostr/SnortSystem'; import localState from '../state/LocalState.ts'; import IndexedDB from './IndexedDB'; @@ -43,8 +44,6 @@ const PubSub = { subscribe( filter: Filter, callback?: (event: Event) => void, - sinceLastOpened = false, - mergeSubscriptions = true, ): Unsubscribe { let currentSubscriptionId; if (callback) { @@ -67,10 +66,12 @@ const PubSub = { }); } - const unsubRelays = this.subscribeRelayPool(filter, sinceLastOpened, mergeSubscriptions); + Snort.subscribe(filter, (event) => { + console.log('snort returned', event); + Events.handle(event); + }); return () => { - unsubRelays?.(); if (currentSubscriptionId) { this.subscriptions.delete(currentSubscriptionId); } diff --git a/src/js/nostr/SnortSystem.ts b/src/js/nostr/SnortSystem.ts new file mode 100644 index 00000000..2b34ab8b --- /dev/null +++ b/src/js/nostr/SnortSystem.ts @@ -0,0 +1,52 @@ +import { + EventPublisher, + NoopStore, + NostrSystem, + RequestBuilder, + UserRelaysCache, +} from '@snort/system'; +import { Event, Filter } from 'nostr-tools'; + +// Provided in-memory / indexedDb cache for relays +// You can also implement your own with "RelayCache" interface +const RelaysCache = new UserRelaysCache(); + +// example auth handler using NIP-07 +const AuthHandler = async (challenge: string, relay: string) => { + const pub = await EventPublisher.nip7(); + if (pub) { + return await pub.nip42Auth(challenge, relay); + } +}; + +// Singleton instance to store all connections and access query fetching system +const System = new NostrSystem({ + relayCache: RelaysCache, + authHandler: AuthHandler, // can be left undefined if you dont care about NIP-42 Auth +}); + +const connect = System.ConnectToRelay('wss://relay.snort.social', { read: true, write: false }); + +const publish = async (event: Event) => { + await connect; +}; + +const subscribe = async (filter: Filter, callback: (event: Event) => void) => { + await connect; + const rb = new RequestBuilder('no id'); + + rb.withBareFilter(filter); + + const q = System.Query(NoopStore, rb); + // basic usage using "onEvent", fired for every event added to the store + q.feed.onEvent((events) => { + events.forEach((event) => { + callback(event); + }); + }); +}; + +export default { + publish, + subscribe, +}; diff --git a/yarn.lock b/yarn.lock index 316f6abe..32ca632b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1255,7 +1255,14 @@ dependencies: "@noble/hashes" "1.3.1" -"@noble/hashes@1.3.1", "@noble/hashes@~1.3.0", "@noble/hashes@~1.3.1": +"@noble/curves@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" + integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw== + dependencies: + "@noble/hashes" "1.3.2" + +"@noble/hashes@1.3.1", "@noble/hashes@1.3.2", "@noble/hashes@^1.3.2", "@noble/hashes@~1.3.0", "@noble/hashes@~1.3.1": version "1.3.1" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.1.tgz#8831ef002114670c603c458ab8b11328406953a9" integrity sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA== @@ -1378,7 +1385,7 @@ estree-walker "^2.0.1" picomatch "^2.2.2" -"@scure/base@1.1.1", "@scure/base@~1.1.0": +"@scure/base@1.1.1", "@scure/base@^1.1.2", "@scure/base@~1.1.0": version "1.1.1" resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== @@ -1405,6 +1412,68 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== +"@snort/shared@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@snort/shared/-/shared-1.0.6.tgz#52a40b6c25a5bfcd54a1a150a2a836fa6b37250c" + integrity sha512-p4BRIALNTV7truHGaF+rKoLF5OB2QY1EZ+NPO5iccDdLhQxPSloIkrFxk5Le+yuX2AYtNd8Z/HTxViU8reYCXA== + dependencies: + "@noble/curves" "^1.2.0" + "@noble/hashes" "^1.3.2" + "@scure/base" "^1.1.2" + debug "^4.3.4" + dexie "^3.2.4" + light-bolt11-decoder "^3.0.0" + +"@snort/system@^1.0.21": + version "1.0.21" + resolved "https://registry.yarnpkg.com/@snort/system/-/system-1.0.21.tgz#b158bf631101f8af18528c6224c1edc58e51709a" + integrity sha512-hXv2ZvHded1Ot7s6MQarC7GQ/jHVT4sSQIHrOTq4vsqlGmT56bx+KP33Rdw6//k+YhyljmAUMYSoYtDl17LjLg== + dependencies: + "@noble/curves" "^1.2.0" + "@noble/hashes" "^1.3.2" + "@scure/base" "^1.1.2" + "@snort/shared" "^1.0.6" + "@stablelib/xchacha20" "^1.0.1" + debug "^4.3.4" + dexie "^3.2.4" + isomorphic-ws "^5.0.0" + uuid "^9.0.0" + ws "^8.14.0" + +"@stablelib/binary@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/binary/-/binary-1.0.1.tgz#c5900b94368baf00f811da5bdb1610963dfddf7f" + integrity sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q== + dependencies: + "@stablelib/int" "^1.0.1" + +"@stablelib/chacha@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/chacha/-/chacha-1.0.1.tgz#deccfac95083e30600c3f92803a3a1a4fa761371" + integrity sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + +"@stablelib/int@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/int/-/int-1.0.1.tgz#75928cc25d59d73d75ae361f02128588c15fd008" + integrity sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w== + +"@stablelib/wipe@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/wipe/-/wipe-1.0.1.tgz#d21401f1d59ade56a62e139462a97f104ed19a36" + integrity sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg== + +"@stablelib/xchacha20@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@stablelib/xchacha20/-/xchacha20-1.0.1.tgz#e98808d1f7d8b20e3ff37c71a3062a2a955d9a8c" + integrity sha512-1YkiZnFF4veUwBVhDnDYwo6EHeKzQK4FnLiO7ezCl/zu64uG0bCCAUROJaBkaLH+5BEsO3W7BTXTguMbSLlWSw== + dependencies: + "@stablelib/binary" "^1.0.1" + "@stablelib/chacha" "^1.0.1" + "@stablelib/wipe" "^1.0.1" + "@surma/rollup-plugin-off-main-thread@^2.2.3": version "2.2.3" resolved "https://registry.yarnpkg.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz#ee34985952ca21558ab0d952f00298ad2190c053" @@ -3977,7 +4046,19 @@ nostr-relaypool@^0.6.28: nostr-tools "^1.10.0" safe-stable-stringify "^2.4.2" -nostr-tools@^1.10.0, nostr-tools@^1.14.2: +nostr-tools@^1.10.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/nostr-tools/-/nostr-tools-1.15.0.tgz#92e487654d1f6994923176aedf3b27fb617f7a78" + integrity sha512-Dh7LVAUqaSiSs61QddsWluLVWpMwyMGaVlbhDYEy03ZwnBBzm10pz+mQZSdVV88/B3a5843gHZ4dIBUeS5upoA== + dependencies: + "@noble/ciphers" "^0.2.0" + "@noble/curves" "1.1.0" + "@noble/hashes" "1.3.1" + "@scure/base" "1.1.1" + "@scure/bip32" "1.3.1" + "@scure/bip39" "1.2.1" + +nostr-tools@^1.14.2: version "1.14.2" resolved "https://registry.yarnpkg.com/nostr-tools/-/nostr-tools-1.14.2.tgz#161c9401467725e87c07fcf1c9924d31b12fd45c" integrity sha512-QEe8+tMDW0632eNDcQ+EG1edmsCXLV4WPiWLDcdT3uoE+GM15pVcy18sKwbN7SmgO4GKFEqQ49k45eANC6++SQ== @@ -5229,6 +5310,11 @@ util-deprecate@^1.0.2: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +uuid@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + v8-to-istanbul@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" @@ -5590,6 +5676,11 @@ ws@^8.13.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== +ws@^8.14.0: + version "8.14.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.1.tgz#4b9586b4f70f9e6534c7bb1d3dc0baa8b8cf01e0" + integrity sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A== + xml-name-validator@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835"