@k-msg/provider 0.1.1 → 0.1.3

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.
Files changed (47) hide show
  1. package/README.md +3 -1
  2. package/dist/abstract/provider.base.d.ts +108 -0
  3. package/dist/adapters/aligo.adapter.d.ts +50 -0
  4. package/dist/adapters/iwinv.adapter.d.ts +111 -0
  5. package/dist/aligo/provider.d.ts +18 -0
  6. package/dist/config/provider-config-v2.d.ts +122 -0
  7. package/dist/contracts/provider.contract.d.ts +355 -0
  8. package/dist/contracts/sms.contract.d.ts +135 -0
  9. package/dist/index.d.ts +29 -1424
  10. package/dist/index.js +38 -2001
  11. package/dist/index.js.map +107 -1
  12. package/dist/index.mjs +44 -0
  13. package/dist/index.mjs.map +107 -0
  14. package/dist/interfaces/index.d.ts +14 -0
  15. package/dist/interfaces/plugin.d.ts +122 -0
  16. package/dist/interfaces/services.d.ts +222 -0
  17. package/dist/iwinv/contracts/account.contract.d.ts +11 -0
  18. package/dist/iwinv/contracts/analytics.contract.d.ts +16 -0
  19. package/dist/iwinv/contracts/channel.contract.d.ts +15 -0
  20. package/dist/iwinv/contracts/messaging.contract.d.ts +14 -0
  21. package/dist/iwinv/contracts/sms.contract.d.ts +33 -0
  22. package/dist/iwinv/contracts/template.contract.d.ts +18 -0
  23. package/dist/iwinv/index.d.ts +5 -0
  24. package/dist/iwinv/provider-multi.d.ts +116 -0
  25. package/dist/iwinv/provider-sms.d.ts +55 -0
  26. package/dist/iwinv/provider.d.ts +42 -0
  27. package/dist/iwinv/types/iwinv.d.ts +153 -0
  28. package/dist/middleware/index.d.ts +27 -0
  29. package/dist/mock/index.d.ts +1 -0
  30. package/dist/providers/mock/index.d.ts +1 -0
  31. package/dist/providers/mock/mock.provider.d.ts +22 -0
  32. package/dist/registry/index.d.ts +1 -0
  33. package/dist/registry/plugin-registry.d.ts +15 -0
  34. package/dist/services/provider.manager.d.ts +24 -0
  35. package/dist/services/provider.service.d.ts +49 -0
  36. package/dist/test-helpers.d.ts +110 -0
  37. package/dist/types/aligo.d.ts +69 -0
  38. package/dist/types/base.d.ts +172 -0
  39. package/dist/types/typed-templates.d.ts +199 -0
  40. package/dist/types/unified-config.d.ts +197 -0
  41. package/dist/types/unified-errors.d.ts +225 -0
  42. package/dist/utils/base-plugin.d.ts +35 -0
  43. package/dist/utils/index.d.ts +12 -0
  44. package/package.json +25 -14
  45. package/dist/index.cjs +0 -2061
  46. package/dist/index.cjs.map +0 -1
  47. package/dist/index.d.cts +0 -1425
