Remove connect-redis that breaks context with RedisStore

This commit is contained in:
Alice Gaudon 2021-01-22 15:55:06 +01:00
parent 8fab93e709
commit 94cb157520
4 changed files with 64 additions and 41 deletions

View File

@ -25,7 +25,6 @@
"@types/compression": "^1.7.0", "@types/compression": "^1.7.0",
"@types/config": "^0.0.38", "@types/config": "^0.0.38",
"@types/connect-flash": "^0.0.36", "@types/connect-flash": "^0.0.36",
"@types/connect-redis": "^0.0.16",
"@types/cookie": "^0.4.0", "@types/cookie": "^0.4.0",
"@types/cookie-parser": "^1.4.2", "@types/cookie-parser": "^1.4.2",
"@types/express": "^4.17.6", "@types/express": "^4.17.6",
@ -61,7 +60,6 @@
"compression": "^1.7.4", "compression": "^1.7.4",
"config": "^3.3.1", "config": "^3.3.1",
"connect-flash": "^0.1.1", "connect-flash": "^0.1.1",
"connect-redis": "^5.0.0",
"cookie": "^0.4.1", "cookie": "^0.4.1",
"cookie-parser": "^1.4.5", "cookie-parser": "^1.4.5",
"express": "^4.17.1", "express": "^4.17.1",

View File

