snort/packages/system
Kieran a2d084ab70
fix: replyToThis bug
2023-11-14 13:33:54 +00:00
..
examples Update docs 2023-09-15 12:42:39 +01:00
src fix: replyToThis bug 2023-11-14 13:33:54 +00:00
tests chore: Update translations 2023-10-06 12:20:20 +00:00
.npmignore cleanup 2023-06-09 00:43:21 +02:00
README.md Update docs 2023-09-15 12:42:39 +01:00
jest.config.js optimize 2023-06-12 14:15:45 +01:00
package.json fix: replyToThis bug 2023-11-14 13:33:54 +00:00
tsconfig.json Fix tests 2023-10-06 13:16:28 +01:00
worker.ts move to pkg 2023-06-08 12:45:23 +02:00

README.md

@snort/system

A collection of caching and querying techniquies used by https://snort.social to serve all content from the nostr protocol.

Simple example:

import {
    NostrSystem,
    RequestBuilder,
    StoreSnapshot,
    NoteCollection
} from "@snort/system"

// Singleton instance to store all connections and access query fetching system
const System = new NostrSystem({});

(async () => {
  // Setup cache system
  await System.Init();

  // connec to one "bootstrap" relay to pull profiles/relay lists from
  // also used as a fallback relay when gossip model doesnt know which relays to pick, or "authors" are not provided in the request
  await System.ConnectToRelay("wss://relay.snort.social", { read: true, write: false });

  // ID should be unique to the use case, this is important as all data fetched from this ID will be merged into the same NoteStore
  const rb = new RequestBuilder("get-posts");
  rb.withFilter()
    .authors(["63fe6318dc58583cfe16810f86dd09e18bfd76aabc24a0081ce2856f330504ed"]) // Kieran pubkey
    .kinds([1])
    .limit(10);

  const q = System.Query(NoteCollection, rb);
  // basic usage using "onEvent", fired every 100ms
  q.feed.onEvent(evs => {
    console.log(evs);
    // something else..
  });

  // Hookable type using change notification, limited to every 500ms
  const release = q.feed.hook(() => {
    // since we use the NoteCollection we expect NostrEvent[]
    // other stores provide different data, like a single event instead of an array (latest version)
    const state = q.feed.snapshot as StoreSnapshot<ReturnType<NoteCollection["getSnapshotData"]>>;

    // do something with snapshot of store
    console.log(`We have ${state.data?.length} events now!`);
  });

  // release the hook when its not needed anymore
  // these patterns will be managed in @snort/system-react to make it easier to use react or other UI frameworks
  release();
})();