@miragari/client 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.
@@ -0,0 +1,153 @@
1
+ import { createMediaRouterError, MediaRouterException, } from "@miragari/core";
2
+ import { normalizeTerminalJob } from "./terminal.js";
3
+ const JOB_STATUSES = new Set(["queued", "running", "succeeded", "failed", "cancelled"]);
4
+ const MEDIA_TYPES = new Set(["image", "video", "audio", "model3d", "file"]);
5
+ export function normalizeProviderCreateOutput(output, context) {
6
+ if (!isRecord(output)) {
7
+ throw providerContractError("Provider returned invalid create output", context, output);
8
+ }
9
+ if (output.kind === "completed") {
10
+ if (!("result" in output)) {
11
+ throw providerContractError("Provider completed output is missing result", context, output);
12
+ }
13
+ const result = normalizeProviderResult(output.result, context);
14
+ const completedAt = result.timings?.completedAt ?? new Date().toISOString();
15
+ return {
16
+ id: result.jobId,
17
+ type: result.type,
18
+ provider: result.provider,
19
+ providerId: result.providerId,
20
+ model: result.model,
21
+ status: "succeeded",
22
+ result,
23
+ resolved: result.resolved,
24
+ createdAt: result.timings?.createdAt ?? completedAt,
25
+ updatedAt: completedAt,
26
+ };
27
+ }
28
+ if (output.kind === "pending") {
29
+ if (!("job" in output)) {
30
+ throw providerContractError("Provider pending output is missing job", context, output);
31
+ }
32
+ return normalizeProviderJob(output.job, context);
33
+ }
34
+ throw providerContractError("Provider returned invalid create output", context, output);
35
+ }
36
+ export function normalizeProviderJob(job, context) {
37
+ if (!isRecord(job)) {
38
+ throw providerContractError("Provider returned invalid job", context, job);
39
+ }
40
+ const status = job.status;
41
+ if (typeof status !== "string" || !JOB_STATUSES.has(status)) {
42
+ throw providerContractError("Provider returned invalid job status", context, job);
43
+ }
44
+ assertString(job.id, "id", job, context);
45
+ assertMediaType(job.type, "type", job, context);
46
+ assertString(job.provider, "provider", job, context);
47
+ assertString(job.providerId, "providerId", job, context);
48
+ assertString(job.model, "model", job, context);
49
+ const validatedJob = job;
50
+ assertMatchesContext(validatedJob, context, "job");
51
+ if (status === "succeeded" && "result" in job && job.result != null) {
52
+ const result = normalizeProviderResult(job.result, context);
53
+ if (result.jobId !== job.id) {
54
+ throw providerContractError("Provider job result jobId does not match job id", context, job);
55
+ }
56
+ return normalizeTerminalJob({
57
+ ...job,
58
+ result,
59
+ });
60
+ }
61
+ if (status !== "succeeded" && "result" in job && job.result != null) {
62
+ throw providerContractError("Provider job result is only allowed for succeeded jobs", context, job);
63
+ }
64
+ return normalizeTerminalJob(job);
65
+ }
66
+ export function normalizeProviderResult(result, context) {
67
+ if (!isRecord(result)) {
68
+ throw providerContractError("Provider returned invalid result", context, result);
69
+ }
70
+ assertString(result.id, "id", result, context);
71
+ assertString(result.jobId, "jobId", result, context);
72
+ assertMediaType(result.type, "type", result, context);
73
+ assertString(result.provider, "provider", result, context);
74
+ assertString(result.providerId, "providerId", result, context);
75
+ assertString(result.model, "model", result, context);
76
+ const validatedResult = result;
77
+ assertMatchesContext(validatedResult, context, "result");
78
+ if (result.status !== "succeeded") {
79
+ throw providerContractError("Provider returned invalid result status", context, result);
80
+ }
81
+ if (!Array.isArray(result.assets)) {
82
+ throw providerContractError("Provider result assets must be an array", context, result);
83
+ }
84
+ result.assets.forEach((asset, index) => assertMediaAsset(asset, index, result, context));
85
+ return withPrimaryAsset(result);
86
+ }
87
+ export function withPrimaryAsset(result) {
88
+ return {
89
+ ...result,
90
+ asset: result.assets[0],
91
+ };
92
+ }
93
+ function assertString(value, field, raw, context) {
94
+ if (typeof value === "string" && value.length > 0)
95
+ return;
96
+ throw providerContractError(`Provider output field ${field} must be a string`, context, raw);
97
+ }
98
+ function assertMediaType(value, field, raw, context) {
99
+ if (typeof value === "string" && MEDIA_TYPES.has(value))
100
+ return;
101
+ throw providerContractError(`Provider output field ${field} must be a media type`, context, raw);
102
+ }
103
+ function assertMediaAsset(value, index, raw, context) {
104
+ if (!isRecord(value)) {
105
+ throw providerContractError(`Provider result asset ${index} must be an object`, context, raw);
106
+ }
107
+ assertMediaType(value.type, `assets[${index}].type`, raw, context);
108
+ assertOptionalString(value.url, `assets[${index}].url`, raw, context);
109
+ assertOptionalString(value.base64, `assets[${index}].base64`, raw, context);
110
+ assertOptionalString(value.mimeType, `assets[${index}].mimeType`, raw, context);
111
+ assertOptionalNumber(value.width, `assets[${index}].width`, raw, context);
112
+ assertOptionalNumber(value.height, `assets[${index}].height`, raw, context);
113
+ assertOptionalNumber(value.duration, `assets[${index}].duration`, raw, context);
114
+ if (value.metadata != null && !isRecord(value.metadata)) {
115
+ throw providerContractError(`Provider result asset ${index} metadata must be an object`, context, raw);
116
+ }
117
+ }
118
+ function assertOptionalString(value, field, raw, context) {
119
+ if (value == null || typeof value === "string")
120
+ return;
121
+ throw providerContractError(`Provider output field ${field} must be a string`, context, raw);
122
+ }
123
+ function assertOptionalNumber(value, field, raw, context) {
124
+ if (value == null || (typeof value === "number" && Number.isFinite(value) && value >= 0)) {
125
+ return;
126
+ }
127
+ throw providerContractError(`Provider output field ${field} must be a non-negative number`, context, raw);
128
+ }
129
+ function assertMatchesContext(output, context, kind) {
130
+ if (output.provider !== context.provider) {
131
+ throw providerContractError(`Provider ${kind} provider does not match request provider`, context, output);
132
+ }
133
+ if (context.providerId && output.providerId !== context.providerId) {
134
+ throw providerContractError(`Provider ${kind} providerId does not match runtime providerId`, context, output);
135
+ }
136
+ if (output.model !== context.model) {
137
+ throw providerContractError(`Provider ${kind} model does not match request model`, context, output);
138
+ }
139
+ if (context.type && output.type !== context.type) {
140
+ throw providerContractError(`Provider ${kind} type does not match request type`, context, output);
141
+ }
142
+ }
143
+ function providerContractError(message, context, raw) {
144
+ return new MediaRouterException(createMediaRouterError("PROVIDER_ERROR", message, {
145
+ provider: context.provider,
146
+ model: context.model,
147
+ raw,
148
+ }));
149
+ }
150
+ function isRecord(value) {
151
+ return Boolean(value && typeof value === "object");
152
+ }
153
+ //# sourceMappingURL=provider-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-output.js","sourceRoot":"","sources":["../src/provider-output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { type ProviderInstanceConfig, type ProviderPlugin, type ProviderRuntimeContext } from "@miragari/core";
2
+ export type ProviderInstanceInput = string | undefined | ProviderInstanceConfig | (Omit<ProviderInstanceConfig, "plugin"> & {
3
+ plugin?: string;
4
+ });
5
+ export type ProviderRegistryInput = {
6
+ plugins: Record<string, ProviderPlugin>;
7
+ providers: Record<string, ProviderInstanceInput>;
8
+ fetch?: typeof fetch;
9
+ };
10
+ export type ProviderRegistryEntry = {
11
+ provider: string;
12
+ plugin: ProviderPlugin;
13
+ config: ProviderInstanceConfig;
14
+ };
15
+ export declare class ProviderRegistry {
16
+ private readonly plugins;
17
+ private readonly providers;
18
+ private readonly fetchImpl;
19
+ constructor(input: ProviderRegistryInput);
20
+ get(providerName: string): {
21
+ plugin: ProviderPlugin;
22
+ config: ProviderInstanceConfig;
23
+ runtime: ProviderRuntimeContext;
24
+ };
25
+ entries(): ProviderRegistryEntry[];
26
+ private requirePlugin;
27
+ }
28
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC5B,MAAM,gBAAgB,CAAA;AAEvB,MAAM,MAAM,qBAAqB,GAC7B,MAAM,GACN,SAAS,GACT,sBAAsB,GACtB,CAAC,IAAI,CAAC,sBAAsB,EAAE,QAAQ,CAAC,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AAElE,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;IACvC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAA;IAChD,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,cAAc,CAAA;IACtB,MAAM,EAAE,sBAAsB,CAAA;CAC/B,CAAA;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;IACxD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAwC;IAClE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;gBAE5B,KAAK,EAAE,qBAAqB;IAaxC,GAAG,CAAC,YAAY,EAAE,MAAM,GAAG;QACzB,MAAM,EAAE,cAAc,CAAA;QACtB,MAAM,EAAE,sBAAsB,CAAA;QAC9B,OAAO,EAAE,sBAAsB,CAAA;KAChC;IA0BD,OAAO,IAAI,qBAAqB,EAAE;IAQlC,OAAO,CAAC,aAAa;CAWtB"}
@@ -0,0 +1,77 @@
1
+ import { createMediaRouterError, MediaRouterException, } from "@miragari/core";
2
+ export class ProviderRegistry {
3
+ plugins;
4
+ providers;
5
+ fetchImpl;
6
+ constructor(input) {
7
+ this.plugins = input.plugins;
8
+ this.providers = normalizeProviders(input.providers);
9
+ this.fetchImpl = input.fetch ?? globalThis.fetch;
10
+ if (!this.fetchImpl) {
11
+ throw new MediaRouterException(createMediaRouterError("BAD_REQUEST", "fetch implementation is required", {
12
+ provider: "registry",
13
+ }));
14
+ }
15
+ }
16
+ get(providerName) {
17
+ if (!Object.prototype.hasOwnProperty.call(this.providers, providerName)) {
18
+ throw new MediaRouterException(createMediaRouterError("BAD_REQUEST", `Unknown provider: ${providerName}`, {
19
+ provider: providerName,
20
+ }));
21
+ }
22
+ const config = this.providers[providerName];
23
+ const plugin = this.requirePlugin(providerName, config.plugin);
24
+ return {
25
+ plugin,
26
+ config,
27
+ runtime: {
28
+ provider: providerName,
29
+ providerId: plugin.id,
30
+ plugin,
31
+ config,
32
+ fetch: this.fetchImpl,
33
+ resolved: {},
34
+ },
35
+ };
36
+ }
37
+ entries() {
38
+ return Object.entries(this.providers).map(([provider, config]) => ({
39
+ provider,
40
+ config,
41
+ plugin: this.requirePlugin(provider, config.plugin),
42
+ }));
43
+ }
44
+ requirePlugin(provider, pluginName) {
45
+ const plugin = this.plugins[pluginName];
46
+ if (!plugin) {
47
+ throw new MediaRouterException(createMediaRouterError("BAD_REQUEST", `Unknown plugin: ${pluginName}`, {
48
+ provider,
49
+ }));
50
+ }
51
+ return plugin;
52
+ }
53
+ }
54
+ function normalizeProviders(providers) {
55
+ return Object.fromEntries(Object.entries(providers).map(([name, config]) => [
56
+ name,
57
+ normalizeProviderConfig(name, config),
58
+ ]));
59
+ }
60
+ function normalizeProviderConfig(name, config) {
61
+ if (config == null) {
62
+ return {
63
+ plugin: name,
64
+ };
65
+ }
66
+ if (typeof config === "string") {
67
+ return {
68
+ plugin: name,
69
+ apiKey: config,
70
+ };
71
+ }
72
+ return {
73
+ ...config,
74
+ plugin: config.plugin ?? name,
75
+ };
76
+ }
77
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type GenerationJob, type GenerationResult, type MediaRouterError } from "@miragari/core";
2
+ export declare function normalizeTerminalJob(job: GenerationJob): GenerationJob;
3
+ export declare function resolveTerminalResult(job: GenerationJob): GenerationResult | undefined;
4
+ export declare function normalizeFailedJobError(job: GenerationJob): MediaRouterError;
5
+ //# sourceMappingURL=terminal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../src/terminal.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACtB,MAAM,gBAAgB,CAAA;AAEvB,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,aAAa,GAAG,aAAa,CAkBtE;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,aAAa,GAAG,gBAAgB,GAAG,SAAS,CAkBtF;AASD,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,aAAa,GAAG,gBAAgB,CAwB5E"}
@@ -0,0 +1,70 @@
1
+ import { createMediaRouterError, MediaRouterException, normalizeMediaRouterError, } from "@miragari/core";
2
+ export function normalizeTerminalJob(job) {
3
+ if (job.status === "succeeded" && !job.result) {
4
+ return {
5
+ ...job,
6
+ status: "failed",
7
+ error: createMediaRouterError("PROVIDER_ERROR", "Succeeded job is missing result", {
8
+ provider: job.provider,
9
+ model: job.model,
10
+ raw: job,
11
+ }),
12
+ updatedAt: new Date().toISOString(),
13
+ };
14
+ }
15
+ if (job.status !== "failed")
16
+ return job;
17
+ return {
18
+ ...job,
19
+ error: normalizeFailedJobError(job),
20
+ };
21
+ }
22
+ export function resolveTerminalResult(job) {
23
+ const normalized = normalizeTerminalJob(job);
24
+ if (normalized.status === "succeeded" && normalized.result) {
25
+ return withPrimaryAsset(normalized.result);
26
+ }
27
+ if (normalized.status === "failed") {
28
+ throw new MediaRouterException(normalizeFailedJobError(normalized));
29
+ }
30
+ if (normalized.status === "cancelled") {
31
+ throw new MediaRouterException(createMediaRouterError("PROVIDER_ERROR", "Generation was cancelled", {
32
+ provider: normalized.provider,
33
+ model: normalized.model,
34
+ raw: normalized.raw,
35
+ }));
36
+ }
37
+ return undefined;
38
+ }
39
+ function withPrimaryAsset(result) {
40
+ return {
41
+ ...result,
42
+ asset: result.assets[0],
43
+ };
44
+ }
45
+ export function normalizeFailedJobError(job) {
46
+ if (!job.error) {
47
+ return createMediaRouterError("PROVIDER_ERROR", "Generation failed", {
48
+ provider: job.provider,
49
+ model: job.model,
50
+ raw: job.raw,
51
+ });
52
+ }
53
+ const normalized = normalizeMediaRouterError(job.error, {
54
+ provider: job.provider,
55
+ model: job.model,
56
+ });
57
+ if (normalized) {
58
+ return {
59
+ ...normalized,
60
+ provider: job.provider,
61
+ model: job.model,
62
+ };
63
+ }
64
+ return createMediaRouterError("UNKNOWN", "Unknown provider error", {
65
+ provider: job.provider,
66
+ model: job.model,
67
+ raw: job.error,
68
+ });
69
+ }
70
+ //# sourceMappingURL=terminal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal.js","sourceRoot":"","sources":["../src/terminal.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,yBAAyB,GAI1B,MAAM,gBAAgB,CAAA;AAEvB,MAAM,UAAU,oBAAoB,CAAC,GAAkB;IACrD,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QAC9C,OAAO;YACL,GAAG,GAAG;YACN,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,sBAAsB,CAAC,gBAAgB,EAAE,iCAAiC,EAAE;gBACjF,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,GAAG,EAAE,GAAG;aACT,CAAC;YACF,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAA;IACH,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAA;IACvC,OAAO;QACL,GAAG,GAAG;QACN,KAAK,EAAE,uBAAuB,CAAC,GAAG,CAAC;KACpC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAkB;IACtD,MAAM,UAAU,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAA;IAC5C,IAAI,UAAU,CAAC,MAAM,KAAK,WAAW,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;QAC3D,OAAO,gBAAgB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IAC5C,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACnC,MAAM,IAAI,oBAAoB,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC,CAAA;IACrE,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACtC,MAAM,IAAI,oBAAoB,CAC5B,sBAAsB,CAAC,gBAAgB,EAAE,0BAA0B,EAAE;YACnE,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,KAAK,EAAE,UAAU,CAAC,KAAK;YACvB,GAAG,EAAE,UAAU,CAAC,GAAG;SACpB,CAAC,CACH,CAAA;IACH,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAwB;IAChD,OAAO;QACL,GAAG,MAAM;QACT,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;KACxB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAkB;IACxD,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QACf,OAAO,sBAAsB,CAAC,gBAAgB,EAAE,mBAAmB,EAAE;YACnE,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,GAAG,EAAE,GAAG,CAAC,GAAG;SACb,CAAC,CAAA;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,yBAAyB,CAAC,GAAG,CAAC,KAAK,EAAE;QACtD,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,KAAK,EAAE,GAAG,CAAC,KAAK;KACjB,CAAC,CAAA;IACF,IAAI,UAAU,EAAE,CAAC;QACf,OAAO;YACL,GAAG,UAAU;YACb,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,KAAK,EAAE,GAAG,CAAC,KAAK;SACjB,CAAA;IACH,CAAC;IACD,OAAO,sBAAsB,CAAC,SAAS,EAAE,wBAAwB,EAAE;QACjE,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,GAAG,EAAE,GAAG,CAAC,KAAK;KACf,CAAC,CAAA;AACJ,CAAC"}
package/dist/wait.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import { type GenerationJob, type GenerationResult, type ProviderRuntimeContext } from "@miragari/core";
2
+ export type WaitOptions = {
3
+ timeoutMs?: number;
4
+ intervalMs?: number;
5
+ onProgress?: (job: GenerationJob) => void;
6
+ };
7
+ export type WaitRuntimeResolver = (provider: string) => ProviderRuntimeContext;
8
+ export declare function waitForJob(input: {
9
+ job: GenerationJob;
10
+ runtime?: ProviderRuntimeContext;
11
+ resolveProvider?: WaitRuntimeResolver;
12
+ options?: WaitOptions;
13
+ }): Promise<GenerationResult>;
14
+ //# sourceMappingURL=wait.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wait.d.ts","sourceRoot":"","sources":["../src/wait.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,gBAAgB,EAGrB,KAAK,sBAAsB,EAC5B,MAAM,gBAAgB,CAAA;AAKvB,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAA;CAC1C,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,sBAAsB,CAAA;AAa9E,wBAAsB,UAAU,CAAC,KAAK,EAAE;IACtC,GAAG,EAAE,aAAa,CAAA;IAClB,OAAO,CAAC,EAAE,sBAAsB,CAAA;IAChC,eAAe,CAAC,EAAE,mBAAmB,CAAA;IACrC,OAAO,CAAC,EAAE,WAAW,CAAA;CACtB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA8D5B"}
package/dist/wait.js ADDED
@@ -0,0 +1,168 @@
1
+ import { createMediaRouterError, MediaRouterException, normalizeMediaRouterError, } from "@miragari/core";
2
+ import { reduceBatchTerminalJob } from "./batch.js";
3
+ import { normalizeProviderJob } from "./provider-output.js";
4
+ import { normalizeFailedJobError, resolveTerminalResult } from "./terminal.js";
5
+ const DEFAULT_TIMEOUT_MS = 10 * 60 * 1000;
6
+ const DEFAULT_INTERVAL_MS = 5 * 1000;
7
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
8
+ function normalizeDelayMs(delayMs, fallbackMs) {
9
+ if (delayMs == null)
10
+ return fallbackMs;
11
+ if (!Number.isFinite(delayMs) || delayMs < 0)
12
+ return fallbackMs;
13
+ return delayMs;
14
+ }
15
+ export async function waitForJob(input) {
16
+ const timeoutMs = input.options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;
17
+ const intervalMs = normalizeDelayMs(input.options?.intervalMs, DEFAULT_INTERVAL_MS);
18
+ const started = Date.now();
19
+ let job = input.job;
20
+ if (job.status === "failed" || job.status === "cancelled") {
21
+ resolveTerminalResult(job);
22
+ }
23
+ if (job.children?.length)
24
+ return waitForBatchJob({ ...input, job });
25
+ const initialResult = resolveTerminalResult(job);
26
+ if (initialResult)
27
+ return initialResult;
28
+ if (!input.runtime) {
29
+ throw new MediaRouterException(createMediaRouterError("BAD_REQUEST", "Provider runtime is required", {
30
+ provider: job.provider,
31
+ model: job.model,
32
+ }));
33
+ }
34
+ if (!input.runtime.plugin.driver.poll) {
35
+ throw new MediaRouterException(createMediaRouterError("BAD_REQUEST", "Provider does not support status polling", {
36
+ provider: job.provider,
37
+ model: job.model,
38
+ }));
39
+ }
40
+ while (Date.now() - started < timeoutMs) {
41
+ try {
42
+ job = normalizeProviderJob(await input.runtime.plugin.driver.poll({ ...input.runtime, job }), {
43
+ provider: job.provider,
44
+ providerId: job.providerId,
45
+ model: job.model,
46
+ type: job.type,
47
+ });
48
+ }
49
+ catch (error) {
50
+ if (Date.now() - started >= timeoutMs)
51
+ break;
52
+ throw new MediaRouterException(normalizePollError(error, input.runtime, job));
53
+ }
54
+ if (Date.now() - started >= timeoutMs)
55
+ break;
56
+ input.options?.onProgress?.(job);
57
+ const result = resolveTerminalResult(job);
58
+ if (result)
59
+ return result;
60
+ const remainingMs = timeoutMs - (Date.now() - started);
61
+ if (remainingMs <= 0)
62
+ break;
63
+ await sleep(Math.min(normalizeDelayMs(job.pollAfterMs, intervalMs), remainingMs));
64
+ }
65
+ throw new MediaRouterException(createMediaRouterError("TIMEOUT", "Timed out waiting for generation result", {
66
+ provider: job.provider,
67
+ model: job.model,
68
+ retryable: true,
69
+ }));
70
+ }
71
+ function normalizePollError(error, runtime, job) {
72
+ const fallback = { provider: job.provider, model: job.model };
73
+ const normalized = normalizeMediaRouterError(error, fallback);
74
+ if (normalized)
75
+ return normalized;
76
+ const custom = runtime.plugin.driver.normalizeError?.(error, { job, runtime });
77
+ const normalizedCustom = normalizeMediaRouterError(custom, fallback);
78
+ if (normalizedCustom)
79
+ return normalizedCustom;
80
+ if (custom)
81
+ return normalizeFallbackError(custom, fallback);
82
+ return createMediaRouterError("UNKNOWN", errorMessage(error), {
83
+ provider: fallback.provider,
84
+ model: fallback.model,
85
+ raw: error,
86
+ });
87
+ }
88
+ function normalizeFallbackError(error, fallback) {
89
+ return createMediaRouterError("UNKNOWN", errorMessage(error), {
90
+ provider: fallback.provider,
91
+ model: fallback.model,
92
+ raw: error,
93
+ });
94
+ }
95
+ function errorMessage(error) {
96
+ if (error instanceof Error)
97
+ return error.message;
98
+ if (typeof error === "object" &&
99
+ error &&
100
+ "message" in error &&
101
+ typeof error.message === "string") {
102
+ return error.message;
103
+ }
104
+ return "Unknown provider error";
105
+ }
106
+ async function waitForBatchJob(input) {
107
+ const children = input.job.children ?? [];
108
+ const partialFailure = partialFailureMode(input.job);
109
+ const settled = await Promise.all(children.map(async (child) => {
110
+ try {
111
+ const runtime = child.status === "queued" || child.status === "running"
112
+ ? input.resolveProvider?.(child.provider) ?? input.runtime
113
+ : input.runtime;
114
+ const result = await waitForJob({
115
+ job: child,
116
+ runtime,
117
+ resolveProvider: input.resolveProvider,
118
+ options: input.options,
119
+ });
120
+ return { child, result };
121
+ }
122
+ catch (error) {
123
+ const normalized = normalizeBatchChildError(error, child);
124
+ if (partialFailure === "fail")
125
+ throw new MediaRouterException(normalized);
126
+ return { child, error: normalized };
127
+ }
128
+ }));
129
+ const completedAt = new Date().toISOString();
130
+ const reduced = reduceBatchTerminalJob({
131
+ job: input.job,
132
+ children: settled.map((item) => "result" in item
133
+ ? { ...item.child, status: "succeeded", result: item.result }
134
+ : { ...item.child, status: "failed", error: item.error }),
135
+ completedAt,
136
+ partialFailure,
137
+ failureMessage: partialFailure === "return-successful"
138
+ ? "All batch children failed"
139
+ : "Batch completed without successful assets",
140
+ });
141
+ if (reduced.status === "succeeded" && reduced.result)
142
+ return reduced.result;
143
+ throw new MediaRouterException(reduced.error ??
144
+ createMediaRouterError("PROVIDER_ERROR", "Batch completed without successful assets", {
145
+ provider: input.job.provider,
146
+ model: input.job.model,
147
+ raw: settled,
148
+ }));
149
+ }
150
+ function partialFailureMode(job) {
151
+ return job.providerState?.partialFailure === "return-successful"
152
+ ? "return-successful"
153
+ : "fail";
154
+ }
155
+ function normalizeBatchChildError(error, child) {
156
+ const fallback = { provider: child.provider, model: child.model };
157
+ const normalized = normalizeMediaRouterError(error, fallback);
158
+ if (normalized)
159
+ return normalized;
160
+ if (child.error)
161
+ return normalizeFailedJobError({ ...child, status: "failed" });
162
+ return createMediaRouterError("UNKNOWN", errorMessage(error), {
163
+ provider: child.provider,
164
+ model: child.model,
165
+ raw: error,
166
+ });
167
+ }
168
+ //# sourceMappingURL=wait.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wait.js","sourceRoot":"","sources":["../src/wait.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@miragari/client",
3
+ "version": "0.1.0",
4
+ "description": "Client SDK for routing media generation requests across provider plugins.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "license": "UNLICENSED",
9
+ "author": "Zehight",
10
+ "homepage": "https://github.com/Zehight/mediaRouter#readme",
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "git+https://github.com/Zehight/mediaRouter.git",
14
+ "directory": "packages/client"
15
+ },
16
+ "bugs": {
17
+ "url": "https://github.com/Zehight/mediaRouter/issues"
18
+ },
19
+ "sideEffects": false,
20
+ "publishConfig": {
21
+ "access": "public"
22
+ },
23
+ "keywords": [
24
+ "media-router",
25
+ "sdk",
26
+ "ai",
27
+ "image-generation",
28
+ "video-generation"
29
+ ],
30
+ "files": [
31
+ "dist",
32
+ "README.md",
33
+ "LICENSE"
34
+ ],
35
+ "exports": {
36
+ ".": {
37
+ "types": "./dist/index.d.ts",
38
+ "import": "./dist/index.js"
39
+ }
40
+ },
41
+ "dependencies": {
42
+ "@miragari/core": "0.1.0"
43
+ },
44
+ "scripts": {
45
+ "build": "tsc -p tsconfig.json",
46
+ "typecheck": "tsc -p tsconfig.json --noEmit",
47
+ "typecheck:test": "tsc -p tsconfig.test.json",
48
+ "test": "vitest run"
49
+ }
50
+ }