Skip to content

Commit 4aeb851

Browse files
committed
add promise api
1 parent bd0cb08 commit 4aeb851

16 files changed

Lines changed: 969 additions & 524 deletions

index.d.ts

Lines changed: 475 additions & 459 deletions
Large diffs are not rendered by default.

index.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
'use strict';
2+
if (process.platform === 'win32') {
3+
const fswin = require(`./${process.arch}/fswin.node`),
4+
promisify = (fn, maxArgs, cbPos) => (...args) => new Promise((resolve, reject) => {
5+
args.splice(maxArgs);
6+
if (cbPos > args.length) {
7+
args.push(...Array(cbPos - args.length), resolve);
8+
} else {
9+
args.splice(cbPos, 0, resolve);
10+
}
11+
fn(...args) || reject(Error('UNABLE_TO_QUEUE_JOB'));
12+
});
13+
fswin.convertPathAsync = promisify(fswin.convertPath, 2, 1);
14+
fswin.ejectDriveAsync = promisify(fswin.ejectDrive, 2, 2);
15+
fswin.findAsync = promisify(fswin.find, 1, 1);
16+
fswin.getAttributesAsync = promisify(fswin.getAttributes, 1, 1);
17+
fswin.getDeviceCapabilitiesAsync = promisify(fswin.getDeviceCapabilities, 1, 1);
18+
fswin.getDriveDeviceAsync = promisify(fswin.getDriveDevice, 1, 1);
19+
fswin.getLogicalDriveListAsync = promisify(fswin.getLogicalDriveList, 0, 0);
20+
fswin.getStoragePropertiesAsync = promisify(fswin.getStorageProperties, 2, 2);
21+
fswin.getVolumeInformationAsync = promisify(fswin.getVolumeInformation, 1, 1);
22+
fswin.getVolumeSpaceAsync = promisify(fswin.getVolumeSpace, 1, 1);
23+
fswin.setAttributesAsync = promisify(fswin.setAttributes, 2, 2);
24+
fswin.setVolumeLabelAsync = promisify(fswin.setVolumeLabel, 2, 2);
25+
fswin.ntfs.getCompressedSizeAsync = promisify(fswin.ntfs.getCompressedSize, 1, 1);
26+
fswin.ntfs.setCompressionAsync = promisify(fswin.ntfs.setCompression, 3, 1);
27+
fswin.ntfs.setShortNameAsync = promisify(fswin.ntfs.setShortName, 2, 2);
28+
fswin.ntfs.setSparseAsync = promisify(fswin.ntfs.setSparse, 2, 1);
29+
module.exports = fswin;
30+
} else {
31+
module.exports = null;
32+
}

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "fswin",
3-
"version": "3.24.829",
3+
"version": "3.25.1108",
44
"description": "nodejs fs extensions for windows",
55
"main": "index.js",
66
"types": "index.d.ts",

