Skip to content

运行时控制与对象

JavaScript/TypeScript Preview 4 API 公开运行时控制、对象引用 codec 与 typed runtime event。WebSocket packet framing 保持在 WebSocket Provider 内部,不作为应用层公开 helper。运行时无关 helper 位于 @nnrp/core;浏览器包可以通过 @nnrp/browser-client 使用 WASM 支撑的 helper;后端包通过角色包和传输包接入 native 能力。传输包必须维护自己的传输行为,不只是隐藏实现上的配置开关。

导入

ts
import {
  decodeCacheInvalidateMetadata,
  decodeFlowUpdateMetadata,
  decodeFrameSubmitMetadata,
  decodeResultHintMetadata,
  decodeRuntimeControlMetadata,
  decodeRuntimeObjectMetadata,
  encodeCacheInvalidateMetadata,
  encodeFlowUpdateMetadata,
  encodeFrameSubmitMetadata,
  encodeResultHintMetadata,
  encodeRuntimeControlMetadata,
  encodeRuntimeObjectMetadata,
  encodeRuntimeObjectMetadataSegments,
  NnrpMessageType,
} from "@nnrp/core";

基线 Metadata Codec

@nnrp/core 为 Preview 4 角色 API 和公开一致性测试套件使用的每一种已冻结 NNRP/1 基线 metadata 类型提供精确宽度 codec。每个 encoder 接受对应 metadata 类型并返回 Uint8Array;每个 decoder 接受 Uint8Array 并返回同一种 metadata 类型。Decoder 必须拒绝错误长度、非零保留字段、非法枚举值和非法 flag 组合。

Metadata 类型EncoderDecoder
ClientHelloMetadataencodeClientHelloMetadatadecodeClientHelloMetadata
SessionPatchAckMetadataencodeSessionPatchAckMetadatadecodeSessionPatchAckMetadata
FlowUpdateMetadataencodeFlowUpdateMetadatadecodeFlowUpdateMetadata
ResultHintMetadataencodeResultHintMetadatadecodeResultHintMetadata
FrameSubmitMetadataencodeFrameSubmitMetadatadecodeFrameSubmitMetadata
ResultPushMetadataencodeResultPushMetadatadecodeResultPushMetadata
CachePutMetadataencodeCachePutMetadatadecodeCachePutMetadata
CacheAckMetadataencodeCacheAckMetadatadecodeCacheAckMetadata
CacheInvalidateMetadataencodeCacheInvalidateMetadatadecodeCacheInvalidateMetadata
TransportProbeMetadataencodeTransportProbeMetadatadecodeTransportProbeMetadata
TransportProbeAckMetadataencodeTransportProbeAckMetadatadecodeTransportProbeAckMetadata
ObjectReferenceBlockencodeObjectReferenceBlockdecodeObjectReferenceBlock

Packet 级一致性测试把这些 metadata codec 与 native/WASM runtime 拥有的 common-header framing 组合起来,不会定义第二套 JavaScript wire 实现。

encodeRuntimeControlMetadata

编码一个 Preview 4 控制面 metadata。

参数类型必填说明
messageTypeNnrpMessageTypePreview 4 控制消息类型。
metadata运行时控制 metadatamessageType 匹配的数据结构。
tailUint8Array扩展字节、诊断字节、进度 body 或 partial result body。
返回
Uint8Array
ts
const payload = encodeRuntimeControlMetadata(NnrpMessageType.Progress, {
  operationId: 42n,
  progressSequence: 1n,
  stageCode: 2,
  percentX100: 2500,
  objectId: 0n,
  bodyBytes: 0,
});

decodeRuntimeControlMetadata

解码一个控制面 metadata payload。

参数类型必填说明
messageTypeNnrpMessageType决定 metadata 布局的消息类型。
payloadUint8Arraymetadata 字节和声明的 tail。
返回
DecodedRuntimeControlMetadata

DecodedRuntimeControlMetadata 包含两个只读字段:

