@webda/core 4.0.0-beta.3 → 4.0.0-beta.4

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 (135) hide show
  1. package/lib/application/application.d.ts +31 -0
  2. package/lib/application/application.d.ts.map +1 -1
  3. package/lib/application/application.js +55 -2
  4. package/lib/application/application.js.map +1 -1
  5. package/lib/application/deployment.d.ts +93 -0
  6. package/lib/application/deployment.d.ts.map +1 -0
  7. package/lib/application/deployment.js +99 -0
  8. package/lib/application/deployment.js.map +1 -0
  9. package/lib/application/unpackedapplication.d.ts.map +1 -1
  10. package/lib/application/unpackedapplication.js +9 -1
  11. package/lib/application/unpackedapplication.js.map +1 -1
  12. package/lib/bin/cli.d.ts +36 -1
  13. package/lib/bin/cli.d.ts.map +1 -1
  14. package/lib/bin/cli.js +108 -2
  15. package/lib/bin/cli.js.map +1 -1
  16. package/lib/contexts/execution.js +1 -1
  17. package/lib/contexts/execution.js.map +1 -1
  18. package/lib/contexts/operationcontext.d.ts +3 -0
  19. package/lib/contexts/operationcontext.d.ts.map +1 -1
  20. package/lib/contexts/operationcontext.js +6 -3
  21. package/lib/contexts/operationcontext.js.map +1 -1
  22. package/lib/core/core.js +1 -1
  23. package/lib/core/core.js.map +1 -1
  24. package/lib/core/hooks.d.ts +22 -0
  25. package/lib/core/hooks.d.ts.map +1 -1
  26. package/lib/core/hooks.js +24 -0
  27. package/lib/core/hooks.js.map +1 -1
  28. package/lib/deployers/deployer.d.ts +157 -0
  29. package/lib/deployers/deployer.d.ts.map +1 -0
  30. package/lib/deployers/deployer.js +81 -0
  31. package/lib/deployers/deployer.js.map +1 -0
  32. package/lib/deployers/git.d.ts +27 -0
  33. package/lib/deployers/git.d.ts.map +1 -0
  34. package/lib/deployers/git.js +66 -0
  35. package/lib/deployers/git.js.map +1 -0
  36. package/lib/deployers/packager.d.ts +85 -0
  37. package/lib/deployers/packager.d.ts.map +1 -0
  38. package/lib/deployers/packager.js +259 -0
  39. package/lib/deployers/packager.js.map +1 -0
  40. package/lib/index.d.ts +8 -3
  41. package/lib/index.d.ts.map +1 -1
  42. package/lib/index.js +8 -3
  43. package/lib/index.js.map +1 -1
  44. package/lib/models/coremodel.model.d.ts.map +1 -1
  45. package/lib/models/coremodel.model.js.map +1 -1
  46. package/lib/models/decorator.d.ts +4 -0
  47. package/lib/models/decorator.d.ts.map +1 -1
  48. package/lib/models/decorator.js +4 -0
  49. package/lib/models/decorator.js.map +1 -1
  50. package/lib/models/deployment.d.ts +2 -21
  51. package/lib/models/deployment.d.ts.map +1 -1
  52. package/lib/models/encrypted.model.d.ts +46 -0
  53. package/lib/models/encrypted.model.d.ts.map +1 -0
  54. package/lib/models/encrypted.model.js +87 -0
  55. package/lib/models/encrypted.model.js.map +1 -0
  56. package/lib/models/ident.model.d.ts +103 -64
  57. package/lib/models/ident.model.d.ts.map +1 -1
  58. package/lib/models/ident.model.js +168 -76
  59. package/lib/models/ident.model.js.map +1 -1
  60. package/lib/models/ownermodel.model.d.ts.map +1 -1
  61. package/lib/models/ownermodel.model.js +2 -1
  62. package/lib/models/ownermodel.model.js.map +1 -1
  63. package/lib/models/password.model.d.ts +78 -0
  64. package/lib/models/password.model.d.ts.map +1 -0
  65. package/lib/models/password.model.js +171 -0
  66. package/lib/models/password.model.js.map +1 -0
  67. package/lib/models/refreshtoken.model.d.ts +30 -0
  68. package/lib/models/refreshtoken.model.d.ts.map +1 -0
  69. package/lib/models/refreshtoken.model.js +29 -0
  70. package/lib/models/refreshtoken.model.js.map +1 -0
  71. package/lib/models/registry.model.d.ts.map +1 -1
  72. package/lib/models/registry.model.js.map +1 -1
  73. package/lib/models/simpleuser.model.d.ts.map +1 -1
  74. package/lib/models/simpleuser.model.js +2 -1
  75. package/lib/models/simpleuser.model.js.map +1 -1
  76. package/lib/models/user.model.d.ts +23 -23
  77. package/lib/models/user.model.d.ts.map +1 -1
  78. package/lib/models/user.model.js +68 -29
  79. package/lib/models/user.model.js.map +1 -1
  80. package/lib/services/audit.model.d.ts.map +1 -1
  81. package/lib/services/audit.model.js +2 -1
  82. package/lib/services/audit.model.js.map +1 -1
  83. package/lib/services/domainservice.service.d.ts +39 -0
  84. package/lib/services/domainservice.service.d.ts.map +1 -1
  85. package/lib/services/domainservice.service.js +78 -2
  86. package/lib/services/domainservice.service.js.map +1 -1
  87. package/lib/services/iauthentication.d.ts +196 -3
  88. package/lib/services/iauthentication.d.ts.map +1 -1
  89. package/lib/services/servicecommands.d.ts.map +1 -1
  90. package/lib/services/servicecommands.js +17 -11
  91. package/lib/services/servicecommands.js.map +1 -1
  92. package/lib/services/token.service.d.ts +95 -0
  93. package/lib/services/token.service.d.ts.map +1 -0
  94. package/lib/services/token.service.js +182 -0
  95. package/lib/services/token.service.js.map +1 -0
  96. package/lib/session/manager.model.d.ts +16 -0
  97. package/lib/session/manager.model.d.ts.map +1 -1
  98. package/lib/session/manager.model.js +58 -1
  99. package/lib/session/manager.model.js.map +1 -1
  100. package/lib/session/session.d.ts +44 -1
  101. package/lib/session/session.d.ts.map +1 -1
  102. package/lib/session/session.js +51 -2
  103. package/lib/session/session.js.map +1 -1
  104. package/lib/stores/memory.service.d.ts.map +1 -1
  105. package/lib/stores/memory.service.js +4 -3
  106. package/lib/stores/memory.service.js.map +1 -1
  107. package/lib/templates/templates.d.ts +8 -0
  108. package/lib/templates/templates.d.ts.map +1 -1
  109. package/lib/templates/templates.js +10 -1
  110. package/lib/templates/templates.js.map +1 -1
  111. package/lib/test/behavior-fixture.model.d.ts +30 -0
  112. package/lib/test/behavior-fixture.model.d.ts.map +1 -0
  113. package/lib/test/behavior-fixture.model.js +63 -0
  114. package/lib/test/behavior-fixture.model.js.map +1 -0
  115. package/lib/test/legacyident.fixture.model.d.ts +98 -0
  116. package/lib/test/legacyident.fixture.model.d.ts.map +1 -0
  117. package/lib/test/legacyident.fixture.model.js +125 -0
  118. package/lib/test/legacyident.fixture.model.js.map +1 -0
  119. package/lib/test/objects.d.ts +2 -2
  120. package/lib/test/objects.d.ts.map +1 -1
  121. package/lib/test/objects.js +2 -2
  122. package/lib/test/objects.js.map +1 -1
  123. package/package.json +25 -8
  124. package/test/config-cached.json +2 -1
  125. package/test/config.json +3 -1
  126. package/test/my-cnf.json +1 -1
  127. package/webda.module.json +653 -375
  128. package/lib/services/authentication.service.d.ts +0 -442
  129. package/lib/services/authentication.service.d.ts.map +0 -1
  130. package/lib/services/authentication.service.js +0 -932
  131. package/lib/services/authentication.service.js.map +0 -1
  132. package/lib/services/oauth.d.ts +0 -250
  133. package/lib/services/oauth.d.ts.map +0 -1
  134. package/lib/services/oauth.js +0 -405
  135. package/lib/services/oauth.js.map +0 -1
