@peekalink/core
Version:
Peekalink API client library
72 lines (71 loc) • 2.15 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.PeekalinkClient = exports.DEFAULT_PEEKALINK_ENDPOINT = void 0;
require("isomorphic-unfetch");
const error_1 = require("./error");
/**
* Default Peekalink API endpoint URL
*/
exports.DEFAULT_PEEKALINK_ENDPOINT = "https://api.peekalink.io";
const LINK_PREVIEW_PATH = "/";
function removeTrailingSlash(url) {
return url.endsWith("/") ? url.slice(0, -1) : url;
}
/**
* Peekalink API client
*/
class PeekalinkClient {
apiKey;
endpoint;
defaultOptions;
constructor(options) {
this.apiKey = options.apiKey;
this.endpoint = removeTrailingSlash(options.endpoint ?? exports.DEFAULT_PEEKALINK_ENDPOINT);
this.defaultOptions = options.defaultOptions ?? {};
}
buildOptions(options) {
return {
...this.defaultOptions,
...options,
};
}
buildUrl(path) {
return `${this.endpoint}${path}`;
}
buildHeaders() {
return {
Authorization: `Bearer ${this.apiKey}`,
Accept: "application/json",
"Content-Type": "application/json",
};
}
/**
* Generate a link preview for a given link.
* @param link The link to generate a preview for.
* @param options Optional request options.
* @param requestOptions Optional fetch request options.
* @returns A Peekalink link preview object.
*/
async preview(link, options = {}, requestOptions = {}) {
const url = this.buildUrl(LINK_PREVIEW_PATH);
const finalOptions = this.buildOptions(options);
const headers = this.buildHeaders();
const body = JSON.stringify({
...finalOptions,
link,
});
const res = await fetch(url, {
...requestOptions,
method: "POST",
headers,
body,
});
if (!res.ok) {
const err = await error_1.PeekalinkError.fromResponse(res);
throw err;
}
const json = await res.json();
return json;
}
}
exports.PeekalinkClient = PeekalinkClient;