From c36c9bd399be11967703912e14dfbcbb283de2b5 Mon Sep 17 00:00:00 2001 From: Sri Krishna Paritala Date: Thu, 21 Mar 2024 08:23:12 +0530 Subject: [PATCH 1/2] Clone the unknow fields array --- packages/protobuf/src/next/clone.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/protobuf/src/next/clone.ts b/packages/protobuf/src/next/clone.ts index 67381eed4..6a1f36f0c 100644 --- a/packages/protobuf/src/next/clone.ts +++ b/packages/protobuf/src/next/clone.ts @@ -58,7 +58,7 @@ export function clone(message: T): T { } const unknown = i.getUnknown(); if (unknown && unknown.length > 0) { - o.setUnknown(unknown); + o.setUnknown([...unknown]); } return o.message as T; } From 869b5212ccaf0f4ca0a45d05b14b8f7230ff7fdd Mon Sep 17 00:00:00 2001 From: Sri Krishna Paritala Date: Fri, 22 Mar 2024 16:30:41 +0530 Subject: [PATCH 2/2] Add type and test --- packages/protobuf-test/src/next/clone.test.ts | 4 ++++ packages/protobuf/src/next/reflect/reflect.ts | 11 +++-------- packages/protobuf/src/next/types.ts | 8 +++++++- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/packages/protobuf-test/src/next/clone.test.ts b/packages/protobuf-test/src/next/clone.test.ts index d8f908e10..9e3ff3ef7 100644 --- a/packages/protobuf-test/src/next/clone.test.ts +++ b/packages/protobuf-test/src/next/clone.test.ts @@ -147,5 +147,9 @@ describe("clone()", () => { expect(copy.singularMessageField?.$unknown).toStrictEqual( msg.singularMessageField.$unknown, ); + // Make sure it is copy + expect(copy.singularMessageField?.$unknown).not.toBe( + msg.singularMessageField.$unknown, + ); }); }); diff --git a/packages/protobuf/src/next/reflect/reflect.ts b/packages/protobuf/src/next/reflect/reflect.ts index fb07067a6..99501fb1f 100644 --- a/packages/protobuf/src/next/reflect/reflect.ts +++ b/packages/protobuf/src/next/reflect/reflect.ts @@ -18,7 +18,7 @@ import type { DescOneof, } from "../../descriptor-set.js"; import type { ScalarValue, LongType } from "./scalar.js"; -import type { Message } from "../types.js"; +import type { Message, UnknownField } from "../types.js"; import { addListItemPrivate, clearFieldPrivate, @@ -38,7 +38,6 @@ import { import { FieldError } from "./error.js"; import type { MapEntryKey, ReflectMap } from "./reflect-map.js"; import { reflectMap } from "./reflect-map.js"; -import type { WireType } from "../../binary-encoding.js"; export interface ReflectMessage { readonly kind: "reflect_message"; @@ -77,13 +76,9 @@ export interface ReflectMessage { value: NewMapEntryValue, ): FieldError | undefined; - getUnknown(): - | { no: number; wireType: WireType; data: Uint8Array }[] - | undefined; + getUnknown(): UnknownField[] | undefined; - setUnknown( - value: { no: number; wireType: WireType; data: Uint8Array }[], - ): void; + setUnknown(value: UnknownField[]): void; } // prettier-ignore diff --git a/packages/protobuf/src/next/types.ts b/packages/protobuf/src/next/types.ts index f9ae36b24..1d397e739 100644 --- a/packages/protobuf/src/next/types.ts +++ b/packages/protobuf/src/next/types.ts @@ -24,7 +24,7 @@ export type Message = { readonly $desc: DescMessage; readonly $typeName: TypeName; - $unknown?: { no: number; wireType: WireType; data: Uint8Array }[]; + $unknown?: UnknownField[]; }; // TODO docs @@ -41,6 +41,12 @@ export type MessageInitShape = export type EnumShape = Desc extends TypedDescEnum ? RuntimeShape : number; +export type UnknownField = { + readonly no: number; + readonly wireType: WireType; + readonly data: Uint8Array; +}; + // TODO ServiceShape // TODO MethodShape?