字段类型说明
metadataRuntimeControlMetadatamessageType 选择的 metadata 对象。
tailUint8Array已声明诊断、body 或扩展 payload 的独立副本。

encodeRuntimeObjectMetadata

编码对象、对象引用、对象增量、缓存引用和缓存 miss metadata。

参数类型必填说明
messageTypeNnrpMessageTypeObjectDeclareObjectRefObjectReleaseObjectPatchObjectDeltaCacheReferenceCacheMiss
metadata运行时对象 metadatamessageType 匹配的数据结构。
tailUint8Array扩展字节、诊断字节或 delta payload。
返回
Uint8Array

encodeRuntimeObjectMetadataSegments

把运行时对象 metadata 与有序 tail segment 直接编码到一个独立 payload。对象 metadata 与大块 delta 分开提供时,该 helper 不需要先构造中间拼接缓冲区。

参数类型必填说明
messageTypeNnrpMessageTypeencodeRuntimeObjectMetadata 接受的运行时对象或缓存消息类型。
metadata运行时对象 metadatamessageType 匹配;声明的 tail 长度应用于所有 segment 的长度总和。
tailSegmentsreadonly Uint8Array[]按 wire 顺序排列的 tail segment;每段直接复制到返回的独立 payload。
返回
Uint8Array

ObjectPatchObjectDelta 必须传 [metadataBody, delta]。即使其中一段为空,segment 顺序仍有语义。

decodeRuntimeObjectMetadata

解码一个运行时对象或缓存 metadata payload。

参数类型必填说明
messageTypeNnrpMessageType决定 metadata 布局的消息类型。
payloadUint8Arraymetadata 字节和声明的 tail。
返回
DecodedRuntimeObjectMetadata

基线缓存失效

Preview4 复用已有的 NNRP/1 CacheInvalidate frame,不再定义第二种 runtime invalidation message。

API参数返回值
encodeCacheInvalidateMetadataCacheInvalidateMetadataUint8Array
decodeCacheInvalidateMetadataUint8ArrayCacheInvalidateMetadata

CacheInvalidateMetadata 的冻结字段为 invalidateScopecacheNamespacecacheKeyHicacheKeyLoreasonCodecacheNamespace 类型为 number,两个 key word 类型均为 bigintCachePutMetadataCacheAckMetadataObjectReferenceBlock 使用相同身份字段宽度。

本地缓存租约状态

CacheLease 是已经授予租约的 TypeScript 本地校验值,不是 wire payload,也不是 native/WASM handle。

TypeScript 字段类型协议字段
objectIdCacheObjectIdobject_id
objectVersionbigintobject_version
leaseIdbigintlease_id
ownerScopeCacheLeaseOwnerScopeowner_scope
ownerIdbigintowner_id
grantedAtMillisbigintgranted_at_ms
ttlMillisnumberu32ttl_ms

CacheObjectId 包含 cacheNamespace: numberu32)、cacheKeyHi: bigintcacheKeyLo: bigintobjectKind: NnrpCacheObjectKindu32)。CacheLeaseOwnerScope 的取值为 Connection = 0Session = 1Operation = 2。本地校验应使用 expiresAtMillisisExpiredAtvalidateVersion

高层 Runtime Frame 契约

应用通过 client 或 server session 方法发送 Preview4 控制帧、运行时对象和缓存帧,不需要自行构造 native request、选择 ABI 符号或拼接 metadata buffer。SDK 校验并编码 typed 参数后,每个 session 方法只执行一次粗粒度 runtime 调用。

内部 native/WASM binding 方法冻结为:

ts
sendRuntimeFrame(request: NnrpRuntimeFrameSendRequest): void | Promise<void>;

NnrpRuntimeFrameSendRequest 的 readonly 字段为 sessionOptionsmessageTypeframeIdpayloadpayload 是完整编码后的 metadata 与声明 tail。它属于内部 binding 契约;应用使用 client 和 server 页面记录的具名 session 方法。

NnrpRuntimeEvent

