@k-msg/core 0.22.3 → 0.23.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/crypto/errors.d.ts +32 -0
- package/dist/crypto/types.d.ts +92 -0
- package/dist/errors.d.ts +5 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -3
- package/dist/index.js.map +7 -5
- package/dist/index.mjs +3 -3
- package/dist/index.mjs.map +7 -5
- package/package.json +1 -1
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { KMsgError, KMsgErrorCode, type KMsgErrorMetadata } from "../errors";
|
|
2
|
+
import type { FieldCryptoFailMode, FieldCryptoOpenFallback } from "./types";
|
|
3
|
+
export type FieldCryptoErrorKind = "config" | "encrypt" | "decrypt" | "hash" | "policy";
|
|
4
|
+
export interface FieldCryptoErrorMetadata extends KMsgErrorMetadata {
|
|
5
|
+
fieldPath?: string;
|
|
6
|
+
failMode?: FieldCryptoFailMode;
|
|
7
|
+
openFallback?: FieldCryptoOpenFallback;
|
|
8
|
+
}
|
|
9
|
+
export declare class FieldCryptoError extends KMsgError {
|
|
10
|
+
readonly kind: FieldCryptoErrorKind;
|
|
11
|
+
readonly fieldPath?: string;
|
|
12
|
+
readonly failMode?: FieldCryptoFailMode;
|
|
13
|
+
readonly openFallback?: FieldCryptoOpenFallback;
|
|
14
|
+
constructor(kind: FieldCryptoErrorKind, message: string, details?: Record<string, unknown>, metadata?: FieldCryptoErrorMetadata);
|
|
15
|
+
toJSON(): {
|
|
16
|
+
kind: FieldCryptoErrorKind;
|
|
17
|
+
fieldPath: string | undefined;
|
|
18
|
+
failMode: FieldCryptoFailMode | undefined;
|
|
19
|
+
openFallback: FieldCryptoOpenFallback | undefined;
|
|
20
|
+
name: string;
|
|
21
|
+
code: KMsgErrorCode;
|
|
22
|
+
message: string;
|
|
23
|
+
details: Record<string, unknown> | undefined;
|
|
24
|
+
providerErrorCode: string | undefined;
|
|
25
|
+
providerErrorText: string | undefined;
|
|
26
|
+
httpStatus: number | undefined;
|
|
27
|
+
requestId: string | undefined;
|
|
28
|
+
retryAfterMs: number | undefined;
|
|
29
|
+
attempt: number | undefined;
|
|
30
|
+
causeChain: unknown[] | undefined;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
export type FieldMode = "plain" | "encrypt" | "encrypt+hash" | "mask";
|
|
2
|
+
export type FieldCryptoFailMode = "closed" | "open";
|
|
3
|
+
export type FieldCryptoOpenFallback = "masked" | "plaintext" | "null";
|
|
4
|
+
export type MaybePromise<T> = T | Promise<T>;
|
|
5
|
+
export interface CryptoEnvelope {
|
|
6
|
+
v: number;
|
|
7
|
+
alg: string;
|
|
8
|
+
kid: string;
|
|
9
|
+
iv: string;
|
|
10
|
+
tag: string;
|
|
11
|
+
ct: string;
|
|
12
|
+
}
|
|
13
|
+
export interface FieldCryptoAad {
|
|
14
|
+
[key: string]: string;
|
|
15
|
+
}
|
|
16
|
+
export interface FieldCryptoKeyContext {
|
|
17
|
+
tenantId?: string;
|
|
18
|
+
providerId?: string;
|
|
19
|
+
messageId?: string;
|
|
20
|
+
tableName?: string;
|
|
21
|
+
fieldPath?: string;
|
|
22
|
+
requestId?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface KeyResolver {
|
|
25
|
+
resolveEncryptKey(context: FieldCryptoKeyContext): MaybePromise<{
|
|
26
|
+
kid: string;
|
|
27
|
+
}>;
|
|
28
|
+
resolveDecryptKeys?(context: FieldCryptoKeyContext & {
|
|
29
|
+
ciphertext?: string;
|
|
30
|
+
}): MaybePromise<readonly string[]>;
|
|
31
|
+
}
|
|
32
|
+
export interface FieldCryptoEncryptInput {
|
|
33
|
+
value: string;
|
|
34
|
+
aad: FieldCryptoAad;
|
|
35
|
+
path: string;
|
|
36
|
+
kid?: string;
|
|
37
|
+
}
|
|
38
|
+
export interface FieldCryptoDecryptInput {
|
|
39
|
+
ciphertext: string;
|
|
40
|
+
aad: FieldCryptoAad;
|
|
41
|
+
path: string;
|
|
42
|
+
candidateKids?: readonly string[];
|
|
43
|
+
}
|
|
44
|
+
export interface FieldCryptoHashInput {
|
|
45
|
+
value: string;
|
|
46
|
+
path: string;
|
|
47
|
+
kid?: string;
|
|
48
|
+
}
|
|
49
|
+
export interface FieldCryptoMaskInput {
|
|
50
|
+
value: string;
|
|
51
|
+
path: string;
|
|
52
|
+
}
|
|
53
|
+
export interface FieldCryptoProvider {
|
|
54
|
+
encrypt(input: FieldCryptoEncryptInput): MaybePromise<{
|
|
55
|
+
ciphertext: string | CryptoEnvelope;
|
|
56
|
+
kid?: string;
|
|
57
|
+
}>;
|
|
58
|
+
decrypt(input: FieldCryptoDecryptInput): MaybePromise<string>;
|
|
59
|
+
hash(input: FieldCryptoHashInput): MaybePromise<string>;
|
|
60
|
+
mask?(input: FieldCryptoMaskInput): MaybePromise<string>;
|
|
61
|
+
}
|
|
62
|
+
export interface FieldCryptoConfig {
|
|
63
|
+
enabled?: boolean;
|
|
64
|
+
fields: Record<string, FieldMode>;
|
|
65
|
+
failMode?: FieldCryptoFailMode;
|
|
66
|
+
openFallback?: FieldCryptoOpenFallback;
|
|
67
|
+
unsafeAllowPlaintextStorage?: boolean;
|
|
68
|
+
aadFields?: readonly string[];
|
|
69
|
+
keyResolver?: KeyResolver;
|
|
70
|
+
provider: FieldCryptoProvider;
|
|
71
|
+
}
|
|
72
|
+
export type FieldCryptoMetricName = "crypto_encrypt_ms" | "crypto_decrypt_ms" | "crypto_fail_count" | "key_kid_usage";
|
|
73
|
+
export interface FieldCryptoMetricEvent {
|
|
74
|
+
name: FieldCryptoMetricName;
|
|
75
|
+
value?: number;
|
|
76
|
+
kid?: string;
|
|
77
|
+
tags?: Record<string, string | number | boolean | undefined>;
|
|
78
|
+
}
|
|
79
|
+
export declare function isCryptoEnvelope(value: unknown): value is CryptoEnvelope;
|
|
80
|
+
export declare function normalizePhoneForHash(value: string): string;
|
|
81
|
+
export declare function createDefaultMasker(visibleStart?: number, visibleEnd?: number): (value: string) => string;
|
|
82
|
+
export interface AesGcmFieldCryptoProviderOptions {
|
|
83
|
+
keys: Record<string, string | ArrayBuffer | Uint8Array>;
|
|
84
|
+
activeKid: string;
|
|
85
|
+
hashKeys?: Record<string, string | ArrayBuffer | Uint8Array>;
|
|
86
|
+
keyEncoding?: "utf8" | "base64url";
|
|
87
|
+
hashKeyEncoding?: "utf8" | "base64url";
|
|
88
|
+
algorithm?: "A256GCM";
|
|
89
|
+
}
|
|
90
|
+
export declare function createAesGcmFieldCryptoProvider(options: AesGcmFieldCryptoProviderOptions): FieldCryptoProvider;
|
|
91
|
+
export declare function createNoopFieldCryptoProvider(): FieldCryptoProvider;
|
|
92
|
+
export declare function toCiphertextEnvelopeString(ciphertext: string | CryptoEnvelope): string;
|
package/dist/errors.d.ts
CHANGED
|
@@ -9,6 +9,11 @@ export declare enum KMsgErrorCode {
|
|
|
9
9
|
NETWORK_SERVICE_UNAVAILABLE = "NETWORK_SERVICE_UNAVAILABLE",
|
|
10
10
|
PROVIDER_ERROR = "PROVIDER_ERROR",
|
|
11
11
|
MESSAGE_SEND_FAILED = "MESSAGE_SEND_FAILED",
|
|
12
|
+
CRYPTO_CONFIG_ERROR = "CRYPTO_CONFIG_ERROR",
|
|
13
|
+
CRYPTO_ENCRYPT_FAILED = "CRYPTO_ENCRYPT_FAILED",
|
|
14
|
+
CRYPTO_DECRYPT_FAILED = "CRYPTO_DECRYPT_FAILED",
|
|
15
|
+
CRYPTO_HASH_FAILED = "CRYPTO_HASH_FAILED",
|
|
16
|
+
CRYPTO_POLICY_VIOLATION = "CRYPTO_POLICY_VIOLATION",
|
|
12
17
|
UNKNOWN_ERROR = "UNKNOWN_ERROR"
|
|
13
18
|
}
|
|
14
19
|
export type RetryPolicyErrorCode = KMsgErrorCode;
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
var{defineProperty:N,getOwnPropertyNames:Y,getOwnPropertyDescriptor:c}=Object,K=Object.prototype.hasOwnProperty;var W=new WeakMap,_=(i)=>{var t=W.get(i),h;if(t)return t;if(t=N({},"__esModule",{value:!0}),i&&typeof i==="object"||typeof i==="function")Y(i).map((s)=>!K.call(t,s)&&N(t,s,{get:()=>i[s],enumerable:!(h=c(i,s))||h.enumerable}));return W.set(i,t),t};var z=(i,t)=>{for(var h in t)N(i,h,{get:t[h],enumerable:!0,configurable:!0,set:(s)=>t[h]=()=>s})};var l={};z(l,{setGlobalLogger:()=>L,readRuntimeEnv:()=>d,ok:()=>C,normalizeRetryAfterMs:()=>M,normalizeMessageStatus:()=>g,loggerMiddleware:()=>y,logger:()=>v,getRuntimeEnvSource:()=>Z,getLogger:()=>P,fail:()=>Q,createLogger:()=>E,RetryHandler:()=>D,Result:()=>e,RateLimiter:()=>H,QUEUED_MESSAGE_STATUS:()=>o,Logger:()=>I,LogLevel:()=>X,KNOWN_MESSAGE_STATUSES:()=>a,KMsgErrorCode:()=>R,KMsgError:()=>O,ErrorUtils:()=>A,CircuitBreaker:()=>x,BulkOperationHandler:()=>F});module.exports=_(l);var R;((u)=>{u.INVALID_REQUEST="INVALID_REQUEST";u.AUTHENTICATION_FAILED="AUTHENTICATION_FAILED";u.INSUFFICIENT_BALANCE="INSUFFICIENT_BALANCE";u.TEMPLATE_NOT_FOUND="TEMPLATE_NOT_FOUND";u.RATE_LIMIT_EXCEEDED="RATE_LIMIT_EXCEEDED";u.NETWORK_ERROR="NETWORK_ERROR";u.NETWORK_TIMEOUT="NETWORK_TIMEOUT";u.NETWORK_SERVICE_UNAVAILABLE="NETWORK_SERVICE_UNAVAILABLE";u.PROVIDER_ERROR="PROVIDER_ERROR";u.MESSAGE_SEND_FAILED="MESSAGE_SEND_FAILED";u.UNKNOWN_ERROR="UNKNOWN_ERROR"})(R||={});var j=new Set(["NETWORK_ERROR","RATE_LIMIT_EXCEEDED","NETWORK_TIMEOUT","NETWORK_SERVICE_UNAVAILABLE","PROVIDER_ERROR","UNKNOWN_ERROR"]),$=new Set(["INVALID_REQUEST","AUTHENTICATION_FAILED","INSUFFICIENT_BALANCE","TEMPLATE_NOT_FOUND","MESSAGE_SEND_FAILED"]),w=(i)=>{if(typeof i!=="number"||Number.isNaN(i)||!Number.isFinite(i))return;return Math.trunc(i)},M=(i)=>{let t=w(i);if(t===void 0||t<0)return;return t},k=(i)=>{if(typeof i!=="string")return;return i.toLowerCase().trim()},J=(i)=>{if(i>=500)return"retryable";if(i===408||i===425||i===429)return"retryable";return"non_retryable"},U=(i)=>{let t=i.toLowerCase();if(t.includes("timeout")||t.includes("temporar")||t.includes("network")||t.includes("retry"))return"retryable";return};class O extends Error{code;details;providerErrorCode;providerErrorText;httpStatus;requestId;retryAfterMs;attempt;causeChain;constructor(i,t,h,s={}){super(t);if(this.name="KMsgError",this.code=i,this.details=h,this.providerErrorCode=s.providerErrorCode,this.providerErrorText=s.providerErrorText,this.httpStatus=w(s.httpStatus),this.requestId=typeof s.requestId==="string"?s.requestId:void 0,this.retryAfterMs=w(s.retryAfterMs),this.attempt=w(s.attempt),Array.isArray(s.causeChain))this.causeChain=s.causeChain;else if(s.causeChain!==void 0)this.causeChain=[s.causeChain];if(Error.captureStackTrace)Error.captureStackTrace(this,O)}toJSON(){return{name:this.name,code:this.code,message:this.message,details:this.details,providerErrorCode:this.providerErrorCode,providerErrorText:this.providerErrorText,httpStatus:this.httpStatus,requestId:this.requestId,retryAfterMs:this.retryAfterMs,attempt:this.attempt,causeChain:this.causeChain}}}var A={isRetryable(i,t={}){return A.classifyForRetry(i,t)==="retryable"},classifyForRetry(i,t={}){if(i instanceof O){if(new Set(t.retryableCodes??Array.from(j)).has(i.code))return"retryable";if(new Set(t.nonRetryableCodes??Array.from($)).has(i.code))return"non_retryable";if(i.httpStatus!==void 0)return J(i.httpStatus);let T=U(i.message);if(T)return T;if(t.classifyByMessage&&i.message){let q=t.classifyByMessage(i.message);if(q)return q}if(t.fallback)return t.fallback;return"non_retryable"}let h=i&&typeof i==="object"?i:void 0,s=k(h?.status)??k(h?.statusCode)??k(h?.code),p=w(h?.status)??w(h?.statusCode)??w(h?.httpStatus);if(typeof s==="string"&&s.startsWith("5"))return"retryable";if(p!==void 0){if(t.classifyByStatusCode)return t.classifyByStatusCode(p);return J(p)}let m=typeof h?.message==="string"?U(h.message):void 0;if(m)return m;if(t.classifyByMessage&&typeof h?.message==="string"){let f=t.classifyByMessage(h.message);if(f)return f}return t.fallback??"non_retryable"},resolveRetryAfterMs(i,t){if(t?.retryAfterMs){let h=t.retryAfterMs(i),s=M(h);if(s!==void 0)return s}if(i.retryAfterMs!==void 0)return M(i.retryAfterMs);if(i.code==="RATE_LIMIT_EXCEEDED"&&i.retryAfterMs===void 0)return;return},isUnknownStatus:(i)=>{if(i===void 0||Number.isNaN(i)||!Number.isFinite(i))return!1;return i<500},toRetryMetadata(i){return{providerErrorCode:i.providerErrorCode,providerErrorText:i.providerErrorText,httpStatus:i.httpStatus,requestId:i.requestId,retryAfterMs:i.retryAfterMs,attempt:i.attempt,causeChain:i.causeChain}},withAttempt(i,t){return new O(i.code,i.message,i.details,{...A.toRetryMetadata(i),attempt:w(t)})},DEFAULT_RETRYABLE_ERROR_CODES:j,DEFAULT_NON_RETRYABLE_ERROR_CODES:$};var X;((p)=>{p.DEBUG="DEBUG";p.INFO="INFO";p.WARN="WARN";p.ERROR="ERROR"})(X||={});class I{config;context;constructor(i={},t={}){this.context=i,this.config={level:"INFO",enableConsole:!0,enableJson:!1,enableColors:!0,...t}}shouldLog(i){let t=["DEBUG","INFO","WARN","ERROR"];return t.indexOf(i)>=t.indexOf(this.config.level)}formatMessage(i){if(this.config.enableJson)return JSON.stringify({level:i.level,message:i.message,timestamp:i.timestamp.toISOString(),context:i.context,...i.error&&{error:{name:i.error.name,message:i.error.message,stack:i.error.stack}},...i.duration&&{duration:i.duration}});let t=i.timestamp.toISOString(),h=this.config.enableColors?this.colorizeLevel(i.level):i.level,s=Object.keys(i.context).length>0?` [${Object.entries(i.context).map(([m,f])=>`${m}=${f}`).join(", ")}]`:"",p=`${t} ${h}${s}: ${i.message}`;if(i.duration!==void 0)p+=` (${i.duration}ms)`;if(i.error)p+=`
|
|
2
|
-
${
|
|
1
|
+
var{defineProperty:R,getOwnPropertyNames:z,getOwnPropertyDescriptor:tt}=Object,et=Object.prototype.hasOwnProperty;var _=new WeakMap,nt=(t)=>{var e=_.get(t),n;if(e)return e;if(e=R({},"__esModule",{value:!0}),t&&typeof t==="object"||typeof t==="function")z(t).map((i)=>!et.call(e,i)&&R(e,i,{get:()=>t[i],enumerable:!(n=tt(t,i))||n.enumerable}));return _.set(t,e),e};var it=(t,e)=>{for(var n in e)R(t,n,{get:e[n],enumerable:!0,configurable:!0,set:(i)=>e[n]=()=>i})};var bt={};it(bt,{toCiphertextEnvelopeString:()=>ft,setGlobalLogger:()=>gt,readRuntimeEnv:()=>Ct,ok:()=>H,normalizeRetryAfterMs:()=>S,normalizePhoneForHash:()=>Z,normalizeMessageStatus:()=>Pt,loggerMiddleware:()=>lt,logger:()=>mt,isCryptoEnvelope:()=>pt,getRuntimeEnvSource:()=>V,getLogger:()=>C,fail:()=>$,createNoopFieldCryptoProvider:()=>at,createLogger:()=>N,createDefaultMasker:()=>B,createAesGcmFieldCryptoProvider:()=>ct,RetryHandler:()=>w,Result:()=>Ft,RateLimiter:()=>q,QUEUED_MESSAGE_STATUS:()=>At,Logger:()=>E,LogLevel:()=>X,KNOWN_MESSAGE_STATUSES:()=>wt,KMsgErrorCode:()=>b,KMsgError:()=>u,FieldCryptoError:()=>Q,ErrorUtils:()=>P,CircuitBreaker:()=>K,BulkOperationHandler:()=>T});module.exports=nt(bt);var b;((c)=>{c.INVALID_REQUEST="INVALID_REQUEST";c.AUTHENTICATION_FAILED="AUTHENTICATION_FAILED";c.INSUFFICIENT_BALANCE="INSUFFICIENT_BALANCE";c.TEMPLATE_NOT_FOUND="TEMPLATE_NOT_FOUND";c.RATE_LIMIT_EXCEEDED="RATE_LIMIT_EXCEEDED";c.NETWORK_ERROR="NETWORK_ERROR";c.NETWORK_TIMEOUT="NETWORK_TIMEOUT";c.NETWORK_SERVICE_UNAVAILABLE="NETWORK_SERVICE_UNAVAILABLE";c.PROVIDER_ERROR="PROVIDER_ERROR";c.MESSAGE_SEND_FAILED="MESSAGE_SEND_FAILED";c.CRYPTO_CONFIG_ERROR="CRYPTO_CONFIG_ERROR";c.CRYPTO_ENCRYPT_FAILED="CRYPTO_ENCRYPT_FAILED";c.CRYPTO_DECRYPT_FAILED="CRYPTO_DECRYPT_FAILED";c.CRYPTO_HASH_FAILED="CRYPTO_HASH_FAILED";c.CRYPTO_POLICY_VIOLATION="CRYPTO_POLICY_VIOLATION";c.UNKNOWN_ERROR="UNKNOWN_ERROR"})(b||={});var G=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"]),F=(t)=>{if(typeof t!=="number"||Number.isNaN(t)||!Number.isFinite(t))return;return Math.trunc(t)},S=(t)=>{let e=F(t);if(e===void 0||e<0)return;return e},I=(t)=>{if(typeof t!=="string")return;return t.toLowerCase().trim()},Y=(t)=>{if(t>=500)return"retryable";if(t===408||t===425||t===429)return"retryable";return"non_retryable"},j=(t)=>{let e=t.toLowerCase();if(e.includes("timeout")||e.includes("temporar")||e.includes("network")||e.includes("retry"))return"retryable";return};class u extends Error{code;details;providerErrorCode;providerErrorText;httpStatus;requestId;retryAfterMs;attempt;causeChain;constructor(t,e,n,i={}){super(e);if(this.name="KMsgError",this.code=t,this.details=n,this.providerErrorCode=i.providerErrorCode,this.providerErrorText=i.providerErrorText,this.httpStatus=F(i.httpStatus),this.requestId=typeof i.requestId==="string"?i.requestId:void 0,this.retryAfterMs=F(i.retryAfterMs),this.attempt=F(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 P={isRetryable(t,e={}){return P.classifyForRetry(t,e)==="retryable"},classifyForRetry(t,e={}){if(t instanceof u){if(new Set(e.retryableCodes??Array.from(G)).has(t.code))return"retryable";if(new Set(e.nonRetryableCodes??Array.from(J)).has(t.code))return"non_retryable";if(t.httpStatus!==void 0)return Y(t.httpStatus);let o=j(t.message);if(o)return o;if(e.classifyByMessage&&t.message){let a=e.classifyByMessage(t.message);if(a)return a}if(e.fallback)return e.fallback;return"non_retryable"}let n=t&&typeof t==="object"?t:void 0,i=I(n?.status)??I(n?.statusCode)??I(n?.code),r=F(n?.status)??F(n?.statusCode)??F(n?.httpStatus);if(typeof i==="string"&&i.startsWith("5"))return"retryable";if(r!==void 0){if(e.classifyByStatusCode)return e.classifyByStatusCode(r);return Y(r)}let s=typeof n?.message==="string"?j(n.message):void 0;if(s)return s;if(e.classifyByMessage&&typeof n?.message==="string"){let p=e.classifyByMessage(n.message);if(p)return p}return e.fallback??"non_retryable"},resolveRetryAfterMs(t,e){if(e?.retryAfterMs){let n=e.retryAfterMs(t),i=S(n);if(i!==void 0)return i}if(t.retryAfterMs!==void 0)return S(t.retryAfterMs);if(t.code==="RATE_LIMIT_EXCEEDED"&&t.retryAfterMs===void 0)return;return},isUnknownStatus:(t)=>{if(t===void 0||Number.isNaN(t)||!Number.isFinite(t))return!1;return t<500},toRetryMetadata(t){return{providerErrorCode:t.providerErrorCode,providerErrorText:t.providerErrorText,httpStatus:t.httpStatus,requestId:t.requestId,retryAfterMs:t.retryAfterMs,attempt:t.attempt,causeChain:t.causeChain}},withAttempt(t,e){return new u(t.code,t.message,t.details,{...P.toRetryMetadata(t),attempt:F(e)})},DEFAULT_RETRYABLE_ERROR_CODES:G,DEFAULT_NON_RETRYABLE_ERROR_CODES:J};function rt(t){switch(t){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 Q extends u{kind;fieldPath;failMode;openFallback;constructor(t,e,n,i={}){super(rt(t),e,n,i);this.name="FieldCryptoError",this.kind=t,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}}}function O(t){let e=t instanceof Uint8Array?t:new Uint8Array(t),n=typeof globalThis<"u"?globalThis.Buffer:void 0;return(n?n.from(e).toString("base64"):btoa(String.fromCharCode(...e))).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function x(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),n=e.length%4===0?e:`${e}${"=".repeat(4-e.length%4)}`,i=typeof globalThis<"u"?globalThis.Buffer:void 0;if(i)return new Uint8Array(i.from(n,"base64"));let r=atob(n),s=new Uint8Array(r.length);for(let p=0;p<r.length;p+=1)s[p]=r.charCodeAt(p);return s}function W(t,e){if(t instanceof Uint8Array)return t;if(t instanceof ArrayBuffer)return new Uint8Array(t);if(e==="base64url")return x(t);return new TextEncoder().encode(t)}function st(t){let e=t instanceof Uint8Array?t:new Uint8Array(t);return Array.from(e).map((n)=>n.toString(16).padStart(2,"0")).join("")}function l(t){let e=new Uint8Array(t.byteLength);return e.set(t),e.buffer}function v(t){let e=JSON.parse(t);if(!e||typeof e!=="object"||typeof e.v!=="number"||typeof e.alg!=="string"||typeof e.kid!=="string"||typeof e.iv!=="string"||typeof e.tag!=="string"||typeof e.ct!=="string")throw Error("Invalid ciphertext envelope");return e}function ot(t){if(typeof t==="string")return t;return JSON.stringify(t)}function pt(t){if(!t||typeof t!=="object")return!1;let e=t;return typeof e.v==="number"&&typeof e.alg==="string"&&typeof e.kid==="string"&&typeof e.iv==="string"&&typeof e.tag==="string"&&typeof e.ct==="string"}function Z(t){return t.replace(/[^\d+]/g,"").trim()}function B(t=3,e=2){return(n)=>{let i=String(n??"");if(i.length<=t+e)return"*".repeat(Math.max(0,i.length));let r=i.slice(0,t),s=i.slice(-e);return`${r}${"*".repeat(i.length-t-e)}${s}`}}function ct(t){let e=t.algorithm??"A256GCM",n=t.keyEncoding??"base64url",i=t.hashKeyEncoding??n,r=new Map,s=new Map,p=(o)=>{let a=r.get(o);if(a)return a;let h=t.keys[o];if(!h)throw Error(`Unknown encryption key id: ${o}`);let y=W(h,n),d=crypto.subtle.importKey("raw",l(y),"AES-GCM",!1,["encrypt","decrypt"]);return r.set(o,d),d},f=(o)=>{let a=s.get(o);if(a)return a;let h=t.hashKeys?.[o]??t.keys[o];if(!h)throw Error(`Unknown hash key id: ${o}`);let y=W(h,i),d=crypto.subtle.importKey("raw",l(y),{name:"HMAC",hash:"SHA-256"},!1,["sign"]);return s.set(o,d),d};return{async encrypt(o){let a=o.kid??t.activeKid,h=await p(a),y=crypto.getRandomValues(new Uint8Array(12)),d=new TextEncoder().encode(JSON.stringify(o.aad??{})),g=new TextEncoder().encode(o.value),m=await crypto.subtle.encrypt({name:"AES-GCM",iv:l(y),additionalData:l(d),tagLength:128},h,l(g)),A=new Uint8Array(m),c=A.slice(A.length-16),M=A.slice(0,A.length-16);return{ciphertext:{v:1,alg:e,kid:a,iv:O(y),tag:O(c),ct:O(M)},kid:a}},async decrypt(o){let a=v(o.ciphertext),h=o.candidateKids&&o.candidateKids.length>0?o.candidateKids:[a.kid],y=x(a.iv),d=x(a.tag),g=x(a.ct),m=new Uint8Array(g.length+d.length);m.set(g,0),m.set(d,g.length);let A=new TextEncoder().encode(JSON.stringify(o.aad??{})),c;for(let M of h)try{let D=await p(M),L=await crypto.subtle.decrypt({name:"AES-GCM",iv:l(y),additionalData:l(A),tagLength:128},D,l(m));return new TextDecoder().decode(new Uint8Array(L))}catch(D){c=D}throw Error(`Failed to decrypt ciphertext: ${c instanceof Error?c.message:String(c??"unknown")}`)},async hash(o){let a=o.kid??t.activeKid,h=await f(a),y=await crypto.subtle.sign("HMAC",h,l(new TextEncoder().encode(o.value)));return st(y)},mask(o){return B()(o.value)}}}function at(){return{encrypt(t){return{ciphertext:JSON.stringify({v:1,alg:"NOOP",kid:"noop",iv:"",tag:"",ct:t.value})}},decrypt(t){try{return v(t.ciphertext).ct}catch{return t.ciphertext}},hash(t){let e=Z(t.value);return O(new TextEncoder().encode(e))},mask(t){return B()(t.value)}}}function ft(t){return ot(t)}var X;((r)=>{r.DEBUG="DEBUG";r.INFO="INFO";r.WARN="WARN";r.ERROR="ERROR"})(X||={});var ht=["to","from","phone","phoneNumber","recipient","sender","secret","apiKey","apiSecret","authorization","auth","token","password","payload","message","content","text"];function yt(t){let e=t.toLowerCase();return ht.some((n)=>e.includes(n.toLowerCase()))}function dt(t){let e=t.trim();if(e.length<=4)return"***";if(e.includes("@")){let[r,s]=e.split("@");return`${r.slice(0,2)}${"*".repeat(Math.max(1,r.length-2))}@${s}`}let n=e.slice(0,3),i=e.slice(-2);return`${n}${"*".repeat(Math.max(1,e.length-5))}${i}`}function U(t,e){if(e===void 0||e===null)return e;if(yt(t)){if(typeof e==="string")return dt(e);if(typeof e==="number"||typeof e==="boolean")return"***";if(Array.isArray(e))return"[REDACTED]";if(typeof e==="object")return"[REDACTED]"}if(Array.isArray(e))return e.map((n)=>U(t,n));if(typeof e==="object"){let n={};for(let[i,r]of Object.entries(e))n[i]=U(i,r);return n}return e}function ut(t){let e={};for(let[n,i]of Object.entries(t))e[n]=U(n,i);return e}class E{config;context;constructor(t={},e={}){this.context=t,this.config={level:"INFO",enableConsole:!0,enableJson:!1,enableColors:!0,...e}}shouldLog(t){let e=["DEBUG","INFO","WARN","ERROR"];return e.indexOf(t)>=e.indexOf(this.config.level)}formatMessage(t){let e=ut(t.context);if(this.config.enableJson)return JSON.stringify({level:t.level,message:t.message,timestamp:t.timestamp.toISOString(),context:e,...t.error&&{error:{name:t.error.name,message:t.error.message,stack:t.error.stack}},...t.duration&&{duration:t.duration}});let n=t.timestamp.toISOString(),i=this.config.enableColors?this.colorizeLevel(t.level):t.level,r=Object.keys(e).length>0?` [${Object.entries(e).map(([p,f])=>`${p}=${f}`).join(", ")}]`:"",s=`${n} ${i}${r}: ${t.message}`;if(t.duration!==void 0)s+=` (${t.duration}ms)`;if(t.error)s+=`
|
|
2
|
+
${t.error.stack}`;return s}colorizeLevel(t){if(!this.config.enableColors)return t;return`${{["DEBUG"]:"\x1B[36m",["INFO"]:"\x1B[32m",["WARN"]:"\x1B[33m",["ERROR"]:"\x1B[31m"}[t]}${t}\x1B[0m`}writeLog(t){if(!this.shouldLog(t.level))return;let e=this.formatMessage(t);if(this.config.enableConsole)(t.level==="ERROR"?console.error:t.level==="WARN"?console.warn:console.log)(e);if(this.config.enableFile&&this.config.filePath);}debug(t,e={}){this.writeLog({level:"DEBUG",message:t,timestamp:new Date,context:{...this.context,...e}})}info(t,e={}){this.writeLog({level:"INFO",message:t,timestamp:new Date,context:{...this.context,...e}})}warn(t,e={},n){this.writeLog({level:"WARN",message:t,timestamp:new Date,context:{...this.context,...e},error:n})}error(t,e={},n){this.writeLog({level:"ERROR",message:t,timestamp:new Date,context:{...this.context,...e},error:n})}child(t){return new E({...this.context,...t},this.config)}time(t){let e=Date.now();return()=>{let n=Date.now()-e;this.info(`${t} completed`,{duration:n})}}async measure(t,e,n={}){let i=Date.now(),r={...n,operation:t};this.debug(`Starting ${t}`,r);try{let s=await e(),p=Date.now()-i;return this.info(`Completed ${t}`,{...r,duration:p}),s}catch(s){let p=Date.now()-i;throw this.error(`Failed ${t}`,{...r,duration:p},s instanceof Error?s:Error(String(s))),s}}}var k;function N(t,e){return new E(t,e)}function C(){if(!k)k=N();return k}function gt(t){k=t}var mt={debug:(t,e)=>C().debug(t,e),info:(t,e)=>C().info(t,e),warn:(t,e,n)=>C().warn(t,e,n),error:(t,e,n)=>C().error(t,e,n),child:(t)=>C().child(t),time:(t)=>C().time(t),measure:(t,e,n)=>C().measure(t,e,n)};function lt(t){let e=N({},t);return async(n,i)=>{let r=Date.now(),p={requestId:Math.random().toString(36).substring(7),method:n.req.method,path:n.req.path,userAgent:n.req.header("user-agent")||"unknown"};e.info("Request started",p);try{await i();let f=Date.now()-r;e.info("Request completed",{...p,status:n.res.status,duration:f})}catch(f){let o=Date.now()-r;throw e.error("Request failed",{...p,duration:o},f instanceof Error?f:Error(String(f))),f}}}class w{static defaultOptions={maxAttempts:3,initialDelay:1000,maxDelay:30000,backoffMultiplier:2,jitter:!0,retryCondition:(t)=>P.isRetryable(t)};static async execute(t,e={}){let n={...w.defaultOptions,...e},i,r=n.initialDelay;for(let s=1;s<=n.maxAttempts;s++)try{return await t()}catch(p){if(i=p,s===n.maxAttempts||!n.retryCondition(i,s))throw i;let f=n.jitter?r+Math.random()*r*0.1:r;n.onRetry?.(i,s),await new Promise((o)=>setTimeout(o,f)),r=Math.min(r*n.backoffMultiplier,n.maxDelay)}throw i}static createRetryableFunction(t,e={}){return async(...n)=>{return w.execute(()=>t(...n),e)}}}class T{static async execute(t,e,n={}){let i={concurrency:5,retryOptions:{maxAttempts:3,initialDelay:1000,maxDelay:1e4,backoffMultiplier:2,jitter:!0},failFast:!1,...n},r=Date.now(),s=[],p=[],f=0,o=w.createRetryableFunction(e,i.retryOptions),a=T.createBatches(t,i.concurrency);for(let y of a){let d=y.map(async(g)=>{try{let m=await o(g);s.push({item:g,result:m})}catch(m){if(p.push({item:g,error:m}),i.failFast)throw new u("MESSAGE_SEND_FAILED",`Bulk operation failed fast after ${p.length} failures`,{totalItems:t.length,failedCount:p.length})}finally{f++,i.onProgress?.(f,t.length,p.length)}});if(await Promise.allSettled(d),i.failFast&&p.length>0)break}let h=Date.now()-r;return{successful:s,failed:p,summary:{total:t.length,successful:s.length,failed:p.length,duration:h}}}static createBatches(t,e){let n=[];for(let i=0;i<t.length;i+=e)n.push(t.slice(i,i+e));return n}}class K{options;state="CLOSED";failureCount=0;lastFailureTime=0;nextAttemptTime=0;constructor(t){this.options=t}async execute(t){let e=Date.now();switch(this.state){case"OPEN":if(e<this.nextAttemptTime)throw new u("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 n=await Promise.race([t(),new Promise((i,r)=>setTimeout(()=>r(new u("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 n}catch(n){throw this.recordFailure(),n}}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 q{maxRequests;windowMs;requests=[];constructor(t,e){this.maxRequests=t;this.windowMs=e}async acquire(){let t=Date.now();if(this.requests=this.requests.filter((e)=>t-e<this.windowMs),this.requests.length>=this.maxRequests){let e=Math.min(...this.requests),n=this.windowMs-(t-e);if(n>0)return await new Promise((i)=>setTimeout(i,n)),this.acquire()}this.requests.push(t)}canMakeRequest(){let t=Date.now();return this.requests=this.requests.filter((e)=>t-e<this.windowMs),this.requests.length<this.maxRequests}getRemainingRequests(){let t=Date.now();return this.requests=this.requests.filter((e)=>t-e<this.windowMs),Math.max(0,this.maxRequests-this.requests.length)}}var H=(t)=>({isSuccess:!0,isFailure:!1,value:t}),$=(t)=>({isSuccess:!1,isFailure:!0,error:t}),Ft={map(t,e){if(t.isSuccess)return H(e(t.value));return t},flatMap(t,e){if(t.isSuccess)return e(t.value);return t},mapError(t,e){if(t.isFailure)return $(e(t.error));return t},unwrap(t){if(t.isSuccess)return t.value;throw t.error},unwrapOr(t,e){if(t.isSuccess)return t.value;return e},unwrapOrElse(t,e){if(t.isSuccess)return t.value;return e(t.error)},match(t,e){if(t.isSuccess)return e.ok(t.value);return e.fail(t.error)},async fromPromise(t){try{let e=await t;return H(e)}catch(e){return $(e)}},isOk(t){return t.isSuccess},isFail(t){return t.isFailure}};function V(){let t=globalThis;return t.__K_MSG_ENV__??t.__ENV__??t.process?.env??{}}function Ct(t){let e=V()[t];if(typeof e==="string")return e;if(e===void 0)return;return String(e)}var wt=["PENDING","SENT","FAILED"],At="PENDING",Pt=(t)=>{let e=typeof t==="string"?t.trim().toUpperCase():"";if(e==="PENDING"||e==="SENT"||e==="FAILED")return e;return"PENDING"};
|
|
3
3
|
|
|
4
|
-
//# debugId=
|
|
4
|
+
//# debugId=95DB0F9B5BB8C45964756E2164756E21
|
|
5
5
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/errors.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"],
|
|
3
|
+
"sources": ["../src/errors.ts", "../src/crypto/errors.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 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 ]);\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",
|
|
6
|
-
"
|
|
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",
|
|
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
|
+
"export type FieldMode = \"plain\" | \"encrypt\" | \"encrypt+hash\" | \"mask\";\nexport type FieldCryptoFailMode = \"closed\" | \"open\";\nexport type FieldCryptoOpenFallback = \"masked\" | \"plaintext\" | \"null\";\nexport type MaybePromise<T> = T | Promise<T>;\n\nexport interface CryptoEnvelope {\n v: number;\n alg: string;\n kid: string;\n iv: string;\n tag: string;\n ct: string;\n}\n\nexport interface FieldCryptoAad {\n [key: string]: string;\n}\n\nexport interface FieldCryptoKeyContext {\n tenantId?: string;\n providerId?: string;\n messageId?: string;\n tableName?: string;\n fieldPath?: string;\n requestId?: string;\n}\n\nexport interface KeyResolver {\n resolveEncryptKey(\n context: FieldCryptoKeyContext,\n ): MaybePromise<{ kid: string }>;\n resolveDecryptKeys?(\n context: FieldCryptoKeyContext & {\n ciphertext?: string;\n },\n ): MaybePromise<readonly string[]>;\n}\n\nexport interface FieldCryptoEncryptInput {\n value: string;\n aad: FieldCryptoAad;\n path: string;\n kid?: string;\n}\n\nexport interface FieldCryptoDecryptInput {\n ciphertext: string;\n aad: FieldCryptoAad;\n path: string;\n candidateKids?: readonly string[];\n}\n\nexport interface FieldCryptoHashInput {\n value: string;\n path: string;\n kid?: string;\n}\n\nexport interface FieldCryptoMaskInput {\n value: string;\n path: string;\n}\n\nexport interface FieldCryptoProvider {\n encrypt(\n input: FieldCryptoEncryptInput,\n ): MaybePromise<{ ciphertext: string | CryptoEnvelope; kid?: string }>;\n decrypt(input: FieldCryptoDecryptInput): MaybePromise<string>;\n hash(input: FieldCryptoHashInput): MaybePromise<string>;\n mask?(input: FieldCryptoMaskInput): MaybePromise<string>;\n}\n\nexport interface FieldCryptoConfig {\n enabled?: boolean;\n fields: Record<string, FieldMode>;\n failMode?: FieldCryptoFailMode;\n openFallback?: FieldCryptoOpenFallback;\n unsafeAllowPlaintextStorage?: boolean;\n aadFields?: readonly string[];\n keyResolver?: KeyResolver;\n provider: FieldCryptoProvider;\n}\n\nexport type FieldCryptoMetricName =\n | \"crypto_encrypt_ms\"\n | \"crypto_decrypt_ms\"\n | \"crypto_fail_count\"\n | \"key_kid_usage\";\n\nexport interface FieldCryptoMetricEvent {\n name: FieldCryptoMetricName;\n value?: number;\n kid?: string;\n tags?: Record<string, string | number | boolean | undefined>;\n}\n\nfunction encodeBase64Url(buffer: ArrayBuffer | Uint8Array): string {\n const bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);\n const maybeBuffer =\n typeof globalThis !== \"undefined\"\n ? (\n globalThis as {\n Buffer?: {\n from: (input: Uint8Array) => {\n toString: (encoding: string) => string;\n };\n };\n }\n ).Buffer\n : undefined;\n const base64 = maybeBuffer\n ? maybeBuffer.from(bytes).toString(\"base64\")\n : btoa(String.fromCharCode(...bytes));\n return base64.replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/g, \"\");\n}\n\nfunction decodeBase64Url(value: string): Uint8Array {\n const normalized = value.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padded =\n normalized.length % 4 === 0\n ? normalized\n : `${normalized}${\"=\".repeat(4 - (normalized.length % 4))}`;\n\n const maybeBuffer =\n typeof globalThis !== \"undefined\"\n ? (\n globalThis as {\n Buffer?: { from: (input: string, encoding: string) => Uint8Array };\n }\n ).Buffer\n : undefined;\n\n if (maybeBuffer) {\n return new Uint8Array(maybeBuffer.from(padded, \"base64\"));\n }\n\n const binary = atob(padded);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) {\n bytes[index] = binary.charCodeAt(index);\n }\n return bytes;\n}\n\nfunction toUint8Array(\n value: string | ArrayBuffer | Uint8Array,\n encoding: \"utf8\" | \"base64url\",\n): Uint8Array {\n if (value instanceof Uint8Array) return value;\n if (value instanceof ArrayBuffer) return new Uint8Array(value);\n if (encoding === \"base64url\") return decodeBase64Url(value);\n return new TextEncoder().encode(value);\n}\n\nfunction toHex(buffer: ArrayBuffer | Uint8Array): string {\n const bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);\n return Array.from(bytes)\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\nfunction toCryptoBufferSource(bytes: Uint8Array): ArrayBuffer {\n const copy = new Uint8Array(bytes.byteLength);\n copy.set(bytes);\n return copy.buffer;\n}\n\nfunction parseEnvelope(ciphertext: string): CryptoEnvelope {\n const parsed = JSON.parse(ciphertext) as Partial<CryptoEnvelope>;\n if (\n !parsed ||\n typeof parsed !== \"object\" ||\n typeof parsed.v !== \"number\" ||\n typeof parsed.alg !== \"string\" ||\n typeof parsed.kid !== \"string\" ||\n typeof parsed.iv !== \"string\" ||\n typeof parsed.tag !== \"string\" ||\n typeof parsed.ct !== \"string\"\n ) {\n throw new Error(\"Invalid ciphertext envelope\");\n }\n\n return parsed as CryptoEnvelope;\n}\n\nfunction toCiphertextString(value: string | CryptoEnvelope): string {\n if (typeof value === \"string\") return value;\n return JSON.stringify(value);\n}\n\nexport function isCryptoEnvelope(value: unknown): value is CryptoEnvelope {\n if (!value || typeof value !== \"object\") return false;\n const candidate = value as Partial<CryptoEnvelope>;\n return (\n typeof candidate.v === \"number\" &&\n typeof candidate.alg === \"string\" &&\n typeof candidate.kid === \"string\" &&\n typeof candidate.iv === \"string\" &&\n typeof candidate.tag === \"string\" &&\n typeof candidate.ct === \"string\"\n );\n}\n\nexport function normalizePhoneForHash(value: string): string {\n return value.replace(/[^\\d+]/g, \"\").trim();\n}\n\nexport function createDefaultMasker(\n visibleStart = 3,\n visibleEnd = 2,\n): (value: string) => string {\n return (value: string): string => {\n const normalized = String(value ?? \"\");\n if (normalized.length <= visibleStart + visibleEnd) {\n return \"*\".repeat(Math.max(0, normalized.length));\n }\n const start = normalized.slice(0, visibleStart);\n const end = normalized.slice(-visibleEnd);\n return `${start}${\"*\".repeat(normalized.length - visibleStart - visibleEnd)}${end}`;\n };\n}\n\nexport interface AesGcmFieldCryptoProviderOptions {\n keys: Record<string, string | ArrayBuffer | Uint8Array>;\n activeKid: string;\n hashKeys?: Record<string, string | ArrayBuffer | Uint8Array>;\n keyEncoding?: \"utf8\" | \"base64url\";\n hashKeyEncoding?: \"utf8\" | \"base64url\";\n algorithm?: \"A256GCM\";\n}\n\nexport function createAesGcmFieldCryptoProvider(\n options: AesGcmFieldCryptoProviderOptions,\n): FieldCryptoProvider {\n const algorithm = options.algorithm ?? \"A256GCM\";\n const keyEncoding = options.keyEncoding ?? \"base64url\";\n const hashKeyEncoding = options.hashKeyEncoding ?? keyEncoding;\n const aesKeyCache = new Map<string, Promise<CryptoKey>>();\n const hashKeyCache = new Map<string, Promise<CryptoKey>>();\n\n const importAesKey = (kid: string): Promise<CryptoKey> => {\n const cached = aesKeyCache.get(kid);\n if (cached) return cached;\n\n const raw = options.keys[kid];\n if (!raw) {\n throw new Error(`Unknown encryption key id: ${kid}`);\n }\n const bytes = toUint8Array(raw, keyEncoding);\n const promise = crypto.subtle.importKey(\n \"raw\",\n toCryptoBufferSource(bytes),\n \"AES-GCM\",\n false,\n [\"encrypt\", \"decrypt\"],\n );\n aesKeyCache.set(kid, promise);\n return promise;\n };\n\n const importHashKey = (kid: string): Promise<CryptoKey> => {\n const cached = hashKeyCache.get(kid);\n if (cached) return cached;\n\n const raw = options.hashKeys?.[kid] ?? options.keys[kid];\n if (!raw) {\n throw new Error(`Unknown hash key id: ${kid}`);\n }\n const bytes = toUint8Array(raw, hashKeyEncoding);\n const promise = crypto.subtle.importKey(\n \"raw\",\n toCryptoBufferSource(bytes),\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\"],\n );\n hashKeyCache.set(kid, promise);\n return promise;\n };\n\n return {\n async encrypt(input) {\n const kid = input.kid ?? options.activeKid;\n const key = await importAesKey(kid);\n const iv = crypto.getRandomValues(new Uint8Array(12));\n const additionalData = new TextEncoder().encode(\n JSON.stringify(input.aad ?? {}),\n );\n const plaintext = new TextEncoder().encode(input.value);\n\n const encrypted = await crypto.subtle.encrypt(\n {\n name: \"AES-GCM\",\n iv: toCryptoBufferSource(iv),\n additionalData: toCryptoBufferSource(additionalData),\n tagLength: 128,\n },\n key,\n toCryptoBufferSource(plaintext),\n );\n\n const encryptedBytes = new Uint8Array(encrypted);\n const tag = encryptedBytes.slice(encryptedBytes.length - 16);\n const ciphertext = encryptedBytes.slice(0, encryptedBytes.length - 16);\n\n return {\n ciphertext: {\n v: 1,\n alg: algorithm,\n kid,\n iv: encodeBase64Url(iv),\n tag: encodeBase64Url(tag),\n ct: encodeBase64Url(ciphertext),\n },\n kid,\n };\n },\n\n async decrypt(input) {\n const envelope = parseEnvelope(input.ciphertext);\n const candidateKids =\n input.candidateKids && input.candidateKids.length > 0\n ? input.candidateKids\n : [envelope.kid];\n const iv = decodeBase64Url(envelope.iv);\n const tag = decodeBase64Url(envelope.tag);\n const ciphertext = decodeBase64Url(envelope.ct);\n\n const encrypted = new Uint8Array(ciphertext.length + tag.length);\n encrypted.set(ciphertext, 0);\n encrypted.set(tag, ciphertext.length);\n\n const additionalData = new TextEncoder().encode(\n JSON.stringify(input.aad ?? {}),\n );\n\n let lastError: unknown;\n for (const kid of candidateKids) {\n try {\n const key = await importAesKey(kid);\n const decrypted = await crypto.subtle.decrypt(\n {\n name: \"AES-GCM\",\n iv: toCryptoBufferSource(iv),\n additionalData: toCryptoBufferSource(additionalData),\n tagLength: 128,\n },\n key,\n toCryptoBufferSource(encrypted),\n );\n return new TextDecoder().decode(new Uint8Array(decrypted));\n } catch (error) {\n lastError = error;\n }\n }\n\n throw new Error(\n `Failed to decrypt ciphertext: ${lastError instanceof Error ? lastError.message : String(lastError ?? \"unknown\")}`,\n );\n },\n\n async hash(input) {\n const kid = input.kid ?? options.activeKid;\n const key = await importHashKey(kid);\n const signature = await crypto.subtle.sign(\n \"HMAC\",\n key,\n toCryptoBufferSource(new TextEncoder().encode(input.value)),\n );\n return toHex(signature);\n },\n\n mask(input) {\n return createDefaultMasker()(input.value);\n },\n };\n}\n\nexport function createNoopFieldCryptoProvider(): FieldCryptoProvider {\n return {\n encrypt(input) {\n return {\n ciphertext: JSON.stringify({\n v: 1,\n alg: \"NOOP\",\n kid: \"noop\",\n iv: \"\",\n tag: \"\",\n ct: input.value,\n } satisfies CryptoEnvelope),\n };\n },\n decrypt(input) {\n try {\n const parsed = parseEnvelope(input.ciphertext);\n return parsed.ct;\n } catch {\n return input.ciphertext;\n }\n },\n hash(input) {\n const normalized = normalizePhoneForHash(input.value);\n return encodeBase64Url(new TextEncoder().encode(normalized));\n },\n mask(input) {\n return createDefaultMasker()(input.value);\n },\n };\n}\n\nexport function toCiphertextEnvelopeString(\n ciphertext: string | CryptoEnvelope,\n): string {\n return toCiphertextString(ciphertext);\n}\n",
|
|
8
|
+
"export enum LogLevel {\n DEBUG = \"DEBUG\",\n INFO = \"INFO\",\n WARN = \"WARN\",\n ERROR = \"ERROR\",\n}\n\nexport interface LogContext {\n component?: string;\n operation?: string;\n userId?: string;\n sessionId?: string;\n requestId?: string;\n traceId?: string;\n [key: string]: any;\n}\n\nexport interface LogEntry {\n level: LogLevel;\n message: string;\n timestamp: Date;\n context: LogContext;\n error?: Error;\n duration?: number;\n}\n\nexport interface LoggerConfig {\n level: LogLevel;\n enableConsole: boolean;\n enableFile?: boolean;\n filePath?: string;\n maxFileSize?: number;\n maxFiles?: number;\n enableJson?: boolean;\n enableColors?: boolean;\n}\n\nconst REDACTED_TOKEN = \"[REDACTED]\";\nconst MASKED_TOKEN = \"***\";\nconst SENSITIVE_CONTEXT_KEYS = [\n \"to\",\n \"from\",\n \"phone\",\n \"phoneNumber\",\n \"recipient\",\n \"sender\",\n \"secret\",\n \"apiKey\",\n \"apiSecret\",\n \"authorization\",\n \"auth\",\n \"token\",\n \"password\",\n \"payload\",\n \"message\",\n \"content\",\n \"text\",\n] as const;\n\nfunction isSensitiveContextKey(rawKey: string): boolean {\n const key = rawKey.toLowerCase();\n return SENSITIVE_CONTEXT_KEYS.some((candidate) =>\n key.includes(candidate.toLowerCase()),\n );\n}\n\nfunction maskStringValue(value: string): string {\n const trimmed = value.trim();\n if (trimmed.length <= 4) return MASKED_TOKEN;\n if (trimmed.includes(\"@\")) {\n const [local, domain] = trimmed.split(\"@\");\n const head = local.slice(0, 2);\n return `${head}${\"*\".repeat(Math.max(1, local.length - 2))}@${domain}`;\n }\n const head = trimmed.slice(0, 3);\n const tail = trimmed.slice(-2);\n return `${head}${\"*\".repeat(Math.max(1, trimmed.length - 5))}${tail}`;\n}\n\nfunction sanitizeContextValue(key: string, value: unknown): unknown {\n if (value === undefined || value === null) return value;\n\n if (isSensitiveContextKey(key)) {\n if (typeof value === \"string\") return maskStringValue(value);\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return MASKED_TOKEN;\n }\n if (Array.isArray(value)) return REDACTED_TOKEN;\n if (typeof value === \"object\") return REDACTED_TOKEN;\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => sanitizeContextValue(key, entry));\n }\n\n if (typeof value === \"object\") {\n const next: Record<string, unknown> = {};\n for (const [childKey, childValue] of Object.entries(value)) {\n next[childKey] = sanitizeContextValue(childKey, childValue);\n }\n return next;\n }\n\n return value;\n}\n\nfunction sanitizeLogContext(context: LogContext): LogContext {\n const sanitized: LogContext = {};\n for (const [key, value] of Object.entries(context)) {\n sanitized[key] = sanitizeContextValue(key, value);\n }\n return sanitized;\n}\n\nexport class Logger {\n private config: LoggerConfig;\n private context: LogContext;\n\n constructor(context: LogContext = {}, config: Partial<LoggerConfig> = {}) {\n this.context = context;\n this.config = {\n level: LogLevel.INFO,\n enableConsole: true,\n enableJson: false,\n enableColors: true,\n ...config,\n };\n }\n\n private shouldLog(level: LogLevel): boolean {\n const levels = [\n LogLevel.DEBUG,\n LogLevel.INFO,\n LogLevel.WARN,\n LogLevel.ERROR,\n ];\n return levels.indexOf(level) >= levels.indexOf(this.config.level);\n }\n\n private formatMessage(entry: LogEntry): string {\n const context = sanitizeLogContext(entry.context);\n\n if (this.config.enableJson) {\n return JSON.stringify({\n level: entry.level,\n message: entry.message,\n timestamp: entry.timestamp.toISOString(),\n context,\n ...(entry.error && {\n error: {\n name: entry.error.name,\n message: entry.error.message,\n stack: entry.error.stack,\n },\n }),\n ...(entry.duration && { duration: entry.duration }),\n });\n }\n\n const timestamp = entry.timestamp.toISOString();\n const level = this.config.enableColors\n ? this.colorizeLevel(entry.level)\n : entry.level;\n const contextStr =\n Object.keys(context).length > 0\n ? ` [${Object.entries(context)\n .map(([k, v]) => `${k}=${v}`)\n .join(\", \")}]`\n : \"\";\n\n let message = `${timestamp} ${level}${contextStr}: ${entry.message}`;\n\n if (entry.duration !== undefined) {\n message += ` (${entry.duration}ms)`;\n }\n\n if (entry.error) {\n message += `\\n${entry.error.stack}`;\n }\n\n return message;\n }\n\n private colorizeLevel(level: LogLevel): string {\n if (!this.config.enableColors) return level;\n\n const colors = {\n [LogLevel.DEBUG]: \"\\x1b[36m\", // cyan\n [LogLevel.INFO]: \"\\x1b[32m\", // green\n [LogLevel.WARN]: \"\\x1b[33m\", // yellow\n [LogLevel.ERROR]: \"\\x1b[31m\", // red\n };\n\n return `${colors[level]}${level}\\x1b[0m`;\n }\n\n private writeLog(entry: LogEntry): void {\n if (!this.shouldLog(entry.level)) return;\n\n const message = this.formatMessage(entry);\n\n if (this.config.enableConsole) {\n const logFn =\n entry.level === LogLevel.ERROR\n ? console.error\n : entry.level === LogLevel.WARN\n ? console.warn\n : console.log;\n logFn(message);\n }\n\n // File logging would be implemented here if needed\n if (this.config.enableFile && this.config.filePath) {\n // Bun.write(this.config.filePath, message + '\\n', { createPath: true });\n }\n }\n\n debug(message: string, context: LogContext = {}): void {\n this.writeLog({\n level: LogLevel.DEBUG,\n message,\n timestamp: new Date(),\n context: { ...this.context, ...context },\n });\n }\n\n info(message: string, context: LogContext = {}): void {\n this.writeLog({\n level: LogLevel.INFO,\n message,\n timestamp: new Date(),\n context: { ...this.context, ...context },\n });\n }\n\n warn(message: string, context: LogContext = {}, error?: Error): void {\n this.writeLog({\n level: LogLevel.WARN,\n message,\n timestamp: new Date(),\n context: { ...this.context, ...context },\n error,\n });\n }\n\n error(message: string, context: LogContext = {}, error?: Error): void {\n this.writeLog({\n level: LogLevel.ERROR,\n message,\n timestamp: new Date(),\n context: { ...this.context, ...context },\n error,\n });\n }\n\n child(context: LogContext): Logger {\n return new Logger({ ...this.context, ...context }, this.config);\n }\n\n time(label: string): () => void {\n const start = Date.now();\n return () => {\n const duration = Date.now() - start;\n this.info(`${label} completed`, { duration });\n };\n }\n\n async measure<T>(\n operation: string,\n fn: () => Promise<T>,\n context: LogContext = {},\n ): Promise<T> {\n const start = Date.now();\n const operationContext = { ...context, operation };\n\n this.debug(`Starting ${operation}`, operationContext);\n\n try {\n const result = await fn();\n const duration = Date.now() - start;\n\n this.info(`Completed ${operation}`, { ...operationContext, duration });\n return result;\n } catch (error) {\n const duration = Date.now() - start;\n\n this.error(\n `Failed ${operation}`,\n { ...operationContext, duration },\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n }\n}\n\n// Global logger instance\nlet globalLogger: Logger;\n\nexport function createLogger(\n context?: LogContext,\n config?: Partial<LoggerConfig>,\n): Logger {\n return new Logger(context, config);\n}\n\nexport function getLogger(): Logger {\n if (!globalLogger) {\n globalLogger = createLogger();\n }\n return globalLogger;\n}\n\nexport function setGlobalLogger(logger: Logger): void {\n globalLogger = logger;\n}\n\n// Convenience functions\nexport const logger = {\n debug: (message: string, context?: LogContext) =>\n getLogger().debug(message, context),\n info: (message: string, context?: LogContext) =>\n getLogger().info(message, context),\n warn: (message: string, context?: LogContext, error?: Error) =>\n getLogger().warn(message, context, error),\n error: (message: string, context?: LogContext, error?: Error) =>\n getLogger().error(message, context, error),\n child: (context: LogContext) => getLogger().child(context),\n time: (label: string) => getLogger().time(label),\n measure: <T>(operation: string, fn: () => Promise<T>, context?: LogContext) =>\n getLogger().measure(operation, fn, context),\n};\n\n// Express-style middleware for Hono\nexport function loggerMiddleware(config?: Partial<LoggerConfig>) {\n const requestLogger = createLogger({}, config);\n\n return async (c: any, next: any) => {\n const start = Date.now();\n const requestId = Math.random().toString(36).substring(7);\n\n const context = {\n requestId,\n method: c.req.method,\n path: c.req.path,\n userAgent: c.req.header(\"user-agent\") || \"unknown\",\n };\n\n requestLogger.info(\"Request started\", context);\n\n try {\n await next();\n\n const duration = Date.now() - start;\n requestLogger.info(\"Request completed\", {\n ...context,\n status: c.res.status,\n duration,\n });\n } catch (error) {\n const duration = Date.now() - start;\n requestLogger.error(\n \"Request failed\",\n {\n ...context,\n duration,\n },\n error instanceof Error ? error : new Error(String(error)),\n );\n\n throw error;\n }\n };\n}\n",
|
|
7
9
|
"/**\n * Retry options and handler for K-Message Platform\n */\n\nimport { ErrorUtils } from \"../errors\";\n\nexport interface RetryOptions {\n maxAttempts?: number;\n initialDelay?: number;\n maxDelay?: number;\n backoffMultiplier?: number;\n jitter?: boolean;\n retryCondition?: (error: Error, attempt: number) => boolean;\n onRetry?: (error: Error, attempt: number) => void;\n}\n\n/**\n * Exponential backoff retry mechanism\n */\nexport class RetryHandler {\n private static defaultOptions: RetryOptions = {\n maxAttempts: 3,\n initialDelay: 1000,\n maxDelay: 30000,\n backoffMultiplier: 2,\n jitter: true,\n retryCondition: (error) => ErrorUtils.isRetryable(error),\n };\n\n static async execute<T>(\n operation: () => Promise<T>,\n options: Partial<RetryOptions> = {},\n ): Promise<T> {\n const opts = {\n ...RetryHandler.defaultOptions,\n ...options,\n } as Required<RetryOptions>;\n let lastError: Error;\n let delay = opts.initialDelay;\n\n for (let attempt = 1; attempt <= opts.maxAttempts; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error as Error;\n\n if (\n attempt === opts.maxAttempts ||\n !opts.retryCondition!(lastError, attempt)\n ) {\n throw lastError;\n }\n\n const actualDelay = opts.jitter\n ? delay + Math.random() * delay * 0.1\n : delay;\n\n opts.onRetry?.(lastError, attempt);\n\n await new Promise((resolve) => setTimeout(resolve, actualDelay));\n\n delay = Math.min(delay * opts.backoffMultiplier, opts.maxDelay);\n }\n }\n\n throw lastError!;\n }\n\n static createRetryableFunction<T extends any[], R>(\n func: (...args: T) => Promise<R>,\n options: Partial<RetryOptions> = {},\n ): (...args: T) => Promise<R> {\n return async (...args: T) => {\n return RetryHandler.execute(() => func(...args), options);\n };\n }\n}\n",
|
|
8
10
|
"/**\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",
|
|
9
11
|
"/**\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",
|
|
@@ -12,7 +14,7 @@
|
|
|
12
14
|
"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",
|
|
13
15
|
"export 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\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\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 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\nexport type SendOptions =\n | SmsSendOptions\n | AlimTalkSendOptions\n | FriendTalkSendOptions\n | NsaSendOptions\n | VoiceMessageSendOptions\n | FaxMessageSendOptions\n | RcsTextSendOptions\n | RcsTemplateSendOptions;\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\nexport interface SendResult {\n /**\n * Correlation id (equals the request `messageId`).\n */\n messageId: string;\n providerId: string;\n providerMessageId?: string;\n status: MessageStatus;\n type: MessageType;\n to: string;\n warnings?: SendWarning[];\n raw?: unknown;\n}\n"
|
|
14
16
|
],
|
|
15
|
-
"mappings": "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",
|
|
16
|
-
"debugId": "
|
|
17
|
+
"mappings": "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",
|
|
18
|
+
"debugId": "95DB0F9B5BB8C45964756E2164756E21",
|
|
17
19
|
"names": []
|
|
18
20
|
}
|
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
var B;((u)=>{u.INVALID_REQUEST="INVALID_REQUEST";u.AUTHENTICATION_FAILED="AUTHENTICATION_FAILED";u.INSUFFICIENT_BALANCE="INSUFFICIENT_BALANCE";u.TEMPLATE_NOT_FOUND="TEMPLATE_NOT_FOUND";u.RATE_LIMIT_EXCEEDED="RATE_LIMIT_EXCEEDED";u.NETWORK_ERROR="NETWORK_ERROR";u.NETWORK_TIMEOUT="NETWORK_TIMEOUT";u.NETWORK_SERVICE_UNAVAILABLE="NETWORK_SERVICE_UNAVAILABLE";u.PROVIDER_ERROR="PROVIDER_ERROR";u.MESSAGE_SEND_FAILED="MESSAGE_SEND_FAILED";u.UNKNOWN_ERROR="UNKNOWN_ERROR"})(B||={});var k=new Set(["NETWORK_ERROR","RATE_LIMIT_EXCEEDED","NETWORK_TIMEOUT","NETWORK_SERVICE_UNAVAILABLE","PROVIDER_ERROR","UNKNOWN_ERROR"]),M=new Set(["INVALID_REQUEST","AUTHENTICATION_FAILED","INSUFFICIENT_BALANCE","TEMPLATE_NOT_FOUND","MESSAGE_SEND_FAILED"]),w=(i)=>{if(typeof i!=="number"||Number.isNaN(i)||!Number.isFinite(i))return;return Math.trunc(i)},E=(i)=>{let t=w(i);if(t===void 0||t<0)return;return t},F=(i)=>{if(typeof i!=="string")return;return i.toLowerCase().trim()},x=(i)=>{if(i>=500)return"retryable";if(i===408||i===425||i===429)return"retryable";return"non_retryable"},H=(i)=>{let t=i.toLowerCase();if(t.includes("timeout")||t.includes("temporar")||t.includes("network")||t.includes("retry"))return"retryable";return};class O extends Error{code;details;providerErrorCode;providerErrorText;httpStatus;requestId;retryAfterMs;attempt;causeChain;constructor(i,t,h,s={}){super(t);if(this.name="KMsgError",this.code=i,this.details=h,this.providerErrorCode=s.providerErrorCode,this.providerErrorText=s.providerErrorText,this.httpStatus=w(s.httpStatus),this.requestId=typeof s.requestId==="string"?s.requestId:void 0,this.retryAfterMs=w(s.retryAfterMs),this.attempt=w(s.attempt),Array.isArray(s.causeChain))this.causeChain=s.causeChain;else if(s.causeChain!==void 0)this.causeChain=[s.causeChain];if(Error.captureStackTrace)Error.captureStackTrace(this,O)}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 q={isRetryable(i,t={}){return q.classifyForRetry(i,t)==="retryable"},classifyForRetry(i,t={}){if(i instanceof O){if(new Set(t.retryableCodes??Array.from(k)).has(i.code))return"retryable";if(new Set(t.nonRetryableCodes??Array.from(M)).has(i.code))return"non_retryable";if(i.httpStatus!==void 0)return x(i.httpStatus);let T=H(i.message);if(T)return T;if(t.classifyByMessage&&i.message){let A=t.classifyByMessage(i.message);if(A)return A}if(t.fallback)return t.fallback;return"non_retryable"}let h=i&&typeof i==="object"?i:void 0,s=F(h?.status)??F(h?.statusCode)??F(h?.code),p=w(h?.status)??w(h?.statusCode)??w(h?.httpStatus);if(typeof s==="string"&&s.startsWith("5"))return"retryable";if(p!==void 0){if(t.classifyByStatusCode)return t.classifyByStatusCode(p);return x(p)}let m=typeof h?.message==="string"?H(h.message):void 0;if(m)return m;if(t.classifyByMessage&&typeof h?.message==="string"){let f=t.classifyByMessage(h.message);if(f)return f}return t.fallback??"non_retryable"},resolveRetryAfterMs(i,t){if(t?.retryAfterMs){let h=t.retryAfterMs(i),s=E(h);if(s!==void 0)return s}if(i.retryAfterMs!==void 0)return E(i.retryAfterMs);if(i.code==="RATE_LIMIT_EXCEEDED"&&i.retryAfterMs===void 0)return;return},isUnknownStatus:(i)=>{if(i===void 0||Number.isNaN(i)||!Number.isFinite(i))return!1;return i<500},toRetryMetadata(i){return{providerErrorCode:i.providerErrorCode,providerErrorText:i.providerErrorText,httpStatus:i.httpStatus,requestId:i.requestId,retryAfterMs:i.retryAfterMs,attempt:i.attempt,causeChain:i.causeChain}},withAttempt(i,t){return new O(i.code,i.message,i.details,{...q.toRetryMetadata(i),attempt:w(t)})},DEFAULT_RETRYABLE_ERROR_CODES:k,DEFAULT_NON_RETRYABLE_ERROR_CODES:M};var X;((p)=>{p.DEBUG="DEBUG";p.INFO="INFO";p.WARN="WARN";p.ERROR="ERROR"})(X||={});class b{config;context;constructor(i={},t={}){this.context=i,this.config={level:"INFO",enableConsole:!0,enableJson:!1,enableColors:!0,...t}}shouldLog(i){let t=["DEBUG","INFO","WARN","ERROR"];return t.indexOf(i)>=t.indexOf(this.config.level)}formatMessage(i){if(this.config.enableJson)return JSON.stringify({level:i.level,message:i.message,timestamp:i.timestamp.toISOString(),context:i.context,...i.error&&{error:{name:i.error.name,message:i.error.message,stack:i.error.stack}},...i.duration&&{duration:i.duration}});let t=i.timestamp.toISOString(),h=this.config.enableColors?this.colorizeLevel(i.level):i.level,s=Object.keys(i.context).length>0?` [${Object.entries(i.context).map(([m,f])=>`${m}=${f}`).join(", ")}]`:"",p=`${t} ${h}${s}: ${i.message}`;if(i.duration!==void 0)p+=` (${i.duration}ms)`;if(i.error)p+=`
|
|
2
|
-
${
|
|
1
|
+
var b;((c)=>{c.INVALID_REQUEST="INVALID_REQUEST";c.AUTHENTICATION_FAILED="AUTHENTICATION_FAILED";c.INSUFFICIENT_BALANCE="INSUFFICIENT_BALANCE";c.TEMPLATE_NOT_FOUND="TEMPLATE_NOT_FOUND";c.RATE_LIMIT_EXCEEDED="RATE_LIMIT_EXCEEDED";c.NETWORK_ERROR="NETWORK_ERROR";c.NETWORK_TIMEOUT="NETWORK_TIMEOUT";c.NETWORK_SERVICE_UNAVAILABLE="NETWORK_SERVICE_UNAVAILABLE";c.PROVIDER_ERROR="PROVIDER_ERROR";c.MESSAGE_SEND_FAILED="MESSAGE_SEND_FAILED";c.CRYPTO_CONFIG_ERROR="CRYPTO_CONFIG_ERROR";c.CRYPTO_ENCRYPT_FAILED="CRYPTO_ENCRYPT_FAILED";c.CRYPTO_DECRYPT_FAILED="CRYPTO_DECRYPT_FAILED";c.CRYPTO_HASH_FAILED="CRYPTO_HASH_FAILED";c.CRYPTO_POLICY_VIOLATION="CRYPTO_POLICY_VIOLATION";c.UNKNOWN_ERROR="UNKNOWN_ERROR"})(b||={});var S=new Set(["NETWORK_ERROR","RATE_LIMIT_EXCEEDED","NETWORK_TIMEOUT","NETWORK_SERVICE_UNAVAILABLE","PROVIDER_ERROR","UNKNOWN_ERROR"]),B=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"]),F=(t)=>{if(typeof t!=="number"||Number.isNaN(t)||!Number.isFinite(t))return;return Math.trunc(t)},U=(t)=>{let e=F(t);if(e===void 0||e<0)return;return e},M=(t)=>{if(typeof t!=="string")return;return t.toLowerCase().trim()},N=(t)=>{if(t>=500)return"retryable";if(t===408||t===425||t===429)return"retryable";return"non_retryable"},K=(t)=>{let e=t.toLowerCase();if(e.includes("timeout")||e.includes("temporar")||e.includes("network")||e.includes("retry"))return"retryable";return};class u extends Error{code;details;providerErrorCode;providerErrorText;httpStatus;requestId;retryAfterMs;attempt;causeChain;constructor(t,e,n,i={}){super(e);if(this.name="KMsgError",this.code=t,this.details=n,this.providerErrorCode=i.providerErrorCode,this.providerErrorText=i.providerErrorText,this.httpStatus=F(i.httpStatus),this.requestId=typeof i.requestId==="string"?i.requestId:void 0,this.retryAfterMs=F(i.retryAfterMs),this.attempt=F(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 P={isRetryable(t,e={}){return P.classifyForRetry(t,e)==="retryable"},classifyForRetry(t,e={}){if(t instanceof u){if(new Set(e.retryableCodes??Array.from(S)).has(t.code))return"retryable";if(new Set(e.nonRetryableCodes??Array.from(B)).has(t.code))return"non_retryable";if(t.httpStatus!==void 0)return N(t.httpStatus);let o=K(t.message);if(o)return o;if(e.classifyByMessage&&t.message){let a=e.classifyByMessage(t.message);if(a)return a}if(e.fallback)return e.fallback;return"non_retryable"}let n=t&&typeof t==="object"?t:void 0,i=M(n?.status)??M(n?.statusCode)??M(n?.code),r=F(n?.status)??F(n?.statusCode)??F(n?.httpStatus);if(typeof i==="string"&&i.startsWith("5"))return"retryable";if(r!==void 0){if(e.classifyByStatusCode)return e.classifyByStatusCode(r);return N(r)}let s=typeof n?.message==="string"?K(n.message):void 0;if(s)return s;if(e.classifyByMessage&&typeof n?.message==="string"){let p=e.classifyByMessage(n.message);if(p)return p}return e.fallback??"non_retryable"},resolveRetryAfterMs(t,e){if(e?.retryAfterMs){let n=e.retryAfterMs(t),i=U(n);if(i!==void 0)return i}if(t.retryAfterMs!==void 0)return U(t.retryAfterMs);if(t.code==="RATE_LIMIT_EXCEEDED"&&t.retryAfterMs===void 0)return;return},isUnknownStatus:(t)=>{if(t===void 0||Number.isNaN(t)||!Number.isFinite(t))return!1;return t<500},toRetryMetadata(t){return{providerErrorCode:t.providerErrorCode,providerErrorText:t.providerErrorText,httpStatus:t.httpStatus,requestId:t.requestId,retryAfterMs:t.retryAfterMs,attempt:t.attempt,causeChain:t.causeChain}},withAttempt(t,e){return new u(t.code,t.message,t.details,{...P.toRetryMetadata(t),attempt:F(e)})},DEFAULT_RETRYABLE_ERROR_CODES:S,DEFAULT_NON_RETRYABLE_ERROR_CODES:B};function W(t){switch(t){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 u{kind;fieldPath;failMode;openFallback;constructor(t,e,n,i={}){super(W(t),e,n,i);this.name="FieldCryptoError",this.kind=t,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}}}function O(t){let e=t instanceof Uint8Array?t:new Uint8Array(t),n=typeof globalThis<"u"?globalThis.Buffer:void 0;return(n?n.from(e).toString("base64"):btoa(String.fromCharCode(...e))).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function x(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),n=e.length%4===0?e:`${e}${"=".repeat(4-e.length%4)}`,i=typeof globalThis<"u"?globalThis.Buffer:void 0;if(i)return new Uint8Array(i.from(n,"base64"));let r=atob(n),s=new Uint8Array(r.length);for(let p=0;p<r.length;p+=1)s[p]=r.charCodeAt(p);return s}function q(t,e){if(t instanceof Uint8Array)return t;if(t instanceof ArrayBuffer)return new Uint8Array(t);if(e==="base64url")return x(t);return new TextEncoder().encode(t)}function Z(t){let e=t instanceof Uint8Array?t:new Uint8Array(t);return Array.from(e).map((n)=>n.toString(16).padStart(2,"0")).join("")}function l(t){let e=new Uint8Array(t.byteLength);return e.set(t),e.buffer}function H(t){let e=JSON.parse(t);if(!e||typeof e!=="object"||typeof e.v!=="number"||typeof e.alg!=="string"||typeof e.kid!=="string"||typeof e.iv!=="string"||typeof e.tag!=="string"||typeof e.ct!=="string")throw Error("Invalid ciphertext envelope");return e}function X(t){if(typeof t==="string")return t;return JSON.stringify(t)}function pt(t){if(!t||typeof t!=="object")return!1;let e=t;return typeof e.v==="number"&&typeof e.alg==="string"&&typeof e.kid==="string"&&typeof e.iv==="string"&&typeof e.tag==="string"&&typeof e.ct==="string"}function V(t){return t.replace(/[^\d+]/g,"").trim()}function $(t=3,e=2){return(n)=>{let i=String(n??"");if(i.length<=t+e)return"*".repeat(Math.max(0,i.length));let r=i.slice(0,t),s=i.slice(-e);return`${r}${"*".repeat(i.length-t-e)}${s}`}}function ct(t){let e=t.algorithm??"A256GCM",n=t.keyEncoding??"base64url",i=t.hashKeyEncoding??n,r=new Map,s=new Map,p=(o)=>{let a=r.get(o);if(a)return a;let h=t.keys[o];if(!h)throw Error(`Unknown encryption key id: ${o}`);let y=q(h,n),d=crypto.subtle.importKey("raw",l(y),"AES-GCM",!1,["encrypt","decrypt"]);return r.set(o,d),d},f=(o)=>{let a=s.get(o);if(a)return a;let h=t.hashKeys?.[o]??t.keys[o];if(!h)throw Error(`Unknown hash key id: ${o}`);let y=q(h,i),d=crypto.subtle.importKey("raw",l(y),{name:"HMAC",hash:"SHA-256"},!1,["sign"]);return s.set(o,d),d};return{async encrypt(o){let a=o.kid??t.activeKid,h=await p(a),y=crypto.getRandomValues(new Uint8Array(12)),d=new TextEncoder().encode(JSON.stringify(o.aad??{})),g=new TextEncoder().encode(o.value),m=await crypto.subtle.encrypt({name:"AES-GCM",iv:l(y),additionalData:l(d),tagLength:128},h,l(g)),w=new Uint8Array(m),c=w.slice(w.length-16),E=w.slice(0,w.length-16);return{ciphertext:{v:1,alg:e,kid:a,iv:O(y),tag:O(c),ct:O(E)},kid:a}},async decrypt(o){let a=H(o.ciphertext),h=o.candidateKids&&o.candidateKids.length>0?o.candidateKids:[a.kid],y=x(a.iv),d=x(a.tag),g=x(a.ct),m=new Uint8Array(g.length+d.length);m.set(g,0),m.set(d,g.length);let w=new TextEncoder().encode(JSON.stringify(o.aad??{})),c;for(let E of h)try{let T=await p(E),Q=await crypto.subtle.decrypt({name:"AES-GCM",iv:l(y),additionalData:l(w),tagLength:128},T,l(m));return new TextDecoder().decode(new Uint8Array(Q))}catch(T){c=T}throw Error(`Failed to decrypt ciphertext: ${c instanceof Error?c.message:String(c??"unknown")}`)},async hash(o){let a=o.kid??t.activeKid,h=await f(a),y=await crypto.subtle.sign("HMAC",h,l(new TextEncoder().encode(o.value)));return Z(y)},mask(o){return $()(o.value)}}}function at(){return{encrypt(t){return{ciphertext:JSON.stringify({v:1,alg:"NOOP",kid:"noop",iv:"",tag:"",ct:t.value})}},decrypt(t){try{return H(t.ciphertext).ct}catch{return t.ciphertext}},hash(t){let e=V(t.value);return O(new TextEncoder().encode(e))},mask(t){return $()(t.value)}}}function ft(t){return X(t)}var L;((r)=>{r.DEBUG="DEBUG";r.INFO="INFO";r.WARN="WARN";r.ERROR="ERROR"})(L||={});var z=["to","from","phone","phoneNumber","recipient","sender","secret","apiKey","apiSecret","authorization","auth","token","password","payload","message","content","text"];function tt(t){let e=t.toLowerCase();return z.some((n)=>e.includes(n.toLowerCase()))}function et(t){let e=t.trim();if(e.length<=4)return"***";if(e.includes("@")){let[r,s]=e.split("@");return`${r.slice(0,2)}${"*".repeat(Math.max(1,r.length-2))}@${s}`}let n=e.slice(0,3),i=e.slice(-2);return`${n}${"*".repeat(Math.max(1,e.length-5))}${i}`}function D(t,e){if(e===void 0||e===null)return e;if(tt(t)){if(typeof e==="string")return et(e);if(typeof e==="number"||typeof e==="boolean")return"***";if(Array.isArray(e))return"[REDACTED]";if(typeof e==="object")return"[REDACTED]"}if(Array.isArray(e))return e.map((n)=>D(t,n));if(typeof e==="object"){let n={};for(let[i,r]of Object.entries(e))n[i]=D(i,r);return n}return e}function nt(t){let e={};for(let[n,i]of Object.entries(t))e[n]=D(n,i);return e}class R{config;context;constructor(t={},e={}){this.context=t,this.config={level:"INFO",enableConsole:!0,enableJson:!1,enableColors:!0,...e}}shouldLog(t){let e=["DEBUG","INFO","WARN","ERROR"];return e.indexOf(t)>=e.indexOf(this.config.level)}formatMessage(t){let e=nt(t.context);if(this.config.enableJson)return JSON.stringify({level:t.level,message:t.message,timestamp:t.timestamp.toISOString(),context:e,...t.error&&{error:{name:t.error.name,message:t.error.message,stack:t.error.stack}},...t.duration&&{duration:t.duration}});let n=t.timestamp.toISOString(),i=this.config.enableColors?this.colorizeLevel(t.level):t.level,r=Object.keys(e).length>0?` [${Object.entries(e).map(([p,f])=>`${p}=${f}`).join(", ")}]`:"",s=`${n} ${i}${r}: ${t.message}`;if(t.duration!==void 0)s+=` (${t.duration}ms)`;if(t.error)s+=`
|
|
2
|
+
${t.error.stack}`;return s}colorizeLevel(t){if(!this.config.enableColors)return t;return`${{["DEBUG"]:"\x1B[36m",["INFO"]:"\x1B[32m",["WARN"]:"\x1B[33m",["ERROR"]:"\x1B[31m"}[t]}${t}\x1B[0m`}writeLog(t){if(!this.shouldLog(t.level))return;let e=this.formatMessage(t);if(this.config.enableConsole)(t.level==="ERROR"?console.error:t.level==="WARN"?console.warn:console.log)(e);if(this.config.enableFile&&this.config.filePath);}debug(t,e={}){this.writeLog({level:"DEBUG",message:t,timestamp:new Date,context:{...this.context,...e}})}info(t,e={}){this.writeLog({level:"INFO",message:t,timestamp:new Date,context:{...this.context,...e}})}warn(t,e={},n){this.writeLog({level:"WARN",message:t,timestamp:new Date,context:{...this.context,...e},error:n})}error(t,e={},n){this.writeLog({level:"ERROR",message:t,timestamp:new Date,context:{...this.context,...e},error:n})}child(t){return new R({...this.context,...t},this.config)}time(t){let e=Date.now();return()=>{let n=Date.now()-e;this.info(`${t} completed`,{duration:n})}}async measure(t,e,n={}){let i=Date.now(),r={...n,operation:t};this.debug(`Starting ${t}`,r);try{let s=await e(),p=Date.now()-i;return this.info(`Completed ${t}`,{...r,duration:p}),s}catch(s){let p=Date.now()-i;throw this.error(`Failed ${t}`,{...r,duration:p},s instanceof Error?s:Error(String(s))),s}}}var k;function _(t,e){return new R(t,e)}function C(){if(!k)k=_();return k}function yt(t){k=t}var dt={debug:(t,e)=>C().debug(t,e),info:(t,e)=>C().info(t,e),warn:(t,e,n)=>C().warn(t,e,n),error:(t,e,n)=>C().error(t,e,n),child:(t)=>C().child(t),time:(t)=>C().time(t),measure:(t,e,n)=>C().measure(t,e,n)};function ut(t){let e=_({},t);return async(n,i)=>{let r=Date.now(),p={requestId:Math.random().toString(36).substring(7),method:n.req.method,path:n.req.path,userAgent:n.req.header("user-agent")||"unknown"};e.info("Request started",p);try{await i();let f=Date.now()-r;e.info("Request completed",{...p,status:n.res.status,duration:f})}catch(f){let o=Date.now()-r;throw e.error("Request failed",{...p,duration:o},f instanceof Error?f:Error(String(f))),f}}}class A{static defaultOptions={maxAttempts:3,initialDelay:1000,maxDelay:30000,backoffMultiplier:2,jitter:!0,retryCondition:(t)=>P.isRetryable(t)};static async execute(t,e={}){let n={...A.defaultOptions,...e},i,r=n.initialDelay;for(let s=1;s<=n.maxAttempts;s++)try{return await t()}catch(p){if(i=p,s===n.maxAttempts||!n.retryCondition(i,s))throw i;let f=n.jitter?r+Math.random()*r*0.1:r;n.onRetry?.(i,s),await new Promise((o)=>setTimeout(o,f)),r=Math.min(r*n.backoffMultiplier,n.maxDelay)}throw i}static createRetryableFunction(t,e={}){return async(...n)=>{return A.execute(()=>t(...n),e)}}}class I{static async execute(t,e,n={}){let i={concurrency:5,retryOptions:{maxAttempts:3,initialDelay:1000,maxDelay:1e4,backoffMultiplier:2,jitter:!0},failFast:!1,...n},r=Date.now(),s=[],p=[],f=0,o=A.createRetryableFunction(e,i.retryOptions),a=I.createBatches(t,i.concurrency);for(let y of a){let d=y.map(async(g)=>{try{let m=await o(g);s.push({item:g,result:m})}catch(m){if(p.push({item:g,error:m}),i.failFast)throw new u("MESSAGE_SEND_FAILED",`Bulk operation failed fast after ${p.length} failures`,{totalItems:t.length,failedCount:p.length})}finally{f++,i.onProgress?.(f,t.length,p.length)}});if(await Promise.allSettled(d),i.failFast&&p.length>0)break}let h=Date.now()-r;return{successful:s,failed:p,summary:{total:t.length,successful:s.length,failed:p.length,duration:h}}}static createBatches(t,e){let n=[];for(let i=0;i<t.length;i+=e)n.push(t.slice(i,i+e));return n}}class G{options;state="CLOSED";failureCount=0;lastFailureTime=0;nextAttemptTime=0;constructor(t){this.options=t}async execute(t){let e=Date.now();switch(this.state){case"OPEN":if(e<this.nextAttemptTime)throw new u("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 n=await Promise.race([t(),new Promise((i,r)=>setTimeout(()=>r(new u("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 n}catch(n){throw this.recordFailure(),n}}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 J{maxRequests;windowMs;requests=[];constructor(t,e){this.maxRequests=t;this.windowMs=e}async acquire(){let t=Date.now();if(this.requests=this.requests.filter((e)=>t-e<this.windowMs),this.requests.length>=this.maxRequests){let e=Math.min(...this.requests),n=this.windowMs-(t-e);if(n>0)return await new Promise((i)=>setTimeout(i,n)),this.acquire()}this.requests.push(t)}canMakeRequest(){let t=Date.now();return this.requests=this.requests.filter((e)=>t-e<this.windowMs),this.requests.length<this.maxRequests}getRemainingRequests(){let t=Date.now();return this.requests=this.requests.filter((e)=>t-e<this.windowMs),Math.max(0,this.maxRequests-this.requests.length)}}var Y=(t)=>({isSuccess:!0,isFailure:!1,value:t}),j=(t)=>({isSuccess:!1,isFailure:!0,error:t}),Mt={map(t,e){if(t.isSuccess)return Y(e(t.value));return t},flatMap(t,e){if(t.isSuccess)return e(t.value);return t},mapError(t,e){if(t.isFailure)return j(e(t.error));return t},unwrap(t){if(t.isSuccess)return t.value;throw t.error},unwrapOr(t,e){if(t.isSuccess)return t.value;return e},unwrapOrElse(t,e){if(t.isSuccess)return t.value;return e(t.error)},match(t,e){if(t.isSuccess)return e.ok(t.value);return e.fail(t.error)},async fromPromise(t){try{let e=await t;return Y(e)}catch(e){return j(e)}},isOk(t){return t.isSuccess},isFail(t){return t.isFailure}};function it(){let t=globalThis;return t.__K_MSG_ENV__??t.__ENV__??t.process?.env??{}}function Rt(t){let e=it()[t];if(typeof e==="string")return e;if(e===void 0)return;return String(e)}var St=["PENDING","SENT","FAILED"],Bt="PENDING",Ut=(t)=>{let e=typeof t==="string"?t.trim().toUpperCase():"";if(e==="PENDING"||e==="SENT"||e==="FAILED")return e;return"PENDING"};export{ft as toCiphertextEnvelopeString,yt as setGlobalLogger,Rt as readRuntimeEnv,Y as ok,U as normalizeRetryAfterMs,V as normalizePhoneForHash,Ut as normalizeMessageStatus,ut as loggerMiddleware,dt as logger,pt as isCryptoEnvelope,it as getRuntimeEnvSource,C as getLogger,j as fail,at as createNoopFieldCryptoProvider,_ as createLogger,$ as createDefaultMasker,ct as createAesGcmFieldCryptoProvider,A as RetryHandler,Mt as Result,J as RateLimiter,Bt as QUEUED_MESSAGE_STATUS,R as Logger,L as LogLevel,St as KNOWN_MESSAGE_STATUSES,b as KMsgErrorCode,u as KMsgError,v as FieldCryptoError,P as ErrorUtils,G as CircuitBreaker,I as BulkOperationHandler};
|
|
3
3
|
|
|
4
|
-
//# debugId=
|
|
4
|
+
//# debugId=EBEE7AE2E684A6BA64756E2164756E21
|
|
5
5
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/errors.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"],
|
|
3
|
+
"sources": ["../src/errors.ts", "../src/crypto/errors.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 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 ]);\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",
|
|
6
|
-
"
|
|
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",
|
|
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
|
+
"export type FieldMode = \"plain\" | \"encrypt\" | \"encrypt+hash\" | \"mask\";\nexport type FieldCryptoFailMode = \"closed\" | \"open\";\nexport type FieldCryptoOpenFallback = \"masked\" | \"plaintext\" | \"null\";\nexport type MaybePromise<T> = T | Promise<T>;\n\nexport interface CryptoEnvelope {\n v: number;\n alg: string;\n kid: string;\n iv: string;\n tag: string;\n ct: string;\n}\n\nexport interface FieldCryptoAad {\n [key: string]: string;\n}\n\nexport interface FieldCryptoKeyContext {\n tenantId?: string;\n providerId?: string;\n messageId?: string;\n tableName?: string;\n fieldPath?: string;\n requestId?: string;\n}\n\nexport interface KeyResolver {\n resolveEncryptKey(\n context: FieldCryptoKeyContext,\n ): MaybePromise<{ kid: string }>;\n resolveDecryptKeys?(\n context: FieldCryptoKeyContext & {\n ciphertext?: string;\n },\n ): MaybePromise<readonly string[]>;\n}\n\nexport interface FieldCryptoEncryptInput {\n value: string;\n aad: FieldCryptoAad;\n path: string;\n kid?: string;\n}\n\nexport interface FieldCryptoDecryptInput {\n ciphertext: string;\n aad: FieldCryptoAad;\n path: string;\n candidateKids?: readonly string[];\n}\n\nexport interface FieldCryptoHashInput {\n value: string;\n path: string;\n kid?: string;\n}\n\nexport interface FieldCryptoMaskInput {\n value: string;\n path: string;\n}\n\nexport interface FieldCryptoProvider {\n encrypt(\n input: FieldCryptoEncryptInput,\n ): MaybePromise<{ ciphertext: string | CryptoEnvelope; kid?: string }>;\n decrypt(input: FieldCryptoDecryptInput): MaybePromise<string>;\n hash(input: FieldCryptoHashInput): MaybePromise<string>;\n mask?(input: FieldCryptoMaskInput): MaybePromise<string>;\n}\n\nexport interface FieldCryptoConfig {\n enabled?: boolean;\n fields: Record<string, FieldMode>;\n failMode?: FieldCryptoFailMode;\n openFallback?: FieldCryptoOpenFallback;\n unsafeAllowPlaintextStorage?: boolean;\n aadFields?: readonly string[];\n keyResolver?: KeyResolver;\n provider: FieldCryptoProvider;\n}\n\nexport type FieldCryptoMetricName =\n | \"crypto_encrypt_ms\"\n | \"crypto_decrypt_ms\"\n | \"crypto_fail_count\"\n | \"key_kid_usage\";\n\nexport interface FieldCryptoMetricEvent {\n name: FieldCryptoMetricName;\n value?: number;\n kid?: string;\n tags?: Record<string, string | number | boolean | undefined>;\n}\n\nfunction encodeBase64Url(buffer: ArrayBuffer | Uint8Array): string {\n const bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);\n const maybeBuffer =\n typeof globalThis !== \"undefined\"\n ? (\n globalThis as {\n Buffer?: {\n from: (input: Uint8Array) => {\n toString: (encoding: string) => string;\n };\n };\n }\n ).Buffer\n : undefined;\n const base64 = maybeBuffer\n ? maybeBuffer.from(bytes).toString(\"base64\")\n : btoa(String.fromCharCode(...bytes));\n return base64.replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/g, \"\");\n}\n\nfunction decodeBase64Url(value: string): Uint8Array {\n const normalized = value.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padded =\n normalized.length % 4 === 0\n ? normalized\n : `${normalized}${\"=\".repeat(4 - (normalized.length % 4))}`;\n\n const maybeBuffer =\n typeof globalThis !== \"undefined\"\n ? (\n globalThis as {\n Buffer?: { from: (input: string, encoding: string) => Uint8Array };\n }\n ).Buffer\n : undefined;\n\n if (maybeBuffer) {\n return new Uint8Array(maybeBuffer.from(padded, \"base64\"));\n }\n\n const binary = atob(padded);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) {\n bytes[index] = binary.charCodeAt(index);\n }\n return bytes;\n}\n\nfunction toUint8Array(\n value: string | ArrayBuffer | Uint8Array,\n encoding: \"utf8\" | \"base64url\",\n): Uint8Array {\n if (value instanceof Uint8Array) return value;\n if (value instanceof ArrayBuffer) return new Uint8Array(value);\n if (encoding === \"base64url\") return decodeBase64Url(value);\n return new TextEncoder().encode(value);\n}\n\nfunction toHex(buffer: ArrayBuffer | Uint8Array): string {\n const bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);\n return Array.from(bytes)\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\nfunction toCryptoBufferSource(bytes: Uint8Array): ArrayBuffer {\n const copy = new Uint8Array(bytes.byteLength);\n copy.set(bytes);\n return copy.buffer;\n}\n\nfunction parseEnvelope(ciphertext: string): CryptoEnvelope {\n const parsed = JSON.parse(ciphertext) as Partial<CryptoEnvelope>;\n if (\n !parsed ||\n typeof parsed !== \"object\" ||\n typeof parsed.v !== \"number\" ||\n typeof parsed.alg !== \"string\" ||\n typeof parsed.kid !== \"string\" ||\n typeof parsed.iv !== \"string\" ||\n typeof parsed.tag !== \"string\" ||\n typeof parsed.ct !== \"string\"\n ) {\n throw new Error(\"Invalid ciphertext envelope\");\n }\n\n return parsed as CryptoEnvelope;\n}\n\nfunction toCiphertextString(value: string | CryptoEnvelope): string {\n if (typeof value === \"string\") return value;\n return JSON.stringify(value);\n}\n\nexport function isCryptoEnvelope(value: unknown): value is CryptoEnvelope {\n if (!value || typeof value !== \"object\") return false;\n const candidate = value as Partial<CryptoEnvelope>;\n return (\n typeof candidate.v === \"number\" &&\n typeof candidate.alg === \"string\" &&\n typeof candidate.kid === \"string\" &&\n typeof candidate.iv === \"string\" &&\n typeof candidate.tag === \"string\" &&\n typeof candidate.ct === \"string\"\n );\n}\n\nexport function normalizePhoneForHash(value: string): string {\n return value.replace(/[^\\d+]/g, \"\").trim();\n}\n\nexport function createDefaultMasker(\n visibleStart = 3,\n visibleEnd = 2,\n): (value: string) => string {\n return (value: string): string => {\n const normalized = String(value ?? \"\");\n if (normalized.length <= visibleStart + visibleEnd) {\n return \"*\".repeat(Math.max(0, normalized.length));\n }\n const start = normalized.slice(0, visibleStart);\n const end = normalized.slice(-visibleEnd);\n return `${start}${\"*\".repeat(normalized.length - visibleStart - visibleEnd)}${end}`;\n };\n}\n\nexport interface AesGcmFieldCryptoProviderOptions {\n keys: Record<string, string | ArrayBuffer | Uint8Array>;\n activeKid: string;\n hashKeys?: Record<string, string | ArrayBuffer | Uint8Array>;\n keyEncoding?: \"utf8\" | \"base64url\";\n hashKeyEncoding?: \"utf8\" | \"base64url\";\n algorithm?: \"A256GCM\";\n}\n\nexport function createAesGcmFieldCryptoProvider(\n options: AesGcmFieldCryptoProviderOptions,\n): FieldCryptoProvider {\n const algorithm = options.algorithm ?? \"A256GCM\";\n const keyEncoding = options.keyEncoding ?? \"base64url\";\n const hashKeyEncoding = options.hashKeyEncoding ?? keyEncoding;\n const aesKeyCache = new Map<string, Promise<CryptoKey>>();\n const hashKeyCache = new Map<string, Promise<CryptoKey>>();\n\n const importAesKey = (kid: string): Promise<CryptoKey> => {\n const cached = aesKeyCache.get(kid);\n if (cached) return cached;\n\n const raw = options.keys[kid];\n if (!raw) {\n throw new Error(`Unknown encryption key id: ${kid}`);\n }\n const bytes = toUint8Array(raw, keyEncoding);\n const promise = crypto.subtle.importKey(\n \"raw\",\n toCryptoBufferSource(bytes),\n \"AES-GCM\",\n false,\n [\"encrypt\", \"decrypt\"],\n );\n aesKeyCache.set(kid, promise);\n return promise;\n };\n\n const importHashKey = (kid: string): Promise<CryptoKey> => {\n const cached = hashKeyCache.get(kid);\n if (cached) return cached;\n\n const raw = options.hashKeys?.[kid] ?? options.keys[kid];\n if (!raw) {\n throw new Error(`Unknown hash key id: ${kid}`);\n }\n const bytes = toUint8Array(raw, hashKeyEncoding);\n const promise = crypto.subtle.importKey(\n \"raw\",\n toCryptoBufferSource(bytes),\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\"],\n );\n hashKeyCache.set(kid, promise);\n return promise;\n };\n\n return {\n async encrypt(input) {\n const kid = input.kid ?? options.activeKid;\n const key = await importAesKey(kid);\n const iv = crypto.getRandomValues(new Uint8Array(12));\n const additionalData = new TextEncoder().encode(\n JSON.stringify(input.aad ?? {}),\n );\n const plaintext = new TextEncoder().encode(input.value);\n\n const encrypted = await crypto.subtle.encrypt(\n {\n name: \"AES-GCM\",\n iv: toCryptoBufferSource(iv),\n additionalData: toCryptoBufferSource(additionalData),\n tagLength: 128,\n },\n key,\n toCryptoBufferSource(plaintext),\n );\n\n const encryptedBytes = new Uint8Array(encrypted);\n const tag = encryptedBytes.slice(encryptedBytes.length - 16);\n const ciphertext = encryptedBytes.slice(0, encryptedBytes.length - 16);\n\n return {\n ciphertext: {\n v: 1,\n alg: algorithm,\n kid,\n iv: encodeBase64Url(iv),\n tag: encodeBase64Url(tag),\n ct: encodeBase64Url(ciphertext),\n },\n kid,\n };\n },\n\n async decrypt(input) {\n const envelope = parseEnvelope(input.ciphertext);\n const candidateKids =\n input.candidateKids && input.candidateKids.length > 0\n ? input.candidateKids\n : [envelope.kid];\n const iv = decodeBase64Url(envelope.iv);\n const tag = decodeBase64Url(envelope.tag);\n const ciphertext = decodeBase64Url(envelope.ct);\n\n const encrypted = new Uint8Array(ciphertext.length + tag.length);\n encrypted.set(ciphertext, 0);\n encrypted.set(tag, ciphertext.length);\n\n const additionalData = new TextEncoder().encode(\n JSON.stringify(input.aad ?? {}),\n );\n\n let lastError: unknown;\n for (const kid of candidateKids) {\n try {\n const key = await importAesKey(kid);\n const decrypted = await crypto.subtle.decrypt(\n {\n name: \"AES-GCM\",\n iv: toCryptoBufferSource(iv),\n additionalData: toCryptoBufferSource(additionalData),\n tagLength: 128,\n },\n key,\n toCryptoBufferSource(encrypted),\n );\n return new TextDecoder().decode(new Uint8Array(decrypted));\n } catch (error) {\n lastError = error;\n }\n }\n\n throw new Error(\n `Failed to decrypt ciphertext: ${lastError instanceof Error ? lastError.message : String(lastError ?? \"unknown\")}`,\n );\n },\n\n async hash(input) {\n const kid = input.kid ?? options.activeKid;\n const key = await importHashKey(kid);\n const signature = await crypto.subtle.sign(\n \"HMAC\",\n key,\n toCryptoBufferSource(new TextEncoder().encode(input.value)),\n );\n return toHex(signature);\n },\n\n mask(input) {\n return createDefaultMasker()(input.value);\n },\n };\n}\n\nexport function createNoopFieldCryptoProvider(): FieldCryptoProvider {\n return {\n encrypt(input) {\n return {\n ciphertext: JSON.stringify({\n v: 1,\n alg: \"NOOP\",\n kid: \"noop\",\n iv: \"\",\n tag: \"\",\n ct: input.value,\n } satisfies CryptoEnvelope),\n };\n },\n decrypt(input) {\n try {\n const parsed = parseEnvelope(input.ciphertext);\n return parsed.ct;\n } catch {\n return input.ciphertext;\n }\n },\n hash(input) {\n const normalized = normalizePhoneForHash(input.value);\n return encodeBase64Url(new TextEncoder().encode(normalized));\n },\n mask(input) {\n return createDefaultMasker()(input.value);\n },\n };\n}\n\nexport function toCiphertextEnvelopeString(\n ciphertext: string | CryptoEnvelope,\n): string {\n return toCiphertextString(ciphertext);\n}\n",
|
|
8
|
+
"export enum LogLevel {\n DEBUG = \"DEBUG\",\n INFO = \"INFO\",\n WARN = \"WARN\",\n ERROR = \"ERROR\",\n}\n\nexport interface LogContext {\n component?: string;\n operation?: string;\n userId?: string;\n sessionId?: string;\n requestId?: string;\n traceId?: string;\n [key: string]: any;\n}\n\nexport interface LogEntry {\n level: LogLevel;\n message: string;\n timestamp: Date;\n context: LogContext;\n error?: Error;\n duration?: number;\n}\n\nexport interface LoggerConfig {\n level: LogLevel;\n enableConsole: boolean;\n enableFile?: boolean;\n filePath?: string;\n maxFileSize?: number;\n maxFiles?: number;\n enableJson?: boolean;\n enableColors?: boolean;\n}\n\nconst REDACTED_TOKEN = \"[REDACTED]\";\nconst MASKED_TOKEN = \"***\";\nconst SENSITIVE_CONTEXT_KEYS = [\n \"to\",\n \"from\",\n \"phone\",\n \"phoneNumber\",\n \"recipient\",\n \"sender\",\n \"secret\",\n \"apiKey\",\n \"apiSecret\",\n \"authorization\",\n \"auth\",\n \"token\",\n \"password\",\n \"payload\",\n \"message\",\n \"content\",\n \"text\",\n] as const;\n\nfunction isSensitiveContextKey(rawKey: string): boolean {\n const key = rawKey.toLowerCase();\n return SENSITIVE_CONTEXT_KEYS.some((candidate) =>\n key.includes(candidate.toLowerCase()),\n );\n}\n\nfunction maskStringValue(value: string): string {\n const trimmed = value.trim();\n if (trimmed.length <= 4) return MASKED_TOKEN;\n if (trimmed.includes(\"@\")) {\n const [local, domain] = trimmed.split(\"@\");\n const head = local.slice(0, 2);\n return `${head}${\"*\".repeat(Math.max(1, local.length - 2))}@${domain}`;\n }\n const head = trimmed.slice(0, 3);\n const tail = trimmed.slice(-2);\n return `${head}${\"*\".repeat(Math.max(1, trimmed.length - 5))}${tail}`;\n}\n\nfunction sanitizeContextValue(key: string, value: unknown): unknown {\n if (value === undefined || value === null) return value;\n\n if (isSensitiveContextKey(key)) {\n if (typeof value === \"string\") return maskStringValue(value);\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return MASKED_TOKEN;\n }\n if (Array.isArray(value)) return REDACTED_TOKEN;\n if (typeof value === \"object\") return REDACTED_TOKEN;\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => sanitizeContextValue(key, entry));\n }\n\n if (typeof value === \"object\") {\n const next: Record<string, unknown> = {};\n for (const [childKey, childValue] of Object.entries(value)) {\n next[childKey] = sanitizeContextValue(childKey, childValue);\n }\n return next;\n }\n\n return value;\n}\n\nfunction sanitizeLogContext(context: LogContext): LogContext {\n const sanitized: LogContext = {};\n for (const [key, value] of Object.entries(context)) {\n sanitized[key] = sanitizeContextValue(key, value);\n }\n return sanitized;\n}\n\nexport class Logger {\n private config: LoggerConfig;\n private context: LogContext;\n\n constructor(context: LogContext = {}, config: Partial<LoggerConfig> = {}) {\n this.context = context;\n this.config = {\n level: LogLevel.INFO,\n enableConsole: true,\n enableJson: false,\n enableColors: true,\n ...config,\n };\n }\n\n private shouldLog(level: LogLevel): boolean {\n const levels = [\n LogLevel.DEBUG,\n LogLevel.INFO,\n LogLevel.WARN,\n LogLevel.ERROR,\n ];\n return levels.indexOf(level) >= levels.indexOf(this.config.level);\n }\n\n private formatMessage(entry: LogEntry): string {\n const context = sanitizeLogContext(entry.context);\n\n if (this.config.enableJson) {\n return JSON.stringify({\n level: entry.level,\n message: entry.message,\n timestamp: entry.timestamp.toISOString(),\n context,\n ...(entry.error && {\n error: {\n name: entry.error.name,\n message: entry.error.message,\n stack: entry.error.stack,\n },\n }),\n ...(entry.duration && { duration: entry.duration }),\n });\n }\n\n const timestamp = entry.timestamp.toISOString();\n const level = this.config.enableColors\n ? this.colorizeLevel(entry.level)\n : entry.level;\n const contextStr =\n Object.keys(context).length > 0\n ? ` [${Object.entries(context)\n .map(([k, v]) => `${k}=${v}`)\n .join(\", \")}]`\n : \"\";\n\n let message = `${timestamp} ${level}${contextStr}: ${entry.message}`;\n\n if (entry.duration !== undefined) {\n message += ` (${entry.duration}ms)`;\n }\n\n if (entry.error) {\n message += `\\n${entry.error.stack}`;\n }\n\n return message;\n }\n\n private colorizeLevel(level: LogLevel): string {\n if (!this.config.enableColors) return level;\n\n const colors = {\n [LogLevel.DEBUG]: \"\\x1b[36m\", // cyan\n [LogLevel.INFO]: \"\\x1b[32m\", // green\n [LogLevel.WARN]: \"\\x1b[33m\", // yellow\n [LogLevel.ERROR]: \"\\x1b[31m\", // red\n };\n\n return `${colors[level]}${level}\\x1b[0m`;\n }\n\n private writeLog(entry: LogEntry): void {\n if (!this.shouldLog(entry.level)) return;\n\n const message = this.formatMessage(entry);\n\n if (this.config.enableConsole) {\n const logFn =\n entry.level === LogLevel.ERROR\n ? console.error\n : entry.level === LogLevel.WARN\n ? console.warn\n : console.log;\n logFn(message);\n }\n\n // File logging would be implemented here if needed\n if (this.config.enableFile && this.config.filePath) {\n // Bun.write(this.config.filePath, message + '\\n', { createPath: true });\n }\n }\n\n debug(message: string, context: LogContext = {}): void {\n this.writeLog({\n level: LogLevel.DEBUG,\n message,\n timestamp: new Date(),\n context: { ...this.context, ...context },\n });\n }\n\n info(message: string, context: LogContext = {}): void {\n this.writeLog({\n level: LogLevel.INFO,\n message,\n timestamp: new Date(),\n context: { ...this.context, ...context },\n });\n }\n\n warn(message: string, context: LogContext = {}, error?: Error): void {\n this.writeLog({\n level: LogLevel.WARN,\n message,\n timestamp: new Date(),\n context: { ...this.context, ...context },\n error,\n });\n }\n\n error(message: string, context: LogContext = {}, error?: Error): void {\n this.writeLog({\n level: LogLevel.ERROR,\n message,\n timestamp: new Date(),\n context: { ...this.context, ...context },\n error,\n });\n }\n\n child(context: LogContext): Logger {\n return new Logger({ ...this.context, ...context }, this.config);\n }\n\n time(label: string): () => void {\n const start = Date.now();\n return () => {\n const duration = Date.now() - start;\n this.info(`${label} completed`, { duration });\n };\n }\n\n async measure<T>(\n operation: string,\n fn: () => Promise<T>,\n context: LogContext = {},\n ): Promise<T> {\n const start = Date.now();\n const operationContext = { ...context, operation };\n\n this.debug(`Starting ${operation}`, operationContext);\n\n try {\n const result = await fn();\n const duration = Date.now() - start;\n\n this.info(`Completed ${operation}`, { ...operationContext, duration });\n return result;\n } catch (error) {\n const duration = Date.now() - start;\n\n this.error(\n `Failed ${operation}`,\n { ...operationContext, duration },\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n }\n}\n\n// Global logger instance\nlet globalLogger: Logger;\n\nexport function createLogger(\n context?: LogContext,\n config?: Partial<LoggerConfig>,\n): Logger {\n return new Logger(context, config);\n}\n\nexport function getLogger(): Logger {\n if (!globalLogger) {\n globalLogger = createLogger();\n }\n return globalLogger;\n}\n\nexport function setGlobalLogger(logger: Logger): void {\n globalLogger = logger;\n}\n\n// Convenience functions\nexport const logger = {\n debug: (message: string, context?: LogContext) =>\n getLogger().debug(message, context),\n info: (message: string, context?: LogContext) =>\n getLogger().info(message, context),\n warn: (message: string, context?: LogContext, error?: Error) =>\n getLogger().warn(message, context, error),\n error: (message: string, context?: LogContext, error?: Error) =>\n getLogger().error(message, context, error),\n child: (context: LogContext) => getLogger().child(context),\n time: (label: string) => getLogger().time(label),\n measure: <T>(operation: string, fn: () => Promise<T>, context?: LogContext) =>\n getLogger().measure(operation, fn, context),\n};\n\n// Express-style middleware for Hono\nexport function loggerMiddleware(config?: Partial<LoggerConfig>) {\n const requestLogger = createLogger({}, config);\n\n return async (c: any, next: any) => {\n const start = Date.now();\n const requestId = Math.random().toString(36).substring(7);\n\n const context = {\n requestId,\n method: c.req.method,\n path: c.req.path,\n userAgent: c.req.header(\"user-agent\") || \"unknown\",\n };\n\n requestLogger.info(\"Request started\", context);\n\n try {\n await next();\n\n const duration = Date.now() - start;\n requestLogger.info(\"Request completed\", {\n ...context,\n status: c.res.status,\n duration,\n });\n } catch (error) {\n const duration = Date.now() - start;\n requestLogger.error(\n \"Request failed\",\n {\n ...context,\n duration,\n },\n error instanceof Error ? error : new Error(String(error)),\n );\n\n throw error;\n }\n };\n}\n",
|
|
7
9
|
"/**\n * Retry options and handler for K-Message Platform\n */\n\nimport { ErrorUtils } from \"../errors\";\n\nexport interface RetryOptions {\n maxAttempts?: number;\n initialDelay?: number;\n maxDelay?: number;\n backoffMultiplier?: number;\n jitter?: boolean;\n retryCondition?: (error: Error, attempt: number) => boolean;\n onRetry?: (error: Error, attempt: number) => void;\n}\n\n/**\n * Exponential backoff retry mechanism\n */\nexport class RetryHandler {\n private static defaultOptions: RetryOptions = {\n maxAttempts: 3,\n initialDelay: 1000,\n maxDelay: 30000,\n backoffMultiplier: 2,\n jitter: true,\n retryCondition: (error) => ErrorUtils.isRetryable(error),\n };\n\n static async execute<T>(\n operation: () => Promise<T>,\n options: Partial<RetryOptions> = {},\n ): Promise<T> {\n const opts = {\n ...RetryHandler.defaultOptions,\n ...options,\n } as Required<RetryOptions>;\n let lastError: Error;\n let delay = opts.initialDelay;\n\n for (let attempt = 1; attempt <= opts.maxAttempts; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error as Error;\n\n if (\n attempt === opts.maxAttempts ||\n !opts.retryCondition!(lastError, attempt)\n ) {\n throw lastError;\n }\n\n const actualDelay = opts.jitter\n ? delay + Math.random() * delay * 0.1\n : delay;\n\n opts.onRetry?.(lastError, attempt);\n\n await new Promise((resolve) => setTimeout(resolve, actualDelay));\n\n delay = Math.min(delay * opts.backoffMultiplier, opts.maxDelay);\n }\n }\n\n throw lastError!;\n }\n\n static createRetryableFunction<T extends any[], R>(\n func: (...args: T) => Promise<R>,\n options: Partial<RetryOptions> = {},\n ): (...args: T) => Promise<R> {\n return async (...args: T) => {\n return RetryHandler.execute(() => func(...args), options);\n };\n }\n}\n",
|
|
8
10
|
"/**\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",
|
|
9
11
|
"/**\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",
|
|
@@ -12,7 +14,7 @@
|
|
|
12
14
|
"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",
|
|
13
15
|
"export 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\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\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 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\nexport type SendOptions =\n | SmsSendOptions\n | AlimTalkSendOptions\n | FriendTalkSendOptions\n | NsaSendOptions\n | VoiceMessageSendOptions\n | FaxMessageSendOptions\n | RcsTextSendOptions\n | RcsTemplateSendOptions;\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\nexport interface SendResult {\n /**\n * Correlation id (equals the request `messageId`).\n */\n messageId: string;\n providerId: string;\n providerMessageId?: string;\n status: MessageStatus;\n type: MessageType;\n to: string;\n warnings?: SendWarning[];\n raw?: unknown;\n}\n"
|
|
14
16
|
],
|
|
15
|
-
"mappings": "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",
|
|
16
|
-
"debugId": "
|
|
17
|
+
"mappings": "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",
|
|
18
|
+
"debugId": "EBEE7AE2E684A6BA64756E2164756E21",
|
|
17
19
|
"names": []
|
|
18
20
|
}
|