Skip to content

Commit 0dc6675

Browse files
authored
fix: crash when initialising compiler and forks (#646)
1 parent b6668cd commit 0dc6675

5 files changed

Lines changed: 25 additions & 47 deletions

File tree

packages/haul-core-legacy/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@
2525
},
2626
"dependencies": {
2727
"cpx": "^1.5.0",
28+
"get-port": "^5.0.0",
2829
"mime-types": "^2.1.24",
2930
"mkdirp": "^0.5.1",
30-
"ws": "^6.2.1",
31-
"xpipe": "^1.0.5"
31+
"ws": "^6.2.1"
3232
},
3333
"devDependencies": {
3434
"snapshot-diff": "^0.5.2"

packages/haul-core-legacy/src/compiler/Compiler.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ module.exports = class Compiler extends EventEmitter {
3434
this.tasks = new TaskQueue();
3535
this.logger = logger;
3636

37-
this.on(Events.REQUEST_BUNDLE, ({ platform, filename, callback }) => {
37+
this.on(Events.REQUEST_BUNDLE, async ({ platform, filename, callback }) => {
3838
if (!this.forks[platform]) {
39-
this.forks[platform] = this.initFork({ platform, options });
39+
this.forks[platform] = await this.initFork({ platform, options });
4040
}
4141

4242
if (!this.forks[platform]) return;
@@ -95,10 +95,11 @@ module.exports = class Compiler extends EventEmitter {
9595
/**
9696
* Create fork process and attach necessary event listeners.
9797
*/
98-
initFork({ platform, options }: { platform: Platform, options: * }) {
98+
async initFork({ platform, options }: { platform: Platform, options: * }) {
9999
let fork;
100100
try {
101101
fork = new Fork({ platform, options });
102+
await fork.init();
102103
} catch (message) {
103104
this.emit(Events.BUILD_FAILED, { platform, message });
104105
return null;

packages/haul-core-legacy/src/compiler/Fork.js

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
import type { Platform } from '../types';
99

10-
const fs = require('fs');
1110
const EventEmitter = require('events');
1211
const Events = require('./events');
1312
const createForkProcess = require('./createForkProcess');
@@ -32,12 +31,20 @@ module.exports = class Fork extends EventEmitter {
3231
socket: WebSocket;
3332
enqueuedMessages: any[];
3433
isProcessing: boolean;
34+
options: any;
3535

3636
constructor({ platform, options }: ForkConstructorArgs) {
3737
super();
38+
this.isProcessing = true;
39+
this.enqueuedMessages = [];
40+
this.platform = platform;
41+
this.options = options;
42+
}
3843

44+
async init() {
3945
if (!transportServer) {
40-
transportServer = createWebSocketServer();
46+
// eslint-disable-next-line require-atomic-updates
47+
transportServer = await createWebSocketServer();
4148

4249
// WebSocket connection is established after the Fork is created.
4350
transportServer.on('connection', (socket, req) => {
@@ -58,17 +65,15 @@ module.exports = class Fork extends EventEmitter {
5865
});
5966
}
6067

61-
this.isProcessing = true;
62-
this.enqueuedMessages = [];
63-
this.platform = platform;
68+
const { port } = transportServer.address();
6469
this.process = createForkProcess(
65-
platform,
70+
this.platform,
6671
__dirname,
67-
transportServer.options.server.address(),
68-
options
72+
`localhost:${port}`,
73+
this.options
6974
);
7075

71-
forks[platform] = this;
76+
forks[this.platform] = this;
7277
}
7378

7479
setSocket(socket: WebSocket) {
@@ -116,10 +121,6 @@ module.exports = class Fork extends EventEmitter {
116121
}
117122

118123
if (transportServer && !Object.keys(forks).length) {
119-
const socketAddress = transportServer.options.server.address();
120-
if (fs.existsSync(socketAddress)) {
121-
fs.unlinkSync(socketAddress);
122-
}
123124
transportServer.close();
124125
}
125126
}

packages/haul-core-legacy/src/compiler/createWebSocketServer.js

Lines changed: 4 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -5,47 +5,23 @@
55
* @flow
66
*/
77

8-
const xpipe = require('xpipe');
8+
const getPort = require('get-port');
99
const http = require('http');
1010
const { Server } = require('ws');
11-
const fs = require('fs');
12-
13-
function getSocketAddress() {
14-
let address = null;
15-
let triesLeft = 20;
16-
while (!address && triesLeft > 0) {
17-
triesLeft--;
18-
address = xpipe.eq(
19-
`/tmp/HAUL_SOCKET_${Math.floor(
20-
(Date.now() * Math.random()) / 10000000
21-
)}_.socket`
22-
);
23-
if (fs.existsSync(address)) {
24-
address = null;
25-
}
26-
}
27-
28-
if (!address) {
29-
throw new Error('Could not find any free socket address');
30-
}
31-
32-
return address;
33-
}
3411

3512
/**
3613
* Create WebSocket server using HTTP server over Unix socket.
3714
*/
38-
module.exports = function createWebSocketServer() {
39-
const socketAddress = getSocketAddress();
40-
15+
module.exports = async function createWebSocketServer() {
4116
const httpServer = http.createServer();
4217
const webSocketServer = new Server({
4318
server: httpServer,
4419
perMessageDeflate: false,
4520
maxPayload: 200 * 1024 * 1024,
4621
});
4722

48-
httpServer.listen(socketAddress);
23+
const port = await getPort();
24+
httpServer.listen(port);
4925

5026
return webSocketServer;
5127
};

packages/haul-core-legacy/src/compiler/worker/initWorker.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ module.exports = function initWorker({
2121
[key: string]: string,
2222
}) {
2323
const webSocket = new WebSocket(
24-
`ws+unix://${socketAddress}:/?platform=${platform}`
24+
`ws://${socketAddress}/?platform=${platform}`
2525
);
2626

2727
function send(type, payload = {}) {

0 commit comments

Comments
 (0)