xPulse
πŸ‡¬πŸ‡§ EN

@xpulse/logger – Component Spec

Status: CONCEPT Β· Updated March 2026 Source: Chat v1.3.0 code review Parent: GLOBAL_concept-ecosystem.md


Overview

Logging for browser and Node.js under a shared interface.

Two variants under one package:

Variant Context Import
client Browser (PWA) @xpulse/logger/client
server Node.js @xpulse/logger/server

Dependencies

@xpulse/logger
└── @xpulse/config ← log.level + log.enabled from xpulse.json / .env

Interface (shared)

// Server
import logger from '@xpulse/logger/server';
const log = logger.create('signaling');
// Client
import logger from '@xpulse/logger/client';
const log = logger.create('presence');
// Shared API
log.debug('connection established', { peerId });
log.info('server started', { port: 3000 });
log.warn('timeout exceeded', { ms: 75000 });
log.error('unknown error', { err });

Configuration via @xpulse/config

xpulse.json:

{
"log": {
"level": "info",
"enabled": true
}
}

.env:

LOG=true
DEBUG=false

Logger reads on startup:

import logger from '@xpulse/logger/server';
await logger.init(); // reads config + .env

Variant: client

How it works

Styled Output

[HH:MM:SS.mmm] (debug) [presence] connection established
[HH:MM:SS.mmm] (info ) [router] navigating to /peers
[HH:MM:SS.mmm] (warn ) [webrtc] ice candidate missing
[HH:MM:SS.mmm] (error) [session] decryption failed

Colors:


Variant: server

How it works

Additional exports (server)

import logger from '@xpulse/logger/server';
logger.formatIp(ip); // anonymised or full depending on DEBUG
logger.startup({ port }); // log startup summary

Log format (server)

[2026-03-09T10:23:45.123Z] (info ) xPulse Web started | ENV=production | PORT=3000
[2026-03-09T10:23:46.001Z] (info ) GET /privacy/ 200 12ms
[2026-03-09T10:23:47.220Z] (warn ) health check failed | source=chat

Package Structure

@xpulse/logger/
client.js ← browser variant
server.js ← Node variant
levels.js ← shared level constants (internal)
README.md
package.json

Debug Integration

When @xpulse/debug is installed as a devDependency, @xpulse/logger automatically provides a DataCollector. @xpulse/debug discovers it via node_modules/@xpulse/logger/src/datacollectors/ – no configuration needed.

"optionalDependencies": {
"@xpulse/debug": "^1.0.0"
}

The LoggerCollector (name: 'logger', icon: 'πŸ“') shows in the Web Profiler:

Level colors: debug β†’ --accent2, info β†’ --text, warn β†’ #c0a060, error β†’ --danger

Badge in the toolbar: total count + warnings/errors, e.g. 12 Β· ⚠ 2 Β· βœ— 1. Badge is only set when at least one log line is present.


Open Questions

Question Status
Shared entry point with automatic environment detection? TBD
Server logger: async file write instead of sync appendFileSync? TBD
Client logger: level controllable via @xpulse/event? TBD
en/spec.md 2026-03-27