@jitl/opentui-core 0.1.97 → 0.2.15
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/NativeSpanFeed.d.ts +2 -2
- package/README.md +2 -1
- package/Renderable.d.ts +12 -1
- package/audio.d.ts +89 -0
- package/buffer.d.ts +6 -5
- package/console.d.ts +3 -1
- package/edit-buffer.d.ts +1 -1
- package/editor-view.d.ts +1 -1
- package/{index-yxe6e14n.js → index-46f5e8m6.js} +1388 -1721
- package/index-46f5e8m6.js.map +36 -0
- package/index-5zwezmgj.js +639 -0
- package/index-5zwezmgj.js.map +11 -0
- package/index-axv7cw60.js +44 -0
- package/index-axv7cw60.js.map +10 -0
- package/{index-rhfjv9c1.js → index-g9agybj3.js} +4626 -984
- package/index-g9agybj3.js.map +82 -0
- package/index-k18nf2r7.js +21 -0
- package/{ffi-x3zvcksd.js.map → index-k18nf2r7.js.map} +1 -1
- package/{index-tkk6cmr2.js → index-rp7vz5rh.js} +125 -23
- package/index-rp7vz5rh.js.map +10 -0
- package/{index-kcpn1hka.js → index-xwsdfq5x.js} +16 -6
- package/index-xwsdfq5x.js.map +10 -0
- package/index.d.ts +1 -0
- package/index.js +37 -17
- package/index.js.map +1 -1
- package/lib/RGBA.d.ts +22 -6
- package/lib/clipboard.d.ts +1 -1
- package/lib/{keymapping.d.ts → keybinding.internal.d.ts} +10 -2
- package/lib/objects-in-viewport.d.ts +4 -4
- package/lib/parse.keypress-kitty.d.ts +1 -0
- package/lib/parse.keypress.d.ts +1 -0
- package/lib/render-geometry.d.ts +8 -0
- package/lib/stdin-parser.d.ts +4 -1
- package/lib/terminal-capability-detection.d.ts +2 -0
- package/lib/terminal-palette.d.ts +20 -5
- package/lib/tree-sitter/assets/update.d.ts +1 -0
- package/lib/tree-sitter/client.d.ts +2 -0
- package/lib/tree-sitter/default-parsers.d.ts +1 -1
- package/lib/tree-sitter/index.d.ts +0 -2
- package/lib/tree-sitter/update-assets.d.ts +3 -0
- package/lib/tree-sitter/update-assets.js +377 -0
- package/lib/tree-sitter/update-assets.js.map +12 -0
- package/lib/tree-sitter-styled-text.d.ts +6 -4
- package/node22-bun-ffi-structs-ha8fmzzb.js +396 -0
- package/node22-bun-ffi-structs-ha8fmzzb.js.map +10 -0
- package/package.json +23 -22
- package/parser.worker.js +161 -24
- package/parser.worker.js.map +12 -5
- package/platform/bun-ffi-structs.d.ts +2 -0
- package/platform/ffi.d.ts +126 -0
- package/platform/node22-bun-ffi-structs.d.ts +33 -0
- package/platform/node22-ffi.d.ts +33 -0
- package/{compat → platform}/runtime.d.ts +6 -0
- package/platform/worker.d.ts +4 -0
- package/renderables/Code.d.ts +4 -0
- package/renderables/Markdown.d.ts +62 -0
- package/renderables/ScrollBox.d.ts +1 -0
- package/renderables/Select.d.ts +3 -1
- package/renderables/TabSelect.d.ts +3 -1
- package/renderables/TextBufferRenderable.d.ts +1 -0
- package/renderables/TextTable.d.ts +15 -1
- package/renderables/Textarea.d.ts +5 -3
- package/renderables/markdown-parser.d.ts +1 -0
- package/renderer-theme-mode.d.ts +29 -0
- package/renderer.d.ts +142 -16
- package/runtime-plugin-support-configure.d.ts +4 -0
- package/runtime-plugin-support-configure.js +20 -0
- package/{index-re3ntm60.js.map → runtime-plugin-support-configure.js.map} +1 -1
- package/runtime-plugin-support.d.ts +3 -3
- package/runtime-plugin-support.js +9 -18
- package/runtime-plugin-support.js.map +3 -3
- package/runtime-plugin.d.ts +1 -4
- package/runtime-plugin.js +5 -5
- package/syntax-style.d.ts +11 -3
- package/testing/terminal-capabilities.d.ts +7 -0
- package/testing/test-recorder.d.ts +6 -6
- package/testing/test-renderer.d.ts +34 -2
- package/testing.d.ts +2 -0
- package/testing.js +329 -23
- package/testing.js.map +7 -5
- package/text-buffer-view.d.ts +2 -1
- package/text-buffer.d.ts +1 -1
- package/types.d.ts +33 -1
- package/zig-structs.d.ts +111 -20
- package/zig.d.ts +57 -7
- package/3d/SpriteResourceManager.d.ts +0 -74
- package/3d/SpriteUtils.d.ts +0 -13
- package/3d/TextureUtils.d.ts +0 -24
- package/3d/ThreeRenderable.d.ts +0 -40
- package/3d/WGPURenderer.d.ts +0 -61
- package/3d/animation/ExplodingSpriteEffect.d.ts +0 -71
- package/3d/animation/PhysicsExplodingSpriteEffect.d.ts +0 -76
- package/3d/animation/SpriteAnimator.d.ts +0 -124
- package/3d/animation/SpriteParticleGenerator.d.ts +0 -62
- package/3d/canvas.d.ts +0 -44
- package/3d/index.d.ts +0 -12
- package/3d/physics/PlanckPhysicsAdapter.d.ts +0 -19
- package/3d/physics/RapierPhysicsAdapter.d.ts +0 -19
- package/3d/physics/physics-interface.d.ts +0 -27
- package/3d.d.ts +0 -2
- package/3d.js +0 -33843
- package/3d.js.map +0 -155
- package/Worker-vajwjk0s.js +0 -94
- package/Worker-vajwjk0s.js.map +0 -10
- package/compat/FFIType.d.ts +0 -304
- package/compat/Worker.d.ts +0 -1
- package/compat/bun-ffi-structs.d.ts +0 -2
- package/compat/ffi.d.ts +0 -86
- package/compat/nodejs/Worker.d.ts +0 -16
- package/compat/nodejs/bun-ffi-structs/index.d.ts +0 -46
- package/compat/nodejs/ffi.d.ts +0 -21
- package/compat/nodejs/registerResolveJs.d.ts +0 -1
- package/compat/nodejs/runtime.d.ts +0 -7
- package/compat/nodejs/test.d.ts +0 -4
- package/compat/nodejs/trampoline.worker.d.ts +0 -1
- package/compat/test.d.ts +0 -1
- package/compat/testHelpers.d.ts +0 -18
- package/ffi-x3zvcksd.js +0 -25
- package/index-5yqvbmcz.js +0 -220
- package/index-5yqvbmcz.js.map +0 -10
- package/index-bnfz2g63.js +0 -654
- package/index-bnfz2g63.js.map +0 -10
- package/index-cbvybypy.js +0 -43
- package/index-cbvybypy.js.map +0 -10
- package/index-kcpn1hka.js.map +0 -10
- package/index-re3ntm60.js +0 -51
- package/index-rhfjv9c1.js.map +0 -70
- package/index-tkk6cmr2.js.map +0 -10
- package/index-yxe6e14n.js.map +0 -42
- package/runtime-hdpkc6qf.js +0 -220
- package/runtime-hdpkc6qf.js.map +0 -17
- /package/{compat/nodejs/registerBun.d.ts → native-event-worker-repro.worker.d.ts} +0 -0
|
@@ -0,0 +1,639 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// src/platform/ffi.ts
|
|
3
|
+
import { createRequire as createRequire2 } from "module";
|
|
4
|
+
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
5
|
+
|
|
6
|
+
// src/platform/node22-ffi.ts
|
|
7
|
+
import { createRequire } from "module";
|
|
8
|
+
import { fileURLToPath } from "url";
|
|
9
|
+
import { isAnyArrayBuffer, isArrayBuffer, isArrayBufferView } from "util/types";
|
|
10
|
+
var requireModule = createRequire(import.meta.url);
|
|
11
|
+
var emptyPtrSentinel = new Uint8Array(1);
|
|
12
|
+
function createNode22Backend(modules = loadNode22Modules()) {
|
|
13
|
+
const { koffi, unsafePointerOf, unsafeArrayBufferAt } = modules;
|
|
14
|
+
const bunPtrType = koffi.pointer("BunPtr", koffi.opaque());
|
|
15
|
+
const bufferType = koffi.opaque("Buffer");
|
|
16
|
+
const napiEnvType = koffi.opaque("NapiEnv");
|
|
17
|
+
const napiValueType = koffi.opaque("NapiValue");
|
|
18
|
+
const ffiTypeToKoffiType = (type, position) => {
|
|
19
|
+
switch (type) {
|
|
20
|
+
case "char":
|
|
21
|
+
return koffi.types.char;
|
|
22
|
+
case "int8_t":
|
|
23
|
+
case "i8":
|
|
24
|
+
return koffi.types.int8_t;
|
|
25
|
+
case "uint8_t":
|
|
26
|
+
case "u8":
|
|
27
|
+
return koffi.types.uint8_t;
|
|
28
|
+
case "int16_t":
|
|
29
|
+
case "i16":
|
|
30
|
+
return koffi.types.int16_t;
|
|
31
|
+
case "uint16_t":
|
|
32
|
+
case "u16":
|
|
33
|
+
return koffi.types.uint16_t;
|
|
34
|
+
case "int32_t":
|
|
35
|
+
case "int":
|
|
36
|
+
case "i32":
|
|
37
|
+
return koffi.types.int32_t;
|
|
38
|
+
case "uint32_t":
|
|
39
|
+
case "u32":
|
|
40
|
+
return koffi.types.uint32_t;
|
|
41
|
+
case "int64_t":
|
|
42
|
+
case "i64":
|
|
43
|
+
return koffi.types.int64_t;
|
|
44
|
+
case "uint64_t":
|
|
45
|
+
case "u64":
|
|
46
|
+
case "usize":
|
|
47
|
+
return koffi.types.uint64_t;
|
|
48
|
+
case "double":
|
|
49
|
+
case "f64":
|
|
50
|
+
return koffi.types.double;
|
|
51
|
+
case "float":
|
|
52
|
+
case "f32":
|
|
53
|
+
return koffi.types.float;
|
|
54
|
+
case "bool":
|
|
55
|
+
return koffi.types.bool;
|
|
56
|
+
case "ptr":
|
|
57
|
+
case "pointer":
|
|
58
|
+
case "function":
|
|
59
|
+
case "callback":
|
|
60
|
+
return bunPtrType;
|
|
61
|
+
case "void":
|
|
62
|
+
return koffi.types.void;
|
|
63
|
+
case "cstring":
|
|
64
|
+
if (position === "result") {
|
|
65
|
+
throw new Error(NODE_STRING_RETURN);
|
|
66
|
+
}
|
|
67
|
+
return koffi.types.string;
|
|
68
|
+
case "buffer":
|
|
69
|
+
return bufferType;
|
|
70
|
+
case "napi_env":
|
|
71
|
+
throw new Error(NODE_NAPI_UNSUPPORTED, { cause: napiEnvType });
|
|
72
|
+
case "napi_value":
|
|
73
|
+
throw new Error(NODE_NAPI_UNSUPPORTED, { cause: napiValueType });
|
|
74
|
+
default:
|
|
75
|
+
return unsupportedNode22FFIType(type);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
const argsToKoffiTypes = (args) => args?.map((type) => ffiTypeToKoffiType(type, "parameter")) ?? [];
|
|
79
|
+
const returnsToKoffiType = (returns) => ffiTypeToKoffiType(returns ?? "void", "result");
|
|
80
|
+
const createRawCallback = (callback, definition) => {
|
|
81
|
+
if (definition.ptr != null) {
|
|
82
|
+
throw new Error(NODE_POINTER_OVERRIDE);
|
|
83
|
+
}
|
|
84
|
+
if (definition.threadsafe) {
|
|
85
|
+
throw new Error(NODE_CALLBACK_THREADSAFE);
|
|
86
|
+
}
|
|
87
|
+
const pointerArgIndices = getTypeIndices(definition.args, isPointerType);
|
|
88
|
+
const wrappedCallback = pointerArgIndices.length === 0 ? callback : (...args) => {
|
|
89
|
+
for (const index of pointerArgIndices) {
|
|
90
|
+
args[index] = koffiPointerToPointer(koffi, args[index]);
|
|
91
|
+
}
|
|
92
|
+
return callback(...args);
|
|
93
|
+
};
|
|
94
|
+
const proto = koffi.proto(returnsToKoffiType(definition.returns), argsToKoffiTypes(definition.args));
|
|
95
|
+
let registeredCallback = koffi.register(wrappedCallback, koffi.pointer(proto));
|
|
96
|
+
return {
|
|
97
|
+
get ptr() {
|
|
98
|
+
return registeredCallback ? koffiPointerToPointer(koffi, registeredCallback) : null;
|
|
99
|
+
},
|
|
100
|
+
threadsafe: false,
|
|
101
|
+
close() {
|
|
102
|
+
if (!registeredCallback) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
koffi.unregister(registeredCallback);
|
|
106
|
+
registeredCallback = null;
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
};
|
|
110
|
+
const createFunction = (lib, name, definition) => {
|
|
111
|
+
if (definition.ptr != null) {
|
|
112
|
+
throw new Error(NODE_POINTER_OVERRIDE);
|
|
113
|
+
}
|
|
114
|
+
const func = lib.func(name, returnsToKoffiType(definition.returns), argsToKoffiTypes(definition.args));
|
|
115
|
+
const pointerArgIndices = getTypeIndices(definition.args, isPointerType);
|
|
116
|
+
const boolArgIndices = getTypeIndices(definition.args, isBoolType);
|
|
117
|
+
const returnsPointer = isPointerType(definition.returns);
|
|
118
|
+
const returnsBigInt = isBigIntType(definition.returns);
|
|
119
|
+
if (pointerArgIndices.length === 0 && boolArgIndices.length === 0 && !returnsPointer && !returnsBigInt) {
|
|
120
|
+
return func;
|
|
121
|
+
}
|
|
122
|
+
const wrapper = (...args) => {
|
|
123
|
+
for (const index of boolArgIndices) {
|
|
124
|
+
args[index] = Boolean(args[index]);
|
|
125
|
+
}
|
|
126
|
+
for (const index of pointerArgIndices) {
|
|
127
|
+
args[index] = pointerArgToKoffiArg(args[index]);
|
|
128
|
+
}
|
|
129
|
+
const result = func(...args);
|
|
130
|
+
if (returnsPointer) {
|
|
131
|
+
return koffiPointerToPointer(koffi, result);
|
|
132
|
+
}
|
|
133
|
+
if (returnsBigInt) {
|
|
134
|
+
return typeof result === "bigint" ? result : BigInt(result);
|
|
135
|
+
}
|
|
136
|
+
return result;
|
|
137
|
+
};
|
|
138
|
+
Object.defineProperty(wrapper, "name", { value: name });
|
|
139
|
+
return wrapper;
|
|
140
|
+
};
|
|
141
|
+
return {
|
|
142
|
+
dlopen(path, symbols) {
|
|
143
|
+
if (path === null) {
|
|
144
|
+
throw new Error("Node 22 FFI backend does not support dlopen(null)");
|
|
145
|
+
}
|
|
146
|
+
const lib = koffi.load(path instanceof URL ? fileURLToPath(path) : path);
|
|
147
|
+
const callbacks = new Set;
|
|
148
|
+
let closed = false;
|
|
149
|
+
return {
|
|
150
|
+
symbols: Object.fromEntries(Object.entries(symbols).map(([name, definition]) => [name, createFunction(lib, name, definition)])),
|
|
151
|
+
createCallback(callback, definition) {
|
|
152
|
+
if (closed) {
|
|
153
|
+
throw new Error(LIBRARY_CLOSED);
|
|
154
|
+
}
|
|
155
|
+
const raw = createRawCallback(callback, definition);
|
|
156
|
+
const managed = createManagedCallback(raw, callbacks);
|
|
157
|
+
callbacks.add(managed);
|
|
158
|
+
return managed;
|
|
159
|
+
},
|
|
160
|
+
close() {
|
|
161
|
+
if (closed) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
closed = true;
|
|
165
|
+
try {
|
|
166
|
+
lib.unload();
|
|
167
|
+
} finally {
|
|
168
|
+
for (const callback of [...callbacks]) {
|
|
169
|
+
callback.close();
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
},
|
|
175
|
+
ptr(value) {
|
|
176
|
+
if (isArrayBufferView(value)) {
|
|
177
|
+
if (!isArrayBuffer(value.buffer)) {
|
|
178
|
+
throw new TypeError(NODE_PTR_VALUE);
|
|
179
|
+
}
|
|
180
|
+
return offsetPointer(unsafePointerOf(value.buffer), value.byteOffset);
|
|
181
|
+
}
|
|
182
|
+
if (isAnyArrayBuffer(value)) {
|
|
183
|
+
return unsafePointerOf(value);
|
|
184
|
+
}
|
|
185
|
+
throw new TypeError(NODE_PTR_VALUE);
|
|
186
|
+
},
|
|
187
|
+
suffix: koffi.extension.slice(1),
|
|
188
|
+
toArrayBuffer: unsafeArrayBufferAt
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
function loadNode22Modules() {
|
|
192
|
+
const koffiModule = requireModule("koffi");
|
|
193
|
+
const unsafePointerModule = requireModule("unsafe-pointer");
|
|
194
|
+
return {
|
|
195
|
+
koffi: koffiModule.default ?? koffiModule,
|
|
196
|
+
unsafePointerOf: unsafePointerModule.unsafePointerOf,
|
|
197
|
+
unsafeArrayBufferAt: unsafePointerModule.unsafeArrayBufferAt
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
function createManagedCallback(raw, callbacks) {
|
|
201
|
+
let ptr = raw.ptr;
|
|
202
|
+
let closed = false;
|
|
203
|
+
const instance = {
|
|
204
|
+
get ptr() {
|
|
205
|
+
return ptr;
|
|
206
|
+
},
|
|
207
|
+
get threadsafe() {
|
|
208
|
+
return raw.threadsafe;
|
|
209
|
+
},
|
|
210
|
+
close() {
|
|
211
|
+
if (closed) {
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
closed = true;
|
|
215
|
+
callbacks.delete(instance);
|
|
216
|
+
try {
|
|
217
|
+
raw.close();
|
|
218
|
+
} finally {
|
|
219
|
+
ptr = null;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
return instance;
|
|
224
|
+
}
|
|
225
|
+
function getTypeIndices(types, predicate) {
|
|
226
|
+
const indices = [];
|
|
227
|
+
for (let index = 0;index < (types?.length ?? 0); index++) {
|
|
228
|
+
if (predicate(types?.[index])) {
|
|
229
|
+
indices.push(index);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return indices;
|
|
233
|
+
}
|
|
234
|
+
function isPointerType(type) {
|
|
235
|
+
return type === "ptr" || type === "pointer" || type === "function" || type === "callback";
|
|
236
|
+
}
|
|
237
|
+
function isBoolType(type) {
|
|
238
|
+
return type === "bool";
|
|
239
|
+
}
|
|
240
|
+
function isBigIntType(type) {
|
|
241
|
+
return type === "int64_t" || type === "i64" || type === "uint64_t" || type === "u64" || type === "usize";
|
|
242
|
+
}
|
|
243
|
+
function pointerArgToKoffiArg(arg) {
|
|
244
|
+
if (typeof arg === "number") {
|
|
245
|
+
return BigInt(arg);
|
|
246
|
+
}
|
|
247
|
+
if (typeof arg === "bigint") {
|
|
248
|
+
return arg;
|
|
249
|
+
}
|
|
250
|
+
if ((isArrayBufferView(arg) || isAnyArrayBuffer(arg)) && arg.byteLength === 0) {
|
|
251
|
+
return emptyPtrSentinel;
|
|
252
|
+
}
|
|
253
|
+
return arg;
|
|
254
|
+
}
|
|
255
|
+
function koffiPointerToPointer(koffi, pointer) {
|
|
256
|
+
if (pointer === null) {
|
|
257
|
+
return 0;
|
|
258
|
+
}
|
|
259
|
+
if (typeof pointer === "object") {
|
|
260
|
+
return toSafeNumberPointer(koffi.address(pointer));
|
|
261
|
+
}
|
|
262
|
+
return toSafeNumberPointer(pointer);
|
|
263
|
+
}
|
|
264
|
+
function offsetPointer(pointer, offset) {
|
|
265
|
+
return toSafeNumberPointer(BigInt(pointer) + BigInt(offset));
|
|
266
|
+
}
|
|
267
|
+
function toSafeNumberPointer(pointer) {
|
|
268
|
+
if (typeof pointer === "number") {
|
|
269
|
+
if (pointer < 0) {
|
|
270
|
+
throw new Error(POINTER_NEGATIVE);
|
|
271
|
+
}
|
|
272
|
+
if (!Number.isSafeInteger(pointer)) {
|
|
273
|
+
throw new Error(POINTER_UNSAFE);
|
|
274
|
+
}
|
|
275
|
+
return pointer;
|
|
276
|
+
}
|
|
277
|
+
if (pointer < 0n) {
|
|
278
|
+
throw new Error(POINTER_NEGATIVE);
|
|
279
|
+
}
|
|
280
|
+
if (pointer > BigInt(Number.MAX_SAFE_INTEGER)) {
|
|
281
|
+
throw new Error(POINTER_UNSAFE);
|
|
282
|
+
}
|
|
283
|
+
return Number(pointer);
|
|
284
|
+
}
|
|
285
|
+
function unsupportedNode22FFIType(type) {
|
|
286
|
+
throw new Error(`Unsupported FFIType for Node 22 koffi backend: ${String(type)}`);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// src/platform/ffi.ts
|
|
290
|
+
var FFIType = {
|
|
291
|
+
char: "char",
|
|
292
|
+
int8_t: "int8_t",
|
|
293
|
+
i8: "i8",
|
|
294
|
+
uint8_t: "uint8_t",
|
|
295
|
+
u8: "u8",
|
|
296
|
+
int16_t: "int16_t",
|
|
297
|
+
i16: "i16",
|
|
298
|
+
uint16_t: "uint16_t",
|
|
299
|
+
u16: "u16",
|
|
300
|
+
int32_t: "int32_t",
|
|
301
|
+
i32: "i32",
|
|
302
|
+
int: "int",
|
|
303
|
+
uint32_t: "uint32_t",
|
|
304
|
+
u32: "u32",
|
|
305
|
+
int64_t: "int64_t",
|
|
306
|
+
i64: "i64",
|
|
307
|
+
uint64_t: "uint64_t",
|
|
308
|
+
u64: "u64",
|
|
309
|
+
double: "double",
|
|
310
|
+
f64: "f64",
|
|
311
|
+
float: "float",
|
|
312
|
+
f32: "f32",
|
|
313
|
+
bool: "bool",
|
|
314
|
+
ptr: "ptr",
|
|
315
|
+
pointer: "pointer",
|
|
316
|
+
void: "void",
|
|
317
|
+
cstring: "cstring",
|
|
318
|
+
function: "function",
|
|
319
|
+
usize: "usize",
|
|
320
|
+
callback: "callback",
|
|
321
|
+
napi_env: "napi_env",
|
|
322
|
+
napi_value: "napi_value",
|
|
323
|
+
buffer: "buffer"
|
|
324
|
+
};
|
|
325
|
+
var FFI_UNAVAILABLE = "OpenTUI native FFI is not available for this runtime yet";
|
|
326
|
+
var BUN_DLOPEN_NULL = "Bun FFI backend does not support dlopen(null)";
|
|
327
|
+
var LIBRARY_CLOSED = "Cannot create FFI callback after library.close() has been called";
|
|
328
|
+
var NODE_CALLBACK_THREADSAFE = "Node FFI callbacks are same-thread only and do not support threadsafe callbacks";
|
|
329
|
+
var NODE_NAPI_UNSUPPORTED = "Node FFI backend does not support Bun N-API FFI types";
|
|
330
|
+
var NODE_POINTER_OVERRIDE = "Node FFI backend does not support FFIFunction.ptr overrides";
|
|
331
|
+
var NODE_PTR_VALUE = "node:ffi ptr() only supports ArrayBuffer and ArrayBufferView values backed by ArrayBuffer";
|
|
332
|
+
var NODE_STRING_RETURN = "Node FFI backend does not normalize string return values (yet)";
|
|
333
|
+
var NODE_USIZE_UNSUPPORTED = "Node FFI backend does not support usize until (yet)";
|
|
334
|
+
var POINTER_NEGATIVE = "Pointer must be non-negative";
|
|
335
|
+
var POINTER_UNSAFE = "Pointer exceeds safe integer range";
|
|
336
|
+
function unavailable(cause) {
|
|
337
|
+
throw new Error(FFI_UNAVAILABLE, { cause });
|
|
338
|
+
}
|
|
339
|
+
function createUnsupportedBackend(cause) {
|
|
340
|
+
return {
|
|
341
|
+
dlopen() {
|
|
342
|
+
return unavailable(cause);
|
|
343
|
+
},
|
|
344
|
+
ptr() {
|
|
345
|
+
return unavailable(cause);
|
|
346
|
+
},
|
|
347
|
+
suffix: "",
|
|
348
|
+
toArrayBuffer() {
|
|
349
|
+
return unavailable(cause);
|
|
350
|
+
}
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
var isBun = typeof process !== "undefined" && typeof process.versions === "object" && process.versions !== null && typeof process.versions.bun === "string";
|
|
354
|
+
var requireModule2 = createRequire2(import.meta.url);
|
|
355
|
+
var backend = loadBackend();
|
|
356
|
+
function loadBackend() {
|
|
357
|
+
if (isBun) {
|
|
358
|
+
return createBunBackend(requireModule2("bun:ffi"));
|
|
359
|
+
}
|
|
360
|
+
try {
|
|
361
|
+
const nodeFfi = requireModule2("node:ffi");
|
|
362
|
+
return createNodeBackend(nodeFfi.default ?? nodeFfi);
|
|
363
|
+
} catch (error) {
|
|
364
|
+
try {
|
|
365
|
+
return createNode22Backend();
|
|
366
|
+
} catch (fallbackError) {
|
|
367
|
+
return createUnsupportedBackend(fallbackError ?? error);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
function toPointer(value) {
|
|
372
|
+
if (isBun && typeof value === "bigint") {
|
|
373
|
+
return toSafeNumberPointer2(value);
|
|
374
|
+
}
|
|
375
|
+
if (!isBun && typeof value === "number") {
|
|
376
|
+
return toSafeBigIntPointer(value);
|
|
377
|
+
}
|
|
378
|
+
return value;
|
|
379
|
+
}
|
|
380
|
+
function ffiBool(value) {
|
|
381
|
+
return value ? 1 : 0;
|
|
382
|
+
}
|
|
383
|
+
function toSafeNumberPointer2(pointer) {
|
|
384
|
+
if (pointer < 0n) {
|
|
385
|
+
throw new Error(POINTER_NEGATIVE);
|
|
386
|
+
}
|
|
387
|
+
if (pointer > BigInt(Number.MAX_SAFE_INTEGER)) {
|
|
388
|
+
throw new Error(POINTER_UNSAFE);
|
|
389
|
+
}
|
|
390
|
+
return Number(pointer);
|
|
391
|
+
}
|
|
392
|
+
function toSafeBigIntPointer(pointer) {
|
|
393
|
+
if (pointer < 0) {
|
|
394
|
+
throw new Error(POINTER_NEGATIVE);
|
|
395
|
+
}
|
|
396
|
+
if (!Number.isSafeInteger(pointer)) {
|
|
397
|
+
throw new Error(POINTER_UNSAFE);
|
|
398
|
+
}
|
|
399
|
+
return BigInt(pointer);
|
|
400
|
+
}
|
|
401
|
+
function createManagedCallback2(raw, callbacks) {
|
|
402
|
+
let ptr = raw.ptr;
|
|
403
|
+
let closed = false;
|
|
404
|
+
const instance = {
|
|
405
|
+
get ptr() {
|
|
406
|
+
return ptr;
|
|
407
|
+
},
|
|
408
|
+
get threadsafe() {
|
|
409
|
+
return raw.threadsafe;
|
|
410
|
+
},
|
|
411
|
+
close() {
|
|
412
|
+
if (closed) {
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
closed = true;
|
|
416
|
+
callbacks.delete(instance);
|
|
417
|
+
try {
|
|
418
|
+
raw.close();
|
|
419
|
+
} finally {
|
|
420
|
+
ptr = null;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
};
|
|
424
|
+
callbacks.add(instance);
|
|
425
|
+
return instance;
|
|
426
|
+
}
|
|
427
|
+
function normalizeBunDefinitions(definitions) {
|
|
428
|
+
return Object.fromEntries(Object.entries(definitions).map(([name, definition]) => [name, normalizeBunDefinition(definition)]));
|
|
429
|
+
}
|
|
430
|
+
function normalizeBunDefinition(definition) {
|
|
431
|
+
return {
|
|
432
|
+
args: definition.args,
|
|
433
|
+
returns: definition.returns,
|
|
434
|
+
ptr: definition.ptr == null ? undefined : toBunPointer(definition.ptr),
|
|
435
|
+
threadsafe: definition.threadsafe
|
|
436
|
+
};
|
|
437
|
+
}
|
|
438
|
+
function toBunPointer(pointer) {
|
|
439
|
+
return typeof pointer === "bigint" ? toSafeNumberPointer2(pointer) : pointer;
|
|
440
|
+
}
|
|
441
|
+
function createBunBackend(bun) {
|
|
442
|
+
return {
|
|
443
|
+
dlopen(path, symbols) {
|
|
444
|
+
if (path === null) {
|
|
445
|
+
throw new Error(BUN_DLOPEN_NULL);
|
|
446
|
+
}
|
|
447
|
+
const library = bun.dlopen(path, normalizeBunDefinitions(symbols));
|
|
448
|
+
const callbacks = new Set;
|
|
449
|
+
let closed = false;
|
|
450
|
+
return {
|
|
451
|
+
symbols: library.symbols,
|
|
452
|
+
createCallback(callback, definition) {
|
|
453
|
+
if (closed) {
|
|
454
|
+
throw new Error(LIBRARY_CLOSED);
|
|
455
|
+
}
|
|
456
|
+
const raw = new bun.JSCallback(callback, normalizeBunDefinition(definition));
|
|
457
|
+
return createManagedCallback2(raw, callbacks);
|
|
458
|
+
},
|
|
459
|
+
close() {
|
|
460
|
+
if (closed) {
|
|
461
|
+
return;
|
|
462
|
+
}
|
|
463
|
+
closed = true;
|
|
464
|
+
try {
|
|
465
|
+
library.close();
|
|
466
|
+
} finally {
|
|
467
|
+
for (const callback of [...callbacks]) {
|
|
468
|
+
callback.close();
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
};
|
|
473
|
+
},
|
|
474
|
+
ptr: bun.ptr,
|
|
475
|
+
suffix: bun.suffix,
|
|
476
|
+
toArrayBuffer(pointer, offset, length) {
|
|
477
|
+
return bun.toArrayBuffer(toBunPointer(pointer), offset, length);
|
|
478
|
+
}
|
|
479
|
+
};
|
|
480
|
+
}
|
|
481
|
+
function createNodeBackend(nodeFfi) {
|
|
482
|
+
return {
|
|
483
|
+
dlopen(path, symbols) {
|
|
484
|
+
const { lib, functions } = nodeFfi.dlopen(toNodeLibraryPath(path), normalizeNodeDefinitions(symbols));
|
|
485
|
+
const callbacks = new Set;
|
|
486
|
+
let closed = false;
|
|
487
|
+
let libraryClosed = false;
|
|
488
|
+
return {
|
|
489
|
+
symbols: functions,
|
|
490
|
+
createCallback(callback, definition) {
|
|
491
|
+
if (closed) {
|
|
492
|
+
throw new Error(LIBRARY_CLOSED);
|
|
493
|
+
}
|
|
494
|
+
if (definition.threadsafe) {
|
|
495
|
+
throw new Error(NODE_CALLBACK_THREADSAFE);
|
|
496
|
+
}
|
|
497
|
+
const callbackPointer = lib.registerCallback(normalizeNodeDefinition(definition), callback);
|
|
498
|
+
const raw = {
|
|
499
|
+
ptr: callbackPointer,
|
|
500
|
+
threadsafe: false,
|
|
501
|
+
close() {
|
|
502
|
+
if (!libraryClosed) {
|
|
503
|
+
lib.unregisterCallback(callbackPointer);
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
};
|
|
507
|
+
return createManagedCallback2(raw, callbacks);
|
|
508
|
+
},
|
|
509
|
+
close() {
|
|
510
|
+
if (closed) {
|
|
511
|
+
return;
|
|
512
|
+
}
|
|
513
|
+
closed = true;
|
|
514
|
+
try {
|
|
515
|
+
libraryClosed = true;
|
|
516
|
+
lib.close();
|
|
517
|
+
} finally {
|
|
518
|
+
for (const callback of [...callbacks]) {
|
|
519
|
+
callback.close();
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
};
|
|
524
|
+
},
|
|
525
|
+
ptr(value) {
|
|
526
|
+
if (ArrayBuffer.isView(value)) {
|
|
527
|
+
if (!(value.buffer instanceof ArrayBuffer)) {
|
|
528
|
+
throw new TypeError(NODE_PTR_VALUE);
|
|
529
|
+
}
|
|
530
|
+
return nodeFfi.getRawPointer(value.buffer) + BigInt(value.byteOffset);
|
|
531
|
+
}
|
|
532
|
+
if (value instanceof ArrayBuffer) {
|
|
533
|
+
return nodeFfi.getRawPointer(value);
|
|
534
|
+
}
|
|
535
|
+
throw new TypeError(NODE_PTR_VALUE);
|
|
536
|
+
},
|
|
537
|
+
suffix: nodeFfi.suffix,
|
|
538
|
+
toArrayBuffer(pointer, offset, length) {
|
|
539
|
+
return nodeFfi.toArrayBuffer(toBigIntPointer(pointer) + BigInt(offset ?? 0), length, false);
|
|
540
|
+
}
|
|
541
|
+
};
|
|
542
|
+
}
|
|
543
|
+
function toNodeLibraryPath(path) {
|
|
544
|
+
return path instanceof URL ? fileURLToPath2(path) : path;
|
|
545
|
+
}
|
|
546
|
+
function normalizeNodeDefinitions(definitions) {
|
|
547
|
+
return Object.fromEntries(Object.entries(definitions).map(([name, definition]) => [name, normalizeNodeDefinition(definition)]));
|
|
548
|
+
}
|
|
549
|
+
function normalizeNodeDefinition(definition) {
|
|
550
|
+
if (definition.ptr != null) {
|
|
551
|
+
throw new Error(NODE_POINTER_OVERRIDE);
|
|
552
|
+
}
|
|
553
|
+
return {
|
|
554
|
+
parameters: (definition.args ?? []).map((type) => toNodeFFIType(type, "parameter")),
|
|
555
|
+
result: toNodeFFIType(definition.returns ?? FFIType.void, "result")
|
|
556
|
+
};
|
|
557
|
+
}
|
|
558
|
+
function toNodeFFIType(type, position) {
|
|
559
|
+
switch (type) {
|
|
560
|
+
case FFIType.char:
|
|
561
|
+
return "char";
|
|
562
|
+
case FFIType.int8_t:
|
|
563
|
+
case FFIType.i8:
|
|
564
|
+
return "i8";
|
|
565
|
+
case FFIType.uint8_t:
|
|
566
|
+
case FFIType.u8:
|
|
567
|
+
return "u8";
|
|
568
|
+
case FFIType.int16_t:
|
|
569
|
+
case FFIType.i16:
|
|
570
|
+
return "i16";
|
|
571
|
+
case FFIType.uint16_t:
|
|
572
|
+
case FFIType.u16:
|
|
573
|
+
return "u16";
|
|
574
|
+
case FFIType.int32_t:
|
|
575
|
+
case FFIType.int:
|
|
576
|
+
case FFIType.i32:
|
|
577
|
+
return "i32";
|
|
578
|
+
case FFIType.uint32_t:
|
|
579
|
+
case FFIType.u32:
|
|
580
|
+
return "u32";
|
|
581
|
+
case FFIType.int64_t:
|
|
582
|
+
case FFIType.i64:
|
|
583
|
+
return "i64";
|
|
584
|
+
case FFIType.uint64_t:
|
|
585
|
+
case FFIType.u64:
|
|
586
|
+
return "u64";
|
|
587
|
+
case FFIType.double:
|
|
588
|
+
case FFIType.f64:
|
|
589
|
+
return "f64";
|
|
590
|
+
case FFIType.float:
|
|
591
|
+
case FFIType.f32:
|
|
592
|
+
return "f32";
|
|
593
|
+
case FFIType.bool:
|
|
594
|
+
return "bool";
|
|
595
|
+
case FFIType.ptr:
|
|
596
|
+
case FFIType.pointer:
|
|
597
|
+
return "pointer";
|
|
598
|
+
case FFIType.void:
|
|
599
|
+
return "void";
|
|
600
|
+
case FFIType.cstring:
|
|
601
|
+
if (position === "result") {
|
|
602
|
+
throw new Error(NODE_STRING_RETURN);
|
|
603
|
+
}
|
|
604
|
+
return "string";
|
|
605
|
+
case FFIType.function:
|
|
606
|
+
case FFIType.callback:
|
|
607
|
+
return "pointer";
|
|
608
|
+
case FFIType.usize:
|
|
609
|
+
throw new Error(NODE_USIZE_UNSUPPORTED);
|
|
610
|
+
case FFIType.napi_env:
|
|
611
|
+
case FFIType.napi_value:
|
|
612
|
+
throw new Error(NODE_NAPI_UNSUPPORTED);
|
|
613
|
+
case FFIType.buffer:
|
|
614
|
+
return "buffer";
|
|
615
|
+
default:
|
|
616
|
+
return unsupportedNodeFFIType(type);
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
function unsupportedNodeFFIType(type) {
|
|
620
|
+
throw new Error(`Unsupported FFIType for node:ffi: ${String(type)}`);
|
|
621
|
+
}
|
|
622
|
+
function toBigIntPointer(pointer) {
|
|
623
|
+
if (typeof pointer === "bigint") {
|
|
624
|
+
if (pointer < 0n) {
|
|
625
|
+
throw new Error(POINTER_NEGATIVE);
|
|
626
|
+
}
|
|
627
|
+
return pointer;
|
|
628
|
+
}
|
|
629
|
+
return toSafeBigIntPointer(pointer);
|
|
630
|
+
}
|
|
631
|
+
var dlopen = backend.dlopen;
|
|
632
|
+
var ptr = backend.ptr;
|
|
633
|
+
var suffix = backend.suffix;
|
|
634
|
+
var toArrayBuffer = backend.toArrayBuffer;
|
|
635
|
+
|
|
636
|
+
export { toPointer, ffiBool, dlopen, ptr, toArrayBuffer };
|
|
637
|
+
|
|
638
|
+
//# debugId=4F23A8FFF12D7B5A64756E2164756E21
|
|
639
|
+
//# sourceMappingURL=index-5zwezmgj.js.map
|