@kaiz11/stack-client 0.0.14
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 +32 -0
- package/README.md +586 -0
- package/dist/accounts/accounts-client.d.ts +188 -0
- package/dist/accounts/accounts-client.d.ts.map +1 -0
- package/dist/accounts/accounts-client.js +264 -0
- package/dist/accounts/accounts-client.js.map +1 -0
- package/dist/accounts/index.d.ts +8 -0
- package/dist/accounts/index.d.ts.map +1 -0
- package/dist/accounts/index.js +8 -0
- package/dist/accounts/index.js.map +1 -0
- package/dist/accounts/mock-accounts.d.ts +90 -0
- package/dist/accounts/mock-accounts.d.ts.map +1 -0
- package/dist/accounts/mock-accounts.js +434 -0
- package/dist/accounts/mock-accounts.js.map +1 -0
- package/dist/accounts/types.d.ts +180 -0
- package/dist/accounts/types.d.ts.map +1 -0
- package/dist/accounts/types.js +59 -0
- package/dist/accounts/types.js.map +1 -0
- package/dist/auth/auth-client.d.ts +224 -0
- package/dist/auth/auth-client.d.ts.map +1 -0
- package/dist/auth/auth-client.js +230 -0
- package/dist/auth/auth-client.js.map +1 -0
- package/dist/auth/base-auth.d.ts +44 -0
- package/dist/auth/base-auth.d.ts.map +1 -0
- package/dist/auth/base-auth.js +55 -0
- package/dist/auth/base-auth.js.map +1 -0
- package/dist/auth/index.d.ts +11 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +11 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/methods/admin.d.ts +59 -0
- package/dist/auth/methods/admin.d.ts.map +1 -0
- package/dist/auth/methods/admin.js +55 -0
- package/dist/auth/methods/admin.js.map +1 -0
- package/dist/auth/methods/index.d.ts +9 -0
- package/dist/auth/methods/index.d.ts.map +1 -0
- package/dist/auth/methods/index.js +8 -0
- package/dist/auth/methods/index.js.map +1 -0
- package/dist/auth/methods/magic-link.d.ts +27 -0
- package/dist/auth/methods/magic-link.d.ts.map +1 -0
- package/dist/auth/methods/magic-link.js +37 -0
- package/dist/auth/methods/magic-link.js.map +1 -0
- package/dist/auth/methods/mfa.d.ts +92 -0
- package/dist/auth/methods/mfa.d.ts.map +1 -0
- package/dist/auth/methods/mfa.js +153 -0
- package/dist/auth/methods/mfa.js.map +1 -0
- package/dist/auth/methods/oauth.d.ts +62 -0
- package/dist/auth/methods/oauth.d.ts.map +1 -0
- package/dist/auth/methods/oauth.js +165 -0
- package/dist/auth/methods/oauth.js.map +1 -0
- package/dist/auth/methods/otp.d.ts +43 -0
- package/dist/auth/methods/otp.d.ts.map +1 -0
- package/dist/auth/methods/otp.js +66 -0
- package/dist/auth/methods/otp.js.map +1 -0
- package/dist/auth/methods/password.d.ts +64 -0
- package/dist/auth/methods/password.d.ts.map +1 -0
- package/dist/auth/methods/password.js +116 -0
- package/dist/auth/methods/password.js.map +1 -0
- package/dist/auth/methods/recovery.d.ts +62 -0
- package/dist/auth/methods/recovery.d.ts.map +1 -0
- package/dist/auth/methods/recovery.js +100 -0
- package/dist/auth/methods/recovery.js.map +1 -0
- package/dist/auth/mock-auth.d.ts +135 -0
- package/dist/auth/mock-auth.d.ts.map +1 -0
- package/dist/auth/mock-auth.js +417 -0
- package/dist/auth/mock-auth.js.map +1 -0
- package/dist/auth/server/helpers.d.ts +215 -0
- package/dist/auth/server/helpers.d.ts.map +1 -0
- package/dist/auth/server/helpers.js +241 -0
- package/dist/auth/server/helpers.js.map +1 -0
- package/dist/auth/server/index.d.ts +24 -0
- package/dist/auth/server/index.d.ts.map +1 -0
- package/dist/auth/server/index.js +40 -0
- package/dist/auth/server/index.js.map +1 -0
- package/dist/auth/server/middleware.d.ts +305 -0
- package/dist/auth/server/middleware.d.ts.map +1 -0
- package/dist/auth/server/middleware.js +405 -0
- package/dist/auth/server/middleware.js.map +1 -0
- package/dist/auth/server/verify.d.ts +184 -0
- package/dist/auth/server/verify.d.ts.map +1 -0
- package/dist/auth/server/verify.js +222 -0
- package/dist/auth/server/verify.js.map +1 -0
- package/dist/auth/token-manager.d.ts +94 -0
- package/dist/auth/token-manager.d.ts.map +1 -0
- package/dist/auth/token-manager.js +231 -0
- package/dist/auth/token-manager.js.map +1 -0
- package/dist/auth/types.d.ts +412 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +66 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/auth/user/identities.d.ts +62 -0
- package/dist/auth/user/identities.d.ts.map +1 -0
- package/dist/auth/user/identities.js +88 -0
- package/dist/auth/user/identities.js.map +1 -0
- package/dist/auth/user/index.d.ts +4 -0
- package/dist/auth/user/index.d.ts.map +1 -0
- package/dist/auth/user/index.js +4 -0
- package/dist/auth/user/index.js.map +1 -0
- package/dist/auth/user/user.d.ts +64 -0
- package/dist/auth/user/user.d.ts.map +1 -0
- package/dist/auth/user/user.js +105 -0
- package/dist/auth/user/user.js.map +1 -0
- package/dist/auth/user/verification.d.ts +49 -0
- package/dist/auth/user/verification.d.ts.map +1 -0
- package/dist/auth/user/verification.js +71 -0
- package/dist/auth/user/verification.js.map +1 -0
- package/dist/cli/browser.d.ts +11 -0
- package/dist/cli/browser.d.ts.map +1 -0
- package/dist/cli/browser.js +35 -0
- package/dist/cli/browser.js.map +1 -0
- package/dist/cli/callback-server.d.ts +30 -0
- package/dist/cli/callback-server.d.ts.map +1 -0
- package/dist/cli/callback-server.js +100 -0
- package/dist/cli/callback-server.js.map +1 -0
- package/dist/cli/file-token-store.d.ts +79 -0
- package/dist/cli/file-token-store.d.ts.map +1 -0
- package/dist/cli/file-token-store.js +138 -0
- package/dist/cli/file-token-store.js.map +1 -0
- package/dist/cli/index.d.ts +33 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +38 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/oauth.d.ts +67 -0
- package/dist/cli/oauth.d.ts.map +1 -0
- package/dist/cli/oauth.js +101 -0
- package/dist/cli/oauth.js.map +1 -0
- package/dist/cli/pkce.d.ts +35 -0
- package/dist/cli/pkce.d.ts.map +1 -0
- package/dist/cli/pkce.js +43 -0
- package/dist/cli/pkce.js.map +1 -0
- package/dist/client.d.ts +22 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +99 -0
- package/dist/client.js.map +1 -0
- package/dist/db/client.d.ts +9 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +19 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/errors.d.ts +19 -0
- package/dist/db/errors.d.ts.map +1 -0
- package/dist/db/errors.js +57 -0
- package/dist/db/errors.js.map +1 -0
- package/dist/db/index.d.ts +7 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +5 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/mock.d.ts +28 -0
- package/dist/db/mock.d.ts.map +1 -0
- package/dist/db/mock.js +459 -0
- package/dist/db/mock.js.map +1 -0
- package/dist/db/types.d.ts +73 -0
- package/dist/db/types.d.ts.map +1 -0
- package/dist/db/types.js +2 -0
- package/dist/db/types.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/errors.d.ts +33 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +76 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/http.d.ts +81 -0
- package/dist/lib/http.d.ts.map +1 -0
- package/dist/lib/http.js +163 -0
- package/dist/lib/http.js.map +1 -0
- package/dist/lib/keys.d.ts +87 -0
- package/dist/lib/keys.d.ts.map +1 -0
- package/dist/lib/keys.js +147 -0
- package/dist/lib/keys.js.map +1 -0
- package/dist/lib/paths.d.ts +37 -0
- package/dist/lib/paths.d.ts.map +1 -0
- package/dist/lib/paths.js +49 -0
- package/dist/lib/paths.js.map +1 -0
- package/dist/lib/token-store.d.ts +42 -0
- package/dist/lib/token-store.d.ts.map +1 -0
- package/dist/lib/token-store.js +75 -0
- package/dist/lib/token-store.js.map +1 -0
- package/dist/mocks/handlers.d.ts +29 -0
- package/dist/mocks/handlers.d.ts.map +1 -0
- package/dist/mocks/handlers.js +79 -0
- package/dist/mocks/handlers.js.map +1 -0
- package/dist/mocks/index.d.ts +5 -0
- package/dist/mocks/index.d.ts.map +1 -0
- package/dist/mocks/index.js +9 -0
- package/dist/mocks/index.js.map +1 -0
- package/dist/mocks/responses.d.ts +76 -0
- package/dist/mocks/responses.d.ts.map +1 -0
- package/dist/mocks/responses.js +91 -0
- package/dist/mocks/responses.js.map +1 -0
- package/dist/mocks/server.d.ts +7 -0
- package/dist/mocks/server.d.ts.map +1 -0
- package/dist/mocks/server.js +9 -0
- package/dist/mocks/server.js.map +1 -0
- package/dist/mocks/state.d.ts +86 -0
- package/dist/mocks/state.d.ts.map +1 -0
- package/dist/mocks/state.js +77 -0
- package/dist/mocks/state.js.map +1 -0
- package/dist/storage/bucket-ref.d.ts +183 -0
- package/dist/storage/bucket-ref.d.ts.map +1 -0
- package/dist/storage/bucket-ref.js +529 -0
- package/dist/storage/bucket-ref.js.map +1 -0
- package/dist/storage/errors.d.ts +27 -0
- package/dist/storage/errors.d.ts.map +1 -0
- package/dist/storage/errors.js +89 -0
- package/dist/storage/errors.js.map +1 -0
- package/dist/storage/index.d.ts +13 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +11 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/interface.d.ts +245 -0
- package/dist/storage/interface.d.ts.map +1 -0
- package/dist/storage/interface.js +2 -0
- package/dist/storage/interface.js.map +1 -0
- package/dist/storage/mock-storage.d.ts +67 -0
- package/dist/storage/mock-storage.d.ts.map +1 -0
- package/dist/storage/mock-storage.js +478 -0
- package/dist/storage/mock-storage.js.map +1 -0
- package/dist/storage/policies-client.d.ts +77 -0
- package/dist/storage/policies-client.d.ts.map +1 -0
- package/dist/storage/policies-client.js +115 -0
- package/dist/storage/policies-client.js.map +1 -0
- package/dist/storage/policy-templates.d.ts +6 -0
- package/dist/storage/policy-templates.d.ts.map +1 -0
- package/dist/storage/policy-templates.js +290 -0
- package/dist/storage/policy-templates.js.map +1 -0
- package/dist/storage/policy-types.d.ts +98 -0
- package/dist/storage/policy-types.d.ts.map +1 -0
- package/dist/storage/policy-types.js +20 -0
- package/dist/storage/policy-types.js.map +1 -0
- package/dist/storage/storage-client.d.ts +32 -0
- package/dist/storage/storage-client.d.ts.map +1 -0
- package/dist/storage/storage-client.js +94 -0
- package/dist/storage/storage-client.js.map +1 -0
- package/dist/storage/tus-upload.d.ts +56 -0
- package/dist/storage/tus-upload.d.ts.map +1 -0
- package/dist/storage/tus-upload.js +236 -0
- package/dist/storage/tus-upload.js.map +1 -0
- package/dist/storage/types.d.ts +335 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +39 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/test/auth/helpers.d.ts +33 -0
- package/dist/test/auth/helpers.d.ts.map +1 -0
- package/dist/test/auth/helpers.js +80 -0
- package/dist/test/auth/helpers.js.map +1 -0
- package/dist/test/helpers/jwt.d.ts +61 -0
- package/dist/test/helpers/jwt.d.ts.map +1 -0
- package/dist/test/helpers/jwt.js +132 -0
- package/dist/test/helpers/jwt.js.map +1 -0
- package/dist/test/helpers/mailpit.d.ts +61 -0
- package/dist/test/helpers/mailpit.d.ts.map +1 -0
- package/dist/test/helpers/mailpit.js +107 -0
- package/dist/test/helpers/mailpit.js.map +1 -0
- package/dist/test/setup.d.ts +2 -0
- package/dist/test/setup.d.ts.map +1 -0
- package/dist/test/setup.js +17 -0
- package/dist/test/setup.js.map +1 -0
- package/dist/types.d.ts +96 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1,529 @@
|
|
|
1
|
+
import { storagePath } from "../lib/paths.js";
|
|
2
|
+
import { createTusUpload } from "./tus-upload.js";
|
|
3
|
+
import { normalizeObject, } from "./types.js";
|
|
4
|
+
/**
|
|
5
|
+
* Build query string from transform options
|
|
6
|
+
*/
|
|
7
|
+
function buildTransformParams(transform) {
|
|
8
|
+
if (!transform)
|
|
9
|
+
return "";
|
|
10
|
+
const params = new URLSearchParams();
|
|
11
|
+
if (transform.width)
|
|
12
|
+
params.set("width", String(transform.width));
|
|
13
|
+
if (transform.height)
|
|
14
|
+
params.set("height", String(transform.height));
|
|
15
|
+
if (transform.resize)
|
|
16
|
+
params.set("resize", transform.resize);
|
|
17
|
+
if (transform.format)
|
|
18
|
+
params.set("format", transform.format);
|
|
19
|
+
if (transform.quality)
|
|
20
|
+
params.set("quality", String(transform.quality));
|
|
21
|
+
const str = params.toString();
|
|
22
|
+
return str ? `?${str}` : "";
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Convert FileBody to Blob
|
|
26
|
+
*/
|
|
27
|
+
async function toBlob(file) {
|
|
28
|
+
if (file instanceof Blob) {
|
|
29
|
+
return file;
|
|
30
|
+
}
|
|
31
|
+
if (file instanceof ArrayBuffer) {
|
|
32
|
+
return new Blob([file]);
|
|
33
|
+
}
|
|
34
|
+
if (typeof file === "string") {
|
|
35
|
+
return new Blob([file], { type: "text/plain" });
|
|
36
|
+
}
|
|
37
|
+
// ReadableStream - convert to blob
|
|
38
|
+
const response = new Response(file);
|
|
39
|
+
return response.blob();
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Bucket reference for fluent object operations
|
|
43
|
+
*/
|
|
44
|
+
export class BucketRef {
|
|
45
|
+
http;
|
|
46
|
+
tenantId;
|
|
47
|
+
bucketId;
|
|
48
|
+
constructor(http, tenantId, bucketId) {
|
|
49
|
+
this.http = http;
|
|
50
|
+
this.tenantId = tenantId;
|
|
51
|
+
this.bucketId = bucketId;
|
|
52
|
+
}
|
|
53
|
+
path(endpoint) {
|
|
54
|
+
return storagePath(this.tenantId, endpoint);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Upload a file to the bucket
|
|
58
|
+
*
|
|
59
|
+
* Accepts string, Blob, ArrayBuffer, or ReadableStream.
|
|
60
|
+
* By default, throws if file already exists. Use `upsert: true` to overwrite.
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* await client.storage.from("docs").upload("report.pdf", file);
|
|
64
|
+
* await client.storage.from("docs").upload("report.pdf", file, { upsert: true });
|
|
65
|
+
*/
|
|
66
|
+
async upload(path, file, options = {}) {
|
|
67
|
+
const blob = await toBlob(file);
|
|
68
|
+
const headers = {};
|
|
69
|
+
if (options.cacheControl) {
|
|
70
|
+
headers["cache-control"] = options.cacheControl;
|
|
71
|
+
}
|
|
72
|
+
if (options.contentType) {
|
|
73
|
+
headers["content-type"] = options.contentType;
|
|
74
|
+
}
|
|
75
|
+
if (options.upsert) {
|
|
76
|
+
headers["x-upsert"] = "true";
|
|
77
|
+
}
|
|
78
|
+
if (options.metadata) {
|
|
79
|
+
headers["x-metadata"] = JSON.stringify(options.metadata);
|
|
80
|
+
}
|
|
81
|
+
// For file uploads, we need to use the correct content type
|
|
82
|
+
// If not specified, use the blob's type or default to octet-stream
|
|
83
|
+
if (!headers["content-type"]) {
|
|
84
|
+
headers["content-type"] = blob.type || "application/octet-stream";
|
|
85
|
+
}
|
|
86
|
+
const response = await this.http.rawRequest(this.path(`/object/${this.bucketId}/${path}`), {
|
|
87
|
+
method: "POST",
|
|
88
|
+
headers,
|
|
89
|
+
body: blob,
|
|
90
|
+
});
|
|
91
|
+
const data = (await response.json());
|
|
92
|
+
return {
|
|
93
|
+
id: data.Id,
|
|
94
|
+
path: path,
|
|
95
|
+
fullPath: `${this.bucketId}/${path}`,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Download a file from the bucket
|
|
100
|
+
*
|
|
101
|
+
* Returns the file as a Blob. Supports image transforms for on-the-fly resizing.
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* const blob = await client.storage.from("docs").download("report.pdf");
|
|
105
|
+
* const thumbnail = await client.storage.from("images").download("photo.jpg", {
|
|
106
|
+
* transform: { width: 200, height: 200 }
|
|
107
|
+
* });
|
|
108
|
+
*/
|
|
109
|
+
async download(path, options = {}) {
|
|
110
|
+
const transformParams = buildTransformParams(options.transform);
|
|
111
|
+
const endpoint = options.transform
|
|
112
|
+
? `/render/image/authenticated/${this.bucketId}/${path}${transformParams}`
|
|
113
|
+
: `/object/authenticated/${this.bucketId}/${path}`;
|
|
114
|
+
const response = await this.http.rawRequest(this.path(endpoint), {
|
|
115
|
+
method: "GET",
|
|
116
|
+
});
|
|
117
|
+
return response.blob();
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Get the public URL for an object
|
|
121
|
+
*
|
|
122
|
+
* Constructs the URL locally (no API call). The URL only works if
|
|
123
|
+
* the bucket is set to `public: true`. Does not validate if the
|
|
124
|
+
* file exists.
|
|
125
|
+
*
|
|
126
|
+
* @example
|
|
127
|
+
* const url = client.storage.from("avatars").getPublicUrl("user123.jpg");
|
|
128
|
+
*/
|
|
129
|
+
getPublicUrl(path, options = {}) {
|
|
130
|
+
const baseUrl = this.http.getBaseUrl();
|
|
131
|
+
const transformParams = buildTransformParams(options.transform);
|
|
132
|
+
let endpoint;
|
|
133
|
+
if (options.transform) {
|
|
134
|
+
endpoint = `/render/image/public/${this.bucketId}/${path}${transformParams}`;
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
endpoint = `/object/public/${this.bucketId}/${path}`;
|
|
138
|
+
}
|
|
139
|
+
let url = `${baseUrl}${this.path(endpoint)}`;
|
|
140
|
+
// Add download parameter if specified
|
|
141
|
+
if (options.download) {
|
|
142
|
+
const separator = url.includes("?") ? "&" : "?";
|
|
143
|
+
const downloadValue = typeof options.download === "string" ? options.download : "";
|
|
144
|
+
url += `${separator}download=${encodeURIComponent(downloadValue)}`;
|
|
145
|
+
}
|
|
146
|
+
return url;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Create a signed URL for temporary access to a private file
|
|
150
|
+
*
|
|
151
|
+
* The URL expires after the specified time. Use for private buckets
|
|
152
|
+
* when you need to share a file temporarily.
|
|
153
|
+
*
|
|
154
|
+
* @example
|
|
155
|
+
* const { signedUrl } = await client.storage.from("private").createSignedUrl("doc.pdf", {
|
|
156
|
+
* expiresIn: 3600 // 1 hour
|
|
157
|
+
* });
|
|
158
|
+
*/
|
|
159
|
+
async createSignedUrl(path, options) {
|
|
160
|
+
const response = await this.http.rawRequest(this.path(`/object/sign/${this.bucketId}/${path}`), {
|
|
161
|
+
method: "POST",
|
|
162
|
+
headers: {
|
|
163
|
+
"Content-Type": "application/json",
|
|
164
|
+
},
|
|
165
|
+
body: JSON.stringify({
|
|
166
|
+
expiresIn: options.expiresIn,
|
|
167
|
+
transform: options.transform,
|
|
168
|
+
}),
|
|
169
|
+
});
|
|
170
|
+
const data = (await response.json());
|
|
171
|
+
const baseUrl = this.http.getBaseUrl();
|
|
172
|
+
// Storage returns relative URL like /object/sign/... - we need to add tenant path prefix
|
|
173
|
+
let signedUrl = data.signedURL.startsWith("http")
|
|
174
|
+
? data.signedURL
|
|
175
|
+
: `${baseUrl}${this.path(data.signedURL)}`;
|
|
176
|
+
// Add download parameter if specified
|
|
177
|
+
if (options.download) {
|
|
178
|
+
const separator = signedUrl.includes("?") ? "&" : "?";
|
|
179
|
+
const downloadValue = typeof options.download === "string" ? options.download : "";
|
|
180
|
+
signedUrl += `${separator}download=${encodeURIComponent(downloadValue)}`;
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
signedUrl,
|
|
184
|
+
path: `${this.bucketId}/${path}`,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Create signed URLs for multiple files in a single request
|
|
189
|
+
*
|
|
190
|
+
* More efficient than calling createSignedUrl multiple times.
|
|
191
|
+
*
|
|
192
|
+
* @example
|
|
193
|
+
* const urls = await client.storage.from("private").createSignedUrls(
|
|
194
|
+
* ["doc1.pdf", "doc2.pdf"],
|
|
195
|
+
* { expiresIn: 3600 }
|
|
196
|
+
* );
|
|
197
|
+
*/
|
|
198
|
+
async createSignedUrls(paths, options) {
|
|
199
|
+
const response = await this.http.rawRequest(this.path(`/object/sign/${this.bucketId}`), {
|
|
200
|
+
method: "POST",
|
|
201
|
+
headers: {
|
|
202
|
+
"Content-Type": "application/json",
|
|
203
|
+
},
|
|
204
|
+
body: JSON.stringify({
|
|
205
|
+
expiresIn: options.expiresIn,
|
|
206
|
+
paths,
|
|
207
|
+
}),
|
|
208
|
+
});
|
|
209
|
+
const data = (await response.json());
|
|
210
|
+
const baseUrl = this.http.getBaseUrl();
|
|
211
|
+
return data.map((item) => {
|
|
212
|
+
// Storage returns relative URL like /object/sign/... - we need to add tenant path prefix
|
|
213
|
+
let signedUrl = item.signedURL.startsWith("http")
|
|
214
|
+
? item.signedURL
|
|
215
|
+
: `${baseUrl}${this.path(item.signedURL)}`;
|
|
216
|
+
if (options.download) {
|
|
217
|
+
const separator = signedUrl.includes("?") ? "&" : "?";
|
|
218
|
+
const downloadValue = typeof options.download === "string" ? options.download : "";
|
|
219
|
+
signedUrl += `${separator}download=${encodeURIComponent(downloadValue)}`;
|
|
220
|
+
}
|
|
221
|
+
return {
|
|
222
|
+
signedUrl,
|
|
223
|
+
path: item.path,
|
|
224
|
+
};
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Create a signed URL for uploading a file
|
|
229
|
+
*
|
|
230
|
+
* Useful for client-side uploads without exposing credentials.
|
|
231
|
+
* The returned token is used with uploadToSignedUrl.
|
|
232
|
+
*
|
|
233
|
+
* @example
|
|
234
|
+
* const { signedUrl, token } = await client.storage.from("uploads").createSignedUploadUrl("file.pdf");
|
|
235
|
+
* await client.storage.from("uploads").uploadToSignedUrl(signedUrl, token, file);
|
|
236
|
+
*/
|
|
237
|
+
async createSignedUploadUrl(path, options = {}) {
|
|
238
|
+
const headers = {};
|
|
239
|
+
if (options.upsert) {
|
|
240
|
+
headers["x-upsert"] = "true";
|
|
241
|
+
}
|
|
242
|
+
const response = await this.http.rawRequest(this.path(`/object/upload/sign/${this.bucketId}/${path}`), {
|
|
243
|
+
method: "POST",
|
|
244
|
+
headers,
|
|
245
|
+
});
|
|
246
|
+
const data = (await response.json());
|
|
247
|
+
const baseUrl = this.http.getBaseUrl();
|
|
248
|
+
return {
|
|
249
|
+
// Storage returns relative URL like /object/upload/sign/... - we need to add tenant path prefix
|
|
250
|
+
signedUrl: data.url.startsWith("http")
|
|
251
|
+
? data.url
|
|
252
|
+
: `${baseUrl}${this.path(data.url)}`,
|
|
253
|
+
token: data.token,
|
|
254
|
+
path: `${this.bucketId}/${path}`,
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Upload a file using a signed upload URL
|
|
259
|
+
*
|
|
260
|
+
* Use with createSignedUploadUrl for client-side uploads.
|
|
261
|
+
* The signedUrl may point to a different domain (e.g., R2/S3).
|
|
262
|
+
*
|
|
263
|
+
* @example
|
|
264
|
+
* const { signedUrl, token } = await client.storage.from("uploads").createSignedUploadUrl("file.pdf");
|
|
265
|
+
* await client.storage.from("uploads").uploadToSignedUrl(signedUrl, token, file);
|
|
266
|
+
*/
|
|
267
|
+
async uploadToSignedUrl(signedUrl, token, file, options = {}) {
|
|
268
|
+
const blob = await toBlob(file);
|
|
269
|
+
const headers = {
|
|
270
|
+
Authorization: `Bearer ${token}`,
|
|
271
|
+
};
|
|
272
|
+
if (options.cacheControl) {
|
|
273
|
+
headers["cache-control"] = options.cacheControl;
|
|
274
|
+
}
|
|
275
|
+
if (options.contentType) {
|
|
276
|
+
headers["content-type"] = options.contentType;
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
headers["content-type"] = blob.type || "application/octet-stream";
|
|
280
|
+
}
|
|
281
|
+
if (options.onProgress && typeof XMLHttpRequest !== "undefined") {
|
|
282
|
+
return this.uploadWithXhr(signedUrl, headers, blob, options.onProgress);
|
|
283
|
+
}
|
|
284
|
+
const response = await fetch(signedUrl, {
|
|
285
|
+
method: "PUT",
|
|
286
|
+
headers,
|
|
287
|
+
body: blob,
|
|
288
|
+
});
|
|
289
|
+
if (!response.ok) {
|
|
290
|
+
throw new Error(`Upload failed: ${response.statusText}`);
|
|
291
|
+
}
|
|
292
|
+
const data = (await response.json());
|
|
293
|
+
return {
|
|
294
|
+
id: data.Id,
|
|
295
|
+
path: data.Key.split("/").slice(1).join("/"),
|
|
296
|
+
fullPath: data.Key,
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
uploadWithXhr(url, headers, blob, onProgress) {
|
|
300
|
+
return new Promise((resolve, reject) => {
|
|
301
|
+
const xhr = new XMLHttpRequest();
|
|
302
|
+
xhr.upload.addEventListener("progress", (event) => {
|
|
303
|
+
if (event.lengthComputable) {
|
|
304
|
+
onProgress({
|
|
305
|
+
bytesUploaded: event.loaded,
|
|
306
|
+
bytesTotal: event.total,
|
|
307
|
+
percentage: Math.round((event.loaded / event.total) * 100),
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
});
|
|
311
|
+
xhr.addEventListener("load", () => {
|
|
312
|
+
if (xhr.status >= 200 && xhr.status < 300) {
|
|
313
|
+
try {
|
|
314
|
+
const data = JSON.parse(xhr.responseText);
|
|
315
|
+
resolve({
|
|
316
|
+
id: data.Id,
|
|
317
|
+
path: data.Key.split("/").slice(1).join("/"),
|
|
318
|
+
fullPath: data.Key,
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
catch {
|
|
322
|
+
reject(new Error("Failed to parse upload response"));
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
reject(new Error(`Upload failed: ${xhr.statusText}`));
|
|
327
|
+
}
|
|
328
|
+
});
|
|
329
|
+
xhr.addEventListener("error", () => {
|
|
330
|
+
reject(new Error("Upload failed"));
|
|
331
|
+
});
|
|
332
|
+
xhr.open("PUT", url);
|
|
333
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
334
|
+
xhr.setRequestHeader(key, value);
|
|
335
|
+
}
|
|
336
|
+
xhr.send(blob);
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Create a resumable upload using the TUS protocol
|
|
341
|
+
*
|
|
342
|
+
* For large files that may need to resume after interruption.
|
|
343
|
+
* Returns a TusUpload object with start(), abort(), and progress callbacks.
|
|
344
|
+
*
|
|
345
|
+
* @example
|
|
346
|
+
* const upload = client.storage.from("videos").createResumableUpload("large.mp4", file, {
|
|
347
|
+
* onProgress: ({ percentage }) => console.log(`${percentage}%`)
|
|
348
|
+
* });
|
|
349
|
+
* await upload.start();
|
|
350
|
+
*/
|
|
351
|
+
createResumableUpload(path, file, options) {
|
|
352
|
+
return createTusUpload(this.http, this.tenantId, this.bucketId, path, file, options);
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* List objects in the bucket
|
|
356
|
+
*
|
|
357
|
+
* Supports prefix filtering, pagination, and search.
|
|
358
|
+
*
|
|
359
|
+
* @example
|
|
360
|
+
* const files = await client.storage.from("docs").list();
|
|
361
|
+
* const pdfs = await client.storage.from("docs").list({ prefix: "reports/", search: ".pdf" });
|
|
362
|
+
*/
|
|
363
|
+
async list(options = {}) {
|
|
364
|
+
const response = await this.http.rawRequest(this.path(`/object/list/${this.bucketId}`), {
|
|
365
|
+
method: "POST",
|
|
366
|
+
headers: {
|
|
367
|
+
"Content-Type": "application/json",
|
|
368
|
+
},
|
|
369
|
+
body: JSON.stringify({
|
|
370
|
+
prefix: options.prefix ?? "",
|
|
371
|
+
limit: options.limit,
|
|
372
|
+
offset: options.offset,
|
|
373
|
+
sortBy: options.sortBy,
|
|
374
|
+
search: options.search,
|
|
375
|
+
}),
|
|
376
|
+
});
|
|
377
|
+
const data = (await response.json());
|
|
378
|
+
return data.map(normalizeObject);
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* List objects with cursor-based pagination
|
|
382
|
+
*
|
|
383
|
+
* Better for large buckets. Returns prefixes (folders) separately
|
|
384
|
+
* and provides a cursor for fetching the next page.
|
|
385
|
+
*
|
|
386
|
+
* @example
|
|
387
|
+
* let cursor: string | null = null;
|
|
388
|
+
* do {
|
|
389
|
+
* const result = await client.storage.from("docs").listV2({ cursor, limit: 100 });
|
|
390
|
+
* console.log(result.objects);
|
|
391
|
+
* cursor = result.nextCursor;
|
|
392
|
+
* } while (cursor);
|
|
393
|
+
*/
|
|
394
|
+
async listV2(options = {}) {
|
|
395
|
+
const response = await this.http.rawRequest(this.path(`/object/list-v2/${this.bucketId}`), {
|
|
396
|
+
method: "POST",
|
|
397
|
+
headers: {
|
|
398
|
+
"Content-Type": "application/json",
|
|
399
|
+
},
|
|
400
|
+
body: JSON.stringify({
|
|
401
|
+
prefix: options.prefix,
|
|
402
|
+
limit: options.limit,
|
|
403
|
+
cursor: options.cursor,
|
|
404
|
+
with_delimiter: options.delimiter,
|
|
405
|
+
sortBy: options.sortBy,
|
|
406
|
+
}),
|
|
407
|
+
});
|
|
408
|
+
const data = (await response.json());
|
|
409
|
+
return {
|
|
410
|
+
objects: data.objects.map(normalizeObject),
|
|
411
|
+
prefixes: data.prefixes ?? [],
|
|
412
|
+
nextCursor: data.next_cursor,
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* Delete objects from the bucket
|
|
417
|
+
*
|
|
418
|
+
* Accepts an array of paths. Returns the deleted objects.
|
|
419
|
+
*
|
|
420
|
+
* @example
|
|
421
|
+
* await client.storage.from("docs").remove(["old.pdf", "draft.pdf"]);
|
|
422
|
+
*/
|
|
423
|
+
async remove(paths) {
|
|
424
|
+
const response = await this.http.rawRequest(this.path(`/object/${this.bucketId}`), {
|
|
425
|
+
method: "DELETE",
|
|
426
|
+
headers: {
|
|
427
|
+
"Content-Type": "application/json",
|
|
428
|
+
},
|
|
429
|
+
body: JSON.stringify({ prefixes: paths }),
|
|
430
|
+
});
|
|
431
|
+
const data = (await response.json());
|
|
432
|
+
return data.map(normalizeObject);
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* Move or rename an object
|
|
436
|
+
*
|
|
437
|
+
* Can move to a different bucket using destinationBucket option.
|
|
438
|
+
*
|
|
439
|
+
* @example
|
|
440
|
+
* await client.storage.from("docs").move("draft.pdf", "final.pdf");
|
|
441
|
+
* await client.storage.from("docs").move("file.pdf", "file.pdf", { destinationBucket: "archive" });
|
|
442
|
+
*/
|
|
443
|
+
async move(fromPath, toPath, options = {}) {
|
|
444
|
+
await this.http.rawRequest(this.path("/object/move"), {
|
|
445
|
+
method: "POST",
|
|
446
|
+
headers: {
|
|
447
|
+
"Content-Type": "application/json",
|
|
448
|
+
},
|
|
449
|
+
body: JSON.stringify({
|
|
450
|
+
bucketId: this.bucketId,
|
|
451
|
+
sourceKey: fromPath,
|
|
452
|
+
destinationBucket: options.destinationBucket ?? this.bucketId,
|
|
453
|
+
destinationKey: toPath,
|
|
454
|
+
}),
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* Copy an object to a new location
|
|
459
|
+
*
|
|
460
|
+
* By default copies metadata. Can copy to a different bucket.
|
|
461
|
+
*
|
|
462
|
+
* @example
|
|
463
|
+
* await client.storage.from("docs").copy("template.pdf", "copy.pdf");
|
|
464
|
+
* await client.storage.from("docs").copy("file.pdf", "file.pdf", { destinationBucket: "backup" });
|
|
465
|
+
*/
|
|
466
|
+
async copy(fromPath, toPath, options = {}) {
|
|
467
|
+
const headers = {
|
|
468
|
+
"Content-Type": "application/json",
|
|
469
|
+
};
|
|
470
|
+
if (options.upsert) {
|
|
471
|
+
headers["x-upsert"] = "true";
|
|
472
|
+
}
|
|
473
|
+
const response = await this.http.rawRequest(this.path("/object/copy"), {
|
|
474
|
+
method: "POST",
|
|
475
|
+
headers,
|
|
476
|
+
body: JSON.stringify({
|
|
477
|
+
bucketId: this.bucketId,
|
|
478
|
+
sourceKey: fromPath,
|
|
479
|
+
destinationBucket: options.destinationBucket ?? this.bucketId,
|
|
480
|
+
destinationKey: toPath,
|
|
481
|
+
copyMetadata: options.copyMetadata ?? true,
|
|
482
|
+
metadata: options.metadata,
|
|
483
|
+
}),
|
|
484
|
+
});
|
|
485
|
+
const data = (await response.json());
|
|
486
|
+
return {
|
|
487
|
+
id: data.Id,
|
|
488
|
+
path: data.Key,
|
|
489
|
+
};
|
|
490
|
+
}
|
|
491
|
+
/**
|
|
492
|
+
* Get metadata for an object
|
|
493
|
+
*
|
|
494
|
+
* Returns size, content type, last modified, and custom metadata.
|
|
495
|
+
*
|
|
496
|
+
* @example
|
|
497
|
+
* const info = await client.storage.from("docs").getInfo("report.pdf");
|
|
498
|
+
* console.log(info.metadata.size, info.metadata.mimetype);
|
|
499
|
+
*/
|
|
500
|
+
async getInfo(path) {
|
|
501
|
+
const response = await this.http.rawRequest(this.path(`/object/info/authenticated/${this.bucketId}/${path}`), {
|
|
502
|
+
method: "GET",
|
|
503
|
+
});
|
|
504
|
+
const data = (await response.json());
|
|
505
|
+
return normalizeObject(data);
|
|
506
|
+
}
|
|
507
|
+
/**
|
|
508
|
+
* Check if an object exists in the bucket
|
|
509
|
+
*
|
|
510
|
+
* Uses a HEAD request to check existence without downloading content.
|
|
511
|
+
*
|
|
512
|
+
* @example
|
|
513
|
+
* if (await client.storage.from("docs").exists("report.pdf")) {
|
|
514
|
+
* console.log("File exists");
|
|
515
|
+
* }
|
|
516
|
+
*/
|
|
517
|
+
async exists(path) {
|
|
518
|
+
try {
|
|
519
|
+
await this.http.rawRequest(this.path(`/object/${this.bucketId}/${path}`), {
|
|
520
|
+
method: "HEAD",
|
|
521
|
+
});
|
|
522
|
+
return true;
|
|
523
|
+
}
|
|
524
|
+
catch {
|
|
525
|
+
return false;
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
//# sourceMappingURL=bucket-ref.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bucket-ref.js","sourceRoot":"","sources":["../../src/storage/bucket-ref.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { StackError } from "../lib/errors.js";
|
|
2
|
+
/**
|
|
3
|
+
* Storage-specific errors
|
|
4
|
+
*/
|
|
5
|
+
export declare class StorageError extends StackError {
|
|
6
|
+
readonly context?: Record<string, unknown> | undefined;
|
|
7
|
+
constructor(message: string, code: string, statusCode?: number, context?: Record<string, unknown> | undefined);
|
|
8
|
+
static bucketNotFound(bucketId: string): StorageError;
|
|
9
|
+
static bucketAlreadyExists(bucketId: string): StorageError;
|
|
10
|
+
static bucketNotEmpty(bucketId: string): StorageError;
|
|
11
|
+
static invalidBucketName(name: string, reason: string): StorageError;
|
|
12
|
+
static objectNotFound(path: string): StorageError;
|
|
13
|
+
static objectAlreadyExists(path: string): StorageError;
|
|
14
|
+
static invalidPath(path: string, reason: string): StorageError;
|
|
15
|
+
static fileSizeLimitExceeded(size: number, limit: number): StorageError;
|
|
16
|
+
static invalidMimeType(mimeType: string, allowed: string[]): StorageError;
|
|
17
|
+
static uploadFailed(reason: string): StorageError;
|
|
18
|
+
static uploadAborted(): StorageError;
|
|
19
|
+
static tusUploadNotFound(uploadId: string): StorageError;
|
|
20
|
+
static tusUploadExpired(): StorageError;
|
|
21
|
+
static tusOffsetMismatch(expected: number, received: number): StorageError;
|
|
22
|
+
static signedUrlExpired(): StorageError;
|
|
23
|
+
static invalidSignedUrl(reason?: string): StorageError;
|
|
24
|
+
static unauthorized(): StorageError;
|
|
25
|
+
static forbidden(action: string): StorageError;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/storage/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C;;GAEG;AACH,qBAAa,YAAa,SAAQ,UAAU;aAKxB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAHjD,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,MAAM,EACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA;IAUnD,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY;IASrD,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY;IAS1D,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY;IASrD,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY;IAapE,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY;IASjD,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY;IAStD,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY;IAa9D,MAAM,CAAC,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY;IASvE,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,YAAY;IASzE,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY;IAMjD,MAAM,CAAC,aAAa,IAAI,YAAY;IAQpC,MAAM,CAAC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY;IASxD,MAAM,CAAC,gBAAgB,IAAI,YAAY;IAQvC,MAAM,CAAC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY;IAa1E,MAAM,CAAC,gBAAgB,IAAI,YAAY;IAQvC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY;IAatD,MAAM,CAAC,YAAY,IAAI,YAAY;IAQnC,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY;CAK/C"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { StackError } from "../lib/errors.js";
|
|
2
|
+
/**
|
|
3
|
+
* Storage-specific errors
|
|
4
|
+
*/
|
|
5
|
+
export class StorageError extends StackError {
|
|
6
|
+
context;
|
|
7
|
+
constructor(message, code, statusCode, context) {
|
|
8
|
+
super(message, code, statusCode);
|
|
9
|
+
this.context = context;
|
|
10
|
+
this.name = "StorageError";
|
|
11
|
+
}
|
|
12
|
+
// ============================================
|
|
13
|
+
// Bucket Errors
|
|
14
|
+
// ============================================
|
|
15
|
+
static bucketNotFound(bucketId) {
|
|
16
|
+
return new StorageError(`Bucket not found: ${bucketId}`, "bucket_not_found", 404, { bucketId });
|
|
17
|
+
}
|
|
18
|
+
static bucketAlreadyExists(bucketId) {
|
|
19
|
+
return new StorageError(`Bucket already exists: ${bucketId}`, "bucket_already_exists", 409, { bucketId });
|
|
20
|
+
}
|
|
21
|
+
static bucketNotEmpty(bucketId) {
|
|
22
|
+
return new StorageError(`Bucket is not empty: ${bucketId}`, "bucket_not_empty", 409, { bucketId });
|
|
23
|
+
}
|
|
24
|
+
static invalidBucketName(name, reason) {
|
|
25
|
+
return new StorageError(`Invalid bucket name "${name}": ${reason}`, "invalid_bucket_name", 400, { name, reason });
|
|
26
|
+
}
|
|
27
|
+
// ============================================
|
|
28
|
+
// Object Errors
|
|
29
|
+
// ============================================
|
|
30
|
+
static objectNotFound(path) {
|
|
31
|
+
return new StorageError(`Object not found: ${path}`, "object_not_found", 404, { path });
|
|
32
|
+
}
|
|
33
|
+
static objectAlreadyExists(path) {
|
|
34
|
+
return new StorageError(`Object already exists: ${path}`, "object_already_exists", 409, { path });
|
|
35
|
+
}
|
|
36
|
+
static invalidPath(path, reason) {
|
|
37
|
+
return new StorageError(`Invalid path "${path}": ${reason}`, "invalid_path", 400, { path, reason });
|
|
38
|
+
}
|
|
39
|
+
// ============================================
|
|
40
|
+
// Upload Errors
|
|
41
|
+
// ============================================
|
|
42
|
+
static fileSizeLimitExceeded(size, limit) {
|
|
43
|
+
return new StorageError(`File size ${size} bytes exceeds limit of ${limit} bytes`, "file_size_limit_exceeded", 413, { size, limit });
|
|
44
|
+
}
|
|
45
|
+
static invalidMimeType(mimeType, allowed) {
|
|
46
|
+
return new StorageError(`Invalid MIME type: ${mimeType}. Allowed: ${allowed.join(", ")}`, "invalid_mime_type", 415, { mimeType, allowed });
|
|
47
|
+
}
|
|
48
|
+
static uploadFailed(reason) {
|
|
49
|
+
return new StorageError(`Upload failed: ${reason}`, "upload_failed", 500, {
|
|
50
|
+
reason,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
static uploadAborted() {
|
|
54
|
+
return new StorageError("Upload was aborted", "upload_aborted", 499);
|
|
55
|
+
}
|
|
56
|
+
// ============================================
|
|
57
|
+
// TUS Resumable Upload Errors
|
|
58
|
+
// ============================================
|
|
59
|
+
static tusUploadNotFound(uploadId) {
|
|
60
|
+
return new StorageError(`Resumable upload not found: ${uploadId}`, "tus_upload_not_found", 404, { uploadId });
|
|
61
|
+
}
|
|
62
|
+
static tusUploadExpired() {
|
|
63
|
+
return new StorageError("Resumable upload has expired", "tus_upload_expired", 410);
|
|
64
|
+
}
|
|
65
|
+
static tusOffsetMismatch(expected, received) {
|
|
66
|
+
return new StorageError(`Upload offset mismatch: expected ${expected}, received ${received}`, "tus_offset_mismatch", 409, { expected, received });
|
|
67
|
+
}
|
|
68
|
+
// ============================================
|
|
69
|
+
// Signed URL Errors
|
|
70
|
+
// ============================================
|
|
71
|
+
static signedUrlExpired() {
|
|
72
|
+
return new StorageError("Signed URL has expired", "signed_url_expired", 401);
|
|
73
|
+
}
|
|
74
|
+
static invalidSignedUrl(reason) {
|
|
75
|
+
return new StorageError(`Invalid signed URL${reason ? `: ${reason}` : ""}`, "invalid_signed_url", 400, reason ? { reason } : undefined);
|
|
76
|
+
}
|
|
77
|
+
// ============================================
|
|
78
|
+
// Authorization Errors
|
|
79
|
+
// ============================================
|
|
80
|
+
static unauthorized() {
|
|
81
|
+
return new StorageError("Unauthorized access to storage", "unauthorized", 401);
|
|
82
|
+
}
|
|
83
|
+
static forbidden(action) {
|
|
84
|
+
return new StorageError(`Forbidden: ${action}`, "forbidden", 403, {
|
|
85
|
+
action,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=errors.js.map
|