@unkey/api
Version:
<div align="center"> <h1 align="center">@unkey/api</h1> <h5>`@unkey/api` is a TypeScript client for Unkey. If you prefer a typed experience over calling HTTP endpoints directly, this SDK is for you.</h5> </div>
443 lines (437 loc) • 11.7 kB
JavaScript
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/index.ts
var src_exports = {};
__export(src_exports, {
Unkey: () => Unkey,
and: () => import_rbac.and,
or: () => import_rbac.or,
verifyKey: () => verifyKey
});
module.exports = __toCommonJS(src_exports);
// package.json
var version = "0.36.0";
// src/telemetry.ts
function getTelemetry(opts) {
let platform;
let runtime;
const sdkVersions = [`/api@${version}`];
try {
if (typeof process !== "undefined") {
if (process.env.UNKEY_DISABLE_TELEMETRY) {
return null;
}
platform = process.env.VERCEL ? "vercel" : process.env.AWS_REGION ? "aws" : void 0;
if (typeof EdgeRuntime !== "undefined") {
runtime = "edge-light";
} else {
runtime = `node@${process.version}`;
}
}
if (opts.wrapperSdkVersion) {
sdkVersions.push(opts.wrapperSdkVersion);
}
} catch (_error) {
}
return { platform, runtime, sdkVersions };
}
// src/client.ts
var Unkey = class {
baseUrl;
rootKey;
cache;
telemetry;
retry;
constructor(opts) {
this.baseUrl = opts.baseUrl ?? "https://api.unkey.dev";
this.rootKey = opts.rootKey ?? opts.token;
if (!opts.disableTelemetry) {
this.telemetry = getTelemetry(opts);
}
this.cache = opts.cache;
if (!this.rootKey) {
throw new Error(
"Unkey root key must be set, maybe you passed in `undefined` or an empty string?"
);
}
this.retry = {
attempts: opts.retry?.attempts ?? 5,
backoff: opts.retry?.backoff ?? ((n) => Math.round(Math.exp(n) * 10))
};
}
getHeaders() {
const headers = {
"Content-Type": "application/json",
Authorization: `Bearer ${this.rootKey}`
};
if (this.telemetry?.sdkVersions) {
headers["Unkey-Telemetry-SDK"] = this.telemetry.sdkVersions.join(",");
}
if (this.telemetry?.platform) {
headers["Unkey-Telemetry-Platform"] = this.telemetry.platform;
}
if (this.telemetry?.runtime) {
headers["Unkey-Telemetry-Runtime"] = this.telemetry.runtime;
}
return headers;
}
async fetch(req) {
let res = null;
let err = null;
for (let i = 0; i <= this.retry.attempts; i++) {
const url = new URL(`${this.baseUrl}/${req.path.join("/")}`);
if (req.query) {
for (const [k, v] of Object.entries(req.query)) {
if (typeof v === "undefined" || v === null) {
continue;
}
url.searchParams.set(k, v.toString());
}
}
res = await fetch(url, {
method: req.method,
headers: this.getHeaders(),
cache: this.cache,
body: JSON.stringify(req.body)
}).catch((e) => {
err = e;
return null;
});
if (res && res.status >= 200 && res.status <= 299) {
return { result: await res.json() };
}
if (res && res.status >= 400 && res.status <= 499) {
return await res.json();
}
const backoff = this.retry.backoff(i);
console.debug(
`attempt ${i + 1} of ${this.retry.attempts + 1} to reach ${url} failed, retrying in ${backoff} ms: status=${res?.status} | ${res?.headers.get("unkey-request-id")}`
);
await new Promise((r) => setTimeout(r, backoff));
}
if (res) {
return await res.json();
}
return {
error: {
// @ts-ignore
code: "FETCH_ERROR",
// @ts-ignore I don't understand why `err` is `never`
message: err?.message ?? "No response",
docs: "https://developer.mozilla.org/en-US/docs/Web/API/fetch",
requestId: "N/A"
}
};
}
get keys() {
return {
create: async (req) => {
return await this.fetch({
path: ["v1", "keys.createKey"],
method: "POST",
body: req
});
},
addPermissions: async (req) => {
return await this.fetch({
path: ["v1", "keys.addPermissions"],
method: "POST",
body: req
});
},
setPermissions: async (req) => {
return await this.fetch({
path: ["v1", "keys.setPermissions"],
method: "POST",
body: req
});
},
removePermissions: async (req) => {
return await this.fetch({
path: ["v1", "keys.removePermissions"],
method: "POST",
body: req
});
},
addRoles: async (req) => {
return await this.fetch({
path: ["v1", "keys.addRoles"],
method: "POST",
body: req
});
},
removeRoles: async (req) => {
return await this.fetch({
path: ["v1", "keys.removeRoles"],
method: "POST",
body: req
});
},
setRoles: async (req) => {
return await this.fetch({
path: ["v1", "keys.setRoles"],
method: "POST",
body: req
});
},
update: async (req) => {
return await this.fetch({
path: ["v1", "keys.updateKey"],
method: "POST",
body: req
});
},
verify: async (req) => {
return await this.fetch({
path: ["v1", "keys.verifyKey"],
method: "POST",
body: req
});
},
delete: async (req) => {
return await this.fetch({
path: ["v1", "keys.deleteKey"],
method: "POST",
body: req
});
},
updateRemaining: async (req) => {
return await this.fetch({
path: ["v1", "keys.updateRemaining"],
method: "POST",
body: req
});
},
get: async (req) => {
return await this.fetch({
path: ["v1", "keys.getKey"],
method: "GET",
query: req
});
},
getVerifications: async (req) => {
return await this.fetch({
path: ["v1", "keys.getVerifications"],
method: "GET",
query: req
});
}
};
}
get apis() {
return {
create: async (req) => {
return await this.fetch({
path: ["v1", "apis.createApi"],
method: "POST",
body: req
});
},
delete: async (req) => {
return await this.fetch({
path: ["v1", "apis.deleteApi"],
method: "POST",
body: req
});
},
get: async (req) => {
return await this.fetch({
path: ["v1", "apis.getApi"],
method: "GET",
query: req
});
},
listKeys: async (req) => {
return await this.fetch({
path: ["v1", "apis.listKeys"],
method: "GET",
query: req
});
}
};
}
get permissions() {
return {
createRole: async (req) => {
return await this.fetch({
path: ["v1", "permissions.createRole"],
method: "POST",
body: req
});
},
getRole: async (req) => {
return await this.fetch({
path: ["v1", "permissions.getRole"],
method: "GET",
query: req
});
},
deleteRole: async (req) => {
return await this.fetch({
path: ["v1", "permissions.deleteRole"],
method: "POST",
body: req
});
},
createPermission: async (req) => {
return await this.fetch({
path: ["v1", "permissions.createPermission"],
method: "POST",
body: req
});
},
getPermission: async (req) => {
return await this.fetch({
path: ["v1", "permissions.getPermission"],
method: "GET",
query: req
});
},
deletePermission: async (req) => {
return await this.fetch({
path: ["v1", "permissions.deletePermission"],
method: "POST",
body: req
});
}
};
}
get ratelimits() {
return {
limit: async (req) => {
return await this.fetch({
path: ["v1", "ratelimits.limit"],
method: "POST",
body: req
});
},
getOverride: async (req) => {
return await this.fetch({
path: ["v1", "ratelimits.getOverride"],
method: "GET",
query: req
});
},
listOverrides: async (req) => {
return await this.fetch({
path: ["v1", "ratelimits.listOverrides"],
method: "GET",
query: req
});
},
setOverride: async (req) => {
return await this.fetch({
path: ["v1", "ratelimits.setOverride"],
method: "POST",
body: req
});
},
deleteOverride: async (req) => {
return await this.fetch({
path: ["v1", "ratelimits.deleteOverride"],
method: "POST",
body: req
});
}
};
}
get identities() {
return {
create: async (req) => {
return await this.fetch({
path: ["v1", "identities.createIdentity"],
method: "POST",
body: req
});
},
get: async (req) => {
return await this.fetch({
path: ["v1", "identities.getIdentity"],
method: "GET",
query: req
});
},
list: async (req) => {
return await this.fetch({
path: ["v1", "identities.listIdentities"],
method: "GET",
query: req
});
},
delete: async (req) => {
return await this.fetch({
path: ["v1", "identities.deleteIdentity"],
method: "POST",
body: req
});
},
update: async (req) => {
return await this.fetch({
path: ["v1", "identities.updateIdentity"],
method: "POST",
body: req
});
}
};
}
get analytics() {
return {
getVerifications: async (req) => {
return await this.fetch({
path: ["v1", "analytics.getVerifications"],
method: "GET",
query: req
});
}
};
}
get migrations() {
return {
createKeys: async (req) => {
return await this.fetch({
path: ["v1", "migrations.createKeys"],
method: "POST",
body: req
});
},
enqueueKeys: async (req) => {
return await this.fetch({
path: ["v1", "migrations.enqueueKeys"],
method: "POST",
body: req
});
}
};
}
};
// src/verify.ts
function verifyKey(req) {
const unkey = new Unkey({ rootKey: "public" });
return unkey.keys.verify(typeof req === "string" ? { key: req } : req);
}
// src/index.ts
var import_rbac = require("@unkey/rbac");
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
Unkey,
and,
or,
verifyKey
});
//# sourceMappingURL=index.js.map