Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,52 @@ describe.each(['HTTP', 'HTTPS'])(
}
});

test('async source map fetching does not reorder events', async () => {
serverRef.app.use(
'/source-map',
serveStaticJson({
version: 3,
// Mojibake insurance.
file: '\u2757.js',
}),
);
const {device, debugger_} = await createAndConnectTarget(
serverRef,
autoCleanup.signal,
{
app: 'bar-app',
id: 'page1',
title: 'bar-title',
vm: 'bar-vm',
},
);
try {
await Promise.all([
sendFromTargetToDebugger(device, debugger_, 'page1', {
method: 'Debugger.scriptParsed',
params: {
sourceMapURL: `${serverRef.serverBaseUrl}/source-map`,
},
}),
sendFromTargetToDebugger(device, debugger_, 'page1', {
method: 'Debugger.aSubsequentEvent',
}),
]);
expect(debugger_.handle).toHaveBeenNthCalledWith(1, {
method: 'Debugger.scriptParsed',
params: {
sourceMapURL: expect.stringMatching(/^data:/),
},
});
expect(debugger_.handle).toHaveBeenNthCalledWith(2, {
method: 'Debugger.aSubsequentEvent',
});
} finally {
device.close();
debugger_.close();
}
});

test('handling of failure to fetch source map', async () => {
const {device, debugger_} = await createAndConnectTarget(
serverRef,
Expand Down
52 changes: 30 additions & 22 deletions packages/dev-middleware/src/inspector-proxy/Device.js
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,11 @@ export default class Device {
// Package name of the app.
#app: string;

// Sequences async processing of messages from device to preserve order. Only
// necessary while we need to accommodate #processMessageFromDeviceLegacy's
// async fetch.
#messageFromDeviceQueue: Promise<void> = Promise.resolve();

// Stores socket connection between Inspector Proxy and device.
#deviceSocket: WS;

Expand Down Expand Up @@ -135,20 +140,26 @@ export default class Device {

// $FlowFixMe[incompatible-call]
this.#deviceSocket.on('message', (message: string) => {
const parsedMessage = JSON.parse(message);
if (parsedMessage.event === 'getPages') {
// There's a 'getPages' message every second, so only show them if they change
if (message !== this.#lastGetPagesMessage) {
debug(
'(Debugger) (Proxy) <- (Device), getPages ping has changed: ' +
message,
);
this.#lastGetPagesMessage = message;
}
} else {
debug('(Debugger) (Proxy) <- (Device): ' + message);
}
this.#handleMessageFromDevice(parsedMessage);
this.#messageFromDeviceQueue = this.#messageFromDeviceQueue.then(
async () => {
const parsedMessage = JSON.parse(message);
if (parsedMessage.event === 'getPages') {
// There's a 'getPages' message every second, so only show them if they change
if (message !== this.#lastGetPagesMessage) {
debug(
'(Debugger) (Proxy) <- (Device), getPages ping has changed: ' +
message,
);
this.#lastGetPagesMessage = message;
}
} else {
debug('(Debugger) (Proxy) <- (Device): ' + message);
}
if (parsedMessage.event === 'wrappedEvent') {
}
await this.#handleMessageFromDevice(parsedMessage);
},
);
});
// Sends 'getPages' request to device every PAGES_POLLING_INTERVAL milliseconds.
this.#pagesPollingIntervalId = setInterval(
Expand Down Expand Up @@ -395,7 +406,7 @@ export default class Device {
// In the future more logic will be added to this method for modifying
// some of the messages (like updating messages with source maps and file
// locations).
#handleMessageFromDevice(message: MessageFromDevice) {
async #handleMessageFromDevice(message: MessageFromDevice) {
if (message.event === 'getPages') {
this.#pages = new Map(
message.payload.map(({capabilities, ...page}) => [
Expand Down Expand Up @@ -498,16 +509,13 @@ export default class Device {
return;
}

// Wrapping just to make flow happy :)
// $FlowFixMe[unused-promise]
this.#processMessageFromDeviceLegacy(
await this.#processMessageFromDeviceLegacy(
parsedPayload,
debuggerConnection,
pageId,
).then(() => {
const messageToSend = JSON.stringify(parsedPayload);
debuggerSocket.send(messageToSend);
});
);
const messageToSend = JSON.stringify(parsedPayload);
debuggerSocket.send(messageToSend);
} else {
debuggerSocket.send(message.payload.wrappedEvent);
}
Expand Down