Skip to content

传输契约矩阵 ​

本矩阵把每个一方 transport 与其公开入口、源码文件和契约测试一一对应,目的是让可靠性说法可以被核查:原始线上协议 transport 必须暴露投递失败;生产级投递必须明确说明使用的包装器或队列;生命周期行为必须有对应的测试路径。

pnpm verify:transport-contracts 会把本页与各包的导出和仓库文件树进行核对。新增 transport 源文件或公开的 transport 子路径时,必须在同一次变更中更新本矩阵。

契约规则 ​

  • 原始 HTTP/厂商 transport 会把非 2xx 响应和被拒绝的 fetch 调用作为失败向上传递;除非外面包了包装器,否则不会静默重试。
  • 原始线上协议 sink 要用于生产投递,需要 batchTransport()、retryTransport()、fallbackTransport(),或使用一个在文档中说明了自身队列/重试行为的 transport。
  • 依赖运行时的 transport 必须说明所依赖的平台能力,并测试依赖不可用或失败的情况。
  • 持久化路径必须在测试中体现 flush() 或持久化/重放行为。
  • 仅用于测试或仅用于显示的 transport 必须明确说明这一点,不能暗示具备持久投递能力。

矩阵 ​

ID公开入口导出源码投递契约失败与生命周期契约契约测试
core-batch@loggerjs/core/transport-batchbatchTransportpackages/core/src/transports/batch.ts为任意内部 transport 提供有界队列、字节预算、定时 flush、并发、重试、熔断器和丢弃计数。失败的批次按策略重试或重新入队;flush() 会排空队列;close() 停止定时器并 flush 待处理的工作。packages/core/test/batch-transport.test.ts
packages/core/test/batch-coverage.test.ts
core-retry@loggerjs/core/transport-reliabilityretryTransport, fallbackTransportpackages/core/src/transports/reliability.ts为已经自带批量、或可以接受逐次调用重试的 transport 提供即时重试/回退包装器。重试使用有上限的退避;熔断和回退行为可以观测;flush()/close() 会转交给被包装的 transport。packages/core/test/reliability-transport.test.ts
packages/core/test/reliability-coverage.test.ts
core-console@loggerjs/core/transport-consoleconsoleTransportpackages/core/src/transports/console.ts与运行时无关的本地 console sink。通过未被 patch 的 console 函数输出,避免采集递归;默认过滤来自 console 的事件。packages/core/test/console-transport.test.ts
core-memory根入口memoryTransportpackages/core/src/transports/memory.ts有界的内存诊断环形缓冲区;不持久化。超过容量时丢弃最旧的条目;快照是同步的,仅在当前进程内有效。packages/core/test/logger.test.ts
packages/core/test/integration-api.test.ts
core-test@loggerjs/core/transport-testtestTransportpackages/core/src/transports/test.ts仅用于断言的内存 sink,提供等待和快照辅助方法。可注入的失败和等待超时属于测试契约;不是生产用 sink。packages/core/test/test-transport.test.ts
browser-http@loggerjs/browser/transport-httpbrowserHttpTransportpackages/browser/src/http-transport.ts浏览器 fetch 投递,支持批量、重试选项、可选离线队列、payload 转换和页面退出时的 Beacon 模式。非 2xx 响应和被拒绝的 fetch 都视为失败;页面退出时的 Beacon 是尽力而为,受大小和运行时限制。packages/browser/test/http-transport.test.ts
tests/e2e/browser-production.spec.ts
browser-indexeddb-queue@loggerjs/browser/offline-indexeddb, @loggerjs/browser/transport-indexeddbindexedDbBrowserHttpOfflineQueue, indexedDbTransportpackages/browser/src/indexeddb-offline-queue.ts
packages/browser/src/indexeddb-transport.ts
持久化的浏览器队列/存储,用于刷新后仍能重放和本地导出。IndexedDB 不可用、配额、隐私模式、升级被阻塞、TTL 和清理都依赖运行时,并有对应测试。packages/browser/test/indexeddb-offline-queue.test.ts
packages/browser/test/indexeddb-transport.test.ts
tests/e2e/browser-production.spec.ts
browser-offline-first@loggerjs/browser/offline-first-transportofflineFirstTransportpackages/browser/src/offline-first-transport.ts优先投递到远端,离线或远端失败后入队并稍后重放。远端拒绝时 payload 进入队列;存储和网络可用时,flush() 会重放队列中的记录。packages/browser/test/offline-first-transport.test.ts
browser-page-exit@loggerjs/browser/transport-http, @loggerjs/browser/integration-page-lifecyclebrowserHttpTransport 的页面生命周期 flushpackages/browser/src/http-transport.ts
packages/browser/src/page-lifecycle.ts
浏览器 HTTP 在 pagehide/visibilitychange 时的最后一次投递机会。sendBeacon 是尽力而为;不支持或发送失败时,会尽可能回退到已配置的 HTTP 行为。packages/browser/test/http-transport.test.ts
packages/browser/test/page-lifecycle.test.ts
tests/e2e/browser-production.spec.ts
browser-service-worker@loggerjs/browser/transport-service-workerbrowserServiceWorkerTransportpackages/browser/src/service-worker-transport.ts在已配置的或已就绪的 service worker controller 可用前排队,之后再发送消息。registration/controller 是否可用取决于运行时;ready() 和 flush() 暴露了接收边界。packages/browser/test/service-worker-transport.test.ts
tests/e2e/browser-production.spec.ts
browser-websocket@loggerjs/browser/transport-websocketbrowserWebSocketTransportpackages/browser/src/websocket-transport.ts实时 WebSocket sink,连接中或已关闭时使用有界队列。重连由调用方负责;队列上限和关闭/错误行为都有明确定义。packages/browser/test/websocket-transport.test.ts
browser-broadcast@loggerjs/browser/transport-broadcast-channelbrowserBroadcastChannelTransportpackages/browser/src/broadcast-channel-transport.ts通过 BroadcastChannel 向同源的其他标签页分发日志。不保证存在接收方;API 缺失和关闭语义有对应测试。packages/browser/test/broadcast-channel-transport.test.ts
node-http@loggerjs/node/transport-httpnodeHttpTransportpackages/node/src/http-transport.tsNode fetch 投递,内部用 batchTransport 包装。非 2xx 或被拒绝的 fetch 由包装器重试;flush() 会排空批量的 HTTP 工作。packages/node/test/http-transport.test.ts
node-file@loggerjs/node/transport-file, @loggerjs/node/transport-rotating-filefileTransport, rotatingFileTransportpackages/node/src/file-transport.ts
packages/node/src/rotating-file-transport.ts
本地 NDJSON 文件持久化,可选同步写入、缓冲和按大小轮转。flush() 排空正常写入;支持时,flushSync() 是崩溃路径契约;轮转要求单一写入者。packages/node/test/file-transport.test.ts
packages/node/test/rotating-file-transport.test.ts
node-stdout@loggerjs/node/transport-stdoutstdoutTransport, stderrTransportpackages/node/src/stdout-transport.tsstdout/stderr 的 NDJSON 流 sink,可选缓冲。感知背压并等待 drain;默认把 EPIPE 视为正常关闭;flush() 排空缓冲的写入。packages/node/test/stdout-transport.test.ts
node-syslog@loggerjs/node/transport-syslognodeSyslogTransportpackages/node/src/syslog-transport.ts通过 UDP 或 TCP 发送 RFC 风格的 syslog 格式消息。UDP 可能丢失;TCP 依赖 socket 生命周期;格式化、发送、关闭和错误行为都有测试。packages/node/test/syslog-transport.test.ts
node-worker@loggerjs/node/transport-workerworkerTransportpackages/node/src/worker-transport.ts把工作卸载到 worker 线程,支持 codec 传输和可选的 ready/ack 握手。启动、ack 超时、回退、关闭和自动结束行为共同定义了接收边界。packages/node/test/worker-transport.test.ts
database@loggerjs/database/transport, @loggerjs/database/sqlite, @loggerjs/database/postgresdatabaseTransport, sqliteTransport, postgresTransportpackages/database/src/transport.ts
packages/database/src/sqlite.ts
packages/database/src/postgres.ts
把批量行映射交给应用提供的适配器、SQLite 驱动或 Postgres 客户端。适配器/驱动的失败通过 batch/retry 和内部错误上报暴露;事务语义由驱动负责。packages/database/test/database-transport.test.ts
datadog@loggerjs/datadog/transportdatadogLogsTransportpackages/datadog/src/index.ts原始的 Datadog Logs HTTP payload sink。缺少 fetch、非 2xx 或被拒绝的 fetch 都会让原始 transport 失败;生产持久性需要 batchTransport() 或 retryTransport()。packages/datadog/test/datadog-transport.test.ts
elastic@loggerjs/elastic/transportelasticTransportpackages/elastic/src/index.ts原始的 Elastic bulk HTTP payload sink。缺少 fetch、非 2xx 或被拒绝的 fetch 都会让原始 transport 失败;生产持久性需要 batchTransport() 或 retryTransport()。packages/elastic/test/elastic-transport.test.ts
loki@loggerjs/loki/transportlokiTransportpackages/loki/src/index.ts原始的 Loki push HTTP payload sink。缺少 fetch、非 2xx 或被拒绝的 fetch 都会让原始 transport 失败;生产持久性需要 batchTransport() 或 retryTransport()。packages/loki/test/loki-transport.test.ts
cloudwatch@loggerjs/cloudwatch/transportcloudWatchLogsTransportpackages/cloudwatch/src/index.ts原始的 CloudWatch Logs API payload sink。缺少 fetch、非 2xx 或被拒绝的 fetch 都会让原始 transport 失败;sequence token 的推进仍取决于调用方和服务端。packages/cloudwatch/test/cloudwatch-transport.test.ts
sentry@loggerjs/sentry/transportsentryTransportpackages/sentry/src/index.ts适配应用提供的 Sentry SDK 对象。SDK 抛出的异常会让原始 transport 失败,并可被包装器观察到;capture 级别映射和被禁用的 SDK 方法有测试。packages/sentry/test/sentry-transport.test.ts
otel-otlp@loggerjs/otel/transport-http, @loggerjs/otel/codec-otlp-jsonotlpHttpTransport, otlpJsonCodecpackages/otel/src/transport.ts
packages/otel/src/otlp-json.ts
OTLP/HTTP JSON 投递,内部用 batchTransport 包装;codec 把 LoggerJS 事件映射为 OTLP 日志。非 2xx 或被拒绝的 fetch 由包装器重试;codec 的结构和元数据映射有测试固定。packages/otel/test/otlp-json.test.ts
pretty-console@loggerjs/pretty/transport-consoleprettyConsoleTransportpackages/pretty/src/console-transport.ts面向人阅读的浏览器/console 显示 sink。仅用于显示;避免 console 采集回环,并为 DevTools 保留原始参数。packages/pretty/test/console-transport.test.ts
pretty-stream@loggerjs/pretty/transport-streamprettyStreamTransport, prettyStdoutTransport, prettyStderrTransportpackages/pretty/src/stream-transport.ts面向人阅读的流 sink,用于 Node 终端或类流目标。背压和流错误可见;支持时,flush() 会等待 drain。packages/pretty/test/stream-transport.test.ts

相关链接 ​

基于 MIT License 发布。