alchemy-effect 0.7.1 → 0.9.0
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-effect.js +29 -21
- package/bin/alchemy-effect.js.map +1 -1
- package/bin/alchemy-effect.ts +32 -68
- package/lib/cli/index.d.ts +1 -0
- package/lib/cli/index.d.ts.map +1 -1
- package/package.json +3 -2
- package/src/AWS/AutoScaling/LaunchTemplate.ts +5 -4
- package/src/AWS/EC2/Instance.ts +3 -4
- package/src/AWS/ECS/Task.ts +36 -34
- package/src/AWS/Lambda/Function.ts +68 -68
- package/src/Apply.ts +2 -0
- package/src/Artifacts.ts +10 -1
- package/src/Binding.ts +20 -5
- package/src/Cloudflare/Container.ts +210 -109
- package/src/Cloudflare/D1/D1Database.ts +32 -32
- package/src/Cloudflare/KV/Delete.ts +7 -5
- package/src/Cloudflare/KV/Get.ts +5 -5
- package/src/Cloudflare/KV/GetWithMetadata.ts +5 -5
- package/src/Cloudflare/KV/{Namespace.ts → KVNamespace.ts} +6 -6
- package/src/Cloudflare/KV/{NamespaceBinding.ts → KVNamespaceBinding.ts} +2 -2
- package/src/Cloudflare/KV/List.ts +5 -5
- package/src/Cloudflare/KV/Put.ts +5 -5
- package/src/Cloudflare/KV/index.ts +1 -1
- package/src/Cloudflare/Providers.ts +2 -8
- package/src/Cloudflare/R2/{Bucket.ts → R2Bucket.ts} +19 -19
- package/src/Cloudflare/R2/R2BucketBinding.ts +322 -0
- package/src/Cloudflare/R2/index.ts +2 -9
- package/src/Cloudflare/Workers/Assets.ts +11 -5
- package/src/Cloudflare/Workers/DurableObject.ts +4 -33
- package/src/Cloudflare/Workers/HttpServer.ts +1 -0
- package/src/Cloudflare/Workers/InferEnv.ts +23 -0
- package/src/Cloudflare/Workers/WebSocket.ts +4 -3
- package/src/Cloudflare/Workers/Worker.ts +480 -165
- package/src/Cloudflare/Workers/cloudflare_workers.ts +13 -21
- package/src/Cloudflare/Workers/index.ts +1 -0
- package/src/Cloudflare/index.ts +2 -2
- package/src/Platform.ts +36 -55
- package/src/Provider.ts +1 -0
- package/src/Resource.ts +3 -2
- package/src/Stack.ts +5 -4
- package/src/Test/Bun.ts +207 -0
- package/src/Util/ConfigProvider.ts +25 -0
- package/src/Util/FileLogger.ts +22 -0
- package/src/Util/effect.ts +24 -0
- package/src/Cloudflare/R2/BucketBinding.ts +0 -31
- package/src/Cloudflare/R2/CreateMultipartUpload.ts +0 -59
- package/src/Cloudflare/R2/DeleteObject.ts +0 -41
- package/src/Cloudflare/R2/GetObject.ts +0 -47
- package/src/Cloudflare/R2/HeadObject.ts +0 -41
- package/src/Cloudflare/R2/ListObjects.ts +0 -45
- package/src/Cloudflare/R2/MultipartUploadClient.ts +0 -40
- package/src/Cloudflare/R2/PutObject.ts +0 -55
- package/src/Cloudflare/R2/ResumeMultipartUpload.ts +0 -48
- package/src/Cloudflare/R2/UploadValue.ts +0 -10
package/bin/alchemy-effect.ts
CHANGED
|
@@ -4,7 +4,6 @@ import * as Config from "effect/Config";
|
|
|
4
4
|
import * as ConfigProvider from "effect/ConfigProvider";
|
|
5
5
|
import * as Console from "effect/Console";
|
|
6
6
|
import * as Effect from "effect/Effect";
|
|
7
|
-
import * as FileSystem from "effect/FileSystem";
|
|
8
7
|
import * as Layer from "effect/Layer";
|
|
9
8
|
import * as Logger from "effect/Logger";
|
|
10
9
|
import * as Option from "effect/Option";
|
|
@@ -27,12 +26,14 @@ import {
|
|
|
27
26
|
import * as AWSCredentials from "../src/AWS/Credentials.ts";
|
|
28
27
|
import * as AWSRegion from "../src/AWS/Region.ts";
|
|
29
28
|
import * as CLI from "../src/Cli/index.ts";
|
|
30
|
-
import {
|
|
29
|
+
import { dotAlchemy } from "../src/Config.ts";
|
|
31
30
|
import * as Plan from "../src/Plan.ts";
|
|
32
31
|
import { getProviderByType, type LogLine } from "../src/Provider.ts";
|
|
33
32
|
import * as Stack from "../src/Stack.ts";
|
|
34
33
|
import { Stage } from "../src/Stage.ts";
|
|
35
34
|
import * as State from "../src/State/index.ts";
|
|
35
|
+
import { loadConfigProvider } from "../src/Util/ConfigProvider.ts";
|
|
36
|
+
import { fileLogger } from "../src/Util/FileLogger.ts";
|
|
36
37
|
|
|
37
38
|
const USER = Config.string("USER").pipe(
|
|
38
39
|
Config.orElse(() => Config.string("USERNAME")),
|
|
@@ -94,48 +95,12 @@ const yes = Flag.boolean("yes").pipe(
|
|
|
94
95
|
);
|
|
95
96
|
|
|
96
97
|
const force = Flag.boolean("force").pipe(
|
|
97
|
-
Flag.withDescription(
|
|
98
|
+
Flag.withDescription(
|
|
99
|
+
"Force updates for resources that would otherwise no-op",
|
|
100
|
+
),
|
|
98
101
|
Flag.withDefault(false),
|
|
99
102
|
);
|
|
100
103
|
|
|
101
|
-
const fileLogger = Effect.fnUntraced(function* (
|
|
102
|
-
...segments: ReadonlyArray<string>
|
|
103
|
-
) {
|
|
104
|
-
const dotAlchemy = yield* DotAlchemy;
|
|
105
|
-
const fs = yield* FileSystem.FileSystem;
|
|
106
|
-
const path = yield* Path;
|
|
107
|
-
const logFile = path.join(dotAlchemy, "log", ...segments);
|
|
108
|
-
|
|
109
|
-
yield* fs.makeDirectory(path.dirname(logFile), { recursive: true });
|
|
110
|
-
|
|
111
|
-
return yield* Logger.formatLogFmt.pipe(
|
|
112
|
-
Logger.toFile(logFile, {
|
|
113
|
-
flag: "a",
|
|
114
|
-
}),
|
|
115
|
-
);
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
const loadConfigProvider = (envFile: Option.Option<string>) => {
|
|
119
|
-
if (Option.isSome(envFile)) {
|
|
120
|
-
return ConfigProvider.fromDotEnv({ path: envFile.value }).pipe(
|
|
121
|
-
Effect.map((dotEnv) =>
|
|
122
|
-
ConfigProvider.orElse(dotEnv, ConfigProvider.fromEnv()),
|
|
123
|
-
),
|
|
124
|
-
);
|
|
125
|
-
}
|
|
126
|
-
return Effect.gen(function* () {
|
|
127
|
-
const fs = yield* FileSystem.FileSystem;
|
|
128
|
-
const exists = yield* fs.exists(".env");
|
|
129
|
-
if (!exists) {
|
|
130
|
-
return ConfigProvider.fromEnv();
|
|
131
|
-
}
|
|
132
|
-
return ConfigProvider.orElse(
|
|
133
|
-
yield* ConfigProvider.fromDotEnv({ path: ".env" }),
|
|
134
|
-
ConfigProvider.fromEnv(),
|
|
135
|
-
);
|
|
136
|
-
});
|
|
137
|
-
};
|
|
138
|
-
|
|
139
104
|
const main = Argument.file("main", {
|
|
140
105
|
mustExist: true,
|
|
141
106
|
}).pipe(
|
|
@@ -239,37 +204,36 @@ const execStack = Effect.fn(function* ({
|
|
|
239
204
|
const cli = yield* CLI.Cli;
|
|
240
205
|
const stack = yield* stackEffect;
|
|
241
206
|
|
|
242
|
-
yield*
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
output: {},
|
|
253
|
-
}
|
|
254
|
-
: stack,
|
|
255
|
-
{ force },
|
|
256
|
-
);
|
|
257
|
-
if (dryRun) {
|
|
258
|
-
yield* cli.displayPlan(updatePlan);
|
|
259
|
-
} else {
|
|
260
|
-
if (!yes) {
|
|
261
|
-
const approved = yield* cli.approvePlan(updatePlan);
|
|
262
|
-
if (!approved) {
|
|
263
|
-
return;
|
|
207
|
+
yield* Effect.gen(function* () {
|
|
208
|
+
const updatePlan = yield* Plan.make(
|
|
209
|
+
destroy
|
|
210
|
+
? {
|
|
211
|
+
...stack,
|
|
212
|
+
// zero these out (destroy will treat all as orphans)
|
|
213
|
+
// TODO(sam): probably better to have Plan.destroy and Plan.update
|
|
214
|
+
resources: {},
|
|
215
|
+
bindings: {},
|
|
216
|
+
output: {},
|
|
264
217
|
}
|
|
218
|
+
: stack,
|
|
219
|
+
{ force },
|
|
220
|
+
);
|
|
221
|
+
if (dryRun) {
|
|
222
|
+
yield* cli.displayPlan(updatePlan);
|
|
223
|
+
} else {
|
|
224
|
+
if (!yes) {
|
|
225
|
+
const approved = yield* cli.approvePlan(updatePlan);
|
|
226
|
+
if (!approved) {
|
|
227
|
+
return;
|
|
265
228
|
}
|
|
266
|
-
const outputs = yield* apply(updatePlan);
|
|
267
|
-
|
|
268
|
-
yield* Console.log(outputs);
|
|
269
229
|
}
|
|
270
|
-
|
|
271
|
-
|
|
230
|
+
const outputs = yield* apply(updatePlan);
|
|
231
|
+
|
|
232
|
+
yield* Console.log(outputs);
|
|
233
|
+
}
|
|
234
|
+
}).pipe(
|
|
272
235
|
Effect.provide(stack.services),
|
|
236
|
+
provideFreshArtifactStore,
|
|
273
237
|
// Effect.provide(Logger.layer([fileLogger("stacks", stack.name, stage)])),
|
|
274
238
|
);
|
|
275
239
|
}).pipe(
|
package/lib/cli/index.d.ts
CHANGED
|
@@ -291,6 +291,7 @@ interface ProviderService<Res extends ResourceLike = ResourceLike, ReadReq = nev
|
|
|
291
291
|
news: Props<Res>;
|
|
292
292
|
instanceId: string;
|
|
293
293
|
session: ScopedPlanStatusSession;
|
|
294
|
+
bindings: BindingData<Res>;
|
|
294
295
|
}): Effect$1.Effect<Res["Attributes"], any, PrecreateReq>;
|
|
295
296
|
create(input: {
|
|
296
297
|
id: string;
|
package/lib/cli/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/Util/data.ts","../../src/Http.ts","../../src/ExecutionContext.ts","../../src/Namespace.ts","../../src/RemovalPolicy.ts","../../src/Resource.ts","../../src/State/ResourceState.ts","../../src/Output.ts","../../src/Input.ts","../../src/Diff.ts","../../src/Provider.ts","../../src/Plan.ts","../../src/Cli/Event.ts","../../src/Cli/Cli.ts","../../src/Cli/InkCLI.tsx"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;;;;KAAY,SAAA;;;KCsBA,4BAA0B,QAAA,CAAO,OAC3C,kBAAA,CAAmB,oBACnB,kBAAkB,eAClB,oBAAoB,QAAQ;;;UClBb,oBAAA;;;OAGV;uBACgB,QAAA,CAAO,OAAO;0BACX,SAAS,QAAA,CAAO;YAC9B,QAAA,CAAO,OAAO;iCAEb,WAAW,SACnB,QAAA,CAAO,oBAAoB;;UAGf,6BACH,uBAAuB,8BAC3B,UAAA,CAAW,4BAA4B,gBAAgB;cAEpD,kBAAgB,iBAAA,sCACd,4BAA4B,gBAAc,iBAAiB;;;UCpBzD,aAAA;;WAEN;;;;cCLqC,oBAAA,UAAA,CAAA,aAAA;cAEnC,aAAA,SAAsB,kBAAA;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/Util/data.ts","../../src/Http.ts","../../src/ExecutionContext.ts","../../src/Namespace.ts","../../src/RemovalPolicy.ts","../../src/Resource.ts","../../src/State/ResourceState.ts","../../src/Output.ts","../../src/Input.ts","../../src/Diff.ts","../../src/Provider.ts","../../src/Plan.ts","../../src/Cli/Event.ts","../../src/Cli/Cli.ts","../../src/Cli/InkCLI.tsx"],"sourcesContent":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "alchemy-effect",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"homepage": "https://alchemy.run",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Sam Goodwin <sam@alchemy.run>",
|
|
@@ -194,8 +194,9 @@
|
|
|
194
194
|
"jszip": "^3.10.1",
|
|
195
195
|
"rolldown": "1.0.0-rc.13",
|
|
196
196
|
"solid-js": "latest",
|
|
197
|
+
"sonda": "^0.11.1",
|
|
197
198
|
"web-tree-sitter": "0.25.10",
|
|
198
|
-
"workerd": "1.
|
|
199
|
+
"workerd": "1.20260412.1",
|
|
199
200
|
"yaml": "^2.0.0"
|
|
200
201
|
},
|
|
201
202
|
"devDependencies": {
|
|
@@ -162,10 +162,11 @@ export const LaunchTemplate: Platform<
|
|
|
162
162
|
LaunchTemplateServices,
|
|
163
163
|
LaunchTemplateShape,
|
|
164
164
|
LaunchTemplateExecutionContext
|
|
165
|
-
> = Platform(
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
)
|
|
165
|
+
> = Platform("AWS.AutoScaling.LaunchTemplate", {
|
|
166
|
+
createExecutionContext: createEc2HostExecutionContext(
|
|
167
|
+
"AWS.AutoScaling.LaunchTemplate",
|
|
168
|
+
),
|
|
169
|
+
});
|
|
169
170
|
|
|
170
171
|
export const LaunchTemplateProvider = () =>
|
|
171
172
|
LaunchTemplate.provider.effect(
|
package/src/AWS/EC2/Instance.ts
CHANGED
|
@@ -304,10 +304,9 @@ export const Instance: Platform<
|
|
|
304
304
|
InstanceServices,
|
|
305
305
|
InstanceShape,
|
|
306
306
|
InstanceExecutionContext
|
|
307
|
-
> = Platform(
|
|
308
|
-
"AWS.EC2.Instance",
|
|
309
|
-
|
|
310
|
-
);
|
|
307
|
+
> = Platform("AWS.EC2.Instance", {
|
|
308
|
+
createExecutionContext: createEc2HostExecutionContext("AWS.EC2.Instance"),
|
|
309
|
+
});
|
|
311
310
|
|
|
312
311
|
export const InstanceProvider = () =>
|
|
313
312
|
Instance.provider.effect(
|
package/src/AWS/ECS/Task.ts
CHANGED
|
@@ -174,43 +174,45 @@ export const Task: Platform<
|
|
|
174
174
|
TaskServices,
|
|
175
175
|
TaskShape,
|
|
176
176
|
TaskExecutionContext
|
|
177
|
-
> = Platform("AWS.ECS.Task",
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
.
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
Effect.
|
|
197
|
-
try
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
),
|
|
201
|
-
Effect.catch((cause) =>
|
|
202
|
-
Effect.die(
|
|
203
|
-
new Error(`Failed to get environment variable: ${key}`, {
|
|
204
|
-
cause,
|
|
177
|
+
> = Platform("AWS.ECS.Task", {
|
|
178
|
+
createExecutionContext: (id): TaskExecutionContext => {
|
|
179
|
+
const runners: Effect.Effect<void, never, any>[] = [];
|
|
180
|
+
const env: Record<string, any> = {};
|
|
181
|
+
|
|
182
|
+
return {
|
|
183
|
+
Type: "AWS.ECS.Task",
|
|
184
|
+
id,
|
|
185
|
+
env,
|
|
186
|
+
set: (bindingId: string, output: Output.Output) =>
|
|
187
|
+
Effect.sync(() => {
|
|
188
|
+
const key = bindingId.replaceAll(/[^a-zA-Z0-9]/g, "_");
|
|
189
|
+
env[key] = output.pipe(Output.map((value) => JSON.stringify(value)));
|
|
190
|
+
return key;
|
|
191
|
+
}),
|
|
192
|
+
get: <T>(key: string) =>
|
|
193
|
+
Config.string(key)
|
|
194
|
+
.asEffect()
|
|
195
|
+
.pipe(
|
|
196
|
+
Effect.flatMap((value) =>
|
|
197
|
+
Effect.try({
|
|
198
|
+
try: () => JSON.parse(value) as T,
|
|
199
|
+
catch: (error) => error as Error,
|
|
205
200
|
}),
|
|
206
201
|
),
|
|
202
|
+
Effect.catch((cause) =>
|
|
203
|
+
Effect.die(
|
|
204
|
+
new Error(`Failed to get environment variable: ${key}`, {
|
|
205
|
+
cause,
|
|
206
|
+
}),
|
|
207
|
+
),
|
|
208
|
+
),
|
|
207
209
|
),
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
}
|
|
210
|
+
run: (effect: Effect.Effect<void, never, any>) =>
|
|
211
|
+
Effect.sync(() => {
|
|
212
|
+
runners.push(effect);
|
|
213
|
+
}),
|
|
214
|
+
};
|
|
215
|
+
},
|
|
214
216
|
});
|
|
215
217
|
|
|
216
218
|
export const TaskProvider = () =>
|
|
@@ -9,7 +9,6 @@ import * as Config from "effect/Config";
|
|
|
9
9
|
import * as Effect from "effect/Effect";
|
|
10
10
|
import * as FileSystem from "effect/FileSystem";
|
|
11
11
|
import * as Option from "effect/Option";
|
|
12
|
-
import * as Path from "effect/Path";
|
|
13
12
|
import * as Schedule from "effect/Schedule";
|
|
14
13
|
import * as ServiceMap from "effect/ServiceMap";
|
|
15
14
|
import * as Stream from "effect/Stream";
|
|
@@ -139,76 +138,78 @@ export const Function: Platform<
|
|
|
139
138
|
FunctionServices,
|
|
140
139
|
FunctionShape,
|
|
141
140
|
Serverless.FunctionContext
|
|
142
|
-
> = Platform(FunctionTypeId,
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
.
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
Effect.
|
|
162
|
-
try
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
),
|
|
166
|
-
Effect.catch((cause) =>
|
|
167
|
-
Effect.die(
|
|
168
|
-
new Error(`Failed to get environment variable: ${key}`, {
|
|
169
|
-
cause,
|
|
141
|
+
> = Platform(FunctionTypeId, {
|
|
142
|
+
createExecutionContext: (id: string): Serverless.FunctionContext => {
|
|
143
|
+
const listeners: Effect.Effect<Serverless.FunctionListener>[] = [];
|
|
144
|
+
const env: Record<string, any> = {};
|
|
145
|
+
|
|
146
|
+
const ctx = {
|
|
147
|
+
Type: FunctionTypeId,
|
|
148
|
+
id,
|
|
149
|
+
env,
|
|
150
|
+
set: (id: string, output: Output.Output) =>
|
|
151
|
+
Effect.sync(() => {
|
|
152
|
+
const key = id.replaceAll(/[^a-zA-Z0-9]/g, "_");
|
|
153
|
+
env[key] = output.pipe(Output.map((value) => JSON.stringify(value)));
|
|
154
|
+
return key;
|
|
155
|
+
}),
|
|
156
|
+
get: <T>(key: string) =>
|
|
157
|
+
Config.string(key)
|
|
158
|
+
.asEffect()
|
|
159
|
+
.pipe(
|
|
160
|
+
Effect.flatMap((val) =>
|
|
161
|
+
Effect.try({
|
|
162
|
+
try: () => JSON.parse(val) as T,
|
|
163
|
+
catch: () => val, // assume it's just a string
|
|
170
164
|
}),
|
|
171
165
|
),
|
|
166
|
+
Effect.catch((cause) =>
|
|
167
|
+
Effect.die(
|
|
168
|
+
new Error(`Failed to get environment variable: ${key}`, {
|
|
169
|
+
cause,
|
|
170
|
+
}),
|
|
171
|
+
),
|
|
172
|
+
),
|
|
172
173
|
),
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
)
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
174
|
+
serve: (handler: HttpEffect) =>
|
|
175
|
+
ctx.listen(makeFunctionHttpHandler(handler)),
|
|
176
|
+
listen: ((
|
|
177
|
+
handler:
|
|
178
|
+
| Serverless.FunctionListener
|
|
179
|
+
| Effect.Effect<Serverless.FunctionListener>,
|
|
180
|
+
) =>
|
|
181
|
+
Effect.sync(() =>
|
|
182
|
+
Effect.isEffect(handler)
|
|
183
|
+
? listeners.push(handler)
|
|
184
|
+
: listeners.push(Effect.succeed(handler)),
|
|
185
|
+
)) as any as Serverless.FunctionContext["listen"],
|
|
186
|
+
exports: Effect.sync(() => ({
|
|
187
|
+
// construct an Effect that produces the Function's entrypoint
|
|
188
|
+
// Effect<(event, context) => Promise<any>>
|
|
189
|
+
handler: Effect.map(
|
|
190
|
+
Effect.all(listeners, {
|
|
191
|
+
concurrency: "unbounded",
|
|
192
|
+
}),
|
|
193
|
+
(handlers) =>
|
|
194
|
+
async (event: any, context: lambda.Context): Promise<any> => {
|
|
195
|
+
console.log({ event, handlers });
|
|
196
|
+
for (const handler of handlers) {
|
|
197
|
+
const eff = handler(event);
|
|
198
|
+
if (Effect.isEffect(eff)) {
|
|
199
|
+
return await eff.pipe(
|
|
200
|
+
Effect.provideService(HandlerContext, context),
|
|
201
|
+
Effect.tap(Effect.logDebug),
|
|
202
|
+
Effect.runPromise,
|
|
203
|
+
);
|
|
204
|
+
}
|
|
204
205
|
}
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
),
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
|
|
206
|
+
throw new Error("No event handler found");
|
|
207
|
+
},
|
|
208
|
+
),
|
|
209
|
+
})),
|
|
210
|
+
};
|
|
211
|
+
return ctx;
|
|
212
|
+
},
|
|
212
213
|
});
|
|
213
214
|
|
|
214
215
|
export const FunctionProvider = () =>
|
|
@@ -218,7 +219,6 @@ export const FunctionProvider = () =>
|
|
|
218
219
|
const accountId = yield* Account;
|
|
219
220
|
const region = yield* Region;
|
|
220
221
|
const fs = yield* FileSystem.FileSystem;
|
|
221
|
-
const path = yield* Path.Path;
|
|
222
222
|
const virtualEntryPlugin = yield* Bundle.virtualEntryPlugin;
|
|
223
223
|
const alchemyEnv = {
|
|
224
224
|
ALCHEMY_STACK_NAME: stack.name,
|
package/src/Apply.ts
CHANGED
|
@@ -411,6 +411,7 @@ const executeNode = (
|
|
|
411
411
|
news: node.props,
|
|
412
412
|
session: scopedSession,
|
|
413
413
|
instanceId,
|
|
414
|
+
bindings: excludeDeletedBindings(node.bindings),
|
|
414
415
|
})
|
|
415
416
|
.pipe(provideLifecycleScope(fqn, instanceId));
|
|
416
417
|
yield* commit<CreatingResourceState>({
|
|
@@ -656,6 +657,7 @@ const executeNode = (
|
|
|
656
657
|
news: node.props,
|
|
657
658
|
session: scopedSession,
|
|
658
659
|
instanceId,
|
|
660
|
+
bindings: excludeDeletedBindings(node.bindings),
|
|
659
661
|
})
|
|
660
662
|
.pipe(provideLifecycleScope(fqn, instanceId));
|
|
661
663
|
yield* commit<ReplacingResourceState>({
|
package/src/Artifacts.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import * as Deferred from "effect/Deferred";
|
|
1
2
|
import * as Effect from "effect/Effect";
|
|
2
3
|
import * as Layer from "effect/Layer";
|
|
3
4
|
import * as Option from "effect/Option";
|
|
@@ -134,14 +135,22 @@ export const ensureArtifactStore = <A, E, R>(
|
|
|
134
135
|
|
|
135
136
|
export const cached =
|
|
136
137
|
(id: string) =>
|
|
137
|
-
<A, Err = never, Req = never>(
|
|
138
|
+
<A, Err = never, Req = never>(
|
|
139
|
+
eff: Effect.Effect<A, Err, Req>,
|
|
140
|
+
): Effect.Effect<A, Err, Req | Artifacts> =>
|
|
138
141
|
Effect.gen(function* () {
|
|
139
142
|
const artifacts = yield* Artifacts;
|
|
143
|
+
const deferred = yield* Deferred.make<A>();
|
|
140
144
|
const cached = yield* artifacts.get<A>(id);
|
|
141
145
|
if (cached) {
|
|
146
|
+
if (Effect.isEffect(cached)) {
|
|
147
|
+
return yield* cached;
|
|
148
|
+
}
|
|
142
149
|
return cached;
|
|
143
150
|
}
|
|
151
|
+
yield* artifacts.set(id, Deferred.await(deferred));
|
|
144
152
|
const result = yield* eff;
|
|
153
|
+
yield* Deferred.succeed(deferred, result);
|
|
145
154
|
yield* artifacts.set(id, result);
|
|
146
155
|
return result;
|
|
147
156
|
});
|
package/src/Binding.ts
CHANGED
|
@@ -28,15 +28,22 @@ export interface Service<
|
|
|
28
28
|
extends ServiceMap.Service<Self, Shape>, ServiceLike {
|
|
29
29
|
readonly key: Identifier;
|
|
30
30
|
new (_: never): ServiceShape<Identifier, Shape>;
|
|
31
|
-
bind: (
|
|
32
|
-
...args: Parameters<Shape>
|
|
31
|
+
bind: <Req = never>(
|
|
32
|
+
...args: BindParameters<Parameters<Shape>, Req>
|
|
33
33
|
) => Effect.Effect<
|
|
34
34
|
Effect.Success<ReturnType<Shape>>,
|
|
35
35
|
Effect.Error<ReturnType<Shape>>,
|
|
36
|
-
Self | Effect.Services<ReturnType<Shape>>
|
|
36
|
+
Self | Effect.Services<ReturnType<Shape>> | Req
|
|
37
37
|
>;
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
+
type BindParameters<
|
|
41
|
+
Parameters extends any[],
|
|
42
|
+
Req = never,
|
|
43
|
+
> = Parameters extends [infer First, ...infer Rest]
|
|
44
|
+
? [First | Effect.Effect<First, never, Req>, ...BindParameters<Rest, Req>]
|
|
45
|
+
: [];
|
|
46
|
+
|
|
40
47
|
/**
|
|
41
48
|
* Creates a runtime binding service.
|
|
42
49
|
*
|
|
@@ -140,8 +147,16 @@ export const Policy =
|
|
|
140
147
|
Effect.map(
|
|
141
148
|
([resource, fn]) =>
|
|
142
149
|
(...args: any[]) =>
|
|
143
|
-
|
|
144
|
-
|
|
150
|
+
Effect.all(
|
|
151
|
+
args.map((arg) =>
|
|
152
|
+
Effect.isEffect(arg) ? arg : Effect.succeed(arg),
|
|
153
|
+
),
|
|
154
|
+
).pipe(
|
|
155
|
+
Effect.flatMap((args) =>
|
|
156
|
+
fn(...args).pipe(
|
|
157
|
+
Namespace.push((resource as ResourceLike).LogicalId),
|
|
158
|
+
),
|
|
159
|
+
),
|
|
145
160
|
),
|
|
146
161
|
),
|
|
147
162
|
);
|