fastify / fastify/fast-json-stringify

Support TypedArrays

Open
#626 1 comment 4 reactions 0 assignees View on GitHub
Dominant language
JavaScript
Stars
3.7k
Forks
226
Avg merge
1d 59m
Merged PRs (30d)
3

Description

### Prerequisites

- [X] I have written a descriptive issue title
- [X] I have searched existing issues to ensure the feature has not already been requested

### 🚀 Feature Proposal

fast-json-stringify does not work with TypedArray objects (Float32Array, etc.). Normally, using `JSON.stringify` to serialize a TypedArray results in writing it as an object (e.g., `new Float32Array([0.1,0.2])` gets serialized as `{"0":0.1,"1":0.2}`). However, since fast-json-stringify uses a JSON Schema to guide its output, it can know that a given property is an array; it seems reasonable and consistent to allow it to serialize TypedArrays as well as regular arrays.

Proposed implementation:

* The [Array.isArray](https://github.com/fastify/fast-json-stringify/blob/v5.7.0/index.js#LL557C10-L557C18) check could be broadened to also allow [TypedArrays](https://stackoverflow.com/q/15251879/25507).
* TypedArray can only hold (floating point or integer) numbers, so it would not work with many JSON Schemas. One option would be to only allow TypedArray if the JSON Schema is compatible with TypedArray (e.g., only number items); another option would be to allow it as is and then let individual elements fail validation.
* If a TypedArray is in use, largeArrayMechanism is ignored (treated as `default`).

### Motivation

Our application uses TypedArray for several purposes. This is fast internally but is noticeably slower to serialize. Using fast-json-stringify, locally patched to support TypedArray, is over 2.5x faster for a Float32Array of 4000 randomly generated numbers.

### Example

```js
const array = new Float32Array(new Array(4000).fill(1));

const stringify = fastJson({
title: 'Example Schema',
type: 'array',
items: {
type: 'number'
}
})

console.log(stringify(array));
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.