or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

binary-io.mdbytestring-utilities.mddebug-utilities.mdextension-fields.mdindex.mdmap-operations.mdmessage-operations.md
tile.json

message-operations.mddocs/

Message Operations

The jspb.Message class is the base class for all generated Protocol Buffer messages and provides comprehensive functionality for field access, serialization, cloning, and message manipulation.

Core Message Class { .api }

const { Message } = require('google-protobuf');

// Message creation (typically done via generated classes)
class MyMessage extends Message {
  constructor(opt_data) {
    super();
    // Generated constructor logic
  }
}

// Basic instance methods
const messageId = message.getJsPbMessageId();
const array = message.toArray();
const string = message.toString();
const cloned = message.cloneMessage();

Type Definitions:

/**
 * @constructor
 * Base class for all Protocol Buffer messages
 */

/**
 * @typedef {boolean|number|string} ScalarFieldType
 * @typedef {Array<ScalarFieldType>|Array<Uint8Array>} RepeatedFieldType
 * @typedef {ScalarFieldType|RepeatedFieldType|Uint8Array} AnyFieldType
 */

Field Access Operations { .api }

Basic Field Access

const { Message } = require('google-protobuf');

// Get field value by field number
const value = Message.getField(message, fieldNumber);

// Get field with default value
const valueWithDefault = Message.getFieldWithDefault(message, fieldNumber, defaultValue);

// Set field value
Message.setField(message, fieldNumber, value);

// Check if field is set
const hasField = Message.getField(message, fieldNumber) != null;

Type-Specific Field Access

// Boolean fields
const boolValue = Message.getBooleanField(message, fieldNumber);
const boolWithDefault = Message.getBooleanFieldWithDefault(message, fieldNumber, false);

// Floating point fields  
const floatValue = Message.getOptionalFloatingPointField(message, fieldNumber);
const floatWithDefault = Message.getFloatingPointFieldWithDefault(message, fieldNumber, 0.0);

// Proto3 field setters (handle zero values correctly)
Message.setProto3IntField(message, fieldNumber, intValue);
Message.setProto3FloatField(message, fieldNumber, floatValue);
Message.setProto3BooleanField(message, fieldNumber, boolValue);
Message.setProto3StringField(message, fieldNumber, stringValue);
Message.setProto3BytesField(message, fieldNumber, bytesValue);
Message.setProto3EnumField(message, fieldNumber, enumValue);

Type Definitions:

/**
 * @param {!Message} msg The message
 * @param {number} fieldNumber The field number
 * @param {*=} defaultValue Default value to return
 * @return {*} The field value or default
 */

Repeated Fields { .api }

const { Message } = require('google-protobuf');

// Get repeated field array
const repeatedValues = Message.getRepeatedField(message, fieldNumber);

// Type-specific repeated field access
const repeatedFloats = Message.getRepeatedFloatingPointField(message, fieldNumber);
const repeatedBools = Message.getRepeatedBooleanField(message, fieldNumber);

// Add to repeated field
Message.addToRepeatedField(message, fieldNumber, value);
Message.addToRepeatedField(message, fieldNumber, value, optionalIndex);

// Set entire repeated field
Message.setField(message, fieldNumber, [value1, value2, value3]);

// Example: Working with string arrays
const names = Message.getRepeatedField(message, 1) || [];
Message.addToRepeatedField(message, 1, "New Name");

Type Definitions:

/**
 * @param {!Message} msg The message
 * @param {number} fieldNumber The field number  
 * @param {*} value Value to add
 * @param {number=} opt_index Optional index to insert at
 */

Oneof Fields { .api }

const { Message } = require('google-protobuf');

// Set oneof field (clears other oneof fields)
Message.setOneofField(message, fieldNumber, oneofArray, value);

// Determine which oneof field is set
const activeCase = Message.computeOneofCase(message, oneofArray);

// Example: Working with oneof fields
const ONEOF_CASES = {
  NAME: 1,
  EMAIL: 2, 
  PHONE: 3,
  NONE: 0
};

// Set email field (clears name and phone)
Message.setOneofField(message, 2, [1, 2, 3], "user@example.com");

// Check which field is active
const activeField = Message.computeOneofCase(message, [1, 2, 3]);
switch (activeField) {
  case 1: console.log("Name is set"); break;
  case 2: console.log("Email is set"); break;
  case 3: console.log("Phone is set"); break;
  case 0: console.log("No field is set"); break;
}

Type Definitions:

/**
 * @param {!Message} msg The message
 * @param {number} fieldNumber The field number to set
 * @param {!Array<number>} oneof Array of oneof field numbers
 * @param {*} value Value to set
 */

Wrapper Fields { .api }

Wrapper fields handle Google's well-known wrapper types (StringValue, Int32Value, etc.):

const { Message } = require('google-protobuf');

// Get wrapper field value
const wrapperValue = Message.getWrapperField(message, WrapperConstructor, fieldNumber);
const requiredWrapper = Message.getWrapperField(message, WrapperConstructor, fieldNumber, true);

// Set wrapper field
Message.setWrapperField(message, fieldNumber, value);

// Repeated wrapper fields
const repeatedWrappers = Message.getRepeatedWrapperField(message, WrapperConstructor, fieldNumber);
Message.setRepeatedWrapperField(message, fieldNumber, valueArray);
Message.addToRepeatedWrapperField(message, fieldNumber, value);

// Oneof wrapper fields
Message.setOneofWrapperField(message, fieldNumber, oneofArray, value);

// Example: Working with StringValue wrappers
const { StringValue } = require('./well_known_types_pb');

const stringWrapper = Message.getWrapperField(message, StringValue, 1);
const actualString = stringWrapper ? stringWrapper.getValue() : null;