@@ -0,0 +1,95 @@
1
+ import * as WebdaError from "../errors/errors.js";
2
+ import { Service } from "./service.js";
3
+ import { ServiceParameters } from "./serviceparameters.js";
4
+ import { MfaState, Session } from "../session/session.js";
5
+ /** Raised for unknown, expired, revoked or reused tokens (403 TOKEN_INVALID) */
6
+ export declare class TokenInvalid extends WebdaError.HttpError {
7
+ /** @param message - error message */
8
+ constructor(message?: string);
9
+ }
10
+ /** Tokens returned by a successful login or refresh */
11
+ export interface IssuedTokens {
12
+ accessToken: string;
13
+ refreshToken: string;
14
+ expiresIn: number;
15
+ }
16
+ /** Claims carried by an access token */
17
+ export interface AccessClaims {
18
+ sub: string;
19
+ ident: string;
20
+ provider?: string;
21
+ amr: string[];
22
+ roles?: string[];
23
+ fam: string;
24
+ mfa: MfaState;
25
+ /** When the session was authenticated (ms): checked against the user's last password change */
26
+ authAt?: number;
27
+ }
28
+ /** TokenService parameters */
29
+ export declare class TokenServiceParameters extends ServiceParameters {
30
+ /**
31
+ * Access token lifetime in seconds
32
+ * @default 900
33
+ */
34
+ accessTtl: number;
35
+ /**
36
+ * Refresh token lifetime in seconds
37
+ * @default 2592000
38
+ */
39
+ refreshTtl: number;
40
+ /**
41
+ * @param params - raw parameters
42
+ * @returns this
43
+ */
44
+ load(params?: any): this;
45
+ }
46
+ /**
47
+ * Issues access tokens (JWT) and rotating refresh tokens
48
+ * @WebdaModda TokenService
49
+ */
50
+ export declare class TokenService<T extends TokenServiceParameters = TokenServiceParameters> extends Service<T> {
51
+ /**
52
+ * @param token - raw refresh token
53
+ * @returns SHA-256 hex
54
+ */
55
+ protected hash(token: string): string;
56
+ /**
57
+ * Issue an access + refresh token pair for a logged session
58
+ *
59
+ * Roles are not persisted: refreshed access tokens carry no roles until they are re-derived.
60
+ * @param session - logged session (must not be anonymous nor pending MFA)
61
+ * @param family - existing family when rotating
62
+ * @returns the tokens
63
+ */
64
+ issue(session: Session, family?: string): Promise<IssuedTokens>;
65
+ /**
66
+ * @param token - access token
67
+ * @returns claims, or undefined when invalid/expired
68
+ */
69
+ verifyAccess(token: string): Promise<AccessClaims | undefined>;
70
+ /**
71
+ * Exchange a refresh token (rotation with reuse detection)
72
+ *
73
+ * The token is only ever looked up by its hash, so an access token or any
74
+ * arbitrary string simply does not match a stored record.
75
+ * @param refreshToken - raw refresh token
76
+ * @returns new tokens and the rebuilt session
77
+ */
78
+ refresh(refreshToken: string): Promise<IssuedTokens & {
79
+ session: Session;
80
+ }>;
81
+ /**
82
+ * @param err - error thrown by a conditional write
83
+ * @returns true if the error is a failed write condition
84
+ */
85
+ protected isConditionFailure(err: any): boolean;
86
+ /**
87
+ * @param family - family to revoke
88
+ */
89
+ revokeFamily(family: string): Promise<void>;
90
+ /**
91
+ * @param userId - user whose tokens are revoked
92
+ */
93
+ revokeUser(userId: string): Promise<void>;
94
+ }
95
+ //# sourceMappingURL=token.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.service.d.ts","sourceRoot":"","sources":["../../src/services/token.service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,UAAU,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAI1D,gFAAgF;AAChF,qBAAa,YAAa,SAAQ,UAAU,CAAC,SAAS;IACpD,qCAAqC;IACrC,YAAY,OAAO,GAAE,MAAwB,EAE5C;CACF;AAED,uDAAuD;AACvD,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wCAAwC;AACxC,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,QAAQ,CAAC;IACd,+FAA+F;IAC/F,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,8BAA8B;AAC9B,qBAAa,sBAAuB,SAAQ,iBAAiB;IAC3D;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,IAAI,CAAC,MAAM,GAAE,GAAQ,GAAG,IAAI,CAK3B;CACF;AAED;;;GAGG;AACH,qBAAa,YAAY,CAAC,CAAC,SAAS,sBAAsB,GAAG,sBAAsB,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAC;IACrG;;;OAGG;IACH,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpC;IAED;;;;;;;OAOG;IACG,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,GAAE,MAA0B,GAAG,OAAO,CAAC,YAAY,CAAC,CAiCvF;IAED;;;OAGG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAMnE;IAED;;;;;;;OAOG;IACG,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CA0ChF;IAED;;;OAGG;IACH,SAAS,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAE9C;IAED;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIhD;IAED;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI9C;CACF"}
@@ -0,0 +1,182 @@
1
+ import { createHash, randomBytes } from "node:crypto";
2
+ import { getUuid } from "@webda/utils";
3
+ import * as WebdaError from "../errors/errors.js";
4
+ import { Service } from "./service.js";
5
+ import { ServiceParameters } from "./serviceparameters.js";
6
+ import { useCrypto } from "./cryptoservice.service.js";
7
+ import { RefreshToken } from "../models/refreshtoken.model.js";
8
+ import { Session } from "../session/session.js";
9
+ const ACCESS_AUDIENCE = "webda-access";
10
+ /** Raised for unknown, expired, revoked or reused tokens (403 TOKEN_INVALID) */
11
+ export class TokenInvalid extends WebdaError.HttpError {
12
+ /** @param message - error message */
13
+ constructor(message = "Invalid token") {
14
+ super(message, 403);
15
+ }
16
+ }
17
+ /** TokenService parameters */
18
+ export class TokenServiceParameters extends ServiceParameters {
19
+ /**
20
+ * Access token lifetime in seconds
21
+ * @default 900
22
+ */
23
+ accessTtl;
24
+ /**
25
+ * Refresh token lifetime in seconds
26
+ * @default 2592000
27
+ */
28
+ refreshTtl;
29
+ /**
30
+ * @param params - raw parameters
31
+ * @returns this
32
+ */
33
+ load(params = {}) {
34
+ super.load(params);
35
+ this.accessTtl ??= 900;
36
+ this.refreshTtl ??= 2592000;
37
+ return this;
38
+ }
39
+ }
40
+ /**
41
+ * Issues access tokens (JWT) and rotating refresh tokens
42
+ * @WebdaModda TokenService
43
+ */
44
+ export class TokenService extends Service {
45
+ /**
46
+ * @param token - raw refresh token
47
+ * @returns SHA-256 hex
48
+ */
49
+ hash(token) {
50
+ return createHash("sha256").update(token).digest("hex");
51
+ }
52
+ /**
53
+ * Issue an access + refresh token pair for a logged session
54
+ *
55
+ * Roles are not persisted: refreshed access tokens carry no roles until they are re-derived.
56
+ * @param session - logged session (must not be anonymous nor pending MFA)
57
+ * @param family - existing family when rotating
58
+ * @returns the tokens
59
+ */
60
+ async issue(session, family = getUuid("base64")) {
61
+ if (!session.isLogged()) {
62
+ throw new TokenInvalid("Session is not fully authenticated");
63
+ }
64
+ const refreshToken = randomBytes(32).toString("base64url");
65
+ await RefreshToken.create({
66
+ hash: this.hash(refreshToken),
67
+ userId: session.userId,
68
+ identId: session.identUsed,
69
+ provider: session.provider,
70
+ amr: session.amr ?? [],
71
+ mfa: session.mfa ?? "none",
72
+ family,
73
+ expiresAt: Date.now() + this.parameters.refreshTtl * 1000
74
+ });
75
+ session.refreshFamily = family;
76
+ // A refreshed session is re-authenticated by its (unrevoked) refresh token
77
+ session.authAt ??= Date.now();
78
+ const claims = {
79
+ sub: session.userId,
80
+ ident: session.identUsed,
81
+ provider: session.provider,
82
+ amr: session.amr ?? [],
83
+ roles: session.roles,
84
+ fam: family,
85
+ mfa: session.mfa ?? "none",
86
+ authAt: session.authAt
87
+ };
88
+ const accessToken = await useCrypto().jwtSign(claims, {
89
+ audience: ACCESS_AUDIENCE,
90
+ expiresIn: this.parameters.accessTtl
91
+ });
92
+ return { accessToken, refreshToken, expiresIn: this.parameters.accessTtl };
93
+ }
94
+ /**
95
+ * @param token - access token
96
+ * @returns claims, or undefined when invalid/expired
97
+ */
98
+ async verifyAccess(token) {
99
+ try {
100
+ return await useCrypto().jwtVerify(token, { audience: ACCESS_AUDIENCE });
101
+ }
102
+ catch {
103
+ return undefined;
104
+ }
105
+ }
106
+ /**
107
+ * Exchange a refresh token (rotation with reuse detection)
108
+ *
109
+ * The token is only ever looked up by its hash, so an access token or any
110
+ * arbitrary string simply does not match a stored record.
111
+ * @param refreshToken - raw refresh token
112
+ * @returns new tokens and the rebuilt session
113
+ */
114
+ async refresh(refreshToken) {
115
+ if (typeof refreshToken !== "string" || !refreshToken) {
116
+ throw new TokenInvalid();
117
+ }
118
+ const ref = RefreshToken.ref({ hash: this.hash(refreshToken) });
119
+ if (!(await ref.exists())) {
120
+ throw new TokenInvalid();
121
+ }
122
+ const stored = await ref.get();
123
+ if (stored.revokedAt || stored.expiresAt < Date.now()) {
124
+ throw new TokenInvalid();
125
+ }
126
+ if (stored.rotatedAt) {
127
+ await this.revokeFamily(stored.family);
128
+ throw new TokenInvalid("Refresh token reused");
129
+ }
130
+ // Compare-and-set: only one caller can move rotatedAt from undefined to a value
131
+ try {
132
+ await ref.patch({ rotatedAt: Date.now() }, "rotatedAt", undefined);
133
+ }
134
+ catch (err) {
135
+ if (!this.isConditionFailure(err)) {
136
+ throw err;
137
+ }
138
+ // Lost the race: treat as reuse and kill the family
139
+ await this.revokeFamily(stored.family);
140
+ throw new TokenInvalid("Refresh token reused");
141
+ }
142
+ const session = new Session();
143
+ session.login(stored.userId, stored.identId, {
144
+ provider: stored.provider,
145
+ amr: stored.amr,
146
+ mfa: stored.mfa ?? "none"
147
+ });
148
+ const tokens = await this.issue(session, stored.family);
149
+ // A revocation may have run between our read and the issue: its scan would have missed the new record
150
+ for await (const _ of RefreshToken.iterate("family = ? AND revokedAt IS NOT NULL LIMIT 1", [stored.family])) {
151
+ await RefreshToken.ref({ hash: this.hash(tokens.refreshToken) }).patch({
152
+ revokedAt: Date.now()
153
+ });
154
+ throw new TokenInvalid("Refresh token revoked");
155
+ }
156
+ return { ...tokens, session };
157
+ }
158
+ /**
159
+ * @param err - error thrown by a conditional write
160
+ * @returns true if the error is a failed write condition
161
+ */
162
+ isConditionFailure(err) {
163
+ return /condition/i.test(`${err?.name} ${err?.message}`);
164
+ }
165
+ /**
166
+ * @param family - family to revoke
167
+ */
168
+ async revokeFamily(family) {
169
+ for await (const token of RefreshToken.iterate("family = ? AND revokedAt IS NULL", [family])) {
170
+ await token.ref().patch({ revokedAt: Date.now() });
171
+ }
172
+ }
173
+ /**
174
+ * @param userId - user whose tokens are revoked
175
+ */
176
+ async revokeUser(userId) {
177
+ for await (const token of RefreshToken.iterate("userId = ? AND revokedAt IS NULL", [userId])) {
178
+ await token.ref().patch({ revokedAt: Date.now() });
179
+ }
180
+ }
181
+ }
182
+ //# sourceMappingURL=token.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.service.js","sourceRoot":"","sources":["../../src/services/token.service.ts"],"names":[],"mappings":"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"}
@@ -21,6 +21,22 @@ export declare abstract class SessionManager<T extends ServiceParameters = Servi
21
21
  * @param session
