release: WRNexusJS 0.2.29
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@wrnexus/dev-server",
|
||||
"version": "0.2.28",
|
||||
"version": "0.2.29",
|
||||
"type": "module",
|
||||
"main": "src/index.ts",
|
||||
"exports": {
|
||||
|
||||
@@ -35,6 +35,7 @@ export interface GatewayApp {
|
||||
dir: string;
|
||||
/** Host names routed to this app (e.g. ["localhost", "web.localhost"]). */
|
||||
domains: string[];
|
||||
publicOrigin?: string;
|
||||
/** Optional fixed internal port; otherwise assigned from the gateway port. */
|
||||
port?: number;
|
||||
/** Access control enforced at the edge for this app. */
|
||||
@@ -59,6 +60,7 @@ export interface GatewayOptions {
|
||||
port?: number;
|
||||
hostname?: string;
|
||||
mode?: "development" | "production";
|
||||
environment?: string;
|
||||
apps: GatewayApp[];
|
||||
security?: GatewaySecurity;
|
||||
}
|
||||
@@ -79,7 +81,7 @@ interface WsBridge {
|
||||
origin: string;
|
||||
path: string;
|
||||
backend?: WebSocket;
|
||||
queue: (string | ArrayBufferLike | ArrayBufferView)[];
|
||||
queue: Array<string | ArrayBuffer>;
|
||||
}
|
||||
|
||||
/** Decide whether a gateway child should be relaunched after it exits. */
|
||||
@@ -262,6 +264,11 @@ export async function startGateway(opts: GatewayOptions): Promise<RunningGateway
|
||||
const port = opts.port ?? 3000;
|
||||
const mode = opts.mode ?? "development";
|
||||
const hostname = opts.hostname ?? defaultGatewayHostname(mode);
|
||||
const environment = opts.environment ?? (mode === "production" ? "production" : "development");
|
||||
|
||||
const workspaceOrigins = Object.fromEntries(
|
||||
opts.apps.map((app) => [app.name, app.publicOrigin ?? `http://${app.domains[0]}:${port}`]),
|
||||
);
|
||||
const displayHost = hostname === "0.0.0.0" || hostname === "::" ? "localhost" : hostname;
|
||||
const serveEntry = fileURLToPath(import.meta.resolve("@wrnexus/dev-server/serve-entry"));
|
||||
|
||||
@@ -281,12 +288,28 @@ export async function startGateway(opts: GatewayOptions): Promise<RunningGateway
|
||||
mode === "production"
|
||||
? spawn(process.execPath, [join(dir, "dist", "server.js")], {
|
||||
stdio: "inherit",
|
||||
env: { ...process.env, PORT: String(appPort) },
|
||||
env: {
|
||||
...process.env,
|
||||
PORT: String(appPort),
|
||||
WRNEXUS_ENV: environment,
|
||||
WRNEXUS_APP_NAME: app.name,
|
||||
WRNEXUS_APP_ORIGIN: app.publicOrigin ?? `http://${app.domains[0]}:${port}`,
|
||||
WRNEXUS_WORKSPACE_ORIGINS: JSON.stringify(workspaceOrigins),
|
||||
},
|
||||
})
|
||||
: spawn(
|
||||
process.execPath,
|
||||
[serveEntry, join(dir, "app"), String(appPort), mode, "127.0.0.1"],
|
||||
{ stdio: "inherit" },
|
||||
{
|
||||
stdio: "inherit",
|
||||
env: {
|
||||
...process.env,
|
||||
WRNEXUS_ENV: environment,
|
||||
WRNEXUS_APP_NAME: app.name,
|
||||
WRNEXUS_APP_ORIGIN: app.publicOrigin ?? `http://${app.domains[0]}:${port}`,
|
||||
WRNEXUS_WORKSPACE_ORIGINS: JSON.stringify(workspaceOrigins),
|
||||
},
|
||||
},
|
||||
);
|
||||
target.child = child;
|
||||
|
||||
@@ -415,14 +438,60 @@ export async function startGateway(opts: GatewayOptions): Promise<RunningGateway
|
||||
for (const m of ws.data.queue) backend.send(m);
|
||||
ws.data.queue = [];
|
||||
});
|
||||
backend.addEventListener("message", (e) => ws.send(e.data as string | ArrayBufferLike));
|
||||
backend.addEventListener("message", async (event) => {
|
||||
const data = event.data;
|
||||
|
||||
if (typeof data === "string") {
|
||||
ws.send(data);
|
||||
return;
|
||||
}
|
||||
|
||||
if (data instanceof Blob) {
|
||||
const buffer = await data.arrayBuffer();
|
||||
ws.send(buffer);
|
||||
return;
|
||||
}
|
||||
|
||||
if (data instanceof ArrayBuffer) {
|
||||
ws.send(data);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ArrayBuffer.isView(data)) {
|
||||
const buffer = data.buffer.slice(
|
||||
data.byteOffset,
|
||||
data.byteOffset + data.byteLength,
|
||||
) as ArrayBuffer;
|
||||
|
||||
ws.send(buffer);
|
||||
}
|
||||
});
|
||||
backend.addEventListener("close", () => ws.close());
|
||||
backend.addEventListener("error", () => ws.close());
|
||||
},
|
||||
message(ws, message) {
|
||||
let data: string | ArrayBuffer;
|
||||
|
||||
if (typeof message === "string") {
|
||||
data = message;
|
||||
} else if (message instanceof ArrayBuffer) {
|
||||
data = message;
|
||||
} else {
|
||||
const view = message as ArrayBufferView;
|
||||
|
||||
data = view.buffer.slice(
|
||||
view.byteOffset,
|
||||
view.byteOffset + view.byteLength,
|
||||
) as ArrayBuffer;
|
||||
}
|
||||
|
||||
const backend = ws.data.backend;
|
||||
if (backend && backend.readyState === WebSocket.OPEN) backend.send(message);
|
||||
else ws.data.queue.push(message);
|
||||
|
||||
if (backend && backend.readyState === WebSocket.OPEN) {
|
||||
backend.send(data);
|
||||
} else {
|
||||
ws.data.queue.push(data);
|
||||
}
|
||||
},
|
||||
close(ws) {
|
||||
ws.data.backend?.close();
|
||||
|
||||
Reference in New Issue
Block a user