npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@a0n/aeon

v5.0.2

Published

Distributed synchronization, schema versioning, and conflict resolution for real-time collaborative applications

Downloads

224

Readme

Aeon

A TypeScript toolkit for collaborative systems. At its center: Aeon Flow, a multiplexed frame protocol for moving many independent streams over one transport.

The package covers ground teams usually assemble themselves: transport, sync, offline queues, compression, presence, versioning, persistence, crypto, and topology analysis.

Install

bun add @a0n/aeon
npm install @a0n/aeon   # or yarn / pnpm

Aeon Flow

One connection. Many independent streams. Less waiting behind unrelated work.

┌──────────────────────────────────────────────────────────┐
│                   10-byte Flow Frame                     │
├──────────┬──────────┬───────┬────────────────────────────┤
│ stream_id│ sequence │ flags │ length    │    payload ...  │
│  (u16)   │  (u32)   │ (u8)  │ (u24)    │                 │
└──────────┴──────────┴───────┴────────────────────────────┘
  • Streams progress independently -- no head-of-line blocking
  • Frames can arrive out of order and reassemble correctly
  • Protocol overhead stays small (10 bytes per frame)
  • Same framing works across UDP, WebSocket, WebTransport, IPC

The UDP path includes MTU-aware fragmentation, ACK bitmaps, AIMD congestion control, and per-stream reassembly.

Quick Start: Flow Protocol

import { AeonFlowProtocol, UDPFlowTransport } from '@a0n/aeon';

// Set up transport
const transport = new UDPFlowTransport({
  host: '0.0.0.0',
  port: 4242,
  remoteHost: 'target.example.com',
  remotePort: 4242,
  reliable: true,
});
await transport.bind();

// Create protocol instance
const flow = new AeonFlowProtocol(transport, {
  role: 'client',
  maxConcurrentStreams: 256,
});

// Open a parent stream and fork 3 children
const parentId = flow.open();
const childIds = flow.fork(parentId, 3);

// Race: first child to complete wins, losers are vented
const { winner, result } = await flow.race(childIds);

// Or fold: wait for all, merge results
const merged = await flow.fold(childIds, (results) => {
  // results: Map<streamId, Uint8Array>
  return concatBuffers([...results.values()]);
});

Quick Start: Sync Coordination

import { SyncCoordinator } from '@a0n/aeon';

const coordinator = new SyncCoordinator();

coordinator.registerNode({
  id: 'node-1',
  address: 'localhost',
  port: 3000,
  status: 'online',
  lastHeartbeat: new Date().toISOString(),
  version: '1.0.0',
  capabilities: ['sync', 'replicate'],
});

const session = coordinator.createSyncSession('node-1', ['node-2', 'node-3']);

Quick Start: Recovery Ledger

import { RecoveryLedger } from '@a0n/aeon';

const ledger = new RecoveryLedger({
  objectId: 'asset:app.bundle.js',
  dataShardCount: 4,
  parityShardCount: 2,
});

ledger.registerRequest('req-a');
ledger.registerRequest('req-b');

ledger.recordShardObservation({
  shardRole: 'data',
  shardIndex: 0,
  digest: 'sha256:data-0',
  observedBy: 'edge-a',
});

ledger.recordShardObservation({
  shardRole: 'parity',
  shardIndex: 0,
  digest: 'sha256:parity-0',
  observedBy: 'edge-b',
});

const status = ledger.getStatus();
if (status.canReconstruct) {
  // Fold the request family once the merged shard ledger crosses threshold.
}

Quick Start: Schema Migrations

import { MigrationEngine } from '@a0n/aeon';

const engine = new MigrationEngine();

engine.registerMigration({
  id: 'add-status-field',
  version: '2.0.0',
  name: 'Add user status field',
  up: (data) => ({ ...data, status: 'active' }),
  down: (data) => {
    const { status, ...rest } = data;
    return rest;
  },
  timestamp: new Date().toISOString(),
  description: 'Adds status field to all user records',
});

Modules

Everything is available from the root import. Subpath imports are available for tree-shaking:

| Import | What it does | |--------|-------------| | @a0n/aeon | Everything (barrel export) | | @a0n/aeon/core | Core types and interfaces | | @a0n/aeon/distributed | Sync coordination, replication, conflict resolution, and recovery ledgers | | @a0n/aeon/versioning | Schema versions, migrations, tracking | | @a0n/aeon/offline | Queued work for unreliable or offline periods | | @a0n/aeon/compression | Compression and delta-sync helpers | | @a0n/aeon/persistence | In-memory and storage adapter surfaces | | @a0n/aeon/presence | Real-time node and session state | | @a0n/aeon/crypto | Signing and UCAN-related primitives |

The flow protocol, topology analysis, transport helpers, and federation modules are exported from the root barrel.

Related Packages

| Package | Description | |---------|-------------| | @a0n/aeon-pipelines | Execution engine for fork/race/fold as computation primitives (race on speed, value, or any lambda) | | packages/shootoff | Side-by-side protocol benchmarks against HTTP/1.1 and HTTP/2 | | packages/wall | Command-line client and benchmark harness for Aeon Flow, including native raw-path Aeon blasts, preconnected launch-gate benchmarking, mixed UDP+TCP transport races, and direct bearer or X-Aeon-* auth injection | | packages/nginx-flow-aeon | nginx bridge for Aeon Flow behind HTTP infrastructure | | aeon-bazaar | Unbounded negotiation engine -- void walking, complement distributions | | aeon-neutral | Bounded dispute resolution -- three-walker Skyrms mediation with convergence certificates |

Formal Surface

TLA+ specifications for negotiation convergence (in companion-tests/formal/):

| Spec | What it models | |------|---------------| | NegotiationConvergence.tla | Single-party fork/race/fold with BATNA threshold | | MetacognitiveWalker.tla | c0-c3 cognitive loop, kurtosis convergence | | SkyrmsNadir.tla | Two walkers converging via accumulated failure | | SkyrmsThreeWalker.tla | Mediator as third walker on the convergence site |

Documentation

License

Copyright Taylor William Buley. All rights reserved.

MIT