@spinajs/email-verification-dynamodb 0.0.0-stage → 3.0.9
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/README.md +8 -2
- package/lib/cjs/index.d.ts +70 -0
- package/lib/cjs/index.d.ts.map +1 -0
- package/lib/cjs/index.js +354 -0
- package/lib/cjs/index.js.map +1 -0
- package/lib/cjs/package.json +1 -0
- package/lib/mjs/index.d.ts +70 -0
- package/lib/mjs/index.d.ts.map +1 -0
- package/lib/mjs/index.js +350 -0
- package/lib/mjs/index.js.map +1 -0
- package/lib/mjs/package.json +1 -0
- package/lib/tsconfig.cjs.tsbuildinfo +1 -0
- package/lib/tsconfig.mjs.tsbuildinfo +1 -0
- package/package.json +67 -4
package/lib/mjs/index.js
ADDED
|
@@ -0,0 +1,350 @@
|
|
|
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 { randomUUID } from 'node:crypto';
|
|
11
|
+
import { CreateTableCommand, DeleteItemCommand, DescribeTableCommand, DescribeTimeToLiveCommand, DynamoDBClient, GetItemCommand, PutItemCommand, UpdateTimeToLiveCommand, waitUntilTableExists } from '@aws-sdk/client-dynamodb';
|
|
12
|
+
import { Config } from '@spinajs/configuration';
|
|
13
|
+
import { Injectable } from '@spinajs/di';
|
|
14
|
+
import { EmailVerificationStore } from '@spinajs/email-verification';
|
|
15
|
+
import { InvalidOperation } from '@spinajs/exceptions';
|
|
16
|
+
import { Log, Logger } from '@spinajs/log';
|
|
17
|
+
class DamagedListError extends InvalidOperation {
|
|
18
|
+
}
|
|
19
|
+
// DynamoDB caps an item at 400 KB; the rest is headroom for the key and attribute names.
|
|
20
|
+
export const CHUNK_BYTES = 300_000;
|
|
21
|
+
export const INDEX_PK = 'S#index';
|
|
22
|
+
const VERSION_PK = 'L#version';
|
|
23
|
+
const TTL_ATTRIBUTE = 'ExpiresAt';
|
|
24
|
+
const MAX_ATTEMPTS = 5;
|
|
25
|
+
const BACKOFF_MS = 20;
|
|
26
|
+
const s = (value) => ({ S: value });
|
|
27
|
+
const n = (value) => ({ N: String(value) });
|
|
28
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
29
|
+
const errorName = (err) => err?.name;
|
|
30
|
+
const isConditionFailure = (err) => errorName(err) === 'ConditionalCheckFailedException';
|
|
31
|
+
const sourcePk = (kind, source) => `S#${kind}#${source}`;
|
|
32
|
+
const chunkPk = (kind, source, gen, i) => `C#${kind}#${source}#${gen}#${i}`;
|
|
33
|
+
const notExists = { ConditionExpression: 'attribute_not_exists(#pk)', ExpressionAttributeNames: { '#pk': 'pk' } };
|
|
34
|
+
const equals = (name, value) => ({ ConditionExpression: '#a = :v', ExpressionAttributeNames: { '#a': name }, ExpressionAttributeValues: { ':v': value } });
|
|
35
|
+
/** The live generation of a manifest and the one it replaced. */
|
|
36
|
+
const generationsOf = (manifest) => [{ gen: manifest.Gen.S, chunks: Number(manifest.Chunks.N) }, ...(manifest.PrevGen ? [{ gen: manifest.PrevGen.S, chunks: Number(manifest.PrevChunks.N) }] : [])];
|
|
37
|
+
export function chunkByBytes(domains, maxBytes) {
|
|
38
|
+
const chunks = [];
|
|
39
|
+
let current = [];
|
|
40
|
+
let size = 0;
|
|
41
|
+
for (const d of domains) {
|
|
42
|
+
const bytes = Buffer.byteLength(d) + 1;
|
|
43
|
+
if (current.length > 0 && size + bytes > maxBytes) {
|
|
44
|
+
chunks.push(current);
|
|
45
|
+
current = [];
|
|
46
|
+
size = 0;
|
|
47
|
+
}
|
|
48
|
+
current.push(d);
|
|
49
|
+
size += bytes;
|
|
50
|
+
}
|
|
51
|
+
if (current.length > 0)
|
|
52
|
+
chunks.push(current);
|
|
53
|
+
return chunks;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* DynamoDB store (AWS SDK v3), one table with the string hash key `pk`. It uses no Scan.
|
|
57
|
+
* Each list source is a manifest (`S#<kind>#<source>`: live `Gen` and `Chunks` count, the
|
|
58
|
+
* replaced `PrevGen` and `PrevChunks`) over chunk items of newline-joined domains, plus an
|
|
59
|
+
* index item of the sources. A write puts a new generation of chunks, compare-and-sets the
|
|
60
|
+
* manifest, then deletes the replaced generation and the one before it, so the next write
|
|
61
|
+
* reclaims what a writer that died after its swap left behind. An emptied source keeps a
|
|
62
|
+
* manifest of zero chunks and its index member: removing either could race a writer
|
|
63
|
+
* re-creating the source. A reader that finds a chunk missing has raced a write, and reads
|
|
64
|
+
* the manifest again.
|
|
65
|
+
*/
|
|
66
|
+
let DynamoDbEmailVerificationStore = class DynamoDbEmailVerificationStore extends EmailVerificationStore {
|
|
67
|
+
async resolve() {
|
|
68
|
+
this.Client = this.createClient(this.Options.config);
|
|
69
|
+
if (this.Options.createTable)
|
|
70
|
+
await this.ensureTable();
|
|
71
|
+
await super.resolve();
|
|
72
|
+
}
|
|
73
|
+
async dispose() {
|
|
74
|
+
this.Client?.destroy();
|
|
75
|
+
}
|
|
76
|
+
async getVerdict(verifier, domain) {
|
|
77
|
+
const item = await this.get(`V#${verifier}#${domain}`, false);
|
|
78
|
+
if (!item || Number(item.ExpiresAt.N) * 1000 <= Date.now())
|
|
79
|
+
return null;
|
|
80
|
+
return JSON.parse(item.Verdict.S);
|
|
81
|
+
}
|
|
82
|
+
async setVerdict(verifier, domain, verdict, ttlSeconds) {
|
|
83
|
+
if (ttlSeconds <= 0)
|
|
84
|
+
return;
|
|
85
|
+
await this.put({ pk: s(`V#${verifier}#${domain}`), Verdict: s(JSON.stringify(verdict)), ExpiresAt: n(Math.floor((Date.now() + ttlSeconds * 1000) / 1000)) });
|
|
86
|
+
}
|
|
87
|
+
async getMeta(key) {
|
|
88
|
+
return (await this.get(`M#${key}`))?.Value?.S ?? null;
|
|
89
|
+
}
|
|
90
|
+
async setMeta(key, value) {
|
|
91
|
+
await this.put({ pk: s(`M#${key}`), Value: s(value) });
|
|
92
|
+
}
|
|
93
|
+
async listVersion() {
|
|
94
|
+
return (await this.get(VERSION_PK))?.Value?.S ?? '0';
|
|
95
|
+
}
|
|
96
|
+
async loadLists() {
|
|
97
|
+
const entries = [];
|
|
98
|
+
for (const m of await this.indexMembers()) {
|
|
99
|
+
const at = m.indexOf('#');
|
|
100
|
+
const kind = m.slice(0, at);
|
|
101
|
+
const source = m.slice(at + 1);
|
|
102
|
+
let domains;
|
|
103
|
+
try {
|
|
104
|
+
domains = await this.readSource(kind, source);
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
if (!(err instanceof DamagedListError))
|
|
108
|
+
throw err;
|
|
109
|
+
this.Log.warn(`${err.message}; skipped`);
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (domains === null) {
|
|
113
|
+
this.Log.warn(`Email domain list ${kind}#${source} stayed unreadable through ${MAX_ATTEMPTS} reads; skipped`);
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
for (const domain of domains)
|
|
117
|
+
entries.push({ domain, kind, source });
|
|
118
|
+
}
|
|
119
|
+
return entries;
|
|
120
|
+
}
|
|
121
|
+
async upsertEntries(entries) {
|
|
122
|
+
const groups = new Map();
|
|
123
|
+
for (const e of entries) {
|
|
124
|
+
const key = `${e.kind}#${e.source}`;
|
|
125
|
+
const group = groups.get(key) ?? { kind: e.kind, source: e.source, domains: [] };
|
|
126
|
+
group.domains.push(e.domain);
|
|
127
|
+
groups.set(key, group);
|
|
128
|
+
}
|
|
129
|
+
for (const g of groups.values())
|
|
130
|
+
await this.mutateSource(g.kind, g.source, (current) => new Set([...current, ...g.domains]));
|
|
131
|
+
}
|
|
132
|
+
async removeEntries(kind, domains, source) {
|
|
133
|
+
await this.mutateSource(kind, source, (current) => {
|
|
134
|
+
domains.forEach((d) => current.delete(d));
|
|
135
|
+
return current;
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
async replaceSource(source, kind, domains) {
|
|
139
|
+
await this.mutateSource(kind, source, () => new Set(domains), false);
|
|
140
|
+
}
|
|
141
|
+
createClient(cfg) {
|
|
142
|
+
return new DynamoDBClient(cfg);
|
|
143
|
+
}
|
|
144
|
+
async mutateSource(kind, source, change, readCurrent = true) {
|
|
145
|
+
for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {
|
|
146
|
+
if (attempt > 0)
|
|
147
|
+
await sleep(BACKOFF_MS * attempt);
|
|
148
|
+
const manifest = await this.get(sourcePk(kind, source));
|
|
149
|
+
let current = [];
|
|
150
|
+
if (manifest && readCurrent) {
|
|
151
|
+
const read = await this.readChunks(kind, source, manifest);
|
|
152
|
+
if (read === null)
|
|
153
|
+
continue;
|
|
154
|
+
current = read;
|
|
155
|
+
}
|
|
156
|
+
const chunks = chunkByBytes([...change(new Set(current))], CHUNK_BYTES);
|
|
157
|
+
const gen = randomUUID();
|
|
158
|
+
await this.putChunks(kind, source, gen, chunks);
|
|
159
|
+
if (!(await this.swapManifest(kind, source, manifest, gen, chunks.length))) {
|
|
160
|
+
await this.dropGenerations(kind, source, [{ gen, chunks: chunks.length }]);
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
await this.settleSwap(kind, source, manifest, chunks.length > 0);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
throw new InvalidOperation(`email domain list ${kind}#${source} kept changing during ${MAX_ATTEMPTS} writes`);
|
|
167
|
+
}
|
|
168
|
+
// A crash during these puts leaks the generation: no manifest names it yet.
|
|
169
|
+
async putChunks(kind, source, gen, chunks) {
|
|
170
|
+
for (const [i, part] of chunks.entries()) {
|
|
171
|
+
try {
|
|
172
|
+
await this.put({ pk: s(chunkPk(kind, source, gen, i)), Domains: s(part.join('\n')) });
|
|
173
|
+
}
|
|
174
|
+
catch (err) {
|
|
175
|
+
await this.dropGenerations(kind, source, [{ gen, chunks: i + 1 }]);
|
|
176
|
+
throw err;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* true when the manifest now names `gen` (or named it before a later writer replaced it).
|
|
182
|
+
* A failure with an unknown outcome is rethrown and keeps the chunks, as the put may still land.
|
|
183
|
+
*/
|
|
184
|
+
async swapManifest(kind, source, old, gen, chunks) {
|
|
185
|
+
if (!old && chunks === 0)
|
|
186
|
+
return true;
|
|
187
|
+
const item = { pk: s(sourcePk(kind, source)), Gen: s(gen), Chunks: n(chunks), ...(old ? { PrevGen: old.Gen, PrevChunks: old.Chunks } : {}) };
|
|
188
|
+
try {
|
|
189
|
+
await this.put(item, old ? equals('Gen', old.Gen) : notExists);
|
|
190
|
+
return true;
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
// The put can commit while the client sees an error, e.g. a retry failing on the put's own effect.
|
|
194
|
+
let now;
|
|
195
|
+
try {
|
|
196
|
+
now = await this.get(sourcePk(kind, source));
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
throw err;
|
|
200
|
+
}
|
|
201
|
+
// Two or more writers can swap between our committed put and this read: our change is then replayed on top of theirs.
|
|
202
|
+
if (now?.Gen.S === gen || now?.PrevGen?.S === gen)
|
|
203
|
+
return true;
|
|
204
|
+
if (isConditionFailure(err))
|
|
205
|
+
return false;
|
|
206
|
+
throw err;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/** Runs every step even when one fails, then rethrows the first failure. */
|
|
210
|
+
async settleSwap(kind, source, replaced, live) {
|
|
211
|
+
const failures = [];
|
|
212
|
+
// The index goes first: an instance that sees the new version must find the source in it.
|
|
213
|
+
if (live)
|
|
214
|
+
await this.addToIndex(`${kind}#${source}`).catch((err) => failures.push(err));
|
|
215
|
+
await this.put({ pk: s(VERSION_PK), Value: s(randomUUID()) }).catch((err) => failures.push(err));
|
|
216
|
+
if (replaced)
|
|
217
|
+
await this.dropGenerations(kind, source, generationsOf(replaced));
|
|
218
|
+
if (failures.length > 0)
|
|
219
|
+
throw failures[0];
|
|
220
|
+
}
|
|
221
|
+
/** null when the source stayed unreadable through every retry. */
|
|
222
|
+
async readSource(kind, source) {
|
|
223
|
+
for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {
|
|
224
|
+
if (attempt > 0)
|
|
225
|
+
await sleep(BACKOFF_MS * attempt);
|
|
226
|
+
const manifest = await this.get(sourcePk(kind, source));
|
|
227
|
+
if (!manifest)
|
|
228
|
+
return [];
|
|
229
|
+
const domains = await this.readChunks(kind, source, manifest);
|
|
230
|
+
if (domains !== null)
|
|
231
|
+
return domains;
|
|
232
|
+
}
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
235
|
+
/** null when a chunk is gone because a writer replaced this generation during the read; throws when the manifest is unchanged, i.e. the data is damaged. */
|
|
236
|
+
async readChunks(kind, source, manifest) {
|
|
237
|
+
const domains = [];
|
|
238
|
+
for (let i = 0; i < Number(manifest.Chunks.N); i++) {
|
|
239
|
+
const chunk = await this.get(chunkPk(kind, source, manifest.Gen.S, i));
|
|
240
|
+
if (!chunk) {
|
|
241
|
+
const now = await this.get(sourcePk(kind, source));
|
|
242
|
+
if (now?.Gen.S !== manifest.Gen.S)
|
|
243
|
+
return null;
|
|
244
|
+
throw new DamagedListError(`email domain list ${sourcePk(kind, source)} is damaged (chunk ${i} of generation ${manifest.Gen.S} is missing); delete that item to reset the source`);
|
|
245
|
+
}
|
|
246
|
+
domains.push(...chunk.Domains.S.split('\n'));
|
|
247
|
+
}
|
|
248
|
+
return domains;
|
|
249
|
+
}
|
|
250
|
+
/** Best effort: a generation left behind here is reclaimed by a later write to the source. */
|
|
251
|
+
async dropGenerations(kind, source, generations) {
|
|
252
|
+
for (const { gen, chunks } of generations) {
|
|
253
|
+
try {
|
|
254
|
+
for (let i = 0; i < chunks; i++) {
|
|
255
|
+
await this.Client.send(new DeleteItemCommand({ TableName: this.Options.table, Key: { pk: s(chunkPk(kind, source, gen, i)) } }));
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
catch (err) {
|
|
259
|
+
this.Log.warn(err, `Could not drop generation ${gen} of email domain list ${kind}#${source}`);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
async indexMembers() {
|
|
264
|
+
const index = await this.get(INDEX_PK);
|
|
265
|
+
return index ? JSON.parse(index.Sources.S) : [];
|
|
266
|
+
}
|
|
267
|
+
async addToIndex(member) {
|
|
268
|
+
for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {
|
|
269
|
+
if (attempt > 0)
|
|
270
|
+
await sleep(BACKOFF_MS * attempt);
|
|
271
|
+
const index = await this.get(INDEX_PK);
|
|
272
|
+
const members = new Set(index ? JSON.parse(index.Sources.S) : []);
|
|
273
|
+
if (members.has(member))
|
|
274
|
+
return;
|
|
275
|
+
members.add(member);
|
|
276
|
+
try {
|
|
277
|
+
await this.put({ pk: s(INDEX_PK), Sources: s(JSON.stringify([...members].sort())), Ver: s(randomUUID()) }, index ? equals('Ver', index.Ver) : notExists);
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
catch (err) {
|
|
281
|
+
if (!isConditionFailure(err))
|
|
282
|
+
throw err;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
throw new InvalidOperation(`email domain list index kept changing during ${MAX_ATTEMPTS} writes`);
|
|
286
|
+
}
|
|
287
|
+
async get(pk, consistent = true) {
|
|
288
|
+
return (await this.Client.send(new GetItemCommand({ TableName: this.Options.table, Key: { pk: s(pk) }, ConsistentRead: consistent }))).Item;
|
|
289
|
+
}
|
|
290
|
+
async put(item, condition) {
|
|
291
|
+
await this.Client.send(new PutItemCommand({ TableName: this.Options.table, Item: item, ...condition }));
|
|
292
|
+
}
|
|
293
|
+
async ensureTable() {
|
|
294
|
+
const TableName = this.Options.table;
|
|
295
|
+
try {
|
|
296
|
+
await this.Client.send(new DescribeTableCommand({ TableName }));
|
|
297
|
+
}
|
|
298
|
+
catch (err) {
|
|
299
|
+
if (errorName(err) !== 'ResourceNotFoundException')
|
|
300
|
+
throw err;
|
|
301
|
+
await this.createTable();
|
|
302
|
+
}
|
|
303
|
+
await waitUntilTableExists({ client: this.Client, maxWaitTime: 120 }, { TableName });
|
|
304
|
+
const ttl = (await this.Client.send(new DescribeTimeToLiveCommand({ TableName }))).TimeToLiveDescription;
|
|
305
|
+
if (ttl?.TimeToLiveStatus === 'ENABLED' || ttl?.TimeToLiveStatus === 'ENABLING') {
|
|
306
|
+
if (ttl.AttributeName !== TTL_ATTRIBUTE)
|
|
307
|
+
this.Log.warn(`Table ${TableName} expires items by ${ttl.AttributeName}, not ${TTL_ATTRIBUTE}: expired verdicts stay in the table`);
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
await this.enableTtl();
|
|
311
|
+
}
|
|
312
|
+
async createTable() {
|
|
313
|
+
try {
|
|
314
|
+
await this.Client.send(new CreateTableCommand({
|
|
315
|
+
TableName: this.Options.table,
|
|
316
|
+
AttributeDefinitions: [{ AttributeName: 'pk', AttributeType: 'S' }],
|
|
317
|
+
KeySchema: [{ AttributeName: 'pk', KeyType: 'HASH' }],
|
|
318
|
+
BillingMode: 'PAY_PER_REQUEST',
|
|
319
|
+
}));
|
|
320
|
+
}
|
|
321
|
+
catch (err) {
|
|
322
|
+
// Another instance booting at the same time created it first.
|
|
323
|
+
if (errorName(err) !== 'ResourceInUseException')
|
|
324
|
+
throw err;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
async enableTtl() {
|
|
328
|
+
try {
|
|
329
|
+
await this.Client.send(new UpdateTimeToLiveCommand({ TableName: this.Options.table, TimeToLiveSpecification: { AttributeName: TTL_ATTRIBUTE, Enabled: true } }));
|
|
330
|
+
}
|
|
331
|
+
catch (err) {
|
|
332
|
+
// Another instance booting at the same time enabled it first.
|
|
333
|
+
if (errorName(err) !== 'ValidationException' || !/already enabled/i.test(err.message))
|
|
334
|
+
throw err;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
};
|
|
338
|
+
__decorate([
|
|
339
|
+
Config('emailVerification.dynamodb'),
|
|
340
|
+
__metadata("design:type", Object)
|
|
341
|
+
], DynamoDbEmailVerificationStore.prototype, "Options", void 0);
|
|
342
|
+
__decorate([
|
|
343
|
+
Logger('email-verification'),
|
|
344
|
+
__metadata("design:type", Log)
|
|
345
|
+
], DynamoDbEmailVerificationStore.prototype, "Log", void 0);
|
|
346
|
+
DynamoDbEmailVerificationStore = __decorate([
|
|
347
|
+
Injectable(EmailVerificationStore)
|
|
348
|
+
], DynamoDbEmailVerificationStore);
|
|
349
|
+
export { DynamoDbEmailVerificationStore };
|
|
350
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"module"}
|