mirror of
https://github.com/fullstack-cash/bch-api.git
synced 2026-09-22 09:12:05 -07:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a8882bd618 | ||
|
|
a6b139e0c4 | ||
|
|
5880f14e07 | ||
|
|
9bf271b4c2 | ||
|
|
82af58e8b3 | ||
|
|
6d00681d6e | ||
|
|
59043bc154 | ||
|
|
ffb63125e1 | ||
|
|
a3cd832c63 | ||
|
|
12d88e8846 | ||
|
|
17fe219773 | ||
|
|
d76c663f25 | ||
|
|
b1655e843e | ||
|
|
af5d44c278 |
@@ -82,6 +82,20 @@ installation.
|
|||||||
|
|
||||||
`docker-compose up`
|
`docker-compose up`
|
||||||
|
|
||||||
|
## Rate Limits
|
||||||
|
The rate limits for [api.fullstack.cash](https://api.fullstack.cash) are controlled by a JWT token. You can increase your rate limits by [purchasing a JWT token](https://https://fullstack.cash). If you're using bch-js, [check the readme for instructions on increasing rate limits](https://github.com/Permissionless-Software-Foundation/bch-js#api-key). For interacting with bch-api directly, you can then include the JWT token in the HTTP header like this:
|
||||||
|
|
||||||
|
- `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
|
## Support
|
||||||
Have questions? Need help? Join our community support
|
Have questions? Need help? Join our community support
|
||||||
[Telegram channel](https://t.me/bch_js_toolkit)
|
[Telegram channel](https://t.me/bch_js_toolkit)
|
||||||
|
|||||||
@@ -16,6 +16,9 @@ const config = {
|
|||||||
whitelistRateLimit: process.env.WHITELIST_RATE_LIMIT
|
whitelistRateLimit: process.env.WHITELIST_RATE_LIMIT
|
||||||
? Number(process.env.WHITELIST_RATE_LIMIT)
|
? Number(process.env.WHITELIST_RATE_LIMIT)
|
||||||
: 10,
|
: 10,
|
||||||
|
internalRateLimit: process.env.INTERNAL_RATE_LIMIT
|
||||||
|
? Number(process.env.INTERNAL_RATE_LIMIT)
|
||||||
|
: 10,
|
||||||
pointsPerMinute: process.env.POINTS_PER_MINUTE
|
pointsPerMinute: process.env.POINTS_PER_MINUTE
|
||||||
? Number(process.env.POINTS_PER_MINUTE)
|
? Number(process.env.POINTS_PER_MINUTE)
|
||||||
: 10000,
|
: 10000,
|
||||||
|
|||||||
Generated
+1078
-2580
File diff suppressed because it is too large
Load Diff
+3
-3
@@ -16,7 +16,7 @@
|
|||||||
"dev": "nodemon ./dist/app.js",
|
"dev": "nodemon ./dist/app.js",
|
||||||
"test": "npm run lint && npm run test-v4",
|
"test": "npm run lint && npm run test-v4",
|
||||||
"lint": "standard --env mocha --fix",
|
"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": "mocha test/v4/integration",
|
||||||
"test:integration:slpdb": "mocha --timeout 25000 -g '#validate2Single' test/v4/integration/slp*.js",
|
"test:integration:slpdb": "mocha --timeout 25000 -g '#validate2Single' test/v4/integration/slp*.js",
|
||||||
"coverage": "nyc report --reporter=text-lcov | coveralls",
|
"coverage": "nyc report --reporter=text-lcov | coveralls",
|
||||||
@@ -29,7 +29,7 @@
|
|||||||
"node": ">=10.15.1"
|
"node": ">=10.15.1"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@psf/bch-js": "^4.17.6",
|
"@psf/bch-js": "^4.18.0",
|
||||||
"apidoc": "^0.26.0",
|
"apidoc": "^0.26.0",
|
||||||
"axios": "^0.21.1",
|
"axios": "^0.21.1",
|
||||||
"bitcore-lib-cash": "^8.23.1",
|
"bitcore-lib-cash": "^8.23.1",
|
||||||
@@ -70,7 +70,7 @@
|
|||||||
"nock": "^13.0.5",
|
"nock": "^13.0.5",
|
||||||
"nyc": "^15.0.0",
|
"nyc": "^15.0.0",
|
||||||
"prettier": "^2.0.0",
|
"prettier": "^2.0.0",
|
||||||
"semantic-release": "^17.3.9",
|
"semantic-release": "^17.4.2",
|
||||||
"sinon": "^9.0.0",
|
"sinon": "^9.0.0",
|
||||||
"standard": "^14.3.1"
|
"standard": "^14.3.1"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ const ANON_LIMITS = config.anonRateLimit
|
|||||||
const WHITELIST_DOMAINS = config.whitelistDomains
|
const WHITELIST_DOMAINS = config.whitelistDomains
|
||||||
const WHITELIST_POINTS_TO_CONSUME = config.whitelistRateLimit
|
const WHITELIST_POINTS_TO_CONSUME = config.whitelistRateLimit
|
||||||
const POINTS_PER_MINUTE = config.pointsPerMinute
|
const POINTS_PER_MINUTE = config.pointsPerMinute
|
||||||
const INTERNAL_POINTS_TO_CONSUME = 10
|
const INTERNAL_POINTS_TO_CONSUME = config.internalRateLimit
|
||||||
|
|
||||||
class RateLimits {
|
class RateLimits {
|
||||||
constructor () {
|
constructor () {
|
||||||
|
|||||||
@@ -1780,8 +1780,6 @@ class Slp {
|
|||||||
|
|
||||||
// Format the response from SLPDB into an object.
|
// Format the response from SLPDB into an object.
|
||||||
async formatToRestObject (slpDBFormat) {
|
async formatToRestObject (slpDBFormat) {
|
||||||
_this.BigNumber.set({ DECIMAL_PLACES: 8 })
|
|
||||||
|
|
||||||
// console.log(`slpDBFormat.data: ${JSON.stringify(slpDBFormat.data, null, 2)}`)
|
// console.log(`slpDBFormat.data: ${JSON.stringify(slpDBFormat.data, null, 2)}`)
|
||||||
|
|
||||||
const transaction = slpDBFormat.data.u.length
|
const transaction = slpDBFormat.data.u.length
|
||||||
|
|||||||
@@ -154,16 +154,23 @@ class RouteUtils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle 429 errors thrown by nginx
|
// Handle 429 errors
|
||||||
if (err.error) {
|
if (err.error) {
|
||||||
// console.log('decodeError: err: ', err)
|
console.log('decodeError: err: ', err)
|
||||||
|
|
||||||
|
// Error thrown by nginx (usually the SLPDB load balancer.)
|
||||||
if (err.error.includes('429 Too Many Requests')) {
|
if (err.error.includes('429 Too Many Requests')) {
|
||||||
const internalMsg =
|
const internalMsg =
|
||||||
'429 error thrown by nginx caught by route-utils.js/decodeError()'
|
'429 error thrown by nginx caught by route-utils.js/decodeError()'
|
||||||
console.error(internalMsg)
|
console.error(internalMsg)
|
||||||
wlogger.error(internalMsg)
|
wlogger.error(internalMsg)
|
||||||
|
|
||||||
|
return {
|
||||||
|
msg: '429 Too Many Requests',
|
||||||
|
status: 429
|
||||||
|
}
|
||||||
|
} else if (err.error.includes('Too many requests')) {
|
||||||
|
// Error is being thrown by bch-api rate limit middleware.
|
||||||
return {
|
return {
|
||||||
msg: '429 Too Many Requests',
|
msg: '429 Too Many Requests',
|
||||||
status: 429
|
status: 429
|
||||||
|
|||||||
@@ -15,7 +15,11 @@ var NETWORK = process.env.NETWORK
|
|||||||
var LOG_MAX_SIZE = process.env.LOG_MAX_SIZE ? process.env.LOG_MAX_SIZE : '1m'
|
var LOG_MAX_SIZE = process.env.LOG_MAX_SIZE ? process.env.LOG_MAX_SIZE : '1m'
|
||||||
|
|
||||||
// Default 5 days.
|
// 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.
|
// Configure daily-rotation transport.
|
||||||
var transport = new winston.transports.DailyRotateFile({
|
var transport = new winston.transports.DailyRotateFile({
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
Unit tests for the route-utils.js library.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const assert = require('chai').assert
|
||||||
|
|
||||||
|
const RouteUtils = require('../../src/util/route-utils.js')
|
||||||
|
|
||||||
|
describe('#route-utils', () => {
|
||||||
|
let uut
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
uut = new RouteUtils()
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('#decodeError', () => {
|
||||||
|
it('should decode a 429 error from nginx', () => {
|
||||||
|
const err = {
|
||||||
|
error: '<html>\r\n<head><title>429 Too Many Requests</title></head>\r\n<body>\r\n<center><h1>429 Too Many Requests</h1></center>\r\n<hr><center>nginx/1.18.0 (Ubuntu)</center>\r\n</body>\r\n</html>\r\n',
|
||||||
|
level: 'error',
|
||||||
|
message: 'Error in slp.js/hydrateUtxos().',
|
||||||
|
timestamp: '2021-03-31T04:13:36.662Z'
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = uut.decodeError(err)
|
||||||
|
// console.log('result: ', result)
|
||||||
|
|
||||||
|
assert.property(result, 'msg')
|
||||||
|
assert.equal(result.msg, '429 Too Many Requests')
|
||||||
|
assert.property(result, 'status')
|
||||||
|
assert.equal(result.status, 429)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
Reference in New Issue
Block a user