{"_id":"@core-tecnologias-empresariales/core-events","name":"@core-tecnologias-empresariales/core-events","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@core-tecnologias-empresariales/core-events","version":"0.1.0","description":"Infraestructura Event-Driven transversal (CoreEvent, EventBus, Handler, Transport, Outbox, Retry, Idempotencia, Dead Letter, Correlation, Causation) para el ecosistema Core Tecnología Empresarial. Sin lógica de negocio, sin acoplamiento a un broker concre","license":"UNLICENSED","publishConfig":{"access":"public"},"type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":"./dist/index.js"},"dependencies":{"@core-tecnologias-empresariales/core-utils":"0.1.1"},"devDependencies":{"typescript":"^5.7.0","@types/node":"^20.14.0"},"scripts":{"build":"tsc -p tsconfig.json","test":"tsc -p tsconfig.json && node --test dist"},"_id":"@core-tecnologias-empresariales/core-events@0.1.0","_integrity":"sha512-0vFS0IklzgGkvAuZ/ma54YsPJRFUH24JgoVrQr5KnFWURv5awbLAzbrDAhpo15CLtrc/dM8WlZ6pWbhIgGke5A==","_resolved":"C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\51c65843988592c73e7e888df4d7ef27\\core-tecnologias-empresariales-core-events-0.1.0.tgz","_from":"file:core-tecnologias-empresariales-core-events-0.1.0.tgz","_nodeVersion":"20.20.0","_npmVersion":"11.11.0","dist":{"integrity":"sha512-0vFS0IklzgGkvAuZ/ma54YsPJRFUH24JgoVrQr5KnFWURv5awbLAzbrDAhpo15CLtrc/dM8WlZ6pWbhIgGke5A==","shasum":"12232b6d6ac7410425772fa2566fc9b8b0480486","tarball":"https://registry.npmjs.org/@core-tecnologias-empresariales/core-events/-/core-events-0.1.0.tgz","fileCount":26,"unpackedSize":34045,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFruT84d0bbUPk2b/XznALwdNZPstF4kwNGhJ+gPSQCxAiAzkR5l0xvAjJF6urUCh1dF+NYukKjFel3jhPf7kvk6tQ=="}]},"_npmUser":{"name":"balamchac","email":"marcelosazop@gmail.com"},"directories":{},"maintainers":[{"name":"balamchac","email":"marcelosazop@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/core-events_0.1.0_1788401962546_0.5046472885568396"},"_hasShrinkwrap":false}},"time":{"created":"2026-09-03T02:19:22.324Z","0.1.0":"2026-09-03T02:19:22.699Z","modified":"2026-09-03T02:19:22.982Z"},"maintainers":[{"name":"balamchac","email":"marcelosazop@gmail.com"}],"description":"Infraestructura Event-Driven transversal (CoreEvent, EventBus, Handler, Transport, Outbox, Retry, Idempotencia, Dead Letter, Correlation, Causation) para el ecosistema Core Tecnología Empresarial. Sin lógica de negocio, sin acoplamiento a un broker concre","license":"UNLICENSED","readme":"# @core-tecnologias-empresariales/core-events\n\nInfraestructura Event-Driven del ecosistema Core Tecnología Empresarial: `Domain → Event Publisher → Core Events → Event Bus/Outbox → Handlers`.\n\n## v0.1: InMemoryTransport + Outbox + Idempotency + Retry + DLQ\n\nSin Redis/Kafka/RabbitMQ — regla de no sobreingeniería del `CLAUDE.md` (§31): no incorporar un broker externo por anticipación. El `EventTransport` es una interfaz; un adapter real la implementa cuando el volumen lo justifique, sin tocar el código de dominio.\n\n```ts\nimport { createEvent, createEventBus, createInMemoryOutbox, dispatchPending } from \"@core-tecnologias-empresariales/core-events\";\n\nconst bus = createEventBus();\n\nbus.subscribe(\"sale.created\", \"update-stock\", {\n  handle: async (event) => { /* actualizar stock */ },\n});\n\nconst event = createEvent({\n  type: \"sale.created\",\n  source: \"corepyme.sales\",\n  occurredAt: coreTime.utcNow(), // instante generado por `core-time`, nunca por el navegador\n  tenantId,\n  payload: { saleId, total, currency: \"CLP\" },\n});\n\n// Outbox: la venta y el evento se insertan en la MISMA transacción de BD (spec §27); el worker\n// despacha después — el consumidor lo llama en su propio loop/cron, sin scheduler interno.\nconst outbox = createInMemoryOutbox();\noutbox.add(event);\nawait dispatchPending(outbox, bus);\n```\n\n## Políticas implementadas\n\n- **Idempotencia** — un mismo `eventId` no se reprocesa dos veces para el mismo handler (`handlerName` identifica al handler).\n- **Retry + backoff** — cada handler reintenta con backoff exponencial configurable (`maxAttempts`, `backoff`) antes de caer a dead-letter.\n- **Dead Letter** — `bus.deadLetter.list()` — nunca se descarta un evento fallido silenciosamente.\n- **Correlation / Causation** — `deriveEvent(parent, input)` propaga `correlationId` y fija `causationId` automáticamente.\n- **Outbox** — `createInMemoryOutbox()` + `dispatchPending()`; interfaz `OutboxStore` para un adapter de BD real.\n- **Tenant isolation** — `CoreEvent.tenantId` es parte del contrato; filtrar por tenant es responsabilidad del handler (este paquete no impone reglas de negocio).\n\n## Para qué NO sirve todavía (`ponytail:` diferido)\n\n- Transports reales (Redis/RabbitMQ/Kafka/NATS/Azure Service Bus) — la interfaz `EventTransport` está lista para un adapter cuando exista el broker elegido.\n- Integración con `core-logging`/`core-telemetry`/`core-audit` — el evento ya trae los campos necesarios (`eventId`, `correlationId`, `causationId`, etc.); conectarlos es del consumidor.\n- Persistencia real del Outbox/Idempotency/DLQ — son interfaces con implementación en memoria; cada producto los respalda en su propia BD (CLAUDE.md §25, no existe `core-database`).\n\n## Instalación\n\n```bash\npnpm add @core-tecnologias-empresariales/core-events\n```\n\n## Desarrollo\n\n```bash\npnpm build\npnpm test\n```\n","readmeFilename":"README.md","_rev":"1-50252198777885b543480b58ebc6bfb0"}