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.
- package/README.md +39 -9
- 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 +17 -8
- package/dist/_chunks/runner2.d.mts +8 -3
- package/dist/_chunks/runner2.mjs +17 -42
- package/dist/_chunks/runner3.d.mts +16 -0
- package/dist/_chunks/runner3.mjs +60 -0
- package/dist/_chunks/runner4.d.mts +14 -0
- package/dist/_chunks/runner4.mjs +93 -0
- package/dist/_chunks/runner5.d.mts +14 -0
- package/dist/_chunks/runner5.mjs +45 -0
- package/dist/_chunks/server.mjs +3 -15
- 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 +6 -11
- package/dist/index.mjs +3 -2
- 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/runner.mjs +0 -1
- package/dist/runners/deno-process/worker.mjs +31 -10
- package/dist/runners/miniflare/runner.d.mts +1 -1
- package/dist/runners/miniflare/runner.mjs +0 -2
- package/dist/runners/netlify/runner.d.mts +3 -0
- package/dist/runners/netlify/runner.mjs +2 -0
- package/dist/runners/netlify/worker.d.mts +1 -0
- package/dist/runners/netlify/worker.mjs +41 -0
- 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 +2 -18
- package/dist/runners/node-worker/runner.mjs +1 -61
- 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 +3 -0
- package/dist/runners/vercel/runner.mjs +2 -0
- package/dist/runners/vercel/worker.d.mts +1 -0
- package/dist/runners/vercel/worker.mjs +51 -0
- package/dist/vite.d.mts +0 -3
- package/dist/vite.mjs +0 -14
- package/package.json +34 -18
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,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 };
|
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
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,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
|
|
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
|
-
|
|
27
|
-
|
|
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
|
-
|
|
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
|
-
|
|
58
|
+
sendMessage({ event: "module-reloaded" });
|
|
38
59
|
} catch (error) {
|
|
39
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 };
|
|
@@ -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 {
|
|
2
|
-
import {
|
|
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
|
|
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:
|
|
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 };
|