diff --git a/binding.gyp b/binding.gyp index d0e9b81b..8f93e64f 100644 --- a/binding.gyp +++ b/binding.gyp @@ -49,4 +49,8 @@ ] } ], + 'variables': { 'runtime%': 'node' }, + 'conditions': [ + ['runtime=="electron"', { 'defines': ['NODE_RUNTIME_ELECTRON=1'] }], + ] } diff --git a/src/conversions.cc b/src/conversions.cc index 92c92c67..fefe01d7 100644 --- a/src/conversions.cc +++ b/src/conversions.cc @@ -28,7 +28,19 @@ void InitConversions(Local exports) { end_position_key.Reset(Nan::Persistent(Nan::New("endPosition").ToLocalChecked())); point_transfer_buffer = static_cast(malloc(2 * sizeof(uint32_t))); - auto js_point_transfer_buffer = ArrayBuffer::New(Isolate::GetCurrent(), point_transfer_buffer, 2 * sizeof(uint32_t)); + + #if _MSC_VER && NODE_RUNTIME_ELECTRON && NODE_MODULE_VERSION >= 89 + // this is a terrible thing we have to do because of https://github.com/electron/electron/issues/29893 + v8::Local bufferView; + bufferView = node::Buffer::New(Isolate::GetCurrent(), point_transfer_buffer, 0, 2 * sizeof(uint32_t)).ToLocalChecked(); + auto js_point_transfer_buffer = node::Buffer::Data(bufferView); + #elif V8_MAJOR_VERSION >= 8 + auto backing_store = ArrayBuffer::NewBackingStore(point_transfer_buffer, 2 * sizeof(uint32_t), BackingStore::EmptyDeleter, nullptr); + auto js_point_transfer_buffer = ArrayBuffer::New(Isolate::GetCurrent(), std::move(backing_store)); + #else + auto js_point_transfer_buffer = ArrayBuffer::New(Isolate::GetCurrent(), point_transfer_buffer, 2 * sizeof(uint32_t)); + #endif + Nan::Set(exports, Nan::New("pointTransferArray").ToLocalChecked(), Uint32Array::New(js_point_transfer_buffer, 0, 2)); } diff --git a/src/node.cc b/src/node.cc index 711781e2..be9b0468 100644 --- a/src/node.cc +++ b/src/node.cc @@ -29,7 +29,19 @@ static inline void setup_transfer_buffer(uint32_t node_count) { } transfer_buffer_length = new_length; transfer_buffer = static_cast(malloc(transfer_buffer_length * sizeof(uint32_t))); - auto js_transfer_buffer = ArrayBuffer::New(Isolate::GetCurrent(), transfer_buffer, transfer_buffer_length * sizeof(uint32_t)); + + #if _MSC_VER && NODE_RUNTIME_ELECTRON && NODE_MODULE_VERSION >= 89 + // this is a terrible thing we have to do because of https://github.com/electron/electron/issues/29893 + v8::Local bufferView; + bufferView = node::Buffer::New(Isolate::GetCurrent(), transfer_buffer, 0, transfer_buffer_length * sizeof(uint32_t)).ToLocalChecked(); + auto js_point_transfer_buffer = node::Buffer::Data(bufferView); + #elif V8_MAJOR_VERSION >= 8 + auto backing_store = ArrayBuffer::NewBackingStore(transfer_buffer, transfer_buffer_length * sizeof(uint32_t), BackingStore::EmptyDeleter, nullptr); + auto js_transfer_buffer = ArrayBuffer::New(Isolate::GetCurrent(), std::move(backing_store)); + #else + auto js_transfer_buffer = ArrayBuffer::New(Isolate::GetCurrent(), transfer_buffer, transfer_buffer_length * sizeof(uint32_t)); + #endif + Nan::Set( Nan::New(module_exports), Nan::New("nodeTransferArray").ToLocalChecked(),