Skip to content

Commit 6eb8cff

Browse files
committed
[scramjet/core] remove ipc system, replace with simple setcookies function
1 parent a2ed51e commit 6eb8cff

File tree

7 files changed

+76
-151
lines changed

7 files changed

+76
-151
lines changed

packages/scramjet/packages/controller/src/sw.ts

Lines changed: 49 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -42,49 +42,59 @@ export function shouldRoute(event: FetchEvent): boolean {
4242
}
4343

4444
export async function route(event: FetchEvent): Promise<Response> {
45-
const url = new URL(event.request.url);
46-
const tab = tabs.find((tab) => url.pathname.startsWith(tab.prefix))!;
47-
const client = await clients.get(event.clientId);
45+
try {
46+
const url = new URL(event.request.url);
47+
const tab = tabs.find((tab) => url.pathname.startsWith(tab.prefix))!;
48+
const client = await clients.get(event.clientId);
4849

49-
const bareheaders: BareHeaders = {};
50+
const bareheaders: BareHeaders = {};
5051

51-
// @ts-expect-error for some reason it thinks headers.entries doesn't exist?
52-
for (const [key, value] of event.request.headers.entries()) {
53-
bareheaders[key] = [value];
54-
}
52+
// @ts-expect-error for some reason it thinks headers.entries doesn't exist?
53+
for (const [key, value] of event.request.headers.entries()) {
54+
bareheaders[key] = [value];
55+
}
5556

56-
const response = await tab.rpc.call(
57-
"request",
58-
{
59-
rawUrl: event.request.url,
60-
destination: event.request.destination,
61-
mode: event.request.mode,
62-
referrer: event.request.referrer,
63-
method: event.request.method,
64-
body: event.request.body,
65-
cache: event.request.cache,
66-
forceCrossOriginIsolated: false,
67-
initialHeaders: bareheaders,
68-
rawClientUrl: client ? client.url : undefined,
69-
},
70-
event.request.body instanceof ReadableStream ||
71-
// @ts-expect-error the types for fetchevent are messed up
72-
event.request.body instanceof ArrayBuffer
73-
? [event.request.body]
74-
: undefined
75-
);
57+
const response = await tab.rpc.call(
58+
"request",
59+
{
60+
rawUrl: event.request.url,
61+
destination: event.request.destination,
62+
mode: event.request.mode,
63+
referrer: event.request.referrer,
64+
method: event.request.method,
65+
body: event.request.body,
66+
cache: event.request.cache,
67+
forceCrossOriginIsolated: false,
68+
initialHeaders: bareheaders,
69+
rawClientUrl: client ? client.url : undefined,
70+
},
71+
event.request.body instanceof ReadableStream ||
72+
// @ts-expect-error the types for fetchevent are messed up
73+
event.request.body instanceof ArrayBuffer
74+
? [event.request.body]
75+
: undefined
76+
);
7677

77-
const realHeaders = new Headers();
78-
for (const [key, values] of Object.entries(response.headers)) {
79-
let val = typeof values === "string" ? values : (values?.[0] ?? undefined);
80-
if (val !== undefined) {
81-
realHeaders.set(key, val);
78+
const realHeaders = new Headers();
79+
for (const [key, values] of Object.entries(response.headers)) {
80+
let val =
81+
typeof values === "string" ? values : (values?.[0] ?? undefined);
82+
if (val !== undefined) {
83+
realHeaders.set(key, val);
84+
}
8285
}
83-
}
8486

85-
return new Response(response.body, {
86-
status: response.status,
87-
statusText: response.statusText,
88-
headers: realHeaders,
89-
});
87+
return new Response(response.body, {
88+
status: response.status,
89+
statusText: response.statusText,
90+
headers: realHeaders,
91+
});
92+
} catch (e) {
93+
return new Response(
94+
"Internal Service Worker Error: " + (e as Error).message,
95+
{
96+
status: 500,
97+
}
98+
);
99+
}
90100
}

packages/scramjet/packages/core/src/client/client.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,13 @@ import { createWrapFn } from "@client/shared/wrap";
77
import { NavigateEvent } from "@client/events";
88
import { rewriteUrl, unrewriteUrl, type URLMeta } from "@rewriters/url";
99
import {
10-
bareTransport,
11-
ClientRPCDefs,
1210
config,
1311
flagEnabled,
1412
ScramjetContext,
1513
ScramjetInterface,
1614
} from "@/shared";
1715
import { CookieJar } from "@/shared/cookie";
18-
import { iswindow } from "./entry";
16+
import { iswindow, ScramjetClientInit } from "./entry";
1917
import { SingletonBox } from "./singletonbox";
2018
import { ScramjetConfig } from "@/types";
2119

@@ -128,10 +126,13 @@ export class ScramjetClient {
128126

129127
box: SingletonBox;
130128

129+
context: ScramjetContext;
130+
131+
sendSetCookie: (url: URL, cookie: string) => Promise<void>;
132+
131133
constructor(
132134
public global: typeof globalThis,
133-
public context: ScramjetContext,
134-
public rpc: ClientRPCDefs
135+
public init: ScramjetClientInit
135136
) {
136137
if (SCRAMJETCLIENT in global) {
137138
console.error(
@@ -153,7 +154,9 @@ export class ScramjetClient {
153154

154155
this.box.registerClient(this, global as Self);
155156

156-
this.bare = new BareClient(bareTransport!);
157+
this.context = init.context;
158+
this.bare = new BareClient(init.transport);
159+
this.sendSetCookie = init.sendSetCookie;
157160

158161
this.serviceWorker = this.global.navigator.serviceWorker;
159162

packages/scramjet/packages/core/src/client/dom/cookie.ts

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,13 @@
11
import { ScramjetClient } from "@client/index";
22

33
export default function (client: ScramjetClient, self: typeof window) {
4-
client.rpc.onClientbound("setCookie", ({ cookie, url }) => {
5-
client.context.cookieJar.setCookies([cookie], new URL(url));
6-
return undefined;
7-
});
8-
94
client.Trap("Document.prototype.cookie", {
105
get() {
116
return client.context.cookieJar.getCookies(client.url, true);
127
},
138
set(ctx, value: string) {
14-
client.rpc.sendServerbound("setCookie", {
15-
cookie: value,
16-
url: client.url.href,
17-
});
9+
client.context.cookieJar.setCookies([value], client.url);
10+
client.sendSetCookie(client.url, value);
1811
},
1912
});
2013

packages/scramjet/packages/core/src/client/dom/open.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,7 @@ export default function (client: ScramjetClient) {
1919
if (SCRAMJETCLIENT in realwin) {
2020
return ctx.return(realwin[SCRAMJETCLIENT].global);
2121
} else {
22-
const newclient = new ScramjetClient(
23-
realwin,
24-
client.context,
25-
client.rpc
26-
);
22+
const newclient = new ScramjetClient(realwin, client.init);
2723
// hook the opened window
2824
newclient.hook();
2925

packages/scramjet/packages/core/src/client/entry.ts

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,6 @@
11
// entrypoint for scramjet.client.js
22

3-
import {
4-
ClientRPCDefs,
5-
ScramjetContext,
6-
ScramjetInterface,
7-
setBareTransport,
8-
setConfig,
9-
} from "@/shared/index";
3+
import { ScramjetContext, ScramjetInterface, setConfig } from "@/shared/index";
104
import { SCRAMJETCLIENT } from "@/symbols";
115
import { ScramjetClient } from "@client/index";
126
import { ScramjetContextEvent, UrlChangeEvent } from "@client/events";
@@ -26,21 +20,19 @@ function createFrameId() {
2620
.join("")}`;
2721
}
2822

29-
export type ScramjetClientEntryInit = {
23+
export type ScramjetClientInit = {
3024
context: ScramjetContext;
31-
rpc: ClientRPCDefs;
3225
transport: BareTransport;
33-
cookies: string;
26+
sendSetCookie: (url: URL, cookie: string) => Promise<void>;
3427
};
3528

36-
export function loadAndHook(init: ScramjetClientEntryInit) {
29+
export function loadAndHook(init: ScramjetClientInit) {
3730
setConfig(init.context.config);
38-
setBareTransport(init.transport);
3931

4032
dbg.log("initializing scramjet client");
4133
// if it already exists, that means the handlers have probably already been setup by the parent document
4234
if (!(SCRAMJETCLIENT in <Partial<typeof self>>globalThis)) {
43-
const client = new ScramjetClient(globalThis, init.context, init.rpc);
35+
const client = new ScramjetClient(globalThis, init);
4436

4537
const frame: HTMLIFrameElement =
4638
globalThis.frameElement as HTMLIFrameElement;

packages/scramjet/packages/core/src/fetch/index.ts

Lines changed: 10 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,10 @@ import {
22
BareClient,
33
BareHeaders,
44
BareResponseFetch,
5+
BareTransport,
56
TransferrableResponse,
67
} from "@mercuryworkshop/bare-mux-custom";
78

8-
import { CookieJar } from "@/shared/cookie";
9-
109
import {
1110
rewriteUrl,
1211
unrewriteBlob,
@@ -15,13 +14,7 @@ import {
1514
} from "@rewriters/url";
1615
import { rewriteJs } from "@rewriters/js";
1716
import { ScramjetHeaders } from "@/shared/headers";
18-
import {
19-
Clientbound,
20-
config,
21-
flagEnabled,
22-
ScramjetContext,
23-
Serverbound,
24-
} from "@/shared";
17+
import { config, flagEnabled, ScramjetContext } from "@/shared";
2518
import { rewriteHtml } from "@rewriters/html";
2619
import { rewriteCss } from "@rewriters/css";
2720
import { rewriteWorkers } from "@rewriters/worker";
@@ -58,18 +51,11 @@ export interface ScramjetFetchResponse {
5851
}
5952

6053
export type FetchHandlerInit = {
61-
client: BareClient;
54+
transport: BareTransport;
6255
context: ScramjetContext;
6356
crossOriginIsolated?: boolean;
6457

65-
sendClientbound<K extends keyof Clientbound>(
66-
type: K,
67-
msg: Clientbound[K][0]
68-
): Promise<Clientbound[K][1]>;
69-
onServerbound<K extends keyof Serverbound>(
70-
type: K,
71-
listener: (msg: Serverbound[K][0]) => Promise<Serverbound[K][1]>
72-
): void;
58+
sendSetCookie: (url: URL, cookie: string) => Promise<void>;
7359
fetchDataUrl(dataUrl: string): Promise<BareResponseFetch>;
7460
fetchBlobUrl(blobUrl: string): Promise<BareResponseFetch>;
7561
};
@@ -79,29 +65,18 @@ export class ScramjetFetchHandler extends EventTarget {
7965
public crossOriginIsolated: boolean = false;
8066
public context: ScramjetContext;
8167

82-
public sendClientbound: <K extends keyof Clientbound>(
83-
type: K,
84-
msg: Clientbound[K][0]
85-
) => Promise<Clientbound[K][1]>;
86-
8768
public fetchDataUrl: (dataUrl: string) => Promise<BareResponseFetch>;
8869
public fetchBlobUrl: (blobUrl: string) => Promise<BareResponseFetch>;
70+
public sendSetCookie: (url: URL, cookie: string) => Promise<void>;
8971

9072
constructor(init: FetchHandlerInit) {
9173
super();
92-
this.client = init.client;
74+
this.client = new BareClient(init.transport);
9375
this.context = init.context;
9476
this.crossOriginIsolated = init.crossOriginIsolated || false;
95-
this.sendClientbound = init.sendClientbound;
77+
this.sendSetCookie = init.sendSetCookie;
9678
this.fetchDataUrl = init.fetchDataUrl;
9779
this.fetchBlobUrl = init.fetchBlobUrl;
98-
99-
init.onServerbound("setCookie", ({ cookie, url }) => {
100-
console.log("recv'd cookies");
101-
this.context.cookieJar.setCookies([cookie], new URL(url));
102-
103-
return undefined;
104-
});
10580
}
10681

10782
async handleFetch(
@@ -469,19 +444,15 @@ async function handleCookies(
469444
const maybeHeaders = responseHeaders["set-cookie"] || [];
470445
if (Array.isArray(maybeHeaders)) {
471446
for (const cookie of maybeHeaders) {
472-
const promise = handler.sendClientbound("setCookie", {
473-
cookie,
474-
url: parsed.url.href,
475-
});
447+
const promise = handler.sendSetCookie(parsed.url, cookie);
476448

449+
// we want the client to have the cookies before fetch returns
450+
// for navigations though, there's no race since we send the entire cookie dump in the same request
477451
if (
478452
request.destination !== "document" &&
479453
request.destination !== "iframe"
480454
) {
481455
await promise;
482-
483-
// TODO: fix with proper callback from client
484-
await new Promise((resolve) => setTimeout(resolve, 100));
485456
}
486457
}
487458
}

packages/scramjet/packages/core/src/shared/index.ts

Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -31,35 +31,6 @@ export function setConfig(newConfig: ScramjetConfig) {
3131
config = newConfig;
3232
}
3333

34-
export let bareTransport: BareTransport | null = null;
35-
export function setBareTransport(transport: BareTransport) {
36-
bareTransport = transport;
37-
}
38-
39-
export type Clientbound = {
40-
setCookie: [
41-
{
42-
cookie: string;
43-
url: string;
44-
},
45-
];
46-
};
47-
48-
export type Serverbound = {
49-
setCookie: [
50-
{
51-
cookie: string;
52-
url: string;
53-
},
54-
];
55-
blobData: [
56-
{
57-
id: string;
58-
data: Blob;
59-
},
60-
];
61-
};
62-
6334
export type ScramjetInterface = {
6435
codecEncode: (input: string) => string;
6536
codecDecode: (input: string) => string;
@@ -77,17 +48,6 @@ export type ScramjetInterface = {
7748
): string;
7849
};
7950

80-
export type ClientRPCDefs = {
81-
sendServerbound?<K extends keyof Serverbound>(
82-
type: K,
83-
msg: Serverbound[K][0]
84-
): Promise<Serverbound[K][1]>;
85-
onClientbound?<K extends keyof Clientbound>(
86-
type: K,
87-
listener: (msg: Clientbound[K][0]) => Promise<Clientbound[K][1]>
88-
): void;
89-
};
90-
9151
export type ScramjetContext = {
9252
config: ScramjetConfig;
9353
prefix: URL;

0 commit comments

Comments
 (0)