@krischoichoi/channel-lark 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +114 -0
- package/lib/adapter.d.ts +128 -0
- package/lib/adapter.d.ts.map +1 -0
- package/lib/adapter.js +347 -0
- package/lib/adapter.js.map +1 -0
- package/lib/auth/device-authorization.d.ts +12 -0
- package/lib/auth/device-authorization.d.ts.map +1 -0
- package/lib/auth/device-authorization.js +169 -0
- package/lib/auth/device-authorization.js.map +1 -0
- package/lib/card.d.ts +124 -0
- package/lib/card.d.ts.map +1 -0
- package/lib/card.js +347 -0
- package/lib/card.js.map +1 -0
- package/lib/config.d.ts +103 -0
- package/lib/config.d.ts.map +1 -0
- package/lib/config.js +60 -0
- package/lib/config.js.map +1 -0
- package/lib/definition.d.ts +74 -0
- package/lib/definition.d.ts.map +1 -0
- package/lib/definition.js +190 -0
- package/lib/definition.js.map +1 -0
- package/lib/inbound.d.ts +41 -0
- package/lib/inbound.d.ts.map +1 -0
- package/lib/inbound.js +102 -0
- package/lib/inbound.js.map +1 -0
- package/lib/index.d.ts +58 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +104 -0
- package/lib/index.js.map +1 -0
- package/lib/lark-sdk-upstream.d.ts +128 -0
- package/lib/lark-sdk-upstream.d.ts.map +1 -0
- package/lib/lark-sdk-upstream.js +339 -0
- package/lib/lark-sdk-upstream.js.map +1 -0
- package/lib/manifest.d.ts +23 -0
- package/lib/manifest.d.ts.map +1 -0
- package/lib/manifest.js +36 -0
- package/lib/manifest.js.map +1 -0
- package/lib/mapper.d.ts +47 -0
- package/lib/mapper.d.ts.map +1 -0
- package/lib/mapper.js +223 -0
- package/lib/mapper.js.map +1 -0
- package/lib/media-hydrator.d.ts +55 -0
- package/lib/media-hydrator.d.ts.map +1 -0
- package/lib/media-hydrator.js +172 -0
- package/lib/media-hydrator.js.map +1 -0
- package/lib/openapi-outbound.d.ts +216 -0
- package/lib/openapi-outbound.d.ts.map +1 -0
- package/lib/openapi-outbound.js +384 -0
- package/lib/openapi-outbound.js.map +1 -0
- package/lib/outbound.d.ts +21 -0
- package/lib/outbound.d.ts.map +1 -0
- package/lib/outbound.js +93 -0
- package/lib/outbound.js.map +1 -0
- package/lib/upstream/media-port.d.ts +154 -0
- package/lib/upstream/media-port.d.ts.map +1 -0
- package/lib/upstream/media-port.js +168 -0
- package/lib/upstream/media-port.js.map +1 -0
- package/lib/upstream.d.ts +119 -0
- package/lib/upstream.d.ts.map +1 -0
- package/lib/upstream.js +2 -0
- package/lib/upstream.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lark-sdk-upstream.js","sourceRoot":"","sources":["../src/lark-sdk-upstream.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface LarkUpstreamManifest {
|
|
2
|
+
reference: string;
|
|
3
|
+
testedVersion: string;
|
|
4
|
+
versionRange: string;
|
|
5
|
+
strategy: 'sdk' | 'source';
|
|
6
|
+
}
|
|
7
|
+
/** Official SDK consumed by the upstream driver, when one is used. */
|
|
8
|
+
export interface LarkSdkManifest {
|
|
9
|
+
/** npm package name of the official SDK. */
|
|
10
|
+
package: string;
|
|
11
|
+
/** Version the adapter was verified against. */
|
|
12
|
+
testedVersion: string;
|
|
13
|
+
}
|
|
14
|
+
export interface LarkManifest {
|
|
15
|
+
id: 'lark';
|
|
16
|
+
adapterVersion: string;
|
|
17
|
+
upstream: LarkUpstreamManifest;
|
|
18
|
+
sdk: LarkSdkManifest | undefined;
|
|
19
|
+
status: 'tested';
|
|
20
|
+
}
|
|
21
|
+
/** Current manifest: inbound via the official @larksuiteoapi/node-sdk. */
|
|
22
|
+
export declare const manifest: LarkManifest;
|
|
23
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,KAAK,GAAG,QAAQ,CAAC;CAC5B;AAED,sEAAsE;AACtE,MAAM,WAAW,eAAe;IAC9B,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,GAAG,EAAE,eAAe,GAAG,SAAS,CAAC;IACjC,MAAM,EAAE,QAAQ,CAAC;CAClB;AAED,0EAA0E;AAC1E,eAAO,MAAM,QAAQ,EAAE,YActB,CAAC"}
|
package/lib/manifest.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lark upstream compatibility manifest.
|
|
3
|
+
*
|
|
4
|
+
* Records the upstream reference and tested version so `channels doctor` and
|
|
5
|
+
* the upgrade pipeline can govern compatibility without re-verifying by hand.
|
|
6
|
+
*
|
|
7
|
+
* Strategy: 'sdk' — inbound rides the official `@larksuiteoapi/node-sdk`
|
|
8
|
+
* (WebSocket long-connection, `im.message.receive_v1` + `card.action.trigger`)
|
|
9
|
+
* and outbound rides the same SDK's OpenAPI client (`im.v1.message.create` /
|
|
10
|
+
* `patch`, media uploads, CardKit 2.0 card entities + native streaming).
|
|
11
|
+
* There is no self-hosted gateway.
|
|
12
|
+
*
|
|
13
|
+
* Status 'tested' is justified by the Channel Contract + fixture tests plus
|
|
14
|
+
* the official-SDK offline tests (fake WS client, real EventDispatcher) —
|
|
15
|
+
* fully offline. Live verification against a real Lark app (AppId/AppSecret),
|
|
16
|
+
* its published permissions and event subscriptions is a manual step and is
|
|
17
|
+
* LIVE-REQUIRED before the adapter may be claimed live-tested.
|
|
18
|
+
*/
|
|
19
|
+
import pkg from '../package.json' with { type: 'json' };
|
|
20
|
+
/** Current manifest: inbound via the official @larksuiteoapi/node-sdk. */
|
|
21
|
+
export const manifest = {
|
|
22
|
+
id: 'lark',
|
|
23
|
+
adapterVersion: pkg.version,
|
|
24
|
+
upstream: {
|
|
25
|
+
reference: 'larksuite/node-sdk (https://github.com/larksuite/node-sdk)',
|
|
26
|
+
testedVersion: '1.73.1',
|
|
27
|
+
versionRange: '1.73.1',
|
|
28
|
+
strategy: 'sdk',
|
|
29
|
+
},
|
|
30
|
+
sdk: {
|
|
31
|
+
package: '@larksuiteoapi/node-sdk',
|
|
32
|
+
testedVersion: '1.73.1',
|
|
33
|
+
},
|
|
34
|
+
status: 'tested',
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,GAAG,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAyBxD,0EAA0E;AAC1E,MAAM,CAAC,MAAM,QAAQ,GAAiB;IACpC,EAAE,EAAE,MAAM;IACV,cAAc,EAAE,GAAG,CAAC,OAAO;IAC3B,QAAQ,EAAE;QACR,SAAS,EAAE,4DAA4D;QACvE,aAAa,EAAE,QAAQ;QACvB,YAAY,EAAE,QAAQ;QACtB,QAAQ,EAAE,KAAK;KAChB;IACD,GAAG,EAAE;QACH,OAAO,EAAE,yBAAyB;QAClC,aAAa,EAAE,QAAQ;KACxB;IACD,MAAM,EAAE,QAAQ;CACjB,CAAC"}
|
package/lib/mapper.d.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure payload mapping (no I/O): platform raw payloads → Channel Contract,
|
|
3
|
+
* and outbound Channel messages → lark text/media payloads.
|
|
4
|
+
*
|
|
5
|
+
* Raw payloads only ever ride along in `event.raw` for debugging — core and
|
|
6
|
+
* the harness bridge never depend on their shape (red line 6).
|
|
7
|
+
*
|
|
8
|
+
* Lark canonical raw shapes are deliberately simple (produced by
|
|
9
|
+
* `mapSdkMessageEvent` / `mapSdkCardAction` from official SDK events), e.g.:
|
|
10
|
+
* ```json
|
|
11
|
+
* { "type": "text", "msgId": "msg_1", "senderId": "ou_123",
|
|
12
|
+
* "conversationId": "oc_456", "threadId": "om_789", "content": "hello" }
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* The mapper PRESERVES both `conversationId` and the optional `threadId`
|
|
16
|
+
* (execution plan Task 12.2): when a raw payload carries a `threadId`, the
|
|
17
|
+
* mapped `conversation.threadId` is set, so the Harness session key becomes
|
|
18
|
+
* `channel:account:conversation:thread` and threads isolate sessions.
|
|
19
|
+
*/
|
|
20
|
+
import type { AccountId, ChannelId, MessageReceived, InteractionReceived, OutboundMessage } from '@krischoichoi/channel-core';
|
|
21
|
+
export interface LarkInboundMeta {
|
|
22
|
+
channel: ChannelId;
|
|
23
|
+
accountId: AccountId;
|
|
24
|
+
}
|
|
25
|
+
/** Stable hash for ids when the SDK event omits a msgId. */
|
|
26
|
+
export declare function simpleHash(input: string): string;
|
|
27
|
+
/** Map one raw lark message into the stable channel event shape. */
|
|
28
|
+
export declare function mapInbound(raw: unknown, meta: LarkInboundMeta): MessageReceived;
|
|
29
|
+
/**
|
|
30
|
+
* Map one raw lark interaction callback (e.g. an editable-card button press)
|
|
31
|
+
* into an `interaction.received` channel event (Task 12.3). The conversation
|
|
32
|
+
* ref preserves `conversationId` + optional `threadId` exactly like messages.
|
|
33
|
+
*/
|
|
34
|
+
export declare function mapInteraction(raw: unknown, meta: LarkInboundMeta): InteractionReceived;
|
|
35
|
+
/** Outbound lark payload; buffered strategy → single text message. */
|
|
36
|
+
export interface LarkTextPayload {
|
|
37
|
+
to: string;
|
|
38
|
+
type: 'text';
|
|
39
|
+
content: string;
|
|
40
|
+
}
|
|
41
|
+
/** Convert an outbound channel message into a lark text payload. */
|
|
42
|
+
export declare function toTextPayload(target: {
|
|
43
|
+
conversationId: string;
|
|
44
|
+
}, message: OutboundMessage): LarkTextPayload;
|
|
45
|
+
/** Dedup identity for raw payloads (webhook retries share one msgId/eventId). */
|
|
46
|
+
export declare function dedupKey(raw: unknown): string;
|
|
47
|
+
//# sourceMappingURL=mapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapper.d.ts","sourceRoot":"","sources":["../src/mapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EACV,SAAS,EACT,SAAS,EAOT,eAAe,EACf,mBAAmB,EACnB,eAAe,EAIhB,MAAM,4BAA4B,CAAC;AAcpC,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,SAAS,CAAC;IACnB,SAAS,EAAE,SAAS,CAAC;CACtB;AAoCD,4DAA4D;AAC5D,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMhD;AAyBD,oEAAoE;AACpE,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,GAAG,eAAe,CAwB/E;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,GAAG,mBAAmB,CAgBvF;AAsDD,sEAAsE;AACtE,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,oEAAoE;AACpE,wBAAgB,aAAa,CAAC,MAAM,EAAE;IAAE,cAAc,EAAE,MAAM,CAAA;CAAE,EAAE,OAAO,EAAE,eAAe,GAAG,eAAe,CAkC3G;AAED,iFAAiF;AACjF,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAU7C"}
|
package/lib/mapper.js
ADDED
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { ChannelError, textParts } from '@krischoichoi/channel-core';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
/**
|
|
4
|
+
* A genuine http(s) URL (the only string allowed in the `url` carrier).
|
|
5
|
+
* Anything else (image_key, file_key, mediaId, …) is a
|
|
6
|
+
* platform-opaque handle and must be mapped into `resourceRef` instead.
|
|
7
|
+
*/
|
|
8
|
+
function isHttpUrl(value) {
|
|
9
|
+
return typeof value === 'string' && /^https?:\/\//i.test(value);
|
|
10
|
+
}
|
|
11
|
+
const larkRawSchema = z.object({
|
|
12
|
+
type: z.string().optional(),
|
|
13
|
+
msgId: z.string().optional(),
|
|
14
|
+
/** Webhook event id; used as a dedup fallback when `msgId` is absent. */
|
|
15
|
+
eventId: z.string().optional(),
|
|
16
|
+
senderId: z.string().optional(),
|
|
17
|
+
conversationId: z.string().optional(),
|
|
18
|
+
/** Platform chat kind from im.message.receive_v1. */
|
|
19
|
+
chatType: z.enum(['p2p', 'group']),
|
|
20
|
+
/** Optional thread id within the conversation (e.g. a reply to a topic). */
|
|
21
|
+
threadId: z.string().optional(),
|
|
22
|
+
content: z.string().optional(),
|
|
23
|
+
picUrl: z.string().optional(),
|
|
24
|
+
mediaUrl: z.string().optional(),
|
|
25
|
+
durationMs: z.number().optional(),
|
|
26
|
+
title: z.string().optional(),
|
|
27
|
+
/** Interaction callback fields (card button press). */
|
|
28
|
+
interactionId: z.string().optional(),
|
|
29
|
+
action: z.string().optional(),
|
|
30
|
+
value: z.unknown().optional(),
|
|
31
|
+
}).passthrough();
|
|
32
|
+
function parseLarkRaw(raw) {
|
|
33
|
+
const parsed = larkRawSchema.safeParse(raw);
|
|
34
|
+
if (!parsed.success) {
|
|
35
|
+
const issue = parsed.error.issues[0];
|
|
36
|
+
const detail = issue ? `${issue.path.join('.') || '<root>'}: ${issue.message}` : 'unknown validation error';
|
|
37
|
+
throw new ChannelError('CHANNEL_ERROR', `lark inbound payload is invalid: ${detail}`);
|
|
38
|
+
}
|
|
39
|
+
return parsed.data;
|
|
40
|
+
}
|
|
41
|
+
/** Stable hash for ids when the SDK event omits a msgId. */
|
|
42
|
+
export function simpleHash(input) {
|
|
43
|
+
let hash = 0;
|
|
44
|
+
for (let i = 0; i < input.length; i += 1) {
|
|
45
|
+
hash = (hash * 31 + input.charCodeAt(i)) | 0;
|
|
46
|
+
}
|
|
47
|
+
return Math.abs(hash).toString(36);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Conversation kind from the platform event. Feishu uses `oc_` chat ids for
|
|
51
|
+
* both p2p and group conversations, so the id prefix is not an identity fact.
|
|
52
|
+
*/
|
|
53
|
+
function conversationTypeFor(value) {
|
|
54
|
+
return value.chatType === 'p2p' ? 'dm' : 'group';
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Shared conversation ref builder: preserves `conversationId` and sets
|
|
58
|
+
* `threadId` whenever the raw payload carries one.
|
|
59
|
+
*/
|
|
60
|
+
function conversationFor(value, conversationId) {
|
|
61
|
+
const conversation = {
|
|
62
|
+
id: conversationId,
|
|
63
|
+
type: conversationTypeFor(value),
|
|
64
|
+
};
|
|
65
|
+
if (value.threadId) {
|
|
66
|
+
conversation.threadId = value.threadId;
|
|
67
|
+
}
|
|
68
|
+
return conversation;
|
|
69
|
+
}
|
|
70
|
+
/** Map one raw lark message into the stable channel event shape. */
|
|
71
|
+
export function mapInbound(raw, meta) {
|
|
72
|
+
const value = parseLarkRaw(raw);
|
|
73
|
+
const sender = (value.senderId ?? 'unknown');
|
|
74
|
+
// Lark payloads carry a conversation id; fall back to the sender when the
|
|
75
|
+
// SDK event omits it (direct/one-off payloads).
|
|
76
|
+
const conversationId = (value.conversationId ?? sender);
|
|
77
|
+
const messageId = value.msgId
|
|
78
|
+
? value.msgId
|
|
79
|
+
: `lk-${simpleHash(`${sender}:${value.content ?? ''}:${value.type ?? 'unknown'}`)}`;
|
|
80
|
+
return {
|
|
81
|
+
type: 'message.received',
|
|
82
|
+
channel: meta.channel,
|
|
83
|
+
accountId: meta.accountId,
|
|
84
|
+
conversation: conversationFor(value, conversationId),
|
|
85
|
+
sender: { id: sender },
|
|
86
|
+
message: {
|
|
87
|
+
id: messageId,
|
|
88
|
+
content: partsFor(value),
|
|
89
|
+
createdAt: Date.now(),
|
|
90
|
+
},
|
|
91
|
+
raw,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Map one raw lark interaction callback (e.g. an editable-card button press)
|
|
96
|
+
* into an `interaction.received` channel event (Task 12.3). The conversation
|
|
97
|
+
* ref preserves `conversationId` + optional `threadId` exactly like messages.
|
|
98
|
+
*/
|
|
99
|
+
export function mapInteraction(raw, meta) {
|
|
100
|
+
const value = parseLarkRaw(raw);
|
|
101
|
+
const sender = (value.senderId ?? 'unknown');
|
|
102
|
+
const conversationId = (value.conversationId ?? sender);
|
|
103
|
+
return {
|
|
104
|
+
type: 'interaction.received',
|
|
105
|
+
channel: meta.channel,
|
|
106
|
+
accountId: meta.accountId,
|
|
107
|
+
conversation: conversationFor(value, conversationId),
|
|
108
|
+
sender: { id: sender },
|
|
109
|
+
interactionId: value.interactionId ?? '',
|
|
110
|
+
action: value.action ?? '',
|
|
111
|
+
value: value.value,
|
|
112
|
+
raw,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
function partsFor(raw) {
|
|
116
|
+
switch (raw.type) {
|
|
117
|
+
case 'text':
|
|
118
|
+
return textParts(raw.content ?? '');
|
|
119
|
+
case 'image':
|
|
120
|
+
case 'picture': {
|
|
121
|
+
// Per the url/resourceRef rule a Lark image locator is an opaque image_key (NOT a
|
|
122
|
+
// URL): it MUST live in `resourceRef`, never `url` — `url` is reserved
|
|
123
|
+
// for genuine http(s) URLs. The SDK path sets picUrl = image_key
|
|
124
|
+
// (opaque → resourceRef).
|
|
125
|
+
const locator = raw.picUrl ?? raw.mediaUrl;
|
|
126
|
+
const part = { type: 'image', alt: raw.title };
|
|
127
|
+
if (isHttpUrl(locator))
|
|
128
|
+
part.url = locator;
|
|
129
|
+
else if (locator)
|
|
130
|
+
part.resourceRef = locator;
|
|
131
|
+
return [part];
|
|
132
|
+
}
|
|
133
|
+
case 'audio':
|
|
134
|
+
case 'voice': {
|
|
135
|
+
// Per plan 28 the SDK audio body carries an opaque file_key; if it is
|
|
136
|
+
// not a genuine http(s) URL it maps to resourceRef (resolved later by the
|
|
137
|
+
// media port), mirroring the image-key rule (plan 9).
|
|
138
|
+
const locator = raw.mediaUrl;
|
|
139
|
+
const part = { type: 'audio', durationMs: raw.durationMs };
|
|
140
|
+
if (isHttpUrl(locator))
|
|
141
|
+
part.url = locator;
|
|
142
|
+
else if (locator)
|
|
143
|
+
part.resourceRef = locator;
|
|
144
|
+
return [part];
|
|
145
|
+
}
|
|
146
|
+
case 'video': {
|
|
147
|
+
const locator = raw.mediaUrl;
|
|
148
|
+
const part = { type: 'video', durationMs: raw.durationMs };
|
|
149
|
+
if (isHttpUrl(locator))
|
|
150
|
+
part.url = locator;
|
|
151
|
+
else if (locator)
|
|
152
|
+
part.resourceRef = locator;
|
|
153
|
+
return [part];
|
|
154
|
+
}
|
|
155
|
+
case 'file': {
|
|
156
|
+
// Per plan 28/84 the SDK file body carries an opaque file_key (currently
|
|
157
|
+
// routed through raw.mediaUrl by lark-sdk-upstream.ts). A genuine
|
|
158
|
+
// http(s) URL stays in url (plan 9); anything else maps to resourceRef,
|
|
159
|
+
// which the media port resolves into localData before emit.
|
|
160
|
+
const locator = raw.mediaUrl;
|
|
161
|
+
const part = { type: 'file', name: raw.title };
|
|
162
|
+
if (isHttpUrl(locator))
|
|
163
|
+
part.url = locator;
|
|
164
|
+
else if (locator)
|
|
165
|
+
part.resourceRef = locator;
|
|
166
|
+
return [part];
|
|
167
|
+
}
|
|
168
|
+
case 'link':
|
|
169
|
+
return textParts(raw.title ?? raw.content ?? '');
|
|
170
|
+
default:
|
|
171
|
+
return [{ type: 'unsupported', reason: `unknown lark type '${raw.type ?? 'undefined'}'` }];
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/** Convert an outbound channel message into a lark text payload. */
|
|
175
|
+
export function toTextPayload(target, message) {
|
|
176
|
+
const segments = [];
|
|
177
|
+
if (message.text)
|
|
178
|
+
segments.push(message.text);
|
|
179
|
+
if (message.parts) {
|
|
180
|
+
for (const part of message.parts) {
|
|
181
|
+
switch (part.type) {
|
|
182
|
+
case 'text':
|
|
183
|
+
segments.push(part.text);
|
|
184
|
+
break;
|
|
185
|
+
case 'image':
|
|
186
|
+
segments.push(part.alt ? `[image: ${part.alt}]` : '[image]');
|
|
187
|
+
break;
|
|
188
|
+
case 'audio':
|
|
189
|
+
segments.push('[audio]');
|
|
190
|
+
break;
|
|
191
|
+
case 'video':
|
|
192
|
+
segments.push('[video]');
|
|
193
|
+
break;
|
|
194
|
+
case 'file':
|
|
195
|
+
segments.push(part.name ? `[file: ${part.name}]` : '[file]');
|
|
196
|
+
break;
|
|
197
|
+
case 'location':
|
|
198
|
+
segments.push(`[location: ${part.latitude},${part.longitude}]`);
|
|
199
|
+
break;
|
|
200
|
+
case 'card':
|
|
201
|
+
segments.push(`[card: ${part.kind}]`);
|
|
202
|
+
break;
|
|
203
|
+
case 'unsupported':
|
|
204
|
+
segments.push('[unsupported content]');
|
|
205
|
+
break;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return { to: target.conversationId, type: 'text', content: segments.join('') };
|
|
210
|
+
}
|
|
211
|
+
/** Dedup identity for raw payloads (webhook retries share one msgId/eventId). */
|
|
212
|
+
export function dedupKey(raw) {
|
|
213
|
+
const value = parseLarkRaw(raw);
|
|
214
|
+
// A card has one message id but may expose multiple actions (for example a
|
|
215
|
+
// multi-select question). The SDK-normalized action event therefore carries
|
|
216
|
+
// a per-button eventId; preferring it preserves distinct presses while a
|
|
217
|
+
// replay of the same press remains idempotent.
|
|
218
|
+
if (value.type === 'interaction') {
|
|
219
|
+
return value.eventId ?? value.interactionId ?? `lk-${simpleHash(JSON.stringify(value))}`;
|
|
220
|
+
}
|
|
221
|
+
return value.msgId ?? value.eventId ?? `lk-${simpleHash(JSON.stringify(value))}`;
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=mapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapper.js","sourceRoot":"","sources":["../src/mapper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { MessageReceived } from '@krischoichoi/channel-core';
|
|
2
|
+
import { type LarkMediaPort } from './upstream/media-port.js';
|
|
3
|
+
/** Avoid multiplying the 100 MiB per-resource bound across one message. */
|
|
4
|
+
export declare const DEFAULT_MEDIA_HYDRATION_CONCURRENCY = 2;
|
|
5
|
+
export interface MediaHydratorOptions {
|
|
6
|
+
/** Media port used to resolve binary resourceRefs into bytes. */
|
|
7
|
+
mediaPort?: LarkMediaPort;
|
|
8
|
+
/** Cancellation signal (the adapter context signal). */
|
|
9
|
+
signal?: AbortSignal;
|
|
10
|
+
/** Injectable logger (adapter context logger). */
|
|
11
|
+
logger?: {
|
|
12
|
+
debug(...args: unknown[]): void;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Optional hard byte cap for one resource download. Defaults to the official
|
|
16
|
+
* 100 MiB platform limit and is enforced while the SDK stream is consumed.
|
|
17
|
+
*/
|
|
18
|
+
maxBytes?: number;
|
|
19
|
+
/** Maximum number of media downloads active for one inbound message. */
|
|
20
|
+
maxConcurrency?: number;
|
|
21
|
+
}
|
|
22
|
+
export declare class MediaHydrator {
|
|
23
|
+
private readonly options;
|
|
24
|
+
constructor(options: MediaHydratorOptions);
|
|
25
|
+
/**
|
|
26
|
+
* Hydrate image, file, audio and video parts in place on the given event
|
|
27
|
+
* using the event's own message id as the messageResource resolution
|
|
28
|
+
* context. Never throws: a download failure marks the part instead of
|
|
29
|
+
* blocking the message.
|
|
30
|
+
*/
|
|
31
|
+
hydrateMedia(event: MessageReceived): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* @deprecated use {@link MediaHydrator.hydrateMedia} — this alias covers
|
|
34
|
+
* all four binary kinds and is kept so pre-§23-A4 call sites keep working.
|
|
35
|
+
*/
|
|
36
|
+
hydrateImages(event: MessageReceived): Promise<void>;
|
|
37
|
+
private hydratePart;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* @deprecated use {@link MediaHydrator} — kept under the legacy name so
|
|
41
|
+
* pre-§23-A4 imports (`new ImageHydrator(...)`) keep working.
|
|
42
|
+
*/
|
|
43
|
+
export declare const ImageHydrator: typeof MediaHydrator;
|
|
44
|
+
/**
|
|
45
|
+
* @deprecated use {@link MediaHydratorOptions} — legacy alias for the
|
|
46
|
+
* pre-§23-A4 options shape.
|
|
47
|
+
*/
|
|
48
|
+
export type ImageHydratorOptions = MediaHydratorOptions;
|
|
49
|
+
/**
|
|
50
|
+
* Map a hydration failure to a stable de-identified code. Platform-plumbing
|
|
51
|
+
* errors (SDK API errors / network) map to download-failed; a genuinely
|
|
52
|
+
* absent resource maps to resource-unavailable.
|
|
53
|
+
*/
|
|
54
|
+
export declare function classifyIngressFailure(error: unknown): 'download-failed' | 'resource-unavailable' | 'too-large';
|
|
55
|
+
//# sourceMappingURL=media-hydrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-hydrator.d.ts","sourceRoot":"","sources":["../src/media-hydrator.ts"],"names":[],"mappings":"AA+CA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,0BAA0B,CAAC;AAElC,2EAA2E;AAC3E,eAAO,MAAM,mCAAmC,IAAI,CAAC;AAErD,MAAM,WAAW,oBAAoB;IACnC,iEAAiE;IACjE,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,wDAAwD;IACxD,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,kDAAkD;IAClD,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;KAAE,CAAC;IAC7C;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,oBAAoB;IAE1D;;;;;OAKG;IACG,YAAY,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBzD;;;OAGG;IACG,aAAa,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;YAI5C,WAAW;CAiD1B;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,sBAAgB,CAAC;AAE3C;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAAG,oBAAoB,CAAC;AAExD;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,OAAO,GACb,iBAAiB,GAAG,sBAAsB,GAAG,WAAW,CAoB1D"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Media hydration for inbound messages (plan section 28 / 79A Lark; section
|
|
3
|
+
* 23-A4 extends it from image/file to ALL four binary kinds).
|
|
4
|
+
*
|
|
5
|
+
* After a raw payload is mapped to a MessageReceived, the adapter hydrates
|
|
6
|
+
* every binary part (image, generic file, audio AND video) that carries a
|
|
7
|
+
* platform-opaque resourceRef (a Lark image_key / file_key) by resolving it
|
|
8
|
+
* through the injected LarkMediaPort into real bytes (localData + mimeType).
|
|
9
|
+
* The messageId needed for
|
|
10
|
+
* messageResource.get(message_id, file_key) comes from the invocation
|
|
11
|
+
* context (the event message id) - it is NOT persisted into the part (plan
|
|
12
|
+
* section 28 prefers the hydration invocation context over persisting it).
|
|
13
|
+
*
|
|
14
|
+
* The per-kind `type` fed to the port mirrors the resource kind: the official
|
|
15
|
+
* `message.resource` API documents its scope as 音频、视频、图片和文件 (audio,
|
|
16
|
+
* video, image and file — see the SDK-embedded doc statement), and the SDK
|
|
17
|
+
* `type` query param is typed `string`, so audio/video file_keys download
|
|
18
|
+
* through the SAME seam as image/file (plan section 23-A4). Platform-level
|
|
19
|
+
* resource limits (<= 100 MB; no stickers; no merged-forward sub-messages or
|
|
20
|
+
* card-message resources, error 234043) surface as port failures that this
|
|
21
|
+
* module maps to a stable ingressFailure — the locator is never fabricated
|
|
22
|
+
* into bytes.
|
|
23
|
+
*
|
|
24
|
+
* Generic files (M7A): the type fed to the port is 'file', and the resolved
|
|
25
|
+
* content-disposition filename is copied into part.name so the Harness bridge
|
|
26
|
+
* stores/extracts the attachment without a second platform round-trip.
|
|
27
|
+
*
|
|
28
|
+
* The APPLICATION step reuses core's protocol-neutral `applyHydrationResult`
|
|
29
|
+
* (plan section 6.3): it owns the byte cap ('too-large'), the AbortSignal
|
|
30
|
+
* handling, the localData/size/mime/name merge and the success-clears-failure
|
|
31
|
+
* rule. Failure CLASSIFICATION stays lark-specific (`classifyIngressFailure`)
|
|
32
|
+
* so genuinely absent resources ('not found' / 234043-style platform errors)
|
|
33
|
+
* map to 'resource-unavailable' while plumbing/network errors map to
|
|
34
|
+
* 'download-failed' — core's generic mapping would collapse both to
|
|
35
|
+
* 'download-failed' and lose that distinction.
|
|
36
|
+
*
|
|
37
|
+
* On hydration failure the part keeps its resourceRef (so the platform
|
|
38
|
+
* locator survives for a later retry) and records a stable ingressFailure;
|
|
39
|
+
* text delivery is never blocked (plan section 79A DoD).
|
|
40
|
+
*/
|
|
41
|
+
import { applyHydrationResult, isHydratableBinaryPart, toIngressFailureCode, } from '@krischoichoi/channel-core';
|
|
42
|
+
import { LARK_MESSAGE_RESOURCE_MAX_BYTES, } from './upstream/media-port.js';
|
|
43
|
+
/** Avoid multiplying the 100 MiB per-resource bound across one message. */
|
|
44
|
+
export const DEFAULT_MEDIA_HYDRATION_CONCURRENCY = 2;
|
|
45
|
+
export class MediaHydrator {
|
|
46
|
+
options;
|
|
47
|
+
constructor(options) {
|
|
48
|
+
this.options = options;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Hydrate image, file, audio and video parts in place on the given event
|
|
52
|
+
* using the event's own message id as the messageResource resolution
|
|
53
|
+
* context. Never throws: a download failure marks the part instead of
|
|
54
|
+
* blocking the message.
|
|
55
|
+
*/
|
|
56
|
+
async hydrateMedia(event) {
|
|
57
|
+
const port = this.options.mediaPort;
|
|
58
|
+
if (!port)
|
|
59
|
+
return;
|
|
60
|
+
const parts = event.message.content;
|
|
61
|
+
if (!Array.isArray(parts))
|
|
62
|
+
return;
|
|
63
|
+
const messageId = String(event.message.id);
|
|
64
|
+
const maxConcurrency = normalizeConcurrency(this.options.maxConcurrency);
|
|
65
|
+
let nextIndex = 0;
|
|
66
|
+
const worker = async () => {
|
|
67
|
+
for (;;) {
|
|
68
|
+
const index = nextIndex++;
|
|
69
|
+
if (index >= parts.length)
|
|
70
|
+
return;
|
|
71
|
+
await this.hydratePart(port, parts[index], messageId);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
await Promise.all(Array.from({ length: Math.min(maxConcurrency, parts.length) }, () => worker()));
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* @deprecated use {@link MediaHydrator.hydrateMedia} — this alias covers
|
|
78
|
+
* all four binary kinds and is kept so pre-§23-A4 call sites keep working.
|
|
79
|
+
*/
|
|
80
|
+
async hydrateImages(event) {
|
|
81
|
+
return this.hydrateMedia(event);
|
|
82
|
+
}
|
|
83
|
+
async hydratePart(port, part, messageId) {
|
|
84
|
+
// Hydrate the four binary kinds only; every other part type is ignored.
|
|
85
|
+
// `isHydratableBinaryPart` narrows `part` to the BinaryPartBase variants
|
|
86
|
+
// (resourceRef / localData / mimeType / name) shared by image, file,
|
|
87
|
+
// audio and video.
|
|
88
|
+
if (!isHydratableBinaryPart(part))
|
|
89
|
+
return;
|
|
90
|
+
const resourceType = part.type;
|
|
91
|
+
// Only hydrate parts that currently carry a platform handle and have no
|
|
92
|
+
// bytes yet; anything else (URL-based, already-hydrated, or already
|
|
93
|
+
// failed) is left untouched so a prior failure marker is preserved.
|
|
94
|
+
if (!part.resourceRef)
|
|
95
|
+
return;
|
|
96
|
+
if (part.localData !== undefined)
|
|
97
|
+
return;
|
|
98
|
+
if (part.ingressFailure)
|
|
99
|
+
return;
|
|
100
|
+
// Pre-aborted: same fail-fast semantics as `applyHydrationResult`
|
|
101
|
+
// (cancelled before the download started -> 'download-failed').
|
|
102
|
+
if (this.options.signal?.aborted) {
|
|
103
|
+
part.ingressFailure = 'download-failed';
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
const resolved = await port.downloadMessageResource({
|
|
108
|
+
messageId,
|
|
109
|
+
resourceKey: part.resourceRef,
|
|
110
|
+
type: resourceType,
|
|
111
|
+
signal: this.options.signal,
|
|
112
|
+
maxBytes: this.options.maxBytes ?? LARK_MESSAGE_RESOURCE_MAX_BYTES,
|
|
113
|
+
});
|
|
114
|
+
const result = {
|
|
115
|
+
data: resolved.data,
|
|
116
|
+
...(resolved.mimeType !== undefined ? { mimeType: resolved.mimeType } : {}),
|
|
117
|
+
...(resolved.name !== undefined ? { name: resolved.name } : {}),
|
|
118
|
+
};
|
|
119
|
+
await applyHydrationResult(part, async () => result, {
|
|
120
|
+
maxBytes: this.options.maxBytes ?? LARK_MESSAGE_RESOURCE_MAX_BYTES,
|
|
121
|
+
signal: this.options.signal,
|
|
122
|
+
});
|
|
123
|
+
// Image parts never carry `size` (keep that shape stable), while
|
|
124
|
+
// file/audio/video keep the authoritative `size` derived from the real
|
|
125
|
+
// bytes (mirrors channel-qq).
|
|
126
|
+
if (part.type === 'image')
|
|
127
|
+
delete part.size;
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
this.options.logger?.debug('[channel-lark] ' + resourceType + ' hydration failed', error);
|
|
131
|
+
part.ingressFailure = classifyIngressFailure(error);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* @deprecated use {@link MediaHydrator} — kept under the legacy name so
|
|
137
|
+
* pre-§23-A4 imports (`new ImageHydrator(...)`) keep working.
|
|
138
|
+
*/
|
|
139
|
+
export const ImageHydrator = MediaHydrator;
|
|
140
|
+
/**
|
|
141
|
+
* Map a hydration failure to a stable de-identified code. Platform-plumbing
|
|
142
|
+
* errors (SDK API errors / network) map to download-failed; a genuinely
|
|
143
|
+
* absent resource maps to resource-unavailable.
|
|
144
|
+
*/
|
|
145
|
+
export function classifyIngressFailure(error) {
|
|
146
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
147
|
+
const text = message.toLowerCase();
|
|
148
|
+
const missing = [
|
|
149
|
+
'not found',
|
|
150
|
+
'no such',
|
|
151
|
+
'does not exist',
|
|
152
|
+
'resource not exist',
|
|
153
|
+
'requested resource',
|
|
154
|
+
'234043',
|
|
155
|
+
'invalid parameter',
|
|
156
|
+
'no permission',
|
|
157
|
+
];
|
|
158
|
+
if (missing.some((needle) => text.includes(needle)))
|
|
159
|
+
return 'resource-unavailable';
|
|
160
|
+
const failure = toIngressFailureCode(error);
|
|
161
|
+
return failure === 'resource-unavailable'
|
|
162
|
+
? 'resource-unavailable'
|
|
163
|
+
: failure === 'too-large'
|
|
164
|
+
? 'too-large'
|
|
165
|
+
: 'download-failed';
|
|
166
|
+
}
|
|
167
|
+
function normalizeConcurrency(value) {
|
|
168
|
+
if (value === undefined || !Number.isFinite(value))
|
|
169
|
+
return DEFAULT_MEDIA_HYDRATION_CONCURRENCY;
|
|
170
|
+
return Math.max(1, Math.floor(value));
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=media-hydrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-hydrator.js","sourceRoot":"","sources":["../src/media-hydrator.ts"],"names":[],"mappings":"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"}
|