win32-def
Version:
win32 definitions for node-ffi
123 lines (104 loc) • 3.85 kB
text/typescript
/* eslint-disable @typescript-eslint/no-explicit-any */
import type { ToAsyncFunction } from '@waiting/shared-types'
import type { IKoffiCType, IKoffiLib, TypeSpecWithAlignment } from 'koffi'
import type {
CallingConvention,
DllFuncsType,
FnDefFullParams,
FnDefName,
FuncDefList,
} from './ffi.types.js'
export type {
IKoffiRegisteredCallback,
KoffiFunction,
} from 'koffi'
export type { IKoffiLib }
export interface LoadOptions<T = unknown> {
dll: string
dllFuncs: FuncDefList<T>
usedFuncNames?: FnDefName[] | undefined
_WIN64?: boolean // default from process.arch
/**
* Calling convention
* @default 'Cdecl'
* @link https://koffi.dev/functions#calling-conventions
*/
convention?: CallingConvention
/**
* Create struct automatically from parameters of function definition list
* @description param like 'POINT*' or 'POINT *', POINT_Factory() will be called
* @default true
*/
autoCreateStruct?: boolean // for load()
/**
* Multiple choice mapper for function parameters
*/
multipleChoiceMapperList?: MultipleChoiceMapperList
/**
* Force re-register the library, overwriting the existing one
* @default false
*/
forceRegister?: boolean
}
export type LibDefBase = Record<string, FnDefFullParams>
export type LibDef2Type<T> = Record<Exclude<keyof T, 'prototype'>, (...args: any) => unknown>
/**
* FFI library containing functions
*/
export type FLib<T extends object = DllFuncsType> = T & FLibExtMethods & {
[K in keyof T as K extends `${string}_Async` ? K : `${K & string}_Async`]: T[K] extends (...args: any) => unknown
? ToAsyncFunction<T[K]>
: never
}
export interface FLibExtMethods {
/**
* @note Unload the library
* - On windows, it may cause later calls to functions in the library to fail!
* - On some platforms (such as with the musl C library on Linux), shared libraries cannot be unloaded,
* so the library will remain loaded and memory mapped after the call to lib.unload().
*/
unload: () => void
updateMultipleChoiceMapper: (options: UpdateMultipleChoiceMapperOptions) => void
}
export interface UpdateMultipleChoiceMapperOptions {
/** update using name+Set */
fnName?: string
mapperSet?: MultipleChoiceMapperSet
/** update using Map (contains name+Set) */
mapperList?: MultipleChoiceMapperList
}
/**
* Multiple choice parameter mapper
* return the matched function definition arguments if matched,
* otherwise return undefined (will then match the next mapper)
*/
export type _MultipleChoiceMapper<TRuntimeArgs extends any[] = any, TFnDefArgs extends string[] | readonly string[] = any> = (
fnName: string,
runtimeArgs: TRuntimeArgs,
fnDefCallParamsExpanded: (Readonly<TFnDefArgs> | TFnDefArgs)[]
) => TFnDefArgs | string[] | readonly string[] | undefined
export type MultipleChoiceMapper<TRuntimeArgs extends any[] = any, TFnDefArgs extends string[] | readonly string[] = any>
= _MultipleChoiceMapper<TRuntimeArgs, TFnDefArgs> & { name: string }
export type MultipleChoiceMapperList = Map<string, MultipleChoiceMapperSet>
export type MultipleChoiceMapperSet = Set<MultipleChoiceMapper>
/**
* The return value of payload always be new one after each call of the struct factory function or access payload
*/
export interface StructFactoryResult<T extends object = object> extends StructDetail {
/**
* Struct payload for _Out_ or _Inout_ parameter
*/
readonly payload: T
readonly sizeColumns?: PropertyKey[]
}
export interface StructDetail {
readonly name: string
readonly pointer: string
readonly CType: IKoffiCType
readonly size: number
}
export type StructFactory = () => StructFactoryResult
export interface StructInitType {
[key: string]: string | IKoffiCType | StructFactory | StructInitType
}
export type StructInitPlainType = Record<string, TypeSpecWithAlignment>