typescript-definitions
typescript-definitions copied to clipboard
IncomingMessage should implement ReadableStream
(Feel free to redirect me if this bug should be reported elsewhere.)
The definition of IncomingMessage (generated from https://github.com/electron/electron/releases/download/v9.1.0/electron-api.json) fails to reflect the documentation’s guarantee that “IncomingMessage implements the Readable Stream interface”:
class IncomingMessage extends NodeEventEmitter {
// Docs: http://electronjs.org/docs/api/incoming-message
/**
* Emitted when a request has been canceled during an ongoing HTTP transaction.
*/
on(event: 'aborted', listener: Function): this;
// …
// more events
// …
removeListener(event: 'error', listener: Function): this;
headers: Record<string, string[]>;
httpVersion: string;
httpVersionMajor: number;
httpVersionMinor: number;
statusCode: number;
statusMessage: string;
}
So working code like this fails to type check:
import { app, net } from "electron";
import getStream from "get-stream";
app.on("ready", () => {
const request = net.request({url: "https://example.com"});
request.on("response", async response => {
if (true) {
// error TS2345: Argument of type 'IncomingMessage' is not assignable to parameter of type 'Stream'.
console.log(await getStream(response));
} else {
// error TS2495: Type 'IncomingMessage' is not an array type or a string type.
for await (const chunk of response) {
console.log(chunk.toString());
}
}
});
request.end();
});
Refs: https://github.com/electron/electron/issues/22730
Still an issue in Electron 21.1.0, 22.0.0-alpha.3, and 23.0.0-nightly.20221007.
The confusing part is that the docs stands that "IncomingMessage implements the Readable Stream...". So we can expect that the stream is usable like any other ones.