--- /dev/null
+// DO NOT EDIT! This is a generated file. Edit the JSDoc in src/*.js instead and run 'npm run types'.
+
+export as namespace protobuf;
+
+/**
+ * Provides common type definitions.
+ * Can also be used to provide additional google types or your own custom types.
+ * @param name Short name as in `google/protobuf/[name].proto` or full file name
+ * @param json JSON definition within `google.protobuf` if a short name, otherwise the file's root definition
+ */
+export function common(name: string, json: { [k: string]: any }): void;
+
+export namespace common {
+
+ /** Properties of a google.protobuf.Any message. */
+ interface IAny {
+ typeUrl?: string;
+ bytes?: Uint8Array;
+ }
+
+ /** Properties of a google.protobuf.Duration message. */
+ interface IDuration {
+ seconds?: (number|Long);
+ nanos?: number;
+ }
+
+ /** Properties of a google.protobuf.Timestamp message. */
+ interface ITimestamp {
+ seconds?: (number|Long);
+ nanos?: number;
+ }
+
+ /** Properties of a google.protobuf.Empty message. */
+ interface IEmpty {
+ }
+
+ /** Properties of a google.protobuf.Struct message. */
+ interface IStruct {
+ fields?: { [k: string]: IValue };
+ }
+
+ /** Properties of a google.protobuf.Value message. */
+ interface IValue {
+ kind?: string;
+ nullValue?: 0;
+ numberValue?: number;
+ stringValue?: string;
+ boolValue?: boolean;
+ structValue?: IStruct;
+ listValue?: IListValue;
+ }
+
+ /** Properties of a google.protobuf.ListValue message. */
+ interface IListValue {
+ values?: IValue[];
+ }
+
+ /** Properties of a google.protobuf.DoubleValue message. */
+ interface IDoubleValue {
+ value?: number;
+ }
+
+ /** Properties of a google.protobuf.FloatValue message. */
+ interface IFloatValue {
+ value?: number;
+ }
+
+ /** Properties of a google.protobuf.Int64Value message. */
+ interface IInt64Value {
+ value?: (number|Long);
+ }
+
+ /** Properties of a google.protobuf.UInt64Value message. */
+ interface IUInt64Value {
+ value?: (number|Long);
+ }
+
+ /** Properties of a google.protobuf.Int32Value message. */
+ interface IInt32Value {
+ value?: number;
+ }
+
+ /** Properties of a google.protobuf.UInt32Value message. */
+ interface IUInt32Value {
+ value?: number;
+ }
+
+ /** Properties of a google.protobuf.BoolValue message. */
+ interface IBoolValue {
+ value?: boolean;
+ }
+
+ /** Properties of a google.protobuf.StringValue message. */
+ interface IStringValue {
+ value?: string;
+ }
+
+ /** Properties of a google.protobuf.BytesValue message. */
+ interface IBytesValue {
+ value?: Uint8Array;
+ }
+
+ /**
+ * Gets the root definition of the specified common proto file.
+ *
+ * Bundled definitions are:
+ * - google/protobuf/any.proto
+ * - google/protobuf/duration.proto
+ * - google/protobuf/empty.proto
+ * - google/protobuf/field_mask.proto
+ * - google/protobuf/struct.proto
+ * - google/protobuf/timestamp.proto
+ * - google/protobuf/wrappers.proto
+ *
+ * @param file Proto file name
+ * @returns Root definition or `null` if not defined
+ */
+ function get(file: string): (INamespace|null);
+}
+
+/** Runtime message from/to plain object converters. */
+export namespace converter {
+
+ /**
+ * Generates a plain object to runtime message converter specific to the specified message type.
+ * @param mtype Message type
+ * @returns Codegen instance
+ */
+ function fromObject(mtype: Type): Codegen;
+
+ /**
+ * Generates a runtime message to plain object converter specific to the specified message type.
+ * @param mtype Message type
+ * @returns Codegen instance
+ */
+ function toObject(mtype: Type): Codegen;
+}
+
+/**
+ * Generates a decoder specific to the specified message type.
+ * @param mtype Message type
+ * @returns Codegen instance
+ */
+export function decoder(mtype: Type): Codegen;
+
+/**
+ * Generates an encoder specific to the specified message type.
+ * @param mtype Message type
+ * @returns Codegen instance
+ */
+export function encoder(mtype: Type): Codegen;
+
+/** Reflected enum. */
+export class Enum extends ReflectionObject {
+
+ /**
+ * Constructs a new enum instance.
+ * @param name Unique name within its namespace
+ * @param [values] Enum values as an object, by name
+ * @param [options] Declared options
+ * @param [comment] The comment for this enum
+ * @param [comments] The value comments for this enum
+ */
+ constructor(name: string, values?: { [k: string]: number }, options?: { [k: string]: any }, comment?: string, comments?: { [k: string]: string });
+
+ /** Enum values by id. */
+ public valuesById: { [k: number]: string };
+
+ /** Enum values by name. */
+ public values: { [k: string]: number };
+
+ /** Enum comment text. */
+ public comment: (string|null);
+
+ /** Value comment texts, if any. */
+ public comments: { [k: string]: string };
+
+ /** Reserved ranges, if any. */
+ public reserved: (number[]|string)[];
+
+ /**
+ * Constructs an enum from an enum descriptor.
+ * @param name Enum name
+ * @param json Enum descriptor
+ * @returns Created enum
+ * @throws {TypeError} If arguments are invalid
+ */
+ public static fromJSON(name: string, json: IEnum): Enum;
+
+ /**
+ * Converts this enum to an enum descriptor.
+ * @param [toJSONOptions] JSON conversion options
+ * @returns Enum descriptor
+ */
+ public toJSON(toJSONOptions?: IToJSONOptions): IEnum;
+
+ /**
+ * Adds a value to this enum.
+ * @param name Value name
+ * @param id Value id
+ * @param [comment] Comment, if any
+ * @returns `this`
+ * @throws {TypeError} If arguments are invalid
+ * @throws {Error} If there is already a value with this name or id
+ */
+ public add(name: string, id: number, comment?: string): Enum;
+
+ /**
+ * Removes a value from this enum
+ * @param name Value name
+ * @returns `this`
+ * @throws {TypeError} If arguments are invalid
+ * @throws {Error} If `name` is not a name of this enum
+ */
+ public remove(name: string): Enum;
+
+ /**
+ * Tests if the specified id is reserved.
+ * @param id Id to test
+ * @returns `true` if reserved, otherwise `false`
+ */
+ public isReservedId(id: number): boolean;
+
+ /**
+ * Tests if the specified name is reserved.
+ * @param name Name to test
+ * @returns `true` if reserved, otherwise `false`
+ */
+ public isReservedName(name: string): boolean;
+}
+
+/** Enum descriptor. */
+export interface IEnum {
+
+ /** Enum values */
+ values: { [k: string]: number };
+
+ /** Enum options */
+ options?: { [k: string]: any };
+}
+
+/** Reflected message field. */
+export class Field extends FieldBase {
+
+ /**
+ * Constructs a new message field instance. Note that {@link MapField|map fields} have their own class.
+ * @param name Unique name within its namespace
+ * @param id Unique id within its namespace
+ * @param type Value type
+ * @param [rule="optional"] Field rule
+ * @param [extend] Extended type if different from parent
+ * @param [options] Declared options
+ */
+ constructor(name: string, id: number, type: string, rule?: (string|{ [k: string]: any }), extend?: (string|{ [k: string]: any }), options?: { [k: string]: any });
+
+ /**
+ * Constructs a field from a field descriptor.
+ * @param name Field name
+ * @param json Field descriptor
+ * @returns Created field
+ * @throws {TypeError} If arguments are invalid
+ */
+ public static fromJSON(name: string, json: IField): Field;
+
+ /** Determines whether this field is packed. Only relevant when repeated and working with proto2. */
+ public readonly packed: boolean;
+
+ /**
+ * Field decorator (TypeScript).
+ * @param fieldId Field id
+ * @param fieldType Field type
+ * @param [fieldRule="optional"] Field rule
+ * @param [defaultValue] Default value
+ * @returns Decorator function
+ */
+ public static d<T extends number | number[] | Long | Long[] | string | string[] | boolean | boolean[] | Uint8Array | Uint8Array[] | Buffer | Buffer[]>(fieldId: number, fieldType: ("double"|"float"|"int32"|"uint32"|"sint32"|"fixed32"|"sfixed32"|"int64"|"uint64"|"sint64"|"fixed64"|"sfixed64"|"string"|"bool"|"bytes"|object), fieldRule?: ("optional"|"required"|"repeated"), defaultValue?: T): FieldDecorator;
+
+ /**
+ * Field decorator (TypeScript).
+ * @param fieldId Field id
+ * @param fieldType Field type
+ * @param [fieldRule="optional"] Field rule
+ * @returns Decorator function
+ */
+ public static d<T extends Message<T>>(fieldId: number, fieldType: (Constructor<T>|string), fieldRule?: ("optional"|"required"|"repeated")): FieldDecorator;
+}
+
+/** Base class of all reflected message fields. This is not an actual class but here for the sake of having consistent type definitions. */
+export class FieldBase extends ReflectionObject {
+
+ /**
+ * Not an actual constructor. Use {@link Field} instead.
+ * @param name Unique name within its namespace
+ * @param id Unique id within its namespace
+ * @param type Value type
+ * @param [rule="optional"] Field rule
+ * @param [extend] Extended type if different from parent
+ * @param [options] Declared options
+ * @param [comment] Comment associated with this field
+ */
+ constructor(name: string, id: number, type: string, rule?: (string|{ [k: string]: any }), extend?: (string|{ [k: string]: any }), options?: { [k: string]: any }, comment?: string);
+
+ /** Field rule, if any. */
+ public rule?: string;
+
+ /** Field type. */
+ public type: string;
+
+ /** Unique field id. */
+ public id: number;
+
+ /** Extended type if different from parent. */
+ public extend?: string;
+
+ /** Whether this field is required. */
+ public required: boolean;
+
+ /** Whether this field is optional. */
+ public optional: boolean;
+
+ /** Whether this field is repeated. */
+ public repeated: boolean;
+
+ /** Whether this field is a map or not. */
+ public map: boolean;
+
+ /** Message this field belongs to. */
+ public message: (Type|null);
+
+ /** OneOf this field belongs to, if any, */
+ public partOf: (OneOf|null);
+
+ /** The field type's default value. */
+ public typeDefault: any;
+
+ /** The field's default value on prototypes. */
+ public defaultValue: any;
+
+ /** Whether this field's value should be treated as a long. */
+ public long: boolean;
+
+ /** Whether this field's value is a buffer. */
+ public bytes: boolean;
+
+ /** Resolved type if not a basic type. */
+ public resolvedType: (Type|Enum|null);
+
+ /** Sister-field within the extended type if a declaring extension field. */
+ public extensionField: (Field|null);
+
+ /** Sister-field within the declaring namespace if an extended field. */
+ public declaringField: (Field|null);
+
+ /** Comment for this field. */
+ public comment: (string|null);
+
+ /**
+ * Converts this field to a field descriptor.
+ * @param [toJSONOptions] JSON conversion options
+ * @returns Field descriptor
+ */
+ public toJSON(toJSONOptions?: IToJSONOptions): IField;
+
+ /**
+ * Resolves this field's type references.
+ * @returns `this`
+ * @throws {Error} If any reference cannot be resolved
+ */
+ public resolve(): Field;
+}
+
+/** Field descriptor. */
+export interface IField {
+
+ /** Field rule */
+ rule?: string;
+
+ /** Field type */
+ type: string;
+
+ /** Field id */
+ id: number;
+
+ /** Field options */
+ options?: { [k: string]: any };
+}
+
+/** Extension field descriptor. */
+export interface IExtensionField extends IField {
+
+ /** Extended type */
+ extend: string;
+}
+
+/**
+ * Decorator function as returned by {@link Field.d} and {@link MapField.d} (TypeScript).
+ * @param prototype Target prototype
+ * @param fieldName Field name
+ */
+type FieldDecorator = (prototype: object, fieldName: string) => void;
+
+/**
+ * A node-style callback as used by {@link load} and {@link Root#load}.
+ * @param error Error, if any, otherwise `null`
+ * @param [root] Root, if there hasn't been an error
+ */
+type LoadCallback = (error: (Error|null), root?: Root) => void;
+
+/**
+ * Loads one or multiple .proto or preprocessed .json files into a common root namespace and calls the callback.
+ * @param filename One or multiple files to load
+ * @param root Root namespace, defaults to create a new one if omitted.
+ * @param callback Callback function
+ * @see {@link Root#load}
+ */
+export function load(filename: (string|string[]), root: Root, callback: LoadCallback): void;
+
+/**
+ * Loads one or multiple .proto or preprocessed .json files into a common root namespace and calls the callback.
+ * @param filename One or multiple files to load
+ * @param callback Callback function
+ * @see {@link Root#load}
+ */
+export function load(filename: (string|string[]), callback: LoadCallback): void;
+
+/**
+ * Loads one or multiple .proto or preprocessed .json files into a common root namespace and returns a promise.
+ * @param filename One or multiple files to load
+ * @param [root] Root namespace, defaults to create a new one if omitted.
+ * @returns Promise
+ * @see {@link Root#load}
+ */
+export function load(filename: (string|string[]), root?: Root): Promise<Root>;
+
+/**
+ * Synchronously loads one or multiple .proto or preprocessed .json files into a common root namespace (node only).
+ * @param filename One or multiple files to load
+ * @param [root] Root namespace, defaults to create a new one if omitted.
+ * @returns Root namespace
+ * @throws {Error} If synchronous fetching is not supported (i.e. in browsers) or if a file's syntax is invalid
+ * @see {@link Root#loadSync}
+ */
+export function loadSync(filename: (string|string[]), root?: Root): Root;
+
+/** Build type, one of `"full"`, `"light"` or `"minimal"`. */
+export const build: string;
+
+/** Reconfigures the library according to the environment. */
+export function configure(): void;
+
+/** Reflected map field. */
+export class MapField extends FieldBase {
+
+ /**
+ * Constructs a new map field instance.
+ * @param name Unique name within its namespace
+ * @param id Unique id within its namespace
+ * @param keyType Key type
+ * @param type Value type
+ * @param [options] Declared options
+ * @param [comment] Comment associated with this field
+ */
+ constructor(name: string, id: number, keyType: string, type: string, options?: { [k: string]: any }, comment?: string);
+
+ /** Key type. */
+ public keyType: string;
+
+ /** Resolved key type if not a basic type. */
+ public resolvedKeyType: (ReflectionObject|null);
+
+ /**
+ * Constructs a map field from a map field descriptor.
+ * @param name Field name
+ * @param json Map field descriptor
+ * @returns Created map field
+ * @throws {TypeError} If arguments are invalid
+ */
+ public static fromJSON(name: string, json: IMapField): MapField;
+
+ /**
+ * Converts this map field to a map field descriptor.
+ * @param [toJSONOptions] JSON conversion options
+ * @returns Map field descriptor
+ */
+ public toJSON(toJSONOptions?: IToJSONOptions): IMapField;
+
+ /**
+ * Map field decorator (TypeScript).
+ * @param fieldId Field id
+ * @param fieldKeyType Field key type
+ * @param fieldValueType Field value type
+ * @returns Decorator function
+ */
+ public static d<T extends { [key: string]: number | Long | string | boolean | Uint8Array | Buffer | number[] | Message<{}> }>(fieldId: number, fieldKeyType: ("int32"|"uint32"|"sint32"|"fixed32"|"sfixed32"|"int64"|"uint64"|"sint64"|"fixed64"|"sfixed64"|"bool"|"string"), fieldValueType: ("double"|"float"|"int32"|"uint32"|"sint32"|"fixed32"|"sfixed32"|"int64"|"uint64"|"sint64"|"fixed64"|"sfixed64"|"bool"|"string"|"bytes"|object|Constructor<{}>)): FieldDecorator;
+}
+
+/** Map field descriptor. */
+export interface IMapField extends IField {
+
+ /** Key type */
+ keyType: string;
+}
+
+/** Extension map field descriptor. */
+export interface IExtensionMapField extends IMapField {
+
+ /** Extended type */
+ extend: string;
+}
+
+/** Abstract runtime message. */
+export class Message<T extends object = object> {
+
+ /**
+ * Constructs a new message instance.
+ * @param [properties] Properties to set
+ */
+ constructor(properties?: Properties<T>);
+
+ /** Reference to the reflected type. */
+ public static readonly $type: Type;
+
+ /** Reference to the reflected type. */
+ public readonly $type: Type;
+
+ /**
+ * Creates a new message of this type using the specified properties.
+ * @param [properties] Properties to set
+ * @returns Message instance
+ */
+ public static create<T extends Message<T>>(this: Constructor<T>, properties?: { [k: string]: any }): Message<T>;
+
+ /**
+ * Encodes a message of this type.
+ * @param message Message to encode
+ * @param [writer] Writer to use
+ * @returns Writer
+ */
+ public static encode<T extends Message<T>>(this: Constructor<T>, message: (T|{ [k: string]: any }), writer?: Writer): Writer;
+
+ /**
+ * Encodes a message of this type preceeded by its length as a varint.
+ * @param message Message to encode
+ * @param [writer] Writer to use
+ * @returns Writer
+ */
+ public static encodeDelimited<T extends Message<T>>(this: Constructor<T>, message: (T|{ [k: string]: any }), writer?: Writer): Writer;
+
+ /**
+ * Decodes a message of this type.
+ * @param reader Reader or buffer to decode
+ * @returns Decoded message
+ */
+ public static decode<T extends Message<T>>(this: Constructor<T>, reader: (Reader|Uint8Array)): T;
+
+ /**
+ * Decodes a message of this type preceeded by its length as a varint.
+ * @param reader Reader or buffer to decode
+ * @returns Decoded message
+ */
+ public static decodeDelimited<T extends Message<T>>(this: Constructor<T>, reader: (Reader|Uint8Array)): T;
+
+ /**
+ * Verifies a message of this type.
+ * @param message Plain object to verify
+ * @returns `null` if valid, otherwise the reason why it is not
+ */
+ public static verify(message: { [k: string]: any }): (string|null);
+
+ /**
+ * Creates a new message of this type from a plain object. Also converts values to their respective internal types.
+ * @param object Plain object
+ * @returns Message instance
+ */
+ public static fromObject<T extends Message<T>>(this: Constructor<T>, object: { [k: string]: any }): T;
+
+ /**
+ * Creates a plain object from a message of this type. Also converts values to other types if specified.
+ * @param message Message instance
+ * @param [options] Conversion options
+ * @returns Plain object
+ */
+ public static toObject<T extends Message<T>>(this: Constructor<T>, message: T, options?: IConversionOptions): { [k: string]: any };
+
+ /**
+ * Converts this message to JSON.
+ * @returns JSON object
+ */
+ public toJSON(): { [k: string]: any };
+}
+
+/** Reflected service method. */
+export class Method extends ReflectionObject {
+
+ /**
+ * Constructs a new service method instance.
+ * @param name Method name
+ * @param type Method type, usually `"rpc"`
+ * @param requestType Request message type
+ * @param responseType Response message type
+ * @param [requestStream] Whether the request is streamed
+ * @param [responseStream] Whether the response is streamed
+ * @param [options] Declared options
+ * @param [comment] The comment for this method
+ */
+ constructor(name: string, type: (string|undefined), requestType: string, responseType: string, requestStream?: (boolean|{ [k: string]: any }), responseStream?: (boolean|{ [k: string]: any }), options?: { [k: string]: any }, comment?: string);
+
+ /** Method type. */
+ public type: string;
+
+ /** Request type. */
+ public requestType: string;
+
+ /** Whether requests are streamed or not. */
+ public requestStream?: boolean;
+
+ /** Response type. */
+ public responseType: string;
+
+ /** Whether responses are streamed or not. */
+ public responseStream?: boolean;
+
+ /** Resolved request type. */
+ public resolvedRequestType: (Type|null);
+
+ /** Resolved response type. */
+ public resolvedResponseType: (Type|null);
+
+ /** Comment for this method */
+ public comment: (string|null);
+
+ /**
+ * Constructs a method from a method descriptor.
+ * @param name Method name
+ * @param json Method descriptor
+ * @returns Created method
+ * @throws {TypeError} If arguments are invalid
+ */
+ public static fromJSON(name: string, json: IMethod): Method;
+
+ /**
+ * Converts this method to a method descriptor.
+ * @param [toJSONOptions] JSON conversion options
+ * @returns Method descriptor
+ */
+ public toJSON(toJSONOptions?: IToJSONOptions): IMethod;
+}
+
+/** Method descriptor. */
+export interface IMethod {
+
+ /** Method type */
+ type?: string;
+
+ /** Request type */
+ requestType: string;
+
+ /** Response type */
+ responseType: string;
+
+ /** Whether requests are streamed */
+ requestStream?: boolean;
+
+ /** Whether responses are streamed */
+ responseStream?: boolean;
+
+ /** Method options */
+ options?: { [k: string]: any };
+}
+
+/** Reflected namespace. */
+export class Namespace extends NamespaceBase {
+
+ /**
+ * Constructs a new namespace instance.
+ * @param name Namespace name
+ * @param [options] Declared options
+ */
+ constructor(name: string, options?: { [k: string]: any });
+
+ /**
+ * Constructs a namespace from JSON.
+ * @param name Namespace name
+ * @param json JSON object
+ * @returns Created namespace
+ * @throws {TypeError} If arguments are invalid
+ */
+ public static fromJSON(name: string, json: { [k: string]: any }): Namespace;
+
+ /**
+ * Converts an array of reflection objects to JSON.
+ * @param array Object array
+ * @param [toJSONOptions] JSON conversion options
+ * @returns JSON object or `undefined` when array is empty
+ */
+ public static arrayToJSON(array: ReflectionObject[], toJSONOptions?: IToJSONOptions): ({ [k: string]: any }|undefined);
+
+ /**
+ * Tests if the specified id is reserved.
+ * @param reserved Array of reserved ranges and names
+ * @param id Id to test
+ * @returns `true` if reserved, otherwise `false`
+ */
+ public static isReservedId(reserved: ((number[]|string)[]|undefined), id: number): boolean;
+
+ /**
+ * Tests if the specified name is reserved.
+ * @param reserved Array of reserved ranges and names
+ * @param name Name to test
+ * @returns `true` if reserved, otherwise `false`
+ */
+ public static isReservedName(reserved: ((number[]|string)[]|undefined), name: string): boolean;
+}
+
+/** Base class of all reflection objects containing nested objects. This is not an actual class but here for the sake of having consistent type definitions. */
+export abstract class NamespaceBase extends ReflectionObject {
+
+ /** Nested objects by name. */
+ public nested?: { [k: string]: ReflectionObject };
+
+ /** Nested objects of this namespace as an array for iteration. */
+ public readonly nestedArray: ReflectionObject[];
+
+ /**
+ * Converts this namespace to a namespace descriptor.
+ * @param [toJSONOptions] JSON conversion options
+ * @returns Namespace descriptor
+ */
+ public toJSON(toJSONOptions?: IToJSONOptions): INamespace;
+
+ /**
+ * Adds nested objects to this namespace from nested object descriptors.
+ * @param nestedJson Any nested object descriptors
+ * @returns `this`
+ */
+ public addJSON(nestedJson: { [k: string]: AnyNestedObject }): Namespace;
+
+ /**
+ * Gets the nested object of the specified name.
+ * @param name Nested object name
+ * @returns The reflection object or `null` if it doesn't exist
+ */
+ public get(name: string): (ReflectionObject|null);
+
+ /**
+ * Gets the values of the nested {@link Enum|enum} of the specified name.
+ * This methods differs from {@link Namespace#get|get} in that it returns an enum's values directly and throws instead of returning `null`.
+ * @param name Nested enum name
+ * @returns Enum values
+ * @throws {Error} If there is no such enum
+ */
+ public getEnum(name: string): { [k: string]: number };
+
+ /**
+ * Adds a nested object to this namespace.
+ * @param object Nested object to add
+ * @returns `this`
+ * @throws {TypeError} If arguments are invalid
+ * @throws {Error} If there is already a nested object with this name
+ */
+ public add(object: ReflectionObject): Namespace;
+
+ /**
+ * Removes a nested object from this namespace.
+ * @param object Nested object to remove
+ * @returns `this`
+ * @throws {TypeError} If arguments are invalid
+ * @throws {Error} If `object` is not a member of this namespace
+ */
+ public remove(object: ReflectionObject): Namespace;
+
+ /**
+ * Defines additial namespaces within this one if not yet existing.
+ * @param path Path to create
+ * @param [json] Nested types to create from JSON
+ * @returns Pointer to the last namespace created or `this` if path is empty
+ */
+ public define(path: (string|string[]), json?: any): Namespace;
+
+ /**
+ * Resolves this namespace's and all its nested objects' type references. Useful to validate a reflection tree, but comes at a cost.
+ * @returns `this`
+ */
+ public resolveAll(): Namespace;
+
+ /**
+ * Recursively looks up the reflection object matching the specified path in the scope of this namespace.
+ * @param path Path to look up
+ * @param filterTypes Filter types, any combination of the constructors of `protobuf.Type`, `protobuf.Enum`, `protobuf.Service` etc.
+ * @param [parentAlreadyChecked=false] If known, whether the parent has already been checked
+ * @returns Looked up object or `null` if none could be found
+ */
+ public lookup(path: (string|string[]), filterTypes: (any|any[]), parentAlreadyChecked?: boolean): (ReflectionObject|null);
+
+ /**
+ * Looks up the reflection object at the specified path, relative to this namespace.
+ * @param path Path to look up
+ * @param [parentAlreadyChecked=false] Whether the parent has already been checked
+ * @returns Looked up object or `null` if none could be found
+ */
+ public lookup(path: (string|string[]), parentAlreadyChecked?: boolean): (ReflectionObject|null);
+
+ /**
+ * Looks up the {@link Type|type} at the specified path, relative to this namespace.
+ * Besides its signature, this methods differs from {@link Namespace#lookup|lookup} in that it throws instead of returning `null`.
+ * @param path Path to look up
+ * @returns Looked up type
+ * @throws {Error} If `path` does not point to a type
+ */
+ public lookupType(path: (string|string[])): Type;
+
+ /**
+ * Looks up the values of the {@link Enum|enum} at the specified path, relative to this namespace.
+ * Besides its signature, this methods differs from {@link Namespace#lookup|lookup} in that it throws instead of returning `null`.
+ * @param path Path to look up
+ * @returns Looked up enum
+ * @throws {Error} If `path` does not point to an enum
+ */
+ public lookupEnum(path: (string|string[])): Enum;
+
+ /**
+ * Looks up the {@link Type|type} or {@link Enum|enum} at the specified path, relative to this namespace.
+ * Besides its signature, this methods differs from {@link Namespace#lookup|lookup} in that it throws instead of returning `null`.
+ * @param path Path to look up
+ * @returns Looked up type or enum
+ * @throws {Error} If `path` does not point to a type or enum
+ */
+ public lookupTypeOrEnum(path: (string|string[])): Type;
+
+ /**
+ * Looks up the {@link Service|service} at the specified path, relative to this namespace.
+ * Besides its signature, this methods differs from {@link Namespace#lookup|lookup} in that it throws instead of returning `null`.
+ * @param path Path to look up
+ * @returns Looked up service
+ * @throws {Error} If `path` does not point to a service
+ */
+ public lookupService(path: (string|string[])): Service;
+}
+
+/** Namespace descriptor. */
+export interface INamespace {
+
+ /** Namespace options */
+ options?: { [k: string]: any };
+
+ /** Nested object descriptors */
+ nested?: { [k: string]: AnyNestedObject };
+}
+
+/** Any extension field descriptor. */
+type AnyExtensionField = (IExtensionField|IExtensionMapField);
+
+/** Any nested object descriptor. */
+type AnyNestedObject = (IEnum|IType|IService|AnyExtensionField|INamespace);
+
+/** Base class of all reflection objects. */
+export abstract class ReflectionObject {
+
+ /** Options. */
+ public options?: { [k: string]: any };
+
+ /** Parsed Options. */
+ public parsedOptions?: { [k: string]: any[] };
+
+ /** Unique name within its namespace. */
+ public name: string;
+
+ /** Parent namespace. */
+ public parent: (Namespace|null);
+
+ /** Whether already resolved or not. */
+ public resolved: boolean;
+
+ /** Comment text, if any. */
+ public comment: (string|null);
+
+ /** Defining file name. */
+ public filename: (string|null);
+
+ /** Reference to the root namespace. */
+ public readonly root: Root;
+
+ /** Full name including leading dot. */
+ public readonly fullName: string;
+
+ /**
+ * Converts this reflection object to its descriptor representation.
+ * @returns Descriptor
+ */
+ public toJSON(): { [k: string]: any };
+
+ /**
+ * Called when this object is added to a parent.
+ * @param parent Parent added to
+ */
+ public onAdd(parent: ReflectionObject): void;
+
+ /**
+ * Called when this object is removed from a parent.
+ * @param parent Parent removed from
+ */
+ public onRemove(parent: ReflectionObject): void;
+
+ /**
+ * Resolves this objects type references.
+ * @returns `this`
+ */
+ public resolve(): ReflectionObject;
+
+ /**
+ * Gets an option value.
+ * @param name Option name
+ * @returns Option value or `undefined` if not set
+ */
+ public getOption(name: string): any;
+
+ /**
+ * Sets an option.
+ * @param name Option name
+ * @param value Option value
+ * @param [ifNotSet] Sets the option only if it isn't currently set
+ * @returns `this`
+ */
+ public setOption(name: string, value: any, ifNotSet?: boolean): ReflectionObject;
+
+ /**
+ * Sets a parsed option.
+ * @param name parsed Option name
+ * @param value Option value
+ * @param propName dot '.' delimited full path of property within the option to set. if undefined\empty, will add a new option with that value
+ * @returns `this`
+ */
+ public setParsedOption(name: string, value: any, propName: string): ReflectionObject;
+
+ /**
+ * Sets multiple options.
+ * @param options Options to set
+ * @param [ifNotSet] Sets an option only if it isn't currently set
+ * @returns `this`
+ */
+ public setOptions(options: { [k: string]: any }, ifNotSet?: boolean): ReflectionObject;
+
+ /**
+ * Converts this instance to its string representation.
+ * @returns Class name[, space, full name]
+ */
+ public toString(): string;
+}
+
+/** Reflected oneof. */
+export class OneOf extends ReflectionObject {
+
+ /**
+ * Constructs a new oneof instance.
+ * @param name Oneof name
+ * @param [fieldNames] Field names
+ * @param [options] Declared options
+ * @param [comment] Comment associated with this field
+ */
+ constructor(name: string, fieldNames?: (string[]|{ [k: string]: any }), options?: { [k: string]: any }, comment?: string);
+
+ /** Field names that belong to this oneof. */
+ public oneof: string[];
+
+ /** Fields that belong to this oneof as an array for iteration. */
+ public readonly fieldsArray: Field[];
+
+ /** Comment for this field. */
+ public comment: (string|null);
+
+ /**
+ * Constructs a oneof from a oneof descriptor.
+ * @param name Oneof name
+ * @param json Oneof descriptor
+ * @returns Created oneof
+ * @throws {TypeError} If arguments are invalid
+ */
+ public static fromJSON(name: string, json: IOneOf): OneOf;
+
+ /**
+ * Converts this oneof to a oneof descriptor.
+ * @param [toJSONOptions] JSON conversion options
+ * @returns Oneof descriptor
+ */
+ public toJSON(toJSONOptions?: IToJSONOptions): IOneOf;
+
+ /**
+ * Adds a field to this oneof and removes it from its current parent, if any.
+ * @param field Field to add
+ * @returns `this`
+ */
+ public add(field: Field): OneOf;
+
+ /**
+ * Removes a field from this oneof and puts it back to the oneof's parent.
+ * @param field Field to remove
+ * @returns `this`
+ */
+ public remove(field: Field): OneOf;
+
+ /**
+ * OneOf decorator (TypeScript).
+ * @param fieldNames Field names
+ * @returns Decorator function
+ */
+ public static d<T extends string>(...fieldNames: string[]): OneOfDecorator;
+}
+
+/** Oneof descriptor. */
+export interface IOneOf {
+
+ /** Oneof field names */
+ oneof: string[];
+
+ /** Oneof options */
+ options?: { [k: string]: any };
+}
+
+/**
+ * Decorator function as returned by {@link OneOf.d} (TypeScript).
+ * @param prototype Target prototype
+ * @param oneofName OneOf name
+ */
+type OneOfDecorator = (prototype: object, oneofName: string) => void;
+
+/**
+ * Parses the given .proto source and returns an object with the parsed contents.
+ * @param source Source contents
+ * @param [options] Parse options. Defaults to {@link parse.defaults} when omitted.
+ * @returns Parser result
+ */
+export function parse(source: string, options?: IParseOptions): IParserResult;
+
+/** Result object returned from {@link parse}. */
+export interface IParserResult {
+
+ /** Package name, if declared */
+ package: (string|undefined);
+
+ /** Imports, if any */
+ imports: (string[]|undefined);
+
+ /** Weak imports, if any */
+ weakImports: (string[]|undefined);
+
+ /** Syntax, if specified (either `"proto2"` or `"proto3"`) */
+ syntax: (string|undefined);
+
+ /** Populated root instance */
+ root: Root;
+}
+
+/** Options modifying the behavior of {@link parse}. */
+export interface IParseOptions {
+
+ /** Keeps field casing instead of converting to camel case */
+ keepCase?: boolean;
+
+ /** Recognize double-slash comments in addition to doc-block comments. */
+ alternateCommentMode?: boolean;
+
+ /** Use trailing comment when both leading comment and trailing comment exist. */
+ preferTrailingComment?: boolean;
+}
+
+/** Options modifying the behavior of JSON serialization. */
+export interface IToJSONOptions {
+
+ /** Serializes comments. */
+ keepComments?: boolean;
+}
+
+/**
+ * Parses the given .proto source and returns an object with the parsed contents.
+ * @param source Source contents
+ * @param root Root to populate
+ * @param [options] Parse options. Defaults to {@link parse.defaults} when omitted.
+ * @returns Parser result
+ */
+export function parse(source: string, root: Root, options?: IParseOptions): IParserResult;
+
+/** Wire format reader using `Uint8Array` if available, otherwise `Array`. */
+export class Reader {
+
+ /**
+ * Constructs a new reader instance using the specified buffer.
+ * @param buffer Buffer to read from
+ */
+ constructor(buffer: Uint8Array);
+
+ /** Read buffer. */
+ public buf: Uint8Array;
+
+ /** Read buffer position. */
+ public pos: number;
+
+ /** Read buffer length. */
+ public len: number;
+
+ /**
+ * Creates a new reader using the specified buffer.
+ * @param buffer Buffer to read from
+ * @returns A {@link BufferReader} if `buffer` is a Buffer, otherwise a {@link Reader}
+ * @throws {Error} If `buffer` is not a valid buffer
+ */
+ public static create(buffer: (Uint8Array|Buffer)): (Reader|BufferReader);
+
+ /**
+ * Reads a varint as an unsigned 32 bit value.
+ * @returns Value read
+ */
+ public uint32(): number;
+
+ /**
+ * Reads a varint as a signed 32 bit value.
+ * @returns Value read
+ */
+ public int32(): number;
+
+ /**
+ * Reads a zig-zag encoded varint as a signed 32 bit value.
+ * @returns Value read
+ */
+ public sint32(): number;
+
+ /**
+ * Reads a varint as a signed 64 bit value.
+ * @returns Value read
+ */
+ public int64(): Long;
+
+ /**
+ * Reads a varint as an unsigned 64 bit value.
+ * @returns Value read
+ */
+ public uint64(): Long;
+
+ /**
+ * Reads a zig-zag encoded varint as a signed 64 bit value.
+ * @returns Value read
+ */
+ public sint64(): Long;
+
+ /**
+ * Reads a varint as a boolean.
+ * @returns Value read
+ */
+ public bool(): boolean;
+
+ /**
+ * Reads fixed 32 bits as an unsigned 32 bit integer.
+ * @returns Value read
+ */
+ public fixed32(): number;
+
+ /**
+ * Reads fixed 32 bits as a signed 32 bit integer.
+ * @returns Value read
+ */
+ public sfixed32(): number;
+
+ /**
+ * Reads fixed 64 bits.
+ * @returns Value read
+ */
+ public fixed64(): Long;
+
+ /**
+ * Reads zig-zag encoded fixed 64 bits.
+ * @returns Value read
+ */
+ public sfixed64(): Long;
+
+ /**
+ * Reads a float (32 bit) as a number.
+ * @returns Value read
+ */
+ public float(): number;
+
+ /**
+ * Reads a double (64 bit float) as a number.
+ * @returns Value read
+ */
+ public double(): number;
+
+ /**
+ * Reads a sequence of bytes preceeded by its length as a varint.
+ * @returns Value read
+ */
+ public bytes(): Uint8Array;
+
+ /**
+ * Reads a string preceeded by its byte length as a varint.
+ * @returns Value read
+ */
+ public string(): string;
+
+ /**
+ * Skips the specified number of bytes if specified, otherwise skips a varint.
+ * @param [length] Length if known, otherwise a varint is assumed
+ * @returns `this`
+ */
+ public skip(length?: number): Reader;
+
+ /**
+ * Skips the next element of the specified wire type.
+ * @param wireType Wire type received
+ * @returns `this`
+ */
+ public skipType(wireType: number): Reader;
+}
+
+/** Wire format reader using node buffers. */
+export class BufferReader extends Reader {
+
+ /**
+ * Constructs a new buffer reader instance.
+ * @param buffer Buffer to read from
+ */
+ constructor(buffer: Buffer);
+
+ /**
+ * Reads a sequence of bytes preceeded by its length as a varint.
+ * @returns Value read
+ */
+ public bytes(): Buffer;
+}
+
+/** Root namespace wrapping all types, enums, services, sub-namespaces etc. that belong together. */
+export class Root extends NamespaceBase {
+
+ /**
+ * Constructs a new root namespace instance.
+ * @param [options] Top level options
+ */
+ constructor(options?: { [k: string]: any });
+
+ /** Deferred extension fields. */
+ public deferred: Field[];
+
+ /** Resolved file names of loaded files. */
+ public files: string[];
+
+ /**
+ * Loads a namespace descriptor into a root namespace.
+ * @param json Nameespace descriptor
+ * @param [root] Root namespace, defaults to create a new one if omitted
+ * @returns Root namespace
+ */
+ public static fromJSON(json: INamespace, root?: Root): Root;
+
+ /**
+ * Resolves the path of an imported file, relative to the importing origin.
+ * This method exists so you can override it with your own logic in case your imports are scattered over multiple directories.
+ * @param origin The file name of the importing file
+ * @param target The file name being imported
+ * @returns Resolved path to `target` or `null` to skip the file
+ */
+ public resolvePath(origin: string, target: string): (string|null);
+
+ /**
+ * Fetch content from file path or url
+ * This method exists so you can override it with your own logic.
+ * @param path File path or url
+ * @param callback Callback function
+ */
+ public fetch(path: string, callback: FetchCallback): void;
+
+ /**
+ * Loads one or multiple .proto or preprocessed .json files into this root namespace and calls the callback.
+ * @param filename Names of one or multiple files to load
+ * @param options Parse options
+ * @param callback Callback function
+ */
+ public load(filename: (string|string[]), options: IParseOptions, callback: LoadCallback): void;
+
+ /**
+ * Loads one or multiple .proto or preprocessed .json files into this root namespace and calls the callback.
+ * @param filename Names of one or multiple files to load
+ * @param callback Callback function
+ */
+ public load(filename: (string|string[]), callback: LoadCallback): void;
+
+ /**
+ * Loads one or multiple .proto or preprocessed .json files into this root namespace and returns a promise.
+ * @param filename Names of one or multiple files to load
+ * @param [options] Parse options. Defaults to {@link parse.defaults} when omitted.
+ * @returns Promise
+ */
+ public load(filename: (string|string[]), options?: IParseOptions): Promise<Root>;
+
+ /**
+ * Synchronously loads one or multiple .proto or preprocessed .json files into this root namespace (node only).
+ * @param filename Names of one or multiple files to load
+ * @param [options] Parse options. Defaults to {@link parse.defaults} when omitted.
+ * @returns Root namespace
+ * @throws {Error} If synchronous fetching is not supported (i.e. in browsers) or if a file's syntax is invalid
+ */
+ public loadSync(filename: (string|string[]), options?: IParseOptions): Root;
+}
+
+/**
+ * Named roots.
+ * This is where pbjs stores generated structures (the option `-r, --root` specifies a name).
+ * Can also be used manually to make roots available accross modules.
+ */
+export let roots: { [k: string]: Root };
+
+/** Streaming RPC helpers. */
+export namespace rpc {
+
+ /**
+ * A service method callback as used by {@link rpc.ServiceMethod|ServiceMethod}.
+ *
+ * Differs from {@link RPCImplCallback} in that it is an actual callback of a service method which may not return `response = null`.
+ * @param error Error, if any
+ * @param [response] Response message
+ */
+ type ServiceMethodCallback<TRes extends Message<TRes>> = (error: (Error|null), response?: TRes) => void;
+
+ /**
+ * A service method part of a {@link rpc.Service} as created by {@link Service.create}.
+ * @param request Request message or plain object
+ * @param [callback] Node-style callback called with the error, if any, and the response message
+ * @returns Promise if `callback` has been omitted, otherwise `undefined`
+ */
+ type ServiceMethod<TReq extends Message<TReq>, TRes extends Message<TRes>> = (request: (TReq|Properties<TReq>), callback?: rpc.ServiceMethodCallback<TRes>) => Promise<Message<TRes>>;
+
+ /** An RPC service as returned by {@link Service#create}. */
+ class Service extends util.EventEmitter {
+
+ /**
+ * Constructs a new RPC service instance.
+ * @param rpcImpl RPC implementation
+ * @param [requestDelimited=false] Whether requests are length-delimited
+ * @param [responseDelimited=false] Whether responses are length-delimited
+ */
+ constructor(rpcImpl: RPCImpl, requestDelimited?: boolean, responseDelimited?: boolean);
+
+ /** RPC implementation. Becomes `null` once the service is ended. */
+ public rpcImpl: (RPCImpl|null);
+
+ /** Whether requests are length-delimited. */
+ public requestDelimited: boolean;
+
+ /** Whether responses are length-delimited. */
+ public responseDelimited: boolean;
+
+ /**
+ * Calls a service method through {@link rpc.Service#rpcImpl|rpcImpl}.
+ * @param method Reflected or static method
+ * @param requestCtor Request constructor
+ * @param responseCtor Response constructor
+ * @param request Request message or plain object
+ * @param callback Service callback
+ */
+ public rpcCall<TReq extends Message<TReq>, TRes extends Message<TRes>>(method: (Method|rpc.ServiceMethod<TReq, TRes>), requestCtor: Constructor<TReq>, responseCtor: Constructor<TRes>, request: (TReq|Properties<TReq>), callback: rpc.ServiceMethodCallback<TRes>): void;
+
+ /**
+ * Ends this service and emits the `end` event.
+ * @param [endedByRPC=false] Whether the service has been ended by the RPC implementation.
+ * @returns `this`
+ */
+ public end(endedByRPC?: boolean): rpc.Service;
+ }
+}
+
+/**
+ * RPC implementation passed to {@link Service#create} performing a service request on network level, i.e. by utilizing http requests or websockets.
+ * @param method Reflected or static method being called
+ * @param requestData Request data
+ * @param callback Callback function
+ */
+type RPCImpl = (method: (Method|rpc.ServiceMethod<Message<{}>, Message<{}>>), requestData: Uint8Array, callback: RPCImplCallback) => void;
+
+/**
+ * Node-style callback as used by {@link RPCImpl}.
+ * @param error Error, if any, otherwise `null`
+ * @param [response] Response data or `null` to signal end of stream, if there hasn't been an error
+ */
+type RPCImplCallback = (error: (Error|null), response?: (Uint8Array|null)) => void;
+
+/** Reflected service. */
+export class Service extends NamespaceBase {
+
+ /**
+ * Constructs a new service instance.
+ * @param name Service name
+ * @param [options] Service options
+ * @throws {TypeError} If arguments are invalid
+ */
+ constructor(name: string, options?: { [k: string]: any });
+
+ /** Service methods. */
+ public methods: { [k: string]: Method };
+
+ /**
+ * Constructs a service from a service descriptor.
+ * @param name Service name
+ * @param json Service descriptor
+ * @returns Created service
+ * @throws {TypeError} If arguments are invalid
+ */
+ public static fromJSON(name: string, json: IService): Service;
+
+ /**
+ * Converts this service to a service descriptor.
+ * @param [toJSONOptions] JSON conversion options
+ * @returns Service descriptor
+ */
+ public toJSON(toJSONOptions?: IToJSONOptions): IService;
+
+ /** Methods of this service as an array for iteration. */
+ public readonly methodsArray: Method[];
+
+ /**
+ * Creates a runtime service using the specified rpc implementation.
+ * @param rpcImpl RPC implementation
+ * @param [requestDelimited=false] Whether requests are length-delimited
+ * @param [responseDelimited=false] Whether responses are length-delimited
+ * @returns RPC service. Useful where requests and/or responses are streamed.
+ */
+ public create(rpcImpl: RPCImpl, requestDelimited?: boolean, responseDelimited?: boolean): rpc.Service;
+}
+
+/** Service descriptor. */
+export interface IService extends INamespace {
+
+ /** Method descriptors */
+ methods: { [k: string]: IMethod };
+}
+
+/**
+ * Gets the next token and advances.
+ * @returns Next token or `null` on eof
+ */
+type TokenizerHandleNext = () => (string|null);
+
+/**
+ * Peeks for the next token.
+ * @returns Next token or `null` on eof
+ */
+type TokenizerHandlePeek = () => (string|null);
+
+/**
+ * Pushes a token back to the stack.
+ * @param token Token
+ */
+type TokenizerHandlePush = (token: string) => void;
+
+/**
+ * Skips the next token.
+ * @param expected Expected token
+ * @param [optional=false] If optional
+ * @returns Whether the token matched
+ * @throws {Error} If the token didn't match and is not optional
+ */
+type TokenizerHandleSkip = (expected: string, optional?: boolean) => boolean;
+
+/**
+ * Gets the comment on the previous line or, alternatively, the line comment on the specified line.
+ * @param [line] Line number
+ * @returns Comment text or `null` if none
+ */
+type TokenizerHandleCmnt = (line?: number) => (string|null);
+
+/** Handle object returned from {@link tokenize}. */
+export interface ITokenizerHandle {
+
+ /** Gets the next token and advances (`null` on eof) */
+ next: TokenizerHandleNext;
+
+ /** Peeks for the next token (`null` on eof) */
+ peek: TokenizerHandlePeek;
+
+ /** Pushes a token back to the stack */
+ push: TokenizerHandlePush;
+
+ /** Skips a token, returns its presence and advances or, if non-optional and not present, throws */
+ skip: TokenizerHandleSkip;
+
+ /** Gets the comment on the previous line or the line comment on the specified line, if any */
+ cmnt: TokenizerHandleCmnt;
+
+ /** Current line number */
+ line: number;
+}
+
+/**
+ * Tokenizes the given .proto source and returns an object with useful utility functions.
+ * @param source Source contents
+ * @param alternateCommentMode Whether we should activate alternate comment parsing mode.
+ * @returns Tokenizer handle
+ */
+export function tokenize(source: string, alternateCommentMode: boolean): ITokenizerHandle;
+
+export namespace tokenize {
+
+ /**
+ * Unescapes a string.
+ * @param str String to unescape
+ * @returns Unescaped string
+ */
+ function unescape(str: string): string;
+}
+
+/** Reflected message type. */
+export class Type extends NamespaceBase {
+
+ /**
+ * Constructs a new reflected message type instance.
+ * @param name Message name
+ * @param [options] Declared options
+ */
+ constructor(name: string, options?: { [k: string]: any });
+
+ /** Message fields. */
+ public fields: { [k: string]: Field };
+
+ /** Oneofs declared within this namespace, if any. */
+ public oneofs: { [k: string]: OneOf };
+
+ /** Extension ranges, if any. */
+ public extensions: number[][];
+
+ /** Reserved ranges, if any. */
+ public reserved: (number[]|string)[];
+
+ /** Message fields by id. */
+ public readonly fieldsById: { [k: number]: Field };
+
+ /** Fields of this message as an array for iteration. */
+ public readonly fieldsArray: Field[];
+
+ /** Oneofs of this message as an array for iteration. */
+ public readonly oneofsArray: OneOf[];
+
+ /**
+ * The registered constructor, if any registered, otherwise a generic constructor.
+ * Assigning a function replaces the internal constructor. If the function does not extend {@link Message} yet, its prototype will be setup accordingly and static methods will be populated. If it already extends {@link Message}, it will just replace the internal constructor.
+ */
+ public ctor: Constructor<{}>;
+
+ /**
+ * Generates a constructor function for the specified type.
+ * @param mtype Message type
+ * @returns Codegen instance
+ */
+ public static generateConstructor(mtype: Type): Codegen;
+
+ /**
+ * Creates a message type from a message type descriptor.
+ * @param name Message name
+ * @param json Message type descriptor
+ * @returns Created message type
+ */
+ public static fromJSON(name: string, json: IType): Type;
+
+ /**
+ * Converts this message type to a message type descriptor.
+ * @param [toJSONOptions] JSON conversion options
+ * @returns Message type descriptor
+ */
+ public toJSON(toJSONOptions?: IToJSONOptions): IType;
+
+ /**
+ * Adds a nested object to this type.
+ * @param object Nested object to add
+ * @returns `this`
+ * @throws {TypeError} If arguments are invalid
+ * @throws {Error} If there is already a nested object with this name or, if a field, when there is already a field with this id
+ */
+ public add(object: ReflectionObject): Type;
+
+ /**
+ * Removes a nested object from this type.
+ * @param object Nested object to remove
+ * @returns `this`
+ * @throws {TypeError} If arguments are invalid
+ * @throws {Error} If `object` is not a member of this type
+ */
+ public remove(object: ReflectionObject): Type;
+
+ /**
+ * Tests if the specified id is reserved.
+ * @param id Id to test
+ * @returns `true` if reserved, otherwise `false`
+ */
+ public isReservedId(id: number): boolean;
+
+ /**
+ * Tests if the specified name is reserved.
+ * @param name Name to test
+ * @returns `true` if reserved, otherwise `false`
+ */
+ public isReservedName(name: string): boolean;
+
+ /**
+ * Creates a new message of this type using the specified properties.
+ * @param [properties] Properties to set
+ * @returns Message instance
+ */
+ public create(properties?: { [k: string]: any }): Message<{}>;
+
+ /**
+ * Sets up {@link Type#encode|encode}, {@link Type#decode|decode} and {@link Type#verify|verify}.
+ * @returns `this`
+ */
+ public setup(): Type;
+
+ /**
+ * Encodes a message of this type. Does not implicitly {@link Type#verify|verify} messages.
+ * @param message Message instance or plain object
+ * @param [writer] Writer to encode to
+ * @returns writer
+ */
+ public encode(message: (Message<{}>|{ [k: string]: any }), writer?: Writer): Writer;
+
+ /**
+ * Encodes a message of this type preceeded by its byte length as a varint. Does not implicitly {@link Type#verify|verify} messages.
+ * @param message Message instance or plain object
+ * @param [writer] Writer to encode to
+ * @returns writer
+ */
+ public encodeDelimited(message: (Message<{}>|{ [k: string]: any }), writer?: Writer): Writer;
+
+ /**
+ * Decodes a message of this type.
+ * @param reader Reader or buffer to decode from
+ * @param [length] Length of the message, if known beforehand
+ * @returns Decoded message
+ * @throws {Error} If the payload is not a reader or valid buffer
+ * @throws {util.ProtocolError<{}>} If required fields are missing
+ */
+ public decode(reader: (Reader|Uint8Array), length?: number): Message<{}>;
+
+ /**
+ * Decodes a message of this type preceeded by its byte length as a varint.
+ * @param reader Reader or buffer to decode from
+ * @returns Decoded message
+ * @throws {Error} If the payload is not a reader or valid buffer
+ * @throws {util.ProtocolError} If required fields are missing
+ */
+ public decodeDelimited(reader: (Reader|Uint8Array)): Message<{}>;
+
+ /**
+ * Verifies that field values are valid and that required fields are present.
+ * @param message Plain object to verify
+ * @returns `null` if valid, otherwise the reason why it is not
+ */
+ public verify(message: { [k: string]: any }): (null|string);
+
+ /**
+ * Creates a new message of this type from a plain object. Also converts values to their respective internal types.
+ * @param object Plain object to convert
+ * @returns Message instance
+ */
+ public fromObject(object: { [k: string]: any }): Message<{}>;
+
+ /**
+ * Creates a plain object from a message of this type. Also converts values to other types if specified.
+ * @param message Message instance
+ * @param [options] Conversion options
+ * @returns Plain object
+ */
+ public toObject(message: Message<{}>, options?: IConversionOptions): { [k: string]: any };
+
+ /**
+ * Type decorator (TypeScript).
+ * @param [typeName] Type name, defaults to the constructor's name
+ * @returns Decorator function
+ */
+ public static d<T extends Message<T>>(typeName?: string): TypeDecorator<T>;
+}
+
+/** Message type descriptor. */
+export interface IType extends INamespace {
+
+ /** Oneof descriptors */
+ oneofs?: { [k: string]: IOneOf };
+
+ /** Field descriptors */
+ fields: { [k: string]: IField };
+
+ /** Extension ranges */
+ extensions?: number[][];
+
+ /** Reserved ranges */
+ reserved?: number[][];
+
+ /** Whether a legacy group or not */
+ group?: boolean;
+}
+
+/** Conversion options as used by {@link Type#toObject} and {@link Message.toObject}. */
+export interface IConversionOptions {
+
+ /**
+ * Long conversion type.
+ * Valid values are `String` and `Number` (the global types).
+ * Defaults to copy the present value, which is a possibly unsafe number without and a {@link Long} with a long library.
+ */
+ longs?: Function;
+
+ /**
+ * Enum value conversion type.
+ * Only valid value is `String` (the global type).
+ * Defaults to copy the present value, which is the numeric id.
+ */
+ enums?: Function;
+
+ /**
+ * Bytes value conversion type.
+ * Valid values are `Array` and (a base64 encoded) `String` (the global types).
+ * Defaults to copy the present value, which usually is a Buffer under node and an Uint8Array in the browser.
+ */
+ bytes?: Function;
+
+ /** Also sets default values on the resulting object */
+ defaults?: boolean;
+
+ /** Sets empty arrays for missing repeated fields even if `defaults=false` */
+ arrays?: boolean;
+
+ /** Sets empty objects for missing map fields even if `defaults=false` */
+ objects?: boolean;
+
+ /** Includes virtual oneof properties set to the present field's name, if any */
+ oneofs?: boolean;
+
+ /** Performs additional JSON compatibility conversions, i.e. NaN and Infinity to strings */
+ json?: boolean;
+}
+
+/**
+ * Decorator function as returned by {@link Type.d} (TypeScript).
+ * @param target Target constructor
+ */
+type TypeDecorator<T extends Message<T>> = (target: Constructor<T>) => void;
+
+/** Common type constants. */
+export namespace types {
+
+ /** Basic type wire types. */
+ const basic: {
+ "double": number,
+ "float": number,
+ "int32": number,
+ "uint32": number,
+ "sint32": number,
+ "fixed32": number,
+ "sfixed32": number,
+ "int64": number,
+ "uint64": number,
+ "sint64": number,
+ "fixed64": number,
+ "sfixed64": number,
+ "bool": number,
+ "string": number,
+ "bytes": number
+ };
+
+ /** Basic type defaults. */
+ const defaults: {
+ "double": number,
+ "float": number,
+ "int32": number,
+ "uint32": number,
+ "sint32": number,
+ "fixed32": number,
+ "sfixed32": number,
+ "int64": number,
+ "uint64": number,
+ "sint64": number,
+ "fixed64": number,
+ "sfixed64": number,
+ "bool": boolean,
+ "string": string,
+ "bytes": number[],
+ "message": null
+ };
+
+ /** Basic long type wire types. */
+ const long: {
+ "int64": number,
+ "uint64": number,
+ "sint64": number,
+ "fixed64": number,
+ "sfixed64": number
+ };
+
+ /** Allowed types for map keys with their associated wire type. */
+ const mapKey: {
+ "int32": number,
+ "uint32": number,
+ "sint32": number,
+ "fixed32": number,
+ "sfixed32": number,
+ "int64": number,
+ "uint64": number,
+ "sint64": number,
+ "fixed64": number,
+ "sfixed64": number,
+ "bool": number,
+ "string": number
+ };
+
+ /** Allowed types for packed repeated fields with their associated wire type. */
+ const packed: {
+ "double": number,
+ "float": number,
+ "int32": number,
+ "uint32": number,
+ "sint32": number,
+ "fixed32": number,
+ "sfixed32": number,
+ "int64": number,
+ "uint64": number,
+ "sint64": number,
+ "fixed64": number,
+ "sfixed64": number,
+ "bool": number
+ };
+}
+
+/** Constructor type. */
+export interface Constructor<T> extends Function {
+ new(...params: any[]): T; prototype: T;
+}
+
+/** Properties type. */
+type Properties<T> = { [P in keyof T]?: T[P] };
+
+/**
+ * Any compatible Buffer instance.
+ * This is a minimal stand-alone definition of a Buffer instance. The actual type is that exported by node's typings.
+ */
+export interface Buffer extends Uint8Array {
+}
+
+/**
+ * Any compatible Long instance.
+ * This is a minimal stand-alone definition of a Long instance. The actual type is that exported by long.js.
+ */
+export interface Long {
+
+ /** Low bits */
+ low: number;
+
+ /** High bits */
+ high: number;
+
+ /** Whether unsigned or not */
+ unsigned: boolean;
+}
+
+/**
+ * A OneOf getter as returned by {@link util.oneOfGetter}.
+ * @returns Set field name, if any
+ */
+type OneOfGetter = () => (string|undefined);
+
+/**
+ * A OneOf setter as returned by {@link util.oneOfSetter}.
+ * @param value Field name
+ */
+type OneOfSetter = (value: (string|undefined)) => void;
+
+/** Various utility functions. */
+export namespace util {
+
+ /** Helper class for working with the low and high bits of a 64 bit value. */
+ class LongBits {
+
+ /**
+ * Constructs new long bits.
+ * @param lo Low 32 bits, unsigned
+ * @param hi High 32 bits, unsigned
+ */
+ constructor(lo: number, hi: number);
+
+ /** Low bits. */
+ public lo: number;
+
+ /** High bits. */
+ public hi: number;
+
+ /** Zero bits. */
+ public static zero: util.LongBits;
+
+ /** Zero hash. */
+ public static zeroHash: string;
+
+ /**
+ * Constructs new long bits from the specified number.
+ * @param value Value
+ * @returns Instance
+ */
+ public static fromNumber(value: number): util.LongBits;
+
+ /**
+ * Constructs new long bits from a number, long or string.
+ * @param value Value
+ * @returns Instance
+ */
+ public static from(value: (Long|number|string)): util.LongBits;
+
+ /**
+ * Converts this long bits to a possibly unsafe JavaScript number.
+ * @param [unsigned=false] Whether unsigned or not
+ * @returns Possibly unsafe number
+ */
+ public toNumber(unsigned?: boolean): number;
+
+ /**
+ * Converts this long bits to a long.
+ * @param [unsigned=false] Whether unsigned or not
+ * @returns Long
+ */
+ public toLong(unsigned?: boolean): Long;
+
+ /**
+ * Constructs new long bits from the specified 8 characters long hash.
+ * @param hash Hash
+ * @returns Bits
+ */
+ public static fromHash(hash: string): util.LongBits;
+
+ /**
+ * Converts this long bits to a 8 characters long hash.
+ * @returns Hash
+ */
+ public toHash(): string;
+
+ /**
+ * Zig-zag encodes this long bits.
+ * @returns `this`
+ */
+ public zzEncode(): util.LongBits;
+
+ /**
+ * Zig-zag decodes this long bits.
+ * @returns `this`
+ */
+ public zzDecode(): util.LongBits;
+
+ /**
+ * Calculates the length of this longbits when encoded as a varint.
+ * @returns Length
+ */
+ public length(): number;
+ }
+
+ /** Whether running within node or not. */
+ let isNode: boolean;
+
+ /** Global object reference. */
+ let global: object;
+
+ /** An immuable empty array. */
+ const emptyArray: any[];
+
+ /** An immutable empty object. */
+ const emptyObject: object;
+
+ /**
+ * Tests if the specified value is an integer.
+ * @param value Value to test
+ * @returns `true` if the value is an integer
+ */
+ function isInteger(value: any): boolean;
+
+ /**
+ * Tests if the specified value is a string.
+ * @param value Value to test
+ * @returns `true` if the value is a string
+ */
+ function isString(value: any): boolean;
+
+ /**
+ * Tests if the specified value is a non-null object.
+ * @param value Value to test
+ * @returns `true` if the value is a non-null object
+ */
+ function isObject(value: any): boolean;
+
+ /**
+ * Checks if a property on a message is considered to be present.
+ * This is an alias of {@link util.isSet}.
+ * @param obj Plain object or message instance
+ * @param prop Property name
+ * @returns `true` if considered to be present, otherwise `false`
+ */
+ function isset(obj: object, prop: string): boolean;
+
+ /**
+ * Checks if a property on a message is considered to be present.
+ * @param obj Plain object or message instance
+ * @param prop Property name
+ * @returns `true` if considered to be present, otherwise `false`
+ */
+ function isSet(obj: object, prop: string): boolean;
+
+ /** Node's Buffer class if available. */
+ let Buffer: Constructor<Buffer>;
+
+ /**
+ * Creates a new buffer of whatever type supported by the environment.
+ * @param [sizeOrArray=0] Buffer size or number array
+ * @returns Buffer
+ */
+ function newBuffer(sizeOrArray?: (number|number[])): (Uint8Array|Buffer);
+
+ /** Array implementation used in the browser. `Uint8Array` if supported, otherwise `Array`. */
+ let Array: Constructor<Uint8Array>;
+
+ /** Long.js's Long class if available. */
+ let Long: Constructor<Long>;
+
+ /** Regular expression used to verify 2 bit (`bool`) map keys. */
+ const key2Re: RegExp;
+
+ /** Regular expression used to verify 32 bit (`int32` etc.) map keys. */
+ const key32Re: RegExp;
+
+ /** Regular expression used to verify 64 bit (`int64` etc.) map keys. */
+ const key64Re: RegExp;
+
+ /**
+ * Converts a number or long to an 8 characters long hash string.
+ * @param value Value to convert
+ * @returns Hash
+ */
+ function longToHash(value: (Long|number)): string;
+
+ /**
+ * Converts an 8 characters long hash string to a long or number.
+ * @param hash Hash
+ * @param [unsigned=false] Whether unsigned or not
+ * @returns Original value
+ */
+ function longFromHash(hash: string, unsigned?: boolean): (Long|number);
+
+ /**
+ * Merges the properties of the source object into the destination object.
+ * @param dst Destination object
+ * @param src Source object
+ * @param [ifNotSet=false] Merges only if the key is not already set
+ * @returns Destination object
+ */
+ function merge(dst: { [k: string]: any }, src: { [k: string]: any }, ifNotSet?: boolean): { [k: string]: any };
+
+ /**
+ * Converts the first character of a string to lower case.
+ * @param str String to convert
+ * @returns Converted string
+ */
+ function lcFirst(str: string): string;
+
+ /**
+ * Creates a custom error constructor.
+ * @param name Error name
+ * @returns Custom error constructor
+ */
+ function newError(name: string): Constructor<Error>;
+
+ /** Error subclass indicating a protocol specifc error. */
+ class ProtocolError<T extends Message<T>> extends Error {
+
+ /**
+ * Constructs a new protocol error.
+ * @param message Error message
+ * @param [properties] Additional properties
+ */
+ constructor(message: string, properties?: { [k: string]: any });
+
+ /** So far decoded message instance. */
+ public instance: Message<T>;
+ }
+
+ /**
+ * Builds a getter for a oneof's present field name.
+ * @param fieldNames Field names
+ * @returns Unbound getter
+ */
+ function oneOfGetter(fieldNames: string[]): OneOfGetter;
+
+ /**
+ * Builds a setter for a oneof's present field name.
+ * @param fieldNames Field names
+ * @returns Unbound setter
+ */
+ function oneOfSetter(fieldNames: string[]): OneOfSetter;
+
+ /**
+ * Default conversion options used for {@link Message#toJSON} implementations.
+ *
+ * These options are close to proto3's JSON mapping with the exception that internal types like Any are handled just like messages. More precisely:
+ *
+ * - Longs become strings
+ * - Enums become string keys
+ * - Bytes become base64 encoded strings
+ * - (Sub-)Messages become plain objects
+ * - Maps become plain objects with all string keys
+ * - Repeated fields become arrays
+ * - NaN and Infinity for float and double fields become strings
+ *
+ * @see https://developers.google.com/protocol-buffers/docs/proto3?hl=en#json
+ */
+ let toJSONOptions: IConversionOptions;
+
+ /** Node's fs module if available. */
+ let fs: { [k: string]: any };
+
+ /**
+ * Converts an object's values to an array.
+ * @param object Object to convert
+ * @returns Converted array
+ */
+ function toArray(object: { [k: string]: any }): any[];
+
+ /**
+ * Converts an array of keys immediately followed by their respective value to an object, omitting undefined values.
+ * @param array Array to convert
+ * @returns Converted object
+ */
+ function toObject(array: any[]): { [k: string]: any };
+
+ /**
+ * Tests whether the specified name is a reserved word in JS.
+ * @param name Name to test
+ * @returns `true` if reserved, otherwise `false`
+ */
+ function isReserved(name: string): boolean;
+
+ /**
+ * Returns a safe property accessor for the specified property name.
+ * @param prop Property name
+ * @returns Safe accessor
+ */
+ function safeProp(prop: string): string;
+
+ /**
+ * Converts the first character of a string to upper case.
+ * @param str String to convert
+ * @returns Converted string
+ */
+ function ucFirst(str: string): string;
+
+ /**
+ * Converts a string to camel case.
+ * @param str String to convert
+ * @returns Converted string
+ */
+ function camelCase(str: string): string;
+
+ /**
+ * Compares reflected fields by id.
+ * @param a First field
+ * @param b Second field
+ * @returns Comparison value
+ */
+ function compareFieldsById(a: Field, b: Field): number;
+
+ /**
+ * Decorator helper for types (TypeScript).
+ * @param ctor Constructor function
+ * @param [typeName] Type name, defaults to the constructor's name
+ * @returns Reflected type
+ */
+ function decorateType<T extends Message<T>>(ctor: Constructor<T>, typeName?: string): Type;
+
+ /**
+ * Decorator helper for enums (TypeScript).
+ * @param object Enum object
+ * @returns Reflected enum
+ */
+ function decorateEnum(object: object): Enum;
+
+ /**
+ * Sets the value of a property by property path. If a value already exists, it is turned to an array
+ * @param dst Destination object
+ * @param path dot '.' delimited path of the property to set
+ * @param value the value to set
+ * @returns Destination object
+ */
+ function setProperty(dst: { [k: string]: any }, path: string, value: object): { [k: string]: any };
+
+ /** Decorator root (TypeScript). */
+ let decorateRoot: Root;
+
+ /**
+ * Returns a promise from a node-style callback function.
+ * @param fn Function to call
+ * @param ctx Function context
+ * @param params Function arguments
+ * @returns Promisified function
+ */
+ function asPromise(fn: asPromiseCallback, ctx: any, ...params: any[]): Promise<any>;
+
+ /** A minimal base64 implementation for number arrays. */
+ namespace base64 {
+
+ /**
+ * Calculates the byte length of a base64 encoded string.
+ * @param string Base64 encoded string
+ * @returns Byte length
+ */
+ function length(string: string): number;
+
+ /**
+ * Encodes a buffer to a base64 encoded string.
+ * @param buffer Source buffer
+ * @param start Source start
+ * @param end Source end
+ * @returns Base64 encoded string
+ */
+ function encode(buffer: Uint8Array, start: number, end: number): string;
+
+ /**
+ * Decodes a base64 encoded string to a buffer.
+ * @param string Source string
+ * @param buffer Destination buffer
+ * @param offset Destination offset
+ * @returns Number of bytes written
+ * @throws {Error} If encoding is invalid
+ */
+ function decode(string: string, buffer: Uint8Array, offset: number): number;
+
+ /**
+ * Tests if the specified string appears to be base64 encoded.
+ * @param string String to test
+ * @returns `true` if probably base64 encoded, otherwise false
+ */
+ function test(string: string): boolean;
+ }
+
+ /**
+ * Begins generating a function.
+ * @param functionParams Function parameter names
+ * @param [functionName] Function name if not anonymous
+ * @returns Appender that appends code to the function's body
+ */
+ function codegen(functionParams: string[], functionName?: string): Codegen;
+
+ namespace codegen {
+
+ /** When set to `true`, codegen will log generated code to console. Useful for debugging. */
+ let verbose: boolean;
+ }
+
+ /**
+ * Begins generating a function.
+ * @param [functionName] Function name if not anonymous
+ * @returns Appender that appends code to the function's body
+ */
+ function codegen(functionName?: string): Codegen;
+
+ /** A minimal event emitter. */
+ class EventEmitter {
+
+ /** Constructs a new event emitter instance. */
+ constructor();
+
+ /**
+ * Registers an event listener.
+ * @param evt Event name
+ * @param fn Listener
+ * @param [ctx] Listener context
+ * @returns `this`
+ */
+ public on(evt: string, fn: EventEmitterListener, ctx?: any): this;
+
+ /**
+ * Removes an event listener or any matching listeners if arguments are omitted.
+ * @param [evt] Event name. Removes all listeners if omitted.
+ * @param [fn] Listener to remove. Removes all listeners of `evt` if omitted.
+ * @returns `this`
+ */
+ public off(evt?: string, fn?: EventEmitterListener): this;
+
+ /**
+ * Emits an event by calling its listeners with the specified arguments.
+ * @param evt Event name
+ * @param args Arguments
+ * @returns `this`
+ */
+ public emit(evt: string, ...args: any[]): this;
+ }
+
+ /** Reads / writes floats / doubles from / to buffers. */
+ namespace float {
+
+ /**
+ * Writes a 32 bit float to a buffer using little endian byte order.
+ * @param val Value to write
+ * @param buf Target buffer
+ * @param pos Target buffer offset
+ */
+ function writeFloatLE(val: number, buf: Uint8Array, pos: number): void;
+
+ /**
+ * Writes a 32 bit float to a buffer using big endian byte order.
+ * @param val Value to write
+ * @param buf Target buffer
+ * @param pos Target buffer offset
+ */
+ function writeFloatBE(val: number, buf: Uint8Array, pos: number): void;
+
+ /**
+ * Reads a 32 bit float from a buffer using little endian byte order.
+ * @param buf Source buffer
+ * @param pos Source buffer offset
+ * @returns Value read
+ */
+ function readFloatLE(buf: Uint8Array, pos: number): number;
+
+ /**
+ * Reads a 32 bit float from a buffer using big endian byte order.
+ * @param buf Source buffer
+ * @param pos Source buffer offset
+ * @returns Value read
+ */
+ function readFloatBE(buf: Uint8Array, pos: number): number;
+
+ /**
+ * Writes a 64 bit double to a buffer using little endian byte order.
+ * @param val Value to write
+ * @param buf Target buffer
+ * @param pos Target buffer offset
+ */
+ function writeDoubleLE(val: number, buf: Uint8Array, pos: number): void;
+
+ /**
+ * Writes a 64 bit double to a buffer using big endian byte order.
+ * @param val Value to write
+ * @param buf Target buffer
+ * @param pos Target buffer offset
+ */
+ function writeDoubleBE(val: number, buf: Uint8Array, pos: number): void;
+
+ /**
+ * Reads a 64 bit double from a buffer using little endian byte order.
+ * @param buf Source buffer
+ * @param pos Source buffer offset
+ * @returns Value read
+ */
+ function readDoubleLE(buf: Uint8Array, pos: number): number;
+
+ /**
+ * Reads a 64 bit double from a buffer using big endian byte order.
+ * @param buf Source buffer
+ * @param pos Source buffer offset
+ * @returns Value read
+ */
+ function readDoubleBE(buf: Uint8Array, pos: number): number;
+ }
+
+ /**
+ * Fetches the contents of a file.
+ * @param filename File path or url
+ * @param options Fetch options
+ * @param callback Callback function
+ */
+ function fetch(filename: string, options: IFetchOptions, callback: FetchCallback): void;
+
+ /**
+ * Fetches the contents of a file.
+ * @param path File path or url
+ * @param callback Callback function
+ */
+ function fetch(path: string, callback: FetchCallback): void;
+
+ /**
+ * Fetches the contents of a file.
+ * @param path File path or url
+ * @param [options] Fetch options
+ * @returns Promise
+ */
+ function fetch(path: string, options?: IFetchOptions): Promise<(string|Uint8Array)>;
+
+ /**
+ * Requires a module only if available.
+ * @param moduleName Module to require
+ * @returns Required module if available and not empty, otherwise `null`
+ */
+ function inquire(moduleName: string): object;
+
+ /** A minimal path module to resolve Unix, Windows and URL paths alike. */
+ namespace path {
+
+ /**
+ * Tests if the specified path is absolute.
+ * @param path Path to test
+ * @returns `true` if path is absolute
+ */
+ function isAbsolute(path: string): boolean;
+
+ /**
+ * Normalizes the specified path.
+ * @param path Path to normalize
+ * @returns Normalized path
+ */
+ function normalize(path: string): string;
+
+ /**
+ * Resolves the specified include path against the specified origin path.
+ * @param originPath Path to the origin file
+ * @param includePath Include path relative to origin path
+ * @param [alreadyNormalized=false] `true` if both paths are already known to be normalized
+ * @returns Path to the include file
+ */
+ function resolve(originPath: string, includePath: string, alreadyNormalized?: boolean): string;
+ }
+
+ /**
+ * A general purpose buffer pool.
+ * @param alloc Allocator
+ * @param slice Slicer
+ * @param [size=8192] Slab size
+ * @returns Pooled allocator
+ */
+ function pool(alloc: PoolAllocator, slice: PoolSlicer, size?: number): PoolAllocator;
+
+ /** A minimal UTF8 implementation for number arrays. */
+ namespace utf8 {
+
+ /**
+ * Calculates the UTF8 byte length of a string.
+ * @param string String
+ * @returns Byte length
+ */
+ function length(string: string): number;
+
+ /**
+ * Reads UTF8 bytes as a string.
+ * @param buffer Source buffer
+ * @param start Source start
+ * @param end Source end
+ * @returns String read
+ */
+ function read(buffer: Uint8Array, start: number, end: number): string;
+
+ /**
+ * Writes a string as UTF8 bytes.
+ * @param string Source string
+ * @param buffer Destination buffer
+ * @param offset Destination offset
+ * @returns Bytes written
+ */
+ function write(string: string, buffer: Uint8Array, offset: number): number;
+ }
+}
+
+/**
+ * Generates a verifier specific to the specified message type.
+ * @param mtype Message type
+ * @returns Codegen instance
+ */
+export function verifier(mtype: Type): Codegen;
+
+/** Wrappers for common types. */
+export const wrappers: { [k: string]: IWrapper };
+
+/**
+ * From object converter part of an {@link IWrapper}.
+ * @param object Plain object
+ * @returns Message instance
+ */
+type WrapperFromObjectConverter = (this: Type, object: { [k: string]: any }) => Message<{}>;
+
+/**
+ * To object converter part of an {@link IWrapper}.
+ * @param message Message instance
+ * @param [options] Conversion options
+ * @returns Plain object
+ */
+type WrapperToObjectConverter = (this: Type, message: Message<{}>, options?: IConversionOptions) => { [k: string]: any };
+
+/** Common type wrapper part of {@link wrappers}. */
+export interface IWrapper {
+
+ /** From object converter */
+ fromObject?: WrapperFromObjectConverter;
+
+ /** To object converter */
+ toObject?: WrapperToObjectConverter;
+}
+
+/** Wire format writer using `Uint8Array` if available, otherwise `Array`. */
+export class Writer {
+
+ /** Constructs a new writer instance. */
+ constructor();
+
+ /** Current length. */
+ public len: number;
+
+ /** Operations head. */
+ public head: object;
+
+ /** Operations tail */
+ public tail: object;
+
+ /** Linked forked states. */
+ public states: (object|null);
+
+ /**
+ * Creates a new writer.
+ * @returns A {@link BufferWriter} when Buffers are supported, otherwise a {@link Writer}
+ */
+ public static create(): (BufferWriter|Writer);
+
+ /**
+ * Allocates a buffer of the specified size.
+ * @param size Buffer size
+ * @returns Buffer
+ */
+ public static alloc(size: number): Uint8Array;
+
+ /**
+ * Writes an unsigned 32 bit value as a varint.
+ * @param value Value to write
+ * @returns `this`
+ */
+ public uint32(value: number): Writer;
+
+ /**
+ * Writes a signed 32 bit value as a varint.
+ * @param value Value to write
+ * @returns `this`
+ */
+ public int32(value: number): Writer;
+
+ /**
+ * Writes a 32 bit value as a varint, zig-zag encoded.
+ * @param value Value to write
+ * @returns `this`
+ */
+ public sint32(value: number): Writer;
+
+ /**
+ * Writes an unsigned 64 bit value as a varint.
+ * @param value Value to write
+ * @returns `this`
+ * @throws {TypeError} If `value` is a string and no long library is present.
+ */
+ public uint64(value: (Long|number|string)): Writer;
+
+ /**
+ * Writes a signed 64 bit value as a varint.
+ * @param value Value to write
+ * @returns `this`
+ * @throws {TypeError} If `value` is a string and no long library is present.
+ */
+ public int64(value: (Long|number|string)): Writer;
+
+ /**
+ * Writes a signed 64 bit value as a varint, zig-zag encoded.
+ * @param value Value to write
+ * @returns `this`
+ * @throws {TypeError} If `value` is a string and no long library is present.
+ */
+ public sint64(value: (Long|number|string)): Writer;
+
+ /**
+ * Writes a boolish value as a varint.
+ * @param value Value to write
+ * @returns `this`
+ */
+ public bool(value: boolean): Writer;
+
+ /**
+ * Writes an unsigned 32 bit value as fixed 32 bits.
+ * @param value Value to write
+ * @returns `this`
+ */
+ public fixed32(value: number): Writer;
+
+ /**
+ * Writes a signed 32 bit value as fixed 32 bits.
+ * @param value Value to write
+ * @returns `this`
+ */
+ public sfixed32(value: number): Writer;
+
+ /**
+ * Writes an unsigned 64 bit value as fixed 64 bits.
+ * @param value Value to write
+ * @returns `this`
+ * @throws {TypeError} If `value` is a string and no long library is present.
+ */
+ public fixed64(value: (Long|number|string)): Writer;
+
+ /**
+ * Writes a signed 64 bit value as fixed 64 bits.
+ * @param value Value to write
+ * @returns `this`
+ * @throws {TypeError} If `value` is a string and no long library is present.
+ */
+ public sfixed64(value: (Long|number|string)): Writer;
+
+ /**
+ * Writes a float (32 bit).
+ * @param value Value to write
+ * @returns `this`
+ */
+ public float(value: number): Writer;
+
+ /**
+ * Writes a double (64 bit float).
+ * @param value Value to write
+ * @returns `this`
+ */
+ public double(value: number): Writer;
+
+ /**
+ * Writes a sequence of bytes.
+ * @param value Buffer or base64 encoded string to write
+ * @returns `this`
+ */
+ public bytes(value: (Uint8Array|string)): Writer;
+
+ /**
+ * Writes a string.
+ * @param value Value to write
+ * @returns `this`
+ */
+ public string(value: string): Writer;
+
+ /**
+ * Forks this writer's state by pushing it to a stack.
+ * Calling {@link Writer#reset|reset} or {@link Writer#ldelim|ldelim} resets the writer to the previous state.
+ * @returns `this`
+ */
+ public fork(): Writer;
+
+ /**
+ * Resets this instance to the last state.
+ * @returns `this`
+ */
+ public reset(): Writer;
+
+ /**
+ * Resets to the last state and appends the fork state's current write length as a varint followed by its operations.
+ * @returns `this`
+ */
+ public ldelim(): Writer;
+
+ /**
+ * Finishes the write operation.
+ * @returns Finished buffer
+ */
+ public finish(): Uint8Array;
+}
+
+/** Wire format writer using node buffers. */
+export class BufferWriter extends Writer {
+
+ /** Constructs a new buffer writer instance. */
+ constructor();
+
+ /**
+ * Allocates a buffer of the specified size.
+ * @param size Buffer size
+ * @returns Buffer
+ */
+ public static alloc(size: number): Buffer;
+
+ /**
+ * Finishes the write operation.
+ * @returns Finished buffer
+ */
+ public finish(): Buffer;
+}
+
+/**
+ * Callback as used by {@link util.asPromise}.
+ * @param error Error, if any
+ * @param params Additional arguments
+ */
+type asPromiseCallback = (error: (Error|null), ...params: any[]) => void;
+
+/**
+ * Appends code to the function's body or finishes generation.
+ * @param [formatStringOrScope] Format string or, to finish the function, an object of additional scope variables, if any
+ * @param [formatParams] Format parameters
+ * @returns Itself or the generated function if finished
+ * @throws {Error} If format parameter counts do not match
+ */
+type Codegen = (formatStringOrScope?: (string|{ [k: string]: any }), ...formatParams: any[]) => (Codegen|Function);
+
+/**
+ * Event listener as used by {@link util.EventEmitter}.
+ * @param args Arguments
+ */
+type EventEmitterListener = (...args: any[]) => void;
+
+/**
+ * Node-style callback as used by {@link util.fetch}.
+ * @param error Error, if any, otherwise `null`
+ * @param [contents] File contents, if there hasn't been an error
+ */
+type FetchCallback = (error: Error, contents?: string) => void;
+
+/** Options as used by {@link util.fetch}. */
+export interface IFetchOptions {
+
+ /** Whether expecting a binary response */
+ binary?: boolean;
+
+ /** If `true`, forces the use of XMLHttpRequest */
+ xhr?: boolean;
+}
+
+/**
+ * An allocator as used by {@link util.pool}.
+ * @param size Buffer size
+ * @returns Buffer
+ */
+type PoolAllocator = (size: number) => Uint8Array;
+
+/**
+ * A slicer as used by {@link util.pool}.
+ * @param start Start offset
+ * @param end End offset
+ * @returns Buffer slice
+ */
+type PoolSlicer = (this: Uint8Array, start: number, end: number) => Uint8Array;