alchemy 2.0.0-beta.51 → 2.0.0-beta.52
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/bin/exec.js +16 -22
- package/bin/exec.js.map +1 -1
- package/lib/Apply.js +15 -3
- package/lib/Apply.js.map +1 -1
- package/lib/Auth/AuthProvider.js +1 -1
- package/lib/Auth/AuthProvider.js.map +1 -1
- package/lib/Binding.d.ts.map +1 -1
- package/lib/Binding.js +12 -8
- package/lib/Binding.js.map +1 -1
- package/lib/Build/DevServer.d.ts +113 -0
- package/lib/Build/DevServer.d.ts.map +1 -0
- package/lib/Build/DevServer.js +212 -0
- package/lib/Build/DevServer.js.map +1 -0
- package/lib/Build/Local.d.ts +2 -0
- package/lib/Build/Local.d.ts.map +1 -0
- package/lib/Build/Local.js +4 -0
- package/lib/Build/Local.js.map +1 -0
- package/lib/Bundle/Bundle.js +1 -1
- package/lib/Bundle/Bundle.js.map +1 -1
- package/lib/Cloudflare/Access.js +1 -1
- package/lib/Cloudflare/Access.js.map +1 -1
- package/lib/Cloudflare/AiGateway/AiGateway.d.ts +1 -1
- package/lib/Cloudflare/AiGateway/AiGateway.js +1 -1
- package/lib/Cloudflare/Browser/Browser.d.ts +84 -12
- package/lib/Cloudflare/Browser/Browser.d.ts.map +1 -1
- package/lib/Cloudflare/Browser/Browser.js +80 -9
- package/lib/Cloudflare/Browser/Browser.js.map +1 -1
- package/lib/Cloudflare/Browser/BrowserBinding.d.ts +90 -16
- package/lib/Cloudflare/Browser/BrowserBinding.d.ts.map +1 -1
- package/lib/Cloudflare/Browser/BrowserBinding.js +41 -6
- package/lib/Cloudflare/Browser/BrowserBinding.js.map +1 -1
- package/lib/Cloudflare/Browser/index.d.ts +1 -1
- package/lib/Cloudflare/Browser/index.d.ts.map +1 -1
- package/lib/Cloudflare/Browser/index.js.map +1 -1
- package/lib/Cloudflare/Container/ContainerBinding.d.ts.map +1 -1
- package/lib/Cloudflare/Container/ContainerBinding.js +2 -4
- package/lib/Cloudflare/Container/ContainerBinding.js.map +1 -1
- package/lib/Cloudflare/Images/Images.d.ts +4 -3
- package/lib/Cloudflare/Images/Images.d.ts.map +1 -1
- package/lib/Cloudflare/Images/Images.js.map +1 -1
- package/lib/Cloudflare/Providers.d.ts +1 -1
- package/lib/Cloudflare/Providers.d.ts.map +1 -1
- package/lib/Cloudflare/Providers.js +4 -1
- package/lib/Cloudflare/Providers.js.map +1 -1
- package/lib/Cloudflare/RateLimit/RateLimit.d.ts +4 -3
- package/lib/Cloudflare/RateLimit/RateLimit.d.ts.map +1 -1
- package/lib/Cloudflare/RateLimit/RateLimit.js.map +1 -1
- package/lib/Cloudflare/Website/StaticSite.d.ts +64 -12
- package/lib/Cloudflare/Website/StaticSite.d.ts.map +1 -1
- package/lib/Cloudflare/Website/StaticSite.js +80 -30
- package/lib/Cloudflare/Website/StaticSite.js.map +1 -1
- package/lib/Cloudflare/Website/Vite.d.ts +36 -7
- package/lib/Cloudflare/Website/Vite.d.ts.map +1 -1
- package/lib/Cloudflare/Website/Vite.js +26 -8
- package/lib/Cloudflare/Website/Vite.js.map +1 -1
- package/lib/Cloudflare/Workers/Assets.d.ts +10 -4
- package/lib/Cloudflare/Workers/Assets.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/Assets.js +6 -6
- package/lib/Cloudflare/Workers/Assets.js.map +1 -1
- package/lib/Cloudflare/Workers/DynamicWorkerLoader.d.ts +4 -4
- package/lib/Cloudflare/Workers/InferEnv.d.ts +1 -1
- package/lib/Cloudflare/Workers/InferEnv.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/LocalWorkerProvider.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/LocalWorkerProvider.js +45 -11
- package/lib/Cloudflare/Workers/LocalWorkerProvider.js.map +1 -1
- package/lib/Cloudflare/Workers/RpcDurableObjectNamespace.d.ts +5 -4
- package/lib/Cloudflare/Workers/RpcDurableObjectNamespace.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/RpcDurableObjectNamespace.js +4 -2
- package/lib/Cloudflare/Workers/RpcDurableObjectNamespace.js.map +1 -1
- package/lib/Cloudflare/Workers/RpcWorker.d.ts +3 -2
- package/lib/Cloudflare/Workers/RpcWorker.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/RpcWorker.js +5 -3
- package/lib/Cloudflare/Workers/RpcWorker.js.map +1 -1
- package/lib/Cloudflare/Workers/VersionMetadata.d.ts +99 -0
- package/lib/Cloudflare/Workers/VersionMetadata.d.ts.map +1 -0
- package/lib/Cloudflare/Workers/VersionMetadata.js +65 -0
- package/lib/Cloudflare/Workers/VersionMetadata.js.map +1 -0
- package/lib/Cloudflare/Workers/VersionMetadataBinding.d.ts +35 -0
- package/lib/Cloudflare/Workers/VersionMetadataBinding.d.ts.map +1 -0
- package/lib/Cloudflare/Workers/VersionMetadataBinding.js +31 -0
- package/lib/Cloudflare/Workers/VersionMetadataBinding.js.map +1 -0
- package/lib/Cloudflare/Workers/Worker.d.ts +18 -18
- package/lib/Cloudflare/Workers/Worker.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/Worker.js +23 -37
- package/lib/Cloudflare/Workers/Worker.js.map +1 -1
- package/lib/Cloudflare/Workers/WorkerAsyncBindings.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/WorkerAsyncBindings.js +7 -0
- package/lib/Cloudflare/Workers/WorkerAsyncBindings.js.map +1 -1
- package/lib/Cloudflare/Workers/WorkerBinding.d.ts +2 -1
- package/lib/Cloudflare/Workers/WorkerBinding.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/WorkerBinding.js.map +1 -1
- package/lib/Cloudflare/Workers/Workflow.d.ts +8 -1
- package/lib/Cloudflare/Workers/Workflow.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/Workflow.js +1 -0
- package/lib/Cloudflare/Workers/Workflow.js.map +1 -1
- package/lib/Cloudflare/Workers/WorkflowBridge.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/WorkflowBridge.js +31 -2
- package/lib/Cloudflare/Workers/WorkflowBridge.js.map +1 -1
- package/lib/Cloudflare/Workers/index.d.ts +2 -0
- package/lib/Cloudflare/Workers/index.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/index.js +2 -0
- package/lib/Cloudflare/Workers/index.js.map +1 -1
- package/lib/Cloudflare/Zaraz/ZarazConfig.d.ts.map +1 -1
- package/lib/Diff.d.ts.map +1 -1
- package/lib/Diff.js +7 -0
- package/lib/Diff.js.map +1 -1
- package/lib/Drizzle/Postgres.d.ts +13 -12
- package/lib/Drizzle/Postgres.d.ts.map +1 -1
- package/lib/Drizzle/Postgres.js +13 -12
- package/lib/Drizzle/Postgres.js.map +1 -1
- package/lib/Drizzle/Schema.d.ts +1 -1
- package/lib/Drizzle/Schema.d.ts.map +1 -1
- package/lib/Drizzle/Schema.js +14 -6
- package/lib/Drizzle/Schema.js.map +1 -1
- package/lib/Local/RpcSerialization.js +5 -2
- package/lib/Local/RpcSerialization.js.map +1 -1
- package/lib/Platform.d.ts.map +1 -1
- package/lib/Platform.js +27 -25
- package/lib/Platform.js.map +1 -1
- package/lib/Resource.d.ts +1 -1
- package/lib/Resource.d.ts.map +1 -1
- package/lib/Resource.js +9 -12
- package/lib/Resource.js.map +1 -1
- package/lib/Runtime.d.ts +1 -1
- package/lib/Runtime.d.ts.map +1 -1
- package/lib/Runtime.js +3 -4
- package/lib/Runtime.js.map +1 -1
- package/lib/Util/effect.d.ts.map +1 -1
- package/lib/Util/effect.js +13 -15
- package/lib/Util/effect.js.map +1 -1
- package/lib/Util/poll.d.ts +0 -1
- package/lib/Util/poll.d.ts.map +1 -1
- package/lib/Util/poll.js +2 -2
- package/lib/Util/poll.js.map +1 -1
- package/lib/tsconfig.test.tsbuildinfo +1 -1
- package/package.json +20 -20
- package/src/Apply.ts +22 -3
- package/src/Auth/AuthProvider.ts +1 -1
- package/src/Binding.ts +45 -38
- package/src/Build/DevServer.ts +330 -0
- package/src/Build/Local.ts +4 -0
- package/src/Bundle/Bundle.ts +1 -1
- package/src/Cloudflare/Access.ts +1 -1
- package/src/Cloudflare/AiGateway/AiGateway.ts +1 -1
- package/src/Cloudflare/Browser/Browser.ts +84 -12
- package/src/Cloudflare/Browser/BrowserBinding.ts +205 -33
- package/src/Cloudflare/Browser/index.ts +15 -2
- package/src/Cloudflare/Container/ContainerBinding.ts +5 -10
- package/src/Cloudflare/Images/Images.ts +4 -3
- package/src/Cloudflare/Providers.ts +5 -0
- package/src/Cloudflare/RateLimit/RateLimit.ts +4 -3
- package/src/Cloudflare/Website/StaticSite.ts +154 -41
- package/src/Cloudflare/Website/Vite.ts +73 -25
- package/src/Cloudflare/Workers/Assets.ts +10 -8
- package/src/Cloudflare/Workers/DynamicWorkerLoader.ts +4 -4
- package/src/Cloudflare/Workers/InferEnv.ts +14 -12
- package/src/Cloudflare/Workers/LocalWorkerProvider.ts +54 -13
- package/src/Cloudflare/Workers/RpcDurableObjectNamespace.ts +11 -8
- package/src/Cloudflare/Workers/RpcWorker.ts +8 -7
- package/src/Cloudflare/Workers/VersionMetadata.ts +129 -0
- package/src/Cloudflare/Workers/VersionMetadataBinding.ts +82 -0
- package/src/Cloudflare/Workers/Worker.ts +60 -81
- package/src/Cloudflare/Workers/WorkerAsyncBindings.ts +6 -0
- package/src/Cloudflare/Workers/WorkerBinding.ts +2 -0
- package/src/Cloudflare/Workers/Workflow.ts +12 -1
- package/src/Cloudflare/Workers/WorkflowBridge.ts +47 -6
- package/src/Cloudflare/Workers/index.ts +2 -0
- package/src/Diff.ts +7 -0
- package/src/Drizzle/Postgres.ts +13 -12
- package/src/Drizzle/Schema.ts +16 -6
- package/src/Local/RpcSerialization.ts +5 -2
- package/src/Platform.ts +36 -32
- package/src/Resource.ts +12 -13
- package/src/Runtime.ts +3 -7
- package/src/Util/effect.ts +13 -17
- package/src/Util/poll.ts +3 -3
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import * as Deferred from "effect/Deferred";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import * as Exit from "effect/Exit";
|
|
4
|
+
import * as Hash from "effect/Hash";
|
|
5
|
+
import * as Layer from "effect/Layer";
|
|
6
|
+
import * as Option from "effect/Option";
|
|
7
|
+
import * as Redacted from "effect/Redacted";
|
|
8
|
+
import * as Scope from "effect/Scope";
|
|
9
|
+
import * as Stream from "effect/Stream";
|
|
10
|
+
import { ChildProcess } from "effect/unstable/process";
|
|
11
|
+
import { ChildProcessSpawner, } from "effect/unstable/process/ChildProcessSpawner";
|
|
12
|
+
import { AlchemyContext } from "../AlchemyContext.js";
|
|
13
|
+
import { isResolved } from "../Diff.js";
|
|
14
|
+
import * as RpcProvider from "../Local/RpcProvider.js";
|
|
15
|
+
import * as Provider from "../Provider.js";
|
|
16
|
+
import { Resource } from "../Resource.js";
|
|
17
|
+
/**
|
|
18
|
+
* A long-lived shell process scoped to a stack instance, started during
|
|
19
|
+
* `alchemy dev` and restarted when inputs change. During deploy this is
|
|
20
|
+
* a no-op — `DevServer` resources only run in dev mode.
|
|
21
|
+
*
|
|
22
|
+
* The child process runs inside the dev sidecar so it survives
|
|
23
|
+
* user-code HMR restarts. Its stdout/stderr are mirrored to the
|
|
24
|
+
* terminal and scanned for the first `http(s)://…` URL, which is
|
|
25
|
+
* exposed as the `url` output attribute.
|
|
26
|
+
*
|
|
27
|
+
* @resource
|
|
28
|
+
*
|
|
29
|
+
* @section Basic Usage
|
|
30
|
+
* Pass a shell command that starts a long-lived dev server. Alchemy
|
|
31
|
+
* runs it in the background and extracts the first URL it prints.
|
|
32
|
+
*
|
|
33
|
+
* @example Start a Vite dev server
|
|
34
|
+
* ```typescript
|
|
35
|
+
* const dev = yield* DevServer("Frontend", {
|
|
36
|
+
* command: "npm run dev",
|
|
37
|
+
* });
|
|
38
|
+
* console.log(dev.url); // e.g. "http://localhost:5173"
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* @section Working Directory
|
|
42
|
+
* Use `cwd` to run the command in a subdirectory — useful in
|
|
43
|
+
* monorepos where each package has its own dev server.
|
|
44
|
+
*
|
|
45
|
+
* @example Monorepo package
|
|
46
|
+
* ```typescript
|
|
47
|
+
* const dev = yield* DevServer("Web", {
|
|
48
|
+
* command: "npm run dev",
|
|
49
|
+
* cwd: "apps/web",
|
|
50
|
+
* });
|
|
51
|
+
* ```
|
|
52
|
+
*
|
|
53
|
+
* @section Environment Variables
|
|
54
|
+
* Extra environment variables are merged on top of `process.env`.
|
|
55
|
+
* Sensitive values can be wrapped in `Redacted` to keep them out
|
|
56
|
+
* of logs and state files.
|
|
57
|
+
*
|
|
58
|
+
* @example Custom port and env
|
|
59
|
+
* ```typescript
|
|
60
|
+
* const dev = yield* DevServer("Api", {
|
|
61
|
+
* command: "npm run dev",
|
|
62
|
+
* env: {
|
|
63
|
+
* PORT: "4000",
|
|
64
|
+
* DATABASE_URL: Redacted.make("postgres://..."),
|
|
65
|
+
* },
|
|
66
|
+
* });
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
export const DevServer = Resource("Build.DevServer");
|
|
70
|
+
/**
|
|
71
|
+
* How long reconcile waits for a URL to appear in the child's output
|
|
72
|
+
* before giving up and returning `{ url: undefined }`. The child keeps
|
|
73
|
+
* running either way — this only bounds how long the deploy plan waits.
|
|
74
|
+
*
|
|
75
|
+
* Kept small because dev servers (vite, next, zola, …) print their URL
|
|
76
|
+
* within ~1s, and a long wait here just stalls `alchemy dev` startup
|
|
77
|
+
* for commands that never produce a URL.
|
|
78
|
+
*/
|
|
79
|
+
const URL_EXTRACT_TIMEOUT = "5 seconds";
|
|
80
|
+
// Matches the first plain http(s) URL. Stops at whitespace and at a small
|
|
81
|
+
// set of punctuation typically used to wrap URLs in log output.
|
|
82
|
+
const URL_REGEX = /https?:\/\/[^\s)\],"'`]+/;
|
|
83
|
+
// ECMA-262 ANSI/VT100 escape sequences — `Vite`, `Next`, etc. surround the
|
|
84
|
+
// URL with color codes that would otherwise be eaten by the URL regex.
|
|
85
|
+
// eslint-disable-next-line no-control-regex
|
|
86
|
+
const ANSI_REGEX = /\x1b\[[0-9;]*m/g;
|
|
87
|
+
/**
|
|
88
|
+
* Live-mode no-op. `DevServer` resources should only be created in dev mode;
|
|
89
|
+
* if one slips into a deploy, this is a noisy no-op rather than a crash.
|
|
90
|
+
*/
|
|
91
|
+
export const LiveDevServerProvider = () => Provider.effect(DevServer, Effect.succeed(DevServer.Provider.of({
|
|
92
|
+
diff: () => Effect.succeed({ action: "noop" }),
|
|
93
|
+
reconcile: () => Effect.succeed({}),
|
|
94
|
+
delete: () => Effect.void,
|
|
95
|
+
})));
|
|
96
|
+
/**
|
|
97
|
+
* Dev-mode provider. Runs inside the RPC sidecar so the child process
|
|
98
|
+
* outlives user-code restarts. Tracks instances in a module-level closure
|
|
99
|
+
* keyed by resource id; on `reconcile`, it diffs the props hash and either
|
|
100
|
+
* reuses the existing process or interrupts + respawns.
|
|
101
|
+
*/
|
|
102
|
+
export const LocalDevServerProvider = () => RpcProvider.effect(DevServer, import.meta.resolve(
|
|
103
|
+
// See LocalWorkerProvider — must match the on-disk extension of the
|
|
104
|
+
// sidecar entry file.
|
|
105
|
+
import.meta.url.endsWith(".ts") ? "./Local.ts" : "./Local.js", import.meta.url), Effect.gen(function* () {
|
|
106
|
+
const spawner = yield* ChildProcessSpawner;
|
|
107
|
+
// The provider's outer scope lives for the lifetime of the sidecar,
|
|
108
|
+
// which is exactly what we want: child processes get forked into
|
|
109
|
+
// sub-scopes off of this one, so they survive any single user-code
|
|
110
|
+
// restart but die when the sidecar shuts down.
|
|
111
|
+
const rootScope = yield* Effect.scope;
|
|
112
|
+
const instances = new Map();
|
|
113
|
+
const spawn = Effect.fn(function* (props, urlDeferred) {
|
|
114
|
+
const [command, ...args] = props.command.split(" ");
|
|
115
|
+
const handle = yield* spawner.spawn(ChildProcess.make(command, args, {
|
|
116
|
+
cwd: props.cwd ?? process.cwd(),
|
|
117
|
+
env: {
|
|
118
|
+
...process.env,
|
|
119
|
+
...Object.fromEntries(Object.entries(props.env ?? {}).map(([k, v]) => [
|
|
120
|
+
k,
|
|
121
|
+
Redacted.isRedacted(v) ? Redacted.value(v) : v,
|
|
122
|
+
])),
|
|
123
|
+
},
|
|
124
|
+
stdin: "inherit",
|
|
125
|
+
// Leave stdout/stderr piped so we can both mirror to the parent
|
|
126
|
+
// terminal AND parse lines for the first URL.
|
|
127
|
+
}));
|
|
128
|
+
// Mirror + extract on both streams, forked into the current scope so
|
|
129
|
+
// they're interrupted when the instance scope closes.
|
|
130
|
+
yield* mirrorAndExtract(handle.stdout, "stdout", urlDeferred).pipe(Effect.forkScoped);
|
|
131
|
+
yield* mirrorAndExtract(handle.stderr, "stderr", urlDeferred).pipe(Effect.forkScoped);
|
|
132
|
+
return handle;
|
|
133
|
+
});
|
|
134
|
+
const stop = Effect.fn(function* (id) {
|
|
135
|
+
const existing = instances.get(id);
|
|
136
|
+
if (existing) {
|
|
137
|
+
yield* existing.handle.kill();
|
|
138
|
+
yield* Scope.close(existing.scope, Exit.void);
|
|
139
|
+
instances.delete(id);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
const awaitUrl = (deferred) => Deferred.await(deferred).pipe(Effect.timeoutOption(URL_EXTRACT_TIMEOUT), Effect.map(Option.getOrUndefined));
|
|
143
|
+
return DevServer.Provider.of({
|
|
144
|
+
diff: Effect.fn(function* ({ id, news }) {
|
|
145
|
+
if (!isResolved(news))
|
|
146
|
+
return undefined;
|
|
147
|
+
const hash = Hash.structure(news);
|
|
148
|
+
if (instances.get(id)?.hash === hash) {
|
|
149
|
+
return { action: "noop" };
|
|
150
|
+
}
|
|
151
|
+
return { action: "update" };
|
|
152
|
+
}),
|
|
153
|
+
reconcile: Effect.fn(function* ({ id, news }) {
|
|
154
|
+
const hash = Hash.structure(news);
|
|
155
|
+
const existing = instances.get(id);
|
|
156
|
+
if (existing) {
|
|
157
|
+
if (existing.hash === hash && (yield* existing.handle.isRunning)) {
|
|
158
|
+
const url = yield* awaitUrl(existing.urlDeferred);
|
|
159
|
+
return { url };
|
|
160
|
+
}
|
|
161
|
+
yield* stop(id);
|
|
162
|
+
}
|
|
163
|
+
const scope = yield* Scope.fork(rootScope);
|
|
164
|
+
const urlDeferred = yield* Deferred.make();
|
|
165
|
+
const handle = yield* spawn(news, urlDeferred).pipe(Scope.provide(scope));
|
|
166
|
+
instances.set(id, { hash, handle, scope, urlDeferred });
|
|
167
|
+
const url = yield* awaitUrl(urlDeferred);
|
|
168
|
+
return { url };
|
|
169
|
+
}),
|
|
170
|
+
delete: Effect.fn(function* ({ id }) {
|
|
171
|
+
yield* stop(id);
|
|
172
|
+
}),
|
|
173
|
+
});
|
|
174
|
+
}));
|
|
175
|
+
/**
|
|
176
|
+
* Drains a child stdout/stderr stream into the matching parent stream while
|
|
177
|
+
* scanning each completed line for the first URL. Resolves `urlDeferred`
|
|
178
|
+
* the first time a URL is found (subsequent calls are no-ops).
|
|
179
|
+
*
|
|
180
|
+
* Modeled on `idempotent-spawn.ts`'s `extract` hook — single-pass over each
|
|
181
|
+
* line, ANSI escapes stripped before matching, with a buffer for incomplete
|
|
182
|
+
* trailing lines across chunk boundaries.
|
|
183
|
+
*/
|
|
184
|
+
const mirrorAndExtract = (source, sink, urlDeferred) => Effect.gen(function* () {
|
|
185
|
+
let lineBuffer = "";
|
|
186
|
+
const decoder = new TextDecoder("utf-8");
|
|
187
|
+
yield* Stream.runForEach(source, (chunk) => Effect.sync(() => {
|
|
188
|
+
// Pass the raw bytes through so terminal colors, cursor moves,
|
|
189
|
+
// progress bars etc. keep working.
|
|
190
|
+
process[sink].write(chunk);
|
|
191
|
+
lineBuffer += decoder.decode(chunk, { stream: true });
|
|
192
|
+
let newlineIdx = lineBuffer.indexOf("\n");
|
|
193
|
+
while (newlineIdx !== -1) {
|
|
194
|
+
const line = lineBuffer.slice(0, newlineIdx);
|
|
195
|
+
lineBuffer = lineBuffer.slice(newlineIdx + 1);
|
|
196
|
+
newlineIdx = lineBuffer.indexOf("\n");
|
|
197
|
+
const match = line.replace(ANSI_REGEX, "").match(URL_REGEX);
|
|
198
|
+
if (match) {
|
|
199
|
+
// Deferred.doneUnsafe is a synchronous fire-and-forget — first
|
|
200
|
+
// caller wins, subsequent calls are dropped, which is exactly
|
|
201
|
+
// what we want for "record the FIRST URL".
|
|
202
|
+
Deferred.doneUnsafe(urlDeferred, Effect.succeed(match[0]));
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}));
|
|
207
|
+
});
|
|
208
|
+
/**
|
|
209
|
+
* Selects the live or dev DevServer provider based on `AlchemyContext.dev`.
|
|
210
|
+
*/
|
|
211
|
+
export const DevServerProvider = () => Layer.unwrap(AlchemyContext.useSync((context) => context.dev ? LocalDevServerProvider() : LiveDevServerProvider()));
|
|
212
|
+
//# sourceMappingURL=DevServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DevServer.js","sourceRoot":"","sources":["../../src/Build/DevServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Local.d.ts","sourceRoot":"","sources":["../../src/Build/Local.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Local.js","sourceRoot":"","sources":["../../src/Build/Local.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,SAAS,MAAM,uBAAuB,CAAC;AAEnD,sBAAsB,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC"}
|
package/lib/Bundle/Bundle.js
CHANGED
|
@@ -11,7 +11,7 @@ import { purePlugin } from "./PurePlugin.js";
|
|
|
11
11
|
import { rawPlugin } from "./RawPlugin.js";
|
|
12
12
|
export class BundleError extends Schema.TaggedErrorClass()("BundleError", {
|
|
13
13
|
message: Schema.String,
|
|
14
|
-
cause: Schema.optional(Schema.
|
|
14
|
+
cause: Schema.optional(Schema.Defect({ includeStack: true })),
|
|
15
15
|
}) {
|
|
16
16
|
}
|
|
17
17
|
/**
|
package/lib/Bundle/Bundle.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Bundle.js","sourceRoot":"","sources":["../../src/Bundle/Bundle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,IAAI,MAAM,aAAa,CAAC;AACpC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EACL,oBAAoB,GAErB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,UAAU,EAA0B,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAgD3C,MAAM,OAAO,WAAY,SAAQ,MAAM,CAAC,gBAAgB,EAAe,CACrE,aAAa,EACb;IACE,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"Bundle.js","sourceRoot":"","sources":["../../src/Bundle/Bundle.ts"],"names":[],"mappings":"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"}
|
package/lib/Cloudflare/Access.js
CHANGED
|
@@ -9,7 +9,7 @@ import * as ChildProcessSpawner from "effect/unstable/process/ChildProcessSpawne
|
|
|
9
9
|
import { cachedFunction } from "../Util/cached-function.js";
|
|
10
10
|
export class AccessError extends Schema.TaggedErrorClass()("AccessError", {
|
|
11
11
|
message: Schema.String,
|
|
12
|
-
cause: Schema.optional(Schema.Defect),
|
|
12
|
+
cause: Schema.optional(Schema.Defect()),
|
|
13
13
|
}) {
|
|
14
14
|
}
|
|
15
15
|
export class Access extends Context.Service()("alchemy/Cloudflare/Access") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Access.js","sourceRoot":"","sources":["../../src/Cloudflare/Access.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,YAAY,MAAM,sCAAsC,CAAC;AACrE,OAAO,KAAK,mBAAmB,MAAM,6CAA6C,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,MAAM,OAAO,WAAY,SAAQ,MAAM,CAAC,gBAAgB,EAAe,CACrE,aAAa,EACb;IACE,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"Access.js","sourceRoot":"","sources":["../../src/Cloudflare/Access.ts"],"names":[],"mappings":"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"}
|
|
@@ -247,7 +247,7 @@ export declare const isAiGateway: (value: unknown) => value is AiGateway;
|
|
|
247
247
|
*
|
|
248
248
|
* export default class Api extends Cloudflare.Worker<Api>()(
|
|
249
249
|
* "Api",
|
|
250
|
-
* { main: import.meta.
|
|
250
|
+
* { main: import.meta.filename },
|
|
251
251
|
* Effect.gen(function* () {
|
|
252
252
|
* const aiGateway = yield* Cloudflare.AiGateway.bind(Gateway);
|
|
253
253
|
*
|
|
@@ -65,7 +65,7 @@ export const isAiGateway = (value) => typeof value === "object" &&
|
|
|
65
65
|
*
|
|
66
66
|
* export default class Api extends Cloudflare.Worker<Api>()(
|
|
67
67
|
* "Api",
|
|
68
|
-
* { main: import.meta.
|
|
68
|
+
* { main: import.meta.filename },
|
|
69
69
|
* Effect.gen(function* () {
|
|
70
70
|
* const aiGateway = yield* Cloudflare.AiGateway.bind(Gateway);
|
|
71
71
|
*
|
|
@@ -28,9 +28,10 @@ type BindEffect = Effect.Effect<BrowserClient, never, BrowserBinding>;
|
|
|
28
28
|
* Worker and returns the runtime {@link BrowserClient} — no separate
|
|
29
29
|
* `.bind(...)` step required.
|
|
30
30
|
*
|
|
31
|
-
* The divergence is achieved via `[Symbol.iterator]`: the object is
|
|
32
|
-
* `Effect` (so `InferEnv`
|
|
33
|
-
*
|
|
31
|
+
* The divergence is achieved via `[Symbol.iterator]`: the object is
|
|
32
|
+
* deliberately not an `Effect` (so `InferEnv` and the Worker `env` resolver
|
|
33
|
+
* keep it as the native `BrowserRun` rather than `yield*`-ing it), but it is
|
|
34
|
+
* iterable as one when `yield*`-ed.
|
|
34
35
|
*/
|
|
35
36
|
export interface Browser {
|
|
36
37
|
kind: BrowserTypeId;
|
|
@@ -46,7 +47,73 @@ export declare const isBrowser: (value: unknown) => value is Browser;
|
|
|
46
47
|
* @binding
|
|
47
48
|
*
|
|
48
49
|
* @section Effect-style Worker (recommended)
|
|
49
|
-
* @example
|
|
50
|
+
* @example Bind the runtime client and convert a page to Markdown
|
|
51
|
+
* Yielding the marker attaches the binding to the surrounding Worker and
|
|
52
|
+
* returns the runtime {@link BrowserClient}. Every `cf.BrowserRun` method is
|
|
53
|
+
* mirrored as an Effect, so no `Effect.tryPromise` wrapping is needed.
|
|
54
|
+
* ```typescript
|
|
55
|
+
* import * as Effect from "effect/Effect";
|
|
56
|
+
*
|
|
57
|
+
* Cloudflare.Worker(
|
|
58
|
+
* "BrowserWorker",
|
|
59
|
+
* { main: import.meta.filename },
|
|
60
|
+
* Effect.gen(function* () {
|
|
61
|
+
* const browser = yield* Cloudflare.Browser({ name: "BROWSER" });
|
|
62
|
+
*
|
|
63
|
+
* return {
|
|
64
|
+
* fetch: Effect.gen(function* () {
|
|
65
|
+
* return yield* browser.markdown({ url: "https://example.com" });
|
|
66
|
+
* }),
|
|
67
|
+
* };
|
|
68
|
+
* }).pipe(Effect.provide(Cloudflare.BrowserBindingLive)),
|
|
69
|
+
* );
|
|
70
|
+
* ```
|
|
71
|
+
*
|
|
72
|
+
* @section Quick Actions
|
|
73
|
+
* @example Render content, screenshot, PDF, and structured data
|
|
74
|
+
* JSON quick actions resolve to their parsed payload; binary actions
|
|
75
|
+
* (`screenshot`, `pdf`) resolve to a `Stream` of bytes. No `Promise` or
|
|
76
|
+
* `Response.json()` in sight.
|
|
77
|
+
* ```typescript
|
|
78
|
+
* import * as Effect from "effect/Effect";
|
|
79
|
+
* import * as Stream from "effect/Stream";
|
|
80
|
+
*
|
|
81
|
+
* const browser = yield* Cloudflare.Browser({ name: "BROWSER" });
|
|
82
|
+
* const url = "https://example.com";
|
|
83
|
+
*
|
|
84
|
+
* // HTML content — parsed payload, title lives in `meta`.
|
|
85
|
+
* const content = yield* browser.content({ url });
|
|
86
|
+
* const title = content.meta.title;
|
|
87
|
+
*
|
|
88
|
+
* // Scrape elements by CSS selector.
|
|
89
|
+
* yield* browser.scrape({ url, elements: [{ selector: "h1" }] });
|
|
90
|
+
*
|
|
91
|
+
* // Extract all links.
|
|
92
|
+
* const { result: links } = yield* browser.links({ url });
|
|
93
|
+
*
|
|
94
|
+
* // Binary actions stream bytes — collect or pipe them.
|
|
95
|
+
* const png = yield* browser.screenshot({ url }).pipe(Stream.runCollect);
|
|
96
|
+
* const pdf = yield* browser.pdf({ url }).pipe(Stream.runCollect);
|
|
97
|
+
*
|
|
98
|
+
* // AI-extracted structured data.
|
|
99
|
+
* yield* browser.json({ url, prompt: "Extract the page heading" });
|
|
100
|
+
* ```
|
|
101
|
+
*
|
|
102
|
+
* @example Call the generic `quickAction` directly
|
|
103
|
+
* The named methods are thin wrappers over `quickAction`, which mirrors
|
|
104
|
+
* `cf.BrowserRun["quickAction"]` one-to-one.
|
|
105
|
+
* ```typescript
|
|
106
|
+
* const browser = yield* Cloudflare.Browser({ name: "BROWSER" });
|
|
107
|
+
*
|
|
108
|
+
* const res = yield* browser.quickAction("snapshot", {
|
|
109
|
+
* url: "https://example.com",
|
|
110
|
+
* });
|
|
111
|
+
* ```
|
|
112
|
+
*
|
|
113
|
+
* @section Driving Puppeteer
|
|
114
|
+
* @example Use the raw `cf.BrowserRun` binding with `@cloudflare/puppeteer`
|
|
115
|
+
* `raw` hands you the underlying runtime binding. Puppeteer is promise-based,
|
|
116
|
+
* so this is the one place you reach for `Effect.tryPromise`.
|
|
50
117
|
* ```typescript
|
|
51
118
|
* import puppeteer from "@cloudflare/puppeteer";
|
|
52
119
|
* import * as Effect from "effect/Effect";
|
|
@@ -55,25 +122,30 @@ export declare const isBrowser: (value: unknown) => value is Browser;
|
|
|
55
122
|
* "BrowserWorker",
|
|
56
123
|
* { main: import.meta.filename },
|
|
57
124
|
* Effect.gen(function* () {
|
|
58
|
-
* // Attaches the binding to this Worker AND returns the runtime client.
|
|
59
125
|
* const browser = yield* Cloudflare.Browser({ name: "BROWSER" });
|
|
60
126
|
*
|
|
61
127
|
* return {
|
|
62
|
-
* fetch:
|
|
63
|
-
*
|
|
64
|
-
*
|
|
128
|
+
* fetch: Effect.gen(function* () {
|
|
129
|
+
* const binding = yield* browser.raw;
|
|
130
|
+
* const session = yield* Effect.tryPromise(() =>
|
|
131
|
+
* puppeteer.launch(binding),
|
|
132
|
+
* );
|
|
133
|
+
* try {
|
|
134
|
+
* const page = yield* Effect.tryPromise(() => session.newPage());
|
|
65
135
|
* yield* Effect.tryPromise(() => page.goto("https://example.com"));
|
|
66
136
|
* const title = yield* Effect.tryPromise(() => page.title());
|
|
67
137
|
* return Response.json({ title });
|
|
68
|
-
* }
|
|
69
|
-
*
|
|
138
|
+
* } finally {
|
|
139
|
+
* yield* Effect.promise(() => session.close());
|
|
140
|
+
* }
|
|
141
|
+
* }),
|
|
70
142
|
* };
|
|
71
143
|
* }).pipe(Effect.provide(Cloudflare.BrowserBindingLive)),
|
|
72
144
|
* );
|
|
73
145
|
* ```
|
|
74
146
|
*
|
|
75
147
|
* @section Worker binding metadata
|
|
76
|
-
* @example
|
|
148
|
+
* @example Declare the binding on `env`
|
|
77
149
|
* ```typescript
|
|
78
150
|
* export const Worker = Cloudflare.Worker("Worker", {
|
|
79
151
|
* main: "./src/worker.ts",
|
|
@@ -83,7 +155,7 @@ export declare const isBrowser: (value: unknown) => value is Browser;
|
|
|
83
155
|
* });
|
|
84
156
|
*
|
|
85
157
|
* export type WorkerEnv = Cloudflare.InferEnv<typeof Worker>;
|
|
86
|
-
* // { BROWSER:
|
|
158
|
+
* // { BROWSER: BrowserRun }
|
|
87
159
|
* ```
|
|
88
160
|
*
|
|
89
161
|
* @example Async-style worker with the raw runtime binding
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Browser.d.ts","sourceRoot":"","sources":["../../../src/Cloudflare/Browser/Browser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzE,KAAK,aAAa,GAAG,OAAO,aAAa,CAAC;AAC1C,QAAA,MAAM,aAAa,EAAG,oBAA6B,CAAC;AAEpD,MAAM,MAAM,YAAY,GAAG;IACzB;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF;;;;GAIG;AACH,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;AAEtE
|
|
1
|
+
{"version":3,"file":"Browser.d.ts","sourceRoot":"","sources":["../../../src/Cloudflare/Browser/Browser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzE,KAAK,aAAa,GAAG,OAAO,aAAa,CAAC;AAC1C,QAAA,MAAM,aAAa,EAAG,oBAA6B,CAAC;AAEpD,MAAM,MAAM,YAAY,GAAG;IACzB;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF;;;;GAIG;AACH,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;AAEtE;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,IAAI,UAAU,CAAC;IACvB,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;CAC/D;AAED,eAAO,MAAM,SAAS,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,OACqB,CAAC;AAE1E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2IG;AACH,eAAO,MAAM,OAAO,EAAE;IACpB,CAAC,KAAK,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC;IAChC;;;;OAIG;IACH,IAAI,EAAE,OAAO,cAAc,CAAC,IAAI,CAAC;CAelC,CAAC"}
|
|
@@ -9,7 +9,73 @@ export const isBrowser = (value) => typeof value === "object" && value?.kind ===
|
|
|
9
9
|
* @binding
|
|
10
10
|
*
|
|
11
11
|
* @section Effect-style Worker (recommended)
|
|
12
|
-
* @example
|
|
12
|
+
* @example Bind the runtime client and convert a page to Markdown
|
|
13
|
+
* Yielding the marker attaches the binding to the surrounding Worker and
|
|
14
|
+
* returns the runtime {@link BrowserClient}. Every `cf.BrowserRun` method is
|
|
15
|
+
* mirrored as an Effect, so no `Effect.tryPromise` wrapping is needed.
|
|
16
|
+
* ```typescript
|
|
17
|
+
* import * as Effect from "effect/Effect";
|
|
18
|
+
*
|
|
19
|
+
* Cloudflare.Worker(
|
|
20
|
+
* "BrowserWorker",
|
|
21
|
+
* { main: import.meta.filename },
|
|
22
|
+
* Effect.gen(function* () {
|
|
23
|
+
* const browser = yield* Cloudflare.Browser({ name: "BROWSER" });
|
|
24
|
+
*
|
|
25
|
+
* return {
|
|
26
|
+
* fetch: Effect.gen(function* () {
|
|
27
|
+
* return yield* browser.markdown({ url: "https://example.com" });
|
|
28
|
+
* }),
|
|
29
|
+
* };
|
|
30
|
+
* }).pipe(Effect.provide(Cloudflare.BrowserBindingLive)),
|
|
31
|
+
* );
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* @section Quick Actions
|
|
35
|
+
* @example Render content, screenshot, PDF, and structured data
|
|
36
|
+
* JSON quick actions resolve to their parsed payload; binary actions
|
|
37
|
+
* (`screenshot`, `pdf`) resolve to a `Stream` of bytes. No `Promise` or
|
|
38
|
+
* `Response.json()` in sight.
|
|
39
|
+
* ```typescript
|
|
40
|
+
* import * as Effect from "effect/Effect";
|
|
41
|
+
* import * as Stream from "effect/Stream";
|
|
42
|
+
*
|
|
43
|
+
* const browser = yield* Cloudflare.Browser({ name: "BROWSER" });
|
|
44
|
+
* const url = "https://example.com";
|
|
45
|
+
*
|
|
46
|
+
* // HTML content — parsed payload, title lives in `meta`.
|
|
47
|
+
* const content = yield* browser.content({ url });
|
|
48
|
+
* const title = content.meta.title;
|
|
49
|
+
*
|
|
50
|
+
* // Scrape elements by CSS selector.
|
|
51
|
+
* yield* browser.scrape({ url, elements: [{ selector: "h1" }] });
|
|
52
|
+
*
|
|
53
|
+
* // Extract all links.
|
|
54
|
+
* const { result: links } = yield* browser.links({ url });
|
|
55
|
+
*
|
|
56
|
+
* // Binary actions stream bytes — collect or pipe them.
|
|
57
|
+
* const png = yield* browser.screenshot({ url }).pipe(Stream.runCollect);
|
|
58
|
+
* const pdf = yield* browser.pdf({ url }).pipe(Stream.runCollect);
|
|
59
|
+
*
|
|
60
|
+
* // AI-extracted structured data.
|
|
61
|
+
* yield* browser.json({ url, prompt: "Extract the page heading" });
|
|
62
|
+
* ```
|
|
63
|
+
*
|
|
64
|
+
* @example Call the generic `quickAction` directly
|
|
65
|
+
* The named methods are thin wrappers over `quickAction`, which mirrors
|
|
66
|
+
* `cf.BrowserRun["quickAction"]` one-to-one.
|
|
67
|
+
* ```typescript
|
|
68
|
+
* const browser = yield* Cloudflare.Browser({ name: "BROWSER" });
|
|
69
|
+
*
|
|
70
|
+
* const res = yield* browser.quickAction("snapshot", {
|
|
71
|
+
* url: "https://example.com",
|
|
72
|
+
* });
|
|
73
|
+
* ```
|
|
74
|
+
*
|
|
75
|
+
* @section Driving Puppeteer
|
|
76
|
+
* @example Use the raw `cf.BrowserRun` binding with `@cloudflare/puppeteer`
|
|
77
|
+
* `raw` hands you the underlying runtime binding. Puppeteer is promise-based,
|
|
78
|
+
* so this is the one place you reach for `Effect.tryPromise`.
|
|
13
79
|
* ```typescript
|
|
14
80
|
* import puppeteer from "@cloudflare/puppeteer";
|
|
15
81
|
* import * as Effect from "effect/Effect";
|
|
@@ -18,25 +84,30 @@ export const isBrowser = (value) => typeof value === "object" && value?.kind ===
|
|
|
18
84
|
* "BrowserWorker",
|
|
19
85
|
* { main: import.meta.filename },
|
|
20
86
|
* Effect.gen(function* () {
|
|
21
|
-
* // Attaches the binding to this Worker AND returns the runtime client.
|
|
22
87
|
* const browser = yield* Cloudflare.Browser({ name: "BROWSER" });
|
|
23
88
|
*
|
|
24
89
|
* return {
|
|
25
|
-
* fetch:
|
|
26
|
-
*
|
|
27
|
-
*
|
|
90
|
+
* fetch: Effect.gen(function* () {
|
|
91
|
+
* const binding = yield* browser.raw;
|
|
92
|
+
* const session = yield* Effect.tryPromise(() =>
|
|
93
|
+
* puppeteer.launch(binding),
|
|
94
|
+
* );
|
|
95
|
+
* try {
|
|
96
|
+
* const page = yield* Effect.tryPromise(() => session.newPage());
|
|
28
97
|
* yield* Effect.tryPromise(() => page.goto("https://example.com"));
|
|
29
98
|
* const title = yield* Effect.tryPromise(() => page.title());
|
|
30
99
|
* return Response.json({ title });
|
|
31
|
-
* }
|
|
32
|
-
*
|
|
100
|
+
* } finally {
|
|
101
|
+
* yield* Effect.promise(() => session.close());
|
|
102
|
+
* }
|
|
103
|
+
* }),
|
|
33
104
|
* };
|
|
34
105
|
* }).pipe(Effect.provide(Cloudflare.BrowserBindingLive)),
|
|
35
106
|
* );
|
|
36
107
|
* ```
|
|
37
108
|
*
|
|
38
109
|
* @section Worker binding metadata
|
|
39
|
-
* @example
|
|
110
|
+
* @example Declare the binding on `env`
|
|
40
111
|
* ```typescript
|
|
41
112
|
* export const Worker = Cloudflare.Worker("Worker", {
|
|
42
113
|
* main: "./src/worker.ts",
|
|
@@ -46,7 +117,7 @@ export const isBrowser = (value) => typeof value === "object" && value?.kind ===
|
|
|
46
117
|
* });
|
|
47
118
|
*
|
|
48
119
|
* export type WorkerEnv = Cloudflare.InferEnv<typeof Worker>;
|
|
49
|
-
* // { BROWSER:
|
|
120
|
+
* // { BROWSER: BrowserRun }
|
|
50
121
|
* ```
|
|
51
122
|
*
|
|
52
123
|
* @example Async-style worker with the raw runtime binding
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Browser.js","sourceRoot":"","sources":["../../../src/Cloudflare/Browser/Browser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAsB,MAAM,qBAAqB,CAAC;AAGzE,MAAM,aAAa,GAAG,oBAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"Browser.js","sourceRoot":"","sources":["../../../src/Cloudflare/Browser/Browser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAsB,MAAM,qBAAqB,CAAC;AAGzE,MAAM,aAAa,GAAG,oBAA6B,CAAC;AAyCpD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAc,EAAoB,EAAE,CAC5D,OAAO,KAAK,KAAK,QAAQ,IAAK,KAAiB,EAAE,IAAI,KAAK,aAAa,CAAC;AAE1E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2IG;AACH,MAAM,CAAC,MAAM,OAAO,GAQhB,MAAM,CAAC,MAAM,CACf,CAAC,KAAoB,EAAW,EAAE;IAChC,MAAM,IAAI,GAAY;QACpB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,SAAS;QAC9B,QAAQ,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;QACzC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,aAAa,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KACtE,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC,EACD;IACE,IAAI,EAAE,CAAC,GAAG,IAA4C,EAAE,EAAE,CACxD,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC/B,CACF,CAAC"}
|