@allthings/cloud-toolkit 2.5.0-dev.1 → 2.5.0-dev.2

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.
@@ -0,0 +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};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allthings/cloud-toolkit",
3
- "version": "2.5.0-dev.1",
3
+ "version": "2.5.0-dev.2",
4
4
  "description": "",
5
5
  "author": "Allthings GmbH",
6
6
  "keywords": [
@@ -1 +0,0 @@
1
- import{t as e,f as t}from"./index-DdGH0TTD.js";import"querystring";import"zlib";import"crypto";import"events";import"url";import"util";import"fs";import"http";import"https";import"stream";import"net";import"dns";import"os";import"path";import"tls";import"child_process";import"buffer";import"string_decoder";class r{marshaller;serializer;deserializer;serdeContext;defaultContentType;constructor({marshaller:e,serializer:t,deserializer:r,serdeContext:i,defaultContentType:s}){this.marshaller=e,this.serializer=t,this.deserializer=r,this.serdeContext=i,this.defaultContentType=s}async serializeEventStream({eventStream:e,requestSchema:t,initialRequest:r}){const i=this.marshaller,s=t.getEventStreamMember(),n=t.getMemberSchema(s),a=this.serializer,o=this.defaultContentType,l=Symbol("initialRequestMarker"),c={async*[Symbol.asyncIterator](){if(r){const e={":event-type":{type:"string",value:"initial-request"},":message-type":{type:"string",value:"event"},":content-type":{type:"string",value:o}};a.write(t,r);const i=a.flush();yield{[l]:!0,headers:e,body:i}}for await(const t of e)yield t}};return i.serialize(c,e=>{if(e[l])return{headers:e.headers,body:e.body};const t=Object.keys(e).find(e=>"__type"!==e)??"",{additionalHeaders:r,body:i,eventType:s,explicitPayloadContentType:a}=this.writeEventBody(t,n,e);return{headers:{":event-type":{type:"string",value:s},":message-type":{type:"string",value:"event"},":content-type":{type:"string",value:a??o},...r},body:i}})}async deserializeEventStream({response:t,responseSchema:r,initialResponseContainer:i}){const s=this.marshaller,n=r.getEventStreamMember(),a=r.getMemberSchema(n).getMemberSchemas(),o=Symbol("initialResponseMarker"),l=s.deserialize(t.body,async t=>{const i=Object.keys(t).find(e=>"__type"!==e)??"",s=t[i].body;if("initial-response"===i){const e=await this.deserializer.read(r,s);return delete e[n],{[o]:!0,...e}}if(i in a){const r=a[i];if(r.isStructSchema()){const n={};let a=!1;for(const[o,l]of r.structIterator()){const{eventHeader:r,eventPayload:c}=l.getMergedTraits();if(a=a||Boolean(r||c),c)l.isBlobSchema()?n[o]=s:l.isStringSchema()?n[o]=(this.serdeContext?.utf8Encoder??e)(s):l.isStructSchema()&&(n[o]=await this.deserializer.read(l,s));else if(r){const e=t[i].headers[o]?.value;null!=e&&(l.isNumericSchema()?n[o]=e&&"object"==typeof e&&"bytes"in e?BigInt(e.toString()):Number(e):n[o]=e)}}if(a)return{[i]:n}}return{[i]:await this.deserializer.read(r,s)}}return{$unknown:t}}),c=l[Symbol.asyncIterator](),m=await c.next();if(m.done)return l;if(m.value?.[o]){if(!r)throw new Error("@smithy::core/protocols - initial-response event encountered in event stream but no response schema given.");for(const[e,t]of Object.entries(m.value))i[e]=t}return{async*[Symbol.asyncIterator](){for(m?.value?.[o]||(yield m.value);;){const{done:e,value:t}=await c.next();if(e)break;yield t}}}}writeEventBody(e,r,i){const s=this.serializer;let n,a=e,o=null;const l={};if(r.getSchema()[4].includes(e)){const t=r.getMemberSchema(e);if(!t.isStructSchema())throw new Error("@smithy/core/event-streams - non-struct member not supported in event stream union.");for(const[r,s]of t.structIterator()){const{eventHeader:t,eventPayload:n}=s.getMergedTraits();if(n)o=r;else if(t){const t=i[e][r];let n="binary";s.isNumericSchema()?n=(-2)**31<=t&&t<=2**31-1?"integer":"long":s.isTimestampSchema()?n="timestamp":s.isStringSchema()?n="string":s.isBooleanSchema()&&(n="boolean"),null!=t&&(l[r]={type:n,value:t},delete i[e][r])}}if(null!==o){const r=t.getMemberSchema(o);r.isBlobSchema()?n="application/octet-stream":r.isStringSchema()&&(n="text/plain"),s.write(r,i[e][o])}else s.write(t,i[e])}else{const[t,r]=i[e];a=t,s.write(15,r)}const c=s.flush();return{body:"string"==typeof c?(this.serdeContext?.utf8Decoder??t)(c):c,eventType:a,explicitPayloadContentType:n,additionalHeaders:l}}}export{r as EventStreamSerde};