Finanzen: Bankzugang aus WOMS neu verbinden (Freigabe, Rueckkehr, Kontowahl)

startBankAuth/completeBankAuth in bankSync.js. Die Rueckkehr prueft und speichert die
Sitzung unter der Sperre der Abrufe (ein laufender Abruf kann den neuen Zugang nicht
mehr ueberschreiben) und ruft danach einmal ab. Nachbau: holdNext haelt einen Aufruf an.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Sonnet 5.5 committed 2026-10-01 15:41:54 +00:00
1 parent 75ca8b78c0
commit cba14ed0f0
3 files changed
+605 -2

No files matched your search

+21
View File
@@ -45,6 +45,8 @@ export async function startFakeEnableBanking({ publicKeyPem, appId = null }) {
let authSeq = 0
// Eingeplanter Fehler (failNext): der naechste passende Aufruf scheitert einmalig
let pendingFailure = null
// Angehaltener Aufruf (holdNext): der naechste passende Aufruf wartet, bis release() gerufen wird
let pendingHold = null
const matchesPath = (path, pathname) => (path instanceof RegExp ? path.test(pathname) : path === pathname)
@@ -126,6 +128,12 @@ export async function startFakeEnableBanking({ publicKeyPem, appId = null }) {
calls.push({ method: req.method, path: url.pathname, query: Object.fromEntries(url.searchParams.entries()), headers: { ...req.headers }, body })
const authError = jwtError(req.headers.authorization)
if (!authError && pendingHold && (!pendingHold.path || matchesPath(pendingHold.path, url.pathname))) {
const hold = pendingHold
pendingHold = null
hold.arrive()
await hold.gate
}
let result
if (authError) {
result = [401, { code: 401, error: 'UNAUTHORIZED', message: `JWT abgelehnt: ${authError}` }]
@@ -168,6 +176,19 @@ export async function startFakeEnableBanking({ publicKeyPem, appId = null }) {
failNext: ({ path = null, status = 500, body = { error: 'FAKE_ERROR' }, destroy = false }) => {
pendingFailure = { path, status, body, destroy }
},
/**
* Der naechste Aufruf mit gueltigem JWT (path wie bei failNext) bleibt stehen, bis release() gerufen wird
* (ein langsamer Bankabruf); erst dann laeuft er weiter (auch ein mit failNext eingeplanter Fehler greift erst
* dann). reached erfuellt sich, sobald der Aufruf angekommen ist. Liefert { reached, release }.
*/
holdNext: ({ path = null } = {}) => {
let release
let arrive
const gate = new Promise((resolve) => (release = resolve))
const reached = new Promise((resolve) => (arrive = resolve))
pendingHold = { path, gate, arrive }
return { reached, release }
},
close: () => {
server.closeAllConnections?.()
return new Promise((resolve) => server.close(resolve))