aboutsummaryrefslogtreecommitdiff
path: root/src/api/schema.js
diff options
context:
space:
mode:
authorGravatar Jarred SUmner <jarred@jarredsumner.com> 2022-01-01 01:53:50 -0800
committerGravatar Jarred SUmner <jarred@jarredsumner.com> 2022-01-01 01:53:50 -0800
commita17088363f16fc72562994ed01555841c7c1b1ac (patch)
tree27cb1685eb1ce676476797f7076dd46e2bac5d9c /src/api/schema.js
parent83004f0a0a51658a50499256a874558f26e09a24 (diff)
downloadbun-a17088363f16fc72562994ed01555841c7c1b1ac.tar.gz
bun-a17088363f16fc72562994ed01555841c7c1b1ac.tar.zst
bun-a17088363f16fc72562994ed01555841c7c1b1ac.zip
[bun dev] Improve filesystem watcher & HMR reliability (Linux + a little macOS)
Text editors like Replit save through atomic file updates. In an inotify filesystem watcher (Linux), that appears to be a delete followed by moving the file to the directory. Now when known files are moved into a directory, the watcher sends the file change notification to the browser(s). From there, the browser looks at it's files to determine whether or not Additionally, if an existing HMR connection does not know about a file ID passed to it, it asks the browser to reply with the file path and then starts watching that file. This improves HMR reliabiality if Bun had been restarted but the page hadn't been restarted.
Diffstat (limited to 'src/api/schema.js')
-rw-r--r--src/api/schema.js196
1 files changed, 23 insertions, 173 deletions
diff --git a/src/api/schema.js b/src/api/schema.js
index dc89e2b11..8b2043e9c 100644
--- a/src/api/schema.js
+++ b/src/api/schema.js
@@ -2369,12 +2369,16 @@ const WebsocketMessageKind = {
4: 4,
5: 5,
6: 6,
+ 7: 7,
+ 8: 8,
welcome: 1,
file_change_notification: 2,
build_success: 3,
build_fail: 4,
manifest_success: 5,
manifest_fail: 6,
+ resolve_file: 7,
+ file_change_notification_with_hint: 8,
};
const WebsocketMessageKindKeys = {
1: "welcome",
@@ -2383,24 +2387,32 @@ const WebsocketMessageKindKeys = {
4: "build_fail",
5: "manifest_success",
6: "manifest_fail",
+ 7: "resolve_file",
+ 8: "file_change_notification_with_hint",
welcome: "welcome",
file_change_notification: "file_change_notification",
build_success: "build_success",
build_fail: "build_fail",
manifest_success: "manifest_success",
manifest_fail: "manifest_fail",
+ resolve_file: "resolve_file",
+ file_change_notification_with_hint: "file_change_notification_with_hint",
};
const WebsocketCommandKind = {
1: 1,
2: 2,
+ 3: 3,
build: 1,
manifest: 2,
+ build_with_file_path: 3,
};
const WebsocketCommandKindKeys = {
1: "build",
2: "manifest",
+ 3: "build_with_file_path",
build: "build",
manifest: "manifest",
+ build_with_file_path: "build_with_file_path",
};
function decodeWebsocketMessage(bb) {
@@ -2669,121 +2681,15 @@ function encodeWebsocketMessageBuildFailure(message, bb) {
}
}
-function decodeDependencyManifest(bb) {
- var result = {};
-
- result["ids"] = bb.readUint32ByteArray();
- return result;
-}
-
-function encodeDependencyManifest(message, bb) {
- var value = message["ids"];
- if (value != null) {
- bb.writeUint32ByteArray(value);
- } else {
- throw new Error('Missing required field "ids"');
- }
-}
-
-function decodeFileList(bb) {
- var result = {};
-
- var length = bb.readVarUint();
- var values = (result["ptrs"] = Array(length));
- for (var i = 0; i < length; i++) values[i] = decodeStringPointer(bb);
- result["files"] = bb.readString();
- return result;
-}
-
-function encodeFileList(message, bb) {
- var value = message["ptrs"];
- if (value != null) {
- var values = value,
- n = values.length;
- bb.writeVarUint(n);
- for (var i = 0; i < n; i++) {
- value = values[i];
- encodeStringPointer(value, bb);
- }
- } else {
- throw new Error('Missing required field "ptrs"');
- }
-
- var value = message["files"];
- if (value != null) {
- bb.writeString(value);
- } else {
- throw new Error('Missing required field "files"');
- }
-}
-
-function decodeWebsocketMessageResolveIDs(bb) {
- var result = {};
-
- result["id"] = bb.readUint32ByteArray();
- result["list"] = decodeFileList(bb);
- return result;
-}
-
-function encodeWebsocketMessageResolveIDs(message, bb) {
- var value = message["id"];
- if (value != null) {
- bb.writeUint32ByteArray(value);
- } else {
- throw new Error('Missing required field "id"');
- }
-
- var value = message["list"];
- if (value != null) {
- encodeFileList(value, bb);
- } else {
- throw new Error('Missing required field "list"');
- }
-}
-
-function decodeWebsocketCommandResolveIDs(bb) {
- var result = {};
-
- var length = bb.readVarUint();
- var values = (result["ptrs"] = Array(length));
- for (var i = 0; i < length; i++) values[i] = decodeStringPointer(bb);
- result["files"] = bb.readString();
- return result;
-}
-
-function encodeWebsocketCommandResolveIDs(message, bb) {
- var value = message["ptrs"];
- if (value != null) {
- var values = value,
- n = values.length;
- bb.writeVarUint(n);
- for (var i = 0; i < n; i++) {
- value = values[i];
- encodeStringPointer(value, bb);
- }
- } else {
- throw new Error('Missing required field "ptrs"');
- }
-
- var value = message["files"];
- if (value != null) {
- bb.writeString(value);
- } else {
- throw new Error('Missing required field "files"');
- }
-}
-
-function decodeWebsocketMessageManifestSuccess(bb) {
+function decodeWebsocketCommandBuildWithFilePath(bb) {
var result = {};
result["id"] = bb.readUint32();
- result["module_path"] = bb.readString();
- result["loader"] = Loader[bb.readByte()];
- result["manifest"] = decodeDependencyManifest(bb);
+ result["file_path"] = bb.readString();
return result;
}
-function encodeWebsocketMessageManifestSuccess(message, bb) {
+function encodeWebsocketCommandBuildWithFilePath(message, bb) {
var value = message["id"];
if (value != null) {
bb.writeUint32(value);
@@ -2791,76 +2697,28 @@ function encodeWebsocketMessageManifestSuccess(message, bb) {
throw new Error('Missing required field "id"');
}
- var value = message["module_path"];
+ var value = message["file_path"];
if (value != null) {
bb.writeString(value);
} else {
- throw new Error('Missing required field "module_path"');
- }
-
- var value = message["loader"];
- if (value != null) {
- var encoded = Loader[value];
- if (encoded === void 0)
- throw new Error(
- "Invalid value " + JSON.stringify(value) + ' for enum "Loader"'
- );
- bb.writeByte(encoded);
- } else {
- throw new Error('Missing required field "loader"');
- }
-
- var value = message["manifest"];
- if (value != null) {
- encodeDependencyManifest(value, bb);
- } else {
- throw new Error('Missing required field "manifest"');
+ throw new Error('Missing required field "file_path"');
}
}
-function decodeWebsocketMessageManifestFailure(bb) {
+function decodeWebsocketMessageResolveID(bb) {
var result = {};
result["id"] = bb.readUint32();
- result["from_timestamp"] = bb.readUint32();
- result["loader"] = Loader[bb.readByte()];
- result["log"] = decodeLog(bb);
return result;
}
-function encodeWebsocketMessageManifestFailure(message, bb) {
+function encodeWebsocketMessageResolveID(message, bb) {
var value = message["id"];
if (value != null) {
bb.writeUint32(value);
} else {
throw new Error('Missing required field "id"');
}
-
- var value = message["from_timestamp"];
- if (value != null) {
- bb.writeUint32(value);
- } else {
- throw new Error('Missing required field "from_timestamp"');
- }
-
- var value = message["loader"];
- if (value != null) {
- var encoded = Loader[value];
- if (encoded === void 0)
- throw new Error(
- "Invalid value " + JSON.stringify(value) + ' for enum "Loader"'
- );
- bb.writeByte(encoded);
- } else {
- throw new Error('Missing required field "loader"');
- }
-
- var value = message["log"];
- if (value != null) {
- encodeLog(value, bb);
- } else {
- throw new Error('Missing required field "log"');
- }
}
export { Loader };
@@ -2985,15 +2843,7 @@ export { decodeWebsocketMessageBuildSuccess };
export { encodeWebsocketMessageBuildSuccess };
export { decodeWebsocketMessageBuildFailure };
export { encodeWebsocketMessageBuildFailure };
-export { decodeDependencyManifest };
-export { encodeDependencyManifest };
-export { decodeFileList };
-export { encodeFileList };
-export { decodeWebsocketMessageResolveIDs };
-export { encodeWebsocketMessageResolveIDs };
-export { decodeWebsocketCommandResolveIDs };
-export { encodeWebsocketCommandResolveIDs };
-export { decodeWebsocketMessageManifestSuccess };
-export { encodeWebsocketMessageManifestSuccess };
-export { decodeWebsocketMessageManifestFailure };
-export { encodeWebsocketMessageManifestFailure };
+export { decodeWebsocketCommandBuildWithFilePath };
+export { encodeWebsocketCommandBuildWithFilePath };
+export { decodeWebsocketMessageResolveID };
+export { encodeWebsocketMessageResolveID };