mirror of
https://github.com/MercuryWorkshop/scramjet.git
synced 2025-05-16 23:50:02 -04:00
Merge branch 'main' of https://github.com/MercuryWorkshop/scramjet
This commit is contained in:
commit
41288749e4
11 changed files with 31 additions and 24 deletions
|
@ -18,6 +18,7 @@
|
||||||
"no-undef": "off",
|
"no-undef": "off",
|
||||||
"@typescript-eslint/no-explicit-any": "off",
|
"@typescript-eslint/no-explicit-any": "off",
|
||||||
"@typescript-eslint/ban-ts-comment": "off",
|
"@typescript-eslint/ban-ts-comment": "off",
|
||||||
|
"@typescript-eslint/ban-types": "off",
|
||||||
"@typescript-eslint/no-unused-vars": [
|
"@typescript-eslint/no-unused-vars": [
|
||||||
"warn",
|
"warn",
|
||||||
{
|
{
|
||||||
|
|
|
@ -18,7 +18,10 @@
|
||||||
"lint": "eslint ./src/ --ext .ts",
|
"lint": "eslint ./src/ --ext .ts",
|
||||||
"lint:fix": "eslint ./src/ --ext .ts --fix"
|
"lint:fix": "eslint ./src/ --ext .ts --fix"
|
||||||
},
|
},
|
||||||
"files": ["dist", "lib"],
|
"files": [
|
||||||
|
"dist",
|
||||||
|
"lib"
|
||||||
|
],
|
||||||
"keywords": [],
|
"keywords": [],
|
||||||
"author": "",
|
"author": "",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
|
|
|
@ -108,7 +108,7 @@ export class ScramjetClient {
|
||||||
resolve(data.port);
|
resolve(data.port);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}),
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -239,7 +239,7 @@ export class ScramjetClient {
|
||||||
h.construct = function (
|
h.construct = function (
|
||||||
constructor: any,
|
constructor: any,
|
||||||
argArray: any[],
|
argArray: any[],
|
||||||
newTarget: AnyFunction,
|
newTarget: AnyFunction
|
||||||
) {
|
) {
|
||||||
let returnValue: any = undefined;
|
let returnValue: any = undefined;
|
||||||
let earlyreturn = false;
|
let earlyreturn = false;
|
||||||
|
@ -354,7 +354,7 @@ export class ScramjetClient {
|
||||||
RawTrap<T>(
|
RawTrap<T>(
|
||||||
target: any,
|
target: any,
|
||||||
prop: string,
|
prop: string,
|
||||||
descriptor: Trap<T>,
|
descriptor: Trap<T>
|
||||||
): PropertyDescriptor {
|
): PropertyDescriptor {
|
||||||
if (!target) return;
|
if (!target) return;
|
||||||
if (!prop) return;
|
if (!prop) return;
|
||||||
|
|
|
@ -52,7 +52,7 @@ export default function (client: ScramjetClient, self: typeof window) {
|
||||||
for (const element of attrObject[attr]) {
|
for (const element of attrObject[attr]) {
|
||||||
const descriptor = nativeGetOwnPropertyDescriptor(
|
const descriptor = nativeGetOwnPropertyDescriptor(
|
||||||
element.prototype,
|
element.prototype,
|
||||||
attr,
|
attr
|
||||||
);
|
);
|
||||||
Object.defineProperty(element.prototype, attr, {
|
Object.defineProperty(element.prototype, attr, {
|
||||||
get() {
|
get() {
|
||||||
|
@ -80,7 +80,7 @@ export default function (client: ScramjetClient, self: typeof window) {
|
||||||
base: new URL(client.url.origin),
|
base: new URL(client.url.origin),
|
||||||
origin: new URL(client.url.origin),
|
origin: new URL(client.url.origin),
|
||||||
} as URLMeta,
|
} as URLMeta,
|
||||||
true,
|
true
|
||||||
);
|
);
|
||||||
} else if (["srcset", "imagesrcset"].includes(attr)) {
|
} else if (["srcset", "imagesrcset"].includes(attr)) {
|
||||||
value = rewriteSrcset(value, client.meta);
|
value = rewriteSrcset(value, client.meta);
|
||||||
|
@ -171,9 +171,10 @@ export default function (client: ScramjetClient, self: typeof window) {
|
||||||
// since the prototype chain is fucked
|
// since the prototype chain is fucked
|
||||||
|
|
||||||
const style = ctx.get() as CSSStyleDeclaration;
|
const style = ctx.get() as CSSStyleDeclaration;
|
||||||
|
|
||||||
return new Proxy(style, {
|
return new Proxy(style, {
|
||||||
get(t, p) {
|
get(t, p) {
|
||||||
let v = Reflect.get(t, p);
|
const v = Reflect.get(t, p);
|
||||||
if (typeof v === "function") {
|
if (typeof v === "function") {
|
||||||
return new Proxy(v, {
|
return new Proxy(v, {
|
||||||
apply(target, thisArg, argArray) {
|
apply(target, thisArg, argArray) {
|
||||||
|
@ -189,6 +190,7 @@ export default function (client: ScramjetClient, self: typeof window) {
|
||||||
if (v == "" || typeof v !== "string") {
|
if (v == "" || typeof v !== "string") {
|
||||||
return Reflect.set(t, p, v);
|
return Reflect.set(t, p, v);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Reflect.set(t, p, rewriteCss(v, client.meta));
|
return Reflect.set(t, p, rewriteCss(v, client.meta));
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -216,8 +218,8 @@ export default function (client: ScramjetClient, self: typeof window) {
|
||||||
return atob(
|
return atob(
|
||||||
client.natives["Element.prototype.getAttribute"].call(
|
client.natives["Element.prototype.getAttribute"].call(
|
||||||
ctx.this,
|
ctx.this,
|
||||||
"data-scramjet-script-source-src",
|
"data-scramjet-script-source-src"
|
||||||
),
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (ctx.this instanceof self.HTMLStyleElement) {
|
if (ctx.this instanceof self.HTMLStyleElement) {
|
||||||
|
@ -307,7 +309,7 @@ export default function (client: ScramjetClient, self: typeof window) {
|
||||||
ctx.args[0],
|
ctx.args[0],
|
||||||
client.cookieStore,
|
client.cookieStore,
|
||||||
client.meta,
|
client.meta,
|
||||||
false,
|
false
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -319,7 +321,7 @@ export default function (client: ScramjetClient, self: typeof window) {
|
||||||
ctx.args[0],
|
ctx.args[0],
|
||||||
client.cookieStore,
|
client.cookieStore,
|
||||||
client.meta,
|
client.meta,
|
||||||
true,
|
true
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -330,7 +332,7 @@ export default function (client: ScramjetClient, self: typeof window) {
|
||||||
ctx.args[0],
|
ctx.args[0],
|
||||||
client.cookieStore,
|
client.cookieStore,
|
||||||
client.meta,
|
client.meta,
|
||||||
false,
|
false
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
@ -14,12 +14,6 @@ export function disabled(client: ScramjetClient, self: Self) {
|
||||||
export default function (client: ScramjetClient, self: Self) {
|
export default function (client: ScramjetClient, self: Self) {
|
||||||
let registration;
|
let registration;
|
||||||
|
|
||||||
client.Proxy("Worklet.prototype.addModule", {
|
|
||||||
apply(ctx) {
|
|
||||||
ctx.args[0] = encodeUrl(ctx.args[0], client.meta);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
client.Proxy("EventTarget.prototype.addEventListener", {
|
client.Proxy("EventTarget.prototype.addEventListener", {
|
||||||
apply(ctx) {
|
apply(ctx) {
|
||||||
if (registration === ctx.this) {
|
if (registration === ctx.this) {
|
||||||
|
|
|
@ -9,7 +9,8 @@ export default function (client: ScramjetClient, self: Self) {
|
||||||
|
|
||||||
client.Trap("IDBDatabase.prototype.name", {
|
client.Trap("IDBDatabase.prototype.name", {
|
||||||
get(ctx) {
|
get(ctx) {
|
||||||
let name = ctx.get() as string;
|
const name = ctx.get() as string;
|
||||||
|
|
||||||
return name.substring(name.indexOf("@") + 1);
|
return name.substring(name.indexOf("@") + 1);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
@ -47,7 +47,7 @@ export default function (client: ScramjetClient, self: Self) {
|
||||||
body: ctx.args[0],
|
body: ctx.args[0],
|
||||||
});
|
});
|
||||||
|
|
||||||
let now = performance.now();
|
const now = performance.now();
|
||||||
while (view.getUint8(0) === 0) {
|
while (view.getUint8(0) === 0) {
|
||||||
if (performance.now() - now > 1000) {
|
if (performance.now() - now > 1000) {
|
||||||
throw new Error("xhr timeout");
|
throw new Error("xhr timeout");
|
||||||
|
@ -85,12 +85,14 @@ export default function (client: ScramjetClient, self: Self) {
|
||||||
client.RawTrap(ctx.this, "response", {
|
client.RawTrap(ctx.this, "response", {
|
||||||
get() {
|
get() {
|
||||||
if (ctx.this.responseType === "arraybuffer") return bodyab.buffer;
|
if (ctx.this.responseType === "arraybuffer") return bodyab.buffer;
|
||||||
|
|
||||||
return body;
|
return body;
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
client.RawTrap(ctx.this, "responseXML", {
|
client.RawTrap(ctx.this, "responseXML", {
|
||||||
get() {
|
get() {
|
||||||
const parser = new DOMParser();
|
const parser = new DOMParser();
|
||||||
|
|
||||||
return parser.parseFromString(body, "text/xml");
|
return parser.parseFromString(body, "text/xml");
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -104,6 +106,7 @@ export default function (client: ScramjetClient, self: Self) {
|
||||||
return (header: string) => {
|
return (header: string) => {
|
||||||
const re = new RegExp(`^${header}: (.*)$`, "m");
|
const re = new RegExp(`^${header}: (.*)$`, "m");
|
||||||
const match = re.exec(headers);
|
const match = re.exec(headers);
|
||||||
|
|
||||||
return match ? match[1] : null;
|
return match ? match[1] : null;
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
|
@ -66,6 +66,7 @@ export default function (client: ScramjetClient, self: typeof globalThis) {
|
||||||
if (typeof v === "string" && v.includes("scramjet")) {
|
if (typeof v === "string" && v.includes("scramjet")) {
|
||||||
debugger;
|
debugger;
|
||||||
}
|
}
|
||||||
|
|
||||||
return v;
|
return v;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -219,7 +219,7 @@ function traverseParsedHtml(
|
||||||
) {
|
) {
|
||||||
let js = node.children[0].data;
|
let js = node.children[0].data;
|
||||||
// node.attribs[`data-scramjet-script-source-src`] = btoa(js);
|
// node.attribs[`data-scramjet-script-source-src`] = btoa(js);
|
||||||
node.attribs[`data-scramjet-script-source-src`] = bytesToBase64(
|
node.attribs["data-scramjet-script-source-src"] = bytesToBase64(
|
||||||
new TextEncoder().encode(js)
|
new TextEncoder().encode(js)
|
||||||
);
|
);
|
||||||
const htmlcomment = /<!--[\s\S]*?-->/g;
|
const htmlcomment = /<!--[\s\S]*?-->/g;
|
||||||
|
@ -272,6 +272,7 @@ export function rewriteSrcset(srcset: string, meta: URLMeta) {
|
||||||
|
|
||||||
function base64ToBytes(base64) {
|
function base64ToBytes(base64) {
|
||||||
const binString = atob(base64);
|
const binString = atob(base64);
|
||||||
|
|
||||||
return Uint8Array.from(binString, (m) => m.codePointAt(0));
|
return Uint8Array.from(binString, (m) => m.codePointAt(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -279,5 +280,6 @@ function bytesToBase64(bytes: Uint8Array) {
|
||||||
const binString = Array.from(bytes, (byte) =>
|
const binString = Array.from(bytes, (byte) =>
|
||||||
String.fromCodePoint(byte)
|
String.fromCodePoint(byte)
|
||||||
).join("");
|
).join("");
|
||||||
|
|
||||||
return btoa(binString);
|
return btoa(binString);
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,7 +45,7 @@ export function decodeUrl(url: string | URL) {
|
||||||
|
|
||||||
if (
|
if (
|
||||||
tryCanParseURL(url)?.pathname.startsWith(
|
tryCanParseURL(url)?.pathname.startsWith(
|
||||||
self.$scramjet.config.prefix + "worker",
|
self.$scramjet.config.prefix + "worker"
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
return new URL(new URL(url).searchParams.get("origin")).href;
|
return new URL(new URL(url).searchParams.get("origin")).href;
|
||||||
|
@ -55,7 +55,7 @@ export function decodeUrl(url: string | URL) {
|
||||||
return url;
|
return url;
|
||||||
} else if (tryCanParseURL(url)) {
|
} else if (tryCanParseURL(url)) {
|
||||||
return self.$scramjet.codec.decode(
|
return self.$scramjet.codec.decode(
|
||||||
url.slice((location.origin + self.$scramjet.config.prefix).length),
|
url.slice((location.origin + self.$scramjet.config.prefix).length)
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return url;
|
return url;
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>Scramjet</title>
|
<title>Scramjet</title>
|
||||||
<link rel="icon" href="favicon.webp">
|
<link rel="icon" href="favicon.webp" />
|
||||||
<link rel="prefetch" href="/scram/scramjet.worker.js" />
|
<link rel="prefetch" href="/scram/scramjet.worker.js" />
|
||||||
<link rel="prefetch" href="/scram/scramjet.shared.js" />
|
<link rel="prefetch" href="/scram/scramjet.shared.js" />
|
||||||
<link
|
<link
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue