@amaster.ai/pi-channels 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.
Files changed (68) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +156 -0
  3. package/dist/adapters/feishu.d.ts +5 -0
  4. package/dist/adapters/feishu.d.ts.map +1 -0
  5. package/dist/adapters/feishu.js +429 -0
  6. package/dist/adapters/feishu.js.map +1 -0
  7. package/dist/adapters/webhook.d.ts +3 -0
  8. package/dist/adapters/webhook.d.ts.map +1 -0
  9. package/dist/adapters/webhook.js +63 -0
  10. package/dist/adapters/webhook.js.map +1 -0
  11. package/dist/adapters/wecom/adapter.d.ts +3 -0
  12. package/dist/adapters/wecom/adapter.d.ts.map +1 -0
  13. package/dist/adapters/wecom/adapter.js +202 -0
  14. package/dist/adapters/wecom/adapter.js.map +1 -0
  15. package/dist/adapters/wecom/client.d.ts +13 -0
  16. package/dist/adapters/wecom/client.d.ts.map +1 -0
  17. package/dist/adapters/wecom/client.js +116 -0
  18. package/dist/adapters/wecom/client.js.map +1 -0
  19. package/dist/adapters/wecom/crypto.d.ts +14 -0
  20. package/dist/adapters/wecom/crypto.d.ts.map +1 -0
  21. package/dist/adapters/wecom/crypto.js +37 -0
  22. package/dist/adapters/wecom/crypto.js.map +1 -0
  23. package/dist/adapters/wecom/errors.d.ts +25 -0
  24. package/dist/adapters/wecom/errors.d.ts.map +1 -0
  25. package/dist/adapters/wecom/errors.js +56 -0
  26. package/dist/adapters/wecom/errors.js.map +1 -0
  27. package/dist/adapters/wecom/types.d.ts +52 -0
  28. package/dist/adapters/wecom/types.d.ts.map +1 -0
  29. package/dist/adapters/wecom/types.js +2 -0
  30. package/dist/adapters/wecom/types.js.map +1 -0
  31. package/dist/adapters/wecom/xml.d.ts +4 -0
  32. package/dist/adapters/wecom/xml.d.ts.map +1 -0
  33. package/dist/adapters/wecom/xml.js +16 -0
  34. package/dist/adapters/wecom/xml.js.map +1 -0
  35. package/dist/adapters/wecom.d.ts +4 -0
  36. package/dist/adapters/wecom.d.ts.map +1 -0
  37. package/dist/adapters/wecom.js +3 -0
  38. package/dist/adapters/wecom.js.map +1 -0
  39. package/dist/bridge-provider.d.ts +3 -0
  40. package/dist/bridge-provider.d.ts.map +1 -0
  41. package/dist/bridge-provider.js +79 -0
  42. package/dist/bridge-provider.js.map +1 -0
  43. package/dist/bridge.d.ts +26 -0
  44. package/dist/bridge.d.ts.map +1 -0
  45. package/dist/bridge.js +406 -0
  46. package/dist/bridge.js.map +1 -0
  47. package/dist/config.d.ts +4 -0
  48. package/dist/config.d.ts.map +1 -0
  49. package/dist/config.js +141 -0
  50. package/dist/config.js.map +1 -0
  51. package/dist/http.d.ts +11 -0
  52. package/dist/http.d.ts.map +1 -0
  53. package/dist/http.js +39 -0
  54. package/dist/http.js.map +1 -0
  55. package/dist/index.d.ts +3 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +368 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/registry.d.ts +35 -0
  60. package/dist/registry.d.ts.map +1 -0
  61. package/dist/registry.js +175 -0
  62. package/dist/registry.js.map +1 -0
  63. package/dist/types.d.ts +125 -0
  64. package/dist/types.d.ts.map +1 -0
  65. package/dist/types.js +2 -0
  66. package/dist/types.js.map +1 -0
  67. package/package.json +64 -0
  68. package/preview.png +0 -0
