fauxqs 1.0.2 → 1.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.
Files changed (82) hide show
  1. package/README.md +40 -7
  2. package/dist/s3/actions/abortMultipartUpload.d.ts +9 -0
  3. package/dist/s3/actions/abortMultipartUpload.d.ts.map +1 -0
  4. package/dist/s3/actions/abortMultipartUpload.js +7 -0
  5. package/dist/s3/actions/abortMultipartUpload.js.map +1 -0
  6. package/dist/s3/actions/completeMultipartUpload.d.ts +9 -0
  7. package/dist/s3/actions/completeMultipartUpload.d.ts.map +1 -0
  8. package/dist/s3/actions/completeMultipartUpload.js +53 -0
  9. package/dist/s3/actions/completeMultipartUpload.js.map +1 -0
  10. package/dist/s3/actions/createMultipartUpload.d.ts +9 -0
  11. package/dist/s3/actions/createMultipartUpload.d.ts.map +1 -0
  12. package/dist/s3/actions/createMultipartUpload.js +29 -0
  13. package/dist/s3/actions/createMultipartUpload.js.map +1 -0
  14. package/dist/s3/actions/deleteBucket.d.ts +8 -0
  15. package/dist/s3/actions/deleteBucket.d.ts.map +1 -0
  16. package/dist/s3/actions/deleteBucket.js +6 -0
  17. package/dist/s3/actions/deleteBucket.js.map +1 -0
  18. package/dist/s3/actions/deleteObjects.d.ts.map +1 -1
  19. package/dist/s3/actions/deleteObjects.js +11 -3
  20. package/dist/s3/actions/deleteObjects.js.map +1 -1
  21. package/dist/s3/actions/getObject.d.ts.map +1 -1
  22. package/dist/s3/actions/getObject.js +3 -0
  23. package/dist/s3/actions/getObject.js.map +1 -1
  24. package/dist/s3/actions/headObject.d.ts.map +1 -1
  25. package/dist/s3/actions/headObject.js +3 -0
  26. package/dist/s3/actions/headObject.js.map +1 -1
  27. package/dist/s3/actions/listBuckets.d.ts +4 -0
  28. package/dist/s3/actions/listBuckets.d.ts.map +1 -0
  29. package/dist/s3/actions/listBuckets.js +27 -0
  30. package/dist/s3/actions/listBuckets.js.map +1 -0
  31. package/dist/s3/actions/listObjects.d.ts.map +1 -1
  32. package/dist/s3/actions/listObjects.js +102 -10
  33. package/dist/s3/actions/listObjects.js.map +1 -1
  34. package/dist/s3/actions/putObject.d.ts.map +1 -1
  35. package/dist/s3/actions/putObject.js +38 -1
  36. package/dist/s3/actions/putObject.js.map +1 -1
  37. package/dist/s3/actions/uploadPart.d.ts +9 -0
  38. package/dist/s3/actions/uploadPart.d.ts.map +1 -0
  39. package/dist/s3/actions/uploadPart.js +32 -0
  40. package/dist/s3/actions/uploadPart.js.map +1 -0
  41. package/dist/s3/s3Router.d.ts.map +1 -1
  42. package/dist/s3/s3Router.js +59 -6
  43. package/dist/s3/s3Router.js.map +1 -1
  44. package/dist/s3/s3Store.d.ts +25 -2
  45. package/dist/s3/s3Store.d.ts.map +1 -1
  46. package/dist/s3/s3Store.js +157 -6
  47. package/dist/s3/s3Store.js.map +1 -1
  48. package/dist/s3/s3Types.d.ts +16 -0
  49. package/dist/s3/s3Types.d.ts.map +1 -1
  50. package/dist/sns/actions/publish.d.ts.map +1 -1
  51. package/dist/sns/actions/publish.js +11 -18
  52. package/dist/sns/actions/publish.js.map +1 -1
  53. package/dist/sns/actions/setSubscriptionAttributes.d.ts.map +1 -1
  54. package/dist/sns/actions/setSubscriptionAttributes.js +11 -0
  55. package/dist/sns/actions/setSubscriptionAttributes.js.map +1 -1
  56. package/dist/sns/filter.d.ts +5 -0
  57. package/dist/sns/filter.d.ts.map +1 -1
  58. package/dist/sns/filter.js +99 -15
  59. package/dist/sns/filter.js.map +1 -1
  60. package/dist/sns/snsStore.d.ts.map +1 -1
  61. package/dist/sns/snsStore.js +8 -0
  62. package/dist/sns/snsStore.js.map +1 -1
  63. package/dist/sqs/actions/createQueue.d.ts.map +1 -1
  64. package/dist/sqs/actions/createQueue.js +3 -1
  65. package/dist/sqs/actions/createQueue.js.map +1 -1
  66. package/dist/sqs/actions/receiveMessage.d.ts.map +1 -1
  67. package/dist/sqs/actions/receiveMessage.js +3 -0
  68. package/dist/sqs/actions/receiveMessage.js.map +1 -1
  69. package/dist/sqs/actions/sendMessageBatch.d.ts.map +1 -1
  70. package/dist/sqs/actions/sendMessageBatch.js +14 -2
  71. package/dist/sqs/actions/sendMessageBatch.js.map +1 -1
  72. package/dist/sqs/actions/setQueueAttributes.d.ts.map +1 -1
  73. package/dist/sqs/actions/setQueueAttributes.js +3 -1
  74. package/dist/sqs/actions/setQueueAttributes.js.map +1 -1
  75. package/dist/sqs/sqsStore.d.ts.map +1 -1
  76. package/dist/sqs/sqsStore.js +5 -1
  77. package/dist/sqs/sqsStore.js.map +1 -1
  78. package/dist/sqs/sqsTypes.d.ts +5 -0
  79. package/dist/sqs/sqsTypes.d.ts.map +1 -1
  80. package/dist/sqs/sqsTypes.js +21 -0
  81. package/dist/sqs/sqsTypes.js.map +1 -1
  82. package/package.json +2 -2
