@zhin.js/adapter-onebot12 3.0.2 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/CHANGELOG.md +460 -0
  2. package/README.md +40 -74
  3. package/adapters/onebot12.ts +50 -0
  4. package/lib/index.d.ts +6 -19
  5. package/lib/index.js +5 -27
  6. package/lib/protocol.d.ts +151 -0
  7. package/lib/protocol.js +242 -0
  8. package/lib/webhook.d.ts +25 -0
  9. package/lib/webhook.js +140 -0
  10. package/lib/ws-endpoint.d.ts +25 -0
  11. package/lib/ws-endpoint.js +240 -0
  12. package/lib/ws-types.d.ts +16 -0
  13. package/lib/ws-types.js +1 -0
  14. package/lib/wss-auth.d.ts +2 -0
  15. package/lib/wss-auth.js +16 -0
  16. package/lib/wss-endpoint.d.ts +24 -0
  17. package/lib/wss-endpoint.js +193 -0
  18. package/package.json +41 -15
  19. package/plugin.ts +8 -0
  20. package/schema.json +66 -0
  21. package/src/index.ts +46 -37
  22. package/src/protocol.ts +387 -0
  23. package/src/webhook.ts +180 -0
  24. package/src/ws-endpoint.ts +287 -0
  25. package/src/ws-types.ts +19 -0
  26. package/src/wss-auth.ts +17 -0
  27. package/src/wss-endpoint.ts +226 -0
  28. package/lib/adapter.d.ts +0 -20
  29. package/lib/adapter.d.ts.map +0 -1
  30. package/lib/adapter.js +0 -43
  31. package/lib/adapter.js.map +0 -1
  32. package/lib/api.d.ts +0 -14
  33. package/lib/api.d.ts.map +0 -1
  34. package/lib/api.js +0 -34
  35. package/lib/api.js.map +0 -1
  36. package/lib/endpoint-webhook.d.ts +0 -25
  37. package/lib/endpoint-webhook.d.ts.map +0 -1
  38. package/lib/endpoint-webhook.js +0 -122
  39. package/lib/endpoint-webhook.js.map +0 -1
  40. package/lib/endpoint-ws.d.ts +0 -26
  41. package/lib/endpoint-ws.d.ts.map +0 -1
  42. package/lib/endpoint-ws.js +0 -214
  43. package/lib/endpoint-ws.js.map +0 -1
  44. package/lib/endpoint-wss.d.ts +0 -26
  45. package/lib/endpoint-wss.d.ts.map +0 -1
  46. package/lib/endpoint-wss.js +0 -191
  47. package/lib/endpoint-wss.js.map +0 -1
  48. package/lib/index.d.ts.map +0 -1
  49. package/lib/index.js.map +0 -1
  50. package/lib/segment-mapper.d.ts +0 -2
  51. package/lib/segment-mapper.d.ts.map +0 -1
  52. package/lib/segment-mapper.js +0 -2
  53. package/lib/segment-mapper.js.map +0 -1
  54. package/lib/types.d.ts +0 -77
  55. package/lib/types.d.ts.map +0 -1
  56. package/lib/types.js +0 -5
  57. package/lib/types.js.map +0 -1
  58. package/lib/utils.d.ts +0 -45
  59. package/lib/utils.d.ts.map +0 -1
  60. package/lib/utils.js +0 -62
  61. package/lib/utils.js.map +0 -1
  62. package/src/adapter.ts +0 -56
  63. package/src/api.ts +0 -48
  64. package/src/endpoint-webhook.ts +0 -136
  65. package/src/endpoint-ws.ts +0 -228
  66. package/src/endpoint-wss.ts +0 -208
  67. package/src/segment-mapper.ts +0 -1
  68. package/src/types.ts +0 -86
  69. package/src/utils.ts +0 -89
