@k-msg/provider
Version:
Complete provider system with adapters and implementations for K-Message platform
6 lines (4 loc) • 25.7 kB
JavaScript
import{fail as m,KMsgError as T,KMsgErrorCode as _,ok as K}from"@k-msg/core";import{validateTemplatePayload as pe}from"@k-msg/template/send";function c(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}import{KMsgError as L,KMsgErrorCode as h}from"@k-msg/core";function I(e,r){if(e instanceof L)return e;return new L(h.PROVIDER_ERROR,e instanceof Error?e.message:String(e),{providerId:r})}function C(e,r){if(e instanceof L)return e;let t=c(e)?e:{},o=t.result_code,n=o!==void 0&&o!==null?String(o):"UNKNOWN",a=typeof t.message==="string"&&t.message.length>0?t.message:typeof t.msg==="string"&&t.msg.length>0?t.msg:e instanceof Error?e.message:"Unknown Aligo error",s=h.PROVIDER_ERROR;switch(n){case"-100":case"-101":s=h.AUTHENTICATION_FAILED;break;case"-102":case"-201":s=h.INSUFFICIENT_BALANCE;break;case"-103":case"-105":s=h.INVALID_REQUEST;break;case"-501":s=h.TEMPLATE_NOT_FOUND;break;default:s=h.PROVIDER_ERROR}return new L(s,`${a} (code: ${n})`,{providerId:r,resultCode:n})}import{fail as Se,KMsgError as le,KMsgErrorCode as G,ok as _e}from"@k-msg/core";import{KMsgError as U,KMsgErrorCode as q}from"@k-msg/core";function he(e){if(typeof DOMException<"u"&&e instanceof DOMException&&e.name==="TimeoutError")return!0;return typeof e==="object"&&e!==null&&"code"in e&&e.code===q.NETWORK_TIMEOUT}function Ee(e){return typeof DOMException<"u"&&e instanceof DOMException&&e.name==="AbortError"}function Te(e){if(e instanceof Error)return e.message;if(typeof e==="string"&&e.length>0)return e;return"Provider request aborted"}function Ke(e,r,t){if(!r?.aborted)return;if(e instanceof U)return e;let o=r.reason??e,n=Ee(o)?e:o;return new U(he(o)?q.NETWORK_TIMEOUT:q.REQUEST_ABORTED,Te(n),{providerId:t})}function ne(e,r){if(e instanceof U)return e;return new U(q.NETWORK_ERROR,e instanceof Error?e.message:String(e),{providerId:r})}function $(e,r,t){return Ke(e,r,t)??ne(e,t)}async function oe(e,r,t,o){let n=e?.fetch??globalThis.fetch;if(typeof n!=="function")throw ne(Error("No fetch implementation is available; provide ProviderRequestContext.fetch or use a runtime with native fetch support"),o);try{return await n(r,{...t,signal:e?.signal})}catch(a){throw $(a,e?.signal,o)}}import{KMsgError as ie,KMsgErrorCode as ae}from"@k-msg/core";function we(e,r){if(!e)return"";return e.replace(/#\{([^}]+)\}/g,(t,o)=>{let n=r[o];return n===void 0||n===null?t:String(n)})}function Y(e){let r=typeof e.imageUrl==="string"&&e.imageUrl.trim().length>0?e.imageUrl.trim():void 0;if(r)return r;let t=e.media?.image;if(!t)return;if("ref"in t){let o=t.ref.trim();return o.length>0?o:void 0}throw new ie(ae.INVALID_REQUEST,"Aligo MMS/FriendTalk image requires `options.imageUrl` or `options.media.image.ref` (url/path).",{providerId:e.providerId})}function F(e,r){switch(e){case"sendSMS":return"/send/";case"sendAlimTalk":return"/akv10/alimtalk/send/";case"sendFriendTalk":return r.friendtalkEndpoint||"/akv10/friendtalk/send/";default:return"/"}}function V(e){let r=e.getFullYear(),t=String(e.getMonth()+1).padStart(2,"0"),o=String(e.getDate()).padStart(2,"0"),n=String(e.getHours()).padStart(2,"0"),a=String(e.getMinutes()).padStart(2,"0");return{date:`${r}${t}${o}`,time:`${n}${a}`}}function se(e){if(typeof e==="number"&&Number.isFinite(e))return e;if(typeof e==="string"){let r=e.trim();if(!r)return;let t=Number(r);if(Number.isFinite(t))return t}return}function E(e,r){let t=(typeof r?.kakaoChannelSenderKey==="string"&&r.kakaoChannelSenderKey.trim().length>0?r.kakaoChannelSenderKey.trim():e.config.senderKey)||"";if(!t)throw new ie(ae.INVALID_REQUEST,"kakao channel senderKey is required (ctx.kakaoChannelSenderKey or config.senderKey)",{providerId:e.providerId});return t}function Q(e){switch(typeof e.inspStatus==="string"?e.inspStatus.trim().toUpperCase():""){case"APR":return"APPROVED";case"REJ":return"REJECTED";case"REQ":case"REG":return"INSPECTION";default:return"PENDING"}}function f(e){if(typeof e!=="string")return;let r=e.trim();if(!r)return;let t=/^(\d{4})-(\d{2})-(\d{2})\s+(\d{2}):(\d{2}):(\d{2})$/.exec(r);if(!t)return;let o=Number(t[1]),n=Number(t[2]),a=Number(t[3]),s=Number(t[4]),l=Number(t[5]),d=Number(t[6]),i=new Date(o,n-1,a,s,l,d);return Number.isNaN(i.getTime())?void 0:i}function de(e,r){if(!e)return"";let t=e._full_text;if(t!==void 0&&t!==null)return String(t);if(!r)return Object.values(e).map(String).join(`
`);return we(r,e)}async function u(e){let r=new FormData;for(let[t,o]of Object.entries(e.data))if(o!==void 0&&o!==null)r.append(t,String(o));try{let t=await oe(e.context,`${e.host}${e.endpoint}`,{method:"POST",body:r},e.providerId);if(!t.ok)throw new le(G.NETWORK_ERROR,`HTTP error! status: ${t.status}`,{providerId:e.providerId});return await t.json()}catch(t){throw $(t,e.context?.signal,e.providerId)}}function y(e){let{providerId:r,response:t,fallbackMessage:o}=e,n=t.code,a=se(n);if(a===0)return _e(void 0);let s=typeof t.message==="string"&&t.message.length>0?t.message:o,l=a===509||a===-99?G.INVALID_REQUEST:G.PROVIDER_ERROR;return Se(new le(l,s,{providerId:r,originalCode:n,raw:t}))}import{ButtonParser as Me}from"@k-msg/template/send";function J(e){if(!Array.isArray(e)||e.length===0)return;let r=JSON.parse(Me.serializeButtons(e));return JSON.stringify({button:r})}function ue(e,r){return new T(e.code,e.message,{providerId:r,...e.details??{}})}async function z(e,r,t){try{let o=E(e,t),n=pe(r,{requireName:!0,requireContent:!0});if(n.isFailure)return m(ue(n.error,e.providerId));let a={apikey:e.config.apiKey,userid:e.config.userId,senderkey:o,tpl_name:n.value.name??r.name,tpl_content:n.value.content??r.content},s=J(n.value.buttons);if(s)a.tpl_button=s;let l=await u({host:e.alimtalkHost,endpoint:"/akv10/template/add/",data:a,providerId:e.providerId}),d=y({providerId:e.providerId,response:l,fallbackMessage:"template create failed"});if(d.isFailure)return d;let i=c(l.data)?l.data:{},p=String(i.templtCode??"");if(!p)return m(new T(_.PROVIDER_ERROR,"template create did not return templtCode",{providerId:e.providerId,raw:l}));let g=f(i.cdate)??new Date,k=f(i.udate)??f(i.cdate)??g;return K({id:p,code:p,name:String(i.templtName??n.value.name??r.name),content:String(i.templtContent??n.value.content??r.content),category:r.category,status:Q(i),buttons:Array.isArray(i.buttons)?i.buttons:n.value.buttons,variables:r.variables,createdAt:g,updatedAt:k})}catch(o){return m(I(o,e.providerId))}}async function N(e,r,t){try{let o=E(e,t),n=r.trim();if(!n)return m(new T(_.INVALID_REQUEST,"code is required",{providerId:e.providerId}));let a=await u({host:e.alimtalkHost,endpoint:"/akv10/template/list/",data:{apikey:e.config.apiKey,userid:e.config.userId,senderkey:o,tpl_code:n},providerId:e.providerId}),s=y({providerId:e.providerId,response:a,fallbackMessage:"template get failed"});if(s.isFailure)return s;let l=a.list,i=(Array.isArray(l)?l:[]).find(c);if(!i)return m(new T(_.TEMPLATE_NOT_FOUND,"Template not found",{providerId:e.providerId,templateCode:n}));let p=String(i.templtCode??n),g=f(i.cdate)??new Date,k=f(i.udate)??f(i.cdate)??g;return K({id:p,code:p,name:String(i.templtName??""),content:String(i.templtContent??""),status:Q(i),buttons:Array.isArray(i.buttons)?i.buttons:void 0,createdAt:g,updatedAt:k})}catch(o){return m(I(o,e.providerId))}}async function X(e,r,t,o){try{let n=E(e,o),a=r.trim();if(!a)return m(new T(_.INVALID_REQUEST,"code is required",{providerId:e.providerId}));let s=await N(e,a,{kakaoChannelSenderKey:n});if(s.isFailure)return s;let l=s.value,d=typeof t.name==="string"&&t.name.trim().length>0?t.name.trim():l.name,i=typeof t.content==="string"&&t.content.trim().length>0?t.content:l.content,p=pe({name:d,content:i,buttons:t.buttons!==void 0?t.buttons:l.buttons},{requireName:!0,requireContent:!0});if(p.isFailure)return m(ue(p.error,e.providerId));let g={apikey:e.config.apiKey,userid:e.config.userId,senderkey:n,tpl_code:a,tpl_name:p.value.name??d,tpl_content:p.value.content??i},k=J(p.value.buttons);if(k)g.tpl_button=k;let P=await u({host:e.alimtalkHost,endpoint:"/akv10/template/modify/",data:g,providerId:e.providerId}),M=y({providerId:e.providerId,response:P,fallbackMessage:"template update failed"});if(M.isFailure)return M;let S=await N(e,a,{kakaoChannelSenderKey:n});if(S.isSuccess)return S;return K({...l,name:p.value.name??d,content:p.value.content??i,...t.category!==void 0?{category:t.category}:{},...t.variables!==void 0?{variables:t.variables}:{},...t.buttons!==void 0?{buttons:p.value.buttons}:{},updatedAt:new Date})}catch(n){return m(I(n,e.providerId))}}async function Z(e,r,t){try{let o=E(e,t),n=r.trim();if(!n)return m(new T(_.INVALID_REQUEST,"code is required",{providerId:e.providerId}));let a=await u({host:e.alimtalkHost,endpoint:"/akv10/template/del/",data:{apikey:e.config.apiKey,userid:e.config.userId,senderkey:o,tpl_code:n},providerId:e.providerId}),s=y({providerId:e.providerId,response:a,fallbackMessage:"template delete failed"});if(s.isFailure)return s;return K(void 0)}catch(o){return m(I(o,e.providerId))}}async function x(e,r,t){try{let o=E(e,t),n=await u({host:e.alimtalkHost,endpoint:"/akv10/template/list/",data:{apikey:e.config.apiKey,userid:e.config.userId,senderkey:o},providerId:e.providerId}),a=y({providerId:e.providerId,response:n,fallbackMessage:"template list failed"});if(a.isFailure)return a;let s=n.list,d=(Array.isArray(s)?s:[]).filter(c).map((i)=>{let p=String(i.templtCode??""),g=f(i.cdate)??new Date,k=f(i.udate)??f(i.cdate)??g;return{id:p,code:p,name:String(i.templtName??""),content:String(i.templtContent??""),status:Q(i),buttons:Array.isArray(i.buttons)?i.buttons:void 0,createdAt:g,updatedAt:k}}).filter((i)=>i.code.length>0);if(r?.status){let i=r.status.trim().toUpperCase();return K(d.filter((p)=>p.status===i))}return K(d)}catch(o){return m(I(o,e.providerId))}}async function ee(e,r,t){try{let o=E(e,t),n=r.trim();if(!n)return m(new T(_.INVALID_REQUEST,"code is required",{providerId:e.providerId}));let a=await u({host:e.alimtalkHost,endpoint:"/akv10/template/request/",data:{apikey:e.config.apiKey,userid:e.config.userId,senderkey:o,tpl_code:n},providerId:e.providerId}),s=y({providerId:e.providerId,response:a,fallbackMessage:"template inspection request failed"});if(s.isFailure)return s;return K(void 0)}catch(o){return m(I(o,e.providerId))}}import{readRuntimeEnv as w}from"@k-msg/core";var fe={iwinv:{providerId:"iwinv",providerName:"IWINV Messaging Provider",channelOnboarding:"manual",templateLifecycleApi:"available",plusIdPolicy:"optional",plusIdInference:"unsupported",liveTestSupport:"supported",checks:[{id:"channel_registered_in_console",title:"Kakao channel is registered in IWINV console",description:"IWINV channel onboarding is manual. Confirm channel registration and approval in console.",kind:"manual",severity:"blocker",scopes:["doctor","preflight"]},{id:"iwinv_config_required",title:"IWINV config has required keys",kind:"config",severity:"blocker",scopes:["doctor","preflight"],configKeys:["apiKey"]},{id:"template_capability_available",title:"Template lifecycle APIs are available",kind:"capability",severity:"warning",scopes:["doctor","preflight"],capabilityMethods:["listTemplates","getTemplate","createTemplate","updateTemplate","deleteTemplate"]},{id:"template_list_probe",title:"Template list API probe",kind:"api_probe",severity:"warning",scopes:["doctor","preflight"],probeOperation:"list_templates"}],notes:["Channel add/auth is not available via IWINV public API in current integration.","Template APIs are available and can be probed."]},aligo:{providerId:"aligo",providerName:"Aligo Smart SMS",channelOnboarding:"api",templateLifecycleApi:"available",plusIdPolicy:"required_if_no_inference",plusIdInference:"supported",liveTestSupport:"supported",checks:[{id:"aligo_config_required",title:"Aligo config has required keys",kind:"config",severity:"blocker",scopes:["doctor","preflight"],configKeys:["apiKey","userId"]},{id:"channel_api_capability_available",title:"Kakao channel APIs are available",kind:"capability",severity:"warning",scopes:["doctor","preflight"],capabilityMethods:["listKakaoChannels","requestKakaoChannelAuth","addKakaoChannel"]},{id:"channel_list_probe",title:"Kakao channel list API probe",kind:"api_probe",severity:"warning",scopes:["doctor","preflight"],probeOperation:"list_kakao_channels"},{id:"template_list_probe",title:"Template list API probe",kind:"api_probe",severity:"warning",scopes:["doctor","preflight"],probeOperation:"list_templates"}]},solapi:{providerId:"solapi",providerName:"SOLAPI Messaging Provider",channelOnboarding:"none",templateLifecycleApi:"unavailable",plusIdPolicy:"required_if_no_inference",plusIdInference:"unsupported",liveTestSupport:"partial",checks:[{id:"solapi_config_required",title:"SOLAPI config has required keys",kind:"config",severity:"blocker",scopes:["doctor","preflight"],configKeys:["apiKey","apiSecret"]}],notes:["SOLAPI ALIMTALK requires kakao profileId/pfId, but plusId inference is not available in current integration."]},mock:{providerId:"mock",providerName:"Mock Provider",channelOnboarding:"api",templateLifecycleApi:"available",plusIdPolicy:"optional",plusIdInference:"supported",liveTestSupport:"none",checks:[{id:"mock_template_capability_available",title:"Mock template APIs are available",kind:"capability",severity:"info",scopes:["doctor","preflight"],capabilityMethods:["listTemplates","getTemplate","createTemplate"]}]}};function me(e){return fe[e]}function ar(){return Object.values(fe)}import{fail as R,KMsgError as j,KMsgErrorCode as B,ok as H}from"@k-msg/core";async function ge(e,r){try{let t={apikey:e.config.apiKey,userid:e.config.userId,...typeof r?.plusId==="string"&&r.plusId.trim().length>0?{plusid:r.plusId.trim()}:{},...typeof r?.senderKey==="string"&&r.senderKey.trim().length>0?{senderkey:r.senderKey.trim()}:{}},o=await u({host:e.alimtalkHost,endpoint:"/akv10/profile/list/",data:t,providerId:e.providerId}),n=y({providerId:e.providerId,response:o,fallbackMessage:"channel list failed"});if(n.isFailure)return n;let a=o.list,l=(Array.isArray(a)?a:[]).filter(c).map((d)=>({providerId:e.providerId,senderKey:String(d.senderKey??""),plusId:typeof d.uuid==="string"?d.uuid:void 0,name:typeof d.name==="string"?d.name:void 0,status:typeof d.status==="string"?d.status:void 0,createdAt:f(d.cdate),updatedAt:f(d.udate),raw:d})).filter((d)=>d.senderKey.length>0);return H(l)}catch(t){return R(I(t,e.providerId))}}async function ce(e){try{let r=await u({host:e.alimtalkHost,endpoint:"/akv10/category/",data:{apikey:e.config.apiKey,userid:e.config.userId},providerId:e.providerId}),t=y({providerId:e.providerId,response:r,fallbackMessage:"category list failed"});if(t.isFailure)return t;let o=c(r.data)?r.data:{},n=(a)=>{return(Array.isArray(a)?a:[]).filter(c).map((l)=>({code:String(l.code??""),name:String(l.name??""),parentCode:typeof l.parentCode==="string"&&l.parentCode.length>0?l.parentCode:void 0})).filter((l)=>l.code.length>0)};return H({first:n(o.firstBusinessType),second:n(o.secondBusinessType),third:n(o.thirdBusinessType)})}catch(r){return R(I(r,e.providerId))}}async function Ie(e,r){try{let t=r.plusId.trim(),o=r.phoneNumber.trim();if(!t||!o)return R(new j(B.INVALID_REQUEST,"plusId and phoneNumber are required",{providerId:e.providerId}));let n=await u({host:e.alimtalkHost,endpoint:"/akv10/profile/auth/",data:{apikey:e.config.apiKey,userid:e.config.userId,plusid:t,phonenumber:o},providerId:e.providerId}),a=y({providerId:e.providerId,response:n,fallbackMessage:"channel auth failed"});if(a.isFailure)return a;return H(void 0)}catch(t){return R(I(t,e.providerId))}}async function ye(e,r){try{let t=r.plusId.trim(),o=r.authNum.trim(),n=r.phoneNumber.trim(),a=r.categoryCode.trim();if(!t||!o||!n||!a)return R(new j(B.INVALID_REQUEST,"plusId, authNum, phoneNumber, categoryCode are required",{providerId:e.providerId}));let s=await u({host:e.alimtalkHost,endpoint:"/akv10/profile/add/",data:{apikey:e.config.apiKey,userid:e.config.userId,plusid:t,authnum:o,phonenumber:n,categorycode:a},providerId:e.providerId}),l=y({providerId:e.providerId,response:s,fallbackMessage:"channel add failed"});if(l.isFailure)return l;let d=s.data,i=Array.isArray(d)?d.find(c):c(d)?d:void 0;if(!i)return R(new j(B.PROVIDER_ERROR,"channel add returned empty data",{providerId:e.providerId,raw:s}));let p=String(i.senderKey??"");if(!p)return R(new j(B.PROVIDER_ERROR,"channel add did not return senderKey",{providerId:e.providerId,raw:i}));return H({providerId:e.providerId,senderKey:p,plusId:typeof i.uuid==="string"?i.uuid:t,name:typeof i.name==="string"?i.name:void 0,status:typeof i.status==="string"?i.status:void 0,createdAt:f(i.cdate),updatedAt:f(i.udate),raw:i})}catch(t){return R(I(t,e.providerId))}}import{fail as v,KMsgError as b,KMsgErrorCode as A,ok as re}from"@k-msg/core";function Ce(e,r){if(e.type!=="ALIMTALK")return;if(e.failover?.enabled!==!0)return;return[{code:"FAILOVER_PARTIAL_PROVIDER",message:"Aligo failover mapping is partial. API-level fallback may be attempted for non-Kakao-user failures.",details:{providerId:r,mappedFields:["failover","fmessage_1","fsubject_1"],unsupportedFields:["fallbackChannel"]}}]}async function Ne(e,r){let t=r.from||e.config.sender||"";if(!t)return v(new b(A.INVALID_REQUEST,"from is required for SMS/LMS/MMS (options.from or config.sender)",{providerId:e.providerId}));let o={key:e.config.apiKey,user_id:e.config.userId,sender:t,receiver:r.to,msg:r.text,msg_type:r.type,title:r.subject,testmode_yn:e.config.testMode?"Y":"N"},n=r.options?.scheduledAt;if(n instanceof Date&&!Number.isNaN(n.getTime())){let{date:s,time:l}=V(n);o.rdate=s,o.rtime=l}if(r.type==="MMS"){let s=Y({imageUrl:r.imageUrl,media:r.media,providerId:e.providerId});if(!s)return v(new b(A.INVALID_REQUEST,"image is required for MMS (options.imageUrl or options.media.image.ref)",{providerId:e.providerId}));o.image=s}let a=await u({host:e.smsHost,endpoint:F("sendSMS",e.config),data:o,providerId:e.providerId,context:e.requestContext});if(a.result_code!=="1")return v(C(a,e.providerId));return re({messageId:r.messageId||crypto.randomUUID(),providerId:e.providerId,providerMessageId:a.msg_id,status:"PENDING",type:r.type,to:r.to,raw:a})}async function Oe(e,r){let t=Ce(r,e.providerId),o=(typeof r.kakao?.profileId==="string"?r.kakao.profileId:e.config.senderKey)||"";if(!o)return v(new b(A.INVALID_REQUEST,"kakao profileId is required (options.kakao.profileId or config.senderKey)",{providerId:e.providerId}));let n=r.from||e.config.sender||"";if(!n)return v(new b(A.INVALID_REQUEST,"from is required for ALIMTALK (options.from or config.sender)",{providerId:e.providerId}));let{variables:a,templateId:s}=r;if(!s||s.length===0)return v(new b(A.INVALID_REQUEST,"templateId is required for ALIMTALK",{providerId:e.providerId}));let l=typeof r.providerOptions?.templateContent==="string"?r.providerOptions.templateContent:void 0,d={apikey:e.config.apiKey,userid:e.config.userId,senderkey:o,tpl_code:s,sender:n,receiver_1:r.to,subject_1:"알림톡",message_1:de(a,l),testMode:e.config.testMode?"Y":"N"},i=typeof r.providerOptions?.failover==="string"?r.providerOptions.failover.trim().toUpperCase():"",p=i==="Y"||i==="N"?i:void 0,g=r.failover?.enabled===!0?"Y":r.failover?.enabled===!1?"N":void 0,k=p??g,P=typeof r.providerOptions?.fsubject_1==="string"&&r.providerOptions.fsubject_1.trim().length>0?r.providerOptions.fsubject_1.trim():typeof r.failover?.fallbackTitle==="string"&&r.failover.fallbackTitle.trim().length>0?r.failover.fallbackTitle.trim():void 0,M=typeof r.providerOptions?.fmessage_1==="string"&&r.providerOptions.fmessage_1.trim().length>0?r.providerOptions.fmessage_1.trim():typeof r.failover?.fallbackContent==="string"&&r.failover.fallbackContent.trim().length>0?r.failover.fallbackContent.trim():void 0;if(k)d.failover=k;if(P)d.fsubject_1=P;if(M)d.fmessage_1=M;let S=r.options?.scheduledAt;if(S instanceof Date&&!Number.isNaN(S.getTime())){let{date:be,time:Ae}=V(S);d.reserve="Y",d.reserve_date=be,d.reserve_time=Ae}let D=await u({host:e.alimtalkHost,endpoint:F("sendAlimTalk",e.config),data:d,providerId:e.providerId,context:e.requestContext});if(D.result_code!=="0")return v(C(D,e.providerId));return re({messageId:r.messageId||crypto.randomUUID(),providerId:e.providerId,providerMessageId:D.msg_id,status:"PENDING",type:r.type,to:r.to,...Array.isArray(t)&&t.length>0?{warnings:t}:{},raw:D})}async function Pe(e,r){let t=(typeof r.kakao?.profileId==="string"?r.kakao.profileId:e.config.senderKey)||"";if(!t)return v(new b(A.INVALID_REQUEST,"kakao profileId is required (options.kakao.profileId or config.senderKey)",{providerId:e.providerId}));let o=r.from||e.config.sender||"";if(!o)return v(new b(A.INVALID_REQUEST,"from is required for FRIENDTALK (options.from or config.sender)",{providerId:e.providerId}));let n={apikey:e.config.apiKey,userid:e.config.userId,senderkey:t,sender:o,receiver_1:r.to,subject_1:"친구톡",message_1:r.text,testMode:e.config.testMode?"Y":"N"},a=Y({imageUrl:r.imageUrl,media:r.media,providerId:e.providerId});if(a)n.image_1=a;let s=Array.isArray(r.kakao?.buttons)?r.kakao.buttons:r.buttons;if(s)n.button_1=JSON.stringify(s);let l=r.options?.scheduledAt;if(l instanceof Date&&!Number.isNaN(l.getTime())){let{date:i,time:p}=V(l);n.reserve="Y",n.reserve_date=i,n.reserve_time=p}let d=await u({host:e.alimtalkHost,endpoint:F("sendFriendTalk",e.config),data:n,providerId:e.providerId,context:e.requestContext});if(d.result_code!=="0")return v(C(d,e.providerId));return re({messageId:r.messageId||crypto.randomUUID(),providerId:e.providerId,providerMessageId:d.msg_id,status:"PENDING",type:r.type,to:r.to,raw:d})}async function ve(e,r){try{switch(r.type){case"ALIMTALK":return await Oe(e,r);case"FRIENDTALK":return await Pe(e,r);case"SMS":case"LMS":case"MMS":return await Ne(e,r);default:return v(new b(A.INVALID_REQUEST,`AligoProvider does not support type ${r.type}`,{providerId:e.providerId,type:r.type}))}}catch(t){return v(C(t,e.providerId))}}function te(){return{apiKey:w("ALIGO_API_KEY")||"",userId:w("ALIGO_USER_ID")||"",senderKey:w("ALIGO_SENDER_KEY")||"",sender:w("ALIGO_SENDER")||"",friendtalkEndpoint:w("ALIGO_FRIENDTALK_ENDPOINT"),testMode:w("NODE_ENV")!=="production",debug:w("NODE_ENV")==="development"}}class W{id="aligo";name="Aligo Smart SMS";supportedTypes=["ALIMTALK","FRIENDTALK","SMS","LMS","MMS"];transportCapabilities={abortSignal:"supported",injectableFetch:"supported"};config;smsHost;alimtalkHost;getOnboardingSpec(){let e=me(this.id);if(!e)throw Error(`Onboarding spec missing for provider: ${this.id}`);return e}constructor(e){if(!e||typeof e!=="object")throw Error("AligoProvider requires a config object");if(!e.apiKey||e.apiKey.length===0)throw Error("AligoProvider requires `apiKey`");if(!e.userId||e.userId.length===0)throw Error("AligoProvider requires `userId`");this.config=e,this.smsHost=e.smsBaseUrl||"https://apis.aligo.in",this.alimtalkHost=e.alimtalkBaseUrl||"https://kakaoapi.aligo.in"}getRuntimeContext(e){return{providerId:this.id,config:this.config,smsHost:this.smsHost,alimtalkHost:this.alimtalkHost,requestContext:e}}async healthCheck(){let e=Date.now(),r=[];try{if(!this.config.apiKey)r.push("Missing apiKey");if(!this.config.userId)r.push("Missing userId");if(!this.config.sender)r.push("Missing sender (default from)");try{new URL(this.smsHost)}catch{r.push("Invalid smsBaseUrl")}try{new URL(this.alimtalkHost)}catch{r.push("Invalid alimtalkBaseUrl")}return{healthy:r.length===0,issues:r,latencyMs:Date.now()-e,data:{provider:this.id,smsBaseUrl:this.smsHost,alimtalkBaseUrl:this.alimtalkHost}}}catch(t){return r.push(t instanceof Error?t.message:String(t)),{healthy:!1,issues:r,latencyMs:Date.now()-e}}}async send(e,r){let t=e.messageId||crypto.randomUUID(),o={...e,messageId:t};return ve(this.getRuntimeContext(r),o)}async listKakaoChannels(e){return ge(this.getRuntimeContext(),e)}async listKakaoChannelCategories(){return ce(this.getRuntimeContext())}async requestKakaoChannelAuth(e){return Ie(this.getRuntimeContext(),e)}async addKakaoChannel(e){return ye(this.getRuntimeContext(),e)}}var hr=(e)=>new W(e),De=()=>{let e=te();if(!e.apiKey||!e.userId)throw Error("ALIGO_API_KEY and ALIGO_USER_ID are required");return new W(e)};class Le{static create(e){return new W(e)}static createDefault(){return De()}}class O{id="aligo";config;smsHost;alimtalkHost;constructor(e){if(!e||typeof e!=="object")throw Error("AligoTemplateProvider requires a config object");if(!e.apiKey||e.apiKey.length===0)throw Error("AligoTemplateProvider requires `apiKey`");if(!e.userId||e.userId.length===0)throw Error("AligoTemplateProvider requires `userId`");this.config=e,this.smsHost=e.smsBaseUrl||"https://apis.aligo.in",this.alimtalkHost=e.alimtalkBaseUrl||"https://kakaoapi.aligo.in"}getRuntimeContext(){return{providerId:this.id,config:this.config,smsHost:this.smsHost,alimtalkHost:this.alimtalkHost}}async createTemplate(e,r){return z(this.getRuntimeContext(),e,r)}async updateTemplate(e,r,t){return X(this.getRuntimeContext(),e,r,t)}async deleteTemplate(e,r){return Z(this.getRuntimeContext(),e,r)}async getTemplate(e,r){return N(this.getRuntimeContext(),e,r)}async listTemplates(e,r){return x(this.getRuntimeContext(),e,r)}async requestTemplateInspection(e,r){return ee(this.getRuntimeContext(),e,r)}}var Ue=(e)=>new O(e),ke=()=>{let e=te();if(!e.apiKey||!e.userId)throw Error("ALIGO_API_KEY and ALIGO_USER_ID are required");return new O(e)};class Re{static create(e){return new O(e)}static createDefault(){return ke()}}export{X as updateTemplate,ee as requestTemplateInspection,x as listTemplates,N as getTemplate,Z as deleteTemplate,z as createTemplate,ke as createDefaultAligoTemplateProvider,Ue as createAligoTemplateProvider,Re as AligoTemplateProviderFactory,O as AligoTemplateProvider};
//# debugId=1AA1DCF230C22B0664756E2164756E21
//# sourceMappingURL=template.mjs.map