package/README.md CHANGED
@@ -157,6 +157,12 @@ const server = await startFauxqs({ defaultRegion: "eu-west-1" });
157
157
  | TagQueue | Yes |
158
158
  | UntagQueue | Yes |
159
159
  | ListQueueTags | Yes |
160
+ | AddPermission | No |
161
+ | RemovePermission | No |
162
+ | ListDeadLetterSourceQueues | No |
163
+ | StartMessageMoveTask | No |
164
+ | CancelMessageMoveTask | No |
165
+ | ListMessageMoveTasks | No |
160
166
 
161
167
  ### SNS
162
168
 
@@ -179,6 +185,12 @@ const server = await startFauxqs({ defaultRegion: "eu-west-1" });
179
185
  | TagResource | Yes |
180
186
  | UntagResource | Yes |
181
187
  | ListTagsForResource | Yes |
188
+ | AddPermission | No |
189
+ | RemovePermission | No |
190
+ | GetDataProtectionPolicy | No |
191
+ | PutDataProtectionPolicy | No |
192
+
193
+ Platform application, SMS, and phone number actions are not supported.
182
194
 
183
195
  ### S3
184
196
 
@@ -187,19 +199,34 @@ const server = await startFauxqs({ defaultRegion: "eu-west-1" });
187
199
  | CreateBucket | Yes |
188
200
  | HeadBucket | Yes |
189
201
  | ListObjects | Yes |
202
+ | ListObjectsV2 | Yes |
203
+ | CopyObject | Yes |
190
204
  | PutObject | Yes |
191
205
  | GetObject | Yes |
192
206
  | DeleteObject | Yes |
193
207
  | HeadObject | Yes |
194
208
  | DeleteObjects | Yes |
209
+ | DeleteBucket | Yes |
210
+ | ListBuckets | Yes |
211
+ | CreateMultipartUpload | Yes |
212
+ | UploadPart | Yes |
213
+ | CompleteMultipartUpload | Yes |
214
+ | AbortMultipartUpload | Yes |
215
+ | ListObjectVersions | No |
216
+ | GetBucketLocation | No |
217
+
218
+ Bucket configuration (CORS, lifecycle, encryption, replication, etc.), ACLs, versioning, tagging, and other management actions are not supported.
195
219
 
196
220
  ### STS
197
221
 
198
222
  | Action | Supported |
199
223
  |--------|-----------|
200
224
  | GetCallerIdentity | Yes |
225
+ | AssumeRole | No |
226
+ | GetSessionToken | No |
227
+ | GetFederationToken | No |
201
228
 
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.
229
+ 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
230
 
204
231
  ## SQS Features
205
232
 
@@ -208,7 +235,8 @@ Returns a mock identity with account `000000000000` and ARN `arn:aws:iam::000000
208
235
  - **Delay queues** — per-queue default delay and per-message delay overrides
209
236
  - **Long polling** — `WaitTimeSeconds` on ReceiveMessage blocks until messages arrive or timeout
210
237
  - **Dead letter queues** — messages exceeding `maxReceiveCount` are moved to the configured DLQ
211
- - **Batch operations** — SendMessageBatch, DeleteMessageBatch, ChangeMessageVisibilityBatch
238
+ - **Batch operations** — SendMessageBatch, DeleteMessageBatch, ChangeMessageVisibilityBatch with entry ID validation (`InvalidBatchEntryId`) and total batch size validation (`BatchRequestTooLong`)
239
+ - **Queue attribute range validation** — validates `VisibilityTimeout`, `DelaySeconds`, `ReceiveMessageWaitTimeSeconds`, `MaximumMessageSize`, and `MessageRetentionPeriod` on both CreateQueue and SetQueueAttributes
212
240
  - **Message size validation** — rejects messages exceeding 1 MiB (1,048,576 bytes)
213
241
  - **Unicode character validation** — rejects messages with characters outside the AWS-allowed set
214
242
  - **KMS attributes** — `KmsMasterKeyId` and `KmsDataKeyReusePeriodSeconds` are accepted and stored (no actual encryption)
@@ -218,20 +246,25 @@ Returns a mock identity with account `000000000000` and ARN `arn:aws:iam::000000
218
246
  ## SNS Features
219
247
 
220
248
  - **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
249
+ - **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
250
  - **Raw message delivery** — configurable per subscription
223
251
  - **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
252
+ - **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
253
  - **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
254
+ - **Subscription attribute validation** — `SetSubscriptionAttributes` validates attribute names and rejects unknown or read-only attributes
226
255
  - **Topic and subscription tags**
