UNPKG

@visulima/email

Version:

A comprehensive email library with multi-provider support, crypto utilities, and template engines

2 lines (1 loc) 4.04 kB
var E=Object.defineProperty;var v=(e,r)=>E(e,"name",{value:r,configurable:!0});import{context as h,trace as w,SpanStatusCode as f}from"@opentelemetry/api";import d from"./EmailError-zm2ffVav.js";import A from"./RequiredOptionError-CevW3u2K.js";import S from"./createLogger-DlElSVQP.js";import{defineProvider as $}from"./defineProvider-B9rSklAJ.js";var x=Object.defineProperty,c=v((e,r)=>x(e,"name",{value:r,configurable:!0}),"c");const z=c(e=>typeof e=="function","isProviderFactory"),C=c(e=>e!==null&&typeof e=="object"&&"sendEmail"in e&&"initialize"in e&&"isAvailable"in e,"isProvider"),s="opentelemetry",F="email",P="email.send",u=c(e=>e?typeof e=="string"?e:Array.isArray(e)?e.map(r=>typeof r=="string"?r:r.email).join(", "):e.email:"","formatEmailAddress"),k=c((e,r)=>{const i={"email.from":u(e.from),"email.subject":e.subject};return e.to&&(i["email.to"]=u(e.to)),e.cc&&(i["email.cc"]=u(e.cc)),e.bcc&&(i["email.bcc"]=u(e.bcc)),e.replyTo&&(i["email.reply_to"]=u(e.replyTo)),e.priority&&(i["email.priority"]=e.priority),e.tags&&e.tags.length>0&&(i["email.tags"]=e.tags.join(", ")),e.attachments&&e.attachments.length>0&&(i["email.attachments.count"]=e.attachments.length),r?(e.text&&(i["email.text.length"]=e.text.length),e.html&&(i["email.html.length"]=e.html.length)):(e.text&&(i["email.has_text"]=!0),e.html&&(i["email.has_html"]=!0)),i},"createSpanAttributes"),N=$(e=>{if(!e.provider)throw new A(s,"provider");const r={debug:e.debug||!1,logger:e.logger,provider:e.provider,recordContent:e.recordContent||!1,retries:e.retries||3,serviceName:e.serviceName||F,timeout:e.timeout||3e4,tracer:e.tracer};let i=!1,t;const m=S(s,e.logger),y=c(()=>r.tracer?r.tracer:w.getTracer(r.serviceName),"getTracer"),p=c(async()=>{try{if(z(r.provider))t=r.provider({});else if(C(r.provider))t=r.provider;else throw new d(s,"Invalid provider: must be a Provider instance or ProviderFactory function");await t.initialize(),m.debug(`Initialized wrapped provider: ${t.name||"unknown"}`)}catch(o){throw new d(s,`Failed to initialize wrapped provider: ${o.message}`,{cause:o})}},"initializeProvider"),b=c(()=>t?.features?t.features:{attachments:!0,batchSending:!1,customHeaders:!0,html:!0,replyTo:!0,scheduling:!1,tagging:!1,templates:!1,tracking:!1},"getFeatures");return{get features(){return b()},getInstance(){if(!t)throw new d(s,"Provider not initialized. Call initialize() first.");return t},async initialize(){if(!i)try{await p(),i=!0,m.debug("OpenTelemetry provider initialized")}catch(o){throw new d(s,`Failed to initialize: ${o.message}`,{cause:o})}},async isAvailable(){try{return t||await p(),await t.isAvailable()}catch{return!1}},name:s,options:r,async sendEmail(o){const n=y().startSpan(P);try{t||await p();const l=k(o,r.recordContent);n.setAttributes(l),t.name&&n.setAttribute("email.provider",t.name);const a=await h.with(w.setSpan(h.active(),n),async()=>await t.sendEmail(o));if(a.success&&a.data)return n.setStatus({code:f.OK}),n.setAttribute("email.message_id",a.data.messageId),n.setAttribute("email.sent",!0),a.data.timestamp&&n.setAttribute("email.timestamp",a.data.timestamp.toISOString()),m.debug(`Email sent successfully via ${t.name||"unknown"}`),{data:{...a.data,provider:`${s}(${t.name||"unknown"})`},success:!0};const g=a.error instanceof Error?a.error.message:String(a.error||"Unknown error");return n.setStatus({code:f.ERROR,message:g}),n.setAttribute("email.sent",!1),n.recordException(a.error instanceof Error?a.error:new Error(g)),m.debug(`Failed to send email via ${t.name||"unknown"}:`,g),a}catch(l){const a=l instanceof Error?l.message:String(l);return n.setStatus({code:f.ERROR,message:a}),n.setAttribute("email.sent",!1),n.recordException(l instanceof Error?l:new Error(a)),m.debug("Exception sending email:",a),{error:new d(s,`Failed to send email: ${a}`,{cause:l}),success:!1}}finally{n.end()}},async shutdown(){t&&t.shutdown&&await t.shutdown(),i=!1},async validateCredentials(){try{return t||await p(),t.validateCredentials?await t.validateCredentials():await t.isAvailable()}catch{return!1}}}});export{N as default};