@parsrun/service-adapters 0.1.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/README.md +166 -0
- package/dist/email/index.d.ts +306 -0
- package/dist/email/index.js +300 -0
- package/dist/email/index.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +934 -0
- package/dist/index.js.map +1 -0
- package/dist/payments/index.d.ts +782 -0
- package/dist/payments/index.js +636 -0
- package/dist/payments/index.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
// src/email/definition.ts
|
|
2
|
+
import { defineService } from "@parsrun/service";
|
|
3
|
+
var emailServiceDefinition = defineService({
|
|
4
|
+
name: "email",
|
|
5
|
+
version: "1.0.0",
|
|
6
|
+
description: "Email sending microservice",
|
|
7
|
+
queries: {
|
|
8
|
+
/**
|
|
9
|
+
* Check if email configuration is valid
|
|
10
|
+
*/
|
|
11
|
+
verify: {
|
|
12
|
+
input: void 0,
|
|
13
|
+
output: void 0,
|
|
14
|
+
description: "Verify email provider configuration"
|
|
15
|
+
},
|
|
16
|
+
/**
|
|
17
|
+
* Get available email templates
|
|
18
|
+
*/
|
|
19
|
+
getTemplates: {
|
|
20
|
+
input: void 0,
|
|
21
|
+
output: void 0,
|
|
22
|
+
description: "List available email templates"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
mutations: {
|
|
26
|
+
/**
|
|
27
|
+
* Send a single email
|
|
28
|
+
*/
|
|
29
|
+
send: {
|
|
30
|
+
input: void 0,
|
|
31
|
+
output: void 0,
|
|
32
|
+
description: "Send a single email"
|
|
33
|
+
},
|
|
34
|
+
/**
|
|
35
|
+
* Send batch emails
|
|
36
|
+
*/
|
|
37
|
+
sendBatch: {
|
|
38
|
+
input: void 0,
|
|
39
|
+
output: void 0,
|
|
40
|
+
description: "Send multiple emails in batch"
|
|
41
|
+
},
|
|
42
|
+
/**
|
|
43
|
+
* Render an email template
|
|
44
|
+
*/
|
|
45
|
+
renderTemplate: {
|
|
46
|
+
input: void 0,
|
|
47
|
+
output: void 0,
|
|
48
|
+
description: "Render an email template without sending"
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
events: {
|
|
52
|
+
emits: {
|
|
53
|
+
/**
|
|
54
|
+
* Emitted when an email is sent successfully
|
|
55
|
+
*/
|
|
56
|
+
"email.sent": {
|
|
57
|
+
data: void 0,
|
|
58
|
+
delivery: "at-least-once",
|
|
59
|
+
description: "Email was sent successfully"
|
|
60
|
+
},
|
|
61
|
+
/**
|
|
62
|
+
* Emitted when an email fails to send
|
|
63
|
+
*/
|
|
64
|
+
"email.failed": {
|
|
65
|
+
data: void 0,
|
|
66
|
+
delivery: "at-least-once",
|
|
67
|
+
description: "Email failed to send"
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
handles: [
|
|
71
|
+
// Events this service listens to
|
|
72
|
+
"user.created",
|
|
73
|
+
// Send welcome email
|
|
74
|
+
"user.password_reset_requested",
|
|
75
|
+
// Send password reset email
|
|
76
|
+
"user.email_verification_requested",
|
|
77
|
+
// Send verification email
|
|
78
|
+
"tenant.invitation_created",
|
|
79
|
+
// Send invitation email
|
|
80
|
+
"dunning.notification_required"
|
|
81
|
+
// Send dunning emails
|
|
82
|
+
]
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
// src/email/server.ts
|
|
87
|
+
import { createLogger } from "@parsrun/core";
|
|
88
|
+
import {
|
|
89
|
+
createRpcServer,
|
|
90
|
+
createEventEmitter,
|
|
91
|
+
createMemoryEventTransport,
|
|
92
|
+
getEmbeddedRegistry
|
|
93
|
+
} from "@parsrun/service";
|
|
94
|
+
function createEmailServiceServer(options) {
|
|
95
|
+
const logger = options.logger ?? createLogger({ name: "email-service" });
|
|
96
|
+
const eventTransport = options.eventTransport ?? createMemoryEventTransport();
|
|
97
|
+
const eventEmitter = createEventEmitter({
|
|
98
|
+
service: "email",
|
|
99
|
+
definition: emailServiceDefinition,
|
|
100
|
+
transport: eventTransport,
|
|
101
|
+
logger
|
|
102
|
+
});
|
|
103
|
+
const handlers = {
|
|
104
|
+
queries: {
|
|
105
|
+
verify: async (_input, ctx) => {
|
|
106
|
+
ctx.logger.debug("Verifying email configuration");
|
|
107
|
+
return {
|
|
108
|
+
valid: !!options.provider.apiKey || options.provider.type === "console",
|
|
109
|
+
provider: options.provider.type
|
|
110
|
+
};
|
|
111
|
+
},
|
|
112
|
+
getTemplates: async (_input, ctx) => {
|
|
113
|
+
ctx.logger.debug("Getting available templates");
|
|
114
|
+
return {
|
|
115
|
+
templates: [
|
|
116
|
+
{
|
|
117
|
+
name: "welcome",
|
|
118
|
+
description: "Welcome email for new users",
|
|
119
|
+
variables: ["name", "loginUrl"]
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
name: "password-reset",
|
|
123
|
+
description: "Password reset email",
|
|
124
|
+
variables: ["resetUrl", "expiresInMinutes"]
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
name: "email-verification",
|
|
128
|
+
description: "Email verification link",
|
|
129
|
+
variables: ["verificationUrl", "expiresInHours"]
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
name: "otp",
|
|
133
|
+
description: "One-time password email",
|
|
134
|
+
variables: ["code", "expiresInMinutes"]
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
name: "magic-link",
|
|
138
|
+
description: "Magic link for passwordless login",
|
|
139
|
+
variables: ["url", "expiresInMinutes"]
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
name: "invitation",
|
|
143
|
+
description: "Team/organization invitation",
|
|
144
|
+
variables: ["inviterName", "organizationName", "url", "role", "expiresInDays"]
|
|
145
|
+
}
|
|
146
|
+
]
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
},
|
|
150
|
+
mutations: {
|
|
151
|
+
send: async (input, ctx) => {
|
|
152
|
+
const { to, subject, html, text: _text, templateName, templateData: _templateData } = input;
|
|
153
|
+
void _text;
|
|
154
|
+
void _templateData;
|
|
155
|
+
ctx.logger.info("Sending email", { to, subject, templateName });
|
|
156
|
+
try {
|
|
157
|
+
const toArray = Array.isArray(to) ? to : [to];
|
|
158
|
+
const messageId = `msg_${Date.now()}_${Math.random().toString(36).slice(2)}`;
|
|
159
|
+
if (options.provider.type === "console") {
|
|
160
|
+
console.log("\u{1F4E7} Email sent:", {
|
|
161
|
+
to: toArray,
|
|
162
|
+
subject,
|
|
163
|
+
templateName,
|
|
164
|
+
html: html?.slice(0, 100)
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
await eventEmitter.emit("email.sent", {
|
|
168
|
+
messageId,
|
|
169
|
+
to: toArray,
|
|
170
|
+
subject,
|
|
171
|
+
provider: options.provider.type,
|
|
172
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
173
|
+
});
|
|
174
|
+
return { success: true, messageId };
|
|
175
|
+
} catch (error) {
|
|
176
|
+
const toArray = Array.isArray(to) ? to : [to];
|
|
177
|
+
await eventEmitter.emit("email.failed", {
|
|
178
|
+
to: toArray,
|
|
179
|
+
subject,
|
|
180
|
+
error: error.message,
|
|
181
|
+
provider: options.provider.type,
|
|
182
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
183
|
+
});
|
|
184
|
+
return { success: false, error: error.message };
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
sendBatch: async (input, ctx) => {
|
|
188
|
+
const { emails, stopOnError } = input;
|
|
189
|
+
ctx.logger.info("Sending batch emails", { count: emails.length });
|
|
190
|
+
const results = [];
|
|
191
|
+
let successful = 0;
|
|
192
|
+
let failed = 0;
|
|
193
|
+
for (const email of emails) {
|
|
194
|
+
try {
|
|
195
|
+
const messageId = `msg_${Date.now()}_${Math.random().toString(36).slice(2)}`;
|
|
196
|
+
if (options.provider.type === "console") {
|
|
197
|
+
console.log("\u{1F4E7} Batch email:", { to: email.to, subject: email.subject });
|
|
198
|
+
}
|
|
199
|
+
results.push({ success: true, messageId });
|
|
200
|
+
successful++;
|
|
201
|
+
} catch (error) {
|
|
202
|
+
results.push({ success: false, error: error.message });
|
|
203
|
+
failed++;
|
|
204
|
+
if (stopOnError) {
|
|
205
|
+
break;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return {
|
|
210
|
+
total: emails.length,
|
|
211
|
+
successful,
|
|
212
|
+
failed,
|
|
213
|
+
results
|
|
214
|
+
};
|
|
215
|
+
},
|
|
216
|
+
renderTemplate: async (input, ctx) => {
|
|
217
|
+
const { templateName, data } = input;
|
|
218
|
+
ctx.logger.debug("Rendering template", { templateName });
|
|
219
|
+
const templates = {
|
|
220
|
+
welcome: {
|
|
221
|
+
subject: `Welcome to ${data["appName"] ?? "Our App"}!`,
|
|
222
|
+
html: `<h1>Welcome ${data["name"]}!</h1><p>Click <a href="${data["loginUrl"]}">here</a> to login.</p>`,
|
|
223
|
+
text: `Welcome ${data["name"]}! Visit ${data["loginUrl"]} to login.`
|
|
224
|
+
},
|
|
225
|
+
otp: {
|
|
226
|
+
subject: "Your verification code",
|
|
227
|
+
html: `<h1>Your code is: ${data["code"]}</h1><p>Expires in ${data["expiresInMinutes"]} minutes.</p>`,
|
|
228
|
+
text: `Your code is: ${data["code"]}. Expires in ${data["expiresInMinutes"]} minutes.`
|
|
229
|
+
}
|
|
230
|
+
};
|
|
231
|
+
const template = templates[templateName];
|
|
232
|
+
if (!template) {
|
|
233
|
+
throw new Error(`Template not found: ${templateName}`);
|
|
234
|
+
}
|
|
235
|
+
return template;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
};
|
|
239
|
+
const rpcServer = createRpcServer({
|
|
240
|
+
definition: emailServiceDefinition,
|
|
241
|
+
handlers,
|
|
242
|
+
logger
|
|
243
|
+
});
|
|
244
|
+
const register = () => {
|
|
245
|
+
const registry = getEmbeddedRegistry();
|
|
246
|
+
registry.register("email", rpcServer);
|
|
247
|
+
logger.info("Email service registered");
|
|
248
|
+
};
|
|
249
|
+
return {
|
|
250
|
+
rpcServer,
|
|
251
|
+
eventEmitter,
|
|
252
|
+
register
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// src/email/client.ts
|
|
257
|
+
import {
|
|
258
|
+
useService
|
|
259
|
+
} from "@parsrun/service";
|
|
260
|
+
function createEmailServiceClient(options) {
|
|
261
|
+
const client = useService("email", options);
|
|
262
|
+
return {
|
|
263
|
+
async verify() {
|
|
264
|
+
return client.query("verify", void 0);
|
|
265
|
+
},
|
|
266
|
+
async getTemplates() {
|
|
267
|
+
return client.query("getTemplates", void 0);
|
|
268
|
+
},
|
|
269
|
+
async send(emailOptions) {
|
|
270
|
+
return client.mutate("send", emailOptions);
|
|
271
|
+
},
|
|
272
|
+
async sendBatch(batchOptions) {
|
|
273
|
+
return client.mutate("sendBatch", batchOptions);
|
|
274
|
+
},
|
|
275
|
+
async renderTemplate(templateName, data) {
|
|
276
|
+
return client.mutate("renderTemplate", { templateName, data });
|
|
277
|
+
},
|
|
278
|
+
onEmailSent(handler) {
|
|
279
|
+
return client.on("email.sent", async (event) => {
|
|
280
|
+
await handler(event.data);
|
|
281
|
+
});
|
|
282
|
+
},
|
|
283
|
+
onEmailFailed(handler) {
|
|
284
|
+
return client.on("email.failed", async (event) => {
|
|
285
|
+
await handler(event.data);
|
|
286
|
+
});
|
|
287
|
+
},
|
|
288
|
+
async close() {
|
|
289
|
+
if ("close" in client && typeof client.close === "function") {
|
|
290
|
+
await client.close();
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
export {
|
|
296
|
+
createEmailServiceClient,
|
|
297
|
+
createEmailServiceServer,
|
|
298
|
+
emailServiceDefinition
|
|
299
|
+
};
|
|
300
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/email/definition.ts","../../src/email/server.ts","../../src/email/client.ts"],"sourcesContent":["/**\n * @parsrun/service-adapters - Email Service Definition\n */\n\nimport { defineService } from \"@parsrun/service\";\n\n/**\n * Email Service Definition\n *\n * Provides email sending capabilities as a microservice.\n */\nexport const emailServiceDefinition = defineService({\n name: \"email\",\n version: \"1.0.0\",\n description: \"Email sending microservice\",\n\n queries: {\n /**\n * Check if email configuration is valid\n */\n verify: {\n input: undefined,\n output: undefined as unknown as { valid: boolean; provider: string },\n description: \"Verify email provider configuration\",\n },\n\n /**\n * Get available email templates\n */\n getTemplates: {\n input: undefined,\n output: undefined as unknown as {\n templates: Array<{\n name: string;\n description: string;\n variables: string[];\n }>;\n },\n description: \"List available email templates\",\n },\n },\n\n mutations: {\n /**\n * Send a single email\n */\n send: {\n input: undefined as unknown as {\n to: string | string[];\n subject: string;\n html?: string;\n text?: string;\n from?: string;\n replyTo?: string;\n cc?: string | string[];\n bcc?: string | string[];\n templateName?: string;\n templateData?: Record<string, unknown>;\n tags?: Record<string, string>;\n scheduledAt?: string;\n },\n output: undefined as unknown as {\n success: boolean;\n messageId?: string;\n error?: string;\n },\n description: \"Send a single email\",\n },\n\n /**\n * Send batch emails\n */\n sendBatch: {\n input: undefined as unknown as {\n emails: Array<{\n to: string | string[];\n subject: string;\n html?: string;\n text?: string;\n templateName?: string;\n templateData?: Record<string, unknown>;\n }>;\n stopOnError?: boolean;\n },\n output: undefined as unknown as {\n total: number;\n successful: number;\n failed: number;\n results: Array<{\n success: boolean;\n messageId?: string;\n error?: string;\n }>;\n },\n description: \"Send multiple emails in batch\",\n },\n\n /**\n * Render an email template\n */\n renderTemplate: {\n input: undefined as unknown as {\n templateName: string;\n data: Record<string, unknown>;\n },\n output: undefined as unknown as {\n subject: string;\n html: string;\n text: string;\n },\n description: \"Render an email template without sending\",\n },\n },\n\n events: {\n emits: {\n /**\n * Emitted when an email is sent successfully\n */\n \"email.sent\": {\n data: undefined as unknown as {\n messageId: string;\n to: string[];\n subject: string;\n provider: string;\n timestamp: string;\n },\n delivery: \"at-least-once\",\n description: \"Email was sent successfully\",\n },\n\n /**\n * Emitted when an email fails to send\n */\n \"email.failed\": {\n data: undefined as unknown as {\n to: string[];\n subject: string;\n error: string;\n provider: string;\n timestamp: string;\n },\n delivery: \"at-least-once\",\n description: \"Email failed to send\",\n },\n },\n\n handles: [\n // Events this service listens to\n \"user.created\", // Send welcome email\n \"user.password_reset_requested\", // Send password reset email\n \"user.email_verification_requested\", // Send verification email\n \"tenant.invitation_created\", // Send invitation email\n \"dunning.notification_required\", // Send dunning emails\n ],\n },\n});\n\n/**\n * Type export for the email service definition\n */\nexport type EmailServiceDefinition = typeof emailServiceDefinition;\n","/**\n * @parsrun/service-adapters - Email Service Server\n * Server-side implementation of the Email microservice\n */\n\nimport type { Logger } from \"@parsrun/core\";\nimport { createLogger } from \"@parsrun/core\";\nimport {\n createRpcServer,\n createEventEmitter,\n createMemoryEventTransport,\n getEmbeddedRegistry,\n type RpcServer,\n type RpcHandlers,\n type EventEmitter,\n} from \"@parsrun/service\";\nimport { emailServiceDefinition } from \"./definition.js\";\n\n// ============================================================================\n// EMAIL SERVICE SERVER\n// ============================================================================\n\nexport interface EmailServiceServerOptions {\n /** Email provider configuration */\n provider: EmailProviderConfig;\n /** Logger */\n logger?: Logger;\n /** Event transport (for emitting events) */\n eventTransport?: ReturnType<typeof createMemoryEventTransport>;\n}\n\nexport interface EmailProviderConfig {\n type: \"resend\" | \"sendgrid\" | \"postmark\" | \"console\";\n apiKey?: string;\n fromEmail: string;\n fromName?: string;\n}\n\n/**\n * Create Email Service Server\n */\nexport function createEmailServiceServer(\n options: EmailServiceServerOptions\n): {\n rpcServer: RpcServer;\n eventEmitter: EventEmitter;\n register: () => void;\n} {\n const logger = options.logger ?? createLogger({ name: \"email-service\" });\n const eventTransport = options.eventTransport ?? createMemoryEventTransport();\n\n // Create event emitter\n const eventEmitter = createEventEmitter({\n service: \"email\",\n definition: emailServiceDefinition,\n transport: eventTransport,\n logger,\n });\n\n // Create handlers\n const handlers: RpcHandlers = {\n queries: {\n verify: async (_input, ctx) => {\n ctx.logger.debug(\"Verifying email configuration\");\n // In real implementation, would verify API key with provider\n return {\n valid: !!options.provider.apiKey || options.provider.type === \"console\",\n provider: options.provider.type,\n };\n },\n\n getTemplates: async (_input, ctx) => {\n ctx.logger.debug(\"Getting available templates\");\n return {\n templates: [\n {\n name: \"welcome\",\n description: \"Welcome email for new users\",\n variables: [\"name\", \"loginUrl\"],\n },\n {\n name: \"password-reset\",\n description: \"Password reset email\",\n variables: [\"resetUrl\", \"expiresInMinutes\"],\n },\n {\n name: \"email-verification\",\n description: \"Email verification link\",\n variables: [\"verificationUrl\", \"expiresInHours\"],\n },\n {\n name: \"otp\",\n description: \"One-time password email\",\n variables: [\"code\", \"expiresInMinutes\"],\n },\n {\n name: \"magic-link\",\n description: \"Magic link for passwordless login\",\n variables: [\"url\", \"expiresInMinutes\"],\n },\n {\n name: \"invitation\",\n description: \"Team/organization invitation\",\n variables: [\"inviterName\", \"organizationName\", \"url\", \"role\", \"expiresInDays\"],\n },\n ],\n };\n },\n },\n\n mutations: {\n send: async (input, ctx) => {\n const { to, subject, html, text: _text, templateName, templateData: _templateData } = input as {\n to: string | string[];\n subject: string;\n html?: string;\n text?: string;\n templateName?: string;\n templateData?: Record<string, unknown>;\n };\n void _text; void _templateData; // Reserved for real implementation\n\n ctx.logger.info(\"Sending email\", { to, subject, templateName });\n\n try {\n // In real implementation, would use @parsrun/email\n const toArray = Array.isArray(to) ? to : [to];\n const messageId = `msg_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n\n // Simulate sending\n if (options.provider.type === \"console\") {\n console.log(\"📧 Email sent:\", {\n to: toArray,\n subject,\n templateName,\n html: html?.slice(0, 100),\n });\n }\n\n // Emit success event\n await eventEmitter.emit(\"email.sent\", {\n messageId,\n to: toArray,\n subject,\n provider: options.provider.type,\n timestamp: new Date().toISOString(),\n });\n\n return { success: true, messageId };\n } catch (error) {\n const toArray = Array.isArray(to) ? to : [to];\n\n // Emit failure event\n await eventEmitter.emit(\"email.failed\", {\n to: toArray,\n subject,\n error: (error as Error).message,\n provider: options.provider.type,\n timestamp: new Date().toISOString(),\n });\n\n return { success: false, error: (error as Error).message };\n }\n },\n\n sendBatch: async (input, ctx) => {\n const { emails, stopOnError } = input as {\n emails: Array<{\n to: string | string[];\n subject: string;\n html?: string;\n text?: string;\n }>;\n stopOnError?: boolean;\n };\n\n ctx.logger.info(\"Sending batch emails\", { count: emails.length });\n\n const results: Array<{ success: boolean; messageId?: string; error?: string }> = [];\n let successful = 0;\n let failed = 0;\n\n for (const email of emails) {\n try {\n const messageId = `msg_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n\n if (options.provider.type === \"console\") {\n console.log(\"📧 Batch email:\", { to: email.to, subject: email.subject });\n }\n\n results.push({ success: true, messageId });\n successful++;\n } catch (error) {\n results.push({ success: false, error: (error as Error).message });\n failed++;\n\n if (stopOnError) {\n break;\n }\n }\n }\n\n return {\n total: emails.length,\n successful,\n failed,\n results,\n };\n },\n\n renderTemplate: async (input, ctx) => {\n const { templateName, data } = input as {\n templateName: string;\n data: Record<string, unknown>;\n };\n\n ctx.logger.debug(\"Rendering template\", { templateName });\n\n // In real implementation, would use @parsrun/email templates\n const templates: Record<string, { subject: string; html: string; text: string }> = {\n welcome: {\n subject: `Welcome to ${data[\"appName\"] ?? \"Our App\"}!`,\n html: `<h1>Welcome ${data[\"name\"]}!</h1><p>Click <a href=\"${data[\"loginUrl\"]}\">here</a> to login.</p>`,\n text: `Welcome ${data[\"name\"]}! Visit ${data[\"loginUrl\"]} to login.`,\n },\n otp: {\n subject: \"Your verification code\",\n html: `<h1>Your code is: ${data[\"code\"]}</h1><p>Expires in ${data[\"expiresInMinutes\"]} minutes.</p>`,\n text: `Your code is: ${data[\"code\"]}. Expires in ${data[\"expiresInMinutes\"]} minutes.`,\n },\n };\n\n const template = templates[templateName];\n if (!template) {\n throw new Error(`Template not found: ${templateName}`);\n }\n\n return template;\n },\n },\n };\n\n // Create RPC server\n const rpcServer = createRpcServer({\n definition: emailServiceDefinition,\n handlers,\n logger,\n });\n\n // Register function\n const register = () => {\n const registry = getEmbeddedRegistry();\n registry.register(\"email\", rpcServer);\n logger.info(\"Email service registered\");\n };\n\n return {\n rpcServer,\n eventEmitter,\n register,\n };\n}\n","/**\n * @parsrun/service-adapters - Email Service Client\n * Type-safe client for the Email microservice\n */\n\nimport {\n useService,\n type ServiceClientOptions,\n} from \"@parsrun/service\";\nimport type { EmailServiceDefinition } from \"./definition.js\";\n\n// ============================================================================\n// EMAIL SERVICE CLIENT\n// ============================================================================\n\n/**\n * Type-safe Email Service Client\n */\nexport interface EmailServiceClient {\n /**\n * Verify email provider configuration\n */\n verify(): Promise<{ valid: boolean; provider: string }>;\n\n /**\n * Get available email templates\n */\n getTemplates(): Promise<{\n templates: Array<{\n name: string;\n description: string;\n variables: string[];\n }>;\n }>;\n\n /**\n * Send a single email\n */\n send(options: SendEmailOptions): Promise<SendEmailResult>;\n\n /**\n * Send batch emails\n */\n sendBatch(options: SendBatchOptions): Promise<SendBatchResult>;\n\n /**\n * Render an email template\n */\n renderTemplate(\n templateName: string,\n data: Record<string, unknown>\n ): Promise<{ subject: string; html: string; text: string }>;\n\n /**\n * Subscribe to email events\n */\n onEmailSent(\n handler: (event: {\n messageId: string;\n to: string[];\n subject: string;\n provider: string;\n timestamp: string;\n }) => Promise<void>\n ): () => void;\n\n onEmailFailed(\n handler: (event: {\n to: string[];\n subject: string;\n error: string;\n provider: string;\n timestamp: string;\n }) => Promise<void>\n ): () => void;\n\n /**\n * Close the client\n */\n close(): Promise<void>;\n}\n\nexport interface SendEmailOptions {\n to: string | string[];\n subject: string;\n html?: string;\n text?: string;\n from?: string;\n replyTo?: string;\n cc?: string | string[];\n bcc?: string | string[];\n templateName?: string;\n templateData?: Record<string, unknown>;\n tags?: Record<string, string>;\n scheduledAt?: string;\n}\n\nexport interface SendEmailResult {\n success: boolean;\n messageId?: string;\n error?: string;\n}\n\nexport interface SendBatchOptions {\n emails: Array<{\n to: string | string[];\n subject: string;\n html?: string;\n text?: string;\n templateName?: string;\n templateData?: Record<string, unknown>;\n }>;\n stopOnError?: boolean;\n}\n\nexport interface SendBatchResult {\n total: number;\n successful: number;\n failed: number;\n results: Array<{\n success: boolean;\n messageId?: string;\n error?: string;\n }>;\n}\n\n/**\n * Create Email Service Client\n *\n * @example\n * ```typescript\n * // Embedded mode (same process)\n * const email = createEmailServiceClient();\n *\n * // HTTP mode (remote service)\n * const email = createEmailServiceClient({\n * mode: 'http',\n * baseUrl: 'https://email.example.com',\n * });\n *\n * // Send email\n * const result = await email.send({\n * to: 'user@example.com',\n * subject: 'Hello',\n * html: '<p>Hello World</p>',\n * });\n *\n * // Use template\n * const result = await email.send({\n * to: 'user@example.com',\n * subject: 'Welcome!',\n * templateName: 'welcome',\n * templateData: { name: 'John', loginUrl: 'https://app.com/login' },\n * });\n * ```\n */\nexport function createEmailServiceClient(\n options?: ServiceClientOptions\n): EmailServiceClient {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const client = useService<EmailServiceDefinition>(\"email\", options) as any;\n\n return {\n async verify() {\n return client.query(\"verify\", undefined) as Promise<{ valid: boolean; provider: string }>;\n },\n\n async getTemplates() {\n return client.query(\"getTemplates\", undefined) as Promise<{\n templates: Array<{\n name: string;\n description: string;\n variables: string[];\n }>;\n }>;\n },\n\n async send(emailOptions: SendEmailOptions) {\n return client.mutate(\"send\", emailOptions) as Promise<SendEmailResult>;\n },\n\n async sendBatch(batchOptions: SendBatchOptions) {\n return client.mutate(\"sendBatch\", batchOptions) as Promise<SendBatchResult>;\n },\n\n async renderTemplate(templateName: string, data: Record<string, unknown>) {\n return client.mutate(\"renderTemplate\", { templateName, data }) as Promise<{\n subject: string;\n html: string;\n text: string;\n }>;\n },\n\n onEmailSent(handler) {\n return client.on(\"email.sent\", async (event: { data: unknown }) => {\n await handler(event.data as {\n messageId: string;\n to: string[];\n subject: string;\n provider: string;\n timestamp: string;\n });\n });\n },\n\n onEmailFailed(handler) {\n return client.on(\"email.failed\", async (event: { data: unknown }) => {\n await handler(event.data as {\n to: string[];\n subject: string;\n error: string;\n provider: string;\n timestamp: string;\n });\n });\n },\n\n async close() {\n if (\"close\" in client && typeof client.close === \"function\") {\n await (client as { close: () => Promise<void> }).close();\n }\n },\n };\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { EmailServiceClient, EmailServiceDefinition, EmailServiceServerOptions, createEmailServiceClient, createEmailServiceServer, emailServiceDefinition } from './email/index.js';
|
|
2
|
+
export { PaymentsServiceClient, PaymentsServiceDefinition, PaymentsServiceServerOptions, createPaymentsServiceClient, createPaymentsServiceServer, paymentsServiceDefinition } from './payments/index.js';
|
|
3
|
+
import '@parsrun/service';
|
|
4
|
+
import '@parsrun/core';
|