227
256
  - **FIFO topics** — `.fifo` suffix enforcement, `MessageGroupId` and `MessageDeduplicationId` passthrough to SQS subscriptions, content-based deduplication
228
257
  - **Batch publish**
229
258
 
230
259
  ## S3 Features
231
260
 
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
261
+ - **Bucket management** — CreateBucket (idempotent), DeleteBucket (rejects non-empty), HeadBucket, ListBuckets, ListObjects (V1 and V2)
262
+ - **Object operations** — PutObject, GetObject, DeleteObject, HeadObject, CopyObject with ETag, Content-Type, and Last-Modified headers
263
+ - **Multipart uploads** — CreateMultipartUpload, UploadPart, CompleteMultipartUpload, AbortMultipartUpload with correct multipart ETag calculation (`MD5-of-part-digests-partCount`), metadata preservation, and part overwrite support
264
+ - **ListObjects V2** — prefix filtering, delimiter-based virtual directories, MaxKeys, continuation tokens, StartAfter
265
+ - **CopyObject** — same-bucket and cross-bucket copy via `x-amz-copy-source` header, with metadata preservation
266
+ - **User metadata** — `x-amz-meta-*` headers are stored and returned on GetObject and HeadObject
267
+ - **Bulk delete** — DeleteObjects for batch key deletion with proper XML entity handling
235
268
  - **Keys with slashes** — full support for slash-delimited keys (e.g., `path/to/file.txt`)
236
269
  - **Stream uploads** — handles AWS chunked transfer encoding (`Content-Encoding: aws-chunked`) for stream bodies
237
270
  - **Path-style and virtual-hosted-style** — both S3 URL styles are supported (see below)
