@k-msg/channel 0.28.0 → 0.29.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,15 +4,12 @@ export declare class KakaoChannelManager {
4
4
  createChannel(request: ChannelCreateRequest): Promise<Channel>;
5
5
  private validateKakaoChannelRequest;
6
6
  private isValidPlusFriendId;
7
- private initiateBusinessVerification;
8
- completeVerification(channelId: string, approved: boolean, rejectionReason?: string): Promise<void>;
9
7
  getChannel(channelId: string): Promise<Channel | null>;
10
8
  updateChannel(channelId: string, updates: Partial<Channel>): Promise<Channel>;
11
9
  deleteChannel(channelId: string): Promise<boolean>;
12
10
  listChannels(filters?: {
13
11
  status?: ChannelStatus;
14
12
  type?: ChannelType;
15
- verified?: boolean;
16
13
  }): Promise<Channel[]>;
17
14
  suspendChannel(channelId: string, reason: string): Promise<void>;
18
15
  reactivateChannel(channelId: string): Promise<void>;
@@ -1,14 +1,9 @@
1
1
  import { type SenderNumber, type SenderNumberCategory, type SenderNumberCreateRequest, SenderNumberStatus } from "../../types/channel.types";
2
2
  export declare class KakaoSenderNumberManager {
3
3
  private senderNumbers;
4
- private verificationCodes;
5
4
  addSenderNumber(channelId: string, request: SenderNumberCreateRequest): Promise<SenderNumber>;
6
5
  private validatePhoneNumber;
7
6
  private findSenderNumberByPhone;
8
- private initiateVerification;
9
- private sendVerificationSMS;
10
- verifySenderNumber(senderNumberId: string, code: string): Promise<boolean>;
11
- resendVerificationCode(senderNumberId: string): Promise<void>;
12
7
  getSenderNumber(senderNumberId: string): Promise<SenderNumber | null>;
13
8
  listSenderNumbers(filters?: {
14
9
  channelId?: string;
@@ -26,6 +21,4 @@ export declare class KakaoSenderNumberManager {
26
21
  errors: string[];
27
22
  }>;
28
23
  private generateSenderNumberId;
29
- private generateVerificationCode;
30
- cleanup(): void;
31
24
  }
@@ -79,6 +79,7 @@ export declare class ChannelCRUD extends EventEmitter {
79
79
  };
80
80
  destroy(): void;
81
81
  private addAuditLog;
82
+ private removeSenderNumbersForChannel;
82
83
  private getDefaultLimits;
83
84
  private getDefaultFeatures;
84
85
  private startAutoCleanup;
@@ -1,4 +1,4 @@
1
- import type { ChannelConfig, ChannelVerificationResult } from "../../types/channel.types";
1
+ import type { ChannelConfig } from "../../types/channel.types";
2
2
  import { SenderNumberStatus } from "../../types/channel.types";
3
3
  export interface ServiceSenderNumber {
4
4
  phoneNumber: string;
@@ -16,7 +16,6 @@ export declare class ChannelService {
16
16
  updateChannel(channelId: string, updates: Partial<ChannelConfig>): Promise<ChannelConfig>;
17
17
  deleteChannel(channelId: string): Promise<void>;
18
18
  addSenderNumber(channelId: string, phoneNumber: string, name?: string): Promise<ServiceSenderNumber>;
19
- verifySenderNumber(phoneNumber: string): Promise<ChannelVerificationResult>;
20
19
  getSenderNumbers(channelId?: string): Promise<ServiceSenderNumber[]>;
21
20
  private generateChannelId;
22
21
  }
@@ -8,7 +8,6 @@ export interface Channel {
8
8
  profileKey: string;
9
9
  senderNumbers: SenderNumber[];
10
10
  metadata: ChannelMetadata;
11
- verification: ChannelVerification;
12
11
  createdAt: Date;
13
12
  updatedAt: Date;
14
13
  }
@@ -36,7 +35,6 @@ export interface SenderNumber {
36
35
  channelId?: string;
37
36
  phoneNumber: string;
38
37
  status: SenderNumberStatus;
39
- verificationCode?: string;
40
38
  verifiedAt?: Date;
41
39
  category: SenderNumberCategory;
42
40
  metadata: {
@@ -88,14 +86,6 @@ export interface ChannelMetadata {
88
86
  maxButtonCount: number;
89
87
  };
90
88
  }
91
- export interface ChannelVerification {
92
- status: VerificationStatus;
93
- documents: VerificationDocument[];
94
- verifiedAt?: Date;
95
- rejectedAt?: Date;
96
- rejectionReason?: string;
97
- verifiedBy?: string;
98
- }
99
89
  export declare enum VerificationStatus {
100
90
  NOT_REQUIRED = "NOT_REQUIRED",
101
91
  PENDING = "PENDING",
@@ -157,7 +147,6 @@ export interface ChannelFilters {
157
147
  provider?: string;
158
148
  type?: ChannelType;
159
149
  status?: ChannelStatus;
160
- verified?: boolean;
161
150
  createdAfter?: Date;
162
151
  createdBefore?: Date;
163
152
  }
@@ -201,7 +190,6 @@ export declare const ChannelFiltersSchema: z.ZodMiniObject<{
201
190
  provider: z.ZodMiniOptional<z.ZodMiniString<string>>;
202
191
  type: z.ZodMiniOptional<z.ZodMiniEnum<typeof ChannelType>>;
203
192
  status: z.ZodMiniOptional<z.ZodMiniEnum<typeof ChannelStatus>>;
204
- verified: z.ZodMiniOptional<z.ZodMiniBoolean<boolean>>;
205
193
  createdAfter: z.ZodMiniOptional<z.ZodMiniDate<Date>>;
206
194
  createdBefore: z.ZodMiniOptional<z.ZodMiniDate<Date>>;
207
195
  }, z.core.$strip>;
@@ -221,13 +209,7 @@ export interface ChannelConfig {
221
209
  type: "alimtalk" | "sms" | "lms" | "friendtalk";
222
210
  providerId: string;
223
211
  active: boolean;
224
- settings: Record<string, any>;
212
+ settings: Record<string, unknown>;
225
213
  createdAt: Date;
226
214
  updatedAt: Date;
227
215
  }
228
- export interface ChannelVerificationResult {
229
- success: boolean;
230
- status: string;
231
- verificationCode?: string;
232
- error?: string;
233
- }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@k-msg/channel",
3
- "version": "0.28.0",
3
+ "version": "0.29.1",
4
4
  "packageManager": "bun@1.3.8",
5
5
  "description": "AlimTalk channel and sender number management",
6
6
  "type": "module",
@@ -29,12 +29,14 @@
29
29
  "build:types": "tsc",
30
30
  "dev": "tsc --watch",
31
31
  "test": "bun test",
32
+ "test:unit": "bun test --testPathPattern='.*\\.test\\.(ts|js)$' --testTimeout=5000",
33
+ "typecheck": "tsc --noEmit",
32
34
  "clean": "rm -rf dist tsconfig.tsbuildinfo",
33
35
  "pack": "bun pm pack",
34
36
  "publish": "bun publish --access public"
35
37
  },
36
38
  "dependencies": {
37
- "@k-msg/core": "0.28.0",
39
+ "@k-msg/core": "0.29.1",
38
40
  "zod": "^4.0.14"
39
41
  },
40
42
  "devDependencies": {
@@ -1,189 +0,0 @@
1
- /**
2
- * Phone Number Verification System
3
- * 발신번호 인증 및 검증 시스템
4
- */
5
- import { EventEmitter } from "../shared/event-emitter";
6
- export interface PhoneVerificationRequest {
7
- id: string;
8
- senderNumberId: string;
9
- phoneNumber: string;
10
- verificationType: VerificationType;
11
- verificationCode: string;
12
- status: PhoneVerificationStatus;
13
- attempts: VerificationAttempt[];
14
- expiresAt: Date;
15
- createdAt: Date;
16
- completedAt?: Date;
17
- metadata: {
18
- userAgent?: string;
19
- ipAddress?: string;
20
- deviceId?: string;
21
- smsProvider?: string;
22
- callProvider?: string;
23
- };
24
- }
25
- export interface VerificationAttempt {
26
- /**
27
- * Distinguish provider/send attempts from user verification attempts.
28
- * This prevents send failures from consuming user attempt limits.
29
- */
30
- purpose?: "send" | "verify";
31
- attemptNumber: number;
32
- attemptedAt: Date;
33
- method: VerificationMethod;
34
- status: "sent" | "delivered" | "failed" | "verified" | "expired";
35
- failureReason?: string;
36
- responseTime?: number;
37
- }
38
- export declare enum VerificationType {
39
- SMS = "sms",
40
- VOICE_CALL = "voice_call",
41
- HYBRID = "hybrid"
42
- }
43
- export declare enum VerificationMethod {
44
- SMS = "sms",
45
- VOICE_CALL = "voice_call",
46
- MISSED_CALL = "missed_call"
47
- }
48
- export declare enum PhoneVerificationStatus {
49
- PENDING = "pending",
50
- CODE_SENT = "code_sent",
51
- VERIFIED = "verified",
52
- FAILED = "failed",
53
- EXPIRED = "expired",
54
- BLOCKED = "blocked"
55
- }
56
- export interface NumberVerifierOptions {
57
- codeLength: number;
58
- codeExpiryMinutes: number;
59
- maxAttempts: number;
60
- maxDailyAttempts: number;
61
- smsTemplate: string;
62
- voiceTemplate: string;
63
- rateLimitMinutes: number;
64
- enableVoiceFallback: boolean;
65
- enableMissedCallVerification: boolean;
66
- blockedNumbers: string[];
67
- allowedCountries: string[];
68
- smsProvider?: SMSProvider;
69
- voiceProvider?: VoiceProvider;
70
- }
71
- export interface SMSProvider {
72
- id: string;
73
- name: string;
74
- sendSMS(phoneNumber: string, message: string, options?: unknown): Promise<SMSResult>;
75
- getDeliveryStatus?(messageId: string): Promise<DeliveryStatus>;
76
- }
77
- export interface VoiceProvider {
78
- id: string;
79
- name: string;
80
- makeCall(phoneNumber: string, message: string, options?: unknown): Promise<VoiceResult>;
81
- makeMissedCall?(phoneNumber: string, options?: unknown): Promise<MissedCallResult>;
82
- }
83
- export interface SMSResult {
84
- messageId: string;
85
- status: "sent" | "failed";
86
- cost?: number;
87
- error?: string;
88
- }
89
- export interface VoiceResult {
90
- callId: string;
91
- status: "initiated" | "answered" | "failed" | "busy" | "no_answer";
92
- duration?: number;
93
- cost?: number;
94
- error?: string;
95
- }
96
- export interface MissedCallResult {
97
- callId: string;
98
- status: "initiated" | "completed" | "failed";
99
- missedCallNumber?: string;
100
- error?: string;
101
- }
102
- export interface DeliveryStatus {
103
- messageId: string;
104
- status: "pending" | "delivered" | "failed" | "expired";
105
- deliveredAt?: Date;
106
- failureReason?: string;
107
- }
108
- export interface PhoneNumberInfo {
109
- phoneNumber: string;
110
- countryCode: string;
111
- nationalNumber: string;
112
- carrier?: string;
113
- lineType?: "mobile" | "landline" | "voip" | "unknown";
114
- isValid: boolean;
115
- isPossible: boolean;
116
- region?: string;
117
- }
118
- export declare class NumberVerifier extends EventEmitter {
119
- private options;
120
- private verificationRequests;
121
- private phoneNumberCache;
122
- private rateLimitTracker;
123
- private dailyAttemptTracker;
124
- private blockedNumbers;
125
- private defaultOptions;
126
- constructor(options?: Partial<NumberVerifierOptions>);
127
- /**
128
- * Start phone number verification process
129
- */
130
- startVerification(senderNumberId: string, phoneNumber: string, verificationType?: VerificationType, metadata?: PhoneVerificationRequest["metadata"]): Promise<PhoneVerificationRequest>;
131
- /**
132
- * Verify the provided code
133
- */
134
- verifyCode(requestId: string, providedCode: string): Promise<{
135
- success: boolean;
136
- status: PhoneVerificationStatus;
137
- message: string;
138
- }>;
139
- /**
140
- * Resend verification code
141
- */
142
- resendCode(requestId: string, method?: VerificationMethod): Promise<PhoneVerificationRequest>;
143
- /**
144
- * Get verification request status
145
- */
146
- getVerificationStatus(requestId: string): PhoneVerificationRequest | null;
147
- /**
148
- * Cancel verification request
149
- */
150
- cancelVerification(requestId: string): Promise<boolean>;
151
- /**
152
- * Block a phone number from verification
153
- */
154
- blockPhoneNumber(phoneNumber: string, reason?: string): void;
155
- /**
156
- * Unblock a phone number
157
- */
158
- unblockPhoneNumber(phoneNumber: string): void;
159
- /**
160
- * Get verification statistics
161
- */
162
- getVerificationStats(): {
163
- total: number;
164
- byStatus: Record<string, number>;
165
- byMethod: Record<string, number>;
166
- successRate: number;
167
- averageCompletionTime: number;
168
- };
169
- /**
170
- * Clean up expired verification requests
171
- */
172
- cleanup(): number;
173
- private sendVerificationCode;
174
- private sendVerificationByMethod;
175
- private sendSMS;
176
- private sendVoiceCall;
177
- private sendMissedCall;
178
- private getPhoneNumberInfo;
179
- private parseKoreanPhoneNumber;
180
- private isNumberBlocked;
181
- private isRateLimited;
182
- private isDailyLimitExceeded;
183
- private updateRateLimit;
184
- private updateDailyAttempts;
185
- private normalizePhoneNumber;
186
- private validateCode;
187
- private generateVerificationCode;
188
- private generateRequestId;
189
- }