Skip to content

Commit 6e12bc1

Browse files
Added readme, license and code of conduct.
Fixed documentation typo for stores constructors
1 parent b3264ea commit 6e12bc1

File tree

5 files changed

+249
-2
lines changed

5 files changed

+249
-2
lines changed

code_of_conduct.md

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
2+
# Contributor Covenant Code of Conduct
3+
4+
## Our Pledge
5+
6+
We as members, contributors, and leaders pledge to make participation in our
7+
community a harassment-free experience for everyone, regardless of age, body
8+
size, visible or invisible disability, ethnicity, sex characteristics, gender
9+
identity and expression, level of experience, education, socio-economic status,
10+
nationality, personal appearance, race, caste, color, religion, or sexual
11+
identity and orientation.
12+
13+
We pledge to act and interact in ways that contribute to an open, welcoming,
14+
diverse, inclusive, and healthy community.
15+
16+
## Our Standards
17+
18+
Examples of behavior that contributes to a positive environment for our
19+
community include:
20+
21+
* Demonstrating empathy and kindness toward other people
22+
* Being respectful of differing opinions, viewpoints, and experiences
23+
* Giving and gracefully accepting constructive feedback
24+
* Accepting responsibility and apologizing to those affected by our mistakes,
25+
and learning from the experience
26+
* Focusing on what is best not just for us as individuals, but for the overall
27+
community
28+
29+
Examples of unacceptable behavior include:
30+
31+
* The use of sexualized language or imagery, and sexual attention or advances of
32+
any kind
33+
* Trolling, insulting or derogatory comments, and personal or political attacks
34+
* Public or private harassment
35+
* Publishing others' private information, such as a physical or email address,
36+
without their explicit permission
37+
* Other conduct which could reasonably be considered inappropriate in a
38+
professional setting
39+
40+
## Enforcement Responsibilities
41+
42+
Community leaders are responsible for clarifying and enforcing our standards of
43+
acceptable behavior and will take appropriate and fair corrective action in
44+
response to any behavior that they deem inappropriate, threatening, offensive,
45+
or harmful.
46+
47+
Community leaders have the right and responsibility to remove, edit, or reject
48+
comments, commits, code, wiki edits, issues, and other contributions that are
49+
not aligned to this Code of Conduct, and will communicate reasons for moderation
50+
decisions when appropriate.
51+
52+
## Scope
53+
54+
This Code of Conduct applies within all community spaces, and also applies when
55+
an individual is officially representing the community in public spaces.
56+
Examples of representing our community include using an official e-mail address,
57+
posting via an official social media account, or acting as an appointed
58+
representative at an online or offline event.
59+
60+
## Enforcement
61+
62+
Instances of abusive, harassing, or otherwise unacceptable behavior may be
63+
reported to the community leaders responsible for enforcement at
64+
[INSERT CONTACT METHOD].
65+
All complaints will be reviewed and investigated promptly and fairly.
66+
67+
All community leaders are obligated to respect the privacy and security of the
68+
reporter of any incident.
69+
70+
## Enforcement Guidelines
71+
72+
Community leaders will follow these Community Impact Guidelines in determining
73+
the consequences for any action they deem in violation of this Code of Conduct:
74+
75+
### 1. Correction
76+
77+
**Community Impact**: Use of inappropriate language or other behavior deemed
78+
unprofessional or unwelcome in the community.
79+
80+
**Consequence**: A private, written warning from community leaders, providing
81+
clarity around the nature of the violation and an explanation of why the
82+
behavior was inappropriate. A public apology may be requested.
83+
84+
### 2. Warning
85+
86+
**Community Impact**: A violation through a single incident or series of
87+
actions.
88+
89+
**Consequence**: A warning with consequences for continued behavior. No
90+
interaction with the people involved, including unsolicited interaction with
91+
those enforcing the Code of Conduct, for a specified period of time. This
92+
includes avoiding interactions in community spaces as well as external channels
93+
like social media. Violating these terms may lead to a temporary or permanent
94+
ban.
95+
96+
### 3. Temporary Ban
97+
98+
**Community Impact**: A serious violation of community standards, including
99+
sustained inappropriate behavior.
100+
101+
**Consequence**: A temporary ban from any sort of interaction or public
102+
communication with the community for a specified period of time. No public or
103+
private interaction with the people involved, including unsolicited interaction
104+
with those enforcing the Code of Conduct, is allowed during this period.
105+
Violating these terms may lead to a permanent ban.
106+
107+
### 4. Permanent Ban
108+
109+
**Community Impact**: Demonstrating a pattern of violation of community
110+
standards, including sustained inappropriate behavior, harassment of an
111+
individual, or aggression toward or disparagement of classes of individuals.
112+
113+
**Consequence**: A permanent ban from any sort of public interaction within the
114+
community.
115+
116+
## Attribution
117+
118+
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
119+
version 2.1, available at
120+
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
121+
122+
Community Impact Guidelines were inspired by
123+
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
124+
125+
For answers to common questions about this code of conduct, see the FAQ at
126+
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
127+
[https://www.contributor-covenant.org/translations][translations].
128+
129+
[homepage]: https://www.contributor-covenant.org
130+
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
131+
[Mozilla CoC]: https://github.com/mozilla/diversity
132+
[FAQ]: https://www.contributor-covenant.org/faq
133+
[translations]: https://www.contributor-covenant.org/translations

license.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
MIT License
2+
3+
Copyright (c) 2023 Adrian C. Prelipcean
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy of
6+
this software and associated documentation files (the "Software"), to deal in
7+
the Software without restriction, including without limitation the rights to
8+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9+
the Software, and to permit persons to whom the Software is furnished to do so,
10+
subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in all
13+
copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17+
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

readme.md

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
# rate-limit-postgresql
2+
3+
[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](code_of_conduct.md)
4+
5+
A [`PostgreSQL`](https://www.postgresql.org/) store for the [`express-rate-limit`](https://github.com/nfriedly/express-rate-limit) middleware.
6+
7+
## Installation
8+
9+
From the npm registry:
10+
11+
```sh
12+
# Using npm
13+
> npm install --save @acpr/rate-limit-postgresql
14+
# Using yarn or pnpm
15+
> yarn/pnpm add @acpr/rate-limit-postgresql
16+
```
17+
18+
## Usage
19+
20+
```js
21+
let rateLimit = require('express-rate-limit');
22+
let postgresStores = require('@acpr/rate-limit-postgresql')
23+
24+
let limiter = new RateLimit({
25+
store: new postgresStores.PostgresStore(
26+
{
27+
user: 'postgres',
28+
password: 'postgres',
29+
host: 'localhost',
30+
database: 'rate-limit',
31+
port: 5432
32+
},
33+
'aggregated_store'
34+
),
35+
windowMs: 15 * 60 * 1000, // 15 minutes
36+
max: 3, // Limit each IP to 3 requests per `window` (here, per 15 minutes)
37+
message:
38+
'Too many accounts created from this IP, please try again after 15 minutes',
39+
standardHeaders: 'draft-7', // Set `RateLimit` and `RateLimit-Policy`` headers
40+
legacyHeaders: false,
41+
});
42+
43+
// apply to all requests
44+
app.use(limiter);
45+
```
46+
47+
48+
### Importing
49+
50+
This library is provided in ESM as well as CJS forms, and works with both Javascript and Typescript projects.
51+
52+
**This package requires you to use Node 14 or above.**
53+
54+
Import it in a CommonJS project (`type: commonjs` or no `type` field in `package.json`) as follows:
55+
56+
```ts
57+
let postgresStores = require('@acpr/rate-limit-postgresql')
58+
```
59+
60+
Import it in a ESM project (`type: module` in `package.json`) as follows:
61+
62+
```ts
63+
import postgresStores from '@acpr/rate-limit-postgresql'
64+
```
65+
66+
67+
## Configuration
68+
69+
### Types of Postgres Stores
70+
There are two different types of Postgres Stores:
71+
1. `PostgresStoreAggregatedIP` (with the default `PostgresStore`)- which aggregates the IP count in the table, as shown in the following table
72+
73+
| key | session_id | count |
74+
|-------------|------------|-------|
75+
| 192.168.1.1 | 1 | 3 |
76+
| 192.168.2.1 | 1 | 1 |
77+
78+
79+
2. `PostgresStoreIndividualIP` - which stores the IP of each request in a separate row (as shown in the following table) and performs the aggregation at a separate step
80+
81+
| id | key | session_id | event_time |
82+
|----|-------------|------------|---------------------------|
83+
| 1 | 192.168.1.1 | 1 | 2023-09-13T07:40:09+00:00 |
84+
| 2 | 192.168.1.1 | 1 | 2023-09-13T07:40:10+00:00 |
85+
| 3 | 192.168.1.1 | 1 | 2023-09-13T07:40:11+00:00 |
86+
| 4 | 192.168.2.1 | 1 | 2023-09-13T07:40:11+00:00 |
87+
88+
> Note: The database uses UUID as a data type for IDs, the tables contain integers as IDs to keep illustration simple.
89+
90+
### Constructor
91+
92+
Both types of store take the same input in their constructor
93+
- `config` - The database configuration as specified in the [node-postgres](https://node-postgres.com/apis/client) configuration.
94+
- `name` - The unique name of the session. This is useful when applying multiple rate limiters with multiple stores.

source/stores/aggregated_ip/store_aggregated_ip.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class PostgresStoreAggregatedIP implements Store {
5555
/**
5656
* @constructor for `PostgresStoreAggregatedIP`.
5757
*
58-
* @param config {JSON} - The database configuration as specified in https://node-postgres.com/apis/client.
58+
* @param config {any} - The database configuration as specified in https://node-postgres.com/apis/client.
5959
* @param name {string} - The unique name of the session. This is useful when applying multiple rate limiters with multiple stores.
6060
*/
6161
constructor(config: any, name: string) {

source/stores/individual_ip/store_individual_ip.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class PostgresStoreIndividualIP implements Store {
5555
/**
5656
* @constructor for `PostgresStoreIndividualIP`.
5757
*
58-
* @param config {JSON} - The database configuration as specified in https://node-postgres.com/apis/client.
58+
* @param config {any} - The database configuration as specified in https://node-postgres.com/apis/client.
5959
* @param name {string} - The unique name of the session. This is useful when applying multiple rate limiters with multiple stores.
6060
*/
6161
constructor(config: any, name: string) {

0 commit comments

Comments
 (0)