env-runner 0.1.6 → 0.1.8

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.
Files changed (49) hide show
  1. package/README.md +39 -9
  2. package/dist/_chunks/base-runner.d.mts +0 -3
  3. package/dist/_chunks/base-runner.mjs +0 -2
  4. package/dist/_chunks/libs/cjs-module-lexer.mjs +0 -2
  5. package/dist/_chunks/runner.d.mts +0 -3
  6. package/dist/_chunks/runner.mjs +17 -8
  7. package/dist/_chunks/runner2.d.mts +8 -3
  8. package/dist/_chunks/runner2.mjs +17 -42
  9. package/dist/_chunks/runner3.d.mts +16 -0
  10. package/dist/_chunks/runner3.mjs +60 -0
  11. package/dist/_chunks/runner4.d.mts +14 -0
  12. package/dist/_chunks/runner4.mjs +93 -0
  13. package/dist/_chunks/runner5.d.mts +14 -0
  14. package/dist/_chunks/runner5.mjs +45 -0
  15. package/dist/_chunks/server.mjs +3 -15
  16. package/dist/_chunks/types.d.mts +0 -3
  17. package/dist/_chunks/worker-utils.mjs +0 -6
  18. package/dist/cli.mjs +0 -2
  19. package/dist/index.d.mts +6 -11
  20. package/dist/index.mjs +3 -2
  21. package/dist/runners/bun-process/runner.d.mts +0 -3
  22. package/dist/runners/bun-process/runner.mjs +0 -2
  23. package/dist/runners/bun-process/worker.mjs +0 -2
  24. package/dist/runners/deno-process/runner.d.mts +1 -1
  25. package/dist/runners/deno-process/runner.mjs +0 -1
  26. package/dist/runners/deno-process/worker.mjs +31 -10
  27. package/dist/runners/miniflare/runner.d.mts +1 -1
  28. package/dist/runners/miniflare/runner.mjs +0 -2
  29. package/dist/runners/netlify/runner.d.mts +3 -0
  30. package/dist/runners/netlify/runner.mjs +2 -0
  31. package/dist/runners/netlify/worker.d.mts +1 -0
  32. package/dist/runners/netlify/worker.mjs +41 -0
  33. package/dist/runners/node-process/runner.d.mts +0 -3
  34. package/dist/runners/node-process/runner.mjs +0 -2
  35. package/dist/runners/node-process/worker.mjs +0 -2
  36. package/dist/runners/node-worker/runner.d.mts +2 -18
  37. package/dist/runners/node-worker/runner.mjs +1 -61
  38. package/dist/runners/node-worker/worker.mjs +0 -2
  39. package/dist/runners/self/runner.d.mts +2 -7
  40. package/dist/runners/self/runner.mjs +0 -2
  41. package/dist/runners/vercel/queue-dev.d.mts +44 -0
  42. package/dist/runners/vercel/queue-dev.mjs +36 -0
  43. package/dist/runners/vercel/runner.d.mts +3 -0
  44. package/dist/runners/vercel/runner.mjs +2 -0
  45. package/dist/runners/vercel/worker.d.mts +1 -0
  46. package/dist/runners/vercel/worker.mjs +51 -0
  47. package/dist/vite.d.mts +0 -3
  48. package/dist/vite.mjs +0 -14
  49. package/package.json +34 -18
@@ -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,32 +161,28 @@ 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),
175
167
  "bun-process": () => import("env-runner/runners/bun-process").then((m) => m.BunProcessEnvRunner),
176
168
  "deno-process": () => import("env-runner/runners/deno-process").then((m) => m.DenoProcessEnvRunner),
177
169
  self: () => import("env-runner/runners/self").then((m) => m.SelfEnvRunner),
178
- miniflare: () => import("env-runner/runners/miniflare").then((m) => m.MiniflareEnvRunner)
170
+ miniflare: () => import("env-runner/runners/miniflare").then((m) => m.MiniflareEnvRunner),
171
+ vercel: () => import("env-runner/runners/vercel").then((m) => m.VercelEnvRunner),
172
+ netlify: () => import("env-runner/runners/netlify").then((m) => m.NetlifyEnvRunner)
179
173
  };
180
174
  async function loadRunner(runner, opts) {
181
175
  return new (await (loaders[runner]()))(opts);
182
176
  }
