-first commit
This commit is contained in:
164
node_modules/connect-redis/dist/connect-redis.cjs
generated
vendored
Normal file
164
node_modules/connect-redis/dist/connect-redis.cjs
generated
vendored
Normal file
@@ -0,0 +1,164 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
||||
const expressSession = require("express-session");
|
||||
function optionalCb(err, data, cb) {
|
||||
if (cb) return cb(err, data);
|
||||
if (err) throw err;
|
||||
return data;
|
||||
}
|
||||
class RedisStore extends expressSession.Store {
|
||||
client;
|
||||
prefix;
|
||||
scanCount;
|
||||
serializer;
|
||||
ttl;
|
||||
disableTTL;
|
||||
disableTouch;
|
||||
constructor(opts) {
|
||||
super();
|
||||
this.prefix = opts.prefix == null ? "sess:" : opts.prefix;
|
||||
this.scanCount = opts.scanCount || 100;
|
||||
this.serializer = opts.serializer || JSON;
|
||||
this.ttl = opts.ttl || 86400;
|
||||
this.disableTTL = opts.disableTTL || false;
|
||||
this.disableTouch = opts.disableTouch || false;
|
||||
this.client = opts.client;
|
||||
}
|
||||
async get(sid, cb) {
|
||||
let key = this.prefix + sid;
|
||||
try {
|
||||
let data = await this.client.get(key);
|
||||
if (!data) return optionalCb(null, null, cb);
|
||||
return optionalCb(null, await this.serializer.parse(data), cb);
|
||||
} catch (err) {
|
||||
return optionalCb(err, null, cb);
|
||||
}
|
||||
}
|
||||
async set(sid, sess, cb) {
|
||||
let key = this.prefix + sid;
|
||||
let ttl = this.getTTL(sess);
|
||||
try {
|
||||
if (ttl > 0) {
|
||||
let val = this.serializer.stringify(sess);
|
||||
if (this.disableTTL) await this.client.set(key, val);
|
||||
else
|
||||
await this.client.set(key, val, {
|
||||
expiration: { type: "EX", value: ttl }
|
||||
});
|
||||
return optionalCb(null, null, cb);
|
||||
}
|
||||
return this.destroy(sid, cb);
|
||||
} catch (err) {
|
||||
return optionalCb(err, null, cb);
|
||||
}
|
||||
}
|
||||
async touch(sid, sess, cb) {
|
||||
let key = this.prefix + sid;
|
||||
if (this.disableTouch || this.disableTTL) return optionalCb(null, null, cb);
|
||||
try {
|
||||
await this.client.expire(key, this.getTTL(sess));
|
||||
return optionalCb(null, null, cb);
|
||||
} catch (err) {
|
||||
return optionalCb(err, null, cb);
|
||||
}
|
||||
}
|
||||
async destroy(sid, cb) {
|
||||
let key = this.prefix + sid;
|
||||
try {
|
||||
await this.client.del([key]);
|
||||
return optionalCb(null, null, cb);
|
||||
} catch (err) {
|
||||
return optionalCb(err, null, cb);
|
||||
}
|
||||
}
|
||||
async clear(cb) {
|
||||
try {
|
||||
let keys = await this.getAllKeys();
|
||||
if (!keys.length) return optionalCb(null, null, cb);
|
||||
await this.client.del(keys);
|
||||
return optionalCb(null, null, cb);
|
||||
} catch (err) {
|
||||
return optionalCb(err, null, cb);
|
||||
}
|
||||
}
|
||||
async length(cb) {
|
||||
try {
|
||||
let keys = await this.getAllKeys();
|
||||
return optionalCb(null, keys.length, cb);
|
||||
} catch (err) {
|
||||
return optionalCb(err, null, cb);
|
||||
}
|
||||
}
|
||||
async ids(cb) {
|
||||
let len = this.prefix.length;
|
||||
try {
|
||||
let keys = await this.getAllKeys();
|
||||
return optionalCb(
|
||||
null,
|
||||
keys.map((k) => k.substring(len)),
|
||||
cb
|
||||
);
|
||||
} catch (err) {
|
||||
return optionalCb(err, null, cb);
|
||||
}
|
||||
}
|
||||
async all(cb) {
|
||||
let len = this.prefix.length;
|
||||
try {
|
||||
let keys = await this.getAllKeys();
|
||||
if (keys.length === 0) return optionalCb(null, [], cb);
|
||||
let data = await this.client.mGet(keys);
|
||||
let results = data.reduce((acc, raw, idx) => {
|
||||
if (!raw) return acc;
|
||||
let sess = this.serializer.parse(raw);
|
||||
sess.id = keys[idx].substring(len);
|
||||
acc.push(sess);
|
||||
return acc;
|
||||
}, []);
|
||||
return optionalCb(null, results, cb);
|
||||
} catch (err) {
|
||||
return optionalCb(err, null, cb);
|
||||
}
|
||||
}
|
||||
getTTL(sess) {
|
||||
if (typeof this.ttl === "function") {
|
||||
return this.ttl(sess);
|
||||
}
|
||||
let ttl;
|
||||
if (sess?.cookie?.expires) {
|
||||
let ms = Number(new Date(sess.cookie.expires)) - Date.now();
|
||||
ttl = Math.ceil(ms / 1e3);
|
||||
} else {
|
||||
ttl = this.ttl;
|
||||
}
|
||||
return ttl;
|
||||
}
|
||||
async getAllKeys() {
|
||||
let pattern = this.prefix + "*";
|
||||
let set = /* @__PURE__ */ new Set();
|
||||
for await (let keys of this.scanIterator(pattern, this.scanCount)) {
|
||||
for (let key of keys) {
|
||||
set.add(key);
|
||||
}
|
||||
}
|
||||
return set.size > 0 ? Array.from(set) : [];
|
||||
}
|
||||
scanIterator(match, count) {
|
||||
let client = this.client;
|
||||
if (!("masters" in client)) {
|
||||
return client.scanIterator({ MATCH: match, COUNT: count });
|
||||
}
|
||||
return async function* () {
|
||||
for (let master of client.masters) {
|
||||
let c = await client.nodeClient(master);
|
||||
for await (let keys of c.scanIterator({
|
||||
COUNT: count,
|
||||
MATCH: match
|
||||
})) {
|
||||
yield keys;
|
||||
}
|
||||
}
|
||||
}();
|
||||
}
|
||||
}
|
||||
exports.RedisStore = RedisStore;
|
||||
45
node_modules/connect-redis/dist/connect-redis.d.cts
generated
vendored
Normal file
45
node_modules/connect-redis/dist/connect-redis.d.cts
generated
vendored
Normal file
@@ -0,0 +1,45 @@
|
||||
import { RedisClientType } from 'redis';
|
||||
import { RedisClusterType } from 'redis';
|
||||
import { SessionData } from 'express-session';
|
||||
import { Store } from 'express-session';
|
||||
|
||||
declare type Callback = (_err?: unknown, _data?: any) => any;
|
||||
|
||||
export declare class RedisStore extends Store {
|
||||
client: RedisClientType | RedisClusterType;
|
||||
prefix: string;
|
||||
scanCount: number;
|
||||
serializer: Serializer;
|
||||
ttl: number | ((sess: SessionData) => number);
|
||||
disableTTL: boolean;
|
||||
disableTouch: boolean;
|
||||
constructor(opts: RedisStoreOptions);
|
||||
get(sid: string, cb?: Callback): Promise<any>;
|
||||
set(sid: string, sess: SessionData, cb?: Callback): Promise<any>;
|
||||
touch(sid: string, sess: SessionData, cb?: Callback): Promise<any>;
|
||||
destroy(sid: string, cb?: Callback): Promise<any>;
|
||||
clear(cb?: Callback): Promise<any>;
|
||||
length(cb?: Callback): Promise<any>;
|
||||
ids(cb?: Callback): Promise<any>;
|
||||
all(cb?: Callback): Promise<any>;
|
||||
private getTTL;
|
||||
private getAllKeys;
|
||||
private scanIterator;
|
||||
}
|
||||
|
||||
declare interface RedisStoreOptions {
|
||||
client: any;
|
||||
prefix?: string;
|
||||
scanCount?: number;
|
||||
serializer?: Serializer;
|
||||
ttl?: number | ((sess: SessionData) => number);
|
||||
disableTTL?: boolean;
|
||||
disableTouch?: boolean;
|
||||
}
|
||||
|
||||
declare interface Serializer {
|
||||
parse(s: string): SessionData | Promise<SessionData>;
|
||||
stringify(s: SessionData): string;
|
||||
}
|
||||
|
||||
export { }
|
||||
45
node_modules/connect-redis/dist/connect-redis.d.ts
generated
vendored
Normal file
45
node_modules/connect-redis/dist/connect-redis.d.ts
generated
vendored
Normal file
@@ -0,0 +1,45 @@
|
||||
import { RedisClientType } from 'redis';
|
||||
import { RedisClusterType } from 'redis';
|
||||
import { SessionData } from 'express-session';
|
||||
import { Store } from 'express-session';
|
||||
|
||||
declare type Callback = (_err?: unknown, _data?: any) => any;
|
||||
|
||||
export declare class RedisStore extends Store {
|
||||
client: RedisClientType | RedisClusterType;
|
||||
prefix: string;
|
||||
scanCount: number;
|
||||
serializer: Serializer;
|
||||
ttl: number | ((sess: SessionData) => number);
|
||||
disableTTL: boolean;
|
||||
disableTouch: boolean;
|
||||
constructor(opts: RedisStoreOptions);
|
||||
get(sid: string, cb?: Callback): Promise<any>;
|
||||
set(sid: string, sess: SessionData, cb?: Callback): Promise<any>;
|
||||
touch(sid: string, sess: SessionData, cb?: Callback): Promise<any>;
|
||||
destroy(sid: string, cb?: Callback): Promise<any>;
|
||||
clear(cb?: Callback): Promise<any>;
|
||||
length(cb?: Callback): Promise<any>;
|
||||
ids(cb?: Callback): Promise<any>;
|
||||
all(cb?: Callback): Promise<any>;
|
||||
private getTTL;
|
||||
private getAllKeys;
|
||||
private scanIterator;
|
||||
}
|
||||
|
||||
declare interface RedisStoreOptions {
|
||||
client: any;
|
||||
prefix?: string;
|
||||
scanCount?: number;
|
||||
serializer?: Serializer;
|
||||
ttl?: number | ((sess: SessionData) => number);
|
||||
disableTTL?: boolean;
|
||||
disableTouch?: boolean;
|
||||
}
|
||||
|
||||
declare interface Serializer {
|
||||
parse(s: string): SessionData | Promise<SessionData>;
|
||||
stringify(s: SessionData): string;
|
||||
}
|
||||
|
||||
export { }
|
||||
164
node_modules/connect-redis/dist/connect-redis.js
generated
vendored
Normal file
164
node_modules/connect-redis/dist/connect-redis.js
generated
vendored
Normal file
@@ -0,0 +1,164 @@
|
||||
import { Store } from "express-session";
|
||||
function optionalCb(err, data, cb) {
|
||||
if (cb) return cb(err, data);
|
||||
if (err) throw err;
|
||||
return data;
|
||||
}
|
||||
class RedisStore extends Store {
|
||||
client;
|
||||
prefix;
|
||||
scanCount;
|
||||
serializer;
|
||||
ttl;
|
||||
disableTTL;
|
||||
disableTouch;
|
||||
constructor(opts) {
|
||||
super();
|
||||
this.prefix = opts.prefix == null ? "sess:" : opts.prefix;
|
||||
this.scanCount = opts.scanCount || 100;
|
||||
this.serializer = opts.serializer || JSON;
|
||||
this.ttl = opts.ttl || 86400;
|
||||
this.disableTTL = opts.disableTTL || false;
|
||||
this.disableTouch = opts.disableTouch || false;
|
||||
this.client = opts.client;
|
||||
}
|
||||
async get(sid, cb) {
|
||||
let key = this.prefix + sid;
|
||||
try {
|
||||
let data = await this.client.get(key);
|
||||
if (!data) return optionalCb(null, null, cb);
|
||||
return optionalCb(null, await this.serializer.parse(data), cb);
|
||||
} catch (err) {
|
||||
return optionalCb(err, null, cb);
|
||||
}
|
||||
}
|
||||
async set(sid, sess, cb) {
|
||||
let key = this.prefix + sid;
|
||||
let ttl = this.getTTL(sess);
|
||||
try {
|
||||
if (ttl > 0) {
|
||||
let val = this.serializer.stringify(sess);
|
||||
if (this.disableTTL) await this.client.set(key, val);
|
||||
else
|
||||
await this.client.set(key, val, {
|
||||
expiration: { type: "EX", value: ttl }
|
||||
});
|
||||
return optionalCb(null, null, cb);
|
||||
}
|
||||
return this.destroy(sid, cb);
|
||||
} catch (err) {
|
||||
return optionalCb(err, null, cb);
|
||||
}
|
||||
}
|
||||
async touch(sid, sess, cb) {
|
||||
let key = this.prefix + sid;
|
||||
if (this.disableTouch || this.disableTTL) return optionalCb(null, null, cb);
|
||||
try {
|
||||
await this.client.expire(key, this.getTTL(sess));
|
||||
return optionalCb(null, null, cb);
|
||||
} catch (err) {
|
||||
return optionalCb(err, null, cb);
|
||||
}
|
||||
}
|
||||
async destroy(sid, cb) {
|
||||
let key = this.prefix + sid;
|
||||
try {
|
||||
await this.client.del([key]);
|
||||
return optionalCb(null, null, cb);
|
||||
} catch (err) {
|
||||
return optionalCb(err, null, cb);
|
||||
}
|
||||
}
|
||||
async clear(cb) {
|
||||
try {
|
||||
let keys = await this.getAllKeys();
|
||||
if (!keys.length) return optionalCb(null, null, cb);
|
||||
await this.client.del(keys);
|
||||
return optionalCb(null, null, cb);
|
||||
} catch (err) {
|
||||
return optionalCb(err, null, cb);
|
||||
}
|
||||
}
|
||||
async length(cb) {
|
||||
try {
|
||||
let keys = await this.getAllKeys();
|
||||
return optionalCb(null, keys.length, cb);
|
||||
} catch (err) {
|
||||
return optionalCb(err, null, cb);
|
||||
}
|
||||
}
|
||||
async ids(cb) {
|
||||
let len = this.prefix.length;
|
||||
try {
|
||||
let keys = await this.getAllKeys();
|
||||
return optionalCb(
|
||||
null,
|
||||
keys.map((k) => k.substring(len)),
|
||||
cb
|
||||
);
|
||||
} catch (err) {
|
||||
return optionalCb(err, null, cb);
|
||||
}
|
||||
}
|
||||
async all(cb) {
|
||||
let len = this.prefix.length;
|
||||
try {
|
||||
let keys = await this.getAllKeys();
|
||||
if (keys.length === 0) return optionalCb(null, [], cb);
|
||||
let data = await this.client.mGet(keys);
|
||||
let results = data.reduce((acc, raw, idx) => {
|
||||
if (!raw) return acc;
|
||||
let sess = this.serializer.parse(raw);
|
||||
sess.id = keys[idx].substring(len);
|
||||
acc.push(sess);
|
||||
return acc;
|
||||
}, []);
|
||||
return optionalCb(null, results, cb);
|
||||
} catch (err) {
|
||||
return optionalCb(err, null, cb);
|
||||
}
|
||||
}
|
||||
getTTL(sess) {
|
||||
if (typeof this.ttl === "function") {
|
||||
return this.ttl(sess);
|
||||
}
|
||||
let ttl;
|
||||
if (sess?.cookie?.expires) {
|
||||
let ms = Number(new Date(sess.cookie.expires)) - Date.now();
|
||||
ttl = Math.ceil(ms / 1e3);
|
||||
} else {
|
||||
ttl = this.ttl;
|
||||
}
|
||||
return ttl;
|
||||
}
|
||||
async getAllKeys() {
|
||||
let pattern = this.prefix + "*";
|
||||
let set = /* @__PURE__ */ new Set();
|
||||
for await (let keys of this.scanIterator(pattern, this.scanCount)) {
|
||||
for (let key of keys) {
|
||||
set.add(key);
|
||||
}
|
||||
}
|
||||
return set.size > 0 ? Array.from(set) : [];
|
||||
}
|
||||
scanIterator(match, count) {
|
||||
let client = this.client;
|
||||
if (!("masters" in client)) {
|
||||
return client.scanIterator({ MATCH: match, COUNT: count });
|
||||
}
|
||||
return async function* () {
|
||||
for (let master of client.masters) {
|
||||
let c = await client.nodeClient(master);
|
||||
for await (let keys of c.scanIterator({
|
||||
COUNT: count,
|
||||
MATCH: match
|
||||
})) {
|
||||
yield keys;
|
||||
}
|
||||
}
|
||||
}();
|
||||
}
|
||||
}
|
||||
export {
|
||||
RedisStore
|
||||
};
|
||||
Reference in New Issue
Block a user