Skip to content

Commit 7e77b11

Browse files
committed
Add promise return for getSocket
Signed-off-by: Matthew Peveler <[email protected]>
1 parent 29e4173 commit 7e77b11

File tree

3 files changed

+163
-57
lines changed

3 files changed

+163
-57
lines changed

lib/portfinder.d.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,20 @@ interface PortFinderOptions {
2828
stopPort?: number;
2929
}
3030

31+
type SocketfinderCallback = (err: Error, socket: string) => void;
32+
33+
interface SocketFinderOptions {
34+
/**
35+
* Mode to use when creating folder for socket if it doesn't exist
36+
*/
37+
mod?: number;
38+
/**
39+
* Path to the socket file to create
40+
* (defaults to `${exports.basePath}.sock` if not provided)
41+
*/
42+
path?: string;
43+
}
44+
3145
/**
3246
* The lowest port to begin any port search from.
3347
*/
@@ -81,3 +95,9 @@ export function getPorts(count: number, options: PortFinderOptions, callback: (e
8195
* Responds a promise that resolves to an array of unbound ports on the current machine.
8296
*/
8397
export function getPortsPromise(count: number, options?: PortFinderOptions): Promise<Array<number>>;
98+
99+
export function getSocket(options: SocketFinderOptions): Promise<string>;
100+
export function getSocket(callback: SocketfinderCallback): void;
101+
export function getSocket(options: SocketFinderOptions, callback: SocketfinderCallback): void;
102+
103+
export function getSocketPromise(options?: SocketFinderOptions): Promise<string>;

lib/portfinder.js

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ exports.getPort = function (options, callback) {
232232
});
233233
});
234234
} else {
235-
return internals.getPort(options, callback);
235+
internals.getPort(options, callback);
236236
}
237237
};
238238

@@ -286,7 +286,7 @@ exports.getPorts = function (count, options, callback) {
286286
});
287287
});
288288
} else {
289-
return internals.getPorts(count, options, callback);
289+
internals.getPorts(count, options, callback);
290290
}
291291
};
292292

@@ -298,19 +298,7 @@ exports.getPorts = function (count, options, callback) {
298298
//
299299
exports.getPortsPromise = exports.getPorts;
300300

301-
//
302-
// ### function getSocket (options, callback)
303-
// #### @options {Object} Settings to use when finding the necessary port
304-
// #### @callback {function} Continuation to respond to when complete.
305-
// Responds with a unbound socket using the specified directory and base
306-
// name on the current machine.
307-
//
308-
exports.getSocket = function (options, callback) {
309-
if (!callback) {
310-
callback = options;
311-
options = {};
312-
}
313-
301+
internals.getSocket = function (options, callback) {
314302
options.mod = options.mod || parseInt(755, 8);
315303
options.path = options.path || exports.basePath + '.sock';
316304

@@ -337,7 +325,7 @@ exports.getSocket = function (options, callback) {
337325
// next socket.
338326
//
339327
options.path = exports.nextSocket(options.path);
340-
exports.getSocket(options, callback);
328+
internals.getSocket(options, callback);
341329
}
342330
});
343331
}
@@ -386,6 +374,37 @@ exports.getSocket = function (options, callback) {
386374
: checkAndTestSocket();
387375
};
388376

377+
//
378+
// ### function getSocket (options, callback)
379+
// #### @options {Object} Settings to use when finding the necessary port
380+
// #### @callback {function} Continuation to respond to when complete.
381+
// Responds with a unbound socket using the specified directory and base
382+
// name on the current machine.
383+
//
384+
exports.getSocket = function (options, callback) {
385+
if (typeof options === 'function') {
386+
callback = options;
387+
options = {};
388+
}
389+
390+
options = options || {};
391+
392+
if (!callback) {
393+
return new Promise(function (resolve, reject) {
394+
internals.getSocket(options, function (err, socketPath) {
395+
if (err) {
396+
return reject(err);
397+
}
398+
resolve(socketPath);
399+
});
400+
});
401+
} else {
402+
internals.getSocket(options, callback);
403+
}
404+
}
405+
406+
exports.getSocketPromise = exports.getSocket;
407+
389408
//
390409
// ### function nextPort (port)
391410
// #### @port {Number} Port to increment from.

test/port-finder-socket.test.js

Lines changed: 108 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -46,22 +46,19 @@ function createServers (callback) {
4646

4747
server.listen(sock, next);
4848
base++;
49-
servers.push(server);
49+
servers.push([server, sock]);
5050
}, callback);
5151
}
5252

