From e64f939f0a34c353a390bcf46d769bcec4560063 Mon Sep 17 00:00:00 2001 From: iaco Date: Mon, 9 Jun 2025 13:35:21 +0100 Subject: [PATCH] feat: allow optional customization of cbor encode/decode options (@warren-gallagher) credits to @warren-gallagher https://github.com/auth0-lab/mdl/pull/52/ closes #48 --- __tests__/cbor.tests.ts | 14 +++++++++++++- src/cbor/index.ts | 10 +++++++++- src/index.ts | 1 + 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/__tests__/cbor.tests.ts b/__tests__/cbor.tests.ts index 8781dc1..c794473 100644 --- a/__tests__/cbor.tests.ts +++ b/__tests__/cbor.tests.ts @@ -1,6 +1,6 @@ import { hex } from 'buffer-tag'; -import { cborDecode, cborEncode, DataItem } from '../src/cbor'; +import { cborDecode, cborEncode, DataItem, getCborEncodeDecodeOptions, setCborEncodeDecodeOptions } from '../src/cbor'; describe('cbor', () => { it('should properly decode a nested map', () => { @@ -16,6 +16,18 @@ describe('cbor', () => { const decoded = cborDecode(encoded); const reEncode = cborEncode(decoded); expect(reEncode.toString('hex')).toBe(encoded.toString('hex')); + expect(encoded[3].toString(16)).toBe('b9'); // Large Map + }); + + it('should properly encoded and decoded maps using variableMapSize=true', () => { + const options = getCborEncodeDecodeOptions(); + options.variableMapSize = true; + setCborEncodeDecodeOptions(options); + const encoded = cborEncode(DataItem.fromData({ foo: 'baz' })); + const decoded = cborDecode(encoded); + const reEncode = cborEncode(decoded); + expect(reEncode.toString('hex')).toBe(encoded.toString('hex')); + expect(encoded[3].toString(16)).toBe('a1'); // Map with one item }); it('should properly encoded and decoded with arrays', () => { diff --git a/src/cbor/index.ts b/src/cbor/index.ts index 4cc0f5a..18fcc03 100644 --- a/src/cbor/index.ts +++ b/src/cbor/index.ts @@ -33,7 +33,7 @@ export class DateOnly extends Date { } } -const encoderDefaults: Options = { +let encoderDefaults: Options = { tagUint8Array: false, useRecords: false, mapsAsObjects: false, @@ -59,6 +59,14 @@ addExtension({ decode: (isoStringDate: any): Object => new DateOnly(isoStringDate), }); +export const getCborEncodeDecodeOptions = () : Options => { + return encoderDefaults; +}; + +export const setCborEncodeDecodeOptions = (options: Options) : void => { + encoderDefaults = options; +}; + export const cborDecode = ( input: Buffer | Uint8Array, options: Options = encoderDefaults, diff --git a/src/index.ts b/src/index.ts index 9299221..25ef185 100644 --- a/src/index.ts +++ b/src/index.ts @@ -9,3 +9,4 @@ export { DeviceSignedDocument } from './mdoc/model/DeviceSignedDocument'; export { DeviceResponse } from './mdoc/model/DeviceResponse'; export { MDLError, MDLParseError } from './mdoc/errors'; export { VerificationAssessmentId } from './mdoc/checkCallback'; +export { getCborEncodeDecodeOptions, setCborEncodeDecodeOptions } from './cbor';