Skip to content

Commit 6682760

Browse files
authored
feat: Adds Redis Sentinel support. (#74)
1 parent c26fea3 commit 6682760

File tree

11 files changed

+371
-40
lines changed

11 files changed

+371
-40
lines changed

package-lock.json

Lines changed: 192 additions & 28 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 & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
"@learninglocker/xapi-activities": "^4.0.2",
3838
"@learninglocker/xapi-agents": "^4.0.3",
3939
"@learninglocker/xapi-state": "^4.0.2",
40-
"@learninglocker/xapi-statements": "^6.0.4",
40+
"@learninglocker/xapi-statements": "^7.0.0",
4141
"boolean": "^0.1.2",
4242
"dotenv": "^5.0.0",
4343
"express": "^4.14.1",
@@ -54,6 +54,7 @@
5454
"@types/dotenv": "4.0.2",
5555
"@types/express": "4.11.1",
5656
"@types/google-cloud__storage": "1.1.7",
57+
"@types/ioredis": "3.2.5",
5758
"@types/lodash": "4.14.104",
5859
"@types/mongodb": "3.0.5",
5960
"@types/node": "9.4.6",

src/apps/AppConfig.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { S3 } from 'aws-sdk';
2+
import { Redis } from 'ioredis';
23
import Tracker from 'jscommons/dist/tracker/Tracker';
34
import { Db } from 'mongodb';
45
import { LoggerInstance } from 'winston';
@@ -35,7 +36,11 @@ export default interface AppConfig {
3536
};
3637
readonly redis: {
3738
readonly prefix: string;
38-
readonly url: string;
39+
readonly client: () => Promise<Redis>;
40+
};
41+
readonly sentinel: {
42+
readonly prefix: string;
43+
readonly client: () => Promise<Redis>;
3944
};
4045
};
4146
readonly service: {

src/apps/app.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ export default (appConfig: AppConfig): Router => {
7878
mongo: appConfig.repo.mongo,
7979
redis: appConfig.repo.redis,
8080
s3: appConfig.repo.s3,
81+
sentinel: appConfig.repo.sentinel,
8182
storageSubFolder: appConfig.repo.storageSubFolders.statements,
8283
},
8384
service: appConfig.service.statements,

src/apps/statements/AppConfig.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import * as S3 from 'aws-sdk/clients/s3';
2+
import { Redis } from 'ioredis';
23
import Tracker from 'jscommons/dist/tracker/Tracker';
34
import { Db } from 'mongodb';
45
import { LoggerInstance } from 'winston';
@@ -51,7 +52,11 @@ export default interface AppConfig {
5152
};
5253
readonly redis: {
5354
readonly prefix: string;
54-
readonly url: string;
55+
readonly client: () => Promise<Redis>;
56+
};
57+
readonly sentinel: {
58+
readonly prefix: string;
59+
readonly client: () => Promise<Redis>;
5560
};
5661
};
5762
}

