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

@openhub2/runtime-h3

v0.0.1

Published

OpenHub runtime integration for H3

Readme

@openhub2/runtime-h3

OpenHub runtime integration for H3. Manages bindings and provides middleware for context injection.

Installation

pnpm add @openhub2/runtime-h3

Requires h3 as a peer:

pnpm add h3

Usage

With H3 Event Handler

import { createApp, eventHandler } from 'h3'
import { createRuntime, openhubEventHandler } from '@openhub2/runtime-h3'
import { cloudflareProvider } from '@openhub2/provider-cloudflare'

const app = createApp()
const runtime = createRuntime()

// Register provider
runtime.registerProvider(cloudflareProvider)

// Create bindings (in production, extract from platform context)
const bindings = cloudflareProvider.extractBindings(env)

// Use with event handler wrapper
app.use('/api/users', openhubEventHandler(bindings, eventHandler(async (event) => {
  const { database } = event.context.openhub.bindings
  const stmt = database.prepare('SELECT * FROM users')
  const users = await stmt.all()
  return users
})))

With Middleware

import { createApp, eventHandler } from 'h3'
import { createRuntime, createOpenhubMiddleware, getBindings } from '@openhub2/runtime-h3'
import { cloudflareProvider } from '@openhub2/provider-cloudflare'

const app = createApp()
const runtime = createRuntime()

// Register provider
runtime.registerProvider(cloudflareProvider)

// Create bindings
const bindings = cloudflareProvider.extractBindings(env)

// Apply middleware globally
app.use(createOpenhubMiddleware(bindings))

// Use bindings in handlers
app.use('/api/users', eventHandler(async (event) => {
  const { database, kv, blob } = getBindings(event)
  const stmt = database.prepare('SELECT * FROM users')
  const users = await stmt.all()
  return users
}))

Remote Mode with Proxy Endpoint

When running in remote mode, the runtime can proxy requests to remote services:

import { createApp } from 'h3'
import { bindingsMiddleware } from '@openhub2/runtime-h3'

const app = createApp()

// Apply bindings middleware to automatically handle local/remote mode
app.use(bindingsMiddleware)

// The proxy endpoint is automatically available at /__openhub2/proxy
// when using remote mode with appropriate secrets

Programmatic

import { createRuntime } from '@openhub2/runtime-h3'
import { cloudflareProvider } from '@openhub2/provider-cloudflare'

const runtime = createRuntime()
runtime.registerProvider(cloudflareProvider)

What It Does

  1. Registers provider — accepts any Dharma-conforming provider
  2. Provides middlewarecreateOpenhubMiddleware and bindingsMiddleware inject bindings into H3 event context
  3. Context injection — bindings available via event.context.openhub.bindings
  4. Detects remote mode — via environment or config
  5. Proxy endpoint/__openhub2/proxy for remote mode communication
  6. Transport layer — HTTP transport for remote communication

Modules

The H3 runtime is organized into several modules:

Runtime

Core runtime functionality for managing providers and bindings.

Middleware

Context injection and binding management utilities.

Context

Runtime context management and binding injection.

Plugin

Bindings middleware that handles local/remote mode switching.

Transport

HTTP transport for remote communication with proxy endpoints.

Endpoint

Proxy endpoint implementation for remote mode.

Middleware

The H3 runtime provides several ways to inject bindings:

Event Handler Wrapper

import { openhubEventHandler } from '@openhub2/runtime-h3'

app.use('/api/data', openhubEventHandler(bindings, eventHandler(async (event) => {
  const { database, kv, blob } = event.context.openhub.bindings
  // Use bindings...
})))

Bindings Middleware (Auto-configures Local/Remote)

import { bindingsMiddleware } from '@openhub2/runtime-h3'

// Apply middleware that automatically handles local/remote mode
app.use(bindingsMiddleware)

Middleware Factory

import { createOpenhubMiddleware, getBindings } from '@openhub2/runtime-h3'

// Apply middleware with specific bindings
app.use(createOpenhubMiddleware(bindings))

// Access bindings in handlers
app.use('/api/data', eventHandler(async (event) => {
  const { database, kv, blob } = getBindings(event)
  // Use bindings...
}))

Context Access

Bindings are available in event handlers via H3's event context:

app.use('/api/users', eventHandler(async (event) => {
  // Direct access
  const { database, kv, blob } = event.context.openhub.bindings

  // Or use helper
  const bindings = getBindings(event)

  const stmt = database.prepare('SELECT * FROM users')
  const users = await stmt.all()

  return users
}))

Remote Mode

The runtime supports remote mode where bindings are handled via HTTP proxy:

// Enable remote mode
process.env.OPENHUB_REMOTE = 'true'
process.env.OPENHUB_REMOTE_URL = 'https://my-worker.example.com'
process.env.OPENHUB_REMOTE_SECRET = 'shared-secret'

In remote mode, the runtime creates local bindings that communicate with remote services via the proxy endpoint.

Environment Variables

| Variable | Required | Description | |----------|----------|-------------| | OPENHUB_REMOTE | No | Enable remote mode (true/false) | | OPENHUB_REMOTE_URL | In remote mode | Deployed worker URL | | OPENHUB_REMOTE_SECRET | In remote mode | Shared auth secret for proxy endpoint |

License

Apache-2.0