npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@nostrwatch/nostrawl

v0.0.4

Published

A nostr library for continously retrieving events from nostr relays based on a set of filters.

Downloads

226

Readme

early alpha. the example works, but no tests are written yet. Also the PQueueAdapter is not yet implemented.

nostrawl

Trawl [/trɔːl/]

  1. an act of fishing with a trawl net or seine.
  2. a thorough search.

nostrawl is a simple tool for persistently fetching and processing filtered events from a set of nostr relays.

nostrawl wraps nostr-fetch (with the nostr-tools simple-pool adapter) and implements adapters for queuing fetch jobs. Implements an LMDB cache that can be accessed via provided parser and validator functions.

Install

pnpm install @nostrwatch/nostrawl

npm package soon

Run Example

With docker

pnpm run example

With a local redis instance. Use defaults, or set with envvars (REDIS_HOST, REDIS_PORT, etc)

node examples/bullmq/index.js

Note: This example is for demonstration purposes only, the example will likely hit memory limits if left running too long

Run Tests

What tests?

Docs

I'll write docs once there are tests, both adapters are implemented and there is demand.

Queue Adapters

  • BullMQAdapter: Redis-based queue adapter
  • PQueueAdapter: Process-bound queue adapter

Usage

import { nostrawl } from 'nostrawl'
import dotenv from 'dotenv'
dotenv.config()

const relays = ["wss://relay.damus.io","wss://nostr-pub.wellorder.net","wss://nostr.mom","wss://nostr.slothy.win","wss://global.relay.red"]

const options = {
  filters: { kinds: [3] },
  adapter: 'bullmq',
  queueName: 'ContactLists',
  repeatWhenComplete: true,
  restDuration: 60*60*1000,
  strictTimestamps: true,
  relaysPerBatch: 3,
  since: Math.round(Date.now()/1000-(60*60)),
  nostrFetchOptions: {
    sort: true
  },
  adapterOptions: {
    redis: {
      host: process.env.REDIS_HOST || 'localhost',
      port: process.env.REDIS_PORT || 6379, 
      db: process.env.REDIS_DB || 0 
    }
  },
  queueOptions: {
    removeOnComplete: true, 
    removeOnFail: true
  },
  //the cache is used internal to remember the last time 
  //a relay was filtered against, so it can resume from
  //there later. It uses to the key `lastUpdate:${timestamp}`
  //so be weary of that. 
  parser: async ($trawler, event) => {
    $trawler.cache.put(`found:${event.id}`)
  },
  validator: ($trawler, event) => {
    if($trawler.cache.get(`found:${event.id`))
      return false 
    return true
  } 
}

const trawler = nostrawl(relays, options)

trawler
  .on_worker('progress', (job, progress) => console.log(`[@${progress.last_timestamp}] ${progress.found} events found and ${progress.rejected} events rejected from  ${progress.relay}`))
  .on_queue('drained', () => console.log(`queue is empty`))
  .on_worker('completed', (job) => console.log(`${job.id} completed`))

trawler.run()