diff --git a/package-lock.json b/package-lock.json index 562d703..9810a74 100644 --- a/package-lock.json +++ b/package-lock.json @@ -395,9 +395,9 @@ } }, "@psf/bch-js": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/@psf/bch-js/-/bch-js-4.16.1.tgz", - "integrity": "sha512-0rAOLGwxuzCrpe6dbz5nQ9KQTJIJNGzihSVSVfv0PXIeBKQKq+MuEG7u6rZXNeJlLWokosGwf6aysK2EbDGcqA==", + "version": "4.17.6", + "resolved": "https://registry.npmjs.org/@psf/bch-js/-/bch-js-4.17.6.tgz", + "integrity": "sha512-dXR3S7wHZEivB/1LvvuBaAxn8FRRQpBrLtLcuL8c1J9v82xMO+qVr6AwvsOjFzHmcswuT1jlzQ3X1XPAaRgb5w==", "requires": { "@psf/bip21": "^2.0.1", "@psf/bip32-utils": "^1.0.0", @@ -931,23 +931,23 @@ } }, "@uppy/companion-client": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@uppy/companion-client/-/companion-client-1.8.2.tgz", - "integrity": "sha512-FBjAJU3xaWRqYXDBlrMDQKlRBqi4Ng54Dmnoe3hGSggfgBQAl9RzRAg0WvrGjaK3QjCTZPhzSdTpBrqDP22Rng==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@uppy/companion-client/-/companion-client-1.8.3.tgz", + "integrity": "sha512-IieE5DMmJC1rJrXHB2u1cO+r3BF7VqnezFAZj8gkNm7zBuplswKALlvwnXI+KU3TNs8isU55xK5yfF0ecglIEw==", "requires": { - "@uppy/utils": "^3.4.1", + "@uppy/utils": "^3.4.2", "namespace-emitter": "^2.0.1", "qs-stringify": "^1.1.0" } }, "@uppy/core": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/@uppy/core/-/core-1.16.1.tgz", - "integrity": "sha512-GI8baCa1S21j7KoCq0LK4MLD6sII8OvWVgp+auXNcZIbKa182dOMQRtk7bXVY0OzS1TxkIq0DAzDEUnP7MbnDg==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/@uppy/core/-/core-1.16.2.tgz", + "integrity": "sha512-JWK03gXiMMZ+lSVj+v9FIFEOUbKyvRX4v2kaYhf0NqD1MssCwMQe4mvL2MNzjOaYFBwMRacDJh8Mvz2gbu2Vqw==", "requires": { "@transloadit/prettier-bytes": "0.0.7", "@uppy/store-default": "^1.2.5", - "@uppy/utils": "^3.4.1", + "@uppy/utils": "^3.4.2", "cuid": "^2.1.1", "lodash.throttle": "^4.1.1", "mime-match": "^1.0.2", @@ -961,19 +961,19 @@ "integrity": "sha512-jnf0U8cfb8Bhgt6yh86YRJO9EEnCyG9BgXZ8dPWWLybgC9Expw3Ah/s3T21tcdChgv4zzdhSACd0JKxCQowyYg==" }, "@uppy/tus": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@uppy/tus/-/tus-1.8.5.tgz", - "integrity": "sha512-a5z+bpAyKKKRWNSOYtIMd2EAKsM7BLhd6hQg2YrQNFFzdwbxaeqmrjKIVW1EUBvg1if/ZZePEm0QevJvNwQs0g==", + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@uppy/tus/-/tus-1.8.6.tgz", + "integrity": "sha512-axK+TzRRvSkYZUIjfe6XCjfO5NPb/k8AC73p+MOKOzth1JHSZSJHqYi8+HY7T4aXgR86vWE/cE+wHsjvPhyCZw==", "requires": { - "@uppy/companion-client": "^1.8.2", - "@uppy/utils": "^3.4.1", + "@uppy/companion-client": "^1.8.3", + "@uppy/utils": "^3.4.2", "tus-js-client": "^2.1.1" } }, "@uppy/utils": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@uppy/utils/-/utils-3.4.1.tgz", - "integrity": "sha512-9YVKjVRK/AmX3yV0GJsD5p/eHUzqn4+eXzsjv3wHahipKCo0o7Jwpw/7kl+bv12EHOOy5jPsATWkjn40aSWW8w==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@uppy/utils/-/utils-3.4.2.tgz", + "integrity": "sha512-PWLZgX4L+0tdBqImncuATDYb1M6RHgDfGDZCh2Qg+PTG+btyyZ4/GkOEwK5fJ4Gw1gNgWF0ewAFL28+oCrD7/Q==", "requires": { "abortcontroller-polyfill": "^1.4.0", "lodash.throttle": "^4.1.1" @@ -10930,9 +10930,12 @@ "dev": true }, "qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==" + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "requires": { + "side-channel": "^1.0.4" + } }, "qs-stringify": { "version": "1.2.1", diff --git a/package.json b/package.json index 045c5f7..5522caf 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "node": ">=10.15.1" }, "dependencies": { - "@psf/bch-js": "^4.16.1", + "@psf/bch-js": "^4.17.6", "apidoc": "^0.26.0", "axios": "^0.21.1", "bitcore-lib-cash": "^8.23.1", diff --git a/src/app.js b/src/app.js index cc3300c..91aba75 100644 --- a/src/app.js +++ b/src/app.js @@ -189,9 +189,11 @@ server.listen(port) server.on('error', onError) server.on('listening', onListening) -// Set the time before a timeout error is generated. This impacts testing and -// the handling of timeout errors. Is 10 seconds too agressive? -server.setTimeout(30 * 1000) +// Set the time before a timeout error is generated. +// 10 seconds is way too agressive. 30 Seconds was used for a while, but with +// being able to set a timeout between UTXOs for tokenUtxoDetails, the timeout +// needed to be extended. +server.setTimeout(1000 * 60 * 5) // 5 minutes /** * Normalize a port into a number, string, or false. diff --git a/src/middleware/route-ratelimit.js b/src/middleware/route-ratelimit.js index a315184..aab21f5 100644 --- a/src/middleware/route-ratelimit.js +++ b/src/middleware/route-ratelimit.js @@ -82,11 +82,11 @@ class RateLimits { // Determine if the call is an external or internal API call. const isInternal = _this.checkInternalIp(req) - console.log(`isInternal: ${isInternal}`) + // console.log(`isInternal: ${isInternal}`) // Determine if the call originates from another computer on the intranet. const isWhitelistOrigin = _this.isInWhitelist(req) - console.log('isWhitelistOrigin: ', isWhitelistOrigin) + // console.log('isWhitelistOrigin: ', isWhitelistOrigin) // Handle the use case of internally-generated requests. if (isInternal) { @@ -94,15 +94,15 @@ class RateLimits { // the usrObj in the body. if (req.body && req.body.usrObj) { if (req.body.usrObj.proLimit) { - console.log('Internal call, basic auth, skipping rate limits.') + // console.log('Internal call, basic auth, skipping rate limits.') // If this is an internal call that originated from a user using // Basic Authentication, then skip rate-limits. return next() } else { - console.log( - 'Internal call, applying rate limits. Using JWT if available.' - ) + // console.log( + // 'Internal call, applying rate limits. Using JWT if available.' + // ) // Determine if user has exceeded their rate limits. Pass in the // JWT token if one exists. @@ -130,10 +130,10 @@ class RateLimits { // and avoid this code path. This code path is 'pooled': all users // share the same rate limits. Even at 1000 RPM, this pool will get // exhausted easily. - const warnMsg = - 'Internal call. req.body.usrObj does not exist. Applying high-speed internal rate limits.' - console.log(warnMsg) - wlogger.info(warnMsg) + // const warnMsg = + // 'Internal call. req.body.usrObj does not exist. Applying high-speed internal rate limits.' + // console.log(warnMsg) + // wlogger.info(warnMsg) const defaultPayload = { id: '98.76.54.32', @@ -168,9 +168,9 @@ class RateLimits { // } else { // Handle the normal use-case of external requests - console.log( - 'External call, applying rate limits. Using JWT if available.' - ) + // console.log( + // 'External call, applying rate limits. Using JWT if available.' + // ) // For calls originating from a whitelist domain, apply a high-RPM // JWT token to the call. @@ -233,7 +233,7 @@ class RateLimits { pointsToConsume = decoded.pointsToConsume } - console.log(`rate limit key: ${key}`) + // console.log(`rate limit key: ${key}`) // This function will throw an error if the user exceeds the rate limit. // The 429 error response is handled by the catch(). @@ -244,7 +244,7 @@ class RateLimits { // Signal that the user has not exceeded their rate limits. return false } catch (err) { - console.log('err: ', err) + // console.log('err: ', err) const rateLimit = Math.floor(POINTS_PER_MINUTE / pointsToConsume) @@ -307,7 +307,8 @@ class RateLimits { // Retrieve the origin. const origin = req.get('origin') - console.log(`origin: ${origin}`) + + if (!process.env.TEST) console.log('origin:', origin) // If the origin is not determinable, return false. if (!origin) return false diff --git a/test/v4/rate-limit-unit.js b/test/v4/rate-limit-unit.js index b05ef50..2b3dd6d 100644 --- a/test/v4/rate-limit-unit.js +++ b/test/v4/rate-limit-unit.js @@ -129,7 +129,7 @@ describe('#rate-routelimit', () => { 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjVlODhhY2JmMDIyMWMxMDAxMmFkOTNmZiIsImVtYWlsIjoiY2hyaXMudHJvdXRuZXJAZ21haWwuY29tIiwiYXBpTGV2ZWwiOjQwLCJyYXRlTGltaXQiOjMsImlhdCI6MTYxNTE1NzA4NywiZXhwIjoxNjE3NzQ5MDg3fQ.RLNGuYAa-CcLdhTGD27tDeaxT6-GIdeR8T4JWZZLDZA' const result = uut.decodeJwtToken(jwt) - console.log('result: ', result) + // console.log('result: ', result) assert.property(result, 'id') // assert.equal(result.id, '123.456.789.10') @@ -309,10 +309,10 @@ describe('#rate-routelimit', () => { let val for (let i = 0; i < 25; i++) { - console.log('req.locals: ', req.locals) + // console.log('req.locals: ', req.locals) val = await uut.applyRateLimits(req, res, next) } - console.log('val: ', val) + // console.log('val: ', val) assert.property(val, 'error') assert.include( @@ -446,7 +446,7 @@ describe('#rate-routelimit', () => { // Generate a new JWT token for the test. const jwtPayload = { id: '5dade3f5739e6c0ff034b9a1', - pointsToConsume: 10 + pointsToConsume: 100 } const jwtToken = uut.generateJwtToken(jwtPayload) @@ -460,7 +460,7 @@ describe('#rate-routelimit', () => { for (let i = 0; i < 120; i++) { val = await uut.applyRateLimits(req, res, next) } - console.log('val: ', val) + // console.log('val: ', val) assert.property(val, 'error') assert.include( @@ -470,11 +470,12 @@ describe('#rate-routelimit', () => { assert.equal( res.locals.pointsToConsume, - 10, + 100, 'User JWT rate limits applied' ) } catch (err) { console.log('err: ', err) + assert.fail('Unexpected result') } })