@@ -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"}
@@ -0,0 +1,7 @@
1
+ export function abortMultipartUpload(request, reply, store) {
2
+ const query = (request.query ?? {});
3
+ const uploadId = query["uploadId"];
4
+ store.abortMultipartUpload(uploadId);
5
+ reply.status(204).send();
6
+ }
7
+ //# sourceMappingURL=abortMultipartUpload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abortMultipartUpload.js","sourceRoot":"","sources":["../../../src/s3/actions/abortMultipartUpload.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,oBAAoB,CAClC,OAAoE,EACpE,KAAmB,EACnB,KAAc;IAEd,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAA2B,CAAC;IAC9D,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;IAEnC,KAAK,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAErC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { FastifyRequest, FastifyReply } from "fastify";
2
+ import type { S3Store } from "../s3Store.ts";
3
+ export declare function completeMultipartUpload(request: FastifyRequest<{
4
+ Params: {
5
+ bucket: string;
6
+ "*": string;
7
+ };
8
+ }>, reply: FastifyReply, store: S3Store): void;
9
+ //# sourceMappingURL=completeMultipartUpload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completeMultipartUpload.d.ts","sourceRoot":"","sources":["../../../src/s3/actions/completeMultipartUpload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAW7C,wBAAgB,uBAAuB,CACrC,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,CAmDN"}
@@ -0,0 +1,53 @@
1
+ import { escapeXml } from "../../common/xml.js";
2
+ function unescapeXml(str) {
3
+ return str
4
+ .replace(/&amp;/g, "&")
5
+ .replace(/&lt;/g, "<")
6
+ .replace(/&gt;/g, ">")
7
+ .replace(/&quot;/g, '"')
8
+ .replace(/&apos;/g, "'");
9
+ }
10
+ export function completeMultipartUpload(request, reply, store) {
11
+ const bucket = request.params.bucket;
12
+ const key = request.params["*"];
13
+ const query = (request.query ?? {});
14
+ const uploadId = query["uploadId"];
15
+ const body = Buffer.isBuffer(request.body)
16
+ ? request.body.toString("utf-8")
17
+ : request.body;
18
+ // Parse <Part> elements from XML body
19
+ const parts = [];
20
+ const partRegex = /<Part>\s*<PartNumber>(\d+)<\/PartNumber>\s*<ETag>([\s\S]*?)<\/ETag>\s*<\/Part>/g;
21
+ let match;
22
+ while ((match = partRegex.exec(body)) !== null) {
23
+ parts.push({
24
+ partNumber: parseInt(match[1], 10),
25
+ etag: unescapeXml(match[2]),
26
+ });
27
+ }
28
+ // Also handle reversed order (ETag before PartNumber)
29
+ if (parts.length === 0) {
30
+ const altRegex = /<Part>\s*<ETag>([\s\S]*?)<\/ETag>\s*<PartNumber>(\d+)<\/PartNumber>\s*<\/Part>/g;
31
+ while ((match = altRegex.exec(body)) !== null) {
32
+ parts.push({
33
+ partNumber: parseInt(match[2], 10),
34
+ etag: unescapeXml(match[1]),
35
+ });
36
+ }
37
+ }
38
+ const obj = store.completeMultipartUpload(uploadId, parts);
39
+ const host = request.headers.host ?? "localhost";
40
+ const location = `http://${host}/${bucket}/${key}`;
41
+ const xml = [
42
+ `<?xml version="1.0" encoding="UTF-8"?>`,
43
+ `<CompleteMultipartUploadResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">`,
44
+ ` <Location>${escapeXml(location)}</Location>`,
45
+ ` <Bucket>${escapeXml(bucket)}</Bucket>`,
46
+ ` <Key>${escapeXml(key)}</Key>`,
47
+ ` <ETag>${escapeXml(obj.etag)}</ETag>`,
48
+ `</CompleteMultipartUploadResult>`,
49
+ ].join("\n");
50
+ reply.header("content-type", "application/xml");
51
+ reply.status(200).send(xml);
52
+ }
53
+ //# sourceMappingURL=completeMultipartUpload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completeMultipartUpload.js","sourceRoot":"","sources":["../../../src/s3/actions/completeMultipartUpload.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGhD,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,GAAG;SACP,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,OAAoE,EACpE,KAAmB,EACnB,KAAc;IAEd,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;IACrC,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAA2B,CAAC;IAC9D,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;IAEnC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;QACxC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAChC,CAAC,CAAE,OAAO,CAAC,IAAe,CAAC;IAE7B,sCAAsC;IACtC,MAAM,KAAK,GAA2C,EAAE,CAAC;IACzD,MAAM,SAAS,GACb,iFAAiF,CAAC;IACpF,IAAI,KAA6B,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC;YACT,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAClC,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC5B,CAAC,CAAC;IACL,CAAC;IAED,sDAAsD;IACtD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,QAAQ,GACZ,iFAAiF,CAAC;QACpF,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC9C,KAAK,CAAC,IAAI,CAAC;gBACT,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAClC,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aAC5B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,KAAK,CAAC,uBAAuB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAE3D,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC;IACjD,MAAM,QAAQ,GAAG,UAAU,IAAI,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;IAEnD,MAAM,GAAG,GAAG;QACV,wCAAwC;QACxC,iFAAiF;QACjF,eAAe,SAAS,CAAC,QAAQ,CAAC,aAAa;QAC/C,aAAa,SAAS,CAAC,MAAM,CAAC,WAAW;QACzC,UAAU,SAAS,CAAC,GAAG,CAAC,QAAQ;QAChC,WAAW,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS;QACvC,kCAAkC;KACnC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;IAChD,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { FastifyRequest, FastifyReply } from "fastify";
2
+ import type { S3Store } from "../s3Store.ts";
3
+ export declare function createMultipartUpload(request: FastifyRequest<{
4
+ Params: {
5
+ bucket: string;
6
+ "*": string;
7
+ };
8
+ }>, reply: FastifyReply, store: S3Store): void;
9
+ //# sourceMappingURL=createMultipartUpload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createMultipartUpload.d.ts","sourceRoot":"","sources":["../../../src/s3/actions/createMultipartUpload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAe7C,wBAAgB,qBAAqB,CACnC,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,CAqBN"}
@@ -0,0 +1,29 @@
1
+ import { escapeXml } from "../../common/xml.js";
2
+ function extractMetadata(headers) {
3
+ const metadata = {};
4
+ for (const [key, value] of Object.entries(headers)) {
5
+ if (key.toLowerCase().startsWith("x-amz-meta-") && value) {
6
+ const metaKey = key.toLowerCase().slice("x-amz-meta-".length);
7
+ metadata[metaKey] = Array.isArray(value) ? value[0] : value;
8
+ }
9
+ }
10
+ return metadata;
11
+ }
12
+ export function createMultipartUpload(request, reply, store) {
13
+ const bucket = request.params.bucket;
14
+ const key = request.params["*"];
15
+ const contentType = request.headers["content-type"] ?? "application/octet-stream";
16
+ const metadata = extractMetadata(request.headers);
17
+ const uploadId = store.createMultipartUpload(bucket, key, contentType, metadata);
18
+ const xml = [
19
+ `<?xml version="1.0" encoding="UTF-8"?>`,
20
+ `<InitiateMultipartUploadResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">`,
21
+ ` <Bucket>${escapeXml(bucket)}</Bucket>`,
22
+ ` <Key>${escapeXml(key)}</Key>`,
23
+ ` <UploadId>${escapeXml(uploadId)}</UploadId>`,
24
+ `</InitiateMultipartUploadResult>`,
25
+ ].join("\n");
26
+ reply.header("content-type", "application/xml");
27
+ reply.status(200).send(xml);
28
+ }
29
+ //# sourceMappingURL=createMultipartUpload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createMultipartUpload.js","sourceRoot":"","sources":["../../../src/s3/actions/createMultipartUpload.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGhD,SAAS,eAAe,CACtB,OAAsD;IAEtD,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,KAAK,EAAE,CAAC;YACzD,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC9D,QAAQ,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAC9D,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,OAAoE,EACpE,KAAmB,EACnB,KAAc;IAEd,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;IACrC,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,0BAA0B,CAAC;IAClF,MAAM,QAAQ,GAAG,eAAe,CAC9B,OAAO,CAAC,OAAwD,CACjE,CAAC;IAEF,MAAM,QAAQ,GAAG,KAAK,CAAC,qBAAqB,CAAC,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IAEjF,MAAM,GAAG,GAAG;QACV,wCAAwC;QACxC,iFAAiF;QACjF,aAAa,SAAS,CAAC,MAAM,CAAC,WAAW;QACzC,UAAU,SAAS,CAAC,GAAG,CAAC,QAAQ;QAChC,eAAe,SAAS,CAAC,QAAQ,CAAC,aAAa;QAC/C,kCAAkC;KACnC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;IAChD,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { FastifyRequest, FastifyReply } from "fastify";
2
+ import type { S3Store } from "../s3Store.ts";
3
+ export declare function deleteBucket(request: FastifyRequest<{
4
+ Params: {
5
+ bucket: string;
6
+ };
7
+ }>, reply: FastifyReply, store: S3Store): void;
8
+ //# sourceMappingURL=deleteBucket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deleteBucket.d.ts","sourceRoot":"","sources":["../../../src/s3/actions/deleteBucket.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,YAAY,CAC1B,OAAO,EAAE,cAAc,CAAC;IAAE,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC,EACvD,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,OAAO,GACb,IAAI,CAIN"}
@@ -0,0 +1,6 @@
1
+ export function deleteBucket(request, reply, store) {
2
+ const bucket = request.params.bucket;
3
+ store.deleteBucket(bucket);
4
+ reply.status(204).send();
5
+ }
6
+ //# sourceMappingURL=deleteBucket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deleteBucket.js","sourceRoot":"","sources":["../../../src/s3/actions/deleteBucket.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,YAAY,CAC1B,OAAuD,EACvD,KAAmB,EACnB,KAAc;IAEd,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;IACrC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC3B,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC3B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"deleteObjects.d.ts","sourceRoot":"","sources":["../../../src/s3/actions/deleteObjects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,wBAAgB,aAAa,CAC3B,OAAO,EAAE,cAAc,CAAC;IAAE,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC,EACvD,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,OAAO,GACb,IAAI,CA+BN"}
1
+ {"version":3,"file":"deleteObjects.d.ts","sourceRoot":"","sources":["../../../src/s3/actions/deleteObjects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAW7C,wBAAgB,aAAa,CAC3B,OAAO,EAAE,cAAc,CAAC;IAAE,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC,EACvD,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,OAAO,GACb,IAAI,CA+BN"}
@@ -1,15 +1,23 @@
1
1
  import { escapeXml } from "../../common/xml.js";
2
+ function unescapeXml(str) {
3
+ return str
4
+ .replace(/&amp;/g, "&")
5
+ .replace(/&lt;/g, "<")
6
+ .replace(/&gt;/g, ">")
7
+ .replace(/&quot;/g, '"')
8
+ .replace(/&apos;/g, "'");
9
+ }
2
10
  export function deleteObjects(request, reply, store) {
3
11
  const bucket = request.params.bucket;
4
12
  const body = Buffer.isBuffer(request.body)
5
13
  ? request.body.toString("utf-8")
6
14
  : request.body;
7
- // Parse <Key> elements from XML body
15
+ // Parse <Key> elements from XML body with proper entity unescaping
8
16
  const keys = [];
9
- const keyRegex = /<Key>([^<]+)<\/Key>/g;
17
+ const keyRegex = /<Key>([\s\S]*?)<\/Key>/g;
10
18
  let match;
11
19
  while ((match = keyRegex.exec(body)) !== null) {
12
- keys.push(match[1]);
20
+ keys.push(unescapeXml(match[1]));
13
21
  }
14
22
  const deleted = store.deleteObjects(bucket, keys);
15
23
  const deletedXml = deleted
@@ -1 +1 @@
1
- {"version":3,"file":"deleteObjects.js","sourceRoot":"","sources":["../../../src/s3/actions/deleteObjects.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGhD,MAAM,UAAU,aAAa,CAC3B,OAAuD,EACvD,KAAmB,EACnB,KAAc;IAEd,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;IACrC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;QACxC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAChC,CAAC,CAAE,OAAO,CAAC,IAAe,CAAC;IAE7B,qCAAqC;IACrC,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,QAAQ,GAAG,sBAAsB,CAAC;IACxC,IAAI,KAA6B,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAElD,MAAM,UAAU,GAAG,OAAO;SACvB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,iBAAiB,SAAS,CAAC,GAAG,CAAC,kBAAkB,CAAC;SAC/D,IAAI,CAAC,QAAQ,CAAC,CAAC;IAElB,MAAM,GAAG,GAAG;QACV,wCAAwC;QACxC,gEAAgE;QAChE,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE;QACnC,iBAAiB;KAClB;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;IAChD,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC"}
1
+ {"version":3,"file":"deleteObjects.js","sourceRoot":"","sources":["../../../src/s3/actions/deleteObjects.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGhD,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,GAAG;SACP,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,OAAuD,EACvD,KAAmB,EACnB,KAAc;IAEd,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;IACrC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;QACxC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAChC,CAAC,CAAE,OAAO,CAAC,IAAe,CAAC;IAE7B,mEAAmE;IACnE,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,QAAQ,GAAG,yBAAyB,CAAC;IAC3C,IAAI,KAA6B,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAElD,MAAM,UAAU,GAAG,OAAO;SACvB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,iBAAiB,SAAS,CAAC,GAAG,CAAC,kBAAkB,CAAC;SAC/D,IAAI,CAAC,QAAQ,CAAC,CAAC;IAElB,MAAM,GAAG,GAAG;QACV,wCAAwC;QACxC,gEAAgE;QAChE,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE;QACnC,iBAAiB;KAClB;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;IAChD,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"getObject.d.ts","sourceRoot":"","sources":["../../../src/s3/actions/getObject.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,SAAS,CACvB,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,CAWN"}
1
+ {"version":3,"file":"getObject.d.ts","sourceRoot":"","sources":["../../../src/s3/actions/getObject.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,SAAS,CACvB,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,CAcN"}
@@ -6,6 +6,9 @@ export function getObject(request, reply, store) {
6
6
  reply.header("content-length", obj.contentLength);
7
7
  reply.header("etag", obj.etag);
8
8
  reply.header("last-modified", obj.lastModified.toUTCString());
9
+ for (const [metaKey, metaValue] of Object.entries(obj.metadata)) {
10
+ reply.header(`x-amz-meta-${metaKey}`, metaValue);
11
+ }
9
12
  reply.status(200).send(obj.body);
10
13
  }
11
14
  //# sourceMappingURL=getObject.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getObject.js","sourceRoot":"","sources":["../../../src/s3/actions/getObject.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,SAAS,CACvB,OAAoE,EACpE,KAAmB,EACnB,KAAc;IAEd,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;IACrC,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAEhC,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEzC,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;IAC9C,KAAK,CAAC,MAAM,CAAC,gBAAgB,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;IAClD,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,KAAK,CAAC,MAAM,CAAC,eAAe,EAAE,GAAG,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC;IAC9D,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC"}
1
+ {"version":3,"file":"getObject.js","sourceRoot":"","sources":["../../../src/s3/actions/getObject.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,SAAS,CACvB,OAAoE,EACpE,KAAmB,EACnB,KAAc;IAEd,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;IACrC,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAEhC,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEzC,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;IAC9C,KAAK,CAAC,MAAM,CAAC,gBAAgB,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;IAClD,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,KAAK,CAAC,MAAM,CAAC,eAAe,EAAE,GAAG,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC;IAC9D,KAAK,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChE,KAAK,CAAC,MAAM,CAAC,cAAc,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IACnD,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"headObject.d.ts","sourceRoot":"","sources":["../../../src/s3/actions/headObject.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,UAAU,CACxB,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,CAWN"}
1
+ {"version":3,"file":"headObject.d.ts","sourceRoot":"","sources":["../../../src/s3/actions/headObject.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,UAAU,CACxB,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,CAcN"}
@@ -6,6 +6,9 @@ export function headObject(request, reply, store) {
6
6
  reply.header("content-length", obj.contentLength);
7
7
  reply.header("etag", obj.etag);
8
8
  reply.header("last-modified", obj.lastModified.toUTCString());
9
+ for (const [metaKey, metaValue] of Object.entries(obj.metadata)) {
10
+ reply.header(`x-amz-meta-${metaKey}`, metaValue);
11
+ }
9
12
  reply.status(200).send();
10
13
  }
11
14
  //# sourceMappingURL=headObject.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"headObject.js","sourceRoot":"","sources":["../../../src/s3/actions/headObject.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,UAAU,CACxB,OAAoE,EACpE,KAAmB,EACnB,KAAc;IAEd,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;IACrC,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAEhC,MAAM,GAAG,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAE1C,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;IAC9C,KAAK,CAAC,MAAM,CAAC,gBAAgB,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;IAClD,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,KAAK,CAAC,MAAM,CAAC,eAAe,EAAE,GAAG,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC;IAC9D,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC3B,CAAC"}
1
+ {"version":3,"file":"headObject.js","sourceRoot":"","sources":["../../../src/s3/actions/headObject.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,UAAU,CACxB,OAAoE,EACpE,KAAmB,EACnB,KAAc;IAEd,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;IACrC,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAEhC,MAAM,GAAG,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAE1C,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;IAC9C,KAAK,CAAC,MAAM,CAAC,gBAAgB,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;IAClD,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,KAAK,CAAC,MAAM,CAAC,eAAe,EAAE,GAAG,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC;IAC9D,KAAK,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChE,KAAK,CAAC,MAAM,CAAC,cAAc,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IACnD,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { FastifyReply } from "fastify";
2
+ import type { S3Store } from "../s3Store.ts";
3
+ export declare function listBuckets(reply: FastifyReply, store: S3Store): void;
4
+ //# sourceMappingURL=listBuckets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listBuckets.d.ts","sourceRoot":"","sources":["../../../src/s3/actions/listBuckets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CA8BrE"}
@@ -0,0 +1,27 @@
1
+ import { escapeXml } from "../../common/xml.js";
2
+ export function listBuckets(reply, store) {
3
+ const buckets = store.listBuckets();
4
+ const bucketsXml = buckets
5
+ .map((b) => `<Bucket>` +
6
+ `<Name>${escapeXml(b.name)}</Name>` +
7
+ `<CreationDate>${b.creationDate.toISOString()}</CreationDate>` +
8
+ `</Bucket>`)
9
+ .join("\n ");
10
+ const xml = [
11
+ `<?xml version="1.0" encoding="UTF-8"?>`,
12
+ `<ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">`,
13
+ ` <Owner>`,
14
+ ` <ID>000000000000</ID>`,
15
+ ` <DisplayName>local</DisplayName>`,
16
+ ` </Owner>`,
17
+ ` <Buckets>`,
18
+ bucketsXml ? ` ${bucketsXml}` : "",
19
+ ` </Buckets>`,
20
+ `</ListAllMyBucketsResult>`,
21
+ ]
22
+ .filter(Boolean)
23
+ .join("\n");
24
+ reply.header("content-type", "application/xml");
25
+ reply.status(200).send(xml);
26
+ }
27
+ //# sourceMappingURL=listBuckets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listBuckets.js","sourceRoot":"","sources":["../../../src/s3/actions/listBuckets.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGhD,MAAM,UAAU,WAAW,CAAC,KAAmB,EAAE,KAAc;IAC7D,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAEpC,MAAM,UAAU,GAAG,OAAO;SACvB,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,UAAU;QACV,SAAS,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS;QACnC,iBAAiB,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE,iBAAiB;QAC9D,WAAW,CACd;SACA,IAAI,CAAC,UAAU,CAAC,CAAC;IAEpB,MAAM,GAAG,GAAG;QACV,wCAAwC;QACxC,0EAA0E;QAC1E,WAAW;QACX,2BAA2B;QAC3B,sCAAsC;QACtC,YAAY;QACZ,aAAa;QACb,UAAU,CAAC,CAAC,CAAC,SAAS,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE;QACvC,cAAc;QACd,2BAA2B;KAC5B;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;IAChD,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"listObjects.d.ts","sourceRoot":"","sources":["../../../src/s3/actions/listObjects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,wBAAgB,WAAW,CACzB,OAAO,EAAE,cAAc,CAAC;IAAE,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC,EACvD,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,OAAO,GACb,IAAI,CA6BN"}
1
+ {"version":3,"file":"listObjects.d.ts","sourceRoot":"","sources":["../../../src/s3/actions/listObjects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,wBAAgB,WAAW,CACzB,OAAO,EAAE,cAAc,CAAC;IAAE,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC,EACvD,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,OAAO,GACb,IAAI,CAeN"}
@@ -1,26 +1,118 @@
1
1
  import { escapeXml } from "../../common/xml.js";
2
2
  export function listObjects(request, reply, store) {
3
3
  const bucket = request.params.bucket;
4
- const objects = store.listObjects(bucket);
5
- const contents = objects
4
+ const query = (request.query ?? {});
5
+ const listType = query["list-type"];
6
+ const prefix = query["prefix"] ?? "";
7
+ const delimiter = query["delimiter"];
8
+ const maxKeysStr = query["max-keys"];
9
+ const maxKeys = maxKeysStr ? parseInt(maxKeysStr, 10) : 1000;
10
+ if (listType === "2") {
11
+ listObjectsV2(bucket, prefix, delimiter, maxKeys, query, reply, store);
12
+ }
13
+ else {
14
+ listObjectsV1(bucket, prefix, delimiter, maxKeys, query, reply, store);
15
+ }
16
+ }
17
+ function listObjectsV1(bucket, prefix, delimiter, maxKeys, query, reply, store) {
18
+ const marker = query["marker"] ?? "";
19
+ const { objects, commonPrefixes, isTruncated } = store.listObjects(bucket, {
20
+ prefix,
21
+ delimiter,
22
+ maxKeys,
23
+ marker,
24
+ });
25
+ const contentsXml = objects
6
26
  .map((obj) => `<Contents>` +
7
27
  `<Key>${escapeXml(obj.key)}</Key>` +
8
28
  `<Size>${obj.contentLength}</Size>` +
9
29
  `<ETag>${escapeXml(obj.etag)}</ETag>` +
10
30
  `<LastModified>${obj.lastModified.toISOString()}</LastModified>` +
31
+ `<StorageClass>STANDARD</StorageClass>` +
11
32
  `</Contents>`)
12
33
  .join("\n ");
13
- const xml = [
34
+ const commonPrefixesXml = commonPrefixes
35
+ .map((p) => `<CommonPrefixes><Prefix>${escapeXml(p)}</Prefix></CommonPrefixes>`)
36
+ .join("\n ");
37
+ const nextMarker = isTruncated && objects.length > 0 ? objects[objects.length - 1].key : "";
38
+ const parts = [
39
+ `<?xml version="1.0" encoding="UTF-8"?>`,
40
+ `<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">`,
41
+ ` <Name>${escapeXml(bucket)}</Name>`,
42
+ ` <Prefix>${escapeXml(prefix)}</Prefix>`,
43
+ ` <Marker>${escapeXml(marker)}</Marker>`,
44
+ ` <MaxKeys>${maxKeys}</MaxKeys>`,
45
+ ` <IsTruncated>${isTruncated}</IsTruncated>`,
46
+ ];
47
+ if (isTruncated && nextMarker) {
48
+ parts.push(` <NextMarker>${escapeXml(nextMarker)}</NextMarker>`);
49
+ }
50
+ if (delimiter) {
51
+ parts.push(` <Delimiter>${escapeXml(delimiter)}</Delimiter>`);
52
+ }
53
+ if (contentsXml)
54
+ parts.push(` ${contentsXml}`);
55
+ if (commonPrefixesXml)
56
+ parts.push(` ${commonPrefixesXml}`);
57
+ parts.push(`</ListBucketResult>`);
58
+ reply.header("content-type", "application/xml");
59
+ reply.status(200).send(parts.join("\n"));
60
+ }
61
+ function listObjectsV2(bucket, prefix, delimiter, maxKeys, query, reply, store) {
62
+ const startAfter = query["start-after"] ?? "";
63
+ const continuationToken = query["continuation-token"];
64
+ // Use continuation-token as the start-after if provided (it encodes the last key)
65
+ const effectiveStartAfter = continuationToken
66
+ ? Buffer.from(continuationToken, "base64").toString("utf-8")
67
+ : startAfter;
68
+ const { objects, commonPrefixes, isTruncated } = store.listObjects(bucket, {
69
+ prefix,
70
+ delimiter,
71
+ maxKeys,
72
+ startAfter: effectiveStartAfter,
73
+ });
74
+ const keyCount = objects.length + commonPrefixes.length;
75
+ const contentsXml = objects
76
+ .map((obj) => `<Contents>` +
77
+ `<Key>${escapeXml(obj.key)}</Key>` +
78
+ `<Size>${obj.contentLength}</Size>` +
79
+ `<ETag>${escapeXml(obj.etag)}</ETag>` +
80
+ `<LastModified>${obj.lastModified.toISOString()}</LastModified>` +
81
+ `<StorageClass>STANDARD</StorageClass>` +
82
+ `</Contents>`)
83
+ .join("\n ");
84
+ const commonPrefixesXml = commonPrefixes
85
+ .map((p) => `<CommonPrefixes><Prefix>${escapeXml(p)}</Prefix></CommonPrefixes>`)
86
+ .join("\n ");
87
+ const parts = [
14
88
  `<?xml version="1.0" encoding="UTF-8"?>`,
15
89
  `<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">`,
16
90
  ` <Name>${escapeXml(bucket)}</Name>`,
17
- ` <IsTruncated>false</IsTruncated>`,
18
- contents ? ` ${contents}` : "",
19
- `</ListBucketResult>`,
20
- ]
21
- .filter(Boolean)
22
- .join("\n");
91
+ ` <Prefix>${escapeXml(prefix)}</Prefix>`,
92
+ ` <KeyCount>${keyCount}</KeyCount>`,
93
+ ` <MaxKeys>${maxKeys}</MaxKeys>`,
94
+ ` <IsTruncated>${isTruncated}</IsTruncated>`,
95
+ ];
96
+ if (startAfter) {
97
+ parts.push(` <StartAfter>${escapeXml(startAfter)}</StartAfter>`);
98
+ }
99
+ if (continuationToken) {
100
+ parts.push(` <ContinuationToken>${escapeXml(continuationToken)}</ContinuationToken>`);
101
+ }
102
+ if (isTruncated && objects.length > 0) {
103
+ const lastKey = objects[objects.length - 1].key;
104
+ const nextToken = Buffer.from(lastKey, "utf-8").toString("base64");
105
+ parts.push(` <NextContinuationToken>${escapeXml(nextToken)}</NextContinuationToken>`);
106
+ }
107
+ if (delimiter) {
108
+ parts.push(` <Delimiter>${escapeXml(delimiter)}</Delimiter>`);
109
+ }
110
+ if (contentsXml)
111
+ parts.push(` ${contentsXml}`);
112
+ if (commonPrefixesXml)
113
+ parts.push(` ${commonPrefixesXml}`);
114
+ parts.push(`</ListBucketResult>`);
23
115
  reply.header("content-type", "application/xml");
24
- reply.status(200).send(xml);
116
+ reply.status(200).send(parts.join("\n"));
25
117
  }
26
118
  //# sourceMappingURL=listObjects.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"listObjects.js","sourceRoot":"","sources":["../../../src/s3/actions/listObjects.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGhD,MAAM,UAAU,WAAW,CACzB,OAAuD,EACvD,KAAmB,EACnB,KAAc;IAEd,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;IACrC,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAE1C,MAAM,QAAQ,GAAG,OAAO;SACrB,GAAG,CACF,CAAC,GAAG,EAAE,EAAE,CACN,YAAY;QACZ,QAAQ,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ;QAClC,SAAS,GAAG,CAAC,aAAa,SAAS;QACnC,SAAS,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS;QACrC,iBAAiB,GAAG,CAAC,YAAY,CAAC,WAAW,EAAE,iBAAiB;QAChE,aAAa,CAChB;SACA,IAAI,CAAC,QAAQ,CAAC,CAAC;IAElB,MAAM,GAAG,GAAG;QACV,wCAAwC;QACxC,oEAAoE;QACpE,WAAW,SAAS,CAAC,MAAM,CAAC,SAAS;QACrC,oCAAoC;QACpC,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE;QAC/B,qBAAqB;KACtB;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;IAChD,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC"}
1
+ {"version":3,"file":"listObjects.js","sourceRoot":"","sources":["../../../src/s3/actions/listObjects.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"putObject.d.ts","sourceRoot":"","sources":["../../../src/s3/actions/putObject.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AA6B7C,wBAAgB,SAAS,CACvB,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,CAiBN"}
1
+ {"version":3,"file":"putObject.d.ts","sourceRoot":"","sources":["../../../src/s3/actions/putObject.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AA0C7C,wBAAgB,SAAS,CACvB,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,CA2DN"}