@avclabs.ai/media-mcp 0.2.0 → 0.3.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 +398 -184
- package/README_CN.md +633 -0
- package/config.json +1 -0
- package/dist/image-enhancement.d.ts +3 -0
- package/dist/image-enhancement.d.ts.map +1 -0
- package/dist/image-enhancement.js +185 -0
- package/dist/image-enhancement.js.map +1 -0
- package/dist/sam3.d.ts +7 -0
- package/dist/sam3.d.ts.map +1 -1
- package/dist/sam3.js +148 -104
- package/dist/sam3.js.map +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.js +80 -56
- package/dist/server.js.map +1 -1
- package/dist/service-config.d.ts +62 -0
- package/dist/service-config.d.ts.map +1 -0
- package/dist/service-config.js +58 -0
- package/dist/service-config.js.map +1 -0
- package/dist/tooling.d.ts +42 -0
- package/dist/tooling.d.ts.map +1 -0
- package/dist/tooling.js +153 -0
- package/dist/tooling.js.map +1 -0
- package/dist/tos.d.ts +35 -0
- package/dist/tos.d.ts.map +1 -0
- package/dist/tos.js +281 -0
- package/dist/tos.js.map +1 -0
- package/dist/upload.d.ts +79 -0
- package/dist/upload.d.ts.map +1 -0
- package/dist/upload.js +190 -0
- package/dist/upload.js.map +1 -0
- package/dist/video-enhancement.d.ts.map +1 -1
- package/dist/video-enhancement.js +95 -175
- package/dist/video-enhancement.js.map +1 -1
- package/package.json +11 -6
- package/README_EN.md +0 -419
package/dist/tos.js
ADDED
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import * as dns from 'dns/promises';
|
|
3
|
+
import * as fs from 'fs';
|
|
4
|
+
import * as net from 'net';
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
import FormData from 'form-data';
|
|
7
|
+
export const MAX_FILE_SIZE_BYTES = 100 * 1024 * 1024;
|
|
8
|
+
export const TOS_UPLOAD_TIMEOUT_MS = 120000;
|
|
9
|
+
export const DOWNLOAD_TIMEOUT_MS = 15000;
|
|
10
|
+
const IMAGE_EXTENSIONS = new Set(['.png', '.jpg', '.jpeg', '.bmp', '.webp']);
|
|
11
|
+
const VIDEO_EXTENSIONS = new Set(['.mp4', '.mov', '.m4v', '.avi', '.mkv', '.webm']);
|
|
12
|
+
const MAGIC_SIGNATURES = [
|
|
13
|
+
{ extensions: ['.png'], matches: (h) => h.length >= 4 && h[0] === 0x89 && h[1] === 0x50 && h[2] === 0x4e && h[3] === 0x47 },
|
|
14
|
+
{ extensions: ['.jpg', '.jpeg'], matches: (h) => h.length >= 3 && h[0] === 0xff && h[1] === 0xd8 && h[2] === 0xff },
|
|
15
|
+
{ extensions: ['.bmp'], matches: (h) => h.length >= 2 && h[0] === 0x42 && h[1] === 0x4d },
|
|
16
|
+
{ extensions: ['.webp'], matches: (h) => h.length >= 12 && h.toString('ascii', 0, 4) === 'RIFF' && h.toString('ascii', 8, 12) === 'WEBP' },
|
|
17
|
+
{ extensions: ['.mp4', '.mov', '.m4v'], matches: (h) => h.length >= 8 && h.toString('ascii', 4, 8) === 'ftyp' },
|
|
18
|
+
{ extensions: ['.avi'], matches: (h) => h.length >= 12 && h.toString('ascii', 0, 4) === 'RIFF' && h.toString('ascii', 8, 12) === 'AVI ' },
|
|
19
|
+
{ extensions: ['.mkv', '.webm'], matches: (h) => h.length >= 4 && h[0] === 0x1a && h[1] === 0x45 && h[2] === 0xdf && h[3] === 0xa3 },
|
|
20
|
+
];
|
|
21
|
+
function readFileHeader(filePath, length) {
|
|
22
|
+
const fd = fs.openSync(filePath, 'r');
|
|
23
|
+
try {
|
|
24
|
+
const header = Buffer.alloc(length);
|
|
25
|
+
const bytesRead = fs.readSync(fd, header, 0, length, 0);
|
|
26
|
+
return header.subarray(0, bytesRead);
|
|
27
|
+
}
|
|
28
|
+
finally {
|
|
29
|
+
fs.closeSync(fd);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function checkLocalFile(filePath, kind) {
|
|
33
|
+
if (!fs.existsSync(filePath)) {
|
|
34
|
+
throw new Error(`File does not exist: ${filePath}`);
|
|
35
|
+
}
|
|
36
|
+
const stats = fs.statSync(filePath);
|
|
37
|
+
if (!stats.isFile()) {
|
|
38
|
+
throw new Error(`Not a regular file: ${filePath}`);
|
|
39
|
+
}
|
|
40
|
+
if (stats.size > MAX_FILE_SIZE_BYTES) {
|
|
41
|
+
throw new Error('File size exceeds 100MB limit');
|
|
42
|
+
}
|
|
43
|
+
const extension = path.extname(filePath).toLowerCase();
|
|
44
|
+
const allowed = kind === 'image' ? IMAGE_EXTENSIONS : VIDEO_EXTENSIONS;
|
|
45
|
+
if (!allowed.has(extension)) {
|
|
46
|
+
throw new Error(`Unsupported ${kind} file extension "${extension}"; allowed: ${[...allowed].join(', ')}`);
|
|
47
|
+
}
|
|
48
|
+
const signature = MAGIC_SIGNATURES.find((entry) => entry.extensions.includes(extension));
|
|
49
|
+
if (signature && !signature.matches(readFileHeader(filePath, 12))) {
|
|
50
|
+
throw new Error(`File content does not match its "${extension}" extension (magic number check failed): ${filePath}`);
|
|
51
|
+
}
|
|
52
|
+
return { filePath, fileName: path.basename(filePath) };
|
|
53
|
+
}
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
// Base64 image input
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
const MIME_EXTENSION = {
|
|
58
|
+
'image/png': 'png',
|
|
59
|
+
'image/jpeg': 'jpg',
|
|
60
|
+
'image/bmp': 'bmp',
|
|
61
|
+
'image/webp': 'webp',
|
|
62
|
+
};
|
|
63
|
+
const DATA_URL_PATTERN = /^data:([^;,]+);base64,(.*)$/s;
|
|
64
|
+
export function decodeBase64Image(input) {
|
|
65
|
+
const trimmed = input.trim();
|
|
66
|
+
const match = DATA_URL_PATTERN.exec(trimmed);
|
|
67
|
+
const extension = match ? MIME_EXTENSION[match[1].toLowerCase()] ?? 'png' : 'png';
|
|
68
|
+
const base64 = match ? match[2] : trimmed;
|
|
69
|
+
const buffer = Buffer.from(base64, 'base64');
|
|
70
|
+
if (buffer.length === 0) {
|
|
71
|
+
throw new Error('imageBase64 decoded to empty content');
|
|
72
|
+
}
|
|
73
|
+
if (buffer.length > MAX_FILE_SIZE_BYTES) {
|
|
74
|
+
throw new Error('Image size exceeds 100MB limit');
|
|
75
|
+
}
|
|
76
|
+
return { buffer, fileName: `image.${extension}` };
|
|
77
|
+
}
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
// SSRF guard for remote fetches
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
export function isPrivateIp(ip) {
|
|
82
|
+
if (net.isIPv4(ip)) {
|
|
83
|
+
const [a, b] = ip.split('.').map(Number);
|
|
84
|
+
return (a === 0 ||
|
|
85
|
+
a === 10 ||
|
|
86
|
+
a === 127 ||
|
|
87
|
+
(a === 100 && b >= 64 && b <= 127) || // CGNAT 100.64.0.0/10 (cloud metadata, e.g. 100.100.100.200)
|
|
88
|
+
(a === 172 && b >= 16 && b <= 31) ||
|
|
89
|
+
(a === 192 && b === 168) ||
|
|
90
|
+
(a === 169 && b === 254) ||
|
|
91
|
+
(a === 198 && (b === 18 || b === 19)) || // benchmarking 198.18.0.0/15
|
|
92
|
+
a >= 224);
|
|
93
|
+
}
|
|
94
|
+
if (net.isIPv6(ip)) {
|
|
95
|
+
const lower = ip.toLowerCase();
|
|
96
|
+
if (lower === '::1' || lower === '::')
|
|
97
|
+
return true;
|
|
98
|
+
if (lower.startsWith('fe80') || lower.startsWith('fc') || lower.startsWith('fd'))
|
|
99
|
+
return true;
|
|
100
|
+
if (lower.startsWith('::ffff:'))
|
|
101
|
+
return isPrivateIp(lower.slice(7));
|
|
102
|
+
}
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
export async function assertPublicHttpUrl(rawUrl) {
|
|
106
|
+
let url;
|
|
107
|
+
try {
|
|
108
|
+
url = new URL(rawUrl);
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
throw new Error(`Invalid URL: ${rawUrl}`);
|
|
112
|
+
}
|
|
113
|
+
if (url.protocol !== 'http:' && url.protocol !== 'https:') {
|
|
114
|
+
throw new Error(`Only http(s) URLs are allowed: ${rawUrl}`);
|
|
115
|
+
}
|
|
116
|
+
const hostname = url.hostname;
|
|
117
|
+
if (net.isIP(hostname)) {
|
|
118
|
+
if (isPrivateIp(hostname)) {
|
|
119
|
+
throw new Error(`Refusing to fetch from a private or reserved address: ${hostname}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
const { address } = await dns.lookup(hostname);
|
|
124
|
+
if (isPrivateIp(address)) {
|
|
125
|
+
throw new Error(`Refusing to fetch ${hostname}: resolves to private or reserved address ${address}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return url;
|
|
129
|
+
}
|
|
130
|
+
export async function downloadToBuffer(rawUrl) {
|
|
131
|
+
await assertPublicHttpUrl(rawUrl);
|
|
132
|
+
const response = await axios.get(rawUrl, {
|
|
133
|
+
responseType: 'arraybuffer',
|
|
134
|
+
timeout: DOWNLOAD_TIMEOUT_MS,
|
|
135
|
+
maxContentLength: MAX_FILE_SIZE_BYTES,
|
|
136
|
+
maxRedirects: 3,
|
|
137
|
+
beforeRedirect: (options) => {
|
|
138
|
+
const host = String(options.hostname ?? options.host ?? '');
|
|
139
|
+
if (net.isIP(host) && isPrivateIp(host)) {
|
|
140
|
+
throw new Error(`Refusing redirect to a private or reserved address: ${host}`);
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
});
|
|
144
|
+
const buffer = Buffer.from(response.data);
|
|
145
|
+
if (buffer.length > MAX_FILE_SIZE_BYTES) {
|
|
146
|
+
throw new Error('Downloaded content exceeds 100MB limit');
|
|
147
|
+
}
|
|
148
|
+
return buffer;
|
|
149
|
+
}
|
|
150
|
+
const DEFAULT_SUCCESS_CODES = new Set([0, 200]);
|
|
151
|
+
export function unwrapEnvelope(response, successCodes = DEFAULT_SUCCESS_CODES) {
|
|
152
|
+
const body = response.data;
|
|
153
|
+
if (body && typeof body === 'object' && !Array.isArray(body) && !Buffer.isBuffer(body)) {
|
|
154
|
+
const code = body.code;
|
|
155
|
+
if (successCodes.has(code)) {
|
|
156
|
+
return { ok: true, data: body.data };
|
|
157
|
+
}
|
|
158
|
+
const message = body.message ?? body.error;
|
|
159
|
+
if (message !== undefined && message !== null && message !== '') {
|
|
160
|
+
return { ok: false, error: String(message) };
|
|
161
|
+
}
|
|
162
|
+
return { ok: false, error: `API returned code=${code === undefined ? 'missing' : code} (HTTP ${response.status})` };
|
|
163
|
+
}
|
|
164
|
+
const preview = String(body).slice(0, 200).replace(/\s+/g, ' ');
|
|
165
|
+
return { ok: false, error: `Non-JSON response (HTTP ${response.status}): ${preview}` };
|
|
166
|
+
}
|
|
167
|
+
// ---------------------------------------------------------------------------
|
|
168
|
+
// Error formatting (never leaks presigned URL query strings / credentials)
|
|
169
|
+
// ---------------------------------------------------------------------------
|
|
170
|
+
function safeUrlLocation(rawUrl) {
|
|
171
|
+
if (!rawUrl)
|
|
172
|
+
return '';
|
|
173
|
+
try {
|
|
174
|
+
const url = new URL(rawUrl);
|
|
175
|
+
return ` url=${url.host}${url.pathname}`;
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
return '';
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
export function formatRequestError(error, rawUrl) {
|
|
182
|
+
const location = safeUrlLocation(rawUrl);
|
|
183
|
+
if (error?.response) {
|
|
184
|
+
const data = error.response.data;
|
|
185
|
+
let bodyPreview = '';
|
|
186
|
+
if (typeof data === 'string') {
|
|
187
|
+
bodyPreview = ` data=${data.slice(0, 200).replace(/\s+/g, ' ')}`;
|
|
188
|
+
}
|
|
189
|
+
else if (data) {
|
|
190
|
+
bodyPreview = ` data=${JSON.stringify(data).slice(0, 200)}`;
|
|
191
|
+
}
|
|
192
|
+
return `status=${error.response.status} statusText=${error.response.statusText}${bodyPreview}${location}`;
|
|
193
|
+
}
|
|
194
|
+
return `${error?.message ?? String(error)}${location}`;
|
|
195
|
+
}
|
|
196
|
+
// Whitelist: only these signature fields are ever forwarded as TOS form fields.
|
|
197
|
+
const TOS_FIELD_MAPPING = {
|
|
198
|
+
algorithm: 'x-tos-algorithm',
|
|
199
|
+
credential: 'x-tos-credential',
|
|
200
|
+
date: 'x-tos-date',
|
|
201
|
+
signature: 'x-tos-signature',
|
|
202
|
+
};
|
|
203
|
+
function decodePolicyJson(policyValue) {
|
|
204
|
+
let text = policyValue.trim();
|
|
205
|
+
if (!text.startsWith('{')) {
|
|
206
|
+
try {
|
|
207
|
+
text = Buffer.from(text, 'base64').toString('utf-8');
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
return undefined;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
if (!text.startsWith('{'))
|
|
214
|
+
return undefined;
|
|
215
|
+
try {
|
|
216
|
+
return JSON.parse(text);
|
|
217
|
+
}
|
|
218
|
+
catch {
|
|
219
|
+
return undefined;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
export function parseTosSignature(signatureData) {
|
|
223
|
+
if (!signatureData || typeof signatureData !== 'object') {
|
|
224
|
+
throw new Error('Invalid TOS signature response');
|
|
225
|
+
}
|
|
226
|
+
const url = signatureData.url;
|
|
227
|
+
if (typeof url !== 'string' || !url) {
|
|
228
|
+
throw new Error('Missing upload URL in TOS signature response');
|
|
229
|
+
}
|
|
230
|
+
const pathname = new URL(url).pathname;
|
|
231
|
+
const segments = pathname.split('/');
|
|
232
|
+
const fileId = decodeURIComponent(segments[segments.length - 1] || '');
|
|
233
|
+
if (!fileId) {
|
|
234
|
+
throw new Error('Could not extract file_id from upload URL');
|
|
235
|
+
}
|
|
236
|
+
const fields = {};
|
|
237
|
+
for (const [sourceKey, formKey] of Object.entries(TOS_FIELD_MAPPING)) {
|
|
238
|
+
const value = signatureData[sourceKey];
|
|
239
|
+
if (value !== undefined && value !== null) {
|
|
240
|
+
fields[formKey] = String(value);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
const policyValue = signatureData.origin_policy ?? signatureData.policy;
|
|
244
|
+
let objectKey = decodeURIComponent(pathname.slice(1));
|
|
245
|
+
if (policyValue !== undefined && policyValue !== null) {
|
|
246
|
+
let policyText = String(policyValue);
|
|
247
|
+
// Different volcengine-tos SDK versions return the policy as plain JSON or
|
|
248
|
+
// Base64; TOS expects Base64, so normalize here.
|
|
249
|
+
if (policyText.trim().startsWith('{')) {
|
|
250
|
+
policyText = Buffer.from(policyText, 'utf-8').toString('base64');
|
|
251
|
+
}
|
|
252
|
+
fields['policy'] = policyText;
|
|
253
|
+
// Prefer the key declared in the policy conditions when available.
|
|
254
|
+
const policyJson = decodePolicyJson(String(policyValue));
|
|
255
|
+
const keyCondition = policyJson?.conditions?.find((condition) => condition && typeof condition === 'object' && typeof condition.key === 'string');
|
|
256
|
+
if (keyCondition) {
|
|
257
|
+
objectKey = keyCondition.key;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return { url, fileId, objectKey, fields };
|
|
261
|
+
}
|
|
262
|
+
export async function uploadToTos(target, data, fileName) {
|
|
263
|
+
const formData = new FormData();
|
|
264
|
+
formData.append('key', target.objectKey);
|
|
265
|
+
for (const [key, value] of Object.entries(target.fields)) {
|
|
266
|
+
formData.append(key, value);
|
|
267
|
+
}
|
|
268
|
+
formData.append('file', data, fileName);
|
|
269
|
+
try {
|
|
270
|
+
await axios.post(target.url, formData, {
|
|
271
|
+
headers: formData.getHeaders(),
|
|
272
|
+
maxBodyLength: Infinity,
|
|
273
|
+
maxContentLength: Infinity,
|
|
274
|
+
timeout: TOS_UPLOAD_TIMEOUT_MS,
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
throw new Error(`TOS upload failed: ${formatRequestError(error, target.url)}`);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=tos.js.map
|
package/dist/tos.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tos.js","sourceRoot":"","sources":["../src/tos.ts"],"names":[],"mappings":"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"}
|
package/dist/upload.d.ts
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import FormData from 'form-data';
|
|
2
|
+
import type { Readable } from 'stream';
|
|
3
|
+
/**
|
|
4
|
+
* Upload module: take local media and return a `file_id`.
|
|
5
|
+
*
|
|
6
|
+
* What the two media hosts disagree about -- signature endpoint, response code convention,
|
|
7
|
+
* where the object key comes from -- lives behind a SignatureAdapter. Everything they agree
|
|
8
|
+
* on lives here: storage-form field canonicalisation, `file_id` derivation, error detail
|
|
9
|
+
* formatting, and the storage POST itself.
|
|
10
|
+
*/
|
|
11
|
+
export interface SignatureTransport {
|
|
12
|
+
/** POST a JSON payload to the host, returning the decoded response body. */
|
|
13
|
+
post(requestPath: string, payload: unknown): Promise<unknown>;
|
|
14
|
+
}
|
|
15
|
+
export interface SignatureTransportConfig {
|
|
16
|
+
baseUrl: string;
|
|
17
|
+
apiKey: string;
|
|
18
|
+
auth: 'bearer' | 'x-api-key';
|
|
19
|
+
}
|
|
20
|
+
export declare function createAxiosSignatureTransport(config: SignatureTransportConfig): SignatureTransport;
|
|
21
|
+
export interface StorageTransport {
|
|
22
|
+
/** POST the signed form to storage. Throws `TOS upload failed: …` on any non-success. */
|
|
23
|
+
submit(uploadUrl: string, form: FormData): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
export declare function createAxiosStorageTransport(): StorageTransport;
|
|
26
|
+
export interface StorageForm {
|
|
27
|
+
/** Absolute storage URL that receives the form. */
|
|
28
|
+
uploadUrl: string;
|
|
29
|
+
/** Pre-signed fields, `key` included, ready to append as-is. */
|
|
30
|
+
formFields: Record<string, string>;
|
|
31
|
+
}
|
|
32
|
+
export interface SignatureAdapter {
|
|
33
|
+
prepareUpload(fileName: string): Promise<StorageForm>;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The enhancement host serves images and videos from one signature endpoint; only `file_type`
|
|
37
|
+
* separates them.
|
|
38
|
+
*/
|
|
39
|
+
export declare function createEnhanceSignatureAdapter(deps: {
|
|
40
|
+
transport: SignatureTransport;
|
|
41
|
+
fileType: 'image' | 'video';
|
|
42
|
+
}): SignatureAdapter;
|
|
43
|
+
/** The SAM3 host always sends images. Only the failure message convention differs from enhance. */
|
|
44
|
+
export declare function createSam3SignatureAdapter(deps: {
|
|
45
|
+
transport: SignatureTransport;
|
|
46
|
+
}): SignatureAdapter;
|
|
47
|
+
export interface UploadDeps {
|
|
48
|
+
adapter: SignatureAdapter;
|
|
49
|
+
storage: StorageTransport;
|
|
50
|
+
body: Buffer | Readable;
|
|
51
|
+
fileName: string;
|
|
52
|
+
}
|
|
53
|
+
export declare function uploadObject(deps: UploadDeps): Promise<{
|
|
54
|
+
fileId: string;
|
|
55
|
+
uploadUrl: string;
|
|
56
|
+
}>;
|
|
57
|
+
/** Pre-binds a signature adapter and the storage transport into the shape the tools call. */
|
|
58
|
+
export type MediaUploader = (body: Buffer | Readable, fileName: string) => Promise<{
|
|
59
|
+
fileId: string;
|
|
60
|
+
}>;
|
|
61
|
+
export declare function createMediaUploader(deps: {
|
|
62
|
+
adapter: SignatureAdapter;
|
|
63
|
+
storage: StorageTransport;
|
|
64
|
+
}): MediaUploader;
|
|
65
|
+
/**
|
|
66
|
+
* Canonicalise a signature response into storage-form fields.
|
|
67
|
+
*
|
|
68
|
+
* Never returns `key`: each host derives the object key differently, so the adapter supplies
|
|
69
|
+
* it. Tolerates both hosts' naming conventions, so a response that arrives in the other
|
|
70
|
+
* convention still yields a usable form.
|
|
71
|
+
*/
|
|
72
|
+
export declare function normalizeSignatureFields(response: Record<string, unknown>): Record<string, string>;
|
|
73
|
+
/** Last path segment of the upload URL, percent-decoded. */
|
|
74
|
+
export declare function parseFileIdFromUrl(uploadUrl: string): string;
|
|
75
|
+
export declare function checkLocalFile(filePath: string): {
|
|
76
|
+
filePath: string;
|
|
77
|
+
fileName: string;
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=upload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../src/upload.ts"],"names":[],"mappings":"AAGA,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAEvC;;;;;;;GAOG;AAIH,MAAM,WAAW,kBAAkB;IACjC,4EAA4E;IAC5E,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/D;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,QAAQ,GAAG,WAAW,CAAC;CAC9B;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,wBAAwB,GAAG,kBAAkB,CAwBlG;AAID,MAAM,WAAW,gBAAgB;IAC/B,yFAAyF;IACzF,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1D;AAED,wBAAgB,2BAA2B,IAAI,gBAAgB,CAiB9D;AAID,MAAM,WAAW,WAAW;IAC1B,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,gBAAgB;IAC/B,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACvD;AAKD;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE;IAClD,SAAS,EAAE,kBAAkB,CAAC;IAC9B,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC;CAC7B,GAAG,gBAAgB,CAmBnB;AAED,mGAAmG;AACnG,wBAAgB,0BAA0B,CAAC,IAAI,EAAE;IAAE,SAAS,EAAE,kBAAkB,CAAA;CAAE,GAAG,gBAAgB,CAuBpG;AAID,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAYnG;AAED,6FAA6F;AAC7F,MAAM,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEvG,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,OAAO,EAAE,gBAAgB,CAAC;IAC1B,OAAO,EAAE,gBAAgB,CAAC;CAC3B,GAAG,aAAa,CAKhB;AAeD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAkBlG;AAWD,4DAA4D;AAC5D,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAG5D;AA4BD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAUvF"}
|
package/dist/upload.js
ADDED
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import FormData from 'form-data';
|
|
5
|
+
export function createAxiosSignatureTransport(config) {
|
|
6
|
+
const client = axios.create({
|
|
7
|
+
baseURL: config.baseUrl.replace(/\/$/, ''),
|
|
8
|
+
headers: config.auth === 'bearer'
|
|
9
|
+
? { Authorization: `Bearer ${config.apiKey}`, 'Content-Type': 'application/json' }
|
|
10
|
+
: { 'X-API-Key': config.apiKey, 'Content-Type': 'application/json' },
|
|
11
|
+
timeout: 60000,
|
|
12
|
+
});
|
|
13
|
+
return {
|
|
14
|
+
async post(requestPath, payload) {
|
|
15
|
+
try {
|
|
16
|
+
const response = await client.post(requestPath, payload);
|
|
17
|
+
return response.data;
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
// Surface the host's own diagnostics, not axios's one-liner.
|
|
21
|
+
const detail = error.response
|
|
22
|
+
? `status=${error.response.status} data=${JSON.stringify(error.response.data)}`
|
|
23
|
+
: error.message;
|
|
24
|
+
throw new Error(detail);
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export function createAxiosStorageTransport() {
|
|
30
|
+
return {
|
|
31
|
+
async submit(uploadUrl, form) {
|
|
32
|
+
try {
|
|
33
|
+
await axios.post(uploadUrl, form, {
|
|
34
|
+
headers: form.getHeaders(),
|
|
35
|
+
maxBodyLength: Infinity,
|
|
36
|
+
maxContentLength: Infinity,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
const detail = error.response
|
|
41
|
+
? `status=${error.response.status} statusText=${error.response.statusText} data=${JSON.stringify(error.response.data)} url=${uploadUrl.substring(0, 80)}...`
|
|
42
|
+
: error.message;
|
|
43
|
+
throw new Error(`TOS upload failed: ${detail}`);
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
const ENHANCE_SIGNATURE_PATH = '/api/v3/contents/generations/tos-signature';
|
|
49
|
+
const SAM3_SIGNATURE_PATH = '/get_postsignature_url';
|
|
50
|
+
/**
|
|
51
|
+
* The enhancement host serves images and videos from one signature endpoint; only `file_type`
|
|
52
|
+
* separates them.
|
|
53
|
+
*/
|
|
54
|
+
export function createEnhanceSignatureAdapter(deps) {
|
|
55
|
+
return {
|
|
56
|
+
async prepareUpload(fileName) {
|
|
57
|
+
const body = await deps.transport.post(ENHANCE_SIGNATURE_PATH, {
|
|
58
|
+
file_type: deps.fileType,
|
|
59
|
+
file_name: fileName,
|
|
60
|
+
});
|
|
61
|
+
if (body.code !== 0 && body.code !== 200) {
|
|
62
|
+
throw new Error(body.message || 'Failed to get TOS signature');
|
|
63
|
+
}
|
|
64
|
+
const signature = body.data;
|
|
65
|
+
return {
|
|
66
|
+
uploadUrl: signature.url,
|
|
67
|
+
formFields: { key: keyFromUploadUrl(signature.url), ...normalizeSignatureFields(signature) },
|
|
68
|
+
};
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/** The SAM3 host always sends images. Only the failure message convention differs from enhance. */
|
|
73
|
+
export function createSam3SignatureAdapter(deps) {
|
|
74
|
+
return {
|
|
75
|
+
async prepareUpload(fileName) {
|
|
76
|
+
const body = await deps.transport.post(SAM3_SIGNATURE_PATH, {
|
|
77
|
+
file_type: 'image',
|
|
78
|
+
file_name: fileName,
|
|
79
|
+
});
|
|
80
|
+
if (body.code !== 0 && body.code !== 200) {
|
|
81
|
+
throw new Error(`get_postsignature_url error: ${body.message || 'unknown error'}`);
|
|
82
|
+
}
|
|
83
|
+
const signature = body.data;
|
|
84
|
+
if (!signature?.url) {
|
|
85
|
+
throw new Error('Missing upload URL in post signature response');
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
uploadUrl: signature.url,
|
|
89
|
+
formFields: { key: keyFromPolicyOrUploadUrl(signature), ...normalizeSignatureFields(signature) },
|
|
90
|
+
};
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
export async function uploadObject(deps) {
|
|
95
|
+
const form = await deps.adapter.prepareUpload(deps.fileName);
|
|
96
|
+
const payload = new FormData();
|
|
97
|
+
for (const [name, value] of Object.entries(form.formFields)) {
|
|
98
|
+
payload.append(name, value);
|
|
99
|
+
}
|
|
100
|
+
payload.append('file', deps.body, deps.fileName);
|
|
101
|
+
await deps.storage.submit(form.uploadUrl, payload);
|
|
102
|
+
return { fileId: parseFileIdFromUrl(form.uploadUrl), uploadUrl: form.uploadUrl };
|
|
103
|
+
}
|
|
104
|
+
export function createMediaUploader(deps) {
|
|
105
|
+
return async (body, fileName) => {
|
|
106
|
+
const { fileId } = await uploadObject({ ...deps, body, fileName });
|
|
107
|
+
return { fileId };
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
// ── shared, host-agnostic helpers ─────────────────────────────────────────────
|
|
111
|
+
/** Fields that describe the authorization itself rather than the storage form. */
|
|
112
|
+
const NOT_FORM_FIELDS = new Set(['url', 'file_id', 'key']);
|
|
113
|
+
/** Bare names the hosts hand back, and the `x-tos-` name storage actually wants. */
|
|
114
|
+
const TOS_FIELD_ALIASES = {
|
|
115
|
+
algorithm: 'x-tos-algorithm',
|
|
116
|
+
credential: 'x-tos-credential',
|
|
117
|
+
date: 'x-tos-date',
|
|
118
|
+
signature: 'x-tos-signature',
|
|
119
|
+
};
|
|
120
|
+
/**
|
|
121
|
+
* Canonicalise a signature response into storage-form fields.
|
|
122
|
+
*
|
|
123
|
+
* Never returns `key`: each host derives the object key differently, so the adapter supplies
|
|
124
|
+
* it. Tolerates both hosts' naming conventions, so a response that arrives in the other
|
|
125
|
+
* convention still yields a usable form.
|
|
126
|
+
*/
|
|
127
|
+
export function normalizeSignatureFields(response) {
|
|
128
|
+
const hasPolicy = Object.prototype.hasOwnProperty.call(response, 'policy');
|
|
129
|
+
const fields = {};
|
|
130
|
+
for (const [name, raw] of Object.entries(response)) {
|
|
131
|
+
if (NOT_FORM_FIELDS.has(name))
|
|
132
|
+
continue;
|
|
133
|
+
if (name === 'origin_policy') {
|
|
134
|
+
// The policy in its original JSON form. Only needed when the host did not already hand
|
|
135
|
+
// back a ready-to-post `policy`; taking both would duplicate the field.
|
|
136
|
+
if (!hasPolicy)
|
|
137
|
+
fields.policy = encodePolicy(raw);
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
fields[TOS_FIELD_ALIASES[name] ?? name] = String(raw);
|
|
141
|
+
}
|
|
142
|
+
return fields;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Storage accepts the policy either Base64-encoded or as raw JSON; volcengine-tos SDK versions
|
|
146
|
+
* differ in which one they hand back. Normalise to Base64.
|
|
147
|
+
*/
|
|
148
|
+
function encodePolicy(raw) {
|
|
149
|
+
const value = String(raw);
|
|
150
|
+
return value.trim().startsWith('{') ? Buffer.from(value, 'utf-8').toString('base64') : value;
|
|
151
|
+
}
|
|
152
|
+
/** Last path segment of the upload URL, percent-decoded. */
|
|
153
|
+
export function parseFileIdFromUrl(uploadUrl) {
|
|
154
|
+
const segments = new URL(uploadUrl).pathname.split('/');
|
|
155
|
+
return decodeURIComponent(segments.pop() || '');
|
|
156
|
+
}
|
|
157
|
+
function keyFromUploadUrl(uploadUrl) {
|
|
158
|
+
return decodeURIComponent(new URL(uploadUrl).pathname.slice(1));
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* The object key the SAM3 host authorises lives inside its policy conditions. If the policy is
|
|
162
|
+
* opaque (Base64, or missing entirely) the upload URL carries the same key.
|
|
163
|
+
*/
|
|
164
|
+
function keyFromPolicyOrUploadUrl(signature) {
|
|
165
|
+
const raw = signature.origin_policy ?? signature.policy;
|
|
166
|
+
if (typeof raw === 'string') {
|
|
167
|
+
try {
|
|
168
|
+
const parsed = JSON.parse(raw);
|
|
169
|
+
const entry = parsed?.conditions?.find((c) => c && typeof c === 'object' && 'key' in c);
|
|
170
|
+
if (entry?.key)
|
|
171
|
+
return String(entry.key);
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
// Opaque policy; the upload URL below carries the same key.
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return keyFromUploadUrl(signature.url);
|
|
178
|
+
}
|
|
179
|
+
export function checkLocalFile(filePath) {
|
|
180
|
+
if (!fs.existsSync(filePath)) {
|
|
181
|
+
throw new Error(`File does not exist: ${filePath}`);
|
|
182
|
+
}
|
|
183
|
+
const stats = fs.statSync(filePath);
|
|
184
|
+
const maxSize = 100 * 1024 * 1024;
|
|
185
|
+
if (stats.size > maxSize) {
|
|
186
|
+
throw new Error('File size exceeds 100MB limit');
|
|
187
|
+
}
|
|
188
|
+
return { filePath, fileName: path.basename(filePath) };
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=upload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../src/upload.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"video-enhancement.d.ts","sourceRoot":"","sources":["../src/video-enhancement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"video-enhancement.d.ts","sourceRoot":"","sources":["../src/video-enhancement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAmCpE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAkEnG"}
|