53-
function stopServers(callback, index) {
54-
if (index < servers.length) {
55-
servers[index].close(function (err) {
56-
if (err) {
57-
callback(err, false);
58-
} else {
59-
stopServers(callback, index + 1);
53+
function stopServers(callback) {
54+
_async.each(servers, function ([server, sock], next) {
55+
server.close(function () {
56+
if (process.platform === 'win32') {
57+
fs.unlinkSync(sock);
6058
}
59+
next();
6160
});
62-
} else {
63-
callback(null, true);
64-
}
61+
}, callback);
6562
}
6663

6764
function cleanup(callback) {
@@ -74,7 +71,7 @@ function cleanup(callback) {
7471
if (fs.existsSync(badDir)) {
7572
fs.rmdirSync(badDir);
7673
}
77-
stopServers(callback, 0);
74+
stopServers(callback);
7875
}
7976

8077
describe('portfinder', function () {
@@ -101,47 +98,117 @@ describe('portfinder', function () {
10198
stopServers(done);
10299
});
103100

104-
test('the getSocket() method should respond with the first free socket (test5.sock)', function (done) {
105-
portfinder.getSocket({
106-
path: path.join(socketDir, 'test.sock'),
107-
}, function (err, socket) {
108-
expect(err).toBeNull();
109-
expect(socket).toEqual(path.join(socketDir, 'test5.sock'));
110-
done();
101+
describe.each([
102+
['getSocket()', false, portfinder.getSocket],
103+
['getSocket()', true, portfinder.getSocket],
104+
['getSocketPromise()', true, portfinder.getSocketPromise],
105+
])(`the %s method (promise: %p)`, function (name, isPromise, method) {
106+
test('should respond with the first free socket (test5.sock)', function (done) {
107+
if (isPromise) {
108+
method({
109+
path: path.join(socketDir, 'test.sock')
110+
})
111+
.then(function (socket) {
112+
expect(socket).toEqual(path.join(socketDir, 'test5.sock'));
113+
done();
114+
})
115+
.catch(function (err) {
116+
done(err);
117+
});
118+
} else {
119+
method({
120+
path: path.join(socketDir, 'test.sock'),
121+
}, function (err, socket) {
122+
if (err) {
123+
done(err);
124+
return;
125+
}
126+
expect(err).toBeNull();
127+
expect(socket).toEqual(path.join(socketDir, 'test5.sock'));
128+
done();
129+
});
130+
}
111131
});
112132
});
113133
});
114134

115135
describe('with no existing servers', function () {
116-
describe('the getSocket() method', function () {
136+
describe.each([
137+
['getSocket()', false, portfinder.getSocket],
138+
['getSocket()', true, portfinder.getSocket],
139+
['getSocketPromise()', true, portfinder.getSocketPromise],
140+
])(`the %s method (promise: %p)`, function (name, isPromise, method) {
117141
test("with a directory that doesn't exist should respond with the first free socket (test.sock)", function (done) {
118-
portfinder.getSocket({
119-
path: path.join(badDir, 'test.sock'),
120-
}, function (err, socket) {
121-
expect(err).toBeNull();
122-
expect(socket).toEqual(path.join(badDir, 'test.sock'));
123-
done();
124-
});
142+
if (isPromise) {
143+
method({
144+
path: path.join(badDir, 'test.sock'),
145+
})
146+
.then(function (socket) {
147+
expect(socket).toEqual(path.join(badDir, 'test.sock'));
148+
done();
149+
})
150+
.catch(function (err) {
151+
done(err);
152+
});
153+
} else {
154+
method({
155+
path: path.join(badDir, 'test.sock'),
156+
}, function (err, socket) {
157+
if (err) {
158+
done(err);
159+
return;
160+
}
161+
expect(err).toBeNull();
162+
expect(socket).toEqual(path.join(badDir, 'test.sock'));
163+
done();
164+
});
165+
}
125166
});
126167

127168
test("with a nested directory that doesn't exist should respond with the first free socket (test.sock)", function (done) {
128-
portfinder.getSocket({
129-
path: path.join(badDir, 'deeply', 'nested', 'test.sock'),
130-
}, function (err, socket) {
131-
expect(err).toBeNull();
132-
expect(socket).toEqual(path.join(badDir, 'deeply', 'nested', 'test.sock'));
133-
done();
134-
});
169+
if (isPromise) {
170+
method({
171+
path: path.join(badDir, 'deeply', 'nested', 'test.sock'),
172+
})
173+
.then(function (socket) {
174+
expect(socket).toEqual(path.join(badDir, 'deeply', 'nested', 'test.sock'));
175+
done();
176+
})
177+
.catch(function (err) {
178+
done(err);
179+
});
180+
} else {
181+
method({
182+
path: path.join(badDir, 'deeply', 'nested', 'test.sock'),
183+
}, function (err, socket) {
184+
expect(err).toBeNull();
185+
expect(socket).toEqual(path.join(badDir, 'deeply', 'nested', 'test.sock'));
186+
done();
187+
});
188+
}
135189
});
136190

137191
test('with a directory that exists should respond with the first free socket (test.sock)', function (done) {
138-
portfinder.getSocket({
139-
path: path.join(socketDir, 'exists.sock'),
140-
}, function (err, socket) {
141-
expect(err).toBeNull();
142-
expect(socket).toEqual(path.join(socketDir, 'exists.sock'));
143-
done();
144-
});
192+
if (isPromise) {
193+
method({
194+
path: path.join(socketDir, 'test.sock'),
195+
})
196+
.then(function (socket) {
197+
expect(socket).toEqual(path.join(socketDir, 'test.sock'));
198+
done();
199+
})
200+
.catch(function (err) {
201+
done(err);
202+
});
203+
} else {
204+
method({
205+
path: path.join(socketDir, 'test.sock'),
206+
}, function (err, socket) {
207+
expect(err).toBeNull();
208+
expect(socket).toEqual(path.join(socketDir, 'test.sock'));
209+
done();
210+
});
211+
}
145212
});
146213
});
147214
});

0 commit comments

Comments
 (0)