@zhin.js/adapter-onebot11 1.1.18 → 1.1.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/README.md +13 -6
  3. package/adapters/onebot11/index.js +3 -26
  4. package/adapters/onebot11/index.ts +2 -32
  5. package/commands/onebot11/endpoint/definition.js +0 -2
  6. package/commands/onebot11/endpoint/definition.ts +0 -2
  7. package/lib/adapter.d.ts +20 -0
  8. package/lib/adapter.js +26 -0
  9. package/lib/client.d.ts +13 -11
  10. package/lib/client.js +35 -12
  11. package/lib/console.d.ts +1 -1
  12. package/lib/console.js +2 -5
  13. package/lib/content-port.d.ts +2 -2
  14. package/lib/content-port.js +2 -2
  15. package/lib/endpoint-management.d.ts +2 -2
  16. package/lib/endpoint-management.js +8 -8
  17. package/lib/identity.d.ts +3 -0
  18. package/lib/identity.js +32 -0
  19. package/lib/index.d.ts +3 -2
  20. package/lib/index.js +3 -2
  21. package/lib/self-id.js +1 -1
  22. package/lib/side-event-dispatch.d.ts +8 -1
  23. package/lib/side-event-dispatch.js +2 -1
  24. package/lib/ws-endpoint.d.ts +5 -12
  25. package/lib/ws-endpoint.js +75 -50
  26. package/lib/ws-transport.d.ts +18 -11
  27. package/lib/ws-transport.js +28 -56
  28. package/lib/ws-types.d.ts +0 -6
  29. package/lib/wss-endpoint.d.ts +5 -12
  30. package/lib/wss-endpoint.js +76 -53
  31. package/package.json +18 -18
  32. package/plugin.js +0 -3
  33. package/src/adapter.ts +32 -0
  34. package/src/client.ts +38 -28
  35. package/src/console.ts +2 -5
  36. package/src/content-port.ts +4 -4
  37. package/src/endpoint-management.ts +15 -12
  38. package/src/identity.ts +30 -0
  39. package/src/index.ts +4 -4
  40. package/src/self-id.ts +1 -1
  41. package/src/side-event-dispatch.ts +9 -7
  42. package/src/ws-endpoint.ts +71 -64
  43. package/src/ws-transport.ts +41 -82
  44. package/src/ws-types.ts +0 -7
  45. package/src/wss-endpoint.ts +73 -68
  46. package/lib/onebot11-runtime-state.d.ts +0 -1
  47. package/lib/onebot11-runtime-state.js +0 -6
  48. package/src/onebot11-runtime-state.ts +0 -7
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhin.js/adapter-onebot11",
3
- "version": "1.1.18",
3
+ "version": "1.1.20",
4
4
  "description": "Zhin.js OneBot 11 adapter for Plugin Runtime (WebSocket client)",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",
@@ -45,19 +45,19 @@
45
45
  "@imhelper/onebot-v11": "1.0.7",
46
46
  "imhelper": "1.0.7",
47
47
  "ws": "^8.21.1",
48
- "@zhin.js/adapter": "1.1.25",
49
- "@zhin.js/agent-feature": "1.1.10",
50
- "@zhin.js/client": "1.1.21",
48
+ "@zhin.js/adapter": "1.1.26",
49
+ "@zhin.js/agent-feature": "1.1.11",
50
+ "@zhin.js/client": "1.1.22",
51
51
  "@zhin.js/console-contract": "1.1.3",
52
- "@zhin.js/core": "1.1.53",
53
- "@zhin.js/feature-kit": "1.1.9",
54
- "@zhin.js/host-http": "1.1.11",
52
+ "@zhin.js/core": "1.1.54",
53
+ "@zhin.js/feature-kit": "1.1.10",
54
+ "@zhin.js/host-http": "1.1.12",
55
55
  "@zhin.js/im-contract": "1.1.9",
56
56
  "@zhin.js/logger": "1.1.2",
57
- "@zhin.js/page": "1.1.10",
58
- "@zhin.js/permission": "1.1.9",
59
- "@zhin.js/skill": "1.1.10",
60
- "@zhin.js/tool": "1.1.12"
57
+ "@zhin.js/page": "1.1.12",
58
+ "@zhin.js/permission": "1.1.10",
59
+ "@zhin.js/skill": "1.1.11",
60
+ "@zhin.js/tool": "1.1.13"
61
61
  },
