blob: 8a399dfb85dd8886bfc14c495e0d3690a8ff56b0 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import JSONBigInt from 'json-bigint';
// Configure json-bigint to parse as strings to avoid BigInt issues with math operations
const JSONbig = JSONBigInt({
useNativeBigInt: true,
alwaysParseAsBig: false,
strict: false,
// Custom reviver to convert BigInt to string to avoid math operation issues
protoAction: 'ignore',
constructorAction: 'ignore'
});
export const getJson = async (res: Response): Promise<unknown | null> => {
const text = await res.text();
try {
// Parse with json-bigint which handles large numbers correctly
const parsed = JSONbig.parse(text);
// Convert any BigInt values to strings or numbers depending on size
const json = convertBigInts(parsed);
return json as unknown;
} catch (err) {
return null;
}
};
// Recursively convert BigInt values to appropriate types
function convertBigInts(obj: any): any {
if (obj === null || obj === undefined) {
return obj;
}
if (typeof obj === 'bigint') {
// If it fits in a safe number, convert to number for math operations
// Otherwise keep as string for display
if (obj <= Number.MAX_SAFE_INTEGER && obj >= Number.MIN_SAFE_INTEGER) {
return Number(obj);
}
return obj.toString();
}
if (Array.isArray(obj)) {
return obj.map(convertBigInts);
}
if (typeof obj === 'object') {
const result: any = {};
for (const key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
result[key] = convertBigInts(obj[key]);
}
}
return result;
}
return obj;
}