@krischoichoi/channel-weixin 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +101 -0
- package/lib/adapter.d.ts +90 -0
- package/lib/adapter.d.ts.map +1 -0
- package/lib/adapter.js +247 -0
- package/lib/adapter.js.map +1 -0
- package/lib/auth/account-store.d.ts +60 -0
- package/lib/auth/account-store.d.ts.map +1 -0
- package/lib/auth/account-store.js +84 -0
- package/lib/auth/account-store.js.map +1 -0
- package/lib/auth/login.d.ts +83 -0
- package/lib/auth/login.d.ts.map +1 -0
- package/lib/auth/login.js +202 -0
- package/lib/auth/login.js.map +1 -0
- package/lib/config.d.ts +52 -0
- package/lib/config.d.ts.map +1 -0
- package/lib/config.js +36 -0
- package/lib/config.js.map +1 -0
- package/lib/definition.d.ts +59 -0
- package/lib/definition.d.ts.map +1 -0
- package/lib/definition.js +146 -0
- package/lib/definition.js.map +1 -0
- package/lib/ilink/base-info.d.ts +22 -0
- package/lib/ilink/base-info.d.ts.map +1 -0
- package/lib/ilink/base-info.js +11 -0
- package/lib/ilink/base-info.js.map +1 -0
- package/lib/ilink/client.d.ts +110 -0
- package/lib/ilink/client.d.ts.map +1 -0
- package/lib/ilink/client.js +308 -0
- package/lib/ilink/client.js.map +1 -0
- package/lib/ilink/constants.d.ts +59 -0
- package/lib/ilink/constants.d.ts.map +1 -0
- package/lib/ilink/constants.js +59 -0
- package/lib/ilink/constants.js.map +1 -0
- package/lib/ilink/errors.d.ts +79 -0
- package/lib/ilink/errors.d.ts.map +1 -0
- package/lib/ilink/errors.js +121 -0
- package/lib/ilink/errors.js.map +1 -0
- package/lib/ilink/headers.d.ts +40 -0
- package/lib/ilink/headers.d.ts.map +1 -0
- package/lib/ilink/headers.js +70 -0
- package/lib/ilink/headers.js.map +1 -0
- package/lib/ilink/schema.d.ts +154 -0
- package/lib/ilink/schema.d.ts.map +1 -0
- package/lib/ilink/schema.js +140 -0
- package/lib/ilink/schema.js.map +1 -0
- package/lib/ilink/types.d.ts +235 -0
- package/lib/ilink/types.d.ts.map +1 -0
- package/lib/ilink/types.js +21 -0
- package/lib/ilink/types.js.map +1 -0
- package/lib/index.d.ts +50 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +91 -0
- package/lib/index.js.map +1 -0
- package/lib/manifest.d.ts +54 -0
- package/lib/manifest.d.ts.map +1 -0
- package/lib/manifest.js +32 -0
- package/lib/manifest.js.map +1 -0
- package/lib/media/decrypt.d.ts +3 -0
- package/lib/media/decrypt.d.ts.map +1 -0
- package/lib/media/decrypt.js +16 -0
- package/lib/media/decrypt.js.map +1 -0
- package/lib/media/download.d.ts +22 -0
- package/lib/media/download.d.ts.map +1 -0
- package/lib/media/download.js +62 -0
- package/lib/media/download.js.map +1 -0
- package/lib/media/encrypt.d.ts +3 -0
- package/lib/media/encrypt.d.ts.map +1 -0
- package/lib/media/encrypt.js +16 -0
- package/lib/media/encrypt.js.map +1 -0
- package/lib/media/send-media.d.ts +41 -0
- package/lib/media/send-media.d.ts.map +1 -0
- package/lib/media/send-media.js +52 -0
- package/lib/media/send-media.js.map +1 -0
- package/lib/media/silk-transcode.d.ts +38 -0
- package/lib/media/silk-transcode.d.ts.map +1 -0
- package/lib/media/silk-transcode.js +88 -0
- package/lib/media/silk-transcode.js.map +1 -0
- package/lib/media/upload.d.ts +38 -0
- package/lib/media/upload.d.ts.map +1 -0
- package/lib/media/upload.js +122 -0
- package/lib/media/upload.js.map +1 -0
- package/lib/messaging/dedup.d.ts +87 -0
- package/lib/messaging/dedup.d.ts.map +1 -0
- package/lib/messaging/dedup.js +127 -0
- package/lib/messaging/dedup.js.map +1 -0
- package/lib/messaging/mapper.d.ts +26 -0
- package/lib/messaging/mapper.d.ts.map +1 -0
- package/lib/messaging/mapper.js +107 -0
- package/lib/messaging/mapper.js.map +1 -0
- package/lib/messaging/monitor.d.ts +109 -0
- package/lib/messaging/monitor.d.ts.map +1 -0
- package/lib/messaging/monitor.js +234 -0
- package/lib/messaging/monitor.js.map +1 -0
- package/lib/messaging/quote.d.ts +9 -0
- package/lib/messaging/quote.d.ts.map +1 -0
- package/lib/messaging/quote.js +35 -0
- package/lib/messaging/quote.js.map +1 -0
- package/lib/messaging/send.d.ts +54 -0
- package/lib/messaging/send.d.ts.map +1 -0
- package/lib/messaging/send.js +173 -0
- package/lib/messaging/send.js.map +1 -0
- package/lib/messaging/typing.d.ts +34 -0
- package/lib/messaging/typing.d.ts.map +1 -0
- package/lib/messaging/typing.js +56 -0
- package/lib/messaging/typing.js.map +1 -0
- package/lib/storage/context-token.d.ts +26 -0
- package/lib/storage/context-token.d.ts.map +1 -0
- package/lib/storage/context-token.js +26 -0
- package/lib/storage/context-token.js.map +1 -0
- package/lib/storage/sync-cursor.d.ts +27 -0
- package/lib/storage/sync-cursor.d.ts.map +1 -0
- package/lib/storage/sync-cursor.js +25 -0
- package/lib/storage/sync-cursor.js.map +1 -0
- package/lib/transport.d.ts +38 -0
- package/lib/transport.d.ts.map +1 -0
- package/lib/transport.js +68 -0
- package/lib/transport.js.map +1 -0
- package/lib/upstream/compat.d.ts +54 -0
- package/lib/upstream/compat.d.ts.map +1 -0
- package/lib/upstream/compat.js +54 -0
- package/lib/upstream/compat.js.map +1 -0
- package/lib/upstream/config-manager.d.ts +35 -0
- package/lib/upstream/config-manager.d.ts.map +1 -0
- package/lib/upstream/config-manager.js +91 -0
- package/lib/upstream/config-manager.js.map +1 -0
- package/lib/upstream/index.d.ts +42 -0
- package/lib/upstream/index.d.ts.map +1 -0
- package/lib/upstream/index.js +13 -0
- package/lib/upstream/index.js.map +1 -0
- package/lib/upstream/port.d.ts +153 -0
- package/lib/upstream/port.d.ts.map +1 -0
- package/lib/upstream/port.js +15 -0
- package/lib/upstream/port.js.map +1 -0
- package/lib/upstream/tencent-upstream.d.ts +116 -0
- package/lib/upstream/tencent-upstream.d.ts.map +1 -0
- package/lib/upstream/tencent-upstream.js +518 -0
- package/lib/upstream/tencent-upstream.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export const DEFAULT_BOT_AGENT = 'DeepSeekHarness';
|
|
2
|
+
/** Build the `base_info` object sent with every iLink CGI request. */
|
|
3
|
+
export function buildBaseInfo(opts = {}) {
|
|
4
|
+
const info = {};
|
|
5
|
+
if (opts.channelVersion)
|
|
6
|
+
info.channel_version = opts.channelVersion;
|
|
7
|
+
// bot_agent falls back to DeepSeekHarness when the caller did not supply one.
|
|
8
|
+
info.bot_agent = opts.botAgent ?? DEFAULT_BOT_AGENT;
|
|
9
|
+
return info;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=base-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-info.js","sourceRoot":"","sources":["../../src/ilink/base-info.ts"],"names":[],"mappings":"AAaA,MAAM,CAAC,MAAM,iBAAiB,GAAG,iBAAiB,CAAC;AASnD,sEAAsE;AACtE,MAAM,UAAU,aAAa,CAAC,OAA6B,EAAE;IAC3D,MAAM,IAAI,GAAkB,EAAE,CAAC;IAC/B,IAAI,IAAI,CAAC,cAAc;QAAE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC;IACpE,8EAA8E;IAC9E,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,IAAI,iBAAiB,CAAC;IACpD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { type HttpTransport } from '../transport.js';
|
|
2
|
+
import type { ILinkGetConfigRequest, ILinkGetConfigResponse, ILinkGetUpdatesResponse, ILinkGetUploadUrlRequest, ILinkGetUploadUrlResponse, ILinkNotifyResponse, ILinkQrCodeResponse, ILinkQrStatusResponse, ILinkSendMessageRequest, ILinkSendMessageResponse, ILinkSendTypingRequest, ILinkSendTypingResponse } from './types.js';
|
|
3
|
+
export interface ILinkClientOptions {
|
|
4
|
+
/** API base URL; may be updated per-account after QR redirect. */
|
|
5
|
+
baseUrl: string;
|
|
6
|
+
/** CDN base URL for media operations (WX5 scaffold). */
|
|
7
|
+
cdnBaseUrl?: string;
|
|
8
|
+
/** Bot token for authenticated requests. */
|
|
9
|
+
token?: string;
|
|
10
|
+
/** Timeout for regular API requests (ms). */
|
|
11
|
+
timeoutMs?: number;
|
|
12
|
+
/** Timeout for the getUpdates long-poll (ms). */
|
|
13
|
+
longPollTimeoutMs?: number;
|
|
14
|
+
/** bot_agent string for base_info. */
|
|
15
|
+
botAgent?: string;
|
|
16
|
+
/** Injectable transport (tests). */
|
|
17
|
+
transport?: HttpTransport;
|
|
18
|
+
/** Injectable clock (tests). */
|
|
19
|
+
now?: () => number;
|
|
20
|
+
/** Optional route tag emitted as SKRouteTag. */
|
|
21
|
+
routeTag?: string;
|
|
22
|
+
/** Injectable random source for X-WECHAT-UIN (tests). */
|
|
23
|
+
rand?: () => number;
|
|
24
|
+
}
|
|
25
|
+
export interface GetUpdatesParams {
|
|
26
|
+
getUpdatesBuf?: string;
|
|
27
|
+
/** Long-poll timeout override (dynamic from server). */
|
|
28
|
+
longPollTimeoutMs?: number;
|
|
29
|
+
/** External abort signal (channel stop). */
|
|
30
|
+
signal?: AbortSignal;
|
|
31
|
+
}
|
|
32
|
+
export interface GetUpdatesResult {
|
|
33
|
+
msgs: ILinkGetUpdatesResponse['msgs'];
|
|
34
|
+
get_updates_buf?: string;
|
|
35
|
+
/** Next long-poll timeout suggested by the server. */
|
|
36
|
+
nextLongPollTimeoutMs?: number;
|
|
37
|
+
/** Whether the response came from a long-poll client-side timeout (empty msgs). */
|
|
38
|
+
timedOut?: boolean;
|
|
39
|
+
}
|
|
40
|
+
/** Optional local state supplied when requesting a QR login challenge. */
|
|
41
|
+
export interface GetBotQrcodeOptions {
|
|
42
|
+
/** Recent locally-held bot tokens. Values are never logged. */
|
|
43
|
+
localTokens?: readonly string[];
|
|
44
|
+
/** External abort signal for the request. */
|
|
45
|
+
signal?: AbortSignal;
|
|
46
|
+
}
|
|
47
|
+
export declare class ILinkClient {
|
|
48
|
+
private readonly options;
|
|
49
|
+
private _baseUrl;
|
|
50
|
+
private readonly configuredBaseAuthority;
|
|
51
|
+
private readonly cdnBaseUrl;
|
|
52
|
+
private _token?;
|
|
53
|
+
private readonly timeoutMs;
|
|
54
|
+
private readonly longPollTimeoutMs;
|
|
55
|
+
private readonly botAgent;
|
|
56
|
+
private readonly transport;
|
|
57
|
+
private readonly now;
|
|
58
|
+
private readonly rand;
|
|
59
|
+
private readonly routeTag?;
|
|
60
|
+
private readonly accountId;
|
|
61
|
+
constructor(options: ILinkClientOptions, accountId?: string);
|
|
62
|
+
/** Current effective API base URL (mutable after QR redirect). */
|
|
63
|
+
get baseUrl(): string;
|
|
64
|
+
/** Update the effective base URL (QR redirect / confirmed baseurl). */
|
|
65
|
+
setBaseUrl(baseUrl: string): void;
|
|
66
|
+
/** Update the bot token (post-QR-confirm). */
|
|
67
|
+
setToken(token?: string): void;
|
|
68
|
+
get token(): string | undefined;
|
|
69
|
+
/** CDN base URL (no trailing slash). */
|
|
70
|
+
get cdnUrl(): string;
|
|
71
|
+
private headers;
|
|
72
|
+
private baseInfo;
|
|
73
|
+
private post;
|
|
74
|
+
private get;
|
|
75
|
+
private parseResponse;
|
|
76
|
+
/** POST /ilink/bot/get_bot_qrcode?bot_type=3 with { local_token_list: [] }. */
|
|
77
|
+
getBotQrcode(options?: GetBotQrcodeOptions): Promise<ILinkQrCodeResponse>;
|
|
78
|
+
/**
|
|
79
|
+
* GET /ilink/bot/get_qrcode_status?qrcode=... (optionally &verify_code=...).
|
|
80
|
+
*
|
|
81
|
+
* This is a long-poll endpoint: the server holds the request open while the
|
|
82
|
+
* status is `wait` (before the user scans). A client-side long-poll timeout
|
|
83
|
+
* is therefore normal control flow — same semantics as `getUpdates` — and is
|
|
84
|
+
* mapped back to `{ status: 'wait' }` so `WeixinQrAuth` never has to reason
|
|
85
|
+
* about HTTP timeouts: timeout → wait → pending → next poll.
|
|
86
|
+
*/
|
|
87
|
+
getQrcodeStatus(qrcode: string, opts?: {
|
|
88
|
+
verifyCode?: string;
|
|
89
|
+
signal?: AbortSignal;
|
|
90
|
+
}): Promise<ILinkQrStatusResponse>;
|
|
91
|
+
/**
|
|
92
|
+
* POST /ilink/bot/getupdates.
|
|
93
|
+
* A long-poll client-side timeout is normal control flow: returns an empty
|
|
94
|
+
* result with `timedOut: true` so the monitor can simply retry.
|
|
95
|
+
*/
|
|
96
|
+
getUpdates(params?: GetUpdatesParams): Promise<GetUpdatesResult>;
|
|
97
|
+
/** POST /ilink/bot/sendmessage. */
|
|
98
|
+
sendMessage(req: ILinkSendMessageRequest, signal?: AbortSignal): Promise<ILinkSendMessageResponse>;
|
|
99
|
+
/** POST /ilink/bot/getuploadurl (WX5 media upload slot). */
|
|
100
|
+
getUploadUrl(req: ILinkGetUploadUrlRequest, signal?: AbortSignal): Promise<ILinkGetUploadUrlResponse>;
|
|
101
|
+
/** POST /ilink/bot/getconfig. */
|
|
102
|
+
getConfig(req: ILinkGetConfigRequest, signal?: AbortSignal): Promise<ILinkGetConfigResponse>;
|
|
103
|
+
/** POST /ilink/bot/sendtyping. */
|
|
104
|
+
sendTyping(req: ILinkSendTypingRequest, signal?: AbortSignal): Promise<ILinkSendTypingResponse>;
|
|
105
|
+
/** POST /ilink/bot/msg/notifystart (best effort). */
|
|
106
|
+
notifyStart(signal?: AbortSignal): Promise<ILinkNotifyResponse>;
|
|
107
|
+
/** POST /ilink/bot/msg/notifystop (best effort). */
|
|
108
|
+
notifyStop(signal?: AbortSignal): Promise<ILinkNotifyResponse>;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/ilink/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Classification: C — duplicate protocol implementation [@deprecated upstream-gap].
|
|
3
|
+
*
|
|
4
|
+
* iLink HTTP client (QR code, getUpdates long-poll, sendmessage, getconfig,
|
|
5
|
+
* sendtyping, getuploadurl, notify). Self-implemented because the official
|
|
6
|
+
* Tencent/openclaw-weixin @ 2.4.6 equivalents for these calls (api/api.js +
|
|
7
|
+
* auth/login-qr.js) are coupled to the OpenClaw runtime via util/logger.ts /
|
|
8
|
+
* auth/accounts.ts and execute OpenClaw side effects at import time (do not
|
|
9
|
+
* drag the OpenClaw runtime into DSH). Marked upstream-gap; official
|
|
10
|
+
* source of truth = @tencent-weixin/openclaw-weixin/dist/src/api/api.js.
|
|
11
|
+
* DO NOT delete wholesale this milestone.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* ILinkClient — thin, endpoint-aware client over the base {@link HttpTransport}.
|
|
15
|
+
*
|
|
16
|
+
* Owns the iLink endpoint paths, request/response shapes and error
|
|
17
|
+
* normalization. The base URL is mutable per account so QR-redirect and
|
|
18
|
+
* confirmed `baseurl` can update all later calls (getUpdates / sendMessage /
|
|
19
|
+
* QR status).
|
|
20
|
+
*/
|
|
21
|
+
import pkg from '../../package.json' with { type: 'json' };
|
|
22
|
+
import { z } from 'zod';
|
|
23
|
+
import { FetchTransport } from '../transport.js';
|
|
24
|
+
import { buildHeaders } from './headers.js';
|
|
25
|
+
import { buildBaseInfo } from './base-info.js';
|
|
26
|
+
import { DEFAULT_CDN_BASE_URL, DEFAULT_LONG_POLL_TIMEOUT_MS, ENDPOINT_GET_BOT_QRCODE, ENDPOINT_GET_CONFIG, ENDPOINT_GET_QRCODE_STATUS, ENDPOINT_GET_UPDATES, ENDPOINT_GET_UPLOAD_URL, ENDPOINT_NOTIFY_START, ENDPOINT_NOTIFY_STOP, ENDPOINT_SEND_MESSAGE, ENDPOINT_SEND_TYPING, DEFAULT_BOT_TYPE, DEFAULT_QR_POLL_TIMEOUT_MS, } from './constants.js';
|
|
27
|
+
import { normalizeILinkError } from './errors.js';
|
|
28
|
+
import { getConfigResponseSchema, getUpdatesResponseSchema, getUploadUrlResponseSchema, notifyResponseSchema, qrCodeResponseSchema, qrStatusResponseSchema, responseEnvelopeSchema, sendMessageResponseSchema, sendTypingResponseSchema, } from './schema.js';
|
|
29
|
+
const localTokenArraySchema = z.array(z.unknown());
|
|
30
|
+
const localTokenSchema = z.string().trim().min(1).max(4096);
|
|
31
|
+
const MAX_LOCAL_TOKENS = 10;
|
|
32
|
+
/** Validate, normalize, deduplicate, and bound QR local tokens at the wire boundary. */
|
|
33
|
+
function normalizeLocalTokens(value) {
|
|
34
|
+
const parsed = localTokenArraySchema.safeParse(value);
|
|
35
|
+
if (!parsed.success)
|
|
36
|
+
return [];
|
|
37
|
+
const tokens = [];
|
|
38
|
+
const seen = new Set();
|
|
39
|
+
for (const item of parsed.data) {
|
|
40
|
+
const token = localTokenSchema.safeParse(item);
|
|
41
|
+
if (!token.success || seen.has(token.data))
|
|
42
|
+
continue;
|
|
43
|
+
seen.add(token.data);
|
|
44
|
+
tokens.push(token.data);
|
|
45
|
+
if (tokens.length === MAX_LOCAL_TOKENS)
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
return tokens;
|
|
49
|
+
}
|
|
50
|
+
function ensureSlash(url) {
|
|
51
|
+
return url.endsWith('/') ? url : `${url}/`;
|
|
52
|
+
}
|
|
53
|
+
const OFFICIAL_ILINK_HOST_SUFFIX = 'weixin.qq.com';
|
|
54
|
+
function parseIlinkBaseUrl(value) {
|
|
55
|
+
let url;
|
|
56
|
+
try {
|
|
57
|
+
url = new URL(value.trim());
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
throw new TypeError('invalid iLink base URL');
|
|
61
|
+
}
|
|
62
|
+
if (url.protocol !== 'https:' ||
|
|
63
|
+
!url.hostname ||
|
|
64
|
+
url.username ||
|
|
65
|
+
url.password ||
|
|
66
|
+
url.search ||
|
|
67
|
+
url.hash) {
|
|
68
|
+
throw new TypeError('invalid iLink base URL');
|
|
69
|
+
}
|
|
70
|
+
return url;
|
|
71
|
+
}
|
|
72
|
+
function isOfficialIlinkHost(hostname) {
|
|
73
|
+
const normalized = hostname.toLowerCase();
|
|
74
|
+
return normalized === OFFICIAL_ILINK_HOST_SUFFIX || normalized.endsWith(`.${OFFICIAL_ILINK_HOST_SUFFIX}`);
|
|
75
|
+
}
|
|
76
|
+
function serializeBaseUrl(url) {
|
|
77
|
+
return url.toString().replace(/\/+$/, '');
|
|
78
|
+
}
|
|
79
|
+
export class ILinkClient {
|
|
80
|
+
options;
|
|
81
|
+
_baseUrl;
|
|
82
|
+
configuredBaseAuthority;
|
|
83
|
+
cdnBaseUrl;
|
|
84
|
+
_token;
|
|
85
|
+
timeoutMs;
|
|
86
|
+
longPollTimeoutMs;
|
|
87
|
+
botAgent;
|
|
88
|
+
transport;
|
|
89
|
+
now;
|
|
90
|
+
rand;
|
|
91
|
+
routeTag;
|
|
92
|
+
accountId;
|
|
93
|
+
constructor(options, accountId = 'main') {
|
|
94
|
+
this.options = options;
|
|
95
|
+
this.accountId = accountId;
|
|
96
|
+
const configuredBaseUrl = parseIlinkBaseUrl(options.baseUrl);
|
|
97
|
+
this.configuredBaseAuthority = configuredBaseUrl.host.toLowerCase();
|
|
98
|
+
this._baseUrl = serializeBaseUrl(configuredBaseUrl);
|
|
99
|
+
this.cdnBaseUrl = (options.cdnBaseUrl ?? DEFAULT_CDN_BASE_URL).replace(/\/+$/, '');
|
|
100
|
+
this._token = options.token;
|
|
101
|
+
this.timeoutMs = options.timeoutMs ?? 15_000;
|
|
102
|
+
this.longPollTimeoutMs = options.longPollTimeoutMs ?? DEFAULT_LONG_POLL_TIMEOUT_MS;
|
|
103
|
+
this.botAgent = options.botAgent ?? 'DeepSeekHarness/' + pkg.version;
|
|
104
|
+
this.rand = options.rand ?? Math.random;
|
|
105
|
+
this.now = options.now ?? Date.now;
|
|
106
|
+
this.routeTag = options.routeTag;
|
|
107
|
+
this.transport = options.transport ?? new FetchTransport({ timeoutMs: this.timeoutMs });
|
|
108
|
+
}
|
|
109
|
+
/** Current effective API base URL (mutable after QR redirect). */
|
|
110
|
+
get baseUrl() {
|
|
111
|
+
return this._baseUrl;
|
|
112
|
+
}
|
|
113
|
+
/** Update the effective base URL (QR redirect / confirmed baseurl). */
|
|
114
|
+
setBaseUrl(baseUrl) {
|
|
115
|
+
const candidate = parseIlinkBaseUrl(baseUrl);
|
|
116
|
+
const candidateHost = candidate.hostname.toLowerCase();
|
|
117
|
+
const candidateAuthority = candidate.host.toLowerCase();
|
|
118
|
+
if (candidateAuthority !== this.configuredBaseAuthority && !isOfficialIlinkHost(candidateHost)) {
|
|
119
|
+
throw new TypeError('untrusted iLink base URL host');
|
|
120
|
+
}
|
|
121
|
+
this._baseUrl = serializeBaseUrl(candidate);
|
|
122
|
+
}
|
|
123
|
+
/** Update the bot token (post-QR-confirm). */
|
|
124
|
+
setToken(token) {
|
|
125
|
+
this._token = token?.trim() ? token : undefined;
|
|
126
|
+
}
|
|
127
|
+
get token() {
|
|
128
|
+
return this._token;
|
|
129
|
+
}
|
|
130
|
+
/** CDN base URL (no trailing slash). */
|
|
131
|
+
get cdnUrl() {
|
|
132
|
+
return this.cdnBaseUrl;
|
|
133
|
+
}
|
|
134
|
+
headers() {
|
|
135
|
+
return buildHeaders({ token: this._token, routeTag: this.routeTag, rand: this.rand });
|
|
136
|
+
}
|
|
137
|
+
baseInfo() {
|
|
138
|
+
return buildBaseInfo({ botAgent: this.botAgent });
|
|
139
|
+
}
|
|
140
|
+
async post(endpoint, body, signal, timeoutMs) {
|
|
141
|
+
const url = ensureSlash(this._baseUrl) + endpoint;
|
|
142
|
+
try {
|
|
143
|
+
const init = { method: 'POST', headers: this.headers(), body };
|
|
144
|
+
if (timeoutMs !== undefined)
|
|
145
|
+
init.timeoutMs = timeoutMs;
|
|
146
|
+
return await this.transport.request(url, init, signal);
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
throw normalizeILinkError(error, { operation: endpoint, accountId: this.accountId });
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
async get(endpoint, signal, timeoutMs) {
|
|
153
|
+
const url = ensureSlash(this._baseUrl) + endpoint;
|
|
154
|
+
const init = { method: 'GET', headers: this.headers() };
|
|
155
|
+
if (timeoutMs !== undefined)
|
|
156
|
+
init.timeoutMs = timeoutMs;
|
|
157
|
+
try {
|
|
158
|
+
return await this.transport.request(url, init, signal);
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
throw normalizeILinkError(error, { operation: endpoint, accountId: this.accountId });
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
parseResponse(schema, raw, operation) {
|
|
165
|
+
// Decode the common error envelope first. Error responses are not required
|
|
166
|
+
// to carry endpoint-specific success fields such as QR content.
|
|
167
|
+
const envelope = responseEnvelopeSchema.safeParse(raw);
|
|
168
|
+
if (envelope.success &&
|
|
169
|
+
((envelope.data.ret !== undefined && envelope.data.ret !== 0) ||
|
|
170
|
+
(envelope.data.errcode !== undefined && envelope.data.errcode !== 0))) {
|
|
171
|
+
throw normalizeILinkError(new Error(envelope.data.errmsg ?? 'iLink protocol error'), {
|
|
172
|
+
operation,
|
|
173
|
+
accountId: this.accountId,
|
|
174
|
+
ret: envelope.data.ret,
|
|
175
|
+
errcode: envelope.data.errcode,
|
|
176
|
+
errmsg: envelope.data.errmsg,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
const parsed = schema.safeParse(raw);
|
|
180
|
+
if (!parsed.success) {
|
|
181
|
+
throw normalizeILinkError(new Error('invalid iLink response shape'), {
|
|
182
|
+
operation,
|
|
183
|
+
accountId: this.accountId,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
const response = parsed.data;
|
|
187
|
+
return response;
|
|
188
|
+
}
|
|
189
|
+
/** POST /ilink/bot/get_bot_qrcode?bot_type=3 with { local_token_list: [] }. */
|
|
190
|
+
async getBotQrcode(options = {}) {
|
|
191
|
+
const endpoint = `${ENDPOINT_GET_BOT_QRCODE}?bot_type=${encodeURIComponent(DEFAULT_BOT_TYPE)}`;
|
|
192
|
+
const raw = await this.post(endpoint, {
|
|
193
|
+
local_token_list: normalizeLocalTokens(options.localTokens),
|
|
194
|
+
}, options.signal);
|
|
195
|
+
return this.parseResponse(qrCodeResponseSchema, raw, ENDPOINT_GET_BOT_QRCODE);
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* GET /ilink/bot/get_qrcode_status?qrcode=... (optionally &verify_code=...).
|
|
199
|
+
*
|
|
200
|
+
* This is a long-poll endpoint: the server holds the request open while the
|
|
201
|
+
* status is `wait` (before the user scans). A client-side long-poll timeout
|
|
202
|
+
* is therefore normal control flow — same semantics as `getUpdates` — and is
|
|
203
|
+
* mapped back to `{ status: 'wait' }` so `WeixinQrAuth` never has to reason
|
|
204
|
+
* about HTTP timeouts: timeout → wait → pending → next poll.
|
|
205
|
+
*/
|
|
206
|
+
async getQrcodeStatus(qrcode, opts = {}) {
|
|
207
|
+
let endpoint = `${ENDPOINT_GET_QRCODE_STATUS}?qrcode=${encodeURIComponent(qrcode)}`;
|
|
208
|
+
if (opts.verifyCode) {
|
|
209
|
+
endpoint += `&verify_code=${encodeURIComponent(opts.verifyCode)}`;
|
|
210
|
+
}
|
|
211
|
+
try {
|
|
212
|
+
const raw = await this.get(endpoint, opts.signal, DEFAULT_QR_POLL_TIMEOUT_MS);
|
|
213
|
+
return this.parseResponse(qrStatusResponseSchema, raw, ENDPOINT_GET_QRCODE_STATUS);
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
if (isClientAbortOrTimeout(error)) {
|
|
217
|
+
return { status: 'wait' };
|
|
218
|
+
}
|
|
219
|
+
throw error;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* POST /ilink/bot/getupdates.
|
|
224
|
+
* A long-poll client-side timeout is normal control flow: returns an empty
|
|
225
|
+
* result with `timedOut: true` so the monitor can simply retry.
|
|
226
|
+
*/
|
|
227
|
+
async getUpdates(params = {}) {
|
|
228
|
+
const timeout = params.longPollTimeoutMs ?? this.longPollTimeoutMs;
|
|
229
|
+
try {
|
|
230
|
+
const raw = await this.post(ENDPOINT_GET_UPDATES, { get_updates_buf: params.getUpdatesBuf ?? '', base_info: this.baseInfo() }, params.signal, timeout);
|
|
231
|
+
const resp = this.parseResponse(getUpdatesResponseSchema, raw, ENDPOINT_GET_UPDATES);
|
|
232
|
+
return {
|
|
233
|
+
msgs: resp.msgs ?? [],
|
|
234
|
+
get_updates_buf: resp.get_updates_buf,
|
|
235
|
+
nextLongPollTimeoutMs: resp.longpolling_timeout_ms,
|
|
236
|
+
timedOut: false,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
if (isLongPollClientTimeout(error)) {
|
|
241
|
+
return { msgs: [], get_updates_buf: params.getUpdatesBuf, timedOut: true };
|
|
242
|
+
}
|
|
243
|
+
throw error;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/** POST /ilink/bot/sendmessage. */
|
|
247
|
+
async sendMessage(req, signal) {
|
|
248
|
+
const body = { ...req, base_info: req.base_info ?? this.baseInfo() };
|
|
249
|
+
const raw = await this.post(ENDPOINT_SEND_MESSAGE, body, signal);
|
|
250
|
+
return this.parseResponse(sendMessageResponseSchema, raw, ENDPOINT_SEND_MESSAGE);
|
|
251
|
+
}
|
|
252
|
+
/** POST /ilink/bot/getuploadurl (WX5 media upload slot). */
|
|
253
|
+
async getUploadUrl(req, signal) {
|
|
254
|
+
const body = { ...req, base_info: req.base_info ?? this.baseInfo() };
|
|
255
|
+
const raw = await this.post(ENDPOINT_GET_UPLOAD_URL, body, signal);
|
|
256
|
+
return this.parseResponse(getUploadUrlResponseSchema, raw, ENDPOINT_GET_UPLOAD_URL);
|
|
257
|
+
}
|
|
258
|
+
/** POST /ilink/bot/getconfig. */
|
|
259
|
+
async getConfig(req, signal) {
|
|
260
|
+
const body = { ...req, base_info: req.base_info ?? this.baseInfo() };
|
|
261
|
+
const raw = await this.post(ENDPOINT_GET_CONFIG, body, signal);
|
|
262
|
+
return this.parseResponse(getConfigResponseSchema, raw, ENDPOINT_GET_CONFIG);
|
|
263
|
+
}
|
|
264
|
+
/** POST /ilink/bot/sendtyping. */
|
|
265
|
+
async sendTyping(req, signal) {
|
|
266
|
+
const body = { ...req, base_info: req.base_info ?? this.baseInfo() };
|
|
267
|
+
const raw = await this.post(ENDPOINT_SEND_TYPING, body, signal);
|
|
268
|
+
return this.parseResponse(sendTypingResponseSchema, raw, ENDPOINT_SEND_TYPING);
|
|
269
|
+
}
|
|
270
|
+
/** POST /ilink/bot/msg/notifystart (best effort). */
|
|
271
|
+
async notifyStart(signal) {
|
|
272
|
+
const raw = await this.post(ENDPOINT_NOTIFY_START, { base_info: this.baseInfo() }, signal);
|
|
273
|
+
return this.parseResponse(notifyResponseSchema, raw, ENDPOINT_NOTIFY_START);
|
|
274
|
+
}
|
|
275
|
+
/** POST /ilink/bot/msg/notifystop (best effort). */
|
|
276
|
+
async notifyStop(signal) {
|
|
277
|
+
const raw = await this.post(ENDPOINT_NOTIFY_STOP, { base_info: this.baseInfo() }, signal);
|
|
278
|
+
return this.parseResponse(notifyResponseSchema, raw, ENDPOINT_NOTIFY_STOP);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
/** A long-poll getUpdates client-side timeout (AbortError from the timeout) is treated as empty. */
|
|
282
|
+
function isLongPollClientTimeout(error) {
|
|
283
|
+
return isClientAbortOrTimeout(error);
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Client-side abort/timeout (walking the `.cause` chain) — the transport and
|
|
287
|
+
* `normalizeILinkError` wrap the raw `AbortError`, so we must follow `cause`
|
|
288
|
+
* to classify a long-poll timeout as normal control flow rather than an error.
|
|
289
|
+
*/
|
|
290
|
+
function isClientAbortOrTimeout(error) {
|
|
291
|
+
let cur = error;
|
|
292
|
+
// Guard against cycles.
|
|
293
|
+
const seen = new Set();
|
|
294
|
+
while (cur && !seen.has(cur)) {
|
|
295
|
+
seen.add(cur);
|
|
296
|
+
const name = cur?.name;
|
|
297
|
+
if (name === 'AbortError' || name === 'ILinkAbortError' || name === 'ILinkTimeoutError' || name === 'TimeoutError') {
|
|
298
|
+
return true;
|
|
299
|
+
}
|
|
300
|
+
const msg = typeof cur?.message === 'string' ? cur.message : '';
|
|
301
|
+
if (msg.includes('http request aborted') || msg.includes('timed out')) {
|
|
302
|
+
return true;
|
|
303
|
+
}
|
|
304
|
+
cur = cur?.cause;
|
|
305
|
+
}
|
|
306
|
+
return false;
|
|
307
|
+
}
|
|
308
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/ilink/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Classification: C — duplicate protocol constants [@deprecated upstream-gap].
|
|
3
|
+
*
|
|
4
|
+
* iLink endpoint table + header names + wire values self-maintained. The
|
|
5
|
+
* official package's constants live in api/types.js (endpoint paths are NOT
|
|
6
|
+
* exported there — they are hard-coded inside api/api.js, which is OpenClaw
|
|
7
|
+
* coupled). The endpoint PATH strings here are protocol knowledge that the
|
|
8
|
+
* official coupled module owns; kept behind the facade as an upstream-gap
|
|
9
|
+
* until Tencent exposes public host-neutral API endpoints. Marked upstream-gap.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Tencent Weixin iLink protocol constants.
|
|
13
|
+
*
|
|
14
|
+
* Endpoint paths, header names and fixed wire values for the direct iLink
|
|
15
|
+
* client. Clean-room implementation ported from the Tencent/openclaw-weixin
|
|
16
|
+
* protocol description (see THIRD_PARTY_NOTICES for provenance).
|
|
17
|
+
*/
|
|
18
|
+
/** Default API base URL for all iLink CGI requests. */
|
|
19
|
+
export declare const DEFAULT_BASE_URL = "https://ilinkai.weixin.qq.com";
|
|
20
|
+
/** Default CDN base URL for media download/upload. */
|
|
21
|
+
export declare const DEFAULT_CDN_BASE_URL = "https://novac2c.cdn.weixin.qq.com/c2c";
|
|
22
|
+
/** Default bot type used for QR login (`get_bot_qrcode?bot_type=3`). */
|
|
23
|
+
export declare const DEFAULT_BOT_TYPE = "3";
|
|
24
|
+
/** iLink-App-Id constant fixed by the protocol for bot clients. */
|
|
25
|
+
export declare const ILINK_APP_ID = "bot";
|
|
26
|
+
/** Authorization scheme for the `Authorization` header. */
|
|
27
|
+
export declare const AUTHORIZATION_TYPE = "ilink_bot_token";
|
|
28
|
+
/** Header names used by the iLink protocol. */
|
|
29
|
+
export declare const HEADER_CONTENT_TYPE = "Content-Type";
|
|
30
|
+
export declare const HEADER_AUTHORIZATION_TYPE = "AuthorizationType";
|
|
31
|
+
export declare const HEADER_AUTHORIZATION = "Authorization";
|
|
32
|
+
export declare const HEADER_X_WECHAT_UIN = "X-WECHAT-UIN";
|
|
33
|
+
export declare const HEADER_ILINK_APP_ID = "iLink-App-Id";
|
|
34
|
+
export declare const HEADER_ILINK_APP_CLIENT_VERSION = "iLink-App-ClientVersion";
|
|
35
|
+
export declare const HEADER_SK_ROUTE_TAG = "SKRouteTag";
|
|
36
|
+
/** API endpoint paths (relative to the base URL). */
|
|
37
|
+
export declare const ENDPOINT_GET_BOT_QRCODE = "ilink/bot/get_bot_qrcode";
|
|
38
|
+
export declare const ENDPOINT_GET_QRCODE_STATUS = "ilink/bot/get_qrcode_status";
|
|
39
|
+
export declare const ENDPOINT_GET_UPDATES = "ilink/bot/getupdates";
|
|
40
|
+
export declare const ENDPOINT_SEND_MESSAGE = "ilink/bot/sendmessage";
|
|
41
|
+
export declare const ENDPOINT_GET_CONFIG = "ilink/bot/getconfig";
|
|
42
|
+
export declare const ENDPOINT_SEND_TYPING = "ilink/bot/sendtyping";
|
|
43
|
+
export declare const ENDPOINT_NOTIFY_START = "ilink/bot/msg/notifystart";
|
|
44
|
+
export declare const ENDPOINT_NOTIFY_STOP = "ilink/bot/msg/notifystop";
|
|
45
|
+
export declare const ENDPOINT_GET_UPLOAD_URL = "ilink/bot/getuploadurl";
|
|
46
|
+
/** Default long-poll timeout for `getUpdates` (server holds the request). */
|
|
47
|
+
export declare const DEFAULT_LONG_POLL_TIMEOUT_MS = 35000;
|
|
48
|
+
/** Default long-poll timeout for `get_qrcode_status` (server holds the request). */
|
|
49
|
+
export declare const DEFAULT_QR_POLL_TIMEOUT_MS = 35000;
|
|
50
|
+
/** Default timeout for regular API requests (`sendMessage`, QR calls). */
|
|
51
|
+
export declare const DEFAULT_API_TIMEOUT_MS = 15000;
|
|
52
|
+
/** Default timeout for lightweight API requests (`getConfig`, `sendTyping`). */
|
|
53
|
+
export declare const DEFAULT_CONFIG_TIMEOUT_MS = 10000;
|
|
54
|
+
/**
|
|
55
|
+
* Exit code `-14` reported by the server when the bot token is stale /
|
|
56
|
+
* expired. Detected and surfaced as a typed `StaleTokenError`.
|
|
57
|
+
*/
|
|
58
|
+
export declare const STALE_TOKEN_ERRCODE = -14;
|
|
59
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/ilink/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH;;;;;;GAMG;AAEH,uDAAuD;AACvD,eAAO,MAAM,gBAAgB,kCAAkC,CAAC;AAEhE,sDAAsD;AACtD,eAAO,MAAM,oBAAoB,0CAA0C,CAAC;AAE5E,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC,mEAAmE;AACnE,eAAO,MAAM,YAAY,QAAQ,CAAC;AAElC,2DAA2D;AAC3D,eAAO,MAAM,kBAAkB,oBAAoB,CAAC;AAEpD,+CAA+C;AAC/C,eAAO,MAAM,mBAAmB,iBAAiB,CAAC;AAClD,eAAO,MAAM,yBAAyB,sBAAsB,CAAC;AAC7D,eAAO,MAAM,oBAAoB,kBAAkB,CAAC;AACpD,eAAO,MAAM,mBAAmB,iBAAiB,CAAC;AAClD,eAAO,MAAM,mBAAmB,iBAAiB,CAAC;AAClD,eAAO,MAAM,+BAA+B,4BAA4B,CAAC;AACzE,eAAO,MAAM,mBAAmB,eAAe,CAAC;AAEhD,qDAAqD;AACrD,eAAO,MAAM,uBAAuB,6BAA6B,CAAC;AAClE,eAAO,MAAM,0BAA0B,gCAAgC,CAAC;AACxE,eAAO,MAAM,oBAAoB,yBAAyB,CAAC;AAC3D,eAAO,MAAM,qBAAqB,0BAA0B,CAAC;AAC7D,eAAO,MAAM,mBAAmB,wBAAwB,CAAC;AACzD,eAAO,MAAM,oBAAoB,yBAAyB,CAAC;AAC3D,eAAO,MAAM,qBAAqB,8BAA8B,CAAC;AACjE,eAAO,MAAM,oBAAoB,6BAA6B,CAAC;AAC/D,eAAO,MAAM,uBAAuB,2BAA2B,CAAC;AAEhE,6EAA6E;AAC7E,eAAO,MAAM,4BAA4B,QAAS,CAAC;AAEnD,oFAAoF;AACpF,eAAO,MAAM,0BAA0B,QAAS,CAAC;AAEjD,0EAA0E;AAC1E,eAAO,MAAM,sBAAsB,QAAS,CAAC;AAE7C,gFAAgF;AAChF,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAEhD;;;GAGG;AACH,eAAO,MAAM,mBAAmB,MAAM,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Classification: C — duplicate protocol constants [@deprecated upstream-gap].
|
|
3
|
+
*
|
|
4
|
+
* iLink endpoint table + header names + wire values self-maintained. The
|
|
5
|
+
* official package's constants live in api/types.js (endpoint paths are NOT
|
|
6
|
+
* exported there — they are hard-coded inside api/api.js, which is OpenClaw
|
|
7
|
+
* coupled). The endpoint PATH strings here are protocol knowledge that the
|
|
8
|
+
* official coupled module owns; kept behind the facade as an upstream-gap
|
|
9
|
+
* until Tencent exposes public host-neutral API endpoints. Marked upstream-gap.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Tencent Weixin iLink protocol constants.
|
|
13
|
+
*
|
|
14
|
+
* Endpoint paths, header names and fixed wire values for the direct iLink
|
|
15
|
+
* client. Clean-room implementation ported from the Tencent/openclaw-weixin
|
|
16
|
+
* protocol description (see THIRD_PARTY_NOTICES for provenance).
|
|
17
|
+
*/
|
|
18
|
+
/** Default API base URL for all iLink CGI requests. */
|
|
19
|
+
export const DEFAULT_BASE_URL = 'https://ilinkai.weixin.qq.com';
|
|
20
|
+
/** Default CDN base URL for media download/upload. */
|
|
21
|
+
export const DEFAULT_CDN_BASE_URL = 'https://novac2c.cdn.weixin.qq.com/c2c';
|
|
22
|
+
/** Default bot type used for QR login (`get_bot_qrcode?bot_type=3`). */
|
|
23
|
+
export const DEFAULT_BOT_TYPE = '3';
|
|
24
|
+
/** iLink-App-Id constant fixed by the protocol for bot clients. */
|
|
25
|
+
export const ILINK_APP_ID = 'bot';
|
|
26
|
+
/** Authorization scheme for the `Authorization` header. */
|
|
27
|
+
export const AUTHORIZATION_TYPE = 'ilink_bot_token';
|
|
28
|
+
/** Header names used by the iLink protocol. */
|
|
29
|
+
export const HEADER_CONTENT_TYPE = 'Content-Type';
|
|
30
|
+
export const HEADER_AUTHORIZATION_TYPE = 'AuthorizationType';
|
|
31
|
+
export const HEADER_AUTHORIZATION = 'Authorization';
|
|
32
|
+
export const HEADER_X_WECHAT_UIN = 'X-WECHAT-UIN';
|
|
33
|
+
export const HEADER_ILINK_APP_ID = 'iLink-App-Id';
|
|
34
|
+
export const HEADER_ILINK_APP_CLIENT_VERSION = 'iLink-App-ClientVersion';
|
|
35
|
+
export const HEADER_SK_ROUTE_TAG = 'SKRouteTag';
|
|
36
|
+
/** API endpoint paths (relative to the base URL). */
|
|
37
|
+
export const ENDPOINT_GET_BOT_QRCODE = 'ilink/bot/get_bot_qrcode';
|
|
38
|
+
export const ENDPOINT_GET_QRCODE_STATUS = 'ilink/bot/get_qrcode_status';
|
|
39
|
+
export const ENDPOINT_GET_UPDATES = 'ilink/bot/getupdates';
|
|
40
|
+
export const ENDPOINT_SEND_MESSAGE = 'ilink/bot/sendmessage';
|
|
41
|
+
export const ENDPOINT_GET_CONFIG = 'ilink/bot/getconfig';
|
|
42
|
+
export const ENDPOINT_SEND_TYPING = 'ilink/bot/sendtyping';
|
|
43
|
+
export const ENDPOINT_NOTIFY_START = 'ilink/bot/msg/notifystart';
|
|
44
|
+
export const ENDPOINT_NOTIFY_STOP = 'ilink/bot/msg/notifystop';
|
|
45
|
+
export const ENDPOINT_GET_UPLOAD_URL = 'ilink/bot/getuploadurl';
|
|
46
|
+
/** Default long-poll timeout for `getUpdates` (server holds the request). */
|
|
47
|
+
export const DEFAULT_LONG_POLL_TIMEOUT_MS = 35_000;
|
|
48
|
+
/** Default long-poll timeout for `get_qrcode_status` (server holds the request). */
|
|
49
|
+
export const DEFAULT_QR_POLL_TIMEOUT_MS = 35_000;
|
|
50
|
+
/** Default timeout for regular API requests (`sendMessage`, QR calls). */
|
|
51
|
+
export const DEFAULT_API_TIMEOUT_MS = 15_000;
|
|
52
|
+
/** Default timeout for lightweight API requests (`getConfig`, `sendTyping`). */
|
|
53
|
+
export const DEFAULT_CONFIG_TIMEOUT_MS = 10_000;
|
|
54
|
+
/**
|
|
55
|
+
* Exit code `-14` reported by the server when the bot token is stale /
|
|
56
|
+
* expired. Detected and surfaced as a typed `StaleTokenError`.
|
|
57
|
+
*/
|
|
58
|
+
export const STALE_TOKEN_ERRCODE = -14;
|
|
59
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/ilink/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH;;;;;;GAMG;AAEH,uDAAuD;AACvD,MAAM,CAAC,MAAM,gBAAgB,GAAG,+BAA+B,CAAC;AAEhE,sDAAsD;AACtD,MAAM,CAAC,MAAM,oBAAoB,GAAG,uCAAuC,CAAC;AAE5E,wEAAwE;AACxE,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAEpC,mEAAmE;AACnE,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,CAAC;AAElC,2DAA2D;AAC3D,MAAM,CAAC,MAAM,kBAAkB,GAAG,iBAAiB,CAAC;AAEpD,+CAA+C;AAC/C,MAAM,CAAC,MAAM,mBAAmB,GAAG,cAAc,CAAC;AAClD,MAAM,CAAC,MAAM,yBAAyB,GAAG,mBAAmB,CAAC;AAC7D,MAAM,CAAC,MAAM,oBAAoB,GAAG,eAAe,CAAC;AACpD,MAAM,CAAC,MAAM,mBAAmB,GAAG,cAAc,CAAC;AAClD,MAAM,CAAC,MAAM,mBAAmB,GAAG,cAAc,CAAC;AAClD,MAAM,CAAC,MAAM,+BAA+B,GAAG,yBAAyB,CAAC;AACzE,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAY,CAAC;AAEhD,qDAAqD;AACrD,MAAM,CAAC,MAAM,uBAAuB,GAAG,0BAA0B,CAAC;AAClE,MAAM,CAAC,MAAM,0BAA0B,GAAG,6BAA6B,CAAC;AACxE,MAAM,CAAC,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;AAC3D,MAAM,CAAC,MAAM,qBAAqB,GAAG,uBAAuB,CAAC;AAC7D,MAAM,CAAC,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AACzD,MAAM,CAAC,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;AAC3D,MAAM,CAAC,MAAM,qBAAqB,GAAG,2BAA2B,CAAC;AACjE,MAAM,CAAC,MAAM,oBAAoB,GAAG,0BAA0B,CAAC;AAC/D,MAAM,CAAC,MAAM,uBAAuB,GAAG,wBAAwB,CAAC;AAEhE,6EAA6E;AAC7E,MAAM,CAAC,MAAM,4BAA4B,GAAG,MAAM,CAAC;AAEnD,oFAAoF;AACpF,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC;AAEjD,0EAA0E;AAC1E,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAE7C,gFAAgF;AAChF,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAEhD;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,EAAE,CAAC"}
|