-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathutil.js
More file actions
74 lines (72 loc) · 2.34 KB
/
util.js
File metadata and controls
74 lines (72 loc) · 2.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import * as ldap from "./ldap.js";
export function iterableSearch(base, options) {
return new Promise((resolve, reject) => {
ldap.client.search(base, options, (err, res) => {
if (err) {
reject(err);
} else {
resolve({
async *[Symbol.asyncIterator]() {
let entries = [];
let foundEnd = false;
// Used internally for generator, allow waiting for next tick
let fire = null;
function onSearchEntry(entry) {
entries.push(entry);
if (fire) {
fire();
}
}
function onEnd() {
console.log("Found an end!");
foundEnd = true;
// Don't leak memory:
res.removeListener("searchEntry", onSearchEntry);
res.removeListener("error", onError);
if (fire) {
fire();
}
}
function onError(err) {
console.log("Found an error!", err);
entries.push(Promise.reject(err));
foundEnd = true;
res.removeListener("end", onEnd);
res.removeListener("searchEntry", onSearchEntry);
if (fire) {
fire();
}
}
res.on("searchEntry", onSearchEntry);
res.once("end", onEnd);
res.once("error", onError);
while (!foundEnd) {
while (entries.length) {
const entriesClone = entries;
entries = [];
// console.log(`Pumping ${entriesClone.length} entries!`);
yield* entriesClone;
// console.log("Pumped!");
}
if (!foundEnd) {
// Waits for next chunk to be dispatched from the system
await new Promise((resolve, reject) => {
// Safety check, make sure we don't deadlock
// (even though this call should be immediate)
if (entries.length) {
resolve();
} else {
fire = () => {
fire = null;
resolve();
};
}
});
}
}
},
});
}
});
});
}