Skip to content

Commit 5ec34aa

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

File tree

3 files changed

+166
-65
lines changed

3 files changed

+166
-65
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: 111 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ function createServers (callback) {
2525
function (next) {
2626
const server = net.createServer(function () { }),
2727
name = base === 0 ? 'test.sock' : 'test' + base + '.sock';
28-
let sock = path.join(socketDir, name);
28+
const socket = path.join(socketDir, name);
29+
let sock = socket;
2930

3031
// shamelessly stolen from foreverjs,
3132
// https://github.com/foreverjs/forever/blob/6d143609dd3712a1cf1bc515d24ac6b9d32b2588/lib/forever/worker.js#L141-L154
@@ -46,22 +47,19 @@ function createServers (callback) {
4647

4748
server.listen(sock, next);
4849
base++;
49-
servers.push(server);
50+
servers.push([server, socket]);
5051
}, callback);
5152
}
5253

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);
54+
function stopServers(callback) {
55+
_async.each(servers, function ([server, socket], next) {
56+
server.close(function () {
57+
if (process.platform === 'win32') {
58+
fs.unlinkSync(socket);
6059
}
60+
next();
6161
});
62-
} else {
63-
callback(null, true);
64-
}
62+
}, callback);
6563
}
6664

6765
function cleanup(callback) {
@@ -74,7 +72,7 @@ function cleanup(callback) {
7472
if (fs.existsSync(badDir)) {
7573
fs.rmdirSync(badDir);
7674
}
77-
stopServers(callback, 0);
75+
stopServers(callback);
7876
}
7977

8078
describe('portfinder', function () {
@@ -88,60 +86,124 @@ describe('portfinder', function () {
8886

8987
describe('with 5 existing servers', function () {
9088
beforeAll(function (done) {
91-
createServers(function () {
92-
portfinder.getSocket({
93-
path: path.join(badDir, 'test.sock'),
94-
}, function () {
95-
done();
96-
});
97-
});
89+
createServers(done);
9890
});
9991

10092
afterAll(function (done) {
10193
stopServers(done);
10294
});
10395

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

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

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

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

0 commit comments

Comments
 (0)