Protocol Buffers JavaScript runtime library for serializing structured data
—
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
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.
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
*/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;// 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
*/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
*/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 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
*/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
*/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()); // 42const { 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
*/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
*/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);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
*/