Built motion from commit 6a09e18b.|2.6.11
[motion2.git] / legacy-libs / protobufjs / index.d.ts
diff --git a/legacy-libs/protobufjs/index.d.ts b/legacy-libs/protobufjs/index.d.ts
new file mode 100644 (file)
index 0000000..cb86b61
--- /dev/null
@@ -0,0 +1,2729 @@
+// 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;