src/apps/statements/app.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,12 @@ export default (appConfig: AppConfig): Result => {
1818
events: {
1919
facade: appConfig.repo.factory.eventsRepoName,
2020
redis: {
21+
client: appConfig.repo.redis.client,
2122
prefix: appConfig.repo.redis.prefix,
22-
url: appConfig.repo.redis.url,
23+
},
24+
sentinel: {
25+
client: appConfig.repo.sentinel.client,
26+
prefix: appConfig.repo.sentinel.prefix,
2327
},
2428
},
2529
models: {

src/config.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import getDbFromUrl from 'jscommons/dist/mongoRepo/utils/getDbFromUrl';
1010
import { defaultTo } from 'lodash';
1111
import * as os from 'os';
1212

13+
const DEFAULT_REDIS_PORT = 6379;
1314
const DEFAULT_EXPRESS_PORT = 8081;
1415
const DEFAULT_TIMEOUT_MS = 300000; // 5 minutes.
1516

@@ -71,6 +72,16 @@ export default {
7172
} as S3.ClientConfiguration,
7273
bucketName: getStringOption(process.env.FS_S3_BUCKET, 'xapi-service'),
7374
},
75+
sentinel: {
76+
name: getStringOption(process.env.SENTINEL_NAME, 'mymaster'),
77+
prefix: getStringOption(process.env.SENTINEL_PREFIX, 'LEARNINGLOCKER'),
78+
sentinels: (
79+
getStringOption(process.env.SENTINEL_CONNECTIONS, '127.0.0.1:6379').split(' ').map((conn) => {
80+
const [host, port] = conn.split(':');
81+
return { host, port: getNumberOption(port, DEFAULT_REDIS_PORT) };
82+
})
83+
),
84+
},
7485
statementsService: {
7586
awaitUpdates: getBooleanOption(defaultTo<any>(
7687
process.env.SERVICE_AWAIT_UPDATES,

src/server.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import app from './apps/app';
88
import config from './config';
99
import logger from './logger';
1010
import connectToMongoDb from './utils/connectToMongoDb';
11+
import connectToRedis from './utils/connectToRedis';
12+
import connectToSentinel from './utils/connectToSentinel';
1113

1214
const expressApp = express();
1315

@@ -20,9 +22,16 @@ expressApp.use(app({
2022
google: config.googleStorageRepo,
2123
local: config.localStorageRepo,
2224
mongo: { db: connectToMongoDb() },
23-
redis: config.redis,
25+
redis: {
26+
client: connectToRedis(),
27+
prefix: config.redis.prefix,
28+
},
2429
repoFactory: config.repoFactory,
2530
s3: config.s3StorageRepo,
31+
sentinel: {
32+
client: connectToSentinel(),
33+
prefix: config.redis.prefix,
34+
},
2635
storageSubFolders: config.storageSubFolders,
2736
},
2837
service: {

src/utils/connectToRedis.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import * as Ioredis from 'ioredis';
2+
import { defaultTo, once } from 'lodash';
3+
import config from '../config';
4+
import logger from '../logger';
5+
6+
export default once((): () => Promise<Ioredis.Redis> => {
7+
return once(async () => {
8+
logger.info('Creating redis connection');
9+
return new Ioredis(
10+
defaultTo(config.redis.url, 'redis://127.0.0.1:6379/0'),
11+
);
12+
});
13+
});

src/utils/connectToSentinel.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import * as Ioredis from 'ioredis';
2+
import { defaultTo, once } from 'lodash';
3+
import config from '../config';
4+
import logger from '../logger';
5+
6+
export default once((): () => Promise<Ioredis.Redis> => {
7+
return once(async () => {
8+
logger.info('Creating sentinel connection');
9+
return new Ioredis({
10+
name: defaultTo(config.sentinel.name, 'mymaster'),
11+
sentinels: defaultTo(config.sentinel.sentinels, [{ host: '127.0.0.1', port: 6379 }]),
12+
});
13+
});
14+
});

yarn.lock

Lines changed: 111 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -152,9 +152,9 @@
152152
string-to-stream "^1.1.0"
153153
uuid "^3.0.1"
154154

155-
"@learninglocker/xapi-statements@^6.0.4":
156-
version "6.0.4"
157-
resolved "https://registry.yarnpkg.com/@learninglocker/xapi-statements/-/xapi-statements-6.0.4.tgz#5750d3e21a307e6ecfb1669749ade5c6cd0cd4eb"
155+
"@learninglocker/xapi-statements@^7.0.0":
156+
version "7.0.0"
157+
resolved "https://registry.yarnpkg.com/@learninglocker/xapi-statements/-/xapi-statements-7.0.0.tgz#08fd8f02561d7f20921c4faf85b2493bb7ca78de"
158158
dependencies:
159159
"@google-cloud/storage" "^1.5.2"
160160
"@learninglocker/xapi-validation" "^2.1.10"
@@ -171,6 +171,7 @@
171171
file-stream-rotator "^0.2.0"
172172
fs-extra "^5.0.0"
173173
helmet "^3.5.0"
174+
ioredis "^3.2.2"
174175
jscommons "^2.3.0"
175176
jsonwebtoken "^8.0.1"
176177
lodash "^4.17.4"
@@ -327,6 +328,10 @@
327328
version "0.7.0"
328329
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd"
329330

331+
"@types/bluebird@*":
332+
version "3.5.20"
333+
resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.20.tgz#f6363172add6f4eabb8cada53ca9af2781e8d6a1"
334+
330335
"@types/body-parser@*":
331336
version "1.16.8"
332337
resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.16.8.tgz#687ec34140624a3bec2b1a8ea9268478ae8f3be3"
@@ -371,6 +376,13 @@
371376
dependencies:
372377
"@types/node" "*"
373378

379+
"@types/ioredis@3.2.5":
380+
version "3.2.5"
381+
resolved "https://registry.yarnpkg.com/@types/ioredis/-/ioredis-3.2.5.tgz#81889bed41ccaf175a46fb788ab7eee688bab1c6"
382+
dependencies:
383+
"@types/bluebird" "*"
384+
"@types/node" "*"
385+
374386
"@types/lodash@4.14.104":
375387
version "4.14.104"
376388
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.104.tgz#53ee2357fa2e6e68379341d92eb2ecea4b11bb80"
@@ -1148,7 +1160,7 @@ blamer@^0.1.9:
11481160
bluebird "~2.3.x"
11491161
xml2js "~0.4.x"
11501162

1151-
bluebird@^3.0.5, bluebird@^3.4.6, bluebird@^3.5.0, bluebird@^3.5.1:
1163+
bluebird@^3.0.5, bluebird@^3.3.4, bluebird@^3.4.6, bluebird@^3.5.0, bluebird@^3.5.1:
11521164
version "3.5.1"
11531165
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
11541166

@@ -1443,6 +1455,10 @@ clone-response@1.0.2:
14431455
dependencies:
14441456
mimic-response "^1.0.0"
14451457

1458+
cluster-key-slot@^1.0.6:
1459+
version "1.0.8"
1460+
resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.0.8.tgz#7654556085a65330932a2e8b5976f8e2d0b3e414"
1461+
14461462
co@^4.6.0:
14471463
version "4.6.0"
14481464
resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
@@ -1726,7 +1742,7 @@ dateformat@^1.0.11:
17261742
get-stdin "^4.0.1"
17271743
meow "^3.3.0"
17281744

1729-
debug@2, debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8:
1745+
debug@2, debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9:
17301746
version "2.6.9"
17311747
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
17321748
dependencies:
@@ -1783,6 +1799,10 @@ delayed-stream@~1.0.0:
17831799
version "1.0.0"
17841800
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
17851801

1802+
denque@^1.1.0:
1803+
version "1.2.3"
1804+
resolved "https://registry.yarnpkg.com/denque/-/denque-1.2.3.tgz#98c50c8dd8cdfae318cc5859cc8ee3da0f9b0cc2"
1805+
17861806
depd@1.1.1:
17871807
version "1.1.1"
17881808
resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359"
@@ -2255,6 +2275,10 @@ flagged-respawn@^0.3.2:
22552275
version "0.3.2"
22562276
resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-0.3.2.tgz#ff191eddcd7088a675b2610fffc976be9b8074b5"
22572277

2278+
flexbuffer@0.0.6:
2279+
version "0.0.6"
2280+
resolved "https://registry.yarnpkg.com/flexbuffer/-/flexbuffer-0.0.6.tgz#039fdf23f8823e440c38f3277e6fef1174215b30"
2281+
22582282
for-in@^1.0.1, for-in@^1.0.2:
22592283
version "1.0.2"
22602284
resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
@@ -2884,6 +2908,34 @@ invert-kv@^1.0.0:
28842908
version "1.0.0"
28852909
resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
28862910

2911+
ioredis@^3.2.2:
2912+
version "3.2.2"
2913+
resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-3.2.2.tgz#b7d5ff3afd77bb9718bb2821329b894b9a44c00b"
2914+
dependencies:
2915+
bluebird "^3.3.4"
2916+
cluster-key-slot "^1.0.6"
2917+
debug "^2.6.9"
2918+
denque "^1.1.0"
2919+
flexbuffer "0.0.6"
2920+
lodash.assign "^4.2.0"
2921+
lodash.bind "^4.2.1"
2922+
lodash.clone "^4.5.0"
2923+
lodash.clonedeep "^4.5.0"
2924+
lodash.defaults "^4.2.0"
2925+
lodash.difference "^4.5.0"
2926+
lodash.flatten "^4.4.0"
2927+
lodash.foreach "^4.5.0"
2928+
lodash.isempty "^4.4.0"
2929+
lodash.keys "^4.2.0"
2930+
lodash.noop "^3.0.1"
2931+
lodash.partial "^4.2.1"
2932+
lodash.pick "^4.4.0"
2933+
lodash.sample "^4.2.1"
2934+
lodash.shuffle "^4.2.0"
2935+
lodash.values "^4.3.0"
2936+
redis-commands "^1.2.0"
2937+
redis-parser "^2.4.0"
2938+
28872939
ipaddr.js@1.5.2:
28882940
version "1.5.2"
28892941
resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0"
@@ -3483,6 +3535,34 @@ lodash.assign@^4.2.0:
34833535
version "4.2.0"
34843536
resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
34853537

3538+
lodash.bind@^4.2.1:
3539+
version "4.2.1"
3540+
resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35"
3541+
3542+
lodash.clone@^4.5.0:
3543+
version "4.5.0"
3544+
resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6"
3545+
3546+
lodash.clonedeep@^4.5.0:
3547+
version "4.5.0"
3548+
resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
3549+
3550+
lodash.defaults@^4.2.0:
3551+
version "4.2.0"
3552+
resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
3553+
3554+
lodash.difference@^4.5.0:
3555+
version "4.5.0"
3556+
resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c"
3557+
3558+
lodash.flatten@^4.4.0:
3559+
version "4.4.0"
3560+
resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
3561+
3562+
lodash.foreach@^4.5.0:
3563+
version "4.5.0"
3564+
resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53"
3565+
34863566
lodash.includes@^4.3.0:
34873567
version "4.3.0"
34883568
resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f"
@@ -3491,7 +3571,7 @@ lodash.isboolean@^3.0.3:
34913571
version "3.0.3"
34923572
resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6"
34933573

3494-
lodash.isempty@^4.2.1:
3574+
lodash.isempty@^4.2.1, lodash.isempty@^4.4.0:
34953575
version "4.4.0"
34963576
resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e"
34973577

@@ -3511,6 +3591,10 @@ lodash.isstring@^4.0.1:
35113591
version "4.0.1"
35123592
resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451"
35133593

3594+
lodash.keys@^4.2.0:
3595+
version "4.2.0"
3596+
resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-4.2.0.tgz#a08602ac12e4fb83f91fc1fb7a360a4d9ba35205"
3597+
35143598
lodash.map@^4.5.1:
35153599
version "4.6.0"
35163600
resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3"
@@ -3531,14 +3615,34 @@ lodash.once@^4.0.0:
35313615
version "4.1.1"
35323616
resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac"
35333617

3618+
lodash.partial@^4.2.1:
3619+
version "4.2.1"
3620+
resolved "https://registry.yarnpkg.com/lodash.partial/-/lodash.partial-4.2.1.tgz#49f3d8cfdaa3bff8b3a91d127e923245418961d4"
3621+
3622+
lodash.pick@^4.4.0:
3623+
version "4.4.0"
3624+
resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3"
3625+
35343626
lodash.reduce@4.6.0:
35353627
version "4.6.0"
35363628
resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b"
35373629

3630+
lodash.sample@^4.2.1:
3631+
version "4.2.1"
3632+
resolved "https://registry.yarnpkg.com/lodash.sample/-/lodash.sample-4.2.1.tgz#5e4291b0c753fa1abeb0aab8fb29df1b66f07f6d"
3633+
3634+
lodash.shuffle@^4.2.0:
3635+
version "4.2.0"
3636+
resolved "https://registry.yarnpkg.com/lodash.shuffle/-/lodash.shuffle-4.2.0.tgz#145b5053cf875f6f5c2a33f48b6e9948c6ec7b4b"
3637+
35383638
lodash.toarray@^4.4.0:
35393639
version "4.4.0"
35403640
resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561"
35413641

3642+
lodash.values@^4.3.0:
3643+
version "4.3.0"
3644+
resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347"
3645+
35423646
lodash@4.17.2:
35433647
version "4.17.2"
35443648
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.2.tgz#34a3055babe04ce42467b607d700072c7ff6bf42"
@@ -4398,7 +4502,7 @@ redis-commands@^1.2.0:
43984502
version "1.3.1"
43994503
resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.3.1.tgz#81d826f45fa9c8b2011f4cd7a0fe597d241d442b"
44004504

4401-
redis-parser@^2.6.0:
4505+
redis-parser@^2.4.0, redis-parser@^2.6.0:
44024506
version "2.6.0"
44034507
resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-2.6.0.tgz#52ed09dacac108f1a631c07e9b69941e7a19504b"
44044508

0 commit comments

Comments
 (0)