183
- //#endregion
184
- //#region src/server.ts
185
177
  var EnvServer = class extends RunnerManager {
186
178
  _opts;
187
179
  _watchers = [];
188
180
  _reloadTimeout;
189
181
  _reloadListeners = /* @__PURE__ */ new Set();
190
182
  runner = null;
191
- /** Register a listener called when the runner is reloaded due to a file change. */
192
183
  onReload(listener) {
193
184
  this._reloadListeners.add(listener);
194
185
  }
195
- /** Remove a previously registered reload listener. */
196
186
  offReload(listener) {
197
187
  this._reloadListeners.delete(listener);
198
188
  }
@@ -200,7 +190,6 @@ var EnvServer = class extends RunnerManager {
200
190
  super();
201
191
  this._opts = opts;
202
192
  }
203
- /** Start the server by loading and attaching the runner. */
204
193
  async start() {
205
194
  this.runner = await this._createRunner();
206
195
  await this.reload(this.runner);
@@ -249,5 +238,4 @@ var EnvServer = class extends RunnerManager {
249
238
  }, 100);
250
239
  }
251
240
  };
252
- //#endregion
253
241
  export { loadRunner as n, RunnerManager as r, EnvServer as t };
@@ -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
@@ -2,10 +2,10 @@ import { a as RunnerMessageListener, c as UpgradeHandler, i as RPCOptions, l as
2
2
  import { n as EnvRunnerData, t as BaseEnvRunner } from "./_chunks/base-runner.mjs";
3
3
  import { t as DenoProcessEnvRunner } from "./_chunks/runner.mjs";
4
4
  import { i as TransformResult, n as MiniflareEnvRunnerOptions, r as MiniflareExportInfo, t as MiniflareEnvRunner } from "./_chunks/runner2.mjs";
5
+ import { t as VercelEnvRunner } from "./_chunks/runner4.mjs";
6
+ import { t as NetlifyEnvRunner } from "./_chunks/runner5.mjs";
5
7
  import { ServerOptions } from "srvx";
6
8
  import { Hooks } from "crossws";
7
-
8
- //#region src/manager.d.ts
9
9
  /**
10
10
  * Manages an active `EnvRunner` instance, proxying all calls to it.
11
11
  * Supports hot-reload, auto-restart on unexpected exit, and message queueing.
@@ -44,19 +44,17 @@ declare class RunnerManager implements EnvRunner {
44
44
  private _waitForRunner;
45
45
  private _flushQueue;
46
46
  }
47
- //#endregion
48
- //#region src/loader.d.ts
49
- type RunnerName = "node-worker" | "node-process" | "bun-process" | "deno-process" | "self" | "miniflare";
47
+ type RunnerName = "node-worker" | "node-process" | "bun-process" | "deno-process" | "self" | "miniflare" | "vercel" | "netlify";
50
48
  interface LoadRunnerOptions {
51
49
  name: string;
52
50
  workerEntry?: string;
53
51
  hooks?: WorkerHooks;
54
52
  data?: EnvRunnerData;
55
53
  execArgv?: string[];
54
+ /** Additional runner-specific options (passed through to the runner constructor). */
55
+ [key: string]: unknown;
56
56
  }
57
57
  declare function loadRunner(runner: RunnerName, opts: LoadRunnerOptions): Promise<EnvRunner>;
58
- //#endregion
59
- //#region src/server.d.ts
60
58
  interface EnvServerOptions {
61
59
  /** Runner implementation to use. */
62
60
  runner: RunnerName;
@@ -94,8 +92,6 @@ declare class EnvServer extends RunnerManager {
94
92
  private _stopWatching;
95
93
  private _scheduleReload;
96
94
  }
97
- //#endregion
98
- //#region src/common/worker-utils.d.ts
99
95
  interface AppEntryIPCContext {
100
96
  sendMessage: (message: unknown) => void;
101
97
  }
@@ -112,5 +108,4 @@ interface AppEntry {
112
108
  plugins?: ServerOptions["plugins"];
113
109
  ipc?: AppEntryIPC;
114
110
  }
115
- //#endregion
116
- 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, type NodeUpgradeContext, type RPCOptions, RunnerManager, type RunnerMessageListener, type RunnerName, type RunnerRPCHooks, type TransformResult, type UpgradeContext, type UpgradeHandler, type WorkerAddress, type WorkerHooks, loadRunner };
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 };
package/dist/index.mjs CHANGED
@@ -1,6 +1,7 @@
1
1
  import { t as BaseEnvRunner } from "./_chunks/base-runner.mjs";
2
2
  import { n as loadRunner, r as RunnerManager, t as EnvServer } from "./_chunks/server.mjs";
3
3
  import { t as DenoProcessEnvRunner } from "./_chunks/runner.mjs";
4
- import "./_chunks/libs/cjs-module-lexer.mjs";
5
4
  import { t as MiniflareEnvRunner } from "./_chunks/runner2.mjs";
