@mixedbread/sdk 0.56.0 → 0.57.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/CHANGELOG.md +22 -0
- package/client.d.mts +1 -1
- package/client.d.mts.map +1 -1
- package/client.d.ts +1 -1
- package/client.d.ts.map +1 -1
- package/client.js +1 -1
- package/client.js.map +1 -1
- package/client.mjs +1 -1
- package/client.mjs.map +1 -1
- package/index.d.mts +1 -0
- package/index.d.mts.map +1 -1
- package/index.d.ts +1 -0
- package/index.d.ts.map +1 -1
- package/index.js +3 -1
- package/index.js.map +1 -1
- package/index.mjs +1 -0
- package/index.mjs.map +1 -1
- package/lib/upload-file.d.mts +34 -0
- package/lib/upload-file.d.mts.map +1 -0
- package/lib/upload-file.d.ts +34 -0
- package/lib/upload-file.d.ts.map +1 -0
- package/lib/upload-file.js +146 -0
- package/lib/upload-file.js.map +1 -0
- package/lib/upload-file.mjs +141 -0
- package/lib/upload-file.mjs.map +1 -0
- package/package.json +1 -1
- package/resources/files/files.d.mts +156 -0
- package/resources/files/files.d.mts.map +1 -0
- package/resources/files/files.d.ts +156 -0
- package/resources/files/files.d.ts.map +1 -0
- package/resources/files/files.js +86 -0
- package/resources/files/files.js.map +1 -0
- package/resources/files/files.mjs +81 -0
- package/resources/files/files.mjs.map +1 -0
- package/resources/files/index.d.mts +3 -0
- package/resources/files/index.d.mts.map +1 -0
- package/resources/files/index.d.ts +3 -0
- package/resources/files/index.d.ts.map +1 -0
- package/resources/files/index.js +9 -0
- package/resources/files/index.js.map +1 -0
- package/resources/files/index.mjs +4 -0
- package/resources/files/index.mjs.map +1 -0
- package/resources/files/uploads.d.mts +169 -0
- package/resources/files/uploads.d.mts.map +1 -0
- package/resources/files/uploads.d.ts +169 -0
- package/resources/files/uploads.d.ts.map +1 -0
- package/resources/files/uploads.js +43 -0
- package/resources/files/uploads.js.map +1 -0
- package/resources/files/uploads.mjs +39 -0
- package/resources/files/uploads.mjs.map +1 -0
- package/resources/files.d.mts +1 -144
- package/resources/files.d.mts.map +1 -1
- package/resources/files.d.ts +1 -144
- package/resources/files.d.ts.map +1 -1
- package/resources/files.js +2 -73
- package/resources/files.js.map +1 -1
- package/resources/files.mjs +1 -71
- package/resources/files.mjs.map +1 -1
- package/resources/index.d.mts +1 -1
- package/resources/index.d.ts +1 -1
- package/resources/index.js +1 -1
- package/resources/index.js.map +1 -1
- package/resources/index.mjs +1 -1
- package/resources/stores/files.d.mts +9 -6
- package/resources/stores/files.d.mts.map +1 -1
- package/resources/stores/files.d.ts +9 -6
- package/resources/stores/files.d.ts.map +1 -1
- package/resources/stores/files.js +15 -4
- package/resources/stores/files.js.map +1 -1
- package/resources/stores/files.mjs +15 -4
- package/resources/stores/files.mjs.map +1 -1
- package/resources/stores/stores.d.mts +4 -4
- package/resources/stores/stores.d.mts.map +1 -1
- package/resources/stores/stores.d.ts +4 -4
- package/resources/stores/stores.d.ts.map +1 -1
- package/src/client.ts +10 -10
- package/src/index.ts +1 -0
- package/src/lib/upload-file.ts +233 -0
- package/src/resources/files/files.ts +239 -0
- package/src/resources/files/index.ts +23 -0
- package/src/resources/files/uploads.ts +229 -0
- package/src/resources/files.ts +1 -201
- package/src/resources/index.ts +1 -1
- package/src/resources/stores/files.ts +27 -6
- package/src/resources/stores/stores.ts +4 -4
- package/src/version.ts +1 -1
- package/version.d.mts +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/version.mjs +1 -1
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MultipartUploadError = void 0;
|
|
4
|
+
exports.handleFileCreate = handleFileCreate;
|
|
5
|
+
const api_promise_1 = require("../core/api-promise.js");
|
|
6
|
+
const to_file_1 = require("../internal/to-file.js");
|
|
7
|
+
const uploads_1 = require("../internal/uploads.js");
|
|
8
|
+
const DEFAULT_THRESHOLD = 100 * 1024 * 1024; // 100MB
|
|
9
|
+
const DEFAULT_CONCURRENCY = 5;
|
|
10
|
+
const DEFAULT_PART_SIZE = 100 * 1024 * 1024; // 100MB per part
|
|
11
|
+
const MIN_PART_SIZE = 5 * 1024 * 1024; // 5MB minimum
|
|
12
|
+
const MAX_PART_COUNT = 10000;
|
|
13
|
+
class MultipartUploadError extends Error {
|
|
14
|
+
constructor(message, uploadId) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.name = 'MultipartUploadError';
|
|
17
|
+
this.uploadId = uploadId;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
exports.MultipartUploadError = MultipartUploadError;
|
|
21
|
+
function makeResponseProps(response) {
|
|
22
|
+
return {
|
|
23
|
+
response,
|
|
24
|
+
options: {},
|
|
25
|
+
controller: new AbortController(),
|
|
26
|
+
requestLogID: '',
|
|
27
|
+
retryOfRequestLogID: undefined,
|
|
28
|
+
startTime: Date.now(),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function handleFileCreate(client, body, options) {
|
|
32
|
+
let resolvedData;
|
|
33
|
+
const responsePromise = (async () => {
|
|
34
|
+
const { multipartUpload, ...rest } = body;
|
|
35
|
+
const threshold = multipartUpload?.threshold ?? DEFAULT_THRESHOLD;
|
|
36
|
+
const concurrency = multipartUpload?.concurrency ?? DEFAULT_CONCURRENCY;
|
|
37
|
+
const partSize = multipartUpload?.partSize ?? DEFAULT_PART_SIZE;
|
|
38
|
+
if (partSize < MIN_PART_SIZE) {
|
|
39
|
+
throw new Error(`partSize must be at least 5MB (${MIN_PART_SIZE} bytes), got ${partSize}`);
|
|
40
|
+
}
|
|
41
|
+
if (threshold < MIN_PART_SIZE) {
|
|
42
|
+
throw new Error(`threshold must be at least 5MB (${MIN_PART_SIZE} bytes), got ${threshold}`);
|
|
43
|
+
}
|
|
44
|
+
// Normalize the uploadable to a File object so we can inspect size
|
|
45
|
+
const file = await (0, to_file_1.toFile)(rest.file);
|
|
46
|
+
const fileSize = file.size;
|
|
47
|
+
// Small file: delegate to the standard single-request upload
|
|
48
|
+
if (fileSize <= threshold) {
|
|
49
|
+
const apiPromise = client.post('/v1/files', await (0, uploads_1.multipartFormRequestOptions)({ body: { file }, ...options }, client));
|
|
50
|
+
const { data, response } = await apiPromise.withResponse();
|
|
51
|
+
resolvedData = data;
|
|
52
|
+
return makeResponseProps(response);
|
|
53
|
+
}
|
|
54
|
+
// Large file: multipart upload flow
|
|
55
|
+
const partCount = Math.ceil(fileSize / partSize);
|
|
56
|
+
if (partCount > MAX_PART_COUNT) {
|
|
57
|
+
throw new Error(`File would require ${partCount} parts, but the maximum is ${MAX_PART_COUNT}. Increase partSize to at least ${Math.ceil(fileSize / MAX_PART_COUNT)} bytes.`);
|
|
58
|
+
}
|
|
59
|
+
const filename = file.name || 'unknown_file';
|
|
60
|
+
const mimeType = file.type || 'application/octet-stream';
|
|
61
|
+
// Step 1: Initiate multipart upload
|
|
62
|
+
const uploadResponse = await client.files.uploads.create({
|
|
63
|
+
filename,
|
|
64
|
+
file_size: fileSize,
|
|
65
|
+
mime_type: mimeType,
|
|
66
|
+
part_count: partCount,
|
|
67
|
+
});
|
|
68
|
+
const uploadId = uploadResponse.id;
|
|
69
|
+
const partUrls = uploadResponse.part_urls;
|
|
70
|
+
try {
|
|
71
|
+
// Use the client's configured fetch (respects custom fetch, proxy, TLS settings)
|
|
72
|
+
const fetchFn = client.fetch;
|
|
73
|
+
// Step 2: Upload parts with concurrency control
|
|
74
|
+
const completedParts = await uploadParts(file, partUrls, concurrency, partSize, fileSize, fetchFn, options?.signal, multipartUpload?.onPartUpload);
|
|
75
|
+
// Step 3: Complete the multipart upload
|
|
76
|
+
const completePromise = client.files.uploads.complete(uploadId, { parts: completedParts });
|
|
77
|
+
const { data, response } = await completePromise.withResponse();
|
|
78
|
+
resolvedData = data;
|
|
79
|
+
return makeResponseProps(response);
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
// Attempt to abort on any failure
|
|
83
|
+
try {
|
|
84
|
+
await client.files.uploads.abort(uploadId);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// Abort is best-effort; ignore failures
|
|
88
|
+
}
|
|
89
|
+
if (error instanceof MultipartUploadError) {
|
|
90
|
+
throw error;
|
|
91
|
+
}
|
|
92
|
+
throw new MultipartUploadError(error instanceof Error ? error.message : String(error), uploadId);
|
|
93
|
+
}
|
|
94
|
+
})();
|
|
95
|
+
return new api_promise_1.APIPromise(client, responsePromise, async () => resolvedData);
|
|
96
|
+
}
|
|
97
|
+
async function uploadParts(file, partUrls, concurrency, partSize, fileSize, fetchFn, signal, onPartUpload) {
|
|
98
|
+
const results = [];
|
|
99
|
+
const totalParts = partUrls.length;
|
|
100
|
+
let uploadedBytes = 0;
|
|
101
|
+
let nextIndex = 0;
|
|
102
|
+
async function worker() {
|
|
103
|
+
while (nextIndex < partUrls.length) {
|
|
104
|
+
if (signal?.aborted) {
|
|
105
|
+
throw new Error('Upload aborted');
|
|
106
|
+
}
|
|
107
|
+
const index = nextIndex++;
|
|
108
|
+
const { part_number, url } = partUrls[index];
|
|
109
|
+
const start = (part_number - 1) * partSize;
|
|
110
|
+
const end = Math.min(start + partSize, fileSize);
|
|
111
|
+
const chunkSize = end - start;
|
|
112
|
+
const blob = file.slice(start, end);
|
|
113
|
+
const response = await fetchFn(url, {
|
|
114
|
+
method: 'PUT',
|
|
115
|
+
body: blob,
|
|
116
|
+
...(signal ? { signal } : {}),
|
|
117
|
+
});
|
|
118
|
+
if (!response.ok) {
|
|
119
|
+
throw new Error(`Part ${part_number} upload failed with status ${response.status}`);
|
|
120
|
+
}
|
|
121
|
+
const etag = response.headers.get('ETag') || response.headers.get('etag');
|
|
122
|
+
if (!etag) {
|
|
123
|
+
throw new Error(`Part ${part_number} response missing ETag header`);
|
|
124
|
+
}
|
|
125
|
+
results.push({ part_number, etag });
|
|
126
|
+
uploadedBytes += chunkSize;
|
|
127
|
+
onPartUpload?.({
|
|
128
|
+
partNumber: part_number,
|
|
129
|
+
totalParts,
|
|
130
|
+
partSize: chunkSize,
|
|
131
|
+
uploadedBytes,
|
|
132
|
+
totalBytes: fileSize,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const workerCount = Math.min(concurrency, partUrls.length);
|
|
137
|
+
const workers = [];
|
|
138
|
+
for (let i = 0; i < workerCount; i++) {
|
|
139
|
+
workers.push(worker());
|
|
140
|
+
}
|
|
141
|
+
await Promise.all(workers);
|
|
142
|
+
// Sort by part number for the complete call
|
|
143
|
+
results.sort((a, b) => a.part_number - b.part_number);
|
|
144
|
+
return results;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=upload-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-file.js","sourceRoot":"","sources":["../src/lib/upload-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { APIPromise } from "../core/api-promise.mjs";
|
|
2
|
+
import { toFile } from "../internal/to-file.mjs";
|
|
3
|
+
import { multipartFormRequestOptions } from "../internal/uploads.mjs";
|
|
4
|
+
const DEFAULT_THRESHOLD = 100 * 1024 * 1024; // 100MB
|
|
5
|
+
const DEFAULT_CONCURRENCY = 5;
|
|
6
|
+
const DEFAULT_PART_SIZE = 100 * 1024 * 1024; // 100MB per part
|
|
7
|
+
const MIN_PART_SIZE = 5 * 1024 * 1024; // 5MB minimum
|
|
8
|
+
const MAX_PART_COUNT = 10000;
|
|
9
|
+
export class MultipartUploadError extends Error {
|
|
10
|
+
constructor(message, uploadId) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.name = 'MultipartUploadError';
|
|
13
|
+
this.uploadId = uploadId;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function makeResponseProps(response) {
|
|
17
|
+
return {
|
|
18
|
+
response,
|
|
19
|
+
options: {},
|
|
20
|
+
controller: new AbortController(),
|
|
21
|
+
requestLogID: '',
|
|
22
|
+
retryOfRequestLogID: undefined,
|
|
23
|
+
startTime: Date.now(),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export function handleFileCreate(client, body, options) {
|
|
27
|
+
let resolvedData;
|
|
28
|
+
const responsePromise = (async () => {
|
|
29
|
+
const { multipartUpload, ...rest } = body;
|
|
30
|
+
const threshold = multipartUpload?.threshold ?? DEFAULT_THRESHOLD;
|
|
31
|
+
const concurrency = multipartUpload?.concurrency ?? DEFAULT_CONCURRENCY;
|
|
32
|
+
const partSize = multipartUpload?.partSize ?? DEFAULT_PART_SIZE;
|
|
33
|
+
if (partSize < MIN_PART_SIZE) {
|
|
34
|
+
throw new Error(`partSize must be at least 5MB (${MIN_PART_SIZE} bytes), got ${partSize}`);
|
|
35
|
+
}
|
|
36
|
+
if (threshold < MIN_PART_SIZE) {
|
|
37
|
+
throw new Error(`threshold must be at least 5MB (${MIN_PART_SIZE} bytes), got ${threshold}`);
|
|
38
|
+
}
|
|
39
|
+
// Normalize the uploadable to a File object so we can inspect size
|
|
40
|
+
const file = await toFile(rest.file);
|
|
41
|
+
const fileSize = file.size;
|
|
42
|
+
// Small file: delegate to the standard single-request upload
|
|
43
|
+
if (fileSize <= threshold) {
|
|
44
|
+
const apiPromise = client.post('/v1/files', await multipartFormRequestOptions({ body: { file }, ...options }, client));
|
|
45
|
+
const { data, response } = await apiPromise.withResponse();
|
|
46
|
+
resolvedData = data;
|
|
47
|
+
return makeResponseProps(response);
|
|
48
|
+
}
|
|
49
|
+
// Large file: multipart upload flow
|
|
50
|
+
const partCount = Math.ceil(fileSize / partSize);
|
|
51
|
+
if (partCount > MAX_PART_COUNT) {
|
|
52
|
+
throw new Error(`File would require ${partCount} parts, but the maximum is ${MAX_PART_COUNT}. Increase partSize to at least ${Math.ceil(fileSize / MAX_PART_COUNT)} bytes.`);
|
|
53
|
+
}
|
|
54
|
+
const filename = file.name || 'unknown_file';
|
|
55
|
+
const mimeType = file.type || 'application/octet-stream';
|
|
56
|
+
// Step 1: Initiate multipart upload
|
|
57
|
+
const uploadResponse = await client.files.uploads.create({
|
|
58
|
+
filename,
|
|
59
|
+
file_size: fileSize,
|
|
60
|
+
mime_type: mimeType,
|
|
61
|
+
part_count: partCount,
|
|
62
|
+
});
|
|
63
|
+
const uploadId = uploadResponse.id;
|
|
64
|
+
const partUrls = uploadResponse.part_urls;
|
|
65
|
+
try {
|
|
66
|
+
// Use the client's configured fetch (respects custom fetch, proxy, TLS settings)
|
|
67
|
+
const fetchFn = client.fetch;
|
|
68
|
+
// Step 2: Upload parts with concurrency control
|
|
69
|
+
const completedParts = await uploadParts(file, partUrls, concurrency, partSize, fileSize, fetchFn, options?.signal, multipartUpload?.onPartUpload);
|
|
70
|
+
// Step 3: Complete the multipart upload
|
|
71
|
+
const completePromise = client.files.uploads.complete(uploadId, { parts: completedParts });
|
|
72
|
+
const { data, response } = await completePromise.withResponse();
|
|
73
|
+
resolvedData = data;
|
|
74
|
+
return makeResponseProps(response);
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
// Attempt to abort on any failure
|
|
78
|
+
try {
|
|
79
|
+
await client.files.uploads.abort(uploadId);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// Abort is best-effort; ignore failures
|
|
83
|
+
}
|
|
84
|
+
if (error instanceof MultipartUploadError) {
|
|
85
|
+
throw error;
|
|
86
|
+
}
|
|
87
|
+
throw new MultipartUploadError(error instanceof Error ? error.message : String(error), uploadId);
|
|
88
|
+
}
|
|
89
|
+
})();
|
|
90
|
+
return new APIPromise(client, responsePromise, async () => resolvedData);
|
|
91
|
+
}
|
|
92
|
+
async function uploadParts(file, partUrls, concurrency, partSize, fileSize, fetchFn, signal, onPartUpload) {
|
|
93
|
+
const results = [];
|
|
94
|
+
const totalParts = partUrls.length;
|
|
95
|
+
let uploadedBytes = 0;
|
|
96
|
+
let nextIndex = 0;
|
|
97
|
+
async function worker() {
|
|
98
|
+
while (nextIndex < partUrls.length) {
|
|
99
|
+
if (signal?.aborted) {
|
|
100
|
+
throw new Error('Upload aborted');
|
|
101
|
+
}
|
|
102
|
+
const index = nextIndex++;
|
|
103
|
+
const { part_number, url } = partUrls[index];
|
|
104
|
+
const start = (part_number - 1) * partSize;
|
|
105
|
+
const end = Math.min(start + partSize, fileSize);
|
|
106
|
+
const chunkSize = end - start;
|
|
107
|
+
const blob = file.slice(start, end);
|
|
108
|
+
const response = await fetchFn(url, {
|
|
109
|
+
method: 'PUT',
|
|
110
|
+
body: blob,
|
|
111
|
+
...(signal ? { signal } : {}),
|
|
112
|
+
});
|
|
113
|
+
if (!response.ok) {
|
|
114
|
+
throw new Error(`Part ${part_number} upload failed with status ${response.status}`);
|
|
115
|
+
}
|
|
116
|
+
const etag = response.headers.get('ETag') || response.headers.get('etag');
|
|
117
|
+
if (!etag) {
|
|
118
|
+
throw new Error(`Part ${part_number} response missing ETag header`);
|
|
119
|
+
}
|
|
120
|
+
results.push({ part_number, etag });
|
|
121
|
+
uploadedBytes += chunkSize;
|
|
122
|
+
onPartUpload?.({
|
|
123
|
+
partNumber: part_number,
|
|
124
|
+
totalParts,
|
|
125
|
+
partSize: chunkSize,
|
|
126
|
+
uploadedBytes,
|
|
127
|
+
totalBytes: fileSize,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const workerCount = Math.min(concurrency, partUrls.length);
|
|
132
|
+
const workers = [];
|
|
133
|
+
for (let i = 0; i < workerCount; i++) {
|
|
134
|
+
workers.push(worker());
|
|
135
|
+
}
|
|
136
|
+
await Promise.all(workers);
|
|
137
|
+
// Sort by part number for the complete call
|
|
138
|
+
results.sort((a, b) => a.part_number - b.part_number);
|
|
139
|
+
return results;
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=upload-file.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-file.mjs","sourceRoot":"","sources":["../src/lib/upload-file.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { APIResource } from "../../core/resource.mjs";
|
|
2
|
+
import * as UploadsAPI from "./uploads.mjs";
|
|
3
|
+
import { MultipartUploadPart, MultipartUploadPartURL, UploadAbortResponse, UploadCompleteParams, UploadCreateParams, UploadCreateResponse, UploadListResponse, UploadRetrieveResponse, Uploads } from "./uploads.mjs";
|
|
4
|
+
import { APIPromise } from "../../core/api-promise.mjs";
|
|
5
|
+
import { Cursor, type CursorParams, PagePromise } from "../../core/pagination.mjs";
|
|
6
|
+
import { type Uploadable } from "../../core/uploads.mjs";
|
|
7
|
+
import { RequestOptions } from "../../internal/request-options.mjs";
|
|
8
|
+
import { type MultipartUploadConfig } from "../../lib/upload-file.mjs";
|
|
9
|
+
export declare class Files extends APIResource {
|
|
10
|
+
uploads: UploadsAPI.Uploads;
|
|
11
|
+
/**
|
|
12
|
+
* Upload a new file.
|
|
13
|
+
*
|
|
14
|
+
* Args: file: The file to upload.
|
|
15
|
+
*
|
|
16
|
+
* Returns: FileResponse: The response containing the details of the uploaded file.
|
|
17
|
+
*/
|
|
18
|
+
create(body: FileCreateParams, options?: RequestOptions): APIPromise<FileObject>;
|
|
19
|
+
/**
|
|
20
|
+
* Retrieve details of a specific file by its ID.
|
|
21
|
+
*
|
|
22
|
+
* Args: file_id: The ID of the file to retrieve.
|
|
23
|
+
*
|
|
24
|
+
* Returns: FileResponse: The response containing the file details.
|
|
25
|
+
*/
|
|
26
|
+
retrieve(fileID: string, options?: RequestOptions): APIPromise<FileObject>;
|
|
27
|
+
/**
|
|
28
|
+
* Update the details of a specific file.
|
|
29
|
+
*
|
|
30
|
+
* Args: file_id: The ID of the file to update. file: The new details for the file.
|
|
31
|
+
*
|
|
32
|
+
* Returns: FileObject: The updated file details.
|
|
33
|
+
*/
|
|
34
|
+
update(fileID: string, body: FileUpdateParams, options?: RequestOptions): APIPromise<FileObject>;
|
|
35
|
+
/**
|
|
36
|
+
* List all files for the authenticated user.
|
|
37
|
+
*
|
|
38
|
+
* Args: pagination: The pagination options
|
|
39
|
+
*
|
|
40
|
+
* Returns: A list of files belonging to the user.
|
|
41
|
+
*/
|
|
42
|
+
list(query?: FileListParams | null | undefined, options?: RequestOptions): PagePromise<FileObjectsCursor, FileObject>;
|
|
43
|
+
/**
|
|
44
|
+
* Delete a specific file by its ID.
|
|
45
|
+
*
|
|
46
|
+
* Args: file_id: The ID of the file to delete.
|
|
47
|
+
*
|
|
48
|
+
* Returns: FileDeleted: The response containing the details of the deleted file.
|
|
49
|
+
*/
|
|
50
|
+
delete(fileID: string, options?: RequestOptions): APIPromise<FileDeleteResponse>;
|
|
51
|
+
/**
|
|
52
|
+
* Download a specific file by its ID.
|
|
53
|
+
*
|
|
54
|
+
* Args: file_id: The ID of the file to download.
|
|
55
|
+
*
|
|
56
|
+
* Returns: FileStreamResponse: The response containing the file to be downloaded.
|
|
57
|
+
*/
|
|
58
|
+
content(fileID: string, options?: RequestOptions): APIPromise<Response>;
|
|
59
|
+
}
|
|
60
|
+
export type FileObjectsCursor = Cursor<FileObject>;
|
|
61
|
+
/**
|
|
62
|
+
* A model representing a file object in the system.
|
|
63
|
+
*
|
|
64
|
+
* This model contains metadata about files stored in the system, including
|
|
65
|
+
* identifiers, size information, and timestamps.
|
|
66
|
+
*/
|
|
67
|
+
export interface FileObject {
|
|
68
|
+
/**
|
|
69
|
+
* Unique identifier for the file
|
|
70
|
+
*/
|
|
71
|
+
id: string;
|
|
72
|
+
/**
|
|
73
|
+
* Name of the file including extension
|
|
74
|
+
*/
|
|
75
|
+
filename: string;
|
|
76
|
+
/**
|
|
77
|
+
* Size of the file in bytes
|
|
78
|
+
*/
|
|
79
|
+
bytes: number;
|
|
80
|
+
/**
|
|
81
|
+
* MIME type of the file
|
|
82
|
+
*/
|
|
83
|
+
mime_type: string;
|
|
84
|
+
/**
|
|
85
|
+
* Version of the file
|
|
86
|
+
*/
|
|
87
|
+
version: number;
|
|
88
|
+
/**
|
|
89
|
+
* Timestamp when the file was created
|
|
90
|
+
*/
|
|
91
|
+
created_at: string;
|
|
92
|
+
/**
|
|
93
|
+
* Timestamp when the file was last updated
|
|
94
|
+
*/
|
|
95
|
+
updated_at: string;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Pagination model that includes total count of items.
|
|
99
|
+
*/
|
|
100
|
+
export interface PaginationWithTotal {
|
|
101
|
+
/**
|
|
102
|
+
* Maximum number of items to return per page
|
|
103
|
+
*/
|
|
104
|
+
limit?: number;
|
|
105
|
+
/**
|
|
106
|
+
* Offset of the first item to return
|
|
107
|
+
*/
|
|
108
|
+
offset?: number;
|
|
109
|
+
/**
|
|
110
|
+
* Total number of items available
|
|
111
|
+
*/
|
|
112
|
+
total?: number;
|
|
113
|
+
}
|
|
114
|
+
export interface FileDeleteResponse {
|
|
115
|
+
/**
|
|
116
|
+
* The ID of the deleted file
|
|
117
|
+
*/
|
|
118
|
+
id: string;
|
|
119
|
+
/**
|
|
120
|
+
* Whether the file was deleted
|
|
121
|
+
*/
|
|
122
|
+
deleted?: boolean;
|
|
123
|
+
/**
|
|
124
|
+
* The type of the deleted object
|
|
125
|
+
*/
|
|
126
|
+
object?: 'file';
|
|
127
|
+
}
|
|
128
|
+
export interface FileCreateParams {
|
|
129
|
+
/**
|
|
130
|
+
* The file to upload
|
|
131
|
+
*/
|
|
132
|
+
file: Uploadable;
|
|
133
|
+
/**
|
|
134
|
+
* Optional configuration for automatic multipart uploads.
|
|
135
|
+
* When the file size exceeds the threshold (default 100MB), the SDK
|
|
136
|
+
* will automatically use multipart upload with presigned URLs.
|
|
137
|
+
*/
|
|
138
|
+
multipartUpload?: MultipartUploadConfig;
|
|
139
|
+
}
|
|
140
|
+
export interface FileUpdateParams {
|
|
141
|
+
/**
|
|
142
|
+
* The file to update
|
|
143
|
+
*/
|
|
144
|
+
file: Uploadable;
|
|
145
|
+
}
|
|
146
|
+
export interface FileListParams extends CursorParams {
|
|
147
|
+
/**
|
|
148
|
+
* Search query for fuzzy matching over name and description fields
|
|
149
|
+
*/
|
|
150
|
+
q?: string | null;
|
|
151
|
+
}
|
|
152
|
+
export declare namespace Files {
|
|
153
|
+
export { type FileObject as FileObject, type PaginationWithTotal as PaginationWithTotal, type FileDeleteResponse as FileDeleteResponse, type FileObjectsCursor as FileObjectsCursor, type FileCreateParams as FileCreateParams, type FileUpdateParams as FileUpdateParams, type FileListParams as FileListParams, };
|
|
154
|
+
export { Uploads as Uploads, type MultipartUploadPart as MultipartUploadPart, type MultipartUploadPartURL as MultipartUploadPartURL, type UploadCreateResponse as UploadCreateResponse, type UploadRetrieveResponse as UploadRetrieveResponse, type UploadListResponse as UploadListResponse, type UploadAbortResponse as UploadAbortResponse, type UploadCreateParams as UploadCreateParams, type UploadCompleteParams as UploadCompleteParams, };
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=files.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.d.mts","sourceRoot":"","sources":["../../src/resources/files/files.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { APIResource } from "../../core/resource.js";
|
|
2
|
+
import * as UploadsAPI from "./uploads.js";
|
|
3
|
+
import { MultipartUploadPart, MultipartUploadPartURL, UploadAbortResponse, UploadCompleteParams, UploadCreateParams, UploadCreateResponse, UploadListResponse, UploadRetrieveResponse, Uploads } from "./uploads.js";
|
|
4
|
+
import { APIPromise } from "../../core/api-promise.js";
|
|
5
|
+
import { Cursor, type CursorParams, PagePromise } from "../../core/pagination.js";
|
|
6
|
+
import { type Uploadable } from "../../core/uploads.js";
|
|
7
|
+
import { RequestOptions } from "../../internal/request-options.js";
|
|
8
|
+
import { type MultipartUploadConfig } from "../../lib/upload-file.js";
|
|
9
|
+
export declare class Files extends APIResource {
|
|
10
|
+
uploads: UploadsAPI.Uploads;
|
|
11
|
+
/**
|
|
12
|
+
* Upload a new file.
|
|
13
|
+
*
|
|
14
|
+
* Args: file: The file to upload.
|
|
15
|
+
*
|
|
16
|
+
* Returns: FileResponse: The response containing the details of the uploaded file.
|
|
17
|
+
*/
|
|
18
|
+
create(body: FileCreateParams, options?: RequestOptions): APIPromise<FileObject>;
|
|
19
|
+
/**
|
|
20
|
+
* Retrieve details of a specific file by its ID.
|
|
21
|
+
*
|
|
22
|
+
* Args: file_id: The ID of the file to retrieve.
|
|
23
|
+
*
|
|
24
|
+
* Returns: FileResponse: The response containing the file details.
|
|
25
|
+
*/
|
|
26
|
+
retrieve(fileID: string, options?: RequestOptions): APIPromise<FileObject>;
|
|
27
|
+
/**
|
|
28
|
+
* Update the details of a specific file.
|
|
29
|
+
*
|
|
30
|
+
* Args: file_id: The ID of the file to update. file: The new details for the file.
|
|
31
|
+
*
|
|
32
|
+
* Returns: FileObject: The updated file details.
|
|
33
|
+
*/
|
|
34
|
+
update(fileID: string, body: FileUpdateParams, options?: RequestOptions): APIPromise<FileObject>;
|
|
35
|
+
/**
|
|
36
|
+
* List all files for the authenticated user.
|
|
37
|
+
*
|
|
38
|
+
* Args: pagination: The pagination options
|
|
39
|
+
*
|
|
40
|
+
* Returns: A list of files belonging to the user.
|
|
41
|
+
*/
|
|
42
|
+
list(query?: FileListParams | null | undefined, options?: RequestOptions): PagePromise<FileObjectsCursor, FileObject>;
|
|
43
|
+
/**
|
|
44
|
+
* Delete a specific file by its ID.
|
|
45
|
+
*
|
|
46
|
+
* Args: file_id: The ID of the file to delete.
|
|
47
|
+
*
|
|
48
|
+
* Returns: FileDeleted: The response containing the details of the deleted file.
|
|
49
|
+
*/
|
|
50
|
+
delete(fileID: string, options?: RequestOptions): APIPromise<FileDeleteResponse>;
|
|
51
|
+
/**
|
|
52
|
+
* Download a specific file by its ID.
|
|
53
|
+
*
|
|
54
|
+
* Args: file_id: The ID of the file to download.
|
|
55
|
+
*
|
|
56
|
+
* Returns: FileStreamResponse: The response containing the file to be downloaded.
|
|
57
|
+
*/
|
|
58
|
+
content(fileID: string, options?: RequestOptions): APIPromise<Response>;
|
|
59
|
+
}
|
|
60
|
+
export type FileObjectsCursor = Cursor<FileObject>;
|
|
61
|
+
/**
|
|
62
|
+
* A model representing a file object in the system.
|
|
63
|
+
*
|
|
64
|
+
* This model contains metadata about files stored in the system, including
|
|
65
|
+
* identifiers, size information, and timestamps.
|
|
66
|
+
*/
|
|
67
|
+
export interface FileObject {
|
|
68
|
+
/**
|
|
69
|
+
* Unique identifier for the file
|
|
70
|
+
*/
|
|
71
|
+
id: string;
|
|
72
|
+
/**
|
|
73
|
+
* Name of the file including extension
|
|
74
|
+
*/
|
|
75
|
+
filename: string;
|
|
76
|
+
/**
|
|
77
|
+
* Size of the file in bytes
|
|
78
|
+
*/
|
|
79
|
+
bytes: number;
|
|
80
|
+
/**
|
|
81
|
+
* MIME type of the file
|
|
82
|
+
*/
|
|
83
|
+
mime_type: string;
|
|
84
|
+
/**
|
|
85
|
+
* Version of the file
|
|
86
|
+
*/
|
|
87
|
+
version: number;
|
|
88
|
+
/**
|
|
89
|
+
* Timestamp when the file was created
|
|
90
|
+
*/
|
|
91
|
+
created_at: string;
|
|
92
|
+
/**
|
|
93
|
+
* Timestamp when the file was last updated
|
|
94
|
+
*/
|
|
95
|
+
updated_at: string;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Pagination model that includes total count of items.
|
|
99
|
+
*/
|
|
100
|
+
export interface PaginationWithTotal {
|
|
101
|
+
/**
|
|
102
|
+
* Maximum number of items to return per page
|
|
103
|
+
*/
|
|
104
|
+
limit?: number;
|
|
105
|
+
/**
|
|
106
|
+
* Offset of the first item to return
|
|
107
|
+
*/
|
|
108
|
+
offset?: number;
|
|
109
|
+
/**
|
|
110
|
+
* Total number of items available
|
|
111
|
+
*/
|
|
112
|
+
total?: number;
|
|
113
|
+
}
|
|
114
|
+
export interface FileDeleteResponse {
|
|
115
|
+
/**
|
|
116
|
+
* The ID of the deleted file
|
|
117
|
+
*/
|
|
118
|
+
id: string;
|
|
119
|
+
/**
|
|
120
|
+
* Whether the file was deleted
|
|
121
|
+
*/
|
|
122
|
+
deleted?: boolean;
|
|
123
|
+
/**
|
|
124
|
+
* The type of the deleted object
|
|
125
|
+
*/
|
|
126
|
+
object?: 'file';
|
|
127
|
+
}
|
|
128
|
+
export interface FileCreateParams {
|
|
129
|
+
/**
|
|
130
|
+
* The file to upload
|
|
131
|
+
*/
|
|
132
|
+
file: Uploadable;
|
|
133
|
+
/**
|
|
134
|
+
* Optional configuration for automatic multipart uploads.
|
|
135
|
+
* When the file size exceeds the threshold (default 100MB), the SDK
|
|
136
|
+
* will automatically use multipart upload with presigned URLs.
|
|
137
|
+
*/
|
|
138
|
+
multipartUpload?: MultipartUploadConfig;
|
|
139
|
+
}
|
|
140
|
+
export interface FileUpdateParams {
|
|
141
|
+
/**
|
|
142
|
+
* The file to update
|
|
143
|
+
*/
|
|
144
|
+
file: Uploadable;
|
|
145
|
+
}
|
|
146
|
+
export interface FileListParams extends CursorParams {
|
|
147
|
+
/**
|
|
148
|
+
* Search query for fuzzy matching over name and description fields
|
|
149
|
+
*/
|
|
150
|
+
q?: string | null;
|
|
151
|
+
}
|
|
152
|
+
export declare namespace Files {
|
|
153
|
+
export { type FileObject as FileObject, type PaginationWithTotal as PaginationWithTotal, type FileDeleteResponse as FileDeleteResponse, type FileObjectsCursor as FileObjectsCursor, type FileCreateParams as FileCreateParams, type FileUpdateParams as FileUpdateParams, type FileListParams as FileListParams, };
|
|
154
|
+
export { Uploads as Uploads, type MultipartUploadPart as MultipartUploadPart, type MultipartUploadPartURL as MultipartUploadPartURL, type UploadCreateResponse as UploadCreateResponse, type UploadRetrieveResponse as UploadRetrieveResponse, type UploadListResponse as UploadListResponse, type UploadAbortResponse as UploadAbortResponse, type UploadCreateParams as UploadCreateParams, type UploadCompleteParams as UploadCompleteParams, };
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/resources/files/files.ts"],"names":[],"mappings":"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"}
|