@@ -0,0 +1,355 @@
1
+ export interface ProviderResponse {
2
+ success: boolean;
3
+ data?: unknown;
4
+ error?: {
5
+ code: string;
6
+ message: string;
7
+ details?: Record<string, unknown>;
8
+ };
9
+ }
10
+ export interface TemplateVariable {
11
+ name: string;
12
+ type: string;
13
+ required: boolean;
14
+ description?: string;
15
+ }
16
+ export interface TemplateButton {
17
+ type: string;
18
+ title: string;
19
+ url?: string;
20
+ }
21
+ export interface AlimTalkTemplate {
22
+ id: string;
23
+ name: string;
24
+ content: string;
25
+ variables?: TemplateVariable[];
26
+ buttons?: TemplateButton[];
27
+ }
28
+ export interface Channel {
29
+ id: string;
30
+ name: string;
31
+ profileKey: string;
32
+ status: "active" | "inactive" | "pending" | "blocked";
33
+ createdAt: Date;
34
+ updatedAt: Date;
35
+ }
36
+ export interface SenderNumber {
37
+ id: string;
38
+ channelId: string;
39
+ phoneNumber: string;
40
+ isVerified: boolean;
41
+ verifiedAt?: Date;
42
+ createdAt: Date;
43
+ }
44
+ import type { BaseProvider, StandardRequest, StandardResult } from "@k-msg/core";
45
+ export interface AlimTalkRequest extends StandardRequest {
46
+ templateCode: string;
47
+ phoneNumber: string;
48
+ variables: Record<string, any>;
49
+ senderNumber?: string;
50
+ options?: MessageOptions;
51
+ }
52
+ export interface AlimTalkResult extends StandardResult {
53
+ messageId: string;
54
+ status: any;
55
+ provider: string;
56
+ timestamp: Date;
57
+ templateCode: string;
58
+ phoneNumber: string;
59
+ deliveredAt?: Date;
60
+ error?: ProviderError;
61
+ }
62
+ export interface AlimTalkProvider extends BaseProvider<AlimTalkRequest, AlimTalkResult> {
63
+ readonly type: "messaging";
64
+ readonly capabilities: ProviderCapabilities;
65
+ templates: TemplateContract;
66
+ channels: ChannelContract;
67
+ messaging: MessagingContract;
68
+ analytics: AnalyticsContract;
69
+ account: AccountContract;
70
+ }
71
+ export interface ProviderCapabilities {
72
+ templates: {
73
+ maxLength: number;
74
+ maxVariables: number;
75
+ maxButtons: number;
76
+ supportedButtonTypes: string[];
77
+ requiresApproval: boolean;
78
+ approvalTime: string;
79
+ };
80
+ messaging: {
81
+ maxRecipientsPerRequest: number;
82
+ maxRequestsPerSecond: number;
83
+ supportsBulk: boolean;
84
+ supportsScheduling: boolean;
85
+ maxScheduleDays: number;
86
+ supportsFallback: boolean;
87
+ };
88
+ channels: {
89
+ requiresBusinessVerification: boolean;
90
+ maxSenderNumbers: number;
91
+ supportsMultipleChannels: boolean;
92
+ };
93
+ }
94
+ export interface TemplateContract {
95
+ create(template: TemplateCreateRequest): Promise<TemplateCreateResult>;
96
+ update(templateId: string, template: TemplateUpdateRequest): Promise<TemplateUpdateResult>;
97
+ delete(templateId: string): Promise<void>;
98
+ get(templateId: string): Promise<ProviderTemplate>;
99
+ list(filters?: TemplateFilters): Promise<ProviderTemplate[]>;
100
+ sync(): Promise<SyncResult>;
101
+ }
102
+ export interface TemplateCreateRequest {
103
+ name: string;
104
+ content: string;
105
+ variables: TemplateVariableDefinition[];
106
+ buttons?: TemplateButtonDefinition[];
107
+ category?: string;
108
+ }
109
+ export interface TemplateUpdateRequest {
110
+ name?: string;
111
+ content?: string;
112
+ variables?: TemplateVariableDefinition[];
113
+ buttons?: TemplateButtonDefinition[];
114
+ }
115
+ export interface TemplateCreateResult {
116
+ templateId: string;
117
+ providerTemplateCode: string;
118
+ status: TemplateStatus;
119
+ message?: string;
120
+ }
121
+ export interface TemplateUpdateResult {
122
+ templateId: string;
123
+ status: TemplateStatus;
124
+ message?: string;
125
+ }
126
+ export interface ProviderTemplate {
127
+ id: string;
128
+ code: string;
129
+ name: string;
130
+ content: string;
131
+ status: TemplateStatus;
132
+ createdAt: Date;
133
+ updatedAt: Date;
134
+ approvedAt?: Date;
135
+ rejectedAt?: Date;
136
+ rejectionReason?: string;
137
+ }
138
+ export declare enum TemplateStatus {
139
+ DRAFT = "DRAFT",
140
+ PENDING = "PENDING",
141
+ APPROVED = "APPROVED",
142
+ REJECTED = "REJECTED",
143
+ DISABLED = "DISABLED"
144
+ }
145
+ export interface TemplateVariableDefinition {
146
+ name: string;
147
+ type: string;
148
+ required: boolean;
149
+ maxLength?: number;
150
+ format?: string;
151
+ }
152
+ export interface TemplateButtonDefinition {
153
+ type: string;
154
+ name: string;
155
+ linkMobile?: string;
156
+ linkPc?: string;
157
+ linkIos?: string;
158
+ linkAndroid?: string;
159
+ schemeIos?: string;
160
+ schemeAndroid?: string;
161
+ }
162
+ export interface TemplateFilters {
163
+ status?: TemplateStatus;
164
+ category?: string;
165
+ createdAfter?: Date;
166
+ createdBefore?: Date;
167
+ page?: number;
168
+ size?: number;
169
+ }
170
+ export interface SyncResult {
171
+ synced: number;
172
+ created: number;
173
+ updated: number;
174
+ deleted: number;
175
+ errors: SyncError[];
176
+ }
177
+ export interface SyncError {
178
+ templateId: string;
179
+ error: string;
180
+ }
181
+ export interface ChannelContract {
182
+ register(channel: ChannelRequest): Promise<Channel>;
183
+ list(): Promise<Channel[]>;
184
+ addSenderNumber(channelId: string, number: string): Promise<SenderNumber>;
185
+ verifySenderNumber(number: string, verificationCode: string): Promise<boolean>;
186
+ }
187
+ export interface ChannelRequest {
188
+ name: string;
189
+ profileKey: string;
190
+ businessInfo?: BusinessInfo;
191
+ }
192
+ export interface BusinessInfo {
193
+ name: string;
194
+ registrationNumber: string;
195
+ category: string;
196
+ contactPerson: string;
197
+ contactEmail: string;
198
+ contactPhone: string;
199
+ }
200
+ export interface MessagingContract {
201
+ send(message: ProviderMessageRequest): Promise<ProviderMessageResult>;
202
+ sendBulk(messages: ProviderMessageRequest[]): Promise<ProviderBulkResult>;
203
+ schedule(message: ProviderMessageRequest, scheduledAt: Date): Promise<ScheduleResult>;
204
+ cancel(messageId: string): Promise<void>;
205
+ getStatus(messageId: string): Promise<MessageStatus>;
206
+ }
207
+ export interface ProviderMessageRequest {
208
+ templateCode: string;
209
+ phoneNumber: string;
210
+ variables: Record<string, unknown>;
211
+ senderNumber?: string;
212
+ options?: MessageOptions;
213
+ }
214
+ export interface MessageOptions {
215
+ priority?: "high" | "normal" | "low";
216
+ ttl?: number;
217
+ tracking?: boolean;
218
+ webhookUrl?: string;
219
+ scheduledAt?: Date;
220
+ }
221
+ export interface ProviderMessageResult {
222
+ messageId: string;
223
+ status: MessageStatus;
224
+ sentAt?: Date;
225
+ error?: ProviderError;
226
+ }
227
+ export interface ProviderBulkResult {
228
+ requestId: string;
229
+ results: ProviderMessageResult[];
230
+ summary: {
231
+ total: number;
232
+ sent: number;
233
+ failed: number;
234
+ };
235
+ }
236
+ export interface ScheduleResult {
237
+ scheduleId: string;
238
+ messageId: string;
239
+ scheduledAt: Date;
240
+ status: "scheduled" | "cancelled";
241
+ }
242
+ export declare enum MessageStatus {
243
+ QUEUED = "QUEUED",
244
+ SENDING = "SENDING",
245
+ SENT = "SENT",
246
+ DELIVERED = "DELIVERED",
247
+ FAILED = "FAILED",
248
+ CANCELLED = "CANCELLED"
249
+ }
250
+ export interface ProviderError {
251
+ code: any;
252
+ message: string;
253
+ retryable: boolean;
254
+ details?: Record<string, any>;
255
+ }
256
+ export interface AnalyticsContract {
257
+ getUsage(period: DateRange): Promise<UsageStats>;
258
+ getTemplateStats(templateId: string, period: DateRange): Promise<TemplateStats>;
259
+ getDeliveryReport(messageId: string): Promise<DeliveryReport>;
260
+ }
261
+ export interface DateRange {
262
+ from: Date;
263
+ to: Date;
264
+ }
265
+ export interface UsageStats {
266
+ period: DateRange;
267
+ totalMessages: number;
268
+ sentMessages: number;
269
+ deliveredMessages: number;
270
+ failedMessages: number;
271
+ deliveryRate: number;
272
+ failureRate: number;
273
+ breakdown: {
274
+ byTemplate: Record<string, number>;
275
+ byDay: Record<string, number>;
276
+ byHour: Record<string, number>;
277
+ };
278
+ }
279
+ export interface TemplateStats {
280
+ templateId: string;
281
+ period: DateRange;
282
+ totalSent: number;
283
+ delivered: number;
284
+ failed: number;
285
+ clickRate?: number;
286
+ deliveryRate: number;
287
+ averageDeliveryTime: number;
288
+ }
289
+ export interface DeliveryReport {
290
+ messageId: string;
291
+ phoneNumber: string;
292
+ templateCode: string;
293
+ status: MessageStatus;
294
+ sentAt?: Date;
295
+ deliveredAt?: Date;
296
+ failedAt?: Date;
297
+ clickedAt?: Date;
298
+ error?: ProviderError;
299
+ attempts: DeliveryAttempt[];
300
+ }
301
+ export interface DeliveryAttempt {
302
+ attemptNumber: number;
303
+ attemptedAt: Date;
304
+ status: MessageStatus;
305
+ error?: ProviderError;
306
+ }
307
+ export interface AccountContract {
308
+ getBalance(): Promise<Balance>;
309
+ getProfile(): Promise<AccountProfile>;
310
+ }
311
+ export interface Balance {
312
+ current: number;
313
+ currency: string;
314
+ lastUpdated: Date;
315
+ threshold?: number;
316
+ }
317
+ export interface AccountProfile {
318
+ accountId: string;
319
+ name: string;
320
+ email: string;
321
+ phone: string;
322
+ status: "active" | "suspended" | "blocked";
323
+ tier: "basic" | "standard" | "premium" | "enterprise";
324
+ features: string[];
325
+ limits: {
326
+ dailyMessageLimit: number;
327
+ monthlyMessageLimit: number;
328
+ rateLimit: number;
329
+ };
330
+ }
331
+ export interface ProviderRegistration {
332
+ id: string;
333
+ name: string;
334
+ description: string;
335
+ version: string;
336
+ capabilities: ProviderCapabilities;
337
+ configuration: ProviderConfiguration;
338
+ }
339
+ export interface ProviderConfiguration {
340
+ required: ConfigurationField[];
341
+ optional: ConfigurationField[];
342
+ }
343
+ export interface ConfigurationField {
344
+ key: string;
345
+ name: string;
346
+ type: "string" | "number" | "boolean" | "password" | "url";
347
+ description: string;
348
+ required: boolean;
349
+ default?: unknown;
350
+ validation?: {
351
+ pattern?: string;
352
+ min?: number;
353
+ max?: number;
354
+ };
355
+ }
@@ -0,0 +1,135 @@
1
+ import type { BaseProvider, DeliveryStatus } from "@k-msg/core";
2
+ export interface SMSRequest {
3
+ phoneNumber: string;
4
+ text: string;
5
+ senderNumber?: string;
6
+ options?: SMSOptions;
7
+ }
8
+ export interface SMSOptions {
9
+ priority?: "high" | "normal" | "low";
10
+ encoding?: "UTF-8" | "EUC-KR";
11
+ scheduledAt?: Date;
12
+ subject?: string;
13
+ messageType?: "SMS" | "LMS";
14
+ }
15
+ export interface SMSResult {
16
+ messageId: string;
17
+ status: DeliveryStatus;
18
+ provider: string;
19
+ timestamp: Date;
20
+ phoneNumber: string;
21
+ messageType: "SMS" | "LMS";
22
+ deliveredAt?: Date;
23
+ error?: SMSError;
24
+ }
25
+ export interface BulkSMSResult {
26
+ requestId: string;
27
+ results: SMSResult[];
28
+ summary: {
29
+ total: number;
30
+ sent: number;
31
+ failed: number;
32
+ };
33
+ }
34
+ export interface SMSError {
35
+ code: string;
36
+ message: string;
37
+ retryable: boolean;
38
+ details?: Record<string, unknown>;
39
+ }
40
+ export interface SMSProvider extends BaseProvider<SMSRequest, SMSResult> {
41
+ readonly type: "sms";
42
+ sendBulkSMS?(requests: SMSRequest[]): Promise<BulkSMSResult>;
43
+ sms: SMSContract;
44
+ account: SMSAccountContract;
45
+ }
46
+ export interface SMSContract {
47
+ send(request: SMSSendRequest): Promise<SMSResult>;
48
+ sendBulk?(requests: SMSSendRequest[]): Promise<BulkSMSResult>;
49
+ schedule?(request: SMSSendRequest, scheduledAt: Date): Promise<ScheduleResult>;
50
+ cancel?(messageId: string): Promise<void>;
51
+ getStatus(messageId: string): Promise<SMSStatus>;
52
+ }
53
+ export interface SMSSendRequest {
54
+ phoneNumber: string;
55
+ text: string;
56
+ senderNumber?: string;
57
+ messageType?: "SMS" | "LMS";
58
+ subject?: string;
59
+ options?: SMSSendOptions;
60
+ }
61
+ export interface SMSSendOptions {
62
+ priority?: "high" | "normal" | "low";
63
+ encoding?: "UTF-8" | "EUC-KR";
64
+ webhookUrl?: string;
65
+ tracking?: boolean;
66
+ scheduledAt?: Date;
67
+ }
68
+ export interface ScheduleResult {
69
+ scheduleId: string;
70
+ messageId: string;
71
+ scheduledAt: Date;
72
+ status: "scheduled" | "cancelled";
73
+ }
74
+ export declare enum SMSStatus {
75
+ QUEUED = "QUEUED",
76
+ SENDING = "SENDING",
77
+ SENT = "SENT",
78
+ DELIVERED = "DELIVERED",
79
+ FAILED = "FAILED",
80
+ CANCELLED = "CANCELLED"
81
+ }
82
+ export interface SMSAccountContract {
83
+ getBalance(): Promise<SMSBalance>;
84
+ getProfile(): Promise<SMSAccountProfile>;
85
+ getSenderNumbers(): Promise<SMSSenderNumber[]>;
86
+ addSenderNumber?(phoneNumber: string): Promise<SMSSenderNumber>;
87
+ verifySenderNumber?(phoneNumber: string, verificationCode: string): Promise<boolean>;
88
+ }
89
+ export interface SMSBalance {
90
+ sms: number;
91
+ lms: number;
92
+ currency: string;
93
+ lastUpdated: Date;
94
+ }
95
+ export interface SMSAccountProfile {
96
+ accountId: string;
97
+ name: string;
98
+ status: "active" | "suspended" | "blocked";
99
+ tier: "basic" | "standard" | "premium";
100
+ limits: {
101
+ dailySMSLimit: number;
102
+ dailyLMSLimit: number;
103
+ monthlyLimit: number;
104
+ rateLimit: number;
105
+ };
106
+ }
107
+ export interface SMSSenderNumber {
108
+ id: string;
109
+ phoneNumber: string;
110
+ isVerified: boolean;
111
+ verifiedAt?: Date;
112
+ status: "active" | "inactive" | "pending";
113
+ createdAt: Date;
114
+ }
115
+ export interface SMSCapabilities {
116
+ sms: {
117
+ maxLength: number;
118
+ supportsBulk: boolean;
119
+ maxRecipientsPerRequest: number;
120
+ maxRequestsPerSecond: number;
121
+ supportsScheduling: boolean;
122
+ maxScheduleDays: number;
123
+ };
124
+ lms: {
125
+ maxLength: number;
126
+ supportsSubject: boolean;
127
+ maxSubjectLength: number;
128
+ supportsBulk: boolean;
129
+ };
130
+ senderNumbers: {
131
+ requiresVerification: boolean;
132
+ maxSenderNumbers: number;
133
+ supportsCustomNumbers: boolean;
134
+ };
135
+ }