@satorijs/adapter-lark 2.1.1 → 2.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.
package/lib/index.js CHANGED
@@ -4,6 +4,7 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
5
  var __getProtoOf = Object.getPrototypeOf;
6
6
  var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
7
8
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
8
9
  var __export = (target, all) => {
9
10
  for (var name in all)
@@ -26,6 +27,10 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
27
  mod
27
28
  ));
28
29
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
+ var __publicField = (obj, key, value) => {
31
+ __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
32
+ return value;
33
+ };
29
34
 
30
35
  // satori/adapters/lark/src/index.ts
31
36
  var src_exports = {};
@@ -105,7 +110,6 @@ function adaptMessage(bot, data, session) {
105
110
  __name(adaptMessage, "adaptMessage");
106
111
  function adaptSession(bot, body) {
107
112
  const session = bot.session();
108
- session.selfId = bot.selfId;
109
113
  const internal = Object.create(bot.internal);
110
114
  Object.assign(internal, body);
111
115
  (0, import_satori.defineProperty)(session, "feishu", internal);
@@ -116,6 +120,7 @@ function adaptSession(bot, body) {
116
120
  session.subtype = body.event.message.chat_type;
117
121
  if (session.subtype === "p2p")
118
122
  session.subtype = "private";
123
+ session.isDirect = session.subtype === "private";
119
124
  adaptSender(body.event.sender, session);
120
125
  adaptMessage(bot, body.event, session);
121
126
  break;
@@ -135,7 +140,9 @@ function extractIdType(id) {
135
140
  return "user_id";
136
141
  }
137
142
  __name(extractIdType, "extractIdType");
138
- var Cipher = class {
143
+ var _Cipher = class _Cipher {
144
+ encryptKey;
145
+ key;
139
146
  constructor(key) {
140
147
  this.encryptKey = key;
141
148
  const hash = import_crypto.default.createHash("sha256");
@@ -155,15 +162,13 @@ var Cipher = class {
155
162
  return sign;
156
163
  }
157
164
  };
158
- __name(Cipher, "Cipher");
165
+ __name(_Cipher, "Cipher");
166
+ var Cipher = _Cipher;
159
167
 
160
168
  // satori/adapters/lark/src/http.ts
161
169
  var logger = new import_satori2.Logger("lark");
162
- var HttpServer = class extends import_satori2.Adapter.Server {
163
- constructor() {
164
- super(...arguments);
165
- this.ciphers = {};
166
- }
170
+ var _HttpServer = class _HttpServer extends import_satori2.Adapter.Server {
171
+ ciphers = {};
167
172
  fork(ctx, bot) {
168
173
  super.fork(ctx, bot);
169
174
  this._refreshCipher();
@@ -273,7 +278,8 @@ var HttpServer = class extends import_satori2.Adapter.Server {
273
278
  }
274
279
  }
275
280
  };
276
- __name(HttpServer, "HttpServer");
281
+ __name(_HttpServer, "HttpServer");
282
+ var HttpServer = _HttpServer;
277
283
  ((HttpServer2) => {
278
284
  HttpServer2.createConfig = /* @__PURE__ */ __name((path) => import_satori2.Schema.object({
279
285
  path: import_satori2.Schema.string().role("url").description("要连接的服务器地址。").default(path),
@@ -287,11 +293,12 @@ __name(HttpServer, "HttpServer");
287
293
  var import_fs = require("fs");
288
294
  var import_satori3 = require("@satorijs/satori");
289
295
  var import_form_data = __toESM(require("form-data"));
290
- var LarkMessageEncoder = class extends import_satori3.MessageEncoder {
291
- constructor() {
292
- super(...arguments);
293
- this.content = "";
294
- }
296
+ var _LarkMessageEncoder = class _LarkMessageEncoder extends import_satori3.MessageEncoder {
297
+ quote;
298
+ content = "";
299
+ addition;
300
+ // TODO: currently not used, would be supported in the future
301
+ richText;
295
302
  async post(data) {
296
303
  var _a, _b, _c, _d, _e;
297
304
  try {
@@ -311,7 +318,7 @@ var LarkMessageEncoder = class extends import_satori3.MessageEncoder {
311
318
  } catch (e) {
312
319
  if (import_satori3.Quester.isAxiosError(e)) {
313
320
  if ((_d = (_c = e.response) == null ? void 0 : _c.data) == null ? void 0 : _d.code) {
314
- const generalErrorMsg = `Check error code at https://open.larksuite.com/document/ukTMukTMukTM/ugjM14COyUjL4ITN`;
321
+ const generalErrorMsg = `Check error code at https://open.larksuite.com/document/server-docs/getting-started/server-error-codes`;
315
322
  e.message += ` (Lark error code ${e.response.data.code}: ${(_e = e.response.data.msg) != null ? _e : generalErrorMsg})`;
316
323
  }
317
324
  }
@@ -436,7 +443,8 @@ var LarkMessageEncoder = class extends import_satori3.MessageEncoder {
436
443
  }
437
444
  }
438
445
  };
439
- __name(LarkMessageEncoder, "LarkMessageEncoder");
446
+ __name(_LarkMessageEncoder, "LarkMessageEncoder");
447
+ var LarkMessageEncoder = _LarkMessageEncoder;
440
448
 
441
449
  // satori/adapters/lark/src/types/index.ts
442
450
  var types_exports = {};
@@ -448,7 +456,7 @@ __export(types_exports, {
448
456
  var import_form_data2 = __toESM(require("form-data"));
449
457
  var import_satori4 = require("@satorijs/satori");
450
458
  var logger2 = new import_satori4.Logger("lark");
451
- var Internal = class {
459
+ var _Internal = class _Internal {
452
460
  constructor(http) {
453
461
  this.http = http;
454
462
  }
@@ -466,7 +474,7 @@ var Internal = class {
466
474
  for (const key in routes[path]) {
467
475
  const method = key;
468
476
  for (const name of (0, import_satori4.makeArray)(routes[path][method])) {
469
- Internal.prototype[name] = async function(...args) {
477
+ _Internal.prototype[name] = async function(...args) {
470
478
  const raw = args.join(", ");
471
479
  const url = path.replace(/\{([^}]+)\}/g, () => {
472
480
  if (!args.length)
@@ -496,7 +504,8 @@ var Internal = class {
496
504
  }
497
505
  }
498
506
  };
499
- __name(Internal, "Internal");
507
+ __name(_Internal, "Internal");
508
+ var Internal = _Internal;
500
509
 
501
510
  // satori/adapters/lark/src/types/auth.ts
502
511
  Internal.define({
@@ -551,12 +560,18 @@ Internal.define({
551
560
 
552
561
  // satori/adapters/lark/src/bot.ts
553
562
  var logger3 = new import_satori5.Logger("lark");
554
- var LarkBot = class extends import_satori5.Bot {
563
+ var _LarkBot = class _LarkBot extends import_satori5.Bot {
564
+ _token;
565
+ _refresher;
566
+ http;
567
+ assetsQuester;
568
+ internal;
555
569
  constructor(ctx, config) {
556
570
  super(ctx, config);
557
571
  if (!config.selfUrl && !ctx.root.config.selfUrl) {
558
572
  logger3.warn("selfUrl is not set, some features may not work");
559
573
  }
574
+ this.platform = "lark";
560
575
  this.selfId = config.appId;
561
576
  this.http = ctx.http.extend({
562
577
  endpoint: config.endpoint,
@@ -601,8 +616,9 @@ var LarkBot = class extends import_satori5.Bot {
601
616
  await this.internal.deleteMessage(messageId);
602
617
  }
603
618
  };
604
- __name(LarkBot, "LarkBot");
605
- LarkBot.MessageEncoder = LarkMessageEncoder;
619
+ __name(_LarkBot, "LarkBot");
620
+ __publicField(_LarkBot, "MessageEncoder", LarkMessageEncoder);
621
+ var LarkBot = _LarkBot;
606
622
  ((LarkBot2) => {
607
623
  LarkBot2.Config = import_satori5.Schema.intersect([
608
624
  import_satori5.Schema.object({
package/lib/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../src/bot.ts", "../src/http.ts", "../src/utils.ts", "../src/message.ts", "../src/types/index.ts", "../src/types/internal.ts", "../src/types/auth.ts", "../src/types/guild.ts", "../src/types/message/asset.ts", "../src/types/message/index.ts"],
4
- "sourcesContent": ["import { FeishuBot } from './bot'\nimport * as Lark from './types'\n\nexport * from './bot'\n\nexport { Lark, Lark as Feishu }\n\nexport default FeishuBot\n\ndeclare module '@satorijs/core' {\n interface Session {\n feishu: Lark.Internal\n lark: Lark.Internal\n }\n}\n", "import { Bot, Context, h, Logger, Quester, Schema } from '@satorijs/satori'\n\nimport { HttpServer } from './http'\nimport { LarkMessageEncoder } from './message'\nimport { Internal } from './types'\n\nconst logger = new Logger('lark')\n\nexport class LarkBot extends Bot<LarkBot.Config> {\n static MessageEncoder = LarkMessageEncoder\n\n _token?: string\n _refresher?: NodeJS.Timeout\n http: Quester\n assetsQuester: Quester\n internal: Internal\n\n constructor(ctx: Context, config: LarkBot.Config) {\n super(ctx, config)\n\n // lark bot needs config.selfUrl to be set as it should be serve on a public url\n if (!config.selfUrl && !ctx.root.config.selfUrl) {\n logger.warn('selfUrl is not set, some features may not work')\n }\n\n this.selfId = config.appId\n\n this.http = ctx.http.extend({\n endpoint: config.endpoint,\n headers: {\n 'Content-Type': 'application/json; charset=utf-8',\n },\n })\n this.assetsQuester = Quester.create()\n\n this.internal = new Internal(this.http)\n\n ctx.plugin(HttpServer, this)\n }\n\n async initialize() {\n await this.refreshToken()\n this.online()\n }\n\n private async refreshToken() {\n const { tenant_access_token: token } = await this.internal.getTenantAccessToken({\n app_id: this.config.appId,\n app_secret: this.config.appSecret,\n })\n logger.debug('refreshed token %s', token)\n this.token = token\n // Token would be expired in 2 hours, refresh it every 1 hour\n // see https://open.larksuite.com/document/ukTMukTMukTM/ukDNz4SO0MjL5QzM/auth-v3/auth/tenant_access_token_internal\n if (this._refresher) clearTimeout(this._refresher)\n this._refresher = setTimeout(() => this.refreshToken(), 3600 * 1000)\n this.online()\n }\n\n get token() {\n return this._token\n }\n\n set token(v: string) {\n this._token = v\n this.http.config.headers.Authorization = `Bearer ${v}`\n }\n\n async editMessage(channelId: string, messageId: string, content: h.Fragment) {\n await this.internal.updateMessage(messageId, {\n content: h.normalize(content).join(''),\n msg_type: 'text',\n })\n }\n\n async deleteMessage(channelId: string, messageId: string) {\n await this.internal.deleteMessage(messageId)\n }\n}\n\nexport namespace LarkBot {\n export interface Config extends Bot.Config, HttpServer.Config, Quester.Config {\n appId: string\n appSecret: string\n encryptKey?: string\n verificationToken?: string\n }\n\n export const Config: Schema<Config> = Schema.intersect([\n Schema.object({\n platform: Schema.union(['feishu', 'lark']).required().description('平台名称。'),\n appId: Schema.string().required().description('机器人的应用 ID。'),\n appSecret: Schema.string().role('secret').required().description('机器人的应用密钥。'),\n encryptKey: Schema.string().role('secret').description('机器人的 Encrypt Key。'),\n verificationToken: Schema.string().description('事件推送的验证令牌。'),\n }),\n Schema.union([\n Schema.intersect([\n Schema.object({\n platform: Schema.const('feishu').required(),\n }),\n Quester.createConfig('https://open.feishu.cn/open-apis/'),\n HttpServer.createConfig('/feishu'),\n ]),\n Schema.intersect([\n Schema.object({\n platform: Schema.const('lark').required(),\n }),\n Quester.createConfig('https://open.larksuite.com/open-apis/'),\n HttpServer.createConfig('/lark'),\n ]),\n ]),\n ])\n}\n\nexport { LarkBot as FeishuBot }\n", "import internal from 'stream'\n\nimport { Adapter, Context, Logger, Schema } from '@satorijs/satori'\n\nimport { FeishuBot } from './bot'\nimport { AllEvents } from './types'\nimport { adaptSession, Cipher } from './utils'\n\nconst logger = new Logger('lark')\n\nexport class HttpServer extends Adapter.Server<FeishuBot> {\n private ciphers: Record<string, Cipher> = {}\n\n fork(ctx: Context, bot: FeishuBot) {\n super.fork(ctx, bot)\n\n this._refreshCipher()\n return bot.initialize()\n }\n\n async start(bot: FeishuBot) {\n const { path } = bot.config\n bot.ctx.router.post(path, (ctx) => {\n this._refreshCipher()\n\n // compare signature if encryptKey is set\n // But not every message contains signature\n // https://open.larksuite.com/document/ukTMukTMukTM/uYDNxYjL2QTM24iN0EjN/event-subscription-configure-/encrypt-key-encryption-configuration-case#d41e8916\n const signature = ctx.get('X-Lark-Signature')\n const enabledSignatureVerify = this.bots.filter((bot) => bot.config.verifySignature)\n if (signature && enabledSignatureVerify.length) {\n const result = enabledSignatureVerify.some((bot) => {\n const timestamp = ctx.get('X-Lark-Request-Timestamp')\n const nonce = ctx.get('X-Lark-Request-Nonce')\n const body = ctx.request.rawBody\n const actualSignature = this.ciphers[bot.config.appId]?.calculateSignature(timestamp, nonce, body)\n if (actualSignature === signature) return true\n else return false\n })\n if (!result) return (ctx.status = 403)\n }\n\n // try to decrypt message first if encryptKey is set\n const body = this._tryDecryptBody(ctx.request.body)\n // respond challenge message\n // https://open.larksuite.com/document/ukTMukTMukTM/uYDNxYjL2QTM24iN0EjN/event-subscription-configure-/request-url-configuration-case\n if (body?.type === 'url_verification' && body?.challenge && typeof body.challenge === 'string') {\n ctx.response.body = { challenge: body.challenge }\n return\n }\n\n // compare verification token\n const enabledVerifyTokenVerify = this.bots.filter((bot) => bot.config.verifyToken && bot.config.verificationToken)\n if (enabledVerifyTokenVerify.length) {\n const token = ctx.request.body?.token\n // only compare token if token exists\n if (token) {\n const result = enabledVerifyTokenVerify.some((bot) => {\n if (token === bot.config.verificationToken) return true\n else return false\n })\n if (!result) return (ctx.status = 403)\n }\n }\n\n // dispatch message\n logger.debug('received decryped event: %o', body)\n this.dispatchSession(body)\n\n // Lark requires 200 OK response to make sure event is received\n return ctx.status = 200\n })\n\n bot.ctx.router.get(path + '/assets/:type/:message_id/:key', async (ctx) => {\n const type = ctx.params.type === 'image' ? 'image' : 'file'\n const key = ctx.params.key\n const messageId = ctx.params.message_id\n const selfId = ctx.request.query.self_id\n const bot = this.bots.find((bot) => bot.selfId === selfId)\n if (!bot) return ctx.status = 404\n\n const resp = await bot.http.axios<internal.Readable>(`/im/v1/messages/${messageId}/resources/${key}`, {\n method: 'GET',\n params: { type },\n responseType: 'stream',\n })\n\n ctx.status = 200\n ctx.response.headers['Content-Type'] = resp.headers['content-type']\n ctx.response.body = resp.data\n })\n }\n\n async stop() {\n logger.debug('http server stopped')\n }\n\n dispatchSession(body: AllEvents): void {\n const { header } = body\n if (!header) return\n const { app_id, event_type } = header\n body.type = event_type // add type to body to ease typescript type narrowing\n const bot = this.bots.find((bot) => bot.selfId === app_id)\n const session = adaptSession(bot, body)\n bot.dispatch(session)\n }\n\n private _tryDecryptBody(body: any): any {\n this._refreshCipher()\n // try to decrypt message if encryptKey is set\n // https://open.larksuite.com/document/ukTMukTMukTM/uYDNxYjL2QTM24iN0EjN/event-subscription-configure-/encrypt-key-encryption-configuration-case\n const ciphers = Object.values(this.ciphers)\n if (ciphers.length && typeof body.encrypt === 'string') {\n for (const cipher of ciphers) {\n try {\n return JSON.parse(cipher.decrypt(body.encrypt))\n } catch {}\n }\n logger.warn('failed to decrypt message: %o', body)\n }\n\n if (typeof body.encrypt === 'string' && !ciphers.length) {\n logger.warn('encryptKey is not set, but received encrypted message: %o', body)\n }\n\n return body\n }\n\n private _refreshCipher(): void {\n const ciphers = Object.keys(this.ciphers)\n const bots = this.bots.map((bot) => bot.config.appId)\n if (bots.length === ciphers.length && bots.every((bot) => ciphers.includes(bot))) return\n\n this.ciphers = {}\n for (const bot of this.bots) {\n this.ciphers[bot.config.appId] = new Cipher(bot.config.encryptKey)\n }\n }\n}\n\nexport namespace HttpServer {\n export interface Config {\n selfUrl?: string\n path?: string\n verifyToken?: boolean\n verifySignature?: boolean\n }\n\n export const createConfig = (path: string): Schema<Config> => Schema.object({\n path: Schema.string().role('url').description('要连接的服务器地址。').default(path),\n selfUrl: Schema.string().role('link').description('服务器暴露在公网的地址。缺省时将使用全局配置。'),\n verifyToken: Schema.boolean().description('是否验证令牌。'),\n verifySignature: Schema.boolean().description('是否验证签名。'),\n }).description('服务端设置')\n}\n", "import crypto from 'crypto'\n\nimport { defineProperty, h, Session, trimSlash } from '@satorijs/satori'\n\nimport { FeishuBot } from './bot'\nimport { AllEvents, Events, Lark, MessageContentType, MessageType } from './types'\n\nexport type Sender =\n | {\n sender_id: Lark.UserIds\n sender_type?: string\n tenant_key: string\n }\n | (Lark.UserIdentifiers & { sender_type?: string; tenant_key: string })\n\nexport function adaptSender(sender: Sender, session: Session): Session {\n let userId: string | undefined\n if ('sender_id' in sender) {\n userId = sender.sender_id.open_id\n } else {\n userId = sender.id\n }\n session.author ??= { userId }\n session.author.userId = userId\n session.userId = userId\n\n return session\n}\n\nexport function adaptMessage(bot: FeishuBot, data: Events['im.message.receive_v1']['event'], session: Session): Session {\n const json = JSON.parse(data.message.content) as MessageContentType<MessageType>\n const assetEndpoint = trimSlash(bot.config.selfUrl ?? bot.ctx.root.config.selfUrl) + bot.config.path + '/assets'\n const content: (string | h)[] = []\n switch (data.message.message_type) {\n case 'text': {\n const text = json.text as string\n if (!data.message.mentions?.length) {\n content.push(text)\n break\n }\n\n // Lark's `at` Element would be `@user_id` in text\n text.split(' ').forEach((word) => {\n if (word.startsWith('@')) {\n const mention = data.message.mentions.find((mention) => mention.key === word)\n content.push(h.at(mention.id.open_id, { name: mention.name }))\n } else {\n content.push(word)\n }\n })\n break\n }\n case 'image':\n content.push(h.image(`${assetEndpoint}/image/${data.message.message_id}/${json.image_key}?self_id=${bot.selfId}`))\n break\n case 'audio':\n content.push(h.audio(`${assetEndpoint}/file/${data.message.message_id}/${json.file_key}?self_id=${bot.selfId}`))\n break\n case 'media':\n content.push(h.video(`${assetEndpoint}/file/${data.message.message_id}/${json.file_key}?self_id=${bot.selfId}`, json.image_key))\n break\n case 'file':\n content.push(h.file(`${assetEndpoint}/file/${data.message.message_id}/${json.file_key}?self_id=${bot.selfId}`))\n break\n }\n\n session.timestamp = +data.message.create_time\n session.messageId = data.message.message_id\n session.channelId = data.message.chat_id\n session.content = content.map((c) => c.toString()).join(' ')\n\n return session\n}\n\nexport function adaptSession(bot: FeishuBot, body: AllEvents): Session {\n const session = bot.session()\n session.selfId = bot.selfId\n const internal = Object.create(bot.internal)\n Object.assign(internal, body)\n defineProperty(session, 'feishu', internal)\n defineProperty(session, 'lark', internal)\n\n switch (body.type) {\n case 'im.message.receive_v1':\n session.type = 'message'\n session.subtype = body.event.message.chat_type\n if (session.subtype === 'p2p') session.subtype = 'private'\n adaptSender(body.event.sender, session)\n adaptMessage(bot, body.event, session)\n break\n }\n return session\n}\n\n/**\n * Get ID type from id string\n * @see https://open.larksuite.com/document/home/user-identity-introduction/introduction\n */\nexport function extractIdType(id: string): Lark.ReceiveIdType {\n if (id.startsWith('ou')) return 'open_id'\n if (id.startsWith('on')) return 'union_id'\n if (id.startsWith('oc')) return 'chat_id'\n if (id.includes('@')) return 'email'\n return 'user_id'\n}\n\nexport class Cipher {\n encryptKey: string\n key: Buffer\n\n constructor(key: string) {\n this.encryptKey = key\n const hash = crypto.createHash('sha256')\n hash.update(key)\n this.key = hash.digest()\n }\n\n decrypt(encrypt: string) {\n const encryptBuffer = Buffer.from(encrypt, 'base64')\n const decipher = crypto.createDecipheriv('aes-256-cbc', this.key, encryptBuffer.slice(0, 16))\n let decrypted = decipher.update(encryptBuffer.slice(16).toString('hex'), 'hex', 'utf8')\n decrypted += decipher.final('utf8')\n return decrypted\n }\n\n calculateSignature(timestamp: string, nonce: string, body: string): string {\n const content = timestamp + nonce + this.encryptKey + body\n const sign = crypto.createHash('sha256').update(content).digest('hex')\n return sign\n }\n}\n", "import { createReadStream } from 'fs'\nimport internal from 'stream'\n\nimport { h, MessageEncoder, Quester } from '@satorijs/satori'\nimport FormData from 'form-data'\n\nimport { LarkBot } from './bot'\nimport { BaseResponse, Message, MessageContent, MessageType } from './types'\nimport { extractIdType } from './utils'\n\nexport interface Addition {\n file: MessageContent.MediaContents\n type: MessageType\n}\n\nexport class LarkMessageEncoder extends MessageEncoder<LarkBot> {\n private quote: string | undefined\n private content = ''\n private addition: Addition\n // TODO: currently not used, would be supported in the future\n private richText: MessageContent.RichText[string]\n\n async post(data?: any) {\n try {\n let resp: BaseResponse & { data: Message }\n if (this.quote) {\n resp = await this.bot.internal?.replyMessage(this.quote, data)\n } else {\n data.receive_id = this.channelId\n resp = await this.bot.internal?.sendMessage(extractIdType(this.channelId), data)\n }\n const session = this.bot.session()\n session.messageId = resp.data.message_id\n session.timestamp = Number(resp.data.create_time) * 1000\n session.userId = resp.data.sender.id\n session.app.emit(session, 'send', session)\n this.results.push(session)\n } catch (e) {\n // try to extract error message from Lark API\n if (Quester.isAxiosError(e)) {\n if (e.response?.data?.code) {\n const generalErrorMsg = `Check error code at https://open.larksuite.com/document/ukTMukTMukTM/ugjM14COyUjL4ITN`\n e.message += ` (Lark error code ${e.response.data.code}: ${e.response.data.msg ?? generalErrorMsg})`\n }\n }\n this.errors.push(e)\n }\n }\n\n async flush() {\n if (this.content === '' && !this.addition && !this.richText) return\n\n let message: MessageContent.Contents\n if (this.addition) {\n message = {\n ...message,\n ...this.addition.file,\n }\n }\n if (this.richText) {\n message = { zh_cn: this.richText }\n }\n if (this.content) {\n message = { text: this.content }\n }\n await this.post({\n msg_type: this.richText ? 'post' : this.addition ? this.addition.type : 'text',\n content: JSON.stringify(message),\n })\n\n // reset cached content\n this.quote = undefined\n this.content = ''\n this.addition = undefined\n this.richText = undefined\n }\n\n async sendFile(type: 'image' | 'video' | 'audio' | 'file', url: string): Promise<Addition> {\n const payload = new FormData()\n\n const assetKey = type === 'image' ? 'image' : 'file'\n const [schema, file] = url.split('://')\n const filename = schema === 'base64' ? 'unknown' : new URL(url).pathname.split('/').pop()\n if (schema === 'file') {\n payload.append(assetKey, createReadStream(file))\n } else if (schema === 'base64') {\n payload.append(assetKey, Buffer.from(file, 'base64'))\n } else {\n const resp = await this.bot.assetsQuester.get<internal.Readable>(url, { responseType: 'stream' })\n payload.append(assetKey, resp)\n }\n\n if (type === 'image') {\n payload.append('image_type', 'message')\n const { data } = await this.bot.internal.uploadImage(payload)\n return {\n type: 'image',\n file: {\n image_key: data.image_key,\n },\n }\n } else {\n let msgType: MessageType = 'file'\n if (type === 'audio') {\n // FIXME: only support opus\n payload.append('file_type', 'opus')\n msgType = 'audio'\n } else if (type === 'video') {\n // FIXME: only support mp4\n payload.append('file_type', 'mp4')\n msgType = 'media'\n } else {\n const ext = filename.split('.').pop()\n if (['xls', 'ppt', 'pdf'].includes(ext)) {\n payload.append('file_type', ext)\n } else {\n payload.append('file_type', 'stream')\n }\n }\n payload.append('file_name', filename)\n const { data } = await this.bot.internal.uploadFile(payload)\n return {\n type: msgType,\n file: {\n file_key: data.file_key,\n },\n }\n }\n }\n\n async visit(element: h) {\n const { type, attrs, children } = element\n\n switch (type) {\n case 'text':\n this.content += attrs.content\n break\n case 'at': {\n if (attrs.type === 'all') {\n this.content += `<at user_id=\"all\">${attrs.name ?? '所有人'}</at>`\n } else {\n this.content += `<at user_id=\"${attrs.id}\">${attrs.name}</at>`\n }\n break\n }\n case 'a':\n await this.render(children)\n if (attrs.href) this.content += ` (${attrs.href})`\n break\n case 'sharp':\n // platform does not support sharp\n break\n case 'quote':\n await this.flush()\n this.quote = attrs.id\n break\n case 'image':\n case 'video':\n case 'audio':\n case 'file':\n if (attrs.url) {\n await this.flush()\n this.addition = await this.sendFile(type, attrs.url)\n }\n break\n case 'figure': // FIXME: treat as message element for now\n case 'message':\n await this.flush()\n await this.render(children, true)\n break\n default:\n await this.render(children)\n }\n }\n}\n\nexport { LarkMessageEncoder as FeishuMessageEncoder }\n", "export * from './internal'\nexport * from './auth'\nexport * from './event'\nexport * from './guild'\nexport * from './message'\n\nexport namespace Lark {\n /**\n * A user in Lark has several different IDs.\n * @see https://open.larksuite.com/document/home/user-identity-introduction/introduction\n */\n export interface UserIds {\n union_id: string\n /** *user_id* only available when the app has permissions granted by the administrator */\n user_id?: string\n open_id: string\n }\n\n /**\n * Identify a user in Lark.\n * This behaves like {@link Lark.UserIds}, but it only contains *open_id*.\n * (i.e. the id_type is always `open_id`)\n */\n export interface UserIdentifiers {\n id: string\n id_type: string\n }\n\n export type UserIdType = 'union_id' | 'user_id' | 'open_id'\n /**\n * The id type when specify a receiver, would be used in the request query.\n *\n * NOTE: we always use **open_id** to identify a user, use **chat_id** to identify a channel.\n * @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/create\n */\n export type ReceiveIdType = UserIdType | 'email' | 'chat_id'\n}\n\nexport { Lark as Feishu }\n", "import FormData from 'form-data'\nimport { Dict, Logger, makeArray, Quester } from '@satorijs/satori'\n\nexport interface Internal {}\n\nconst logger = new Logger('lark')\n\nexport interface BaseResponse {\n /** error code. would be 0 if success, and non-0 if failed. */\n code: number\n /** error message. would be 'success' if success. */\n msg: string\n}\n\ntype Method = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'\n\nexport class Internal {\n constructor(private http: Quester) {}\n\n private processReponse(response: any): BaseResponse {\n const { code, msg } = response\n if (code === 0) {\n return response\n } else {\n logger.debug('response: %o', response)\n throw new Error(`HTTP response with non-zero status (${code}) with message \"${msg}\"`)\n }\n }\n\n static define(routes: Dict<Partial<Record<Method, string | string[]>>>) {\n for (const path in routes) {\n for (const key in routes[path]) {\n const method = key as Method\n for (const name of makeArray(routes[path][method])) {\n Internal.prototype[name] = async function (this: Internal, ...args: any[]) {\n const raw = args.join(', ')\n const url = path.replace(/\\{([^}]+)\\}/g, () => {\n if (!args.length) throw new Error(`too few arguments for ${path}, received ${raw}`)\n return args.shift()\n })\n const config: Quester.AxiosRequestConfig = {}\n if (args.length === 1) {\n if (method === 'GET' || method === 'DELETE') {\n config.params = args[0]\n } else {\n if (method === 'POST' && args[0] instanceof FormData) {\n config.headers = args[0].getHeaders()\n }\n config.data = args[0]\n }\n } else if (args.length === 2 && method !== 'GET' && method !== 'DELETE') {\n config.data = args[0]\n config.params = args[1]\n } else if (args.length > 1) {\n throw new Error(`too many arguments for ${path}, received ${raw}`)\n }\n return this.processReponse(await this.http(method, url, config))\n }\n }\n }\n }\n }\n}\n", "import { BaseResponse, Internal } from '.'\n\n/**\n * Lark defines three types of token:\n * - app_access_token: to access the API in an app (published on App Store).\n * - tenant_access_token: to access the API as an enterprise or a team (tenant).\n * *We commonly use this one*\n * - user_access_token: to access the API as the specific user.\n *\n * @see https://open.larksuite.com/document/ukTMukTMukTM/uMTNz4yM1MjLzUzM\n */\n\nexport interface AppCredentials {\n app_id: string\n app_secret: string\n}\n\nexport interface AppAccessToken extends BaseResponse {\n /** access token */\n app_access_token: string\n /** expire time in seconds. e.g: 7140 (119 minutes) */\n expire: number\n}\n\nexport interface TenantAccessToken extends BaseResponse {\n /** access token */\n tenant_access_token: string\n /** expire time in seconds. e.g: 7140 (119 minutes) */\n expire: number\n}\n\ndeclare module './internal' {\n export interface Internal {\n /**\n * Returns the app_access_token for the bot.\n * @see https://open.larksuite.com/document/ukTMukTMukTM/ukDNz4SO0MjL5QzM/auth-v3/auth/app_access_token_internal\n */\n getAppAccessToken(data: AppCredentials): Promise<AppAccessToken>\n /**\n * Returns the tenant_access_token for the bot.\n * @see https://open.larksuite.com/document/ukTMukTMukTM/ukDNz4SO0MjL5QzM/auth-v3/auth/tenant_access_token_internal\n */\n getTenantAccessToken(data: AppCredentials): Promise<TenantAccessToken>\n }\n}\n\nInternal.define({\n '/auth/v3/app_access_token/internal': {\n POST: 'getAppAccessToken',\n },\n '/auth/v3/tenant_access_token/internal': {\n POST: 'getTenantAccessToken',\n },\n})\n", "import { Dict } from '@satorijs/satori'\n\nimport { Lark } from '.'\nimport { Internal } from './internal'\nimport { Paginated, Pagination } from './utils'\n\ndeclare module '.' {\n export namespace Lark {\n export interface Guild {\n avatar: string\n name: string\n description: string\n i18n_names: Dict<string>\n add_member_permission: string\n share_card_permission: string\n at_all_permission: string\n edit_permission: string\n owner_id_type: string\n owner_id: string\n chat_mode: string\n chat_type: string\n chat_tag: string\n join_message_visibility: string\n leave_message_visibility: string\n membership_approval: string\n moderation_permission: string\n external: boolean\n tenant_key: string\n user_count: string\n bot_count: string\n }\n }\n}\n\nexport interface GuildMember {\n member_id_type: Lark.UserIdType\n member_id: string\n name: string\n tenant_key: string\n}\n\ndeclare module './internal' {\n export interface Internal {\n /** @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/chat/list */\n getCurrentUserGuilds(params: Pagination<{ user_id_type: Lark.UserIdType }>): Promise<{ data: Paginated<Lark.Guild> }>\n /** @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/chat/get */\n getGuildInfo(chat_id: string, params: { user_id_type: string }): Promise<BaseResponse & { data: Lark.Guild }>\n /** @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/chat-members/get */\n getGuildMembers(chat_id: string, params: Pagination<{ member_id_type: Lark.UserIdType }>): Promise<{ data: Paginated<GuildMember> }>\n }\n}\n\nInternal.define({\n '/im/v1/chats': {\n GET: 'getCurrentUserGuilds',\n },\n '/im/v1/chats/{chat_id}': {\n GET: 'getGuildInfo',\n },\n '/im/v1/chats/{chat_id}/members': {\n GET: 'getGuildMembers',\n },\n})\n", "import FormData from 'form-data'\n\nimport { BaseResponse, Internal } from '..'\n\nexport interface Asset<T> extends BaseResponse {\n data: T\n}\n\nexport type Image = Asset<{ image_key: string }>\nexport type File = Asset<{ file_key: string }>\n\ndeclare module '../internal' {\n interface Internal {\n /**\n * Upload an image to obtain an `image_key` for use in sending messages or changing the avatar.\n *\n * The data should contain:\n * - `image_type`: 'message' | 'avatar'\n * - `image': Buffer\n * @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/image/create\n */\n uploadImage(data: FormData): Promise<Image>\n\n /**\n * Upload a file to obtain a `file_key` for use in sending messages.\n *\n * The data should contain:\n * - `file_type`: 'opus' | 'mp4' | 'pdf' | 'xls' | 'ppt' | 'stream'\n * - `opus`: Opus audio file\n * - `mp4`: MP4 video file\n * - `pdf`: PDF file\n * - `xls`: Excel file\n * - `ppt`: PowerPoint file\n * - `stream`: Stream file, or any other file not listed above\n * - `file_name`: string, include extension\n * - `duration`?: number, the duration of audio/video file in milliseconds\n * - `file`: Buffer\n * @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/file/create\n */\n uploadFile(data: FormData): Promise<File>\n }\n}\n\nInternal.define({\n '/im/v1/images': {\n POST: 'uploadImage',\n },\n '/im/v1/files': {\n POST: 'uploadFile',\n },\n})\n", "import { Internal, Lark } from '..'\nimport { Paginated, Pagination } from '../utils'\n\nimport { MessageContent } from './content'\n\nexport * from './content'\nexport * from './asset'\n\nexport type MessageType = 'text' | 'post' | 'image' | 'file' | 'audio' | 'media' | 'sticker' | 'interactive' | 'share_chat' | 'share_user'\n\nexport interface MessageContentMap {\n 'text': MessageContent.Text\n 'post': MessageContent.RichText\n 'image': MessageContent.Image\n 'file': MessageContent.File\n 'audio': MessageContent.Audio\n 'media': MessageContent.Media\n 'sticker': MessageContent.Sticker\n 'share_chat': MessageContent.ShareChat\n 'share_user': MessageContent.ShareUser\n}\n\nexport type MessageContentType<T extends MessageType> = T extends keyof MessageContentMap ? MessageContentMap[T] : any\n\nexport interface Sender extends Lark.UserIdentifiers {\n sender_type: string\n tenant_key: string\n}\nexport interface Mention extends Lark.UserIdentifiers {\n key: string\n name: string\n tenant_key: string\n}\n\ndeclare module '../event' {\n export interface Events {\n /**\n * Receive message event.\n * @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/events/receive\n */\n 'im.message.receive_v1': EventSkeleton<'im.message.receive_v1', {\n sender: {\n sender_id: Lark.UserIds\n sender_type?: string\n tenant_key: string\n }\n message: {\n message_id: string\n root_id: string\n parent_id: string\n create_time: string\n chat_id: string\n chat_type: string\n message_type: MessageType\n content: string\n mentions: {\n key: string\n id: Lark.UserIds\n name: string\n tenant_key: string\n }[]\n }\n }>\n /**\n * Message read event.\n * @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/events/message_read\n */\n 'im.message.message_read_v1': EventSkeleton<'im.message.message_read_v1', {\n reader: {\n reader_id: Lark.UserIds\n read_time: string\n tenant_key: string\n }\n message_id_list: string[]\n }>\n }\n}\n\nexport interface MessagePayload {\n receive_id: string\n content: string\n msg_type: string\n}\n\nexport interface Message {\n /**\n * The id of current message\n *\n * Should be started with `om_`\n */\n message_id: string\n /**\n * The id of the *root* message in reply chains\n * @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/intro#ac79c1c2\n */\n root_id: string\n\n /**\n * The id of the direct *parent* message in reply chains\n * @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/intro#ac79c1c2\n */\n parent_id: string\n\n /**\n * The message type.\n * @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/im-v1/message/create_json\n */\n msg_type: MessageType\n\n /**\n * The timestamp when the message is created in milliseconds.\n */\n create_time: string\n\n /**\n * The timestamp when the message is last updated in milliseconds.\n */\n update_time: string\n\n /**\n * Whether the message is deleted.\n */\n deleted: boolean\n\n /**\n * Whether the message is updated.\n */\n updated: boolean\n\n /**\n * The id of the group / channel the message is sent to.\n */\n chat_id: string\n\n /**\n * The sender of the message.\n * Can be a user or an app.\n */\n sender: Sender\n\n /**\n * The body of the message.\n */\n body: {\n /**\n * The content of the message.\n * Should be a string that represents the JSON object contains the message content.\n */\n content: string\n }\n\n /**\n * Users mentioned in the message.\n */\n mentions: Mention[]\n\n /**\n * The id of the direct *parent* message in `merge and repost` chains.\n */\n upper_message_id: string\n}\n\nexport interface ReadUser {\n user_id_type: Lark.UserIdType\n user_id: string\n timestamp: string\n tenant_key: string\n}\n\ndeclare module '../internal' {\n export interface Internal {\n /** @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/create */\n sendMessage(receive_id_type: Lark.ReceiveIdType, message: MessagePayload): Promise<BaseResponse & { data: Message }>\n /** @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/reply */\n replyMessage(message_id: string, message: MessagePayload): Promise<BaseResponse & { data: Message }>\n /** @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/update */\n updateMessage(message_id: string, message: Omit<MessagePayload, 'receive_id'>): Promise<BaseResponse & { data: Message }>\n /** @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/get */\n getMessage(message_id: string): Promise<BaseResponse & { data: Message }>\n /** @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/delete */\n deleteMessage(message_id: string): Promise<BaseResponse>\n /** @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/read_users */\n getMessageReadUsers(message_id: string, params: Pagination<{ user_id_type: Lark.UserIdType }>): Promise<BaseResponse & { data: Paginated<ReadUser> }>\n }\n}\n\nInternal.define({\n '/im/v1/messages?receive_id_type={receive_id_type}': {\n POST: 'sendMessage',\n },\n '/im/v1/messages/{message_id}/reply': {\n POST: 'replyMessage',\n },\n '/im/v1/messages/{message_id}': {\n GET: 'getMessage',\n PUT: 'updateMessage',\n DELETE: 'deleteMessage',\n },\n '/im/v1/messages/{message_id}/read_users': {\n GET: 'getMessageReadUsers',\n },\n})\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { FeishuBot } from './bot'\nimport * as Lark from './types'\n\nexport * from './bot'\n\nexport { Lark, Lark as Feishu }\n\nexport default FeishuBot\n\ndeclare module '@satorijs/core' {\n interface Session {\n feishu: Lark.Internal\n lark: Lark.Internal\n }\n}\n", "import { Bot, Context, h, Logger, Quester, Schema } from '@satorijs/satori'\n\nimport { HttpServer } from './http'\nimport { LarkMessageEncoder } from './message'\nimport { Internal } from './types'\n\nconst logger = new Logger('lark')\n\nexport class LarkBot extends Bot<LarkBot.Config> {\n static MessageEncoder = LarkMessageEncoder\n\n _token?: string\n _refresher?: NodeJS.Timeout\n http: Quester\n assetsQuester: Quester\n internal: Internal\n\n constructor(ctx: Context, config: LarkBot.Config) {\n super(ctx, config)\n\n // lark bot needs config.selfUrl to be set as it should be serve on a public url\n if (!config.selfUrl && !ctx.root.config.selfUrl) {\n logger.warn('selfUrl is not set, some features may not work')\n }\n\n this.platform = 'lark'\n this.selfId = config.appId\n\n this.http = ctx.http.extend({\n endpoint: config.endpoint,\n headers: {\n 'Content-Type': 'application/json; charset=utf-8',\n },\n })\n this.assetsQuester = Quester.create()\n\n this.internal = new Internal(this.http)\n\n ctx.plugin(HttpServer, this)\n }\n\n async initialize() {\n await this.refreshToken()\n this.online()\n }\n\n private async refreshToken() {\n const { tenant_access_token: token } = await this.internal.getTenantAccessToken({\n app_id: this.config.appId,\n app_secret: this.config.appSecret,\n })\n logger.debug('refreshed token %s', token)\n this.token = token\n // Token would be expired in 2 hours, refresh it every 1 hour\n // see https://open.larksuite.com/document/ukTMukTMukTM/ukDNz4SO0MjL5QzM/auth-v3/auth/tenant_access_token_internal\n if (this._refresher) clearTimeout(this._refresher)\n this._refresher = setTimeout(() => this.refreshToken(), 3600 * 1000)\n this.online()\n }\n\n get token() {\n return this._token\n }\n\n set token(v: string) {\n this._token = v\n this.http.config.headers.Authorization = `Bearer ${v}`\n }\n\n async editMessage(channelId: string, messageId: string, content: h.Fragment) {\n await this.internal.updateMessage(messageId, {\n content: h.normalize(content).join(''),\n msg_type: 'text',\n })\n }\n\n async deleteMessage(channelId: string, messageId: string) {\n await this.internal.deleteMessage(messageId)\n }\n}\n\nexport namespace LarkBot {\n export interface Config extends Bot.Config, HttpServer.Config, Quester.Config {\n appId: string\n appSecret: string\n encryptKey?: string\n verificationToken?: string\n }\n\n export const Config: Schema<Config> = Schema.intersect([\n Schema.object({\n platform: Schema.union(['feishu', 'lark']).required().description('平台名称。'),\n appId: Schema.string().required().description('机器人的应用 ID。'),\n appSecret: Schema.string().role('secret').required().description('机器人的应用密钥。'),\n encryptKey: Schema.string().role('secret').description('机器人的 Encrypt Key。'),\n verificationToken: Schema.string().description('事件推送的验证令牌。'),\n }),\n Schema.union([\n Schema.intersect([\n Schema.object({\n platform: Schema.const('feishu').required(),\n }),\n Quester.createConfig('https://open.feishu.cn/open-apis/'),\n HttpServer.createConfig('/feishu'),\n ]),\n Schema.intersect([\n Schema.object({\n platform: Schema.const('lark').required(),\n }),\n Quester.createConfig('https://open.larksuite.com/open-apis/'),\n HttpServer.createConfig('/lark'),\n ]),\n ]),\n ])\n}\n\nexport { LarkBot as FeishuBot }\n", "import internal from 'stream'\n\nimport { Adapter, Context, Logger, Schema } from '@satorijs/satori'\n\nimport { FeishuBot } from './bot'\nimport { AllEvents } from './types'\nimport { adaptSession, Cipher } from './utils'\n\nconst logger = new Logger('lark')\n\nexport class HttpServer extends Adapter.Server<FeishuBot> {\n private ciphers: Record<string, Cipher> = {}\n\n fork(ctx: Context, bot: FeishuBot) {\n super.fork(ctx, bot)\n\n this._refreshCipher()\n return bot.initialize()\n }\n\n async start(bot: FeishuBot) {\n const { path } = bot.config\n bot.ctx.router.post(path, (ctx) => {\n this._refreshCipher()\n\n // compare signature if encryptKey is set\n // But not every message contains signature\n // https://open.larksuite.com/document/ukTMukTMukTM/uYDNxYjL2QTM24iN0EjN/event-subscription-configure-/encrypt-key-encryption-configuration-case#d41e8916\n const signature = ctx.get('X-Lark-Signature')\n const enabledSignatureVerify = this.bots.filter((bot) => bot.config.verifySignature)\n if (signature && enabledSignatureVerify.length) {\n const result = enabledSignatureVerify.some((bot) => {\n const timestamp = ctx.get('X-Lark-Request-Timestamp')\n const nonce = ctx.get('X-Lark-Request-Nonce')\n const body = ctx.request.rawBody\n const actualSignature = this.ciphers[bot.config.appId]?.calculateSignature(timestamp, nonce, body)\n if (actualSignature === signature) return true\n else return false\n })\n if (!result) return (ctx.status = 403)\n }\n\n // try to decrypt message first if encryptKey is set\n const body = this._tryDecryptBody(ctx.request.body)\n // respond challenge message\n // https://open.larksuite.com/document/ukTMukTMukTM/uYDNxYjL2QTM24iN0EjN/event-subscription-configure-/request-url-configuration-case\n if (body?.type === 'url_verification' && body?.challenge && typeof body.challenge === 'string') {\n ctx.response.body = { challenge: body.challenge }\n return\n }\n\n // compare verification token\n const enabledVerifyTokenVerify = this.bots.filter((bot) => bot.config.verifyToken && bot.config.verificationToken)\n if (enabledVerifyTokenVerify.length) {\n const token = ctx.request.body?.token\n // only compare token if token exists\n if (token) {\n const result = enabledVerifyTokenVerify.some((bot) => {\n if (token === bot.config.verificationToken) return true\n else return false\n })\n if (!result) return (ctx.status = 403)\n }\n }\n\n // dispatch message\n logger.debug('received decryped event: %o', body)\n this.dispatchSession(body)\n\n // Lark requires 200 OK response to make sure event is received\n return ctx.status = 200\n })\n\n bot.ctx.router.get(path + '/assets/:type/:message_id/:key', async (ctx) => {\n const type = ctx.params.type === 'image' ? 'image' : 'file'\n const key = ctx.params.key\n const messageId = ctx.params.message_id\n const selfId = ctx.request.query.self_id\n const bot = this.bots.find((bot) => bot.selfId === selfId)\n if (!bot) return ctx.status = 404\n\n const resp = await bot.http.axios<internal.Readable>(`/im/v1/messages/${messageId}/resources/${key}`, {\n method: 'GET',\n params: { type },\n responseType: 'stream',\n })\n\n ctx.status = 200\n ctx.response.headers['Content-Type'] = resp.headers['content-type']\n ctx.response.body = resp.data\n })\n }\n\n async stop() {\n logger.debug('http server stopped')\n }\n\n dispatchSession(body: AllEvents): void {\n const { header } = body\n if (!header) return\n const { app_id, event_type } = header\n body.type = event_type // add type to body to ease typescript type narrowing\n const bot = this.bots.find((bot) => bot.selfId === app_id)\n const session = adaptSession(bot, body)\n bot.dispatch(session)\n }\n\n private _tryDecryptBody(body: any): any {\n this._refreshCipher()\n // try to decrypt message if encryptKey is set\n // https://open.larksuite.com/document/ukTMukTMukTM/uYDNxYjL2QTM24iN0EjN/event-subscription-configure-/encrypt-key-encryption-configuration-case\n const ciphers = Object.values(this.ciphers)\n if (ciphers.length && typeof body.encrypt === 'string') {\n for (const cipher of ciphers) {\n try {\n return JSON.parse(cipher.decrypt(body.encrypt))\n } catch {}\n }\n logger.warn('failed to decrypt message: %o', body)\n }\n\n if (typeof body.encrypt === 'string' && !ciphers.length) {\n logger.warn('encryptKey is not set, but received encrypted message: %o', body)\n }\n\n return body\n }\n\n private _refreshCipher(): void {\n const ciphers = Object.keys(this.ciphers)\n const bots = this.bots.map((bot) => bot.config.appId)\n if (bots.length === ciphers.length && bots.every((bot) => ciphers.includes(bot))) return\n\n this.ciphers = {}\n for (const bot of this.bots) {\n this.ciphers[bot.config.appId] = new Cipher(bot.config.encryptKey)\n }\n }\n}\n\nexport namespace HttpServer {\n export interface Config {\n selfUrl?: string\n path?: string\n verifyToken?: boolean\n verifySignature?: boolean\n }\n\n export const createConfig = (path: string): Schema<Config> => Schema.object({\n path: Schema.string().role('url').description('要连接的服务器地址。').default(path),\n selfUrl: Schema.string().role('link').description('服务器暴露在公网的地址。缺省时将使用全局配置。'),\n verifyToken: Schema.boolean().description('是否验证令牌。'),\n verifySignature: Schema.boolean().description('是否验证签名。'),\n }).description('服务端设置')\n}\n", "import crypto from 'crypto'\n\nimport { defineProperty, h, Session, trimSlash } from '@satorijs/satori'\n\nimport { FeishuBot } from './bot'\nimport { AllEvents, Events, Lark, MessageContentType, MessageType } from './types'\n\nexport type Sender =\n | {\n sender_id: Lark.UserIds\n sender_type?: string\n tenant_key: string\n }\n | (Lark.UserIdentifiers & { sender_type?: string; tenant_key: string })\n\nexport function adaptSender(sender: Sender, session: Session): Session {\n let userId: string | undefined\n if ('sender_id' in sender) {\n userId = sender.sender_id.open_id\n } else {\n userId = sender.id\n }\n session.author ??= { userId }\n session.author.userId = userId\n session.userId = userId\n\n return session\n}\n\nexport function adaptMessage(bot: FeishuBot, data: Events['im.message.receive_v1']['event'], session: Session): Session {\n const json = JSON.parse(data.message.content) as MessageContentType<MessageType>\n const assetEndpoint = trimSlash(bot.config.selfUrl ?? bot.ctx.root.config.selfUrl) + bot.config.path + '/assets'\n const content: (string | h)[] = []\n switch (data.message.message_type) {\n case 'text': {\n const text = json.text as string\n if (!data.message.mentions?.length) {\n content.push(text)\n break\n }\n\n // Lark's `at` Element would be `@user_id` in text\n text.split(' ').forEach((word) => {\n if (word.startsWith('@')) {\n const mention = data.message.mentions.find((mention) => mention.key === word)\n content.push(h.at(mention.id.open_id, { name: mention.name }))\n } else {\n content.push(word)\n }\n })\n break\n }\n case 'image':\n content.push(h.image(`${assetEndpoint}/image/${data.message.message_id}/${json.image_key}?self_id=${bot.selfId}`))\n break\n case 'audio':\n content.push(h.audio(`${assetEndpoint}/file/${data.message.message_id}/${json.file_key}?self_id=${bot.selfId}`))\n break\n case 'media':\n content.push(h.video(`${assetEndpoint}/file/${data.message.message_id}/${json.file_key}?self_id=${bot.selfId}`, json.image_key))\n break\n case 'file':\n content.push(h.file(`${assetEndpoint}/file/${data.message.message_id}/${json.file_key}?self_id=${bot.selfId}`))\n break\n }\n\n session.timestamp = +data.message.create_time\n session.messageId = data.message.message_id\n session.channelId = data.message.chat_id\n session.content = content.map((c) => c.toString()).join(' ')\n\n return session\n}\n\nexport function adaptSession(bot: FeishuBot, body: AllEvents): Session {\n const session = bot.session()\n const internal = Object.create(bot.internal)\n Object.assign(internal, body)\n defineProperty(session, 'feishu', internal)\n defineProperty(session, 'lark', internal)\n\n switch (body.type) {\n case 'im.message.receive_v1':\n session.type = 'message'\n session.subtype = body.event.message.chat_type\n if (session.subtype === 'p2p') session.subtype = 'private'\n session.isDirect = session.subtype === 'private'\n adaptSender(body.event.sender, session)\n adaptMessage(bot, body.event, session)\n break\n }\n return session\n}\n\n/**\n * Get ID type from id string\n * @see https://open.larksuite.com/document/home/user-identity-introduction/introduction\n */\nexport function extractIdType(id: string): Lark.ReceiveIdType {\n if (id.startsWith('ou')) return 'open_id'\n if (id.startsWith('on')) return 'union_id'\n if (id.startsWith('oc')) return 'chat_id'\n if (id.includes('@')) return 'email'\n return 'user_id'\n}\n\nexport class Cipher {\n encryptKey: string\n key: Buffer\n\n constructor(key: string) {\n this.encryptKey = key\n const hash = crypto.createHash('sha256')\n hash.update(key)\n this.key = hash.digest()\n }\n\n decrypt(encrypt: string) {\n const encryptBuffer = Buffer.from(encrypt, 'base64')\n const decipher = crypto.createDecipheriv('aes-256-cbc', this.key, encryptBuffer.slice(0, 16))\n let decrypted = decipher.update(encryptBuffer.slice(16).toString('hex'), 'hex', 'utf8')\n decrypted += decipher.final('utf8')\n return decrypted\n }\n\n calculateSignature(timestamp: string, nonce: string, body: string): string {\n const content = timestamp + nonce + this.encryptKey + body\n const sign = crypto.createHash('sha256').update(content).digest('hex')\n return sign\n }\n}\n", "import { createReadStream } from 'fs'\nimport internal from 'stream'\n\nimport { h, MessageEncoder, Quester } from '@satorijs/satori'\nimport FormData from 'form-data'\n\nimport { LarkBot } from './bot'\nimport { BaseResponse, Message, MessageContent, MessageType } from './types'\nimport { extractIdType } from './utils'\n\nexport interface Addition {\n file: MessageContent.MediaContents\n type: MessageType\n}\n\nexport class LarkMessageEncoder extends MessageEncoder<LarkBot> {\n private quote: string | undefined\n private content = ''\n private addition: Addition\n // TODO: currently not used, would be supported in the future\n private richText: MessageContent.RichText[string]\n\n async post(data?: any) {\n try {\n let resp: BaseResponse & { data: Message }\n if (this.quote) {\n resp = await this.bot.internal?.replyMessage(this.quote, data)\n } else {\n data.receive_id = this.channelId\n resp = await this.bot.internal?.sendMessage(extractIdType(this.channelId), data)\n }\n const session = this.bot.session()\n session.messageId = resp.data.message_id\n session.timestamp = Number(resp.data.create_time) * 1000\n session.userId = resp.data.sender.id\n session.app.emit(session, 'send', session)\n this.results.push(session)\n } catch (e) {\n // try to extract error message from Lark API\n if (Quester.isAxiosError(e)) {\n if (e.response?.data?.code) {\n const generalErrorMsg = `Check error code at https://open.larksuite.com/document/server-docs/getting-started/server-error-codes`\n e.message += ` (Lark error code ${e.response.data.code}: ${e.response.data.msg ?? generalErrorMsg})`\n }\n }\n this.errors.push(e)\n }\n }\n\n async flush() {\n if (this.content === '' && !this.addition && !this.richText) return\n\n let message: MessageContent.Contents\n if (this.addition) {\n message = {\n ...message,\n ...this.addition.file,\n }\n }\n if (this.richText) {\n message = { zh_cn: this.richText }\n }\n if (this.content) {\n message = { text: this.content }\n }\n await this.post({\n msg_type: this.richText ? 'post' : this.addition ? this.addition.type : 'text',\n content: JSON.stringify(message),\n })\n\n // reset cached content\n this.quote = undefined\n this.content = ''\n this.addition = undefined\n this.richText = undefined\n }\n\n async sendFile(type: 'image' | 'video' | 'audio' | 'file', url: string): Promise<Addition> {\n const payload = new FormData()\n\n const assetKey = type === 'image' ? 'image' : 'file'\n const [schema, file] = url.split('://')\n const filename = schema === 'base64' ? 'unknown' : new URL(url).pathname.split('/').pop()\n if (schema === 'file') {\n payload.append(assetKey, createReadStream(file))\n } else if (schema === 'base64') {\n payload.append(assetKey, Buffer.from(file, 'base64'))\n } else {\n const resp = await this.bot.assetsQuester.get<internal.Readable>(url, { responseType: 'stream' })\n payload.append(assetKey, resp)\n }\n\n if (type === 'image') {\n payload.append('image_type', 'message')\n const { data } = await this.bot.internal.uploadImage(payload)\n return {\n type: 'image',\n file: {\n image_key: data.image_key,\n },\n }\n } else {\n let msgType: MessageType = 'file'\n if (type === 'audio') {\n // FIXME: only support opus\n payload.append('file_type', 'opus')\n msgType = 'audio'\n } else if (type === 'video') {\n // FIXME: only support mp4\n payload.append('file_type', 'mp4')\n msgType = 'media'\n } else {\n const ext = filename.split('.').pop()\n if (['xls', 'ppt', 'pdf'].includes(ext)) {\n payload.append('file_type', ext)\n } else {\n payload.append('file_type', 'stream')\n }\n }\n payload.append('file_name', filename)\n const { data } = await this.bot.internal.uploadFile(payload)\n return {\n type: msgType,\n file: {\n file_key: data.file_key,\n },\n }\n }\n }\n\n async visit(element: h) {\n const { type, attrs, children } = element\n\n switch (type) {\n case 'text':\n this.content += attrs.content\n break\n case 'at': {\n if (attrs.type === 'all') {\n this.content += `<at user_id=\"all\">${attrs.name ?? '所有人'}</at>`\n } else {\n this.content += `<at user_id=\"${attrs.id}\">${attrs.name}</at>`\n }\n break\n }\n case 'a':\n await this.render(children)\n if (attrs.href) this.content += ` (${attrs.href})`\n break\n case 'sharp':\n // platform does not support sharp\n break\n case 'quote':\n await this.flush()\n this.quote = attrs.id\n break\n case 'image':\n case 'video':\n case 'audio':\n case 'file':\n if (attrs.url) {\n await this.flush()\n this.addition = await this.sendFile(type, attrs.url)\n }\n break\n case 'figure': // FIXME: treat as message element for now\n case 'message':\n await this.flush()\n await this.render(children, true)\n break\n default:\n await this.render(children)\n }\n }\n}\n\nexport { LarkMessageEncoder as FeishuMessageEncoder }\n", "export * from './internal'\nexport * from './auth'\nexport * from './event'\nexport * from './guild'\nexport * from './message'\n\nexport namespace Lark {\n /**\n * A user in Lark has several different IDs.\n * @see https://open.larksuite.com/document/home/user-identity-introduction/introduction\n */\n export interface UserIds {\n union_id: string\n /** *user_id* only available when the app has permissions granted by the administrator */\n user_id?: string\n open_id: string\n }\n\n /**\n * Identify a user in Lark.\n * This behaves like {@link Lark.UserIds}, but it only contains *open_id*.\n * (i.e. the id_type is always `open_id`)\n */\n export interface UserIdentifiers {\n id: string\n id_type: string\n }\n\n export type UserIdType = 'union_id' | 'user_id' | 'open_id'\n /**\n * The id type when specify a receiver, would be used in the request query.\n *\n * NOTE: we always use **open_id** to identify a user, use **chat_id** to identify a channel.\n * @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/create\n */\n export type ReceiveIdType = UserIdType | 'email' | 'chat_id'\n}\n\nexport { Lark as Feishu }\n", "import FormData from 'form-data'\nimport { Dict, Logger, makeArray, Quester } from '@satorijs/satori'\n\nexport interface Internal {}\n\nconst logger = new Logger('lark')\n\nexport interface BaseResponse {\n /** error code. would be 0 if success, and non-0 if failed. */\n code: number\n /** error message. would be 'success' if success. */\n msg: string\n}\n\ntype Method = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'\n\nexport class Internal {\n constructor(private http: Quester) {}\n\n private processReponse(response: any): BaseResponse {\n const { code, msg } = response\n if (code === 0) {\n return response\n } else {\n logger.debug('response: %o', response)\n throw new Error(`HTTP response with non-zero status (${code}) with message \"${msg}\"`)\n }\n }\n\n static define(routes: Dict<Partial<Record<Method, string | string[]>>>) {\n for (const path in routes) {\n for (const key in routes[path]) {\n const method = key as Method\n for (const name of makeArray(routes[path][method])) {\n Internal.prototype[name] = async function (this: Internal, ...args: any[]) {\n const raw = args.join(', ')\n const url = path.replace(/\\{([^}]+)\\}/g, () => {\n if (!args.length) throw new Error(`too few arguments for ${path}, received ${raw}`)\n return args.shift()\n })\n const config: Quester.AxiosRequestConfig = {}\n if (args.length === 1) {\n if (method === 'GET' || method === 'DELETE') {\n config.params = args[0]\n } else {\n if (method === 'POST' && args[0] instanceof FormData) {\n config.headers = args[0].getHeaders()\n }\n config.data = args[0]\n }\n } else if (args.length === 2 && method !== 'GET' && method !== 'DELETE') {\n config.data = args[0]\n config.params = args[1]\n } else if (args.length > 1) {\n throw new Error(`too many arguments for ${path}, received ${raw}`)\n }\n return this.processReponse(await this.http(method, url, config))\n }\n }\n }\n }\n }\n}\n", "import { BaseResponse, Internal } from '.'\n\n/**\n * Lark defines three types of token:\n * - app_access_token: to access the API in an app (published on App Store).\n * - tenant_access_token: to access the API as an enterprise or a team (tenant).\n * *We commonly use this one*\n * - user_access_token: to access the API as the specific user.\n *\n * @see https://open.larksuite.com/document/ukTMukTMukTM/uMTNz4yM1MjLzUzM\n */\n\nexport interface AppCredentials {\n app_id: string\n app_secret: string\n}\n\nexport interface AppAccessToken extends BaseResponse {\n /** access token */\n app_access_token: string\n /** expire time in seconds. e.g: 7140 (119 minutes) */\n expire: number\n}\n\nexport interface TenantAccessToken extends BaseResponse {\n /** access token */\n tenant_access_token: string\n /** expire time in seconds. e.g: 7140 (119 minutes) */\n expire: number\n}\n\ndeclare module './internal' {\n export interface Internal {\n /**\n * Returns the app_access_token for the bot.\n * @see https://open.larksuite.com/document/ukTMukTMukTM/ukDNz4SO0MjL5QzM/auth-v3/auth/app_access_token_internal\n */\n getAppAccessToken(data: AppCredentials): Promise<AppAccessToken>\n /**\n * Returns the tenant_access_token for the bot.\n * @see https://open.larksuite.com/document/ukTMukTMukTM/ukDNz4SO0MjL5QzM/auth-v3/auth/tenant_access_token_internal\n */\n getTenantAccessToken(data: AppCredentials): Promise<TenantAccessToken>\n }\n}\n\nInternal.define({\n '/auth/v3/app_access_token/internal': {\n POST: 'getAppAccessToken',\n },\n '/auth/v3/tenant_access_token/internal': {\n POST: 'getTenantAccessToken',\n },\n})\n", "import { Dict } from '@satorijs/satori'\n\nimport { Lark } from '.'\nimport { Internal } from './internal'\nimport { Paginated, Pagination } from './utils'\n\ndeclare module '.' {\n export namespace Lark {\n export interface Guild {\n avatar: string\n name: string\n description: string\n i18n_names: Dict<string>\n add_member_permission: string\n share_card_permission: string\n at_all_permission: string\n edit_permission: string\n owner_id_type: string\n owner_id: string\n chat_mode: string\n chat_type: string\n chat_tag: string\n join_message_visibility: string\n leave_message_visibility: string\n membership_approval: string\n moderation_permission: string\n external: boolean\n tenant_key: string\n user_count: string\n bot_count: string\n }\n }\n}\n\nexport interface GuildMember {\n member_id_type: Lark.UserIdType\n member_id: string\n name: string\n tenant_key: string\n}\n\ndeclare module './internal' {\n export interface Internal {\n /** @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/chat/list */\n getCurrentUserGuilds(params: Pagination<{ user_id_type: Lark.UserIdType }>): Promise<{ data: Paginated<Lark.Guild> }>\n /** @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/chat/get */\n getGuildInfo(chat_id: string, params: { user_id_type: string }): Promise<BaseResponse & { data: Lark.Guild }>\n /** @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/chat-members/get */\n getGuildMembers(chat_id: string, params: Pagination<{ member_id_type: Lark.UserIdType }>): Promise<{ data: Paginated<GuildMember> }>\n }\n}\n\nInternal.define({\n '/im/v1/chats': {\n GET: 'getCurrentUserGuilds',\n },\n '/im/v1/chats/{chat_id}': {\n GET: 'getGuildInfo',\n },\n '/im/v1/chats/{chat_id}/members': {\n GET: 'getGuildMembers',\n },\n})\n", "import FormData from 'form-data'\n\nimport { BaseResponse, Internal } from '..'\n\nexport interface Asset<T> extends BaseResponse {\n data: T\n}\n\nexport type Image = Asset<{ image_key: string }>\nexport type File = Asset<{ file_key: string }>\n\ndeclare module '../internal' {\n interface Internal {\n /**\n * Upload an image to obtain an `image_key` for use in sending messages or changing the avatar.\n *\n * The data should contain:\n * - `image_type`: 'message' | 'avatar'\n * - `image': Buffer\n * @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/image/create\n */\n uploadImage(data: FormData): Promise<Image>\n\n /**\n * Upload a file to obtain a `file_key` for use in sending messages.\n *\n * The data should contain:\n * - `file_type`: 'opus' | 'mp4' | 'pdf' | 'xls' | 'ppt' | 'stream'\n * - `opus`: Opus audio file\n * - `mp4`: MP4 video file\n * - `pdf`: PDF file\n * - `xls`: Excel file\n * - `ppt`: PowerPoint file\n * - `stream`: Stream file, or any other file not listed above\n * - `file_name`: string, include extension\n * - `duration`?: number, the duration of audio/video file in milliseconds\n * - `file`: Buffer\n * @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/file/create\n */\n uploadFile(data: FormData): Promise<File>\n }\n}\n\nInternal.define({\n '/im/v1/images': {\n POST: 'uploadImage',\n },\n '/im/v1/files': {\n POST: 'uploadFile',\n },\n})\n", "import { Internal, Lark } from '..'\nimport { Paginated, Pagination } from '../utils'\n\nimport { MessageContent } from './content'\n\nexport * from './content'\nexport * from './asset'\n\nexport type MessageType = 'text' | 'post' | 'image' | 'file' | 'audio' | 'media' | 'sticker' | 'interactive' | 'share_chat' | 'share_user'\n\nexport interface MessageContentMap {\n 'text': MessageContent.Text\n 'post': MessageContent.RichText\n 'image': MessageContent.Image\n 'file': MessageContent.File\n 'audio': MessageContent.Audio\n 'media': MessageContent.Media\n 'sticker': MessageContent.Sticker\n 'share_chat': MessageContent.ShareChat\n 'share_user': MessageContent.ShareUser\n}\n\nexport type MessageContentType<T extends MessageType> = T extends keyof MessageContentMap ? MessageContentMap[T] : any\n\nexport interface Sender extends Lark.UserIdentifiers {\n sender_type: string\n tenant_key: string\n}\nexport interface Mention extends Lark.UserIdentifiers {\n key: string\n name: string\n tenant_key: string\n}\n\ndeclare module '../event' {\n export interface Events {\n /**\n * Receive message event.\n * @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/events/receive\n */\n 'im.message.receive_v1': EventSkeleton<'im.message.receive_v1', {\n sender: {\n sender_id: Lark.UserIds\n sender_type?: string\n tenant_key: string\n }\n message: {\n message_id: string\n root_id: string\n parent_id: string\n create_time: string\n chat_id: string\n chat_type: string\n message_type: MessageType\n content: string\n mentions: {\n key: string\n id: Lark.UserIds\n name: string\n tenant_key: string\n }[]\n }\n }>\n /**\n * Message read event.\n * @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/events/message_read\n */\n 'im.message.message_read_v1': EventSkeleton<'im.message.message_read_v1', {\n reader: {\n reader_id: Lark.UserIds\n read_time: string\n tenant_key: string\n }\n message_id_list: string[]\n }>\n }\n}\n\nexport interface MessagePayload {\n receive_id: string\n content: string\n msg_type: string\n}\n\nexport interface Message {\n /**\n * The id of current message\n *\n * Should be started with `om_`\n */\n message_id: string\n /**\n * The id of the *root* message in reply chains\n * @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/intro#ac79c1c2\n */\n root_id: string\n\n /**\n * The id of the direct *parent* message in reply chains\n * @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/intro#ac79c1c2\n */\n parent_id: string\n\n /**\n * The message type.\n * @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/im-v1/message/create_json\n */\n msg_type: MessageType\n\n /**\n * The timestamp when the message is created in milliseconds.\n */\n create_time: string\n\n /**\n * The timestamp when the message is last updated in milliseconds.\n */\n update_time: string\n\n /**\n * Whether the message is deleted.\n */\n deleted: boolean\n\n /**\n * Whether the message is updated.\n */\n updated: boolean\n\n /**\n * The id of the group / channel the message is sent to.\n */\n chat_id: string\n\n /**\n * The sender of the message.\n * Can be a user or an app.\n */\n sender: Sender\n\n /**\n * The body of the message.\n */\n body: {\n /**\n * The content of the message.\n * Should be a string that represents the JSON object contains the message content.\n */\n content: string\n }\n\n /**\n * Users mentioned in the message.\n */\n mentions: Mention[]\n\n /**\n * The id of the direct *parent* message in `merge and repost` chains.\n */\n upper_message_id: string\n}\n\nexport interface ReadUser {\n user_id_type: Lark.UserIdType\n user_id: string\n timestamp: string\n tenant_key: string\n}\n\ndeclare module '../internal' {\n export interface Internal {\n /** @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/create */\n sendMessage(receive_id_type: Lark.ReceiveIdType, message: MessagePayload): Promise<BaseResponse & { data: Message }>\n /** @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/reply */\n replyMessage(message_id: string, message: MessagePayload): Promise<BaseResponse & { data: Message }>\n /** @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/update */\n updateMessage(message_id: string, message: Omit<MessagePayload, 'receive_id'>): Promise<BaseResponse & { data: Message }>\n /** @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/get */\n getMessage(message_id: string): Promise<BaseResponse & { data: Message }>\n /** @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/delete */\n deleteMessage(message_id: string): Promise<BaseResponse>\n /** @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/read_users */\n getMessageReadUsers(message_id: string, params: Pagination<{ user_id_type: Lark.UserIdType }>): Promise<BaseResponse & { data: Paginated<ReadUser> }>\n }\n}\n\nInternal.define({\n '/im/v1/messages?receive_id_type={receive_id_type}': {\n POST: 'sendMessage',\n },\n '/im/v1/messages/{message_id}/reply': {\n POST: 'replyMessage',\n },\n '/im/v1/messages/{message_id}': {\n GET: 'getMessage',\n PUT: 'updateMessage',\n DELETE: 'deleteMessage',\n },\n '/im/v1/messages/{message_id}/read_users': {\n GET: 'getMessageReadUsers',\n },\n})\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_satori", "import_satori", "mention", "crypto", "bot", "_a", "body", "HttpServer", "import_satori", "FormData", "import_form_data", "import_satori", "logger", "FormData", "logger", "LarkBot"]
7
7
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@satorijs/adapter-lark",
3
3
  "description": "Lark / Feishu Adapter for Satorijs",
4
- "version": "2.1.1",
4
+ "version": "2.1.3",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "files": [
@@ -30,7 +30,7 @@
30
30
  "satori"
31
31
  ],
32
32
  "peerDependencies": {
33
- "@satorijs/satori": "^2.4.0"
33
+ "@satorijs/satori": "^2.6.1"
34
34
  },
35
35
  "dependencies": {
36
36
  "form-data": "^4.0.0"