fauxqs 1.1.0 → 1.3.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 (59) hide show
  1. package/README.md +179 -34
  2. package/dist/app.d.ts +30 -2
  3. package/dist/app.d.ts.map +1 -1
  4. package/dist/app.js +62 -8
  5. package/dist/app.js.map +1 -1
  6. package/dist/initConfig.d.ts +28 -0
  7. package/dist/initConfig.d.ts.map +1 -0
  8. package/dist/initConfig.js +46 -0
  9. package/dist/initConfig.js.map +1 -0
  10. package/dist/s3/actions/abortMultipartUpload.d.ts +9 -0
  11. package/dist/s3/actions/abortMultipartUpload.d.ts.map +1 -0
  12. package/dist/s3/actions/abortMultipartUpload.js +7 -0
  13. package/dist/s3/actions/abortMultipartUpload.js.map +1 -0
  14. package/dist/s3/actions/completeMultipartUpload.d.ts +9 -0
  15. package/dist/s3/actions/completeMultipartUpload.d.ts.map +1 -0
  16. package/dist/s3/actions/completeMultipartUpload.js +53 -0
  17. package/dist/s3/actions/completeMultipartUpload.js.map +1 -0
  18. package/dist/s3/actions/createMultipartUpload.d.ts +9 -0
  19. package/dist/s3/actions/createMultipartUpload.d.ts.map +1 -0
  20. package/dist/s3/actions/createMultipartUpload.js +29 -0
  21. package/dist/s3/actions/createMultipartUpload.js.map +1 -0
  22. package/dist/s3/actions/deleteBucket.d.ts +8 -0
  23. package/dist/s3/actions/deleteBucket.d.ts.map +1 -0
  24. package/dist/s3/actions/deleteBucket.js +6 -0
  25. package/dist/s3/actions/deleteBucket.js.map +1 -0
  26. package/dist/s3/actions/listBuckets.d.ts +4 -0
  27. package/dist/s3/actions/listBuckets.d.ts.map +1 -0
  28. package/dist/s3/actions/listBuckets.js +27 -0
  29. package/dist/s3/actions/listBuckets.js.map +1 -0
  30. package/dist/s3/actions/putObject.d.ts.map +1 -1
  31. package/dist/s3/actions/putObject.js.map +1 -1
  32. package/dist/s3/actions/uploadPart.d.ts +9 -0
  33. package/dist/s3/actions/uploadPart.d.ts.map +1 -0
  34. package/dist/s3/actions/uploadPart.js +32 -0
  35. package/dist/s3/actions/uploadPart.js.map +1 -0
  36. package/dist/s3/s3Router.d.ts.map +1 -1
  37. package/dist/s3/s3Router.js +59 -6
  38. package/dist/s3/s3Router.js.map +1 -1
  39. package/dist/s3/s3Store.d.ts +14 -0
  40. package/dist/s3/s3Store.d.ts.map +1 -1
  41. package/dist/s3/s3Store.js +114 -1
  42. package/dist/s3/s3Store.js.map +1 -1
  43. package/dist/s3/s3Types.d.ts +15 -0
  44. package/dist/s3/s3Types.d.ts.map +1 -1
  45. package/dist/sns/actions/listSubscriptions.js +6 -6
  46. package/dist/sns/actions/publish.js +8 -1
  47. package/dist/sns/actions/publish.js.map +1 -1
  48. package/dist/sns/snsStore.d.ts +1 -0
  49. package/dist/sns/snsStore.d.ts.map +1 -1
  50. package/dist/sns/snsStore.js +4 -0
  51. package/dist/sns/snsStore.js.map +1 -1
  52. package/dist/sqs/actions/sendMessageBatch.d.ts.map +1 -1
  53. package/dist/sqs/actions/sendMessageBatch.js +1 -1
  54. package/dist/sqs/actions/sendMessageBatch.js.map +1 -1
  55. package/dist/sqs/sqsStore.d.ts +1 -0
  56. package/dist/sqs/sqsStore.d.ts.map +1 -1
  57. package/dist/sqs/sqsStore.js +11 -1
  58. package/dist/sqs/sqsStore.js.map +1 -1
  59. package/package.json +2 -2
package/README.md CHANGED
@@ -20,10 +20,18 @@ npx fauxqs
20
20
 
21
21
  The server starts on port `4566` and handles SQS, SNS, and S3 on a single endpoint.
22
22
 
