Skip to content

JavaScript/TypeScript Server API

Server APIs live in @nnrp/native-server. Browser packages do not expose server entrypoints.

openBackendRuntime

Creates a native backend runtime without immediately starting a listener.

ParameterTypeRequiredDescription
optionsNnrpBackendRuntimeOptionsNoTransport policy, installed transport providers, and optional FFI binding.
Returns
Promise<NnrpBackendRuntime>
ts
import { openBackendRuntime } from "@nnrp/native-server";
import { createTcpTransportProvider } from "@nnrp/transport-tcp";

const runtime = await openBackendRuntime({
  transportPolicy: "force-tcp",
  transports: [createTcpTransportProvider()],
});

NnrpBackendRuntime.listen

Creates one logical backend server listener. The logical listener owns every eligible carrier listener allowed by its transport policy and installed providers.

ParameterTypeRequiredDescription
optionsNnrpListenOptionsYesLocal endpoint, optional transport policy, and optional transport providers.
Returns
NnrpServer
ts
const server = runtime.listen({
  endpoint: "nnrp://0.0.0.0:4433",
  providerRoutes: {
    ipc: { endpoint: "unix:///run/nnrp.sock" },
    websocket: {
      endpoint: "wss://0.0.0.0:8443/nnrp",
      security: { mode: "server", certificateDer, privateKeyPkcs8Der },
    },
  },
});

force-* opens exactly the forced eligible carrier listener. auto and prefer-* open every eligible carrier listener; a preference only provides a stable order when accepted sessions become available simultaneously. It does not disable other listeners, and the server does not invent peer probe data. The connecting peer chooses the carrier it uses.

Opening the listener set is atomic. If any configured eligible listener cannot open, the runtime closes listeners already opened for this call and rejects the first accept(). A carrier that cannot derive a bind locator from endpoint requires an entry in providerRoutes; it is never omitted silently.

sessionDefaults freezes transport-neutral negotiation, cache, credit, schema, recovery, and application admission settings for every accepted session. The application policy is evaluated exactly once for each wire-valid SESSION_OPEN and may complete asynchronously:

ts
const server = runtime.listen({
  endpoint: "nnrp://0.0.0.0:4433",
  sessionDefaults: {
    applicationPolicy: {
      async evaluate(open) {
        if (open.maxInFlightOperations > 32) {
          return {
            accepted: false,
            sessionErrorCode: 17,
            diagnostic: "requested concurrency is too high",
          };
        }
        return { accepted: true, sessionErrorCode: 0 };
      },
    },
  },
});

The policy receives NnrpSessionOpenMetadata and returns a Promise<NnrpServerSessionPolicyDecision>. Rejection is scoped to that peer handshake; it does not close the logical listener set.

NnrpBackendRuntime.selectTransport

Selects a transport against a peer manifest.

ParameterTypeRequiredDescription
optionsNnrpTransportSelectionOptionsYesPeer manifest, workload limit, providers, policy, readiness, and probe observations.
Returns
NnrpTransportSelectionSummary

Runtime, Listener, And Session Lifecycle

MethodParametersReturnsDescription
NnrpBackendRuntime.close()NonePromise<void>Closes accepted sessions, listeners, and the explicit FFI seam.
NnrpServer.accept(options?)options?: NnrpServerAcceptOptionsPromise<NnrpServerSession>Accepts the next session from the owned carrier-listener set.
NnrpServer.close()NonePromise<void>Closes every owned carrier listener and accepted session.
NnrpServerSession.nextEvent(options?)options?: NnrpEventPollOptionsPromise<NnrpServerEvent>Reads the next ordered submit, runtime, or lifecycle event.
NnrpServerSession.receiveSubmit(options?)options?: NnrpEventPollOptionsPromise<NnrpServerOperation>Selects the next submit while retaining skipped events.
NnrpServerSession.close()NonePromise<void>Closes the accepted role session exactly once.

NnrpServerSession.activeTransport is the NnrpTransportKind of the listener that accepted the carrier. It matches the negotiated active transport and is not derived from listener preference order.

NnrpServer.boundProviderEndpoints is a readonly partial record keyed by NnrpTransportKind, containing the actual endpoint of every opened listener. A terminal provider-listener failure fails the logical server and closes the remaining listener set; a rejected peer handshake affects only that accepted carrier.

Server Events And Operation Replies

NnrpServerSession.nextEvent(options?) returns a closed NnrpServerEvent tagged union. Its submit variant owns NnrpServerOperation, its runtime variant owns a non-submit NnrpRuntimeEvent, and its lifecycle variant owns a headerless NnrpOperationLifecycleEvent. receiveSubmit(options?) is selective but retains every skipped event for the next event-pump read.

The returned operation owns every operation-scoped reply:

MethodMessageMetadataOptional tail
sendResult(metadata, body?)ResultPushNnrpResultPushMetadataresult body
sendResultDrop(metadata, diagnostic?)ResultDropReasonResultDropReasonMetadatadiagnostic bytes
sendProgress(metadata, body?)ProgressProgressMetadataprogress body
sendPartialResult(metadata, body?)PartialResultPartialResultMetadatainline partial result

All four methods return Promise<void>. The operation validates its session and operationId, and only one terminal method may succeed. NnrpServerSession does not expose parallel operation-reply methods.

Receiving a terminal lifecycle event does not invalidate the operation before its terminal reply succeeds. It remains reply-capable until that reply or session shutdown, independently of later nextEvent() calls.

Preview4 Server Session Methods

The session owns non-operation server output:

