Skip to content

Commit

Permalink
*: v2 support
Browse files Browse the repository at this point in the history
  • Loading branch information
montyanderson committed Oct 2, 2024
1 parent d5120c6 commit 30c7c31
Show file tree
Hide file tree
Showing 2 changed files with 102 additions and 1 deletion.
2 changes: 1 addition & 1 deletion tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,5 @@
"baseUrl": ".",
"declaration": true
},
"files": ["prodia.ts"]
"files": ["prodia.ts", "v2/index.ts"]
}
101 changes: 101 additions & 0 deletions v2/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
type JsonObject = {[Key in string]: JsonValue} & {[Key in string]?: JsonValue | undefined};
type JsonArray = JsonValue[] | readonly JsonValue[];
type JsonPrimitive = string | number | boolean | null;
type JsonValue = JsonPrimitive | JsonObject | JsonArray;

/* job and job configuration */

export type ProdiaJob = Record<string, JsonValue>;

export type ProdiaJobOptions = {
accept: "image/png" |
"image/jpeg" |
"image/webp" |
"multipart/form-data" |
"video/mp4";
};

const defaultJobOptions: ProdiaJobOptions = {
accept: "image/jpeg",
};

export type ProdiaJobResponse = {
arrayBuffer: () => Promise<ArrayBuffer>; // we only support direct image response now
};

/* client & client configuration*/

export type Prodia = {
job: (params: ProdiaJob, options?: Partial<ProdiaJobOptions>) => Promise<ProdiaJobResponse>;
};

export type CreateProdiaOptions = {
token: string;
baseUrl?: string;
maxErrors?: number;
maxRetries?: number;
};

/* error types */

export class ProdiaCapacityError extends Error {}
export class ProdiaBadResponseError extends Error {}

export const createProdia = ({
token,
baseUrl = "https://inference.prodia.com/v2",
maxErrors = 1,
maxRetries = Infinity,
}: CreateProdiaOptions): Prodia => {
const job = async (params: ProdiaJob, _options?: Partial<ProdiaJobOptions>) => {
const options = {
...defaultJobOptions,
..._options
};

let response: Response;

let errors = 0;
let retries = 0;

do {
response = await fetch(`${baseUrl}/job`, {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
Accept: options.accept,
},
body: JSON.stringify(params),
});

if(response.status === 429) {
retries += 1;
} else if(response.status < 200 || response.status > 299) {
errors += 1;
}

const retryAfter = Number(response.headers.get("Retry-After")) || 1;
await new Promise(resolve => setTimeout(resolve, retryAfter * 1000));
} while (
(response.status < 200 || response.status > 299) &&
errors <= maxErrors &&
retries <= maxRetries
);

if(response.status === 429) {
throw new ProdiaCapacityError("CapacityError: Unable to schedule job with current token");
}

if(response.status < 200 || response.status > 299) {
throw new ProdiaBadResponseError("BadResponseError: Invalid response from Prodia API");
}

return {
arrayBuffer: () => response.arrayBuffer(),
};
};

return {
job,
};
};

0 comments on commit 30c7c31

Please sign in to comment.