diff --git a/rewriter/src/rewrite.rs b/rewriter/src/rewrite.rs index 4de4e69..15af366 100644 --- a/rewriter/src/rewrite.rs +++ b/rewriter/src/rewrite.rs @@ -185,13 +185,13 @@ impl Rewriter { } pub fn rewrite(js: &str, url: Url) -> String { - let source_text = js.to_string(); let allocator = Allocator::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 { - let error = error.with_source_code(source_text.clone()); + let cloned = js.to_string(); + let error = error.with_source_code(cloned); println!("{error:?}"); } @@ -229,38 +229,59 @@ pub fn rewrite(js: &str, url: Url) -> String { 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; for change in ast_pass.jschanges { match &change { JsChange::GenericChange { span, text } => { let len = (span.end - span.start) as usize; - let start = span.start as usize + offset; - let end = span.end as usize + offset; - rewritten.replace_range(start..end, &text); + let start = span.start as usize; + let end = span.end as usize; - offset = (offset as i64 + (text.len() as i64 - len as i64)) as usize; - } - 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, - &source_text[rhsspan.start as usize..rhsspan.end as usize] - ); - rewritten.replace_range(start..end, &text); - - offset += text.len() - len; + buffer.push_str(&js[offset..start]); + buffer.push_str(&text); + offset = end; + + // offset = (offset as i64 + (text.len() as i64 - len as i64)) as usize; } + // 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; } diff --git a/server.js b/server.js index 95fee68..8cfe2e5 100644 --- a/server.js +++ b/server.js @@ -68,6 +68,7 @@ fastify.register(fastifyStatic, { }); fastify.listen({ port: process.env.PORT || 1337, + host: "0.0.0.0" }); const watch = spawn("pnpm", ["rspack", "-w"], { diff --git a/src/shared/rewriters/js.ts b/src/shared/rewriters/js.ts index 3babf29..39719f3 100644 --- a/src/shared/rewriters/js.ts +++ b/src/shared/rewriters/js.ts @@ -1,8 +1,8 @@ -import { parseModule } from "meriyah"; -import { generate } from "astring"; -import { makeTraveler } from "astravel"; +// import { parseModule } from "meriyah"; +// import { generate } from "astring"; +// import { makeTraveler } from "astravel"; 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 diff --git a/src/worker/fetch.ts b/src/worker/fetch.ts index 1bd801c..5c412e7 100644 --- a/src/worker/fetch.ts +++ b/src/worker/fetch.ts @@ -110,9 +110,9 @@ export async function swfetch( } break; case "script": - responseBody = rewriteJs(await response.arrayBuffer(), url); + responseBody = rewriteJs(await response.text(), url); // 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; case "style": responseBody = rewriteCss(await response.text(), url);