178 lines
7.2 KiB
Plaintext
178 lines
7.2 KiB
Plaintext
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.MessageType = void 0;
|
|
const message_type_contract_1 = require("./message-type-contract");
|
|
const reflection_info_1 = require("./reflection-info");
|
|
const reflection_type_check_1 = require("./reflection-type-check");
|
|
const reflection_json_reader_1 = require("./reflection-json-reader");
|
|
const reflection_json_writer_1 = require("./reflection-json-writer");
|
|
const reflection_binary_reader_1 = require("./reflection-binary-reader");
|
|
const reflection_binary_writer_1 = require("./reflection-binary-writer");
|
|
const reflection_create_1 = require("./reflection-create");
|
|
const reflection_merge_partial_1 = require("./reflection-merge-partial");
|
|
const json_typings_1 = require("./json-typings");
|
|
const json_format_contract_1 = require("./json-format-contract");
|
|
const reflection_equals_1 = require("./reflection-equals");
|
|
const binary_writer_1 = require("./binary-writer");
|
|
const binary_reader_1 = require("./binary-reader");
|
|
const baseDescriptors = Object.getOwnPropertyDescriptors(Object.getPrototypeOf({}));
|
|
const messageTypeDescriptor = baseDescriptors[message_type_contract_1.MESSAGE_TYPE] = {};
|
|
/**
|
|
* This standard message type provides reflection-based
|
|
* operations to work with a message.
|
|
*/
|
|
class MessageType {
|
|
constructor(name, fields, options) {
|
|
this.defaultCheckDepth = 16;
|
|
this.typeName = name;
|
|
this.fields = fields.map(reflection_info_1.normalizeFieldInfo);
|
|
this.options = options !== null && options !== void 0 ? options : {};
|
|
messageTypeDescriptor.value = this;
|
|
this.messagePrototype = Object.create(null, baseDescriptors);
|
|
this.refTypeCheck = new reflection_type_check_1.ReflectionTypeCheck(this);
|
|
this.refJsonReader = new reflection_json_reader_1.ReflectionJsonReader(this);
|
|
this.refJsonWriter = new reflection_json_writer_1.ReflectionJsonWriter(this);
|
|
this.refBinReader = new reflection_binary_reader_1.ReflectionBinaryReader(this);
|
|
this.refBinWriter = new reflection_binary_writer_1.ReflectionBinaryWriter(this);
|
|
}
|
|
create(value) {
|
|
let message = reflection_create_1.reflectionCreate(this);
|
|
if (value !== undefined) {
|
|
reflection_merge_partial_1.reflectionMergePartial(this, message, value);
|
|
}
|
|
return message;
|
|
}
|
|
/**
|
|
* Clone the message.
|
|
*
|
|
* Unknown fields are discarded.
|
|
*/
|
|
clone(message) {
|
|
let copy = this.create();
|
|
reflection_merge_partial_1.reflectionMergePartial(this, copy, message);
|
|
return copy;
|
|
}
|
|
/**
|
|
* Determines whether two message of the same type have the same field values.
|
|
* Checks for deep equality, traversing repeated fields, oneof groups, maps
|
|
* and messages recursively.
|
|
* Will also return true if both messages are `undefined`.
|
|
*/
|
|
equals(a, b) {
|
|
return reflection_equals_1.reflectionEquals(this, a, b);
|
|
}
|
|
/**
|
|
* Is the given value assignable to our message type
|
|
* and contains no [excess properties](https://www.typescriptlang.org/docs/handbook/interfaces.html#excess-property-checks)?
|
|
*/
|
|
is(arg, depth = this.defaultCheckDepth) {
|
|
return this.refTypeCheck.is(arg, depth, false);
|
|
}
|
|
/**
|
|
* Is the given value assignable to our message type,
|
|
* regardless of [excess properties](https://www.typescriptlang.org/docs/handbook/interfaces.html#excess-property-checks)?
|
|
*/
|
|
isAssignable(arg, depth = this.defaultCheckDepth) {
|
|
return this.refTypeCheck.is(arg, depth, true);
|
|
}
|
|
/**
|
|
* Copy partial data into the target message.
|
|
*/
|
|
mergePartial(target, source) {
|
|
reflection_merge_partial_1.reflectionMergePartial(this, target, source);
|
|
}
|
|
/**
|
|
* Create a new message from binary format.
|
|
*/
|
|
fromBinary(data, options) {
|
|
let opt = binary_reader_1.binaryReadOptions(options);
|
|
return this.internalBinaryRead(opt.readerFactory(data), data.byteLength, opt);
|
|
}
|
|
/**
|
|
* Read a new message from a JSON value.
|
|
*/
|
|
fromJson(json, options) {
|
|
return this.internalJsonRead(json, json_format_contract_1.jsonReadOptions(options));
|
|
}
|
|
/**
|
|
* Read a new message from a JSON string.
|
|
* This is equivalent to `T.fromJson(JSON.parse(json))`.
|
|
*/
|
|
fromJsonString(json, options) {
|
|
let value = JSON.parse(json);
|
|
return this.fromJson(value, options);
|
|
}
|
|
/**
|
|
* Write the message to canonical JSON value.
|
|
*/
|
|
toJson(message, options) {
|
|
return this.internalJsonWrite(message, json_format_contract_1.jsonWriteOptions(options));
|
|
}
|
|
/**
|
|
* Convert the message to canonical JSON string.
|
|
* This is equivalent to `JSON.stringify(T.toJson(t))`
|
|
*/
|
|
toJsonString(message, options) {
|
|
var _a;
|
|
let value = this.toJson(message, options);
|
|
return JSON.stringify(value, null, (_a = options === null || options === void 0 ? void 0 : options.prettySpaces) !== null && _a !== void 0 ? _a : 0);
|
|
}
|
|
/**
|
|
* Write the message to binary format.
|
|
*/
|
|
toBinary(message, options) {
|
|
let opt = binary_writer_1.binaryWriteOptions(options);
|
|
return this.internalBinaryWrite(message, opt.writerFactory(), opt).finish();
|
|
}
|
|
/**
|
|
* This is an internal method. If you just want to read a message from
|
|
* JSON, use `fromJson()` or `fromJsonString()`.
|
|
*
|
|
* Reads JSON value and merges the fields into the target
|
|
* according to protobuf rules. If the target is omitted,
|
|
* a new instance is created first.
|
|
*/
|
|
internalJsonRead(json, options, target) {
|
|
if (json !== null && typeof json == "object" && !Array.isArray(json)) {
|
|
let message = target !== null && target !== void 0 ? target : this.create();
|
|
this.refJsonReader.read(json, message, options);
|
|
return message;
|
|
}
|
|
throw new Error(`Unable to parse message ${this.typeName} from JSON ${json_typings_1.typeofJsonValue(json)}.`);
|
|
}
|
|
/**
|
|
* This is an internal method. If you just want to write a message
|
|
* to JSON, use `toJson()` or `toJsonString().
|
|
*
|
|
* Writes JSON value and returns it.
|
|
*/
|
|
internalJsonWrite(message, options) {
|
|
return this.refJsonWriter.write(message, options);
|
|
}
|
|
/**
|
|
* This is an internal method. If you just want to write a message
|
|
* in binary format, use `toBinary()`.
|
|
*
|
|
* Serializes the message in binary format and appends it to the given
|
|
* writer. Returns passed writer.
|
|
*/
|
|
internalBinaryWrite(message, writer, options) {
|
|
this.refBinWriter.write(message, writer, options);
|
|
return writer;
|
|
}
|
|
/**
|
|
* This is an internal method. If you just want to read a message from
|
|
* binary data, use `fromBinary()`.
|
|
*
|
|
* Reads data from binary format and merges the fields into
|
|
* the target according to protobuf rules. If the target is
|
|
* omitted, a new instance is created first.
|
|
*/
|
|
internalBinaryRead(reader, length, options, target) {
|
|
let message = target !== null && target !== void 0 ? target : this.create();
|
|
this.refBinReader.read(reader, message, options, length);
|
|
return message;
|
|
}
|
|
}
|
|
exports.MessageType = MessageType;
|