@shware/security 1.1.0 → 1.2.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/README.md +48 -0
- package/dist/auth/index.cjs +19 -10
- package/dist/auth/index.cjs.map +1 -1
- package/dist/auth/index.d.cts +5 -2
- package/dist/auth/index.d.ts +5 -2
- package/dist/auth/index.mjs +16 -7
- package/dist/auth/index.mjs.map +1 -1
- package/dist/auth/types.cjs.map +1 -1
- package/dist/auth/types.d.cts +3 -2
- package/dist/auth/types.d.ts +3 -2
- package/dist/index.cjs +9 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -6
- package/dist/index.d.ts +9 -6
- package/dist/index.mjs +6 -2
- package/dist/index.mjs.map +1 -1
- package/dist/session/__test__/redis.test.cjs +5 -4
- package/dist/session/__test__/redis.test.cjs.map +1 -1
- package/dist/session/__test__/redis.test.mjs +3 -2
- package/dist/session/__test__/redis.test.mjs.map +1 -1
- package/dist/session/common.cjs +46 -0
- package/dist/session/common.cjs.map +1 -0
- package/dist/session/common.d.cts +8 -0
- package/dist/session/common.d.ts +8 -0
- package/dist/session/common.mjs +19 -0
- package/dist/session/common.mjs.map +1 -0
- package/dist/session/db.cjs +127 -0
- package/dist/session/db.cjs.map +1 -0
- package/dist/session/db.d.cts +43 -0
- package/dist/session/db.d.ts +43 -0
- package/dist/session/db.mjs +102 -0
- package/dist/session/db.mjs.map +1 -0
- package/dist/session/map-session.cjs +108 -0
- package/dist/session/map-session.cjs.map +1 -0
- package/dist/session/map-session.d.cts +27 -0
- package/dist/session/map-session.d.ts +27 -0
- package/dist/session/map-session.mjs +83 -0
- package/dist/session/map-session.mjs.map +1 -0
- package/dist/session/redis.cjs +32 -128
- package/dist/session/redis.cjs.map +1 -1
- package/dist/session/redis.d.cts +11 -30
- package/dist/session/redis.d.ts +11 -30
- package/dist/session/redis.mjs +20 -116
- package/dist/session/redis.mjs.map +1 -1
- package/dist/session/types.cjs.map +1 -1
- package/dist/session/types.d.cts +6 -4
- package/dist/session/types.d.ts +6 -4
- package/package.json +1 -1
- package/dist/session/index.cjs +0 -33
- package/dist/session/index.cjs.map +0 -1
- package/dist/session/index.d.cts +0 -4
- package/dist/session/index.d.ts +0 -4
- package/dist/session/index.mjs +0 -10
- package/dist/session/index.mjs.map +0 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { Auth } from './auth/index';\nexport { OAuth2Client, oauth2RedirectQuerySchema } from './oauth2/client';\nexport {
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { Auth } from './auth/index';\nexport { OAuth2Client, oauth2RedirectQuerySchema } from './oauth2/client';\nexport { RedisIndexedSessionRepository, RedisKVRepository } from './session/redis';\nexport { DBIndexedSessionRepository } from './session/db';\nexport { PRINCIPAL_NAME_INDEX_NAME } from './session/common';\n\nexport type { Principal } from './core/index';\nexport type { DBAdapter } from './session/db';\nexport type { Namespace, SessionRepository, Session, KVRepository } from './session/types';\nexport type { StandardClaims, OAuth2Token, UserInfo, OidcToken, OidcScopes } from './oauth2/types';\nexport type { AuthConfig, AuthService } from './auth/types';\n"],"mappings":";AAAA,SAAS,YAAY;AACrB,SAAS,cAAc,iCAAiC;AACxD,SAAS,+BAA+B,yBAAyB;AACjE,SAAS,kCAAkC;AAC3C,SAAS,iCAAiC;","names":[]}
|
|
@@ -24,18 +24,19 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
24
24
|
|
|
25
25
|
// src/session/__test__/redis.test.ts
|
|
26
26
|
var import_ioredis = __toESM(require("ioredis"), 1);
|
|
27
|
+
var import_common = require("../common.cjs");
|
|
27
28
|
var import_redis = require("../redis.cjs");
|
|
28
29
|
var redis = new import_ioredis.default("redis://default:123456@localhost:6379");
|
|
29
|
-
var repository = new import_redis.
|
|
30
|
+
var repository = new import_redis.RedisIndexedSessionRepository(redis, "myapp:session");
|
|
30
31
|
describe("redis session crud", () => {
|
|
31
32
|
const principalName = "user_123456";
|
|
32
33
|
test("should create a session", async () => {
|
|
33
34
|
const session = repository.createSession();
|
|
34
35
|
const sessionId = session.getId();
|
|
35
|
-
session.setAttribute(
|
|
36
|
+
session.setAttribute(import_common.PRINCIPAL_NAME_INDEX_NAME, principalName);
|
|
36
37
|
await repository.save(session);
|
|
37
38
|
const foundSession = await repository.findById(sessionId);
|
|
38
|
-
expect(foundSession?.getAttribute(
|
|
39
|
+
expect(foundSession?.getAttribute(import_common.PRINCIPAL_NAME_INDEX_NAME)).toBe(principalName);
|
|
39
40
|
});
|
|
40
41
|
test("should find a session by principal name", async () => {
|
|
41
42
|
const sessions = await repository.findByPrincipalName(principalName);
|
|
@@ -68,7 +69,7 @@ describe("redis session attributes", () => {
|
|
|
68
69
|
test("should change session id", async () => {
|
|
69
70
|
const session = repository.createSession();
|
|
70
71
|
session.setAttribute("test_key", "test_value");
|
|
71
|
-
session.setAttribute(
|
|
72
|
+
session.setAttribute(import_common.PRINCIPAL_NAME_INDEX_NAME, "user_123");
|
|
72
73
|
const oldSessionId = session.getId();
|
|
73
74
|
await repository.save(session);
|
|
74
75
|
const oldSession = await repository.findById(oldSessionId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/session/__test__/redis.test.ts"],"sourcesContent":["import Redis from 'ioredis';\nimport { PRINCIPAL_NAME_INDEX_NAME
|
|
1
|
+
{"version":3,"sources":["../../../src/session/__test__/redis.test.ts"],"sourcesContent":["import Redis from 'ioredis';\nimport { PRINCIPAL_NAME_INDEX_NAME } from '../common';\nimport { RedisIndexedSessionRepository } from '../redis';\n\n// docker run -d -p 6379:6379 --name my-redis -e REDIS_PASSWORD=123456 redis\nconst redis = new Redis('redis://default:123456@localhost:6379');\nconst repository = new RedisIndexedSessionRepository(redis, 'myapp:session');\n\ndescribe('redis session crud', () => {\n const principalName = 'user_123456';\n\n test('should create a session', async () => {\n const session = repository.createSession();\n const sessionId = session.getId();\n session.setAttribute(PRINCIPAL_NAME_INDEX_NAME, principalName);\n await repository.save(session);\n const foundSession = await repository.findById(sessionId);\n expect(foundSession?.getAttribute(PRINCIPAL_NAME_INDEX_NAME)).toBe(principalName);\n });\n\n test('should find a session by principal name', async () => {\n const sessions = await repository.findByPrincipalName(principalName);\n expect(sessions.size).toBeGreaterThan(0);\n });\n\n test('should delete a session by id', async () => {\n const sessions = await repository.findByPrincipalName(principalName);\n for (const session of sessions.values()) {\n const sessionId = session.getId();\n await repository.deleteById(sessionId);\n const foundSession = await repository.findById(sessionId);\n expect(foundSession).toBeNull();\n }\n });\n});\n\ndescribe('redis session attributes', () => {\n test('should set and get attributes', async () => {\n const session = repository.createSession();\n session.setAttribute('test_key', 'test_value');\n const sessionId = session.getId();\n await repository.save(session);\n\n const foundSession = await repository.findById(sessionId);\n expect(foundSession).not.toBeNull();\n expect(foundSession?.getAttribute('test_key')).toBe('test_value');\n\n foundSession?.removeAttribute('test_key');\n await repository.save(foundSession!);\n\n const foundSession2 = await repository.findById(sessionId);\n expect(foundSession2?.getAttribute('test_key')).toBeNull();\n });\n\n test('should change session id', async () => {\n const session = repository.createSession();\n session.setAttribute('test_key', 'test_value');\n session.setAttribute(PRINCIPAL_NAME_INDEX_NAME, 'user_123');\n const oldSessionId = session.getId();\n await repository.save(session);\n\n const oldSession = await repository.findById(oldSessionId);\n expect(oldSession).not.toBeNull();\n if (!oldSession) throw new Error('Not found session id');\n\n const newSessionId = oldSession.changeSessionId();\n await repository.save(oldSession);\n\n const foundSession1 = await repository.findById(oldSessionId);\n expect(foundSession1).toBeNull();\n\n const foundSession2 = await repository.findById(newSessionId);\n expect(foundSession2).not.toBeNull();\n });\n});\n\ndescribe('redis session config', () => {\n const maxInactiveInterval = 24 * 60 * 60;\n repository.setDefaultMaxInactiveInterval(maxInactiveInterval);\n\n test('should set default max inactive interval', () => {\n const session = repository.createSession();\n expect(session.isExpired()).toBe(false);\n expect(session.getMaxInactiveInterval()).toBe(maxInactiveInterval);\n });\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qBAAkB;AAClB,oBAA0C;AAC1C,mBAA8C;AAG9C,IAAM,QAAQ,IAAI,eAAAA,QAAM,uCAAuC;AAC/D,IAAM,aAAa,IAAI,2CAA8B,OAAO,eAAe;AAE3E,SAAS,sBAAsB,MAAM;AACnC,QAAM,gBAAgB;AAEtB,OAAK,2BAA2B,YAAY;AAC1C,UAAM,UAAU,WAAW,cAAc;AACzC,UAAM,YAAY,QAAQ,MAAM;AAChC,YAAQ,aAAa,yCAA2B,aAAa;AAC7D,UAAM,WAAW,KAAK,OAAO;AAC7B,UAAM,eAAe,MAAM,WAAW,SAAS,SAAS;AACxD,WAAO,cAAc,aAAa,uCAAyB,CAAC,EAAE,KAAK,aAAa;AAAA,EAClF,CAAC;AAED,OAAK,2CAA2C,YAAY;AAC1D,UAAM,WAAW,MAAM,WAAW,oBAAoB,aAAa;AACnE,WAAO,SAAS,IAAI,EAAE,gBAAgB,CAAC;AAAA,EACzC,CAAC;AAED,OAAK,iCAAiC,YAAY;AAChD,UAAM,WAAW,MAAM,WAAW,oBAAoB,aAAa;AACnE,eAAW,WAAW,SAAS,OAAO,GAAG;AACvC,YAAM,YAAY,QAAQ,MAAM;AAChC,YAAM,WAAW,WAAW,SAAS;AACrC,YAAM,eAAe,MAAM,WAAW,SAAS,SAAS;AACxD,aAAO,YAAY,EAAE,SAAS;AAAA,IAChC;AAAA,EACF,CAAC;AACH,CAAC;AAED,SAAS,4BAA4B,MAAM;AACzC,OAAK,iCAAiC,YAAY;AAChD,UAAM,UAAU,WAAW,cAAc;AACzC,YAAQ,aAAa,YAAY,YAAY;AAC7C,UAAM,YAAY,QAAQ,MAAM;AAChC,UAAM,WAAW,KAAK,OAAO;AAE7B,UAAM,eAAe,MAAM,WAAW,SAAS,SAAS;AACxD,WAAO,YAAY,EAAE,IAAI,SAAS;AAClC,WAAO,cAAc,aAAa,UAAU,CAAC,EAAE,KAAK,YAAY;AAEhE,kBAAc,gBAAgB,UAAU;AACxC,UAAM,WAAW,KAAK,YAAa;AAEnC,UAAM,gBAAgB,MAAM,WAAW,SAAS,SAAS;AACzD,WAAO,eAAe,aAAa,UAAU,CAAC,EAAE,SAAS;AAAA,EAC3D,CAAC;AAED,OAAK,4BAA4B,YAAY;AAC3C,UAAM,UAAU,WAAW,cAAc;AACzC,YAAQ,aAAa,YAAY,YAAY;AAC7C,YAAQ,aAAa,yCAA2B,UAAU;AAC1D,UAAM,eAAe,QAAQ,MAAM;AACnC,UAAM,WAAW,KAAK,OAAO;AAE7B,UAAM,aAAa,MAAM,WAAW,SAAS,YAAY;AACzD,WAAO,UAAU,EAAE,IAAI,SAAS;AAChC,QAAI,CAAC,WAAY,OAAM,IAAI,MAAM,sBAAsB;AAEvD,UAAM,eAAe,WAAW,gBAAgB;AAChD,UAAM,WAAW,KAAK,UAAU;AAEhC,UAAM,gBAAgB,MAAM,WAAW,SAAS,YAAY;AAC5D,WAAO,aAAa,EAAE,SAAS;AAE/B,UAAM,gBAAgB,MAAM,WAAW,SAAS,YAAY;AAC5D,WAAO,aAAa,EAAE,IAAI,SAAS;AAAA,EACrC,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,MAAM;AACrC,QAAM,sBAAsB,KAAK,KAAK;AACtC,aAAW,8BAA8B,mBAAmB;AAE5D,OAAK,4CAA4C,MAAM;AACrD,UAAM,UAAU,WAAW,cAAc;AACzC,WAAO,QAAQ,UAAU,CAAC,EAAE,KAAK,KAAK;AACtC,WAAO,QAAQ,uBAAuB,CAAC,EAAE,KAAK,mBAAmB;AAAA,EACnE,CAAC;AACH,CAAC;","names":["Redis"]}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
// src/session/__test__/redis.test.ts
|
|
2
2
|
import Redis from "ioredis";
|
|
3
|
-
import { PRINCIPAL_NAME_INDEX_NAME
|
|
3
|
+
import { PRINCIPAL_NAME_INDEX_NAME } from "../common.mjs";
|
|
4
|
+
import { RedisIndexedSessionRepository } from "../redis.mjs";
|
|
4
5
|
var redis = new Redis("redis://default:123456@localhost:6379");
|
|
5
|
-
var repository = new
|
|
6
|
+
var repository = new RedisIndexedSessionRepository(redis, "myapp:session");
|
|
6
7
|
describe("redis session crud", () => {
|
|
7
8
|
const principalName = "user_123456";
|
|
8
9
|
test("should create a session", async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/session/__test__/redis.test.ts"],"sourcesContent":["import Redis from 'ioredis';\nimport { PRINCIPAL_NAME_INDEX_NAME
|
|
1
|
+
{"version":3,"sources":["../../../src/session/__test__/redis.test.ts"],"sourcesContent":["import Redis from 'ioredis';\nimport { PRINCIPAL_NAME_INDEX_NAME } from '../common';\nimport { RedisIndexedSessionRepository } from '../redis';\n\n// docker run -d -p 6379:6379 --name my-redis -e REDIS_PASSWORD=123456 redis\nconst redis = new Redis('redis://default:123456@localhost:6379');\nconst repository = new RedisIndexedSessionRepository(redis, 'myapp:session');\n\ndescribe('redis session crud', () => {\n const principalName = 'user_123456';\n\n test('should create a session', async () => {\n const session = repository.createSession();\n const sessionId = session.getId();\n session.setAttribute(PRINCIPAL_NAME_INDEX_NAME, principalName);\n await repository.save(session);\n const foundSession = await repository.findById(sessionId);\n expect(foundSession?.getAttribute(PRINCIPAL_NAME_INDEX_NAME)).toBe(principalName);\n });\n\n test('should find a session by principal name', async () => {\n const sessions = await repository.findByPrincipalName(principalName);\n expect(sessions.size).toBeGreaterThan(0);\n });\n\n test('should delete a session by id', async () => {\n const sessions = await repository.findByPrincipalName(principalName);\n for (const session of sessions.values()) {\n const sessionId = session.getId();\n await repository.deleteById(sessionId);\n const foundSession = await repository.findById(sessionId);\n expect(foundSession).toBeNull();\n }\n });\n});\n\ndescribe('redis session attributes', () => {\n test('should set and get attributes', async () => {\n const session = repository.createSession();\n session.setAttribute('test_key', 'test_value');\n const sessionId = session.getId();\n await repository.save(session);\n\n const foundSession = await repository.findById(sessionId);\n expect(foundSession).not.toBeNull();\n expect(foundSession?.getAttribute('test_key')).toBe('test_value');\n\n foundSession?.removeAttribute('test_key');\n await repository.save(foundSession!);\n\n const foundSession2 = await repository.findById(sessionId);\n expect(foundSession2?.getAttribute('test_key')).toBeNull();\n });\n\n test('should change session id', async () => {\n const session = repository.createSession();\n session.setAttribute('test_key', 'test_value');\n session.setAttribute(PRINCIPAL_NAME_INDEX_NAME, 'user_123');\n const oldSessionId = session.getId();\n await repository.save(session);\n\n const oldSession = await repository.findById(oldSessionId);\n expect(oldSession).not.toBeNull();\n if (!oldSession) throw new Error('Not found session id');\n\n const newSessionId = oldSession.changeSessionId();\n await repository.save(oldSession);\n\n const foundSession1 = await repository.findById(oldSessionId);\n expect(foundSession1).toBeNull();\n\n const foundSession2 = await repository.findById(newSessionId);\n expect(foundSession2).not.toBeNull();\n });\n});\n\ndescribe('redis session config', () => {\n const maxInactiveInterval = 24 * 60 * 60;\n repository.setDefaultMaxInactiveInterval(maxInactiveInterval);\n\n test('should set default max inactive interval', () => {\n const session = repository.createSession();\n expect(session.isExpired()).toBe(false);\n expect(session.getMaxInactiveInterval()).toBe(maxInactiveInterval);\n });\n});\n"],"mappings":";AAAA,OAAO,WAAW;AAClB,SAAS,iCAAiC;AAC1C,SAAS,qCAAqC;AAG9C,IAAM,QAAQ,IAAI,MAAM,uCAAuC;AAC/D,IAAM,aAAa,IAAI,8BAA8B,OAAO,eAAe;AAE3E,SAAS,sBAAsB,MAAM;AACnC,QAAM,gBAAgB;AAEtB,OAAK,2BAA2B,YAAY;AAC1C,UAAM,UAAU,WAAW,cAAc;AACzC,UAAM,YAAY,QAAQ,MAAM;AAChC,YAAQ,aAAa,2BAA2B,aAAa;AAC7D,UAAM,WAAW,KAAK,OAAO;AAC7B,UAAM,eAAe,MAAM,WAAW,SAAS,SAAS;AACxD,WAAO,cAAc,aAAa,yBAAyB,CAAC,EAAE,KAAK,aAAa;AAAA,EAClF,CAAC;AAED,OAAK,2CAA2C,YAAY;AAC1D,UAAM,WAAW,MAAM,WAAW,oBAAoB,aAAa;AACnE,WAAO,SAAS,IAAI,EAAE,gBAAgB,CAAC;AAAA,EACzC,CAAC;AAED,OAAK,iCAAiC,YAAY;AAChD,UAAM,WAAW,MAAM,WAAW,oBAAoB,aAAa;AACnE,eAAW,WAAW,SAAS,OAAO,GAAG;AACvC,YAAM,YAAY,QAAQ,MAAM;AAChC,YAAM,WAAW,WAAW,SAAS;AACrC,YAAM,eAAe,MAAM,WAAW,SAAS,SAAS;AACxD,aAAO,YAAY,EAAE,SAAS;AAAA,IAChC;AAAA,EACF,CAAC;AACH,CAAC;AAED,SAAS,4BAA4B,MAAM;AACzC,OAAK,iCAAiC,YAAY;AAChD,UAAM,UAAU,WAAW,cAAc;AACzC,YAAQ,aAAa,YAAY,YAAY;AAC7C,UAAM,YAAY,QAAQ,MAAM;AAChC,UAAM,WAAW,KAAK,OAAO;AAE7B,UAAM,eAAe,MAAM,WAAW,SAAS,SAAS;AACxD,WAAO,YAAY,EAAE,IAAI,SAAS;AAClC,WAAO,cAAc,aAAa,UAAU,CAAC,EAAE,KAAK,YAAY;AAEhE,kBAAc,gBAAgB,UAAU;AACxC,UAAM,WAAW,KAAK,YAAa;AAEnC,UAAM,gBAAgB,MAAM,WAAW,SAAS,SAAS;AACzD,WAAO,eAAe,aAAa,UAAU,CAAC,EAAE,SAAS;AAAA,EAC3D,CAAC;AAED,OAAK,4BAA4B,YAAY;AAC3C,UAAM,UAAU,WAAW,cAAc;AACzC,YAAQ,aAAa,YAAY,YAAY;AAC7C,YAAQ,aAAa,2BAA2B,UAAU;AAC1D,UAAM,eAAe,QAAQ,MAAM;AACnC,UAAM,WAAW,KAAK,OAAO;AAE7B,UAAM,aAAa,MAAM,WAAW,SAAS,YAAY;AACzD,WAAO,UAAU,EAAE,IAAI,SAAS;AAChC,QAAI,CAAC,WAAY,OAAM,IAAI,MAAM,sBAAsB;AAEvD,UAAM,eAAe,WAAW,gBAAgB;AAChD,UAAM,WAAW,KAAK,UAAU;AAEhC,UAAM,gBAAgB,MAAM,WAAW,SAAS,YAAY;AAC5D,WAAO,aAAa,EAAE,SAAS;AAE/B,UAAM,gBAAgB,MAAM,WAAW,SAAS,YAAY;AAC5D,WAAO,aAAa,EAAE,IAAI,SAAS;AAAA,EACrC,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,MAAM;AACrC,QAAM,sBAAsB,KAAK,KAAK;AACtC,aAAW,8BAA8B,mBAAmB;AAE5D,OAAK,4CAA4C,MAAM;AACrD,UAAM,UAAU,WAAW,cAAc;AACzC,WAAO,QAAQ,UAAU,CAAC,EAAE,KAAK,KAAK;AACtC,WAAO,QAAQ,uBAAuB,CAAC,EAAE,KAAK,mBAAmB;AAAA,EACnE,CAAC;AACH,CAAC;","names":[]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/session/common.ts
|
|
21
|
+
var common_exports = {};
|
|
22
|
+
__export(common_exports, {
|
|
23
|
+
PRINCIPAL_NAME_INDEX_NAME: () => PRINCIPAL_NAME_INDEX_NAME,
|
|
24
|
+
SPRING_SECURITY_CONTEXT: () => SPRING_SECURITY_CONTEXT,
|
|
25
|
+
resolveIndexesFor: () => resolveIndexesFor
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(common_exports);
|
|
28
|
+
var SPRING_SECURITY_CONTEXT = "SPRING_SECURITY_CONTEXT";
|
|
29
|
+
var PRINCIPAL_NAME_INDEX_NAME = `org.springframework.session.FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME`;
|
|
30
|
+
function resolveIndexesFor(session) {
|
|
31
|
+
const principalName = session.getAttribute(PRINCIPAL_NAME_INDEX_NAME);
|
|
32
|
+
if (principalName !== null) return principalName;
|
|
33
|
+
const jsonString = session.getAttribute(SPRING_SECURITY_CONTEXT);
|
|
34
|
+
if (typeof jsonString === "string") {
|
|
35
|
+
const context = JSON.parse(jsonString);
|
|
36
|
+
return context?.authentication?.name ?? context.authentication?.principal?.name ?? null;
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
41
|
+
0 && (module.exports = {
|
|
42
|
+
PRINCIPAL_NAME_INDEX_NAME,
|
|
43
|
+
SPRING_SECURITY_CONTEXT,
|
|
44
|
+
resolveIndexesFor
|
|
45
|
+
});
|
|
46
|
+
//# sourceMappingURL=common.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/session/common.ts"],"sourcesContent":["import type { Session, SecurityContext } from './types';\n\nexport const SPRING_SECURITY_CONTEXT = 'SPRING_SECURITY_CONTEXT';\nexport const PRINCIPAL_NAME_INDEX_NAME = `org.springframework.session.FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME`;\n\nexport function resolveIndexesFor(session: Session): string | null {\n const principalName = session.getAttribute(PRINCIPAL_NAME_INDEX_NAME) as string | null;\n if (principalName !== null) return principalName;\n\n const jsonString = session.getAttribute(SPRING_SECURITY_CONTEXT);\n if (typeof jsonString === 'string') {\n const context = JSON.parse(jsonString) as SecurityContext;\n return context?.authentication?.name ?? context.authentication?.principal?.name ?? null;\n }\n return null;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,IAAM,0BAA0B;AAChC,IAAM,4BAA4B;AAElC,SAAS,kBAAkB,SAAiC;AACjE,QAAM,gBAAgB,QAAQ,aAAa,yBAAyB;AACpE,MAAI,kBAAkB,KAAM,QAAO;AAEnC,QAAM,aAAa,QAAQ,aAAa,uBAAuB;AAC/D,MAAI,OAAO,eAAe,UAAU;AAClC,UAAM,UAAU,KAAK,MAAM,UAAU;AACrC,WAAO,SAAS,gBAAgB,QAAQ,QAAQ,gBAAgB,WAAW,QAAQ;AAAA,EACrF;AACA,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Session } from './types.cjs';
|
|
2
|
+
import '../core/index.cjs';
|
|
3
|
+
|
|
4
|
+
declare const SPRING_SECURITY_CONTEXT = "SPRING_SECURITY_CONTEXT";
|
|
5
|
+
declare const PRINCIPAL_NAME_INDEX_NAME = "org.springframework.session.FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME";
|
|
6
|
+
declare function resolveIndexesFor(session: Session): string | null;
|
|
7
|
+
|
|
8
|
+
export { PRINCIPAL_NAME_INDEX_NAME, SPRING_SECURITY_CONTEXT, resolveIndexesFor };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Session } from './types.js';
|
|
2
|
+
import '../core/index.js';
|
|
3
|
+
|
|
4
|
+
declare const SPRING_SECURITY_CONTEXT = "SPRING_SECURITY_CONTEXT";
|
|
5
|
+
declare const PRINCIPAL_NAME_INDEX_NAME = "org.springframework.session.FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME";
|
|
6
|
+
declare function resolveIndexesFor(session: Session): string | null;
|
|
7
|
+
|
|
8
|
+
export { PRINCIPAL_NAME_INDEX_NAME, SPRING_SECURITY_CONTEXT, resolveIndexesFor };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// src/session/common.ts
|
|
2
|
+
var SPRING_SECURITY_CONTEXT = "SPRING_SECURITY_CONTEXT";
|
|
3
|
+
var PRINCIPAL_NAME_INDEX_NAME = `org.springframework.session.FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME`;
|
|
4
|
+
function resolveIndexesFor(session) {
|
|
5
|
+
const principalName = session.getAttribute(PRINCIPAL_NAME_INDEX_NAME);
|
|
6
|
+
if (principalName !== null) return principalName;
|
|
7
|
+
const jsonString = session.getAttribute(SPRING_SECURITY_CONTEXT);
|
|
8
|
+
if (typeof jsonString === "string") {
|
|
9
|
+
const context = JSON.parse(jsonString);
|
|
10
|
+
return context?.authentication?.name ?? context.authentication?.principal?.name ?? null;
|
|
11
|
+
}
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
export {
|
|
15
|
+
PRINCIPAL_NAME_INDEX_NAME,
|
|
16
|
+
SPRING_SECURITY_CONTEXT,
|
|
17
|
+
resolveIndexesFor
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=common.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/session/common.ts"],"sourcesContent":["import type { Session, SecurityContext } from './types';\n\nexport const SPRING_SECURITY_CONTEXT = 'SPRING_SECURITY_CONTEXT';\nexport const PRINCIPAL_NAME_INDEX_NAME = `org.springframework.session.FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME`;\n\nexport function resolveIndexesFor(session: Session): string | null {\n const principalName = session.getAttribute(PRINCIPAL_NAME_INDEX_NAME) as string | null;\n if (principalName !== null) return principalName;\n\n const jsonString = session.getAttribute(SPRING_SECURITY_CONTEXT);\n if (typeof jsonString === 'string') {\n const context = JSON.parse(jsonString) as SecurityContext;\n return context?.authentication?.name ?? context.authentication?.principal?.name ?? null;\n }\n return null;\n}\n"],"mappings":";AAEO,IAAM,0BAA0B;AAChC,IAAM,4BAA4B;AAElC,SAAS,kBAAkB,SAAiC;AACjE,QAAM,gBAAgB,QAAQ,aAAa,yBAAyB;AACpE,MAAI,kBAAkB,KAAM,QAAO;AAEnC,QAAM,aAAa,QAAQ,aAAa,uBAAuB;AAC/D,MAAI,OAAO,eAAe,UAAU;AAClC,UAAM,UAAU,KAAK,MAAM,UAAU;AACrC,WAAO,SAAS,gBAAgB,QAAQ,QAAQ,gBAAgB,WAAW,QAAQ;AAAA,EACrF;AACA,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/session/db.ts
|
|
21
|
+
var db_exports = {};
|
|
22
|
+
__export(db_exports, {
|
|
23
|
+
DBIndexedSessionRepository: () => DBIndexedSessionRepository
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(db_exports);
|
|
26
|
+
var import_crypto = require("crypto");
|
|
27
|
+
var import_map_session = require("./map-session.cjs");
|
|
28
|
+
var import_common = require("./common.cjs");
|
|
29
|
+
var DBSession = class extends import_map_session.MapSession {
|
|
30
|
+
isNew;
|
|
31
|
+
primaryId;
|
|
32
|
+
constructor(cached, isNew) {
|
|
33
|
+
super(cached);
|
|
34
|
+
this.isNew = isNew;
|
|
35
|
+
this.primaryId = (0, import_crypto.randomUUID)();
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
var DBIndexedSessionRepository = class {
|
|
39
|
+
defaultMaxInactiveInterval = 1800;
|
|
40
|
+
db;
|
|
41
|
+
constructor(db) {
|
|
42
|
+
this.db = db;
|
|
43
|
+
}
|
|
44
|
+
setDefaultMaxInactiveInterval(interval) {
|
|
45
|
+
this.defaultMaxInactiveInterval = interval;
|
|
46
|
+
}
|
|
47
|
+
mapSessionToEntity(session) {
|
|
48
|
+
const attributes = /* @__PURE__ */ new Map();
|
|
49
|
+
for (const name of session.getAttributeNames()) {
|
|
50
|
+
attributes.set(name, session.getAttribute(name));
|
|
51
|
+
}
|
|
52
|
+
const principalName = (0, import_common.resolveIndexesFor)(session);
|
|
53
|
+
return {
|
|
54
|
+
primaryId: session.primaryId,
|
|
55
|
+
sessionId: session.getId(),
|
|
56
|
+
creationTime: session.getCreationTime(),
|
|
57
|
+
lastAccessTime: session.getLastAccessedTime(),
|
|
58
|
+
maxInactiveInterval: session.getMaxInactiveInterval(),
|
|
59
|
+
expiryTime: session.getLastAccessedTime() + session.getMaxInactiveInterval() * 1e3,
|
|
60
|
+
attributes,
|
|
61
|
+
principalName
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
mapEntityToSession(entity, allowExpired) {
|
|
65
|
+
const loaded = new import_map_session.MapSession(entity.sessionId);
|
|
66
|
+
loaded.setCreationTime(entity.creationTime);
|
|
67
|
+
loaded.setLastAccessedTime(entity.lastAccessTime);
|
|
68
|
+
loaded.setMaxInactiveInterval(entity.maxInactiveInterval);
|
|
69
|
+
for (const [key, value] of Object.entries(entity.attributes)) {
|
|
70
|
+
loaded.setAttribute(key, value);
|
|
71
|
+
}
|
|
72
|
+
if (!allowExpired && loaded.isExpired()) return null;
|
|
73
|
+
const session = new DBSession(loaded, false);
|
|
74
|
+
session.primaryId = entity.primaryId;
|
|
75
|
+
return session;
|
|
76
|
+
}
|
|
77
|
+
async getSession(id, allowExpired) {
|
|
78
|
+
const entity = await this.db.findById(id);
|
|
79
|
+
if (!entity) return null;
|
|
80
|
+
return this.mapEntityToSession(entity, allowExpired);
|
|
81
|
+
}
|
|
82
|
+
// override
|
|
83
|
+
createSession() {
|
|
84
|
+
const cached = new import_map_session.MapSession();
|
|
85
|
+
cached.setMaxInactiveInterval(this.defaultMaxInactiveInterval);
|
|
86
|
+
return new DBSession(cached, true);
|
|
87
|
+
}
|
|
88
|
+
async save(session) {
|
|
89
|
+
const entity = this.mapSessionToEntity(session);
|
|
90
|
+
await this.db.save(entity);
|
|
91
|
+
session.isNew = false;
|
|
92
|
+
}
|
|
93
|
+
async findById(sessionId) {
|
|
94
|
+
return this.getSession(sessionId, false);
|
|
95
|
+
}
|
|
96
|
+
async deleteById(sessionId) {
|
|
97
|
+
this.db.deleteById(sessionId);
|
|
98
|
+
}
|
|
99
|
+
async findByIndexNameAndIndexValue(indexName, indexValue) {
|
|
100
|
+
if (indexName !== import_common.PRINCIPAL_NAME_INDEX_NAME) {
|
|
101
|
+
return /* @__PURE__ */ new Map();
|
|
102
|
+
}
|
|
103
|
+
const entities = await this.db.findByPrincipalName(indexValue);
|
|
104
|
+
if (entities.length === 0) {
|
|
105
|
+
return /* @__PURE__ */ new Map();
|
|
106
|
+
}
|
|
107
|
+
const sessions = /* @__PURE__ */ new Map();
|
|
108
|
+
for (const entity of entities) {
|
|
109
|
+
const session = this.mapEntityToSession(entity, false);
|
|
110
|
+
if (session) {
|
|
111
|
+
sessions.set(session.getId(), session);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return sessions;
|
|
115
|
+
}
|
|
116
|
+
async findByPrincipalName(principalName) {
|
|
117
|
+
return this.findByIndexNameAndIndexValue(import_common.PRINCIPAL_NAME_INDEX_NAME, principalName);
|
|
118
|
+
}
|
|
119
|
+
async cleanupExpiredSessions(cleanupCount) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
124
|
+
0 && (module.exports = {
|
|
125
|
+
DBIndexedSessionRepository
|
|
126
|
+
});
|
|
127
|
+
//# sourceMappingURL=db.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/session/db.ts"],"sourcesContent":["import { randomUUID } from 'crypto';\nimport { MapSession } from './map-session';\nimport { PRINCIPAL_NAME_INDEX_NAME, resolveIndexesFor } from './common';\nimport type { SessionRepository } from './types';\n\ninterface SessionEntity {\n primaryId: string;\n sessionId: string;\n creationTime: number;\n lastAccessTime: number;\n maxInactiveInterval: number;\n expiryTime: number;\n attributes: Record<string, any>;\n principalName?: string | null;\n}\n\nclass DBSession extends MapSession {\n public isNew: boolean;\n public primaryId: string;\n\n constructor(cached: MapSession, isNew: boolean) {\n super(cached);\n this.isNew = isNew;\n this.primaryId = randomUUID();\n }\n}\n\nexport interface DBAdapter {\n save(session: SessionEntity): Promise<void>;\n deleteById(sessionId: string): Promise<void>;\n findById(sessionId: string): Promise<SessionEntity | null>;\n findByPrincipalName(principalName: string): Promise<SessionEntity[]>;\n}\n\nexport class DBIndexedSessionRepository implements SessionRepository<DBSession> {\n private defaultMaxInactiveInterval = 1800;\n private db: DBAdapter;\n\n constructor(db: DBAdapter) {\n this.db = db;\n }\n\n setDefaultMaxInactiveInterval(interval: number) {\n this.defaultMaxInactiveInterval = interval;\n }\n\n private mapSessionToEntity(session: DBSession): SessionEntity {\n const attributes = new Map<string, string | number | null>();\n for (const name of session.getAttributeNames()) {\n attributes.set(name, session.getAttribute(name));\n }\n const principalName = resolveIndexesFor(session);\n\n return {\n primaryId: session.primaryId,\n sessionId: session.getId(),\n creationTime: session.getCreationTime(),\n lastAccessTime: session.getLastAccessedTime(),\n maxInactiveInterval: session.getMaxInactiveInterval(),\n expiryTime: session.getLastAccessedTime() + session.getMaxInactiveInterval() * 1000,\n attributes,\n principalName,\n };\n }\n\n private mapEntityToSession(entity: SessionEntity, allowExpired: boolean): DBSession | null {\n const loaded = new MapSession(entity.sessionId);\n loaded.setCreationTime(entity.creationTime);\n loaded.setLastAccessedTime(entity.lastAccessTime);\n loaded.setMaxInactiveInterval(entity.maxInactiveInterval);\n for (const [key, value] of Object.entries(entity.attributes)) {\n loaded.setAttribute(key, value);\n }\n\n if (!allowExpired && loaded.isExpired()) return null;\n const session = new DBSession(loaded, false);\n session.primaryId = entity.primaryId;\n return session;\n }\n\n private async getSession(id: string, allowExpired: boolean): Promise<DBSession | null> {\n const entity = await this.db.findById(id);\n if (!entity) return null;\n return this.mapEntityToSession(entity, allowExpired);\n }\n\n // override\n createSession() {\n const cached = new MapSession();\n cached.setMaxInactiveInterval(this.defaultMaxInactiveInterval);\n return new DBSession(cached, true);\n }\n\n async save(session: DBSession) {\n const entity = this.mapSessionToEntity(session);\n await this.db.save(entity);\n session.isNew = false;\n }\n\n async findById(sessionId: string): Promise<DBSession | null> {\n return this.getSession(sessionId, false);\n }\n\n async deleteById(sessionId: string) {\n this.db.deleteById(sessionId);\n }\n\n async findByIndexNameAndIndexValue(\n indexName: string,\n indexValue: string\n ): Promise<Map<string, DBSession>> {\n if (indexName !== PRINCIPAL_NAME_INDEX_NAME) {\n return new Map<string, DBSession>();\n }\n const entities = await this.db.findByPrincipalName(indexValue);\n if (entities.length === 0) {\n return new Map<string, DBSession>();\n }\n const sessions = new Map<string, DBSession>();\n for (const entity of entities) {\n const session = this.mapEntityToSession(entity, false);\n if (session) {\n sessions.set(session.getId(), session);\n }\n }\n return sessions;\n }\n\n async findByPrincipalName(principalName: string): Promise<Map<string, DBSession>> {\n return this.findByIndexNameAndIndexValue(PRINCIPAL_NAME_INDEX_NAME, principalName);\n }\n\n async cleanupExpiredSessions(cleanupCount?: number): Promise<void> {\n return;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { MapSession } from './map-session.cjs';
|
|
2
|
+
import { SessionRepository } from './types.cjs';
|
|
3
|
+
import '../core/index.cjs';
|
|
4
|
+
|
|
5
|
+
interface SessionEntity {
|
|
6
|
+
primaryId: string;
|
|
7
|
+
sessionId: string;
|
|
8
|
+
creationTime: number;
|
|
9
|
+
lastAccessTime: number;
|
|
10
|
+
maxInactiveInterval: number;
|
|
11
|
+
expiryTime: number;
|
|
12
|
+
attributes: Record<string, any>;
|
|
13
|
+
principalName?: string | null;
|
|
14
|
+
}
|
|
15
|
+
declare class DBSession extends MapSession {
|
|
16
|
+
isNew: boolean;
|
|
17
|
+
primaryId: string;
|
|
18
|
+
constructor(cached: MapSession, isNew: boolean);
|
|
19
|
+
}
|
|
20
|
+
interface DBAdapter {
|
|
21
|
+
save(session: SessionEntity): Promise<void>;
|
|
22
|
+
deleteById(sessionId: string): Promise<void>;
|
|
23
|
+
findById(sessionId: string): Promise<SessionEntity | null>;
|
|
24
|
+
findByPrincipalName(principalName: string): Promise<SessionEntity[]>;
|
|
25
|
+
}
|
|
26
|
+
declare class DBIndexedSessionRepository implements SessionRepository<DBSession> {
|
|
27
|
+
private defaultMaxInactiveInterval;
|
|
28
|
+
private db;
|
|
29
|
+
constructor(db: DBAdapter);
|
|
30
|
+
setDefaultMaxInactiveInterval(interval: number): void;
|
|
31
|
+
private mapSessionToEntity;
|
|
32
|
+
private mapEntityToSession;
|
|
33
|
+
private getSession;
|
|
34
|
+
createSession(): DBSession;
|
|
35
|
+
save(session: DBSession): Promise<void>;
|
|
36
|
+
findById(sessionId: string): Promise<DBSession | null>;
|
|
37
|
+
deleteById(sessionId: string): Promise<void>;
|
|
38
|
+
findByIndexNameAndIndexValue(indexName: string, indexValue: string): Promise<Map<string, DBSession>>;
|
|
39
|
+
findByPrincipalName(principalName: string): Promise<Map<string, DBSession>>;
|
|
40
|
+
cleanupExpiredSessions(cleanupCount?: number): Promise<void>;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export { type DBAdapter, DBIndexedSessionRepository };
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { MapSession } from './map-session.js';
|
|
2
|
+
import { SessionRepository } from './types.js';
|
|
3
|
+
import '../core/index.js';
|
|
4
|
+
|
|
5
|
+
interface SessionEntity {
|
|
6
|
+
primaryId: string;
|
|
7
|
+
sessionId: string;
|
|
8
|
+
creationTime: number;
|
|
9
|
+
lastAccessTime: number;
|
|
10
|
+
maxInactiveInterval: number;
|
|
11
|
+
expiryTime: number;
|
|
12
|
+
attributes: Record<string, any>;
|
|
13
|
+
principalName?: string | null;
|
|
14
|
+
}
|
|
15
|
+
declare class DBSession extends MapSession {
|
|
16
|
+
isNew: boolean;
|
|
17
|
+
primaryId: string;
|
|
18
|
+
constructor(cached: MapSession, isNew: boolean);
|
|
19
|
+
}
|
|
20
|
+
interface DBAdapter {
|
|
21
|
+
save(session: SessionEntity): Promise<void>;
|
|
22
|
+
deleteById(sessionId: string): Promise<void>;
|
|
23
|
+
findById(sessionId: string): Promise<SessionEntity | null>;
|
|
24
|
+
findByPrincipalName(principalName: string): Promise<SessionEntity[]>;
|
|
25
|
+
}
|
|
26
|
+
declare class DBIndexedSessionRepository implements SessionRepository<DBSession> {
|
|
27
|
+
private defaultMaxInactiveInterval;
|
|
28
|
+
private db;
|
|
29
|
+
constructor(db: DBAdapter);
|
|
30
|
+
setDefaultMaxInactiveInterval(interval: number): void;
|
|
31
|
+
private mapSessionToEntity;
|
|
32
|
+
private mapEntityToSession;
|
|
33
|
+
private getSession;
|
|
34
|
+
createSession(): DBSession;
|
|
35
|
+
save(session: DBSession): Promise<void>;
|
|
36
|
+
findById(sessionId: string): Promise<DBSession | null>;
|
|
37
|
+
deleteById(sessionId: string): Promise<void>;
|
|
38
|
+
findByIndexNameAndIndexValue(indexName: string, indexValue: string): Promise<Map<string, DBSession>>;
|
|
39
|
+
findByPrincipalName(principalName: string): Promise<Map<string, DBSession>>;
|
|
40
|
+
cleanupExpiredSessions(cleanupCount?: number): Promise<void>;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export { type DBAdapter, DBIndexedSessionRepository };
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
// src/session/db.ts
|
|
2
|
+
import { randomUUID } from "crypto";
|
|
3
|
+
import { MapSession } from "./map-session.mjs";
|
|
4
|
+
import { PRINCIPAL_NAME_INDEX_NAME, resolveIndexesFor } from "./common.mjs";
|
|
5
|
+
var DBSession = class extends MapSession {
|
|
6
|
+
isNew;
|
|
7
|
+
primaryId;
|
|
8
|
+
constructor(cached, isNew) {
|
|
9
|
+
super(cached);
|
|
10
|
+
this.isNew = isNew;
|
|
11
|
+
this.primaryId = randomUUID();
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
var DBIndexedSessionRepository = class {
|
|
15
|
+
defaultMaxInactiveInterval = 1800;
|
|
16
|
+
db;
|
|
17
|
+
constructor(db) {
|
|
18
|
+
this.db = db;
|
|
19
|
+
}
|
|
20
|
+
setDefaultMaxInactiveInterval(interval) {
|
|
21
|
+
this.defaultMaxInactiveInterval = interval;
|
|
22
|
+
}
|
|
23
|
+
mapSessionToEntity(session) {
|
|
24
|
+
const attributes = /* @__PURE__ */ new Map();
|
|
25
|
+
for (const name of session.getAttributeNames()) {
|
|
26
|
+
attributes.set(name, session.getAttribute(name));
|
|
27
|
+
}
|
|
28
|
+
const principalName = resolveIndexesFor(session);
|
|
29
|
+
return {
|
|
30
|
+
primaryId: session.primaryId,
|
|
31
|
+
sessionId: session.getId(),
|
|
32
|
+
creationTime: session.getCreationTime(),
|
|
33
|
+
lastAccessTime: session.getLastAccessedTime(),
|
|
34
|
+
maxInactiveInterval: session.getMaxInactiveInterval(),
|
|
35
|
+
expiryTime: session.getLastAccessedTime() + session.getMaxInactiveInterval() * 1e3,
|
|
36
|
+
attributes,
|
|
37
|
+
principalName
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
mapEntityToSession(entity, allowExpired) {
|
|
41
|
+
const loaded = new MapSession(entity.sessionId);
|
|
42
|
+
loaded.setCreationTime(entity.creationTime);
|
|
43
|
+
loaded.setLastAccessedTime(entity.lastAccessTime);
|
|
44
|
+
loaded.setMaxInactiveInterval(entity.maxInactiveInterval);
|
|
45
|
+
for (const [key, value] of Object.entries(entity.attributes)) {
|
|
46
|
+
loaded.setAttribute(key, value);
|
|
47
|
+
}
|
|
48
|
+
if (!allowExpired && loaded.isExpired()) return null;
|
|
49
|
+
const session = new DBSession(loaded, false);
|
|
50
|
+
session.primaryId = entity.primaryId;
|
|
51
|
+
return session;
|
|
52
|
+
}
|
|
53
|
+
async getSession(id, allowExpired) {
|
|
54
|
+
const entity = await this.db.findById(id);
|
|
55
|
+
if (!entity) return null;
|
|
56
|
+
return this.mapEntityToSession(entity, allowExpired);
|
|
57
|
+
}
|
|
58
|
+
// override
|
|
59
|
+
createSession() {
|
|
60
|
+
const cached = new MapSession();
|
|
61
|
+
cached.setMaxInactiveInterval(this.defaultMaxInactiveInterval);
|
|
62
|
+
return new DBSession(cached, true);
|
|
63
|
+
}
|
|
64
|
+
async save(session) {
|
|
65
|
+
const entity = this.mapSessionToEntity(session);
|
|
66
|
+
await this.db.save(entity);
|
|
67
|
+
session.isNew = false;
|
|
68
|
+
}
|
|
69
|
+
async findById(sessionId) {
|
|
70
|
+
return this.getSession(sessionId, false);
|
|
71
|
+
}
|
|
72
|
+
async deleteById(sessionId) {
|
|
73
|
+
this.db.deleteById(sessionId);
|
|
74
|
+
}
|
|
75
|
+
async findByIndexNameAndIndexValue(indexName, indexValue) {
|
|
76
|
+
if (indexName !== PRINCIPAL_NAME_INDEX_NAME) {
|
|
77
|
+
return /* @__PURE__ */ new Map();
|
|
78
|
+
}
|
|
79
|
+
const entities = await this.db.findByPrincipalName(indexValue);
|
|
80
|
+
if (entities.length === 0) {
|
|
81
|
+
return /* @__PURE__ */ new Map();
|
|
82
|
+
}
|
|
83
|
+
const sessions = /* @__PURE__ */ new Map();
|
|
84
|
+
for (const entity of entities) {
|
|
85
|
+
const session = this.mapEntityToSession(entity, false);
|
|
86
|
+
if (session) {
|
|
87
|
+
sessions.set(session.getId(), session);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return sessions;
|
|
91
|
+
}
|
|
92
|
+
async findByPrincipalName(principalName) {
|
|
93
|
+
return this.findByIndexNameAndIndexValue(PRINCIPAL_NAME_INDEX_NAME, principalName);
|
|
94
|
+
}
|
|
95
|
+
async cleanupExpiredSessions(cleanupCount) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
export {
|
|
100
|
+
DBIndexedSessionRepository
|
|
101
|
+
};
|
|
102
|
+
//# sourceMappingURL=db.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/session/db.ts"],"sourcesContent":["import { randomUUID } from 'crypto';\nimport { MapSession } from './map-session';\nimport { PRINCIPAL_NAME_INDEX_NAME, resolveIndexesFor } from './common';\nimport type { SessionRepository } from './types';\n\ninterface SessionEntity {\n primaryId: string;\n sessionId: string;\n creationTime: number;\n lastAccessTime: number;\n maxInactiveInterval: number;\n expiryTime: number;\n attributes: Record<string, any>;\n principalName?: string | null;\n}\n\nclass DBSession extends MapSession {\n public isNew: boolean;\n public primaryId: string;\n\n constructor(cached: MapSession, isNew: boolean) {\n super(cached);\n this.isNew = isNew;\n this.primaryId = randomUUID();\n }\n}\n\nexport interface DBAdapter {\n save(session: SessionEntity): Promise<void>;\n deleteById(sessionId: string): Promise<void>;\n findById(sessionId: string): Promise<SessionEntity | null>;\n findByPrincipalName(principalName: string): Promise<SessionEntity[]>;\n}\n\nexport class DBIndexedSessionRepository implements SessionRepository<DBSession> {\n private defaultMaxInactiveInterval = 1800;\n private db: DBAdapter;\n\n constructor(db: DBAdapter) {\n this.db = db;\n }\n\n setDefaultMaxInactiveInterval(interval: number) {\n this.defaultMaxInactiveInterval = interval;\n }\n\n private mapSessionToEntity(session: DBSession): SessionEntity {\n const attributes = new Map<string, string | number | null>();\n for (const name of session.getAttributeNames()) {\n attributes.set(name, session.getAttribute(name));\n }\n const principalName = resolveIndexesFor(session);\n\n return {\n primaryId: session.primaryId,\n sessionId: session.getId(),\n creationTime: session.getCreationTime(),\n lastAccessTime: session.getLastAccessedTime(),\n maxInactiveInterval: session.getMaxInactiveInterval(),\n expiryTime: session.getLastAccessedTime() + session.getMaxInactiveInterval() * 1000,\n attributes,\n principalName,\n };\n }\n\n private mapEntityToSession(entity: SessionEntity, allowExpired: boolean): DBSession | null {\n const loaded = new MapSession(entity.sessionId);\n loaded.setCreationTime(entity.creationTime);\n loaded.setLastAccessedTime(entity.lastAccessTime);\n loaded.setMaxInactiveInterval(entity.maxInactiveInterval);\n for (const [key, value] of Object.entries(entity.attributes)) {\n loaded.setAttribute(key, value);\n }\n\n if (!allowExpired && loaded.isExpired()) return null;\n const session = new DBSession(loaded, false);\n session.primaryId = entity.primaryId;\n return session;\n }\n\n private async getSession(id: string, allowExpired: boolean): Promise<DBSession | null> {\n const entity = await this.db.findById(id);\n if (!entity) return null;\n return this.mapEntityToSession(entity, allowExpired);\n }\n\n // override\n createSession() {\n const cached = new MapSession();\n cached.setMaxInactiveInterval(this.defaultMaxInactiveInterval);\n return new DBSession(cached, true);\n }\n\n async save(session: DBSession) {\n const entity = this.mapSessionToEntity(session);\n await this.db.save(entity);\n session.isNew = false;\n }\n\n async findById(sessionId: string): Promise<DBSession | null> {\n return this.getSession(sessionId, false);\n }\n\n async deleteById(sessionId: string) {\n this.db.deleteById(sessionId);\n }\n\n async findByIndexNameAndIndexValue(\n indexName: string,\n indexValue: string\n ): Promise<Map<string, DBSession>> {\n if (indexName !== PRINCIPAL_NAME_INDEX_NAME) {\n return new Map<string, DBSession>();\n }\n const entities = await this.db.findByPrincipalName(indexValue);\n if (entities.length === 0) {\n return new Map<string, DBSession>();\n }\n const sessions = new Map<string, DBSession>();\n for (const entity of entities) {\n const session = this.mapEntityToSession(entity, false);\n if (session) {\n sessions.set(session.getId(), session);\n }\n }\n return sessions;\n }\n\n async findByPrincipalName(principalName: string): Promise<Map<string, DBSession>> {\n return this.findByIndexNameAndIndexValue(PRINCIPAL_NAME_INDEX_NAME, principalName);\n }\n\n async cleanupExpiredSessions(cleanupCount?: number): Promise<void> {\n return;\n }\n}\n"],"mappings":"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","names":[]}
|