tree: 5feb40d11e293751960bad0b3a53802f8fd0ac83
  1. benchmark/
  2. packages/
  3. test/
  4. .eslintrc.cjs
  5. .gitignore
  6. .npmrc
  7. jest.config.js
  8. package-lock.json
  9. package.json
  10. README.md
javascript/README.md

Apache Fory™ JavaScript

npm License

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.

Key Features

  • Cross-language — serialize in JavaScript, deserialize in Java, Python, Go, Rust, C++, and more without writing glue code
  • Fast — serializer code is generated and cached at registration time; optimized for V8 JIT
  • Reference-aware — shared references and circular object graphs are supported
  • Schema-driven — field types, nullability, and polymorphism are declared once with Type.* builders
  • Schema evolution — optional forward/backward compatibility for independent service deployments
  • Modern typesbigint, typed arrays, Map, Set, Date, float16, bfloat16 supported

Packages

PackageDescription
@apache-fory/coreMain Fory runtime for JavaScript/TypeScript
@apache-fory/hpsOptional Node.js high-performance suite (Node.js 20+)

Installation

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.

Quick Start

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 }

Supported Types

JavaScript ValueFory SchemaNotes
booleanType.bool()
numberType.int8() / int16() / int32() / float32() / float64()Pick the width matching the peer language
bigintType.int64() / uint64()Use for 64-bit integers
stringType.string()
Uint8ArrayType.binary()Binary blob
DateType.timestamp() / Type.date()
ArrayType.array(Type.T())
MapType.map(Type.K(), Type.V())
SetType.set(Type.T())
Typed arraysType.int32Array() / float64Array() / ...Maps to native typed arrays

Cross-Language Serialization

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.

Schema Evolution

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.

Documentation

Full documentation is available at fory.apache.org:

License

Apache License 2.0 — see LICENSE for details.