better-auth-elasticsearch 0.2.0 → 0.3.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unique-reservations.js","sourceRoot":"","sources":["../src/unique-reservations.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "better-auth-elasticsearch",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Elasticsearch database adapter for Better Auth",
5
5
  "keywords": [
6
6
  "better-auth",
@@ -60,7 +60,7 @@
60
60
  "typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.es8.json --noEmit",
61
61
  "test": "vitest run",
62
62
  "test:watch": "vitest",
63
- "test:integration": "BETTER_AUTH_FORCE_ELASTIC_TESTS=true vitest run test/elasticsearch-adapter.test.mjs test/mappings.test.mjs test/migrate.test.mjs test/purge.test.mjs",
63
+ "test:integration": "BETTER_AUTH_FORCE_ELASTIC_TESTS=true vitest run test/elasticsearch-adapter.test.mjs test/mappings.test.mjs test/migrate.test.mjs test/purge.test.mjs test/unique-reservations.test.mjs",
64
64
  "lint": "biome check .",
65
65
  "lint:fix": "biome check . --write",
66
66
  "format": "biome format . --write",
@@ -25,6 +25,11 @@ import {
25
25
  migrateAliasedIndex,
26
26
  } from "./index-layout.js";
27
27
  import { MIGRATOR, type MigratedModel, type Migrator } from "./migrate.js";
28
+ import {
29
+ type DuplicateValues,
30
+ createReservations,
31
+ duplicateError,
32
+ } from "./unique-reservations.js";
28
33
  import { whereToQuery } from "./where-to-query.js";
29
34
 
30
35
  type Primitive = string | number | boolean | Date | null;
@@ -67,6 +72,17 @@ export interface ElasticsearchAdapterConfig {
67
72
  numberOfShards?: number;
68
73
  /** Replicas of each index the adapter creates (default 0). */
69
74
  numberOfReplicas?: number;
75
+ /**
76
+ * Unique fields left unenforced, as `"model.field"` in better-auth schema
77
+ * names, or `"model.fieldA+fieldB"` for a unique index over several fields,
78
+ * in index order (default `["session.token"]`: the token is random, and
79
+ * reserving it would slow every sign-in). A list given here replaces the
80
+ * default, so include `"session.token"` to keep skipping it. Every other
81
+ * field the schema declares unique, and every unique index, gets a
82
+ * reservation per value, which costs an extra request per write that sets
83
+ * or frees one.
84
+ */
85
+ skipUniqueFor?: string[];
70
86
  }
71
87
 
72
88
  /**
@@ -157,6 +173,15 @@ export const elasticsearchAdapter = (
157
173
  const whileMigrating = <T>(index: string, operation: () => Promise<T>) =>
158
174
  waitOutWriteBlock(writeBlockTimeoutMs, index, operation);
159
175
 
176
+ const reservations = createReservations({
177
+ client,
178
+ schema,
179
+ getDefaultModelName,
180
+ skipUniqueFor: config.skipUniqueFor ?? ["session.token"],
181
+ settings: indexSettings,
182
+ withRetry,
183
+ });
184
+
160
185
  // Elasticsearch index and alias names must be lowercase.
161
186
  const indexForModel = (model: string) =>
162
187
  (prefix ? `${prefix}_${model}` : model).toLowerCase();
@@ -214,7 +239,18 @@ export const elasticsearchAdapter = (
214
239
  entry.fromDeleted = true;
215
240
  }
216
241
  }
217
- return { migrated };
242
+ // Every run, so rows written before their model had reservations, or
243
+ // while a field was in `skipUniqueFor`, get them.
244
+ const duplicates: DuplicateValues[] = [];
245
+ for (const [model, table] of Object.entries(schema)) {
246
+ duplicates.push(
247
+ ...(await reservations.backfill(
248
+ model,
249
+ indexForModel(table.modelName),
250
+ )),
251
+ );
252
+ }
253
+ return { migrated, duplicates };
218
254
  };
219
255
 
220
256
  /**
@@ -315,6 +351,140 @@ export const elasticsearchAdapter = (
315
351
  };
316
352
  };
317
353
 
354
+ /**
355
+ * Writes every row matching `query` with `writePage`, a page of rows at
356
+ * a time, and returns how many it wrote. `writePage` sends one bulk
357
+ * request whose writes are conditional on each row being unchanged
358
+ * since the search, and returns its items in the order of the rows.
359
+ *
360
+ * Not a by-query write: that skips rows that change under it, and since
361
+ * updated rows usually still match, a rerun cannot tell the skipped
362
+ * rows from the ones it already updated. Instead only the rows that lost
363
+ * that race are searched for again, so every row is written and counted
364
+ * once. A row whose write Elasticsearch rejected under load, or refused
365
+ * while migrate() moves the index, was not written and goes again the
366
+ * same way.
367
+ */
368
+ const writeMatchingRows = async ({
369
+ model,
370
+ index,
371
+ query,
372
+ operation,
373
+ source,
374
+ writePage,
375
+ }: {
376
+ model: string;
377
+ index: string;
378
+ query: object;
379
+ operation: "updateMany" | "deleteMany";
380
+ /** The stored fields `writePage` needs, or false for none. */
381
+ source: string[] | false;
382
+ writePage: (
383
+ hits: estypes.SearchHit<SourceDoc>[],
384
+ ) => Promise<(estypes.BulkResponseItem | undefined)[]>;
385
+ }) => {
386
+ const [writing, written] =
387
+ operation === "updateMany"
388
+ ? ["updating", "updated"]
389
+ : ["deleting", "deleted"];
390
+ let count = 0;
391
+ let retryIds: string[] | undefined;
392
+ // Passes that waited out a write block do not count towards
393
+ // MAX_MANY_PASSES; the write block timeout bounds them instead.
394
+ const pauseWhileBlocked = writeBlockWaiter(writeBlockTimeoutMs, index);
395
+ let pass = 0;
396
+ while (pass < MAX_MANY_PASSES) {
397
+ const passQuery = retryIds
398
+ ? { bool: { filter: [query, { ids: { values: retryIds } }] } }
399
+ : query;
400
+ const unwrittenIds: string[] = [];
401
+ let rejected = false;
402
+ let blockedBy: unknown;
403
+
404
+ // Paging by id needs no point in time: ids are unique and never
405
+ // change, so no row is read twice, and a row that changes on a
406
+ // later page is read as changed.
407
+ let searchAfter: estypes.SortResults | undefined;
408
+ while (true) {
409
+ const page = await withRetry(() =>
410
+ client.search<SourceDoc>({
411
+ index,
412
+ query: passQuery,
413
+ size: UPDATE_MANY_PAGE_SIZE,
414
+ sort: [{ id: "asc" }],
415
+ search_after: searchAfter,
416
+ _source: source,
417
+ seq_no_primary_term: true,
418
+ track_total_hits: false,
419
+ }),
420
+ );
421
+ const hits = page.hits.hits;
422
+ if (hits.length === 0) break;
423
+ searchAfter = hits[hits.length - 1]?.sort;
424
+
425
+ // Not retried, like the other conditional writes. Each row is
426
+ // written to the index it was read from, as in `findVersioned`.
427
+ for (const outcome of await writePage(hits)) {
428
+ if (isWriteBlocked(outcome) && outcome?._id) {
429
+ unwrittenIds.push(outcome._id);
430
+ blockedBy = outcome.error;
431
+ } else if (
432
+ (outcome?.status === 409 || outcome?.status === 429) &&
433
+ outcome._id
434
+ ) {
435
+ unwrittenIds.push(outcome._id);
436
+ rejected ||= outcome.status === 429;
437
+ } else if (outcome?.status === 404) {
438
+ // Another request deleted the row.
439
+ } else if (!outcome || outcome.error) {
440
+ throw new Error(
441
+ `${operation} on "${model}" failed after ${writing} ${count} rows: ${outcome?.error?.reason ?? outcome?.error?.type ?? "unexpected bulk response"}`,
442
+ );
443
+ } else {
444
+ count++;
445
+ }
446
+ }
447
+ if (hits.length < UPDATE_MANY_PAGE_SIZE) break;
448
+ }
449
+
450
+ if (unwrittenIds.length === 0) return count;
451
+ retryIds = unwrittenIds;
452
+ // Make the writes that won searchable, so the next pass sees
453
+ // whether those rows still match and what to condition on. Even
454
+ // with "immediate" refresh a winner may not have refreshed yet.
455
+ await withRetry(() => client.indices.refresh({ index }));
456
+ if (blockedBy) {
457
+ await pauseWhileBlocked(
458
+ blockedBy,
459
+ `${operation} on "${model}" had ${written} ${count} rows.`,
460
+ );
461
+ continue;
462
+ }
463
+ // Give an overloaded cluster a growing, jittered while to drain.
464
+ if (rejected) await wait((0.5 + Math.random()) * 50 * 2 ** pass);
465
+ pass++;
466
+ }
467
+ throw new Error(
468
+ `${operation} on "${model}" ${written} ${count} rows, but the remaining matching rows could not be written in ${MAX_MANY_PASSES} passes: other requests kept changing them or Elasticsearch kept rejecting the writes`,
469
+ );
470
+ };
471
+
472
+ /** The conditional bulk action that writes `hit` where it was read. */
473
+ const ifUnchanged = (hit: estypes.SearchHit<SourceDoc>) => ({
474
+ _index: hit._index,
475
+ _id: hit._id,
476
+ if_seq_no: hit._seq_no,
477
+ if_primary_term: hit._primary_term,
478
+ });
479
+
480
+ /** The ids of the rows whose bulk item says they were written. */
481
+ const writtenIds = (outcomes: (estypes.BulkResponseItem | undefined)[]) =>
482
+ outcomes.flatMap((outcome) =>
483
+ outcome?._id && !outcome.error && outcome.status < 300
484
+ ? [outcome._id]
485
+ : [],
486
+ );
487
+
318
488
  return {
319
489
  options: { [MIGRATOR]: migrator },
320
490
  createSchema,
@@ -344,6 +514,9 @@ export const elasticsearchAdapter = (
344
514
  ...row.ifUnchanged,
345
515
  refresh,
346
516
  });
517
+ await reservations.release(model, index, [
518
+ { id: row.id, source: row.source },
519
+ ]);
347
520
  return normalizeHit({
348
521
  _id: row.id,
349
522
  _source: row.source,
@@ -378,6 +551,14 @@ export const elasticsearchAdapter = (
378
551
  increment: Record<string, number>;
379
552
  set?: Record<string, unknown>;
380
553
  }) => {
554
+ // Claiming a value needs the row's current one, which the scripted
555
+ // update never reads back before it writes.
556
+ const unique = set && reservations.constrainedFieldIn(model, set);
557
+ if (unique) {
558
+ throw new Error(
559
+ `incrementOne cannot set "${unique}" on "${model}", as it is a unique field; use update instead.`,
560
+ );
561
+ }
381
562
  const index = await ensureAlias(model);
382
563
  const query = queryFor(model, where);
383
564
  const params = { increment, set: set ?? {} };
@@ -440,17 +621,49 @@ export const elasticsearchAdapter = (
440
621
  id,
441
622
  };
442
623
 
624
+ const write = () =>
625
+ withRetry(() =>
626
+ client.index({
627
+ index,
628
+ id,
629
+ op_type: "create",
630
+ refresh,
631
+ document: source,
632
+ }),
633
+ );
634
+ const values = reservations.valuesOf(model, source);
635
+ const claims =
636
+ values.length > 0 ? reservations.claims(model, index) : undefined;
637
+
443
638
  try {
444
- await whileMigrating(index, () =>
445
- withRetry(() =>
446
- client.index({
447
- index,
448
- id,
449
- op_type: "create",
450
- refresh,
451
- document: source,
452
- }),
453
- ),
639
+ await whileMigrating<unknown>(
640
+ index,
641
+ claims
642
+ ? async () => {
643
+ // Claimed again on a rerun, which re-stamps the claims.
644
+ await claims.claim([{ id, claim: values }]);
645
+ try {
646
+ await write();
647
+ } catch (error) {
648
+ await claims.failed(id, error);
649
+ throw error;
650
+ }
651
+ // A row written long after its claim may have lost a
652
+ // value to another write taking it for an orphan.
653
+ const lost = await claims.lost();
654
+ if (lost !== undefined) {
655
+ await whileMigrating(index, () =>
656
+ withRetry(() =>
657
+ client.delete({ index, id, refresh }),
658
+ ).catch((error) => {
659
+ if (!isNotFound(error)) throw error;
660
+ }),
661
+ );
662
+ await claims.unwritten([id]);
663
+ throw duplicateError(model, lost);
664
+ }
665
+ }
666
+ : write,
454
667
  );
455
668
  } catch (error) {
456
669
  if (isVersionConflict(error)) {
@@ -562,6 +775,10 @@ export const elasticsearchAdapter = (
562
775
  const index = await ensureAlias(model);
563
776
  const query = queryFor(model, where);
564
777
 
778
+ // Created once, so a rerun after a write block knows which of its
779
+ // claims an earlier run created.
780
+ const claims = reservations.claims(model, index);
781
+
565
782
  // Conditional on the row read, so a blocked write reads again.
566
783
  return whileMigrating(index, async () => {
567
784
  const row = await findVersioned(index, query);
@@ -573,14 +790,28 @@ export const elasticsearchAdapter = (
573
790
  id: (row.source.id as string | undefined) ?? row.id,
574
791
  };
575
792
 
576
- await withRetry(() =>
577
- client.index({
578
- id: row.id,
579
- document: mergedDocument,
580
- ...row.ifUnchanged,
581
- refresh,
582
- }),
793
+ const change = reservations.changeOf(
794
+ model,
795
+ row.id,
796
+ row.source,
797
+ update as SourceDoc,
583
798
  );
799
+ if (change) await claims.claim([change]);
800
+
801
+ try {
802
+ await withRetry(() =>
803
+ client.index({
804
+ id: row.id,
805
+ document: mergedDocument,
806
+ ...row.ifUnchanged,
807
+ refresh,
808
+ }),
809
+ );
810
+ } catch (error) {
811
+ if (change) await claims.failed(row.id, error);
812
+ throw error;
813
+ }
814
+ if (change) await claims.written([row.id]);
584
815
 
585
816
  return mergedDocument as T;
586
817
  });
@@ -602,114 +833,62 @@ export const elasticsearchAdapter = (
602
833
  source: SET_FIELDS_SCRIPT,
603
834
  params: { fields: update },
604
835
  };
836
+ const writeRows = async (hits: estypes.SearchHit<SourceDoc>[]) => {
837
+ const result = await client.bulk({
838
+ index,
839
+ refresh,
840
+ operations: hits.flatMap((hit) => [
841
+ { update: ifUnchanged(hit) },
842
+ { script },
843
+ ]),
844
+ });
845
+ return result.items.map((item) => item.update);
846
+ };
605
847
 
606
- // Not an update-by-query: it skips rows that change under it, and
607
- // since updated rows usually still match, a rerun cannot tell the
608
- // skipped rows from the ones it already updated. Instead each row
609
- // is updated only if unchanged since the search found it, and only
610
- // the rows that lost that race are searched for again, so every
611
- // row is updated and counted once. A row whose write Elasticsearch
612
- // rejected under load, or refused while migrate() moves the index,
613
- // was not written and goes again the same way.
614
- let updated = 0;
615
- let retryIds: string[] | undefined;
616
- // Passes that waited out a write block do not count towards
617
- // MAX_MANY_PASSES; the write block timeout bounds them instead.
618
- const pauseWhileBlocked = writeBlockWaiter(
619
- writeBlockTimeoutMs,
620
- index,
621
- );
622
- let pass = 0;
623
- while (pass < MAX_MANY_PASSES) {
624
- const passQuery = retryIds
625
- ? { bool: { filter: [query, { ids: { values: retryIds } }] } }
626
- : query;
627
- const unwrittenIds: string[] = [];
628
- let rejected = false;
629
- let blockedBy: unknown;
630
-
631
- // Paging by id needs no point in time: ids are unique and never
632
- // change, so no row is read twice, and a row that changes on a
633
- // later page is read as changed.
634
- let searchAfter: estypes.SortResults | undefined;
635
- while (true) {
636
- const page = await withRetry(() =>
637
- client.search({
638
- index,
639
- query: passQuery,
640
- size: UPDATE_MANY_PAGE_SIZE,
641
- sort: [{ id: "asc" }],
642
- search_after: searchAfter,
643
- _source: false,
644
- seq_no_primary_term: true,
645
- track_total_hits: false,
646
- }),
647
- );
648
- const hits = page.hits.hits;
649
- if (hits.length === 0) break;
650
- searchAfter = hits[hits.length - 1]?.sort;
848
+ // Every field of a unique index the update touches, since the new
849
+ // combination includes the fields it leaves alone.
850
+ const unique = reservations.fieldsOf(model, update);
851
+ if (unique.length === 0) {
852
+ return writeMatchingRows({
853
+ model,
854
+ index,
855
+ query,
856
+ operation: "updateMany",
857
+ source: false,
858
+ writePage: writeRows,
859
+ });
860
+ }
651
861
 
652
- // Not retried, like the other conditional writes. Each row is
653
- // written to the index it was read from, as in `findVersioned`.
654
- const result = await client.bulk({
655
- index,
656
- refresh,
657
- operations: hits.flatMap((hit) => [
658
- {
659
- update: {
660
- _index: hit._index,
661
- _id: hit._id,
662
- if_seq_no: hit._seq_no,
663
- if_primary_term: hit._primary_term,
664
- },
665
- },
666
- { script },
667
- ]),
862
+ // Each page's rows claim their new values in one request before
863
+ // they are written, and release their old ones in one after.
864
+ return writeMatchingRows({
865
+ model,
866
+ index,
867
+ query,
868
+ operation: "updateMany",
869
+ source: unique,
870
+ writePage: async (hits) => {
871
+ const changes = hits.flatMap((hit) => {
872
+ const change = hit._id
873
+ ? reservations.changeOf(model, hit._id, hit._source, update)
874
+ : undefined;
875
+ return change ? [change] : [];
668
876
  });
669
- for (const item of result.items) {
670
- const outcome = item.update;
671
- if (isWriteBlocked(outcome) && outcome?._id) {
672
- unwrittenIds.push(outcome._id);
673
- blockedBy = outcome.error;
674
- } else if (
675
- (outcome?.status === 409 || outcome?.status === 429) &&
676
- outcome._id
677
- ) {
678
- unwrittenIds.push(outcome._id);
679
- rejected ||= outcome.status === 429;
680
- } else if (outcome?.status === 404) {
681
- // Another request deleted the row.
682
- } else if (!outcome || outcome.error) {
683
- throw new Error(
684
- `updateMany on "${model}" failed after updating ${updated} rows: ${outcome?.error?.reason ?? outcome?.error?.type ?? "unexpected bulk response"}`,
685
- );
686
- } else {
687
- updated++;
688
- }
689
- }
690
- if (hits.length < UPDATE_MANY_PAGE_SIZE) break;
691
- }
692
-
693
- if (unwrittenIds.length === 0) return updated;
694
- retryIds = unwrittenIds;
695
- // Make the writes that won searchable, so the next pass sees
696
- // whether those rows still match and what to condition on. Even
697
- // with "immediate" refresh a winner may not have refreshed yet.
698
- await withRetry(() => client.indices.refresh({ index }));
699
- if (blockedBy) {
700
- await pauseWhileBlocked(
701
- blockedBy,
702
- `updateMany on "${model}" had updated ${updated} rows.`,
877
+ const claims = reservations.claims(model, index);
878
+ await claims.claim(changes);
879
+ const outcomes = await writeRows(hits);
880
+ const written = new Set(writtenIds(outcomes));
881
+ await claims.written(written);
882
+ // Bulk items are not retried, so a row reported unwritten was
883
+ // not written; a later pass claims its values again.
884
+ await claims.unwritten(
885
+ changes
886
+ .map((change) => change.id)
887
+ .filter((id) => !written.has(id)),
703
888
  );
704
- continue;
705
- }
706
- // Give an overloaded cluster a growing, jittered while to drain.
707
- if (rejected) await wait((0.5 + Math.random()) * 50 * 2 ** pass);
708
- pass++;
709
- }
710
- throw new Error(
711
- `updateMany on "${model}" updated ${updated} rows, but the remaining matching rows could not be written in ${MAX_MANY_PASSES} passes: other requests kept changing them or Elasticsearch kept rejecting the writes`,
712
- );
889
+ return outcomes;
890
+ },
891
+ });
713
892
  },
714
893
  delete: async ({
715
894
  model,
@@ -723,14 +902,14 @@ export const elasticsearchAdapter = (
723
902
  const index = await ensureAlias(model);
724
903
  const query = queryFor(model, where);
725
904
 
726
- await whileMigrating(index, async () => {
905
+ const deleted = await whileMigrating(index, async () => {
727
906
  const searchResult = await withRetry(() =>
728
907
  client.search<SourceDoc>({ index, query, size: 1 }),
729
908
  );
730
909
 
731
910
  const hit = searchResult.hits.hits[0];
732
911
  const hitId = hit?._id;
733
- if (!hit || !hitId) return;
912
+ if (!hit || !hitId) return undefined;
734
913
 
735
914
  await withRetry(() =>
736
915
  client.delete({
@@ -739,7 +918,9 @@ export const elasticsearchAdapter = (
739
918
  refresh,
740
919
  }),
741
920
  );
921
+ return { id: hitId, source: hit._source };
742
922
  });
923
+ if (deleted) await reservations.release(model, index, [deleted]);
743
924
  },
744
925
  deleteMany: async ({
745
926
  model,
@@ -751,6 +932,39 @@ export const elasticsearchAdapter = (
751
932
  const index = await ensureAlias(model);
752
933
  const query = queryFor(model, where);
753
934
 
935
+ // Releasing a row's values needs them, which a by-query delete does
936
+ // not return, so these rows are deleted a page at a time.
937
+ const unique = reservations.fieldsOf(model);
938
+ if (unique.length > 0) {
939
+ return writeMatchingRows({
940
+ model,
941
+ index,
942
+ query,
943
+ operation: "deleteMany",
944
+ source: unique,
945
+ writePage: async (hits) => {
946
+ // Refreshed like the by-query delete, which cannot wait.
947
+ const result = await client.bulk({
948
+ index,
949
+ refresh: true,
950
+ operations: hits.map((hit) => ({ delete: ifUnchanged(hit) })),
951
+ });
952
+ const outcomes = result.items.map((item) => item.delete);
953
+ const written = new Set(writtenIds(outcomes));
954
+ await reservations.release(
955
+ model,
956
+ index,
957
+ hits.flatMap((hit) =>
958
+ hit._id && written.has(hit._id)
959
+ ? [{ id: hit._id, source: hit._source }]
960
+ : [],
961
+ ),
962
+ );
963
+ return outcomes;
964
+ },
965
+ });
966
+ }
967
+
754
968
  // A row that changes mid-pass is skipped as a version conflict, so
755
969
  // rerun until a pass meets none. Rows already deleted no longer
756
970
  // match, so a rerun never counts a row twice. A pass refused by a
package/src/index.ts CHANGED
@@ -9,3 +9,4 @@ export {
9
9
  type MigrationResult,
10
10
  } from "./migrate.js";
11
11
  export { purgeExpired, type PurgeResult } from "./purge.js";
12
+ export type { DuplicateValues } from "./unique-reservations.js";