factory.go raw

   1  //go:build !(js && wasm)
   2  
   3  package ratelimit
   4  
   5  import (
   6  	"time"
   7  
   8  	"github.com/dgraph-io/badger/v4"
   9  	"github.com/neo4j/neo4j-go-driver/v5/neo4j"
  10  	"next.orly.dev/pkg/interfaces/loadmonitor"
  11  )
  12  
  13  // NewBadgerLimiter creates a rate limiter configured for a Badger database.
  14  // It automatically creates a BadgerMonitor for the provided database.
  15  func NewBadgerLimiter(config Config, db *badger.DB) *Limiter {
  16  	monitor := NewBadgerMonitor(db, 100*time.Millisecond)
  17  	return NewLimiter(config, monitor)
  18  }
  19  
  20  // NewNeo4jLimiter creates a rate limiter configured for a Neo4j database.
  21  // It automatically creates a Neo4jMonitor for the provided driver.
  22  // querySem should be the semaphore used to limit concurrent queries.
  23  // maxConcurrency is typically 10 (matching the semaphore size).
  24  func NewNeo4jLimiter(
  25  	config Config,
  26  	driver neo4j.DriverWithContext,
  27  	querySem chan struct{},
  28  	maxConcurrency int,
  29  ) *Limiter {
  30  	monitor := NewNeo4jMonitor(driver, querySem, maxConcurrency, 100*time.Millisecond)
  31  	return NewLimiter(config, monitor)
  32  }
  33  
  34  // NewDisabledLimiter creates a rate limiter that is disabled.
  35  // This is useful when rate limiting is not configured.
  36  func NewDisabledLimiter() *Limiter {
  37  	config := DefaultConfig()
  38  	config.Enabled = false
  39  	return NewLimiter(config, nil)
  40  }
  41  
  42  // MonitorFromBadgerDB creates a BadgerMonitor from a Badger database.
  43  // Exported for use when you need to create the monitor separately.
  44  func MonitorFromBadgerDB(db *badger.DB) loadmonitor.Monitor {
  45  	return NewBadgerMonitor(db, 100*time.Millisecond)
  46  }
  47  
  48  // MonitorFromNeo4jDriver creates a Neo4jMonitor from a Neo4j driver.
  49  // Exported for use when you need to create the monitor separately.
  50  func MonitorFromNeo4jDriver(
  51  	driver neo4j.DriverWithContext,
  52  	querySem chan struct{},
  53  	maxConcurrency int,
  54  ) loadmonitor.Monitor {
  55  	return NewNeo4jMonitor(driver, querySem, maxConcurrency, 100*time.Millisecond)
  56  }
  57  
  58  // NewMemoryOnlyLimiter creates a rate limiter that only monitors process memory.
  59  // Useful for database backends that don't have their own load metrics.
  60  func NewMemoryOnlyLimiter(config Config) *Limiter {
  61  	monitor := NewMemoryMonitor(100 * time.Millisecond)
  62  	return NewLimiter(config, monitor)
  63  }
  64