|
6 | 6 | #include <napi.h> |
7 | 7 | #include <cstdlib> |
8 | 8 | #include <string> |
| 9 | +#include <utility> |
9 | 10 | #include <vector> |
10 | 11 | #include "hdiff.h" |
11 | 12 | #include "hpatch.h" |
@@ -36,6 +37,22 @@ namespace hdiffpatchNode |
36 | 37 | return true; |
37 | 38 | } |
38 | 39 |
|
| 40 | + inline Napi::Buffer<uint8_t> bufferFromVector(Napi::Env env, std::vector<uint8_t>&& data) { |
| 41 | + if (data.empty()) { |
| 42 | + return Napi::Buffer<uint8_t>::New(env, 0); |
| 43 | + } |
| 44 | + auto* vec = new std::vector<uint8_t>(std::move(data)); |
| 45 | + return Napi::Buffer<uint8_t>::New( |
| 46 | + env, |
| 47 | + vec->data(), |
| 48 | + vec->size(), |
| 49 | + [](Napi::Env /*env*/, uint8_t* /*data*/, std::vector<uint8_t>* vecPtr) { |
| 50 | + delete vecPtr; |
| 51 | + }, |
| 52 | + vec |
| 53 | + ); |
| 54 | + } |
| 55 | + |
39 | 56 | // ============ 异步 Diff Worker ============ |
40 | 57 | class DiffAsyncWorker : public Napi::AsyncWorker { |
41 | 58 | public: |
@@ -63,12 +80,7 @@ namespace hdiffpatchNode |
63 | 80 | void OnOK() override { |
64 | 81 | Napi::Env env = Env(); |
65 | 82 | Napi::HandleScope scope(env); |
66 | | - |
67 | | - // 创建 Buffer 并复制数据 |
68 | | - Napi::Buffer<uint8_t> resultBuf = Napi::Buffer<uint8_t>::Copy( |
69 | | - env, result_.data(), result_.size() |
70 | | - ); |
71 | | - |
| 83 | + Napi::Buffer<uint8_t> resultBuf = bufferFromVector(env, std::move(result_)); |
72 | 84 | Callback().Call({env.Null(), resultBuf}); |
73 | 85 | oldRef_.Reset(); |
74 | 86 | newRef_.Reset(); |
@@ -119,11 +131,7 @@ namespace hdiffpatchNode |
119 | 131 | void OnOK() override { |
120 | 132 | Napi::Env env = Env(); |
121 | 133 | Napi::HandleScope scope(env); |
122 | | - |
123 | | - Napi::Buffer<uint8_t> resultBuf = Napi::Buffer<uint8_t>::Copy( |
124 | | - env, result_.data(), result_.size() |
125 | | - ); |
126 | | - |
| 134 | + Napi::Buffer<uint8_t> resultBuf = bufferFromVector(env, std::move(result_)); |
127 | 135 | Callback().Call({env.Null(), resultBuf}); |
128 | 136 | oldRef_.Reset(); |
129 | 137 | diffRef_.Reset(); |
@@ -261,7 +269,7 @@ namespace hdiffpatchNode |
261 | 269 | return env.Undefined(); |
262 | 270 | } |
263 | 271 |
|
264 | | - return Napi::Buffer<uint8_t>::Copy(env, codeBuf.data(), codeBuf.size()); |
| 272 | + return bufferFromVector(env, std::move(codeBuf)); |
265 | 273 | } |
266 | 274 |
|
267 | 275 | // ============ 同步/异步 patch ============ |
@@ -306,7 +314,7 @@ namespace hdiffpatchNode |
306 | 314 | return env.Undefined(); |
307 | 315 | } |
308 | 316 |
|
309 | | - return Napi::Buffer<uint8_t>::Copy(env, newBuf.data(), newBuf.size()); |
| 317 | + return bufferFromVector(env, std::move(newBuf)); |
310 | 318 | } |
311 | 319 |
|
312 | 320 | // ============ 同步/异步 diffStream ============ |
|
0 commit comments