feat: add getRandomAvailablePort function and update tests
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import { isObject, isString, makeId } from "@/utils/utils"
|
||||
import { getRandomAvailablePort, isObject, isString, makeId } from "@/utils/utils"
|
||||
|
||||
test('makeId', () => {
|
||||
const id = makeId();
|
||||
@@ -20,4 +20,10 @@ test('isString', () => {
|
||||
expect(isString(str)).toBeTruthy();
|
||||
const aNumber = 1;
|
||||
expect(isString(aNumber)).toBeFalsy();
|
||||
})
|
||||
|
||||
test('getRandomAvailablePort', async () => {
|
||||
const port = await getRandomAvailablePort();
|
||||
expect(port).toBeGreaterThanOrEqual(1);
|
||||
expect(port).toBeLessThanOrEqual(65535);
|
||||
})
|
||||
@@ -14,4 +14,31 @@ export type ToDeepPromise<T> = {
|
||||
: T[K] extends object
|
||||
? ToDeepPromise<T[K]>
|
||||
: T[K]
|
||||
};
|
||||
};
|
||||
|
||||
export async function getRandomAvailablePort() {
|
||||
const { createServer } = await import('http');
|
||||
const server = createServer();
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
server.on('listening', () => {
|
||||
const address = server.address();
|
||||
if (address && isObject(address)) {
|
||||
const port = address.port;
|
||||
server.close(() => {
|
||||
resolve(port);
|
||||
})
|
||||
} else {
|
||||
server.close();
|
||||
reject(new Error('Failed to get port'));
|
||||
}
|
||||
});
|
||||
|
||||
server.on('error', (err) => {
|
||||
server.close();
|
||||
reject(err);
|
||||
});
|
||||
|
||||
server.listen(0);
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user