alchemy 2.0.0-beta.23 → 2.0.0-beta.25
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/alchemy.js +12574 -2451
- package/bin/alchemy.js.map +1 -1
- package/bin/alchemy.ts +2 -0
- package/bin/cli.js +18 -0
- package/bin/commands/bootstrap.ts +88 -4
- package/bin/commands/deploy.ts +54 -20
- package/bin/commands/dev.ts +45 -0
- package/bin/exec.ts +22 -0
- package/lib/AdoptPolicy.d.ts +2 -2
- package/lib/AdoptPolicy.d.ts.map +1 -1
- package/lib/AdoptPolicy.js.map +1 -1
- package/lib/AlchemyContext.d.ts +1 -0
- package/lib/AlchemyContext.d.ts.map +1 -1
- package/lib/AlchemyContext.js +1 -0
- package/lib/AlchemyContext.js.map +1 -1
- package/lib/Build/Command.d.ts.map +1 -1
- package/lib/Build/Command.js +8 -1
- package/lib/Build/Command.js.map +1 -1
- package/lib/Bundle/Bundle.d.ts +21 -9
- package/lib/Bundle/Bundle.d.ts.map +1 -1
- package/lib/Bundle/Bundle.js +29 -15
- package/lib/Bundle/Bundle.js.map +1 -1
- package/lib/Cloudflare/Local/Sidecar.d.ts +27 -0
- package/lib/Cloudflare/Local/Sidecar.d.ts.map +1 -0
- package/lib/Cloudflare/Local/Sidecar.js +24 -0
- package/lib/Cloudflare/Local/Sidecar.js.map +1 -0
- package/lib/Cloudflare/Local/SidecarHandlers.d.ts +5 -0
- package/lib/Cloudflare/Local/SidecarHandlers.d.ts.map +1 -0
- package/lib/Cloudflare/Local/SidecarHandlers.js +119 -0
- package/lib/Cloudflare/Local/SidecarHandlers.js.map +1 -0
- package/lib/Cloudflare/Local/SidecarServer.d.ts +2 -0
- package/lib/Cloudflare/Local/SidecarServer.d.ts.map +1 -0
- package/lib/Cloudflare/Local/SidecarServer.js +27 -0
- package/lib/Cloudflare/Local/SidecarServer.js.map +1 -0
- package/lib/Cloudflare/SecretsStore/Secret.d.ts.map +1 -1
- package/lib/Cloudflare/SecretsStore/Secret.js +55 -7
- package/lib/Cloudflare/SecretsStore/Secret.js.map +1 -1
- package/lib/Cloudflare/SecretsStore/SecretsStore.d.ts.map +1 -1
- package/lib/Cloudflare/SecretsStore/SecretsStore.js +35 -11
- package/lib/Cloudflare/SecretsStore/SecretsStore.js.map +1 -1
- package/lib/Cloudflare/StateStore/State.d.ts +35 -0
- package/lib/Cloudflare/StateStore/State.d.ts.map +1 -1
- package/lib/Cloudflare/StateStore/State.js +187 -45
- package/lib/Cloudflare/StateStore/State.js.map +1 -1
- package/lib/Cloudflare/StateStore/index.d.ts +1 -1
- package/lib/Cloudflare/StateStore/index.d.ts.map +1 -1
- package/lib/Cloudflare/StateStore/index.js +1 -1
- package/lib/Cloudflare/StateStore/index.js.map +1 -1
- package/lib/Cloudflare/Workers/Compatibility.d.ts +6 -0
- package/lib/Cloudflare/Workers/Compatibility.d.ts.map +1 -0
- package/lib/Cloudflare/Workers/Compatibility.js +10 -0
- package/lib/Cloudflare/Workers/Compatibility.js.map +1 -0
- package/lib/Cloudflare/Workers/LocalWorkerProvider.d.ts +7 -0
- package/lib/Cloudflare/Workers/LocalWorkerProvider.d.ts.map +1 -0
- package/lib/Cloudflare/Workers/LocalWorkerProvider.js +81 -0
- package/lib/Cloudflare/Workers/LocalWorkerProvider.js.map +1 -0
- package/lib/Cloudflare/Workers/Worker.d.ts +3 -1
- package/lib/Cloudflare/Workers/Worker.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/Worker.js +89 -31
- package/lib/Cloudflare/Workers/Worker.js.map +1 -1
- package/lib/Cloudflare/Workers/WorkerBundle.d.ts +31 -0
- package/lib/Cloudflare/Workers/WorkerBundle.d.ts.map +1 -0
- package/lib/Cloudflare/Workers/WorkerBundle.js +174 -0
- package/lib/Cloudflare/Workers/WorkerBundle.js.map +1 -0
- package/lib/Cloudflare/Workers/WorkerName.d.ts +3 -0
- package/lib/Cloudflare/Workers/WorkerName.d.ts.map +1 -0
- package/lib/Cloudflare/Workers/WorkerName.js +9 -0
- package/lib/Cloudflare/Workers/WorkerName.js.map +1 -0
- package/lib/Cloudflare/Workers/index.d.ts +1 -0
- package/lib/Cloudflare/Workers/index.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/index.js +1 -0
- package/lib/Cloudflare/Workers/index.js.map +1 -1
- package/lib/Platform.d.ts +1 -1
- package/lib/Platform.d.ts.map +1 -1
- package/lib/Sidecar/Lock.d.ts +24 -0
- package/lib/Sidecar/Lock.d.ts.map +1 -0
- package/lib/Sidecar/Lock.js +102 -0
- package/lib/Sidecar/Lock.js.map +1 -0
- package/lib/Sidecar/RpcClient.d.ts +15 -0
- package/lib/Sidecar/RpcClient.d.ts.map +1 -0
- package/lib/Sidecar/RpcClient.js +75 -0
- package/lib/Sidecar/RpcClient.js.map +1 -0
- package/lib/Sidecar/RpcHandler.d.ts +48 -0
- package/lib/Sidecar/RpcHandler.d.ts.map +1 -0
- package/lib/Sidecar/RpcHandler.js +64 -0
- package/lib/Sidecar/RpcHandler.js.map +1 -0
- package/lib/Sidecar/RpcPaths.d.ts +14 -0
- package/lib/Sidecar/RpcPaths.d.ts.map +1 -0
- package/lib/Sidecar/RpcPaths.js +22 -0
- package/lib/Sidecar/RpcPaths.js.map +1 -0
- package/lib/Sidecar/RpcServer.d.ts +10 -0
- package/lib/Sidecar/RpcServer.d.ts.map +1 -0
- package/lib/Sidecar/RpcServer.js +50 -0
- package/lib/Sidecar/RpcServer.js.map +1 -0
- package/lib/Sidecar/RpcTransport.d.ts +22 -0
- package/lib/Sidecar/RpcTransport.d.ts.map +1 -0
- package/lib/Sidecar/RpcTransport.js +81 -0
- package/lib/Sidecar/RpcTransport.js.map +1 -0
- package/lib/Telemetry/Metrics.d.ts +15 -0
- package/lib/Telemetry/Metrics.d.ts.map +1 -1
- package/lib/Telemetry/Metrics.js +20 -0
- package/lib/Telemetry/Metrics.js.map +1 -1
- package/lib/Util/PlatformServices.d.ts +3 -0
- package/lib/Util/PlatformServices.d.ts.map +1 -1
- package/lib/Util/PlatformServices.js +13 -0
- package/lib/Util/PlatformServices.js.map +1 -1
- package/lib/Util/layer-scoped.d.ts +16 -0
- package/lib/Util/layer-scoped.d.ts.map +1 -0
- package/lib/Util/layer-scoped.js +14 -0
- package/lib/Util/layer-scoped.js.map +1 -0
- package/package.json +4 -2
- package/src/AdoptPolicy.ts +9 -9
- package/src/AlchemyContext.ts +2 -0
- package/src/Build/Command.ts +8 -1
- package/src/Bundle/Bundle.ts +65 -25
- package/src/Cloudflare/Local/Sidecar.ts +44 -0
- package/src/Cloudflare/Local/SidecarHandlers.ts +182 -0
- package/src/Cloudflare/Local/SidecarServer.ts +57 -0
- package/src/Cloudflare/SecretsStore/Secret.ts +78 -7
- package/src/Cloudflare/SecretsStore/SecretsStore.ts +47 -12
- package/src/Cloudflare/StateStore/State.ts +281 -64
- package/src/Cloudflare/StateStore/index.ts +1 -1
- package/src/Cloudflare/Workers/Compatibility.ts +12 -0
- package/src/Cloudflare/Workers/LocalWorkerProvider.ts +93 -0
- package/src/Cloudflare/Workers/Worker.ts +151 -55
- package/src/Cloudflare/Workers/WorkerBundle.ts +234 -0
- package/src/Cloudflare/Workers/WorkerName.ts +10 -0
- package/src/Cloudflare/Workers/index.ts +1 -0
- package/src/Platform.ts +1 -1
- package/src/Sidecar/Lock.ts +190 -0
- package/src/Sidecar/RpcClient.ts +141 -0
- package/src/Sidecar/RpcHandler.ts +169 -0
- package/src/Sidecar/RpcPaths.ts +29 -0
- package/src/Sidecar/RpcServer.ts +80 -0
- package/src/Sidecar/RpcTransport.ts +85 -0
- package/src/Telemetry/Metrics.ts +38 -0
- package/src/Util/PlatformServices.ts +19 -0
- package/src/Util/layer-scoped.ts +25 -0
package/src/Telemetry/Metrics.ts
CHANGED
|
@@ -30,6 +30,24 @@ export const cliCounter = Metric.counter("alchemy.cli.invocations", {
|
|
|
30
30
|
incremental: true,
|
|
31
31
|
});
|
|
32
32
|
|
|
33
|
+
/**
|
|
34
|
+
* Counter for Cloudflare State Store bootstrap/deploy operations.
|
|
35
|
+
* Tagged per call with `op` (e.g. `deploy`) and `status`
|
|
36
|
+
* (`success`/`error`) so that the deploy success rate of the
|
|
37
|
+
* state store itself can be tracked separately from regular
|
|
38
|
+
* resource lifecycle ops.
|
|
39
|
+
*/
|
|
40
|
+
export const stateStoreCounter = Metric.counter(
|
|
41
|
+
"alchemy.state_store.operations",
|
|
42
|
+
{
|
|
43
|
+
description:
|
|
44
|
+
"Number of Cloudflare State Store deploy/bootstrap operations dispatched by alchemy.",
|
|
45
|
+
incremental: true,
|
|
46
|
+
},
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
export type StateStoreOp = "deploy";
|
|
50
|
+
|
|
33
51
|
/**
|
|
34
52
|
* Wraps a resource lifecycle Effect to record a counter + timer entry,
|
|
35
53
|
* tagged with `resource_type`, `op`, and `status` (`success`/`error`).
|
|
@@ -75,6 +93,26 @@ export const recordCli =
|
|
|
75
93
|
),
|
|
76
94
|
);
|
|
77
95
|
|
|
96
|
+
/**
|
|
97
|
+
* Wraps a Cloudflare State Store deploy/bootstrap Effect to bump
|
|
98
|
+
* {@link stateStoreCounter} with the outcome (`success`/`error`),
|
|
99
|
+
* tagged with the given `op`.
|
|
100
|
+
*/
|
|
101
|
+
export const recordStateStoreOp =
|
|
102
|
+
(op: StateStoreOp) =>
|
|
103
|
+
<A, E, R>(self: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> =>
|
|
104
|
+
self.pipe(
|
|
105
|
+
Effect.onExit((exit) =>
|
|
106
|
+
Metric.update(
|
|
107
|
+
Metric.withAttributes(stateStoreCounter, {
|
|
108
|
+
op,
|
|
109
|
+
status: Exit.isSuccess(exit) ? "success" : "error",
|
|
110
|
+
}),
|
|
111
|
+
1,
|
|
112
|
+
),
|
|
113
|
+
),
|
|
114
|
+
);
|
|
115
|
+
|
|
78
116
|
export type ResourceOp = "precreate" | "create" | "update" | "delete" | "read";
|
|
79
117
|
|
|
80
118
|
const elapsed = (startNs: bigint): Duration.Duration =>
|
|
@@ -5,6 +5,8 @@ import type { Path } from "effect/Path";
|
|
|
5
5
|
import type { Teardown } from "effect/Runtime";
|
|
6
6
|
import type { Stdio } from "effect/Stdio";
|
|
7
7
|
import type { Terminal } from "effect/Terminal";
|
|
8
|
+
import type { HttpServer } from "effect/unstable/http/HttpServer";
|
|
9
|
+
import type { ServeError } from "effect/unstable/http/HttpServerError";
|
|
8
10
|
import type { ChildProcessSpawner } from "effect/unstable/process/ChildProcessSpawner";
|
|
9
11
|
import type { WebSocketConstructor } from "effect/unstable/socket/Socket";
|
|
10
12
|
|
|
@@ -60,3 +62,20 @@ export const runMain = <E, A>(
|
|
|
60
62
|
);
|
|
61
63
|
}
|
|
62
64
|
};
|
|
65
|
+
|
|
66
|
+
export const httpServer = (
|
|
67
|
+
port: number = 0,
|
|
68
|
+
host: string = "localhost",
|
|
69
|
+
): Layer.Layer<HttpServer, ServeError> =>
|
|
70
|
+
Effect.promise(async () => {
|
|
71
|
+
if (isBun) {
|
|
72
|
+
const BunHttpServer = await import("@effect/platform-bun/BunHttpServer");
|
|
73
|
+
return BunHttpServer.layer({ hostname: host, port });
|
|
74
|
+
} else {
|
|
75
|
+
const [NodeHttpServer, Http] = await Promise.all([
|
|
76
|
+
import("@effect/platform-node/NodeHttpServer"),
|
|
77
|
+
import("node:http"),
|
|
78
|
+
]);
|
|
79
|
+
return NodeHttpServer.layerServer(Http.createServer, { host, port });
|
|
80
|
+
}
|
|
81
|
+
}).pipe(Layer.unwrap);
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type * as Context from "effect/Context";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import * as Layer from "effect/Layer";
|
|
4
|
+
import type * as Scope from "effect/Scope";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Builds a layer with the current scope.
|
|
8
|
+
* @param layer - The layer to build.
|
|
9
|
+
* @returns A scoped effect returning a Context with the provided layer.
|
|
10
|
+
*/
|
|
11
|
+
export const buildLayerScoped = <ROut, E, RIn>(
|
|
12
|
+
layer: Layer.Layer<ROut, E, RIn>,
|
|
13
|
+
): Effect.Effect<Context.Context<ROut>, E, RIn | Scope.Scope> =>
|
|
14
|
+
Effect.flatMap(Effect.scope, (scope) => Layer.buildWithScope(layer, scope));
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Builds a layer with the current scope and provides it to the given effect.
|
|
18
|
+
* @param layer - The layer to build.
|
|
19
|
+
*/
|
|
20
|
+
export const provideLayerScoped =
|
|
21
|
+
<ROut, E1, RIn>(layer: Layer.Layer<ROut, E1, RIn>) =>
|
|
22
|
+
<A, E2, R>(effect: Effect.Effect<A, E2, R>) =>
|
|
23
|
+
Effect.flatMap(buildLayerScoped(layer), (context) =>
|
|
24
|
+
Effect.provideContext(effect, context),
|
|
25
|
+
);
|