You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
56 lines
1.8 KiB
56 lines
1.8 KiB
//go:build !(js && wasm) |
|
|
|
package ratelimit |
|
|
|
import ( |
|
"time" |
|
|
|
"github.com/dgraph-io/badger/v4" |
|
"github.com/neo4j/neo4j-go-driver/v5/neo4j" |
|
"next.orly.dev/pkg/interfaces/loadmonitor" |
|
) |
|
|
|
// NewBadgerLimiter creates a rate limiter configured for a Badger database. |
|
// It automatically creates a BadgerMonitor for the provided database. |
|
func NewBadgerLimiter(config Config, db *badger.DB) *Limiter { |
|
monitor := NewBadgerMonitor(db, 100*time.Millisecond) |
|
return NewLimiter(config, monitor) |
|
} |
|
|
|
// NewNeo4jLimiter creates a rate limiter configured for a Neo4j database. |
|
// It automatically creates a Neo4jMonitor for the provided driver. |
|
// querySem should be the semaphore used to limit concurrent queries. |
|
// maxConcurrency is typically 10 (matching the semaphore size). |
|
func NewNeo4jLimiter( |
|
config Config, |
|
driver neo4j.DriverWithContext, |
|
querySem chan struct{}, |
|
maxConcurrency int, |
|
) *Limiter { |
|
monitor := NewNeo4jMonitor(driver, querySem, maxConcurrency, 100*time.Millisecond) |
|
return NewLimiter(config, monitor) |
|
} |
|
|
|
// NewDisabledLimiter creates a rate limiter that is disabled. |
|
// This is useful when rate limiting is not configured. |
|
func NewDisabledLimiter() *Limiter { |
|
config := DefaultConfig() |
|
config.Enabled = false |
|
return NewLimiter(config, nil) |
|
} |
|
|
|
// MonitorFromBadgerDB creates a BadgerMonitor from a Badger database. |
|
// Exported for use when you need to create the monitor separately. |
|
func MonitorFromBadgerDB(db *badger.DB) loadmonitor.Monitor { |
|
return NewBadgerMonitor(db, 100*time.Millisecond) |
|
} |
|
|
|
// MonitorFromNeo4jDriver creates a Neo4jMonitor from a Neo4j driver. |
|
// Exported for use when you need to create the monitor separately. |
|
func MonitorFromNeo4jDriver( |
|
driver neo4j.DriverWithContext, |
|
querySem chan struct{}, |
|
maxConcurrency int, |
|
) loadmonitor.Monitor { |
|
return NewNeo4jMonitor(driver, querySem, maxConcurrency, 100*time.Millisecond) |
|
}
|
|
|