6
- export { BaseEnvRunner, DenoProcessEnvRunner, EnvServer, MiniflareEnvRunner, RunnerManager, loadRunner };
5
+ import { t as VercelEnvRunner } from "./_chunks/runner4.mjs";
6
+ import { t as NetlifyEnvRunner } from "./_chunks/runner5.mjs";
7
+ export { BaseEnvRunner, DenoProcessEnvRunner, EnvServer, MiniflareEnvRunner, NetlifyEnvRunner, RunnerManager, VercelEnvRunner, 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,3 +1,2 @@
1
- import "../../_chunks/base-runner.mjs";
2
1
  import { t as DenoProcessEnvRunner } from "../../_chunks/runner.mjs";
3
2
  export { DenoProcessEnvRunner };
@@ -1,10 +1,11 @@
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
- const sendMessage = (message) => process.send(message);
6
+ const _stdout = globalThis.Deno?.stdout ? { write: (s) => globalThis.Deno.stdout.writeSync(new TextEncoder().encode(s)) } : process.stdout;
7
+ const sendMessage = (message) => _stdout.write(JSON.stringify(message) + "\n");
8
+ const _stdin = globalThis.Deno?.stdin?.readable || process.stdin;
8
9
  const server = serve({
9
10
  port: 0,
10
11
  hostname: "127.0.0.1",
@@ -23,20 +24,40 @@ if (entry.upgrade) server.node?.server?.on("upgrade", (req, socket, head) => {
23
24
  } });
24
25
  });
25
26
  if (entry.ipc) await entry.ipc.onOpen?.({ sendMessage });
