Skip to content

Commit e8bc36f

Browse files
Fix types and remove sendStopMessage
1 parent ff00d9c commit e8bc36f

File tree

2 files changed

+20
-72
lines changed

2 files changed

+20
-72
lines changed

cli/lib/types/wordpress-server-ipc.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
import { z } from 'zod';
22

33
// Zod schemas for validating IPC messages from wordpress-server-manager
4-
const managerMessageBase = z.object( {
5-
messageId: z.number(),
6-
} );
7-
84
const serverConfig = z.object( {
95
siteId: z.string(),
106
sitePath: z.string(),
@@ -21,30 +17,37 @@ const serverConfig = z.object( {
2117

2218
export type ServerConfig = z.infer< typeof serverConfig >;
2319

24-
const managerMessageStartServer = managerMessageBase.extend( {
20+
const managerMessageStartServer = z.object( {
2521
topic: z.literal( 'start-server' ),
2622
data: z.object( {
2723
config: serverConfig,
2824
} ),
2925
} );
3026

31-
const managerMessageRunBlueprint = managerMessageBase.extend( {
27+
const managerMessageRunBlueprint = z.object( {
3228
topic: z.literal( 'run-blueprint' ),
3329
data: z.object( {
3430
config: serverConfig,
3531
} ),
3632
} );
3733

38-
const managerMessageStopServer = managerMessageBase.extend( {
34+
const managerMessageStopServer = z.object( {
3935
topic: z.literal( 'stop-server' ),
40-
data: z.object( {} ),
4136
} );
4237

43-
export const managerMessageSchema = z.discriminatedUnion( 'topic', [
38+
const _managerMessagePayloadSchema = z.discriminatedUnion( 'topic', [
4439
managerMessageStartServer,
4540
managerMessageRunBlueprint,
4641
managerMessageStopServer,
4742
] );
43+
export type ManagerMessagePayload = z.infer< typeof _managerMessagePayloadSchema >;
44+
45+
const managerMessageBase = z.object( { messageId: z.number() } );
46+
export const managerMessageSchema = z.discriminatedUnion( 'topic', [
47+
managerMessageBase.merge( managerMessageStartServer ),
48+
managerMessageBase.merge( managerMessageRunBlueprint ),
49+
managerMessageBase.merge( managerMessageStopServer ),
50+
] );
4851
export type ManagerMessage = z.infer< typeof managerMessageSchema >;
4952

5053
// Zod schemas for validating IPC messages from wordpress-server-child

cli/lib/wordpress-server-manager.ts

Lines changed: 8 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import {
2323
ServerConfig,
2424
childMessagePm2Schema,
2525
ManagerMessage,
26+
ManagerMessagePayload,
2627
} from 'cli/lib/types/wordpress-server-ipc';
2728

2829
/**
@@ -140,7 +141,8 @@ const messageActivityTrackers = new Map<
140141

141142
async function sendMessage(
142143
pmId: number,
143-
message: Omit< ManagerMessage, 'messageId' >
144+
message: ManagerMessagePayload,
145+
maxTotalElapsedTime = PLAYGROUND_CLI_INACTIVITY_TIMEOUT
144146
): Promise< unknown > {
145147
const bus = await getPm2Bus();
146148

@@ -165,12 +167,12 @@ async function sendMessage(
165167

166168
if (
167169
timeSinceLastActivity > PLAYGROUND_CLI_INACTIVITY_TIMEOUT ||
168-
totalElapsedTime > PLAYGROUND_CLI_MAX_TIMEOUT
170+
totalElapsedTime > maxTotalElapsedTime
169171
) {
170172
cleanup();
171173
const timeoutReason =
172-
totalElapsedTime > PLAYGROUND_CLI_MAX_TIMEOUT
173-
? `Maximum timeout of ${ PLAYGROUND_CLI_MAX_TIMEOUT / 1000 }s exceeded`
174+
totalElapsedTime > maxTotalElapsedTime
175+
? `Maximum timeout of ${ maxTotalElapsedTime / 1000 }s exceeded`
174176
: `No activity for ${ PLAYGROUND_CLI_INACTIVITY_TIMEOUT / 1000 }s`;
175177
reject(
176178
new Error( `Timeout waiting for response to message ${ messageId }: ${ timeoutReason }` )
@@ -216,7 +218,7 @@ async function sendMessage(
216218

217219
bus.on( 'process:msg', responseHandler );
218220

219-
sendMessageToProcess( pmId, { ...message, messageId } as ManagerMessage ).catch( reject );
221+
sendMessageToProcess( pmId, { ...message, messageId } ).catch( reject );
220222
} );
221223
}
222224

@@ -228,7 +230,7 @@ export async function stopWordPressServer( siteId: string ): Promise< void > {
228230

229231
if ( runningProcess ) {
230232
try {
231-
await sendStopMessage( runningProcess.pmId );
233+
await sendMessage( runningProcess.pmId, { topic: 'stop-server' }, GRACEFUL_STOP_TIMEOUT );
232234
} catch {
233235
// Graceful shutdown failed, PM2 delete will handle it
234236
}
@@ -237,63 +239,6 @@ export async function stopWordPressServer( siteId: string ): Promise< void > {
237239
return stopProcess( processName );
238240
}
239241

240-
/**
241-
* Send stop message to the child process with a timeout
242-
*/
243-
async function sendStopMessage( pmId: number ): Promise< void > {
244-
const bus = await getPm2Bus();
245-
246-
return new Promise( ( resolve, reject ) => {
247-
const messageId = nextMessageId++;
248-
249-
const timeout = setTimeout( () => {
250-
cleanup();
251-
reject( new Error( 'Graceful stop timeout' ) );
252-
}, GRACEFUL_STOP_TIMEOUT );
253-
254-
const cleanup = () => {
255-
clearTimeout( timeout );
256-
bus.off( 'process:msg', responseHandler );
257-
};
258-
259-
const responseHandler = ( packet: unknown ) => {
260-
const validationResult = childMessagePm2Schema.safeParse( packet );
261-
if ( ! validationResult.success ) {
262-
return;
263-
}
264-
265-
const validPacket = validationResult.data;
266-
267-
if ( validPacket.process.pm_id !== pmId ) {
268-
return;
269-
}
270-
271-
if ( validPacket.raw.topic === 'error' && validPacket.raw.originalMessageId === messageId ) {
272-
cleanup();
273-
reject( new Error( validPacket.raw.errorMessage ) );
274-
} else if (
275-
validPacket.raw.topic === 'result' &&
276-
validPacket.raw.originalMessageId === messageId
277-
) {
278-
cleanup();
279-
resolve();
280-
}
281-
};
282-
283-
bus.on( 'process:msg', responseHandler );
284-
285-
const stopMessage = {
286-
topic: 'stop-server' as const,
287-
data: {},
288-
messageId,
289-
};
290-
sendMessageToProcess( pmId, stopMessage ).catch( ( error ) => {
291-
cleanup();
292-
reject( error );
293-
} );
294-
} );
295-
}
296-
297242
/**
298243
* Run a blueprint on a site without starting a server
299244
* 1. Start the PM2 process

0 commit comments

Comments
 (0)