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