@proofkit/fmdapi
Version:
FileMaker Data API client
80 lines (79 loc) • 3.11 kB
JavaScript
var __defProp = Object.defineProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
import { FileMakerError } from "../client-types.js";
import { memoryStore } from "../tokenStore/memory.js";
import { BaseFetchAdapter } from "./fetch-base.js";
class FetchAdapter extends BaseFetchAdapter {
constructor(args) {
var _a;
super({ ...args, refreshToken: true });
__publicField(this, "username");
__publicField(this, "password");
__publicField(this, "tokenStore");
__publicField(this, "getTokenKey");
/**
* Gets a FileMaker Data API token for authentication.
*
* This token is **NOT** guaranteed to be valid, since it expires 15 minutes after the last use. Pass `refresh=true` to forcibly get a fresh token
*
* @param args.refresh - If true, forces getting a new token instead of using cached token
* @internal This method is intended for internal use, you should not need to use it in most cases.
*/
__publicField(this, "getToken", async (args) => {
const { refresh = false } = args ?? {};
let token = null;
if (!refresh) {
token = await this.tokenStore.getToken(this.getTokenKey());
}
if (!token) {
const res = await fetch(`${this.baseUrl}/sessions`, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Basic ${Buffer.from(
`${this.username}:${this.password}`
).toString("base64")}`
}
});
if (!res.ok) {
const data = await res.json();
throw new FileMakerError(
data.messages[0].code,
data.messages[0].message
);
}
token = res.headers.get("X-FM-Data-Access-Token");
if (!token) throw new Error("Could not get token");
this.tokenStore.setToken(this.getTokenKey(), token);
}
return token;
});
__publicField(this, "disconnect", async () => {
const token = await this.tokenStore.getToken(this.getTokenKey());
if (token) {
await this.request({
url: `/sessions/${token}`,
method: "DELETE",
fetchOptions: {
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
}
}
});
this.tokenStore.clearToken(this.getTokenKey());
}
});
this.username = args.auth.username;
this.password = args.auth.password;
this.tokenStore = args.tokenStore ?? memoryStore();
this.getTokenKey = ((_a = args.tokenStore) == null ? void 0 : _a.getKey) ?? (() => `${args.server}/${args.db}`);
if (this.username === "") throw new Error("Username is required");
if (this.password === "") throw new Error("Password is required");
}
}
export {
FetchAdapter
};
//# sourceMappingURL=fetch.js.map