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.
Files changed (138) hide show
  1. package/bin/alchemy.js +12574 -2451
  2. package/bin/alchemy.js.map +1 -1
  3. package/bin/alchemy.ts +2 -0
  4. package/bin/cli.js +18 -0
  5. package/bin/commands/bootstrap.ts +88 -4
  6. package/bin/commands/deploy.ts +54 -20
  7. package/bin/commands/dev.ts +45 -0
  8. package/bin/exec.ts +22 -0
  9. package/lib/AdoptPolicy.d.ts +2 -2
  10. package/lib/AdoptPolicy.d.ts.map +1 -1
  11. package/lib/AdoptPolicy.js.map +1 -1
  12. package/lib/AlchemyContext.d.ts +1 -0
  13. package/lib/AlchemyContext.d.ts.map +1 -1
  14. package/lib/AlchemyContext.js +1 -0
  15. package/lib/AlchemyContext.js.map +1 -1
  16. package/lib/Build/Command.d.ts.map +1 -1
  17. package/lib/Build/Command.js +8 -1
  18. package/lib/Build/Command.js.map +1 -1
  19. package/lib/Bundle/Bundle.d.ts +21 -9
  20. package/lib/Bundle/Bundle.d.ts.map +1 -1
  21. package/lib/Bundle/Bundle.js +29 -15
  22. package/lib/Bundle/Bundle.js.map +1 -1
  23. package/lib/Cloudflare/Local/Sidecar.d.ts +27 -0
  24. package/lib/Cloudflare/Local/Sidecar.d.ts.map +1 -0
  25. package/lib/Cloudflare/Local/Sidecar.js +24 -0
  26. package/lib/Cloudflare/Local/Sidecar.js.map +1 -0
  27. package/lib/Cloudflare/Local/SidecarHandlers.d.ts +5 -0
  28. package/lib/Cloudflare/Local/SidecarHandlers.d.ts.map +1 -0
  29. package/lib/Cloudflare/Local/SidecarHandlers.js +119 -0
  30. package/lib/Cloudflare/Local/SidecarHandlers.js.map +1 -0
  31. package/lib/Cloudflare/Local/SidecarServer.d.ts +2 -0
  32. package/lib/Cloudflare/Local/SidecarServer.d.ts.map +1 -0
  33. package/lib/Cloudflare/Local/SidecarServer.js +27 -0
  34. package/lib/Cloudflare/Local/SidecarServer.js.map +1 -0
  35. package/lib/Cloudflare/SecretsStore/Secret.d.ts.map +1 -1
  36. package/lib/Cloudflare/SecretsStore/Secret.js +55 -7
  37. package/lib/Cloudflare/SecretsStore/Secret.js.map +1 -1
  38. package/lib/Cloudflare/SecretsStore/SecretsStore.d.ts.map +1 -1
  39. package/lib/Cloudflare/SecretsStore/SecretsStore.js +35 -11
  40. package/lib/Cloudflare/SecretsStore/SecretsStore.js.map +1 -1
  41. package/lib/Cloudflare/StateStore/State.d.ts +35 -0
  42. package/lib/Cloudflare/StateStore/State.d.ts.map +1 -1
  43. package/lib/Cloudflare/StateStore/State.js +187 -45
  44. package/lib/Cloudflare/StateStore/State.js.map +1 -1
  45. package/lib/Cloudflare/StateStore/index.d.ts +1 -1
  46. package/lib/Cloudflare/StateStore/index.d.ts.map +1 -1
  47. package/lib/Cloudflare/StateStore/index.js +1 -1
  48. package/lib/Cloudflare/StateStore/index.js.map +1 -1
  49. package/lib/Cloudflare/Workers/Compatibility.d.ts +6 -0
  50. package/lib/Cloudflare/Workers/Compatibility.d.ts.map +1 -0
  51. package/lib/Cloudflare/Workers/Compatibility.js +10 -0
  52. package/lib/Cloudflare/Workers/Compatibility.js.map +1 -0
  53. package/lib/Cloudflare/Workers/LocalWorkerProvider.d.ts +7 -0
  54. package/lib/Cloudflare/Workers/LocalWorkerProvider.d.ts.map +1 -0
  55. package/lib/Cloudflare/Workers/LocalWorkerProvider.js +81 -0
  56. package/lib/Cloudflare/Workers/LocalWorkerProvider.js.map +1 -0
  57. package/lib/Cloudflare/Workers/Worker.d.ts +3 -1
  58. package/lib/Cloudflare/Workers/Worker.d.ts.map +1 -1
  59. package/lib/Cloudflare/Workers/Worker.js +89 -31
  60. package/lib/Cloudflare/Workers/Worker.js.map +1 -1
  61. package/lib/Cloudflare/Workers/WorkerBundle.d.ts +31 -0
  62. package/lib/Cloudflare/Workers/WorkerBundle.d.ts.map +1 -0
  63. package/lib/Cloudflare/Workers/WorkerBundle.js +174 -0
  64. package/lib/Cloudflare/Workers/WorkerBundle.js.map +1 -0
  65. package/lib/Cloudflare/Workers/WorkerName.d.ts +3 -0
  66. package/lib/Cloudflare/Workers/WorkerName.d.ts.map +1 -0
  67. package/lib/Cloudflare/Workers/WorkerName.js +9 -0
  68. package/lib/Cloudflare/Workers/WorkerName.js.map +1 -0
  69. package/lib/Cloudflare/Workers/index.d.ts +1 -0
  70. package/lib/Cloudflare/Workers/index.d.ts.map +1 -1
  71. package/lib/Cloudflare/Workers/index.js +1 -0
  72. package/lib/Cloudflare/Workers/index.js.map +1 -1
  73. package/lib/Platform.d.ts +1 -1
  74. package/lib/Platform.d.ts.map +1 -1
  75. package/lib/Sidecar/Lock.d.ts +24 -0
  76. package/lib/Sidecar/Lock.d.ts.map +1 -0
  77. package/lib/Sidecar/Lock.js +102 -0
  78. package/lib/Sidecar/Lock.js.map +1 -0
  79. package/lib/Sidecar/RpcClient.d.ts +15 -0
  80. package/lib/Sidecar/RpcClient.d.ts.map +1 -0
  81. package/lib/Sidecar/RpcClient.js +75 -0
  82. package/lib/Sidecar/RpcClient.js.map +1 -0
  83. package/lib/Sidecar/RpcHandler.d.ts +48 -0
  84. package/lib/Sidecar/RpcHandler.d.ts.map +1 -0
  85. package/lib/Sidecar/RpcHandler.js +64 -0
  86. package/lib/Sidecar/RpcHandler.js.map +1 -0
  87. package/lib/Sidecar/RpcPaths.d.ts +14 -0
  88. package/lib/Sidecar/RpcPaths.d.ts.map +1 -0
  89. package/lib/Sidecar/RpcPaths.js +22 -0
  90. package/lib/Sidecar/RpcPaths.js.map +1 -0
  91. package/lib/Sidecar/RpcServer.d.ts +10 -0
  92. package/lib/Sidecar/RpcServer.d.ts.map +1 -0
  93. package/lib/Sidecar/RpcServer.js +50 -0
  94. package/lib/Sidecar/RpcServer.js.map +1 -0
  95. package/lib/Sidecar/RpcTransport.d.ts +22 -0
  96. package/lib/Sidecar/RpcTransport.d.ts.map +1 -0
  97. package/lib/Sidecar/RpcTransport.js +81 -0
  98. package/lib/Sidecar/RpcTransport.js.map +1 -0
  99. package/lib/Telemetry/Metrics.d.ts +15 -0
  100. package/lib/Telemetry/Metrics.d.ts.map +1 -1
  101. package/lib/Telemetry/Metrics.js +20 -0
  102. package/lib/Telemetry/Metrics.js.map +1 -1
  103. package/lib/Util/PlatformServices.d.ts +3 -0
  104. package/lib/Util/PlatformServices.d.ts.map +1 -1
  105. package/lib/Util/PlatformServices.js +13 -0
  106. package/lib/Util/PlatformServices.js.map +1 -1
  107. package/lib/Util/layer-scoped.d.ts +16 -0
  108. package/lib/Util/layer-scoped.d.ts.map +1 -0
  109. package/lib/Util/layer-scoped.js +14 -0
  110. package/lib/Util/layer-scoped.js.map +1 -0
  111. package/package.json +4 -2
  112. package/src/AdoptPolicy.ts +9 -9
  113. package/src/AlchemyContext.ts +2 -0
  114. package/src/Build/Command.ts +8 -1
  115. package/src/Bundle/Bundle.ts +65 -25
  116. package/src/Cloudflare/Local/Sidecar.ts +44 -0
  117. package/src/Cloudflare/Local/SidecarHandlers.ts +182 -0
  118. package/src/Cloudflare/Local/SidecarServer.ts +57 -0
  119. package/src/Cloudflare/SecretsStore/Secret.ts +78 -7
  120. package/src/Cloudflare/SecretsStore/SecretsStore.ts +47 -12
  121. package/src/Cloudflare/StateStore/State.ts +281 -64
  122. package/src/Cloudflare/StateStore/index.ts +1 -1
  123. package/src/Cloudflare/Workers/Compatibility.ts +12 -0
  124. package/src/Cloudflare/Workers/LocalWorkerProvider.ts +93 -0
  125. package/src/Cloudflare/Workers/Worker.ts +151 -55
  126. package/src/Cloudflare/Workers/WorkerBundle.ts +234 -0
  127. package/src/Cloudflare/Workers/WorkerName.ts +10 -0
  128. package/src/Cloudflare/Workers/index.ts +1 -0
  129. package/src/Platform.ts +1 -1
  130. package/src/Sidecar/Lock.ts +190 -0
  131. package/src/Sidecar/RpcClient.ts +141 -0
  132. package/src/Sidecar/RpcHandler.ts +169 -0
  133. package/src/Sidecar/RpcPaths.ts +29 -0
  134. package/src/Sidecar/RpcServer.ts +80 -0
  135. package/src/Sidecar/RpcTransport.ts +85 -0
  136. package/src/Telemetry/Metrics.ts +38 -0
  137. package/src/Util/PlatformServices.ts +19 -0
  138. package/src/Util/layer-scoped.ts +25 -0
@@ -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
+ );