Skip to content

Commit 304f1f4

Browse files
authored
fix: correct LocalStack status after Lambda invocation (#7)
LocalStack’s status tracker was incorrectly reporting the main container as stopped after invoking a Lambda function. This happened because ‎`docker events --filter container=localstack-main` matches any container whose name starts with ‎`localstack-main`, including temporary Lambda containers (e.g., ‎`localstack-main-<hash>`). As a result, the tracker picked up stop events for these Lambda containers instead of the main one, leading to false status reports. This commit updates the filter logic to ensure only the main container’s events are tracked.
1 parent b99b638 commit 304f1f4

File tree

1 file changed

+37
-3
lines changed

1 file changed

+37
-3
lines changed

src/utils/container-status.ts

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { exec, spawn } from "node:child_process";
22

33
import type { Disposable, LogOutputChannel } from "vscode";
4+
import * as z from "zod/v4-mini";
45

56
import { createEmitter } from "./emitter.ts";
67

@@ -53,6 +54,23 @@ export async function createContainerStatusTracker(
5354
};
5455
}
5556

57+
const DockerEventsSchema = z.object({
58+
Action: z.enum(["start", "kill", "die"]),
59+
Actor: z.object({
60+
Attributes: z.object({
61+
name: z.string(),
62+
}),
63+
}),
64+
});
65+
66+
function safeJsonParse(text: string): unknown {
67+
try {
68+
return JSON.parse(text);
69+
} catch {
70+
return undefined;
71+
}
72+
}
73+
5674
function listenToContainerStatus(
5775
containerName: string,
5876
outputChannel: LogOutputChannel,
@@ -72,8 +90,14 @@ function listenToContainerStatus(
7290
"events",
7391
"--filter",
7492
`container=${containerName}`,
93+
"--filter",
94+
"event=start",
95+
"--filter",
96+
"event=kill",
97+
"--filter",
98+
"event=die",
7599
"--format",
76-
"{{.Status}}",
100+
"json",
77101
]);
78102

79103
dockerEvents.on("error", (error) => {
@@ -108,8 +132,18 @@ function listenToContainerStatus(
108132

109133
dockerEvents.stdout.on("data", (data: Buffer) => {
110134
const lines = data.toString().split("\n").filter(Boolean);
111-
for (const status of lines) {
112-
switch (status) {
135+
for (const line of lines) {
136+
const json = safeJsonParse(line);
137+
const parsed = DockerEventsSchema.safeParse(json);
138+
if (!parsed.success) {
139+
continue;
140+
}
141+
142+
if (parsed.data.Actor.Attributes.name !== containerName) {
143+
continue;
144+
}
145+
146+
switch (parsed.data.Action) {
113147
case "start":
114148
onStatusChange("running");
115149
break;

0 commit comments

Comments
 (0)