(input: {
hostname: string;
port: number;
})
| 235 | }; |
| 236 | |
| 237 | const isPortAvailable = (input: { |
| 238 | hostname: string; |
| 239 | port: number; |
| 240 | }): Effect.Effect<boolean, Error> => |
| 241 | Effect.tryPromise({ |
| 242 | try: () => |
| 243 | new Promise<boolean>((resolve) => { |
| 244 | const server = createServer() as ProbeServer; |
| 245 | const cleanup = () => { |
| 246 | if (typeof server.removeAllListeners === "function") { |
| 247 | server.removeAllListeners(); |
| 248 | } |
| 249 | }; |
| 250 | |
| 251 | server.once("error", () => { |
| 252 | cleanup(); |
| 253 | resolve(false); |
| 254 | }); |
| 255 | |
| 256 | server.once("listening", () => { |
| 257 | cleanup(); |
| 258 | server.close(() => resolve(true)); |
| 259 | }); |
| 260 | |
| 261 | server.listen({ port: input.port, host: toProbeHost(input.hostname) }); |
| 262 | }), |
| 263 | catch: (cause) => |
| 264 | cause instanceof Error |
| 265 | ? cause |
| 266 | : new Error(`Failed probing port availability: ${String(cause)}`), |
| 267 | }); |
| 268 | |
| 269 | const pickEphemeralPort = (hostname: string): Effect.Effect<number, Error> => |
| 270 | Effect.tryPromise({ |
no test coverage detected