diff --git a/integration/generic-metadata/hero.ts b/integration/generic-metadata/hero.ts index 80923a5c1..d8fab5941 100644 --- a/integration/generic-metadata/hero.ts +++ b/integration/generic-metadata/hero.ts @@ -290,7 +290,7 @@ export const HeroServiceDefinition = { requestStream: false, responseType: Hero, responseStream: false, - options: {}, + options: { _unknownFields: {} }, }, findOneVillain: { name: "FindOneVillain", @@ -298,7 +298,7 @@ export const HeroServiceDefinition = { requestStream: false, responseType: Villain, responseStream: false, - options: {}, + options: { _unknownFields: {} }, }, findManyVillain: { name: "FindManyVillain", @@ -306,7 +306,7 @@ export const HeroServiceDefinition = { requestStream: true, responseType: Villain, responseStream: true, - options: {}, + options: { _unknownFields: {} }, }, }, } as const; diff --git a/integration/generic-service-definitions-and-services/simple.ts b/integration/generic-service-definitions-and-services/simple.ts index d1c322674..de1c63b67 100644 --- a/integration/generic-service-definitions-and-services/simple.ts +++ b/integration/generic-service-definitions-and-services/simple.ts @@ -70,7 +70,7 @@ export const TestDefinition = { requestStream: false, responseType: TestMessage, responseStream: false, - options: {}, + options: { _unknownFields: {} }, }, serverStreaming: { name: "ServerStreaming", @@ -78,7 +78,7 @@ export const TestDefinition = { requestStream: false, responseType: TestMessage, responseStream: true, - options: {}, + options: { _unknownFields: {} }, }, clientStreaming: { name: "ClientStreaming", @@ -86,7 +86,7 @@ export const TestDefinition = { requestStream: true, responseType: TestMessage, responseStream: false, - options: {}, + options: { _unknownFields: {} }, }, bidiStreaming: { name: "BidiStreaming", @@ -94,7 +94,7 @@ export const TestDefinition = { requestStream: true, responseType: TestMessage, responseStream: true, - options: {}, + options: { _unknownFields: {} }, }, /** @deprecated */ deprecated: { @@ -103,7 +103,7 @@ export const TestDefinition = { requestStream: false, responseType: TestMessage, responseStream: false, - options: {}, + options: { _unknownFields: {} }, }, idempotent: { name: "Idempotent", @@ -111,7 +111,7 @@ export const TestDefinition = { requestStream: false, responseType: TestMessage, responseStream: false, - options: { idempotencyLevel: "IDEMPOTENT" }, + options: { idempotencyLevel: "IDEMPOTENT", _unknownFields: {} }, }, noSideEffects: { name: "NoSideEffects", @@ -119,7 +119,7 @@ export const TestDefinition = { requestStream: false, responseType: TestMessage, responseStream: false, - options: { idempotencyLevel: "NO_SIDE_EFFECTS" }, + options: { idempotencyLevel: "NO_SIDE_EFFECTS", _unknownFields: {} }, }, }, } as const; diff --git a/integration/generic-service-definitions/simple.ts b/integration/generic-service-definitions/simple.ts index d1c322674..de1c63b67 100644 --- a/integration/generic-service-definitions/simple.ts +++ b/integration/generic-service-definitions/simple.ts @@ -70,7 +70,7 @@ export const TestDefinition = { requestStream: false, responseType: TestMessage, responseStream: false, - options: {}, + options: { _unknownFields: {} }, }, serverStreaming: { name: "ServerStreaming", @@ -78,7 +78,7 @@ export const TestDefinition = { requestStream: false, responseType: TestMessage, responseStream: true, - options: {}, + options: { _unknownFields: {} }, }, clientStreaming: { name: "ClientStreaming", @@ -86,7 +86,7 @@ export const TestDefinition = { requestStream: true, responseType: TestMessage, responseStream: false, - options: {}, + options: { _unknownFields: {} }, }, bidiStreaming: { name: "BidiStreaming", @@ -94,7 +94,7 @@ export const TestDefinition = { requestStream: true, responseType: TestMessage, responseStream: true, - options: {}, + options: { _unknownFields: {} }, }, /** @deprecated */ deprecated: { @@ -103,7 +103,7 @@ export const TestDefinition = { requestStream: false, responseType: TestMessage, responseStream: false, - options: {}, + options: { _unknownFields: {} }, }, idempotent: { name: "Idempotent", @@ -111,7 +111,7 @@ export const TestDefinition = { requestStream: false, responseType: TestMessage, responseStream: false, - options: { idempotencyLevel: "IDEMPOTENT" }, + options: { idempotencyLevel: "IDEMPOTENT", _unknownFields: {} }, }, noSideEffects: { name: "NoSideEffects", @@ -119,7 +119,7 @@ export const TestDefinition = { requestStream: false, responseType: TestMessage, responseStream: false, - options: { idempotencyLevel: "NO_SIDE_EFFECTS" }, + options: { idempotencyLevel: "NO_SIDE_EFFECTS", _unknownFields: {} }, }, }, } as const; diff --git a/integration/nice-grpc/simple.ts b/integration/nice-grpc/simple.ts index a9fb0873c..73ff2028a 100644 --- a/integration/nice-grpc/simple.ts +++ b/integration/nice-grpc/simple.ts @@ -94,7 +94,7 @@ export const TestDefinition = { requestStream: false, responseType: Empty, responseStream: false, - options: {}, + options: { _unknownFields: {} }, }, unaryStringValue: { name: "UnaryStringValue", @@ -207,7 +207,7 @@ export const TestDefinition = { requestStream: false, responseType: TestMessage, responseStream: true, - options: {}, + options: { _unknownFields: {} }, }, serverStreamingStringValue: { name: "ServerStreamingStringValue", @@ -215,7 +215,7 @@ export const TestDefinition = { requestStream: false, responseType: StringValue, responseStream: true, - options: {}, + options: { _unknownFields: {} }, }, serverStreamingStruct: { name: "ServerStreamingStruct", @@ -223,7 +223,7 @@ export const TestDefinition = { requestStream: false, responseType: Struct, responseStream: true, - options: {}, + options: { _unknownFields: {} }, }, /** Client Streaming */ clientStreaming: { @@ -232,7 +232,7 @@ export const TestDefinition = { requestStream: true, responseType: TestMessage, responseStream: false, - options: {}, + options: { _unknownFields: {} }, }, clientStreamingStringValue: { name: "ClientStreamingStringValue", @@ -240,7 +240,7 @@ export const TestDefinition = { requestStream: true, responseType: StringValue, responseStream: false, - options: {}, + options: { _unknownFields: {} }, }, /** Bidi Streaming */ bidiStreaming: { @@ -249,7 +249,7 @@ export const TestDefinition = { requestStream: true, responseType: TestMessage, responseStream: true, - options: {}, + options: { _unknownFields: {} }, }, bidiStreamingStringValue: { name: "BidiStreamingStringValue", @@ -257,7 +257,7 @@ export const TestDefinition = { requestStream: true, responseType: StringValue, responseStream: true, - options: {}, + options: { _unknownFields: {} }, }, }, } as const; diff --git a/src/generate-generic-service-definition.ts b/src/generate-generic-service-definition.ts index 0ba118d1b..963fd9d9e 100644 --- a/src/generate-generic-service-definition.ts +++ b/src/generate-generic-service-definition.ts @@ -71,12 +71,12 @@ function generateMethodDefinition(ctx: Context, methodDesc: MethodDescriptorProt requestStream: ${methodDesc.clientStreaming}, responseType: ${outputType}, responseStream: ${methodDesc.serverStreaming}, - options: ${generateMethodOptions(methodDesc.options)} + options: ${generateMethodOptions(ctx, methodDesc.options)} } `; } -function generateMethodOptions(options: MethodOptions | undefined) { +function generateMethodOptions(ctx: Context, options: MethodOptions | undefined) { const chunks: Code[] = []; chunks.push(code`{`); @@ -87,6 +87,29 @@ function generateMethodOptions(options: MethodOptions | undefined) { } else if (options.idempotencyLevel === MethodOptions_IdempotencyLevel.NO_SIDE_EFFECTS) { chunks.push(code`idempotencyLevel: 'NO_SIDE_EFFECTS',`); } + + if ("_unknownFields" in options) { + const msgUnknownFields: any = (options as any)["_unknownFields"]; + const unknownFieldsChunks: Code[] = []; + + unknownFieldsChunks.push(code`{`); + + for (const key of Object.keys(msgUnknownFields)) { + const values = msgUnknownFields[key] as Uint8Array[]; + const valuesChunks: Code[] = []; + + for (const value of values) { + valuesChunks.push( + code`${ctx.options.env == "node" ? "Buffer.from" : "new Uint8Array"}([${value.join(", ")}])` + ); + } + + unknownFieldsChunks.push(code`${key}: [\n${joinCode(valuesChunks, { on: "," }).toCodeString([])}\n],`); + } + + unknownFieldsChunks.push(code`}`); + chunks.push(code`_unknownFields: ${joinCode(unknownFieldsChunks, { on: "\n" }).toCodeString([])}`); + } } chunks.push(code`}`);