The GitHub Actions job "Fory CI" on fory.git/main has failed.
Run started by GitHub user theweipeng (triggered by theweipeng).

Head commit for run:
27f2b64b845129f30a115d01788c7bd4369b8680 / Ayush Kumar 
<[email protected]>
feat(xlang): add unsigned integer type support for JavaScript (#3139)

## Why?

As requested in Issue #3130, JavaScript implementation was missing
support for unsigned integer types that are already available in other
Fory language implementations (Rust, Go, C++, Python). This PR adds
complete unsigned integer support for JavaScript.

## What does this PR do?

This PR implements schema-based support for unsigned integer types in
the Fory JavaScript/TypeScript library:

### Added Types

- `uint8`
- `uint16`  
- `uint32`
- `uint64`
- `var_uint32`
- `var_uint64`
- `tagged_uint64`

### Changes Made

#### 1. `lib/type.ts`
Added 7 unsigned integer types to the `InternalSerializerType` enum:

```typescript
export enum InternalSerializerType {
  UINT8,
  UINT16,
  UINT32,
  VAR_UINT32,
  UINT64,
  VAR_UINT64,
  TAGGED_UINT64,
  // ...
}
```

#### 2. `lib/typeInfo.ts`
**Added Type helper functions** for user-facing API:

```typescript
export const Type = {
  uint8() {
    return TypeInfo.fromNonParam(InternalSerializerType.UINT8 as const, 
TypeId.UINT8);
  },
  uint16() {
    return TypeInfo.fromNonParam(InternalSerializerType.UINT16 as const, 
TypeId.UINT16);
  },
  // ...
}
```

**Updated TypeScript type hints** for proper type inference:

- Added unsigned types to HintInput number type union (returns `number`
for 8/16/32-bit, `bigint` for 64-bit)
- Added unsigned types to HintResult type union for proper
deserialization type inference

#### 3. `lib/gen/number.ts`

Registered serializers for all 7 unsigned integer types using the
existing buildNumberSerializer pattern:

```typescript
CodegenRegistry.register(InternalSerializerType.UINT8,
  buildNumberSerializer(
    (builder, accessor) => builder.writer.uint8(accessor),
    builder => builder.reader.uint8()
  )
);

CodegenRegistry.register(InternalSerializerType.UINT16,
  buildNumberSerializer(
    (builder, accessor) => builder.writer.uint16(accessor),
    builder => builder.reader.uint16()
  )
);
//....
```

#### 4. `test/number.test.ts`

Added comprehensive tests for all unsigned types:

```typescript
test('should uint8 work', () => {
  const fory = new Fory({ refTracking: true });
  const serializer = fory.registerSerializer(Type.struct({
    typeName: "example.foo"
  }, {
    a: Type.uint8()
  })).serializer;
  const input = fory.serialize({ a: 255 }, serializer);
  const result = fory.deserialize(input);
  expect(result).toEqual({ a: 255 });
});

test('should uint16 work', () => {
  const fory = new Fory({ refTracking: true });
  const serializer = fory.registerSerializer(Type.struct({
    typeName: "example.foo"
  }, {
    a: Type.uint16()
  })).serializer;
  const input = fory.serialize({ a: 65535 }, serializer);
  const result = fory.deserialize(input);
  expect(result).toEqual({ a: 65535 });
});

\\...
```

### Usage Example

```typescript
import { Fory, Type } from '@apache-fory/fory';

const fory = new Fory();
const serializer = fory.registerSerializer(Type.struct({
  typeName: 'Foo'
}, {
  f1: Type.uint32(),
  f2: Type.varUInt32(),
  f3: Type.uint64()
})).serializer;

const data = { f1: 4294967295, f2: 1000, f3: 18446744073709551615n };
const bytes = fory.serialize(data, serializer);
const result = fory.deserialize(bytes);
```

## Related issues

- Closes #3130

## Does this PR introduce any user-facing change?

- [x] **Does this PR introduce any public API change?**
- **Yes**: Adds 7 new Type helper functions (`Type.uint8()`,
`Type.uint16()`, `Type.uint32()`, `Type.varUInt32()`, `Type.uint64()`,
`Type.varUInt64()`, `Type.taggedUInt64()`)
- These are **additive changes only** - no breaking changes to existing
APIs
  
- [x] **Does this PR introduce any binary protocol compatibility
change?**
- **Yes**: Adds support for 7 new TypeId values (9-15) for unsigned
integers
- **Cross-language compatible**: Uses the same TypeId values as other
Fory implementations
  - **Backward compatible**: Existing serialized data remains compatible

## Benchmark

N/A - this PR adds new functionality without modifying existing
serialization paths. The underlying writer/reader methods `uint8()`,
`uint16()` were already implemented and optimized; this PR only exposes
them through the type system.

---

Report URL: https://github.com/apache/fory/actions/runs/21017997401

With regards,
GitHub Actions via GitBox


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to