Configuration
Fory JavaScript is an xlang-only implementation. new Fory() writes xlang payloads and uses compatible
schema evolution by default. There is no native-mode switch in the JavaScript API.
Basic Configuration
import Fory from "@apache-fory/core";
const fory = new Fory();
Create one Fory instance per application area and reuse it. Registration generates and caches
serializer code for each schema.
Constructor Options
import Fory from "@apache-fory/core";
import hps from "@apache-fory/hps";
const fory = new Fory({
ref: true,
compatible: true,
maxDepth: 100,
maxGraphMemoryBytes: 128 * 1024 * 1024,
maxTypeFields: 512,
maxTypeMetaBytes: 4096,
maxSchemaVersionsPerType: 10,
maxAverageSchemaVersionsPerType: 3,
hps,
});
| Option | Default | Description |
|---|---|---|
ref | false | Enable reference tracking for shared or circular object graphs |
compatible | true | Allow field additions/removals without breaking existing messages |
maxDepth | 50 | Maximum nesting depth. Must be >= 2. Increase for deeply nested structures |
maxGraphMemoryBytes | 128 MiB | Approximate graph-memory gate accepted during one root deserialization |
maxTypeFields | 512 | Maximum fields accepted in one received remote struct metadata body |
maxTypeMetaBytes | 4096 | Maximum encoded body bytes accepted for one received TypeMeta body |
maxSchemaVersionsPerType | 10 | Maximum accepted remote metadata versions for one logical type |
maxAverageSchemaVersionsPerType | 3 | Average accepted remote metadata versions across accepted remote types |
useSliceString | false | Optional string-reading optimization for Node.js. Leave at default unless benchmarked |
hps | unset | Optional fast string helper from @apache-fory/hps (Node.js 20+) |
hooks.afterCodeGenerated | unset | Callback to inspect the generated serializer code, useful for debugging |
Reference Tracking
Global reference tracking must be enabled before field-level reference metadata can take effect:
const fory = new Fory({ ref: true });
Then mark reference-tracked fields in the schema, for example with
Type.struct("example.node").setTrackingRef(true). See References and
Schema Metadata.
Compatible Schema Evolution
Compatible mode is the default. To use faster serialization and smaller size:
const fory = new Fory({ compatible: false });
Use compatible mode for rolling upgrades, independently deployed services, and
cross-language payloads. Use compatible: false only when every reader and
writer always uses the same struct schema and you want faster serialization and
smaller size. For individual structs, evolving: false applies the same opt-out
to that struct. For cross-language payloads, set compatible: false only after
verifying that every language uses the same schema, or when native types are
generated from Fory schema IDL. See Schema Evolution.
Graph Memory Budget
maxGraphMemoryBytes sets an approximate graph-memory gate for one root deserialization. The
estimate mainly covers materialized arrays, sets, maps, structs, and objects. It skips leaf values
such as strings, binary data, primitive scalars, and dense primitive arrays, so actual JavaScript
heap use can be higher than this value. Leaf values remain protected by byte-availability checks: if
the unread input does not contain enough bytes, Fory will not read or create that leaf value. The
default is a fixed 128 MiB and is not derived from input size.
Use a positive byte value to set an explicit lower or higher limit:
const fory = new Fory({
maxGraphMemoryBytes: 32 * 1024 * 1024,
});
Explicit non-positive values are rejected when the runtime is created.
String, binary, and dedicated dense primitive array payloads keep their normal byte-size checks and do not consume this graph budget. Raise the limit only for trusted workloads that legitimately contain very compact object graphs.
Optional HPS String Path
@apache-fory/hps provides an optional Node.js string fast path:
import hps from "@apache-fory/hps";
const fory = new Fory({ hps });
Leave this unset unless you run on Node.js 20+ and have benchmarked your workload.
Security
Security-related configuration:
- Register only the expected schemas before deserializing untrusted payloads.
- Set
maxDepthfor the maximum nesting depth your service accepts. - Set
maxGraphMemoryBytesas an approximate gate for collection, map, array, struct, and object-heavy payloads. It is not an exact heap cap; leaf values are gated by remaining input bytes. - Keep
maxTypeFieldsandmaxTypeMetaBytesat their defaults unless the data is not malicious and a trusted peer sends larger remote metadata. - Keep
maxSchemaVersionsPerTypeandmaxAverageSchemaVersionsPerTypeat their defaults unless the data is not malicious and a trusted peer sends many remote schema versions. - Prefer explicit
Type.struct(...)schemas overType.any()for untrusted input. - Pass
hpsonly from the official package version you deploy with Fory.