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

@enclave-vm/stream

v2.12.0

Published

Streaming protocol implementation for EnclaveJS runtime (NDJSON, encryption, reconnection)

Readme

@enclave-vm/stream

npm version License TypeScript

Streaming protocol implementation for EnclaveJS runtime (NDJSON, encryption, reconnection)

The @enclave-vm/stream package provides the core streaming protocol implementation for EnclaveJS. It handles NDJSON serialization, end-to-end encryption using ECDH/AES-GCM, and automatic reconnection with state recovery.

Features

  • NDJSON Streaming: Newline-delimited JSON for efficient message streaming
  • End-to-End Encryption: ECDH key exchange with AES-GCM encryption
  • Automatic Reconnection: Built-in reconnection with exponential backoff
  • State Recovery: Resume sessions after disconnection
  • Backpressure Handling: Flow control for high-throughput scenarios
  • Cross-Platform: Works in Node.js and browsers

Installation

npm install @enclave-vm/stream
# or
yarn add @enclave-vm/stream
# or
pnpm add @enclave-vm/stream

Quick Start

import { StreamEncoder, StreamDecoder, createEncryptedChannel } from '@enclave-vm/stream';

// Basic NDJSON encoding/decoding
const encoder = new StreamEncoder();
const decoder = new StreamDecoder();

// Encode messages
const encoded = encoder.encode({ type: 'tool_call', name: 'getData', args: {} });

// Decode messages
decoder.on('message', (message) => {
  console.log('Received:', message);
});
decoder.write(encoded);

Encrypted Channels

Create end-to-end encrypted communication channels:

import { createEncryptedChannel } from '@enclave-vm/stream';

// Server side
const serverChannel = await createEncryptedChannel({
  role: 'server',
  onMessage: (message) => {
    console.log('Decrypted message:', message);
  },
});

// Get server's public key to send to client
const serverPublicKey = serverChannel.getPublicKey();

// Client side
const clientChannel = await createEncryptedChannel({
  role: 'client',
  remotePublicKey: serverPublicKey,
  onMessage: (message) => {
    console.log('Decrypted message:', message);
  },
});

// Send encrypted messages
await clientChannel.send({ type: 'tool_call', name: 'secretOp', args: {} });

Reconnection

Handle connection drops gracefully:

import { ReconnectingStream } from '@enclave-vm/stream';

const stream = new ReconnectingStream({
  url: 'wss://runtime.example.com',
  sessionId: 'session_123',
  reconnect: {
    maxAttempts: 5,
    initialDelay: 1000,
    maxDelay: 30000,
    backoffMultiplier: 2,
  },
  onReconnect: (attempt) => {
    console.log(`Reconnecting (attempt ${attempt})...`);
  },
  onMessage: (message) => {
    handleMessage(message);
  },
});

await stream.connect();

NDJSON Utilities

import { parseNDJSON, stringifyNDJSON } from '@enclave-vm/stream';

// Parse NDJSON string
const messages = parseNDJSON(ndjsonString);

// Stringify to NDJSON
const ndjson = stringifyNDJSON([
  { type: 'start', sessionId: '123' },
  { type: 'tool_call', name: 'getData', args: {} },
  { type: 'end' },
]);

Encryption Details

The encryption implementation uses:

  • Key Exchange: ECDH (Elliptic Curve Diffie-Hellman) with P-256 curve
  • Symmetric Encryption: AES-256-GCM with random IV per message
  • Key Derivation: HKDF for deriving encryption keys from shared secret
import { generateKeyPair, deriveSharedSecret, encrypt, decrypt } from '@enclave-vm/stream';

// Generate key pairs
const serverKeys = await generateKeyPair();
const clientKeys = await generateKeyPair();

// Derive shared secret
const serverSecret = await deriveSharedSecret(serverKeys.privateKey, clientKeys.publicKey);
const clientSecret = await deriveSharedSecret(clientKeys.privateKey, serverKeys.publicKey);

// Encrypt/decrypt messages
const encrypted = await encrypt(serverSecret, JSON.stringify(message));
const decrypted = await decrypt(clientSecret, encrypted);

Related Packages

| Package | Description | | ------------------------------------------- | ---------------------------------- | | @enclave-vm/types | Type definitions and Zod schemas | | @enclave-vm/broker | Tool broker and session management | | @enclave-vm/client | Browser/Node.js client SDK | | @enclave-vm/react | React hooks and components | | @enclave-vm/runtime | Standalone runtime worker |

License

Apache-2.0