vite-plugin-react-server
Version:
Vite plugin for React Server Components (RSC)
86 lines (83 loc) • 9.51 kB
JavaScript
/**
* vite-plugin-react-server
* Copyright (c) Nico Brinkkemper
* MIT License
*/
import { Writable } from 'node:stream';
class MessagePortWritable extends Writable {
fromWorker;
toWorker;
isBackpressured = false;
closeHandler = null;
messageHandler = null;
constructor(fromWorker, toWorker) {
super({
objectMode: false,
// We're dealing with raw data chunks
highWaterMark: 16 * 1024
// 16KB buffer
});
this.fromWorker = fromWorker;
this.toWorker = toWorker;
this.setupMessageListener();
}
setupMessageListener() {
this.closeHandler = () => {
this.destroy();
};
this.fromWorker.on("close", this.closeHandler);
if (this.toWorker) {
this.messageHandler = (message) => {
if (message.type === "DRAIN") {
this.isBackpressured = true;
} else if (message.type === "RESUME") {
this.isBackpressured = false;
}
};
this.toWorker.on("message", this.messageHandler);
}
}
removeListeners() {
if (this.closeHandler) {
this.fromWorker.removeListener("close", this.closeHandler);
this.closeHandler = null;
}
if (this.messageHandler && this.toWorker) {
this.toWorker.removeListener("message", this.messageHandler);
this.messageHandler = null;
}
}
_write(chunk, _encoding, callback) {
try {
if (this.isBackpressured) {
return;
}
if (chunk && typeof chunk === "object" && chunk.type === "error") {
callback(new Error("Error sent through data stream - this should be handled by control port"));
return;
}
this.fromWorker.postMessage(chunk);
callback();
} catch (error) {
callback(error);
}
}
_final(callback) {
try {
this.fromWorker.postMessage(null);
callback();
process.nextTick(() => {
this.removeListeners();
this.emit("finish");
});
} catch (error) {
callback(error);
}
}
_destroy(error, callback) {
this.removeListeners();
callback(error);
}
}
export { MessagePortWritable };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVzc2FnZVBvcnRXcml0YWJsZS5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGx1Z2luL3N0cmVhbS9NZXNzYWdlUG9ydFdyaXRhYmxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdyaXRhYmxlIH0gZnJvbSBcIm5vZGU6c3RyZWFtXCI7XG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2VQb3J0IH0gZnJvbSBcIm5vZGU6d29ya2VyX3RocmVhZHNcIjtcblxuLyoqXG4gKiBBIFdyaXRhYmxlIHN0cmVhbSB0aGF0IHdyYXBzIGEgTWVzc2FnZVBvcnQgZm9yIHNlbmRpbmcgZGF0YSB0byB0aGUgbWFpbiB0aHJlYWRcbiAqIFxuICogVGhpcyBwcm92aWRlcyBhIHByb3BlciBOb2RlLmpzIHN0cmVhbSBpbnRlcmZhY2UgZm9yIGRhdGEgZ29pbmcgdG8gdGhlIG1haW4gdGhyZWFkLFxuICogd2l0aCBwcm9wZXIgYmFja3ByZXNzdXJlIGhhbmRsaW5nIHRocm91Z2ggZHJhaW4gZXZlbnRzLlxuICovXG5leHBvcnQgY2xhc3MgTWVzc2FnZVBvcnRXcml0YWJsZSBleHRlbmRzIFdyaXRhYmxlIHtcbiAgcHJpdmF0ZSBmcm9tV29ya2VyOiBNZXNzYWdlUG9ydDtcbiAgcHJpdmF0ZSB0b1dvcmtlcj86IE1lc3NhZ2VQb3J0O1xuICBwcml2YXRlIGlzQmFja3ByZXNzdXJlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGNsb3NlSGFuZGxlcjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbWVzc2FnZUhhbmRsZXI6ICgobWVzc2FnZTogYW55KSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGZyb21Xb3JrZXI6IE1lc3NhZ2VQb3J0LCB0b1dvcmtlcj86IE1lc3NhZ2VQb3J0KSB7XG4gICAgc3VwZXIoe1xuICAgICAgb2JqZWN0TW9kZTogZmFsc2UsIC8vIFdlJ3JlIGRlYWxpbmcgd2l0aCByYXcgZGF0YSBjaHVua3NcbiAgICAgIGhpZ2hXYXRlck1hcms6IDE2ICogMTAyNCwgLy8gMTZLQiBidWZmZXJcbiAgICB9KTtcbiAgICBcbiAgICB0aGlzLmZyb21Xb3JrZXIgPSBmcm9tV29ya2VyO1xuICAgIHRoaXMudG9Xb3JrZXIgPSB0b1dvcmtlcjtcbiAgICB0aGlzLnNldHVwTWVzc2FnZUxpc3RlbmVyKCk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwTWVzc2FnZUxpc3RlbmVyKCkge1xuICAgIHRoaXMuY2xvc2VIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgfTtcbiAgICB0aGlzLmZyb21Xb3JrZXIub24oJ2Nsb3NlJywgdGhpcy5jbG9zZUhhbmRsZXIpO1xuXG4gICAgLy8gTGlzdGVuIGZvciBiYWNrcHJlc3N1cmUgc2lnbmFscyBvbiB0aGUgY29udHJvbCBwb3J0XG4gICAgaWYgKHRoaXMudG9Xb3JrZXIpIHtcbiAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXIgPSAobWVzc2FnZTogYW55KSA9PiB7XG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgPT09ICdEUkFJTicpIHtcbiAgICAgICAgICB0aGlzLmlzQmFja3ByZXNzdXJlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSAnUkVTVU1FJykge1xuICAgICAgICAgIHRoaXMuaXNCYWNrcHJlc3N1cmVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB0aGlzLnRvV29ya2VyLm9uKCdtZXNzYWdlJywgdGhpcy5tZXNzYWdlSGFuZGxlcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVMaXN0ZW5lcnMoKSB7XG4gICAgaWYgKHRoaXMuY2xvc2VIYW5kbGVyKSB7XG4gICAgICB0aGlzLmZyb21Xb3JrZXIucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgdGhpcy5jbG9zZUhhbmRsZXIpO1xuICAgICAgdGhpcy5jbG9zZUhhbmRsZXIgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5tZXNzYWdlSGFuZGxlciAmJiB0aGlzLnRvV29ya2VyKSB7XG4gICAgICB0aGlzLnRvV29ya2VyLnJlbW92ZUxpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5tZXNzYWdlSGFuZGxlcik7XG4gICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBfd3JpdGUoY2h1bms6IGFueSwgX2VuY29kaW5nOiBCdWZmZXJFbmNvZGluZywgY2FsbGJhY2s6IChlcnJvcj86IEVycm9yIHwgbnVsbCkgPT4gdm9pZCkge1xuICAgIHRyeSB7XG4gICAgICAvLyBDaGVjayBpZiB3ZSdyZSBiYWNrcHJlc3N1cmVkIC0gaWYgc28sIGRvbid0IHNlbmQgZGF0YVxuICAgICAgaWYgKHRoaXMuaXNCYWNrcHJlc3N1cmVkKSB7XG4gICAgICAgIC8vIFNpZ25hbCBiYWNrcHJlc3N1cmUgdG8gUmVhY3QgYnkgbm90IGNhbGxpbmcgY2FsbGJhY2sgaW1tZWRpYXRlbHlcbiAgICAgICAgLy8gUmVhY3Qgd2lsbCB3YWl0IGFuZCByZXRyeSB3aGVuIHRoZSBzdHJlYW0gaXMgcmVhZHlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDaGVjayBpZiB0aGUgY2h1bmsgY29udGFpbnMgYW4gZXJyb3IgLSBpZiBzbywgZG9uJ3Qgc2VuZCBpdCB0aHJvdWdoIHRoZSBkYXRhIHN0cmVhbVxuICAgICAgLy8gRXJyb3JzIHNob3VsZCBiZSBoYW5kbGVkIHRocm91Z2ggdGhlIGNvbnRyb2wgcG9ydCwgbm90IHRoZSBkYXRhIHN0cmVhbVxuICAgICAgaWYgKGNodW5rICYmIHR5cGVvZiBjaHVuayA9PT0gJ29iamVjdCcgJiYgY2h1bmsudHlwZSA9PT0gJ2Vycm9yJykge1xuICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoJ0Vycm9yIHNlbnQgdGhyb3VnaCBkYXRhIHN0cmVhbSAtIHRoaXMgc2hvdWxkIGJlIGhhbmRsZWQgYnkgY29udHJvbCBwb3J0JykpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFNlbmQgdGhlIGNodW5rIHRocm91Z2ggdGhlIE1lc3NhZ2VQb3J0XG4gICAgICB0aGlzLmZyb21Xb3JrZXIucG9zdE1lc3NhZ2UoY2h1bmspO1xuICAgICAgXG4gICAgICAvLyBTaWduYWwgdGhhdCB0aGUgd3JpdGUgY29tcGxldGVkIHN1Y2Nlc3NmdWxseVxuICAgICAgY2FsbGJhY2soKTtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjYWxsYmFjayhlcnJvciBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgX2ZpbmFsKGNhbGxiYWNrOiAoZXJyb3I/OiBFcnJvciB8IG51bGwpID0+IHZvaWQpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5mcm9tV29ya2VyLnBvc3RNZXNzYWdlKG51bGwpOyAvLyBFbmQtb2Ytc3RyZWFtIHNpZ25hbFxuICAgICAgY2FsbGJhY2soKTtcbiAgICAgIFxuICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXJzKCk7XG4gICAgICAgIHRoaXMuZW1pdCgnZmluaXNoJyk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY2FsbGJhY2soZXJyb3IgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIF9kZXN0cm95KGVycm9yOiBFcnJvciB8IG51bGwsIGNhbGxiYWNrOiAoZXJyb3I/OiBFcnJvciB8IG51bGwpID0+IHZvaWQpIHtcbiAgICB0aGlzLnJlbW92ZUxpc3RlbmVycygpO1xuICAgIGNhbGxiYWNrKGVycm9yKTtcbiAgfVxuXG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQVNPLE1BQU0sNEJBQTRCLFFBQVMsQ0FBQTtBQUFBLEVBQ3hDLFVBQUE7QUFBQSxFQUNBLFFBQUE7QUFBQSxFQUNBLGVBQTJCLEdBQUEsS0FBQTtBQUFBLEVBQzNCLFlBQW9DLEdBQUEsSUFBQTtB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