unffi 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Rajaniraiyn R
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # unffi
1
+ # UnFFI
2
2
 
3
3
  [![npm version](https://img.shields.io/npm/v/unffi?style=flat-square)](https://www.npmjs.com/package/unffi) [![license](https://img.shields.io/npm/l/unffi?style=flat-square)](./LICENSE) [![CI](https://img.shields.io/github/actions/workflow/status/rajaniraiyn/unffi/ci.yml?style=flat-square&label=CI)](https://github.com/rajaniraiyn/unffi/actions)
4
4
 
@@ -0,0 +1,24 @@
1
+ import type { SymbolsSchema, InferLibrary } from '../define.js';
2
+ import type { CType, CoreT } from '../types.js';
3
+ export type { InferLibrary };
4
+ export interface BunT extends CoreT {
5
+ readonly bun: {
6
+ /**
7
+ * 64-bit signed integer that returns `number` when the value fits in a
8
+ * safe integer, `bigint` otherwise. Same as `FFIType.i64_fast`.
9
+ */
10
+ readonly i64_fast: CType<number | bigint>;
11
+ /**
12
+ * 64-bit unsigned integer that returns `number` when the value fits in a
13
+ * safe integer, `bigint` otherwise. Same as `FFIType.u64_fast`.
14
+ */
15
+ readonly u64_fast: CType<number | bigint>;
16
+ /** NAPI environment pointer — for interop with Node-API addons. */
17
+ readonly napi_env: CType<unknown>;
18
+ /** NAPI value — for interop with Node-API addons. */
19
+ readonly napi_value: CType<unknown>;
20
+ };
21
+ }
22
+ export declare const t: BunT;
23
+ export declare function dlopen<const S extends SymbolsSchema>(path: string, schema: S): InferLibrary<S>;
24
+ //# sourceMappingURL=bun.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bun.d.ts","sourceRoot":"","sources":["../../src/adapters/bun.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,KAAK,EAAa,KAAK,EAAa,KAAK,EAAE,MAAM,aAAa,CAAA;AAIrE,YAAY,EAAE,YAAY,EAAE,CAAA;AAE5B,MAAM,WAAW,IAAK,SAAQ,KAAK;IACjC,QAAQ,CAAC,GAAG,EAAE;QACZ;;;WAGG;QACH,QAAQ,CAAC,QAAQ,EAAI,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAA;QAC3C;;;WAGG;QACH,QAAQ,CAAC,QAAQ,EAAI,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAA;QAC3C,mEAAmE;QACnE,QAAQ,CAAC,QAAQ,EAAI,KAAK,CAAC,OAAO,CAAC,CAAA;QACnC,qDAAqD;QACrD,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;KACpC,CAAA;CACF;AA2CD,eAAO,MAAM,CAAC,EAAE,IAAuD,CAAA;AAEvE,wBAAgB,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAgH9F"}
@@ -0,0 +1,141 @@
1
+ import { dlopen as bunDlopen, FFIType, JSCallback, CString, ptr as bunPtr } from 'bun:ffi';
2
+ import { t as coreT } from '../types.js';
3
+ import { runtimeHint } from './hints.js';
4
+ const coreFFITypes = {
5
+ void: FFIType.void,
6
+ bool: FFIType.bool,
7
+ i8: FFIType.int8_t,
8
+ i16: FFIType.int16_t,
9
+ i32: FFIType.int32_t,
10
+ i64: FFIType.int64_t,
11
+ u8: FFIType.uint8_t,
12
+ u16: FFIType.uint16_t,
13
+ u32: FFIType.uint32_t,
14
+ u64: FFIType.uint64_t,
15
+ f32: FFIType.float,
16
+ f64: FFIType.double,
17
+ cstring: FFIType.cstring,
18
+ pointer: FFIType.ptr,
19
+ buffer: FFIType.ptr,
20
+ function: FFIType.function,
21
+ };
22
+ const bunFFITypes = {
23
+ 'bun:i64_fast': FFIType.i64_fast,
24
+ 'bun:u64_fast': FFIType.u64_fast,
25
+ 'bun:napi_env': FFIType.napi_env,
26
+ 'bun:napi_value': FFIType.napi_value,
27
+ };
28
+ const allFFITypes = { ...coreFFITypes, ...bunFFITypes };
29
+ function getFFIType(kind) {
30
+ const type = allFFITypes[kind];
31
+ if (type !== undefined)
32
+ return type;
33
+ throw new Error(`[unffi/bun] Unsupported FFI type "${kind}". ${runtimeHint(kind, 'bun')}`);
34
+ }
35
+ const bunExtensions = {
36
+ i64_fast: { kind: 'bun:i64_fast' },
37
+ u64_fast: { kind: 'bun:u64_fast' },
38
+ napi_env: { kind: 'bun:napi_env' },
39
+ napi_value: { kind: 'bun:napi_value' },
40
+ };
41
+ export const t = Object.assign({}, coreT, { bun: bunExtensions });
42
+ export function dlopen(path, schema) {
43
+ const bunSymbols = {};
44
+ for (const [name, def] of Object.entries(schema)) {
45
+ bunSymbols[name] = {
46
+ args: def.args.map((a) => getFFIType(a.kind)),
47
+ returns: getFFIType(def.returns.kind),
48
+ ...(def.async && { nonblocking: true }),
49
+ };
50
+ }
51
+ const lib = bunDlopen(path, bunSymbols);
52
+ // NO FinalizationRegistry around JSCallbacks. C owns the function
53
+ // pointer indefinitely — a library can stash a callback (logger, atexit,
54
+ // signal handler) and invoke it long after the JS function is unreachable.
55
+ // GC-driven free would race with a live C-side pointer → use-after-free.
56
+ // Lifetime is bound to the library and freed in close().
57
+ const callbacks = new Map();
58
+ const symbols = {};
59
+ for (const [name, def] of Object.entries(schema)) {
60
+ const rawFn = lib.symbols[name];
61
+ const cstringInIdx = def.args
62
+ .map((a, i) => (a.kind === 'cstring' ? i : -1))
63
+ .filter((i) => i !== -1);
64
+ const bufferInIdx = def.args
65
+ .map((a, i) => (a.kind === 'buffer' ? i : -1))
66
+ .filter((i) => i !== -1);
67
+ const callbackIdx = def.args
68
+ .map((a, i) => (a.kind === 'function' ? i : -1))
69
+ .filter((i) => i !== -1);
70
+ const returnsCstring = def.returns.kind === 'cstring';
71
+ if (cstringInIdx.length === 0 &&
72
+ bufferInIdx.length === 0 &&
73
+ callbackIdx.length === 0 &&
74
+ !returnsCstring) {
75
+ symbols[name] = rawFn;
76
+ continue;
77
+ }
78
+ symbols[name] = (...args) => {
79
+ const wrapped = args.length === def.args.length ? args.slice() : [...args];
80
+ for (const i of cstringInIdx) {
81
+ const v = wrapped[i];
82
+ if (typeof v === 'string')
83
+ wrapped[i] = Buffer.from(v + '\0');
84
+ }
85
+ for (const i of bufferInIdx) {
86
+ const v = wrapped[i];
87
+ if (v != null && typeof v === 'object' && ArrayBuffer.isView(v) && v.byteLength > 0) {
88
+ wrapped[i] = bunPtr(v);
89
+ }
90
+ }
91
+ for (const i of callbackIdx) {
92
+ const cb = def.args[i];
93
+ const userFn = wrapped[i];
94
+ const cbCstrIdx = cb.argTypes
95
+ .map((a, j) => (a.kind === 'cstring' ? j : -1))
96
+ .filter((j) => j !== -1);
97
+ const wrappedFn = cbCstrIdx.length === 0
98
+ ? userFn
99
+ : (...cbArgs) => {
100
+ for (const j of cbCstrIdx) {
101
+ const p = cbArgs[j];
102
+ cbArgs[j] = p == null ? null : new CString(p).toString();
103
+ }
104
+ return userFn(...cbArgs);
105
+ };
106
+ const jsCb = new JSCallback(wrappedFn, {
107
+ args: cb.argTypes.map((a) => getFFIType(a.kind)),
108
+ returns: getFFIType(cb.returnType.kind),
109
+ });
110
+ callbacks.set(`${name}:${i}`, jsCb);
111
+ wrapped[i] = jsCb.ptr;
112
+ }
113
+ const result = rawFn(...wrapped);
114
+ if (returnsCstring) {
115
+ if (result instanceof Promise) {
116
+ return result.then((r) => (r instanceof String ? r.toString() : r));
117
+ }
118
+ if (result instanceof String)
119
+ return result.toString();
120
+ }
121
+ return result;
122
+ };
123
+ }
124
+ let closed = false;
125
+ function close() {
126
+ if (closed)
127
+ return; // idempotent: safe to call after `using` already disposed
128
+ closed = true;
129
+ for (const cb of callbacks.values())
130
+ cb.close();
131
+ callbacks.clear();
132
+ lib.close();
133
+ }
134
+ return {
135
+ symbols: symbols,
136
+ close,
137
+ [Symbol.dispose]: close,
138
+ [Symbol.asyncDispose]() { return Promise.resolve(close()); },
139
+ };
140
+ }
141
+ //# sourceMappingURL=bun.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bun.js","sourceRoot":"","sources":["../../src/adapters/bun.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { SymbolsSchema, InferLibrary } from '../define.js';
2
+ import type { CType, CoreT } from '../types.js';
3
+ export type { InferLibrary };
4
+ export interface DenoT extends CoreT {
5
+ readonly deno: {
6
+ /** Pointer-sized unsigned integer (64-bit on 64-bit systems) → `bigint` */
7
+ readonly usize: CType<bigint>;
8
+ /** Pointer-sized signed integer (64-bit on 64-bit systems) → `bigint` */
9
+ readonly isize: CType<bigint>;
10
+ /**
11
+ * Compose a struct C type. Passed by value to/from FFI as a
12
+ * BufferSource → Uint8Array. The `fields` argument is a list of
13
+ * unffi CType<*> tokens; their `kind`s are translated to Deno's
14
+ * NativeType under the hood.
15
+ *
16
+ * Example:
17
+ * const Point = t.deno.struct([t.f32, t.f32])
18
+ */
19
+ struct<const Fields extends readonly CType<any>[]>(fields: Fields): CType<Uint8Array>;
20
+ /**
21
+ * Zero-copy: return a Deno pointer to a TypedArray's memory.
22
+ * Pass the result to symbols typed as `t.pointer`.
23
+ * Equivalent to `Deno.UnsafePointer.of(view)`.
24
+ */
25
+ ptrOf(view: ArrayBufferView | ArrayBuffer): Deno.PointerValue;
26
+ /**
27
+ * Read a UTF-8 NUL-terminated string from a pointer.
28
+ * Useful for symbols that return `t.pointer` instead of `t.cstring`
29
+ * (e.g. when you need offset arithmetic).
30
+ */
31
+ readCString(pointer: Deno.PointerValue, offset?: number): string;
32
+ /**
33
+ * Zero-copy read of `byteLength` bytes at `pointer + offset` as an ArrayBuffer.
34
+ */
35
+ readArrayBuffer(pointer: Deno.PointerValue, byteLength: number, offset?: number): ArrayBuffer;
36
+ };
37
+ }
38
+ export declare const t: DenoT;
39
+ export declare function dlopen<const S extends SymbolsSchema>(path: string, schema: S): InferLibrary<S>;
40
+ //# sourceMappingURL=deno.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deno.d.ts","sourceRoot":"","sources":["../../src/adapters/deno.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,KAAK,EAAa,KAAK,EAAa,KAAK,EAAE,MAAM,aAAa,CAAA;AAIrE,YAAY,EAAE,YAAY,EAAE,CAAA;AAE5B,MAAM,WAAW,KAAM,SAAQ,KAAK;IAClC,QAAQ,CAAC,IAAI,EAAE;QACb,2EAA2E;QAC3E,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;QAC7B,yEAAyE;QACzE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;QAC7B;;;;;;;;WAQG;QACH,MAAM,CAAC,KAAK,CAAC,MAAM,SAAS,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,CAAA;QAErF;;;;WAIG;QACH,KAAK,CAAC,IAAI,EAAE,eAAe,GAAG,WAAW,GAAG,IAAI,CAAC,YAAY,CAAA;QAE7D;;;;WAIG;QACH,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;QAEhE;;WAEG;QACH,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;KAC9F,CAAA;CACF;AAoED,eAAO,MAAM,CAAC,EAAE,KAA0D,CAAA;AAe1E,wBAAgB,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAoI9F"}
@@ -0,0 +1,189 @@
1
+ import { t as coreT } from '../types.js';
2
+ import { runtimeHint } from './hints.js';
3
+ const coreDenoTypes = {
4
+ void: 'void',
5
+ bool: 'bool',
6
+ i8: 'i8', i16: 'i16', i32: 'i32', i64: 'i64',
7
+ u8: 'u8', u16: 'u16', u32: 'u32', u64: 'u64',
8
+ f32: 'f32', f64: 'f64',
9
+ cstring: 'pointer',
10
+ pointer: 'pointer',
11
+ buffer: 'buffer',
12
+ function: 'function',
13
+ };
14
+ const denoExtraTypes = {
15
+ 'deno:usize': 'usize',
16
+ 'deno:isize': 'isize',
17
+ };
18
+ const allDenoTypes = { ...coreDenoTypes, ...denoExtraTypes };
19
+ const StructDef = Symbol('unffi.deno.struct');
20
+ function isStructCType(t) {
21
+ return t[StructDef] !== undefined;
22
+ }
23
+ function getDenoType(type) {
24
+ if (isStructCType(type))
25
+ return type[StructDef];
26
+ const kind = type.kind;
27
+ const mapped = allDenoTypes[kind];
28
+ if (mapped !== undefined && mapped !== 'void')
29
+ return mapped;
30
+ if (mapped === 'void')
31
+ return mapped;
32
+ throw new Error(`[unffi/deno] Unsupported FFI type "${kind}". ${runtimeHint(kind, 'deno')}`);
33
+ }
34
+ function getDenoResultType(type) {
35
+ if (isStructCType(type))
36
+ return type[StructDef];
37
+ const kind = type.kind;
38
+ const mapped = allDenoTypes[kind];
39
+ if (mapped !== undefined)
40
+ return mapped;
41
+ throw new Error(`[unffi/deno] Unsupported FFI result type "${kind}".`);
42
+ }
43
+ const denoExtensions = {
44
+ usize: { kind: 'deno:usize' },
45
+ isize: { kind: 'deno:isize' },
46
+ struct(fields) {
47
+ const struct = {
48
+ struct: fields.map((f) => getDenoType(f)),
49
+ };
50
+ const token = { kind: 'pointer', [StructDef]: struct };
51
+ return token;
52
+ },
53
+ ptrOf(view) { return Deno.UnsafePointer.of(view); },
54
+ readCString(pointer, offset) {
55
+ if (pointer === null)
56
+ throw new Error('[unffi/deno] readCString called with null pointer');
57
+ return Deno.UnsafePointerView.getCString(pointer, offset);
58
+ },
59
+ readArrayBuffer(pointer, byteLength, offset) {
60
+ if (pointer === null)
61
+ throw new Error('[unffi/deno] readArrayBuffer called with null pointer');
62
+ return Deno.UnsafePointerView.getArrayBuffer(pointer, byteLength, offset);
63
+ },
64
+ };
65
+ export const t = Object.assign({}, coreT, { deno: denoExtensions });
66
+ const enc = new TextEncoder();
67
+ function encodeCStringPtr(s) {
68
+ const bytes = enc.encode(s + '\0');
69
+ return { ptr: Deno.UnsafePointer.of(bytes), bytes };
70
+ }
71
+ function decodeCStringResult(ptr) {
72
+ if (ptr === null)
73
+ return null;
74
+ return Deno.UnsafePointerView.getCString(ptr);
75
+ }
76
+ export function dlopen(path, schema) {
77
+ const denoSymbols = {};
78
+ for (const [name, def] of Object.entries(schema)) {
79
+ denoSymbols[name] = {
80
+ parameters: def.args.map((a) => getDenoType(a)),
81
+ result: getDenoResultType(def.returns),
82
+ ...(def.async && { nonblocking: true }),
83
+ };
84
+ }
85
+ let lib;
86
+ try {
87
+ lib = Deno.dlopen(path, denoSymbols);
88
+ }
89
+ catch (e) {
90
+ if (e instanceof Deno.errors.PermissionDenied) {
91
+ throw new Error('[unffi] Deno FFI requires the --allow-ffi permission flag.\n' +
92
+ ' Run your script with: deno run --allow-ffi <script.ts>\n' +
93
+ ' Docs: https://docs.deno.com/runtime/fundamentals/ffi/');
94
+ }
95
+ throw e;
96
+ }
97
+ // NO FinalizationRegistry on UnsafeCallbacks. C may retain the
98
+ // pointer after the JS function becomes unreachable (stored handler,
99
+ // signal/atexit hook), so GC-driven free races with a live C-side caller.
100
+ // Lifetime is bound to the library, freed in close().
101
+ const callbacks = new Set();
102
+ const wrappedSymbols = {};
103
+ for (const [name, def] of Object.entries(schema)) {
104
+ const rawFn = lib.symbols[name];
105
+ if (!rawFn)
106
+ continue;
107
+ const cstringInIdx = def.args
108
+ .map((a, i) => (a.kind === 'cstring' ? i : -1))
109
+ .filter((i) => i !== -1);
110
+ const callbackIdx = def.args
111
+ .map((a, i) => (a.kind === 'function' ? i : -1))
112
+ .filter((i) => i !== -1);
113
+ const returnsCstring = def.returns.kind === 'cstring';
114
+ if (cstringInIdx.length === 0 && callbackIdx.length === 0 && !returnsCstring) {
115
+ wrappedSymbols[name] = rawFn;
116
+ continue;
117
+ }
118
+ wrappedSymbols[name] = (...args) => {
119
+ const wrapped = [...args];
120
+ const keepAlive = [];
121
+ for (const i of cstringInIdx) {
122
+ const v = wrapped[i];
123
+ if (typeof v === 'string') {
124
+ const { ptr, bytes } = encodeCStringPtr(v);
125
+ keepAlive.push(bytes);
126
+ wrapped[i] = ptr;
127
+ }
128
+ // If the caller already passed a Deno.PointerValue (advanced path), leave it.
129
+ }
130
+ for (const i of callbackIdx) {
131
+ const cb = def.args[i];
132
+ const userFn = wrapped[i];
133
+ const cbCstrIdx = cb.argTypes
134
+ .map((a, j) => (a.kind === 'cstring' ? j : -1))
135
+ .filter((j) => j !== -1);
136
+ const cbReturnsCstring = cb.returnType.kind === 'cstring';
137
+ const cbKeepAlive = [];
138
+ const inner = (cbCstrIdx.length === 0 && !cbReturnsCstring)
139
+ ? userFn
140
+ : (...cbArgs) => {
141
+ for (const j of cbCstrIdx) {
142
+ const p = cbArgs[j];
143
+ cbArgs[j] = p === null ? null : Deno.UnsafePointerView.getCString(p);
144
+ }
145
+ const r = userFn(...cbArgs);
146
+ if (cbReturnsCstring && typeof r === 'string') {
147
+ const bytes = enc.encode(r + '\0');
148
+ cbKeepAlive.push(bytes);
149
+ return Deno.UnsafePointer.of(bytes);
150
+ }
151
+ return r;
152
+ };
153
+ const unsafeCb = new Deno.UnsafeCallback({
154
+ parameters: cb.argTypes.map((a) => getDenoType(a)),
155
+ result: getDenoResultType(cb.returnType),
156
+ }, inner);
157
+ callbacks.add(unsafeCb);
158
+ wrapped[i] = unsafeCb.pointer;
159
+ }
160
+ const result = rawFn(...wrapped);
161
+ if (returnsCstring) {
162
+ if (result instanceof Promise) {
163
+ return result.then((r) => decodeCStringResult(r));
164
+ }
165
+ return decodeCStringResult(result);
166
+ }
167
+ // Touch keepAlive after the call so the optimiser cannot drop it.
168
+ void keepAlive.length;
169
+ return result;
170
+ };
171
+ }
172
+ let closed = false;
173
+ function close() {
174
+ if (closed)
175
+ return; // idempotent: safe to call after `using` already disposed
176
+ closed = true;
177
+ for (const cb of callbacks)
178
+ cb.close();
179
+ callbacks.clear();
180
+ lib.close();
181
+ }
182
+ return {
183
+ symbols: wrappedSymbols,
184
+ close,
185
+ [Symbol.dispose]: close,
186
+ [Symbol.asyncDispose]() { return Promise.resolve(close()); },
187
+ };
188
+ }
189
+ //# sourceMappingURL=deno.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deno.js","sourceRoot":"","sources":["../../src/adapters/deno.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runtimeHint(kind: string, self: 'bun' | 'deno' | 'node'): string;
2
+ //# sourceMappingURL=hints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hints.d.ts","sourceRoot":"","sources":["../../src/adapters/hints.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAM/E"}
@@ -0,0 +1,12 @@
1
+ export function runtimeHint(kind, self) {
2
+ if (self !== 'bun' && kind.startsWith('bun:'))
3
+ return 'This is a Bun-specific type — run with Bun. See https://bun.sh/docs/api/ffi';
4
+ if (self !== 'deno' && kind.startsWith('deno:'))
5
+ return 'This is a Deno-specific type — run with Deno. See https://docs.deno.com/runtime/fundamentals/ffi/';
6
+ if (self !== 'node' && kind.startsWith('node:'))
7
+ return 'This is a Node.js-specific type — run with Node.js.';
8
+ if (self !== 'node' && kind.startsWith('koffi:'))
9
+ return 'This is a koffi-specific type — run with Node.js and install koffi. See https://koffi.dev';
10
+ return 'Unknown type kind.';
11
+ }
12
+ //# sourceMappingURL=hints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hints.js","sourceRoot":"","sources":["../../src/adapters/hints.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,IAA6B;IACrE,IAAI,IAAI,KAAK,KAAK,IAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAI,OAAO,6EAA6E,CAAA;IACvI,IAAI,IAAI,KAAK,MAAM,IAAK,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAG,OAAO,mGAAmG,CAAA;IAC7J,IAAI,IAAI,KAAK,MAAM,IAAK,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAG,OAAO,qDAAqD,CAAA;IAC/G,IAAI,IAAI,KAAK,MAAM,IAAK,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,2FAA2F,CAAA;IACrJ,OAAO,oBAAoB,CAAA;AAC7B,CAAC"}
@@ -0,0 +1,48 @@
1
+ import koffi, { type IKoffiLib } from 'koffi';
2
+ import type { SymbolsSchema, InferLibrary } from '../define.js';
3
+ import type { CType, CoreT } from '../types.js';
4
+ export type { InferLibrary };
5
+ type KoffiTypeSpec = Parameters<IKoffiLib['symbol']>[1];
6
+ type KoffiStructDef = Parameters<typeof koffi.struct>[0] extends infer P ? P extends Record<string, unknown> ? P : Record<string, KoffiTypeSpec> : Record<string, KoffiTypeSpec>;
7
+ type KoffiArrayHint = 'Array' | 'Typed' | 'String';
8
+ export interface KoffiT extends CoreT {
9
+ readonly koffi: {
10
+ /** UTF-16 string — for Windows APIs that use wide strings (koffi `str16`). */
11
+ readonly str16: CType<string>;
12
+ /** Pointer-sized unsigned integer, returns `bigint` (koffi `uintptr_t`). */
13
+ readonly uintptr: CType<bigint>;
14
+ /** Pointer-sized signed integer, returns `bigint` (koffi `intptr_t`). */
15
+ readonly intptr: CType<bigint>;
16
+ /** Build a struct type from a field map.
17
+ *
18
+ * ```ts
19
+ * const Point = t.koffi.struct<{ x: number; y: number }>({ x: 'float64', y: 'float64' })
20
+ * ``` */
21
+ struct<T = Record<string, unknown>>(def: KoffiStructDef): CType<T>;
22
+ struct<T = Record<string, unknown>>(name: string, def: KoffiStructDef): CType<T>;
23
+ /** Build a fixed-length array type. */
24
+ array<T = unknown>(ref: CType<T> | KoffiTypeSpec, len: number, hint?: KoffiArrayHint): CType<T[]>;
25
+ /** Build a pointer-to-type. */
26
+ pointer<T>(ref: CType<T> | KoffiTypeSpec): CType<T>;
27
+ /** Mark a parameter as output-only (caller passes a 1-element array; koffi writes index 0). */
28
+ out<T>(ref: CType<T> | KoffiTypeSpec): CType<[T]>;
29
+ /** Mark a parameter as input+output. */
30
+ inout<T>(ref: CType<T> | KoffiTypeSpec): CType<[T]>;
31
+ /** Opaque pointer type (foreign handle). */
32
+ opaque(name?: string): CType<unknown>;
33
+ /** Alias a type under a new name. */
34
+ alias<T>(name: string, ref: CType<T> | KoffiTypeSpec): CType<T>;
35
+ /** Encode a JS string into an ArrayBuffer of the given type (default `str` / UTF-8). */
36
+ encode(value: string, type?: KoffiTypeSpec): ArrayBuffer;
37
+ /** Decode a pointer / buffer back to a JS value. */
38
+ decode<T = unknown>(ref: unknown, type: CType<T> | KoffiTypeSpec): T;
39
+ /** Free memory allocated by `koffi.alloc` or returned as `disposable`. */
40
+ free(ref: unknown): void;
41
+ /** Direct access to the raw koffi module (escape hatch). */
42
+ readonly raw: typeof koffi;
43
+ };
44
+ }
45
+ export declare function getKoffiType(type: CType<unknown> | string): KoffiTypeSpec;
46
+ export declare const t: KoffiT;
47
+ export declare function dlopen<const S extends SymbolsSchema>(path: string, schema: S): InferLibrary<S>;
48
+ //# sourceMappingURL=koffi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"koffi.d.ts","sourceRoot":"","sources":["../../src/adapters/koffi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,168 @@
1
+ import koffi, {} from 'koffi';
2
+ import { t as coreT } from '../types.js';
3
+ import { runtimeHint } from './hints.js';
4
+ const nativeKoffiType = new WeakMap();
5
+ function brand(native) {
6
+ const ct = { kind: 'koffi:native' };
7
+ nativeKoffiType.set(ct, native);
8
+ return ct;
9
+ }
10
+ const coreKoffiTypes = {
11
+ void: 'void',
12
+ bool: 'bool',
13
+ i8: 'int8', i16: 'int16', i32: 'int32', i64: 'int64',
14
+ u8: 'uint8', u16: 'uint16', u32: 'uint32', u64: 'uint64',
15
+ f32: 'float32', f64: 'float64',
16
+ cstring: 'str', // koffi auto-encodes/decodes UTF-8 string ↔ char* (verified)
17
+ pointer: 'void *',
18
+ buffer: 'void *', // TypedArrays are passed zero-copy (verified — fill_buf mutates caller's Int32Array)
19
+ };
20
+ const koffiNamedExtras = {
21
+ 'koffi:str16': 'str16',
22
+ 'koffi:uintptr': 'uintptr_t',
23
+ 'koffi:intptr': 'intptr_t',
24
+ };
25
+ export function getKoffiType(type) {
26
+ if (typeof type !== 'string') {
27
+ const native = nativeKoffiType.get(type);
28
+ if (native !== undefined)
29
+ return native;
30
+ return resolveKind(type.kind);
31
+ }
32
+ return resolveKind(type);
33
+ }
34
+ function resolveKind(kind) {
35
+ if (kind in coreKoffiTypes)
36
+ return coreKoffiTypes[kind];
37
+ if (kind in koffiNamedExtras)
38
+ return koffiNamedExtras[kind];
39
+ if (kind === 'function')
40
+ return 'void *';
41
+ if (kind === 'koffi:native')
42
+ throw new Error('[unffi/koffi] Internal: koffi:native type missing IKoffiCType payload');
43
+ throw new Error(`[unffi/koffi] Unsupported FFI type "${kind}". ${runtimeHint(kind, 'node')}`);
44
+ }
45
+ function toSpec(ref) {
46
+ if (typeof ref === 'string')
47
+ return ref;
48
+ if (ref !== null && typeof ref === 'object' && '__brand' in ref)
49
+ return ref;
50
+ return getKoffiType(ref);
51
+ }
52
+ function asPointer(ref) {
53
+ return koffi.pointer(toSpec(ref));
54
+ }
55
+ const koffiExtensions = {
56
+ str16: { kind: 'koffi:str16' },
57
+ uintptr: { kind: 'koffi:uintptr' },
58
+ intptr: { kind: 'koffi:intptr' },
59
+ struct(a, b) {
60
+ const native = (typeof a === 'string')
61
+ ? koffi.struct(a, b)
62
+ : koffi.struct(a);
63
+ return brand(native);
64
+ },
65
+ array(ref, len, hint) {
66
+ const native = hint === undefined
67
+ ? koffi.array(toSpec(ref), len)
68
+ : koffi.array(toSpec(ref), len, hint);
69
+ return brand(native);
70
+ },
71
+ pointer(ref) {
72
+ return brand(koffi.pointer(toSpec(ref)));
73
+ },
74
+ out(ref) {
75
+ return brand(koffi.out(asPointer(ref)));
76
+ },
77
+ inout(ref) {
78
+ return brand(koffi.inout(asPointer(ref)));
79
+ },
80
+ opaque(name) {
81
+ return brand(name === undefined ? koffi.opaque() : koffi.opaque(name));
82
+ },
83
+ alias(name, ref) {
84
+ return brand(koffi.alias(name, toSpec(ref)));
85
+ },
86
+ encode(value, type = 'str') {
87
+ const slot = koffi.sizeof(type);
88
+ const size = slot > 0 ? Math.max(slot, value.length + 1) : value.length + 1;
89
+ const buf = new ArrayBuffer(size);
90
+ koffi.encode(buf, type, value);
91
+ return buf;
92
+ },
93
+ decode(ref, type) {
94
+ return koffi.decode(ref, toSpec(type));
95
+ },
96
+ free: koffi.free,
97
+ raw: koffi,
98
+ };
99
+ export const t = Object.assign({}, coreT, { koffi: koffiExtensions });
100
+ let cbCounter = 0;
101
+ export function dlopen(path, schema) {
102
+ const lib = koffi.load(path);
103
+ const symbols = {};
104
+ const registered = [];
105
+ for (const [name, def] of Object.entries(schema)) {
106
+ // Per-callback proto-pointer types, indexed by arg position.
107
+ const callbackDefs = [];
108
+ const cbPointerTypes = {};
109
+ const argTypes = def.args.map((a, i) => {
110
+ if (a.kind === 'function') {
111
+ const cb = a;
112
+ callbackDefs.push({ i, cb });
113
+ const proto = koffi.proto(`__unffi_cb_${name}_${i}_${++cbCounter}`, getKoffiType(cb.returnType), cb.argTypes.map((tt) => getKoffiType(tt)));
114
+ const ptr = koffi.pointer(proto);
115
+ cbPointerTypes[i] = ptr;
116
+ return ptr;
117
+ }
118
+ return getKoffiType(a);
119
+ });
120
+ const retType = getKoffiType(def.returns);
121
+ const fn = lib.func(name, retType, argTypes);
122
+ symbols[name] = def.async
123
+ ? (...callArgs) => {
124
+ const wrapped = wrapCallbacks(callArgs, callbackDefs, cbPointerTypes, registered);
125
+ return new Promise((resolve, reject) => fn.async(...wrapped, (err, result) => err ? reject(err) : resolve(result)));
126
+ }
127
+ : (...callArgs) => fn(...wrapCallbacks(callArgs, callbackDefs, cbPointerTypes, registered));
128
+ }
129
+ // NO FinalizationRegistry on koffi callbacks. C owns the function
130
+ // pointer indefinitely (stored callbacks, signal handlers, etc.); GC-driven
131
+ // unregister races with a live C-side caller. Lifetime is bound to the
132
+ // library and released in close().
133
+ let closed = false;
134
+ function close() {
135
+ if (closed)
136
+ return; // idempotent: safe to call after `using` already disposed
137
+ closed = true;
138
+ for (const reg of registered) {
139
+ try {
140
+ koffi.unregister(reg);
141
+ }
142
+ catch { /* already gone */ }
143
+ }
144
+ registered.length = 0;
145
+ const maybeLib = lib;
146
+ if (typeof maybeLib.unload === 'function')
147
+ maybeLib.unload();
148
+ }
149
+ return {
150
+ symbols: symbols,
151
+ close,
152
+ [Symbol.dispose]: close,
153
+ [Symbol.asyncDispose]() { return Promise.resolve(close()); },
154
+ };
155
+ }
156
+ function wrapCallbacks(args, defs, ptrTypes, registered) {
157
+ if (defs.length === 0)
158
+ return args;
159
+ const wrapped = [...args];
160
+ for (const { i } of defs) {
161
+ const userFn = args[i];
162
+ const reg = koffi.register(userFn, ptrTypes[i]);
163
+ registered.push(reg);
164
+ wrapped[i] = reg;
165
+ }
166
+ return wrapped;
167
+ }
168
+ //# sourceMappingURL=koffi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"koffi.js","sourceRoot":"","sources":["../../src/adapters/koffi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { SymbolsSchema, InferLibrary } from '../define.js';
2
+ import type { CoreT } from '../types.js';
3
+ import { type KoffiT } from './koffi.js';
4
+ export type { InferLibrary, KoffiT };
5
+ export declare const NODE_FFI_STABLE_VERSION: number;
6
+ export declare const t: KoffiT;
7
+ export declare function dlopen<const S extends SymbolsSchema>(path: string, schema: S): InferLibrary<S>;
8
+ export type { CoreT };
9
+ //# sourceMappingURL=node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/adapters/node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,KAAK,EAA+B,KAAK,EAAE,MAAM,aAAa,CAAA;AACrE,OAAO,EAAsC,KAAK,MAAM,EAAE,MAAM,YAAY,CAAA;AAG5E,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,CAAA;AAIpC,eAAO,MAAM,uBAAuB,QAAW,CAAA;AAE/C,eAAO,MAAM,CAAC,EAAE,MAAe,CAAA;AAgK/B,wBAAgB,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAG9F;AAED,YAAY,EAAE,KAAK,EAAE,CAAA"}
@@ -0,0 +1,127 @@
1
+ import { dlopen as koffiDlopen, t as koffiT } from './koffi.js';
2
+ import { runtimeHint } from './hints.js';
3
+ // node:ffi ABI broken in Node 26.3.0 (every call reports "expected 0 arguments").
4
+ // Bump once a release ships the fix.
5
+ export const NODE_FFI_STABLE_VERSION = Infinity;
6
+ export const t = koffiT;
7
+ const nodeMajor = parseInt(process.versions.node.split('.')[0] ?? '0', 10);
8
+ let nodeFfi = null;
9
+ async function detectNodeFFI() {
10
+ if (nodeMajor < 26)
11
+ return 'unavailable';
12
+ try {
13
+ // @ts-expect-error — node:ffi has no published type definitions yet
14
+ const mod = (await import('node:ffi'));
15
+ nodeFfi = (mod.default ?? mod);
16
+ return nodeMajor >= NODE_FFI_STABLE_VERSION ? 'available' : 'available-but-incomplete';
17
+ }
18
+ catch (e) {
19
+ const code = e.code;
20
+ if (code === 'ERR_EXPERIMENTAL_FEATURE_NOT_ENABLED')
21
+ return 'needs-flag';
22
+ if (code === 'ERR_UNKNOWN_BUILTIN_MODULE' && nodeMajor >= 26)
23
+ return 'needs-flag';
24
+ return 'unavailable';
25
+ }
26
+ }
27
+ const ffiState = await detectNodeFFI();
28
+ if (ffiState === 'needs-flag')
29
+ throw new Error('[unffi] Node.js native FFI is available in this version but requires the --experimental-ffi flag.\n' +
30
+ ' Run your script with: node --experimental-ffi <script.mjs>\n' +
31
+ ' Docs: https://nodejs.org/api/ffi.html');
32
+ if (ffiState === 'available-but-incomplete') {
33
+ process.emitWarning(`node:ffi is available in Node ${process.versions.node} but its function-call ABI is not ` +
34
+ 'yet complete (wrapped functions report "expected 0 arguments"). Falling back to koffi. ' +
35
+ 'Upgrade to a newer Node release once node:ffi stabilises.', 'UnffiWarning');
36
+ }
37
+ const coreNodeFfiTypes = {
38
+ void: 'void',
39
+ bool: 'bool',
40
+ i8: 'int8', i16: 'int16', i32: 'int32', i64: 'int64',
41
+ u8: 'uint8', u16: 'uint16', u32: 'uint32', u64: 'uint64',
42
+ f32: 'float32', f64: 'float64',
43
+ cstring: 'string',
44
+ pointer: 'pointer',
45
+ buffer: 'buffer',
46
+ function: 'function',
47
+ };
48
+ function nodeFfiTypeFor(kind) {
49
+ const mapped = coreNodeFfiTypes[kind];
50
+ if (mapped !== undefined)
51
+ return mapped;
52
+ throw new Error(`[unffi/node] Unsupported FFI type "${kind}". ${runtimeHint(kind, 'node')}`);
53
+ }
54
+ function nativeDlopen(path, schema) {
55
+ const ffi = nodeFfi;
56
+ if (!ffi)
57
+ throw new Error('[unffi/node] node:ffi module not loaded');
58
+ const ffiSchema = {};
59
+ const callbackDefs = {};
60
+ for (const [name, def] of Object.entries(schema)) {
61
+ ffiSchema[name] = {
62
+ parameters: def.args.map((a) => nodeFfiTypeFor(a.kind)),
63
+ result: nodeFfiTypeFor(def.returns.kind),
64
+ };
65
+ const cbs = def.args
66
+ .map((a, i) => a.kind === 'function' ? { i, cb: a } : null)
67
+ .filter((x) => x !== null);
68
+ if (cbs.length > 0)
69
+ callbackDefs[name] = cbs;
70
+ }
71
+ const handle = ffi.dlopen(path, ffiSchema);
72
+ const liveCallbacks = [];
73
+ const symbols = {};
74
+ for (const [name, def] of Object.entries(schema)) {
75
+ const rawFn = handle.functions[name];
76
+ if (!rawFn)
77
+ throw new Error(`[unffi/node] symbol "${name}" not found in ${path}`);
78
+ const cbs = callbackDefs[name];
79
+ if (def.async) {
80
+ symbols[name] = cbs
81
+ ? (...callArgs) => Promise.resolve().then(() => rawFn(...wrapCallbacks(handle.lib, callArgs, cbs, liveCallbacks)))
82
+ : (...callArgs) => Promise.resolve().then(() => rawFn(...callArgs));
83
+ }
84
+ else {
85
+ symbols[name] = cbs
86
+ ? (...callArgs) => rawFn(...wrapCallbacks(handle.lib, callArgs, cbs, liveCallbacks))
87
+ : rawFn;
88
+ }
89
+ }
90
+ // NO FinalizationRegistry on node:ffi callbacks. C owns the
91
+ // function pointer indefinitely; GC-driven unregister races with a live
92
+ // C-side caller. Lifetime is bound to the library, freed in close().
93
+ let closed = false;
94
+ function close() {
95
+ if (closed)
96
+ return; // idempotent: safe to call after `using` already disposed
97
+ closed = true;
98
+ for (const h of liveCallbacks)
99
+ handle.lib.unregisterCallback(h);
100
+ liveCallbacks.length = 0;
101
+ handle.lib.close();
102
+ }
103
+ return {
104
+ symbols: symbols,
105
+ close,
106
+ [Symbol.dispose]: close,
107
+ [Symbol.asyncDispose]() { return Promise.resolve(close()); },
108
+ };
109
+ }
110
+ function wrapCallbacks(lib, args, defs, liveCallbacks) {
111
+ const wrapped = [...args];
112
+ for (const { i, cb } of defs) {
113
+ const handle = lib.registerCallback({
114
+ parameters: cb.argTypes.map((a) => nodeFfiTypeFor(a.kind)),
115
+ result: nodeFfiTypeFor(cb.returnType.kind),
116
+ }, args[i]);
117
+ liveCallbacks.push(handle);
118
+ wrapped[i] = handle;
119
+ }
120
+ return wrapped;
121
+ }
122
+ export function dlopen(path, schema) {
123
+ if (ffiState === 'available')
124
+ return nativeDlopen(path, schema);
125
+ return koffiDlopen(path, schema);
126
+ }
127
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/adapters/node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { CType, CCallback, InferCType, InferTuple } from './types.js';
2
+ export interface SymbolDef {
3
+ readonly args: readonly CType<any>[];
4
+ readonly returns: CType<any>;
5
+ readonly async?: boolean;
6
+ }
7
+ export type SymbolsSchema = Record<string, SymbolDef>;
8
+ type InferReturn<S extends SymbolDef> = S['async'] extends true ? Promise<InferCType<S['returns']>> : InferCType<S['returns']>;
9
+ type MapArg<T extends CType<any>> = T extends CCallback<infer A extends readonly CType<any>[], infer R extends CType<any>> ? (...args: InferTuple<A>) => InferCType<R> : InferCType<T>;
10
+ type MapArgs<T extends readonly CType<any>[]> = T extends readonly [] ? [] : T extends readonly [infer H extends CType<any>, ...infer R extends CType<any>[]] ? [MapArg<H>, ...MapArgs<R>] : {
11
+ [K in keyof T]: T[K] extends CType<any> ? MapArg<T[K]> : never;
12
+ };
13
+ export type InferSymbolFn<S extends SymbolDef> = (...args: MapArgs<[...S['args']]>) => InferReturn<S>;
14
+ export type InferLibrary<S extends SymbolsSchema> = {
15
+ readonly symbols: {
16
+ readonly [K in keyof S]: InferSymbolFn<S[K]>;
17
+ };
18
+ close(): void;
19
+ [Symbol.dispose](): void;
20
+ [Symbol.asyncDispose](): Promise<void>;
21
+ };
22
+ export {};
23
+ //# sourceMappingURL=define.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE1E,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,CAAA;IACpC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CACzB;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;AAErD,KAAK,WAAW,CAAC,CAAC,SAAS,SAAS,IAClC,CAAC,CAAC,OAAO,CAAC,SAAS,IAAI,GACnB,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GACjC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAA;AAE9B,KAAK,MAAM,CAAC,CAAC,SAAS,KAAK,CAAC,GAAG,CAAC,IAC9B,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,SAAS,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,SAAS,KAAK,CAAC,GAAG,CAAC,CAAC,GAClF,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,GACzC,UAAU,CAAC,CAAC,CAAC,CAAA;AAEnB,KAAK,OAAO,CAAC,CAAC,SAAS,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,IAC1C,CAAC,SAAS,SAAS,EAAE,GACjB,EAAE,GACF,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAC9E,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,GAC1B;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK;CAAE,CAAA;AAE1E,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,SAAS,IAC3C,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,CAAA;AAEtD,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,aAAa,IAAI;IAClD,QAAQ,CAAC,OAAO,EAAE;QAAE,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KAAE,CAAA;IAClE,KAAK,IAAI,IAAI,CAAA;IACb,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAA;IACxB,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvC,CAAA"}
package/dist/define.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=define.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define.js","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ export { t } from './types.js';
2
+ export type { CType, CCallback, CTypeKind, Ptr, InferCType, InferTuple } from './types.js';
3
+ export type { SymbolDef, SymbolsSchema, InferLibrary, InferSymbolFn } from './define.js';
4
+ import type { SymbolsSchema, InferLibrary } from './define.js';
5
+ export declare function dlopen<const S extends SymbolsSchema>(path: string, schema: S): Promise<InferLibrary<S>>;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAA;AAC9B,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAC1F,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAExF,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE9D,wBAAsB,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,aAAa,EACxD,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,CAAC,GACR,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAY1B"}
package/dist/index.js ADDED
@@ -0,0 +1,17 @@
1
+ // Fallback entry for environments that don't resolve export conditions.
2
+ // Bun, Deno, and Node should get their dedicated adapters via package.json exports.
3
+ export { t } from './types.js';
4
+ export async function dlopen(path, schema) {
5
+ if ('Bun' in globalThis) {
6
+ const { dlopen: bunDlopen } = await import('./adapters/bun.js');
7
+ return bunDlopen(path, schema);
8
+ }
9
+ if ('Deno' in globalThis) {
10
+ const { dlopen: denoDlopen } = await import('./adapters/deno.js');
11
+ return denoDlopen(path, schema);
12
+ }
13
+ // Fallback: node adapter (tries native node:ffi, then koffi) — Bun → Deno → Node → koffi
14
+ const { dlopen: nodeDlopen } = await import('./adapters/node.js');
15
+ return nodeDlopen(path, schema);
16
+ }
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,oFAAoF;AACpF,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAA;AAM9B,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,IAAY,EACZ,MAAS;IAET,IAAI,KAAK,IAAI,UAAU,EAAE,CAAC;QACxB,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAA;QAC/D,OAAO,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAChC,CAAC;IACD,IAAI,MAAM,IAAI,UAAU,EAAE,CAAC;QACzB,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAA;QACjE,OAAO,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IACjC,CAAC;IACD,yFAAyF;IACzF,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAA;IACjE,OAAO,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;AACjC,CAAC"}
@@ -0,0 +1,39 @@
1
+ export interface CType<T> {
2
+ readonly _type: T;
3
+ readonly kind: CTypeKind;
4
+ }
5
+ export type CTypeKind = 'void' | 'bool' | 'i8' | 'i16' | 'i32' | 'i64' | 'u8' | 'u16' | 'u32' | 'u64' | 'f32' | 'f64' | 'cstring' | 'pointer' | 'buffer' | 'function';
6
+ declare const PtrBrand: unique symbol;
7
+ export type Ptr = bigint & {
8
+ readonly [PtrBrand]: true;
9
+ };
10
+ export type InferCType<T extends CType<any>> = T extends CType<infer U> ? U : never;
11
+ export type InferTuple<T extends readonly CType<any>[]> = T extends readonly [] ? [] : T extends readonly [infer H extends CType<any>, ...infer R extends CType<any>[]] ? [InferCType<H>, ...InferTuple<R>] : {
12
+ [K in keyof T]: T[K] extends CType<infer U> ? U : never;
13
+ };
14
+ export interface CCallback<Args extends readonly CType<any>[], Ret extends CType<any>> extends CType<(...args: InferTuple<Args>) => InferCType<Ret>> {
15
+ readonly kind: 'function';
16
+ readonly argTypes: Args;
17
+ readonly returnType: Ret;
18
+ }
19
+ export interface CoreT {
20
+ readonly void: CType<void>;
21
+ readonly bool: CType<boolean>;
22
+ readonly i8: CType<number>;
23
+ readonly i16: CType<number>;
24
+ readonly i32: CType<number>;
25
+ readonly i64: CType<bigint>;
26
+ readonly u8: CType<number>;
27
+ readonly u16: CType<number>;
28
+ readonly u32: CType<number>;
29
+ readonly u64: CType<bigint>;
30
+ readonly f32: CType<number>;
31
+ readonly f64: CType<number>;
32
+ readonly cstring: CType<string>;
33
+ readonly pointer: CType<Ptr | null>;
34
+ readonly buffer: CType<ArrayBufferView>;
35
+ fn<const Args extends readonly CType<any>[], const Ret extends CType<any>>(args: Args, returns: Ret): CCallback<Args, Ret>;
36
+ }
37
+ export declare const t: CoreT;
38
+ export {};
39
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,24 @@
1
+ function c(kind) {
2
+ return { kind };
3
+ }
4
+ export const t = {
5
+ void: c('void'),
6
+ bool: c('bool'),
7
+ i8: c('i8'),
8
+ i16: c('i16'),
9
+ i32: c('i32'),
10
+ i64: c('i64'),
11
+ u8: c('u8'),
12
+ u16: c('u16'),
13
+ u32: c('u32'),
14
+ u64: c('u64'),
15
+ f32: c('f32'),
16
+ f64: c('f64'),
17
+ cstring: c('cstring'),
18
+ pointer: c('pointer'),
19
+ buffer: c('buffer'),
20
+ fn(args, returns) {
21
+ return { kind: 'function', argTypes: args, returnType: returns };
22
+ },
23
+ };
24
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAgBA,SAAS,CAAC,CAAI,IAAe;IAC3B,OAAO,EAAE,IAAI,EAAyB,CAAA;AACxC,CAAC;AA0CD,MAAM,CAAC,MAAM,CAAC,GAAU;IACtB,IAAI,EAAK,CAAC,CAAO,MAAM,CAAC;IACxB,IAAI,EAAK,CAAC,CAAU,MAAM,CAAC;IAC3B,EAAE,EAAO,CAAC,CAAS,IAAI,CAAC;IACxB,GAAG,EAAM,CAAC,CAAS,KAAK,CAAC;IACzB,GAAG,EAAM,CAAC,CAAS,KAAK,CAAC;IACzB,GAAG,EAAM,CAAC,CAAS,KAAK,CAAC;IACzB,EAAE,EAAO,CAAC,CAAS,IAAI,CAAC;IACxB,GAAG,EAAM,CAAC,CAAS,KAAK,CAAC;IACzB,GAAG,EAAM,CAAC,CAAS,KAAK,CAAC;IACzB,GAAG,EAAM,CAAC,CAAS,KAAK,CAAC;IACzB,GAAG,EAAM,CAAC,CAAS,KAAK,CAAC;IACzB,GAAG,EAAM,CAAC,CAAS,KAAK,CAAC;IACzB,OAAO,EAAE,CAAC,CAAS,SAAS,CAAC;IAC7B,OAAO,EAAE,CAAC,CAAa,SAAS,CAAC;IACjC,MAAM,EAAG,CAAC,CAAkB,QAAQ,CAAC;IACrC,EAAE,CACA,IAAU,EACV,OAAY;QAEZ,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAqC,CAAA;IACrG,CAAC;CACF,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "unffi",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Universal FFI for Bun, Deno, and Node.js — one schema, runtime-native performance",
5
5
  "workspaces": ["docs"],
6
6
  "type": "module",
@@ -28,7 +28,9 @@
28
28
  },
29
29
  "files": [
30
30
  "dist",
31
- "src"
31
+ "src",
32
+ "LICENSE",
33
+ "README.md"
32
34
  ],
33
35
  "scripts": {
34
36
  "build": "tsgo -b tsconfig.json",
@@ -71,6 +73,14 @@
71
73
  "unjs"
72
74
  ],
73
75
  "license": "MIT",
76
+ "repository": {
77
+ "type": "git",
78
+ "url": "git+https://github.com/Rajaniraiyn/unffi.git"
79
+ },
80
+ "homepage": "https://github.com/Rajaniraiyn/unffi#readme",
81
+ "bugs": {
82
+ "url": "https://github.com/Rajaniraiyn/unffi/issues"
83
+ },
74
84
  "trustedDependencies": [
75
85
  "koffi"
76
86
  ]