env-runner 0.1.7 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/base-runner.d.mts +0 -3
- package/dist/_chunks/base-runner.mjs +0 -2
- package/dist/_chunks/libs/cjs-module-lexer.mjs +0 -2
- package/dist/_chunks/runner.d.mts +0 -3
- package/dist/_chunks/runner.mjs +0 -2
- package/dist/_chunks/runner2.d.mts +0 -3
- package/dist/_chunks/runner2.mjs +3 -40
- package/dist/_chunks/runner3.d.mts +0 -3
- package/dist/_chunks/runner3.mjs +0 -2
- package/dist/_chunks/runner4.d.mts +0 -3
- package/dist/_chunks/runner4.mjs +58 -7
- package/dist/_chunks/runner5.d.mts +0 -3
- package/dist/_chunks/runner5.mjs +0 -2
- package/dist/_chunks/server.mjs +0 -14
- package/dist/_chunks/types.d.mts +0 -3
- package/dist/_chunks/worker-utils.mjs +0 -6
- package/dist/cli.mjs +0 -2
- package/dist/index.d.mts +0 -9
- package/dist/runners/bun-process/runner.d.mts +0 -3
- package/dist/runners/bun-process/runner.mjs +0 -2
- package/dist/runners/bun-process/worker.mjs +0 -2
- package/dist/runners/deno-process/runner.d.mts +1 -1
- package/dist/runners/deno-process/worker.mjs +0 -2
- package/dist/runners/miniflare/runner.d.mts +1 -1
- package/dist/runners/netlify/runner.d.mts +1 -1
- package/dist/runners/netlify/worker.mjs +0 -2
- package/dist/runners/node-process/runner.d.mts +0 -3
- package/dist/runners/node-process/runner.mjs +0 -2
- package/dist/runners/node-process/worker.mjs +0 -2
- package/dist/runners/node-worker/runner.d.mts +1 -1
- package/dist/runners/node-worker/worker.mjs +0 -2
- package/dist/runners/self/runner.d.mts +2 -7
- package/dist/runners/self/runner.mjs +0 -2
- package/dist/runners/vercel/queue-dev.d.mts +44 -0
- package/dist/runners/vercel/queue-dev.mjs +36 -0
- package/dist/runners/vercel/runner.d.mts +1 -1
- package/dist/runners/vercel/worker.mjs +3 -2
- package/dist/vite.d.mts +0 -3
- package/dist/vite.mjs +0 -14
- package/package.json +23 -17
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { a as RunnerMessageListener, l as WorkerAddress, t as EnvRunner, u as WorkerHooks } from "./types.mjs";
|
|
2
2
|
import { IncomingMessage } from "node:http";
|
|
3
3
|
import { Socket } from "node:net";
|
|
4
|
-
|
|
5
|
-
//#region src/common/base-runner.d.ts
|
|
6
4
|
interface EnvRunnerData {
|
|
7
5
|
name?: string;
|
|
8
6
|
[key: string]: unknown;
|
|
@@ -45,5 +43,4 @@ declare abstract class BaseEnvRunner implements EnvRunner {
|
|
|
45
43
|
protected abstract _closeRuntime(): Promise<void>;
|
|
46
44
|
protected abstract _runtimeType(): string;
|
|
47
45
|
}
|
|
48
|
-
//#endregion
|
|
49
46
|
export { EnvRunnerData as n, BaseEnvRunner as t };
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { rm } from "node:fs/promises";
|
|
2
2
|
import { proxyFetch, proxyUpgrade } from "httpxy";
|
|
3
|
-
//#region src/common/base-runner.ts
|
|
4
3
|
var BaseEnvRunner = class {
|
|
5
4
|
closed = false;
|
|
6
5
|
_name;
|
|
@@ -125,5 +124,4 @@ var BaseEnvRunner = class {
|
|
|
125
124
|
this._address = void 0;
|
|
126
125
|
}
|
|
127
126
|
};
|
|
128
|
-
//#endregion
|
|
129
127
|
export { BaseEnvRunner as t };
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
//#region node_modules/.pnpm/cjs-module-lexer@2.2.0/node_modules/cjs-module-lexer/dist/lexer.mjs
|
|
2
1
|
let A;
|
|
3
2
|
const B = 1 === new Uint8Array(new Uint16Array([1]).buffer)[0];
|
|
4
3
|
function parse(E, g = "@") {
|
|
@@ -143,5 +142,4 @@ function init() {
|
|
|
143
142
|
A = Q;
|
|
144
143
|
})());
|
|
145
144
|
}
|
|
146
|
-
//#endregion
|
|
147
145
|
export { parse as n, init as t };
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { u as WorkerHooks } from "./types.mjs";
|
|
2
2
|
import { n as EnvRunnerData, t as BaseEnvRunner } from "./base-runner.mjs";
|
|
3
|
-
|
|
4
|
-
//#region src/runners/deno-process/runner.d.ts
|
|
5
3
|
declare class DenoProcessEnvRunner extends BaseEnvRunner {
|
|
6
4
|
#private;
|
|
7
5
|
constructor(opts: {
|
|
@@ -16,5 +14,4 @@ declare class DenoProcessEnvRunner extends BaseEnvRunner {
|
|
|
16
14
|
protected _runtimeType(): string;
|
|
17
15
|
protected _closeRuntime(): Promise<void>;
|
|
18
16
|
}
|
|
19
|
-
//#endregion
|
|
20
17
|
export { DenoProcessEnvRunner as t };
|
package/dist/_chunks/runner.mjs
CHANGED
|
@@ -2,7 +2,6 @@ import { t as BaseEnvRunner } from "./base-runner.mjs";
|
|
|
2
2
|
import { existsSync } from "node:fs";
|
|
3
3
|
import { spawn } from "node:child_process";
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
5
|
-
//#region src/runners/deno-process/runner.ts
|
|
6
5
|
let _defaultEntry;
|
|
7
6
|
var DenoProcessEnvRunner = class extends BaseEnvRunner {
|
|
8
7
|
#process;
|
|
@@ -95,5 +94,4 @@ var DenoProcessEnvRunner = class extends BaseEnvRunner {
|
|
|
95
94
|
this.#process = handle;
|
|
96
95
|
}
|
|
97
96
|
};
|
|
98
|
-
//#endregion
|
|
99
97
|
export { DenoProcessEnvRunner as t };
|
|
@@ -2,8 +2,6 @@ import { u as WorkerHooks } from "./types.mjs";
|
|
|
2
2
|
import { n as EnvRunnerData, t as BaseEnvRunner } from "./base-runner.mjs";
|
|
3
3
|
import { IncomingMessage } from "node:http";
|
|
4
4
|
import { Socket } from "node:net";
|
|
5
|
-
|
|
6
|
-
//#region src/runners/miniflare/runner.d.ts
|
|
7
5
|
/** Result from a module transform (compatible with Vite's `TransformResult`). */
|
|
8
6
|
interface TransformResult {
|
|
9
7
|
code: string;
|
|
@@ -83,5 +81,4 @@ declare class MiniflareEnvRunner extends BaseEnvRunner {
|
|
|
83
81
|
};
|
|
84
82
|
}): Promise<void>;
|
|
85
83
|
}
|
|
86
|
-
//#endregion
|
|
87
84
|
export { TransformResult as i, MiniflareEnvRunnerOptions as n, MiniflareExportInfo as r, MiniflareEnvRunner as t };
|
package/dist/_chunks/runner2.mjs
CHANGED
|
@@ -6,26 +6,8 @@ import { readFileSync } from "node:fs";
|
|
|
6
6
|
import { fileURLToPath } from "node:url";
|
|
7
7
|
import { basename, dirname, resolve } from "node:path";
|
|
8
8
|
import { resolveModulePath } from "exsolve";
|
|
9
|
-
|
|
10
|
-
const IPC_PATH$1 = "/__env_runner_ipc";
|
|
11
|
-
/** Service binding name used for cross-request IPC (worker → runner). */
|
|
9
|
+
const IPC_PATH = "/__env_runner_ipc";
|
|
12
10
|
const IPC_BINDING = "__ENV_RUNNER_IPC";
|
|
13
|
-
/**
|
|
14
|
-
* Generates a wrapper module that imports the user entry and adds IPC glue.
|
|
15
|
-
*
|
|
16
|
-
* The user module is expected to export `fetch` and optionally `ipc`.
|
|
17
|
-
* The wrapper uses a persistent WebSocket pair for bidirectional IPC:
|
|
18
|
-
* - Init: `fetch` with `upgrade: websocket` creates a WebSocketPair
|
|
19
|
-
* - Messages: JSON over the WebSocket (no per-message `dispatchFetch`)
|
|
20
|
-
* - Reload: `{ type: "reload" }` triggers cache-busted re-import
|
|
21
|
-
* - Shutdown: `{ type: "shutdown" }` calls `ipc.onClose()`
|
|
22
|
-
*
|
|
23
|
-
* For outgoing messages during fetch request handling, uses a service binding
|
|
24
|
-
* (`__ENV_RUNNER_IPC`) to avoid workerd's cross-request I/O restriction on
|
|
25
|
-
* the WebSocket object.
|
|
26
|
-
*
|
|
27
|
-
* Passed as an in-memory `script` to Miniflare (no temp files needed).
|
|
28
|
-
*/
|
|
29
11
|
function generateWrapper(entryPath, opts) {
|
|
30
12
|
const staticReExport = opts?.dynamicOnly ? "" : `export * from ${JSON.stringify(entryPath)};`;
|
|
31
13
|
const explicitExports = opts?.dynamicOnly && opts.exports?.length ? opts.exports.map((name) => `export { ${name} } from ${JSON.stringify(entryPath)};`).join("\n") : "";
|
|
@@ -48,7 +30,7 @@ if (!globalThis.process) { globalThis.process = __process; }
|
|
|
48
30
|
${staticReExport}
|
|
49
31
|
${explicitExports}
|
|
50
32
|
|
|
51
|
-
const __IPC_PATH = "${IPC_PATH
|
|
33
|
+
const __IPC_PATH = "${IPC_PATH}";
|
|
52
34
|
const __IPC_BINDING = "${IPC_BINDING}";
|
|
53
35
|
const __entryPath = ${JSON.stringify(entryPath)};
|
|
54
36
|
let __userEntry;
|
|
@@ -194,9 +176,6 @@ export default {
|
|
|
194
176
|
};
|
|
195
177
|
`;
|
|
196
178
|
}
|
|
197
|
-
//#endregion
|
|
198
|
-
//#region src/runners/miniflare/runner.ts
|
|
199
|
-
const IPC_PATH = "/__env_runner_ipc";
|
|
200
179
|
const _miniflareCache = /* @__PURE__ */ new Map();
|
|
201
180
|
var MiniflareEnvRunner = class extends BaseEnvRunner {
|
|
202
181
|
#miniflare;
|
|
@@ -222,13 +201,11 @@ var MiniflareEnvRunner = class extends BaseEnvRunner {
|
|
|
222
201
|
this.#exportConditions = opts.exportConditions ?? ["workerd", "worker"];
|
|
223
202
|
this.#init();
|
|
224
203
|
}
|
|
225
|
-
/** Dispose all persistent Miniflare instances from the cache. */
|
|
226
204
|
static async disposeAll() {
|
|
227
205
|
const entries = [..._miniflareCache.values()];
|
|
228
206
|
_miniflareCache.clear();
|
|
229
207
|
for (const entry of entries) await entry.mf.dispose().catch(() => {});
|
|
230
208
|
}
|
|
231
|
-
/** Fully dispose the Miniflare instance (even if persistent). */
|
|
232
209
|
async dispose() {
|
|
233
210
|
if (this.#miniflare) {
|
|
234
211
|
if (this.#ws) {
|
|
@@ -267,13 +244,6 @@ var MiniflareEnvRunner = class extends BaseEnvRunner {
|
|
|
267
244
|
data: message
|
|
268
245
|
}));
|
|
269
246
|
}
|
|
270
|
-
/**
|
|
271
|
-
* Hot-reload the user entry module without recreating the Miniflare instance.
|
|
272
|
-
*
|
|
273
|
-
* Sends `reload-module` event over the WebSocket. The worker wrapper uses
|
|
274
|
-
* `unsafeEvalBinding` to re-import the entry with a cache-busting query string
|
|
275
|
-
* and responds with `module-reloaded` when done.
|
|
276
|
-
*/
|
|
277
247
|
async reloadModule(timeout = 5e3) {
|
|
278
248
|
if (!this.#ws) throw new Error("Miniflare env runner should be initialized before reloading.");
|
|
279
249
|
if (!this._data?.entry) return;
|
|
@@ -513,7 +483,7 @@ var MiniflareEnvRunner = class extends BaseEnvRunner {
|
|
|
513
483
|
refCount: 1
|
|
514
484
|
});
|
|
515
485
|
}
|
|
516
|
-
const initRes = await this.#miniflare.dispatchFetch("http://localhost"
|
|
486
|
+
const initRes = await this.#miniflare.dispatchFetch("http://localhost/__env_runner_ipc", { headers: { upgrade: "websocket" } });
|
|
517
487
|
const ws = initRes.webSocket;
|
|
518
488
|
if (!ws) {
|
|
519
489
|
const body = await initRes.text().catch(() => "");
|
|
@@ -533,10 +503,6 @@ var MiniflareEnvRunner = class extends BaseEnvRunner {
|
|
|
533
503
|
} });
|
|
534
504
|
}
|
|
535
505
|
};
|
|
536
|
-
/**
|
|
537
|
-
* Detect `export class` declarations in the entry file.
|
|
538
|
-
* Merges with explicitly declared exports from options.
|
|
539
|
-
*/
|
|
540
506
|
function detectExportedClasses(entryPath, explicit) {
|
|
541
507
|
const names = new Set(Object.keys(explicit));
|
|
542
508
|
try {
|
|
@@ -547,11 +513,9 @@ function detectExportedClasses(entryPath, explicit) {
|
|
|
547
513
|
} catch {}
|
|
548
514
|
return [...names];
|
|
549
515
|
}
|
|
550
|
-
/** Convert PascalCase/camelCase to SCREAMING_SNAKE_CASE (e.g. `Counter` → `COUNTER`, `MyDurableObject` → `MY_DURABLE_OBJECT`). */
|
|
551
516
|
function toScreamingSnakeCase(name) {
|
|
552
517
|
return name.replace(/([a-z0-9])([A-Z])/g, "$1_$2").toUpperCase();
|
|
553
518
|
}
|
|
554
|
-
/** Compute a stable cache key for persistent Miniflare instances. */
|
|
555
519
|
function computeCacheKey(entryPath, opts) {
|
|
556
520
|
const serializableOpts = {};
|
|
557
521
|
for (const [k, v] of Object.entries(opts)) if (typeof v !== "function") serializableOpts[k] = v;
|
|
@@ -572,5 +536,4 @@ function createCjsEsmShim(cjsSpecifier, contents) {
|
|
|
572
536
|
for (const name of namedExports) shim += `export var ${name} = __cjs_mod__["${name}"];\n`;
|
|
573
537
|
return shim;
|
|
574
538
|
}
|
|
575
|
-
//#endregion
|
|
576
539
|
export { MiniflareEnvRunner as t };
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { u as WorkerHooks } from "./types.mjs";
|
|
2
2
|
import { n as EnvRunnerData, t as BaseEnvRunner } from "./base-runner.mjs";
|
|
3
|
-
|
|
4
|
-
//#region src/runners/node-worker/runner.d.ts
|
|
5
3
|
declare class NodeWorkerEnvRunner extends BaseEnvRunner {
|
|
6
4
|
#private;
|
|
7
5
|
constructor(opts: {
|
|
@@ -15,5 +13,4 @@ declare class NodeWorkerEnvRunner extends BaseEnvRunner {
|
|
|
15
13
|
protected _runtimeType(): string;
|
|
16
14
|
protected _closeRuntime(): Promise<void>;
|
|
17
15
|
}
|
|
18
|
-
//#endregion
|
|
19
16
|
export { NodeWorkerEnvRunner as t };
|
package/dist/_chunks/runner3.mjs
CHANGED
|
@@ -2,7 +2,6 @@ import { t as BaseEnvRunner } from "./base-runner.mjs";
|
|
|
2
2
|
import { existsSync } from "node:fs";
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
4
|
import { Worker } from "node:worker_threads";
|
|
5
|
-
//#region src/runners/node-worker/runner.ts
|
|
6
5
|
let _defaultEntry;
|
|
7
6
|
var NodeWorkerEnvRunner = class extends BaseEnvRunner {
|
|
8
7
|
#worker;
|
|
@@ -58,5 +57,4 @@ var NodeWorkerEnvRunner = class extends BaseEnvRunner {
|
|
|
58
57
|
this.#worker = worker;
|
|
59
58
|
}
|
|
60
59
|
};
|
|
61
|
-
//#endregion
|
|
62
60
|
export { NodeWorkerEnvRunner as t };
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { u as WorkerHooks } from "./types.mjs";
|
|
2
2
|
import { n as EnvRunnerData } from "./base-runner.mjs";
|
|
3
3
|
import { t as NodeWorkerEnvRunner } from "./runner3.mjs";
|
|
4
|
-
|
|
5
|
-
//#region src/runners/vercel/runner.d.ts
|
|
6
4
|
declare class VercelEnvRunner extends NodeWorkerEnvRunner {
|
|
7
5
|
constructor(opts: {
|
|
8
6
|
name: string;
|
|
@@ -13,5 +11,4 @@ declare class VercelEnvRunner extends NodeWorkerEnvRunner {
|
|
|
13
11
|
fetch(input: string | URL | Request, init?: RequestInit): Promise<Response>;
|
|
14
12
|
protected _runtimeType(): string;
|
|
15
13
|
}
|
|
16
|
-
//#endregion
|
|
17
14
|
export { VercelEnvRunner as t };
|
package/dist/_chunks/runner4.mjs
CHANGED
|
@@ -1,7 +1,51 @@
|
|
|
1
1
|
import { t as NodeWorkerEnvRunner } from "./runner3.mjs";
|
|
2
2
|
import { fileURLToPath } from "node:url";
|
|
3
|
-
|
|
3
|
+
import { randomBytes } from "node:crypto";
|
|
4
|
+
let _warned = false;
|
|
5
|
+
function warnIfVercelOidcTokenInvalid(token) {
|
|
6
|
+
const result = _checkVercelOidcToken(token);
|
|
7
|
+
if (_warned) return result;
|
|
8
|
+
if (result.status === "missing") {
|
|
9
|
+
_warned = true;
|
|
10
|
+
console.warn(`\x1B[90m[env-runner]\x1B[39m \x1B[33mVERCEL_OIDC_TOKEN\x1B[39m is not set. Run \x1B[36mvercel env pull\x1B[39m to pull the latest environment variables.`);
|
|
11
|
+
} else if (result.status === "expired") {
|
|
12
|
+
_warned = true;
|
|
13
|
+
console.warn(`\x1B[90m[env-runner]\x1B[39m \x1B[33mVERCEL_OIDC_TOKEN\x1B[39m expired at ${result.expiresAt.toISOString()}. Run \x1B[36mvercel env pull\x1B[39m to pull a fresh OIDC token.`);
|
|
14
|
+
} else if (result.status === "invalid") {
|
|
15
|
+
_warned = true;
|
|
16
|
+
console.warn(`\x1B[90m[env-runner]\x1B[39m \x1B[33mVERCEL_OIDC_TOKEN\x1B[39m is malformed (not a valid JWT). Run \x1B[36mvercel env pull\x1B[39m to pull a valid OIDC token.`);
|
|
17
|
+
}
|
|
18
|
+
return result;
|
|
19
|
+
}
|
|
20
|
+
function _checkVercelOidcToken(token = process.env.VERCEL_OIDC_TOKEN) {
|
|
21
|
+
if (!token) return { status: "missing" };
|
|
22
|
+
const parts = token.split(".");
|
|
23
|
+
if (parts.length !== 3) return { status: "invalid" };
|
|
24
|
+
let payload;
|
|
25
|
+
try {
|
|
26
|
+
const json = Buffer.from(parts[1], "base64url").toString("utf8");
|
|
27
|
+
payload = JSON.parse(json);
|
|
28
|
+
} catch {
|
|
29
|
+
return { status: "invalid" };
|
|
30
|
+
}
|
|
31
|
+
if (!payload || typeof payload !== "object") return { status: "invalid" };
|
|
32
|
+
const exp = payload.exp;
|
|
33
|
+
if (typeof exp !== "number" || !Number.isFinite(exp)) return { status: "invalid" };
|
|
34
|
+
const expiresAt = /* @__PURE__ */ new Date(exp * 1e3);
|
|
35
|
+
if (expiresAt.getTime() <= Date.now()) return {
|
|
36
|
+
status: "expired",
|
|
37
|
+
expiresAt
|
|
38
|
+
};
|
|
39
|
+
return {
|
|
40
|
+
status: "valid",
|
|
41
|
+
expiresAt
|
|
42
|
+
};
|
|
43
|
+
}
|
|
4
44
|
let _defaultEntry;
|
|
45
|
+
const _podId = Math.random().toString(32).slice(-5);
|
|
46
|
+
function generateVercelId() {
|
|
47
|
+
return `dev1::${_podId}-${Date.now().toString(36)}-${randomBytes(6).toString("hex")}`;
|
|
48
|
+
}
|
|
5
49
|
var VercelEnvRunner = class extends NodeWorkerEnvRunner {
|
|
6
50
|
constructor(opts) {
|
|
7
51
|
_defaultEntry ||= fileURLToPath(import.meta.resolve("env-runner/runners/vercel/worker"));
|
|
@@ -9,13 +53,16 @@ var VercelEnvRunner = class extends NodeWorkerEnvRunner {
|
|
|
9
53
|
...opts,
|
|
10
54
|
workerEntry: opts.workerEntry || _defaultEntry
|
|
11
55
|
});
|
|
56
|
+
warnIfVercelOidcTokenInvalid();
|
|
12
57
|
}
|
|
13
58
|
async fetch(input, init) {
|
|
14
59
|
const headers = new Headers(input instanceof Request ? input.headers : init?.headers);
|
|
60
|
+
const requestId = generateVercelId();
|
|
15
61
|
if (this._address && this._address.port != null && !headers.has("x-vercel-deployment-url")) {
|
|
16
62
|
const host = this._address.host || "127.0.0.1";
|
|
17
63
|
headers.set("x-vercel-deployment-url", `http://${host}:${this._address.port}`);
|
|
18
64
|
}
|
|
65
|
+
if (!headers.has("x-vercel-id")) headers.set("x-vercel-id", requestId);
|
|
19
66
|
const clientIp = headers.get("x-forwarded-for")?.split(",")[0]?.trim() || headers.get("x-real-ip") || "127.0.0.1";
|
|
20
67
|
if (!headers.has("x-vercel-forwarded-for")) headers.set("x-vercel-forwarded-for", clientIp);
|
|
21
68
|
if (!headers.has("x-forwarded-for")) headers.set("x-forwarded-for", clientIp);
|
|
@@ -25,18 +72,22 @@ var VercelEnvRunner = class extends NodeWorkerEnvRunner {
|
|
|
25
72
|
if (!headers.has("x-forwarded-proto")) headers.set("x-forwarded-proto", url.protocol.replace(":", ""));
|
|
26
73
|
if (!headers.has("x-forwarded-host")) headers.set("x-forwarded-host", headers.get("host") || url.host);
|
|
27
74
|
} catch {}
|
|
28
|
-
|
|
29
|
-
...init,
|
|
30
|
-
headers
|
|
31
|
-
}));
|
|
32
|
-
return super.fetch(input, {
|
|
75
|
+
const res = await super.fetch(input, {
|
|
33
76
|
...init,
|
|
34
77
|
headers
|
|
35
78
|
});
|
|
79
|
+
const resHeaders = new Headers(res.headers);
|
|
80
|
+
if (!resHeaders.has("server")) resHeaders.set("server", "Vercel");
|
|
81
|
+
if (!resHeaders.has("x-vercel-id")) resHeaders.set("x-vercel-id", requestId);
|
|
82
|
+
if (!resHeaders.has("x-vercel-cache")) resHeaders.set("x-vercel-cache", "MISS");
|
|
83
|
+
return new Response(res.body, {
|
|
84
|
+
status: res.status,
|
|
85
|
+
statusText: res.statusText,
|
|
86
|
+
headers: resHeaders
|
|
87
|
+
});
|
|
36
88
|
}
|
|
37
89
|
_runtimeType() {
|
|
38
90
|
return "vercel";
|
|
39
91
|
}
|
|
40
92
|
};
|
|
41
|
-
//#endregion
|
|
42
93
|
export { VercelEnvRunner as t };
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { u as WorkerHooks } from "./types.mjs";
|
|
2
2
|
import { n as EnvRunnerData } from "./base-runner.mjs";
|
|
3
3
|
import { t as NodeWorkerEnvRunner } from "./runner3.mjs";
|
|
4
|
-
|
|
5
|
-
//#region src/runners/netlify/runner.d.ts
|
|
6
4
|
declare class NetlifyEnvRunner extends NodeWorkerEnvRunner {
|
|
7
5
|
constructor(opts: {
|
|
8
6
|
name: string;
|
|
@@ -13,5 +11,4 @@ declare class NetlifyEnvRunner extends NodeWorkerEnvRunner {
|
|
|
13
11
|
fetch(input: string | URL | Request, init?: RequestInit): Promise<Response>;
|
|
14
12
|
protected _runtimeType(): string;
|
|
15
13
|
}
|
|
16
|
-
//#endregion
|
|
17
14
|
export { NetlifyEnvRunner as t };
|
package/dist/_chunks/runner5.mjs
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { t as NodeWorkerEnvRunner } from "./runner3.mjs";
|
|
2
2
|
import { fileURLToPath } from "node:url";
|
|
3
|
-
//#region src/runners/netlify/runner.ts
|
|
4
3
|
let _defaultEntry;
|
|
5
4
|
var NetlifyEnvRunner = class extends NodeWorkerEnvRunner {
|
|
6
5
|
constructor(opts) {
|
|
@@ -43,5 +42,4 @@ var NetlifyEnvRunner = class extends NodeWorkerEnvRunner {
|
|
|
43
42
|
return "netlify";
|
|
44
43
|
}
|
|
45
44
|
};
|
|
46
|
-
//#endregion
|
|
47
45
|
export { NetlifyEnvRunner as t };
|
package/dist/_chunks/server.mjs
CHANGED
|
@@ -1,9 +1,4 @@
|
|
|
1
1
|
import { watch } from "node:fs";
|
|
2
|
-
//#region src/manager.ts
|
|
3
|
-
/**
|
|
4
|
-
* Manages an active `EnvRunner` instance, proxying all calls to it.
|
|
5
|
-
* Supports hot-reload, auto-restart on unexpected exit, and message queueing.
|
|
6
|
-
*/
|
|
7
2
|
var RunnerManager = class {
|
|
8
3
|
_runner;
|
|
9
4
|
_messageQueue = [];
|
|
@@ -21,7 +16,6 @@ var RunnerManager = class {
|
|
|
21
16
|
get closed() {
|
|
22
17
|
return this._closed;
|
|
23
18
|
}
|
|
24
|
-
/** Replace the active runner with a new one. Closes the previous runner. */
|
|
25
19
|
async reload(runner) {
|
|
26
20
|
this._reloading = true;
|
|
27
21
|
const prev = this._runner;
|
|
@@ -167,8 +161,6 @@ var RunnerManager = class {
|
|
|
167
161
|
for (const msg of queue) this._runner.sendMessage(msg);
|
|
168
162
|
}
|
|
169
163
|
};
|
|
170
|
-
//#endregion
|
|
171
|
-
//#region src/loader.ts
|
|
172
164
|
const loaders = {
|
|
173
165
|
"node-worker": () => import("env-runner/runners/node-worker").then((m) => m.NodeWorkerEnvRunner),
|
|
174
166
|
"node-process": () => import("env-runner/runners/node-process").then((m) => m.NodeProcessEnvRunner),
|
|
@@ -182,19 +174,15 @@ const loaders = {
|
|
|
182
174
|
async function loadRunner(runner, opts) {
|
|
183
175
|
return new (await (loaders[runner]()))(opts);
|
|
184
176
|
}
|
|
185
|
-
//#endregion
|
|
186
|
-
//#region src/server.ts
|
|
187
177
|
var EnvServer = class extends RunnerManager {
|
|
188
178
|
_opts;
|
|
189
179
|
_watchers = [];
|
|
190
180
|
_reloadTimeout;
|
|
191
181
|
_reloadListeners = /* @__PURE__ */ new Set();
|
|
192
182
|
runner = null;
|
|
193
|
-
/** Register a listener called when the runner is reloaded due to a file change. */
|
|
194
183
|
onReload(listener) {
|
|
195
184
|
this._reloadListeners.add(listener);
|
|
196
185
|
}
|
|
197
|
-
/** Remove a previously registered reload listener. */
|
|
198
186
|
offReload(listener) {
|
|
199
187
|
this._reloadListeners.delete(listener);
|
|
200
188
|
}
|
|
@@ -202,7 +190,6 @@ var EnvServer = class extends RunnerManager {
|
|
|
202
190
|
super();
|
|
203
191
|
this._opts = opts;
|
|
204
192
|
}
|
|
205
|
-
/** Start the server by loading and attaching the runner. */
|
|
206
193
|
async start() {
|
|
207
194
|
this.runner = await this._createRunner();
|
|
208
195
|
await this.reload(this.runner);
|
|
@@ -251,5 +238,4 @@ var EnvServer = class extends RunnerManager {
|
|
|
251
238
|
}, 100);
|
|
252
239
|
}
|
|
253
240
|
};
|
|
254
|
-
//#endregion
|
|
255
241
|
export { loadRunner as n, RunnerManager as r, EnvServer as t };
|
package/dist/_chunks/types.d.mts
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { IncomingMessage } from "node:http";
|
|
2
2
|
import { Socket } from "node:net";
|
|
3
|
-
|
|
4
|
-
//#region src/types.d.ts
|
|
5
3
|
/** Handler for proxying HTTP requests to the worker. */
|
|
6
4
|
type FetchHandler = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
|
|
7
5
|
/** Callback for receiving messages from the worker. */
|
|
@@ -72,5 +70,4 @@ interface EnvRunner extends RunnerRPCHooks {
|
|
|
72
70
|
/** Gracefully shut down the worker. */
|
|
73
71
|
close(): Promise<void>;
|
|
74
72
|
}
|
|
75
|
-
//#endregion
|
|
76
73
|
export { RunnerMessageListener as a, UpgradeHandler as c, RPCOptions as i, WorkerAddress as l, FetchHandler as n, RunnerRPCHooks as o, NodeUpgradeContext as r, UpgradeContext as s, EnvRunner as t, WorkerHooks as u };
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { readFileSync } from "node:fs";
|
|
2
2
|
import { pathToFileURL } from "node:url";
|
|
3
3
|
import { isAbsolute } from "node:path";
|
|
4
|
-
//#region src/common/worker-utils.ts
|
|
5
4
|
async function resolveEntry(entryPath) {
|
|
6
5
|
const mod = await import(_toImportPath(entryPath));
|
|
7
6
|
const entry = mod.default || mod;
|
|
@@ -15,10 +14,6 @@ function parseServerAddress(server) {
|
|
|
15
14
|
port: Number(url.port)
|
|
16
15
|
};
|
|
17
16
|
}
|
|
18
|
-
/**
|
|
19
|
-
* Re-import the user entry module with cache busting.
|
|
20
|
-
* Tears down old IPC hooks and re-initializes new ones.
|
|
21
|
-
*/
|
|
22
17
|
async function reloadEntryModule(entryPath, currentEntry, sendMessage) {
|
|
23
18
|
await currentEntry.ipc?.onClose?.();
|
|
24
19
|
const newEntry = await _importFresh(entryPath);
|
|
@@ -39,5 +34,4 @@ async function _importFresh(entryPath) {
|
|
|
39
34
|
if (typeof entry.fetch !== "function") throw new Error(`[env-runner] Entry module "${entryPath}" must export a \`fetch\` handler (export default { fetch(req) { ... } }).`);
|
|
40
35
|
return entry;
|
|
41
36
|
}
|
|
42
|
-
//#endregion
|
|
43
37
|
export { reloadEntryModule as n, resolveEntry as r, parseServerAddress as t };
|
package/dist/cli.mjs
CHANGED
|
@@ -2,7 +2,6 @@ import { t as EnvServer } from "./_chunks/server.mjs";
|
|
|
2
2
|
import { resolve } from "node:path";
|
|
3
3
|
import { serve } from "srvx";
|
|
4
4
|
import { parseArgs } from "node:util";
|
|
5
|
-
//#region src/cli.ts
|
|
6
5
|
const { values, positionals } = parseArgs({
|
|
7
6
|
allowPositionals: true,
|
|
8
7
|
options: {
|
|
@@ -67,5 +66,4 @@ for (const signal of ["SIGINT", "SIGTERM"]) process.once(signal, async () => {
|
|
|
67
66
|
await server.close();
|
|
68
67
|
process.exit(0);
|
|
69
68
|
});
|
|
70
|
-
//#endregion
|
|
71
69
|
export {};
|
package/dist/index.d.mts
CHANGED
|
@@ -6,8 +6,6 @@ import { t as VercelEnvRunner } from "./_chunks/runner4.mjs";
|
|
|
6
6
|
import { t as NetlifyEnvRunner } from "./_chunks/runner5.mjs";
|
|
7
7
|
import { ServerOptions } from "srvx";
|
|
8
8
|
import { Hooks } from "crossws";
|
|
9
|
-
|
|
10
|
-
//#region src/manager.d.ts
|
|
11
9
|
/**
|
|
12
10
|
* Manages an active `EnvRunner` instance, proxying all calls to it.
|
|
13
11
|
* Supports hot-reload, auto-restart on unexpected exit, and message queueing.
|
|
@@ -46,8 +44,6 @@ declare class RunnerManager implements EnvRunner {
|
|
|
46
44
|
private _waitForRunner;
|
|
47
45
|
private _flushQueue;
|
|
48
46
|
}
|
|
49
|
-
//#endregion
|
|
50
|
-
//#region src/loader.d.ts
|
|
51
47
|
type RunnerName = "node-worker" | "node-process" | "bun-process" | "deno-process" | "self" | "miniflare" | "vercel" | "netlify";
|
|
52
48
|
interface LoadRunnerOptions {
|
|
53
49
|
name: string;
|
|
@@ -59,8 +55,6 @@ interface LoadRunnerOptions {
|
|
|
59
55
|
[key: string]: unknown;
|
|
60
56
|
}
|
|
61
57
|
declare function loadRunner(runner: RunnerName, opts: LoadRunnerOptions): Promise<EnvRunner>;
|
|
62
|
-
//#endregion
|
|
63
|
-
//#region src/server.d.ts
|
|
64
58
|
interface EnvServerOptions {
|
|
65
59
|
/** Runner implementation to use. */
|
|
66
60
|
runner: RunnerName;
|
|
@@ -98,8 +92,6 @@ declare class EnvServer extends RunnerManager {
|
|
|
98
92
|
private _stopWatching;
|
|
99
93
|
private _scheduleReload;
|
|
100
94
|
}
|
|
101
|
-
//#endregion
|
|
102
|
-
//#region src/common/worker-utils.d.ts
|
|
103
95
|
interface AppEntryIPCContext {
|
|
104
96
|
sendMessage: (message: unknown) => void;
|
|
105
97
|
}
|
|
@@ -116,5 +108,4 @@ interface AppEntry {
|
|
|
116
108
|
plugins?: ServerOptions["plugins"];
|
|
117
109
|
ipc?: AppEntryIPC;
|
|
118
110
|
}
|
|
119
|
-
//#endregion
|
|
120
111
|
export { type AppEntry, type AppEntryIPC, type AppEntryIPCContext, BaseEnvRunner, DenoProcessEnvRunner, type EnvRunnerData as DenoProcessEnvRunnerData, type EnvRunnerData, type EnvRunner, EnvServer, type EnvServerOptions, type FetchHandler, type LoadRunnerOptions, MiniflareEnvRunner, type MiniflareEnvRunnerOptions, type MiniflareExportInfo, NetlifyEnvRunner, type NodeUpgradeContext, type RPCOptions, RunnerManager, type RunnerMessageListener, type RunnerName, type RunnerRPCHooks, type TransformResult, type UpgradeContext, type UpgradeHandler, VercelEnvRunner, type WorkerAddress, type WorkerHooks, loadRunner };
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { u as WorkerHooks } from "../../_chunks/types.mjs";
|
|
2
2
|
import { n as EnvRunnerData, t as BaseEnvRunner } from "../../_chunks/base-runner.mjs";
|
|
3
|
-
|
|
4
|
-
//#region src/runners/bun-process/runner.d.ts
|
|
5
3
|
declare class BunProcessEnvRunner extends BaseEnvRunner {
|
|
6
4
|
#private;
|
|
7
5
|
constructor(opts: {
|
|
@@ -16,5 +14,4 @@ declare class BunProcessEnvRunner extends BaseEnvRunner {
|
|
|
16
14
|
protected _runtimeType(): string;
|
|
17
15
|
protected _closeRuntime(): Promise<void>;
|
|
18
16
|
}
|
|
19
|
-
//#endregion
|
|
20
17
|
export { BunProcessEnvRunner, type EnvRunnerData as BunProcessEnvRunnerData };
|
|
@@ -4,7 +4,6 @@ import { execSync, spawn } from "node:child_process";
|
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
5
5
|
import { join } from "node:path";
|
|
6
6
|
import { homedir } from "node:os";
|
|
7
|
-
//#region src/runners/bun-process/runner.ts
|
|
8
7
|
let _defaultEntry;
|
|
9
8
|
let _bunPath;
|
|
10
9
|
const _isBun = typeof Bun !== "undefined";
|
|
@@ -126,5 +125,4 @@ var BunProcessEnvRunner = class extends BaseEnvRunner {
|
|
|
126
125
|
this.#process = handle;
|
|
127
126
|
}
|
|
128
127
|
};
|
|
129
|
-
//#endregion
|
|
130
128
|
export { BunProcessEnvRunner };
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { n as reloadEntryModule, r as resolveEntry, t as parseServerAddress } from "../../_chunks/worker-utils.mjs";
|
|
2
2
|
import { serve } from "srvx";
|
|
3
3
|
import { plugin } from "crossws/server";
|
|
4
|
-
//#region src/runners/bun-process/worker.ts
|
|
5
4
|
const data = JSON.parse(process.env.ENV_RUNNER_DATA || "{}");
|
|
6
5
|
let entry = await resolveEntry(data.entry);
|
|
7
6
|
const sendMessage = (message) => process.send(message);
|
|
@@ -52,5 +51,4 @@ process.on("message", async (message) => {
|
|
|
52
51
|
}
|
|
53
52
|
entry.ipc?.onMessage?.(message);
|
|
54
53
|
});
|
|
55
|
-
//#endregion
|
|
56
54
|
export {};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { n as EnvRunnerData } from "../../_chunks/base-runner.mjs";
|
|
2
2
|
import { t as DenoProcessEnvRunner } from "../../_chunks/runner.mjs";
|
|
3
|
-
export { DenoProcessEnvRunner, EnvRunnerData as DenoProcessEnvRunnerData };
|
|
3
|
+
export { DenoProcessEnvRunner, type EnvRunnerData as DenoProcessEnvRunnerData };
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { n as reloadEntryModule, r as resolveEntry, t as parseServerAddress } from "../../_chunks/worker-utils.mjs";
|
|
2
2
|
import { serve } from "srvx";
|
|
3
3
|
import { plugin } from "crossws/server";
|
|
4
|
-
//#region src/runners/deno-process/worker.ts
|
|
5
4
|
const data = JSON.parse(process.env.ENV_RUNNER_DATA || "{}");
|
|
6
5
|
let entry = await resolveEntry(data.entry);
|
|
7
6
|
const _stdout = globalThis.Deno?.stdout ? { write: (s) => globalThis.Deno.stdout.writeSync(new TextEncoder().encode(s)) } : process.stdout;
|
|
@@ -75,5 +74,4 @@ async function handleMessage(message) {
|
|
|
75
74
|
entry.ipc?.onMessage?.(message);
|
|
76
75
|
}
|
|
77
76
|
readMessages().catch(() => {});
|
|
78
|
-
//#endregion
|
|
79
77
|
export {};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { n as EnvRunnerData } from "../../_chunks/base-runner.mjs";
|
|
2
2
|
import { i as TransformResult, n as MiniflareEnvRunnerOptions, r as MiniflareExportInfo, t as MiniflareEnvRunner } from "../../_chunks/runner2.mjs";
|
|
3
|
-
export { MiniflareEnvRunner, EnvRunnerData as MiniflareEnvRunnerData, MiniflareEnvRunnerOptions, MiniflareExportInfo, TransformResult };
|
|
3
|
+
export { MiniflareEnvRunner, type EnvRunnerData as MiniflareEnvRunnerData, MiniflareEnvRunnerOptions, MiniflareExportInfo, TransformResult };
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { u as WorkerHooks } from "../../_chunks/types.mjs";
|
|
2
2
|
import { n as EnvRunnerData, t as BaseEnvRunner } from "../../_chunks/base-runner.mjs";
|
|
3
|
-
|
|
4
|
-
//#region src/runners/node-process/runner.d.ts
|
|
5
3
|
declare class NodeProcessEnvRunner extends BaseEnvRunner {
|
|
6
4
|
#private;
|
|
7
5
|
constructor(opts: {
|
|
@@ -16,5 +14,4 @@ declare class NodeProcessEnvRunner extends BaseEnvRunner {
|
|
|
16
14
|
protected _runtimeType(): string;
|
|
17
15
|
protected _closeRuntime(): Promise<void>;
|
|
18
16
|
}
|
|
19
|
-
//#endregion
|
|
20
17
|
export { NodeProcessEnvRunner, type EnvRunnerData as ProcessEnvRunnerData };
|
|
@@ -2,7 +2,6 @@ import { t as BaseEnvRunner } from "../../_chunks/base-runner.mjs";
|
|
|
2
2
|
import { existsSync } from "node:fs";
|
|
3
3
|
import { fork } from "node:child_process";
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
5
|
-
//#region src/runners/node-process/runner.ts
|
|
6
5
|
let _defaultEntry;
|
|
7
6
|
var NodeProcessEnvRunner = class extends BaseEnvRunner {
|
|
8
7
|
#process;
|
|
@@ -63,5 +62,4 @@ var NodeProcessEnvRunner = class extends BaseEnvRunner {
|
|
|
63
62
|
this.#process = child;
|
|
64
63
|
}
|
|
65
64
|
};
|
|
66
|
-
//#endregion
|
|
67
65
|
export { NodeProcessEnvRunner };
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { n as reloadEntryModule, r as resolveEntry, t as parseServerAddress } from "../../_chunks/worker-utils.mjs";
|
|
2
2
|
import { serve } from "srvx";
|
|
3
3
|
import { plugin } from "crossws/server/node";
|
|
4
|
-
//#region src/runners/node-process/worker.ts
|
|
5
4
|
const data = JSON.parse(process.env.ENV_RUNNER_DATA || "{}");
|
|
6
5
|
let entry = await resolveEntry(data.entry);
|
|
7
6
|
const sendMessage = (message) => process.send(message);
|
|
@@ -52,5 +51,4 @@ process.on("message", async (message) => {
|
|
|
52
51
|
}
|
|
53
52
|
entry.ipc?.onMessage?.(message);
|
|
54
53
|
});
|
|
55
|
-
//#endregion
|
|
56
54
|
export {};
|
|
@@ -2,7 +2,6 @@ import { n as reloadEntryModule, r as resolveEntry, t as parseServerAddress } fr
|
|
|
2
2
|
import { parentPort, workerData } from "node:worker_threads";
|
|
3
3
|
import { serve } from "srvx";
|
|
4
4
|
import { plugin } from "crossws/server/node";
|
|
5
|
-
//#region src/runners/node-worker/worker.ts
|
|
6
5
|
const data = workerData || {};
|
|
7
6
|
let entry = await resolveEntry(data.entry);
|
|
8
7
|
const sendMessage = (message) => parentPort?.postMessage(message);
|
|
@@ -53,5 +52,4 @@ parentPort?.on("message", async (message) => {
|
|
|
53
52
|
}
|
|
54
53
|
entry.ipc?.onMessage?.(message);
|
|
55
54
|
});
|
|
56
|
-
//#endregion
|
|
57
55
|
export {};
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
import { u as WorkerHooks } from "../../_chunks/types.mjs";
|
|
2
2
|
import { n as EnvRunnerData, t as BaseEnvRunner } from "../../_chunks/base-runner.mjs";
|
|
3
|
-
import * as node_http0 from "node:http";
|
|
4
|
-
import * as node_net0 from "node:net";
|
|
5
|
-
|
|
6
|
-
//#region src/runners/self/runner.d.ts
|
|
7
3
|
declare class SelfEnvRunner extends BaseEnvRunner {
|
|
8
4
|
#private;
|
|
9
5
|
constructor(opts: {
|
|
@@ -14,8 +10,8 @@ declare class SelfEnvRunner extends BaseEnvRunner {
|
|
|
14
10
|
fetch(input: string | URL | Request, init?: RequestInit): Promise<Response>;
|
|
15
11
|
upgrade(context: {
|
|
16
12
|
node: {
|
|
17
|
-
req:
|
|
18
|
-
socket:
|
|
13
|
+
req: import("node:http").IncomingMessage;
|
|
14
|
+
socket: import("node:net").Socket;
|
|
19
15
|
head: any;
|
|
20
16
|
};
|
|
21
17
|
}): Promise<void>;
|
|
@@ -25,5 +21,4 @@ declare class SelfEnvRunner extends BaseEnvRunner {
|
|
|
25
21
|
protected _runtimeType(): string;
|
|
26
22
|
protected _closeRuntime(): Promise<void>;
|
|
27
23
|
}
|
|
28
|
-
//#endregion
|
|
29
24
|
export { SelfEnvRunner, type EnvRunnerData as SelfEnvRunnerData };
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { t as BaseEnvRunner } from "../../_chunks/base-runner.mjs";
|
|
2
2
|
import { n as reloadEntryModule, r as resolveEntry } from "../../_chunks/worker-utils.mjs";
|
|
3
|
-
//#region src/runners/self/runner.ts
|
|
4
3
|
var SelfEnvRunner = class extends BaseEnvRunner {
|
|
5
4
|
#active = false;
|
|
6
5
|
#entry;
|
|
@@ -89,5 +88,4 @@ var SelfEnvRunner = class extends BaseEnvRunner {
|
|
|
89
88
|
});
|
|
90
89
|
}
|
|
91
90
|
};
|
|
92
|
-
//#endregion
|
|
93
91
|
export { SelfEnvRunner };
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { MessageHandler, RetryHandler } from "@vercel/queue";
|
|
2
|
+
interface VercelQueueDevConsumer {
|
|
3
|
+
/** Topic name. Wildcard patterns (e.g. `"user-*"`) are supported. */
|
|
4
|
+
topic: string;
|
|
5
|
+
/** Function invoked with each delivered message. */
|
|
6
|
+
handler: MessageHandler;
|
|
7
|
+
/**
|
|
8
|
+
* Logical consumer identifier. Re-registering with the same group on the same
|
|
9
|
+
* topic replaces the previous handler (HMR-safe). Use distinct groups to fan
|
|
10
|
+
* a topic out to multiple coexisting handlers.
|
|
11
|
+
*
|
|
12
|
+
* @default "env-runner-vercel-dev"
|
|
13
|
+
*/
|
|
14
|
+
consumerGroup?: string;
|
|
15
|
+
/**
|
|
16
|
+
* Lock duration for in-flight messages. Forwarded to the SDK's
|
|
17
|
+
* `coreHandleCallback`.
|
|
18
|
+
*/
|
|
19
|
+
visibilityTimeoutSeconds?: number;
|
|
20
|
+
/**
|
|
21
|
+
* Convenience: rescheduled re-delivery delay applied when the handler throws.
|
|
22
|
+
* Equivalent to `retry: () => ({ afterSeconds })`. Ignored if `retry` is set.
|
|
23
|
+
*/
|
|
24
|
+
retryAfterSeconds?: number;
|
|
25
|
+
/**
|
|
26
|
+
* Full retry handler. Receives the thrown error and message metadata; return
|
|
27
|
+
* `{ afterSeconds }` to reschedule, `{ acknowledge: true }` to drop, or
|
|
28
|
+
* `undefined` to let the error propagate.
|
|
29
|
+
*/
|
|
30
|
+
retry?: RetryHandler;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Bind a handler to a topic. Resolves to an unregister function.
|
|
34
|
+
*
|
|
35
|
+
* The first call across the worker process lazily loads `@vercel/queue` and
|
|
36
|
+
* constructs a shared `QueueClient`. Re-registering with the same topic
|
|
37
|
+
* replaces the handler (HMR-safe; the SDK keys consumers by `consumerGroup`,
|
|
38
|
+
* so calling unregister on a replaced registration is a no-op).
|
|
39
|
+
*
|
|
40
|
+
* If `@vercel/queue` is not installed or does not expose `registerDevConsumer`,
|
|
41
|
+
* resolves to a no-op unregister and logs a one-time warning.
|
|
42
|
+
*/
|
|
43
|
+
declare function registerVercelQueueConsumer(consumer: VercelQueueDevConsumer): Promise<() => void>;
|
|
44
|
+
export { VercelQueueDevConsumer, registerVercelQueueConsumer };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
const DEFAULT_CONSUMER_GROUP = "env-runner-vercel-dev";
|
|
2
|
+
let sdkPromise;
|
|
3
|
+
let client;
|
|
4
|
+
const noop = () => {};
|
|
5
|
+
async function registerVercelQueueConsumer(consumer) {
|
|
6
|
+
const sdk = await ensureSdk();
|
|
7
|
+
if (!sdk || !client) return noop;
|
|
8
|
+
return sdk.registerDevConsumer({
|
|
9
|
+
topic: consumer.topic,
|
|
10
|
+
client,
|
|
11
|
+
handler: consumer.handler,
|
|
12
|
+
consumerGroup: consumer.consumerGroup ?? DEFAULT_CONSUMER_GROUP,
|
|
13
|
+
visibilityTimeoutSeconds: consumer.visibilityTimeoutSeconds,
|
|
14
|
+
retry: consumer.retry ?? (consumer.retryAfterSeconds === void 0 ? void 0 : () => ({ afterSeconds: consumer.retryAfterSeconds }))
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
function ensureSdk() {
|
|
18
|
+
if (sdkPromise) return sdkPromise;
|
|
19
|
+
sdkPromise = (async () => {
|
|
20
|
+
let mod;
|
|
21
|
+
try {
|
|
22
|
+
mod = await import("@vercel/queue");
|
|
23
|
+
} catch {
|
|
24
|
+
console.warn("[env-runner:vercel-queue] `@vercel/queue` is not installed. Local queue delivery is disabled.");
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
if (typeof mod.registerDevConsumer !== "function") {
|
|
28
|
+
console.warn("[env-runner:vercel-queue] Installed `@vercel/queue` does not export `registerDevConsumer`. Upgrade @vercel/queue@^0.2.0 to enable local queue delivery.");
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
client = new mod.QueueClient();
|
|
32
|
+
return mod;
|
|
33
|
+
})();
|
|
34
|
+
return sdkPromise;
|
|
35
|
+
}
|
|
36
|
+
export { registerVercelQueueConsumer };
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
process.env.VERCEL = process.env.VERCEL || "1";
|
|
2
|
+
process.env.VERCEL_ENV = process.env.VERCEL_ENV || "development";
|
|
3
|
+
process.env.NODE_ENV = process.env.NODE_ENV || "development";
|
|
2
4
|
const SYMBOL_FOR_REQ_CONTEXT = Symbol.for("@vercel/request-context");
|
|
3
5
|
const waitUntilPromises = /* @__PURE__ */ new Set();
|
|
4
6
|
const cacheStore = /* @__PURE__ */ new Map();
|
|
@@ -46,5 +48,4 @@ globalThis[SYMBOL_FOR_REQ_CONTEXT] = { get: () => ({
|
|
|
46
48
|
}
|
|
47
49
|
}) };
|
|
48
50
|
await import("../node-worker/worker.mjs");
|
|
49
|
-
//#endregion
|
|
50
51
|
export {};
|
package/dist/vite.d.mts
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import { o as RunnerRPCHooks } from "./_chunks/types.mjs";
|
|
2
|
-
|
|
3
|
-
//#region src/vite.d.ts
|
|
4
2
|
/** Vite HotChannel-compatible interface (avoids hard dependency on vite types). */
|
|
5
3
|
interface ViteHotChannel {
|
|
6
4
|
send: (data: any) => void;
|
|
@@ -28,5 +26,4 @@ declare function createViteHotChannel(hooks: RunnerRPCHooks, envName: string): V
|
|
|
28
26
|
* Filters messages by `envName` so multiple Vite environments can share one IPC channel.
|
|
29
27
|
*/
|
|
30
28
|
declare function createViteTransport(sendMessage: (data: any) => void, onMessage: (listener: (value: any) => void) => void, envName: string): ViteTransport;
|
|
31
|
-
//#endregion
|
|
32
29
|
export { ViteHotChannel, ViteTransport, createViteHotChannel, createViteTransport };
|
package/dist/vite.mjs
CHANGED
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
//#region src/vite.ts
|
|
2
|
-
/**
|
|
3
|
-
* Create a Vite `HotChannel` from an env-runner's RPC hooks.
|
|
4
|
-
*
|
|
5
|
-
* Use on the **host side** to bridge env-runner IPC → Vite's DevEnvironment transport.
|
|
6
|
-
* Messages are namespaced by `envName` so multiple Vite environments can share one runner.
|
|
7
|
-
*/
|
|
8
1
|
function createViteHotChannel(hooks, envName) {
|
|
9
2
|
const listeners = /* @__PURE__ */ new WeakMap();
|
|
10
3
|
return {
|
|
@@ -33,12 +26,6 @@ function createViteHotChannel(hooks, envName) {
|
|
|
33
26
|
}
|
|
34
27
|
};
|
|
35
28
|
}
|
|
36
|
-
/**
|
|
37
|
-
* Create a Vite `ModuleRunner` transport from worker-side IPC primitives.
|
|
38
|
-
*
|
|
39
|
-
* Use on the **worker side** to bridge worker IPC → Vite's `ModuleRunner` transport.
|
|
40
|
-
* Filters messages by `envName` so multiple Vite environments can share one IPC channel.
|
|
41
|
-
*/
|
|
42
29
|
function createViteTransport(sendMessage, onMessage, envName) {
|
|
43
30
|
return {
|
|
44
31
|
connect({ onMessage: onRunnerMessage }) {
|
|
@@ -54,5 +41,4 @@ function createViteTransport(sendMessage, onMessage, envName) {
|
|
|
54
41
|
}
|
|
55
42
|
};
|
|
56
43
|
}
|
|
57
|
-
//#endregion
|
|
58
44
|
export { createViteHotChannel, createViteTransport };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "env-runner",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.9",
|
|
4
4
|
"description": "Generic environment runner for JavaScript runtimes.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": "unjs/env-runner",
|
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
"./runners/miniflare": "./dist/runners/miniflare/runner.mjs",
|
|
27
27
|
"./runners/vercel": "./dist/runners/vercel/runner.mjs",
|
|
28
28
|
"./runners/vercel/worker": "./dist/runners/vercel/worker.mjs",
|
|
29
|
+
"./runners/vercel/queue-dev": "./dist/runners/vercel/queue-dev.mjs",
|
|
29
30
|
"./runners/netlify": "./dist/runners/netlify/runner.mjs",
|
|
30
31
|
"./runners/netlify/worker": "./dist/runners/netlify/worker.mjs",
|
|
31
32
|
"./vite": "./dist/vite.mjs"
|
|
@@ -42,30 +43,32 @@
|
|
|
42
43
|
"typecheck": "tsgo --noEmit --skipLibCheck"
|
|
43
44
|
},
|
|
44
45
|
"dependencies": {
|
|
45
|
-
"crossws": "^0.4.
|
|
46
|
+
"crossws": "^0.4.5",
|
|
46
47
|
"exsolve": "^1.0.8",
|
|
47
|
-
"httpxy": "^0.5.
|
|
48
|
-
"srvx": "^0.11.
|
|
48
|
+
"httpxy": "^0.5.3",
|
|
49
|
+
"srvx": "^0.11.15"
|
|
49
50
|
},
|
|
50
51
|
"devDependencies": {
|
|
51
|
-
"@netlify/runtime": "^4.1.
|
|
52
|
-
"@types/node": "^25.
|
|
53
|
-
"@typescript/native-preview": "
|
|
54
|
-
"@
|
|
52
|
+
"@netlify/runtime": "^4.1.24",
|
|
53
|
+
"@types/node": "^25.9.1",
|
|
54
|
+
"@typescript/native-preview": "7.0.0-dev.20260521.1",
|
|
55
|
+
"@vercel/queue": "^0.2.0",
|
|
56
|
+
"@vitest/coverage-v8": "^4.1.7",
|
|
55
57
|
"automd": "^0.4.3",
|
|
56
58
|
"changelogen": "^0.6.2",
|
|
57
59
|
"cjs-module-lexer": "^2.2.0",
|
|
58
60
|
"env-runner-fixture": "link:",
|
|
59
|
-
"miniflare": "^4.
|
|
60
|
-
"obuild": "^0.4.
|
|
61
|
-
"oxfmt": "^0.
|
|
62
|
-
"oxlint": "^1.
|
|
63
|
-
"typescript": "^6.0.
|
|
64
|
-
"vitest": "^4.1.
|
|
61
|
+
"miniflare": "^4.20260520.0",
|
|
62
|
+
"obuild": "^0.4.35",
|
|
63
|
+
"oxfmt": "^0.51.0",
|
|
64
|
+
"oxlint": "^1.66.0",
|
|
65
|
+
"typescript": "^6.0.3",
|
|
66
|
+
"vitest": "^4.1.7"
|
|
65
67
|
},
|
|
66
68
|
"peerDependencies": {
|
|
67
|
-
"@netlify/runtime": "^4",
|
|
68
|
-
"
|
|
69
|
+
"@netlify/runtime": "^4.1.23",
|
|
70
|
+
"@vercel/queue": "^0.2.0",
|
|
71
|
+
"miniflare": "^4.20260515.0"
|
|
69
72
|
},
|
|
70
73
|
"peerDependenciesMeta": {
|
|
71
74
|
"miniflare": {
|
|
@@ -73,7 +76,10 @@
|
|
|
73
76
|
},
|
|
74
77
|
"@netlify/runtime": {
|
|
75
78
|
"optional": true
|
|
79
|
+
},
|
|
80
|
+
"@vercel/queue": {
|
|
81
|
+
"optional": true
|
|
76
82
|
}
|
|
77
83
|
},
|
|
78
|
-
"packageManager": "pnpm@
|
|
84
|
+
"packageManager": "pnpm@11.2.2"
|
|
79
85
|
}
|