@liforma/publisher 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +23 -0
- package/dist/createPublisher.d.ts +282 -0
- package/dist/createPublisher.d.ts.map +1 -0
- package/dist/createPublisher.js +194 -0
- package/dist/createPublisher.js.map +1 -0
- package/dist/errors.d.ts +21 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +64 -0
- package/dist/errors.js.map +1 -0
- package/dist/hash.d.ts +4 -0
- package/dist/hash.d.ts.map +1 -0
- package/dist/hash.js +21 -0
- package/dist/hash.js.map +1 -0
- package/dist/http.d.ts +20 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +93 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs.d.ts +15 -0
- package/dist/jobs.d.ts.map +1 -0
- package/dist/jobs.js +127 -0
- package/dist/jobs.js.map +1 -0
- package/dist/runtime.d.ts +4 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +19 -0
- package/dist/runtime.js.map +1 -0
- package/dist/schemas.d.ts +384 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +199 -0
- package/dist/schemas.js.map +1 -0
- package/dist/upload.d.ts +18 -0
- package/dist/upload.d.ts.map +1 -0
- package/dist/upload.js +67 -0
- package/dist/upload.js.map +1 -0
- package/package.json +47 -0
package/dist/hash.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { LiformaPublisherError } from './errors.js';
|
|
3
|
+
export async function toUint8Array(input) {
|
|
4
|
+
if (typeof Buffer !== 'undefined' && Buffer.isBuffer(input)) {
|
|
5
|
+
return new Uint8Array(input);
|
|
6
|
+
}
|
|
7
|
+
if (input instanceof Uint8Array) {
|
|
8
|
+
return input;
|
|
9
|
+
}
|
|
10
|
+
if (input instanceof ArrayBuffer) {
|
|
11
|
+
return new Uint8Array(input);
|
|
12
|
+
}
|
|
13
|
+
if (typeof Blob !== 'undefined' && input instanceof Blob) {
|
|
14
|
+
return new Uint8Array(await input.arrayBuffer());
|
|
15
|
+
}
|
|
16
|
+
throw new LiformaPublisherError('Unsupported image input type.', { code: 'INVALID_IMAGE_INPUT' });
|
|
17
|
+
}
|
|
18
|
+
export function sha256Hex(bytes) {
|
|
19
|
+
return createHash('sha256').update(bytes).digest('hex');
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=hash.js.map
|
package/dist/hash.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAIpD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAiB;IACnD,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7D,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IACD,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC;IACd,CAAC;IACD,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;QAClC,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IACD,IAAI,OAAO,IAAI,KAAK,WAAW,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QAC1D,OAAO,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,MAAM,IAAI,qBAAqB,CAAC,+BAA+B,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC,CAAC;AACnG,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAiB;IAC1C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC"}
|
package/dist/http.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { z } from 'zod';
|
|
2
|
+
export type PublisherHttp = {
|
|
3
|
+
readonly baseUrl: string;
|
|
4
|
+
readonly apiKey: string;
|
|
5
|
+
readonly fetchImpl: typeof fetch;
|
|
6
|
+
readonly projectId: string;
|
|
7
|
+
};
|
|
8
|
+
export type RequestOptions = {
|
|
9
|
+
readonly method?: 'GET' | 'POST' | 'PATCH';
|
|
10
|
+
readonly body?: unknown;
|
|
11
|
+
readonly signal?: AbortSignal;
|
|
12
|
+
readonly retry?: boolean;
|
|
13
|
+
};
|
|
14
|
+
export declare function publisherRequest<T>(http: PublisherHttp, path: string, schema: z.ZodType<T>, options?: RequestOptions): Promise<{
|
|
15
|
+
data: T;
|
|
16
|
+
status: number;
|
|
17
|
+
headers: Headers;
|
|
18
|
+
}>;
|
|
19
|
+
export declare function projectPath(http: PublisherHttp, suffix: string): string;
|
|
20
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAI7B,MAAM,MAAM,aAAa,GAAG;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,OAAO,KAAK,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;IAC3C,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAqBF,wBAAsB,gBAAgB,CAAC,CAAC,EACvC,IAAI,EAAE,aAAa,EACnB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,cAAmB,GAC1B,OAAO,CAAC;IAAE,IAAI,EAAE,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CA0ExD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGvE"}
|
package/dist/http.js
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { isRetryableError, LiformaPublisherError, publisherErrorFromResponse } from './errors.js';
|
|
2
|
+
async function sleep(ms, signal) {
|
|
3
|
+
if (ms <= 0)
|
|
4
|
+
return;
|
|
5
|
+
await new Promise((resolve, reject) => {
|
|
6
|
+
const timer = setTimeout(() => {
|
|
7
|
+
signal?.removeEventListener('abort', onAbort);
|
|
8
|
+
resolve();
|
|
9
|
+
}, ms);
|
|
10
|
+
const onAbort = () => {
|
|
11
|
+
clearTimeout(timer);
|
|
12
|
+
reject(signal?.reason ?? new DOMException('Aborted', 'AbortError'));
|
|
13
|
+
};
|
|
14
|
+
if (signal?.aborted) {
|
|
15
|
+
onAbort();
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
export async function publisherRequest(http, path, schema, options = {}) {
|
|
22
|
+
const method = options.method ?? (options.body === undefined ? 'GET' : 'POST');
|
|
23
|
+
const url = `${http.baseUrl}${path.startsWith('/') ? path : `/${path}`}`;
|
|
24
|
+
const maxAttempts = options.retry ? 3 : 1;
|
|
25
|
+
let lastError;
|
|
26
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
|
|
27
|
+
options.signal?.throwIfAborted();
|
|
28
|
+
let response;
|
|
29
|
+
try {
|
|
30
|
+
response = await http.fetchImpl(url, {
|
|
31
|
+
method,
|
|
32
|
+
headers: {
|
|
33
|
+
authorization: `Bearer ${http.apiKey}`,
|
|
34
|
+
accept: 'application/json',
|
|
35
|
+
...(options.body === undefined ? {} : { 'content-type': 'application/json' })
|
|
36
|
+
},
|
|
37
|
+
body: options.body === undefined ? undefined : JSON.stringify(options.body),
|
|
38
|
+
signal: options.signal
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
lastError = new LiformaPublisherError(error instanceof Error ? error.message : 'Network request failed.', {
|
|
43
|
+
code: 'NETWORK_ERROR',
|
|
44
|
+
retryable: true,
|
|
45
|
+
cause: error
|
|
46
|
+
});
|
|
47
|
+
if (attempt < maxAttempts) {
|
|
48
|
+
await sleep(100 * 2 ** (attempt - 1), options.signal);
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
throw lastError;
|
|
52
|
+
}
|
|
53
|
+
const text = await response.text();
|
|
54
|
+
if (!response.ok) {
|
|
55
|
+
lastError = publisherErrorFromResponse(response.status, text, response.headers);
|
|
56
|
+
if (options.retry && isRetryableError(lastError) && attempt < maxAttempts) {
|
|
57
|
+
const retryAfter = Number(response.headers.get('retry-after'));
|
|
58
|
+
const delayMs = Number.isFinite(retryAfter) && retryAfter > 0 ? retryAfter * 1000 : 100 * 2 ** (attempt - 1);
|
|
59
|
+
await sleep(delayMs, options.signal);
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
throw lastError;
|
|
63
|
+
}
|
|
64
|
+
let json;
|
|
65
|
+
try {
|
|
66
|
+
json = text ? JSON.parse(text) : {};
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
throw new LiformaPublisherError('API returned invalid JSON.', {
|
|
70
|
+
code: 'INVALID_RESPONSE',
|
|
71
|
+
status: response.status,
|
|
72
|
+
requestId: response.headers.get('Liforma-Request-Id') ?? undefined,
|
|
73
|
+
cause: error
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
const parsed = schema.safeParse(json);
|
|
77
|
+
if (!parsed.success) {
|
|
78
|
+
throw new LiformaPublisherError('API response failed schema validation.', {
|
|
79
|
+
code: 'INVALID_RESPONSE',
|
|
80
|
+
status: response.status,
|
|
81
|
+
requestId: response.headers.get('Liforma-Request-Id') ?? undefined,
|
|
82
|
+
details: { issues: parsed.error.issues }
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
return { data: parsed.data, status: response.status, headers: response.headers };
|
|
86
|
+
}
|
|
87
|
+
throw lastError ?? new LiformaPublisherError('Request failed.', { code: 'HTTP_ERROR' });
|
|
88
|
+
}
|
|
89
|
+
export function projectPath(http, suffix) {
|
|
90
|
+
const clean = suffix.startsWith('/') ? suffix : `/${suffix}`;
|
|
91
|
+
return `/v1/projects/${encodeURIComponent(http.projectId)}${clean}`;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=http.js.map
|
package/dist/http.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { createPublisher } from './createPublisher.js';
|
|
2
|
+
export type { BackgroundMode, CreateCharacterInput, CreateClothesInput, CreateExperienceInput, CreateHairInput, CreateLocationInput, CreatePlaceInput, CreatePublisherOptions, Publisher, UpdateExperienceInput } from './createPublisher.js';
|
|
3
|
+
export type { WaitOptions } from './jobs.js';
|
|
4
|
+
export type { ImageBytes } from './hash.js';
|
|
5
|
+
export type { UploadedImage } from './upload.js';
|
|
6
|
+
export { LiformaPublisherError, isRetryableError } from './errors.js';
|
|
7
|
+
export type { AuthoringAvatar, AuthoringJob, CharacterResource, ClothesResource, CreatePublishResponse, ExperienceResource, HairResource, LocationResource, PlaceResource } from './schemas.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EACX,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EAChB,sBAAsB,EACtB,SAAS,EACT,qBAAqB,EACrB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,YAAY,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACtE,YAAY,EACX,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,MAAM,cAAc,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAgBvD,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/jobs.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type PublisherHttp } from './http.js';
|
|
2
|
+
import { type AuthoringJob, type ClothesResource, type CreatePublishResponse, type HairResource, type LocationResource } from './schemas.js';
|
|
3
|
+
export type WaitOptions = {
|
|
4
|
+
readonly signal?: AbortSignal;
|
|
5
|
+
readonly timeoutMs?: number;
|
|
6
|
+
readonly onProgress?: (job: AuthoringJob) => void;
|
|
7
|
+
};
|
|
8
|
+
export declare function getJob(http: PublisherHttp, jobId: string, signal?: AbortSignal): Promise<AuthoringJob>;
|
|
9
|
+
export declare function retryJob(http: PublisherHttp, jobId: string, signal?: AbortSignal): Promise<CreatePublishResponse>;
|
|
10
|
+
export declare function waitForJob(http: PublisherHttp, jobId: string, options?: WaitOptions): Promise<AuthoringJob>;
|
|
11
|
+
export declare function watchJob(http: PublisherHttp, jobId: string, options?: WaitOptions): AsyncGenerator<AuthoringJob, AuthoringJob, void>;
|
|
12
|
+
export declare function getClothes(http: PublisherHttp, clothesId: string, signal?: AbortSignal): Promise<ClothesResource>;
|
|
13
|
+
export declare function getHair(http: PublisherHttp, hairId: string, signal?: AbortSignal): Promise<HairResource>;
|
|
14
|
+
export declare function getLocation(http: PublisherHttp, locationId: string, signal?: AbortSignal): Promise<LocationResource>;
|
|
15
|
+
//# sourceMappingURL=jobs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../src/jobs.ts"],"names":[],"mappings":"AACA,OAAO,EAAiC,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAC9E,OAAO,EAMN,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,WAAW,GAAG;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,IAAI,CAAC;CAClD,CAAC;AA0CF,wBAAsB,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAO5G;AAED,wBAAsB,QAAQ,CAC7B,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,qBAAqB,CAAC,CAQhC;AAED,wBAAsB,UAAU,CAC/B,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,WAAgB,GACvB,OAAO,CAAC,YAAY,CAAC,CAkCvB;AAED,wBAAuB,QAAQ,CAC9B,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,WAAgB,GACvB,cAAc,CAAC,YAAY,EAAE,YAAY,EAAE,IAAI,CAAC,CAkClD;AAED,wBAAsB,UAAU,CAC/B,IAAI,EAAE,aAAa,EACnB,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,eAAe,CAAC,CAQ1B;AAED,wBAAsB,OAAO,CAC5B,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,YAAY,CAAC,CAQvB;AAED,wBAAsB,WAAW,CAChC,IAAI,EAAE,aAAa,EACnB,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,gBAAgB,CAAC,CAQ3B"}
|
package/dist/jobs.js
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { LiformaPublisherError } from './errors.js';
|
|
2
|
+
import { projectPath, publisherRequest } from './http.js';
|
|
3
|
+
import { createPublishResponseSchema, getClothesResponseSchema, getHairResponseSchema, getJobResponseSchema, getLocationResponseSchema } from './schemas.js';
|
|
4
|
+
const DEFAULT_TIMEOUT_MS = 10 * 60 * 1000;
|
|
5
|
+
const MIN_POLL_MS = 500;
|
|
6
|
+
const MAX_POLL_MS = 5_000;
|
|
7
|
+
function clampPollDelay(ms) {
|
|
8
|
+
return Math.min(MAX_POLL_MS, Math.max(MIN_POLL_MS, ms));
|
|
9
|
+
}
|
|
10
|
+
function delayUntilNextRun(job, attempt) {
|
|
11
|
+
if (job.nextRunAt) {
|
|
12
|
+
const target = Date.parse(job.nextRunAt);
|
|
13
|
+
if (Number.isFinite(target)) {
|
|
14
|
+
const delta = target - Date.now();
|
|
15
|
+
if (delta > 0)
|
|
16
|
+
return clampPollDelay(delta);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
const base = Math.min(MAX_POLL_MS, MIN_POLL_MS * 2 ** Math.min(attempt, 4));
|
|
20
|
+
const jitter = Math.floor(Math.random() * 250);
|
|
21
|
+
return clampPollDelay(base + jitter);
|
|
22
|
+
}
|
|
23
|
+
async function sleep(ms, signal) {
|
|
24
|
+
if (ms <= 0)
|
|
25
|
+
return;
|
|
26
|
+
await new Promise((resolve, reject) => {
|
|
27
|
+
const timer = setTimeout(() => {
|
|
28
|
+
signal?.removeEventListener('abort', onAbort);
|
|
29
|
+
resolve();
|
|
30
|
+
}, ms);
|
|
31
|
+
const onAbort = () => {
|
|
32
|
+
clearTimeout(timer);
|
|
33
|
+
reject(signal?.reason ?? new DOMException('Aborted', 'AbortError'));
|
|
34
|
+
};
|
|
35
|
+
if (signal?.aborted) {
|
|
36
|
+
onAbort();
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
export async function getJob(http, jobId, signal) {
|
|
43
|
+
const { data } = await publisherRequest(http, projectPath(http, `/jobs/${encodeURIComponent(jobId)}`), getJobResponseSchema, {
|
|
44
|
+
method: 'GET',
|
|
45
|
+
signal,
|
|
46
|
+
retry: true
|
|
47
|
+
});
|
|
48
|
+
return data.job;
|
|
49
|
+
}
|
|
50
|
+
export async function retryJob(http, jobId, signal) {
|
|
51
|
+
const { data } = await publisherRequest(http, projectPath(http, `/jobs/${encodeURIComponent(jobId)}/retry`), createPublishResponseSchema, { method: 'POST', signal });
|
|
52
|
+
return data;
|
|
53
|
+
}
|
|
54
|
+
export async function waitForJob(http, jobId, options = {}) {
|
|
55
|
+
const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
56
|
+
const deadline = Date.now() + timeoutMs;
|
|
57
|
+
let attempt = 0;
|
|
58
|
+
while (true) {
|
|
59
|
+
options.signal?.throwIfAborted();
|
|
60
|
+
if (Date.now() > deadline) {
|
|
61
|
+
throw new LiformaPublisherError(`Timed out waiting for job ${jobId} after ${timeoutMs}ms.`, {
|
|
62
|
+
code: 'JOB_TIMEOUT',
|
|
63
|
+
retryable: true
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
const job = await getJob(http, jobId, options.signal);
|
|
67
|
+
options.onProgress?.(job);
|
|
68
|
+
if (job.status === 'succeeded' && job.requiredOk) {
|
|
69
|
+
return job;
|
|
70
|
+
}
|
|
71
|
+
if (job.status === 'failed') {
|
|
72
|
+
throw new LiformaPublisherError(job.error?.message ?? `Job ${jobId} failed.`, {
|
|
73
|
+
code: job.error?.code ?? 'JOB_FAILED',
|
|
74
|
+
retryable: false,
|
|
75
|
+
job: job
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
const remaining = deadline - Date.now();
|
|
79
|
+
const waitMs = Math.min(delayUntilNextRun(job, attempt), Math.max(0, remaining));
|
|
80
|
+
attempt += 1;
|
|
81
|
+
await sleep(waitMs, options.signal);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
export async function* watchJob(http, jobId, options = {}) {
|
|
85
|
+
const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
86
|
+
const deadline = Date.now() + timeoutMs;
|
|
87
|
+
let attempt = 0;
|
|
88
|
+
while (true) {
|
|
89
|
+
options.signal?.throwIfAborted();
|
|
90
|
+
if (Date.now() > deadline) {
|
|
91
|
+
throw new LiformaPublisherError(`Timed out waiting for job ${jobId} after ${timeoutMs}ms.`, {
|
|
92
|
+
code: 'JOB_TIMEOUT',
|
|
93
|
+
retryable: true
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
const job = await getJob(http, jobId, options.signal);
|
|
97
|
+
options.onProgress?.(job);
|
|
98
|
+
yield job;
|
|
99
|
+
if (job.status === 'succeeded' && job.requiredOk) {
|
|
100
|
+
return job;
|
|
101
|
+
}
|
|
102
|
+
if (job.status === 'failed') {
|
|
103
|
+
throw new LiformaPublisherError(job.error?.message ?? `Job ${jobId} failed.`, {
|
|
104
|
+
code: job.error?.code ?? 'JOB_FAILED',
|
|
105
|
+
retryable: false,
|
|
106
|
+
job: job
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
const remaining = deadline - Date.now();
|
|
110
|
+
const waitMs = Math.min(delayUntilNextRun(job, attempt), Math.max(0, remaining));
|
|
111
|
+
attempt += 1;
|
|
112
|
+
await sleep(waitMs, options.signal);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
export async function getClothes(http, clothesId, signal) {
|
|
116
|
+
const { data } = await publisherRequest(http, projectPath(http, `/clothes/${encodeURIComponent(clothesId)}`), getClothesResponseSchema, { method: 'GET', signal, retry: true });
|
|
117
|
+
return data.resource;
|
|
118
|
+
}
|
|
119
|
+
export async function getHair(http, hairId, signal) {
|
|
120
|
+
const { data } = await publisherRequest(http, projectPath(http, `/hair/${encodeURIComponent(hairId)}`), getHairResponseSchema, { method: 'GET', signal, retry: true });
|
|
121
|
+
return data.resource;
|
|
122
|
+
}
|
|
123
|
+
export async function getLocation(http, locationId, signal) {
|
|
124
|
+
const { data } = await publisherRequest(http, projectPath(http, `/locations/${encodeURIComponent(locationId)}`), getLocationResponseSchema, { method: 'GET', signal, retry: true });
|
|
125
|
+
return data.resource;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=jobs.js.map
|
package/dist/jobs.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../src/jobs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAEA,wBAAgB,mBAAmB,IAAI,IAAI,CAQ1C;AAED,wBAAgB,aAAa,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CASvD;AAED,wBAAgB,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAGxD"}
|
package/dist/runtime.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { LiformaPublisherError } from './errors.js';
|
|
2
|
+
export function assertServerRuntime() {
|
|
3
|
+
const g = globalThis;
|
|
4
|
+
if (typeof g.window !== 'undefined' || typeof g.document !== 'undefined') {
|
|
5
|
+
throw new LiformaPublisherError('@liforma/publisher is server-only. Call it from Node (or another server runtime), never from a browser.', { code: 'BROWSER_NOT_SUPPORTED' });
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export function resolveApiKey(explicit) {
|
|
9
|
+
const key = (explicit ?? process.env.LIFORMA_API_KEY ?? '').trim();
|
|
10
|
+
if (!key) {
|
|
11
|
+
throw new LiformaPublisherError('Missing API key. Pass apiKey to createPublisher() or set LIFORMA_API_KEY.', { code: 'MISSING_API_KEY' });
|
|
12
|
+
}
|
|
13
|
+
return key;
|
|
14
|
+
}
|
|
15
|
+
export function resolveBaseUrl(explicit) {
|
|
16
|
+
const raw = (explicit ?? process.env.LIFORMA_API_URL ?? 'https://api.liforma.ai').trim();
|
|
17
|
+
return raw.replace(/\/$/, '');
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,UAAU,mBAAmB;IAClC,MAAM,CAAC,GAAG,UAAsD,CAAC;IACjE,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,WAAW,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;QAC1E,MAAM,IAAI,qBAAqB,CAC9B,yGAAyG,EACzG,EAAE,IAAI,EAAE,uBAAuB,EAAE,CACjC,CAAC;IACH,CAAC;AACF,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAiB;IAC9C,MAAM,GAAG,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnE,IAAI,CAAC,GAAG,EAAE,CAAC;QACV,MAAM,IAAI,qBAAqB,CAC9B,2EAA2E,EAC3E,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAC3B,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAiB;IAC/C,MAAM,GAAG,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,wBAAwB,CAAC,CAAC,IAAI,EAAE,CAAC;IACzF,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC/B,CAAC"}
|