@ez4/aws-bucket 0.44.0 → 0.45.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/dist/client.cjs +24 -17
- package/dist/client.mjs +20 -14
- package/dist/main.cjs +193 -171
- package/dist/main.mjs +183 -158
- package/dist/triggers/client.d.ts +2 -1
- package/dist/triggers/utils.d.ts +3 -3
- package/package.json +10 -10
package/dist/client.cjs
CHANGED
|
@@ -1,18 +1,25 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
typeof
|
|
3
|
-
|
|
4
|
-
enumerable:!0}):s
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
return
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
1
|
+
"use strict";var h=Object.create;var y=Object.defineProperty;var B=Object.getOwnPropertyDescriptor;var O=Object.getOwnPropertyNames;var x=Object.getPrototypeOf,S=Object.prototype.hasOwnProperty;var C=(s,r)=>y(s,"name",{value:r,configurable:!0});var j=(s,r)=>{for(var o in r)y(s,o,{get:r[o],enumerable:!0})},f=(s,r,o,e)=>{if(r&&
|
|
2
|
+
typeof r=="object"||typeof r=="function")for(let t of O(r))!S.call(s,t)&&t!==o&&
|
|
3
|
+
y(s,t,{get:()=>r[t],enumerable:!(e=B(r,t))||e.enumerable});return s};var T=(s,r,o)=>(o=s!=null?h(x(s)):{},f(r||!s||!s.__esModule?y(o,"default",{value:s,
|
|
4
|
+
enumerable:!0}):o,s)),K=s=>f(y({},"__esModule",{value:!0}),s);var k={};j(k,{Client:()=>l});module.exports=K(k);var m=require("@aws-sdk/s3-request-presigner"),
|
|
5
|
+
n=require("@aws-sdk/client-s3"),w=T(require("mime"),1);var c=new n.S3Client({}),l;(r=>r.make=C(o=>new class{async stat(e){try{let t=await c.
|
|
6
|
+
send(new n.HeadObjectCommand({Bucket:o,Key:e})),{ContentType:i="application/octe\
|
|
7
|
+
t-stream",ContentLength:a=0,Metadata:d}=t;return{type:i,metadata:d,size:a}}catch(t){
|
|
8
|
+
if(!(t instanceof n.NotFound)&&!(t instanceof n.NoSuchKey))throw t;return}}async exists(e){
|
|
9
|
+
return!!await this.stat(e)}async write(e,t,i={}){let{contentType:a=w.default.getType(
|
|
10
|
+
e),headers:d={},metadata:p}=i;await c.send(new n.PutObjectCommand({Bucket:o,Key:e,
|
|
11
|
+
Body:t,Metadata:p,CacheControl:d?.cacheControl,Expires:d?.expires,...a&&{ContentType:a}}))}async read(e){
|
|
12
|
+
let i=await(await c.send(new n.GetObjectCommand({Bucket:o,Key:e}))).Body.transformToByteArray();
|
|
13
|
+
return Buffer.from(i)}async delete(e){await c.send(new n.DeleteObjectCommand({Bucket:o,
|
|
14
|
+
Key:e}))}async copy(e,t){e!==t&&await c.send(new n.CopyObjectCommand({Bucket:o,CopySource:`${o}\
|
|
15
|
+
/${e}`,Key:t}))}async*scan(){let e;do{let t=await c.send(new n.ListObjectsV2Command(
|
|
16
|
+
{ContinuationToken:e,Bucket:o}));for(let i of t.Contents??[])yield{key:i.Key,modifiedAt:i.
|
|
17
|
+
LastModified,size:i.Size};e=t.NextContinuationToken}while(e)}async getStatUrl(e,t){
|
|
18
|
+
let{expiresIn:i}=t,a=new n.HeadObjectCommand({Bucket:o,Key:e});return(0,m.getSignedUrl)(
|
|
19
|
+
c,a,{expiresIn:i})}async getWriteUrl(e,t){let{expiresIn:i,contentType:a,metadata:d,
|
|
20
|
+
headers:p={}}=t,u=new n.PutObjectCommand({Bucket:o,ContentType:a,CacheControl:p?.
|
|
21
|
+
cacheControl,Expires:p?.expires,Metadata:d,Key:e}),g=["content-type"];return p.cacheControl&&
|
|
22
|
+
g.push("cache-control"),p.expires&&g.push("expires"),(0,m.getSignedUrl)(c,u,{signableHeaders:new Set(
|
|
23
|
+
g),expiresIn:i})}async getReadUrl(e,t){let{expiresIn:i}=t,a=new n.GetObjectCommand(
|
|
24
|
+
{Bucket:o,Key:e});return(0,m.getSignedUrl)(c,a,{expiresIn:i})}},"make"))(l||={});0&&(module.exports={Client});
|
|
18
25
|
//# sourceMappingURL=client.cjs.map
|
package/dist/client.mjs
CHANGED
|
@@ -1,15 +1,21 @@
|
|
|
1
|
-
var
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
{
|
|
7
|
-
await
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
Bucket:
|
|
11
|
-
send(new
|
|
12
|
-
|
|
13
|
-
let
|
|
14
|
-
|
|
1
|
+
var l=Object.defineProperty;var m=(y,c)=>l(y,"name",{value:c,configurable:!0});import{getSignedUrl as p}from"@aws-sdk/s3-request-presigner";import{S3Client as u,
|
|
2
|
+
GetObjectCommand as g,PutObjectCommand as C,HeadObjectCommand as f,ListObjectsV2Command as h,
|
|
3
|
+
DeleteObjectCommand as B,CopyObjectCommand as O,NoSuchKey as x,NotFound as S}from"@aws-sdk/client-s3";
|
|
4
|
+
import j from"mime";var r=new u({}),T;(c=>c.make=m(o=>new class{async stat(e){try{let t=await r.send(
|
|
5
|
+
new f({Bucket:o,Key:e})),{ContentType:n="application/octet-stream",ContentLength:s=0,
|
|
6
|
+
Metadata:i}=t;return{type:n,metadata:i,size:s}}catch(t){if(!(t instanceof S)&&!(t instanceof
|
|
7
|
+
x))throw t;return}}async exists(e){return!!await this.stat(e)}async write(e,t,n={}){
|
|
8
|
+
let{contentType:s=j.getType(e),headers:i={},metadata:a}=n;await r.send(new C({Bucket:o,
|
|
9
|
+
Key:e,Body:t,Metadata:a,CacheControl:i?.cacheControl,Expires:i?.expires,...s&&{ContentType:s}}))}async read(e){
|
|
10
|
+
let n=await(await r.send(new g({Bucket:o,Key:e}))).Body.transformToByteArray();return Buffer.
|
|
11
|
+
from(n)}async delete(e){await r.send(new B({Bucket:o,Key:e}))}async copy(e,t){e!==
|
|
12
|
+
t&&await r.send(new O({Bucket:o,CopySource:`${o}/${e}`,Key:t}))}async*scan(){let e;
|
|
13
|
+
do{let t=await r.send(new h({ContinuationToken:e,Bucket:o}));for(let n of t.Contents??
|
|
14
|
+
[])yield{key:n.Key,modifiedAt:n.LastModified,size:n.Size};e=t.NextContinuationToken}while(e)}async getStatUrl(e,t){
|
|
15
|
+
let{expiresIn:n}=t,s=new f({Bucket:o,Key:e});return p(r,s,{expiresIn:n})}async getWriteUrl(e,t){
|
|
16
|
+
let{expiresIn:n,contentType:s,metadata:i,headers:a={}}=t,w=new C({Bucket:o,ContentType:s,
|
|
17
|
+
CacheControl:a?.cacheControl,Expires:a?.expires,Metadata:i,Key:e}),d=["content-t\
|
|
18
|
+
ype"];return a.cacheControl&&d.push("cache-control"),a.expires&&d.push("expires"),
|
|
19
|
+
p(r,w,{signableHeaders:new Set(d),expiresIn:n})}async getReadUrl(e,t){let{expiresIn:n}=t,
|
|
20
|
+
s=new g({Bucket:o,Key:e});return p(r,s,{expiresIn:n})}},"make"))(T||={});export{T as Client};
|
|
15
21
|
//# sourceMappingURL=client.mjs.map
|
package/dist/main.cjs
CHANGED
|
@@ -1,178 +1,200 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
typeof e=="object"||typeof e=="function")for(let
|
|
3
|
-
|
|
4
|
-
enumerable:!0}):r
|
|
5
|
-
ObjectServiceType:()=>
|
|
6
|
-
createBucket:()=>
|
|
7
|
-
createBucketStateId:()=>
|
|
8
|
-
getBucketObjectPath:()=>
|
|
9
|
-
isBucketObjectState:()=>
|
|
10
|
-
module.exports
|
|
11
|
-
|
|
12
|
-
{Bucket:e,MaxKeys:1}))).Contents?.length}catch(
|
|
13
|
-
throw
|
|
14
|
-
let{bucketName:
|
|
15
|
-
{bucketName:
|
|
16
|
-
return await
|
|
17
|
-
|
|
18
|
-
"Tag bucket"),await
|
|
19
|
-
{...
|
|
20
|
-
bucket CORS"),await
|
|
21
|
-
CORSRules:[{ID:"ID0",AllowedOrigins:
|
|
22
|
-
AllowedHeaders:
|
|
23
|
-
"updateCorsConfiguration"),
|
|
24
|
-
return await
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
{Bucket:e,LifecycleConfiguration:{Rules:[{ID:"ID0",Status:
|
|
28
|
-
Filter:{Prefix:"*"},Expiration:{Days:
|
|
29
|
-
|
|
30
|
-
{Bucket:e})),!0}catch(
|
|
31
|
-
eleteLifecycle"),
|
|
32
|
-
functionArn:o,eventsPath:
|
|
1
|
+
"use strict";var Gt=Object.create;var N=Object.defineProperty;var Vt=Object.getOwnPropertyDescriptor;var Wt=Object.getOwnPropertyNames;var _t=Object.getPrototypeOf,Zt=Object.prototype.hasOwnProperty;var n=(r,e)=>N(r,"name",{value:e,configurable:!0});var Jt=(r,e)=>{for(var t in e)N(r,t,{get:e[t],enumerable:!0})},me=(r,e,t,o)=>{if(e&&
|
|
2
|
+
typeof e=="object"||typeof e=="function")for(let i of Wt(e))!Zt.call(r,i)&&i!==t&&
|
|
3
|
+
N(r,i,{get:()=>e[i],enumerable:!(o=Vt(e,i))||o.enumerable});return r};var le=(r,e,t)=>(t=r!=null?Gt(_t(r)):{},me(e||!r||!r.__esModule?N(t,"default",{value:r,
|
|
4
|
+
enumerable:!0}):t,r)),Qt=r=>me(N({},"__esModule",{value:!0}),r);var wr={};Jt(wr,{BucketServiceName:()=>v,BucketServiceType:()=>d,ObjectServiceName:()=>B,
|
|
5
|
+
ObjectServiceType:()=>g,PolicyServiceName:()=>h,PolicyServiceType:()=>b,buildBucketArn:()=>re,
|
|
6
|
+
createBucket:()=>ne,createBucketEventFunction:()=>ie,createBucketObject:()=>Br,createBucketPolicy:()=>br,
|
|
7
|
+
createBucketStateId:()=>X,getBucketDomain:()=>kr,getBucketName:()=>T,getBucketObjectFiles:()=>pr,
|
|
8
|
+
getBucketObjectPath:()=>z,getBucketState:()=>Y,getPolicyDocument:()=>oe,isBucketDomain:()=>Sr,
|
|
9
|
+
isBucketObjectState:()=>sr,isBucketPolicyState:()=>xr,isBucketState:()=>De,registerTriggers:()=>gr});
|
|
10
|
+
module.exports=Qt(wr);var Rt=require("@ez4/aws-common"),ht=require("@ez4/aws-identity"),jt=require("@ez4/aws-function"),
|
|
11
|
+
Lt=require("@ez4/storage/library"),Nt=require("@ez4/project/library");var Le=require("@ez4/aws-common");var k=require("@ez4/aws-common"),Q=require("@ez4/aws-function"),O=require("@ez4/utils");var de=require("@ez4/aws-common"),p=require("@aws-sdk/client-s3");var ye=require("@ez4/aws-common"),fe=require("@aws-sdk/client-s3");var l=n(()=>new fe.S3Client((0,ye.getAwsClientOptions)()),"getS3Client");var ge=n(async(r,e)=>{r.update("Fetching bucket");try{return!(await l().send(new p.ListObjectsV2Command(
|
|
12
|
+
{Bucket:e,MaxKeys:1}))).Contents?.length}catch(t){if(!(t instanceof p.NoSuchBucket))
|
|
13
|
+
throw t;return 0}},"isBucketEmpty"),Se=n(async(r,e)=>{r.update("Creating bucket");
|
|
14
|
+
let{bucketName:t}=e;return await l().send(new p.CreateBucketCommand({Bucket:t})),
|
|
15
|
+
{bucketName:t}},"createBucket"),ke=n(async(r,e)=>{r.update("Deleting bucket");try{
|
|
16
|
+
return await l().send(new p.DeleteBucketCommand({Bucket:e})),!0}catch(t){if(!(t instanceof
|
|
17
|
+
p.NoSuchBucket))throw t;return!1}},"deleteBucket"),be=n(async(r,e,t)=>{r.update(
|
|
18
|
+
"Tag bucket"),await l().send(new p.PutBucketTaggingCommand({Bucket:e,Tagging:{TagSet:(0,de.getTagList)(
|
|
19
|
+
{...t,ManagedBy:"EZ4"})}}))},"tagBucket"),xe=n(async(r,e,t)=>{r.update("Updating\
|
|
20
|
+
bucket CORS"),await l().send(new p.PutBucketCorsCommand({Bucket:e,CORSConfiguration:{
|
|
21
|
+
CORSRules:[{ID:"ID0",AllowedOrigins:t.allowOrigins,AllowedMethods:t.allowMethods,
|
|
22
|
+
AllowedHeaders:t.allowHeaders,ExposeHeaders:t.exposeHeaders,MaxAgeSeconds:t.maxAge}]}}))},
|
|
23
|
+
"updateCorsConfiguration"),Be=n(async(r,e)=>{r.update("Deleting bucket CORS");try{
|
|
24
|
+
return await l().send(new p.DeleteBucketCorsCommand({Bucket:e})),!0}catch(t){if(!(t instanceof
|
|
25
|
+
p.NoSuchBucket))throw t;return!1}},"deleteCorsConfiguration"),we=n(async(r,e,t)=>{
|
|
26
|
+
r.update("Creating bucket lifecycle"),await l().send(new p.PutBucketLifecycleConfigurationCommand(
|
|
27
|
+
{Bucket:e,LifecycleConfiguration:{Rules:[{ID:"ID0",Status:p.ExpirationStatus.Enabled,
|
|
28
|
+
Filter:{Prefix:"*"},Expiration:{Days:t}}]}}))},"createLifecycle"),Ce=n(async(r,e)=>{
|
|
29
|
+
r.update("Deleting bucket lifecycle");try{return await l().send(new p.DeleteBucketLifecycleCommand(
|
|
30
|
+
{Bucket:e})),!0}catch(t){if(!(t instanceof p.NoSuchBucket))throw t;return!1}},"d\
|
|
31
|
+
eleteLifecycle"),Pe=n(async(r,e,t)=>{r.update("Update bucket event stream");let{
|
|
32
|
+
functionArn:o,eventsPath:i,eventsType:c}=t;await l().send(new p.PutBucketNotificationConfigurationCommand(
|
|
33
33
|
{Bucket:e,SkipDestinationValidation:!0,NotificationConfiguration:{...o&&{LambdaFunctionConfigurations:[
|
|
34
|
-
{Id:"ID0",LambdaFunctionArn:o,Events:
|
|
35
|
-
refix",Value:
|
|
36
|
-
getBucketHandler"),
|
|
37
|
-
"equalsResource"),
|
|
38
|
-
o={...e.parameters,dependencies:e.dependencies},
|
|
39
|
-
return{...
|
|
40
|
-
throw new
|
|
41
|
-
Resource"),
|
|
42
|
-
logExecution(
|
|
43
|
-
await
|
|
44
|
-
eventsPath:
|
|
45
|
-
"createResource"),
|
|
46
|
-
throw new
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
tags);let
|
|
50
|
-
functionArn:m};return await
|
|
51
|
-
|
|
52
|
-
logExecution(
|
|
53
|
-
"deleteResource"),
|
|
54
|
-
cors,o.cors))){if(
|
|
55
|
-
kCorsUpdates"),
|
|
56
|
-
autoExpireDays)return
|
|
57
|
-
e)}},"checkLifecycleUpdates"),
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
"checkEventUpdates");var
|
|
61
|
-
`Bucket service ${e} wasn't found.`)}};var
|
|
62
|
-
type===
|
|
63
|
-
e);return o},"getBucketState"),
|
|
64
|
-
if(!o?.bucketName)throw new
|
|
65
|
-
bucketName},"getBucketName");var
|
|
66
|
-
role:o}=e;return await
|
|
67
|
-
stringify(o)})),{bucketName:
|
|
68
|
-
ting bucket policy");try{return await
|
|
69
|
-
!0}catch(
|
|
70
|
-
getPolicyHandler"),
|
|
71
|
-
"equalsResource"),
|
|
72
|
-
o={...e.parameters,dependencies:e.dependencies},
|
|
73
|
-
getRole:!0}});if(
|
|
74
|
-
async(
|
|
75
|
-
return
|
|
76
|
-
e);return
|
|
77
|
-
getRole(e);return await
|
|
78
|
-
ource"),
|
|
79
|
-
let{bucketName:
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
Body:(0,
|
|
83
|
-
ct"),
|
|
84
|
-
{Bucket:e,Key:
|
|
85
|
-
updateTags"),
|
|
86
|
-
send(new
|
|
87
|
-
throw o;return!1}},"deleteObject");var
|
|
88
|
-
bjectPath"),
|
|
89
|
-
lastModified,objectKey:o.objectKey})),"getBucketObjectFiles");var
|
|
90
|
-
getObjectHandler"),
|
|
91
|
-
"equalsResource"),
|
|
92
|
-
{...
|
|
93
|
-
dependencies,lastModified:
|
|
94
|
-
objectKey}},"previewResource"),
|
|
95
|
-
|
|
96
|
-
o=
|
|
97
|
-
creation",async
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
async
|
|
102
|
-
tags),m})},"updateResource"),
|
|
103
|
-
let o=
|
|
104
|
-
tion",async
|
|
105
|
-
let{mtime:e}=await(0,
|
|
106
|
-
async(
|
|
107
|
-
filePath)return e;let{bucketName:
|
|
108
|
-
{lastModified:
|
|
109
|
-
{};!(0,
|
|
110
|
-
[{resourceIds:[`arn:aws:s3:::${
|
|
34
|
+
{Id:"ID0",LambdaFunctionArn:o,Events:c,...i&&{Filter:{Key:{FilterRules:[{Name:"p\
|
|
35
|
+
refix",Value:i}]}}}}]}}}))},"updateEventNotifications");var v="AWS:S3/Bucket",d="aws:s3.bucket";var ve=n(()=>({equals:Xt,create:Ee,replace:er,preview:Yt,update:tr,delete:rr}),"\
|
|
36
|
+
getBucketHandler"),Xt=n((r,e)=>!!r.result&&r.result.bucketName===e.result?.bucketName,
|
|
37
|
+
"equalsResource"),Yt=n((r,e)=>{let t={...r.parameters,dependencies:r.dependencies},
|
|
38
|
+
o={...e.parameters,dependencies:e.dependencies},i=(0,O.deepCompare)(t,o);if(i.counts)
|
|
39
|
+
return{...i,name:t.bucketName}},"previewResource"),er=n(async(r,e,t)=>{if(e.result)
|
|
40
|
+
throw new k.ReplaceResourceError(v,r.entryId,e.entryId);return Ee(r,t)},"replace\
|
|
41
|
+
Resource"),Ee=n((r,e)=>{let t=r.parameters,o=(0,Q.tryGetFunctionArn)(e);return k.OperationLogger.
|
|
42
|
+
logExecution(v,t.bucketName,"creation",async i=>{let{bucketName:c}=await Se(i,t);
|
|
43
|
+
await Oe(i,c,t,void 0),await Re(i,c,t,void 0),await he(i,c,t.tags,void 0);let a={
|
|
44
|
+
eventsPath:t.eventsPath,functionArn:o};return await je(i,c,a,{}),{bucketName:c,functionArn:o}})},
|
|
45
|
+
"createResource"),tr=n((r,e,t)=>{let{result:o,parameters:i}=r,{bucketName:c}=i;if(!o)
|
|
46
|
+
throw new k.CorruptedResourceError(v,c);return k.OperationLogger.logExecution(v,
|
|
47
|
+
c,"updates",async a=>{let s=(0,Q.tryGetFunctionArn)(t),m=e.result?.functionArn;await Oe(
|
|
48
|
+
a,c,i,e.parameters),await Re(a,c,i,e.parameters),await he(a,c,i.tags,e.parameters.
|
|
49
|
+
tags);let y={eventsPath:i.eventsPath,functionArn:s},f={eventsPath:e.parameters.eventsPath,
|
|
50
|
+
functionArn:m};return await je(a,c,y,f),{...o,functionArn:s}})},"updateResource"),
|
|
51
|
+
rr=n(async r=>{let{result:e}=r;if(!e)return;let{bucketName:t}=e;await k.OperationLogger.
|
|
52
|
+
logExecution(v,t,"deletion",async o=>{await ge(o,e.bucketName)&&await ke(o,e.bucketName)})},
|
|
53
|
+
"deleteResource"),Oe=n(async(r,e,t,o)=>{if(!(t.cors&&o?.cors&&(0,O.deepEqual)(t.
|
|
54
|
+
cors,o.cors))){if(t.cors)return xe(r,e,t.cors);if(o?.cors)return Be(r,e)}},"chec\
|
|
55
|
+
kCorsUpdates"),Re=n(async(r,e,t,o)=>{if(t.autoExpireDays!==o?.autoExpireDays){if(t.
|
|
56
|
+
autoExpireDays)return we(r,e,t.autoExpireDays);if(o?.autoExpireDays)return Ce(r,
|
|
57
|
+
e)}},"checkLifecycleUpdates"),he=n(async(r,e,t,o)=>{let i=t??{};!(0,O.deepEqual)(
|
|
58
|
+
i,o??{})&&await be(r,e,i)},"checkTagUpdates"),je=n(async(r,e,t,o)=>{!(0,O.deepEqual)(
|
|
59
|
+
t,o)&&await Pe(r,e,{eventsType:["s3:ObjectCreated:*","s3:ObjectRemoved:*"],...t})},
|
|
60
|
+
"checkEventUpdates");var Ne=n(()=>{(0,Le.tryRegisterProvider)(d,ve())},"registerBucketProvider");var qe=require("@ez4/aws-common");var D=require("@ez4/aws-common"),Ie=require("@ez4/utils");var Te=require("@ez4/aws-common"),M=require("@ez4/utils");var K=class extends Error{static{n(this,"BucketNotFoundError")}constructor(e){super(
|
|
61
|
+
`Bucket service ${e} wasn't found.`)}};var X=n(r=>(0,M.hashData)(d,(0,M.toKebabCase)(r)),"createBucketStateId"),De=n(r=>r.
|
|
62
|
+
type===d,"isBucketState"),Y=n((r,e,t)=>{let o=r.getServiceState(e,t);if(!De(o))throw new K(
|
|
63
|
+
e);return o},"getBucketState"),T=n((r,e,t)=>{let o=t.getDependencies(d)[0]?.result;
|
|
64
|
+
if(!o?.bucketName)throw new Te.IncompleteResourceError(r,e,"bucketName");return o.
|
|
65
|
+
bucketName},"getBucketName");var R=require("@aws-sdk/client-s3");var ze=l(),Ae=n(async(r,e)=>{r.update("Creating bucket policy");let{bucketName:t,
|
|
66
|
+
role:o}=e;return await ze.send(new R.PutBucketPolicyCommand({Bucket:t,Policy:JSON.
|
|
67
|
+
stringify(o)})),{bucketName:t}},"createPolicy"),Fe=n(async(r,e)=>{r.update("Dele\
|
|
68
|
+
ting bucket policy");try{return await ze.send(new R.DeleteBucketPolicyCommand({Bucket:e})),
|
|
69
|
+
!0}catch(t){if(!(t instanceof R.NoSuchBucket))throw t;return!1}},"deletePolicy");var h="AWS:S3/Policy",b="aws:s3.policy";var Ke=n(()=>({equals:or,create:Me,replace:ir,preview:nr,update:cr,delete:ar}),"\
|
|
70
|
+
getPolicyHandler"),or=n((r,e)=>!!r.result&&r.result.bucketName===e.result?.bucketName,
|
|
71
|
+
"equalsResource"),nr=n((r,e)=>{let t={...r.parameters,dependencies:r.dependencies},
|
|
72
|
+
o={...e.parameters,dependencies:e.dependencies},i=(0,Ie.deepCompare)(t,o,{exclude:{
|
|
73
|
+
getRole:!0}});if(i.counts)return{...i,name:t.fromService}},"previewResource"),ir=n(
|
|
74
|
+
async(r,e,t)=>{if(e.result)throw new D.ReplaceResourceError(h,r.entryId,e.entryId);
|
|
75
|
+
return Me(r,t)},"replaceResource"),Me=n((r,e)=>{let t=r.parameters,o=T(h,"policy",
|
|
76
|
+
e);return D.OperationLogger.logExecution(h,o,"creation",async i=>{let c=await t.
|
|
77
|
+
getRole(e);return await Ae(i,{bucketName:o,role:c}),{bucketName:o}})},"createRes\
|
|
78
|
+
ource"),cr=n(async()=>{},"updateResource"),ar=n(async r=>{let e=r.result;if(!e)return;
|
|
79
|
+
let{bucketName:t}=e;await D.OperationLogger.logExecution(h,t,"deletion",o=>Fe(o,
|
|
80
|
+
t))},"deleteResource");var He=n(()=>{(0,qe.tryRegisterProvider)(b,Ke())},"registerPolicyProvider");var Xe=require("@ez4/aws-common");var _e=require("node:fs/promises"),w=require("@ez4/aws-common"),q=require("@ez4/utils");var Ue=require("node:fs"),x=require("@aws-sdk/client-s3"),$e=require("@ez4/aws-common");var Ge=le(require("mime"),1);var ee=n(async(r,e,t)=>{r.update("Creating object");let{objectKey:o,filePath:i}=t,
|
|
81
|
+
c=Ge.default.getType(i);return await l().send(new x.PutObjectCommand({Bucket:e,Key:o,
|
|
82
|
+
Body:(0,Ue.createReadStream)(i),...c&&{ContentType:c}})),{objectKey:o}},"putObje\
|
|
83
|
+
ct"),Ve=n(async(r,e,t,o)=>{r.update("Updating object tags"),await l().send(new x.PutObjectTaggingCommand(
|
|
84
|
+
{Bucket:e,Key:t,Tagging:{TagSet:(0,$e.getTagList)({...o,ManagedBy:"EZ4"})}}))},"\
|
|
85
|
+
updateTags"),We=n(async(r,e,t)=>{r.update("Deleting object");try{return await l().
|
|
86
|
+
send(new x.DeleteObjectCommand({Bucket:e,Key:t})),!0}catch(o){if(!(o instanceof x.NoSuchBucket))
|
|
87
|
+
throw o;return!1}},"deleteObject");var B="AWS:S3/Object",g="aws:s3.object";var sr=n(r=>r.type===g,"isBucketObjectState"),z=n((r,e)=>`${r}/${e}`,"getBucketO\
|
|
88
|
+
bjectPath"),pr=n(r=>r.getDependencies(g).map(({result:t,parameters:o})=>({lastModified:t?.
|
|
89
|
+
lastModified,objectKey:o.objectKey})),"getBucketObjectFiles");var Ze=n(()=>({equals:ur,create:Je,replace:lr,preview:mr,update:yr,delete:fr}),"\
|
|
90
|
+
getObjectHandler"),ur=n((r,e)=>!!r.result&&r.result.lastModified===e.result?.lastModified,
|
|
91
|
+
"equalsResource"),mr=n(async(r,e)=>{let t=r.parameters,o=e.parameters,i=(0,q.deepCompare)(
|
|
92
|
+
{...t,dependencies:r.dependencies,lastModified:await te(t.filePath)},{...o,dependencies:e.
|
|
93
|
+
dependencies,lastModified:r.result?.lastModified});if(i.counts)return{...i,name:t.
|
|
94
|
+
objectKey}},"previewResource"),lr=n(async(r,e,t)=>{if(e.result)throw new w.ReplaceResourceError(
|
|
95
|
+
B,r.entryId,e.entryId);return Je(r,t)},"replaceResource"),Je=n((r,e)=>{let t=r.parameters,
|
|
96
|
+
o=T(B,"bucket",e),i=z(o,t.objectKey);return w.OperationLogger.logExecution(B,i,"\
|
|
97
|
+
creation",async c=>{let a=await te(t.filePath),{objectKey:s}=await ee(c,o,t);return await Qe(
|
|
98
|
+
c,o,s,t.tags,r.parameters.tags),{lastModified:a,bucketName:o}})},"createResource"),
|
|
99
|
+
yr=n((r,e)=>{let{result:t,parameters:o}=r,{objectKey:i,tags:c}=o;if(!t)throw new w.CorruptedResourceError(
|
|
100
|
+
B,i);let a=z(t.bucketName,i);return w.OperationLogger.logExecution(B,a,"updates",
|
|
101
|
+
async s=>{let m=dr(s,t,o,e.parameters);return await Qe(s,t.bucketName,i,c,e.parameters.
|
|
102
|
+
tags),m})},"updateResource"),fr=n(async r=>{let{result:e,parameters:t}=r;if(!e)return;
|
|
103
|
+
let o=z(e.bucketName,t.objectKey);await w.OperationLogger.logExecution(B,o,"dele\
|
|
104
|
+
tion",async i=>{await We(i,e.bucketName,t.objectKey)})},"deleteResource"),te=n(async r=>{
|
|
105
|
+
let{mtime:e}=await(0,_e.stat)(r);return e.getTime()},"getLastModifiedTime"),dr=n(
|
|
106
|
+
async(r,e,t,o)=>{let i=await te(t.filePath);if(i<=e.lastModified&&t.filePath===o.
|
|
107
|
+
filePath)return e;let{bucketName:c}=e,{objectKey:a}=o;return await ee(r,c,{...t,
|
|
108
|
+
objectKey:a}),{lastModified:i,bucketName:c}},"checkObjectUpdates"),Qe=n(async(r,e,t,o,i)=>{
|
|
109
|
+
let c=o??{};!(0,q.deepEqual)(c,i??{})&&await Ve(r,e,t,c)},"checkTagUpdates");var Ye=n(()=>{(0,Xe.tryRegisterProvider)(g,Ze())},"registerObjectProvider");var Z=require("@ez4/storage/library");var H=require("@ez4/stateful"),tt=require("@ez4/aws-function");var et=require("@ez4/aws-identity");var re=n(r=>`arn:aws:s3:::${r}`,"buildBucketArn"),oe=n(r=>(0,et.createPolicyDocument)(
|
|
110
|
+
[{resourceIds:[`arn:aws:s3:::${r}-*`,`arn:aws:s3:::${r}-*/*`],permissions:["s3:L\
|
|
111
111
|
istBucket","s3:PutObject","s3:GetObject","s3:DeleteObject","s3:HeadObject"]}]),"\
|
|
112
|
-
getPolicyDocument");var
|
|
113
|
-
dependencies:[],parameters:
|
|
114
|
-
bucketName,getPermission:n(()=>({principal:"s3.amazonaws.com",sourceArn:
|
|
115
|
-
getPermission")}),(0,
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
e);return(0,
|
|
120
|
-
__dirname,"../lib/event.ts"),
|
|
121
|
-
debug:a})},"bundleBucketEventFunction");var
|
|
122
|
-
|
|
123
|
-
description:o.description,logLevel:
|
|
112
|
+
getPolicyDocument");var ne=n((r,e,t)=>{let o=t.bucketName,i=X(o),c=(0,H.attachEntry)(r,{type:d,entryId:i,
|
|
113
|
+
dependencies:[],parameters:t});return e&&((0,tt.createPermission)(r,c,e,{fromService:t.
|
|
114
|
+
bucketName,getPermission:n(()=>({principal:"s3.amazonaws.com",sourceArn:re(o)}),
|
|
115
|
+
"getPermission")}),(0,H.linkEntryDependency)(r,c.entryId,e.entryId)),c},"createB\
|
|
116
|
+
ucket");var V=require("@ez4/aws-function"),W=require("@ez4/project/library"),ae=require("@ez4/aws-identity"),
|
|
117
|
+
lt=require("@ez4/aws-logs");var at=require("@ez4/aws-function"),st=require("@ez4/utils"),pt=require("@ez4/project");var rt=require("node:path"),ot=require("@ez4/project/library"),nt=require("@ez4/aws-function"),
|
|
118
|
+
it=require("@ez4/aws-common");var ct=n(async(r,e)=>{let{handler:t,listener:o,functionName:i,context:c,debug:a}=r,
|
|
119
|
+
s=(0,ot.getDefinitionsObject)(e);return(0,it.getFunctionBundle)(nt.MappingServiceName,
|
|
120
|
+
{templateFile:(0,rt.join)(__dirname,"../lib/event.ts"),resourceName:i,define:s,filePrefix:"\
|
|
121
|
+
s3",handler:t,listener:o,context:c,debug:a})},"bundleBucketEventFunction");var ie=n((r,e,t,o)=>{let{handler:i,variables:c,debug:a,architecture:s}=o;return(0,at.createFunction)(
|
|
122
|
+
r,e,t,{handlerName:"s3EntryPoint",sourceFile:i.sourceFile,functionName:o.functionName,
|
|
123
|
+
description:o.description,logLevel:a?pt.LogLevel.Debug:o.logLevel,architecture:o.
|
|
124
124
|
architecture,runtime:o.runtime,release:o.release,timeout:o.timeout,memory:o.memory,
|
|
125
|
-
files:o.files,tags:o.tags,getFunctionVariables:n(()=>
|
|
126
|
-
{}),"getFunctionVariables"),getFunctionBundle:n(m=>
|
|
127
|
-
...m.getConnections()]),"getFunctionBundle"),getFunctionFiles:n(()=>[
|
|
128
|
-
|
|
129
|
-
debug:
|
|
130
|
-
let
|
|
131
|
-
0,46)}-${o}`},"getBucketName"),
|
|
132
|
-
e)}`,"getInternalName"),
|
|
133
|
-
e)}`,"getFunctionName");var
|
|
134
|
-
"Execution role for S3 is missing.")}};var
|
|
135
|
-
|
|
136
|
-
Architecture,
|
|
137
|
-
|
|
138
|
-
throw new
|
|
139
|
-
architecture??
|
|
140
|
-
logLevel??
|
|
141
|
-
debug,variables:
|
|
142
|
-
|
|
143
|
-
P.file)
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
throw new
|
|
151
|
-
|
|
152
|
-
vpc=(0,
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
filePath:(0,
|
|
125
|
+
files:o.files,tags:o.tags,getFunctionVariables:n(()=>c.reduce((m,y)=>({...m,...y}),
|
|
126
|
+
{}),"getFunctionVariables"),getFunctionBundle:n(m=>ct(o,[...m.getDependencies(),
|
|
127
|
+
...m.getConnections()]),"getFunctionBundle"),getFunctionFiles:n(()=>[i.sourceFile,
|
|
128
|
+
i.dependencies],"getFunctionFiles"),getFunctionHash:n(()=>(0,st.hashObject)({architecture:s,
|
|
129
|
+
debug:a}),"getFunctionHash")})},"createBucketEventFunction");var U=require("@ez4/project/library"),ut=require("@ez4/aws-common"),$=require("@ez4/utils");var G=n(async(r,e)=>{if(r.globalName)return(0,U.getServiceName)(r.globalName,e);
|
|
130
|
+
let t=(0,U.getServiceName)(r,e),o=await(0,ut.getRandomName)(16);return`${t.substring(
|
|
131
|
+
0,46)}-${o}`},"getBucketName"),ce=n((r,e)=>`${(0,$.toKebabCase)(r.name)}-${(0,$.toKebabCase)(
|
|
132
|
+
e)}`,"getInternalName"),mt=n((r,e,t)=>`${(0,U.getServiceName)(r,t)}-${(0,$.toKebabCase)(
|
|
133
|
+
e)}`,"getFunctionName");var A=class extends Error{static{n(this,"RoleMissingError")}constructor(){super(
|
|
134
|
+
"Execution role for S3 is missing.")}};var E=require("@ez4/aws-function"),C;(a=>(a.LogLevel=E.FunctionDefaults.LogLevel,
|
|
135
|
+
a.LogRetention=E.FunctionDefaults.LogRetention,a.Architecture=E.FunctionDefaults.
|
|
136
|
+
Architecture,a.Runtime=E.FunctionDefaults.Runtime,a.Timeout=E.FunctionDefaults.Timeout,
|
|
137
|
+
a.Memory=E.FunctionDefaults.Memory))(C||={});var yt=n((r,e,t,o)=>{if(!e.events)return;if(!o.role||!(0,ae.isRoleState)(o.role))
|
|
138
|
+
throw new A;let{defaults:i,release:c,tags:a}=t,{runtime:s=i?.runtime??C.Runtime,
|
|
139
|
+
architecture:m=i?.architecture??C.Architecture,logRetention:y=i?.logRetention??C.
|
|
140
|
+
LogRetention,logLevel:f=i?.logLevel??C.LogLevel,memory:F=i?.memory??C.Memory,timeout:It=C.
|
|
141
|
+
Timeout,debug:Kt=t.debug,variables:Mt,listener:I,handler:P,files:qt,vpc:Ht}=e.events,
|
|
142
|
+
pe=ce(e,P.name),L=(0,V.tryGetFunctionState)(o,pe,t);if(L)return L;let ue=mt(e,P.
|
|
143
|
+
name,t),Ut=o.getDependencyFiles(P.file),$t=(0,lt.createLogGroup)(r,{retention:y,
|
|
144
|
+
groupName:ue,tags:a});return L=ie(r,o.role,$t,{functionName:ue,description:P.description,
|
|
145
|
+
context:e.context,variables:[t.variables,e.variables,Mt],handler:{sourceFile:P.file,
|
|
146
|
+
functionName:P.name,module:P.module,dependencies:Ut},listener:I&&{functionName:I.
|
|
147
|
+
name,sourceFile:I.file,module:I.module},architecture:m,logLevel:f,runtime:s,release:c,
|
|
148
|
+
timeout:It,memory:F,files:qt,debug:Kt,tags:a,vpc:Ht}),o.setServiceState(pe,t,L),
|
|
149
|
+
L},"prepareEvents"),ft=n((r,e,t,o)=>{if(!e.events)return;if(!o.role||!(0,ae.isRoleState)(
|
|
150
|
+
o.role))throw new A;let{handler:i}=e.events,c=ce(e,i.name),a=(0,V.getFunctionState)(
|
|
151
|
+
o,c,t);(0,W.linkServiceContext)(r,a.entryId,e.context),a.parameters.vpc||(a.parameters.
|
|
152
|
+
vpc=(0,W.isLinkedContextVpcRequired)(e.context))},"connectEvents");var dt=require("node:fs/promises"),j=require("node:path"),gt=require("@ez4/aws-bucket");var St=n(async(r,e,t)=>{let o=process.cwd(),i=(0,j.join)(o,t),c=await(0,dt.readdir)(
|
|
153
|
+
i,{withFileTypes:!0,recursive:!0});for(let a of c){if(!a.isFile())continue;let s=(0,j.join)(
|
|
154
|
+
a.parentPath,a.name);(0,gt.createBucketObject)(r,e,{objectKey:(0,j.relative)(i,s),
|
|
155
|
+
filePath:(0,j.relative)(o,s)})}},"prepareLocalContent");var bt=require("@ez4/storage/library");var _=require("@aws-sdk/s3-request-presigner"),u=require("@aws-sdk/client-s3"),kt=le(require("mime"),1);var S=new u.S3Client({}),se;(e=>e.make=n(t=>new class{async stat(o){try{let i=await S.
|
|
156
|
+
send(new u.HeadObjectCommand({Bucket:t,Key:o})),{ContentType:c="application/octe\
|
|
157
|
+
t-stream",ContentLength:a=0,Metadata:s}=i;return{type:c,metadata:s,size:a}}catch(i){
|
|
158
|
+
if(!(i instanceof u.NotFound)&&!(i instanceof u.NoSuchKey))throw i;return}}async exists(o){
|
|
159
|
+
return!!await this.stat(o)}async write(o,i,c={}){let{contentType:a=kt.default.getType(
|
|
160
|
+
o),headers:s={},metadata:m}=c;await S.send(new u.PutObjectCommand({Bucket:t,Key:o,
|
|
161
|
+
Body:i,Metadata:m,CacheControl:s?.cacheControl,Expires:s?.expires,...a&&{ContentType:a}}))}async read(o){
|
|
162
|
+
let c=await(await S.send(new u.GetObjectCommand({Bucket:t,Key:o}))).Body.transformToByteArray();
|
|
163
|
+
return Buffer.from(c)}async delete(o){await S.send(new u.DeleteObjectCommand({Bucket:t,
|
|
164
|
+
Key:o}))}async copy(o,i){o!==i&&await S.send(new u.CopyObjectCommand({Bucket:t,CopySource:`${t}\
|
|
165
|
+
/${o}`,Key:i}))}async*scan(){let o;do{let i=await S.send(new u.ListObjectsV2Command(
|
|
166
|
+
{ContinuationToken:o,Bucket:t}));for(let c of i.Contents??[])yield{key:c.Key,modifiedAt:c.
|
|
167
|
+
LastModified,size:c.Size};o=i.NextContinuationToken}while(o)}async getStatUrl(o,i){
|
|
168
|
+
let{expiresIn:c}=i,a=new u.HeadObjectCommand({Bucket:t,Key:o});return(0,_.getSignedUrl)(
|
|
169
|
+
S,a,{expiresIn:c})}async getWriteUrl(o,i){let{expiresIn:c,contentType:a,metadata:s,
|
|
170
|
+
headers:m={}}=i,y=new u.PutObjectCommand({Bucket:t,ContentType:a,CacheControl:m?.
|
|
171
|
+
cacheControl,Expires:m?.expires,Metadata:s,Key:o}),f=["content-type"];return m.cacheControl&&
|
|
172
|
+
f.push("cache-control"),m.expires&&f.push("expires"),(0,_.getSignedUrl)(S,y,{signableHeaders:new Set(
|
|
173
|
+
f),expiresIn:c})}async getReadUrl(o,i){let{expiresIn:c}=i,a=new u.GetObjectCommand(
|
|
174
|
+
{Bucket:t,Key:o});return(0,_.getSignedUrl)(S,a,{expiresIn:c})}},"make"))(se||={});var xt=n((r,e,t)=>{let o=Y(r,e.name,t),i=o.entryId;return{module:"Client",from:"\
|
|
156
175
|
@ez4/aws-bucket/client",constructor:`@{EZ4_MODULE_IMPORT}.make('${o.parameters.bucketName}\
|
|
157
|
-
')`,dependencyIds:[
|
|
158
|
-
|
|
159
|
-
context:
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
(0,
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
t,{
|
|
176
|
+
')`,dependencyIds:[i],connectionIds:[i]}},"prepareLinkedClient"),Bt=n(async r=>{
|
|
177
|
+
let{service:e,options:t}=r;if(!(0,bt.isBucketService)(e)||t.local)return null;let o=await G(
|
|
178
|
+
e,t);return se.make(o)},"prepareEmulatorClient");var wt=n(r=>{let{service:e,options:t,context:o}=r;return(0,Z.isBucketService)(e)?
|
|
179
|
+
xt(o,e,t):null},"prepareLinkedServices"),Ct=n(async r=>{let{state:e,service:t,options:o,
|
|
180
|
+
context:i}=r;if(!(0,Z.isBucketService)(t))return!1;let{localPath:c,autoExpireDays:a,
|
|
181
|
+
events:s,cors:m}=t,y=await G(t,o),f=yt(e,t,o,i),F=ne(e,f,{eventsPath:s?.path,tags:o.
|
|
182
|
+
tags,bucketName:y,autoExpireDays:a,localPath:c,cors:m});return i.setServiceState(
|
|
183
|
+
t,o,F),c&&await St(e,F,c),!0},"prepareBucketServices"),Pt=n(r=>{let{state:e,service:t,
|
|
184
|
+
options:o,context:i}=r;(0,Z.isBucketService)(t)&&ft(e,t,o,i)},"connectBucketServ\
|
|
185
|
+
ices");var vt=require("@ez4/storage/library"),J=require("@ez4/aws-identity"),Et=require("@ez4/project/library");var Ot=n(r=>{let{state:e,serviceType:t,options:o}=r;if(t!==vt.ServiceType)return null;
|
|
186
|
+
let i=(0,Et.getServiceName)("",o),c=`${i}-bucket-policy`;return(0,J.tryGetPolicy)(
|
|
187
|
+
e,c)??(0,J.createPolicy)(e,{tags:o.tags,policyDocument:oe(i),policyName:c})},"pr\
|
|
188
|
+
epareExecutionPolicy");var gr=n(()=>{(0,Rt.registerTriggers)(),(0,ht.registerTriggers)(),(0,jt.registerTriggers)(),
|
|
189
|
+
(0,Lt.registerTriggers)(),(0,Nt.tryCreateTrigger)("@ez4/aws-bucket",{"deploy:pre\
|
|
190
|
+
pareExecutionPolicy":Ot,"deploy:prepareLinkedService":wt,"deploy:prepareResource\
|
|
191
|
+
s":Ct,"deploy:connectResources":Pt,"emulator:getClient":Bt}),Ne(),He(),Ye()},"re\
|
|
192
|
+
gisterTriggers");var Tt=require("@ez4/aws-identity");var Sr=n(r=>/(.+)\.s3\.(.+)\.amazonaws\.com/i.test(r),"isBucketDomain"),kr=n(async r=>{
|
|
193
|
+
let e=await(0,Tt.getRegion)();return`${r}.s3.${e}.amazonaws.com`},"getBucketDoma\
|
|
194
|
+
in");var Dt=require("@ez4/stateful"),zt=require("@ez4/utils");var br=n((r,e,t,o)=>{let i=(0,zt.hashData)(b,e.entryId,t.entryId);return(0,Dt.attachEntry)(
|
|
195
|
+
r,{type:b,entryId:i,dependencies:[e.entryId,t.entryId],parameters:o})},"createBu\
|
|
196
|
+
cketPolicy");var xr=n(r=>r.type===b,"isBucketPolicyState");var At=require("@ez4/stateful"),Ft=require("@ez4/utils");var Br=n((r,e,t)=>{let o=t.objectKey,i=(0,Ft.hashData)(g,e.entryId,o);return(0,At.attachEntry)(
|
|
197
|
+
r,{type:g,entryId:i,dependencies:[e.entryId],parameters:t})},"createBucketObject");0&&(module.exports={BucketServiceName,BucketServiceType,ObjectServiceName,ObjectServiceType,
|
|
176
198
|
PolicyServiceName,PolicyServiceType,buildBucketArn,createBucket,createBucketEventFunction,
|
|
177
199
|
createBucketObject,createBucketPolicy,createBucketStateId,getBucketDomain,getBucketName,
|
|
178
200
|
getBucketObjectFiles,getBucketObjectPath,getBucketState,getPolicyDocument,isBucketDomain,
|
package/dist/main.mjs
CHANGED
|
@@ -1,163 +1,188 @@
|
|
|
1
|
-
var
|
|
2
|
-
import{registerTriggers as
|
|
3
|
-
import{tryCreateTrigger as
|
|
4
|
-
import{tryGetFunctionArn as
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
{
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
"
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
1
|
+
var Qe=Object.defineProperty;var n=(r,t)=>Qe(r,"name",{value:t,configurable:!0});import{registerTriggers as Lr}from"@ez4/aws-common";import{registerTriggers as Nr}from"@ez4/aws-identity";
|
|
2
|
+
import{registerTriggers as Tr}from"@ez4/aws-function";import{registerTriggers as Dr}from"@ez4/storage/library";
|
|
3
|
+
import{tryCreateTrigger as zr}from"@ez4/project/library";import{tryRegisterProvider as bt}from"@ez4/aws-common";import{CorruptedResourceError as mt,OperationLogger as N,ReplaceResourceError as lt}from"@ez4/aws-common";
|
|
4
|
+
import{tryGetFunctionArn as ee}from"@ez4/aws-function";import{deepCompare as yt,
|
|
5
|
+
deepEqual as T}from"@ez4/utils";import{getTagList as et}from"@ez4/aws-common";import{ListObjectsV2Command as tt,
|
|
6
|
+
CreateBucketCommand as rt,DeleteBucketCommand as ot,PutBucketTaggingCommand as nt,
|
|
7
|
+
PutBucketCorsCommand as it,PutBucketLifecycleConfigurationCommand as ct,PutBucketNotificationConfigurationCommand as at,
|
|
8
|
+
DeleteBucketLifecycleCommand as st,DeleteBucketCorsCommand as pt,ExpirationStatus as ut,
|
|
9
|
+
NoSuchBucket as O}from"@aws-sdk/client-s3";import{getAwsClientOptions as Xe}from"@ez4/aws-common";import{S3Client as Ye}from"@aws-sdk/client-s3";var u=n(()=>new Ye(Xe()),"getS3Client");var G=n(async(r,t)=>{r.update("Fetching bucket");try{return!(await u().send(new tt(
|
|
10
|
+
{Bucket:t,MaxKeys:1}))).Contents?.length}catch(e){if(!(e instanceof O))throw e;return 0}},
|
|
11
|
+
"isBucketEmpty"),V=n(async(r,t)=>{r.update("Creating bucket");let{bucketName:e}=t;
|
|
12
|
+
return await u().send(new rt({Bucket:e})),{bucketName:e}},"createBucket"),W=n(async(r,t)=>{
|
|
13
|
+
r.update("Deleting bucket");try{return await u().send(new ot({Bucket:t})),!0}catch(e){
|
|
14
|
+
if(!(e instanceof O))throw e;return!1}},"deleteBucket"),_=n(async(r,t,e)=>{r.update(
|
|
15
|
+
"Tag bucket"),await u().send(new nt({Bucket:t,Tagging:{TagSet:et({...e,ManagedBy:"\
|
|
16
|
+
EZ4"})}}))},"tagBucket"),Z=n(async(r,t,e)=>{r.update("Updating bucket CORS"),await u().
|
|
17
|
+
send(new it({Bucket:t,CORSConfiguration:{CORSRules:[{ID:"ID0",AllowedOrigins:e.allowOrigins,
|
|
18
|
+
AllowedMethods:e.allowMethods,AllowedHeaders:e.allowHeaders,ExposeHeaders:e.exposeHeaders,
|
|
19
|
+
MaxAgeSeconds:e.maxAge}]}}))},"updateCorsConfiguration"),J=n(async(r,t)=>{r.update(
|
|
20
|
+
"Deleting bucket CORS");try{return await u().send(new pt({Bucket:t})),!0}catch(e){
|
|
21
|
+
if(!(e instanceof O))throw e;return!1}},"deleteCorsConfiguration"),Q=n(async(r,t,e)=>{
|
|
22
|
+
r.update("Creating bucket lifecycle"),await u().send(new ct({Bucket:t,LifecycleConfiguration:{
|
|
23
|
+
Rules:[{ID:"ID0",Status:ut.Enabled,Filter:{Prefix:"*"},Expiration:{Days:e}}]}}))},
|
|
24
|
+
"createLifecycle"),X=n(async(r,t)=>{r.update("Deleting bucket lifecycle");try{return await u().
|
|
25
|
+
send(new st({Bucket:t})),!0}catch(e){if(!(e instanceof O))throw e;return!1}},"de\
|
|
26
|
+
leteLifecycle"),Y=n(async(r,t,e)=>{r.update("Update bucket event stream");let{functionArn:o,
|
|
27
|
+
eventsPath:i,eventsType:c}=e;await u().send(new at({Bucket:t,SkipDestinationValidation:!0,
|
|
27
28
|
NotificationConfiguration:{...o&&{LambdaFunctionConfigurations:[{Id:"ID0",LambdaFunctionArn:o,
|
|
28
|
-
Events:
|
|
29
|
-
pdateEventNotifications");var
|
|
30
|
-
|
|
31
|
-
"equalsResource"),
|
|
32
|
-
o={...
|
|
33
|
-
name:
|
|
34
|
-
|
|
35
|
-
o=
|
|
36
|
-
|
|
37
|
-
eventsPath:
|
|
38
|
-
"createResource"),
|
|
39
|
-
throw new
|
|
40
|
-
functionArn;await
|
|
41
|
-
a,c.tags,
|
|
42
|
-
parameters.eventsPath,functionArn:
|
|
43
|
-
"updateResource"),
|
|
44
|
-
await
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
kCorsUpdates"),
|
|
48
|
-
autoExpireDays)return
|
|
49
|
-
"checkLifecycleUpdates"),
|
|
50
|
-
r,
|
|
51
|
-
"s3:ObjectCreated:*","s3:ObjectRemoved:*"],...
|
|
52
|
-
deepCompare as
|
|
53
|
-
toKebabCase as
|
|
54
|
-
`Bucket service ${
|
|
55
|
-
|
|
56
|
-
getBucketState"),
|
|
57
|
-
throw new
|
|
58
|
-
role:o}=
|
|
59
|
-
"createPolicy"),
|
|
60
|
-
send(new
|
|
61
|
-
eletePolicy");var
|
|
62
|
-
getPolicyHandler"),
|
|
63
|
-
"equalsResource"),
|
|
64
|
-
o={...
|
|
65
|
-
if(
|
|
66
|
-
if(
|
|
67
|
-
|
|
68
|
-
eation",async
|
|
69
|
-
{bucketName:o}})},"createResource"),
|
|
70
|
-
let
|
|
71
|
-
ion",o=>
|
|
72
|
-
ReplaceResourceError as
|
|
73
|
-
DeleteObjectCommand as
|
|
74
|
-
|
|
75
|
-
{objectKey:o}},"putObject"),
|
|
76
|
-
await
|
|
77
|
-
"updateTags"),
|
|
78
|
-
send(new
|
|
79
|
-
"deleteObject");var
|
|
80
|
-
bjectPath"),
|
|
81
|
-
lastModified,objectKey:o.objectKey})),"getBucketObjectFiles");var
|
|
82
|
-
getObjectHandler"),
|
|
83
|
-
"equalsResource"),
|
|
84
|
-
dependencies:r.dependencies,lastModified:await
|
|
85
|
-
dependencies,lastModified:r.result?.lastModified});if(
|
|
86
|
-
objectKey}},"previewResource"),
|
|
87
|
-
entryId,
|
|
88
|
-
o=
|
|
89
|
-
let
|
|
90
|
-
r.parameters.tags),{lastModified:
|
|
91
|
-
let{result:
|
|
92
|
-
|
|
93
|
-
return await
|
|
94
|
-
async r=>{let{result:
|
|
95
|
-
await
|
|
96
|
-
"deleteResource"),
|
|
97
|
-
tLastModifiedTime"),
|
|
98
|
-
|
|
99
|
-
r,
|
|
100
|
-
async(r,e,
|
|
29
|
+
Events:c,...i&&{Filter:{Key:{FilterRules:[{Name:"prefix",Value:i}]}}}}]}}}))},"u\
|
|
30
|
+
pdateEventNotifications");var x="AWS:S3/Bucket",f="aws:s3.bucket";var te=n(()=>({equals:ft,create:re,replace:gt,preview:dt,update:St,delete:kt}),"\
|
|
31
|
+
getBucketHandler"),ft=n((r,t)=>!!r.result&&r.result.bucketName===t.result?.bucketName,
|
|
32
|
+
"equalsResource"),dt=n((r,t)=>{let e={...r.parameters,dependencies:r.dependencies},
|
|
33
|
+
o={...t.parameters,dependencies:t.dependencies},i=yt(e,o);if(i.counts)return{...i,
|
|
34
|
+
name:e.bucketName}},"previewResource"),gt=n(async(r,t,e)=>{if(t.result)throw new lt(
|
|
35
|
+
x,r.entryId,t.entryId);return re(r,e)},"replaceResource"),re=n((r,t)=>{let e=r.parameters,
|
|
36
|
+
o=ee(t);return N.logExecution(x,e.bucketName,"creation",async i=>{let{bucketName:c}=await V(
|
|
37
|
+
i,e);await oe(i,c,e,void 0),await ne(i,c,e,void 0),await ie(i,c,e.tags,void 0);let a={
|
|
38
|
+
eventsPath:e.eventsPath,functionArn:o};return await ce(i,c,a,{}),{bucketName:c,functionArn:o}})},
|
|
39
|
+
"createResource"),St=n((r,t,e)=>{let{result:o,parameters:i}=r,{bucketName:c}=i;if(!o)
|
|
40
|
+
throw new mt(x,c);return N.logExecution(x,c,"updates",async a=>{let s=ee(e),p=t.
|
|
41
|
+
result?.functionArn;await oe(a,c,i,t.parameters),await ne(a,c,i,t.parameters),await ie(
|
|
42
|
+
a,c,i.tags,t.parameters.tags);let m={eventsPath:i.eventsPath,functionArn:s},l={eventsPath:t.
|
|
43
|
+
parameters.eventsPath,functionArn:p};return await ce(a,c,m,l),{...o,functionArn:s}})},
|
|
44
|
+
"updateResource"),kt=n(async r=>{let{result:t}=r;if(!t)return;let{bucketName:e}=t;
|
|
45
|
+
await N.logExecution(x,e,"deletion",async o=>{await G(o,t.bucketName)&&await W(o,
|
|
46
|
+
t.bucketName)})},"deleteResource"),oe=n(async(r,t,e,o)=>{if(!(e.cors&&o?.cors&&T(
|
|
47
|
+
e.cors,o.cors))){if(e.cors)return Z(r,t,e.cors);if(o?.cors)return J(r,t)}},"chec\
|
|
48
|
+
kCorsUpdates"),ne=n(async(r,t,e,o)=>{if(e.autoExpireDays!==o?.autoExpireDays){if(e.
|
|
49
|
+
autoExpireDays)return Q(r,t,e.autoExpireDays);if(o?.autoExpireDays)return X(r,t)}},
|
|
50
|
+
"checkLifecycleUpdates"),ie=n(async(r,t,e,o)=>{let i=e??{};!T(i,o??{})&&await _(
|
|
51
|
+
r,t,i)},"checkTagUpdates"),ce=n(async(r,t,e,o)=>{!T(e,o)&&await Y(r,t,{eventsType:[
|
|
52
|
+
"s3:ObjectCreated:*","s3:ObjectRemoved:*"],...e})},"checkEventUpdates");var ae=n(()=>{bt(f,te())},"registerBucketProvider");import{tryRegisterProvider as Dt}from"@ez4/aws-common";import{ReplaceResourceError as Ot,OperationLogger as ye}from"@ez4/aws-common";import{
|
|
53
|
+
deepCompare as Rt}from"@ez4/utils";import{IncompleteResourceError as xt}from"@ez4/aws-common";import{hashData as Bt,
|
|
54
|
+
toKebabCase as wt}from"@ez4/utils";var R=class extends Error{static{n(this,"BucketNotFoundError")}constructor(t){super(
|
|
55
|
+
`Bucket service ${t} wasn't found.`)}};var se=n(r=>Bt(f,wt(r)),"createBucketStateId"),Ct=n(r=>r.type===f,"isBucketState"),
|
|
56
|
+
pe=n((r,t,e)=>{let o=r.getServiceState(t,e);if(!Ct(o))throw new R(t);return o},"\
|
|
57
|
+
getBucketState"),h=n((r,t,e)=>{let o=e.getDependencies(f)[0]?.result;if(!o?.bucketName)
|
|
58
|
+
throw new xt(r,t,"bucketName");return o.bucketName},"getBucketName");import{PutBucketPolicyCommand as Pt,DeleteBucketPolicyCommand as vt,NoSuchBucket as Et}from"@aws-sdk/client-s3";var ue=u(),me=n(async(r,t)=>{r.update("Creating bucket policy");let{bucketName:e,
|
|
59
|
+
role:o}=t;return await ue.send(new Pt({Bucket:e,Policy:JSON.stringify(o)})),{bucketName:e}},
|
|
60
|
+
"createPolicy"),le=n(async(r,t)=>{r.update("Deleting bucket policy");try{return await ue.
|
|
61
|
+
send(new vt({Bucket:t})),!0}catch(e){if(!(e instanceof Et))throw e;return!1}},"d\
|
|
62
|
+
eletePolicy");var C="AWS:S3/Policy",k="aws:s3.policy";var fe=n(()=>({equals:ht,create:de,replace:Lt,preview:jt,update:Nt,delete:Tt}),"\
|
|
63
|
+
getPolicyHandler"),ht=n((r,t)=>!!r.result&&r.result.bucketName===t.result?.bucketName,
|
|
64
|
+
"equalsResource"),jt=n((r,t)=>{let e={...r.parameters,dependencies:r.dependencies},
|
|
65
|
+
o={...t.parameters,dependencies:t.dependencies},i=Rt(e,o,{exclude:{getRole:!0}});
|
|
66
|
+
if(i.counts)return{...i,name:e.fromService}},"previewResource"),Lt=n(async(r,t,e)=>{
|
|
67
|
+
if(t.result)throw new Ot(C,r.entryId,t.entryId);return de(r,e)},"replaceResource"),
|
|
68
|
+
de=n((r,t)=>{let e=r.parameters,o=h(C,"policy",t);return ye.logExecution(C,o,"cr\
|
|
69
|
+
eation",async i=>{let c=await e.getRole(t);return await me(i,{bucketName:o,role:c}),
|
|
70
|
+
{bucketName:o}})},"createResource"),Nt=n(async()=>{},"updateResource"),Tt=n(async r=>{
|
|
71
|
+
let t=r.result;if(!t)return;let{bucketName:e}=t;await ye.logExecution(C,e,"delet\
|
|
72
|
+
ion",o=>le(o,e))},"deleteResource");var ge=n(()=>{Dt(k,fe())},"registerPolicyProvider");import{tryRegisterProvider as Yt}from"@ez4/aws-common";import{stat as Ht}from"node:fs/promises";import{CorruptedResourceError as Ut,OperationLogger as z,
|
|
73
|
+
ReplaceResourceError as $t}from"@ez4/aws-common";import{deepCompare as Gt,deepEqual as Vt}from"@ez4/utils";import{createReadStream as zt}from"node:fs";import{PutObjectCommand as At,PutObjectTaggingCommand as Ft,
|
|
74
|
+
DeleteObjectCommand as It,NoSuchBucket as Kt}from"@aws-sdk/client-s3";import{getTagList as Mt}from"@ez4/aws-common";import qt from"mime";var D=n(async(r,t,e)=>{r.update("Creating object");let{objectKey:o,filePath:i}=e,
|
|
75
|
+
c=qt.getType(i);return await u().send(new At({Bucket:t,Key:o,Body:zt(i),...c&&{ContentType:c}})),
|
|
76
|
+
{objectKey:o}},"putObject"),Se=n(async(r,t,e,o)=>{r.update("Updating object tags"),
|
|
77
|
+
await u().send(new Ft({Bucket:t,Key:e,Tagging:{TagSet:Mt({...o,ManagedBy:"EZ4"})}}))},
|
|
78
|
+
"updateTags"),ke=n(async(r,t,e)=>{r.update("Deleting object");try{return await u().
|
|
79
|
+
send(new It({Bucket:t,Key:e})),!0}catch(o){if(!(o instanceof Kt))throw o;return!1}},
|
|
80
|
+
"deleteObject");var b="AWS:S3/Object",d="aws:s3.object";var Go=n(r=>r.type===d,"isBucketObjectState"),j=n((r,t)=>`${r}/${t}`,"getBucketO\
|
|
81
|
+
bjectPath"),Vo=n(r=>r.getDependencies(d).map(({result:e,parameters:o})=>({lastModified:e?.
|
|
82
|
+
lastModified,objectKey:o.objectKey})),"getBucketObjectFiles");var be=n(()=>({equals:Wt,create:xe,replace:Zt,preview:_t,update:Jt,delete:Qt}),"\
|
|
83
|
+
getObjectHandler"),Wt=n((r,t)=>!!r.result&&r.result.lastModified===t.result?.lastModified,
|
|
84
|
+
"equalsResource"),_t=n(async(r,t)=>{let e=r.parameters,o=t.parameters,i=Gt({...e,
|
|
85
|
+
dependencies:r.dependencies,lastModified:await A(e.filePath)},{...o,dependencies:t.
|
|
86
|
+
dependencies,lastModified:r.result?.lastModified});if(i.counts)return{...i,name:e.
|
|
87
|
+
objectKey}},"previewResource"),Zt=n(async(r,t,e)=>{if(t.result)throw new $t(b,r.
|
|
88
|
+
entryId,t.entryId);return xe(r,e)},"replaceResource"),xe=n((r,t)=>{let e=r.parameters,
|
|
89
|
+
o=h(b,"bucket",t),i=j(o,e.objectKey);return z.logExecution(b,i,"creation",async c=>{
|
|
90
|
+
let a=await A(e.filePath),{objectKey:s}=await D(c,o,e);return await Be(c,o,s,e.tags,
|
|
91
|
+
r.parameters.tags),{lastModified:a,bucketName:o}})},"createResource"),Jt=n((r,t)=>{
|
|
92
|
+
let{result:e,parameters:o}=r,{objectKey:i,tags:c}=o;if(!e)throw new Ut(b,i);let a=j(
|
|
93
|
+
e.bucketName,i);return z.logExecution(b,a,"updates",async s=>{let p=Xt(s,e,o,t.parameters);
|
|
94
|
+
return await Be(s,e.bucketName,i,c,t.parameters.tags),p})},"updateResource"),Qt=n(
|
|
95
|
+
async r=>{let{result:t,parameters:e}=r;if(!t)return;let o=j(t.bucketName,e.objectKey);
|
|
96
|
+
await z.logExecution(b,o,"deletion",async i=>{await ke(i,t.bucketName,e.objectKey)})},
|
|
97
|
+
"deleteResource"),A=n(async r=>{let{mtime:t}=await Ht(r);return t.getTime()},"ge\
|
|
98
|
+
tLastModifiedTime"),Xt=n(async(r,t,e,o)=>{let i=await A(e.filePath);if(i<=t.lastModified&&
|
|
99
|
+
e.filePath===o.filePath)return t;let{bucketName:c}=t,{objectKey:a}=o;return await D(
|
|
100
|
+
r,c,{...e,objectKey:a}),{lastModified:i,bucketName:c}},"checkObjectUpdates"),Be=n(
|
|
101
|
+
async(r,t,e,o,i)=>{let c=o??{};!Vt(c,i??{})&&await Se(r,t,e,c)},"checkTagUpdates");var we=n(()=>{Yt(d,be())},"registerObjectProvider");import{isBucketService as H}from"@ez4/storage/library";import{attachEntry as tr,linkEntryDependency as rr}from"@ez4/stateful";import{createPermission as or}from"@ez4/aws-function";import{createPolicyDocument as er}from"@ez4/aws-identity";var Ce=n(r=>`arn:aws:s3:::${r}`,"buildBucketArn"),Pe=n(r=>er([{resourceIds:[`arn\
|
|
101
102
|
:aws:s3:::${r}-*`,`arn:aws:s3:::${r}-*/*`],permissions:["s3:ListBucket","s3:PutO\
|
|
102
|
-
bject","s3:GetObject","s3:DeleteObject","s3:HeadObject"]}]),"getPolicyDocument");var
|
|
103
|
-
parameters:
|
|
104
|
-
principal:"s3.amazonaws.com",sourceArn:
|
|
105
|
-
|
|
106
|
-
import{isLinkedContextVpcRequired as
|
|
107
|
-
import{isRoleState as
|
|
108
|
-
import{LogLevel as
|
|
109
|
-
import{MappingServiceName as
|
|
110
|
-
|
|
111
|
-
s3",handler:
|
|
112
|
-
r,e,
|
|
113
|
-
|
|
103
|
+
bject","s3:GetObject","s3:DeleteObject","s3:HeadObject"]}]),"getPolicyDocument");var ve=n((r,t,e)=>{let o=e.bucketName,i=se(o),c=tr(r,{type:f,entryId:i,dependencies:[],
|
|
104
|
+
parameters:e});return t&&(or(r,c,t,{fromService:e.bucketName,getPermission:n(()=>({
|
|
105
|
+
principal:"s3.amazonaws.com",sourceArn:Ce(o)}),"getPermission")}),rr(r,c.entryId,
|
|
106
|
+
t.entryId)),c},"createBucket");import{getFunctionState as lr,tryGetFunctionState as yr}from"@ez4/aws-function";
|
|
107
|
+
import{isLinkedContextVpcRequired as fr,linkServiceContext as dr}from"@ez4/project/library";
|
|
108
|
+
import{isRoleState as he}from"@ez4/aws-identity";import{createLogGroup as gr}from"@ez4/aws-logs";import{createFunction as sr}from"@ez4/aws-function";import{hashObject as pr}from"@ez4/utils";
|
|
109
|
+
import{LogLevel as ur}from"@ez4/project";import{join as nr}from"node:path";import{getDefinitionsObject as ir}from"@ez4/project/library";
|
|
110
|
+
import{MappingServiceName as cr}from"@ez4/aws-function";import{getFunctionBundle as ar}from"@ez4/aws-common";var Ee=n(async(r,t)=>{let{handler:e,listener:o,functionName:i,context:c,debug:a}=r,
|
|
111
|
+
s=ir(t);return ar(cr,{templateFile:nr(import.meta.dirname,"../lib/event.ts"),resourceName:i,
|
|
112
|
+
define:s,filePrefix:"s3",handler:e,listener:o,context:c,debug:a})},"bundleBucket\
|
|
113
|
+
EventFunction");var Oe=n((r,t,e,o)=>{let{handler:i,variables:c,debug:a,architecture:s}=o;return sr(
|
|
114
|
+
r,t,e,{handlerName:"s3EntryPoint",sourceFile:i.sourceFile,functionName:o.functionName,
|
|
115
|
+
description:o.description,logLevel:a?ur.Debug:o.logLevel,architecture:o.architecture,
|
|
114
116
|
runtime:o.runtime,release:o.release,timeout:o.timeout,memory:o.memory,files:o.files,
|
|
115
|
-
tags:o.tags,getFunctionVariables:n(()=>
|
|
116
|
-
ctionVariables"),getFunctionBundle:n(
|
|
117
|
-
"getFunctionBundle"),getFunctionFiles:n(()=>[
|
|
118
|
-
nctionFiles"),getFunctionHash:n(()=>
|
|
119
|
-
h")})},"createBucketEventFunction");import{getServiceName as
|
|
120
|
-
import{toKebabCase as
|
|
121
|
-
16);return`${
|
|
122
|
-
-${
|
|
123
|
-
"Execution role for S3 is missing.")}};import{FunctionDefaults as
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
defaults:
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
listener:E,handler:
|
|
130
|
-
let
|
|
131
|
-
tags:
|
|
132
|
-
context:
|
|
133
|
-
|
|
134
|
-
sourceFile:
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
import{createBucketObject as
|
|
140
|
-
recursive:!0});for(let
|
|
141
|
-
|
|
117
|
+
tags:o.tags,getFunctionVariables:n(()=>c.reduce((p,m)=>({...p,...m}),{}),"getFun\
|
|
118
|
+
ctionVariables"),getFunctionBundle:n(p=>Ee(o,[...p.getDependencies(),...p.getConnections()]),
|
|
119
|
+
"getFunctionBundle"),getFunctionFiles:n(()=>[i.sourceFile,i.dependencies],"getFu\
|
|
120
|
+
nctionFiles"),getFunctionHash:n(()=>pr({architecture:s,debug:a}),"getFunctionHas\
|
|
121
|
+
h")})},"createBucketEventFunction");import{getServiceName as F}from"@ez4/project/library";import{getRandomName as mr}from"@ez4/aws-common";
|
|
122
|
+
import{toKebabCase as I}from"@ez4/utils";var L=n(async(r,t)=>{if(r.globalName)return F(r.globalName,t);let e=F(r,t),o=await mr(
|
|
123
|
+
16);return`${e.substring(0,46)}-${o}`},"getBucketName"),K=n((r,t)=>`${I(r.name)}\
|
|
124
|
+
-${I(t)}`,"getInternalName"),Re=n((r,t,e)=>`${F(r,e)}-${I(t)}`,"getFunctionName");var P=class extends Error{static{n(this,"RoleMissingError")}constructor(){super(
|
|
125
|
+
"Execution role for S3 is missing.")}};import{FunctionDefaults as B}from"@ez4/aws-function";var g;(a=>(a.LogLevel=B.LogLevel,
|
|
126
|
+
a.LogRetention=B.LogRetention,a.Architecture=B.Architecture,a.Runtime=B.Runtime,
|
|
127
|
+
a.Timeout=B.Timeout,a.Memory=B.Memory))(g||={});var je=n((r,t,e,o)=>{if(!t.events)return;if(!o.role||!he(o.role))throw new P;let{
|
|
128
|
+
defaults:i,release:c,tags:a}=e,{runtime:s=i?.runtime??g.Runtime,architecture:p=i?.
|
|
129
|
+
architecture??g.Architecture,logRetention:m=i?.logRetention??g.LogRetention,logLevel:l=i?.
|
|
130
|
+
logLevel??g.LogLevel,memory:v=i?.memory??g.Memory,timeout:$e=g.Timeout,debug:Ge=e.
|
|
131
|
+
debug,variables:Ve,listener:E,handler:S,files:We,vpc:_e}=t.events,U=K(t,S.name),
|
|
132
|
+
w=yr(o,U,e);if(w)return w;let $=Re(t,S.name,e),Ze=o.getDependencyFiles(S.file),Je=gr(
|
|
133
|
+
r,{retention:m,groupName:$,tags:a});return w=Oe(r,o.role,Je,{functionName:$,description:S.
|
|
134
|
+
description,context:t.context,variables:[e.variables,t.variables,Ve],handler:{sourceFile:S.
|
|
135
|
+
file,functionName:S.name,module:S.module,dependencies:Ze},listener:E&&{functionName:E.
|
|
136
|
+
name,sourceFile:E.file,module:E.module},architecture:p,logLevel:l,runtime:s,release:c,
|
|
137
|
+
timeout:$e,memory:v,files:We,debug:Ge,tags:a,vpc:_e}),o.setServiceState(U,e,w),w},
|
|
138
|
+
"prepareEvents"),Le=n((r,t,e,o)=>{if(!t.events)return;if(!o.role||!he(o.role))throw new P;
|
|
139
|
+
let{handler:i}=t.events,c=K(t,i.name),a=lr(o,c,e);dr(r,a.entryId,t.context),a.parameters.
|
|
140
|
+
vpc||(a.parameters.vpc=fr(t.context))},"connectEvents");import{readdir as Sr}from"node:fs/promises";import{join as Ne,relative as Te}from"node:path";
|
|
141
|
+
import{createBucketObject as kr}from"@ez4/aws-bucket";var De=n(async(r,t,e)=>{let o=process.cwd(),i=Ne(o,e),c=await Sr(i,{withFileTypes:!0,
|
|
142
|
+
recursive:!0});for(let a of c){if(!a.isFile())continue;let s=Ne(a.parentPath,a.name);
|
|
143
|
+
kr(r,t,{objectKey:Te(i,s),filePath:Te(o,s)})}},"prepareLocalContent");import{isBucketService as Er}from"@ez4/storage/library";import{getSignedUrl as M}from"@aws-sdk/s3-request-presigner";import{S3Client as br,
|
|
144
|
+
GetObjectCommand as ze,PutObjectCommand as Ae,HeadObjectCommand as Fe,ListObjectsV2Command as xr,
|
|
145
|
+
DeleteObjectCommand as Br,CopyObjectCommand as wr,NoSuchKey as Cr,NotFound as Pr}from"@aws-sdk/client-s3";
|
|
146
|
+
import vr from"mime";var y=new br({}),q;(t=>t.make=n(e=>new class{async stat(o){try{let i=await y.send(
|
|
147
|
+
new Fe({Bucket:e,Key:o})),{ContentType:c="application/octet-stream",ContentLength:a=0,
|
|
148
|
+
Metadata:s}=i;return{type:c,metadata:s,size:a}}catch(i){if(!(i instanceof Pr)&&!(i instanceof
|
|
149
|
+
Cr))throw i;return}}async exists(o){return!!await this.stat(o)}async write(o,i,c={}){
|
|
150
|
+
let{contentType:a=vr.getType(o),headers:s={},metadata:p}=c;await y.send(new Ae({
|
|
151
|
+
Bucket:e,Key:o,Body:i,Metadata:p,CacheControl:s?.cacheControl,Expires:s?.expires,
|
|
152
|
+
...a&&{ContentType:a}}))}async read(o){let c=await(await y.send(new ze({Bucket:e,
|
|
153
|
+
Key:o}))).Body.transformToByteArray();return Buffer.from(c)}async delete(o){await y.
|
|
154
|
+
send(new Br({Bucket:e,Key:o}))}async copy(o,i){o!==i&&await y.send(new wr({Bucket:e,
|
|
155
|
+
CopySource:`${e}/${o}`,Key:i}))}async*scan(){let o;do{let i=await y.send(new xr(
|
|
156
|
+
{ContinuationToken:o,Bucket:e}));for(let c of i.Contents??[])yield{key:c.Key,modifiedAt:c.
|
|
157
|
+
LastModified,size:c.Size};o=i.NextContinuationToken}while(o)}async getStatUrl(o,i){
|
|
158
|
+
let{expiresIn:c}=i,a=new Fe({Bucket:e,Key:o});return M(y,a,{expiresIn:c})}async getWriteUrl(o,i){
|
|
159
|
+
let{expiresIn:c,contentType:a,metadata:s,headers:p={}}=i,m=new Ae({Bucket:e,ContentType:a,
|
|
160
|
+
CacheControl:p?.cacheControl,Expires:p?.expires,Metadata:s,Key:o}),l=["content-t\
|
|
161
|
+
ype"];return p.cacheControl&&l.push("cache-control"),p.expires&&l.push("expires"),
|
|
162
|
+
M(y,m,{signableHeaders:new Set(l),expiresIn:c})}async getReadUrl(o,i){let{expiresIn:c}=i,
|
|
163
|
+
a=new ze({Bucket:e,Key:o});return M(y,a,{expiresIn:c})}},"make"))(q||={});var Ie=n((r,t,e)=>{let o=pe(r,t.name,e),i=o.entryId;return{module:"Client",from:"\
|
|
142
164
|
@ez4/aws-bucket/client",constructor:`@{EZ4_MODULE_IMPORT}.make('${o.parameters.bucketName}\
|
|
143
|
-
')`,dependencyIds:[
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
localPath:a,cors:
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
:
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
165
|
+
')`,dependencyIds:[i],connectionIds:[i]}},"prepareLinkedClient"),Ke=n(async r=>{
|
|
166
|
+
let{service:t,options:e}=r;if(!Er(t)||e.local)return null;let o=await L(t,e);return q.
|
|
167
|
+
make(o)},"prepareEmulatorClient");var Me=n(r=>{let{service:t,options:e,context:o}=r;return H(t)?Ie(o,t,e):null},"p\
|
|
168
|
+
repareLinkedServices"),qe=n(async r=>{let{state:t,service:e,options:o,context:i}=r;
|
|
169
|
+
if(!H(e))return!1;let{localPath:c,autoExpireDays:a,events:s,cors:p}=e,m=await L(
|
|
170
|
+
e,o),l=je(t,e,o,i),v=ve(t,l,{eventsPath:s?.path,tags:o.tags,bucketName:m,autoExpireDays:a,
|
|
171
|
+
localPath:c,cors:p});return i.setServiceState(e,o,v),c&&await De(t,v,c),!0},"pre\
|
|
172
|
+
pareBucketServices"),He=n(r=>{let{state:t,service:e,options:o,context:i}=r;H(e)&&
|
|
173
|
+
Le(t,e,o,i)},"connectBucketServices");import{ServiceType as Or}from"@ez4/storage/library";import{createPolicy as Rr,tryGetPolicy as hr}from"@ez4/aws-identity";
|
|
174
|
+
import{getServiceName as jr}from"@ez4/project/library";var Ue=n(r=>{let{state:t,serviceType:e,options:o}=r;if(e!==Or)return null;let i=jr(
|
|
175
|
+
"",o),c=`${i}-bucket-policy`;return hr(t,c)??Rr(t,{tags:o.tags,policyDocument:Pe(
|
|
176
|
+
i),policyName:c})},"prepareExecutionPolicy");var Ki=n(()=>{Lr(),Nr(),Tr(),Dr(),zr("@ez4/aws-bucket",{"deploy:prepareExecution\
|
|
177
|
+
Policy":Ue,"deploy:prepareLinkedService":Me,"deploy:prepareResources":qe,"deploy\
|
|
178
|
+
:connectResources":He,"emulator:getClient":Ke}),ae(),ge(),we()},"registerTrigger\
|
|
179
|
+
s");import{getRegion as Ar}from"@ez4/aws-identity";var Ui=n(r=>/(.+)\.s3\.(.+)\.amazonaws\.com/i.test(r),"isBucketDomain"),$i=n(async r=>{
|
|
180
|
+
let t=await Ar();return`${r}.s3.${t}.amazonaws.com`},"getBucketDomain");import{attachEntry as Fr}from"@ez4/stateful";import{hashData as Ir}from"@ez4/utils";var Ji=n((r,t,e,o)=>{let i=Ir(k,t.entryId,e.entryId);return Fr(r,{type:k,entryId:i,
|
|
181
|
+
dependencies:[t.entryId,e.entryId],parameters:o})},"createBucketPolicy");var ec=n(r=>r.type===k,"isBucketPolicyState");import{attachEntry as Kr}from"@ez4/stateful";import{hashData as Mr}from"@ez4/utils";var cc=n((r,t,e)=>{let o=e.objectKey,i=Mr(d,t.entryId,o);return Kr(r,{type:d,entryId:i,
|
|
182
|
+
dependencies:[t.entryId],parameters:e})},"createBucketObject");export{x as BucketServiceName,f as BucketServiceType,b as ObjectServiceName,d as ObjectServiceType,
|
|
183
|
+
C as PolicyServiceName,k as PolicyServiceType,Ce as buildBucketArn,ve as createBucket,
|
|
184
|
+
Oe as createBucketEventFunction,cc as createBucketObject,Ji as createBucketPolicy,
|
|
185
|
+
se as createBucketStateId,$i as getBucketDomain,h as getBucketName,Vo as getBucketObjectFiles,
|
|
186
|
+
j as getBucketObjectPath,pe as getBucketState,Pe as getPolicyDocument,Ui as isBucketDomain,
|
|
187
|
+
Go as isBucketObjectState,ec as isBucketPolicyState,Ct as isBucketState,Ki as registerTriggers};
|
|
163
188
|
//# sourceMappingURL=main.mjs.map
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
import type { DeployOptions, EventContext, ContextSource } from '@ez4/project/library';
|
|
1
|
+
import type { DeployOptions, EventContext, ContextSource, EmulateClientEvent } from '@ez4/project/library';
|
|
2
2
|
import type { BucketService } from '@ez4/storage/library';
|
|
3
3
|
export declare const prepareLinkedClient: (context: EventContext, service: BucketService, options: DeployOptions) => ContextSource;
|
|
4
|
+
export declare const prepareEmulatorClient: (event: EmulateClientEvent) => Promise<import("@ez4/storage").Client | null>;
|
package/dist/triggers/utils.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { BucketService } from '@ez4/storage/library';
|
|
2
|
-
import type {
|
|
3
|
-
export declare const getBucketName: (service: BucketService, options:
|
|
2
|
+
import type { CommonOptions } from '@ez4/project/library';
|
|
3
|
+
export declare const getBucketName: (service: BucketService, options: CommonOptions) => Promise<string>;
|
|
4
4
|
export declare const getInternalName: (service: BucketService, suffixName: string) => string;
|
|
5
|
-
export declare const getFunctionName: (service: BucketService, handlerName: string, options:
|
|
5
|
+
export declare const getFunctionName: (service: BucketService, handlerName: string, options: CommonOptions) => string;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ez4/aws-bucket",
|
|
3
3
|
"description": "EZ4: Self-managed AWS S3 bucket provider",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.45.0",
|
|
5
5
|
"author": "Silas B.",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"type": "module",
|
|
@@ -53,15 +53,15 @@
|
|
|
53
53
|
"dependencies": {
|
|
54
54
|
"@aws-sdk/client-s3": "^3.996.0",
|
|
55
55
|
"@aws-sdk/s3-request-presigner": "^3.996.0",
|
|
56
|
-
"@ez4/aws-common": "^0.
|
|
57
|
-
"@ez4/aws-function": "^0.
|
|
58
|
-
"@ez4/aws-identity": "^0.
|
|
59
|
-
"@ez4/aws-logs": "^0.
|
|
60
|
-
"@ez4/common": "^0.
|
|
61
|
-
"@ez4/project": "^0.
|
|
62
|
-
"@ez4/stateful": "^0.
|
|
63
|
-
"@ez4/storage": "^0.
|
|
64
|
-
"@ez4/utils": "^0.
|
|
56
|
+
"@ez4/aws-common": "^0.45.0",
|
|
57
|
+
"@ez4/aws-function": "^0.45.0",
|
|
58
|
+
"@ez4/aws-identity": "^0.45.0",
|
|
59
|
+
"@ez4/aws-logs": "^0.45.0",
|
|
60
|
+
"@ez4/common": "^0.45.0",
|
|
61
|
+
"@ez4/project": "^0.45.0",
|
|
62
|
+
"@ez4/stateful": "^0.45.0",
|
|
63
|
+
"@ez4/storage": "^0.45.0",
|
|
64
|
+
"@ez4/utils": "^0.45.0",
|
|
65
65
|
"mime": "^3.0.0"
|
|
66
66
|
}
|
|
67
67
|
}
|