UNPKG

@2digits/propr

Version:

A proper way to interface with prepr.io

214 lines (210 loc) 7.14 kB
'use strict'; const murmurhash = require('murmurhash'); const ofetch = require('ofetch'); var __accessCheck = (obj, member, msg) => { if (!member.has(obj)) throw TypeError("Cannot " + msg); }; var __privateGet = (obj, member, getter) => { __accessCheck(obj, member, "read from private field"); return getter ? getter.call(obj) : member.get(obj); }; var __privateAdd = (obj, member, value) => { if (member.has(obj)) throw TypeError("Cannot add the same private member more than once"); member instanceof WeakSet ? member.add(obj) : member.set(obj, value); }; var __privateSet = (obj, member, value, setter) => { __accessCheck(obj, member, "write to private field"); setter ? setter.call(obj, value) : member.set(obj, value); return value; }; var _headers, _baseUrl, _timeout, _userId, _path, _graphqlQuery, _graphqlVariables; const HASH_MULTIPLIER = 2 ** 32 / 1e4; class PreprClient { /** * Creates a new PreprClient instance with the specified options. * @param options - The options used to configure the PreprClient instance. */ constructor(options) { /** * The headers used for all requests made by this PreprClient instance. * @private */ __privateAdd(this, _headers, new ofetch.Headers()); /** * The base URL of the Prepr API used for all requests made by this PreprClient instance. * @default https://cdn.prepr.io * @private */ __privateAdd(this, _baseUrl, new URL("https://cdn.prepr.io")); /** * The timeout in milliseconds for requests made by this PreprClient instance. * @default 4000 * @private */ __privateAdd(this, _timeout, 4e3); /** * The ID of the user associated with this PreprClient instance. * @private */ __privateAdd(this, _userId, void 0); /** * The path used for the request. * @private */ __privateAdd(this, _path, ""); /** * The GraphQL query used for the request. * @private */ __privateAdd(this, _graphqlQuery, void 0); /** * The GraphQL variables used for the request. * @private */ __privateAdd(this, _graphqlVariables, {}); /** * The query parameters used for the request. * @public */ this.query = new URLSearchParams(); this.token(options.token); if (options.baseUrl) __privateSet(this, _baseUrl, new URL(options.baseUrl)); if (typeof options.timeout === "number") __privateSet(this, _timeout, options.timeout); if (options.userId) __privateSet(this, _userId, this.calculateUserId(options.userId)); } /** * Calculates the numeric user ID from a string. * @private */ calculateUserId(userId) { return murmurhash(userId, 1) * HASH_MULTIPLIER; } /** * Sets the user ID for the Prepr-ABTesting header used in requests made by this PreprClient instance. * @param userId - The user ID to set. If `undefined`, the header will be removed from requests. * @returns This PreprClient instance. */ userId(userId) { __privateSet(this, _userId, typeof userId === "string" ? this.calculateUserId(userId) : userId); return this; } /** * Sets the timeout for requests made by this PreprClient instance. * @param milliseconds - The timeout in milliseconds. * @returns This PreprClient instance. */ timeout(milliseconds) { __privateSet(this, _timeout, milliseconds); return this; } /** * Sets the timeout in milliseconds for requests made by this PreprClient instance. * @param milliseconds - The timeout in milliseconds. * @returns This PreprClient instance. */ sort(field) { this.query.set("sort", field); return this; } /** * Sets the maximum number of results to return for requests made by this PreprClient instance. * @param limit - The maximum number of results to return. * @returns This PreprClient instance. */ limit(limit) { this.query.set("limit", `${limit}`); return this; } /** * Sets the number of results to skip for requests made by this PreprClient instance. * @param skip - The number of results to skip. * @returns This PreprClient instance. */ skip(skip) { this.query.set("skip", `${skip}`); return this; } /** * Sets the path for requests made by this PreprClient instance. * @param path - The path to set. * @returns This PreprClient instance. */ path(path) { __privateSet(this, _path, path); return this; } /** * Sets the Prepr API token for requests made by this PreprClient instance. * @param token - The Prepr API token to set. * @returns This PreprClient instance. */ token(token) { __privateGet(this, _headers).set("Authorization", `Bearer ${token}`); return this; } /** * Sets the GraphQL query to include in requests made by this PreprClient instance. * @param graphqlQuery - The GraphQL query to set. * @returns This PreprClient instance. */ graphqlQuery(graphqlQuery) { __privateSet(this, _graphqlQuery, graphqlQuery); return this; } /** * Sets the GraphQL variables to include in requests made by this PreprClient instance. * @param graphqlVariables - The GraphQL variables to set. * @returns This PreprClient instance. */ graphqlVariables(graphqlVariables) { __privateSet(this, _graphqlVariables, graphqlVariables); return this; } /** * Makes a request to the Prepr API. * @param request - The request to make. This can be a URL, a Request object, or a string representing a path to append to the base URL. * @param options - The options for the request. These will be merged with the options set on this PreprClient instance. * @returns A Promise that resolves to the response from the Prepr API. */ async fetch(request = __privateGet(this, _path), options) { const controller = new AbortController(); const fetchTimeout = setTimeout(() => controller.abort(), __privateGet(this, _timeout)); if (__privateGet(this, _userId)) __privateGet(this, _headers).set("Prepr-ABTesting", `${__privateGet(this, _userId)}`); const gqlOptions = __privateGet(this, _graphqlQuery) ? { method: "POST", body: { query: __privateGet(this, _graphqlQuery), variables: __privateGet(this, _graphqlVariables) } } : {}; const fetcher = ofetch.ofetch.create({ baseURL: __privateGet(this, _baseUrl).toString(), headers: __privateGet(this, _headers), query: this.query, signal: controller.signal, onResponse: () => { clearTimeout(fetchTimeout); this.query = new URLSearchParams(); __privateSet(this, _graphqlQuery, ""); __privateSet(this, _graphqlVariables, {}); }, ...gqlOptions }); return fetcher(request, options); } } _headers = new WeakMap(); _baseUrl = new WeakMap(); _timeout = new WeakMap(); _userId = new WeakMap(); _path = new WeakMap(); _graphqlQuery = new WeakMap(); _graphqlVariables = new WeakMap(); const createPreprClient = (options) => new PreprClient(options); exports.createPreprClient = createPreprClient;