napcon 0.0.12 → 0.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -3
- package/dist/{index-B-aM7zm7.d.mts → index-xpa8wXI0.d.mts} +5 -5
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/utils/builder.d.mts +1 -1
- package/dist/utils/index.d.mts +5 -6
- package/dist/utils/index.mjs +1 -1
- package/dist/utils/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# NapCon
|
|
2
|
-
> Moved to [`napcon`](https://npmjs.com/napcon)
|
|
3
|
-
|
|
4
2
|
A lightweight TypeScript library for [NapCat](https://github.com/NapNeko/NapCatQQ) and [OneBot v11](https://11.onebot.dev).
|
|
5
3
|
|
|
6
4
|
> **Note**: This library is currently in active development. APIs are subject to change.
|
|
7
5
|
|
|
6
|
+
Check out [DeepWiki](https://deepwiki.com/suisanka/napcon) for more documentation.
|
|
7
|
+
|
|
8
8
|
## Features
|
|
9
9
|
|
|
10
10
|
- **Ultra-lightweight**: Zero dependencies, ~1.7KB gzipped.
|
|
@@ -13,5 +13,7 @@ A lightweight TypeScript library for [NapCat](https://github.com/NapNeko/NapCatQ
|
|
|
13
13
|
- **Rich Utilities**: Built-in message builders, guards, and helper functions.
|
|
14
14
|
|
|
15
15
|
## Example
|
|
16
|
+
This is a simple example of using NapCon to respond to group at messages with `Hello, [nickname]!`.
|
|
17
|
+

|
|
16
18
|
|
|
17
|
-
Check out [examples
|
|
19
|
+
Check out [examples](https://github.com/suisanka/napcon/blob/main/examples/) for usage examples.
|
|
@@ -642,15 +642,15 @@ interface ConnectionBasicPubSubHandlers {
|
|
|
642
642
|
'connection.reconnect': [transport: Transport, connection: Connection];
|
|
643
643
|
'connection.request': [event: ProtocolRequest, connection: Connection];
|
|
644
644
|
'connection.reply': [event: ProtocolReply, connection: Connection];
|
|
645
|
-
'
|
|
645
|
+
'protocol.event': [event: ProtocolEvent, connection: Connection];
|
|
646
646
|
'connection.error': [error: any, connection: Connection];
|
|
647
647
|
'connection.reply.stream': [data: ProtocolReply, connection: Connection];
|
|
648
648
|
[x: string]: any[];
|
|
649
649
|
}
|
|
650
|
-
type
|
|
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>>];
|
|
653
|
-
interface Connection extends ConnectionPubSub {
|
|
653
|
+
interface Connection extends ConnectionPubSub, Disposable {
|
|
654
654
|
readonly transport: Transport;
|
|
655
655
|
connect: () => Promise<void>;
|
|
656
656
|
close: () => void;
|
|
@@ -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,
|
|
675
|
-
//# sourceMappingURL=index-
|
|
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
|
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
|
|
2
|
-
export { Connection, ConnectionBasicPubSubHandlers,
|
|
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 };
|
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(`
|
|
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};
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -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('connection.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\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?: (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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"}
|
package/dist/utils/builder.d.mts
CHANGED
|
@@ -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-
|
|
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";
|
|
2
2
|
|
|
3
3
|
//#region src/utils/builder.d.ts
|
|
4
4
|
declare namespace builder_d_exports {
|
package/dist/utils/index.d.mts
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
|
-
import { C as ProtocolReplyOk, N as ProtocolEventHandlers, _n as Numeric,
|
|
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";
|
|
2
2
|
import { t as builder_d_exports } from "./builder.mjs";
|
|
3
3
|
import { ZodType } from "zod";
|
|
4
4
|
|
|
5
5
|
//#region src/utils/event.d.ts
|
|
6
6
|
type ConnectionOrProtocolEventHandlers = ConnectionBasicPubSubHandlers & ProtocolEventHandlers & {};
|
|
7
|
-
declare function defineHandler<const K extends keyof ConnectionOrProtocolEventHandlers
|
|
8
|
-
declare function
|
|
7
|
+
declare function defineHandler<const K extends keyof ConnectionOrProtocolEventHandlers, const F extends (...args: ConnectionOrProtocolEventHandlers[K]) => void>(type: K, handler: F): F;
|
|
8
|
+
declare function createEventMatcher<const K extends keyof ProtocolEventHandlers>(type: K): EventMatcher<K>;
|
|
9
|
+
declare function matchEvent<const K extends keyof ProtocolEventHandlers>(type: K, handler: (...args: ProtocolEventHandlers[K]) => void): ProtocolEventHandler;
|
|
9
10
|
interface EventMatcher<K extends keyof ProtocolEventHandlers> {
|
|
10
11
|
(event: any): event is ProtocolEventHandlers[K];
|
|
11
12
|
}
|
|
12
|
-
declare function createEventMatcher<const K extends keyof ProtocolEventHandlers>(type: K): EventMatcher<K>;
|
|
13
|
-
declare function composeEvent(...handlers: ConnectionEventHandler[]): ConnectionEventHandler;
|
|
14
13
|
//#endregion
|
|
15
14
|
//#region src/utils/methods.d.ts
|
|
16
15
|
interface ClientMethods {
|
|
@@ -1098,5 +1097,5 @@ declare class NumericSet implements Iterable<string> {
|
|
|
1098
1097
|
}
|
|
1099
1098
|
declare const noop: () => void;
|
|
1100
1099
|
//#endregion
|
|
1101
|
-
export { AsyncMessageTemplate, AsyncMessageTemplateInitial, ClientMethods, ClientStreamMethods, ConnectionOrProtocolEventHandlers, EventMatcher, MessageTemplate, MessageTemplateInitial, NumericSet, SendRequestResult, SendRequestStreamResult, asyncTemplate,
|
|
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 };
|
|
1102
1101
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/utils/index.mjs
CHANGED
|
@@ -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(`
|
|
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};
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|
package/dist/utils/index.mjs.map
CHANGED
|
@@ -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, ConnectionEventHandler, ProtocolEventHandlers } from '@/types'\n\nexport type ConnectionOrProtocolEventHandlers = ConnectionBasicPubSubHandlers & ProtocolEventHandlers & {}\n\nexport function defineHandler<const K extends keyof ConnectionOrProtocolEventHandlers>(\n type: K,\n handler: (...args: ConnectionOrProtocolEventHandlers[K]) => void,\n): (...args: ConnectionOrProtocolEventHandlers[K]) => void {\n return handler\n}\n\nconst cachedMatchers = new Map<string, (event: any) => boolean>()\n\nfunction createMatcher(type: keyof ProtocolEventHandlers): (event: any) => boolean {\n if (cachedMatchers.has(type)) {\n return cachedMatchers.get(type)!\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\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\n}\n\nexport function matchEvent<const K extends keyof ProtocolEventHandlers>(\n type: K,\n handler: (...args: ProtocolEventHandlers[K]) => void,\n): ConnectionEventHandler {\n const matcher = createMatcher(type)\n return defineHandler('connection.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\nexport function createEventMatcher<const K extends keyof ProtocolEventHandlers>(\n type: K,\n): EventMatcher<K> {\n return createMatcher(type) as EventMatcher<K>\n}\n\nexport function composeEvent(...handlers: ConnectionEventHandler[]): ConnectionEventHandler {\n const p = Promise.resolve()\n return (event, connection) => {\n for (const handler of handlers) {\n p.then(() => handler(event, connection))\n }\n }\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,EACyD,CACzD,OAAO,EAGT,MAAM,EAAiB,IAAI,IAE3B,SAAS,EAAc,EAA4D,CACjF,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,EACwB,CACxB,IAAM,EAAU,EAAc,EAAK,CACnC,OAAO,EAAc,oBAAqB,EAAY,IAAe,CAC/D,EAAQ,EAAM,EACf,EAAgB,EAAO,EAAW,EAErC,CAWJ,SAAgB,EACd,EACiB,CACjB,OAAO,EAAc,EAAK,CAG5B,SAAgB,EAAa,GAAG,EAA4D,CAC1F,IAAM,EAAI,QAAQ,SAAS,CAC3B,OAAQ,EAAO,IAAe,CAC5B,IAAK,IAAM,KAAW,EACpB,EAAE,SAAW,EAAQ,EAAO,EAAW,CAAC,ECq8B9C,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/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"}
|