@k-msg/provider
Version:
Complete provider system with adapters and implementations for K-Message platform
2 lines • 67.5 kB
JavaScript
var{defineProperty:Ce,getOwnPropertyNames:Ft,getOwnPropertyDescriptor:Vt}=Object,Ut=Object.prototype.hasOwnProperty;var Ge=new WeakMap,qt=(e)=>{var t=Ge.get(e),r;if(t)return t;if(t=Ce({},"__esModule",{value:!0}),e&&typeof e==="object"||typeof e==="function")Ft(e).map((n)=>!Ut.call(t,n)&&Ce(t,n,{get:()=>e[n],enumerable:!(r=Vt(e,n))||r.enumerable}));return Ge.set(e,t),t};var xt=(e,t)=>{for(var r in t)Ce(e,r,{get:t[r],enumerable:!0,configurable:!0,set:(n)=>t[r]=()=>n})};var or={};xt(or,{providerOnboardingSpecs:()=>Ee,providerConfigFieldSpecs:()=>gt,providerCliMetadata:()=>Kt,listProviderOnboardingSpecs:()=>at,initializeIWINV:()=>Lt,initializeAligo:()=>ct,getProviderOnboardingSpec:()=>re,createIWINVProvider:()=>Pt,createDefaultIWINVProvider:()=>je,createDefaultAligoProvider:()=>Le,createAligoProvider:()=>mt,MockProvider:()=>Je,IWINVProviderFactory:()=>Ye,IWINVProvider:()=>ye,AligoProviderFactory:()=>Ke,AligoProvider:()=>me});module.exports=qt(or);var b=require("@k-msg/core"),Oe=require("@k-msg/template/send");function E(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}var V=require("@k-msg/core");function q(e,t){if(e instanceof V.KMsgError)return e;return new V.KMsgError(V.KMsgErrorCode.PROVIDER_ERROR,e instanceof Error?e.message:String(e),{providerId:t})}function Ie(e,t){if(e instanceof V.KMsgError)return e;let r=E(e)?e:{},n=r.result_code,i=n!==void 0&&n!==null?String(n):"UNKNOWN",o=typeof r.message==="string"&&r.message.length>0?r.message:typeof r.msg==="string"&&r.msg.length>0?r.msg:e instanceof Error?e.message:"Unknown Aligo error",d=V.KMsgErrorCode.PROVIDER_ERROR;switch(i){case"-100":case"-101":d=V.KMsgErrorCode.AUTHENTICATION_FAILED;break;case"-102":case"-201":d=V.KMsgErrorCode.INSUFFICIENT_BALANCE;break;case"-103":case"-105":d=V.KMsgErrorCode.INVALID_REQUEST;break;case"-501":d=V.KMsgErrorCode.TEMPLATE_NOT_FOUND;break;default:d=V.KMsgErrorCode.PROVIDER_ERROR}return new V.KMsgError(d,`${o} (code: ${i})`,{providerId:t,resultCode:i})}var $=require("@k-msg/core");var J=require("@k-msg/core");function Ht(e){if(typeof DOMException<"u"&&e instanceof DOMException&&e.name==="TimeoutError")return!0;return typeof e==="object"&&e!==null&&"code"in e&&e.code===J.KMsgErrorCode.NETWORK_TIMEOUT}function Bt(e){return typeof DOMException<"u"&&e instanceof DOMException&&e.name==="AbortError"}function Qt(e){if(e instanceof Error)return e.message;if(typeof e==="string"&&e.length>0)return e;return"Provider request aborted"}function _e(e,t,r){if(!t?.aborted)return;if(e instanceof J.KMsgError)return e;let n=t.reason??e,i=Bt(n)?e:n;return new J.KMsgError(Ht(n)?J.KMsgErrorCode.NETWORK_TIMEOUT:J.KMsgErrorCode.REQUEST_ABORTED,Qt(i),{providerId:r})}function Re(e,t){if(e instanceof J.KMsgError)return e;return new J.KMsgError(J.KMsgErrorCode.NETWORK_ERROR,e instanceof Error?e.message:String(e),{providerId:t})}function x(e,t,r){return _e(e,t,r)??Re(e,r)}async function G(e,t,r,n){let i=e?.fetch??globalThis.fetch;if(typeof i!=="function")throw Re(Error("No fetch implementation is available; provide ProviderRequestContext.fetch or use a runtime with native fetch support"),n);try{return await i(t,{...r,signal:e?.signal})}catch(o){throw x(o,e?.signal,n)}}var le=require("@k-msg/core");function Wt(e,t){if(!e)return"";return e.replace(/#\{([^}]+)\}/g,(r,n)=>{let i=t[n];return i===void 0||i===null?r:String(i)})}function De(e){let t=typeof e.imageUrl==="string"&&e.imageUrl.trim().length>0?e.imageUrl.trim():void 0;if(t)return t;let r=e.media?.image;if(!r)return;if("ref"in r){let n=r.ref.trim();return n.length>0?n:void 0}throw new le.KMsgError(le.KMsgErrorCode.INVALID_REQUEST,"Aligo MMS/FriendTalk image requires `options.imageUrl` or `options.media.image.ref` (url/path).",{providerId:e.providerId})}function Ae(e,t){switch(e){case"sendSMS":return"/send/";case"sendAlimTalk":return"/akv10/alimtalk/send/";case"sendFriendTalk":return t.friendtalkEndpoint||"/akv10/friendtalk/send/";default:return"/"}}function Te(e){let t=e.getFullYear(),r=String(e.getMonth()+1).padStart(2,"0"),n=String(e.getDate()).padStart(2,"0"),i=String(e.getHours()).padStart(2,"0"),o=String(e.getMinutes()).padStart(2,"0");return{date:`${t}${r}${n}`,time:`${i}${o}`}}function Xe(e){if(typeof e==="number"&&Number.isFinite(e))return e;if(typeof e==="string"){let t=e.trim();if(!t)return;let r=Number(t);if(Number.isFinite(r))return r}return}function ae(e,t){let r=(typeof t?.kakaoChannelSenderKey==="string"&&t.kakaoChannelSenderKey.trim().length>0?t.kakaoChannelSenderKey.trim():e.config.senderKey)||"";if(!r)throw new le.KMsgError(le.KMsgErrorCode.INVALID_REQUEST,"kakao channel senderKey is required (ctx.kakaoChannelSenderKey or config.senderKey)",{providerId:e.providerId});return r}function Ne(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 K(e){if(typeof e!=="string")return;let t=e.trim();if(!t)return;let r=/^(\d{4})-(\d{2})-(\d{2})\s+(\d{2}):(\d{2}):(\d{2})$/.exec(t);if(!r)return;let n=Number(r[1]),i=Number(r[2]),o=Number(r[3]),d=Number(r[4]),u=Number(r[5]),a=Number(r[6]),s=new Date(n,i-1,o,d,u,a);return Number.isNaN(s.getTime())?void 0:s}function Ze(e,t){if(!e)return"";let r=e._full_text;if(r!==void 0&&r!==null)return String(r);if(!t)return Object.values(e).map(String).join(`
`);return Wt(t,e)}async function L(e){let t=new FormData;for(let[r,n]of Object.entries(e.data))if(n!==void 0&&n!==null)t.append(r,String(n));try{let r=await G(e.context,`${e.host}${e.endpoint}`,{method:"POST",body:t},e.providerId);if(!r.ok)throw new $.KMsgError($.KMsgErrorCode.NETWORK_ERROR,`HTTP error! status: ${r.status}`,{providerId:e.providerId});return await r.json()}catch(r){throw x(r,e.context?.signal,e.providerId)}}function H(e){let{providerId:t,response:r,fallbackMessage:n}=e,i=r.code,o=Xe(i);if(o===0)return $.ok(void 0);let d=typeof r.message==="string"&&r.message.length>0?r.message:n,u=o===509||o===-99?$.KMsgErrorCode.INVALID_REQUEST:$.KMsgErrorCode.PROVIDER_ERROR;return $.fail(new $.KMsgError(u,d,{providerId:t,originalCode:i,raw:r}))}var et=require("@k-msg/template/send");function Me(e){if(!Array.isArray(e)||e.length===0)return;let t=JSON.parse(et.ButtonParser.serializeButtons(e));return JSON.stringify({button:t})}function tt(e,t){return new b.KMsgError(e.code,e.message,{providerId:t,...e.details??{}})}async function rt(e,t,r){try{let n=ae(e,r),i=Oe.validateTemplatePayload(t,{requireName:!0,requireContent:!0});if(i.isFailure)return b.fail(tt(i.error,e.providerId));let o={apikey:e.config.apiKey,userid:e.config.userId,senderkey:n,tpl_name:i.value.name??t.name,tpl_content:i.value.content??t.content},d=Me(i.value.buttons);if(d)o.tpl_button=d;let u=await L({host:e.alimtalkHost,endpoint:"/akv10/template/add/",data:o,providerId:e.providerId}),a=H({providerId:e.providerId,response:u,fallbackMessage:"template create failed"});if(a.isFailure)return a;let s=E(u.data)?u.data:{},p=String(s.templtCode??"");if(!p)return b.fail(new b.KMsgError(b.KMsgErrorCode.PROVIDER_ERROR,"template create did not return templtCode",{providerId:e.providerId,raw:u}));let I=K(s.cdate)??new Date,S=K(s.udate)??K(s.cdate)??I;return b.ok({id:p,code:p,name:String(s.templtName??i.value.name??t.name),content:String(s.templtContent??i.value.content??t.content),category:t.category,status:Ne(s),buttons:Array.isArray(s.buttons)?s.buttons:i.value.buttons,variables:t.variables,createdAt:I,updatedAt:S})}catch(n){return b.fail(q(n,e.providerId))}}async function we(e,t,r){try{let n=ae(e,r),i=t.trim();if(!i)return b.fail(new b.KMsgError(b.KMsgErrorCode.INVALID_REQUEST,"code is required",{providerId:e.providerId}));let o=await L({host:e.alimtalkHost,endpoint:"/akv10/template/list/",data:{apikey:e.config.apiKey,userid:e.config.userId,senderkey:n,tpl_code:i},providerId:e.providerId}),d=H({providerId:e.providerId,response:o,fallbackMessage:"template get failed"});if(d.isFailure)return d;let u=o.list,s=(Array.isArray(u)?u:[]).find(E);if(!s)return b.fail(new b.KMsgError(b.KMsgErrorCode.TEMPLATE_NOT_FOUND,"Template not found",{providerId:e.providerId,templateCode:i}));let p=String(s.templtCode??i),I=K(s.cdate)??new Date,S=K(s.udate)??K(s.cdate)??I;return b.ok({id:p,code:p,name:String(s.templtName??""),content:String(s.templtContent??""),status:Ne(s),buttons:Array.isArray(s.buttons)?s.buttons:void 0,createdAt:I,updatedAt:S})}catch(n){return b.fail(q(n,e.providerId))}}async function nt(e,t,r,n){try{let i=ae(e,n),o=t.trim();if(!o)return b.fail(new b.KMsgError(b.KMsgErrorCode.INVALID_REQUEST,"code is required",{providerId:e.providerId}));let d=await we(e,o,{kakaoChannelSenderKey:i});if(d.isFailure)return d;let u=d.value,a=typeof r.name==="string"&&r.name.trim().length>0?r.name.trim():u.name,s=typeof r.content==="string"&&r.content.trim().length>0?r.content:u.content,p=Oe.validateTemplatePayload({name:a,content:s,buttons:r.buttons!==void 0?r.buttons:u.buttons},{requireName:!0,requireContent:!0});if(p.isFailure)return b.fail(tt(p.error,e.providerId));let I={apikey:e.config.apiKey,userid:e.config.userId,senderkey:i,tpl_code:o,tpl_name:p.value.name??a,tpl_content:p.value.content??s},S=Me(p.value.buttons);if(S)I.tpl_button=S;let l=await L({host:e.alimtalkHost,endpoint:"/akv10/template/modify/",data:I,providerId:e.providerId}),T=H({providerId:e.providerId,response:l,fallbackMessage:"template update failed"});if(T.isFailure)return T;let w=await we(e,o,{kakaoChannelSenderKey:i});if(w.isSuccess)return w;return b.ok({...u,name:p.value.name??a,content:p.value.content??s,...r.category!==void 0?{category:r.category}:{},...r.variables!==void 0?{variables:r.variables}:{},...r.buttons!==void 0?{buttons:p.value.buttons}:{},updatedAt:new Date})}catch(i){return b.fail(q(i,e.providerId))}}async function it(e,t,r){try{let n=ae(e,r),i=t.trim();if(!i)return b.fail(new b.KMsgError(b.KMsgErrorCode.INVALID_REQUEST,"code is required",{providerId:e.providerId}));let o=await L({host:e.alimtalkHost,endpoint:"/akv10/template/del/",data:{apikey:e.config.apiKey,userid:e.config.userId,senderkey:n,tpl_code:i},providerId:e.providerId}),d=H({providerId:e.providerId,response:o,fallbackMessage:"template delete failed"});if(d.isFailure)return d;return b.ok(void 0)}catch(n){return b.fail(q(n,e.providerId))}}async function ot(e,t,r){try{let n=ae(e,r),i=await L({host:e.alimtalkHost,endpoint:"/akv10/template/list/",data:{apikey:e.config.apiKey,userid:e.config.userId,senderkey:n},providerId:e.providerId}),o=H({providerId:e.providerId,response:i,fallbackMessage:"template list failed"});if(o.isFailure)return o;let d=i.list,a=(Array.isArray(d)?d:[]).filter(E).map((s)=>{let p=String(s.templtCode??""),I=K(s.cdate)??new Date,S=K(s.udate)??K(s.cdate)??I;return{id:p,code:p,name:String(s.templtName??""),content:String(s.templtContent??""),status:Ne(s),buttons:Array.isArray(s.buttons)?s.buttons:void 0,createdAt:I,updatedAt:S}}).filter((s)=>s.code.length>0);if(t?.status){let s=t.status.trim().toUpperCase();return b.ok(a.filter((p)=>p.status===s))}return b.ok(a)}catch(n){return b.fail(q(n,e.providerId))}}async function st(e,t,r){try{let n=ae(e,r),i=t.trim();if(!i)return b.fail(new b.KMsgError(b.KMsgErrorCode.INVALID_REQUEST,"code is required",{providerId:e.providerId}));let o=await L({host:e.alimtalkHost,endpoint:"/akv10/template/request/",data:{apikey:e.config.apiKey,userid:e.config.userId,senderkey:n,tpl_code:i},providerId:e.providerId}),d=H({providerId:e.providerId,response:o,fallbackMessage:"template inspection request failed"});if(d.isFailure)return d;return b.ok(void 0)}catch(n){return b.fail(q(n,e.providerId))}}var ne=require("@k-msg/core");var Ee={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 re(e){return Ee[e]}function at(){return Object.values(Ee)}var h=require("@k-msg/core");async function dt(e,t){try{let r={apikey:e.config.apiKey,userid:e.config.userId,...typeof t?.plusId==="string"&&t.plusId.trim().length>0?{plusid:t.plusId.trim()}:{},...typeof t?.senderKey==="string"&&t.senderKey.trim().length>0?{senderkey:t.senderKey.trim()}:{}},n=await L({host:e.alimtalkHost,endpoint:"/akv10/profile/list/",data:r,providerId:e.providerId}),i=H({providerId:e.providerId,response:n,fallbackMessage:"channel list failed"});if(i.isFailure)return i;let o=n.list,u=(Array.isArray(o)?o:[]).filter(E).map((a)=>({providerId:e.providerId,senderKey:String(a.senderKey??""),plusId:typeof a.uuid==="string"?a.uuid:void 0,name:typeof a.name==="string"?a.name:void 0,status:typeof a.status==="string"?a.status:void 0,createdAt:K(a.cdate),updatedAt:K(a.udate),raw:a})).filter((a)=>a.senderKey.length>0);return h.ok(u)}catch(r){return h.fail(q(r,e.providerId))}}async function ut(e){try{let t=await L({host:e.alimtalkHost,endpoint:"/akv10/category/",data:{apikey:e.config.apiKey,userid:e.config.userId},providerId:e.providerId}),r=H({providerId:e.providerId,response:t,fallbackMessage:"category list failed"});if(r.isFailure)return r;let n=E(t.data)?t.data:{},i=(o)=>{return(Array.isArray(o)?o:[]).filter(E).map((u)=>({code:String(u.code??""),name:String(u.name??""),parentCode:typeof u.parentCode==="string"&&u.parentCode.length>0?u.parentCode:void 0})).filter((u)=>u.code.length>0)};return h.ok({first:i(n.firstBusinessType),second:i(n.secondBusinessType),third:i(n.thirdBusinessType)})}catch(t){return h.fail(q(t,e.providerId))}}async function pt(e,t){try{let r=t.plusId.trim(),n=t.phoneNumber.trim();if(!r||!n)return h.fail(new h.KMsgError(h.KMsgErrorCode.INVALID_REQUEST,"plusId and phoneNumber are required",{providerId:e.providerId}));let i=await L({host:e.alimtalkHost,endpoint:"/akv10/profile/auth/",data:{apikey:e.config.apiKey,userid:e.config.userId,plusid:r,phonenumber:n},providerId:e.providerId}),o=H({providerId:e.providerId,response:i,fallbackMessage:"channel auth failed"});if(o.isFailure)return o;return h.ok(void 0)}catch(r){return h.fail(q(r,e.providerId))}}async function lt(e,t){try{let r=t.plusId.trim(),n=t.authNum.trim(),i=t.phoneNumber.trim(),o=t.categoryCode.trim();if(!r||!n||!i||!o)return h.fail(new h.KMsgError(h.KMsgErrorCode.INVALID_REQUEST,"plusId, authNum, phoneNumber, categoryCode are required",{providerId:e.providerId}));let d=await L({host:e.alimtalkHost,endpoint:"/akv10/profile/add/",data:{apikey:e.config.apiKey,userid:e.config.userId,plusid:r,authnum:n,phonenumber:i,categorycode:o},providerId:e.providerId}),u=H({providerId:e.providerId,response:d,fallbackMessage:"channel add failed"});if(u.isFailure)return u;let a=d.data,s=Array.isArray(a)?a.find(E):E(a)?a:void 0;if(!s)return h.fail(new h.KMsgError(h.KMsgErrorCode.PROVIDER_ERROR,"channel add returned empty data",{providerId:e.providerId,raw:d}));let p=String(s.senderKey??"");if(!p)return h.fail(new h.KMsgError(h.KMsgErrorCode.PROVIDER_ERROR,"channel add did not return senderKey",{providerId:e.providerId,raw:s}));return h.ok({providerId:e.providerId,senderKey:p,plusId:typeof s.uuid==="string"?s.uuid:r,name:typeof s.name==="string"?s.name:void 0,status:typeof s.status==="string"?s.status:void 0,createdAt:K(s.cdate),updatedAt:K(s.udate),raw:s})}catch(r){return h.fail(q(r,e.providerId))}}var A=require("@k-msg/core");function zt(e,t){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:t,mappedFields:["failover","fmessage_1","fsubject_1"],unsupportedFields:["fallbackChannel"]}}]}async function $t(e,t){let r=t.from||e.config.sender||"";if(!r)return A.fail(new A.KMsgError(A.KMsgErrorCode.INVALID_REQUEST,"from is required for SMS/LMS/MMS (options.from or config.sender)",{providerId:e.providerId}));let n={key:e.config.apiKey,user_id:e.config.userId,sender:r,receiver:t.to,msg:t.text,msg_type:t.type,title:t.subject,testmode_yn:e.config.testMode?"Y":"N"},i=t.options?.scheduledAt;if(i instanceof Date&&!Number.isNaN(i.getTime())){let{date:d,time:u}=Te(i);n.rdate=d,n.rtime=u}if(t.type==="MMS"){let d=De({imageUrl:t.imageUrl,media:t.media,providerId:e.providerId});if(!d)return A.fail(new A.KMsgError(A.KMsgErrorCode.INVALID_REQUEST,"image is required for MMS (options.imageUrl or options.media.image.ref)",{providerId:e.providerId}));n.image=d}let o=await L({host:e.smsHost,endpoint:Ae("sendSMS",e.config),data:n,providerId:e.providerId,context:e.requestContext});if(o.result_code!=="1")return A.fail(Ie(o,e.providerId));return A.ok({messageId:t.messageId||crypto.randomUUID(),providerId:e.providerId,providerMessageId:o.msg_id,status:"PENDING",type:t.type,to:t.to,raw:o})}async function jt(e,t){let r=zt(t,e.providerId),n=(typeof t.kakao?.profileId==="string"?t.kakao.profileId:e.config.senderKey)||"";if(!n)return A.fail(new A.KMsgError(A.KMsgErrorCode.INVALID_REQUEST,"kakao profileId is required (options.kakao.profileId or config.senderKey)",{providerId:e.providerId}));let i=t.from||e.config.sender||"";if(!i)return A.fail(new A.KMsgError(A.KMsgErrorCode.INVALID_REQUEST,"from is required for ALIMTALK (options.from or config.sender)",{providerId:e.providerId}));let{variables:o,templateId:d}=t;if(!d||d.length===0)return A.fail(new A.KMsgError(A.KMsgErrorCode.INVALID_REQUEST,"templateId is required for ALIMTALK",{providerId:e.providerId}));let u=typeof t.providerOptions?.templateContent==="string"?t.providerOptions.templateContent:void 0,a={apikey:e.config.apiKey,userid:e.config.userId,senderkey:n,tpl_code:d,sender:i,receiver_1:t.to,subject_1:"알림톡",message_1:Ze(o,u),testMode:e.config.testMode?"Y":"N"},s=typeof t.providerOptions?.failover==="string"?t.providerOptions.failover.trim().toUpperCase():"",p=s==="Y"||s==="N"?s:void 0,I=t.failover?.enabled===!0?"Y":t.failover?.enabled===!1?"N":void 0,S=p??I,l=typeof t.providerOptions?.fsubject_1==="string"&&t.providerOptions.fsubject_1.trim().length>0?t.providerOptions.fsubject_1.trim():typeof t.failover?.fallbackTitle==="string"&&t.failover.fallbackTitle.trim().length>0?t.failover.fallbackTitle.trim():void 0,T=typeof t.providerOptions?.fmessage_1==="string"&&t.providerOptions.fmessage_1.trim().length>0?t.providerOptions.fmessage_1.trim():typeof t.failover?.fallbackContent==="string"&&t.failover.fallbackContent.trim().length>0?t.failover.fallbackContent.trim():void 0;if(S)a.failover=S;if(l)a.fsubject_1=l;if(T)a.fmessage_1=T;let w=t.options?.scheduledAt;if(w instanceof Date&&!Number.isNaN(w.getTime())){let{date:k,time:C}=Te(w);a.reserve="Y",a.reserve_date=k,a.reserve_time=C}let g=await L({host:e.alimtalkHost,endpoint:Ae("sendAlimTalk",e.config),data:a,providerId:e.providerId,context:e.requestContext});if(g.result_code!=="0")return A.fail(Ie(g,e.providerId));return A.ok({messageId:t.messageId||crypto.randomUUID(),providerId:e.providerId,providerMessageId:g.msg_id,status:"PENDING",type:t.type,to:t.to,...Array.isArray(r)&&r.length>0?{warnings:r}:{},raw:g})}async function Yt(e,t){let r=(typeof t.kakao?.profileId==="string"?t.kakao.profileId:e.config.senderKey)||"";if(!r)return A.fail(new A.KMsgError(A.KMsgErrorCode.INVALID_REQUEST,"kakao profileId is required (options.kakao.profileId or config.senderKey)",{providerId:e.providerId}));let n=t.from||e.config.sender||"";if(!n)return A.fail(new A.KMsgError(A.KMsgErrorCode.INVALID_REQUEST,"from is required for FRIENDTALK (options.from or config.sender)",{providerId:e.providerId}));let i={apikey:e.config.apiKey,userid:e.config.userId,senderkey:r,sender:n,receiver_1:t.to,subject_1:"친구톡",message_1:t.text,testMode:e.config.testMode?"Y":"N"},o=De({imageUrl:t.imageUrl,media:t.media,providerId:e.providerId});if(o)i.image_1=o;let d=Array.isArray(t.kakao?.buttons)?t.kakao.buttons:t.buttons;if(d)i.button_1=JSON.stringify(d);let u=t.options?.scheduledAt;if(u instanceof Date&&!Number.isNaN(u.getTime())){let{date:s,time:p}=Te(u);i.reserve="Y",i.reserve_date=s,i.reserve_time=p}let a=await L({host:e.alimtalkHost,endpoint:Ae("sendFriendTalk",e.config),data:i,providerId:e.providerId,context:e.requestContext});if(a.result_code!=="0")return A.fail(Ie(a,e.providerId));return A.ok({messageId:t.messageId||crypto.randomUUID(),providerId:e.providerId,providerMessageId:a.msg_id,status:"PENDING",type:t.type,to:t.to,raw:a})}async function ft(e,t){try{switch(t.type){case"ALIMTALK":return await jt(e,t);case"FRIENDTALK":return await Yt(e,t);case"SMS":case"LMS":case"MMS":return await $t(e,t);default:return A.fail(new A.KMsgError(A.KMsgErrorCode.INVALID_REQUEST,`AligoProvider does not support type ${t.type}`,{providerId:e.providerId,type:t.type}))}}catch(r){return A.fail(Ie(r,e.providerId))}}function Pe(){return{apiKey:ne.readRuntimeEnv("ALIGO_API_KEY")||"",userId:ne.readRuntimeEnv("ALIGO_USER_ID")||"",senderKey:ne.readRuntimeEnv("ALIGO_SENDER_KEY")||"",sender:ne.readRuntimeEnv("ALIGO_SENDER")||"",friendtalkEndpoint:ne.readRuntimeEnv("ALIGO_FRIENDTALK_ENDPOINT"),testMode:ne.readRuntimeEnv("NODE_ENV")!=="production",debug:ne.readRuntimeEnv("NODE_ENV")==="development"}}class fe{id="aligo";name="Aligo Smart SMS";supportedTypes=["ALIMTALK","FRIENDTALK","SMS","LMS","MMS"];transportCapabilities={abortSignal:"supported",injectableFetch:"supported"};config;smsHost;alimtalkHost;getOnboardingSpec(){let e=re(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(),t=[];try{if(!this.config.apiKey)t.push("Missing apiKey");if(!this.config.userId)t.push("Missing userId");if(!this.config.sender)t.push("Missing sender (default from)");try{new URL(this.smsHost)}catch{t.push("Invalid smsBaseUrl")}try{new URL(this.alimtalkHost)}catch{t.push("Invalid alimtalkBaseUrl")}return{healthy:t.length===0,issues:t,latencyMs:Date.now()-e,data:{provider:this.id,smsBaseUrl:this.smsHost,alimtalkBaseUrl:this.alimtalkHost}}}catch(r){return t.push(r instanceof Error?r.message:String(r)),{healthy:!1,issues:t,latencyMs:Date.now()-e}}}async send(e,t){let r=e.messageId||crypto.randomUUID(),n={...e,messageId:r};return ft(this.getRuntimeContext(t),n)}async listKakaoChannels(e){return dt(this.getRuntimeContext(),e)}async listKakaoChannelCategories(){return ut(this.getRuntimeContext())}async requestKakaoChannelAuth(e){return pt(this.getRuntimeContext(),e)}async addKakaoChannel(e){return lt(this.getRuntimeContext(),e)}}var Lr=(e)=>new fe(e),Jt=()=>{let e=Pe();if(!e.apiKey||!e.userId)throw Error("ALIGO_API_KEY and ALIGO_USER_ID are required");return new fe(e)};class Gt{static create(e){return new fe(e)}static createDefault(){return Jt()}}class me extends fe{async createTemplate(e,t){return rt(this.getRuntimeContext(),e,t)}async updateTemplate(e,t,r){return nt(this.getRuntimeContext(),e,t,r)}async deleteTemplate(e,t){return it(this.getRuntimeContext(),e,t)}async getTemplate(e,t){return we(this.getRuntimeContext(),e,t)}async listTemplates(e,t){return ot(this.getRuntimeContext(),e,t)}async requestTemplateInspection(e,t){return st(this.getRuntimeContext(),e,t)}}var mt=(e)=>new me(e),Le=()=>{let e=Pe();return new me(e)};class Ke{static create(e){return new me(e)}static createDefault(){return Le()}}function ct(){}var gt={mock:{},aligo:{apiKey:{type:"string",required:!0,description:"Aligo API key",defaultValue:"env:ALIGO_API_KEY"},userId:{type:"string",required:!0,description:"Aligo user id",defaultValue:"env:ALIGO_USER_ID"},senderKey:{type:"string",description:"Default Kakao sender key",defaultValue:"env:ALIGO_SENDER_KEY"},sender:{type:"string",description:"Default SMS/LMS sender number",defaultValue:"env:ALIGO_SENDER"},testMode:{type:"boolean",description:"Enable Aligo test mode"},debug:{type:"boolean",description:"Enable debug logging"},smsBaseUrl:{type:"string",description:"Override SMS API base URL"},alimtalkBaseUrl:{type:"string",description:"Override AlimTalk API base URL"},friendtalkEndpoint:{type:"string",description:"Override FriendTalk endpoint path"}},iwinv:{apiKey:{type:"string",required:!0,description:"IWINV AlimTalk API key (AUTH header)",defaultValue:"env:IWINV_API_KEY"},smsApiKey:{type:"string",description:"IWINV SMS API key",defaultValue:"env:IWINV_SMS_API_KEY"},smsAuthKey:{type:"string",description:"IWINV SMS auth key",defaultValue:"env:IWINV_SMS_AUTH_KEY"},smsCompanyId:{type:"string",description:"IWINV SMS company id",defaultValue:"env:IWINV_SMS_COMPANY_ID"},senderNumber:{type:"string",description:"Default sender number",defaultValue:"env:IWINV_SENDER_NUMBER"},smsSenderNumber:{type:"string",description:"SMS/LMS sender number override"},sendEndpoint:{type:"string",description:"Override IWINV send endpoint path"},xForwardedFor:{type:"string",description:"X-Forwarded-For header override"},extraHeaders:{type:"stringRecord",description:"Additional HTTP headers"},ipRetryCount:{type:"number",description:"IP-restriction retry count"},ipRetryDelayMs:{type:"number",description:"IP-restriction retry delay in ms"},ipAlertWebhookUrl:{type:"string",description:"Webhook URL for IP restriction alerts"},debug:{type:"boolean",description:"Enable debug logging"}},solapi:{apiKey:{type:"string",required:!0,description:"SOLAPI API key",defaultValue:"env:SOLAPI_API_KEY"},apiSecret:{type:"string",required:!0,description:"SOLAPI API secret",defaultValue:"env:SOLAPI_API_SECRET"},defaultFrom:{type:"string",description:"Default sender number",defaultValue:"env:SOLAPI_DEFAULT_FROM"},kakaoPfId:{type:"string",description:"Default Kakao PF ID",defaultValue:"env:SOLAPI_KAKAO_PF_ID"},rcsBrandId:{type:"string",description:"Default RCS brand id"},naverTalkId:{type:"string",description:"Default Naver Talk id"},appId:{type:"string",description:"SOLAPI app id"},defaultCountry:{type:"string",description:"Default country code"},baseUrl:{type:"string",description:"Override SOLAPI API base URL"},debug:{type:"boolean",description:"Enable debug logging"}}};var m=require("@k-msg/core"),xe=require("@k-msg/template/send");function B(e){if(!e)return{};try{return JSON.parse(e)}catch{return e}}function ie(e,t){return E(e)?e:t}var X=require("@k-msg/core");function Xt(e){let t="",r=0;while(r<e.length){let n=e[r++]??0,i=e[r++]??0,o=e[r++]??0,d=n<<16|i<<8|o;t+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[d>>18&63],t+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[d>>12&63],t+=r-2<e.length?"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[d>>6&63]:"=",t+=r-1<e.length?"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[d&63]:"="}return t}function ve(e){return Xt(new TextEncoder().encode(e))}function yt(e){let t=e.sendEndpoint||"/api/v2/send/";return t.startsWith("/")?t:`/${t}`}function Q(e){let r={AUTH:ve(e.apiKey),"Content-Type":"application/json;charset=UTF-8"};if(typeof e.xForwardedFor==="string"&&e.xForwardedFor.length>0)r["X-Forwarded-For"]=e.xForwardedFor;if(e.extraHeaders&&typeof e.extraHeaders==="object")return{...r,...e.extraHeaders};return r}function W(e){switch(e){case 201:case 206:case 401:case 403:return X.KMsgErrorCode.AUTHENTICATION_FAILED;case 429:return X.KMsgErrorCode.RATE_LIMIT_EXCEEDED;case 519:return X.KMsgErrorCode.INSUFFICIENT_BALANCE;case 404:case 501:return X.KMsgErrorCode.TEMPLATE_NOT_FOUND;case 502:case 503:case 504:case 505:case 506:case 507:case 508:case 509:case 510:case 511:case 512:case 513:case 514:case 515:case 516:case 517:case 540:return X.KMsgErrorCode.INVALID_REQUEST;case 518:return X.KMsgErrorCode.PROVIDER_ERROR;default:if(e>=500)return X.KMsgErrorCode.PROVIDER_ERROR;return X.KMsgErrorCode.INVALID_REQUEST}}function j(e){if(typeof e==="number"&&Number.isFinite(e))return e;if(typeof e==="string"){let t=e.trim();if(t.length===0)return;let r=Number(t);if(Number.isFinite(r))return r}return}function It(e){if(typeof e!=="string")return;let t=e.trim().toUpperCase();if(!t)return;switch(t){case"Y":case"APPROVED":return"Y";case"I":case"INSPECTION":return"I";case"R":case"REJECTED":return"R";case"PENDING":return"I";default:return}}function Fe(e){switch(typeof e==="string"?e.trim().toUpperCase():""){case"Y":return"APPROVED";case"I":return"INSPECTION";case"R":return"REJECTED";default:return"PENDING"}}function Ve(e,t){return new Date(e.getTime()+t*24*60*60*1000)}function Ue(e){let t=(r)=>r.toString().padStart(2,"0");return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())}`}function de(e){if(typeof e!=="string")return;let t=e.trim();if(!t)return;let r=/^(\d{4})-(\d{2})-(\d{2})\s+(\d{2}):(\d{2}):(\d{2})$/.exec(t);if(!r)return;let n=Number(r[1]),i=Number(r[2]),o=Number(r[3]),d=Number(r[4]),u=Number(r[5]),a=Number(r[6]);if(!Number.isFinite(n)||!Number.isFinite(i)||!Number.isFinite(o)||!Number.isFinite(d)||!Number.isFinite(u)||!Number.isFinite(a))return;let s=new Date(n,i-1,o,d,u,a);if(Number.isNaN(s.getTime()))return;return s}function Se(e){let t=(r)=>r.toString().padStart(2,"0");return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())} ${t(e.getHours())}:${t(e.getMinutes())}:${t(e.getSeconds())}`}function qe(e){let t=(r)=>r.toString().padStart(2,"0");return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())} ${t(e.getHours())}:${t(e.getMinutes())}:${t(e.getSeconds())}`}async function be(e){let t=await e.text(),r=B(t);return ie(r,{code:j(r)??e.status,message:t||String(r||"")})}function vt(e,t){return new m.KMsgError(e.code,e.message,{providerId:t,...e.details??{}})}async function St(e){let{providerId:t,config:r,input:n}=e;if(!n||typeof n!=="object")return m.fail(new m.KMsgError(m.KMsgErrorCode.INVALID_REQUEST,"Template input is required",{providerId:t}));let i=xe.validateTemplatePayload(n,{requireName:!0,requireContent:!0});if(i.isFailure)return m.fail(vt(i.error,t));let o=`${r.baseUrl}/api/template/add/`,d={templateName:i.value.name??n.name,templateContent:i.value.content??n.content,...i.value.buttons?{buttons:i.value.buttons}:{}};try{let u=await fetch(o,{method:"POST",headers:Q(r),body:JSON.stringify(d)}),a=await be(u),s=j(a.code)??u.status,p=typeof a.message==="string"&&a.message.length>0?a.message:"IWINV template create failed";if(!u.ok||s!==200)return m.fail(new m.KMsgError(W(s),p,{providerId:t,originalCode:s}));let I=a.templateCode,S=typeof I==="string"&&I.trim().length>0?I.trim():"";if(!S)return m.fail(new m.KMsgError(m.KMsgErrorCode.PROVIDER_ERROR,"IWINV template create did not return templateCode",{providerId:t,raw:a}));let l=new Date;return m.ok({id:S,code:S,name:i.value.name??n.name,content:i.value.content??n.content,category:n.category,status:"INSPECTION",buttons:i.value.buttons,variables:n.variables,createdAt:l,updatedAt:l})}catch(u){return m.fail(new m.KMsgError(m.KMsgErrorCode.NETWORK_ERROR,u instanceof Error?u.message:String(u),{providerId:t}))}}async function bt(e){let{providerId:t,config:r,code:n,patch:i,ctx:o}=e,d=typeof n==="string"?n.trim():"";if(!d)return m.fail(new m.KMsgError(m.KMsgErrorCode.INVALID_REQUEST,"code is required",{providerId:t}));let u=await ke({providerId:t,config:r,code:d,ctx:o});if(u.isFailure)return u;let a=u.value,s=typeof i.name==="string"&&i.name.trim().length>0?i.name.trim():a.name,p=typeof i.content==="string"&&i.content.trim().length>0?i.content:a.content,I=i.buttons!==void 0?i.buttons:a.buttons,S=xe.validateTemplatePayload({name:s,content:p,buttons:I},{requireName:!0,requireContent:!0});if(S.isFailure)return m.fail(vt(S.error,t));let l=`${r.baseUrl}/api/template/modify/`,T={templateCode:d,templateName:S.value.name??s,templateContent:S.value.content??p,...S.value.buttons?{buttons:S.value.buttons}:{}};try{let w=await fetch(l,{method:"POST",headers:Q(r),body:JSON.stringify(T)}),g=await be(w),k=j(g.code)??w.status,C=typeof g.message==="string"&&g.message.length>0?g.message:"IWINV template update failed";if(!w.ok||k!==200)return m.fail(new m.KMsgError(W(k),C,{providerId:t,originalCode:k}));let v=await ke({providerId:t,config:r,code:d,ctx:o});if(v.isSuccess)return v;return m.ok({...a,name:S.value.name??s,content:S.value.content??p,...i.category!==void 0?{category:i.category}:{},...i.variables!==void 0?{variables:i.variables}:{},...i.buttons!==void 0?{buttons:S.value.buttons}:{},updatedAt:new Date})}catch(w){return m.fail(new m.KMsgError(m.KMsgErrorCode.NETWORK_ERROR,w instanceof Error?w.message:String(w),{providerId:t}))}}async function Rt(e){let{providerId:t,config:r,code:n}=e,i=typeof n==="string"?n.trim():"";if(!i)return m.fail(new m.KMsgError(m.KMsgErrorCode.INVALID_REQUEST,"code is required",{providerId:t}));let o=`${r.baseUrl}/api/template/delete/`,d={templateCode:i};try{let u=await fetch(o,{method:"POST",headers:Q(r),body:JSON.stringify(d)}),a=await be(u),s=j(a.code)??u.status,p=typeof a.message==="string"&&a.message.length>0?a.message:typeof a.messgae==="string"&&a.messgae.length>0?a.messgae:"IWINV template delete failed";if(!u.ok||s!==200)return m.fail(new m.KMsgError(W(s),p,{providerId:t,originalCode:s}));return m.ok(void 0)}catch(u){return m.fail(new m.KMsgError(m.KMsgErrorCode.NETWORK_ERROR,u instanceof Error?u.message:String(u),{providerId:t}))}}async function ke(e){let{providerId:t,config:r,code:n}=e,i=typeof n==="string"?n.trim():"";if(!i)return m.fail(new m.KMsgError(m.KMsgErrorCode.INVALID_REQUEST,"code is required",{providerId:t}));let o={pageNum:"1",pageSize:"15",templateCode:i},d=`${r.baseUrl}/api/template/`;try{let u=await fetch(d,{method:"POST",headers:Q(r),body:JSON.stringify(o)}),a=await be(u),s=j(a.code)??u.status,p=typeof a.message==="string"&&a.message.length>0?a.message:"IWINV template get failed";if(!u.ok||s!==200)return m.fail(new m.KMsgError(W(s),p,{providerId:t,originalCode:s}));let I=a.list,l=(Array.isArray(I)?I:[]).find(E);if(!l)return m.fail(new m.KMsgError(m.KMsgErrorCode.TEMPLATE_NOT_FOUND,"Template not found",{providerId:t,templateCode:i}));let T=l.templateCode,w=typeof T==="string"?T:String(T??""),g=typeof l.templateName==="string"?l.templateName:"",k=typeof l.templateContent==="string"?l.templateContent:"",C=Fe(l.status),v=de(l.createDate)??new Date;return m.ok({id:w,code:w,name:g,content:k,status:C,buttons:Array.isArray(l.buttons)?l.buttons:void 0,createdAt:v,updatedAt:v})}catch(u){return m.fail(new m.KMsgError(m.KMsgErrorCode.NETWORK_ERROR,u instanceof Error?u.message:String(u),{providerId:t}))}}async function At(e){let{providerId:t,config:r,query:n}=e,i=typeof n?.page==="number"&&n.page>0?Math.floor(n.page):1,o=typeof n?.limit==="number"&&n.limit>0?Math.floor(n.limit):15,d=It(n?.status),u={pageNum:String(i),pageSize:String(o),...d?{templateStatus:d}:{}},a=`${r.baseUrl}/api/template/`;try{let s=await fetch(a,{method:"POST",headers:Q(r),body:JSON.stringify(u)}),p=await be(s),I=j(p.code)??s.status,S=typeof p.message==="string"&&p.message.length>0?p.message:"IWINV template list failed";if(!s.ok||I!==200)return m.fail(new m.KMsgError(W(I),S,{providerId:t,originalCode:I}));let l=p.list,w=(Array.isArray(l)?l:[]).filter(E).map((g)=>{let k=g.templateCode,C=typeof k==="string"?k:String(k??""),v=typeof g.templateName==="string"?g.templateName:"",O=typeof g.templateContent==="string"?g.templateContent:"",_=Fe(g.status),N=de(g.createDate)??new Date;return{id:C,code:C,name:v,content:O,status:_,buttons:Array.isArray(g.buttons)?g.buttons:void 0,createdAt:N,updatedAt:N}}).filter((g)=>g.code.length>0);return m.ok(w)}catch(s){return m.fail(new m.KMsgError(m.KMsgErrorCode.NETWORK_ERROR,s instanceof Error?s.message:String(s),{providerId:t}))}}var c=require("@k-msg/core");var Tt="https://alimtalk.bizservice.iwinv.kr",Nt="https://sms.bizservice.iwinv.kr";var R=require("@k-msg/core");var ce=require("@k-msg/core");function Z(e){return e.replace(/[^0-9]/g,"")}function ee(){return Nt}function oe(e){if(e.smsApiKey&&e.smsAuthKey)return ve(`${e.smsApiKey}&${e.smsAuthKey}`);let t=e.smsAuthKey||e.smsApiKey;if(!t)return"";return ve(`${e.apiKey}&${t}`)}function ue(e){return oe(e).length>0}function He(e){if(typeof e==="number"&&Number.isFinite(e))return e.toString();if(typeof e==="string")return e.trim();return""}function Be(e,t){return{"0":"전송 성공","1":"메시지가 전송되지 않았습니다.","11":"운영 중인 서비스가 아닙니다.","12":"요금제 충전 중입니다. 잠시 후 다시 시도해 보시기 바랍니다.","13":"등록되지 않은 발신번호입니다.","14":"인증 요청이 올바르지 않습니다.","15":"등록하지 않은 IP에서는 발송되지 않습니다.","21":"장문 메시지는 2000 Bytes까지만 입력이 가능합니다.","22":"제목 입력 가능 문자가 올바르지 않습니다.","23":"제목은 40 Byte까지만 입력이 가능합니다.","31":"파일 업로드는 100KB까지 가능합니다.","32":"허용되지 않는 파일 확장자입니다.","33":"이미지 업로드에 실패했습니다.","41":"수신 번호를 입력하여 주세요.","42":"예약 전송 가능 시간이 아닙니다.","43":"날짜와 시간 표현 형식에 맞춰 입력하여 주십시오.","44":"최대 1000건 전송 가능합니다.","50":"SMS 자동 충전 한도를 초과하였습니다.","202":"SMS API 인증 실패 또는 SMS 서비스 권한이 없습니다.","206":"등록하지 않은 IP에서는 발송되지 않습니다."}[e]||t}function Qe(e,t){if(e==="14"||e==="15"||e==="202"||e==="206")return ce.KMsgErrorCode.AUTHENTICATION_FAILED;if(e==="50")return ce.KMsgErrorCode.INSUFFICIENT_BALANCE;if(e==="13"||e==="21"||e==="22"||e==="23"||e==="31"||e==="32"||e==="33"||e==="41"||e==="42"||e==="43"||e==="44")return ce.KMsgErrorCode.INVALID_REQUEST;if(!t)return ce.KMsgErrorCode.NETWORK_ERROR;return ce.KMsgErrorCode.PROVIDER_ERROR}function We(e,t){if(t&&t.trim().length>0)return t.trim();return e.slice(0,20)}function wt(e,t){if(e==="06")return"DELIVERED";if(e==="1000")return"DELIVERED";if(typeof t==="string"){if(t.includes("전송 성공"))return"DELIVERED";if(t.includes("대기")||t.includes("처리중"))return"PENDING"}if(e==="00"||e==="01")return"PENDING";if(!e&&!t)return"UNKNOWN";return"FAILED"}async function Et(e){let{providerId:t,config:r,query:n,context:i}=e,o=n.providerMessageId.trim();if(!o)return R.fail(new R.KMsgError(R.KMsgErrorCode.INVALID_REQUEST,"providerMessageId is required",{providerId:t}));let d=Z(n.to);if(!d)return R.fail(new R.KMsgError(R.KMsgErrorCode.INVALID_REQUEST,"to is required",{providerId:t}));let u=Number(o),a=Number.isFinite(u)?u:void 0,s=Se(Ve(n.requestedAt,-1)),p=Se(new Date),I={pageNum:1,pageSize:15,phone:d,startDate:s,endDate:p,...a!==void 0?{seqNo:a}:{},...n.scheduledAt instanceof Date&&!Number.isNaN(n.scheduledAt.getTime())?{reserve:"Y"}:{}},S=`${r.baseUrl}/api/history/`;try{let l=await G(i,S,{method:"POST",headers:Q(r),body:JSON.stringify(I)},t),T=await l.text(),w=B(T),g=ie(w,{}),k=g.code,C=typeof k==="number"?k:void 0,v=typeof g.message==="string"&&g.message.length>0?g.message:"IWINV history query failed";if(!l.ok||C!==200)return R.fail(new R.KMsgError(W(C??j(w)??l.status),v,{providerId:t,originalCode:k??l.status}));let O=g.list,_=Array.isArray(O)?O:[];if(_.length===0)return R.ok(null);let N=(()=>{if(a===void 0)return _[0];return _.find((M)=>E(M)&&M.seqNo===a)??_[0]})();if(!E(N))return R.ok(null);let F=typeof N.statusCode==="string"?N.statusCode:void 0,P=typeof N.statusCodeName==="string"?N.statusCodeName:void 0,D=de(N.sendDate),te=de(N.receiveDate),Y=F==="OK"||typeof P==="string"&&P.includes("성공");return R.ok({providerId:t,providerMessageId:o,status:Y?"DELIVERED":D?"FAILED":"PENDING",statusCode:F,statusMessage:P,sentAt:D,deliveredAt:Y?te||D:void 0,failedAt:!Y&&D?D:void 0,raw:N})}catch(l){return R.fail(x(l,i?.signal,t))}}async function kt(e){let{providerId:t,config:r,query:n,context:i}=e;if(!ue(r))return R.fail(new R.KMsgError(R.KMsgErrorCode.INVALID_REQUEST,"SMS v2 configuration missing (smsApiKey/smsAuthKey)",{providerId:t}));if(!r.smsCompanyId||r.smsCompanyId.length===0)return R.fail(new R.KMsgError(R.KMsgErrorCode.INVALID_REQUEST,"smsCompanyId required for history (config.smsCompanyId)",{providerId:t}));let o=n.providerMessageId.trim();if(!o)return R.fail(new R.KMsgError(R.KMsgErrorCode.INVALID_REQUEST,"providerMessageId is required",{providerId:t}));let d=Z(n.to);if(!d)return R.fail(new R.KMsgError(R.KMsgErrorCode.INVALID_REQUEST,"to is required",{providerId:t}));let u=Ve(n.requestedAt,-1),a=new Date;if(a.getTime()-u.getTime()>7776000000)return R.fail(new R.KMsgError(R.KMsgErrorCode.INVALID_REQUEST,"SMS history date range must be within 90 days",{providerId:t}));let I={version:"1.0",companyid:r.smsCompanyId,startDate:Ue(u),endDate:Ue(a),requestNo:o,pageNum:1,pageSize:15,phone:d},l={"Content-Type":"application/json;charset=UTF-8",secret:oe(r)};if(typeof r.xForwardedFor==="string"&&r.xForwardedFor.length>0)l["X-Forwarded-For"]=r.xForwardedFor;let T=r.extraHeaders&&typeof r.extraHeaders==="object"?{...l,...r.extraHeaders}:l,w=`${ee()}/api/history/`;try{let g=await G(i,w,{method:"POST",headers:T,body:JSON.stringify(I)},t),k=await g.text(),C=B(k),v=ie(C,{}),O=v.resultCode,_=typeof O==="number"?O:typeof O==="string"?Number(O):NaN,N=typeof v.message==="string"&&v.message.length>0?v.message:"IWINV SMS history query failed";if(!g.ok||_!==0)return R.fail(new R.KMsgError(R.KMsgErrorCode.PROVIDER_ERROR,N,{providerId:t,originalCode:O??g.status}));let F=v.list,P=Array.isArray(F)?F:[];if(P.length===0)return R.ok(null);let D=(()=>{return P.find((se)=>{if(!E(se))return!1;let z=se.requestNo;return z!==void 0&&z!==null?String(z)===o:!1})??P[0]})();if(!E(D))return R.ok(null);let te=typeof D.sendStatusCode==="string"?D.sendStatusCode:void 0,Y=typeof D.sendStatusMsg==="string"?D.sendStatusMsg:typeof D.sendStatus==="string"?D.sendStatus:void 0,pe=de(D.sendDate),M=wt(te,Y);return R.ok({providerId:t,providerMessageId:o,status:M,statusCode:te,statusMessage:Y,sentAt:pe,deliveredAt:M==="DELIVERED"?pe:void 0,failedAt:M==="FAILED"?pe:void 0,raw:D})}catch(g){return R.fail(x(g,i?.signal,t))}}var y=require("@k-msg/core");var U=require("@k-msg/core");function ht(e){let t=e.split(/[?#]/,1)[0]??e,r=t.lastIndexOf(".");if(r<=0||r===t.length-1)return"";return t.slice(r).toLowerCase()}function ze(e){switch(ht(e)){case".jpg":case".jpeg":return"image/jpeg";case".png":return"image/png";case".gif":return"image/gif";case".webp":return"image/webp";default:return}}function Ct(e,t){let r=e&&typeof e==="object"?e:{},i=(r.media&&typeof r.media==="object"?r.media:void 0)?.image;if(i&&typeof i==="object"){if(i.bytes instanceof Uint8Array)return U.ok({bytes:i.bytes,filename:typeof i.filename==="string"?i.filename:void 0,contentType:typeof i.contentType==="string"?i.contentType:void 0});if(i.blob instanceof Blob)return U.ok({blob:i.blob,filename:typeof i.filename==="string"?i.filename:void 0,contentType:typeof i.contentType==="string"?i.contentType:void 0});if(typeof i.ref==="string"&&i.ref.trim().length>0)return U.fail(new U.KMsgError(U.KMsgErrorCode.INVALID_REQUEST,"IWINV MMS caller must provide blob/bytes in options.media.image",{providerId:t,field:"media.image.ref"}))}let o=r.imageUrl;if(typeof o==="string"&&o.trim().length>0)return U.fail(new U.KMsgError(U.KMsgErrorCode.INVALID_REQUEST,"IWINV MMS caller must provide blob/bytes in options.media.image",{providerId:t,field:"imageUrl"}));return U.ok(void 0)}async function _t(e){if("blob"in e){let o=e.contentType||e.blob.type||"application/octet-stream",d=e.filename||"image",u=e.contentType&&e.contentType!==e.blob.type?new Blob([await e.blob.arrayBuffer()],{type:o}):e.blob;return{blob:u,filename:d,contentType:o,size:u.size}}let t=e.contentType||"application/octet-stream",r=new Uint8Array(e.bytes.byteLength);r.set(e.bytes);let n=new Blob([r],{type:t}),i=e.filename||"image";return{blob:n,filename:i,contentType:t,size:n.size}}function Dt(e){if(ht(e.filename).length>0)return e.filename;let r=ze(e.filename)==="image/png"?".png":ze(e.filename)==="image/gif"?".gif":ze(e.filename)==="image/webp"?".webp":e.contentType==="image/png"?".png":e.contentType==="image/gif"?".gif":e.contentType==="image/webp"?".webp":".jpg";return`${e.filename}${r}`}async function Mt(e){let{providerId:t,config:r,options:n,context:i}=e,o=n.templateId;if(!o||o.length===0)return y.fail(new y.KMsgError(y.KMsgErrorCode.INVALID_REQUEST,"templateId is required for ALIMTALK",{providerId:t}));let d=n.options?.scheduledAt,u=d instanceof Date&&!Number.isNaN(d.getTime()),a=u?"Y":"N",s=u?Se(d):void 0,p=Z(n.to);if(!p)return y.fail(new y.KMsgError(y.KMsgErrorCode.INVALID_REQUEST,"to is required",{providerId:t}));let I=n.providerOptions?.templateParam,S=Array.isArray(I)?I.map((M)=>M===null||M===void 0?"":String(M)):Object.values(n.variables||{}).map((M)=>M===null||M===void 0?"":String(M)),l=n.failover,T=(typeof n.from==="string"&&n.from.length>0?n.from:r.senderNumber||r.smsSenderNumber)||"",w=T?Z(T):"",g=typeof n.providerOptions?.reSend==="string"?n.providerOptions.reSend.trim().toUpperCase():"",k=g==="Y"||g==="N"?g:void 0,C=l?.enabled===!0?"Y":l?.enabled===!1?"N":void 0,v=k??C??(w?"Y":"N"),_=(typeof n.providerOptions?.resendCallback==="string"?Z(n.providerOptions.resendCallback):"")||w;if(v==="Y"&&!_)return y.fail(new y.KMsgError(y.KMsgErrorCode.INVALID_REQUEST,"resendCallback is required when reSend is 'Y' (options.from or providerOptions.resendCallback)",{providerId:t}));let N=typeof n.providerOptions?.resendType==="string"?n.providerOptions.resendType.trim().toUpperCase():"",F=N==="Y"||N==="N"?N:void 0;if(typeof n.providerOptions?.resendType==="string"&&n.providerOptions.resendType.length>0&&!F)return y.fail(new y.KMsgError(y.KMsgErrorCode.INVALID_REQUEST,"resendType must be 'Y' or 'N'",{providerId:t}));let P=l?.fallbackChannel==="lms"?"Y":l?.fallbackChannel==="sms"?"N":void 0,D=typeof n.providerOptions?.resendTitle==="string"&&n.providerOptions.resendTitle.trim().length>0?n.providerOptions.resendTitle.trim():typeof l?.fallbackTitle==="string"&&l.fallbackTitle.trim().length>0?l.fallbackTitle.trim():void 0,te=typeof n.providerOptions?.resendContent==="string"&&n.providerOptions.resendContent.trim().length>0?n.providerOptions.resendContent.trim():typeof l?.fallbackContent==="string"&&l.fallbackContent.trim().length>0?l.fallbackContent.trim():void 0,Y={templateCode:o,reserve:a,...s?{sendDate:s}:{},list:[{phone:p,templateParam:S.length>0?S:void 0}],reSend:v,..._?{resendCallback:_}:{},...F??P?{resendType:F??P}:{},...D?{resendTitle:D}:{},...te?{resendContent:te}:{}},pe=`${r.baseUrl}${yt(r)}`;try{let M=await G(i,pe,{method:"POST",headers:Q(r),body:JSON.stringify(Y)},t),he=await M.text(),se=B(he),z=E(se)?se:{code:j(se)??M.status,message:he||String(se||"")};if(!M.ok||z.code!==200)return y.fail(new y.KMsgError(W(z.code),z.message||"IWINV send failed",{providerId:t,originalCode:z.code}));return y.ok({messageId:n.messageId||crypto.randomUUID(),providerId:t,providerMessageId:typeof z.seqNo==="number"?String(z.seqNo):void 0,status:u?"PENDING":"SENT",type:n.type,to:n.to,raw:z})}catch(M){return y.fail(x(M,i?.signal,t))}}async function Zt(e){let{providerId:t,config:r,options:n,to:i,from:o,text:d,scheduledAtValid:u,scheduledAt:a,context:s}=e;if(n.type!=="MMS")return y.fail(new y.KMsgError(y.KMsgErrorCode.INVALID_REQUEST,"IWINVProvider: MMS handler called with non-MMS options",{providerId:t,type:n.type}));let p=We(d,n.subject),I=Ct(n,t);if(I.isFailure)return I;let S=I.value;if(!S)return y.fail(new y.KMsgError(y.KMsgErrorCode.INVALID_REQUEST,"image is required for MMS; caller must provide options.media.image.blob or bytes",{providerId:t}));let l;try{l=await _t(S)}catch(v){return y.fail(Re(v,t))}if(l.size>102400)ret