| 1120 | } |
| 1121 | |
| 1122 | export function createServerCloseFn( |
| 1123 | server: HttpServer | null, |
| 1124 | ): () => Promise<void> { |
| 1125 | if (!server) { |
| 1126 | return () => Promise.resolve() |
| 1127 | } |
| 1128 | |
| 1129 | let hasListened = false |
| 1130 | const openSockets = new Set<net.Socket>() |
| 1131 | |
| 1132 | server.on(class="st">'connection', (socket) => { |
| 1133 | openSockets.add(socket) |
| 1134 | socket.on(class="st">'close', () => { |
| 1135 | openSockets.delete(socket) |
| 1136 | }) |
| 1137 | }) |
| 1138 | |
| 1139 | server.once(class="st">'listening', () => { |
| 1140 | hasListened = true |
| 1141 | }) |
| 1142 | |
| 1143 | return () => |
| 1144 | new Promise<void>((resolve, reject) => { |
| 1145 | openSockets.forEach((s) => s.destroy()) |
| 1146 | if (hasListened) { |
| 1147 | server.close((err) => { |
| 1148 | if (err) { |
| 1149 | reject(err) |
| 1150 | } else { |
| 1151 | resolve() |
| 1152 | } |
| 1153 | }) |
| 1154 | } else { |
| 1155 | resolve() |
| 1156 | } |
| 1157 | }) |
| 1158 | } |
| 1159 | |
| 1160 | function resolvedAllowDir(root: string, dir: string): string { |
| 1161 | return normalizePath(path.resolve(root, dir)) |