@k-msg/channel 0.21.1 → 0.22.0

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/index.js CHANGED
@@ -1,4 +1,4 @@
1
- var{defineProperty:S,getOwnPropertyNames:G,getOwnPropertyDescriptor:J}=Object,Y=Object.prototype.hasOwnProperty;var Q=new WeakMap,Z=(e)=>{var n=Q.get(e),t;if(n)return n;if(n=S({},"__esModule",{value:!0}),e&&typeof e==="object"||typeof e==="function")G(e).map((s)=>!Y.call(n,s)&&S(n,s,{get:()=>e[s],enumerable:!(t=J(e,s))||t.enumerable}));return Q.set(e,n),n};var ee=(e,n)=>{for(var t in n)S(e,t,{get:n[t],enumerable:!0,configurable:!0,set:(s)=>n[t]=()=>s})};var de={};ee(de,{KakaoChannelLifecycleService:()=>B,KakaoChannelCapabilityService:()=>y,KakaoChannelBindingResolver:()=>D});module.exports=Z(de);class u extends Error{code;details;constructor(e,n,t){super(n);if(this.name="KMsgError",this.code=e,this.details=t,Error.captureStackTrace)Error.captureStackTrace(this,u)}toJSON(){return{name:this.name,code:this.code,message:this.message,details:this.details}}}var w=(e)=>({isSuccess:!0,isFailure:!1,value:e}),l=(e)=>({isSuccess:!1,isFailure:!0,error:e});function i(e){if(typeof e!=="string")return;let n=e.trim();return n.length>0?n:void 0}function N(e){if(!e)return;let n=e.trim();return n.length>0?n.toLowerCase():void 0}function j(e){let n=e.config&&typeof e.config==="object"?e.config:{},t=i(n.senderKey)??i(n.kakaoPfId)??i(n.profileId),s=i(n.plusId);if(N(e.type)==="solapi")return{senderKey:i(n.kakaoPfId)??t,...s?{plusId:s}:{}};return{...t?{senderKey:t}:{},...s?{plusId:s}:{}}}function ie(e){return[e.providerId??"",e.senderKey??"",e.plusId??"",e.source].join("|")}function X(e){if(!Array.isArray(e)||e.length!==1)return;return i(e[0]?.id)}class D{config;constructor(e){this.config=e}list(e){let n=i(e?.providerId),t=this.config.aliases?.kakaoChannels??{},s=[],r=new Set,C=(a)=>{if(n&&a.providerId!==n)return;let o=ie(a);if(r.has(o))return;r.add(o),s.push(a)};for(let[a,o]of Object.entries(t)){let d=i(o.providerId);if(!d)continue;let k=i(o.senderKey),O=i(o.plusId);if(!k&&!O)continue;C({source:"config",alias:a,providerId:d,...k?{senderKey:k}:{},...O?{plusId:O}:{},...i(o.name)?{name:i(o.name)}:{}})}let f=this.config.defaults?.kakao,p=i(f?.channel),c=p?t[p]:void 0,T=i(c?.providerId)??i(this.config.routing?.defaultProviderId)??X(this.config.providers),K=i(f?.senderKey)??i(c?.senderKey),R=i(f?.plusId)??i(c?.plusId);if(T&&(K||R))C({source:"config",...p?{alias:p}:{},providerId:T,...K?{senderKey:K}:{},...R?{plusId:R}:{},...i(c?.name)?{name:i(c?.name)}:{}});for(let a of this.config.providers??[]){let o=i(a.id);if(!o)continue;let d=j(a);if(!d.senderKey&&!d.plusId)continue;C({source:"config",providerId:o,...d.senderKey?{senderKey:d.senderKey}:{},...d.plusId?{plusId:d.plusId}:{}})}return s}resolve(e){let n=this.config.aliases?.kakaoChannels??{},t=i(e?.channelAlias),s=t?n[t]:void 0;if(t&&e?.strictAlias===!0&&!s)throw new u("INVALID_REQUEST",`Unknown kakao channel alias: ${t}`);let r=this.config.defaults?.kakao,C=i(r?.channel),f=C?n[C]:void 0,p=i(e?.providerId),c=i(s?.providerId),T=i(f?.providerId),K=i(this.config.routing?.defaultProviderId),R=X(this.config.providers),a,o="unknown";if(p)a=p,o="explicit";else if(c)a=c,o="alias";else if(T)a=T,o="defaults";else if(K)a=K,o="routing";else if(R)a=R,o="single_provider";let d=a?(this.config.providers??[]).find((z)=>z.id===a):void 0,k=d?j(d):{},O=i(e?.senderKey),F=i(s?.senderKey),x=i(r?.senderKey),q=i(f?.senderKey),U=i(k.senderKey),L=i(e?.plusId),W=i(s?.plusId),H=i(r?.plusId),V=i(f?.plusId),$=i(k.plusId),h,m;if(O)h=O,m="explicit";else if(F)h=F,m="alias";else if(x)h=x,m="defaults";else if(q)h=q,m="defaults";else if(U)h=U,m="provider_config";let I,E;if(L)I=L,E="explicit";else if(W)I=W,E="alias";else if(H)I=H,E="defaults";else if(V)I=V,E="defaults";else if($)I=$,E="provider_config";return{...t?{alias:t}:{},...a?{providerId:a}:{},...N(d?.type)?{providerType:N(d?.type)}:{},...h?{senderKey:h}:{},...I?{plusId:I}:{},...i(s?.name)?{name:i(s?.name)}:i(f?.name)?{name:i(f?.name)}:{},providerIdSource:o,...m?{senderKeySource:m}:{},...E?{plusIdSource:E}:{}}}getAlias(e){let n=i(e);if(!n)return;return this.config.aliases?.kakaoChannels?.[n]}}function A(e){return typeof e==="function"}function te(e){if(!A(e.getOnboardingSpec))return;try{return e.getOnboardingSpec()}catch{return}}function se(e){if(typeof e!=="string")return;let n=e.trim();return n.length>0?n.toLowerCase():void 0}function re(e,n){if(e?.channelOnboarding){if(e.channelOnboarding==="api"&&!n)return"none";return e.channelOnboarding}return n?"api":"none"}class y{resolve(e){let n=te(e),t={list:A(e.listKakaoChannels),categories:A(e.listKakaoChannelCategories),auth:A(e.requestKakaoChannelAuth),add:A(e.addKakaoChannel)},s=se(n?.providerId),r=re(n,t.list);return{providerId:e.id,...s?{providerType:s}:{},mode:r,supports:t}}}function g(e,n){return new u("INVALID_REQUEST",`Provider '${e}' does not support kakao channel api operation '${n}'`,{providerId:e,operation:n})}class P{provider;constructor(e){this.provider=e}async list(e){let n=this.provider.listKakaoChannels;if(typeof n!=="function")return l(g(this.provider.id,"list"));return n.call(this.provider,e)}async categories(){let e=this.provider.listKakaoChannelCategories;if(typeof e!=="function")return l(g(this.provider.id,"categories"));return e.call(this.provider)}async auth(e){let n=this.provider.requestKakaoChannelAuth;if(typeof n!=="function")return l(g(this.provider.id,"auth"));return n.call(this.provider,e)}async add(e){let n=this.provider.addKakaoChannel;if(typeof n!=="function")return l(g(this.provider.id,"add"));return n.call(this.provider,e)}}class M{provider;mode="manual";constructor(e){this.provider=e}unsupportedMessage(e){return`Provider '${this.provider.id}' uses manual Kakao channel onboarding. Operation '${e}' is not available via API.`}}class _ extends P{constructor(e){super(e)}}class b{provider;mode="none";constructor(e){this.provider=e}unsupportedMessage(e){return`Provider '${this.provider.id}' does not expose Kakao channel onboarding API. Operation '${e}' is unsupported.`}}function ae(e){if(typeof e!=="string")return;let n=e.trim();return n.length>0?n.toLowerCase():void 0}function oe(e,n){switch(e){case"aligo":return new P(n);case"mock":return new _(n);default:return typeof n.listKakaoChannels==="function"?new P(n):void 0}}class B{provider;capability;providerType;apiAdapter;iwinvAdapter;solapiAdapter;constructor(e,n=new y){this.provider=e;if(this.capability=n.resolve(e),this.providerType=ae(this.capability.providerType),this.capability.mode==="api")this.apiAdapter=oe(this.providerType,this.provider);else if(this.providerType==="iwinv")this.iwinvAdapter=new M(this.provider);else if(this.providerType==="solapi")this.solapiAdapter=new b(this.provider)}getCapability(){return this.capability}unsupported(e){let n=(()=>{if(this.capability.mode==="manual"){if(this.iwinvAdapter)return this.iwinvAdapter.unsupportedMessage(e);return`Provider '${this.provider.id}' requires manual Kakao channel onboarding. Operation '${e}' is unavailable via API.`}if(this.capability.mode==="none"){if(this.solapiAdapter)return this.solapiAdapter.unsupportedMessage(e);return`Provider '${this.provider.id}' does not support Kakao channel onboarding API operation '${e}'.`}return`Provider '${this.provider.id}' does not support Kakao channel onboarding API operation '${e}'.`})();return l(new u("INVALID_REQUEST",n,{providerId:this.provider.id,mode:this.capability.mode,operation:e}))}ensureApi(e){if(this.capability.mode!=="api")return this.unsupported(e);if(!this.apiAdapter)return l(new u("INVALID_REQUEST",`Provider '${this.provider.id}' is marked as api mode but does not expose kakao channel operations`,{providerId:this.provider.id,mode:this.capability.mode,operation:e}));return w(void 0)}async list(e){let n=this.ensureApi("list");if(n.isFailure)return n;let t=this.apiAdapter;if(!t)return this.unsupported("list");let s=await t.list(e);if(s.isFailure)return s;return w(s.value.map((r)=>({source:"api",providerId:r.providerId||this.provider.id,senderKey:r.senderKey,...r.plusId?{plusId:r.plusId}:{},...r.name?{name:r.name}:{},...r.status?{status:r.status}:{}})))}async categories(){let e=this.ensureApi("categories");if(e.isFailure)return e;let n=this.apiAdapter;if(!n)return this.unsupported("categories");return n.categories()}async auth(e){let n=this.ensureApi("auth");if(n.isFailure)return n;let t=this.apiAdapter;if(!t)return this.unsupported("auth");return t.auth(e)}async add(e){let n=this.ensureApi("add");if(n.isFailure)return n;let t=this.apiAdapter;if(!t)return this.unsupported("add");return t.add(e)}}
1
+ var{defineProperty:y,getOwnPropertyNames:_,getOwnPropertyDescriptor:L}=Object,z=Object.prototype.hasOwnProperty;var X=new WeakMap,nn=(n)=>{var i=X.get(n),s;if(i)return i;if(i=y({},"__esModule",{value:!0}),n&&typeof n==="object"||typeof n==="function")_(n).map((t)=>!z.call(i,t)&&y(i,t,{get:()=>n[t],enumerable:!(s=L(n,t))||s.enumerable}));return X.set(n,i),i};var en=(n,i)=>{for(var s in i)y(n,s,{get:i[s],enumerable:!0,configurable:!0,set:(t)=>i[s]=()=>t})};var rn={};en(rn,{KakaoChannelLifecycleService:()=>F,KakaoChannelCapabilityService:()=>S,KakaoChannelBindingResolver:()=>q});module.exports=nn(rn);var b=(n)=>{if(typeof n!=="number"||Number.isNaN(n)||!Number.isFinite(n))return;return Math.trunc(n)};class f extends Error{code;details;providerErrorCode;providerErrorText;httpStatus;requestId;retryAfterMs;attempt;causeChain;constructor(n,i,s,t={}){super(i);if(this.name="KMsgError",this.code=n,this.details=s,this.providerErrorCode=t.providerErrorCode,this.providerErrorText=t.providerErrorText,this.httpStatus=b(t.httpStatus),this.requestId=typeof t.requestId==="string"?t.requestId:void 0,this.retryAfterMs=b(t.retryAfterMs),this.attempt=b(t.attempt),Array.isArray(t.causeChain))this.causeChain=t.causeChain;else if(t.causeChain!==void 0)this.causeChain=[t.causeChain];if(Error.captureStackTrace)Error.captureStackTrace(this,f)}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 D=(n)=>({isSuccess:!0,isFailure:!1,value:n}),p=(n)=>({isSuccess:!1,isFailure:!0,error:n});function e(n){if(typeof n!=="string")return;let i=n.trim();return i.length>0?i:void 0}function E(n){if(!n)return;let i=n.trim();return i.length>0?i.toLowerCase():void 0}function Z(n){let i=n.config&&typeof n.config==="object"?n.config:{},s=e(i.senderKey)??e(i.kakaoPfId)??e(i.profileId),t=e(i.plusId);if(E(n.type)==="solapi")return{senderKey:e(i.kakaoPfId)??s,...t?{plusId:t}:{}};return{...s?{senderKey:s}:{},...t?{plusId:t}:{}}}function sn(n){return[n.providerId??"",n.senderKey??"",n.plusId??"",n.source].join("|")}function G(n){if(!Array.isArray(n)||n.length!==1)return;return e(n[0]?.id)}class q{config;constructor(n){this.config=n}list(n){let i=e(n?.providerId),s=this.config.aliases?.kakaoChannels??{},t=[],o=new Set,I=(a)=>{if(i&&a.providerId!==i)return;let d=sn(a);if(o.has(d))return;o.add(d),t.push(a)};for(let[a,d]of Object.entries(s)){let u=e(d.providerId);if(!u)continue;let O=e(d.senderKey),w=e(d.plusId);if(!O&&!w)continue;I({source:"config",alias:a,providerId:u,...O?{senderKey:O}:{},...w?{plusId:w}:{},...e(d.name)?{name:e(d.name)}:{}})}let r=this.config.defaults?.kakao,c=e(r?.channel),h=c?s[c]:void 0,v=e(h?.providerId)??e(this.config.routing?.defaultProviderId)??G(this.config.providers),C=e(r?.senderKey)??e(h?.senderKey),P=e(r?.plusId)??e(h?.plusId);if(v&&(C||P))I({source:"config",...c?{alias:c}:{},providerId:v,...C?{senderKey:C}:{},...P?{plusId:P}:{},...e(h?.name)?{name:e(h?.name)}:{}});for(let a of this.config.providers??[]){let d=e(a.id);if(!d)continue;let u=Z(a);if(!u.senderKey&&!u.plusId)continue;I({source:"config",providerId:d,...u.senderKey?{senderKey:u.senderKey}:{},...u.plusId?{plusId:u.plusId}:{}})}return t}resolve(n){let i=this.config.aliases?.kakaoChannels??{},s=e(n?.channelAlias),t=s?i[s]:void 0;if(s&&n?.strictAlias===!0&&!t)throw new f("INVALID_REQUEST",`Unknown kakao channel alias: ${s}`);let o=this.config.defaults?.kakao,I=e(o?.channel),r=I?i[I]:void 0,c=e(n?.providerId),h=e(t?.providerId),v=e(r?.providerId),C=e(this.config.routing?.defaultProviderId),P=G(this.config.providers),a,d="unknown";if(c)a=c,d="explicit";else if(h)a=h,d="alias";else if(v)a=v,d="defaults";else if(C)a=C,d="routing";else if(P)a=P,d="single_provider";let u=a?(this.config.providers??[]).find((Y)=>Y.id===a):void 0,O=u?Z(u):{},w=e(n?.senderKey),N=e(t?.senderKey),H=e(o?.senderKey),$=e(r?.senderKey),j=e(O.senderKey),Q=e(n?.plusId),U=e(t?.plusId),W=e(o?.plusId),V=e(r?.plusId),J=e(O.plusId),l,m;if(w)l=w,m="explicit";else if(N)l=N,m="alias";else if(H)l=H,m="defaults";else if($)l=$,m="defaults";else if(j)l=j,m="provider_config";let k,K;if(Q)k=Q,K="explicit";else if(U)k=U,K="alias";else if(W)k=W,K="defaults";else if(V)k=V,K="defaults";else if(J)k=J,K="provider_config";return{...s?{alias:s}:{},...a?{providerId:a}:{},...E(u?.type)?{providerType:E(u?.type)}:{},...l?{senderKey:l}:{},...k?{plusId:k}:{},...e(t?.name)?{name:e(t?.name)}:e(r?.name)?{name:e(r?.name)}:{},providerIdSource:d,...m?{senderKeySource:m}:{},...K?{plusIdSource:K}:{}}}getAlias(n){let i=e(n);if(!i)return;return this.config.aliases?.kakaoChannels?.[i]}}function A(n){return typeof n==="function"}function on(n){if(!A(n.getOnboardingSpec))return;try{return n.getOnboardingSpec()}catch{return}}function an(n){if(typeof n!=="string")return;let i=n.trim();return i.length>0?i.toLowerCase():void 0}function dn(n,i){if(n?.channelOnboarding){if(n.channelOnboarding==="api"&&!i)return"none";return n.channelOnboarding}return i?"api":"none"}class S{resolve(n){let i=on(n),s={list:A(n.listKakaoChannels),categories:A(n.listKakaoChannelCategories),auth:A(n.requestKakaoChannelAuth),add:A(n.addKakaoChannel)},t=an(i?.providerId),o=dn(i,s.list);return{providerId:n.id,...t?{providerType:t}:{},mode:o,supports:s}}}function g(n,i){return new f("INVALID_REQUEST",`Provider '${n}' does not support kakao channel api operation '${i}'`,{providerId:n,operation:i})}class R{provider;constructor(n){this.provider=n}async list(n){let i=this.provider.listKakaoChannels;if(typeof i!=="function")return p(g(this.provider.id,"list"));return i.call(this.provider,n)}async categories(){let n=this.provider.listKakaoChannelCategories;if(typeof n!=="function")return p(g(this.provider.id,"categories"));return n.call(this.provider)}async auth(n){let i=this.provider.requestKakaoChannelAuth;if(typeof i!=="function")return p(g(this.provider.id,"auth"));return i.call(this.provider,n)}async add(n){let i=this.provider.addKakaoChannel;if(typeof i!=="function")return p(g(this.provider.id,"add"));return i.call(this.provider,n)}}class B{provider;mode="manual";constructor(n){this.provider=n}unsupportedMessage(n){return`Provider '${this.provider.id}' uses manual Kakao channel onboarding. Operation '${n}' is not available via API.`}}class x extends R{constructor(n){super(n)}}class M{provider;mode="none";constructor(n){this.provider=n}unsupportedMessage(n){return`Provider '${this.provider.id}' does not expose Kakao channel onboarding API. Operation '${n}' is unsupported.`}}function un(n){if(typeof n!=="string")return;let i=n.trim();return i.length>0?i.toLowerCase():void 0}function fn(n,i){switch(n){case"aligo":return new R(i);case"mock":return new x(i);default:return typeof i.listKakaoChannels==="function"?new R(i):void 0}}class F{provider;capability;providerType;apiAdapter;iwinvAdapter;solapiAdapter;constructor(n,i=new S){this.provider=n;if(this.capability=i.resolve(n),this.providerType=un(this.capability.providerType),this.capability.mode==="api")this.apiAdapter=fn(this.providerType,this.provider);else if(this.providerType==="iwinv")this.iwinvAdapter=new B(this.provider);else if(this.providerType==="solapi")this.solapiAdapter=new M(this.provider)}getCapability(){return this.capability}unsupported(n){let i=(()=>{if(this.capability.mode==="manual"){if(this.iwinvAdapter)return this.iwinvAdapter.unsupportedMessage(n);return`Provider '${this.provider.id}' requires manual Kakao channel onboarding. Operation '${n}' is unavailable via API.`}if(this.capability.mode==="none"){if(this.solapiAdapter)return this.solapiAdapter.unsupportedMessage(n);return`Provider '${this.provider.id}' does not support Kakao channel onboarding API operation '${n}'.`}return`Provider '${this.provider.id}' does not support Kakao channel onboarding API operation '${n}'.`})();return p(new f("INVALID_REQUEST",i,{providerId:this.provider.id,mode:this.capability.mode,operation:n}))}ensureApi(n){if(this.capability.mode!=="api")return this.unsupported(n);if(!this.apiAdapter)return p(new f("INVALID_REQUEST",`Provider '${this.provider.id}' is marked as api mode but does not expose kakao channel operations`,{providerId:this.provider.id,mode:this.capability.mode,operation:n}));return D(void 0)}async list(n){let i=this.ensureApi("list");if(i.isFailure)return i;let s=this.apiAdapter;if(!s)return this.unsupported("list");let t=await s.list(n);if(t.isFailure)return t;return D(t.value.map((o)=>({source:"api",providerId:o.providerId||this.provider.id,senderKey:o.senderKey,...o.plusId?{plusId:o.plusId}:{},...o.name?{name:o.name}:{},...o.status?{status:o.status}:{}})))}async categories(){let n=this.ensureApi("categories");if(n.isFailure)return n;let i=this.apiAdapter;if(!i)return this.unsupported("categories");return i.categories()}async auth(n){let i=this.ensureApi("auth");if(i.isFailure)return i;let s=this.apiAdapter;if(!s)return this.unsupported("auth");return s.auth(n)}async add(n){let i=this.ensureApi("add");if(i.isFailure)return i;let s=this.apiAdapter;if(!s)return this.unsupported("add");return s.add(n)}}
2
2
 
3
- //# debugId=357E12540E70E3C864756E2164756E21
3
+ //# debugId=105E788773D1FB2C64756E2164756E21
4
4
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -2,7 +2,7 @@
2
2
  "version": 3,
3
3
  "sources": ["../../core/src/errors.ts", "../../core/src/result.ts", "../src/runtime/kakao-channel-binding-resolver.ts", "../src/runtime/kakao-channel-capability.service.ts", "../src/runtime/adapters/aligo.adapter.ts", "../src/runtime/adapters/iwinv.adapter.ts", "../src/runtime/adapters/mock.adapter.ts", "../src/runtime/adapters/solapi.adapter.ts", "../src/runtime/kakao-channel-lifecycle.service.ts"],
4
4
  "sourcesContent": [
5
- "export enum KMsgErrorCode {\n INVALID_REQUEST = \"INVALID_REQUEST\",\n AUTHENTICATION_FAILED = \"AUTHENTICATION_FAILED\",\n INSUFFICIENT_BALANCE = \"INSUFFICIENT_BALANCE\",\n TEMPLATE_NOT_FOUND = \"TEMPLATE_NOT_FOUND\",\n RATE_LIMIT_EXCEEDED = \"RATE_LIMIT_EXCEEDED\",\n NETWORK_ERROR = \"NETWORK_ERROR\",\n NETWORK_TIMEOUT = \"NETWORK_TIMEOUT\",\n NETWORK_SERVICE_UNAVAILABLE = \"NETWORK_SERVICE_UNAVAILABLE\",\n PROVIDER_ERROR = \"PROVIDER_ERROR\",\n MESSAGE_SEND_FAILED = \"MESSAGE_SEND_FAILED\",\n UNKNOWN_ERROR = \"UNKNOWN_ERROR\",\n}\n\nexport class KMsgError extends Error {\n public readonly code: KMsgErrorCode;\n public readonly details?: Record<string, any>;\n\n constructor(\n code: KMsgErrorCode,\n message: string,\n details?: Record<string, any>,\n ) {\n super(message);\n this.name = \"KMsgError\";\n this.code = code;\n this.details = details;\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, KMsgError);\n }\n }\n\n toJSON() {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n details: this.details,\n };\n }\n}\n\nexport const ErrorUtils = {\n isRetryable: (error: any): boolean => {\n if (error instanceof KMsgError) {\n return [\n KMsgErrorCode.NETWORK_ERROR,\n KMsgErrorCode.RATE_LIMIT_EXCEEDED,\n KMsgErrorCode.PROVIDER_ERROR,\n ].includes(error.code);\n }\n return false;\n },\n};\n",
5
+ "export enum KMsgErrorCode {\n INVALID_REQUEST = \"INVALID_REQUEST\",\n AUTHENTICATION_FAILED = \"AUTHENTICATION_FAILED\",\n INSUFFICIENT_BALANCE = \"INSUFFICIENT_BALANCE\",\n TEMPLATE_NOT_FOUND = \"TEMPLATE_NOT_FOUND\",\n RATE_LIMIT_EXCEEDED = \"RATE_LIMIT_EXCEEDED\",\n NETWORK_ERROR = \"NETWORK_ERROR\",\n NETWORK_TIMEOUT = \"NETWORK_TIMEOUT\",\n NETWORK_SERVICE_UNAVAILABLE = \"NETWORK_SERVICE_UNAVAILABLE\",\n PROVIDER_ERROR = \"PROVIDER_ERROR\",\n MESSAGE_SEND_FAILED = \"MESSAGE_SEND_FAILED\",\n UNKNOWN_ERROR = \"UNKNOWN_ERROR\",\n}\n\nexport type RetryPolicyErrorCode = KMsgErrorCode;\n\nexport type ProviderRetryHint = \"retryable\" | \"non_retryable\";\n\nexport interface KMsgErrorMetadata {\n providerErrorCode?: string;\n providerErrorText?: string;\n httpStatus?: number;\n requestId?: string;\n retryAfterMs?: number;\n attempt?: number;\n causeChain?: unknown[];\n}\n\nexport interface ErrorRetryPolicy {\n retryableCodes?: readonly KMsgErrorCode[];\n nonRetryableCodes?: readonly KMsgErrorCode[];\n classifyByStatusCode?: (status: number) => ProviderRetryHint;\n classifyByMessage?: (message: string) => ProviderRetryHint | undefined;\n /**\n * Optional override for retry hint inference.\n */\n fallback?: ProviderRetryHint;\n /**\n * Optional custom retry delay in milliseconds.\n */\n retryAfterMs?: (error: KMsgError) => number | undefined;\n}\n\nconst DEFAULT_RETRYABLE_ERROR_CODES: ReadonlySet<RetryPolicyErrorCode> = new Set([\n KMsgErrorCode.NETWORK_ERROR,\n KMsgErrorCode.RATE_LIMIT_EXCEEDED,\n KMsgErrorCode.NETWORK_TIMEOUT,\n KMsgErrorCode.NETWORK_SERVICE_UNAVAILABLE,\n KMsgErrorCode.PROVIDER_ERROR,\n KMsgErrorCode.UNKNOWN_ERROR,\n]);\n\nconst DEFAULT_NON_RETRYABLE_ERROR_CODES: ReadonlySet<RetryPolicyErrorCode> = new Set([\n KMsgErrorCode.INVALID_REQUEST,\n KMsgErrorCode.AUTHENTICATION_FAILED,\n KMsgErrorCode.INSUFFICIENT_BALANCE,\n KMsgErrorCode.TEMPLATE_NOT_FOUND,\n KMsgErrorCode.MESSAGE_SEND_FAILED,\n]);\n\nconst normalizeNumber = (value: unknown): number | undefined => {\n if (typeof value !== \"number\" || Number.isNaN(value) || !Number.isFinite(value)) {\n return undefined;\n }\n\n return Math.trunc(value);\n};\n\nexport const normalizeRetryAfterMs = (value: unknown): number | undefined => {\n const normalized = normalizeNumber(value);\n if (normalized === undefined || normalized < 0) {\n return undefined;\n }\n\n return normalized;\n};\n\nconst toLowerString = (value: unknown): string | undefined => {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n return value.toLowerCase().trim();\n};\n\nconst classifyByHttpStatus = (status: number): ProviderRetryHint => {\n if (status >= 500) {\n return \"retryable\";\n }\n\n if (status === 408 || status === 425 || status === 429) {\n return \"retryable\";\n }\n\n return \"non_retryable\";\n};\n\nconst classifyByMessage = (message: string): ProviderRetryHint | undefined => {\n const normalized = message.toLowerCase();\n\n if (normalized.includes(\"timeout\") || normalized.includes(\"temporar\") || normalized.includes(\"network\") || normalized.includes(\"retry\")) {\n return \"retryable\";\n }\n\n return undefined;\n};\n\nexport class KMsgError extends Error {\n public readonly code: KMsgErrorCode;\n public readonly details?: Record<string, any>;\n public readonly providerErrorCode?: string;\n public readonly providerErrorText?: string;\n public readonly httpStatus?: number;\n public readonly requestId?: string;\n public readonly retryAfterMs?: number;\n public readonly attempt?: number;\n public readonly causeChain?: unknown[];\n\n constructor(\n code: KMsgErrorCode,\n message: string,\n details?: Record<string, any>,\n metadata: KMsgErrorMetadata = {},\n ) {\n super(message);\n this.name = \"KMsgError\";\n this.code = code;\n this.details = details;\n\n this.providerErrorCode = metadata.providerErrorCode;\n this.providerErrorText = metadata.providerErrorText;\n this.httpStatus = normalizeNumber(metadata.httpStatus);\n this.requestId = typeof metadata.requestId === \"string\" ? metadata.requestId : undefined;\n this.retryAfterMs = normalizeNumber(metadata.retryAfterMs);\n this.attempt = normalizeNumber(metadata.attempt);\n\n if (Array.isArray(metadata.causeChain)) {\n this.causeChain = metadata.causeChain;\n } else if (metadata.causeChain !== undefined) {\n this.causeChain = [metadata.causeChain];\n }\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, KMsgError);\n }\n }\n\n toJSON() {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n details: this.details,\n providerErrorCode: this.providerErrorCode,\n providerErrorText: this.providerErrorText,\n httpStatus: this.httpStatus,\n requestId: this.requestId,\n retryAfterMs: this.retryAfterMs,\n attempt: this.attempt,\n causeChain: this.causeChain,\n };\n }\n}\n\nexport const ErrorUtils = {\n isRetryable(error: any, policy: ErrorRetryPolicy = {}): boolean {\n return ErrorUtils.classifyForRetry(error, policy) === \"retryable\";\n },\n\n classifyForRetry(\n error: any,\n policy: ErrorRetryPolicy = {},\n ): ProviderRetryHint {\n if (error instanceof KMsgError) {\n const retryableCodes = new Set(\n policy.retryableCodes ?? Array.from(DEFAULT_RETRYABLE_ERROR_CODES),\n );\n if (retryableCodes.has(error.code)) {\n return \"retryable\";\n }\n\n const nonRetryableCodes = new Set(\n policy.nonRetryableCodes ?? Array.from(DEFAULT_NON_RETRYABLE_ERROR_CODES),\n );\n if (nonRetryableCodes.has(error.code)) {\n return \"non_retryable\";\n }\n\n if (error.httpStatus !== undefined) {\n return classifyByHttpStatus(error.httpStatus);\n }\n\n const classifiedByMessage = classifyByMessage(error.message);\n if (classifiedByMessage) {\n return classifiedByMessage;\n }\n\n if (policy.classifyByMessage && error.message) {\n const classified = policy.classifyByMessage(error.message);\n if (classified) {\n return classified;\n }\n }\n\n if (policy.fallback) {\n return policy.fallback;\n }\n\n return \"non_retryable\";\n }\n\n const status = toLowerString(error?.status) ?? toLowerString(error?.statusCode) ?? toLowerString(error?.code);\n const statusCode = normalizeNumber(error?.status) ??\n normalizeNumber(error?.statusCode) ??\n normalizeNumber(error?.httpStatus);\n\n if (typeof status === \"string\" && status.startsWith(\"5\")) {\n return \"retryable\";\n }\n\n if (statusCode !== undefined) {\n if (policy.classifyByStatusCode) {\n return policy.classifyByStatusCode(statusCode);\n }\n\n return classifyByHttpStatus(statusCode);\n }\n\n const classifiedByMessage =\n typeof error?.message === \"string\"\n ? classifyByMessage(error.message)\n : undefined;\n\n if (classifiedByMessage) {\n return classifiedByMessage;\n }\n\n if (policy.classifyByMessage && typeof error?.message === \"string\") {\n const classified = policy.classifyByMessage(error.message);\n if (classified) {\n return classified;\n }\n }\n\n return policy.fallback ?? \"non_retryable\";\n },\n\n resolveRetryAfterMs(\n error: KMsgError,\n policy?: ErrorRetryPolicy,\n ): number | undefined {\n if (policy?.retryAfterMs) {\n const override = policy.retryAfterMs(error);\n const normalized = normalizeRetryAfterMs(override);\n if (normalized !== undefined) {\n return normalized;\n }\n }\n\n if (error.retryAfterMs !== undefined) {\n return normalizeRetryAfterMs(error.retryAfterMs);\n }\n\n if (error.code === KMsgErrorCode.RATE_LIMIT_EXCEEDED && error.retryAfterMs === undefined) {\n return undefined;\n }\n\n return undefined;\n },\n\n isUnknownStatus: (statusCode: number | undefined): boolean => {\n if (statusCode === undefined || Number.isNaN(statusCode) || !Number.isFinite(statusCode)) {\n return false;\n }\n\n return statusCode < 500;\n },\n\n toRetryMetadata(error: KMsgError): KMsgErrorMetadata {\n return {\n providerErrorCode: error.providerErrorCode,\n providerErrorText: error.providerErrorText,\n httpStatus: error.httpStatus,\n requestId: error.requestId,\n retryAfterMs: error.retryAfterMs,\n attempt: error.attempt,\n causeChain: error.causeChain,\n };\n },\n\n withAttempt(\n error: KMsgError,\n attempt: number,\n ): KMsgError {\n return new KMsgError(\n error.code,\n error.message,\n error.details,\n {\n ...ErrorUtils.toRetryMetadata(error),\n attempt: normalizeNumber(attempt),\n },\n );\n },\n\n DEFAULT_RETRYABLE_ERROR_CODES,\n DEFAULT_NON_RETRYABLE_ERROR_CODES,\n};\n",
6
6
  "export type Ok<T> = {\n readonly isSuccess: true;\n readonly isFailure: false;\n readonly value: T;\n};\n\nexport type Fail<E> = {\n readonly isSuccess: false;\n readonly isFailure: true;\n readonly error: E;\n};\n\nexport type Result<T, E = Error> = Ok<T> | Fail<E>;\n\nexport const ok = <T>(value: T): Ok<T> => ({\n isSuccess: true,\n isFailure: false,\n value,\n});\n\nexport const fail = <E>(error: E): Fail<E> => ({\n isSuccess: false,\n isFailure: true,\n error,\n});\n\n/**\n * Result utility functions for chaining and transformation\n */\nexport const Result = {\n /**\n * Transform the success value of a Result\n */\n map<T, U, E>(result: Result<T, E>, fn: (value: T) => U): Result<U, E> {\n if (result.isSuccess) {\n return ok(fn(result.value));\n }\n return result;\n },\n\n /**\n * Chain Result-returning operations\n */\n flatMap<T, U, E>(\n result: Result<T, E>,\n fn: (value: T) => Result<U, E>,\n ): Result<U, E> {\n if (result.isSuccess) {\n return fn(result.value);\n }\n return result;\n },\n\n /**\n * Transform the error of a Result\n */\n mapError<T, E, F>(result: Result<T, E>, fn: (error: E) => F): Result<T, F> {\n if (result.isFailure) {\n return fail(fn(result.error));\n }\n return result;\n },\n\n /**\n * Extract the value or throw the error\n */\n unwrap<T, E>(result: Result<T, E>): T {\n if (result.isSuccess) {\n return result.value;\n }\n throw result.error;\n },\n\n /**\n * Extract the value or return a default\n */\n unwrapOr<T, E>(result: Result<T, E>, defaultValue: T): T {\n if (result.isSuccess) {\n return result.value;\n }\n return defaultValue;\n },\n\n /**\n * Extract the value or compute a default from the error\n */\n unwrapOrElse<T, E>(result: Result<T, E>, fn: (error: E) => T): T {\n if (result.isSuccess) {\n return result.value;\n }\n return fn(result.error);\n },\n\n /**\n * Pattern match on a Result\n */\n match<T, E, U>(\n result: Result<T, E>,\n handlers: { ok: (value: T) => U; fail: (error: E) => U },\n ): U {\n if (result.isSuccess) {\n return handlers.ok(result.value);\n }\n return handlers.fail(result.error);\n },\n\n /**\n * Convert a Promise to a Result\n */\n async fromPromise<T, E = Error>(promise: Promise<T>): Promise<Result<T, E>> {\n try {\n const value = await promise;\n return ok(value);\n } catch (error) {\n return fail(error as E);\n }\n },\n\n /**\n * Check if a Result is Ok\n */\n isOk<T, E>(result: Result<T, E>): result is Ok<T> {\n return result.isSuccess;\n },\n\n /**\n * Check if a Result is Fail\n */\n isFail<T, E>(result: Result<T, E>): result is Fail<E> {\n return result.isFailure;\n },\n};\n",
7
7
  "import { KMsgError, KMsgErrorCode } from \"@k-msg/core\";\nimport type {\n KakaoChannelAliasEntry,\n KakaoChannelBindingSource,\n KakaoChannelListItem,\n KakaoChannelResolveInput,\n KakaoChannelResolverConfig,\n KakaoProviderConfigEntry,\n ResolvedKakaoChannelBinding,\n} from \"./types\";\n\nfunction readString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction normalizeProviderType(value: string | undefined): string | undefined {\n if (!value) return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed.toLowerCase() : undefined;\n}\n\nfunction extractProviderBindingHint(provider: KakaoProviderConfigEntry): {\n senderKey?: string;\n plusId?: string;\n} {\n const cfg =\n provider.config && typeof provider.config === \"object\"\n ? provider.config\n : {};\n\n const senderKey =\n readString((cfg as Record<string, unknown>).senderKey) ??\n readString((cfg as Record<string, unknown>).kakaoPfId) ??\n readString((cfg as Record<string, unknown>).profileId);\n const plusId = readString((cfg as Record<string, unknown>).plusId);\n\n const providerType = normalizeProviderType(provider.type);\n if (providerType === \"solapi\") {\n return {\n senderKey:\n readString((cfg as Record<string, unknown>).kakaoPfId) ?? senderKey,\n ...(plusId ? { plusId } : {}),\n };\n }\n\n return {\n ...(senderKey ? { senderKey } : {}),\n ...(plusId ? { plusId } : {}),\n };\n}\n\nfunction dedupeKey(item: KakaoChannelListItem): string {\n return [\n item.providerId ?? \"\",\n item.senderKey ?? \"\",\n item.plusId ?? \"\",\n item.source,\n ].join(\"|\");\n}\n\nfunction selectSingleProviderId(\n providers: KakaoProviderConfigEntry[] | undefined,\n): string | undefined {\n if (!Array.isArray(providers) || providers.length !== 1) return undefined;\n return readString(providers[0]?.id);\n}\n\nexport class KakaoChannelBindingResolver {\n constructor(private readonly config: KakaoChannelResolverConfig) {}\n\n list(params?: { providerId?: string }): KakaoChannelListItem[] {\n const requestedProviderId = readString(params?.providerId);\n const aliases = this.config.aliases?.kakaoChannels ?? {};\n const items: KakaoChannelListItem[] = [];\n const seen = new Set<string>();\n\n const pushUnique = (item: KakaoChannelListItem): void => {\n if (requestedProviderId && item.providerId !== requestedProviderId) {\n return;\n }\n const key = dedupeKey(item);\n if (seen.has(key)) {\n return;\n }\n seen.add(key);\n items.push(item);\n };\n\n for (const [alias, entry] of Object.entries(aliases)) {\n const providerId = readString(entry.providerId);\n if (!providerId) continue;\n\n const senderKey = readString(entry.senderKey);\n const plusId = readString(entry.plusId);\n if (!senderKey && !plusId) continue;\n\n pushUnique({\n source: \"config\",\n alias,\n providerId,\n ...(senderKey ? { senderKey } : {}),\n ...(plusId ? { plusId } : {}),\n ...(readString(entry.name) ? { name: readString(entry.name) } : {}),\n });\n }\n\n const defaultsKakao = this.config.defaults?.kakao;\n const defaultsChannelAlias = readString(defaultsKakao?.channel);\n const defaultAliasEntry = defaultsChannelAlias\n ? aliases[defaultsChannelAlias]\n : undefined;\n const defaultProviderId =\n readString(defaultAliasEntry?.providerId) ??\n readString(this.config.routing?.defaultProviderId) ??\n selectSingleProviderId(this.config.providers);\n\n const defaultsSenderKey =\n readString(defaultsKakao?.senderKey) ??\n readString(defaultAliasEntry?.senderKey);\n const defaultsPlusId =\n readString(defaultsKakao?.plusId) ??\n readString(defaultAliasEntry?.plusId);\n\n if (defaultProviderId && (defaultsSenderKey || defaultsPlusId)) {\n pushUnique({\n source: \"config\",\n ...(defaultsChannelAlias ? { alias: defaultsChannelAlias } : {}),\n providerId: defaultProviderId,\n ...(defaultsSenderKey ? { senderKey: defaultsSenderKey } : {}),\n ...(defaultsPlusId ? { plusId: defaultsPlusId } : {}),\n ...(readString(defaultAliasEntry?.name)\n ? { name: readString(defaultAliasEntry?.name) }\n : {}),\n });\n }\n\n for (const provider of this.config.providers ?? []) {\n const providerId = readString(provider.id);\n if (!providerId) continue;\n\n const hint = extractProviderBindingHint(provider);\n if (!hint.senderKey && !hint.plusId) continue;\n\n pushUnique({\n source: \"config\",\n providerId,\n ...(hint.senderKey ? { senderKey: hint.senderKey } : {}),\n ...(hint.plusId ? { plusId: hint.plusId } : {}),\n });\n }\n\n return items;\n }\n\n resolve(input?: KakaoChannelResolveInput): ResolvedKakaoChannelBinding {\n const aliases = this.config.aliases?.kakaoChannels ?? {};\n\n const channelAlias = readString(input?.channelAlias);\n const aliasEntry = channelAlias ? aliases[channelAlias] : undefined;\n\n if (channelAlias && input?.strictAlias === true && !aliasEntry) {\n throw new KMsgError(\n KMsgErrorCode.INVALID_REQUEST,\n `Unknown kakao channel alias: ${channelAlias}`,\n );\n }\n\n const defaultsKakao = this.config.defaults?.kakao;\n const defaultsChannelAlias = readString(defaultsKakao?.channel);\n const defaultAliasEntry = defaultsChannelAlias\n ? aliases[defaultsChannelAlias]\n : undefined;\n\n const explicitProviderId = readString(input?.providerId);\n const aliasProviderId = readString(aliasEntry?.providerId);\n const defaultsProviderId = readString(defaultAliasEntry?.providerId);\n const routingDefaultProviderId = readString(\n this.config.routing?.defaultProviderId,\n );\n const singleProviderId = selectSingleProviderId(this.config.providers);\n\n let providerId: string | undefined;\n let providerIdSource: KakaoChannelBindingSource = \"unknown\";\n\n if (explicitProviderId) {\n providerId = explicitProviderId;\n providerIdSource = \"explicit\";\n } else if (aliasProviderId) {\n providerId = aliasProviderId;\n providerIdSource = \"alias\";\n } else if (defaultsProviderId) {\n providerId = defaultsProviderId;\n providerIdSource = \"defaults\";\n } else if (routingDefaultProviderId) {\n providerId = routingDefaultProviderId;\n providerIdSource = \"routing\";\n } else if (singleProviderId) {\n providerId = singleProviderId;\n providerIdSource = \"single_provider\";\n }\n\n const providerEntry = providerId\n ? (this.config.providers ?? []).find((entry) => entry.id === providerId)\n : undefined;\n const providerHint = providerEntry\n ? extractProviderBindingHint(providerEntry)\n : {};\n\n const explicitSenderKey = readString(input?.senderKey);\n const aliasSenderKey = readString(aliasEntry?.senderKey);\n const defaultsSenderKey = readString(defaultsKakao?.senderKey);\n const defaultAliasSenderKey = readString(defaultAliasEntry?.senderKey);\n const providerHintSenderKey = readString(providerHint.senderKey);\n\n const explicitPlusId = readString(input?.plusId);\n const aliasPlusId = readString(aliasEntry?.plusId);\n const defaultsPlusId = readString(defaultsKakao?.plusId);\n const defaultAliasPlusId = readString(defaultAliasEntry?.plusId);\n const providerHintPlusId = readString(providerHint.plusId);\n\n let senderKey: string | undefined;\n let senderKeySource: KakaoChannelBindingSource | undefined;\n\n if (explicitSenderKey) {\n senderKey = explicitSenderKey;\n senderKeySource = \"explicit\";\n } else if (aliasSenderKey) {\n senderKey = aliasSenderKey;\n senderKeySource = \"alias\";\n } else if (defaultsSenderKey) {\n senderKey = defaultsSenderKey;\n senderKeySource = \"defaults\";\n } else if (defaultAliasSenderKey) {\n senderKey = defaultAliasSenderKey;\n senderKeySource = \"defaults\";\n } else if (providerHintSenderKey) {\n senderKey = providerHintSenderKey;\n senderKeySource = \"provider_config\";\n }\n\n let plusId: string | undefined;\n let plusIdSource: KakaoChannelBindingSource | undefined;\n\n if (explicitPlusId) {\n plusId = explicitPlusId;\n plusIdSource = \"explicit\";\n } else if (aliasPlusId) {\n plusId = aliasPlusId;\n plusIdSource = \"alias\";\n } else if (defaultsPlusId) {\n plusId = defaultsPlusId;\n plusIdSource = \"defaults\";\n } else if (defaultAliasPlusId) {\n plusId = defaultAliasPlusId;\n plusIdSource = \"defaults\";\n } else if (providerHintPlusId) {\n plusId = providerHintPlusId;\n plusIdSource = \"provider_config\";\n }\n\n return {\n ...(channelAlias ? { alias: channelAlias } : {}),\n ...(providerId ? { providerId } : {}),\n ...(normalizeProviderType(providerEntry?.type)\n ? { providerType: normalizeProviderType(providerEntry?.type) }\n : {}),\n ...(senderKey ? { senderKey } : {}),\n ...(plusId ? { plusId } : {}),\n ...(readString(aliasEntry?.name)\n ? { name: readString(aliasEntry?.name) }\n : readString(defaultAliasEntry?.name)\n ? { name: readString(defaultAliasEntry?.name) }\n : {}),\n providerIdSource,\n ...(senderKeySource ? { senderKeySource } : {}),\n ...(plusIdSource ? { plusIdSource } : {}),\n };\n }\n\n getAlias(alias: string): KakaoChannelAliasEntry | undefined {\n const normalized = readString(alias);\n if (!normalized) return undefined;\n return this.config.aliases?.kakaoChannels?.[normalized];\n }\n}\n",
8
8
  "import type { ProviderOnboardingSpec } from \"@k-msg/core\";\nimport type {\n KakaoChannelCapability,\n KakaoChannelCapabilityMode,\n KakaoChannelRuntimeProvider,\n} from \"./types\";\n\nfunction hasFunction(value: unknown): value is (...args: unknown[]) => unknown {\n return typeof value === \"function\";\n}\n\nfunction tryGetOnboardingSpec(\n provider: KakaoChannelRuntimeProvider,\n): ProviderOnboardingSpec | undefined {\n if (!hasFunction(provider.getOnboardingSpec)) {\n return undefined;\n }\n\n try {\n return provider.getOnboardingSpec();\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeProviderType(value: string | undefined): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed.toLowerCase() : undefined;\n}\n\nfunction inferMode(\n spec: ProviderOnboardingSpec | undefined,\n supportsList: boolean,\n): KakaoChannelCapabilityMode {\n if (spec?.channelOnboarding) {\n if (spec.channelOnboarding === \"api\" && !supportsList) {\n return \"none\";\n }\n return spec.channelOnboarding;\n }\n\n return supportsList ? \"api\" : \"none\";\n}\n\nexport class KakaoChannelCapabilityService {\n resolve(provider: KakaoChannelRuntimeProvider): KakaoChannelCapability {\n const spec = tryGetOnboardingSpec(provider);\n\n const supports = {\n list: hasFunction(provider.listKakaoChannels),\n categories: hasFunction(provider.listKakaoChannelCategories),\n auth: hasFunction(provider.requestKakaoChannelAuth),\n add: hasFunction(provider.addKakaoChannel),\n };\n\n const providerType = normalizeProviderType(spec?.providerId);\n const mode = inferMode(spec, supports.list);\n\n return {\n providerId: provider.id,\n ...(providerType ? { providerType } : {}),\n mode,\n supports,\n };\n }\n}\n",
@@ -12,7 +12,7 @@
12
12
  "import type {\n KakaoChannelApiOperation,\n KakaoChannelRuntimeProvider,\n} from \"../types\";\n\nexport class SolapiChannelAdapter {\n readonly mode = \"none\" as const;\n\n constructor(private readonly provider: KakaoChannelRuntimeProvider) {}\n\n unsupportedMessage(operation: KakaoChannelApiOperation): string {\n return `Provider '${this.provider.id}' does not expose Kakao channel onboarding API. Operation '${operation}' is unsupported.`;\n }\n}\n",
13
13
  "import {\n fail,\n type KakaoChannel,\n type KakaoChannelCategories,\n KMsgError,\n KMsgErrorCode,\n ok,\n type Result,\n} from \"@k-msg/core\";\nimport { AligoChannelAdapter } from \"./adapters/aligo.adapter\";\nimport { IwinvChannelAdapter } from \"./adapters/iwinv.adapter\";\nimport { MockChannelAdapter } from \"./adapters/mock.adapter\";\nimport { SolapiChannelAdapter } from \"./adapters/solapi.adapter\";\nimport { KakaoChannelCapabilityService } from \"./kakao-channel-capability.service\";\nimport type {\n KakaoChannelAddParams,\n KakaoChannelApiAdapter,\n KakaoChannelApiOperation,\n KakaoChannelAuthParams,\n KakaoChannelCapability,\n KakaoChannelListItem,\n KakaoChannelListParams,\n KakaoChannelRuntimeProvider,\n} from \"./types\";\n\nfunction normalizeProviderType(value: string | undefined): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed.toLowerCase() : undefined;\n}\n\nfunction createApiAdapter(\n providerType: string | undefined,\n provider: KakaoChannelRuntimeProvider,\n): KakaoChannelApiAdapter | undefined {\n switch (providerType) {\n case \"aligo\":\n return new AligoChannelAdapter(provider);\n case \"mock\":\n return new MockChannelAdapter(provider);\n default:\n return typeof provider.listKakaoChannels === \"function\"\n ? new AligoChannelAdapter(provider)\n : undefined;\n }\n}\n\nexport class KakaoChannelLifecycleService {\n private readonly capability: KakaoChannelCapability;\n private readonly providerType?: string;\n private readonly apiAdapter?: KakaoChannelApiAdapter;\n private readonly iwinvAdapter?: IwinvChannelAdapter;\n private readonly solapiAdapter?: SolapiChannelAdapter;\n\n constructor(\n private readonly provider: KakaoChannelRuntimeProvider,\n capabilityService = new KakaoChannelCapabilityService(),\n ) {\n this.capability = capabilityService.resolve(provider);\n this.providerType = normalizeProviderType(this.capability.providerType);\n\n if (this.capability.mode === \"api\") {\n this.apiAdapter = createApiAdapter(this.providerType, this.provider);\n } else if (this.providerType === \"iwinv\") {\n this.iwinvAdapter = new IwinvChannelAdapter(this.provider);\n } else if (this.providerType === \"solapi\") {\n this.solapiAdapter = new SolapiChannelAdapter(this.provider);\n }\n }\n\n getCapability(): KakaoChannelCapability {\n return this.capability;\n }\n\n private unsupported(\n operation: KakaoChannelApiOperation,\n ): Result<never, KMsgError> {\n const message = (() => {\n if (this.capability.mode === \"manual\") {\n if (this.iwinvAdapter) {\n return this.iwinvAdapter.unsupportedMessage(operation);\n }\n return `Provider '${this.provider.id}' requires manual Kakao channel onboarding. Operation '${operation}' is unavailable via API.`;\n }\n\n if (this.capability.mode === \"none\") {\n if (this.solapiAdapter) {\n return this.solapiAdapter.unsupportedMessage(operation);\n }\n return `Provider '${this.provider.id}' does not support Kakao channel onboarding API operation '${operation}'.`;\n }\n\n return `Provider '${this.provider.id}' does not support Kakao channel onboarding API operation '${operation}'.`;\n })();\n\n return fail(\n new KMsgError(KMsgErrorCode.INVALID_REQUEST, message, {\n providerId: this.provider.id,\n mode: this.capability.mode,\n operation,\n }),\n );\n }\n\n private ensureApi(\n operation: KakaoChannelApiOperation,\n ): Result<void, KMsgError> {\n if (this.capability.mode !== \"api\") {\n return this.unsupported(operation);\n }\n\n if (!this.apiAdapter) {\n return fail(\n new KMsgError(\n KMsgErrorCode.INVALID_REQUEST,\n `Provider '${this.provider.id}' is marked as api mode but does not expose kakao channel operations`,\n {\n providerId: this.provider.id,\n mode: this.capability.mode,\n operation,\n },\n ),\n );\n }\n\n return ok(undefined);\n }\n\n async list(\n params?: KakaoChannelListParams,\n ): Promise<Result<KakaoChannelListItem[], KMsgError>> {\n const ready = this.ensureApi(\"list\");\n if (ready.isFailure) return ready;\n const apiAdapter = this.apiAdapter;\n if (!apiAdapter) return this.unsupported(\"list\");\n\n const result = await apiAdapter.list(params);\n if (result.isFailure) return result;\n\n return ok(\n result.value.map((channel) => ({\n source: \"api\" as const,\n providerId: channel.providerId || this.provider.id,\n senderKey: channel.senderKey,\n ...(channel.plusId ? { plusId: channel.plusId } : {}),\n ...(channel.name ? { name: channel.name } : {}),\n ...(channel.status ? { status: channel.status } : {}),\n })),\n );\n }\n\n async categories(): Promise<Result<KakaoChannelCategories, KMsgError>> {\n const ready = this.ensureApi(\"categories\");\n if (ready.isFailure) return ready;\n const apiAdapter = this.apiAdapter;\n if (!apiAdapter) return this.unsupported(\"categories\");\n\n return apiAdapter.categories();\n }\n\n async auth(params: KakaoChannelAuthParams): Promise<Result<void, KMsgError>> {\n const ready = this.ensureApi(\"auth\");\n if (ready.isFailure) return ready;\n const apiAdapter = this.apiAdapter;\n if (!apiAdapter) return this.unsupported(\"auth\");\n\n return apiAdapter.auth(params);\n }\n\n async add(\n params: KakaoChannelAddParams,\n ): Promise<Result<KakaoChannel, KMsgError>> {\n const ready = this.ensureApi(\"add\");\n if (ready.isFailure) return ready;\n const apiAdapter = this.apiAdapter;\n if (!apiAdapter) return this.unsupported(\"add\");\n\n return apiAdapter.add(params);\n }\n}\n"
14
14
  ],
15
- "mappings": "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",
16
- "debugId": "357E12540E70E3C864756E2164756E21",
15
+ "mappings": "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",
16
+ "debugId": "105E788773D1FB2C64756E2164756E21",
17
17
  "names": []
18
18
  }
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- var X=Object.defineProperty;var ie=(e,n)=>{for(var t in n)X(e,t,{get:n[t],enumerable:!0,configurable:!0,set:(s)=>n[t]=()=>s})};class u extends Error{code;details;constructor(e,n,t){super(n);if(this.name="KMsgError",this.code=e,this.details=t,Error.captureStackTrace)Error.captureStackTrace(this,u)}toJSON(){return{name:this.name,code:this.code,message:this.message,details:this.details}}}var S=(e)=>({isSuccess:!0,isFailure:!1,value:e}),l=(e)=>({isSuccess:!1,isFailure:!0,error:e});function i(e){if(typeof e!=="string")return;let n=e.trim();return n.length>0?n:void 0}function w(e){if(!e)return;let n=e.trim();return n.length>0?n.toLowerCase():void 0}function H(e){let n=e.config&&typeof e.config==="object"?e.config:{},t=i(n.senderKey)??i(n.kakaoPfId)??i(n.profileId),s=i(n.plusId);if(w(e.type)==="solapi")return{senderKey:i(n.kakaoPfId)??t,...s?{plusId:s}:{}};return{...t?{senderKey:t}:{},...s?{plusId:s}:{}}}function G(e){return[e.providerId??"",e.senderKey??"",e.plusId??"",e.source].join("|")}function V(e){if(!Array.isArray(e)||e.length!==1)return;return i(e[0]?.id)}class ${config;constructor(e){this.config=e}list(e){let n=i(e?.providerId),t=this.config.aliases?.kakaoChannels??{},s=[],r=new Set,C=(a)=>{if(n&&a.providerId!==n)return;let o=G(a);if(r.has(o))return;r.add(o),s.push(a)};for(let[a,o]of Object.entries(t)){let d=i(o.providerId);if(!d)continue;let k=i(o.senderKey),O=i(o.plusId);if(!k&&!O)continue;C({source:"config",alias:a,providerId:d,...k?{senderKey:k}:{},...O?{plusId:O}:{},...i(o.name)?{name:i(o.name)}:{}})}let f=this.config.defaults?.kakao,p=i(f?.channel),c=p?t[p]:void 0,T=i(c?.providerId)??i(this.config.routing?.defaultProviderId)??V(this.config.providers),K=i(f?.senderKey)??i(c?.senderKey),R=i(f?.plusId)??i(c?.plusId);if(T&&(K||R))C({source:"config",...p?{alias:p}:{},providerId:T,...K?{senderKey:K}:{},...R?{plusId:R}:{},...i(c?.name)?{name:i(c?.name)}:{}});for(let a of this.config.providers??[]){let o=i(a.id);if(!o)continue;let d=H(a);if(!d.senderKey&&!d.plusId)continue;C({source:"config",providerId:o,...d.senderKey?{senderKey:d.senderKey}:{},...d.plusId?{plusId:d.plusId}:{}})}return s}resolve(e){let n=this.config.aliases?.kakaoChannels??{},t=i(e?.channelAlias),s=t?n[t]:void 0;if(t&&e?.strictAlias===!0&&!s)throw new u("INVALID_REQUEST",`Unknown kakao channel alias: ${t}`);let r=this.config.defaults?.kakao,C=i(r?.channel),f=C?n[C]:void 0,p=i(e?.providerId),c=i(s?.providerId),T=i(f?.providerId),K=i(this.config.routing?.defaultProviderId),R=V(this.config.providers),a,o="unknown";if(p)a=p,o="explicit";else if(c)a=c,o="alias";else if(T)a=T,o="defaults";else if(K)a=K,o="routing";else if(R)a=R,o="single_provider";let d=a?(this.config.providers??[]).find((j)=>j.id===a):void 0,k=d?H(d):{},O=i(e?.senderKey),_=i(s?.senderKey),b=i(r?.senderKey),B=i(f?.senderKey),F=i(k.senderKey),x=i(e?.plusId),q=i(s?.plusId),U=i(r?.plusId),L=i(f?.plusId),W=i(k.plusId),h,m;if(O)h=O,m="explicit";else if(_)h=_,m="alias";else if(b)h=b,m="defaults";else if(B)h=B,m="defaults";else if(F)h=F,m="provider_config";let I,E;if(x)I=x,E="explicit";else if(q)I=q,E="alias";else if(U)I=U,E="defaults";else if(L)I=L,E="defaults";else if(W)I=W,E="provider_config";return{...t?{alias:t}:{},...a?{providerId:a}:{},...w(d?.type)?{providerType:w(d?.type)}:{},...h?{senderKey:h}:{},...I?{plusId:I}:{},...i(s?.name)?{name:i(s?.name)}:i(f?.name)?{name:i(f?.name)}:{},providerIdSource:o,...m?{senderKeySource:m}:{},...E?{plusIdSource:E}:{}}}getAlias(e){let n=i(e);if(!n)return;return this.config.aliases?.kakaoChannels?.[n]}}function A(e){return typeof e==="function"}function J(e){if(!A(e.getOnboardingSpec))return;try{return e.getOnboardingSpec()}catch{return}}function Y(e){if(typeof e!=="string")return;let n=e.trim();return n.length>0?n.toLowerCase():void 0}function Z(e,n){if(e?.channelOnboarding){if(e.channelOnboarding==="api"&&!n)return"none";return e.channelOnboarding}return n?"api":"none"}class v{resolve(e){let n=J(e),t={list:A(e.listKakaoChannels),categories:A(e.listKakaoChannelCategories),auth:A(e.requestKakaoChannelAuth),add:A(e.addKakaoChannel)},s=Y(n?.providerId),r=Z(n,t.list);return{providerId:e.id,...s?{providerType:s}:{},mode:r,supports:t}}}function g(e,n){return new u("INVALID_REQUEST",`Provider '${e}' does not support kakao channel api operation '${n}'`,{providerId:e,operation:n})}class P{provider;constructor(e){this.provider=e}async list(e){let n=this.provider.listKakaoChannels;if(typeof n!=="function")return l(g(this.provider.id,"list"));return n.call(this.provider,e)}async categories(){let e=this.provider.listKakaoChannelCategories;if(typeof e!=="function")return l(g(this.provider.id,"categories"));return e.call(this.provider)}async auth(e){let n=this.provider.requestKakaoChannelAuth;if(typeof n!=="function")return l(g(this.provider.id,"auth"));return n.call(this.provider,e)}async add(e){let n=this.provider.addKakaoChannel;if(typeof n!=="function")return l(g(this.provider.id,"add"));return n.call(this.provider,e)}}class N{provider;mode="manual";constructor(e){this.provider=e}unsupportedMessage(e){return`Provider '${this.provider.id}' uses manual Kakao channel onboarding. Operation '${e}' is not available via API.`}}class D extends P{constructor(e){super(e)}}class M{provider;mode="none";constructor(e){this.provider=e}unsupportedMessage(e){return`Provider '${this.provider.id}' does not expose Kakao channel onboarding API. Operation '${e}' is unsupported.`}}function ee(e){if(typeof e!=="string")return;let n=e.trim();return n.length>0?n.toLowerCase():void 0}function ne(e,n){switch(e){case"aligo":return new P(n);case"mock":return new D(n);default:return typeof n.listKakaoChannels==="function"?new P(n):void 0}}class Q{provider;capability;providerType;apiAdapter;iwinvAdapter;solapiAdapter;constructor(e,n=new v){this.provider=e;if(this.capability=n.resolve(e),this.providerType=ee(this.capability.providerType),this.capability.mode==="api")this.apiAdapter=ne(this.providerType,this.provider);else if(this.providerType==="iwinv")this.iwinvAdapter=new N(this.provider);else if(this.providerType==="solapi")this.solapiAdapter=new M(this.provider)}getCapability(){return this.capability}unsupported(e){let n=(()=>{if(this.capability.mode==="manual"){if(this.iwinvAdapter)return this.iwinvAdapter.unsupportedMessage(e);return`Provider '${this.provider.id}' requires manual Kakao channel onboarding. Operation '${e}' is unavailable via API.`}if(this.capability.mode==="none"){if(this.solapiAdapter)return this.solapiAdapter.unsupportedMessage(e);return`Provider '${this.provider.id}' does not support Kakao channel onboarding API operation '${e}'.`}return`Provider '${this.provider.id}' does not support Kakao channel onboarding API operation '${e}'.`})();return l(new u("INVALID_REQUEST",n,{providerId:this.provider.id,mode:this.capability.mode,operation:e}))}ensureApi(e){if(this.capability.mode!=="api")return this.unsupported(e);if(!this.apiAdapter)return l(new u("INVALID_REQUEST",`Provider '${this.provider.id}' is marked as api mode but does not expose kakao channel operations`,{providerId:this.provider.id,mode:this.capability.mode,operation:e}));return S(void 0)}async list(e){let n=this.ensureApi("list");if(n.isFailure)return n;let t=this.apiAdapter;if(!t)return this.unsupported("list");let s=await t.list(e);if(s.isFailure)return s;return S(s.value.map((r)=>({source:"api",providerId:r.providerId||this.provider.id,senderKey:r.senderKey,...r.plusId?{plusId:r.plusId}:{},...r.name?{name:r.name}:{},...r.status?{status:r.status}:{}})))}async categories(){let e=this.ensureApi("categories");if(e.isFailure)return e;let n=this.apiAdapter;if(!n)return this.unsupported("categories");return n.categories()}async auth(e){let n=this.ensureApi("auth");if(n.isFailure)return n;let t=this.apiAdapter;if(!t)return this.unsupported("auth");return t.auth(e)}async add(e){let n=this.ensureApi("add");if(n.isFailure)return n;let t=this.apiAdapter;if(!t)return this.unsupported("add");return t.add(e)}}export{Q as KakaoChannelLifecycleService,v as KakaoChannelCapabilityService,$ as KakaoChannelBindingResolver};
1
+ var G=Object.defineProperty;var sn=(n,i)=>{for(var s in i)G(n,s,{get:i[s],enumerable:!0,configurable:!0,set:(t)=>i[s]=()=>t})};var y=(n)=>{if(typeof n!=="number"||Number.isNaN(n)||!Number.isFinite(n))return;return Math.trunc(n)};class f extends Error{code;details;providerErrorCode;providerErrorText;httpStatus;requestId;retryAfterMs;attempt;causeChain;constructor(n,i,s,t={}){super(i);if(this.name="KMsgError",this.code=n,this.details=s,this.providerErrorCode=t.providerErrorCode,this.providerErrorText=t.providerErrorText,this.httpStatus=y(t.httpStatus),this.requestId=typeof t.requestId==="string"?t.requestId:void 0,this.retryAfterMs=y(t.retryAfterMs),this.attempt=y(t.attempt),Array.isArray(t.causeChain))this.causeChain=t.causeChain;else if(t.causeChain!==void 0)this.causeChain=[t.causeChain];if(Error.captureStackTrace)Error.captureStackTrace(this,f)}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 b=(n)=>({isSuccess:!0,isFailure:!1,value:n}),p=(n)=>({isSuccess:!1,isFailure:!0,error:n});function e(n){if(typeof n!=="string")return;let i=n.trim();return i.length>0?i:void 0}function D(n){if(!n)return;let i=n.trim();return i.length>0?i.toLowerCase():void 0}function W(n){let i=n.config&&typeof n.config==="object"?n.config:{},s=e(i.senderKey)??e(i.kakaoPfId)??e(i.profileId),t=e(i.plusId);if(D(n.type)==="solapi")return{senderKey:e(i.kakaoPfId)??s,...t?{plusId:t}:{}};return{...s?{senderKey:s}:{},...t?{plusId:t}:{}}}function _(n){return[n.providerId??"",n.senderKey??"",n.plusId??"",n.source].join("|")}function V(n){if(!Array.isArray(n)||n.length!==1)return;return e(n[0]?.id)}class J{config;constructor(n){this.config=n}list(n){let i=e(n?.providerId),s=this.config.aliases?.kakaoChannels??{},t=[],o=new Set,I=(a)=>{if(i&&a.providerId!==i)return;let d=_(a);if(o.has(d))return;o.add(d),t.push(a)};for(let[a,d]of Object.entries(s)){let u=e(d.providerId);if(!u)continue;let O=e(d.senderKey),w=e(d.plusId);if(!O&&!w)continue;I({source:"config",alias:a,providerId:u,...O?{senderKey:O}:{},...w?{plusId:w}:{},...e(d.name)?{name:e(d.name)}:{}})}let r=this.config.defaults?.kakao,c=e(r?.channel),h=c?s[c]:void 0,v=e(h?.providerId)??e(this.config.routing?.defaultProviderId)??V(this.config.providers),C=e(r?.senderKey)??e(h?.senderKey),P=e(r?.plusId)??e(h?.plusId);if(v&&(C||P))I({source:"config",...c?{alias:c}:{},providerId:v,...C?{senderKey:C}:{},...P?{plusId:P}:{},...e(h?.name)?{name:e(h?.name)}:{}});for(let a of this.config.providers??[]){let d=e(a.id);if(!d)continue;let u=W(a);if(!u.senderKey&&!u.plusId)continue;I({source:"config",providerId:d,...u.senderKey?{senderKey:u.senderKey}:{},...u.plusId?{plusId:u.plusId}:{}})}return t}resolve(n){let i=this.config.aliases?.kakaoChannels??{},s=e(n?.channelAlias),t=s?i[s]:void 0;if(s&&n?.strictAlias===!0&&!t)throw new f("INVALID_REQUEST",`Unknown kakao channel alias: ${s}`);let o=this.config.defaults?.kakao,I=e(o?.channel),r=I?i[I]:void 0,c=e(n?.providerId),h=e(t?.providerId),v=e(r?.providerId),C=e(this.config.routing?.defaultProviderId),P=V(this.config.providers),a,d="unknown";if(c)a=c,d="explicit";else if(h)a=h,d="alias";else if(v)a=v,d="defaults";else if(C)a=C,d="routing";else if(P)a=P,d="single_provider";let u=a?(this.config.providers??[]).find((Z)=>Z.id===a):void 0,O=u?W(u):{},w=e(n?.senderKey),x=e(t?.senderKey),M=e(o?.senderKey),F=e(r?.senderKey),N=e(O.senderKey),H=e(n?.plusId),$=e(t?.plusId),j=e(o?.plusId),Q=e(r?.plusId),U=e(O.plusId),l,m;if(w)l=w,m="explicit";else if(x)l=x,m="alias";else if(M)l=M,m="defaults";else if(F)l=F,m="defaults";else if(N)l=N,m="provider_config";let k,K;if(H)k=H,K="explicit";else if($)k=$,K="alias";else if(j)k=j,K="defaults";else if(Q)k=Q,K="defaults";else if(U)k=U,K="provider_config";return{...s?{alias:s}:{},...a?{providerId:a}:{},...D(u?.type)?{providerType:D(u?.type)}:{},...l?{senderKey:l}:{},...k?{plusId:k}:{},...e(t?.name)?{name:e(t?.name)}:e(r?.name)?{name:e(r?.name)}:{},providerIdSource:d,...m?{senderKeySource:m}:{},...K?{plusIdSource:K}:{}}}getAlias(n){let i=e(n);if(!i)return;return this.config.aliases?.kakaoChannels?.[i]}}function A(n){return typeof n==="function"}function L(n){if(!A(n.getOnboardingSpec))return;try{return n.getOnboardingSpec()}catch{return}}function z(n){if(typeof n!=="string")return;let i=n.trim();return i.length>0?i.toLowerCase():void 0}function nn(n,i){if(n?.channelOnboarding){if(n.channelOnboarding==="api"&&!i)return"none";return n.channelOnboarding}return i?"api":"none"}class T{resolve(n){let i=L(n),s={list:A(n.listKakaoChannels),categories:A(n.listKakaoChannelCategories),auth:A(n.requestKakaoChannelAuth),add:A(n.addKakaoChannel)},t=z(i?.providerId),o=nn(i,s.list);return{providerId:n.id,...t?{providerType:t}:{},mode:o,supports:s}}}function g(n,i){return new f("INVALID_REQUEST",`Provider '${n}' does not support kakao channel api operation '${i}'`,{providerId:n,operation:i})}class R{provider;constructor(n){this.provider=n}async list(n){let i=this.provider.listKakaoChannels;if(typeof i!=="function")return p(g(this.provider.id,"list"));return i.call(this.provider,n)}async categories(){let n=this.provider.listKakaoChannelCategories;if(typeof n!=="function")return p(g(this.provider.id,"categories"));return n.call(this.provider)}async auth(n){let i=this.provider.requestKakaoChannelAuth;if(typeof i!=="function")return p(g(this.provider.id,"auth"));return i.call(this.provider,n)}async add(n){let i=this.provider.addKakaoChannel;if(typeof i!=="function")return p(g(this.provider.id,"add"));return i.call(this.provider,n)}}class E{provider;mode="manual";constructor(n){this.provider=n}unsupportedMessage(n){return`Provider '${this.provider.id}' uses manual Kakao channel onboarding. Operation '${n}' is not available via API.`}}class q extends R{constructor(n){super(n)}}class B{provider;mode="none";constructor(n){this.provider=n}unsupportedMessage(n){return`Provider '${this.provider.id}' does not expose Kakao channel onboarding API. Operation '${n}' is unsupported.`}}function en(n){if(typeof n!=="string")return;let i=n.trim();return i.length>0?i.toLowerCase():void 0}function tn(n,i){switch(n){case"aligo":return new R(i);case"mock":return new q(i);default:return typeof i.listKakaoChannels==="function"?new R(i):void 0}}class X{provider;capability;providerType;apiAdapter;iwinvAdapter;solapiAdapter;constructor(n,i=new T){this.provider=n;if(this.capability=i.resolve(n),this.providerType=en(this.capability.providerType),this.capability.mode==="api")this.apiAdapter=tn(this.providerType,this.provider);else if(this.providerType==="iwinv")this.iwinvAdapter=new E(this.provider);else if(this.providerType==="solapi")this.solapiAdapter=new B(this.provider)}getCapability(){return this.capability}unsupported(n){let i=(()=>{if(this.capability.mode==="manual"){if(this.iwinvAdapter)return this.iwinvAdapter.unsupportedMessage(n);return`Provider '${this.provider.id}' requires manual Kakao channel onboarding. Operation '${n}' is unavailable via API.`}if(this.capability.mode==="none"){if(this.solapiAdapter)return this.solapiAdapter.unsupportedMessage(n);return`Provider '${this.provider.id}' does not support Kakao channel onboarding API operation '${n}'.`}return`Provider '${this.provider.id}' does not support Kakao channel onboarding API operation '${n}'.`})();return p(new f("INVALID_REQUEST",i,{providerId:this.provider.id,mode:this.capability.mode,operation:n}))}ensureApi(n){if(this.capability.mode!=="api")return this.unsupported(n);if(!this.apiAdapter)return p(new f("INVALID_REQUEST",`Provider '${this.provider.id}' is marked as api mode but does not expose kakao channel operations`,{providerId:this.provider.id,mode:this.capability.mode,operation:n}));return b(void 0)}async list(n){let i=this.ensureApi("list");if(i.isFailure)return i;let s=this.apiAdapter;if(!s)return this.unsupported("list");let t=await s.list(n);if(t.isFailure)return t;return b(t.value.map((o)=>({source:"api",providerId:o.providerId||this.provider.id,senderKey:o.senderKey,...o.plusId?{plusId:o.plusId}:{},...o.name?{name:o.name}:{},...o.status?{status:o.status}:{}})))}async categories(){let n=this.ensureApi("categories");if(n.isFailure)return n;let i=this.apiAdapter;if(!i)return this.unsupported("categories");return i.categories()}async auth(n){let i=this.ensureApi("auth");if(i.isFailure)return i;let s=this.apiAdapter;if(!s)return this.unsupported("auth");return s.auth(n)}async add(n){let i=this.ensureApi("add");if(i.isFailure)return i;let s=this.apiAdapter;if(!s)return this.unsupported("add");return s.add(n)}}export{X as KakaoChannelLifecycleService,T as KakaoChannelCapabilityService,J as KakaoChannelBindingResolver};
2
2
 
3
- //# debugId=89836C7514909FB964756E2164756E21
3
+ //# debugId=9C8FA470F9B9A9F164756E2164756E21
4
4
  //# sourceMappingURL=index.mjs.map
@@ -2,7 +2,7 @@
2
2
  "version": 3,
3
3
  "sources": ["../../core/src/errors.ts", "../../core/src/result.ts", "../src/runtime/kakao-channel-binding-resolver.ts", "../src/runtime/kakao-channel-capability.service.ts", "../src/runtime/adapters/aligo.adapter.ts", "../src/runtime/adapters/iwinv.adapter.ts", "../src/runtime/adapters/mock.adapter.ts", "../src/runtime/adapters/solapi.adapter.ts", "../src/runtime/kakao-channel-lifecycle.service.ts"],
4
4
  "sourcesContent": [
5
- "export enum KMsgErrorCode {\n INVALID_REQUEST = \"INVALID_REQUEST\",\n AUTHENTICATION_FAILED = \"AUTHENTICATION_FAILED\",\n INSUFFICIENT_BALANCE = \"INSUFFICIENT_BALANCE\",\n TEMPLATE_NOT_FOUND = \"TEMPLATE_NOT_FOUND\",\n RATE_LIMIT_EXCEEDED = \"RATE_LIMIT_EXCEEDED\",\n NETWORK_ERROR = \"NETWORK_ERROR\",\n NETWORK_TIMEOUT = \"NETWORK_TIMEOUT\",\n NETWORK_SERVICE_UNAVAILABLE = \"NETWORK_SERVICE_UNAVAILABLE\",\n PROVIDER_ERROR = \"PROVIDER_ERROR\",\n MESSAGE_SEND_FAILED = \"MESSAGE_SEND_FAILED\",\n UNKNOWN_ERROR = \"UNKNOWN_ERROR\",\n}\n\nexport class KMsgError extends Error {\n public readonly code: KMsgErrorCode;\n public readonly details?: Record<string, any>;\n\n constructor(\n code: KMsgErrorCode,\n message: string,\n details?: Record<string, any>,\n ) {\n super(message);\n this.name = \"KMsgError\";\n this.code = code;\n this.details = details;\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, KMsgError);\n }\n }\n\n toJSON() {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n details: this.details,\n };\n }\n}\n\nexport const ErrorUtils = {\n isRetryable: (error: any): boolean => {\n if (error instanceof KMsgError) {\n return [\n KMsgErrorCode.NETWORK_ERROR,\n KMsgErrorCode.RATE_LIMIT_EXCEEDED,\n KMsgErrorCode.PROVIDER_ERROR,\n ].includes(error.code);\n }\n return false;\n },\n};\n",
5
+ "export enum KMsgErrorCode {\n INVALID_REQUEST = \"INVALID_REQUEST\",\n AUTHENTICATION_FAILED = \"AUTHENTICATION_FAILED\",\n INSUFFICIENT_BALANCE = \"INSUFFICIENT_BALANCE\",\n TEMPLATE_NOT_FOUND = \"TEMPLATE_NOT_FOUND\",\n RATE_LIMIT_EXCEEDED = \"RATE_LIMIT_EXCEEDED\",\n NETWORK_ERROR = \"NETWORK_ERROR\",\n NETWORK_TIMEOUT = \"NETWORK_TIMEOUT\",\n NETWORK_SERVICE_UNAVAILABLE = \"NETWORK_SERVICE_UNAVAILABLE\",\n PROVIDER_ERROR = \"PROVIDER_ERROR\",\n MESSAGE_SEND_FAILED = \"MESSAGE_SEND_FAILED\",\n UNKNOWN_ERROR = \"UNKNOWN_ERROR\",\n}\n\nexport type RetryPolicyErrorCode = KMsgErrorCode;\n\nexport type ProviderRetryHint = \"retryable\" | \"non_retryable\";\n\nexport interface KMsgErrorMetadata {\n providerErrorCode?: string;\n providerErrorText?: string;\n httpStatus?: number;\n requestId?: string;\n retryAfterMs?: number;\n attempt?: number;\n causeChain?: unknown[];\n}\n\nexport interface ErrorRetryPolicy {\n retryableCodes?: readonly KMsgErrorCode[];\n nonRetryableCodes?: readonly KMsgErrorCode[];\n classifyByStatusCode?: (status: number) => ProviderRetryHint;\n classifyByMessage?: (message: string) => ProviderRetryHint | undefined;\n /**\n * Optional override for retry hint inference.\n */\n fallback?: ProviderRetryHint;\n /**\n * Optional custom retry delay in milliseconds.\n */\n retryAfterMs?: (error: KMsgError) => number | undefined;\n}\n\nconst DEFAULT_RETRYABLE_ERROR_CODES: ReadonlySet<RetryPolicyErrorCode> = new Set([\n KMsgErrorCode.NETWORK_ERROR,\n KMsgErrorCode.RATE_LIMIT_EXCEEDED,\n KMsgErrorCode.NETWORK_TIMEOUT,\n KMsgErrorCode.NETWORK_SERVICE_UNAVAILABLE,\n KMsgErrorCode.PROVIDER_ERROR,\n KMsgErrorCode.UNKNOWN_ERROR,\n]);\n\nconst DEFAULT_NON_RETRYABLE_ERROR_CODES: ReadonlySet<RetryPolicyErrorCode> = new Set([\n KMsgErrorCode.INVALID_REQUEST,\n KMsgErrorCode.AUTHENTICATION_FAILED,\n KMsgErrorCode.INSUFFICIENT_BALANCE,\n KMsgErrorCode.TEMPLATE_NOT_FOUND,\n KMsgErrorCode.MESSAGE_SEND_FAILED,\n]);\n\nconst normalizeNumber = (value: unknown): number | undefined => {\n if (typeof value !== \"number\" || Number.isNaN(value) || !Number.isFinite(value)) {\n return undefined;\n }\n\n return Math.trunc(value);\n};\n\nexport const normalizeRetryAfterMs = (value: unknown): number | undefined => {\n const normalized = normalizeNumber(value);\n if (normalized === undefined || normalized < 0) {\n return undefined;\n }\n\n return normalized;\n};\n\nconst toLowerString = (value: unknown): string | undefined => {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n return value.toLowerCase().trim();\n};\n\nconst classifyByHttpStatus = (status: number): ProviderRetryHint => {\n if (status >= 500) {\n return \"retryable\";\n }\n\n if (status === 408 || status === 425 || status === 429) {\n return \"retryable\";\n }\n\n return \"non_retryable\";\n};\n\nconst classifyByMessage = (message: string): ProviderRetryHint | undefined => {\n const normalized = message.toLowerCase();\n\n if (normalized.includes(\"timeout\") || normalized.includes(\"temporar\") || normalized.includes(\"network\") || normalized.includes(\"retry\")) {\n return \"retryable\";\n }\n\n return undefined;\n};\n\nexport class KMsgError extends Error {\n public readonly code: KMsgErrorCode;\n public readonly details?: Record<string, any>;\n public readonly providerErrorCode?: string;\n public readonly providerErrorText?: string;\n public readonly httpStatus?: number;\n public readonly requestId?: string;\n public readonly retryAfterMs?: number;\n public readonly attempt?: number;\n public readonly causeChain?: unknown[];\n\n constructor(\n code: KMsgErrorCode,\n message: string,\n details?: Record<string, any>,\n metadata: KMsgErrorMetadata = {},\n ) {\n super(message);\n this.name = \"KMsgError\";\n this.code = code;\n this.details = details;\n\n this.providerErrorCode = metadata.providerErrorCode;\n this.providerErrorText = metadata.providerErrorText;\n this.httpStatus = normalizeNumber(metadata.httpStatus);\n this.requestId = typeof metadata.requestId === \"string\" ? metadata.requestId : undefined;\n this.retryAfterMs = normalizeNumber(metadata.retryAfterMs);\n this.attempt = normalizeNumber(metadata.attempt);\n\n if (Array.isArray(metadata.causeChain)) {\n this.causeChain = metadata.causeChain;\n } else if (metadata.causeChain !== undefined) {\n this.causeChain = [metadata.causeChain];\n }\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, KMsgError);\n }\n }\n\n toJSON() {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n details: this.details,\n providerErrorCode: this.providerErrorCode,\n providerErrorText: this.providerErrorText,\n httpStatus: this.httpStatus,\n requestId: this.requestId,\n retryAfterMs: this.retryAfterMs,\n attempt: this.attempt,\n causeChain: this.causeChain,\n };\n }\n}\n\nexport const ErrorUtils = {\n isRetryable(error: any, policy: ErrorRetryPolicy = {}): boolean {\n return ErrorUtils.classifyForRetry(error, policy) === \"retryable\";\n },\n\n classifyForRetry(\n error: any,\n policy: ErrorRetryPolicy = {},\n ): ProviderRetryHint {\n if (error instanceof KMsgError) {\n const retryableCodes = new Set(\n policy.retryableCodes ?? Array.from(DEFAULT_RETRYABLE_ERROR_CODES),\n );\n if (retryableCodes.has(error.code)) {\n return \"retryable\";\n }\n\n const nonRetryableCodes = new Set(\n policy.nonRetryableCodes ?? Array.from(DEFAULT_NON_RETRYABLE_ERROR_CODES),\n );\n if (nonRetryableCodes.has(error.code)) {\n return \"non_retryable\";\n }\n\n if (error.httpStatus !== undefined) {\n return classifyByHttpStatus(error.httpStatus);\n }\n\n const classifiedByMessage = classifyByMessage(error.message);\n if (classifiedByMessage) {\n return classifiedByMessage;\n }\n\n if (policy.classifyByMessage && error.message) {\n const classified = policy.classifyByMessage(error.message);\n if (classified) {\n return classified;\n }\n }\n\n if (policy.fallback) {\n return policy.fallback;\n }\n\n return \"non_retryable\";\n }\n\n const status = toLowerString(error?.status) ?? toLowerString(error?.statusCode) ?? toLowerString(error?.code);\n const statusCode = normalizeNumber(error?.status) ??\n normalizeNumber(error?.statusCode) ??\n normalizeNumber(error?.httpStatus);\n\n if (typeof status === \"string\" && status.startsWith(\"5\")) {\n return \"retryable\";\n }\n\n if (statusCode !== undefined) {\n if (policy.classifyByStatusCode) {\n return policy.classifyByStatusCode(statusCode);\n }\n\n return classifyByHttpStatus(statusCode);\n }\n\n const classifiedByMessage =\n typeof error?.message === \"string\"\n ? classifyByMessage(error.message)\n : undefined;\n\n if (classifiedByMessage) {\n return classifiedByMessage;\n }\n\n if (policy.classifyByMessage && typeof error?.message === \"string\") {\n const classified = policy.classifyByMessage(error.message);\n if (classified) {\n return classified;\n }\n }\n\n return policy.fallback ?? \"non_retryable\";\n },\n\n resolveRetryAfterMs(\n error: KMsgError,\n policy?: ErrorRetryPolicy,\n ): number | undefined {\n if (policy?.retryAfterMs) {\n const override = policy.retryAfterMs(error);\n const normalized = normalizeRetryAfterMs(override);\n if (normalized !== undefined) {\n return normalized;\n }\n }\n\n if (error.retryAfterMs !== undefined) {\n return normalizeRetryAfterMs(error.retryAfterMs);\n }\n\n if (error.code === KMsgErrorCode.RATE_LIMIT_EXCEEDED && error.retryAfterMs === undefined) {\n return undefined;\n }\n\n return undefined;\n },\n\n isUnknownStatus: (statusCode: number | undefined): boolean => {\n if (statusCode === undefined || Number.isNaN(statusCode) || !Number.isFinite(statusCode)) {\n return false;\n }\n\n return statusCode < 500;\n },\n\n toRetryMetadata(error: KMsgError): KMsgErrorMetadata {\n return {\n providerErrorCode: error.providerErrorCode,\n providerErrorText: error.providerErrorText,\n httpStatus: error.httpStatus,\n requestId: error.requestId,\n retryAfterMs: error.retryAfterMs,\n attempt: error.attempt,\n causeChain: error.causeChain,\n };\n },\n\n withAttempt(\n error: KMsgError,\n attempt: number,\n ): KMsgError {\n return new KMsgError(\n error.code,\n error.message,\n error.details,\n {\n ...ErrorUtils.toRetryMetadata(error),\n attempt: normalizeNumber(attempt),\n },\n );\n },\n\n DEFAULT_RETRYABLE_ERROR_CODES,\n DEFAULT_NON_RETRYABLE_ERROR_CODES,\n};\n",
6
6
  "export type Ok<T> = {\n readonly isSuccess: true;\n readonly isFailure: false;\n readonly value: T;\n};\n\nexport type Fail<E> = {\n readonly isSuccess: false;\n readonly isFailure: true;\n readonly error: E;\n};\n\nexport type Result<T, E = Error> = Ok<T> | Fail<E>;\n\nexport const ok = <T>(value: T): Ok<T> => ({\n isSuccess: true,\n isFailure: false,\n value,\n});\n\nexport const fail = <E>(error: E): Fail<E> => ({\n isSuccess: false,\n isFailure: true,\n error,\n});\n\n/**\n * Result utility functions for chaining and transformation\n */\nexport const Result = {\n /**\n * Transform the success value of a Result\n */\n map<T, U, E>(result: Result<T, E>, fn: (value: T) => U): Result<U, E> {\n if (result.isSuccess) {\n return ok(fn(result.value));\n }\n return result;\n },\n\n /**\n * Chain Result-returning operations\n */\n flatMap<T, U, E>(\n result: Result<T, E>,\n fn: (value: T) => Result<U, E>,\n ): Result<U, E> {\n if (result.isSuccess) {\n return fn(result.value);\n }\n return result;\n },\n\n /**\n * Transform the error of a Result\n */\n mapError<T, E, F>(result: Result<T, E>, fn: (error: E) => F): Result<T, F> {\n if (result.isFailure) {\n return fail(fn(result.error));\n }\n return result;\n },\n\n /**\n * Extract the value or throw the error\n */\n unwrap<T, E>(result: Result<T, E>): T {\n if (result.isSuccess) {\n return result.value;\n }\n throw result.error;\n },\n\n /**\n * Extract the value or return a default\n */\n unwrapOr<T, E>(result: Result<T, E>, defaultValue: T): T {\n if (result.isSuccess) {\n return result.value;\n }\n return defaultValue;\n },\n\n /**\n * Extract the value or compute a default from the error\n */\n unwrapOrElse<T, E>(result: Result<T, E>, fn: (error: E) => T): T {\n if (result.isSuccess) {\n return result.value;\n }\n return fn(result.error);\n },\n\n /**\n * Pattern match on a Result\n */\n match<T, E, U>(\n result: Result<T, E>,\n handlers: { ok: (value: T) => U; fail: (error: E) => U },\n ): U {\n if (result.isSuccess) {\n return handlers.ok(result.value);\n }\n return handlers.fail(result.error);\n },\n\n /**\n * Convert a Promise to a Result\n */\n async fromPromise<T, E = Error>(promise: Promise<T>): Promise<Result<T, E>> {\n try {\n const value = await promise;\n return ok(value);\n } catch (error) {\n return fail(error as E);\n }\n },\n\n /**\n * Check if a Result is Ok\n */\n isOk<T, E>(result: Result<T, E>): result is Ok<T> {\n return result.isSuccess;\n },\n\n /**\n * Check if a Result is Fail\n */\n isFail<T, E>(result: Result<T, E>): result is Fail<E> {\n return result.isFailure;\n },\n};\n",
7
7
  "import { KMsgError, KMsgErrorCode } from \"@k-msg/core\";\nimport type {\n KakaoChannelAliasEntry,\n KakaoChannelBindingSource,\n KakaoChannelListItem,\n KakaoChannelResolveInput,\n KakaoChannelResolverConfig,\n KakaoProviderConfigEntry,\n ResolvedKakaoChannelBinding,\n} from \"./types\";\n\nfunction readString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction normalizeProviderType(value: string | undefined): string | undefined {\n if (!value) return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed.toLowerCase() : undefined;\n}\n\nfunction extractProviderBindingHint(provider: KakaoProviderConfigEntry): {\n senderKey?: string;\n plusId?: string;\n} {\n const cfg =\n provider.config && typeof provider.config === \"object\"\n ? provider.config\n : {};\n\n const senderKey =\n readString((cfg as Record<string, unknown>).senderKey) ??\n readString((cfg as Record<string, unknown>).kakaoPfId) ??\n readString((cfg as Record<string, unknown>).profileId);\n const plusId = readString((cfg as Record<string, unknown>).plusId);\n\n const providerType = normalizeProviderType(provider.type);\n if (providerType === \"solapi\") {\n return {\n senderKey:\n readString((cfg as Record<string, unknown>).kakaoPfId) ?? senderKey,\n ...(plusId ? { plusId } : {}),\n };\n }\n\n return {\n ...(senderKey ? { senderKey } : {}),\n ...(plusId ? { plusId } : {}),\n };\n}\n\nfunction dedupeKey(item: KakaoChannelListItem): string {\n return [\n item.providerId ?? \"\",\n item.senderKey ?? \"\",\n item.plusId ?? \"\",\n item.source,\n ].join(\"|\");\n}\n\nfunction selectSingleProviderId(\n providers: KakaoProviderConfigEntry[] | undefined,\n): string | undefined {\n if (!Array.isArray(providers) || providers.length !== 1) return undefined;\n return readString(providers[0]?.id);\n}\n\nexport class KakaoChannelBindingResolver {\n constructor(private readonly config: KakaoChannelResolverConfig) {}\n\n list(params?: { providerId?: string }): KakaoChannelListItem[] {\n const requestedProviderId = readString(params?.providerId);\n const aliases = this.config.aliases?.kakaoChannels ?? {};\n const items: KakaoChannelListItem[] = [];\n const seen = new Set<string>();\n\n const pushUnique = (item: KakaoChannelListItem): void => {\n if (requestedProviderId && item.providerId !== requestedProviderId) {\n return;\n }\n const key = dedupeKey(item);\n if (seen.has(key)) {\n return;\n }\n seen.add(key);\n items.push(item);\n };\n\n for (const [alias, entry] of Object.entries(aliases)) {\n const providerId = readString(entry.providerId);\n if (!providerId) continue;\n\n const senderKey = readString(entry.senderKey);\n const plusId = readString(entry.plusId);\n if (!senderKey && !plusId) continue;\n\n pushUnique({\n source: \"config\",\n alias,\n providerId,\n ...(senderKey ? { senderKey } : {}),\n ...(plusId ? { plusId } : {}),\n ...(readString(entry.name) ? { name: readString(entry.name) } : {}),\n });\n }\n\n const defaultsKakao = this.config.defaults?.kakao;\n const defaultsChannelAlias = readString(defaultsKakao?.channel);\n const defaultAliasEntry = defaultsChannelAlias\n ? aliases[defaultsChannelAlias]\n : undefined;\n const defaultProviderId =\n readString(defaultAliasEntry?.providerId) ??\n readString(this.config.routing?.defaultProviderId) ??\n selectSingleProviderId(this.config.providers);\n\n const defaultsSenderKey =\n readString(defaultsKakao?.senderKey) ??\n readString(defaultAliasEntry?.senderKey);\n const defaultsPlusId =\n readString(defaultsKakao?.plusId) ??\n readString(defaultAliasEntry?.plusId);\n\n if (defaultProviderId && (defaultsSenderKey || defaultsPlusId)) {\n pushUnique({\n source: \"config\",\n ...(defaultsChannelAlias ? { alias: defaultsChannelAlias } : {}),\n providerId: defaultProviderId,\n ...(defaultsSenderKey ? { senderKey: defaultsSenderKey } : {}),\n ...(defaultsPlusId ? { plusId: defaultsPlusId } : {}),\n ...(readString(defaultAliasEntry?.name)\n ? { name: readString(defaultAliasEntry?.name) }\n : {}),\n });\n }\n\n for (const provider of this.config.providers ?? []) {\n const providerId = readString(provider.id);\n if (!providerId) continue;\n\n const hint = extractProviderBindingHint(provider);\n if (!hint.senderKey && !hint.plusId) continue;\n\n pushUnique({\n source: \"config\",\n providerId,\n ...(hint.senderKey ? { senderKey: hint.senderKey } : {}),\n ...(hint.plusId ? { plusId: hint.plusId } : {}),\n });\n }\n\n return items;\n }\n\n resolve(input?: KakaoChannelResolveInput): ResolvedKakaoChannelBinding {\n const aliases = this.config.aliases?.kakaoChannels ?? {};\n\n const channelAlias = readString(input?.channelAlias);\n const aliasEntry = channelAlias ? aliases[channelAlias] : undefined;\n\n if (channelAlias && input?.strictAlias === true && !aliasEntry) {\n throw new KMsgError(\n KMsgErrorCode.INVALID_REQUEST,\n `Unknown kakao channel alias: ${channelAlias}`,\n );\n }\n\n const defaultsKakao = this.config.defaults?.kakao;\n const defaultsChannelAlias = readString(defaultsKakao?.channel);\n const defaultAliasEntry = defaultsChannelAlias\n ? aliases[defaultsChannelAlias]\n : undefined;\n\n const explicitProviderId = readString(input?.providerId);\n const aliasProviderId = readString(aliasEntry?.providerId);\n const defaultsProviderId = readString(defaultAliasEntry?.providerId);\n const routingDefaultProviderId = readString(\n this.config.routing?.defaultProviderId,\n );\n const singleProviderId = selectSingleProviderId(this.config.providers);\n\n let providerId: string | undefined;\n let providerIdSource: KakaoChannelBindingSource = \"unknown\";\n\n if (explicitProviderId) {\n providerId = explicitProviderId;\n providerIdSource = \"explicit\";\n } else if (aliasProviderId) {\n providerId = aliasProviderId;\n providerIdSource = \"alias\";\n } else if (defaultsProviderId) {\n providerId = defaultsProviderId;\n providerIdSource = \"defaults\";\n } else if (routingDefaultProviderId) {\n providerId = routingDefaultProviderId;\n providerIdSource = \"routing\";\n } else if (singleProviderId) {\n providerId = singleProviderId;\n providerIdSource = \"single_provider\";\n }\n\n const providerEntry = providerId\n ? (this.config.providers ?? []).find((entry) => entry.id === providerId)\n : undefined;\n const providerHint = providerEntry\n ? extractProviderBindingHint(providerEntry)\n : {};\n\n const explicitSenderKey = readString(input?.senderKey);\n const aliasSenderKey = readString(aliasEntry?.senderKey);\n const defaultsSenderKey = readString(defaultsKakao?.senderKey);\n const defaultAliasSenderKey = readString(defaultAliasEntry?.senderKey);\n const providerHintSenderKey = readString(providerHint.senderKey);\n\n const explicitPlusId = readString(input?.plusId);\n const aliasPlusId = readString(aliasEntry?.plusId);\n const defaultsPlusId = readString(defaultsKakao?.plusId);\n const defaultAliasPlusId = readString(defaultAliasEntry?.plusId);\n const providerHintPlusId = readString(providerHint.plusId);\n\n let senderKey: string | undefined;\n let senderKeySource: KakaoChannelBindingSource | undefined;\n\n if (explicitSenderKey) {\n senderKey = explicitSenderKey;\n senderKeySource = \"explicit\";\n } else if (aliasSenderKey) {\n senderKey = aliasSenderKey;\n senderKeySource = \"alias\";\n } else if (defaultsSenderKey) {\n senderKey = defaultsSenderKey;\n senderKeySource = \"defaults\";\n } else if (defaultAliasSenderKey) {\n senderKey = defaultAliasSenderKey;\n senderKeySource = \"defaults\";\n } else if (providerHintSenderKey) {\n senderKey = providerHintSenderKey;\n senderKeySource = \"provider_config\";\n }\n\n let plusId: string | undefined;\n let plusIdSource: KakaoChannelBindingSource | undefined;\n\n if (explicitPlusId) {\n plusId = explicitPlusId;\n plusIdSource = \"explicit\";\n } else if (aliasPlusId) {\n plusId = aliasPlusId;\n plusIdSource = \"alias\";\n } else if (defaultsPlusId) {\n plusId = defaultsPlusId;\n plusIdSource = \"defaults\";\n } else if (defaultAliasPlusId) {\n plusId = defaultAliasPlusId;\n plusIdSource = \"defaults\";\n } else if (providerHintPlusId) {\n plusId = providerHintPlusId;\n plusIdSource = \"provider_config\";\n }\n\n return {\n ...(channelAlias ? { alias: channelAlias } : {}),\n ...(providerId ? { providerId } : {}),\n ...(normalizeProviderType(providerEntry?.type)\n ? { providerType: normalizeProviderType(providerEntry?.type) }\n : {}),\n ...(senderKey ? { senderKey } : {}),\n ...(plusId ? { plusId } : {}),\n ...(readString(aliasEntry?.name)\n ? { name: readString(aliasEntry?.name) }\n : readString(defaultAliasEntry?.name)\n ? { name: readString(defaultAliasEntry?.name) }\n : {}),\n providerIdSource,\n ...(senderKeySource ? { senderKeySource } : {}),\n ...(plusIdSource ? { plusIdSource } : {}),\n };\n }\n\n getAlias(alias: string): KakaoChannelAliasEntry | undefined {\n const normalized = readString(alias);\n if (!normalized) return undefined;\n return this.config.aliases?.kakaoChannels?.[normalized];\n }\n}\n",
8
8
  "import type { ProviderOnboardingSpec } from \"@k-msg/core\";\nimport type {\n KakaoChannelCapability,\n KakaoChannelCapabilityMode,\n KakaoChannelRuntimeProvider,\n} from \"./types\";\n\nfunction hasFunction(value: unknown): value is (...args: unknown[]) => unknown {\n return typeof value === \"function\";\n}\n\nfunction tryGetOnboardingSpec(\n provider: KakaoChannelRuntimeProvider,\n): ProviderOnboardingSpec | undefined {\n if (!hasFunction(provider.getOnboardingSpec)) {\n return undefined;\n }\n\n try {\n return provider.getOnboardingSpec();\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeProviderType(value: string | undefined): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed.toLowerCase() : undefined;\n}\n\nfunction inferMode(\n spec: ProviderOnboardingSpec | undefined,\n supportsList: boolean,\n): KakaoChannelCapabilityMode {\n if (spec?.channelOnboarding) {\n if (spec.channelOnboarding === \"api\" && !supportsList) {\n return \"none\";\n }\n return spec.channelOnboarding;\n }\n\n return supportsList ? \"api\" : \"none\";\n}\n\nexport class KakaoChannelCapabilityService {\n resolve(provider: KakaoChannelRuntimeProvider): KakaoChannelCapability {\n const spec = tryGetOnboardingSpec(provider);\n\n const supports = {\n list: hasFunction(provider.listKakaoChannels),\n categories: hasFunction(provider.listKakaoChannelCategories),\n auth: hasFunction(provider.requestKakaoChannelAuth),\n add: hasFunction(provider.addKakaoChannel),\n };\n\n const providerType = normalizeProviderType(spec?.providerId);\n const mode = inferMode(spec, supports.list);\n\n return {\n providerId: provider.id,\n ...(providerType ? { providerType } : {}),\n mode,\n supports,\n };\n }\n}\n",
@@ -12,7 +12,7 @@
12
12
  "import type {\n KakaoChannelApiOperation,\n KakaoChannelRuntimeProvider,\n} from \"../types\";\n\nexport class SolapiChannelAdapter {\n readonly mode = \"none\" as const;\n\n constructor(private readonly provider: KakaoChannelRuntimeProvider) {}\n\n unsupportedMessage(operation: KakaoChannelApiOperation): string {\n return `Provider '${this.provider.id}' does not expose Kakao channel onboarding API. Operation '${operation}' is unsupported.`;\n }\n}\n",
13
13
  "import {\n fail,\n type KakaoChannel,\n type KakaoChannelCategories,\n KMsgError,\n KMsgErrorCode,\n ok,\n type Result,\n} from \"@k-msg/core\";\nimport { AligoChannelAdapter } from \"./adapters/aligo.adapter\";\nimport { IwinvChannelAdapter } from \"./adapters/iwinv.adapter\";\nimport { MockChannelAdapter } from \"./adapters/mock.adapter\";\nimport { SolapiChannelAdapter } from \"./adapters/solapi.adapter\";\nimport { KakaoChannelCapabilityService } from \"./kakao-channel-capability.service\";\nimport type {\n KakaoChannelAddParams,\n KakaoChannelApiAdapter,\n KakaoChannelApiOperation,\n KakaoChannelAuthParams,\n KakaoChannelCapability,\n KakaoChannelListItem,\n KakaoChannelListParams,\n KakaoChannelRuntimeProvider,\n} from \"./types\";\n\nfunction normalizeProviderType(value: string | undefined): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed.toLowerCase() : undefined;\n}\n\nfunction createApiAdapter(\n providerType: string | undefined,\n provider: KakaoChannelRuntimeProvider,\n): KakaoChannelApiAdapter | undefined {\n switch (providerType) {\n case \"aligo\":\n return new AligoChannelAdapter(provider);\n case \"mock\":\n return new MockChannelAdapter(provider);\n default:\n return typeof provider.listKakaoChannels === \"function\"\n ? new AligoChannelAdapter(provider)\n : undefined;\n }\n}\n\nexport class KakaoChannelLifecycleService {\n private readonly capability: KakaoChannelCapability;\n private readonly providerType?: string;\n private readonly apiAdapter?: KakaoChannelApiAdapter;\n private readonly iwinvAdapter?: IwinvChannelAdapter;\n private readonly solapiAdapter?: SolapiChannelAdapter;\n\n constructor(\n private readonly provider: KakaoChannelRuntimeProvider,\n capabilityService = new KakaoChannelCapabilityService(),\n ) {\n this.capability = capabilityService.resolve(provider);\n this.providerType = normalizeProviderType(this.capability.providerType);\n\n if (this.capability.mode === \"api\") {\n this.apiAdapter = createApiAdapter(this.providerType, this.provider);\n } else if (this.providerType === \"iwinv\") {\n this.iwinvAdapter = new IwinvChannelAdapter(this.provider);\n } else if (this.providerType === \"solapi\") {\n this.solapiAdapter = new SolapiChannelAdapter(this.provider);\n }\n }\n\n getCapability(): KakaoChannelCapability {\n return this.capability;\n }\n\n private unsupported(\n operation: KakaoChannelApiOperation,\n ): Result<never, KMsgError> {\n const message = (() => {\n if (this.capability.mode === \"manual\") {\n if (this.iwinvAdapter) {\n return this.iwinvAdapter.unsupportedMessage(operation);\n }\n return `Provider '${this.provider.id}' requires manual Kakao channel onboarding. Operation '${operation}' is unavailable via API.`;\n }\n\n if (this.capability.mode === \"none\") {\n if (this.solapiAdapter) {\n return this.solapiAdapter.unsupportedMessage(operation);\n }\n return `Provider '${this.provider.id}' does not support Kakao channel onboarding API operation '${operation}'.`;\n }\n\n return `Provider '${this.provider.id}' does not support Kakao channel onboarding API operation '${operation}'.`;\n })();\n\n return fail(\n new KMsgError(KMsgErrorCode.INVALID_REQUEST, message, {\n providerId: this.provider.id,\n mode: this.capability.mode,\n operation,\n }),\n );\n }\n\n private ensureApi(\n operation: KakaoChannelApiOperation,\n ): Result<void, KMsgError> {\n if (this.capability.mode !== \"api\") {\n return this.unsupported(operation);\n }\n\n if (!this.apiAdapter) {\n return fail(\n new KMsgError(\n KMsgErrorCode.INVALID_REQUEST,\n `Provider '${this.provider.id}' is marked as api mode but does not expose kakao channel operations`,\n {\n providerId: this.provider.id,\n mode: this.capability.mode,\n operation,\n },\n ),\n );\n }\n\n return ok(undefined);\n }\n\n async list(\n params?: KakaoChannelListParams,\n ): Promise<Result<KakaoChannelListItem[], KMsgError>> {\n const ready = this.ensureApi(\"list\");\n if (ready.isFailure) return ready;\n const apiAdapter = this.apiAdapter;\n if (!apiAdapter) return this.unsupported(\"list\");\n\n const result = await apiAdapter.list(params);\n if (result.isFailure) return result;\n\n return ok(\n result.value.map((channel) => ({\n source: \"api\" as const,\n providerId: channel.providerId || this.provider.id,\n senderKey: channel.senderKey,\n ...(channel.plusId ? { plusId: channel.plusId } : {}),\n ...(channel.name ? { name: channel.name } : {}),\n ...(channel.status ? { status: channel.status } : {}),\n })),\n );\n }\n\n async categories(): Promise<Result<KakaoChannelCategories, KMsgError>> {\n const ready = this.ensureApi(\"categories\");\n if (ready.isFailure) return ready;\n const apiAdapter = this.apiAdapter;\n if (!apiAdapter) return this.unsupported(\"categories\");\n\n return apiAdapter.categories();\n }\n\n async auth(params: KakaoChannelAuthParams): Promise<Result<void, KMsgError>> {\n const ready = this.ensureApi(\"auth\");\n if (ready.isFailure) return ready;\n const apiAdapter = this.apiAdapter;\n if (!apiAdapter) return this.unsupported(\"auth\");\n\n return apiAdapter.auth(params);\n }\n\n async add(\n params: KakaoChannelAddParams,\n ): Promise<Result<KakaoChannel, KMsgError>> {\n const ready = this.ensureApi(\"add\");\n if (ready.isFailure) return ready;\n const apiAdapter = this.apiAdapter;\n if (!apiAdapter) return this.unsupported(\"add\");\n\n return apiAdapter.add(params);\n }\n}\n"
14
14
  ],
15
- "mappings": "+HAcO,MAAM,UAAkB,KAAM,CACnB,KACA,QAEhB,WAAW,CACT,EACA,EACA,EACA,CACA,MAAM,CAAO,EAKb,GAJA,KAAK,KAAO,YACZ,KAAK,KAAO,EACZ,KAAK,QAAU,EAEX,MAAM,kBACR,MAAM,kBAAkB,KAAM,CAAS,EAI3C,MAAM,EAAG,CACP,MAAO,CACL,KAAM,KAAK,KACX,KAAM,KAAK,KACX,QAAS,KAAK,QACd,QAAS,KAAK,OAChB,EAEJ,CC3BO,IAAM,EAAK,CAAI,KAAqB,CACzC,UAAW,GACX,UAAW,GACX,OACF,GAEa,EAAO,CAAI,KAAuB,CAC7C,UAAW,GACX,UAAW,GACX,OACF,GCbA,SAAS,CAAU,CAAC,EAAoC,CACtD,GAAI,OAAO,IAAU,SAAU,OAC/B,IAAM,EAAU,EAAM,KAAK,EAC3B,OAAO,EAAQ,OAAS,EAAI,EAAU,OAGxC,SAAS,CAAqB,CAAC,EAA+C,CAC5E,GAAI,CAAC,EAAO,OACZ,IAAM,EAAU,EAAM,KAAK,EAC3B,OAAO,EAAQ,OAAS,EAAI,EAAQ,YAAY,EAAI,OAGtD,SAAS,CAA0B,CAAC,EAGlC,CACA,IAAM,EACJ,EAAS,QAAU,OAAO,EAAS,SAAW,SAC1C,EAAS,OACT,CAAC,EAED,EACJ,EAAY,EAAgC,SAAS,GACrD,EAAY,EAAgC,SAAS,GACrD,EAAY,EAAgC,SAAS,EACjD,EAAS,EAAY,EAAgC,MAAM,EAGjE,GADqB,EAAsB,EAAS,IAAI,IACnC,SACnB,MAAO,CACL,UACE,EAAY,EAAgC,SAAS,GAAK,KACxD,EAAS,CAAE,QAAO,EAAI,CAAC,CAC7B,EAGF,MAAO,IACD,EAAY,CAAE,WAAU,EAAI,CAAC,KAC7B,EAAS,CAAE,QAAO,EAAI,CAAC,CAC7B,EAGF,SAAS,CAAS,CAAC,EAAoC,CACrD,MAAO,CACL,EAAK,YAAc,GACnB,EAAK,WAAa,GAClB,EAAK,QAAU,GACf,EAAK,MACP,EAAE,KAAK,GAAG,EAGZ,SAAS,CAAsB,CAC7B,EACoB,CACpB,GAAI,CAAC,MAAM,QAAQ,CAAS,GAAK,EAAU,SAAW,EAAG,OACzD,OAAO,EAAW,EAAU,IAAI,EAAE,EAG7B,MAAM,CAA4B,CACV,OAA7B,WAAW,CAAkB,EAAoC,CAApC,cAE7B,IAAI,CAAC,EAA0D,CAC7D,IAAM,EAAsB,EAAW,GAAQ,UAAU,EACnD,EAAU,KAAK,OAAO,SAAS,eAAiB,CAAC,EACjD,EAAgC,CAAC,EACjC,EAAO,IAAI,IAEX,EAAa,CAAC,IAAqC,CACvD,GAAI,GAAuB,EAAK,aAAe,EAC7C,OAEF,IAAM,EAAM,EAAU,CAAI,EAC1B,GAAI,EAAK,IAAI,CAAG,EACd,OAEF,EAAK,IAAI,CAAG,EACZ,EAAM,KAAK,CAAI,GAGjB,QAAY,EAAO,KAAU,OAAO,QAAQ,CAAO,EAAG,CACpD,IAAM,EAAa,EAAW,EAAM,UAAU,EAC9C,GAAI,CAAC,EAAY,SAEjB,IAAM,EAAY,EAAW,EAAM,SAAS,EACtC,EAAS,EAAW,EAAM,MAAM,EACtC,GAAI,CAAC,GAAa,CAAC,EAAQ,SAE3B,EAAW,CACT,OAAQ,SACR,QACA,gBACI,EAAY,CAAE,WAAU,EAAI,CAAC,KAC7B,EAAS,CAAE,QAAO,EAAI,CAAC,KACvB,EAAW,EAAM,IAAI,EAAI,CAAE,KAAM,EAAW,EAAM,IAAI,CAAE,EAAI,CAAC,CACnE,CAAC,EAGH,IAAM,EAAgB,KAAK,OAAO,UAAU,MACtC,EAAuB,EAAW,GAAe,OAAO,EACxD,EAAoB,EACtB,EAAQ,GACR,OACE,EACJ,EAAW,GAAmB,UAAU,GACxC,EAAW,KAAK,OAAO,SAAS,iBAAiB,GACjD,EAAuB,KAAK,OAAO,SAAS,EAExC,EACJ,EAAW,GAAe,SAAS,GACnC,EAAW,GAAmB,SAAS,EACnC,EACJ,EAAW,GAAe,MAAM,GAChC,EAAW,GAAmB,MAAM,EAEtC,GAAI,IAAsB,GAAqB,GAC7C,EAAW,CACT,OAAQ,YACJ,EAAuB,CAAE,MAAO,CAAqB,EAAI,CAAC,EAC9D,WAAY,KACR,EAAoB,CAAE,UAAW,CAAkB,EAAI,CAAC,KACxD,EAAiB,CAAE,OAAQ,CAAe,EAAI,CAAC,KAC/C,EAAW,GAAmB,IAAI,EAClC,CAAE,KAAM,EAAW,GAAmB,IAAI,CAAE,EAC5C,CAAC,CACP,CAAC,EAGH,QAAW,KAAY,KAAK,OAAO,WAAa,CAAC,EAAG,CAClD,IAAM,EAAa,EAAW,EAAS,EAAE,EACzC,GAAI,CAAC,EAAY,SAEjB,IAAM,EAAO,EAA2B,CAAQ,EAChD,GAAI,CAAC,EAAK,WAAa,CAAC,EAAK,OAAQ,SAErC,EAAW,CACT,OAAQ,SACR,gBACI,EAAK,UAAY,CAAE,UAAW,EAAK,SAAU,EAAI,CAAC,KAClD,EAAK,OAAS,CAAE,OAAQ,EAAK,MAAO,EAAI,CAAC,CAC/C,CAAC,EAGH,OAAO,EAGT,OAAO,CAAC,EAA+D,CACrE,IAAM,EAAU,KAAK,OAAO,SAAS,eAAiB,CAAC,EAEjD,EAAe,EAAW,GAAO,YAAY,EAC7C,EAAa,EAAe,EAAQ,GAAgB,OAE1D,GAAI,GAAgB,GAAO,cAAgB,IAAQ,CAAC,EAClD,MAAM,IAAI,oBAER,gCAAgC,GAClC,EAGF,IAAM,EAAgB,KAAK,OAAO,UAAU,MACtC,EAAuB,EAAW,GAAe,OAAO,EACxD,EAAoB,EACtB,EAAQ,GACR,OAEE,EAAqB,EAAW,GAAO,UAAU,EACjD,EAAkB,EAAW,GAAY,UAAU,EACnD,EAAqB,EAAW,GAAmB,UAAU,EAC7D,EAA2B,EAC/B,KAAK,OAAO,SAAS,iBACvB,EACM,EAAmB,EAAuB,KAAK,OAAO,SAAS,EAEjE,EACA,EAA8C,UAElD,GAAI,EACF,EAAa,EACb,EAAmB,WACd,QAAI,EACT,EAAa,EACb,EAAmB,QACd,QAAI,EACT,EAAa,EACb,EAAmB,WACd,QAAI,EACT,EAAa,EACb,EAAmB,UACd,QAAI,EACT,EAAa,EACb,EAAmB,kBAGrB,IAAM,EAAgB,GACjB,KAAK,OAAO,WAAa,CAAC,GAAG,KAAK,CAAC,IAAU,EAAM,KAAO,CAAU,EACrE,OACE,EAAe,EACjB,EAA2B,CAAa,EACxC,CAAC,EAEC,EAAoB,EAAW,GAAO,SAAS,EAC/C,EAAiB,EAAW,GAAY,SAAS,EACjD,EAAoB,EAAW,GAAe,SAAS,EACvD,EAAwB,EAAW,GAAmB,SAAS,EAC/D,EAAwB,EAAW,EAAa,SAAS,EAEzD,EAAiB,EAAW,GAAO,MAAM,EACzC,EAAc,EAAW,GAAY,MAAM,EAC3C,EAAiB,EAAW,GAAe,MAAM,EACjD,EAAqB,EAAW,GAAmB,MAAM,EACzD,EAAqB,EAAW,EAAa,MAAM,EAErD,EACA,EAEJ,GAAI,EACF,EAAY,EACZ,EAAkB,WACb,QAAI,EACT,EAAY,EACZ,EAAkB,QACb,QAAI,EACT,EAAY,EACZ,EAAkB,WACb,QAAI,EACT,EAAY,EACZ,EAAkB,WACb,QAAI,EACT,EAAY,EACZ,EAAkB,kBAGpB,IAAI,EACA,EAEJ,GAAI,EACF,EAAS,EACT,EAAe,WACV,QAAI,EACT,EAAS,EACT,EAAe,QACV,QAAI,EACT,EAAS,EACT,EAAe,WACV,QAAI,EACT,EAAS,EACT,EAAe,WACV,QAAI,EACT,EAAS,EACT,EAAe,kBAGjB,MAAO,IACD,EAAe,CAAE,MAAO,CAAa,EAAI,CAAC,KAC1C,EAAa,CAAE,YAAW,EAAI,CAAC,KAC/B,EAAsB,GAAe,IAAI,EACzC,CAAE,aAAc,EAAsB,GAAe,IAAI,CAAE,EAC3D,CAAC,KACD,EAAY,CAAE,WAAU,EAAI,CAAC,KAC7B,EAAS,CAAE,QAAO,EAAI,CAAC,KACvB,EAAW,GAAY,IAAI,EAC3B,CAAE,KAAM,EAAW,GAAY,IAAI,CAAE,EACrC,EAAW,GAAmB,IAAI,EAChC,CAAE,KAAM,EAAW,GAAmB,IAAI,CAAE,EAC5C,CAAC,EACP,sBACI,EAAkB,CAAE,iBAAgB,EAAI,CAAC,KACzC,EAAe,CAAE,cAAa,EAAI,CAAC,CACzC,EAGF,QAAQ,CAAC,EAAmD,CAC1D,IAAM,EAAa,EAAW,CAAK,EACnC,GAAI,CAAC,EAAY,OACjB,OAAO,KAAK,OAAO,SAAS,gBAAgB,GAEhD,CCvRA,SAAS,CAAW,CAAC,EAA0D,CAC7E,OAAO,OAAO,IAAU,WAG1B,SAAS,CAAoB,CAC3B,EACoC,CACpC,GAAI,CAAC,EAAY,EAAS,iBAAiB,EACzC,OAGF,GAAI,CACF,OAAO,EAAS,kBAAkB,EAClC,KAAM,CACN,QAIJ,SAAS,CAAqB,CAAC,EAA+C,CAC5E,GAAI,OAAO,IAAU,SAAU,OAC/B,IAAM,EAAU,EAAM,KAAK,EAC3B,OAAO,EAAQ,OAAS,EAAI,EAAQ,YAAY,EAAI,OAGtD,SAAS,CAAS,CAChB,EACA,EAC4B,CAC5B,GAAI,GAAM,kBAAmB,CAC3B,GAAI,EAAK,oBAAsB,OAAS,CAAC,EACvC,MAAO,OAET,OAAO,EAAK,kBAGd,OAAO,EAAe,MAAQ,OAGzB,MAAM,CAA8B,CACzC,OAAO,CAAC,EAA+D,CACrE,IAAM,EAAO,EAAqB,CAAQ,EAEpC,EAAW,CACf,KAAM,EAAY,EAAS,iBAAiB,EAC5C,WAAY,EAAY,EAAS,0BAA0B,EAC3D,KAAM,EAAY,EAAS,uBAAuB,EAClD,IAAK,EAAY,EAAS,eAAe,CAC3C,EAEM,EAAe,EAAsB,GAAM,UAAU,EACrD,EAAO,EAAU,EAAM,EAAS,IAAI,EAE1C,MAAO,CACL,WAAY,EAAS,MACjB,EAAe,CAAE,cAAa,EAAI,CAAC,EACvC,OACA,UACF,EAEJ,CClDA,SAAS,CAAoB,CAC3B,EACA,EACW,CACX,OAAO,IAAI,oBAET,aAAa,oDAA6D,KAC1E,CACE,aACA,WACF,CACF,EAGK,MAAM,CAAsD,CACpC,SAA7B,WAAW,CAAkB,EAAuC,CAAvC,qBAEvB,KAAI,CACR,EAC4C,CAC5C,IAAM,EAAK,KAAK,SAAS,kBACzB,GAAI,OAAO,IAAO,WAChB,OAAO,EAAK,EAAqB,KAAK,SAAS,GAAI,MAAM,CAAC,EAG5D,OAAO,EAAG,KAAK,KAAK,SAAU,CAAM,OAGhC,WAAU,EAAuD,CACrE,IAAM,EAAK,KAAK,SAAS,2BACzB,GAAI,OAAO,IAAO,WAChB,OAAO,EAAK,EAAqB,KAAK,SAAS,GAAI,YAAY,CAAC,EAGlE,OAAO,EAAG,KAAK,KAAK,QAAQ,OAGxB,KAAI,CAAC,EAAkE,CAC3E,IAAM,EAAK,KAAK,SAAS,wBACzB,GAAI,OAAO,IAAO,WAChB,OAAO,EAAK,EAAqB,KAAK,SAAS,GAAI,MAAM,CAAC,EAG5D,OAAO,EAAG,KAAK,KAAK,SAAU,CAAM,OAGhC,IAAG,CACP,EAC0C,CAC1C,IAAM,EAAK,KAAK,SAAS,gBACzB,GAAI,OAAO,IAAO,WAChB,OAAO,EAAK,EAAqB,KAAK,SAAS,GAAI,KAAK,CAAC,EAG3D,OAAO,EAAG,KAAK,KAAK,SAAU,CAAM,EAExC,CCnEO,MAAM,CAAoB,CAGF,SAFpB,KAAO,SAEhB,WAAW,CAAkB,EAAuC,CAAvC,gBAE7B,kBAAkB,CAAC,EAA6C,CAC9D,MAAO,aAAa,KAAK,SAAS,wDAAwD,+BAE9F,CCVO,MAAM,UAA2B,CAAoB,CAC1D,WAAW,CAAC,EAAuC,CACjD,MAAM,CAAQ,EAElB,CCFO,MAAM,CAAqB,CAGH,SAFpB,KAAO,OAEhB,WAAW,CAAkB,EAAuC,CAAvC,gBAE7B,kBAAkB,CAAC,EAA6C,CAC9D,MAAO,aAAa,KAAK,SAAS,gEAAgE,qBAEtG,CCYA,SAAS,EAAqB,CAAC,EAA+C,CAC5E,GAAI,OAAO,IAAU,SAAU,OAC/B,IAAM,EAAU,EAAM,KAAK,EAC3B,OAAO,EAAQ,OAAS,EAAI,EAAQ,YAAY,EAAI,OAGtD,SAAS,EAAgB,CACvB,EACA,EACoC,CACpC,OAAQ,OACD,QACH,OAAO,IAAI,EAAoB,CAAQ,MACpC,OACH,OAAO,IAAI,EAAmB,CAAQ,UAEtC,OAAO,OAAO,EAAS,oBAAsB,WACzC,IAAI,EAAoB,CAAQ,EAChC,QAIH,MAAM,CAA6B,CAQrB,SAPF,WACA,aACA,WACA,aACA,cAEjB,WAAW,CACQ,EACjB,EAAoB,IAAI,EACxB,CAFiB,gBAMjB,GAHA,KAAK,WAAa,EAAkB,QAAQ,CAAQ,EACpD,KAAK,aAAe,GAAsB,KAAK,WAAW,YAAY,EAElE,KAAK,WAAW,OAAS,MAC3B,KAAK,WAAa,GAAiB,KAAK,aAAc,KAAK,QAAQ,EAC9D,QAAI,KAAK,eAAiB,QAC/B,KAAK,aAAe,IAAI,EAAoB,KAAK,QAAQ,EACpD,QAAI,KAAK,eAAiB,SAC/B,KAAK,cAAgB,IAAI,EAAqB,KAAK,QAAQ,EAI/D,aAAa,EAA2B,CACtC,OAAO,KAAK,WAGN,WAAW,CACjB,EAC0B,CAC1B,IAAM,GAAW,IAAM,CACrB,GAAI,KAAK,WAAW,OAAS,SAAU,CACrC,GAAI,KAAK,aACP,OAAO,KAAK,aAAa,mBAAmB,CAAS,EAEvD,MAAO,aAAa,KAAK,SAAS,4DAA4D,6BAGhG,GAAI,KAAK,WAAW,OAAS,OAAQ,CACnC,GAAI,KAAK,cACP,OAAO,KAAK,cAAc,mBAAmB,CAAS,EAExD,MAAO,aAAa,KAAK,SAAS,gEAAgE,MAGpG,MAAO,aAAa,KAAK,SAAS,gEAAgE,QACjG,EAEH,OAAO,EACL,IAAI,oBAAyC,EAAS,CACpD,WAAY,KAAK,SAAS,GAC1B,KAAM,KAAK,WAAW,KACtB,WACF,CAAC,CACH,EAGM,SAAS,CACf,EACyB,CACzB,GAAI,KAAK,WAAW,OAAS,MAC3B,OAAO,KAAK,YAAY,CAAS,EAGnC,GAAI,CAAC,KAAK,WACR,OAAO,EACL,IAAI,oBAEF,aAAa,KAAK,SAAS,yEAC3B,CACE,WAAY,KAAK,SAAS,GAC1B,KAAM,KAAK,WAAW,KACtB,WACF,CACF,CACF,EAGF,OAAO,EAAG,MAAS,OAGf,KAAI,CACR,EACoD,CACpD,IAAM,EAAQ,KAAK,UAAU,MAAM,EACnC,GAAI,EAAM,UAAW,OAAO,EAC5B,IAAM,EAAa,KAAK,WACxB,GAAI,CAAC,EAAY,OAAO,KAAK,YAAY,MAAM,EAE/C,IAAM,EAAS,MAAM,EAAW,KAAK,CAAM,EAC3C,GAAI,EAAO,UAAW,OAAO,EAE7B,OAAO,EACL,EAAO,MAAM,IAAI,CAAC,KAAa,CAC7B,OAAQ,MACR,WAAY,EAAQ,YAAc,KAAK,SAAS,GAChD,UAAW,EAAQ,aACf,EAAQ,OAAS,CAAE,OAAQ,EAAQ,MAAO,EAAI,CAAC,KAC/C,EAAQ,KAAO,CAAE,KAAM,EAAQ,IAAK,EAAI,CAAC,KACzC,EAAQ,OAAS,CAAE,OAAQ,EAAQ,MAAO,EAAI,CAAC,CACrD,EAAE,CACJ,OAGI,WAAU,EAAuD,CACrE,IAAM,EAAQ,KAAK,UAAU,YAAY,EACzC,GAAI,EAAM,UAAW,OAAO,EAC5B,IAAM,EAAa,KAAK,WACxB,GAAI,CAAC,EAAY,OAAO,KAAK,YAAY,YAAY,EAErD,OAAO,EAAW,WAAW,OAGzB,KAAI,CAAC,EAAkE,CAC3E,IAAM,EAAQ,KAAK,UAAU,MAAM,EACnC,GAAI,EAAM,UAAW,OAAO,EAC5B,IAAM,EAAa,KAAK,WACxB,GAAI,CAAC,EAAY,OAAO,KAAK,YAAY,MAAM,EAE/C,OAAO,EAAW,KAAK,CAAM,OAGzB,IAAG,CACP,EAC0C,CAC1C,IAAM,EAAQ,KAAK,UAAU,KAAK,EAClC,GAAI,EAAM,UAAW,OAAO,EAC5B,IAAM,EAAa,KAAK,WACxB,GAAI,CAAC,EAAY,OAAO,KAAK,YAAY,KAAK,EAE9C,OAAO,EAAW,IAAI,CAAM,EAEhC",
16
- "debugId": "89836C7514909FB964756E2164756E21",
15
+ "mappings": "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",
16
+ "debugId": "9C8FA470F9B9A9F164756E2164756E21",
17
17
  "names": []
18
18
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@k-msg/channel",
3
- "version": "0.21.1",
3
+ "version": "0.22.0",
4
4
  "packageManager": "bun@1.3.8",
5
5
  "description": "AlimTalk channel and sender number management",
6
6
  "type": "module",
@@ -34,7 +34,7 @@
34
34
  "publish": "bun publish --access public"
35
35
  },
36
36
  "dependencies": {
37
- "@k-msg/core": "0.21.1",
37
+ "@k-msg/core": "0.22.0",
38
38
  "zod": "^4.0.14"
39
39
  },
40
40
  "devDependencies": {