@kensio/yulin 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +76 -1
- package/dist/serve/controller/sim-aws-service-controller-container.d.ts +17 -0
- package/dist/serve/controller/sim-aws-service-controller-container.d.ts.map +1 -0
- package/dist/serve/controller/sim-aws-service-controller-container.js +29 -0
- package/dist/serve/controller/sim-aws-service-controller-container.js.map +1 -0
- package/dist/serve/controller/sim-service-controller.d.ts +22 -0
- package/dist/serve/controller/sim-service-controller.d.ts.map +1 -0
- package/dist/serve/controller/sim-service-controller.js +2 -0
- package/dist/serve/controller/sim-service-controller.js.map +1 -0
- package/dist/serve/http/sim-aws-http.d.ts +20 -0
- package/dist/serve/http/sim-aws-http.d.ts.map +1 -0
- package/dist/serve/http/sim-aws-http.js +57 -0
- package/dist/serve/http/sim-aws-http.js.map +1 -0
- package/dist/serve/http/sim-aws-local-server.d.ts +37 -0
- package/dist/serve/http/sim-aws-local-server.d.ts.map +1 -0
- package/dist/serve/http/sim-aws-local-server.js +132 -0
- package/dist/serve/http/sim-aws-local-server.js.map +1 -0
- package/dist/serve/http/sim-aws-local.conf.d.ts +8 -0
- package/dist/serve/http/sim-aws-local.conf.d.ts.map +1 -0
- package/dist/serve/http/sim-aws-local.conf.js +8 -0
- package/dist/serve/http/sim-aws-local.conf.js.map +1 -0
- package/dist/serve/index.d.ts +3 -0
- package/dist/serve/index.d.ts.map +1 -0
- package/dist/serve/index.js +3 -0
- package/dist/serve/index.js.map +1 -0
- package/dist/serve/resolve/sim-aws-local-service-resolver.d.ts +13 -0
- package/dist/serve/resolve/sim-aws-local-service-resolver.d.ts.map +1 -0
- package/dist/serve/resolve/sim-aws-local-service-resolver.js +38 -0
- package/dist/serve/resolve/sim-aws-local-service-resolver.js.map +1 -0
- package/dist/service/aws/arn.d.ts +17 -0
- package/dist/service/aws/arn.d.ts.map +1 -0
- package/dist/service/aws/arn.js +21 -0
- package/dist/service/aws/arn.js.map +1 -0
- package/dist/service/aws/sim-aws-account-region-scope.d.ts +38 -0
- package/dist/service/aws/sim-aws-account-region-scope.d.ts.map +1 -0
- package/dist/service/aws/sim-aws-account-region-scope.js +52 -0
- package/dist/service/aws/sim-aws-account-region-scope.js.map +1 -0
- package/dist/service/aws/sim-aws-account.d.ts +33 -0
- package/dist/service/aws/sim-aws-account.d.ts.map +1 -0
- package/dist/service/aws/sim-aws-account.js +38 -0
- package/dist/service/aws/sim-aws-account.js.map +1 -0
- package/dist/service/aws/sim-aws-region.d.ts +33 -0
- package/dist/service/aws/sim-aws-region.d.ts.map +1 -0
- package/dist/service/aws/sim-aws-region.js +74 -0
- package/dist/service/aws/sim-aws-region.js.map +1 -0
- package/dist/service/aws/sim-aws-services.d.ts +21 -0
- package/dist/service/aws/sim-aws-services.d.ts.map +1 -0
- package/dist/service/aws/sim-aws-services.js +2 -0
- package/dist/service/aws/sim-aws-services.js.map +1 -0
- package/dist/service/aws/sim-aws.d.ts +50 -0
- package/dist/service/aws/sim-aws.d.ts.map +1 -0
- package/dist/service/aws/sim-aws.js +82 -0
- package/dist/service/aws/sim-aws.js.map +1 -0
- package/dist/service/dynamodb/command/create-table/create-table.handler.d.ts +3 -1
- package/dist/service/dynamodb/command/create-table/create-table.handler.d.ts.map +1 -1
- package/dist/service/dynamodb/command/create-table/create-table.handler.js +7 -3
- package/dist/service/dynamodb/command/create-table/create-table.handler.js.map +1 -1
- package/dist/service/dynamodb/index.d.ts +1 -1
- package/dist/service/dynamodb/index.d.ts.map +1 -1
- package/dist/service/dynamodb/index.js +1 -1
- package/dist/service/dynamodb/index.js.map +1 -1
- package/dist/service/dynamodb/sim-dynamodb.d.ts +29 -0
- package/dist/service/dynamodb/sim-dynamodb.d.ts.map +1 -0
- package/dist/service/dynamodb/sim-dynamodb.js +47 -0
- package/dist/service/dynamodb/sim-dynamodb.js.map +1 -0
- package/dist/service/dynamodb/table/dynamodb-table.d.ts +7 -1
- package/dist/service/dynamodb/table/dynamodb-table.d.ts.map +1 -1
- package/dist/service/dynamodb/table/dynamodb-table.js +14 -1
- package/dist/service/dynamodb/table/dynamodb-table.js.map +1 -1
- package/dist/service/s3/bucket/s3-bucket.d.ts +7 -3
- package/dist/service/s3/bucket/s3-bucket.d.ts.map +1 -1
- package/dist/service/s3/bucket/s3-bucket.js +10 -10
- package/dist/service/s3/bucket/s3-bucket.js.map +1 -1
- package/dist/service/s3/command/create-bucket/create-bucket.handler.d.ts +5 -1
- package/dist/service/s3/command/create-bucket/create-bucket.handler.d.ts.map +1 -1
- package/dist/service/s3/command/create-bucket/create-bucket.handler.js +26 -5
- package/dist/service/s3/command/create-bucket/create-bucket.handler.js.map +1 -1
- package/dist/service/s3/command/get-object/get-object.handler.d.ts +2 -2
- package/dist/service/s3/command/get-object/get-object.handler.d.ts.map +1 -1
- package/dist/service/s3/command/get-object/get-object.handler.js.map +1 -1
- package/dist/service/s3/command/list-buckets/list-buckets.handler.d.ts +2 -2
- package/dist/service/s3/command/list-buckets/list-buckets.handler.d.ts.map +1 -1
- package/dist/service/s3/command/list-buckets/list-buckets.handler.js.map +1 -1
- package/dist/service/s3/command/list-objects/list-objects.handler.d.ts +2 -2
- package/dist/service/s3/command/list-objects/list-objects.handler.d.ts.map +1 -1
- package/dist/service/s3/command/list-objects/list-objects.handler.js.map +1 -1
- package/dist/service/s3/command/put-object/put-object.handler.d.ts +3 -2
- package/dist/service/s3/command/put-object/put-object.handler.d.ts.map +1 -1
- package/dist/service/s3/command/put-object/put-object.handler.js +9 -1
- package/dist/service/s3/command/put-object/put-object.handler.js.map +1 -1
- package/dist/service/s3/index.d.ts +1 -1
- package/dist/service/s3/index.d.ts.map +1 -1
- package/dist/service/s3/index.js +1 -1
- package/dist/service/s3/index.js.map +1 -1
- package/dist/service/s3/serve/sim-s3-controller.d.ts +15 -0
- package/dist/service/s3/serve/sim-s3-controller.d.ts.map +1 -0
- package/dist/service/s3/serve/sim-s3-controller.js +29 -0
- package/dist/service/s3/serve/sim-s3-controller.js.map +1 -0
- package/dist/service/s3/serve/sim-s3-get-obj-controller.d.ts +11 -0
- package/dist/service/s3/serve/sim-s3-get-obj-controller.d.ts.map +1 -0
- package/dist/service/s3/serve/sim-s3-get-obj-controller.js +35 -0
- package/dist/service/s3/serve/sim-s3-get-obj-controller.js.map +1 -0
- package/dist/service/s3/serve/sim-s3-req-router.d.ts +26 -0
- package/dist/service/s3/serve/sim-s3-req-router.d.ts.map +1 -0
- package/dist/service/s3/serve/sim-s3-req-router.js +79 -0
- package/dist/service/s3/serve/sim-s3-req-router.js.map +1 -0
- package/dist/service/s3/sim-s3-global-registry.d.ts +20 -0
- package/dist/service/s3/sim-s3-global-registry.d.ts.map +1 -0
- package/dist/service/s3/sim-s3-global-registry.js +22 -0
- package/dist/service/s3/sim-s3-global-registry.js.map +1 -0
- package/dist/service/s3/sim-s3.d.ts +38 -0
- package/dist/service/s3/sim-s3.d.ts.map +1 -0
- package/dist/service/s3/sim-s3.js +61 -0
- package/dist/service/s3/sim-s3.js.map +1 -0
- package/dist/service/s3/storage/s3-bucket-storage.d.ts +2 -16
- package/dist/service/s3/storage/s3-bucket-storage.d.ts.map +1 -1
- package/dist/service/s3/storage/s3-bucket-storage.js +1 -63
- package/dist/service/s3/storage/s3-bucket-storage.js.map +1 -1
- package/dist/service/s3/storage/s3-filesystem-storage.d.ts +59 -0
- package/dist/service/s3/storage/s3-filesystem-storage.d.ts.map +1 -0
- package/dist/service/s3/storage/s3-filesystem-storage.js +266 -0
- package/dist/service/s3/storage/s3-filesystem-storage.js.map +1 -0
- package/dist/service/s3/storage/s3-memory-storage.d.ts +27 -0
- package/dist/service/s3/storage/s3-memory-storage.d.ts.map +1 -0
- package/dist/service/s3/storage/s3-memory-storage.js +37 -0
- package/dist/service/s3/storage/s3-memory-storage.js.map +1 -0
- package/package.json +20 -8
package/README.md
CHANGED
|
@@ -10,7 +10,82 @@ npm i -D @kensio/yulin
|
|
|
10
10
|
|
|
11
11
|
## Usage
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
### Direct interaction with simulated AWS
|
|
14
|
+
|
|
15
|
+
Create and interact directly with a simulated AWS:
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
import { SimAws } from "@kensio/yulin";
|
|
19
|
+
import { CreateTableCommand } from "@aws-sdk/client-dynamodb";
|
|
20
|
+
|
|
21
|
+
const simAws = new SimAws();
|
|
22
|
+
|
|
23
|
+
// Default Account and Region.
|
|
24
|
+
await simAws.dynamoDb().createTable(
|
|
25
|
+
new CreateTableCommand({
|
|
26
|
+
TableName: "FoobarTable",
|
|
27
|
+
KeySchema: [{ AttributeName: "id", KeyType: "HASH" }],
|
|
28
|
+
}),
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
// Specify Account.
|
|
32
|
+
await simAws.account("111111111111").dynamoDb().createTable({ ... });
|
|
33
|
+
|
|
34
|
+
// Specify Region.
|
|
35
|
+
await simAws.region("eu-west-2").dynamoDb().createTable({ ... });
|
|
36
|
+
|
|
37
|
+
// Specify Account and Region.
|
|
38
|
+
await simAws.account("111111111111").region("eu-west-2").dynamoDb().createTable({ ... });
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
AWS state is simulated internally, so you can test realistic interactions with multiple AWS
|
|
42
|
+
services.
|
|
43
|
+
|
|
44
|
+
Each instance of `SimAws` is cheap and encapsulated so you can create them wherever you need them.
|
|
45
|
+
It's fine to create a new instance of `SimAws` in every test case or in shared test setup.
|
|
46
|
+
|
|
47
|
+
If you prefer, you can also instantiate simulated services individually:
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
import { SimS3 } from "@kensio/yulin/s3";
|
|
51
|
+
import { CreateBucketCommand } from "@aws-sdk/client-s3";
|
|
52
|
+
|
|
53
|
+
const simS3 = new SimS3();
|
|
54
|
+
|
|
55
|
+
await simS3.createBucket(new CreateBucketCommand({ Bucket: "foo-bucket" }));
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
That simulated service then has its own isolated state.
|
|
59
|
+
|
|
60
|
+
### Serve simulated AWS on localhost
|
|
61
|
+
|
|
62
|
+
You can listen on a port to serve your simulated AWS on localhost:
|
|
63
|
+
|
|
64
|
+
```typescript
|
|
65
|
+
import { SimAws } from "@kensio/yulin";
|
|
66
|
+
import { serveSimAws } from "@kensio/yulin/serve";
|
|
67
|
+
|
|
68
|
+
const simAws = new SimAws();
|
|
69
|
+
const srv = await serveSimAws(simAws); // Chooses available port on localhost.
|
|
70
|
+
|
|
71
|
+
const simS3 = srv.simAws.region("eu-west-2").s3();
|
|
72
|
+
await simS3.createBucket(new CreateBucketCommand({ Bucket: "foo-site" }));
|
|
73
|
+
await simS3.putObject(
|
|
74
|
+
new PutObjectCommand({
|
|
75
|
+
Bucket: "foo-site",
|
|
76
|
+
Key: "index.html",
|
|
77
|
+
Body: "<h1>Hello, world!</h1>",
|
|
78
|
+
Metadata: {
|
|
79
|
+
"content-type": "text/html; charset=utf-8",
|
|
80
|
+
},
|
|
81
|
+
}),
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
// Fetch from the simulated S3 bucket via port on localhost.
|
|
85
|
+
const res = await fetch(
|
|
86
|
+
`http://foo-site.s3-website.eu-west-2.sim-aws.localhost:${srv.port}/index.html`,
|
|
87
|
+
);
|
|
88
|
+
```
|
|
14
89
|
|
|
15
90
|
## What is yulin?
|
|
16
91
|
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { SimAws } from "../../service/aws/sim-aws.js";
|
|
2
|
+
import type { SimAwsServiceName } from "../../service/aws/sim-aws-services.js";
|
|
3
|
+
import type { SimAwsServiceController } from "./sim-service-controller.js";
|
|
4
|
+
/**
|
|
5
|
+
* Registry for simulated AWS localhost service controllers.
|
|
6
|
+
*/
|
|
7
|
+
export declare class SimAwsServiceControllerContainer {
|
|
8
|
+
private readonly simAws;
|
|
9
|
+
private readonly controllers;
|
|
10
|
+
private readonly controllerFactories;
|
|
11
|
+
constructor(simAws: SimAws);
|
|
12
|
+
/**
|
|
13
|
+
* Get the singleton controller for a simulated AWS service.
|
|
14
|
+
*/
|
|
15
|
+
controllerForService(service: SimAwsServiceName): SimAwsServiceController;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=sim-aws-service-controller-container.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sim-aws-service-controller-container.d.ts","sourceRoot":"","sources":["../../../src/serve/controller/sim-aws-service-controller-container.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAG/E,OAAO,KAAK,EACV,uBAAuB,EAExB,MAAM,6BAA6B,CAAC;AAErC;;GAEG;AACH,qBAAa,gCAAgC;IAc/B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAbnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuC;IAEnE,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CASjC;gBAE0B,MAAM,EAAE,MAAM;IAE3C;;OAEG;IACH,oBAAoB,CAAC,OAAO,EAAE,iBAAiB,GAAG,uBAAuB;CAW1E"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { SimS3ServiceController } from "../../service/s3/serve/sim-s3-controller.js";
|
|
2
|
+
import { Memo } from "../../util/memo/memo.js";
|
|
3
|
+
/**
|
|
4
|
+
* Registry for simulated AWS localhost service controllers.
|
|
5
|
+
*/
|
|
6
|
+
export class SimAwsServiceControllerContainer {
|
|
7
|
+
simAws;
|
|
8
|
+
controllers = new Memo();
|
|
9
|
+
controllerFactories = new Map([
|
|
10
|
+
[
|
|
11
|
+
"s3",
|
|
12
|
+
(simAws) => new SimS3ServiceController(simAws),
|
|
13
|
+
],
|
|
14
|
+
]);
|
|
15
|
+
constructor(simAws) {
|
|
16
|
+
this.simAws = simAws;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Get the singleton controller for a simulated AWS service.
|
|
20
|
+
*/
|
|
21
|
+
controllerForService(service) {
|
|
22
|
+
const factory = this.controllerFactories.get(service);
|
|
23
|
+
if (factory === undefined) {
|
|
24
|
+
throw new Error(`No controller implemented for simulated AWS service ${service}`);
|
|
25
|
+
}
|
|
26
|
+
return this.controllers.getOrCreate(service, () => factory(this.simAws));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=sim-aws-service-controller-container.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sim-aws-service-controller-container.js","sourceRoot":"","sources":["../../../src/serve/controller/sim-aws-service-controller-container.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AACrF,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAM/C;;GAEG;AACH,MAAM,OAAO,gCAAgC;IAcd;IAbZ,WAAW,GAAG,IAAI,IAAI,EAA2B,CAAC;IAElD,mBAAmB,GAAG,IAAI,GAAG,CAG5C;QACA;YACE,IAAI;YACJ,CAAC,MAAc,EAA0B,EAAE,CACzC,IAAI,sBAAsB,CAAC,MAAM,CAAC;SACrC;KACF,CAAC,CAAC;IAEH,YAA6B,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;IAAG,CAAC;IAE/C;;OAEG;IACH,oBAAoB,CAAC,OAA0B;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAEtD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,uDAAuD,OAAO,EAAE,CACjE,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3E,CAAC;CACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { SimAwsServiceName } from "../../service/aws/sim-aws-services.js";
|
|
2
|
+
import type { AwsRegionName } from "../../service/aws/sim-aws-region.js";
|
|
3
|
+
import type { SimAws } from "../../service/aws/sim-aws.js";
|
|
4
|
+
export interface SimAwsServiceTarget {
|
|
5
|
+
readonly service: SimAwsServiceName;
|
|
6
|
+
readonly resourceName: string;
|
|
7
|
+
readonly regionName?: AwsRegionName;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Factory function for making instances of simulated AWS service controllers.
|
|
11
|
+
*/
|
|
12
|
+
export type SimAwsServiceControllerFactory = (simAws: SimAws) => SimAwsServiceController;
|
|
13
|
+
/**
|
|
14
|
+
* Controller for a simulated AWS service exposed through HTTP.
|
|
15
|
+
*/
|
|
16
|
+
export interface SimAwsServiceController {
|
|
17
|
+
/**
|
|
18
|
+
* Handle an HTTP request routed to this simulated AWS service.
|
|
19
|
+
*/
|
|
20
|
+
handleRequest(target: SimAwsServiceTarget, request: Request): Promise<Response>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=sim-service-controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sim-service-controller.d.ts","sourceRoot":"","sources":["../../../src/serve/controller/sim-service-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAE3D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,MAAM,8BAA8B,GAAG,CAC3C,MAAM,EAAE,MAAM,KACX,uBAAuB,CAAC;AAE7B;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,aAAa,CACX,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,QAAQ,CAAC,CAAC;CACtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sim-service-controller.js","sourceRoot":"","sources":["../../../src/serve/controller/sim-service-controller.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { SimAws } from "../../service/aws/sim-aws.js";
|
|
2
|
+
/**
|
|
3
|
+
* HTTP interface for sending requests into a simulated AWS environment.
|
|
4
|
+
*/
|
|
5
|
+
export declare class SimAwsHttp {
|
|
6
|
+
readonly simAws: SimAws;
|
|
7
|
+
private readonly serviceResolver;
|
|
8
|
+
private readonly controllers;
|
|
9
|
+
constructor(simAws?: SimAws);
|
|
10
|
+
/**
|
|
11
|
+
* Send a Fetch API request to simulated AWS.
|
|
12
|
+
*/
|
|
13
|
+
fetch(input: string | URL | Request, init?: RequestInit): Promise<Response>;
|
|
14
|
+
/**
|
|
15
|
+
* Handle a simulated AWS HTTP request.
|
|
16
|
+
*/
|
|
17
|
+
handleRequest(request: Request): Promise<Response>;
|
|
18
|
+
private hostnameFromRequest;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=sim-aws-http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sim-aws-http.d.ts","sourceRoot":"","sources":["../../../src/serve/http/sim-aws-http.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAEtD;;GAEG;AACH,qBAAa,UAAU;aAIO,MAAM,EAAE,MAAM;IAH1C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoC;IACpE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAmC;gBAEnC,MAAM,GAAE,MAAqB;IAIzD;;OAEG;IACG,KAAK,CACT,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,EAC7B,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,QAAQ,CAAC;IAIpB;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;IA8BxD,OAAO,CAAC,mBAAmB;CAS5B"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { SimAwsLocalServiceResolver } from "../resolve/sim-aws-local-service-resolver.js";
|
|
2
|
+
import { SimAwsServiceControllerContainer } from "../controller/sim-aws-service-controller-container.js";
|
|
3
|
+
import { SimAws } from "../../service/aws/sim-aws.js";
|
|
4
|
+
/**
|
|
5
|
+
* HTTP interface for sending requests into a simulated AWS environment.
|
|
6
|
+
*/
|
|
7
|
+
export class SimAwsHttp {
|
|
8
|
+
simAws;
|
|
9
|
+
serviceResolver = new SimAwsLocalServiceResolver();
|
|
10
|
+
controllers;
|
|
11
|
+
constructor(simAws = new SimAws()) {
|
|
12
|
+
this.simAws = simAws;
|
|
13
|
+
this.controllers = new SimAwsServiceControllerContainer(simAws);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Send a Fetch API request to simulated AWS.
|
|
17
|
+
*/
|
|
18
|
+
async fetch(input, init) {
|
|
19
|
+
return this.handleRequest(new Request(input, init));
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Handle a simulated AWS HTTP request.
|
|
23
|
+
*/
|
|
24
|
+
async handleRequest(request) {
|
|
25
|
+
try {
|
|
26
|
+
const hostname = this.hostnameFromRequest(request);
|
|
27
|
+
if (hostname === undefined) {
|
|
28
|
+
return new Response("Missing Host header\n", { status: 400 });
|
|
29
|
+
}
|
|
30
|
+
const target = this.serviceResolver.resolveHost(hostname);
|
|
31
|
+
if (target === undefined) {
|
|
32
|
+
return new Response(`Unknown simulated AWS host ${hostname} \n`, {
|
|
33
|
+
status: 501,
|
|
34
|
+
headers: {
|
|
35
|
+
"content-type": "text/plain; charset=utf-8",
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
const controller = this.controllers.controllerForService(target.service);
|
|
40
|
+
return await controller.handleRequest(target, request);
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
/* v8 ignore next */
|
|
44
|
+
return new Response(error instanceof Error
|
|
45
|
+
? `${error.message}\n`
|
|
46
|
+
: "Internal server error\n", { status: 500 });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
hostnameFromRequest(request) {
|
|
50
|
+
const hostname = new URL(request.url).hostname.toLowerCase();
|
|
51
|
+
if (hostname.length === 0) {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
return hostname;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=sim-aws-http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sim-aws-http.js","sourceRoot":"","sources":["../../../src/serve/http/sim-aws-http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,8CAA8C,CAAC;AAC1F,OAAO,EAAE,gCAAgC,EAAE,MAAM,uDAAuD,CAAC;AACzG,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAEtD;;GAEG;AACH,MAAM,OAAO,UAAU;IAIO;IAHX,eAAe,GAAG,IAAI,0BAA0B,EAAE,CAAC;IACnD,WAAW,CAAmC;IAE/D,YAA4B,SAAiB,IAAI,MAAM,EAAE;QAA7B,WAAM,GAAN,MAAM,CAAuB;QACvD,IAAI,CAAC,WAAW,GAAG,IAAI,gCAAgC,CAAC,MAAM,CAAC,CAAC;IAClE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CACT,KAA6B,EAC7B,IAAkB;QAElB,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IACtD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,OAAgB;QAClC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACnD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,OAAO,IAAI,QAAQ,CAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YAChE,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YAC1D,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,OAAO,IAAI,QAAQ,CAAC,8BAA8B,QAAQ,KAAK,EAAE;oBAC/D,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE;wBACP,cAAc,EAAE,2BAA2B;qBAC5C;iBACF,CAAC,CAAC;YACL,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACzE,OAAO,MAAM,UAAU,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,oBAAoB;YACpB,OAAO,IAAI,QAAQ,CACjB,KAAK,YAAY,KAAK;gBACpB,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,IAAI;gBACtB,CAAC,CAAC,yBAAyB,EAC7B,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,mBAAmB,CAAC,OAAgB;QAC1C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAE7D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { SimAws } from "../../service/aws/sim-aws.js";
|
|
2
|
+
/**
|
|
3
|
+
* Local HTTP server for a simulated AWS environment.
|
|
4
|
+
* Useful for local integration testing and local development.
|
|
5
|
+
*/
|
|
6
|
+
export declare class SimAwsLocalServer {
|
|
7
|
+
readonly simAws: SimAws;
|
|
8
|
+
private readonly simAwsHttp;
|
|
9
|
+
private readonly server;
|
|
10
|
+
constructor(simAws?: SimAws);
|
|
11
|
+
/**
|
|
12
|
+
* Start serving simulated AWS services on localhost.
|
|
13
|
+
*/
|
|
14
|
+
listen(port?: number): Promise<this>;
|
|
15
|
+
/**
|
|
16
|
+
* Get the hostname on which this local server is listening.
|
|
17
|
+
*/
|
|
18
|
+
get hostname(): string;
|
|
19
|
+
/**
|
|
20
|
+
* Get the TCP port on which this local server is listening.
|
|
21
|
+
*/
|
|
22
|
+
get port(): string;
|
|
23
|
+
/**
|
|
24
|
+
* Stop serving simulated AWS services.
|
|
25
|
+
*/
|
|
26
|
+
close(): void;
|
|
27
|
+
private waitForListening;
|
|
28
|
+
private handleRequest;
|
|
29
|
+
private nodeRequestToFetchRequest;
|
|
30
|
+
private nodeRequestHeaders;
|
|
31
|
+
private sendFetchResponse;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Serve a simulated AWS environment on localhost.
|
|
35
|
+
*/
|
|
36
|
+
export declare function serveSimAws(simAws?: SimAws, port?: number): Promise<SimAwsLocalServer>;
|
|
37
|
+
//# sourceMappingURL=sim-aws-local-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sim-aws-local-server.d.ts","sourceRoot":"","sources":["../../../src/serve/http/sim-aws-local-server.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAKtD;;;GAGG;AACH,qBAAa,iBAAiB;aAIA,MAAM,EAAE,MAAM;IAH1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEJ,MAAM,GAAE,MAAqB;IAOzD;;OAEG;IACG,MAAM,CAAC,IAAI,GAAE,MAAoC,GAAG,OAAO,CAAC,IAAI,CAAC;IAMvE;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAYjB;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;YAIC,gBAAgB;YA4BhB,aAAa;IAU3B,OAAO,CAAC,yBAAyB;IAmBjC,OAAO,CAAC,kBAAkB;YAsBZ,iBAAiB;CAiBhC;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,MAAM,GAAE,MAAqB,EAC7B,IAAI,GAAE,MAAoC,GACzC,OAAO,CAAC,iBAAiB,CAAC,CAG5B"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import http, {} from "node:http";
|
|
2
|
+
import { SimAws } from "../../service/aws/sim-aws.js";
|
|
3
|
+
import { simAwsLocalConf } from "./sim-aws-local.conf.js";
|
|
4
|
+
import { SimAwsHttp } from "./sim-aws-http.js";
|
|
5
|
+
import { assertDefined } from "../../util/defined.js";
|
|
6
|
+
/**
|
|
7
|
+
* Local HTTP server for a simulated AWS environment.
|
|
8
|
+
* Useful for local integration testing and local development.
|
|
9
|
+
*/
|
|
10
|
+
export class SimAwsLocalServer {
|
|
11
|
+
simAws;
|
|
12
|
+
simAwsHttp;
|
|
13
|
+
server;
|
|
14
|
+
constructor(simAws = new SimAws()) {
|
|
15
|
+
this.simAws = simAws;
|
|
16
|
+
this.simAwsHttp = new SimAwsHttp(simAws);
|
|
17
|
+
this.server = http.createServer((request, response) => {
|
|
18
|
+
void this.handleRequest(request, response);
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Start serving simulated AWS services on localhost.
|
|
23
|
+
*/
|
|
24
|
+
async listen(port = simAwsLocalConf.defaultPort) {
|
|
25
|
+
this.server.listen(port, this.hostname);
|
|
26
|
+
await this.waitForListening();
|
|
27
|
+
return this;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get the hostname on which this local server is listening.
|
|
31
|
+
*/
|
|
32
|
+
get hostname() {
|
|
33
|
+
return simAwsLocalConf.hostname;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get the TCP port on which this local server is listening.
|
|
37
|
+
*/
|
|
38
|
+
get port() {
|
|
39
|
+
if (!this.server.listening) {
|
|
40
|
+
throw new Error("Server is not yet listening, cannot get port number");
|
|
41
|
+
}
|
|
42
|
+
const address = this.server.address();
|
|
43
|
+
/* v8 ignore if -- does not happen in practice */
|
|
44
|
+
if (address === null || typeof address === "string") {
|
|
45
|
+
throw new Error("Expected local HTTP server to listen on a TCP port");
|
|
46
|
+
}
|
|
47
|
+
return String(address.port);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Stop serving simulated AWS services.
|
|
51
|
+
*/
|
|
52
|
+
close() {
|
|
53
|
+
this.server.close();
|
|
54
|
+
}
|
|
55
|
+
async waitForListening() {
|
|
56
|
+
/* v8 ignore if -- cannot happen in practice */
|
|
57
|
+
if (this.server.listening) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
await new Promise((resolve, reject) => {
|
|
61
|
+
const listening = () => {
|
|
62
|
+
cleanup();
|
|
63
|
+
resolve();
|
|
64
|
+
};
|
|
65
|
+
/* v8 ignore next */
|
|
66
|
+
const error = (cause) => {
|
|
67
|
+
cleanup();
|
|
68
|
+
reject(cause);
|
|
69
|
+
};
|
|
70
|
+
const cleanup = () => {
|
|
71
|
+
this.server.off("listening", listening);
|
|
72
|
+
this.server.off("error", error);
|
|
73
|
+
};
|
|
74
|
+
this.server.once("listening", listening);
|
|
75
|
+
this.server.once("error", error);
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
async handleRequest(nodeRequest, nodeResponse) {
|
|
79
|
+
const request = this.nodeRequestToFetchRequest(nodeRequest);
|
|
80
|
+
const response = await this.simAwsHttp.handleRequest(request);
|
|
81
|
+
await this.sendFetchResponse(nodeResponse, response);
|
|
82
|
+
}
|
|
83
|
+
nodeRequestToFetchRequest(nodeRequest) {
|
|
84
|
+
const host = nodeRequest.headers.host;
|
|
85
|
+
assertDefined(host, "local sim server nodeRequest.headers.host");
|
|
86
|
+
const url = new URL(nodeRequest.url ?? "/", `http://${host}`);
|
|
87
|
+
return new Request(url, {
|
|
88
|
+
method: nodeRequest.method,
|
|
89
|
+
headers: this.nodeRequestHeaders(nodeRequest),
|
|
90
|
+
body: nodeRequest.method === "GET" || nodeRequest.method === "HEAD"
|
|
91
|
+
? undefined
|
|
92
|
+
: nodeRequest,
|
|
93
|
+
duplex: nodeRequest.method === "GET" || nodeRequest.method === "HEAD"
|
|
94
|
+
? undefined
|
|
95
|
+
: "half",
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
nodeRequestHeaders(nodeRequest) {
|
|
99
|
+
const headers = new Headers();
|
|
100
|
+
for (const [name, value] of Object.entries(nodeRequest.headers)) {
|
|
101
|
+
/* v8 ignore if -- does not happen in practice */
|
|
102
|
+
if (value === undefined) {
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
if (Array.isArray(value)) {
|
|
106
|
+
for (const item of value) {
|
|
107
|
+
headers.append(name, item);
|
|
108
|
+
}
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
headers.set(name, value);
|
|
112
|
+
}
|
|
113
|
+
return headers;
|
|
114
|
+
}
|
|
115
|
+
async sendFetchResponse(nodeResponse, response) {
|
|
116
|
+
nodeResponse.writeHead(response.status, Object.fromEntries(response.headers.entries()));
|
|
117
|
+
if (response.body === null) {
|
|
118
|
+
nodeResponse.end();
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
const body = Buffer.from(await response.arrayBuffer());
|
|
122
|
+
nodeResponse.end(body);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Serve a simulated AWS environment on localhost.
|
|
127
|
+
*/
|
|
128
|
+
export async function serveSimAws(simAws = new SimAws(), port = simAwsLocalConf.defaultPort) {
|
|
129
|
+
const server = new SimAwsLocalServer(simAws);
|
|
130
|
+
return server.listen(port);
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=sim-aws-local-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sim-aws-local-server.js","sourceRoot":"","sources":["../../../src/serve/http/sim-aws-local-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sim-aws-local.conf.d.ts","sourceRoot":"","sources":["../../../src/serve/http/sim-aws-local.conf.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,eAAe;;;CAG3B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sim-aws-local.conf.js","sourceRoot":"","sources":["../../../src/serve/http/sim-aws-local.conf.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,QAAQ,EAAE,mBAAmB;IAC7B,WAAW,EAAE,CAAC;CACf,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/serve/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/serve/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SimAwsServiceTarget } from "../controller/sim-service-controller.js";
|
|
2
|
+
export declare const localhostSuffix: string;
|
|
3
|
+
/**
|
|
4
|
+
* Default resolver for localhost subdomains to simulated AWS services.
|
|
5
|
+
*/
|
|
6
|
+
export declare class SimAwsLocalServiceResolver {
|
|
7
|
+
/**
|
|
8
|
+
* Resolve a localhost subdomain hostname to a simulated AWS service target.
|
|
9
|
+
*/
|
|
10
|
+
resolveHost(hostname: string): SimAwsServiceTarget | undefined;
|
|
11
|
+
private builtinLocalhostServiceTarget;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=sim-aws-local-service-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sim-aws-local-service-resolver.d.ts","sourceRoot":"","sources":["../../../src/serve/resolve/sim-aws-local-service-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AAInF,eAAO,MAAM,eAAe,QAAiC,CAAC;AAG9D;;GAEG;AACH,qBAAa,0BAA0B;IACrC;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS;IAI9D,OAAO,CAAC,6BAA6B;CAgCtC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { simAwsLocalConf } from "../http/sim-aws-local.conf.js";
|
|
2
|
+
export const localhostSuffix = `.${simAwsLocalConf.hostname}`;
|
|
3
|
+
const s3WebsiteServiceLabel = "s3-website";
|
|
4
|
+
/**
|
|
5
|
+
* Default resolver for localhost subdomains to simulated AWS services.
|
|
6
|
+
*/
|
|
7
|
+
export class SimAwsLocalServiceResolver {
|
|
8
|
+
/**
|
|
9
|
+
* Resolve a localhost subdomain hostname to a simulated AWS service target.
|
|
10
|
+
*/
|
|
11
|
+
resolveHost(hostname) {
|
|
12
|
+
return this.builtinLocalhostServiceTarget(hostname);
|
|
13
|
+
}
|
|
14
|
+
builtinLocalhostServiceTarget(hostname) {
|
|
15
|
+
if (!hostname.endsWith(localhostSuffix)) {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
const labels = hostname.slice(0, -localhostSuffix.length).split(".");
|
|
19
|
+
if (labels.length < 3) {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
const service = labels.at(-2);
|
|
23
|
+
const regionName = labels.at(-1);
|
|
24
|
+
if (service === s3WebsiteServiceLabel && regionName !== undefined) {
|
|
25
|
+
const resourceName = labels.slice(0, -2).join(".");
|
|
26
|
+
if (resourceName.length === 0 || regionName.length === 0) {
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
service: "s3",
|
|
31
|
+
resourceName,
|
|
32
|
+
regionName,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=sim-aws-local-service-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sim-aws-local-service-resolver.js","sourceRoot":"","sources":["../../../src/serve/resolve/sim-aws-local-service-resolver.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC,QAAQ,EAAE,CAAC;AAC9D,MAAM,qBAAqB,GAAG,YAAY,CAAC;AAE3C;;GAEG;AACH,MAAM,OAAO,0BAA0B;IACrC;;OAEG;IACH,WAAW,CAAC,QAAgB;QAC1B,OAAO,IAAI,CAAC,6BAA6B,CAAC,QAAQ,CAAC,CAAC;IACtD,CAAC;IAEO,6BAA6B,CACnC,QAAgB;QAEhB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YACxC,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAErE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAA8B,CAAC;QAE9D,IAAI,OAAO,KAAK,qBAAqB,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAClE,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAEnD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzD,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,YAAY;gBACZ,UAAU;aACX,CAAC;QACJ,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type AwsRegionName } from "./sim-aws-region.js";
|
|
2
|
+
import { type SimAwsAccountId } from "./sim-aws-account.js";
|
|
3
|
+
import { type SimAwsServiceName } from "./sim-aws-services.js";
|
|
4
|
+
export type SimArn = `arn:aws:${SimAwsServiceName}:${AwsRegionName}:${SimAwsAccountId}:${string}/${string}`;
|
|
5
|
+
export interface SimArnComponents {
|
|
6
|
+
partition: "aws";
|
|
7
|
+
service: SimAwsServiceName;
|
|
8
|
+
region: AwsRegionName;
|
|
9
|
+
accountId: SimAwsAccountId;
|
|
10
|
+
resourceType: string;
|
|
11
|
+
resourceId: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Generate a fake ARN.
|
|
15
|
+
*/
|
|
16
|
+
export declare function makeSimArn(overrides?: Partial<SimArnComponents>): SimArn;
|
|
17
|
+
//# sourceMappingURL=arn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arn.d.ts","sourceRoot":"","sources":["../../../src/service/aws/arn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAqB,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,MAAM,MAAM,GAChB,WAAW,iBAAiB,IAAI,aAAa,IAAI,eAAe,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;AAEzF,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,KAAK,CAAC;IACjB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,eAAe,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAWD;;GAEG;AACH,wBAAgB,UAAU,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,MAAM,CAGxE"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { makeAwsRegionName } from "./sim-aws-region.js";
|
|
2
|
+
import { makeSimAwsAccountId, } from "./sim-aws-account.js";
|
|
3
|
+
import { DynamicFactory } from "@kensio/part-factory";
|
|
4
|
+
import { faker } from "@faker-js/faker";
|
|
5
|
+
import { SIM_AWS_SERVICE_NAMES, } from "./sim-aws-services.js";
|
|
6
|
+
const simArnComponentsFactory = new DynamicFactory(() => ({
|
|
7
|
+
partition: "aws",
|
|
8
|
+
service: faker.helpers.arrayElement(SIM_AWS_SERVICE_NAMES),
|
|
9
|
+
region: makeAwsRegionName(),
|
|
10
|
+
accountId: makeSimAwsAccountId(),
|
|
11
|
+
resourceType: "resource",
|
|
12
|
+
resourceId: faker.string.alphanumeric({ length: 10 }),
|
|
13
|
+
}));
|
|
14
|
+
/**
|
|
15
|
+
* Generate a fake ARN.
|
|
16
|
+
*/
|
|
17
|
+
export function makeSimArn(overrides) {
|
|
18
|
+
const components = simArnComponentsFactory.make(overrides);
|
|
19
|
+
return `arn:${components.partition}:${components.service}:${components.region}:${components.accountId}:${components.resourceType}/${components.resourceId}`;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=arn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arn.js","sourceRoot":"","sources":["../../../src/service/aws/arn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EACL,mBAAmB,GAEpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EACL,qBAAqB,GAEtB,MAAM,uBAAuB,CAAC;AAc/B,MAAM,uBAAuB,GAAG,IAAI,cAAc,CAAmB,GAAG,EAAE,CAAC,CAAC;IAC1E,SAAS,EAAE,KAAK;IAChB,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,qBAAqB,CAAC;IAC1D,MAAM,EAAE,iBAAiB,EAAE;IAC3B,SAAS,EAAE,mBAAmB,EAAE;IAChC,YAAY,EAAE,UAAU;IACxB,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;CACtD,CAAC,CAAC,CAAC;AAEJ;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,SAAqC;IAC9D,MAAM,UAAU,GAAG,uBAAuB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3D,OAAO,OAAO,UAAU,CAAC,SAAS,IAAI,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC,MAAM,IAAI,UAAU,CAAC,SAAS,IAAI,UAAU,CAAC,YAAY,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;AAC9J,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type SimAwsAccount, type SimAwsAccountId } from "./sim-aws-account.js";
|
|
2
|
+
import { type AwsRegionName, type SimAwsRegion } from "./sim-aws-region.js";
|
|
3
|
+
import type { SimAwsServices } from "./sim-aws-services.js";
|
|
4
|
+
import { SimDynamoDb } from "../dynamodb/sim-dynamodb.js";
|
|
5
|
+
import { SimS3 } from "../s3/sim-s3.js";
|
|
6
|
+
import { SimAws } from "./sim-aws.js";
|
|
7
|
+
import { DynamicFactory } from "@kensio/part-factory";
|
|
8
|
+
import type { SimS3GlobalRegistry } from "../s3/sim-s3-global-registry.js";
|
|
9
|
+
export type SimAccountRegionScopeKey = `${SimAwsAccountId}:${AwsRegionName}`;
|
|
10
|
+
/**
|
|
11
|
+
* Combined simulated AWS Account and Region scope.
|
|
12
|
+
*/
|
|
13
|
+
export declare class SimAwsAccountRegionContainer implements SimAwsServices {
|
|
14
|
+
private readonly simAws;
|
|
15
|
+
readonly account: SimAwsAccount;
|
|
16
|
+
readonly region: SimAwsRegion;
|
|
17
|
+
private readonly s3GlobalRegistry;
|
|
18
|
+
private readonly memo;
|
|
19
|
+
private readonly accountRegionScope;
|
|
20
|
+
constructor(simAws?: SimAws, account?: SimAwsAccount, region?: SimAwsRegion, s3GlobalRegistry?: SimS3GlobalRegistry);
|
|
21
|
+
/**
|
|
22
|
+
* Get the simulated DynamoDB service for this account and region.
|
|
23
|
+
*/
|
|
24
|
+
dynamoDb(): SimDynamoDb;
|
|
25
|
+
/**
|
|
26
|
+
* Get the simulated S3 service for this account and region.
|
|
27
|
+
*/
|
|
28
|
+
s3(): SimS3;
|
|
29
|
+
}
|
|
30
|
+
export interface SimAwsAccountRegionScope {
|
|
31
|
+
accountId: SimAwsAccountId;
|
|
32
|
+
regionName: AwsRegionName;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Generates fake simulated AWS resource scopes.
|
|
36
|
+
*/
|
|
37
|
+
export declare const simAwsAccountRegionScopeFactory: DynamicFactory<SimAwsAccountRegionScope>;
|
|
38
|
+
//# sourceMappingURL=sim-aws-account-region-scope.d.ts.map
|