{
  "version": 3,
  "sources": ["../src/index.ts", "../src/common.ts", "../src/util.ts", "../src/aliyun.ts", "../src/txyun.ts", "../src/ksyun.ts", "../src/minio.ts"],
  "sourcesContent": ["export * from './common';\nexport * from './aliyun';\nexport * from './txyun';\nexport * from './ksyun';\nexport * from './minio';\n", "import type { IncomingMessage, ClientRequest, OutgoingHttpHeaders } from 'http';\nimport { request, Agent } from 'http';\nimport { createHash } from 'crypto';\nimport type { Readable } from 'stream';\nimport pump from 'pump';\nimport { Parser as XMLParser } from 'xml2js';\nimport getRawBody from 'raw-body';\nexport { Readable, Writable } from 'stream';\nimport { waitForDrain } from './util';\n\n/** @internal */\nexport const EMPTY_OPTS = {};\n/** @internal */\nexport type HashType = 'md5' | 'sha1' | 'sha128' | 'sha256';\nexport const ABORTED_ERR = new Error('aborted');\nexport const TOO_LARGE_ERR = new Error('too_large');\n\nexport type WriteObjectOptions = {\n  /** 最大允许的文件大小，以 byte 计数。不指定参数或参数 <= 0 则不限制大小。 */\n  limit?: number;\n  /** 是否计算上传文件的哈希，如果指定为 true，则计算 sha256。也可以指定哈希算法。  */\n  calcHash?: HashType;\n  /** 设置 content-type */\n  contentType?: string;\n  /** 设置 content-encoding */\n  contentEncoding?: 'deflate' | 'gzip';\n  /** 额外的 headers */\n  headers?: Record<string, string>;\n};\n/**\n * @internal\n */\nexport type FetchOptions = {\n  method: string;\n  host: string;\n  path: string;\n  returnStream: boolean;\n  // headers?:\n  //   | ({\n  //       Authorization?: string;\n  //     } & Record<string, string>)\n  //   | null;\n  headers?: OutgoingHttpHeaders;\n  body?: Readable;\n  limit?: number;\n  calcHash?: HashType;\n};\n/**\n * @internal\n */\nexport type FetchResult = {\n  body?: Readable;\n  headers?: Record<string, string>;\n  Error?: {\n    // 腾讯云返回的接口数据字段\n    Code: string;\n  };\n  [prop: string]: unknown;\n};\nexport type ReadObjectResult = {\n  stream?: Readable;\n  headers?: Record<string, string>;\n};\n\nexport interface BaseSDKConfig<Region = string> {\n  timeout?: number;\n  secretKey: string;\n  accessKey: string;\n  bucket: string;\n  region: Region;\n}\nexport abstract class BaseObjectStorageSDK {\n  private _globalAgent: Agent;\n  private _xmlParser: XMLParser;\n  private _timeout: number;\n  constructor(config: BaseSDKConfig) {\n    this._timeout = config.timeout ?? 30000;\n  }\n  protected get _XMLParser() {\n    if (!this._xmlParser)\n      this._xmlParser = new XMLParser({\n        explicitArray: false,\n      });\n    return this._xmlParser;\n  }\n  protected get _GlobalAgent() {\n    if (!this._globalAgent)\n      this._globalAgent = new Agent({\n        keepAlive: true,\n        maxSockets: 1000,\n        maxFreeSockets: 256,\n        timeout: this._timeout,\n      });\n    return this._globalAgent;\n  }\n  protected _pipeReqeuest(\n    body: Readable,\n    req: ClientRequest,\n    limit: number,\n    calcHash: HashType | undefined,\n    callback: (err?: Error | null, hash?: string | null) => void,\n  ): void {\n    if (!limit && !calcHash) {\n      // 如果不限制文件大小，也不需要计算哈希，则直接使用 pump 转发即可。\n      pump(body, req, (err) => {\n        callback(err);\n      });\n      return;\n    }\n    let complete = false;\n    let received = 0;\n    const hash = calcHash ? createHash(calcHash) : null;\n    const TIMEOUT = this._timeout;\n    const ctx = {\n      onAborted(): void {\n        if (complete) return;\n        ctx.done(ABORTED_ERR);\n      },\n      done(err?: Error): void {\n        // mark complete\n        complete = true;\n        if (err) {\n          // console.log('req aborted')\n          req.destroy();\n        }\n        ctx.cleanup();\n        callback(err, hash?.digest('hex'));\n      },\n      cleanup(): void {\n        // console.log('clear pipe req');\n        body.off('aborted', ctx.onAborted);\n        body.off('data', ctx.onData);\n        body.off('end', ctx.onEnd);\n        body.off('error', ctx.onError);\n        body.off('close', ctx.onClose);\n        req.off('aborted', ctx.onAborted);\n        req.off('end', ctx.onEnd);\n        req.off('error', ctx.onError);\n        req.off('close', ctx.onClose);\n        // ctx.onAborted = ctx.onClose = ctx.onEnd = ctx.onData = ctx.onError = ctx.cleanup = ctx.done = null;\n      },\n      onClose(): void {\n        if (complete) return;\n        ctx.done();\n      },\n      onError(err: Error): void {\n        if (complete) return;\n        ctx.done(err);\n      },\n      onEnd(): void {\n        if (complete) return;\n        req.end();\n        ctx.done();\n      },\n      onData(chunk: Buffer): void {\n        if (complete) return;\n        // console.log('onData', chunk.length);\n        received += chunk.length;\n        // console.log(received, limit);\n        if (received > limit) {\n          ctx.done(TOO_LARGE_ERR);\n          return;\n        }\n        hash?.update(chunk);\n\n        // console.log('write!');\n        if (!req.write(chunk)) {\n          // console.log('drain!');\n          body.pause();\n          waitForDrain(req, TIMEOUT).then(\n            () => {\n              // console.log('wr')\n              if (complete) return;\n              // console.log('resume');\n              body.resume();\n            },\n            (err) => {\n              // console.log('wf d', complete, err);\n              if (complete) return;\n              ctx.done(err);\n            },\n          );\n        }\n      },\n    };\n    body.on('aborted', ctx.onAborted);\n    body.on('close', ctx.onClose);\n    body.on('data', ctx.onData);\n    body.on('end', ctx.onEnd);\n    body.on('error', ctx.onError);\n    req.on('aborted', ctx.onAborted);\n    req.on('error', ctx.onError);\n    req.on('close', ctx.onClose);\n    req.on('end', ctx.onEnd);\n  }\n  protected getBody(\n    res: IncomingMessage,\n    contentType: string,\n    callback: (err: Error | null, body?: Record<string, string>) => void,\n  ): void {\n    getRawBody(res, true, (err, body) => {\n      if (err) return callback(err);\n      if (!body) {\n        return callback(null);\n      }\n      const i = contentType.indexOf(';');\n      if (i > 0) {\n        contentType = contentType.slice(0, i);\n      }\n      if (contentType === 'application/xml') {\n        this._XMLParser.parseString(body, (err: Error, result: Record<string, string>) => {\n          if (err) return callback(err);\n          callback(null, result);\n        });\n      } else if (contentType === 'application/json') {\n        try {\n          callback(null, JSON.parse(body));\n        } catch (ex) {\n          callback(ex);\n        }\n      } else {\n        callback(new Error(`unsupported content-type:${contentType}`));\n      }\n    });\n  }\n\n  protected _fetch(\n    options: FetchOptions,\n    callback: (err: Error | null, result?: FetchResult, requestBodyHash?: string) => void,\n  ): void {\n    let done = false;\n    let hash: string | null = null;\n\n    function finish(err: Error | null, result?: FetchResult): void {\n      if (done) return;\n      if (!err && options.calcHash && !hash) {\n        err = new Error('unexpected error: calculated hash is empty');\n        process.nextTick(() => callback(err));\n        return;\n      }\n      // console.log(err);\n      done = true;\n      process.nextTick(() => callback(err, result ?? undefined, hash ?? undefined));\n    }\n    const req = request(\n      {\n        method: options.method,\n        path: options.path,\n        host: options.host,\n        headers: options.headers ?? undefined,\n        agent: this._GlobalAgent,\n        timeout: this._timeout,\n      },\n      (res) => {\n        const contentType = res.headers['content-type'] ?? '';\n        const statusCode = res.statusCode ?? 404;\n        // console.log(res.statusCode, contentType);\n        if (statusCode < 200 || statusCode >= 300) {\n          this.getBody(res, contentType, (err, result) => {\n            // console.log(result);\n            return finish(new Error(res.statusMessage), err ? undefined : result);\n          });\n        } else if (!options.returnStream) {\n          this.getBody(res, contentType, (err, result) => {\n            return finish(err, err ? undefined : result);\n          });\n        } else {\n          const headers: Record<string, string> = {};\n          contentType && (headers['Content-Type'] = contentType);\n          const contentEncoding = res.headers['content-encoding'];\n          contentEncoding && (headers['Content-Encoding'] = contentEncoding);\n          finish(null, {\n            headers,\n            body: res,\n          });\n        }\n      },\n    );\n    function onReqErr(err: Error): void {\n      req.off('error', onReqErr);\n      finish(err);\n    }\n    req.on('error', onReqErr);\n\n    if (options.body) {\n      this._pipeReqeuest(\n        options.body,\n        req,\n        options.limit ?? 0,\n        options.calcHash,\n        function (err: Error, bodyHash: string) {\n          if (done) return;\n          if (err) {\n            finish(err);\n          } else {\n            hash = bodyHash;\n          }\n        },\n      );\n    } else {\n      req.end();\n    }\n  }\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  readObject(filename: string): Promise<ReadObjectResult | null> {\n    throw new Error('abstract method');\n  }\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  deleteObject(filename: string): Promise<void> {\n    throw new Error('abstract method');\n  }\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  writeObject(filename: string, req: Readable, options?: WriteObjectOptions): Promise<void | string> {\n    throw new Error('abstract method');\n  }\n}\n", "import type { Writable } from 'stream';\nimport { formatRFC7231 } from 'date-fns';\n\nexport const TIMEOUT_ERROR = new Error('waitForDrain timeout');\n\n/**\n * 等待流的 drain 事件\n * @param s Writable Stream\n * @param timeout 如果等待超时，则抛出错误。默认 10 秒。\n */\nexport async function waitForDrain(s: Writable, timeout = 10000): Promise<void> {\n  return new Promise((resolve, reject) => {\n    let done = false;\n    const ctx = {\n      tm: setTimeout(function () {\n        if (done) return;\n        ctx.clear();\n        reject(TIMEOUT_ERROR);\n      }, timeout),\n      onDrain: function (): void {\n        if (done) return;\n        ctx.clear();\n        resolve();\n      },\n      onError: function (err: Error): void {\n        if (done) return;\n        ctx.clear();\n        reject(err);\n      },\n      onEnd: function (): void {\n        if (done) return;\n        ctx.clear();\n        resolve();\n      },\n      onClose: function (): void {\n        if (done) return;\n        ctx.clear();\n        reject(new Error('closed'));\n      },\n      clear: function (): void {\n        done = true;\n        s.off('drain', ctx.onDrain);\n        s.off('error', ctx.onError);\n        s.off('close', ctx.onClose);\n        s.off('end', ctx.onEnd);\n        clearTimeout(ctx.tm);\n        // ctx.onDrain = ctx.onEnd = ctx.onError = ctx.onClose = ctx.tm = ctx.clear = null;\n      },\n    };\n    s.on('drain', ctx.onDrain);\n    s.on('error', ctx.onError);\n    s.on('close', ctx.onClose);\n    s.on('end', ctx.onEnd);\n  });\n}\n\nexport function gmt() {\n  return formatRFC7231(new Date());\n}\n", "import crypto from 'crypto';\nimport type { OutgoingHttpHeaders } from 'http';\nimport type {\n  Readable,\n  FetchResult,\n  FetchOptions,\n  ReadObjectResult,\n  WriteObjectOptions,\n  BaseSDKConfig,\n} from './common';\nimport { BaseObjectStorageSDK, EMPTY_OPTS } from './common';\nimport { gmt } from './util';\n\nexport interface AliyunSDKConfig extends BaseSDKConfig {\n  region: string;\n}\n\nexport class AliyunObjectStorageSDK extends BaseObjectStorageSDK {\n  private _config: AliyunSDKConfig;\n  constructor(config: AliyunSDKConfig) {\n    super(config);\n    this._config = config;\n  }\n  private _getAuth(objectKey: string, method: string, headers: OutgoingHttpHeaders | undefined, date: string): string {\n    // https://help.aliyun.com/document_detail/31951.html\n    const contentString =\n      `${method}\\n` +\n      `${headers?.['Content-MD5'] ?? ''}\\n` + // content-md5\n      `${headers?.['Content-Type'] ?? ''}\\n` + // content-type\n      `${date}\\n${\n        // Date\n        calcCanonicalizedOSSHeaders(headers) // CanonicalizedOSSHeaders\n      }/${this._config.bucket}/${objectKey}`; // CanonicalizedResource\n\n    const signature = crypto.createHmac('sha1', this._config.secretKey).update(contentString).digest('base64');\n\n    return `OSS ${this._config.accessKey}:${signature}`;\n  }\n\n  readObject(filename: string): Promise<ReadObjectResult | null> {\n    return new Promise((resolve, reject) => {\n      const dt = gmt();\n      const options: FetchOptions = {\n        method: 'GET',\n        host: `${this._config.bucket}.${this._config.region}.aliyuncs.com`,\n        path: `/${filename}`,\n        returnStream: true,\n        headers: {\n          Date: dt,\n          Authorization: this._getAuth(filename, 'GET', undefined, dt),\n        },\n      };\n      this._fetch(options, (err: Error, result: FetchResult) => {\n        if (!err) {\n          return resolve({\n            headers: result.headers,\n            stream: result.body,\n          });\n        }\n        if (!result?.Error) {\n          return reject(err);\n        }\n        if (result.Error.Code === 'NoSuchKey') {\n          // 文件不存在也当成正常情况返回。业务层直接 req.end()。\n          // 业务层新建面板后，可能从来没有上传过面板数据。\n          return resolve(null);\n        }\n        reject(err);\n      });\n    });\n  }\n  writeObject(filename: string, req: Readable, options: WriteObjectOptions = EMPTY_OPTS): Promise<void | string> {\n    return new Promise((resolve, reject) => {\n      const dt = gmt();\n\n      const headers: OutgoingHttpHeaders = {\n        ...options.headers,\n        Date: dt,\n        Authorization: this._getAuth(filename, 'PUT', options.headers, dt),\n      };\n\n      if (options.contentEncoding) {\n        headers['Content-Encoding'] = options.contentEncoding;\n      }\n      if (options.contentType) {\n        headers['Content-Type'] = options.contentType;\n      }\n      const fetchOptions: FetchOptions = {\n        method: 'PUT',\n        host: `${this._config.bucket}.${this._config.region}.aliyuncs.com`,\n        path: `/${filename}`,\n        returnStream: false,\n        body: req,\n        limit: options.limit,\n        calcHash: options.calcHash,\n        headers,\n      };\n\n      this._fetch(fetchOptions, (err, result, reqBodyHash) => {\n        if (!err) {\n          // logger.debug(result);\n          return resolve(reqBodyHash);\n        }\n        // if (err === ABORTED_ERR || err === TOO_LARGE_ERR) {\n        //   // 不需要打印日志\n        //   // console.log(err);\n        // } else if (!result || !result.Error) {\n        //   logger.serror('ALI-OSS', err);\n        // } else {\n        //   logger.serror('ALI-OSS', JSON.stringify(result.Error));\n        // }\n        reject(result?.Error ?? err);\n      });\n    });\n  }\n\n  deleteObject(filename: string): Promise<void> {\n    return new Promise((resolve, reject) => {\n      const dt = gmt();\n      const options: FetchOptions = {\n        method: 'DELETE',\n        host: `${this._config.bucket}.${this._config.region}.aliyuncs.com`,\n        path: `/${filename}`,\n        returnStream: false,\n        headers: {\n          Date: dt,\n          Authorization: this._getAuth(filename, 'DELETE', undefined, dt),\n        },\n      };\n      this._fetch(options, (err, result) => {\n        if (!err) {\n          // logger.debug(result);\n          return resolve();\n        }\n        // if (!result || !result.Error) {\n        //   logger.serror('TX-OSS', err);\n        // } else {\n        //   logger.serror('TX-OSS', JSON.stringify(result.Error));\n        // }\n        reject(result?.Error ?? err);\n      });\n    });\n  }\n}\n\nfunction calcCanonicalizedOSSHeaders(headers?: OutgoingHttpHeaders): string {\n  if (!headers) return '';\n  const props = [];\n  for (const k in headers) {\n    const lk = k.toLowerCase();\n    if (lk.startsWith('x-kss-')) {\n      props.push(`${lk}:${headers[k]}`);\n    }\n  }\n  // 如果设置CanonicalizedOSSHeaders为空，则无需在最后添加分隔符\\n\n  return props.length ? `${props.sort().join('\\n')}\\n` : '';\n}\n", "import crypto from 'crypto';\nimport type { OutgoingHttpHeaders } from 'http';\nimport type {\n  Readable,\n  FetchResult,\n  FetchOptions,\n  ReadObjectResult,\n  WriteObjectOptions,\n  BaseSDKConfig,\n} from './common';\nimport { BaseObjectStorageSDK, EMPTY_OPTS } from './common';\n\nfunction getObjectKeys(obj: Record<string, unknown>): string[] {\n  const list = Object.keys(obj);\n  return list.sort(function (a, b) {\n    a = a.toLowerCase();\n    b = b.toLowerCase();\n    return a === b ? 0 : a > b ? 1 : -1;\n  });\n}\n\nfunction camSafeUrlEncode(str: string): string {\n  return encodeURIComponent(str)\n    .replace(/!/g, '%21')\n    .replace(/'/g, '%27')\n    .replace(/\\(/g, '%28')\n    .replace(/\\)/g, '%29')\n    .replace(/\\*/g, '%2A');\n}\n\nfunction obj2str(obj: Record<string, unknown>): string {\n  const list = [];\n  const keyList = getObjectKeys(obj);\n  for (let i = 0; i < keyList.length; i++) {\n    let key = keyList[i];\n    let val = obj[key] === undefined || obj[key] === null ? '' : `${obj[key]}`;\n    key = key.toLowerCase();\n    key = camSafeUrlEncode(key);\n    val = camSafeUrlEncode(val) || '';\n    list.push(`${key}=${val}`);\n  }\n  return list.join('&');\n}\n\nexport interface TxyunSDKConfig extends BaseSDKConfig {\n  appId: string;\n}\nexport class TxyunObjectStorageSDK extends BaseObjectStorageSDK {\n  private _config: TxyunSDKConfig;\n  constructor(config: TxyunSDKConfig) {\n    super(config);\n    this._config = config;\n  }\n  private _getAuth(method: string, path: string, headers: OutgoingHttpHeaders | undefined): string {\n    const secretId = this._config.accessKey;\n    const secretKey = this._config.secretKey;\n\n    // 签名有效起止时间\n    const now = ((Date.now() / 1000) | 0) - 1;\n    const keyTime = `${now};${now + 900}`;\n    const headerList = headers ? getObjectKeys(headers).join(';').toLowerCase() : '';\n    const paramList = ''; // getObjectKeys(queryParams).join(';').toLowerCase();\n\n    // 签名算法说明文档：https://www.qcloud.com/document/product/436/7778\n    // 步骤一：计算 SignKey\n    const signKey = crypto.createHmac('sha1', secretKey).update(keyTime).digest('hex');\n\n    // 步骤二：构成 FormatString\n    const formatString = `${method.toLowerCase()}\\n${path}\\n` + `\\n${headers ? obj2str(headers) : ''}\\n`;\n    // formatString = Buffer.from(formatString, 'utf8');\n\n    // 步骤三：计算 StringToSign\n    const res = crypto.createHash('sha1').update(formatString).digest('hex');\n    const stringToSign = `sha1\\n${keyTime}\\n${res}\\n`;\n\n    // 步骤四：计算 Signature\n    const signature = crypto.createHmac('sha1', signKey).update(stringToSign).digest('hex');\n\n    // 步骤五：构造 Authorization\n    return (\n      `q-sign-algorithm=sha1` +\n      `&q-ak=${secretId}&q-sign-time=${keyTime}&q-key-time=${keyTime}&q-header-list=${headerList}&q-url-param-list=${paramList}&q-signature=${signature}`\n    );\n  }\n  readObject(filename: string): Promise<ReadObjectResult | null> {\n    return new Promise((resolve, reject) => {\n      const path = `/${filename}`;\n      const options: FetchOptions = {\n        method: 'GET',\n        host: `${this._config.bucket}-${this._config.appId}.cos.${this._config.region}.myqcloud.com`,\n        path,\n        returnStream: true,\n        headers: {\n          Authorization: this._getAuth('GET', path, undefined),\n        },\n      };\n      this._fetch(options, (err: Error, result: FetchResult) => {\n        if (!err) {\n          return resolve({\n            headers: result.headers,\n            stream: result.body,\n          });\n        }\n        if (!result?.Error) {\n          return reject(err);\n        }\n        if (result.Error.Code === 'NoSuchKey') {\n          // 文件不存在也当成正常情况返回。业务层直接 req.end()。\n          // 业务层新建面板后，可能从来没有上传过面板数据。\n          return resolve(null);\n        }\n        reject(err);\n      });\n    });\n  }\n  writeObject(filename: string, req: Readable, options: WriteObjectOptions = EMPTY_OPTS): Promise<void | string> {\n    return new Promise((resolve, reject) => {\n      const path = `/${filename}`;\n      const headers: OutgoingHttpHeaders = {\n        ...options.headers,\n        Authorization: this._getAuth('PUT', path, options.headers),\n      };\n      if (options.contentEncoding) {\n        headers['Content-Encoding'] = options.contentEncoding;\n      }\n      if (options.contentType) {\n        headers['Content-Type'] = options.contentType;\n      }\n      const fetchOptions: FetchOptions = {\n        method: 'PUT',\n        path,\n        host: `${this._config.bucket}-${this._config.appId}.cos.${this._config.region}.myqcloud.com`,\n        headers,\n        returnStream: false,\n        body: req,\n        limit: options.limit,\n        calcHash: options.calcHash,\n      };\n\n      this._fetch(fetchOptions, (err, result, reqBodyHash) => {\n        if (!err) {\n          // logger.debug(result);\n          return resolve(reqBodyHash);\n        }\n        // if (err === ABORTED_ERR || err === TOO_LARGE_ERR) {\n        //   // 不需要打印日志\n        //   // console.log(err);\n        // } else if (!result || !result.Error) {\n        //   logger.serror('TX-OSS', err);\n        // } else {\n        //   logger.serror('TX-OSS', JSON.stringify(result.Error));\n        // }\n        reject(result?.Error ?? err);\n      });\n    });\n  }\n  deleteObject(filename: string): Promise<void> {\n    return new Promise((resolve, reject) => {\n      const path = `/${filename}`;\n      const options: FetchOptions = {\n        method: 'DELETE',\n        host: `${this._config.bucket}-${this._config.appId}.cos.${this._config.region}.myqcloud.com`,\n        path,\n        headers: {\n          Authorization: this._getAuth('DELETE', path, undefined),\n        },\n        returnStream: false,\n      };\n      this._fetch(options, (err, result) => {\n        if (!err) {\n          // logger.debug(result);\n          return resolve();\n        }\n        // if (!result || !result.Error) {\n        //   logger.serror('TX-OSS', err);\n        // } else {\n        //   logger.serror('TX-OSS', JSON.stringify(result.Error));\n        // }\n        reject(result?.Error ?? err);\n      });\n    });\n  }\n}\n", "import crypto from 'crypto';\nimport type { OutgoingHttpHeaders } from 'http';\nimport type {\n  Readable,\n  FetchResult,\n  FetchOptions,\n  ReadObjectResult,\n  WriteObjectOptions,\n  BaseSDKConfig,\n} from './common';\nimport { BaseObjectStorageSDK, EMPTY_OPTS } from './common';\nimport { gmt } from './util';\n\nconst REGIONS = {\n  GUANGZHOU: 'cn-guangzhou',\n};\nexport type KsyunRegion = keyof typeof REGIONS;\nexport interface KsyunSDKConfig extends BaseSDKConfig {\n  region: KsyunRegion;\n  internal: boolean;\n}\n\nfunction getEndPoint(config: KsyunSDKConfig) {\n  return `${config.bucket}.ks3-${REGIONS[config.region]}${config.internal ? '-internal' : ''}.ksyuncs.com`;\n}\nexport class KsyunObjectStorageSDK extends BaseObjectStorageSDK {\n  private _config: KsyunSDKConfig;\n  constructor(config: KsyunSDKConfig) {\n    super(config);\n    this._config = config;\n  }\n  private _getAuth(objectKey: string, method: string, headers: OutgoingHttpHeaders | undefined, date: string): string {\n    // https://docs.ksyun.com/documents/2321\n    const contentString =\n      `${method}\\n` +\n      `${headers?.['Content-MD5'] ?? ''}\\n` + // content-md5\n      `${headers?.['Content-Type'] ?? ''}\\n` + // content-type\n      `${date}\\n${\n        // Date\n        calcCanonicalizedOSSHeaders(headers) // CanonicalizedOSSHeaders\n      }/${this._config.bucket}/${objectKey}`; // CanonicalizedResource\n\n    const signature = crypto.createHmac('sha1', this._config.secretKey).update(contentString).digest('base64');\n\n    return `KSS ${this._config.accessKey}:${signature}`;\n  }\n\n  readObject(filename: string): Promise<ReadObjectResult | null> {\n    return new Promise((resolve, reject) => {\n      const options: FetchOptions = {\n        method: 'GET',\n        host: getEndPoint(this._config),\n        path: `/${filename}`,\n        returnStream: true,\n      };\n      const dt = gmt();\n      options.headers = {\n        Date: dt,\n        Authorization: this._getAuth(filename, 'GET', undefined, dt),\n      };\n      this._fetch(options, (err: Error, result: FetchResult) => {\n        if (!err) {\n          return resolve({\n            headers: result.headers,\n            stream: result.body,\n          });\n        }\n        if (!result?.Error) {\n          return reject(err);\n        }\n        if (result.Error.Code === 'NoSuchKey') {\n          // 文件不存在当成正常情况，返回 null。\n          return resolve(null);\n        }\n        reject(err);\n      });\n    });\n  }\n  writeObject(filename: string, req: Readable, options: WriteObjectOptions = EMPTY_OPTS): Promise<void | string> {\n    return new Promise((resolve, reject) => {\n      const dt = gmt();\n\n      const headers: OutgoingHttpHeaders = {\n        Date: dt,\n        Authorization: this._getAuth(filename, 'PUT', options.headers, dt),\n      };\n      if (options.contentEncoding) {\n        headers['Content-Encoding'] = options.contentEncoding;\n      }\n      if (options.contentType) {\n        headers['Content-Type'] = options.contentType;\n      }\n      const fetchOptions: FetchOptions = {\n        method: 'PUT',\n        host: getEndPoint(this._config),\n        path: `/${filename}`,\n        returnStream: false,\n        body: req,\n        limit: options.limit,\n        calcHash: options.calcHash,\n        headers,\n      };\n\n      this._fetch(fetchOptions, (err, result, reqBodyHash) => {\n        if (!err) {\n          // logger.debug(result);\n          return resolve(reqBodyHash);\n        }\n        // if (err === ABORTED_ERR || err === TOO_LARGE_ERR) {\n        //   // 不需要打印日志\n        //   // console.log(err);\n        // } else if (!result || !result.Error) {\n        //   logger.serror('ALI-OSS', err);\n        // } else {\n        //   logger.serror('ALI-OSS', JSON.stringify(result.Error));\n        // }\n        reject(result?.Error ?? err);\n      });\n    });\n  }\n\n  deleteObject(filename: string): Promise<void> {\n    return new Promise((resolve, reject) => {\n      const dt = gmt();\n\n      const options: FetchOptions = {\n        method: 'DELETE',\n        host: getEndPoint(this._config),\n        path: `/${filename}`,\n        returnStream: false,\n        headers: {\n          Date: dt,\n          Authorization: this._getAuth(filename, 'DELETE', undefined, dt),\n        },\n      };\n      this._fetch(options, (err, result) => {\n        if (!err) {\n          // logger.debug(result);\n          return resolve();\n        }\n        // if (!result || !result.Error) {\n        //   logger.serror('TX-OSS', err);\n        // } else {\n        //   logger.serror('TX-OSS', JSON.stringify(result.Error));\n        // }\n        reject(result?.Error ?? err);\n      });\n    });\n  }\n}\n\nfunction calcCanonicalizedOSSHeaders(headers?: OutgoingHttpHeaders): string {\n  if (!headers) return '';\n  const props = [];\n  for (const k in headers) {\n    const lk = k.toLowerCase();\n    if (lk.startsWith('x-kss-')) {\n      props.push(`${lk}:${headers[k]}`);\n    }\n  }\n  // 如果设置CanonicalizedOSSHeaders为空，则无需在最后添加分隔符\\n\n  return props.length ? `${props.sort().join('\\n')}\\n` : '';\n}\n", "import crypto from 'crypto';\nimport type { ClientOptions } from 'minio';\nimport { Client } from 'minio';\nimport type { WriteObjectOptions, ReadObjectResult, BaseSDKConfig } from './common';\nimport { Readable, EMPTY_OPTS, BaseObjectStorageSDK, TOO_LARGE_ERR } from './common';\n\nexport type MinioSDKConfig = BaseSDKConfig & Exclude<ClientOptions, 'secretKey' | 'accessKey'>;\n\nexport class MinioObjectStorageSDK extends BaseObjectStorageSDK {\n  private _config: MinioSDKConfig;\n  private _client: Client;\n  constructor(config: MinioSDKConfig) {\n    super(config);\n    this._config = config;\n  }\n\n  async _getClient() {\n    if (!this._client) {\n      this._client = new Client(this._config);\n      if (!(await this._client.bucketExists(this._config.bucket))) {\n        await this._client.makeBucket(this._config.bucket, this._config.region);\n      }\n    }\n    return this._client;\n  }\n  async readObject(filename: string) {\n    const client = await this._getClient();\n    let meta;\n    try {\n      const stat = await client.statObject(this._config.bucket, filename);\n      meta = stat.metaData;\n    } catch (ex) {\n      if (ex.code === 'NotFound') {\n        return null;\n      }\n      // eslint-disable-next-line no-console\n      console.error(ex);\n      throw ex;\n    }\n    const stream = await client.getObject(this._config.bucket, filename);\n    return {\n      headers: meta,\n      stream,\n    } as ReadObjectResult;\n  }\n  async writeObject(filename: string, req: Readable, options: WriteObjectOptions = EMPTY_OPTS) {\n    const client = await this._getClient();\n    const meta = options.headers ?? {};\n    if (options.contentEncoding) {\n      meta['Content-Encoding'] = options.contentEncoding;\n    }\n    if (options.contentType) {\n      meta['Content-Type'] = options.contentType;\n    }\n    if (options.calcHash) {\n      /*\n       * 由于 minio 版本的 oss 只会在本地 dev 阶段使用，\n       * 代码逻辑不需要太严谨地考虑容错逻辑。\n       */\n      const hash = crypto.createHash('sha256');\n      const transform = new Readable({\n        read() {},\n      });\n      let hashstr;\n      req.on('data', (chunk) => {\n        transform.push(chunk);\n        hash.update(chunk);\n      });\n      req.on('end', () => {\n        hashstr = hash.digest('hex');\n        transform.push(null);\n      });\n      req.on('error', (err) => {\n        transform.destroy(err);\n      });\n      await client.putObject(this._config.bucket, filename, transform, meta);\n      return hashstr;\n    } else if (options.limit) {\n      const LIMIT_SIZE = options.limit ?? 0;\n      const transform = new Readable({\n        read() {},\n      });\n      let total = 0;\n      let end = false;\n      req.on('data', (chunk) => {\n        if (end) return;\n        total += chunk.length;\n        if (total > LIMIT_SIZE) {\n          end = true;\n          transform.destroy(TOO_LARGE_ERR);\n          return;\n        }\n        transform.push(chunk);\n      });\n      req.on('end', () => {\n        if (end) return;\n        transform.push(null);\n        end = true;\n      });\n      req.on('error', (err) => {\n        transform.destroy(err);\n      });\n      await client.putObject(this._config.bucket, filename, transform, meta);\n    } else {\n      await client.putObject(this._config.bucket, filename, req, meta);\n    }\n  }\n  async deleteObject(filename: string) {\n    const client = await this._getClient();\n    await client.removeObject(this._config.bucket, filename);\n  }\n}\n"],
  "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACCA,kBAA+B;AAC/B,oBAA2B;AAE3B,kBAAiB;AACjB,oBAAoC;AACpC,sBAAuB;AACvB,oBAAmC;;;ACNnC,sBAA8B;AAEvB,IAAM,gBAAgB,IAAI,MAAM,sBAAsB;AAO7D,eAAsB,aAAa,GAAa,UAAU,KAAsB;AAC9E,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,QAAI,OAAO;AACX,UAAM,MAAM;AAAA,MACV,IAAI,WAAW,WAAY;AACzB,YAAI;AAAM;AACV,YAAI,MAAM;AACV,eAAO,aAAa;AAAA,MACtB,GAAG,OAAO;AAAA,MACV,SAAS,WAAkB;AACzB,YAAI;AAAM;AACV,YAAI,MAAM;AACV,gBAAQ;AAAA,MACV;AAAA,MACA,SAAS,SAAU,KAAkB;AACnC,YAAI;AAAM;AACV,YAAI,MAAM;AACV,eAAO,GAAG;AAAA,MACZ;AAAA,MACA,OAAO,WAAkB;AACvB,YAAI;AAAM;AACV,YAAI,MAAM;AACV,gBAAQ;AAAA,MACV;AAAA,MACA,SAAS,WAAkB;AACzB,YAAI;AAAM;AACV,YAAI,MAAM;AACV,eAAO,IAAI,MAAM,QAAQ,CAAC;AAAA,MAC5B;AAAA,MACA,OAAO,WAAkB;AACvB,eAAO;AACP,UAAE,IAAI,SAAS,IAAI,OAAO;AAC1B,UAAE,IAAI,SAAS,IAAI,OAAO;AAC1B,UAAE,IAAI,SAAS,IAAI,OAAO;AAC1B,UAAE,IAAI,OAAO,IAAI,KAAK;AACtB,qBAAa,IAAI,EAAE;AAAA,MAErB;AAAA,IACF;AACA,MAAE,GAAG,SAAS,IAAI,OAAO;AACzB,MAAE,GAAG,SAAS,IAAI,OAAO;AACzB,MAAE,GAAG,SAAS,IAAI,OAAO;AACzB,MAAE,GAAG,OAAO,IAAI,KAAK;AAAA,EACvB,CAAC;AACH;AAEO,SAAS,MAAM;AACpB,aAAO,+BAAc,oBAAI,KAAK,CAAC;AACjC;;;AD/CO,IAAM,aAAa,CAAC;AAGpB,IAAM,cAAc,IAAI,MAAM,SAAS;AACvC,IAAM,gBAAgB,IAAI,MAAM,WAAW;AAwD3C,IAAe,uBAAf,MAAoC;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACR,YAAY,QAAuB;AACjC,SAAK,WAAW,OAAO,WAAW;AAAA,EACpC;AAAA,EACA,IAAc,aAAa;AACzB,QAAI,CAAC,KAAK;AACR,WAAK,aAAa,IAAI,cAAAA,OAAU;AAAA,QAC9B,eAAe;AAAA,MACjB,CAAC;AACH,WAAO,KAAK;AAAA,EACd;AAAA,EACA,IAAc,eAAe;AAC3B,QAAI,CAAC,KAAK;AACR,WAAK,eAAe,IAAI,kBAAM;AAAA,QAC5B,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,SAAS,KAAK;AAAA,MAChB,CAAC;AACH,WAAO,KAAK;AAAA,EACd;AAAA,EACU,cACR,MACA,KACA,OACA,UACA,UACM;AACN,QAAI,CAAC,SAAS,CAAC,UAAU;AAEvB,sBAAAC,SAAK,MAAM,KAAK,CAAC,QAAQ;AACvB,iBAAS,GAAG;AAAA,MACd,CAAC;AACD;AAAA,IACF;AACA,QAAI,WAAW;AACf,QAAI,WAAW;AACf,UAAM,OAAO,eAAW,0BAAW,QAAQ,IAAI;AAC/C,UAAM,UAAU,KAAK;AACrB,UAAM,MAAM;AAAA,MACV,YAAkB;AAChB,YAAI;AAAU;AACd,YAAI,KAAK,WAAW;AAAA,MACtB;AAAA,MACA,KAAK,KAAmB;AAEtB,mBAAW;AACX,YAAI,KAAK;AAEP,cAAI,QAAQ;AAAA,QACd;AACA,YAAI,QAAQ;AACZ,iBAAS,KAAK,MAAM,OAAO,KAAK,CAAC;AAAA,MACnC;AAAA,MACA,UAAgB;AAEd,aAAK,IAAI,WAAW,IAAI,SAAS;AACjC,aAAK,IAAI,QAAQ,IAAI,MAAM;AAC3B,aAAK,IAAI,OAAO,IAAI,KAAK;AACzB,aAAK,IAAI,SAAS,IAAI,OAAO;AAC7B,aAAK,IAAI,SAAS,IAAI,OAAO;AAC7B,YAAI,IAAI,WAAW,IAAI,SAAS;AAChC,YAAI,IAAI,OAAO,IAAI,KAAK;AACxB,YAAI,IAAI,SAAS,IAAI,OAAO;AAC5B,YAAI,IAAI,SAAS,IAAI,OAAO;AAAA,MAE9B;AAAA,MACA,UAAgB;AACd,YAAI;AAAU;AACd,YAAI,KAAK;AAAA,MACX;AAAA,MACA,QAAQ,KAAkB;AACxB,YAAI;AAAU;AACd,YAAI,KAAK,GAAG;AAAA,MACd;AAAA,MACA,QAAc;AACZ,YAAI;AAAU;AACd,YAAI,IAAI;AACR,YAAI,KAAK;AAAA,MACX;AAAA,MACA,OAAO,OAAqB;AAC1B,YAAI;AAAU;AAEd,oBAAY,MAAM;AAElB,YAAI,WAAW,OAAO;AACpB,cAAI,KAAK,aAAa;AACtB;AAAA,QACF;AACA,cAAM,OAAO,KAAK;AAGlB,YAAI,CAAC,IAAI,MAAM,KAAK,GAAG;AAErB,eAAK,MAAM;AACX,uBAAa,KAAK,OAAO,EAAE;AAAA,YACzB,MAAM;AAEJ,kBAAI;AAAU;AAEd,mBAAK,OAAO;AAAA,YACd;AAAA,YACA,CAAC,QAAQ;AAEP,kBAAI;AAAU;AACd,kBAAI,KAAK,GAAG;AAAA,YACd;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,SAAK,GAAG,WAAW,IAAI,SAAS;AAChC,SAAK,GAAG,SAAS,IAAI,OAAO;AAC5B,SAAK,GAAG,QAAQ,IAAI,MAAM;AAC1B,SAAK,GAAG,OAAO,IAAI,KAAK;AACxB,SAAK,GAAG,SAAS,IAAI,OAAO;AAC5B,QAAI,GAAG,WAAW,IAAI,SAAS;AAC/B,QAAI,GAAG,SAAS,IAAI,OAAO;AAC3B,QAAI,GAAG,SAAS,IAAI,OAAO;AAC3B,QAAI,GAAG,OAAO,IAAI,KAAK;AAAA,EACzB;AAAA,EACU,QACR,KACA,aACA,UACM;AACN,wBAAAC,SAAW,KAAK,MAAM,CAAC,KAAK,SAAS;AACnC,UAAI;AAAK,eAAO,SAAS,GAAG;AAC5B,UAAI,CAAC,MAAM;AACT,eAAO,SAAS,IAAI;AAAA,MACtB;AACA,YAAM,IAAI,YAAY,QAAQ,GAAG;AACjC,UAAI,IAAI,GAAG;AACT,sBAAc,YAAY,MAAM,GAAG,CAAC;AAAA,MACtC;AACA,UAAI,gBAAgB,mBAAmB;AACrC,aAAK,WAAW,YAAY,MAAM,CAACC,MAAY,WAAmC;AAChF,cAAIA;AAAK,mBAAO,SAASA,IAAG;AAC5B,mBAAS,MAAM,MAAM;AAAA,QACvB,CAAC;AAAA,MACH,WAAW,gBAAgB,oBAAoB;AAC7C,YAAI;AACF,mBAAS,MAAM,KAAK,MAAM,IAAI,CAAC;AAAA,QACjC,SAAS,IAAI;AACX,mBAAS,EAAE;AAAA,QACb;AAAA,MACF,OAAO;AACL,iBAAS,IAAI,MAAM,4BAA4B,WAAW,EAAE,CAAC;AAAA,MAC/D;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEU,OACR,SACA,UACM;AACN,QAAI,OAAO;AACX,QAAI,OAAsB;AAE1B,aAAS,OAAO,KAAmB,QAA4B;AAC7D,UAAI;AAAM;AACV,UAAI,CAAC,OAAO,QAAQ,YAAY,CAAC,MAAM;AACrC,cAAM,IAAI,MAAM,4CAA4C;AAC5D,gBAAQ,SAAS,MAAM,SAAS,GAAG,CAAC;AACpC;AAAA,MACF;AAEA,aAAO;AACP,cAAQ,SAAS,MAAM,SAAS,KAAK,UAAU,QAAW,QAAQ,MAAS,CAAC;AAAA,IAC9E;AACA,UAAM,UAAM;AAAA,MACV;AAAA,QACE,QAAQ,QAAQ;AAAA,QAChB,MAAM,QAAQ;AAAA,QACd,MAAM,QAAQ;AAAA,QACd,SAAS,QAAQ,WAAW;AAAA,QAC5B,OAAO,KAAK;AAAA,QACZ,SAAS,KAAK;AAAA,MAChB;AAAA,MACA,CAAC,QAAQ;AACP,cAAM,cAAc,IAAI,QAAQ,cAAc,KAAK;AACnD,cAAM,aAAa,IAAI,cAAc;AAErC,YAAI,aAAa,OAAO,cAAc,KAAK;AACzC,eAAK,QAAQ,KAAK,aAAa,CAAC,KAAK,WAAW;AAE9C,mBAAO,OAAO,IAAI,MAAM,IAAI,aAAa,GAAG,MAAM,SAAY,MAAM;AAAA,UACtE,CAAC;AAAA,QACH,WAAW,CAAC,QAAQ,cAAc;AAChC,eAAK,QAAQ,KAAK,aAAa,CAAC,KAAK,WAAW;AAC9C,mBAAO,OAAO,KAAK,MAAM,SAAY,MAAM;AAAA,UAC7C,CAAC;AAAA,QACH,OAAO;AACL,gBAAM,UAAkC,CAAC;AACzC,0BAAgB,QAAQ,cAAc,IAAI;AAC1C,gBAAM,kBAAkB,IAAI,QAAQ,kBAAkB;AACtD,8BAAoB,QAAQ,kBAAkB,IAAI;AAClD,iBAAO,MAAM;AAAA,YACX;AAAA,YACA,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AACA,aAAS,SAAS,KAAkB;AAClC,UAAI,IAAI,SAAS,QAAQ;AACzB,aAAO,GAAG;AAAA,IACZ;AACA,QAAI,GAAG,SAAS,QAAQ;AAExB,QAAI,QAAQ,MAAM;AAChB,WAAK;AAAA,QACH,QAAQ;AAAA,QACR;AAAA,QACA,QAAQ,SAAS;AAAA,QACjB,QAAQ;AAAA,QACR,SAAU,KAAY,UAAkB;AACtC,cAAI;AAAM;AACV,cAAI,KAAK;AACP,mBAAO,GAAG;AAAA,UACZ,OAAO;AACL,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,UAAI,IAAI;AAAA,IACV;AAAA,EACF;AAAA;AAAA,EAEA,WAAW,UAAoD;AAC7D,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AAAA;AAAA,EAEA,aAAa,UAAiC;AAC5C,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AAAA;AAAA,EAEA,YAAY,UAAkB,KAAe,SAAsD;AACjG,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AACF;;;AE3TA,IAAAC,iBAAmB;AAiBZ,IAAM,yBAAN,cAAqC,qBAAqB;AAAA,EACvD;AAAA,EACR,YAAY,QAAyB;AACnC,UAAM,MAAM;AACZ,SAAK,UAAU;AAAA,EACjB;AAAA,EACQ,SAAS,WAAmB,QAAgB,SAA0C,MAAsB;AAElH,UAAM,gBACJ,GAAG,MAAM;AAAA,EACN,UAAU,aAAa,KAAK,EAAE;AAAA,EAC9B,UAAU,cAAc,KAAK,EAAE;AAAA,EAC/B,IAAI;AAAA;AAAA,IAEL,4BAA4B,OAAO,CACrC,IAAI,KAAK,QAAQ,MAAM,IAAI,SAAS;AAEtC,UAAM,YAAY,eAAAC,QAAO,WAAW,QAAQ,KAAK,QAAQ,SAAS,EAAE,OAAO,aAAa,EAAE,OAAO,QAAQ;AAEzG,WAAO,OAAO,KAAK,QAAQ,SAAS,IAAI,SAAS;AAAA,EACnD;AAAA,EAEA,WAAW,UAAoD;AAC7D,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,KAAK,IAAI;AACf,YAAM,UAAwB;AAAA,QAC5B,QAAQ;AAAA,QACR,MAAM,GAAG,KAAK,QAAQ,MAAM,IAAI,KAAK,QAAQ,MAAM;AAAA,QACnD,MAAM,IAAI,QAAQ;AAAA,QAClB,cAAc;AAAA,QACd,SAAS;AAAA,UACP,MAAM;AAAA,UACN,eAAe,KAAK,SAAS,UAAU,OAAO,QAAW,EAAE;AAAA,QAC7D;AAAA,MACF;AACA,WAAK,OAAO,SAAS,CAAC,KAAY,WAAwB;AACxD,YAAI,CAAC,KAAK;AACR,iBAAO,QAAQ;AAAA,YACb,SAAS,OAAO;AAAA,YAChB,QAAQ,OAAO;AAAA,UACjB,CAAC;AAAA,QACH;AACA,YAAI,CAAC,QAAQ,OAAO;AAClB,iBAAO,OAAO,GAAG;AAAA,QACnB;AACA,YAAI,OAAO,MAAM,SAAS,aAAa;AAGrC,iBAAO,QAAQ,IAAI;AAAA,QACrB;AACA,eAAO,GAAG;AAAA,MACZ,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EACA,YAAY,UAAkB,KAAe,UAA8B,YAAoC;AAC7G,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,KAAK,IAAI;AAEf,YAAM,UAA+B;AAAA,QACnC,GAAG,QAAQ;AAAA,QACX,MAAM;AAAA,QACN,eAAe,KAAK,SAAS,UAAU,OAAO,QAAQ,SAAS,EAAE;AAAA,MACnE;AAEA,UAAI,QAAQ,iBAAiB;AAC3B,gBAAQ,kBAAkB,IAAI,QAAQ;AAAA,MACxC;AACA,UAAI,QAAQ,aAAa;AACvB,gBAAQ,cAAc,IAAI,QAAQ;AAAA,MACpC;AACA,YAAM,eAA6B;AAAA,QACjC,QAAQ;AAAA,QACR,MAAM,GAAG,KAAK,QAAQ,MAAM,IAAI,KAAK,QAAQ,MAAM;AAAA,QACnD,MAAM,IAAI,QAAQ;AAAA,QAClB,cAAc;AAAA,QACd,MAAM;AAAA,QACN,OAAO,QAAQ;AAAA,QACf,UAAU,QAAQ;AAAA,QAClB;AAAA,MACF;AAEA,WAAK,OAAO,cAAc,CAAC,KAAK,QAAQ,gBAAgB;AACtD,YAAI,CAAC,KAAK;AAER,iBAAO,QAAQ,WAAW;AAAA,QAC5B;AASA,eAAO,QAAQ,SAAS,GAAG;AAAA,MAC7B,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,aAAa,UAAiC;AAC5C,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,KAAK,IAAI;AACf,YAAM,UAAwB;AAAA,QAC5B,QAAQ;AAAA,QACR,MAAM,GAAG,KAAK,QAAQ,MAAM,IAAI,KAAK,QAAQ,MAAM;AAAA,QACnD,MAAM,IAAI,QAAQ;AAAA,QAClB,cAAc;AAAA,QACd,SAAS;AAAA,UACP,MAAM;AAAA,UACN,eAAe,KAAK,SAAS,UAAU,UAAU,QAAW,EAAE;AAAA,QAChE;AAAA,MACF;AACA,WAAK,OAAO,SAAS,CAAC,KAAK,WAAW;AACpC,YAAI,CAAC,KAAK;AAER,iBAAO,QAAQ;AAAA,QACjB;AAMA,eAAO,QAAQ,SAAS,GAAG;AAAA,MAC7B,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;AAEA,SAAS,4BAA4B,SAAuC;AAC1E,MAAI,CAAC;AAAS,WAAO;AACrB,QAAM,QAAQ,CAAC;AACf,aAAW,KAAK,SAAS;AACvB,UAAM,KAAK,EAAE,YAAY;AACzB,QAAI,GAAG,WAAW,QAAQ,GAAG;AAC3B,YAAM,KAAK,GAAG,EAAE,IAAI,QAAQ,CAAC,CAAC,EAAE;AAAA,IAClC;AAAA,EACF;AAEA,SAAO,MAAM,SAAS,GAAG,MAAM,KAAK,EAAE,KAAK,IAAI,CAAC;AAAA,IAAO;AACzD;;;AC5JA,IAAAC,iBAAmB;AAYnB,SAAS,cAAc,KAAwC;AAC7D,QAAM,OAAO,OAAO,KAAK,GAAG;AAC5B,SAAO,KAAK,KAAK,SAAU,GAAG,GAAG;AAC/B,QAAI,EAAE,YAAY;AAClB,QAAI,EAAE,YAAY;AAClB,WAAO,MAAM,IAAI,IAAI,IAAI,IAAI,IAAI;AAAA,EACnC,CAAC;AACH;AAEA,SAAS,iBAAiB,KAAqB;AAC7C,SAAO,mBAAmB,GAAG,EAC1B,QAAQ,MAAM,KAAK,EACnB,QAAQ,MAAM,KAAK,EACnB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK;AACzB;AAEA,SAAS,QAAQ,KAAsC;AACrD,QAAM,OAAO,CAAC;AACd,QAAM,UAAU,cAAc,GAAG;AACjC,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,QAAI,MAAM,QAAQ,CAAC;AACnB,QAAI,MAAM,IAAI,GAAG,MAAM,UAAa,IAAI,GAAG,MAAM,OAAO,KAAK,GAAG,IAAI,GAAG,CAAC;AACxE,UAAM,IAAI,YAAY;AACtB,UAAM,iBAAiB,GAAG;AAC1B,UAAM,iBAAiB,GAAG,KAAK;AAC/B,SAAK,KAAK,GAAG,GAAG,IAAI,GAAG,EAAE;AAAA,EAC3B;AACA,SAAO,KAAK,KAAK,GAAG;AACtB;AAKO,IAAM,wBAAN,cAAoC,qBAAqB;AAAA,EACtD;AAAA,EACR,YAAY,QAAwB;AAClC,UAAM,MAAM;AACZ,SAAK,UAAU;AAAA,EACjB;AAAA,EACQ,SAAS,QAAgB,MAAc,SAAkD;AAC/F,UAAM,WAAW,KAAK,QAAQ;AAC9B,UAAM,YAAY,KAAK,QAAQ;AAG/B,UAAM,OAAQ,KAAK,IAAI,IAAI,MAAQ,KAAK;AACxC,UAAM,UAAU,GAAG,GAAG,IAAI,MAAM,GAAG;AACnC,UAAM,aAAa,UAAU,cAAc,OAAO,EAAE,KAAK,GAAG,EAAE,YAAY,IAAI;AAC9E,UAAM,YAAY;AAIlB,UAAM,UAAU,eAAAC,QAAO,WAAW,QAAQ,SAAS,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK;AAGjF,UAAM,eAAe,GAAG,OAAO,YAAY,CAAC;AAAA,EAAK,IAAI;AAAA;AAAA,EAAY,UAAU,QAAQ,OAAO,IAAI,EAAE;AAAA;AAIhG,UAAM,MAAM,eAAAA,QAAO,WAAW,MAAM,EAAE,OAAO,YAAY,EAAE,OAAO,KAAK;AACvE,UAAM,eAAe;AAAA,EAAS,OAAO;AAAA,EAAK,GAAG;AAAA;AAG7C,UAAM,YAAY,eAAAA,QAAO,WAAW,QAAQ,OAAO,EAAE,OAAO,YAAY,EAAE,OAAO,KAAK;AAGtF,WACE,8BACS,QAAQ,gBAAgB,OAAO,eAAe,OAAO,kBAAkB,UAAU,qBAAqB,SAAS,gBAAgB,SAAS;AAAA,EAErJ;AAAA,EACA,WAAW,UAAoD;AAC7D,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,OAAO,IAAI,QAAQ;AACzB,YAAM,UAAwB;AAAA,QAC5B,QAAQ;AAAA,QACR,MAAM,GAAG,KAAK,QAAQ,MAAM,IAAI,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM;AAAA,QAC7E;AAAA,QACA,cAAc;AAAA,QACd,SAAS;AAAA,UACP,eAAe,KAAK,SAAS,OAAO,MAAM,MAAS;AAAA,QACrD;AAAA,MACF;AACA,WAAK,OAAO,SAAS,CAAC,KAAY,WAAwB;AACxD,YAAI,CAAC,KAAK;AACR,iBAAO,QAAQ;AAAA,YACb,SAAS,OAAO;AAAA,YAChB,QAAQ,OAAO;AAAA,UACjB,CAAC;AAAA,QACH;AACA,YAAI,CAAC,QAAQ,OAAO;AAClB,iBAAO,OAAO,GAAG;AAAA,QACnB;AACA,YAAI,OAAO,MAAM,SAAS,aAAa;AAGrC,iBAAO,QAAQ,IAAI;AAAA,QACrB;AACA,eAAO,GAAG;AAAA,MACZ,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EACA,YAAY,UAAkB,KAAe,UAA8B,YAAoC;AAC7G,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,OAAO,IAAI,QAAQ;AACzB,YAAM,UAA+B;AAAA,QACnC,GAAG,QAAQ;AAAA,QACX,eAAe,KAAK,SAAS,OAAO,MAAM,QAAQ,OAAO;AAAA,MAC3D;AACA,UAAI,QAAQ,iBAAiB;AAC3B,gBAAQ,kBAAkB,IAAI,QAAQ;AAAA,MACxC;AACA,UAAI,QAAQ,aAAa;AACvB,gBAAQ,cAAc,IAAI,QAAQ;AAAA,MACpC;AACA,YAAM,eAA6B;AAAA,QACjC,QAAQ;AAAA,QACR;AAAA,QACA,MAAM,GAAG,KAAK,QAAQ,MAAM,IAAI,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM;AAAA,QAC7E;AAAA,QACA,cAAc;AAAA,QACd,MAAM;AAAA,QACN,OAAO,QAAQ;AAAA,QACf,UAAU,QAAQ;AAAA,MACpB;AAEA,WAAK,OAAO,cAAc,CAAC,KAAK,QAAQ,gBAAgB;AACtD,YAAI,CAAC,KAAK;AAER,iBAAO,QAAQ,WAAW;AAAA,QAC5B;AASA,eAAO,QAAQ,SAAS,GAAG;AAAA,MAC7B,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EACA,aAAa,UAAiC;AAC5C,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,OAAO,IAAI,QAAQ;AACzB,YAAM,UAAwB;AAAA,QAC5B,QAAQ;AAAA,QACR,MAAM,GAAG,KAAK,QAAQ,MAAM,IAAI,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM;AAAA,QAC7E;AAAA,QACA,SAAS;AAAA,UACP,eAAe,KAAK,SAAS,UAAU,MAAM,MAAS;AAAA,QACxD;AAAA,QACA,cAAc;AAAA,MAChB;AACA,WAAK,OAAO,SAAS,CAAC,KAAK,WAAW;AACpC,YAAI,CAAC,KAAK;AAER,iBAAO,QAAQ;AAAA,QACjB;AAMA,eAAO,QAAQ,SAAS,GAAG;AAAA,MAC7B,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;;;ACtLA,IAAAC,iBAAmB;AAanB,IAAM,UAAU;AAAA,EACd,WAAW;AACb;AAOA,SAAS,YAAY,QAAwB;AAC3C,SAAO,GAAG,OAAO,MAAM,QAAQ,QAAQ,OAAO,MAAM,CAAC,GAAG,OAAO,WAAW,cAAc,EAAE;AAC5F;AACO,IAAM,wBAAN,cAAoC,qBAAqB;AAAA,EACtD;AAAA,EACR,YAAY,QAAwB;AAClC,UAAM,MAAM;AACZ,SAAK,UAAU;AAAA,EACjB;AAAA,EACQ,SAAS,WAAmB,QAAgB,SAA0C,MAAsB;AAElH,UAAM,gBACJ,GAAG,MAAM;AAAA,EACN,UAAU,aAAa,KAAK,EAAE;AAAA,EAC9B,UAAU,cAAc,KAAK,EAAE;AAAA,EAC/B,IAAI;AAAA;AAAA,IAELC,6BAA4B,OAAO,CACrC,IAAI,KAAK,QAAQ,MAAM,IAAI,SAAS;AAEtC,UAAM,YAAY,eAAAC,QAAO,WAAW,QAAQ,KAAK,QAAQ,SAAS,EAAE,OAAO,aAAa,EAAE,OAAO,QAAQ;AAEzG,WAAO,OAAO,KAAK,QAAQ,SAAS,IAAI,SAAS;AAAA,EACnD;AAAA,EAEA,WAAW,UAAoD;AAC7D,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,UAAwB;AAAA,QAC5B,QAAQ;AAAA,QACR,MAAM,YAAY,KAAK,OAAO;AAAA,QAC9B,MAAM,IAAI,QAAQ;AAAA,QAClB,cAAc;AAAA,MAChB;AACA,YAAM,KAAK,IAAI;AACf,cAAQ,UAAU;AAAA,QAChB,MAAM;AAAA,QACN,eAAe,KAAK,SAAS,UAAU,OAAO,QAAW,EAAE;AAAA,MAC7D;AACA,WAAK,OAAO,SAAS,CAAC,KAAY,WAAwB;AACxD,YAAI,CAAC,KAAK;AACR,iBAAO,QAAQ;AAAA,YACb,SAAS,OAAO;AAAA,YAChB,QAAQ,OAAO;AAAA,UACjB,CAAC;AAAA,QACH;AACA,YAAI,CAAC,QAAQ,OAAO;AAClB,iBAAO,OAAO,GAAG;AAAA,QACnB;AACA,YAAI,OAAO,MAAM,SAAS,aAAa;AAErC,iBAAO,QAAQ,IAAI;AAAA,QACrB;AACA,eAAO,GAAG;AAAA,MACZ,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EACA,YAAY,UAAkB,KAAe,UAA8B,YAAoC;AAC7G,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,KAAK,IAAI;AAEf,YAAM,UAA+B;AAAA,QACnC,MAAM;AAAA,QACN,eAAe,KAAK,SAAS,UAAU,OAAO,QAAQ,SAAS,EAAE;AAAA,MACnE;AACA,UAAI,QAAQ,iBAAiB;AAC3B,gBAAQ,kBAAkB,IAAI,QAAQ;AAAA,MACxC;AACA,UAAI,QAAQ,aAAa;AACvB,gBAAQ,cAAc,IAAI,QAAQ;AAAA,MACpC;AACA,YAAM,eAA6B;AAAA,QACjC,QAAQ;AAAA,QACR,MAAM,YAAY,KAAK,OAAO;AAAA,QAC9B,MAAM,IAAI,QAAQ;AAAA,QAClB,cAAc;AAAA,QACd,MAAM;AAAA,QACN,OAAO,QAAQ;AAAA,QACf,UAAU,QAAQ;AAAA,QAClB;AAAA,MACF;AAEA,WAAK,OAAO,cAAc,CAAC,KAAK,QAAQ,gBAAgB;AACtD,YAAI,CAAC,KAAK;AAER,iBAAO,QAAQ,WAAW;AAAA,QAC5B;AASA,eAAO,QAAQ,SAAS,GAAG;AAAA,MAC7B,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,aAAa,UAAiC;AAC5C,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,KAAK,IAAI;AAEf,YAAM,UAAwB;AAAA,QAC5B,QAAQ;AAAA,QACR,MAAM,YAAY,KAAK,OAAO;AAAA,QAC9B,MAAM,IAAI,QAAQ;AAAA,QAClB,cAAc;AAAA,QACd,SAAS;AAAA,UACP,MAAM;AAAA,UACN,eAAe,KAAK,SAAS,UAAU,UAAU,QAAW,EAAE;AAAA,QAChE;AAAA,MACF;AACA,WAAK,OAAO,SAAS,CAAC,KAAK,WAAW;AACpC,YAAI,CAAC,KAAK;AAER,iBAAO,QAAQ;AAAA,QACjB;AAMA,eAAO,QAAQ,SAAS,GAAG;AAAA,MAC7B,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;AAEA,SAASD,6BAA4B,SAAuC;AAC1E,MAAI,CAAC;AAAS,WAAO;AACrB,QAAM,QAAQ,CAAC;AACf,aAAW,KAAK,SAAS;AACvB,UAAM,KAAK,EAAE,YAAY;AACzB,QAAI,GAAG,WAAW,QAAQ,GAAG;AAC3B,YAAM,KAAK,GAAG,EAAE,IAAI,QAAQ,CAAC,CAAC,EAAE;AAAA,IAClC;AAAA,EACF;AAEA,SAAO,MAAM,SAAS,GAAG,MAAM,KAAK,EAAE,KAAK,IAAI,CAAC;AAAA,IAAO;AACzD;;;AClKA,IAAAE,iBAAmB;AAEnB,mBAAuB;AAMhB,IAAM,wBAAN,cAAoC,qBAAqB;AAAA,EACtD;AAAA,EACA;AAAA,EACR,YAAY,QAAwB;AAClC,UAAM,MAAM;AACZ,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,MAAM,aAAa;AACjB,QAAI,CAAC,KAAK,SAAS;AACjB,WAAK,UAAU,IAAI,oBAAO,KAAK,OAAO;AACtC,UAAI,CAAE,MAAM,KAAK,QAAQ,aAAa,KAAK,QAAQ,MAAM,GAAI;AAC3D,cAAM,KAAK,QAAQ,WAAW,KAAK,QAAQ,QAAQ,KAAK,QAAQ,MAAM;AAAA,MACxE;AAAA,IACF;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EACA,MAAM,WAAW,UAAkB;AACjC,UAAM,SAAS,MAAM,KAAK,WAAW;AACrC,QAAI;AACJ,QAAI;AACF,YAAM,OAAO,MAAM,OAAO,WAAW,KAAK,QAAQ,QAAQ,QAAQ;AAClE,aAAO,KAAK;AAAA,IACd,SAAS,IAAI;AACX,UAAI,GAAG,SAAS,YAAY;AAC1B,eAAO;AAAA,MACT;AAEA,cAAQ,MAAM,EAAE;AAChB,YAAM;AAAA,IACR;AACA,UAAM,SAAS,MAAM,OAAO,UAAU,KAAK,QAAQ,QAAQ,QAAQ;AACnE,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,YAAY,UAAkB,KAAe,UAA8B,YAAY;AAC3F,UAAM,SAAS,MAAM,KAAK,WAAW;AACrC,UAAM,OAAO,QAAQ,WAAW,CAAC;AACjC,QAAI,QAAQ,iBAAiB;AAC3B,WAAK,kBAAkB,IAAI,QAAQ;AAAA,IACrC;AACA,QAAI,QAAQ,aAAa;AACvB,WAAK,cAAc,IAAI,QAAQ;AAAA,IACjC;AACA,QAAI,QAAQ,UAAU;AAKpB,YAAM,OAAO,eAAAC,QAAO,WAAW,QAAQ;AACvC,YAAM,YAAY,IAAI,uBAAS;AAAA,QAC7B,OAAO;AAAA,QAAC;AAAA,MACV,CAAC;AACD,UAAI;AACJ,UAAI,GAAG,QAAQ,CAAC,UAAU;AACxB,kBAAU,KAAK,KAAK;AACpB,aAAK,OAAO,KAAK;AAAA,MACnB,CAAC;AACD,UAAI,GAAG,OAAO,MAAM;AAClB,kBAAU,KAAK,OAAO,KAAK;AAC3B,kBAAU,KAAK,IAAI;AAAA,MACrB,CAAC;AACD,UAAI,GAAG,SAAS,CAAC,QAAQ;AACvB,kBAAU,QAAQ,GAAG;AAAA,MACvB,CAAC;AACD,YAAM,OAAO,UAAU,KAAK,QAAQ,QAAQ,UAAU,WAAW,IAAI;AACrE,aAAO;AAAA,IACT,WAAW,QAAQ,OAAO;AACxB,YAAM,aAAa,QAAQ,SAAS;AACpC,YAAM,YAAY,IAAI,uBAAS;AAAA,QAC7B,OAAO;AAAA,QAAC;AAAA,MACV,CAAC;AACD,UAAI,QAAQ;AACZ,UAAI,MAAM;AACV,UAAI,GAAG,QAAQ,CAAC,UAAU;AACxB,YAAI;AAAK;AACT,iBAAS,MAAM;AACf,YAAI,QAAQ,YAAY;AACtB,gBAAM;AACN,oBAAU,QAAQ,aAAa;AAC/B;AAAA,QACF;AACA,kBAAU,KAAK,KAAK;AAAA,MACtB,CAAC;AACD,UAAI,GAAG,OAAO,MAAM;AAClB,YAAI;AAAK;AACT,kBAAU,KAAK,IAAI;AACnB,cAAM;AAAA,MACR,CAAC;AACD,UAAI,GAAG,SAAS,CAAC,QAAQ;AACvB,kBAAU,QAAQ,GAAG;AAAA,MACvB,CAAC;AACD,YAAM,OAAO,UAAU,KAAK,QAAQ,QAAQ,UAAU,WAAW,IAAI;AAAA,IACvE,OAAO;AACL,YAAM,OAAO,UAAU,KAAK,QAAQ,QAAQ,UAAU,KAAK,IAAI;AAAA,IACjE;AAAA,EACF;AAAA,EACA,MAAM,aAAa,UAAkB;AACnC,UAAM,SAAS,MAAM,KAAK,WAAW;AACrC,UAAM,OAAO,aAAa,KAAK,QAAQ,QAAQ,QAAQ;AAAA,EACzD;AACF;",
  "names": ["XMLParser", "pump", "getRawBody", "err", "import_crypto", "crypto", "import_crypto", "crypto", "import_crypto", "calcCanonicalizedOSSHeaders", "crypto", "import_crypto", "crypto"]
}
