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