native.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. import { dirname, join, default as pathModule } from 'path';
  2. import { fileURLToPath } from 'url';
  3. import loadNAPI from 'node-gyp-build-optional-packages';
  4. export let Env,
  5. Txn,
  6. Dbi,
  7. Compression,
  8. Cursor,
  9. getAddress,
  10. getBufferAddress,
  11. createBufferForAddress,
  12. clearKeptObjects,
  13. globalBuffer,
  14. setGlobalBuffer,
  15. arch,
  16. fs,
  17. os,
  18. onExit,
  19. tmpdir,
  20. lmdbError,
  21. path,
  22. EventEmitter,
  23. orderedBinary,
  24. MsgpackrEncoder,
  25. WeakLRUCache,
  26. setEnvMap,
  27. getEnvMap,
  28. getByBinary,
  29. detachBuffer,
  30. startRead,
  31. setReadCallback,
  32. write,
  33. position,
  34. iterate,
  35. prefetch,
  36. resetTxn,
  37. getCurrentValue,
  38. getCurrentShared,
  39. getStringByBinary,
  40. getSharedByBinary,
  41. getSharedBuffer,
  42. compress,
  43. directWrite,
  44. getUserSharedBuffer,
  45. notifyUserCallbacks,
  46. attemptLock,
  47. unlock,
  48. version;
  49. path = pathModule;
  50. let dirName = dirname(fileURLToPath(import.meta.url)).replace(/dist$/, '');
  51. export let nativeAddon = loadNAPI(dirName);
  52. if (process.isBun && false) {
  53. const { linkSymbols, FFIType } = require('bun:ffi');
  54. let lmdbLib = linkSymbols({
  55. getByBinary: {
  56. args: [FFIType.f64, FFIType.u32],
  57. returns: FFIType.u32,
  58. ptr: nativeAddon.getByBinaryPtr,
  59. },
  60. iterate: {
  61. args: [FFIType.f64],
  62. returns: FFIType.i32,
  63. ptr: nativeAddon.iteratePtr,
  64. },
  65. position: {
  66. args: [FFIType.f64, FFIType.u32, FFIType.u32, FFIType.u32, FFIType.f64],
  67. returns: FFIType.i32,
  68. ptr: nativeAddon.positionPtr,
  69. },
  70. write: {
  71. args: [FFIType.f64, FFIType.f64],
  72. returns: FFIType.i32,
  73. ptr: nativeAddon.writePtr,
  74. },
  75. resetTxn: {
  76. args: [FFIType.f64],
  77. returns: FFIType.void,
  78. ptr: nativeAddon.resetTxnPtr,
  79. },
  80. });
  81. for (let key in lmdbLib.symbols) {
  82. nativeAddon[key] = lmdbLib.symbols[key].native;
  83. }
  84. }
  85. setNativeFunctions(nativeAddon);
  86. export function setNativeFunctions(externals) {
  87. Env = externals.Env;
  88. Txn = externals.Txn;
  89. Dbi = externals.Dbi;
  90. Compression = externals.Compression;
  91. getAddress = externals.getAddress;
  92. getBufferAddress = externals.getBufferAddress;
  93. createBufferForAddress = externals.createBufferForAddress;
  94. clearKeptObjects = externals.clearKeptObjects || function () {};
  95. getByBinary = externals.getByBinary;
  96. detachBuffer = externals.detachBuffer;
  97. startRead = externals.startRead;
  98. setReadCallback = externals.setReadCallback;
  99. setGlobalBuffer = externals.setGlobalBuffer;
  100. globalBuffer = externals.globalBuffer;
  101. getSharedBuffer = externals.getSharedBuffer;
  102. prefetch = externals.prefetch;
  103. iterate = externals.iterate;
  104. position = externals.position;
  105. resetTxn = externals.resetTxn;
  106. directWrite = externals.directWrite;
  107. getUserSharedBuffer = externals.getUserSharedBuffer;
  108. notifyUserCallbacks = externals.notifyUserCallbacks;
  109. attemptLock = externals.attemptLock;
  110. unlock = externals.unlock;
  111. getCurrentValue = externals.getCurrentValue;
  112. getCurrentShared = externals.getCurrentShared;
  113. getStringByBinary = externals.getStringByBinary;
  114. getSharedByBinary = externals.getSharedByBinary;
  115. write = externals.write;
  116. compress = externals.compress;
  117. Cursor = externals.Cursor;
  118. lmdbError = externals.lmdbError;
  119. version = externals.version;
  120. if (externals.tmpdir) tmpdir = externals.tmpdir;
  121. }
  122. export function setExternals(externals) {
  123. arch = externals.arch;
  124. fs = externals.fs;
  125. EventEmitter = externals.EventEmitter;
  126. orderedBinary = externals.orderedBinary;
  127. MsgpackrEncoder = externals.MsgpackrEncoder;
  128. WeakLRUCache = externals.WeakLRUCache;
  129. tmpdir = externals.tmpdir;
  130. os = externals.os;
  131. onExit = externals.onExit;
  132. }