API Overview
The generated reference is written to dist/docs/ by npm run build:docs, and served at http://localhost/docs/ by
the documentation site. This page is the short version, plus the rule that decides what belongs on it.
What counts as API
A symbol is public when it is re-exported from src/index.ts or
src/middlewares/index.ts, and internal when it is not. There is no second mechanism:
package.json#exports names only those two entries and the bundles built from them, so nothing under lib/ reaches a
consumer by any other path.
Both files are barrels. Behaviour lives in the layers beneath them, so the public surface is something you can see at a glance rather than something you have to read code to determine.
The main entry
import { … } from '@bayudwiyansatria/cloudflare'
Bindings
One accessor per Cloudflare binding, all over the abstract Binding base.
| Export | Wraps | wrangler.json key |
|---|---|---|
AIBinding |
Ai |
ai |
AnalyticsBinding |
AnalyticsEngineDataset |
analytics_engine_datasets |
D1Binding |
D1Database |
d1_databases |
DurableObjectBinding |
DurableObjectNamespace |
durable_objects.bindings |
HyperdriveBinding |
Hyperdrive |
hyperdrive |
KVBinding |
KVNamespace |
kv_namespaces |
QueueBinding |
Queue |
queues.producers |
R2Binding |
R2Bucket |
r2_buckets |
RateLimitBinding |
RateLimit |
ratelimits |
VectorizeBinding |
Vectorize |
vectorize |
Binding itself is exported so a project can add an accessor for a binding this package does not cover yet.
Services
One capability service per accessor, each implementing an interface from @bayudwiyansatria/core. This is the layer
business logic should depend on.
| Export | Implements |
|---|---|
AIService |
InferenceEngine |
AnalyticsService |
TelemetrySink |
D1Service |
DataStore |
DurableObjectService |
CoordinationStore |
HyperdriveService |
SqlConnectionProvider |
KVService |
CacheStore |
QueueService |
MessageQueue |
R2Service |
ObjectStore |
RateLimitService |
RateLimiter |
VectorizeService |
VectorIndex |
Depending on the interface rather than the class is what lets a service be substituted — including for one of the
kernel's Noop* implementations in a test.
Configuration, platform, and errors
| Export | Kind | Notes |
|---|---|---|
cloudflareDefaults |
constant | the binding-backed half of the configuration surface |
CloudflareRequestMetadata |
class | the one reader of cf-ray, cf-connecting-ip, request.cf |
MissingBindingError |
class | extends the kernel's MissingCapabilityError |
CloudflareEnv |
interface | the environment contract a consuming Worker extends |
twelve *Settings interfaces |
types | the shape of each module's configuration |
HyperdriveCredentials, D1Statement, D1WriteResult |
types | supporting shapes |
The ./middlewares entry
import { logToAnalytics, SecurityMiddleware } from '@bayudwiyansatria/cloudflare/middlewares'
| Export | Kind | Notes |
|---|---|---|
SecurityMiddleware |
class | CORS, origin guard, client-IP capture, API-key auth |
logToAnalytics |
middleware handler | one log line and one metric per request |
Separate because hono is an optional peer dependency. A Worker that uses the bindings but not this middleware
never resolves Hono at all — and that only holds while nothing outside src/middlewares/ imports it, which a lint rule
enforces.
Errors across the package boundary
MissingBindingError extends MissingCapabilityError from the kernel, so an application can catch the general case
without naming Cloudflare:
import { MissingCapabilityError } from '@bayudwiyansatria/core'
try {
await db.first(env, 'SELECT 1')
} catch (error) {
if (error instanceof MissingCapabilityError) {
// a resource this deployment never provisioned
}
}
That instanceof holds only while a single copy of the kernel is loaded, which is why rollup.config.ts marks it
external and the assertExternals plugin beside it fails the build if that ever stops holding.
Adding to the surface
Adding an export is a deliberate act, not a side effect of writing a file:
- Write the declaration in its own file, named after it.
- Re-export it from the directory barrel.
- Re-export it from
src/index.ts(orsrc/middlewares/index.ts) with a documented@moduleentry.
Skipping step 3 keeps it internal, which is the right answer for anything a consumer has no reason to touch.