Message.setWrapperField(message, 1, "Hello World");

Type Definitions:

/**
 * @param {!Message} msg The message
 * @param {!Function} ctor Wrapper constructor
 * @param {number} fieldNumber The field number
 * @param {boolean=} opt_required Whether field is required
 * @return {?Message} Wrapper message or null
 */

Map Fields { .api }

const { Message, Map } = require('google-protobuf');

// Get map field (creates if needed unless noLazyCreate is true)
const mapField = Message.getMapField(message, fieldNumber, false, ValueConstructor);
const existingMap = Message.getMapField(message, fieldNumber, true);

// Work with map field
if (mapField) {
  mapField.set("key1", "value1");
  mapField.set("key2", new ValueConstructor());
  
  const value = mapField.get("key1");
  const hasKey = mapField.has("key2");
  mapField.del("key1");
}

// Example: String to message map
const addressMap = Message.getMapField(message, 5, false, AddressMessage);
if (addressMap) {
  const homeAddress = new AddressMessage();
  homeAddress.setStreet("123 Main St");
  addressMap.set("home", homeAddress);
}

Type Definitions:

/**
 * @param {!Message} msg The message
 * @param {number} fieldNumber The field number
 * @param {boolean=} noLazyCreate Don't create if missing
 * @param {?Function=} valueCtor Value constructor for message maps
 * @return {?Map} The map field or null
 */

Binary Serialization { .api }

const { Message } = require('google-protobuf');

// Instance methods (typically used on generated classes)
const bytes = message.serializeBinary();
const deserializedMessage = MyMessage.deserializeBinary(bytes);

// Extension serialization support
Message.serializeBinaryExtensions(message, writer, extensions, serializeFn);
Message.readBinaryExtension(message, reader, extensions, getExtFn, setExtFn);

// Example: Full serialization cycle
const originalMessage = new MyMessage();
originalMessage.setName("Test");
originalMessage.setValue(42);

// Serialize
const serializedBytes = originalMessage.serializeBinary();

// Deserialize  
const restoredMessage = MyMessage.deserializeBinary(serializedBytes);
console.log(restoredMessage.getName()); // "Test"
console.log(restoredMessage.getValue()); // 42

Message Comparison and Cloning { .api }

const { Message } = require('google-protobuf');

// Message equality
const areEqual = Message.equals(message1, message2);

// Find differences between messages
const differences = Message.difference(message1, message2);

// Clone messages
const shallowClone = Message.clone(message);
const deepClone = Message.cloneMessage(message);
const instanceClone = message.cloneMessage(); // Instance method

// Copy message data
Message.copyInto(sourceMessage, targetMessage);

// Field comparison
const fieldsEqual = Message.compareFields(field1, field2);
const extensionsEqual = Message.compareExtensions(ext1, ext2);

// Example: Message comparison workflow
if (!Message.equals(originalMessage, modifiedMessage)) {
  const diffs = Message.difference(originalMessage, modifiedMessage);
  console.log("Messages differ:", diffs);
  
  // Reset to original
  const restored = Message.cloneMessage(originalMessage);
}

Type Definitions:

/**
 * @param {?Message} m1 First message
 * @param {?Message} m2 Second message  
 * @return {boolean} Whether messages are equal
 */

Conversion Operations { .api }

const { Message } = require('google-protobuf');

// Convert field lists to objects
const objectList = Message.toObjectList(fieldArray, toObjectFn, includeInstance);

// Convert extensions to object representation
const extensionObj = Message.toObjectExtension(
  message, 
  targetObject, 
  extensions, 
  getExtensionFn, 
  includeInstance
);

// Convert entries to map
const map = Message.toMap(entries, keyMapperFn, valueMapperFn, ValueClass);

// Bytes conversion utilities
const base64String = Message.bytesAsB64(bytesValue);
const uint8Array = Message.bytesAsU8(bytesValue);
const base64List = Message.bytesListAsB64(bytesArray);
const uint8List = Message.bytesListAsU8(bytesArray);

// Example: Convert message field to object array
const addressList = Message.getRepeatedField(message, 3);
const addressObjects = Message.toObjectList(
  addressList, 
  (addr) => addr.toObject(),
  true
);

Type Definitions:

/**
 * @param {!Array<!Message>} field Array of messages
 * @param {function(!Message, boolean=): !Object} toObjectFn Conversion function
 * @param {boolean=} opt_includeInstance Include message instance
 * @return {!Array<!Object>} Array of objects
 */

Extension Field Support { .api }

const { Message, ExtensionFieldInfo } = require('google-protobuf');

// Get extension value
const extensionValue = message.getExtension(extensionFieldInfo);

// Set extension value  
message.setExtension(extensionFieldInfo, value);

// Working with extension metadata
const fieldNumber = extensionFieldInfo.fieldIndex;
const fieldName = extensionFieldInfo.fieldName;
const isRepeated = extensionFieldInfo.isRepeated;
const constructor = extensionFieldInfo.ctor;

// Example: Using extensions
const myExtension = new ExtensionFieldInfo(
  1001,           // Field number
  {my_extension: 0}, // Field name object
  null,           // No constructor (primitive)
  null,           // No toObject function
  0               // Not repeated
);

message.setExtension(myExtension, "Extension value");
const value = message.getExtension(myExtension);

Message Registration { .api }

const { Message } = require('google-protobuf');

// Register message type for deserialization
Message.registerMessageType(messageId, MessageConstructor);

// Example: Register custom message type
Message.registerMessageType('my.package.MyMessage', MyMessage);

Type Definitions:

/**
 * @param {string} id Message type identifier
 * @param {!Function} constructor Message constructor
 */