@ambushsoftworks/nestjs-auth-graphql 0.17.1 → 0.19.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 (105) hide show
  1. package/CHANGELOG.md +99 -0
  2. package/README.md +363 -1
  3. package/dist/auth.module.d.ts +16 -0
  4. package/dist/auth.module.d.ts.map +1 -1
  5. package/dist/auth.module.js +71 -3
  6. package/dist/auth.module.js.map +1 -1
  7. package/dist/constants.d.ts +2 -0
  8. package/dist/constants.d.ts.map +1 -1
  9. package/dist/constants.js +3 -1
  10. package/dist/constants.js.map +1 -1
  11. package/dist/decorators/allow-guest-session.decorator.d.ts +3 -0
  12. package/dist/decorators/allow-guest-session.decorator.d.ts.map +1 -0
  13. package/dist/decorators/allow-guest-session.decorator.js +8 -0
  14. package/dist/decorators/allow-guest-session.decorator.js.map +1 -0
  15. package/dist/decorators/current-guest.decorator.d.ts +2 -0
  16. package/dist/decorators/current-guest.decorator.d.ts.map +1 -0
  17. package/dist/decorators/current-guest.decorator.js +7 -0
  18. package/dist/decorators/current-guest.decorator.js.map +1 -0
  19. package/dist/exceptions/email-challenge.exceptions.d.ts +8 -0
  20. package/dist/exceptions/email-challenge.exceptions.d.ts.map +1 -0
  21. package/dist/exceptions/email-challenge.exceptions.js +21 -0
  22. package/dist/exceptions/email-challenge.exceptions.js.map +1 -0
  23. package/dist/exceptions/guest-session.exceptions.d.ts +9 -0
  24. package/dist/exceptions/guest-session.exceptions.d.ts.map +1 -0
  25. package/dist/exceptions/guest-session.exceptions.js +20 -0
  26. package/dist/exceptions/guest-session.exceptions.js.map +1 -0
  27. package/dist/guards/create-auth-guard.d.ts.map +1 -1
  28. package/dist/guards/create-auth-guard.js +29 -1
  29. package/dist/guards/create-auth-guard.js.map +1 -1
  30. package/dist/guards/guest-session.guard.d.ts +14 -0
  31. package/dist/guards/guest-session.guard.d.ts.map +1 -0
  32. package/dist/guards/guest-session.guard.js +63 -0
  33. package/dist/guards/guest-session.guard.js.map +1 -0
  34. package/dist/index.d.ts +11 -0
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +11 -0
  37. package/dist/index.js.map +1 -1
  38. package/dist/interfaces/auth-logger.interface.d.ts +10 -1
  39. package/dist/interfaces/auth-logger.interface.d.ts.map +1 -1
  40. package/dist/interfaces/auth-logger.interface.js +9 -0
  41. package/dist/interfaces/auth-logger.interface.js.map +1 -1
  42. package/dist/interfaces/email-challenge-repository.interface.d.ts +22 -0
  43. package/dist/interfaces/email-challenge-repository.interface.d.ts.map +1 -0
  44. package/dist/interfaces/email-challenge-repository.interface.js +3 -0
  45. package/dist/interfaces/email-challenge-repository.interface.js.map +1 -0
  46. package/dist/interfaces/email-service.interface.d.ts +5 -0
  47. package/dist/interfaces/email-service.interface.d.ts.map +1 -1
  48. package/dist/interfaces/email-template-renderer.interface.d.ts +7 -0
  49. package/dist/interfaces/email-template-renderer.interface.d.ts.map +1 -1
  50. package/dist/interfaces/guest-session-repository.interface.d.ts +37 -0
  51. package/dist/interfaces/guest-session-repository.interface.d.ts.map +1 -0
  52. package/dist/interfaces/guest-session-repository.interface.js +3 -0
  53. package/dist/interfaces/guest-session-repository.interface.js.map +1 -0
  54. package/dist/interfaces/index.d.ts +2 -0
  55. package/dist/interfaces/index.d.ts.map +1 -1
  56. package/dist/interfaces/index.js +2 -0
  57. package/dist/interfaces/index.js.map +1 -1
  58. package/dist/repositories/in-memory-email-challenge.repository.d.ts +14 -0
  59. package/dist/repositories/in-memory-email-challenge.repository.d.ts.map +1 -0
  60. package/dist/repositories/in-memory-email-challenge.repository.js +55 -0
  61. package/dist/repositories/in-memory-email-challenge.repository.js.map +1 -0
  62. package/dist/repositories/in-memory-guest-session.repository.d.ts +18 -0
  63. package/dist/repositories/in-memory-guest-session.repository.d.ts.map +1 -0
  64. package/dist/repositories/in-memory-guest-session.repository.js +83 -0
  65. package/dist/repositories/in-memory-guest-session.repository.js.map +1 -0
  66. package/dist/services/configurable-email.service.d.ts +2 -1
  67. package/dist/services/configurable-email.service.d.ts.map +1 -1
  68. package/dist/services/configurable-email.service.js +24 -0
  69. package/dist/services/configurable-email.service.js.map +1 -1
  70. package/dist/services/default-email-template-renderer.d.ts +7 -0
  71. package/dist/services/default-email-template-renderer.d.ts.map +1 -1
  72. package/dist/services/default-email-template-renderer.js +31 -0
  73. package/dist/services/default-email-template-renderer.js.map +1 -1
  74. package/dist/services/email-challenge.service.d.ts +74 -0
  75. package/dist/services/email-challenge.service.d.ts.map +1 -0
  76. package/dist/services/email-challenge.service.js +306 -0
  77. package/dist/services/email-challenge.service.js.map +1 -0
  78. package/dist/services/guest-session.service.d.ts +80 -0
  79. package/dist/services/guest-session.service.d.ts.map +1 -0
  80. package/dist/services/guest-session.service.js +293 -0
  81. package/dist/services/guest-session.service.js.map +1 -0
  82. package/dist/services/passkey.service.d.ts.map +1 -1
  83. package/dist/services/passkey.service.js +8 -20
  84. package/dist/services/passkey.service.js.map +1 -1
  85. package/dist/testing/email-challenge-repository.contract.d.ts +15 -0
  86. package/dist/testing/email-challenge-repository.contract.d.ts.map +1 -0
  87. package/dist/testing/email-challenge-repository.contract.js +287 -0
  88. package/dist/testing/email-challenge-repository.contract.js.map +1 -0
  89. package/dist/testing/guest-session-repository.contract.d.ts +18 -0
  90. package/dist/testing/guest-session-repository.contract.d.ts.map +1 -0
  91. package/dist/testing/guest-session-repository.contract.js +368 -0
  92. package/dist/testing/guest-session-repository.contract.js.map +1 -0
  93. package/dist/testing/index.d.ts +2 -0
  94. package/dist/testing/index.d.ts.map +1 -1
  95. package/dist/testing/index.js +7 -1
  96. package/dist/testing/index.js.map +1 -1
  97. package/dist/utils/rate-limit-helpers.d.ts +4 -0
  98. package/dist/utils/rate-limit-helpers.d.ts.map +1 -0
  99. package/dist/utils/rate-limit-helpers.js +20 -0
  100. package/dist/utils/rate-limit-helpers.js.map +1 -0
  101. package/examples/email-challenge/prisma-email-challenge.repository.ts +85 -0
  102. package/examples/email-challenge/schema.prisma +24 -0
  103. package/examples/guest-sessions/prisma-guest-session.repository.ts +86 -0
  104. package/examples/guest-sessions/schema.prisma +33 -0
  105. package/package.json +1 -1
