@shware/security 2.5.3 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/index.cjs +519 -561
- package/dist/auth/index.cjs.map +1 -1
- package/dist/auth/index.d.cts +104 -106
- package/dist/auth/index.d.cts.map +1 -0
- package/dist/auth/index.d.mts +109 -0
- package/dist/auth/index.d.mts.map +1 -0
- package/dist/auth/index.mjs +512 -536
- package/dist/auth/index.mjs.map +1 -1
- package/dist/auth/types.cjs +0 -19
- package/dist/auth/types.d.cts +44 -44
- package/dist/auth/types.d.cts.map +1 -0
- package/dist/auth/types.d.mts +50 -0
- package/dist/auth/types.d.mts.map +1 -0
- package/dist/auth/types.mjs +1 -1
- package/dist/core/index.cjs +18 -59
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.d.cts +13 -24
- package/dist/core/index.d.cts.map +1 -0
- package/dist/core/index.d.mts +21 -0
- package/dist/core/index.d.mts.map +1 -0
- package/dist/core/index.mjs +17 -33
- package/dist/core/index.mjs.map +1 -1
- package/dist/email/schema.cjs +13 -38
- package/dist/email/schema.cjs.map +1 -1
- package/dist/email/schema.d.cts +11 -12
- package/dist/email/schema.d.cts.map +1 -0
- package/dist/email/schema.d.mts +12 -0
- package/dist/email/schema.d.mts.map +1 -0
- package/dist/email/schema.mjs +10 -11
- package/dist/email/schema.mjs.map +1 -1
- package/dist/index.cjs +18 -54
- package/dist/index.d.cts +10 -15
- package/dist/index.d.mts +10 -0
- package/dist/index.mjs +5 -17
- package/dist/oauth2/client.cjs +109 -145
- package/dist/oauth2/client.cjs.map +1 -1
- package/dist/oauth2/client.d.cts +55 -56
- package/dist/oauth2/client.d.cts.map +1 -0
- package/dist/oauth2/client.d.mts +58 -0
- package/dist/oauth2/client.d.mts.map +1 -0
- package/dist/oauth2/client.mjs +104 -116
- package/dist/oauth2/client.mjs.map +1 -1
- package/dist/oauth2/error.cjs +19 -44
- package/dist/oauth2/error.cjs.map +1 -1
- package/dist/oauth2/error.d.cts +8 -6
- package/dist/oauth2/error.d.cts.map +1 -0
- package/dist/oauth2/{error.d.ts → error.d.mts} +8 -6
- package/dist/oauth2/error.d.mts.map +1 -0
- package/dist/oauth2/error.mjs +18 -19
- package/dist/oauth2/error.mjs.map +1 -1
- package/dist/oauth2/provider/apple.cjs +75 -88
- package/dist/oauth2/provider/apple.cjs.map +1 -1
- package/dist/oauth2/provider/apple.d.cts +31 -30
- package/dist/oauth2/provider/apple.d.cts.map +1 -0
- package/dist/oauth2/provider/apple.d.mts +42 -0
- package/dist/oauth2/provider/apple.d.mts.map +1 -0
- package/dist/oauth2/provider/apple.mjs +71 -60
- package/dist/oauth2/provider/apple.mjs.map +1 -1
- package/dist/oauth2/provider/common.cjs +86 -109
- package/dist/oauth2/provider/common.cjs.map +1 -1
- package/dist/oauth2/provider/common.d.cts +19 -18
- package/dist/oauth2/provider/common.d.cts.map +1 -0
- package/dist/oauth2/provider/common.d.mts +30 -0
- package/dist/oauth2/provider/common.d.mts.map +1 -0
- package/dist/oauth2/provider/common.mjs +80 -79
- package/dist/oauth2/provider/common.mjs.map +1 -1
- package/dist/oauth2/provider/facebook.cjs +93 -109
- package/dist/oauth2/provider/facebook.cjs.map +1 -1
- package/dist/oauth2/provider/facebook.d.cts +29 -28
- package/dist/oauth2/provider/facebook.d.cts.map +1 -0
- package/dist/oauth2/provider/facebook.d.mts +45 -0
- package/dist/oauth2/provider/facebook.d.mts.map +1 -0
- package/dist/oauth2/provider/facebook.mjs +89 -81
- package/dist/oauth2/provider/facebook.mjs.map +1 -1
- package/dist/oauth2/provider/github.cjs +64 -91
- package/dist/oauth2/provider/github.cjs.map +1 -1
- package/dist/oauth2/provider/github.d.cts +52 -51
- package/dist/oauth2/provider/github.d.cts.map +1 -0
- package/dist/oauth2/provider/github.d.mts +60 -0
- package/dist/oauth2/provider/github.d.mts.map +1 -0
- package/dist/oauth2/provider/github.mjs +60 -63
- package/dist/oauth2/provider/github.mjs.map +1 -1
- package/dist/oauth2/provider/google.cjs +105 -122
- package/dist/oauth2/provider/google.cjs.map +1 -1
- package/dist/oauth2/provider/google.d.cts +34 -33
- package/dist/oauth2/provider/google.d.cts.map +1 -0
- package/dist/oauth2/provider/google.d.mts +44 -0
- package/dist/oauth2/provider/google.d.mts.map +1 -0
- package/dist/oauth2/provider/google.mjs +101 -94
- package/dist/oauth2/provider/google.mjs.map +1 -1
- package/dist/oauth2/provider/index.cjs +13 -46
- package/dist/oauth2/provider/index.d.cts +7 -7
- package/dist/oauth2/provider/index.d.mts +7 -0
- package/dist/oauth2/provider/index.mjs +1 -10
- package/dist/oauth2/provider/wechat.cjs +77 -99
- package/dist/oauth2/provider/wechat.cjs.map +1 -1
- package/dist/oauth2/provider/wechat.d.cts +28 -27
- package/dist/oauth2/provider/wechat.d.cts.map +1 -0
- package/dist/oauth2/provider/wechat.d.mts +39 -0
- package/dist/oauth2/provider/wechat.d.mts.map +1 -0
- package/dist/oauth2/provider/wechat.mjs +74 -72
- package/dist/oauth2/provider/wechat.mjs.map +1 -1
- package/dist/oauth2/provider/x.cjs +102 -125
- package/dist/oauth2/provider/x.cjs.map +1 -1
- package/dist/oauth2/provider/x.d.cts +51 -50
- package/dist/oauth2/provider/x.d.cts.map +1 -0
- package/dist/oauth2/provider/x.d.mts +69 -0
- package/dist/oauth2/provider/x.d.mts.map +1 -0
- package/dist/oauth2/provider/x.mjs +99 -103
- package/dist/oauth2/provider/x.mjs.map +1 -1
- package/dist/oauth2/types.cjs +12 -37
- package/dist/oauth2/types.cjs.map +1 -1
- package/dist/oauth2/types.d.cts +176 -180
- package/dist/oauth2/types.d.cts.map +1 -0
- package/dist/oauth2/types.d.mts +207 -0
- package/dist/oauth2/types.d.mts.map +1 -0
- package/dist/oauth2/types.mjs +12 -13
- package/dist/oauth2/types.mjs.map +1 -1
- package/dist/session/common.cjs +17 -43
- package/dist/session/common.cjs.map +1 -1
- package/dist/session/common.d.cts +4 -4
- package/dist/session/common.d.cts.map +1 -0
- package/dist/session/{common.d.ts → common.d.mts} +4 -4
- package/dist/session/common.d.mts.map +1 -0
- package/dist/session/common.mjs +14 -16
- package/dist/session/common.mjs.map +1 -1
- package/dist/session/db.cjs +88 -123
- package/dist/session/db.cjs.map +1 -1
- package/dist/session/db.d.cts +36 -36
- package/dist/session/db.d.cts.map +1 -0
- package/dist/session/db.d.mts +44 -0
- package/dist/session/db.d.mts.map +1 -0
- package/dist/session/db.mjs +84 -95
- package/dist/session/db.mjs.map +1 -1
- package/dist/session/map-session.cjs +71 -103
- package/dist/session/map-session.cjs.map +1 -1
- package/dist/session/map-session.d.cts +24 -24
- package/dist/session/map-session.d.cts.map +1 -0
- package/dist/session/map-session.d.mts +27 -0
- package/dist/session/map-session.d.mts.map +1 -0
- package/dist/session/map-session.mjs +70 -78
- package/dist/session/map-session.mjs.map +1 -1
- package/dist/session/redis.cjs +270 -319
- package/dist/session/redis.cjs.map +1 -1
- package/dist/session/redis.d.cts +51 -51
- package/dist/session/redis.d.cts.map +1 -0
- package/dist/session/redis.d.mts +58 -0
- package/dist/session/redis.d.mts.map +1 -0
- package/dist/session/redis.mjs +266 -291
- package/dist/session/redis.mjs.map +1 -1
- package/dist/session/types.cjs +0 -19
- package/dist/session/types.d.cts +34 -33
- package/dist/session/types.d.cts.map +1 -0
- package/dist/session/types.d.mts +45 -0
- package/dist/session/types.d.mts.map +1 -0
- package/dist/session/types.mjs +1 -1
- package/dist/utils/http.cjs +31 -55
- package/dist/utils/http.cjs.map +1 -1
- package/dist/utils/http.d.cts +7 -10
- package/dist/utils/http.d.cts.map +1 -0
- package/dist/utils/{http.d.ts → http.d.mts} +7 -10
- package/dist/utils/http.d.mts.map +1 -0
- package/dist/utils/http.mjs +24 -24
- package/dist/utils/http.mjs.map +1 -1
- package/dist/utils/oauth2.cjs +6 -30
- package/dist/utils/oauth2.cjs.map +1 -1
- package/dist/utils/oauth2.d.cts +3 -1
- package/dist/utils/oauth2.d.cts.map +1 -0
- package/dist/utils/oauth2.d.mts +5 -0
- package/dist/utils/oauth2.d.mts.map +1 -0
- package/dist/utils/oauth2.mjs +5 -5
- package/dist/utils/oauth2.mjs.map +1 -1
- package/dist/utils/timing.cjs +49 -70
- package/dist/utils/timing.cjs.map +1 -1
- package/dist/utils/timing.d.cts +10 -8
- package/dist/utils/timing.d.cts.map +1 -0
- package/dist/utils/timing.d.mts +15 -0
- package/dist/utils/timing.d.mts.map +1 -0
- package/dist/utils/timing.mjs +48 -45
- package/dist/utils/timing.mjs.map +1 -1
- package/dist/utils/valid.cjs +50 -71
- package/dist/utils/valid.cjs.map +1 -1
- package/dist/utils/valid.d.cts +17 -16
- package/dist/utils/valid.d.cts.map +1 -0
- package/dist/utils/valid.d.mts +28 -0
- package/dist/utils/valid.d.mts.map +1 -0
- package/dist/utils/valid.mjs +47 -44
- package/dist/utils/valid.mjs.map +1 -1
- package/package.json +22 -12
- package/dist/auth/index.d.ts +0 -111
- package/dist/auth/types.cjs.map +0 -1
- package/dist/auth/types.d.ts +0 -50
- package/dist/auth/types.mjs.map +0 -1
- package/dist/core/index.d.ts +0 -32
- package/dist/email/schema.d.ts +0 -13
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.ts +0 -15
- package/dist/index.mjs.map +0 -1
- package/dist/oauth2/client.d.ts +0 -59
- package/dist/oauth2/provider/apple.d.ts +0 -41
- package/dist/oauth2/provider/common.d.ts +0 -29
- package/dist/oauth2/provider/facebook.d.ts +0 -44
- package/dist/oauth2/provider/github.d.ts +0 -59
- package/dist/oauth2/provider/google.d.ts +0 -43
- package/dist/oauth2/provider/index.cjs.map +0 -1
- package/dist/oauth2/provider/index.d.ts +0 -7
- package/dist/oauth2/provider/index.mjs.map +0 -1
- package/dist/oauth2/provider/wechat.d.ts +0 -38
- package/dist/oauth2/provider/x.d.ts +0 -68
- package/dist/oauth2/types.d.ts +0 -211
- package/dist/session/__tests__/redis.test.cjs +0 -247
- package/dist/session/__tests__/redis.test.cjs.map +0 -1
- package/dist/session/__tests__/redis.test.d.cts +0 -2
- package/dist/session/__tests__/redis.test.d.ts +0 -2
- package/dist/session/__tests__/redis.test.mjs +0 -252
- package/dist/session/__tests__/redis.test.mjs.map +0 -1
- package/dist/session/db.d.ts +0 -44
- package/dist/session/map-session.d.ts +0 -27
- package/dist/session/redis.d.ts +0 -58
- package/dist/session/types.cjs.map +0 -1
- package/dist/session/types.d.ts +0 -44
- package/dist/session/types.mjs.map +0 -1
- package/dist/utils/oauth2.d.ts +0 -3
- package/dist/utils/timing.d.ts +0 -13
- package/dist/utils/valid.d.ts +0 -27
package/dist/session/redis.mjs
CHANGED
|
@@ -1,302 +1,277 @@
|
|
|
1
|
-
// src/session/redis.ts
|
|
2
1
|
import { PRINCIPAL_NAME_INDEX_NAME, SPRING_SECURITY_CONTEXT, resolveIndexesFor } from "./common.mjs";
|
|
3
2
|
import { MapSession } from "./map-session.mjs";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
//#region src/session/redis.ts
|
|
4
|
+
const CREATION_TIME_KEY = "creationTime";
|
|
5
|
+
const LAST_ACCESSED_TIME_KEY = "lastAccessedTime";
|
|
6
|
+
const MAX_INACTIVE_INTERVAL_KEY = "maxInactiveInterval";
|
|
7
|
+
const ATTRIBUTE_PREFIX = "sessionAttr:";
|
|
8
|
+
const SESSION_EXPIRES_PREFIX = "expires:";
|
|
9
9
|
var RedisSession = class {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
10
|
+
cached;
|
|
11
|
+
isNew;
|
|
12
|
+
delta = /* @__PURE__ */ new Map();
|
|
13
|
+
originalSessionId;
|
|
14
|
+
originalPrincipalName;
|
|
15
|
+
originalLastAccessTime = null;
|
|
16
|
+
constructor(cached, isNew) {
|
|
17
|
+
this.cached = cached;
|
|
18
|
+
this.isNew = isNew;
|
|
19
|
+
this.originalSessionId = cached.getId();
|
|
20
|
+
this.originalPrincipalName = resolveIndexesFor(this);
|
|
21
|
+
if (isNew) {
|
|
22
|
+
this.delta.set(CREATION_TIME_KEY, cached.getCreationTime());
|
|
23
|
+
this.delta.set(LAST_ACCESSED_TIME_KEY, cached.getLastAccessedTime());
|
|
24
|
+
this.delta.set(MAX_INACTIVE_INTERVAL_KEY, cached.getMaxInactiveInterval());
|
|
25
|
+
this.cached.getAttributeNames().forEach((name) => {
|
|
26
|
+
const value = this.cached.getAttribute(name);
|
|
27
|
+
if (value) this.delta.set(this.getSessionAttrNameKey(name), value);
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
getSessionAttrNameKey(name) {
|
|
32
|
+
return ATTRIBUTE_PREFIX + name;
|
|
33
|
+
}
|
|
34
|
+
setLastAccessedTime(lastAccessedTime) {
|
|
35
|
+
this.cached.setLastAccessedTime(lastAccessedTime);
|
|
36
|
+
this.delta.set(LAST_ACCESSED_TIME_KEY, lastAccessedTime);
|
|
37
|
+
}
|
|
38
|
+
isExpired() {
|
|
39
|
+
return this.cached.isExpired();
|
|
40
|
+
}
|
|
41
|
+
getCreationTime() {
|
|
42
|
+
return this.cached.getCreationTime();
|
|
43
|
+
}
|
|
44
|
+
getId() {
|
|
45
|
+
return this.cached.getId();
|
|
46
|
+
}
|
|
47
|
+
changeSessionId() {
|
|
48
|
+
return this.cached.changeSessionId();
|
|
49
|
+
}
|
|
50
|
+
getLastAccessedTime() {
|
|
51
|
+
return this.cached.getLastAccessedTime();
|
|
52
|
+
}
|
|
53
|
+
setMaxInactiveInterval(interval) {
|
|
54
|
+
this.cached.setMaxInactiveInterval(interval);
|
|
55
|
+
this.delta.set(MAX_INACTIVE_INTERVAL_KEY, interval);
|
|
56
|
+
}
|
|
57
|
+
getMaxInactiveInterval() {
|
|
58
|
+
return this.cached.getMaxInactiveInterval();
|
|
59
|
+
}
|
|
60
|
+
getAttribute(name) {
|
|
61
|
+
return this.cached.getAttribute(name);
|
|
62
|
+
}
|
|
63
|
+
getAttributeNames() {
|
|
64
|
+
return this.cached.getAttributeNames();
|
|
65
|
+
}
|
|
66
|
+
setAttribute(name, value) {
|
|
67
|
+
this.cached.setAttribute(name, value);
|
|
68
|
+
this.delta.set(this.getSessionAttrNameKey(name), value);
|
|
69
|
+
}
|
|
70
|
+
removeAttribute(name) {
|
|
71
|
+
this.cached.removeAttribute(name);
|
|
72
|
+
this.delta.set(this.getSessionAttrNameKey(name), null);
|
|
73
|
+
}
|
|
75
74
|
};
|
|
76
75
|
var SortedSetRedisSessionExpirationStore = class {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
76
|
+
redis;
|
|
77
|
+
namespace;
|
|
78
|
+
expirationsKey;
|
|
79
|
+
constructor(redis, namespace) {
|
|
80
|
+
this.redis = redis;
|
|
81
|
+
this.namespace = namespace;
|
|
82
|
+
this.expirationsKey = `${this.namespace}:sessions:expirations`;
|
|
83
|
+
}
|
|
84
|
+
getSessionKey(sessionId) {
|
|
85
|
+
return `${this.namespace}:sessions:${sessionId}`;
|
|
86
|
+
}
|
|
87
|
+
async save(session) {
|
|
88
|
+
const expirationInMillis = session.getLastAccessedTime() + session.getMaxInactiveInterval() * 1e3;
|
|
89
|
+
await this.redis.zadd(this.expirationsKey, expirationInMillis, session.getId());
|
|
90
|
+
}
|
|
91
|
+
async remove(sessionId) {
|
|
92
|
+
await this.redis.zrem(this.expirationsKey, sessionId);
|
|
93
|
+
}
|
|
94
|
+
async rename(session) {
|
|
95
|
+
if (session.originalSessionId === null || session.originalSessionId === session.getId()) return;
|
|
96
|
+
await this.remove(session.originalSessionId);
|
|
97
|
+
await this.save(session);
|
|
98
|
+
}
|
|
99
|
+
async cleanupExpiredSessions(cleanupCount = 100) {
|
|
100
|
+
const key = this.expirationsKey;
|
|
101
|
+
const score = Date.now();
|
|
102
|
+
const sessionIds = await this.redis.zrevrangebyscore(key, score, 0, "LIMIT", 0, cleanupCount);
|
|
103
|
+
if (sessionIds.length === 0) return;
|
|
104
|
+
for (const sessionId of sessionIds) {
|
|
105
|
+
const sessionKey = this.getSessionKey(sessionId);
|
|
106
|
+
await this.redis.exists(sessionKey);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
110
109
|
};
|
|
111
110
|
var RedisIndexedSessionRepository = class {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
const principalKey = this.getPrincipalKey(indexValue);
|
|
259
|
-
const sessionIds = await this.redis.smembers(principalKey);
|
|
260
|
-
if (!sessionIds || sessionIds.length === 0) {
|
|
261
|
-
return /* @__PURE__ */ new Map();
|
|
262
|
-
}
|
|
263
|
-
const sessions = /* @__PURE__ */ new Map();
|
|
264
|
-
for (const sessionId of sessionIds) {
|
|
265
|
-
const session = await this.findById(sessionId);
|
|
266
|
-
if (session !== null) {
|
|
267
|
-
sessions.set(sessionId, session);
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
return sessions;
|
|
271
|
-
}
|
|
272
|
-
async findByPrincipalName(principalName) {
|
|
273
|
-
return this.findByIndexNameAndIndexValue(PRINCIPAL_NAME_INDEX_NAME, principalName);
|
|
274
|
-
}
|
|
275
|
-
async cleanupExpiredSessions(cleanupCount) {
|
|
276
|
-
await this.expirationStore.cleanupExpiredSessions(cleanupCount);
|
|
277
|
-
}
|
|
111
|
+
redis;
|
|
112
|
+
namespace;
|
|
113
|
+
expirationStore;
|
|
114
|
+
defaultMaxInactiveInterval = 1800;
|
|
115
|
+
constructor(redis, namespace = "spring:session") {
|
|
116
|
+
this.redis = redis;
|
|
117
|
+
this.namespace = namespace;
|
|
118
|
+
this.expirationStore = new SortedSetRedisSessionExpirationStore(redis, namespace);
|
|
119
|
+
}
|
|
120
|
+
setDefaultMaxInactiveInterval(interval) {
|
|
121
|
+
this.defaultMaxInactiveInterval = interval;
|
|
122
|
+
}
|
|
123
|
+
getSessionKey(sessionId) {
|
|
124
|
+
return `${this.namespace}:sessions:${sessionId}`;
|
|
125
|
+
}
|
|
126
|
+
getExpiredKey(sessionId) {
|
|
127
|
+
return `${this.namespace}:sessions:expires:${sessionId}`;
|
|
128
|
+
}
|
|
129
|
+
getSessionAttrNameKey(name) {
|
|
130
|
+
return ATTRIBUTE_PREFIX + name;
|
|
131
|
+
}
|
|
132
|
+
getPrincipalKey(principalName) {
|
|
133
|
+
return `${this.namespace}:index:${PRINCIPAL_NAME_INDEX_NAME}:${principalName}`;
|
|
134
|
+
}
|
|
135
|
+
async getSession(id, allowExpired) {
|
|
136
|
+
const key = this.getSessionKey(id);
|
|
137
|
+
const entries = await this.redis.hgetall(key);
|
|
138
|
+
if (!entries || Object.keys(entries).length === 0) return null;
|
|
139
|
+
const loaded = new MapSession(id);
|
|
140
|
+
if (!entries.creationTime) throw new Error("creationTime attribute not found");
|
|
141
|
+
if (!entries.lastAccessedTime) throw new Error("lastAccessedTime attribute not found");
|
|
142
|
+
if (!entries.maxInactiveInterval) throw new Error("maxInactiveInterval attribute not found");
|
|
143
|
+
loaded.setCreationTime(Number(entries.creationTime));
|
|
144
|
+
loaded.setLastAccessedTime(Number(entries.lastAccessedTime));
|
|
145
|
+
loaded.setMaxInactiveInterval(Number(entries.maxInactiveInterval));
|
|
146
|
+
for (const [key, value] of Object.entries(entries)) if (key.startsWith(ATTRIBUTE_PREFIX)) loaded.setAttribute(key.slice(12), value);
|
|
147
|
+
if (!allowExpired && loaded.isExpired()) return null;
|
|
148
|
+
const result = new RedisSession(loaded, false);
|
|
149
|
+
result.originalLastAccessTime = loaded.getLastAccessedTime();
|
|
150
|
+
return result;
|
|
151
|
+
}
|
|
152
|
+
async saveDelta(session) {
|
|
153
|
+
if (session.delta.size === 0) return;
|
|
154
|
+
const sessionId = session.getId();
|
|
155
|
+
const delta = /* @__PURE__ */ new Map();
|
|
156
|
+
const removes = [];
|
|
157
|
+
session.delta.forEach((value, key) => {
|
|
158
|
+
if (value !== null) delta.set(key, value);
|
|
159
|
+
else removes.push(key);
|
|
160
|
+
});
|
|
161
|
+
if (delta.size !== 0) await this.redis.hset(this.getSessionKey(sessionId), delta);
|
|
162
|
+
if (removes.length !== 0) await this.redis.hdel(this.getSessionKey(sessionId), ...removes);
|
|
163
|
+
const principalSessionKey = this.getSessionAttrNameKey(PRINCIPAL_NAME_INDEX_NAME);
|
|
164
|
+
const securityPrincipalSessionKey = this.getSessionAttrNameKey(SPRING_SECURITY_CONTEXT);
|
|
165
|
+
if (session.delta.has(principalSessionKey) || session.delta.has(securityPrincipalSessionKey)) {
|
|
166
|
+
if (session.originalPrincipalName !== null) {
|
|
167
|
+
const originalPrincipalRedisKey = this.getPrincipalKey(session.originalPrincipalName);
|
|
168
|
+
await this.redis.srem(originalPrincipalRedisKey, sessionId);
|
|
169
|
+
}
|
|
170
|
+
const principal = resolveIndexesFor(session);
|
|
171
|
+
session.originalPrincipalName = principal;
|
|
172
|
+
if (principal !== null) {
|
|
173
|
+
const principalRedisKey = this.getPrincipalKey(principal);
|
|
174
|
+
await this.redis.sadd(principalRedisKey, sessionId);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if (session.isNew) session.isNew = false;
|
|
178
|
+
const sessionExpireInSeconds = session.getMaxInactiveInterval();
|
|
179
|
+
const keyToExpire = SESSION_EXPIRES_PREFIX + session.getId();
|
|
180
|
+
const sessionKey = this.getSessionKey(keyToExpire);
|
|
181
|
+
if (sessionExpireInSeconds < 0) {
|
|
182
|
+
await this.redis.append(sessionKey, "");
|
|
183
|
+
await this.redis.persist(sessionKey);
|
|
184
|
+
await this.redis.persist(this.getSessionKey(session.getId()));
|
|
185
|
+
} else if (sessionExpireInSeconds === 0) await this.redis.del(sessionKey);
|
|
186
|
+
else {
|
|
187
|
+
await this.redis.append(sessionKey, "");
|
|
188
|
+
await this.redis.expire(sessionKey, sessionExpireInSeconds);
|
|
189
|
+
}
|
|
190
|
+
if (sessionExpireInSeconds > 0) {
|
|
191
|
+
const fiveMinutesAfterExpires = sessionExpireInSeconds + 300;
|
|
192
|
+
await this.redis.expire(this.getSessionKey(session.getId()), fiveMinutesAfterExpires);
|
|
193
|
+
}
|
|
194
|
+
await this.expirationStore.save(session);
|
|
195
|
+
session.delta.clear();
|
|
196
|
+
}
|
|
197
|
+
async saveChangeSessionId(session) {
|
|
198
|
+
const sessionId = session.getId();
|
|
199
|
+
if (sessionId === session.originalSessionId) return;
|
|
200
|
+
if (!session.isNew) {
|
|
201
|
+
const originalSessionIdKey = this.getSessionKey(session.originalSessionId);
|
|
202
|
+
const sessionIdKey = this.getSessionKey(sessionId);
|
|
203
|
+
const originalExpiredKey = this.getExpiredKey(session.originalSessionId);
|
|
204
|
+
const expiredKey = this.getExpiredKey(sessionId);
|
|
205
|
+
await this.redis.rename(originalSessionIdKey, sessionIdKey);
|
|
206
|
+
await this.redis.rename(originalExpiredKey, expiredKey);
|
|
207
|
+
if (session.originalPrincipalName !== null) {
|
|
208
|
+
const originalPrincipalRedisKey = this.getPrincipalKey(session.originalPrincipalName);
|
|
209
|
+
await this.redis.srem(originalPrincipalRedisKey, session.originalSessionId);
|
|
210
|
+
await this.redis.sadd(originalPrincipalRedisKey, sessionId);
|
|
211
|
+
}
|
|
212
|
+
await this.expirationStore.rename(session);
|
|
213
|
+
}
|
|
214
|
+
session.originalSessionId = sessionId;
|
|
215
|
+
}
|
|
216
|
+
createSession() {
|
|
217
|
+
const cached = new MapSession();
|
|
218
|
+
cached.setMaxInactiveInterval(this.defaultMaxInactiveInterval);
|
|
219
|
+
return new RedisSession(cached, true);
|
|
220
|
+
}
|
|
221
|
+
async save(session) {
|
|
222
|
+
await this.saveChangeSessionId(session);
|
|
223
|
+
await this.saveDelta(session);
|
|
224
|
+
}
|
|
225
|
+
async findById(sessionId) {
|
|
226
|
+
return this.getSession(sessionId, false);
|
|
227
|
+
}
|
|
228
|
+
async deleteById(sessionId) {
|
|
229
|
+
const session = await this.getSession(sessionId, true);
|
|
230
|
+
if (!session) return;
|
|
231
|
+
const principal = resolveIndexesFor(session);
|
|
232
|
+
if (principal !== null) await this.redis.srem(this.getPrincipalKey(principal), sessionId);
|
|
233
|
+
await this.expirationStore.remove(sessionId);
|
|
234
|
+
const expiredKey = this.getExpiredKey(sessionId);
|
|
235
|
+
await this.redis.del(expiredKey);
|
|
236
|
+
session.setMaxInactiveInterval(0);
|
|
237
|
+
await this.save(session);
|
|
238
|
+
}
|
|
239
|
+
async findByIndexNameAndIndexValue(indexName, indexValue) {
|
|
240
|
+
if (indexName !== PRINCIPAL_NAME_INDEX_NAME) return /* @__PURE__ */ new Map();
|
|
241
|
+
const principalKey = this.getPrincipalKey(indexValue);
|
|
242
|
+
const sessionIds = await this.redis.smembers(principalKey);
|
|
243
|
+
if (!sessionIds || sessionIds.length === 0) return /* @__PURE__ */ new Map();
|
|
244
|
+
const sessions = /* @__PURE__ */ new Map();
|
|
245
|
+
for (const sessionId of sessionIds) {
|
|
246
|
+
const session = await this.findById(sessionId);
|
|
247
|
+
if (session !== null) sessions.set(sessionId, session);
|
|
248
|
+
}
|
|
249
|
+
return sessions;
|
|
250
|
+
}
|
|
251
|
+
async findByPrincipalName(principalName) {
|
|
252
|
+
return this.findByIndexNameAndIndexValue(PRINCIPAL_NAME_INDEX_NAME, principalName);
|
|
253
|
+
}
|
|
254
|
+
async cleanupExpiredSessions(cleanupCount) {
|
|
255
|
+
await this.expirationStore.cleanupExpiredSessions(cleanupCount);
|
|
256
|
+
}
|
|
278
257
|
};
|
|
279
258
|
var RedisKVRepository = class {
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
async removeItem(key) {
|
|
295
|
-
await this.redis.del(key);
|
|
296
|
-
}
|
|
297
|
-
};
|
|
298
|
-
export {
|
|
299
|
-
RedisIndexedSessionRepository,
|
|
300
|
-
RedisKVRepository
|
|
259
|
+
redis;
|
|
260
|
+
constructor(redis) {
|
|
261
|
+
this.redis = redis;
|
|
262
|
+
}
|
|
263
|
+
async setItem(key, value, expiresIn) {
|
|
264
|
+
if (expiresIn) await this.redis.set(key, value, "EX", expiresIn);
|
|
265
|
+
else await this.redis.set(key, value);
|
|
266
|
+
}
|
|
267
|
+
async getItem(key) {
|
|
268
|
+
return await this.redis.get(key);
|
|
269
|
+
}
|
|
270
|
+
async removeItem(key) {
|
|
271
|
+
await this.redis.del(key);
|
|
272
|
+
}
|
|
301
273
|
};
|
|
274
|
+
//#endregion
|
|
275
|
+
export { RedisIndexedSessionRepository, RedisKVRepository };
|
|
276
|
+
|
|
302
277
|
//# sourceMappingURL=redis.mjs.map
|