每个入站 role event 都解码为一个包含完整 wire header 和两个闭合 tagged union 的 envelope。应用通过 event.metadata.typeevent.tail.type 做判别;已删除的扁平 NnrpRuntimeFrameEvent.type 不属于 Preview4 API。

ts
interface NnrpRuntimeEvent {
  readonly header: NnrpRuntimeFrameHeader;
  readonly metadata: NnrpRuntimeEventMetadata;
  readonly tail: NnrpRuntimeEventTail;
}

NnrpRuntimeEventMetadataNnrpRuntimeEventTail 都是闭合 tagged union;下方穷举表根据 header.messageType 唯一确定两个 union 的 variant。

NnrpRuntimeFrameHeader 完整保留 versionMajorwireFormatmessageTypeflagssessionIdframeIdviewIdrouteIdtraceId。本地 lifecycle 通知没有 wire header,因此保持为 NnrpOperationLifecycleEvent;SDK 不会伪造全零 header。

下表是穷举映射。消息类型在 event 交付给应用前确定唯一 metadata variant 和 tail variant。

消息metadata.typeMetadata 值tail.type
SessionClosesession_closeNnrpSessionCloseMetadatanone
FrameSubmitframe_submitNnrpFrameSubmitMetadatabody
FrameCancelResultDropnonenone
ResultPushresult_pushNnrpResultPushMetadatabody
ResultHintresult_hintNnrpResultHintMetadatanone
FlowUpdateflow_updateNnrpFlowUpdateMetadatanone
CancelAbortcontrol_requestControlRequestMetadatadiagnostic
PriorityUpdateDeadlineExpireAtschedulingSchedulingMetadatanone
SupersedesupersedeSupersedeMetadatadiagnostic
BudgetUpdatebudgetBudgetMetadatanone
ProgressprogressProgressMetadatabody
PartialResultpartial_resultPartialResultMetadatabody
BackpressureCreditUpdatepressurePressureMetadatanone
CapabilityNegotiationDegradeProfilecapabilityCapabilityMetadatabody
RouteHintExecutionHintroute_hintRouteHintMetadatabody
TraceContexttrace_contextTraceContextMetadatabody
ResultDropReasonresult_drop_reasonResultDropReasonMetadatadiagnostic
ErrorRecoverablerecoverable_errorRecoverableErrorMetadatadiagnostic
RetryAfterretry_afterRetryAfterMetadatadiagnostic
ObjectDeclareobject_descriptorObjectDescriptorMetadatabody
ObjectRefobject_referenceObjectReferenceMetadatabody
ObjectReleaseobject_releaseObjectReleaseMetadatadiagnostic
ObjectPatchObjectDeltaobject_deltaObjectDeltaMetadatametadata_body_and_delta
CacheReferencecache_referenceCacheReferenceMetadatabody
CacheMisscache_missCacheMissMetadatadiagnostic
CacheInvalidatecache_invalidateCacheInvalidateMetadatanone

Tail variant 独立持有字节:body 包含 bodydiagnostic 包含 diagnosticmetadata_body_and_delta 包含彼此独立的 metadataBodydelta。声明长度不合法时,event 会在交付前失败。握手回复、probe 回复、迁移确认、缓存命令确认、ping/pong、连接关闭和 致命连接错误由各自的专用 API 消费,不会被重新分类为 runtime event。

运行时控制 Metadata

TypeScript 数值映射

线路字段中的 u64 在 JavaScript API 中使用 bigintu32u16u8i16 使用 number,非整数或超出冻结线路范围的值必须被拒绝。枚举字段使用对应的数值 TypeScript enum。 编码器复制可选 tail;解码器返回独立 Uint8Array,不暴露调用方输入缓冲区的 view。 ProgressMetadata.percentX100 接受 0..10000,以及表示未知值的冻结哨兵 0xffff

RuntimeControlMetadata 是下表全部 metadata interface 的 union。每个 metadata 对象只允许与其所在行列出的消息类型配对。