@@ -1,25 +0,0 @@
1
- /**
2
- * OneBot 12 HTTP Webhook Bot:OneBot 实现 POST 事件到应用 path,可选 api_url 用于发消息
3
- */
4
- import { EventEmitter } from 'events';
5
- import { Endpoint, Message, SendOptions } from 'zhin.js';
6
- import { type Router } from '@zhin.js/host-router/router';
7
- import type { OneBot12WebhookConfig, OneBot12Event } from './types.js';
8
- import type { OneBot12Adapter } from './adapter.js';
9
- export declare class OneBot12WebhookEndpoint extends EventEmitter implements Endpoint<OneBot12WebhookConfig, OneBot12Event> {
10
- adapter: OneBot12Adapter;
11
- router: Router;
12
- $config: OneBot12WebhookConfig;
13
- $connected: boolean;
14
- get logger(): import("zhin.js").Logger;
15
- constructor(adapter: OneBot12Adapter, router: Router, $config: OneBot12WebhookConfig);
16
- get $id(): string;
17
- private httpOptions;
18
- $connect(): Promise<void>;
19
- $disconnect(): Promise<void>;
20
- private handleEvent;
21
- $formatMessage(ev: OneBot12Event): Message<OneBot12Event>;
22
- $sendMessage(options: SendOptions): Promise<string>;
23
- $recallMessage(id: string): Promise<void>;
24
- }
25
- //# sourceMappingURL=endpoint-webhook.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"endpoint-webhook.d.ts","sourceRoot":"","sources":["../src/endpoint-webhook.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAiB,QAAQ,EAAE,OAAO,EAAW,WAAW,EAAsC,MAAM,SAAS,CAAC;AACrH,OAAO,EAAsB,KAAK,MAAM,EAAsB,MAAM,6BAA6B,CAAC;AAElG,OAAO,KAAK,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAIpD,qBAAa,uBAAwB,SAAQ,YAAa,YAAW,QAAQ,CAAC,qBAAqB,EAAE,aAAa,CAAC;IAQxG,OAAO,EAAE,eAAe;IACxB,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,qBAAqB;IATvC,UAAU,EAAE,OAAO,CAAQ;IAE3B,IAAI,MAAM,6BAET;gBAGQ,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,qBAAqB;IAKvC,IAAI,GAAG,WAEN;IAED,OAAO,CAAC,WAAW;IAKb,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBzB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAIlC,OAAO,CAAC,WAAW;IAQnB,cAAc,CAAC,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IA8BnD,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IA6BnD,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAKhD"}
@@ -1,122 +0,0 @@
1
- /**
2
- * OneBot 12 HTTP Webhook Bot:OneBot 实现 POST 事件到应用 path,可选 api_url 用于发消息
3
- */
4
- import { EventEmitter } from 'events';
5
- import { formatCompact, Message, segment, expandInteractiveSegmentsInContent, } from 'zhin.js';
6
- import { registerFetchRoute } from '@zhin.js/host-router/router';
7
- import { callOneBot12Action } from './api.js';
8
- import { formatOneBot12MessagePayload, isMessageEvent, contentToOb12Segments } from './utils.js';
9
- import { fromCanonicalSegments } from './segment-mapper.js';
10
- export class OneBot12WebhookEndpoint extends EventEmitter {
11
- adapter;
12
- router;
13
- $config;
14
- $connected = true;
15
- get logger() {
16
- return this.adapter.plugin.logger;
17
- }
18
- constructor(adapter, router, $config) {
19
- super();
20
- this.adapter = adapter;
21
- this.router = router;
22
- this.$config = $config;
23
- }
24
- get $id() {
25
- return this.$config.name;
26
- }
27
- httpOptions() {
28
- const url = this.$config.api_url?.replace(/\/$/, '') ?? '';
29
- return { url: url || '', access_token: this.$config.access_token };
30
- }
31
- async $connect() {
32
- const path = this.$config.path.startsWith('/') ? this.$config.path : `/${this.$config.path}`;
33
- registerFetchRoute(this.router, 'POST', path, async (ctx) => {
34
- const body = ctx.request.body;
35
- if (!body || typeof body !== 'object' || !body.id || body.time == null || !body.type) {
36
- ctx.status = 400;
37
- ctx.body = { message: 'Invalid OneBot12 event' };
38
- return;
39
- }
40
- const token = this.$config.access_token;
41
- const auth = ctx.get('authorization');
42
- if (token && auth !== `Bearer ${token}`) {
43
- ctx.status = 401;
44
- ctx.body = { message: 'Unauthorized' };
45
- return;
46
- }
47
- this.handleEvent(body);
48
- ctx.status = 204;
49
- ctx.body = undefined;
50
- });
51
- this.logger.debug(formatCompact({ op: 'webhook', path }));
52
- }
53
- async $disconnect() {
54
- this.$connected = false;
55
- }
56
- handleEvent(ev) {
57
- if (ev.type === 'message' && isMessageEvent(ev)) {
58
- const message = this.$formatMessage(ev);
59
- this.adapter.emit('message.receive', message);
60
- this.logger.debug(`${this.$config.name} recv ${message.$channel.type}(${message.$channel.id}):${segment.raw(message.$content)}`);
61
- }
62
- }
63
- $formatMessage(ev) {
64
- if (!isMessageEvent(ev)) {
65
- return Message.from(ev, {
66
- $id: '',
67
- $adapter: 'onebot12',
68
- $endpoint: this.$config.name,
69
- $channel: { id: '', type: 'private' },
70
- $sender: { id: '', name: '' },
71
- $content: [],
72
- $raw: '',
73
- $timestamp: ev.time ?? 0,
74
- $recall: async () => { },
75
- $reply: async () => '',
76
- });
77
- }
78
- const payload = formatOneBot12MessagePayload(ev, this.$config.name, (id) => this.$recallMessage(id), (channel, content, _quote) => this.adapter.sendMessage({
79
- ...channel,
80
- context: 'onebot12',
81
- endpoint: this.$config.name,
82
- content: content,
83
- }));
84
- return Message.from(ev, payload);
85
- }
86
- async $sendMessage(options) {
87
- const apiUrl = this.$config.api_url;
88
- if (!apiUrl) {
89
- throw new Error('OneBot12 Webhook 发消息需要配置 api_url(OneBot 实现的 HTTP 端点)');
90
- }
91
- const expanded = expandInteractiveSegmentsInContent(options.content);
92
- const arr = Array.isArray(expanded) ? expanded : [expanded];
93
- const wire = fromCanonicalSegments(arr.map((c) => (typeof c === 'string' ? { type: 'text', data: { text: c } } : c)));
94
- const message = contentToOb12Segments(wire);
95
- const params = { message };
96
- if (options.type === 'private') {
97
- params.detail_type = 'private';
98
- params.user_id = options.id;
99
- }
100
- else if (options.type === 'group') {
101
- params.detail_type = 'group';
102
- params.group_id = options.id;
103
- }
104
- else {
105
- const [guildId, channelId] = options.id.includes(':') ? options.id.split(':') : [undefined, options.id];
106
- params.detail_type = 'channel';
107
- params.channel_id = channelId ?? options.id;
108
- if (guildId)
109
- params.guild_id = guildId;
110
- }
111
- const data = await callOneBot12Action(this.httpOptions(), 'send_message', params);
112
- const out = data?.message_id ?? '';
113
- return out;
114
- }
115
- async $recallMessage(id) {
116
- const apiUrl = this.$config.api_url;
117
- if (!apiUrl)
118
- throw new Error('OneBot12 Webhook 撤回需要配置 api_url');
119
- await callOneBot12Action(this.httpOptions(), 'delete_message', { message_id: id });
120
- }
121
- }
122
- //# sourceMappingURL=endpoint-webhook.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"endpoint-webhook.js","sourceRoot":"","sources":["../src/endpoint-webhook.ts"],"names":[],"mappings":"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"}
@@ -1,26 +0,0 @@
1
- import { EventEmitter } from 'events';
2
- import { Endpoint, Message, SendOptions } from 'zhin.js';
3
- import type { OneBot12WsConfig, OneBot12Event } from './types.js';
4
- import type { OneBot12Adapter } from './adapter.js';
5
- export declare class OneBot12WsClient extends EventEmitter implements Endpoint<OneBot12WsConfig, OneBot12Event> {
6
- adapter: OneBot12Adapter;
7
- $config: OneBot12WsConfig;
8
- $connected: boolean;
9
- private ws?;
10
- private reconnectTimer?;
11
- private heartbeatTimer?;
12
- private requestId;
13
- private pendingRequests;
14
- get logger(): import("zhin.js").Logger;
15
- constructor(adapter: OneBot12Adapter, $config: OneBot12WsConfig);
16
- get $id(): string;
17
- private startHeartbeat;
18
- private scheduleReconnect;
19
- private callAction;
20
- $connect(): Promise<void>;
21
- $disconnect(): Promise<void>;
22
- $formatMessage(ev: OneBot12Event): Message<OneBot12Event>;
23
- $sendMessage(options: SendOptions): Promise<string>;
24
- $recallMessage(id: string): Promise<void>;
25
- }
26
- //# sourceMappingURL=endpoint-ws.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"endpoint-ws.d.ts","sourceRoot":"","sources":["../src/endpoint-ws.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EAAiB,QAAQ,EAAE,OAAO,EAAW,WAAW,EAAsC,MAAM,SAAS,CAAC;AACrH,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAiD,MAAM,YAAY,CAAC;AACjH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAIpD,qBAAa,gBAAiB,SAAQ,YAAa,YAAW,QAAQ,CAAC,gBAAgB,EAAE,aAAa,CAAC;IAYlF,OAAO,EAAE,eAAe;IAAS,OAAO,EAAE,gBAAgB;IAX7E,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,CAAY;IACvB,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,eAAe,CAAmH;IAE1I,IAAI,MAAM,6BAET;gBAEkB,OAAO,EAAE,eAAe,EAAS,OAAO,EAAE,gBAAgB;IAK7E,IAAI,GAAG,WAEN;IAED,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,UAAU;IAoBZ,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAyEzB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBlC,cAAc,CAAC,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IA8BnD,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IA0BnD,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGhD"}
@@ -1,214 +0,0 @@
1
- /**
2
- * OneBot 12 正向 WebSocket Bot:应用连 OneBot 实现的 WS,收事件、发动作
3
- */
4
- import WebSocket from 'ws';
5
- import { EventEmitter } from 'events';
6
- import { clearInterval, clearTimeout } from 'node:timers';
7
- import { formatCompact, Message, segment, expandInteractiveSegmentsInContent, } from 'zhin.js';
8
- import { formatOneBot12MessagePayload, isMessageEvent, contentToOb12Segments } from './utils.js';
9
- import { fromCanonicalSegments } from './segment-mapper.js';
10
- export class OneBot12WsClient extends EventEmitter {
11
- adapter;
12
- $config;
13
- $connected;
14
- ws;
15
- reconnectTimer;
16
- heartbeatTimer;
17
- requestId = 0;
18
- pendingRequests = new Map();
19
- get logger() {
20
- return this.adapter.plugin.logger;
21
- }
22
- constructor(adapter, $config) {
23
- super();
24
- this.adapter = adapter;
25
- this.$config = $config;
26
- this.$connected = false;
27
- }
28
- get $id() {
29
- return this.$config.name;
30
- }
31
- startHeartbeat() {
32
- const interval = this.$config.heartbeat_interval ?? 30000;
33
- this.heartbeatTimer = setInterval(() => {
34
- this.callAction('get_status', {}).catch(() => { });
35
- }, interval);
36
- }
37
- scheduleReconnect() {
38
- if (this.reconnectTimer)
39
- return;
40
- const delay = this.$config.reconnect_interval ?? 5000;
41
- this.reconnectTimer = setTimeout(() => {
42
- this.reconnectTimer = undefined;
43
- this.$connect().catch((err) => this.logger.warn(formatCompact({
44
- op: 'reconnect',
45
- endpoint: this.$id,
46
- ok: false,
47
- error: err instanceof Error ? err.message : String(err),
48
- })));
49
- }, delay);
50
- }
51
- callAction(action, params) {
52
- if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
53
- return Promise.reject(new Error('WebSocket 未连接'));
54
- }
55
- const echo = `ob12_${++this.requestId}`;
56
- const req = { action, params, echo };
57
- return new Promise((resolve, reject) => {
58
- const timeout = setTimeout(() => {
59
- this.pendingRequests.delete(echo);
60
- reject(new Error(`OneBot12 动作超时: ${action}`));
61
- }, 30000);
62
- this.pendingRequests.set(echo, {
63
- resolve: (data) => resolve(data),
64
- reject,
65
- timeout,
66
- });
67
- this.ws.send(JSON.stringify(req));
68
- });
69
- }
70
- async $connect() {
71
- return new Promise((resolve, reject) => {
72
- const headers = {};
73
- let connectUrl = this.$config.url;
74
- if (this.$config.access_token) {
75
- headers['Authorization'] = `Bearer ${this.$config.access_token}`;
76
- const url = new URL(this.$config.url);
77
- url.searchParams.set('access_token', this.$config.access_token);
78
- connectUrl = url.toString();
79
- }
80
- this.ws = new WebSocket(connectUrl, { headers });
81
- this.ws.on('open', () => {
82
- this.$connected = true;
83
- const safeUrl = new URL(connectUrl);
84
- safeUrl.searchParams.delete('access_token');
85
- this.logger.debug(formatCompact({ endpoint: this.$id, mode: 'ws' }));
86
- this.startHeartbeat();
87
- resolve();
88
- });
89
- this.ws.on('message', (data) => {
90
- try {
91
- const msg = JSON.parse(data.toString());
92
- if ('echo' in msg && typeof msg.echo === 'string') {
93
- const resp = msg;
94
- const pending = this.pendingRequests.get(resp.echo);
95
- if (pending) {
96
- this.pendingRequests.delete(resp.echo);
97
- clearTimeout(pending.timeout);
98
- if (resp.status === 'ok')
99
- pending.resolve(resp.data);
100
- else
101
- pending.reject(new Error(`OneBot12 retcode=${resp.retcode}: ${resp.message}`));
102
- }
103
- return;
104
- }
105
- const ev = msg;
106
- if (ev.type === 'message' && isMessageEvent(ev)) {
107
- const message = this.$formatMessage(ev);
108
- this.adapter.emit('message.receive', message);
109
- this.logger.debug(`${this.$config.name} recv ${message.$channel.type}(${message.$channel.id}):${segment.raw(message.$content)}`);
110
- }
111
- }
112
- catch (error) {
113
- this.emit('error', error);
114
- }
115
- });
116
- this.ws.on('close', (code, reason) => {
117
- this.$connected = false;
118
- const reasonStr = reason?.toString?.() || String(reason);
119
- const codeHint = code === 1005 ? ' [无状态,多为服务端/代理未发 close 帧即断开]' : code === 1006 ? ' [异常关闭]' : '';
120
- this.logger.warn(formatCompact({
121
- op: 'disconnect',
122
- endpoint: this.$config.name,
123
- code,
124
- error: `${reasonStr || 'closed'}${codeHint}`,
125
- reconnect_ms: this.$config.reconnect_interval ?? 5000,
126
- }));
127
- reject(new Error(`OneBot12 WS 关闭: ${code} ${reasonStr}`));
128
- this.scheduleReconnect();
129
- });
130
- this.ws.on('error', (err) => {
131
- this.logger.warn(formatCompact({
132
- op: 'ws_error',
133
- endpoint: this.$config.name,
134
- ok: false,
135
- error: err instanceof Error ? err.message : String(err),
136
- }));
137
- reject(err);
138
- });
139
- });
140
- }
141
- async $disconnect() {
142
- if (this.reconnectTimer) {
143
- clearTimeout(this.reconnectTimer);
144
- this.reconnectTimer = undefined;
145
- }
146
- if (this.heartbeatTimer) {
147
- clearInterval(this.heartbeatTimer);
148
- this.heartbeatTimer = undefined;
149
- }
150
- for (const [, p] of this.pendingRequests) {
151
- clearTimeout(p.timeout);
152
- p.reject(new Error('连接已关闭'));
153
- }
154
- this.pendingRequests.clear();
155
- if (this.ws) {
156
- this.ws.close();
157
- this.ws = undefined;
158
- }
159
- this.$connected = false;
160
- }
161
- $formatMessage(ev) {
162
- if (!isMessageEvent(ev)) {
163
- return Message.from(ev, {
164
- $id: '',
165
- $adapter: 'onebot12',
166
- $endpoint: this.$config.name,
167
- $channel: { id: '', type: 'private' },
168
- $sender: { id: '', name: '' },
169
- $content: [],
170
- $raw: '',
171
- $timestamp: ev.time ?? 0,
172
- $recall: async () => { },
173
- $reply: async () => '',
174
- });
175
- }
176
- const payload = formatOneBot12MessagePayload(ev, this.$config.name, (id) => this.$recallMessage(id), (channel, content, _quote) => this.adapter.sendMessage({
177
- ...channel,
178
- context: 'onebot12',
179
- endpoint: this.$config.name,
180
- content: content,
181
- }));
182
- return Message.from(ev, payload);
183
- }
184
- async $sendMessage(options) {
185
- const expanded = expandInteractiveSegmentsInContent(options.content);
186
- const arr = Array.isArray(expanded) ? expanded : [expanded];
187
- const wire = fromCanonicalSegments(arr.map((c) => (typeof c === 'string' ? { type: 'text', data: { text: c } } : c)));
188
- const message = contentToOb12Segments(wire);
189
- const params = { message };
190
- if (options.type === 'private') {
191
- params.detail_type = 'private';
192
- params.user_id = options.id;
193
- }
194
- else if (options.type === 'group') {
195
- params.detail_type = 'group';
196
- params.group_id = options.id;
197
- }
198
- else {
199
- const [guildId, channelId] = options.id.includes(':') ? options.id.split(':') : [undefined, options.id];
200
- params.detail_type = 'channel';
201
- params.channel_id = channelId ?? options.id;
202
- if (guildId)
203
- params.guild_id = guildId;
204
- }
205
- const data = await this.callAction('send_message', params);
206
- const msgId = data?.message_id ?? '';
207
- this.logger.debug(`${this.$config.name} send ${options.type}(${options.id}):${segment.raw(options.content)}`);
208
- return msgId;
209
- }
210
- async $recallMessage(id) {
211
- await this.callAction('delete_message', { message_id: id });
212
- }
213
- }
214
- //# sourceMappingURL=endpoint-ws.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"endpoint-ws.js","sourceRoot":"","sources":["../src/endpoint-ws.ts"],"names":[],"mappings":"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"}
@@ -1,26 +0,0 @@
1
- import { EventEmitter } from 'events';
2
- import { Endpoint, Message, SendOptions } from 'zhin.js';
3
- import type { Router } from '@zhin.js/host-router';
4
- import type { OneBot12WssConfig, OneBot12Event } from './types.js';
5
- import type { OneBot12Adapter } from './adapter.js';
6
- export declare class OneBot12WssServer extends EventEmitter implements Endpoint<OneBot12WssConfig, OneBot12Event> {
7
- #private;
8
- adapter: OneBot12Adapter;
9
- router: Router;
10
- $config: OneBot12WssConfig;
11
- $connected: boolean;
12
- private heartbeatTimer?;
13
- private requestId;
14
- private pendingRequests;
15
- get logger(): import("zhin.js").Logger;
16
- constructor(adapter: OneBot12Adapter, router: Router, $config: OneBot12WssConfig);
17
- get $id(): string;
18
- private getClient;
19
- private callAction;
20
- $connect(): Promise<void>;
21
- $disconnect(): Promise<void>;
22
- $formatMessage(ev: OneBot12Event): Message<OneBot12Event>;
23
- $sendMessage(options: SendOptions): Promise<string>;
24
- $recallMessage(id: string): Promise<void>;
25
- }
26
- //# sourceMappingURL=endpoint-wss.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"endpoint-wss.d.ts","sourceRoot":"","sources":["../src/endpoint-wss.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC,OAAO,EAAiB,QAAQ,EAAE,OAAO,EAAW,WAAW,EAAsC,MAAM,SAAS,CAAC;AACrH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAiD,MAAM,YAAY,CAAC;AAClH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAIpD,qBAAa,iBAAkB,SAAQ,YAAa,YAAW,QAAQ,CAAC,iBAAiB,EAAE,aAAa,CAAC;;IAa9F,OAAO,EAAE,eAAe;IACxB,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,iBAAiB;IAdnC,UAAU,EAAE,OAAO,CAAS;IAG5B,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,eAAe,CAAmH;IAE1I,IAAI,MAAM,6BAET;gBAGQ,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,iBAAiB;IAKnC,IAAI,GAAG,WAEN;IAED,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,UAAU;IAmBZ,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAsEzB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBlC,cAAc,CAAC,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IA8BnD,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAwBnD,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGhD"}
@@ -1,191 +0,0 @@
1
- /**
2
- * OneBot 12 反向 WebSocket Bot:应用开 WS 服务端,OneBot 实现连上来
3
- */
4
- import WebSocket from 'ws';
5
- import { EventEmitter } from 'events';
6
- import { clearInterval, clearTimeout } from 'node:timers';
7
- import { formatCompact, Message, segment, expandInteractiveSegmentsInContent, } from 'zhin.js';
8
- import { formatOneBot12MessagePayload, isMessageEvent, contentToOb12Segments } from './utils.js';
9
- import { fromCanonicalSegments } from './segment-mapper.js';
10
- export class OneBot12WssServer extends EventEmitter {
11
- adapter;
12
- router;
13
- $config;
14
- $connected = false;
15
- #wss;
16
- #client;
17
- heartbeatTimer;
18
- requestId = 0;
19
- pendingRequests = new Map();
20
- get logger() {
21
- return this.adapter.plugin.logger;
22
- }
23
- constructor(adapter, router, $config) {
24
- super();
25
- this.adapter = adapter;
26
- this.router = router;
27
- this.$config = $config;
28
- }
29
- get $id() {
30
- return this.$config.name;
31
- }
32
- getClient() {
33
- return this.#client && this.#client.readyState === WebSocket.OPEN ? this.#client : undefined;
34
- }
35
- callAction(action, params) {
36
- const client = this.getClient();
37
- if (!client)
38
- return Promise.reject(new Error('反向 WebSocket 未连接'));
39
- const echo = `ob12wss_${++this.requestId}`;
40
- const req = { action, params, echo };
41
- return new Promise((resolve, reject) => {
42
- const timeout = setTimeout(() => {
43
- this.pendingRequests.delete(echo);
44
- reject(new Error(`OneBot12 动作超时: ${action}`));
45
- }, 30000);
46
- this.pendingRequests.set(echo, {
47
- resolve: (data) => resolve(data),
48
- reject,
49
- timeout,
50
- });
51
- client.send(JSON.stringify(req));
52
- });
53
- }
54
- async $connect() {
55
- const path = this.$config.path.startsWith('/') ? this.$config.path : `/${this.$config.path}`;
56
- this.#wss = this.router.ws(path, {
57
- verifyClient: (info) => {
58
- const auth = info.req.headers['authorization'];
59
- if (this.$config.access_token && auth !== `Bearer ${this.$config.access_token}`) {
60
- this.logger.error('OneBot12 反向 WS 鉴权失败');
61
- return false;
62
- }
63
- return true;
64
- },
65
- });
66
- this.#wss.on('connection', (ws) => {
67
- if (this.#client && this.#client.readyState === WebSocket.OPEN) {
68
- this.#client.close();
69
- }
70
- this.#client = ws;
71
- this.$connected = true;
72
- this.logger.debug(formatCompact({ endpoint: this.$config.name, mode: 'wss' }));
73
- ws.on('message', (data) => {
74
- try {
75
- const msg = JSON.parse(data.toString());
76
- if ('echo' in msg && typeof msg.echo === 'string') {
77
- const resp = msg;
78
- const pending = this.pendingRequests.get(resp.echo);
79
- if (pending) {
80
- this.pendingRequests.delete(resp.echo);
81
- clearTimeout(pending.timeout);
82
- if (resp.status === 'ok')
83
- pending.resolve(resp.data);
84
- else
85
- pending.reject(new Error(`OneBot12 retcode=${resp.retcode}: ${resp.message}`));
86
- }
87
- return;
88
- }
89
- const ev = msg;
90
- if (ev.type === 'message' && isMessageEvent(ev)) {
91
- const message = this.$formatMessage(ev);
92
- this.adapter.emit('message.receive', message);
93
- this.logger.debug(`${this.$config.name} recv ${message.$channel.type}(${message.$channel.id}):${segment.raw(message.$content)}`);
94
- }
95
- }
96
- catch (error) {
97
- this.emit('error', error);
98
- }
99
- });
100
- ws.on('close', (code, reason) => {
101
- this.$connected = false;
102
- this.#client = undefined;
103
- const reasonStr = reason?.toString?.() || String(reason ?? '');
104
- const codeHint = code === 1005 ? ' [无状态]' : code === 1006 ? ' [异常关闭]' : '';
105
- this.logger.warn(formatCompact({
106
- op: 'disconnect',
107
- endpoint: this.$config.name,
108
- code: code ?? '?',
109
- error: `${reasonStr || 'closed'}${codeHint}`,
110
- }));
111
- });
112
- ws.on('error', (err) => {
113
- this.logger.warn(formatCompact({
114
- op: 'ws_error',
115
- endpoint: this.$config.name,
116
- ok: false,
117
- error: err instanceof Error ? err.message : String(err),
118
- }));
119
- });
120
- });
121
- }
122
- async $disconnect() {
123
- if (this.heartbeatTimer) {
124
- clearInterval(this.heartbeatTimer);
125
- this.heartbeatTimer = undefined;
126
- }
127
- for (const [, p] of this.pendingRequests) {
128
- clearTimeout(p.timeout);
129
- p.reject(new Error('连接已关闭'));
130
- }
131
- this.pendingRequests.clear();
132
- if (this.#client) {
133
- this.#client.close();
134
- this.#client = undefined;
135
- }
136
- this.#wss?.close();
137
- this.#wss = undefined;
138
- this.$connected = false;
139
- }
140
- $formatMessage(ev) {
141
- if (!isMessageEvent(ev)) {
142
- return Message.from(ev, {
143
- $id: '',
144
- $adapter: 'onebot12',
145
- $endpoint: this.$config.name,
146
- $channel: { id: '', type: 'private' },
147
- $sender: { id: '', name: '' },
148
- $content: [],
149
- $raw: '',
150
- $timestamp: ev.time ?? 0,
151
- $recall: async () => { },
152
- $reply: async () => '',
153
- });
154
- }
155
- const payload = formatOneBot12MessagePayload(ev, this.$config.name, (id) => this.$recallMessage(id), (channel, content, _quote) => this.adapter.sendMessage({
156
- ...channel,
157
- context: 'onebot12',
158
- endpoint: this.$config.name,
159
- content: content,
160
- }));
161
- return Message.from(ev, payload);
162
- }
163
- async $sendMessage(options) {
164
- const expanded = expandInteractiveSegmentsInContent(options.content);
165
- const arr = Array.isArray(expanded) ? expanded : [expanded];
166
- const wire = fromCanonicalSegments(arr.map((c) => (typeof c === 'string' ? { type: 'text', data: { text: c } } : c)));
167
- const message = contentToOb12Segments(wire);
168
- const params = { message };
169
- if (options.type === 'private') {
170
- params.detail_type = 'private';
171
- params.user_id = options.id;
172
- }
173
- else if (options.type === 'group') {
174
- params.detail_type = 'group';
175
- params.group_id = options.id;
176
- }
177
- else {
178
- const [guildId, channelId] = options.id.includes(':') ? options.id.split(':') : [undefined, options.id];
179
- params.detail_type = 'channel';
180
- params.channel_id = channelId ?? options.id;
181
- if (guildId)
182
- params.guild_id = guildId;
183
- }
184
- const data = await this.callAction('send_message', params);
185
- return data?.message_id ?? '';
186
- }
187
- async $recallMessage(id) {
188
- await this.callAction('delete_message', { message_id: id });
189
- }
190
- }
191
- //# sourceMappingURL=endpoint-wss.js.map