local-serverless-stack 0.6.0 → 0.8.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 (215) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/README.md +99 -11
  3. package/bin/cli.js +31 -3
  4. package/dist/server/engine/backends/localstack-backend.d.ts +25 -0
  5. package/dist/server/engine/backends/localstack-backend.d.ts.map +1 -0
  6. package/dist/server/engine/backends/localstack-backend.js +199 -0
  7. package/dist/server/engine/backends/localstack-backend.js.map +1 -0
  8. package/dist/server/engine/backends/self-backend.d.ts +32 -0
  9. package/dist/server/engine/backends/self-backend.d.ts.map +1 -0
  10. package/dist/server/engine/backends/self-backend.js +205 -0
  11. package/dist/server/engine/backends/self-backend.js.map +1 -0
  12. package/dist/server/engine/bus.d.ts +10 -0
  13. package/dist/server/engine/bus.d.ts.map +1 -0
  14. package/dist/server/engine/bus.js +24 -0
  15. package/dist/server/engine/bus.js.map +1 -0
  16. package/dist/server/engine/dispatch/dispatcher.d.ts +46 -0
  17. package/dist/server/engine/dispatch/dispatcher.d.ts.map +1 -0
  18. package/dist/server/engine/dispatch/dispatcher.js +312 -0
  19. package/dist/server/engine/dispatch/dispatcher.js.map +1 -0
  20. package/dist/server/engine/dispatch/scheduler.d.ts +47 -0
  21. package/dist/server/engine/dispatch/scheduler.d.ts.map +1 -0
  22. package/dist/server/engine/dispatch/scheduler.js +328 -0
  23. package/dist/server/engine/dispatch/scheduler.js.map +1 -0
  24. package/dist/server/engine/dispatch/sqs-poller.d.ts +25 -0
  25. package/dist/server/engine/dispatch/sqs-poller.d.ts.map +1 -0
  26. package/dist/server/engine/dispatch/sqs-poller.js +242 -0
  27. package/dist/server/engine/dispatch/sqs-poller.js.map +1 -0
  28. package/dist/server/engine/dispatch/stream-tailer.d.ts +22 -0
  29. package/dist/server/engine/dispatch/stream-tailer.d.ts.map +1 -0
  30. package/dist/server/engine/dispatch/stream-tailer.js +205 -0
  31. package/dist/server/engine/dispatch/stream-tailer.js.map +1 -0
  32. package/dist/server/engine/emulators/dynamodb/expressions/decimal.d.ts +5 -0
  33. package/dist/server/engine/emulators/dynamodb/expressions/decimal.d.ts.map +1 -0
  34. package/dist/server/engine/emulators/dynamodb/expressions/decimal.js +91 -0
  35. package/dist/server/engine/emulators/dynamodb/expressions/decimal.js.map +1 -0
  36. package/dist/server/engine/emulators/dynamodb/expressions/evaluate.d.ts +24 -0
  37. package/dist/server/engine/emulators/dynamodb/expressions/evaluate.d.ts.map +1 -0
  38. package/dist/server/engine/emulators/dynamodb/expressions/evaluate.js +183 -0
  39. package/dist/server/engine/emulators/dynamodb/expressions/evaluate.js.map +1 -0
  40. package/dist/server/engine/emulators/dynamodb/expressions/expression-types.d.ts +29 -0
  41. package/dist/server/engine/emulators/dynamodb/expressions/expression-types.d.ts.map +1 -0
  42. package/dist/server/engine/emulators/dynamodb/expressions/expression-types.js +12 -0
  43. package/dist/server/engine/emulators/dynamodb/expressions/expression-types.js.map +1 -0
  44. package/dist/server/engine/emulators/dynamodb/expressions/index.d.ts +13 -0
  45. package/dist/server/engine/emulators/dynamodb/expressions/index.d.ts.map +1 -0
  46. package/dist/server/engine/emulators/dynamodb/expressions/index.js +244 -0
  47. package/dist/server/engine/emulators/dynamodb/expressions/index.js.map +1 -0
  48. package/dist/server/engine/emulators/dynamodb/expressions/lexer.d.ts +11 -0
  49. package/dist/server/engine/emulators/dynamodb/expressions/lexer.d.ts.map +1 -0
  50. package/dist/server/engine/emulators/dynamodb/expressions/lexer.js +109 -0
  51. package/dist/server/engine/emulators/dynamodb/expressions/lexer.js.map +1 -0
  52. package/dist/server/engine/emulators/dynamodb/expressions/parser.d.ts +23 -0
  53. package/dist/server/engine/emulators/dynamodb/expressions/parser.d.ts.map +1 -0
  54. package/dist/server/engine/emulators/dynamodb/expressions/parser.js +541 -0
  55. package/dist/server/engine/emulators/dynamodb/expressions/parser.js.map +1 -0
  56. package/dist/server/engine/emulators/dynamodb/index.d.ts +46 -0
  57. package/dist/server/engine/emulators/dynamodb/index.d.ts.map +1 -0
  58. package/dist/server/engine/emulators/dynamodb/index.js +572 -0
  59. package/dist/server/engine/emulators/dynamodb/index.js.map +1 -0
  60. package/dist/server/engine/emulators/dynamodb/query.d.ts +12 -0
  61. package/dist/server/engine/emulators/dynamodb/query.d.ts.map +1 -0
  62. package/dist/server/engine/emulators/dynamodb/query.js +237 -0
  63. package/dist/server/engine/emulators/dynamodb/query.js.map +1 -0
  64. package/dist/server/engine/emulators/dynamodb/schema.d.ts +58 -0
  65. package/dist/server/engine/emulators/dynamodb/schema.d.ts.map +1 -0
  66. package/dist/server/engine/emulators/dynamodb/schema.js +284 -0
  67. package/dist/server/engine/emulators/dynamodb/schema.js.map +1 -0
  68. package/dist/server/engine/emulators/dynamodb/streams.d.ts +28 -0
  69. package/dist/server/engine/emulators/dynamodb/streams.d.ts.map +1 -0
  70. package/dist/server/engine/emulators/dynamodb/streams.js +100 -0
  71. package/dist/server/engine/emulators/dynamodb/streams.js.map +1 -0
  72. package/dist/server/engine/emulators/events/index.d.ts +53 -0
  73. package/dist/server/engine/emulators/events/index.d.ts.map +1 -0
  74. package/dist/server/engine/emulators/events/index.js +417 -0
  75. package/dist/server/engine/emulators/events/index.js.map +1 -0
  76. package/dist/server/engine/emulators/events/pattern.d.ts +3 -0
  77. package/dist/server/engine/emulators/events/pattern.d.ts.map +1 -0
  78. package/dist/server/engine/emulators/events/pattern.js +125 -0
  79. package/dist/server/engine/emulators/events/pattern.js.map +1 -0
  80. package/dist/server/engine/emulators/lambda-ctl/index.d.ts +55 -0
  81. package/dist/server/engine/emulators/lambda-ctl/index.d.ts.map +1 -0
  82. package/dist/server/engine/emulators/lambda-ctl/index.js +461 -0
  83. package/dist/server/engine/emulators/lambda-ctl/index.js.map +1 -0
  84. package/dist/server/engine/emulators/s3/index.d.ts +45 -0
  85. package/dist/server/engine/emulators/s3/index.d.ts.map +1 -0
  86. package/dist/server/engine/emulators/s3/index.js +591 -0
  87. package/dist/server/engine/emulators/s3/index.js.map +1 -0
  88. package/dist/server/engine/emulators/sns/index.d.ts +22 -0
  89. package/dist/server/engine/emulators/sns/index.d.ts.map +1 -0
  90. package/dist/server/engine/emulators/sns/index.js +135 -0
  91. package/dist/server/engine/emulators/sns/index.js.map +1 -0
  92. package/dist/server/engine/emulators/sqs/index.d.ts +66 -0
  93. package/dist/server/engine/emulators/sqs/index.d.ts.map +1 -0
  94. package/dist/server/engine/emulators/sqs/index.js +552 -0
  95. package/dist/server/engine/emulators/sqs/index.js.map +1 -0
  96. package/dist/server/engine/emulators/sqs/md5.d.ts +8 -0
  97. package/dist/server/engine/emulators/sqs/md5.d.ts.map +1 -0
  98. package/dist/server/engine/emulators/sqs/md5.js +36 -0
  99. package/dist/server/engine/emulators/sqs/md5.js.map +1 -0
  100. package/dist/server/engine/emulators/sqs/queue.d.ts +105 -0
  101. package/dist/server/engine/emulators/sqs/queue.d.ts.map +1 -0
  102. package/dist/server/engine/emulators/sqs/queue.js +371 -0
  103. package/dist/server/engine/emulators/sqs/queue.js.map +1 -0
  104. package/dist/server/engine/emulators/sts.d.ts +8 -0
  105. package/dist/server/engine/emulators/sts.d.ts.map +1 -0
  106. package/dist/server/engine/emulators/sts.js +23 -0
  107. package/dist/server/engine/emulators/sts.js.map +1 -0
  108. package/dist/server/engine/engine-backend.d.ts +17 -0
  109. package/dist/server/engine/engine-backend.d.ts.map +1 -0
  110. package/dist/server/engine/engine-backend.js +7 -0
  111. package/dist/server/engine/engine-backend.js.map +1 -0
  112. package/dist/server/engine/engine-manager.d.ts +22 -0
  113. package/dist/server/engine/engine-manager.d.ts.map +1 -0
  114. package/dist/server/engine/engine-manager.js +74 -0
  115. package/dist/server/engine/engine-manager.js.map +1 -0
  116. package/dist/server/engine/http/aws-chunked.d.ts +3 -0
  117. package/dist/server/engine/http/aws-chunked.d.ts.map +1 -0
  118. package/dist/server/engine/http/aws-chunked.js +50 -0
  119. package/dist/server/engine/http/aws-chunked.js.map +1 -0
  120. package/dist/server/engine/http/errors.d.ts +20 -0
  121. package/dist/server/engine/http/errors.d.ts.map +1 -0
  122. package/dist/server/engine/http/errors.js +43 -0
  123. package/dist/server/engine/http/errors.js.map +1 -0
  124. package/dist/server/engine/http/protocols/aws-json.d.ts +8 -0
  125. package/dist/server/engine/http/protocols/aws-json.d.ts.map +1 -0
  126. package/dist/server/engine/http/protocols/aws-json.js +42 -0
  127. package/dist/server/engine/http/protocols/aws-json.js.map +1 -0
  128. package/dist/server/engine/http/protocols/query-xml.d.ts +7 -0
  129. package/dist/server/engine/http/protocols/query-xml.d.ts.map +1 -0
  130. package/dist/server/engine/http/protocols/query-xml.js +35 -0
  131. package/dist/server/engine/http/protocols/query-xml.js.map +1 -0
  132. package/dist/server/engine/http/router.d.ts +8 -0
  133. package/dist/server/engine/http/router.d.ts.map +1 -0
  134. package/dist/server/engine/http/router.js +391 -0
  135. package/dist/server/engine/http/router.js.map +1 -0
  136. package/dist/server/engine/http/sigv4.d.ts +9 -0
  137. package/dist/server/engine/http/sigv4.d.ts.map +1 -0
  138. package/dist/server/engine/http/sigv4.js +33 -0
  139. package/dist/server/engine/http/sigv4.js.map +1 -0
  140. package/dist/server/engine/http/xml.d.ts +16 -0
  141. package/dist/server/engine/http/xml.d.ts.map +1 -0
  142. package/dist/server/engine/http/xml.js +92 -0
  143. package/dist/server/engine/http/xml.js.map +1 -0
  144. package/dist/server/engine/store/atomic.d.ts +4 -0
  145. package/dist/server/engine/store/atomic.d.ts.map +1 -0
  146. package/dist/server/engine/store/atomic.js +35 -0
  147. package/dist/server/engine/store/atomic.js.map +1 -0
  148. package/dist/server/engine/store/engine-store.d.ts +9 -0
  149. package/dist/server/engine/store/engine-store.d.ts.map +1 -0
  150. package/dist/server/engine/store/engine-store.js +218 -0
  151. package/dist/server/engine/store/engine-store.js.map +1 -0
  152. package/dist/server/engine/store/store-types.d.ts +37 -0
  153. package/dist/server/engine/store/store-types.d.ts.map +1 -0
  154. package/dist/server/engine/store/store-types.js +17 -0
  155. package/dist/server/engine/store/store-types.js.map +1 -0
  156. package/dist/server/engine/store/wal.d.ts +49 -0
  157. package/dist/server/engine/store/wal.d.ts.map +1 -0
  158. package/dist/server/engine/store/wal.js +328 -0
  159. package/dist/server/engine/store/wal.js.map +1 -0
  160. package/dist/server/engine/types.d.ts +137 -0
  161. package/dist/server/engine/types.d.ts.map +1 -0
  162. package/dist/server/engine/types.js +8 -0
  163. package/dist/server/engine/types.js.map +1 -0
  164. package/dist/server/index.js +12 -9
  165. package/dist/server/index.js.map +1 -1
  166. package/dist/server/routes/services.d.ts.map +1 -1
  167. package/dist/server/routes/services.js +2 -0
  168. package/dist/server/routes/services.js.map +1 -1
  169. package/dist/server/services/cloudformation-parser.d.ts +26 -2
  170. package/dist/server/services/cloudformation-parser.d.ts.map +1 -1
  171. package/dist/server/services/cloudformation-parser.js +60 -3
  172. package/dist/server/services/cloudformation-parser.js.map +1 -1
  173. package/dist/server/services/config-manager.d.ts +27 -0
  174. package/dist/server/services/config-manager.d.ts.map +1 -1
  175. package/dist/server/services/config-manager.js +67 -7
  176. package/dist/server/services/config-manager.js.map +1 -1
  177. package/dist/server/services/localstack-manager.d.ts +0 -7
  178. package/dist/server/services/localstack-manager.d.ts.map +1 -1
  179. package/dist/server/services/localstack-manager.js +11 -173
  180. package/dist/server/services/localstack-manager.js.map +1 -1
  181. package/dist/server/services/resource-provisioner.d.ts +6 -0
  182. package/dist/server/services/resource-provisioner.d.ts.map +1 -1
  183. package/dist/server/services/resource-provisioner.js +171 -7
  184. package/dist/server/services/resource-provisioner.js.map +1 -1
  185. package/dist/server/services/service-registrar.js +2 -2
  186. package/dist/server/services/service-registrar.js.map +1 -1
  187. package/dist/ui/assets/ApisPage-a9i2qD0Z.js +1 -0
  188. package/dist/ui/assets/BucketDetailPage-Cz27N0KV.js +1 -0
  189. package/dist/ui/assets/BucketsPage-CZ7wGmUN.js +1 -0
  190. package/dist/ui/assets/{DynamoPage-B1__Rjr2.js → DynamoPage-BZMs1iW8.js} +1 -1
  191. package/dist/ui/assets/DynamoTablePage-BQsGkhtO.js +3 -0
  192. package/dist/ui/assets/LambdaDetailPage-DJb7xqRB.js +4 -0
  193. package/dist/ui/assets/LambdasPage-Ctg1l-Lg.js +1 -0
  194. package/dist/ui/assets/OverviewPage-DiijblCA.js +1 -0
  195. package/dist/ui/assets/QueueDetailPage-DRpSqost.js +1 -0
  196. package/dist/ui/assets/QueuesPage-CY0bDGwV.js +1 -0
  197. package/dist/ui/assets/ServiceDetailPage-CYTEdtts.js +2 -0
  198. package/dist/ui/assets/ServicesPage-OlV_rr-q.js +2 -0
  199. package/dist/ui/assets/index-C1KdKPDS.css +1 -0
  200. package/dist/ui/assets/index-DA_C1HOg.js +36 -0
  201. package/dist/ui/index.html +2 -2
  202. package/package.json +2 -1
  203. package/dist/ui/assets/ApisPage-DdgKjEdS.js +0 -1
  204. package/dist/ui/assets/BucketDetailPage-DZQGxm0y.js +0 -1
  205. package/dist/ui/assets/BucketsPage-xYXzxCvd.js +0 -1
  206. package/dist/ui/assets/DynamoTablePage-BCoxPdXW.js +0 -3
  207. package/dist/ui/assets/LambdaDetailPage-B85CA8tb.js +0 -4
  208. package/dist/ui/assets/LambdasPage-_TtxQMT_.js +0 -1
  209. package/dist/ui/assets/OverviewPage-CqTKTY64.js +0 -1
  210. package/dist/ui/assets/QueueDetailPage-BOr_sImA.js +0 -1
  211. package/dist/ui/assets/QueuesPage-DpByfcM5.js +0 -1
  212. package/dist/ui/assets/ServiceDetailPage-DsWgV-ad.js +0 -2
  213. package/dist/ui/assets/ServicesPage-CGlpsj98.js +0 -2
  214. package/dist/ui/assets/index-BWlB542w.js +0 -36
  215. package/dist/ui/assets/index-EYnsoJOq.css +0 -1
