nodecommons-esm-security 1.0.0 → 2.1.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.
@@ -1,12 +1,17 @@
1
+ import { CommonsFixedDuration } from 'tscommons-esm-core';
1
2
  import { ICommonsSession } from 'tscommons-esm-session';
2
3
  export declare abstract class CommonsSessionService<T> {
3
4
  private allowMultipleSessionsForSameUser;
5
+ private maximumLast?;
4
6
  private sessions;
5
- constructor(allowMultipleSessionsForSameUser?: boolean);
7
+ constructor(allowMultipleSessionsForSameUser?: boolean, maximumLast?: CommonsFixedDuration | undefined);
8
+ get activeSessions(): number;
6
9
  protected abstract isEqual(a: T, b: T): boolean;
7
10
  protected abstract isStillValid(data: T): Promise<boolean>;
8
11
  create(data: T): ICommonsSession<T>;
9
12
  destroy(session: ICommonsSession<T>): boolean;
10
13
  abort(data: T): boolean;
14
+ private cleanup;
15
+ touch(sid: string): boolean;
11
16
  validate(sid: string): Promise<ICommonsSession<T> | undefined>;
12
17
  }
@@ -1,23 +1,31 @@
1
+ import { CommonsFixedDate } from 'tscommons-esm-core';
1
2
  import { commonsHashRandomSha256 } from '../helpers/commons-hash.mjs';
2
3
  export class CommonsSessionService {
3
4
  allowMultipleSessionsForSameUser;
5
+ maximumLast;
4
6
  sessions = [];
5
- constructor(allowMultipleSessionsForSameUser = false) {
7
+ constructor(allowMultipleSessionsForSameUser = false, maximumLast) {
6
8
  this.allowMultipleSessionsForSameUser = allowMultipleSessionsForSameUser;
9
+ this.maximumLast = maximumLast;
10
+ }
11
+ get activeSessions() {
12
+ this.cleanup();
13
+ return this.sessions.length;
7
14
  }
8
15
  create(data) {
9
16
  if (!this.allowMultipleSessionsForSameUser)
10
17
  this.abort(data); // clear out any existing sessions for the same user
11
18
  const session = {
12
19
  sid: commonsHashRandomSha256(),
13
- start: new Date(),
14
- last: new Date(),
20
+ start: new CommonsFixedDate(),
21
+ last: new CommonsFixedDate(),
15
22
  data: data
16
23
  };
17
24
  this.sessions.push(session);
18
25
  return session;
19
26
  }
20
27
  destroy(session) {
28
+ this.cleanup();
21
29
  const match = this.sessions
22
30
  .find((s) => s.sid === session.sid);
23
31
  if (!match)
@@ -27,6 +35,7 @@ export class CommonsSessionService {
27
35
  return true;
28
36
  }
29
37
  abort(data) {
38
+ this.cleanup();
30
39
  const existing = this.sessions
31
40
  .find((s) => this.isEqual(data, s.data));
32
41
  if (!existing)
@@ -34,7 +43,26 @@ export class CommonsSessionService {
34
43
  this.destroy(existing);
35
44
  return true;
36
45
  }
46
+ cleanup() {
47
+ if (!this.maximumLast)
48
+ return;
49
+ const expirationThreshold = new CommonsFixedDate();
50
+ expirationThreshold.subtract(this.maximumLast);
51
+ for (const session of [...this.sessions]) {
52
+ if (session.last.isLessThan(expirationThreshold))
53
+ this.destroy(session);
54
+ }
55
+ }
56
+ touch(sid) {
57
+ const session = this.sessions
58
+ .find((s) => s.sid === sid);
59
+ if (!session)
60
+ return false;
61
+ session.last = new CommonsFixedDate();
62
+ return true;
63
+ }
37
64
  async validate(sid) {
65
+ this.cleanup();
38
66
  const session = this.sessions
39
67
  .find((s) => s.sid === sid);
40
68
  if (!session)
@@ -43,6 +71,7 @@ export class CommonsSessionService {
43
71
  this.destroy(session);
44
72
  return undefined;
45
73
  }
74
+ session.last = new CommonsFixedDate();
46
75
  return session;
47
76
  }
48
77
  }
@@ -1 +1 @@
1
- {"version":3,"file":"commons-session.service.mjs","sourceRoot":"","sources":["../../src/services/commons-session.service.mts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,MAAM,OAAgB,qBAAqB;IAIhC;IAHF,QAAQ,GAAyB,EAAE,CAAC;IAE5C,YACU,mCAA4C,KAAK;QAAjD,qCAAgC,GAAhC,gCAAgC,CAAiB;IACxD,CAAC;IAKG,MAAM,CAAC,IAAO;QACpB,IAAI,CAAC,IAAI,CAAC,gCAAgC;YAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,oDAAoD;QAElH,MAAM,OAAO,GAAuB;YAClC,GAAG,EAAE,uBAAuB,EAAE;YAC9B,KAAK,EAAE,IAAI,IAAI,EAAE;YACjB,IAAI,EAAE,IAAI,IAAI,EAAE;YAChB,IAAI,EAAE,IAAI;SACX,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE5B,OAAO,OAAO,CAAC;IAChB,CAAC;IAEM,OAAO,CAAC,OAA2B;QACzC,MAAM,KAAK,GAAiC,IAAI,CAAC,QAAQ;aACtD,IAAI,CAAC,CAAC,CAAqB,EAAW,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;QACnE,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QAEzB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ;aAC1B,MAAM,CAAC,CAAC,CAAqB,EAAW,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;QAErE,OAAO,IAAI,CAAC;IACb,CAAC;IAEM,KAAK,CAAC,IAAO;QACnB,MAAM,QAAQ,GAAiC,IAAI,CAAC,QAAQ;aACzD,IAAI,CAAC,CAAC,CAAqB,EAAW,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QAE5B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACb,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,GAAW;QAChC,MAAM,OAAO,GAAiC,IAAI,CAAC,QAAQ;aACxD,IAAI,CAAC,CAAC,CAAqB,EAAW,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;QAE3D,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QAE/B,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC9C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,OAAO,OAAO,CAAC;IAChB,CAAC;CACD"}
1
+ {"version":3,"file":"commons-session.service.mjs","sourceRoot":"","sources":["../../src/services/commons-session.service.mts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nodecommons-esm-security",
3
- "version": "1.0.0",
3
+ "version": "2.1.0",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "tsc": "./node_modules/typescript/bin/tsc",
@@ -26,7 +26,7 @@
26
26
  "dist/**/*"
27
27
  ],
28
28
  "dependencies": {
29
- "tscommons-esm-core": "^1.0.1",
30
- "tscommons-esm-session": "^1.0.0"
29
+ "tscommons-esm-core": "^1.0.2",
30
+ "tscommons-esm-session": "^2.0.1"
31
31
  }
32
32
  }