threenative-asset-mcp 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 +441 -0
- package/dist/ambientcg/client.d.ts +61 -0
- package/dist/ambientcg/client.d.ts.map +1 -0
- package/dist/ambientcg/client.js +234 -0
- package/dist/ambientcg/client.js.map +1 -0
- package/dist/audio/catalog.d.ts +36 -0
- package/dist/audio/catalog.d.ts.map +1 -0
- package/dist/audio/catalog.js +169 -0
- package/dist/audio/catalog.js.map +1 -0
- package/dist/audio/client.d.ts +46 -0
- package/dist/audio/client.d.ts.map +1 -0
- package/dist/audio/client.js +196 -0
- package/dist/audio/client.js.map +1 -0
- package/dist/bundle/client.d.ts +89 -0
- package/dist/bundle/client.d.ts.map +1 -0
- package/dist/bundle/client.js +324 -0
- package/dist/bundle/client.js.map +1 -0
- package/dist/config.d.ts +20 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +130 -0
- package/dist/config.js.map +1 -0
- package/dist/download/direct-asset-downloader.d.ts +41 -0
- package/dist/download/direct-asset-downloader.d.ts.map +1 -0
- package/dist/download/direct-asset-downloader.js +232 -0
- package/dist/download/direct-asset-downloader.js.map +1 -0
- package/dist/fab/api-download.d.ts +30 -0
- package/dist/fab/api-download.d.ts.map +1 -0
- package/dist/fab/api-download.js +200 -0
- package/dist/fab/api-download.js.map +1 -0
- package/dist/fab/browser-transport.d.ts +79 -0
- package/dist/fab/browser-transport.d.ts.map +1 -0
- package/dist/fab/browser-transport.js +492 -0
- package/dist/fab/browser-transport.js.map +1 -0
- package/dist/fab/cache.d.ts +22 -0
- package/dist/fab/cache.d.ts.map +1 -0
- package/dist/fab/cache.js +55 -0
- package/dist/fab/cache.js.map +1 -0
- package/dist/fab/client.d.ts +61 -0
- package/dist/fab/client.d.ts.map +1 -0
- package/dist/fab/client.js +868 -0
- package/dist/fab/client.js.map +1 -0
- package/dist/fab/direct-transport.d.ts +68 -0
- package/dist/fab/direct-transport.d.ts.map +1 -0
- package/dist/fab/direct-transport.js +184 -0
- package/dist/fab/direct-transport.js.map +1 -0
- package/dist/fab/download-store.d.ts +21 -0
- package/dist/fab/download-store.d.ts.map +1 -0
- package/dist/fab/download-store.js +93 -0
- package/dist/fab/download-store.js.map +1 -0
- package/dist/fab/errors.d.ts +20 -0
- package/dist/fab/errors.d.ts.map +1 -0
- package/dist/fab/errors.js +65 -0
- package/dist/fab/errors.js.map +1 -0
- package/dist/fab/impersonate-fetch.d.ts +48 -0
- package/dist/fab/impersonate-fetch.d.ts.map +1 -0
- package/dist/fab/impersonate-fetch.js +228 -0
- package/dist/fab/impersonate-fetch.js.map +1 -0
- package/dist/fab/normalize.d.ts +3 -0
- package/dist/fab/normalize.d.ts.map +1 -0
- package/dist/fab/normalize.js +285 -0
- package/dist/fab/normalize.js.map +1 -0
- package/dist/fab/schemas.d.ts +10 -0
- package/dist/fab/schemas.d.ts.map +1 -0
- package/dist/fab/schemas.js +105 -0
- package/dist/fab/schemas.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +58 -0
- package/dist/index.js.map +1 -0
- package/dist/itch/catalog.d.ts +13 -0
- package/dist/itch/catalog.d.ts.map +1 -0
- package/dist/itch/catalog.js +50 -0
- package/dist/itch/catalog.js.map +1 -0
- package/dist/itch/client.d.ts +46 -0
- package/dist/itch/client.d.ts.map +1 -0
- package/dist/itch/client.js +175 -0
- package/dist/itch/client.js.map +1 -0
- package/dist/polyhaven/client.d.ts +55 -0
- package/dist/polyhaven/client.d.ts.map +1 -0
- package/dist/polyhaven/client.js +210 -0
- package/dist/polyhaven/client.js.map +1 -0
- package/dist/server.d.ts +25 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +448 -0
- package/dist/server.js.map +1 -0
- package/dist/sketchfab/client.d.ts +70 -0
- package/dist/sketchfab/client.d.ts.map +1 -0
- package/dist/sketchfab/client.js +255 -0
- package/dist/sketchfab/client.js.map +1 -0
- package/dist/smithsonian/client.d.ts +32 -0
- package/dist/smithsonian/client.d.ts.map +1 -0
- package/dist/smithsonian/client.js +142 -0
- package/dist/smithsonian/client.js.map +1 -0
- package/dist/tools/ambientcg.d.ts +296 -0
- package/dist/tools/ambientcg.d.ts.map +1 -0
- package/dist/tools/ambientcg.js +183 -0
- package/dist/tools/ambientcg.js.map +1 -0
- package/dist/tools/audio.d.ts +211 -0
- package/dist/tools/audio.d.ts.map +1 -0
- package/dist/tools/audio.js +156 -0
- package/dist/tools/audio.js.map +1 -0
- package/dist/tools/bundle.d.ts +237 -0
- package/dist/tools/bundle.d.ts.map +1 -0
- package/dist/tools/bundle.js +206 -0
- package/dist/tools/bundle.js.map +1 -0
- package/dist/tools/direct-download.d.ts +53 -0
- package/dist/tools/direct-download.d.ts.map +1 -0
- package/dist/tools/direct-download.js +68 -0
- package/dist/tools/direct-download.js.map +1 -0
- package/dist/tools/download-free-asset.d.ts +66 -0
- package/dist/tools/download-free-asset.d.ts.map +1 -0
- package/dist/tools/download-free-asset.js +60 -0
- package/dist/tools/download-free-asset.js.map +1 -0
- package/dist/tools/get-asset.d.ts +161 -0
- package/dist/tools/get-asset.d.ts.map +1 -0
- package/dist/tools/get-asset.js +131 -0
- package/dist/tools/get-asset.js.map +1 -0
- package/dist/tools/itch.d.ts +120 -0
- package/dist/tools/itch.d.ts.map +1 -0
- package/dist/tools/itch.js +120 -0
- package/dist/tools/itch.js.map +1 -0
- package/dist/tools/list-filters.d.ts +127 -0
- package/dist/tools/list-filters.d.ts.map +1 -0
- package/dist/tools/list-filters.js +68 -0
- package/dist/tools/list-filters.js.map +1 -0
- package/dist/tools/list-limited-time-free.d.ts +57 -0
- package/dist/tools/list-limited-time-free.d.ts.map +1 -0
- package/dist/tools/list-limited-time-free.js +47 -0
- package/dist/tools/list-limited-time-free.js.map +1 -0
- package/dist/tools/polyhaven.d.ts +266 -0
- package/dist/tools/polyhaven.d.ts.map +1 -0
- package/dist/tools/polyhaven.js +233 -0
- package/dist/tools/polyhaven.js.map +1 -0
- package/dist/tools/search-assets.d.ts +176 -0
- package/dist/tools/search-assets.d.ts.map +1 -0
- package/dist/tools/search-assets.js +172 -0
- package/dist/tools/search-assets.js.map +1 -0
- package/dist/tools/sketchfab.d.ts +325 -0
- package/dist/tools/sketchfab.d.ts.map +1 -0
- package/dist/tools/sketchfab.js +203 -0
- package/dist/tools/sketchfab.js.map +1 -0
- package/dist/tools/smithsonian.d.ts +189 -0
- package/dist/tools/smithsonian.d.ts.map +1 -0
- package/dist/tools/smithsonian.js +189 -0
- package/dist/tools/smithsonian.js.map +1 -0
- package/dist/tools/source-directory.d.ts +226 -0
- package/dist/tools/source-directory.d.ts.map +1 -0
- package/dist/tools/source-directory.js +583 -0
- package/dist/tools/source-directory.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { createWriteStream } from "node:fs";
|
|
2
|
+
import { stat, unlink } from "node:fs/promises";
|
|
3
|
+
import { pipeline } from "node:stream/promises";
|
|
4
|
+
import { Readable } from "node:stream";
|
|
5
|
+
import { assertAllowedFabApiUrl, assertAllowedFabDownloadUrl, FabClientError, } from "./direct-transport.js";
|
|
6
|
+
import { storeDownload } from "./download-store.js";
|
|
7
|
+
import { nullFabLogger } from "./errors.js";
|
|
8
|
+
const FAB_ORIGIN = "https://www.fab.com";
|
|
9
|
+
const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
10
|
+
/**
|
|
11
|
+
* Fab exposes most MCP formats under a same-named asset-format code. GLB and
|
|
12
|
+
* OBJ are usually served from the auto-conversion pool (`converted-files`)
|
|
13
|
+
* and are selected by file extension there.
|
|
14
|
+
*/
|
|
15
|
+
const DIRECT_FORMAT_CODES = {
|
|
16
|
+
blender: ["blender"],
|
|
17
|
+
fbx: ["fbx"],
|
|
18
|
+
glb: ["glb", "converted-files"],
|
|
19
|
+
gltf: ["gltf"],
|
|
20
|
+
maya: ["maya"],
|
|
21
|
+
obj: ["obj", "converted-files"],
|
|
22
|
+
unity: ["unity"],
|
|
23
|
+
};
|
|
24
|
+
function asRecord(value) {
|
|
25
|
+
return typeof value === "object" && value !== null && !Array.isArray(value)
|
|
26
|
+
? value
|
|
27
|
+
: undefined;
|
|
28
|
+
}
|
|
29
|
+
function listingFormatCodes(detail) {
|
|
30
|
+
const formats = Array.isArray(detail.assetFormats) ? detail.assetFormats : [];
|
|
31
|
+
const codes = [];
|
|
32
|
+
for (const entry of formats) {
|
|
33
|
+
const code = asRecord(asRecord(entry)?.assetFormatType)?.code;
|
|
34
|
+
if (typeof code === "string" && /^[a-z0-9][a-z0-9-]{0,39}$/i.test(code)) {
|
|
35
|
+
codes.push(code.toLowerCase());
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return [...new Set(codes)];
|
|
39
|
+
}
|
|
40
|
+
function readyFiles(payload) {
|
|
41
|
+
const files = asRecord(payload)?.files;
|
|
42
|
+
if (!Array.isArray(files)) {
|
|
43
|
+
throw new FabClientError("FAB_UPSTREAM_CHANGED", "Fab's asset-format response no longer matches the expected contract.");
|
|
44
|
+
}
|
|
45
|
+
const ready = [];
|
|
46
|
+
for (const entry of files) {
|
|
47
|
+
const record = asRecord(entry);
|
|
48
|
+
const uid = typeof record?.uid === "string" ? record.uid : "";
|
|
49
|
+
const name = typeof record?.name === "string" ? record.name : "";
|
|
50
|
+
const size = typeof record?.size === "number" ? record.size : 0;
|
|
51
|
+
if (record?.status !== "ready" ||
|
|
52
|
+
!UUID_PATTERN.test(uid) ||
|
|
53
|
+
!name ||
|
|
54
|
+
name.length > 180 ||
|
|
55
|
+
size < 0) {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
const fileType = typeof record.fileType === "string" ? record.fileType : undefined;
|
|
59
|
+
ready.push({ uid, name, size, ...(fileType ? { fileType } : {}) });
|
|
60
|
+
}
|
|
61
|
+
return ready;
|
|
62
|
+
}
|
|
63
|
+
function selectFile(files, format, code) {
|
|
64
|
+
if (code === "converted-files") {
|
|
65
|
+
const extension = `.${format}`;
|
|
66
|
+
return files.find((file) => file.name.toLowerCase().endsWith(extension));
|
|
67
|
+
}
|
|
68
|
+
const source = files.filter((file) => file.fileType === "source");
|
|
69
|
+
const pool = source.length > 0 ? source : files;
|
|
70
|
+
return pool.reduce((largest, file) => (file.size > (largest?.size ?? -1) ? file : largest), undefined);
|
|
71
|
+
}
|
|
72
|
+
function signedDownloadUrl(payload, now) {
|
|
73
|
+
const entries = asRecord(payload)?.downloadInfo;
|
|
74
|
+
if (!Array.isArray(entries) || entries.length === 0) {
|
|
75
|
+
throw new FabClientError("FAB_UPSTREAM_CHANGED", "Fab's download-info response no longer matches the expected contract.");
|
|
76
|
+
}
|
|
77
|
+
for (const entry of entries) {
|
|
78
|
+
const record = asRecord(entry);
|
|
79
|
+
const raw = record?.downloadUrl;
|
|
80
|
+
if (typeof raw !== "string" || raw.length > 4_096)
|
|
81
|
+
continue;
|
|
82
|
+
const expires = record?.expires;
|
|
83
|
+
if (typeof expires === "string" &&
|
|
84
|
+
Number.isFinite(Date.parse(expires)) &&
|
|
85
|
+
Date.parse(expires) <= now) {
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
let url;
|
|
89
|
+
try {
|
|
90
|
+
url = new URL(raw);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
assertAllowedFabDownloadUrl(url);
|
|
96
|
+
return url;
|
|
97
|
+
}
|
|
98
|
+
throw new FabClientError("FAB_UPSTREAM_CHANGED", "Fab returned no usable download URL for this file.");
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Resolves a free listing's file through Fab's anonymous JSON contract and
|
|
102
|
+
* stores it. Throws FAB_CHALLENGE (via fetchJson) so the caller can fall
|
|
103
|
+
* back to the browser click flow.
|
|
104
|
+
*/
|
|
105
|
+
export async function downloadFreeAssetViaApi(options) {
|
|
106
|
+
const logger = options.logger ?? nullFabLogger;
|
|
107
|
+
const { listingId, format } = options.request;
|
|
108
|
+
const detailUrl = new URL(`/i/listings/${encodeURIComponent(listingId)}`, FAB_ORIGIN);
|
|
109
|
+
detailUrl.searchParams.set("currency", "USD");
|
|
110
|
+
const detail = asRecord(await options.fetchJson(detailUrl));
|
|
111
|
+
if (!detail) {
|
|
112
|
+
throw new FabClientError("FAB_UPSTREAM_CHANGED", "Fab's listing detail no longer matches the expected contract.");
|
|
113
|
+
}
|
|
114
|
+
if (detail.isFree !== true) {
|
|
115
|
+
throw new FabClientError("FAB_ACQUISITION_REQUIRED", "This listing is not fully free; Fab requires an account or purchase before downloading. The MCP did not start that flow.");
|
|
116
|
+
}
|
|
117
|
+
const available = listingFormatCodes(detail);
|
|
118
|
+
const code = DIRECT_FORMAT_CODES[format].find((candidate) => available.includes(candidate));
|
|
119
|
+
if (!code) {
|
|
120
|
+
throw new FabClientError("FAB_FORMAT_UNAVAILABLE", `Fab does not expose the requested ${format.toUpperCase()} file for this listing.`);
|
|
121
|
+
}
|
|
122
|
+
const formatsUrl = new URL(`/i/listings/${encodeURIComponent(listingId)}/asset-formats/${code}`, FAB_ORIGIN);
|
|
123
|
+
const files = readyFiles(await options.fetchJson(formatsUrl));
|
|
124
|
+
const file = selectFile(files, format, code);
|
|
125
|
+
if (!file) {
|
|
126
|
+
throw new FabClientError("FAB_FORMAT_UNAVAILABLE", `Fab does not expose the requested ${format.toUpperCase()} file for this listing.`);
|
|
127
|
+
}
|
|
128
|
+
if (file.size > options.maxBytes) {
|
|
129
|
+
throw new FabClientError("FAB_DOWNLOAD_TOO_LARGE", "The downloaded file exceeds FAB_MAX_DOWNLOAD_BYTES.");
|
|
130
|
+
}
|
|
131
|
+
const infoUrl = new URL(`/i/listings/${encodeURIComponent(listingId)}/asset-formats/${code}/files/${encodeURIComponent(file.uid)}/download-info`, FAB_ORIGIN);
|
|
132
|
+
let infoPayload;
|
|
133
|
+
try {
|
|
134
|
+
infoPayload = await options.fetchJson(infoUrl);
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
if (error instanceof FabClientError && error.code === "FAB_ACCESS_DENIED") {
|
|
138
|
+
throw new FabClientError("FAB_ACQUISITION_REQUIRED", "Fab requires an account before this file can be downloaded. The MCP did not start that flow.");
|
|
139
|
+
}
|
|
140
|
+
throw error;
|
|
141
|
+
}
|
|
142
|
+
const downloadUrl = signedDownloadUrl(infoPayload, Date.now());
|
|
143
|
+
logger.log("debug", "fab_api_download_resolved", {
|
|
144
|
+
listingId,
|
|
145
|
+
format,
|
|
146
|
+
code,
|
|
147
|
+
fileName: file.name,
|
|
148
|
+
sizeBytes: file.size,
|
|
149
|
+
});
|
|
150
|
+
return storeDownload({
|
|
151
|
+
downloadDir: options.downloadDir,
|
|
152
|
+
listingId,
|
|
153
|
+
format,
|
|
154
|
+
fileName: file.name,
|
|
155
|
+
maxBytes: options.maxBytes,
|
|
156
|
+
materialize: (temporaryPath) => options.downloader(downloadUrl, temporaryPath),
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Fallback CDN downloader for hosts without curl-impersonate. Signed
|
|
161
|
+
* distribution URLs are self-authorizing, so a plain TLS client is
|
|
162
|
+
* acceptable for this hop.
|
|
163
|
+
*/
|
|
164
|
+
export async function nodeDownloadToFile(url, destinationPath, options) {
|
|
165
|
+
let response;
|
|
166
|
+
try {
|
|
167
|
+
response = await fetch(url, {
|
|
168
|
+
redirect: "follow",
|
|
169
|
+
signal: AbortSignal.timeout(options.timeoutMs),
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
throw new FabClientError("FAB_DOWNLOAD_FAILED", "Fab could not complete the requested file download.", true);
|
|
174
|
+
}
|
|
175
|
+
if (!response.ok || !response.body) {
|
|
176
|
+
await response.body?.cancel().catch(() => undefined);
|
|
177
|
+
throw new FabClientError("FAB_DOWNLOAD_FAILED", "Fab could not complete the requested file download.", response.status >= 500);
|
|
178
|
+
}
|
|
179
|
+
const declared = Number(response.headers.get("content-length") ?? 0);
|
|
180
|
+
if (declared > options.maxBytes) {
|
|
181
|
+
await response.body.cancel().catch(() => undefined);
|
|
182
|
+
throw new FabClientError("FAB_DOWNLOAD_TOO_LARGE", "The downloaded file exceeds FAB_MAX_DOWNLOAD_BYTES.");
|
|
183
|
+
}
|
|
184
|
+
try {
|
|
185
|
+
await pipeline(Readable.fromWeb(response.body), createWriteStream(destinationPath));
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
await unlink(destinationPath).catch(() => undefined);
|
|
189
|
+
if (error instanceof FabClientError)
|
|
190
|
+
throw error;
|
|
191
|
+
throw new FabClientError("FAB_DOWNLOAD_FAILED", "The downloaded file could not be saved safely.", true);
|
|
192
|
+
}
|
|
193
|
+
const metadata = await stat(destinationPath);
|
|
194
|
+
if (metadata.size > options.maxBytes) {
|
|
195
|
+
await unlink(destinationPath).catch(() => undefined);
|
|
196
|
+
throw new FabClientError("FAB_DOWNLOAD_TOO_LARGE", "The downloaded file exceeds FAB_MAX_DOWNLOAD_BYTES.");
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
export { assertAllowedFabApiUrl };
|
|
200
|
+
//# sourceMappingURL=api-download.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-download.js","sourceRoot":"","sources":["../../src/fab/api-download.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { FabConfig } from "../config.js";
|
|
2
|
+
import { type FabDownloadRequest, type FabDownloadResult, type FabTransport } from "./direct-transport.js";
|
|
3
|
+
export interface BrowserLocator {
|
|
4
|
+
count(): Promise<number>;
|
|
5
|
+
click(options?: {
|
|
6
|
+
timeout?: number;
|
|
7
|
+
}): Promise<unknown>;
|
|
8
|
+
waitFor(options: {
|
|
9
|
+
state: "visible";
|
|
10
|
+
timeout: number;
|
|
11
|
+
}): Promise<unknown>;
|
|
12
|
+
}
|
|
13
|
+
export interface BrowserDownload {
|
|
14
|
+
suggestedFilename(): string;
|
|
15
|
+
saveAs(path: string): Promise<void>;
|
|
16
|
+
failure(): Promise<string | null>;
|
|
17
|
+
}
|
|
18
|
+
export interface BrowserPage {
|
|
19
|
+
url(): string;
|
|
20
|
+
goto(url: string, options: {
|
|
21
|
+
waitUntil: "domcontentloaded";
|
|
22
|
+
timeout: number;
|
|
23
|
+
}): Promise<unknown>;
|
|
24
|
+
evaluate(callback: (argument: any) => Promise<any> | any, argument: any): Promise<any>;
|
|
25
|
+
getByRole?(role: string, options: {
|
|
26
|
+
name: string;
|
|
27
|
+
exact: boolean;
|
|
28
|
+
}): BrowserLocator;
|
|
29
|
+
waitForEvent?(event: "download", options: {
|
|
30
|
+
timeout: number;
|
|
31
|
+
}): Promise<BrowserDownload>;
|
|
32
|
+
}
|
|
33
|
+
export interface BrowserContextHandle {
|
|
34
|
+
pages(): BrowserPage[];
|
|
35
|
+
newPage(): Promise<BrowserPage>;
|
|
36
|
+
close(): Promise<void>;
|
|
37
|
+
}
|
|
38
|
+
export interface BrowserFabTransportOptions {
|
|
39
|
+
timeoutMs: number;
|
|
40
|
+
manualChallengeTimeoutMs?: number;
|
|
41
|
+
headless: boolean;
|
|
42
|
+
profileDir: string;
|
|
43
|
+
downloadDir?: string;
|
|
44
|
+
maxDownloadBytes?: number;
|
|
45
|
+
launchContext?: () => Promise<BrowserContextHandle>;
|
|
46
|
+
sleep?: (milliseconds: number) => Promise<void>;
|
|
47
|
+
}
|
|
48
|
+
export declare class BrowserFabTransport implements FabTransport {
|
|
49
|
+
readonly name: "browser";
|
|
50
|
+
private readonly timeoutMs;
|
|
51
|
+
private readonly manualChallengeTimeoutMs;
|
|
52
|
+
private readonly headless;
|
|
53
|
+
private readonly downloadDir;
|
|
54
|
+
private readonly maxDownloadBytes;
|
|
55
|
+
private readonly sleep;
|
|
56
|
+
private readonly launchContext;
|
|
57
|
+
private contextPromise;
|
|
58
|
+
private queue;
|
|
59
|
+
private closed;
|
|
60
|
+
constructor(options: BrowserFabTransportOptions);
|
|
61
|
+
static fromConfig(config: FabConfig): BrowserFabTransport;
|
|
62
|
+
search(url: URL): Promise<unknown>;
|
|
63
|
+
getListing(id: string, currency: string): Promise<unknown>;
|
|
64
|
+
prepare(): Promise<void>;
|
|
65
|
+
downloadFreeAsset(request: FabDownloadRequest): Promise<FabDownloadResult>;
|
|
66
|
+
getLimitedTimeFreeIds(limit: number): Promise<string[]>;
|
|
67
|
+
request(url: URL): Promise<unknown>;
|
|
68
|
+
private serialized;
|
|
69
|
+
private context;
|
|
70
|
+
private page;
|
|
71
|
+
private waitForManualVerification;
|
|
72
|
+
private assertListingPage;
|
|
73
|
+
private ensureListingIsUsable;
|
|
74
|
+
private downloadDialogState;
|
|
75
|
+
private persistDownload;
|
|
76
|
+
private requestInBrowser;
|
|
77
|
+
close(): Promise<void>;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=browser-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-transport.d.ts","sourceRoot":"","sources":["../../src/fab/browser-transport.ts"],"names":[],"mappings":"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"}
|