mirror of
https://github.com/MercuryWorkshop/scramjet.git
synced 2025-05-13 06:20:02 -04:00
make rewriter BLAZINGLY FAST 🔥🔥🔥🔥🔥
This commit is contained in:
parent
76035db4e9
commit
213f7bfa2b
4 changed files with 55 additions and 33 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"], {
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue