From ebf2bc4cb5f89c80c5bd41a9fef0f3c39881d97d Mon Sep 17 00:00:00 2001 From: Mocanu Cristian Date: Thu, 20 Jan 2022 17:58:11 +0200 Subject: [PATCH] feat: allow the usage of custom replacer and reviver --- lib/index.ts | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/lib/index.ts b/lib/index.ts index 133df63..453425f 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -36,6 +36,12 @@ export interface Packet { */ export class Encoder { + /** + * Encoder constructor + * + * @param {function} replacer - custom replacer to pass down to JSON.parse + */ + constructor(private replacer?: (this: any, key: string, value: any) => any) {} /** * Encode a packet as a single string if non-binary, or as a * buffer sequence, depending on packet type. @@ -86,7 +92,7 @@ export class Encoder { // json data if (null != obj.data) { - str += JSON.stringify(obj.data); + str += JSON.stringify(obj.data, this.replacer); } debug("encoded %j as %s", obj, str); @@ -121,7 +127,12 @@ interface DecoderReservedEvents { export class Decoder extends Emitter<{}, {}, DecoderReservedEvents> { private reconstructor: BinaryReconstructor; - constructor() { + /** + * Decoder constructor + * + * @param {function} reviver - custom reviver to pass down to JSON.stringify + */ + constructor(private reviver?: (this: any, key: string, value: any) => any) { super(); } @@ -228,7 +239,7 @@ export class Decoder extends Emitter<{}, {}, DecoderReservedEvents> { // look up json data if (str.charAt(++i)) { - const payload = tryParse(str.substr(i)); + const payload = this.tryParse(str.substr(i)); if (Decoder.isPayloadValid(p.type, payload)) { p.data = payload; } else { @@ -240,6 +251,14 @@ export class Decoder extends Emitter<{}, {}, DecoderReservedEvents> { return p; } + private tryParse(str) { + try { + return JSON.parse(str, this.reviver); + } catch (e) { + return false; + } + } + private static isPayloadValid(type: PacketType, payload: any): boolean { switch (type) { case PacketType.CONNECT: @@ -267,14 +286,6 @@ export class Decoder extends Emitter<{}, {}, DecoderReservedEvents> { } } -function tryParse(str) { - try { - return JSON.parse(str); - } catch (e) { - return false; - } -} - /** * A manager of a binary event's 'buffer sequence'. Should * be constructed whenever a packet of type BINARY_EVENT is