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.
- package/README.md +40 -7
- package/dist/s3/actions/abortMultipartUpload.d.ts +9 -0
- package/dist/s3/actions/abortMultipartUpload.d.ts.map +1 -0
- package/dist/s3/actions/abortMultipartUpload.js +7 -0
- package/dist/s3/actions/abortMultipartUpload.js.map +1 -0
- package/dist/s3/actions/completeMultipartUpload.d.ts +9 -0
- package/dist/s3/actions/completeMultipartUpload.d.ts.map +1 -0
- package/dist/s3/actions/completeMultipartUpload.js +53 -0
- package/dist/s3/actions/completeMultipartUpload.js.map +1 -0
- package/dist/s3/actions/createMultipartUpload.d.ts +9 -0
- package/dist/s3/actions/createMultipartUpload.d.ts.map +1 -0
- package/dist/s3/actions/createMultipartUpload.js +29 -0
- package/dist/s3/actions/createMultipartUpload.js.map +1 -0
- package/dist/s3/actions/deleteBucket.d.ts +8 -0
- package/dist/s3/actions/deleteBucket.d.ts.map +1 -0
- package/dist/s3/actions/deleteBucket.js +6 -0
- package/dist/s3/actions/deleteBucket.js.map +1 -0
- package/dist/s3/actions/deleteObjects.d.ts.map +1 -1
- package/dist/s3/actions/deleteObjects.js +11 -3
- package/dist/s3/actions/deleteObjects.js.map +1 -1
- package/dist/s3/actions/getObject.d.ts.map +1 -1
- package/dist/s3/actions/getObject.js +3 -0
- package/dist/s3/actions/getObject.js.map +1 -1
- package/dist/s3/actions/headObject.d.ts.map +1 -1
- package/dist/s3/actions/headObject.js +3 -0
- package/dist/s3/actions/headObject.js.map +1 -1
- package/dist/s3/actions/listBuckets.d.ts +4 -0
- package/dist/s3/actions/listBuckets.d.ts.map +1 -0
- package/dist/s3/actions/listBuckets.js +27 -0
- package/dist/s3/actions/listBuckets.js.map +1 -0
- package/dist/s3/actions/listObjects.d.ts.map +1 -1
- package/dist/s3/actions/listObjects.js +102 -10
- package/dist/s3/actions/listObjects.js.map +1 -1
- package/dist/s3/actions/putObject.d.ts.map +1 -1
- package/dist/s3/actions/putObject.js +38 -1
- package/dist/s3/actions/putObject.js.map +1 -1
- package/dist/s3/actions/uploadPart.d.ts +9 -0
- package/dist/s3/actions/uploadPart.d.ts.map +1 -0
- package/dist/s3/actions/uploadPart.js +32 -0
- package/dist/s3/actions/uploadPart.js.map +1 -0
- package/dist/s3/s3Router.d.ts.map +1 -1
- package/dist/s3/s3Router.js +59 -6
- package/dist/s3/s3Router.js.map +1 -1
- package/dist/s3/s3Store.d.ts +25 -2
- package/dist/s3/s3Store.d.ts.map +1 -1
- package/dist/s3/s3Store.js +157 -6
- package/dist/s3/s3Store.js.map +1 -1
- package/dist/s3/s3Types.d.ts +16 -0
- package/dist/s3/s3Types.d.ts.map +1 -1
- package/dist/sns/actions/publish.d.ts.map +1 -1
- package/dist/sns/actions/publish.js +11 -18
- package/dist/sns/actions/publish.js.map +1 -1
- package/dist/sns/actions/setSubscriptionAttributes.d.ts.map +1 -1
- package/dist/sns/actions/setSubscriptionAttributes.js +11 -0
- package/dist/sns/actions/setSubscriptionAttributes.js.map +1 -1
- package/dist/sns/filter.d.ts +5 -0
- package/dist/sns/filter.d.ts.map +1 -1
- package/dist/sns/filter.js +99 -15
- package/dist/sns/filter.js.map +1 -1
- package/dist/sns/snsStore.d.ts.map +1 -1
- package/dist/sns/snsStore.js +8 -0
- package/dist/sns/snsStore.js.map +1 -1
- package/dist/sqs/actions/createQueue.d.ts.map +1 -1
- package/dist/sqs/actions/createQueue.js +3 -1
- package/dist/sqs/actions/createQueue.js.map +1 -1
- package/dist/sqs/actions/receiveMessage.d.ts.map +1 -1
- package/dist/sqs/actions/receiveMessage.js +3 -0
- package/dist/sqs/actions/receiveMessage.js.map +1 -1
- package/dist/sqs/actions/sendMessageBatch.d.ts.map +1 -1
- package/dist/sqs/actions/sendMessageBatch.js +14 -2
- package/dist/sqs/actions/sendMessageBatch.js.map +1 -1
- package/dist/sqs/actions/setQueueAttributes.d.ts.map +1 -1
- package/dist/sqs/actions/setQueueAttributes.js +3 -1
- package/dist/sqs/actions/setQueueAttributes.js.map +1 -1
- package/dist/sqs/sqsStore.d.ts.map +1 -1
- package/dist/sqs/sqsStore.js +5 -1
- package/dist/sqs/sqsStore.js.map +1 -1
- package/dist/sqs/sqsTypes.d.ts +5 -0
- package/dist/sqs/sqsTypes.d.ts.map +1 -1
- package/dist/sqs/sqsTypes.js +21 -0
- package/dist/sqs/sqsTypes.js.map +1 -1
- 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
|
|
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
|
-
- **
|
|
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 @@
|
|
|
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(/&/g, "&")
|
|
5
|
+
.replace(/</g, "<")
|
|
6
|
+
.replace(/>/g, ">")
|
|
7
|
+
.replace(/"/g, '"')
|
|
8
|
+
.replace(/'/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 @@
|
|
|
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;
|
|
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(/&/g, "&")
|
|
5
|
+
.replace(/</g, "<")
|
|
6
|
+
.replace(/>/g, ">")
|
|
7
|
+
.replace(/"/g, '"')
|
|
8
|
+
.replace(/'/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>([
|
|
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,
|
|
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,
|
|
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,
|
|
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 @@
|
|
|
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,
|
|
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
|
|
5
|
-
const
|
|
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
|
|
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
|
-
` <
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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(
|
|
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;
|
|
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;
|
|
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"}
|