upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/components/wisp_relay/rate_limiter.h
blob: 655ddf2567e36d189433201b750791c2c8152786 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#ifndef RATE_LIMITER_H
#define RATE_LIMITER_H

#include <stdint.h>
#include <stdbool.h>
#include "freertos/FreeRTOS.h"
#include "freertos/semphr.h"

#define RATE_LIMITER_MAX_BUCKETS 16

typedef enum {
    RATE_TYPE_EVENT,
    RATE_TYPE_REQ,
} rate_type_t;

typedef struct {
    uint16_t events_per_minute;
    uint16_t reqs_per_minute;
} rate_config_t;

typedef struct {
    int      fd;
    uint16_t event_count;
    uint16_t req_count;
    uint32_t window_start;
    bool     active;
} rate_bucket_t;

typedef struct rate_limiter {
    rate_config_t config;
    rate_bucket_t buckets[RATE_LIMITER_MAX_BUCKETS];
    SemaphoreHandle_t lock;
} rate_limiter_t;

void rate_limiter_init(rate_limiter_t *rl, const rate_config_t *config);
void rate_limiter_destroy(rate_limiter_t *rl);
bool rate_limiter_check(rate_limiter_t *rl, int fd, rate_type_t type);
void rate_limiter_reset(rate_limiter_t *rl, int fd);

#endif