@ -4,11 +4,8 @@ import redis, {RedisClient} from "redis";
import config from "config"; import config from "config";
import {logger} from "../Logger"; import {logger} from "../Logger";
import session, {Store} from "express-session"; import session, {Store} from "express-session";
import connect_redis from "connect-redis";
import CacheProvider from "../CacheProvider"; import CacheProvider from "../CacheProvider";
const RedisStore = connect_redis(session);
export default class RedisComponent extends ApplicationComponent implements CacheProvider { export default class RedisComponent extends ApplicationComponent implements CacheProvider {
private redisClient?: RedisClient; private redisClient?: RedisClient;
private store?: Store; private store?: Store;
@ -20,10 +17,8 @@ export default class RedisComponent extends ApplicationComponent implements Cach
this.redisClient.on('error', (err: Error) => { this.redisClient.on('error', (err: Error) => {
logger.error(err, 'An error occurred with redis.'); logger.error(err, 'An error occurred with redis.');
}); });
this.store = new RedisStore({
client: this.redisClient, this.store = new RedisStore(this);
prefix: config.get<string>('redis.prefix') + '-session:',
});
} }
public async stop(): Promise<void> { public async stop(): Promise<void> {
@ -45,7 +40,7 @@ export default class RedisComponent extends ApplicationComponent implements Cach
public async get<T extends string | undefined>(key: string, defaultValue?: T): Promise<T> { public async get<T extends string | undefined>(key: string, defaultValue?: T): Promise<T> {
return await new Promise<T>((resolve, reject) => { return await new Promise<T>((resolve, reject) => {
if (!this.redisClient) { if (!this.redisClient) {
reject(`Redis store was not initialized.`); reject(`Redis client was not initialized.`);
return; return;
} }
@ -66,7 +61,7 @@ export default class RedisComponent extends ApplicationComponent implements Cach
public async forget(key: string): Promise<void> { public async forget(key: string): Promise<void> {
return await new Promise<void>((resolve, reject) => { return await new Promise<void>((resolve, reject) => {
if (!this.redisClient) { if (!this.redisClient) {
reject(`Redis store was not initialized.`); reject(`Redis client was not initialized.`);
return; return;
} }
@ -84,17 +79,69 @@ export default class RedisComponent extends ApplicationComponent implements Cach
public async remember(key: string, value: string, ttl: number): Promise<void> { public async remember(key: string, value: string, ttl: number): Promise<void> {
return await new Promise<void>((resolve, reject) => { return await new Promise<void>((resolve, reject) => {
if (!this.redisClient) { if (!this.redisClient) {
reject(`Redis store was not initialized.`); reject(`Redis client was not initialized.`);
return; return;
} }
this.redisClient.psetex(key, ttl, value, (err) => { this.redisClient.psetex(key, ttl, value, (err) => {
if (err) { if (err) return reject(err);
reject(err); resolve();
return; });
} });
}
public async persist(key: string, ttl: number): Promise<void> {
return await new Promise<void>((resolve, reject) => {
if (!this.redisClient) {
reject(`Redis client was not initialized.`);
return;
}
this.redisClient.pexpire(key, ttl, (err) => {
if (err) return reject(err);
resolve(); resolve();
}); });
}); });
} }
} }
class RedisStore extends Store {
private readonly redisComponent: RedisComponent;
public constructor(redisComponent: RedisComponent) {
super();
this.redisComponent = redisComponent;
}
public get(sid: string, callback: (err?: Error, session?: (session.SessionData | null)) => void): void {
this.redisComponent.get('-session:' + sid)
.then(value => {
if (value) {
this.redisComponent.persist('-session:' + sid, 2592000000) // 30 days
.then(() => {
callback(undefined, JSON.parse(value));
})
.catch(callback);
} else {
callback(undefined, null);
}
})
.catch(callback);
}
public set(sid: string, session: session.SessionData, callback?: (err?: Error) => void): void {
this.redisComponent.remember('-session:' + sid, JSON.stringify(session), 2592000000) // 30 days
.then(() => {
if (callback) callback();
})
.catch(callback);
}
public destroy(sid: string, callback?: (err?: Error) => void): void {
this.redisComponent.forget('-session:' + sid)
.then(() => {
if (callback) callback();
})
.catch(callback);
}
}

View File

@ -26,7 +26,7 @@ export default class SessionComponent extends ApplicationComponent {
saveUninitialized: true, saveUninitialized: true,
secret: config.get('session.secret'), secret: config.get('session.secret'),
store: this.storeComponent.getStore(), store: this.storeComponent.getStore(),
resave: true, resave: false,
cookie: { cookie: {
httpOnly: true, httpOnly: true,
secure: config.get('session.cookie.secure'), secure: config.get('session.cookie.secure'),

View File

@ -600,16 +600,6 @@
dependencies: dependencies:
"@types/express" "*" "@types/express" "*"
"@types/connect-redis@^0.0.16":
version "0.0.16"
resolved "https://registry.yarnpkg.com/@types/connect-redis/-/connect-redis-0.0.16.tgz#fd98a26ffbe6ac3037baa4aecc940951b9f78cdc"
integrity sha512-ToZRmwoeqRhzGIqMO9k8Hs1B9pFSGYCjHvMpPlgo+kQ4M7xaPwi2/5HjikJ0MOfPDFcAe9Qwl1SaULYCNE6jYg==
dependencies:
"@types/express" "*"
"@types/express-session" "*"
"@types/ioredis" "*"
"@types/redis" "*"
"@types/connect@*": "@types/connect@*":
version "3.4.34" version "3.4.34"
resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.34.tgz#170a40223a6d666006d93ca128af2beb1d9b1901" resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.34.tgz#170a40223a6d666006d93ca128af2beb1d9b1901"
@ -643,7 +633,7 @@
"@types/qs" "*" "@types/qs" "*"
"@types/range-parser" "*" "@types/range-parser" "*"
"@types/express-session@*", "@types/express-session@^1.17.0": "@types/express-session@^1.17.0":
version "1.17.3" version "1.17.3"
resolved "https://registry.yarnpkg.com/@types/express-session/-/express-session-1.17.3.tgz#4a37c5c4428b8f922ac8ac1cb4bd9190a4d2b097" resolved "https://registry.yarnpkg.com/@types/express-session/-/express-session-1.17.3.tgz#4a37c5c4428b8f922ac8ac1cb4bd9190a4d2b097"
integrity sha512-57DnyxiqClXOIjoCgeKCUYfKxBPOlOY/k+l1TPK+7bSwyiPTrS5FIk1Ycql7twk4wO7P5lfOVy6akDGiaMSLfw== integrity sha512-57DnyxiqClXOIjoCgeKCUYfKxBPOlOY/k+l1TPK+7bSwyiPTrS5FIk1Ycql7twk4wO7P5lfOVy6akDGiaMSLfw==
@ -679,13 +669,6 @@
dependencies: dependencies:
"@types/node" "*" "@types/node" "*"
"@types/ioredis@*":
version "4.19.2"
resolved "https://registry.yarnpkg.com/@types/ioredis/-/ioredis-4.19.2.tgz#68215d2fab93dd4f5d1d1225938389c32e7b98a2"
integrity sha512-fejSsJ4pYvA8zVLvAgQFI9T2uvxhUW7Ph95KodnNxMZvnUhQrn4ohxjH7fuU+jUw7Q4JCDcaba7JxDmszFmrCA==
dependencies:
"@types/node" "*"
"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1":
version "2.0.3" version "2.0.3"
resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762"
@ -801,7 +784,7 @@
resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c"
integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==
"@types/redis@*", "@types/redis@^2.8.18": "@types/redis@^2.8.18":
version "2.8.28" version "2.8.28"
resolved "https://registry.yarnpkg.com/@types/redis/-/redis-2.8.28.tgz#5862b2b64aa7f7cbc76dafd7e6f06992b52c55e3" resolved "https://registry.yarnpkg.com/@types/redis/-/redis-2.8.28.tgz#5862b2b64aa7f7cbc76dafd7e6f06992b52c55e3"
integrity sha512-8l2gr2OQ969ypa7hFOeKqtFoY70XkHxISV0pAwmQ2nm6CSPb1brmTmqJCGGrekCo+pAZyWlNXr+Kvo6L/1wijA== integrity sha512-8l2gr2OQ969ypa7hFOeKqtFoY70XkHxISV0pAwmQ2nm6CSPb1brmTmqJCGGrekCo+pAZyWlNXr+Kvo6L/1wijA==
@ -1824,11 +1807,6 @@ connect-flash@^0.1.1:
resolved "https://registry.yarnpkg.com/connect-flash/-/connect-flash-0.1.1.tgz#d8630f26d95a7f851f9956b1e8cc6732f3b6aa30" resolved "https://registry.yarnpkg.com/connect-flash/-/connect-flash-0.1.1.tgz#d8630f26d95a7f851f9956b1e8cc6732f3b6aa30"
integrity sha1-2GMPJtlaf4UfmVax6MxnMvO2qjA= integrity sha1-2GMPJtlaf4UfmVax6MxnMvO2qjA=
connect-redis@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/connect-redis/-/connect-redis-5.0.0.tgz#68fe890117e761ee98e13a14b835338bd6bf044c"
integrity sha512-R4nTW5uXeG5s6zr/q4abmtcdloglZrL/A3cpa0JU0RLFJU4mTR553HUY8OZ0ngeySkGDclwQ5xmCcjjKkxdOSg==
console-control-strings@^1.0.0, console-control-strings@~1.1.0: console-control-strings@^1.0.0, console-control-strings@~1.1.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"