mirror of
https://github.com/fullstack-cash/bch-api.git
synced 2026-09-22 01:02:05 -07:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
015c33faff | ||
|
|
738c643c1b | ||
|
|
69ce039882 | ||
|
|
1642603b78 | ||
|
|
a8882bd618 | ||
|
|
a6b139e0c4 | ||
|
|
5880f14e07 | ||
|
|
9bf271b4c2 | ||
|
|
82af58e8b3 | ||
|
|
6d00681d6e |
@@ -30,6 +30,7 @@ start-fullstack-abc.sh
|
||||
start-fullstack-bchn.sh
|
||||
start-ss-main.sh
|
||||
start-decatur-bchn.sh
|
||||
shell-scripts/
|
||||
|
||||
coverage
|
||||
start-my-infra
|
||||
|
||||
@@ -87,6 +87,15 @@ The rate limits for [api.fullstack.cash](https://api.fullstack.cash) are control
|
||||
|
||||
- `Authorization: Token <JWT token>`
|
||||
|
||||
### cURL example
|
||||
Here is an example using curl for using the JWT token when making a call to the REST API:
|
||||
|
||||
```
|
||||
export BCHJSTOKEN=eyJhbGciOiJ....
|
||||
|
||||
curl "https://bchn.fullstack.cash/v4/electrumx/balance/bitcoincash:qr69kyzha07dcecrsvjwsj4s6slnlq4r8c30lxnur3" -X GET -H "Content-Type: application/json" -H "Authorization: Token ${BCHJSTOKEN}"
|
||||
```
|
||||
|
||||
## Support
|
||||
Have questions? Need help? Join our community support
|
||||
[Telegram channel](https://t.me/bch_js_toolkit)
|
||||
|
||||
@@ -16,6 +16,9 @@ const config = {
|
||||
whitelistRateLimit: process.env.WHITELIST_RATE_LIMIT
|
||||
? Number(process.env.WHITELIST_RATE_LIMIT)
|
||||
: 10,
|
||||
internalRateLimit: process.env.INTERNAL_RATE_LIMIT
|
||||
? Number(process.env.INTERNAL_RATE_LIMIT)
|
||||
: 10,
|
||||
pointsPerMinute: process.env.POINTS_PER_MINUTE
|
||||
? Number(process.env.POINTS_PER_MINUTE)
|
||||
: 10000,
|
||||
|
||||
+2
-2
@@ -16,14 +16,14 @@
|
||||
"dev": "nodemon ./dist/app.js",
|
||||
"test": "npm run lint && npm run test-v4",
|
||||
"lint": "standard --env mocha --fix",
|
||||
"test-v4": "export NETWORK=mainnet && nyc --reporter=text mocha --timeout 60000 test/v4/",
|
||||
"test-v4": "export NETWORK=mainnet && nyc --reporter=text mocha --exit --timeout 60000 test/v4/",
|
||||
"test:integration": "mocha test/v4/integration",
|
||||
"test:integration:slpdb": "mocha --timeout 25000 -g '#validate2Single' test/v4/integration/slp*.js",
|
||||
"coverage": "nyc report --reporter=text-lcov | coveralls",
|
||||
"coverage:report": "export NETWORK=mainnet && nyc --reporter=html mocha --timeout 25000 test/v4/",
|
||||
"docs": "./node_modules/.bin/apidoc -i src/routes/v4 -o docs",
|
||||
"test:temp1": "export NETWORK=mainnet && export TEST=integration && mocha --exit --timeout 25000 -g '#hydrateUtxos-' test/v4/integration/",
|
||||
"test:temp2": "mocha test/v4/rate-limit2-unit.js"
|
||||
"test:temp2": "mocha -g '#rate-routelimit' --timeout 30000 test/v4/"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10.15.1"
|
||||
|
||||
@@ -56,7 +56,7 @@ const ANON_LIMITS = config.anonRateLimit
|
||||
const WHITELIST_DOMAINS = config.whitelistDomains
|
||||
const WHITELIST_POINTS_TO_CONSUME = config.whitelistRateLimit
|
||||
const POINTS_PER_MINUTE = config.pointsPerMinute
|
||||
const INTERNAL_POINTS_TO_CONSUME = 10
|
||||
const INTERNAL_POINTS_TO_CONSUME = config.internalRateLimit
|
||||
|
||||
class RateLimits {
|
||||
constructor () {
|
||||
@@ -154,6 +154,7 @@ class RateLimits {
|
||||
res,
|
||||
defaultJwt
|
||||
)
|
||||
// console.log(`hasExceededRateLimit: `, hasExceededRateLimit)
|
||||
|
||||
if (!hasExceededRateLimit) {
|
||||
// Rate limits have not been exceeded. Processing can continue.
|
||||
@@ -195,6 +196,7 @@ class RateLimits {
|
||||
res,
|
||||
req.locals.jwtToken
|
||||
)
|
||||
// console.log('hasExceededRateLimit: ', hasExceededRateLimit)
|
||||
|
||||
if (!hasExceededRateLimit) {
|
||||
// Rate limits have not been exceeded. Processing can continue.
|
||||
@@ -220,8 +222,12 @@ class RateLimits {
|
||||
async trackRateLimits (req, res, jwtToken) {
|
||||
// Anonymous rate limits are used by default.
|
||||
let pointsToConsume = ANON_LIMITS
|
||||
// console.log('pointsToConsume: ', pointsToConsume)
|
||||
|
||||
let key = req.ip // Use the IP address as the key, by default.
|
||||
|
||||
// console.log('jwtToken: ', jwtToken)
|
||||
|
||||
try {
|
||||
// Decode the JWT token if it exists
|
||||
if (jwtToken) {
|
||||
@@ -239,6 +245,10 @@ class RateLimits {
|
||||
// The 429 error response is handled by the catch().
|
||||
await _this.rateLimiter.consume(key, pointsToConsume)
|
||||
|
||||
// Debugging
|
||||
// const rateLimitData = await _this.rateLimiter.consume(key, pointsToConsume)
|
||||
// console.log(`rateLimitData: `, rateLimitData)
|
||||
|
||||
res.locals.pointsToConsume = pointsToConsume // Feedback for tests.
|
||||
|
||||
// Signal that the user has not exceeded their rate limits.
|
||||
|
||||
@@ -15,7 +15,11 @@ var NETWORK = process.env.NETWORK
|
||||
var LOG_MAX_SIZE = process.env.LOG_MAX_SIZE ? process.env.LOG_MAX_SIZE : '1m'
|
||||
|
||||
// Default 5 days.
|
||||
var LOG_MAX_FILES = process.env.LOG_MAX_FILES ? process.env.LOG_MAX_FILES : '5d'
|
||||
// This was causing a problem with popularity. Creating over a gigabyte of files.
|
||||
// var LOG_MAX_FILES = process.env.LOG_MAX_FILES ? process.env.LOG_MAX_FILES : '5d'
|
||||
|
||||
// 250 files @ 1Meg each = 250 megs
|
||||
var LOG_MAX_FILES = process.env.LOG_MAX_FILES ? process.env.LOG_MAX_FILES : '250'
|
||||
|
||||
// Configure daily-rotation transport.
|
||||
var transport = new winston.transports.DailyRotateFile({
|
||||
|
||||
@@ -48,12 +48,12 @@ export PRO_PASS=somerandomepassword:someotherrandompassword:aThirdPassword
|
||||
# that originate froma domain on the whitelist.
|
||||
export WHITELIST_DOMAINS=fullstack.cash,psfoundation.cash,torlist.cash
|
||||
|
||||
# Rate Limits. Numbers are divided into 1000. e.g. 1000 / 50 = 20 RPM for ANON.
|
||||
# Rate Limits. Numbers are divided into 1000. e.g. 10000 / 500 = 20 RPM for ANON.
|
||||
# Requests use the ANON rate limit if they fail to pass in a JWT token.
|
||||
# ANON = 20 requests per minute (RPM)
|
||||
export ANON_RATE_LIMIT=50
|
||||
# 10 = 100 RPM
|
||||
export WHITELIST_RATE_LIMIT=10
|
||||
export ANON_RATE_LIMIT=500
|
||||
# 10 = 1000 RPM
|
||||
export WHITELIST_RATE_LIMIT=100
|
||||
|
||||
# Set logging parameters
|
||||
#1m means no more than 1 megabyte
|
||||
|
||||
@@ -250,6 +250,7 @@ describe('#Raw-Transactions', () => {
|
||||
'Proper error message'
|
||||
)
|
||||
})
|
||||
|
||||
it('returns proper error when downstream service stalls', async () => {
|
||||
req.body.hexes = [
|
||||
'0200000001b9b598d7d6d72fc486b2b3a3c03c79b5bade6ec9a77ced850515ab5e64edcc21010000006b483045022100a7b1b08956abb8d6f322aa709d8583c8ea492ba0585f1a6f4f9983520af74a5a0220411aee4a9a54effab617b0508c504c31681b15f9b187179b4874257badd4139041210360cfc66fdacb650bc4c83b4e351805181ee696b7d5ab4667c57b2786f51c413dffffffff0210270000000000001976a914eb4b180def88e3f5625b2d8ae2c098ff7d85f66488ac786e9800000000001976a914eb4b180def88e3f5625b2d8ae2c098ff7d85f66488ac00000000'
|
||||
|
||||
Reference in New Issue
Block a user