@@ -0,0 +1,287 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EmailChallengeRepositoryContractError = void 0;
4
+ exports.assertEmailChallengeRepositoryContract = assertEmailChallengeRepositoryContract;
5
+ const crypto_1 = require("crypto");
6
+ class EmailChallengeRepositoryContractError extends Error {
7
+ constructor(check, detail, options) {
8
+ super(`IEmailChallengeRepository contract — ${check}: ${detail}`);
9
+ this.name = 'EmailChallengeRepositoryContractError';
10
+ if (options?.cause !== undefined) {
11
+ this.cause = options.cause;
12
+ }
13
+ }
14
+ }
15
+ exports.EmailChallengeRepositoryContractError = EmailChallengeRepositoryContractError;
16
+ const CONCURRENCY = 8;
17
+ const MAX_ATTEMPTS = 3;
18
+ async function assertEmailChallengeRepositoryContract(factory, options = {}) {
19
+ if (options.cleanup !== undefined && typeof options.cleanup !== 'function') {
20
+ throw new TypeError('assertEmailChallengeRepositoryContract: cleanup must be a function');
21
+ }
22
+ const run = new ContractRun();
23
+ let failure;
24
+ try {
25
+ for (const [name, check] of CHECKS) {
26
+ try {
27
+ const repository = run.track(await factory());
28
+ await check(repository, run, name);
29
+ }
30
+ catch (error) {
31
+ if (error instanceof EmailChallengeRepositoryContractError)
32
+ throw error;
33
+ throw new EmailChallengeRepositoryContractError(name, `threw ${error instanceof Error ? `${error.name}: ${error.message}` : String(error)}`);
34
+ }
35
+ }
36
+ }
37
+ catch (error) {
38
+ failure = error;
39
+ }
40
+ if (options.cleanup) {
41
+ try {
42
+ await options.cleanup({ challengeIds: run.created() });
43
+ }
44
+ catch (cleanupError) {
45
+ if (failure instanceof EmailChallengeRepositoryContractError) {
46
+ throw new EmailChallengeRepositoryContractError('cleanup', `${failure.message} — and cleanup then threw: ${cleanupError instanceof Error ? cleanupError.message : String(cleanupError)}`, { cause: cleanupError });
47
+ }
48
+ if (failure === undefined)
49
+ throw cleanupError;
50
+ }
51
+ }
52
+ if (failure !== undefined)
53
+ throw failure;
54
+ }
55
+ class ContractRun {
56
+ constructor() {
57
+ this.challengeIds = new Set();
58
+ }
59
+ created() {
60
+ return [...this.challengeIds];
61
+ }
62
+ track(repo) {
63
+ return new Proxy(repo, {
64
+ get: (target, property, receiver) => {
65
+ const value = Reflect.get(target, property, receiver);
66
+ if (property === 'createChallenge') {
67
+ return async (record) => {
68
+ this.challengeIds.add(record.id);
69
+ return value.call(target, record);
70
+ };
71
+ }
72
+ return typeof value === 'function' ? value.bind(target) : value;
73
+ },
74
+ });
75
+ }
76
+ challenge(overrides = {}) {
77
+ return {
78
+ id: (0, crypto_1.randomBytes)(32).toString('base64url'),
79
+ emailHash: hash(),
80
+ purposeHash: hash(),
81
+ codeHash: hash(),
82
+ attempts: 0,
83
+ consumedAt: null,
84
+ expiresAt: new Date(Math.floor(Date.now() / 1000) * 1000 + 600_000),
85
+ createdAt: new Date(Math.floor(Date.now() / 1000) * 1000),
86
+ ...overrides,
87
+ };
88
+ }
89
+ }
90
+ const hash = () => (0, crypto_1.randomBytes)(32).toString('hex');
91
+ function fail(check, detail) {
92
+ throw new EmailChallengeRepositoryContractError(check, detail);
93
+ }
94
+ const sameTime = (a, b) => a === b || (a instanceof Date && b instanceof Date && Math.abs(a.getTime() - b.getTime()) < 1000);
95
+ const CHECKS = [
96
+ [
97
+ 'a challenge round-trips every field',
98
+ async (repo, run, check) => {
99
+ const record = run.challenge();
100
+ await repo.createChallenge(record);
101
+ const got = await repo.findChallenge(record.id);
102
+ if (!got)
103
+ fail(check, 'findChallenge returned null for a challenge just created');
104
+ for (const key of ['id', 'emailHash', 'purposeHash', 'codeHash', 'attempts']) {
105
+ if (got[key] !== record[key]) {
106
+ fail(check, `${key} came back as ${JSON.stringify(got[key])}, stored ${JSON.stringify(record[key])}`);
107
+ }
108
+ }
109
+ if (got.consumedAt !== null) {
110
+ fail(check, `consumedAt came back as ${JSON.stringify(got.consumedAt)} for a live challenge; it must be null`);
111
+ }
112
+ if (!(got.expiresAt instanceof Date) || !sameTime(got.expiresAt, record.expiresAt)) {
113
+ fail(check, 'expiresAt changed, or is not a Date');
114
+ }
115
+ if (!(got.createdAt instanceof Date) || !sameTime(got.createdAt, record.createdAt)) {
116
+ fail(check, 'createdAt changed, or is not a Date');
117
+ }
118
+ },
119
+ ],
120
+ [
121
+ 'an unknown id answers null or false',
122
+ async (repo, _run, check) => {
123
+ const unknown = `unknown-${(0, crypto_1.randomUUID)()}`;
124
+ if ((await repo.findChallenge(unknown)) !== null)
125
+ fail(check, 'findChallenge did not return null');
126
+ if ((await repo.registerAttempt(unknown, MAX_ATTEMPTS)) !== false) {
127
+ fail(check, 'registerAttempt did not return false');
128
+ }
129
+ if ((await repo.consumeChallenge(unknown)) !== false)
130
+ fail(check, 'consumeChallenge did not return false');
131
+ },
132
+ ],
133
+ [
134
+ 'expired and consumed challenges are still found',
135
+ async (repo, run, check) => {
136
+ const expired = run.challenge({ expiresAt: new Date(Date.now() - 60_000) });
137
+ await repo.createChallenge(expired);
138
+ if (!(await repo.findChallenge(expired.id))) {
139
+ fail(check, 'findChallenge hid an expired challenge. Return it: the package checks expiresAt itself.');
140
+ }
141
+ const used = run.challenge();
142
+ await repo.createChallenge(used);
143
+ await repo.consumeChallenge(used.id);
144
+ const got = await repo.findChallenge(used.id);
145
+ if (!got)
146
+ fail(check, 'findChallenge hid a consumed challenge');
147
+ if (!(got.consumedAt instanceof Date)) {
148
+ fail(check, `consumedAt is ${JSON.stringify(got.consumedAt)} after consumeChallenge; it must be a Date`);
149
+ }
150
+ },
151
+ ],
152
+ [
153
+ 'attempts stop at the maximum',
154
+ async (repo, run, check) => {
155
+ const record = run.challenge();
156
+ await repo.createChallenge(record);
157
+ for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {
158
+ if ((await repo.registerAttempt(record.id, MAX_ATTEMPTS)) !== true) {
159
+ fail(check, `attempt ${attempt} of ${MAX_ATTEMPTS} was refused`);
160
+ }
161
+ }
162
+ if ((await repo.registerAttempt(record.id, MAX_ATTEMPTS)) !== false) {
163
+ fail(check, `attempt ${MAX_ATTEMPTS + 1} was counted; the maximum is ${MAX_ATTEMPTS}`);
164
+ }
165
+ const got = await repo.findChallenge(record.id);
166
+ if (got?.attempts !== MAX_ATTEMPTS) {
167
+ fail(check, `attempts is ${JSON.stringify(got?.attempts)} after ${MAX_ATTEMPTS} counted and one refused`);
168
+ }
169
+ },
170
+ ],
171
+ [
172
+ 'attempts stop at the maximum, under concurrency',
173
+ async (repo, run, check) => {
174
+ const record = run.challenge();
175
+ await repo.createChallenge(record);
176
+ const results = await Promise.all(Array.from({ length: CONCURRENCY }, () => repo.registerAttempt(record.id, MAX_ATTEMPTS)));
177
+ const counted = results.filter((r) => r === true).length;
178
+ if (counted !== MAX_ATTEMPTS) {
179
+ fail(check, `${counted} of ${CONCURRENCY} concurrent attempts were counted; exactly ${MAX_ATTEMPTS} must be. ` +
180
+ 'It must be one conditional update (UPDATE … SET attempts = attempts + 1 WHERE attempts < max), ' +
181
+ 'not a read then a write.');
182
+ }
183
+ const got = await repo.findChallenge(record.id);
184
+ if (got?.attempts !== MAX_ATTEMPTS) {
185
+ fail(check, `attempts is ${JSON.stringify(got?.attempts)} after ${CONCURRENCY} concurrent attempts`);
186
+ }
187
+ },
188
+ ],
189
+ [
190
+ 'a consumed challenge counts no attempt',
191
+ async (repo, run, check) => {
192
+ const record = run.challenge();
193
+ await repo.createChallenge(record);
194
+ await repo.consumeChallenge(record.id);
195
+ if ((await repo.registerAttempt(record.id, MAX_ATTEMPTS)) !== false) {
196
+ fail(check, 'registerAttempt counted an attempt on a consumed challenge');
197
+ }
198
+ },
199
+ ],
200
+ [
201
+ 'a challenge is consumed exactly once, under concurrency',
202
+ async (repo, run, check) => {
203
+ const record = run.challenge();
204
+ await repo.createChallenge(record);
205
+ const results = await Promise.all(Array.from({ length: CONCURRENCY }, () => repo.consumeChallenge(record.id)));
206
+ const winners = results.filter((r) => r === true).length;
207
+ if (winners !== 1) {
208
+ fail(check, `${winners} of ${CONCURRENCY} concurrent callers consumed the challenge; exactly one must. ` +
209
+ 'It must be one conditional update (UPDATE … WHERE consumedAt IS NULL), not a read then a write.');
210
+ }
211
+ if ((await repo.consumeChallenge(record.id)) !== false) {
212
+ fail(check, 'a consumed challenge was consumed again');
213
+ }
214
+ },
215
+ ],
216
+ [
217
+ 'invalidation is by purpose, and by address when given',
218
+ async (repo, run, check) => {
219
+ const emailHash = hash();
220
+ const purposeHash = hash();
221
+ const target = run.challenge({ emailHash, purposeHash });
222
+ const sameAddressOtherPurpose = run.challenge({ emailHash });
223
+ const otherAddressSamePurpose = run.challenge({ purposeHash });
224
+ for (const record of [target, sameAddressOtherPurpose, otherAddressSamePurpose]) {
225
+ await repo.createChallenge(record);
226
+ }
227
+ const live = async (record) => (await repo.findChallenge(record.id))?.consumedAt === null;
228
+ const narrowed = await repo.invalidateChallenges({ purposeHash, emailHash });
229
+ if (await live(target))
230
+ fail(check, 'the matching challenge is still live');
231
+ if (!(await live(sameAddressOtherPurpose))) {
232
+ fail(check, "it invalidated the same address's challenge for another purpose");
233
+ }
234
+ if (!(await live(otherAddressSamePurpose))) {
235
+ fail(check, "given an address, it invalidated another address's challenge for the same purpose");
236
+ }
237
+ if (narrowed !== 1)
238
+ fail(check, `with an address it reported ${JSON.stringify(narrowed)} invalidated; 1 matched`);
239
+ if ((await repo.consumeChallenge(target.id)) !== false) {
240
+ fail(check, 'an invalidated challenge could still be consumed');
241
+ }
242
+ const wide = await repo.invalidateChallenges({ purposeHash });
243
+ if (wide !== 1) {
244
+ fail(check, `without an address it reported ${JSON.stringify(wide)} invalidated; 1 live challenge matched`);
245
+ }
246
+ if (await live(otherAddressSamePurpose)) {
247
+ fail(check, 'without an address, a live challenge for the purpose survived');
248
+ }
249
+ if (!(await live(sameAddressOtherPurpose)))
250
+ fail(check, 'without an address, it invalidated another purpose');
251
+ },
252
+ ],
253
+ [
254
+ 'invalidation leaves consumed challenges as they were',
255
+ async (repo, run, check) => {
256
+ const purposeHash = hash();
257
+ const record = run.challenge({ purposeHash });
258
+ await repo.createChallenge(record);
259
+ await repo.consumeChallenge(record.id);
260
+ const before = (await repo.findChallenge(record.id))?.consumedAt;
261
+ const count = await repo.invalidateChallenges({ purposeHash });
262
+ if (count !== 0)
263
+ fail(check, `it reported ${JSON.stringify(count)} invalidated; the only match was already consumed`);
264
+ const after = (await repo.findChallenge(record.id))?.consumedAt;
265
+ if (!(after instanceof Date) || !sameTime(before, after))
266
+ fail(check, 'consumedAt of a consumed challenge changed');
267
+ },
268
+ ],
269
+ [
270
+ 'expired challenges are deleted, live ones kept',
271
+ async (repo, run, check) => {
272
+ const expired = run.challenge({ expiresAt: new Date(Date.now() - 60_000) });
273
+ const live = run.challenge();
274
+ await repo.createChallenge(expired);
275
+ await repo.createChallenge(live);
276
+ const deleted = await repo.deleteExpiredChallenges();
277
+ if (typeof deleted !== 'number' || deleted < 1) {
278
+ fail(check, `deleteExpiredChallenges returned ${JSON.stringify(deleted)}; at least one challenge had expired`);
279
+ }
280
+ if ((await repo.findChallenge(expired.id)) !== null)
281
+ fail(check, 'an expired challenge survived');
282
+ if ((await repo.findChallenge(live.id)) === null)
283
+ fail(check, 'a live challenge was deleted');
284
+ },
285
+ ],
286
+ ];
287
+ //# sourceMappingURL=email-challenge-repository.contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-challenge-repository.contract.js","sourceRoot":"","sources":["../../src/testing/email-challenge-repository.contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { IGuestSessionRepository } from '../interfaces/guest-session-repository.interface';
2
+ export declare class GuestSessionRepositoryContractError extends Error {
3
+ constructor(check: string, detail: string, options?: {
4
+ cause?: unknown;
5
+ });
6
+ }
7
+ export interface GuestSessionContractCreatedIds {
8
+ sessionIds: string[];
9
+ grantIds: string[];
10
+ }
11
+ export interface GuestSessionRepositoryContractOptions {
12
+ realms?: boolean;
13
+ cleanup?: (created: GuestSessionContractCreatedIds) => void | Promise<void>;
14
+ }
15
+ type Factory = () => IGuestSessionRepository | Promise<IGuestSessionRepository>;
16
+ export declare function assertGuestSessionRepositoryContract(factory: Factory, options?: GuestSessionRepositoryContractOptions): Promise<void>;
17
+ export {};
18
+ //# sourceMappingURL=guest-session-repository.contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guest-session-repository.contract.d.ts","sourceRoot":"","sources":["../../src/testing/guest-session-repository.contract.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,uBAAuB,EACxB,MAAM,kDAAkD,CAAC;AAG1D,qBAAa,mCAAoC,SAAQ,KAAK;gBAChD,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAOzE;AAGD,MAAM,WAAW,8BAA8B;IAC7C,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,qCAAqC;IAQpD,MAAM,CAAC,EAAE,OAAO,CAAC;IAYjB,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,8BAA8B,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7E;AAED,KAAK,OAAO,GAAG,MAAM,uBAAuB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;AAgDhF,wBAAsB,oCAAoC,CACxD,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,qCAA0C,GAClD,OAAO,CAAC,IAAI,CAAC,CA+Cf"}