node-groupme
Version:
The only GroupMe API library that isn't a million years old.
93 lines • 3.72 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const node_fetch_1 = __importStar(require("node-fetch"));
const url_1 = require("url");
const util_1 = require("util");
function assertDefined(val, err) {
if (val === undefined || val === null)
throw err;
}
function createAPIError(message, endpoint, options, response) {
return new Error(`${message}\n-- Endpoint: ${endpoint}\n-- Options: ${(0, util_1.inspect)(options)}\n-- Response: ${(0, util_1.inspect)(response)}`);
}
function* i() {
let i = 1;
while (true) {
i = (i + 1) % 10000000;
yield i;
}
}
class RESTManager {
constructor(client) {
this.client = client;
this.generator = i();
}
async api(method, path, data = {}, { skipJsonParse = false, allowNull = false, version = 'v3', } = {}) {
const url = new url_1.URL(path, RESTManager.URLS[version]);
if (data?.query) {
for (const key in data.query) {
if (Object.prototype.hasOwnProperty.call(data.query, key)) {
const value = data.query[key];
url.searchParams.set(key, String(value));
}
}
}
const init = {};
init.headers = new node_fetch_1.Headers();
init.headers.set('X-Access-Token', this.client.token);
init.method = method;
if (data?.body) {
init.headers.set('Content-Type', 'application/json');
init.body = JSON.stringify(data.body);
}
const response = await (0, node_fetch_1.default)(url, init);
// console.log(`-----\nAPI request\nurl: ${url}\n-----`)
if (skipJsonParse)
return response;
// for (const header of response.headers.entries()) // console.log(header)
if (response.headers.get('content-length') === '0') {
if (allowNull)
return null;
else
throw createAPIError('Received a response with Content-Length: 0, but expected content', url, data, {});
}
const json = await response.json();
assertDefined(json, createAPIError('Invalid API response', url, data, json));
assertDefined(json.meta, createAPIError('Response is missing "meta" field', url, data, json));
if (json.meta.errors)
throw createAPIError(json.meta.errors.join('; '), url, data, json);
const result = json.response;
return result;
}
guid() {
return `node-groupme_${this.generator.next().value}_${Math.floor(Math.random() * 16 ** 6)
.toString(16)
.padEnd(6, '0')}`;
}
}
exports.default = RESTManager;
RESTManager.URLS = {
v4: 'https://api.groupme.com/v4/',
v3: 'https://api.groupme.com/v3/',
v2: 'https://v2.groupme.com/',
};
//# sourceMappingURL=rest.js.map