@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.
Files changed (54) hide show
  1. package/README.md +48 -0
  2. package/dist/auth/index.cjs +19 -10
  3. package/dist/auth/index.cjs.map +1 -1
  4. package/dist/auth/index.d.cts +5 -2
  5. package/dist/auth/index.d.ts +5 -2
  6. package/dist/auth/index.mjs +16 -7
  7. package/dist/auth/index.mjs.map +1 -1
  8. package/dist/auth/types.cjs.map +1 -1
  9. package/dist/auth/types.d.cts +3 -2
  10. package/dist/auth/types.d.ts +3 -2
  11. package/dist/index.cjs +9 -3
  12. package/dist/index.cjs.map +1 -1
  13. package/dist/index.d.cts +9 -6
  14. package/dist/index.d.ts +9 -6
  15. package/dist/index.mjs +6 -2
  16. package/dist/index.mjs.map +1 -1
  17. package/dist/session/__test__/redis.test.cjs +5 -4
  18. package/dist/session/__test__/redis.test.cjs.map +1 -1
  19. package/dist/session/__test__/redis.test.mjs +3 -2
  20. package/dist/session/__test__/redis.test.mjs.map +1 -1
  21. package/dist/session/common.cjs +46 -0
  22. package/dist/session/common.cjs.map +1 -0
  23. package/dist/session/common.d.cts +8 -0
  24. package/dist/session/common.d.ts +8 -0
  25. package/dist/session/common.mjs +19 -0
  26. package/dist/session/common.mjs.map +1 -0
  27. package/dist/session/db.cjs +127 -0
  28. package/dist/session/db.cjs.map +1 -0
  29. package/dist/session/db.d.cts +43 -0
  30. package/dist/session/db.d.ts +43 -0
  31. package/dist/session/db.mjs +102 -0
  32. package/dist/session/db.mjs.map +1 -0
  33. package/dist/session/map-session.cjs +108 -0
  34. package/dist/session/map-session.cjs.map +1 -0
  35. package/dist/session/map-session.d.cts +27 -0
  36. package/dist/session/map-session.d.ts +27 -0
  37. package/dist/session/map-session.mjs +83 -0
  38. package/dist/session/map-session.mjs.map +1 -0
  39. package/dist/session/redis.cjs +32 -128
  40. package/dist/session/redis.cjs.map +1 -1
  41. package/dist/session/redis.d.cts +11 -30
  42. package/dist/session/redis.d.ts +11 -30
  43. package/dist/session/redis.mjs +20 -116
  44. package/dist/session/redis.mjs.map +1 -1
  45. package/dist/session/types.cjs.map +1 -1
  46. package/dist/session/types.d.cts +6 -4
  47. package/dist/session/types.d.ts +6 -4
  48. package/package.json +1 -1
  49. package/dist/session/index.cjs +0 -33
  50. package/dist/session/index.cjs.map +0 -1
  51. package/dist/session/index.d.cts +0 -4
  52. package/dist/session/index.d.ts +0 -4
  53. package/dist/session/index.mjs +0 -10
  54. package/dist/session/index.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { Auth } from './auth/index';\nexport { OAuth2Client, oauth2RedirectQuerySchema } from './oauth2/client';\nexport { RedisSessionRepository, PRINCIPAL_NAME_INDEX_NAME } from './session/redis';\n\nexport type { Namespace, SessionRepository } from './session/types';\nexport type { StandardClaims, OAuth2Token, UserInfo, OidcToken, OidcScopes } from './oauth2/types';\nexport type { Principal } from './core/index';\n"],"mappings":";AAAA,SAAS,YAAY;AACrB,SAAS,cAAc,iCAAiC;AACxD,SAAS,wBAAwB,iCAAiC;","names":[]}
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.RedisSessionRepository(redis, "myapp:session");
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(import_redis.PRINCIPAL_NAME_INDEX_NAME, principalName);
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(import_redis.PRINCIPAL_NAME_INDEX_NAME)).toBe(principalName);
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(import_redis.PRINCIPAL_NAME_INDEX_NAME, "user_123");
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, RedisSessionRepository } 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 RedisSessionRepository(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,mBAAkE;AAGlE,IAAM,QAAQ,IAAI,eAAAA,QAAM,uCAAuC;AAC/D,IAAM,aAAa,IAAI,oCAAuB,OAAO,eAAe;AAEpE,SAAS,sBAAsB,MAAM;AACnC,QAAM,gBAAgB;AAEtB,OAAK,2BAA2B,YAAY;AAC1C,UAAM,UAAU,WAAW,cAAc;AACzC,UAAM,YAAY,QAAQ,MAAM;AAChC,YAAQ,aAAa,wCAA2B,aAAa;AAC7D,UAAM,WAAW,KAAK,OAAO;AAC7B,UAAM,eAAe,MAAM,WAAW,SAAS,SAAS;AACxD,WAAO,cAAc,aAAa,sCAAyB,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,wCAA2B,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
+ {"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, RedisSessionRepository } from "../redis.mjs";
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 RedisSessionRepository(redis, "myapp:session");
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, RedisSessionRepository } 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 RedisSessionRepository(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,2BAA2B,8BAA8B;AAGlE,IAAM,QAAQ,IAAI,MAAM,uCAAuC;AAC/D,IAAM,aAAa,IAAI,uBAAuB,OAAO,eAAe;AAEpE,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":[]}
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":[]}