diff --git a/node-ffi/node-ffi-buffer.d.ts b/node-ffi/node-ffi-buffer.d.ts
new file mode 100644
index 0000000000..5203a2d9ee
--- /dev/null
+++ b/node-ffi/node-ffi-buffer.d.ts
@@ -0,0 +1,59 @@
+// DefinitelyTyped: partial
+
+interface Buffer {
+ /** Shorthand for `ref.address`. */
+ address(): number;
+ /** Shorthand for `ref.deref`. */
+ deref(): any;
+ /** Shorthand for `ref.isNull`. */
+ isNull(): boolean;
+ /** Shorthand for `ref.readCString`. */
+ readCString(offset?: number): string;
+ /** Shorthand for `ref.readInt64BE`. */
+ readInt64BE(offset?: number): string;
+ /** Shorthand for `ref.readInt64LE`. */
+ readInt64LE(offset?: number): string;
+ /** Shorthand for `ref.readObject`. */
+ readObject(offset?: number): string;
+ /** Shorthand for `ref.readPointer`. */
+ readPointer(offset?: number): string;
+ /** Shorthand for `ref.readUInt64BE`. */
+ readUInt64BE(offset?: number): string;
+ /** Shorthand for `ref.readUInt64LE`. */
+ readUInt64LE(offset?: number): string;
+ /** Shorthand for `ref.ref`. */
+ ref(): Buffer;
+ /** Shorthand for `ref.reinterpret`. */
+ reinterpret(size: number, offset?: number): Buffer;
+ /** Shorthand for `ref.reinterpretUntilZeros`. */
+ reinterpretUntilZeros(size: number, offset?: number): Buffer;
+ /** Shorthand for `ref.writeCString`. */
+ writeCString(offset: number, string: string, encoding?: string): void;
+ /** Shorthand for `ref.writeInt64BE`. */
+ writeInt64BE(offset: number, input: number): any;
+ /** Shorthand for `ref.writeInt64BE`. */
+ writeInt64BE(offset: number, input: string): any;
+ /** Shorthand for `ref.writeInt64LE`. */
+ writeInt64LE(offset: number, input: number): any;
+ /** Shorthand for `ref.writeInt64LE`. */
+ writeInt64LE(offset: number, input: string): any;
+ /** Shorthand for `ref.writeObject`. */
+ writeObject(offset: number, object: Object): void;
+ /** Shorthand for `ref.writePointer`. */
+ writePointer(offset: number, pointer: Buffer): void;
+ /** Shorthand for `ref.writeUInt64BE`. */
+ writeUInt64BE(offset: number, input: number): any;
+ /** Shorthand for `ref.writeUInt64BE`. */
+ writeUInt64BE(offset: number, input: string): any;
+ /** Shorthand for `ref.writeUInt64LE`. */
+ writeUInt64LE(offset: number, input: number): any;
+ /** Shorthand for `ref.writeUInt64LE`. */
+ writeUInt64LE(offset: number, input: string): any;
+
+ /**
+ * Generate string for inspecting.
+ * String includes the hex-encoded memory address of the Buffer instance.
+ * @override
+ */
+ inspect(): string;
+}
diff --git a/node-ffi/node-ffi-tests.ts b/node-ffi/node-ffi-tests.ts
index 3834705031..ff9698bfd0 100644
--- a/node-ffi/node-ffi-tests.ts
+++ b/node-ffi/node-ffi-tests.ts
@@ -1,5 +1,10 @@
///
+///
+///
+///
+///
+
import ffi = require('ffi');
import ref = require('ref');
import Struct = require('ref-struct');
diff --git a/node-ffi/node-ffi.d.ts b/node-ffi/node-ffi.d.ts
index e5ee74621b..49d6069d49 100644
--- a/node-ffi/node-ffi.d.ts
+++ b/node-ffi/node-ffi.d.ts
@@ -1,9 +1,12 @@
-// Type definitions for node-ffi, ref, ref-array, ref-struct and ref-union
+// Type definitions for node-ffi
// Project: https://github.com/rbranson/node-ffi
// Definitions by: Paul Loyd
// Definitions: https://github.com/borisyankov/DefinitelyTyped
///
+///
+///
+///
declare module "ffi" {
import ref = require('ref');
@@ -190,405 +193,3 @@ declare module "ffi" {
uint32: ref.Type; short: ref.Type;
};
}
-
-declare module "ref" {
- export interface Type {
- /** The size in bytes required to hold this datatype. */
- size: number;
- /** The current level of indirection of the buffer. */
- indirection: number;
- /** To invoke when `ref.get` is invoked on a buffer of this type. */
- get(buffer: Buffer, offset: number): any;
- /** To invoke when `ref.set` is invoked on a buffer of this type. */
- set(buffer: Buffer, offset: number, value: any): void;
- /** The name to use during debugging for this datatype. */
- name?: string;
- /** The alignment of this datatype when placed inside a struct. */
- alignment?: number;
- }
-
- /** A Buffer that references the C NULL pointer. */
- export var NULL: Buffer;
- /** A pointer-sized buffer pointing to NULL. */
- export var NULL_POINTER: Buffer;
- /** Get the memory address of buffer. */
- export function address(buffer: Buffer): number;
- /** Allocate the memory with the given value written to it. */
- export function alloc(type: Type, value?: any): Buffer;
- /** Allocate the memory with the given value written to it. */
- export function alloc(type: string, value?: any): Buffer;
-
- /**
- * Allocate the memory with the given string written to it with the given
- * encoding (defaults to utf8). The buffer is 1 byte longer than the
- * string itself, and is NULL terminated.
- */
- export function allocCString(string: string, encoding?: string): Buffer;
-
- /** Coerce a type.*/
- export function coerceType(type: Type): Type;
- /** Coerce a type. String are looked up from the ref.types object. */
- export function coerceType(type: string): Type;
-
- /**
- * Get value after dereferencing buffer.
- * That is, first it checks the indirection count of buffer's type, and
- * if it's greater than 1 then it merely returns another Buffer, but with
- * one level less indirection.
- */
- export function deref(buffer: Buffer): any;
-
- /** Create clone of the type, with decremented indirection level by 1. */
- export function derefType(type: Type): Type;
- /** Create clone of the type, with decremented indirection level by 1. */
- export function derefType(type: string): Type;
- /** Represents the native endianness of the processor ("LE" or "BE"). */
- export var endianness: string;
- /** Check the indirection level and return a dereferenced when necessary. */
- export function get(buffer: Buffer, offset?: number, type?: Type): any;
- /** Check the indirection level and return a dereferenced when necessary. */
- export function get(buffer: Buffer, offset?: number, type?: string): any;
- /** Get type of the buffer. Create a default type when none exists. */
- export function getType(buffer: Buffer): Type;
- /** Check the NULL. */
- export function isNull(buffer: Buffer): boolean;
- /** Read C string until the first NULL. */
- export function readCString(buffer: Buffer, offset?: number): string;
-
- /**
- * Read a big-endian signed 64-bit int.
- * If there is losing precision, then return a string, otherwise a number.
- * @return {number|string}
- */
- export function readInt64BE(buffer: Buffer, offset?: number): any;
-
- /**
- * Read a little-endian signed 64-bit int.
- * If there is losing precision, then return a string, otherwise a number.
- * @return {number|string}
- */
- export function readInt64LE(buffer: Buffer, offset?: number): any;
-
- /** Read a JS Object that has previously been written. */
- export function readObject(buffer: Buffer, offset?: number): Object;
- /** Read data from the pointer. */
- export function readPointer(buffer: Buffer, offset?: number,
- length?: number): Buffer;
- /**
- * Read a big-endian unsigned 64-bit int.
- * If there is losing precision, then return a string, otherwise a number.
- * @return {number|string}
- */
- export function readUInt64BE(buffer: Buffer, offset?: number): any;
-
- /**
- * Read a little-endian unsigned 64-bit int.
- * If there is losing precision, then return a string, otherwise a number.
- * @return {number|string}
- */
- export function readUInt64LE(buffer: Buffer, offset?: number): any;
-
- /** Create pointer to buffer. */
- export function ref(buffer: Buffer): Buffer;
- /** Create clone of the type, with incremented indirection level by 1. */
- export function refType(type: Type): Type;
- /** Create clone of the type, with incremented indirection level by 1. */
- export function refType(type: string): Type;
-
- /**
- * Create buffer with the specified size, with the same address as source.
- * This function "attaches" source to the returned buffer to prevent it from
- * being garbage collected.
- */
- export function reinterpret(buffer: Buffer, size: number,
- offset?: number): Buffer;
- /**
- * Scan past the boundary of the buffer's length until it finds size number
- * of aligned NULL bytes.
- */
- export function reinterpretUntilZeros(buffer: Buffer, size: number,
- offset?: number): Buffer;
-
- /** Write pointer if the indirection is 1, otherwise write value. */
- export function set(buffer: Buffer, offset: number, value: any, type?: Type): void;
- /** Write pointer if the indirection is 1, otherwise write value. */
- export function set(buffer: Buffer, offset: number, value: any, type?: string): void;
- /** Write the string as a NULL terminated. Default encoding is utf8. */
- export function writeCString(buffer: Buffer, offset: number,
- string: string, encoding?: string): void;
- /** Write a big-endian signed 64-bit int. */
- export function writeInt64BE(buffer: Buffer, offset: number, input: number): void;
- /** Write a big-endian signed 64-bit int. */
- export function writeInt64BE(buffer: Buffer, offset: number, input: string): void;
- /** Write a little-endian signed 64-bit int. */
- export function writeInt64LE(buffer: Buffer, offset: number, input: number): void;
- /** Write a little-endian signed 64-bit int. */
- export function writeInt64LE(buffer: Buffer, offset: number, input: string): void;
-
- /**
- * Write the JS Object. This function "attaches" object to buffer to prevent
- * it from being garbage collected.
- */
- export function writeObject(buffer: Buffer, offset: number, object: Object): void;
-
- /**
- * Write the memory address of pointer to buffer at the specified offset. This
- * function "attaches" object to buffer to prevent it from being garbage collected.
- */
- export function writePointer(buffer: Buffer, offset: number,
- pointer: Buffer): void;
-
- /** Write a little-endian unsigned 64-bit int. */
- export function writeUInt64BE(buffer: Buffer, offset: number, input: number): void;
- /** Write a little-endian unsigned 64-bit int. */
- export function writeUInt64BE(buffer: Buffer, offset: number, input: string): void;
-
- /**
- * Attach object to buffer such.
- * It prevents object from being garbage collected until buffer does.
- */
- export function _attach(buffer: Buffer, object: Object): void;
-
- /** Same as ref.reinterpret, except that this version does not attach buffer. */
- export function _reinterpret(buffer: Buffer, size: number,
- offset?: number): Buffer;
- /** Same as ref.reinterpretUntilZeros, except that this version does not attach buffer. */
- export function _reinterpretUntilZeros(buffer: Buffer, size: number,
- offset?: number): Buffer;
- /** Same as ref.writePointer, except that this version does not attach pointer. */
- export function _writePointer(buffer: Buffer, offset: number,
- pointer: Buffer): void;
- /** Same as ref.writeObject, except that this version does not attach object. */
- export function _writeObject(buffer: Buffer, offset: number, object: Object): void;
-
- /** Default types. */
- export var types: {
- void: Type; int64: Type; ushort: Type;
- int: Type; uint64: Type; float: Type;
- uint: Type; long: Type; double: Type;
- int8: Type; ulong: Type; Object: Type;
- uint8: Type; longlong: Type; CString: Type;
- int16: Type; ulonglong: Type; bool: Type;
- uint16: Type; char: Type; byte: Type;
- int32: Type; uchar: Type; size_t: Type;
- uint32: Type; short: Type;
- };
-}
-
-interface Buffer {
- /** Shorthand for `ref.address`. */
- address(): number;
- /** Shorthand for `ref.deref`. */
- deref(): any;
- /** Shorthand for `ref.isNull`. */
- isNull(): boolean;
- /** Shorthand for `ref.readCString`. */
- readCString(offset?: number): string;
- /** Shorthand for `ref.readInt64BE`. */
- readInt64BE(offset?: number): string;
- /** Shorthand for `ref.readInt64LE`. */
- readInt64LE(offset?: number): string;
- /** Shorthand for `ref.readObject`. */
- readObject(offset?: number): string;
- /** Shorthand for `ref.readPointer`. */
- readPointer(offset?: number): string;
- /** Shorthand for `ref.readUInt64BE`. */
- readUInt64BE(offset?: number): string;
- /** Shorthand for `ref.readUInt64LE`. */
- readUInt64LE(offset?: number): string;
- /** Shorthand for `ref.ref`. */
- ref(): Buffer;
- /** Shorthand for `ref.reinterpret`. */
- reinterpret(size: number, offset?: number): Buffer;
- /** Shorthand for `ref.reinterpretUntilZeros`. */
- reinterpretUntilZeros(size: number, offset?: number): Buffer;
- /** Shorthand for `ref.writeCString`. */
- writeCString(offset: number, string: string, encoding?: string): void;
- /** Shorthand for `ref.writeInt64BE`. */
- writeInt64BE(offset: number, input: number): any;
- /** Shorthand for `ref.writeInt64BE`. */
- writeInt64BE(offset: number, input: string): any;
- /** Shorthand for `ref.writeInt64LE`. */
- writeInt64LE(offset: number, input: number): any;
- /** Shorthand for `ref.writeInt64LE`. */
- writeInt64LE(offset: number, input: string): any;
- /** Shorthand for `ref.writeObject`. */
- writeObject(offset: number, object: Object): void;
- /** Shorthand for `ref.writePointer`. */
- writePointer(offset: number, pointer: Buffer): void;
- /** Shorthand for `ref.writeUInt64BE`. */
- writeUInt64BE(offset: number, input: number): any;
- /** Shorthand for `ref.writeUInt64BE`. */
- writeUInt64BE(offset: number, input: string): any;
- /** Shorthand for `ref.writeUInt64LE`. */
- writeUInt64LE(offset: number, input: number): any;
- /** Shorthand for `ref.writeUInt64LE`. */
- writeUInt64LE(offset: number, input: string): any;
-
- /**
- * Generate string for inspecting.
- * String includes the hex-encoded memory address of the Buffer instance.
- * @override
- */
- inspect(): string;
-}
-
-declare module "ref-array" {
- import ref = require('ref');
-
- interface ArrayType extends ref.Type {
- BYTES_PER_ELEMENT: number;
- fixedLength: number;
- /** The reference to the base type. */
- type: ref.Type;
-
- /**
- * Accepts a Buffer instance that should be an already-populated with data
- * for the ArrayType. The "length" of the Array is determined by searching
- * through the buffer's contents until an aligned NULL pointer is encountered.
- */
- untilZeros(buffer: Buffer): { [i: number]: T; length: number; toArray(): T[];
- toJSON(): T[]; inspect(): string; buffer: Buffer; ref(): Buffer; };
-
- new (length?: number): { [i: number]: T; length: number; toArray(): T[];
- toJSON(): T[]; inspect(): string; buffer: Buffer; ref(): Buffer; };
- new (data: number[], length?: number): { [i: number]: T; length: number; toArray(): T[];
- toJSON(): T[]; inspect(): string; buffer: Buffer; ref(): Buffer; };
- new (data: Buffer, length?: number): { [i: number]: T; length: number; toArray(): T[];
- toJSON(): T[]; inspect(): string; buffer: Buffer; ref(): Buffer; };
- (length?: number): { [i: number]: T; length: number; toArray(): T[];
- toJSON(): T[]; inspect(): string; buffer: Buffer; ref(): Buffer; };
- (data: number[], length?: number): { [i: number]: T; length: number; toArray(): T[];
- toJSON(): T[]; inspect(): string; buffer: Buffer; ref(): Buffer; };
- (data: Buffer, length?: number): { [i: number]: T; length: number; toArray(): T[];
- toJSON(): T[]; inspect(): string; buffer: Buffer; ref(): Buffer; };
- }
-
- /**
- * The array type meta-constructor.
- * The returned constructor's API is highly influenced by the WebGL
- * TypedArray API.
- */
- var ArrayType: {
- new (type: ref.Type, length?: number): ArrayType;
- new (type: string, length?: number): ArrayType;
- (type: ref.Type, length?: number): ArrayType;
- (type: string, length?: number): ArrayType;
- };
-
- export = ArrayType;
-}
-
-declare module "ref-struct" {
- import ref = require('ref');
-
- /**
- * This is the `constructor` of the Struct type that gets returned.
- *
- * Invoke it with `new` to create a new Buffer instance backing the struct.
- * Pass it an existing Buffer instance to use that as the backing buffer.
- * Pass in an Object containing the struct fields to auto-populate the
- * struct with the data.
- *
- * @constructor
- */
- interface StructType extends ref.Type {
- /** Pass it an existing Buffer instance to use that as the backing buffer. */
- new (arg: Buffer, data?: {}): any;
- new (data?: {}): any;
- /** Pass it an existing Buffer instance to use that as the backing buffer. */
- (arg: Buffer, data?: {}): any;
- (data?: {}): any;
-
- fields: {[key: string]: {type: ref.Type}};
-
- /**
- * Adds a new field to the struct instance with the given name and type.
- * Note that this function will throw an Error if any instances of the struct
- * type have already been created, therefore this function must be called at the
- * beginning, before any instances are created.
- */
- defineProperty(name: string, type: ref.Type): void;
-
- /**
- * Adds a new field to the struct instance with the given name and type.
- * Note that this function will throw an Error if any instances of the struct
- * type have already been created, therefore this function must be called at the
- * beginning, before any instances are created.
- */
- defineProperty(name: string, type: string): void;
-
- /**
- * Custom for struct type instances.
- * @override
- */
- toString(): string;
- }
-
- /** The struct type meta-constructor. */
- var StructType: {
- new (fields?: {}): StructType;
- new (fields?: any[]): StructType;
- (fields?: {}): StructType;
- (fields?: any[]): StructType;
- }
-
- export = StructType;
-}
-
-declare module "ref-union" {
- import ref = require('ref');
-
- /**
- * This is the `constructor` of the Struct type that gets returned.
- *
- * Invoke it with `new` to create a new Buffer instance backing the union.
- * Pass it an existing Buffer instance to use that as the backing buffer.
- * Pass in an Object containing the union fields to auto-populate the
- * union with the data.
- *
- * @constructor
- */
- interface UnionType extends ref.Type {
- /** Pass it an existing Buffer instance to use that as the backing buffer. */
- new (arg: Buffer, data?: {}): any;
- new (data?: {}): any;
- /** Pass it an existing Buffer instance to use that as the backing buffer. */
- (arg: Buffer, data?: {}): any;
- (data?: {}): any;
-
- fields: {[key: string]: {type: ref.Type}};
-
- /**
- * Adds a new field to the union instance with the given name and type.
- * Note that this function will throw an Error if any instances of the union
- * type have already been created, therefore this function must be called at the
- * beginning, before any instances are created.
- */
- defineProperty(name: string, type: ref.Type): void;
-
- /**
- * Adds a new field to the union instance with the given name and type.
- * Note that this function will throw an Error if any instances of the union
- * type have already been created, therefore this function must be called at the
- * beginning, before any instances are created.
- */
- defineProperty(name: string, type: string): void;
-
- /**
- * Custom for union type instances.
- * @override
- */
- toString(): string;
- }
-
- /** The union type meta-constructor. */
- var UnionType: {
- new (fields?: {}): UnionType;
- new (fields?: any[]): UnionType;
- (fields?: {}): UnionType;
- (fields?: any[]): UnionType;
- }
-
- export = UnionType;
-}
diff --git a/ref-array/ref-array.d.ts b/ref-array/ref-array.d.ts
new file mode 100644
index 0000000000..4066e0d65a
--- /dev/null
+++ b/ref-array/ref-array.d.ts
@@ -0,0 +1,53 @@
+// Type definitions for ref-array
+// Project: https://github.com/TooTallNate/ref-array
+// Definitions by: Paul Loyd
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+///
+///
+
+declare module "ref-array" {
+ import ref = require('ref');
+
+ interface ArrayType extends ref.Type {
+ BYTES_PER_ELEMENT: number;
+ fixedLength: number;
+ /** The reference to the base type. */
+ type: ref.Type;
+
+ /**
+ * Accepts a Buffer instance that should be an already-populated with data
+ * for the ArrayType. The "length" of the Array is determined by searching
+ * through the buffer's contents until an aligned NULL pointer is encountered.
+ */
+ untilZeros(buffer: Buffer): { [i: number]: T; length: number; toArray(): T[];
+ toJSON(): T[]; inspect(): string; buffer: Buffer; ref(): Buffer; };
+
+ new (length?: number): { [i: number]: T; length: number; toArray(): T[];
+ toJSON(): T[]; inspect(): string; buffer: Buffer; ref(): Buffer; };
+ new (data: number[], length?: number): { [i: number]: T; length: number; toArray(): T[];
+ toJSON(): T[]; inspect(): string; buffer: Buffer; ref(): Buffer; };
+ new (data: Buffer, length?: number): { [i: number]: T; length: number; toArray(): T[];
+ toJSON(): T[]; inspect(): string; buffer: Buffer; ref(): Buffer; };
+ (length?: number): { [i: number]: T; length: number; toArray(): T[];
+ toJSON(): T[]; inspect(): string; buffer: Buffer; ref(): Buffer; };
+ (data: number[], length?: number): { [i: number]: T; length: number; toArray(): T[];
+ toJSON(): T[]; inspect(): string; buffer: Buffer; ref(): Buffer; };
+ (data: Buffer, length?: number): { [i: number]: T; length: number; toArray(): T[];
+ toJSON(): T[]; inspect(): string; buffer: Buffer; ref(): Buffer; };
+ }
+
+ /**
+ * The array type meta-constructor.
+ * The returned constructor's API is highly influenced by the WebGL
+ * TypedArray API.
+ */
+ var ArrayType: {
+ new (type: ref.Type, length?: number): ArrayType;
+ new (type: string, length?: number): ArrayType;
+ (type: ref.Type, length?: number): ArrayType;
+ (type: string, length?: number): ArrayType;
+ };
+
+export = ArrayType;
+}
diff --git a/ref-struct/ref-struct.d.ts b/ref-struct/ref-struct.d.ts
new file mode 100644
index 0000000000..7c2019655c
--- /dev/null
+++ b/ref-struct/ref-struct.d.ts
@@ -0,0 +1,64 @@
+// Type definitions for ref-union
+// Project: https://github.com/TooTallNate/ref-struct
+// Definitions by: Paul Loyd
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+///
+///
+
+declare module "ref-struct" {
+ import ref = require('ref');
+
+ /**
+ * This is the `constructor` of the Struct type that gets returned.
+ *
+ * Invoke it with `new` to create a new Buffer instance backing the struct.
+ * Pass it an existing Buffer instance to use that as the backing buffer.
+ * Pass in an Object containing the struct fields to auto-populate the
+ * struct with the data.
+ *
+ * @constructor
+ */
+ interface StructType extends ref.Type {
+ /** Pass it an existing Buffer instance to use that as the backing buffer. */
+ new (arg: Buffer, data?: {}): any;
+ new (data?: {}): any;
+ /** Pass it an existing Buffer instance to use that as the backing buffer. */
+ (arg: Buffer, data?: {}): any;
+ (data?: {}): any;
+
+ fields: {[key: string]: {type: ref.Type}};
+
+ /**
+ * Adds a new field to the struct instance with the given name and type.
+ * Note that this function will throw an Error if any instances of the struct
+ * type have already been created, therefore this function must be called at the
+ * beginning, before any instances are created.
+ */
+ defineProperty(name: string, type: ref.Type): void;
+
+ /**
+ * Adds a new field to the struct instance with the given name and type.
+ * Note that this function will throw an Error if any instances of the struct
+ * type have already been created, therefore this function must be called at the
+ * beginning, before any instances are created.
+ */
+ defineProperty(name: string, type: string): void;
+
+ /**
+ * Custom for struct type instances.
+ * @override
+ */
+ toString(): string;
+ }
+
+ /** The struct type meta-constructor. */
+ var StructType: {
+ new (fields?: {}): StructType;
+ new (fields?: any[]): StructType;
+ (fields?: {}): StructType;
+ (fields?: any[]): StructType;
+ }
+
+export = StructType;
+}
diff --git a/ref-union/ref-union.d.ts b/ref-union/ref-union.d.ts
new file mode 100644
index 0000000000..23dbdae397
--- /dev/null
+++ b/ref-union/ref-union.d.ts
@@ -0,0 +1,64 @@
+// Type definitions for ref-union
+// Project: https://github.com/TooTallNate/ref-union
+// Definitions by: Paul Loyd
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+///
+///
+
+declare module "ref-union" {
+ import ref = require('ref');
+
+ /**
+ * This is the `constructor` of the Struct type that gets returned.
+ *
+ * Invoke it with `new` to create a new Buffer instance backing the union.
+ * Pass it an existing Buffer instance to use that as the backing buffer.
+ * Pass in an Object containing the union fields to auto-populate the
+ * union with the data.
+ *
+ * @constructor
+ */
+ interface UnionType extends ref.Type {
+ /** Pass it an existing Buffer instance to use that as the backing buffer. */
+ new (arg: Buffer, data?: {}): any;
+ new (data?: {}): any;
+ /** Pass it an existing Buffer instance to use that as the backing buffer. */
+ (arg: Buffer, data?: {}): any;
+ (data?: {}): any;
+
+ fields: {[key: string]: {type: ref.Type}};
+
+ /**
+ * Adds a new field to the union instance with the given name and type.
+ * Note that this function will throw an Error if any instances of the union
+ * type have already been created, therefore this function must be called at the
+ * beginning, before any instances are created.
+ */
+ defineProperty(name: string, type: ref.Type): void;
+
+ /**
+ * Adds a new field to the union instance with the given name and type.
+ * Note that this function will throw an Error if any instances of the union
+ * type have already been created, therefore this function must be called at the
+ * beginning, before any instances are created.
+ */
+ defineProperty(name: string, type: string): void;
+
+ /**
+ * Custom for union type instances.
+ * @override
+ */
+ toString(): string;
+ }
+
+ /** The union type meta-constructor. */
+ var UnionType: {
+ new (fields?: {}): UnionType;
+ new (fields?: any[]): UnionType;
+ (fields?: {}): UnionType;
+ (fields?: any[]): UnionType;
+ }
+
+export = UnionType;
+}
diff --git a/ref/ref.d.ts b/ref/ref.d.ts
new file mode 100644
index 0000000000..86e7840bed
--- /dev/null
+++ b/ref/ref.d.ts
@@ -0,0 +1,190 @@
+// Type definitions for ref-union
+// Project: https://github.com/TooTallNate/ref
+// Definitions by: Paul Loyd
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+///
+
+declare module "ref" {
+ export interface Type {
+ /** The size in bytes required to hold this datatype. */
+ size: number;
+ /** The current level of indirection of the buffer. */
+ indirection: number;
+ /** To invoke when `ref.get` is invoked on a buffer of this type. */
+ get(buffer: Buffer, offset: number): any;
+ /** To invoke when `ref.set` is invoked on a buffer of this type. */
+ set(buffer: Buffer, offset: number, value: any): void;
+ /** The name to use during debugging for this datatype. */
+ name?: string;
+ /** The alignment of this datatype when placed inside a struct. */
+ alignment?: number;
+ }
+
+ /** A Buffer that references the C NULL pointer. */
+ export var NULL: Buffer;
+ /** A pointer-sized buffer pointing to NULL. */
+ export var NULL_POINTER: Buffer;
+ /** Get the memory address of buffer. */
+ export function address(buffer: Buffer): number;
+ /** Allocate the memory with the given value written to it. */
+ export function alloc(type: Type, value?: any): Buffer;
+ /** Allocate the memory with the given value written to it. */
+ export function alloc(type: string, value?: any): Buffer;
+
+ /**
+ * Allocate the memory with the given string written to it with the given
+ * encoding (defaults to utf8). The buffer is 1 byte longer than the
+ * string itself, and is NULL terminated.
+ */
+ export function allocCString(string: string, encoding?: string): Buffer;
+
+ /** Coerce a type.*/
+ export function coerceType(type: Type): Type;
+ /** Coerce a type. String are looked up from the ref.types object. */
+ export function coerceType(type: string): Type;
+
+ /**
+ * Get value after dereferencing buffer.
+ * That is, first it checks the indirection count of buffer's type, and
+ * if it's greater than 1 then it merely returns another Buffer, but with
+ * one level less indirection.
+ */
+ export function deref(buffer: Buffer): any;
+
+ /** Create clone of the type, with decremented indirection level by 1. */
+ export function derefType(type: Type): Type;
+ /** Create clone of the type, with decremented indirection level by 1. */
+ export function derefType(type: string): Type;
+ /** Represents the native endianness of the processor ("LE" or "BE"). */
+ export var endianness: string;
+ /** Check the indirection level and return a dereferenced when necessary. */
+ export function get(buffer: Buffer, offset?: number, type?: Type): any;
+ /** Check the indirection level and return a dereferenced when necessary. */
+ export function get(buffer: Buffer, offset?: number, type?: string): any;
+ /** Get type of the buffer. Create a default type when none exists. */
+ export function getType(buffer: Buffer): Type;
+ /** Check the NULL. */
+ export function isNull(buffer: Buffer): boolean;
+ /** Read C string until the first NULL. */
+ export function readCString(buffer: Buffer, offset?: number): string;
+
+ /**
+ * Read a big-endian signed 64-bit int.
+ * If there is losing precision, then return a string, otherwise a number.
+ * @return {number|string}
+ */
+ export function readInt64BE(buffer: Buffer, offset?: number): any;
+
+ /**
+ * Read a little-endian signed 64-bit int.
+ * If there is losing precision, then return a string, otherwise a number.
+ * @return {number|string}
+ */
+ export function readInt64LE(buffer: Buffer, offset?: number): any;
+
+ /** Read a JS Object that has previously been written. */
+ export function readObject(buffer: Buffer, offset?: number): Object;
+ /** Read data from the pointer. */
+ export function readPointer(buffer: Buffer, offset?: number,
+ length?: number): Buffer;
+ /**
+ * Read a big-endian unsigned 64-bit int.
+ * If there is losing precision, then return a string, otherwise a number.
+ * @return {number|string}
+ */
+ export function readUInt64BE(buffer: Buffer, offset?: number): any;
+
+ /**
+ * Read a little-endian unsigned 64-bit int.
+ * If there is losing precision, then return a string, otherwise a number.
+ * @return {number|string}
+ */
+ export function readUInt64LE(buffer: Buffer, offset?: number): any;
+
+ /** Create pointer to buffer. */
+ export function ref(buffer: Buffer): Buffer;
+ /** Create clone of the type, with incremented indirection level by 1. */
+ export function refType(type: Type): Type;
+ /** Create clone of the type, with incremented indirection level by 1. */
+ export function refType(type: string): Type;
+
+ /**
+ * Create buffer with the specified size, with the same address as source.
+ * This function "attaches" source to the returned buffer to prevent it from
+ * being garbage collected.
+ */
+ export function reinterpret(buffer: Buffer, size: number,
+ offset?: number): Buffer;
+ /**
+ * Scan past the boundary of the buffer's length until it finds size number
+ * of aligned NULL bytes.
+ */
+ export function reinterpretUntilZeros(buffer: Buffer, size: number,
+ offset?: number): Buffer;
+
+ /** Write pointer if the indirection is 1, otherwise write value. */
+ export function set(buffer: Buffer, offset: number, value: any, type?: Type): void;
+ /** Write pointer if the indirection is 1, otherwise write value. */
+ export function set(buffer: Buffer, offset: number, value: any, type?: string): void;
+ /** Write the string as a NULL terminated. Default encoding is utf8. */
+ export function writeCString(buffer: Buffer, offset: number,
+ string: string, encoding?: string): void;
+ /** Write a big-endian signed 64-bit int. */
+ export function writeInt64BE(buffer: Buffer, offset: number, input: number): void;
+ /** Write a big-endian signed 64-bit int. */
+ export function writeInt64BE(buffer: Buffer, offset: number, input: string): void;
+ /** Write a little-endian signed 64-bit int. */
+ export function writeInt64LE(buffer: Buffer, offset: number, input: number): void;
+ /** Write a little-endian signed 64-bit int. */
+ export function writeInt64LE(buffer: Buffer, offset: number, input: string): void;
+
+ /**
+ * Write the JS Object. This function "attaches" object to buffer to prevent
+ * it from being garbage collected.
+ */
+ export function writeObject(buffer: Buffer, offset: number, object: Object): void;
+
+ /**
+ * Write the memory address of pointer to buffer at the specified offset. This
+ * function "attaches" object to buffer to prevent it from being garbage collected.
+ */
+ export function writePointer(buffer: Buffer, offset: number,
+ pointer: Buffer): void;
+
+ /** Write a little-endian unsigned 64-bit int. */
+ export function writeUInt64BE(buffer: Buffer, offset: number, input: number): void;
+ /** Write a little-endian unsigned 64-bit int. */
+ export function writeUInt64BE(buffer: Buffer, offset: number, input: string): void;
+
+ /**
+ * Attach object to buffer such.
+ * It prevents object from being garbage collected until buffer does.
+ */
+ export function _attach(buffer: Buffer, object: Object): void;
+
+ /** Same as ref.reinterpret, except that this version does not attach buffer. */
+ export function _reinterpret(buffer: Buffer, size: number,
+ offset?: number): Buffer;
+ /** Same as ref.reinterpretUntilZeros, except that this version does not attach buffer. */
+ export function _reinterpretUntilZeros(buffer: Buffer, size: number,
+ offset?: number): Buffer;
+ /** Same as ref.writePointer, except that this version does not attach pointer. */
+ export function _writePointer(buffer: Buffer, offset: number,
+ pointer: Buffer): void;
+ /** Same as ref.writeObject, except that this version does not attach object. */
+ export function _writeObject(buffer: Buffer, offset: number, object: Object): void;
+
+ /** Default types. */
+ export var types: {
+ void: Type; int64: Type; ushort: Type;
+ int: Type; uint64: Type; float: Type;
+ uint: Type; long: Type; double: Type;
+ int8: Type; ulong: Type; Object: Type;
+ uint8: Type; longlong: Type; CString: Type;
+ int16: Type; ulonglong: Type; bool: Type;
+ uint16: Type; char: Type; byte: Type;
+ int32: Type; uchar: Type; size_t: Type;
+ uint32: Type; short: Type;
+ };
+}