62
62
  "devDependencies": {
63
63
  "@types/node": "^26.1.2",
@@ -65,15 +65,15 @@
65
65
  "typescript": "^6.0.3",
66
66
  "vitest": "^4.1.10",
67
67
  "zod": "^4.4.3",
68
- "@zhin.js/host-http": "1.1.11",
69
- "zhin.js": "1.1.18"
68
+ "@zhin.js/host-http": "1.1.12",
69
+ "zhin.js": "1.1.19"
70
70
  },
71
71
  "peerDependencies": {
72
72
  "zod": "^4.0.0",
73
- "@zhin.js/adapter": "^1.1.25",
74
- "@zhin.js/command": "^1.1.11",
75
- "@zhin.js/core": "^1.1.53",
76
- "zhin.js": "^1.1.18"
73
+ "@zhin.js/adapter": "^1.1.26",
74
+ "@zhin.js/command": "^1.1.12",
75
+ "@zhin.js/core": "^1.1.54",
76
+ "zhin.js": "^1.1.19"
77
77
  },
78
78
  "peerDependenciesMeta": {
79
79
  "@zhin.js/command": {
@@ -107,7 +107,7 @@
107
107
  "features": [
108
108
  {
109
109
  "package": "@zhin.js/adapter",
110
- "api": "^1.0.0"
110
+ "api": "^2.0.0"
111
111
  },
112
112
  {
113
113
  "package": "@zhin.js/command",
package/plugin.js CHANGED
@@ -1,8 +1,6 @@
1
1
  // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
- import { createEndpointRuntimeState } from 'zhin.js/adapter';
3
2
  import { definePlugin, pluginConsoleRpcToken } from 'zhin.js';
4
3
  import { permissionHostToken, createSceneRolePlatformChecker } from '@zhin.js/permission';
5
- import { onebot11RuntimeStateToken } from "./lib/onebot11-runtime-state.js";
6
4
  import { createOnebot11ConsoleRpc } from "./lib/console.js";
7
5
  export default definePlugin({
8
6
  name: 'onebot11',
@@ -10,7 +8,6 @@ export default definePlugin({
10
8
  displayName: 'OneBot 11 Adapter',
11
9
  },
12
10
  setup(context) {
13
- context.resources.provide(onebot11RuntimeStateToken, createEndpointRuntimeState());
14
11
  context.resources.provide(pluginConsoleRpcToken, createOnebot11ConsoleRpc(context.resources, () => context.config.get()));
15
12
  if (context.resources.has(permissionHostToken)) {
16
13
  const host = context.resources.use(permissionHostToken);
package/src/adapter.ts ADDED
@@ -0,0 +1,32 @@
1
+ import { Adapter, type AdapterContext, type EndpointCreationContext } from 'zhin.js/adapter';
2
+ import { httpHostToken } from '@zhin.js/host-http';
3
+ import { resolveOneBot11Config, type OneBot11EndpointConfig } from './protocol.js';
4
+ import { OneBot11WsEndpoint } from './ws-endpoint.js';
5
+ import { OneBot11WssEndpoint } from './wss-endpoint.js';
6
+ import { probeOnebot11Identity } from './identity.js';
7
+ import type { Onebot11ClientEventMap } from './client.js';
8
+
9
+ export class Onebot11Adapter extends Adapter<OneBot11WsEndpoint | OneBot11WssEndpoint, OneBot11EndpointConfig, Onebot11ClientEventMap> {
10
+ readonly #context: AdapterContext<OneBot11EndpointConfig>;
11
+ constructor(context: AdapterContext<OneBot11EndpointConfig>) { super(); this.#context = context; }
12
+ override get configurationIdentityFields(): readonly string[] { return ['id']; }
13
+ override get configurationIdentityProbeFields(): readonly string[] { return ['connection', 'access_token', 'url']; }
14
+ override get configurationUpdateFields(): readonly string[] {
15
+ return ['connection', 'url', 'path', 'access_token', 'reconnect_interval', 'heartbeat_interval'];
16
+ }
17
+ protected override validateConfiguration(config: OneBot11EndpointConfig): void { resolveOneBot11Config(config); }
18
+ protected override async identifyConfiguration(input: OneBot11EndpointConfig, signal: AbortSignal): Promise<string | undefined> {
19
+ const config = resolveOneBot11Config(input);
20
+ return config.connection === 'ws' ? probeOnebot11Identity(config, signal) : undefined;
21
+ }
22
+ protected createEndpoint(input: OneBot11EndpointConfig, execution: EndpointCreationContext): OneBot11WsEndpoint | OneBot11WssEndpoint {
23
+ const config = resolveOneBot11Config(input);
24
+ return config.connection === 'wss'
25
+ ? new OneBot11WssEndpoint({ id: execution.canonicalId, signal: execution.signal, http: this.#context.use(httpHostToken), config, probeLoginInfo: true })
26
+ : new OneBot11WsEndpoint({ id: execution.canonicalId, signal: execution.signal, config, probeLoginInfo: true });
27
+ }
28
+ }
29
+
30
+ declare module '@zhin.js/feature-kit' {
31
+ interface AdapterRegistry { readonly onebot11: Onebot11Adapter; }
32
+ }
package/src/client.ts CHANGED
@@ -1,11 +1,11 @@
1
+ import { EndpointDeliveryError } from '@zhin.js/im-contract';
1
2
  import {
2
3
  OneBotV11Client,
3
4
  type OneBotV11Event as ImHelperOneBot11Event,
4
5
  type OneBotV11Response,
5
6
  } from '@imhelper/onebot-v11';
6
- import { EventFactory, type EventMap, type ImHelperEventMap } from 'imhelper';
7
+ import { ProtocolError, EventFactory, type EventMap, type ImHelperEventMap } from 'imhelper';
7
8
  import {
8
- defineEndpointClient,
9
9
  forwardEndpointClientEvents,
10
10
  type ClientEventPayloads,
11
11
  } from 'zhin.js/adapter';
@@ -25,11 +25,11 @@ type Onebot11ClientEvents = ImHelperEventMap<
25
25
  >;
26
26
  export type Onebot11ClientEventMap = ClientEventPayloads<Onebot11ClientEvents>;
27
27
 
28
- export function createOnebot11EndpointClient(
28
+ export function onebot11ClientOptions(
29
29
  config: ResolvedOneBot11Config,
30
30
  request: Onebot11ApiCall,
31
- ): OneBotV11Client {
32
- return new OneBotV11Client({
31
+ ): ConstructorParameters<typeof OneBotV11Client>[0] {
32
+ return {
33
33
  baseUrl: config.connection === 'ws'
34
34
  ? config.url.replace(/^ws(s?):/, 'http$1:')
35
35
  : 'http://localhost',
@@ -37,21 +37,42 @@ export function createOnebot11EndpointClient(
37
37
  accessToken: config.access_token,
38
38
  receiveMode: 'manual',
39
39
  call: request,
40
- });
40
+ };
41
41
  }
42
42
 
43
- export async function callOnebot11Client<T = unknown>(
44
- client: OneBotV11Client,
45
- action: string,
46
- params?: Record<string, unknown>,
47
- ): Promise<T | undefined> {
48
- const response: OneBotV11Response<T> = await client.call<T>(action, params);
49
- if (response.status !== 'ok') {
50
- throw new Error(
51
- `OneBot 11 API ${action}: retcode=${response.retcode}${response.message ? ` ${response.message}` : ''}`,
52
- );
43
+ export interface Onebot11ClientRequest {
44
+ readonly client: OneBotV11Client;
45
+ readonly action: string;
46
+ readonly params?: Record<string, unknown>;
47
+ }
48
+ /** Native methods retain ProtocolError; framework ports preserve the underlying delivery evidence. */
49
+ export async function callOnebot11Client<T = unknown>(request: Onebot11ClientRequest): Promise<T | undefined> {
50
+ try {
51
+ return readOnebot11Response<T>(await request.client.call<T>(request.action, request.params));
52
+ } catch (error) {
53
+ if (error instanceof ProtocolError) {
54
+ if (error.cause instanceof EndpointDeliveryError) throw error.cause;
55
+ if (error.response !== undefined) readOnebot11Response(error.response);
56
+ }
57
+ throw error;
53
58
  }
54
- return response.data;
59
+ }
60
+
61
+ /**
62
+ * Framework evidence follows the OB11 response envelope, including async/1 submission.
63
+ * @see https://github.com/botuniverse/onebot-11/blob/master/communication/http.md
64
+ */
65
+ export function readOnebot11Response<T = unknown>(response: unknown): T | undefined {
66
+ if (response && typeof response === 'object') {
67
+ const result = response as Partial<OneBotV11Response>;
68
+ if (result.status === 'ok' && result.retcode === 0) return result.data as T | undefined;
69
+ if (result.status === 'failed' && Number.isSafeInteger(result.retcode) && result.retcode !== 0 && result.retcode !== 1) {
70
+ throw new EndpointDeliveryError('platform_rejected',
71
+ `OneBot 11 API rejected: retcode=${result.retcode}${result.message ? ` ${result.message}` : ''}`, 'rejected');
72
+ }
73
+ }
74
+ // OB11 async/1 acknowledges submission, never the final outcome.
75
+ throw new EndpointDeliveryError('delivery_unconfirmed', 'OneBot 11 response did not confirm the action result', 'unknown');
55
76
  }
56
77
 
57
78
  const onebot11ClientEventNames = Object.freeze([
@@ -65,14 +86,3 @@ export function forwardOnebot11ClientEvents(
65
86
  ): () => void {
66
87
  return forwardEndpointClientEvents(client, onebot11ClientEventNames, receive);
67
88
  }
68
-
69
- declare module '@zhin.js/feature-kit' {
70
- interface AdapterClientRegistry {
71
- readonly onebot11: {
72
- readonly client: OneBotV11Client;
73
- readonly events: Onebot11ClientEventMap;
74
- };
75
- }
76
- }
77
-
78
- export const onebot11Client = defineEndpointClient<OneBotV11Client, Onebot11ClientEventMap>('onebot11');
package/src/console.ts CHANGED
@@ -5,17 +5,14 @@
5
5
  */
6
6
  import { createAdapterConsoleRpc, type AdapterConsoleResources } from 'zhin.js/adapter';
7
7
  import type { PluginConsoleRpc } from 'zhin.js';
8
- import { onebot11RuntimeStateToken } from './onebot11-runtime-state.js';
9
8
  import { onebot11ConsoleSpec } from './console-spec.js';
10
9
 
11
10
  export function createOnebot11ConsoleRpc(
12
- resources: AdapterConsoleResources,
11
+ _resources: AdapterConsoleResources,
13
12
  getConfig: () => unknown,
14
13
  ): PluginConsoleRpc {
15
- const state = resources.use(onebot11RuntimeStateToken);
16
14
  return createAdapterConsoleRpc({
17
15
  ...onebot11ConsoleSpec,
18
- running: () => state.endpoints.values(),
19
16
  getConfig,
20
- }, resources);
17
+ });
21
18
  }
@@ -1,8 +1,8 @@
1
- import type { EndpointContentPort, EndpointContentResolveContext } from 'zhin.js/adapter';
1
+ import type { EndpointContentPort, EndpointContentResolveContext, PendingRpcRequest } from 'zhin.js/adapter';
2
2
  import { toCanonicalSegments } from '@zhin.js/core';
3
3
  import type { ConversationMessage, ConversationReference, ForwardEntry } from '@zhin.js/im-contract';
4
4
 
5
- type CallApi = (action: string, params?: Record<string, unknown>) => Promise<unknown>;
5
+ type CallApi = (request: PendingRpcRequest) => Promise<unknown>;
6
6
 
7
7
  export function createOneBot11ContentPort(callApi: CallApi): EndpointContentPort {
8
8
  return Object.freeze({
@@ -15,7 +15,7 @@ export function createOneBot11ContentPort(callApi: CallApi): EndpointContentPort
15
15
  : Object.freeze({ status: 'resolved' as const, reference, value: reference.media });
16
16
  }
17
17
  if (reference.kind === 'message') {
18
- const row = await callApi('get_msg', { message_id: reference.message.id }) as Record<string, unknown>;
18
+ const row = await callApi({ action: 'get_msg', params: { message_id: reference.message.id }, signal: context.signal }) as Record<string, unknown>;
19
19
  context.signal.throwIfAborted();
20
20
  const segments = normalizeSegments(row.message ?? row.raw_message);
21
21
  const sender = row.sender as Record<string, unknown> | undefined;
@@ -30,7 +30,7 @@ export function createOneBot11ContentPort(callApi: CallApi): EndpointContentPort
30
30
  });
31
31
  return Object.freeze({ status: 'resolved' as const, reference, value });
32
32
  }
33
- const raw = await callApi('get_forward_msg', { id: reference.forwardId }) as Record<string, unknown>;
33
+ const raw = await callApi({ action: 'get_forward_msg', params: { id: reference.forwardId }, signal: context.signal }) as Record<string, unknown>;
34
34
  context.signal.throwIfAborted();
35
35
  const nodes = Array.isArray(raw.messages) ? raw.messages.slice(0, context.maxEntries) : [];
36
36
  const value: readonly ForwardEntry[] = Object.freeze(nodes.map((node) => {
@@ -7,23 +7,26 @@
7
7
  * - group → {group_id:number, name: group_name ?? name}
8
8
  * - 群成员列表保持 OneBot11 原生形状,仅保证数组
9
9
  */
10
- import type {
11
- EndpointFriend,
12
- EndpointGroup,
13
- EndpointManagement,
10
+ import {
11
+ type EndpointFriend,
12
+ type EndpointGroup,
13
+ type EndpointManagement,
14
+ type EndpointManagementRequest,
15
+ type EndpointGroupRequest,
16
+ type PendingRpcRequest,
14
17
  } from 'zhin.js/adapter';
15
18
 
16
19
  /** 管理面只依赖 endpoint 的 callApi(ws/wss 两种传输各自实现)。 */
17
20
  export interface OneBot11ManagementCaller {
18
- callApi(action: string, params?: Record<string, unknown>): Promise<unknown>;
21
+ callApi(request: PendingRpcRequest): Promise<unknown>;
19
22
  }
20
23
 
21
24
  export function createOneBot11EndpointManagement(
22
25
  endpoint: OneBot11ManagementCaller,
23
26
  ): EndpointManagement {
24
27
  return Object.freeze<EndpointManagement>({
25
- async listFriends(): Promise<readonly EndpointFriend[]> {
26
- const data = await endpoint.callApi('get_friend_list');
28
+ async listFriends(request: EndpointManagementRequest = {}): Promise<readonly EndpointFriend[]> {
29
+ const data = await endpoint.callApi({ action: 'get_friend_list', signal: request.signal });
27
30
  return toArray(data).map((value) => {
28
31
  const friend = asRecord(value);
29
32
  return {
@@ -33,8 +36,8 @@ export function createOneBot11EndpointManagement(
33
36
  };
34
37
  });
35
38
  },
36
- async listGroups(): Promise<readonly EndpointGroup[]> {
37
- const data = await endpoint.callApi('get_group_list');
39
+ async listGroups(request: EndpointManagementRequest = {}): Promise<readonly EndpointGroup[]> {
40
+ const data = await endpoint.callApi({ action: 'get_group_list', signal: request.signal });
38
41
  return toArray(data).map((value) => {
39
42
  const group = asRecord(value);
40
43
  return {
@@ -43,10 +46,10 @@ export function createOneBot11EndpointManagement(
43
46
  };
44
47
  });
45
48
  },
46
- async listGroupMembers(groupId: string): Promise<readonly unknown[]> {
47
- const data = await endpoint.callApi('get_group_member_list', {
49
+ async listGroupMembers({ groupId, signal }: EndpointGroupRequest): Promise<readonly unknown[]> {
50
+ const data = await endpoint.callApi({ action: 'get_group_member_list', signal, params: {
48
51
  group_id: toNumberId(groupId, 'group_id'),
49
- });
52
+ } });
50
53
  return toArray(data);
51
54
  },
52
55
  });
@@ -0,0 +1,30 @@
1
+ import WebSocket from 'ws';
2
+ import { buildWsConnectOptions, type OneBot11WsConfig } from './protocol.js';
3
+ import { createOneBot11Rpc } from './ws-transport.js';
4
+ import { resolveOnebot11SelfId } from './self-id.js';
5
+
6
+ /** Separate read-only connection: never changes credentials or state of the running Endpoint. */
7
+ export async function probeOnebot11Identity(config: OneBot11WsConfig, signal: AbortSignal): Promise<string | undefined> {
8
+ signal.throwIfAborted();
9
+ const { url, headers } = buildWsConnectOptions(config);
10
+ const socket = new WebSocket(url, { headers });
11
+ const rpc = createOneBot11Rpc({ endpointId: config.id, signal, socket: () => socket, });
12
+ let rejectOpen: (error: unknown) => void = () => undefined;
13
+ const abort = () => { rejectOpen(signal.reason); rpc.disconnect(); socket.terminate(); };
14
+ signal.addEventListener('abort', abort, { once: true });
15
+ socket.on('message', data => rpc.receive(data, () => undefined));
16
+ socket.on('close', () => { rejectOpen(new Error('Identity connection closed')); rpc.disconnect(); });
17
+ try {
18
+ await new Promise<void>((resolve, reject) => { rejectOpen = reject; socket.once('open', resolve); socket.on('error', reject); });
19
+ signal.throwIfAborted();
20
+
21
+ const response = await rpc.call({ action: 'get_login_info' });
22
+ signal.throwIfAborted();
23
+ if (response.status !== 'ok' || response.retcode !== 0) throw new Error('OneBot11 identity lookup failed');
24
+ const data: unknown = response.data;
25
+ const id = resolveOnebot11SelfId(data && typeof data === 'object' && 'user_id' in data ? data.user_id : undefined);
26
+ return id === undefined ? undefined : `qq:${id}`;
27
+ } finally {
28
+ signal.removeEventListener('abort', abort); rpc.dispose(); socket.terminate();
29
+ }
30
+ }
package/src/index.ts CHANGED
@@ -40,17 +40,16 @@ export {
40
40
  export type { OneBot11WsSocket, OneBot11WsCreateOptions } from './ws-types.js';
41
41
 
42
42
  export {
43
- callOneBot11WsAction,
43
+ createOneBot11Rpc,
44
+ type OneBot11Rpc,
45
+ type OneBot11RpcOptions,
44
46
  decodeWsPayload,
45
- handleOneBot11WsMessage,
46
- rejectAllPending,
47
47
  } from './ws-transport.js';
48
48
 
49
49
  export { verifyOneBotAccessToken } from './wss-auth.js';
50
50
 
51
51
  export {
52
52
  Onebot11Client,
53
- onebot11Client,
54
53
  type Onebot11ClientEventMap,
55
54
  } from './client.js';
56
55
 
@@ -64,3 +63,4 @@ export type {
64
63
  } from '@imhelper/onebot-v11';
65
64
  export { ProtocolError } from '@imhelper/onebot-v11';
66
65
  export type { ProtocolErrorKind, ProtocolErrorOptions } from 'imhelper';
66
+ export { Onebot11Adapter } from './adapter.js';
package/src/self-id.ts CHANGED
@@ -19,7 +19,7 @@ export async function probeOnebot11SelfId(
19
19
  onError: (error: unknown) => void,
20
20
  ): Promise<string | undefined> {
21
21
  try {
22
- const data = await callOnebot11Client<{ user_id?: number | string }>(client, 'get_login_info');
22
+ const data = await callOnebot11Client<{ user_id?: number | string }>({ client, action: 'get_login_info' });
23
23
  return resolveOnebot11SelfId(data?.user_id);
24
24
  } catch (error) {
25
25
  onError(error);
@@ -7,13 +7,15 @@ export interface OneBot11SideEventCaller {
7
7
  callApi(action: string, params?: Record<string, unknown>): Promise<unknown>;
8
8
  }
9
9
 
10
- export function receiveOneBot11SideEvent(
11
- emit: EndpointEventEmitter,
12
- endpointKey: string,
13
- caller: OneBot11SideEventCaller,
14
- raw: OneBot11Event,
15
- logger: ReturnType<typeof getAdapterLogger>,
16
- ): void {
10
+ /** Exact instance-owned dependencies for one canonical side-event projection. */
11
+ export interface OneBot11SideEventContext {
12
+ readonly emit: EndpointEventEmitter;
13
+ readonly endpointKey: string;
14
+ readonly caller: OneBot11SideEventCaller;
15
+ readonly logger: ReturnType<typeof getAdapterLogger>;
16
+ }
17
+ export function receiveOneBot11SideEvent(raw: OneBot11Event, context: OneBot11SideEventContext): void {
18
+ const { emit, endpointKey, caller, logger } = context;
17
19
  if (!emit) return;
18
20
  const record = raw as Record<string, unknown>;
19
21
  const postType = String(record.post_type ?? '');