summaryrefslogtreecommitdiff
path: root/node_modules/discord.js/src/util/DataResolver.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/discord.js/src/util/DataResolver.js')
-rw-r--r--node_modules/discord.js/src/util/DataResolver.js127
1 files changed, 127 insertions, 0 deletions
diff --git a/node_modules/discord.js/src/util/DataResolver.js b/node_modules/discord.js/src/util/DataResolver.js
new file mode 100644
index 0000000..71f690c
--- /dev/null
+++ b/node_modules/discord.js/src/util/DataResolver.js
@@ -0,0 +1,127 @@
+'use strict';
+
+const fs = require('fs');
+const path = require('path');
+const stream = require('stream');
+const fetch = require('node-fetch');
+const { Error: DiscordError, TypeError } = require('../errors');
+const { browser } = require('../util/Constants');
+const Util = require('../util/Util');
+
+/**
+ * The DataResolver identifies different objects and tries to resolve a specific piece of information from them.
+ * @private
+ */
+class DataResolver {
+ constructor() {
+ throw new Error(`The ${this.constructor.name} class may not be instantiated.`);
+ }
+
+ /**
+ * Data that can be resolved to give an invite code. This can be:
+ * * An invite code
+ * * An invite URL
+ * @typedef {string} InviteResolvable
+ */
+
+ /**
+ * Resolves InviteResolvable to an invite code.
+ * @param {InviteResolvable} data The invite resolvable to resolve
+ * @returns {string}
+ */
+ static resolveInviteCode(data) {
+ const inviteRegex = /discord(?:app\.com\/invite|\.gg(?:\/invite)?)\/([\w-]{2,255})/i;
+ const match = inviteRegex.exec(data);
+ if (match && match[1]) return match[1];
+ return data;
+ }
+
+ /**
+ * Resolves a Base64Resolvable, a string, or a BufferResolvable to a Base 64 image.
+ * @param {BufferResolvable|Base64Resolvable} image The image to be resolved
+ * @returns {Promise<?string>}
+ */
+ static async resolveImage(image) {
+ if (!image) return null;
+ if (typeof image === 'string' && image.startsWith('data:')) {
+ return image;
+ }
+ const file = await this.resolveFileAsBuffer(image);
+ return DataResolver.resolveBase64(file);
+ }
+
+ /**
+ * Data that resolves to give a Base64 string, typically for image uploading. This can be:
+ * * A Buffer
+ * * A base64 string
+ * @typedef {Buffer|string} Base64Resolvable
+ */
+
+ /**
+ * Resolves a Base64Resolvable to a Base 64 image.
+ * @param {Base64Resolvable} data The base 64 resolvable you want to resolve
+ * @returns {?string}
+ */
+ static resolveBase64(data) {
+ if (Buffer.isBuffer(data)) return `data:image/jpg;base64,${data.toString('base64')}`;
+ return data;
+ }
+
+ /**
+ * Data that can be resolved to give a Buffer. This can be:
+ * * A Buffer
+ * * The path to a local file
+ * * A URL
+ * @typedef {string|Buffer} BufferResolvable
+ */
+
+ /**
+ * @external Stream
+ * @see {@link https://nodejs.org/api/stream.html}
+ */
+
+ /**
+ * Resolves a BufferResolvable to a Buffer or a Stream.
+ * @param {BufferResolvable|Stream} resource The buffer or stream resolvable to resolve
+ * @returns {Promise<Buffer|Stream>}
+ */
+ static async resolveFile(resource) {
+ if (!browser && Buffer.isBuffer(resource)) return resource;
+ if (browser && resource instanceof ArrayBuffer) return Util.convertToBuffer(resource);
+ if (resource instanceof stream.Readable) return resource;
+
+ if (typeof resource === 'string') {
+ if (/^https?:\/\//.test(resource)) {
+ const res = await fetch(resource);
+ return browser ? res.blob() : res.body;
+ } else if (!browser) {
+ return new Promise((resolve, reject) => {
+ const file = path.resolve(resource);
+ fs.stat(file, (err, stats) => {
+ if (err) return reject(err);
+ if (!stats.isFile()) return reject(new DiscordError('FILE_NOT_FOUND', file));
+ return resolve(fs.createReadStream(file));
+ });
+ });
+ }
+ }
+
+ throw new TypeError('REQ_RESOURCE_TYPE');
+ }
+
+ /**
+ * Resolves a BufferResolvable to a Buffer.
+ * @param {BufferResolvable|Stream} resource The buffer or stream resolvable to resolve
+ * @returns {Promise<Buffer>}
+ */
+ static async resolveFileAsBuffer(resource) {
+ const file = await this.resolveFile(resource);
+ if (Buffer.isBuffer(file)) return file;
+
+ const buffers = [];
+ for await (const data of file) buffers.push(data);
+ return Buffer.concat(buffers);
+ }
+}
+
+module.exports = DataResolver;