23
- Override the port with the `FAUXQS_PORT` environment variable:
23
+ #### Environment variables
24
+
25
+ | Variable | Description | Default |
26
+ |----------|-------------|---------|
27
+ | `FAUXQS_PORT` | Port to listen on | `4566` |
28
+ | `FAUXQS_HOST` | Host for queue URLs (enables `sqs.<region>.<host>` format) | (none) |
29
+ | `FAUXQS_DEFAULT_REGION` | Fallback region for ARNs and URLs | `us-east-1` |
30
+ | `FAUXQS_LOGGER` | Enable request logging (`true`/`false`) | `true` |
31
+ | `FAUXQS_INIT` | Path to a JSON init config file (see [Init config file](#init-config-file)) | (none) |
24
32
 
25
33
  ```bash
26
- FAUXQS_PORT=3000 npx fauxqs
34
+ FAUXQS_PORT=3000 FAUXQS_INIT=init.json npx fauxqs
27
35
  ```
28
36
 
29
37
  A health check is available at `GET /health`.
@@ -62,6 +70,7 @@ Point your SDK clients at the local server:
62
70
  import { SQSClient } from "@aws-sdk/client-sqs";
63
71
  import { SNSClient } from "@aws-sdk/client-sns";
64
72
  import { S3Client } from "@aws-sdk/client-s3";
73
+ import { createLocalhostHandler } from "fauxqs";
65
74
 
66
75
  const sqsClient = new SQSClient({
67
76
  endpoint: "http://localhost:4566",
@@ -76,10 +85,10 @@ const snsClient = new SNSClient({
76
85
  });
77
86
 
78
87
  const s3Client = new S3Client({
79
- endpoint: "http://localhost:4566",
88
+ endpoint: "http://s3.localhost:4566",
80
89
  region: "us-east-1",
81
90
  credentials: { accessKeyId: "test", secretAccessKey: "test" },
82
- forcePathStyle: true,
91
+ requestHandler: createLocalhostHandler(),
83
92
  });
84
93
  ```
85
94
 
@@ -105,6 +114,76 @@ await server.stop();
105
114
 
106
115
  Pass `port: 0` to let the OS assign a random available port (useful in tests).
107
116
 
117
+ #### Programmatic state setup
118
+
119
+ The server object exposes methods for pre-creating resources without going through the SDK:
120
+
121
+ ```typescript
122
+ const server = await startFauxqs({ port: 0, logger: false });
123
+
124
+ // Create individual resources
125
+ server.createQueue("my-queue");
126
+ server.createQueue("my-dlq", {
127
+ attributes: { VisibilityTimeout: "60" },
128
+ tags: { env: "test" },
129
+ });
130
+ server.createTopic("my-topic");
131
+ server.subscribe({ topic: "my-topic", queue: "my-queue" });
132
+ server.createBucket("my-bucket");
133
+
134
+ // Or create everything at once
135
+ server.setup({
136
+ queues: [
137
+ { name: "orders" },
138
+ { name: "notifications", attributes: { DelaySeconds: "5" } },
139
+ ],
140
+ topics: [{ name: "events" }],
141
+ subscriptions: [
142
+ { topic: "events", queue: "orders" },
143
+ { topic: "events", queue: "notifications" },
144
+ ],
145
+ buckets: ["uploads", "exports"],
146
+ });
147
+
148
+ // Reset all state between tests
149
+ server.purgeAll();
150
+ ```
151
+
152
+ #### Init config file
153
+
154
+ Create a JSON file to pre-create resources on startup:
155
+
156
+ ```json
157
+ {
158
+ "queues": [
159
+ { "name": "orders" },
160
+ { "name": "orders-dlq" },
161
+ { "name": "orders.fifo", "attributes": { "FifoQueue": "true", "ContentBasedDeduplication": "true" } }
162
+ ],
163
+ "topics": [
164
+ { "name": "events" }
165
+ ],
166
+ "subscriptions": [
167
+ { "topic": "events", "queue": "orders" }
168
+ ],
169
+ "buckets": ["uploads", "exports"]
170
+ }
171
+ ```
172
+
173
+ Pass it via the `FAUXQS_INIT` environment variable or the `init` option:
174
+
175
+ ```bash
176
+ FAUXQS_INIT=init.json npx fauxqs
177
+ ```
178
+
179
+ ```typescript
180
+ const server = await startFauxqs({ init: "init.json" });
181
+ // or inline:
182
+ const server = await startFauxqs({
183
+ init: { queues: [{ name: "my-queue" }], buckets: ["my-bucket"] },
184
+ });
185
+ ```
186
+
108
187
  ### Configurable queue URL host
109
188
 
110
189
  By default, queue URLs use the request's `Host` header (e.g., `http://127.0.0.1:4566/000000000000/myQueue`). To match the AWS-style `sqs.<region>.<host>` format, pass the `host` option:
@@ -157,6 +236,12 @@ const server = await startFauxqs({ defaultRegion: "eu-west-1" });
157
236
  | TagQueue | Yes |
158
237
  | UntagQueue | Yes |
159
238
  | ListQueueTags | Yes |
239
+ | AddPermission | No |
240
+ | RemovePermission | No |
241
+ | ListDeadLetterSourceQueues | No |
242
+ | StartMessageMoveTask | No |
243
+ | CancelMessageMoveTask | No |
244
+ | ListMessageMoveTasks | No |
160
245
 
161
246
  ### SNS
162
247
 
@@ -179,6 +264,12 @@ const server = await startFauxqs({ defaultRegion: "eu-west-1" });
179
264
  | TagResource | Yes |
180
265
  | UntagResource | Yes |
181
266
  | ListTagsForResource | Yes |
267
+ | AddPermission | No |
268
+ | RemovePermission | No |
269
+ | GetDataProtectionPolicy | No |
270
+ | PutDataProtectionPolicy | No |
271
+
272
+ Platform application, SMS, and phone number actions are not supported.
182
273
 
183
274
  ### S3
184
275
 
@@ -187,19 +278,34 @@ const server = await startFauxqs({ defaultRegion: "eu-west-1" });
187
278
  | CreateBucket | Yes |
188
279
  | HeadBucket | Yes |
189
280
  | ListObjects | Yes |
281
+ | ListObjectsV2 | Yes |
282
+ | CopyObject | Yes |
190
283
  | PutObject | Yes |
191
284
  | GetObject | Yes |
192
285
  | DeleteObject | Yes |
193
286
  | HeadObject | Yes |
194
287
  | DeleteObjects | Yes |
288
+ | DeleteBucket | Yes |
289
+ | ListBuckets | Yes |
290
+ | CreateMultipartUpload | Yes |
291
+ | UploadPart | Yes |
292
+ | CompleteMultipartUpload | Yes |
293
+ | AbortMultipartUpload | Yes |
294
+ | ListObjectVersions | No |
295
+ | GetBucketLocation | No |
296
+
297
+ Bucket configuration (CORS, lifecycle, encryption, replication, etc.), ACLs, versioning, tagging, and other management actions are not supported.
195
298
 
196
299
  ### STS
197
300
 
198
301
  | Action | Supported |
199
302
  |--------|-----------|
200
303
  | GetCallerIdentity | Yes |
304
+ | AssumeRole | No |
305
+ | GetSessionToken | No |
306
+ | GetFederationToken | No |
201
307
 
202
- Returns a mock identity with account `000000000000` and ARN `arn:aws:iam::000000000000:root`. This allows tools like Terraform and the AWS CLI that call `sts:GetCallerIdentity` on startup to work without errors.
308
+ Returns a mock identity with account `000000000000` and ARN `arn:aws:iam::000000000000:root`. This allows tools like Terraform and the AWS CLI that call `sts:GetCallerIdentity` on startup to work without errors. Other STS actions are not supported.
203
309
 
204
310
  ## SQS Features
205
311
 
@@ -208,7 +314,8 @@ Returns a mock identity with account `000000000000` and ARN `arn:aws:iam::000000
208
314
  - **Delay queues** — per-queue default delay and per-message delay overrides
209
315
  - **Long polling** — `WaitTimeSeconds` on ReceiveMessage blocks until messages arrive or timeout
210
316
  - **Dead letter queues** — messages exceeding `maxReceiveCount` are moved to the configured DLQ
211
- - **Batch operations** — SendMessageBatch, DeleteMessageBatch, ChangeMessageVisibilityBatch
317
+ - **Batch operations** — SendMessageBatch, DeleteMessageBatch, ChangeMessageVisibilityBatch with entry ID validation (`InvalidBatchEntryId`) and total batch size validation (`BatchRequestTooLong`)
318
+ - **Queue attribute range validation** — validates `VisibilityTimeout`, `DelaySeconds`, `ReceiveMessageWaitTimeSeconds`, `MaximumMessageSize`, and `MessageRetentionPeriod` on both CreateQueue and SetQueueAttributes
212
319
  - **Message size validation** — rejects messages exceeding 1 MiB (1,048,576 bytes)
213
320
  - **Unicode character validation** — rejects messages with characters outside the AWS-allowed set
214
321
  - **KMS attributes** — `KmsMasterKeyId` and `KmsDataKeyReusePeriodSeconds` are accepted and stored (no actual encryption)
@@ -218,45 +325,36 @@ Returns a mock identity with account `000000000000` and ARN `arn:aws:iam::000000
218
325
  ## SNS Features
219
326
 
220
327
  - **SNS-to-SQS fan-out** — publish to a topic and messages are delivered to all confirmed SQS subscriptions
221
- - **Filter policies** — both `MessageAttributes` and `MessageBody` scope, supporting exact match, prefix, suffix, anything-but, numeric ranges, and exists
328
+ - **Filter policies** — both `MessageAttributes` and `MessageBody` scope, supporting exact match, prefix, suffix, anything-but (including anything-but with suffix), numeric ranges, exists, null conditions, and `$or` top-level grouping. MessageBody scope supports nested key matching
222
329
  - **Raw message delivery** — configurable per subscription
223
330
  - **Message size validation** — rejects messages exceeding 256 KB (262,144 bytes)
224
- - **Topic idempotency with conflict detection** — `CreateTopic` returns the existing topic when called with the same name and tags, but throws when tags differ
331
+ - **Topic idempotency with conflict detection** — `CreateTopic` returns the existing topic when called with the same name, attributes, and tags, but throws when attributes or tags differ
225
332
  - **Subscription idempotency with conflict detection** — `Subscribe` returns the existing subscription when the same (topic, protocol, endpoint) combination is used with matching attributes, but throws when attributes differ
333
+ - **Subscription attribute validation** — `SetSubscriptionAttributes` validates attribute names and rejects unknown or read-only attributes
226
334
  - **Topic and subscription tags**
227
335
  - **FIFO topics** — `.fifo` suffix enforcement, `MessageGroupId` and `MessageDeduplicationId` passthrough to SQS subscriptions, content-based deduplication
228
336
  - **Batch publish**
229
337
 
230
338
  ## S3 Features
231
339
 
232
- - **Bucket management** — CreateBucket (idempotent), HeadBucket, ListObjects
233
- - **Object operations** — PutObject, GetObject, DeleteObject, HeadObject with ETag, Content-Type, and Last-Modified headers
234
- - **Bulk delete** — DeleteObjects for batch key deletion
340
+ - **Bucket management** — CreateBucket (idempotent), DeleteBucket (rejects non-empty), HeadBucket, ListBuckets, ListObjects (V1 and V2)
341
+ - **Object operations** — PutObject, GetObject, DeleteObject, HeadObject, CopyObject with ETag, Content-Type, and Last-Modified headers
342
+ - **Multipart uploads** — CreateMultipartUpload, UploadPart, CompleteMultipartUpload, AbortMultipartUpload with correct multipart ETag calculation (`MD5-of-part-digests-partCount`), metadata preservation, and part overwrite support
343
+ - **ListObjects V2** — prefix filtering, delimiter-based virtual directories, MaxKeys, continuation tokens, StartAfter
344
+ - **CopyObject** — same-bucket and cross-bucket copy via `x-amz-copy-source` header, with metadata preservation
345
+ - **User metadata** — `x-amz-meta-*` headers are stored and returned on GetObject and HeadObject
346
+ - **Bulk delete** — DeleteObjects for batch key deletion with proper XML entity handling
235
347
  - **Keys with slashes** — full support for slash-delimited keys (e.g., `path/to/file.txt`)
236
348
  - **Stream uploads** — handles AWS chunked transfer encoding (`Content-Encoding: aws-chunked`) for stream bodies
237
349
  - **Path-style and virtual-hosted-style** — both S3 URL styles are supported (see below)
238
350
 
239
351
  ### S3 URL styles
240
352
 
241
- **Path-style** (recommended for local development):
353
+ The AWS SDK sends S3 requests using virtual-hosted-style URLs by default (e.g., `my-bucket.s3.localhost:4566`). This requires `*.localhost` to resolve to `127.0.0.1`. fauxqs provides helpers for this, plus a simple fallback.
242
354
 
243
- ```typescript
244
- const s3 = new S3Client({
245
- endpoint: "http://localhost:4566",
246
- forcePathStyle: true,
247
- // ...
248
- });
249
- ```
355
+ #### Option 1: `createLocalhostHandler()` (recommended)
250
356
 
251
- **Virtual-hosted-style** (bucket name in `Host` header):
252
-
253
- The server automatically extracts the bucket name from the `Host` header when it contains subdomains (e.g., `my-bucket.s3.localhost:4566`). This is useful for compatibility with libraries that don't set `forcePathStyle: true`.
254
-
255
- Virtual-hosted-style requires `*.localhost` to resolve to `127.0.0.1`. fauxqs provides two helpers for this — pick whichever fits your use case:
256
-
257
- #### Option 1: `createLocalhostHandler()` (per-client, no side effects)
258
-
259
- Creates an HTTP request handler that resolves all hostnames to `127.0.0.1`. Scoped to a single client instance.
357
+ Creates an HTTP request handler that resolves all hostnames to `127.0.0.1`. Scoped to a single client instance — no side effects.
260
358
 
261
359
  ```typescript
262
360
  import { S3Client } from "@aws-sdk/client-s3";
@@ -267,13 +365,10 @@ const s3 = new S3Client({
267
365
  region: "us-east-1",
268
366
  credentials: { accessKeyId: "test", secretAccessKey: "test" },
269
367
  requestHandler: createLocalhostHandler(),
270
- // no forcePathStyle needed
271
368
  });
272
369
  ```
273
370
 
274
- **Tradeoffs:** Requires one extra option (`requestHandler`) on each S3 client. Only affects the client it's attached to — safe for production code and tests alike.
275
-
276
- #### Option 2: `interceptLocalhostDns()` (global, fully transparent)
371
+ #### Option 2: `interceptLocalhostDns()` (global, for test suites)
277
372
 
278
373
  Patches Node.js `dns.lookup` so that any hostname ending in `.localhost` resolves to `127.0.0.1`. No client changes needed.
279
374
 
@@ -282,7 +377,6 @@ import { interceptLocalhostDns } from "fauxqs";
282
377
 
283
378
  const restore = interceptLocalhostDns();
284
379
 
285
- // S3 clients work without forcePathStyle or custom requestHandler
286
380
  const s3 = new S3Client({
287
381
  endpoint: "http://s3.localhost:4566",
288
382
  region: "us-east-1",
@@ -295,8 +389,59 @@ restore();
295
389
 
296
390
  The suffix is configurable: `interceptLocalhostDns("myhost.test")` matches `*.myhost.test`.
297
391
 
298
- **Tradeoffs:** Affects all DNS lookups in the process. Best suited for test suites (`beforeAll` / `afterAll`). Not recommended for production code.
392
+ **Tradeoffs:** Affects all DNS lookups in the process. Best suited for test suites (`beforeAll` / `afterAll`).
393
+
394
+ #### Option 3: `forcePathStyle` (simplest fallback)
395
+
396
+ Forces the SDK to use path-style URLs (`http://localhost:4566/my-bucket/key`) instead of virtual-hosted-style. No DNS or handler changes needed, but affects how the SDK resolves S3 URLs at runtime.
397
+
398
+ ```typescript
399
+ const s3 = new S3Client({
400
+ endpoint: "http://localhost:4566",
401
+ forcePathStyle: true,
402
+ // ...
403
+ });
404
+ ```
405
+
406
+
407
+ ### Using with AWS CLI
299
408
 
409
+ fauxqs is wire-compatible with the standard AWS CLI. Point it at the fauxqs endpoint:
410
+
411
+ #### SQS
412
+
413
+ ```bash
414
+ aws --endpoint-url http://localhost:4566 sqs create-queue --queue-name my-queue
415
+ aws --endpoint-url http://localhost:4566 sqs create-queue \
416
+ --queue-name my-queue.fifo \
417
+ --attributes FifoQueue=true,ContentBasedDeduplication=true
418
+ aws --endpoint-url http://localhost:4566 sqs send-message \
419
+ --queue-url http://localhost:4566/000000000000/my-queue \
420
+ --message-body "hello"
421
+ ```
422
+
423
+ #### SNS
424
+
425
+ ```bash
426
+ aws --endpoint-url http://localhost:4566 sns create-topic --name my-topic
427
+ aws --endpoint-url http://localhost:4566 sns subscribe \
428
+ --topic-arn arn:aws:sns:us-east-1:000000000000:my-topic \
429
+ --protocol sqs \
430
+ --notification-endpoint arn:aws:sqs:us-east-1:000000000000:my-queue
431
+ ```
432
+
433
+ #### S3
434
+
435
+ ```bash
436
+ aws --endpoint-url http://localhost:4566 s3 mb s3://my-bucket
437
+ aws --endpoint-url http://localhost:4566 s3 cp file.txt s3://my-bucket/file.txt
438
+ ```
439
+
440
+ If the AWS CLI uses virtual-hosted-style S3 URLs by default, configure path-style:
441
+
442
+ ```bash
443
+ aws configure set default.s3.addressing_style path
444
+ ```
300
445
 
301
446
  ## Conventions
302
447
 
package/dist/app.d.ts CHANGED
@@ -1,16 +1,42 @@
1
1
  import Fastify from "fastify";
2
+ import { SqsStore } from "./sqs/sqsStore.ts";
3
+ import { SnsStore } from "./sns/snsStore.ts";
4
+ import { S3Store } from "./s3/s3Store.ts";
5
+ export type { FauxqsInitConfig } from "./initConfig.ts";
2
6
  export { createLocalhostHandler, interceptLocalhostDns } from "./localhost.ts";
3
- export declare function buildApp(options?: {
7
+ export interface BuildAppOptions {
4
8
  logger?: boolean;
5
9
  host?: string;
6
10
  defaultRegion?: string;
7
- }): Fastify.FastifyInstance<import("node:http").Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>, import("node:http").IncomingMessage, import("node:http").ServerResponse<import("node:http").IncomingMessage>, Fastify.FastifyBaseLogger, Fastify.FastifyTypeProviderDefault> & PromiseLike<Fastify.FastifyInstance<import("node:http").Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>, import("node:http").IncomingMessage, import("node:http").ServerResponse<import("node:http").IncomingMessage>, Fastify.FastifyBaseLogger, Fastify.FastifyTypeProviderDefault>> & {
11
+ stores?: {
12
+ sqsStore: SqsStore;
13
+ snsStore: SnsStore;
14
+ s3Store: S3Store;
15
+ };
16
+ }
17
+ export declare function buildApp(options?: BuildAppOptions): Fastify.FastifyInstance<import("node:http").Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>, import("node:http").IncomingMessage, import("node:http").ServerResponse<import("node:http").IncomingMessage>, Fastify.FastifyBaseLogger, Fastify.FastifyTypeProviderDefault> & PromiseLike<Fastify.FastifyInstance<import("node:http").Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>, import("node:http").IncomingMessage, import("node:http").ServerResponse<import("node:http").IncomingMessage>, Fastify.FastifyBaseLogger, Fastify.FastifyTypeProviderDefault>> & {
8
18
  __linterBrands: "SafePromiseLike";
9
19
  };
10
20
  export interface FauxqsServer {
11
21
  readonly port: number;
12
22
  readonly address: string;
13
23
  stop(): Promise<void>;
24
+ createQueue(name: string, options?: {
25
+ attributes?: Record<string, string>;
26
+ tags?: Record<string, string>;
27
+ }): void;
28
+ createTopic(name: string, options?: {
29
+ attributes?: Record<string, string>;
30
+ tags?: Record<string, string>;
31
+ }): void;
32
+ subscribe(options: {
33
+ topic: string;
34
+ queue: string;
35
+ attributes?: Record<string, string>;
36
+ }): void;
37
+ createBucket(name: string): void;
38
+ setup(config: import("./initConfig.ts").FauxqsInitConfig): void;
39
+ purgeAll(): void;
14
40
  }
15
41
  export declare function startFauxqs(options?: {
16
42
  port?: number;
@@ -18,5 +44,7 @@ export declare function startFauxqs(options?: {
18
44
  host?: string;
19
45
  /** Fallback region used only when the region cannot be resolved from request Authorization headers. Defaults to "us-east-1". */
20
46
  defaultRegion?: string;
47
+ /** Path to a JSON init config file, or an inline config object. Resources are created after the server starts. */
48
+ init?: string | import("./initConfig.ts").FauxqsInitConfig;
21
49
  }): Promise<FauxqsServer>;
22
50
  //# sourceMappingURL=app.d.ts.map
package/dist/app.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAsC9B,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE/E,wBAAgB,QAAQ,CAAC,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE;;EAyI7F;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,wBAAsB,WAAW,CAAC,OAAO,CAAC,EAAE;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gIAAgI;IAChI,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,OAAO,CAAC,YAAY,CAAC,CAqBxB"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAgC7C,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAM1C,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE/E,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,QAAQ,EAAE,QAAQ,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;CACvE;AAED,wBAAgB,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe;;EAyIjD;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB,WAAW,CACT,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GAC/E,IAAI,CAAC;IACR,WAAW,CACT,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GAC/E,IAAI,CAAC;IACR,SAAS,CAAC,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GAAG,IAAI,CAAC;IAChG,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,KAAK,CAAC,MAAM,EAAE,OAAO,iBAAiB,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAChE,QAAQ,IAAI,IAAI,CAAC;CAClB;AAED,wBAAsB,WAAW,CAAC,OAAO,CAAC,EAAE;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gIAAgI;IAChI,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kHAAkH;IAClH,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,iBAAiB,EAAE,gBAAgB,CAAC;CAC5D,GAAG,OAAO,CAAC,YAAY,CAAC,CA8ExB"}
package/dist/app.js CHANGED
@@ -36,6 +36,9 @@ import { tagResource, untagResource, listTagsForResource } from "./sns/actions/t
36
36
  import { S3Store } from "./s3/s3Store.js";
37
37
  import { registerS3Routes } from "./s3/s3Router.js";
38
38
  import { getCallerIdentity } from "./sts/getCallerIdentity.js";
39
+ import { sqsQueueArn, snsTopicArn } from "./common/arnHelper.js";
40
+ import { DEFAULT_ACCOUNT_ID, DEFAULT_REGION } from "./common/types.js";
41
+ import { loadInitConfig, applyInitConfig } from "./initConfig.js";
39
42
  export { createLocalhostHandler, interceptLocalhostDns } from "./localhost.js";
40
43
  export function buildApp(options) {
41
44
  const app = Fastify({
@@ -56,14 +59,14 @@ export function buildApp(options) {
56
59
  return `/${bucket}${req.url ?? "/"}`;
57
60
  },
58
61
  });
59
- const sqsStore = new SqsStore();
62
+ const sqsStore = options?.stores?.sqsStore ?? new SqsStore();
60
63
  if (options?.host) {
61
64
  sqsStore.host = options.host;
62
65
  }
63
66
  if (options?.defaultRegion) {
64
67
  sqsStore.region = options.defaultRegion;
65
68
  }
66
- const snsStore = new SnsStore();
69
+ const snsStore = options?.stores?.snsStore ?? new SnsStore();
67
70
  if (options?.defaultRegion) {
68
71
  snsStore.region = options.defaultRegion;
69
72
  }
@@ -129,7 +132,7 @@ export function buildApp(options) {
129
132
  app.addContentTypeParser("*", { parseAs: "buffer" }, (_req, body, done) => {
130
133
  done(null, body);
131
134
  });
132
- const s3Store = new S3Store();
135
+ const s3Store = options?.stores?.s3Store ?? new S3Store();
133
136
  registerS3Routes(app, s3Store);
134
137
  app.addHook("preClose", () => {
135
138
  sqsStore.shutdown();
@@ -157,16 +160,33 @@ export function buildApp(options) {
157
160
  }
158
161
  export async function startFauxqs(options) {
159
162
  const port = options?.port ?? parseInt(process.env.FAUXQS_PORT ?? "4566");
163
+ const host = options?.host ?? process.env.FAUXQS_HOST;
164
+ const defaultRegion = options?.defaultRegion ?? process.env.FAUXQS_DEFAULT_REGION;
165
+ const loggerEnv = process.env.FAUXQS_LOGGER;
166
+ const logger = options?.logger ?? (loggerEnv !== undefined ? loggerEnv !== "false" : true);
167
+ const init = options?.init ?? process.env.FAUXQS_INIT;
168
+ const sqsStore = new SqsStore();
169
+ const snsStore = new SnsStore();
170
+ const s3Store = new S3Store();
160
171
  const app = buildApp({
161
- logger: options?.logger ?? true,
162
- host: options?.host,
163
- defaultRegion: options?.defaultRegion,
172
+ logger,
173
+ host,
174
+ defaultRegion,
175
+ stores: { sqsStore, snsStore, s3Store },
164
176
  });
165
177
  const listenAddress = await app.listen({ port, host: "127.0.0.1" });
166
178
  const url = new URL(listenAddress);
167
- return {
179
+ const actualPort = parseInt(url.port);
180
+ const region = defaultRegion ?? DEFAULT_REGION;
181
+ function makeQueueUrl(name) {
182
+ if (host) {
183
+ return `http://sqs.${region}.${host}:${actualPort}/${DEFAULT_ACCOUNT_ID}/${name}`;
184
+ }
185
+ return `http://127.0.0.1:${actualPort}/${DEFAULT_ACCOUNT_ID}/${name}`;
186
+ }
187
+ const server = {
168
188
  get port() {
169
- return parseInt(url.port);
189
+ return actualPort;
170
190
  },
171
191
  get address() {
172
192
  return listenAddress;
@@ -174,6 +194,40 @@ export async function startFauxqs(options) {
174
194
  stop() {
175
195
  return app.close();
176
196
  },
197
+ createQueue(name, opts) {
198
+ const arn = sqsQueueArn(name, region);
199
+ const queueUrl = makeQueueUrl(name);
200
+ sqsStore.createQueue(name, queueUrl, arn, opts?.attributes, opts?.tags);
201
+ },
202
+ createTopic(name, opts) {
203
+ snsStore.createTopic(name, opts?.attributes, opts?.tags);
204
+ },
205
+ subscribe(opts) {
206
+ const topicArn = snsTopicArn(opts.topic, region);
207
+ const queueArn = sqsQueueArn(opts.queue, region);
208
+ snsStore.subscribe(topicArn, "sqs", queueArn, opts.attributes);
209
+ },
210
+ createBucket(name) {
211
+ s3Store.createBucket(name);
212
+ },
213
+ setup(config) {
214
+ applyInitConfig(config, sqsStore, snsStore, s3Store, {
215
+ host,
216
+ port: actualPort,
217
+ region,
218
+ });
219
+ },
220
+ purgeAll() {
221
+ sqsStore.purgeAll();
222
+ snsStore.purgeAll();
223
+ s3Store.purgeAll();
224
+ },
177
225
  };
226
+ // Apply init config if provided
227
+ if (init) {
228
+ const config = typeof init === "string" ? loadInitConfig(init) : init;
229
+ server.setup(config);
230
+ }
231
+ return server;
178
232
  }
179
233
  //# sourceMappingURL=app.js.map
package/dist/app.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { SqsStore } from "./sqs/sqsStore.ts";
2
+ import type { SnsStore } from "./sns/snsStore.ts";
3
+ import type { S3Store } from "./s3/s3Store.ts";
4
+ export interface FauxqsInitConfig {
5
+ queues?: Array<{
6
+ name: string;
7
+ attributes?: Record<string, string>;
8
+ tags?: Record<string, string>;
9
+ }>;
10
+ topics?: Array<{
11
+ name: string;
12
+ attributes?: Record<string, string>;
13
+ tags?: Record<string, string>;
14
+ }>;
15
+ subscriptions?: Array<{
16
+ topic: string;
17
+ queue: string;
18
+ attributes?: Record<string, string>;
19
+ }>;
20
+ buckets?: string[];
21
+ }
22
+ export declare function loadInitConfig(path: string): FauxqsInitConfig;
23
+ export declare function applyInitConfig(config: FauxqsInitConfig, sqsStore: SqsStore, snsStore: SnsStore, s3Store: S3Store, context: {
24
+ host?: string;
25
+ port: number;
26
+ region: string;
27
+ }): void;
28
+ //# sourceMappingURL=initConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initConfig.d.ts","sourceRoot":"","sources":["../src/initConfig.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC/B,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC/B,CAAC,CAAC;IACH,aAAa,CAAC,EAAE,KAAK,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACrC,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAG7D;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACvD,IAAI,CAuCN"}
@@ -0,0 +1,46 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { sqsQueueArn } from "./common/arnHelper.js";
3
+ import { snsTopicArn } from "./common/arnHelper.js";
4
+ import { DEFAULT_ACCOUNT_ID } from "./common/types.js";
5
+ export function loadInitConfig(path) {
6
+ const content = readFileSync(path, "utf-8");
7
+ return JSON.parse(content);
8
+ }
9
+ export function applyInitConfig(config, sqsStore, snsStore, s3Store, context) {
10
+ const { host, port, region } = context;
11
+ // Create queues first (subscriptions depend on queue ARNs)
12
+ if (config.queues) {
13
+ for (const q of config.queues) {
14
+ const arn = sqsQueueArn(q.name, region);
15
+ let url;
16
+ if (host) {
17
+ url = `http://sqs.${region}.${host}:${port}/${DEFAULT_ACCOUNT_ID}/${q.name}`;
18
+ }
19
+ else {
20
+ url = `http://127.0.0.1:${port}/${DEFAULT_ACCOUNT_ID}/${q.name}`;
21
+ }
22
+ sqsStore.createQueue(q.name, url, arn, q.attributes, q.tags);
23
+ }
24
+ }
25
+ // Create topics next
26
+ if (config.topics) {
27
+ for (const t of config.topics) {
28
+ snsStore.createTopic(t.name, t.attributes, t.tags);
29
+ }
30
+ }
31
+ // Create subscriptions last (depends on both topic ARN and queue ARN)
32
+ if (config.subscriptions) {
33
+ for (const s of config.subscriptions) {
34
+ const topicArn = snsTopicArn(s.topic, region);
35
+ const queueArn = sqsQueueArn(s.queue, region);
36
+ snsStore.subscribe(topicArn, "sqs", queueArn, s.attributes);
37
+ }
38
+ }
39
+ // Create buckets (independent)
40
+ if (config.buckets) {
41
+ for (const name of config.buckets) {
42
+ s3Store.createBucket(name);
43
+ }
44
+ }
45
+ }
46
+ //# sourceMappingURL=initConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initConfig.js","sourceRoot":"","sources":["../src/initConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAwBvD,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAqB,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,MAAwB,EACxB,QAAkB,EAClB,QAAkB,EAClB,OAAgB,EAChB,OAAwD;IAExD,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAEvC,2DAA2D;IAC3D,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACxC,IAAI,GAAW,CAAC;YAChB,IAAI,IAAI,EAAE,CAAC;gBACT,GAAG,GAAG,cAAc,MAAM,IAAI,IAAI,IAAI,IAAI,IAAI,kBAAkB,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;YAC/E,CAAC;iBAAM,CAAC;gBACN,GAAG,GAAG,oBAAoB,IAAI,IAAI,kBAAkB,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;YACnE,CAAC;YACD,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAC9B,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,sEAAsE;IACtE,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAC9C,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAC9C,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAClC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { FastifyRequest, FastifyReply } from "fastify";
2
+ import type { S3Store } from "../s3Store.ts";
3
+ export declare function abortMultipartUpload(request: FastifyRequest<{
4
+ Params: {
5
+ bucket: string;
6
+ "*": string;
7
+ };
8
+ }>, reply: FastifyReply, store: S3Store): void;
9
+ //# sourceMappingURL=abortMultipartUpload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abortMultipartUpload.d.ts","sourceRoot":"","sources":["../../../src/s3/actions/abortMultipartUpload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,cAAc,CAAC;IAAE,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC,EACpE,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,OAAO,GACb,IAAI,CAON"}