@k-msg/provider 0.23.1 → 0.24.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/aligo/index.js +15 -15
- package/dist/aligo/index.js.map +1 -1
- package/dist/aligo/index.mjs +15 -15
- package/dist/aligo/index.mjs.map +1 -1
- package/dist/index.js +16 -16
- package/dist/index.js.map +3 -3
- package/dist/index.mjs +16 -16
- package/dist/index.mjs.map +3 -3
- package/dist/iwinv/index.js +15 -15
- package/dist/iwinv/index.js.map +1 -1
- package/dist/iwinv/index.mjs +15 -15
- package/dist/iwinv/index.mjs.map +1 -1
- package/dist/solapi/index.js +2 -2
- package/dist/solapi/index.js.map +1 -1
- package/dist/solapi/index.mjs +2 -2
- package/dist/solapi/index.mjs.map +1 -1
- package/package.json +3 -3
package/dist/solapi/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var{defineProperty:j,getOwnPropertyNames:le,getOwnPropertyDescriptor:ce}=Object,fe=Object.prototype.hasOwnProperty;var Z=new WeakMap,ue=(e)=>{var t=Z.get(e),i;if(t)return t;if(t=j({},"__esModule",{value:!0}),e&&typeof e==="object"||typeof e==="function")le(e).map((r)=>!fe.call(t,r)&&j(t,r,{get:()=>e[r],enumerable:!(i=ce(e,r))||i.enumerable}));return Z.set(e,t),t};var ye=(e,t)=>{for(var i in t)j(e,i,{get:t[i],enumerable:!0,configurable:!0,set:(r)=>t[i]=()=>r})};var Se={};ye(Se,{initializeSolapi:()=>ae,createSolapiProvider:()=>$,createDefaultSolapiProvider:()=>H,SolapiProviderFactory:()=>G,SolapiProvider:()=>N});module.exports=ue(Se);var Q=(e)=>{if(typeof e!=="number"||Number.isNaN(e)||!Number.isFinite(e))return;return Math.trunc(e)};class a extends Error{code;details;providerErrorCode;providerErrorText;httpStatus;requestId;retryAfterMs;attempt;causeChain;constructor(e,t,i,r={}){super(t);if(this.name="KMsgError",this.code=e,this.details=i,this.providerErrorCode=r.providerErrorCode,this.providerErrorText=r.providerErrorText,this.httpStatus=Q(r.httpStatus),this.requestId=typeof r.requestId==="string"?r.requestId:void 0,this.retryAfterMs=Q(r.retryAfterMs),this.attempt=Q(r.attempt),Array.isArray(r.causeChain))this.causeChain=r.causeChain;else if(r.causeChain!==void 0)this.causeChain=[r.causeChain];if(Error.captureStackTrace)Error.captureStackTrace(this,a)}toJSON(){return{name:this.name,code:this.code,message:this.message,details:this.details,providerErrorCode:this.providerErrorCode,providerErrorText:this.providerErrorText,httpStatus:this.httpStatus,requestId:this.requestId,retryAfterMs:this.retryAfterMs,attempt:this.attempt,causeChain:this.causeChain}}}var A=(e)=>({isSuccess:!0,isFailure:!1,value:e}),O=(e)=>({isSuccess:!1,isFailure:!0,error:e});function me(){let e=globalThis;return e.__K_MSG_ENV__??e.__ENV__??e.process?.env??{}}function S(e){let t=me()[e];if(typeof t==="string")return t;if(t===void 0)return;return String(t)}var se=require("solapi");var z={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 ee(e){return z[e]}function yt(){return Object.values(z)}function m(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}var I=require("solapi");function E(e,t){if(e instanceof a)return e;let i=m(e)?e:{};if(e instanceof I.ApiKeyError)return new a("AUTHENTICATION_FAILED",e.message,{providerId:t});if(e instanceof I.BadRequestError)return new a("INVALID_REQUEST",e.message,{providerId:t,validationErrors:i.validationErrors});if(e instanceof I.NetworkError)return new a("NETWORK_ERROR",e.message,{providerId:t,url:typeof i.url==="string"?i.url:void 0,method:typeof i.method==="string"?i.method:void 0,isRetryable:typeof i.isRetryable==="boolean"?i.isRetryable:!0});if(e instanceof I.ClientError){let r=typeof i.httpStatus==="number"?i.httpStatus:void 0,l=typeof r==="number"&&r>=400&&r<500;return new a(l?"INVALID_REQUEST":"PROVIDER_ERROR",e.message,{providerId:t,httpStatus:r,errorCode:i.errorCode,errorMessage:i.errorMessage,url:i.url})}if(e instanceof I.ServerError)return new a("PROVIDER_ERROR",e.message,{providerId:t,httpStatus:typeof i.httpStatus==="number"?i.httpStatus:void 0});if(e instanceof I.DefaultError)return new a("PROVIDER_ERROR",e.message,{providerId:t,errorCode:i.errorCode,errorMessage:i.errorMessage});return new a("UNKNOWN_ERROR",e instanceof Error?e.message:String(e),{providerId:t})}function te(e){if(!e)return"UNKNOWN";if(e==="2000")return"PENDING";if(e==="3000")return"SENT";if(e==="4000")return"DELIVERED";if(/^[123]\\d{3}$/.test(e))return"FAILED";return"UNKNOWN"}function W(e){if(typeof e!=="string"||e.trim().length===0)return;let t=new Date(e);if(Number.isNaN(t.getTime()))return;return t}function K(e){let t=e.trim();if(t.startsWith("+"))return`+${t.slice(1).replace(/\\D/g,"")}`;return t.replace(/\\D/g,"")}function F(e){let t={};if(!e)return t;for(let[i,r]of Object.entries(e)){if(r===void 0)continue;t[i]=r===null?"":r instanceof Date?r.toISOString():typeof r==="string"?r:String(r)}return t}function ie(e){if(!Array.isArray(e)||e.length===0)return;let t=[];for(let i of e){if(!i)continue;if(i.type!=="WL")continue;if(!i.name||!i.urlMobile)continue;t.push({buttonName:i.name,buttonType:"WL",linkMo:i.urlMobile,linkPc:i.urlPc})}return t.length>0?t:void 0}function B(e){let t=typeof e.imageUrl==="string"&&e.imageUrl.trim().length>0?e.imageUrl.trim():void 0;if(t)return t;let i=e.media?.image;if(!i)return;if("ref"in i){let r=i.ref.trim();return r.length>0?r:void 0}throw new a("INVALID_REQUEST","SOLAPI image upload requires `options.imageUrl` or `options.media.image.ref` (url/path).",{providerId:e.providerId})}function D(e){return m(e)&&typeof e.fileId==="string"?e.fileId:void 0}function ne(e){switch(e.type){case"ALIMTALK":return"ATA";case"FRIENDTALK":return typeof e.imageUrl==="string"&&e.imageUrl.trim().length>0||Boolean(e.media?.image)?"CTI":"CTA";default:return e.type}}async function re(e){let{providerId:t,client:i,query:r}=e,l=r.providerMessageId.trim();if(!l)return O(new a("INVALID_REQUEST","providerMessageId is required",{providerId:t}));try{let o=await i.getMessages({messageId:l,limit:1}),h=(m(o)?o:{}).messageList;if(!h||typeof h!=="object"||Array.isArray(h))return A(null);let p=h,P=p[l],q=Object.values(p).find((M)=>{if(!m(M))return!1;let x=M.messageId;return typeof x==="string"?x===l:!1}),k=m(P)?P:m(q)?q:void 0;if(!k)return A(null);let y=typeof k.statusCode==="string"?k.statusCode:void 0,T=te(y),C=W(k.dateSent),w=W(k.dateCompleted);return A({providerId:t,providerMessageId:l,status:T,statusCode:y,statusMessage:typeof k.statusMessage==="string"?k.statusMessage:void 0,sentAt:C,deliveredAt:w,raw:k})}catch(o){return O(E(o,t))}}function he(e,t){if(e.type!=="ALIMTALK")return;if(e.failover?.enabled!==!0)return;return[{code:"FAILOVER_PARTIAL_PROVIDER",message:"SOLAPI failover mapping is partial. API-level fallback may be attempted for non-Kakao-user failures.",details:{providerId:t,mappedFields:["kakao.disableSms","text","subject"],unsupportedFields:["fallbackChannel"]}}]}function Ie(e){let{options:t,response:i,providerId:r,warnings:l}=e,o=m(i)?i:{},b=typeof o.messageId==="string"?o.messageId:void 0;return{messageId:t.messageId||crypto.randomUUID(),providerId:r,providerMessageId:b,status:"SENT",type:t.type,to:t.to,...Array.isArray(l)&&l.length>0?{warnings:l}:{},raw:i}}async function ke(e){let{options:t,providerId:i,config:r,client:l}=e,o=ne(t),b=t.options?.scheduledAt,h=typeof t.from==="string"&&t.from.length>0?t.from:r.defaultFrom,p={to:K(t.to),type:o},P=typeof t.options?.country==="string"&&t.options.country.length>0?t.options.country:typeof r.defaultCountry==="string"?r.defaultCountry:void 0;if(P)p.country=P;let U=t.options?.customFields;if(U&&typeof U==="object"){let n={};for(let[s,d]of Object.entries(U)){if(d===void 0)continue;n[s]=typeof d==="string"?d:String(d)}if(Object.keys(n).length>0)p.customFields=n}if(b)p.scheduledDate=b;if(o==="SMS"||o==="LMS"||o==="MMS"||o==="VOICE"||o==="FAX"||String(o).startsWith("RCS_")){if(!h||h.length===0)throw new a("INVALID_REQUEST","from is required (options.from or config.defaultFrom)",{providerId:i,type:t.type});p.from=K(h)}else if(h)p.from=K(h);if(o==="SMS"||o==="LMS"||o==="MMS"){let n=t,s=n.text;if(s.length===0)throw new a("INVALID_REQUEST","text is required for SMS/LMS/MMS",{providerId:i,type:t.type});p.text=s;let d=n.subject;if(d)p.subject=d;if(o==="MMS"){let c=B({imageUrl:n.imageUrl,media:n.media,providerId:i});if(!c)throw new a("INVALID_REQUEST","image is required for MMS (options.imageUrl or options.media.image.ref)",{providerId:i});let f=await l.uploadFile(c,"MMS"),u=D(f);if(typeof u==="string"&&u.length>0)p.imageId=u;else throw new a("PROVIDER_ERROR","Failed to upload MMS image",{providerId:i})}return p}if(o==="ATA"){let n=t,s=n.failover,d=typeof n.kakao?.profileId==="string"&&n.kakao.profileId.length>0?n.kakao.profileId:r.kakaoPfId;if(!d||d.length===0)throw new a("INVALID_REQUEST","kakao profileId is required (options.kakao.profileId or config.kakaoPfId)",{providerId:i});let c=typeof s?.fallbackContent==="string"&&s.fallbackContent.trim().length>0?s.fallbackContent.trim():void 0,f=typeof s?.fallbackTitle==="string"&&s.fallbackTitle.trim().length>0?s.fallbackTitle.trim():void 0,u=s?.enabled===!0?!1:s?.enabled===!1?!0:n.kakao?.disableSms;if(c)p.text=c;if(f)p.subject=f;return p.kakaoOptions={pfId:d,templateId:n.templateId,variables:F(n.variables),disableSms:u,adFlag:n.kakao?.adFlag,buttons:Array.isArray(n.kakao?.buttons)?n.kakao.buttons:void 0,imageId:n.kakao?.imageId},p}if(o==="CTA"||o==="CTI"){let n=t,s=n.text;if(s.length===0)throw new a("INVALID_REQUEST","text is required for FRIENDTALK",{providerId:i});let d=typeof n.kakao?.profileId==="string"&&n.kakao.profileId.length>0?n.kakao.profileId:r.kakaoPfId;if(!d||d.length===0)throw new a("INVALID_REQUEST","kakao profileId is required (options.kakao.profileId or config.kakaoPfId)",{providerId:i});let c=ie(n.buttons),f=Array.isArray(n.kakao?.buttons)?n.kakao.buttons:c,u=typeof n.kakao?.imageLink==="string"&&n.kakao.imageLink.length>0?n.kakao.imageLink:void 0,v=Array.isArray(f)&&f.length>0?f[0]:void 0,_=m(v)&&typeof v.linkMo==="string"?v.linkMo:void 0,J=u??_,Y;if(o==="CTI"){let X=B({imageUrl:n.imageUrl,media:n.media,providerId:i});if(!X)throw new a("INVALID_REQUEST","image is required for CTI (friendtalk image) (options.imageUrl or options.media.image.ref)",{providerId:i});if(!J)throw new a("INVALID_REQUEST","imageLink is required for friendtalk image upload (options.kakao.imageLink or WL button)",{providerId:i});let de=await l.uploadFile(X,"KAKAO",void 0,J),V=D(de);if(typeof V==="string"&&V.length>0)Y=V;else throw new a("PROVIDER_ERROR","Failed to upload friendtalk image",{providerId:i})}return p.text=s,p.kakaoOptions={pfId:d,variables:F(n.variables),disableSms:n.kakao?.disableSms,adFlag:n.kakao?.adFlag,buttons:f,imageId:Y},p}if(o==="NSA"){let n=t,s=typeof n.naver?.talkId==="string"&&n.naver.talkId.length>0?n.naver.talkId:r.naverTalkId;if(!s||s.length===0)throw new a("INVALID_REQUEST","naver talkId is required (options.naver.talkId or config.naverTalkId)",{providerId:i});let d=typeof n.naver?.templateId==="string"&&n.naver.templateId.length>0?n.naver.templateId:n.templateId,c={...F(n.variables),...F(n.naver?.variables)};return p.naverOptions={talkId:s,templateId:d,variables:c,disableSms:n.naver?.disableSms,buttons:Array.isArray(n.naver?.buttons)?n.naver.buttons:void 0},p}if(o==="VOICE"){let n=t,s=n.text;if(s.length===0)throw new a("INVALID_REQUEST","text is required for VOICE",{providerId:i});let d=n.voice?.voiceType,c=d==="FEMALE"||d==="MALE"?d:"FEMALE";return p.text=s,p.voiceOptions=n.voice?{...n.voice,voiceType:c}:{voiceType:c},p}if(o==="FAX"){let s=t.fax,c=Array.isArray(s?.fileIds)?s.fileIds.filter((f)=>typeof f==="string"&&f.length>0):[];if(c.length===0){let f=Array.isArray(s?.fileUrls)?s.fileUrls.filter((u)=>typeof u==="string"&&u.length>0):[];if(f.length===0)throw new a("INVALID_REQUEST","fax.fileIds or fax.fileUrls is required",{providerId:i});c=[];for(let u of f){let v=await l.uploadFile(u,"FAX"),_=D(v);if(typeof _==="string"&&_.length>0)c.push(_)}}if(c.length===0)throw new a("PROVIDER_ERROR","Failed to resolve fax fileIds",{providerId:i});return p.faxOptions={fileIds:c},p}let k=t,y=k.rcs,T=typeof y?.brandId==="string"&&y.brandId.length>0?y.brandId:r.rcsBrandId;if(!T||T.length===0)throw new a("INVALID_REQUEST","rcs brandId is required (options.rcs.brandId or config.rcsBrandId)",{providerId:i});let C={brandId:T,buttons:Array.isArray(y?.buttons)?y.buttons:void 0,copyAllowed:y?.copyAllowed,mmsType:y?.mmsType,commercialType:y?.commercialType,disableSms:y?.disableSms,variables:{...F(k.variables),...F(y?.variables)}};if(o==="RCS_TPL"||o==="RCS_ITPL"||o==="RCS_LTPL"){let n=t;C.templateId=typeof n.rcs?.templateId==="string"&&n.rcs.templateId.length>0?n.rcs.templateId:n.templateId}let w,M;if(o==="RCS_SMS"||o==="RCS_LMS"||o==="RCS_MMS"){let n=t;if(w=n.text,M=n.subject,!w||w.length===0)throw new a("INVALID_REQUEST","text is required for RCS text types",{providerId:i});if(p.text=w,M)p.subject=M}let x=y?.additionalBody,g=m(x)?x:void 0,pe=g&&typeof g.imageId==="string"&&g.imageId.length>0?g.imageId:g&&typeof g.imaggeId==="string"&&g.imaggeId.length>0?g.imaggeId:void 0,L=(n)=>{let s=g?{...g}:{},d=typeof s.title==="string"&&s.title.length>0?s.title:M||"RCS",c=typeof s.description==="string"&&s.description.length>0?s.description:w||"",f=pe??n,u={...s,title:d,description:c};if(typeof f==="string"&&f.length>0)u.imaggeId=f;return u};if(o==="RCS_MMS"){let n=t,s=B({imageUrl:n.imageUrl,media:n.media,providerId:i});if(s){let d=await l.uploadFile(s,"RCS"),c=D(d);if(typeof c==="string"&&c.length>0)C.additionalBody=L(c);else if(g)C.additionalBody=L(void 0)}else if(g)C.additionalBody=L(void 0)}else if(g)C.additionalBody=L(void 0);return p.rcsOptions=C,p}async function oe(e){let{providerId:t,client:i,config:r,options:l}=e,o=he(l,t),b=await ke({options:l,providerId:t,config:r,client:i}),h=await i.sendOne(b,r.appId);return A(Ie({options:l,response:h,providerId:t,warnings:o}))}class N{id="solapi";name="SOLAPI Messaging Provider";supportedTypes=["ALIMTALK","FRIENDTALK","SMS","LMS","MMS","NSA","VOICE","FAX","RCS_SMS","RCS_LMS","RCS_MMS","RCS_TPL","RCS_ITPL","RCS_LTPL"];config;client;getOnboardingSpec(){let e=ee(this.id);if(!e)throw Error(`Onboarding spec missing for provider: ${this.id}`);return e}constructor(e,t){if(!e||typeof e!=="object")throw Error("SolapiProvider requires a config object");if(!e.apiKey||e.apiKey.length===0)throw Error("SolapiProvider requires `apiKey`");if(!e.apiSecret||e.apiSecret.length===0)throw Error("SolapiProvider requires `apiSecret`");this.config={...e,baseUrl:typeof e.baseUrl==="string"&&e.baseUrl.length>0?e.baseUrl:"https://api.solapi.com"},this.client=t??new se.SolapiMessageService(this.config.apiKey,this.config.apiSecret)}async healthCheck(){let e=[],t=Date.now();try{if(!this.config.apiKey)e.push("Missing apiKey");if(!this.config.apiSecret)e.push("Missing apiSecret");if(this.config.baseUrl)try{new URL(this.config.baseUrl)}catch{e.push("Invalid baseUrl")}return{healthy:e.length===0,issues:e,latencyMs:Date.now()-t,data:{provider:this.id,baseUrl:this.config.baseUrl}}}catch(i){return e.push(i instanceof Error?i.message:String(i)),{healthy:!1,issues:e,latencyMs:Date.now()-t}}}async send(e){let t=e.messageId||crypto.randomUUID(),i={...e,messageId:t};try{return await oe({providerId:this.id,client:this.client,config:this.config,options:i})}catch(r){return O(E(r,this.id))}}async getDeliveryStatus(e){return re({providerId:this.id,client:this.client,query:e})}async getBalance(e){try{let t=await this.client.getBalance(),i=t,r=[i.balance,i.point],l=Number.NaN;for(let o of r){if(typeof o==="number"&&Number.isFinite(o)){l=o;break}if(typeof o==="string"){let b=Number(o);if(Number.isFinite(b)){l=b;break}}}if(!Number.isFinite(l))return O(E(Error("Invalid balance response from SOLAPI"),this.id));return A({providerId:this.id,channel:e?.channel,amount:l,currency:"KRW",raw:t})}catch(t){return O(E(t,this.id))}}}var $=(e)=>new N(e),H=()=>{let e={apiKey:S("SOLAPI_API_KEY")||"",apiSecret:S("SOLAPI_API_SECRET")||"",baseUrl:S("SOLAPI_BASE_URL")||"https://api.solapi.com",defaultFrom:S("SOLAPI_DEFAULT_FROM"),kakaoPfId:S("SOLAPI_KAKAO_PF_ID"),rcsBrandId:S("SOLAPI_RCS_BRAND_ID"),naverTalkId:S("SOLAPI_NAVER_TALK_ID"),appId:S("SOLAPI_APP_ID"),defaultCountry:S("SOLAPI_DEFAULT_COUNTRY"),debug:S("NODE_ENV")==="development"};if(!e.apiKey||!e.apiSecret)throw Error("SOLAPI_API_KEY and SOLAPI_API_SECRET environment variables are required");return $(e)};class G{static create(e){return new N(e)}static createDefault(){return H()}}function ae(){}
|
|
1
|
+
var{defineProperty:j,getOwnPropertyNames:le,getOwnPropertyDescriptor:ce}=Object,fe=Object.prototype.hasOwnProperty;var Z=new WeakMap,ye=(e)=>{var t=Z.get(e),n;if(t)return t;if(t=j({},"__esModule",{value:!0}),e&&typeof e==="object"||typeof e==="function")le(e).map((r)=>!fe.call(t,r)&&j(t,r,{get:()=>e[r],enumerable:!(n=ce(e,r))||n.enumerable}));return Z.set(e,t),t};var ue=(e,t)=>{for(var n in t)j(e,n,{get:t[n],enumerable:!0,configurable:!0,set:(r)=>t[n]=()=>r})};var Ie={};ue(Ie,{initializeSolapi:()=>ae,createSolapiProvider:()=>$,createDefaultSolapiProvider:()=>H,SolapiProviderFactory:()=>G,SolapiProvider:()=>D});module.exports=ye(Ie);var Q=(e)=>{if(typeof e!=="number"||Number.isNaN(e)||!Number.isFinite(e))return;return Math.trunc(e)};class a extends Error{code;details;providerErrorCode;providerErrorText;httpStatus;requestId;retryAfterMs;attempt;causeChain;constructor(e,t,n,r={}){super(t);if(this.name="KMsgError",this.code=e,this.details=n,this.providerErrorCode=r.providerErrorCode,this.providerErrorText=r.providerErrorText,this.httpStatus=Q(r.httpStatus),this.requestId=typeof r.requestId==="string"?r.requestId:void 0,this.retryAfterMs=Q(r.retryAfterMs),this.attempt=Q(r.attempt),Array.isArray(r.causeChain))this.causeChain=r.causeChain;else if(r.causeChain!==void 0)this.causeChain=[r.causeChain];if(Error.captureStackTrace)Error.captureStackTrace(this,a)}toJSON(){return{name:this.name,code:this.code,message:this.message,details:this.details,providerErrorCode:this.providerErrorCode,providerErrorText:this.providerErrorText,httpStatus:this.httpStatus,requestId:this.requestId,retryAfterMs:this.retryAfterMs,attempt:this.attempt,causeChain:this.causeChain}}}var A=(e)=>({isSuccess:!0,isFailure:!1,value:e}),w=(e)=>({isSuccess:!1,isFailure:!0,error:e});function he(){let e=globalThis;return e.__K_MSG_ENV__??e.__ENV__??e.process?.env??{}}function b(e){let t=he()[e];if(typeof t==="string")return t;if(t===void 0)return;return String(t)}var oe=require("solapi");var z={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 ee(e){return z[e]}function Pt(){return Object.values(z)}function m(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}var S=require("solapi");function O(e,t){if(e instanceof a)return e;let n=m(e)?e:{};if(e instanceof S.ApiKeyError)return new a("AUTHENTICATION_FAILED",e.message,{providerId:t});if(e instanceof S.BadRequestError)return new a("INVALID_REQUEST",e.message,{providerId:t,validationErrors:n.validationErrors});if(e instanceof S.NetworkError)return new a("NETWORK_ERROR",e.message,{providerId:t,url:typeof n.url==="string"?n.url:void 0,method:typeof n.method==="string"?n.method:void 0,isRetryable:typeof n.isRetryable==="boolean"?n.isRetryable:!0});if(e instanceof S.ClientError){let r=typeof n.httpStatus==="number"?n.httpStatus:void 0,l=typeof r==="number"&&r>=400&&r<500;return new a(l?"INVALID_REQUEST":"PROVIDER_ERROR",e.message,{providerId:t,httpStatus:r,errorCode:n.errorCode,errorMessage:n.errorMessage,url:n.url})}if(e instanceof S.ServerError)return new a("PROVIDER_ERROR",e.message,{providerId:t,httpStatus:typeof n.httpStatus==="number"?n.httpStatus:void 0});if(e instanceof S.DefaultError)return new a("PROVIDER_ERROR",e.message,{providerId:t,errorCode:n.errorCode,errorMessage:n.errorMessage});return new a("UNKNOWN_ERROR",e instanceof Error?e.message:String(e),{providerId:t})}function te(e){if(!e)return"UNKNOWN";if(e==="2000")return"PENDING";if(e==="3000")return"SENT";if(e==="4000")return"DELIVERED";if(/^[123]\\d{3}$/.test(e))return"FAILED";return"UNKNOWN"}function W(e){if(typeof e!=="string"||e.trim().length===0)return;let t=new Date(e);if(Number.isNaN(t.getTime()))return;return t}function L(e){let t=e.trim();if(t.startsWith("+"))return`+${t.slice(1).replace(/\\D/g,"")}`;return t.replace(/\\D/g,"")}function K(e){let t={};if(!e)return t;for(let[n,r]of Object.entries(e)){if(r===void 0)continue;t[n]=r===null?"":r instanceof Date?r.toISOString():typeof r==="string"?r:String(r)}return t}function ne(e){if(!Array.isArray(e)||e.length===0)return;let t=[];for(let n of e){if(!n)continue;if(n.type!=="WL")continue;if(!n.name||!n.urlMobile)continue;t.push({buttonName:n.name,buttonType:"WL",linkMo:n.urlMobile,linkPc:n.urlPc})}return t.length>0?t:void 0}function B(e){let t=typeof e.imageUrl==="string"&&e.imageUrl.trim().length>0?e.imageUrl.trim():void 0;if(t)return t;let n=e.media?.image;if(!n)return;if("ref"in n){let r=n.ref.trim();return r.length>0?r:void 0}throw new a("INVALID_REQUEST","SOLAPI image upload requires `options.imageUrl` or `options.media.image.ref` (url/path).",{providerId:e.providerId})}function _(e){return m(e)&&typeof e.fileId==="string"?e.fileId:void 0}function ie(e){switch(e.type){case"ALIMTALK":return"ATA";case"FRIENDTALK":return typeof e.imageUrl==="string"&&e.imageUrl.trim().length>0||Boolean(e.media?.image)?"CTI":"CTA";default:return e.type}}async function re(e){let{providerId:t,client:n,query:r}=e,l=r.providerMessageId.trim();if(!l)return w(new a("INVALID_REQUEST","providerMessageId is required",{providerId:t}));try{let s=await n.getMessages({messageId:l,limit:1}),h=(m(s)?s:{}).messageList;if(!h||typeof h!=="object"||Array.isArray(h))return A(null);let p=h,F=p[l],q=Object.values(p).find((R)=>{if(!m(R))return!1;let P=R.messageId;return typeof P==="string"?P===l:!1}),k=m(F)?F:m(q)?q:void 0;if(!k)return A(null);let u=typeof k.statusCode==="string"?k.statusCode:void 0,E=te(u),C=W(k.dateSent),v=W(k.dateCompleted);return A({providerId:t,providerMessageId:l,status:E,statusCode:u,statusMessage:typeof k.statusMessage==="string"?k.statusMessage:void 0,sentAt:C,deliveredAt:v,raw:k})}catch(s){return w(O(s,t))}}function Se(e,t){if(e.type!=="ALIMTALK")return;if(e.failover?.enabled!==!0)return;return[{code:"FAILOVER_PARTIAL_PROVIDER",message:"SOLAPI failover mapping is partial. API-level fallback may be attempted for non-Kakao-user failures.",details:{providerId:t,mappedFields:["kakao.disableSms","text","subject"],unsupportedFields:["fallbackChannel"]}}]}function ke(e){let{options:t,response:n,providerId:r,warnings:l}=e,s=m(n)?n:{},I=typeof s.messageId==="string"?s.messageId:void 0;return{messageId:t.messageId||crypto.randomUUID(),providerId:r,providerMessageId:I,status:"SENT",type:t.type,to:t.to,...Array.isArray(l)&&l.length>0?{warnings:l}:{},raw:n}}async function be(e){let{options:t,providerId:n,config:r,client:l}=e,s=ie(t),I=t.options?.scheduledAt,h=typeof t.from==="string"&&t.from.length>0?t.from:r.defaultFrom,p={to:L(t.to),type:s},F=typeof t.options?.country==="string"&&t.options.country.length>0?t.options.country:typeof r.defaultCountry==="string"?r.defaultCountry:void 0;if(F)p.country=F;let N=t.options?.customFields;if(N&&typeof N==="object"){let i={};for(let[o,d]of Object.entries(N)){if(d===void 0)continue;i[o]=typeof d==="string"?d:String(d)}if(Object.keys(i).length>0)p.customFields=i}if(I)p.scheduledDate=I;if(s==="SMS"||s==="LMS"||s==="MMS"||s==="VOICE"||s==="FAX"||String(s).startsWith("RCS_")){if(!h||h.length===0)throw new a("INVALID_REQUEST","from is required (options.from or config.defaultFrom)",{providerId:n,type:t.type});p.from=L(h)}else if(h)p.from=L(h);if(s==="SMS"||s==="LMS"||s==="MMS"){let i=t,o=i.text;if(o.length===0)throw new a("INVALID_REQUEST","text is required for SMS/LMS/MMS",{providerId:n,type:t.type});p.text=o;let d=i.subject;if(d)p.subject=d;if(s==="MMS"){let c=B({imageUrl:i.imageUrl,media:i.media,providerId:n});if(!c)throw new a("INVALID_REQUEST","image is required for MMS (options.imageUrl or options.media.image.ref)",{providerId:n});let f=await l.uploadFile(c,"MMS"),y=_(f);if(typeof y==="string"&&y.length>0)p.imageId=y;else throw new a("PROVIDER_ERROR","Failed to upload MMS image",{providerId:n})}return p}if(s==="ATA"){let i=t,o=i.failover,d=typeof i.kakao?.profileId==="string"&&i.kakao.profileId.length>0?i.kakao.profileId:r.kakaoPfId;if(!d||d.length===0)throw new a("INVALID_REQUEST","kakao profileId is required (options.kakao.profileId or config.kakaoPfId)",{providerId:n});let c=typeof o?.fallbackContent==="string"&&o.fallbackContent.trim().length>0?o.fallbackContent.trim():void 0,f=typeof o?.fallbackTitle==="string"&&o.fallbackTitle.trim().length>0?o.fallbackTitle.trim():void 0,y=o?.enabled===!0?!1:o?.enabled===!1?!0:i.kakao?.disableSms;if(c)p.text=c;if(f)p.subject=f;return p.kakaoOptions={pfId:d,templateId:i.templateId,variables:K(i.variables),disableSms:y,adFlag:i.kakao?.adFlag,buttons:Array.isArray(i.kakao?.buttons)?i.kakao.buttons:void 0,imageId:i.kakao?.imageId},p}if(s==="CTA"||s==="CTI"){let i=t,o=i.text;if(o.length===0)throw new a("INVALID_REQUEST","text is required for FRIENDTALK",{providerId:n});let d=typeof i.kakao?.profileId==="string"&&i.kakao.profileId.length>0?i.kakao.profileId:r.kakaoPfId;if(!d||d.length===0)throw new a("INVALID_REQUEST","kakao profileId is required (options.kakao.profileId or config.kakaoPfId)",{providerId:n});let c=ne(i.buttons),f=Array.isArray(i.kakao?.buttons)?i.kakao.buttons:c,y=typeof i.kakao?.imageLink==="string"&&i.kakao.imageLink.length>0?i.kakao.imageLink:void 0,T=Array.isArray(f)&&f.length>0?f[0]:void 0,x=m(T)&&typeof T.linkMo==="string"?T.linkMo:void 0,J=y??x,Y;if(s==="CTI"){let X=B({imageUrl:i.imageUrl,media:i.media,providerId:n});if(!X)throw new a("INVALID_REQUEST","image is required for CTI (friendtalk image) (options.imageUrl or options.media.image.ref)",{providerId:n});if(!J)throw new a("INVALID_REQUEST","imageLink is required for friendtalk image upload (options.kakao.imageLink or WL button)",{providerId:n});let de=await l.uploadFile(X,"KAKAO",void 0,J),V=_(de);if(typeof V==="string"&&V.length>0)Y=V;else throw new a("PROVIDER_ERROR","Failed to upload friendtalk image",{providerId:n})}return p.text=o,p.kakaoOptions={pfId:d,variables:K(i.variables),disableSms:i.kakao?.disableSms,adFlag:i.kakao?.adFlag,buttons:f,imageId:Y},p}if(s==="NSA"){let i=t,o=typeof i.naver?.talkId==="string"&&i.naver.talkId.length>0?i.naver.talkId:r.naverTalkId;if(!o||o.length===0)throw new a("INVALID_REQUEST","naver talkId is required (options.naver.talkId or config.naverTalkId)",{providerId:n});let d=typeof i.naver?.templateId==="string"&&i.naver.templateId.length>0?i.naver.templateId:i.templateId,c={...K(i.variables),...K(i.naver?.variables)};return p.naverOptions={talkId:o,templateId:d,variables:c,disableSms:i.naver?.disableSms,buttons:Array.isArray(i.naver?.buttons)?i.naver.buttons:void 0},p}if(s==="VOICE"){let i=t,o=i.text;if(o.length===0)throw new a("INVALID_REQUEST","text is required for VOICE",{providerId:n});let d=i.voice?.voiceType,c=d==="FEMALE"||d==="MALE"?d:"FEMALE";return p.text=o,p.voiceOptions=i.voice?{...i.voice,voiceType:c}:{voiceType:c},p}if(s==="FAX"){let o=t.fax,c=Array.isArray(o?.fileIds)?o.fileIds.filter((f)=>typeof f==="string"&&f.length>0):[];if(c.length===0){let f=Array.isArray(o?.fileUrls)?o.fileUrls.filter((y)=>typeof y==="string"&&y.length>0):[];if(f.length===0)throw new a("INVALID_REQUEST","fax.fileIds or fax.fileUrls is required",{providerId:n});c=[];for(let y of f){let T=await l.uploadFile(y,"FAX"),x=_(T);if(typeof x==="string"&&x.length>0)c.push(x)}}if(c.length===0)throw new a("PROVIDER_ERROR","Failed to resolve fax fileIds",{providerId:n});return p.faxOptions={fileIds:c},p}let k=t,u=k.rcs,E=typeof u?.brandId==="string"&&u.brandId.length>0?u.brandId:r.rcsBrandId;if(!E||E.length===0)throw new a("INVALID_REQUEST","rcs brandId is required (options.rcs.brandId or config.rcsBrandId)",{providerId:n});let C={brandId:E,buttons:Array.isArray(u?.buttons)?u.buttons:void 0,copyAllowed:u?.copyAllowed,mmsType:u?.mmsType,commercialType:u?.commercialType,disableSms:u?.disableSms,variables:{...K(k.variables),...K(u?.variables)}};if(s==="RCS_TPL"||s==="RCS_ITPL"||s==="RCS_LTPL"){let i=t;C.templateId=typeof i.rcs?.templateId==="string"&&i.rcs.templateId.length>0?i.rcs.templateId:i.templateId}let v,R;if(s==="RCS_SMS"||s==="RCS_LMS"||s==="RCS_MMS"){let i=t;if(v=i.text,R=i.subject,!v||v.length===0)throw new a("INVALID_REQUEST","text is required for RCS text types",{providerId:n});if(p.text=v,R)p.subject=R}let P=u?.additionalBody,g=m(P)?P:void 0,pe=g&&typeof g.imageId==="string"&&g.imageId.length>0?g.imageId:g&&typeof g.imaggeId==="string"&&g.imaggeId.length>0?g.imaggeId:void 0,U=(i)=>{let o=g?{...g}:{},d=typeof o.title==="string"&&o.title.length>0?o.title:R||"RCS",c=typeof o.description==="string"&&o.description.length>0?o.description:v||"",f=pe??i,y={...o,title:d,description:c};if(typeof f==="string"&&f.length>0)y.imaggeId=f;return y};if(s==="RCS_MMS"){let i=t,o=B({imageUrl:i.imageUrl,media:i.media,providerId:n});if(o){let d=await l.uploadFile(o,"RCS"),c=_(d);if(typeof c==="string"&&c.length>0)C.additionalBody=U(c);else if(g)C.additionalBody=U(void 0)}else if(g)C.additionalBody=U(void 0)}else if(g)C.additionalBody=U(void 0);return p.rcsOptions=C,p}async function se(e){let{providerId:t,client:n,config:r,options:l}=e,s=Se(l,t),I=await be({options:l,providerId:t,config:r,client:n}),h=await n.sendOne(I,r.appId);return A(ke({options:l,response:h,providerId:t,warnings:s}))}class D{id="solapi";name="SOLAPI Messaging Provider";supportedTypes=["ALIMTALK","FRIENDTALK","SMS","LMS","MMS","NSA","VOICE","FAX","RCS_SMS","RCS_LMS","RCS_MMS","RCS_TPL","RCS_ITPL","RCS_LTPL"];config;client;getOnboardingSpec(){let e=ee(this.id);if(!e)throw Error(`Onboarding spec missing for provider: ${this.id}`);return e}constructor(e,t){if(!e||typeof e!=="object")throw Error("SolapiProvider requires a config object");if(!e.apiKey||e.apiKey.length===0)throw Error("SolapiProvider requires `apiKey`");if(!e.apiSecret||e.apiSecret.length===0)throw Error("SolapiProvider requires `apiSecret`");this.config={...e,baseUrl:typeof e.baseUrl==="string"&&e.baseUrl.length>0?e.baseUrl:"https://api.solapi.com"},this.client=t??new oe.SolapiMessageService(this.config.apiKey,this.config.apiSecret)}async healthCheck(){let e=[],t=Date.now();try{if(!this.config.apiKey)e.push("Missing apiKey");if(!this.config.apiSecret)e.push("Missing apiSecret");if(this.config.baseUrl)try{new URL(this.config.baseUrl)}catch{e.push("Invalid baseUrl")}return{healthy:e.length===0,issues:e,latencyMs:Date.now()-t,data:{provider:this.id,baseUrl:this.config.baseUrl}}}catch(n){return e.push(n instanceof Error?n.message:String(n)),{healthy:!1,issues:e,latencyMs:Date.now()-t}}}async send(e){let t=e.messageId||crypto.randomUUID(),n={...e,messageId:t};try{return await se({providerId:this.id,client:this.client,config:this.config,options:n})}catch(r){return w(O(r,this.id))}}async getDeliveryStatus(e){return re({providerId:this.id,client:this.client,query:e})}async getBalance(e){try{let t=await this.client.getBalance(),n=t,r=[n.balance,n.point],l=Number.NaN;for(let s of r){if(typeof s==="number"&&Number.isFinite(s)){l=s;break}if(typeof s==="string"){let I=Number(s);if(Number.isFinite(I)){l=I;break}}}if(!Number.isFinite(l))return w(O(Error("Invalid balance response from SOLAPI"),this.id));return A({providerId:this.id,channel:e?.channel,amount:l,currency:"KRW",raw:t})}catch(t){return w(O(t,this.id))}}}var $=(e)=>new D(e),H=()=>{let e={apiKey:b("SOLAPI_API_KEY")||"",apiSecret:b("SOLAPI_API_SECRET")||"",baseUrl:b("SOLAPI_BASE_URL")||"https://api.solapi.com",defaultFrom:b("SOLAPI_DEFAULT_FROM"),kakaoPfId:b("SOLAPI_KAKAO_PF_ID"),rcsBrandId:b("SOLAPI_RCS_BRAND_ID"),naverTalkId:b("SOLAPI_NAVER_TALK_ID"),appId:b("SOLAPI_APP_ID"),defaultCountry:b("SOLAPI_DEFAULT_COUNTRY"),debug:b("NODE_ENV")==="development"};if(!e.apiKey||!e.apiSecret)throw Error("SOLAPI_API_KEY and SOLAPI_API_SECRET environment variables are required");return $(e)};class G{static create(e){return new D(e)}static createDefault(){return H()}}function ae(){}
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
3
|
+
//# debugId=57EEFC08A1C7A95164756E2164756E21
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/dist/solapi/index.js.map
CHANGED
|
@@ -14,6 +14,6 @@
|
|
|
14
14
|
"import {\n KMsgError,\n KMsgErrorCode,\n type MessageType,\n ok,\n type Result,\n type SendOptions,\n type SendResult,\n} from \"@k-msg/core\";\nimport { isObjectRecord } from \"../shared/type-guards\";\nimport {\n extractFileId,\n normalizePhoneNumber,\n resolveImageRef,\n stringifyVariables,\n toKakaoButtons,\n toSolapiMessageType,\n} from \"./solapi.helpers\";\nimport type {\n SolapiSdkClient,\n SolapiSendOneMessage,\n} from \"./solapi.internal.types\";\nimport type { SolapiConfig } from \"./types/solapi\";\n\nexport function collectSolapiSendWarnings(\n options: SendOptions,\n providerId: string,\n): SendResult[\"warnings\"] {\n if (options.type !== \"ALIMTALK\") return undefined;\n if (options.failover?.enabled !== true) return undefined;\n\n return [\n {\n code: \"FAILOVER_PARTIAL_PROVIDER\",\n message:\n \"SOLAPI failover mapping is partial. API-level fallback may be attempted for non-Kakao-user failures.\",\n details: {\n providerId,\n mappedFields: [\"kakao.disableSms\", \"text\", \"subject\"],\n unsupportedFields: [\"fallbackChannel\"],\n },\n },\n ];\n}\n\nexport function adaptSolapiSendResult(params: {\n options: SendOptions;\n response: unknown;\n providerId: string;\n warnings?: SendResult[\"warnings\"];\n}): SendResult {\n const { options, response, providerId, warnings } = params;\n const record = isObjectRecord(response) ? response : {};\n const providerMessageId =\n typeof record.messageId === \"string\" ? record.messageId : undefined;\n\n return {\n messageId: options.messageId || crypto.randomUUID(),\n providerId,\n providerMessageId,\n status: \"SENT\",\n type: options.type,\n to: options.to,\n ...(Array.isArray(warnings) && warnings.length > 0 ? { warnings } : {}),\n raw: response,\n };\n}\n\nexport async function buildSolapiSendOneMessage(params: {\n options: SendOptions;\n providerId: string;\n config: SolapiConfig;\n client: SolapiSdkClient;\n}): Promise<SolapiSendOneMessage> {\n const { options, providerId, config, client } = params;\n\n const type = toSolapiMessageType(options);\n const scheduledAt = options.options?.scheduledAt;\n const senderNumber =\n typeof options.from === \"string\" && options.from.length > 0\n ? options.from\n : config.defaultFrom;\n\n const base: Record<string, unknown> = {\n to: normalizePhoneNumber(options.to),\n type,\n };\n\n const country =\n typeof options.options?.country === \"string\" &&\n options.options.country.length > 0\n ? options.options.country\n : typeof config.defaultCountry === \"string\"\n ? config.defaultCountry\n : undefined;\n if (country) {\n base.country = country;\n }\n\n const customFieldsRaw = options.options?.customFields;\n if (customFieldsRaw && typeof customFieldsRaw === \"object\") {\n const customFields: Record<string, string> = {};\n for (const [key, value] of Object.entries(customFieldsRaw)) {\n if (value === undefined) continue;\n customFields[key] = typeof value === \"string\" ? value : String(value);\n }\n if (Object.keys(customFields).length > 0) {\n base.customFields = customFields;\n }\n }\n\n if (scheduledAt) {\n base.scheduledDate = scheduledAt;\n }\n\n const requiresFrom =\n type === \"SMS\" ||\n type === \"LMS\" ||\n type === \"MMS\" ||\n type === \"VOICE\" ||\n type === \"FAX\" ||\n String(type).startsWith(\"RCS_\");\n\n if (requiresFrom) {\n if (!senderNumber || senderNumber.length === 0) {\n throw new KMsgError(\n KMsgErrorCode.INVALID_REQUEST,\n \"from is required (options.from or config.defaultFrom)\",\n { providerId, type: options.type as MessageType },\n );\n }\n base.from = normalizePhoneNumber(senderNumber);\n } else if (senderNumber) {\n base.from = normalizePhoneNumber(senderNumber);\n }\n\n if (type === \"SMS\" || type === \"LMS\" || type === \"MMS\") {\n const smsOptions = options as Extract<\n SendOptions,\n { type: \"SMS\" | \"LMS\" | \"MMS\" }\n >;\n const text = smsOptions.text;\n if (text.length === 0) {\n throw new KMsgError(\n KMsgErrorCode.INVALID_REQUEST,\n \"text is required for SMS/LMS/MMS\",\n { providerId, type: options.type as MessageType },\n );\n }\n\n base.text = text;\n const subject = smsOptions.subject;\n if (subject) {\n base.subject = subject;\n }\n\n if (type === \"MMS\") {\n const imageRef = resolveImageRef({\n imageUrl: smsOptions.imageUrl,\n media: smsOptions.media,\n providerId,\n });\n if (!imageRef) {\n throw new KMsgError(\n KMsgErrorCode.INVALID_REQUEST,\n \"image is required for MMS (options.imageUrl or options.media.image.ref)\",\n { providerId },\n );\n }\n\n const upload = await client.uploadFile(imageRef, \"MMS\");\n const fileId = extractFileId(upload);\n if (typeof fileId === \"string\" && fileId.length > 0) {\n base.imageId = fileId;\n } else {\n throw new KMsgError(\n KMsgErrorCode.PROVIDER_ERROR,\n \"Failed to upload MMS image\",\n {\n providerId,\n },\n );\n }\n }\n\n return base as unknown as SolapiSendOneMessage;\n }\n\n if (type === \"ATA\") {\n const alimtalkOptions = options as Extract<\n SendOptions,\n { type: \"ALIMTALK\" }\n >;\n const failover = alimtalkOptions.failover;\n const pfId =\n typeof alimtalkOptions.kakao?.profileId === \"string\" &&\n alimtalkOptions.kakao.profileId.length > 0\n ? alimtalkOptions.kakao.profileId\n : config.kakaoPfId;\n\n if (!pfId || pfId.length === 0) {\n throw new KMsgError(\n KMsgErrorCode.INVALID_REQUEST,\n \"kakao profileId is required (options.kakao.profileId or config.kakaoPfId)\",\n { providerId },\n );\n }\n\n const fallbackContent =\n typeof failover?.fallbackContent === \"string\" &&\n failover.fallbackContent.trim().length > 0\n ? failover.fallbackContent.trim()\n : undefined;\n const fallbackTitle =\n typeof failover?.fallbackTitle === \"string\" &&\n failover.fallbackTitle.trim().length > 0\n ? failover.fallbackTitle.trim()\n : undefined;\n const disableSms =\n failover?.enabled === true\n ? false\n : failover?.enabled === false\n ? true\n : alimtalkOptions.kakao?.disableSms;\n\n if (fallbackContent) {\n base.text = fallbackContent;\n }\n if (fallbackTitle) {\n base.subject = fallbackTitle;\n }\n\n base.kakaoOptions = {\n pfId,\n templateId: alimtalkOptions.templateId,\n variables: stringifyVariables(alimtalkOptions.variables),\n disableSms,\n adFlag: alimtalkOptions.kakao?.adFlag,\n buttons: Array.isArray(alimtalkOptions.kakao?.buttons)\n ? alimtalkOptions.kakao.buttons\n : undefined,\n imageId: alimtalkOptions.kakao?.imageId,\n };\n\n return base as unknown as SolapiSendOneMessage;\n }\n\n if (type === \"CTA\" || type === \"CTI\") {\n const friendTalkOptions = options as Extract<\n SendOptions,\n { type: \"FRIENDTALK\" }\n >;\n const text = friendTalkOptions.text;\n if (text.length === 0) {\n throw new KMsgError(\n KMsgErrorCode.INVALID_REQUEST,\n \"text is required for FRIENDTALK\",\n { providerId },\n );\n }\n\n const pfId =\n typeof friendTalkOptions.kakao?.profileId === \"string\" &&\n friendTalkOptions.kakao.profileId.length > 0\n ? friendTalkOptions.kakao.profileId\n : config.kakaoPfId;\n\n if (!pfId || pfId.length === 0) {\n throw new KMsgError(\n KMsgErrorCode.INVALID_REQUEST,\n \"kakao profileId is required (options.kakao.profileId or config.kakaoPfId)\",\n { providerId },\n );\n }\n\n const kakaoButtons = toKakaoButtons(friendTalkOptions.buttons);\n const buttons = Array.isArray(friendTalkOptions.kakao?.buttons)\n ? friendTalkOptions.kakao.buttons\n : kakaoButtons;\n\n const imageLinkFromOptions =\n typeof friendTalkOptions.kakao?.imageLink === \"string\" &&\n friendTalkOptions.kakao.imageLink.length > 0\n ? friendTalkOptions.kakao.imageLink\n : undefined;\n const firstButton =\n Array.isArray(buttons) && buttons.length > 0 ? buttons[0] : undefined;\n const imageLinkFromButton =\n isObjectRecord(firstButton) && typeof firstButton.linkMo === \"string\"\n ? (firstButton.linkMo as string)\n : undefined;\n const imageLink = imageLinkFromOptions ?? imageLinkFromButton;\n\n let imageId: string | undefined;\n if (type === \"CTI\") {\n const imageRef = resolveImageRef({\n imageUrl: friendTalkOptions.imageUrl,\n media: friendTalkOptions.media,\n providerId,\n });\n if (!imageRef) {\n throw new KMsgError(\n KMsgErrorCode.INVALID_REQUEST,\n \"image is required for CTI (friendtalk image) (options.imageUrl or options.media.image.ref)\",\n { providerId },\n );\n }\n if (!imageLink) {\n throw new KMsgError(\n KMsgErrorCode.INVALID_REQUEST,\n \"imageLink is required for friendtalk image upload (options.kakao.imageLink or WL button)\",\n { providerId },\n );\n }\n\n const upload = await client.uploadFile(\n imageRef,\n \"KAKAO\",\n undefined,\n imageLink,\n );\n const fileId = extractFileId(upload);\n if (typeof fileId === \"string\" && fileId.length > 0) {\n imageId = fileId;\n } else {\n throw new KMsgError(\n KMsgErrorCode.PROVIDER_ERROR,\n \"Failed to upload friendtalk image\",\n {\n providerId,\n },\n );\n }\n }\n\n base.text = text;\n base.kakaoOptions = {\n pfId,\n variables: stringifyVariables(friendTalkOptions.variables),\n disableSms: friendTalkOptions.kakao?.disableSms,\n adFlag: friendTalkOptions.kakao?.adFlag,\n buttons,\n imageId,\n };\n\n return base as unknown as SolapiSendOneMessage;\n }\n\n if (type === \"NSA\") {\n const nsaOptions = options as Extract<SendOptions, { type: \"NSA\" }>;\n const talkId =\n typeof nsaOptions.naver?.talkId === \"string\" &&\n nsaOptions.naver.talkId.length > 0\n ? nsaOptions.naver.talkId\n : config.naverTalkId;\n\n if (!talkId || talkId.length === 0) {\n throw new KMsgError(\n KMsgErrorCode.INVALID_REQUEST,\n \"naver talkId is required (options.naver.talkId or config.naverTalkId)\",\n { providerId },\n );\n }\n\n const templateId =\n typeof nsaOptions.naver?.templateId === \"string\" &&\n nsaOptions.naver.templateId.length > 0\n ? nsaOptions.naver.templateId\n : nsaOptions.templateId;\n\n const variables = {\n ...stringifyVariables(nsaOptions.variables),\n ...stringifyVariables(nsaOptions.naver?.variables),\n };\n\n base.naverOptions = {\n talkId,\n templateId,\n variables,\n disableSms: nsaOptions.naver?.disableSms,\n buttons: Array.isArray(nsaOptions.naver?.buttons)\n ? nsaOptions.naver.buttons\n : undefined,\n };\n\n return base as unknown as SolapiSendOneMessage;\n }\n\n if (type === \"VOICE\") {\n const voiceMessageOptions = options as Extract<\n SendOptions,\n { type: \"VOICE\" }\n >;\n const text = voiceMessageOptions.text;\n if (text.length === 0) {\n throw new KMsgError(\n KMsgErrorCode.INVALID_REQUEST,\n \"text is required for VOICE\",\n {\n providerId,\n },\n );\n }\n\n const voiceTypeRaw = voiceMessageOptions.voice?.voiceType;\n const voiceType =\n voiceTypeRaw === \"FEMALE\" || voiceTypeRaw === \"MALE\"\n ? voiceTypeRaw\n : \"FEMALE\";\n\n base.text = text;\n base.voiceOptions = voiceMessageOptions.voice\n ? { ...voiceMessageOptions.voice, voiceType }\n : { voiceType };\n\n return base as unknown as SolapiSendOneMessage;\n }\n\n if (type === \"FAX\") {\n const faxOptions = options as Extract<SendOptions, { type: \"FAX\" }>;\n const fax = faxOptions.fax;\n const fileIdsFromOptions = Array.isArray(fax?.fileIds)\n ? fax.fileIds.filter(\n (value: unknown): value is string =>\n typeof value === \"string\" && value.length > 0,\n )\n : [];\n\n let fileIds = fileIdsFromOptions;\n\n if (fileIds.length === 0) {\n const fileUrls = Array.isArray(fax?.fileUrls)\n ? fax.fileUrls.filter(\n (value: unknown): value is string =>\n typeof value === \"string\" && value.length > 0,\n )\n : [];\n\n if (fileUrls.length === 0) {\n throw new KMsgError(\n KMsgErrorCode.INVALID_REQUEST,\n \"fax.fileIds or fax.fileUrls is required\",\n {\n providerId,\n },\n );\n }\n\n fileIds = [];\n for (const url of fileUrls) {\n const upload = await client.uploadFile(url, \"FAX\");\n const fileId = extractFileId(upload);\n if (typeof fileId === \"string\" && fileId.length > 0) {\n fileIds.push(fileId);\n }\n }\n }\n\n if (fileIds.length === 0) {\n throw new KMsgError(\n KMsgErrorCode.PROVIDER_ERROR,\n \"Failed to resolve fax fileIds\",\n {\n providerId,\n },\n );\n }\n\n base.faxOptions = { fileIds };\n return base as unknown as SolapiSendOneMessage;\n }\n\n const rcsOptions = options as Extract<\n SendOptions,\n {\n type:\n | \"RCS_SMS\"\n | \"RCS_LMS\"\n | \"RCS_MMS\"\n | \"RCS_TPL\"\n | \"RCS_ITPL\"\n | \"RCS_LTPL\";\n }\n >;\n const rcs = rcsOptions.rcs;\n\n const brandId =\n typeof rcs?.brandId === \"string\" && rcs.brandId.length > 0\n ? rcs.brandId\n : config.rcsBrandId;\n\n if (!brandId || brandId.length === 0) {\n throw new KMsgError(\n KMsgErrorCode.INVALID_REQUEST,\n \"rcs brandId is required (options.rcs.brandId or config.rcsBrandId)\",\n { providerId },\n );\n }\n\n const rcsPayload: Record<string, unknown> = {\n brandId,\n buttons: Array.isArray(rcs?.buttons) ? rcs.buttons : undefined,\n copyAllowed: rcs?.copyAllowed,\n mmsType: rcs?.mmsType,\n commercialType: rcs?.commercialType,\n disableSms: rcs?.disableSms,\n variables: {\n ...stringifyVariables(rcsOptions.variables),\n ...stringifyVariables(rcs?.variables),\n },\n };\n\n if (type === \"RCS_TPL\" || type === \"RCS_ITPL\" || type === \"RCS_LTPL\") {\n const templateOptions = options as Extract<\n SendOptions,\n { type: \"RCS_TPL\" | \"RCS_ITPL\" | \"RCS_LTPL\" }\n >;\n rcsPayload.templateId =\n typeof templateOptions.rcs?.templateId === \"string\" &&\n templateOptions.rcs.templateId.length > 0\n ? templateOptions.rcs.templateId\n : templateOptions.templateId;\n }\n\n let text: string | undefined;\n let subject: string | undefined;\n if (type === \"RCS_SMS\" || type === \"RCS_LMS\" || type === \"RCS_MMS\") {\n const textOptions = options as Extract<\n SendOptions,\n { type: \"RCS_SMS\" | \"RCS_LMS\" | \"RCS_MMS\" }\n >;\n text = textOptions.text;\n subject = textOptions.subject;\n\n if (!text || text.length === 0) {\n throw new KMsgError(\n KMsgErrorCode.INVALID_REQUEST,\n \"text is required for RCS text types\",\n { providerId },\n );\n }\n base.text = text;\n if (subject) base.subject = subject;\n }\n\n const additionalBodyRaw = rcs?.additionalBody;\n const additionalBody = isObjectRecord(additionalBodyRaw)\n ? additionalBodyRaw\n : undefined;\n const additionalBodyImageId =\n additionalBody &&\n typeof additionalBody.imageId === \"string\" &&\n additionalBody.imageId.length > 0\n ? additionalBody.imageId\n : additionalBody &&\n typeof additionalBody.imaggeId === \"string\" &&\n additionalBody.imaggeId.length > 0\n ? additionalBody.imaggeId\n : undefined;\n\n const buildAdditionalBody = (uploadedImageId?: string) => {\n const record = additionalBody ? { ...additionalBody } : {};\n const title =\n typeof record.title === \"string\" && record.title.length > 0\n ? record.title\n : subject || \"RCS\";\n const description =\n typeof record.description === \"string\" && record.description.length > 0\n ? record.description\n : text || \"\";\n const imaggeId = additionalBodyImageId ?? uploadedImageId;\n\n const normalized: Record<string, unknown> = {\n ...record,\n title,\n description,\n };\n\n if (typeof imaggeId === \"string\" && imaggeId.length > 0) {\n normalized.imaggeId = imaggeId;\n }\n\n return normalized;\n };\n\n if (type === \"RCS_MMS\") {\n const rcsTextOptions = options as Extract<\n SendOptions,\n { type: \"RCS_SMS\" | \"RCS_LMS\" | \"RCS_MMS\" }\n >;\n\n const imageRef = resolveImageRef({\n imageUrl: rcsTextOptions.imageUrl,\n media: rcsTextOptions.media,\n providerId,\n });\n if (imageRef) {\n const upload = await client.uploadFile(imageRef, \"RCS\");\n const fileId = extractFileId(upload);\n if (typeof fileId === \"string\" && fileId.length > 0) {\n rcsPayload.additionalBody = buildAdditionalBody(fileId);\n } else if (additionalBody) {\n rcsPayload.additionalBody = buildAdditionalBody(undefined);\n }\n } else if (additionalBody) {\n rcsPayload.additionalBody = buildAdditionalBody(undefined);\n }\n } else if (additionalBody) {\n rcsPayload.additionalBody = buildAdditionalBody(undefined);\n }\n\n base.rcsOptions = rcsPayload;\n return base as unknown as SolapiSendOneMessage;\n}\n\nexport async function sendWithSolapi(params: {\n providerId: string;\n client: SolapiSdkClient;\n config: SolapiConfig;\n options: SendOptions;\n}): Promise<Result<SendResult, KMsgError>> {\n const { providerId, client, config, options } = params;\n\n const warnings = collectSolapiSendWarnings(options, providerId);\n const message = await buildSolapiSendOneMessage({\n options,\n providerId,\n config,\n client,\n });\n const response = await client.sendOne(message, config.appId);\n\n return ok(\n adaptSolapiSendResult({\n options,\n response,\n providerId,\n warnings,\n }),\n );\n}\n"
|
|
15
15
|
],
|
|
16
16
|
"mappings": "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",
|
|
17
|
-
"debugId": "
|
|
17
|
+
"debugId": "57EEFC08A1C7A95164756E2164756E21",
|
|
18
18
|
"names": []
|
|
19
19
|
}
|
package/dist/solapi/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var oe=Object.defineProperty;var ke=(e,t)=>{for(var i in t)oe(e,i,{get:t[i],enumerable:!0,configurable:!0,set:(r)=>t[i]=()=>r})};var V=(e)=>{if(typeof e!=="number"||Number.isNaN(e)||!Number.isFinite(e))return;return Math.trunc(e)};class a extends Error{code;details;providerErrorCode;providerErrorText;httpStatus;requestId;retryAfterMs;attempt;causeChain;constructor(e,t,i,r={}){super(t);if(this.name="KMsgError",this.code=e,this.details=i,this.providerErrorCode=r.providerErrorCode,this.providerErrorText=r.providerErrorText,this.httpStatus=V(r.httpStatus),this.requestId=typeof r.requestId==="string"?r.requestId:void 0,this.retryAfterMs=V(r.retryAfterMs),this.attempt=V(r.attempt),Array.isArray(r.causeChain))this.causeChain=r.causeChain;else if(r.causeChain!==void 0)this.causeChain=[r.causeChain];if(Error.captureStackTrace)Error.captureStackTrace(this,a)}toJSON(){return{name:this.name,code:this.code,message:this.message,details:this.details,providerErrorCode:this.providerErrorCode,providerErrorText:this.providerErrorText,httpStatus:this.httpStatus,requestId:this.requestId,retryAfterMs:this.retryAfterMs,attempt:this.attempt,causeChain:this.causeChain}}}var C=(e)=>({isSuccess:!0,isFailure:!1,value:e}),M=(e)=>({isSuccess:!1,isFailure:!0,error:e});function ae(){let e=globalThis;return e.__K_MSG_ENV__??e.__ENV__??e.process?.env??{}}function k(e){let t=ae()[e];if(typeof t==="string")return t;if(t===void 0)return;return String(t)}import{SolapiMessageService as he}from"solapi";var H={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 G(e){return H[e]}function ut(){return Object.values(H)}function m(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}import{ApiKeyError as pe,BadRequestError as de,ClientError as le,DefaultError as ce,NetworkError as fe,ServerError as ue}from"solapi";function R(e,t){if(e instanceof a)return e;let i=m(e)?e:{};if(e instanceof pe)return new a("AUTHENTICATION_FAILED",e.message,{providerId:t});if(e instanceof de)return new a("INVALID_REQUEST",e.message,{providerId:t,validationErrors:i.validationErrors});if(e instanceof fe)return new a("NETWORK_ERROR",e.message,{providerId:t,url:typeof i.url==="string"?i.url:void 0,method:typeof i.method==="string"?i.method:void 0,isRetryable:typeof i.isRetryable==="boolean"?i.isRetryable:!0});if(e instanceof le){let r=typeof i.httpStatus==="number"?i.httpStatus:void 0,l=typeof r==="number"&&r>=400&&r<500;return new a(l?"INVALID_REQUEST":"PROVIDER_ERROR",e.message,{providerId:t,httpStatus:r,errorCode:i.errorCode,errorMessage:i.errorMessage,url:i.url})}if(e instanceof ue)return new a("PROVIDER_ERROR",e.message,{providerId:t,httpStatus:typeof i.httpStatus==="number"?i.httpStatus:void 0});if(e instanceof ce)return new a("PROVIDER_ERROR",e.message,{providerId:t,errorCode:i.errorCode,errorMessage:i.errorMessage});return new a("UNKNOWN_ERROR",e instanceof Error?e.message:String(e),{providerId:t})}function J(e){if(!e)return"UNKNOWN";if(e==="2000")return"PENDING";if(e==="3000")return"SENT";if(e==="4000")return"DELIVERED";if(/^[123]\\d{3}$/.test(e))return"FAILED";return"UNKNOWN"}function j(e){if(typeof e!=="string"||e.trim().length===0)return;let t=new Date(e);if(Number.isNaN(t.getTime()))return;return t}function U(e){let t=e.trim();if(t.startsWith("+"))return`+${t.slice(1).replace(/\\D/g,"")}`;return t.replace(/\\D/g,"")}function O(e){let t={};if(!e)return t;for(let[i,r]of Object.entries(e)){if(r===void 0)continue;t[i]=r===null?"":r instanceof Date?r.toISOString():typeof r==="string"?r:String(r)}return t}function Y(e){if(!Array.isArray(e)||e.length===0)return;let t=[];for(let i of e){if(!i)continue;if(i.type!=="WL")continue;if(!i.name||!i.urlMobile)continue;t.push({buttonName:i.name,buttonType:"WL",linkMo:i.urlMobile,linkPc:i.urlPc})}return t.length>0?t:void 0}function L(e){let t=typeof e.imageUrl==="string"&&e.imageUrl.trim().length>0?e.imageUrl.trim():void 0;if(t)return t;let i=e.media?.image;if(!i)return;if("ref"in i){let r=i.ref.trim();return r.length>0?r:void 0}throw new a("INVALID_REQUEST","SOLAPI image upload requires `options.imageUrl` or `options.media.image.ref` (url/path).",{providerId:e.providerId})}function _(e){return m(e)&&typeof e.fileId==="string"?e.fileId:void 0}function X(e){switch(e.type){case"ALIMTALK":return"ATA";case"FRIENDTALK":return typeof e.imageUrl==="string"&&e.imageUrl.trim().length>0||Boolean(e.media?.image)?"CTI":"CTA";default:return e.type}}async function Z(e){let{providerId:t,client:i,query:r}=e,l=r.providerMessageId.trim();if(!l)return M(new a("INVALID_REQUEST","providerMessageId is required",{providerId:t}));try{let o=await i.getMessages({messageId:l,limit:1}),h=(m(o)?o:{}).messageList;if(!h||typeof h!=="object"||Array.isArray(h))return C(null);let p=h,E=p[l],B=Object.values(p).find((w)=>{if(!m(w))return!1;let T=w.messageId;return typeof T==="string"?T===l:!1}),I=m(E)?E:m(B)?B:void 0;if(!I)return C(null);let y=typeof I.statusCode==="string"?I.statusCode:void 0,P=J(y),b=j(I.dateSent),A=j(I.dateCompleted);return C({providerId:t,providerMessageId:l,status:P,statusCode:y,statusMessage:typeof I.statusMessage==="string"?I.statusMessage:void 0,sentAt:b,deliveredAt:A,raw:I})}catch(o){return M(R(o,t))}}function ye(e,t){if(e.type!=="ALIMTALK")return;if(e.failover?.enabled!==!0)return;return[{code:"FAILOVER_PARTIAL_PROVIDER",message:"SOLAPI failover mapping is partial. API-level fallback may be attempted for non-Kakao-user failures.",details:{providerId:t,mappedFields:["kakao.disableSms","text","subject"],unsupportedFields:["fallbackChannel"]}}]}function ge(e){let{options:t,response:i,providerId:r,warnings:l}=e,o=m(i)?i:{},S=typeof o.messageId==="string"?o.messageId:void 0;return{messageId:t.messageId||crypto.randomUUID(),providerId:r,providerMessageId:S,status:"SENT",type:t.type,to:t.to,...Array.isArray(l)&&l.length>0?{warnings:l}:{},raw:i}}async function me(e){let{options:t,providerId:i,config:r,client:l}=e,o=X(t),S=t.options?.scheduledAt,h=typeof t.from==="string"&&t.from.length>0?t.from:r.defaultFrom,p={to:U(t.to),type:o},E=typeof t.options?.country==="string"&&t.options.country.length>0?t.options.country:typeof r.defaultCountry==="string"?r.defaultCountry:void 0;if(E)p.country=E;let D=t.options?.customFields;if(D&&typeof D==="object"){let n={};for(let[s,d]of Object.entries(D)){if(d===void 0)continue;n[s]=typeof d==="string"?d:String(d)}if(Object.keys(n).length>0)p.customFields=n}if(S)p.scheduledDate=S;if(o==="SMS"||o==="LMS"||o==="MMS"||o==="VOICE"||o==="FAX"||String(o).startsWith("RCS_")){if(!h||h.length===0)throw new a("INVALID_REQUEST","from is required (options.from or config.defaultFrom)",{providerId:i,type:t.type});p.from=U(h)}else if(h)p.from=U(h);if(o==="SMS"||o==="LMS"||o==="MMS"){let n=t,s=n.text;if(s.length===0)throw new a("INVALID_REQUEST","text is required for SMS/LMS/MMS",{providerId:i,type:t.type});p.text=s;let d=n.subject;if(d)p.subject=d;if(o==="MMS"){let c=L({imageUrl:n.imageUrl,media:n.media,providerId:i});if(!c)throw new a("INVALID_REQUEST","image is required for MMS (options.imageUrl or options.media.image.ref)",{providerId:i});let f=await l.uploadFile(c,"MMS"),u=_(f);if(typeof u==="string"&&u.length>0)p.imageId=u;else throw new a("PROVIDER_ERROR","Failed to upload MMS image",{providerId:i})}return p}if(o==="ATA"){let n=t,s=n.failover,d=typeof n.kakao?.profileId==="string"&&n.kakao.profileId.length>0?n.kakao.profileId:r.kakaoPfId;if(!d||d.length===0)throw new a("INVALID_REQUEST","kakao profileId is required (options.kakao.profileId or config.kakaoPfId)",{providerId:i});let c=typeof s?.fallbackContent==="string"&&s.fallbackContent.trim().length>0?s.fallbackContent.trim():void 0,f=typeof s?.fallbackTitle==="string"&&s.fallbackTitle.trim().length>0?s.fallbackTitle.trim():void 0,u=s?.enabled===!0?!1:s?.enabled===!1?!0:n.kakao?.disableSms;if(c)p.text=c;if(f)p.subject=f;return p.kakaoOptions={pfId:d,templateId:n.templateId,variables:O(n.variables),disableSms:u,adFlag:n.kakao?.adFlag,buttons:Array.isArray(n.kakao?.buttons)?n.kakao.buttons:void 0,imageId:n.kakao?.imageId},p}if(o==="CTA"||o==="CTI"){let n=t,s=n.text;if(s.length===0)throw new a("INVALID_REQUEST","text is required for FRIENDTALK",{providerId:i});let d=typeof n.kakao?.profileId==="string"&&n.kakao.profileId.length>0?n.kakao.profileId:r.kakaoPfId;if(!d||d.length===0)throw new a("INVALID_REQUEST","kakao profileId is required (options.kakao.profileId or config.kakaoPfId)",{providerId:i});let c=Y(n.buttons),f=Array.isArray(n.kakao?.buttons)?n.kakao.buttons:c,u=typeof n.kakao?.imageLink==="string"&&n.kakao.imageLink.length>0?n.kakao.imageLink:void 0,x=Array.isArray(f)&&f.length>0?f[0]:void 0,v=m(x)&&typeof x.linkMo==="string"?x.linkMo:void 0,Q=u??v,W;if(o==="CTI"){let $=L({imageUrl:n.imageUrl,media:n.media,providerId:i});if(!$)throw new a("INVALID_REQUEST","image is required for CTI (friendtalk image) (options.imageUrl or options.media.image.ref)",{providerId:i});if(!Q)throw new a("INVALID_REQUEST","imageLink is required for friendtalk image upload (options.kakao.imageLink or WL button)",{providerId:i});let re=await l.uploadFile($,"KAKAO",void 0,Q),q=_(re);if(typeof q==="string"&&q.length>0)W=q;else throw new a("PROVIDER_ERROR","Failed to upload friendtalk image",{providerId:i})}return p.text=s,p.kakaoOptions={pfId:d,variables:O(n.variables),disableSms:n.kakao?.disableSms,adFlag:n.kakao?.adFlag,buttons:f,imageId:W},p}if(o==="NSA"){let n=t,s=typeof n.naver?.talkId==="string"&&n.naver.talkId.length>0?n.naver.talkId:r.naverTalkId;if(!s||s.length===0)throw new a("INVALID_REQUEST","naver talkId is required (options.naver.talkId or config.naverTalkId)",{providerId:i});let d=typeof n.naver?.templateId==="string"&&n.naver.templateId.length>0?n.naver.templateId:n.templateId,c={...O(n.variables),...O(n.naver?.variables)};return p.naverOptions={talkId:s,templateId:d,variables:c,disableSms:n.naver?.disableSms,buttons:Array.isArray(n.naver?.buttons)?n.naver.buttons:void 0},p}if(o==="VOICE"){let n=t,s=n.text;if(s.length===0)throw new a("INVALID_REQUEST","text is required for VOICE",{providerId:i});let d=n.voice?.voiceType,c=d==="FEMALE"||d==="MALE"?d:"FEMALE";return p.text=s,p.voiceOptions=n.voice?{...n.voice,voiceType:c}:{voiceType:c},p}if(o==="FAX"){let s=t.fax,c=Array.isArray(s?.fileIds)?s.fileIds.filter((f)=>typeof f==="string"&&f.length>0):[];if(c.length===0){let f=Array.isArray(s?.fileUrls)?s.fileUrls.filter((u)=>typeof u==="string"&&u.length>0):[];if(f.length===0)throw new a("INVALID_REQUEST","fax.fileIds or fax.fileUrls is required",{providerId:i});c=[];for(let u of f){let x=await l.uploadFile(u,"FAX"),v=_(x);if(typeof v==="string"&&v.length>0)c.push(v)}}if(c.length===0)throw new a("PROVIDER_ERROR","Failed to resolve fax fileIds",{providerId:i});return p.faxOptions={fileIds:c},p}let I=t,y=I.rcs,P=typeof y?.brandId==="string"&&y.brandId.length>0?y.brandId:r.rcsBrandId;if(!P||P.length===0)throw new a("INVALID_REQUEST","rcs brandId is required (options.rcs.brandId or config.rcsBrandId)",{providerId:i});let b={brandId:P,buttons:Array.isArray(y?.buttons)?y.buttons:void 0,copyAllowed:y?.copyAllowed,mmsType:y?.mmsType,commercialType:y?.commercialType,disableSms:y?.disableSms,variables:{...O(I.variables),...O(y?.variables)}};if(o==="RCS_TPL"||o==="RCS_ITPL"||o==="RCS_LTPL"){let n=t;b.templateId=typeof n.rcs?.templateId==="string"&&n.rcs.templateId.length>0?n.rcs.templateId:n.templateId}let A,w;if(o==="RCS_SMS"||o==="RCS_LMS"||o==="RCS_MMS"){let n=t;if(A=n.text,w=n.subject,!A||A.length===0)throw new a("INVALID_REQUEST","text is required for RCS text types",{providerId:i});if(p.text=A,w)p.subject=w}let T=y?.additionalBody,g=m(T)?T:void 0,ne=g&&typeof g.imageId==="string"&&g.imageId.length>0?g.imageId:g&&typeof g.imaggeId==="string"&&g.imaggeId.length>0?g.imaggeId:void 0,N=(n)=>{let s=g?{...g}:{},d=typeof s.title==="string"&&s.title.length>0?s.title:w||"RCS",c=typeof s.description==="string"&&s.description.length>0?s.description:A||"",f=ne??n,u={...s,title:d,description:c};if(typeof f==="string"&&f.length>0)u.imaggeId=f;return u};if(o==="RCS_MMS"){let n=t,s=L({imageUrl:n.imageUrl,media:n.media,providerId:i});if(s){let d=await l.uploadFile(s,"RCS"),c=_(d);if(typeof c==="string"&&c.length>0)b.additionalBody=N(c);else if(g)b.additionalBody=N(void 0)}else if(g)b.additionalBody=N(void 0)}else if(g)b.additionalBody=N(void 0);return p.rcsOptions=b,p}async function z(e){let{providerId:t,client:i,config:r,options:l}=e,o=ye(l,t),S=await me({options:l,providerId:t,config:r,client:i}),h=await i.sendOne(S,r.appId);return C(ge({options:l,response:h,providerId:t,warnings:o}))}class K{id="solapi";name="SOLAPI Messaging Provider";supportedTypes=["ALIMTALK","FRIENDTALK","SMS","LMS","MMS","NSA","VOICE","FAX","RCS_SMS","RCS_LMS","RCS_MMS","RCS_TPL","RCS_ITPL","RCS_LTPL"];config;client;getOnboardingSpec(){let e=G(this.id);if(!e)throw Error(`Onboarding spec missing for provider: ${this.id}`);return e}constructor(e,t){if(!e||typeof e!=="object")throw Error("SolapiProvider requires a config object");if(!e.apiKey||e.apiKey.length===0)throw Error("SolapiProvider requires `apiKey`");if(!e.apiSecret||e.apiSecret.length===0)throw Error("SolapiProvider requires `apiSecret`");this.config={...e,baseUrl:typeof e.baseUrl==="string"&&e.baseUrl.length>0?e.baseUrl:"https://api.solapi.com"},this.client=t??new he(this.config.apiKey,this.config.apiSecret)}async healthCheck(){let e=[],t=Date.now();try{if(!this.config.apiKey)e.push("Missing apiKey");if(!this.config.apiSecret)e.push("Missing apiSecret");if(this.config.baseUrl)try{new URL(this.config.baseUrl)}catch{e.push("Invalid baseUrl")}return{healthy:e.length===0,issues:e,latencyMs:Date.now()-t,data:{provider:this.id,baseUrl:this.config.baseUrl}}}catch(i){return e.push(i instanceof Error?i.message:String(i)),{healthy:!1,issues:e,latencyMs:Date.now()-t}}}async send(e){let t=e.messageId||crypto.randomUUID(),i={...e,messageId:t};try{return await z({providerId:this.id,client:this.client,config:this.config,options:i})}catch(r){return M(R(r,this.id))}}async getDeliveryStatus(e){return Z({providerId:this.id,client:this.client,query:e})}async getBalance(e){try{let t=await this.client.getBalance(),i=t,r=[i.balance,i.point],l=Number.NaN;for(let o of r){if(typeof o==="number"&&Number.isFinite(o)){l=o;break}if(typeof o==="string"){let S=Number(o);if(Number.isFinite(S)){l=S;break}}}if(!Number.isFinite(l))return M(R(Error("Invalid balance response from SOLAPI"),this.id));return C({providerId:this.id,channel:e?.channel,amount:l,currency:"KRW",raw:t})}catch(t){return M(R(t,this.id))}}}var ee=(e)=>new K(e),te=()=>{let e={apiKey:k("SOLAPI_API_KEY")||"",apiSecret:k("SOLAPI_API_SECRET")||"",baseUrl:k("SOLAPI_BASE_URL")||"https://api.solapi.com",defaultFrom:k("SOLAPI_DEFAULT_FROM"),kakaoPfId:k("SOLAPI_KAKAO_PF_ID"),rcsBrandId:k("SOLAPI_RCS_BRAND_ID"),naverTalkId:k("SOLAPI_NAVER_TALK_ID"),appId:k("SOLAPI_APP_ID"),defaultCountry:k("SOLAPI_DEFAULT_COUNTRY"),debug:k("NODE_ENV")==="development"};if(!e.apiKey||!e.apiSecret)throw Error("SOLAPI_API_KEY and SOLAPI_API_SECRET environment variables are required");return ee(e)};class ie{static create(e){return new K(e)}static createDefault(){return te()}}function Ie(){}export{Ie as initializeSolapi,ee as createSolapiProvider,te as createDefaultSolapiProvider,ie as SolapiProviderFactory,K as SolapiProvider};
|
|
1
|
+
var se=Object.defineProperty;var be=(e,t)=>{for(var n in t)se(e,n,{get:t[n],enumerable:!0,configurable:!0,set:(r)=>t[n]=()=>r})};var V=(e)=>{if(typeof e!=="number"||Number.isNaN(e)||!Number.isFinite(e))return;return Math.trunc(e)};class a extends Error{code;details;providerErrorCode;providerErrorText;httpStatus;requestId;retryAfterMs;attempt;causeChain;constructor(e,t,n,r={}){super(t);if(this.name="KMsgError",this.code=e,this.details=n,this.providerErrorCode=r.providerErrorCode,this.providerErrorText=r.providerErrorText,this.httpStatus=V(r.httpStatus),this.requestId=typeof r.requestId==="string"?r.requestId:void 0,this.retryAfterMs=V(r.retryAfterMs),this.attempt=V(r.attempt),Array.isArray(r.causeChain))this.causeChain=r.causeChain;else if(r.causeChain!==void 0)this.causeChain=[r.causeChain];if(Error.captureStackTrace)Error.captureStackTrace(this,a)}toJSON(){return{name:this.name,code:this.code,message:this.message,details:this.details,providerErrorCode:this.providerErrorCode,providerErrorText:this.providerErrorText,httpStatus:this.httpStatus,requestId:this.requestId,retryAfterMs:this.retryAfterMs,attempt:this.attempt,causeChain:this.causeChain}}}var C=(e)=>({isSuccess:!0,isFailure:!1,value:e}),R=(e)=>({isSuccess:!1,isFailure:!0,error:e});function pe(){let e=globalThis;return e.__K_MSG_ENV__??e.__ENV__??e.process?.env??{}}function k(e){let t=pe()[e];if(typeof t==="string")return t;if(t===void 0)return;return String(t)}import{SolapiMessageService as Se}from"solapi";var H={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 G(e){return H[e]}function Et(){return Object.values(H)}function m(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}import{ApiKeyError as de,BadRequestError as le,ClientError as ce,DefaultError as fe,NetworkError as ye,ServerError as ue}from"solapi";function M(e,t){if(e instanceof a)return e;let n=m(e)?e:{};if(e instanceof de)return new a("AUTHENTICATION_FAILED",e.message,{providerId:t});if(e instanceof le)return new a("INVALID_REQUEST",e.message,{providerId:t,validationErrors:n.validationErrors});if(e instanceof ye)return new a("NETWORK_ERROR",e.message,{providerId:t,url:typeof n.url==="string"?n.url:void 0,method:typeof n.method==="string"?n.method:void 0,isRetryable:typeof n.isRetryable==="boolean"?n.isRetryable:!0});if(e instanceof ce){let r=typeof n.httpStatus==="number"?n.httpStatus:void 0,l=typeof r==="number"&&r>=400&&r<500;return new a(l?"INVALID_REQUEST":"PROVIDER_ERROR",e.message,{providerId:t,httpStatus:r,errorCode:n.errorCode,errorMessage:n.errorMessage,url:n.url})}if(e instanceof ue)return new a("PROVIDER_ERROR",e.message,{providerId:t,httpStatus:typeof n.httpStatus==="number"?n.httpStatus:void 0});if(e instanceof fe)return new a("PROVIDER_ERROR",e.message,{providerId:t,errorCode:n.errorCode,errorMessage:n.errorMessage});return new a("UNKNOWN_ERROR",e instanceof Error?e.message:String(e),{providerId:t})}function J(e){if(!e)return"UNKNOWN";if(e==="2000")return"PENDING";if(e==="3000")return"SENT";if(e==="4000")return"DELIVERED";if(/^[123]\\d{3}$/.test(e))return"FAILED";return"UNKNOWN"}function j(e){if(typeof e!=="string"||e.trim().length===0)return;let t=new Date(e);if(Number.isNaN(t.getTime()))return;return t}function N(e){let t=e.trim();if(t.startsWith("+"))return`+${t.slice(1).replace(/\\D/g,"")}`;return t.replace(/\\D/g,"")}function w(e){let t={};if(!e)return t;for(let[n,r]of Object.entries(e)){if(r===void 0)continue;t[n]=r===null?"":r instanceof Date?r.toISOString():typeof r==="string"?r:String(r)}return t}function Y(e){if(!Array.isArray(e)||e.length===0)return;let t=[];for(let n of e){if(!n)continue;if(n.type!=="WL")continue;if(!n.name||!n.urlMobile)continue;t.push({buttonName:n.name,buttonType:"WL",linkMo:n.urlMobile,linkPc:n.urlPc})}return t.length>0?t:void 0}function U(e){let t=typeof e.imageUrl==="string"&&e.imageUrl.trim().length>0?e.imageUrl.trim():void 0;if(t)return t;let n=e.media?.image;if(!n)return;if("ref"in n){let r=n.ref.trim();return r.length>0?r:void 0}throw new a("INVALID_REQUEST","SOLAPI image upload requires `options.imageUrl` or `options.media.image.ref` (url/path).",{providerId:e.providerId})}function x(e){return m(e)&&typeof e.fileId==="string"?e.fileId:void 0}function X(e){switch(e.type){case"ALIMTALK":return"ATA";case"FRIENDTALK":return typeof e.imageUrl==="string"&&e.imageUrl.trim().length>0||Boolean(e.media?.image)?"CTI":"CTA";default:return e.type}}async function Z(e){let{providerId:t,client:n,query:r}=e,l=r.providerMessageId.trim();if(!l)return R(new a("INVALID_REQUEST","providerMessageId is required",{providerId:t}));try{let s=await n.getMessages({messageId:l,limit:1}),h=(m(s)?s:{}).messageList;if(!h||typeof h!=="object"||Array.isArray(h))return C(null);let p=h,O=p[l],B=Object.values(p).find((v)=>{if(!m(v))return!1;let E=v.messageId;return typeof E==="string"?E===l:!1}),S=m(O)?O:m(B)?B:void 0;if(!S)return C(null);let u=typeof S.statusCode==="string"?S.statusCode:void 0,F=J(u),I=j(S.dateSent),A=j(S.dateCompleted);return C({providerId:t,providerMessageId:l,status:F,statusCode:u,statusMessage:typeof S.statusMessage==="string"?S.statusMessage:void 0,sentAt:I,deliveredAt:A,raw:S})}catch(s){return R(M(s,t))}}function ge(e,t){if(e.type!=="ALIMTALK")return;if(e.failover?.enabled!==!0)return;return[{code:"FAILOVER_PARTIAL_PROVIDER",message:"SOLAPI failover mapping is partial. API-level fallback may be attempted for non-Kakao-user failures.",details:{providerId:t,mappedFields:["kakao.disableSms","text","subject"],unsupportedFields:["fallbackChannel"]}}]}function me(e){let{options:t,response:n,providerId:r,warnings:l}=e,s=m(n)?n:{},b=typeof s.messageId==="string"?s.messageId:void 0;return{messageId:t.messageId||crypto.randomUUID(),providerId:r,providerMessageId:b,status:"SENT",type:t.type,to:t.to,...Array.isArray(l)&&l.length>0?{warnings:l}:{},raw:n}}async function he(e){let{options:t,providerId:n,config:r,client:l}=e,s=X(t),b=t.options?.scheduledAt,h=typeof t.from==="string"&&t.from.length>0?t.from:r.defaultFrom,p={to:N(t.to),type:s},O=typeof t.options?.country==="string"&&t.options.country.length>0?t.options.country:typeof r.defaultCountry==="string"?r.defaultCountry:void 0;if(O)p.country=O;let _=t.options?.customFields;if(_&&typeof _==="object"){let i={};for(let[o,d]of Object.entries(_)){if(d===void 0)continue;i[o]=typeof d==="string"?d:String(d)}if(Object.keys(i).length>0)p.customFields=i}if(b)p.scheduledDate=b;if(s==="SMS"||s==="LMS"||s==="MMS"||s==="VOICE"||s==="FAX"||String(s).startsWith("RCS_")){if(!h||h.length===0)throw new a("INVALID_REQUEST","from is required (options.from or config.defaultFrom)",{providerId:n,type:t.type});p.from=N(h)}else if(h)p.from=N(h);if(s==="SMS"||s==="LMS"||s==="MMS"){let i=t,o=i.text;if(o.length===0)throw new a("INVALID_REQUEST","text is required for SMS/LMS/MMS",{providerId:n,type:t.type});p.text=o;let d=i.subject;if(d)p.subject=d;if(s==="MMS"){let c=U({imageUrl:i.imageUrl,media:i.media,providerId:n});if(!c)throw new a("INVALID_REQUEST","image is required for MMS (options.imageUrl or options.media.image.ref)",{providerId:n});let f=await l.uploadFile(c,"MMS"),y=x(f);if(typeof y==="string"&&y.length>0)p.imageId=y;else throw new a("PROVIDER_ERROR","Failed to upload MMS image",{providerId:n})}return p}if(s==="ATA"){let i=t,o=i.failover,d=typeof i.kakao?.profileId==="string"&&i.kakao.profileId.length>0?i.kakao.profileId:r.kakaoPfId;if(!d||d.length===0)throw new a("INVALID_REQUEST","kakao profileId is required (options.kakao.profileId or config.kakaoPfId)",{providerId:n});let c=typeof o?.fallbackContent==="string"&&o.fallbackContent.trim().length>0?o.fallbackContent.trim():void 0,f=typeof o?.fallbackTitle==="string"&&o.fallbackTitle.trim().length>0?o.fallbackTitle.trim():void 0,y=o?.enabled===!0?!1:o?.enabled===!1?!0:i.kakao?.disableSms;if(c)p.text=c;if(f)p.subject=f;return p.kakaoOptions={pfId:d,templateId:i.templateId,variables:w(i.variables),disableSms:y,adFlag:i.kakao?.adFlag,buttons:Array.isArray(i.kakao?.buttons)?i.kakao.buttons:void 0,imageId:i.kakao?.imageId},p}if(s==="CTA"||s==="CTI"){let i=t,o=i.text;if(o.length===0)throw new a("INVALID_REQUEST","text is required for FRIENDTALK",{providerId:n});let d=typeof i.kakao?.profileId==="string"&&i.kakao.profileId.length>0?i.kakao.profileId:r.kakaoPfId;if(!d||d.length===0)throw new a("INVALID_REQUEST","kakao profileId is required (options.kakao.profileId or config.kakaoPfId)",{providerId:n});let c=Y(i.buttons),f=Array.isArray(i.kakao?.buttons)?i.kakao.buttons:c,y=typeof i.kakao?.imageLink==="string"&&i.kakao.imageLink.length>0?i.kakao.imageLink:void 0,P=Array.isArray(f)&&f.length>0?f[0]:void 0,T=m(P)&&typeof P.linkMo==="string"?P.linkMo:void 0,Q=y??T,W;if(s==="CTI"){let $=U({imageUrl:i.imageUrl,media:i.media,providerId:n});if(!$)throw new a("INVALID_REQUEST","image is required for CTI (friendtalk image) (options.imageUrl or options.media.image.ref)",{providerId:n});if(!Q)throw new a("INVALID_REQUEST","imageLink is required for friendtalk image upload (options.kakao.imageLink or WL button)",{providerId:n});let re=await l.uploadFile($,"KAKAO",void 0,Q),q=x(re);if(typeof q==="string"&&q.length>0)W=q;else throw new a("PROVIDER_ERROR","Failed to upload friendtalk image",{providerId:n})}return p.text=o,p.kakaoOptions={pfId:d,variables:w(i.variables),disableSms:i.kakao?.disableSms,adFlag:i.kakao?.adFlag,buttons:f,imageId:W},p}if(s==="NSA"){let i=t,o=typeof i.naver?.talkId==="string"&&i.naver.talkId.length>0?i.naver.talkId:r.naverTalkId;if(!o||o.length===0)throw new a("INVALID_REQUEST","naver talkId is required (options.naver.talkId or config.naverTalkId)",{providerId:n});let d=typeof i.naver?.templateId==="string"&&i.naver.templateId.length>0?i.naver.templateId:i.templateId,c={...w(i.variables),...w(i.naver?.variables)};return p.naverOptions={talkId:o,templateId:d,variables:c,disableSms:i.naver?.disableSms,buttons:Array.isArray(i.naver?.buttons)?i.naver.buttons:void 0},p}if(s==="VOICE"){let i=t,o=i.text;if(o.length===0)throw new a("INVALID_REQUEST","text is required for VOICE",{providerId:n});let d=i.voice?.voiceType,c=d==="FEMALE"||d==="MALE"?d:"FEMALE";return p.text=o,p.voiceOptions=i.voice?{...i.voice,voiceType:c}:{voiceType:c},p}if(s==="FAX"){let o=t.fax,c=Array.isArray(o?.fileIds)?o.fileIds.filter((f)=>typeof f==="string"&&f.length>0):[];if(c.length===0){let f=Array.isArray(o?.fileUrls)?o.fileUrls.filter((y)=>typeof y==="string"&&y.length>0):[];if(f.length===0)throw new a("INVALID_REQUEST","fax.fileIds or fax.fileUrls is required",{providerId:n});c=[];for(let y of f){let P=await l.uploadFile(y,"FAX"),T=x(P);if(typeof T==="string"&&T.length>0)c.push(T)}}if(c.length===0)throw new a("PROVIDER_ERROR","Failed to resolve fax fileIds",{providerId:n});return p.faxOptions={fileIds:c},p}let S=t,u=S.rcs,F=typeof u?.brandId==="string"&&u.brandId.length>0?u.brandId:r.rcsBrandId;if(!F||F.length===0)throw new a("INVALID_REQUEST","rcs brandId is required (options.rcs.brandId or config.rcsBrandId)",{providerId:n});let I={brandId:F,buttons:Array.isArray(u?.buttons)?u.buttons:void 0,copyAllowed:u?.copyAllowed,mmsType:u?.mmsType,commercialType:u?.commercialType,disableSms:u?.disableSms,variables:{...w(S.variables),...w(u?.variables)}};if(s==="RCS_TPL"||s==="RCS_ITPL"||s==="RCS_LTPL"){let i=t;I.templateId=typeof i.rcs?.templateId==="string"&&i.rcs.templateId.length>0?i.rcs.templateId:i.templateId}let A,v;if(s==="RCS_SMS"||s==="RCS_LMS"||s==="RCS_MMS"){let i=t;if(A=i.text,v=i.subject,!A||A.length===0)throw new a("INVALID_REQUEST","text is required for RCS text types",{providerId:n});if(p.text=A,v)p.subject=v}let E=u?.additionalBody,g=m(E)?E:void 0,ie=g&&typeof g.imageId==="string"&&g.imageId.length>0?g.imageId:g&&typeof g.imaggeId==="string"&&g.imaggeId.length>0?g.imaggeId:void 0,D=(i)=>{let o=g?{...g}:{},d=typeof o.title==="string"&&o.title.length>0?o.title:v||"RCS",c=typeof o.description==="string"&&o.description.length>0?o.description:A||"",f=ie??i,y={...o,title:d,description:c};if(typeof f==="string"&&f.length>0)y.imaggeId=f;return y};if(s==="RCS_MMS"){let i=t,o=U({imageUrl:i.imageUrl,media:i.media,providerId:n});if(o){let d=await l.uploadFile(o,"RCS"),c=x(d);if(typeof c==="string"&&c.length>0)I.additionalBody=D(c);else if(g)I.additionalBody=D(void 0)}else if(g)I.additionalBody=D(void 0)}else if(g)I.additionalBody=D(void 0);return p.rcsOptions=I,p}async function z(e){let{providerId:t,client:n,config:r,options:l}=e,s=ge(l,t),b=await he({options:l,providerId:t,config:r,client:n}),h=await n.sendOne(b,r.appId);return C(me({options:l,response:h,providerId:t,warnings:s}))}class L{id="solapi";name="SOLAPI Messaging Provider";supportedTypes=["ALIMTALK","FRIENDTALK","SMS","LMS","MMS","NSA","VOICE","FAX","RCS_SMS","RCS_LMS","RCS_MMS","RCS_TPL","RCS_ITPL","RCS_LTPL"];config;client;getOnboardingSpec(){let e=G(this.id);if(!e)throw Error(`Onboarding spec missing for provider: ${this.id}`);return e}constructor(e,t){if(!e||typeof e!=="object")throw Error("SolapiProvider requires a config object");if(!e.apiKey||e.apiKey.length===0)throw Error("SolapiProvider requires `apiKey`");if(!e.apiSecret||e.apiSecret.length===0)throw Error("SolapiProvider requires `apiSecret`");this.config={...e,baseUrl:typeof e.baseUrl==="string"&&e.baseUrl.length>0?e.baseUrl:"https://api.solapi.com"},this.client=t??new Se(this.config.apiKey,this.config.apiSecret)}async healthCheck(){let e=[],t=Date.now();try{if(!this.config.apiKey)e.push("Missing apiKey");if(!this.config.apiSecret)e.push("Missing apiSecret");if(this.config.baseUrl)try{new URL(this.config.baseUrl)}catch{e.push("Invalid baseUrl")}return{healthy:e.length===0,issues:e,latencyMs:Date.now()-t,data:{provider:this.id,baseUrl:this.config.baseUrl}}}catch(n){return e.push(n instanceof Error?n.message:String(n)),{healthy:!1,issues:e,latencyMs:Date.now()-t}}}async send(e){let t=e.messageId||crypto.randomUUID(),n={...e,messageId:t};try{return await z({providerId:this.id,client:this.client,config:this.config,options:n})}catch(r){return R(M(r,this.id))}}async getDeliveryStatus(e){return Z({providerId:this.id,client:this.client,query:e})}async getBalance(e){try{let t=await this.client.getBalance(),n=t,r=[n.balance,n.point],l=Number.NaN;for(let s of r){if(typeof s==="number"&&Number.isFinite(s)){l=s;break}if(typeof s==="string"){let b=Number(s);if(Number.isFinite(b)){l=b;break}}}if(!Number.isFinite(l))return R(M(Error("Invalid balance response from SOLAPI"),this.id));return C({providerId:this.id,channel:e?.channel,amount:l,currency:"KRW",raw:t})}catch(t){return R(M(t,this.id))}}}var ee=(e)=>new L(e),te=()=>{let e={apiKey:k("SOLAPI_API_KEY")||"",apiSecret:k("SOLAPI_API_SECRET")||"",baseUrl:k("SOLAPI_BASE_URL")||"https://api.solapi.com",defaultFrom:k("SOLAPI_DEFAULT_FROM"),kakaoPfId:k("SOLAPI_KAKAO_PF_ID"),rcsBrandId:k("SOLAPI_RCS_BRAND_ID"),naverTalkId:k("SOLAPI_NAVER_TALK_ID"),appId:k("SOLAPI_APP_ID"),defaultCountry:k("SOLAPI_DEFAULT_COUNTRY"),debug:k("NODE_ENV")==="development"};if(!e.apiKey||!e.apiSecret)throw Error("SOLAPI_API_KEY and SOLAPI_API_SECRET environment variables are required");return ee(e)};class ne{static create(e){return new L(e)}static createDefault(){return te()}}function ke(){}export{ke as initializeSolapi,ee as createSolapiProvider,te as createDefaultSolapiProvider,ne as SolapiProviderFactory,L as SolapiProvider};
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
3
|
+
//# debugId=3A55ECB3034D8BBF64756E2164756E21
|
|
4
4
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -14,6 +14,6 @@
|
|
|
14
14
|
"import {\n KMsgError,\n KMsgErrorCode,\n type MessageType,\n ok,\n type Result,\n type SendOptions,\n type SendResult,\n} from \"@k-msg/core\";\nimport { isObjectRecord } from \"../shared/type-guards\";\nimport {\n extractFileId,\n normalizePhoneNumber,\n resolveImageRef,\n stringifyVariables,\n toKakaoButtons,\n toSolapiMessageType,\n} from \"./solapi.helpers\";\nimport type {\n SolapiSdkClient,\n SolapiSendOneMessage,\n} from \"./solapi.internal.types\";\nimport type { SolapiConfig } from \"./types/solapi\";\n\nexport function collectSolapiSendWarnings(\n options: SendOptions,\n providerId: string,\n): SendResult[\"warnings\"] {\n if (options.type !== \"ALIMTALK\") return undefined;\n if (options.failover?.enabled !== true) return undefined;\n\n return [\n {\n code: \"FAILOVER_PARTIAL_PROVIDER\",\n message:\n \"SOLAPI failover mapping is partial. API-level fallback may be attempted for non-Kakao-user failures.\",\n details: {\n providerId,\n mappedFields: [\"kakao.disableSms\", \"text\", \"subject\"],\n unsupportedFields: [\"fallbackChannel\"],\n },\n },\n ];\n}\n\nexport function adaptSolapiSendResult(params: {\n options: SendOptions;\n response: unknown;\n providerId: string;\n warnings?: SendResult[\"warnings\"];\n}): SendResult {\n const { options, response, providerId, warnings } = params;\n const record = isObjectRecord(response) ? response : {};\n const providerMessageId =\n typeof record.messageId === \"string\" ? record.messageId : undefined;\n\n return {\n messageId: options.messageId || crypto.randomUUID(),\n providerId,\n providerMessageId,\n status: \"SENT\",\n type: options.type,\n to: options.to,\n ...(Array.isArray(warnings) && warnings.length > 0 ? { warnings } : {}),\n raw: response,\n };\n}\n\nexport async function buildSolapiSendOneMessage(params: {\n options: SendOptions;\n providerId: string;\n config: SolapiConfig;\n client: SolapiSdkClient;\n}): Promise<SolapiSendOneMessage> {\n const { options, providerId, config, client } = params;\n\n const type = toSolapiMessageType(options);\n const scheduledAt = options.options?.scheduledAt;\n const senderNumber =\n typeof options.from === \"string\" && options.from.length > 0\n ? options.from\n : config.defaultFrom;\n\n const base: Record<string, unknown> = {\n to: normalizePhoneNumber(options.to),\n type,\n };\n\n const country =\n typeof options.options?.country === \"string\" &&\n options.options.country.length > 0\n ? options.options.country\n : typeof config.defaultCountry === \"string\"\n ? config.defaultCountry\n : undefined;\n if (country) {\n base.country = country;\n }\n\n const customFieldsRaw = options.options?.customFields;\n if (customFieldsRaw && typeof customFieldsRaw === \"object\") {\n const customFields: Record<string, string> = {};\n for (const [key, value] of Object.entries(customFieldsRaw)) {\n if (value === undefined) continue;\n customFields[key] = typeof value === \"string\" ? value : String(value);\n }\n if (Object.keys(customFields).length > 0) {\n base.customFields = customFields;\n }\n }\n\n if (scheduledAt) {\n base.scheduledDate = scheduledAt;\n }\n\n const requiresFrom =\n type === \"SMS\" ||\n type === \"LMS\" ||\n type === \"MMS\" ||\n type === \"VOICE\" ||\n type === \"FAX\" ||\n String(type).startsWith(\"RCS_\");\n\n if (requiresFrom) {\n if (!senderNumber || senderNumber.length === 0) {\n throw new KMsgError(\n KMsgErrorCode.INVALID_REQUEST,\n \"from is required (options.from or config.defaultFrom)\",\n { providerId, type: options.type as MessageType },\n );\n }\n base.from = normalizePhoneNumber(senderNumber);\n } else if (senderNumber) {\n base.from = normalizePhoneNumber(senderNumber);\n }\n\n if (type === \"SMS\" || type === \"LMS\" || type === \"MMS\") {\n const smsOptions = options as Extract<\n SendOptions,\n { type: \"SMS\" | \"LMS\" | \"MMS\" }\n >;\n const text = smsOptions.text;\n if (text.length === 0) {\n throw new KMsgError(\n KMsgErrorCode.INVALID_REQUEST,\n \"text is required for SMS/LMS/MMS\",\n { providerId, type: options.type as MessageType },\n );\n }\n\n base.text = text;\n const subject = smsOptions.subject;\n if (subject) {\n base.subject = subject;\n }\n\n if (type === \"MMS\") {\n const imageRef = resolveImageRef({\n imageUrl: smsOptions.imageUrl,\n media: smsOptions.media,\n providerId,\n });\n if (!imageRef) {\n throw new KMsgError(\n KMsgErrorCode.INVALID_REQUEST,\n \"image is required for MMS (options.imageUrl or options.media.image.ref)\",\n { providerId },\n );\n }\n\n const upload = await client.uploadFile(imageRef, \"MMS\");\n const fileId = extractFileId(upload);\n if (typeof fileId === \"string\" && fileId.length > 0) {\n base.imageId = fileId;\n } else {\n throw new KMsgError(\n KMsgErrorCode.PROVIDER_ERROR,\n \"Failed to upload MMS image\",\n {\n providerId,\n },\n );\n }\n }\n\n return base as unknown as SolapiSendOneMessage;\n }\n\n if (type === \"ATA\") {\n const alimtalkOptions = options as Extract<\n SendOptions,\n { type: \"ALIMTALK\" }\n >;\n const failover = alimtalkOptions.failover;\n const pfId =\n typeof alimtalkOptions.kakao?.profileId === \"string\" &&\n alimtalkOptions.kakao.profileId.length > 0\n ? alimtalkOptions.kakao.profileId\n : config.kakaoPfId;\n\n if (!pfId || pfId.length === 0) {\n throw new KMsgError(\n KMsgErrorCode.INVALID_REQUEST,\n \"kakao profileId is required (options.kakao.profileId or config.kakaoPfId)\",\n { providerId },\n );\n }\n\n const fallbackContent =\n typeof failover?.fallbackContent === \"string\" &&\n failover.fallbackContent.trim().length > 0\n ? failover.fallbackContent.trim()\n : undefined;\n const fallbackTitle =\n typeof failover?.fallbackTitle === \"string\" &&\n failover.fallbackTitle.trim().length > 0\n ? failover.fallbackTitle.trim()\n : undefined;\n const disableSms =\n failover?.enabled === true\n ? false\n : failover?.enabled === false\n ? true\n : alimtalkOptions.kakao?.disableSms;\n\n if (fallbackContent) {\n base.text = fallbackContent;\n }\n if (fallbackTitle) {\n base.subject = fallbackTitle;\n }\n\n base.kakaoOptions = {\n pfId,\n templateId: alimtalkOptions.templateId,\n variables: stringifyVariables(alimtalkOptions.variables),\n disableSms,\n adFlag: alimtalkOptions.kakao?.adFlag,\n buttons: Array.isArray(alimtalkOptions.kakao?.buttons)\n ? alimtalkOptions.kakao.buttons\n : undefined,\n imageId: alimtalkOptions.kakao?.imageId,\n };\n\n return base as unknown as SolapiSendOneMessage;\n }\n\n if (type === \"CTA\" || type === \"CTI\") {\n const friendTalkOptions = options as Extract<\n SendOptions,\n { type: \"FRIENDTALK\" }\n >;\n const text = friendTalkOptions.text;\n if (text.length === 0) {\n throw new KMsgError(\n KMsgErrorCode.INVALID_REQUEST,\n \"text is required for FRIENDTALK\",\n { providerId },\n );\n }\n\n const pfId =\n typeof friendTalkOptions.kakao?.profileId === \"string\" &&\n friendTalkOptions.kakao.profileId.length > 0\n ? friendTalkOptions.kakao.profileId\n : config.kakaoPfId;\n\n if (!pfId || pfId.length === 0) {\n throw new KMsgError(\n KMsgErrorCode.INVALID_REQUEST,\n \"kakao profileId is required (options.kakao.profileId or config.kakaoPfId)\",\n { providerId },\n );\n }\n\n const kakaoButtons = toKakaoButtons(friendTalkOptions.buttons);\n const buttons = Array.isArray(friendTalkOptions.kakao?.buttons)\n ? friendTalkOptions.kakao.buttons\n : kakaoButtons;\n\n const imageLinkFromOptions =\n typeof friendTalkOptions.kakao?.imageLink === \"string\" &&\n friendTalkOptions.kakao.imageLink.length > 0\n ? friendTalkOptions.kakao.imageLink\n : undefined;\n const firstButton =\n Array.isArray(buttons) && buttons.length > 0 ? buttons[0] : undefined;\n const imageLinkFromButton =\n isObjectRecord(firstButton) && typeof firstButton.linkMo === \"string\"\n ? (firstButton.linkMo as string)\n : undefined;\n const imageLink = imageLinkFromOptions ?? imageLinkFromButton;\n\n let imageId: string | undefined;\n if (type === \"CTI\") {\n const imageRef = resolveImageRef({\n imageUrl: friendTalkOptions.imageUrl,\n media: friendTalkOptions.media,\n providerId,\n });\n if (!imageRef) {\n throw new KMsgError(\n KMsgErrorCode.INVALID_REQUEST,\n \"image is required for CTI (friendtalk image) (options.imageUrl or options.media.image.ref)\",\n { providerId },\n );\n }\n if (!imageLink) {\n throw new KMsgError(\n KMsgErrorCode.INVALID_REQUEST,\n \"imageLink is required for friendtalk image upload (options.kakao.imageLink or WL button)\",\n { providerId },\n );\n }\n\n const upload = await client.uploadFile(\n imageRef,\n \"KAKAO\",\n undefined,\n imageLink,\n );\n const fileId = extractFileId(upload);\n if (typeof fileId === \"string\" && fileId.length > 0) {\n imageId = fileId;\n } else {\n throw new KMsgError(\n KMsgErrorCode.PROVIDER_ERROR,\n \"Failed to upload friendtalk image\",\n {\n providerId,\n },\n );\n }\n }\n\n base.text = text;\n base.kakaoOptions = {\n pfId,\n variables: stringifyVariables(friendTalkOptions.variables),\n disableSms: friendTalkOptions.kakao?.disableSms,\n adFlag: friendTalkOptions.kakao?.adFlag,\n buttons,\n imageId,\n };\n\n return base as unknown as SolapiSendOneMessage;\n }\n\n if (type === \"NSA\") {\n const nsaOptions = options as Extract<SendOptions, { type: \"NSA\" }>;\n const talkId =\n typeof nsaOptions.naver?.talkId === \"string\" &&\n nsaOptions.naver.talkId.length > 0\n ? nsaOptions.naver.talkId\n : config.naverTalkId;\n\n if (!talkId || talkId.length === 0) {\n throw new KMsgError(\n KMsgErrorCode.INVALID_REQUEST,\n \"naver talkId is required (options.naver.talkId or config.naverTalkId)\",\n { providerId },\n );\n }\n\n const templateId =\n typeof nsaOptions.naver?.templateId === \"string\" &&\n nsaOptions.naver.templateId.length > 0\n ? nsaOptions.naver.templateId\n : nsaOptions.templateId;\n\n const variables = {\n ...stringifyVariables(nsaOptions.variables),\n ...stringifyVariables(nsaOptions.naver?.variables),\n };\n\n base.naverOptions = {\n talkId,\n templateId,\n variables,\n disableSms: nsaOptions.naver?.disableSms,\n buttons: Array.isArray(nsaOptions.naver?.buttons)\n ? nsaOptions.naver.buttons\n : undefined,\n };\n\n return base as unknown as SolapiSendOneMessage;\n }\n\n if (type === \"VOICE\") {\n const voiceMessageOptions = options as Extract<\n SendOptions,\n { type: \"VOICE\" }\n >;\n const text = voiceMessageOptions.text;\n if (text.length === 0) {\n throw new KMsgError(\n KMsgErrorCode.INVALID_REQUEST,\n \"text is required for VOICE\",\n {\n providerId,\n },\n );\n }\n\n const voiceTypeRaw = voiceMessageOptions.voice?.voiceType;\n const voiceType =\n voiceTypeRaw === \"FEMALE\" || voiceTypeRaw === \"MALE\"\n ? voiceTypeRaw\n : \"FEMALE\";\n\n base.text = text;\n base.voiceOptions = voiceMessageOptions.voice\n ? { ...voiceMessageOptions.voice, voiceType }\n : { voiceType };\n\n return base as unknown as SolapiSendOneMessage;\n }\n\n if (type === \"FAX\") {\n const faxOptions = options as Extract<SendOptions, { type: \"FAX\" }>;\n const fax = faxOptions.fax;\n const fileIdsFromOptions = Array.isArray(fax?.fileIds)\n ? fax.fileIds.filter(\n (value: unknown): value is string =>\n typeof value === \"string\" && value.length > 0,\n )\n : [];\n\n let fileIds = fileIdsFromOptions;\n\n if (fileIds.length === 0) {\n const fileUrls = Array.isArray(fax?.fileUrls)\n ? fax.fileUrls.filter(\n (value: unknown): value is string =>\n typeof value === \"string\" && value.length > 0,\n )\n : [];\n\n if (fileUrls.length === 0) {\n throw new KMsgError(\n KMsgErrorCode.INVALID_REQUEST,\n \"fax.fileIds or fax.fileUrls is required\",\n {\n providerId,\n },\n );\n }\n\n fileIds = [];\n for (const url of fileUrls) {\n const upload = await client.uploadFile(url, \"FAX\");\n const fileId = extractFileId(upload);\n if (typeof fileId === \"string\" && fileId.length > 0) {\n fileIds.push(fileId);\n }\n }\n }\n\n if (fileIds.length === 0) {\n throw new KMsgError(\n KMsgErrorCode.PROVIDER_ERROR,\n \"Failed to resolve fax fileIds\",\n {\n providerId,\n },\n );\n }\n\n base.faxOptions = { fileIds };\n return base as unknown as SolapiSendOneMessage;\n }\n\n const rcsOptions = options as Extract<\n SendOptions,\n {\n type:\n | \"RCS_SMS\"\n | \"RCS_LMS\"\n | \"RCS_MMS\"\n | \"RCS_TPL\"\n | \"RCS_ITPL\"\n | \"RCS_LTPL\";\n }\n >;\n const rcs = rcsOptions.rcs;\n\n const brandId =\n typeof rcs?.brandId === \"string\" && rcs.brandId.length > 0\n ? rcs.brandId\n : config.rcsBrandId;\n\n if (!brandId || brandId.length === 0) {\n throw new KMsgError(\n KMsgErrorCode.INVALID_REQUEST,\n \"rcs brandId is required (options.rcs.brandId or config.rcsBrandId)\",\n { providerId },\n );\n }\n\n const rcsPayload: Record<string, unknown> = {\n brandId,\n buttons: Array.isArray(rcs?.buttons) ? rcs.buttons : undefined,\n copyAllowed: rcs?.copyAllowed,\n mmsType: rcs?.mmsType,\n commercialType: rcs?.commercialType,\n disableSms: rcs?.disableSms,\n variables: {\n ...stringifyVariables(rcsOptions.variables),\n ...stringifyVariables(rcs?.variables),\n },\n };\n\n if (type === \"RCS_TPL\" || type === \"RCS_ITPL\" || type === \"RCS_LTPL\") {\n const templateOptions = options as Extract<\n SendOptions,\n { type: \"RCS_TPL\" | \"RCS_ITPL\" | \"RCS_LTPL\" }\n >;\n rcsPayload.templateId =\n typeof templateOptions.rcs?.templateId === \"string\" &&\n templateOptions.rcs.templateId.length > 0\n ? templateOptions.rcs.templateId\n : templateOptions.templateId;\n }\n\n let text: string | undefined;\n let subject: string | undefined;\n if (type === \"RCS_SMS\" || type === \"RCS_LMS\" || type === \"RCS_MMS\") {\n const textOptions = options as Extract<\n SendOptions,\n { type: \"RCS_SMS\" | \"RCS_LMS\" | \"RCS_MMS\" }\n >;\n text = textOptions.text;\n subject = textOptions.subject;\n\n if (!text || text.length === 0) {\n throw new KMsgError(\n KMsgErrorCode.INVALID_REQUEST,\n \"text is required for RCS text types\",\n { providerId },\n );\n }\n base.text = text;\n if (subject) base.subject = subject;\n }\n\n const additionalBodyRaw = rcs?.additionalBody;\n const additionalBody = isObjectRecord(additionalBodyRaw)\n ? additionalBodyRaw\n : undefined;\n const additionalBodyImageId =\n additionalBody &&\n typeof additionalBody.imageId === \"string\" &&\n additionalBody.imageId.length > 0\n ? additionalBody.imageId\n : additionalBody &&\n typeof additionalBody.imaggeId === \"string\" &&\n additionalBody.imaggeId.length > 0\n ? additionalBody.imaggeId\n : undefined;\n\n const buildAdditionalBody = (uploadedImageId?: string) => {\n const record = additionalBody ? { ...additionalBody } : {};\n const title =\n typeof record.title === \"string\" && record.title.length > 0\n ? record.title\n : subject || \"RCS\";\n const description =\n typeof record.description === \"string\" && record.description.length > 0\n ? record.description\n : text || \"\";\n const imaggeId = additionalBodyImageId ?? uploadedImageId;\n\n const normalized: Record<string, unknown> = {\n ...record,\n title,\n description,\n };\n\n if (typeof imaggeId === \"string\" && imaggeId.length > 0) {\n normalized.imaggeId = imaggeId;\n }\n\n return normalized;\n };\n\n if (type === \"RCS_MMS\") {\n const rcsTextOptions = options as Extract<\n SendOptions,\n { type: \"RCS_SMS\" | \"RCS_LMS\" | \"RCS_MMS\" }\n >;\n\n const imageRef = resolveImageRef({\n imageUrl: rcsTextOptions.imageUrl,\n media: rcsTextOptions.media,\n providerId,\n });\n if (imageRef) {\n const upload = await client.uploadFile(imageRef, \"RCS\");\n const fileId = extractFileId(upload);\n if (typeof fileId === \"string\" && fileId.length > 0) {\n rcsPayload.additionalBody = buildAdditionalBody(fileId);\n } else if (additionalBody) {\n rcsPayload.additionalBody = buildAdditionalBody(undefined);\n }\n } else if (additionalBody) {\n rcsPayload.additionalBody = buildAdditionalBody(undefined);\n }\n } else if (additionalBody) {\n rcsPayload.additionalBody = buildAdditionalBody(undefined);\n }\n\n base.rcsOptions = rcsPayload;\n return base as unknown as SolapiSendOneMessage;\n}\n\nexport async function sendWithSolapi(params: {\n providerId: string;\n client: SolapiSdkClient;\n config: SolapiConfig;\n options: SendOptions;\n}): Promise<Result<SendResult, KMsgError>> {\n const { providerId, client, config, options } = params;\n\n const warnings = collectSolapiSendWarnings(options, providerId);\n const message = await buildSolapiSendOneMessage({\n options,\n providerId,\n config,\n client,\n });\n const response = await client.sendOne(message, config.appId);\n\n return ok(\n adaptSolapiSendResult({\n options,\n response,\n providerId,\n warnings,\n }),\n );\n}\n"
|
|
15
15
|
],
|
|
16
16
|
"mappings": "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",
|
|
17
|
-
"debugId": "
|
|
17
|
+
"debugId": "3A55ECB3034D8BBF64756E2164756E21",
|
|
18
18
|
"names": []
|
|
19
19
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@k-msg/provider",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.24.1",
|
|
4
4
|
"packageManager": "bun@1.3.8",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Complete provider system with adapters and implementations for K-Message platform",
|
|
@@ -50,8 +50,8 @@
|
|
|
50
50
|
"publish": "bun publish --access public"
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
|
-
"@k-msg/core": "0.
|
|
54
|
-
"@k-msg/template": "0.
|
|
53
|
+
"@k-msg/core": "0.24.1",
|
|
54
|
+
"@k-msg/template": "0.24.1"
|
|
55
55
|
},
|
|
56
56
|
"devDependencies": {
|
|
57
57
|
"@types/bun": "^1.3.9",
|