// lib/index.ts import { createRequire } from 'node:module'; import * as path from 'node:path'; import { fileURLToPath } from 'node:url'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const require = createRequire(import.meta.url); // dist/lib/index.js 에서 실행될 때 -> ../../build/Release/ // lib/index.ts 에서 실행될 때 -> ../build/Release/ // 둘 다 지원하도록 동적으로 찾기 function findBinding(): string { const candidates = [ path.join(__dirname, '..', '..', 'build', 'Release', 'mmap_binding.node'), // dist/lib/ 기준 path.join(__dirname, '..', 'build', 'Release', 'mmap_binding.node'), // lib/ 기준 ]; for (const candidate of candidates) { try { require.resolve(candidate); return candidate; } catch { continue; } } throw new Error('Cannot find mmap_binding.node. Run `npm run build:native` first.'); } const binding = require(findBinding()); // 타입 정의 export interface MmapBinding { map(size: number, prot: number, flags: number, fd: number, offset: number): Buffer; sync(buffer: Buffer, offset: number, length: number, flags: number): void; unmap(buffer: Buffer): void; advise(buffer: Buffer, offset: number, length: number, advice: number): void; pageSize(): number; PROT_NONE: number; PROT_READ: number; PROT_WRITE: number; PROT_EXEC: number; MAP_SHARED: number; MAP_PRIVATE: number; MAP_ANONYMOUS?: number; MAP_ANON?: number; MS_ASYNC: number; MS_SYNC: number; MS_INVALIDATE: number; MADV_NORMAL: number; MADV_RANDOM: number; MADV_SEQUENTIAL: number; MADV_WILLNEED: number; MADV_DONTNEED: number; } const mmap: MmapBinding = binding; export default mmap; export const { map, sync, unmap, advise, pageSize, PROT_NONE, PROT_READ, PROT_WRITE, PROT_EXEC, MAP_SHARED, MAP_PRIVATE, MAP_ANONYMOUS, MAP_ANON, MS_ASYNC, MS_SYNC, MS_INVALIDATE, MADV_NORMAL, MADV_RANDOM, MADV_SEQUENTIAL, MADV_WILLNEED, MADV_DONTNEED, } = mmap;