Skip to content

Session Encoder ​

The session encoder maintains state across a sequence of messages on a long-lived channel. It enables state patches (send only changed fields), micro-batches, template batches, and trained dictionaries.

Use session encoding for WebSocket streams, ordered message queues, and persistent RPC channels — not for stateless HTTP.

SessionOptions ​

Configure session behavior when creating an encoder.

TypeScript ​

ts
interface SessionOptions {
maxBaseSnapshots?: number;
enableStatePatch?: boolean;
enableTemplateBatch?: boolean;
enableTrainedDictionary?: boolean;
unknownReferencePolicy?: "failFast" | "statelessRetry";
}

Rust ​

rust
pub struct SessionOptions {
pub max_base_snapshots: usize,
pub enable_state_patch: bool,
pub enable_template_batch: bool,
pub enable_trained_dictionary: bool,
pub unknown_reference_policy: UnknownReferencePolicy,
}
OptionDefaultDescription
maxBaseSnapshots / max_base_snapshots8Maximum retained base snapshots for patch base references
enableStatePatch / enable_state_patchtrueAllow state patch messages when few fields change
enableTemplateBatch / enable_template_batchtrueAllow template batch encoding for repeated column patterns
enableTrainedDictionary / enable_trained_dictionarytrueLearn string dictionaries across the session
unknownReferencePolicy / unknown_reference_policyfailFastBehavior when decoder sees unknown base/shape/dictionary reference

UnknownReferencePolicy ​

ValueBehavior
failFastDecode error immediately
statelessRetrySignal that receiver should request a full stateless frame and retry

Use statelessRetry on clients that can recover from state drift after reconnect.

Creating an encoder ​

JavaScript ​

ts
import { createSessionEncoder } from "@twilic/core";

const enc = createSessionEncoder({
enableStatePatch: true,
unknownReferencePolicy: "statelessRetry",
});

For all encoding variants (transport-JSON, compact, direct), use createSessionEncoder from @twilic/core/advanced.

Rust ​

rust
use twilic::{create_session_encoder, SessionOptions, UnknownReferencePolicy};

let enc = create_session_encoder(SessionOptions {
unknown_reference_policy: UnknownReferencePolicy::StatelessRetry,
..Default::default()
});

Python ​

python
import twilic

enc = twilic.create_session_encoder(
enable_state_patch=True,
unknown_reference_policy="statelessRetry",
)

Go ​

go
enc := twilic.NewSessionEncoder(twilic.SessionOptions{
EnableStatePatch: true,
UnknownReferencePolicy: twilic.UnknownReferencePolicyStatelessRetry,
})

Encode methods ​

MethodWhen to use
encode()First frame or after reset() — full baseline
encodePatch()Subsequent ticks when most fields unchanged
encodeBatch()Multiple same-shape records in one frame
encodeMicroBatch()Small batches in high-frequency streams
reset()After disconnect, decode error, or version skew

Session lifecycle ​

Decoder pairing ​

The receiver must apply patches in order on the same session. If the client does not implement stateful decode:

  • It can still decode the first full frame as a normal Dynamic message
  • Subsequent patches will not decode correctly without session state

Recovery pattern ​

ts
let consecutiveErrors = 0;

function sendUpdate(value: TwilicValue) {
try {
const bytes =
consecutiveErrors > 0
? enc.encode(value) // full frame after errors
: enc.encodePatch(value);
transport.send(bytes);
consecutiveErrors = 0;
} catch {
consecutiveErrors++;
enc.reset();
transport.send(enc.encode(value));
}
}

See Stateful Streams guide and Cookbook — Graceful Degradation.

Released under the CC-BY-4.0 License.