Skip to content

Commit 9baafbd

Browse files
committed
fix: 修复循环引用序列化错误
1 parent 35806c9 commit 9baafbd

File tree

1 file changed

+36
-12
lines changed

1 file changed

+36
-12
lines changed

packages/napcat-sdk/src/napcat.ts

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,33 @@ export class NapCat {
174174
}
175175
}
176176

177+
/** 安全的 JSON 序列化,处理循环引用和不可序列化的值 */
178+
#safeStringify(obj: any): string {
179+
const seen = new WeakSet()
180+
return JSON.stringify(obj, (key, value) => {
181+
// 过滤掉内部的 timeout 引用
182+
if (key === '__timeout_id__') {
183+
return undefined
184+
}
185+
// 过滤掉函数
186+
if (typeof value === 'function') {
187+
return undefined
188+
}
189+
// 过滤掉 napcat 实例引用
190+
if (key === 'napcat') {
191+
return undefined
192+
}
193+
// 处理对象类型的循环引用
194+
if (typeof value === 'object' && value !== null) {
195+
if (seen.has(value)) {
196+
return '[Circular]'
197+
}
198+
seen.add(value)
199+
}
200+
return value
201+
})
202+
}
203+
177204
/** 标准化可发送消息元素 */
178205
normalizeSendable(msg: Arrayable<Sendable>): NormalizedElementToSend[] {
179206
return [msg].flat(2).map((item) => {
@@ -354,7 +381,7 @@ export class NapCat {
354381
if (data.post_type) {
355382
switch (data.post_type) {
356383
case 'meta_event': {
357-
this.logger.trace(`收到 meta_event: ${JSON.stringify(data)}`)
384+
this.logger.trace(`收到 meta_event: ${this.#safeStringify(data)}`)
358385

359386
this.#event.emit('meta_event', data)
360387

@@ -409,23 +436,21 @@ export class NapCat {
409436
case 'private': {
410437
this.#event.emit('message.private', data)
411438
this.#event.emit(`message.private.${data.sub_type}`, data)
412-
const { friend: _, ...rest } = data
413-
this.logger.trace(`收到私聊消息: ${JSON.stringify(rest)}`)
439+
this.logger.trace(`收到私聊消息: ${this.#safeStringify(data)}`)
414440
this.logger.info(`[私:${sender}] ${msg}`)
415441
break
416442
}
417443

418444
case 'group': {
419445
this.#event.emit('message.group', data)
420446
this.#event.emit(`message.group.${data.sub_type}`, data)
421-
const { group: _, ...rest } = data
422-
this.logger.trace(`收到群消息: ${JSON.stringify(rest)}`)
447+
this.logger.trace(`收到群消息: ${this.#safeStringify(data)}`)
423448
this.logger.info(`[群:${group}] ${sender}: ${msg}`)
424449
break
425450
}
426451

427452
default: {
428-
this.logger.debug(`收到未知消息类型: ${JSON.stringify(data)}`)
453+
this.logger.debug(`收到未知消息类型: ${this.#safeStringify(data)}`)
429454

430455
break
431456
}
@@ -444,8 +469,7 @@ export class NapCat {
444469
}
445470

446471
this.#event.emit('message_sent', data)
447-
const { group: _, friend: __, ...rest } = data
448-
this.logger.trace(`收到 message_sent: ${JSON.stringify(rest)}`)
472+
this.logger.trace(`收到 message_sent: ${this.#safeStringify(data)}`)
449473

450474
if (data.message_type) {
451475
this.#event.emit(`message_sent.${data.message_type}`, data)
@@ -467,10 +491,10 @@ export class NapCat {
467491
}
468492

469493
case 'notice': {
470-
this.logger.trace(`收到通知: ${JSON.stringify(data)}`)
494+
this.logger.trace(`收到通知: ${this.#safeStringify(data)}`)
471495

472496
if (!data.notice_type) {
473-
this.logger.debug(`收到未知通知类型: ${JSON.stringify(data)}`)
497+
this.logger.debug(`收到未知通知类型: ${this.#safeStringify(data)}`)
474498
break
475499
}
476500

@@ -512,7 +536,7 @@ export class NapCat {
512536
}
513537

514538
case 'request': {
515-
this.logger.trace(`收到请求: ${JSON.stringify(data)}`)
539+
this.logger.trace(`收到请求: ${this.#safeStringify(data)}`)
516540

517541
if (data.request_type === 'friend') {
518542
data.reject = (reason?: string) =>
@@ -539,7 +563,7 @@ export class NapCat {
539563
}
540564

541565
default: {
542-
this.logger.debug(`收到: ${JSON.stringify(data)}`)
566+
this.logger.debug(`收到: ${this.#safeStringify(data)}`)
543567
this.#event.emit(data.post_type, data)
544568
return
545569
}

0 commit comments

Comments
 (0)