@liforma/publisher 0.1.2 → 0.4.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/README.md +11 -2
- package/dist/browser.d.ts +4 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +5 -0
- package/dist/browser.js.map +1 -0
- package/dist/createPublisher.d.ts +170 -83
- package/dist/createPublisher.d.ts.map +1 -1
- package/dist/createPublisher.js +252 -103
- package/dist/createPublisher.js.map +1 -1
- package/dist/errors.d.ts +3 -2
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +0 -1
- package/dist/errors.js.map +1 -1
- package/dist/hash.d.ts +1 -1
- package/dist/hash.d.ts.map +1 -1
- package/dist/http.d.ts +3 -1
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js +8 -23
- package/dist/http.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/jobs.d.ts +7 -5
- package/dist/jobs.d.ts.map +1 -1
- package/dist/jobs.js +49 -52
- package/dist/jobs.js.map +1 -1
- package/dist/retry.d.ts +16 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +52 -0
- package/dist/retry.js.map +1 -0
- package/dist/schemas.d.ts +448 -89
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +122 -36
- package/dist/schemas.js.map +1 -1
- package/dist/upload.d.ts +1 -0
- package/dist/upload.d.ts.map +1 -1
- package/dist/upload.js +41 -18
- package/dist/upload.js.map +1 -1
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/package.json +3 -2
package/dist/http.js
CHANGED
|
@@ -1,27 +1,10 @@
|
|
|
1
1
|
import { isRetryableError, LiformaPublisherError, publisherErrorFromResponse } from './errors.js';
|
|
2
|
-
|
|
3
|
-
|
|
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
|
-
}
|
|
2
|
+
import { exponentialDelayMs, retryAfterMs, sleep } from './retry.js';
|
|
3
|
+
import { PUBLISHER_SDK_VERSION } from './version.js';
|
|
21
4
|
export async function publisherRequest(http, path, schema, options = {}) {
|
|
22
5
|
const method = options.method ?? (options.body === undefined ? 'GET' : 'POST');
|
|
23
6
|
const url = `${http.baseUrl}${path.startsWith('/') ? path : `/${path}`}`;
|
|
24
|
-
const maxAttempts = options.retry ?
|
|
7
|
+
const maxAttempts = options.retry ? http.retryPolicy.maxAttempts : 1;
|
|
25
8
|
let lastError;
|
|
26
9
|
for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
|
|
27
10
|
options.signal?.throwIfAborted();
|
|
@@ -32,6 +15,7 @@ export async function publisherRequest(http, path, schema, options = {}) {
|
|
|
32
15
|
headers: {
|
|
33
16
|
authorization: `Bearer ${http.apiKey}`,
|
|
34
17
|
accept: 'application/json',
|
|
18
|
+
'liforma-publisher-version': PUBLISHER_SDK_VERSION,
|
|
35
19
|
...(options.body === undefined ? {} : { 'content-type': 'application/json' })
|
|
36
20
|
},
|
|
37
21
|
body: options.body === undefined ? undefined : JSON.stringify(options.body),
|
|
@@ -39,13 +23,14 @@ export async function publisherRequest(http, path, schema, options = {}) {
|
|
|
39
23
|
});
|
|
40
24
|
}
|
|
41
25
|
catch (error) {
|
|
26
|
+
options.signal?.throwIfAborted();
|
|
42
27
|
lastError = new LiformaPublisherError(error instanceof Error ? error.message : 'Network request failed.', {
|
|
43
28
|
code: 'NETWORK_ERROR',
|
|
44
29
|
retryable: true,
|
|
45
30
|
cause: error
|
|
46
31
|
});
|
|
47
32
|
if (attempt < maxAttempts) {
|
|
48
|
-
await sleep(
|
|
33
|
+
await sleep(exponentialDelayMs(attempt, http.retryPolicy), options.signal);
|
|
49
34
|
continue;
|
|
50
35
|
}
|
|
51
36
|
throw lastError;
|
|
@@ -54,8 +39,8 @@ export async function publisherRequest(http, path, schema, options = {}) {
|
|
|
54
39
|
if (!response.ok) {
|
|
55
40
|
lastError = publisherErrorFromResponse(response.status, text, response.headers);
|
|
56
41
|
if (options.retry && isRetryableError(lastError) && attempt < maxAttempts) {
|
|
57
|
-
const
|
|
58
|
-
|
|
42
|
+
const delayMs = retryAfterMs(response.headers.get('retry-after')) ??
|
|
43
|
+
exponentialDelayMs(attempt, http.retryPolicy);
|
|
59
44
|
await sleep(delayMs, options.signal);
|
|
60
45
|
continue;
|
|
61
46
|
}
|
package/dist/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
export { createPublisher } from './createPublisher.js';
|
|
2
|
-
export type { BackgroundMode, CreateCharacterInput, CreateClothesInput, CreateExperienceInput, CreateHairInput, CreateLocationInput, CreatePlaceInput, CreatePublisherOptions, Publisher, UpdateExperienceInput } from './createPublisher.js';
|
|
2
|
+
export type { BackgroundMode, CreateCharacterInput, CreateClothesInput, CreateExperienceInput, CreateHairInput, CreateLocationInput, CreatePlaceInput, CreatePublisherOptions, PollableCreateOptions, Publisher, UpdateCharacterInput, UpdateClothesInput, UpdateExperienceInput, UpdateHairInput, UpdatePlaceInput } from './createPublisher.js';
|
|
3
3
|
export type { WaitOptions } from './jobs.js';
|
|
4
|
+
export type { RetryPolicy } from './retry.js';
|
|
4
5
|
export type { ImageBytes } from './hash.js';
|
|
6
|
+
export { MAX_UPLOAD_BYTES } from './upload.js';
|
|
5
7
|
export type { UploadedImage } from './upload.js';
|
|
6
8
|
export { LiformaPublisherError, isRetryableError } from './errors.js';
|
|
7
|
-
export
|
|
9
|
+
export { PERSONA_ETHNICITY_VALUES, PERSONA_GENDER_VALUES } from './schemas.js';
|
|
10
|
+
export type { Avatar, PersonaEthnicity, PersonaGender, AppearanceResourceStatus, PublishJob, PublishJobStatus, PublishResourceStatus, CharacterResource, ClothesResource, CreateClothesPublishResponse, CreateHairPublishResponse, CreateLocationPublishResponse, CreatePublishResponse, DeletedResource, ExperienceResource, ExperienceStatus, HairResource, LocationResource, LocationResourceStatus, PlaceResource } from './schemas.js';
|
|
8
11
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +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,
|
|
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,qBAAqB,EACrB,SAAS,EACT,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,YAAY,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC/E,YAAY,EACX,MAAM,EACN,gBAAgB,EAChB,aAAa,EACb,wBAAwB,EACxB,UAAU,EACV,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,EACf,4BAA4B,EAC5B,yBAAyB,EACzB,6BAA6B,EAC7B,qBAAqB,EACrB,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EAChB,sBAAsB,EACtB,aAAa,EACb,MAAM,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
export { createPublisher } from './createPublisher.js';
|
|
2
|
+
export { MAX_UPLOAD_BYTES } from './upload.js';
|
|
2
3
|
export { LiformaPublisherError, isRetryableError } from './errors.js';
|
|
4
|
+
export { PERSONA_ETHNICITY_VALUES, PERSONA_GENDER_VALUES } from './schemas.js';
|
|
3
5
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAqBvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/jobs.d.ts
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
import { type PublisherHttp } from './http.js';
|
|
2
|
-
import { type
|
|
2
|
+
import { type PublishJob, type CharacterResource, type ClothesResource, type CreatePublishResponse, type HairResource, type LocationResource, type PlaceResource } from './schemas.js';
|
|
3
3
|
export type WaitOptions = {
|
|
4
4
|
readonly signal?: AbortSignal;
|
|
5
5
|
readonly timeoutMs?: number;
|
|
6
|
-
readonly onProgress?: (job:
|
|
6
|
+
readonly onProgress?: (job: PublishJob) => void;
|
|
7
7
|
};
|
|
8
|
-
export declare function getJob(http: PublisherHttp, jobId: string, signal?: AbortSignal): Promise<
|
|
8
|
+
export declare function getJob(http: PublisherHttp, jobId: string, signal?: AbortSignal): Promise<PublishJob>;
|
|
9
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<
|
|
11
|
-
export declare function watchJob(http: PublisherHttp, jobId: string, options?: WaitOptions): AsyncGenerator<
|
|
10
|
+
export declare function waitForJob(http: PublisherHttp, jobId: string, options?: WaitOptions): Promise<PublishJob>;
|
|
11
|
+
export declare function watchJob(http: PublisherHttp, jobId: string, options?: WaitOptions): AsyncGenerator<PublishJob, PublishJob, void>;
|
|
12
12
|
export declare function getClothes(http: PublisherHttp, clothesId: string, signal?: AbortSignal): Promise<ClothesResource>;
|
|
13
13
|
export declare function getHair(http: PublisherHttp, hairId: string, signal?: AbortSignal): Promise<HairResource>;
|
|
14
14
|
export declare function getLocation(http: PublisherHttp, locationId: string, signal?: AbortSignal): Promise<LocationResource>;
|
|
15
|
+
export declare function getCharacter(http: PublisherHttp, characterId: string, signal?: AbortSignal): Promise<CharacterResource>;
|
|
16
|
+
export declare function getPlace(http: PublisherHttp, placeId: string, signal?: AbortSignal): Promise<PlaceResource>;
|
|
15
17
|
//# sourceMappingURL=jobs.d.ts.map
|
package/dist/jobs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../src/jobs.ts"],"names":[],"mappings":"AACA,OAAO,EAAiC,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../src/jobs.ts"],"names":[],"mappings":"AACA,OAAO,EAAiC,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAE9E,OAAO,EAQN,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,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,UAAU,KAAK,IAAI,CAAC;CAChD,CAAC;AAkCF,wBAAsB,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAO1G;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,UAAU,CAAC,CAgCrB;AAED,wBAAuB,QAAQ,CAC9B,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,WAAgB,GACvB,cAAc,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,CAgC9C;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;AAED,wBAAsB,YAAY,CACjC,IAAI,EAAE,aAAa,EACnB,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,iBAAiB,CAAC,CAQ5B;AAED,wBAAsB,QAAQ,CAC7B,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,aAAa,CAAC,CAQxB"}
|
package/dist/jobs.js
CHANGED
|
@@ -1,43 +1,34 @@
|
|
|
1
1
|
import { LiformaPublisherError } from './errors.js';
|
|
2
2
|
import { projectPath, publisherRequest } from './http.js';
|
|
3
|
-
import {
|
|
3
|
+
import { sleep } from './retry.js';
|
|
4
|
+
import { createCharacterResponseSchema, createPlaceResponseSchema, createPublishResponseSchema, getClothesResponseSchema, getHairResponseSchema, getJobResponseSchema, getLocationResponseSchema } from './schemas.js';
|
|
4
5
|
const DEFAULT_TIMEOUT_MS = 10 * 60 * 1000;
|
|
5
6
|
const MIN_POLL_MS = 500;
|
|
6
7
|
const MAX_POLL_MS = 5_000;
|
|
7
8
|
function clampPollDelay(ms) {
|
|
8
9
|
return Math.min(MAX_POLL_MS, Math.max(MIN_POLL_MS, ms));
|
|
9
10
|
}
|
|
10
|
-
function delayUntilNextRun(
|
|
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
|
-
}
|
|
11
|
+
function delayUntilNextRun(attempt) {
|
|
19
12
|
const base = Math.min(MAX_POLL_MS, MIN_POLL_MS * 2 ** Math.min(attempt, 4));
|
|
20
13
|
const jitter = Math.floor(Math.random() * 250);
|
|
21
14
|
return clampPollDelay(base + jitter);
|
|
22
15
|
}
|
|
23
|
-
|
|
24
|
-
if (
|
|
25
|
-
return
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
signal?.addEventListener('abort', onAbort, { once: true });
|
|
40
|
-
});
|
|
16
|
+
function terminalJobError(job) {
|
|
17
|
+
if (job.status === 'failed') {
|
|
18
|
+
return new LiformaPublisherError(job.error?.message ?? `Job ${job.id} failed.`, {
|
|
19
|
+
code: job.error?.code ?? 'JOB_FAILED',
|
|
20
|
+
retryable: false,
|
|
21
|
+
job
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
if (job.status === 'succeeded' && !job.requiredOk) {
|
|
25
|
+
return new LiformaPublisherError(`Job ${job.id} completed without all required artifacts.`, {
|
|
26
|
+
code: 'JOB_INCOMPLETE',
|
|
27
|
+
retryable: false,
|
|
28
|
+
job
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
41
32
|
}
|
|
42
33
|
export async function getJob(http, jobId, signal) {
|
|
43
34
|
const { data } = await publisherRequest(http, projectPath(http, `/jobs/${encodeURIComponent(jobId)}`), getJobResponseSchema, {
|
|
@@ -48,35 +39,34 @@ export async function getJob(http, jobId, signal) {
|
|
|
48
39
|
return data.job;
|
|
49
40
|
}
|
|
50
41
|
export async function retryJob(http, jobId, signal) {
|
|
51
|
-
const { data } = await publisherRequest(http, projectPath(http, `/jobs/${encodeURIComponent(jobId)}/retry`), createPublishResponseSchema, { method: 'POST', signal });
|
|
42
|
+
const { data } = await publisherRequest(http, projectPath(http, `/jobs/${encodeURIComponent(jobId)}/retry`), createPublishResponseSchema, { method: 'POST', signal, retry: true });
|
|
52
43
|
return data;
|
|
53
44
|
}
|
|
54
45
|
export async function waitForJob(http, jobId, options = {}) {
|
|
55
46
|
const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
56
47
|
const deadline = Date.now() + timeoutMs;
|
|
57
48
|
let attempt = 0;
|
|
49
|
+
let lastJob;
|
|
58
50
|
while (true) {
|
|
59
51
|
options.signal?.throwIfAborted();
|
|
60
52
|
if (Date.now() > deadline) {
|
|
61
53
|
throw new LiformaPublisherError(`Timed out waiting for job ${jobId} after ${timeoutMs}ms.`, {
|
|
62
|
-
code: '
|
|
63
|
-
retryable:
|
|
54
|
+
code: 'JOB_WAIT_TIMEOUT',
|
|
55
|
+
retryable: false,
|
|
56
|
+
job: lastJob
|
|
64
57
|
});
|
|
65
58
|
}
|
|
66
59
|
const job = await getJob(http, jobId, options.signal);
|
|
60
|
+
lastJob = job;
|
|
67
61
|
options.onProgress?.(job);
|
|
68
62
|
if (job.status === 'succeeded' && job.requiredOk) {
|
|
69
63
|
return job;
|
|
70
64
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
retryable: false,
|
|
75
|
-
job: job
|
|
76
|
-
});
|
|
77
|
-
}
|
|
65
|
+
const terminalError = terminalJobError(job);
|
|
66
|
+
if (terminalError)
|
|
67
|
+
throw terminalError;
|
|
78
68
|
const remaining = deadline - Date.now();
|
|
79
|
-
const waitMs = Math.min(delayUntilNextRun(
|
|
69
|
+
const waitMs = Math.min(delayUntilNextRun(attempt), Math.max(0, remaining));
|
|
80
70
|
attempt += 1;
|
|
81
71
|
await sleep(waitMs, options.signal);
|
|
82
72
|
}
|
|
@@ -85,43 +75,50 @@ export async function* watchJob(http, jobId, options = {}) {
|
|
|
85
75
|
const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
86
76
|
const deadline = Date.now() + timeoutMs;
|
|
87
77
|
let attempt = 0;
|
|
78
|
+
let lastJob;
|
|
88
79
|
while (true) {
|
|
89
80
|
options.signal?.throwIfAborted();
|
|
90
81
|
if (Date.now() > deadline) {
|
|
91
82
|
throw new LiformaPublisherError(`Timed out waiting for job ${jobId} after ${timeoutMs}ms.`, {
|
|
92
|
-
code: '
|
|
93
|
-
retryable:
|
|
83
|
+
code: 'JOB_WAIT_TIMEOUT',
|
|
84
|
+
retryable: false,
|
|
85
|
+
job: lastJob
|
|
94
86
|
});
|
|
95
87
|
}
|
|
96
88
|
const job = await getJob(http, jobId, options.signal);
|
|
89
|
+
lastJob = job;
|
|
97
90
|
options.onProgress?.(job);
|
|
98
91
|
yield job;
|
|
99
92
|
if (job.status === 'succeeded' && job.requiredOk) {
|
|
100
93
|
return job;
|
|
101
94
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
retryable: false,
|
|
106
|
-
job: job
|
|
107
|
-
});
|
|
108
|
-
}
|
|
95
|
+
const terminalError = terminalJobError(job);
|
|
96
|
+
if (terminalError)
|
|
97
|
+
throw terminalError;
|
|
109
98
|
const remaining = deadline - Date.now();
|
|
110
|
-
const waitMs = Math.min(delayUntilNextRun(
|
|
99
|
+
const waitMs = Math.min(delayUntilNextRun(attempt), Math.max(0, remaining));
|
|
111
100
|
attempt += 1;
|
|
112
101
|
await sleep(waitMs, options.signal);
|
|
113
102
|
}
|
|
114
103
|
}
|
|
115
104
|
export async function getClothes(http, clothesId, signal) {
|
|
116
105
|
const { data } = await publisherRequest(http, projectPath(http, `/clothes/${encodeURIComponent(clothesId)}`), getClothesResponseSchema, { method: 'GET', signal, retry: true });
|
|
117
|
-
return data.
|
|
106
|
+
return data.clothes;
|
|
118
107
|
}
|
|
119
108
|
export async function getHair(http, hairId, signal) {
|
|
120
109
|
const { data } = await publisherRequest(http, projectPath(http, `/hair/${encodeURIComponent(hairId)}`), getHairResponseSchema, { method: 'GET', signal, retry: true });
|
|
121
|
-
return data.
|
|
110
|
+
return data.hair;
|
|
122
111
|
}
|
|
123
112
|
export async function getLocation(http, locationId, signal) {
|
|
124
113
|
const { data } = await publisherRequest(http, projectPath(http, `/locations/${encodeURIComponent(locationId)}`), getLocationResponseSchema, { method: 'GET', signal, retry: true });
|
|
125
|
-
return data.
|
|
114
|
+
return data.location;
|
|
115
|
+
}
|
|
116
|
+
export async function getCharacter(http, characterId, signal) {
|
|
117
|
+
const { data } = await publisherRequest(http, projectPath(http, `/characters/${encodeURIComponent(characterId)}`), createCharacterResponseSchema, { method: 'GET', signal, retry: true });
|
|
118
|
+
return data.character;
|
|
119
|
+
}
|
|
120
|
+
export async function getPlace(http, placeId, signal) {
|
|
121
|
+
const { data } = await publisherRequest(http, projectPath(http, `/places/${encodeURIComponent(placeId)}`), createPlaceResponseSchema, { method: 'GET', signal, retry: true });
|
|
122
|
+
return data.place;
|
|
126
123
|
}
|
|
127
124
|
//# sourceMappingURL=jobs.js.map
|
package/dist/jobs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../src/jobs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAsB,MAAM,WAAW,CAAC;AAC9E,OAAO,EACN,2BAA2B,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,
|
|
1
|
+
{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../src/jobs.ts"],"names":[],"mappings":"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"}
|
package/dist/retry.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type RetryPolicy = {
|
|
2
|
+
readonly maxAttempts?: number;
|
|
3
|
+
readonly baseDelayMs?: number;
|
|
4
|
+
readonly maxDelayMs?: number;
|
|
5
|
+
};
|
|
6
|
+
export type ResolvedRetryPolicy = {
|
|
7
|
+
readonly maxAttempts: number;
|
|
8
|
+
readonly baseDelayMs: number;
|
|
9
|
+
readonly maxDelayMs: number;
|
|
10
|
+
};
|
|
11
|
+
export declare const DEFAULT_RETRY_POLICY: ResolvedRetryPolicy;
|
|
12
|
+
export declare function resolveRetryPolicy(policy?: RetryPolicy): ResolvedRetryPolicy;
|
|
13
|
+
export declare function exponentialDelayMs(attempt: number, policy: Pick<ResolvedRetryPolicy, 'baseDelayMs' | 'maxDelayMs'>): number;
|
|
14
|
+
export declare function retryAfterMs(value: string | null, now?: number): number | undefined;
|
|
15
|
+
export declare function sleep(ms: number, signal?: AbortSignal): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,mBAIlC,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,mBAAmB,CAM5E;AAED,wBAAgB,kBAAkB,CACjC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,IAAI,CAAC,mBAAmB,EAAE,aAAa,GAAG,YAAY,CAAC,GAC7D,MAAM,CAER;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,SAAa,GAAG,MAAM,GAAG,SAAS,CAOvF;AAED,wBAAsB,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB3E"}
|
package/dist/retry.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export const DEFAULT_RETRY_POLICY = {
|
|
2
|
+
maxAttempts: 3,
|
|
3
|
+
baseDelayMs: 100,
|
|
4
|
+
maxDelayMs: 5_000
|
|
5
|
+
};
|
|
6
|
+
export function resolveRetryPolicy(policy) {
|
|
7
|
+
return {
|
|
8
|
+
maxAttempts: positiveInteger(policy?.maxAttempts, DEFAULT_RETRY_POLICY.maxAttempts),
|
|
9
|
+
baseDelayMs: nonNegativeInteger(policy?.baseDelayMs, DEFAULT_RETRY_POLICY.baseDelayMs),
|
|
10
|
+
maxDelayMs: nonNegativeInteger(policy?.maxDelayMs, DEFAULT_RETRY_POLICY.maxDelayMs)
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export function exponentialDelayMs(attempt, policy) {
|
|
14
|
+
return Math.min(policy.maxDelayMs, policy.baseDelayMs * 2 ** Math.max(0, attempt - 1));
|
|
15
|
+
}
|
|
16
|
+
export function retryAfterMs(value, now = Date.now()) {
|
|
17
|
+
if (!value)
|
|
18
|
+
return undefined;
|
|
19
|
+
const seconds = Number(value);
|
|
20
|
+
if (Number.isFinite(seconds) && seconds >= 0)
|
|
21
|
+
return Math.round(seconds * 1_000);
|
|
22
|
+
const date = Date.parse(value);
|
|
23
|
+
if (!Number.isFinite(date))
|
|
24
|
+
return undefined;
|
|
25
|
+
return Math.max(0, date - now);
|
|
26
|
+
}
|
|
27
|
+
export async function sleep(ms, signal) {
|
|
28
|
+
if (ms <= 0)
|
|
29
|
+
return;
|
|
30
|
+
await new Promise((resolve, reject) => {
|
|
31
|
+
const timer = setTimeout(() => {
|
|
32
|
+
signal?.removeEventListener('abort', onAbort);
|
|
33
|
+
resolve();
|
|
34
|
+
}, ms);
|
|
35
|
+
const onAbort = () => {
|
|
36
|
+
clearTimeout(timer);
|
|
37
|
+
reject(signal?.reason ?? new DOMException('Aborted', 'AbortError'));
|
|
38
|
+
};
|
|
39
|
+
if (signal?.aborted) {
|
|
40
|
+
onAbort();
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
function positiveInteger(value, fallback) {
|
|
47
|
+
return Number.isInteger(value) && value !== undefined && value > 0 ? value : fallback;
|
|
48
|
+
}
|
|
49
|
+
function nonNegativeInteger(value, fallback) {
|
|
50
|
+
return Number.isInteger(value) && value !== undefined && value >= 0 ? value : fallback;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"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"}
|