@allthings/cloud-toolkit 3.0.2 → 3.1.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/lib.cjs.js +17 -0
- package/dist/lib.esm.js +18 -1
- package/dist/lib.umd.min.js +1 -1
- package/dist/src/aws/sqs.d.ts +6 -1
- package/package.json +11 -11
package/dist/lib.cjs.js
CHANGED
|
@@ -1086,6 +1086,22 @@ const sendMessage = async (sqsClient, config, queueUrl, message, fifoSettings =
|
|
|
1086
1086
|
return undefined;
|
|
1087
1087
|
}
|
|
1088
1088
|
};
|
|
1089
|
+
const sendBatchMessages = async (sqsClient, config, queueUrl, queueEntries) => {
|
|
1090
|
+
try {
|
|
1091
|
+
const sendMessageBatchCommand = new clientSqs.SendMessageBatchCommand({
|
|
1092
|
+
Entries: queueEntries,
|
|
1093
|
+
QueueUrl: queueUrl,
|
|
1094
|
+
});
|
|
1095
|
+
const result = await sqsClient.send(sendMessageBatchCommand);
|
|
1096
|
+
return { failed: result.Failed, successful: result.Successful };
|
|
1097
|
+
}
|
|
1098
|
+
catch (error) {
|
|
1099
|
+
if (config.logger) {
|
|
1100
|
+
config.logger.error(error);
|
|
1101
|
+
}
|
|
1102
|
+
return { failed: undefined, successful: undefined };
|
|
1103
|
+
}
|
|
1104
|
+
};
|
|
1089
1105
|
const sqs = (userConfig) => {
|
|
1090
1106
|
const { clientConfig, ...config } = {
|
|
1091
1107
|
...DEFAULT_AWS_CONFIGURATION,
|
|
@@ -1096,6 +1112,7 @@ const sqs = (userConfig) => {
|
|
|
1096
1112
|
deleteQueueItem: (queueUrl, receiptHandle) => deleteQueueItem(sqsClient, config, queueUrl, receiptHandle),
|
|
1097
1113
|
getQueueItems: (queueUrl, maxNumberOfMessages) => getQueueItems(sqsClient, config, queueUrl, maxNumberOfMessages),
|
|
1098
1114
|
getQueueUrl: (queueName) => getQueueUrl(sqsClient, config, queueName),
|
|
1115
|
+
sendBatchMessages: (queueUrl, queueEntries) => sendBatchMessages(sqsClient, config, queueUrl, queueEntries),
|
|
1099
1116
|
sendMessage: (queueUrl, message, fifoSettings, messageAttributes, messageDelay) => sendMessage(sqsClient, config, queueUrl, message, fifoSettings, messageAttributes, messageDelay),
|
|
1100
1117
|
};
|
|
1101
1118
|
};
|
package/dist/lib.esm.js
CHANGED
|
@@ -8,7 +8,7 @@ import { LambdaClient, InvokeCommand } from '@aws-sdk/client-lambda';
|
|
|
8
8
|
import { SSMClient, GetParametersCommand, GetParameterCommand } from '@aws-sdk/client-ssm';
|
|
9
9
|
import { SESv2Client, SendEmailCommand } from '@aws-sdk/client-sesv2';
|
|
10
10
|
import { createTransport } from 'nodemailer';
|
|
11
|
-
import { SQSClient, SendMessageCommand, GetQueueUrlCommand, ReceiveMessageCommand, DeleteMessageCommand } from '@aws-sdk/client-sqs';
|
|
11
|
+
import { SQSClient, SendMessageCommand, SendMessageBatchCommand, GetQueueUrlCommand, ReceiveMessageCommand, DeleteMessageCommand } from '@aws-sdk/client-sqs';
|
|
12
12
|
import { format, createLogger, transports } from 'winston';
|
|
13
13
|
export { Logger } from 'winston';
|
|
14
14
|
|
|
@@ -1064,6 +1064,22 @@ const sendMessage = async (sqsClient, config, queueUrl, message, fifoSettings =
|
|
|
1064
1064
|
return undefined;
|
|
1065
1065
|
}
|
|
1066
1066
|
};
|
|
1067
|
+
const sendBatchMessages = async (sqsClient, config, queueUrl, queueEntries) => {
|
|
1068
|
+
try {
|
|
1069
|
+
const sendMessageBatchCommand = new SendMessageBatchCommand({
|
|
1070
|
+
Entries: queueEntries,
|
|
1071
|
+
QueueUrl: queueUrl,
|
|
1072
|
+
});
|
|
1073
|
+
const result = await sqsClient.send(sendMessageBatchCommand);
|
|
1074
|
+
return { failed: result.Failed, successful: result.Successful };
|
|
1075
|
+
}
|
|
1076
|
+
catch (error) {
|
|
1077
|
+
if (config.logger) {
|
|
1078
|
+
config.logger.error(error);
|
|
1079
|
+
}
|
|
1080
|
+
return { failed: undefined, successful: undefined };
|
|
1081
|
+
}
|
|
1082
|
+
};
|
|
1067
1083
|
const sqs = (userConfig) => {
|
|
1068
1084
|
const { clientConfig, ...config } = {
|
|
1069
1085
|
...DEFAULT_AWS_CONFIGURATION,
|
|
@@ -1074,6 +1090,7 @@ const sqs = (userConfig) => {
|
|
|
1074
1090
|
deleteQueueItem: (queueUrl, receiptHandle) => deleteQueueItem(sqsClient, config, queueUrl, receiptHandle),
|
|
1075
1091
|
getQueueItems: (queueUrl, maxNumberOfMessages) => getQueueItems(sqsClient, config, queueUrl, maxNumberOfMessages),
|
|
1076
1092
|
getQueueUrl: (queueName) => getQueueUrl(sqsClient, config, queueName),
|
|
1093
|
+
sendBatchMessages: (queueUrl, queueEntries) => sendBatchMessages(sqsClient, config, queueUrl, queueEntries),
|
|
1077
1094
|
sendMessage: (queueUrl, message, fifoSettings, messageAttributes, messageDelay) => sendMessage(sqsClient, config, queueUrl, message, fifoSettings, messageAttributes, messageDelay),
|
|
1078
1095
|
};
|
|
1079
1096
|
};
|
package/dist/lib.umd.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import*as e from"querystring";import*as t from"zlib";import*as n from"crypto";import{DynamoDBClient as o}from"@aws-sdk/client-dynamodb";import{DynamoDBDocumentClient as a,UpdateCommand as r,ScanCommand as s,QueryCommand as i,PutCommand as c,GetCommand as l,DeleteCommand as p,BatchWriteCommand as d}from"@aws-sdk/lib-dynamodb";import u from"bottleneck";import{LambdaClient as m,InvokeCommand as g}from"@aws-sdk/client-lambda";import{SSMClient as h,GetParametersCommand as y,GetParameterCommand as f}from"@aws-sdk/client-ssm";import{SESv2Client as v,SendEmailCommand as x}from"@aws-sdk/client-sesv2";import{createTransport as j}from"nodemailer";import{SQSClient as b,SendMessageCommand as w,GetQueueUrlCommand as C,ReceiveMessageCommand as I,DeleteMessageCommand as N}from"@aws-sdk/client-sqs";import{format as S,createLogger as k,transports as T}from"winston";export{Logger}from"winston";const q=(e,t,n)=>{const{requestId:o}=e.requestContext,a=n.name&&"string"==typeof n.name?n.name.replace(/([A-Z])([A-Z])([a-z])|([a-z])([A-Z])/g,"$1$4 $2$3$5"):"Error",r=n.message||"",s=n.statusCode?` ${n.statusCode}`:"";return"ClientError"===n.name||n.statusCode>=400&&n.statusCode<500?t.respondTo({html:`<html><body><strong>${a}${s}</strong>: ${r}<br/>Request ID: ${o}</body></html>`,json:{error:n.name,message:r,requestId:o}},n.statusCode||400):t.respondTo({html:`<html><body>An internal server error occurred.<br/>Request ID: ${o}</body></html>`,json:{error:"Internal server error",message:"An internal server error occurred",requestId:o}},500)};class M extends Error{name="ClientError";statusCode=400;constructor(e,t,n=400){super(String(e)),this.name=t||this.name,this.statusCode=n}}class E extends Error{name="ServerError";statusCode=500;constructor(e,t,n=500){super(String(e)),this.name=t||this.name,this.statusCode=n}}const A=async(e,t,...n)=>e.reduce(async(e,t)=>t(await e,...n),Promise.resolve(t)),R=e=>{return e.isBase64Encoded&&"string"==typeof e.body?{...e,body:(t=e.body,Buffer.from(t,"base64").toString("utf8"))}:e;var t},$=e=>{const t=e.indexOf("="),n=-1!==t,o=n&&e.slice(0,Math.max(0,t)).trim(),a=n&&e.substr(t+1,e.length).trim(),r=a&&'"'===a[0]?a.slice(1,-1):a;return o?{[o]:r?decodeURIComponent(r):""}:{}},L=e=>{return{...e,cookies:(t=e.headers?.cookie||"",t.split(/; */).reduce((e,t)=>({...e,...$(t)}),{}))};var t},P=e=>({...e,hostname:e.headers?.host||void 0}),O=e=>{try{return JSON.parse(e)}catch{return{}}},D=e=>{const{headers:t,body:n}=e;return t["content-type"]&&"application/json"===t["content-type"].split(";").shift()&&"string"==typeof n?{...e,body:O(n)}:e},H=new Map([["invocationCount",0]]),z=e=>{const t=Number(H.get("invocationCount"));return{...e,meta:{...e.meta,coldStart:!t,invocationCount:H.set("invocationCount",t+1).get("invocationCount")}}},U=({headers:e={},...t})=>({...t,headers:Object.keys(e).reduce((n,o)=>{const a=o.toLowerCase();return"aws"===t.provider&&Reflect.has(n,a)&&"content-type"===a&&"application/json"===e[o]?n:{...n,[a]:e[o]}},{})}),B=e=>({...e,method:e.httpMethod??e.requestContext?.http?.method??"",path:e.path??e.requestContext?.http?.path??"",provider:"aws",query:e.queryStringParameters||{},source:e.requestContext?"api-gateway":e.source}),_=e=>({...e,timestamp:Date.now()}),K=t=>{const{headers:n,body:o}=t;return n["content-type"]&&"application/x-www-form-urlencoded"===n["content-type"].split(";").shift()&&"string"==typeof o?{...t,body:e.parse(o)}:t};const Q=(e,t,n,o)=>(Object.assign(t.headers,{[n]:o}),e),V=(e,t="",n=200,{headers:o={},...a}={},r)=>Object.freeze({...e,body:t||"",headers:{...e?.headers,"content-type":r,...o},statusCode:n,...a}),W=(e,t,n,o,a)=>V(e,n,o,a,"text/html"),Y=(e,t,n,o,a)=>V(e,(e=>{const t="string"==typeof e?e.trim():e;return"string"==typeof e&&["{",'"'].includes(t[0])&&["}",'"'].includes(t.at(-1))?t:JSON.stringify(e)})(n),o,a,"application/json"),F=["application/activity+json","application/alto-costmap+json","application/alto-costmapfilter+json","application/alto-directory+json","application/alto-endpointcost+json","application/alto-endpointcostparams+json","application/alto-endpointprop+json","application/alto-endpointpropparams+json","application/alto-error+json","application/alto-networkmap+json","application/alto-networkmapfilter+json","application/atom+xml","application/calendar+json","application/coap-group+json","application/csvm+json","application/dart","application/dicom+json","application/ecmascript","application/fhir+json","application/fido.trusted-apps+json","application/geo+json","application/javascript","application/jf2feed+json","application/jose+json","application/jrd+json","application/json","application/json-patch+json","application/jsonml+json","application/jwk+json","application/jwk-set+json","application/ld+json","application/manifest+json","application/merge-patch+json","application/mud+json","application/postscript","application/ppsp-tracker+json","application/problem+json","application/raml+yaml","application/rdap+json","application/rdf+xml","application/reputon+json","application/rss+xml","application/rtf","application/scim+json","application/soap+xml","application/tar","application/vcard+json","application/vnd.amadeus+json","application/vnd.api+json","application/vnd.apothekende.reservation+json","application/vnd.avalon+json","application/vnd.bbf.usp.msg+json","application/vnd.bekitzur-stech+json","application/vnd.capasystems-pg+json","application/vnd.collection+json","application/vnd.collection.doc+json","application/vnd.collection.next+json","application/vnd.coreos.ignition+json","application/vnd.dart","application/vnd.datapackage+json","application/vnd.dataresource+json","application/vnd.document+json","application/vnd.drive+json","application/vnd.geo+json","application/vnd.google-earth.kml+xml","application/vnd.hal+json","application/vnd.hc+json","application/vnd.heroku+json","application/vnd.hyper+json","application/vnd.hyper-item+json","application/vnd.hyperdrive+json","application/vnd.ims.lis.v2.result+json","application/vnd.ims.lti.v2.toolconsumerprofile+json","application/vnd.ims.lti.v2.toolproxy+json","application/vnd.ims.lti.v2.toolproxy.id+json","application/vnd.ims.lti.v2.toolsettings+json","application/vnd.ims.lti.v2.toolsettings.simple+json","application/vnd.las.las+json","application/vnd.mason+json","application/vnd.micro+json","application/vnd.miele+json","application/vnd.mozilla.xul+xml","application/vnd.ms-fontobject","application/vnd.ms-opentype","application/vnd.nearst.inv+json","application/vnd.oftn.l10n+json","application/vnd.oma.lwm2m+json","application/vnd.oracle.resource+json","application/vnd.pagerduty+json","application/vnd.restful+json","application/vnd.siren+json","application/vnd.sun.wadl+xml","application/vnd.tableschema+json","application/vnd.vel+json","application/vnd.xacml+json","application/voucher-cms+json","application/wasm","application/webpush-options+json","application/x-httpd-php","application/x-javascript","application/x-ns-proxy-autoconfig","application/x-sh","application/x-tar","application/x-virtualbox-hdd","application/x-virtualbox-ova","application/x-virtualbox-ovf","application/x-virtualbox-vbox","application/x-virtualbox-vdi","application/x-virtualbox-vhd","application/x-virtualbox-vmdk","application/x-web-app-manifest+json","application/x-www-form-urlencoded","application/xhtml+xml","application/xml","application/xml-dtd","application/xop+xml","application/yang-data+json","application/yang-patch+json","font/otf","image/bmp","image/svg+xml","image/vnd.adobe.photoshop","image/x-icon","image/x-ms-bmp","message/imdn+xml","message/rfc822","model/gltf+json","model/gltf-binary","model/x3d+xml","text/cache-manifest","text/calender","text/cmd","text/css","text/csv","text/html","text/javascript","text/jsx","text/markdown","text/n3","text/plain","text/richtext","text/rtf","text/tab-separated-values","text/uri-list","text/vcard","text/vtt","text/x-gwt-rpc","text/x-jquery-tmpl","text/x-markdown","text/x-org","text/x-processing","text/x-suse-ymp","text/xml","x-shader/x-fragment","x-shader/x-vertex"],J={level:5},Z=(e,t)=>e.find(e=>t.some(t=>e===t)),G={"default-src":"'self' https: 'unsafe-inline'","img-src":"* data: blob:"},X=e=>0===e.length?'"0-2jmj7l5rSw0yVb/vlWAYkK/YBwk"':(e=>{const t=n.createHash("sha1").update(e,"utf8").digest("base64").slice(0,27);return`"${("string"==typeof e?Buffer.byteLength(e,"utf8"):e.length).toString(16)}-${t}"`})(e),ee=e=>{const{headers:t,requestContext:n,context:o}=e;return{apig:{requestId:n.requestId,resourcePath:n.resourcePath??""},awsAccountId:n.accountId,cloudfront:{country:t["cloudfront-viewer-country"],desktop:"true"===t["cloudfront-is-desktop-viewer"],mobile:"true"===t["cloudfront-is-mobile-viewer"],smarttv:"true"===t["cloudfront-is-smarttv-viewer"],tablet:"true"===t["cloudfront-is-tablet-viewer"]},deploymentStage:n.stage,lambda:{functionName:o.functionName,memoryLimit:Number(o.memoryLimitInMB),remainingExecutionTime:o.getRemainingTimeInMillis?.(),requestId:o.awsRequestId},sourceIp:n.identity?.sourceIp??n?.http?.sourceIp}},te=(t,n,o)=>o.enableLogger&&("function"==typeof o.logger?o.logger(n,t):((t,n)=>{const{source:o,headers:a,meta:r,requestContext:s,provider:i,hostname:c,body:l,timestamp:p,path:d,query:u}=t,m=n.statusCode>=500&&n.statusCode<600,g={dateTime:(new Date).toISOString(),eventSource:o,hostname:c,httpMethod:s.httpMethod,httpProtocol:a.via?.split(" ")[0],httpReferrer:a.referer,httpUserAgent:a["user-agent"],requestContentLength:l&&l.length>0||0,requestTime:Date.now()-p,requestUri:d+(u&&Object.keys(u).length>0?`?${e.stringify(u)}`:""),responseContentLength:n.headers["content-length"],statusCode:n.statusCode,xForwardedHost:a["x-forwarded-host"],...r,..."aws"===i&&ee(t)};return(m?process.stderr:process.stdout).write(JSON.stringify(g))&&g})(n,t))&&t||t,ne=(e,t,n,o=302,a={})=>V(e,"",o,{...a,headers:{...a.headers,location:n}}),oe=(e,t,n,o,a)=>{const{headers:{accept:r}}=t,s=((e,t)=>{const n=e.default||"html",o=t&&"string"==typeof t&&t.split(";")[0].split(",").map(e=>e.split("/").at(-1));return o&&o.find(t=>Reflect.has(e,t))||n})(n,r),i=(e=>{switch(e){case"html":return W;case"json":return Y}throw new TypeError(`"${e}" is not a valid Alagarr respondTo() format.`)})(s),c=((e,t)=>{switch(t){case"html":return e.html;case"json":return e.json}throw new TypeError(`"${t}" is not a valid Alagarr respondTo() format.`)})(n,s);return i(e,t,c,o,a)},ae=(e,t,n,o,a)=>V(e,n,o,a,"text/plain"),re={enableCompression:(e,n)=>{const{body:o,headers:a}=e,r=(e=>{const{headers:t}=e,n=(t["accept-encoding"]||"").split(/, */),o=Z(n,["gzip","deflate","identity"]);return"deflate"===o&&Z(n,["gzip"])?Z(n,["gzip","identity"]):o})(n);return F.includes(a["content-type"])&&void 0!==r&&"identity"!==r&&o&&o.length>256&&r?((e,n)=>{const{body:o,headers:a,...r}=e,s="gzip"===n?t.gzipSync(o,J):t.deflateSync(o,J);return{...r,body:s.toString("base64"),headers:{...a,"content-encoding":n,"content-length":s.byteLength},isBase64Encoded:!0}})(e,r):e},enableContentLength:e=>{const{body:t,headers:n,...o}=e;return{...o,body:t,headers:{...n,"content-length":n["content-length"]||Buffer.byteLength(t)}}},enableCspHeaders:(e,t,n)=>{const{headers:o={},...a}=e,r={...G,...n.cspPolicies};return{...a,headers:{...o,"content-security-policy":Object.keys(r).map(e=>`${e} ${r[e]}`).join(";"),"referrer-policy":"strict-origin-when-cross-origin","x-content-type-options":"nosniff","x-frame-options":{"'none'":"DENY","'self'":"SAMEORIGIN"}[r["frame-ancestors"]]||void 0,"x-xss-protection":"1; mode=block"}}},enableETagHeader:e=>({...e,headers:{...e.headers,etag:X(e.body)}}),enableEnforcedHeaders:(e,t,n)=>({...e,headers:{...e.headers,...n.headers??{}}})};const se={cspPolicies:[],enableCompression:!0,enableContentLength:!0,enableCspHeaders:!0,enableETagHeader:!0,enableEnforcedHeaders:!0,enableLogger:!0,enableStrictTransportSecurity:!0,errorHandler:q,requestMiddleware:[],responseMiddleware:[]},ie=(e,t)=>{throw new E("Misconfiguration in Alagarr setup. No handler function was provided.")},ce=(e=ie,t=se)=>async(n,o,a)=>{const r={...se,...t},s=await(async(e,t,n={})=>A([_,B,U,R,L,K,D,P,z,...n.requestMiddleware||[]],Object.freeze({...e,context:t}),n))(n,o,r),i=await(async(e,t,n)=>{const o=V(),a=[ae,W,Y,ne,oe].reduce((a,r)=>({...a,[r.name]:async(...a)=>t(null,await A(Object.keys(re).reduce((e,t)=>n[t]?[...e,re[t]]:e,[...n.responseMiddleware||[],...n.enableLogger?[te]:[]]),r(o,e,...a),e,n))}),{raw:t}),r=[Q].reduce((e,t)=>({...e,[t.name]:(...e)=>t(r,o,...e)}),a);return r})(s,a,r);try{return await e(s,i,o)}catch(e){const t="function"==typeof r.errorHandler?r.errorHandler:q;try{return await t(s,i,e)}catch(e){return console.error("There was an error in the error handler provided to Alagaar",e,t.toString()),q(s,i,e)}}},le={region:"eu-central-2"},pe=async(e,t,n,o=0)=>{const a=await t(n,o);return await e(a,o)?a:pe(e,t,a,o+1)};let de;const ue=e=>"string"==typeof e?{id:e}:e,me=({UnprocessedItems:e})=>!e||0===Object.keys(e).length,ge=async(e,t,n,o)=>{try{const s=(a=25,r=o,Array.from({length:Math.ceil(r.length/a)}).map((e,t)=>r.slice(t*a,t*a+a))),i=await Promise.all(s.map(async o=>de.schedule(async()=>pe(me,((e,t,n)=>async(o,a)=>{if(a>n)throw new Error("Reached maximum number of DynamoDB BatchWrite request retries.");const r=new d({RequestItems:o.UnprocessedItems??{[t]:o.map(e=>({PutRequest:{Item:e}}))},ReturnConsumedCapacity:"TOTAL",ReturnItemCollectionMetrics:"SIZE"});return e.send(r)})(t,e.tableNamePrefix+n,e.batchWriteMaxRetries??50),o))));return i&&o}catch(t){return void(e.logger&&e.logger.error(t))}var a,r},he=e=>{const{clientConfig:t,...n}={...le,...e},d=new o(n.dockerConfig?{credentials:{accessKeyId:"foobarkey",secretAccessKey:"foobarsecret"},endpoint:n.dockerConfig.endpoint,region:"local",retryMode:"standard"}:{retryMode:"standard",...t}),m=a.from(d);return de=new u({maxConcurrent:n.queueConfig?.queueConcurrency??25,minTime:n.queueConfig?.queueDelay??void 0}),{batchWriteItems:(e,t)=>ge(n,m,e,t),deleteItem:(e,t,o)=>(async(e,t,n,o,a={})=>{try{const{ReturnValues:r="NONE"}=a,s=new p({Key:ue(o),ReturnValues:r,TableName:e.tableNamePrefix+n});return(await de.schedule(()=>t.send(s))).Attributes}catch(t){return void(e.logger&&e.logger.error(t))}})(n,m,e,t,o),getItem:(e,t,o)=>(async(e,t,n,o,a={})=>{try{const{ConsistentRead:r=!1}=a,s=new l({ConsistentRead:r,Key:ue(o),TableName:e.tableNamePrefix+n});return(await de.schedule(()=>t.send(s))).Item}catch(t){return void(e.logger&&e.logger.error(t))}})(n,m,e,t,o),putItem:(e,t)=>(async(e,t,n,o)=>{try{const{expires:a,...r}=o,s=new c({Item:null===a?r:o,TableName:e.tableNamePrefix+n});return await de.schedule(()=>t.send(s))&&o}catch(t){return void(e.logger&&e.logger.error(t))}})(n,m,e,t),queryTable:(e,t)=>(async(e,t,n,o={})=>{try{const{ConsistentRead:a=!1}=o,r=new i({...o,ConsistentRead:a,TableName:e.tableNamePrefix+n});return await de.schedule(()=>t.send(r))}catch(t){return void(e.logger&&e.logger.error(t))}})(n,m,e,t),scanTable:(e,t)=>(async(e,t,n,o={})=>{try{const{ConsistentRead:a=!1}=o,r=new s({...o,ConsistentRead:a,TableName:e.tableNamePrefix+n});return await de.schedule(()=>t.send(r))}catch(t){return void(e.logger&&e.logger.error(t))}})(n,m,e,t),updateItem:(e,t,o)=>(async(e,t,n,o,a={})=>{try{const s=new r({Key:ue(o),...a,ReturnValues:"ALL_NEW",TableName:e.tableNamePrefix+n});return(await de.schedule(async()=>t.send(s))).Attributes}catch(t){return void(e.logger&&e.logger.error(t))}})(n,m,e,t,o)}},ye=e=>{const{clientConfig:t,...n}={...le,...e},o=new m(t);return{invokeLambda:(e,t)=>(async(e,t,n,o)=>{try{const a=new g({FunctionName:t.functionName,InvocationType:n,Payload:Buffer.from(JSON.stringify(o))}),r=await e.send(a);return t.logger&&t.logger.info(JSON.stringify(r)),!0}catch(e){return t.logger&&t.logger.error(e),!1}})(o,n,e,t)}},fe={clientConfig:le,onlyDefault:!1,prefix:process.env.SSM_PARAM_PATH},ve=e=>{const{clientConfig:t,...n}={...fe,...e},o=new h(t);return{getSecret:(e,t="")=>(async(e,t,n,o)=>{if(t.onlyDefault)return o;try{const a=await e.send(new f({Name:`${t.prefix??""}${n}`,WithDecryption:!0}));return a?.Parameter?.Value??o}catch(e){return t.logger&&t.logger.error(e),o}})(o,n,e,t),getSecrets:(e,t=[])=>(async(e,t,n,o)=>{if(t.onlyDefault)return o;try{const a=new y({Names:n.map(e=>`${t.prefix??""}${e}`),WithDecryption:!0}),r=await e.send(a);return r?.Parameters?.map(e=>{const t=!e.Value&&e.Name?o.find(t=>t.name===e.Name):o[0];return{name:e.Name??t?.name??"",value:e.Value??t?.value??""}})??o}catch(e){return t.logger&&t.logger.error(e),o}})(o,n,e,t)}},xe={clientConfig:{region:"eu-west-1"}},je=e=>{const{clientConfig:t,...n}={...xe,...e},o=new v(t),a=j(e.customSMTPConfig??{SES:{SendEmailCommand:x,sesClient:o}});return{sendMail:(e,t)=>(async(e,t,n,o)=>{try{if(!n.html&&!n.text)return e.logger&&e.logger.error("The option text or html needs to be set."),!1;if(!n.to||!n.subject)return e.logger&&e.logger.error("The fields to and subject have to be set."),!1;const a=await t.sendMail(n);return o&&await o(a),!!a||(e.logger&&e.logger.error("Sending email failed!"),!1)}catch(t){return e.logger&&e.logger.error(t),!1}})(n,a,e,t)}},be=e=>{const{clientConfig:t,...n}={...le,...e},o=new b(t);return{deleteQueueItem:(e,t)=>(async(e,t,n,o)=>{try{const t=new N({QueueUrl:n,ReceiptHandle:o});return await e.send(t)}catch(e){return void(t.logger&&t.logger.error(e))}})(o,n,e,t),getQueueItems:(e,t)=>(async(e,t,n,o=1)=>{try{const t=new I({MaxNumberOfMessages:o,QueueUrl:n});return await e.send(t)}catch(e){return void(t.logger&&t.logger.error(e))}})(o,n,e,t),getQueueUrl:e=>(async(e,t,n)=>{try{const t=new C({QueueName:n});return(await e.send(t)).QueueUrl}catch(e){return void(t.logger&&t.logger.error(e))}})(o,n,e),sendMessage:(e,t,a,r,s)=>(async(e,t,n,o,a={},r,s=0)=>{try{const t=new w({...a,...r?{MessageAttributes:r}:{},DelaySeconds:s,MessageBody:o,QueueUrl:n});return(await e.send(t)).MessageId}catch(e){return void(t.logger&&t.logger.error(e))}})(o,n,e,t,a,r,s)}},we=e=>{const t={defaultMeta:{...e.defaultLogInformation,deploymentStage:e.deploymentStage,service:e.service},format:S.combine(S.timestamp({format:"DD-MM-YYYY HH:mm:ss"}),S.json()),level:e.level||"info"};if(e.datadogApiKey){const n={host:"http-intake.logs.datadoghq.eu",path:`/api/v2/logs?dd-api-key=${e.datadogApiKey}&ddsource=nodejs&service=${e.service}`,port:443,ssl:!0};return k({...t,transports:[new T.Http(n)]})}return k({...t,transports:[new T.Console({forceConsole:!0})]})};export{M as ClientError,fe as DEFAULT_PARAMETER_STORE_CLIENT_CONFIG,xe as DEFAULT_SES_CLIENT_CONFIG,E as ServerError,ce as alagarr,he as dynamodb,ye as lambda,we as logger,ve as parameterStore,je as ses,be as sqs};
|
|
1
|
+
import*as e from"querystring";import*as t from"zlib";import*as n from"crypto";import{DynamoDBClient as o}from"@aws-sdk/client-dynamodb";import{DynamoDBDocumentClient as a,UpdateCommand as r,ScanCommand as s,QueryCommand as i,PutCommand as c,GetCommand as l,DeleteCommand as p,BatchWriteCommand as d}from"@aws-sdk/lib-dynamodb";import u from"bottleneck";import{LambdaClient as m,InvokeCommand as g}from"@aws-sdk/client-lambda";import{SSMClient as h,GetParametersCommand as y,GetParameterCommand as f}from"@aws-sdk/client-ssm";import{SESv2Client as v,SendEmailCommand as x}from"@aws-sdk/client-sesv2";import{createTransport as j}from"nodemailer";import{SQSClient as b,SendMessageCommand as w,SendMessageBatchCommand as C,GetQueueUrlCommand as I,ReceiveMessageCommand as N,DeleteMessageCommand as S}from"@aws-sdk/client-sqs";import{format as k,createLogger as T,transports as q}from"winston";export{Logger}from"winston";const M=(e,t,n)=>{const{requestId:o}=e.requestContext,a=n.name&&"string"==typeof n.name?n.name.replace(/([A-Z])([A-Z])([a-z])|([a-z])([A-Z])/g,"$1$4 $2$3$5"):"Error",r=n.message||"",s=n.statusCode?` ${n.statusCode}`:"";return"ClientError"===n.name||n.statusCode>=400&&n.statusCode<500?t.respondTo({html:`<html><body><strong>${a}${s}</strong>: ${r}<br/>Request ID: ${o}</body></html>`,json:{error:n.name,message:r,requestId:o}},n.statusCode||400):t.respondTo({html:`<html><body>An internal server error occurred.<br/>Request ID: ${o}</body></html>`,json:{error:"Internal server error",message:"An internal server error occurred",requestId:o}},500)};class E extends Error{name="ClientError";statusCode=400;constructor(e,t,n=400){super(String(e)),this.name=t||this.name,this.statusCode=n}}class A extends Error{name="ServerError";statusCode=500;constructor(e,t,n=500){super(String(e)),this.name=t||this.name,this.statusCode=n}}const R=async(e,t,...n)=>e.reduce(async(e,t)=>t(await e,...n),Promise.resolve(t)),$=e=>{return e.isBase64Encoded&&"string"==typeof e.body?{...e,body:(t=e.body,Buffer.from(t,"base64").toString("utf8"))}:e;var t},L=e=>{const t=e.indexOf("="),n=-1!==t,o=n&&e.slice(0,Math.max(0,t)).trim(),a=n&&e.substr(t+1,e.length).trim(),r=a&&'"'===a[0]?a.slice(1,-1):a;return o?{[o]:r?decodeURIComponent(r):""}:{}},P=e=>{return{...e,cookies:(t=e.headers?.cookie||"",t.split(/; */).reduce((e,t)=>({...e,...L(t)}),{}))};var t},O=e=>({...e,hostname:e.headers?.host||void 0}),D=e=>{try{return JSON.parse(e)}catch{return{}}},H=e=>{const{headers:t,body:n}=e;return t["content-type"]&&"application/json"===t["content-type"].split(";").shift()&&"string"==typeof n?{...e,body:D(n)}:e},U=new Map([["invocationCount",0]]),z=e=>{const t=Number(U.get("invocationCount"));return{...e,meta:{...e.meta,coldStart:!t,invocationCount:U.set("invocationCount",t+1).get("invocationCount")}}},B=({headers:e={},...t})=>({...t,headers:Object.keys(e).reduce((n,o)=>{const a=o.toLowerCase();return"aws"===t.provider&&Reflect.has(n,a)&&"content-type"===a&&"application/json"===e[o]?n:{...n,[a]:e[o]}},{})}),_=e=>({...e,method:e.httpMethod??e.requestContext?.http?.method??"",path:e.path??e.requestContext?.http?.path??"",provider:"aws",query:e.queryStringParameters||{},source:e.requestContext?"api-gateway":e.source}),Q=e=>({...e,timestamp:Date.now()}),K=t=>{const{headers:n,body:o}=t;return n["content-type"]&&"application/x-www-form-urlencoded"===n["content-type"].split(";").shift()&&"string"==typeof o?{...t,body:e.parse(o)}:t};const F=(e,t,n,o)=>(Object.assign(t.headers,{[n]:o}),e),V=(e,t="",n=200,{headers:o={},...a}={},r)=>Object.freeze({...e,body:t||"",headers:{...e?.headers,"content-type":r,...o},statusCode:n,...a}),W=(e,t,n,o,a)=>V(e,n,o,a,"text/html"),Y=(e,t,n,o,a)=>V(e,(e=>{const t="string"==typeof e?e.trim():e;return"string"==typeof e&&["{",'"'].includes(t[0])&&["}",'"'].includes(t.at(-1))?t:JSON.stringify(e)})(n),o,a,"application/json"),J=["application/activity+json","application/alto-costmap+json","application/alto-costmapfilter+json","application/alto-directory+json","application/alto-endpointcost+json","application/alto-endpointcostparams+json","application/alto-endpointprop+json","application/alto-endpointpropparams+json","application/alto-error+json","application/alto-networkmap+json","application/alto-networkmapfilter+json","application/atom+xml","application/calendar+json","application/coap-group+json","application/csvm+json","application/dart","application/dicom+json","application/ecmascript","application/fhir+json","application/fido.trusted-apps+json","application/geo+json","application/javascript","application/jf2feed+json","application/jose+json","application/jrd+json","application/json","application/json-patch+json","application/jsonml+json","application/jwk+json","application/jwk-set+json","application/ld+json","application/manifest+json","application/merge-patch+json","application/mud+json","application/postscript","application/ppsp-tracker+json","application/problem+json","application/raml+yaml","application/rdap+json","application/rdf+xml","application/reputon+json","application/rss+xml","application/rtf","application/scim+json","application/soap+xml","application/tar","application/vcard+json","application/vnd.amadeus+json","application/vnd.api+json","application/vnd.apothekende.reservation+json","application/vnd.avalon+json","application/vnd.bbf.usp.msg+json","application/vnd.bekitzur-stech+json","application/vnd.capasystems-pg+json","application/vnd.collection+json","application/vnd.collection.doc+json","application/vnd.collection.next+json","application/vnd.coreos.ignition+json","application/vnd.dart","application/vnd.datapackage+json","application/vnd.dataresource+json","application/vnd.document+json","application/vnd.drive+json","application/vnd.geo+json","application/vnd.google-earth.kml+xml","application/vnd.hal+json","application/vnd.hc+json","application/vnd.heroku+json","application/vnd.hyper+json","application/vnd.hyper-item+json","application/vnd.hyperdrive+json","application/vnd.ims.lis.v2.result+json","application/vnd.ims.lti.v2.toolconsumerprofile+json","application/vnd.ims.lti.v2.toolproxy+json","application/vnd.ims.lti.v2.toolproxy.id+json","application/vnd.ims.lti.v2.toolsettings+json","application/vnd.ims.lti.v2.toolsettings.simple+json","application/vnd.las.las+json","application/vnd.mason+json","application/vnd.micro+json","application/vnd.miele+json","application/vnd.mozilla.xul+xml","application/vnd.ms-fontobject","application/vnd.ms-opentype","application/vnd.nearst.inv+json","application/vnd.oftn.l10n+json","application/vnd.oma.lwm2m+json","application/vnd.oracle.resource+json","application/vnd.pagerduty+json","application/vnd.restful+json","application/vnd.siren+json","application/vnd.sun.wadl+xml","application/vnd.tableschema+json","application/vnd.vel+json","application/vnd.xacml+json","application/voucher-cms+json","application/wasm","application/webpush-options+json","application/x-httpd-php","application/x-javascript","application/x-ns-proxy-autoconfig","application/x-sh","application/x-tar","application/x-virtualbox-hdd","application/x-virtualbox-ova","application/x-virtualbox-ovf","application/x-virtualbox-vbox","application/x-virtualbox-vdi","application/x-virtualbox-vhd","application/x-virtualbox-vmdk","application/x-web-app-manifest+json","application/x-www-form-urlencoded","application/xhtml+xml","application/xml","application/xml-dtd","application/xop+xml","application/yang-data+json","application/yang-patch+json","font/otf","image/bmp","image/svg+xml","image/vnd.adobe.photoshop","image/x-icon","image/x-ms-bmp","message/imdn+xml","message/rfc822","model/gltf+json","model/gltf-binary","model/x3d+xml","text/cache-manifest","text/calender","text/cmd","text/css","text/csv","text/html","text/javascript","text/jsx","text/markdown","text/n3","text/plain","text/richtext","text/rtf","text/tab-separated-values","text/uri-list","text/vcard","text/vtt","text/x-gwt-rpc","text/x-jquery-tmpl","text/x-markdown","text/x-org","text/x-processing","text/x-suse-ymp","text/xml","x-shader/x-fragment","x-shader/x-vertex"],Z={level:5},G=(e,t)=>e.find(e=>t.some(t=>e===t)),X={"default-src":"'self' https: 'unsafe-inline'","img-src":"* data: blob:"},ee=e=>0===e.length?'"0-2jmj7l5rSw0yVb/vlWAYkK/YBwk"':(e=>{const t=n.createHash("sha1").update(e,"utf8").digest("base64").slice(0,27);return`"${("string"==typeof e?Buffer.byteLength(e,"utf8"):e.length).toString(16)}-${t}"`})(e),te=e=>{const{headers:t,requestContext:n,context:o}=e;return{apig:{requestId:n.requestId,resourcePath:n.resourcePath??""},awsAccountId:n.accountId,cloudfront:{country:t["cloudfront-viewer-country"],desktop:"true"===t["cloudfront-is-desktop-viewer"],mobile:"true"===t["cloudfront-is-mobile-viewer"],smarttv:"true"===t["cloudfront-is-smarttv-viewer"],tablet:"true"===t["cloudfront-is-tablet-viewer"]},deploymentStage:n.stage,lambda:{functionName:o.functionName,memoryLimit:Number(o.memoryLimitInMB),remainingExecutionTime:o.getRemainingTimeInMillis?.(),requestId:o.awsRequestId},sourceIp:n.identity?.sourceIp??n?.http?.sourceIp}},ne=(t,n,o)=>o.enableLogger&&("function"==typeof o.logger?o.logger(n,t):((t,n)=>{const{source:o,headers:a,meta:r,requestContext:s,provider:i,hostname:c,body:l,timestamp:p,path:d,query:u}=t,m=n.statusCode>=500&&n.statusCode<600,g={dateTime:(new Date).toISOString(),eventSource:o,hostname:c,httpMethod:s.httpMethod,httpProtocol:a.via?.split(" ")[0],httpReferrer:a.referer,httpUserAgent:a["user-agent"],requestContentLength:l&&l.length>0||0,requestTime:Date.now()-p,requestUri:d+(u&&Object.keys(u).length>0?`?${e.stringify(u)}`:""),responseContentLength:n.headers["content-length"],statusCode:n.statusCode,xForwardedHost:a["x-forwarded-host"],...r,..."aws"===i&&te(t)};return(m?process.stderr:process.stdout).write(JSON.stringify(g))&&g})(n,t))&&t||t,oe=(e,t,n,o=302,a={})=>V(e,"",o,{...a,headers:{...a.headers,location:n}}),ae=(e,t,n,o,a)=>{const{headers:{accept:r}}=t,s=((e,t)=>{const n=e.default||"html",o=t&&"string"==typeof t&&t.split(";")[0].split(",").map(e=>e.split("/").at(-1));return o&&o.find(t=>Reflect.has(e,t))||n})(n,r),i=(e=>{switch(e){case"html":return W;case"json":return Y}throw new TypeError(`"${e}" is not a valid Alagarr respondTo() format.`)})(s),c=((e,t)=>{switch(t){case"html":return e.html;case"json":return e.json}throw new TypeError(`"${t}" is not a valid Alagarr respondTo() format.`)})(n,s);return i(e,t,c,o,a)},re=(e,t,n,o,a)=>V(e,n,o,a,"text/plain"),se={enableCompression:(e,n)=>{const{body:o,headers:a}=e,r=(e=>{const{headers:t}=e,n=(t["accept-encoding"]||"").split(/, */),o=G(n,["gzip","deflate","identity"]);return"deflate"===o&&G(n,["gzip"])?G(n,["gzip","identity"]):o})(n);return J.includes(a["content-type"])&&void 0!==r&&"identity"!==r&&o&&o.length>256&&r?((e,n)=>{const{body:o,headers:a,...r}=e,s="gzip"===n?t.gzipSync(o,Z):t.deflateSync(o,Z);return{...r,body:s.toString("base64"),headers:{...a,"content-encoding":n,"content-length":s.byteLength},isBase64Encoded:!0}})(e,r):e},enableContentLength:e=>{const{body:t,headers:n,...o}=e;return{...o,body:t,headers:{...n,"content-length":n["content-length"]||Buffer.byteLength(t)}}},enableCspHeaders:(e,t,n)=>{const{headers:o={},...a}=e,r={...X,...n.cspPolicies};return{...a,headers:{...o,"content-security-policy":Object.keys(r).map(e=>`${e} ${r[e]}`).join(";"),"referrer-policy":"strict-origin-when-cross-origin","x-content-type-options":"nosniff","x-frame-options":{"'none'":"DENY","'self'":"SAMEORIGIN"}[r["frame-ancestors"]]||void 0,"x-xss-protection":"1; mode=block"}}},enableETagHeader:e=>({...e,headers:{...e.headers,etag:ee(e.body)}}),enableEnforcedHeaders:(e,t,n)=>({...e,headers:{...e.headers,...n.headers??{}}})};const ie={cspPolicies:[],enableCompression:!0,enableContentLength:!0,enableCspHeaders:!0,enableETagHeader:!0,enableEnforcedHeaders:!0,enableLogger:!0,enableStrictTransportSecurity:!0,errorHandler:M,requestMiddleware:[],responseMiddleware:[]},ce=(e,t)=>{throw new A("Misconfiguration in Alagarr setup. No handler function was provided.")},le=(e=ce,t=ie)=>async(n,o,a)=>{const r={...ie,...t},s=await(async(e,t,n={})=>R([Q,_,B,$,P,K,H,O,z,...n.requestMiddleware||[]],Object.freeze({...e,context:t}),n))(n,o,r),i=await(async(e,t,n)=>{const o=V(),a=[re,W,Y,oe,ae].reduce((a,r)=>({...a,[r.name]:async(...a)=>t(null,await R(Object.keys(se).reduce((e,t)=>n[t]?[...e,se[t]]:e,[...n.responseMiddleware||[],...n.enableLogger?[ne]:[]]),r(o,e,...a),e,n))}),{raw:t}),r=[F].reduce((e,t)=>({...e,[t.name]:(...e)=>t(r,o,...e)}),a);return r})(s,a,r);try{return await e(s,i,o)}catch(e){const t="function"==typeof r.errorHandler?r.errorHandler:M;try{return await t(s,i,e)}catch(e){return console.error("There was an error in the error handler provided to Alagaar",e,t.toString()),M(s,i,e)}}},pe={region:"eu-central-2"},de=async(e,t,n,o=0)=>{const a=await t(n,o);return await e(a,o)?a:de(e,t,a,o+1)};let ue;const me=e=>"string"==typeof e?{id:e}:e,ge=({UnprocessedItems:e})=>!e||0===Object.keys(e).length,he=async(e,t,n,o)=>{try{const s=(a=25,r=o,Array.from({length:Math.ceil(r.length/a)}).map((e,t)=>r.slice(t*a,t*a+a))),i=await Promise.all(s.map(async o=>ue.schedule(async()=>de(ge,((e,t,n)=>async(o,a)=>{if(a>n)throw new Error("Reached maximum number of DynamoDB BatchWrite request retries.");const r=new d({RequestItems:o.UnprocessedItems??{[t]:o.map(e=>({PutRequest:{Item:e}}))},ReturnConsumedCapacity:"TOTAL",ReturnItemCollectionMetrics:"SIZE"});return e.send(r)})(t,e.tableNamePrefix+n,e.batchWriteMaxRetries??50),o))));return i&&o}catch(t){return void(e.logger&&e.logger.error(t))}var a,r},ye=e=>{const{clientConfig:t,...n}={...pe,...e},d=new o(n.dockerConfig?{credentials:{accessKeyId:"foobarkey",secretAccessKey:"foobarsecret"},endpoint:n.dockerConfig.endpoint,region:"local",retryMode:"standard"}:{retryMode:"standard",...t}),m=a.from(d);return ue=new u({maxConcurrent:n.queueConfig?.queueConcurrency??25,minTime:n.queueConfig?.queueDelay??void 0}),{batchWriteItems:(e,t)=>he(n,m,e,t),deleteItem:(e,t,o)=>(async(e,t,n,o,a={})=>{try{const{ReturnValues:r="NONE"}=a,s=new p({Key:me(o),ReturnValues:r,TableName:e.tableNamePrefix+n});return(await ue.schedule(()=>t.send(s))).Attributes}catch(t){return void(e.logger&&e.logger.error(t))}})(n,m,e,t,o),getItem:(e,t,o)=>(async(e,t,n,o,a={})=>{try{const{ConsistentRead:r=!1}=a,s=new l({ConsistentRead:r,Key:me(o),TableName:e.tableNamePrefix+n});return(await ue.schedule(()=>t.send(s))).Item}catch(t){return void(e.logger&&e.logger.error(t))}})(n,m,e,t,o),putItem:(e,t)=>(async(e,t,n,o)=>{try{const{expires:a,...r}=o,s=new c({Item:null===a?r:o,TableName:e.tableNamePrefix+n});return await ue.schedule(()=>t.send(s))&&o}catch(t){return void(e.logger&&e.logger.error(t))}})(n,m,e,t),queryTable:(e,t)=>(async(e,t,n,o={})=>{try{const{ConsistentRead:a=!1}=o,r=new i({...o,ConsistentRead:a,TableName:e.tableNamePrefix+n});return await ue.schedule(()=>t.send(r))}catch(t){return void(e.logger&&e.logger.error(t))}})(n,m,e,t),scanTable:(e,t)=>(async(e,t,n,o={})=>{try{const{ConsistentRead:a=!1}=o,r=new s({...o,ConsistentRead:a,TableName:e.tableNamePrefix+n});return await ue.schedule(()=>t.send(r))}catch(t){return void(e.logger&&e.logger.error(t))}})(n,m,e,t),updateItem:(e,t,o)=>(async(e,t,n,o,a={})=>{try{const s=new r({Key:me(o),...a,ReturnValues:"ALL_NEW",TableName:e.tableNamePrefix+n});return(await ue.schedule(async()=>t.send(s))).Attributes}catch(t){return void(e.logger&&e.logger.error(t))}})(n,m,e,t,o)}},fe=e=>{const{clientConfig:t,...n}={...pe,...e},o=new m(t);return{invokeLambda:(e,t)=>(async(e,t,n,o)=>{try{const a=new g({FunctionName:t.functionName,InvocationType:n,Payload:Buffer.from(JSON.stringify(o))}),r=await e.send(a);return t.logger&&t.logger.info(JSON.stringify(r)),!0}catch(e){return t.logger&&t.logger.error(e),!1}})(o,n,e,t)}},ve={clientConfig:pe,onlyDefault:!1,prefix:process.env.SSM_PARAM_PATH},xe=e=>{const{clientConfig:t,...n}={...ve,...e},o=new h(t);return{getSecret:(e,t="")=>(async(e,t,n,o)=>{if(t.onlyDefault)return o;try{const a=await e.send(new f({Name:`${t.prefix??""}${n}`,WithDecryption:!0}));return a?.Parameter?.Value??o}catch(e){return t.logger&&t.logger.error(e),o}})(o,n,e,t),getSecrets:(e,t=[])=>(async(e,t,n,o)=>{if(t.onlyDefault)return o;try{const a=new y({Names:n.map(e=>`${t.prefix??""}${e}`),WithDecryption:!0}),r=await e.send(a);return r?.Parameters?.map(e=>{const t=!e.Value&&e.Name?o.find(t=>t.name===e.Name):o[0];return{name:e.Name??t?.name??"",value:e.Value??t?.value??""}})??o}catch(e){return t.logger&&t.logger.error(e),o}})(o,n,e,t)}},je={clientConfig:{region:"eu-west-1"}},be=e=>{const{clientConfig:t,...n}={...je,...e},o=new v(t),a=j(e.customSMTPConfig??{SES:{SendEmailCommand:x,sesClient:o}});return{sendMail:(e,t)=>(async(e,t,n,o)=>{try{if(!n.html&&!n.text)return e.logger&&e.logger.error("The option text or html needs to be set."),!1;if(!n.to||!n.subject)return e.logger&&e.logger.error("The fields to and subject have to be set."),!1;const a=await t.sendMail(n);return o&&await o(a),!!a||(e.logger&&e.logger.error("Sending email failed!"),!1)}catch(t){return e.logger&&e.logger.error(t),!1}})(n,a,e,t)}},we=e=>{const{clientConfig:t,...n}={...pe,...e},o=new b(t);return{deleteQueueItem:(e,t)=>(async(e,t,n,o)=>{try{const t=new S({QueueUrl:n,ReceiptHandle:o});return await e.send(t)}catch(e){return void(t.logger&&t.logger.error(e))}})(o,n,e,t),getQueueItems:(e,t)=>(async(e,t,n,o=1)=>{try{const t=new N({MaxNumberOfMessages:o,QueueUrl:n});return await e.send(t)}catch(e){return void(t.logger&&t.logger.error(e))}})(o,n,e,t),getQueueUrl:e=>(async(e,t,n)=>{try{const t=new I({QueueName:n});return(await e.send(t)).QueueUrl}catch(e){return void(t.logger&&t.logger.error(e))}})(o,n,e),sendBatchMessages:(e,t)=>(async(e,t,n,o)=>{try{const t=new C({Entries:o,QueueUrl:n}),a=await e.send(t);return{failed:a.Failed,successful:a.Successful}}catch(e){return t.logger&&t.logger.error(e),{failed:void 0,successful:void 0}}})(o,n,e,t),sendMessage:(e,t,a,r,s)=>(async(e,t,n,o,a={},r,s=0)=>{try{const t=new w({...a,...r?{MessageAttributes:r}:{},DelaySeconds:s,MessageBody:o,QueueUrl:n});return(await e.send(t)).MessageId}catch(e){return void(t.logger&&t.logger.error(e))}})(o,n,e,t,a,r,s)}},Ce=e=>{const t={defaultMeta:{...e.defaultLogInformation,deploymentStage:e.deploymentStage,service:e.service},format:k.combine(k.timestamp({format:"DD-MM-YYYY HH:mm:ss"}),k.json()),level:e.level||"info"};if(e.datadogApiKey){const n={host:"http-intake.logs.datadoghq.eu",path:`/api/v2/logs?dd-api-key=${e.datadogApiKey}&ddsource=nodejs&service=${e.service}`,port:443,ssl:!0};return T({...t,transports:[new q.Http(n)]})}return T({...t,transports:[new q.Console({forceConsole:!0})]})};export{E as ClientError,ve as DEFAULT_PARAMETER_STORE_CLIENT_CONFIG,je as DEFAULT_SES_CLIENT_CONFIG,A as ServerError,le as alagarr,ye as dynamodb,fe as lambda,Ce as logger,xe as parameterStore,be as ses,we as sqs};
|
package/dist/src/aws/sqs.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DeleteMessageCommandInput, MessageAttributeValue, ReceiveMessageCommandOutput, SQSClientConfig } from '@aws-sdk/client-sqs';
|
|
1
|
+
import { BatchResultErrorEntry, DeleteMessageCommandInput, MessageAttributeValue, ReceiveMessageCommandOutput, SendMessageBatchRequestEntry, SendMessageBatchResultEntry, SQSClientConfig } from '@aws-sdk/client-sqs';
|
|
2
2
|
import { Logger } from 'winston';
|
|
3
3
|
export interface ISQS {
|
|
4
4
|
clientConfig?: SQSClientConfig;
|
|
@@ -11,10 +11,15 @@ export type TSendMessage = (queueUrl: string, message: string, fifoSettings?: {
|
|
|
11
11
|
}, messageAttributes?: Record<string, MessageAttributeValue>, messageDelay?: number) => Promise<string | undefined>;
|
|
12
12
|
export type TGetQueueItems = (queueUrl: string, maxNumberOfMessages?: number) => Promise<ReceiveMessageCommandOutput | undefined>;
|
|
13
13
|
export type TDeleteQueueItem = (queueUrl: string, receiptHandle: DeleteMessageCommandInput['ReceiptHandle']) => Promise<ReceiveMessageCommandOutput | undefined>;
|
|
14
|
+
export type TSendBatchMessages = (queueUrl: string, queueEntries: SendMessageBatchRequestEntry[]) => Promise<{
|
|
15
|
+
failed: BatchResultErrorEntry[] | undefined;
|
|
16
|
+
successful: SendMessageBatchResultEntry[] | undefined;
|
|
17
|
+
}>;
|
|
14
18
|
declare const sqs: (userConfig: ISQS) => {
|
|
15
19
|
deleteQueueItem: TDeleteQueueItem;
|
|
16
20
|
getQueueItems: TGetQueueItems;
|
|
17
21
|
getQueueUrl: TGetQueueUrl;
|
|
22
|
+
sendBatchMessages: TSendBatchMessages;
|
|
18
23
|
sendMessage: TSendMessage;
|
|
19
24
|
};
|
|
20
25
|
export default sqs;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@allthings/cloud-toolkit",
|
|
3
|
-
"version": "3.0
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"author": "Allthings GmbH",
|
|
6
6
|
"keywords": [
|
|
@@ -64,29 +64,29 @@
|
|
|
64
64
|
"winston": "^3.17.0"
|
|
65
65
|
},
|
|
66
66
|
"devDependencies": {
|
|
67
|
-
"@allthings/eslint-config": "2.2.
|
|
68
|
-
"@commitlint/cli": "20.
|
|
69
|
-
"@commitlint/config-conventional": "20.
|
|
67
|
+
"@allthings/eslint-config": "2.2.3",
|
|
68
|
+
"@commitlint/cli": "20.2.0",
|
|
69
|
+
"@commitlint/config-conventional": "20.2.0",
|
|
70
70
|
"@rollup/plugin-commonjs": "29.0.0",
|
|
71
71
|
"@rollup/plugin-json": "6.1.0",
|
|
72
72
|
"@rollup/plugin-node-resolve": "16.0.3",
|
|
73
73
|
"@rollup/plugin-replace": "6.0.3",
|
|
74
74
|
"@rollup/plugin-terser": "0.4.4",
|
|
75
|
-
"@types/aws-lambda": "8.10.
|
|
75
|
+
"@types/aws-lambda": "8.10.159",
|
|
76
76
|
"@types/jest": "30.0.0",
|
|
77
|
-
"@types/node": "24.
|
|
77
|
+
"@types/node": "24.10.1",
|
|
78
78
|
"@types/nodemailer": "7.0.4",
|
|
79
79
|
"@types/query-string": "6.3.0",
|
|
80
80
|
"aws-sdk-client-mock": "4.1.0",
|
|
81
81
|
"eslint": "8.57.1",
|
|
82
82
|
"husky": "9.1.7",
|
|
83
83
|
"jest": "30.2.0",
|
|
84
|
-
"lint-staged": "16.2.
|
|
85
|
-
"prettier": "3.
|
|
86
|
-
"rimraf": "6.1.
|
|
87
|
-
"rollup": "4.53.
|
|
84
|
+
"lint-staged": "16.2.7",
|
|
85
|
+
"prettier": "3.7.4",
|
|
86
|
+
"rimraf": "6.1.2",
|
|
87
|
+
"rollup": "4.53.3",
|
|
88
88
|
"semantic-release": "19.0.5",
|
|
89
|
-
"ts-jest": "29.4.
|
|
89
|
+
"ts-jest": "29.4.6",
|
|
90
90
|
"typescript": "5.9.3"
|
|
91
91
|
},
|
|
92
92
|
"prettier": {
|