local-serverless-stack 0.6.0 → 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.
Files changed (257) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/README.md +261 -583
  3. package/bin/cli.js +31 -3
  4. package/dist/client/types.d.ts +4 -0
  5. package/dist/client/types.d.ts.map +1 -1
  6. package/dist/server/engine/aoss-sidecar.d.ts +13 -0
  7. package/dist/server/engine/aoss-sidecar.d.ts.map +1 -0
  8. package/dist/server/engine/aoss-sidecar.js +93 -0
  9. package/dist/server/engine/aoss-sidecar.js.map +1 -0
  10. package/dist/server/engine/backends/localstack-backend.d.ts +25 -0
  11. package/dist/server/engine/backends/localstack-backend.d.ts.map +1 -0
  12. package/dist/server/engine/backends/localstack-backend.js +199 -0
  13. package/dist/server/engine/backends/localstack-backend.js.map +1 -0
  14. package/dist/server/engine/backends/self-backend.d.ts +32 -0
  15. package/dist/server/engine/backends/self-backend.d.ts.map +1 -0
  16. package/dist/server/engine/backends/self-backend.js +207 -0
  17. package/dist/server/engine/backends/self-backend.js.map +1 -0
  18. package/dist/server/engine/bus.d.ts +10 -0
  19. package/dist/server/engine/bus.d.ts.map +1 -0
  20. package/dist/server/engine/bus.js +24 -0
  21. package/dist/server/engine/bus.js.map +1 -0
  22. package/dist/server/engine/dispatch/dispatcher.d.ts +46 -0
  23. package/dist/server/engine/dispatch/dispatcher.d.ts.map +1 -0
  24. package/dist/server/engine/dispatch/dispatcher.js +312 -0
  25. package/dist/server/engine/dispatch/dispatcher.js.map +1 -0
  26. package/dist/server/engine/dispatch/scheduler.d.ts +47 -0
  27. package/dist/server/engine/dispatch/scheduler.d.ts.map +1 -0
  28. package/dist/server/engine/dispatch/scheduler.js +328 -0
  29. package/dist/server/engine/dispatch/scheduler.js.map +1 -0
  30. package/dist/server/engine/dispatch/sqs-poller.d.ts +25 -0
  31. package/dist/server/engine/dispatch/sqs-poller.d.ts.map +1 -0
  32. package/dist/server/engine/dispatch/sqs-poller.js +242 -0
  33. package/dist/server/engine/dispatch/sqs-poller.js.map +1 -0
  34. package/dist/server/engine/dispatch/stream-tailer.d.ts +22 -0
  35. package/dist/server/engine/dispatch/stream-tailer.d.ts.map +1 -0
  36. package/dist/server/engine/dispatch/stream-tailer.js +205 -0
  37. package/dist/server/engine/dispatch/stream-tailer.js.map +1 -0
  38. package/dist/server/engine/emulators/dynamodb/expressions/decimal.d.ts +5 -0
  39. package/dist/server/engine/emulators/dynamodb/expressions/decimal.d.ts.map +1 -0
  40. package/dist/server/engine/emulators/dynamodb/expressions/decimal.js +91 -0
  41. package/dist/server/engine/emulators/dynamodb/expressions/decimal.js.map +1 -0
  42. package/dist/server/engine/emulators/dynamodb/expressions/evaluate.d.ts +24 -0
  43. package/dist/server/engine/emulators/dynamodb/expressions/evaluate.d.ts.map +1 -0
  44. package/dist/server/engine/emulators/dynamodb/expressions/evaluate.js +183 -0
  45. package/dist/server/engine/emulators/dynamodb/expressions/evaluate.js.map +1 -0
  46. package/dist/server/engine/emulators/dynamodb/expressions/expression-types.d.ts +29 -0
  47. package/dist/server/engine/emulators/dynamodb/expressions/expression-types.d.ts.map +1 -0
  48. package/dist/server/engine/emulators/dynamodb/expressions/expression-types.js +12 -0
  49. package/dist/server/engine/emulators/dynamodb/expressions/expression-types.js.map +1 -0
  50. package/dist/server/engine/emulators/dynamodb/expressions/index.d.ts +13 -0
  51. package/dist/server/engine/emulators/dynamodb/expressions/index.d.ts.map +1 -0
  52. package/dist/server/engine/emulators/dynamodb/expressions/index.js +244 -0
  53. package/dist/server/engine/emulators/dynamodb/expressions/index.js.map +1 -0
  54. package/dist/server/engine/emulators/dynamodb/expressions/lexer.d.ts +11 -0
  55. package/dist/server/engine/emulators/dynamodb/expressions/lexer.d.ts.map +1 -0
  56. package/dist/server/engine/emulators/dynamodb/expressions/lexer.js +109 -0
  57. package/dist/server/engine/emulators/dynamodb/expressions/lexer.js.map +1 -0
  58. package/dist/server/engine/emulators/dynamodb/expressions/parser.d.ts +23 -0
  59. package/dist/server/engine/emulators/dynamodb/expressions/parser.d.ts.map +1 -0
  60. package/dist/server/engine/emulators/dynamodb/expressions/parser.js +541 -0
  61. package/dist/server/engine/emulators/dynamodb/expressions/parser.js.map +1 -0
  62. package/dist/server/engine/emulators/dynamodb/index.d.ts +46 -0
  63. package/dist/server/engine/emulators/dynamodb/index.d.ts.map +1 -0
  64. package/dist/server/engine/emulators/dynamodb/index.js +572 -0
  65. package/dist/server/engine/emulators/dynamodb/index.js.map +1 -0
  66. package/dist/server/engine/emulators/dynamodb/query.d.ts +12 -0
  67. package/dist/server/engine/emulators/dynamodb/query.d.ts.map +1 -0
  68. package/dist/server/engine/emulators/dynamodb/query.js +237 -0
  69. package/dist/server/engine/emulators/dynamodb/query.js.map +1 -0
  70. package/dist/server/engine/emulators/dynamodb/schema.d.ts +58 -0
  71. package/dist/server/engine/emulators/dynamodb/schema.d.ts.map +1 -0
  72. package/dist/server/engine/emulators/dynamodb/schema.js +284 -0
  73. package/dist/server/engine/emulators/dynamodb/schema.js.map +1 -0
  74. package/dist/server/engine/emulators/dynamodb/streams.d.ts +28 -0
  75. package/dist/server/engine/emulators/dynamodb/streams.d.ts.map +1 -0
  76. package/dist/server/engine/emulators/dynamodb/streams.js +100 -0
  77. package/dist/server/engine/emulators/dynamodb/streams.js.map +1 -0
  78. package/dist/server/engine/emulators/events/index.d.ts +53 -0
  79. package/dist/server/engine/emulators/events/index.d.ts.map +1 -0
  80. package/dist/server/engine/emulators/events/index.js +417 -0
  81. package/dist/server/engine/emulators/events/index.js.map +1 -0
  82. package/dist/server/engine/emulators/events/pattern.d.ts +3 -0
  83. package/dist/server/engine/emulators/events/pattern.d.ts.map +1 -0
  84. package/dist/server/engine/emulators/events/pattern.js +125 -0
  85. package/dist/server/engine/emulators/events/pattern.js.map +1 -0
  86. package/dist/server/engine/emulators/lambda-ctl/index.d.ts +55 -0
  87. package/dist/server/engine/emulators/lambda-ctl/index.d.ts.map +1 -0
  88. package/dist/server/engine/emulators/lambda-ctl/index.js +461 -0
  89. package/dist/server/engine/emulators/lambda-ctl/index.js.map +1 -0
  90. package/dist/server/engine/emulators/opensearch/index.d.ts +67 -0
  91. package/dist/server/engine/emulators/opensearch/index.d.ts.map +1 -0
  92. package/dist/server/engine/emulators/opensearch/index.js +811 -0
  93. package/dist/server/engine/emulators/opensearch/index.js.map +1 -0
  94. package/dist/server/engine/emulators/opensearch/search.d.ts +17 -0
  95. package/dist/server/engine/emulators/opensearch/search.d.ts.map +1 -0
  96. package/dist/server/engine/emulators/opensearch/search.js +434 -0
  97. package/dist/server/engine/emulators/opensearch/search.js.map +1 -0
  98. package/dist/server/engine/emulators/s3/index.d.ts +45 -0
  99. package/dist/server/engine/emulators/s3/index.d.ts.map +1 -0
  100. package/dist/server/engine/emulators/s3/index.js +591 -0
  101. package/dist/server/engine/emulators/s3/index.js.map +1 -0
  102. package/dist/server/engine/emulators/sns/index.d.ts +22 -0
  103. package/dist/server/engine/emulators/sns/index.d.ts.map +1 -0
  104. package/dist/server/engine/emulators/sns/index.js +135 -0
  105. package/dist/server/engine/emulators/sns/index.js.map +1 -0
  106. package/dist/server/engine/emulators/sqs/index.d.ts +66 -0
  107. package/dist/server/engine/emulators/sqs/index.d.ts.map +1 -0
  108. package/dist/server/engine/emulators/sqs/index.js +552 -0
  109. package/dist/server/engine/emulators/sqs/index.js.map +1 -0
  110. package/dist/server/engine/emulators/sqs/md5.d.ts +8 -0
  111. package/dist/server/engine/emulators/sqs/md5.d.ts.map +1 -0
  112. package/dist/server/engine/emulators/sqs/md5.js +36 -0
  113. package/dist/server/engine/emulators/sqs/md5.js.map +1 -0
  114. package/dist/server/engine/emulators/sqs/queue.d.ts +105 -0
  115. package/dist/server/engine/emulators/sqs/queue.d.ts.map +1 -0
  116. package/dist/server/engine/emulators/sqs/queue.js +371 -0
  117. package/dist/server/engine/emulators/sqs/queue.js.map +1 -0
  118. package/dist/server/engine/emulators/sts.d.ts +8 -0
  119. package/dist/server/engine/emulators/sts.d.ts.map +1 -0
  120. package/dist/server/engine/emulators/sts.js +23 -0
  121. package/dist/server/engine/emulators/sts.js.map +1 -0
  122. package/dist/server/engine/engine-backend.d.ts +17 -0
  123. package/dist/server/engine/engine-backend.d.ts.map +1 -0
  124. package/dist/server/engine/engine-backend.js +7 -0
  125. package/dist/server/engine/engine-backend.js.map +1 -0
  126. package/dist/server/engine/engine-manager.d.ts +22 -0
  127. package/dist/server/engine/engine-manager.d.ts.map +1 -0
  128. package/dist/server/engine/engine-manager.js +74 -0
  129. package/dist/server/engine/engine-manager.js.map +1 -0
  130. package/dist/server/engine/http/aws-chunked.d.ts +3 -0
  131. package/dist/server/engine/http/aws-chunked.d.ts.map +1 -0
  132. package/dist/server/engine/http/aws-chunked.js +50 -0
  133. package/dist/server/engine/http/aws-chunked.js.map +1 -0
  134. package/dist/server/engine/http/errors.d.ts +20 -0
  135. package/dist/server/engine/http/errors.d.ts.map +1 -0
  136. package/dist/server/engine/http/errors.js +43 -0
  137. package/dist/server/engine/http/errors.js.map +1 -0
  138. package/dist/server/engine/http/protocols/aws-json.d.ts +8 -0
  139. package/dist/server/engine/http/protocols/aws-json.d.ts.map +1 -0
  140. package/dist/server/engine/http/protocols/aws-json.js +42 -0
  141. package/dist/server/engine/http/protocols/aws-json.js.map +1 -0
  142. package/dist/server/engine/http/protocols/query-xml.d.ts +7 -0
  143. package/dist/server/engine/http/protocols/query-xml.d.ts.map +1 -0
  144. package/dist/server/engine/http/protocols/query-xml.js +35 -0
  145. package/dist/server/engine/http/protocols/query-xml.js.map +1 -0
  146. package/dist/server/engine/http/router.d.ts +8 -0
  147. package/dist/server/engine/http/router.d.ts.map +1 -0
  148. package/dist/server/engine/http/router.js +402 -0
  149. package/dist/server/engine/http/router.js.map +1 -0
  150. package/dist/server/engine/http/sigv4.d.ts +9 -0
  151. package/dist/server/engine/http/sigv4.d.ts.map +1 -0
  152. package/dist/server/engine/http/sigv4.js +33 -0
  153. package/dist/server/engine/http/sigv4.js.map +1 -0
  154. package/dist/server/engine/http/xml.d.ts +16 -0
  155. package/dist/server/engine/http/xml.d.ts.map +1 -0
  156. package/dist/server/engine/http/xml.js +92 -0
  157. package/dist/server/engine/http/xml.js.map +1 -0
  158. package/dist/server/engine/store/atomic.d.ts +4 -0
  159. package/dist/server/engine/store/atomic.d.ts.map +1 -0
  160. package/dist/server/engine/store/atomic.js +35 -0
  161. package/dist/server/engine/store/atomic.js.map +1 -0
  162. package/dist/server/engine/store/engine-store.d.ts +9 -0
  163. package/dist/server/engine/store/engine-store.d.ts.map +1 -0
  164. package/dist/server/engine/store/engine-store.js +218 -0
  165. package/dist/server/engine/store/engine-store.js.map +1 -0
  166. package/dist/server/engine/store/store-types.d.ts +37 -0
  167. package/dist/server/engine/store/store-types.d.ts.map +1 -0
  168. package/dist/server/engine/store/store-types.js +17 -0
  169. package/dist/server/engine/store/store-types.js.map +1 -0
  170. package/dist/server/engine/store/wal.d.ts +49 -0
  171. package/dist/server/engine/store/wal.d.ts.map +1 -0
  172. package/dist/server/engine/store/wal.js +328 -0
  173. package/dist/server/engine/store/wal.js.map +1 -0
  174. package/dist/server/engine/types.d.ts +137 -0
  175. package/dist/server/engine/types.d.ts.map +1 -0
  176. package/dist/server/engine/types.js +8 -0
  177. package/dist/server/engine/types.js.map +1 -0
  178. package/dist/server/index.js +43 -9
  179. package/dist/server/index.js.map +1 -1
  180. package/dist/server/routes/config.d.ts.map +1 -1
  181. package/dist/server/routes/config.js +16 -0
  182. package/dist/server/routes/config.js.map +1 -1
  183. package/dist/server/routes/opensearch.d.ts +3 -0
  184. package/dist/server/routes/opensearch.d.ts.map +1 -0
  185. package/dist/server/routes/opensearch.js +69 -0
  186. package/dist/server/routes/opensearch.js.map +1 -0
  187. package/dist/server/routes/resources.d.ts.map +1 -1
  188. package/dist/server/routes/resources.js +4 -1
  189. package/dist/server/routes/resources.js.map +1 -1
  190. package/dist/server/routes/services.d.ts.map +1 -1
  191. package/dist/server/routes/services.js +3 -0
  192. package/dist/server/routes/services.js.map +1 -1
  193. package/dist/server/services/cache-manager.d.ts +2 -1
  194. package/dist/server/services/cache-manager.d.ts.map +1 -1
  195. package/dist/server/services/cache-manager.js +22 -2
  196. package/dist/server/services/cache-manager.js.map +1 -1
  197. package/dist/server/services/cloudformation-parser.d.ts +35 -2
  198. package/dist/server/services/cloudformation-parser.d.ts.map +1 -1
  199. package/dist/server/services/cloudformation-parser.js +88 -3
  200. package/dist/server/services/cloudformation-parser.js.map +1 -1
  201. package/dist/server/services/config-manager.d.ts +82 -0
  202. package/dist/server/services/config-manager.d.ts.map +1 -1
  203. package/dist/server/services/config-manager.js +151 -7
  204. package/dist/server/services/config-manager.js.map +1 -1
  205. package/dist/server/services/gateway-manager.d.ts +2 -0
  206. package/dist/server/services/gateway-manager.d.ts.map +1 -1
  207. package/dist/server/services/gateway-manager.js +44 -6
  208. package/dist/server/services/gateway-manager.js.map +1 -1
  209. package/dist/server/services/localstack-manager.d.ts +0 -7
  210. package/dist/server/services/localstack-manager.d.ts.map +1 -1
  211. package/dist/server/services/localstack-manager.js +11 -173
  212. package/dist/server/services/localstack-manager.js.map +1 -1
  213. package/dist/server/services/opensearch-explorer.d.ts +37 -0
  214. package/dist/server/services/opensearch-explorer.d.ts.map +1 -0
  215. package/dist/server/services/opensearch-explorer.js +124 -0
  216. package/dist/server/services/opensearch-explorer.js.map +1 -0
  217. package/dist/server/services/resource-provisioner.d.ts +13 -0
  218. package/dist/server/services/resource-provisioner.d.ts.map +1 -1
  219. package/dist/server/services/resource-provisioner.js +257 -11
  220. package/dist/server/services/resource-provisioner.js.map +1 -1
  221. package/dist/server/services/service-registrar.d.ts +1 -0
  222. package/dist/server/services/service-registrar.d.ts.map +1 -1
  223. package/dist/server/services/service-registrar.js +19 -4
  224. package/dist/server/services/service-registrar.js.map +1 -1
  225. package/dist/ui/assets/ApisPage-C0xaNFQW.js +1 -0
  226. package/dist/ui/assets/BucketDetailPage-Bnny8S04.js +1 -0
  227. package/dist/ui/assets/BucketsPage-Dd3Y4-gU.js +1 -0
  228. package/dist/ui/assets/{DynamoPage-B1__Rjr2.js → DynamoPage-JzSF-4VI.js} +1 -1
  229. package/dist/ui/assets/DynamoTablePage-uM0DXGCo.js +3 -0
  230. package/dist/ui/assets/LambdaDetailPage-CoR9ZXdb.js +4 -0
  231. package/dist/ui/assets/LambdasPage-CNMX_O5P.js +1 -0
  232. package/dist/ui/assets/OpenSearchCollectionPage-D5FaSCF1.js +1 -0
  233. package/dist/ui/assets/OpenSearchPage-FEzLxaej.js +1 -0
  234. package/dist/ui/assets/OverviewPage-0xvjT7Q0.js +1 -0
  235. package/dist/ui/assets/OverviewPage-qEl0a-0B.css +1 -0
  236. package/dist/ui/assets/QueueDetailPage-B2GaNLLe.js +1 -0
  237. package/dist/ui/assets/QueuesPage-Ch5kGwrp.js +1 -0
  238. package/dist/ui/assets/ServiceDetailPage-DKiz21oo.js +2 -0
  239. package/dist/ui/assets/ServicesPage-Cmi3UIfM.js +2 -0
  240. package/dist/ui/assets/index-DH7RTkRh.css +1 -0
  241. package/dist/ui/assets/index-MF9fVrsr.js +37 -0
  242. package/dist/ui/index.html +2 -2
  243. package/package.json +3 -1
  244. package/dist/ui/assets/ApisPage-DdgKjEdS.js +0 -1
  245. package/dist/ui/assets/BucketDetailPage-DZQGxm0y.js +0 -1
  246. package/dist/ui/assets/BucketsPage-xYXzxCvd.js +0 -1
  247. package/dist/ui/assets/DynamoTablePage-BCoxPdXW.js +0 -3
  248. package/dist/ui/assets/LambdaDetailPage-B85CA8tb.js +0 -4
  249. package/dist/ui/assets/LambdasPage-_TtxQMT_.js +0 -1
  250. package/dist/ui/assets/OverviewPage-6jDXV1jr.css +0 -1
  251. package/dist/ui/assets/OverviewPage-CqTKTY64.js +0 -1
  252. package/dist/ui/assets/QueueDetailPage-BOr_sImA.js +0 -1
  253. package/dist/ui/assets/QueuesPage-DpByfcM5.js +0 -1
  254. package/dist/ui/assets/ServiceDetailPage-DsWgV-ad.js +0 -2
  255. package/dist/ui/assets/ServicesPage-CGlpsj98.js +0 -2
  256. package/dist/ui/assets/index-BWlB542w.js +0 -36
  257. package/dist/ui/assets/index-EYnsoJOq.css +0 -1