26
- process.send({ address: parseServerAddress(server) });
27
- process.on("message", async (message) => {
27
+ sendMessage({ address: parseServerAddress(server) });
28
+ async function readMessages() {
29
+ const decoder = new TextDecoder();
30
+ let buffer = "";
31
+ for await (const chunk of _stdin) {
32
+ buffer += decoder.decode(chunk, { stream: true });
33
+ let newlineIdx;
34
+ while ((newlineIdx = buffer.indexOf("\n")) !== -1) {
35
+ const line = buffer.slice(0, newlineIdx);
36
+ buffer = buffer.slice(newlineIdx + 1);
37
+ if (!line) continue;
38
+ let message;
39
+ try {
40
+ message = JSON.parse(line);
41
+ } catch {
42
+ continue;
43
+ }
44
+ await handleMessage(message);
45
+ }
46
+ }
47
+ }
48
+ async function handleMessage(message) {
28
49
  if (message?.event === "shutdown") {
29
50
  Promise.resolve(entry.ipc?.onClose?.()).then(() => server.close()).then(() => {
30
- process.send({ event: "exit" });
51
+ sendMessage({ event: "exit" });
31
52
  });
32
53
  return;
33
54
  }
34
55
  if (message?.event === "reload-module") {
35
56
  try {
36
57
  entry = await reloadEntryModule(data.entry, entry, sendMessage);
37
- process.send({ event: "module-reloaded" });
58
+ sendMessage({ event: "module-reloaded" });
38
59
  } catch (error) {
39
- process.send({
60
+ sendMessage({
40
61
  event: "module-reloaded",
41
62
  error: error?.message || String(error)
42
63
  });
@@ -44,13 +65,13 @@ process.on("message", async (message) => {
44
65
  return;
45
66
  }
46
67
  if (message?.type === "ping") {
47
- process.send({
68
+ sendMessage({
48
69
  type: "pong",
49
70
  data: message.data
50
71
  });
51
72
  return;
52
73
  }
53
74
  entry.ipc?.onMessage?.(message);
54
- });
55
- //#endregion
75
+ }
76
+ readMessages().catch(() => {});
56
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,4 +1,2 @@
1
- import "../../_chunks/base-runner.mjs";
2
- import "../../_chunks/libs/cjs-module-lexer.mjs";
3
1
  import { t as MiniflareEnvRunner } from "../../_chunks/runner2.mjs";
4
2
  export { MiniflareEnvRunner };
@@ -0,0 +1,3 @@
1
+ import { n as EnvRunnerData } from "../../_chunks/base-runner.mjs";
2
+ import { t as NetlifyEnvRunner } from "../../_chunks/runner5.mjs";
3
+ export { type EnvRunnerData, NetlifyEnvRunner };
@@ -0,0 +1,2 @@
1
+ import { t as NetlifyEnvRunner } from "../../_chunks/runner5.mjs";
2
+ export { NetlifyEnvRunner };
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,41 @@
1
+ try {
2
+ const { startRuntime } = await import("@netlify/runtime");
3
+ startRuntime({
4
+ deployID: "0",
5
+ siteID: "0",
6
+ env: {
7
+ get: (key) => process.env[key],
8
+ has: (key) => key in process.env,
9
+ set: (key, value) => {
10
+ process.env[key] = value;
11
+ },
12
+ delete: (key) => {
13
+ delete process.env[key];
14
+ },
15
+ toObject: () => ({ ...process.env })
16
+ },
17
+ getRequestContext: () => null,
18
+ cache: { getCacheAPIContext: () => null }
19
+ });
20
+ } catch {
21
+ if (!process.env.__ENV_RUNNER_NETLIFY_WARNED) {
22
+ process.env.__ENV_RUNNER_NETLIFY_WARNED = "1";
23
+ console.warn("@netlify/runtime is not installed. Install it for full Netlify runtime emulation: npx nypm i -D @netlify/runtime");
24
+ }
25
+ globalThis.Netlify = {
26
+ context: null,
27
+ env: {
28
+ get: (key) => process.env[key],
29
+ has: (key) => key in process.env,
30
+ set: (key, value) => {
31
+ process.env[key] = value;
32
+ },
33
+ delete: (key) => {
34
+ delete process.env[key];
35
+ },
36
+ toObject: () => ({ ...process.env })
37
+ }
38
+ };
39
+ }
40
+ await import("../node-worker/worker.mjs");
41
+ export {};
@@ -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 {};
@@ -1,19 +1,3 @@
1
- import { u as WorkerHooks } from "../../_chunks/types.mjs";
2
- import { n as EnvRunnerData, t as BaseEnvRunner } from "../../_chunks/base-runner.mjs";
3
-
4
- //#region src/runners/node-worker/runner.d.ts
5
- declare class NodeWorkerEnvRunner extends BaseEnvRunner {
6
- #private;
7
- constructor(opts: {
8
- name: string;
9
- workerEntry?: string;
10
- hooks?: WorkerHooks;
11
- data?: EnvRunnerData;
12
- });
13
- sendMessage(message: unknown): void;
14
- protected _hasRuntime(): boolean;
15
- protected _runtimeType(): string;
16
- protected _closeRuntime(): Promise<void>;
17
- }
18
- //#endregion
1
+ import { n as EnvRunnerData } from "../../_chunks/base-runner.mjs";
2
+ import { t as NodeWorkerEnvRunner } from "../../_chunks/runner3.mjs";
19
3
  export { type EnvRunnerData, NodeWorkerEnvRunner };
@@ -1,62 +1,2 @@
1
- import { t as BaseEnvRunner } from "../../_chunks/base-runner.mjs";
2
- import { existsSync } from "node:fs";
3
- import { fileURLToPath } from "node:url";
4
- import { Worker } from "node:worker_threads";
5
- //#region src/runners/node-worker/runner.ts
6
- let _defaultEntry;
7
- var NodeWorkerEnvRunner = class extends BaseEnvRunner {
8
- #worker;
9
- constructor(opts) {
10
- _defaultEntry ||= fileURLToPath(import.meta.resolve("env-runner/runners/node-worker/worker"));
11
- super({
12
- ...opts,
13
- workerEntry: opts.workerEntry || _defaultEntry
14
- });
15
- this.#initWorker();
16
- }
17
- sendMessage(message) {
18
- if (!this.#worker) throw new Error("Node env worker should be initialized before sending messages.");
19
- this.#worker.postMessage(message);
20
- }
21
- _hasRuntime() {
22
- return Boolean(this.#worker);
23
- }
24
- _runtimeType() {
25
- return "worker";
26
- }
27
- async _closeRuntime() {
28
- if (!this.#worker) return;
29
- this.#worker.removeAllListeners();
30
- await this.#worker.terminate().catch((error) => {
31
- console.error(error);
32
- });
33
- this.#worker = void 0;
34
- }
35
- #initWorker() {
36
- if (!existsSync(this._workerEntry)) {
37
- this.close(`worker entry not found in "${this._workerEntry}".`);
38
- return;
39
- }
40
- const worker = new Worker(this._workerEntry, {
41
- env: { ...process.env },
42
- workerData: {
43
- name: this._name,
44
- ...this._data
45
- }
46
- });
47
- worker.once("exit", (code) => {
48
- worker._exitCode = code;
49
- this.close(`worker exited with code ${code}`);
50
- });
51
- worker.once("error", (error) => {
52
- console.error(`Worker error:`, error);
53
- this.close(error);
54
- });
55
- worker.on("message", (message) => {
56
- this._handleMessage(message);
57
- });
58
- this.#worker = worker;
59
- }
60
- };
61
- //#endregion
1
+ import { t as NodeWorkerEnvRunner } from "../../_chunks/runner3.mjs";
62
2
  export { NodeWorkerEnvRunner };
@@ -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: node_http0.IncomingMessage;
18
- socket: node_net0.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 };
@@ -0,0 +1,3 @@
1
+ import { n as EnvRunnerData } from "../../_chunks/base-runner.mjs";
2
+ import { t as VercelEnvRunner } from "../../_chunks/runner4.mjs";
3
+ export { type EnvRunnerData, VercelEnvRunner };
@@ -0,0 +1,2 @@
1
+ import { t as VercelEnvRunner } from "../../_chunks/runner4.mjs";
2
+ export { VercelEnvRunner };