|
class RgthreeApi { |
|
constructor(baseUrl) { |
|
this.getCheckpointsPromise = null; |
|
this.getSamplersPromise = null; |
|
this.getSchedulersPromise = null; |
|
this.getLorasPromise = null; |
|
this.getWorkflowsPromise = null; |
|
this.baseUrl = baseUrl || "./rgthree/api"; |
|
} |
|
apiURL(route) { |
|
return `${this.baseUrl}${route}`; |
|
} |
|
fetchApi(route, options) { |
|
return fetch(this.apiURL(route), options); |
|
} |
|
async fetchJson(route, options) { |
|
const r = await this.fetchApi(route, options); |
|
return await r.json(); |
|
} |
|
async postJson(route, json) { |
|
const body = new FormData(); |
|
body.append("json", JSON.stringify(json)); |
|
return await rgthreeApi.fetchJson(route, { method: "POST", body }); |
|
} |
|
getLoras(force = false) { |
|
if (!this.getLorasPromise || force) { |
|
this.getLorasPromise = this.fetchJson("/loras", { cache: "no-store" }); |
|
} |
|
return this.getLorasPromise; |
|
} |
|
async fetchApiJsonOrNull(route, options) { |
|
const response = await this.fetchJson(route, options); |
|
if (response.status === 200 && response.data) { |
|
return response.data || null; |
|
} |
|
return null; |
|
} |
|
async getLorasInfo(...args) { |
|
return this.getModelInfo("loras", ...args); |
|
} |
|
async refreshLorasInfo(file) { |
|
return this.refreshModelInfo("loras", file); |
|
} |
|
async clearLorasInfo(file) { |
|
return this.clearModelInfo("loras", file); |
|
} |
|
async saveLoraInfo(file, data) { |
|
return this.saveModelInfo("loras", file, data); |
|
} |
|
async getModelInfo(type, ...args) { |
|
const params = new URLSearchParams(); |
|
const isSingle = typeof args[0] == "string"; |
|
if (isSingle) { |
|
params.set("file", args[0]); |
|
} |
|
params.set("light", (isSingle ? args[1] : args[0]) === false ? "0" : "1"); |
|
const path = `/${type}/info?` + params.toString(); |
|
return await this.fetchApiJsonOrNull(path); |
|
} |
|
async refreshModelInfo(type, file) { |
|
const path = `/${type}/info/refresh` + (file ? `?file=${encodeURIComponent(file)}` : ""); |
|
const infos = await this.fetchApiJsonOrNull(path); |
|
return infos; |
|
} |
|
async clearModelInfo(type, file) { |
|
const path = `/${type}/info/clear` + (file ? `?file=${encodeURIComponent(file)}` : ""); |
|
await this.fetchApiJsonOrNull(path); |
|
return; |
|
} |
|
async saveModelInfo(type, file, data) { |
|
const body = new FormData(); |
|
body.append("json", JSON.stringify(data)); |
|
return await this.fetchApiJsonOrNull(`/${type}/info?file=${encodeURIComponent(file)}`, { cache: "no-store", method: "POST", body }); |
|
} |
|
} |
|
export const rgthreeApi = new RgthreeApi(); |
|
|