ffi-rs
Version:
A module written in Rust and N-API provides interface (FFI) features for Node.js
204 lines (176 loc) • 4.83 kB
TypeScript
interface RawPointer { }
export interface JsExternal {
_externalDataPlaceholder: RawPointer;
}
export enum DataType {
/**
UTF-16 String, equivalent to char*
*/
String = 0,
/**
UTF-16 String, equivalent to wchar*
*/
WString = 15,
I32 = 1,
Double = 2,
/**
* denotes ordinary i32 number array instead of Uint32Array
*/
I32Array = 3,
StringArray = 4,
/**
denotes f64 array
*/
DoubleArray = 5,
Boolean = 6,
/**
equal with undefined
*/
Void = 7,
I64 = 8,
U8 = 9,
/**
Equivanlent to Buffer
*/
U8Array = 10,
/**
A type that wrap native pointer
*/
External = 11,
U64 = 12,
FloatArray = 13,
Float = 14,
/**
As params will be transformed to i64, as return value will be created from i64
*/
BigInt = 16,
I16 = 17,
StructArray = 18,
I16Array = 19,
U32 = 20,
StackStruct = 999, // reserve keyword
StackArray = 996,
Function = 998,
Array = 997,
}
type DataTypeToType<T> = T extends DataType.String
? string
: T extends DataType.WString
? string
: T extends DataType.U8
? number
: T extends DataType.I32
? number
: T extends DataType.I64
? number
: T extends DataType.BigInt
? BigInt
: T extends DataType.U64
? number
: T extends DataType.U32
? number
: T extends DataType.Double
? number
: T extends DataType.External
? JsExternal
: T extends DataType.U8Array
? number[]
: T extends DataType.I16Array
? number[]
: T extends DataType.I32Array
? number[]
: T extends DataType.StringArray
? string[]
: T extends DataType.DoubleArray
? number[]
: T extends DataType.FloatArray
? number[]
: T extends DataType.Boolean
? boolean
: T extends DataType.Void
? undefined
: never;
export enum FFITypeTag {
StackStruct = DataType.StackStruct,
StackArray = DataType.StackArray,
}
export interface ArrayConstructorOptions {
type: DataType;
length: number;
ffiTypeTag?: FFITypeTag;
dynamicArray?: boolean
structItemType?: RecordFieldType
}
export interface FuncConstructorOptions {
paramsType: FieldType[];
retType: FieldType;
needFree?: boolean
// Default:false, whether or not free function call params memory automatically which are allocated in c side
freeCFuncParamsMemory?: boolean
}
export function arrayConstructor(options: ArrayConstructorOptions): ArrayConstructorOptions;
export function funcConstructor(options: FuncConstructorOptions): FuncConstructorOptions;
export interface OpenParams {
library: string;
path: string;
}
export function open(params: OpenParams): void;
export function close(library: string): void;
export function createPointer(params: {
paramsType: FieldType[];
paramsValue: unknown[];
}): JsExternal[]
export enum PointerType {
RsPointer = 0,
CPointer = 1
}
export function freePointer(params: {
paramsType: FieldType[];
paramsValue: JsExternal[];
pointerType: PointerType
}): void
export function restorePointer<T>(params: {
retType: FieldType[];
paramsValue: JsExternal[];
}): DataTypeToType<T>[]
export function unwrapPointer(params: JsExternal[]): JsExternal[]
export function wrapPointer(params: JsExternal[]): JsExternal[]
export function isNullPointer(params: JsExternal): boolean
type ResultWithErrno<T, E = undefined> = E extends true
? { value: T; errnoCode: number; errnoMessage: string }
: T;
type ResultWithPromise<T, P = undefined> = P extends true
? Promise<T>
: T;
export type FieldType =
| DataType
| ArrayConstructorOptions
| FuncConstructorOptions
| RecordFieldType
interface RecordFieldType extends Record<string, FieldType> { }
type FieldTypeToType<T> = T extends DataType
? DataTypeToType<T>
: T extends ArrayConstructorOptions
? DataTypeToType<T['type']>
: T extends RecordFieldType
? { [K in keyof T]: FieldTypeToType<T[K]> }
: never;
export interface FFIParams<T, E = undefined, R = undefined> {
library: string;
funcName: string;
retType: T;
paramsType: FieldType[];
paramsValue: unknown[];
// whether need output errno
errno?: E
runInNewThread?: R
// Default:false, whether or not need to free the result of return value memory automatically
freeResultMemory?: boolean
}
export function load<T extends FieldType, E = undefined, R extends boolean | undefined = undefined>(
params: FFIParams<T, E, R>
): R extends true ? Promise<ResultWithErrno<FieldTypeToType<T>, E>> : ResultWithErrno<FieldTypeToType<T>, E>
type FuncObj<T, E = undefined, R = undefined> = Record<string, Omit<FFIParams<T, E, R>, 'paramsValue' | 'funcName'>>
export function define<T extends FuncObj<FieldType, boolean | undefined, boolean | undefined>>(funcs: T): {
[K in keyof T]: (paramsValue: unknown[]) => ResultWithPromise<ResultWithErrno<FieldTypeToType<T[K]['retType']>, T[K]['errno']>, T[K]['runInNewThread']>;
}