{"version":3,"sources":["jsdelivr-header.js","/npm/gbatchrequests@1.0.0/index.js"],"names":[],"mappings":"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","file":"/npm/gbatchrequests@1.0.0/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/gbatchrequests@1.0.0/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/**\n * @module gbatchrequests\n *\n * Class BatchRequests\n * Achieve batch requests using Google APIs.\n */\nclass BatchRequests {\n  /**\n   * @param {object} obj Object for requesting batch requests.\n   * @return {}\n   */\n  constructor(obj) {\n    this.https = require(\"https\");\n    this.obj = obj;\n    this.baseUrl = \"https://www.googleapis.com\";\n    this.boundary = \"sampleBoundary12345\";\n    this.limit = 100;\n  }\n\n  /**\n   * @param {string} url URL.\n   * @param {object} params Object for requesting.\n   * @param {object} data Request body.\n   * @return {Promise} Promise object.\n   */\n  _fetch(url, params = {}, data = null) {\n    return new Promise((resolve, reject) => {\n      const req = this.https.request(url, params, (res) => {\n        const ar = [];\n        res.on(\"data\", (r) => ar.push(r));\n        res.on(\"end\", () => resolve(ar.join(\"\")));\n      });\n      if (data) req.write(data);\n      req.on(\"error\", reject);\n      req.end();\n    });\n  }\n\n  /**\n   * Create a request body of batch requests and request it.\n   * @param {object[]} requests Requests for batch requests.\n   * @returns {Object}\n   */\n  _createRequestBody(requests) {\n    const lb = \"\\r\\n\";\n    const payload = requests.reduce((r, e, i, a) => {\n      r += `Content-Type: application/http${lb}`;\n      r += `Content-ID: ${i + 1}${lb}${lb}`;\n      r += `${e.method} ${e.endpoint}${lb}`;\n      r += e.requestBody\n        ? `Content-Type: application/json; charset=utf-8\" ${lb}${lb}`\n        : lb;\n      r += e.requestBody ? `${JSON.stringify(e.requestBody)}${lb}` : \"\";\n      r += `--${this.boundary}${i == a.length - 1 ? \"--\" : \"\"}${lb}`;\n      return r;\n    }, `--${this.boundary}${lb}`);\n    return payload;\n  }\n\n  /**\n   * Parsing response values from batch requests.\n   * @param {string} d Response values from batch requests.\n   * @returns {Object}\n   */\n  _parser(d) {\n    const temp = d.split(\"--batch\");\n    const regex = /{[\\S\\s]+}/g;\n    return temp\n      .slice(1, temp.length - 1)\n      .map((e) => (regex.test(e) ? JSON.parse(e.match(regex)[0]) : e));\n  }\n\n  /**\n   * @return {string} batch path\n   */\n  getBatchPath() {\n    return new Promise(async (resolve, reject) => {\n      try {\n        if (!this.obj.api.name) {\n          reject(\"Please set API name you want to search.\");\n        }\n        const url = `${this.baseUrl}/discovery/v1/apis?preferred=${\n          this.obj.api.version ? \"false\" : \"true\"\n        }&name=${encodeURIComponent(this.obj.api.name.toLowerCase())}`;\n        const res1 = JSON.parse(await this._fetch(url, { method: \"GET\" }));\n        if (res1.error) {\n          res1.result = \"Batch path cannot be found.\";\n          reject(res1);\n        }\n        if (!res1.items) {\n          reject(\"Batch path cannot be found.\");\n        }\n        const { discoveryRestUrl } =\n          (!this.obj.api.version\n            ? res1.items[0]\n            : res1.items.find((e) => e.version == this.obj.api.version)) || {};\n        if (!discoveryRestUrl) {\n          reject(\"Batch path cannot be found.\");\n        }\n        const res2 = JSON.parse(\n          await this._fetch(discoveryRestUrl, { method: \"GET\" })\n        );\n        if (res2.error) {\n          res2.result = \"Batch path cannot be found.\";\n          reject(res2);\n        }\n        const { batchPath } = res2;\n        resolve(batchPath);\n      } catch (e) {\n        reject(e);\n      }\n    });\n  }\n\n  /**\n   * Request batch requests.\n   *\n   * @returns {Object}\n   */\n  do() {\n    return new Promise(async (resolve, reject) => {\n      if (!this.obj.hasOwnProperty(\"accessToken\")) {\n        reject(\n          \"Please set 'accessToken' property for requesting API in the input object.\"\n        );\n      }\n      if (!this.obj.hasOwnProperty(\"api\")) {\n        reject(\"Please set 'api' property in the input object.\");\n      }\n      if (\n        !this.obj.hasOwnProperty(\"requests\") ||\n        !Array.isArray(this.obj.requests) ||\n        this.obj.requests.length == 0\n      ) {\n        reject(\"Please set 'requests' property in the input object.\");\n      }\n      const batchPath = await this.getBatchPath().catch((err) => reject(err));\n      const { requests } = this.obj;\n      let res = [];\n      const n = Math.ceil(requests.length / this.limit);\n      for (let i = 0; i < n; i++) {\n        const requestBody = this._createRequestBody(\n          requests.splice(0, this.limit)\n        );\n        const r = await this._fetch(\n          `${this.baseUrl}/${batchPath}`,\n          {\n            method: \"POST\",\n            headers: {\n              \"Content-Type\": `multipart/mixed; boundary=${this.boundary}`,\n              Authorization: `Bearer ${this.obj.accessToken}`,\n            },\n          },\n          requestBody\n        );\n        const rr = this._parser(r);\n        const err = rr.find(({ error }) => error);\n        if (err && !this.obj.skipError) {\n          reject(r);\n        }\n        if (this.obj.returnRawData) {\n          res.push(r);\n        } else {\n          res = [...res, ...rr];\n        }\n      }\n      resolve(res);\n    });\n  }\n}\n\n/**\n * Get batch path.\n * @name getBatchPath\n * @param {object} obj Object for requesting batch requests.\n * - Sample of \"obj\" is as follows.\n * ```javascript\n * const obj = { api: { name: \"drive\", version: \"v3\" } };\n * ```\n * @return {Promise} Promise object represents the batch path.\n */\nmodule.exports.GetBatchPath = (obj) =>\n  new Promise((resolve, reject) =>\n    new BatchRequests(obj).getBatchPath().then(resolve).catch(reject)\n  );\n\n/**\n * Run batch requests of Google APIs.\n * @name runBatch\n * @param {object[]} obj Object for requesting batch requests.\n * - Sample of \"obj\" is as follows.\n * ```javascript\n * const obj = {\n *   skipError: true, // When this is true, even when an error occurs in the request, the error is skipped. Default is false.\n *   returnRawData: true, // When this is true, the returned value are not parsed. Default is false.\n *   accessToken: \"###\",\n *   api: { name: \"drive\", version: \"v3\" },\n *   requests: [\n *     {\n *       method: \"PATCH\",\n *       endpoint: `https://www.googleapis.com/drive/v3/files/${fileId}`,\n *       requestBody: { name: \"sample\" },\n *     },\n *     ,\n *     ,\n *     ,\n *   ],\n * };\n * ```\n * @return {Promise} Promise object represents the returned values from batch requests.\n */\nmodule.exports.RunBatch = (obj) =>\n  new Promise((resolve, reject) =>\n    new BatchRequests(obj).do().then(resolve).catch(reject)\n  );\n"]}