@k-msg/core 0.24.0 → 0.25.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/errors.d.ts +7 -0
- package/dist/index.js +3 -3
- package/dist/index.js.map +5 -5
- package/dist/index.mjs +3 -3
- package/dist/index.mjs.map +5 -5
- package/dist/provider.d.ts +127 -0
- package/dist/result.d.ts +103 -0
- package/dist/types/message.d.ts +63 -0
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
var A;((d)=>{d.INVALID_REQUEST="INVALID_REQUEST";d.AUTHENTICATION_FAILED="AUTHENTICATION_FAILED";d.INSUFFICIENT_BALANCE="INSUFFICIENT_BALANCE";d.TEMPLATE_NOT_FOUND="TEMPLATE_NOT_FOUND";d.RATE_LIMIT_EXCEEDED="RATE_LIMIT_EXCEEDED";d.NETWORK_ERROR="NETWORK_ERROR";d.NETWORK_TIMEOUT="NETWORK_TIMEOUT";d.NETWORK_SERVICE_UNAVAILABLE="NETWORK_SERVICE_UNAVAILABLE";d.PROVIDER_ERROR="PROVIDER_ERROR";d.MESSAGE_SEND_FAILED="MESSAGE_SEND_FAILED";d.CRYPTO_CONFIG_ERROR="CRYPTO_CONFIG_ERROR";d.CRYPTO_ENCRYPT_FAILED="CRYPTO_ENCRYPT_FAILED";d.CRYPTO_DECRYPT_FAILED="CRYPTO_DECRYPT_FAILED";d.CRYPTO_HASH_FAILED="CRYPTO_HASH_FAILED";d.CRYPTO_POLICY_VIOLATION="CRYPTO_POLICY_VIOLATION";d.UNKNOWN_ERROR="UNKNOWN_ERROR"})(A||={});var $=new Set(["NETWORK_ERROR","RATE_LIMIT_EXCEEDED","NETWORK_TIMEOUT","NETWORK_SERVICE_UNAVAILABLE","PROVIDER_ERROR","UNKNOWN_ERROR"]),j=new Set(["INVALID_REQUEST","AUTHENTICATION_FAILED","INSUFFICIENT_BALANCE","TEMPLATE_NOT_FOUND","MESSAGE_SEND_FAILED","CRYPTO_CONFIG_ERROR","CRYPTO_ENCRYPT_FAILED","CRYPTO_DECRYPT_FAILED","CRYPTO_HASH_FAILED","CRYPTO_POLICY_VIOLATION"]),C=(e)=>{if(typeof e!=="number"||Number.isNaN(e)||!Number.isFinite(e))return;return Math.trunc(e)},G=(e)=>{let t=C(e);if(t===void 0||t<0)return;return t},D=(e)=>{if(typeof e!=="string")return;return e.toLowerCase().trim()},J=(e)=>{if(e>=500)return"retryable";if(e===408||e===425||e===429)return"retryable";return"non_retryable"},V=(e)=>{let t=e.toLowerCase();if(t.includes("timeout")||t.includes("temporar")||t.includes("network")||t.includes("retry"))return"retryable";return};class u extends Error{code;details;providerErrorCode;providerErrorText;httpStatus;requestId;retryAfterMs;attempt;causeChain;constructor(e,t,r,i={}){super(t);if(this.name="KMsgError",this.code=e,this.details=r,this.providerErrorCode=i.providerErrorCode,this.providerErrorText=i.providerErrorText,this.httpStatus=C(i.httpStatus),this.requestId=typeof i.requestId==="string"?i.requestId:void 0,this.retryAfterMs=C(i.retryAfterMs),this.attempt=C(i.attempt),Array.isArray(i.causeChain))this.causeChain=i.causeChain;else if(i.causeChain!==void 0)this.causeChain=[i.causeChain];if(Error.captureStackTrace)Error.captureStackTrace(this,u)}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 v={isRetryable(e,t={}){return v.classifyForRetry(e,t)==="retryable"},classifyForRetry(e,t={}){if(e instanceof u){if(new Set(t.retryableCodes??Array.from($)).has(e.code))return"retryable";if(new Set(t.nonRetryableCodes??Array.from(j)).has(e.code))return"non_retryable";if(e.httpStatus!==void 0)return J(e.httpStatus);let a=V(e.message);if(a)return a;if(t.classifyByMessage&&e.message){let c=t.classifyByMessage(e.message);if(c)return c}if(t.fallback)return t.fallback;return"non_retryable"}let r=e&&typeof e==="object"?e:void 0,i=D(r?.status)??D(r?.statusCode)??D(r?.code),n=C(r?.status)??C(r?.statusCode)??C(r?.httpStatus);if(typeof i==="string"&&i.startsWith("5"))return"retryable";if(n!==void 0){if(t.classifyByStatusCode)return t.classifyByStatusCode(n);return J(n)}let s=typeof r?.message==="string"?V(r.message):void 0;if(s)return s;if(t.classifyByMessage&&typeof r?.message==="string"){let o=t.classifyByMessage(r.message);if(o)return o}return t.fallback??"non_retryable"},resolveRetryAfterMs(e,t){if(t?.retryAfterMs){let r=t.retryAfterMs(e),i=G(r);if(i!==void 0)return i}if(e.retryAfterMs!==void 0)return G(e.retryAfterMs);if(e.code==="RATE_LIMIT_EXCEEDED"&&e.retryAfterMs===void 0)return;return},isUnknownStatus:(e)=>{if(e===void 0||Number.isNaN(e)||!Number.isFinite(e))return!1;return e<500},toRetryMetadata(e){return{providerErrorCode:e.providerErrorCode,providerErrorText:e.providerErrorText,httpStatus:e.httpStatus,requestId:e.requestId,retryAfterMs:e.retryAfterMs,attempt:e.attempt,causeChain:e.causeChain}},withAttempt(e,t){return new u(e.code,e.message,e.details,{...v.toRetryMetadata(e),attempt:C(t)})},DEFAULT_RETRYABLE_ERROR_CODES:$,DEFAULT_NON_RETRYABLE_ERROR_CODES:j};function pe(e){switch(e){case"config":return"CRYPTO_CONFIG_ERROR";case"encrypt":return"CRYPTO_ENCRYPT_FAILED";case"decrypt":return"CRYPTO_DECRYPT_FAILED";case"hash":return"CRYPTO_HASH_FAILED";case"policy":return"CRYPTO_POLICY_VIOLATION"}}class P extends u{kind;fieldPath;failMode;openFallback;constructor(e,t,r,i={}){super(pe(e),t,r,i);this.name="FieldCryptoError",this.kind=e,this.fieldPath=typeof i.fieldPath==="string"?i.fieldPath:void 0,this.failMode=i.failMode,this.openFallback=i.openFallback}toJSON(){return{...super.toJSON(),kind:this.kind,fieldPath:this.fieldPath,failMode:this.failMode,openFallback:this.openFallback}}}var ce=["tenantId","providerId","messageId"];function S(e){if(typeof e!=="string")return;let t=e.trim();return t.length>0?t:void 0}function de(e){if(typeof e!=="number"||!Number.isFinite(e))return;if(e<=0||e>100)return;return e}function Y(e){let t=[];for(let r of e){let i=S(r.kid),n=de(r.percentage);if(!i||n===void 0)continue;t.push({kid:i,percentage:n})}return t}function le(e,t,r){let i=t.map((n)=>{let s=e[n];return typeof s==="string"?s:""}).join("|");return`${r}::${i}`}function ye(e){let t=2166136261;for(let r=0;r<e.length;r+=1)t^=e.charCodeAt(r),t=t*16777619>>>0;return t>>>0}function fe(e,t){let r=0;for(let i of e)if(r+=i.percentage,t<r)return i.kid;return}function I(e,t,r){let i=Y(t.buckets),n=S(t.defaultKid)??S(r);if(i.length===0)return n;let s=S(t.seed)??"kmsg-rollout-v1",o=t.stickyFields??ce,p=le(e,o,s),a=ye(p)%100;return fe(i,a)??n}function W(e){return Y(e.buckets).map((t)=>t.kid)}function b(e){if(typeof e!=="string")return;let t=e.trim();return t.length>0?t:void 0}function _(e){if(!Array.isArray(e))return[];return e.map((t)=>b(t)).filter((t)=>Boolean(t))}function B(e){let t=[],r=new Set;for(let i of e){let n=b(i);if(!n||r.has(n))continue;r.add(n),t.push(n)}return t}function ue(e){return b(e.providerId)??"default"}function Q(e){let t=b(e.activeKid)??"default",r=B([t,..._(e.decryptKids)]);return{async resolveEncryptKey(){return{kid:t}},async resolveDecryptKeys(){return r}}}function k(e){let t=typeof e.cacheTtlMs==="number"&&e.cacheTtlMs>=0?Math.trunc(e.cacheTtlMs):30000,r=b(e.fallback?.activeKid),i=_(e.fallback?.decryptKids),n;async function s(o){let p=Date.now();if(n&&p<n.expiresAt)return n.value;let a=await e.provider.loadKeySet(o),c=b(a.activeKid)??r??ue(o),l=B([c,..._(a.decryptKids),...i]),y={activeKid:c,decryptKids:l,refreshedAt:Date.now()};return n={value:y,expiresAt:Date.now()+t},y}return{async resolveEncryptKey(o){return{kid:(await s(o)).activeKid}},async resolveDecryptKeys(o){let p=await s(o);return p.decryptKids??[p.activeKid]}}}function Me(e,t){return{async resolveEncryptKey(r){let i=await e.resolveEncryptKey(r);return{kid:I(r,t,i.kid)??i.kid}},async resolveDecryptKeys(r){let i=await e.resolveEncryptKey(r),n=e.resolveDecryptKeys?await e.resolveDecryptKeys(r):[i.kid],s=I(r,t,i.kid),o=W(t);return B([...s?[s]:[],i.kid,...n??[],...o])}}}function De(e){return k({provider:{async loadKeySet(r){return e.client.getKeyState({...r,...e.keyAlias?{keyAlias:e.keyAlias}:{},...e.region?{region:e.region}:{}})}},cacheTtlMs:e.cacheTtlMs,fallback:{activeKid:e.fallbackActiveKid,decryptKids:e.fallbackDecryptKids}})}function R(e){if(typeof e!=="string")return;let t=e.trim();return t.length>0?t:void 0}function Z(e,t){return R(e[t])}function he(e,t){if(!e)return[];return e.split(t).map((r)=>R(r)).filter((r)=>Boolean(r))}function Be(e={}){let t=e.env??(typeof process<"u"?process.env:{}),r=R(e.delimiter)??",",i=e.activeKidEnv??"KMSG_ACTIVE_KID",n=e.decryptKidsEnv??"KMSG_DECRYPT_KIDS",s=Z(t,i)??R(e.fallbackActiveKid)??"default",o=[s,...he(Z(t,n),r),...e.fallbackDecryptKids??[]];return Q({activeKid:s,decryptKids:o})}function qe(e){return k({provider:{async loadKeySet(r){return e.client.getKeyState({...r,...e.mountPath?{mountPath:e.mountPath}:{},...e.keyName?{keyName:e.keyName}:{},...e.namespace?{namespace:e.namespace}:{}})}},cacheTtlMs:e.cacheTtlMs,fallback:{activeKid:e.fallbackActiveKid,decryptKids:e.fallbackDecryptKids}})}function N(e){return typeof e==="function"}function X(e){if(typeof e!=="string")return;let t=e.trim();return t.length>0?t:void 0}function L(e,t,r){let i=e.fields[t];if(i)return i;if(t.startsWith("metadata.")){let n=e.fields["metadata.*"];if(n)return n}return r}function me(e,t={}){let r=[];if(!e||typeof e!=="object")return{valid:!1,issues:[{message:"fieldCrypto config must be an object",rule:"fieldCrypto.config.object",hint:"Provide a valid FieldCryptoConfig object"}]};if(!e.provider||typeof e.provider!=="object")r.push({message:"fieldCrypto provider is required",rule:"fieldCrypto.provider.required",path:"provider",hint:"Set provider with encrypt/decrypt/hash methods"});else{if(!N(e.provider.encrypt))r.push({message:"provider.encrypt must be a function",rule:"fieldCrypto.provider.encrypt.required",path:"provider.encrypt"});if(!N(e.provider.decrypt))r.push({message:"provider.decrypt must be a function",rule:"fieldCrypto.provider.decrypt.required",path:"provider.decrypt"});if(!N(e.provider.hash))r.push({message:"provider.hash must be a function",rule:"fieldCrypto.provider.hash.required",path:"provider.hash"})}if(!e.fields||typeof e.fields!=="object")r.push({message:"fieldCrypto.fields must be an object",rule:"fieldCrypto.fields.object",path:"fields",hint:"Define policies such as to, from, metadata.phoneNumber"});else{let s=Object.entries(e.fields);if(s.length===0)r.push({message:"fieldCrypto.fields must not be empty",rule:"fieldCrypto.fields.non_empty",path:"fields",hint:"Add at least one field mode mapping"});for(let[o,p]of s){if(!X(o))r.push({message:"field path must be a non-empty string",rule:"fieldCrypto.fields.path.non_empty",path:"fields"});if(p!=="plain"&&p!=="encrypt"&&p!=="encrypt+hash"&&p!=="mask")r.push({message:`unsupported field mode: ${String(p)}`,rule:"fieldCrypto.fields.mode.supported",path:`fields.${o}`})}}let i=e.failMode??"closed",n=e.openFallback??"masked";if(i==="open"&&n==="plaintext"&&e.unsafeAllowPlaintextStorage!==!0)r.push({message:"openFallback=plaintext requires unsafeAllowPlaintextStorage=true",rule:"fieldCrypto.fail_open.plaintext_guard",path:"openFallback",hint:"Use masked/null fallback, or explicitly enable unsafe plaintext"});if(Array.isArray(e.aadFields)){if(e.aadFields.length===0)r.push({message:"aadFields must not be empty when provided",rule:"fieldCrypto.aad_fields.non_empty",path:"aadFields"});for(let s=0;s<e.aadFields.length;s+=1){let o=e.aadFields[s];if(!X(o))r.push({message:"aadFields cannot include empty key",rule:"fieldCrypto.aad_fields.no_empty_key",path:`aadFields[${s}]`})}}if(t.secureMode&&!t.compatPlainColumns){let s=L(e,"to","encrypt+hash"),o=L(e,"from","encrypt+hash");if(s==="plain")r.push({message:"secure mode requires non-plain policy for `to` when compatPlainColumns=false",rule:"fieldCrypto.secure_mode.to_non_plain",path:"fields.to",hint:"Use encrypt+hash for lookup fields"});if(o==="plain")r.push({message:"secure mode requires non-plain policy for `from` when compatPlainColumns=false",rule:"fieldCrypto.secure_mode.from_non_plain",path:"fields.from",hint:"Use encrypt+hash for lookup fields"})}return{valid:r.length===0,issues:r}}function je(e,t={}){let r=me(e,t);if(r.valid)return;let i=r.issues[0];if(!i)throw new P("config","fieldCrypto config validation failed",{rule:"fieldCrypto.config.invalid",issues:r.issues});throw new P("config",i.message,{rule:i.rule,path:i.path,hint:i.hint,issues:r.issues},{fieldPath:i.path})}function x(e){let t=e instanceof Uint8Array?e:new Uint8Array(e),r=typeof globalThis<"u"?globalThis.Buffer:void 0;return(r?r.from(t).toString("base64"):btoa(String.fromCharCode(...t))).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function O(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t.length%4===0?t:`${t}${"=".repeat(4-t.length%4)}`,i=typeof globalThis<"u"?globalThis.Buffer:void 0;if(i)return new Uint8Array(i.from(r,"base64"));let n=atob(r),s=new Uint8Array(n.length);for(let o=0;o<n.length;o+=1)s[o]=n.charCodeAt(o);return s}function z(e,t){if(e instanceof Uint8Array)return e;if(e instanceof ArrayBuffer)return new Uint8Array(e);if(t==="base64url")return O(e);return new TextEncoder().encode(e)}function ge(e){let t=e instanceof Uint8Array?e:new Uint8Array(e);return Array.from(t).map((r)=>r.toString(16).padStart(2,"0")).join("")}function g(e){let t=new Uint8Array(e.byteLength);return t.set(e),t.buffer}function ee(e){let t=JSON.parse(e);if(!t||typeof t!=="object"||typeof t.v!=="number"||typeof t.alg!=="string"||typeof t.kid!=="string"||typeof t.iv!=="string"||typeof t.tag!=="string"||typeof t.ct!=="string")throw Error("Invalid ciphertext envelope");return t}function Ce(e){if(typeof e==="string")return e;return JSON.stringify(e)}function Je(e){if(!e||typeof e!=="object")return!1;let t=e;return typeof t.v==="number"&&typeof t.alg==="string"&&typeof t.kid==="string"&&typeof t.iv==="string"&&typeof t.tag==="string"&&typeof t.ct==="string"}function Ke(e){let t=String(e??"").trim();if(t.length===0)return"";let r=t.startsWith("+"),i=t.replace(/\D/g,"");return r?`+${i}`:i}function te(e=3,t=2){return(r)=>{let i=String(r??"");if(i.length<=e+t)return"*".repeat(Math.max(0,i.length));let n=i.slice(0,e),s=i.slice(-t);return`${n}${"*".repeat(i.length-e-t)}${s}`}}function Ve(e){let t=e.algorithm??"A256GCM",r=e.keyEncoding??"base64url",i=e.hashKeyEncoding??r,n=new Map,s=new Map,o=(a)=>{let c=n.get(a);if(c)return c;let l=e.keys[a];if(!l)throw Error(`Unknown encryption key id: ${a}`);let y=z(l,r),f=crypto.subtle.importKey("raw",g(y),"AES-GCM",!1,["encrypt","decrypt"]);return n.set(a,f),f},p=(a)=>{let c=s.get(a);if(c)return c;let l=e.hashKeys?.[a]??e.keys[a];if(!l)throw Error(`Unknown hash key id: ${a}`);let y=z(l,i),f=crypto.subtle.importKey("raw",g(y),{name:"HMAC",hash:"SHA-256"},!1,["sign"]);return s.set(a,f),f};return{async encrypt(a){let c=a.kid??e.activeKid,l=await o(c),y=crypto.getRandomValues(new Uint8Array(12)),f=new TextEncoder().encode(JSON.stringify(a.aad??{})),h=new TextEncoder().encode(a.value),m=await crypto.subtle.encrypt({name:"AES-GCM",iv:g(y),additionalData:g(f),tagLength:128},l,g(h)),F=new Uint8Array(m),d=F.slice(F.length-16),E=F.slice(0,F.length-16);return{ciphertext:{v:1,alg:t,kid:c,iv:x(y),tag:x(d),ct:x(E)},kid:c}},async decrypt(a){let c=ee(a.ciphertext),l=a.candidateKids&&a.candidateKids.length>0?a.candidateKids:[c.kid],y=O(c.iv),f=O(c.tag),h=O(c.ct),m=new Uint8Array(h.length+f.length);m.set(h,0),m.set(f,h.length);let F=new TextEncoder().encode(JSON.stringify(a.aad??{})),d;for(let E of l)try{let T=await o(E),ae=await crypto.subtle.decrypt({name:"AES-GCM",iv:g(y),additionalData:g(F),tagLength:128},T,g(m));return new TextDecoder().decode(new Uint8Array(ae))}catch(T){d=T}throw Error(`Failed to decrypt ciphertext: ${d instanceof Error?d.message:String(d??"unknown")}`)},async hash(a){let c=a.kid??e.activeKid,l=await p(c),y=await crypto.subtle.sign("HMAC",l,g(new TextEncoder().encode(a.value)));return ge(y)},mask(a){return te()(a.value)}}}function Ye(){return{encrypt(e){return{ciphertext:JSON.stringify({v:1,alg:"NOOP",kid:"noop",iv:"",tag:"",ct:e.value})}},decrypt(e){try{return ee(e.ciphertext).ct}catch{return e.ciphertext}},hash(e){let t=Ke(e.value);return x(new TextEncoder().encode(t))},mask(e){return te()(e.value)}}}function We(e){return Ce(e)}var Fe;((n)=>{n.DEBUG="DEBUG";n.INFO="INFO";n.WARN="WARN";n.ERROR="ERROR"})(Fe||={});var be=["to","from","phone","phoneNumber","recipient","sender","secret","apiKey","apiSecret","authorization","auth","token","password","payload","message","content","text"];function we(e){let t=e.toLowerCase();return be.some((r)=>t.includes(r.toLowerCase()))}function ve(e){let t=e.trim();if(t.length<=4)return"***";if(t.includes("@")){let[n,s]=t.split("@");return`${n.slice(0,2)}${"*".repeat(Math.max(1,n.length-2))}@${s}`}let r=t.slice(0,3),i=t.slice(-2);return`${r}${"*".repeat(Math.max(1,t.length-5))}${i}`}function U(e,t){if(t===void 0||t===null)return t;if(we(e)){if(typeof t==="string")return ve(t);if(typeof t==="number"||typeof t==="boolean")return"***";if(Array.isArray(t))return"[REDACTED]";if(typeof t==="object")return"[REDACTED]"}if(Array.isArray(t))return t.map((r)=>U(e,r));if(typeof t==="object"){let r={};for(let[i,n]of Object.entries(t))r[i]=U(i,n);return r}return t}function Ae(e){let t={};for(let[r,i]of Object.entries(e))t[r]=U(r,i);return t}class q{config;context;constructor(e={},t={}){this.context=e,this.config={level:"INFO",enableConsole:!0,enableJson:!1,enableColors:!0,...t}}shouldLog(e){let t=["DEBUG","INFO","WARN","ERROR"];return t.indexOf(e)>=t.indexOf(this.config.level)}formatMessage(e){let t=Ae(e.context);if(this.config.enableJson)return JSON.stringify({level:e.level,message:e.message,timestamp:e.timestamp.toISOString(),context:t,...e.error&&{error:{name:e.error.name,message:e.error.message,stack:e.error.stack}},...e.duration&&{duration:e.duration}});let r=e.timestamp.toISOString(),i=this.config.enableColors?this.colorizeLevel(e.level):e.level,n=Object.keys(t).length>0?` [${Object.entries(t).map(([o,p])=>`${o}=${p}`).join(", ")}]`:"",s=`${r} ${i}${n}: ${e.message}`;if(e.duration!==void 0)s+=` (${e.duration}ms)`;if(e.error)s+=`
|
|
2
|
-
${e.error.stack}`;return s}colorizeLevel(e){if(!this.config.enableColors)return e;return`${{["DEBUG"]:"\x1B[36m",["INFO"]:"\x1B[32m",["WARN"]:"\x1B[33m",["ERROR"]:"\x1B[31m"}[e]}${e}\x1B[0m`}writeLog(e){if(!this.shouldLog(e.level))return;let t=this.formatMessage(e);if(this.config.enableConsole)(e.level==="ERROR"?console.error:e.level==="WARN"?console.warn:console.log)(t);if(this.config.enableFile&&this.config.filePath);}debug(e,t={}){this.writeLog({level:"DEBUG",message:e,timestamp:new Date,context:{...this.context,...t}})}info(e,t={}){this.writeLog({level:"INFO",message:e,timestamp:new Date,context:{...this.context,...t}})}warn(e,t={},
|
|
1
|
+
var w;((d)=>{d.INVALID_REQUEST="INVALID_REQUEST";d.AUTHENTICATION_FAILED="AUTHENTICATION_FAILED";d.INSUFFICIENT_BALANCE="INSUFFICIENT_BALANCE";d.TEMPLATE_NOT_FOUND="TEMPLATE_NOT_FOUND";d.RATE_LIMIT_EXCEEDED="RATE_LIMIT_EXCEEDED";d.NETWORK_ERROR="NETWORK_ERROR";d.NETWORK_TIMEOUT="NETWORK_TIMEOUT";d.NETWORK_SERVICE_UNAVAILABLE="NETWORK_SERVICE_UNAVAILABLE";d.PROVIDER_ERROR="PROVIDER_ERROR";d.MESSAGE_SEND_FAILED="MESSAGE_SEND_FAILED";d.CRYPTO_CONFIG_ERROR="CRYPTO_CONFIG_ERROR";d.CRYPTO_ENCRYPT_FAILED="CRYPTO_ENCRYPT_FAILED";d.CRYPTO_DECRYPT_FAILED="CRYPTO_DECRYPT_FAILED";d.CRYPTO_HASH_FAILED="CRYPTO_HASH_FAILED";d.CRYPTO_POLICY_VIOLATION="CRYPTO_POLICY_VIOLATION";d.UNKNOWN_ERROR="UNKNOWN_ERROR"})(w||={});var pe={["INVALID_REQUEST"]:{ko:"잘못된 요청입니다",en:"Invalid request"},["AUTHENTICATION_FAILED"]:{ko:"인증에 실패했습니다",en:"Authentication failed"},["INSUFFICIENT_BALANCE"]:{ko:"잔액이 부족합니다",en:"Insufficient balance"},["TEMPLATE_NOT_FOUND"]:{ko:"템플릿을 찾을 수 없습니다",en:"Template not found"},["RATE_LIMIT_EXCEEDED"]:{ko:"요청 한도를 초과했습니다",en:"Rate limit exceeded"},["NETWORK_ERROR"]:{ko:"네트워크 오류가 발생했습니다",en:"Network error"},["NETWORK_TIMEOUT"]:{ko:"네트워크 요청 시간이 초과되었습니다",en:"Network timeout"},["NETWORK_SERVICE_UNAVAILABLE"]:{ko:"서비스를 일시적으로 사용할 수 없습니다",en:"Service temporarily unavailable"},["PROVIDER_ERROR"]:{ko:"제공자 오류가 발생했습니다",en:"Provider error"},["MESSAGE_SEND_FAILED"]:{ko:"메시지 전송에 실패했습니다",en:"Message send failed"},["CRYPTO_CONFIG_ERROR"]:{ko:"암호화 설정 오류가 발생했습니다",en:"Crypto configuration error"},["CRYPTO_ENCRYPT_FAILED"]:{ko:"암호화에 실패했습니다",en:"Encryption failed"},["CRYPTO_DECRYPT_FAILED"]:{ko:"복호화에 실패했습니다",en:"Decryption failed"},["CRYPTO_HASH_FAILED"]:{ko:"해시 생성에 실패했습니다",en:"Hash generation failed"},["CRYPTO_POLICY_VIOLATION"]:{ko:"암호화 정책 위반이 발생했습니다",en:"Crypto policy violation"},["UNKNOWN_ERROR"]:{ko:"알 수 없는 오류가 발생했습니다",en:"Unknown error"}},$=new Set(["NETWORK_ERROR","RATE_LIMIT_EXCEEDED","NETWORK_TIMEOUT","NETWORK_SERVICE_UNAVAILABLE","PROVIDER_ERROR","UNKNOWN_ERROR"]),j=new Set(["INVALID_REQUEST","AUTHENTICATION_FAILED","INSUFFICIENT_BALANCE","TEMPLATE_NOT_FOUND","MESSAGE_SEND_FAILED","CRYPTO_CONFIG_ERROR","CRYPTO_ENCRYPT_FAILED","CRYPTO_DECRYPT_FAILED","CRYPTO_HASH_FAILED","CRYPTO_POLICY_VIOLATION"]),C=(e)=>{if(typeof e!=="number"||Number.isNaN(e)||!Number.isFinite(e))return;return Math.trunc(e)},G=(e)=>{let t=C(e);if(t===void 0||t<0)return;return t},D=(e)=>{if(typeof e!=="string")return;return e.toLowerCase().trim()},J=(e)=>{if(e>=500)return"retryable";if(e===408||e===425||e===429)return"retryable";return"non_retryable"},V=(e)=>{let t=e.toLowerCase();if(t.includes("timeout")||t.includes("temporar")||t.includes("network")||t.includes("retry"))return"retryable";return};class h extends Error{code;details;providerErrorCode;providerErrorText;httpStatus;requestId;retryAfterMs;attempt;causeChain;constructor(e,t,i,r={}){super(t);if(this.name="KMsgError",this.code=e,this.details=i,this.providerErrorCode=r.providerErrorCode,this.providerErrorText=r.providerErrorText,this.httpStatus=C(r.httpStatus),this.requestId=typeof r.requestId==="string"?r.requestId:void 0,this.retryAfterMs=C(r.retryAfterMs),this.attempt=C(r.attempt),Array.isArray(r.causeChain))this.causeChain=r.causeChain;else if(r.causeChain!==void 0)this.causeChain=[r.causeChain];if(Error.captureStackTrace)Error.captureStackTrace(this,h)}getLocalizedMessage(e="ko"){let t=pe[this.code];if(t?.[e])return t[e];return this.message}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 P={isRetryable(e,t={}){return P.classifyForRetry(e,t)==="retryable"},classifyForRetry(e,t={}){if(e instanceof h){if(new Set(t.retryableCodes??Array.from($)).has(e.code))return"retryable";if(new Set(t.nonRetryableCodes??Array.from(j)).has(e.code))return"non_retryable";if(e.httpStatus!==void 0)return J(e.httpStatus);let a=V(e.message);if(a)return a;if(t.classifyByMessage&&e.message){let c=t.classifyByMessage(e.message);if(c)return c}if(t.fallback)return t.fallback;return"non_retryable"}let i=e&&typeof e==="object"?e:void 0,r=D(i?.status)??D(i?.statusCode)??D(i?.code),n=C(i?.status)??C(i?.statusCode)??C(i?.httpStatus);if(typeof r==="string"&&r.startsWith("5"))return"retryable";if(n!==void 0){if(t.classifyByStatusCode)return t.classifyByStatusCode(n);return J(n)}let s=typeof i?.message==="string"?V(i.message):void 0;if(s)return s;if(t.classifyByMessage&&typeof i?.message==="string"){let o=t.classifyByMessage(i.message);if(o)return o}return t.fallback??"non_retryable"},resolveRetryAfterMs(e,t){if(t?.retryAfterMs){let i=t.retryAfterMs(e),r=G(i);if(r!==void 0)return r}if(e.retryAfterMs!==void 0)return G(e.retryAfterMs);if(e.code==="RATE_LIMIT_EXCEEDED"&&e.retryAfterMs===void 0)return;return},isUnknownStatus:(e)=>{if(e===void 0||Number.isNaN(e)||!Number.isFinite(e))return!1;return e<500},toRetryMetadata(e){return{providerErrorCode:e.providerErrorCode,providerErrorText:e.providerErrorText,httpStatus:e.httpStatus,requestId:e.requestId,retryAfterMs:e.retryAfterMs,attempt:e.attempt,causeChain:e.causeChain}},withAttempt(e,t){return new h(e.code,e.message,e.details,{...P.toRetryMetadata(e),attempt:C(t)})},DEFAULT_RETRYABLE_ERROR_CODES:$,DEFAULT_NON_RETRYABLE_ERROR_CODES:j};function ce(e){switch(e){case"config":return"CRYPTO_CONFIG_ERROR";case"encrypt":return"CRYPTO_ENCRYPT_FAILED";case"decrypt":return"CRYPTO_DECRYPT_FAILED";case"hash":return"CRYPTO_HASH_FAILED";case"policy":return"CRYPTO_POLICY_VIOLATION"}}class v extends h{kind;fieldPath;failMode;openFallback;constructor(e,t,i,r={}){super(ce(e),t,i,r);this.name="FieldCryptoError",this.kind=e,this.fieldPath=typeof r.fieldPath==="string"?r.fieldPath:void 0,this.failMode=r.failMode,this.openFallback=r.openFallback}toJSON(){return{...super.toJSON(),kind:this.kind,fieldPath:this.fieldPath,failMode:this.failMode,openFallback:this.openFallback}}}var de=["tenantId","providerId","messageId"];function S(e){if(typeof e!=="string")return;let t=e.trim();return t.length>0?t:void 0}function ye(e){if(typeof e!=="number"||!Number.isFinite(e))return;if(e<=0||e>100)return;return e}function Y(e){let t=[];for(let i of e){let r=S(i.kid),n=ye(i.percentage);if(!r||n===void 0)continue;t.push({kid:r,percentage:n})}return t}function le(e,t,i){let r=t.map((n)=>{let s=e[n];return typeof s==="string"?s:""}).join("|");return`${i}::${r}`}function fe(e){let t=2166136261;for(let i=0;i<e.length;i+=1)t^=e.charCodeAt(i),t=t*16777619>>>0;return t>>>0}function he(e,t){let i=0;for(let r of e)if(i+=r.percentage,t<i)return r.kid;return}function I(e,t,i){let r=Y(t.buckets),n=S(t.defaultKid)??S(i);if(r.length===0)return n;let s=S(t.seed)??"kmsg-rollout-v1",o=t.stickyFields??de,p=le(e,o,s),a=fe(p)%100;return he(r,a)??n}function W(e){return Y(e.buckets).map((t)=>t.kid)}function b(e){if(typeof e!=="string")return;let t=e.trim();return t.length>0?t:void 0}function _(e){if(!Array.isArray(e))return[];return e.map((t)=>b(t)).filter((t)=>Boolean(t))}function B(e){let t=[],i=new Set;for(let r of e){let n=b(r);if(!n||i.has(n))continue;i.add(n),t.push(n)}return t}function ue(e){return b(e.providerId)??"default"}function Q(e){let t=b(e.activeKid)??"default",i=B([t,..._(e.decryptKids)]);return{async resolveEncryptKey(){return{kid:t}},async resolveDecryptKeys(){return i}}}function k(e){let t=typeof e.cacheTtlMs==="number"&&e.cacheTtlMs>=0?Math.trunc(e.cacheTtlMs):30000,i=b(e.fallback?.activeKid),r=_(e.fallback?.decryptKids),n;async function s(o){let p=Date.now();if(n&&p<n.expiresAt)return n.value;let a=await e.provider.loadKeySet(o),c=b(a.activeKid)??i??ue(o),y=B([c,..._(a.decryptKids),...r]),l={activeKid:c,decryptKids:y,refreshedAt:Date.now()};return n={value:l,expiresAt:Date.now()+t},l}return{async resolveEncryptKey(o){return{kid:(await s(o)).activeKid}},async resolveDecryptKeys(o){let p=await s(o);return p.decryptKids??[p.activeKid]}}}function Ee(e,t){return{async resolveEncryptKey(i){let r=await e.resolveEncryptKey(i);return{kid:I(i,t,r.kid)??r.kid}},async resolveDecryptKeys(i){let r=await e.resolveEncryptKey(i),n=e.resolveDecryptKeys?await e.resolveDecryptKeys(i):[r.kid],s=I(i,t,r.kid),o=W(t);return B([...s?[s]:[],r.kid,...n??[],...o])}}}function Ie(e){return k({provider:{async loadKeySet(i){return e.client.getKeyState({...i,...e.keyAlias?{keyAlias:e.keyAlias}:{},...e.region?{region:e.region}:{}})}},cacheTtlMs:e.cacheTtlMs,fallback:{activeKid:e.fallbackActiveKid,decryptKids:e.fallbackDecryptKids}})}function R(e){if(typeof e!=="string")return;let t=e.trim();return t.length>0?t:void 0}function Z(e,t){return R(e[t])}function me(e,t){if(!e)return[];return e.split(t).map((i)=>R(i)).filter((i)=>Boolean(i))}function Ne(e={}){let t=e.env??(typeof process<"u"?process.env:{}),i=R(e.delimiter)??",",r=e.activeKidEnv??"KMSG_ACTIVE_KID",n=e.decryptKidsEnv??"KMSG_DECRYPT_KIDS",s=Z(t,r)??R(e.fallbackActiveKid)??"default",o=[s,...me(Z(t,n),i),...e.fallbackDecryptKids??[]];return Q({activeKid:s,decryptKids:o})}function He(e){return k({provider:{async loadKeySet(i){return e.client.getKeyState({...i,...e.mountPath?{mountPath:e.mountPath}:{},...e.keyName?{keyName:e.keyName}:{},...e.namespace?{namespace:e.namespace}:{}})}},cacheTtlMs:e.cacheTtlMs,fallback:{activeKid:e.fallbackActiveKid,decryptKids:e.fallbackDecryptKids}})}function N(e){return typeof e==="function"}function X(e){if(typeof e!=="string")return;let t=e.trim();return t.length>0?t:void 0}function L(e,t,i){let r=e.fields[t];if(r)return r;if(t.startsWith("metadata.")){let n=e.fields["metadata.*"];if(n)return n}return i}function ge(e,t={}){let i=[];if(!e||typeof e!=="object")return{valid:!1,issues:[{message:"fieldCrypto config must be an object",rule:"fieldCrypto.config.object",hint:"Provide a valid FieldCryptoConfig object"}]};if(!e.provider||typeof e.provider!=="object")i.push({message:"fieldCrypto provider is required",rule:"fieldCrypto.provider.required",path:"provider",hint:"Set provider with encrypt/decrypt/hash methods"});else{if(!N(e.provider.encrypt))i.push({message:"provider.encrypt must be a function",rule:"fieldCrypto.provider.encrypt.required",path:"provider.encrypt"});if(!N(e.provider.decrypt))i.push({message:"provider.decrypt must be a function",rule:"fieldCrypto.provider.decrypt.required",path:"provider.decrypt"});if(!N(e.provider.hash))i.push({message:"provider.hash must be a function",rule:"fieldCrypto.provider.hash.required",path:"provider.hash"})}if(!e.fields||typeof e.fields!=="object")i.push({message:"fieldCrypto.fields must be an object",rule:"fieldCrypto.fields.object",path:"fields",hint:"Define policies such as to, from, metadata.phoneNumber"});else{let s=Object.entries(e.fields);if(s.length===0)i.push({message:"fieldCrypto.fields must not be empty",rule:"fieldCrypto.fields.non_empty",path:"fields",hint:"Add at least one field mode mapping"});for(let[o,p]of s){if(!X(o))i.push({message:"field path must be a non-empty string",rule:"fieldCrypto.fields.path.non_empty",path:"fields"});if(p!=="plain"&&p!=="encrypt"&&p!=="encrypt+hash"&&p!=="mask")i.push({message:`unsupported field mode: ${String(p)}`,rule:"fieldCrypto.fields.mode.supported",path:`fields.${o}`})}}let r=e.failMode??"closed",n=e.openFallback??"masked";if(r==="open"&&n==="plaintext"&&e.unsafeAllowPlaintextStorage!==!0)i.push({message:"openFallback=plaintext requires unsafeAllowPlaintextStorage=true",rule:"fieldCrypto.fail_open.plaintext_guard",path:"openFallback",hint:"Use masked/null fallback, or explicitly enable unsafe plaintext"});if(Array.isArray(e.aadFields)){if(e.aadFields.length===0)i.push({message:"aadFields must not be empty when provided",rule:"fieldCrypto.aad_fields.non_empty",path:"aadFields"});for(let s=0;s<e.aadFields.length;s+=1){let o=e.aadFields[s];if(!X(o))i.push({message:"aadFields cannot include empty key",rule:"fieldCrypto.aad_fields.no_empty_key",path:`aadFields[${s}]`})}}if(t.secureMode&&!t.compatPlainColumns){let s=L(e,"to","encrypt+hash"),o=L(e,"from","encrypt+hash");if(s==="plain")i.push({message:"secure mode requires non-plain policy for `to` when compatPlainColumns=false",rule:"fieldCrypto.secure_mode.to_non_plain",path:"fields.to",hint:"Use encrypt+hash for lookup fields"});if(o==="plain")i.push({message:"secure mode requires non-plain policy for `from` when compatPlainColumns=false",rule:"fieldCrypto.secure_mode.from_non_plain",path:"fields.from",hint:"Use encrypt+hash for lookup fields"})}return{valid:i.length===0,issues:i}}function Ge(e,t={}){let i=ge(e,t);if(i.valid)return;let r=i.issues[0];if(!r)throw new v("config","fieldCrypto config validation failed",{rule:"fieldCrypto.config.invalid",issues:i.issues});throw new v("config",r.message,{rule:r.rule,path:r.path,hint:r.hint,issues:i.issues},{fieldPath:r.path})}function x(e){let t=e instanceof Uint8Array?e:new Uint8Array(e),i=typeof globalThis<"u"?globalThis.Buffer:void 0;return(i?i.from(t).toString("base64"):btoa(String.fromCharCode(...t))).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function O(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),i=t.length%4===0?t:`${t}${"=".repeat(4-t.length%4)}`,r=typeof globalThis<"u"?globalThis.Buffer:void 0;if(r)return new Uint8Array(r.from(i,"base64"));let n=atob(i),s=new Uint8Array(n.length);for(let o=0;o<n.length;o+=1)s[o]=n.charCodeAt(o);return s}function z(e,t){if(e instanceof Uint8Array)return e;if(e instanceof ArrayBuffer)return new Uint8Array(e);if(t==="base64url")return O(e);return new TextEncoder().encode(e)}function Ce(e){let t=e instanceof Uint8Array?e:new Uint8Array(e);return Array.from(t).map((i)=>i.toString(16).padStart(2,"0")).join("")}function g(e){let t=new Uint8Array(e.byteLength);return t.set(e),t.buffer}function ee(e){let t=JSON.parse(e);if(!t||typeof t!=="object"||typeof t.v!=="number"||typeof t.alg!=="string"||typeof t.kid!=="string"||typeof t.iv!=="string"||typeof t.tag!=="string"||typeof t.ct!=="string")throw Error("Invalid ciphertext envelope");return t}function Ke(e){if(typeof e==="string")return e;return JSON.stringify(e)}function Ve(e){if(!e||typeof e!=="object")return!1;let t=e;return typeof t.v==="number"&&typeof t.alg==="string"&&typeof t.kid==="string"&&typeof t.iv==="string"&&typeof t.tag==="string"&&typeof t.ct==="string"}function Fe(e){let t=String(e??"").trim();if(t.length===0)return"";let i=t.startsWith("+"),r=t.replace(/\D/g,"");return i?`+${r}`:r}function te(e=3,t=2){return(i)=>{let r=String(i??"");if(r.length<=e+t)return"*".repeat(Math.max(0,r.length));let n=r.slice(0,e),s=r.slice(-t);return`${n}${"*".repeat(r.length-e-t)}${s}`}}function Ye(e){let t=e.algorithm??"A256GCM",i=e.keyEncoding??"base64url",r=e.hashKeyEncoding??i,n=new Map,s=new Map,o=(a)=>{let c=n.get(a);if(c)return c;let y=e.keys[a];if(!y)throw Error(`Unknown encryption key id: ${a}`);let l=z(y,i),f=crypto.subtle.importKey("raw",g(l),"AES-GCM",!1,["encrypt","decrypt"]);return n.set(a,f),f},p=(a)=>{let c=s.get(a);if(c)return c;let y=e.hashKeys?.[a]??e.keys[a];if(!y)throw Error(`Unknown hash key id: ${a}`);let l=z(y,r),f=crypto.subtle.importKey("raw",g(l),{name:"HMAC",hash:"SHA-256"},!1,["sign"]);return s.set(a,f),f};return{async encrypt(a){let c=a.kid??e.activeKid,y=await o(c),l=crypto.getRandomValues(new Uint8Array(12)),f=new TextEncoder().encode(JSON.stringify(a.aad??{})),u=new TextEncoder().encode(a.value),m=await crypto.subtle.encrypt({name:"AES-GCM",iv:g(l),additionalData:g(f),tagLength:128},y,g(u)),F=new Uint8Array(m),d=F.slice(F.length-16),E=F.slice(0,F.length-16);return{ciphertext:{v:1,alg:t,kid:c,iv:x(l),tag:x(d),ct:x(E)},kid:c}},async decrypt(a){let c=ee(a.ciphertext),y=a.candidateKids&&a.candidateKids.length>0?a.candidateKids:[c.kid],l=O(c.iv),f=O(c.tag),u=O(c.ct),m=new Uint8Array(u.length+f.length);m.set(u,0),m.set(f,u.length);let F=new TextEncoder().encode(JSON.stringify(a.aad??{})),d;for(let E of y)try{let T=await o(E),ae=await crypto.subtle.decrypt({name:"AES-GCM",iv:g(l),additionalData:g(F),tagLength:128},T,g(m));return new TextDecoder().decode(new Uint8Array(ae))}catch(T){d=T}throw Error(`Failed to decrypt ciphertext: ${d instanceof Error?d.message:String(d??"unknown")}`)},async hash(a){let c=a.kid??e.activeKid,y=await p(c),l=await crypto.subtle.sign("HMAC",y,g(new TextEncoder().encode(a.value)));return Ce(l)},mask(a){return te()(a.value)}}}function We(){return{encrypt(e){return{ciphertext:JSON.stringify({v:1,alg:"NOOP",kid:"noop",iv:"",tag:"",ct:e.value})}},decrypt(e){try{return ee(e.ciphertext).ct}catch{return e.ciphertext}},hash(e){let t=Fe(e.value);return x(new TextEncoder().encode(t))},mask(e){return te()(e.value)}}}function Qe(e){return Ke(e)}var be;((n)=>{n.DEBUG="DEBUG";n.INFO="INFO";n.WARN="WARN";n.ERROR="ERROR"})(be||={});var Ae=["to","from","phone","phoneNumber","recipient","sender","secret","apiKey","apiSecret","authorization","auth","token","password","payload","message","content","text"];function Pe(e){let t=e.toLowerCase();return Ae.some((i)=>t.includes(i.toLowerCase()))}function we(e){let t=e.trim();if(t.length<=4)return"***";if(t.includes("@")){let[n,s]=t.split("@");return`${n.slice(0,2)}${"*".repeat(Math.max(1,n.length-2))}@${s}`}let i=t.slice(0,3),r=t.slice(-2);return`${i}${"*".repeat(Math.max(1,t.length-5))}${r}`}function q(e,t){if(t===void 0||t===null)return t;if(Pe(e)){if(typeof t==="string")return we(t);if(typeof t==="number"||typeof t==="boolean")return"***";if(Array.isArray(t))return"[REDACTED]";if(typeof t==="object")return"[REDACTED]"}if(Array.isArray(t))return t.map((i)=>q(e,i));if(typeof t==="object"){let i={};for(let[r,n]of Object.entries(t))i[r]=q(r,n);return i}return t}function ve(e){let t={};for(let[i,r]of Object.entries(e))t[i]=q(i,r);return t}class U{config;context;constructor(e={},t={}){this.context=e,this.config={level:"INFO",enableConsole:!0,enableJson:!1,enableColors:!0,...t}}shouldLog(e){let t=["DEBUG","INFO","WARN","ERROR"];return t.indexOf(e)>=t.indexOf(this.config.level)}formatMessage(e){let t=ve(e.context);if(this.config.enableJson)return JSON.stringify({level:e.level,message:e.message,timestamp:e.timestamp.toISOString(),context:t,...e.error&&{error:{name:e.error.name,message:e.error.message,stack:e.error.stack}},...e.duration&&{duration:e.duration}});let i=e.timestamp.toISOString(),r=this.config.enableColors?this.colorizeLevel(e.level):e.level,n=Object.keys(t).length>0?` [${Object.entries(t).map(([o,p])=>`${o}=${p}`).join(", ")}]`:"",s=`${i} ${r}${n}: ${e.message}`;if(e.duration!==void 0)s+=` (${e.duration}ms)`;if(e.error)s+=`
|
|
2
|
+
${e.error.stack}`;return s}colorizeLevel(e){if(!this.config.enableColors)return e;return`${{["DEBUG"]:"\x1B[36m",["INFO"]:"\x1B[32m",["WARN"]:"\x1B[33m",["ERROR"]:"\x1B[31m"}[e]}${e}\x1B[0m`}writeLog(e){if(!this.shouldLog(e.level))return;let t=this.formatMessage(e);if(this.config.enableConsole)(e.level==="ERROR"?console.error:e.level==="WARN"?console.warn:console.log)(t);if(this.config.enableFile&&this.config.filePath);}debug(e,t={}){this.writeLog({level:"DEBUG",message:e,timestamp:new Date,context:{...this.context,...t}})}info(e,t={}){this.writeLog({level:"INFO",message:e,timestamp:new Date,context:{...this.context,...t}})}warn(e,t={},i){this.writeLog({level:"WARN",message:e,timestamp:new Date,context:{...this.context,...t},error:i})}error(e,t={},i){this.writeLog({level:"ERROR",message:e,timestamp:new Date,context:{...this.context,...t},error:i})}child(e){return new U({...this.context,...e},this.config)}time(e){let t=Date.now();return()=>{let i=Date.now()-t;this.info(`${e} completed`,{duration:i})}}async measure(e,t,i={}){let r=Date.now(),n={...i,operation:e};this.debug(`Starting ${e}`,n);try{let s=await t(),o=Date.now()-r;return this.info(`Completed ${e}`,{...n,duration:o}),s}catch(s){let o=Date.now()-r;throw this.error(`Failed ${e}`,{...n,duration:o},s instanceof Error?s:Error(String(s))),s}}}var M;function ie(e,t){return new U(e,t)}function K(){if(!M)M=ie();return M}function Xe(e){M=e}var Le={debug:(e,t)=>K().debug(e,t),info:(e,t)=>K().info(e,t),warn:(e,t,i)=>K().warn(e,t,i),error:(e,t,i)=>K().error(e,t,i),child:(e)=>K().child(e),time:(e)=>K().time(e),measure:(e,t,i)=>K().measure(e,t,i)};function ze(e){let t=ie({},e);return async(i,r)=>{let n=Date.now(),o={requestId:Math.random().toString(36).substring(7),method:i.req.method,path:i.req.path,userAgent:i.req.header("user-agent")||"unknown"};t.info("Request started",o);try{await r();let p=Date.now()-n;t.info("Request completed",{...o,status:i.res.status,duration:p})}catch(p){let a=Date.now()-n;throw t.error("Request failed",{...o,duration:a},p instanceof Error?p:Error(String(p))),p}}}class A{static defaultOptions={maxAttempts:3,initialDelay:1000,maxDelay:30000,backoffMultiplier:2,jitter:!0,retryCondition:(e)=>P.isRetryable(e)};static async execute(e,t={}){let i={...A.defaultOptions,...t},r,n=i.initialDelay;for(let s=1;s<=i.maxAttempts;s++)try{return await e()}catch(o){if(r=o,s===i.maxAttempts||!i.retryCondition(r,s))throw r;let p=i.jitter?n+Math.random()*n*0.1:n;i.onRetry?.(r,s),await new Promise((a)=>setTimeout(a,p)),n=Math.min(n*i.backoffMultiplier,i.maxDelay)}throw r}static createRetryableFunction(e,t={}){return async(...i)=>{return A.execute(()=>e(...i),t)}}}class H{static async execute(e,t,i={}){let r={concurrency:5,retryOptions:{maxAttempts:3,initialDelay:1000,maxDelay:1e4,backoffMultiplier:2,jitter:!0},failFast:!1,...i},n=Date.now(),s=[],o=[],p=0,a=A.createRetryableFunction(t,r.retryOptions),c=H.createBatches(e,r.concurrency);for(let l of c){let f=l.map(async(u)=>{try{let m=await a(u);s.push({item:u,result:m})}catch(m){if(o.push({item:u,error:m}),r.failFast)throw new h("MESSAGE_SEND_FAILED",`Bulk operation failed fast after ${o.length} failures`,{totalItems:e.length,failedCount:o.length})}finally{p++,r.onProgress?.(p,e.length,o.length)}});if(await Promise.allSettled(f),r.failFast&&o.length>0)break}let y=Date.now()-n;return{successful:s,failed:o,summary:{total:e.length,successful:s.length,failed:o.length,duration:y}}}static createBatches(e,t){let i=[];for(let r=0;r<e.length;r+=t)i.push(e.slice(r,r+t));return i}}class re{options;state="CLOSED";failureCount=0;lastFailureTime=0;nextAttemptTime=0;constructor(e){this.options=e}async execute(e){let t=Date.now();switch(this.state){case"OPEN":if(t<this.nextAttemptTime)throw new h("NETWORK_SERVICE_UNAVAILABLE","Circuit breaker is OPEN",{state:this.state,nextAttemptTime:this.nextAttemptTime});this.state="HALF_OPEN",this.options.onHalfOpen?.();break;case"HALF_OPEN":break;case"CLOSED":break}try{let i=await Promise.race([e(),new Promise((r,n)=>setTimeout(()=>n(new h("NETWORK_TIMEOUT","Circuit breaker timeout",{timeout:this.options.timeout})),this.options.timeout))]);if(this.state==="HALF_OPEN")this.state="CLOSED",this.failureCount=0,this.options.onClose?.();return i}catch(i){throw this.recordFailure(),i}}recordFailure(){if(this.failureCount++,this.lastFailureTime=Date.now(),this.failureCount>=this.options.failureThreshold)this.state="OPEN",this.nextAttemptTime=this.lastFailureTime+this.options.resetTimeout,this.options.onOpen?.()}getState(){return this.state}getFailureCount(){return this.failureCount}reset(){this.state="CLOSED",this.failureCount=0,this.lastFailureTime=0,this.nextAttemptTime=0}}class ne{maxRequests;windowMs;requests=[];constructor(e,t){this.maxRequests=e;this.windowMs=t}async acquire(){let e=Date.now();if(this.requests=this.requests.filter((t)=>e-t<this.windowMs),this.requests.length>=this.maxRequests){let t=Math.min(...this.requests),i=this.windowMs-(e-t);if(i>0)return await new Promise((r)=>setTimeout(r,i)),this.acquire()}this.requests.push(e)}canMakeRequest(){let e=Date.now();return this.requests=this.requests.filter((t)=>e-t<this.windowMs),this.requests.length<this.maxRequests}getRemainingRequests(){let e=Date.now();return this.requests=this.requests.filter((t)=>e-t<this.windowMs),Math.max(0,this.maxRequests-this.requests.length)}}var se=(e)=>({isSuccess:!0,isFailure:!1,value:e}),oe=(e)=>({isSuccess:!1,isFailure:!0,error:e}),ht={map(e,t){if(e.isSuccess)return se(t(e.value));return e},flatMap(e,t){if(e.isSuccess)return t(e.value);return e},mapError(e,t){if(e.isFailure)return oe(t(e.error));return e},unwrap(e){if(e.isSuccess)return e.value;throw e.error},unwrapOr(e,t){if(e.isSuccess)return e.value;return t},unwrapOrElse(e,t){if(e.isSuccess)return e.value;return t(e.error)},match(e,t){if(e.isSuccess)return t.ok(e.value);return t.fail(e.error)},async fromPromise(e){try{let t=await e;return se(t)}catch(t){return oe(t)}},isOk(e){return e.isSuccess},isFail(e){return e.isFailure},tap(e,t){return t(e),e},tapOk(e,t){if(e.isSuccess)t(e.value);return e},tapErr(e,t){if(e.isFailure)t(e.error);return e},expect(e,t){if(e.isSuccess)return e.value;throw Error(t,{cause:e.error})}};function Se(){let e=globalThis;return e.__K_MSG_ENV__??e.__ENV__??e.process?.env??{}}function mt(e){let t=Se()[e];if(typeof t==="string")return t;if(t===void 0)return;return String(t)}var Ct=["PENDING","SENT","FAILED"],Kt="PENDING",Ft=(e)=>{let t=typeof e==="string"?e.trim().toUpperCase():"";if(t==="PENDING"||t==="SENT"||t==="FAILED")return t;return"PENDING"};export{ge as validateFieldCryptoConfig,Qe as toCiphertextEnvelopeString,Xe as setGlobalLogger,I as selectActiveKidByRollout,L as resolveFieldMode,mt as readRuntimeEnv,se as ok,G as normalizeRetryAfterMs,Fe as normalizePhoneForHash,Ft as normalizeMessageStatus,ze as loggerMiddleware,Le as logger,Ve as isCryptoEnvelope,Se as getRuntimeEnvSource,W as getRolloutKnownKids,K as getLogger,oe as fail,He as createVaultTransitKeyResolver,Q as createStaticKeyResolver,Ee as createRollingKeyResolver,k as createRefreshableKeyResolver,We as createNoopFieldCryptoProvider,ie as createLogger,Ne as createEnvKeyResolver,te as createDefaultMasker,Ie as createAwsKmsKeyResolver,Ye as createAesGcmFieldCryptoProvider,Ge as assertFieldCryptoConfig,A as RetryHandler,ht as Result,ne as RateLimiter,Kt as QUEUED_MESSAGE_STATUS,U as Logger,be as LogLevel,Ct as KNOWN_MESSAGE_STATUSES,w as KMsgErrorCode,h as KMsgError,v as FieldCryptoError,P as ErrorUtils,re as CircuitBreaker,H as BulkOperationHandler};
|
|
3
3
|
|
|
4
|
-
//# debugId=
|
|
4
|
+
//# debugId=79A2E7190D2C917D64756E2164756E21
|
|
5
5
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/errors.ts", "../src/crypto/errors.ts", "../src/crypto/rollout-policy.ts", "../src/crypto/key-resolver.ts", "../src/crypto/key-adapters/aws-kms.ts", "../src/crypto/key-adapters/env.ts", "../src/crypto/key-adapters/vault-transit.ts", "../src/crypto/policy.ts", "../src/crypto/types.ts", "../src/logger.ts", "../src/resilience/retry-handler.ts", "../src/resilience/bulk-operation.ts", "../src/resilience/circuit-breaker.ts", "../src/resilience/rate-limiter.ts", "../src/result.ts", "../src/runtime/env.ts", "../src/types/message.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 CRYPTO_CONFIG_ERROR = \"CRYPTO_CONFIG_ERROR\",\n CRYPTO_ENCRYPT_FAILED = \"CRYPTO_ENCRYPT_FAILED\",\n CRYPTO_DECRYPT_FAILED = \"CRYPTO_DECRYPT_FAILED\",\n CRYPTO_HASH_FAILED = \"CRYPTO_HASH_FAILED\",\n CRYPTO_POLICY_VIOLATION = \"CRYPTO_POLICY_VIOLATION\",\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> =\n 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> =\n 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 KMsgErrorCode.CRYPTO_CONFIG_ERROR,\n KMsgErrorCode.CRYPTO_ENCRYPT_FAILED,\n KMsgErrorCode.CRYPTO_DECRYPT_FAILED,\n KMsgErrorCode.CRYPTO_HASH_FAILED,\n KMsgErrorCode.CRYPTO_POLICY_VIOLATION,\n ]);\n\nconst normalizeNumber = (value: unknown): number | undefined => {\n if (\n typeof value !== \"number\" ||\n Number.isNaN(value) ||\n !Number.isFinite(value)\n ) {\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 (\n normalized.includes(\"timeout\") ||\n normalized.includes(\"temporar\") ||\n normalized.includes(\"network\") ||\n normalized.includes(\"retry\")\n ) {\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, unknown>;\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, unknown>,\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 =\n 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: unknown, policy: ErrorRetryPolicy = {}): boolean {\n return ErrorUtils.classifyForRetry(error, policy) === \"retryable\";\n },\n\n classifyForRetry(\n error: unknown,\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 ??\n 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 candidate =\n error && typeof error === \"object\"\n ? (error as {\n status?: unknown;\n statusCode?: unknown;\n httpStatus?: unknown;\n code?: unknown;\n message?: unknown;\n })\n : undefined;\n\n const status =\n toLowerString(candidate?.status) ??\n toLowerString(candidate?.statusCode) ??\n toLowerString(candidate?.code);\n const statusCode =\n normalizeNumber(candidate?.status) ??\n normalizeNumber(candidate?.statusCode) ??\n normalizeNumber(candidate?.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 candidate?.message === \"string\"\n ? classifyByMessage(candidate.message)\n : undefined;\n\n if (classifiedByMessage) {\n return classifiedByMessage;\n }\n\n if (policy.classifyByMessage && typeof candidate?.message === \"string\") {\n const classified = policy.classifyByMessage(candidate.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 (\n error.code === KMsgErrorCode.RATE_LIMIT_EXCEEDED &&\n error.retryAfterMs === undefined\n ) {\n return undefined;\n }\n\n return undefined;\n },\n\n isUnknownStatus: (statusCode: number | undefined): boolean => {\n if (\n statusCode === undefined ||\n Number.isNaN(statusCode) ||\n !Number.isFinite(statusCode)\n ) {\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(error: KMsgError, attempt: number): KMsgError {\n return new KMsgError(error.code, error.message, error.details, {\n ...ErrorUtils.toRetryMetadata(error),\n attempt: normalizeNumber(attempt),\n });\n },\n\n DEFAULT_RETRYABLE_ERROR_CODES,\n DEFAULT_NON_RETRYABLE_ERROR_CODES,\n};\n",
|
|
5
|
+
"export type Locale = \"ko\" | \"en\";\n\nexport 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 CRYPTO_CONFIG_ERROR = \"CRYPTO_CONFIG_ERROR\",\n CRYPTO_ENCRYPT_FAILED = \"CRYPTO_ENCRYPT_FAILED\",\n CRYPTO_DECRYPT_FAILED = \"CRYPTO_DECRYPT_FAILED\",\n CRYPTO_HASH_FAILED = \"CRYPTO_HASH_FAILED\",\n CRYPTO_POLICY_VIOLATION = \"CRYPTO_POLICY_VIOLATION\",\n UNKNOWN_ERROR = \"UNKNOWN_ERROR\",\n}\n\nconst DEFAULT_LOCALE: Locale = \"ko\";\n\nconst ERROR_MESSAGES: Record<KMsgErrorCode, { ko: string; en: string }> = {\n [KMsgErrorCode.INVALID_REQUEST]: {\n ko: \"잘못된 요청입니다\",\n en: \"Invalid request\",\n },\n [KMsgErrorCode.AUTHENTICATION_FAILED]: {\n ko: \"인증에 실패했습니다\",\n en: \"Authentication failed\",\n },\n [KMsgErrorCode.INSUFFICIENT_BALANCE]: {\n ko: \"잔액이 부족합니다\",\n en: \"Insufficient balance\",\n },\n [KMsgErrorCode.TEMPLATE_NOT_FOUND]: {\n ko: \"템플릿을 찾을 수 없습니다\",\n en: \"Template not found\",\n },\n [KMsgErrorCode.RATE_LIMIT_EXCEEDED]: {\n ko: \"요청 한도를 초과했습니다\",\n en: \"Rate limit exceeded\",\n },\n [KMsgErrorCode.NETWORK_ERROR]: {\n ko: \"네트워크 오류가 발생했습니다\",\n en: \"Network error\",\n },\n [KMsgErrorCode.NETWORK_TIMEOUT]: {\n ko: \"네트워크 요청 시간이 초과되었습니다\",\n en: \"Network timeout\",\n },\n [KMsgErrorCode.NETWORK_SERVICE_UNAVAILABLE]: {\n ko: \"서비스를 일시적으로 사용할 수 없습니다\",\n en: \"Service temporarily unavailable\",\n },\n [KMsgErrorCode.PROVIDER_ERROR]: {\n ko: \"제공자 오류가 발생했습니다\",\n en: \"Provider error\",\n },\n [KMsgErrorCode.MESSAGE_SEND_FAILED]: {\n ko: \"메시지 전송에 실패했습니다\",\n en: \"Message send failed\",\n },\n [KMsgErrorCode.CRYPTO_CONFIG_ERROR]: {\n ko: \"암호화 설정 오류가 발생했습니다\",\n en: \"Crypto configuration error\",\n },\n [KMsgErrorCode.CRYPTO_ENCRYPT_FAILED]: {\n ko: \"암호화에 실패했습니다\",\n en: \"Encryption failed\",\n },\n [KMsgErrorCode.CRYPTO_DECRYPT_FAILED]: {\n ko: \"복호화에 실패했습니다\",\n en: \"Decryption failed\",\n },\n [KMsgErrorCode.CRYPTO_HASH_FAILED]: {\n ko: \"해시 생성에 실패했습니다\",\n en: \"Hash generation failed\",\n },\n [KMsgErrorCode.CRYPTO_POLICY_VIOLATION]: {\n ko: \"암호화 정책 위반이 발생했습니다\",\n en: \"Crypto policy violation\",\n },\n [KMsgErrorCode.UNKNOWN_ERROR]: {\n ko: \"알 수 없는 오류가 발생했습니다\",\n en: \"Unknown error\",\n },\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> =\n 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> =\n 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 KMsgErrorCode.CRYPTO_CONFIG_ERROR,\n KMsgErrorCode.CRYPTO_ENCRYPT_FAILED,\n KMsgErrorCode.CRYPTO_DECRYPT_FAILED,\n KMsgErrorCode.CRYPTO_HASH_FAILED,\n KMsgErrorCode.CRYPTO_POLICY_VIOLATION,\n ]);\n\nconst normalizeNumber = (value: unknown): number | undefined => {\n if (\n typeof value !== \"number\" ||\n Number.isNaN(value) ||\n !Number.isFinite(value)\n ) {\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 (\n normalized.includes(\"timeout\") ||\n normalized.includes(\"temporar\") ||\n normalized.includes(\"network\") ||\n normalized.includes(\"retry\")\n ) {\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, unknown>;\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, unknown>,\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 =\n 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 /**\n * Returns a localized error message based on the provided locale.\n * Falls back to Korean (default) if locale is not provided.\n * Falls back to the original message if no localized message exists.\n */\n getLocalizedMessage(locale: Locale = DEFAULT_LOCALE): string {\n const messages = ERROR_MESSAGES[this.code];\n if (messages?.[locale]) {\n return messages[locale];\n }\n return this.message;\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: unknown, policy: ErrorRetryPolicy = {}): boolean {\n return ErrorUtils.classifyForRetry(error, policy) === \"retryable\";\n },\n\n classifyForRetry(\n error: unknown,\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 ??\n 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 candidate =\n error && typeof error === \"object\"\n ? (error as {\n status?: unknown;\n statusCode?: unknown;\n httpStatus?: unknown;\n code?: unknown;\n message?: unknown;\n })\n : undefined;\n\n const status =\n toLowerString(candidate?.status) ??\n toLowerString(candidate?.statusCode) ??\n toLowerString(candidate?.code);\n const statusCode =\n normalizeNumber(candidate?.status) ??\n normalizeNumber(candidate?.statusCode) ??\n normalizeNumber(candidate?.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 candidate?.message === \"string\"\n ? classifyByMessage(candidate.message)\n : undefined;\n\n if (classifiedByMessage) {\n return classifiedByMessage;\n }\n\n if (policy.classifyByMessage && typeof candidate?.message === \"string\") {\n const classified = policy.classifyByMessage(candidate.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 (\n error.code === KMsgErrorCode.RATE_LIMIT_EXCEEDED &&\n error.retryAfterMs === undefined\n ) {\n return undefined;\n }\n\n return undefined;\n },\n\n isUnknownStatus: (statusCode: number | undefined): boolean => {\n if (\n statusCode === undefined ||\n Number.isNaN(statusCode) ||\n !Number.isFinite(statusCode)\n ) {\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(error: KMsgError, attempt: number): KMsgError {\n return new KMsgError(error.code, error.message, error.details, {\n ...ErrorUtils.toRetryMetadata(error),\n attempt: normalizeNumber(attempt),\n });\n },\n\n DEFAULT_RETRYABLE_ERROR_CODES,\n DEFAULT_NON_RETRYABLE_ERROR_CODES,\n};\n",
|
|
6
6
|
"import { KMsgError, KMsgErrorCode, type KMsgErrorMetadata } from \"../errors\";\nimport type { FieldCryptoFailMode, FieldCryptoOpenFallback } from \"./types\";\n\nexport type FieldCryptoErrorKind =\n | \"config\"\n | \"encrypt\"\n | \"decrypt\"\n | \"hash\"\n | \"policy\";\n\nfunction resolveCode(kind: FieldCryptoErrorKind): KMsgErrorCode {\n switch (kind) {\n case \"config\":\n return KMsgErrorCode.CRYPTO_CONFIG_ERROR;\n case \"encrypt\":\n return KMsgErrorCode.CRYPTO_ENCRYPT_FAILED;\n case \"decrypt\":\n return KMsgErrorCode.CRYPTO_DECRYPT_FAILED;\n case \"hash\":\n return KMsgErrorCode.CRYPTO_HASH_FAILED;\n case \"policy\":\n return KMsgErrorCode.CRYPTO_POLICY_VIOLATION;\n }\n}\n\nexport interface FieldCryptoErrorMetadata extends KMsgErrorMetadata {\n fieldPath?: string;\n failMode?: FieldCryptoFailMode;\n openFallback?: FieldCryptoOpenFallback;\n}\n\nexport class FieldCryptoError extends KMsgError {\n readonly kind: FieldCryptoErrorKind;\n readonly fieldPath?: string;\n readonly failMode?: FieldCryptoFailMode;\n readonly openFallback?: FieldCryptoOpenFallback;\n\n constructor(\n kind: FieldCryptoErrorKind,\n message: string,\n details?: Record<string, unknown>,\n metadata: FieldCryptoErrorMetadata = {},\n ) {\n super(resolveCode(kind), message, details, metadata);\n this.name = \"FieldCryptoError\";\n this.kind = kind;\n this.fieldPath =\n typeof metadata.fieldPath === \"string\" ? metadata.fieldPath : undefined;\n this.failMode = metadata.failMode;\n this.openFallback = metadata.openFallback;\n }\n\n override toJSON() {\n return {\n ...super.toJSON(),\n kind: this.kind,\n fieldPath: this.fieldPath,\n failMode: this.failMode,\n openFallback: this.openFallback,\n };\n }\n}\n",
|
|
7
7
|
"import type { FieldCryptoKeyContext } from \"./types\";\n\nexport interface ActiveKidRolloutBucket {\n kid: string;\n percentage: number;\n}\n\nexport interface ActiveKidRolloutPolicy {\n /**\n * Rollout targets in priority order.\n * Example: [{ kid: \"k-2026-02\", percentage: 25 }]\n */\n buckets: readonly ActiveKidRolloutBucket[];\n /**\n * Deterministic hash seed.\n */\n seed?: string;\n /**\n * Context keys used to build sticky rollout identity.\n */\n stickyFields?: readonly (keyof FieldCryptoKeyContext)[];\n /**\n * Fallback kid when no bucket matches.\n */\n defaultKid?: string;\n}\n\nconst DEFAULT_STICKY_FIELDS: readonly (keyof FieldCryptoKeyContext)[] = [\n \"tenantId\",\n \"providerId\",\n \"messageId\",\n];\n\nfunction normalizeKid(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 toUnitPercentage(value: unknown): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return undefined;\n if (value <= 0 || value > 100) return undefined;\n return value;\n}\n\nfunction sanitizeBuckets(\n buckets: readonly ActiveKidRolloutBucket[],\n): ActiveKidRolloutBucket[] {\n const next: ActiveKidRolloutBucket[] = [];\n for (const bucket of buckets) {\n const kid = normalizeKid(bucket.kid);\n const percentage = toUnitPercentage(bucket.percentage);\n if (!kid || percentage === undefined) continue;\n next.push({ kid, percentage });\n }\n return next;\n}\n\nfunction toStickyKey(\n context: FieldCryptoKeyContext,\n fields: readonly (keyof FieldCryptoKeyContext)[],\n seed: string,\n): string {\n const payload = fields\n .map((field) => {\n const value = context[field];\n return typeof value === \"string\" ? value : \"\";\n })\n .join(\"|\");\n return `${seed}::${payload}`;\n}\n\n/**\n * Deterministic FNV-1a 32-bit hash.\n */\nfunction hash32(input: string): number {\n let hash = 0x811c9dc5;\n for (let index = 0; index < input.length; index += 1) {\n hash ^= input.charCodeAt(index);\n hash = (hash * 0x01000193) >>> 0;\n }\n return hash >>> 0;\n}\n\nfunction resolveBucketKid(\n buckets: readonly ActiveKidRolloutBucket[],\n percentile: number,\n): string | undefined {\n let cursor = 0;\n for (const bucket of buckets) {\n cursor += bucket.percentage;\n if (percentile < cursor) {\n return bucket.kid;\n }\n }\n return undefined;\n}\n\nexport function selectActiveKidByRollout(\n context: FieldCryptoKeyContext,\n policy: ActiveKidRolloutPolicy,\n fallbackKid?: string,\n): string | undefined {\n const buckets = sanitizeBuckets(policy.buckets);\n const defaultKid =\n normalizeKid(policy.defaultKid) ?? normalizeKid(fallbackKid);\n\n if (buckets.length === 0) {\n return defaultKid;\n }\n\n const seed = normalizeKid(policy.seed) ?? \"kmsg-rollout-v1\";\n const stickyFields = policy.stickyFields ?? DEFAULT_STICKY_FIELDS;\n const stickyKey = toStickyKey(context, stickyFields, seed);\n const percentile = hash32(stickyKey) % 100;\n return resolveBucketKid(buckets, percentile) ?? defaultKid;\n}\n\nexport function getRolloutKnownKids(\n policy: ActiveKidRolloutPolicy,\n): readonly string[] {\n return sanitizeBuckets(policy.buckets).map((bucket) => bucket.kid);\n}\n",
|
|
8
8
|
"import {\n type ActiveKidRolloutPolicy,\n getRolloutKnownKids,\n selectActiveKidByRollout,\n} from \"./rollout-policy\";\nimport type { FieldCryptoKeyContext, KeyResolver, KeySetState } from \"./types\";\n\nexport interface StaticKeyResolverOptions {\n activeKid: string;\n decryptKids?: readonly string[];\n}\n\nexport interface KeySetStateProvider {\n loadKeySet(context: FieldCryptoKeyContext): Promise<KeySetState>;\n}\n\nexport interface RefreshableKeyResolverOptions {\n provider: KeySetStateProvider;\n cacheTtlMs?: number;\n fallback?: {\n activeKid?: string;\n decryptKids?: readonly string[];\n };\n}\n\ninterface CachedKeySetState {\n value: KeySetState;\n expiresAt: number;\n}\n\nfunction normalizeKid(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 normalizeKidList(value: readonly string[] | undefined): string[] {\n if (!Array.isArray(value)) return [];\n return value\n .map((kid) => normalizeKid(kid))\n .filter((kid): kid is string => Boolean(kid));\n}\n\nfunction dedupeKids(values: readonly string[]): string[] {\n const next: string[] = [];\n const seen = new Set<string>();\n for (const value of values) {\n const normalized = normalizeKid(value);\n if (!normalized || seen.has(normalized)) continue;\n seen.add(normalized);\n next.push(normalized);\n }\n return next;\n}\n\nfunction fallbackKidFromContext(context: FieldCryptoKeyContext): string {\n return normalizeKid(context.providerId) ?? \"default\";\n}\n\nexport function createStaticKeyResolver(\n options: StaticKeyResolverOptions,\n): KeyResolver {\n const activeKid = normalizeKid(options.activeKid) ?? \"default\";\n const decryptKids = dedupeKids([\n activeKid,\n ...normalizeKidList(options.decryptKids),\n ]);\n\n return {\n async resolveEncryptKey() {\n return { kid: activeKid };\n },\n async resolveDecryptKeys() {\n return decryptKids;\n },\n };\n}\n\nexport function createRefreshableKeyResolver(\n options: RefreshableKeyResolverOptions,\n): KeyResolver {\n const cacheTtlMs =\n typeof options.cacheTtlMs === \"number\" && options.cacheTtlMs >= 0\n ? Math.trunc(options.cacheTtlMs)\n : 30_000;\n\n const fallbackActiveKid = normalizeKid(options.fallback?.activeKid);\n const fallbackDecryptKids = normalizeKidList(options.fallback?.decryptKids);\n let cache: CachedKeySetState | undefined;\n\n async function load(context: FieldCryptoKeyContext): Promise<KeySetState> {\n const now = Date.now();\n if (cache && now < cache.expiresAt) {\n return cache.value;\n }\n\n const loaded = await options.provider.loadKeySet(context);\n const activeKid =\n normalizeKid(loaded.activeKid) ??\n fallbackActiveKid ??\n fallbackKidFromContext(context);\n\n const decryptKids = dedupeKids([\n activeKid,\n ...normalizeKidList(loaded.decryptKids),\n ...fallbackDecryptKids,\n ]);\n\n const next: KeySetState = {\n activeKid,\n decryptKids,\n refreshedAt: Date.now(),\n };\n cache = {\n value: next,\n expiresAt: Date.now() + cacheTtlMs,\n };\n return next;\n }\n\n return {\n async resolveEncryptKey(context) {\n const state = await load(context);\n return { kid: state.activeKid };\n },\n async resolveDecryptKeys(context) {\n const state = await load(context);\n return state.decryptKids ?? [state.activeKid];\n },\n };\n}\n\nexport function createRollingKeyResolver(\n baseResolver: KeyResolver,\n policy: ActiveKidRolloutPolicy,\n): KeyResolver {\n return {\n async resolveEncryptKey(context) {\n const base = await baseResolver.resolveEncryptKey(context);\n const selected = selectActiveKidByRollout(context, policy, base.kid);\n return {\n kid: selected ?? base.kid,\n };\n },\n async resolveDecryptKeys(context) {\n const baseEncrypt = await baseResolver.resolveEncryptKey(context);\n const baseDecrypt = baseResolver.resolveDecryptKeys\n ? await baseResolver.resolveDecryptKeys(context)\n : [baseEncrypt.kid];\n const selected = selectActiveKidByRollout(\n context,\n policy,\n baseEncrypt.kid,\n );\n const rolloutKids = getRolloutKnownKids(policy);\n\n return dedupeKids([\n ...(selected ? [selected] : []),\n baseEncrypt.kid,\n ...(baseDecrypt ?? []),\n ...rolloutKids,\n ]);\n },\n };\n}\n",
|
|
@@ -16,11 +16,11 @@
|
|
|
16
16
|
"/**\n * Bulk operation handler with error recovery\n */\n\nimport { KMsgError, KMsgErrorCode } from \"../errors\";\nimport { RetryHandler, type RetryOptions } from \"./retry-handler\";\n\nexport interface BulkOperationOptions {\n concurrency: number;\n retryOptions: RetryOptions;\n failFast: boolean;\n onProgress?: (completed: number, total: number, failed: number) => void;\n}\n\nexport class BulkOperationHandler {\n static async execute<T, R>(\n items: T[],\n operation: (item: T) => Promise<R>,\n options: Partial<BulkOperationOptions> = {},\n ): Promise<{\n successful: { item: T; result: R }[];\n failed: { item: T; error: Error }[];\n summary: {\n total: number;\n successful: number;\n failed: number;\n duration: number;\n };\n }> {\n const opts: BulkOperationOptions = {\n concurrency: 5,\n retryOptions: {\n maxAttempts: 3,\n initialDelay: 1000,\n maxDelay: 10000,\n backoffMultiplier: 2,\n jitter: true,\n },\n failFast: false,\n ...options,\n };\n\n const startTime = Date.now();\n const successful: { item: T; result: R }[] = [];\n const failed: { item: T; error: Error }[] = [];\n let completed = 0;\n\n const retryableOperation = RetryHandler.createRetryableFunction(\n operation,\n opts.retryOptions,\n );\n\n const batches = BulkOperationHandler.createBatches(items, opts.concurrency);\n\n for (const batch of batches) {\n const batchPromises = batch.map(async (item) => {\n try {\n const result = await retryableOperation(item);\n successful.push({ item, result });\n } catch (error) {\n failed.push({ item, error: error as Error });\n\n if (opts.failFast) {\n throw new KMsgError(\n KMsgErrorCode.MESSAGE_SEND_FAILED,\n `Bulk operation failed fast after ${failed.length} failures`,\n { totalItems: items.length, failedCount: failed.length },\n );\n }\n } finally {\n completed++;\n opts.onProgress?.(completed, items.length, failed.length);\n }\n });\n\n await Promise.allSettled(batchPromises);\n\n if (opts.failFast && failed.length > 0) {\n break;\n }\n }\n\n const duration = Date.now() - startTime;\n\n return {\n successful,\n failed,\n summary: {\n total: items.length,\n successful: successful.length,\n failed: failed.length,\n duration,\n },\n };\n }\n\n private static createBatches<T>(items: T[], batchSize: number): T[][] {\n const batches: T[][] = [];\n for (let i = 0; i < items.length; i += batchSize) {\n batches.push(items.slice(i, i + batchSize));\n }\n return batches;\n }\n}\n",
|
|
17
17
|
"/**\n * Circuit breaker pattern implementation\n */\n\nimport { KMsgError, KMsgErrorCode } from \"../errors\";\n\nexport interface CircuitBreakerOptions {\n failureThreshold: number;\n timeout: number;\n resetTimeout: number;\n onOpen?: () => void;\n onHalfOpen?: () => void;\n onClose?: () => void;\n}\n\nexport class CircuitBreaker {\n private state: \"CLOSED\" | \"OPEN\" | \"HALF_OPEN\" = \"CLOSED\";\n private failureCount = 0;\n private lastFailureTime = 0;\n private nextAttemptTime = 0;\n\n constructor(private options: CircuitBreakerOptions) {}\n\n async execute<T>(operation: () => Promise<T>): Promise<T> {\n const now = Date.now();\n\n switch (this.state) {\n case \"OPEN\":\n if (now < this.nextAttemptTime) {\n throw new KMsgError(\n KMsgErrorCode.NETWORK_SERVICE_UNAVAILABLE,\n \"Circuit breaker is OPEN\",\n { state: this.state, nextAttemptTime: this.nextAttemptTime },\n );\n }\n this.state = \"HALF_OPEN\";\n this.options.onHalfOpen?.();\n break;\n\n case \"HALF_OPEN\":\n break;\n\n case \"CLOSED\":\n break;\n }\n\n try {\n const result = await Promise.race([\n operation(),\n new Promise<never>((_, reject) =>\n setTimeout(\n () =>\n reject(\n new KMsgError(\n KMsgErrorCode.NETWORK_TIMEOUT,\n \"Circuit breaker timeout\",\n { timeout: this.options.timeout },\n ),\n ),\n this.options.timeout,\n ),\n ),\n ]);\n\n if (this.state === \"HALF_OPEN\") {\n this.state = \"CLOSED\";\n this.failureCount = 0;\n this.options.onClose?.();\n }\n\n return result;\n } catch (error) {\n this.recordFailure();\n throw error;\n }\n }\n\n private recordFailure(): void {\n this.failureCount++;\n this.lastFailureTime = Date.now();\n\n if (this.failureCount >= this.options.failureThreshold) {\n this.state = \"OPEN\";\n this.nextAttemptTime = this.lastFailureTime + this.options.resetTimeout;\n this.options.onOpen?.();\n }\n }\n\n getState(): string {\n return this.state;\n }\n\n getFailureCount(): number {\n return this.failureCount;\n }\n\n reset(): void {\n this.state = \"CLOSED\";\n this.failureCount = 0;\n this.lastFailureTime = 0;\n this.nextAttemptTime = 0;\n }\n}\n",
|
|
18
18
|
"/**\n * Rate limiter for API calls\n */\n\nexport class RateLimiter {\n private requests: number[] = [];\n\n constructor(\n private maxRequests: number,\n private windowMs: number,\n ) {}\n\n async acquire(): Promise<void> {\n const now = Date.now();\n\n this.requests = this.requests.filter((time) => now - time < this.windowMs);\n\n if (this.requests.length >= this.maxRequests) {\n const oldestRequest = Math.min(...this.requests);\n const waitTime = this.windowMs - (now - oldestRequest);\n\n if (waitTime > 0) {\n await new Promise((resolve) => setTimeout(resolve, waitTime));\n return this.acquire();\n }\n }\n\n this.requests.push(now);\n }\n\n canMakeRequest(): boolean {\n const now = Date.now();\n this.requests = this.requests.filter((time) => now - time < this.windowMs);\n return this.requests.length < this.maxRequests;\n }\n\n getRemainingRequests(): number {\n const now = Date.now();\n this.requests = this.requests.filter((time) => now - time < this.windowMs);\n return Math.max(0, this.maxRequests - this.requests.length);\n }\n}\n",
|
|
19
|
-
"
|
|
19
|
+
"/**\n * Represents a successful result containing a value.\n */\nexport type Ok<T> = {\n /** Always true for successful results. */\n readonly isSuccess: true;\n /** Always false for successful results. */\n readonly isFailure: false;\n /** The contained success value. */\n readonly value: T;\n};\n\n/**\n * Represents a failed result containing an error.\n */\nexport type Fail<E> = {\n /** Always false for failed results. */\n readonly isSuccess: false;\n /** Always true for failed results. */\n readonly isFailure: true;\n /** The contained error. */\n readonly error: E;\n};\n\n/**\n * A result type that represents either success (Ok) or failure (Fail).\n * Used throughout k-msg for explicit error handling without exceptions.\n *\n * @template T - The type of the success value\n * @template E - The type of the error (defaults to Error)\n *\n * @example\n * ```ts\n * function divide(a: number, b: number): Result<number, string> {\n * if (b === 0) return fail(\"division by zero\");\n * return ok(a / b);\n * }\n *\n * const result = divide(10, 2);\n * if (result.isSuccess) {\n * console.log(result.value); // 5\n * } else {\n * console.error(result.error);\n * }\n * ```\n */\nexport type Result<T, E = Error> = Ok<T> | Fail<E>;\n\n/**\n * Create a successful result containing the given value.\n * @param value - The success value to wrap\n * @returns An Ok result containing the value\n */\nexport const ok = <T>(value: T): Ok<T> => ({\n isSuccess: true,\n isFailure: false,\n value,\n});\n\n/**\n * Create a failed result containing the given error.\n * @param error - The error to wrap\n * @returns A Fail result containing the error\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 /**\n * Execute a side-effect without breaking the chain.\n * Calls fn with the result (ok or fail) and returns the same result.\n *\n * @param result - The Result to tap\n * @param fn - Side-effect function called with the result\n * @returns The same Result for chaining\n *\n * @example\n * ```ts\n * const result = await provider.send(options);\n * Result.tap(result, r => console.log('Completed:', r));\n * ```\n */\n tap<T, E>(\n result: Result<T, E>,\n fn: (result: Result<T, E>) => void,\n ): Result<T, E> {\n fn(result);\n return result;\n },\n\n /**\n * Execute a side-effect on success only.\n * Calls fn with the value only if result is ok, returns the same result.\n *\n * @param result - The Result to tap\n * @param fn - Side-effect function called with the value on success\n * @returns The same Result for chaining\n *\n * @example\n * ```ts\n * Result.tapOk(result, value => console.log('Success:', value.messageId));\n * ```\n */\n tapOk<T, E>(result: Result<T, E>, fn: (value: T) => void): Result<T, E> {\n if (result.isSuccess) {\n fn(result.value);\n }\n return result;\n },\n\n /**\n * Execute a side-effect on failure only.\n * Calls fn with the error only if result is fail, returns the same result.\n *\n * @param result - The Result to tap\n * @param fn - Side-effect function called with the error on failure\n * @returns The same Result for chaining\n *\n * @example\n * ```ts\n * Result.tapErr(result, error => console.error('Failed:', error.message));\n * ```\n */\n tapErr<T, E>(result: Result<T, E>, fn: (error: E) => void): Result<T, E> {\n if (result.isFailure) {\n fn(result.error);\n }\n return result;\n },\n\n /**\n * Return the value on success, or throw with a custom message on failure.\n * Use this when you want to convert a failed Result to an exception.\n *\n * @param result - The Result to expect\n * @param message - Custom error message to use if result is fail\n * @returns The success value\n * @throws Error with the provided message (and original error as cause)\n *\n * @example\n * ```ts\n * const value = Result.expect(result, 'Message send failed');\n * // throws Error('Message send failed') if result is fail\n * ```\n */\n expect<T, E>(result: Result<T, E>, message: string): T {\n if (result.isSuccess) {\n return result.value;\n }\n throw new Error(message, { cause: result.error });\n },\n};\n",
|
|
20
20
|
"export type RuntimeEnvRecord = Record<string, string | undefined>;\n\ntype RuntimeGlobal = typeof globalThis & {\n __ENV__?: RuntimeEnvRecord;\n __K_MSG_ENV__?: RuntimeEnvRecord;\n process?: {\n env?: RuntimeEnvRecord;\n };\n};\n\n/**\n * Resolve environment variables in a runtime-neutral order.\n *\n * Priority:\n * 1. globalThis.__K_MSG_ENV__\n * 2. globalThis.__ENV__\n * 3. globalThis.process?.env\n */\nexport function getRuntimeEnvSource(): RuntimeEnvRecord {\n const runtimeGlobal = globalThis as RuntimeGlobal;\n return (\n runtimeGlobal.__K_MSG_ENV__ ??\n runtimeGlobal.__ENV__ ??\n runtimeGlobal.process?.env ??\n {}\n );\n}\n\nexport function readRuntimeEnv(key: string): string | undefined {\n const value = getRuntimeEnvSource()[key];\n if (typeof value === \"string\") {\n return value;\n }\n if (value === undefined) {\n return undefined;\n }\n return String(value);\n}\n",
|
|
21
|
-
"
|
|
21
|
+
"/**\n * Supported message types in the k-msg platform.\n *\n * - ALIMTALK: Kakao AlimTalk (notification talk) with approved template\n * - FRIENDTALK: Kakao FriendTalk (friend message, no template required)\n * - SMS: Short message (up to 90 bytes, typically ~90 Korean characters)\n * - LMS: Long message with subject line\n * - MMS: Multimedia message with image attachment\n * - NSA: Naver Smart Alarm (notification service)\n * - VOICE: Voice call message\n * - FAX: Fax transmission\n * - RCS_SMS/LMS/MMS: Rich Communication Services text/media messages\n * - RCS_TPL/ITPL/LTPL: RCS template-based messages\n */\nexport type MessageType =\n | \"ALIMTALK\"\n | \"FRIENDTALK\"\n | \"SMS\"\n | \"LMS\"\n | \"MMS\"\n | \"NSA\"\n | \"VOICE\"\n | \"FAX\"\n | \"RCS_SMS\"\n | \"RCS_LMS\"\n | \"RCS_MMS\"\n | \"RCS_TPL\"\n | \"RCS_ITPL\"\n | \"RCS_LTPL\";\n\n/**\n * Message delivery status.\n *\n * - PENDING: Queued or in transit\n * - SENT: Successfully delivered to the carrier\n * - FAILED: Delivery failed\n */\nexport type MessageStatus = \"PENDING\" | \"SENT\" | \"FAILED\";\n\nexport const KNOWN_MESSAGE_STATUSES: MessageStatus[] = [\n \"PENDING\",\n \"SENT\",\n \"FAILED\",\n];\n\nexport const QUEUED_MESSAGE_STATUS: MessageStatus = \"PENDING\";\n\nexport const normalizeMessageStatus = (status: unknown): MessageStatus => {\n const raw = typeof status === \"string\" ? status.trim().toUpperCase() : \"\";\n\n if (raw === \"PENDING\" || raw === \"SENT\" || raw === \"FAILED\") {\n return raw;\n }\n\n return QUEUED_MESSAGE_STATUS;\n};\n\n/**\n * Variables for template interpolation.\n * Values are substituted into #{variableName} placeholders in templates.\n * @example { name: \"John\", code: \"123456\" }\n */\nexport type MessageVariables = Record<\n string,\n string | number | boolean | Date | null | undefined\n>;\n\nexport interface MessageButton {\n name: string;\n /**\n * Provider-dependent. Common values: \"WL\" (web link), \"AL\" (app link), ...\n */\n type: string;\n urlPc?: string;\n urlMobile?: string;\n}\n\nexport type MessageBinaryInput =\n | {\n /**\n * URL or file path (provider-dependent).\n */\n ref: string;\n filename?: string;\n contentType?: string;\n }\n | {\n bytes: Uint8Array;\n filename?: string;\n contentType?: string;\n }\n | {\n blob: Blob;\n filename?: string;\n contentType?: string;\n };\n\nexport interface MessageMedia {\n /**\n * Image attachment (used by MMS, FriendTalk image, RCS_MMS, ...).\n */\n image?: MessageBinaryInput;\n}\n\nexport interface CommonSendOptions {\n /**\n * Correlation id generated by KMsg (or provided by the caller).\n * Providers must echo this value back in SendResult.messageId.\n */\n messageId?: string;\n /**\n * Optional routing hint to force a specific provider by id.\n */\n providerId?: string;\n /**\n * Recipient phone number in Korean format without hyphens.\n * @example \"01012345678\"\n */\n to: string;\n /**\n * Sender number / sender id. Optional at KMsg layer; providers may require it.\n */\n from?: string;\n /**\n * Common delivery options understood by multiple providers.\n */\n options?: {\n scheduledAt?: Date;\n /**\n * Country code for providers that support it (e.g. SOLAPI).\n * Examples: \"82\", \"+82\".\n */\n country?: string;\n customFields?: Record<string, string>;\n };\n /**\n * Provider-specific escape hatch (use sparingly).\n */\n providerOptions?: Record<string, unknown>;\n}\n\nexport interface KakaoSendOptions {\n profileId?: string;\n plusId?: string;\n disableSms?: boolean;\n adFlag?: boolean;\n buttons?: unknown[];\n imageId?: string;\n /**\n * FriendTalk image upload link hint (SOLAPI).\n */\n imageLink?: string;\n // biome-ignore lint/suspicious/noExplicitAny: provider-specific extras\n [key: string]: any;\n}\n\nexport interface AlimTalkFailoverOptions {\n enabled?: boolean;\n fallbackChannel?: \"sms\" | \"lms\";\n fallbackContent?: string;\n fallbackTitle?: string;\n}\n\nexport type SendWarningCode =\n | \"FAILOVER_UNSUPPORTED_PROVIDER\"\n | \"FAILOVER_PARTIAL_PROVIDER\"\n | \"FALLBACK_CONTENT_MISSING\"\n | (string & {});\n\nexport interface SendWarning {\n code: SendWarningCode;\n message: string;\n details?: Record<string, unknown>;\n}\n\nexport interface NaverSendOptions {\n talkId?: string;\n /**\n * Override the template identifier for NSA (provider-specific).\n */\n templateId?: string;\n disableSms?: boolean;\n variables?: MessageVariables;\n buttons?: unknown[];\n // biome-ignore lint/suspicious/noExplicitAny: provider-specific extras\n [key: string]: any;\n}\n\nexport interface VoiceSendOptions {\n voiceType?: \"FEMALE\" | \"MALE\";\n headerMessage?: string;\n tailMessage?: string;\n replyRange?: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;\n counselorNumber?: string;\n // biome-ignore lint/suspicious/noExplicitAny: provider-specific extras\n [key: string]: any;\n}\n\nexport interface FaxSendOptions {\n fileIds?: string[];\n fileUrls?: string[];\n // biome-ignore lint/suspicious/noExplicitAny: provider-specific extras\n [key: string]: any;\n}\n\nexport interface RcsSendOptions {\n brandId?: string;\n /**\n * Override template identifier for RCS_*TPL types.\n */\n templateId?: string;\n copyAllowed?: boolean;\n variables?: MessageVariables;\n mmsType?: \"M3\" | \"S3\" | \"M4\" | \"S4\" | \"M5\" | \"S5\" | \"M6\" | \"S6\";\n commercialType?: boolean;\n disableSms?: boolean;\n buttons?: unknown[];\n additionalBody?: {\n title?: string;\n description?: string;\n imageId?: string;\n buttons?: unknown[];\n // biome-ignore lint/suspicious/noExplicitAny: provider-specific extras\n [key: string]: any;\n };\n // biome-ignore lint/suspicious/noExplicitAny: provider-specific extras\n [key: string]: any;\n}\n\nexport interface SmsSendOptions extends CommonSendOptions {\n type: \"SMS\" | \"LMS\" | \"MMS\";\n text: string;\n /**\n * LMS/MMS subject.\n */\n subject?: string;\n /**\n * Media attachments. For backwards compatibility, `imageUrl` is treated as a legacy alias\n * for `media.image.ref` by some providers.\n */\n media?: MessageMedia;\n /**\n * Optional image URL for MMS (provider-specific).\n */\n imageUrl?: string;\n variables?: MessageVariables;\n}\n\nexport interface AlimTalkSendOptions extends CommonSendOptions {\n type: \"ALIMTALK\";\n templateId: string;\n variables: MessageVariables;\n kakao?: KakaoSendOptions;\n failover?: AlimTalkFailoverOptions;\n}\n\nexport interface FriendTalkSendOptions extends CommonSendOptions {\n type: \"FRIENDTALK\";\n text: string;\n media?: MessageMedia;\n imageUrl?: string;\n buttons?: MessageButton[];\n variables?: MessageVariables;\n kakao?: KakaoSendOptions;\n}\n\nexport interface NsaSendOptions extends CommonSendOptions {\n type: \"NSA\";\n templateId: string;\n variables: MessageVariables;\n naver?: NaverSendOptions;\n}\n\nexport interface VoiceMessageSendOptions extends CommonSendOptions {\n type: \"VOICE\";\n text: string;\n variables?: MessageVariables;\n voice?: VoiceSendOptions;\n}\n\nexport interface FaxMessageSendOptions extends CommonSendOptions {\n type: \"FAX\";\n fax: FaxSendOptions;\n}\n\nexport interface RcsTextSendOptions extends CommonSendOptions {\n type: \"RCS_SMS\" | \"RCS_LMS\" | \"RCS_MMS\";\n text: string;\n subject?: string;\n media?: MessageMedia;\n imageUrl?: string;\n variables?: MessageVariables;\n rcs?: RcsSendOptions;\n}\n\nexport interface RcsTemplateSendOptions extends CommonSendOptions {\n type: \"RCS_TPL\" | \"RCS_ITPL\" | \"RCS_LTPL\";\n templateId: string;\n variables: MessageVariables;\n rcs?: RcsSendOptions;\n}\n\n/**\n * Union of all supported send option types.\n * Use this for type narrowing based on the `type` discriminator.\n */\nexport type SendOptions =\n | SmsSendOptions\n | AlimTalkSendOptions\n | FriendTalkSendOptions\n | NsaSendOptions\n | VoiceMessageSendOptions\n | FaxMessageSendOptions\n | RcsTextSendOptions\n | RcsTemplateSendOptions;\n\n/**\n * Relaxed SMS input type that allows omitting `type` and using `content` as an alias for `text`.\n * Used for developer convenience when sending simple SMS messages.\n */\nexport type SmsDefaultSendInput = Omit<SmsSendOptions, \"type\" | \"text\"> & {\n type?: undefined;\n /**\n * SMS text. If omitted, `content` is used.\n */\n text?: string;\n /**\n * Alias for `text`.\n */\n content?: string;\n};\n\n/**\n * Developer-facing input type.\n * - SMS defaults allow omitting `type` and using `content`.\n * - Other channels are modeled as discriminated unions on `type`.\n */\nexport type SendInput = SendOptions | SmsDefaultSendInput;\n\n/**\n * Result of a message send operation.\n * Returned by Provider.send() and KMsg.send().\n */\nexport interface SendResult {\n /**\n * Correlation id (equals the request `messageId`).\n */\n messageId: string;\n /**\n * Identifier of the provider that handled this message.\n */\n providerId: string;\n /**\n * Provider-specific message identifier for tracking.\n */\n providerMessageId?: string;\n /**\n * Current delivery status of the message.\n */\n status: MessageStatus;\n /**\n * The message type that was sent.\n */\n type: MessageType;\n /**\n * Recipient phone number.\n */\n to: string;\n /**\n * Non-fatal warnings (e.g., failover partially applied).\n */\n warnings?: SendWarning[];\n /**\n * Raw provider response for debugging (provider-specific shape).\n */\n raw?: unknown;\n}\n"
|
|
22
22
|
],
|
|
23
|
-
"mappings": "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",
|
|
24
|
-
"debugId": "
|
|
23
|
+
"mappings": "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",
|
|
24
|
+
"debugId": "79A2E7190D2C917D64756E2164756E21",
|
|
25
25
|
"names": []
|
|
26
26
|
}
|