Skip to content

Commit 4d12c38

Browse files
authored
Merge pull request #145 from KTH/feat/add-redis-dependency
Feat/add redis dependency
2 parents 62df531 + e8ac2c4 commit 4d12c38

File tree

10 files changed

+99
-48
lines changed

10 files changed

+99
-48
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22

33
All notable changes for major version updates will be documented here.
44

5+
## 4.3.0
6+
7+
### Changed
8+
9+
Will fail and exit on statup if an unsupported "redis" instance is passed.
10+
511
## 4.0.0
612

713
Name change kth-node-api-call -> @kth/api-call

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ const apiKey = {
4242
const options = {
4343
timeout: 5000, // milliseconds, retry interval if getting API-paths fails
4444
log: myLogger, // your logger instance
45-
redis: myRedis, // your redis instance
45+
redis: myRedis, // optional kth-node-redis instance
4646
cache: cacheConfig, // your api cache options
4747
checkAPIs: true,
4848
}

basic.js

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -136,28 +136,14 @@ function _wrapCallback(api, options, method, callback) {
136136
const redisData = { ...result, body }
137137
const value = JSON.stringify(redisData)
138138

139-
let redisMaybeFnc = api._redis.client
140-
if (typeof api._redis.client === 'function') {
141-
const { clientName, clientOptions } = api._redis
142-
if (clientName == null && clientOptions == null) {
143-
redisMaybeFnc = api._redis.client()
144-
} else {
145-
redisMaybeFnc = api._redis.client(clientName || 'default', clientOptions || null)
146-
}
147-
}
139+
const redisClient = api._redis.client
148140

149-
Promise.resolve(redisMaybeFnc)
150-
.then(client => {
151-
client.set(key, value, err => {
152-
if (err) callback(err)
153-
})
154-
client.expire(key, api._redis.expire || 300, err => {
155-
if (err) callback(err)
156-
})
157-
})
158-
.catch(err => {
159-
callback(err)
160-
})
141+
redisClient.set(key, value, err => {
142+
if (err) callback(err)
143+
})
144+
redisClient.expire(key, api._redis.expire || 300, err => {
145+
if (err) callback(err)
146+
})
161147
}
162148

163149
callback(error, result, body)

basic.test.js

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,12 @@ const opts = {
3232
log: mockLogger,
3333
redis: {
3434
prefix: 'mocktest',
35-
client() {
36-
return Promise.resolve({
37-
set: redisSet,
38-
get: redisGet,
39-
expire: (key, limit, callback) => {
40-
callback(undefined, 'OK')
41-
},
42-
})
35+
client: {
36+
set: redisSet,
37+
get: redisGet,
38+
expire: (key, limit, callback) => {
39+
callback(undefined, 'OK')
40+
},
4341
},
4442
expire: undefined,
4543
},

connections.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
'use strict'
22

3+
const { createRedisWrapper } = require('./redisWrapper')
4+
35
const urlJoin = require('url-join')
46
const BasicAPI = require('./basic')
57

@@ -146,7 +148,7 @@ function getRedisClient(apiName, opts) {
146148
try {
147149
if (cache[apiName]) {
148150
const cacheConfig = getRedisConfig(apiName, cache)
149-
resolve(() => redis(apiName, cacheConfig.redis))
151+
resolve(createRedisWrapper(apiName, redis, cacheConfig.redis))
150152
}
151153
} catch (err) {
152154
opts.log.error('Error creating Redis client', err)
@@ -171,6 +173,10 @@ function configureApiCache(connectedApi, opts) {
171173
})
172174
.catch(err => {
173175
opts.log.error('Unable to create redisClient', { error: err })
176+
if (err.message.includes('unsupported Redis version')) {
177+
opts.log.error(err)
178+
process.exit(1)
179+
}
174180
connectedApi.client._hasRedis = false // eslint-disable-line no-param-reassign
175181
})
176182
opts.log.debug(`API configured to use redis cache: ${apiName}`)

connections.test.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
/* eslint-disable no-console */
2-
const redisClient = require('redis-mock').createClient()
2+
3+
jest.mock('./redisWrapper')
4+
5+
const redisClient = {}
36

47
const { IS_ACCESSIBLE } = require('./test-utils')
58

package-lock.json

Lines changed: 3 additions & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@kth/api-call",
3-
"version": "4.2.1",
3+
"version": "4.3.0-1",
44
"description": "Node.js module to make JSON calls against APIs.",
55
"main": "index.js",
66
"repository": {
@@ -45,8 +45,7 @@
4545
"jest": "^29.7.0",
4646
"jest-extended": "^6.0.0",
4747
"prettier": "^3.6.2",
48-
"pretty-quick": "^4.2.2",
49-
"redis-mock": "^0.56.3"
48+
"pretty-quick": "^4.2.2"
5049
},
5150
"// (prettier)": "configuration version 2020-06-15 - might also reside in .prettierrc.json",
5251
"prettier": {

redisWrapper.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
const createRedisWrapper = async (apiName, redisDependency, config) => {
2+
const client = await redisDependency(apiName, config)
3+
4+
if (isKthRedis3(redisDependency, client)) {
5+
return createKthRedis3Wrapper(client)
6+
}
7+
throw new Error('@kth/api-call was configured with an unsupported Redis version. Only kth-node-redis@3 must be used.')
8+
}
9+
10+
const isKthRedis3 = (redisDependency, client) =>
11+
typeof redisDependency.getClient === 'function' &&
12+
typeof client.set === 'function' &&
13+
typeof client.setAsync === 'function'
14+
15+
const createKthRedis3Wrapper = client => ({
16+
detectedVersion: 'kth-node-redis@3',
17+
set: async (key, value, callback) => {
18+
return client.set(key, value, callback)
19+
},
20+
get: async (key, callback) => {
21+
return client.get(key, callback)
22+
},
23+
expire: async (key, ttl, callback) => {
24+
return client.expire(key, ttl, callback)
25+
},
26+
})
27+
28+
module.exports = {
29+
createRedisWrapper,
30+
}

redisWrapper.test.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
const { createRedisWrapper } = require('./redisWrapper')
2+
3+
describe('createRedisWrapper', () => {
4+
test('Works fine for the supported version', async () => {
5+
const validRedisDependency = () => ({
6+
set: jest.fn(),
7+
setAsync: jest.fn(),
8+
})
9+
validRedisDependency.getClient = jest.fn()
10+
11+
await expect(createRedisWrapper('apiName', validRedisDependency, {})).toResolve()
12+
})
13+
test('throws error for library that dont have an exported "getClient" function', async () => {
14+
const invalidRedisDependency = () => ({
15+
set: jest.fn(),
16+
setAsync: jest.fn(),
17+
})
18+
19+
await expect(createRedisWrapper('apiName', invalidRedisDependency, {})).rejects.toThrow(
20+
'@kth/api-call was configured with an unsupported Redis version'
21+
)
22+
})
23+
test('throws error for library that dont generate a "setAsync" function', async () => {
24+
const invalidRedisDependency = () => ({
25+
set: jest.fn(),
26+
})
27+
invalidRedisDependency.getClient = jest.fn()
28+
29+
await expect(createRedisWrapper('apiName', invalidRedisDependency, {})).rejects.toThrow(
30+
'@kth/api-call was configured with an unsupported Redis version'
31+
)
32+
})
33+
})

0 commit comments

Comments
 (0)