Files
sati.n-api.mmap/lib/index.ts
2026-01-26 08:05:00 +00:00

89 lines
2.0 KiB
TypeScript

// 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;