@arbitro/client 0.5.0 → 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/config.ts","../src/types/error.ts","../src/utils/text.ts","../src/utils/json.ts","../src/utils/codec.ts","../src/topic/topic.ts","../src/topic/lazy-message.ts","../src/proto/delivery.ts","../src/proto/manage.ts","../src/message/message.ts","../src/subscription/subscription.ts","../src/net/connection.ts","../src/proto/framer.ts","../src/common/logger.ts","../src/cron/cron-frame.ts","../src/consumer/consumer.ts","../src/stream/stream.ts","../src/client/metrics.ts","../src/stream/publish.ts","../src/cron/cron-builder.ts","../src/cron/cron-state.ts","../src/client/client.ts","../src/proto/fnv1a.ts","../src/workflow/task.ts","../src/workflow/handle.ts","../src/workflow/processor.ts","../src/workflow/workflow.ts","../src/utils/zod.ts"],"sourcesContent":["// Values must match Rust enum variant names (rmp_serde serializes as PascalCase)\nexport enum DeliverPolicy {\n All = 'All',\n Last = 'Last',\n New = 'New',\n BySeq = 'ByStartSeq',\n ByTime = 'ByStartTime',\n}\n\nexport enum JournalType {\n Memory = 'Memory',\n Tolerant = 'Tolerant',\n Strict = 'Strict',\n}\n\nexport enum AckPolicy {\n Explicit = 'explicit',\n None = 'none',\n}\n\nexport interface FlushConfig {\n intervalMs?: number // default: 10\n maxMessages?: number // default: 512\n maxBytes?: number // default: 65_536\n}\n\nexport type JournalConfig =\n | { type: JournalType.Memory }\n | { type: JournalType.Tolerant }\n | { type: JournalType.Strict; flush?: FlushConfig }\n\nexport interface StreamConfig {\n subjectFilter: string\n journal?: JournalConfig\n maxMsgs?: number\n maxBytes?: number\n maxAgeMs?: number\n /**\n * Per-stream broker-side dedup window in milliseconds.\n *\n * - `0` or undefined (default): no dedup. Every publish is stored;\n * `msgId` is ignored.\n * - `>0`: any publish that carries a `msgId` matching one the\n * broker has stored for THIS stream within the last\n * `idempotencyWindowMs` is rejected with the `IdempotencyDuplicate`\n * wire error. Useful for safe retries — the first publish wins.\n *\n * The broker clamps requested windows above 5 minutes (300 000 ms)\n * down to that ceiling, matching JetStream behaviour.\n */\n idempotencyWindowMs?: number\n}\n\nexport interface DeleteStreamOpts {\n deleteData?: boolean\n}\n\nexport interface StreamInfo {\n name: string\n config: StreamConfig\n lastSeq: number\n}\n\n/**\n * Per-subject inflight cap. Each entry caps the number of in-flight\n * (delivered, unacked) messages on subjects matching `pattern`. Patterns\n * may use NATS-style wildcards (`*`, `>`).\n *\n * Only enforced when the owning consumer's `ackPolicy` is `Explicit`;\n * silently dropped server-side for fire-and-forget consumers (because\n * fire-and-forget bindings skip inflight tracking entirely).\n */\nexport interface SubjectInflightLimit {\n pattern: string\n limit: number\n}\n\nexport interface ConsumerConfig {\n name?: string // defaults to stream name when created via stream.consumer()\n /** Shared consumer group name for round-robin delivery. Defaults to `name`. */\n group?: string\n filter?: string // defaults to \"${streamName}.>\" when created via stream.consumer()\n fanout?: boolean // broadcast — every subscriber receives every message\n /** Consumer-side ACK policy. None = fire-and-forget delivery, Explicit = consumer must ACK. */\n ackPolicy?: AckPolicy\n deliverPolicy?: DeliverPolicy\n startSeq?: bigint\n startTime?: bigint\n maxAckPending?: number\n ackWaitMs?: number\n maxDeliver?: number\n removeUnusedAfterMs?: number\n /**\n * Per-subject max inflight (list of pattern → limit pairs).\n * Only effective with `ackPolicy: Explicit`.\n */\n maxSubjectInflights?: SubjectInflightLimit[]\n}\n\nexport interface ConsumerInfo {\n group: string\n stream: string\n config: ConsumerConfig\n}\n\nexport interface SubscribeOptions {\n fetchTimeoutMs?: number\n}\n\nexport interface ReconnectConfig {\n enabled?: boolean\n maxAttempts?: number\n intervalMs?: number\n jitter?: boolean\n}\n\nexport interface TlsConfig {\n enabled?: boolean\n ca?: Buffer | string\n cert?: Buffer | string\n key?: Buffer | string\n}\n\nexport interface ClientConfig {\n servers: string[]\n prefix?: string\n timeout?: number\n reconnect?: ReconnectConfig\n tls?: TlsConfig\n // Pino-compatible logger. Default: silent.\n logger?: import('../common/logger').Logger\n}\n","export class ArbitroError extends Error {\n constructor(\n message: string,\n readonly code: 'connect' | 'timeout' | 'protocol' | 'server' | 'closed',\n readonly brokerName?: string,\n readonly brokerDetails?: unknown,\n /**\n * Numeric wire error code from the broker's `RepError` frame. Only\n * populated when `code === 'server'`. Use the `ErrorCode` enum to\n * compare (e.g. `err.wireCode === ErrorCode.IdempotencyDuplicate`).\n */\n readonly wireCode?: number,\n ) {\n super(message)\n this.name = 'ArbitroError'\n }\n}\n\n/**\n * Wire-level error codes. Mirrors the `ErrorCode` enum in\n * `arbitro-proto`. New codes added to the broker MUST be appended here\n * with the matching numeric value.\n */\nexport const ErrorCode = {\n // 0x00xx — Protocol\n UnknownAction: 0x0001,\n BufferTooShort: 0x0002,\n InvalidLength: 0x0003,\n InvalidEntryCount: 0x0004,\n // 0x01xx — Auth\n AuthRequired: 0x0101,\n AuthFailed: 0x0102,\n // 0x02xx — Stream\n StreamNotFound: 0x0201,\n StreamAlreadyExists: 0x0202,\n StreamFull: 0x0203,\n StreamFilterOverlap: 0x0204,\n SubjectNotFound: 0x0205,\n /** Publish carried a `msgId` already seen for this stream within\n * `idempotencyWindowMs`. Original write stands; safe to treat as\n * a successful publish at the application level. */\n IdempotencyDuplicate: 0x0206,\n // 0x03xx — Consumer\n ConsumerNotFound: 0x0301,\n ConsumerAlreadyExists: 0x0302,\n ConsumerFilterOverlap: 0x0303,\n // 0x04xx — Delivery\n InvalidSequence: 0x0401,\n MaxInflightReached: 0x0402,\n AckTimeout: 0x0403,\n // 0x05xx — System\n ServerShuttingDown: 0x0501,\n InternalError: 0x0502,\n} as const\n\nexport type ErrorCodeValue = (typeof ErrorCode)[keyof typeof ErrorCode]\n\nexport interface BrokerError {\n name: string\n message: string\n details?: unknown\n}\n","export function encodeString(s: string): Buffer {\n return Buffer.from(s, 'utf8')\n}\n\nexport function decodeString(buf: Buffer): string {\n return buf.toString('utf8')\n}\n","export function encodeJson(value: unknown): Buffer {\n return Buffer.from(JSON.stringify(value), 'utf8')\n}\n\nexport function decodeJson<T = unknown>(buf: Buffer): T {\n return JSON.parse(buf.toString('utf8')) as T\n}\n","import { Packr, Unpackr } from 'msgpackr'\n\n// ── Base interface ─────────────────────────────────────────────────────────\n\n/** Core encode/decode contract. `fields` is required only for schema-based codecs\n * that power LazyMessage<T> getters — other encodings may omit it. */\nexport interface Encoding<T> {\n encode(value: T): Buffer\n decode(buf: Buffer): T\n readonly fields?: string[]\n}\n\n// ── FieldType inference ────────────────────────────────────────────────────\n\n/** Maps a FieldType string literal to its corresponding TypeScript type. */\nexport type FieldTypeMap = {\n string: string\n number: number\n boolean: boolean\n bigint: bigint\n buffer: Buffer\n unknown: unknown\n}\n\n/** Infers the TypeScript record type from a schema definition.\n * Eliminates the need to define both an interface and a Schema<T>. */\nexport type InferSchema<S extends Record<string, FieldType>> = {\n [K in keyof S]: FieldTypeMap[S[K]]\n}\n\n// ── TextEncoding — abstract base for string-based encodings ───────────────\n\nexport abstract class TextEncoding implements Encoding<string> {\n abstract readonly encoding: BufferEncoding\n\n encode(value: string): Buffer { return Buffer.from(value, this.encoding) }\n decode(buf: Buffer): string { return buf.toString(this.encoding) }\n}\n\n// ── StringCodec — UTF-8 by default ────────────────────────────────────────\n\nexport class StringCodec extends TextEncoding {\n readonly encoding: BufferEncoding\n constructor(encoding: BufferEncoding = 'utf8') {\n super()\n this.encoding = encoding\n }\n}\n\n// ── JsonCodec<T> — composes StringCodec, never extends it ─────────────────\n\nexport class JsonCodec<T> implements Encoding<T> {\n private readonly text: StringCodec\n constructor(encoding: BufferEncoding = 'utf8') {\n this.text = new StringCodec(encoding)\n }\n encode(value: T): Buffer { return this.text.encode(JSON.stringify(value)) }\n decode(buf: Buffer): T { return JSON.parse(this.text.decode(buf)) as T }\n}\n\n// ── Codec<T> — schema-based msgpack, fastest ──────────────────────────────\n// Fields are fixed at construction — no key discovery on hot path.\n\nexport type FieldType = 'string' | 'number' | 'boolean' | 'bigint' | 'buffer' | 'unknown'\nexport type Schema<T> = { [K in keyof Required<T>]: FieldType }\n\nexport class Codec<T extends Record<string, unknown>> implements Encoding<T> {\n readonly fields: (keyof T & string)[]\n private readonly packr: Packr\n private readonly unpackr: Unpackr\n\n constructor(schema: Schema<T>) {\n this.fields = Object.keys(schema) as (keyof T & string)[]\n this.packr = new Packr({ structuredClone: false, useRecords: false })\n this.unpackr = new Unpackr({ structuredClone: false, useRecords: false })\n }\n\n // Encodes only known fields in definition order — no extras, no key enumeration.\n encode(value: T): Buffer {\n const obj: Record<string, unknown> = {}\n for (const k of this.fields) obj[k] = value[k]\n return Buffer.from(this.packr.pack(obj))\n }\n\n decode(buf: Buffer): T {\n return this.unpackr.unpack(buf) as T\n }\n}\n\n// ── schema() factory ──────────────────────────────────────────────────────\n// Creates a Codec<T> with T inferred from the schema definition.\n// No need to define a separate interface.\n//\n// Before: new Codec<Order>({ id: 'number', status: 'string' })\n// After: schema({ id: 'number', status: 'string' }) ← type inferred\n\n/** Creates a msgpack Codec with the TypeScript type inferred from the schema definition. */\nexport function schema<S extends Record<string, FieldType>>(def: S): Codec<InferSchema<S>> {\n return new Codec<InferSchema<S>>(def as Schema<InferSchema<S>>)\n}\n","import type { Stream } from '../stream/stream'\nimport type { Encoding } from '../utils/codec'\nimport type { Subscription } from '../subscription/subscription'\nimport { makeLazyMessage, type LazyMessage } from './lazy-message'\n\n// Topic<T> — binds a subject + codec so publish/subscribe are always typed.\n// Instantiate via stream.topic(subject, codec).\nexport class Topic<T extends Record<string, unknown>> {\n private readonly fields: string[]\n\n constructor(\n private readonly stream: Stream,\n private readonly subject: string,\n private readonly codec: Encoding<T>,\n ) {\n this.fields = (codec as { fields?: string[] }).fields ?? []\n }\n\n publish(value: T): void {\n this.stream.publish(this.subject, this.codec.encode(value))\n }\n\n async publishAck(value: T): Promise<void> {\n await this.stream.publishAck(this.subject, this.codec.encode(value))\n }\n\n publishBatch(values: T[]): void {\n this.stream.publishBatch(values.map((v) => ({\n subject: this.subject,\n payload: this.codec.encode(v),\n })))\n }\n\n async subscribe(\n group: string,\n cb: (msg: LazyMessage<T>) => void,\n ): Promise<Subscription> {\n const consumer = this.stream.consumer({ name: group })\n return consumer.subscribe(this.codec, cb)\n }\n}\n","import type { Encoding } from '../utils/codec'\n\n// LazyMessage<T> = T fields as getters + meta methods.\n// Decode happens only on first field access — result is cached.\n// If msg.ack() is called without reading any field, zero deserialization occurs.\nexport type LazyMessage<T> = T & {\n readonly _raw: Buffer\n decode(): T\n ack(): void\n nack(): void\n nackDelay(delayMs: number): void\n}\n\n// Factory — uses Object.defineProperty for O(1) getter access (no Proxy overhead).\nexport function makeLazyMessage<T extends Record<string, unknown>>(\n raw: Buffer,\n codec: Encoding<T>,\n fields: string[],\n onAck: () => void,\n onNack: () => void,\n onNackDelay?: (ms: number) => void,\n): LazyMessage<T> {\n let cache: T | undefined\n const lazy = (): T => cache ??= codec.decode(raw)\n\n const msg: Record<string, unknown> = {\n _raw: raw,\n decode: lazy,\n ack: onAck,\n nack: onNack,\n nackDelay: onNackDelay ?? onNack,\n }\n\n for (const key of fields) {\n Object.defineProperty(msg, key, {\n get: () => lazy()[key as keyof T],\n enumerable: true,\n })\n }\n\n return msg as LazyMessage<T>\n}\n","// Delivery lifecycle — Subscribe/Unsubscribe (cold path, JSON) +\n// Ack/Nack/BatchAck/BatchNack (hot path, binary).\n\nimport { HEADER_SIZE, Action } from './constants'\nimport { frame } from './frame'\n\n// ── Subscribe / Unsubscribe (cold path, JSON body) ──────────────────────\n//\n// Mirror of `arbitro_proto::v2::cold::Subscribe`:\n// { consumer_id: u32, subscription_id: u32, filters: Vec<Vec<u8>> }\n//\n// `subscription_id = 0` selects legacy \"subscription_id == consumer_id\"\n// dispatch on the server. Empty `filters` (or single empty entry) =\n// catch-all.\n\nfunction packCold(action: Action, seq: bigint, body: unknown): Buffer {\n const utf8 = Buffer.from(JSON.stringify(body), 'utf8')\n const buf = frame(action, seq, utf8.length)\n utf8.copy(buf, HEADER_SIZE)\n return buf\n}\n\nexport function packSubscribe(\n seq: bigint, _connId: number, consumerId: number,\n filter: Buffer, _optionsFlags = 0,\n): Buffer {\n const filters: number[][] =\n filter.length === 0 ? [] : [Array.from(filter)]\n return packCold(Action.Subscribe, seq, {\n consumer_id: consumerId >>> 0,\n subscription_id: 0,\n filters,\n })\n}\n\nexport function packUnsubscribe(seq: bigint, _connId: number, consumerId: number): Buffer {\n return packCold(Action.Unsubscribe, seq, { consumer_id: consumerId >>> 0 })\n}\n\n// ── Ack / Nack ──────────────────────────────────────────────────────────\n\n// Body: consumer_id(4) + subject_hash(4) + seq(8) = 16B\nexport function packAck(\n seq: bigint, consumerId: number, subjectHash: number, ackSeq: bigint,\n): Buffer {\n const buf = frame(Action.Ack, seq, 16)\n buf.writeUInt32LE(consumerId, HEADER_SIZE)\n buf.writeUInt32LE(subjectHash, HEADER_SIZE + 4)\n buf.writeBigUInt64LE(ackSeq, HEADER_SIZE + 8)\n return buf\n}\n\nexport function packNack(\n seq: bigint, consumerId: number, subjectHash: number, nackSeq: bigint,\n): Buffer {\n const buf = frame(Action.Nack, seq, 16)\n buf.writeUInt32LE(consumerId, HEADER_SIZE)\n buf.writeUInt32LE(subjectHash, HEADER_SIZE + 4)\n buf.writeBigUInt64LE(nackSeq, HEADER_SIZE + 8)\n return buf\n}\n\n// ── Batch Ack / Nack ────────────────────────────────────────────────────\n\n// Body: consumer_id(4) + count(4) = 8B + entries[seq(8)+subject_hash(4)+_pad(4)] = 16B each\nexport function packBatchAck(\n seq: bigint, consumerId: number,\n entries: ReadonlyArray<{ seq: bigint; subjectHash: number }>,\n): Buffer {\n const buf = frame(Action.BatchAck, seq, 8 + entries.length * 16)\n buf.writeUInt32LE(consumerId, HEADER_SIZE)\n buf.writeUInt32LE(entries.length, HEADER_SIZE + 4)\n let off = HEADER_SIZE + 8\n for (const e of entries) {\n buf.writeBigUInt64LE(e.seq, off)\n buf.writeUInt32LE(e.subjectHash, off + 8)\n buf.writeUInt32LE(0, off + 12)\n off += 16\n }\n return buf\n}\n\n// entries[seq(8)+subject_hash(4)+delay_ms(4)] = 16B each\nexport function packBatchNack(\n seq: bigint, consumerId: number,\n entries: ReadonlyArray<{ seq: bigint; subjectHash: number; delayMs: number }>,\n): Buffer {\n const buf = frame(Action.BatchNack, seq, 8 + entries.length * 16)\n buf.writeUInt32LE(consumerId, HEADER_SIZE)\n buf.writeUInt32LE(entries.length, HEADER_SIZE + 4)\n let off = HEADER_SIZE + 8\n for (const e of entries) {\n buf.writeBigUInt64LE(e.seq, off)\n buf.writeUInt32LE(e.subjectHash, off + 8)\n buf.writeUInt32LE(e.delayMs, off + 12)\n off += 16\n }\n return buf\n}\n","// Stream + Consumer management frames.\n//\n// Wire format: cold-path management frames now ride as\n// `[Header 16B][serde_json(body)]`. The server's `v2::cold` module\n// decodes the JSON body via `serde_json::from_slice`. This file mirrors\n// the Rust `cold_body!` macro definitions in\n// `crates/arbitro-proto/src/v2/cold/mod.rs`.\n//\n// Important: Rust's `Vec<u8>` is JSON-encoded by serde as an array of\n// numbers (e.g. \"orders\" → `[111,114,100,101,114,115]`), NOT as a UTF-8\n// string. Every byte-sequence field below uses `Array.from(buffer)` to\n// match. Strings would require the Rust side to opt in to\n// `#[serde(with = \"serde_bytes\")]`, which it does not.\n//\n// Hot-path frames (Publish, Ack, etc.) keep the zerocopy binary format\n// from their dedicated modules.\n\nimport { HEADER_SIZE, Action } from './constants'\nimport { frame } from './frame'\n\n/** Build a cold-path frame: `[Header][serde_json(body)]`. */\nfunction packCold(action: Action, seq: bigint, body: unknown): Buffer {\n const utf8 = Buffer.from(JSON.stringify(body), 'utf8')\n const buf = frame(action, seq, utf8.length)\n utf8.copy(buf, HEADER_SIZE)\n return buf\n}\n\n/** Encode a `Buffer` as the JSON array form serde uses for `Vec<u8>`. */\nfunction bytesArr(b: Buffer): number[] { return Array.from(b) }\n\n// ── Stream management ──────────────────────────────────────────────────\n\n/**\n * Cold body for `CreateStream`. `idempotencyWindowMs = 0` disables\n * broker-side dedup (default); a non-zero value enables per-stream\n * `msgId` dedup over that window.\n */\nexport function packCreateStream(\n seq: bigint, name: Buffer, filter: Buffer,\n maxMsgs: bigint, maxBytes: bigint, maxAgeSecs: bigint,\n replicas = 1, journalKind = 0, retention = 0, discard = 0,\n idempotencyWindowMs = 0,\n): Buffer {\n return packCold(Action.CreateStream, seq, {\n name: bytesArr(name),\n filter: bytesArr(filter),\n max_msgs: Number(maxMsgs), // u64 — fits in JS number if < 2^53\n max_bytes: Number(maxBytes),\n max_age_secs: Number(maxAgeSecs),\n replicas, journal_kind: journalKind, retention, discard,\n idempotency_window_ms: idempotencyWindowMs >>> 0,\n })\n}\n\nexport const packDeleteStream = (seq: bigint, name: Buffer): Buffer =>\n packCold(Action.DeleteStream, seq, { name: bytesArr(name) })\n\nexport const packGetStream = (seq: bigint, name: Buffer): Buffer =>\n packCold(Action.GetStream, seq, { name: bytesArr(name) })\n\nexport const packPurgeStream = (seq: bigint, name: Buffer): Buffer =>\n packCold(Action.PurgeStream, seq, { name: bytesArr(name) })\n\nexport const packDrainSubject = (seq: bigint, name: Buffer, subject: Buffer): Buffer =>\n packCold(Action.DrainSubject, seq, {\n name: bytesArr(name),\n subject: bytesArr(subject),\n })\n\nexport const packListStreams = (seq: bigint, offset = 0, limit = 1000): Buffer =>\n packCold(Action.ListStreams, seq, { offset: offset >>> 0, limit: limit >>> 0 })\n\n// ── Consumer management ────────────────────────────────────────────────\n\n/** One per-subject inflight cap. Enforced only with `ackPolicy === Explicit`. */\nexport interface WireSubjectLimit {\n pattern: Buffer\n limit: number\n}\n\nexport interface CreateConsumerOpts {\n streamId: number; name: Buffer; group: Buffer; filter: Buffer\n maxInflight?: number; ackPolicy?: number; deliverPolicy?: number\n deliverMode?: number; ackWaitMs?: number; startSeq?: bigint\n subjectLimits?: WireSubjectLimit[]\n}\n\nexport function packCreateConsumer(seq: bigint, opts: CreateConsumerOpts): Buffer {\n const limits = (opts.subjectLimits ?? []).map(l => ({\n pattern: bytesArr(l.pattern),\n limit: l.limit >>> 0,\n }))\n return packCold(Action.CreateConsumer, seq, {\n stream_id: opts.streamId >>> 0,\n name: bytesArr(opts.name),\n group: bytesArr(opts.group),\n subject: bytesArr(opts.filter),\n max_inflight: Math.min(opts.maxInflight ?? 0, 0xFFFF),\n ack_policy: opts.ackPolicy ?? 1,\n deliver_policy: opts.deliverPolicy ?? 0,\n deliver_mode: opts.deliverMode ?? 0,\n ack_wait_ms: (opts.ackWaitMs ?? 0) >>> 0,\n start_seq: Number(opts.startSeq ?? 0n),\n subject_limits: limits,\n })\n}\n\nexport const packDeleteConsumer = (seq: bigint, consumerId: number): Buffer =>\n packCold(Action.DeleteConsumer, seq, { consumer_id: consumerId >>> 0 })\n\nexport const packGetConsumer = (seq: bigint, streamId: number, name: Buffer): Buffer =>\n packCold(Action.GetConsumer, seq, {\n stream_id: streamId >>> 0,\n name: bytesArr(name),\n })\n\nexport const packListConsumers = (seq: bigint, streamId = 0, offset = 0, limit = 1000): Buffer =>\n packCold(Action.ListConsumers, seq, {\n stream_id: streamId >>> 0,\n offset: offset >>> 0,\n limit: limit >>> 0,\n })\n\nexport const packConsumerStats = (seq: bigint, consumerId: number): Buffer =>\n packCold(Action.ConsumerStats, seq, { consumer_id: consumerId >>> 0 })\n\n/** M11: pause delivery to a consumer. */\nexport const packPauseConsumer = (seq: bigint, consumerId: number): Buffer =>\n packCold(Action.PauseConsumer, seq, { consumer_id: consumerId >>> 0 })\n\n/** M11: resume delivery to a previously paused consumer. */\nexport const packResumeConsumer = (seq: bigint, consumerId: number): Buffer =>\n packCold(Action.ResumeConsumer, seq, { consumer_id: consumerId >>> 0 })\n","import { HEADER_SIZE, OFF_SEQ } from '../proto/constants'\nimport { packAck, packNack, packBatchNack } from '../proto/v2'\n\n// V2 Deliver frame layout:\n// Header(16B) + DeliverBody(12B) + tail[subject + payload]\n//\n// DeliverBody offsets (relative to HEADER_SIZE):\n// 0: consumer_id u32\n// 4: subject_hash u32\n// 8: subject_len u16\n// 10: _pad u16\n\nconst BODY_OFF = HEADER_SIZE\nconst BODY_SIZE = 12\nconst TAIL_OFF = HEADER_SIZE + BODY_SIZE\nconst OFF_CONSUMER = BODY_OFF\nconst OFF_SUBJ_HASH = BODY_OFF + 4\nconst OFF_SUBJ_LEN = BODY_OFF + 8\n\ntype SendFn = (frame: Buffer) => void\n\nexport class Message {\n private readonly frame: Buffer\n private readonly send: SendFn\n private readonly seqFn: () => bigint\n private _subjectLen: number | undefined\n\n constructor(frame: Buffer, send: SendFn, seqFn: () => bigint) {\n this.frame = frame\n this.send = send\n this.seqFn = seqFn\n }\n\n /** Delivery sequence — used to ack/nack this message. */\n seq(): bigint {\n return this.frame.readBigUInt64LE(OFF_SEQ)\n }\n\n /** Consumer ID that received this delivery. */\n consumerId(): number {\n return this.frame.readUInt32LE(OFF_CONSUMER)\n }\n\n /** Subject hash — echoed back in ack for O(1) credit release. */\n subjectHash(): number {\n return this.frame.readUInt32LE(OFF_SUBJ_HASH)\n }\n\n private subjLen(): number {\n return this._subjectLen ??= this.frame.readUInt16LE(OFF_SUBJ_LEN)\n }\n\n /** Zero-copy view of the subject bytes. */\n subject(): Buffer {\n return this.frame.subarray(TAIL_OFF, TAIL_OFF + this.subjLen())\n }\n\n /** Zero-copy view of the payload bytes. */\n data(): Buffer {\n return this.frame.subarray(TAIL_OFF + this.subjLen())\n }\n\n /** Acknowledge — fire-and-forget to broker. */\n ack(): void {\n this.send(packAck(\n this.seqFn(), this.consumerId(), this.subjectHash(), this.seq(),\n ))\n }\n\n /** Negative acknowledge — immediate requeue. */\n nack(): void {\n this.send(packNack(\n this.seqFn(), this.consumerId(), this.subjectHash(), this.seq(),\n ))\n }\n\n /** Negative acknowledge with redelivery delay (ms). */\n nackDelay(ms: number): void {\n // Single nack frame has no delay field — use BatchNack with 1 entry.\n this.send(packBatchNack(\n this.seqFn(), this.consumerId(),\n [{ seq: this.seq(), subjectHash: this.subjectHash(), delayMs: ms }],\n ))\n }\n}\n","import { Message } from '../message/message'\nimport type { Connection } from '../net/connection'\n\ntype MsgCallback = (msg: Message) => void\n\ninterface PendingFetch {\n resolve: (msgs: Message[]) => void\n count: number\n buf: Message[]\n timer: ReturnType<typeof setTimeout>\n}\n\nexport class Subscription {\n private callback: MsgCallback | undefined\n private fetchQueue: PendingFetch[] = []\n private msgBuf: Message[] = []\n private closed = false\n\n constructor(\n private consumerId: number,\n private readonly conn: Connection,\n private readonly streamName: string,\n private readonly fetchTimeoutMs: number,\n ) {}\n\n /** Consumer ID assigned by the server. */\n id(): number { return this.consumerId }\n\n // Called by the delivery handler.\n deliver(frame: Buffer): void {\n if (this.closed) return\n\n const msg = new Message(\n frame,\n (f) => this.conn.send(f),\n () => this.conn.nextSeq(),\n )\n\n if (this.callback) {\n this.callback(msg)\n return\n }\n\n const pending = this.fetchQueue[0]\n if (pending) {\n pending.buf.push(msg)\n if (pending.buf.length >= pending.count) {\n clearTimeout(pending.timer)\n this.fetchQueue.shift()\n pending.resolve(pending.buf)\n }\n return\n }\n\n this.msgBuf.push(msg)\n }\n\n // Push mode — set a callback to receive messages as they arrive.\n onMessage(cb: MsgCallback): void {\n this.callback = cb\n }\n\n // Pull mode — fetch up to `count` messages, waiting up to `timeoutMs`.\n fetch(count: number, timeoutMs = this.fetchTimeoutMs): Promise<Message[]> {\n if (this.msgBuf.length >= count) {\n return Promise.resolve(this.msgBuf.splice(0, count))\n }\n return new Promise((resolve) => {\n const buf = this.msgBuf.splice(0)\n const timer = setTimeout(() => {\n const idx = this.fetchQueue.findIndex((p) => p === pending)\n if (idx >= 0) this.fetchQueue.splice(idx, 1)\n resolve(buf)\n }, timeoutMs)\n const pending: PendingFetch = { resolve, count, buf, timer }\n this.fetchQueue.push(pending)\n })\n }\n\n close(): void {\n this.closed = true\n this.conn.cancelSubscription(this.consumerId)\n for (const p of this.fetchQueue) {\n clearTimeout(p.timer)\n p.resolve(p.buf)\n }\n this.fetchQueue = []\n }\n}\n","import * as net from 'net'\nimport * as tls from 'tls'\nimport { Framer } from '../proto/framer'\nimport { packHello, packSubscribe, packUnsubscribe, packDisconnect } from '../proto/v2'\nimport {\n Action, HEADER_SIZE, OFF_ACTION, OFF_SEQ, OFF_MSG_LEN,\n} from '../proto/constants'\nimport { ArbitroError } from '../types/error'\nimport type { TlsConfig, ReconnectConfig } from '../types/config'\nimport { resolveLogger } from '../common/logger'\nimport type { Logger } from '../common/logger'\nimport type { ClientMetrics } from '../client/metrics'\nimport { CronState } from '../cron/cron-state'\nimport { decodeCronFire, packCronAck, packCreateCron } from '../cron/cron-frame'\n\ntype DeliveryHandler = (frame: Buffer) => void\n\ninterface PendingMgmt {\n resolve: (frame: Buffer) => void\n reject: (err: Error) => void\n}\n\ninterface ActiveSubscription {\n consumerId: number\n filter: Buffer\n handler: DeliveryHandler\n onRenew: ((newConsumerId: number) => void) | undefined\n}\n\nfunction parseAddr(addr: string): { host: string; port: number } {\n const i = addr.lastIndexOf(':')\n return i === -1\n ? { host: addr, port: 9898 }\n : { host: addr.slice(0, i), port: parseInt(addr.slice(i + 1), 10) }\n}\n\nexport class Connection {\n private seq = 1n\n private connId = 0\n private framer = new Framer()\n private routes = new Map<number, DeliveryHandler>()\n private pending = new Map<bigint, PendingMgmt>()\n private socket: net.Socket\n private closing = false\n private readonly log: Logger\n private activeSubs = new Map<number, ActiveSubscription>()\n private metrics?: ClientMetrics\n private cronState?: CronState\n\n private constructor(\n socket: net.Socket,\n private readonly reconnectAddr?: { host: string; port: number },\n private readonly reconnectCfg?: ReconnectConfig,\n logger?: Logger,\n ) {\n this.log = resolveLogger(logger)\n this.socket = socket\n this.attachSocket(socket)\n }\n\n private attachSocket(socket: net.Socket): void {\n socket.setNoDelay(true)\n socket.on('data', (chunk: Buffer) => this.framer.push(chunk, (f) => this.onFrame(f)))\n socket.on('error', (err) => this.drain(err))\n socket.on('close', () => this.handleClose())\n }\n\n static connect(\n addr: string,\n timeoutMs = 5_000,\n tlsCfg?: TlsConfig,\n reconnectCfg?: ReconnectConfig,\n logger?: Logger,\n ): Promise<Connection> {\n const parsed = parseAddr(addr)\n const { host, port } = parsed\n return new Promise((resolve, reject) => {\n const timer = setTimeout(\n () => reject(new ArbitroError('connect timeout', 'connect')),\n timeoutMs,\n )\n const done = (socket: net.Socket) => {\n clearTimeout(timer)\n const conn = new Connection(socket, parsed, reconnectCfg, logger)\n socket.write(packHello())\n conn.log.info({ host, port }, 'arbitro connected (v2)')\n resolve(conn)\n }\n const fail = (e: Error) => { clearTimeout(timer); reject(e) }\n\n if (tlsCfg) {\n const s = tls.connect({\n host, port,\n ca: tlsCfg.ca,\n cert: tlsCfg.cert,\n key: tlsCfg.key,\n rejectUnauthorized: true,\n })\n s.once('secureConnect', () => done(s))\n s.once('error', fail)\n } else {\n const s = net.createConnection({ host, port })\n s.once('connect', () => done(s))\n s.once('error', fail)\n }\n })\n }\n\n nextSeq(): bigint { return this.seq++ }\n\n /**\n * Attach a metrics sink. Called by `ArbitroClient` after `connect()`.\n * The connection bumps `deliveriesReceived` on every Deliver/RepBatch\n * entry and `reconnects` on successful reconnections. Unset = no-op.\n */\n setMetrics(m: ClientMetrics): void { this.metrics = m }\n\n /** Attach cron state so the connection can dispatch CronFire frames. */\n setCronState(s: CronState): void { this.cronState = s }\n\n\n // ── Frame routing ─────────────────────────────────────────────────────────\n // Seq-based dispatch: match reply.header.seq → pending request. O(1).\n\n private resolvePending(frame: Buffer): void {\n const reqSeq = frame.readBigUInt64LE(OFF_SEQ)\n const p = this.pending.get(reqSeq)\n if (!p) return\n this.pending.delete(reqSeq)\n p.resolve(frame)\n }\n\n private rejectPending(frame: Buffer): void {\n const reqSeq = frame.readBigUInt64LE(OFF_SEQ)\n const p = this.pending.get(reqSeq)\n if (!p) return\n this.pending.delete(reqSeq)\n const errorCode = frame.length >= HEADER_SIZE + 10\n ? frame.readUInt16LE(HEADER_SIZE + 8)\n : 0\n p.reject(new ArbitroError(\n `server error (code=0x${errorCode.toString(16).padStart(4, '0')})`,\n 'server', undefined, undefined, errorCode,\n ))\n }\n\n private onFrame(frame: Buffer): void {\n const action = frame.readUInt16LE(OFF_ACTION) as Action\n\n switch (action) {\n case Action.RepOk:\n case Action.ListStreams:\n case Action.ListConsumers: {\n this.resolvePending(frame)\n return\n }\n case Action.RepError: {\n this.rejectPending(frame)\n return\n }\n case Action.Deliver: {\n const consumerId = frame.readUInt32LE(HEADER_SIZE)\n const handler = this.routes.get(consumerId)\n if (!handler) {\n this.log.warn({ consumerId }, 'delivery for unknown consumer')\n return\n }\n if (this.metrics) this.metrics.deliveriesReceived++\n handler(frame)\n return\n }\n case Action.RepBatch: {\n this.handleBatchDeliver(frame)\n return\n }\n case Action.CronFire: {\n this.dispatchCronFire(frame)\n return\n }\n case Action.Pong: return\n default: {\n // Silently drop unknown actions (matches Rust client behavior)\n this.log.debug({ action: `0x${action.toString(16)}` }, 'unknown action, dropped')\n }\n }\n }\n\n private handleBatchDeliver(frame: Buffer): void {\n if (frame.length < HEADER_SIZE + 4) return\n const count = frame.readUInt16LE(HEADER_SIZE)\n let off = HEADER_SIZE + 4\n\n for (let i = 0; i < count; i++) {\n if (off + 24 > frame.length) break\n const consumerId = frame.readUInt32LE(off)\n const deliverSeq = frame.readBigUInt64LE(off + 4)\n const subjectLen = frame.readUInt16LE(off + 12)\n const replyLen = frame.readUInt16LE(off + 14)\n const dataLen = frame.readUInt32LE(off + 16)\n const subjectHash = frame.readUInt32LE(off + 20)\n off += 24\n\n const tailEnd = off + dataLen\n if (tailEnd > frame.length) break\n const payloadLen = dataLen - subjectLen - replyLen\n\n const handler = this.routes.get(consumerId)\n if (handler) {\n const bodyLen = 12 + subjectLen + payloadLen\n const single = Buffer.allocUnsafe(HEADER_SIZE + bodyLen)\n single.writeUInt16LE(Action.Deliver, 0)\n single[2] = 0; single[3] = 0\n single.writeUInt32LE(bodyLen, 4)\n single.writeBigUInt64LE(deliverSeq, 8)\n single.writeUInt32LE(consumerId, HEADER_SIZE)\n single.writeUInt32LE(subjectHash, HEADER_SIZE + 4)\n single.writeUInt16LE(subjectLen, HEADER_SIZE + 8)\n single.writeUInt16LE(0, HEADER_SIZE + 10)\n frame.copy(single, HEADER_SIZE + 12, off, off + subjectLen)\n frame.copy(single, HEADER_SIZE + 12 + subjectLen,\n off + subjectLen + replyLen, tailEnd)\n if (this.metrics) this.metrics.deliveriesReceived++\n handler(single)\n }\n off = tailEnd\n }\n }\n\n // ── Cron dispatch ──────────────────────────────────────────────────────────\n\n private dispatchCronFire(frame: Buffer): void {\n const body = frame.subarray(HEADER_SIZE)\n const view = decodeCronFire(body)\n if (!view) return\n\n const handler = this.cronState?.getHandler(view.name)\n const nameBuf = Buffer.from(view.name)\n\n if (!handler) {\n this.send(packCronAck(this.nextSeq(), nameBuf, false))\n return\n }\n\n // Execute async handler outside sync dispatch; send ack when done.\n handler({ name: view.name, fireTime: view.fireTimeMs, fireCount: view.fireCount })\n .then(() => this.send(packCronAck(this.nextSeq(), nameBuf, true)))\n .catch(() => this.send(packCronAck(this.nextSeq(), nameBuf, false)))\n }\n\n // ── Subscriptions ─────────────────────────────────────────────────────────\n\n async sendSubscribeV2(\n consumerId: number,\n filter: Buffer,\n handler: DeliveryHandler,\n onRenew?: (newConsumerId: number) => void,\n ): Promise<number> {\n return new Promise((resolve, reject) => {\n const seq = this.nextSeq()\n const timer = setTimeout(\n () => { this.pending.delete(seq); reject(new ArbitroError('subscribe timeout', 'timeout')) },\n 5_000,\n )\n this.pending.set(seq, {\n resolve: (_frame) => {\n clearTimeout(timer)\n this.routes.set(consumerId, handler)\n this.activeSubs.set(consumerId, { consumerId, filter, handler, onRenew })\n resolve(consumerId)\n },\n reject: (err) => { clearTimeout(timer); reject(err) },\n })\n this.socket.write(packSubscribe(seq, this.connId, consumerId, filter))\n })\n }\n\n cancelSubscription(consumerId: number): void {\n this.routes.delete(consumerId)\n this.activeSubs.delete(consumerId)\n this.socket.write(packUnsubscribe(this.nextSeq(), this.connId, consumerId))\n }\n\n private resubscribeAll(): void {\n this.socket.write(packHello())\n const subs = [...this.activeSubs.values()]\n this.activeSubs.clear()\n this.routes.clear()\n for (const { consumerId, filter, handler, onRenew } of subs) {\n this.sendSubscribeV2(consumerId, filter, handler, onRenew)\n .then((id) => { if (onRenew) onRenew(id) })\n .catch(() => { })\n }\n this.replayCrons()\n }\n\n private replayCrons(): void {\n if (!this.cronState) return\n for (const { config } of this.cronState.allConfigs()) {\n const seq = this.nextSeq()\n this.socket.write(packCreateCron(seq, config))\n }\n }\n\n // ── Routes (internal use) ─────────────────────────────────────────────────\n\n registerRoute(consumerId: number, handler: DeliveryHandler): void {\n this.routes.set(consumerId, handler)\n }\n\n unregisterRoute(consumerId: number): void {\n this.routes.delete(consumerId)\n }\n\n // ── Write ─────────────────────────────────────────────────────────────────\n\n send(frame: Buffer): void {\n this.socket.write(frame)\n }\n\n /** Send frame and wait for RepOk. Returns the ref_seq from body. */\n sendExpectReply(frame: Buffer, timeoutMs = 5_000): Promise<bigint> {\n const seq = frame.readBigUInt64LE(OFF_SEQ)\n return new Promise((resolve, reject) => {\n const timer = setTimeout(\n () => { this.pending.delete(seq); reject(new ArbitroError('request timeout', 'timeout')) },\n timeoutMs,\n )\n this.pending.set(seq, {\n resolve: (f) => {\n clearTimeout(timer)\n resolve(f.readBigUInt64LE(HEADER_SIZE))\n },\n reject: (e) => { clearTimeout(timer); reject(e) },\n })\n this.socket.write(frame)\n })\n }\n\n /** Send frame and wait for full reply frame buffer. */\n sendExpectReplyRaw(frame: Buffer, timeoutMs = 5_000): Promise<Buffer> {\n const seq = frame.readBigUInt64LE(OFF_SEQ)\n return new Promise((resolve, reject) => {\n const timer = setTimeout(\n () => { this.pending.delete(seq); reject(new ArbitroError('request timeout', 'timeout')) },\n timeoutMs,\n )\n this.pending.set(seq, {\n resolve: (f) => { clearTimeout(timer); resolve(f) },\n reject: (e) => { clearTimeout(timer); reject(e) },\n })\n this.socket.write(frame)\n })\n }\n\n // ── Lifecycle ─────────────────────────────────────────────────────────────\n\n close(): Promise<void> {\n this.closing = true\n this.socket.write(packDisconnect(this.nextSeq()))\n return new Promise((resolve) => this.socket.end(resolve))\n }\n\n private drain(err: Error): void {\n for (const p of this.pending.values()) p.reject(err)\n this.pending.clear()\n }\n\n private handleClose(): void {\n this.log.debug('arbitro connection closed')\n this.drain(new ArbitroError('connection closed', 'closed'))\n const cfg = this.reconnectCfg\n if (!this.closing && cfg && cfg.enabled !== false && this.reconnectAddr) {\n this.tryReconnect(0)\n }\n }\n\n private tryReconnect(attempt: number): void {\n const cfg = this.reconnectCfg\n if (!cfg) return\n const max = cfg.maxAttempts ?? 10\n if (attempt >= max) {\n this.log.warn({ attempt }, 'reconnect exhausted')\n return\n }\n const base = cfg.intervalMs ?? 500\n const jitter = cfg.jitter !== false ? Math.random() * 100 : 0\n const delay = Math.min(base * 2 ** attempt, 30_000) + jitter\n this.log.debug({ attempt, delayMs: Math.round(delay) }, 'reconnecting')\n setTimeout(() => {\n const { host, port } = this.reconnectAddr!\n const socket = net.createConnection({ host, port })\n socket.once('connect', () => {\n this.log.info({ host, port, attempt }, 'arbitro reconnected')\n this.framer = new Framer()\n this.socket = socket\n this.attachSocket(socket)\n this.resubscribeAll()\n })\n socket.once('error', () => this.tryReconnect(attempt + 1))\n }, delay)\n }\n}\n","import { HEADER_SIZE, OFF_ACTION, OFF_MSG_LEN, Action } from './constants'\n\ntype FrameCallback = (frame: Buffer) => void\n\n// Envelope header (RepBatch/FanoutBatch): msg_len lives at offset 8, not 4.\nconst ENVELOPE_MSG_LEN_OFF = 8\n\n// Accumulates incoming TCP bytes and emits complete V2 frames.\n// Server uses two header layouts:\n// Standard: action(2)+flags(1)+eflags(1)+msg_len(4)+seq(8)\n// Envelope: action(2)+flags(1)+eflags(1)+stream_id(4)+msg_len(4)+env_seq(4)\nexport class Framer {\n private buf = Buffer.allocUnsafe(65_536)\n private pos = 0\n\n push(chunk: Buffer, onFrame: FrameCallback): void {\n this.ensureCapacity(chunk.length)\n chunk.copy(this.buf, this.pos)\n this.pos += chunk.length\n\n let offset = 0\n while (offset < this.pos) {\n if (this.pos - offset < HEADER_SIZE) break\n const action = this.buf.readUInt16LE(offset + OFF_ACTION)\n const msgLen = action === Action.RepBatch || action === Action.FanoutBatch\n ? this.buf.readUInt32LE(offset + ENVELOPE_MSG_LEN_OFF)\n : this.buf.readUInt32LE(offset + OFF_MSG_LEN)\n const frameLen = HEADER_SIZE + msgLen\n if (this.pos - offset < frameLen) break\n onFrame(Buffer.from(this.buf.subarray(offset, offset + frameLen)))\n offset += frameLen\n }\n\n if (offset > 0 && offset < this.pos) {\n this.buf.copyWithin(0, offset, this.pos)\n }\n this.pos = offset < this.pos ? this.pos - offset : 0\n }\n\n private ensureCapacity(needed: number): void {\n if (this.pos + needed <= this.buf.length) return\n const next = Buffer.allocUnsafe(Math.max(this.buf.length * 2, this.pos + needed))\n this.buf.copy(next, 0, 0, this.pos)\n this.buf = next\n }\n}\n","// Logger interface — compatible with pino's signature.\n// Pass a pino instance directly: new ArbitroClient({ logger: pino() })\n// Default (no logger provided) is fully silent — no output.\n\nexport type LogFn = {\n (msg: string): void\n (obj: object, msg: string): void\n}\n\nexport interface Logger {\n trace: LogFn\n debug: LogFn\n info: LogFn\n warn: LogFn\n error: LogFn\n child(bindings: Record<string, unknown>): Logger\n}\n\nconst noop = (() => {}) as LogFn\n\nconst NOOP: Logger = {\n trace: noop,\n debug: noop,\n info: noop,\n warn: noop,\n error: noop,\n child: () => NOOP,\n}\n\nexport function resolveLogger(logger?: Logger): Logger {\n return logger ?? NOOP\n}\n","// Cron wire frames — cold path, JSON-encoded bodies for create/delete/list;\n// fixed binary layout for CronFire (S→C) and CronAck (C→S).\n\nimport { HEADER_SIZE, Action } from '../proto/constants'\nimport { frame } from '../proto/frame'\n\n// ── CreateCron body (JSON) ─────────────────────────────────────────────────\n\nexport interface CreateCronBody {\n readonly name: string\n readonly every: string\n readonly tz?: string | undefined\n readonly timeout_ms: number\n readonly overlap: boolean\n}\n\nexport function packCreateCron(seq: bigint, body: CreateCronBody): Buffer {\n const json = Buffer.from(JSON.stringify(body), 'utf8')\n const buf = frame(Action.CreateCron, seq, json.length)\n json.copy(buf, HEADER_SIZE)\n return buf\n}\n\n// ── DeleteCron (body = name bytes) ─────────────────────────────────────────\n\nexport function packDeleteCron(seq: bigint, name: Buffer): Buffer {\n const buf = frame(Action.DeleteCron, seq, name.length)\n name.copy(buf, HEADER_SIZE)\n return buf\n}\n\n// ── ListCrons (no body) ────────────────────────────────────────────────────\n\nexport function packListCrons(seq: bigint): Buffer {\n return frame(Action.ListCrons, seq, 0)\n}\n\n// ── CronFire decode (S→C) ──────────────────────────────────────────────────\n// Body: [2 name_len LE][8 fire_time_ms LE][8 fire_count LE][name bytes]\n\nconst CRON_FIRE_FIXED = 2 + 8 + 8 // 18 bytes before name\n\nexport interface CronFireView {\n readonly name: string\n readonly fireTimeMs: bigint\n readonly fireCount: bigint\n}\n\nexport function decodeCronFire(body: Buffer): CronFireView | undefined {\n if (body.length < CRON_FIRE_FIXED) return undefined\n const nameLen = body.readUInt16LE(0)\n if (body.length < CRON_FIRE_FIXED + nameLen) return undefined\n const fireTimeMs = body.readBigUInt64LE(2)\n const fireCount = body.readBigUInt64LE(10)\n const name = body.subarray(18, 18 + nameLen).toString()\n return { name, fireTimeMs, fireCount }\n}\n\n// ── CronAck encode (C→S) ───────────────────────────────────────────────────\n// Body: [2 name_len LE][1 status (0=ok, 1=error)][name bytes]\n\nexport function packCronAck(\n seq: bigint, name: Buffer, ok: boolean,\n): Buffer {\n const bodyLen = 3 + name.length\n const buf = frame(Action.CronAck, seq, bodyLen)\n buf.writeUInt16LE(name.length, HEADER_SIZE)\n buf[HEADER_SIZE + 2] = ok ? 0 : 1\n name.copy(buf, HEADER_SIZE + 3)\n return buf\n}\n","import type { ArbitroClient } from '../client/client'\nimport type { ConsumerConfig, SubscribeOptions } from '../types/config'\nimport type { Subscription } from '../subscription/subscription'\nimport type { Message } from '../message/message'\nimport type { Encoding } from '../utils/codec'\nimport { makeLazyMessage, type LazyMessage } from '../topic/lazy-message'\n\ntype RawCallback = (msg: Message) => void\n\n// Consumer — thin context wrapper that carries streamName + config + consumerId.\n// No network calls at construction — only at .create() and .subscribe().\nexport class Consumer {\n constructor(\n private readonly client: ArbitroClient,\n readonly streamName: string,\n readonly config: ConsumerConfig,\n private _consumerId?: number,\n ) {}\n\n get name(): string { return this.config.name ?? this.streamName }\n get consumerId(): number | undefined { return this._consumerId }\n\n /**\n * Publish through this consumer's stream. Returns `Promise<void>` that\n * resolves on broker `RepOk`. Await to wait, or ignore for\n * fire-and-forget semantics — the caller's choice, on the same call.\n */\n publish(subject: string, data: Buffer): Promise<void> {\n return this.client.publish(this.streamName, subject, data)\n }\n\n async create(): Promise<this> {\n const result = await this.client.createConsumer(this.streamName, this.config)\n this._consumerId = result.consumerId\n return this\n }\n\n async upsert(): Promise<this> {\n const result = await this.client.upsertConsumer(this.streamName, this.config)\n this._consumerId = result.consumerId\n return this\n }\n\n async delete(): Promise<void> {\n if (this._consumerId == null) throw new Error('consumer not created')\n await this.client.deleteConsumer(this._consumerId)\n }\n\n async exists(): Promise<boolean> {\n return this.client.consumerExists(this.streamName, this.name)\n }\n\n /**\n * Live pending-ack count for this consumer (delivered, not yet acked).\n * Uses the cached consumer ID when available; otherwise looks it up\n * from `streamName + name`. Equivalent of NATS `num_ack_pending`.\n */\n async getPendings(): Promise<number> {\n if (this._consumerId != null) {\n return this.client.getPending(this._consumerId)\n }\n return this.client.getPending(this.streamName, this.name)\n }\n\n // Raw subscribe — Message with manual ack/nack/decode.\n subscribe(cb?: RawCallback, opts?: SubscribeOptions): Promise<Subscription>\n\n // Typed subscribe — LazyMessage<T> with schema getters.\n subscribe<T extends Record<string, unknown>>(\n codec: Encoding<T>,\n cb: (msg: LazyMessage<T>) => void,\n opts?: SubscribeOptions,\n ): Promise<Subscription>\n\n subscribe<T extends Record<string, unknown>>(\n codecOrCb?: Encoding<T> | RawCallback,\n cbOrOpts?: ((msg: LazyMessage<T>) => void) | SubscribeOptions,\n opts?: SubscribeOptions,\n ): Promise<Subscription> {\n if (!codecOrCb || typeof codecOrCb === 'function') {\n return this.client.subscribe(\n this.streamName, this.config,\n codecOrCb as RawCallback | undefined,\n cbOrOpts as SubscribeOptions | undefined,\n )\n }\n const codec = codecOrCb\n const cb = cbOrOpts as (msg: LazyMessage<T>) => void\n const fields = codec.fields ?? []\n return this.client.subscribe(this.streamName, this.config, (raw) => {\n cb(makeLazyMessage(\n raw.data(), codec, fields,\n () => raw.ack(), () => raw.nack(), (ms) => raw.nackDelay(ms),\n ))\n }, opts)\n }\n}\n","import type { ArbitroClient } from '../client/client'\nimport type { StreamConfig, ConsumerConfig, DeleteStreamOpts, StreamInfo } from '../types/config'\nimport type { Encoding } from '../utils/codec'\nimport { Consumer } from '../consumer/consumer'\nimport { Topic } from '../topic/topic'\nimport { BatchPublishEntry } from '../proto/publish'\nimport type { PublishOpts } from './publish'\n\n// Stream — context object carrying name + config.\n// No network calls at construction — only at .create(), .upsert(), and .delete().\nexport class Stream {\n private _config: StreamConfig | undefined\n\n constructor(\n private readonly client: ArbitroClient,\n readonly name: string,\n config?: StreamConfig,\n ) {\n this._config = config\n }\n\n get config(): StreamConfig | undefined { return this._config }\n\n async create(config?: StreamConfig): Promise<this> {\n const cfg = config ?? this._config\n if (!cfg) throw new Error('StreamConfig required — pass to create() or constructor')\n this._config = cfg\n await this.client.createStream(this.name, cfg)\n return this\n }\n\n async upsert(config?: StreamConfig): Promise<this> {\n const cfg = config ?? this._config\n if (!cfg) throw new Error('StreamConfig required — pass to upsert() or constructor')\n this._config = cfg\n await this.client.upsertStream(this.name, cfg)\n return this\n }\n\n async delete(opts?: DeleteStreamOpts): Promise<void> {\n await this.client.deleteStream(this.name, opts)\n }\n\n async exists(): Promise<boolean> {\n return this.client.streamExists(this.name)\n }\n\n async info(): Promise<StreamInfo | null> {\n return this.client.getStreamInfo(this.name)\n }\n\n // ── Publish ─────────────────────────────────────────────────────────────\n\n /**\n * Publish to this stream. Returns a `Promise<void>` that resolves on\n * broker `RepOk`. Await it to wait for confirmation, or ignore the\n * returned promise for fire-and-forget semantics.\n *\n * Pass `opts.msgId` to opt this publish into broker-side dedup on\n * streams created with `idempotencyWindowMs > 0`. Duplicate ids\n * within the window are rejected with a `ClientError` carrying the\n * `IdempotencyDuplicate` code.\n */\n publish(subject: string, data: Buffer, opts?: PublishOpts): Promise<void> {\n return this.client.publish(this.name, subject, data, opts)\n }\n\n /** @deprecated alias for {@link publish}. */\n publishAck(subject: string, data: Buffer, opts?: PublishOpts): Promise<void> {\n return this.client.publish(this.name, subject, data, opts)\n }\n\n /** Batch publish — single V2 BatchPubFrame, ONE round-trip.\n * Resolves with `first_seq` (the N messages occupy\n * `[first_seq, first_seq + N - 1]`).\n *\n * Like {@link publish}, the call always exchanges request/response\n * with the broker; the caller decides whether to wait via `await`. */\n publishBatch(messages: BatchPublishEntry[]): Promise<bigint> {\n return this.client.publishBatch(this.name, messages)\n }\n\n request(subject: string, data: Buffer, timeoutMs?: number): Promise<Buffer> {\n return this.client.request(this.name, subject, data, timeoutMs)\n }\n\n // ── Context factories ───────────────────────────────────────────────────\n\n consumer(overrides?: Partial<ConsumerConfig>): Consumer {\n const config: ConsumerConfig = {\n ...overrides,\n name: overrides?.name ?? this.name,\n filter: overrides?.filter ?? `${this.name}.>`,\n }\n return new Consumer(this.client, this.name, config)\n }\n\n topic<T extends Record<string, unknown>>(subject: string, codec: Encoding<T>): Topic<T> {\n return new Topic(this, subject, codec)\n }\n}\n","// Client-side counters. Each field is an integer accumulator updated on\n// the hot paths (publish, deliver, ack, nack). Reading is a cheap\n// `snapshot()` — useful for periodic logging / Prometheus export.\n\nexport interface ClientMetricsSnapshot {\n /** Calls to `publish` / `publishAck` / `publishBatch` entries. */\n publishesSent: number\n /** Total entries inside `publishBatch` calls (summed across batches). */\n publishBatchEntries: number\n /** `Deliver` frames received from the broker (one per message). */\n deliveriesReceived: number\n /** Currently-open subscriptions (gauge — inc at subscribe, dec at close). */\n activeSubscriptions: number\n /** `Ack` frames sent to the broker. */\n acksSent: number\n /** `Nack` frames sent to the broker. */\n nacksSent: number\n /** Successful reconnections after a session drop. */\n reconnects: number\n /** Outstanding pending request-reply slots (gauge). */\n pendingReplies: number\n}\n\n/**\n * Live atomic-ish counters. JavaScript is single-threaded per worker so\n * plain `++` is sufficient — no `Atomics` needed.\n *\n * Held on `ArbitroClient` and shared with `Connection` so the demux loop\n * can bump `deliveriesReceived` directly. Public `snapshot()` returns a\n * frozen copy for logging or external scraping.\n */\nexport class ClientMetrics {\n publishesSent = 0\n publishBatchEntries = 0\n deliveriesReceived = 0\n activeSubscriptions = 0\n acksSent = 0\n nacksSent = 0\n reconnects = 0\n pendingReplies = 0\n\n snapshot(): ClientMetricsSnapshot {\n return {\n publishesSent: this.publishesSent,\n publishBatchEntries: this.publishBatchEntries,\n deliveriesReceived: this.deliveriesReceived,\n activeSubscriptions: this.activeSubscriptions,\n acksSent: this.acksSent,\n nacksSent: this.nacksSent,\n reconnects: this.reconnects,\n pendingReplies: this.pendingReplies,\n }\n }\n}\n","import { packPublish, packPublishBatch, packPublishWithReply } from '../proto/v2'\nimport { Flag } from '../proto/constants'\nimport type { Connection } from '../net/connection'\nimport { BatchPublishEntry } from '../proto/publish'\n\nconst EMPTY = Buffer.alloc(0)\n\n/**\n * Optional per-publish options.\n *\n * `msgId` is an opaque byte string the broker uses for dedup when the\n * target stream was created with `idempotencyWindowMs > 0`. Empty or\n * undefined means \"no dedup for this publish\" — safe to omit on\n * non-idempotent streams.\n */\nexport interface PublishOpts {\n msgId?: Buffer | string\n}\n\nfunction toMsgIdBuf(id: PublishOpts['msgId']): Buffer {\n if (id == null) return EMPTY\n return typeof id === 'string' ? Buffer.from(id) : id\n}\n\n/** Fire-and-forget publish. Caller provides pre-resolved stream_id. */\nexport function streamPublish(\n conn: Connection, sid: number, subject: string, data: Buffer,\n opts?: PublishOpts,\n): void {\n const subj = Buffer.from(subject)\n conn.send(packPublish(conn.nextSeq(), sid, subj, data, 0, 0, toMsgIdBuf(opts?.msgId)))\n}\n\n/** Publish + wait for server RepOk confirmation. */\nexport async function streamPublishAck(\n conn: Connection, sid: number, subject: string, data: Buffer,\n opts?: PublishOpts,\n): Promise<void> {\n const subj = Buffer.from(subject)\n await conn.sendExpectReply(\n packPublish(conn.nextSeq(), sid, subj, data, Flag.AckReq, 0, toMsgIdBuf(opts?.msgId)),\n )\n}\n\n/** Batch publish — single V2 BatchPubFrame, one write syscall, ONE\n * RTT to the broker.\n *\n * Returns a `Promise<bigint>` that resolves to `first_seq`: the\n * sequence of the first message in the batch. The N messages occupy\n * `[first_seq, first_seq + N - 1]` in the stream.\n *\n * Like `publishAck`, the call always waits for the broker's RepOk at\n * the promise level — the caller decides whether to actually wait by\n * using `await` or letting the promise float:\n *\n * await client.publishBatch(stream, msgs) // barrier — broker has all N\n * client.publishBatch(stream, msgs) // fire-and-forget at caller\n * client.publishBatch(stream, msgs) // (promise is dropped, rep ok ignored)\n * .catch(() => {}) // suppress unhandled rejection\n *\n * This mirrors the design of `publish` / `publishAck`: the function\n * always speaks the full request/response to the broker; await is the\n * caller's contract decision, not the API's. */\nexport async function streamPublishBatch(\n conn: Connection, sid: number, messages: BatchPublishEntry[],\n): Promise<bigint> {\n // `sendExpectReply` decodes the RepOk body (u64 LE) which the broker\n // fills with `first_seq` for PublishBatch.\n return await conn.sendExpectReply(\n packPublishBatch(conn.nextSeq(), sid, messages),\n )\n}\n\n/** Request-reply through a stream. Uses V2 PublishWithReply. */\nexport async function streamRequest(\n conn: Connection, sid: number, subject: string, data: Buffer, timeoutMs: number,\n): Promise<Buffer> {\n const subj = Buffer.from(subject)\n const replyTo = Buffer.from(`_INBOX.${conn.nextSeq().toString(36)}`)\n const frame = packPublishWithReply(\n conn.nextSeq(), sid, subj, replyTo, data, Flag.AckReq,\n )\n await conn.sendExpectReply(frame, timeoutMs)\n // reply is ref_seq from RepOk — actual reply routing handled differently in V2.\n // For now, return empty buffer — request-reply semantics need server support.\n return Buffer.alloc(0)\n}\n","// Fluent builder for cron job registration + handle for lifecycle.\n\nimport type { Connection } from '../net/connection'\nimport type { CronState, CronHandler, CronContext } from './cron-state'\nimport { packCreateCron, packDeleteCron, type CreateCronBody } from './cron-frame'\n\n// ── CronBuilder ────────────────────────────────────────────────────────────\n\nexport class CronBuilder {\n private expr: string | undefined\n private timezone: string | undefined\n private timeoutMs = 30_000\n private allowOverlap = false\n\n constructor(\n private readonly conn: Connection,\n private readonly cronState: CronState,\n private readonly cronName: string,\n ) {}\n\n every(expression: string): this {\n this.expr = expression\n return this\n }\n\n tz(timezone: string): this {\n this.timezone = timezone\n return this\n }\n\n timeout(ms: number): this {\n this.timeoutMs = ms\n return this\n }\n\n overlap(allow: boolean): this {\n this.allowOverlap = allow\n return this\n }\n\n async run(handler: CronHandler): Promise<CronHandle> {\n if (!this.expr) throw new Error('cron expression required — call .every()')\n\n const body: CreateCronBody = {\n name: this.cronName,\n every: this.expr,\n tz: this.timezone,\n timeout_ms: this.timeoutMs,\n overlap: this.allowOverlap,\n }\n\n const seq = this.conn.nextSeq()\n await this.conn.sendExpectReply(packCreateCron(seq, body))\n this.cronState.register(this.cronName, body, handler)\n\n return new CronHandle(this.conn, this.cronState, this.cronName)\n }\n}\n\n// ── CronHandle ─────────────────────────────────────────────────────────────\n\nexport class CronHandle {\n constructor(\n private readonly conn: Connection,\n private readonly cronState: CronState,\n private readonly cronName: string,\n ) {}\n\n get name(): string { return this.cronName }\n\n async stop(): Promise<void> {\n const nameBuf = Buffer.from(this.cronName)\n const seq = this.conn.nextSeq()\n await this.conn.sendExpectReply(packDeleteCron(seq, nameBuf))\n this.cronState.remove(this.cronName)\n }\n}\n","// Shared registry of active cron handlers. Keyed by cron name.\n\nimport type { CreateCronBody } from './cron-frame'\n\nexport type CronHandler = (ctx: CronContext) => Promise<void>\n\n/** Context passed to the cron handler on each fire. */\nexport interface CronContext {\n /** Cron job name. */\n readonly name: string\n /** UTC timestamp (ms since epoch) when the broker intended this fire. */\n readonly fireTime: bigint\n /** Monotonic fire counter (1-based). */\n readonly fireCount: bigint\n}\n\ninterface CronEntry {\n handler: CronHandler\n config: CreateCronBody\n}\n\nexport class CronState {\n private readonly handlers = new Map<string, CronEntry>()\n\n register(name: string, config: CreateCronBody, handler: CronHandler): void {\n this.handlers.set(name, { handler, config })\n }\n\n remove(name: string): void {\n this.handlers.delete(name)\n }\n\n getHandler(name: string): CronHandler | undefined {\n return this.handlers.get(name)?.handler\n }\n\n allConfigs(): ReadonlyArray<{ name: string; config: CreateCronBody }> {\n const out: Array<{ name: string; config: CreateCronBody }> = []\n for (const [name, entry] of this.handlers) {\n out.push({ name, config: entry.config })\n }\n return out\n }\n}\n","import { Connection } from '../net/connection'\nimport { Subscription } from '../subscription/subscription'\nimport { ArbitroError } from '../types/error'\nimport { Stream } from '../stream/stream'\nimport { Consumer } from '../consumer/consumer'\nimport { ClientMetrics, type ClientMetricsSnapshot } from './metrics'\nimport { streamPublish, streamPublishAck, streamPublishBatch, streamRequest } from '../stream/publish'\nimport {\n packPublish, packCreateStream, packDeleteStream, packGetStream,\n packPurgeStream, packDrainSubject, packListStreams,\n packCreateConsumer, packDeleteConsumer, packGetConsumer, packListConsumers,\n packConsumerStats,\n type CreateConsumerOpts,\n} from '../proto/v2'\nimport { Flag, HEADER_SIZE } from '../proto/constants'\nimport type {\n ClientConfig, StreamConfig, ConsumerConfig, SubscribeOptions,\n DeleteStreamOpts, StreamInfo, ConsumerInfo,\n} from '../types/config'\nimport { AckPolicy, DeliverPolicy, JournalType } from '../types/config'\nimport { Message } from '../message/message'\nimport { BatchPublishEntry } from '../proto/publish'\nimport { CronBuilder } from '../cron/cron-builder'\nimport { CronState } from '../cron/cron-state'\n\ntype MsgCallback = (msg: Message) => void\n\nconst DEFAULT_CONFIG: Required<Omit<ClientConfig, 'tls' | 'logger'>> = {\n servers: ['127.0.0.1:9898'],\n prefix: '',\n timeout: 5_000,\n reconnect: { enabled: true, maxAttempts: 10, intervalMs: 500, jitter: true },\n}\n\nexport class ArbitroClient {\n private conn!: Connection\n private readonly cfg: typeof DEFAULT_CONFIG\n private readonly tls: ClientConfig['tls']\n private readonly logger: ClientConfig['logger']\n private readonly sidCache = new Map<string, number>()\n private readonly _metrics = new ClientMetrics()\n private readonly _cronState = new CronState()\n\n constructor(config: ClientConfig) {\n this.cfg = { ...DEFAULT_CONFIG, ...config }\n this.tls = config.tls\n this.logger = config.logger\n }\n\n async connect(): Promise<this> {\n const addr = this.cfg.servers[0]\n if (!addr) throw new ArbitroError('no servers configured', 'connect')\n this.conn = await Connection.connect(\n addr, this.cfg.timeout, this.tls, this.cfg.reconnect, this.logger,\n )\n this.conn.setMetrics(this._metrics)\n this.conn.setCronState(this._cronState)\n return this\n }\n\n /**\n * Point-in-time snapshot of client counters: publishes sent, deliveries\n * received, acks/nacks, active subscriptions, reconnects. Cheap — just\n * reads plain integer fields. Call on a timer to chart throughput.\n */\n metrics(): ClientMetricsSnapshot { return this._metrics.snapshot() }\n\n /** Internal connection accessor for Stream/Consumer publish methods. */\n _conn(): Connection { return this.conn }\n\n /** Default timeout from config. */\n get timeout(): number { return this.cfg.timeout }\n\n // ── Publish (direct to stream via V2 PubFrame) ────────────────────────────\n\n /** Apply prefix to subject if configured. */\n private prefixed(subject: string): string {\n return this.cfg.prefix ? `${this.cfg.prefix}.${subject}` : subject\n }\n\n /**\n * Publish a message. Returns a `Promise<void>` that resolves once the\n * broker confirms receipt (`RepOk`). The TS idiom is \"everything async,\n * the caller chooses to await\":\n *\n * await client.publish(s, subj, data) // wait for ack\n * client.publish(s, subj, data) // fire-and-forget\n * client.publish(s, subj, data).catch(handleError) // async error path\n *\n * The broker always emits `RepOk` regardless of whether the caller\n * awaits — that's what enables the same call site to support both\n * semantics. A \"no-reply\" path doesn't save wire bytes, so it isn't\n * exposed.\n */\n async publish(\n streamName: string, subject: string, data: Buffer,\n opts?: import('../stream/publish').PublishOpts,\n ): Promise<void> {\n const sid = await this.resolveStreamId(streamName)\n await streamPublishAck(this.conn, sid, this.prefixed(subject), data, opts)\n this._metrics.publishesSent++\n }\n\n /**\n * @deprecated alias for {@link publish}. The default `publish` already\n * waits for `RepOk` and returns a Promise, so this method is identical.\n */\n publishAck(\n streamName: string, subject: string, data: Buffer,\n opts?: import('../stream/publish').PublishOpts,\n ): Promise<void> {\n return this.publish(streamName, subject, data, opts)\n }\n\n /** Batch publish — single V2 BatchPubFrame, ONE round-trip. Resolves\n * to `first_seq` (sequence of the first message in the batch; the N\n * messages occupy `[first_seq, first_seq + N - 1]`).\n *\n * Mirrors `publish`: the call always exchanges request/response with\n * the broker. The caller decides whether to actually wait:\n *\n * await client.publishBatch(stream, msgs) // barrier\n * client.publishBatch(stream, msgs) // fire-and-forget (promise dropped)\n * client.publishBatch(stream, msgs) // (suppress unhandled rejection)\n * .catch(() => {})\n *\n * Each entry may carry an optional `msgId` for broker-side dedup on\n * streams created with `idempotencyWindowMs > 0`. If any entry\n * collides with a previously-stored id (or another entry in the\n * SAME batch), the whole batch is rejected — `publishBatch` is\n * atomic.\n */\n publishBatch(streamName: string, messages: BatchPublishEntry[]): Promise<bigint> {\n const sid = this.cachedSid(streamName)\n const prefixedMsgs: BatchPublishEntry[] = this.cfg.prefix\n ? messages.map((m): BatchPublishEntry => {\n const entry: BatchPublishEntry = {\n subject: this.prefixed(m.subject),\n payload: m.payload,\n }\n if (m.msgId !== undefined) entry.msgId = m.msgId\n return entry\n })\n : messages\n this._metrics.publishBatchEntries += messages.length\n return streamPublishBatch(this.conn, sid, prefixedMsgs)\n }\n\n /** Request-reply. */\n async request(streamName: string, subject: string, data: Buffer, timeoutMs = this.cfg.timeout): Promise<Buffer> {\n const sid = await this.resolveStreamId(streamName)\n return streamRequest(this.conn, sid, subject, data, timeoutMs)\n }\n\n /**\n * Publish a message with a delivery delay. The broker parks the message\n * in its delayed journal and delivers it to consumers after `delayMs`\n * milliseconds. Returns a Promise that resolves once the broker confirms\n * receipt.\n */\n async publishDelayed(\n streamName: string, subject: string, data: Buffer, delayMs: number,\n ): Promise<void> {\n const sid = await this.resolveStreamId(streamName)\n const { packPublishDelayed } = await import('../proto/publish')\n const { Flag } = await import('../proto/constants')\n const subj = Buffer.from(this.prefixed(subject))\n await this.conn.sendExpectReply(\n packPublishDelayed(this.conn.nextSeq(), sid, subj, data, BigInt(delayMs), Flag.AckReq),\n )\n this._metrics.publishesSent++\n }\n\n // ── Subscribe ─────────────────────────────────────────────────────────────\n\n /** Subscribe with explicit consumer config. */\n subscribe(streamName: string, config: ConsumerConfig, callback?: MsgCallback, opts?: SubscribeOptions): Promise<Subscription>\n /** Subscribe by consumer name only (consumer must already exist). */\n subscribe(streamName: string, callback: MsgCallback): Promise<Subscription>\n\n async subscribe(\n streamName: string,\n configOrCb: ConsumerConfig | MsgCallback,\n callbackOrOpts?: MsgCallback | SubscribeOptions,\n opts?: SubscribeOptions,\n ): Promise<Subscription> {\n let config: ConsumerConfig\n let callback: MsgCallback | undefined\n let subOpts: SubscribeOptions | undefined\n\n if (typeof configOrCb === 'function') {\n config = { name: streamName, filter: '' }\n callback = configOrCb\n subOpts = undefined\n } else {\n config = configOrCb\n callback = typeof callbackOrOpts === 'function' ? callbackOrOpts : undefined\n subOpts = typeof callbackOrOpts === 'object' ? callbackOrOpts : opts\n }\n\n const consumerId = await this.ensureConsumer(streamName, config)\n const filter = Buffer.from(config.filter ?? '')\n const sub = new Subscription(consumerId, this.conn, streamName, subOpts?.fetchTimeoutMs ?? 5_000)\n const handler = (frame: Buffer) => sub.deliver(frame)\n\n await this.conn.sendSubscribeV2(consumerId, filter, handler)\n this._metrics.activeSubscriptions++\n // Best-effort gauge decrement when caller closes the subscription.\n const origClose = sub.close.bind(sub)\n sub.close = () => {\n if (this._metrics.activeSubscriptions > 0) this._metrics.activeSubscriptions--\n return origClose()\n }\n if (callback) sub.onMessage(callback)\n return sub\n }\n\n // ── Stream management ─────────────────────────────────────────────────────\n\n async createStream(name: string, config: StreamConfig): Promise<Stream> {\n const nameBuf = Buffer.from(name)\n const filterBuf = Buffer.from(config.subjectFilter ?? '')\n const maxMsgs = BigInt(config.maxMsgs ?? 0)\n const maxBytes = BigInt(config.maxBytes ?? 0)\n const maxAgeSecs = BigInt(config.maxAgeMs ? Math.ceil(config.maxAgeMs / 1000) : 0)\n const journalKind = journalTypeToU8(config.journal?.type)\n\n await this.conn.sendExpectReply(packCreateStream(\n this.conn.nextSeq(), nameBuf, filterBuf,\n maxMsgs, maxBytes, maxAgeSecs,\n 1, journalKind, 0, 0,\n config.idempotencyWindowMs ?? 0,\n ))\n await this.resolveStreamId(name)\n return new Stream(this, name, config)\n }\n\n async upsertStream(name: string, config: StreamConfig): Promise<Stream> {\n try {\n return await this.createStream(name, config)\n } catch (e: any) {\n if (e?.message?.includes('code=')) {\n await this.resolveStreamId(name)\n return new Stream(this, name, config)\n }\n throw e\n }\n }\n\n async deleteStream(name: string, _opts?: DeleteStreamOpts): Promise<void> {\n await this.conn.sendExpectReply(\n packDeleteStream(this.conn.nextSeq(), Buffer.from(name)),\n )\n this.sidCache.delete(name)\n }\n\n async getStreamInfo(name: string): Promise<StreamInfo | null> {\n try {\n const refSeq = await this.conn.sendExpectReply(\n packGetStream(this.conn.nextSeq(), Buffer.from(name)),\n )\n this.sidCache.set(name, Number(refSeq & 0xFFFFFFFFn))\n return { name, config: { subjectFilter: '' }, lastSeq: Number(refSeq) }\n } catch {\n return null\n }\n }\n\n async listStreams(): Promise<StreamInfo[]> {\n const raw = await this.conn.sendExpectReplyRaw(\n packListStreams(this.conn.nextSeq()),\n )\n return parseListStreamsReply(raw)\n }\n\n async streamExists(name: string): Promise<boolean> {\n return (await this.getStreamInfo(name)) !== null\n }\n\n async purgeStream(name: string): Promise<number> {\n const refSeq = await this.conn.sendExpectReply(\n packPurgeStream(this.conn.nextSeq(), Buffer.from(name)),\n )\n return Number(refSeq)\n }\n\n async drainSubject(streamName: string, subject: string): Promise<number> {\n const refSeq = await this.conn.sendExpectReply(\n packDrainSubject(this.conn.nextSeq(), Buffer.from(streamName), Buffer.from(subject)),\n )\n return Number(refSeq)\n }\n\n // ── Consumer management ───────────────────────────────────────────────────\n\n async createConsumer(streamName: string, config: ConsumerConfig): Promise<Consumer> {\n const consumerId = await this.createConsumerRaw(streamName, config)\n return new Consumer(this, streamName, config, consumerId)\n }\n\n private async createConsumerRaw(streamName: string, config: ConsumerConfig): Promise<number> {\n const sid = await this.resolveStreamId(streamName)\n const name = Buffer.from(config.name ?? streamName)\n const group = Buffer.from(config.group ?? config.name ?? streamName)\n const filter = Buffer.from(config.filter ?? '')\n\n const ackPolicyByte = config.ackPolicy === AckPolicy.None ? 0 : 1\n const opts: CreateConsumerOpts = {\n streamId: sid,\n name,\n group,\n filter,\n maxInflight: config.maxAckPending ?? 0,\n ackPolicy: ackPolicyByte,\n deliverPolicy: deliverPolicyToU8(config.deliverPolicy),\n deliverMode: config.fanout ? 0 : 1,\n ackWaitMs: config.ackWaitMs ?? 0,\n startSeq: BigInt(config.startSeq ?? 0),\n }\n // Per-subject inflight is only enforced with Explicit ack — drop\n // the list silently for fire-and-forget consumers so they round-trip\n // cleanly through the server (which rejects the pairing).\n if (ackPolicyByte === 1 && config.maxSubjectInflights?.length) {\n opts.subjectLimits = config.maxSubjectInflights.map(l => ({\n pattern: Buffer.from(l.pattern),\n limit: l.limit >>> 0, // u32\n }))\n }\n\n const refSeq = await this.conn.sendExpectReply(\n packCreateConsumer(this.conn.nextSeq(), opts),\n )\n return Number(refSeq)\n }\n\n async upsertConsumer(streamName: string, config: ConsumerConfig): Promise<Consumer> {\n try {\n return await this.createConsumer(streamName, config)\n } catch (e: any) {\n // If already exists, get its ID\n const consumerId = await this.getConsumerId(streamName, config.name ?? streamName)\n if (consumerId !== null) return new Consumer(this, streamName, config, consumerId)\n throw e\n }\n }\n\n /** Delete consumer by server-assigned ID. */\n deleteConsumer(consumerId: number): Promise<void>\n /** Delete consumer by stream + name (lookup ID first). */\n deleteConsumer(streamName: string, name: string): Promise<void>\n\n async deleteConsumer(idOrStream: number | string, name?: string): Promise<void> {\n let consumerId: number\n if (typeof idOrStream === 'number') {\n consumerId = idOrStream\n } else {\n const id = await this.getConsumerId(idOrStream, name!)\n if (id === null) return // already deleted\n consumerId = id\n }\n await this.conn.sendExpectReply(\n packDeleteConsumer(this.conn.nextSeq(), consumerId),\n )\n }\n\n async getConsumerId(streamName: string, name: string): Promise<number | null> {\n try {\n const sid = await this.resolveStreamId(streamName)\n const refSeq = await this.conn.sendExpectReply(\n packGetConsumer(this.conn.nextSeq(), sid, Buffer.from(name)),\n )\n return Number(refSeq)\n } catch {\n return null\n }\n }\n\n async consumerExists(streamName: string, name: string): Promise<boolean> {\n return (await this.getConsumerId(streamName, name)) !== null\n }\n\n /**\n * Live pending-ack count for one consumer — the number of messages the\n * consumer has been delivered but not yet acked. Equivalent of NATS\n * JetStream's `num_ack_pending`. Single broker round-trip; engine cost\n * is one O(1) Vec read per shard.\n */\n getPending(consumerId: number): Promise<number>\n getPending(streamName: string, name: string): Promise<number>\n async getPending(idOrStream: number | string, name?: string): Promise<number> {\n let consumerId: number\n if (typeof idOrStream === 'number') {\n consumerId = idOrStream\n } else {\n const id = await this.getConsumerId(idOrStream, name!)\n if (id === null) return 0\n consumerId = id\n }\n const refSeq = await this.conn.sendExpectReply(\n packConsumerStats(this.conn.nextSeq(), consumerId),\n )\n return Number(refSeq)\n }\n\n async getConsumerInfo(streamName: string, name: string): Promise<ConsumerInfo | null> {\n const id = await this.getConsumerId(streamName, name)\n if (id === null) return null\n return { group: name, stream: streamName, config: { name } }\n }\n\n async listConsumers(streamName?: string): Promise<ConsumerInfo[]> {\n const sid = streamName ? await this.resolveStreamId(streamName) : 0\n const raw = await this.conn.sendExpectReplyRaw(\n packListConsumers(this.conn.nextSeq(), sid),\n )\n return parseListConsumersReply(raw)\n }\n\n // ── Internal helpers ──────────────────────────────────────────────────────\n\n /** Resolve stream name → server wire_hash_32. Caches the result. */\n private async resolveStreamId(name: string): Promise<number> {\n const cached = this.sidCache.get(name)\n if (cached !== undefined) return cached\n const refSeq = await this.conn.sendExpectReply(\n packGetStream(this.conn.nextSeq(), Buffer.from(name)),\n )\n const sid = Number(refSeq & 0xFFFFFFFFn)\n this.sidCache.set(name, sid)\n return sid\n }\n\n /** Get cached stream_id or throw (for sync fire-and-forget paths). */\n private cachedSid(name: string): number {\n const sid = this.sidCache.get(name)\n if (sid === undefined) {\n throw new ArbitroError(\n `stream \"${name}\" not resolved — call createStream/getStreamInfo first`,\n 'protocol',\n )\n }\n return sid\n }\n\n private async ensureConsumer(streamName: string, config: ConsumerConfig): Promise<number> {\n const name = config.name ?? streamName\n const existing = await this.getConsumerId(streamName, name)\n if (existing !== null) return existing\n return this.createConsumerRaw(streamName, config)\n }\n\n // ── Domain helpers ────────────────────────────────────────────────────────\n\n /** Pre-resolve stream_id from server (GetStream). Required before sync publish(). */\n async resolveStream(name: string): Promise<void> {\n await this.resolveStreamId(name)\n }\n\n stream(name: string, config?: StreamConfig): Stream {\n return new Stream(this, name, config)\n }\n\n // ── Cron ──────────────────────────────────────────────────────────────────\n\n /** Start building a cron job. Call `.every()` then `.run()` to register. */\n cron(name: string): CronBuilder {\n return new CronBuilder(this.conn, this._cronState, name)\n }\n\n // ── Lifecycle ─────────────────────────────────────────────────────────────\n\n async close(): Promise<void> {\n await this.conn.close()\n }\n}\n\n// ── Reply parsers ──────────────────────────────────────────────────────────\n\nfunction parseListStreamsReply(frame: Buffer): StreamInfo[] {\n // Header(16) + count(4) + entries[wire_id(4) + name_len(2) + name]\n if (frame.length < HEADER_SIZE + 4) return []\n const count = frame.readUInt32LE(HEADER_SIZE)\n const results: StreamInfo[] = []\n let off = HEADER_SIZE + 4\n for (let i = 0; i < count; i++) {\n if (off + 6 > frame.length) break\n const wireId = frame.readUInt32LE(off)\n const nameLen = frame.readUInt16LE(off + 4)\n off += 6\n const name = frame.subarray(off, off + nameLen).toString()\n off += nameLen\n results.push({ name, config: { subjectFilter: '' }, lastSeq: wireId })\n }\n return results\n}\n\nfunction parseListConsumersReply(frame: Buffer): ConsumerInfo[] {\n // Header(16) + count(4) + entries[consumer_id(4) + stream_id(4) + queue_id(4) + paused(1)]\n if (frame.length < HEADER_SIZE + 4) return []\n const count = frame.readUInt32LE(HEADER_SIZE)\n const results: ConsumerInfo[] = []\n let off = HEADER_SIZE + 4\n for (let i = 0; i < count; i++) {\n if (off + 13 > frame.length) break\n const consumerId = frame.readUInt32LE(off)\n const _streamId = frame.readUInt32LE(off + 4)\n const _queueId = frame.readUInt32LE(off + 8)\n const _paused = frame[off + 12]\n off += 13\n results.push({\n group: consumerId.toString(),\n stream: '',\n config: { name: consumerId.toString() },\n })\n }\n return results\n}\n\nfunction deliverPolicyToU8(policy?: DeliverPolicy): number {\n switch (policy) {\n case DeliverPolicy.All: return 0\n case DeliverPolicy.New: return 1\n case DeliverPolicy.BySeq: return 2\n case DeliverPolicy.ByTime: return 3\n default: return 0\n }\n}\n\nfunction journalTypeToU8(type?: JournalType): number {\n switch (type) {\n case JournalType.Memory: return 0\n case JournalType.Tolerant: return 1\n case JournalType.Strict: return 2\n default: return 0\n }\n}\n","// FNV-1a 32-bit hash — utility export. NOT used for server stream_id\n// resolution (server uses foldhash). Kept for subject hashing and user code.\n\nexport function streamId(name: Buffer | string): number {\n const buf = typeof name === 'string' ? Buffer.from(name) : name\n let h = 0x811c_9dc5\n for (let i = 0; i < buf.length; i++) {\n h ^= buf[i]!\n h = Math.imul(h, 0x0100_0193) >>> 0\n }\n return h >>> 0\n}\n","// Task payload encoding/decoding for workflow step messages.\n// Format: [instance_id:4 LE][step_index:2 LE][attempt:1][context...]\n\n/** Header size: 4 (instanceId) + 2 (stepIndex) + 1 (attempt) = 7 bytes. */\nexport const TASK_HEADER = 7\n\n/** Bit flag set on stepIndex to mark compensation tasks. */\nexport const COMPENSATION_BIT = 0x8000\n\nexport interface DecodedTask {\n readonly instanceId: number\n readonly stepIndex: number\n readonly attempt: number\n readonly context: Buffer\n}\n\nexport function encodeTask(\n instanceId: number, stepIndex: number, attempt: number, context: Buffer,\n): Buffer {\n const buf = Buffer.allocUnsafe(TASK_HEADER + context.length)\n buf.writeUInt32LE(instanceId, 0)\n buf.writeUInt16LE(stepIndex, 4)\n buf[6] = attempt\n context.copy(buf, TASK_HEADER)\n return buf\n}\n\nexport function decodeTask(payload: Buffer): DecodedTask | undefined {\n if (payload.length < TASK_HEADER) return undefined\n return {\n instanceId: payload.readUInt32LE(0),\n stepIndex: payload.readUInt16LE(4),\n attempt: payload[6]!,\n context: payload.subarray(TASK_HEADER),\n }\n}\n","// WorkflowHandle — returned by WorkflowBuilder.start().\n\nimport type { ArbitroClient } from '../client/client'\nimport { encodeTask } from './task'\n\nlet nextInstanceId = 1\n\n/** Generate a process-unique instance ID. */\nexport function allocInstanceId(): number { return nextInstanceId++ }\n\nexport class WorkflowHandle {\n constructor(\n private readonly workflowName: string,\n private readonly taskStreamName: string,\n private readonly dlqStreamName: string,\n private readonly sub: unknown,\n private readonly triggerSub: unknown | undefined,\n ) {}\n\n get name(): string { return this.workflowName }\n get taskStream(): string { return this.taskStreamName }\n get dlqStream(): string { return this.dlqStreamName }\n\n async trigger(client: ArbitroClient, context: Buffer): Promise<number> {\n const instanceId = allocInstanceId()\n const msgId = `wf:${instanceId}:0:0`\n const subject = `_wf.${this.workflowName}.step.0`\n const task = encodeTask(instanceId, 0, 0, context)\n await client.publish(this.taskStreamName, subject, task, { msgId })\n return instanceId\n }\n}\n","// Message processing loop for workflow steps, compensation, and DLQ.\n\nimport type { ArbitroClient } from '../client/client'\nimport type { Message } from '../message/message'\nimport { encodeTask, decodeTask, COMPENSATION_BIT } from './task'\nimport type { StepHandler, StepResult } from './workflow'\n\ninterface StepDef {\n readonly handler: StepHandler\n readonly compensation: StepHandler | undefined\n}\n\nexport interface ProcessorConfig {\n readonly client: ArbitroClient\n readonly name: string\n readonly taskStreamName: string\n readonly dlqStreamName: string\n readonly steps: readonly StepDef[]\n readonly maxContextSize: number\n readonly maxRetries: number\n}\n\nexport async function processMessage(cfg: ProcessorConfig, msg: Message): Promise<void> {\n const task = decodeTask(msg.data())\n if (!task) { msg.ack(); return }\n if (task.context.length > cfg.maxContextSize) { msg.ack(); return }\n\n const isCompensation = (task.stepIndex & COMPENSATION_BIT) !== 0\n if (isCompensation) {\n await runCompensation(cfg, msg, task)\n return\n }\n if (task.stepIndex >= cfg.steps.length) { msg.ack(); return }\n await runStep(cfg, msg, task)\n}\n\n// ── Compensation ──────────────────────────────────────────────────────\n\nasync function runCompensation(\n cfg: ProcessorConfig, msg: Message,\n task: { instanceId: number; stepIndex: number; attempt: number; context: Buffer },\n): Promise<void> {\n const idx = task.stepIndex & ~COMPENSATION_BIT\n const comp = cfg.steps[idx]?.compensation\n if (comp) {\n try {\n await comp({ name: cfg.name, instanceId: task.instanceId, stepIndex: idx, attempt: task.attempt, context: task.context })\n } catch { /* best-effort */ }\n }\n msg.ack()\n}\n\n// ── Normal step ───────────────────────────────────────────────────────\n\nasync function runStep(\n cfg: ProcessorConfig, msg: Message,\n task: { instanceId: number; stepIndex: number; attempt: number; context: Buffer },\n): Promise<void> {\n const handler = cfg.steps[task.stepIndex]!.handler\n try {\n const result = await handler({\n name: cfg.name, instanceId: task.instanceId,\n stepIndex: task.stepIndex, attempt: task.attempt, context: task.context,\n })\n if (result.context.length > cfg.maxContextSize) { msg.nack(); return }\n await advance(cfg, msg, task, result)\n } catch (err) {\n await onFailure(cfg, msg, task, err)\n }\n}\n\nasync function advance(\n cfg: ProcessorConfig, msg: Message,\n task: { instanceId: number; stepIndex: number }, result: StepResult,\n): Promise<void> {\n const nextStep = task.stepIndex + 1\n if (nextStep < cfg.steps.length) {\n const msgId = `wf:${task.instanceId}:${nextStep}:0`\n const subject = `_wf.${cfg.name}.step.${nextStep}`\n const buf = encodeTask(task.instanceId, nextStep, 0, result.context)\n await cfg.client.publish(cfg.taskStreamName, subject, buf, { msgId })\n }\n msg.ack()\n}\n\n// ── Failure → DLQ + compensation chain ────────────────────────────────\n\nasync function onFailure(\n cfg: ProcessorConfig, msg: Message,\n task: { instanceId: number; stepIndex: number; attempt: number; context: Buffer },\n err: unknown,\n): Promise<void> {\n if (task.attempt >= cfg.maxRetries) {\n await publishDlq(cfg, task, err)\n await publishCompensations(cfg, task)\n msg.ack()\n } else {\n msg.nack()\n }\n}\n\nasync function publishDlq(\n cfg: ProcessorConfig,\n task: { instanceId: number; stepIndex: number; attempt: number; context: Buffer },\n err: unknown,\n): Promise<void> {\n const dlqSubject = `_wf.${cfg.name}.dlq.${task.stepIndex}`\n const errBytes = Buffer.from(String(err))\n const buf = Buffer.allocUnsafe(7 + 4 + errBytes.length + task.context.length)\n buf.writeUInt32LE(task.instanceId, 0)\n buf.writeUInt16LE(task.stepIndex, 4)\n buf[6] = task.attempt\n buf.writeUInt32LE(errBytes.length, 7)\n errBytes.copy(buf, 11)\n task.context.copy(buf, 11 + errBytes.length)\n const msgId = `wf:${task.instanceId}:dlq:${task.stepIndex}`\n await cfg.client.publish(cfg.dlqStreamName, dlqSubject, buf, { msgId }).catch(() => {})\n}\n\nasync function publishCompensations(\n cfg: ProcessorConfig,\n task: { instanceId: number; stepIndex: number; context: Buffer },\n): Promise<void> {\n for (let i = task.stepIndex - 1; i >= 0; i--) {\n const compStep = COMPENSATION_BIT | i\n const subject = `_wf.${cfg.name}.compensate.${i}`\n const buf = encodeTask(task.instanceId, compStep, 0, task.context)\n const msgId = `wf:${task.instanceId}:comp:${i}`\n await cfg.client.publish(cfg.taskStreamName, subject, buf, { msgId }).catch(() => {})\n }\n}\n","// WorkflowBuilder — fluent builder for linear step pipelines.\n// Mirrors the Rust WorkflowBuilder: trigger streams, saga compensation,\n// max retries with DLQ, context size limits, unique consumer per worker.\n\nimport type { ArbitroClient } from '../client/client'\nimport type { Message } from '../message/message'\nimport { AckPolicy } from '../types/config'\nimport { encodeTask } from './task'\nimport { WorkflowHandle, allocInstanceId } from './handle'\nimport { processMessage, type ProcessorConfig } from './processor'\n\n// ── Types ─────────────────────────────────────────────────────────────────\n\nexport interface StepContext {\n readonly name: string\n readonly instanceId: number\n readonly stepIndex: number\n readonly attempt: number\n readonly context: Buffer\n}\n\nexport interface StepResult { readonly context: Buffer }\n\nexport type StepHandler = (ctx: StepContext) => Promise<StepResult>\n\nexport interface StepDef {\n readonly name: string\n readonly handler: StepHandler\n compensation: StepHandler | undefined\n}\n\n// ── Unique worker ID counter (per process) ────────────────────────────────\n\nlet nextWorkerUid = 1\n\n// ── WorkflowBuilder ───────────────────────────────────────────────────────\n\nexport class WorkflowBuilder {\n private triggerSubject: string | undefined\n private triggerStreamName: string | undefined\n private readonly steps: StepDef[] = []\n private ackWaitMs = 30_000\n private maxInflightVal = 10\n private maxRetriesVal = 3\n private maxContextSizeVal = 256 * 1024\n\n constructor(\n private readonly client: ArbitroClient,\n private readonly workflowName: string,\n ) {}\n\n trigger(subject: string): this { this.triggerSubject = subject; return this }\n\n triggerStream(streamName: string): this { this.triggerStreamName = streamName; return this }\n\n step(name: string, handler: StepHandler): this {\n this.steps.push({ name, handler, compensation: undefined })\n return this\n }\n\n /** Compensation handler for the most recently added step. */\n compensate(_stepName: string, handler: StepHandler): this {\n const last = this.steps[this.steps.length - 1]\n if (last) last.compensation = handler\n return this\n }\n\n ackWait(ms: number): this { this.ackWaitMs = ms; return this }\n inflight(n: number): this { this.maxInflightVal = n; return this }\n maxRetries(n: number): this { this.maxRetriesVal = n; return this }\n maxContextSize(bytes: number): this { this.maxContextSizeVal = bytes; return this }\n\n async start(): Promise<WorkflowHandle> {\n if (!this.triggerSubject) throw new Error('trigger subject required')\n if (this.steps.length === 0) throw new Error('at least one step required')\n\n const name = this.workflowName\n const taskStream = `_wf.${name}.tasks`\n const taskSubject = `_wf.${name}.>`\n const dlqStream = `_wf.${name}.dlq`\n const dlqSubject = `_wf.${name}.dlq.>`\n\n await this.client.upsertStream(taskStream, { subjectFilter: taskSubject, idempotencyWindowMs: 300_000 })\n await this.client.upsertStream(dlqStream, { subjectFilter: dlqSubject })\n\n const cfg: ProcessorConfig = {\n client: this.client, name, taskStreamName: taskStream,\n dlqStreamName: dlqStream, steps: this.steps,\n maxContextSize: this.maxContextSizeVal, maxRetries: this.maxRetriesVal,\n }\n\n const sub = await this.subscribeWorker(cfg, taskStream, taskSubject)\n const triggerSub = await this.subscribeTrigger(taskStream, name)\n return new WorkflowHandle(name, taskStream, dlqStream, sub, triggerSub)\n }\n\n private async subscribeWorker(cfg: ProcessorConfig, taskStream: string, taskSubject: string) {\n const uid = nextWorkerUid++\n return this.client.subscribe(taskStream, {\n name: `_wf_${cfg.name}_w${uid}`,\n group: `_wf_${cfg.name}_workers`,\n filter: taskSubject,\n ackPolicy: AckPolicy.Explicit,\n ackWaitMs: this.ackWaitMs,\n maxAckPending: this.maxInflightVal,\n }, (msg: Message) => { void processMessage(cfg, msg) })\n }\n\n private async subscribeTrigger(taskStream: string, name: string) {\n if (!this.triggerSubject || !this.triggerStreamName) return undefined\n const subject = this.triggerSubject\n return this.client.subscribe(this.triggerStreamName, {\n name: `_wf_${name}_trigger`,\n filter: subject,\n ackPolicy: AckPolicy.Explicit,\n ackWaitMs: this.ackWaitMs,\n maxAckPending: 1,\n }, async (msg: Message) => {\n const id = allocInstanceId()\n const taskBuf = encodeTask(id, 0, 0, msg.data())\n await this.client.publish(taskStream, `_wf.${name}.step.0`, taskBuf, { msgId: `wf:${id}:0:0` })\n msg.ack()\n })\n }\n}\n","import { Packr, Unpackr } from 'msgpackr'\nimport type { ZodObject, ZodRawShape, output } from 'zod'\nimport type { Encoding } from './codec'\n\n// zod is an optional peer dep — only imported as a type here so the module\n// can be tree-shaken. The runtime import happens inside zodCodec().\n\nconst packr = new Packr({ structuredClone: false, useRecords: false })\nconst unpackr = new Unpackr({ structuredClone: false, useRecords: false })\n\n/** Wraps a ZodObject schema as an Encoding<T>.\n *\n * - encode: msgpack (no Zod overhead — bytes out)\n * - decode: msgpack unpack → schema.parse() (validates on inbound data)\n * - fields: Object.keys(schema.shape) — powers LazyMessage<T> getters\n *\n * Validation cost on decode is intentional and acceptable on the management\n * path. Do NOT use zodCodec on a hot publish loop.\n */\nexport function zodCodec<S extends ZodRawShape>(\n zodSchema: ZodObject<S>,\n): Encoding<output<ZodObject<S>>> & { readonly fields: string[] } {\n const fields = Object.keys(zodSchema.shape)\n return {\n fields,\n encode(value): Buffer {\n return Buffer.from(packr.pack(value))\n },\n decode(buf): output<ZodObject<S>> {\n return zodSchema.parse(unpackr.unpack(buf))\n },\n }\n}\n"],"mappings":"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","names":["DeliverPolicy","JournalType","AckPolicy","schema","packCold","streamId","frame","frame","frame","frame","packPublishDelayed","Flag","frame","Packr","Unpackr"]}
1
+ {"version":3,"sources":["../src/types/config.ts","../src/types/error.ts","../src/utils/text.ts","../src/utils/json.ts","../src/utils/codec.ts","../src/topic/topic.ts","../src/topic/lazy-message.ts","../src/proto/delivery.ts","../src/proto/manage.ts","../src/message/message.ts","../src/subscription/subscription.ts","../src/net/connection.ts","../src/proto/framer.ts","../src/common/logger.ts","../src/cron/cron-frame.ts","../src/consumer/consumer.ts","../src/stream/stream.ts","../src/client/metrics.ts","../src/stream/publish.ts","../src/cron/cron-builder.ts","../src/cron/cron-state.ts","../src/client/client.ts","../src/proto/fnv1a.ts","../src/workflow/task.ts","../src/workflow/handle.ts","../src/workflow/processor.ts","../src/workflow/workflow.ts","../src/utils/zod.ts"],"sourcesContent":["// Values must match Rust enum variant names (rmp_serde serializes as PascalCase)\nexport enum DeliverPolicy {\n All = 'All',\n Last = 'Last',\n New = 'New',\n BySeq = 'ByStartSeq',\n ByTime = 'ByStartTime',\n}\n\nexport enum JournalType {\n Memory = 'Memory',\n Tolerant = 'Tolerant',\n Strict = 'Strict',\n}\n\nexport enum AckPolicy {\n Explicit = 'explicit',\n None = 'none',\n}\n\nexport interface FlushConfig {\n intervalMs?: number // default: 10\n maxMessages?: number // default: 512\n maxBytes?: number // default: 65_536\n}\n\nexport type JournalConfig =\n | { type: JournalType.Memory }\n | { type: JournalType.Tolerant }\n | { type: JournalType.Strict; flush?: FlushConfig }\n\nexport interface StreamConfig {\n subjectFilter: string\n journal?: JournalConfig\n maxMsgs?: number\n maxBytes?: number\n maxAgeMs?: number\n /**\n * Per-stream broker-side dedup window in milliseconds.\n *\n * - `0` or undefined (default): no dedup. Every publish is stored;\n * `msgId` is ignored.\n * - `>0`: any publish that carries a `msgId` matching one the\n * broker has stored for THIS stream within the last\n * `idempotencyWindowMs` is rejected with the `IdempotencyDuplicate`\n * wire error. Useful for safe retries — the first publish wins.\n *\n * The broker clamps requested windows above 5 minutes (300 000 ms)\n * down to that ceiling, matching JetStream behaviour.\n */\n idempotencyWindowMs?: number\n}\n\nexport interface DeleteStreamOpts {\n deleteData?: boolean\n}\n\nexport interface StreamInfo {\n name: string\n config: StreamConfig\n lastSeq: number\n}\n\n/**\n * Per-subject inflight cap. Each entry caps the number of in-flight\n * (delivered, unacked) messages on subjects matching `pattern`. Patterns\n * may use NATS-style wildcards (`*`, `>`).\n *\n * Only enforced when the owning consumer's `ackPolicy` is `Explicit`;\n * silently dropped server-side for fire-and-forget consumers (because\n * fire-and-forget bindings skip inflight tracking entirely).\n */\nexport interface SubjectInflightLimit {\n pattern: string\n limit: number\n}\n\nexport interface ConsumerConfig {\n name?: string // defaults to stream name when created via stream.consumer()\n /** Shared consumer group name for round-robin delivery. Defaults to `name`. */\n group?: string\n filter?: string // defaults to \"${streamName}.>\" when created via stream.consumer()\n fanout?: boolean // broadcast — every subscriber receives every message\n /** Consumer-side ACK policy. None = fire-and-forget delivery, Explicit = consumer must ACK. */\n ackPolicy?: AckPolicy\n deliverPolicy?: DeliverPolicy\n startSeq?: bigint\n startTime?: bigint\n maxAckPending?: number\n ackWaitMs?: number\n maxDeliver?: number\n removeUnusedAfterMs?: number\n /**\n * Per-subject max inflight (list of pattern → limit pairs).\n * Only effective with `ackPolicy: Explicit`.\n */\n maxSubjectInflights?: SubjectInflightLimit[]\n}\n\nexport interface ConsumerInfo {\n group: string\n stream: string\n config: ConsumerConfig\n}\n\nexport interface SubscribeOptions {\n fetchTimeoutMs?: number\n}\n\nexport interface ReconnectConfig {\n enabled?: boolean\n maxAttempts?: number\n intervalMs?: number\n jitter?: boolean\n}\n\nexport interface TlsConfig {\n enabled?: boolean\n ca?: Buffer | string\n cert?: Buffer | string\n key?: Buffer | string\n}\n\nexport interface ClientConfig {\n servers: string[]\n prefix?: string\n timeout?: number\n reconnect?: ReconnectConfig\n tls?: TlsConfig\n // Pino-compatible logger. Default: silent.\n logger?: import('../common/logger').Logger\n}\n","export class ArbitroError extends Error {\n constructor(\n message: string,\n readonly code: 'connect' | 'timeout' | 'protocol' | 'server' | 'closed',\n readonly brokerName?: string,\n readonly brokerDetails?: unknown,\n /**\n * Numeric wire error code from the broker's `RepError` frame. Only\n * populated when `code === 'server'`. Use the `ErrorCode` enum to\n * compare (e.g. `err.wireCode === ErrorCode.IdempotencyDuplicate`).\n */\n readonly wireCode?: number,\n ) {\n super(message)\n this.name = 'ArbitroError'\n }\n}\n\n/**\n * Wire-level error codes. Mirrors the `ErrorCode` enum in\n * `arbitro-proto`. New codes added to the broker MUST be appended here\n * with the matching numeric value.\n */\nexport const ErrorCode = {\n // 0x00xx — Protocol\n UnknownAction: 0x0001,\n BufferTooShort: 0x0002,\n InvalidLength: 0x0003,\n InvalidEntryCount: 0x0004,\n // 0x01xx — Auth\n AuthRequired: 0x0101,\n AuthFailed: 0x0102,\n // 0x02xx — Stream\n StreamNotFound: 0x0201,\n StreamAlreadyExists: 0x0202,\n StreamFull: 0x0203,\n StreamFilterOverlap: 0x0204,\n SubjectNotFound: 0x0205,\n /** Publish carried a `msgId` already seen for this stream within\n * `idempotencyWindowMs`. Original write stands; safe to treat as\n * a successful publish at the application level. */\n IdempotencyDuplicate: 0x0206,\n // 0x03xx — Consumer\n ConsumerNotFound: 0x0301,\n ConsumerAlreadyExists: 0x0302,\n ConsumerFilterOverlap: 0x0303,\n // 0x04xx — Delivery\n InvalidSequence: 0x0401,\n MaxInflightReached: 0x0402,\n AckTimeout: 0x0403,\n // 0x05xx — System\n ServerShuttingDown: 0x0501,\n InternalError: 0x0502,\n} as const\n\nexport type ErrorCodeValue = (typeof ErrorCode)[keyof typeof ErrorCode]\n\nexport interface BrokerError {\n name: string\n message: string\n details?: unknown\n}\n","export function encodeString(s: string): Buffer {\n return Buffer.from(s, 'utf8')\n}\n\nexport function decodeString(buf: Buffer): string {\n return buf.toString('utf8')\n}\n","export function encodeJson(value: unknown): Buffer {\n return Buffer.from(JSON.stringify(value), 'utf8')\n}\n\nexport function decodeJson<T = unknown>(buf: Buffer): T {\n return JSON.parse(buf.toString('utf8')) as T\n}\n","import { Packr, Unpackr } from 'msgpackr'\n\n// ── Base interface ─────────────────────────────────────────────────────────\n\n/** Core encode/decode contract. `fields` is required only for schema-based codecs\n * that power LazyMessage<T> getters — other encodings may omit it. */\nexport interface Encoding<T> {\n encode(value: T): Buffer\n decode(buf: Buffer): T\n readonly fields?: string[]\n}\n\n// ── FieldType inference ────────────────────────────────────────────────────\n\n/** Maps a FieldType string literal to its corresponding TypeScript type. */\nexport type FieldTypeMap = {\n string: string\n number: number\n boolean: boolean\n bigint: bigint\n buffer: Buffer\n unknown: unknown\n}\n\n/** Infers the TypeScript record type from a schema definition.\n * Eliminates the need to define both an interface and a Schema<T>. */\nexport type InferSchema<S extends Record<string, FieldType>> = {\n [K in keyof S]: FieldTypeMap[S[K]]\n}\n\n// ── TextEncoding — abstract base for string-based encodings ───────────────\n\nexport abstract class TextEncoding implements Encoding<string> {\n abstract readonly encoding: BufferEncoding\n\n encode(value: string): Buffer { return Buffer.from(value, this.encoding) }\n decode(buf: Buffer): string { return buf.toString(this.encoding) }\n}\n\n// ── StringCodec — UTF-8 by default ────────────────────────────────────────\n\nexport class StringCodec extends TextEncoding {\n readonly encoding: BufferEncoding\n constructor(encoding: BufferEncoding = 'utf8') {\n super()\n this.encoding = encoding\n }\n}\n\n// ── JsonCodec<T> — composes StringCodec, never extends it ─────────────────\n\nexport class JsonCodec<T> implements Encoding<T> {\n private readonly text: StringCodec\n constructor(encoding: BufferEncoding = 'utf8') {\n this.text = new StringCodec(encoding)\n }\n encode(value: T): Buffer { return this.text.encode(JSON.stringify(value)) }\n decode(buf: Buffer): T { return JSON.parse(this.text.decode(buf)) as T }\n}\n\n// ── Codec<T> — schema-based msgpack, fastest ──────────────────────────────\n// Fields are fixed at construction — no key discovery on hot path.\n\nexport type FieldType = 'string' | 'number' | 'boolean' | 'bigint' | 'buffer' | 'unknown'\nexport type Schema<T> = { [K in keyof Required<T>]: FieldType }\n\nexport class Codec<T extends Record<string, unknown>> implements Encoding<T> {\n readonly fields: (keyof T & string)[]\n private readonly packr: Packr\n private readonly unpackr: Unpackr\n\n constructor(schema: Schema<T>) {\n this.fields = Object.keys(schema) as (keyof T & string)[]\n this.packr = new Packr({ structuredClone: false, useRecords: false })\n this.unpackr = new Unpackr({ structuredClone: false, useRecords: false })\n }\n\n // Encodes only known fields in definition order — no extras, no key enumeration.\n encode(value: T): Buffer {\n const obj: Record<string, unknown> = {}\n for (const k of this.fields) obj[k] = value[k]\n return Buffer.from(this.packr.pack(obj))\n }\n\n decode(buf: Buffer): T {\n return this.unpackr.unpack(buf) as T\n }\n}\n\n// ── schema() factory ──────────────────────────────────────────────────────\n// Creates a Codec<T> with T inferred from the schema definition.\n// No need to define a separate interface.\n//\n// Before: new Codec<Order>({ id: 'number', status: 'string' })\n// After: schema({ id: 'number', status: 'string' }) ← type inferred\n\n/** Creates a msgpack Codec with the TypeScript type inferred from the schema definition. */\nexport function schema<S extends Record<string, FieldType>>(def: S): Codec<InferSchema<S>> {\n return new Codec<InferSchema<S>>(def as Schema<InferSchema<S>>)\n}\n","import type { Stream } from '../stream/stream'\nimport type { Encoding } from '../utils/codec'\nimport type { Subscription } from '../subscription/subscription'\nimport { makeLazyMessage, type LazyMessage } from './lazy-message'\n\n// Topic<T> — binds a subject + codec so publish/subscribe are always typed.\n// Instantiate via stream.topic(subject, codec).\nexport class Topic<T extends Record<string, unknown>> {\n private readonly fields: string[]\n\n constructor(\n private readonly stream: Stream,\n private readonly subject: string,\n private readonly codec: Encoding<T>,\n ) {\n this.fields = (codec as { fields?: string[] }).fields ?? []\n }\n\n publish(value: T): void {\n this.stream.publish(this.subject, this.codec.encode(value))\n }\n\n async publishAck(value: T): Promise<void> {\n await this.stream.publishAck(this.subject, this.codec.encode(value))\n }\n\n publishBatch(values: T[]): void {\n this.stream.publishBatch(values.map((v) => ({\n subject: this.subject,\n payload: this.codec.encode(v),\n })))\n }\n\n async subscribe(\n group: string,\n cb: (msg: LazyMessage<T>) => void,\n ): Promise<Subscription> {\n const consumer = this.stream.consumer({ name: group })\n return consumer.subscribe(this.codec, cb)\n }\n}\n","import type { Encoding } from '../utils/codec'\n\n// LazyMessage<T> = T fields as getters + meta methods.\n// Decode happens only on first field access — result is cached.\n// If msg.ack() is called without reading any field, zero deserialization occurs.\nexport type LazyMessage<T> = T & {\n readonly _raw: Buffer\n decode(): T\n ack(): void\n nack(): void\n nackDelay(delayMs: number): void\n}\n\n// Factory — uses Object.defineProperty for O(1) getter access (no Proxy overhead).\nexport function makeLazyMessage<T extends Record<string, unknown>>(\n raw: Buffer,\n codec: Encoding<T>,\n fields: string[],\n onAck: () => void,\n onNack: () => void,\n onNackDelay?: (ms: number) => void,\n): LazyMessage<T> {\n let cache: T | undefined\n const lazy = (): T => cache ??= codec.decode(raw)\n\n const msg: Record<string, unknown> = {\n _raw: raw,\n decode: lazy,\n ack: onAck,\n nack: onNack,\n nackDelay: onNackDelay ?? onNack,\n }\n\n for (const key of fields) {\n Object.defineProperty(msg, key, {\n get: () => lazy()[key as keyof T],\n enumerable: true,\n })\n }\n\n return msg as LazyMessage<T>\n}\n","// Delivery lifecycle — Subscribe/Unsubscribe (cold path, JSON) +\n// Ack/Nack/BatchAck/BatchNack (hot path, binary).\n\nimport { HEADER_SIZE, Action } from './constants'\nimport { frame } from './frame'\n\n// ── Subscribe / Unsubscribe (cold path, JSON body) ──────────────────────\n//\n// Mirror of `arbitro_proto::v2::cold::Subscribe`:\n// { consumer_id: u32, subscription_id: u32, filters: Vec<Vec<u8>> }\n//\n// `subscription_id = 0` selects legacy \"subscription_id == consumer_id\"\n// dispatch on the server. Empty `filters` (or single empty entry) =\n// catch-all.\n\nfunction packCold(action: Action, seq: bigint, body: unknown): Buffer {\n const utf8 = Buffer.from(JSON.stringify(body), 'utf8')\n const buf = frame(action, seq, utf8.length)\n utf8.copy(buf, HEADER_SIZE)\n return buf\n}\n\nexport function packSubscribe(\n seq: bigint, _connId: number, consumerId: number,\n filter: Buffer, _optionsFlags = 0,\n): Buffer {\n const filters: number[][] =\n filter.length === 0 ? [] : [Array.from(filter)]\n return packCold(Action.Subscribe, seq, {\n consumer_id: consumerId >>> 0,\n subscription_id: 0,\n filters,\n })\n}\n\nexport function packUnsubscribe(seq: bigint, _connId: number, consumerId: number): Buffer {\n return packCold(Action.Unsubscribe, seq, { consumer_id: consumerId >>> 0 })\n}\n\n// ── Ack / Nack ──────────────────────────────────────────────────────────\n\n// Body: consumer_id(4) + subject_hash(4) + seq(8) = 16B\nexport function packAck(\n seq: bigint, consumerId: number, subjectHash: number, ackSeq: bigint,\n): Buffer {\n const buf = frame(Action.Ack, seq, 16)\n buf.writeUInt32LE(consumerId, HEADER_SIZE)\n buf.writeUInt32LE(subjectHash, HEADER_SIZE + 4)\n buf.writeBigUInt64LE(ackSeq, HEADER_SIZE + 8)\n return buf\n}\n\nexport function packNack(\n seq: bigint, consumerId: number, subjectHash: number, nackSeq: bigint,\n): Buffer {\n const buf = frame(Action.Nack, seq, 16)\n buf.writeUInt32LE(consumerId, HEADER_SIZE)\n buf.writeUInt32LE(subjectHash, HEADER_SIZE + 4)\n buf.writeBigUInt64LE(nackSeq, HEADER_SIZE + 8)\n return buf\n}\n\n// ── Batch Ack / Nack ────────────────────────────────────────────────────\n\n// Body: consumer_id(4) + count(4) = 8B + entries[seq(8)+subject_hash(4)+_pad(4)] = 16B each\nexport function packBatchAck(\n seq: bigint, consumerId: number,\n entries: ReadonlyArray<{ seq: bigint; subjectHash: number }>,\n): Buffer {\n const buf = frame(Action.BatchAck, seq, 8 + entries.length * 16)\n buf.writeUInt32LE(consumerId, HEADER_SIZE)\n buf.writeUInt32LE(entries.length, HEADER_SIZE + 4)\n let off = HEADER_SIZE + 8\n for (const e of entries) {\n buf.writeBigUInt64LE(e.seq, off)\n buf.writeUInt32LE(e.subjectHash, off + 8)\n buf.writeUInt32LE(0, off + 12)\n off += 16\n }\n return buf\n}\n\n// entries[seq(8)+subject_hash(4)+delay_ms(4)] = 16B each\nexport function packBatchNack(\n seq: bigint, consumerId: number,\n entries: ReadonlyArray<{ seq: bigint; subjectHash: number; delayMs: number }>,\n): Buffer {\n const buf = frame(Action.BatchNack, seq, 8 + entries.length * 16)\n buf.writeUInt32LE(consumerId, HEADER_SIZE)\n buf.writeUInt32LE(entries.length, HEADER_SIZE + 4)\n let off = HEADER_SIZE + 8\n for (const e of entries) {\n buf.writeBigUInt64LE(e.seq, off)\n buf.writeUInt32LE(e.subjectHash, off + 8)\n buf.writeUInt32LE(e.delayMs, off + 12)\n off += 16\n }\n return buf\n}\n","// Stream + Consumer management frames.\n//\n// Wire format: cold-path management frames now ride as\n// `[Header 16B][serde_json(body)]`. The server's `v2::cold` module\n// decodes the JSON body via `serde_json::from_slice`. This file mirrors\n// the Rust `cold_body!` macro definitions in\n// `crates/arbitro-proto/src/v2/cold/mod.rs`.\n//\n// Important: Rust's `Vec<u8>` is JSON-encoded by serde as an array of\n// numbers (e.g. \"orders\" → `[111,114,100,101,114,115]`), NOT as a UTF-8\n// string. Every byte-sequence field below uses `Array.from(buffer)` to\n// match. Strings would require the Rust side to opt in to\n// `#[serde(with = \"serde_bytes\")]`, which it does not.\n//\n// Hot-path frames (Publish, Ack, etc.) keep the zerocopy binary format\n// from their dedicated modules.\n\nimport { HEADER_SIZE, Action } from './constants'\nimport { frame } from './frame'\n\n/** Build a cold-path frame: `[Header][serde_json(body)]`. */\nfunction packCold(action: Action, seq: bigint, body: unknown): Buffer {\n const utf8 = Buffer.from(JSON.stringify(body), 'utf8')\n const buf = frame(action, seq, utf8.length)\n utf8.copy(buf, HEADER_SIZE)\n return buf\n}\n\n/** Encode a `Buffer` as the JSON array form serde uses for `Vec<u8>`. */\nfunction bytesArr(b: Buffer): number[] { return Array.from(b) }\n\n// ── Stream management ──────────────────────────────────────────────────\n\n/**\n * Cold body for `CreateStream`. `idempotencyWindowMs = 0` disables\n * broker-side dedup (default); a non-zero value enables per-stream\n * `msgId` dedup over that window.\n */\nexport function packCreateStream(\n seq: bigint, name: Buffer, filter: Buffer,\n maxMsgs: bigint, maxBytes: bigint, maxAgeSecs: bigint,\n replicas = 1, journalKind = 0, retention = 0, discard = 0,\n idempotencyWindowMs = 0,\n): Buffer {\n return packCold(Action.CreateStream, seq, {\n name: bytesArr(name),\n filter: bytesArr(filter),\n max_msgs: Number(maxMsgs), // u64 — fits in JS number if < 2^53\n max_bytes: Number(maxBytes),\n max_age_secs: Number(maxAgeSecs),\n replicas, journal_kind: journalKind, retention, discard,\n idempotency_window_ms: idempotencyWindowMs >>> 0,\n })\n}\n\nexport const packDeleteStream = (seq: bigint, name: Buffer): Buffer =>\n packCold(Action.DeleteStream, seq, { name: bytesArr(name) })\n\nexport const packGetStream = (seq: bigint, name: Buffer): Buffer =>\n packCold(Action.GetStream, seq, { name: bytesArr(name) })\n\nexport const packPurgeStream = (seq: bigint, name: Buffer): Buffer =>\n packCold(Action.PurgeStream, seq, { name: bytesArr(name) })\n\nexport const packDrainSubject = (seq: bigint, name: Buffer, subject: Buffer): Buffer =>\n packCold(Action.DrainSubject, seq, {\n name: bytesArr(name),\n subject: bytesArr(subject),\n })\n\nexport const packDeleteMessage = (seq: bigint, name: Buffer, msgSeq: bigint): Buffer =>\n packCold(Action.DeleteMessage, seq, { name: bytesArr(name), seq: Number(msgSeq) })\n\nexport const packListStreams = (seq: bigint, offset = 0, limit = 1000): Buffer =>\n packCold(Action.ListStreams, seq, { offset: offset >>> 0, limit: limit >>> 0 })\n\n// ── Consumer management ────────────────────────────────────────────────\n\n/** One per-subject inflight cap. Enforced only with `ackPolicy === Explicit`. */\nexport interface WireSubjectLimit {\n pattern: Buffer\n limit: number\n}\n\nexport interface CreateConsumerOpts {\n streamId: number; name: Buffer; group: Buffer; filter: Buffer\n maxInflight?: number; ackPolicy?: number; deliverPolicy?: number\n deliverMode?: number; ackWaitMs?: number; startSeq?: bigint\n subjectLimits?: WireSubjectLimit[]\n}\n\nexport function packCreateConsumer(seq: bigint, opts: CreateConsumerOpts): Buffer {\n const limits = (opts.subjectLimits ?? []).map(l => ({\n pattern: bytesArr(l.pattern),\n limit: l.limit >>> 0,\n }))\n return packCold(Action.CreateConsumer, seq, {\n stream_id: opts.streamId >>> 0,\n name: bytesArr(opts.name),\n group: bytesArr(opts.group),\n subject: bytesArr(opts.filter),\n max_inflight: Math.min(opts.maxInflight ?? 0, 0xFFFF),\n ack_policy: opts.ackPolicy ?? 1,\n deliver_policy: opts.deliverPolicy ?? 0,\n deliver_mode: opts.deliverMode ?? 0,\n ack_wait_ms: (opts.ackWaitMs ?? 0) >>> 0,\n start_seq: Number(opts.startSeq ?? 0n),\n subject_limits: limits,\n })\n}\n\nexport const packDeleteConsumer = (seq: bigint, consumerId: number): Buffer =>\n packCold(Action.DeleteConsumer, seq, { consumer_id: consumerId >>> 0 })\n\nexport const packGetConsumer = (seq: bigint, streamId: number, name: Buffer): Buffer =>\n packCold(Action.GetConsumer, seq, {\n stream_id: streamId >>> 0,\n name: bytesArr(name),\n })\n\nexport const packListConsumers = (seq: bigint, streamId = 0, offset = 0, limit = 1000): Buffer =>\n packCold(Action.ListConsumers, seq, {\n stream_id: streamId >>> 0,\n offset: offset >>> 0,\n limit: limit >>> 0,\n })\n\nexport const packConsumerStats = (seq: bigint, consumerId: number): Buffer =>\n packCold(Action.ConsumerStats, seq, { consumer_id: consumerId >>> 0 })\n\n/** M11: pause delivery to a consumer. */\nexport const packPauseConsumer = (seq: bigint, consumerId: number): Buffer =>\n packCold(Action.PauseConsumer, seq, { consumer_id: consumerId >>> 0 })\n\n/** M11: resume delivery to a previously paused consumer. */\nexport const packResumeConsumer = (seq: bigint, consumerId: number): Buffer =>\n packCold(Action.ResumeConsumer, seq, { consumer_id: consumerId >>> 0 })\n","import { HEADER_SIZE, OFF_SEQ } from '../proto/constants'\nimport { packAck, packNack, packBatchNack } from '../proto/v2'\n\n// V2 Deliver frame layout:\n// Header(16B) + DeliverBody(12B) + tail[subject + payload]\n//\n// DeliverBody offsets (relative to HEADER_SIZE):\n// 0: consumer_id u32\n// 4: subject_hash u32\n// 8: subject_len u16\n// 10: _pad u16\n\nconst BODY_OFF = HEADER_SIZE\nconst BODY_SIZE = 12\nconst TAIL_OFF = HEADER_SIZE + BODY_SIZE\nconst OFF_CONSUMER = BODY_OFF\nconst OFF_SUBJ_HASH = BODY_OFF + 4\nconst OFF_SUBJ_LEN = BODY_OFF + 8\n\ntype SendFn = (frame: Buffer) => void\n\nexport class Message {\n private readonly frame: Buffer\n private readonly send: SendFn\n private readonly seqFn: () => bigint\n private _subjectLen: number | undefined\n\n constructor(frame: Buffer, send: SendFn, seqFn: () => bigint) {\n this.frame = frame\n this.send = send\n this.seqFn = seqFn\n }\n\n /** Delivery sequence — used to ack/nack this message. */\n seq(): bigint {\n return this.frame.readBigUInt64LE(OFF_SEQ)\n }\n\n /** Consumer ID that received this delivery. */\n consumerId(): number {\n return this.frame.readUInt32LE(OFF_CONSUMER)\n }\n\n /** Subject hash — echoed back in ack for O(1) credit release. */\n subjectHash(): number {\n return this.frame.readUInt32LE(OFF_SUBJ_HASH)\n }\n\n private subjLen(): number {\n return this._subjectLen ??= this.frame.readUInt16LE(OFF_SUBJ_LEN)\n }\n\n /** Zero-copy view of the subject bytes. */\n subject(): Buffer {\n return this.frame.subarray(TAIL_OFF, TAIL_OFF + this.subjLen())\n }\n\n /** Zero-copy view of the payload bytes. */\n data(): Buffer {\n return this.frame.subarray(TAIL_OFF + this.subjLen())\n }\n\n /** Acknowledge — fire-and-forget to broker. */\n ack(): void {\n this.send(packAck(\n this.seqFn(), this.consumerId(), this.subjectHash(), this.seq(),\n ))\n }\n\n /** Negative acknowledge — immediate requeue. */\n nack(): void {\n this.send(packNack(\n this.seqFn(), this.consumerId(), this.subjectHash(), this.seq(),\n ))\n }\n\n /** Negative acknowledge with redelivery delay (ms). */\n nackDelay(ms: number): void {\n // Single nack frame has no delay field — use BatchNack with 1 entry.\n this.send(packBatchNack(\n this.seqFn(), this.consumerId(),\n [{ seq: this.seq(), subjectHash: this.subjectHash(), delayMs: ms }],\n ))\n }\n}\n","import { Message } from '../message/message'\nimport type { Connection } from '../net/connection'\n\ntype MsgCallback = (msg: Message) => void\n\ninterface PendingFetch {\n resolve: (msgs: Message[]) => void\n count: number\n buf: Message[]\n timer: ReturnType<typeof setTimeout>\n}\n\nexport class Subscription {\n private callback: MsgCallback | undefined\n private fetchQueue: PendingFetch[] = []\n private msgBuf: Message[] = []\n private closed = false\n\n constructor(\n private consumerId: number,\n private readonly conn: Connection,\n private readonly streamName: string,\n private readonly fetchTimeoutMs: number,\n ) {}\n\n /** Consumer ID assigned by the server. */\n id(): number { return this.consumerId }\n\n // Called by the delivery handler.\n deliver(frame: Buffer): void {\n if (this.closed) return\n\n const msg = new Message(\n frame,\n (f) => this.conn.send(f),\n () => this.conn.nextSeq(),\n )\n\n if (this.callback) {\n this.callback(msg)\n return\n }\n\n const pending = this.fetchQueue[0]\n if (pending) {\n pending.buf.push(msg)\n if (pending.buf.length >= pending.count) {\n clearTimeout(pending.timer)\n this.fetchQueue.shift()\n pending.resolve(pending.buf)\n }\n return\n }\n\n this.msgBuf.push(msg)\n }\n\n // Push mode — set a callback to receive messages as they arrive.\n onMessage(cb: MsgCallback): void {\n this.callback = cb\n }\n\n // Pull mode — fetch up to `count` messages, waiting up to `timeoutMs`.\n fetch(count: number, timeoutMs = this.fetchTimeoutMs): Promise<Message[]> {\n if (this.msgBuf.length >= count) {\n return Promise.resolve(this.msgBuf.splice(0, count))\n }\n return new Promise((resolve) => {\n const buf = this.msgBuf.splice(0)\n const timer = setTimeout(() => {\n const idx = this.fetchQueue.findIndex((p) => p === pending)\n if (idx >= 0) this.fetchQueue.splice(idx, 1)\n resolve(buf)\n }, timeoutMs)\n const pending: PendingFetch = { resolve, count, buf, timer }\n this.fetchQueue.push(pending)\n })\n }\n\n close(): void {\n this.closed = true\n this.conn.cancelSubscription(this.consumerId)\n for (const p of this.fetchQueue) {\n clearTimeout(p.timer)\n p.resolve(p.buf)\n }\n this.fetchQueue = []\n }\n}\n","import * as net from 'net'\nimport * as tls from 'tls'\nimport { Framer } from '../proto/framer'\nimport { packHello, packSubscribe, packUnsubscribe, packDisconnect } from '../proto/v2'\nimport {\n Action, HEADER_SIZE, OFF_ACTION, OFF_SEQ, OFF_MSG_LEN,\n} from '../proto/constants'\nimport { ArbitroError } from '../types/error'\nimport type { TlsConfig, ReconnectConfig } from '../types/config'\nimport { resolveLogger } from '../common/logger'\nimport type { Logger } from '../common/logger'\nimport type { ClientMetrics } from '../client/metrics'\nimport { CronState } from '../cron/cron-state'\nimport { decodeCronFire, packCronAck, packCreateCron } from '../cron/cron-frame'\n\ntype DeliveryHandler = (frame: Buffer) => void\n\ninterface PendingMgmt {\n resolve: (frame: Buffer) => void\n reject: (err: Error) => void\n}\n\ninterface ActiveSubscription {\n consumerId: number\n filter: Buffer\n handler: DeliveryHandler\n onRenew: ((newConsumerId: number) => void) | undefined\n}\n\nfunction parseAddr(addr: string): { host: string; port: number } {\n const i = addr.lastIndexOf(':')\n return i === -1\n ? { host: addr, port: 9898 }\n : { host: addr.slice(0, i), port: parseInt(addr.slice(i + 1), 10) }\n}\n\nexport class Connection {\n private seq = 1n\n private connId = 0\n private framer = new Framer()\n private routes = new Map<number, DeliveryHandler>()\n private pending = new Map<bigint, PendingMgmt>()\n private socket: net.Socket\n private closing = false\n private readonly log: Logger\n private activeSubs = new Map<number, ActiveSubscription>()\n private metrics?: ClientMetrics\n private cronState?: CronState\n\n private constructor(\n socket: net.Socket,\n private readonly reconnectAddr?: { host: string; port: number },\n private readonly reconnectCfg?: ReconnectConfig,\n logger?: Logger,\n ) {\n this.log = resolveLogger(logger)\n this.socket = socket\n this.attachSocket(socket)\n }\n\n private attachSocket(socket: net.Socket): void {\n socket.setNoDelay(true)\n socket.on('data', (chunk: Buffer) => this.framer.push(chunk, (f) => this.onFrame(f)))\n socket.on('error', (err) => this.drain(err))\n socket.on('close', () => this.handleClose())\n }\n\n static connect(\n addr: string,\n timeoutMs = 5_000,\n tlsCfg?: TlsConfig,\n reconnectCfg?: ReconnectConfig,\n logger?: Logger,\n ): Promise<Connection> {\n const parsed = parseAddr(addr)\n const { host, port } = parsed\n return new Promise((resolve, reject) => {\n const timer = setTimeout(\n () => reject(new ArbitroError('connect timeout', 'connect')),\n timeoutMs,\n )\n const done = (socket: net.Socket) => {\n clearTimeout(timer)\n const conn = new Connection(socket, parsed, reconnectCfg, logger)\n socket.write(packHello())\n conn.log.info({ host, port }, 'arbitro connected (v2)')\n resolve(conn)\n }\n const fail = (e: Error) => { clearTimeout(timer); reject(e) }\n\n if (tlsCfg) {\n const s = tls.connect({\n host, port,\n ca: tlsCfg.ca,\n cert: tlsCfg.cert,\n key: tlsCfg.key,\n rejectUnauthorized: true,\n })\n s.once('secureConnect', () => done(s))\n s.once('error', fail)\n } else {\n const s = net.createConnection({ host, port })\n s.once('connect', () => done(s))\n s.once('error', fail)\n }\n })\n }\n\n nextSeq(): bigint { return this.seq++ }\n\n /**\n * Attach a metrics sink. Called by `ArbitroClient` after `connect()`.\n * The connection bumps `deliveriesReceived` on every Deliver/RepBatch\n * entry and `reconnects` on successful reconnections. Unset = no-op.\n */\n setMetrics(m: ClientMetrics): void { this.metrics = m }\n\n /** Attach cron state so the connection can dispatch CronFire frames. */\n setCronState(s: CronState): void { this.cronState = s }\n\n\n // ── Frame routing ─────────────────────────────────────────────────────────\n // Seq-based dispatch: match reply.header.seq → pending request. O(1).\n\n private resolvePending(frame: Buffer): void {\n const reqSeq = frame.readBigUInt64LE(OFF_SEQ)\n const p = this.pending.get(reqSeq)\n if (!p) return\n this.pending.delete(reqSeq)\n p.resolve(frame)\n }\n\n private rejectPending(frame: Buffer): void {\n const reqSeq = frame.readBigUInt64LE(OFF_SEQ)\n const p = this.pending.get(reqSeq)\n if (!p) return\n this.pending.delete(reqSeq)\n const errorCode = frame.length >= HEADER_SIZE + 10\n ? frame.readUInt16LE(HEADER_SIZE + 8)\n : 0\n p.reject(new ArbitroError(\n `server error (code=0x${errorCode.toString(16).padStart(4, '0')})`,\n 'server', undefined, undefined, errorCode,\n ))\n }\n\n private onFrame(frame: Buffer): void {\n const action = frame.readUInt16LE(OFF_ACTION) as Action\n\n switch (action) {\n case Action.RepOk:\n case Action.ListStreams:\n case Action.ListConsumers: {\n this.resolvePending(frame)\n return\n }\n case Action.RepError: {\n this.rejectPending(frame)\n return\n }\n case Action.Deliver: {\n const consumerId = frame.readUInt32LE(HEADER_SIZE)\n const handler = this.routes.get(consumerId)\n if (!handler) {\n this.log.warn({ consumerId }, 'delivery for unknown consumer')\n return\n }\n if (this.metrics) this.metrics.deliveriesReceived++\n handler(frame)\n return\n }\n case Action.RepBatch: {\n this.handleBatchDeliver(frame)\n return\n }\n case Action.CronFire: {\n this.dispatchCronFire(frame)\n return\n }\n case Action.Pong: return\n default: {\n // Silently drop unknown actions (matches Rust client behavior)\n this.log.debug({ action: `0x${action.toString(16)}` }, 'unknown action, dropped')\n }\n }\n }\n\n private handleBatchDeliver(frame: Buffer): void {\n if (frame.length < HEADER_SIZE + 4) return\n const count = frame.readUInt16LE(HEADER_SIZE)\n let off = HEADER_SIZE + 4\n\n for (let i = 0; i < count; i++) {\n if (off + 24 > frame.length) break\n const consumerId = frame.readUInt32LE(off)\n const deliverSeq = frame.readBigUInt64LE(off + 4)\n const subjectLen = frame.readUInt16LE(off + 12)\n const replyLen = frame.readUInt16LE(off + 14)\n const dataLen = frame.readUInt32LE(off + 16)\n const subjectHash = frame.readUInt32LE(off + 20)\n off += 24\n\n const tailEnd = off + dataLen\n if (tailEnd > frame.length) break\n const payloadLen = dataLen - subjectLen - replyLen\n\n const handler = this.routes.get(consumerId)\n if (handler) {\n const bodyLen = 12 + subjectLen + payloadLen\n const single = Buffer.allocUnsafe(HEADER_SIZE + bodyLen)\n single.writeUInt16LE(Action.Deliver, 0)\n single[2] = 0; single[3] = 0\n single.writeUInt32LE(bodyLen, 4)\n single.writeBigUInt64LE(deliverSeq, 8)\n single.writeUInt32LE(consumerId, HEADER_SIZE)\n single.writeUInt32LE(subjectHash, HEADER_SIZE + 4)\n single.writeUInt16LE(subjectLen, HEADER_SIZE + 8)\n single.writeUInt16LE(0, HEADER_SIZE + 10)\n frame.copy(single, HEADER_SIZE + 12, off, off + subjectLen)\n frame.copy(single, HEADER_SIZE + 12 + subjectLen,\n off + subjectLen + replyLen, tailEnd)\n if (this.metrics) this.metrics.deliveriesReceived++\n handler(single)\n }\n off = tailEnd\n }\n }\n\n // ── Cron dispatch ──────────────────────────────────────────────────────────\n\n private dispatchCronFire(frame: Buffer): void {\n const body = frame.subarray(HEADER_SIZE)\n const view = decodeCronFire(body)\n if (!view) return\n\n const handler = this.cronState?.getHandler(view.name)\n const nameBuf = Buffer.from(view.name)\n\n if (!handler) {\n this.send(packCronAck(this.nextSeq(), nameBuf, false))\n return\n }\n\n // Execute async handler outside sync dispatch; send ack when done.\n handler({ name: view.name, fireTime: view.fireTimeMs, fireCount: view.fireCount })\n .then(() => this.send(packCronAck(this.nextSeq(), nameBuf, true)))\n .catch(() => this.send(packCronAck(this.nextSeq(), nameBuf, false)))\n }\n\n // ── Subscriptions ─────────────────────────────────────────────────────────\n\n async sendSubscribeV2(\n consumerId: number,\n filter: Buffer,\n handler: DeliveryHandler,\n onRenew?: (newConsumerId: number) => void,\n ): Promise<number> {\n return new Promise((resolve, reject) => {\n const seq = this.nextSeq()\n const timer = setTimeout(\n () => { this.pending.delete(seq); reject(new ArbitroError('subscribe timeout', 'timeout')) },\n 5_000,\n )\n this.pending.set(seq, {\n resolve: (_frame) => {\n clearTimeout(timer)\n this.routes.set(consumerId, handler)\n this.activeSubs.set(consumerId, { consumerId, filter, handler, onRenew })\n resolve(consumerId)\n },\n reject: (err) => { clearTimeout(timer); reject(err) },\n })\n this.socket.write(packSubscribe(seq, this.connId, consumerId, filter))\n })\n }\n\n cancelSubscription(consumerId: number): void {\n this.routes.delete(consumerId)\n this.activeSubs.delete(consumerId)\n this.socket.write(packUnsubscribe(this.nextSeq(), this.connId, consumerId))\n }\n\n private resubscribeAll(): void {\n this.socket.write(packHello())\n const subs = [...this.activeSubs.values()]\n this.activeSubs.clear()\n this.routes.clear()\n for (const { consumerId, filter, handler, onRenew } of subs) {\n this.sendSubscribeV2(consumerId, filter, handler, onRenew)\n .then((id) => { if (onRenew) onRenew(id) })\n .catch(() => { })\n }\n this.replayCrons()\n }\n\n private replayCrons(): void {\n if (!this.cronState) return\n for (const { config } of this.cronState.allConfigs()) {\n const seq = this.nextSeq()\n this.socket.write(packCreateCron(seq, config))\n }\n }\n\n // ── Routes (internal use) ─────────────────────────────────────────────────\n\n registerRoute(consumerId: number, handler: DeliveryHandler): void {\n this.routes.set(consumerId, handler)\n }\n\n unregisterRoute(consumerId: number): void {\n this.routes.delete(consumerId)\n }\n\n // ── Write ─────────────────────────────────────────────────────────────────\n\n send(frame: Buffer): void {\n this.socket.write(frame)\n }\n\n /** Send frame and wait for RepOk. Returns the ref_seq from body. */\n sendExpectReply(frame: Buffer, timeoutMs = 5_000): Promise<bigint> {\n const seq = frame.readBigUInt64LE(OFF_SEQ)\n return new Promise((resolve, reject) => {\n const timer = setTimeout(\n () => { this.pending.delete(seq); reject(new ArbitroError('request timeout', 'timeout')) },\n timeoutMs,\n )\n this.pending.set(seq, {\n resolve: (f) => {\n clearTimeout(timer)\n resolve(f.readBigUInt64LE(HEADER_SIZE))\n },\n reject: (e) => { clearTimeout(timer); reject(e) },\n })\n this.socket.write(frame)\n })\n }\n\n /** Send frame and wait for full reply frame buffer. */\n sendExpectReplyRaw(frame: Buffer, timeoutMs = 5_000): Promise<Buffer> {\n const seq = frame.readBigUInt64LE(OFF_SEQ)\n return new Promise((resolve, reject) => {\n const timer = setTimeout(\n () => { this.pending.delete(seq); reject(new ArbitroError('request timeout', 'timeout')) },\n timeoutMs,\n )\n this.pending.set(seq, {\n resolve: (f) => { clearTimeout(timer); resolve(f) },\n reject: (e) => { clearTimeout(timer); reject(e) },\n })\n this.socket.write(frame)\n })\n }\n\n // ── Lifecycle ─────────────────────────────────────────────────────────────\n\n close(): Promise<void> {\n this.closing = true\n this.socket.write(packDisconnect(this.nextSeq()))\n return new Promise((resolve) => this.socket.end(resolve))\n }\n\n private drain(err: Error): void {\n for (const p of this.pending.values()) p.reject(err)\n this.pending.clear()\n }\n\n private handleClose(): void {\n this.log.debug('arbitro connection closed')\n this.drain(new ArbitroError('connection closed', 'closed'))\n const cfg = this.reconnectCfg\n if (!this.closing && cfg && cfg.enabled !== false && this.reconnectAddr) {\n this.tryReconnect(0)\n }\n }\n\n private tryReconnect(attempt: number): void {\n const cfg = this.reconnectCfg\n if (!cfg) return\n const max = cfg.maxAttempts ?? 10\n if (attempt >= max) {\n this.log.warn({ attempt }, 'reconnect exhausted')\n return\n }\n const base = cfg.intervalMs ?? 500\n const jitter = cfg.jitter !== false ? Math.random() * 100 : 0\n const delay = Math.min(base * 2 ** attempt, 30_000) + jitter\n this.log.debug({ attempt, delayMs: Math.round(delay) }, 'reconnecting')\n setTimeout(() => {\n const { host, port } = this.reconnectAddr!\n const socket = net.createConnection({ host, port })\n socket.once('connect', () => {\n this.log.info({ host, port, attempt }, 'arbitro reconnected')\n this.framer = new Framer()\n this.socket = socket\n this.attachSocket(socket)\n this.resubscribeAll()\n })\n socket.once('error', () => this.tryReconnect(attempt + 1))\n }, delay)\n }\n}\n","import { HEADER_SIZE, OFF_ACTION, OFF_MSG_LEN, Action } from './constants'\n\ntype FrameCallback = (frame: Buffer) => void\n\n// Envelope header (RepBatch/FanoutBatch): msg_len lives at offset 8, not 4.\nconst ENVELOPE_MSG_LEN_OFF = 8\n\n// Accumulates incoming TCP bytes and emits complete V2 frames.\n// Server uses two header layouts:\n// Standard: action(2)+flags(1)+eflags(1)+msg_len(4)+seq(8)\n// Envelope: action(2)+flags(1)+eflags(1)+stream_id(4)+msg_len(4)+env_seq(4)\nexport class Framer {\n private buf = Buffer.allocUnsafe(65_536)\n private pos = 0\n\n push(chunk: Buffer, onFrame: FrameCallback): void {\n this.ensureCapacity(chunk.length)\n chunk.copy(this.buf, this.pos)\n this.pos += chunk.length\n\n let offset = 0\n while (offset < this.pos) {\n if (this.pos - offset < HEADER_SIZE) break\n const action = this.buf.readUInt16LE(offset + OFF_ACTION)\n const msgLen = action === Action.RepBatch || action === Action.FanoutBatch\n ? this.buf.readUInt32LE(offset + ENVELOPE_MSG_LEN_OFF)\n : this.buf.readUInt32LE(offset + OFF_MSG_LEN)\n const frameLen = HEADER_SIZE + msgLen\n if (this.pos - offset < frameLen) break\n onFrame(Buffer.from(this.buf.subarray(offset, offset + frameLen)))\n offset += frameLen\n }\n\n if (offset > 0 && offset < this.pos) {\n this.buf.copyWithin(0, offset, this.pos)\n }\n this.pos = offset < this.pos ? this.pos - offset : 0\n }\n\n private ensureCapacity(needed: number): void {\n if (this.pos + needed <= this.buf.length) return\n const next = Buffer.allocUnsafe(Math.max(this.buf.length * 2, this.pos + needed))\n this.buf.copy(next, 0, 0, this.pos)\n this.buf = next\n }\n}\n","// Logger interface — compatible with pino's signature.\n// Pass a pino instance directly: new ArbitroClient({ logger: pino() })\n// Default (no logger provided) is fully silent — no output.\n\nexport type LogFn = {\n (msg: string): void\n (obj: object, msg: string): void\n}\n\nexport interface Logger {\n trace: LogFn\n debug: LogFn\n info: LogFn\n warn: LogFn\n error: LogFn\n child(bindings: Record<string, unknown>): Logger\n}\n\nconst noop = (() => {}) as LogFn\n\nconst NOOP: Logger = {\n trace: noop,\n debug: noop,\n info: noop,\n warn: noop,\n error: noop,\n child: () => NOOP,\n}\n\nexport function resolveLogger(logger?: Logger): Logger {\n return logger ?? NOOP\n}\n","// Cron wire frames — cold path, JSON-encoded bodies for create/delete/list;\n// fixed binary layout for CronFire (S→C) and CronAck (C→S).\n\nimport { HEADER_SIZE, Action } from '../proto/constants'\nimport { frame } from '../proto/frame'\n\n// ── CreateCron body (JSON) ─────────────────────────────────────────────────\n\nexport interface CreateCronBody {\n readonly name: string\n readonly every: string\n readonly tz?: string | undefined\n readonly timeout_ms: number\n readonly overlap: boolean\n}\n\nexport function packCreateCron(seq: bigint, body: CreateCronBody): Buffer {\n const json = Buffer.from(JSON.stringify(body), 'utf8')\n const buf = frame(Action.CreateCron, seq, json.length)\n json.copy(buf, HEADER_SIZE)\n return buf\n}\n\n// ── DeleteCron (body = name bytes) ─────────────────────────────────────────\n\nexport function packDeleteCron(seq: bigint, name: Buffer): Buffer {\n const buf = frame(Action.DeleteCron, seq, name.length)\n name.copy(buf, HEADER_SIZE)\n return buf\n}\n\n// ── ListCrons (no body) ────────────────────────────────────────────────────\n\nexport function packListCrons(seq: bigint): Buffer {\n return frame(Action.ListCrons, seq, 0)\n}\n\n// ── CronFire decode (S→C) ──────────────────────────────────────────────────\n// Body: [2 name_len LE][8 fire_time_ms LE][8 fire_count LE][name bytes]\n\nconst CRON_FIRE_FIXED = 2 + 8 + 8 // 18 bytes before name\n\nexport interface CronFireView {\n readonly name: string\n readonly fireTimeMs: bigint\n readonly fireCount: bigint\n}\n\nexport function decodeCronFire(body: Buffer): CronFireView | undefined {\n if (body.length < CRON_FIRE_FIXED) return undefined\n const nameLen = body.readUInt16LE(0)\n if (body.length < CRON_FIRE_FIXED + nameLen) return undefined\n const fireTimeMs = body.readBigUInt64LE(2)\n const fireCount = body.readBigUInt64LE(10)\n const name = body.subarray(18, 18 + nameLen).toString()\n return { name, fireTimeMs, fireCount }\n}\n\n// ── CronAck encode (C→S) ───────────────────────────────────────────────────\n// Body: [2 name_len LE][1 status (0=ok, 1=error)][name bytes]\n\nexport function packCronAck(\n seq: bigint, name: Buffer, ok: boolean,\n): Buffer {\n const bodyLen = 3 + name.length\n const buf = frame(Action.CronAck, seq, bodyLen)\n buf.writeUInt16LE(name.length, HEADER_SIZE)\n buf[HEADER_SIZE + 2] = ok ? 0 : 1\n name.copy(buf, HEADER_SIZE + 3)\n return buf\n}\n","import type { ArbitroClient } from '../client/client'\nimport type { ConsumerConfig, SubscribeOptions } from '../types/config'\nimport type { Subscription } from '../subscription/subscription'\nimport type { Message } from '../message/message'\nimport type { Encoding } from '../utils/codec'\nimport { makeLazyMessage, type LazyMessage } from '../topic/lazy-message'\n\ntype RawCallback = (msg: Message) => void\n\n// Consumer — thin context wrapper that carries streamName + config + consumerId.\n// No network calls at construction — only at .create() and .subscribe().\nexport class Consumer {\n constructor(\n private readonly client: ArbitroClient,\n readonly streamName: string,\n readonly config: ConsumerConfig,\n private _consumerId?: number,\n ) {}\n\n get name(): string { return this.config.name ?? this.streamName }\n get consumerId(): number | undefined { return this._consumerId }\n\n /**\n * Publish through this consumer's stream. Returns `Promise<void>` that\n * resolves on broker `RepOk`. Await to wait, or ignore for\n * fire-and-forget semantics — the caller's choice, on the same call.\n */\n publish(subject: string, data: Buffer): Promise<void> {\n return this.client.publish(this.streamName, subject, data)\n }\n\n async create(): Promise<this> {\n const result = await this.client.createConsumer(this.streamName, this.config)\n this._consumerId = result.consumerId\n return this\n }\n\n async upsert(): Promise<this> {\n const result = await this.client.upsertConsumer(this.streamName, this.config)\n this._consumerId = result.consumerId\n return this\n }\n\n async delete(): Promise<void> {\n if (this._consumerId == null) throw new Error('consumer not created')\n await this.client.deleteConsumer(this._consumerId)\n }\n\n async exists(): Promise<boolean> {\n return this.client.consumerExists(this.streamName, this.name)\n }\n\n /**\n * Live pending-ack count for this consumer (delivered, not yet acked).\n * Uses the cached consumer ID when available; otherwise looks it up\n * from `streamName + name`. Equivalent of NATS `num_ack_pending`.\n */\n async getPendings(): Promise<number> {\n if (this._consumerId != null) {\n return this.client.getPending(this._consumerId)\n }\n return this.client.getPending(this.streamName, this.name)\n }\n\n /** Tombstone a single message by seq. Returns true if found. */\n deleteMessage(seq: bigint): Promise<boolean> {\n return this.client.deleteMessage(this.streamName, seq)\n }\n\n // Raw subscribe — Message with manual ack/nack/decode.\n subscribe(cb?: RawCallback, opts?: SubscribeOptions): Promise<Subscription>\n\n // Typed subscribe — LazyMessage<T> with schema getters.\n subscribe<T extends Record<string, unknown>>(\n codec: Encoding<T>,\n cb: (msg: LazyMessage<T>) => void,\n opts?: SubscribeOptions,\n ): Promise<Subscription>\n\n subscribe<T extends Record<string, unknown>>(\n codecOrCb?: Encoding<T> | RawCallback,\n cbOrOpts?: ((msg: LazyMessage<T>) => void) | SubscribeOptions,\n opts?: SubscribeOptions,\n ): Promise<Subscription> {\n if (!codecOrCb || typeof codecOrCb === 'function') {\n return this.client.subscribe(\n this.streamName, this.config,\n codecOrCb as RawCallback | undefined,\n cbOrOpts as SubscribeOptions | undefined,\n )\n }\n const codec = codecOrCb\n const cb = cbOrOpts as (msg: LazyMessage<T>) => void\n const fields = codec.fields ?? []\n return this.client.subscribe(this.streamName, this.config, (raw) => {\n cb(makeLazyMessage(\n raw.data(), codec, fields,\n () => raw.ack(), () => raw.nack(), (ms) => raw.nackDelay(ms),\n ))\n }, opts)\n }\n}\n","import type { ArbitroClient } from '../client/client'\nimport type { StreamConfig, ConsumerConfig, DeleteStreamOpts, StreamInfo } from '../types/config'\nimport type { Encoding } from '../utils/codec'\nimport { Consumer } from '../consumer/consumer'\nimport { Topic } from '../topic/topic'\nimport { BatchPublishEntry } from '../proto/publish'\nimport type { PublishOpts } from './publish'\n\n// Stream — context object carrying name + config.\n// No network calls at construction — only at .create(), .upsert(), and .delete().\nexport class Stream {\n private _config: StreamConfig | undefined\n\n constructor(\n private readonly client: ArbitroClient,\n readonly name: string,\n config?: StreamConfig,\n ) {\n this._config = config\n }\n\n get config(): StreamConfig | undefined { return this._config }\n\n async create(config?: StreamConfig): Promise<this> {\n const cfg = config ?? this._config\n if (!cfg) throw new Error('StreamConfig required — pass to create() or constructor')\n this._config = cfg\n await this.client.createStream(this.name, cfg)\n return this\n }\n\n async upsert(config?: StreamConfig): Promise<this> {\n const cfg = config ?? this._config\n if (!cfg) throw new Error('StreamConfig required — pass to upsert() or constructor')\n this._config = cfg\n await this.client.upsertStream(this.name, cfg)\n return this\n }\n\n async delete(opts?: DeleteStreamOpts): Promise<void> {\n await this.client.deleteStream(this.name, opts)\n }\n\n async exists(): Promise<boolean> {\n return this.client.streamExists(this.name)\n }\n\n async info(): Promise<StreamInfo | null> {\n return this.client.getStreamInfo(this.name)\n }\n\n // ── Publish ─────────────────────────────────────────────────────────────\n\n /**\n * Publish to this stream. Returns a `Promise<void>` that resolves on\n * broker `RepOk`. Await it to wait for confirmation, or ignore the\n * returned promise for fire-and-forget semantics.\n *\n * Pass `opts.msgId` to opt this publish into broker-side dedup on\n * streams created with `idempotencyWindowMs > 0`. Duplicate ids\n * within the window are rejected with a `ClientError` carrying the\n * `IdempotencyDuplicate` code.\n */\n publish(subject: string, data: Buffer, opts?: PublishOpts): Promise<void> {\n return this.client.publish(this.name, subject, data, opts)\n }\n\n /** @deprecated alias for {@link publish}. */\n publishAck(subject: string, data: Buffer, opts?: PublishOpts): Promise<void> {\n return this.client.publish(this.name, subject, data, opts)\n }\n\n /** Batch publish — single V2 BatchPubFrame, ONE round-trip.\n * Resolves with `first_seq` (the N messages occupy\n * `[first_seq, first_seq + N - 1]`).\n *\n * Like {@link publish}, the call always exchanges request/response\n * with the broker; the caller decides whether to wait via `await`. */\n publishBatch(messages: BatchPublishEntry[]): Promise<bigint> {\n return this.client.publishBatch(this.name, messages)\n }\n\n request(subject: string, data: Buffer, timeoutMs?: number): Promise<Buffer> {\n return this.client.request(this.name, subject, data, timeoutMs)\n }\n\n /** Tombstone a single message by seq. Returns true if found. */\n deleteMessage(seq: bigint): Promise<boolean> {\n return this.client.deleteMessage(this.name, seq)\n }\n\n // ── Context factories ───────────────────────────────────────────────────\n\n consumer(overrides?: Partial<ConsumerConfig>): Consumer {\n const config: ConsumerConfig = {\n ...overrides,\n name: overrides?.name ?? this.name,\n filter: overrides?.filter ?? `${this.name}.>`,\n }\n return new Consumer(this.client, this.name, config)\n }\n\n topic<T extends Record<string, unknown>>(subject: string, codec: Encoding<T>): Topic<T> {\n return new Topic(this, subject, codec)\n }\n}\n","// Client-side counters. Each field is an integer accumulator updated on\n// the hot paths (publish, deliver, ack, nack). Reading is a cheap\n// `snapshot()` — useful for periodic logging / Prometheus export.\n\nexport interface ClientMetricsSnapshot {\n /** Calls to `publish` / `publishAck` / `publishBatch` entries. */\n publishesSent: number\n /** Total entries inside `publishBatch` calls (summed across batches). */\n publishBatchEntries: number\n /** `Deliver` frames received from the broker (one per message). */\n deliveriesReceived: number\n /** Currently-open subscriptions (gauge — inc at subscribe, dec at close). */\n activeSubscriptions: number\n /** `Ack` frames sent to the broker. */\n acksSent: number\n /** `Nack` frames sent to the broker. */\n nacksSent: number\n /** Successful reconnections after a session drop. */\n reconnects: number\n /** Outstanding pending request-reply slots (gauge). */\n pendingReplies: number\n}\n\n/**\n * Live atomic-ish counters. JavaScript is single-threaded per worker so\n * plain `++` is sufficient — no `Atomics` needed.\n *\n * Held on `ArbitroClient` and shared with `Connection` so the demux loop\n * can bump `deliveriesReceived` directly. Public `snapshot()` returns a\n * frozen copy for logging or external scraping.\n */\nexport class ClientMetrics {\n publishesSent = 0\n publishBatchEntries = 0\n deliveriesReceived = 0\n activeSubscriptions = 0\n acksSent = 0\n nacksSent = 0\n reconnects = 0\n pendingReplies = 0\n\n snapshot(): ClientMetricsSnapshot {\n return {\n publishesSent: this.publishesSent,\n publishBatchEntries: this.publishBatchEntries,\n deliveriesReceived: this.deliveriesReceived,\n activeSubscriptions: this.activeSubscriptions,\n acksSent: this.acksSent,\n nacksSent: this.nacksSent,\n reconnects: this.reconnects,\n pendingReplies: this.pendingReplies,\n }\n }\n}\n","import { packPublish, packPublishBatch, packPublishWithReply } from '../proto/v2'\nimport { Flag } from '../proto/constants'\nimport type { Connection } from '../net/connection'\nimport { BatchPublishEntry } from '../proto/publish'\n\nconst EMPTY = Buffer.alloc(0)\n\n/**\n * Optional per-publish options.\n *\n * `msgId` is an opaque byte string the broker uses for dedup when the\n * target stream was created with `idempotencyWindowMs > 0`. Empty or\n * undefined means \"no dedup for this publish\" — safe to omit on\n * non-idempotent streams.\n */\nexport interface PublishOpts {\n msgId?: Buffer | string\n}\n\nfunction toMsgIdBuf(id: PublishOpts['msgId']): Buffer {\n if (id == null) return EMPTY\n return typeof id === 'string' ? Buffer.from(id) : id\n}\n\n/** Fire-and-forget publish. Caller provides pre-resolved stream_id. */\nexport function streamPublish(\n conn: Connection, sid: number, subject: string, data: Buffer,\n opts?: PublishOpts,\n): void {\n const subj = Buffer.from(subject)\n conn.send(packPublish(conn.nextSeq(), sid, subj, data, 0, 0, toMsgIdBuf(opts?.msgId)))\n}\n\n/** Publish + wait for server RepOk confirmation. */\nexport async function streamPublishAck(\n conn: Connection, sid: number, subject: string, data: Buffer,\n opts?: PublishOpts,\n): Promise<void> {\n const subj = Buffer.from(subject)\n await conn.sendExpectReply(\n packPublish(conn.nextSeq(), sid, subj, data, Flag.AckReq, 0, toMsgIdBuf(opts?.msgId)),\n )\n}\n\n/** Batch publish — single V2 BatchPubFrame, one write syscall, ONE\n * RTT to the broker.\n *\n * Returns a `Promise<bigint>` that resolves to `first_seq`: the\n * sequence of the first message in the batch. The N messages occupy\n * `[first_seq, first_seq + N - 1]` in the stream.\n *\n * Like `publishAck`, the call always waits for the broker's RepOk at\n * the promise level — the caller decides whether to actually wait by\n * using `await` or letting the promise float:\n *\n * await client.publishBatch(stream, msgs) // barrier — broker has all N\n * client.publishBatch(stream, msgs) // fire-and-forget at caller\n * client.publishBatch(stream, msgs) // (promise is dropped, rep ok ignored)\n * .catch(() => {}) // suppress unhandled rejection\n *\n * This mirrors the design of `publish` / `publishAck`: the function\n * always speaks the full request/response to the broker; await is the\n * caller's contract decision, not the API's. */\nexport async function streamPublishBatch(\n conn: Connection, sid: number, messages: BatchPublishEntry[],\n): Promise<bigint> {\n // `sendExpectReply` decodes the RepOk body (u64 LE) which the broker\n // fills with `first_seq` for PublishBatch.\n return await conn.sendExpectReply(\n packPublishBatch(conn.nextSeq(), sid, messages),\n )\n}\n\n/** Request-reply through a stream. Uses V2 PublishWithReply. */\nexport async function streamRequest(\n conn: Connection, sid: number, subject: string, data: Buffer, timeoutMs: number,\n): Promise<Buffer> {\n const subj = Buffer.from(subject)\n const replyTo = Buffer.from(`_INBOX.${conn.nextSeq().toString(36)}`)\n const frame = packPublishWithReply(\n conn.nextSeq(), sid, subj, replyTo, data, Flag.AckReq,\n )\n await conn.sendExpectReply(frame, timeoutMs)\n // reply is ref_seq from RepOk — actual reply routing handled differently in V2.\n // For now, return empty buffer — request-reply semantics need server support.\n return Buffer.alloc(0)\n}\n","// Fluent builder for cron job registration + handle for lifecycle.\n\nimport type { Connection } from '../net/connection'\nimport type { CronState, CronHandler, CronContext } from './cron-state'\nimport { packCreateCron, packDeleteCron, type CreateCronBody } from './cron-frame'\n\n// ── CronBuilder ────────────────────────────────────────────────────────────\n\nexport class CronBuilder {\n private expr: string | undefined\n private timezone: string | undefined\n private timeoutMs = 30_000\n private allowOverlap = false\n\n constructor(\n private readonly conn: Connection,\n private readonly cronState: CronState,\n private readonly cronName: string,\n ) {}\n\n every(expression: string): this {\n this.expr = expression\n return this\n }\n\n tz(timezone: string): this {\n this.timezone = timezone\n return this\n }\n\n timeout(ms: number): this {\n this.timeoutMs = ms\n return this\n }\n\n overlap(allow: boolean): this {\n this.allowOverlap = allow\n return this\n }\n\n async run(handler: CronHandler): Promise<CronHandle> {\n if (!this.expr) throw new Error('cron expression required — call .every()')\n\n const body: CreateCronBody = {\n name: this.cronName,\n every: this.expr,\n tz: this.timezone,\n timeout_ms: this.timeoutMs,\n overlap: this.allowOverlap,\n }\n\n const seq = this.conn.nextSeq()\n await this.conn.sendExpectReply(packCreateCron(seq, body))\n this.cronState.register(this.cronName, body, handler)\n\n return new CronHandle(this.conn, this.cronState, this.cronName)\n }\n}\n\n// ── CronHandle ─────────────────────────────────────────────────────────────\n\nexport class CronHandle {\n constructor(\n private readonly conn: Connection,\n private readonly cronState: CronState,\n private readonly cronName: string,\n ) {}\n\n get name(): string { return this.cronName }\n\n async stop(): Promise<void> {\n const nameBuf = Buffer.from(this.cronName)\n const seq = this.conn.nextSeq()\n await this.conn.sendExpectReply(packDeleteCron(seq, nameBuf))\n this.cronState.remove(this.cronName)\n }\n}\n","// Shared registry of active cron handlers. Keyed by cron name.\n\nimport type { CreateCronBody } from './cron-frame'\n\nexport type CronHandler = (ctx: CronContext) => Promise<void>\n\n/** Context passed to the cron handler on each fire. */\nexport interface CronContext {\n /** Cron job name. */\n readonly name: string\n /** UTC timestamp (ms since epoch) when the broker intended this fire. */\n readonly fireTime: bigint\n /** Monotonic fire counter (1-based). */\n readonly fireCount: bigint\n}\n\ninterface CronEntry {\n handler: CronHandler\n config: CreateCronBody\n}\n\nexport class CronState {\n private readonly handlers = new Map<string, CronEntry>()\n\n register(name: string, config: CreateCronBody, handler: CronHandler): void {\n this.handlers.set(name, { handler, config })\n }\n\n remove(name: string): void {\n this.handlers.delete(name)\n }\n\n getHandler(name: string): CronHandler | undefined {\n return this.handlers.get(name)?.handler\n }\n\n allConfigs(): ReadonlyArray<{ name: string; config: CreateCronBody }> {\n const out: Array<{ name: string; config: CreateCronBody }> = []\n for (const [name, entry] of this.handlers) {\n out.push({ name, config: entry.config })\n }\n return out\n }\n}\n","import { Connection } from '../net/connection'\nimport { Subscription } from '../subscription/subscription'\nimport { ArbitroError } from '../types/error'\nimport { Stream } from '../stream/stream'\nimport { Consumer } from '../consumer/consumer'\nimport { ClientMetrics, type ClientMetricsSnapshot } from './metrics'\nimport { streamPublish, streamPublishAck, streamPublishBatch, streamRequest } from '../stream/publish'\nimport {\n packPublish, packCreateStream, packDeleteStream, packGetStream,\n packPurgeStream, packDrainSubject, packDeleteMessage, packListStreams,\n packCreateConsumer, packDeleteConsumer, packGetConsumer, packListConsumers,\n packConsumerStats,\n type CreateConsumerOpts,\n} from '../proto/v2'\nimport { Flag, HEADER_SIZE } from '../proto/constants'\nimport type {\n ClientConfig, StreamConfig, ConsumerConfig, SubscribeOptions,\n DeleteStreamOpts, StreamInfo, ConsumerInfo,\n} from '../types/config'\nimport { AckPolicy, DeliverPolicy, JournalType } from '../types/config'\nimport { Message } from '../message/message'\nimport { BatchPublishEntry } from '../proto/publish'\nimport { CronBuilder } from '../cron/cron-builder'\nimport { CronState } from '../cron/cron-state'\n\ntype MsgCallback = (msg: Message) => void\n\nconst DEFAULT_CONFIG: Required<Omit<ClientConfig, 'tls' | 'logger'>> = {\n servers: ['127.0.0.1:9898'],\n prefix: '',\n timeout: 5_000,\n reconnect: { enabled: true, maxAttempts: 10, intervalMs: 500, jitter: true },\n}\n\nexport class ArbitroClient {\n private conn!: Connection\n private readonly cfg: typeof DEFAULT_CONFIG\n private readonly tls: ClientConfig['tls']\n private readonly logger: ClientConfig['logger']\n private readonly sidCache = new Map<string, number>()\n private readonly _metrics = new ClientMetrics()\n private readonly _cronState = new CronState()\n\n constructor(config: ClientConfig) {\n this.cfg = { ...DEFAULT_CONFIG, ...config }\n this.tls = config.tls\n this.logger = config.logger\n }\n\n async connect(): Promise<this> {\n const addr = this.cfg.servers[0]\n if (!addr) throw new ArbitroError('no servers configured', 'connect')\n this.conn = await Connection.connect(\n addr, this.cfg.timeout, this.tls, this.cfg.reconnect, this.logger,\n )\n this.conn.setMetrics(this._metrics)\n this.conn.setCronState(this._cronState)\n return this\n }\n\n /**\n * Point-in-time snapshot of client counters: publishes sent, deliveries\n * received, acks/nacks, active subscriptions, reconnects. Cheap — just\n * reads plain integer fields. Call on a timer to chart throughput.\n */\n metrics(): ClientMetricsSnapshot { return this._metrics.snapshot() }\n\n /** Internal connection accessor for Stream/Consumer publish methods. */\n _conn(): Connection { return this.conn }\n\n /** Default timeout from config. */\n get timeout(): number { return this.cfg.timeout }\n\n // ── Publish (direct to stream via V2 PubFrame) ────────────────────────────\n\n /** Apply prefix to subject if configured. */\n private prefixed(subject: string): string {\n return this.cfg.prefix ? `${this.cfg.prefix}.${subject}` : subject\n }\n\n /**\n * Publish a message. Returns a `Promise<void>` that resolves once the\n * broker confirms receipt (`RepOk`). The TS idiom is \"everything async,\n * the caller chooses to await\":\n *\n * await client.publish(s, subj, data) // wait for ack\n * client.publish(s, subj, data) // fire-and-forget\n * client.publish(s, subj, data).catch(handleError) // async error path\n *\n * The broker always emits `RepOk` regardless of whether the caller\n * awaits — that's what enables the same call site to support both\n * semantics. A \"no-reply\" path doesn't save wire bytes, so it isn't\n * exposed.\n */\n async publish(\n streamName: string, subject: string, data: Buffer,\n opts?: import('../stream/publish').PublishOpts,\n ): Promise<void> {\n const sid = await this.resolveStreamId(streamName)\n await streamPublishAck(this.conn, sid, this.prefixed(subject), data, opts)\n this._metrics.publishesSent++\n }\n\n /**\n * @deprecated alias for {@link publish}. The default `publish` already\n * waits for `RepOk` and returns a Promise, so this method is identical.\n */\n publishAck(\n streamName: string, subject: string, data: Buffer,\n opts?: import('../stream/publish').PublishOpts,\n ): Promise<void> {\n return this.publish(streamName, subject, data, opts)\n }\n\n /** Batch publish — single V2 BatchPubFrame, ONE round-trip. Resolves\n * to `first_seq` (sequence of the first message in the batch; the N\n * messages occupy `[first_seq, first_seq + N - 1]`).\n *\n * Mirrors `publish`: the call always exchanges request/response with\n * the broker. The caller decides whether to actually wait:\n *\n * await client.publishBatch(stream, msgs) // barrier\n * client.publishBatch(stream, msgs) // fire-and-forget (promise dropped)\n * client.publishBatch(stream, msgs) // (suppress unhandled rejection)\n * .catch(() => {})\n *\n * Each entry may carry an optional `msgId` for broker-side dedup on\n * streams created with `idempotencyWindowMs > 0`. If any entry\n * collides with a previously-stored id (or another entry in the\n * SAME batch), the whole batch is rejected — `publishBatch` is\n * atomic.\n */\n publishBatch(streamName: string, messages: BatchPublishEntry[]): Promise<bigint> {\n const sid = this.cachedSid(streamName)\n const prefixedMsgs: BatchPublishEntry[] = this.cfg.prefix\n ? messages.map((m): BatchPublishEntry => {\n const entry: BatchPublishEntry = {\n subject: this.prefixed(m.subject),\n payload: m.payload,\n }\n if (m.msgId !== undefined) entry.msgId = m.msgId\n return entry\n })\n : messages\n this._metrics.publishBatchEntries += messages.length\n return streamPublishBatch(this.conn, sid, prefixedMsgs)\n }\n\n /** Request-reply. */\n async request(streamName: string, subject: string, data: Buffer, timeoutMs = this.cfg.timeout): Promise<Buffer> {\n const sid = await this.resolveStreamId(streamName)\n return streamRequest(this.conn, sid, subject, data, timeoutMs)\n }\n\n /**\n * Publish a message with a delivery delay. The broker parks the message\n * in its delayed journal and delivers it to consumers after `delayMs`\n * milliseconds. Returns a Promise that resolves once the broker confirms\n * receipt.\n */\n async publishDelayed(\n streamName: string, subject: string, data: Buffer, delayMs: number,\n ): Promise<void> {\n const sid = await this.resolveStreamId(streamName)\n const { packPublishDelayed } = await import('../proto/publish')\n const { Flag } = await import('../proto/constants')\n const subj = Buffer.from(this.prefixed(subject))\n await this.conn.sendExpectReply(\n packPublishDelayed(this.conn.nextSeq(), sid, subj, data, BigInt(delayMs), Flag.AckReq),\n )\n this._metrics.publishesSent++\n }\n\n // ── Subscribe ─────────────────────────────────────────────────────────────\n\n /** Subscribe with explicit consumer config. */\n subscribe(streamName: string, config: ConsumerConfig, callback?: MsgCallback, opts?: SubscribeOptions): Promise<Subscription>\n /** Subscribe by consumer name only (consumer must already exist). */\n subscribe(streamName: string, callback: MsgCallback): Promise<Subscription>\n\n async subscribe(\n streamName: string,\n configOrCb: ConsumerConfig | MsgCallback,\n callbackOrOpts?: MsgCallback | SubscribeOptions,\n opts?: SubscribeOptions,\n ): Promise<Subscription> {\n let config: ConsumerConfig\n let callback: MsgCallback | undefined\n let subOpts: SubscribeOptions | undefined\n\n if (typeof configOrCb === 'function') {\n config = { name: streamName, filter: '' }\n callback = configOrCb\n subOpts = undefined\n } else {\n config = configOrCb\n callback = typeof callbackOrOpts === 'function' ? callbackOrOpts : undefined\n subOpts = typeof callbackOrOpts === 'object' ? callbackOrOpts : opts\n }\n\n const consumerId = await this.ensureConsumer(streamName, config)\n const filter = Buffer.from(config.filter ?? '')\n const sub = new Subscription(consumerId, this.conn, streamName, subOpts?.fetchTimeoutMs ?? 5_000)\n const handler = (frame: Buffer) => sub.deliver(frame)\n\n await this.conn.sendSubscribeV2(consumerId, filter, handler)\n this._metrics.activeSubscriptions++\n // Best-effort gauge decrement when caller closes the subscription.\n const origClose = sub.close.bind(sub)\n sub.close = () => {\n if (this._metrics.activeSubscriptions > 0) this._metrics.activeSubscriptions--\n return origClose()\n }\n if (callback) sub.onMessage(callback)\n return sub\n }\n\n // ── Stream management ─────────────────────────────────────────────────────\n\n async createStream(name: string, config: StreamConfig): Promise<Stream> {\n const nameBuf = Buffer.from(name)\n const filterBuf = Buffer.from(config.subjectFilter ?? '')\n const maxMsgs = BigInt(config.maxMsgs ?? 0)\n const maxBytes = BigInt(config.maxBytes ?? 0)\n const maxAgeSecs = BigInt(config.maxAgeMs ? Math.ceil(config.maxAgeMs / 1000) : 0)\n const journalKind = journalTypeToU8(config.journal?.type)\n\n await this.conn.sendExpectReply(packCreateStream(\n this.conn.nextSeq(), nameBuf, filterBuf,\n maxMsgs, maxBytes, maxAgeSecs,\n 1, journalKind, 0, 0,\n config.idempotencyWindowMs ?? 0,\n ))\n await this.resolveStreamId(name)\n return new Stream(this, name, config)\n }\n\n async upsertStream(name: string, config: StreamConfig): Promise<Stream> {\n try {\n return await this.createStream(name, config)\n } catch (e: any) {\n if (e?.message?.includes('code=')) {\n await this.resolveStreamId(name)\n return new Stream(this, name, config)\n }\n throw e\n }\n }\n\n async deleteStream(name: string, _opts?: DeleteStreamOpts): Promise<void> {\n await this.conn.sendExpectReply(\n packDeleteStream(this.conn.nextSeq(), Buffer.from(name)),\n )\n this.sidCache.delete(name)\n }\n\n async getStreamInfo(name: string): Promise<StreamInfo | null> {\n try {\n const refSeq = await this.conn.sendExpectReply(\n packGetStream(this.conn.nextSeq(), Buffer.from(name)),\n )\n this.sidCache.set(name, Number(refSeq & 0xFFFFFFFFn))\n return { name, config: { subjectFilter: '' }, lastSeq: Number(refSeq) }\n } catch {\n return null\n }\n }\n\n async listStreams(): Promise<StreamInfo[]> {\n const raw = await this.conn.sendExpectReplyRaw(\n packListStreams(this.conn.nextSeq()),\n )\n return parseListStreamsReply(raw)\n }\n\n async streamExists(name: string): Promise<boolean> {\n return (await this.getStreamInfo(name)) !== null\n }\n\n async purgeStream(name: string): Promise<number> {\n const refSeq = await this.conn.sendExpectReply(\n packPurgeStream(this.conn.nextSeq(), Buffer.from(name)),\n )\n return Number(refSeq)\n }\n\n async drainSubject(streamName: string, subject: string): Promise<number> {\n const refSeq = await this.conn.sendExpectReply(\n packDrainSubject(this.conn.nextSeq(), Buffer.from(streamName), Buffer.from(subject)),\n )\n return Number(refSeq)\n }\n\n /**\n * Tombstone a single message by sequence number.\n *\n * The broker marks the entry as deleted — it will never be delivered\n * to any consumer. Returns `true` if the message was found and\n * tombstoned, `false` if not found or already tombstoned.\n */\n async deleteMessage(streamName: string, seq: bigint): Promise<boolean> {\n const refSeq = await this.conn.sendExpectReply(\n packDeleteMessage(this.conn.nextSeq(), Buffer.from(streamName), seq),\n )\n return refSeq > 0n\n }\n\n // ── Consumer management ───────────────────────────────────────────────────\n\n async createConsumer(streamName: string, config: ConsumerConfig): Promise<Consumer> {\n const consumerId = await this.createConsumerRaw(streamName, config)\n return new Consumer(this, streamName, config, consumerId)\n }\n\n private async createConsumerRaw(streamName: string, config: ConsumerConfig): Promise<number> {\n const sid = await this.resolveStreamId(streamName)\n const name = Buffer.from(config.name ?? streamName)\n const group = Buffer.from(config.group ?? config.name ?? streamName)\n const filter = Buffer.from(config.filter ?? '')\n\n const ackPolicyByte = config.ackPolicy === AckPolicy.None ? 0 : 1\n const opts: CreateConsumerOpts = {\n streamId: sid,\n name,\n group,\n filter,\n maxInflight: config.maxAckPending ?? 0,\n ackPolicy: ackPolicyByte,\n deliverPolicy: deliverPolicyToU8(config.deliverPolicy),\n deliverMode: config.fanout ? 0 : 1,\n ackWaitMs: config.ackWaitMs ?? 0,\n startSeq: BigInt(config.startSeq ?? 0),\n }\n // Per-subject inflight is only enforced with Explicit ack — drop\n // the list silently for fire-and-forget consumers so they round-trip\n // cleanly through the server (which rejects the pairing).\n if (ackPolicyByte === 1 && config.maxSubjectInflights?.length) {\n opts.subjectLimits = config.maxSubjectInflights.map(l => ({\n pattern: Buffer.from(l.pattern),\n limit: l.limit >>> 0, // u32\n }))\n }\n\n const refSeq = await this.conn.sendExpectReply(\n packCreateConsumer(this.conn.nextSeq(), opts),\n )\n return Number(refSeq)\n }\n\n async upsertConsumer(streamName: string, config: ConsumerConfig): Promise<Consumer> {\n try {\n return await this.createConsumer(streamName, config)\n } catch (e: any) {\n // If already exists, get its ID\n const consumerId = await this.getConsumerId(streamName, config.name ?? streamName)\n if (consumerId !== null) return new Consumer(this, streamName, config, consumerId)\n throw e\n }\n }\n\n /** Delete consumer by server-assigned ID. */\n deleteConsumer(consumerId: number): Promise<void>\n /** Delete consumer by stream + name (lookup ID first). */\n deleteConsumer(streamName: string, name: string): Promise<void>\n\n async deleteConsumer(idOrStream: number | string, name?: string): Promise<void> {\n let consumerId: number\n if (typeof idOrStream === 'number') {\n consumerId = idOrStream\n } else {\n const id = await this.getConsumerId(idOrStream, name!)\n if (id === null) return // already deleted\n consumerId = id\n }\n await this.conn.sendExpectReply(\n packDeleteConsumer(this.conn.nextSeq(), consumerId),\n )\n }\n\n async getConsumerId(streamName: string, name: string): Promise<number | null> {\n try {\n const sid = await this.resolveStreamId(streamName)\n const refSeq = await this.conn.sendExpectReply(\n packGetConsumer(this.conn.nextSeq(), sid, Buffer.from(name)),\n )\n return Number(refSeq)\n } catch {\n return null\n }\n }\n\n async consumerExists(streamName: string, name: string): Promise<boolean> {\n return (await this.getConsumerId(streamName, name)) !== null\n }\n\n /**\n * Live pending-ack count for one consumer — the number of messages the\n * consumer has been delivered but not yet acked. Equivalent of NATS\n * JetStream's `num_ack_pending`. Single broker round-trip; engine cost\n * is one O(1) Vec read per shard.\n */\n getPending(consumerId: number): Promise<number>\n getPending(streamName: string, name: string): Promise<number>\n async getPending(idOrStream: number | string, name?: string): Promise<number> {\n let consumerId: number\n if (typeof idOrStream === 'number') {\n consumerId = idOrStream\n } else {\n const id = await this.getConsumerId(idOrStream, name!)\n if (id === null) return 0\n consumerId = id\n }\n const refSeq = await this.conn.sendExpectReply(\n packConsumerStats(this.conn.nextSeq(), consumerId),\n )\n return Number(refSeq)\n }\n\n async getConsumerInfo(streamName: string, name: string): Promise<ConsumerInfo | null> {\n const id = await this.getConsumerId(streamName, name)\n if (id === null) return null\n return { group: name, stream: streamName, config: { name } }\n }\n\n async listConsumers(streamName?: string): Promise<ConsumerInfo[]> {\n const sid = streamName ? await this.resolveStreamId(streamName) : 0\n const raw = await this.conn.sendExpectReplyRaw(\n packListConsumers(this.conn.nextSeq(), sid),\n )\n return parseListConsumersReply(raw)\n }\n\n // ── Internal helpers ──────────────────────────────────────────────────────\n\n /** Resolve stream name → server wire_hash_32. Caches the result. */\n private async resolveStreamId(name: string): Promise<number> {\n const cached = this.sidCache.get(name)\n if (cached !== undefined) return cached\n const refSeq = await this.conn.sendExpectReply(\n packGetStream(this.conn.nextSeq(), Buffer.from(name)),\n )\n const sid = Number(refSeq & 0xFFFFFFFFn)\n this.sidCache.set(name, sid)\n return sid\n }\n\n /** Get cached stream_id or throw (for sync fire-and-forget paths). */\n private cachedSid(name: string): number {\n const sid = this.sidCache.get(name)\n if (sid === undefined) {\n throw new ArbitroError(\n `stream \"${name}\" not resolved — call createStream/getStreamInfo first`,\n 'protocol',\n )\n }\n return sid\n }\n\n private async ensureConsumer(streamName: string, config: ConsumerConfig): Promise<number> {\n const name = config.name ?? streamName\n const existing = await this.getConsumerId(streamName, name)\n if (existing !== null) return existing\n return this.createConsumerRaw(streamName, config)\n }\n\n // ── Domain helpers ────────────────────────────────────────────────────────\n\n /** Pre-resolve stream_id from server (GetStream). Required before sync publish(). */\n async resolveStream(name: string): Promise<void> {\n await this.resolveStreamId(name)\n }\n\n stream(name: string, config?: StreamConfig): Stream {\n return new Stream(this, name, config)\n }\n\n // ── Cron ──────────────────────────────────────────────────────────────────\n\n /** Start building a cron job. Call `.every()` then `.run()` to register. */\n cron(name: string): CronBuilder {\n return new CronBuilder(this.conn, this._cronState, name)\n }\n\n // ── Lifecycle ─────────────────────────────────────────────────────────────\n\n async close(): Promise<void> {\n await this.conn.close()\n }\n}\n\n// ── Reply parsers ──────────────────────────────────────────────────────────\n\nfunction parseListStreamsReply(frame: Buffer): StreamInfo[] {\n // Header(16) + count(4) + entries[wire_id(4) + name_len(2) + name]\n if (frame.length < HEADER_SIZE + 4) return []\n const count = frame.readUInt32LE(HEADER_SIZE)\n const results: StreamInfo[] = []\n let off = HEADER_SIZE + 4\n for (let i = 0; i < count; i++) {\n if (off + 6 > frame.length) break\n const wireId = frame.readUInt32LE(off)\n const nameLen = frame.readUInt16LE(off + 4)\n off += 6\n const name = frame.subarray(off, off + nameLen).toString()\n off += nameLen\n results.push({ name, config: { subjectFilter: '' }, lastSeq: wireId })\n }\n return results\n}\n\nfunction parseListConsumersReply(frame: Buffer): ConsumerInfo[] {\n // Header(16) + count(4) + entries[consumer_id(4) + stream_id(4) + queue_id(4) + paused(1)]\n if (frame.length < HEADER_SIZE + 4) return []\n const count = frame.readUInt32LE(HEADER_SIZE)\n const results: ConsumerInfo[] = []\n let off = HEADER_SIZE + 4\n for (let i = 0; i < count; i++) {\n if (off + 13 > frame.length) break\n const consumerId = frame.readUInt32LE(off)\n const _streamId = frame.readUInt32LE(off + 4)\n const _queueId = frame.readUInt32LE(off + 8)\n const _paused = frame[off + 12]\n off += 13\n results.push({\n group: consumerId.toString(),\n stream: '',\n config: { name: consumerId.toString() },\n })\n }\n return results\n}\n\nfunction deliverPolicyToU8(policy?: DeliverPolicy): number {\n switch (policy) {\n case DeliverPolicy.All: return 0\n case DeliverPolicy.New: return 1\n case DeliverPolicy.BySeq: return 2\n case DeliverPolicy.ByTime: return 3\n default: return 0\n }\n}\n\nfunction journalTypeToU8(type?: JournalType): number {\n switch (type) {\n case JournalType.Memory: return 0\n case JournalType.Tolerant: return 1\n case JournalType.Strict: return 2\n default: return 0\n }\n}\n","// FNV-1a 32-bit hash — utility export. NOT used for server stream_id\n// resolution (server uses foldhash). Kept for subject hashing and user code.\n\nexport function streamId(name: Buffer | string): number {\n const buf = typeof name === 'string' ? Buffer.from(name) : name\n let h = 0x811c_9dc5\n for (let i = 0; i < buf.length; i++) {\n h ^= buf[i]!\n h = Math.imul(h, 0x0100_0193) >>> 0\n }\n return h >>> 0\n}\n","// Task payload encoding/decoding for workflow step messages.\n// Format: [instance_id:4 LE][step_index:2 LE][attempt:1][context...]\n\n/** Header size: 4 (instanceId) + 2 (stepIndex) + 1 (attempt) = 7 bytes. */\nexport const TASK_HEADER = 7\n\n/** Bit flag set on stepIndex to mark compensation tasks. */\nexport const COMPENSATION_BIT = 0x8000\n\nexport interface DecodedTask {\n readonly instanceId: number\n readonly stepIndex: number\n readonly attempt: number\n readonly context: Buffer\n}\n\nexport function encodeTask(\n instanceId: number, stepIndex: number, attempt: number, context: Buffer,\n): Buffer {\n const buf = Buffer.allocUnsafe(TASK_HEADER + context.length)\n buf.writeUInt32LE(instanceId, 0)\n buf.writeUInt16LE(stepIndex, 4)\n buf[6] = attempt\n context.copy(buf, TASK_HEADER)\n return buf\n}\n\nexport function decodeTask(payload: Buffer): DecodedTask | undefined {\n if (payload.length < TASK_HEADER) return undefined\n return {\n instanceId: payload.readUInt32LE(0),\n stepIndex: payload.readUInt16LE(4),\n attempt: payload[6]!,\n context: payload.subarray(TASK_HEADER),\n }\n}\n","// WorkflowHandle — returned by WorkflowBuilder.start().\n\nimport type { ArbitroClient } from '../client/client'\nimport { encodeTask } from './task'\n\nlet nextInstanceId = 1\n\n/** Generate a process-unique instance ID. */\nexport function allocInstanceId(): number { return nextInstanceId++ }\n\nexport class WorkflowHandle {\n constructor(\n private readonly workflowName: string,\n private readonly taskStreamName: string,\n private readonly dlqStreamName: string,\n private readonly sub: unknown,\n private readonly triggerSub: unknown | undefined,\n ) {}\n\n get name(): string { return this.workflowName }\n get taskStream(): string { return this.taskStreamName }\n get dlqStream(): string { return this.dlqStreamName }\n\n async trigger(client: ArbitroClient, context: Buffer): Promise<number> {\n const instanceId = allocInstanceId()\n const msgId = `wf:${instanceId}:0:0`\n const subject = `_wf.${this.workflowName}.step.0`\n const task = encodeTask(instanceId, 0, 0, context)\n await client.publish(this.taskStreamName, subject, task, { msgId })\n return instanceId\n }\n}\n","// Message processing loop for workflow steps, compensation, and DLQ.\n\nimport type { ArbitroClient } from '../client/client'\nimport type { Message } from '../message/message'\nimport { encodeTask, decodeTask, COMPENSATION_BIT } from './task'\nimport type { StepHandler, StepResult } from './workflow'\n\ninterface StepDef {\n readonly handler: StepHandler\n readonly compensation: StepHandler | undefined\n}\n\nexport interface ProcessorConfig {\n readonly client: ArbitroClient\n readonly name: string\n readonly taskStreamName: string\n readonly dlqStreamName: string\n readonly steps: readonly StepDef[]\n readonly maxContextSize: number\n readonly maxRetries: number\n}\n\nexport async function processMessage(cfg: ProcessorConfig, msg: Message): Promise<void> {\n const task = decodeTask(msg.data())\n if (!task) { msg.ack(); return }\n if (task.context.length > cfg.maxContextSize) { msg.ack(); return }\n\n const isCompensation = (task.stepIndex & COMPENSATION_BIT) !== 0\n if (isCompensation) {\n await runCompensation(cfg, msg, task)\n return\n }\n if (task.stepIndex >= cfg.steps.length) { msg.ack(); return }\n await runStep(cfg, msg, task)\n}\n\n// ── Compensation ──────────────────────────────────────────────────────\n\nasync function runCompensation(\n cfg: ProcessorConfig, msg: Message,\n task: { instanceId: number; stepIndex: number; attempt: number; context: Buffer },\n): Promise<void> {\n const idx = task.stepIndex & ~COMPENSATION_BIT\n const comp = cfg.steps[idx]?.compensation\n if (comp) {\n try {\n await comp({ name: cfg.name, instanceId: task.instanceId, stepIndex: idx, attempt: task.attempt, context: task.context })\n } catch { /* best-effort */ }\n }\n msg.ack()\n}\n\n// ── Normal step ───────────────────────────────────────────────────────\n\nasync function runStep(\n cfg: ProcessorConfig, msg: Message,\n task: { instanceId: number; stepIndex: number; attempt: number; context: Buffer },\n): Promise<void> {\n const handler = cfg.steps[task.stepIndex]!.handler\n try {\n const result = await handler({\n name: cfg.name, instanceId: task.instanceId,\n stepIndex: task.stepIndex, attempt: task.attempt, context: task.context,\n })\n if (result.context.length > cfg.maxContextSize) { msg.nack(); return }\n await advance(cfg, msg, task, result)\n } catch (err) {\n await onFailure(cfg, msg, task, err)\n }\n}\n\nasync function advance(\n cfg: ProcessorConfig, msg: Message,\n task: { instanceId: number; stepIndex: number }, result: StepResult,\n): Promise<void> {\n const nextStep = task.stepIndex + 1\n if (nextStep < cfg.steps.length) {\n const msgId = `wf:${task.instanceId}:${nextStep}:0`\n const subject = `_wf.${cfg.name}.step.${nextStep}`\n const buf = encodeTask(task.instanceId, nextStep, 0, result.context)\n await cfg.client.publish(cfg.taskStreamName, subject, buf, { msgId })\n }\n msg.ack()\n}\n\n// ── Failure → DLQ + compensation chain ────────────────────────────────\n\nasync function onFailure(\n cfg: ProcessorConfig, msg: Message,\n task: { instanceId: number; stepIndex: number; attempt: number; context: Buffer },\n err: unknown,\n): Promise<void> {\n if (task.attempt >= cfg.maxRetries) {\n await publishDlq(cfg, task, err)\n await publishCompensations(cfg, task)\n msg.ack()\n } else {\n msg.nack()\n }\n}\n\nasync function publishDlq(\n cfg: ProcessorConfig,\n task: { instanceId: number; stepIndex: number; attempt: number; context: Buffer },\n err: unknown,\n): Promise<void> {\n const dlqSubject = `_wf.${cfg.name}.dlq.${task.stepIndex}`\n const errBytes = Buffer.from(String(err))\n const buf = Buffer.allocUnsafe(7 + 4 + errBytes.length + task.context.length)\n buf.writeUInt32LE(task.instanceId, 0)\n buf.writeUInt16LE(task.stepIndex, 4)\n buf[6] = task.attempt\n buf.writeUInt32LE(errBytes.length, 7)\n errBytes.copy(buf, 11)\n task.context.copy(buf, 11 + errBytes.length)\n const msgId = `wf:${task.instanceId}:dlq:${task.stepIndex}`\n await cfg.client.publish(cfg.dlqStreamName, dlqSubject, buf, { msgId }).catch(() => {})\n}\n\nasync function publishCompensations(\n cfg: ProcessorConfig,\n task: { instanceId: number; stepIndex: number; context: Buffer },\n): Promise<void> {\n for (let i = task.stepIndex - 1; i >= 0; i--) {\n const compStep = COMPENSATION_BIT | i\n const subject = `_wf.${cfg.name}.compensate.${i}`\n const buf = encodeTask(task.instanceId, compStep, 0, task.context)\n const msgId = `wf:${task.instanceId}:comp:${i}`\n await cfg.client.publish(cfg.taskStreamName, subject, buf, { msgId }).catch(() => {})\n }\n}\n","// WorkflowBuilder — fluent builder for linear step pipelines.\n// Mirrors the Rust WorkflowBuilder: trigger streams, saga compensation,\n// max retries with DLQ, context size limits, unique consumer per worker.\n\nimport type { ArbitroClient } from '../client/client'\nimport type { Message } from '../message/message'\nimport { AckPolicy } from '../types/config'\nimport { encodeTask } from './task'\nimport { WorkflowHandle, allocInstanceId } from './handle'\nimport { processMessage, type ProcessorConfig } from './processor'\n\n// ── Types ─────────────────────────────────────────────────────────────────\n\nexport interface StepContext {\n readonly name: string\n readonly instanceId: number\n readonly stepIndex: number\n readonly attempt: number\n readonly context: Buffer\n}\n\nexport interface StepResult { readonly context: Buffer }\n\nexport type StepHandler = (ctx: StepContext) => Promise<StepResult>\n\nexport interface StepDef {\n readonly name: string\n readonly handler: StepHandler\n compensation: StepHandler | undefined\n}\n\n// ── Unique worker ID counter (per process) ────────────────────────────────\n\nlet nextWorkerUid = 1\n\n// ── WorkflowBuilder ───────────────────────────────────────────────────────\n\nexport class WorkflowBuilder {\n private triggerSubject: string | undefined\n private triggerStreamName: string | undefined\n private readonly steps: StepDef[] = []\n private ackWaitMs = 30_000\n private maxInflightVal = 10\n private maxRetriesVal = 3\n private maxContextSizeVal = 256 * 1024\n\n constructor(\n private readonly client: ArbitroClient,\n private readonly workflowName: string,\n ) {}\n\n trigger(subject: string): this { this.triggerSubject = subject; return this }\n\n triggerStream(streamName: string): this { this.triggerStreamName = streamName; return this }\n\n step(name: string, handler: StepHandler): this {\n this.steps.push({ name, handler, compensation: undefined })\n return this\n }\n\n /** Compensation handler for the most recently added step. */\n compensate(_stepName: string, handler: StepHandler): this {\n const last = this.steps[this.steps.length - 1]\n if (last) last.compensation = handler\n return this\n }\n\n ackWait(ms: number): this { this.ackWaitMs = ms; return this }\n inflight(n: number): this { this.maxInflightVal = n; return this }\n maxRetries(n: number): this { this.maxRetriesVal = n; return this }\n maxContextSize(bytes: number): this { this.maxContextSizeVal = bytes; return this }\n\n async start(): Promise<WorkflowHandle> {\n if (!this.triggerSubject) throw new Error('trigger subject required')\n if (this.steps.length === 0) throw new Error('at least one step required')\n\n const name = this.workflowName\n const taskStream = `_wf.${name}.tasks`\n const taskSubject = `_wf.${name}.>`\n const dlqStream = `_wf.${name}.dlq`\n const dlqSubject = `_wf.${name}.dlq.>`\n\n await this.client.upsertStream(taskStream, { subjectFilter: taskSubject, idempotencyWindowMs: 300_000 })\n await this.client.upsertStream(dlqStream, { subjectFilter: dlqSubject })\n\n const cfg: ProcessorConfig = {\n client: this.client, name, taskStreamName: taskStream,\n dlqStreamName: dlqStream, steps: this.steps,\n maxContextSize: this.maxContextSizeVal, maxRetries: this.maxRetriesVal,\n }\n\n const sub = await this.subscribeWorker(cfg, taskStream, taskSubject)\n const triggerSub = await this.subscribeTrigger(taskStream, name)\n return new WorkflowHandle(name, taskStream, dlqStream, sub, triggerSub)\n }\n\n private async subscribeWorker(cfg: ProcessorConfig, taskStream: string, taskSubject: string) {\n const uid = nextWorkerUid++\n return this.client.subscribe(taskStream, {\n name: `_wf_${cfg.name}_w${uid}`,\n group: `_wf_${cfg.name}_workers`,\n filter: taskSubject,\n ackPolicy: AckPolicy.Explicit,\n ackWaitMs: this.ackWaitMs,\n maxAckPending: this.maxInflightVal,\n }, (msg: Message) => { void processMessage(cfg, msg) })\n }\n\n private async subscribeTrigger(taskStream: string, name: string) {\n if (!this.triggerSubject || !this.triggerStreamName) return undefined\n const subject = this.triggerSubject\n return this.client.subscribe(this.triggerStreamName, {\n name: `_wf_${name}_trigger`,\n filter: subject,\n ackPolicy: AckPolicy.Explicit,\n ackWaitMs: this.ackWaitMs,\n maxAckPending: 1,\n }, async (msg: Message) => {\n const id = allocInstanceId()\n const taskBuf = encodeTask(id, 0, 0, msg.data())\n await this.client.publish(taskStream, `_wf.${name}.step.0`, taskBuf, { msgId: `wf:${id}:0:0` })\n msg.ack()\n })\n }\n}\n","import { Packr, Unpackr } from 'msgpackr'\nimport type { ZodObject, ZodRawShape, output } from 'zod'\nimport type { Encoding } from './codec'\n\n// zod is an optional peer dep — only imported as a type here so the module\n// can be tree-shaken. The runtime import happens inside zodCodec().\n\nconst packr = new Packr({ structuredClone: false, useRecords: false })\nconst unpackr = new Unpackr({ structuredClone: false, useRecords: false })\n\n/** Wraps a ZodObject schema as an Encoding<T>.\n *\n * - encode: msgpack (no Zod overhead — bytes out)\n * - decode: msgpack unpack → schema.parse() (validates on inbound data)\n * - fields: Object.keys(schema.shape) — powers LazyMessage<T> getters\n *\n * Validation cost on decode is intentional and acceptable on the management\n * path. Do NOT use zodCodec on a hot publish loop.\n */\nexport function zodCodec<S extends ZodRawShape>(\n zodSchema: ZodObject<S>,\n): Encoding<output<ZodObject<S>>> & { readonly fields: string[] } {\n const fields = Object.keys(zodSchema.shape)\n return {\n fields,\n encode(value): Buffer {\n return Buffer.from(packr.pack(value))\n },\n decode(buf): output<ZodObject<S>> {\n return zodSchema.parse(unpackr.unpack(buf))\n },\n }\n}\n"],"mappings":"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","names":["DeliverPolicy","JournalType","AckPolicy","schema","packCold","streamId","frame","frame","frame","frame","packPublishDelayed","Flag","frame","Packr","Unpackr"]}