@@ -1,24 +1,11 @@
1
- import { spawn, exec } from 'child_process';
2
- import { promisify } from 'util';
3
- import { ConfigManager } from './config-manager.js';
4
- const execAsync = promisify(exec);
1
+ // Deprecated facade kept so the ~10 existing call sites (provisioner,
2
+ // explorers, seeds, dynamo-proxy, routes) stay untouched: they keep importing
3
+ // LocalStackManager, but the active provider may be the LocalStack container
4
+ // OR the in-process self engine — EngineManager decides from the config.
5
+ // New code should use EngineManager directly.
6
+ import { EngineManager } from '../engine/engine-manager.js';
5
7
  export class LocalStackManager {
6
8
  static instance;
7
- process = null;
8
- _isRunning = false;
9
- endpoint;
10
- // Container name is scoped to the LocalStack port so multiple LSS instances
11
- // (one per example/project) can launch their own container side by side.
12
- // Falls back to "lss-localstack" when the default 4566 is in use to preserve
13
- // existing teardown scripts that look for that name.
14
- containerName;
15
- configManager;
16
- constructor() {
17
- this.configManager = ConfigManager.getInstance();
18
- this.endpoint = this.configManager.getLocalStackEndpoint();
19
- const port = this.configManager.getLocalStackPort();
20
- this.containerName = port === 4566 ? 'lss-localstack' : `lss-localstack-${port}`;
21
- }
22
9
  static getInstance() {
23
10
  if (!LocalStackManager.instance) {
24
11
  LocalStackManager.instance = new LocalStackManager();
@@ -26,168 +13,19 @@ export class LocalStackManager {
26
13
  return LocalStackManager.instance;
27
14
  }
28
15
  async start() {
29
- if (this._isRunning) {
30
- console.log('⚠️ LocalStack already running');
31
- return;
32
- }
33
- if (this.configManager.isExternal()) {
34
- console.log(`🔗 Using external LocalStack at ${this.endpoint}`);
35
- await this.waitForReady(30);
36
- this._isRunning = true;
37
- console.log('✅ Connected to external LocalStack');
38
- return;
39
- }
40
- try {
41
- // Check if docker is available
42
- await execAsync('docker ps -q', { timeout: 5000 });
43
- }
44
- catch {
45
- throw new Error('Docker is not available or not running. Please start Docker first.');
46
- }
47
- const edition = this.configManager.getLocalStackEdition();
48
- const image = this.configManager.getLocalStackImage();
49
- const authToken = this.configManager.getLocalStackAuthToken();
50
- if (edition === 'pro' && !authToken) {
51
- throw new Error('LocalStack Pro requires LOCALSTACK_AUTH_TOKEN. Set the env var or "localstackAuthToken" in your config.');
52
- }
53
- if (edition === 'community' && !authToken) {
54
- console.warn('⚠️ LOCALSTACK_AUTH_TOKEN not set. Recent localstack/localstack images (>= 2026.5) require a token even for the community edition.');
55
- }
56
- return new Promise((resolve, reject) => {
57
- console.log(`🔄 Starting LocalStack (${image})...`);
58
- const port = this.configManager.getLocalStackPort();
59
- const services = this.configManager.getServices().join(',');
60
- const persistence = this.configManager.isPersistence() ? '1' : '0';
61
- const debug = this.configManager.isDebug() ? '1' : '0';
62
- // Persistence volume is scoped to the container so two LSS instances
63
- // don't share (and corrupt) the same on-disk state.
64
- const volumeName = this.containerName === 'lss-localstack'
65
- ? 'lss-localstack-data'
66
- : `${this.containerName}-data`;
67
- const dockerArgs = [
68
- 'run',
69
- '--rm',
70
- '-p',
71
- `${port}:4566`,
72
- '-v',
73
- `${volumeName}:/var/lib/localstack`,
74
- '-v',
75
- '/var/run/docker.sock:/var/run/docker.sock',
76
- // host.docker.internal resolves natively on Docker Desktop but not on
77
- // Linux; the generated Lambda proxies target it to reach the invoke
78
- // listeners on the host, so map it explicitly (no-op elsewhere).
79
- '--add-host',
80
- 'host.docker.internal:host-gateway',
81
- '--name',
82
- this.containerName,
83
- '-e',
84
- `SERVICES=${services}`,
85
- '-e',
86
- 'LAMBDA_EXECUTOR=local',
87
- // Lambda containers spawned BY LocalStack (which run the proxies) need
88
- // the same host mapping.
89
- '-e',
90
- 'LAMBDA_DOCKER_FLAGS=--add-host host.docker.internal:host-gateway',
91
- '-e',
92
- `PERSISTENCE=${persistence}`,
93
- '-e',
94
- `DEBUG=${debug}`,
95
- ];
96
- if (authToken) {
97
- dockerArgs.push('-e', `LOCALSTACK_AUTH_TOKEN=${authToken}`);
98
- }
99
- dockerArgs.push(image);
100
- this.process = spawn('docker', dockerArgs);
101
- let stderr = '';
102
- let stdout = '';
103
- this.process.stderr?.on('data', data => {
104
- stderr += data.toString();
105
- console.log(`[LocalStack stderr] ${data.toString().trim()}`);
106
- });
107
- this.process.stdout?.on('data', data => {
108
- stdout += data.toString();
109
- console.log(`[LocalStack stdout] ${data.toString().trim()}`);
110
- });
111
- this.process.on('error', error => {
112
- console.error('❌ Failed to start LocalStack process:', error);
113
- reject(error);
114
- });
115
- this.process.on('close', code => {
116
- if (code !== 0) {
117
- console.error(`Container exited with code ${code}`);
118
- console.error('stderr:', stderr);
119
- console.error('stdout:', stdout);
120
- }
121
- });
122
- // Wait for LocalStack to be ready
123
- this.waitForReady()
124
- .then(() => {
125
- this._isRunning = true;
126
- console.log('✅ LocalStack ready');
127
- resolve();
128
- })
129
- .catch(err => {
130
- console.error('LocalStack startup error:', err.message);
131
- this.process?.kill();
132
- reject(err);
133
- });
134
- });
16
+ return EngineManager.getInstance().start();
135
17
  }
136
18
  async stop() {
137
- if (!this._isRunning) {
138
- return;
139
- }
140
- if (this.configManager.isExternal()) {
141
- console.log('🔗 External LocalStack — leaving container untouched');
142
- this._isRunning = false;
143
- return;
144
- }
145
- console.log('🛑 Stopping LocalStack...');
146
- try {
147
- await execAsync(`docker stop ${this.containerName}`, { timeout: 10000 });
148
- this._isRunning = false;
149
- this.process = null;
150
- console.log('✅ LocalStack stopped');
151
- }
152
- catch (error) {
153
- console.error('⚠️ Error stopping LocalStack:', error instanceof Error ? error.message : 'Unknown error');
154
- this._isRunning = false;
155
- }
156
- }
157
- async waitForReady(maxAttempts = 120) {
158
- for (let i = 0; i < maxAttempts; i++) {
159
- try {
160
- const response = await fetch(`${this.endpoint}/_localstack/health`);
161
- if (response.ok) {
162
- console.log(`✓ LocalStack is responsive (attempt ${i + 1}/${maxAttempts})`);
163
- return;
164
- }
165
- }
166
- catch {
167
- // Ignore fetch errors during startup
168
- if (i % 20 === 0) {
169
- console.log(`⏳ Waiting for LocalStack... (attempt ${i + 1}/${maxAttempts})`);
170
- }
171
- }
172
- await new Promise(resolve => setTimeout(resolve, 1000));
173
- }
174
- throw new Error('LocalStack failed to start in time (120s timeout). Check Docker and container logs.');
19
+ return EngineManager.getInstance().stop();
175
20
  }
176
21
  isRunning() {
177
- return this._isRunning;
22
+ return EngineManager.getInstance().isRunning();
178
23
  }
179
24
  getEndpoint() {
180
- return this.endpoint;
25
+ return EngineManager.getInstance().getEndpoint();
181
26
  }
182
27
  getConfig() {
183
- return {
184
- endpoint: this.endpoint,
185
- region: this.configManager.getRegion(),
186
- credentials: {
187
- accessKeyId: process.env.LOCALSTACK_ACCESS_KEY_ID || 'test',
188
- secretAccessKey: process.env.LOCALSTACK_SECRET_ACCESS_KEY || 'test',
189
- },
190
- };
28
+ return EngineManager.getInstance().getConfig();
191
29
  }
192
30
  }
193
31
  //# sourceMappingURL=localstack-manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"localstack-manager.js","sourceRoot":"","sources":["../../../src/server/services/localstack-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAgB,IAAI,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,MAAM,OAAO,iBAAiB;IACpB,MAAM,CAAC,QAAQ,CAAoB;IACnC,OAAO,GAAwB,IAAI,CAAC;IACpC,UAAU,GAAG,KAAK,CAAC;IACnB,QAAQ,CAAS;IACzB,4EAA4E;IAC5E,yEAAyE;IACzE,6EAA6E;IAC7E,qDAAqD;IACpC,aAAa,CAAS;IACtB,aAAa,CAAgB;IAE9C;QACE,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;QACjD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC;QAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,iBAAiB,EAAE,CAAC;QACpD,IAAI,CAAC,aAAa,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,kBAAkB,IAAI,EAAE,CAAC;IACnF,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC;YAChC,iBAAiB,CAAC,QAAQ,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACvD,CAAC;QACD,OAAO,iBAAiB,CAAC,QAAQ,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,mCAAmC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YAChE,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YAC5B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;YAClD,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,+BAA+B;YAC/B,MAAM,SAAS,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;QACxF,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,oBAAoB,EAAE,CAAC;QAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,kBAAkB,EAAE,CAAC;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,sBAAsB,EAAE,CAAC;QAE9D,IAAI,OAAO,KAAK,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CACb,yGAAyG,CAC1G,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,KAAK,WAAW,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1C,OAAO,CAAC,IAAI,CACV,oIAAoI,CACrI,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,MAAM,CAAC,CAAC;YAEpD,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,iBAAiB,EAAE,CAAC;YACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACnE,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAEvD,qEAAqE;YACrE,oDAAoD;YACpD,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,KAAK,gBAAgB;gBACxD,CAAC,CAAC,qBAAqB;gBACvB,CAAC,CAAC,GAAG,IAAI,CAAC,aAAa,OAAO,CAAC;YAEjC,MAAM,UAAU,GAAG;gBACjB,KAAK;gBACL,MAAM;gBACN,IAAI;gBACJ,GAAG,IAAI,OAAO;gBACd,IAAI;gBACJ,GAAG,UAAU,sBAAsB;gBACnC,IAAI;gBACJ,2CAA2C;gBAC3C,sEAAsE;gBACtE,oEAAoE;gBACpE,iEAAiE;gBACjE,YAAY;gBACZ,mCAAmC;gBACnC,QAAQ;gBACR,IAAI,CAAC,aAAa;gBAClB,IAAI;gBACJ,YAAY,QAAQ,EAAE;gBACtB,IAAI;gBACJ,uBAAuB;gBACvB,uEAAuE;gBACvE,yBAAyB;gBACzB,IAAI;gBACJ,kEAAkE;gBAClE,IAAI;gBACJ,eAAe,WAAW,EAAE;gBAC5B,IAAI;gBACJ,SAAS,KAAK,EAAE;aACjB,CAAC;YAEF,IAAI,SAAS,EAAE,CAAC;gBACd,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,yBAAyB,SAAS,EAAE,CAAC,CAAC;YAC9D,CAAC;YAED,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEvB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAE3C,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE;gBACrC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC1B,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC/D,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE;gBACrC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC1B,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC/D,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;gBAC/B,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;gBAC9D,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE;gBAC9B,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAC;oBACpD,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;oBACjC,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,kCAAkC;YAClC,IAAI,CAAC,YAAY,EAAE;iBAChB,IAAI,CAAC,GAAG,EAAE;gBACT,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;gBAClC,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC;iBACD,KAAK,CAAC,GAAG,CAAC,EAAE;gBACX,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;gBACxD,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;gBACrB,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;YACpE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QAEzC,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,eAAe,IAAI,CAAC,aAAa,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACzE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;YAC1G,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,WAAW,GAAG,GAAG;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,qBAAqB,CAAC,CAAC;gBACpE,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;oBAChB,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,GAAG,CAAC,IAAI,WAAW,GAAG,CAAC,CAAC;oBAC5E,OAAO;gBACT,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,qCAAqC;gBACrC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;oBACjB,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,GAAG,CAAC,IAAI,WAAW,GAAG,CAAC,CAAC;gBAC/E,CAAC;YACH,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAC1D,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,qFAAqF,CAAC,CAAC;IACzG,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,SAAS;QACP,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE;YACtC,WAAW,EAAE;gBACX,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,MAAM;gBAC3D,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,MAAM;aACpE;SACF,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"localstack-manager.js","sourceRoot":"","sources":["../../../src/server/services/localstack-manager.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,8EAA8E;AAC9E,6EAA6E;AAC7E,yEAAyE;AACzE,8CAA8C;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,MAAM,OAAO,iBAAiB;IACpB,MAAM,CAAC,QAAQ,CAAoB;IAE3C,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC;YAChC,iBAAiB,CAAC,QAAQ,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACvD,CAAC;QACD,OAAO,iBAAiB,CAAC,QAAQ,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,OAAO,aAAa,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,IAAI;QACR,OAAO,aAAa,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IAC5C,CAAC;IAED,SAAS;QACP,OAAO,aAAa,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,CAAC;IACjD,CAAC;IAED,WAAW;QACT,OAAO,aAAa,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,CAAC;IACnD,CAAC;IAED,SAAS;QACP,OAAO,aAAa,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,CAAC;IACjD,CAAC;CACF"}
@@ -0,0 +1,37 @@
1
+ export interface OpenSearchCollectionSummary {
2
+ name: string;
3
+ endpoint: string;
4
+ }
5
+ export interface OpenSearchIndexSummary {
6
+ index: string;
7
+ docsCount: number;
8
+ health: string;
9
+ status: string;
10
+ }
11
+ export interface OpenSearchSearchInput {
12
+ index?: string;
13
+ q?: string;
14
+ query?: unknown;
15
+ from?: number;
16
+ size?: number;
17
+ }
18
+ export declare class OpenSearchDataPlaneError extends Error {
19
+ readonly status: number;
20
+ constructor(status: number, message: string);
21
+ }
22
+ export declare class OpenSearchExplorer {
23
+ private static instance;
24
+ private clients;
25
+ private defaultRegion;
26
+ private constructor();
27
+ static getInstance(): OpenSearchExplorer;
28
+ setDefaultRegion(region: string): void;
29
+ private aossBase;
30
+ private clientFor;
31
+ listCollections(region?: string): Promise<OpenSearchCollectionSummary[]>;
32
+ listIndices(collection: string, region?: string): Promise<OpenSearchIndexSummary[]>;
33
+ search(collection: string, input: OpenSearchSearchInput, region?: string): Promise<unknown>;
34
+ private dataPlaneFetch;
35
+ private errorReason;
36
+ }
37
+ //# sourceMappingURL=opensearch-explorer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opensearch-explorer.d.ts","sourceRoot":"","sources":["../../../src/server/services/opensearch-explorer.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,MAAM,CAAC;IAEb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAaD,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK5C;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAqB;IAC5C,OAAO,CAAC,OAAO,CAAiD;IAChE,OAAO,CAAC,aAAa,CAAuB;IAE5C,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,kBAAkB;IAKxC,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQtC,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,SAAS;IAWX,eAAe,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,2BAA2B,EAAE,CAAC;IASxE,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAenF,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAenF,cAAc;IAiC5B,OAAO,CAAC,WAAW;CAUpB"}
@@ -0,0 +1,124 @@
1
+ import { OpenSearchServerlessClient, ListCollectionsCommand, } from '@aws-sdk/client-opensearchserverless';
2
+ import { LocalStackManager } from './localstack-manager.js';
3
+ import { ConfigManager } from './config-manager.js';
4
+ import { aossEndpoint } from './resource-provisioner.js';
5
+ // Data-plane failure carrying the upstream HTTP status, so the route can
6
+ // translate it (404 for an unknown collection) instead of a blanket 500.
7
+ export class OpenSearchDataPlaneError extends Error {
8
+ status;
9
+ constructor(status, message) {
10
+ super(message);
11
+ this.name = 'OpenSearchDataPlaneError';
12
+ this.status = status;
13
+ }
14
+ }
15
+ export class OpenSearchExplorer {
16
+ static instance;
17
+ clients = new Map();
18
+ defaultRegion = 'us-east-1';
19
+ constructor() { }
20
+ static getInstance() {
21
+ if (!OpenSearchExplorer.instance)
22
+ OpenSearchExplorer.instance = new OpenSearchExplorer();
23
+ return OpenSearchExplorer.instance;
24
+ }
25
+ setDefaultRegion(region) {
26
+ if (region)
27
+ this.defaultRegion = region;
28
+ }
29
+ // aoss does not answer on the engine endpoint when the sidecar runs (no
30
+ // LocalStack edition provides aoss). Both planes target the base
31
+ // aossEndpoint() picks: the sidecar when enabled, else the engine itself
32
+ // (the self engine serves aoss natively).
33
+ aossBase() {
34
+ return aossEndpoint(ConfigManager.getInstance(), LocalStackManager.getInstance().getConfig().endpoint);
35
+ }
36
+ clientFor(region) {
37
+ const r = region || this.defaultRegion;
38
+ let client = this.clients.get(r);
39
+ if (!client) {
40
+ const baseConfig = LocalStackManager.getInstance().getConfig();
41
+ client = new OpenSearchServerlessClient({ ...baseConfig, region: r, endpoint: this.aossBase() });
42
+ this.clients.set(r, client);
43
+ }
44
+ return client;
45
+ }
46
+ async listCollections(region) {
47
+ const response = await this.clientFor(region).send(new ListCollectionsCommand({}));
48
+ const base = this.aossBase();
49
+ return (response.collectionSummaries ?? [])
50
+ .map(summary => summary.name)
51
+ .filter((name) => typeof name === 'string' && name.length > 0)
52
+ .map(name => ({ name, endpoint: `${base}/_aoss/${name}` }));
53
+ }
54
+ async listIndices(collection, region) {
55
+ const col = encodeURIComponent(collection);
56
+ // format=json matches the real _cat API (plain text by default); the LSS
57
+ // emulator answers JSON either way.
58
+ const rows = (await this.dataPlaneFetch('GET', `${col}/_cat/indices`, undefined, region, {
59
+ format: 'json',
60
+ }));
61
+ return rows.map(row => ({
62
+ index: row.index,
63
+ docsCount: Number(row['docs.count']),
64
+ health: row.health,
65
+ status: row.status,
66
+ }));
67
+ }
68
+ async search(collection, input, region) {
69
+ const col = encodeURIComponent(collection);
70
+ const path = input.index !== undefined
71
+ ? `${col}/${encodeURIComponent(input.index)}/_search`
72
+ : `${col}/_search`;
73
+ const body = {};
74
+ if (input.query !== undefined)
75
+ body.query = input.query;
76
+ if (input.from !== undefined)
77
+ body.from = input.from;
78
+ if (input.size !== undefined)
79
+ body.size = input.size;
80
+ // ?q= is forwarded verbatim: the emulator derives a match (field:value) or
81
+ // multi_match (bare text) query from it, and rejects q alongside a body
82
+ // query with a 400 that passes through to the caller untouched.
83
+ return this.dataPlaneFetch('POST', path, body, region, input.q !== undefined ? { q: input.q } : undefined);
84
+ }
85
+ async dataPlaneFetch(method, path, body, region, params) {
86
+ const url = new URL(`${this.aossBase()}/_aoss/${path}`);
87
+ // Pin the data-plane region without signing: the engine router mines
88
+ // {region, service} from the SigV4 credential scope — the Authorization
89
+ // header or the presigned-style X-Amz-Credential query param — and never
90
+ // verifies the signature (engine/http/sigv4.ts resolveSigV4Scope). A
91
+ // scope-shaped credential is therefore enough to route this unsigned
92
+ // request to the effective region instead of the engine's boot region.
93
+ const r = region || this.defaultRegion;
94
+ url.searchParams.set('X-Amz-Credential', `lss-dashboard/00000000/${r}/aoss/aws4_request`);
95
+ for (const [key, value] of Object.entries(params ?? {}))
96
+ url.searchParams.set(key, value);
97
+ const response = await fetch(url, {
98
+ method,
99
+ ...(body !== undefined
100
+ ? { headers: { 'content-type': 'application/json' }, body: JSON.stringify(body) }
101
+ : {}),
102
+ });
103
+ const text = await response.text();
104
+ if (!response.ok) {
105
+ throw new OpenSearchDataPlaneError(response.status, this.errorReason(text, response.status));
106
+ }
107
+ return JSON.parse(text);
108
+ }
109
+ // Mine the OpenSearch error shape ({"error":{"type","reason"},"status":N})
110
+ // for its reason; anything else falls back to a generic message.
111
+ errorReason(text, status) {
112
+ try {
113
+ const payload = JSON.parse(text);
114
+ const reason = payload?.error?.reason;
115
+ if (typeof reason === 'string')
116
+ return reason;
117
+ }
118
+ catch {
119
+ // Not JSON — use the generic message.
120
+ }
121
+ return `OpenSearch data plane answered HTTP ${status}`;
122
+ }
123
+ }
124
+ //# sourceMappingURL=opensearch-explorer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opensearch-explorer.js","sourceRoot":"","sources":["../../../src/server/services/opensearch-explorer.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  import { S3Client } from '@aws-sdk/client-s3';
2
+ import { ConfigManager } from './config-manager.js';
2
3
  import type { Resource } from './cloudformation-parser.js';
4
+ export declare function aossEndpoint(config: Pick<ConfigManager, 'getAossSidecarConfig'>, engineEndpoint: string): string;
3
5
  export declare class ResourceProvisioner {
4
6
  private static instance;
5
7
  private dynamoClient;
@@ -7,6 +9,8 @@ export declare class ResourceProvisioner {
7
9
  private snsClient;
8
10
  private s3Client;
9
11
  private lambdaClient;
12
+ private eventBridgeClient;
13
+ private openSearchClient;
10
14
  private currentRegion;
11
15
  private resourcesByLogicalId;
12
16
  private constructor();
@@ -29,6 +33,10 @@ export declare class ResourceProvisioner {
29
33
  private resolveLambdaName;
30
34
  private generateProxyLambdaCode;
31
35
  private createEventSourceMapping;
36
+ private createOpenSearchCollection;
37
+ private createEventBus;
38
+ private resolveEventBusName;
39
+ private createEventRule;
32
40
  private ensureLambdaProxyExists;
33
41
  private convertCamelCaseToKebab;
34
42
  private resolveEventSourceArn;
@@ -37,12 +45,17 @@ export declare class ResourceProvisioner {
37
45
  queues: string[];
38
46
  topics: string[];
39
47
  buckets: string[];
48
+ collections: string[];
40
49
  }>;
41
50
  private listDynamoDBTables;
42
51
  private listSQSQueues;
43
52
  private listSNSTopics;
44
53
  private listS3Buckets;
54
+ private listOpenSearchCollections;
45
55
  cleanupResources(serviceName: string, resources: Resource[]): Promise<void>;
56
+ private deleteOpenSearchCollection;
57
+ private deleteEventRule;
58
+ private deleteEventBus;
46
59
  private deleteDynamoDBTable;
47
60
  private deleteSQSQueue;
48
61
  private deleteS3Bucket;
@@ -1 +1 @@
1
- {"version":3,"file":"resource-provisioner.d.ts","sourceRoot":"","sources":["../../../src/server/services/resource-provisioner.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,QAAQ,EAQT,MAAM,oBAAoB,CAAC;AAM5B,OAAO,KAAK,EACV,QAAQ,EAMT,MAAM,4BAA4B,CAAC;AAGpC,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAsB;IAC7C,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,QAAQ,CAAY;IAC5B,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,aAAa,CAAuB;IAM5C,OAAO,CAAC,oBAAoB,CAA+B;IAE3D,OAAO;IAIP,MAAM,CAAC,WAAW,IAAI,mBAAmB;IAOzC,OAAO,CAAC,iBAAiB;IAezB,WAAW,IAAI,QAAQ;IAIvB,gBAAgB,IAAI,MAAM;IAIpB,kBAAkB,CACtB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,QAAQ,EAAE,EACrB,QAAQ,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GACtE,OAAO,CAAC,IAAI,CAAC;YAuFF,mBAAmB;YA+DnB,eAAe;YAqBf,cAAc;YAiCd,cAAc;YAiBd,cAAc;YA4Bd,wBAAwB;IAiEtC,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,uBAAuB;YAoEjB,wBAAwB;YAsExB,uBAAuB;IAqErC,OAAO,CAAC,uBAAuB;YAOjB,qBAAqB;IAkH7B,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAC/C,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;YAoBY,kBAAkB;YASlB,aAAa;YASb,aAAa;YAYb,aAAa;IASrB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAyCnE,mBAAmB;YAYnB,cAAc;YAiBd,cAAc;YAsBd,cAAc;YAkBd,wBAAwB;CA6BvC"}
1
+ {"version":3,"file":"resource-provisioner.d.ts","sourceRoot":"","sources":["../../../src/server/services/resource-provisioner.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,QAAQ,EAQT,MAAM,oBAAoB,CAAC;AAoB5B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,KAAK,EACV,QAAQ,EAST,MAAM,4BAA4B,CAAC;AAOpC,wBAAgB,YAAY,CAC1B,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,sBAAsB,CAAC,EACnD,cAAc,EAAE,MAAM,GACrB,MAAM,CAGR;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAsB;IAC7C,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,QAAQ,CAAY;IAC5B,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,gBAAgB,CAA8B;IACtD,OAAO,CAAC,aAAa,CAAuB;IAM5C,OAAO,CAAC,oBAAoB,CAA+B;IAE3D,OAAO;IAIP,MAAM,CAAC,WAAW,IAAI,mBAAmB;IAOzC,OAAO,CAAC,iBAAiB;IAqBzB,WAAW,IAAI,QAAQ;IAIvB,gBAAgB,IAAI,MAAM;IAIpB,kBAAkB,CACtB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,QAAQ,EAAE,EACrB,QAAQ,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GACtE,OAAO,CAAC,IAAI,CAAC;YA4GF,mBAAmB;YA+DnB,eAAe;YAqBf,cAAc;YAiCd,cAAc;YAiBd,cAAc;YA4Bd,wBAAwB;IAiEtC,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,uBAAuB;YAmEjB,wBAAwB;YAsExB,0BAA0B;YAgC1B,cAAc;IAgB5B,OAAO,CAAC,mBAAmB;YASb,eAAe;YAyEf,uBAAuB;IAqErC,OAAO,CAAC,uBAAuB;YAOjB,qBAAqB;IAkH7B,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAC/C,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,WAAW,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC;YA2BY,kBAAkB;YASlB,aAAa;YASb,aAAa;YAYb,aAAa;YAWb,yBAAyB;IASjC,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YA2EnE,0BAA0B;YAY1B,eAAe;YAuBf,cAAc;YAWd,mBAAmB;YAYnB,cAAc;YAiBd,cAAc;YAsBd,cAAc;YAkBd,wBAAwB;CA6BvC"}