From 2ee2065dcc5d674f863069b461b798c23386f00a Mon Sep 17 00:00:00 2001 From: Dennis Kaspar Date: Sat, 27 Mar 2021 13:38:22 +0100 Subject: [PATCH 1/2] Update README.md Possible to save size in BigInt Handling, when using Number if its in SAFE range --- README.md | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 1704ba05..a6838cd7 100644 --- a/README.md +++ b/README.md @@ -361,17 +361,21 @@ import { encode, decode, ExtensionCodec } from "@msgpack/msgpack"; const BIGINT_EXT_TYPE = 0; // Any in 0-127 const extensionCodec = new ExtensionCodec(); extensionCodec.register({ - type: BIGINT_EXT_TYPE, - encode: (input: unknown) => { - if (typeof input === "bigint") { - return encode(input.toString()); - } else { - return null; - } - }, - decode: (data: Uint8Array) => { - return BigInt(decode(data)); - }, + type: BIGINT_EXT_TYPE, + encode: (input: unknown) => { + if (typeof input === "bigint") { + if (input <= Number.MAX_SAFE_INTEGER && input >= Number.MIN_SAFE_INTEGER) { + return encode(parseInt(input.toString(), 10)); + } else { + return encode(input.toString()); + } + } else { + return null; + } + }, + decode: (data: Uint8Array) => { + return BigInt(decode(data)); + }, }); const value = BigInt(Number.MAX_SAFE_INTEGER) + BigInt(1); From 2732911161595898a6c481199697eb1f0b91465d Mon Sep 17 00:00:00 2001 From: Dennis Kaspar Date: Thu, 1 Apr 2021 07:29:10 +0200 Subject: [PATCH 2/2] Update codec-bigint.test.ts Changed the test to encode as number if its in SAFE_INTEGER Area. --- test/codec-bigint.test.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/test/codec-bigint.test.ts b/test/codec-bigint.test.ts index f10ff725..479383c2 100644 --- a/test/codec-bigint.test.ts +++ b/test/codec-bigint.test.ts @@ -5,11 +5,15 @@ const extensionCodec = new ExtensionCodec(); extensionCodec.register({ type: 0, encode: (input: unknown) => { - if (typeof input === "bigint") { - return encode(input.toString()); - } else { - return null; - } + if (typeof input === "bigint") { + if (input <= Number.MAX_SAFE_INTEGER && input >= Number.MIN_SAFE_INTEGER) { + return encode(parseInt(input.toString(), 10)); + } else { + return encode(input.toString()); + } + } else { + return null; + } }, decode: (data: Uint8Array) => { return BigInt(decode(data));