local-serverless-stack 0.1.1 → 0.2.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/CHANGELOG.md +36 -1
- package/README.md +6 -4
- package/bin/cli.js +323 -44
- package/dist/server/dev/dynamo-proxy.d.ts.map +1 -1
- package/dist/server/dev/dynamo-proxy.js +4 -0
- package/dist/server/dev/dynamo-proxy.js.map +1 -1
- package/dist/server/routes/queues.d.ts.map +1 -1
- package/dist/server/routes/queues.js +81 -0
- package/dist/server/routes/queues.js.map +1 -1
- package/dist/server/routes/seeds.d.ts.map +1 -1
- package/dist/server/routes/seeds.js +6 -1
- package/dist/server/routes/seeds.js.map +1 -1
- package/dist/server/services/config-manager.d.ts +2 -0
- package/dist/server/services/config-manager.d.ts.map +1 -1
- package/dist/server/services/config-manager.js +10 -0
- package/dist/server/services/config-manager.js.map +1 -1
- package/dist/server/services/queue-inspector.d.ts +68 -0
- package/dist/server/services/queue-inspector.d.ts.map +1 -1
- package/dist/server/services/queue-inspector.js +182 -4
- package/dist/server/services/queue-inspector.js.map +1 -1
- package/dist/server/services/resource-provisioner.d.ts.map +1 -1
- package/dist/server/services/resource-provisioner.js +1 -0
- package/dist/server/services/resource-provisioner.js.map +1 -1
- package/dist/server/services/seed-manager.d.ts +2 -0
- package/dist/server/services/seed-manager.d.ts.map +1 -1
- package/dist/server/services/seed-manager.js +40 -0
- package/dist/server/services/seed-manager.js.map +1 -1
- package/package.json +10 -8
- package/packages/serverless-plugin/README.md +4 -4
- package/packages/serverless-plugin/dist/index.js +7 -0
- package/packages/serverless-plugin/dist/index.js.map +1 -1
|
@@ -53,6 +53,87 @@ router.post('/:name/reset-processed', async (req, res) => {
|
|
|
53
53
|
return fail(res, error);
|
|
54
54
|
}
|
|
55
55
|
});
|
|
56
|
+
// Block until the queue drains (available === 0 && inFlight === 0), polling the
|
|
57
|
+
// counters until `timeoutMs`. 200 when drained, 408 on timeout. Pass the logical
|
|
58
|
+
// queue name (e.g. "activity-save.fifo"); pass `sinceProcessed` to also require a
|
|
59
|
+
// minimum processed count and avoid the "checked before the message arrived" race.
|
|
60
|
+
router.post('/:name/await-idle', async (req, res) => {
|
|
61
|
+
const name = req.params.name;
|
|
62
|
+
if (!isValidName(name))
|
|
63
|
+
return fail(res, new Error('Invalid queue name'), 400);
|
|
64
|
+
const { timeoutMs, sinceProcessed } = req.body ?? {};
|
|
65
|
+
if (timeoutMs !== undefined && (typeof timeoutMs !== 'number' || !Number.isFinite(timeoutMs))) {
|
|
66
|
+
return fail(res, new Error('timeoutMs must be a number'), 400);
|
|
67
|
+
}
|
|
68
|
+
if (sinceProcessed !== undefined &&
|
|
69
|
+
(typeof sinceProcessed !== 'number' || !Number.isInteger(sinceProcessed) || sinceProcessed < 0)) {
|
|
70
|
+
return fail(res, new Error('sinceProcessed must be a non-negative integer'), 400);
|
|
71
|
+
}
|
|
72
|
+
const clampedTimeout = Math.min(Math.max(timeoutMs ?? 15000, 100), 120000);
|
|
73
|
+
try {
|
|
74
|
+
const result = await inspector.awaitIdle(name, { timeoutMs: clampedTimeout, sinceProcessed }, getRegion(req));
|
|
75
|
+
if (!result)
|
|
76
|
+
return res.status(404).json({ error: 'Queue not found' });
|
|
77
|
+
return res.status(result.drained ? 200 : 408).json({
|
|
78
|
+
queue: name,
|
|
79
|
+
available: result.available,
|
|
80
|
+
inFlight: result.inFlight,
|
|
81
|
+
processed: result.processed,
|
|
82
|
+
drained: result.drained,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
return fail(res, error);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
// Hold/intercept primitives — disable the consumer mapping and capture messages,
|
|
90
|
+
// so a producer can be asserted without running the consumer.
|
|
91
|
+
router.post('/:name/hold', async (req, res) => {
|
|
92
|
+
const name = req.params.name;
|
|
93
|
+
if (!isValidName(name))
|
|
94
|
+
return fail(res, new Error('Invalid queue name'), 400);
|
|
95
|
+
try {
|
|
96
|
+
const result = await inspector.holdQueue(name, getRegion(req));
|
|
97
|
+
if (!result)
|
|
98
|
+
return res.status(404).json({ error: 'Queue not found' });
|
|
99
|
+
return res.json(result);
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
return fail(res, error);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
router.get('/:name/captured', async (req, res) => {
|
|
106
|
+
const name = req.params.name;
|
|
107
|
+
if (!isValidName(name))
|
|
108
|
+
return fail(res, new Error('Invalid queue name'), 400);
|
|
109
|
+
try {
|
|
110
|
+
const captured = await inspector.getCaptured(name, getRegion(req));
|
|
111
|
+
if (captured === 'not-found')
|
|
112
|
+
return res.status(404).json({ error: 'Queue not found' });
|
|
113
|
+
if (captured === 'not-held')
|
|
114
|
+
return res.status(409).json({ error: 'Queue is not held' });
|
|
115
|
+
return res.json(captured);
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
return fail(res, error);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
router.post('/:name/release', async (req, res) => {
|
|
122
|
+
const name = req.params.name;
|
|
123
|
+
if (!isValidName(name))
|
|
124
|
+
return fail(res, new Error('Invalid queue name'), 400);
|
|
125
|
+
try {
|
|
126
|
+
const result = await inspector.releaseQueue(name, getRegion(req));
|
|
127
|
+
if (result === 'not-found')
|
|
128
|
+
return res.status(404).json({ error: 'Queue not found' });
|
|
129
|
+
if (result === 'not-held')
|
|
130
|
+
return res.status(409).json({ error: 'Queue is not held' });
|
|
131
|
+
return res.json(result);
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
return fail(res, error);
|
|
135
|
+
}
|
|
136
|
+
});
|
|
56
137
|
router.post('/:name/messages', async (req, res) => {
|
|
57
138
|
const name = req.params.name;
|
|
58
139
|
if (!isValidName(name))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queues.js","sourceRoot":"","sources":["../../../src/server/routes/queues.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"queues.js","sourceRoot":"","sources":["../../../src/server/routes/queues.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seeds.d.ts","sourceRoot":"","sources":["../../../src/server/routes/seeds.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"seeds.d.ts","sourceRoot":"","sources":["../../../src/server/routes/seeds.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAsExB,OAAO,EAAE,MAAM,IAAI,WAAW,EAAE,CAAC"}
|
|
@@ -16,10 +16,15 @@ function getRegion(req) {
|
|
|
16
16
|
}
|
|
17
17
|
router.get('/', async (req, res) => {
|
|
18
18
|
try {
|
|
19
|
-
const
|
|
19
|
+
const region = getRegion(req);
|
|
20
|
+
const [entries, liveTables] = await Promise.all([
|
|
21
|
+
seeds.list(region),
|
|
22
|
+
seeds.listLiveTables(region),
|
|
23
|
+
]);
|
|
20
24
|
res.json({
|
|
21
25
|
seedsDir: ConfigManager.getInstance().getSeedsDir(),
|
|
22
26
|
entries,
|
|
27
|
+
liveTables,
|
|
23
28
|
});
|
|
24
29
|
}
|
|
25
30
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seeds.js","sourceRoot":"","sources":["../../../src/server/routes/seeds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAE9D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;AACxB,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;AAExC,SAAS,gBAAgB,CAAC,IAAa;IACrC,OAAO,CACL,OAAO,IAAI,KAAK,QAAQ;QACxB,IAAI,CAAC,MAAM,GAAG,CAAC;QACf,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QACnB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QACpB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CACrB,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,GAAY;IAC7B,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IACpD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"seeds.js","sourceRoot":"","sources":["../../../src/server/routes/seeds.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,7 @@ export interface LSSConfig {
|
|
|
16
16
|
persistence?: boolean;
|
|
17
17
|
debug?: boolean;
|
|
18
18
|
seedsDir?: string;
|
|
19
|
+
stateDir?: string;
|
|
19
20
|
autoPackage?: boolean;
|
|
20
21
|
packageCommand?: string;
|
|
21
22
|
packageTimeoutMs?: number;
|
|
@@ -46,6 +47,7 @@ export declare class ConfigManager {
|
|
|
46
47
|
isPersistence(): boolean;
|
|
47
48
|
isDebug(): boolean;
|
|
48
49
|
getSeedsDir(): string;
|
|
50
|
+
getStateDir(): string | undefined;
|
|
49
51
|
isAutoPackage(): boolean;
|
|
50
52
|
getPackageCommand(): string;
|
|
51
53
|
getPackageTimeoutMs(): number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../../src/server/services/config-manager.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,UAAU,CAAC;AACpD,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,KAAK,CAAC;AAEpD,MAAM,WAAW,SAAS;IAExB,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAK5B,IAAI,CAAC,EAAE,cAAc,CAAC;IAGtB,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IAGtC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAG3B,eAAe,CAAC,EAAE,MAAM,CAAC;IAIzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAG7B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IAGzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAGpB,WAAW,CAAC,EAAE,OAAO,CAAC;IAGtB,KAAK,CAAC,EAAE,OAAO,CAAC;IAIhB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAIlB,WAAW,CAAC,EAAE,OAAO,CAAC;IAItB,cAAc,CAAC,EAAE,MAAM,CAAC;IAGxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgB;IACvC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,UAAU,CAAc;IAEhC,OAAO;IAIP,MAAM,CAAC,WAAW,IAAI,aAAa;IAOnC,OAAO,CAAC,UAAU;
|
|
1
|
+
{"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../../src/server/services/config-manager.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,UAAU,CAAC;AACpD,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,KAAK,CAAC;AAEpD,MAAM,WAAW,SAAS;IAExB,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAK5B,IAAI,CAAC,EAAE,cAAc,CAAC;IAGtB,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IAGtC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAG3B,eAAe,CAAC,EAAE,MAAM,CAAC;IAIzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAG7B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IAGzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAGpB,WAAW,CAAC,EAAE,OAAO,CAAC;IAGtB,KAAK,CAAC,EAAE,OAAO,CAAC;IAIhB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAKlB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAIlB,WAAW,CAAC,EAAE,OAAO,CAAC;IAItB,cAAc,CAAC,EAAE,MAAM,CAAC;IAGxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgB;IACvC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,UAAU,CAAc;IAEhC,OAAO;IAIP,MAAM,CAAC,WAAW,IAAI,aAAa;IAOnC,OAAO,CAAC,UAAU;IAoClB,OAAO,CAAC,WAAW;IAoEnB,SAAS,IAAI,SAAS;IAItB,aAAa,IAAI,MAAM;IAKvB,gBAAgB,IAAI,MAAM;IAI1B,iBAAiB,IAAI,MAAM;IAI3B,qBAAqB,IAAI,MAAM;IAQ/B,OAAO,IAAI,cAAc;IAIzB,UAAU,IAAI,OAAO;IAIrB,oBAAoB,IAAI,iBAAiB;IAIzC,oBAAoB,IAAI,MAAM;IAI9B,kBAAkB,IAAI,MAAM;IAQ5B,sBAAsB,IAAI,MAAM,GAAG,SAAS;IAI5C,mBAAmB,IAAI,OAAO;IAQ9B,kBAAkB,IAAI,MAAM;IAI5B,SAAS,IAAI,MAAM;IAInB,WAAW,IAAI,MAAM,EAAE;IAIvB,aAAa,IAAI,OAAO;IAOxB,OAAO,IAAI,OAAO;IAOlB,WAAW,IAAI,MAAM;IAKrB,WAAW,IAAI,MAAM,GAAG,SAAS;IAMjC,aAAa,IAAI,OAAO;IAIxB,iBAAiB,IAAI,MAAM;IAI3B,mBAAmB,IAAI,MAAM;IAI7B,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,YAAY,IAAI,IAAI;IA2BpB,kBAAkB,IAAI,MAAM;CAI7B"}
|
|
@@ -19,7 +19,10 @@ export class ConfigManager {
|
|
|
19
19
|
// 2. .lssrc in current working directory
|
|
20
20
|
// 3. lss.config.json in home directory
|
|
21
21
|
// 4. .lssrc in home directory
|
|
22
|
+
// LSS_CONFIG_PATH (set by the CLI from `--config <path>`) takes precedence
|
|
23
|
+
// over the cwd/home search so the server reads the same file the CLI used.
|
|
22
24
|
const candidates = [
|
|
25
|
+
...(process.env.LSS_CONFIG_PATH ? [process.env.LSS_CONFIG_PATH] : []),
|
|
23
26
|
path.join(process.cwd(), 'lss.config.json'),
|
|
24
27
|
path.join(process.cwd(), '.lssrc'),
|
|
25
28
|
path.join(process.env.HOME || '~', 'lss.config.json'),
|
|
@@ -46,6 +49,7 @@ export class ConfigManager {
|
|
|
46
49
|
loadFromEnv() {
|
|
47
50
|
// Load configuration from environment variables
|
|
48
51
|
if (process.env.LSS_DASHBOARD_PORT || process.env.PORT) {
|
|
52
|
+
/* istanbul ignore next: the enclosing if guarantees one of these is truthy, so the `|| ''` fallback is unreachable */
|
|
49
53
|
this.config.serverPort = parseInt(process.env.LSS_DASHBOARD_PORT || process.env.PORT || '', 10);
|
|
50
54
|
}
|
|
51
55
|
if (process.env.LSS_LOCALSTACK_PORT) {
|
|
@@ -183,6 +187,12 @@ export class ConfigManager {
|
|
|
183
187
|
const raw = this.config.seedsDir ?? './seeds';
|
|
184
188
|
return path.isAbsolute(raw) ? raw : path.resolve(process.cwd(), raw);
|
|
185
189
|
}
|
|
190
|
+
getStateDir() {
|
|
191
|
+
const raw = this.config.stateDir;
|
|
192
|
+
if (!raw)
|
|
193
|
+
return undefined;
|
|
194
|
+
return path.isAbsolute(raw) ? raw : path.resolve(process.cwd(), raw);
|
|
195
|
+
}
|
|
186
196
|
isAutoPackage() {
|
|
187
197
|
return this.config.autoPackage ?? false;
|
|
188
198
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../../src/server/services/config-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../../src/server/services/config-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,16 @@ export interface QueueSnapshot {
|
|
|
22
22
|
consumers: QueueConsumer[];
|
|
23
23
|
lastPolledAt: number;
|
|
24
24
|
}
|
|
25
|
+
export interface CapturedMessage {
|
|
26
|
+
messageId?: string;
|
|
27
|
+
body?: string;
|
|
28
|
+
attributes?: Record<string, string>;
|
|
29
|
+
messageAttributes?: Record<string, {
|
|
30
|
+
type?: string;
|
|
31
|
+
value?: string;
|
|
32
|
+
}>;
|
|
33
|
+
receivedAt: number;
|
|
34
|
+
}
|
|
25
35
|
export interface SqsAttributeInput {
|
|
26
36
|
name: string;
|
|
27
37
|
type?: 'String' | 'Number' | 'Binary';
|
|
@@ -60,6 +70,7 @@ export declare class QueueInspector {
|
|
|
60
70
|
private sqsClients;
|
|
61
71
|
private lambdaClients;
|
|
62
72
|
private metrics;
|
|
73
|
+
private held;
|
|
63
74
|
private pollInterval;
|
|
64
75
|
private readonly pollFrequencyMs;
|
|
65
76
|
private defaultRegion;
|
|
@@ -70,12 +81,69 @@ export declare class QueueInspector {
|
|
|
70
81
|
private lambdaClientFor;
|
|
71
82
|
startPolling(): void;
|
|
72
83
|
stopPolling(): void;
|
|
84
|
+
private sleep;
|
|
73
85
|
listQueues(region?: string): Promise<QueueSnapshot[]>;
|
|
74
86
|
getQueue(queueName: string, region?: string): Promise<QueueSnapshot | null>;
|
|
87
|
+
/**
|
|
88
|
+
* Block until the queue is idle (no available and no in-flight messages),
|
|
89
|
+
* polling its counters every `pollIntervalMs`. Returns `drained: true` once
|
|
90
|
+
* idle (and, if `sinceProcessed` is given, once `processed >= sinceProcessed`),
|
|
91
|
+
* or `drained: false` on timeout. Returns null when the queue does not exist.
|
|
92
|
+
*
|
|
93
|
+
* Each poll forces a fresh metrics read rather than waiting on the ~5s
|
|
94
|
+
* background poller, so callers get a deterministic, fast answer.
|
|
95
|
+
*/
|
|
96
|
+
awaitIdle(queueName: string, opts?: {
|
|
97
|
+
timeoutMs?: number;
|
|
98
|
+
sinceProcessed?: number;
|
|
99
|
+
pollIntervalMs?: number;
|
|
100
|
+
}, region?: string): Promise<{
|
|
101
|
+
name: string;
|
|
102
|
+
available: number;
|
|
103
|
+
inFlight: number;
|
|
104
|
+
processed: number;
|
|
105
|
+
drained: boolean;
|
|
106
|
+
} | null>;
|
|
75
107
|
sendMessage(queueName: string, input: SendMessageInput, region?: string): Promise<SendMessageResult>;
|
|
76
108
|
receiveMessages(queueName: string, input: ReceiveMessagesInput, region?: string): Promise<SqsMessage[]>;
|
|
77
109
|
deleteMessage(queueName: string, receiptHandle: string, region?: string): Promise<void>;
|
|
78
110
|
purgeQueue(queueName: string, region?: string): Promise<void>;
|
|
111
|
+
/**
|
|
112
|
+
* Put a queue on "hold": disable its consumer event source mapping(s) and start
|
|
113
|
+
* capturing messages, so a producer can be asserted without the consumer running.
|
|
114
|
+
* Returns null when the queue does not exist.
|
|
115
|
+
*
|
|
116
|
+
* Best-effort caveats: the hold state is in-memory and lost on orchestrator
|
|
117
|
+
* restart (mappings could remain disabled — release or re-register to recover);
|
|
118
|
+
* messages already received by the consumer before hold cannot be un-consumed;
|
|
119
|
+
* LocalStack applies the Enabled toggle asynchronously, so a message may still
|
|
120
|
+
* reach the consumer immediately after hold.
|
|
121
|
+
*/
|
|
122
|
+
holdQueue(queueName: string, region?: string): Promise<{
|
|
123
|
+
queue: string;
|
|
124
|
+
disabledMappings: number;
|
|
125
|
+
held: boolean;
|
|
126
|
+
} | null>;
|
|
127
|
+
/**
|
|
128
|
+
* Return the messages captured while a queue is held, draining anything
|
|
129
|
+
* currently in the queue into the buffer first (capture is pull-based — there
|
|
130
|
+
* is no background receiver). Returns 'not-found' when the queue doesn't exist
|
|
131
|
+
* and 'not-held' when it exists but isn't held, so the route can distinguish
|
|
132
|
+
* 404 from 409 (consistent with the other queue endpoints).
|
|
133
|
+
*/
|
|
134
|
+
getCaptured(queueName: string, region?: string): Promise<CapturedMessage[] | 'not-found' | 'not-held'>;
|
|
135
|
+
/**
|
|
136
|
+
* Release a held queue: re-enable its consumer mapping(s) and re-dispatch the
|
|
137
|
+
* captured messages so the consumer processes them. Returns 'not-found' when
|
|
138
|
+
* the queue doesn't exist and 'not-held' when it exists but isn't held (404 vs
|
|
139
|
+
* 409 at the route layer).
|
|
140
|
+
*/
|
|
141
|
+
releaseQueue(queueName: string, region?: string): Promise<{
|
|
142
|
+
queue: string;
|
|
143
|
+
dispatched: number;
|
|
144
|
+
released: boolean;
|
|
145
|
+
} | 'not-found' | 'not-held'>;
|
|
146
|
+
private drainCaptured;
|
|
79
147
|
private resolveQueueUrl;
|
|
80
148
|
private refreshMetrics;
|
|
81
149
|
private fetchQueueUrls;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue-inspector.d.ts","sourceRoot":"","sources":["../../../src/server/services/queue-inspector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"queue-inspector.d.ts","sourceRoot":"","sources":["../../../src/server/services/queue-inspector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import { SQSClient, ListQueuesCommand, GetQueueAttributesCommand, GetQueueUrlCommand, SendMessageCommand, ReceiveMessageCommand, DeleteMessageCommand, PurgeQueueCommand, } from '@aws-sdk/client-sqs';
|
|
2
|
-
import { LambdaClient, ListEventSourceMappingsCommand } from '@aws-sdk/client-lambda';
|
|
2
|
+
import { LambdaClient, ListEventSourceMappingsCommand, UpdateEventSourceMappingCommand, } from '@aws-sdk/client-lambda';
|
|
3
3
|
import { LocalStackManager } from './localstack-manager.js';
|
|
4
4
|
export class QueueInspector {
|
|
5
5
|
static instance;
|
|
6
6
|
sqsClients = new Map();
|
|
7
7
|
lambdaClients = new Map();
|
|
8
8
|
metrics = new Map();
|
|
9
|
+
// Queues currently "held": their consumer event source mappings are disabled
|
|
10
|
+
// and messages are captured on demand. Keyed by resolved queue URL. In-memory
|
|
11
|
+
// only — lost on restart (see holdQueue caveats).
|
|
12
|
+
held = new Map();
|
|
9
13
|
pollInterval = null;
|
|
10
14
|
pollFrequencyMs = 5000;
|
|
11
15
|
defaultRegion = 'us-east-1';
|
|
@@ -48,7 +52,8 @@ export class QueueInspector {
|
|
|
48
52
|
if (this.pollInterval)
|
|
49
53
|
return;
|
|
50
54
|
this.pollInterval = setInterval(() => {
|
|
51
|
-
this
|
|
55
|
+
// refreshMetrics swallows its own errors, so this catch arm never fires.
|
|
56
|
+
this.refreshMetrics().catch(/* istanbul ignore next */ () => undefined);
|
|
52
57
|
}, this.pollFrequencyMs);
|
|
53
58
|
}
|
|
54
59
|
stopPolling() {
|
|
@@ -57,6 +62,9 @@ export class QueueInspector {
|
|
|
57
62
|
this.pollInterval = null;
|
|
58
63
|
}
|
|
59
64
|
}
|
|
65
|
+
sleep(ms) {
|
|
66
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
67
|
+
}
|
|
60
68
|
async listQueues(region) {
|
|
61
69
|
const queueUrls = await this.fetchQueueUrls(region);
|
|
62
70
|
const eventSourceMap = await this.fetchEventSourceMappingsByQueueArn(region);
|
|
@@ -72,7 +80,48 @@ export class QueueInspector {
|
|
|
72
80
|
return await this.buildSnapshot(url, eventSourceMap, region);
|
|
73
81
|
}
|
|
74
82
|
catch {
|
|
83
|
+
/* istanbul ignore next: resolveQueueUrl/fetchEventSourceMappings/buildSnapshot all swallow their own errors */
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Block until the queue is idle (no available and no in-flight messages),
|
|
89
|
+
* polling its counters every `pollIntervalMs`. Returns `drained: true` once
|
|
90
|
+
* idle (and, if `sinceProcessed` is given, once `processed >= sinceProcessed`),
|
|
91
|
+
* or `drained: false` on timeout. Returns null when the queue does not exist.
|
|
92
|
+
*
|
|
93
|
+
* Each poll forces a fresh metrics read rather than waiting on the ~5s
|
|
94
|
+
* background poller, so callers get a deterministic, fast answer.
|
|
95
|
+
*/
|
|
96
|
+
async awaitIdle(queueName, opts = {}, region) {
|
|
97
|
+
const url = await this.resolveQueueUrl(queueName, region);
|
|
98
|
+
if (!url)
|
|
75
99
|
return null;
|
|
100
|
+
const timeoutMs = opts.timeoutMs ?? 15000;
|
|
101
|
+
const poll = opts.pollIntervalMs ?? 250;
|
|
102
|
+
const deadline = Date.now() + timeoutMs;
|
|
103
|
+
while (true) {
|
|
104
|
+
const m = await this.updateMetricsForQueue(url, region);
|
|
105
|
+
const processed = this.metrics.get(url)?.processed ?? 0;
|
|
106
|
+
if (m &&
|
|
107
|
+
m.available === 0 &&
|
|
108
|
+
m.inFlight === 0 &&
|
|
109
|
+
(opts.sinceProcessed == null || processed >= opts.sinceProcessed)) {
|
|
110
|
+
return { name: queueName, available: m.available, inFlight: m.inFlight, processed, drained: true };
|
|
111
|
+
}
|
|
112
|
+
// A null `m` means a transient fetch failure (LocalStack briefly down) —
|
|
113
|
+
// treat it as "not idle yet" and keep polling until the deadline.
|
|
114
|
+
if (Date.now() >= deadline) {
|
|
115
|
+
const last = this.metrics.get(url);
|
|
116
|
+
return {
|
|
117
|
+
name: queueName,
|
|
118
|
+
available: m?.available ?? last?.lastAvailable ?? 0,
|
|
119
|
+
inFlight: m?.inFlight ?? last?.lastInFlight ?? 0,
|
|
120
|
+
processed: last?.processed ?? 0,
|
|
121
|
+
drained: false,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
await this.sleep(poll);
|
|
76
125
|
}
|
|
77
126
|
}
|
|
78
127
|
async sendMessage(queueName, input, region) {
|
|
@@ -145,6 +194,133 @@ export class QueueInspector {
|
|
|
145
194
|
throw new Error(`Queue not found: ${queueName}`);
|
|
146
195
|
await this.sqsClientFor(region).send(new PurgeQueueCommand({ QueueUrl: url }));
|
|
147
196
|
}
|
|
197
|
+
/**
|
|
198
|
+
* Put a queue on "hold": disable its consumer event source mapping(s) and start
|
|
199
|
+
* capturing messages, so a producer can be asserted without the consumer running.
|
|
200
|
+
* Returns null when the queue does not exist.
|
|
201
|
+
*
|
|
202
|
+
* Best-effort caveats: the hold state is in-memory and lost on orchestrator
|
|
203
|
+
* restart (mappings could remain disabled — release or re-register to recover);
|
|
204
|
+
* messages already received by the consumer before hold cannot be un-consumed;
|
|
205
|
+
* LocalStack applies the Enabled toggle asynchronously, so a message may still
|
|
206
|
+
* reach the consumer immediately after hold.
|
|
207
|
+
*/
|
|
208
|
+
async holdQueue(queueName, region) {
|
|
209
|
+
const snapshot = await this.getQueue(queueName, region);
|
|
210
|
+
if (!snapshot)
|
|
211
|
+
return null;
|
|
212
|
+
const uuids = snapshot.consumers
|
|
213
|
+
.map(c => c.uuid)
|
|
214
|
+
.filter((u) => Boolean(u));
|
|
215
|
+
for (const uuid of uuids) {
|
|
216
|
+
try {
|
|
217
|
+
await this.lambdaClientFor(region).send(new UpdateEventSourceMappingCommand({ UUID: uuid, Enabled: false }));
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
// best-effort: LocalStack may apply the toggle asynchronously or reject it
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
const existing = this.held.get(snapshot.url);
|
|
224
|
+
this.held.set(snapshot.url, {
|
|
225
|
+
uuids,
|
|
226
|
+
captured: existing?.captured ?? [],
|
|
227
|
+
heldAt: Date.now(),
|
|
228
|
+
});
|
|
229
|
+
return { queue: queueName, disabledMappings: uuids.length, held: true };
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Return the messages captured while a queue is held, draining anything
|
|
233
|
+
* currently in the queue into the buffer first (capture is pull-based — there
|
|
234
|
+
* is no background receiver). Returns 'not-found' when the queue doesn't exist
|
|
235
|
+
* and 'not-held' when it exists but isn't held, so the route can distinguish
|
|
236
|
+
* 404 from 409 (consistent with the other queue endpoints).
|
|
237
|
+
*/
|
|
238
|
+
async getCaptured(queueName, region) {
|
|
239
|
+
const url = await this.resolveQueueUrl(queueName, region);
|
|
240
|
+
if (!url)
|
|
241
|
+
return 'not-found';
|
|
242
|
+
const state = this.held.get(url);
|
|
243
|
+
if (!state)
|
|
244
|
+
return 'not-held';
|
|
245
|
+
await this.drainCaptured(queueName, state, region);
|
|
246
|
+
return state.captured;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Release a held queue: re-enable its consumer mapping(s) and re-dispatch the
|
|
250
|
+
* captured messages so the consumer processes them. Returns 'not-found' when
|
|
251
|
+
* the queue doesn't exist and 'not-held' when it exists but isn't held (404 vs
|
|
252
|
+
* 409 at the route layer).
|
|
253
|
+
*/
|
|
254
|
+
async releaseQueue(queueName, region) {
|
|
255
|
+
const url = await this.resolveQueueUrl(queueName, region);
|
|
256
|
+
if (!url)
|
|
257
|
+
return 'not-found';
|
|
258
|
+
const state = this.held.get(url);
|
|
259
|
+
if (!state)
|
|
260
|
+
return 'not-held';
|
|
261
|
+
// Capture anything still in the queue before flipping the consumer back on.
|
|
262
|
+
await this.drainCaptured(queueName, state, region);
|
|
263
|
+
for (const uuid of state.uuids) {
|
|
264
|
+
try {
|
|
265
|
+
await this.lambdaClientFor(region).send(new UpdateEventSourceMappingCommand({ UUID: uuid, Enabled: true }));
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
// best-effort
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
const fifo = queueName.endsWith('.fifo');
|
|
272
|
+
let dispatched = 0;
|
|
273
|
+
for (const msg of state.captured) {
|
|
274
|
+
try {
|
|
275
|
+
await this.sendMessage(queueName, {
|
|
276
|
+
body: msg.body ?? '',
|
|
277
|
+
// FIFO needs a group id; reuse the original or fall back to 'default'.
|
|
278
|
+
messageGroupId: fifo ? msg.attributes?.MessageGroupId || 'default' : undefined,
|
|
279
|
+
// Force a fresh dedup id so the 5-min FIFO dedup window doesn't drop
|
|
280
|
+
// the replay. Content-based dedup is overridden by an explicit id.
|
|
281
|
+
messageDeduplicationId: fifo
|
|
282
|
+
? `replay-${msg.messageId ?? dispatched}-${state.heldAt}`
|
|
283
|
+
: undefined,
|
|
284
|
+
}, region);
|
|
285
|
+
dispatched++;
|
|
286
|
+
}
|
|
287
|
+
catch {
|
|
288
|
+
// best-effort re-dispatch
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
this.held.delete(url);
|
|
292
|
+
return { queue: queueName, dispatched, released: true };
|
|
293
|
+
}
|
|
294
|
+
// Pull whatever is currently in the queue into the capture buffer, deleting
|
|
295
|
+
// each message so it is held out of the queue. Bounded so a flooded queue can't
|
|
296
|
+
// block the request indefinitely.
|
|
297
|
+
async drainCaptured(queueName, state, region) {
|
|
298
|
+
const maxIterations = 20; // up to ~200 messages per call
|
|
299
|
+
for (let i = 0; i < maxIterations; i++) {
|
|
300
|
+
const messages = await this.receiveMessages(queueName, { maxNumberOfMessages: 10, waitTimeSeconds: 1 }, region);
|
|
301
|
+
if (!messages.length)
|
|
302
|
+
break;
|
|
303
|
+
for (const m of messages) {
|
|
304
|
+
state.captured.push({
|
|
305
|
+
messageId: m.messageId,
|
|
306
|
+
body: m.body,
|
|
307
|
+
attributes: m.attributes,
|
|
308
|
+
messageAttributes: m.messageAttributes,
|
|
309
|
+
receivedAt: Date.now(),
|
|
310
|
+
});
|
|
311
|
+
if (m.receiptHandle) {
|
|
312
|
+
try {
|
|
313
|
+
await this.deleteMessage(queueName, m.receiptHandle, region);
|
|
314
|
+
}
|
|
315
|
+
catch {
|
|
316
|
+
// best-effort delete; we already captured the body
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
if (messages.length < 10)
|
|
321
|
+
break;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
148
324
|
async resolveQueueUrl(queueName, region) {
|
|
149
325
|
try {
|
|
150
326
|
const response = await this.sqsClientFor(region).send(new GetQueueUrlCommand({ QueueName: queueName }));
|
|
@@ -234,9 +410,9 @@ export class QueueInspector {
|
|
|
234
410
|
return null;
|
|
235
411
|
}
|
|
236
412
|
}
|
|
237
|
-
async updateMetricsForQueue(queueUrl) {
|
|
413
|
+
async updateMetricsForQueue(queueUrl, region) {
|
|
238
414
|
try {
|
|
239
|
-
const attrs = await this.sqsClientFor().send(new GetQueueAttributesCommand({
|
|
415
|
+
const attrs = await this.sqsClientFor(region).send(new GetQueueAttributesCommand({
|
|
240
416
|
QueueUrl: queueUrl,
|
|
241
417
|
AttributeNames: [
|
|
242
418
|
'ApproximateNumberOfMessages',
|
|
@@ -246,9 +422,11 @@ export class QueueInspector {
|
|
|
246
422
|
const available = Number(attrs.Attributes?.ApproximateNumberOfMessages || 0);
|
|
247
423
|
const inFlight = Number(attrs.Attributes?.ApproximateNumberOfMessagesNotVisible || 0);
|
|
248
424
|
this.updateMetricsState(queueUrl, available, inFlight);
|
|
425
|
+
return { available, inFlight };
|
|
249
426
|
}
|
|
250
427
|
catch {
|
|
251
428
|
// Skip on transient failures
|
|
429
|
+
return null;
|
|
252
430
|
}
|
|
253
431
|
}
|
|
254
432
|
updateMetricsState(queueUrl, available, inFlight) {
|