@spinajs/rbac 2.0.481 → 2.0.484
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/lib/cjs/actions.d.ts.map +1 -1
- package/lib/cjs/actions.js +38 -7
- package/lib/cjs/actions.js.map +1 -1
- package/lib/cjs/auth.d.ts.map +1 -1
- package/lib/cjs/auth.js +8 -4
- package/lib/cjs/auth.js.map +1 -1
- package/lib/cjs/cli/ActivateUser.js +1 -1
- package/lib/cjs/cli/ActivateUser.js.map +1 -1
- package/lib/cjs/cli/BanUser.js +1 -1
- package/lib/cjs/cli/BanUser.js.map +1 -1
- package/lib/cjs/config/rbac.d.ts +11 -1
- package/lib/cjs/config/rbac.d.ts.map +1 -1
- package/lib/cjs/config/rbac.js +12 -3
- package/lib/cjs/config/rbac.js.map +1 -1
- package/lib/cjs/cron/DeactivatePasswords.d.ts.map +1 -1
- package/lib/cjs/cron/DeactivatePasswords.js +6 -2
- package/lib/cjs/cron/DeactivatePasswords.js.map +1 -1
- package/lib/cjs/index.d.ts +6 -0
- package/lib/cjs/index.d.ts.map +1 -1
- package/lib/cjs/index.js +6 -0
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/interfaces.d.ts +87 -37
- package/lib/cjs/interfaces.d.ts.map +1 -1
- package/lib/cjs/interfaces.js +47 -1
- package/lib/cjs/interfaces.js.map +1 -1
- package/lib/cjs/middleware.d.ts +24 -1
- package/lib/cjs/middleware.d.ts.map +1 -1
- package/lib/cjs/middleware.js +204 -104
- package/lib/cjs/middleware.js.map +1 -1
- package/lib/cjs/models/User.d.ts.map +1 -1
- package/lib/cjs/models/User.js +23 -4
- package/lib/cjs/models/User.js.map +1 -1
- package/lib/cjs/models/UserMetadata.d.ts.map +1 -1
- package/lib/cjs/models/UserMetadata.js +6 -0
- package/lib/cjs/models/UserMetadata.js.map +1 -1
- package/lib/cjs/ownership.d.ts +2 -0
- package/lib/cjs/ownership.d.ts.map +1 -0
- package/lib/cjs/ownership.js +46 -0
- package/lib/cjs/ownership.js.map +1 -0
- package/lib/cjs/session-codec.d.ts +15 -0
- package/lib/cjs/session-codec.d.ts.map +1 -0
- package/lib/cjs/session-codec.js +59 -0
- package/lib/cjs/session-codec.js.map +1 -0
- package/lib/cjs/session-expiration.d.ts +40 -0
- package/lib/cjs/session-expiration.d.ts.map +1 -0
- package/lib/cjs/session-expiration.js +93 -0
- package/lib/cjs/session-expiration.js.map +1 -0
- package/lib/cjs/session.d.ts +38 -18
- package/lib/cjs/session.d.ts.map +1 -1
- package/lib/cjs/session.js +91 -50
- package/lib/cjs/session.js.map +1 -1
- package/lib/mjs/actions.d.ts.map +1 -1
- package/lib/mjs/actions.js +38 -7
- package/lib/mjs/actions.js.map +1 -1
- package/lib/mjs/auth.d.ts.map +1 -1
- package/lib/mjs/auth.js +8 -4
- package/lib/mjs/auth.js.map +1 -1
- package/lib/mjs/cli/ActivateUser.js +1 -1
- package/lib/mjs/cli/ActivateUser.js.map +1 -1
- package/lib/mjs/cli/BanUser.js +1 -1
- package/lib/mjs/cli/BanUser.js.map +1 -1
- package/lib/mjs/config/rbac.d.ts +11 -1
- package/lib/mjs/config/rbac.d.ts.map +1 -1
- package/lib/mjs/config/rbac.js +12 -3
- package/lib/mjs/config/rbac.js.map +1 -1
- package/lib/mjs/cron/DeactivatePasswords.d.ts.map +1 -1
- package/lib/mjs/cron/DeactivatePasswords.js +6 -2
- package/lib/mjs/cron/DeactivatePasswords.js.map +1 -1
- package/lib/mjs/index.d.ts +6 -0
- package/lib/mjs/index.d.ts.map +1 -1
- package/lib/mjs/index.js +6 -0
- package/lib/mjs/index.js.map +1 -1
- package/lib/mjs/interfaces.d.ts +87 -37
- package/lib/mjs/interfaces.d.ts.map +1 -1
- package/lib/mjs/interfaces.js +45 -0
- package/lib/mjs/interfaces.js.map +1 -1
- package/lib/mjs/middleware.d.ts +24 -1
- package/lib/mjs/middleware.d.ts.map +1 -1
- package/lib/mjs/middleware.js +204 -104
- package/lib/mjs/middleware.js.map +1 -1
- package/lib/mjs/models/User.d.ts.map +1 -1
- package/lib/mjs/models/User.js +24 -5
- package/lib/mjs/models/User.js.map +1 -1
- package/lib/mjs/models/UserMetadata.d.ts.map +1 -1
- package/lib/mjs/models/UserMetadata.js +6 -0
- package/lib/mjs/models/UserMetadata.js.map +1 -1
- package/lib/mjs/ownership.d.ts +2 -0
- package/lib/mjs/ownership.d.ts.map +1 -0
- package/lib/mjs/ownership.js +44 -0
- package/lib/mjs/ownership.js.map +1 -0
- package/lib/mjs/session-codec.d.ts +15 -0
- package/lib/mjs/session-codec.d.ts.map +1 -0
- package/lib/mjs/session-codec.js +55 -0
- package/lib/mjs/session-codec.js.map +1 -0
- package/lib/mjs/session-expiration.d.ts +40 -0
- package/lib/mjs/session-expiration.d.ts.map +1 -0
- package/lib/mjs/session-expiration.js +90 -0
- package/lib/mjs/session-expiration.js.map +1 -0
- package/lib/mjs/session.d.ts +38 -18
- package/lib/mjs/session.d.ts.map +1 -1
- package/lib/mjs/session.js +89 -47
- package/lib/mjs/session.js.map +1 -1
- package/lib/tsconfig.cjs.tsbuildinfo +1 -1
- package/lib/tsconfig.mjs.tsbuildinfo +1 -1
- package/package.json +15 -12
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ownership.js","sourceRoot":"","sources":["../../src/ownership.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,sBAAsB,EAAE,OAAO,EAAgF,MAAM,cAAc,CAAC;AAItK;;;;;;;;GAQG;AAEH,SAAS,cAAc,CAAC,KAAc;IACpC,MAAM,UAAU,GAAG,sBAAsB,CAAC,KAAY,CAAyB,CAAC;IAEhF,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,UAAU,EAAE,IAAI,IAAK,KAAa,EAAE,IAAI,CAAC;QACtD,MAAM,IAAI,YAAY,CAAC,SAAS,IAAI,kEAAkE,CAAC,CAAC;IAC1G,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACF,SAAqD,CAAC,eAAe,GAAG,UAEvE,KAAqF,EACrF,IAAU;IAEV,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACxC,OAAQ,KAAa,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;AAC3E,CAAC,CAAC;AAEF;;;;GAIG;AACF,SAAoD,CAAC,cAAc,GAAG,KAAK,WAE1E,iBAAmD,EACnD,IAAU;IAEV,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAExC,IAAI,iBAAiB,YAAY,SAAS,EAAE,CAAC;QAC3C,OAAQ,iBAAyB,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,eAAe,CAAC;IACpF,CAAC;IAED,0FAA0F;IAC1F,wFAAwF;IACxF,0FAA0F;IAC1F,MAAM,KAAK,GAAI,IAAY,CAAC,KAAK,EAAE,CAAC;IACpC,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,iBAAiB,CAAC,CAAC;IAE9C,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,KAAK,EAAE,CAAC;IAErF,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC;AAC/C,CAAC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Serializes a session `Data` map to a JSON string, preserving `Map` / `Set` /
|
|
3
|
+
* `DateTime` values.
|
|
4
|
+
*
|
|
5
|
+
* @param data - the session data map
|
|
6
|
+
*/
|
|
7
|
+
export declare function encodeSessionData(data: Map<string, unknown>): string;
|
|
8
|
+
/**
|
|
9
|
+
* Restores a session `Data` map from a JSON string produced by
|
|
10
|
+
* {@link encodeSessionData}.
|
|
11
|
+
*
|
|
12
|
+
* @param json - the serialized session data
|
|
13
|
+
*/
|
|
14
|
+
export declare function decodeSessionData(json: string): Map<string, unknown>;
|
|
15
|
+
//# sourceMappingURL=session-codec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-codec.d.ts","sourceRoot":"","sources":["../../src/session-codec.ts"],"names":[],"mappings":"AAwCA;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAEpE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAGpE"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { DateTime } from 'luxon';
|
|
2
|
+
import { replacer as baseReplacer, reviver as baseReviver } from '@spinajs/util';
|
|
3
|
+
/**
|
|
4
|
+
* Shared session-data serialization codec (fixes B5 — symmetric write/read).
|
|
5
|
+
*
|
|
6
|
+
* Persistent session stores (db / dynamodb / redis) use this pair so the
|
|
7
|
+
* `replacer` used on write and the `reviver` used on read are symmetric and
|
|
8
|
+
* structural types survive the round-trip:
|
|
9
|
+
* - `Map` / `Set` via the shared @spinajs/util replacer/reviver,
|
|
10
|
+
* - luxon `DateTime` via a tagged wrapper.
|
|
11
|
+
*
|
|
12
|
+
* The in-memory store keeps live objects and does not use this codec.
|
|
13
|
+
*/
|
|
14
|
+
const DATETIME_TAG = 'DateTime';
|
|
15
|
+
/**
|
|
16
|
+
* `JSON.stringify` replacer. Must read the RAW value from the holder (`this`)
|
|
17
|
+
* because luxon's `DateTime.prototype.toJSON` would otherwise stringify the
|
|
18
|
+
* DateTime to an ISO string before we can tag it.
|
|
19
|
+
*/
|
|
20
|
+
function sessionReplacer(key, value) {
|
|
21
|
+
const raw = this[key];
|
|
22
|
+
if (raw instanceof DateTime) {
|
|
23
|
+
return { dataType: DATETIME_TAG, value: raw.toISO() };
|
|
24
|
+
}
|
|
25
|
+
return baseReplacer(key, value);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* `JSON.parse` reviver paired with {@link sessionReplacer}.
|
|
29
|
+
*/
|
|
30
|
+
function sessionReviver(key, value) {
|
|
31
|
+
if (value && typeof value === 'object' && value.dataType === DATETIME_TAG) {
|
|
32
|
+
return DateTime.fromISO(value.value);
|
|
33
|
+
}
|
|
34
|
+
return baseReviver(key, value);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Serializes a session `Data` map to a JSON string, preserving `Map` / `Set` /
|
|
38
|
+
* `DateTime` values.
|
|
39
|
+
*
|
|
40
|
+
* @param data - the session data map
|
|
41
|
+
*/
|
|
42
|
+
export function encodeSessionData(data) {
|
|
43
|
+
return JSON.stringify({ dataType: 'Map', value: Array.from(data.entries()) }, sessionReplacer);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Restores a session `Data` map from a JSON string produced by
|
|
47
|
+
* {@link encodeSessionData}.
|
|
48
|
+
*
|
|
49
|
+
* @param json - the serialized session data
|
|
50
|
+
*/
|
|
51
|
+
export function decodeSessionData(json) {
|
|
52
|
+
const parsed = JSON.parse(json, sessionReviver);
|
|
53
|
+
return parsed instanceof Map ? parsed : new Map();
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=session-codec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-codec.js","sourceRoot":"","sources":["../../src/session-codec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,OAAO,IAAI,WAAW,EAAmB,MAAM,eAAe,CAAC;AAElG;;;;;;;;;;GAUG;AAEH,MAAM,YAAY,GAAG,UAAU,CAAC;AAEhC;;;;GAIG;AACH,SAAS,eAAe,CAAgC,GAAW,EAAE,KAAc;IACjF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACtB,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;QAC5B,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC;IACxD,CAAC;IACD,OAAO,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,GAAW,EAAE,KAAgC;IACnE,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAK,KAAyB,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC/F,OAAO,QAAQ,CAAC,OAAO,CAAE,KAAyB,CAAC,KAAe,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,WAAW,CAAC,GAAG,EAAE,KAAwB,CAAC,CAAC;AACpD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAA0B;IAC1D,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;AACjG,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAChD,OAAO,MAAM,YAAY,GAAG,CAAC,CAAC,CAAE,MAA+B,CAAC,CAAC,CAAC,IAAI,GAAG,EAAmB,CAAC;AAC/F,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { DateTime } from 'luxon';
|
|
2
|
+
import { ISession, SessionExpirationProvider } from './interfaces.js';
|
|
3
|
+
/**
|
|
4
|
+
* Absolute expiration: the session dies at a fixed instant from creation and is
|
|
5
|
+
* never extended. `touch` is therefore a no-op (renew returns the current
|
|
6
|
+
* Expiration unchanged).
|
|
7
|
+
*
|
|
8
|
+
* Settings: `rbac.session.expiration.ttl` (minutes).
|
|
9
|
+
*/
|
|
10
|
+
export declare class AbsoluteExpiration extends SessionExpirationProvider {
|
|
11
|
+
protected Ttl: number;
|
|
12
|
+
initial(session: ISession): DateTime | undefined;
|
|
13
|
+
renew(session: ISession): DateTime | undefined;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Sliding expiration: every renewal pushes the expiration to `now + ttl`, with
|
|
17
|
+
* no upper bound. Activity keeps the session alive indefinitely.
|
|
18
|
+
*
|
|
19
|
+
* Settings: `rbac.session.expiration.ttl` (minutes).
|
|
20
|
+
*/
|
|
21
|
+
export declare class SlidingExpiration extends SessionExpirationProvider {
|
|
22
|
+
protected Ttl: number;
|
|
23
|
+
initial(_session: ISession): DateTime | undefined;
|
|
24
|
+
renew(_session: ISession): DateTime | undefined;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Sliding expiration with an absolute cap: renewal pushes the expiration to
|
|
28
|
+
* `now + ttl` but never past `Creation + maxLifetime`. Combines idle timeout
|
|
29
|
+
* with a hard session lifetime ceiling.
|
|
30
|
+
*
|
|
31
|
+
* Settings: `rbac.session.expiration.ttl` and
|
|
32
|
+
* `rbac.session.expiration.maxLifetime` (both minutes).
|
|
33
|
+
*/
|
|
34
|
+
export declare class SlidingCappedExpiration extends SessionExpirationProvider {
|
|
35
|
+
protected Ttl: number;
|
|
36
|
+
protected MaxLifetime: number;
|
|
37
|
+
initial(_session: ISession): DateTime | undefined;
|
|
38
|
+
renew(session: ISession): DateTime | undefined;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=session-expiration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-expiration.d.ts","sourceRoot":"","sources":["../../src/session-expiration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGjC,OAAO,EAAE,QAAQ,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAEtE;;;;;;GAMG;AACH,qBACa,kBAAmB,SAAQ,yBAAyB;IAE/D,SAAS,CAAC,GAAG,EAAG,MAAM,CAAC;IAEhB,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS;IAIhD,KAAK,CAAC,OAAO,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS;CAItD;AAED;;;;;GAKG;AACH,qBACa,iBAAkB,SAAQ,yBAAyB;IAE9D,SAAS,CAAC,GAAG,EAAG,MAAM,CAAC;IAEhB,OAAO,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS;IAIjD,KAAK,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS;CAGvD;AAED;;;;;;;GAOG;AACH,qBACa,uBAAwB,SAAQ,yBAAyB;IAEpE,SAAS,CAAC,GAAG,EAAG,MAAM,CAAC;IAGvB,SAAS,CAAC,WAAW,EAAG,MAAM,CAAC;IAExB,OAAO,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS;IAIjD,KAAK,CAAC,OAAO,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS;CAKtD"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { DateTime } from 'luxon';
|
|
11
|
+
import { Injectable } from '@spinajs/di';
|
|
12
|
+
import { Config } from '@spinajs/configuration';
|
|
13
|
+
import { SessionExpirationProvider } from './interfaces.js';
|
|
14
|
+
/**
|
|
15
|
+
* Absolute expiration: the session dies at a fixed instant from creation and is
|
|
16
|
+
* never extended. `touch` is therefore a no-op (renew returns the current
|
|
17
|
+
* Expiration unchanged).
|
|
18
|
+
*
|
|
19
|
+
* Settings: `rbac.session.expiration.ttl` (minutes).
|
|
20
|
+
*/
|
|
21
|
+
let AbsoluteExpiration = class AbsoluteExpiration extends SessionExpirationProvider {
|
|
22
|
+
initial(session) {
|
|
23
|
+
return session.Creation.plus({ minutes: this.Ttl });
|
|
24
|
+
}
|
|
25
|
+
renew(session) {
|
|
26
|
+
// no slide — keep whatever absolute instant was set at creation
|
|
27
|
+
return session.Expiration;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
__decorate([
|
|
31
|
+
Config('rbac.session.expiration.ttl', { defaultValue: 120 }),
|
|
32
|
+
__metadata("design:type", Number)
|
|
33
|
+
], AbsoluteExpiration.prototype, "Ttl", void 0);
|
|
34
|
+
AbsoluteExpiration = __decorate([
|
|
35
|
+
Injectable(SessionExpirationProvider)
|
|
36
|
+
], AbsoluteExpiration);
|
|
37
|
+
export { AbsoluteExpiration };
|
|
38
|
+
/**
|
|
39
|
+
* Sliding expiration: every renewal pushes the expiration to `now + ttl`, with
|
|
40
|
+
* no upper bound. Activity keeps the session alive indefinitely.
|
|
41
|
+
*
|
|
42
|
+
* Settings: `rbac.session.expiration.ttl` (minutes).
|
|
43
|
+
*/
|
|
44
|
+
let SlidingExpiration = class SlidingExpiration extends SessionExpirationProvider {
|
|
45
|
+
initial(_session) {
|
|
46
|
+
return DateTime.now().plus({ minutes: this.Ttl });
|
|
47
|
+
}
|
|
48
|
+
renew(_session) {
|
|
49
|
+
return DateTime.now().plus({ minutes: this.Ttl });
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
__decorate([
|
|
53
|
+
Config('rbac.session.expiration.ttl', { defaultValue: 120 }),
|
|
54
|
+
__metadata("design:type", Number)
|
|
55
|
+
], SlidingExpiration.prototype, "Ttl", void 0);
|
|
56
|
+
SlidingExpiration = __decorate([
|
|
57
|
+
Injectable(SessionExpirationProvider)
|
|
58
|
+
], SlidingExpiration);
|
|
59
|
+
export { SlidingExpiration };
|
|
60
|
+
/**
|
|
61
|
+
* Sliding expiration with an absolute cap: renewal pushes the expiration to
|
|
62
|
+
* `now + ttl` but never past `Creation + maxLifetime`. Combines idle timeout
|
|
63
|
+
* with a hard session lifetime ceiling.
|
|
64
|
+
*
|
|
65
|
+
* Settings: `rbac.session.expiration.ttl` and
|
|
66
|
+
* `rbac.session.expiration.maxLifetime` (both minutes).
|
|
67
|
+
*/
|
|
68
|
+
let SlidingCappedExpiration = class SlidingCappedExpiration extends SessionExpirationProvider {
|
|
69
|
+
initial(_session) {
|
|
70
|
+
return DateTime.now().plus({ minutes: this.Ttl });
|
|
71
|
+
}
|
|
72
|
+
renew(session) {
|
|
73
|
+
const slide = DateTime.now().plus({ minutes: this.Ttl });
|
|
74
|
+
const cap = session.Creation.plus({ minutes: this.MaxLifetime });
|
|
75
|
+
return slide < cap ? slide : cap;
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
__decorate([
|
|
79
|
+
Config('rbac.session.expiration.ttl', { defaultValue: 120 }),
|
|
80
|
+
__metadata("design:type", Number)
|
|
81
|
+
], SlidingCappedExpiration.prototype, "Ttl", void 0);
|
|
82
|
+
__decorate([
|
|
83
|
+
Config('rbac.session.expiration.maxLifetime', { defaultValue: 1440 }),
|
|
84
|
+
__metadata("design:type", Number)
|
|
85
|
+
], SlidingCappedExpiration.prototype, "MaxLifetime", void 0);
|
|
86
|
+
SlidingCappedExpiration = __decorate([
|
|
87
|
+
Injectable(SessionExpirationProvider)
|
|
88
|
+
], SlidingCappedExpiration);
|
|
89
|
+
export { SlidingCappedExpiration };
|
|
90
|
+
//# sourceMappingURL=session-expiration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-expiration.js","sourceRoot":"","sources":["../../src/session-expiration.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAY,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAEtE;;;;;;GAMG;AAEI,IAAM,kBAAkB,GAAxB,MAAM,kBAAmB,SAAQ,yBAAyB;IAIxD,OAAO,CAAC,OAAiB;QAC9B,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACtD,CAAC;IAEM,KAAK,CAAC,OAAiB;QAC5B,gEAAgE;QAChE,OAAO,OAAO,CAAC,UAAU,CAAC;IAC5B,CAAC;CACF,CAAA;AAVW;IADT,MAAM,CAAC,6BAA6B,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC;;+CACtC;AAFZ,kBAAkB;IAD9B,UAAU,CAAC,yBAAyB,CAAC;GACzB,kBAAkB,CAY9B;;AAED;;;;;GAKG;AAEI,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,yBAAyB;IAIvD,OAAO,CAAC,QAAkB;QAC/B,OAAO,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACpD,CAAC;IAEM,KAAK,CAAC,QAAkB;QAC7B,OAAO,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACpD,CAAC;CACF,CAAA;AATW;IADT,MAAM,CAAC,6BAA6B,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC;;8CACtC;AAFZ,iBAAiB;IAD7B,UAAU,CAAC,yBAAyB,CAAC;GACzB,iBAAiB,CAW7B;;AAED;;;;;;;GAOG;AAEI,IAAM,uBAAuB,GAA7B,MAAM,uBAAwB,SAAQ,yBAAyB;IAO7D,OAAO,CAAC,QAAkB;QAC/B,OAAO,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACpD,CAAC;IAEM,KAAK,CAAC,OAAiB;QAC5B,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACjE,OAAO,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;IACnC,CAAC;CACF,CAAA;AAdW;IADT,MAAM,CAAC,6BAA6B,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC;;oDACtC;AAGb;IADT,MAAM,CAAC,qCAAqC,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;;4DACvC;AALpB,uBAAuB;IADnC,UAAU,CAAC,yBAAyB,CAAC;GACzB,uBAAuB,CAgBnC"}
|
package/lib/mjs/session.d.ts
CHANGED
|
@@ -1,40 +1,60 @@
|
|
|
1
1
|
import { DateTime } from 'luxon';
|
|
2
2
|
import { SessionProvider, ISession } from './interfaces.js';
|
|
3
|
-
import { User } from './models/User.js';
|
|
4
3
|
/**
|
|
5
4
|
* Session base class
|
|
6
5
|
*/
|
|
7
6
|
export declare class UserSession implements ISession {
|
|
8
|
-
protected SessionExpirationTime: number;
|
|
9
7
|
SessionId: string;
|
|
10
8
|
/**
|
|
11
|
-
*
|
|
9
|
+
* User id that owns this session. Single source of truth for ownership.
|
|
12
10
|
*/
|
|
13
|
-
|
|
14
|
-
Data: Map<string, unknown>;
|
|
11
|
+
UserId: number;
|
|
15
12
|
Creation: DateTime;
|
|
16
13
|
/**
|
|
17
|
-
*
|
|
14
|
+
* Expiration time for session, if undefined it does not expire.
|
|
15
|
+
* Set by the SessionProvider through the configured expiration strategy.
|
|
18
16
|
*/
|
|
19
|
-
|
|
17
|
+
Expiration: DateTime | undefined;
|
|
18
|
+
Data: Map<string, unknown>;
|
|
20
19
|
constructor(session?: Partial<ISession>);
|
|
21
|
-
/**
|
|
22
|
-
* Extends lifetime of session
|
|
23
|
-
*
|
|
24
|
-
* @param seconds - hom mutch to extend
|
|
25
|
-
*/
|
|
26
|
-
extend(seconds?: number): void;
|
|
27
20
|
}
|
|
28
21
|
/**
|
|
29
|
-
*
|
|
22
|
+
* Derives the `ssid` cookie `maxAge` (milliseconds) from a session's real
|
|
23
|
+
* `Expiration` (fixes B1 — the cookie previously always died at
|
|
24
|
+
* `expiration * 1000` ms i.e. ~2 minutes). Returns `undefined` for a
|
|
25
|
+
* never-expiring session (a session cookie), and never a negative value.
|
|
26
|
+
*
|
|
27
|
+
* @param session - the session whose expiry drives the cookie lifetime
|
|
28
|
+
*/
|
|
29
|
+
export declare function sessionCookieMaxAge(session: ISession): number | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* Session-fixation protection helper. Mints a NEW session id, copies the
|
|
32
|
+
* ownership identity and data across, deletes the old id and persists the new
|
|
33
|
+
* one. Apply on privilege elevation (login already mints a fresh session, but
|
|
34
|
+
* 2FA-authorize and role-switch elevate an existing one).
|
|
35
|
+
*
|
|
36
|
+
* The returned session carries a new `SessionId` so the caller can reset the
|
|
37
|
+
* `ssid` cookie. `Expiration` is left unset so `save` schedules a fresh one via
|
|
38
|
+
* the configured strategy (`Creation` is preserved, so a capped lifetime window
|
|
39
|
+
* is not extended).
|
|
40
|
+
*
|
|
41
|
+
* @param provider - the active session store
|
|
42
|
+
* @param session - the session to regenerate
|
|
43
|
+
*/
|
|
44
|
+
export declare function regenerateSession(provider: SessionProvider, session: ISession): Promise<ISession>;
|
|
45
|
+
/**
|
|
46
|
+
* Simple session storage in memory, for testing or rapid prototyping.
|
|
47
|
+
* Keeps live session objects (no serialization).
|
|
30
48
|
*/
|
|
31
49
|
export declare class MemorySessionStore extends SessionProvider<ISession> {
|
|
32
50
|
protected Sessions: Map<string, ISession>;
|
|
33
|
-
truncate(): Promise<void>;
|
|
34
|
-
touch(session: ISession): Promise<void>;
|
|
35
51
|
restore(sessionId: string): Promise<ISession | null>;
|
|
52
|
+
save(session: ISession): Promise<void>;
|
|
53
|
+
touch(session: ISession): Promise<boolean>;
|
|
36
54
|
delete(sessionId: string): Promise<void>;
|
|
37
|
-
|
|
38
|
-
|
|
55
|
+
deleteByUser(userId: number): Promise<void>;
|
|
56
|
+
listByUser(userId: number): Promise<ISession[]>;
|
|
57
|
+
truncate(): Promise<void>;
|
|
58
|
+
private expirationEquals;
|
|
39
59
|
}
|
|
40
60
|
//# sourceMappingURL=session.d.ts.map
|
package/lib/mjs/session.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAI5D;;GAEG;AACH,qBACa,WAAY,YAAW,QAAQ;IACnC,SAAS,EAAE,MAAM,CAAY;IAEpC;;OAEG;IACI,MAAM,EAAE,MAAM,CAAC;IAEf,QAAQ,EAAE,QAAQ,CAAkB;IAE3C;;;OAGG;IACI,UAAU,EAAE,QAAQ,GAAG,SAAS,CAAa;IAE7C,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAa;gBAElC,OAAO,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC;CAKxC;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAKzE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAWvG;AAED;;;GAGG;AACH,qBACa,kBAAmB,SAAQ,eAAe,CAAC,QAAQ,CAAC;IAC/D,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAA+B;IAE3D,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAepD,IAAI,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAWtC,KAAK,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAc1C,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ3C,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAU/C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAItC,OAAO,CAAC,gBAAgB;CAMzB"}
|
package/lib/mjs/session.js
CHANGED
|
@@ -10,94 +10,136 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
10
10
|
import { DateTime } from 'luxon';
|
|
11
11
|
import { SessionProvider } from './interfaces.js';
|
|
12
12
|
import { Injectable, NewInstance } from '@spinajs/di';
|
|
13
|
-
import { Config } from '@spinajs/configuration';
|
|
14
13
|
import { v4 as uuidv4 } from 'uuid';
|
|
15
|
-
import _ from 'lodash';
|
|
16
14
|
/**
|
|
17
15
|
* Session base class
|
|
18
16
|
*/
|
|
19
17
|
let UserSession = class UserSession {
|
|
20
18
|
constructor(session) {
|
|
21
19
|
this.SessionId = uuidv4();
|
|
20
|
+
this.Creation = DateTime.now();
|
|
22
21
|
/**
|
|
23
|
-
* Expiration time for session, if
|
|
22
|
+
* Expiration time for session, if undefined it does not expire.
|
|
23
|
+
* Set by the SessionProvider through the configured expiration strategy.
|
|
24
24
|
*/
|
|
25
25
|
this.Expiration = undefined;
|
|
26
26
|
this.Data = new Map();
|
|
27
|
-
this.Creation = DateTime.now();
|
|
28
27
|
if (session) {
|
|
29
28
|
Object.assign(this, session);
|
|
30
29
|
}
|
|
31
30
|
}
|
|
32
|
-
/**
|
|
33
|
-
* Extends lifetime of session
|
|
34
|
-
*
|
|
35
|
-
* @param seconds - hom mutch to extend
|
|
36
|
-
*/
|
|
37
|
-
extend(seconds) {
|
|
38
|
-
this.Expiration = DateTime.now().plus({ seconds: seconds ? seconds : this.SessionExpirationTime });
|
|
39
|
-
}
|
|
40
31
|
};
|
|
41
|
-
__decorate([
|
|
42
|
-
Config('rbac.session.expiration'),
|
|
43
|
-
__metadata("design:type", Number)
|
|
44
|
-
], UserSession.prototype, "SessionExpirationTime", void 0);
|
|
45
32
|
UserSession = __decorate([
|
|
46
33
|
NewInstance(),
|
|
47
34
|
__metadata("design:paramtypes", [Object])
|
|
48
35
|
], UserSession);
|
|
49
36
|
export { UserSession };
|
|
50
37
|
/**
|
|
51
|
-
*
|
|
38
|
+
* Derives the `ssid` cookie `maxAge` (milliseconds) from a session's real
|
|
39
|
+
* `Expiration` (fixes B1 — the cookie previously always died at
|
|
40
|
+
* `expiration * 1000` ms i.e. ~2 minutes). Returns `undefined` for a
|
|
41
|
+
* never-expiring session (a session cookie), and never a negative value.
|
|
42
|
+
*
|
|
43
|
+
* @param session - the session whose expiry drives the cookie lifetime
|
|
44
|
+
*/
|
|
45
|
+
export function sessionCookieMaxAge(session) {
|
|
46
|
+
if (!session.Expiration) {
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
return Math.max(0, Math.floor(session.Expiration.diff(DateTime.now()).milliseconds));
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Session-fixation protection helper. Mints a NEW session id, copies the
|
|
53
|
+
* ownership identity and data across, deletes the old id and persists the new
|
|
54
|
+
* one. Apply on privilege elevation (login already mints a fresh session, but
|
|
55
|
+
* 2FA-authorize and role-switch elevate an existing one).
|
|
56
|
+
*
|
|
57
|
+
* The returned session carries a new `SessionId` so the caller can reset the
|
|
58
|
+
* `ssid` cookie. `Expiration` is left unset so `save` schedules a fresh one via
|
|
59
|
+
* the configured strategy (`Creation` is preserved, so a capped lifetime window
|
|
60
|
+
* is not extended).
|
|
61
|
+
*
|
|
62
|
+
* @param provider - the active session store
|
|
63
|
+
* @param session - the session to regenerate
|
|
64
|
+
*/
|
|
65
|
+
export async function regenerateSession(provider, session) {
|
|
66
|
+
const regenerated = new UserSession({
|
|
67
|
+
UserId: session.UserId,
|
|
68
|
+
Creation: session.Creation,
|
|
69
|
+
Data: new Map(session.Data),
|
|
70
|
+
});
|
|
71
|
+
await provider.delete(session.SessionId);
|
|
72
|
+
await provider.save(regenerated);
|
|
73
|
+
return regenerated;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Simple session storage in memory, for testing or rapid prototyping.
|
|
77
|
+
* Keeps live session objects (no serialization).
|
|
52
78
|
*/
|
|
53
79
|
let MemorySessionStore = class MemorySessionStore extends SessionProvider {
|
|
54
80
|
constructor() {
|
|
55
81
|
super(...arguments);
|
|
56
82
|
this.Sessions = new Map();
|
|
57
83
|
}
|
|
58
|
-
async truncate() {
|
|
59
|
-
this.Sessions = new Map();
|
|
60
|
-
}
|
|
61
|
-
async touch(session) {
|
|
62
|
-
return this.save(session);
|
|
63
|
-
}
|
|
64
84
|
async restore(sessionId) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
if (!session.Expiration || session.Expiration > DateTime.now()) {
|
|
68
|
-
return session;
|
|
69
|
-
}
|
|
85
|
+
const session = this.Sessions.get(sessionId);
|
|
86
|
+
if (!session) {
|
|
70
87
|
return null;
|
|
71
88
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
async delete(sessionId) {
|
|
75
|
-
if (this.Sessions.has(sessionId)) {
|
|
89
|
+
// an expired row is treated as absent (and evicted)
|
|
90
|
+
if (this.isExpired(session)) {
|
|
76
91
|
this.Sessions.delete(sessionId);
|
|
92
|
+
return null;
|
|
77
93
|
}
|
|
94
|
+
return session;
|
|
78
95
|
}
|
|
79
|
-
async save(
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
96
|
+
async save(session) {
|
|
97
|
+
// A brand-new session without a scheduled expiration gets its initial
|
|
98
|
+
// expiration from the strategy. An already-scheduled expiration is
|
|
99
|
+
// persisted verbatim (fixes B3 — never recompute on every save).
|
|
100
|
+
if (session.Expiration === undefined) {
|
|
101
|
+
this.applyInitialExpiration(session);
|
|
85
102
|
}
|
|
86
|
-
|
|
87
|
-
|
|
103
|
+
this.Sessions.set(session.SessionId, session);
|
|
104
|
+
}
|
|
105
|
+
async touch(session) {
|
|
106
|
+
const current = session.Expiration;
|
|
107
|
+
const renewed = this.Expiration.renew(session);
|
|
108
|
+
// no change (e.g. AbsoluteExpiration) — skip the write, report false
|
|
109
|
+
if (this.expirationEquals(current, renewed)) {
|
|
110
|
+
return false;
|
|
88
111
|
}
|
|
112
|
+
session.Expiration = renewed;
|
|
113
|
+
this.Sessions.set(session.SessionId, session);
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
async delete(sessionId) {
|
|
117
|
+
this.Sessions.delete(sessionId);
|
|
89
118
|
}
|
|
90
|
-
|
|
91
|
-
const sessionsToDelete = [];
|
|
119
|
+
async deleteByUser(userId) {
|
|
92
120
|
for (const [key, session] of this.Sessions.entries()) {
|
|
93
|
-
if (session.UserId ===
|
|
94
|
-
|
|
121
|
+
if (session.UserId === userId) {
|
|
122
|
+
this.Sessions.delete(key);
|
|
95
123
|
}
|
|
96
124
|
}
|
|
97
|
-
|
|
98
|
-
|
|
125
|
+
}
|
|
126
|
+
async listByUser(userId) {
|
|
127
|
+
const result = [];
|
|
128
|
+
for (const session of this.Sessions.values()) {
|
|
129
|
+
if (session.UserId === userId && !this.isExpired(session)) {
|
|
130
|
+
result.push(session);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return result;
|
|
134
|
+
}
|
|
135
|
+
async truncate() {
|
|
136
|
+
this.Sessions = new Map();
|
|
137
|
+
}
|
|
138
|
+
expirationEquals(a, b) {
|
|
139
|
+
if (a === undefined || b === undefined) {
|
|
140
|
+
return a === b;
|
|
99
141
|
}
|
|
100
|
-
return
|
|
142
|
+
return a.toMillis() === b.toMillis();
|
|
101
143
|
}
|
|
102
144
|
};
|
|
103
145
|
MemorySessionStore = __decorate([
|
package/lib/mjs/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,eAAe,EAAY,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"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"}
|