@ez4/aws-bucket 0.14.0 → 0.15.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/bucket/function/types.d.ts +7 -1
- package/dist/main.cjs +84 -83
- package/dist/main.mjs +98 -95
- package/dist/triggers/utils.d.ts +1 -1
- package/lib/event.ts +103 -0
- package/package.json +9 -8
- package/lib/function.ts +0 -43
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import type { FunctionParameters } from '@ez4/aws-function';
|
|
2
2
|
import type { ExtraSource } from '@ez4/project/library';
|
|
3
|
-
export type
|
|
3
|
+
export type BucketEventEntryPoint = {
|
|
4
|
+
functionName: string;
|
|
5
|
+
sourceFile: string;
|
|
6
|
+
};
|
|
7
|
+
export type BucketEventFunctionParameters = Omit<FunctionParameters, 'getFunctionBundle' | 'sourceFile' | 'handlerName'> & {
|
|
8
|
+
handler: BucketEventEntryPoint;
|
|
9
|
+
listener?: BucketEventEntryPoint;
|
|
4
10
|
extras?: Record<string, ExtraSource>;
|
|
5
11
|
debug?: boolean;
|
|
6
12
|
};
|
package/dist/main.cjs
CHANGED
|
@@ -1,120 +1,121 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
typeof t=="object"||typeof t=="function")for(let n of
|
|
3
|
-
|
|
4
|
-
enumerable:!0}):r,e)),
|
|
5
|
-
ObjectServiceType:()=>
|
|
6
|
-
createBucket:()=>M,createBucketEventFunction:()=>H,createBucketObject:()=>
|
|
7
|
-
getBucketDomain:()=>
|
|
8
|
-
getBucketState:()=>
|
|
9
|
-
isBucketObjectState:()=>
|
|
10
|
-
module.exports=
|
|
11
|
-
ct=require("@ez4/storage/library"),at=require("@ez4/project/library");var ue=require("@ez4/aws-common");var ne=require("@ez4/aws-common"),z=require("@ez4/aws-function"),k=require("@ez4/utils");var p=require("@ez4/aws-common"),c=require("@aws-sdk/client-s3");var i="AWS:S3/Bucket",
|
|
1
|
+
"use strict";var gt=Object.create;var j=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var St=Object.getOwnPropertyNames;var kt=Object.getPrototypeOf,bt=Object.prototype.hasOwnProperty;var Pt=(e,t)=>{for(var r in t)j(e,r,{get:t[r],enumerable:!0})},W=(e,t,r,o)=>{if(t&&
|
|
2
|
+
typeof t=="object"||typeof t=="function")for(let n of St(t))!bt.call(e,n)&&n!==r&&
|
|
3
|
+
j(e,n,{get:()=>t[n],enumerable:!(o=dt(t,n))||o.enumerable});return e};var xt=(e,t,r)=>(r=e!=null?gt(kt(e)):{},W(t||!e||!e.__esModule?j(r,"default",{value:e,
|
|
4
|
+
enumerable:!0}):r,e)),Bt=e=>W(j({},"__esModule",{value:!0}),e);var Zt={};Pt(Zt,{BucketServiceName:()=>i,BucketServiceType:()=>u,ObjectServiceName:()=>g,
|
|
5
|
+
ObjectServiceType:()=>l,PolicyServiceName:()=>S,PolicyServiceType:()=>f,buildBucketArn:()=>q,
|
|
6
|
+
createBucket:()=>M,createBucketEventFunction:()=>H,createBucketObject:()=>Wt,createBucketPolicy:()=>Gt,
|
|
7
|
+
getBucketDomain:()=>_t,getBucketName:()=>R,getBucketObjectFiles:()=>At,getBucketObjectPath:()=>E,
|
|
8
|
+
getBucketState:()=>jt,getBucketStateId:()=>b,getPolicyDocument:()=>K,isBucketDomain:()=>Ut,
|
|
9
|
+
isBucketObjectState:()=>zt,isBucketPolicyState:()=>Vt,isBucketState:()=>fe,registerTriggers:()=>$t});
|
|
10
|
+
module.exports=Bt(Zt);var ot=require("@ez4/aws-common"),nt=require("@ez4/aws-identity"),st=require("@ez4/aws-function"),
|
|
11
|
+
ct=require("@ez4/storage/library"),at=require("@ez4/project/library");var ue=require("@ez4/aws-common");var ne=require("@ez4/aws-common"),z=require("@ez4/aws-function"),k=require("@ez4/utils");var p=require("@ez4/aws-common"),c=require("@aws-sdk/client-s3");var i="AWS:S3/Bucket",u="aws:s3.bucket";var y=new c.S3Client({}),Z=async e=>(p.Logger.logFetch(i,e),!(await y.send(new c.ListObjectsV2Command(
|
|
12
12
|
{Bucket:e,MaxKeys:1}))).Contents?.length),J=async e=>{let{bucketName:t}=e;return p.Logger.
|
|
13
|
-
logCreate(i,t),await
|
|
14
|
-
Q=async e=>{p.Logger.logDelete(i,e),await
|
|
15
|
-
X=async(e,t)=>{p.Logger.logTag(i,e),await
|
|
13
|
+
logCreate(i,t),await y.send(new c.CreateBucketCommand({Bucket:t})),{bucketName:t}},
|
|
14
|
+
Q=async e=>{p.Logger.logDelete(i,e),await y.send(new c.DeleteBucketCommand({Bucket:e}))},
|
|
15
|
+
X=async(e,t)=>{p.Logger.logTag(i,e),await y.send(new c.PutBucketTaggingCommand({
|
|
16
16
|
Bucket:e,Tagging:{TagSet:(0,p.getTagList)({...t,ManagedBy:"EZ4"})}}))},Y=async(e,t)=>{
|
|
17
|
-
p.Logger.logUpdate(i,`${e} CORS`),await
|
|
17
|
+
p.Logger.logUpdate(i,`${e} CORS`),await y.send(new c.PutBucketCorsCommand({Bucket:e,
|
|
18
18
|
CORSConfiguration:{CORSRules:[{ID:"ID0",AllowedOrigins:t.allowOrigins,AllowedMethods:t.
|
|
19
19
|
allowMethods,AllowedHeaders:t.allowHeaders,ExposeHeaders:t.exposeHeaders,MaxAgeSeconds:t.
|
|
20
|
-
maxAge}]}}))},ee=async e=>{p.Logger.logDelete(i,`${e} CORS`),await
|
|
21
|
-
{Bucket:e}))},te=async(e,t)=>{p.Logger.logCreate(i,`${e} lifecycle`),await
|
|
20
|
+
maxAge}]}}))},ee=async e=>{p.Logger.logDelete(i,`${e} CORS`),await y.send(new c.DeleteBucketCorsCommand(
|
|
21
|
+
{Bucket:e}))},te=async(e,t)=>{p.Logger.logCreate(i,`${e} lifecycle`),await y.send(
|
|
22
22
|
new c.PutBucketLifecycleConfigurationCommand({Bucket:e,LifecycleConfiguration:{Rules:[
|
|
23
23
|
{ID:"ID0",Status:c.ExpirationStatus.Enabled,Filter:{Prefix:"*"},Expiration:{Days:t}}]}}))},
|
|
24
|
-
re=async e=>{p.Logger.logDelete(i,`${e} lifecycle`),await
|
|
24
|
+
re=async e=>{p.Logger.logDelete(i,`${e} lifecycle`),await y.send(new c.DeleteBucketLifecycleCommand(
|
|
25
25
|
{Bucket:e}))},oe=async(e,t)=>{p.Logger.logUpdate(i,`${e} event notifications`);let{
|
|
26
|
-
functionArn:r,eventsPath:o,eventsType:n}=t;await
|
|
26
|
+
functionArn:r,eventsPath:o,eventsType:n}=t;await y.send(new c.PutBucketNotificationConfigurationCommand(
|
|
27
27
|
{Bucket:e,SkipDestinationValidation:!0,NotificationConfiguration:{...r&&{LambdaFunctionConfigurations:[
|
|
28
28
|
{Id:"ID0",LambdaFunctionArn:r,Events:n,...o&&{Filter:{Key:{FilterRules:[{Name:"p\
|
|
29
|
-
refix",Value:o}]}}}}]}}}))};var se=()=>({equals:
|
|
30
|
-
result&&e.result.bucketName===t.result?.bucketName,
|
|
29
|
+
refix",Value:o}]}}}}]}}}))};var se=()=>({equals:wt,create:ce,replace:Et,preview:Rt,update:vt,delete:Ct}),wt=(e,t)=>!!e.
|
|
30
|
+
result&&e.result.bucketName===t.result?.bucketName,Rt=async(e,t)=>{let r={...e.parameters,
|
|
31
31
|
dependencies:e.dependencies},o={...t.parameters,dependencies:t.dependencies},n=(0,k.deepCompare)(
|
|
32
|
-
r,o);if(n.counts)return{...n,name:r.bucketName}},
|
|
32
|
+
r,o);if(n.counts)return{...n,name:r.bucketName}},Et=async(e,t,r)=>{if(t.result)throw new ne.ReplaceResourceError(
|
|
33
33
|
i,e.entryId,t.entryId);return ce(e,r)},ce=async(e,t)=>{let r=e.parameters,o=(0,z.tryGetFunctionArn)(
|
|
34
34
|
t),{bucketName:n}=await J(r);await ae(n,r,void 0),await ie(n,r,void 0),await pe(
|
|
35
35
|
n,r.tags,void 0);let s={eventsPath:r.eventsPath,functionArn:o};return await me(n,
|
|
36
|
-
s,{}),{bucketName:n,functionArn:o}},
|
|
37
|
-
if(!o)return;let s=o.bucketName,a=(0,z.tryGetFunctionArn)(r),
|
|
36
|
+
s,{}),{bucketName:n,functionArn:o}},vt=async(e,t,r)=>{let{result:o,parameters:n}=e;
|
|
37
|
+
if(!o)return;let s=o.bucketName,a=(0,z.tryGetFunctionArn)(r),m=t.result?.functionArn;
|
|
38
38
|
await ae(s,n,t.parameters),await ie(s,n,t.parameters),await pe(s,n.tags,t.parameters.
|
|
39
|
-
tags);let
|
|
40
|
-
functionArn:
|
|
39
|
+
tags);let B={eventsPath:n.eventsPath,functionArn:a},w={eventsPath:t.parameters.eventsPath,
|
|
40
|
+
functionArn:m};return await me(s,B,w),{...o,functionArn:a}},Ct=async e=>{let t=e.
|
|
41
41
|
result;t&&await Z(t.bucketName)&&await Q(t.bucketName)},ae=async(e,t,r)=>{if(!(t.
|
|
42
42
|
cors&&r?.cors&&(0,k.deepEqual)(t.cors,r.cors))){if(t.cors)return Y(e,t.cors);if(r?.
|
|
43
43
|
cors)return ee(e)}},ie=async(e,t,r)=>{if(t.autoExpireDays!==r?.autoExpireDays){if(t.
|
|
44
44
|
autoExpireDays)return te(e,t.autoExpireDays);if(r?.autoExpireDays)return re(e)}},
|
|
45
45
|
pe=async(e,t,r)=>{let o=t??{};!(0,k.deepEqual)(o,r??{})&&await X(e,o)},me=async(e,t,r)=>{
|
|
46
46
|
!(0,k.deepEqual)(t,r)&&await oe(e,{eventsType:["s3:ObjectCreated:*","s3:ObjectRe\
|
|
47
|
-
moved:*"],...t})};var ye=()=>{(0,ue.registerProvider)(
|
|
48
|
-
e,b(t));if(!fe(r))throw new
|
|
49
|
-
let o=r.getDependencies(
|
|
50
|
-
e,t,"bucketName");return o.bucketName};var
|
|
47
|
+
moved:*"],...t})};var ye=()=>{(0,ue.registerProvider)(u,se())};var xe=require("@ez4/aws-common");var ke=require("@ez4/aws-common");var O=require("@ez4/stateful"),le=require("@ez4/aws-common"),h=require("@ez4/utils");var fe=e=>e.type===u,b=e=>(0,h.hashData)(u,(0,h.toKebabCase)(e)),jt=(e,t)=>{let r=(0,O.getEntry)(
|
|
48
|
+
e,b(t));if(!fe(r))throw new O.EntryNotFoundError(r.entryId);return r},R=(e,t,r)=>{
|
|
49
|
+
let o=r.getDependencies(u).at(0)?.result;if(!o?.bucketName)throw new le.IncompleteResourceError(
|
|
50
|
+
e,t,"bucketName");return o.bucketName};var A=require("@ez4/aws-common"),P=require("@aws-sdk/client-s3");var S="AWS:S3/Policy",f="aws:s3.policy";var ge=new P.S3Client({}),de=async e=>{let{bucketName:t,role:r}=e;return A.Logger.
|
|
51
51
|
logCreate(S,t),await ge.send(new P.PutBucketPolicyCommand({Bucket:t,Policy:JSON.
|
|
52
|
-
stringify(r)})),{bucketName:t}},Se=async e=>{
|
|
53
|
-
new P.DeleteBucketPolicyCommand({Bucket:e}))};var be=()=>({equals:
|
|
54
|
-
result&&e.result.bucketName===t.result?.bucketName,
|
|
52
|
+
stringify(r)})),{bucketName:t}},Se=async e=>{A.Logger.logDelete(S,e),await ge.send(
|
|
53
|
+
new P.DeleteBucketPolicyCommand({Bucket:e}))};var be=()=>({equals:Ot,create:Pe,replace:Tt,preview:ht,update:Nt,delete:Dt}),Ot=(e,t)=>!!e.
|
|
54
|
+
result&&e.result.bucketName===t.result?.bucketName,ht=async()=>{},Tt=async(e,t,r)=>{
|
|
55
55
|
if(t.result)throw new ke.ReplaceResourceError(S,e.entryId,t.entryId);return Pe(e,
|
|
56
|
-
r)},Pe=async(e,t)=>{let r=e.parameters,o=
|
|
57
|
-
{bucketName:o,role:n}),{bucketName:o}},
|
|
58
|
-
t&&await Se(t.bucketName)};var Be=()=>{(0,xe.registerProvider)(f,be())};var Ne=require("@ez4/aws-common");var Ce=require("node:fs/promises"),je=require("@ez4/aws-common"),
|
|
59
|
-
d=require("@aws-sdk/client-s3");var g="AWS:S3/Object",
|
|
60
|
-
lastModified:r?.lastModified,objectKey:r?.objectKey}));var
|
|
61
|
-
g,
|
|
56
|
+
r)},Pe=async(e,t)=>{let r=e.parameters,o=R(S,"policy",t),n=await r.getRole(t);return await de(
|
|
57
|
+
{bucketName:o,role:n}),{bucketName:o}},Nt=async()=>{},Dt=async e=>{let t=e.result;
|
|
58
|
+
t&&await Se(t.bucketName)};var Be=()=>{(0,xe.registerProvider)(f,be())};var Ne=require("@ez4/aws-common");var Ce=require("node:fs/promises"),je=require("@ez4/aws-common"),T=require("@ez4/utils");var x=require("@ez4/aws-common"),we=require("node:fs"),Re=xt(require("mime"),1),
|
|
59
|
+
d=require("@aws-sdk/client-s3");var g="AWS:S3/Object",l="aws:s3.object";var zt=e=>e.type===l,E=(e,t)=>`${e}/${t}`,At=e=>e.getDependencies(l).map(({result:r})=>({
|
|
60
|
+
lastModified:r?.lastModified,objectKey:r?.objectKey}));var F=new d.S3Client({}),I=async(e,t)=>{let{objectKey:r,filePath:o}=t;x.Logger.logCreate(
|
|
61
|
+
g,E(e,r));let n=Re.default.getType(o);return await F.send(new d.PutObjectCommand(
|
|
62
62
|
{Bucket:e,Key:r,Body:(0,we.createReadStream)(o),...n&&{ContentType:n}})),{objectKey:r}},
|
|
63
|
-
Ee=async(e,t,r)=>{x.Logger.logTag(g,
|
|
63
|
+
Ee=async(e,t,r)=>{x.Logger.logTag(g,E(e,t)),await F.send(new d.PutObjectTaggingCommand(
|
|
64
64
|
{Bucket:e,Key:t,Tagging:{TagSet:(0,x.getTagList)({...r,ManagedBy:"EZ4"})}}))},ve=async(e,t)=>{
|
|
65
|
-
x.Logger.logDelete(g,
|
|
66
|
-
result&&e.result.objectKey===t.result?.objectKey,
|
|
67
|
-
o=t.parameters,n=(0,
|
|
65
|
+
x.Logger.logDelete(g,E(e,t)),await F.send(new d.DeleteObjectCommand({Bucket:e,Key:t}))};var Oe=()=>({equals:Ft,create:he,replace:Lt,preview:It,update:qt,delete:Kt}),Ft=(e,t)=>!!e.
|
|
66
|
+
result&&e.result.objectKey===t.result?.objectKey,It=async(e,t)=>{let r=e.parameters,
|
|
67
|
+
o=t.parameters,n=(0,T.deepCompare)({...r,dependencies:e.dependencies,lastModified:await L(
|
|
68
68
|
r.filePath)},{...o,dependencies:t.dependencies,lastModified:e.result?.lastModified});
|
|
69
|
-
if(n.counts)return{...n,name:r.objectKey}},
|
|
70
|
-
g,e.entryId,t.entryId);return he(e,r)},he=async(e,t)=>{let r=e.parameters,o=
|
|
69
|
+
if(n.counts)return{...n,name:r.objectKey}},Lt=async(e,t,r)=>{if(t.result)throw new je.ReplaceResourceError(
|
|
70
|
+
g,e.entryId,t.entryId);return he(e,r)},he=async(e,t)=>{let r=e.parameters,o=R(g,
|
|
71
71
|
"bucket",t),n=await L(r.filePath),{objectKey:s}=await I(o,r);return await Te(o,s,
|
|
72
|
-
r.tags,e.parameters.tags),{lastModified:n,bucketName:o,objectKey:s}},
|
|
73
|
-
let{result:r,parameters:o}=e;if(!r)return;let{bucketName:n,objectKey:s}=r,a=
|
|
74
|
-
o,t.parameters);return await Te(n,s,o.tags,t.parameters.tags),a},
|
|
72
|
+
r.tags,e.parameters.tags),{lastModified:n,bucketName:o,objectKey:s}},qt=async(e,t)=>{
|
|
73
|
+
let{result:r,parameters:o}=e;if(!r)return;let{bucketName:n,objectKey:s}=r,a=Mt(r,
|
|
74
|
+
o,t.parameters);return await Te(n,s,o.tags,t.parameters.tags),a},Kt=async e=>{let t=e.
|
|
75
75
|
result;t&&await ve(t.bucketName,t.objectKey)},L=async e=>{let{mtime:t}=await(0,Ce.stat)(
|
|
76
|
-
e);return t.getTime()},
|
|
76
|
+
e);return t.getTime()},Mt=async(e,t,r)=>{let o=await L(t.filePath);if(o<=e.lastModified&&
|
|
77
77
|
t.filePath===r.filePath)return e;let{bucketName:n,objectKey:s}=e;return await I(
|
|
78
78
|
n,{...t,objectKey:s}),{lastModified:o,bucketName:n,objectKey:s}},Te=async(e,t,r,o)=>{
|
|
79
|
-
let n=r??{};!(0,
|
|
80
|
-
V=require("@ez4/aws-function");var
|
|
79
|
+
let n=r??{};!(0,T.deepEqual)(n,o??{})&&await Ee(e,t,n)};var De=()=>{(0,Ne.registerProvider)(l,Oe())};var G=require("@ez4/aws-identity"),D=require("@ez4/storage/library"),Ze=require("@ez4/project/library"),
|
|
80
|
+
V=require("@ez4/aws-function");var Ae=require("@ez4/aws-function"),N=require("@ez4/stateful"),Fe=require("@ez4/utils");var ze=require("@ez4/aws-identity"),q=e=>`arn:aws:s3:::${e}`,K=e=>(0,ze.createPolicyDocument)(
|
|
81
81
|
[{resourceIds:[`arn:aws:s3:::${e}-*`,`arn:aws:s3:::${e}-*/*`],permissions:["s3:L\
|
|
82
|
-
istBucket","s3:PutObject","s3:GetObject","s3:DeleteObject"]}]);var M=(e,t,r)=>{let o=(0,
|
|
83
|
-
e,{type:
|
|
84
|
-
e,s,t,{getPermission:()=>({principal:"s3.amazonaws.com",sourceArn:q(o)})}),(0,
|
|
82
|
+
istBucket","s3:PutObject","s3:GetObject","s3:DeleteObject"]}]);var M=(e,t,r)=>{let o=(0,Fe.toKebabCase)(r.bucketName),n=b(r.bucketName),s=(0,N.attachEntry)(
|
|
83
|
+
e,{type:u,entryId:n,dependencies:[],parameters:{...r,bucketName:o}});return t&&((0,Ae.createPermission)(
|
|
84
|
+
e,s,t,{getPermission:()=>({principal:"s3.amazonaws.com",sourceArn:q(o)})}),(0,N.linkDependency)(
|
|
85
85
|
e,s.entryId,t.entryId)),s};var He=require("@ez4/aws-function");var Ie=require("node:path"),Le=require("@ez4/project/library"),qe=require("@ez4/aws-function"),
|
|
86
|
-
Ke=require("@ez4/aws-common"),Me=async(e,t)=>{let
|
|
87
|
-
e);return(0,Ke.bundleFunction)(qe.MappingServiceName,
|
|
88
|
-
__dirname,"../lib/
|
|
89
|
-
|
|
90
|
-
functionName,sourceFile:r.sourceFile,
|
|
91
|
-
timeout:r.timeout,memory:r.memory,tags:r.tags,getFunctionBundle:o=>{let n=o.
|
|
92
|
-
return Me(n,r)}});var $=require("@ez4/project/library"),$e=require("@ez4/aws-common"),Ue=require("@ez4/utils"),
|
|
93
|
-
U=async(e,t)=>{let r=(0,$.getServiceName)(e,
|
|
94
|
-
16);return`${r}-${o}`},_=(e,t,r)=>`${(0,$.getServiceName)(
|
|
95
|
-
t)}`;var _e=require("node:fs/promises"),
|
|
96
|
-
Ve=async(e,t,r)=>{let o=(0,
|
|
97
|
-
recursive:!0});for(let s of n){if(!s.isFile())continue;let a=(0,
|
|
98
|
-
s.name),
|
|
99
|
-
module:"Client"});var
|
|
86
|
+
Ke=require("@ez4/aws-common"),Me=async(e,t)=>{let{extras:r,debug:o,handler:n,listener:s}=t,
|
|
87
|
+
a=(0,Le.getDefinitionsObject)(e);return(0,Ke.bundleFunction)(qe.MappingServiceName,
|
|
88
|
+
{templateFile:(0,Ie.join)(__dirname,"../lib/event.ts"),filePrefix:"s3",define:{...a},
|
|
89
|
+
handler:n,listener:s,extras:r,debug:o})};var H=(e,t,r)=>(0,He.createFunction)(e,t,{handlerName:"s3EntryPoint",functionName:r.
|
|
90
|
+
functionName,sourceFile:r.handler.sourceFile,description:r.description,variables:r.
|
|
91
|
+
variables,timeout:r.timeout,memory:r.memory,tags:r.tags,getFunctionBundle:o=>{let n=o.
|
|
92
|
+
getDependencies();return Me(n,r)}});var $=require("@ez4/project/library"),$e=require("@ez4/aws-common"),Ue=require("@ez4/utils"),
|
|
93
|
+
U=async(e,t)=>{if(e.globalName)return e.globalName;let r=(0,$.getServiceName)(e,
|
|
94
|
+
t).substring(0,46),o=await(0,$e.getRandomName)(16);return`${r}-${o}`},_=(e,t,r)=>`${(0,$.getServiceName)(
|
|
95
|
+
e,r)}-${(0,Ue.toKebabCase)(t)}`;var _e=require("node:fs/promises"),v=require("node:path"),Ge=require("@ez4/aws-bucket"),
|
|
96
|
+
Ve=async(e,t,r)=>{let o=(0,v.join)(process.cwd(),r),n=await(0,_e.readdir)(o,{withFileTypes:!0,
|
|
97
|
+
recursive:!0});for(let s of n){if(!s.isFile())continue;let a=(0,v.join)(s.parentPath,
|
|
98
|
+
s.name),m=(0,v.relative)(o,a);(0,Ge.createBucketObject)(e,t,{objectKey:m,filePath:a})}};var We=e=>({entryId:b(e),constructor:`make('${e}')`,from:"@ez4/aws-bucket/client",
|
|
99
|
+
module:"Client"});var C=class extends Error{constructor(){super("Execution role for S3 is missing.")}};var Je=async e=>{let{service:t,options:r}=e;if(!(0,D.isBucketService)(t))return null;
|
|
100
100
|
let o=await U(t,r);return We(o)},Qe=async e=>{let{state:t,service:r,role:o,options:n}=e;
|
|
101
|
-
if(!(0,
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
r)||!r.extras||!r.events)return;if(!o||!(0,G.isRoleState)(o))throw new
|
|
106
|
-
events.handler,a=_(r,s.name,n),
|
|
107
|
-
t,
|
|
108
|
-
a=_(t,s.name,o);return(0,V.getFunction)(
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
101
|
+
if(!(0,D.isBucketService)(r))return;if(!o||!(0,G.isRoleState)(o))throw new C;let{
|
|
102
|
+
localPath:s,autoExpireDays:a,events:m,cors:B}=r,w=await U(r,n),lt=Ht(t,r,o,n),ft=M(
|
|
103
|
+
t,lt,{eventsPath:m?.path,bucketName:w,autoExpireDays:a,localPath:s,cors:B});s&&await Ve(
|
|
104
|
+
t,ft,s)},Xe=e=>{let{state:t,service:r,role:o,options:n}=e;if(!(0,D.isBucketService)(
|
|
105
|
+
r)||!r.extras||!r.events)return;if(!o||!(0,G.isRoleState)(o))throw new C;let s=r.
|
|
106
|
+
events.handler,a=_(r,s.name,n),m=(0,V.getFunction)(t,o,a);m&&(0,Ze.linkServiceExtras)(
|
|
107
|
+
t,m.entryId,r.extras)},Ht=(e,t,r,o)=>{if(!t.events)return;let n=t.events,{handler:s,
|
|
108
|
+
listener:a}=t.events,m=_(t,s.name,o),B=n.timeout??30,w=n.memory??192;return(0,V.getFunction)(
|
|
109
|
+
e,r,m)??H(e,r,{functionName:m,description:s.description,timeout:B,memory:w,extras:t.
|
|
110
|
+
extras,debug:o.debug,variables:{...t.variables},handler:{functionName:s.name,sourceFile:s.
|
|
111
|
+
file},...a&&{listener:{functionName:a.name,sourceFile:a.file}}})};var Ye=require("@ez4/project/library"),et=require("@ez4/aws-identity");var tt=e=>{let{state:t,options:r}=e,o=(0,Ye.getServiceName)("",r);return(0,et.createPolicy)(
|
|
112
|
+
t,{policyName:`${o}-bucket-policy`,policyDocument:K(o)})};var rt=!1,$t=()=>{rt||((0,ot.registerTriggers)(),(0,nt.registerTriggers)(),(0,st.registerTriggers)(),
|
|
112
113
|
(0,ct.registerTriggers)(),(0,at.createTrigger)("@ez4/aws-bucket",{"deploy:prepar\
|
|
113
114
|
eExecutionPolicy":tt,"deploy:prepareLinkedService":Je,"deploy:prepareResources":Qe,
|
|
114
|
-
"deploy:connectResources":Xe}),ye(),Be(),De(),rt=!0)};var it=require("@ez4/aws-identity"),
|
|
115
|
-
e),
|
|
116
|
-
e,{type:f,entryId:n,dependencies:[t.entryId,r.entryId],parameters:o})};var
|
|
117
|
-
e,{type:
|
|
115
|
+
"deploy:connectResources":Xe}),ye(),Be(),De(),rt=!0)};var it=require("@ez4/aws-identity"),Ut=e=>/(.+)\.s3\.(.+)\.amazonaws\.com/i.test(
|
|
116
|
+
e),_t=async e=>{let t=await(0,it.getRegion)();return`${e}.s3.${t}.amazonaws.com`};var pt=require("@ez4/stateful"),mt=require("@ez4/utils");var Gt=(e,t,r,o)=>{let n=(0,mt.hashData)(f,t.entryId,r.entryId);return(0,pt.attachEntry)(
|
|
117
|
+
e,{type:f,entryId:n,dependencies:[t.entryId,r.entryId],parameters:o})};var Vt=e=>e.type===f;var ut=require("@ez4/stateful"),yt=require("@ez4/utils");var Wt=(e,t,r)=>{let o=r.objectKey,n=(0,yt.hashData)(l,t.entryId,o);return(0,ut.attachEntry)(
|
|
118
|
+
e,{type:l,entryId:n,dependencies:[t.entryId],parameters:r})};0&&(module.exports={BucketServiceName,BucketServiceType,ObjectServiceName,ObjectServiceType,
|
|
118
119
|
PolicyServiceName,PolicyServiceType,buildBucketArn,createBucket,createBucketEventFunction,
|
|
119
120
|
createBucketObject,createBucketPolicy,getBucketDomain,getBucketName,getBucketObjectFiles,
|
|
120
121
|
getBucketObjectPath,getBucketState,getBucketStateId,getPolicyDocument,isBucketDomain,
|
package/dist/main.mjs
CHANGED
|
@@ -1,110 +1,113 @@
|
|
|
1
|
-
import{registerTriggers as
|
|
2
|
-
import{registerTriggers as
|
|
3
|
-
import{createTrigger as
|
|
4
|
-
import{deepCompare as
|
|
5
|
-
ListObjectsV2Command as
|
|
6
|
-
PutBucketCorsCommand as
|
|
7
|
-
DeleteBucketLifecycleCommand as
|
|
8
|
-
ExpirationStatus as Ae}from"@aws-sdk/client-s3";var a="AWS:S3/Bucket",u="aws:s3.bucket";var
|
|
9
|
-
Contents?.length),T=async e=>{let{bucketName:t}=e;return
|
|
10
|
-
send(new
|
|
11
|
-
new
|
|
12
|
-
Tagging:{TagSet:
|
|
13
|
-
CORS`),await
|
|
1
|
+
import{registerTriggers as $t}from"@ez4/aws-common";import{registerTriggers as Ut}from"@ez4/aws-identity";
|
|
2
|
+
import{registerTriggers as _t}from"@ez4/aws-function";import{registerTriggers as Gt}from"@ez4/storage/library";
|
|
3
|
+
import{createTrigger as Vt}from"@ez4/project/library";import{registerProvider as $e}from"@ez4/aws-common";import{ReplaceResourceError as Fe}from"@ez4/aws-common";import{tryGetFunctionArn as q}from"@ez4/aws-function";
|
|
4
|
+
import{deepCompare as Ie,deepEqual as B}from"@ez4/utils";import{getTagList as Re,Logger as p}from"@ez4/aws-common";import{S3Client as Ee,
|
|
5
|
+
ListObjectsV2Command as ve,CreateBucketCommand as Ce,DeleteBucketCommand as je,PutBucketTaggingCommand as Oe,
|
|
6
|
+
PutBucketCorsCommand as he,DeleteBucketCorsCommand as Te,PutBucketLifecycleConfigurationCommand as Ne,
|
|
7
|
+
DeleteBucketLifecycleCommand as De,PutBucketNotificationConfigurationCommand as ze,
|
|
8
|
+
ExpirationStatus as Ae}from"@aws-sdk/client-s3";var a="AWS:S3/Bucket",u="aws:s3.bucket";var m=new Ee({}),h=async e=>(p.logFetch(a,e),!(await m.send(new ve({Bucket:e,MaxKeys:1}))).
|
|
9
|
+
Contents?.length),T=async e=>{let{bucketName:t}=e;return p.logCreate(a,t),await m.
|
|
10
|
+
send(new Ce({Bucket:t})),{bucketName:t}},N=async e=>{p.logDelete(a,e),await m.send(
|
|
11
|
+
new je({Bucket:e}))},D=async(e,t)=>{p.logTag(a,e),await m.send(new Oe({Bucket:e,
|
|
12
|
+
Tagging:{TagSet:Re({...t,ManagedBy:"EZ4"})}}))},z=async(e,t)=>{p.logUpdate(a,`${e}\
|
|
13
|
+
CORS`),await m.send(new he({Bucket:e,CORSConfiguration:{CORSRules:[{ID:"ID0",AllowedOrigins:t.
|
|
14
14
|
allowOrigins,AllowedMethods:t.allowMethods,AllowedHeaders:t.allowHeaders,ExposeHeaders:t.
|
|
15
|
-
exposeHeaders,MaxAgeSeconds:t.maxAge}]}}))},
|
|
16
|
-
await
|
|
17
|
-
await
|
|
18
|
-
Enabled,Filter:{Prefix:"*"},Expiration:{Days:t}}]}}))},I=async e=>{
|
|
19
|
-
`${e} lifecycle`),await
|
|
20
|
-
`${e} event notifications`);let{functionArn:r,eventsPath:o,eventsType:n}=t;await
|
|
21
|
-
send(new
|
|
15
|
+
exposeHeaders,MaxAgeSeconds:t.maxAge}]}}))},A=async e=>{p.logDelete(a,`${e} CORS`),
|
|
16
|
+
await m.send(new Te({Bucket:e}))},F=async(e,t)=>{p.logCreate(a,`${e} lifecycle`),
|
|
17
|
+
await m.send(new Ne({Bucket:e,LifecycleConfiguration:{Rules:[{ID:"ID0",Status:Ae.
|
|
18
|
+
Enabled,Filter:{Prefix:"*"},Expiration:{Days:t}}]}}))},I=async e=>{p.logDelete(a,
|
|
19
|
+
`${e} lifecycle`),await m.send(new De({Bucket:e}))},L=async(e,t)=>{p.logUpdate(a,
|
|
20
|
+
`${e} event notifications`);let{functionArn:r,eventsPath:o,eventsType:n}=t;await m.
|
|
21
|
+
send(new ze({Bucket:e,SkipDestinationValidation:!0,NotificationConfiguration:{...r&&
|
|
22
22
|
{LambdaFunctionConfigurations:[{Id:"ID0",LambdaFunctionArn:r,Events:n,...o&&{Filter:{
|
|
23
|
-
Key:{FilterRules:[{Name:"prefix",Value:o}]}}}}]}}}))};var K=()=>({equals:
|
|
24
|
-
result&&e.result.bucketName===t.result?.bucketName,
|
|
25
|
-
dependencies:e.dependencies},o={...t.parameters,dependencies:t.dependencies},n=
|
|
26
|
-
r,o);if(n.counts)return{...n,name:r.bucketName}},
|
|
23
|
+
Key:{FilterRules:[{Name:"prefix",Value:o}]}}}}]}}}))};var K=()=>({equals:Le,create:M,replace:Ke,preview:qe,update:Me,delete:He}),Le=(e,t)=>!!e.
|
|
24
|
+
result&&e.result.bucketName===t.result?.bucketName,qe=async(e,t)=>{let r={...e.parameters,
|
|
25
|
+
dependencies:e.dependencies},o={...t.parameters,dependencies:t.dependencies},n=Ie(
|
|
26
|
+
r,o);if(n.counts)return{...n,name:r.bucketName}},Ke=async(e,t,r)=>{if(t.result)throw new Fe(
|
|
27
27
|
a,e.entryId,t.entryId);return M(e,r)},M=async(e,t)=>{let r=e.parameters,o=q(t),{
|
|
28
28
|
bucketName:n}=await T(r);await H(n,r,void 0),await $(n,r,void 0),await U(n,r.tags,
|
|
29
29
|
void 0);let s={eventsPath:r.eventsPath,functionArn:o};return await _(n,s,{}),{bucketName:n,
|
|
30
|
-
functionArn:o}},
|
|
31
|
-
bucketName,c=q(r),
|
|
32
|
-
t.parameters),await U(s,n.tags,t.parameters.tags);let
|
|
33
|
-
functionArn:c},
|
|
34
|
-
s,
|
|
30
|
+
functionArn:o}},Me=async(e,t,r)=>{let{result:o,parameters:n}=e;if(!o)return;let s=o.
|
|
31
|
+
bucketName,c=q(r),i=t.result?.functionArn;await H(s,n,t.parameters),await $(s,n,
|
|
32
|
+
t.parameters),await U(s,n.tags,t.parameters.tags);let d={eventsPath:n.eventsPath,
|
|
33
|
+
functionArn:c},S={eventsPath:t.parameters.eventsPath,functionArn:i};return await _(
|
|
34
|
+
s,d,S),{...o,functionArn:c}},He=async e=>{let t=e.result;t&&await h(t.bucketName)&&
|
|
35
35
|
await N(t.bucketName)},H=async(e,t,r)=>{if(!(t.cors&&r?.cors&&B(t.cors,r.cors))){
|
|
36
|
-
if(t.cors)return z(e,t.cors);if(r?.cors)return
|
|
37
|
-
r?.autoExpireDays){if(t.autoExpireDays)return
|
|
36
|
+
if(t.cors)return z(e,t.cors);if(r?.cors)return A(e)}},$=async(e,t,r)=>{if(t.autoExpireDays!==
|
|
37
|
+
r?.autoExpireDays){if(t.autoExpireDays)return F(e,t.autoExpireDays);if(r?.autoExpireDays)
|
|
38
38
|
return I(e)}},U=async(e,t,r)=>{let o=t??{};!B(o,r??{})&&await D(e,o)},_=async(e,t,r)=>{
|
|
39
|
-
!B(t,r)&&await L(e,{eventsType:["s3:ObjectCreated:*","s3:ObjectRemoved:*"],...t})};var G=()=>{
|
|
40
|
-
import{hashData as
|
|
41
|
-
r.entryId);return r},
|
|
42
|
-
bucketName)throw new
|
|
43
|
-
DeleteBucketPolicyCommand as
|
|
44
|
-
await W.send(new
|
|
45
|
-
V.logDelete(g,e),await W.send(new
|
|
46
|
-
result&&e.result.bucketName===t.result?.bucketName,
|
|
47
|
-
if(t.result)throw new
|
|
48
|
-
parameters,o=
|
|
49
|
-
{bucketName:o}},
|
|
50
|
-
import{deepCompare as
|
|
51
|
-
import
|
|
52
|
-
DeleteObjectCommand as
|
|
53
|
-
lastModified:r?.lastModified,objectKey:r?.objectKey}));var R=new
|
|
54
|
-
r));let n=
|
|
55
|
-
{ContentType:n}})),{objectKey:r}},ee=async(e,t,r)=>{w.logTag(f,
|
|
56
|
-
new
|
|
57
|
-
w.logDelete(f,
|
|
58
|
-
result&&e.result.objectKey===t.result?.objectKey,
|
|
59
|
-
o=t.parameters,n=
|
|
39
|
+
!B(t,r)&&await L(e,{eventsType:["s3:ObjectCreated:*","s3:ObjectRemoved:*"],...t})};var G=()=>{$e(u,K())};import{registerProvider as st}from"@ez4/aws-common";import{ReplaceResourceError as Ye}from"@ez4/aws-common";import{EntryNotFoundError as Ue,getEntry as _e}from"@ez4/stateful";import{IncompleteResourceError as Ge}from"@ez4/aws-common";
|
|
40
|
+
import{hashData as Ve,toKebabCase as We}from"@ez4/utils";var Ze=e=>e.type===u,k=e=>Ve(u,We(e)),br=(e,t)=>{let r=_e(e,k(t));if(!Ze(r))throw new Ue(
|
|
41
|
+
r.entryId);return r},P=(e,t,r)=>{let o=r.getDependencies(u).at(0)?.result;if(!o?.
|
|
42
|
+
bucketName)throw new Ge(e,t,"bucketName");return o.bucketName};import{Logger as V}from"@ez4/aws-common";import{S3Client as Je,PutBucketPolicyCommand as Qe,
|
|
43
|
+
DeleteBucketPolicyCommand as Xe}from"@aws-sdk/client-s3";var g="AWS:S3/Policy",l="aws:s3.policy";var W=new Je({}),Z=async e=>{let{bucketName:t,role:r}=e;return V.logCreate(g,t),
|
|
44
|
+
await W.send(new Qe({Bucket:t,Policy:JSON.stringify(r)})),{bucketName:t}},J=async e=>{
|
|
45
|
+
V.logDelete(g,e),await W.send(new Xe({Bucket:e}))};var Q=()=>({equals:et,create:X,replace:rt,preview:tt,update:ot,delete:nt}),et=(e,t)=>!!e.
|
|
46
|
+
result&&e.result.bucketName===t.result?.bucketName,tt=async()=>{},rt=async(e,t,r)=>{
|
|
47
|
+
if(t.result)throw new Ye(g,e.entryId,t.entryId);return X(e,r)},X=async(e,t)=>{let r=e.
|
|
48
|
+
parameters,o=P(g,"policy",t),n=await r.getRole(t);return await Z({bucketName:o,role:n}),
|
|
49
|
+
{bucketName:o}},ot=async()=>{},nt=async e=>{let t=e.result;t&&await J(t.bucketName)};var Y=()=>{st(l,Q())};import{registerProvider as wt}from"@ez4/aws-common";import{stat as lt}from"node:fs/promises";import{ReplaceResourceError as ft}from"@ez4/aws-common";
|
|
50
|
+
import{deepCompare as gt,deepEqual as dt}from"@ez4/utils";import{getTagList as ct,Logger as w}from"@ez4/aws-common";import{createReadStream as at}from"node:fs";
|
|
51
|
+
import it from"mime";import{S3Client as pt,PutObjectCommand as mt,PutObjectTaggingCommand as ut,
|
|
52
|
+
DeleteObjectCommand as yt}from"@aws-sdk/client-s3";var f="AWS:S3/Object",y="aws:s3.object";var Lr=e=>e.type===y,x=(e,t)=>`${e}/${t}`,qr=e=>e.getDependencies(y).map(({result:r})=>({
|
|
53
|
+
lastModified:r?.lastModified,objectKey:r?.objectKey}));var R=new pt({}),E=async(e,t)=>{let{objectKey:r,filePath:o}=t;w.logCreate(f,x(e,
|
|
54
|
+
r));let n=it.getType(o);return await R.send(new mt({Bucket:e,Key:r,Body:at(o),...n&&
|
|
55
|
+
{ContentType:n}})),{objectKey:r}},ee=async(e,t,r)=>{w.logTag(f,x(e,t)),await R.send(
|
|
56
|
+
new ut({Bucket:e,Key:t,Tagging:{TagSet:ct({...r,ManagedBy:"EZ4"})}}))},te=async(e,t)=>{
|
|
57
|
+
w.logDelete(f,x(e,t)),await R.send(new yt({Bucket:e,Key:t}))};var re=()=>({equals:St,create:oe,replace:bt,preview:kt,update:Pt,delete:xt}),St=(e,t)=>!!e.
|
|
58
|
+
result&&e.result.objectKey===t.result?.objectKey,kt=async(e,t)=>{let r=e.parameters,
|
|
59
|
+
o=t.parameters,n=gt({...r,dependencies:e.dependencies,lastModified:await v(r.filePath)},
|
|
60
60
|
{...o,dependencies:t.dependencies,lastModified:e.result?.lastModified});if(n.counts)
|
|
61
|
-
return{...n,name:r.objectKey}},
|
|
62
|
-
t.entryId);return oe(e,r)},oe=async(e,t)=>{let r=e.parameters,o=
|
|
61
|
+
return{...n,name:r.objectKey}},bt=async(e,t,r)=>{if(t.result)throw new ft(f,e.entryId,
|
|
62
|
+
t.entryId);return oe(e,r)},oe=async(e,t)=>{let r=e.parameters,o=P(f,"bucket",t),
|
|
63
63
|
n=await v(r.filePath),{objectKey:s}=await E(o,r);return await ne(o,s,r.tags,e.parameters.
|
|
64
|
-
tags),{lastModified:n,bucketName:o,objectKey:s}},
|
|
65
|
-
if(!r)return;let{bucketName:n,objectKey:s}=r,c=
|
|
66
|
-
n,s,o.tags,t.parameters.tags),c},
|
|
67
|
-
t.objectKey)},v=async e=>{let{mtime:t}=await
|
|
64
|
+
tags),{lastModified:n,bucketName:o,objectKey:s}},Pt=async(e,t)=>{let{result:r,parameters:o}=e;
|
|
65
|
+
if(!r)return;let{bucketName:n,objectKey:s}=r,c=Bt(r,o,t.parameters);return await ne(
|
|
66
|
+
n,s,o.tags,t.parameters.tags),c},xt=async e=>{let t=e.result;t&&await te(t.bucketName,
|
|
67
|
+
t.objectKey)},v=async e=>{let{mtime:t}=await lt(e);return t.getTime()},Bt=async(e,t,r)=>{
|
|
68
68
|
let o=await v(t.filePath);if(o<=e.lastModified&&t.filePath===r.filePath)return e;
|
|
69
69
|
let{bucketName:n,objectKey:s}=e;return await E(n,{...t,objectKey:s}),{lastModified:o,
|
|
70
|
-
bucketName:n,objectKey:s}},ne=async(e,t,r,o)=>{let n=r??{};!
|
|
71
|
-
e,t,n)};var se=()=>{
|
|
72
|
-
import{linkServiceExtras as
|
|
73
|
-
import{toKebabCase as
|
|
74
|
-
::${e}`,ae=e=>
|
|
75
|
-
"s3:ListBucket","s3:PutObject","s3:GetObject","s3:DeleteObject"]}]);var ie=(e,t,r)=>{let o=
|
|
76
|
-
dependencies:[],parameters:{...r,bucketName:o}});return t&&(
|
|
77
|
-
principal:"s3.amazonaws.com",sourceArn:ce(o)})}),
|
|
78
|
-
import{MappingServiceName as
|
|
79
|
-
var pe=async(e,t)=>{let
|
|
80
|
-
import.meta.dirname,"../lib/
|
|
81
|
-
|
|
82
|
-
sourceFile,
|
|
83
|
-
memory,tags:r.tags,getFunctionBundle:o=>{let n=o.getDependencies();return pe(
|
|
84
|
-
import{
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
70
|
+
bucketName:n,objectKey:s}},ne=async(e,t,r,o)=>{let n=r??{};!dt(n,o??{})&&await ee(
|
|
71
|
+
e,t,n)};var se=()=>{wt(y,re())};import{isRoleState as ge}from"@ez4/aws-identity";import{isBucketService as O}from"@ez4/storage/library";
|
|
72
|
+
import{linkServiceExtras as qt}from"@ez4/project/library";import{getFunction as de}from"@ez4/aws-function";import{createPermission as Et}from"@ez4/aws-function";import{attachEntry as vt,linkDependency as Ct}from"@ez4/stateful";
|
|
73
|
+
import{toKebabCase as jt}from"@ez4/utils";import{createPolicyDocument as Rt}from"@ez4/aws-identity";var ce=e=>`arn:aws:s3:\
|
|
74
|
+
::${e}`,ae=e=>Rt([{resourceIds:[`arn:aws:s3:::${e}-*`,`arn:aws:s3:::${e}-*/*`],permissions:[
|
|
75
|
+
"s3:ListBucket","s3:PutObject","s3:GetObject","s3:DeleteObject"]}]);var ie=(e,t,r)=>{let o=jt(r.bucketName),n=k(r.bucketName),s=vt(e,{type:u,entryId:n,
|
|
76
|
+
dependencies:[],parameters:{...r,bucketName:o}});return t&&(Et(e,s,t,{getPermission:()=>({
|
|
77
|
+
principal:"s3.amazonaws.com",sourceArn:ce(o)})}),Ct(e,s.entryId,t.entryId)),s};import{createFunction as Dt}from"@ez4/aws-function";import{join as Ot}from"node:path";import{getDefinitionsObject as ht}from"@ez4/project/library";
|
|
78
|
+
import{MappingServiceName as Tt}from"@ez4/aws-function";import{bundleFunction as Nt}from"@ez4/aws-common";
|
|
79
|
+
var pe=async(e,t)=>{let{extras:r,debug:o,handler:n,listener:s}=t,c=ht(e);return Nt(
|
|
80
|
+
Tt,{templateFile:Ot(import.meta.dirname,"../lib/event.ts"),filePrefix:"s3",define:{
|
|
81
|
+
...c},handler:n,listener:s,extras:r,debug:o})};var me=(e,t,r)=>Dt(e,t,{handlerName:"s3EntryPoint",functionName:r.functionName,sourceFile:r.
|
|
82
|
+
handler.sourceFile,description:r.description,variables:r.variables,timeout:r.timeout,
|
|
83
|
+
memory:r.memory,tags:r.tags,getFunctionBundle:o=>{let n=o.getDependencies();return pe(
|
|
84
|
+
n,r)}});import{getServiceName as ue}from"@ez4/project/library";import{getRandomName as zt}from"@ez4/aws-common";
|
|
85
|
+
import{toKebabCase as At}from"@ez4/utils";var C=async(e,t)=>{if(e.globalName)return e.
|
|
86
|
+
globalName;let r=ue(e,t).substring(0,46),o=await zt(16);return`${r}-${o}`},j=(e,t,r)=>`${ue(
|
|
87
|
+
e,r)}-${At(t)}`;import{readdir as Ft}from"node:fs/promises";import{join as ye,relative as It}from"node:path";
|
|
88
|
+
import{createBucketObject as Lt}from"@ez4/aws-bucket";var le=async(e,t,r)=>{let o=ye(
|
|
89
|
+
process.cwd(),r),n=await Ft(o,{withFileTypes:!0,recursive:!0});for(let s of n){if(!s.
|
|
90
|
+
isFile())continue;let c=ye(s.parentPath,s.name),i=It(o,c);Lt(e,t,{objectKey:i,filePath:c})}};var fe=e=>({entryId:k(e),constructor:`make('${e}')`,from:"@ez4/aws-bucket/client",
|
|
91
|
+
module:"Client"});var b=class extends Error{constructor(){super("Execution role for S3 is missing.")}};var Se=async e=>{let{service:t,options:r}=e;if(!O(t))return null;let o=await C(t,
|
|
90
92
|
r);return fe(o)},ke=async e=>{let{state:t,service:r,role:o,options:n}=e;if(!O(r))
|
|
91
|
-
return;if(!o||!ge(o))throw new
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
e,r,
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
93
|
+
return;if(!o||!ge(o))throw new b;let{localPath:s,autoExpireDays:c,events:i,cors:d}=r,
|
|
94
|
+
S=await C(r,n),Be=Kt(t,r,o,n),we=ie(t,Be,{eventsPath:i?.path,bucketName:S,autoExpireDays:c,
|
|
95
|
+
localPath:s,cors:d});s&&await le(t,we,s)},be=e=>{let{state:t,service:r,role:o,options:n}=e;
|
|
96
|
+
if(!O(r)||!r.extras||!r.events)return;if(!o||!ge(o))throw new b;let s=r.events.handler,
|
|
97
|
+
c=j(r,s.name,n),i=de(t,o,c);i&&qt(t,i.entryId,r.extras)},Kt=(e,t,r,o)=>{if(!t.events)
|
|
98
|
+
return;let n=t.events,{handler:s,listener:c}=t.events,i=j(t,s.name,o),d=n.timeout??
|
|
99
|
+
30,S=n.memory??192;return de(e,r,i)??me(e,r,{functionName:i,description:s.description,
|
|
100
|
+
timeout:d,memory:S,extras:t.extras,debug:o.debug,variables:{...t.variables},handler:{
|
|
101
|
+
functionName:s.name,sourceFile:s.file},...c&&{listener:{functionName:c.name,sourceFile:c.
|
|
102
|
+
file}}})};import{getServiceName as Mt}from"@ez4/project/library";import{createPolicy as Ht}from"@ez4/aws-identity";var Pe=e=>{let{state:t,options:r}=e,o=Mt("",r);return Ht(t,{policyName:`${o}-buc\
|
|
103
|
+
ket-policy`,policyDocument:ae(o)})};var xe=!1,cn=()=>{xe||($t(),Ut(),_t(),Gt(),Vt("@ez4/aws-bucket",{"deploy:prepare\
|
|
101
104
|
ExecutionPolicy":Pe,"deploy:prepareLinkedService":Se,"deploy:prepareResources":ke,
|
|
102
|
-
"deploy:connectResources":be}),G(),Y(),se(),xe=!0)};import{getRegion as
|
|
103
|
-
test(e),
|
|
104
|
-
dependencies:[t.entryId,r.entryId],parameters:o})};var
|
|
105
|
+
"deploy:connectResources":be}),G(),Y(),se(),xe=!0)};import{getRegion as Wt}from"@ez4/aws-identity";var mn=e=>/(.+)\.s3\.(.+)\.amazonaws\.com/i.
|
|
106
|
+
test(e),un=async e=>{let t=await Wt();return`${e}.s3.${t}.amazonaws.com`};import{attachEntry as Zt}from"@ez4/stateful";import{hashData as Jt}from"@ez4/utils";var dn=(e,t,r,o)=>{let n=Jt(l,t.entryId,r.entryId);return Zt(e,{type:l,entryId:n,
|
|
107
|
+
dependencies:[t.entryId,r.entryId],parameters:o})};var bn=e=>e.type===l;import{attachEntry as Qt}from"@ez4/stateful";import{hashData as Xt}from"@ez4/utils";var Rn=(e,t,r)=>{let o=r.objectKey,n=Xt(y,t.entryId,o);return Qt(e,{type:y,entryId:n,
|
|
105
108
|
dependencies:[t.entryId],parameters:r})};export{a as BucketServiceName,u as BucketServiceType,f as ObjectServiceName,y as ObjectServiceType,
|
|
106
109
|
g as PolicyServiceName,l as PolicyServiceType,ce as buildBucketArn,ie as createBucket,
|
|
107
|
-
me as createBucketEventFunction,
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
110
|
+
me as createBucketEventFunction,Rn as createBucketObject,dn as createBucketPolicy,
|
|
111
|
+
un as getBucketDomain,P as getBucketName,qr as getBucketObjectFiles,x as getBucketObjectPath,
|
|
112
|
+
br as getBucketState,k as getBucketStateId,ae as getPolicyDocument,mn as isBucketDomain,
|
|
113
|
+
Lr as isBucketObjectState,bn as isBucketPolicyState,Ze as isBucketState,cn as registerTriggers};
|
package/dist/triggers/utils.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { DeployOptions } from '@ez4/project/library';
|
|
2
2
|
import { BucketService } from '@ez4/storage/library';
|
|
3
|
-
export declare const
|
|
3
|
+
export declare const getBucketName: (service: BucketService, options: DeployOptions) => Promise<string>;
|
|
4
4
|
export declare const getFunctionName: (service: BucketService, handlerName: string, options: DeployOptions) => string;
|
package/lib/event.ts
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import type { S3Event, Context } from 'aws-lambda';
|
|
2
|
+
import type { Bucket } from '@ez4/storage';
|
|
3
|
+
import type { Service } from '@ez4/common';
|
|
4
|
+
|
|
5
|
+
import { BucketEventType } from '@ez4/storage';
|
|
6
|
+
import { ServiceEventType } from '@ez4/common';
|
|
7
|
+
|
|
8
|
+
declare const __EZ4_CONTEXT: object;
|
|
9
|
+
|
|
10
|
+
declare function handle(event: Bucket.Event, context: object): Promise<any>;
|
|
11
|
+
declare function dispatch(event: Service.Event<Bucket.Event>, context: object): Promise<void>;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Entrypoint to handle S3 notifications.
|
|
15
|
+
*/
|
|
16
|
+
export async function s3EntryPoint(event: S3Event, context: Context): Promise<void> {
|
|
17
|
+
let currentRequest: Bucket.Event | undefined;
|
|
18
|
+
|
|
19
|
+
const request = {
|
|
20
|
+
requestId: context.awsRequestId
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
try {
|
|
24
|
+
await onBegin(request);
|
|
25
|
+
|
|
26
|
+
for (const record of event.Records) {
|
|
27
|
+
const eventType = getKnownEventType(record.eventName);
|
|
28
|
+
|
|
29
|
+
const { bucket, object } = record.s3;
|
|
30
|
+
|
|
31
|
+
currentRequest = {
|
|
32
|
+
...request,
|
|
33
|
+
eventType,
|
|
34
|
+
bucketName: bucket.name,
|
|
35
|
+
objectSize: object.size,
|
|
36
|
+
objectKey: object.key
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
await onReady(currentRequest);
|
|
40
|
+
|
|
41
|
+
await handle(currentRequest, __EZ4_CONTEXT);
|
|
42
|
+
}
|
|
43
|
+
} catch (error) {
|
|
44
|
+
await onError(error, currentRequest ?? request);
|
|
45
|
+
} finally {
|
|
46
|
+
await onEnd(request);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const getKnownEventType = (eventName: string) => {
|
|
51
|
+
if (eventName.startsWith('ObjectCreated:')) {
|
|
52
|
+
return BucketEventType.Create;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (eventName.startsWith('ObjectRemoved:')) {
|
|
56
|
+
return BucketEventType.Delete;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
throw new Error(`Event type ${eventName} isn't supported.`);
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const onBegin = async (request: Partial<Bucket.Incoming>) => {
|
|
63
|
+
return dispatch(
|
|
64
|
+
{
|
|
65
|
+
type: ServiceEventType.Begin,
|
|
66
|
+
request
|
|
67
|
+
},
|
|
68
|
+
__EZ4_CONTEXT
|
|
69
|
+
);
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
const onReady = async (request: Partial<Bucket.Incoming>) => {
|
|
73
|
+
return dispatch(
|
|
74
|
+
{
|
|
75
|
+
type: ServiceEventType.Ready,
|
|
76
|
+
request
|
|
77
|
+
},
|
|
78
|
+
__EZ4_CONTEXT
|
|
79
|
+
);
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const onError = async (error: Error, request: Partial<Bucket.Incoming>) => {
|
|
83
|
+
console.error(error);
|
|
84
|
+
|
|
85
|
+
return dispatch(
|
|
86
|
+
{
|
|
87
|
+
type: ServiceEventType.Error,
|
|
88
|
+
request,
|
|
89
|
+
error
|
|
90
|
+
},
|
|
91
|
+
__EZ4_CONTEXT
|
|
92
|
+
);
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const onEnd = async (request: Partial<Bucket.Incoming>) => {
|
|
96
|
+
return dispatch(
|
|
97
|
+
{
|
|
98
|
+
type: ServiceEventType.End,
|
|
99
|
+
request
|
|
100
|
+
},
|
|
101
|
+
__EZ4_CONTEXT
|
|
102
|
+
);
|
|
103
|
+
};
|
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.15.0",
|
|
5
5
|
"author": "Silas B.",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"type": "module",
|
|
@@ -48,13 +48,14 @@
|
|
|
48
48
|
"dependencies": {
|
|
49
49
|
"@aws-sdk/client-s3": "^3.758.0",
|
|
50
50
|
"@aws-sdk/s3-request-presigner": "^3.758.0",
|
|
51
|
-
"@ez4/aws-common": "^0.
|
|
52
|
-
"@ez4/aws-function": "^0.
|
|
53
|
-
"@ez4/aws-identity": "^0.
|
|
54
|
-
"@ez4/
|
|
55
|
-
"@ez4/
|
|
56
|
-
"@ez4/
|
|
57
|
-
"@ez4/
|
|
51
|
+
"@ez4/aws-common": "^0.15.0",
|
|
52
|
+
"@ez4/aws-function": "^0.15.0",
|
|
53
|
+
"@ez4/aws-identity": "^0.15.0",
|
|
54
|
+
"@ez4/common": "^0.15.0",
|
|
55
|
+
"@ez4/project": "^0.15.0",
|
|
56
|
+
"@ez4/stateful": "^0.15.0",
|
|
57
|
+
"@ez4/storage": "^0.15.0",
|
|
58
|
+
"@ez4/utils": "^0.15.0",
|
|
58
59
|
"mime": "^3.0.0"
|
|
59
60
|
}
|
|
60
61
|
}
|
package/lib/function.ts
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import type { S3Event, Context } from 'aws-lambda';
|
|
2
|
-
import { BucketEvent, BucketEventType } from '@ez4/storage';
|
|
3
|
-
|
|
4
|
-
declare function next(event: BucketEvent, context: object): Promise<any>;
|
|
5
|
-
|
|
6
|
-
declare const __EZ4_CONTEXT: object;
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Entrypoint to handle S3 notifications.
|
|
10
|
-
*/
|
|
11
|
-
export async function s3EntryPoint(event: S3Event, context: Context): Promise<void> {
|
|
12
|
-
for (const record of event.Records) {
|
|
13
|
-
const eventType = getKnownEventType(record.eventName);
|
|
14
|
-
|
|
15
|
-
if (!eventType) {
|
|
16
|
-
throw new Error(`Event type ${eventType} isn't supported.`);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const { bucket, object } = record.s3;
|
|
20
|
-
|
|
21
|
-
const request = {
|
|
22
|
-
requestId: context.awsRequestId,
|
|
23
|
-
bucketName: bucket.name,
|
|
24
|
-
objectSize: object.size,
|
|
25
|
-
objectKey: object.key,
|
|
26
|
-
eventType
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
await next(request, __EZ4_CONTEXT);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const getKnownEventType = (eventName: string) => {
|
|
34
|
-
if (eventName.startsWith('ObjectCreated:')) {
|
|
35
|
-
return BucketEventType.Create;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
if (eventName.startsWith('ObjectRemoved:')) {
|
|
39
|
-
return BucketEventType.Delete;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
return undefined;
|
|
43
|
-
};
|