src/convertPath.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ class convertPath {
124124
napi_value cb, self, argv;
125125
napi_get_reference_value(env, d->cb, &cb);
126126
napi_get_reference_value(env, d->self, &self);
127-
if (status == napi_ok && d->result) {
127+
if (d->result) {
128128
napi_create_string_utf16(env, (char16_t*)d->result, wcslen(d->result), &argv);
129129
delete[]d->result;
130130
} else {

src/ejectDrive.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ class ejectDrive {
1111
wchar_t* devid = getDriveDevice::getDevInstIdByDevInst(DevInst);
1212
if (devid) {
1313
if (method == 1) {
14-
DWORD cap = getDeviceCapabilities::func(devid);
14+
DWORD cap;
15+
getDeviceCapabilities::func(devid, &cap);
1516
if (cap & CM_DEVCAP_SURPRISEREMOVALOK) {
1617
if (cap & CM_DEVCAP_DOCKDEVICE) {
1718
ensurePrivilege("SeLoadDriverPrivilege");

src/find.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class find {
5454
return result;
5555
}
5656
static DWORD funcWithCallback(const wchar_t* path, const findResultCall callback, void* data) {//data could be anything that will directly pass to the callback
57-
WIN32_FIND_DATAW info;
57+
WIN32_FIND_DATAW info{};
5858
CHAR bak;
5959
if (RtlSetThreadPlaceholderCompatibilityMode) {
6060
bak = RtlSetThreadPlaceholderCompatibilityMode(2);
@@ -502,7 +502,7 @@ class find {
502502
}
503503
if (finish) {
504504
if (finish > 1) {
505-
napi_value argv[2];
505+
napi_value argv[2]{};
506506
napi_create_string_latin1(env, "FAILED", NAPI_AUTO_LENGTH, &argv[0]);
507507
napi_create_int64(env, (int64_t)d->count, &argv[1]);
508508
napi_call_function(env, self, cb, 2, (napi_value*)&argv, NULL);

src/fsWin.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
NAPI_MODULE_INIT() {
2121
napi_value o;
22-
napi_create_string_latin1(env, "3.24.829", NAPI_AUTO_LENGTH, &o);
22+
napi_create_string_latin1(env, "3.25.1108", NAPI_AUTO_LENGTH, &o);
2323
napi_set_named_property(env, exports, "version", o);
2424
napi_set_named_property(env, exports, "dirWatcher", dirWatcher::init(env));
2525
napi_set_named_property(env, exports, "splitPath", splitPath::init(env));

src/getAttributes.h

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ class getAttributes {
1414
napi_ref self;
1515
napi_ref cb;
1616
wchar_t* path;
17-
BY_HANDLE_FILE_INFORMATION* result;
17+
BY_HANDLE_FILE_INFORMATION result;
18+
bool success;
1819
};
1920
static napi_value sync(napi_env env, napi_callback_info info) {
2021
napi_value result;
@@ -168,16 +169,12 @@ class getAttributes {
168169
}
169170
static void execute(napi_env env, void* data) {
170171
cbdata* d = (cbdata*)data;
171-
d->result = new BY_HANDLE_FILE_INFORMATION;
172172
CHAR bak;
173173
if (RtlSetThreadPlaceholderCompatibilityMode) {
174174
bak = RtlSetThreadPlaceholderCompatibilityMode(2);
175175
}
176176
HANDLE h = CreateFileW(d->path, 0, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, NULL);
177-
if (!GetFileInformationByHandle(h, d->result)) {
178-
delete d->result;
179-
d->result = NULL;
180-
}
177+
d->success = GetFileInformationByHandle(h, &d->result);
181178
if (h != INVALID_HANDLE_VALUE) {
182179
CloseHandle(h);
183180
}
@@ -191,9 +188,8 @@ class getAttributes {
191188
napi_value cb, self, argv;
192189
napi_get_reference_value(env, d->cb, &cb);
193190
napi_get_reference_value(env, d->self, &self);
194-
if (status == napi_ok && d->result) {
195-
argv = convert(env, d->result);
196-
delete d->result;
191+
if (d->success) {
192+
argv = convert(env, &d->result);
197193
} else {
198194
napi_get_null(env, &argv);
199195
}

src/getCompressedSize.h

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,12 @@
33

44
class getCompressedSize {
55
public:
6-
static ULONGLONG func(const wchar_t* path) {
7-
ULARGE_INTEGER u;
8-
u.LowPart = GetCompressedFileSizeW(path, &u.HighPart);
9-
if (u.LowPart == INVALID_FILE_SIZE && GetLastError() != NO_ERROR) {
10-
u.QuadPart = 0;
6+
static bool func(const wchar_t* path, ULARGE_INTEGER* u) {
7+
u->LowPart = GetCompressedFileSizeW(path, &u->HighPart);
8+
if (u->LowPart == INVALID_FILE_SIZE && GetLastError() != NO_ERROR) {
9+
return false;
1110
}
12-
return u.QuadPart;
11+
return true;
1312
}
1413
static napi_value init(napi_env env, bool isSync = false) {
1514
napi_value f;
@@ -22,7 +21,8 @@ class getCompressedSize {
2221
napi_ref self;
2322
napi_ref cb;
2423
wchar_t* path;
25-
ULONGLONG result;
24+
ULARGE_INTEGER result;
25+
bool success;
2626
};
2727
static napi_value sync(napi_env env, napi_callback_info info) {
2828
napi_value result;
@@ -44,7 +44,12 @@ class getCompressedSize {
4444
str_len += 1;
4545
wchar_t* str = new wchar_t[str_len];
4646
napi_get_value_string_utf16(env, tmp, (char16_t*)str, str_len, NULL);
47-
napi_create_int64(env, func(str), &result);
47+
ULARGE_INTEGER u;
48+
if (func(str, &u)) {
49+
napi_create_int64(env, u.QuadPart, &result);
50+
} else {
51+
napi_get_null(env, &result);
52+
}
4853
delete[]str;
4954
}
5055
}
@@ -96,16 +101,16 @@ class getCompressedSize {
96101
}
97102
static void execute(napi_env env, void* data) {
98103
cbdata* d = (cbdata*)data;
99-
d->result = func(d->path);
100-
delete[]d->path;
104+
d->success = func(d->path, &d->result);
101105
}
102106
static void complete(napi_env env, napi_status status, void* data) {
103107
cbdata* d = (cbdata*)data;
108+
delete[]d->path;
104109
napi_value cb, self, argv;
105110
napi_get_reference_value(env, d->cb, &cb);
106111
napi_get_reference_value(env, d->self, &self);
107-
if (status == napi_ok) {
108-
napi_create_int64(env, d->result, &argv);
112+
if (d->success) {
113+
napi_create_int64(env, d->result.QuadPart, &argv);
109114
} else {
110115
napi_get_null(env, &argv);
111116
}

src/getDeviceCapabilities.h

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,18 @@
33

44
class getDeviceCapabilities {
55
public:
6-
static DWORD func(wchar_t* devid) {
6+
static bool func(wchar_t* devid, DWORD* cap) {
77
HDEVINFO hDevInfo = SetupDiGetClassDevsW(NULL, devid, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE | DIGCF_ALLCLASSES);
8-
DWORD cap = 0;
9-
SP_DEVINFO_DATA spdd;
10-
spdd.cbSize = sizeof(SP_DEVINFO_DATA);
11-
if (SetupDiEnumDeviceInfo(hDevInfo, 0, &spdd)) {
12-
SetupDiGetDeviceRegistryPropertyA(hDevInfo, &spdd, SPDRP_CAPABILITIES, NULL, (BYTE*)&cap, sizeof(DWORD), NULL);
8+
if (hDevInfo != INVALID_HANDLE_VALUE) {
9+
SP_DEVINFO_DATA spdd{};
10+
spdd.cbSize = sizeof(SP_DEVINFO_DATA);
11+
if (SetupDiEnumDeviceInfo(hDevInfo, 0, &spdd)) {
12+
SetupDiGetDeviceRegistryPropertyA(hDevInfo, &spdd, SPDRP_CAPABILITIES, NULL, (BYTE*)cap, sizeof(DWORD), NULL);
13+
}
14+
SetupDiDestroyDeviceInfoList(hDevInfo);
15+
return true;
1316
}
14-
SetupDiDestroyDeviceInfoList(hDevInfo);
15-
return cap;
17+
return false;
1618
}
1719
static napi_value init(napi_env env, bool isSync = false) {
1820
napi_value f;
@@ -26,6 +28,7 @@ class getDeviceCapabilities {
2628
napi_ref cb;
2729
wchar_t* DevInstId;
2830
DWORD result;
31+
bool success;
2932
};
3033
static napi_value convert(napi_env env, DWORD data) {
3134
napi_value tmp, result;
@@ -72,7 +75,12 @@ class getDeviceCapabilities {
7275
str_len += 1;
7376
wchar_t* DevInstId = new wchar_t[str_len];
7477
napi_get_value_string_utf16(env, tmp, (char16_t*)DevInstId, str_len, NULL);
75-
result = convert(env, func(DevInstId));
78+
DWORD cap = 0;
79+
if (func(DevInstId, &cap)) {
80+
result = convert(env, cap);
81+
} else {
82+
napi_get_null(env, &result);
83+
}
7684
}
7785
}
7886
return result;
@@ -123,18 +131,23 @@ class getDeviceCapabilities {
123131
}
124132
static void execute(napi_env env, void* data) {
125133
cbdata* d = (cbdata*)data;
126-
d->result = func(d->DevInstId);
134+
d->success = func(d->DevInstId, &d->result);
127135
}
128136
static void complete(napi_env env, napi_status status, void* data) {
129137
cbdata* d = (cbdata*)data;
130-
napi_value cb, self, argv = convert(env, d->result);
138+
delete[]d->DevInstId;
139+
napi_value cb, self, argv;
140+
if (d->success) {
141+
argv = convert(env, d->result);
142+
} else {
143+
napi_get_null(env, &argv);
144+
}
131145
napi_get_reference_value(env, d->cb, &cb);
132146
napi_get_reference_value(env, d->self, &self);
133147
napi_call_function(env, self, cb, 1, &argv, NULL);
134148
napi_delete_reference(env, d->cb);
135149
napi_delete_reference(env, d->self);
136150
napi_delete_async_work(env, d->work);
137-
delete[]d->DevInstId;
138151
delete d;
139152
}
140153
};

0 commit comments

Comments
 (0)