@learncard/lca-api-service 1.5.1 → 1.5.3

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 (41) hide show
  1. package/.env.example +2 -2
  2. package/CHANGELOG.md +32 -0
  3. package/config/config.dev.json +1 -1
  4. package/dist/app.d.ts +239 -1
  5. package/dist/index.js +2 -2
  6. package/dist/models/EscrowHold.d.ts +30 -2
  7. package/dist/models/UserKey.d.ts +89 -5
  8. package/dist/publish-metafile.json +1 -1
  9. package/dist/routes/ai.test.d.ts +1 -0
  10. package/dist/routes/escrow.d.ts +237 -0
  11. package/dist/routes/index.d.ts +4 -4
  12. package/dist/routes/keys.d.ts +2 -1
  13. package/dist/services/escrow-enclave/authorityContract.d.ts +170 -0
  14. package/dist/services/escrow-enclave/logFailure.d.ts +1 -0
  15. package/dist/services/escrow-enclave/logFailure.test.d.ts +1 -0
  16. package/dist/services/escrow-enclave/types.d.ts +55 -3
  17. package/esbuildPlugins.cjs +9 -6
  18. package/package.json +10 -10
  19. package/src/config/environment.ts +1 -1
  20. package/src/config/escrowDeployment.test.ts +8 -0
  21. package/src/jobs/escrowBlobRewrap.ts +45 -2
  22. package/src/jobs/escrowHoldReminders.ts +50 -1
  23. package/src/models/EscrowHold.ts +128 -10
  24. package/src/models/UserKey.ts +59 -8
  25. package/src/routes/ai.test.ts +103 -0
  26. package/src/routes/ai.ts +2 -1
  27. package/src/routes/escrow.ts +386 -53
  28. package/src/routes/index.ts +1 -1
  29. package/src/routes/keys.ts +5 -0
  30. package/src/services/escrow-enclave/README.md +31 -0
  31. package/src/services/escrow-enclave/authorityContract.ts +126 -0
  32. package/src/services/escrow-enclave/cancellation.ts +2 -2
  33. package/src/services/escrow-enclave/logFailure.test.ts +64 -0
  34. package/src/services/escrow-enclave/logFailure.ts +29 -0
  35. package/src/services/escrow-enclave/remoteEnclave.test.ts +315 -4
  36. package/src/services/escrow-enclave/remoteEnclave.tls.test.ts +182 -2
  37. package/src/services/escrow-enclave/remoteEnclave.ts +202 -31
  38. package/src/services/escrow-enclave/types.ts +77 -5
  39. package/test/jobs/escrowHoldReminders.spec.ts +195 -3
  40. package/test/keys-escrow.spec.ts +587 -11
  41. package/test/models/escrow.spec.ts +13 -0
@@ -547,6 +547,12 @@ describe('escrow model invariants', () => {
547
547
  const pinHold = await createHoldFor(now, 'pin');
548
548
  const completedHold = await createHoldFor(new Date(now.getTime() + 2 * hour));
549
549
  await completeEscrowHold(completedHold._id);
550
+ // P2-b (catch-up): an outage spanning the entire 24h reminder window
551
+ // must not permanently strand a hold — release still requires a
552
+ // successfully recorded warning (authority.rs), so a hold whose
553
+ // Mongo-estimated releaseAfter has already passed, and that was
554
+ // never reminded, must stay selected until it finally is.
555
+ const wayOverdueUnreminded = await createHoldFor(new Date(now.getTime() - 48 * hour));
550
556
 
551
557
  const due = await findEscrowHoldsDueForReminder(now, 200);
552
558
  const dueIds = due.map(hold => hold._id);
@@ -555,6 +561,13 @@ describe('escrow model invariants', () => {
555
561
  expect(dueIds).not.toContain(alreadyReminded._id);
556
562
  expect(dueIds).not.toContain(pinHold._id);
557
563
  expect(dueIds).not.toContain(completedHold._id);
564
+ expect(dueIds).toContain(wayOverdueUnreminded._id);
565
+ // Recovery: once the catch-up run finally records the reminder, the
566
+ // hold stops being selected, exactly like any other reminded hold.
567
+ await recordEscrowHoldNotification(wayOverdueUnreminded._id, 'reminder');
568
+ expect((await findEscrowHoldsDueForReminder(now, 200)).map(hold => hold._id)).not.toContain(
569
+ wayOverdueUnreminded._id
570
+ );
558
571
 
559
572
  // Two concurrent claims for the same hold: MongoDB serializes the
560
573
  // findOneAndUpdate CAS, so exactly one observes the pre-push state.