/** * Ejemplo didáctico de Alberto Lara Hernández, 11-09-2026. * Ejecutar: node ejemplo-identidad.mjs (Node.js 22 o posterior). * Datos ficticios. Sin red ni persistencia: no es un conector Moodle. * Supone un emisor único y autorizado con revisiones crecientes por identidad. * No implementa autenticación, concurrencia, sesiones ni conciliación. */ import assert from 'node:assert/strict'; const identities = new Map(); const received = new Set(); function receive(event) { assert.ok(event.id && event.subject); assert.ok(Number.isSafeInteger(event.revision) && event.revision > 0); assert.ok(['active', 'suspended'].includes(event.status)); if (received.has(event.id)) return 'duplicate'; const current = identities.get(event.subject); if (current && event.revision <= current.revision) return 'outdated'; identities.set(event.subject, { revision: event.revision, status: event.status }); received.add(event.id); return 'applied'; } const creation = { id: 'event-1', subject: 'example:person-1', revision: 1, status: 'active' }; const suspension = { id: 'event-2', subject: 'example:person-1', revision: 2, status: 'suspended' }; assert.equal(receive(creation), 'applied'); assert.equal(identities.get(creation.subject).status, 'active'); assert.equal(receive(suspension), 'applied'); assert.equal(receive(suspension), 'duplicate'); assert.equal(receive({ ...creation, id: 'delayed-event' }), 'outdated'); assert.deepEqual(identities.get(creation.subject), { revision: 2, status: 'suspended' }); console.log('Alta, baja, duplicado y evento antiguo comprobados. Estado final: suspended.');