MethodMessageMetadataOptional tail
sendBackpressure(metadata)BackpressurePressureMetadatanone
sendCreditUpdate(metadata)CreditUpdatePressureMetadatanone
negotiateCapabilities(metadata, body?)CapabilityNegotiationCapabilityMetadatacapability entries
degradeProfile(metadata, body?)DegradeProfileCapabilityMetadatacapability entries
sendTraceContext(metadata, body?, operationId?)TraceContextTraceContextMetadatatrace attributes; omitted operation is session scope
sendRecoverableError(metadata, diagnostic?)ErrorRecoverableRecoverableErrorMetadatadiagnostic bytes
sendRetryAfter(metadata, diagnostic?)RetryAfterRetryAfterMetadatadiagnostic bytes
sendControl(messageType, metadata, tail?)Any non-operation server-sendable Preview4 control frameMatching runtime metadata typedeclared tail

All methods return Promise<void>. Metadata/body length mismatches fail before the frame reaches the carrier provider.

Preview4 Server Object And Cache Methods

MethodMessageMetadataOptional tail
declareObject(metadata, body?)ObjectDeclareObjectDescriptorMetadataobject metadata
referenceObject(metadata, body?)ObjectRefObjectReferenceMetadatareference metadata
releaseObject(metadata, diagnostic?)ObjectReleaseObjectReleaseMetadatadiagnostic bytes
patchObject(metadata, delta, metadataBody?)ObjectPatchObjectDeltaMetadatametadata body, then delta
sendObjectDelta(metadata, delta, metadataBody?)ObjectDeltaObjectDeltaMetadatametadata body, then delta
referenceCache(metadata, body?)CacheReferenceCacheReferenceMetadatacache metadata
reportCacheMiss(metadata, diagnostic?)CacheMissCacheMissMetadatadiagnostic bytes
invalidateCache(metadata)CacheInvalidateCacheInvalidateMetadatanone

For object patch and delta methods, metadataBody.byteLength must equal metadata.metadataBytes and delta.byteLength must equal metadata.deltaBytes. The wire tail is the metadata body followed by the delta bytes. Operation replies remain separate from object-delta frames.

Boundary Rules

PackageOwnsMust not own
@nnrp/native-serverServer runtime, listen lifecycle, backend runtime lifecycle.Transport artifacts, browser code, client sessions, or connect APIs.
@nnrp/native-clientClient runtime and session lifecycle.Server listener APIs.
@nnrp/transport-tcp / @nnrp/transport-quic / @nnrp/transport-ipc / @nnrp/transport-websocketTransport behavior and packaged native artifacts.Server or client role lifecycle.

Option Types

NnrpBackendRuntimeOptions

FieldTypeRequiredDescription
transportPolicyNnrpTransportPolicyNoDefault selection policy.
transportsreadonly NnrpNativeTransportProvider[]NoInstalled native transport providers. See Transport Providers.
ffiNnrpNativeFfiBindingNoExplicit native binding for controlled integration and tests.

NnrpListenOptions

FieldTypeRequiredDescription
endpointstring | URLYesLocal NNRP endpoint shared by the logical listener set.
providerRoutesNnrpServerProviderRoutesNoPer-carrier bind locator and server security.
transportPolicyNnrpTransportPolicyNoListener-set eligibility and stable preference policy.
transportsreadonly NnrpNativeTransportProvider[]NoTransport providers allowed in this logical listener set.
sessionDefaultsNnrpServerSessionOptionsNoNegotiation and admission defaults for accepted sessions.

NnrpServerSessionOptions

FieldTypeDefaultDescription
supportedProfilesreadonly number[][STANDARD_PROFILE_TOKEN]Profiles accepted during SESSION_OPEN.
supportedCacheObjectsreadonly NnrpCacheObjectKind[][]Cache object kinds advertised by the server.
maxCacheObjectsbigint0nMaximum retained cache objects; zero disables the limit.
maxCacheObjectBytesnumber0Maximum bytes per cache object; zero disables the limit.
schemaRegistryNnrpSchemaRegistrystandard registrySchemas accepted by the server session.
resumeTokenBytesnumber24Opaque recovery-token capacity.
maxInFlightOperationsnumber4Maximum concurrent operations negotiated per session.
grantedOperationCreditnumber2Initial operation credit granted to the peer.
leaseTtlMsnumber30_000Default operation lease lifetime.
resumeWindowMsnumber120_000Time during which a disconnected session may resume.
applicationPolicyNnrpServerSessionPolicyaccept valid sessionsAsynchronous application admission policy.

NnrpServerSessionPolicy

ts
interface NnrpServerSessionPolicy {
  evaluate(open: NnrpSessionOpenMetadata): Promise<NnrpServerSessionPolicyDecision>;
}

NnrpServerSessionPolicyDecision contains accepted: boolean, sessionErrorCode: number, and an optional diagnostic: string. Accepted decisions use error code 0; rejected decisions use a non-zero application-defined session error code.

NnrpServerAcceptOptions

FieldTypeDefaultDescription
timeoutMsnumber0Bounded accept wait; zero uses the runtime's non-blocking mode.

Native session handles and generations are internal and are never accepted through this option.

NnrpTransportSelectionOptions

FieldTypeRequiredDescription
peerManifestNnrpCapabilityManifestYesPeer capability manifest.
providersreadonly NnrpTransportProvider[]NoLocal providers to consider.
policyNnrpTransportPolicyNoSelection policy override.
requestedMaxFrameBytesbigintNoWorkload limit checked against provider limits.
candidateReadinessreadonly NnrpTransportCandidateReadiness[]YesRoute/security evidence for every provider candidate.
probeObservationsreadonly NnrpTransportProbeObservation[]NoSucceeded/failed probe evidence keyed by provider identity.

NNRP Documentation