// Copyright 2021-2024 Buf Technologies, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /** * Message is the base class of every message, generated, or created at * runtime. * * It is _not_ safe to extend this class. If you want to create a message at * run time, use proto3.makeMessageType(). */ export class Message { /** * Compare with a message of the same type. * Note that this function disregards extensions and unknown fields. */ equals(other) { return this.getType().runtime.util.equals(this.getType(), this, other); } /** * Create a deep copy. */ clone() { return this.getType().runtime.util.clone(this); } /** * Parse from binary data, merging fields. * * Repeated fields are appended. Map entries are added, overwriting * existing keys. * * If a message field is already present, it will be merged with the * new data. */ fromBinary(bytes, options) { const type = this.getType(), format = type.runtime.bin, opt = format.makeReadOptions(options); format.readMessage(this, opt.readerFactory(bytes), bytes.byteLength, opt); return this; } /** * Parse a message from a JSON value. */ fromJson(jsonValue, options) { const type = this.getType(), format = type.runtime.json, opt = format.makeReadOptions(options); format.readMessage(type, jsonValue, opt, this); return this; } /** * Parse a message from a JSON string. */ fromJsonString(jsonString, options) { let json; try { json = JSON.parse(jsonString); } catch (e) { throw new Error(`cannot decode ${this.getType().typeName} from JSON: ${e instanceof Error ? e.message : String(e)}`); } return this.fromJson(json, options); } /** * Serialize the message to binary data. */ toBinary(options) { const type = this.getType(), bin = type.runtime.bin, opt = bin.makeWriteOptions(options), writer = opt.writerFactory(); bin.writeMessage(this, writer, opt); return writer.finish(); } /** * Serialize the message to a JSON value, a JavaScript value that can be * passed to JSON.stringify(). */ toJson(options) { const type = this.getType(), json = type.runtime.json, opt = json.makeWriteOptions(options); return json.writeMessage(this, opt); } /** * Serialize the message to a JSON string. */ toJsonString(options) { var _a; const value = this.toJson(options); return JSON.stringify(value, null, (_a = options === null || options === void 0 ? void 0 : options.prettySpaces) !== null && _a !== void 0 ? _a : 0); } /** * Override for serialization behavior. This will be invoked when calling * JSON.stringify on this message (i.e. JSON.stringify(msg)). * * Note that this will not serialize google.protobuf.Any with a packed * message because the protobuf JSON format specifies that it needs to be * unpacked, and this is only possible with a type registry to look up the * message type. As a result, attempting to serialize a message with this * type will throw an Error. * * This method is protected because you should not need to invoke it * directly -- instead use JSON.stringify or toJsonString for * stringified JSON. Alternatively, if actual JSON is desired, you should * use toJson. */ toJSON() { return this.toJson({ emitDefaultValues: true, }); } /** * Retrieve the MessageType of this message - a singleton that represents * the protobuf message declaration and provides metadata for reflection- * based operations. */ getType() { // Any class that extends Message _must_ provide a complete static // implementation of MessageType. // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-return return Object.getPrototypeOf(this).constructor; } }