From 2a6e76249f1372383049ad32b0188ae4ed38c285 Mon Sep 17 00:00:00 2001 From: zhicheng Date: Mon, 8 May 2023 10:25:19 +0800 Subject: [PATCH 1/2] feat: add custom adapator - add adapator for NextJS - add adapator for custom see https://github.com/larksuite/node-sdk/issues/32, https://github.com/larksuite/node-sdk/issues/46 --- adaptor/custom.ts | 43 +++++++++++++++++++++++++++++++++++++++++++ adaptor/nextjs.ts | 22 ++++++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 adaptor/custom.ts create mode 100644 adaptor/nextjs.ts diff --git a/adaptor/custom.ts b/adaptor/custom.ts new file mode 100644 index 0000000..c9019f4 --- /dev/null +++ b/adaptor/custom.ts @@ -0,0 +1,43 @@ +import get from 'lodash.get'; +import { EventDispatcher } from '@node-sdk/dispatcher/event'; +import { CardActionHandler } from '@node-sdk/dispatcher/card'; +import { generateChallenge } from './services/challenge'; + +export const adaptCustom = + ( + dispatcher: EventDispatcher | CardActionHandler, + options?: { + autoChallenge?: boolean; + } + ) => + async (headers, body) => { + if (!body || !headers) { + return; + } + + const data = Object.assign( + Object.create({ + headers: headers, + }), + body + ); + + const autoChallenge = get(options, 'autoChallenge', false); + if (autoChallenge) { + const { isChallenge, challenge } = generateChallenge(data, { + encryptKey: dispatcher.encryptKey, + }); + + if (isChallenge) { + return JSON.stringify(challenge); + } + } + + const value = await dispatcher.invoke(data); + + // event don't need response + if (dispatcher instanceof CardActionHandler) { + return JSON.stringify(value); + } + return ''; + }; \ No newline at end of file diff --git a/adaptor/nextjs.ts b/adaptor/nextjs.ts new file mode 100644 index 0000000..3382e1c --- /dev/null +++ b/adaptor/nextjs.ts @@ -0,0 +1,22 @@ +import get from 'lodash.get'; +import { EventDispatcher } from '@node-sdk/dispatcher/event'; +import { CardActionHandler } from '@node-sdk/dispatcher/card'; +import { adaptCustom } from './custom'; + +export const adaptNextjs = + ( + dispatcher: EventDispatcher | CardActionHandler, + options?: { + autoChallenge?: boolean; + } + ) => + async (req, res) => { + if (!req?.body || !req?.headers) { + return; + } + res.end( + await adaptCustom(dispatcher, { + autoChallenge: get(options, 'autoChallenge', false), + })(req.headers, req.body) + ); + }; \ No newline at end of file From d4b7c9569284b3473440cb37996fa9d2726d4d54 Mon Sep 17 00:00:00 2001 From: zhicheng Date: Mon, 8 May 2023 10:56:56 +0800 Subject: [PATCH 2/2] docs: improve readme --- README.md | 57 +++++++++++++++++++++++++++++++++++++++- README.zh.md | 60 ++++++++++++++++++++++++++++++++++++++++++- doc/request-body.png | Bin 0 -> 29758 bytes 3 files changed, 115 insertions(+), 2 deletions(-) create mode 100644 doc/request-body.png diff --git a/README.md b/README.md index b02582c..e52c3ce 100644 --- a/README.md +++ b/README.md @@ -463,8 +463,63 @@ router.post('/webhook/event', lark.adaptKoaRouter(eventDispatcher)); server.use(router.routes()); server.listen(3000); ```` +#### Combined with NextJS +```typescript +// pages/api/webhook.ts +import * as lark from '@larksuiteoapi/node-sdk'; + +const client = new lark.Client({ + appId: 'xxxxxxxxxxxxxxxxxxxxxxx', + appSecret: 'xxxxxxxxxxxxxxxxxxxxxxxxxxx', + appType: lark.AppType.SelfBuild +}); + +const eventDispatcher = new lark.EventDispatcher({ + verificationToken: 'xxxxxxxxxxxxxxxxxxxxxxxxxxx', + encryptKey: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', +}).register({ + 'im.message.receive_v1': async (data) => { + const chatId = data.message.chat_id; + + const res = await client.im.message.create({ + params: { + receive_id_type: 'chat_id', + }, + data: { + receive_id: chatId, + content: JSON.stringify({text: 'hello world'}), + msg_type: 'text' + }, + }); + return res; + } +}); + +export default async (req: NextApiRequest, res: NextApiResponse) => { + await lark.adaptNextjs(eventDispatcher, { + autoChallenge: true, + })(req, res); +}; +``` + #### Custom adapter -If you want to adapt to services written by other libraries, you currently need to encapsulate the corresponding adapter yourself. Pass the received event data to the invoke method of the instantiated `eventDispatcher` for event processing: +If you need to adapt a service written in another library, you can refer to the following approach to call the encapsulated custom adapter. + +```typescript +// Taking NextJS as an example: +export default async (req: NextApiRequest, res: NextApiResponse) => { + const result = await lark.adaptCustom(eventDispatcher, { + autoChallenge: true, + })(req.headers, req.body); + res.end(result); +}; +``` + +If the call fails or an error occurs, please check if the req.headers and req.body formats match the following image by setting breakpoints: + +![](doc/request-body.png) + +If you need to encapsulate it yourself, you can refer to the following logic. Pass the received event data to the invoke method of the instantiated `eventDispatcher` for event processing: ```typescript const data = server.getData(); diff --git a/README.zh.md b/README.zh.md index 311da2c..098cf66 100644 --- a/README.zh.md +++ b/README.zh.md @@ -463,10 +463,68 @@ router.post('/webhook/event', lark.adaptKoaRouter(eventDispatcher)); server.use(router.routes()); server.listen(3000); ``` +#### 和NextJS结合 + +```typescript +// pages/api/webhook.ts +import * as lark from '@larksuiteoapi/node-sdk'; + +const client = new lark.Client({ + appId: 'xxxxxxxxxxxxxxxxxxxxxxx', + appSecret: 'xxxxxxxxxxxxxxxxxxxxxxxxxxx', + appType: lark.AppType.SelfBuild +}); + +const eventDispatcher = new lark.EventDispatcher({ + verificationToken: 'xxxxxxxxxxxxxxxxxxxxxxxxxxx', + encryptKey: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', +}).register({ + 'im.message.receive_v1': async (data) => { + const chatId = data.message.chat_id; + + const res = await client.im.message.create({ + params: { + receive_id_type: 'chat_id', + }, + data: { + receive_id: chatId, + content: JSON.stringify({text: 'hello world'}), + msg_type: 'text' + }, + }); + return res; + } +}); + +export default async (req: NextApiRequest, res: NextApiResponse) => { + await lark.adaptNextjs(eventDispatcher, { + autoChallenge: true, + })(req, res); +}; +``` + #### 自定义适配器 -如果要适配其它库编写的服务,目前需要自己来封装相应的适配器。将接收到的事件数据传递给实例化的`eventDispatcher`的invoke方法进行事件的处理即可: + +如果要适配其它库编写的服务,可以参考下述方式来调用已经封装的自定义适配器 + +```typescript +// 以 NextJS 为例 +export default async (req: NextApiRequest, res: NextApiResponse) => { + const result = await lark.adaptCustom(eventDispatcher, { + autoChallenge: true, + })(req.headers, req.body); + res.end(result); +}; +``` + +如果调用失败或者错误,请断点检查 `req.headers` 和 `req.body` 格式是否和下图中一致 +![](doc/request-body.png) + + +如果需要自行封装,可参考下述逻辑,将接收到的事件数据传递给实例化的 `eventDispatcher` 的 invoke 方法进行事件的处理即可: ```typescript +// 注意这是伪代码 const data = server.getData(); const result = await dispatcher.invoke(data); server.sendResult(result); diff --git a/doc/request-body.png b/doc/request-body.png new file mode 100644 index 0000000000000000000000000000000000000000..a68cee34f3dadcf965d32ce1345aadf2f2a22787 GIT binary patch literal 29758 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 literal 0 HcmV?d00001