/**
 * 第三方工具封装库。
 *
 * @packageDocumentation
 */

/// <reference types="node" />

import { BinaryLike } from 'crypto';
import { CookieJar } from 'tough-cookie';
import { J2xOptionsOptional } from 'fast-xml-parser';
import Redis from 'ioredis';
import { X2jOptionsOptional } from 'fast-xml-parser';

/**
 * 创建 XML 文本。
 *
 * @param data 数据
 * @param options 选项
 */
export declare function createXml(data: any, options?: J2xOptionsOptional): string;

export declare namespace createXml {
    var array: <T = any>(value: T[]) => any;
    var attr: <T = any>(value: T) => any;
    var text: <T = any>(value: T) => any;
    var cdata: <T = any>(value: T) => any;
}

/**
 * 生成 CUID。
 *
 * @see https://www.npmjs.com/package/cuid
 */
export declare function cuid(): string;

/**
 * 生成 Cuid2。
 *
 * @param length 长度，默认: 24
 * @see https://github.com/paralleldrive/cuid2
 */
export declare function cuid2(length?: number): string;

/**
 * 生成一个 [nanoid](https://github.com/ai/nanoid/)。
 *
 * @param size 生成的 ID 长度，默认 21
 * @example
 * ```typescript
 * nanoid() // => "Uakgb_J5m9g-0JDMbcJqL"
 * ```
 */
export declare function nanoid(size?: number): string;

/**
 * 解析 XML 文本。
 *
 * @param text XML 文本
 * @param options 选项
 */
export declare function parseXml<T>(text: string, options?: X2jOptionsOptional): T;

/**
 * 使用 Redis 作为 Cookie Jar。
 */
export declare class RedisCookieJar extends CookieJar {
    private static prefix;
    constructor(options: RedisCookieJarOptions);
}

export declare interface RedisCookieJarOptions extends CookieJar.Options {
    /**
     * 唯一的键名。
     */
    key: string;
    /**
     * Redis 实例或选项，内部使用 `ioredis`。
     */
    redis: Redis.Redis | Redis.RedisOptions;
}

/**
 * 获取给定值的 sha1 哈希。
 *
 * @param value 给定值
 */
export declare function sha1(value: BinaryLike): string;

/**
 * 生成 RFC4122 V4 版本的 UUID。
 *
 * @see https://www.npmjs.com/package/uuid
 */
export declare function uuid(): string;

/**
 * 微信公众号消息加解密。
 */
export declare class WechatMessageCrypto {
    private options;
    private aesKey;
    private iv;
    constructor(options: WechatMessageCryptoOptions);
    /**
     * 加密原始消息。
     *
     * @param msg 原始消息
     */
    encryptMsg(msg: string): string;
    /**
     * 签名。
     *
     * @param options 选项
     */
    sign(options: WechatMessageCryptoSignOptions): string;
    /**
     * 签名加密后的消息。
     *
     * @param encryptedMsg 加密后的消息
     */
    signEncryptedMsg(encryptedMsg: string): WechatMessageCryptoSignEncryptedMsgResult;
    /**
     * 签名加密后的消息并返回封装好的 XML。
     *
     * @param encryptedMsg 加密后的消息
     */
    signEncryptedMsgAsXml(encryptedMsg: string): string;
    /**
     * 检查签名是否正确。
     *
     * @param signature 要验证的签名
     * @param payload 载荷
     */
    checkSignature(signature: string, payload: WechatMessageCryptoSignOptions): boolean;
    /**
     * 解密加密后的消息。
     *
     * @param encryptedMsg 加密后的消息
     */
    decryptEncryptedMsg(encryptedMsg: string): string;
    /**
     * 解密加密后的消息并作为 XML 解码返回。
     *
     * @param encryptedMsg 加密后的消息
     */
    decryptEncryptedMsgAsXml<T>(encryptedMsg: string): T;
    private PKCS7Decode;
    private PKCS7Encode;
}

export declare interface WechatMessageCryptoOptions {
    /** 公众号/第三方平台的 APPID */
    appId: string;
    /** 消息校验口令 */
    token: string;
    /** 消息加解密密钥 */
    encodingAESKey: string;
}

export declare interface WechatMessageCryptoSignEncryptedMsgResult {
    /** Unix 时间戳 */
    timestamp: number;
    /** 随机字符串 */
    nonceStr: string;
    /** 签名 */
    signature: string;
}

export declare interface WechatMessageCryptoSignOptions {
    /** Unix 时间戳 */
    timestamp: number;
    /** 随机字符串 */
    nonceStr: string;
    /** 加密后的消息 */
    encryptedMsg: string;
}

export { }
