make rewriter BLAZINGLY FAST 🔥🔥🔥🔥🔥

This commit is contained in:
velzie 2024-07-17 17:46:23 -04:00
parent 76035db4e9
commit 213f7bfa2b
No known key found for this signature in database
GPG key ID: 048413F95F0DDE1F
4 changed files with 55 additions and 33 deletions

View file

@ -185,13 +185,13 @@ impl Rewriter {
} }
pub fn rewrite(js: &str, url: Url) -> String { pub fn rewrite(js: &str, url: Url) -> String {
let source_text = js.to_string();
let allocator = Allocator::default(); let allocator = Allocator::default();
let source_type = SourceType::default(); let source_type = SourceType::default();
let ret = Parser::new(&allocator, &source_text, source_type).parse(); let ret = Parser::new(&allocator, &js, source_type).parse();
for error in ret.errors { for error in ret.errors {
let error = error.with_source_code(source_text.clone()); let cloned = js.to_string();
let error = error.with_source_code(cloned);
println!("{error:?}"); println!("{error:?}");
} }
@ -229,38 +229,59 @@ pub fn rewrite(js: &str, url: Url) -> String {
a.cmp(&b) a.cmp(&b)
}); });
let mut rewritten = source_text.clone(); let original_len = js.len();
let mut difference = 0i32;
for change in &ast_pass.jschanges {
match &change {
JsChange::GenericChange { span, text } => {
difference += text.len() as i32 - (span.end - span.start) as i32;
}
_ => {}
}
}
let mut buffer = String::new();
// pre-allocate the space we need. should make copies faster
let size_estimate = (original_len as i32 + difference) as usize;
buffer.reserve(size_estimate);
let mut offset = 0; let mut offset = 0;
for change in ast_pass.jschanges { for change in ast_pass.jschanges {
match &change { match &change {
JsChange::GenericChange { span, text } => { JsChange::GenericChange { span, text } => {
let len = (span.end - span.start) as usize; let len = (span.end - span.start) as usize;
let start = span.start as usize + offset; let start = span.start as usize;
let end = span.end as usize + offset; let end = span.end as usize;
rewritten.replace_range(start..end, &text);
offset = (offset as i64 + (text.len() as i64 - len as i64)) as usize; buffer.push_str(&js[offset..start]);
} buffer.push_str(&text);
JsChange::Assignment { offset = end;
name,
entirespan, // offset = (offset as i64 + (text.len() as i64 - len as i64)) as usize;
rhsspan,
} => {
let len = (entirespan.end - entirespan.start) as usize;
let start = entirespan.start as usize + offset;
let end = entirespan.end as usize + offset;
let text = format!(
"$set({}, {})",
name,
&source_text[rhsspan.start as usize..rhsspan.end as usize]
);
rewritten.replace_range(start..end, &text);
offset += text.len() - len;
} }
// JsChange::Assignment {
// name,
// entirespan,
// rhsspan,
// } => {
// let len = (entirespan.end - entirespan.start) as usize;
// let start = entirespan.start as usize + offset;
// let end = entirespan.end as usize + offset;
//
// let text = format!(
// "$set({}, {})",
// name,
// &js[rhsspan.start as usize..rhsspan.end as usize]
// );
// rewritten.replace_range(start..end, &text);
//
// offset += text.len() - len;
// }
_ => {} _ => {}
} }
} }
return rewritten; buffer.push_str(&js[offset..]);
return buffer;
} }

View file

@ -68,6 +68,7 @@ fastify.register(fastifyStatic, {
}); });
fastify.listen({ fastify.listen({
port: process.env.PORT || 1337, port: process.env.PORT || 1337,
host: "0.0.0.0"
}); });
const watch = spawn("pnpm", ["rspack", "-w"], { const watch = spawn("pnpm", ["rspack", "-w"], {

View file

@ -1,8 +1,8 @@
import { parseModule } from "meriyah"; // import { parseModule } from "meriyah";
import { generate } from "astring"; // import { generate } from "astring";
import { makeTraveler } from "astravel"; // import { makeTraveler } from "astravel";
import { decodeUrl, encodeUrl } from "./url"; import { decodeUrl, encodeUrl } from "./url";
import * as ESTree from "estree"; // import * as ESTree from "estree";
// i am a cat. i like to be petted. i like to be fed. i like to be // i am a cat. i like to be petted. i like to be fed. i like to be

View file

@ -110,9 +110,9 @@ export async function swfetch(
} }
break; break;
case "script": case "script":
responseBody = rewriteJs(await response.arrayBuffer(), url); responseBody = rewriteJs(await response.text(), url);
// Disable threading for now, it's causing issues. // Disable threading for now, it's causing issues.
// responseBody = await this.threadpool.rewriteJs(responseBody, url.toString()); // responseBody = await this.threadpool.rewriteJs(await responseBody.arrayBuffer(), url.toString());
break; break;
case "style": case "style":
responseBody = rewriteCss(await response.text(), url); responseBody = rewriteCss(await response.text(), url);