From 4d1b7ef1b80de7fbc8b07acf95d80fcb5ebed2da Mon Sep 17 00:00:00 2001 From: velzie Date: Sat, 31 Aug 2024 14:49:08 -0400 Subject: [PATCH] add more flags --- rewriter/Cargo.lock | 21 +++++++++--------- rewriter/src/lib.rs | 7 ++++++ rewriter/src/main.rs | 1 + rewriter/src/rewrite.rs | 18 ++++++++++------ src/client/client.ts | 2 +- src/client/shared/err.ts | 44 ++++++++++++++++++++++++++++++++++++++ src/client/shared/wrap.ts | 37 -------------------------------- src/controller/index.ts | 4 +++- src/shared/rewriters/js.ts | 5 +++++ src/types.d.ts | 3 ++- 10 files changed, 85 insertions(+), 57 deletions(-) create mode 100644 src/client/shared/err.ts diff --git a/rewriter/Cargo.lock b/rewriter/Cargo.lock index 06616ee..a36e41e 100644 --- a/rewriter/Cargo.lock +++ b/rewriter/Cargo.lock @@ -1360,19 +1360,20 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" dependencies = [ "bumpalo", "log", @@ -1385,9 +1386,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1395,9 +1396,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", @@ -1408,9 +1409,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" [[package]] name = "web-sys" diff --git a/rewriter/src/lib.rs b/rewriter/src/lib.rs index 370d32b..7281c23 100644 --- a/rewriter/src/lib.rs +++ b/rewriter/src/lib.rs @@ -37,6 +37,10 @@ fn get_obj(obj: &JsValue, k: &str) -> JsValue { Reflect::get(obj, &k.into()).unwrap() } +fn get_bool(obj: &JsValue, k: &str) -> bool { + Reflect::get(obj, &k.into()).unwrap().as_bool().unwrap() +} + fn get_str(obj: &JsValue, k: &str) -> String { Reflect::get(obj, &k.into()).unwrap().as_string().unwrap() } @@ -44,6 +48,7 @@ fn get_str(obj: &JsValue, k: &str) -> String { fn get_config(scramjet: &Object) -> Config { let codec = &get_obj(scramjet, "codec"); let config = &get_obj(scramjet, "config"); + let flags = &get_obj(config, "flags"); Config { prefix: get_str(config, "prefix"), @@ -53,6 +58,8 @@ fn get_config(scramjet: &Object) -> Config { rewritefn: get_str(config, "rewritefn"), metafn: get_str(config, "metafn"), setrealmfn: get_str(config, "setrealmfn"), + + capture_errors: get_bool(flags, "captureErrors"), } } diff --git a/rewriter/src/main.rs b/rewriter/src/main.rs index 00e41f4..cb86951 100644 --- a/rewriter/src/main.rs +++ b/rewriter/src/main.rs @@ -120,6 +120,7 @@ fn dorewrite(source_text: &str) -> String { rewritefn: "$rewrite".to_string(), metafn: "$meta".to_string(), setrealmfn: "$setrealm".to_string(), + capture_errors: true, }, ) .as_slice(), diff --git a/rewriter/src/rewrite.rs b/rewriter/src/rewrite.rs index a1c7a90..4b492eb 100644 --- a/rewriter/src/rewrite.rs +++ b/rewriter/src/rewrite.rs @@ -43,6 +43,8 @@ pub struct Config { pub setrealmfn: String, pub metafn: String, pub encode: EncodeFn, + + pub capture_errors: bool, } impl Rewriter { @@ -206,13 +208,15 @@ impl<'a> Visit<'a> for Rewriter { fn visit_try_statement(&mut self, it: &oxc_ast::ast::TryStatement<'a>) { // for debugging we need to know what the error was - if let Some(h) = &it.handler { - if let Some(name) = &h.param { - if let Some(name) = name.pattern.get_identifier() { - self.jschanges.push(JsChange::GenericChange { - span: Span::new(h.body.span.start + 1, h.body.span.start + 1), - text: format!("$scramerr({});", name), - }); + if self.config.capture_errors { + if let Some(h) = &it.handler { + if let Some(name) = &h.param { + if let Some(name) = name.pattern.get_identifier() { + self.jschanges.push(JsChange::GenericChange { + span: Span::new(h.body.span.start + 1, h.body.span.start + 1), + text: format!("$scramerr({});", name), + }); + } } } } diff --git a/src/client/client.ts b/src/client/client.ts index 2811e3b..d807f12 100644 --- a/src/client/client.ts +++ b/src/client/client.ts @@ -133,7 +133,7 @@ export class ScramjetClient { for (const module of modules) { if (!module.enabled || module.enabled()) module.default(this, this.global); - else module.disabled(this, this.global); + else if (module.disabled) module.disabled(this, this.global); } } diff --git a/src/client/shared/err.ts b/src/client/shared/err.ts new file mode 100644 index 0000000..2658a48 --- /dev/null +++ b/src/client/shared/err.ts @@ -0,0 +1,44 @@ +import { config } from "../../shared"; +import { ScramjetClient } from "../client"; + +export const enabled = () => config.flags.captureErrors; + +export default function (client: ScramjetClient, self: typeof globalThis) { + function argdbg(arg) { + switch (typeof arg) { + case "string": + if (arg.includes("scramjet") && !arg.includes("\n")) debugger; + break; + case "object": + if (arg instanceof Location) debugger; + if ( + arg && + arg[Symbol.iterator] && + typeof arg[Symbol.iterator] === "function" + ) + for (let ar of arg) argdbg(ar); + break; + } + } + + self.$scramerr = function scramerr(e) { + console.warn("CAUGHT ERROR", e); + }; + + self.$scramdbg = function scramdbg(args, t) { + if (args && typeof args === "object" && args.length > 0) argdbg(args); + argdbg(t); + return t; + }; + + client.Proxy("Promise.prototype.catch", { + apply(ctx) { + ctx.args[0] = new Proxy(ctx.args[0], { + apply(target, thisArg, argArray) { + // console.warn("CAUGHT PROMISE REJECTION", argArray); + Reflect.apply(target, thisArg, argArray); + }, + }); + }, + }); +} diff --git a/src/client/shared/wrap.ts b/src/client/shared/wrap.ts index 8028228..5379ffd 100644 --- a/src/client/shared/wrap.ts +++ b/src/client/shared/wrap.ts @@ -76,41 +76,4 @@ export default function (client: ScramjetClient, self: typeof globalThis) { writable: false, configurable: false, }); - - function argdbg(arg) { - switch (typeof arg) { - case "string": - if (arg.includes("scramjet") && !arg.includes("\n")) debugger; - break; - case "object": - if (arg instanceof Location) debugger; - if ( - arg && - arg[Symbol.iterator] && - typeof arg[Symbol.iterator] === "function" - ) - for (let ar of arg) argdbg(ar); - break; - } - } - self.$scramerr = function scramerr(e) { - console.warn("CAUGHT ERROR", e); - }; - - self.$scramdbg = function scramdbg(args, t) { - if (args && typeof args === "object" && args.length > 0) argdbg(args); - argdbg(t); - return t; - }; - - // client.Proxy("Promise.prototype.catch", { - // apply(ctx) { - // ctx.args[0] = new Proxy(ctx.args[0], { - // apply(target, thisArg, argArray) { - // // console.warn("CAUGHT PROMISE REJECTION", argArray); - // Reflect.apply(target, thisArg, argArray); - // }, - // }); - // }, - // }); } diff --git a/src/controller/index.ts b/src/controller/index.ts index d5bf67f..1a894a0 100644 --- a/src/controller/index.ts +++ b/src/controller/index.ts @@ -10,7 +10,7 @@ export class ScramjetController { codec: Codec; constructor(config: ScramjetConfig) { - const defaultConfig = { + const defaultConfig: Partial = { prefix: "/scramjet/", codec: "plain", wrapfn: "$scramjet$wrap", @@ -27,6 +27,8 @@ export class ScramjetController { codecs: "/scramjet.codecs.js", flags: { serviceworkers: true, + naiiveRewriter: false, + captureErrors: false, }, }; diff --git a/src/shared/rewriters/js.ts b/src/shared/rewriters/js.ts index 0be28da..ac912f5 100644 --- a/src/shared/rewriters/js.ts +++ b/src/shared/rewriters/js.ts @@ -23,6 +23,11 @@ export function rewriteJs(js: string | ArrayBuffer, origin?: URL) { if ("window" in globalThis) origin = origin ?? new URL(decodeUrl(location.href)); + if (self.$scramjet.config.flags.naiiveRewriter) { + const text = typeof js === "string" ? js : new TextDecoder().decode(js); + return rewriteJsNaiive(text, origin); + } + const before = performance.now(); if (typeof js === "string") { js = new TextDecoder().decode( diff --git a/src/types.d.ts b/src/types.d.ts index e13520f..5fcd353 100644 --- a/src/types.d.ts +++ b/src/types.d.ts @@ -21,7 +21,8 @@ import { ScramjetFrame } from "./controller/frame"; type ScramjetFlags = { serviceworkers: boolean; - naiiverewriter: boolean; + naiiveRewriter: boolean; + captureErrors: boolean; }; interface ScramjetConfig {