JavaScript / TypeScript implementation of the Apache Fory™ cross-language serialization protocol. Serialize JavaScript objects to bytes and deserialize them back — including across services written in Java, Python, Go, Rust, C++, and other Fory-supported languages.
Type.* buildersbigint, typed arrays, Map, Set, Date, float16, bfloat16 supported| Package | Description |
|---|---|
@apache-fory/core | Main Fory runtime for JavaScript/TypeScript |
@apache-fory/hps | Optional Node.js high-performance suite (Node.js 20+) |
npm install @apache-fory/core
For optional Node.js string-detection acceleration:
npm install @apache-fory/hps
@apache-fory/hps uses V8's fast-call API to detect string encoding efficiently. It requires Node.js 20+ and is completely optional — if installation fails or your environment does not support it, @apache-fory/core works perfectly on its own.
import Fory, { Type } from "@apache-fory/core"; // Optional: import hps for Node.js string performance boost // import hps from "@apache-fory/hps"; const userType = Type.struct( { typeName: "example.user" }, { id: Type.int64(), name: Type.string(), age: Type.int32(), }, ); const fory = new Fory(); // With hps: const fory = new Fory({ hps }); const { serialize, deserialize } = fory.register(userType); const bytes = serialize({ id: 1n, name: "Alice", age: 30 }); const user = deserialize(bytes); console.log(user); // { id: 1n, name: 'Alice', age: 30 }
| JavaScript Value | Fory Schema | Notes |
|---|---|---|
boolean | Type.bool() | |
number | Type.int8() / int16() / int32() / float32() / float64() | Pick the width matching the peer language |
bigint | Type.int64() / uint64() | Use for 64-bit integers |
string | Type.string() | |
Uint8Array | Type.binary() | Binary blob |
Date | Type.timestamp() / Type.date() | |
Array | Type.array(Type.T()) | |
Map | Type.map(Type.K(), Type.V()) | |
Set | Type.set(Type.T()) | |
| Typed arrays | Type.int32Array() / float64Array() / ... | Maps to native typed arrays |
Fory JavaScript serializes to the same binary format as the Java, Python, Go, Rust, C++, and Swift runtimes. A message written in JavaScript can be read in any other supported language without any conversion layer.
// JavaScript side const messageType = Type.struct( { typeName: "example.message" }, { id: Type.int64(), content: Type.string(), }, ); const fory = new Fory(); const { serialize } = fory.register(messageType); const bytes = serialize({ id: 1n, content: "hello from JavaScript" }); // Send bytes to a Java/Python/Go/Rust service
Register the same example.message type on the other side using the peer runtime's API.
Enable compatible mode for independent service deployments:
const fory = new Fory({ compatible: true });
Readers can skip unknown fields and tolerate missing ones, supporting rolling upgrades and schema changes across services.
Full documentation is available at fory.apache.org:
Apache License 2.0 — see LICENSE for details.