类型消息类型冻结字段
ControlRequestMetadataCancel, AbortoperationId, controlSequence, reasonCode, sourceRole, flags, diagnosticBytes
SchedulingMetadataPriorityUpdate, Deadline, ExpireAtoperationId, controlSequence, priorityClass, priorityDelta, deadlineUnixMs, flags
SupersedeMetadataSupersedeoldOperationId, newOperationId, controlSequence, dropReasonCode, flags, diagnosticBytes
BudgetMetadataBudgetUpdateoperationId, computeBudgetUnits, memoryBudgetBytes, bandwidthBudgetBytes, tokenBudget, flags
ProgressMetadataProgressoperationId, progressSequence, stageCode, percentX100, objectId, bodyBytes
PartialResultMetadataPartialResultoperationId, resultSequence, objectId, deltaSequence, bodyBytes, flags
PressureMetadataBackpressure, CreditUpdatescopeId, creditWindow, pressureLevel, pressureReason, retryAfterMs, flags
CapabilityMetadataCapabilityNegotiation, DegradeProfileprofileId, capabilityCount, costModelId, preferenceRank, limitBytes, limitUnits, bodyBytes, flags
RouteHintMetadataRouteHint, ExecutionHintoperationId, routeId, executorClass, affinityClass, deadlineUnixMs, bodyBytes, flags
TraceContextMetadataTraceContexttraceId, spanId, parentSpanId, stageCode, flags, bodyBytes
ResultDropReasonMetadataResultDropReasonoperationId, resultSequence, dropReasonCode, sourceRole, flags, diagnosticBytes
RecoverableErrorMetadataErrorRecoverableerrorCode, errorScope, recoveryAction, sourceRole, flags, retryAfterMs, relatedSessionId, relatedFrameId, relatedViewId, diagnosticBytes
RetryAfterMetadataRetryAfterscopeId, controlSequence, retryAfterMs, jitterMs, reasonCode, sourceRole, flags, diagnosticBytes

运行时对象 Metadata

类型消息类型冻结字段
ObjectDescriptorMetadataObjectDeclareobjectId, objectKind, producerRole, consumerRole, sessionId, byteSize, computeCostUnits, memoryLocationHint, ownershipHint, lifetimeHintMs, metadataBytes
ObjectReferenceMetadataObjectRefobjectId, operationId, objectVersion, offset, length, flags, metadataBytes
ObjectReleaseMetadataObjectReleaseobjectId, operationId, releaseReason, sourceRole, flags, diagnosticBytes
ObjectDeltaMetadataObjectPatch, ObjectDeltaobjectId, deltaSequence, regionOffset, regionBytes, deltaBytes, flags, metadataBytes
CacheReferenceMetadataCacheReferencecacheNamespace, cacheKeyHi, cacheKeyLo, profileId, reuseScope, leaseId, producerTraceId, expirationHintMs, metadataBytes, flags
CacheMissMetadataCacheMisscacheNamespace, cacheKeyHi, cacheKeyLo, missReason, profileId, diagnosticBytes

运行时枚举

枚举成员
RuntimeObjectKindUnspecified, Tensor, TokenBlock, ImageTile, FeatureMap, ToolResult, TraceSegment, OpaqueBytes, DocumentChunk, AudioChunk, VideoChunk, RoutePlan, CacheManifest
RuntimeRoleUnspecified, Client, Server, Runtime, Subagent, Tool, Scheduler, ConformanceRunner
ErrorScopeConnection, Session, Frame
MemoryLocationHintUnspecified, HostMemory, DeviceMemory, SharedMemory, RemoteMemory, MmapFile, ObjectStore
OwnershipHintUnspecified, ProducerOwned, ConsumerOwned, SessionOwned, Borrowed, TransferOnRef, ReleaseOnDrop
ObjectReleaseReasonCompleted, Cancelled, Expired, Replaced, Invalidated, OwnerClosed, LeaseExpired, ConformanceInjection
CacheReuseScopeOperation, Session, Connection, Global, Tenant, Profile
CacheMissReasonUnknown, NotFound, Expired, Invalidated, SchemaMismatch, ProducerUnavailable, LeaseRequired, PermissionDenied

NNRP Documentation