Skip to content

Commit d65bc9b

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

File tree

3 files changed

+160
-57
lines changed

3 files changed

+160
-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: 105 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -50,18 +50,12 @@ function createServers (callback) {
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);
60-
}
53+
function stopServers(callback) {
54+
_async.each(servers, function (server, next) {
55+
server.close(function () {
56+
next();
6157
});
62-
} else {
63-
callback(null, true);
64-
}
58+
}, callback);
6559
}
6660

6761
function cleanup(callback) {
@@ -74,7 +68,7 @@ function cleanup(callback) {
7468
if (fs.existsSync(badDir)) {
7569
fs.rmdirSync(badDir);
7670
}
77-
stopServers(callback, 0);
71+
stopServers(callback);
7872
}
7973

8074
describe('portfinder', function () {
@@ -101,47 +95,117 @@ describe('portfinder', function () {
10195
stopServers(done);
10296
});
10397

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();
98+
describe.each([
99+
['getSocket()', false, portfinder.getSocket],
100+
['getSocket()', true, portfinder.getSocket],
101+
['getSocketPromise()', true, portfinder.getSocketPromise],
102+
])(`the %s method (promise: %p)`, function (name, isPromise, method) {
103+
test('should respond with the first free socket (test5.sock)', function (done) {
104+
if (isPromise) {
105+
method({
106+
path: path.join(socketDir, 'test.sock')
107+
})
108+
.then(function (socket) {
109+
expect(socket).toEqual(path.join(socketDir, 'test5.sock'));
110+
done();
111+
})
112+
.catch(function (err) {
113+
done(err);
114+
});
115+
} else {
116+
method({
117+
path: path.join(socketDir, 'test.sock'),
118+
}, function (err, socket) {
119+
if (err) {
120+
done(err);
121+
return;
122+
}
123+
expect(err).toBeNull();
124+
expect(socket).toEqual(path.join(socketDir, 'test5.sock'));
125+
done();
126+
});
127+
}
111128
});
112129
});
113130
});
114131

115132
describe('with no existing servers', function () {
116-
describe('the getSocket() method', function () {
133+
describe.each([
134+
['getSocket()', false, portfinder.getSocket],
135+
['getSocket()', true, portfinder.getSocket],
136+
['getSocketPromise()', true, portfinder.getSocketPromise],
137+
])(`the %s method (promise: %p)`, function (name, isPromise, method) {
117138
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-
});
139+
if (isPromise) {
140+
method({
141+
path: path.join(badDir, 'test.sock'),
142+
})
143+
.then(function (socket) {
144+
expect(socket).toEqual(path.join(badDir, 'test.sock'));
145+
done();
146+
})
147+
.catch(function (err) {
148+
done(err);
149+
});
150+
} else {
151+
method({
152+
path: path.join(badDir, 'test.sock'),
153+
}, function (err, socket) {
154+
if (err) {
155+
done(err);
156+
return;
157+
}
158+
expect(err).toBeNull();
159+
expect(socket).toEqual(path.join(badDir, 'test.sock'));
160+
done();
161+
});
162+
}
125163
});
126164

127165
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-
});
166+
if (isPromise) {
167+
method({
168+
path: path.join(badDir, 'deeply', 'nested', 'test.sock'),
169+
})
170+
.then(function (socket) {
171+
expect(socket).toEqual(path.join(badDir, 'deeply', 'nested', 'test.sock'));
172+
done();
173+
})
174+
.catch(function (err) {
175+
done(err);
176+
});
177+
} else {
178+
method({
179+
path: path.join(badDir, 'deeply', 'nested', 'test.sock'),
180+
}, function (err, socket) {
181+
expect(err).toBeNull();
182+
expect(socket).toEqual(path.join(badDir, 'deeply', 'nested', 'test.sock'));
183+
done();
184+
});
185+
}
135186
});
136187

137188
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-
});
189+
if (isPromise) {
190+
method({
191+
path: path.join(socketDir, 'test.sock'),
192+
})
193+
.then(function (socket) {
194+
expect(socket).toEqual(path.join(socketDir, 'test.sock'));
195+
done();
196+
})
197+
.catch(function (err) {
198+
done(err);
199+
});
200+
} else {
201+
method({
202+
path: path.join(socketDir, 'test.sock'),
203+
}, function (err, socket) {
204+
expect(err).toBeNull();
205+
expect(socket).toEqual(path.join(socketDir, 'test.sock'));
206+
done();
207+
});
208+
}
145209
});
146210
});
147211
});

0 commit comments

Comments
 (0)