22
22
  */
23
23
  abstract save(context: Context, session: Session): Promise<void>;
24
+ /**
25
+ * Build a stateless session from an access token (any transport)
26
+ * @param context - the context
27
+ * @param token - access token
28
+ * @returns the session, anonymous when the token is invalid
29
+ */
30
+ loadFromToken(context: Context, token: string): Promise<Session>;
31
+ /**
32
+ * Whether the user of an authenticated session changed their password after the session was authenticated
33
+ *
34
+ * Costs one user read (through the registered user resolver) per load of a session carrying `authAt`. A failing
35
+ * read counts as outdated: the session is then anonymous for that request.
36
+ * @param session - loaded session
37
+ * @returns true when the session must be treated as anonymous
38
+ */
39
+ protected isOutdated(session: Session): Promise<boolean>;
24
40
  }
25
41
  /** Persistent session data stored in a model with a TTL */
26
42
  export declare class SessionModel extends UuidModel {
@@ -1 +1 @@
1
- {"version":3,"file":"manager.model.d.ts","sourceRoot":"","sources":["../../src/session/manager.model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAU,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,aAAa,EAAgB,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAgB,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE5E;;GAEG;AACH,8BAAsB,cAAc,CAAC,CAAC,SAAS,iBAAiB,GAAG,iBAAiB,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAC;IACtG;;;OAGG;IACH,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClE;AAED,2DAA2D;AAC3D,qBAAa,YAAa,SAAQ,SAAS;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,GAAG,CAAC;IACb;;OAEG;IACH,YAAY,IAAI,EAAE,GAAG,EAIpB;CACF;AAED,sDAAsD;AACtD,qBAAa,uBAAwB,SAAQ,iBAAiB;IAC5D;;OAEG;IACH,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB;;OAEG;IACH,MAAM,CAAC,EAAE,aAAa,CAAC;IAEvB;;;;OAIG;IACH,IAAI,CAAC,MAAM,GAAE,GAAQ,GAAG,IAAI,CAI3B;CACF;AAED;;;;;;;GAOG;AACH,qBAAa,oBAAoB,CAC/B,CAAC,SAAS,uBAAuB,GAAG,uBAAuB,CAC3D,SAAQ,cAAc,CAAC,CAAC,CAAC;IAEzB,aAAa,EAAE,aAAa,CAAC;IAE7B,YAAY,EAAE,UAAU,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnD;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAgB7C;IAED;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,iBA6B5C;CACF"}
1
+ {"version":3,"file":"manager.model.d.ts","sourceRoot":"","sources":["../../src/session/manager.model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAU,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,aAAa,EAAgB,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAgB,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE5E;;GAEG;AACH,8BAAsB,cAAc,CAAC,CAAC,SAAS,iBAAiB,GAAG,iBAAiB,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAC;IACtG;;;OAGG;IACH,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjE;;;;;OAKG;IACG,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAcrE;IAED;;;;;;;OAOG;IACH,UAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAY7D;CACF;AAED,2DAA2D;AAC3D,qBAAa,YAAa,SAAQ,SAAS;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,GAAG,CAAC;IACb;;OAEG;IACH,YAAY,IAAI,EAAE,GAAG,EAIpB;CACF;AAED,sDAAsD;AACtD,qBAAa,uBAAwB,SAAQ,iBAAiB;IAC5D;;OAEG;IACH,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB;;OAEG;IACH,MAAM,CAAC,EAAE,aAAa,CAAC;IAEvB;;;;OAIG;IACH,IAAI,CAAC,MAAM,GAAE,GAAQ,GAAG,IAAI,CAI3B;CACF;AAED;;;;;;;GAOG;AACH,qBAAa,oBAAoB,CAC/B,CAAC,SAAS,uBAAuB,GAAG,uBAAuB,CAC3D,SAAQ,cAAc,CAAC,CAAC,CAAC;IAEzB,aAAa,EAAE,aAAa,CAAC;IAE7B,YAAY,EAAE,UAAU,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnD;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAyB7C;IAED;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,iBAgC5C;CACF"}
@@ -38,11 +38,56 @@ import { isWebContext } from "../contexts/icontext.js";
38
38
  import { getUuid } from "@webda/utils";
39
39
  import { ServiceParameters } from "../services/serviceparameters.js";
40
40
  import { Session } from "./session.js";
41
+ import { useService, useUserResolver } from "../core/hooks.js";
42
+ import { runAsSystem } from "../contexts/execution.js";
41
43
  import { UuidModel } from "@webda/models";
42
44
  /**
43
45
  * Manage load and save of sessions
44
46
  */
45
47
  export class SessionManager extends Service {
48
+ /**
49
+ * Build a stateless session from an access token (any transport)
50
+ * @param context - the context
51
+ * @param token - access token
52
+ * @returns the session, anonymous when the token is invalid
53
+ */
54
+ async loadFromToken(context, token) {
55
+ const session = new Session();
56
+ session.stateless = true;
57
+ const claims = await useService("TokenService").verifyAccess(token);
58
+ if (claims) {
59
+ session.login(claims.sub, claims.ident, { provider: claims.provider, amr: claims.amr, mfa: claims.mfa });
60
+ session.roles = claims.roles;
61
+ session.refreshFamily = claims.fam;
62
+ session.authAt = claims.authAt;
63
+ if (await this.isOutdated(session)) {
64
+ session.logout();
65
+ }
66
+ }
67
+ return session;
68
+ }
69
+ /**
70
+ * Whether the user of an authenticated session changed their password after the session was authenticated
71
+ *
72
+ * Costs one user read (through the registered user resolver) per load of a session carrying `authAt`. A failing
73
+ * read counts as outdated: the session is then anonymous for that request.
74
+ * @param session - loaded session
75
+ * @returns true when the session must be treated as anonymous
76
+ */
77
+ async isOutdated(session) {
78
+ if (session.userId === undefined || typeof session.authAt !== "number") {
79
+ return false;
80
+ }
81
+ try {
82
+ const user = await runAsSystem(() => useUserResolver().resolve(session.userId));
83
+ const changedAt = user?.password?.changedAt;
84
+ return typeof changedAt === "number" && changedAt > session.authAt;
85
+ }
86
+ catch (err) {
87
+ this.log("WARN", "Cannot check the session against the user password, session ignored", err?.message);
88
+ return true;
89
+ }
90
+ }
46
91
  }
47
92
  /** Persistent session data stored in a model with a TTL */
48
93
  export class SessionModel extends UuidModel {
@@ -107,6 +152,11 @@ let CookieSessionManager = (() => {
107
152
  if (!isWebContext(context)) {
108
153
  return new Session();
109
154
  }
155
+ // A Bearer scheme is authoritative: an invalid token yields an anonymous session, never the cookie
156
+ const authorization = context.getHttpContext().getHeader("authorization");
157
+ if (typeof authorization === "string" && /^bearer(\s|$)/i.test(authorization)) {
158
+ return this.loadFromToken(context, authorization.substring(7).trim());
159
+ }
110
160
  const session = new Session();
111
161
  const cookie = await SecureCookie.load(this.parameters.cookie.name, session, context, this.parameters.jwt);
112
162
  if (this.sessionModel) {
@@ -119,6 +169,10 @@ let CookieSessionManager = (() => {
119
169
  else {
120
170
  Object.assign(session, cookie);
121
171
  }
172
+ // A password change ends the sessions authenticated before it
173
+ if (await this.isOutdated(session)) {
174
+ session.logout();
175
+ }
122
176
  return session;
123
177
  }
124
178
  /**
@@ -128,9 +182,12 @@ let CookieSessionManager = (() => {
128
182
  if (!isWebContext(context)) {
129
183
  return;
130
184
  }
185
+ if (session.stateless) {
186
+ return;
187
+ }
131
188
  // If store is found session info are stored in db
132
189
  if (this.sessionModel) {
133
- if (this.sessionModel.exists(session.uuid)) {
190
+ if (await this.sessionModel.exists(session.uuid)) {
134
191
  await this.sessionModel.update({
135
192
  uuid: session.uuid,
136
193
  session,
@@ -1 +1 @@
1
- {"version":3,"file":"manager.model.js","sourceRoot":"","sources":["../../src/session/manager.model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manager.model.js","sourceRoot":"","sources":["../../src/session/manager.model.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,15 @@
1
+ /**
2
+ * MFA progress of a session
3
+ */
4
+ export type MfaState = "none" | "pending" | "verified";
5
+ /**
6
+ * Options for {@link Session.login}
7
+ */
8
+ export interface LoginOptions {
9
+ provider?: string;
10
+ amr?: string[];
11
+ mfa?: MfaState;
12
+ }
1
13
  /**
2
14
  * Session
3
15
  */
@@ -19,12 +31,38 @@ export declare class Session {
19
31
  * User current roles
20
32
  */
21
33
  roles: string[];
34
+ /**
35
+ * Authentication provider used
36
+ */
37
+ provider?: string;
38
+ /**
39
+ * Authentication methods used
40
+ */
41
+ amr?: string[];
42
+ /**
43
+ * MFA state of the session
44
+ */
45
+ mfa?: MfaState;
46
+ /**
47
+ * Refresh token family identifier
48
+ */
49
+ refreshFamily?: string;
50
+ /**
51
+ * When the session was authenticated (ms timestamp, stamped by the Authentication service): a session older than
52
+ * the last password change of its user is loaded as anonymous
53
+ */
54
+ authAt?: number;
55
+ /**
56
+ * Session is stateless (not persisted in cookies)
57
+ */
58
+ stateless?: boolean;
22
59
  /**
23
60
  * Login
24
61
  * @param userId - the user identifier
25
62
  * @param identUsed - the identity used
63
+ * @param options - login options including provider, amr, and mfa state
26
64
  */
27
- login(userId: string, identUsed: string): void;
65
+ login(userId: string, identUsed: string, options?: LoginOptions): void;
28
66
  /**
29
67
  * Logout
30
68
  */
@@ -34,6 +72,11 @@ export declare class Session {
34
72
  * @returns true if the condition is met
35
73
  */
36
74
  isLogged(): boolean;
75
+ /**
76
+ * If session is pending MFA verification
77
+ * @returns true if the condition is met
78
+ */
79
+ isPending(): boolean;
37
80
  /**
38
81
  * Session is dirty and requires save
39
82
  * @returns true if the condition is met
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/session/session.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,qBAAa,OAAO;IAElB,SAAS,CAAC,OAAO,EAAE,OAAO,CAAS;IACnC;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,KAAK,EAAE,MAAM,EAAE,CAAC;IAEhB;;;;OAIG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAGtC;IACD;;OAEG;IACH,MAAM,SAIL;IAED;;;OAGG;IACH,QAAQ,IAAI,OAAO,CAElB;IAED;;;OAGG;IACH,OAAO,IAAI,OAAO,CAEjB;IAED;;;OAGG;IACH,QAAQ,IAAI,IAAI,CAef;CACF;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,OAAO;IACzC;;OAEG;IACH,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/session/session.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,QAAQ,CAAC;CAChB;AAED;;GAEG;AACH,qBAAa,OAAO;IAElB,SAAS,CAAC,OAAO,EAAE,OAAO,CAAS;IACnC;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,KAAK,EAAE,MAAM,EAAE,CAAC;IAEhB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IAEf;;OAEG;IACH,GAAG,CAAC,EAAE,QAAQ,CAAC;IAEf;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IAEH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;;;OAKG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,QAMlE;IACD;;OAEG;IACH,MAAM,SASL;IAED;;;OAGG;IACH,QAAQ,IAAI,OAAO,CAElB;IAED;;;OAGG;IACH,SAAS,IAAI,OAAO,CAEnB;IAED;;;OAGG;IACH,OAAO,IAAI,OAAO,CAEjB;IAED;;;OAGG;IACH,QAAQ,IAAI,IAAI,CAef;CACF;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,OAAO;IACzC;;OAEG;IACH,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB"}
@@ -40,11 +40,16 @@ let Session = (() => {
40
40
  let _changed_decorators;
41
41
  let _changed_initializers = [];
42
42
  let _changed_extraInitializers = [];
43
+ let _stateless_decorators;
44
+ let _stateless_initializers = [];
45
+ let _stateless_extraInitializers = [];
43
46
  return class Session {
44
47
  static {
45
48
  const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
46
49
  _changed_decorators = [NotEnumerable];
50
+ _stateless_decorators = [NotEnumerable];
47
51
  __esDecorate(null, null, _changed_decorators, { kind: "field", name: "changed", static: false, private: false, access: { has: obj => "changed" in obj, get: obj => obj.changed, set: (obj, value) => { obj.changed = value; } }, metadata: _metadata }, _changed_initializers, _changed_extraInitializers);
52
+ __esDecorate(null, null, _stateless_decorators, { kind: "field", name: "stateless", static: false, private: false, access: { has: obj => "stateless" in obj, get: obj => obj.stateless, set: (obj, value) => { obj.stateless = value; } }, metadata: _metadata }, _stateless_initializers, _stateless_extraInitializers);
48
53
  if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
49
54
  }
50
55
  changed = __runInitializers(this, _changed_initializers, false);
@@ -64,14 +69,43 @@ let Session = (() => {
64
69
  * User current roles
65
70
  */
66
71
  roles;
72
+ /**
73
+ * Authentication provider used
74
+ */
75
+ provider;
76
+ /**
77
+ * Authentication methods used
78
+ */
79
+ amr;
80
+ /**
81
+ * MFA state of the session
82
+ */
83
+ mfa;
84
+ /**
85
+ * Refresh token family identifier
86
+ */
87
+ refreshFamily;
88
+ /**
89
+ * When the session was authenticated (ms timestamp, stamped by the Authentication service): a session older than
90
+ * the last password change of its user is loaded as anonymous
91
+ */
92
+ authAt;
93
+ /**
94
+ * Session is stateless (not persisted in cookies)
95
+ */
96
+ stateless = __runInitializers(this, _stateless_initializers, void 0);
67
97
  /**
68
98
  * Login
69
99
  * @param userId - the user identifier
70
100
  * @param identUsed - the identity used
101
+ * @param options - login options including provider, amr, and mfa state
71
102
  */
72
- login(userId, identUsed) {
103
+ login(userId, identUsed, options = {}) {
73
104
  this.userId = userId;
74
105
  this.identUsed = identUsed;
106
+ this.provider = options.provider;
107
+ this.amr = options.amr ?? [];
108
+ this.mfa = options.mfa ?? "none";
75
109
  }
76
110
  /**
77
111
  * Logout
@@ -80,13 +114,25 @@ let Session = (() => {
80
114
  delete this.userId;
81
115
  delete this.identUsed;
82
116
  delete this.roles;
117
+ delete this.provider;
118
+ delete this.amr;
119
+ delete this.mfa;
120
+ delete this.refreshFamily;
121
+ delete this.authAt;
83
122
  }
84
123
  /**
85
124
  * If session is authenticated
86
125
  * @returns true if the condition is met
87
126
  */
88
127
  isLogged() {
89
- return this.userId !== undefined;
128
+ return this.userId !== undefined && this.mfa !== "pending";
129
+ }
130
+ /**
131
+ * If session is pending MFA verification
132
+ * @returns true if the condition is met
133
+ */
134
+ isPending() {
135
+ return this.userId !== undefined && this.mfa === "pending";
90
136
  }
91
137
  /**
92
138
  * Session is dirty and requires save
@@ -115,6 +161,9 @@ let Session = (() => {
115
161
  };
116
162
  return new Proxy(this, proxyHandler);
117
163
  }
164
+ constructor() {
165
+ __runInitializers(this, _stateless_extraInitializers);
166
+ }
118
167
  };
119
168
  })();
120
169
  export { Session };
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session/session.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C;;GAEG;IACU,OAAO;;;;iBAAP,OAAO;;;mCACjB,aAAa;YACd,uKAAU,OAAO,6BAAP,OAAO,yFAAkB;;;QAAzB,OAAO,kDAAY,KAAK,EAAC;QACnC;;WAEG;QACH,IAAI,uDAAS;QACb;;WAEG;QACH,MAAM,CAAU;QAChB;;WAEG;QACH,SAAS,CAAS;QAElB;;WAEG;QACH,KAAK,CAAW;QAEhB;;;;WAIG;QACH,KAAK,CAAC,MAAc,EAAE,SAAiB;YACrC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC7B,CAAC;QACD;;WAEG;QACH,MAAM;YACJ,OAAO,IAAI,CAAC,MAAM,CAAC;YACnB,OAAO,IAAI,CAAC,SAAS,CAAC;YACtB,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;QAED;;;WAGG;QACH,QAAQ;YACN,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC;QACnC,CAAC;QAED;;;WAGG;QACH,OAAO;YACL,OAAO,IAAI,CAAC,OAAO,CAAC;QACtB,CAAC;QAED;;;WAGG;QACH,QAAQ;YACN,MAAM,YAAY,GAAG;gBACnB,GAAG,EAAE,CAAC,GAAS,EAAE,QAAgB,EAAE,KAAU,EAAE,EAAE;oBAC/C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;oBACpB,GAAG,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;oBACtB,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,GAAG,EAAE,CAAC,GAAS,EAAE,QAAgB,EAAE,EAAE;oBACnC,IAAI,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,QAAQ,EAAE,CAAC;wBACtC,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC,CAAC;oBAChD,CAAC;oBACD,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACvB,CAAC;aACF,CAAC;YACF,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACvC,CAAC;;;SA1EU,OAAO;AA6EpB;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,OAAO;CAK1C"}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session/session.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAgB/C;;GAEG;IACU,OAAO;;;;;;;iBAAP,OAAO;;;mCACjB,aAAa;qCAiDb,aAAa;YAhDd,uKAAU,OAAO,6BAAP,OAAO,yFAAkB;YAiDnC,6KAAA,SAAS,6BAAT,SAAS,6FAAW;;;QAjDV,OAAO,kDAAY,KAAK,EAAC;QACnC;;WAEG;QACH,IAAI,uDAAS;QACb;;WAEG;QACH,MAAM,CAAU;QAChB;;WAEG;QACH,SAAS,CAAS;QAElB;;WAEG;QACH,KAAK,CAAW;QAEhB;;WAEG;QACH,QAAQ,CAAU;QAElB;;WAEG;QACH,GAAG,CAAY;QAEf;;WAEG;QACH,GAAG,CAAY;QAEf;;WAEG;QACH,aAAa,CAAU;QAEvB;;;WAGG;QACH,MAAM,CAAU;QAEhB;;WAEG;QAEH,SAAS,4DAAW;QAEpB;;;;;WAKG;QACH,KAAK,CAAC,MAAc,EAAE,SAAiB,EAAE,OAAO,GAAiB,EAAE;YACjE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;YAC3B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;YACjC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC;YAC7B,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,MAAM,CAAC;QACnC,CAAC;QACD;;WAEG;QACH,MAAM;YACJ,OAAO,IAAI,CAAC,MAAM,CAAC;YACnB,OAAO,IAAI,CAAC,SAAS,CAAC;YACtB,OAAO,IAAI,CAAC,KAAK,CAAC;YAClB,OAAO,IAAI,CAAC,QAAQ,CAAC;YACrB,OAAO,IAAI,CAAC,GAAG,CAAC;YAChB,OAAO,IAAI,CAAC,GAAG,CAAC;YAChB,OAAO,IAAI,CAAC,aAAa,CAAC;YAC1B,OAAO,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC;QAED;;;WAGG;QACH,QAAQ;YACN,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC;QAC7D,CAAC;QAED;;;WAGG;QACH,SAAS;YACP,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC;QAC7D,CAAC;QAED;;;WAGG;QACH,OAAO;YACL,OAAO,IAAI,CAAC,OAAO,CAAC;QACtB,CAAC;QAED;;;WAGG;QACH,QAAQ;YACN,MAAM,YAAY,GAAG;gBACnB,GAAG,EAAE,CAAC,GAAS,EAAE,QAAgB,EAAE,KAAU,EAAE,EAAE;oBAC/C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;oBACpB,GAAG,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;oBACtB,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,GAAG,EAAE,CAAC,GAAS,EAAE,QAAgB,EAAE,EAAE;oBACnC,IAAI,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,QAAQ,EAAE,CAAC;wBACtC,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC,CAAC;oBAChD,CAAC;oBACD,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACvB,CAAC;aACF,CAAC;YACF,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACvC,CAAC;;;;;;SA3HU,OAAO;AA8HpB;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,OAAO;CAK1C"}
@@ -1 +1 @@
1
- {"version":3,"file":"memory.service.d.ts","sourceRoot":"","sources":["../../src/stores/memory.service.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAqC,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAIpG,MAAM,WAAW,UAAU;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,eAAe;IACxD;;OAEG;IACH,WAAW,CAAC,EAAE;QACZ;;WAEG;QACH,IAAI,EAAE,MAAM,CAAC;QACb;;WAEG;QACH,GAAG,CAAC,EAAE,MAAM,CAAC;QACb;;;;WAIG;QACH,KAAK,CAAC,EAAE,MAAM,CAAC;QACf;;WAEG;QACH,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB;;;;;WAKG;QACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IAEF;;;;OAIG;IACH,IAAI,CAAC,MAAM,GAAE,GAAQ,GAAG,IAAI,CAU3B;CACF;AA0FD,4DAA4D;AAC5D,cAAM,cAAe,SAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAC9C,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB;;;;;OAKG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAI9B;CACF;AAED;;;;;GAKG;AACH,qBAAa,WAAW,CAAC,CAAC,SAAS,qBAAqB,GAAG,qBAAqB,CAAE,SAAQ,KAAK,CAAC,CAAC,CAAC;IAChG;;OAEG;IACH,OAAO,EAAE,cAAc,CAAwB;IAC/C;;OAEG;IACH,OAAO,CAAC,kBAAkB,CAAC;IAC3B;;OAEG;IACH,kBAAkB,MAAQ;IAC1B;;OAEG;IACH,OAAO,CAAC,GAAG,CAAS;IAEpB;;;;;;;OAOG;IACG,OAAO,kBAiCZ;IAED;;OAEG;IACG,IAAI,kBA0BT;IAED;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAe1B;IAED;;OAEG;IACH,cAAc,SAwBb;IAED;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAI1B;IAED;;;;OAIG;IAEH,aAAa,CAAC,CAAC,SAAS,UAAU,EAAE,KAAK,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAO3D;CACF"}
1
+ {"version":3,"file":"memory.service.d.ts","sourceRoot":"","sources":["../../src/stores/memory.service.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAqC,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAIpG,MAAM,WAAW,UAAU;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,eAAe;IACxD;;OAEG;IACH,WAAW,CAAC,EAAE;QACZ;;WAEG;QACH,IAAI,EAAE,MAAM,CAAC;QACb;;WAEG;QACH,GAAG,CAAC,EAAE,MAAM,CAAC;QACb;;;;WAIG;QACH,KAAK,CAAC,EAAE,MAAM,CAAC;QACf;;WAEG;QACH,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB;;;;;WAKG;QACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IAEF;;;;OAIG;IACH,IAAI,CAAC,MAAM,GAAE,GAAQ,GAAG,IAAI,CAU3B;CACF;AA0FD,4DAA4D;AAC5D,cAAM,cAAe,SAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAC9C,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB;;;;;OAKG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAI9B;CACF;AAED;;;;;GAKG;AACH,qBAAa,WAAW,CAAC,CAAC,SAAS,qBAAqB,GAAG,qBAAqB,CAAE,SAAQ,KAAK,CAAC,CAAC,CAAC;IAChG;;OAEG;IACH,OAAO,EAAE,cAAc,CAAwB;IAC/C;;OAEG;IACH,OAAO,CAAC,kBAAkB,CAAC;IAC3B;;OAEG;IACH,kBAAkB,MAAQ;IAC1B;;OAEG;IACH,OAAO,CAAC,GAAG,CAAS;IAEpB;;;;;;;OAOG;IACG,OAAO,kBAqCZ;IAED;;OAEG;IACG,IAAI,kBA8BT;IAED;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAe1B;IAED;;OAEG;IACH,cAAc,SAwBb;IAED;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAI1B;IAED;;;;OAIG;IAEH,aAAa,CAAC,CAAC,SAAS,UAAU,EAAE,KAAK,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAQ3D;CACF"}
@@ -331,11 +331,12 @@ let MemoryStore = (() => {
331
331
  */
332
332
  getRepository(model) {
333
333
  // Use our own storage to allow persistence
334
- const pks = useModelMetadata(model).PrimaryKey;
335
- const inner = new MemoryRepository(model, pks, undefined, this.storage);
334
+ const meta = useModelMetadata(model);
335
+ const pks = meta.PrimaryKey;
336
+ const inner = new MemoryRepository(model, pks, meta.PrimaryKeySeparator, this.storage);
336
337
  // Wrap in EventRepository so typed CRUD events (Created/Updated/...) fire;
337
338
  // consumers reach them via useRepository(model).on(...).
338
- return new EventRepository(model, pks, inner);
339
+ return new EventRepository(model, pks, inner, meta.PrimaryKeySeparator);
339
340
  }
340
341
  };
341
342
  })();