@@ -0,0 +1,591 @@
1
+ // S3 emulator: rest-xml protocol, path-style only (the router peels
2
+ // virtual-host requests back into path-style before dispatching here).
3
+ // Bucket metadata lives in the 's3/buckets' catalog; each bucket keeps an
4
+ // object index in its own ItemTable and object bodies live as blobs on disk —
5
+ // bodies are never held in in-memory maps.
6
+ import { createHash, randomUUID } from 'crypto';
7
+ import { s3Error, notImplemented } from '../../http/errors.js';
8
+ import { tag, xmlDocument, parseXml, childrenNamed, childText } from '../../http/xml.js';
9
+ const S3_XMLNS = 'http://s3.amazonaws.com/doc/2006-03-01/';
10
+ // Fixed canonical owner (same fiction LocalStack uses) — tooling only displays it.
11
+ const OWNER_ID = '75aa57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a';
12
+ const OWNER_DISPLAY_NAME = 'webfile';
13
+ const DEFAULT_CONTENT_TYPE = 'binary/octet-stream';
14
+ const METADATA_HEADER_PREFIX = 'x-amz-meta-';
15
+ export class S3Emulator {
16
+ service = 's3';
17
+ ctx;
18
+ buckets;
19
+ lastSequencer = 0n;
20
+ constructor(ctx) {
21
+ this.ctx = ctx;
22
+ this.buckets = ctx.store.catalog('s3/buckets');
23
+ }
24
+ async handle(req) {
25
+ await this.buckets.load();
26
+ if ('uploads' in req.query || 'uploadId' in req.query || 'partNumber' in req.query) {
27
+ throw s3Error('NotImplemented', 'S3 multipart upload is not implemented by the LSS self engine yet — it lands in the hardening phase', 501);
28
+ }
29
+ const { bucket, key } = parsePath(req.rawPath);
30
+ if (!bucket) {
31
+ if (req.method === 'GET')
32
+ return this.listBuckets();
33
+ throw notImplemented('s3', `${req.method} /`);
34
+ }
35
+ if (key === undefined)
36
+ return this.handleBucket(req, bucket);
37
+ return this.handleObject(req, bucket, key);
38
+ }
39
+ // Dispatcher hook: the normalized Lambda notification entries for a bucket
40
+ // (empty when the bucket is unknown or has no configuration).
41
+ async getNotificationConfiguration(bucket) {
42
+ await this.buckets.load();
43
+ return this.buckets.get(bucket)?.notifications?.lambda ?? [];
44
+ }
45
+ // -------------------------------------------------------------------------
46
+ // Bucket-level operations
47
+ // -------------------------------------------------------------------------
48
+ async handleBucket(req, bucket) {
49
+ if (req.method === 'PUT') {
50
+ if ('versioning' in req.query)
51
+ return this.putBucketVersioning(bucket, req);
52
+ if ('notification' in req.query)
53
+ return this.putBucketNotification(bucket, req);
54
+ return this.createBucket(bucket, req);
55
+ }
56
+ if (req.method === 'GET') {
57
+ if ('location' in req.query)
58
+ return this.getBucketLocation(bucket);
59
+ if ('versioning' in req.query)
60
+ return this.getBucketVersioning(bucket);
61
+ if ('notification' in req.query)
62
+ return this.getBucketNotification(bucket);
63
+ if (req.query['list-type'] === '2')
64
+ return this.listObjectsV2(bucket, req.query);
65
+ throw notImplemented('s3', 'ListObjects (v1) — request with list-type=2');
66
+ }
67
+ if (req.method === 'HEAD') {
68
+ this.requireBucket(bucket);
69
+ return { status: 200 };
70
+ }
71
+ if (req.method === 'DELETE')
72
+ return this.deleteBucket(bucket);
73
+ if (req.method === 'POST' && 'delete' in req.query)
74
+ return this.deleteObjects(bucket, req);
75
+ throw notImplemented('s3', `${req.method} /<bucket>`);
76
+ }
77
+ createBucket(bucket, req) {
78
+ if (this.buckets.get(bucket)) {
79
+ throw s3Error('BucketAlreadyOwnedByYou', 'Your previous request to create the named bucket succeeded and you already own it.', 409);
80
+ }
81
+ let region = req.region;
82
+ if (req.body.length > 0) {
83
+ const constraint = childText(parseBodyXml(req.body), 'LocationConstraint');
84
+ if (constraint)
85
+ region = constraint;
86
+ }
87
+ this.buckets.set(bucket, { region, creationDate: new Date().toISOString() });
88
+ return { status: 200, headers: { Location: `/${bucket}` } };
89
+ }
90
+ async deleteBucket(bucket) {
91
+ this.requireBucket(bucket);
92
+ const index = await this.index(bucket);
93
+ if (index.size() > 0) {
94
+ throw s3Error('BucketNotEmpty', 'The bucket you tried to delete is not empty', 409);
95
+ }
96
+ await index.destroy();
97
+ this.buckets.delete(bucket);
98
+ return { status: 204 };
99
+ }
100
+ listBuckets() {
101
+ const bucketsXml = this.buckets
102
+ .keys()
103
+ .sort()
104
+ .map(name => {
105
+ const record = this.buckets.get(name);
106
+ const creationDate = record ? record.creationDate : new Date().toISOString();
107
+ return tag('Bucket', tag('Name', name) + tag('CreationDate', creationDate), { escape: false });
108
+ })
109
+ .join('');
110
+ const owner = tag('Owner', tag('ID', OWNER_ID) + tag('DisplayName', OWNER_DISPLAY_NAME), { escape: false });
111
+ const root = tag('ListAllMyBucketsResult', owner + tag('Buckets', bucketsXml, { escape: false }), {
112
+ attrs: { xmlns: S3_XMLNS },
113
+ escape: false,
114
+ });
115
+ return xmlResponse(200, root);
116
+ }
117
+ getBucketLocation(bucket) {
118
+ const record = this.requireBucket(bucket);
119
+ // AWS quirk: us-east-1 is reported as an EMPTY (self-closing) element.
120
+ const content = record.region === 'us-east-1' ? '' : record.region;
121
+ return xmlResponse(200, tag('LocationConstraint', content, { attrs: { xmlns: S3_XMLNS } }));
122
+ }
123
+ putBucketVersioning(bucket, req) {
124
+ const record = this.requireBucket(bucket);
125
+ const status = childText(parseBodyXml(req.body), 'Status');
126
+ if (status !== 'Enabled' && status !== 'Suspended') {
127
+ throw s3Error('MalformedXML', 'VersioningConfiguration Status must be Enabled or Suspended', 400);
128
+ }
129
+ this.buckets.set(bucket, { ...record, versioningStatus: status });
130
+ return { status: 200 };
131
+ }
132
+ getBucketVersioning(bucket) {
133
+ const record = this.requireBucket(bucket);
134
+ const content = record.versioningStatus ? tag('Status', record.versioningStatus) : '';
135
+ return xmlResponse(200, tag('VersioningConfiguration', content, { attrs: { xmlns: S3_XMLNS }, escape: false }));
136
+ }
137
+ putBucketNotification(bucket, req) {
138
+ // SkipDestinationValidation (x-amz-skip-destination-validation) is
139
+ // accepted implicitly: destinations are never probed.
140
+ const record = this.requireBucket(bucket);
141
+ this.buckets.set(bucket, { ...record, notifications: parseNotificationConfiguration(req.body) });
142
+ return { status: 200 };
143
+ }
144
+ getBucketNotification(bucket) {
145
+ const record = this.requireBucket(bucket);
146
+ return xmlResponse(200, serializeNotificationConfiguration(record.notifications));
147
+ }
148
+ async listObjectsV2(bucket, query) {
149
+ this.requireBucket(bucket);
150
+ const index = await this.index(bucket);
151
+ const prefix = query.prefix ?? '';
152
+ const delimiter = query.delimiter || undefined;
153
+ const encode = query['encoding-type'] === 'url';
154
+ const requestedMax = Number.parseInt(query['max-keys'] ?? '', 10);
155
+ const maxKeys = Number.isNaN(requestedMax) ? 1000 : Math.min(Math.max(requestedMax, 0), 1000);
156
+ const continuationToken = query['continuation-token'];
157
+ const startAfter = query['start-after'] ?? '';
158
+ // The continuation token is opaque: base64 of the last key the previous
159
+ // page consumed. It wins over start-after, like real S3.
160
+ const after = continuationToken ? Buffer.from(continuationToken, 'base64').toString('utf8') : startAfter;
161
+ const keys = [];
162
+ if (maxKeys > 0) {
163
+ for (const [key] of index.entries()) {
164
+ if (key.startsWith(prefix) && key > after)
165
+ keys.push(key);
166
+ }
167
+ keys.sort();
168
+ }
169
+ const contents = [];
170
+ const prefixes = [];
171
+ const seenPrefixes = new Set();
172
+ let truncated = false;
173
+ let lastKey = '';
174
+ for (const key of keys) {
175
+ let commonPrefix;
176
+ if (delimiter) {
177
+ const rest = key.slice(prefix.length);
178
+ const cut = rest.indexOf(delimiter);
179
+ if (cut >= 0)
180
+ commonPrefix = prefix + rest.slice(0, cut + delimiter.length);
181
+ }
182
+ if (commonPrefix && seenPrefixes.has(commonPrefix)) {
183
+ // Grouped under an already-counted prefix — consumes the key for the
184
+ // continuation cursor but not the MaxKeys budget.
185
+ lastKey = key;
186
+ continue;
187
+ }
188
+ if (contents.length + prefixes.length >= maxKeys) {
189
+ truncated = true;
190
+ break;
191
+ }
192
+ if (commonPrefix) {
193
+ seenPrefixes.add(commonPrefix);
194
+ prefixes.push(commonPrefix);
195
+ }
196
+ else {
197
+ const record = index.get(key);
198
+ contents.push(tag('Contents', tag('Key', encode ? urlEncodeKey(key) : key) +
199
+ tag('LastModified', record.lastModified) +
200
+ tag('ETag', `"${record.eTag}"`) +
201
+ tag('Size', String(record.size)) +
202
+ tag('StorageClass', record.storageClass), { escape: false }));
203
+ }
204
+ lastKey = key;
205
+ }
206
+ const parts = [
207
+ tag('Name', bucket),
208
+ tag('Prefix', encode ? urlEncodeKey(prefix) : prefix),
209
+ ];
210
+ if (delimiter)
211
+ parts.push(tag('Delimiter', encode ? urlEncodeKey(delimiter) : delimiter));
212
+ if (encode)
213
+ parts.push(tag('EncodingType', 'url'));
214
+ parts.push(tag('MaxKeys', String(maxKeys)));
215
+ parts.push(tag('KeyCount', String(contents.length + prefixes.length)));
216
+ parts.push(tag('IsTruncated', truncated ? 'true' : 'false'));
217
+ if (continuationToken)
218
+ parts.push(tag('ContinuationToken', continuationToken));
219
+ if (startAfter)
220
+ parts.push(tag('StartAfter', encode ? urlEncodeKey(startAfter) : startAfter));
221
+ if (truncated)
222
+ parts.push(tag('NextContinuationToken', Buffer.from(lastKey, 'utf8').toString('base64')));
223
+ parts.push(...contents);
224
+ parts.push(...prefixes.map(p => tag('CommonPrefixes', tag('Prefix', encode ? urlEncodeKey(p) : p), { escape: false })));
225
+ return xmlResponse(200, tag('ListBucketResult', parts.join(''), { attrs: { xmlns: S3_XMLNS }, escape: false }));
226
+ }
227
+ async deleteObjects(bucket, req) {
228
+ const bucketRecord = this.requireBucket(bucket);
229
+ const index = await this.index(bucket);
230
+ const root = parseBodyXml(req.body);
231
+ if (root.name !== 'Delete') {
232
+ throw s3Error('MalformedXML', 'DeleteObjects expects a <Delete> document', 400);
233
+ }
234
+ const quiet = (childText(root, 'Quiet') ?? '').toLowerCase() === 'true';
235
+ const deleted = [];
236
+ for (const objectNode of childrenNamed(root, 'Object')) {
237
+ const key = childText(objectNode, 'Key');
238
+ if (key === undefined)
239
+ continue;
240
+ await this.removeObject(index, key);
241
+ this.queueObjectEvent(bucketRecord.region, bucket, 's3:ObjectRemoved:Delete', key, 0, '');
242
+ deleted.push(key);
243
+ }
244
+ const body = quiet ? '' : deleted.map(key => tag('Deleted', tag('Key', key), { escape: false })).join('');
245
+ return xmlResponse(200, tag('DeleteResult', body, { attrs: { xmlns: S3_XMLNS }, escape: false }));
246
+ }
247
+ // -------------------------------------------------------------------------
248
+ // Object-level operations
249
+ // -------------------------------------------------------------------------
250
+ async handleObject(req, bucket, key) {
251
+ if (req.method === 'PUT') {
252
+ if (req.headers['x-amz-copy-source'])
253
+ return this.copyObject(bucket, key, req);
254
+ return this.putObject(bucket, key, req);
255
+ }
256
+ if (req.method === 'GET')
257
+ return this.getObject(bucket, key, req);
258
+ if (req.method === 'HEAD')
259
+ return this.headObject(bucket, key);
260
+ if (req.method === 'DELETE')
261
+ return this.deleteObject(bucket, key);
262
+ throw notImplemented('s3', `${req.method} /<bucket>/<key>`);
263
+ }
264
+ async putObject(bucket, key, req) {
265
+ const bucketRecord = this.requireBucket(bucket);
266
+ const index = await this.index(bucket);
267
+ const eTag = md5Hex(req.body);
268
+ // Blob first, index second: the index never points at a missing blob.
269
+ const blobPath = await this.ctx.store.writeBlob(`s3/${bucket}/blobs`, req.body);
270
+ const previous = index.get(key);
271
+ const record = {
272
+ size: req.body.length,
273
+ eTag,
274
+ lastModified: new Date().toISOString(),
275
+ blobPath,
276
+ contentType: req.headers['content-type'] ?? DEFAULT_CONTENT_TYPE,
277
+ metadata: metadataFromHeaders(req.headers),
278
+ storageClass: 'STANDARD',
279
+ };
280
+ index.put(key, record);
281
+ if (previous && previous.blobPath !== blobPath) {
282
+ await this.deleteBlobIfUnreferenced(index, previous.blobPath);
283
+ }
284
+ this.queueObjectEvent(bucketRecord.region, bucket, 's3:ObjectCreated:Put', key, record.size, eTag);
285
+ return { status: 200, headers: { ETag: `"${eTag}"` } };
286
+ }
287
+ async copyObject(bucket, key, req) {
288
+ const bucketRecord = this.requireBucket(bucket);
289
+ const rawSource = req.headers['x-amz-copy-source'] ?? '';
290
+ const source = safeDecode(rawSource.split('?')[0]).replace(/^\//, '');
291
+ const cut = source.indexOf('/');
292
+ if (cut <= 0 || cut === source.length - 1) {
293
+ throw s3Error('InvalidArgument', 'Copy Source must mention the source bucket and key: sourcebucket/sourcekey', 400);
294
+ }
295
+ const sourceBucket = source.slice(0, cut);
296
+ const sourceKey = source.slice(cut + 1);
297
+ this.requireBucket(sourceBucket);
298
+ const sourceIndex = await this.index(sourceBucket);
299
+ const sourceRecord = sourceIndex.get(sourceKey);
300
+ if (!sourceRecord)
301
+ throw s3Error('NoSuchKey', 'The specified key does not exist.', 404);
302
+ const data = await this.ctx.store.readBlob(sourceRecord.blobPath);
303
+ const index = await this.index(bucket);
304
+ const blobPath = await this.ctx.store.writeBlob(`s3/${bucket}/blobs`, data);
305
+ const replaceMetadata = (req.headers['x-amz-metadata-directive'] ?? 'COPY').toUpperCase() === 'REPLACE';
306
+ const lastModified = new Date().toISOString();
307
+ const previous = index.get(key);
308
+ const record = {
309
+ size: sourceRecord.size,
310
+ eTag: sourceRecord.eTag,
311
+ lastModified,
312
+ blobPath,
313
+ contentType: replaceMetadata ? req.headers['content-type'] ?? DEFAULT_CONTENT_TYPE : sourceRecord.contentType,
314
+ metadata: replaceMetadata ? metadataFromHeaders(req.headers) : { ...sourceRecord.metadata },
315
+ storageClass: 'STANDARD',
316
+ };
317
+ index.put(key, record);
318
+ if (previous && previous.blobPath !== blobPath) {
319
+ await this.deleteBlobIfUnreferenced(index, previous.blobPath);
320
+ }
321
+ this.queueObjectEvent(bucketRecord.region, bucket, 's3:ObjectCreated:Copy', key, record.size, record.eTag);
322
+ const result = tag('CopyObjectResult', tag('ETag', `"${record.eTag}"`) + tag('LastModified', lastModified), {
323
+ attrs: { xmlns: S3_XMLNS },
324
+ escape: false,
325
+ });
326
+ return xmlResponse(200, result);
327
+ }
328
+ async getObject(bucket, key, req) {
329
+ const record = await this.requireObject(bucket, key);
330
+ const data = await this.ctx.store.readBlob(record.blobPath);
331
+ const headers = objectHeaders(record);
332
+ const range = parseRange(req.headers.range, record.size);
333
+ if (range) {
334
+ const slice = data.subarray(range.start, range.end + 1);
335
+ headers['Content-Range'] = `bytes ${range.start}-${range.end}/${record.size}`;
336
+ headers['Content-Length'] = String(slice.length);
337
+ return { status: 206, headers, body: slice };
338
+ }
339
+ headers['Content-Length'] = String(record.size);
340
+ return { status: 200, headers, body: data };
341
+ }
342
+ async headObject(bucket, key) {
343
+ const record = await this.requireObject(bucket, key);
344
+ const headers = objectHeaders(record);
345
+ headers['Content-Length'] = String(record.size);
346
+ return { status: 200, headers };
347
+ }
348
+ async deleteObject(bucket, key) {
349
+ const bucketRecord = this.requireBucket(bucket);
350
+ const index = await this.index(bucket);
351
+ await this.removeObject(index, key);
352
+ // AWS semantics: delete succeeds (and notifies) even for a missing key.
353
+ this.queueObjectEvent(bucketRecord.region, bucket, 's3:ObjectRemoved:Delete', key, 0, '');
354
+ return { status: 204 };
355
+ }
356
+ // -------------------------------------------------------------------------
357
+ // Shared internals
358
+ // -------------------------------------------------------------------------
359
+ requireBucket(bucket) {
360
+ const record = this.buckets.get(bucket);
361
+ if (!record)
362
+ throw s3Error('NoSuchBucket', 'The specified bucket does not exist', 404);
363
+ return record;
364
+ }
365
+ async requireObject(bucket, key) {
366
+ this.requireBucket(bucket);
367
+ const index = await this.index(bucket);
368
+ const record = index.get(key);
369
+ if (!record)
370
+ throw s3Error('NoSuchKey', 'The specified key does not exist.', 404);
371
+ return record;
372
+ }
373
+ async index(bucket) {
374
+ const table = this.ctx.store.table(`s3/${bucket}/index`);
375
+ await table.hydrate();
376
+ return table;
377
+ }
378
+ async removeObject(index, key) {
379
+ const record = index.get(key);
380
+ if (!record)
381
+ return;
382
+ index.delete(key);
383
+ await this.deleteBlobIfUnreferenced(index, record.blobPath);
384
+ }
385
+ // The blob store is content-addressed, so two keys written with the same
386
+ // bytes share one blob file. Only delete a blob once no index entry
387
+ // references it anymore (blobs never leak across buckets — each bucket has
388
+ // its own blob directory).
389
+ async deleteBlobIfUnreferenced(index, blobPath) {
390
+ for (const [, value] of index.entries()) {
391
+ if (value.blobPath === blobPath)
392
+ return;
393
+ }
394
+ await this.ctx.store.deleteBlob(blobPath);
395
+ }
396
+ // Post-commit eventing: the sequencer is taken synchronously so ordering
397
+ // matches commit order, but the bus emit is deferred to the next macrotask.
398
+ queueObjectEvent(region, bucket, eventName, key, size, eTag) {
399
+ const sequencer = this.nextSequencer();
400
+ setImmediate(() => {
401
+ this.ctx.bus.emit('s3:object-event', { region, bucket, eventName, key, size, eTag, sequencer });
402
+ });
403
+ }
404
+ nextSequencer() {
405
+ const candidate = BigInt(Date.now()) << 16n;
406
+ this.lastSequencer = candidate > this.lastSequencer ? candidate : this.lastSequencer + 1n;
407
+ return this.lastSequencer.toString(16).toUpperCase().padStart(16, '0');
408
+ }
409
+ }
410
+ // ---------------------------------------------------------------------------
411
+ // Pure helpers
412
+ // ---------------------------------------------------------------------------
413
+ // `/bucket/a/b%20c` → bucket plus key with each segment URL-decoded. Slashes
414
+ // between segments (and any decoded %2F inside one) become plain slashes in
415
+ // the key — exactly how real S3 treats them.
416
+ function parsePath(rawPath) {
417
+ const parts = rawPath.replace(/^\/+/, '').split('/');
418
+ const bucket = safeDecode(parts[0] ?? '');
419
+ if (!bucket)
420
+ return { bucket: undefined, key: undefined };
421
+ if (parts.length === 1)
422
+ return { bucket, key: undefined };
423
+ const key = parts.slice(1).map(safeDecode).join('/');
424
+ return { bucket, key: key || undefined };
425
+ }
426
+ function safeDecode(value) {
427
+ try {
428
+ return decodeURIComponent(value);
429
+ }
430
+ catch {
431
+ throw s3Error('InvalidURI', `Couldn't parse the specified URI: ${value}`, 400);
432
+ }
433
+ }
434
+ function parseBodyXml(body) {
435
+ try {
436
+ return parseXml(body.toString('utf8'));
437
+ }
438
+ catch (error) {
439
+ const message = error instanceof Error ? error.message : String(error);
440
+ throw s3Error('MalformedXML', `The XML you provided was not well-formed: ${message}`, 400);
441
+ }
442
+ }
443
+ function xmlResponse(status, root) {
444
+ return { status, headers: { 'Content-Type': 'application/xml' }, body: xmlDocument(root) };
445
+ }
446
+ function md5Hex(data) {
447
+ return createHash('md5').update(data).digest('hex');
448
+ }
449
+ // encoding-type=url: URL-encode response keys but keep the `/` separators, as
450
+ // real S3 does.
451
+ function urlEncodeKey(value) {
452
+ return value.split('/').map(encodeURIComponent).join('/');
453
+ }
454
+ function metadataFromHeaders(headers) {
455
+ const metadata = {};
456
+ for (const [name, value] of Object.entries(headers)) {
457
+ if (name.startsWith(METADATA_HEADER_PREFIX)) {
458
+ metadata[name.slice(METADATA_HEADER_PREFIX.length)] = value;
459
+ }
460
+ }
461
+ return metadata;
462
+ }
463
+ function objectHeaders(record) {
464
+ const headers = {
465
+ 'Content-Type': record.contentType,
466
+ ETag: `"${record.eTag}"`,
467
+ 'Last-Modified': new Date(record.lastModified).toUTCString(),
468
+ 'Accept-Ranges': 'bytes',
469
+ };
470
+ for (const [name, value] of Object.entries(record.metadata)) {
471
+ headers[`${METADATA_HEADER_PREFIX}${name}`] = value;
472
+ }
473
+ return headers;
474
+ }
475
+ // "bytes=a-b" | "bytes=a-" | "bytes=-n". A malformed header is ignored (full
476
+ // response), like real S3; a syntactically valid but unsatisfiable one is 416.
477
+ function parseRange(header, size) {
478
+ if (!header)
479
+ return undefined;
480
+ const match = /^bytes=(\d*)-(\d*)$/.exec(header.trim());
481
+ if (!match || (match[1] === '' && match[2] === ''))
482
+ return undefined;
483
+ if (match[1] === '') {
484
+ const suffixLength = Number.parseInt(match[2], 10);
485
+ if (suffixLength === 0 || size === 0)
486
+ throw invalidRange();
487
+ return { start: Math.max(0, size - suffixLength), end: size - 1 };
488
+ }
489
+ const start = Number.parseInt(match[1], 10);
490
+ const end = match[2] === '' ? size - 1 : Math.min(Number.parseInt(match[2], 10), size - 1);
491
+ if (start >= size || start > end)
492
+ throw invalidRange();
493
+ return { start, end };
494
+ }
495
+ function invalidRange() {
496
+ return s3Error('InvalidRange', 'The requested range is not satisfiable', 416);
497
+ }
498
+ // ---------------------------------------------------------------------------
499
+ // Notification configuration XML (rest-xml quirk: the wire format uses the
500
+ // LEGACY element names <CloudFunctionConfiguration><CloudFunction> for what
501
+ // the SDK calls LambdaFunctionConfigurations[].LambdaFunctionArn — pinned by
502
+ // the smithy model shipped in @aws-sdk/client-s3. The modern member names are
503
+ // accepted on parse for tools that send them.)
504
+ // ---------------------------------------------------------------------------
505
+ function parseNotificationConfiguration(body) {
506
+ const configuration = { lambda: [], queue: [], topic: [] };
507
+ if (body.length === 0)
508
+ return configuration;
509
+ const root = parseBodyXml(body);
510
+ for (const elementName of ['CloudFunctionConfiguration', 'LambdaFunctionConfiguration']) {
511
+ for (const node of childrenNamed(root, elementName)) {
512
+ configuration.lambda.push({
513
+ id: childText(node, 'Id') ?? randomUUID(),
514
+ lambdaFunctionArn: childText(node, 'CloudFunction') ?? childText(node, 'LambdaFunctionArn') ?? '',
515
+ events: childrenNamed(node, 'Event').map(event => event.text),
516
+ filterRules: parseFilterRules(node),
517
+ });
518
+ }
519
+ }
520
+ for (const node of childrenNamed(root, 'QueueConfiguration')) {
521
+ configuration.queue.push(parseDestination(node, ['Queue', 'QueueArn']));
522
+ }
523
+ for (const node of childrenNamed(root, 'TopicConfiguration')) {
524
+ configuration.topic.push(parseDestination(node, ['Topic', 'TopicArn']));
525
+ }
526
+ return configuration;
527
+ }
528
+ function parseDestination(node, arnElementNames) {
529
+ let arn = '';
530
+ for (const name of arnElementNames) {
531
+ const value = childText(node, name);
532
+ if (value) {
533
+ arn = value;
534
+ break;
535
+ }
536
+ }
537
+ return {
538
+ id: childText(node, 'Id') ?? randomUUID(),
539
+ arn,
540
+ events: childrenNamed(node, 'Event').map(event => event.text),
541
+ filterRules: parseFilterRules(node),
542
+ };
543
+ }
544
+ function parseFilterRules(node) {
545
+ const filter = node.children.find(child => child.name === 'Filter');
546
+ const s3Key = filter?.children.find(child => child.name === 'S3Key');
547
+ if (!s3Key)
548
+ return [];
549
+ const rules = [];
550
+ for (const rule of childrenNamed(s3Key, 'FilterRule')) {
551
+ const name = (childText(rule, 'Name') ?? '').toLowerCase();
552
+ if (name !== 'prefix' && name !== 'suffix')
553
+ continue;
554
+ rules.push({ name, value: childText(rule, 'Value') ?? '' });
555
+ }
556
+ return rules;
557
+ }
558
+ function serializeNotificationConfiguration(configuration) {
559
+ const parts = [];
560
+ for (const entry of configuration?.lambda ?? []) {
561
+ parts.push(serializeDestination('CloudFunctionConfiguration', 'CloudFunction', {
562
+ id: entry.id,
563
+ arn: entry.lambdaFunctionArn,
564
+ events: entry.events,
565
+ filterRules: entry.filterRules,
566
+ }));
567
+ }
568
+ for (const entry of configuration?.queue ?? []) {
569
+ parts.push(serializeDestination('QueueConfiguration', 'Queue', entry));
570
+ }
571
+ for (const entry of configuration?.topic ?? []) {
572
+ parts.push(serializeDestination('TopicConfiguration', 'Topic', entry));
573
+ }
574
+ return tag('NotificationConfiguration', parts.join(''), { attrs: { xmlns: S3_XMLNS }, escape: false });
575
+ }
576
+ function serializeDestination(elementName, arnElementName, entry) {
577
+ const content = tag('Id', entry.id) +
578
+ tag(arnElementName, entry.arn) +
579
+ entry.events.map(event => tag('Event', event)).join('') +
580
+ serializeFilterRules(entry.filterRules);
581
+ return tag(elementName, content, { escape: false });
582
+ }
583
+ function serializeFilterRules(rules) {
584
+ if (rules.length === 0)
585
+ return '';
586
+ const ruleXml = rules
587
+ .map(rule => tag('FilterRule', tag('Name', rule.name) + tag('Value', rule.value), { escape: false }))
588
+ .join('');
589
+ return tag('Filter', tag('S3Key', ruleXml, { escape: false }), { escape: false });
590
+ }
591
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/server/engine/emulators/s3/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { AwsRequest, EngineContext, EngineServiceName, QueryEmulator } from '../../types.js';
2
+ export interface SnsTopicRecord {
3
+ name: string;
4
+ displayName: string;
5
+ }
6
+ export declare class SnsEmulator implements QueryEmulator {
7
+ readonly service: EngineServiceName;
8
+ private ctx;
9
+ private publishCounts;
10
+ constructor(ctx: EngineContext);
11
+ handle(action: string, params: Record<string, string>, req: AwsRequest): Promise<string>;
12
+ publishCount(topicArn: string): number;
13
+ private createTopic;
14
+ private listTopics;
15
+ private deleteTopic;
16
+ private getTopicAttributes;
17
+ private publish;
18
+ private topics;
19
+ private requireTopic;
20
+ private topicArn;
21
+ }
22
+ //# sourceMappingURL=index.d.ts.map