napcon 0.0.13 → 0.0.15

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.
@@ -264,6 +264,7 @@ interface ProtocolMessageFlashTransferSegment {
264
264
  fileSetId: string;
265
265
  };
266
266
  }
267
+ type ProtocolSendableMessage = MaybeArray<string | ProtocolMessageSendSegment>;
267
268
  //#endregion
268
269
  //#region src/types/event.d.ts
269
270
  type ProtocolEventPostTypes = 'meta_event' | 'notice' | 'request' | 'message' | 'message_sent';
@@ -602,7 +603,7 @@ interface ProtocolReplyFailed {
602
603
  type ProtocolReply<T = any> = ProtocolReplyOk<T> | ProtocolReplyFailed;
603
604
  //#endregion
604
605
  //#region src/types/pubsub.d.ts
605
- interface SubHalf<T extends Record<string, any[]>> {
606
+ interface SubHalf<T extends Record<string, any>> {
606
607
  on<const K extends keyof T>(type: K, ...listeners: Array<(...args: T[K]) => void>): Dispose;
607
608
  }
608
609
  interface OffHalf<T extends Record<string, any> = Record<string, any>> {
@@ -636,7 +637,7 @@ interface Transport extends TransportCommon {
636
637
  }
637
638
  //#endregion
638
639
  //#region src/types/connection.d.ts
639
- interface ConnectionBasicPubSubHandlers {
640
+ type ConnectionBasicPubSubHandlers = {
640
641
  'connection.connected': [transport: Transport, connection: Connection];
641
642
  'connection.disconnected': [transport: Transport, connection: Connection];
642
643
  'connection.reconnect': [transport: Transport, connection: Connection];
@@ -645,8 +646,7 @@ interface ConnectionBasicPubSubHandlers {
645
646
  'protocol.event': [event: ProtocolEvent, connection: Connection];
646
647
  'connection.error': [error: any, connection: Connection];
647
648
  'connection.reply.stream': [data: ProtocolReply, connection: Connection];
648
- [x: string]: any[];
649
- }
649
+ };
650
650
  type ProtocolEventHandler = (event: ProtocolEvent, connection: Connection) => void;
651
651
  type ConnectionPubSub = PubSubOff<ConnectionBasicPubSubHandlers>;
652
652
  type ConnectionStreamResult<R = any> = [stream: ProtocolReadableStream, result: Promise<ProtocolStreamCompleteMessage<R>>];
@@ -671,5 +671,5 @@ type OpenConnection = ((options: OpenConnectionOptions) => Connection) & ((trans
671
671
  //#region src/connection/index.d.ts
672
672
  declare const open: OpenConnection;
673
673
  //#endregion
674
- export { ProtocolNoticeEventCommon as $, ProtocolMessagePokeRecvSegment as $t, ProtocolStreamMessage as A, ProtocolRequestEventCommon as At, ProtocolMessageEvent as B, ProtocolMessageForwardRecvSegment as Bt, ProtocolReplyOk as C, ProtocolNoticeNotifyGroupPokeEvent as Ct, ProtocolStreamCompleteMessage as D, ProtocolNoticeNotifyPokeEventCommon as Dt, ProtocolRequest as E, ProtocolNoticeNotifyPokeEvent as Et, ProtocolEventNames as F, ProtocolMessageDiceSendSegment as Ft, ProtocolMessageSentEvent as G, ProtocolMessageLocationSegment as Gt, ProtocolMessageGroupEvent as H, ProtocolMessageImageSendSegment as Ht, ProtocolEventPostTypes as I, ProtocolMessageFaceSegment as It, ProtocolMetaHeartbeatEvent as J, ProtocolMessageMiniAppSegment as Jt, ProtocolMetaEvent as K, ProtocolMessageMarkdownSegment as Kt, ProtocolFriendRequestEvent as L, ProtocolMessageFileRecvSegment as Lt, ProtocolEventCommon as M, ProtocolMessageContactSendSegment as Mt, ProtocolEventHandlers as N, ProtocolMessageContentNode as Nt, ProtocolStreamDataMessage as O, ProtocolNoticeNotifyProfileLikeEvent as Ot, ProtocolEventNamePaths as P, ProtocolMessageDiceRecvSegment as Pt, ProtocolNoticeEvent as Q, ProtocolMessageOnlineFileSegment as Qt, ProtocolGroupRequestEvent as R, ProtocolMessageFileSendSegment as Rt, ProtocolReplyFailed as S, ProtocolNoticeNotifyGroupNameEvent as St, ProtocolReplyStreamResponse as T, ProtocolNoticeNotifyInputStatusEvent as Tt, ProtocolMessagePrivateEvent as U, ProtocolMessageJsonRecvSegment as Ut, ProtocolMessageEventCommon as V, ProtocolMessageImageRecvSegment as Vt, ProtocolMessagePrivateEventSubTypes as W, ProtocolMessageJsonSendSegment as Wt, ProtocolMetaLifecycleEventSubTypes as X, ProtocolMessageMusicSendSegment as Xt, ProtocolMetaLifecycleEvent as Y, ProtocolMessageMusicRecvSegment as Yt, ProtocolNoticeBotOfflineEvent as Z, ProtocolMessageNode as Zt, PubSubOff as _, Numeric as _n, ProtocolNoticeGroupRecallEvent as _t, ConnectionStreamResult as a, ProtocolMessageReplySegment as an, ProtocolNoticeGroupBanEvent as at, ProtocolReadableStream as b, ProtocolNoticeNotifyEvent as bt, ProtocolEventHandler as c, ProtocolMessageSegment as cn, ProtocolNoticeGroupDecreaseEvent as ct, Transport as d, ProtocolMessageVideoRecvSegment as dn, ProtocolNoticeGroupEssenceEventSubTypes as dt, ProtocolMessagePokeSendSegment as en, ProtocolNoticeFriendAddEvent as et, TransportCommon as f, ProtocolMessageVideoSendSegment as fn, ProtocolNoticeGroupEvent as ft, PubSub as g, MaybePromiseLike as gn, ProtocolNoticeGroupMessageEmojiLikeEvent as gt, PubHalf as h, MaybeArray as hn, ProtocolNoticeGroupIncreaseEventSubTypes as ht, ConnectionPubSub as i, ProtocolMessageRefNode as in, ProtocolNoticeGroupAdminEventSubTypes as it, ProtocolEvent as j, ProtocolMessageAtSegment as jt, ProtocolStreamErrorMessage as k, ProtocolRequestEvent as kt, TransportFactory as l, ProtocolMessageSendSegment as ln, ProtocolNoticeGroupDecreaseEventSubTypes as lt, OffHalf as m, Dispose as mn, ProtocolNoticeGroupIncreaseEvent as mt, Connection as n, ProtocolMessageRecordSendSegment as nn, ProtocolNoticeFriendRecallEvent as nt, OpenConnection as o, ProtocolMessageRpsRecvSegment as on, ProtocolNoticeGroupBanEventSubTypes as ot, TransportEventHandlers as p, ProtocolMessageXmlSegment as pn, ProtocolNoticeGroupEventCommon as pt, ProtocolMetaEventCommon as q, ProtocolMessageMfaceSendSegment as qt, ConnectionBasicPubSubHandlers as r, ProtocolMessageRecvSegment as rn, ProtocolNoticeGroupAdminEvent as rt, OpenConnectionOptions as s, ProtocolMessageRpsSendSegment as sn, ProtocolNoticeGroupCardEvent as st, open as t, ProtocolMessageRecordRecvSegment as tn, ProtocolNoticeFriendEvent as tt, ReadyState as u, ProtocolMessageTextSegment as un, ProtocolNoticeGroupEssenceEvent as ut, SubHalf as v, ProtocolNoticeGroupUploadEvent as vt, ProtocolReplyStream as w, ProtocolNoticeNotifyGroupTitleEvent as wt, ProtocolReply as x, ProtocolNoticeNotifyFriendPokeEvent as xt, SubOff as y, ProtocolNoticeGroupUploadFile as yt, ProtocolMessageEmojiLike as z, ProtocolMessageFlashTransferSegment as zt };
675
- //# sourceMappingURL=index-xpa8wXI0.d.mts.map
674
+ export { ProtocolNoticeEventCommon as $, ProtocolMessagePokeRecvSegment as $t, ProtocolStreamMessage as A, ProtocolRequestEventCommon as At, ProtocolMessageEvent as B, ProtocolMessageForwardRecvSegment as Bt, ProtocolReplyOk as C, ProtocolNoticeNotifyGroupPokeEvent as Ct, ProtocolStreamCompleteMessage as D, ProtocolNoticeNotifyPokeEventCommon as Dt, ProtocolRequest as E, ProtocolNoticeNotifyPokeEvent as Et, ProtocolEventNames as F, ProtocolMessageDiceSendSegment as Ft, ProtocolMessageSentEvent as G, ProtocolMessageLocationSegment as Gt, ProtocolMessageGroupEvent as H, ProtocolMessageImageSendSegment as Ht, ProtocolEventPostTypes as I, ProtocolMessageFaceSegment as It, ProtocolMetaHeartbeatEvent as J, ProtocolMessageMiniAppSegment as Jt, ProtocolMetaEvent as K, ProtocolMessageMarkdownSegment as Kt, ProtocolFriendRequestEvent as L, ProtocolMessageFileRecvSegment as Lt, ProtocolEventCommon as M, ProtocolMessageContactSendSegment as Mt, ProtocolEventHandlers as N, ProtocolMessageContentNode as Nt, ProtocolStreamDataMessage as O, ProtocolNoticeNotifyProfileLikeEvent as Ot, ProtocolEventNamePaths as P, ProtocolMessageDiceRecvSegment as Pt, ProtocolNoticeEvent as Q, ProtocolMessageOnlineFileSegment as Qt, ProtocolGroupRequestEvent as R, ProtocolMessageFileSendSegment as Rt, ProtocolReplyFailed as S, ProtocolNoticeNotifyGroupNameEvent as St, ProtocolReplyStreamResponse as T, ProtocolNoticeNotifyInputStatusEvent as Tt, ProtocolMessagePrivateEvent as U, ProtocolMessageJsonRecvSegment as Ut, ProtocolMessageEventCommon as V, ProtocolMessageImageRecvSegment as Vt, ProtocolMessagePrivateEventSubTypes as W, ProtocolMessageJsonSendSegment as Wt, ProtocolMetaLifecycleEventSubTypes as X, ProtocolMessageMusicSendSegment as Xt, ProtocolMetaLifecycleEvent as Y, ProtocolMessageMusicRecvSegment as Yt, ProtocolNoticeBotOfflineEvent as Z, ProtocolMessageNode as Zt, PubSubOff as _, MaybePromiseLike as _n, ProtocolNoticeGroupRecallEvent as _t, ConnectionStreamResult as a, ProtocolMessageReplySegment as an, ProtocolNoticeGroupBanEvent as at, ProtocolReadableStream as b, ProtocolNoticeNotifyEvent as bt, ProtocolEventHandler as c, ProtocolMessageSegment as cn, ProtocolNoticeGroupDecreaseEvent as ct, Transport as d, ProtocolMessageVideoRecvSegment as dn, ProtocolNoticeGroupEssenceEventSubTypes as dt, ProtocolMessagePokeSendSegment as en, ProtocolNoticeFriendAddEvent as et, TransportCommon as f, ProtocolMessageVideoSendSegment as fn, ProtocolNoticeGroupEvent as ft, PubSub as g, MaybeArray as gn, ProtocolNoticeGroupMessageEmojiLikeEvent as gt, PubHalf as h, Dispose as hn, ProtocolNoticeGroupIncreaseEventSubTypes as ht, ConnectionPubSub as i, ProtocolMessageRefNode as in, ProtocolNoticeGroupAdminEventSubTypes as it, ProtocolEvent as j, ProtocolMessageAtSegment as jt, ProtocolStreamErrorMessage as k, ProtocolRequestEvent as kt, TransportFactory as l, ProtocolMessageSendSegment as ln, ProtocolNoticeGroupDecreaseEventSubTypes as lt, OffHalf as m, ProtocolSendableMessage as mn, ProtocolNoticeGroupIncreaseEvent as mt, Connection as n, ProtocolMessageRecordSendSegment as nn, ProtocolNoticeFriendRecallEvent as nt, OpenConnection as o, ProtocolMessageRpsRecvSegment as on, ProtocolNoticeGroupBanEventSubTypes as ot, TransportEventHandlers as p, ProtocolMessageXmlSegment as pn, ProtocolNoticeGroupEventCommon as pt, ProtocolMetaEventCommon as q, ProtocolMessageMfaceSendSegment as qt, ConnectionBasicPubSubHandlers as r, ProtocolMessageRecvSegment as rn, ProtocolNoticeGroupAdminEvent as rt, OpenConnectionOptions as s, ProtocolMessageRpsSendSegment as sn, ProtocolNoticeGroupCardEvent as st, open as t, ProtocolMessageRecordRecvSegment as tn, ProtocolNoticeFriendEvent as tt, ReadyState as u, ProtocolMessageTextSegment as un, ProtocolNoticeGroupEssenceEvent as ut, SubHalf as v, Numeric as vn, ProtocolNoticeGroupUploadEvent as vt, ProtocolReplyStream as w, ProtocolNoticeNotifyGroupTitleEvent as wt, ProtocolReply as x, ProtocolNoticeNotifyFriendPokeEvent as xt, SubOff as y, ProtocolNoticeGroupUploadFile as yt, ProtocolMessageEmojiLike as z, ProtocolMessageFlashTransferSegment as zt };
675
+ //# sourceMappingURL=index-DbedAzOE.d.mts.map
package/dist/index.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { $ as ProtocolNoticeEventCommon, $t as ProtocolMessagePokeRecvSegment, A as ProtocolStreamMessage, At as ProtocolRequestEventCommon, B as ProtocolMessageEvent, Bt as ProtocolMessageForwardRecvSegment, C as ProtocolReplyOk, Ct as ProtocolNoticeNotifyGroupPokeEvent, D as ProtocolStreamCompleteMessage, Dt as ProtocolNoticeNotifyPokeEventCommon, E as ProtocolRequest, Et as ProtocolNoticeNotifyPokeEvent, F as ProtocolEventNames, Ft as ProtocolMessageDiceSendSegment, G as ProtocolMessageSentEvent, Gt as ProtocolMessageLocationSegment, H as ProtocolMessageGroupEvent, Ht as ProtocolMessageImageSendSegment, I as ProtocolEventPostTypes, It as ProtocolMessageFaceSegment, J as ProtocolMetaHeartbeatEvent, Jt as ProtocolMessageMiniAppSegment, K as ProtocolMetaEvent, Kt as ProtocolMessageMarkdownSegment, L as ProtocolFriendRequestEvent, Lt as ProtocolMessageFileRecvSegment, M as ProtocolEventCommon, Mt as ProtocolMessageContactSendSegment, N as ProtocolEventHandlers, Nt as ProtocolMessageContentNode, O as ProtocolStreamDataMessage, Ot as ProtocolNoticeNotifyProfileLikeEvent, P as ProtocolEventNamePaths, Pt as ProtocolMessageDiceRecvSegment, Q as ProtocolNoticeEvent, Qt as ProtocolMessageOnlineFileSegment, R as ProtocolGroupRequestEvent, Rt as ProtocolMessageFileSendSegment, S as ProtocolReplyFailed, St as ProtocolNoticeNotifyGroupNameEvent, T as ProtocolReplyStreamResponse, Tt as ProtocolNoticeNotifyInputStatusEvent, U as ProtocolMessagePrivateEvent, Ut as ProtocolMessageJsonRecvSegment, V as ProtocolMessageEventCommon, Vt as ProtocolMessageImageRecvSegment, W as ProtocolMessagePrivateEventSubTypes, Wt as ProtocolMessageJsonSendSegment, X as ProtocolMetaLifecycleEventSubTypes, Xt as ProtocolMessageMusicSendSegment, Y as ProtocolMetaLifecycleEvent, Yt as ProtocolMessageMusicRecvSegment, Z as ProtocolNoticeBotOfflineEvent, Zt as ProtocolMessageNode, _ as PubSubOff, _n as Numeric, _t as ProtocolNoticeGroupRecallEvent, a as ConnectionStreamResult, an as ProtocolMessageReplySegment, at as ProtocolNoticeGroupBanEvent, b as ProtocolReadableStream, bt as ProtocolNoticeNotifyEvent, c as ProtocolEventHandler, cn as ProtocolMessageSegment, ct as ProtocolNoticeGroupDecreaseEvent, d as Transport, dn as ProtocolMessageVideoRecvSegment, dt as ProtocolNoticeGroupEssenceEventSubTypes, en as ProtocolMessagePokeSendSegment, et as ProtocolNoticeFriendAddEvent, f as TransportCommon, fn as ProtocolMessageVideoSendSegment, ft as ProtocolNoticeGroupEvent, g as PubSub, gn as MaybePromiseLike, gt as ProtocolNoticeGroupMessageEmojiLikeEvent, h as PubHalf, hn as MaybeArray, ht as ProtocolNoticeGroupIncreaseEventSubTypes, i as ConnectionPubSub, in as ProtocolMessageRefNode, it as ProtocolNoticeGroupAdminEventSubTypes, j as ProtocolEvent, jt as ProtocolMessageAtSegment, k as ProtocolStreamErrorMessage, kt as ProtocolRequestEvent, l as TransportFactory, ln as ProtocolMessageSendSegment, lt as ProtocolNoticeGroupDecreaseEventSubTypes, m as OffHalf, mn as Dispose, mt as ProtocolNoticeGroupIncreaseEvent, n as Connection, nn as ProtocolMessageRecordSendSegment, nt as ProtocolNoticeFriendRecallEvent, o as OpenConnection, on as ProtocolMessageRpsRecvSegment, ot as ProtocolNoticeGroupBanEventSubTypes, p as TransportEventHandlers, pn as ProtocolMessageXmlSegment, pt as ProtocolNoticeGroupEventCommon, q as ProtocolMetaEventCommon, qt as ProtocolMessageMfaceSendSegment, r as ConnectionBasicPubSubHandlers, rn as ProtocolMessageRecvSegment, rt as ProtocolNoticeGroupAdminEvent, s as OpenConnectionOptions, sn as ProtocolMessageRpsSendSegment, st as ProtocolNoticeGroupCardEvent, t as open, tn as ProtocolMessageRecordRecvSegment, tt as ProtocolNoticeFriendEvent, u as ReadyState, un as ProtocolMessageTextSegment, ut as ProtocolNoticeGroupEssenceEvent, v as SubHalf, vt as ProtocolNoticeGroupUploadEvent, w as ProtocolReplyStream, wt as ProtocolNoticeNotifyGroupTitleEvent, x as ProtocolReply, xt as ProtocolNoticeNotifyFriendPokeEvent, y as SubOff, yt as ProtocolNoticeGroupUploadFile, z as ProtocolMessageEmojiLike, zt as ProtocolMessageFlashTransferSegment } from "./index-xpa8wXI0.mjs";
2
- export { Connection, ConnectionBasicPubSubHandlers, ConnectionPubSub, ConnectionStreamResult, Dispose, MaybeArray, MaybePromiseLike, Numeric, OffHalf, OpenConnection, OpenConnectionOptions, ProtocolEvent, ProtocolEventCommon, ProtocolEventHandler, ProtocolEventHandlers, ProtocolEventNamePaths, ProtocolEventNames, ProtocolEventPostTypes, ProtocolFriendRequestEvent, ProtocolGroupRequestEvent, ProtocolMessageAtSegment, ProtocolMessageContactSendSegment, ProtocolMessageContentNode, ProtocolMessageDiceRecvSegment, ProtocolMessageDiceSendSegment, ProtocolMessageEmojiLike, ProtocolMessageEvent, ProtocolMessageEventCommon, ProtocolMessageFaceSegment, ProtocolMessageFileRecvSegment, ProtocolMessageFileSendSegment, ProtocolMessageFlashTransferSegment, ProtocolMessageForwardRecvSegment, ProtocolMessageGroupEvent, ProtocolMessageImageRecvSegment, ProtocolMessageImageSendSegment, ProtocolMessageJsonRecvSegment, ProtocolMessageJsonSendSegment, ProtocolMessageLocationSegment, ProtocolMessageMarkdownSegment, ProtocolMessageMfaceSendSegment, ProtocolMessageMiniAppSegment, ProtocolMessageMusicRecvSegment, ProtocolMessageMusicSendSegment, ProtocolMessageNode, ProtocolMessageOnlineFileSegment, ProtocolMessagePokeRecvSegment, ProtocolMessagePokeSendSegment, ProtocolMessagePrivateEvent, ProtocolMessagePrivateEventSubTypes, ProtocolMessageRecordRecvSegment, ProtocolMessageRecordSendSegment, ProtocolMessageRecvSegment, ProtocolMessageRefNode, ProtocolMessageReplySegment, ProtocolMessageRpsRecvSegment, ProtocolMessageRpsSendSegment, ProtocolMessageSegment, ProtocolMessageSendSegment, ProtocolMessageSentEvent, ProtocolMessageTextSegment, ProtocolMessageVideoRecvSegment, ProtocolMessageVideoSendSegment, ProtocolMessageXmlSegment, ProtocolMetaEvent, ProtocolMetaEventCommon, ProtocolMetaHeartbeatEvent, ProtocolMetaLifecycleEvent, ProtocolMetaLifecycleEventSubTypes, ProtocolNoticeBotOfflineEvent, ProtocolNoticeEvent, ProtocolNoticeEventCommon, ProtocolNoticeFriendAddEvent, ProtocolNoticeFriendEvent, ProtocolNoticeFriendRecallEvent, ProtocolNoticeGroupAdminEvent, ProtocolNoticeGroupAdminEventSubTypes, ProtocolNoticeGroupBanEvent, ProtocolNoticeGroupBanEventSubTypes, ProtocolNoticeGroupCardEvent, ProtocolNoticeGroupDecreaseEvent, ProtocolNoticeGroupDecreaseEventSubTypes, ProtocolNoticeGroupEssenceEvent, ProtocolNoticeGroupEssenceEventSubTypes, ProtocolNoticeGroupEvent, ProtocolNoticeGroupEventCommon, ProtocolNoticeGroupIncreaseEvent, ProtocolNoticeGroupIncreaseEventSubTypes, ProtocolNoticeGroupMessageEmojiLikeEvent, ProtocolNoticeGroupRecallEvent, ProtocolNoticeGroupUploadEvent, ProtocolNoticeGroupUploadFile, ProtocolNoticeNotifyEvent, ProtocolNoticeNotifyFriendPokeEvent, ProtocolNoticeNotifyGroupNameEvent, ProtocolNoticeNotifyGroupPokeEvent, ProtocolNoticeNotifyGroupTitleEvent, ProtocolNoticeNotifyInputStatusEvent, ProtocolNoticeNotifyPokeEvent, ProtocolNoticeNotifyPokeEventCommon, ProtocolNoticeNotifyProfileLikeEvent, ProtocolReadableStream, ProtocolReply, ProtocolReplyFailed, ProtocolReplyOk, ProtocolReplyStream, ProtocolReplyStreamResponse, ProtocolRequest, ProtocolRequestEvent, ProtocolRequestEventCommon, ProtocolStreamCompleteMessage, ProtocolStreamDataMessage, ProtocolStreamErrorMessage, ProtocolStreamMessage, PubHalf, PubSub, PubSubOff, ReadyState, SubHalf, SubOff, Transport, TransportCommon, TransportEventHandlers, TransportFactory, open };
1
+ import { $ as ProtocolNoticeEventCommon, $t as ProtocolMessagePokeRecvSegment, A as ProtocolStreamMessage, At as ProtocolRequestEventCommon, B as ProtocolMessageEvent, Bt as ProtocolMessageForwardRecvSegment, C as ProtocolReplyOk, Ct as ProtocolNoticeNotifyGroupPokeEvent, D as ProtocolStreamCompleteMessage, Dt as ProtocolNoticeNotifyPokeEventCommon, E as ProtocolRequest, Et as ProtocolNoticeNotifyPokeEvent, F as ProtocolEventNames, Ft as ProtocolMessageDiceSendSegment, G as ProtocolMessageSentEvent, Gt as ProtocolMessageLocationSegment, H as ProtocolMessageGroupEvent, Ht as ProtocolMessageImageSendSegment, I as ProtocolEventPostTypes, It as ProtocolMessageFaceSegment, J as ProtocolMetaHeartbeatEvent, Jt as ProtocolMessageMiniAppSegment, K as ProtocolMetaEvent, Kt as ProtocolMessageMarkdownSegment, L as ProtocolFriendRequestEvent, Lt as ProtocolMessageFileRecvSegment, M as ProtocolEventCommon, Mt as ProtocolMessageContactSendSegment, N as ProtocolEventHandlers, Nt as ProtocolMessageContentNode, O as ProtocolStreamDataMessage, Ot as ProtocolNoticeNotifyProfileLikeEvent, P as ProtocolEventNamePaths, Pt as ProtocolMessageDiceRecvSegment, Q as ProtocolNoticeEvent, Qt as ProtocolMessageOnlineFileSegment, R as ProtocolGroupRequestEvent, Rt as ProtocolMessageFileSendSegment, S as ProtocolReplyFailed, St as ProtocolNoticeNotifyGroupNameEvent, T as ProtocolReplyStreamResponse, Tt as ProtocolNoticeNotifyInputStatusEvent, U as ProtocolMessagePrivateEvent, Ut as ProtocolMessageJsonRecvSegment, V as ProtocolMessageEventCommon, Vt as ProtocolMessageImageRecvSegment, W as ProtocolMessagePrivateEventSubTypes, Wt as ProtocolMessageJsonSendSegment, X as ProtocolMetaLifecycleEventSubTypes, Xt as ProtocolMessageMusicSendSegment, Y as ProtocolMetaLifecycleEvent, Yt as ProtocolMessageMusicRecvSegment, Z as ProtocolNoticeBotOfflineEvent, Zt as ProtocolMessageNode, _ as PubSubOff, _n as MaybePromiseLike, _t as ProtocolNoticeGroupRecallEvent, a as ConnectionStreamResult, an as ProtocolMessageReplySegment, at as ProtocolNoticeGroupBanEvent, b as ProtocolReadableStream, bt as ProtocolNoticeNotifyEvent, c as ProtocolEventHandler, cn as ProtocolMessageSegment, ct as ProtocolNoticeGroupDecreaseEvent, d as Transport, dn as ProtocolMessageVideoRecvSegment, dt as ProtocolNoticeGroupEssenceEventSubTypes, en as ProtocolMessagePokeSendSegment, et as ProtocolNoticeFriendAddEvent, f as TransportCommon, fn as ProtocolMessageVideoSendSegment, ft as ProtocolNoticeGroupEvent, g as PubSub, gn as MaybeArray, gt as ProtocolNoticeGroupMessageEmojiLikeEvent, h as PubHalf, hn as Dispose, ht as ProtocolNoticeGroupIncreaseEventSubTypes, i as ConnectionPubSub, in as ProtocolMessageRefNode, it as ProtocolNoticeGroupAdminEventSubTypes, j as ProtocolEvent, jt as ProtocolMessageAtSegment, k as ProtocolStreamErrorMessage, kt as ProtocolRequestEvent, l as TransportFactory, ln as ProtocolMessageSendSegment, lt as ProtocolNoticeGroupDecreaseEventSubTypes, m as OffHalf, mn as ProtocolSendableMessage, mt as ProtocolNoticeGroupIncreaseEvent, n as Connection, nn as ProtocolMessageRecordSendSegment, nt as ProtocolNoticeFriendRecallEvent, o as OpenConnection, on as ProtocolMessageRpsRecvSegment, ot as ProtocolNoticeGroupBanEventSubTypes, p as TransportEventHandlers, pn as ProtocolMessageXmlSegment, pt as ProtocolNoticeGroupEventCommon, q as ProtocolMetaEventCommon, qt as ProtocolMessageMfaceSendSegment, r as ConnectionBasicPubSubHandlers, rn as ProtocolMessageRecvSegment, rt as ProtocolNoticeGroupAdminEvent, s as OpenConnectionOptions, sn as ProtocolMessageRpsSendSegment, st as ProtocolNoticeGroupCardEvent, t as open, tn as ProtocolMessageRecordRecvSegment, tt as ProtocolNoticeFriendEvent, u as ReadyState, un as ProtocolMessageTextSegment, ut as ProtocolNoticeGroupEssenceEvent, v as SubHalf, vn as Numeric, vt as ProtocolNoticeGroupUploadEvent, w as ProtocolReplyStream, wt as ProtocolNoticeNotifyGroupTitleEvent, x as ProtocolReply, xt as ProtocolNoticeNotifyFriendPokeEvent, y as SubOff, yt as ProtocolNoticeGroupUploadFile, z as ProtocolMessageEmojiLike, zt as ProtocolMessageFlashTransferSegment } from "./index-DbedAzOE.mjs";
2
+ export { Connection, ConnectionBasicPubSubHandlers, ConnectionPubSub, ConnectionStreamResult, Dispose, MaybeArray, MaybePromiseLike, Numeric, OffHalf, OpenConnection, OpenConnectionOptions, ProtocolEvent, ProtocolEventCommon, ProtocolEventHandler, ProtocolEventHandlers, ProtocolEventNamePaths, ProtocolEventNames, ProtocolEventPostTypes, ProtocolFriendRequestEvent, ProtocolGroupRequestEvent, ProtocolMessageAtSegment, ProtocolMessageContactSendSegment, ProtocolMessageContentNode, ProtocolMessageDiceRecvSegment, ProtocolMessageDiceSendSegment, ProtocolMessageEmojiLike, ProtocolMessageEvent, ProtocolMessageEventCommon, ProtocolMessageFaceSegment, ProtocolMessageFileRecvSegment, ProtocolMessageFileSendSegment, ProtocolMessageFlashTransferSegment, ProtocolMessageForwardRecvSegment, ProtocolMessageGroupEvent, ProtocolMessageImageRecvSegment, ProtocolMessageImageSendSegment, ProtocolMessageJsonRecvSegment, ProtocolMessageJsonSendSegment, ProtocolMessageLocationSegment, ProtocolMessageMarkdownSegment, ProtocolMessageMfaceSendSegment, ProtocolMessageMiniAppSegment, ProtocolMessageMusicRecvSegment, ProtocolMessageMusicSendSegment, ProtocolMessageNode, ProtocolMessageOnlineFileSegment, ProtocolMessagePokeRecvSegment, ProtocolMessagePokeSendSegment, ProtocolMessagePrivateEvent, ProtocolMessagePrivateEventSubTypes, ProtocolMessageRecordRecvSegment, ProtocolMessageRecordSendSegment, ProtocolMessageRecvSegment, ProtocolMessageRefNode, ProtocolMessageReplySegment, ProtocolMessageRpsRecvSegment, ProtocolMessageRpsSendSegment, ProtocolMessageSegment, ProtocolMessageSendSegment, ProtocolMessageSentEvent, ProtocolMessageTextSegment, ProtocolMessageVideoRecvSegment, ProtocolMessageVideoSendSegment, ProtocolMessageXmlSegment, ProtocolMetaEvent, ProtocolMetaEventCommon, ProtocolMetaHeartbeatEvent, ProtocolMetaLifecycleEvent, ProtocolMetaLifecycleEventSubTypes, ProtocolNoticeBotOfflineEvent, ProtocolNoticeEvent, ProtocolNoticeEventCommon, ProtocolNoticeFriendAddEvent, ProtocolNoticeFriendEvent, ProtocolNoticeFriendRecallEvent, ProtocolNoticeGroupAdminEvent, ProtocolNoticeGroupAdminEventSubTypes, ProtocolNoticeGroupBanEvent, ProtocolNoticeGroupBanEventSubTypes, ProtocolNoticeGroupCardEvent, ProtocolNoticeGroupDecreaseEvent, ProtocolNoticeGroupDecreaseEventSubTypes, ProtocolNoticeGroupEssenceEvent, ProtocolNoticeGroupEssenceEventSubTypes, ProtocolNoticeGroupEvent, ProtocolNoticeGroupEventCommon, ProtocolNoticeGroupIncreaseEvent, ProtocolNoticeGroupIncreaseEventSubTypes, ProtocolNoticeGroupMessageEmojiLikeEvent, ProtocolNoticeGroupRecallEvent, ProtocolNoticeGroupUploadEvent, ProtocolNoticeGroupUploadFile, ProtocolNoticeNotifyEvent, ProtocolNoticeNotifyFriendPokeEvent, ProtocolNoticeNotifyGroupNameEvent, ProtocolNoticeNotifyGroupPokeEvent, ProtocolNoticeNotifyGroupTitleEvent, ProtocolNoticeNotifyInputStatusEvent, ProtocolNoticeNotifyPokeEvent, ProtocolNoticeNotifyPokeEventCommon, ProtocolNoticeNotifyProfileLikeEvent, ProtocolReadableStream, ProtocolReply, ProtocolReplyFailed, ProtocolReplyOk, ProtocolReplyStream, ProtocolReplyStreamResponse, ProtocolRequest, ProtocolRequestEvent, ProtocolRequestEventCommon, ProtocolSendableMessage, ProtocolStreamCompleteMessage, ProtocolStreamDataMessage, ProtocolStreamErrorMessage, ProtocolStreamMessage, PubHalf, PubSub, PubSubOff, ReadyState, SubHalf, SubOff, Transport, TransportCommon, TransportEventHandlers, TransportFactory, open };
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{i as e}from"./value-DBEEtS4k.mjs";var t=class{listeners=new Map;constructor(e,t){this.onerror=e,this._uncaughtEvents=t,this.onerror=e}_inner(e,t){let n=this.listeners.get(e);if(!n){if(!t)return;n=new Set,this.listeners.set(e,n)}return n}on(t,...n){let r=this._inner(t,!0);if(n.length===0)return e;if(n.length===1)return r.add(n[0]),()=>r.delete(n[0]);for(let e of n)r.add(e);return()=>{this.off(t,...n)}}off(e,...t){let n=this._inner(e);if(n){if(t.length===0)return!1;if(t.length===1)return n.delete(t[0]);{let e=!0;for(let r of t)e&&=n.delete(r);return e}}}emit(e,...t){let n=this._inner(e);if(n){let r=Promise.resolve();for(let i of n)r.then(()=>i(...t)).catch(this._uncaughtEvents?.includes(e)?null:this.onerror)}}},n=class extends t{_transport;_disposeTransportEvents;_reconnectAttempts=0;_reconnectTimer;_manualClose=!1;_isReconnecting=!1;_callbacks=new Map;_streams=new Map;constructor(e){super(e=>this._handleError(e),[`connection.error`]),this._options=e}get transport(){if(!this._transport)throw Error(`Transport not connected`);return this._transport}async connect(){this._manualClose=!1,await this._connect()}_handleError(e){this.emit(`connection.error`,e,this)}async _connect(e=!1){try{let t=await this._options.transport(this._options.token??``);this._transport=t,e&&this.emit(`connection.reconnect`,this._transport,this),this._bindTransportEvents(t)}catch(e){throw this._handleError(e),e}}_createStream(e){let t={resolve:null,reject:null},n=new Promise((e,n)=>{t.resolve=e,t.reject=n});return[new ReadableStream({start:n=>{this._streams.set(e,{enqueue:e=>n.enqueue(e),raise:e=>{t.reject?.(e),n.error(e)},complete:e=>{t.resolve?.(e),n.close()},close:()=>n.close()})},cancel:()=>{this._streams.delete(e),t.reject?.(Error(`Stream canceled`))}}),n]}request(e,t,n){return new Promise((r,i)=>{let a=crypto.randomUUID(),o={action:e,params:t,echo:a,stream:n?`stream-action`:`normal-action`};if(n){let e=this._createStream(a);try{this.emit(`connection.request`,o,this),this.transport.send(JSON.stringify(o)),r(e)}catch(e){this._streams.delete(a),this._handleError(e),i(e)}return}let s=setTimeout(()=>{if(this._callbacks.has(a)){this._callbacks.delete(a);let t=Error(`API Request Timeout: ${e}`);this._handleError(t),i(t)}},this._options.timeout);this._callbacks.set(a,{resolve:r,reject:i,timer:s});try{this.emit(`connection.request`,o,this),this.transport.send(JSON.stringify(o))}catch(e){clearTimeout(s),this._callbacks.delete(a),this._handleError(e),i(e)}})}_bindTransportEvents(e){this._disposeTransportEvents?.();let t=()=>{this.emit(`connection.connected`,e,this),this._isReconnecting&&(this._isReconnecting=!1,this._reconnectAttempts=0,clearTimeout(this._reconnectTimer))},n=e=>{let t=typeof e.data==`string`?(()=>{try{return JSON.parse(e.data)}catch{return null}})():e.data;t&&this._handleMessage(t)},r=e=>{this.emit(`connection.error`,e,this)},i=()=>{this._disposeTransportEvents?.(),this._disposeTransportEvents=void 0,this.emit(`connection.disconnected`,e,this),this._transport=void 0;for(let[e,{raise:t}]of this._streams)t(Error(`Connection closed`));this._streams.clear();for(let[e,{reject:t,timer:n}]of this._callbacks)clearTimeout(n),t(Error(`Connection closed`));this._callbacks.clear(),this._manualClose||this._scheduleReconnect()};e.addEventListener(`open`,t),e.addEventListener(`message`,n),e.addEventListener(`error`,r),e.addEventListener(`close`,i),e.readyState===1&&t(),this._disposeTransportEvents=()=>{e.removeEventListener(`open`,t),e.removeEventListener(`message`,n),e.removeEventListener(`error`,r),e.removeEventListener(`close`,i)}}_handleMessage(e){if(e){if(e.echo){if(this.emit(`connection.reply`,e,this),e.stream===`stream-action`){this.emit(`connection.reply.stream`,e,this);let t=this._streams.get(e.echo);if(!t)return;let n=e;n.status===`ok`?n.data.type===`stream`&&n.data.data_type===`data_chunk`?t.enqueue(n.data):n.data.type===`response`&&n.data.data_type===`data_complete`&&(this._streams.delete(e.echo),t.complete(n.data)):n.status===`failed`&&(this._streams.delete(e.echo),t.raise(Error(`Stream Error: ${n.message||`code ${n.retcode}`}`)));return}let t=this._callbacks.get(e.echo);if(t){clearTimeout(t.timer),this._callbacks.delete(e.echo),e.status===`ok`?t.resolve(e.data):t.reject(Error(`Request Error: ${e.message||`code ${e.retcode}`}`));return}}e.post_type&&this.emit(`protocol.event`,e,this)}}_scheduleReconnect(){let{reconnect:e}=this._options;if(!e||this._manualClose)return;let{attempts:t,interval:n}=e;if(t!==`always`&&this._reconnectAttempts>=t)return this.emit(`connection.error`,Error(`Reconnect failed`),this);this._isReconnecting=!0,this._reconnectAttempts++,this._reconnectTimer&&clearTimeout(this._reconnectTimer),this._reconnectTimer=setTimeout(()=>{this._connect(!0).catch(()=>{this._scheduleReconnect()})},n)}close(){this._manualClose=!0,this._disposeTransportEvents?.(),this._transport?.close()}[Symbol.dispose](){this.close()}};const r=function(e,t){return typeof e==`function`&&(e={transport:e,token:t}),e.reconnect??={interval:15e3,attempts:5},e.timeout??=3e4,new n(e)};export{r as open};
1
+ import{i as e}from"./value-CXqvIDVX.mjs";var t=class{listeners=new Map;constructor(e,t){this.onerror=e,this._uncaughtEvents=t,this.onerror=e}_inner(e,t){let n=this.listeners.get(e);if(!n){if(!t)return;n=new Set,this.listeners.set(e,n)}return n}on(t,...n){let r=this._inner(t,!0);if(n.length===0)return e;if(n.length===1)return r.add(n[0]),()=>r.delete(n[0]);for(let e of n)r.add(e);return()=>{this.off(t,...n)}}off(e,...t){let n=this._inner(e);if(n){if(t.length===0)return!1;if(t.length===1)return n.delete(t[0]);{let e=!0;for(let r of t)e&&=n.delete(r);return e}}}emit(e,...t){let n=this._inner(e);if(n){let r=Promise.resolve();for(let i of n)r.then(()=>i(...t)).catch(this._uncaughtEvents?.has(e)?null:this.onerror)}}},n=class extends t{_transport;_disposeTransportEvents;_reconnectAttempts=0;_reconnectTimer;_manualClose=!1;_isReconnecting=!1;_callbacks=new Map;_streams=new Map;constructor(e){super(e=>this._handleError(e),new Set([`connection.error`])),this._options=e}get transport(){if(!this._transport)throw Error(`Transport not connected`);return this._transport}async connect(){this._manualClose=!1,await this._connect()}_handleError(e){this.emit(`connection.error`,e,this)}async _connect(e=!1){try{let t=await this._options.transport(this._options.token??``);this._transport=t,e&&this.emit(`connection.reconnect`,this._transport,this),this._bindTransportEvents(t)}catch(e){throw this._handleError(e),e}}_createStream(e){let t={resolve:null,reject:null},n=new Promise((e,n)=>{t.resolve=e,t.reject=n});return[new ReadableStream({start:n=>{this._streams.set(e,{enqueue:e=>n.enqueue(e),raise:e=>{t.reject?.(e),n.error(e)},complete:e=>{t.resolve?.(e),n.close()},close:()=>n.close()})},cancel:()=>{this._streams.delete(e),t.reject?.(Error(`Stream canceled`))}}),n]}request(e,t,n){return new Promise((r,i)=>{let a=crypto.randomUUID(),o={action:e,params:t,echo:a,stream:n?`stream-action`:`normal-action`};if(n){let e=this._createStream(a);try{this.emit(`connection.request`,o,this),this.transport.send(JSON.stringify(o)),r(e)}catch(e){this._streams.delete(a),this._handleError(e),i(e)}return}let s=setTimeout(()=>{if(this._callbacks.has(a)){this._callbacks.delete(a);let t=Error(`API Request Timeout: ${e}`);this._handleError(t),i(t)}},this._options.timeout);this._callbacks.set(a,{resolve:r,reject:i,timer:s});try{this.emit(`connection.request`,o,this),this.transport.send(JSON.stringify(o))}catch(e){clearTimeout(s),this._callbacks.delete(a),this._handleError(e),i(e)}})}_bindTransportEvents(e){this._disposeTransportEvents?.();let t=()=>{this.emit(`connection.connected`,e,this),this._isReconnecting&&(this._isReconnecting=!1,this._reconnectAttempts=0,clearTimeout(this._reconnectTimer))},n=e=>{let t=typeof e.data==`string`?(()=>{try{return JSON.parse(e.data)}catch{return null}})():e.data;t&&this._handleMessage(t)},r=e=>{this.emit(`connection.error`,e,this)},i=()=>{this._disposeTransportEvents?.(),this._disposeTransportEvents=void 0,this.emit(`connection.disconnected`,e,this),this._transport=void 0;for(let[e,{raise:t}]of this._streams)t(Error(`Connection closed`));this._streams.clear();for(let[e,{reject:t,timer:n}]of this._callbacks)clearTimeout(n),t(Error(`Connection closed`));this._callbacks.clear(),this._manualClose||this._scheduleReconnect()};e.addEventListener(`open`,t),e.addEventListener(`message`,n),e.addEventListener(`error`,r),e.addEventListener(`close`,i),e.readyState===1&&t(),this._disposeTransportEvents=()=>{e.removeEventListener(`open`,t),e.removeEventListener(`message`,n),e.removeEventListener(`error`,r),e.removeEventListener(`close`,i)}}_handleMessage(e){if(e){if(e.echo){if(this.emit(`connection.reply`,e,this),e.stream===`stream-action`){this.emit(`connection.reply.stream`,e,this);let t=this._streams.get(e.echo);if(!t)return;let n=e;n.status===`ok`?n.data.type===`stream`&&n.data.data_type===`data_chunk`?t.enqueue(n.data):n.data.type===`response`&&n.data.data_type===`data_complete`&&(this._streams.delete(e.echo),t.complete(n.data)):n.status===`failed`&&(this._streams.delete(e.echo),t.raise(Error(`Stream Error: ${n.message||`code ${n.retcode}`}`)));return}let t=this._callbacks.get(e.echo);if(t){clearTimeout(t.timer),this._callbacks.delete(e.echo),e.status===`ok`?t.resolve(e.data):t.reject(Error(`Request Error: ${e.message||`code ${e.retcode}`}`));return}}e.post_type&&this.emit(`protocol.event`,e,this)}}_scheduleReconnect(){let{reconnect:e}=this._options;if(!e||this._manualClose)return;let{attempts:t,interval:n}=e;if(t!==`always`&&this._reconnectAttempts>=t)return this.emit(`connection.error`,Error(`Reconnect failed`),this);this._isReconnecting=!0,this._reconnectAttempts++,this._reconnectTimer&&clearTimeout(this._reconnectTimer),this._reconnectTimer=setTimeout(()=>{this._connect(!0).catch(()=>{this._scheduleReconnect()})},n)}close(){this._manualClose=!0,this._disposeTransportEvents?.(),this._transport?.close()}[Symbol.dispose](){this.close()}};const r=function(e,t){return typeof e==`function`&&(e={transport:e,token:t}),e.reconnect??={interval:15e3,attempts:5},e.timeout??=3e4,new n(e)};export{r as open};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/utils/pubsub.ts","../src/connection/index.ts"],"sourcesContent":["import type { PubSubOff } from '@/types/pubsub'\nimport { noop } from './value'\n\nexport class PubSubImpl<T extends Record<string, any[]> = Record<string, any[]>> implements PubSubOff<T> {\n private readonly listeners = new Map<keyof T, Set<(...args: any[]) => any>>()\n\n constructor(private onerror?: (error: Error) => void, private _uncaughtEvents?: (keyof T)[]) {\n this.onerror = onerror\n }\n\n private _inner(type: keyof T, create?: boolean) {\n let listeners = this.listeners.get(type)\n if (!listeners) {\n if (!create) {\n return\n }\n listeners = new Set()\n this.listeners.set(type, listeners)\n }\n return listeners\n }\n\n on<const K extends keyof T>(type: K, ...listeners: Array<(...args: T[K]) => void>) {\n const inner = this._inner(type, true)!\n if (listeners.length === 0) {\n return noop\n }\n else if (listeners.length === 1) {\n inner.add(listeners[0]!)\n return () => inner.delete(listeners[0]!)\n }\n else {\n for (const fn of listeners) {\n inner.add(fn)\n }\n return () => {\n this.off(type, ...listeners)\n }\n }\n }\n\n off(type: keyof T, ...listeners: Array<(...args: any[]) => any>) {\n const inner = this._inner(type)\n if (inner) {\n if (listeners.length === 0) {\n return false\n }\n else if (listeners.length === 1) {\n return inner.delete(listeners[0]!)\n }\n else {\n let success = true\n for (const listener of listeners) {\n success &&= inner.delete(listener)\n }\n return success\n }\n }\n }\n\n emit<const K extends keyof T>(type: K, ...args: T[K]) {\n const listeners = this._inner(type)\n if (listeners) {\n const p = Promise.resolve()\n for (const listener of listeners) {\n p.then(() => listener(...args))\n .catch(this._uncaughtEvents?.includes(type) ? null : this.onerror)\n }\n }\n }\n}\n","import type { Dispose } from '@/types/common'\nimport type { Connection, ConnectionBasicPubSubHandlers, OpenConnection, OpenConnectionOptions, TransportFactory } from '@/types/connection'\nimport type { ProtocolReadableStream, ProtocolReplyStream, ProtocolRequest, ProtocolStreamCompleteMessage } from '@/types/protocol'\nimport type { Transport } from '@/types/transport'\nimport { PubSubImpl } from '@/utils/pubsub'\n\nexport class ConnectionImpl extends PubSubImpl<ConnectionBasicPubSubHandlers> implements Connection {\n private _transport: Transport | undefined\n private _disposeTransportEvents: Dispose | undefined\n private _reconnectAttempts = 0\n private _reconnectTimer: any | undefined\n private _manualClose = false\n private _isReconnecting = false\n private _callbacks = new Map<string, { resolve: (data: any) => void, reject: (err: any) => void, timer: NodeJS.Timeout }>()\n private _streams = new Map<string, { enqueue: (data: any) => void, raise: (err: any) => void, complete: (value: any) => void, close: () => void }>()\n\n constructor(private readonly _options: OpenConnectionOptions) {\n super(err => this._handleError(err), ['connection.error'])\n }\n\n get transport(): Transport {\n if (!this._transport) {\n throw new Error('Transport not connected')\n }\n return this._transport\n }\n\n async connect(): Promise<void> {\n this._manualClose = false\n await this._connect()\n }\n\n private _handleError(error: any) {\n this.emit('connection.error', error, this)\n }\n\n private async _connect(reconnecting = false): Promise<void> {\n try {\n const transportOrPromise = this._options.transport(this._options.token ?? '')\n const transport = await transportOrPromise\n this._transport = transport\n if (reconnecting) {\n this.emit('connection.reconnect', this._transport, this)\n }\n this._bindTransportEvents(transport)\n }\n catch (error) {\n this._handleError(error)\n throw error\n }\n }\n\n private _createStream(echo: string): [ReadableStream<any>, Promise<any>] {\n const deferred = { resolve: null, reject: null } as any\n const promise = new Promise<any>((res, rej) => {\n deferred.resolve = res\n deferred.reject = rej\n })\n\n return [new ReadableStream<any>({\n start: (controller) => {\n this._streams.set(echo, {\n enqueue: data => controller.enqueue(data),\n raise: (err) => {\n deferred.reject?.(err)\n controller.error(err)\n },\n complete: (value) => {\n deferred.resolve?.(value)\n controller.close()\n },\n close: () => controller.close(),\n })\n },\n cancel: () => {\n this._streams.delete(echo)\n deferred.reject?.(new Error('Stream canceled'))\n },\n }), promise]\n }\n\n request<const P, R = any>(method: string, args: P, stream?: false): Promise<R>\n request<const P, R = any>(method: string, args: P, stream: true): Promise<[ProtocolReadableStream, Promise<ProtocolStreamCompleteMessage<R>>]>\n request<P, R = any>(method: string, args?: P, stream?: boolean): Promise<R> | Promise<[ProtocolReadableStream, Promise<ProtocolStreamCompleteMessage<R>>]> {\n return new Promise<any>((resolve, reject) => {\n const echo = crypto.randomUUID()\n const request: ProtocolRequest = {\n action: method,\n params: args,\n echo,\n stream: stream ? 'stream-action' : 'normal-action',\n }\n\n if (stream) {\n const result = this._createStream(echo)\n try {\n this.emit('connection.request', request, this)\n this.transport.send(JSON.stringify(request))\n resolve(result)\n }\n catch (error) {\n this._streams.delete(echo)\n this._handleError(error)\n reject(error)\n }\n return\n }\n\n const timer = setTimeout(() => {\n if (this._callbacks.has(echo)) {\n this._callbacks.delete(echo)\n const error = new Error(`API Request Timeout: ${method}`)\n\n this._handleError(error)\n reject(error)\n }\n }, this._options.timeout)\n\n this._callbacks.set(echo, { resolve, reject, timer })\n\n try {\n this.emit('connection.request', request, this)\n this.transport.send(JSON.stringify(request))\n }\n catch (error) {\n clearTimeout(timer)\n this._callbacks.delete(echo)\n this._handleError(error)\n reject(error)\n }\n })\n }\n\n private _bindTransportEvents(transport: Transport) {\n this._disposeTransportEvents?.()\n\n const onOpen = () => {\n this.emit('connection.connected', transport, this)\n if (this._isReconnecting) {\n this._isReconnecting = false\n this._reconnectAttempts = 0\n clearTimeout(this._reconnectTimer)\n }\n }\n\n const onMessage = (event: { data: any }) => {\n const data = typeof event.data === 'string'\n ? (() => {\n try {\n return JSON.parse(event.data)\n }\n catch {\n return null\n }\n })()\n : event.data\n\n if (data) {\n this._handleMessage(data)\n }\n }\n\n const onError = (error: any) => {\n this.emit('connection.error', error, this)\n }\n\n const onClose = () => {\n this._disposeTransportEvents?.()\n this._disposeTransportEvents = undefined\n\n this.emit('connection.disconnected', transport, this)\n this._transport = undefined\n\n // Clear all pending streams\n for (const [_, { raise }] of this._streams) {\n raise(new Error('Connection closed'))\n }\n this._streams.clear()\n\n // Clear all pending requests\n for (const [_, { reject, timer }] of this._callbacks) {\n clearTimeout(timer)\n reject(new Error('Connection closed'))\n }\n this._callbacks.clear()\n\n if (!this._manualClose) {\n this._scheduleReconnect()\n }\n }\n\n transport.addEventListener('open', onOpen)\n transport.addEventListener('message', onMessage)\n transport.addEventListener('error', onError)\n transport.addEventListener('close', onClose)\n\n if (transport.readyState === 1 /* OPEN */) {\n onOpen()\n }\n\n this._disposeTransportEvents = () => {\n transport.removeEventListener('open', onOpen)\n transport.removeEventListener('message', onMessage)\n transport.removeEventListener('error', onError)\n transport.removeEventListener('close', onClose)\n }\n }\n\n private _handleMessage(data: any) {\n if (!data)\n return\n\n // Handle Reply\n if (data.echo) {\n this.emit('connection.reply', data, this)\n if (data.stream === 'stream-action') {\n this.emit('connection.reply.stream', data, this)\n\n const stream = this._streams.get(data.echo)\n if (!stream)\n return\n\n const message = data as ProtocolReplyStream\n if (message.status === 'ok') {\n if (message.data!.type === 'stream' && message.data!.data_type === 'data_chunk') {\n stream.enqueue(message.data!)\n }\n else if (message.data!.type === 'response' && message.data!.data_type === 'data_complete') {\n this._streams.delete(data.echo)\n stream.complete(message.data!)\n }\n }\n else if (message.status === 'failed') {\n this._streams.delete(data.echo)\n stream.raise(new Error(`Stream Error: ${message.message || `code ${message.retcode}`}`))\n }\n return\n }\n\n const pending = this._callbacks.get(data.echo)\n if (pending) {\n clearTimeout(pending.timer)\n this._callbacks.delete(data.echo)\n\n if (data.status === 'ok') {\n pending.resolve(data.data)\n }\n else {\n pending.reject(new Error(`Request Error: ${data.message || `code ${data.retcode}`}`))\n }\n return\n }\n }\n\n // Handle Event\n if (data.post_type) {\n this.emit('protocol.event', data, this)\n }\n }\n\n private _scheduleReconnect() {\n const { reconnect } = this._options\n if (!reconnect || this._manualClose)\n return\n\n const { attempts, interval } = reconnect\n\n if (attempts !== 'always' && this._reconnectAttempts >= attempts) {\n // Reconnect failed\n return this.emit('connection.error', new Error('Reconnect failed'), this)\n }\n\n this._isReconnecting = true\n this._reconnectAttempts++\n\n if (this._reconnectTimer)\n clearTimeout(this._reconnectTimer)\n\n this._reconnectTimer = setTimeout(() => {\n this._connect(true).catch(() => {\n this._scheduleReconnect()\n })\n }, interval)\n }\n\n close() {\n this._manualClose = true\n this._disposeTransportEvents?.()\n this._transport?.close()\n }\n\n [Symbol.dispose]() {\n this.close()\n }\n}\n\nexport const open: OpenConnection = function open(options: OpenConnectionOptions | TransportFactory, token?: string): Connection {\n if (typeof options === 'function') {\n options = { transport: options, token }\n }\n\n options.reconnect ??= {\n interval: 15000,\n attempts: 5,\n }\n\n options.timeout ??= 30000\n\n const conn = new ConnectionImpl(options)\n return conn\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/utils/pubsub.ts","../src/connection/index.ts"],"sourcesContent":["import type { PubSubOff } from '@/types/pubsub'\nimport { noop } from './value'\n\nexport class PubSubImpl<T extends Record<string, any[]> = Record<string, any[]>> implements PubSubOff<T> {\n private readonly listeners = new Map<keyof T, Set<(...args: any[]) => any>>()\n\n constructor(private onerror?: (error: Error) => void, private _uncaughtEvents?: Set<keyof T>) {\n this.onerror = onerror\n }\n\n private _inner(type: keyof T, create?: boolean) {\n let listeners = this.listeners.get(type)\n if (!listeners) {\n if (!create) {\n return\n }\n listeners = new Set()\n this.listeners.set(type, listeners)\n }\n return listeners\n }\n\n on<const K extends keyof T>(type: K, ...listeners: Array<(...args: T[K]) => void>) {\n const inner = this._inner(type, true)!\n if (listeners.length === 0) {\n return noop\n }\n else if (listeners.length === 1) {\n inner.add(listeners[0]!)\n return () => inner.delete(listeners[0]!)\n }\n else {\n for (const fn of listeners) {\n inner.add(fn)\n }\n return () => {\n this.off(type, ...listeners)\n }\n }\n }\n\n off(type: keyof T, ...listeners: Array<(...args: any[]) => any>) {\n const inner = this._inner(type)\n if (inner) {\n if (listeners.length === 0) {\n return false\n }\n else if (listeners.length === 1) {\n return inner.delete(listeners[0]!)\n }\n else {\n let success = true\n for (const listener of listeners) {\n success &&= inner.delete(listener)\n }\n return success\n }\n }\n }\n\n emit<const K extends keyof T>(type: K, ...args: T[K]) {\n const listeners = this._inner(type)\n if (listeners) {\n const p = Promise.resolve()\n for (const listener of listeners) {\n p.then(() => listener(...args))\n .catch(this._uncaughtEvents?.has(type) ? null : this.onerror)\n }\n }\n }\n}\n","import type { Dispose } from '@/types/common'\nimport type { Connection, ConnectionBasicPubSubHandlers, OpenConnection, OpenConnectionOptions, TransportFactory } from '@/types/connection'\nimport type { ProtocolReadableStream, ProtocolReplyStream, ProtocolRequest, ProtocolStreamCompleteMessage } from '@/types/protocol'\nimport type { Transport } from '@/types/transport'\nimport { PubSubImpl } from '@/utils/pubsub'\n\nexport class ConnectionImpl extends PubSubImpl<ConnectionBasicPubSubHandlers> implements Connection {\n private _transport: Transport | undefined\n private _disposeTransportEvents: Dispose | undefined\n private _reconnectAttempts = 0\n private _reconnectTimer: any | undefined\n private _manualClose = false\n private _isReconnecting = false\n private _callbacks = new Map<string, { resolve: (data: any) => void, reject: (err: any) => void, timer: NodeJS.Timeout }>()\n private _streams = new Map<string, { enqueue: (data: any) => void, raise: (err: any) => void, complete: (value: any) => void, close: () => void }>()\n\n constructor(private readonly _options: OpenConnectionOptions) {\n super(err => this._handleError(err), new Set(['connection.error']))\n }\n\n get transport(): Transport {\n if (!this._transport) {\n throw new Error('Transport not connected')\n }\n return this._transport\n }\n\n async connect(): Promise<void> {\n this._manualClose = false\n await this._connect()\n }\n\n private _handleError(error: any) {\n this.emit('connection.error', error, this)\n }\n\n private async _connect(reconnecting = false): Promise<void> {\n try {\n const transportOrPromise = this._options.transport(this._options.token ?? '')\n const transport = await transportOrPromise\n this._transport = transport\n if (reconnecting) {\n this.emit('connection.reconnect', this._transport, this)\n }\n this._bindTransportEvents(transport)\n }\n catch (error) {\n this._handleError(error)\n throw error\n }\n }\n\n private _createStream(echo: string): [ReadableStream<any>, Promise<any>] {\n const deferred = { resolve: null, reject: null } as any\n const promise = new Promise<any>((res, rej) => {\n deferred.resolve = res\n deferred.reject = rej\n })\n\n return [new ReadableStream<any>({\n start: (controller) => {\n this._streams.set(echo, {\n enqueue: data => controller.enqueue(data),\n raise: (err) => {\n deferred.reject?.(err)\n controller.error(err)\n },\n complete: (value) => {\n deferred.resolve?.(value)\n controller.close()\n },\n close: () => controller.close(),\n })\n },\n cancel: () => {\n this._streams.delete(echo)\n deferred.reject?.(new Error('Stream canceled'))\n },\n }), promise]\n }\n\n request<const P, R = any>(method: string, args: P, stream?: false): Promise<R>\n request<const P, R = any>(method: string, args: P, stream: true): Promise<[ProtocolReadableStream, Promise<ProtocolStreamCompleteMessage<R>>]>\n request<P, R = any>(method: string, args?: P, stream?: boolean): Promise<R> | Promise<[ProtocolReadableStream, Promise<ProtocolStreamCompleteMessage<R>>]> {\n return new Promise<any>((resolve, reject) => {\n const echo = crypto.randomUUID()\n const request: ProtocolRequest = {\n action: method,\n params: args,\n echo,\n stream: stream ? 'stream-action' : 'normal-action',\n }\n\n if (stream) {\n const result = this._createStream(echo)\n try {\n this.emit('connection.request', request, this)\n this.transport.send(JSON.stringify(request))\n resolve(result)\n }\n catch (error) {\n this._streams.delete(echo)\n this._handleError(error)\n reject(error)\n }\n return\n }\n\n const timer = setTimeout(() => {\n if (this._callbacks.has(echo)) {\n this._callbacks.delete(echo)\n const error = new Error(`API Request Timeout: ${method}`)\n\n this._handleError(error)\n reject(error)\n }\n }, this._options.timeout)\n\n this._callbacks.set(echo, { resolve, reject, timer })\n\n try {\n this.emit('connection.request', request, this)\n this.transport.send(JSON.stringify(request))\n }\n catch (error) {\n clearTimeout(timer)\n this._callbacks.delete(echo)\n this._handleError(error)\n reject(error)\n }\n })\n }\n\n private _bindTransportEvents(transport: Transport) {\n this._disposeTransportEvents?.()\n\n const onOpen = () => {\n this.emit('connection.connected', transport, this)\n if (this._isReconnecting) {\n this._isReconnecting = false\n this._reconnectAttempts = 0\n clearTimeout(this._reconnectTimer)\n }\n }\n\n const onMessage = (event: { data: any }) => {\n const data = typeof event.data === 'string'\n ? (() => {\n try {\n return JSON.parse(event.data)\n }\n catch {\n return null\n }\n })()\n : event.data\n\n if (data) {\n this._handleMessage(data)\n }\n }\n\n const onError = (error: any) => {\n this.emit('connection.error', error, this)\n }\n\n const onClose = () => {\n this._disposeTransportEvents?.()\n this._disposeTransportEvents = undefined\n\n this.emit('connection.disconnected', transport, this)\n this._transport = undefined\n\n // Clear all pending streams\n for (const [_, { raise }] of this._streams) {\n raise(new Error('Connection closed'))\n }\n this._streams.clear()\n\n // Clear all pending requests\n for (const [_, { reject, timer }] of this._callbacks) {\n clearTimeout(timer)\n reject(new Error('Connection closed'))\n }\n this._callbacks.clear()\n\n if (!this._manualClose) {\n this._scheduleReconnect()\n }\n }\n\n transport.addEventListener('open', onOpen)\n transport.addEventListener('message', onMessage)\n transport.addEventListener('error', onError)\n transport.addEventListener('close', onClose)\n\n if (transport.readyState === 1 /* OPEN */) {\n onOpen()\n }\n\n this._disposeTransportEvents = () => {\n transport.removeEventListener('open', onOpen)\n transport.removeEventListener('message', onMessage)\n transport.removeEventListener('error', onError)\n transport.removeEventListener('close', onClose)\n }\n }\n\n private _handleMessage(data: any) {\n if (!data)\n return\n\n // Handle Reply\n if (data.echo) {\n this.emit('connection.reply', data, this)\n if (data.stream === 'stream-action') {\n this.emit('connection.reply.stream', data, this)\n\n const stream = this._streams.get(data.echo)\n if (!stream)\n return\n\n const message = data as ProtocolReplyStream\n if (message.status === 'ok') {\n if (message.data!.type === 'stream' && message.data!.data_type === 'data_chunk') {\n stream.enqueue(message.data!)\n }\n else if (message.data!.type === 'response' && message.data!.data_type === 'data_complete') {\n this._streams.delete(data.echo)\n stream.complete(message.data!)\n }\n }\n else if (message.status === 'failed') {\n this._streams.delete(data.echo)\n stream.raise(new Error(`Stream Error: ${message.message || `code ${message.retcode}`}`))\n }\n return\n }\n\n const pending = this._callbacks.get(data.echo)\n if (pending) {\n clearTimeout(pending.timer)\n this._callbacks.delete(data.echo)\n\n if (data.status === 'ok') {\n pending.resolve(data.data)\n }\n else {\n pending.reject(new Error(`Request Error: ${data.message || `code ${data.retcode}`}`))\n }\n return\n }\n }\n\n // Handle Event\n if (data.post_type) {\n this.emit('protocol.event', data, this)\n }\n }\n\n private _scheduleReconnect() {\n const { reconnect } = this._options\n if (!reconnect || this._manualClose)\n return\n\n const { attempts, interval } = reconnect\n\n if (attempts !== 'always' && this._reconnectAttempts >= attempts) {\n // Reconnect failed\n return this.emit('connection.error', new Error('Reconnect failed'), this)\n }\n\n this._isReconnecting = true\n this._reconnectAttempts++\n\n if (this._reconnectTimer)\n clearTimeout(this._reconnectTimer)\n\n this._reconnectTimer = setTimeout(() => {\n this._connect(true).catch(() => {\n this._scheduleReconnect()\n })\n }, interval)\n }\n\n close() {\n this._manualClose = true\n this._disposeTransportEvents?.()\n this._transport?.close()\n }\n\n [Symbol.dispose]() {\n this.close()\n }\n}\n\nexport const open: OpenConnection = function open(options: OpenConnectionOptions | TransportFactory, token?: string): Connection {\n if (typeof options === 'function') {\n options = { transport: options, token }\n }\n\n options.reconnect ??= {\n interval: 15000,\n attempts: 5,\n }\n\n options.timeout ??= 30000\n\n const conn = new ConnectionImpl(options)\n return conn\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { Ft as ProtocolMessageDiceSendSegment, Gt as ProtocolMessageLocationSegment, Ht as ProtocolMessageImageSendSegment, It as ProtocolMessageFaceSegment, Jt as ProtocolMessageMiniAppSegment, Kt as ProtocolMessageMarkdownSegment, Mt as ProtocolMessageContactSendSegment, Qt as ProtocolMessageOnlineFileSegment, Rt as ProtocolMessageFileSendSegment, Wt as ProtocolMessageJsonSendSegment, Xt as ProtocolMessageMusicSendSegment, _n as Numeric, an as ProtocolMessageReplySegment, en as ProtocolMessagePokeSendSegment, fn as ProtocolMessageVideoSendSegment, jt as ProtocolMessageAtSegment, nn as ProtocolMessageRecordSendSegment, pn as ProtocolMessageXmlSegment, qt as ProtocolMessageMfaceSendSegment, sn as ProtocolMessageRpsSendSegment, un as ProtocolMessageTextSegment, zt as ProtocolMessageFlashTransferSegment } from "../index-xpa8wXI0.mjs";
1
+ import { Ft as ProtocolMessageDiceSendSegment, Gt as ProtocolMessageLocationSegment, Ht as ProtocolMessageImageSendSegment, It as ProtocolMessageFaceSegment, Jt as ProtocolMessageMiniAppSegment, Kt as ProtocolMessageMarkdownSegment, Mt as ProtocolMessageContactSendSegment, Qt as ProtocolMessageOnlineFileSegment, Rt as ProtocolMessageFileSendSegment, Wt as ProtocolMessageJsonSendSegment, Xt as ProtocolMessageMusicSendSegment, an as ProtocolMessageReplySegment, en as ProtocolMessagePokeSendSegment, fn as ProtocolMessageVideoSendSegment, jt as ProtocolMessageAtSegment, nn as ProtocolMessageRecordSendSegment, pn as ProtocolMessageXmlSegment, qt as ProtocolMessageMfaceSendSegment, sn as ProtocolMessageRpsSendSegment, un as ProtocolMessageTextSegment, vn as Numeric, zt as ProtocolMessageFlashTransferSegment } from "../index-DbedAzOE.mjs";
2
2
 
3
3
  //#region src/utils/builder.d.ts
4
4
  declare namespace builder_d_exports {
@@ -1,4 +1,4 @@
1
- import { C as ProtocolReplyOk, N as ProtocolEventHandlers, _n as Numeric, a as ConnectionStreamResult, c as ProtocolEventHandler, cn as ProtocolMessageSegment, hn as MaybeArray, ln as ProtocolMessageSendSegment, n as Connection, r as ConnectionBasicPubSubHandlers } from "../index-xpa8wXI0.mjs";
1
+ import { B as ProtocolMessageEvent, C as ProtocolReplyOk, N as ProtocolEventHandlers, a as ConnectionStreamResult, c as ProtocolEventHandler, cn as ProtocolMessageSegment, gn as MaybeArray, jt as ProtocolMessageAtSegment, ln as ProtocolMessageSendSegment, mn as ProtocolSendableMessage, n as Connection, r as ConnectionBasicPubSubHandlers, vn as Numeric } from "../index-DbedAzOE.mjs";
2
2
  import { t as builder_d_exports } from "./builder.mjs";
3
3
  import { ZodType } from "zod";
4
4
 
@@ -11,11 +11,28 @@ interface EventMatcher<K extends keyof ProtocolEventHandlers> {
11
11
  (event: any): event is ProtocolEventHandlers[K];
12
12
  }
13
13
  //#endregion
14
+ //#region src/utils/message.d.ts
15
+ declare function findMention(message: ProtocolMessageSegment[] | string, uid: Numeric): ProtocolMessageAtSegment | undefined;
16
+ declare function hasMention({
17
+ message,
18
+ self_id
19
+ }: ProtocolMessageEvent, uid?: Numeric): boolean;
20
+ declare function respond(connection: Connection, event: ProtocolMessageEvent, message: ProtocolSendableMessage, quote?: boolean): Promise<ProtocolReplyOk<{
21
+ message_id: number;
22
+ }>>;
23
+ declare function extractText(message: ProtocolMessageSegment[] | string): string[];
24
+ declare function extractText(message: ProtocolMessageSegment[] | string, sep: string): string;
25
+ declare function filterSegments<const T extends ProtocolMessageSegment['type']>(type: T, message: ProtocolMessageSegment[] | string, cond?: (segment: Extract<ProtocolMessageSegment, {
26
+ type: T;
27
+ }>) => boolean): Array<Extract<ProtocolMessageSegment, {
28
+ type: T;
29
+ }>>;
30
+ //#endregion
14
31
  //#region src/utils/methods.d.ts
15
32
  interface ClientMethods {
16
33
  send_private_msg: (params: {
17
34
  user_id: number | string;
18
- message: string | ProtocolMessageSendSegment | (string | ProtocolMessageSendSegment)[];
35
+ message: ProtocolSendableMessage;
19
36
  group_id?: number | string;
20
37
  auto_escape?: boolean;
21
38
  }) => Promise<ProtocolReplyOk<{
@@ -23,7 +40,7 @@ interface ClientMethods {
23
40
  }>>;
24
41
  send_group_msg: (params: {
25
42
  group_id: number | string;
26
- message: string | ProtocolMessageSendSegment | (string | ProtocolMessageSendSegment)[];
43
+ message: ProtocolSendableMessage;
27
44
  auto_escape?: boolean;
28
45
  }) => Promise<ProtocolReplyOk<{
29
46
  message_id: number;
@@ -32,7 +49,7 @@ interface ClientMethods {
32
49
  message_type?: 'private' | 'group';
33
50
  user_id?: number | string;
34
51
  group_id?: number | string;
35
- message: string | ProtocolMessageSendSegment | (string | ProtocolMessageSendSegment)[];
52
+ message: ProtocolSendableMessage;
36
53
  auto_escape?: boolean;
37
54
  }) => Promise<ProtocolReplyOk<{
38
55
  message_id: number;
@@ -1042,14 +1059,13 @@ interface ClientStreamMethods {
1042
1059
  }>>;
1043
1060
  }
1044
1061
  declare function sendRequest<const T extends keyof ClientMethods>(conn: Connection, method: T, ...params: Parameters<ClientMethods[T]>): ReturnType<ClientMethods[T]>;
1045
- declare function sendRequest(conn: Connection, method: string, ...params: any[]): Promise<ProtocolReplyOk<any>>;
1046
1062
  declare function sendRequestStream<const T extends keyof ClientStreamMethods>(conn: Connection, method: T, ...params: Parameters<ClientStreamMethods[T]>): ReturnType<ClientStreamMethods[T]>;
1047
1063
  declare function sendRequestStream(conn: Connection, method: string, ...params: any[]): Promise<ConnectionStreamResult<any>>;
1048
1064
  type SendRequestResult<T extends keyof ClientMethods> = Awaited<ReturnType<ClientMethods[T]>>;
1049
1065
  type SendRequestStreamResult<T extends keyof ClientStreamMethods> = Awaited<ReturnType<ClientStreamMethods[T]>>;
1050
1066
  //#endregion
1051
1067
  //#region src/utils/segment.d.ts
1052
- declare function isMessageSegment<const T extends ProtocolMessageSendSegment['type'], R extends Extract<ProtocolMessageSegment, {
1068
+ declare function isMessageSegment<const T extends ProtocolMessageSegment['type'], R extends Extract<ProtocolMessageSegment, {
1053
1069
  type: T;
1054
1070
  }>>(type: T, value: any): value is R;
1055
1071
  declare function isMessageSegment(type: null, value: any): value is ProtocolMessageSegment;
@@ -1096,6 +1112,7 @@ declare class NumericSet implements Iterable<string> {
1096
1112
  static split(str?: string, sep?: string): NumericSet;
1097
1113
  }
1098
1114
  declare const noop: () => void;
1115
+ declare function toArray<const T>(value: T | T[]): T[];
1099
1116
  //#endregion
1100
- export { AsyncMessageTemplate, AsyncMessageTemplateInitial, ClientMethods, ClientStreamMethods, ConnectionOrProtocolEventHandlers, EventMatcher, MessageTemplate, MessageTemplateInitial, NumericSet, SendRequestResult, SendRequestStreamResult, asyncTemplate, createEventMatcher, createMessageSegment, defineHandler, findMessageSegment, isMessageSegment, isNull, isSameNumericId, matchEvent, matchEvent as when, noop, sendRequest, sendRequestStream, builder_d_exports as t, template };
1117
+ export { AsyncMessageTemplate, AsyncMessageTemplateInitial, ClientMethods, ClientStreamMethods, ConnectionOrProtocolEventHandlers, EventMatcher, MessageTemplate, MessageTemplateInitial, NumericSet, SendRequestResult, SendRequestStreamResult, asyncTemplate, builder_d_exports as builder, createEventMatcher, createMessageSegment, defineHandler, extractText, filterSegments, findMention, findMessageSegment, hasMention, isMessageSegment, isNull, isSameNumericId, matchEvent, matchEvent as when, noop, respond, sendRequest, sendRequestStream, template, toArray };
1101
1118
  //# sourceMappingURL=index.d.mts.map
@@ -1,2 +1,2 @@
1
- import{i as e,n as t,r as n,t as r}from"../value-DBEEtS4k.mjs";import{t as i}from"./builder.mjs";function a(e,t){return t}const o=new Map;function s(e){if(o.has(e))return o.get(e);if(e===`message.sent`){let t=e=>e.post_type===`message_sent`;return o.set(e,t),t}let[t,n,r,i]=e.split(`.`);t===`meta`&&(t=`meta_event`),t===`notice`&&(n===`group`?r===`reaction`?(n=`group_msg_emoji_like`,r=void 0):r===`essence`?(n=`essence`,r=i):r?(n=`group_${r}`,r=i):n=`group_`:(n===`friend`||n===`bot`)&&(r?(n=`${n}_${r}`,r=void 0):n=`${n}_`));let a=e=>{if(e.post_type!==t)return!1;if(n){let r=e[`${t}_type`];if(n.endsWith(`_`)){if(!r?.startsWith(n)&&!(n===`group_`&&r===`essence`))return!1}else if(r!==n)return!1}return!(r&&e.sub_type!==r)};return o.set(e,a),a}function c(e,t){let n=s(e);return a(`protocol.event`,(e,r)=>{n(e)&&t(e,r)})}function l(e,t,...n){return e.request(t,n[0])}function u(e,t,...n){return e.request(t,n[0],!0)}function d(e,t){return typeof t==`object`&&!!t&&typeof t.type==`string`&&(e?t.type===e:!0)}function f(e,t){return{type:e,data:t}}function p(e,t,n){return t&&Array.isArray(t)?t.find(t=>d(e,t)&&n!=null&&n(t)):void 0}function m({props:e,build:t}){return n=>{let r=e.safeParse(n);if(!r.success)throw Error(r.error.message);let i=t(r.data);return Array.isArray(i)?i:[i]}}function h({props:e,build:t}){return async n=>{let r=await e.safeParseAsync(n);if(!r.success)throw Error(r.error.message);let i=await t(r.data);return Array.isArray(i)?i:[i]}}export{r as NumericSet,h as asyncTemplate,s as createEventMatcher,f as createMessageSegment,a as defineHandler,p as findMessageSegment,d as isMessageSegment,t as isNull,n as isSameNumericId,c as matchEvent,c as when,e as noop,l as sendRequest,u as sendRequestStream,i as t,m as template};
1
+ import{a as e,i as t,n,r,t as i}from"../value-CXqvIDVX.mjs";import{t as a}from"./builder.mjs";function o(e,t){return t}const s=new Map;function c(e){if(s.has(e))return s.get(e);if(e===`message.sent`){let t=e=>e.post_type===`message_sent`;return s.set(e,t),t}let[t,n,r,i]=e.split(`.`);t===`meta`&&(t=`meta_event`),t===`notice`&&(n===`group`?r===`reaction`?(n=`group_msg_emoji_like`,r=void 0):r===`essence`?(n=`essence`,r=i):r?(n=`group_${r}`,r=i):n=`group_`:(n===`friend`||n===`bot`)&&(r?(n=`${n}_${r}`,r=void 0):n=`${n}_`));let a=e=>{if(e.post_type!==t)return!1;if(n){let r=e[`${t}_type`];if(n.endsWith(`_`)){if(!r?.startsWith(n)&&!(n===`group_`&&r===`essence`))return!1}else if(r!==n)return!1}return!(r&&e.sub_type!==r)};return s.set(e,a),a}function l(e,t){let n=c(e);return o(`protocol.event`,(e,r)=>{n(e)&&t(e,r)})}function u(e,t,...n){return e.request(t,n[0])}function d(e,t,...n){return e.request(t,n[0],!0)}function f(e,t){return typeof t==`object`&&!!t&&typeof t.type==`string`&&(e?t.type===e:!0)}function p(e,t){return{type:e,data:t}}function m(e,t,n){return t&&Array.isArray(t)?t.find(t=>f(e,t)&&n!=null&&n(t)):void 0}function h(e,t){return m(`at`,e,e=>r(e.data.qq,t))}function g({message:e,self_id:t},n){return h(e,n??t)!=null}function _(t,n,r,i=!1){return u(t,`send_msg`,{message:i?[{type:`reply`,data:{id:n.message_id}},...e(r)]:r,message_type:n.message_type,...n.message_type===`group`?{group_id:n.group_id}:{user_id:n.user_id},auto_escape:!0})}function v(e,t){let n=Array.isArray(e)?y(`text`,e).map(e=>e.data.text):[e];return t?n.join(t):n}function y(e,t,n){return Array.isArray(t)?t.filter(t=>f(e,t)&&n?.(t)):[]}function b({props:e,build:t}){return n=>{let r=e.safeParse(n);if(!r.success)throw Error(r.error.message);let i=t(r.data);return Array.isArray(i)?i:[i]}}function x({props:e,build:t}){return async n=>{let r=await e.safeParseAsync(n);if(!r.success)throw Error(r.error.message);let i=await t(r.data);return Array.isArray(i)?i:[i]}}export{i as NumericSet,x as asyncTemplate,a as builder,c as createEventMatcher,p as createMessageSegment,o as defineHandler,v as extractText,y as filterSegments,h as findMention,m as findMessageSegment,g as hasMention,f as isMessageSegment,n as isNull,r as isSameNumericId,l as matchEvent,l as when,t as noop,_ as respond,u as sendRequest,d as sendRequestStream,b as template,e as toArray};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/utils/event.ts","../../src/utils/methods.ts","../../src/utils/segment.ts","../../src/utils/template.ts"],"sourcesContent":["import type { ConnectionBasicPubSubHandlers, ProtocolEventHandler, ProtocolEventHandlers } from '@/types'\n\nexport type ConnectionOrProtocolEventHandlers = ConnectionBasicPubSubHandlers & ProtocolEventHandlers & {}\n\nexport function defineHandler<const K extends keyof ConnectionOrProtocolEventHandlers, const F extends (...args: ConnectionOrProtocolEventHandlers[K]) => void>(\n type: K,\n handler: F,\n): F {\n return handler\n}\n\nconst cachedMatchers = new Map<string, (event: any) => boolean>()\n\nexport function createEventMatcher<const K extends keyof ProtocolEventHandlers>(\n type: K,\n): EventMatcher<K> {\n if (cachedMatchers.has(type)) {\n return cachedMatchers.get(type) as any\n }\n\n if (type === 'message.sent') {\n const matcher = (event: any) => event.post_type === 'message_sent'\n cachedMatchers.set(type, matcher)\n return matcher as EventMatcher<K>\n }\n\n let [typeA, typeB, typeC, typeD] = type.split('.')\n if (typeA === 'meta') {\n typeA = 'meta_event'\n }\n if (typeA === 'notice') {\n if (typeB === 'group') {\n if (typeC === 'reaction') {\n typeB = 'group_msg_emoji_like'\n typeC = undefined\n }\n else if (typeC === 'essence') {\n typeB = 'essence'\n typeC = typeD\n }\n else if (typeC) {\n typeB = `group_${typeC}`\n typeC = typeD\n }\n else {\n typeB = 'group_'\n }\n }\n else if (typeB === 'friend' || typeB === 'bot') {\n if (typeC) {\n typeB = `${typeB}_${typeC}`\n typeC = undefined\n }\n else {\n typeB = `${typeB}_`\n }\n }\n else if (typeB === 'notify') {\n if (typeC === 'group_name' || typeC === 'group_title') {\n // no change needed as typeC already matches the subtype\n }\n }\n }\n\n const matcher = (event: any) => {\n if (event.post_type !== typeA)\n return false\n\n if (typeB) {\n const actualTypeB = event[`${typeA!}_type`]!\n\n if (typeB.endsWith('_')) {\n if (!actualTypeB?.startsWith(typeB)) {\n // Special case for notice.group matching essence events\n if (typeB === 'group_' && actualTypeB === 'essence') {\n // allow\n }\n else {\n return false\n }\n }\n }\n else {\n if (actualTypeB !== typeB) {\n return false\n }\n }\n }\n\n if (typeC) {\n if (event.sub_type !== typeC) {\n return false\n }\n }\n\n return true\n }\n\n cachedMatchers.set(type, matcher)\n return matcher as EventMatcher<K>\n}\n\nexport function matchEvent<const K extends keyof ProtocolEventHandlers>(\n type: K,\n handler: (...args: ProtocolEventHandlers[K]) => void,\n): ProtocolEventHandler {\n const matcher = createEventMatcher(type)\n return defineHandler('protocol.event', (event: any, connection) => {\n if (matcher(event)) {\n (handler as any)(event, connection)\n }\n })\n}\n\nexport { matchEvent as when }\n\nexport interface EventMatcher<\n K extends keyof ProtocolEventHandlers,\n> {\n (event: any): event is ProtocolEventHandlers[K]\n}\n","import type { Connection, ConnectionStreamResult } from '@/types'\nimport type { ProtocolMessageSendSegment } from '@/types/message'\nimport type { ProtocolReplyOk } from '@/types/protocol'\n\nexport interface ClientMethods {\n send_private_msg: (params: {\n user_id: number | string\n message: string | ProtocolMessageSendSegment | (string | ProtocolMessageSendSegment)[]\n group_id?: number | string\n auto_escape?: boolean\n }) => Promise<ProtocolReplyOk<{ message_id: number }>>\n\n send_group_msg: (params: {\n group_id: number | string\n message: string | ProtocolMessageSendSegment | (string | ProtocolMessageSendSegment)[]\n auto_escape?: boolean\n }) => Promise<ProtocolReplyOk<{ message_id: number }>>\n\n send_msg: (params: {\n message_type?: 'private' | 'group'\n user_id?: number | string\n group_id?: number | string\n message: string | ProtocolMessageSendSegment | (string | ProtocolMessageSendSegment)[]\n auto_escape?: boolean\n }) => Promise<ProtocolReplyOk<{ message_id: number }>>\n\n delete_msg: (params: { message_id: number }) => Promise<ProtocolReplyOk<void>>\n\n get_msg: (params: { message_id: number }) => Promise<ProtocolReplyOk<{\n time: number\n message_type: 'private' | 'group'\n message_id: number\n real_id: number\n sender: {\n user_id: number\n nickname: string\n card?: string\n sex?: 'male' | 'female' | 'unknown'\n age?: number\n }\n message: ProtocolMessageSendSegment[]\n }>>\n\n get_forward_msg: (params: { id: string }) => Promise<ProtocolReplyOk<{\n message: (ProtocolMessageSendSegment & { data: { name?: string, uin?: string, content?: ProtocolMessageSendSegment[] } })[]\n }>>\n\n send_like: (params: { user_id: number | string, times?: number }) => Promise<ProtocolReplyOk<void>>\n\n set_msg_emoji_like: (params: {\n message_id: number\n emoji_id: string\n set?: boolean\n }) => Promise<ProtocolReplyOk<void>>\n\n set_group_kick: (params: {\n group_id: number | string\n user_id: number | string\n reject_add_request?: boolean\n }) => Promise<ProtocolReplyOk<void>>\n\n set_group_ban: (params: {\n group_id: number | string\n user_id: number | string\n duration?: number\n }) => Promise<ProtocolReplyOk<void>>\n\n set_group_whole_ban: (params: {\n group_id: number | string\n enable?: boolean\n }) => Promise<ProtocolReplyOk<void>>\n\n set_group_admin: (params: {\n group_id: number | string\n user_id: number | string\n enable?: boolean\n }) => Promise<ProtocolReplyOk<void>>\n\n set_group_card: (params: {\n group_id: number | string\n user_id: number | string\n card?: string\n }) => Promise<ProtocolReplyOk<void>>\n\n set_group_name: (params: {\n group_id: number | string\n group_name: string\n }) => Promise<ProtocolReplyOk<void>>\n\n set_group_leave: (params: {\n group_id: number | string\n is_dismiss?: boolean\n }) => Promise<ProtocolReplyOk<void>>\n\n set_group_special_title: (params: {\n group_id: number | string\n user_id: number | string\n special_title?: string\n duration?: number\n }) => Promise<ProtocolReplyOk<void>>\n\n set_group_sign: (params: {\n group_id: number | string\n }) => Promise<ProtocolReplyOk<void>>\n\n set_friend_add_request: (params: {\n flag: string\n approve?: boolean\n remark?: string\n }) => Promise<ProtocolReplyOk<void>>\n\n delete_friend: (params: {\n user_id: number | string\n temp_block?: boolean\n temp_both_del?: boolean\n }) => Promise<ProtocolReplyOk<void>>\n\n set_group_add_request: (params: {\n flag: string\n sub_type?: 'add' | 'invite'\n approve?: boolean\n reason?: string\n }) => Promise<ProtocolReplyOk<void>>\n\n get_login_info: () => Promise<ProtocolReplyOk<{\n user_id: number\n nickname: string\n }>>\n\n get_stranger_info: (params: {\n user_id: number | string\n no_cache?: boolean\n }) => Promise<ProtocolReplyOk<{\n user_id: number\n nickname: string\n sex: 'male' | 'female' | 'unknown'\n age: number\n }>>\n\n get_friend_list: () => Promise<ProtocolReplyOk<{\n user_id: number\n nickname: string\n remark: string\n }[]>>\n\n get_group_info: (params: {\n group_id: number | string\n no_cache?: boolean\n }) => Promise<ProtocolReplyOk<{\n group_id: number\n group_name: string\n member_count: number\n max_member_count: number\n }>>\n\n get_group_list: (params?: {\n no_cache?: boolean\n }) => Promise<ProtocolReplyOk<{\n group_id: number\n group_name: string\n member_count: number\n max_member_count: number\n group_remark: string\n group_all_shut: number\n }[]>>\n\n get_group_member_info: (params: {\n group_id: number | string\n user_id: number | string\n no_cache?: boolean\n }) => Promise<ProtocolReplyOk<{\n group_id: number\n user_id: number\n nickname: string\n card: string\n sex: 'male' | 'female' | 'unknown'\n age: number\n area: string\n join_time: number\n last_sent_time: number\n level: string\n role: 'owner' | 'admin' | 'member'\n unfriendly: boolean\n title: string\n title_expire_time: number\n card_changeable: boolean\n }>>\n\n get_group_member_list: (params: {\n group_id: number | string\n }) => Promise<ProtocolReplyOk<{\n group_id: number\n user_id: number\n nickname: string\n card: string\n sex: 'male' | 'female' | 'unknown'\n age: number\n area: string\n join_time: number\n last_sent_time: number\n level: string\n role: 'owner' | 'admin' | 'member'\n unfriendly: boolean\n title: string\n title_expire_time: number\n card_changeable: boolean\n }[]>>\n\n get_group_honor_info: (params: {\n group_id: number | string\n type: 'talkative' | 'performer' | 'legend' | 'strong_newbie' | 'emotion' | 'all'\n }) => Promise<ProtocolReplyOk<{\n group_id: number\n current_talkative?: {\n user_id: number\n nickname: string\n avatar: string\n day_count: number\n }\n talkative_list?: {\n user_id: number\n nickname: string\n avatar: string\n day_count: number\n }[]\n performer_list?: {\n user_id: number\n nickname: string\n avatar: string\n day_count: number\n }[]\n legend_list?: {\n user_id: number\n nickname: string\n avatar: string\n day_count: number\n }[]\n strong_newbie_list?: {\n user_id: number\n nickname: string\n avatar: string\n day_count: number\n }[]\n emotion_list?: {\n user_id: number\n nickname: string\n avatar: string\n day_count: number\n }[]\n }>>\n\n get_cookies: (params: { domain: string }) => Promise<ProtocolReplyOk<{ cookies: string, bkn: string }>>\n\n get_csrf_token: () => Promise<ProtocolReplyOk<{ token: number }>>\n\n get_credentials: (params: { domain: string }) => Promise<ProtocolReplyOk<{ cookies: string, token: number }>>\n\n get_record: (params: { file: string, out_format: string }) => Promise<ProtocolReplyOk<{ file: string, url?: string }>>\n\n get_image: (params: { file: string }) => Promise<ProtocolReplyOk<{ file: string, url?: string }>>\n\n can_send_image: () => Promise<ProtocolReplyOk<{ yes: boolean }>>\n can_send_record: () => Promise<ProtocolReplyOk<{ yes: boolean }>>\n\n get_status: () => Promise<ProtocolReplyOk<{\n online: boolean\n good: boolean\n }>>\n\n get_version_info: () => Promise<ProtocolReplyOk<{\n app_name: string\n app_version: string\n protocol_version: string\n }>>\n\n clean_cache: () => Promise<ProtocolReplyOk<void>>\n\n _send_group_notice: (params: {\n group_id: number | string\n content: string\n image?: string\n pinned?: number\n type?: number\n confirm_required?: number\n is_show_edit_card?: number\n tip_window_type?: number\n }) => Promise<ProtocolReplyOk<void>>\n\n _get_group_notice: (params: {\n group_id: number | string\n }) => Promise<ProtocolReplyOk<{\n sender_id: number\n publish_time: number\n notice_id: string\n message: {\n text: string\n image: string[]\n }\n read_num: number\n }[]>>\n\n get_essence_msg_list: (params: {\n group_id: number | string\n }) => Promise<ProtocolReplyOk<{\n msg_seq: number\n msg_random: number\n sender_id: number\n sender_nick: string\n operator_id: number\n operator_nick: string\n message_id: number\n operator_time: number\n content: string[]\n }[]>>\n\n set_essence_msg: (params: { message_id: number }) => Promise<ProtocolReplyOk<void>>\n\n delete_essence_msg: (params: { message_id: number }) => Promise<ProtocolReplyOk<void>>\n\n get_online_clients: (params?: { no_cache?: boolean }) => Promise<ProtocolReplyOk<{\n app_id: number\n device_name: string\n device_kind: string\n }[]>>\n\n ocr_image: (params: { image: string }) => Promise<ProtocolReplyOk<{\n texts: {\n text: string\n coordinates: any[]\n }[]\n }>>\n\n translate_en2zh: (params: { words: string[] }) => Promise<ProtocolReplyOk<{\n words: string[]\n }>>\n\n get_robot_uin_range: () => Promise<ProtocolReplyOk<{\n minUin: string\n maxUin: string\n }[]>>\n\n set_online_status: (params: {\n status: number | string\n ext_status: number | string\n battery_status: number | string\n }) => Promise<ProtocolReplyOk<void>>\n\n upload_group_file: (params: {\n group_id: number | string\n file: string\n name: string\n folder?: string\n folder_id?: string\n upload_file?: boolean\n }) => Promise<ProtocolReplyOk<{ file_id?: string }>>\n\n get_group_msg_history: (params: {\n group_id: number | string\n message_seq?: string | number\n count?: number\n reverse_order?: boolean\n }) => Promise<ProtocolReplyOk<{\n messages: any[]\n }>>\n\n send_group_forward_msg: (params: {\n group_id: number | string\n messages: any[]\n }) => Promise<ProtocolReplyOk<{\n message_id: number\n forward_id: string\n }>>\n\n mark_msg_as_read: (params: {\n group_id?: number | string\n user_id?: number | string\n }) => Promise<ProtocolReplyOk<void>>\n\n upload_private_file: (params: {\n user_id: number | string\n file: string\n name: string\n }) => Promise<ProtocolReplyOk<void>>\n\n get_file: (params: {\n file: string\n file_id?: string\n }) => Promise<ProtocolReplyOk<{\n file?: string\n url?: string\n file_size?: string\n file_name?: string\n base64?: string\n }>>\n\n handle_quick_operation: (params: {\n context: Record<string, any>\n operation: Record<string, any>\n }) => Promise<ProtocolReplyOk<void>>\n\n get_group_file_url: (params: {\n group_id: number | string\n file_id: string\n }) => Promise<ProtocolReplyOk<{ url: string }>>\n\n get_private_file_url: (params: {\n user_id?: number | string\n file_id: string\n }) => Promise<ProtocolReplyOk<{ url: string }>>\n\n clean_stream_temp_file: (params: Record<string, never>) => Promise<ProtocolReplyOk<void>>\n\n del_group_album_media: (params: {\n group_id: string | number\n album_id: string\n lloc: string\n }) => Promise<ProtocolReplyOk<{ result: any }>>\n\n set_group_album_media_like: (params: {\n group_id: string | number\n album_id: string\n lloc: string\n id: string\n set?: boolean\n }) => Promise<ProtocolReplyOk<{ result: any }>>\n\n do_group_album_comment: (params: {\n group_id: string | number\n album_id: string\n lloc: string\n content: string\n }) => Promise<ProtocolReplyOk<{ result: any }>>\n\n get_group_album_media_list: (params: {\n group_id: string | number\n album_id: string\n attach_info?: string\n }) => Promise<ProtocolReplyOk<{\n media_list: {\n media_id: string\n url: string\n }[]\n }>>\n\n get_qun_album_list: (params: {\n group_id: string | number\n }) => Promise<ProtocolReplyOk<{\n album_id: string\n album_name: string\n cover_url: string\n create_time: number\n }[]>>\n\n upload_image_to_qun_album: (params: {\n group_id: string | number\n album_id: string\n album_name: string\n file: string\n }) => Promise<ProtocolReplyOk<{ result: any }>>\n\n set_group_add_option: (params: {\n group_id: string | number\n add_type: number\n group_question?: string\n group_answer?: string\n }) => Promise<ProtocolReplyOk<void>>\n\n set_group_robot_add_option: (params: {\n group_id: string | number\n robot_member_switch?: number\n robot_member_examine?: number\n }) => Promise<ProtocolReplyOk<void>>\n\n set_group_search: (params: {\n group_id: string | number\n no_code_finger_open?: number\n no_finger_open?: number\n }) => Promise<ProtocolReplyOk<void>>\n\n get_group_info_ex: (params: {\n group_id: string | number\n }) => Promise<ProtocolReplyOk<Record<string, any>>>\n\n set_group_todo: (params: {\n group_id: string | number\n message_id: string\n message_seq?: string\n }) => Promise<ProtocolReplyOk<void>>\n\n group_poke: (params: {\n group_id: string | number\n user_id: string | number\n target_id: string | number\n }) => Promise<ProtocolReplyOk<void>>\n\n set_group_kick_members: (params: {\n group_id: string | number\n user_id: (string | number)[]\n reject_add_request?: boolean\n }) => Promise<ProtocolReplyOk<void>>\n\n create_collection: (params: {\n rawData: string\n brief: string\n }) => Promise<ProtocolReplyOk<{ result: number, errMsg: string }>>\n\n set_self_longnick: (params: {\n longNick: string\n }) => Promise<ProtocolReplyOk<void>>\n\n set_qq_avatar: (params: {\n file: string\n }) => Promise<ProtocolReplyOk<void>>\n\n get_clientkey: () => Promise<ProtocolReplyOk<{ clientkey: string }>>\n\n get_ai_characters: (params: {\n group_id: string | number\n chat_type?: number | string\n }) => Promise<ProtocolReplyOk<{\n type: string\n characters: {\n character_id: string\n character_name: string\n preview_url: string\n }[]\n }[]>>\n\n set_doubt_friends_add_request: (params: {\n flag: string\n approve?: boolean\n }) => Promise<ProtocolReplyOk<void>>\n\n get_doubt_friends_add_request: (params: {\n count?: number\n }) => Promise<ProtocolReplyOk<{\n user_id: number\n nickname: string\n age: number\n sex: string\n reason: string\n flag: string\n }[]>>\n\n nc_get_packet_status: () => Promise<ProtocolReplyOk<void>>\n\n set_restart: () => Promise<ProtocolReplyOk<void>>\n\n get_group_system_msg: (params: {\n count?: number | string\n }) => Promise<ProtocolReplyOk<{\n invited_requests: any[]\n InvitedRequest: any[]\n join_requests: any[]\n }>>\n\n set_friend_remark: (params: {\n user_id: string | number\n remark: string\n }) => Promise<ProtocolReplyOk<void>>\n\n get_recent_contact: (params: {\n count?: number | string\n }) => Promise<ProtocolReplyOk<{\n lastestMsg: any\n peerUin: string\n remark: string\n msgTime: string\n chatType: number\n msgId: string\n sendNickName: string\n sendMemberName: string\n peerName: string\n }[]>>\n\n get_rkey: () => Promise<ProtocolReplyOk<{\n type: string\n rkey: string\n created_at: number\n ttl: number\n }[]>>\n\n get_rkey_server: () => Promise<ProtocolReplyOk<{\n private_rkey: string\n group_rkey: string\n expired_time: number\n name: string\n }>>\n\n fetch_custom_face: (params: {\n count?: number | string\n }) => Promise<ProtocolReplyOk<string[]>>\n\n nc_get_user_status: (params: {\n user_id: string | number\n }) => Promise<ProtocolReplyOk<{\n status: number\n ext_status: number\n }>>\n\n nc_get_rkey: () => Promise<ProtocolReplyOk<{\n key: string\n expired: number\n }[]>>\n\n get_mini_app_ark: (params: Record<string, any>) => Promise<ProtocolReplyOk<{\n data: { ark: any }\n }>>\n\n send_packet: (params: {\n cmd: string\n data: string\n rsp?: boolean | string\n }) => Promise<ProtocolReplyOk<string | null>>\n\n bot_exit: () => Promise<ProtocolReplyOk<void>>\n\n get_collection_list: (params: {\n category: string\n count?: string\n }) => Promise<ProtocolReplyOk<{\n errCode: number\n errMsg: string\n collectionSearchList: {\n collectionItemList: any[]\n hasMore: boolean\n bottomTimeStamp: string\n }\n }>>\n\n fetch_emoji_like: (params: {\n message_id: number | string\n emojiId: number | string\n emojiType: number | string\n count?: number | string\n cookie?: string\n }) => Promise<ProtocolReplyOk<{\n emojiLikesList: {\n tinyId: string\n nickName: string\n headUrl: string\n }[]\n cookie: string\n isLastPage: boolean\n isFirstPage: boolean\n result: number\n errMsg: string\n }>>\n\n get_emoji_likes: (params: {\n group_id?: string\n message_id: string\n emoji_id: string\n emoji_type?: string\n count?: number\n }) => Promise<ProtocolReplyOk<{\n emoji_like_list: {\n user_id: string\n nick_name: string\n }[]\n }>>\n\n ArkShareGroup: (params: {\n group_id: string\n }) => Promise<ProtocolReplyOk<string>>\n\n ArkSharePeer: (params: {\n user_id?: string\n group_id?: string\n phone_number?: string\n }) => Promise<ProtocolReplyOk<{ ark: any }>>\n\n click_inline_keyboard_button: (params: {\n group_id: string\n bot_appid: string\n button_id?: string\n callback_data?: string\n msg_seq?: string\n }) => Promise<ProtocolReplyOk<void>>\n\n move_group_file: (params: {\n group_id: string\n file_id: string\n current_parent_directory: string\n target_parent_directory: string\n }) => Promise<ProtocolReplyOk<{ ok: boolean }>>\n\n rename_group_file: (params: {\n group_id: string\n file_id: string\n current_parent_directory: string\n new_name: string\n }) => Promise<ProtocolReplyOk<{ ok: boolean }>>\n\n trans_group_file: (params: {\n group_id: string\n file_id: string\n }) => Promise<ProtocolReplyOk<{ ok: boolean }>>\n\n create_flash_task: (params: {\n files: string[] | string\n name?: string\n thumb_path?: string\n }) => Promise<ProtocolReplyOk<{ task_id: string }>>\n\n get_flash_file_list: (params: {\n fileset_id: string\n }) => Promise<ProtocolReplyOk<{\n file_name: string\n size: number\n }[]>>\n\n get_flash_file_url: (params: {\n fileset_id: string\n file_name?: string\n file_index?: number\n }) => Promise<ProtocolReplyOk<{ url: string }>>\n\n send_flash_msg: (params: {\n fileset_id: string\n user_id?: string\n group_id?: string\n }) => Promise<ProtocolReplyOk<{ message_id: number }>>\n\n get_share_link: (params: {\n fileset_id: string\n }) => Promise<ProtocolReplyOk<string>>\n\n get_fileset_info: (params: {\n fileset_id: string\n }) => Promise<ProtocolReplyOk<{\n fileset_id: string\n file_list: any[]\n }>>\n\n get_online_file_msg: (params: {\n user_id: string\n }) => Promise<ProtocolReplyOk<void>>\n\n send_online_file: (params: {\n user_id: string\n file_path: string\n file_name?: string\n }) => Promise<ProtocolReplyOk<void>>\n\n send_online_folder: (params: {\n user_id: string\n folder_path: string\n folder_name?: string\n }) => Promise<ProtocolReplyOk<void>>\n\n receive_online_file: (params: {\n user_id: string\n msg_id: string\n element_id: string\n }) => Promise<ProtocolReplyOk<void>>\n\n refuse_online_file: (params: {\n user_id: string\n msg_id: string\n element_id: string\n }) => Promise<ProtocolReplyOk<void>>\n\n cancel_online_file: (params: {\n user_id: string\n msg_id: string\n }) => Promise<ProtocolReplyOk<void>>\n\n download_fileset: (params: {\n fileset_id: string\n }) => Promise<ProtocolReplyOk<void>>\n\n get_fileset_id: (params: {\n share_code: string\n }) => Promise<ProtocolReplyOk<{ fileset_id: string }>>\n\n get_friends_with_category: () => Promise<ProtocolReplyOk<{\n categoryId: number\n categoryName: string\n categoryMbCount: number\n buddyList: any[]\n }[]>>\n\n get_profile_like: (params: {\n user_id: string\n start?: number | string\n count?: number | string\n }) => Promise<ProtocolReplyOk<{\n uid: string\n time: string\n favoriteInfo: any\n voteInfo: any\n }>>\n\n set_diy_online_status: (params: {\n face_id: number | string\n face_type: number | string\n wording: string\n }) => Promise<ProtocolReplyOk<string>>\n\n get_unidirectional_friend_list: () => Promise<ProtocolReplyOk<{\n uin: number\n uid: string\n nick_name: string\n age: number\n source: string\n }[]>>\n\n get_guild_list: () => Promise<ProtocolReplyOk<{\n guild_id: string\n guild_name: string\n }[]>>\n\n get_guild_service_profile: (params: {\n guild_id: string\n }) => Promise<ProtocolReplyOk<{\n guild_id: string\n guild_name: string\n guild_display_id: string\n }>>\n\n get_ai_record: (params: {\n character: string\n group_id: string\n text: string\n }) => Promise<ProtocolReplyOk<string>>\n\n send_group_ai_record: (params: {\n character: string\n group_id: string\n text: string\n }) => Promise<ProtocolReplyOk<void>>\n\n set_group_remark: (params: {\n group_id: number | string\n remark: string\n }) => Promise<ProtocolReplyOk<void>>\n\n get_group_ignored_notifies: (params?: {\n group_id?: number | string\n }) => Promise<ProtocolReplyOk<{\n invited_requests?: any[]\n InvitedRequest?: any[]\n join_requests?: any[]\n }>>\n\n _del_group_notice: (params: {\n group_id: number | string\n notice_id: string\n }) => Promise<ProtocolReplyOk<void>>\n\n get_group_shut_list: (params: {\n group_id: number | string\n }) => Promise<ProtocolReplyOk<{\n user_id: number\n nickname: string\n shut_up_time: number\n }[]>>\n\n set_input_status: (params: {\n user_id: number | string\n event_type: number\n }) => Promise<ProtocolReplyOk<void>>\n\n set_qq_profile: (params: {\n nickname: string\n personal_note?: string\n sex?: number | string\n }) => Promise<ProtocolReplyOk<void>>\n\n get_group_root_files: (params: {\n group_id: number | string\n file_count?: number\n }) => Promise<ProtocolReplyOk<{\n files: any[]\n folders: any[]\n }>>\n\n check_url_safely: (params: {\n url: string\n }) => Promise<ProtocolReplyOk<{\n level: number\n }>>\n\n get_group_at_all_remain: (params: {\n group_id: number | string\n }) => Promise<ProtocolReplyOk<{\n can_at_all: boolean\n remain_at_all_count_for_group: number\n remain_at_all_count_for_uin: number\n }>>\n\n send_forward_msg: (params: {\n message_type?: 'private' | 'group'\n user_id?: number | string\n group_id?: number | string\n message: any\n auto_escape?: boolean\n source?: string\n news?: any[]\n summary?: string\n prompt?: string\n }) => Promise<ProtocolReplyOk<{\n message_id: number\n res_id: string\n forward_id: string\n }>>\n\n send_private_forward_msg: (params: {\n user_id: number | string\n message: any\n auto_escape?: boolean\n source?: string\n news?: any[]\n summary?: string\n prompt?: string\n }) => Promise<ProtocolReplyOk<{\n message_id: number\n res_id: string\n forward_id: string\n }>>\n\n download_file: (params: {\n url: string\n base64?: string\n name?: string\n headers?: string | string[]\n }) => Promise<ProtocolReplyOk<{\n file: string\n }>>\n\n get_friend_msg_history: (params: {\n user_id: number | string\n message_seq?: number | string\n count?: number\n reverse_order?: boolean\n disable_get_url?: boolean\n parse_mult_msg?: boolean\n quick_reply?: boolean\n }) => Promise<ProtocolReplyOk<{\n messages: any[]\n }>>\n\n set_group_portrait: (params: {\n group_id: number | string\n file: string\n }) => Promise<ProtocolReplyOk<{\n result: number\n errMsg: string\n }>>\n\n _get_model_show: (params: {\n model: string\n }) => Promise<ProtocolReplyOk<{\n variants: {\n model_show: string\n need_pay: boolean\n }[]\n }>>\n\n _set_model_show: (params: {\n model: string\n model_show: string\n }) => Promise<ProtocolReplyOk<void>>\n\n delete_group_file: (params: {\n group_id: number | string\n file_id: string\n }) => Promise<ProtocolReplyOk<void>>\n\n create_group_file_folder: (params: {\n group_id: number | string\n folder_name: string\n name?: string\n }) => Promise<ProtocolReplyOk<{\n result: any\n groupItem: any\n }>>\n\n delete_group_folder: (params: {\n group_id: number | string\n folder_id: string\n }) => Promise<ProtocolReplyOk<void>>\n\n get_group_file_system_info: (params: {\n group_id: number | string\n }) => Promise<ProtocolReplyOk<{\n file_count: number\n limit_count: number\n used_space: number\n total_space: number\n }>>\n\n get_group_files_by_folder: (params: {\n group_id: number | string\n folder_id: string\n file_count?: number\n }) => Promise<ProtocolReplyOk<{\n files: any[]\n folders: any[]\n }>>\n\n forward_friend_single_msg: (params: {\n message_id: number | string\n group_id?: number | string\n user_id: number | string\n }) => Promise<ProtocolReplyOk<void>>\n\n forward_group_single_msg: (params: {\n message_id: number | string\n group_id: number | string\n user_id?: number | string\n }) => Promise<ProtocolReplyOk<void>>\n\n mark_group_msg_as_read: (params: {\n user_id?: number | string\n group_id: number | string\n message_id?: number | string\n }) => Promise<ProtocolReplyOk<void>>\n\n mark_private_msg_as_read: (params: {\n user_id: number | string\n group_id?: number | string\n message_id?: number | string\n }) => Promise<ProtocolReplyOk<void>>\n\n _mark_all_as_read: () => Promise<ProtocolReplyOk<void>>\n\n send_poke: (params: {\n user_id: number | string\n group_id?: number | string\n target_id?: number | string\n }) => Promise<ProtocolReplyOk<void>>\n\n upload_file_stream: (params: {\n stream_id: string\n chunk_data?: string\n chunk_index?: number\n total_chunks?: number\n file_size?: number\n expected_sha256?: string\n is_complete?: boolean\n filename?: string\n reset?: boolean\n verify_only?: boolean\n file_retention?: number\n }) => Promise<ProtocolReplyOk<{\n type: string\n stream_id: string\n status: string\n received_chunks: number\n total_chunks: number\n }>>\n}\n\nexport interface ClientStreamMethods {\n download_file_record_stream: (params: {\n file: string\n file_id?: string\n chunk_size?: number\n out_format?: string\n }) => Promise<ConnectionStreamResult<{ file: string }>>\n\n download_file_image_stream: (params: {\n file: string\n file_id?: string\n chunk_size?: number\n }) => Promise<ConnectionStreamResult<{ file: string }>>\n\n test_download_stream: (params: {\n error?: boolean\n }) => Promise<ConnectionStreamResult<{ success: boolean }>>\n\n download_file_stream: (params: {\n file: string\n file_id?: string\n chunk_size?: number\n }) => Promise<ConnectionStreamResult<{\n type: string\n data_type: string\n file_name: string\n file_size: number\n }>>\n}\n\nexport function sendRequest<const T extends keyof ClientMethods>(\n conn: Connection,\n method: T,\n ...params: Parameters<ClientMethods[T]>\n): ReturnType<ClientMethods[T]>\nexport function sendRequest(\n conn: Connection,\n method: string,\n ...params: any[]\n): Promise<ProtocolReplyOk<any>>\nexport function sendRequest(\n conn: Connection,\n method: string,\n ...params: any[]\n): Promise<ProtocolReplyOk<any>> {\n return conn.request(method, params[0]) as any\n}\n\nexport function sendRequestStream<const T extends keyof ClientStreamMethods>(\n conn: Connection,\n method: T,\n ...params: Parameters<ClientStreamMethods[T]>\n): ReturnType<ClientStreamMethods[T]>\nexport function sendRequestStream(\n conn: Connection,\n method: string,\n ...params: any[]\n): Promise<ConnectionStreamResult<any>>\nexport function sendRequestStream(\n conn: Connection,\n method: string,\n ...params: any[]\n): Promise<ConnectionStreamResult<any>> {\n return conn.request(method, params[0], true) as any\n}\n\nexport type SendRequestResult<T extends keyof ClientMethods> = Awaited<ReturnType<ClientMethods[T]>>\nexport type SendRequestStreamResult<T extends keyof ClientStreamMethods> = Awaited<ReturnType<ClientStreamMethods[T]>>\n","import type { ProtocolMessageSegment, ProtocolMessageSendSegment } from '@/types/message'\n\nexport function isMessageSegment<const T extends ProtocolMessageSendSegment['type'], R extends Extract<ProtocolMessageSegment, { type: T }>>(type: T, value: any): value is R\nexport function isMessageSegment(type: null, value: any): value is ProtocolMessageSegment\nexport function isMessageSegment(type: any, value: any): boolean {\n return value != null && typeof value === 'object' && typeof value.type === 'string' && (type ? value.type === type : true)\n}\n\n// helper function to create a send segment\nexport function createMessageSegment<const T extends ProtocolMessageSendSegment['type'], R extends Extract<ProtocolMessageSendSegment, { type: T }>>(\n type: T,\n data: R['data'],\n): R {\n return { type, data } as R\n}\n\nexport function findMessageSegment<const T extends ProtocolMessageSendSegment['type'], R extends Extract<ProtocolMessageSegment, { type: T }>>(type: T, message?: ProtocolMessageSegment[] | string, cond?: (segment: R) => boolean): R | undefined {\n return message && Array.isArray(message)\n ? message.find(segment => isMessageSegment(type, segment) && cond != null && cond(segment as R)) as R | undefined\n : undefined\n}\n","import type { ZodType } from 'zod'\nimport type { MaybeArray, ProtocolMessageSendSegment } from '@/types'\n\nexport interface MessageTemplateInitial<T> {\n props: ZodType<T>\n build: (props: T) => MaybeArray<ProtocolMessageSendSegment>\n}\n\nexport interface AsyncMessageTemplateInitial<T> {\n props: ZodType<T>\n build: (props: T) => Promise<MaybeArray<ProtocolMessageSendSegment>>\n}\n\nexport type MessageTemplate<T> = (data: T) => ProtocolMessageSendSegment[]\nexport type AsyncMessageTemplate<T> = (data: T) => Promise<MaybeArray<ProtocolMessageSendSegment>>\n\nexport function template<T>({ props, build }: MessageTemplateInitial<T>): MessageTemplate<T> {\n return (data: T) => {\n const parsed = props.safeParse(data)\n if (!parsed.success) {\n throw new Error(parsed.error.message)\n }\n const segments = build(parsed.data)\n return Array.isArray(segments) ? segments : [segments]\n }\n}\n\nexport function asyncTemplate<T>({ props, build }: AsyncMessageTemplateInitial<T>): AsyncMessageTemplate<T> {\n return async (data: T) => {\n const parsed = await props.safeParseAsync(data)\n if (!parsed.success) {\n throw new Error(parsed.error.message)\n }\n const segments = await build(parsed.data)\n return Array.isArray(segments) ? segments : [segments]\n }\n}\n"],"mappings":"iGAIA,SAAgB,EACd,EACA,EACG,CACH,OAAO,EAGT,MAAM,EAAiB,IAAI,IAE3B,SAAgB,EACd,EACiB,CACjB,GAAI,EAAe,IAAI,EAAK,CAC1B,OAAO,EAAe,IAAI,EAAK,CAGjC,GAAI,IAAS,eAAgB,CAC3B,IAAM,EAAW,GAAe,EAAM,YAAc,eAEpD,OADA,EAAe,IAAI,EAAM,EAAQ,CAC1B,EAGT,GAAI,CAAC,EAAO,EAAO,EAAO,GAAS,EAAK,MAAM,IAAI,CAC9C,IAAU,SACZ,EAAQ,cAEN,IAAU,WACR,IAAU,QACR,IAAU,YACZ,EAAQ,uBACR,EAAQ,IAAA,IAED,IAAU,WACjB,EAAQ,UACR,EAAQ,GAED,GACP,EAAQ,SAAS,IACjB,EAAQ,GAGR,EAAQ,UAGH,IAAU,UAAY,IAAU,SACnC,GACF,EAAQ,GAAG,EAAM,GAAG,IACpB,EAAQ,IAAA,IAGR,EAAQ,GAAG,EAAM,KAUvB,IAAM,EAAW,GAAe,CAC9B,GAAI,EAAM,YAAc,EACtB,MAAO,GAET,GAAI,EAAO,CACT,IAAM,EAAc,EAAM,GAAG,EAAO,QAEpC,GAAI,EAAM,SAAS,IAAI,KACjB,CAAC,GAAa,WAAW,EAAM,EAE7B,MAAU,UAAY,IAAgB,WAIxC,MAAO,WAKP,IAAgB,EAClB,MAAO,GAWb,MANA,EAAI,GACE,EAAM,WAAa,IAS3B,OADA,EAAe,IAAI,EAAM,EAAQ,CAC1B,EAGT,SAAgB,EACd,EACA,EACsB,CACtB,IAAM,EAAU,EAAmB,EAAK,CACxC,OAAO,EAAc,kBAAmB,EAAY,IAAe,CAC7D,EAAQ,EAAM,EACf,EAAgB,EAAO,EAAW,EAErC,CCw9BJ,SAAgB,EACd,EACA,EACA,GAAG,EAC4B,CAC/B,OAAO,EAAK,QAAQ,EAAQ,EAAO,GAAG,CAaxC,SAAgB,EACd,EACA,EACA,GAAG,EACmC,CACtC,OAAO,EAAK,QAAQ,EAAQ,EAAO,GAAI,GAAK,CC1lC9C,SAAgB,EAAiB,EAAW,EAAqB,CAC/D,OAAwB,OAAO,GAAU,YAAlC,GAA8C,OAAO,EAAM,MAAS,WAAa,EAAO,EAAM,OAAS,EAAO,IAIvH,SAAgB,EACd,EACA,EACG,CACH,MAAO,CAAE,OAAM,OAAM,CAGvB,SAAgB,EAA+H,EAAS,EAA6C,EAA+C,CAClP,OAAO,GAAW,MAAM,QAAQ,EAAQ,CACpC,EAAQ,KAAK,GAAW,EAAiB,EAAM,EAAQ,EAAI,GAAQ,MAAQ,EAAK,EAAa,CAAC,CAC9F,IAAA,GCHN,SAAgB,EAAY,CAAE,QAAO,SAAwD,CAC3F,MAAQ,IAAY,CAClB,IAAM,EAAS,EAAM,UAAU,EAAK,CACpC,GAAI,CAAC,EAAO,QACV,MAAU,MAAM,EAAO,MAAM,QAAQ,CAEvC,IAAM,EAAW,EAAM,EAAO,KAAK,CACnC,OAAO,MAAM,QAAQ,EAAS,CAAG,EAAW,CAAC,EAAS,EAI1D,SAAgB,EAAiB,CAAE,QAAO,SAAkE,CAC1G,OAAO,KAAO,IAAY,CACxB,IAAM,EAAS,MAAM,EAAM,eAAe,EAAK,CAC/C,GAAI,CAAC,EAAO,QACV,MAAU,MAAM,EAAO,MAAM,QAAQ,CAEvC,IAAM,EAAW,MAAM,EAAM,EAAO,KAAK,CACzC,OAAO,MAAM,QAAQ,EAAS,CAAG,EAAW,CAAC,EAAS"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/utils/event.ts","../../src/utils/methods.ts","../../src/utils/segment.ts","../../src/utils/message.ts","../../src/utils/template.ts"],"sourcesContent":["import type { ConnectionBasicPubSubHandlers, ProtocolEventHandler, ProtocolEventHandlers } from '@/types'\n\nexport type ConnectionOrProtocolEventHandlers = ConnectionBasicPubSubHandlers & ProtocolEventHandlers & {}\n\nexport function defineHandler<const K extends keyof ConnectionOrProtocolEventHandlers, const F extends (...args: ConnectionOrProtocolEventHandlers[K]) => void>(\n type: K,\n handler: F,\n): F {\n return handler\n}\n\nconst cachedMatchers = new Map<string, (event: any) => boolean>()\n\nexport function createEventMatcher<const K extends keyof ProtocolEventHandlers>(\n type: K,\n): EventMatcher<K> {\n if (cachedMatchers.has(type)) {\n return cachedMatchers.get(type) as any\n }\n\n if (type === 'message.sent') {\n const matcher = (event: any) => event.post_type === 'message_sent'\n cachedMatchers.set(type, matcher)\n return matcher as EventMatcher<K>\n }\n\n let [typeA, typeB, typeC, typeD] = type.split('.')\n if (typeA === 'meta') {\n typeA = 'meta_event'\n }\n if (typeA === 'notice') {\n if (typeB === 'group') {\n if (typeC === 'reaction') {\n typeB = 'group_msg_emoji_like'\n typeC = undefined\n }\n else if (typeC === 'essence') {\n typeB = 'essence'\n typeC = typeD\n }\n else if (typeC) {\n typeB = `group_${typeC}`\n typeC = typeD\n }\n else {\n typeB = 'group_'\n }\n }\n else if (typeB === 'friend' || typeB === 'bot') {\n if (typeC) {\n typeB = `${typeB}_${typeC}`\n typeC = undefined\n }\n else {\n typeB = `${typeB}_`\n }\n }\n else if (typeB === 'notify') {\n if (typeC === 'group_name' || typeC === 'group_title') {\n // no change needed as typeC already matches the subtype\n }\n }\n }\n\n const matcher = (event: any) => {\n if (event.post_type !== typeA)\n return false\n\n if (typeB) {\n const actualTypeB = event[`${typeA!}_type`]!\n\n if (typeB.endsWith('_')) {\n if (!actualTypeB?.startsWith(typeB)) {\n // Special case for notice.group matching essence events\n if (typeB === 'group_' && actualTypeB === 'essence') {\n // allow\n }\n else {\n return false\n }\n }\n }\n else {\n if (actualTypeB !== typeB) {\n return false\n }\n }\n }\n\n if (typeC) {\n if (event.sub_type !== typeC) {\n return false\n }\n }\n\n return true\n }\n\n cachedMatchers.set(type, matcher)\n return matcher as EventMatcher<K>\n}\n\nexport function matchEvent<const K extends keyof ProtocolEventHandlers>(\n type: K,\n handler: (...args: ProtocolEventHandlers[K]) => void,\n): ProtocolEventHandler {\n const matcher = createEventMatcher(type)\n return defineHandler('protocol.event', (event: any, connection) => {\n if (matcher(event)) {\n (handler as any)(event, connection)\n }\n })\n}\n\nexport { matchEvent as when }\n\nexport interface EventMatcher<\n K extends keyof ProtocolEventHandlers,\n> {\n (event: any): event is ProtocolEventHandlers[K]\n}\n","import type { Connection, ConnectionStreamResult } from '@/types'\nimport type { ProtocolMessageSendSegment, ProtocolSendableMessage } from '@/types/message'\nimport type { ProtocolReplyOk } from '@/types/protocol'\n\nexport interface ClientMethods {\n send_private_msg: (params: {\n user_id: number | string\n message: ProtocolSendableMessage\n group_id?: number | string\n auto_escape?: boolean\n }) => Promise<ProtocolReplyOk<{ message_id: number }>>\n\n send_group_msg: (params: {\n group_id: number | string\n message: ProtocolSendableMessage\n auto_escape?: boolean\n }) => Promise<ProtocolReplyOk<{ message_id: number }>>\n\n send_msg: (params: {\n message_type?: 'private' | 'group'\n user_id?: number | string\n group_id?: number | string\n message: ProtocolSendableMessage\n auto_escape?: boolean\n }) => Promise<ProtocolReplyOk<{ message_id: number }>>\n\n delete_msg: (params: { message_id: number }) => Promise<ProtocolReplyOk<void>>\n\n get_msg: (params: { message_id: number }) => Promise<ProtocolReplyOk<{\n time: number\n message_type: 'private' | 'group'\n message_id: number\n real_id: number\n sender: {\n user_id: number\n nickname: string\n card?: string\n sex?: 'male' | 'female' | 'unknown'\n age?: number\n }\n message: ProtocolMessageSendSegment[]\n }>>\n\n get_forward_msg: (params: { id: string }) => Promise<ProtocolReplyOk<{\n message: (ProtocolMessageSendSegment & { data: { name?: string, uin?: string, content?: ProtocolMessageSendSegment[] } })[]\n }>>\n\n send_like: (params: { user_id: number | string, times?: number }) => Promise<ProtocolReplyOk<void>>\n\n set_msg_emoji_like: (params: {\n message_id: number\n emoji_id: string\n set?: boolean\n }) => Promise<ProtocolReplyOk<void>>\n\n set_group_kick: (params: {\n group_id: number | string\n user_id: number | string\n reject_add_request?: boolean\n }) => Promise<ProtocolReplyOk<void>>\n\n set_group_ban: (params: {\n group_id: number | string\n user_id: number | string\n duration?: number\n }) => Promise<ProtocolReplyOk<void>>\n\n set_group_whole_ban: (params: {\n group_id: number | string\n enable?: boolean\n }) => Promise<ProtocolReplyOk<void>>\n\n set_group_admin: (params: {\n group_id: number | string\n user_id: number | string\n enable?: boolean\n }) => Promise<ProtocolReplyOk<void>>\n\n set_group_card: (params: {\n group_id: number | string\n user_id: number | string\n card?: string\n }) => Promise<ProtocolReplyOk<void>>\n\n set_group_name: (params: {\n group_id: number | string\n group_name: string\n }) => Promise<ProtocolReplyOk<void>>\n\n set_group_leave: (params: {\n group_id: number | string\n is_dismiss?: boolean\n }) => Promise<ProtocolReplyOk<void>>\n\n set_group_special_title: (params: {\n group_id: number | string\n user_id: number | string\n special_title?: string\n duration?: number\n }) => Promise<ProtocolReplyOk<void>>\n\n set_group_sign: (params: {\n group_id: number | string\n }) => Promise<ProtocolReplyOk<void>>\n\n set_friend_add_request: (params: {\n flag: string\n approve?: boolean\n remark?: string\n }) => Promise<ProtocolReplyOk<void>>\n\n delete_friend: (params: {\n user_id: number | string\n temp_block?: boolean\n temp_both_del?: boolean\n }) => Promise<ProtocolReplyOk<void>>\n\n set_group_add_request: (params: {\n flag: string\n sub_type?: 'add' | 'invite'\n approve?: boolean\n reason?: string\n }) => Promise<ProtocolReplyOk<void>>\n\n get_login_info: () => Promise<ProtocolReplyOk<{\n user_id: number\n nickname: string\n }>>\n\n get_stranger_info: (params: {\n user_id: number | string\n no_cache?: boolean\n }) => Promise<ProtocolReplyOk<{\n user_id: number\n nickname: string\n sex: 'male' | 'female' | 'unknown'\n age: number\n }>>\n\n get_friend_list: () => Promise<ProtocolReplyOk<{\n user_id: number\n nickname: string\n remark: string\n }[]>>\n\n get_group_info: (params: {\n group_id: number | string\n no_cache?: boolean\n }) => Promise<ProtocolReplyOk<{\n group_id: number\n group_name: string\n member_count: number\n max_member_count: number\n }>>\n\n get_group_list: (params?: {\n no_cache?: boolean\n }) => Promise<ProtocolReplyOk<{\n group_id: number\n group_name: string\n member_count: number\n max_member_count: number\n group_remark: string\n group_all_shut: number\n }[]>>\n\n get_group_member_info: (params: {\n group_id: number | string\n user_id: number | string\n no_cache?: boolean\n }) => Promise<ProtocolReplyOk<{\n group_id: number\n user_id: number\n nickname: string\n card: string\n sex: 'male' | 'female' | 'unknown'\n age: number\n area: string\n join_time: number\n last_sent_time: number\n level: string\n role: 'owner' | 'admin' | 'member'\n unfriendly: boolean\n title: string\n title_expire_time: number\n card_changeable: boolean\n }>>\n\n get_group_member_list: (params: {\n group_id: number | string\n }) => Promise<ProtocolReplyOk<{\n group_id: number\n user_id: number\n nickname: string\n card: string\n sex: 'male' | 'female' | 'unknown'\n age: number\n area: string\n join_time: number\n last_sent_time: number\n level: string\n role: 'owner' | 'admin' | 'member'\n unfriendly: boolean\n title: string\n title_expire_time: number\n card_changeable: boolean\n }[]>>\n\n get_group_honor_info: (params: {\n group_id: number | string\n type: 'talkative' | 'performer' | 'legend' | 'strong_newbie' | 'emotion' | 'all'\n }) => Promise<ProtocolReplyOk<{\n group_id: number\n current_talkative?: {\n user_id: number\n nickname: string\n avatar: string\n day_count: number\n }\n talkative_list?: {\n user_id: number\n nickname: string\n avatar: string\n day_count: number\n }[]\n performer_list?: {\n user_id: number\n nickname: string\n avatar: string\n day_count: number\n }[]\n legend_list?: {\n user_id: number\n nickname: string\n avatar: string\n day_count: number\n }[]\n strong_newbie_list?: {\n user_id: number\n nickname: string\n avatar: string\n day_count: number\n }[]\n emotion_list?: {\n user_id: number\n nickname: string\n avatar: string\n day_count: number\n }[]\n }>>\n\n get_cookies: (params: { domain: string }) => Promise<ProtocolReplyOk<{ cookies: string, bkn: string }>>\n\n get_csrf_token: () => Promise<ProtocolReplyOk<{ token: number }>>\n\n get_credentials: (params: { domain: string }) => Promise<ProtocolReplyOk<{ cookies: string, token: number }>>\n\n get_record: (params: { file: string, out_format: string }) => Promise<ProtocolReplyOk<{ file: string, url?: string }>>\n\n get_image: (params: { file: string }) => Promise<ProtocolReplyOk<{ file: string, url?: string }>>\n\n can_send_image: () => Promise<ProtocolReplyOk<{ yes: boolean }>>\n can_send_record: () => Promise<ProtocolReplyOk<{ yes: boolean }>>\n\n get_status: () => Promise<ProtocolReplyOk<{\n online: boolean\n good: boolean\n }>>\n\n get_version_info: () => Promise<ProtocolReplyOk<{\n app_name: string\n app_version: string\n protocol_version: string\n }>>\n\n clean_cache: () => Promise<ProtocolReplyOk<void>>\n\n _send_group_notice: (params: {\n group_id: number | string\n content: string\n image?: string\n pinned?: number\n type?: number\n confirm_required?: number\n is_show_edit_card?: number\n tip_window_type?: number\n }) => Promise<ProtocolReplyOk<void>>\n\n _get_group_notice: (params: {\n group_id: number | string\n }) => Promise<ProtocolReplyOk<{\n sender_id: number\n publish_time: number\n notice_id: string\n message: {\n text: string\n image: string[]\n }\n read_num: number\n }[]>>\n\n get_essence_msg_list: (params: {\n group_id: number | string\n }) => Promise<ProtocolReplyOk<{\n msg_seq: number\n msg_random: number\n sender_id: number\n sender_nick: string\n operator_id: number\n operator_nick: string\n message_id: number\n operator_time: number\n content: string[]\n }[]>>\n\n set_essence_msg: (params: { message_id: number }) => Promise<ProtocolReplyOk<void>>\n\n delete_essence_msg: (params: { message_id: number }) => Promise<ProtocolReplyOk<void>>\n\n get_online_clients: (params?: { no_cache?: boolean }) => Promise<ProtocolReplyOk<{\n app_id: number\n device_name: string\n device_kind: string\n }[]>>\n\n ocr_image: (params: { image: string }) => Promise<ProtocolReplyOk<{\n texts: {\n text: string\n coordinates: any[]\n }[]\n }>>\n\n translate_en2zh: (params: { words: string[] }) => Promise<ProtocolReplyOk<{\n words: string[]\n }>>\n\n get_robot_uin_range: () => Promise<ProtocolReplyOk<{\n minUin: string\n maxUin: string\n }[]>>\n\n set_online_status: (params: {\n status: number | string\n ext_status: number | string\n battery_status: number | string\n }) => Promise<ProtocolReplyOk<void>>\n\n upload_group_file: (params: {\n group_id: number | string\n file: string\n name: string\n folder?: string\n folder_id?: string\n upload_file?: boolean\n }) => Promise<ProtocolReplyOk<{ file_id?: string }>>\n\n get_group_msg_history: (params: {\n group_id: number | string\n message_seq?: string | number\n count?: number\n reverse_order?: boolean\n }) => Promise<ProtocolReplyOk<{\n messages: any[]\n }>>\n\n send_group_forward_msg: (params: {\n group_id: number | string\n messages: any[]\n }) => Promise<ProtocolReplyOk<{\n message_id: number\n forward_id: string\n }>>\n\n mark_msg_as_read: (params: {\n group_id?: number | string\n user_id?: number | string\n }) => Promise<ProtocolReplyOk<void>>\n\n upload_private_file: (params: {\n user_id: number | string\n file: string\n name: string\n }) => Promise<ProtocolReplyOk<void>>\n\n get_file: (params: {\n file: string\n file_id?: string\n }) => Promise<ProtocolReplyOk<{\n file?: string\n url?: string\n file_size?: string\n file_name?: string\n base64?: string\n }>>\n\n handle_quick_operation: (params: {\n context: Record<string, any>\n operation: Record<string, any>\n }) => Promise<ProtocolReplyOk<void>>\n\n get_group_file_url: (params: {\n group_id: number | string\n file_id: string\n }) => Promise<ProtocolReplyOk<{ url: string }>>\n\n get_private_file_url: (params: {\n user_id?: number | string\n file_id: string\n }) => Promise<ProtocolReplyOk<{ url: string }>>\n\n clean_stream_temp_file: (params: Record<string, never>) => Promise<ProtocolReplyOk<void>>\n\n del_group_album_media: (params: {\n group_id: string | number\n album_id: string\n lloc: string\n }) => Promise<ProtocolReplyOk<{ result: any }>>\n\n set_group_album_media_like: (params: {\n group_id: string | number\n album_id: string\n lloc: string\n id: string\n set?: boolean\n }) => Promise<ProtocolReplyOk<{ result: any }>>\n\n do_group_album_comment: (params: {\n group_id: string | number\n album_id: string\n lloc: string\n content: string\n }) => Promise<ProtocolReplyOk<{ result: any }>>\n\n get_group_album_media_list: (params: {\n group_id: string | number\n album_id: string\n attach_info?: string\n }) => Promise<ProtocolReplyOk<{\n media_list: {\n media_id: string\n url: string\n }[]\n }>>\n\n get_qun_album_list: (params: {\n group_id: string | number\n }) => Promise<ProtocolReplyOk<{\n album_id: string\n album_name: string\n cover_url: string\n create_time: number\n }[]>>\n\n upload_image_to_qun_album: (params: {\n group_id: string | number\n album_id: string\n album_name: string\n file: string\n }) => Promise<ProtocolReplyOk<{ result: any }>>\n\n set_group_add_option: (params: {\n group_id: string | number\n add_type: number\n group_question?: string\n group_answer?: string\n }) => Promise<ProtocolReplyOk<void>>\n\n set_group_robot_add_option: (params: {\n group_id: string | number\n robot_member_switch?: number\n robot_member_examine?: number\n }) => Promise<ProtocolReplyOk<void>>\n\n set_group_search: (params: {\n group_id: string | number\n no_code_finger_open?: number\n no_finger_open?: number\n }) => Promise<ProtocolReplyOk<void>>\n\n get_group_info_ex: (params: {\n group_id: string | number\n }) => Promise<ProtocolReplyOk<Record<string, any>>>\n\n set_group_todo: (params: {\n group_id: string | number\n message_id: string\n message_seq?: string\n }) => Promise<ProtocolReplyOk<void>>\n\n group_poke: (params: {\n group_id: string | number\n user_id: string | number\n target_id: string | number\n }) => Promise<ProtocolReplyOk<void>>\n\n set_group_kick_members: (params: {\n group_id: string | number\n user_id: (string | number)[]\n reject_add_request?: boolean\n }) => Promise<ProtocolReplyOk<void>>\n\n create_collection: (params: {\n rawData: string\n brief: string\n }) => Promise<ProtocolReplyOk<{ result: number, errMsg: string }>>\n\n set_self_longnick: (params: {\n longNick: string\n }) => Promise<ProtocolReplyOk<void>>\n\n set_qq_avatar: (params: {\n file: string\n }) => Promise<ProtocolReplyOk<void>>\n\n get_clientkey: () => Promise<ProtocolReplyOk<{ clientkey: string }>>\n\n get_ai_characters: (params: {\n group_id: string | number\n chat_type?: number | string\n }) => Promise<ProtocolReplyOk<{\n type: string\n characters: {\n character_id: string\n character_name: string\n preview_url: string\n }[]\n }[]>>\n\n set_doubt_friends_add_request: (params: {\n flag: string\n approve?: boolean\n }) => Promise<ProtocolReplyOk<void>>\n\n get_doubt_friends_add_request: (params: {\n count?: number\n }) => Promise<ProtocolReplyOk<{\n user_id: number\n nickname: string\n age: number\n sex: string\n reason: string\n flag: string\n }[]>>\n\n nc_get_packet_status: () => Promise<ProtocolReplyOk<void>>\n\n set_restart: () => Promise<ProtocolReplyOk<void>>\n\n get_group_system_msg: (params: {\n count?: number | string\n }) => Promise<ProtocolReplyOk<{\n invited_requests: any[]\n InvitedRequest: any[]\n join_requests: any[]\n }>>\n\n set_friend_remark: (params: {\n user_id: string | number\n remark: string\n }) => Promise<ProtocolReplyOk<void>>\n\n get_recent_contact: (params: {\n count?: number | string\n }) => Promise<ProtocolReplyOk<{\n lastestMsg: any\n peerUin: string\n remark: string\n msgTime: string\n chatType: number\n msgId: string\n sendNickName: string\n sendMemberName: string\n peerName: string\n }[]>>\n\n get_rkey: () => Promise<ProtocolReplyOk<{\n type: string\n rkey: string\n created_at: number\n ttl: number\n }[]>>\n\n get_rkey_server: () => Promise<ProtocolReplyOk<{\n private_rkey: string\n group_rkey: string\n expired_time: number\n name: string\n }>>\n\n fetch_custom_face: (params: {\n count?: number | string\n }) => Promise<ProtocolReplyOk<string[]>>\n\n nc_get_user_status: (params: {\n user_id: string | number\n }) => Promise<ProtocolReplyOk<{\n status: number\n ext_status: number\n }>>\n\n nc_get_rkey: () => Promise<ProtocolReplyOk<{\n key: string\n expired: number\n }[]>>\n\n get_mini_app_ark: (params: Record<string, any>) => Promise<ProtocolReplyOk<{\n data: { ark: any }\n }>>\n\n send_packet: (params: {\n cmd: string\n data: string\n rsp?: boolean | string\n }) => Promise<ProtocolReplyOk<string | null>>\n\n bot_exit: () => Promise<ProtocolReplyOk<void>>\n\n get_collection_list: (params: {\n category: string\n count?: string\n }) => Promise<ProtocolReplyOk<{\n errCode: number\n errMsg: string\n collectionSearchList: {\n collectionItemList: any[]\n hasMore: boolean\n bottomTimeStamp: string\n }\n }>>\n\n fetch_emoji_like: (params: {\n message_id: number | string\n emojiId: number | string\n emojiType: number | string\n count?: number | string\n cookie?: string\n }) => Promise<ProtocolReplyOk<{\n emojiLikesList: {\n tinyId: string\n nickName: string\n headUrl: string\n }[]\n cookie: string\n isLastPage: boolean\n isFirstPage: boolean\n result: number\n errMsg: string\n }>>\n\n get_emoji_likes: (params: {\n group_id?: string\n message_id: string\n emoji_id: string\n emoji_type?: string\n count?: number\n }) => Promise<ProtocolReplyOk<{\n emoji_like_list: {\n user_id: string\n nick_name: string\n }[]\n }>>\n\n ArkShareGroup: (params: {\n group_id: string\n }) => Promise<ProtocolReplyOk<string>>\n\n ArkSharePeer: (params: {\n user_id?: string\n group_id?: string\n phone_number?: string\n }) => Promise<ProtocolReplyOk<{ ark: any }>>\n\n click_inline_keyboard_button: (params: {\n group_id: string\n bot_appid: string\n button_id?: string\n callback_data?: string\n msg_seq?: string\n }) => Promise<ProtocolReplyOk<void>>\n\n move_group_file: (params: {\n group_id: string\n file_id: string\n current_parent_directory: string\n target_parent_directory: string\n }) => Promise<ProtocolReplyOk<{ ok: boolean }>>\n\n rename_group_file: (params: {\n group_id: string\n file_id: string\n current_parent_directory: string\n new_name: string\n }) => Promise<ProtocolReplyOk<{ ok: boolean }>>\n\n trans_group_file: (params: {\n group_id: string\n file_id: string\n }) => Promise<ProtocolReplyOk<{ ok: boolean }>>\n\n create_flash_task: (params: {\n files: string[] | string\n name?: string\n thumb_path?: string\n }) => Promise<ProtocolReplyOk<{ task_id: string }>>\n\n get_flash_file_list: (params: {\n fileset_id: string\n }) => Promise<ProtocolReplyOk<{\n file_name: string\n size: number\n }[]>>\n\n get_flash_file_url: (params: {\n fileset_id: string\n file_name?: string\n file_index?: number\n }) => Promise<ProtocolReplyOk<{ url: string }>>\n\n send_flash_msg: (params: {\n fileset_id: string\n user_id?: string\n group_id?: string\n }) => Promise<ProtocolReplyOk<{ message_id: number }>>\n\n get_share_link: (params: {\n fileset_id: string\n }) => Promise<ProtocolReplyOk<string>>\n\n get_fileset_info: (params: {\n fileset_id: string\n }) => Promise<ProtocolReplyOk<{\n fileset_id: string\n file_list: any[]\n }>>\n\n get_online_file_msg: (params: {\n user_id: string\n }) => Promise<ProtocolReplyOk<void>>\n\n send_online_file: (params: {\n user_id: string\n file_path: string\n file_name?: string\n }) => Promise<ProtocolReplyOk<void>>\n\n send_online_folder: (params: {\n user_id: string\n folder_path: string\n folder_name?: string\n }) => Promise<ProtocolReplyOk<void>>\n\n receive_online_file: (params: {\n user_id: string\n msg_id: string\n element_id: string\n }) => Promise<ProtocolReplyOk<void>>\n\n refuse_online_file: (params: {\n user_id: string\n msg_id: string\n element_id: string\n }) => Promise<ProtocolReplyOk<void>>\n\n cancel_online_file: (params: {\n user_id: string\n msg_id: string\n }) => Promise<ProtocolReplyOk<void>>\n\n download_fileset: (params: {\n fileset_id: string\n }) => Promise<ProtocolReplyOk<void>>\n\n get_fileset_id: (params: {\n share_code: string\n }) => Promise<ProtocolReplyOk<{ fileset_id: string }>>\n\n get_friends_with_category: () => Promise<ProtocolReplyOk<{\n categoryId: number\n categoryName: string\n categoryMbCount: number\n buddyList: any[]\n }[]>>\n\n get_profile_like: (params: {\n user_id: string\n start?: number | string\n count?: number | string\n }) => Promise<ProtocolReplyOk<{\n uid: string\n time: string\n favoriteInfo: any\n voteInfo: any\n }>>\n\n set_diy_online_status: (params: {\n face_id: number | string\n face_type: number | string\n wording: string\n }) => Promise<ProtocolReplyOk<string>>\n\n get_unidirectional_friend_list: () => Promise<ProtocolReplyOk<{\n uin: number\n uid: string\n nick_name: string\n age: number\n source: string\n }[]>>\n\n get_guild_list: () => Promise<ProtocolReplyOk<{\n guild_id: string\n guild_name: string\n }[]>>\n\n get_guild_service_profile: (params: {\n guild_id: string\n }) => Promise<ProtocolReplyOk<{\n guild_id: string\n guild_name: string\n guild_display_id: string\n }>>\n\n get_ai_record: (params: {\n character: string\n group_id: string\n text: string\n }) => Promise<ProtocolReplyOk<string>>\n\n send_group_ai_record: (params: {\n character: string\n group_id: string\n text: string\n }) => Promise<ProtocolReplyOk<void>>\n\n set_group_remark: (params: {\n group_id: number | string\n remark: string\n }) => Promise<ProtocolReplyOk<void>>\n\n get_group_ignored_notifies: (params?: {\n group_id?: number | string\n }) => Promise<ProtocolReplyOk<{\n invited_requests?: any[]\n InvitedRequest?: any[]\n join_requests?: any[]\n }>>\n\n _del_group_notice: (params: {\n group_id: number | string\n notice_id: string\n }) => Promise<ProtocolReplyOk<void>>\n\n get_group_shut_list: (params: {\n group_id: number | string\n }) => Promise<ProtocolReplyOk<{\n user_id: number\n nickname: string\n shut_up_time: number\n }[]>>\n\n set_input_status: (params: {\n user_id: number | string\n event_type: number\n }) => Promise<ProtocolReplyOk<void>>\n\n set_qq_profile: (params: {\n nickname: string\n personal_note?: string\n sex?: number | string\n }) => Promise<ProtocolReplyOk<void>>\n\n get_group_root_files: (params: {\n group_id: number | string\n file_count?: number\n }) => Promise<ProtocolReplyOk<{\n files: any[]\n folders: any[]\n }>>\n\n check_url_safely: (params: {\n url: string\n }) => Promise<ProtocolReplyOk<{\n level: number\n }>>\n\n get_group_at_all_remain: (params: {\n group_id: number | string\n }) => Promise<ProtocolReplyOk<{\n can_at_all: boolean\n remain_at_all_count_for_group: number\n remain_at_all_count_for_uin: number\n }>>\n\n send_forward_msg: (params: {\n message_type?: 'private' | 'group'\n user_id?: number | string\n group_id?: number | string\n message: any\n auto_escape?: boolean\n source?: string\n news?: any[]\n summary?: string\n prompt?: string\n }) => Promise<ProtocolReplyOk<{\n message_id: number\n res_id: string\n forward_id: string\n }>>\n\n send_private_forward_msg: (params: {\n user_id: number | string\n message: any\n auto_escape?: boolean\n source?: string\n news?: any[]\n summary?: string\n prompt?: string\n }) => Promise<ProtocolReplyOk<{\n message_id: number\n res_id: string\n forward_id: string\n }>>\n\n download_file: (params: {\n url: string\n base64?: string\n name?: string\n headers?: string | string[]\n }) => Promise<ProtocolReplyOk<{\n file: string\n }>>\n\n get_friend_msg_history: (params: {\n user_id: number | string\n message_seq?: number | string\n count?: number\n reverse_order?: boolean\n disable_get_url?: boolean\n parse_mult_msg?: boolean\n quick_reply?: boolean\n }) => Promise<ProtocolReplyOk<{\n messages: any[]\n }>>\n\n set_group_portrait: (params: {\n group_id: number | string\n file: string\n }) => Promise<ProtocolReplyOk<{\n result: number\n errMsg: string\n }>>\n\n _get_model_show: (params: {\n model: string\n }) => Promise<ProtocolReplyOk<{\n variants: {\n model_show: string\n need_pay: boolean\n }[]\n }>>\n\n _set_model_show: (params: {\n model: string\n model_show: string\n }) => Promise<ProtocolReplyOk<void>>\n\n delete_group_file: (params: {\n group_id: number | string\n file_id: string\n }) => Promise<ProtocolReplyOk<void>>\n\n create_group_file_folder: (params: {\n group_id: number | string\n folder_name: string\n name?: string\n }) => Promise<ProtocolReplyOk<{\n result: any\n groupItem: any\n }>>\n\n delete_group_folder: (params: {\n group_id: number | string\n folder_id: string\n }) => Promise<ProtocolReplyOk<void>>\n\n get_group_file_system_info: (params: {\n group_id: number | string\n }) => Promise<ProtocolReplyOk<{\n file_count: number\n limit_count: number\n used_space: number\n total_space: number\n }>>\n\n get_group_files_by_folder: (params: {\n group_id: number | string\n folder_id: string\n file_count?: number\n }) => Promise<ProtocolReplyOk<{\n files: any[]\n folders: any[]\n }>>\n\n forward_friend_single_msg: (params: {\n message_id: number | string\n group_id?: number | string\n user_id: number | string\n }) => Promise<ProtocolReplyOk<void>>\n\n forward_group_single_msg: (params: {\n message_id: number | string\n group_id: number | string\n user_id?: number | string\n }) => Promise<ProtocolReplyOk<void>>\n\n mark_group_msg_as_read: (params: {\n user_id?: number | string\n group_id: number | string\n message_id?: number | string\n }) => Promise<ProtocolReplyOk<void>>\n\n mark_private_msg_as_read: (params: {\n user_id: number | string\n group_id?: number | string\n message_id?: number | string\n }) => Promise<ProtocolReplyOk<void>>\n\n _mark_all_as_read: () => Promise<ProtocolReplyOk<void>>\n\n send_poke: (params: {\n user_id: number | string\n group_id?: number | string\n target_id?: number | string\n }) => Promise<ProtocolReplyOk<void>>\n\n upload_file_stream: (params: {\n stream_id: string\n chunk_data?: string\n chunk_index?: number\n total_chunks?: number\n file_size?: number\n expected_sha256?: string\n is_complete?: boolean\n filename?: string\n reset?: boolean\n verify_only?: boolean\n file_retention?: number\n }) => Promise<ProtocolReplyOk<{\n type: string\n stream_id: string\n status: string\n received_chunks: number\n total_chunks: number\n }>>\n}\n\nexport interface ClientStreamMethods {\n download_file_record_stream: (params: {\n file: string\n file_id?: string\n chunk_size?: number\n out_format?: string\n }) => Promise<ConnectionStreamResult<{ file: string }>>\n\n download_file_image_stream: (params: {\n file: string\n file_id?: string\n chunk_size?: number\n }) => Promise<ConnectionStreamResult<{ file: string }>>\n\n test_download_stream: (params: {\n error?: boolean\n }) => Promise<ConnectionStreamResult<{ success: boolean }>>\n\n download_file_stream: (params: {\n file: string\n file_id?: string\n chunk_size?: number\n }) => Promise<ConnectionStreamResult<{\n type: string\n data_type: string\n file_name: string\n file_size: number\n }>>\n}\n\nexport function sendRequest<const T extends keyof ClientMethods>(\n conn: Connection,\n method: T,\n ...params: Parameters<ClientMethods[T]>\n): ReturnType<ClientMethods[T]>\nexport function sendRequest(\n conn: Connection,\n method: string,\n ...params: any[]\n): Promise<ProtocolReplyOk<any>> {\n return conn.request(method, params[0]) as any\n}\n\nexport function sendRequestStream<const T extends keyof ClientStreamMethods>(\n conn: Connection,\n method: T,\n ...params: Parameters<ClientStreamMethods[T]>\n): ReturnType<ClientStreamMethods[T]>\nexport function sendRequestStream(\n conn: Connection,\n method: string,\n ...params: any[]\n): Promise<ConnectionStreamResult<any>>\nexport function sendRequestStream(\n conn: Connection,\n method: string,\n ...params: any[]\n): Promise<ConnectionStreamResult<any>> {\n return conn.request(method, params[0], true) as any\n}\n\nexport type SendRequestResult<T extends keyof ClientMethods> = Awaited<ReturnType<ClientMethods[T]>>\nexport type SendRequestStreamResult<T extends keyof ClientStreamMethods> = Awaited<ReturnType<ClientStreamMethods[T]>>\n","import type { ProtocolMessageSegment, ProtocolMessageSendSegment } from '@/types/message'\n\nexport function isMessageSegment<const T extends ProtocolMessageSegment['type'], R extends Extract<ProtocolMessageSegment, { type: T }>>(type: T, value: any): value is R\nexport function isMessageSegment(type: null, value: any): value is ProtocolMessageSegment\nexport function isMessageSegment(type: any, value: any): boolean {\n return value != null && typeof value === 'object' && typeof value.type === 'string' && (type ? value.type === type : true)\n}\n\nexport function createMessageSegment<const T extends ProtocolMessageSendSegment['type'], R extends Extract<ProtocolMessageSendSegment, { type: T }>>(\n type: T,\n data: R['data'],\n): R {\n return { type, data } as R\n}\n\nexport function findMessageSegment<const T extends ProtocolMessageSendSegment['type'], R extends Extract<ProtocolMessageSegment, { type: T }>>(type: T, message?: ProtocolMessageSegment[] | string, cond?: (segment: R) => boolean): R | undefined {\n return message && Array.isArray(message)\n ? message.find(segment => isMessageSegment(type, segment) && cond != null && cond(segment as R)) as R | undefined\n : undefined\n}\n","import type { Connection, Numeric, ProtocolMessageAtSegment, ProtocolMessageEvent, ProtocolMessageSegment, ProtocolSendableMessage } from '@/types'\nimport { sendRequest } from '@/utils/methods'\nimport { findMessageSegment, isMessageSegment } from '@/utils/segment'\nimport { isSameNumericId, toArray } from '@/utils/value'\n\nexport function findMention(message: ProtocolMessageSegment[] | string, uid: Numeric): ProtocolMessageAtSegment | undefined {\n return findMessageSegment('at', message, segment => isSameNumericId(segment.data.qq, uid))\n}\n\nexport function hasMention({ message, self_id }: ProtocolMessageEvent, uid?: Numeric): boolean {\n return findMention(message, uid ?? self_id) != null\n}\n\nexport function respond(connection: Connection, event: ProtocolMessageEvent, message: ProtocolSendableMessage, quote = false) {\n return sendRequest(connection, 'send_msg', {\n message: quote ? [{ type: 'reply', data: { id: event.message_id } }, ...toArray(message)] as ProtocolSendableMessage : message,\n message_type: event.message_type,\n ...(event.message_type === 'group'\n ? { group_id: event.group_id }\n : { user_id: event.user_id }),\n auto_escape: true,\n })\n}\n\nexport function extractText(message: ProtocolMessageSegment[] | string): string[]\nexport function extractText(message: ProtocolMessageSegment[] | string, sep: string): string\nexport function extractText(message: ProtocolMessageSegment[] | string, sep?: string): string[] | string {\n const content = Array.isArray(message)\n ? filterSegments('text', message).map(segment => segment.data.text)\n : [message]\n\n return sep\n ? content.join(sep)\n : content\n}\n\nexport function filterSegments<const T extends ProtocolMessageSegment['type']>(type: T, message: ProtocolMessageSegment[] | string, cond?: (segment: Extract<ProtocolMessageSegment, { type: T }>) => boolean): Array<Extract<ProtocolMessageSegment, { type: T }>> {\n return Array.isArray(message)\n ? message.filter(segment => isMessageSegment(type, segment) && cond?.(segment as any)) as Array<Extract<ProtocolMessageSegment, { type: T }>>\n : []\n}\n","import type { ZodType } from 'zod'\nimport type { MaybeArray, ProtocolMessageSendSegment } from '@/types'\n\nexport interface MessageTemplateInitial<T> {\n props: ZodType<T>\n build: (props: T) => MaybeArray<ProtocolMessageSendSegment>\n}\n\nexport interface AsyncMessageTemplateInitial<T> {\n props: ZodType<T>\n build: (props: T) => Promise<MaybeArray<ProtocolMessageSendSegment>>\n}\n\nexport type MessageTemplate<T> = (data: T) => ProtocolMessageSendSegment[]\nexport type AsyncMessageTemplate<T> = (data: T) => Promise<MaybeArray<ProtocolMessageSendSegment>>\n\nexport function template<T>({ props, build }: MessageTemplateInitial<T>): MessageTemplate<T> {\n return (data: T) => {\n const parsed = props.safeParse(data)\n if (!parsed.success) {\n throw new Error(parsed.error.message)\n }\n const segments = build(parsed.data)\n return Array.isArray(segments) ? segments : [segments]\n }\n}\n\nexport function asyncTemplate<T>({ props, build }: AsyncMessageTemplateInitial<T>): AsyncMessageTemplate<T> {\n return async (data: T) => {\n const parsed = await props.safeParseAsync(data)\n if (!parsed.success) {\n throw new Error(parsed.error.message)\n }\n const segments = await build(parsed.data)\n return Array.isArray(segments) ? segments : [segments]\n }\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- function e(e,t){return Object.is(e.toString(),t.toString())}function t(e){return Object.is(e,void 0)}var n=class e{_size=0;_record=Object.create(null);constructor(e){if(e)for(let t of e)this._record[t]=!0,this._size++}clear(){this._record=Object.create(null),this._size=0}has(e){return!!this._record[e]}remove(e){return this._record[e]?(delete this._record[e],this._size--,!0):!1}add(e){return this._record[e]||(this._record[e]=!0,this._size++),this}get size(){return this._size}*[Symbol.iterator](){for(let e in this._record)yield e}static split(t,n=`,`){return t?new e(t.trim().split(n)):new e}};const r=()=>{};export{r as i,t as n,e as r,n as t};
2
- //# sourceMappingURL=value-DBEEtS4k.mjs.map
1
+ function e(e,t){return Object.is(e.toString(),t.toString())}function t(e){return Object.is(e,void 0)}var n=class e{_size=0;_record=Object.create(null);constructor(e){if(e)for(let t of e)this._record[t]=!0,this._size++}clear(){this._record=Object.create(null),this._size=0}has(e){return!!this._record[e]}remove(e){return this._record[e]?(delete this._record[e],this._size--,!0):!1}add(e){return this._record[e]||(this._record[e]=!0,this._size++),this}get size(){return this._size}*[Symbol.iterator](){for(let e in this._record)yield e}static split(t,n=`,`){return t?new e(t.trim().split(n)):new e}};const r=()=>{};function i(e){return Array.isArray(e)?e:[e]}export{i as a,r as i,t as n,e as r,n as t};
2
+ //# sourceMappingURL=value-CXqvIDVX.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"value-DBEEtS4k.mjs","names":[],"sources":["../src/utils/value.ts"],"sourcesContent":["import type { Numeric } from '@/types/common'\n\nexport function isSameNumericId(id1: Numeric, id2: Numeric) {\n return Object.is(id1.toString(), id2.toString())\n}\n\nexport function isNull(value: any): value is null | undefined {\n return Object.is(value, void 0)\n}\n\nexport class NumericSet implements Iterable<string> {\n private _size = 0\n private _record: Record<Numeric, true> = Object.create(null)\n\n constructor(ids?: Iterable<Numeric>) {\n if (!ids) {\n return\n }\n\n for (const id of ids) {\n this._record[id] = true\n this._size++\n }\n }\n\n clear() {\n this._record = Object.create(null)\n this._size = 0\n }\n\n has(id: Numeric): boolean {\n return !!this._record[id]\n }\n\n remove(id: Numeric): boolean {\n if (this._record[id]) {\n delete this._record[id]\n this._size--\n return true\n }\n return false\n }\n\n add(id: Numeric): this {\n if (!this._record[id]) {\n this._record[id] = true\n this._size++\n }\n return this\n }\n\n get size() {\n return this._size\n }\n\n * [Symbol.iterator](): IterableIterator<string> {\n for (const id in this._record) {\n yield id\n }\n }\n\n static split(str?: string, sep = ',') {\n return str ? new NumericSet(str.trim().split(sep)) : new NumericSet()\n }\n}\n\n// eslint-disable-next-line antfu/top-level-function\nexport const noop = () => { /* noop */ }\n"],"mappings":"AAEA,SAAgB,EAAgB,EAAc,EAAc,CAC1D,OAAO,OAAO,GAAG,EAAI,UAAU,CAAE,EAAI,UAAU,CAAC,CAGlD,SAAgB,EAAO,EAAuC,CAC5D,OAAO,OAAO,GAAG,EAAO,IAAK,GAAE,CAGjC,IAAa,EAAb,MAAa,CAAuC,CAClD,MAAgB,EAChB,QAAyC,OAAO,OAAO,KAAK,CAE5D,YAAY,EAAyB,CAC9B,KAIL,IAAK,IAAM,KAAM,EACf,KAAK,QAAQ,GAAM,GACnB,KAAK,QAIT,OAAQ,CACN,KAAK,QAAU,OAAO,OAAO,KAAK,CAClC,KAAK,MAAQ,EAGf,IAAI,EAAsB,CACxB,MAAO,CAAC,CAAC,KAAK,QAAQ,GAGxB,OAAO,EAAsB,CAM3B,OALI,KAAK,QAAQ,IACf,OAAO,KAAK,QAAQ,GACpB,KAAK,QACE,IAEF,GAGT,IAAI,EAAmB,CAKrB,OAJK,KAAK,QAAQ,KAChB,KAAK,QAAQ,GAAM,GACnB,KAAK,SAEA,KAGT,IAAI,MAAO,CACT,OAAO,KAAK,MAGd,EAAG,OAAO,WAAsC,CAC9C,IAAK,IAAM,KAAM,KAAK,QACpB,MAAM,EAIV,OAAO,MAAM,EAAc,EAAM,IAAK,CACpC,OAAO,EAAM,IAAI,EAAW,EAAI,MAAM,CAAC,MAAM,EAAI,CAAC,CAAG,IAAI,IAK7D,MAAa,MAAa"}
1
+ {"version":3,"file":"value-CXqvIDVX.mjs","names":[],"sources":["../src/utils/value.ts"],"sourcesContent":["import type { Numeric } from '@/types/common'\n\nexport function isSameNumericId(id1: Numeric, id2: Numeric) {\n return Object.is(id1.toString(), id2.toString())\n}\n\nexport function isNull(value: any): value is null | undefined {\n return Object.is(value, void 0)\n}\n\nexport class NumericSet implements Iterable<string> {\n private _size = 0\n private _record: Record<Numeric, true> = Object.create(null)\n\n constructor(ids?: Iterable<Numeric>) {\n if (!ids) {\n return\n }\n\n for (const id of ids) {\n this._record[id] = true\n this._size++\n }\n }\n\n clear() {\n this._record = Object.create(null)\n this._size = 0\n }\n\n has(id: Numeric): boolean {\n return !!this._record[id]\n }\n\n remove(id: Numeric): boolean {\n if (this._record[id]) {\n delete this._record[id]\n this._size--\n return true\n }\n return false\n }\n\n add(id: Numeric): this {\n if (!this._record[id]) {\n this._record[id] = true\n this._size++\n }\n return this\n }\n\n get size() {\n return this._size\n }\n\n * [Symbol.iterator](): IterableIterator<string> {\n for (const id in this._record) {\n yield id\n }\n }\n\n static split(str?: string, sep = ',') {\n return str ? new NumericSet(str.trim().split(sep)) : new NumericSet()\n }\n}\n\n// eslint-disable-next-line antfu/top-level-function\nexport const noop = () => { /* noop */ }\n\nexport function toArray<const T>(value: T | T[]): T[] {\n return Array.isArray(value) ? value : [value]\n}\n"],"mappings":"AAEA,SAAgB,EAAgB,EAAc,EAAc,CAC1D,OAAO,OAAO,GAAG,EAAI,UAAU,CAAE,EAAI,UAAU,CAAC,CAGlD,SAAgB,EAAO,EAAuC,CAC5D,OAAO,OAAO,GAAG,EAAO,IAAK,GAAE,CAGjC,IAAa,EAAb,MAAa,CAAuC,CAClD,MAAgB,EAChB,QAAyC,OAAO,OAAO,KAAK,CAE5D,YAAY,EAAyB,CAC9B,KAIL,IAAK,IAAM,KAAM,EACf,KAAK,QAAQ,GAAM,GACnB,KAAK,QAIT,OAAQ,CACN,KAAK,QAAU,OAAO,OAAO,KAAK,CAClC,KAAK,MAAQ,EAGf,IAAI,EAAsB,CACxB,MAAO,CAAC,CAAC,KAAK,QAAQ,GAGxB,OAAO,EAAsB,CAM3B,OALI,KAAK,QAAQ,IACf,OAAO,KAAK,QAAQ,GACpB,KAAK,QACE,IAEF,GAGT,IAAI,EAAmB,CAKrB,OAJK,KAAK,QAAQ,KAChB,KAAK,QAAQ,GAAM,GACnB,KAAK,SAEA,KAGT,IAAI,MAAO,CACT,OAAO,KAAK,MAGd,EAAG,OAAO,WAAsC,CAC9C,IAAK,IAAM,KAAM,KAAK,QACpB,MAAM,EAIV,OAAO,MAAM,EAAc,EAAM,IAAK,CACpC,OAAO,EAAM,IAAI,EAAW,EAAI,MAAM,CAAC,MAAM,EAAI,CAAC,CAAG,IAAI,IAK7D,MAAa,MAAa,GAE1B,SAAgB,EAAiB,EAAqB,CACpD,OAAO,MAAM,QAAQ,EAAM,CAAG,EAAQ,CAAC,EAAM"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "napcon",
3
3
  "type": "module",
4
- "version": "0.0.13",
4
+ "version": "0.0.15",
5
5
  "packageManager": "bun@1.3.9",
6
6
  "description": "Lightweight NapCat/Onebot v11 TypeScript library",
7
7
  "license": "LGPL-2.1-or-later",