@tscomfy/client 0.0.0-stage → 0.2.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 +76 -2
- package/dist/channel.d.ts +54 -0
- package/dist/channel.d.ts.map +1 -0
- package/dist/channel.js +307 -0
- package/dist/channel.js.map +1 -0
- package/dist/client-error.d.ts +15 -0
- package/dist/client-error.d.ts.map +1 -0
- package/dist/client-error.js +16 -0
- package/dist/client-error.js.map +1 -0
- package/dist/connection.d.ts +33 -0
- package/dist/connection.d.ts.map +1 -0
- package/dist/connection.js +35 -0
- package/dist/connection.js.map +1 -0
- package/dist/event-queue.d.ts +16 -0
- package/dist/event-queue.d.ts.map +1 -0
- package/dist/event-queue.js +66 -0
- package/dist/event-queue.js.map +1 -0
- package/dist/events.d.ts +60 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +2 -0
- package/dist/events.js.map +1 -0
- package/dist/files.d.ts +55 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +69 -0
- package/dist/files.js.map +1 -0
- package/dist/frames.d.ts +24 -0
- package/dist/frames.d.ts.map +1 -0
- package/dist/frames.js +71 -0
- package/dist/frames.js.map +1 -0
- package/dist/http.d.ts +28 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +96 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/job.d.ts +59 -0
- package/dist/job.d.ts.map +1 -0
- package/dist/job.js +481 -0
- package/dist/job.js.map +1 -0
- package/dist/outcome.d.ts +47 -0
- package/dist/outcome.d.ts.map +1 -0
- package/dist/outcome.js +2 -0
- package/dist/outcome.js.map +1 -0
- package/dist/outputs.d.ts +53 -0
- package/dist/outputs.d.ts.map +1 -0
- package/dist/outputs.js +21 -0
- package/dist/outputs.js.map +1 -0
- package/dist/read-outputs.d.ts +11 -0
- package/dist/read-outputs.d.ts.map +1 -0
- package/dist/read-outputs.js +142 -0
- package/dist/read-outputs.js.map +1 -0
- package/dist/server-errors.d.ts +7 -0
- package/dist/server-errors.d.ts.map +1 -0
- package/dist/server-errors.js +46 -0
- package/dist/server-errors.js.map +1 -0
- package/dist/server.d.ts +30 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -0
- package/dist/timers.d.ts +11 -0
- package/dist/timers.d.ts.map +1 -0
- package/dist/timers.js +38 -0
- package/dist/timers.js.map +1 -0
- package/dist/url.d.ts +14 -0
- package/dist/url.d.ts.map +1 -0
- package/dist/url.js +39 -0
- package/dist/url.js.map +1 -0
- package/dist/uuid.d.ts +7 -0
- package/dist/uuid.d.ts.map +1 -0
- package/dist/uuid.js +13 -0
- package/dist/uuid.js.map +1 -0
- package/package.json +46 -4
- package/src/channel.ts +334 -0
- package/src/client-error.ts +19 -0
- package/src/connection.ts +59 -0
- package/src/event-queue.ts +70 -0
- package/src/events.ts +76 -0
- package/src/files.ts +119 -0
- package/src/frames.ts +87 -0
- package/src/http.ts +113 -0
- package/src/index.ts +53 -0
- package/src/job.ts +562 -0
- package/src/outcome.ts +52 -0
- package/src/outputs.ts +69 -0
- package/src/read-outputs.ts +171 -0
- package/src/server-errors.ts +61 -0
- package/src/server.ts +29 -0
- package/src/timers.ts +35 -0
- package/src/url.ts +41 -0
- package/src/uuid.ts +12 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type JsonObject, type JsonValue, type NodeId } from "@tscomfy/core";
|
|
2
|
+
import type { FolderType, NodeOutput, NodeRef, Outputs } from "./outputs.ts";
|
|
3
|
+
/** The id of a node given by id, handle or output. */
|
|
4
|
+
export declare function nodeIdOf(node: NodeRef): NodeId;
|
|
5
|
+
/** A node's UI output read leniently: anything unrecognized stays in `ui` only. */
|
|
6
|
+
export declare function readNodeOutput(node: NodeId, ui: JsonObject): NodeOutput;
|
|
7
|
+
/** Builds the outputs map, in the order of `order` (the prompt's node order), unknown ids last. */
|
|
8
|
+
export declare function outputsInOrder(outputs: ReadonlyMap<NodeId, NodeOutput>, order: readonly NodeId[]): Outputs;
|
|
9
|
+
/** One of the server's folder names. */
|
|
10
|
+
export declare function isFolderType(value: JsonValue | undefined): value is FolderType;
|
|
11
|
+
//# sourceMappingURL=read-outputs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-outputs.d.ts","sourceRoot":"","sources":["../src/read-outputs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,KAAK,MAAM,EAAE,MAAM,eAAe,CAAC;AAE1F,OAAO,KAAK,EAAY,UAAU,EAAE,UAAU,EAAE,OAAO,EAAc,OAAO,EAAE,MAAM,cAAc,CAAC;AAEnG,sDAAsD;AACtD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAI9C;AAED,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,GAAG,UAAU,CAqBvE;AAED,mGAAmG;AACnG,wBAAgB,cAAc,CAC5B,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,EACxC,KAAK,EAAE,SAAS,MAAM,EAAE,GACvB,OAAO,CAQT;AAqDD,wCAAwC;AACxC,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,KAAK,IAAI,UAAU,CAE9E"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { isOutputRef } from "@tscomfy/core";
|
|
2
|
+
import { isList, isObject } from "./http.js";
|
|
3
|
+
/** The id of a node given by id, handle or output. */
|
|
4
|
+
export function nodeIdOf(node) {
|
|
5
|
+
if (typeof node === "string")
|
|
6
|
+
return node;
|
|
7
|
+
if (isOutputRef(node))
|
|
8
|
+
return node.node;
|
|
9
|
+
return node.id;
|
|
10
|
+
}
|
|
11
|
+
/** A node's UI output read leniently: anything unrecognized stays in `ui` only. */
|
|
12
|
+
export function readNodeOutput(node, ui) {
|
|
13
|
+
const flags = ui["animated"];
|
|
14
|
+
const animated = isList(flags) && flags.includes(true);
|
|
15
|
+
const files = [];
|
|
16
|
+
for (const [key, value] of Object.entries(ui)) {
|
|
17
|
+
if (!isList(value))
|
|
18
|
+
continue;
|
|
19
|
+
for (const item of value) {
|
|
20
|
+
const file = readFile(key, item, animated);
|
|
21
|
+
if (file !== undefined)
|
|
22
|
+
files.push(file);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
const texts = ui["text"];
|
|
26
|
+
const text = isList(texts)
|
|
27
|
+
? texts.filter((item) => typeof item === "string")
|
|
28
|
+
: [];
|
|
29
|
+
return Object.freeze({
|
|
30
|
+
node,
|
|
31
|
+
files: Object.freeze(files),
|
|
32
|
+
text: Object.freeze(text),
|
|
33
|
+
ui: deepFreeze(ui),
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
/** Builds the outputs map, in the order of `order` (the prompt's node order), unknown ids last. */
|
|
37
|
+
export function outputsInOrder(outputs, order) {
|
|
38
|
+
const position = new Map(order.map((id, index) => [id, index]));
|
|
39
|
+
const sorted = [...outputs.values()].toSorted((a, b) => (position.get(a.node) ?? Number.MAX_SAFE_INTEGER) -
|
|
40
|
+
(position.get(b.node) ?? Number.MAX_SAFE_INTEGER));
|
|
41
|
+
return new FrozenMap(sorted.map((output) => [output.node, output]));
|
|
42
|
+
}
|
|
43
|
+
/** A map nobody can change: what `outcome.outputs` is. */
|
|
44
|
+
class FrozenMap {
|
|
45
|
+
#map;
|
|
46
|
+
constructor(entries) {
|
|
47
|
+
this.#map = new Map(entries);
|
|
48
|
+
Object.freeze(this);
|
|
49
|
+
}
|
|
50
|
+
get size() {
|
|
51
|
+
return this.#map.size;
|
|
52
|
+
}
|
|
53
|
+
get(key) {
|
|
54
|
+
return this.#map.get(key);
|
|
55
|
+
}
|
|
56
|
+
has(key) {
|
|
57
|
+
return this.#map.has(key);
|
|
58
|
+
}
|
|
59
|
+
forEach(callback, thisArg) {
|
|
60
|
+
for (const [key, value] of this.#map)
|
|
61
|
+
callback.call(thisArg, value, key, this);
|
|
62
|
+
}
|
|
63
|
+
entries() {
|
|
64
|
+
return this.#map.entries();
|
|
65
|
+
}
|
|
66
|
+
keys() {
|
|
67
|
+
return this.#map.keys();
|
|
68
|
+
}
|
|
69
|
+
values() {
|
|
70
|
+
return this.#map.values();
|
|
71
|
+
}
|
|
72
|
+
[Symbol.iterator]() {
|
|
73
|
+
return this.#map[Symbol.iterator]();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/** Freezes a JSON value and everything in it. */
|
|
77
|
+
function deepFreeze(value) {
|
|
78
|
+
if (typeof value === "object" && value !== null) {
|
|
79
|
+
for (const item of Object.values(value))
|
|
80
|
+
deepFreeze(item);
|
|
81
|
+
Object.freeze(value);
|
|
82
|
+
}
|
|
83
|
+
return value;
|
|
84
|
+
}
|
|
85
|
+
/** One of the server's folder names. */
|
|
86
|
+
export function isFolderType(value) {
|
|
87
|
+
return value === "output" || value === "temp" || value === "input";
|
|
88
|
+
}
|
|
89
|
+
/** A file entry: `{ filename, subfolder, type }` and maybe `metadata`. */
|
|
90
|
+
function readFile(key, item, animated) {
|
|
91
|
+
if (!isObject(item))
|
|
92
|
+
return undefined;
|
|
93
|
+
const { filename, subfolder, type } = item;
|
|
94
|
+
if (typeof filename !== "string" || filename === "")
|
|
95
|
+
return undefined;
|
|
96
|
+
if (!isFolderType(type))
|
|
97
|
+
return undefined;
|
|
98
|
+
const metadata = isObject(item["metadata"]) ? item["metadata"] : {};
|
|
99
|
+
const kind = kindOf(key, filename, metadata["kind"], animated);
|
|
100
|
+
const file = {
|
|
101
|
+
filename,
|
|
102
|
+
subfolder: typeof subfolder === "string" ? subfolder : "",
|
|
103
|
+
type,
|
|
104
|
+
kind,
|
|
105
|
+
animated: animated && (kind === "image" || kind === "video"),
|
|
106
|
+
key,
|
|
107
|
+
...dimension("width", metadata["width"]),
|
|
108
|
+
...dimension("height", metadata["height"]),
|
|
109
|
+
};
|
|
110
|
+
return Object.freeze(file);
|
|
111
|
+
}
|
|
112
|
+
function dimension(name, value) {
|
|
113
|
+
return typeof value === "number" && Number.isFinite(value) ? { [name]: value } : {};
|
|
114
|
+
}
|
|
115
|
+
const EXTENSIONS = new Map([
|
|
116
|
+
...["png", "jpg", "jpeg", "webp", "gif", "bmp", "tif", "tiff", "avif", "svg"].map((extension) => [extension, "image"]),
|
|
117
|
+
...["mp4", "webm", "mov", "mkv", "avi", "m4v"].map((extension) => [extension, "video"]),
|
|
118
|
+
...["flac", "mp3", "wav", "ogg", "opus", "m4a", "aac"].map((extension) => [extension, "audio"]),
|
|
119
|
+
...["glb", "gltf", "obj", "fbx", "stl", "ply", "splat", "spz", "usdz"].map((extension) => [extension, "3d"]),
|
|
120
|
+
]);
|
|
121
|
+
const KEYS = new Map([
|
|
122
|
+
["images", "image"],
|
|
123
|
+
["audio", "audio"],
|
|
124
|
+
["3d", "3d"],
|
|
125
|
+
]);
|
|
126
|
+
/** The server's own `metadata.kind` first, then the extension, then the key. */
|
|
127
|
+
function kindOf(key, filename, metadataKind, animated) {
|
|
128
|
+
if (metadataKind === "image" || metadataKind === "video" || metadataKind === "audio") {
|
|
129
|
+
return metadataKind;
|
|
130
|
+
}
|
|
131
|
+
const dot = filename.lastIndexOf(".");
|
|
132
|
+
const extension = dot === -1 ? "" : filename.slice(dot + 1).toLowerCase();
|
|
133
|
+
const byExtension = EXTENSIONS.get(extension);
|
|
134
|
+
if (byExtension !== undefined)
|
|
135
|
+
return byExtension;
|
|
136
|
+
const byKey = KEYS.get(key);
|
|
137
|
+
// An animated entry with an unknown extension under `images` is a video (core's video nodes).
|
|
138
|
+
if (byKey === "image" && animated)
|
|
139
|
+
return "video";
|
|
140
|
+
return byKey ?? "file";
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=read-outputs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-outputs.js","sourceRoot":"","sources":["../src/read-outputs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type Diagnostic, type JsonValue } from "@tscomfy/core";
|
|
2
|
+
/**
|
|
3
|
+
* The diagnostics of the server's answer to a prompt: its top-level `error` (only on a
|
|
4
|
+
* rejection) as `E_PROMPT_REJECTED`, then each node error as `E_SERVER_VALIDATION`, by node id.
|
|
5
|
+
*/
|
|
6
|
+
export declare function serverDiagnostics(error: JsonValue | undefined, nodeErrors: JsonValue | undefined): readonly Diagnostic[];
|
|
7
|
+
//# sourceMappingURL=server-errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-errors.d.ts","sourceRoot":"","sources":["../src/server-errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAGlF;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,GAAG,SAAS,EAC5B,UAAU,EAAE,SAAS,GAAG,SAAS,GAChC,SAAS,UAAU,EAAE,CAoBvB"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { createDiagnostic } from "@tscomfy/core";
|
|
2
|
+
import { isList, isObject } from "./http.js";
|
|
3
|
+
/**
|
|
4
|
+
* The diagnostics of the server's answer to a prompt: its top-level `error` (only on a
|
|
5
|
+
* rejection) as `E_PROMPT_REJECTED`, then each node error as `E_SERVER_VALIDATION`, by node id.
|
|
6
|
+
*/
|
|
7
|
+
export function serverDiagnostics(error, nodeErrors) {
|
|
8
|
+
const diagnostics = [];
|
|
9
|
+
if (error !== undefined)
|
|
10
|
+
diagnostics.push(rejection(error));
|
|
11
|
+
if (isObject(nodeErrors)) {
|
|
12
|
+
for (const [node, entry] of Object.entries(nodeErrors)) {
|
|
13
|
+
const listed = isObject(entry) ? entry["errors"] : undefined;
|
|
14
|
+
const errors = isList(listed) ? listed : [entry];
|
|
15
|
+
for (const each of errors) {
|
|
16
|
+
const inputName = isObject(each) ? inputOf(each["extra_info"]) : undefined;
|
|
17
|
+
diagnostics.push(createDiagnostic("E_SERVER_VALIDATION", inputName === undefined ? [node] : [node, "inputs", inputName], describe(each)));
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return Object.freeze(diagnostics);
|
|
22
|
+
}
|
|
23
|
+
/** The top-level error: at the node it names (an unknown class), else at the prompt. */
|
|
24
|
+
function rejection(error) {
|
|
25
|
+
const extra = isObject(error) && isObject(error["extra_info"]) ? error["extra_info"] : {};
|
|
26
|
+
const node = extra["node_id"];
|
|
27
|
+
return createDiagnostic("E_PROMPT_REJECTED", typeof node === "string" && node !== "" ? [node] : [], describe(error));
|
|
28
|
+
}
|
|
29
|
+
function inputOf(extra) {
|
|
30
|
+
const name = isObject(extra) ? extra["input_name"] : undefined;
|
|
31
|
+
return typeof name === "string" && name !== "" ? name : undefined;
|
|
32
|
+
}
|
|
33
|
+
/** `type: message: details`, leaving out the parts the server didn't send. */
|
|
34
|
+
function describe(error) {
|
|
35
|
+
if (typeof error === "string")
|
|
36
|
+
return error;
|
|
37
|
+
if (!isObject(error))
|
|
38
|
+
return "The server reported an error it didn't describe.";
|
|
39
|
+
const parts = [error["type"], error["message"], error["details"]].filter((part) => typeof part === "string" && part !== "");
|
|
40
|
+
// The server repeats the message as the details for some errors.
|
|
41
|
+
const unique = parts.filter((part, index) => parts.indexOf(part) === index);
|
|
42
|
+
return unique.length === 0
|
|
43
|
+
? "The server reported an error it didn't describe."
|
|
44
|
+
: unique.join(": ");
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=server-errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-errors.js","sourceRoot":"","sources":["../src/server-errors.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A ComfyUI server: where it is and how to talk to it. Plain data; every function that needs no
|
|
3
|
+
* websocket takes one, and a {@link Connection} is one too.
|
|
4
|
+
*/
|
|
5
|
+
export interface Server {
|
|
6
|
+
/**
|
|
7
|
+
* The server's http(s) URL. It may have a path prefix and a query (a token, say), which every
|
|
8
|
+
* request and the websocket URL keep: `http://host/comfy/?token=t` gives
|
|
9
|
+
* `http://host/comfy/prompt?token=t`. Credentials (`user:password@`) are refused, because
|
|
10
|
+
* runtimes disagree on them; send them in `headers`.
|
|
11
|
+
*/
|
|
12
|
+
readonly url: string;
|
|
13
|
+
/**
|
|
14
|
+
* Headers for every HTTP request, such as `Authorization`. Not sent on the websocket
|
|
15
|
+
* handshake, which browsers can't give headers; see {@link Server.webSocket}.
|
|
16
|
+
*/
|
|
17
|
+
readonly headers?: Readonly<Record<string, string>>;
|
|
18
|
+
/**
|
|
19
|
+
* Replaces the global `fetch`: the global itself, or a function wrapping it (to add a proxy, a
|
|
20
|
+
* cookie, logging). It is called with a URL and an init.
|
|
21
|
+
*/
|
|
22
|
+
readonly fetch?: (url: URL, init: RequestInit) => Promise<Response>;
|
|
23
|
+
/**
|
|
24
|
+
* Opens the websocket instead of `new WebSocket(url)`. Bun, Node and Deno accept handshake
|
|
25
|
+
* headers this way: `(url) => new WebSocket(url, { headers })` (not standard, so not in the
|
|
26
|
+
* types; browsers throw).
|
|
27
|
+
*/
|
|
28
|
+
readonly webSocket?: (url: string) => WebSocket;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,MAAM;IACrB;;;;;OAKG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACpD;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpE;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,SAAS,CAAC;CACjD"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":""}
|
package/dist/timers.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Waits `ms` milliseconds, or less if `signal` aborts; never rejects. Its timer goes with it, so
|
|
3
|
+
* nothing outlives an abort and keeps a process running.
|
|
4
|
+
*/
|
|
5
|
+
export declare function sleep(ms: number, signal: AbortSignal): Promise<void>;
|
|
6
|
+
/**
|
|
7
|
+
* `promise`, or the signal's reason as soon as it aborts. The promise keeps running either way
|
|
8
|
+
* and is marked handled, so a rejection after the abort goes unreported.
|
|
9
|
+
*/
|
|
10
|
+
export declare function abortable<T>(promise: Promise<T>, signal: AbortSignal | undefined): Promise<T>;
|
|
11
|
+
//# sourceMappingURL=timers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timers.d.ts","sourceRoot":"","sources":["../src/timers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAWpE;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAa7F"}
|
package/dist/timers.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Waits `ms` milliseconds, or less if `signal` aborts; never rejects. Its timer goes with it, so
|
|
3
|
+
* nothing outlives an abort and keeps a process running.
|
|
4
|
+
*/
|
|
5
|
+
export function sleep(ms, signal) {
|
|
6
|
+
if (signal.aborted)
|
|
7
|
+
return Promise.resolve();
|
|
8
|
+
return new Promise((resolve) => {
|
|
9
|
+
const done = () => {
|
|
10
|
+
clearTimeout(timer);
|
|
11
|
+
signal.removeEventListener("abort", done);
|
|
12
|
+
resolve();
|
|
13
|
+
};
|
|
14
|
+
const timer = setTimeout(done, ms);
|
|
15
|
+
signal.addEventListener("abort", done, { once: true });
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* `promise`, or the signal's reason as soon as it aborts. The promise keeps running either way
|
|
20
|
+
* and is marked handled, so a rejection after the abort goes unreported.
|
|
21
|
+
*/
|
|
22
|
+
export function abortable(promise, signal) {
|
|
23
|
+
if (signal === undefined)
|
|
24
|
+
return promise;
|
|
25
|
+
promise.catch(() => undefined);
|
|
26
|
+
if (signal.aborted)
|
|
27
|
+
return Promise.reject(signal.reason);
|
|
28
|
+
return new Promise((resolve, reject) => {
|
|
29
|
+
const abort = () => {
|
|
30
|
+
reject(signal.reason);
|
|
31
|
+
};
|
|
32
|
+
signal.addEventListener("abort", abort, { once: true });
|
|
33
|
+
promise.then(resolve, reject).finally(() => {
|
|
34
|
+
signal.removeEventListener("abort", abort);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=timers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timers.js","sourceRoot":"","sources":["../src/timers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,KAAK,CAAC,EAAU,EAAE,MAAmB;IACnD,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC7C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAG,GAAS,EAAE;YACtB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC1C,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QACF,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACnC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAI,OAAmB,EAAE,MAA+B;IAC/E,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC;IACzC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC/B,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACzD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,GAAS,EAAE;YACvB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YACzC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/url.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Server } from "./server.ts";
|
|
2
|
+
/**
|
|
3
|
+
* The server's base URL, checked. Throws a `TypeError` for a URL that isn't http(s), has
|
|
4
|
+
* credentials or a fragment. The URL isn't echoed: it may hold a token.
|
|
5
|
+
*/
|
|
6
|
+
export declare function baseUrl(server: Server): URL;
|
|
7
|
+
/** An endpoint under the server's path, keeping its query: `http://h/api/?t=1` → `…/api/x?t=1`. */
|
|
8
|
+
export declare function endpoint(base: URL, path: string, query?: Readonly<Record<string, string>>): URL;
|
|
9
|
+
/**
|
|
10
|
+
* A URL fit for messages: without query or fragment, which is where servers expect tokens.
|
|
11
|
+
* `http://host/api?token=t` → `http://host/api`.
|
|
12
|
+
*/
|
|
13
|
+
export declare function shownUrl(url: URL): string;
|
|
14
|
+
//# sourceMappingURL=url.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../src/url.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C;;;GAGG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAe3C;AAED,mGAAmG;AACnG,wBAAgB,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,GAAG,CAK/F;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAKzC"}
|
package/dist/url.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The server's base URL, checked. Throws a `TypeError` for a URL that isn't http(s), has
|
|
3
|
+
* credentials or a fragment. The URL isn't echoed: it may hold a token.
|
|
4
|
+
*/
|
|
5
|
+
export function baseUrl(server) {
|
|
6
|
+
if (typeof server.url !== "string" || !URL.canParse(server.url)) {
|
|
7
|
+
throw new TypeError("server.url is not a valid URL");
|
|
8
|
+
}
|
|
9
|
+
const url = new URL(server.url);
|
|
10
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") {
|
|
11
|
+
throw new TypeError("server.url must be an http(s) URL");
|
|
12
|
+
}
|
|
13
|
+
if (url.username !== "" || url.password !== "") {
|
|
14
|
+
throw new TypeError("server.url can't hold credentials; send them in server.headers");
|
|
15
|
+
}
|
|
16
|
+
if (url.hash !== "") {
|
|
17
|
+
throw new TypeError("server.url can't have a #fragment: it never reaches the server");
|
|
18
|
+
}
|
|
19
|
+
return url;
|
|
20
|
+
}
|
|
21
|
+
/** An endpoint under the server's path, keeping its query: `http://h/api/?t=1` → `…/api/x?t=1`. */
|
|
22
|
+
export function endpoint(base, path, query) {
|
|
23
|
+
const url = new URL(base.href);
|
|
24
|
+
url.pathname = `${url.pathname.replace(/\/+$/, "")}/${path}`;
|
|
25
|
+
for (const [key, value] of Object.entries(query ?? {}))
|
|
26
|
+
url.searchParams.set(key, value);
|
|
27
|
+
return url;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* A URL fit for messages: without query or fragment, which is where servers expect tokens.
|
|
31
|
+
* `http://host/api?token=t` → `http://host/api`.
|
|
32
|
+
*/
|
|
33
|
+
export function shownUrl(url) {
|
|
34
|
+
const shown = new URL(url.href);
|
|
35
|
+
shown.search = "";
|
|
36
|
+
shown.hash = "";
|
|
37
|
+
return shown.href;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=url.js.map
|
package/dist/url.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.js","sourceRoot":"","sources":["../src/url.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,MAAc;IACpC,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,SAAS,CAAC,+BAA+B,CAAC,CAAC;IACvD,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1D,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,EAAE,CAAC;QAC/C,MAAM,IAAI,SAAS,CAAC,gEAAgE,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,GAAG,CAAC,IAAI,KAAK,EAAE,EAAE,CAAC;QACpB,MAAM,IAAI,SAAS,CAAC,gEAAgE,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,QAAQ,CAAC,IAAS,EAAE,IAAY,EAAE,KAAwC;IACxF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,GAAG,CAAC,QAAQ,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;IAC7D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;QAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACzF,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAQ;IAC/B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC;IAClB,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC;IAChB,OAAO,KAAK,CAAC,IAAI,CAAC;AACpB,CAAC"}
|
package/dist/uuid.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A random UUID (version 4) in the canonical lowercase form ComfyUI requires of a prompt id.
|
|
3
|
+
* Built from `crypto.getRandomValues`, which, unlike `crypto.randomUUID`, browsers also offer on
|
|
4
|
+
* pages that aren't a secure context (`http://192.168.…`).
|
|
5
|
+
*/
|
|
6
|
+
export declare function randomUuid(): string;
|
|
7
|
+
//# sourceMappingURL=uuid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uuid.d.ts","sourceRoot":"","sources":["../src/uuid.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAMnC"}
|
package/dist/uuid.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A random UUID (version 4) in the canonical lowercase form ComfyUI requires of a prompt id.
|
|
3
|
+
* Built from `crypto.getRandomValues`, which, unlike `crypto.randomUUID`, browsers also offer on
|
|
4
|
+
* pages that aren't a secure context (`http://192.168.…`).
|
|
5
|
+
*/
|
|
6
|
+
export function randomUuid() {
|
|
7
|
+
const bytes = crypto.getRandomValues(new Uint8Array(16));
|
|
8
|
+
bytes[6] = ((bytes[6] ?? 0) & 0x0f) | 0x40;
|
|
9
|
+
bytes[8] = ((bytes[8] ?? 0) & 0x3f) | 0x80;
|
|
10
|
+
const hex = [...bytes].map((byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
11
|
+
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=uuid.js.map
|
package/dist/uuid.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uuid.js","sourceRoot":"","sources":["../src/uuid.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,KAAK,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;IACzD,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3C,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3C,MAAM,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClF,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;AAC7G,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,48 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tscomfy/client",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Runs tscomfy workflows on a ComfyUI server: queueing, live progress and previews, outputs, uploads.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"client",
|
|
7
|
+
"comfyui",
|
|
8
|
+
"typescript",
|
|
9
|
+
"websocket",
|
|
10
|
+
"workflow"
|
|
11
|
+
],
|
|
12
|
+
"homepage": "https://github.com/TheeKia/tscomfy/tree/main/packages/client#readme",
|
|
13
|
+
"bugs": "https://github.com/TheeKia/tscomfy/issues",
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "git+https://github.com/TheeKia/tscomfy.git",
|
|
18
|
+
"directory": "packages/client"
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist",
|
|
22
|
+
"!dist/**/*.tsbuildinfo",
|
|
23
|
+
"src"
|
|
24
|
+
],
|
|
25
|
+
"type": "module",
|
|
26
|
+
"sideEffects": false,
|
|
27
|
+
"exports": {
|
|
28
|
+
".": {
|
|
29
|
+
"@tscomfy/source": "./src/index.ts",
|
|
30
|
+
"types": "./dist/index.d.ts",
|
|
31
|
+
"default": "./dist/index.js"
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"publishConfig": {
|
|
35
|
+
"access": "public"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"@tscomfy/core": "0.2.0",
|
|
39
|
+
"@tscomfy/fixtures": "0.0.0"
|
|
40
|
+
},
|
|
41
|
+
"peerDependencies": {
|
|
42
|
+
"@tscomfy/core": "^0.2.0"
|
|
43
|
+
},
|
|
44
|
+
"engines": {
|
|
45
|
+
"bun": ">=1.4",
|
|
46
|
+
"node": ">=24"
|
|
47
|
+
}
|
|
48
|
+
}
|