@@ -0,0 +1,429 @@
1
+ import { createServer } from 'node:http';
2
+ import * as lark from '@larksuiteoapi/node-sdk';
3
+ function asConfig(config) {
4
+ return config;
5
+ }
6
+ function requireString(value, name) {
7
+ if (typeof value === 'string' && value.trim())
8
+ return value;
9
+ throw new Error(`Feishu adapter requires ${name}`);
10
+ }
11
+ function optionalNonEmptyString(value) {
12
+ return typeof value === 'string' && value.trim() ? value : undefined;
13
+ }
14
+ function parseTextContent(content) {
15
+ try {
16
+ const parsed = JSON.parse(content);
17
+ return { text: typeof parsed.text === 'string' ? parsed.text : '' };
18
+ }
19
+ catch {
20
+ return { text: content };
21
+ }
22
+ }
23
+ function normalizeFeishuIncomingText(text, mentions, cfg, mentionedBot) {
24
+ let cleaned = text.replace(/\u00a0/g, ' ').trim();
25
+ cleaned = cleaned.replace(/^回复\s+[^::]{1,80}[::]\s*/u, '').trim();
26
+ if (mentions?.length) {
27
+ const botMentions = mentions.filter((mention) => isBotMention(mention, cfg));
28
+ const leadingMentions = botMentions.length > 0 ? botMentions : mentionedBot ? mentions : [];
29
+ cleaned = stripLeadingMentionTokens(cleaned, mentionTokens(leadingMentions));
30
+ }
31
+ if (mentionedBot) {
32
+ cleaned = cleaned.replace(/^@[\p{L}\p{N}_\-.·]+(?:\s+|$)/u, '').trim();
33
+ }
34
+ return cleaned;
35
+ }
36
+ function isBotMention(mention, cfg) {
37
+ if (mention.isBot)
38
+ return true;
39
+ const botOpenId = optionalNonEmptyString(cfg.botOpenId);
40
+ if (!botOpenId)
41
+ return false;
42
+ return (mention.openId === botOpenId ||
43
+ mention.userId === botOpenId ||
44
+ mention.id?.open_id === botOpenId ||
45
+ mention.id?.user_id === botOpenId ||
46
+ mention.id?.union_id === botOpenId);
47
+ }
48
+ function mentionTokens(mentions) {
49
+ const tokens = new Set();
50
+ for (const mention of mentions) {
51
+ if (mention.key?.trim())
52
+ tokens.add(mention.key.trim());
53
+ if (mention.name?.trim())
54
+ tokens.add(`@${mention.name.trim()}`);
55
+ }
56
+ return [...tokens].sort((a, b) => b.length - a.length);
57
+ }
58
+ function stripLeadingMentionTokens(text, tokens) {
59
+ let cleaned = text.trimStart();
60
+ for (let i = 0; i < 8; i++) {
61
+ const next = stripOneLeadingMentionToken(cleaned, tokens);
62
+ if (next === cleaned)
63
+ break;
64
+ cleaned = next.trimStart();
65
+ }
66
+ return cleaned.trim();
67
+ }
68
+ function stripOneLeadingMentionToken(text, tokens) {
69
+ for (const token of tokens) {
70
+ if (text === token)
71
+ return '';
72
+ if (text.startsWith(token) && /\s/u.test(text[token.length] ?? '')) {
73
+ return text.slice(token.length);
74
+ }
75
+ }
76
+ return text;
77
+ }
78
+ function resolveReceiveId(message, defaultType) {
79
+ const match = message.recipient.match(/^(chat_id|open_id|user_id|union_id|email):(.+)$/);
80
+ if (!match)
81
+ return { receiveIdType: defaultType, receiveId: message.recipient };
82
+ return { receiveIdType: match[1], receiveId: match[2] };
83
+ }
84
+ function resolveDomain(value) {
85
+ if (!value)
86
+ return undefined;
87
+ if (value === 'feishu')
88
+ return lark.Domain.Feishu;
89
+ if (value === 'lark')
90
+ return lark.Domain.Lark;
91
+ if (typeof value === 'string')
92
+ return value;
93
+ return undefined;
94
+ }
95
+ function resolveAppType(value) {
96
+ if (value === 'isv' || value === 'ISV')
97
+ return lark.AppType.ISV;
98
+ if (value === 'self_build' || value === 'selfBuild' || value === 'SelfBuild') {
99
+ return lark.AppType.SelfBuild;
100
+ }
101
+ return undefined;
102
+ }
103
+ function resolveLoggerLevel(value) {
104
+ if (value === 'debug')
105
+ return lark.LoggerLevel.debug;
106
+ if (value === 'info')
107
+ return lark.LoggerLevel.info;
108
+ if (value === 'warn')
109
+ return lark.LoggerLevel.warn;
110
+ if (value === 'trace')
111
+ return lark.LoggerLevel.trace;
112
+ return lark.LoggerLevel.error;
113
+ }
114
+ function createSdkLogger(log) {
115
+ const emit = (level, msg) => {
116
+ log?.('feishu-sdk', { message: msg.map(String).join(' ') }, level);
117
+ };
118
+ return {
119
+ error: (...msg) => emit('ERROR', msg),
120
+ warn: (...msg) => emit('WARN', msg),
121
+ info: (...msg) => emit('INFO', msg),
122
+ debug: (...msg) => emit('DEBUG', msg),
123
+ trace: (...msg) => emit('TRACE', msg),
124
+ };
125
+ }
126
+ function shouldAcceptMessage(msg, cfg) {
127
+ const allowedChatIds = cfg.allowedChatIds;
128
+ if (Array.isArray(allowedChatIds) &&
129
+ allowedChatIds.length > 0 &&
130
+ !allowedChatIds.includes(msg.chatId)) {
131
+ return false;
132
+ }
133
+ const allowedSenderIds = cfg.allowedSenderIds;
134
+ if (Array.isArray(allowedSenderIds) &&
135
+ allowedSenderIds.length > 0 &&
136
+ !allowedSenderIds.includes(msg.senderId)) {
137
+ return false;
138
+ }
139
+ if ((cfg.respondToMentionsOnly ?? true) && msg.chatType === 'group' && !msg.mentionedBot) {
140
+ return false;
141
+ }
142
+ return true;
143
+ }
144
+ function senderForMessage(chatId, threadId) {
145
+ return threadId ? `${chatId}:${threadId}` : chatId;
146
+ }
147
+ function objectStringField(value, key) {
148
+ if (!value || typeof value !== 'object')
149
+ return undefined;
150
+ const field = value[key];
151
+ return typeof field === 'string' && field.trim() ? field : undefined;
152
+ }
153
+ function ackReactionEmoji(cfg) {
154
+ if (cfg.ackReactionEmoji === false)
155
+ return null;
156
+ return optionalNonEmptyString(cfg.ackReactionEmoji) ?? 'OK';
157
+ }
158
+ export function createFeishuAdapter(config, context = {}) {
159
+ const cfg = asConfig(config);
160
+ const appId = requireString(cfg.appId, 'appId');
161
+ const appSecret = requireString(cfg.appSecret, 'appSecret');
162
+ const defaultReceiveIdType = cfg.receiveIdType ?? 'chat_id';
163
+ const eventMode = resolveEventMode(cfg);
164
+ const logger = createSdkLogger(context.log);
165
+ const loggerLevel = resolveLoggerLevel(cfg.loggerLevel);
166
+ const domain = resolveDomain(cfg.domain);
167
+ const appType = resolveAppType(cfg.appType);
168
+ const client = new lark.Client({
169
+ appId,
170
+ appSecret,
171
+ logger,
172
+ loggerLevel,
173
+ source: 'amaster-pi-channels',
174
+ ...(domain !== undefined ? { domain } : {}),
175
+ ...(appType !== undefined ? { appType } : {}),
176
+ });
177
+ let channel = null;
178
+ let server = null;
179
+ async function resolveChatName(chatId) {
180
+ const chatApi = client.im.chat;
181
+ if (!chatApi?.get)
182
+ return undefined;
183
+ try {
184
+ const response = await chatApi.get({ path: { chat_id: chatId } });
185
+ const code = response.code;
186
+ if (code !== undefined && code !== 0)
187
+ return undefined;
188
+ const data = response.data;
189
+ const chat = data && typeof data === 'object' ? data.chat : undefined;
190
+ return (objectStringField(data, 'name') ??
191
+ objectStringField(chat, 'name') ??
192
+ objectStringField(data, 'chat_name') ??
193
+ objectStringField(chat, 'chat_name'));
194
+ }
195
+ catch (error) {
196
+ context.log?.('feishu-chat-name-fetch-failed', { chatId, error: error instanceof Error ? error.message : String(error) }, 'WARN');
197
+ return undefined;
198
+ }
199
+ }
200
+ async function addAckReaction(messageId) {
201
+ const emojiType = ackReactionEmoji(cfg);
202
+ if (!emojiType)
203
+ return;
204
+ try {
205
+ const response = (await client.request({
206
+ url: `/open-apis/im/v1/messages/${encodeURIComponent(messageId)}/reactions`,
207
+ method: 'POST',
208
+ data: {
209
+ reaction_type: {
210
+ emoji_type: emojiType,
211
+ },
212
+ },
213
+ }));
214
+ const body = response.data;
215
+ if (body?.code !== undefined && body.code !== 0) {
216
+ context.log?.('feishu-ack-reaction-failed', { messageId, emojiType, code: body.code, msg: body.msg }, 'WARN');
217
+ }
218
+ }
219
+ catch (error) {
220
+ context.log?.('feishu-ack-reaction-failed', { messageId, emojiType, error: error instanceof Error ? error.message : String(error) }, 'WARN');
221
+ }
222
+ }
223
+ async function sendText(message) {
224
+ if (!message.text)
225
+ throw new Error('Feishu adapter requires text');
226
+ const text = message.source ? `[${message.source}]\n${message.text}` : message.text;
227
+ const replyToMessageId = typeof message.metadata?.messageId === 'string'
228
+ ? message.metadata.messageId
229
+ : typeof message.metadata?.replyToMessageId === 'string'
230
+ ? message.metadata.replyToMessageId
231
+ : undefined;
232
+ if (replyToMessageId) {
233
+ const response = await client.im.message.reply({
234
+ path: { message_id: replyToMessageId },
235
+ data: {
236
+ msg_type: 'text',
237
+ content: JSON.stringify({ text }),
238
+ reply_in_thread: cfg.replyInThread ?? Boolean(message.metadata?.threadId),
239
+ },
240
+ });
241
+ if (response.code !== 0) {
242
+ throw new Error(`Feishu reply error: ${response.msg ?? response.code ?? 'unknown'}`);
243
+ }
244
+ return;
245
+ }
246
+ const { receiveIdType, receiveId } = resolveReceiveId(message, defaultReceiveIdType);
247
+ const response = await client.im.message.create({
248
+ params: { receive_id_type: receiveIdType },
249
+ data: {
250
+ receive_id: receiveId,
251
+ msg_type: 'text',
252
+ content: JSON.stringify({ text }),
253
+ },
254
+ });
255
+ if (response.code !== 0) {
256
+ throw new Error(`Feishu send error: ${response.msg ?? response.code ?? 'unknown'}`);
257
+ }
258
+ }
259
+ async function handleNormalizedMessage(msg, onMessage) {
260
+ if (!shouldAcceptMessage({
261
+ chatId: msg.chatId,
262
+ senderId: msg.senderId,
263
+ chatType: msg.chatType,
264
+ mentionedBot: msg.mentionedBot,
265
+ }, cfg)) {
266
+ return;
267
+ }
268
+ if (msg.rawContentType !== 'text' && msg.rawContentType !== 'post')
269
+ return;
270
+ const text = normalizeFeishuIncomingText(msg.content, msg.mentions, cfg, msg.mentionedBot);
271
+ if (!text)
272
+ return;
273
+ void addAckReaction(msg.messageId);
274
+ const chatName = await resolveChatName(msg.chatId);
275
+ void onMessage({
276
+ adapter: 'feishu',
277
+ sender: senderForMessage(msg.chatId, msg.threadId),
278
+ text,
279
+ metadata: {
280
+ messageId: msg.messageId,
281
+ chatId: msg.chatId,
282
+ ...(chatName ? { chatName } : {}),
283
+ chatType: msg.chatType,
284
+ senderId: msg.senderId,
285
+ senderName: msg.senderName,
286
+ threadId: msg.threadId,
287
+ rootId: msg.rootId,
288
+ replyToMessageId: msg.replyToMessageId,
289
+ messageIdForReply: msg.messageId,
290
+ rawContentType: msg.rawContentType,
291
+ },
292
+ });
293
+ }
294
+ function handleRawMessage(data, onMessage) {
295
+ if (data.message.message_type !== 'text')
296
+ return;
297
+ const parsed = parseTextContent(data.message.content);
298
+ const senderId = data.sender.sender_id?.open_id ??
299
+ data.sender.sender_id?.user_id ??
300
+ data.sender.sender_id?.union_id ??
301
+ '';
302
+ const mentionedBot = !cfg.botOpenId ||
303
+ (data.message.mentions ?? []).some((mention) => mention.id.open_id === cfg.botOpenId ||
304
+ mention.id.user_id === cfg.botOpenId ||
305
+ mention.id.union_id === cfg.botOpenId);
306
+ if (!shouldAcceptMessage({
307
+ chatId: data.message.chat_id,
308
+ senderId,
309
+ chatType: data.message.chat_type,
310
+ mentionedBot,
311
+ }, cfg)) {
312
+ return;
313
+ }
314
+ const text = normalizeFeishuIncomingText(parsed.text, data.message.mentions, cfg, mentionedBot);
315
+ if (!text)
316
+ return;
317
+ void addAckReaction(data.message.message_id);
318
+ void onMessage({
319
+ adapter: 'feishu',
320
+ sender: senderForMessage(data.message.chat_id, data.message.thread_id),
321
+ text,
322
+ metadata: {
323
+ eventId: data.event_id,
324
+ tenantKey: data.tenant_key,
325
+ messageId: data.message.message_id,
326
+ replyToMessageId: data.message.message_id,
327
+ chatId: data.message.chat_id,
328
+ chatType: data.message.chat_type,
329
+ threadId: data.message.thread_id,
330
+ rootId: data.message.root_id,
331
+ senderId: data.sender.sender_id,
332
+ },
333
+ });
334
+ }
335
+ async function start(onMessage) {
336
+ if (eventMode === 'off')
337
+ return;
338
+ if (eventMode === 'websocket') {
339
+ if (channel)
340
+ return;
341
+ channel = lark.createLarkChannel({
342
+ appId,
343
+ appSecret,
344
+ transport: 'websocket',
345
+ logger,
346
+ loggerLevel,
347
+ source: 'amaster-pi-channels',
348
+ includeRawEvent: true,
349
+ ...(domain !== undefined ? { domain } : {}),
350
+ policy: {
351
+ requireMention: cfg.respondToMentionsOnly ?? true,
352
+ respondToMentionAll: cfg.respondToMentionAll ?? false,
353
+ ...(Array.isArray(cfg.allowedChatIds) && cfg.allowedChatIds.length > 0
354
+ ? { groupAllowlist: cfg.allowedChatIds }
355
+ : {}),
356
+ ...(cfg.dmMode ? { dmMode: cfg.dmMode } : {}),
357
+ ...(Array.isArray(cfg.dmAllowlist) && cfg.dmAllowlist.length > 0
358
+ ? { dmAllowlist: cfg.dmAllowlist }
359
+ : {}),
360
+ },
361
+ ...(cfg.handshakeTimeoutMs ? { handshakeTimeoutMs: cfg.handshakeTimeoutMs } : {}),
362
+ ...(cfg.wsPingTimeoutSeconds
363
+ ? { wsConfig: { pingTimeout: cfg.wsPingTimeoutSeconds } }
364
+ : {}),
365
+ });
366
+ channel.on('message', (msg) => {
367
+ void handleNormalizedMessage(msg, onMessage);
368
+ });
369
+ channel.on('error', (error) => {
370
+ context.log?.('feishu-channel-error', { error: error.message, code: error.code }, 'ERROR');
371
+ });
372
+ await channel.connect();
373
+ return;
374
+ }
375
+ if (server)
376
+ return;
377
+ const incoming = cfg.incoming ?? {};
378
+ const host = incoming.host ?? '0.0.0.0';
379
+ const port = incoming.port ?? 8787;
380
+ const path = incoming.path ?? '/feishu/events';
381
+ const dispatcher = new lark.EventDispatcher({
382
+ logger,
383
+ loggerLevel,
384
+ ...(optionalNonEmptyString(cfg.verificationToken)
385
+ ? { verificationToken: cfg.verificationToken }
386
+ : {}),
387
+ ...(optionalNonEmptyString(cfg.encryptKey) ? { encryptKey: cfg.encryptKey } : {}),
388
+ }).register({
389
+ 'im.message.receive_v1': async (data) => {
390
+ handleRawMessage(data, onMessage);
391
+ },
392
+ });
393
+ const handler = lark.adaptDefault(path, dispatcher, { autoChallenge: true });
394
+ server = createServer((request, response) => {
395
+ void handler(request, response);
396
+ });
397
+ await new Promise((resolve, reject) => {
398
+ server.once('error', reject);
399
+ server.listen(port, host, () => {
400
+ server.off('error', reject);
401
+ resolve();
402
+ });
403
+ });
404
+ }
405
+ return {
406
+ direction: eventMode === 'off' ? 'outgoing' : 'bidirectional',
407
+ send: sendText,
408
+ start,
409
+ async stop() {
410
+ if (channel) {
411
+ await channel.disconnect();
412
+ channel = null;
413
+ }
414
+ if (server) {
415
+ await new Promise((resolve) => server.close(() => resolve()));
416
+ server = null;
417
+ }
418
+ },
419
+ };
420
+ }
421
+ function resolveEventMode(cfg) {
422
+ if (cfg.eventMode === 'http' || cfg.eventMode === 'websocket' || cfg.eventMode === 'off') {
423
+ return cfg.eventMode;
424
+ }
425
+ if (cfg.incoming?.enabled)
426
+ return 'http';
427
+ return 'websocket';
428
+ }
429
+ //# sourceMappingURL=feishu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feishu.js","sourceRoot":"","sources":["../../src/adapters/feishu.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { AdapterConfig, ChannelAdapter } from '../types.js';
2
+ export declare function createWebhookAdapter(config: AdapterConfig): ChannelAdapter;
3
+ //# sourceMappingURL=webhook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/adapters/webhook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EAGf,MAAM,aAAa,CAAC;AAErB,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,cAAc,CAkE1E"}
@@ -0,0 +1,63 @@
1
+ export function createWebhookAdapter(config) {
2
+ const defaultMethod = typeof config.method === 'string' ? config.method : 'POST';
3
+ const defaultContentType = typeof config.contentType === 'string' ? config.contentType : 'application/json';
4
+ const defaultPayloadMode = config.payloadMode === 'raw' ? 'raw' : 'envelope';
5
+ const configuredHeaders = config.headers && typeof config.headers === 'object' && !Array.isArray(config.headers)
6
+ ? config.headers
7
+ : {};
8
+ const secret = typeof config.secret === 'string' ? config.secret : undefined;
9
+ const headers = { ...configuredHeaders };
10
+ const hasAuthorization = Object.keys(headers).some((key) => key.toLowerCase() === 'authorization');
11
+ if (secret && !hasAuthorization)
12
+ headers.Authorization = `Bearer ${secret}`;
13
+ return {
14
+ direction: 'outgoing',
15
+ async send(message) {
16
+ const payloadMode = message.payloadMode ?? defaultPayloadMode;
17
+ const method = payloadMode === 'raw' ? (message.webhook?.method ?? defaultMethod) : defaultMethod;
18
+ const contentType = payloadMode === 'raw'
19
+ ? (message.webhook?.contentType ?? defaultContentType)
20
+ : defaultContentType;
21
+ const normalizedMethod = method.toUpperCase();
22
+ const canHaveBody = normalizedMethod !== 'GET' && normalizedMethod !== 'HEAD';
23
+ let body;
24
+ if (payloadMode === 'raw') {
25
+ if (canHaveBody) {
26
+ if (message.rawBody === undefined) {
27
+ throw new Error(`Webhook raw payload requires rawBody for ${normalizedMethod}`);
28
+ }
29
+ body =
30
+ typeof message.rawBody === 'string' ? message.rawBody : JSON.stringify(message.rawBody);
31
+ }
32
+ else if (message.rawBody !== undefined) {
33
+ throw new Error(`${normalizedMethod} webhook requests cannot include a body`);
34
+ }
35
+ }
36
+ else if (canHaveBody) {
37
+ body = JSON.stringify({
38
+ text: message.text ?? '',
39
+ source: message.source,
40
+ metadata: message.metadata,
41
+ timestamp: new Date().toISOString(),
42
+ });
43
+ }
44
+ const requestHeaders = {};
45
+ for (const [key, value] of Object.entries(headers)) {
46
+ if (key.toLowerCase() !== 'content-type')
47
+ requestHeaders[key] = value;
48
+ }
49
+ if (body !== undefined)
50
+ requestHeaders['Content-Type'] = contentType;
51
+ const response = await fetch(message.recipient, {
52
+ method,
53
+ headers: requestHeaders,
54
+ ...(body === undefined ? {} : { body }),
55
+ });
56
+ if (!response.ok) {
57
+ const text = await response.text().catch(() => '');
58
+ throw new Error(`Webhook error ${response.status}: ${text || response.statusText}`);
59
+ }
60
+ },
61
+ };
62
+ }
63
+ //# sourceMappingURL=webhook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/adapters/webhook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { AdapterConfig, ChannelAdapter } from '../../types.js';
2
+ export declare function createWeComAdapter(config: AdapterConfig): ChannelAdapter;
3
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/wecom/adapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EAIf,MAAM,gBAAgB,CAAC;AAoHxB,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,cAAc,CAmHxE"}